23 #ifndef INTEGRATOR8580_H
24 #define INTEGRATOR8580_H
29 #include "siddefs-fp.h"
55 const unsigned short* opamp_rev;
72 Integrator8580(
const unsigned short* opamp_rev,
double Vth,
double denorm,
double C,
double k,
double uCox,
double vmin,
double N16) :
91 const double tmp = denorm * (1 << 13) * (uCox / (2. * k) * wl * 1.0e-6 / C);
92 assert(tmp > -0.5 && tmp < 65535.5);
93 n_dac =
static_cast<unsigned short>(tmp + 0.5);
103 const double Vg = 4.76 * v;
104 const double Vgt = k * (Vg - Vth);
108 const double tmp = N16 * (Vgt - vmin);
109 assert(tmp > -0.5 && tmp < 65535.5);
110 kVgt =
static_cast<unsigned short>(tmp + 0.5);
113 int solve(
int vi)
const;
118 #if RESID_INLINING || defined(INTEGRATOR8580_CPP)
124 int Integrator8580::solve(
int vi)
const
127 const unsigned int Vgst = kVgt - vx;
128 const unsigned int Vgdt = (vi < kVgt) ? kVgt - vi : 0;
130 const unsigned int Vgst_2 = Vgst * Vgst;
131 const unsigned int Vgdt_2 = Vgdt * Vgdt;
134 const int n_I_dac = n_dac * (
static_cast<int>(Vgst_2 - Vgdt_2) >> 15);
140 const int tmp = (vc >> 15) + (1 << 15);
141 assert(tmp < (1 << 16));
145 return vx - (vc >> 14);