From 346c1f0b58074f5fc9406578ff8822247d480aba Mon Sep 17 00:00:00 2001 From: Florian Ballenegger Date: Wed, 15 Jul 2020 18:08:08 +0200 Subject: [PATCH] use original b3v32ld.c when MODSIMD is disabled --- src/spicelib/devices/bsim3v32/b3v32ld.c | 112 +++++++----------------- 1 file changed, 33 insertions(+), 79 deletions(-) diff --git a/src/spicelib/devices/bsim3v32/b3v32ld.c b/src/spicelib/devices/bsim3v32/b3v32ld.c index c114ba6db..06c153c32 100644 --- a/src/spicelib/devices/bsim3v32/b3v32ld.c +++ b/src/spicelib/devices/bsim3v32/b3v32ld.c @@ -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 } }