29 #include "siddefs-fp.h"
156 const unsigned short* vcr_kVg;
157 const unsigned short* vcr_n_Ids_term;
158 const unsigned short* opamp_rev;
160 unsigned int Vddt_Vw_2;
164 const unsigned short kVddt;
165 const unsigned short n_snake;
168 Integrator(
const unsigned short* vcr_kVg,
const unsigned short* vcr_n_Ids_term,
169 const unsigned short* opamp_rev,
unsigned short kVddt,
unsigned short n_snake) :
171 vcr_n_Ids_term(vcr_n_Ids_term),
172 opamp_rev(opamp_rev),
179 void setVw(
unsigned short Vw) { Vddt_Vw_2 = ((kVddt - Vw) * (kVddt - Vw)) >> 1; }
186 #if RESID_INLINING || defined(INTEGRATOR_CPP)
192 int Integrator::solve(
int vi)
202 const unsigned int Vgst = kVddt - vx;
203 const unsigned int Vgdt = kVddt - vi;
205 const unsigned int Vgst_2 = Vgst * Vgst;
206 const unsigned int Vgdt_2 = Vgdt * Vgdt;
209 const int n_I_snake = n_snake * (
static_cast<int>(Vgst_2 - Vgdt_2) >> 15);
213 const int kVg =
static_cast<int>(vcr_kVg[(Vddt_Vw_2 + (Vgdt_2 >> 1)) >> 16]);
217 if (Vgs < 0) Vgs = 0;
218 assert(Vgs < (1 << 16));
220 if (Vgd < 0) Vgd = 0;
221 assert(Vgd < (1 << 16));
224 const unsigned int If =
static_cast<unsigned int>(vcr_n_Ids_term[Vgs]) << 15;
225 const unsigned int Ir =
static_cast<unsigned int>(vcr_n_Ids_term[Vgd]) << 15;
226 const int n_I_vcr = If - Ir;
229 vc += n_I_snake + n_I_vcr;
232 const int tmp = (vc >> 15) + (1 << 15);
233 assert(tmp < (1 << 16));
237 return vx - (vc >> 14);