23 #ifndef INTEGRATOR6581_H
24 #define INTEGRATOR6581_H
38 #include "siddefs-fp.h"
168 const unsigned short* vcr_Vg;
169 const unsigned short* vcr_n_Ids_term;
170 const unsigned short* opamp_rev;
172 unsigned int Vddt_Vw_2;
184 const unsigned short Vddt;
185 const unsigned short nVt;
186 const unsigned short nVmin;
187 const unsigned short n_snake;
190 Integrator6581(
const unsigned short* vcr_Vg,
const unsigned short* vcr_n_Ids_term,
191 const unsigned short* opamp_rev,
unsigned short Vddt,
unsigned short nVt,
192 unsigned short nVmin,
unsigned short n_snake,
double N16) :
194 vcr_n_Ids_term(vcr_n_Ids_term),
195 opamp_rev(opamp_rev),
210 void setVw(
unsigned short Vw) { Vddt_Vw_2 = ((Vddt - Vw) * (Vddt - Vw)) >> 1; }
212 int solve(
int vi)
const;
217 #if RESID_INLINING || defined(INTEGRATOR_CPP)
223 int Integrator6581::solve(
int vi)
const
233 const unsigned int Vgst = Vddt - vx;
234 const unsigned int Vgdt = Vddt - vi;
236 const unsigned int Vgst_2 = Vgst * Vgst;
237 const unsigned int Vgdt_2 = Vgdt * Vgdt;
240 const int n_I_snake = n_snake * (
static_cast<int>(Vgst_2 - Vgdt_2) >> 15);
244 const int Vg =
static_cast<int>(vcr_Vg[(Vddt_Vw_2 + (Vgdt_2 >> 1)) >> 16]);
245 const int Vp = (Vg - nVt) / n;
246 const int kVg =
static_cast<int>(Vp) - nVmin;
249 const int Vgs = (vx < kVg) ? kVg - vx : 0;
250 assert(Vgs < (1 << 16));
251 const int Vgd = (vi < kVg) ? kVg - vi : 0;
252 assert(Vgd < (1 << 16));
255 const unsigned int If =
static_cast<unsigned int>(vcr_n_Ids_term[Vgs]) << 15;
256 const unsigned int Ir =
static_cast<unsigned int>(vcr_n_Ids_term[Vgd]) << 15;
257 const int n_I_vcr = (If - Ir) * n;
261 const double gamma = 1.0;
262 const double phi = 0.8;
263 const double Ut = 26.0e-3;
264 const double nVp = Vp / N16;
265 n = 1. + (gamma / (2 * sqrt(nVp + phi + 4*Ut)));
266 assert((n > 1.2) && (n < 1.8));
270 vc += n_I_snake + n_I_vcr;
273 const int tmp = (vc >> 15) + (1 << 15);
274 assert(tmp < (1 << 16));
278 return vx - (vc >> 14);
Definition: Integrator6581.h:166