19 static double qggnew(
double,
double,
double,
double,
double,
double,
double,
49 double cgdna,cgdnb,cgdnc,cgdnd;
51 double cgsna,cgsnb,cgsnc,cgsnd;
72 double qgga,qggb,qggc,qggd;
109 vgs = *(ckt->CKTstate0 + here->MESvgs);
110 vgd = *(ckt->CKTstate0 + here->MESvgd);
112 vgs = *(ckt->CKTstate1 + here->MESvgs);
113 vgd = *(ckt->CKTstate1 + here->MESvgd);
132 *(ckt->CKTstate0 + here->MESvgs) =
133 *(ckt->CKTstate1 + here->MESvgs);
134 vgs = (1+xfact) * *(ckt->CKTstate1 + here->MESvgs) -
135 xfact * *(ckt->CKTstate2 + here->MESvgs);
136 *(ckt->CKTstate0 + here->MESvgd) =
137 *(ckt->CKTstate1 + here->MESvgd);
138 vgd = (1+xfact)* *(ckt->CKTstate1 + here->MESvgd) -
139 xfact * *(ckt->CKTstate2 + here->MESvgd);
140 *(ckt->CKTstate0 + here->MEScg) =
141 *(ckt->CKTstate1 + here->MEScg);
142 *(ckt->CKTstate0 + here->MEScd) =
143 *(ckt->CKTstate1 + here->MEScd);
144 *(ckt->CKTstate0 + here->MEScgd) =
145 *(ckt->CKTstate1 + here->MEScgd);
146 *(ckt->CKTstate0 + here->MESgm) =
147 *(ckt->CKTstate1 + here->MESgm);
148 *(ckt->CKTstate0 + here->MESgds) =
149 *(ckt->CKTstate1 + here->MESgds);
150 *(ckt->CKTstate0 + here->MESggs) =
151 *(ckt->CKTstate1 + here->MESggs);
152 *(ckt->CKTstate0 + here->MESggd) =
153 *(ckt->CKTstate1 + here->MESggd);
170 delvgs=vgs - *(ckt->CKTstate0 + here->MESvgs);
171 delvgd=vgd - *(ckt->CKTstate0 + here->MESvgd);
172 delvds=delvgs - delvgd;
173 cghat= *(ckt->CKTstate0 + here->MEScg) +
174 *(ckt->CKTstate0 + here->MESggd)*delvgd +
175 *(ckt->CKTstate0 + here->MESggs)*delvgs;
176 cdhat= *(ckt->CKTstate0 + here->MEScd) +
177 *(ckt->CKTstate0 + here->MESgm)*delvgs +
178 *(ckt->CKTstate0 + here->MESgds)*delvds -
179 *(ckt->CKTstate0 + here->MESggd)*delvgd;
186 FABS(*(ckt->CKTstate0 + here->MESvgs)))+
189 FABS(*(ckt->CKTstate0 + here->MESvgd)))+
191 if ( (
FABS(cghat-*(ckt->CKTstate0 + here->MEScg))
193 FABS(*(ckt->CKTstate0 + here->MEScg)))+
195 (
FABS(cdhat-*(ckt->CKTstate0 + here->MEScd))
197 FABS(*(ckt->CKTstate0 + here->MEScd)))+
201 vgs= *(ckt->CKTstate0 + here->MESvgs);
202 vgd= *(ckt->CKTstate0 + here->MESvgd);
204 cg= *(ckt->CKTstate0 + here->MEScg);
205 cd= *(ckt->CKTstate0 + here->MEScd);
206 cgd= *(ckt->CKTstate0 + here->MEScgd);
207 gm= *(ckt->CKTstate0 + here->MESgm);
208 gds= *(ckt->CKTstate0 + here->MESgds);
209 ggs= *(ckt->CKTstate0 + here->MESggs);
210 ggd= *(ckt->CKTstate0 + here->MESggd);
224 vgs =
DEVfetlim(vgs,*(ckt->CKTstate0 + here->MESvgs),
226 vgd =
DEVfetlim(vgd,*(ckt->CKTstate0 + here->MESvgd),
239 cg = csat*(evgs-1)+ckt->
CKTgmin*vgs;
247 cgd = csat*(evgd-1)+ckt->
CKTgmin*vgd;
265 denom = 1 + model->
MESb * vgst;
266 invdenom = 1 / denom;
267 if (vds >= ( 3 / model->
MESalpha ) ) {
271 cdrain = betap * vgst * vgst * invdenom;
272 gm = betap * vgst * (1 + denom) * invdenom * invdenom;
279 afact = 1 - model->
MESalpha * vds / 3;
280 lfact = 1 - afact * afact * afact;
281 cdrain = betap * vgst * vgst * invdenom * lfact;
282 gm = betap * vgst * (1 + denom) * invdenom * invdenom *
284 gds = beta * vgst * vgst * invdenom * (model->
MESalpha *
285 afact * afact * prod + lfact *
307 denom = 1 + model->
MESb * vgdt;
308 invdenom = 1 / denom;
309 if ( -vds >= ( 3 / model->
MESalpha ) ) {
310 cdrain = -betap * vgdt * vgdt * invdenom;
311 gm = -betap * vgdt * (1 + denom) * invdenom * invdenom;
318 afact = 1 + model->
MESalpha * vds / 3;
319 lfact = 1 - afact * afact * afact;
320 cdrain = -betap * vgdt * vgdt * invdenom * lfact;
321 gm = -betap * vgdt * (1 + denom) * invdenom *
323 gds = beta * vgdt * vgdt * invdenom * (model->
MESalpha *
324 afact * afact * prod + lfact *
341 vgs1 = *(ckt->CKTstate1 + here->MESvgs);
342 vgd1 = *(ckt->CKTstate1 + here->MESvgd);
345 qgga =
qggnew(vgs,vgd,phib,vcap,vto,czgs,czgd,&cgsna,&cgdna);
346 qggb =
qggnew(vgs1,vgd,phib,vcap,vto,czgs,czgd,&cgsnb,&cgdnb);
347 qggc =
qggnew(vgs,vgd1,phib,vcap,vto,czgs,czgd,&cgsnc,&cgdnc);
348 qggd =
qggnew(vgs1,vgd1,phib,vcap,vto,czgs,czgd,&cgsnd,&cgdnd);
351 *(ckt->CKTstate1 + here->MESqgs) = qgga;
352 *(ckt->CKTstate1 + here->MESqgd) = qgga;
354 *(ckt->CKTstate0+here->MESqgs) = *(ckt->CKTstate1+here->MESqgs)
355 + 0.5 * (qgga-qggb + qggc-qggd);
356 *(ckt->CKTstate0+here->MESqgd) = *(ckt->CKTstate1+here->MESqgd)
357 + 0.5 * (qgga-qggc + qggb-qggd);
367 *(ckt->CKTstate0 + here->MESqgs) = capgs;
368 *(ckt->CKTstate0 + here->MESqgd) = capgd;
375 *(ckt->CKTstate1 + here->MESqgs) =
376 *(ckt->CKTstate0 + here->MESqgs);
377 *(ckt->CKTstate1 + here->MESqgd) =
378 *(ckt->CKTstate0 + here->MESqgd);
380 NI_INTEG(ckt,geq,ceq,capgs,here->MESqgs);
382 cg = cg + *(ckt->CKTstate0 + here->MEScqgs);
383 NI_INTEG(ckt,geq,ceq,capgd,here->MESqgd);
385 cg = cg + *(ckt->CKTstate0 + here->MEScqgd);
386 cd = cd - *(ckt->CKTstate0 + here->MEScqgd);
387 cgd = cgd + *(ckt->CKTstate0 + here->MEScqgd);
389 *(ckt->CKTstate1 + here->MEScqgs) =
390 *(ckt->CKTstate0 + here->MEScqgs);
391 *(ckt->CKTstate1 + here->MEScqgd) =
392 *(ckt->CKTstate0 + here->MEScqgd);
413 *(ckt->CKTstate0 + here->MESvgs) = vgs;
414 *(ckt->CKTstate0 + here->MESvgd) = vgd;
415 *(ckt->CKTstate0 + here->MEScg) = cg;
416 *(ckt->CKTstate0 + here->MEScd) = cd;
417 *(ckt->CKTstate0 + here->MEScgd) = cgd;
418 *(ckt->CKTstate0 + here->MESgm) = gm;
419 *(ckt->CKTstate0 + here->MESgds) = gds;
420 *(ckt->CKTstate0 + here->MESggs) = ggs;
421 *(ckt->CKTstate0 + here->MESggd) = ggd;
426 ceqgd=model->
MEStype*(cgd-ggd*vgd);
427 ceqgs=model->
MEStype*((cg-cgd)-ggs*vgs);
428 cdreq=model->
MEStype*((cd+cgd)-gds*vds-gm*vgs);
460 qggnew(vgs,vgd,phib,vcap,vto,cgs,cgd,cgsnew,cgdnew)
461 double vgs,vgd,phib,vcap,vto,cgs,cgd,*cgsnew,*cgdnew;
463 double veroot,veff1,veff2,del,vnroot,vnew1,vnew3,vmax,ext;
464 double qroot,qggval,par1,cfact,cplus,cminus;
466 veroot = sqrt( (vgs - vgd) * (vgs - vgd) + vcap*vcap );
467 veff1 = 0.5 * (vgs + vgd + veroot);
468 veff2 = veff1 - veroot;
470 vnroot = sqrt( (veff1 - vto)*(veff1 - vto) + del * del );
471 vnew1 = 0.5 * (veff1 + vto + vnroot);
474 if ( vnew1 < vmax ) {
478 ext = (vnew3 - vmax)/sqrt(1 - vmax/phib);
481 qroot = sqrt(1 - vnew1/phib);
482 qggval = cgs * (2*phib*(1-qroot) + ext) + cgd*veff2;
483 par1 = 0.5 * ( 1 + (veff1-vto)/vnroot);
484 cfact = (vgs- vgd)/veroot;
485 cplus = 0.5 * (1 + cfact);
486 cminus = cplus - cfact;
487 *cgsnew = cgs/qroot*par1*cplus + cgd*cminus;
488 *cgdnew = cgs/qroot*par1*cminus + cgd*cplus;
int MESload(GENmodel *inModel, CKTcircuit *ckt)
GENinstance * CKTtroubleElt
double * MESdrainDrainPrimePtr
double * MESgateSourcePrimePtr
double * MESdrainDrainPtr
MESinstance * MESinstances
struct sMESmodel * MESnextModel
struct sMESinstance * MESnextInstance
double * MESdrainPrimeDrainPtr
double * MESsourceSourcePtr
double * MESsourcePrimeSourcePtr
#define NI_INTEG(ckt, geq, ceq, cap, qcap)
double * MESdrainPrimeSourcePrimePtr
double * MESsourcePrimeGatePtr
double * MESsourcePrimeDrainPrimePtr
double * MESdrainPrimeGatePtr
double * MESsourcePrimeSourcePrimePtr
double * MESdrainPrimeDrainPrimePtr
double * MESsourceSourcePrimePtr
double * MESgateDrainPrimePtr