Added BSIM3 to the "new_kirchhoff" KCL verification
This commit is contained in:
parent
2f8d8a59b3
commit
efe9f389b5
|
|
@ -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
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue