/*
 * Generated by EML-lang C backend
 * Source module: rc_filter
 * Source file:   /home/monogate/monogate/forge/examples/rc_filter.eml
 * Functions:     6
 * Constants:     0
 * Types:         0
 */

#include "libmonogate.h"
#include <stdint.h>
#include <math.h>
#include <assert.h>

/*
 * circuit
 * Chain order: 0     Cost class: p0-d0-w0-c0
 * EML depth:   0  Drift risk: LOW
 * Dynamics:    0 osc, 0 decay  (predicted_r=0)
 * FPGA est:   0 MAC, 0 exp, 0 ln, 0 trig -> 0 cy @ 32-bit
 */
double circuit(void) {
    return 0.0;
}

/*
 * tau
 * Chain order: 0     Cost class: p0-d1-w0-c0
 * EML depth:   1  Drift risk: LOW
 * Dynamics:    0 osc, 0 decay  (predicted_r=0)
 * FPGA est:   1 MAC, 0 exp, 0 ln, 0 trig -> 2 cy @ 32-bit
 */
double tau(double r, double c) {
    assert(((r > 0.0)) && "tau: requires ((r > 0.0))");
    assert(((c > 0.0)) && "tau: requires ((c > 0.0))");
    return (r * c);
}

/*
 * vout_steady
 * Chain order: 0     Cost class: p0-d0-w0-c0
 * EML depth:   0  Drift risk: LOW
 * Dynamics:    0 osc, 0 decay  (predicted_r=0)
 * FPGA est:   0 MAC, 0 exp, 0 ln, 0 trig -> 0 cy @ 32-bit
 */
double vout_steady(double vin) {
    return vin;
}

/*
 * vout_initial
 * Chain order: 0     Cost class: p0-d0-w0-c0
 * EML depth:   0  Drift risk: LOW
 * Dynamics:    0 osc, 0 decay  (predicted_r=0)
 * FPGA est:   0 MAC, 0 exp, 0 ln, 0 trig -> 0 cy @ 32-bit
 */
double vout_initial(void) {
    return 0.0;
}

/*
 * vout_charging
 * Chain order: 1     Cost class: p1-d6-w1-c0
 * EML depth:   6  Drift risk: MEDIUM
 * Dynamics:    0 osc, 1 decay  (predicted_r=1)
 * FPGA est:   6 MAC, 1 exp, 0 ln, 0 trig -> 12 cy @ 32-bit
 */
double vout_charging(double vin, double t, double tau_val) {
    assert(((tau_val > 0.0)) && "vout_charging: requires ((tau_val > 0.0))");
    return (vin * (1.0 - mg_exp(((-t) / tau_val))));
}

/*
 * vout_charging_at_zero
 * Chain order: 0     Cost class: p0-d0-w0-c0
 * EML depth:   0  Drift risk: LOW
 * Dynamics:    0 osc, 0 decay  (predicted_r=0)
 * FPGA est:   0 MAC, 0 exp, 0 ln, 0 trig -> 0 cy @ 32-bit
 */
double vout_charging_at_zero(double vin, double tau_val) {
    assert(((tau_val > 0.0)) && "vout_charging_at_zero: requires ((tau_val > 0.0))");
    return (vin * (1.0 - mg_exp((-0.0 / tau_val))));
}
