Merge commit '683e208d87f431eb175a368d63dc10f2311a7bf7' into pre-master-46

Fixes in BSIM4 4.8.3 contributed by A. Buermen
This commit is contained in:
dwarning 2025-09-16 17:58:21 +02:00
commit f314e2b41c
9 changed files with 115 additions and 84 deletions

View File

@ -71,6 +71,9 @@ IOP( "mult_i", BSIM4_MULT_I, IF_REAL, "Variability in current"),
IOP( "mult_q", BSIM4_MULT_Q, IF_REAL, "Variability in charge"), IOP( "mult_q", BSIM4_MULT_Q, IF_REAL, "Variability in charge"),
IOP( "mult_fn", BSIM4_MULT_FN, IF_REAL, "Variability in flicker noise"), IOP( "mult_fn", BSIM4_MULT_FN, IF_REAL, "Variability in flicker noise"),
IP( "ic", BSIM4_IC, IF_REALVEC , "Vector of DS,GS,BS initial voltages"), IP( "ic", BSIM4_IC, IF_REALVEC , "Vector of DS,GS,BS initial voltages"),
IOP( "icvgs", BSIM4_IC_VGS, IF_REAL , "GS initial voltage"),
IOP( "icvds", BSIM4_IC_VDS, IF_REAL , "DS initial voltage"),
IOP( "icvbs", BSIM4_IC_VBS, IF_REAL , "BS initial voltage"),
OP( "gmbs", BSIM4_GMBS, IF_REAL, "Gmb"), OP( "gmbs", BSIM4_GMBS, IF_REAL, "Gmb"),
OP( "gm", BSIM4_GM, IF_REAL, "Gm"), OP( "gm", BSIM4_GM, IF_REAL, "Gm"),
OP( "gds", BSIM4_GDS, IF_REAL, "Gds"), OP( "gds", BSIM4_GDS, IF_REAL, "Gds"),

View File

