use original b3v32ld.c when MODSIMD is disabled
This commit is contained in:
parent
ee4a742b47
commit
346c1f0b58
|
|
@ -10,6 +10,7 @@
|
|||
* Modified by Xuemei Xi, 10/05, 12/21, 2001.
|
||||
* Modified by Paolo Nenzi 2002 and Dietmar Warning 2003
|
||||
**********/
|
||||
|
||||
#include "ngspice/ngspice.h"
|
||||
#include "ngspice/cktdefs.h"
|
||||
#include "bsim3v32def.h"
|
||||
|
|
@ -69,14 +70,17 @@ double SourceSatCurrent, DrainSatCurrent;
|
|||
double ag0, qgd, qgs, qgb, von, cbhat, VgstNVt, ExpVgst;
|
||||
double cdrain, cdhat, cdreq, ceqbd, ceqbs, ceqqb, ceqqd, ceqqg, ceq, geq;
|
||||
double czbd, czbdsw, czbdswg, czbs, czbssw, czbsswg, evbd, evbs, arg, sarg;
|
||||
/* double delvbd, delvbs, delvds, delvgd, delvgs; FB: moved decl into sub block */
|
||||
double delvbd, delvbs, delvds, delvgd, delvgs;
|
||||
double Vfbeff, dVfbeff_dVg, dVfbeff_dVd = 0.0, dVfbeff_dVb, V3, V4;
|
||||
double gcbdb, gcbgb, gcbsb, gcddb, gcdgb, gcdsb, gcgdb, gcggb, gcgsb, gcsdb;
|
||||
/* FB: moved double to decl into NEWCONV block */
|
||||
|
||||
#ifndef NEWCONV
|
||||
double tol;
|
||||
#endif
|
||||
double gcsgb, gcssb, MJ, MJSW, MJSWG;
|
||||
double vbd, vbs, vds, vgb, vgd, vgs, vgdo;
|
||||
/* FB: xfact decl moved inside PREDICTOR block */
|
||||
#ifndef PREDICTOR
|
||||
double xfact;
|
||||
#endif
|
||||
double qgate = 0.0, qbulk = 0.0, qdrn = 0.0, qsrc;
|
||||
double qinoi, cqgate, cqbulk, cqdrn;
|
||||
double Vds, Vgs, Vbs, Gmbs, FwdSum, RevSum;
|
||||
|
|
@ -116,7 +120,7 @@ double Xdep, dXdep_dVb, lt1, dlt1_dVb, ltw, dltw_dVb, Delt_vth, dDelt_vth_dVb;
|
|||
double Theta0, dTheta0_dVb;
|
||||
double TempRatio, tmp1, tmp2, tmp3, tmp4;
|
||||
double DIBL_Sft, dDIBL_Sft_dVd, Lambda, dLambda_dVg;
|
||||
/* double Idtot, Ibtot; FB: moved Idtot and Ibtot decl into sub blocks */
|
||||
double Idtot, Ibtot;
|
||||
#ifndef NOBYPASS
|
||||
double tempv;
|
||||
#endif
|
||||
|
|
@ -207,12 +211,9 @@ for (; model != NULL; model = BSIM3v32nextModel(model))
|
|||
}
|
||||
else
|
||||
{
|
||||
double Idtot, Ibtot;
|
||||
double delvbd, delvbs, delvds, delvgd, delvgs;
|
||||
#ifndef PREDICTOR
|
||||
if ((ckt->CKTmode & MODEINITPRED))
|
||||
{ double xfact;
|
||||
xfact = ckt->CKTdelta / ckt->CKTdeltaOld[1];
|
||||
{ xfact = ckt->CKTdelta / ckt->CKTdeltaOld[1];
|
||||
*(ckt->CKTstate0 + here->BSIM3v32vbs) =
|
||||
*(ckt->CKTstate1 + here->BSIM3v32vbs);
|
||||
vbs = (1.0 + xfact)* (*(ckt->CKTstate1 + here->BSIM3v32vbs))
|
||||
|
|
@ -2746,24 +2747,13 @@ finished:
|
|||
/*
|
||||
* check convergence
|
||||
*/
|
||||
#ifdef USE_OMP
|
||||
here->BSIM3v32noncon=0;
|
||||
#endif
|
||||
if ((here->BSIM3v32off == 0) || (!(ckt->CKTmode & MODEINITFIX)))
|
||||
{ if (Check == 1)
|
||||
{
|
||||
#ifdef USE_OMP
|
||||
here->BSIM3v32noncon++;
|
||||
#else
|
||||
ckt->CKTnoncon++;
|
||||
#endif
|
||||
{ ckt->CKTnoncon++;
|
||||
#ifndef NEWCONV
|
||||
}
|
||||
else
|
||||
{
|
||||
double tol;
|
||||
double Idtot, Ibtot;
|
||||
if (here->BSIM3v32mode >= 0)
|
||||
{ if (here->BSIM3v32mode >= 0)
|
||||
{ Idtot = here->BSIM3v32cd + here->BSIM3v32csub - here->BSIM3v32cbd;
|
||||
}
|
||||
else
|
||||
|
|
@ -2779,12 +2769,7 @@ finished:
|
|||
tol = ckt->CKTreltol * MAX(fabs(cbhat), fabs(Ibtot))
|
||||
+ ckt->CKTabstol;
|
||||
if (fabs(cbhat - Ibtot) > tol)
|
||||
{
|
||||
#ifdef USE_OMP
|
||||
here->BSIM3v32noncon++;
|
||||
#else
|
||||
ckt->CKTnoncon++;
|
||||
#endif
|
||||
{ ckt->CKTnoncon++;
|
||||
}
|
||||
}
|
||||
#endif /* NEWCONV */
|
||||
|
|
@ -3187,9 +3172,7 @@ line850:
|
|||
|
||||
gqdef = gcqgb = gcqdb = gcqsb = gcqbb = 0.0;
|
||||
ggtg = ggtd = ggtb = ggts = 0.0;
|
||||
/* F.B: moved dxpart assignment outside the following expression */
|
||||
dxpart = (here->BSIM3v32mode > 0) ? 0.4 : 0.6;
|
||||
sxpart = (1.0 - dxpart);
|
||||
sxpart = (1.0 - (dxpart = (here->BSIM3v32mode > 0) ? 0.4 : 0.6));
|
||||
ddxpart_dVd = ddxpart_dVg = ddxpart_dVb = ddxpart_dVs = 0.0;
|
||||
dsxpart_dVd = dsxpart_dVg = dsxpart_dVb = dsxpart_dVs = 0.0;
|
||||
|
||||
|
|
@ -3327,13 +3310,8 @@ line900:
|
|||
here->BSIM3v32rhsD = m * (ceqbd - cdreq - ceqqd);
|
||||
here->BSIM3v32rhsS = m * (cdreq + ceqbs + ceqqg
|
||||
+ ceqqb + ceqqd);
|
||||
#ifndef OMP_EFFMEM
|
||||
if (here->BSIM3v32nqsMod)
|
||||
here->BSIM3v32rhsQ = m * (cqcheq - cqdef);
|
||||
#else
|
||||
if (here->BSIM3v32nqsMod)
|
||||
*(ckt->CKTrhs + here->BSIM3v32qNode) += m * (cqcheq - cqdef);
|
||||
#endif
|
||||
#else
|
||||
(*(ckt->CKTrhs + here->BSIM3v32gNode) -= m * ceqqg);
|
||||
(*(ckt->CKTrhs + here->BSIM3v32bNode) -= m * (ceqbs + ceqbd + ceqqb));
|
||||
|
|
@ -3351,17 +3329,27 @@ line900:
|
|||
T1 = qdef * here->BSIM3v32gtau;
|
||||
#ifdef USE_OMP
|
||||
here->BSIM3v32DdPt = m * here->BSIM3v32drainConductance;
|
||||
here->BSIM3v32SsPt = m * here->BSIM3v32sourceConductance;
|
||||
here->BSIM3v32GgPt = m * (gcggb - ggtg);
|
||||
here->BSIM3v32BbPt = m * (here->BSIM3v32gbd + here->BSIM3v32gbs
|
||||
here->BSIM3v32SsPt = m * here->BSIM3v32sourceConductance;
|
||||
here->BSIM3v32BbPt = m * (here->BSIM3v32gbd + here->BSIM3v32gbs
|
||||
- gcbgb - gcbdb - gcbsb - here->BSIM3v32gbbs);
|
||||
|
||||
here->BSIM3v32DPdpPt = m * (here->BSIM3v32drainConductance
|
||||
+ here->BSIM3v32gds + here->BSIM3v32gbd
|
||||
+ RevSum + gcddb + dxpart * ggtd
|
||||
+ T1 * ddxpart_dVd + gbdpdp);
|
||||
here->BSIM3v32SPspPt = m * (here->BSIM3v32sourceConductance
|
||||
+ here->BSIM3v32gds + here->BSIM3v32gbs
|
||||
+ FwdSum + gcssb + sxpart * ggts
|
||||
+ T1 * dsxpart_dVs + gbspsp);
|
||||
here->BSIM3v32DdpPt = m * here->BSIM3v32drainConductance;
|
||||
here->BSIM3v32GbPt = m * (gcggb + gcgdb + gcgsb + ggtb);
|
||||
here->BSIM3v32GdpPt = m * (gcgdb - ggtd);
|
||||
here->BSIM3v32GspPt = m * (gcgsb - ggts);
|
||||
here->BSIM3v32SspPt = m * here->BSIM3v32sourceConductance;
|
||||
here->BSIM3v32BgPt = m * (gcbgb - here->BSIM3v32gbgs);
|
||||
here->BSIM3v32BdpPt = m * (gcbdb - here->BSIM3v32gbd + gbbdp);
|
||||
here->BSIM3v32BspPt = m * (gcbsb - here->BSIM3v32gbs + gbbsp);
|
||||
here->BSIM3v32DPdPt = m * here->BSIM3v32drainConductance;
|
||||
here->BSIM3v32DPgPt = m * (Gm + gcdgb + dxpart * ggtg
|
||||
+ T1 * ddxpart_dVg + gbdpg);
|
||||
here->BSIM3v32DPbPt = m * (here->BSIM3v32gbd - Gmbs + gcdgb + gcddb
|
||||
|
|
@ -3371,25 +3359,14 @@ line900:
|
|||
- dxpart * ggts - T1 * ddxpart_dVs - gbdpsp);
|
||||
here->BSIM3v32SPgPt = m * (gcsgb - Gm + sxpart * ggtg
|
||||
+ T1 * dsxpart_dVg + gbspg);
|
||||
here->BSIM3v32SPsPt = m * here->BSIM3v32sourceConductance;
|
||||
here->BSIM3v32SPbPt = m * (here->BSIM3v32gbs + Gmbs + gcsgb + gcsdb
|
||||
+ gcssb - sxpart * ggtb
|
||||
- T1 * dsxpart_dVb - gbspb);
|
||||
here->BSIM3v32SPdpPt = m * (here->BSIM3v32gds + RevSum - gcsdb
|
||||
- sxpart * ggtd - T1 * dsxpart_dVd - gbspdp);
|
||||
here->BSIM3v32DPdpPt = m * (here->BSIM3v32drainConductance
|
||||
+ here->BSIM3v32gds + here->BSIM3v32gbd
|
||||
+ RevSum + gcddb + dxpart * ggtd
|
||||
+ T1 * ddxpart_dVd + gbdpdp);
|
||||
here->BSIM3v32SPspPt = m * (here->BSIM3v32sourceConductance
|
||||
+ here->BSIM3v32gds + here->BSIM3v32gbs
|
||||
+ FwdSum + gcssb + sxpart * ggts
|
||||
+ T1 * dsxpart_dVs + gbspsp);
|
||||
here->BSIM3v32DdpPt = m * here->BSIM3v32drainConductance;
|
||||
here->BSIM3v32SspPt = m * here->BSIM3v32sourceConductance;
|
||||
here->BSIM3v32DPdPt = m * here->BSIM3v32drainConductance;
|
||||
here->BSIM3v32SPsPt = m * here->BSIM3v32sourceConductance;
|
||||
#ifndef OMP_EFFMEM
|
||||
if (here->BSIM3v32nqsMod)
|
||||
|
||||
if (here->BSIM3v32nqsMod)
|
||||
{
|
||||
here->BSIM3v32QqPt = m * (gqdef + here->BSIM3v32gtau);
|
||||
|
||||
|
|
@ -3402,24 +3379,7 @@ line900:
|
|||
here->BSIM3v32QspPt = m * (ggts - gcqsb);
|
||||
here->BSIM3v32QbPt = m * (ggtb - gcqbb);
|
||||
}
|
||||
#else
|
||||
if (here->BSIM3v32nqsMod)
|
||||
{
|
||||
*(here->BSIM3v32QqPtr) += m * (gqdef + here->BSIM3v32gtau);
|
||||
|
||||
*(here->BSIM3v32DPqPtr) += m * (dxpart * here->BSIM3v32gtau);
|
||||
*(here->BSIM3v32SPqPtr) += m * (sxpart * here->BSIM3v32gtau);
|
||||
*(here->BSIM3v32GqPtr) -= m * here->BSIM3v32gtau;
|
||||
|
||||
*(here->BSIM3v32QgPtr) += m * (ggtg - gcqgb);
|
||||
*(here->BSIM3v32QdpPtr) += m * (ggtd - gcqdb);
|
||||
*(here->BSIM3v32QspPtr) += m * (ggts - gcqsb);
|
||||
*(here->BSIM3v32QbPtr) += m * (ggtb - gcqbb);
|
||||
}
|
||||
#endif
|
||||
#endif /* ifdef USE_OMP */
|
||||
|
||||
#ifndef USE_OMP
|
||||
#else
|
||||
(*(here->BSIM3v32DdPtr) += m * here->BSIM3v32drainConductance);
|
||||
(*(here->BSIM3v32GgPtr) += m * (gcggb - ggtg));
|
||||
(*(here->BSIM3v32SsPtr) += m * here->BSIM3v32sourceConductance);
|
||||
|
|
@ -3497,18 +3457,14 @@ void BSIM3v32LoadRhsMat(GENmodel *inModel, CKTcircuit *ckt)
|
|||
for (idx = 0; idx < InstCount; idx++) {
|
||||
here = InstArray[idx];
|
||||
model = BSIM3v32modPtr(here);
|
||||
/* F.B. Update non convergence count */
|
||||
ckt->CKTnoncon += here->BSIM3v32noncon;
|
||||
/* Update b for Ax = b */
|
||||
(*(ckt->CKTrhs + here->BSIM3v32gNode) -= here->BSIM3v32rhsG);
|
||||
(*(ckt->CKTrhs + here->BSIM3v32bNode) -= here->BSIM3v32rhsB);
|
||||
(*(ckt->CKTrhs + here->BSIM3v32dNodePrime) += here->BSIM3v32rhsD);
|
||||
(*(ckt->CKTrhs + here->BSIM3v32sNodePrime) += here->BSIM3v32rhsS);
|
||||
#ifndef OMP_EFFMEM
|
||||
if (here->BSIM3v32nqsMod)
|
||||
(*(ckt->CKTrhs + here->BSIM3v32qNode) += here->BSIM3v32rhsQ);
|
||||
#endif
|
||||
|
||||
|
||||
/* Update A for Ax = b */
|
||||
(*(here->BSIM3v32DdPtr) += here->BSIM3v32DdPt);
|
||||
(*(here->BSIM3v32GgPtr) += here->BSIM3v32GgPt);
|
||||
|
|
@ -3532,8 +3488,7 @@ void BSIM3v32LoadRhsMat(GENmodel *inModel, CKTcircuit *ckt)
|
|||
(*(here->BSIM3v32SPsPtr) -= here->BSIM3v32SPsPt);
|
||||
(*(here->BSIM3v32SPbPtr) -= here->BSIM3v32SPbPt);
|
||||
(*(here->BSIM3v32SPdpPtr) -= here->BSIM3v32SPdpPt);
|
||||
|
||||
#ifndef OMP_EFFMEM
|
||||
|
||||
if (here->BSIM3v32nqsMod)
|
||||
{
|
||||
*(here->BSIM3v32QqPtr) += here->BSIM3v32QqPt;
|
||||
|
|
@ -3547,7 +3502,6 @@ void BSIM3v32LoadRhsMat(GENmodel *inModel, CKTcircuit *ckt)
|
|||
*(here->BSIM3v32QspPtr) += here->BSIM3v32QspPt;
|
||||
*(here->BSIM3v32QbPtr) += here->BSIM3v32QbPt;
|
||||
}
|
||||
#endif
|
||||
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue