105 cg = csat*(evgs-1)+ckt->
CKTgmin*vgs;
108 lggd1 = -csat/vgd+ckt->
CKTgmin;
116 cgd = csat*(evgd-1)+ckt->
CKTgmin*vgd;
129 Dderivs d_betap, d_denom, d_invdenom;
188 denom = 1 + model->
MESb * vgst;
190 d_denom.
value = denom;
191 invdenom = 1 / denom;
196 cdrain = betap * vgst * vgst * invdenom;
199 MultDeriv(&d_cdrain,&d_cdrain,&d_invdenom);
201 if (vds < ( 3 / model->
MESalpha ) ) {
205 afact = 1 - model->
MESalpha * vds / 3;
207 d_afact.
value = afact;
208 lfact = 1 - afact * afact * afact;
211 d_lfact.
value += 1.0;
212 cdrain = betap*vgst*vgst*invdenom*lfact;
215 MultDeriv(&d_cdrain,&d_cdrain,&d_invdenom);
242 double veroot,veff1,veff2,del,vnroot,vnew1,vnew3,vmax,ext;
243 double qroot,par1,cfact,cplus,cminus;
245 Dderivs d_cgsnew, d_cgdnew, d_dummy, d_dummy2;
246 Dderivs d_ext, d_qroot, d_par1, d_cfact, d_cplus, d_cminus;
247 Dderivs d_veroot, d_veff1, d_veff2, d_vnew1, d_vnew3;
252 veroot = sqrt( (vgs - vgd) * (vgs - vgd) + vcap*vcap );
255 MultDeriv(&d_veroot,&d_veroot,&d_veroot);
256 d_veroot.
value += vcap*vcap;
258 veff1 = 0.5 * (vgs + vgd + veroot);
262 veff2 = veff1 - veroot;
267 vnroot = sqrt( (veff1 - vto)*(veff1 - vto) + del * del );
269 d_vnroot.
value -= vto;
270 MultDeriv(&d_vnroot,&d_vnroot,&d_vnroot);
271 d_vnroot.
value += del*del;
273 vnew1 = 0.5 * (veff1 + vto + vnroot);
275 d_vnew1.
value += vto;
280 if ( vnew1 < vmax ) {
286 d_vnew1.
value = vmax;
287 ext = (vnew3 - vmax)/sqrt(1 - vmax/phib);
290 TimesDeriv(&d_ext,&d_ext,1/sqrt(1 - vmax/phib));
293 qroot = sqrt(1 - vnew1/phib);
295 d_qroot.
value += 1.0;
300 par1 = 0.5 * ( 1 + (veff1-vto)/vnroot);
303 DivDeriv(&d_par1,&d_par1,&d_vnroot);
306 cfact = (vgs- vgd)/veroot;
309 DivDeriv(&d_cfact,&d_cfact,&d_veroot);
310 cplus = 0.5 * (1 + cfact);
312 d_cplus.
value += 0.5;
313 cminus = cplus - cfact;
315 d_cminus.
value += 0.5;
334 PlusDeriv(&d_cgsnew,&d_cgsnew,&d_dummy2);
338 PlusDeriv(&d_cgdnew,&d_cgdnew,&d_dummy2);
349 here->cdr_x = d_cdrain.
d1_p;
350 here->cdr_z = d_cdrain.
d1_r;
351 here->cdr_x2 = d_cdrain.
d2_p2;
352 here->cdr_z2 = d_cdrain.
d2_r2;
353 here->cdr_xz = d_cdrain.
d2_pr;
354 here->cdr_x3 = d_cdrain.
d3_p3;
355 here->cdr_z3 = d_cdrain.
d3_r3;;
356 here->cdr_x2z = d_cdrain.
d3_p2r;
357 here->cdr_xz2 = d_cdrain.
d3_pr2;
365 here->cdr_x = -d_cdrain.
d1_p;
366 here->cdr_z = d_cdrain.
d1_p + d_cdrain.
d1_r;
367 here->cdr_x2 = -d_cdrain.
d2_p2;
369 here->cdr_xz = d_cdrain.
d2_p2 + d_cdrain.
d2_pr;
370 here->cdr_x3 = -d_cdrain.
d3_p3;
379 here->cdr_x2 = 0.5*model->
MEStype*here->cdr_x2;
380 here->cdr_z2 = 0.5*model->
MEStype*here->cdr_z2;
381 here->cdr_xz = model->
MEStype*here->cdr_xz;
382 here->cdr_x3 = here->cdr_x3/6.;
383 here->cdr_z3 = here->cdr_z3/6.;
384 here->cdr_x2z = 0.5*here->cdr_x2z;
385 here->cdr_xz2 = 0.5*here->cdr_xz2;
390 here->ggs2 = model->
MEStype*lggs2;
391 here->ggd2 = model->
MEStype*lggd2;
396 here->qgs_x3 = d_qgs.
d3_p3/6.;
397 here->qgs_y3 = d_qgs.
d3_q3/6.;
398 here->qgs_x2y = 0.5*d_qgs.
d3_p2q;
399 here->qgs_xy2 = 0.5*d_qgs.
d3_pq2;
404 here->qgd_x3 = d_qgd.
d3_p3/6.;
405 here->qgd_y3 = d_qgd.
d3_q3/6.;
406 here->qgd_x2y = 0.5*d_qgd.
d3_p2q;
407 here->qgd_xy2 = 0.5*d_qgd.
d3_pq2;
void PlusDeriv(Dderivs *new, Dderivs *old1, Dderivs *old2)
MESinstance * MESinstances
struct sMESmodel * MESnextModel
void SqrtDeriv(Dderivs *new, Dderivs *old)
void MultDeriv(Dderivs *new, Dderivs *old1, Dderivs *old2)
struct sMESinstance * MESnextInstance
void DivDeriv(Dderivs *new, Dderivs *old1, Dderivs *old2)
void TimesDeriv(Dderivs *new, Dderivs *old, double k)
void CubeDeriv(Dderivs *new, Dderivs *old)
void InvDeriv(Dderivs *new, Dderivs *old)
void EqualDeriv(Dderivs *new, Dderivs *old)