@ -462,8 +462,8 @@ double m, mult_i, mult_q;
* Loading AC matrix * Loading AC matrix
*/ */
m = here->BSIM4m; m = here->BSIM4m;
mult_i = here->BSIM4mult_i; mult_i = here->BSIM4mult_i * here->BSIM4m;
mult_q = here->BSIM4mult_q; mult_q = here->BSIM4mult_q * here->BSIM4m;
if (!model->BSIM4rdsMod) if (!model->BSIM4rdsMod)
{ gdpr = here->BSIM4drainConductance; { gdpr = here->BSIM4drainConductance;

View File

@ -203,11 +203,11 @@ BSIM4instance *here = (BSIM4instance*)inst;
return(OK); return(OK);
case BSIM4_SOURCECONDUCT: case BSIM4_SOURCECONDUCT:
value->rValue = here->BSIM4sourceConductance; value->rValue = here->BSIM4sourceConductance;
value->rValue *= here->BSIM4mult_i; value->rValue *= here->BSIM4mult_i * here->BSIM4m;
return(OK); return(OK);
case BSIM4_DRAINCONDUCT: case BSIM4_DRAINCONDUCT:
value->rValue = here->BSIM4drainConductance; value->rValue = here->BSIM4drainConductance;
value->rValue *= here->BSIM4mult_i; value->rValue *= here->BSIM4mult_i * here->BSIM4m;
return(OK); return(OK);
case BSIM4_VBD: case BSIM4_VBD:
value->rValue = *(ckt->CKTstate0 + here->BSIM4vbd); value->rValue = *(ckt->CKTstate0 + here->BSIM4vbd);
@ -223,67 +223,67 @@ BSIM4instance *here = (BSIM4instance*)inst;
return(OK); return(OK);
case BSIM4_CD: case BSIM4_CD:
value->rValue = here->BSIM4cd; value->rValue = here->BSIM4cd;
value->rValue *= here->BSIM4mult_i; value->rValue *= here->BSIM4mult_i * here->BSIM4m;
return(OK); return(OK);
case BSIM4_CBS: case BSIM4_CBS:
value->rValue = here->BSIM4cbs; value->rValue = here->BSIM4cbs;
value->rValue *= here->BSIM4mult_i; value->rValue *= here->BSIM4mult_i * here->BSIM4m;
return(OK); return(OK);
case BSIM4_CBD: case BSIM4_CBD:
value->rValue = here->BSIM4cbd; value->rValue = here->BSIM4cbd;
value->rValue *= here->BSIM4mult_i; value->rValue *= here->BSIM4mult_i * here->BSIM4m;
return(OK); return(OK);
case BSIM4_CSUB: case BSIM4_CSUB:
value->rValue = here->BSIM4csub; value->rValue = here->BSIM4csub;
value->rValue *= here->BSIM4mult_i; value->rValue *= here->BSIM4mult_i * here->BSIM4m;
return(OK); return(OK);
case BSIM4_IGIDL: case BSIM4_IGIDL:
value->rValue = here->BSIM4Igidl; value->rValue = here->BSIM4Igidl;
value->rValue *= here->BSIM4mult_i; value->rValue *= here->BSIM4mult_i * here->BSIM4m;
return(OK); return(OK);
case BSIM4_IGISL: case BSIM4_IGISL:
value->rValue = here->BSIM4Igisl; value->rValue = here->BSIM4Igisl;
value->rValue *= here->BSIM4mult_i; value->rValue *= here->BSIM4mult_i * here->BSIM4m;
return(OK); return(OK);
case BSIM4_IGS: case BSIM4_IGS:
value->rValue = here->BSIM4Igs; value->rValue = here->BSIM4Igs;
value->rValue *= here->BSIM4mult_i; value->rValue *= here->BSIM4mult_i * here->BSIM4m;
return(OK); return(OK);
case BSIM4_IGD: case BSIM4_IGD:
value->rValue = here->BSIM4Igd; value->rValue = here->BSIM4Igd;
value->rValue *= here->BSIM4mult_i; value->rValue *= here->BSIM4mult_i * here->BSIM4m;
return(OK); return(OK);
case BSIM4_IGB: case BSIM4_IGB:
value->rValue = here->BSIM4Igb; value->rValue = here->BSIM4Igb;
value->rValue *= here->BSIM4mult_i; value->rValue *= here->BSIM4mult_i * here->BSIM4m;
return(OK); return(OK);
case BSIM4_IGCS: case BSIM4_IGCS:
value->rValue = here->BSIM4Igcs; value->rValue = here->BSIM4Igcs;
value->rValue *= here->BSIM4mult_i; value->rValue *= here->BSIM4mult_i * here->BSIM4m;
return(OK); return(OK);
case BSIM4_IGCD: case BSIM4_IGCD:
value->rValue = here->BSIM4Igcd; value->rValue = here->BSIM4Igcd;
value->rValue *= here->BSIM4mult_i; value->rValue *= here->BSIM4mult_i * here->BSIM4m;
return(OK); return(OK);
case BSIM4_GM: case BSIM4_GM:
value->rValue = here->BSIM4gm; value->rValue = here->BSIM4gm;
value->rValue *= here->BSIM4mult_i; value->rValue *= here->BSIM4mult_i * here->BSIM4m;
return(OK); return(OK);
case BSIM4_GDS: case BSIM4_GDS:
value->rValue = here->BSIM4gds; value->rValue = here->BSIM4gds;
value->rValue *= here->BSIM4mult_i; value->rValue *= here->BSIM4mult_i * here->BSIM4m;
return(OK); return(OK);
case BSIM4_GMBS: case BSIM4_GMBS:
value->rValue = here->BSIM4gmbs; value->rValue = here->BSIM4gmbs;
value->rValue *= here->BSIM4mult_i; value->rValue *= here->BSIM4mult_i * here->BSIM4m;
return(OK); return(OK);
case BSIM4_GBD: case BSIM4_GBD:
value->rValue = here->BSIM4gbd; value->rValue = here->BSIM4gbd;
value->rValue *= here->BSIM4mult_i; value->rValue *= here->BSIM4mult_i * here->BSIM4m;
return(OK); return(OK);
case BSIM4_GBS: case BSIM4_GBS:
value->rValue = here->BSIM4gbs; value->rValue = here->BSIM4gbs;
value->rValue *= here->BSIM4mult_i; value->rValue *= here->BSIM4mult_i * here->BSIM4m;
return(OK); return(OK);
/* case BSIM4_QB: /* case BSIM4_QB:
value->rValue = *(ckt->CKTstate0 + here->BSIM4qb); value->rValue = *(ckt->CKTstate0 + here->BSIM4qb);
@ -308,19 +308,19 @@ BSIM4instance *here = (BSIM4instance*)inst;
return(OK); */ return(OK); */
case BSIM4_QB: case BSIM4_QB:
value->rValue = here->BSIM4qbulk; value->rValue = here->BSIM4qbulk;
value->rValue *= here->BSIM4mult_q; value->rValue *= here->BSIM4mult_q * here->BSIM4m;
return(OK); return(OK);
case BSIM4_QG: case BSIM4_QG:
value->rValue = here->BSIM4qgate; value->rValue = here->BSIM4qgate;
value->rValue *= here->BSIM4mult_q; value->rValue *= here->BSIM4mult_q * here->BSIM4m;
return(OK); return(OK);
case BSIM4_QS: case BSIM4_QS:
value->rValue = here->BSIM4qsrc; value->rValue = here->BSIM4qsrc;
value->rValue *= here->BSIM4mult_q; value->rValue *= here->BSIM4mult_q * here->BSIM4m;
return(OK); return(OK);
case BSIM4_QD: case BSIM4_QD:
value->rValue = here->BSIM4qdrn; value->rValue = here->BSIM4qdrn;
value->rValue *= here->BSIM4mult_q; value->rValue *= here->BSIM4mult_q * here->BSIM4m;
return(OK); return(OK);
case BSIM4_QINV: case BSIM4_QINV:
value->rValue = here->BSIM4qinv; value->rValue = here->BSIM4qinv;
@ -330,82 +330,82 @@ BSIM4instance *here = (BSIM4instance*)inst;
return(OK); return(OK);
case BSIM4_GCRG: case BSIM4_GCRG:
value->rValue = here->BSIM4gcrg; value->rValue = here->BSIM4gcrg;
value->rValue *= here->BSIM4mult_i; value->rValue *= here->BSIM4mult_i * here->BSIM4m;
return(OK); return(OK);
case BSIM4_GTAU: case BSIM4_GTAU:
value->rValue = here->BSIM4gtau; value->rValue = here->BSIM4gtau;
return(OK); return(OK);
case BSIM4_CGGB: case BSIM4_CGGB:
value->rValue = here->BSIM4cggb; value->rValue = here->BSIM4cggb;
value->rValue *= here->BSIM4mult_q; value->rValue *= here->BSIM4mult_q * here->BSIM4m;
return(OK); return(OK);
case BSIM4_CGDB: case BSIM4_CGDB:
value->rValue = here->BSIM4cgdb; value->rValue = here->BSIM4cgdb;
value->rValue *= here->BSIM4mult_q; value->rValue *= here->BSIM4mult_q * here->BSIM4m;
return(OK); return(OK);
case BSIM4_CGSB: case BSIM4_CGSB:
value->rValue = here->BSIM4cgsb; value->rValue = here->BSIM4cgsb;
value->rValue *= here->BSIM4mult_q; value->rValue *= here->BSIM4mult_q * here->BSIM4m;
return(OK); return(OK);
case BSIM4_CDGB: case BSIM4_CDGB:
value->rValue = here->BSIM4cdgb; value->rValue = here->BSIM4cdgb;
value->rValue *= here->BSIM4mult_q; value->rValue *= here->BSIM4mult_q * here->BSIM4m;
return(OK); return(OK);
case BSIM4_CDDB: case BSIM4_CDDB:
value->rValue = here->BSIM4cddb; value->rValue = here->BSIM4cddb;
value->rValue *= here->BSIM4mult_q; value->rValue *= here->BSIM4mult_q * here->BSIM4m;
return(OK); return(OK);
case BSIM4_CDSB: case BSIM4_CDSB:
value->rValue = here->BSIM4cdsb; value->rValue = here->BSIM4cdsb;
value->rValue *= here->BSIM4mult_q; value->rValue *= here->BSIM4mult_q * here->BSIM4m;
return(OK); return(OK);
case BSIM4_CBGB: case BSIM4_CBGB:
value->rValue = here->BSIM4cbgb; value->rValue = here->BSIM4cbgb;
value->rValue *= here->BSIM4mult_q; value->rValue *= here->BSIM4mult_q * here->BSIM4m;
return(OK); return(OK);
case BSIM4_CBDB: case BSIM4_CBDB:
value->rValue = here->BSIM4cbdb; value->rValue = here->BSIM4cbdb;
value->rValue *= here->BSIM4mult_q; value->rValue *= here->BSIM4mult_q * here->BSIM4m;
return(OK); return(OK);
case BSIM4_CBSB: case BSIM4_CBSB:
value->rValue = here->BSIM4cbsb; value->rValue = here->BSIM4cbsb;
value->rValue *= here->BSIM4mult_q; value->rValue *= here->BSIM4mult_q * here->BSIM4m;
return(OK); return(OK);
case BSIM4_CSGB: case BSIM4_CSGB:
value->rValue = here->BSIM4csgb; value->rValue = here->BSIM4csgb;
value->rValue *= here->BSIM4mult_q; value->rValue *= here->BSIM4mult_q * here->BSIM4m;
return(OK); return(OK);
case BSIM4_CSDB: case BSIM4_CSDB:
value->rValue = here->BSIM4csdb; value->rValue = here->BSIM4csdb;
value->rValue *= here->BSIM4mult_q; value->rValue *= here->BSIM4mult_q * here->BSIM4m;
return(OK); return(OK);
case BSIM4_CSSB: case BSIM4_CSSB:
value->rValue = here->BSIM4cssb; value->rValue = here->BSIM4cssb;
value->rValue *= here->BSIM4mult_q; value->rValue *= here->BSIM4mult_q * here->BSIM4m;
return(OK); return(OK);
case BSIM4_CGBB: case BSIM4_CGBB:
value->rValue = here->BSIM4cgbb; value->rValue = here->BSIM4cgbb;
value->rValue *= here->BSIM4mult_q; value->rValue *= here->BSIM4mult_q * here->BSIM4m;
return(OK); return(OK);
case BSIM4_CDBB: case BSIM4_CDBB:
value->rValue = here->BSIM4cdbb; value->rValue = here->BSIM4cdbb;
value->rValue *= here->BSIM4mult_q; value->rValue *= here->BSIM4mult_q * here->BSIM4m;
return(OK); return(OK);
case BSIM4_CSBB: case BSIM4_CSBB:
value->rValue = here->BSIM4csbb; value->rValue = here->BSIM4csbb;
value->rValue *= here->BSIM4mult_q; value->rValue *= here->BSIM4mult_q * here->BSIM4m;
return(OK); return(OK);
case BSIM4_CBBB: case BSIM4_CBBB:
value->rValue = here->BSIM4cbbb; value->rValue = here->BSIM4cbbb;
value->rValue *= here->BSIM4mult_q; value->rValue *= here->BSIM4mult_q * here->BSIM4m;
return(OK); return(OK);
case BSIM4_CAPBD: case BSIM4_CAPBD:
value->rValue = here->BSIM4capbd; value->rValue = here->BSIM4capbd;
value->rValue *= here->BSIM4mult_q; value->rValue *= here->BSIM4mult_q * here->BSIM4m;
return(OK); return(OK);
case BSIM4_CAPBS: case BSIM4_CAPBS:
value->rValue = here->BSIM4capbs; value->rValue = here->BSIM4capbs;
value->rValue *= here->BSIM4mult_q; value->rValue *= here->BSIM4mult_q * here->BSIM4m;
return(OK); return(OK);
case BSIM4_VON: case BSIM4_VON:
value->rValue = here->BSIM4von; value->rValue = here->BSIM4von;
@ -427,15 +427,15 @@ BSIM4instance *here = (BSIM4instance*)inst;
return(OK); return(OK);
case BSIM4_CGSO: case BSIM4_CGSO:
value->rValue = here->BSIM4cgso; value->rValue = here->BSIM4cgso;
value->rValue *= here->BSIM4mult_q; value->rValue *= here->BSIM4mult_q * here->BSIM4m;
return(OK); return(OK);
case BSIM4_CGDO: case BSIM4_CGDO:
value->rValue = here->BSIM4cgdo; value->rValue = here->BSIM4cgdo;
value->rValue *= here->BSIM4mult_q; value->rValue *= here->BSIM4mult_q * here->BSIM4m;
return(OK); return(OK);
case BSIM4_CGBO: case BSIM4_CGBO:
value->rValue = here->pParam->BSIM4cgbo; value->rValue = here->pParam->BSIM4cgbo;
value->rValue *= here->BSIM4mult_q; value->rValue *= here->BSIM4mult_q * here->BSIM4m;
return(OK); return(OK);
case BSIM4_WEFF: case BSIM4_WEFF:
value->rValue = here->pParam->BSIM4weff; value->rValue = here->pParam->BSIM4weff;

View File

@ -4986,9 +4986,9 @@ line900:
*/ */
m = here->BSIM4m; m = here->BSIM4m;
mult_i = here->BSIM4mult_i; mult_i = here->BSIM4mult_i * here->BSIM4m;
mult_q = here->BSIM4mult_q; mult_q = here->BSIM4mult_q * here->BSIM4m;
#ifdef USE_OMP #ifdef USE_OMP
here->BSIM4rhsdPrime = (mult_i * (ceqjd - ceqbd + ceqgdtot here->BSIM4rhsdPrime = (mult_i * (ceqjd - ceqbd + ceqgdtot
- ceqdrn + Idtoteq) - mult_q * ceqqd); - ceqdrn + Idtoteq) - mult_q * ceqqd);
@ -5006,9 +5006,9 @@ line900:
- ceqgstot + Istoteq) + mult_q * (ceqqg + ceqqb + ceqqd + ceqqgmid)); - ceqgstot + Istoteq) + mult_q * (ceqqg + ceqqb + ceqqd + ceqqgmid));
} }
else else
{ here->BSIM4rhsdb = mult_i * (ceqjd + ceqqjd); { here->BSIM4rhsdb = mult_i * (ceqjd /*+ ceqqjd */) + mult_q * ceqqjd);
here->BSIM4rhsbPrime = (mult_i * (ceqbd + ceqbs + Ibtoteq) - mult_q * ceqqb); here->BSIM4rhsbPrime = (mult_i * (ceqbd + ceqbs + Ibtoteq) - mult_q * ceqqb);
here->BSIM4rhssb = mult_i * (ceqjs + ceqqjs); here->BSIM4rhssb = mult_i * (ceqjs /*+ ceqqjs*/) + mult_q * ceqqjs;
here->BSIM4rhssPrime = (mult_i * (ceqdrn - ceqbs + ceqjs - ceqgstot + Istoteq) + mult_q * (ceqqd here->BSIM4rhssPrime = (mult_i * (ceqdrn - ceqbs + ceqjs - ceqgstot + Istoteq) + mult_q * (ceqqd
+ ceqqg + ceqqb + ceqqjd + ceqqjs + ceqqgmid)); + ceqqg + ceqqb + ceqqjd + ceqqjs + ceqqgmid));
} }
@ -5037,9 +5037,9 @@ line900:
- ceqgstot + Istoteq) + mult_q * (ceqqg + ceqqb + ceqqd + ceqqgmid))); - ceqgstot + Istoteq) + mult_q * (ceqqg + ceqqb + ceqqd + ceqqgmid)));
} }
else else
{ (*(ckt->CKTrhs + here->BSIM4dbNode) -= mult_i * (ceqjd + ceqqjd)); { (*(ckt->CKTrhs + here->BSIM4dbNode) -= mult_i * (ceqjd /*+ ceqqjd*/) + mult_q * ceqqjd);
(*(ckt->CKTrhs + here->BSIM4bNodePrime) += (mult_i * (ceqbd + ceqbs + Ibtoteq) - mult_q * ceqqb)); (*(ckt->CKTrhs + here->BSIM4bNodePrime) += (mult_i * (ceqbd + ceqbs + Ibtoteq) - mult_q * ceqqb));
(*(ckt->CKTrhs + here->BSIM4sbNode) -= mult_i * (ceqjs + ceqqjs)); (*(ckt->CKTrhs + here->BSIM4sbNode) -= mult_i * (ceqjs /*+ ceqqjs*/) + mult_q * ceqqjs);
(*(ckt->CKTrhs + here->BSIM4sNodePrime) += (mult_i * (ceqdrn - ceqbs + ceqjs - ceqgstot + Istoteq) + mult_q * (ceqqd (*(ckt->CKTrhs + here->BSIM4sNodePrime) += (mult_i * (ceqdrn - ceqbs + ceqjs - ceqgstot + Istoteq) + mult_q * (ceqqd
+ ceqqg + ceqqb + ceqqjd + ceqqjs + ceqqgmid))); + ceqqg + ceqqb + ceqqjd + ceqqjs + ceqqgmid)));
} }
@ -5227,9 +5227,9 @@ line900:
here->BSIM4_99 = m * (ggts - gcqsb); here->BSIM4_99 = m * (ggts - gcqsb);
here->BSIM4_100 = m * (ggtb - gcqbb); here->BSIM4_100 = m * (ggtb - gcqbb);
here->BSIM4_101 = m * dxpart * here->BSIM4gtau; here->BSIM4_101 = mult_q * dxpart * here->BSIM4gtau;
here->BSIM4_102 = m * sxpart * here->BSIM4gtau; here->BSIM4_102 = mult_q * sxpart * here->BSIM4gtau;
here->BSIM4_103 = m * here->BSIM4gtau; here->BSIM4_103 = mult_q * here->BSIM4gtau;
} }
#else #else
if (here->BSIM4rgateMod == 1) if (here->BSIM4rgateMod == 1)
@ -5382,9 +5382,9 @@ line900:
(*(here->BSIM4QspPtr) += m * (ggts - gcqsb)); (*(here->BSIM4QspPtr) += m * (ggts - gcqsb));
(*(here->BSIM4QbpPtr) += m * (ggtb - gcqbb)); (*(here->BSIM4QbpPtr) += m * (ggtb - gcqbb));
(*(here->BSIM4DPqPtr) += m * (dxpart * here->BSIM4gtau)); (*(here->BSIM4DPqPtr) += mult_q * (dxpart * here->BSIM4gtau));
(*(here->BSIM4SPqPtr) += m * (sxpart * here->BSIM4gtau)); (*(here->BSIM4SPqPtr) += mult_q * (sxpart * here->BSIM4gtau));
(*(here->BSIM4GPqPtr) -= m * (here->BSIM4gtau)); (*(here->BSIM4GPqPtr) -= mult_q * (here->BSIM4gtau));
} }
#endif #endif

