28 #include "siddefs-fp.h"
154 unsigned int Vddt_Vw_2;
155 int kVddt, n_snake, vx;
157 const unsigned short* vcr_kVg;
158 const unsigned short* vcr_n_Ids_term;
159 const int* opamp_rev;
162 Integrator(
const unsigned short* vcr_kVg,
const unsigned short* vcr_n_Ids_term,
163 const int* opamp_rev,
int kVddt,
int n_snake) :
170 vcr_n_Ids_term(vcr_n_Ids_term),
171 opamp_rev(opamp_rev) {}
173 void setVw(
unsigned int Vw) { Vddt_Vw_2 = (kVddt - Vw) * (kVddt - Vw) >> 1; }
180 #if RESID_INLINING || defined(INTEGRATOR_CPP)
186 int Integrator::solve(
int vi)
189 const int Vgst = kVddt - vx;
190 const int Vgdt = kVddt - vi;
192 const int64_t Vgst_2 = (int64_t)Vgst * (int64_t)Vgst;
193 const int64_t Vgdt_2 = (int64_t)Vgdt * (int64_t)Vgdt;
196 const int n_I_snake = n_snake * ((Vgst_2 - Vgdt_2) >> 15);
200 const int kVg = (int)vcr_kVg[(Vddt_Vw_2 + (Vgdt_2 >> 1)) >> 16];
204 if (Vgs < 0) Vgs = 0;
206 if (Vgd < 0) Vgd = 0;
209 const int n_I_vcr = (int)(vcr_n_Ids_term[Vgs & 0xffff] - vcr_n_Ids_term[Vgd & 0xffff]) << 15;
212 vc += n_I_snake + n_I_vcr;
215 vx = opamp_rev[((vc >> 15) + (1 << 15)) & 0xffff];
218 return vx - (vc >> 14);
Definition: Integrator.h:151