Added BSIM3 to the "new_kirchhoff" KCL verification

This commit is contained in:
Francesco Lannutti 2013-01-19 00:31:24 +01:00
parent 2f8d8a59b3
commit efe9f389b5
1 changed files with 93 additions and 24 deletions

View File

@ -71,7 +71,8 @@ BSIM3instance *here;
#endif #endif
double SourceSatCurrent, DrainSatCurrent; double SourceSatCurrent, DrainSatCurrent;
double ag0, qgd, qgs, qgb, von, cbhat, VgstNVt, ExpVgst; double ag0, qgd, qgs, qgb, von, cbhat, VgstNVt, ExpVgst;
double cdrain, cdhat, cdreq, ceqbd, ceqbs, ceqqb, ceqqd, ceqqg, ceq, geq; double cdrain, cdhat, cdreq, cdreq_fvk, ceqbd, ceqbd_fvk, ceqbs, ceqbs_fvk, ceqqb, ceqqd, ceqqg, ceq, geq;
double ceqqb_fvk, ceqqb_SnodePrime_fvk, ceqqd_fvk, ceqqd_SnodePrime_fvk, ceqqg_fvk, ceqqg_SnodePrime_fvk ;
double czbd, czbdsw, czbdswg, czbs, czbssw, czbsswg, evbd, evbs, arg, sarg; double czbd, czbdsw, czbdswg, czbs, czbssw, czbsswg, evbd, evbs, arg, sarg;
double delvbd, delvbs, delvds, delvgd, delvgs; double delvbd, delvbs, delvds, delvgd, delvgs;
double Vfbeff, dVfbeff_dVg, dVfbeff_dVb, V3, V4; double Vfbeff, dVfbeff_dVg, dVfbeff_dVb, V3, V4;
@ -153,7 +154,7 @@ double Leff, Weff, dWeff_dVg, dWeff_dVb;
double AbulkCV, dAbulkCV_dVb; double AbulkCV, dAbulkCV_dVb;
double qgdo, qgso, cgdo, cgso; double qgdo, qgso, cgdo, cgso;
double qcheq=0.0, qdef, gqdef=0.0, cqdef, cqcheq, gtau_diff, gtau_drift; double qcheq=0.0, qdef, gqdef=0.0, cqdef, cqdef_fvk, cqcheq, cqcheq_fvk, gtau_diff, gtau_drift;
double gcqdb=0.0,gcqsb=0.0,gcqgb=0.0,gcqbb=0.0; double gcqdb=0.0,gcqsb=0.0,gcqgb=0.0,gcqbb=0.0;
double dxpart, sxpart, ggtg, ggtd, ggts, ggtb; double dxpart, sxpart, ggtg, ggtd, ggts, ggtb;
double ddxpart_dVd, ddxpart_dVg, ddxpart_dVb, ddxpart_dVs; double ddxpart_dVd, ddxpart_dVg, ddxpart_dVb, ddxpart_dVs;
@ -2793,7 +2794,8 @@ line755:
} }
} }
cqdef = cqcheq = 0.0; cqdef = cqdef_fvk = cqcheq = cqcheq_fvk = 0.0;
if (ByPass) goto line860; if (ByPass) goto line860;
*(ckt->CKTstate0 + here->BSIM3qg) = qgate; *(ckt->CKTstate0 + here->BSIM3qg) = qgate;
@ -2852,8 +2854,8 @@ line755:
line850: line850:
/* initialize to zero charge conductance and current */ /* initialize to zero charge conductance and current */
ceqqg = ceqqb = ceqqd = 0.0; ceqqg = ceqqg_fvk = ceqqg_SnodePrime_fvk = ceqqb = ceqqb_fvk = ceqqb_SnodePrime_fvk = ceqqd = ceqqd_fvk = ceqqd_SnodePrime_fvk = 0.0;
cqcheq = cqdef = 0.0; cqcheq = cqcheq_fvk = cqdef = cqdef_fvk = 0.0;
gcdgb = gcddb = gcdsb = 0.0; gcdgb = gcddb = gcdsb = 0.0;
gcsgb = gcsdb = gcssb = 0.0; gcsgb = gcsdb = gcssb = 0.0;
@ -2883,8 +2885,14 @@ line860:
cqdrn = *(ckt->CKTstate0 + here->BSIM3cqd); cqdrn = *(ckt->CKTstate0 + here->BSIM3cqd);
ceqqg = cqgate - gcggb * vgb + gcgdb * vbd + gcgsb * vbs; ceqqg = cqgate - gcggb * vgb + gcgdb * vbd + gcgsb * vbs;
ceqqg_fvk = cqgate ;
ceqqg_SnodePrime_fvk = ceqqg ;
ceqqb = cqbulk - gcbgb * vgb + gcbdb * vbd + gcbsb * vbs; ceqqb = cqbulk - gcbgb * vgb + gcbdb * vbd + gcbsb * vbs;
ceqqb_fvk = cqbulk ;
ceqqb_SnodePrime_fvk = ceqqb ;
ceqqd = cqdrn - gcdgb * vgb + gcddb * vbd + gcdsb * vbs; ceqqd = cqdrn - gcdgb * vgb + gcddb * vbd + gcdsb * vbs;
ceqqd_fvk = cqdrn ;
ceqqd_SnodePrime_fvk = ceqqd ;
if (here->BSIM3nqsMod) if (here->BSIM3nqsMod)
{ T0 = ggtg * vgb - ggtd * vbd - ggts * vbs; { T0 = ggtg * vgb - ggtd * vbd - ggts * vbs;
@ -2893,8 +2901,10 @@ line860:
ceqqd -= dxpart * T0 + T1 * (ddxpart_dVg * vgb - ddxpart_dVd ceqqd -= dxpart * T0 + T1 * (ddxpart_dVg * vgb - ddxpart_dVd
* vbd - ddxpart_dVs * vbs); * vbd - ddxpart_dVs * vbs);
cqdef = *(ckt->CKTstate0 + here->BSIM3cqcdump) - gqdef * qdef; cqdef = *(ckt->CKTstate0 + here->BSIM3cqcdump) - gqdef * qdef;
cqdef_fvk = *(ckt->CKTstate0 + here->BSIM3cqcdump) ;
cqcheq = *(ckt->CKTstate0 + here->BSIM3cqcheq) cqcheq = *(ckt->CKTstate0 + here->BSIM3cqcheq)
- (gcqgb * vgb - gcqdb * vbd - gcqsb * vbs) + T0; - (gcqgb * vgb - gcqdb * vbd - gcqsb * vbs) + T0;
cqcheq_fvk = *(ckt->CKTstate0 + here->BSIM3cqcheq) ;
} }
if (ckt->CKTmode & MODEINITTRAN) if (ckt->CKTmode & MODEINITTRAN)
@ -2924,12 +2934,13 @@ line900:
FwdSum = Gm + Gmbs; FwdSum = Gm + Gmbs;
RevSum = 0.0; RevSum = 0.0;
cdreq = model->BSIM3type * (cdrain - here->BSIM3gds * vds cdreq = model->BSIM3type * (cdrain - here->BSIM3gds * vds
- Gm * vgs - Gmbs * vbs); - Gm * vgs - Gmbs * vbs);
cdreq_fvk = model->BSIM3type * cdrain ;
ceqbd = -model->BSIM3type * (here->BSIM3csub ceqbd = -model->BSIM3type * (here->BSIM3csub
- here->BSIM3gbds * vds - here->BSIM3gbgs * vgs - here->BSIM3gbds * vds - here->BSIM3gbgs * vgs
- here->BSIM3gbbs * vbs); - here->BSIM3gbbs * vbs);
ceqbs = 0.0; ceqbd_fvk = - (model->BSIM3type * here->BSIM3csub) ;
ceqbs = ceqbs_fvk = 0.0;
gbbdp = -here->BSIM3gbds; gbbdp = -here->BSIM3gbds;
gbbsp = (here->BSIM3gbds + here->BSIM3gbgs + here->BSIM3gbbs); gbbsp = (here->BSIM3gbds + here->BSIM3gbgs + here->BSIM3gbbs);
@ -2951,11 +2962,12 @@ line900:
RevSum = -(Gm + Gmbs); RevSum = -(Gm + Gmbs);
cdreq = -model->BSIM3type * (cdrain + here->BSIM3gds * vds cdreq = -model->BSIM3type * (cdrain + here->BSIM3gds * vds
+ Gm * vgd + Gmbs * vbd); + Gm * vgd + Gmbs * vbd);
cdreq_fvk = - (model->BSIM3type * cdrain) ;
ceqbs = -model->BSIM3type * (here->BSIM3csub ceqbs = -model->BSIM3type * (here->BSIM3csub
+ here->BSIM3gbds * vds - here->BSIM3gbgs * vgd + here->BSIM3gbds * vds - here->BSIM3gbgs * vgd
- here->BSIM3gbbs * vbd); - here->BSIM3gbbs * vbd);
ceqbd = 0.0; ceqbs_fvk = - (model->BSIM3type * here->BSIM3csub) ;
ceqbd = ceqbd_fvk = 0.0;
gbbsp = -here->BSIM3gbds; gbbsp = -here->BSIM3gbds;
gbbdp = (here->BSIM3gbds + here->BSIM3gbgs + here->BSIM3gbbs); gbbdp = (here->BSIM3gbds + here->BSIM3gbgs + here->BSIM3gbbs);
@ -2971,26 +2983,38 @@ line900:
gbspdp = -(gbspg + gbspsp + gbspb); gbspdp = -(gbspg + gbspsp + gbspb);
} }
if (model->BSIM3type > 0) if (model->BSIM3type > 0)
{ ceqbs += (here->BSIM3cbs - here->BSIM3gbs * vbs); { ceqbs += (here->BSIM3cbs - here->BSIM3gbs * vbs);
ceqbs_fvk += here->BSIM3cbs ;
ceqbd += (here->BSIM3cbd - here->BSIM3gbd * vbd); ceqbd += (here->BSIM3cbd - here->BSIM3gbd * vbd);
/* ceqbd_fvk += here->BSIM3cbd ;
/*
ceqqg = ceqqg; ceqqg = ceqqg;
ceqqb = ceqqb; ceqqb = ceqqb;
ceqqd = ceqqd; ceqqd = ceqqd;
cqdef = cqdef; cqdef = cqdef;
cqcheq = cqcheq; cqcheq = cqcheq;
*/ */
} }
else else
{ ceqbs -= (here->BSIM3cbs - here->BSIM3gbs * vbs); { ceqbs -= (here->BSIM3cbs - here->BSIM3gbs * vbs);
ceqbs_fvk -= here->BSIM3cbs ;
ceqbd -= (here->BSIM3cbd - here->BSIM3gbd * vbd); ceqbd -= (here->BSIM3cbd - here->BSIM3gbd * vbd);
ceqbd_fvk -= here->BSIM3cbd ;
ceqqg = -ceqqg; ceqqg = -ceqqg;
ceqqg_fvk = - ceqqg_fvk ;
ceqqg_SnodePrime_fvk = - ceqqg_SnodePrime_fvk ;
ceqqb = -ceqqb; ceqqb = -ceqqb;
ceqqb_fvk = - ceqqb_fvk ;
ceqqb_SnodePrime_fvk = - ceqqb_SnodePrime_fvk ;
ceqqd = -ceqqd; ceqqd = -ceqqd;
ceqqd_fvk = - ceqqd_fvk ;
ceqqd_SnodePrime_fvk = - ceqqd_SnodePrime_fvk ;
cqdef = -cqdef; cqdef = -cqdef;
cqdef_fvk = - cqdef_fvk ;
cqcheq = -cqcheq; cqcheq = -cqcheq;
} cqcheq_fvk = - cqcheq_fvk ;
}
m = here->BSIM3m; m = here->BSIM3m;
#ifdef USE_OMP #ifdef USE_OMP
@ -3117,6 +3141,51 @@ line900:
*(here->BSIM3QspPtr) += m * (ggts - gcqsb); *(here->BSIM3QspPtr) += m * (ggts - gcqsb);
*(here->BSIM3QbPtr) += m * (ggtb - gcqbb); *(here->BSIM3QbPtr) += m * (ggtb - gcqbb);
} }
/* KCL verification - Dynamic Part */
*(ckt->CKTfvk+here->BSIM3gNode) += m * ceqqg_fvk ;
*(ckt->CKTfvk+here->BSIM3bNode) += m * (ceqbs_fvk + ceqbd_fvk + ceqqb_fvk) ;
*(ckt->CKTfvk+here->BSIM3dNodePrime) -= m * (ceqbd_fvk - cdreq_fvk - ceqqd_fvk) ;
*(ckt->CKTfvk+here->BSIM3sNodePrime) -= m * (cdreq_fvk + ceqbs_fvk + ceqqg_SnodePrime_fvk + ceqqb_SnodePrime_fvk + ceqqd_SnodePrime_fvk) ;
if (here->BSIM3nqsMod)
*(ckt->CKTfvk+here->BSIM3qNode) -= m * (cqcheq_fvk - cqdef_fvk) ;
/* KCL verification - Linear and Static Part */
*(ckt->CKTfvk+here->BSIM3dNode) += m * here->BSIM3drainConductance * *(ckt->CKTrhsOld+here->BSIM3dNode) ;
*(ckt->CKTfvk+here->BSIM3sNode) += m * here->BSIM3sourceConductance * *(ckt->CKTrhsOld+here->BSIM3sNode) ;
*(ckt->CKTfvk+here->BSIM3dNodePrime) += m * here->BSIM3drainConductance * *(ckt->CKTrhsOld+here->BSIM3dNodePrime) ;
*(ckt->CKTfvk+here->BSIM3sNodePrime) += m * here->BSIM3sourceConductance * *(ckt->CKTrhsOld+here->BSIM3sNodePrime) ;
*(ckt->CKTfvk+here->BSIM3dNode) -= m * here->BSIM3drainConductance * *(ckt->CKTrhsOld+here->BSIM3dNodePrime) ;
*(ckt->CKTfvk+here->BSIM3sNode) -= m * here->BSIM3sourceConductance * *(ckt->CKTrhsOld+here->BSIM3sNodePrime) ;
*(ckt->CKTfvk+here->BSIM3dNodePrime) -= m * here->BSIM3drainConductance * *(ckt->CKTrhsOld+here->BSIM3dNode) ;
*(ckt->CKTfvk+here->BSIM3sNodePrime) -= m * here->BSIM3sourceConductance * *(ckt->CKTrhsOld+here->BSIM3sNode) ;
if (here->BSIM3nqsMod) //DA RIVEDERE
{
*(here->BSIM3QqPtr) += m * (gqdef + here->BSIM3gtau);
*(here->BSIM3DPqPtr) += m * (dxpart * here->BSIM3gtau);
*(here->BSIM3SPqPtr) += m * (sxpart * here->BSIM3gtau);
*(here->BSIM3GqPtr) -= m * here->BSIM3gtau;
}
/* KCL verification - Linear and Dynamic Part ??? */
*(ckt->CKTfvk+here->BSIM3gNode) -= m * ggtg * *(ckt->CKTrhsOld+here->BSIM3gNode) ;
*(ckt->CKTfvk+here->BSIM3gNode) -= m * ggtb * *(ckt->CKTrhsOld+here->BSIM3bNode) ;
*(ckt->CKTfvk+here->BSIM3gNode) -= m * ggtd * *(ckt->CKTrhsOld+here->BSIM3dNodePrime) ;
*(ckt->CKTfvk+here->BSIM3gNode) -= m * ggts * *(ckt->CKTrhsOld+here->BSIM3sNodePrime) ;
*(ckt->CKTfvk+here->BSIM3dNodePrime) += m * (dxpart * ggtd + T1 * ddxpart_dVd) * *(ckt->CKTrhsOld+here->BSIM3dNodePrime) ;
*(ckt->CKTfvk+here->BSIM3dNodePrime) += m * (dxpart * ggtg + T1 * ddxpart_dVg) * *(ckt->CKTrhsOld+here->BSIM3gNode) ;
*(ckt->CKTfvk+here->BSIM3dNodePrime) -= m * (- dxpart * ggtb - T1 * ddxpart_dVb) * *(ckt->CKTrhsOld+here->BSIM3bNode) ;
*(ckt->CKTfvk+here->BSIM3dNodePrime) -= m * (- dxpart * ggts - T1 * ddxpart_dVs) * *(ckt->CKTrhsOld+here->BSIM3sNodePrime) ;
*(ckt->CKTfvk+here->BSIM3sNodePrime) += m * (gcssb + sxpart * ggts + T1 * dsxpart_dVs) * *(ckt->CKTrhsOld+here->BSIM3sNodePrime) ;
*(ckt->CKTfvk+here->BSIM3sNodePrime) += m * (gcsgb + sxpart * ggtg + T1 * dsxpart_dVg) * *(ckt->CKTrhsOld+here->BSIM3gNode) ;
*(ckt->CKTfvk+here->BSIM3sNodePrime) -= m * (gcsgb + gcsdb + gcssb - sxpart * ggtb - T1 * dsxpart_dVb) * *(ckt->CKTrhsOld+here->BSIM3bNode) ;
*(ckt->CKTfvk+here->BSIM3sNodePrime) -= m * (- gcsdb - sxpart * ggtd - T1 * dsxpart_dVd) * *(ckt->CKTrhsOld+here->BSIM3dNodePrime) ;
#endif #endif
line1000: ; line1000: ;
#ifndef USE_OMP #ifndef USE_OMP