View File

@ -155,8 +155,8 @@ double mult_i, mult_fn;
} }
break; break;
case N_CALC: case N_CALC:
mult_i = here->BSIM4mult_i; mult_i = here->BSIM4mult_i * here->BSIM4m;
mult_fn = here->BSIM4mult_fn; mult_fn = here->BSIM4mult_fn * here->BSIM4m;
switch (mode) switch (mode)
{ case N_DENS: { case N_DENS:
if (model->BSIM4tnoiMod == 0) if (model->BSIM4tnoiMod == 0)
@ -366,9 +366,10 @@ double mult_i, mult_fn;
epsilon = (T7 - T7 * T7 * T7 / 3.0) / (6.0 * T6); epsilon = (T7 - T7 * T7 * T7 / 3.0) / (6.0 * T6);
T8 = here->BSIM4Vgsteff / here->BSIM4EsatL; T8 = here->BSIM4Vgsteff / here->BSIM4EsatL;
T8 *= T8; T8 *= T8;
if ((strcmp(model->BSIM4version, "4.8.1")) && (strncmp(model->BSIM4version, "4.81", 4)) && (strncmp(model->BSIM4version, "4.8", 3)) && // if ((strcmp(model->BSIM4version, "4.8.1")) && (strncmp(model->BSIM4version, "4.81", 4)) && (strncmp(model->BSIM4version, "4.8", 3)) &&
(strcmp(model->BSIM4version, "4.8.2")) && (strncmp(model->BSIM4version, "4.82", 4)) && // (strcmp(model->BSIM4version, "4.8.2")) && (strncmp(model->BSIM4version, "4.82", 4)) &&
(strcmp(model->BSIM4version, "4.8.3")) && (strncmp(model->BSIM4version, "4.83", 4))) // (strcmp(model->BSIM4version, "4.8.3")) && (strncmp(model->BSIM4version, "4.83", 4)))
if (model->BSIM4v48intVersion<=BSIM4v48V480)
{ {
npart_c = model->BSIM4rnoic * (1.0 + T8 npart_c = model->BSIM4rnoic * (1.0 + T8
* model->BSIM4tnoic * Leff); * model->BSIM4tnoic * Leff);
@ -420,9 +421,10 @@ double mult_i, mult_fn;
} }
switch(model->BSIM4tnoiMod) switch(model->BSIM4tnoiMod)
{ case 0: { case 0:
if ((strcmp(model->BSIM4version, "4.8.1")) && (strncmp(model->BSIM4version, "4.81", 4)) && (strncmp(model->BSIM4version, "4.8", 3)) && // if ((strcmp(model->BSIM4version, "4.8.1")) && (strncmp(model->BSIM4version, "4.81", 4)) && (strncmp(model->BSIM4version, "4.8", 3)) &&
(strcmp(model->BSIM4version, "4.8.2")) && (strncmp(model->BSIM4version, "4.82", 4)) && // (strcmp(model->BSIM4version, "4.8.2")) && (strncmp(model->BSIM4version, "4.82", 4)) &&
(strcmp(model->BSIM4version, "4.8.3")) && (strncmp(model->BSIM4version, "4.83", 4))) // (strcmp(model->BSIM4version, "4.8.3")) && (strncmp(model->BSIM4version, "4.83", 4)))
if (model->BSIM4v48intVersion<=BSIM4v48V480)
{ {
T0 = here->BSIM4ueff * fabs(here->BSIM4qinv); T0 = here->BSIM4ueff * fabs(here->BSIM4qinv);
T1 = T0 * tmp + pParam->BSIM4leff T1 = T0 * tmp + pParam->BSIM4leff
@ -449,9 +451,10 @@ double mult_i, mult_fn;
} }
break; break;
case 1: case 1:
if ((strcmp(model->BSIM4version, "4.8.1")) && (strncmp(model->BSIM4version, "4.81", 4)) && (strncmp(model->BSIM4version, "4.8", 3)) && // if ((strcmp(model->BSIM4version, "4.8.1")) && (strncmp(model->BSIM4version, "4.81", 4)) && (strncmp(model->BSIM4version, "4.8", 3)) &&
(strcmp(model->BSIM4version, "4.8.2")) && (strncmp(model->BSIM4version, "4.82", 4)) && // (strcmp(model->BSIM4version, "4.8.2")) && (strncmp(model->BSIM4version, "4.82", 4)) &&
(strcmp(model->BSIM4version, "4.8.3")) && (strncmp(model->BSIM4version, "4.83", 4))) // (strcmp(model->BSIM4version, "4.8.3")) && (strncmp(model->BSIM4version, "4.83", 4)))
if (model->BSIM4v48intVersion<=BSIM4v48V480)
{ {
T0 = here->BSIM4gm + here->BSIM4gmbs + here->BSIM4gds; T0 = here->BSIM4gm + here->BSIM4gmbs + here->BSIM4gds;
T0 *= T0; T0 *= T0;

View File

@ -494,8 +494,8 @@ double m, mult_i, mult_q;
* Loading PZ matrix * Loading PZ matrix
*/ */
m = here->BSIM4m; m = here->BSIM4m;
mult_i = here->BSIM4mult_i; mult_i = here->BSIM4mult_i * here->BSIM4m;
mult_q = here->BSIM4mult_q; mult_q = here->BSIM4mult_q * here->BSIM4m;
if (!model->BSIM4rdsMod) if (!model->BSIM4rdsMod)
{ gdpr = here->BSIM4drainConductance; { gdpr = here->BSIM4drainConductance;

View File

@ -203,6 +203,19 @@ BSIM4instance **InstArray;
} }
if (!model->BSIM4versionGiven) if (!model->BSIM4versionGiven)
model->BSIM4version = copy("4.8.3"); model->BSIM4version = copy("4.8.3");
/* Speed up version checking via integer version number */
if ((!strcmp(model->BSIM4version, "4.8.3"))||(!strncmp(model->BSIM4version, "4.83", 4))||(!strncmp(model->BSIM4version, "4.8", 3))) {
model->BSIM4v48intVersion = BSIM4v48V483;
} else if ((!strcmp(model->BSIM4version, "4.8.2"))||(!strncmp(model->BSIM4version, "4.82", 4))) {
model->BSIM4v48intVersion = BSIM4v48V482;
} else if ((!strcmp(model->BSIM4version, "4.8.1"))||(!strncmp(model->BSIM4version, "4.81", 4))) {
model->BSIM4v48intVersion = BSIM4v48V481;
} else if ((!strcmp(model->BSIM4version, "4.8.0"))||(!strncmp(model->BSIM4version, "4.80", 4))) {
model->BSIM4v48intVersion = BSIM4v48V480;
} else {
printf("Warning: unknown BSIM4 version. Working now with BSIM4.8.3.\n");
model->BSIM4v48intVersion = BSIM4v48V483;
}
if (!model->BSIM4toxrefGiven) if (!model->BSIM4toxrefGiven)
model->BSIM4toxref = 30.0e-10; model->BSIM4toxref = 30.0e-10;
if (!model->BSIM4eotGiven) if (!model->BSIM4eotGiven)
@ -342,9 +355,10 @@ BSIM4instance **InstArray;
if (!model->BSIM4ucsGiven) if (!model->BSIM4ucsGiven)
model->BSIM4ucs = (model->BSIM4type == NMOS) ? 1.67 : 1.0; model->BSIM4ucs = (model->BSIM4type == NMOS) ? 1.67 : 1.0;
if ((strcmp(model->BSIM4version, "4.8.1")) && (strncmp(model->BSIM4version, "4.81", 4)) && // if ((strcmp(model->BSIM4version, "4.8.1")) && (strncmp(model->BSIM4version, "4.81", 4)) &&
(strcmp(model->BSIM4version, "4.8.2")) && (strncmp(model->BSIM4version, "4.82", 4)) && // (strcmp(model->BSIM4version, "4.8.2")) && (strncmp(model->BSIM4version, "4.82", 4)) &&
(strcmp(model->BSIM4version, "4.8.3")) && (strncmp(model->BSIM4version, "4.83", 4))) // (strcmp(model->BSIM4version, "4.8.3")) && (strncmp(model->BSIM4version, "4.83", 4)))
if (model->BSIM4v48intVersion<=BSIM4v48V480)
{ {
if (!model->BSIM4uaGiven) if (!model->BSIM4uaGiven)
model->BSIM4ua = ((model->BSIM4mobMod == 2)) ? 1.0e-15 : 1.0e-9; /* unit m/V */ model->BSIM4ua = ((model->BSIM4mobMod == 2)) ? 1.0e-15 : 1.0e-9; /* unit m/V */
@ -2361,9 +2375,10 @@ BSIM4instance **InstArray;
if (!here->BSIM4ngconGiven) if (!here->BSIM4ngconGiven)
here->BSIM4ngcon = model->BSIM4ngcon; here->BSIM4ngcon = model->BSIM4ngcon;
here->BSIM4mult_i = here->BSIM4mult_i * here->BSIM4m; // Recursive scaling produces incorrect results after second call to setup()
here->BSIM4mult_q = here->BSIM4mult_q * here->BSIM4m; // here->BSIM4mult_i = here->BSIM4mult_i * here->BSIM4m;
here->BSIM4mult_fn = here->BSIM4mult_fn * here->BSIM4m; // here->BSIM4mult_q = here->BSIM4mult_q * here->BSIM4m;
// here->BSIM4mult_fn = here->BSIM4mult_fn * here->BSIM4m;
/* Process instance model selectors, some /* Process instance model selectors, some
* may override their global counterparts * may override their global counterparts

View File

@ -122,8 +122,12 @@ int Fatal_Flag = 0;
if(model->BSIM4mtrlMod == 0) if(model->BSIM4mtrlMod == 0)
{ {
double chktol = fabs(model->BSIM4toxe);
if (fabs(model->BSIM4toxp)>chktol) chktol = fabs(model->BSIM4toxp);
if (fabs(model->BSIM4dtox)>chktol) chktol = fabs(model->BSIM4dtox);
chktol=chktol*1e-14;
if ((model->BSIM4toxeGiven) && (model->BSIM4toxpGiven) && (model->BSIM4dtoxGiven) if ((model->BSIM4toxeGiven) && (model->BSIM4toxpGiven) && (model->BSIM4dtoxGiven)
&& (model->BSIM4toxe != (model->BSIM4toxp + model->BSIM4dtox))) && (fabs(model->BSIM4toxe-(model->BSIM4toxp + model->BSIM4dtox))>chktol))
{ printf("Warning: toxe, toxp and dtox all given and toxe != toxp + dtox; dtox ignored.\n"); { printf("Warning: toxe, toxp and dtox all given and toxe != toxp + dtox; dtox ignored.\n");
} }
else if ((model->BSIM4toxeGiven) && (!model->BSIM4toxpGiven)) else if ((model->BSIM4toxeGiven) && (!model->BSIM4toxpGiven))
@ -1368,10 +1372,11 @@ int Fatal_Flag = 0;
pParam->BSIM4Aechvb = (model->BSIM4type == NMOS) ? 4.97232e-7 : 3.42537e-7; pParam->BSIM4Aechvb = (model->BSIM4type == NMOS) ? 4.97232e-7 : 3.42537e-7;
pParam->BSIM4Bechvb = (model->BSIM4type == NMOS) ? 7.45669e11 : 1.16645e12; pParam->BSIM4Bechvb = (model->BSIM4type == NMOS) ? 7.45669e11 : 1.16645e12;
if ((strcmp(model->BSIM4version, "4.8.1")) && (strncmp(model->BSIM4version, "4.81", 4)) && // if ((strcmp(model->BSIM4version, "4.8.1")) && (strncmp(model->BSIM4version, "4.81", 4)) &&
(strcmp(model->BSIM4version, "4.8.2")) && (strncmp(model->BSIM4version, "4.82", 4)) && // (strcmp(model->BSIM4version, "4.8.2")) && (strncmp(model->BSIM4version, "4.82", 4)) &&
(strcmp(model->BSIM4version, "4.8.3")) && (strncmp(model->BSIM4version, "4.83", 4))) // (strcmp(model->BSIM4version, "4.8.3")) && (strncmp(model->BSIM4version, "4.83", 4)))
{ // {
if (model->BSIM4v48intVersion<=BSIM4v48V480) {
pParam->BSIM4AechvbEdgeS = pParam->BSIM4Aechvb * pParam->BSIM4weff pParam->BSIM4AechvbEdgeS = pParam->BSIM4Aechvb * pParam->BSIM4weff
* model->BSIM4dlcig * pParam->BSIM4ToxRatioEdge; * model->BSIM4dlcig * pParam->BSIM4ToxRatioEdge;
pParam->BSIM4AechvbEdgeD = pParam->BSIM4Aechvb * pParam->BSIM4weff pParam->BSIM4AechvbEdgeD = pParam->BSIM4Aechvb * pParam->BSIM4weff

View File

@ -941,7 +941,12 @@ typedef struct sBSIM4model
int BSIM4tempMod; int BSIM4tempMod;
int BSIM4binUnit; int BSIM4binUnit;
int BSIM4paramChk; int BSIM4paramChk;
char *BSIM4version; char *BSIM4version;
int BSIM4v48intVersion;
#define BSIM4v48V483 483 /* BSIM4v48 V4.8.3 */
#define BSIM4v48V482 482 /* BSIM4v48 V4.8.2 */
#define BSIM4v48V481 481 /* BSIM4v48 V4.8.1 */
#define BSIM4v48V480 480 /* BSIM4v48 V4.8.0 */
double BSIM4eot; double BSIM4eot;
double BSIM4vddeot; double BSIM4vddeot;
double BSIM4tempeot; double BSIM4tempeot;