From dc58709a37e004eaac43b96e45accb83db7f7e95 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=81rp=C3=A1d=20B=C5=B1rmen?= Date: Mon, 15 Sep 2025 10:23:11 +0200 Subject: [PATCH] Fixed a bug causing mult_* factors to get scaled at each setup(). --- src/spicelib/devices/bsim4/b4acld.c | 4 +- src/spicelib/devices/bsim4/b4ask.c | 88 ++++++++++++++--------------- src/spicelib/devices/bsim4/b4ld.c | 6 +- src/spicelib/devices/bsim4/b4noi.c | 4 +- src/spicelib/devices/bsim4/b4pzld.c | 4 +- src/spicelib/devices/bsim4/b4set.c | 7 ++- 6 files changed, 57 insertions(+), 56 deletions(-) diff --git a/src/spicelib/devices/bsim4/b4acld.c b/src/spicelib/devices/bsim4/b4acld.c index 18257423c..c972d6866 100644 --- a/src/spicelib/devices/bsim4/b4acld.c +++ b/src/spicelib/devices/bsim4/b4acld.c @@ -462,8 +462,8 @@ double m, mult_i, mult_q; * Loading AC matrix */ m = here->BSIM4m; - mult_i = here->BSIM4mult_i; - mult_q = here->BSIM4mult_q; + mult_i = here->BSIM4mult_i * here->BSIM4m; + mult_q = here->BSIM4mult_q * here->BSIM4m; if (!model->BSIM4rdsMod) { gdpr = here->BSIM4drainConductance; diff --git a/src/spicelib/devices/bsim4/b4ask.c b/src/spicelib/devices/bsim4/b4ask.c index c0f843e95..d43e1a708 100644 --- a/src/spicelib/devices/bsim4/b4ask.c +++ b/src/spicelib/devices/bsim4/b4ask.c @@ -203,11 +203,11 @@ BSIM4instance *here = (BSIM4instance*)inst; return(OK); case BSIM4_SOURCECONDUCT: value->rValue = here->BSIM4sourceConductance; - value->rValue *= here->BSIM4mult_i; + value->rValue *= here->BSIM4mult_i * here->BSIM4m; return(OK); case BSIM4_DRAINCONDUCT: value->rValue = here->BSIM4drainConductance; - value->rValue *= here->BSIM4mult_i; + value->rValue *= here->BSIM4mult_i * here->BSIM4m; return(OK); case BSIM4_VBD: value->rValue = *(ckt->CKTstate0 + here->BSIM4vbd); @@ -223,67 +223,67 @@ BSIM4instance *here = (BSIM4instance*)inst; return(OK); case BSIM4_CD: value->rValue = here->BSIM4cd; - value->rValue *= here->BSIM4mult_i; + value->rValue *= here->BSIM4mult_i * here->BSIM4m; return(OK); case BSIM4_CBS: value->rValue = here->BSIM4cbs; - value->rValue *= here->BSIM4mult_i; + value->rValue *= here->BSIM4mult_i * here->BSIM4m; return(OK); case BSIM4_CBD: value->rValue = here->BSIM4cbd; - value->rValue *= here->BSIM4mult_i; + value->rValue *= here->BSIM4mult_i * here->BSIM4m; return(OK); case BSIM4_CSUB: value->rValue = here->BSIM4csub; - value->rValue *= here->BSIM4mult_i; + value->rValue *= here->BSIM4mult_i * here->BSIM4m; return(OK); case BSIM4_IGIDL: value->rValue = here->BSIM4Igidl; - value->rValue *= here->BSIM4mult_i; + value->rValue *= here->BSIM4mult_i * here->BSIM4m; return(OK); case BSIM4_IGISL: value->rValue = here->BSIM4Igisl; - value->rValue *= here->BSIM4mult_i; + value->rValue *= here->BSIM4mult_i * here->BSIM4m; return(OK); case BSIM4_IGS: value->rValue = here->BSIM4Igs; - value->rValue *= here->BSIM4mult_i; + value->rValue *= here->BSIM4mult_i * here->BSIM4m; return(OK); case BSIM4_IGD: value->rValue = here->BSIM4Igd; - value->rValue *= here->BSIM4mult_i; + value->rValue *= here->BSIM4mult_i * here->BSIM4m; return(OK); case BSIM4_IGB: value->rValue = here->BSIM4Igb; - value->rValue *= here->BSIM4mult_i; + value->rValue *= here->BSIM4mult_i * here->BSIM4m; return(OK); case BSIM4_IGCS: value->rValue = here->BSIM4Igcs; - value->rValue *= here->BSIM4mult_i; + value->rValue *= here->BSIM4mult_i * here->BSIM4m; return(OK); case BSIM4_IGCD: value->rValue = here->BSIM4Igcd; - value->rValue *= here->BSIM4mult_i; + value->rValue *= here->BSIM4mult_i * here->BSIM4m; return(OK); case BSIM4_GM: value->rValue = here->BSIM4gm; - value->rValue *= here->BSIM4mult_i; + value->rValue *= here->BSIM4mult_i * here->BSIM4m; return(OK); case BSIM4_GDS: value->rValue = here->BSIM4gds; - value->rValue *= here->BSIM4mult_i; + value->rValue *= here->BSIM4mult_i * here->BSIM4m; return(OK); case BSIM4_GMBS: value->rValue = here->BSIM4gmbs; - value->rValue *= here->BSIM4mult_i; + value->rValue *= here->BSIM4mult_i * here->BSIM4m; return(OK); case BSIM4_GBD: value->rValue = here->BSIM4gbd; - value->rValue *= here->BSIM4mult_i; + value->rValue *= here->BSIM4mult_i * here->BSIM4m; return(OK); case BSIM4_GBS: value->rValue = here->BSIM4gbs; - value->rValue *= here->BSIM4mult_i; + value->rValue *= here->BSIM4mult_i * here->BSIM4m; return(OK); /* case BSIM4_QB: value->rValue = *(ckt->CKTstate0 + here->BSIM4qb); @@ -308,19 +308,19 @@ BSIM4instance *here = (BSIM4instance*)inst; return(OK); */ case BSIM4_QB: value->rValue = here->BSIM4qbulk; - value->rValue *= here->BSIM4mult_q; + value->rValue *= here->BSIM4mult_q * here->BSIM4m; return(OK); case BSIM4_QG: value->rValue = here->BSIM4qgate; - value->rValue *= here->BSIM4mult_q; + value->rValue *= here->BSIM4mult_q * here->BSIM4m; return(OK); case BSIM4_QS: value->rValue = here->BSIM4qsrc; - value->rValue *= here->BSIM4mult_q; + value->rValue *= here->BSIM4mult_q * here->BSIM4m; return(OK); case BSIM4_QD: value->rValue = here->BSIM4qdrn; - value->rValue *= here->BSIM4mult_q; + value->rValue *= here->BSIM4mult_q * here->BSIM4m; return(OK); case BSIM4_QINV: value->rValue = here->BSIM4qinv; @@ -330,82 +330,82 @@ BSIM4instance *here = (BSIM4instance*)inst; return(OK); case BSIM4_GCRG: value->rValue = here->BSIM4gcrg; - value->rValue *= here->BSIM4mult_i; + value->rValue *= here->BSIM4mult_i * here->BSIM4m; return(OK); case BSIM4_GTAU: value->rValue = here->BSIM4gtau; return(OK); case BSIM4_CGGB: value->rValue = here->BSIM4cggb; - value->rValue *= here->BSIM4mult_q; + value->rValue *= here->BSIM4mult_q * here->BSIM4m; return(OK); case BSIM4_CGDB: value->rValue = here->BSIM4cgdb; - value->rValue *= here->BSIM4mult_q; + value->rValue *= here->BSIM4mult_q * here->BSIM4m; return(OK); case BSIM4_CGSB: value->rValue = here->BSIM4cgsb; - value->rValue *= here->BSIM4mult_q; + value->rValue *= here->BSIM4mult_q * here->BSIM4m; return(OK); case BSIM4_CDGB: value->rValue = here->BSIM4cdgb; - value->rValue *= here->BSIM4mult_q; + value->rValue *= here->BSIM4mult_q * here->BSIM4m; return(OK); case BSIM4_CDDB: value->rValue = here->BSIM4cddb; - value->rValue *= here->BSIM4mult_q; + value->rValue *= here->BSIM4mult_q * here->BSIM4m; return(OK); case BSIM4_CDSB: value->rValue = here->BSIM4cdsb; - value->rValue *= here->BSIM4mult_q; + value->rValue *= here->BSIM4mult_q * here->BSIM4m; return(OK); case BSIM4_CBGB: value->rValue = here->BSIM4cbgb; - value->rValue *= here->BSIM4mult_q; + value->rValue *= here->BSIM4mult_q * here->BSIM4m; return(OK); case BSIM4_CBDB: value->rValue = here->BSIM4cbdb; - value->rValue *= here->BSIM4mult_q; + value->rValue *= here->BSIM4mult_q * here->BSIM4m; return(OK); case BSIM4_CBSB: value->rValue = here->BSIM4cbsb; - value->rValue *= here->BSIM4mult_q; + value->rValue *= here->BSIM4mult_q * here->BSIM4m; return(OK); case BSIM4_CSGB: value->rValue = here->BSIM4csgb; - value->rValue *= here->BSIM4mult_q; + value->rValue *= here->BSIM4mult_q * here->BSIM4m; return(OK); case BSIM4_CSDB: value->rValue = here->BSIM4csdb; - value->rValue *= here->BSIM4mult_q; + value->rValue *= here->BSIM4mult_q * here->BSIM4m; return(OK); case BSIM4_CSSB: value->rValue = here->BSIM4cssb; - value->rValue *= here->BSIM4mult_q; + value->rValue *= here->BSIM4mult_q * here->BSIM4m; return(OK); case BSIM4_CGBB: value->rValue = here->BSIM4cgbb; - value->rValue *= here->BSIM4mult_q; + value->rValue *= here->BSIM4mult_q * here->BSIM4m; return(OK); case BSIM4_CDBB: value->rValue = here->BSIM4cdbb; - value->rValue *= here->BSIM4mult_q; + value->rValue *= here->BSIM4mult_q * here->BSIM4m; return(OK); case BSIM4_CSBB: value->rValue = here->BSIM4csbb; - value->rValue *= here->BSIM4mult_q; + value->rValue *= here->BSIM4mult_q * here->BSIM4m; return(OK); case BSIM4_CBBB: value->rValue = here->BSIM4cbbb; - value->rValue *= here->BSIM4mult_q; + value->rValue *= here->BSIM4mult_q * here->BSIM4m; return(OK); case BSIM4_CAPBD: value->rValue = here->BSIM4capbd; - value->rValue *= here->BSIM4mult_q; + value->rValue *= here->BSIM4mult_q * here->BSIM4m; return(OK); case BSIM4_CAPBS: value->rValue = here->BSIM4capbs; - value->rValue *= here->BSIM4mult_q; + value->rValue *= here->BSIM4mult_q * here->BSIM4m; return(OK); case BSIM4_VON: value->rValue = here->BSIM4von; @@ -427,15 +427,15 @@ BSIM4instance *here = (BSIM4instance*)inst; return(OK); case BSIM4_CGSO: value->rValue = here->BSIM4cgso; - value->rValue *= here->BSIM4mult_q; + value->rValue *= here->BSIM4mult_q * here->BSIM4m; return(OK); case BSIM4_CGDO: value->rValue = here->BSIM4cgdo; - value->rValue *= here->BSIM4mult_q; + value->rValue *= here->BSIM4mult_q * here->BSIM4m; return(OK); case BSIM4_CGBO: value->rValue = here->pParam->BSIM4cgbo; - value->rValue *= here->BSIM4mult_q; + value->rValue *= here->BSIM4mult_q * here->BSIM4m; return(OK); case BSIM4_WEFF: value->rValue = here->pParam->BSIM4weff; diff --git a/src/spicelib/devices/bsim4/b4ld.c b/src/spicelib/devices/bsim4/b4ld.c index da408eaef..5001e12f3 100644 --- a/src/spicelib/devices/bsim4/b4ld.c +++ b/src/spicelib/devices/bsim4/b4ld.c @@ -4986,9 +4986,9 @@ line900: */ m = here->BSIM4m; - mult_i = here->BSIM4mult_i; - mult_q = here->BSIM4mult_q; - + mult_i = here->BSIM4mult_i * here->BSIM4m; + mult_q = here->BSIM4mult_q * here->BSIM4m; + #ifdef USE_OMP here->BSIM4rhsdPrime = (mult_i * (ceqjd - ceqbd + ceqgdtot - ceqdrn + Idtoteq) - mult_q * ceqqd); diff --git a/src/spicelib/devices/bsim4/b4noi.c b/src/spicelib/devices/bsim4/b4noi.c index faea45ab6..d56b19cb2 100644 --- a/src/spicelib/devices/bsim4/b4noi.c +++ b/src/spicelib/devices/bsim4/b4noi.c @@ -155,8 +155,8 @@ double mult_i, mult_fn; } break; case N_CALC: - mult_i = here->BSIM4mult_i; - mult_fn = here->BSIM4mult_fn; + mult_i = here->BSIM4mult_i * here->BSIM4m; + mult_fn = here->BSIM4mult_fn * here->BSIM4m; switch (mode) { case N_DENS: if (model->BSIM4tnoiMod == 0) diff --git a/src/spicelib/devices/bsim4/b4pzld.c b/src/spicelib/devices/bsim4/b4pzld.c index 970f78889..ff66cf13a 100644 --- a/src/spicelib/devices/bsim4/b4pzld.c +++ b/src/spicelib/devices/bsim4/b4pzld.c @@ -494,8 +494,8 @@ double m, mult_i, mult_q; * Loading PZ matrix */ m = here->BSIM4m; - mult_i = here->BSIM4mult_i; - mult_q = here->BSIM4mult_q; + mult_i = here->BSIM4mult_i * here->BSIM4m; + mult_q = here->BSIM4mult_q * here->BSIM4m; if (!model->BSIM4rdsMod) { gdpr = here->BSIM4drainConductance; diff --git a/src/spicelib/devices/bsim4/b4set.c b/src/spicelib/devices/bsim4/b4set.c index 2135ce9a3..56ae72096 100644 --- a/src/spicelib/devices/bsim4/b4set.c +++ b/src/spicelib/devices/bsim4/b4set.c @@ -2375,9 +2375,10 @@ BSIM4instance **InstArray; if (!here->BSIM4ngconGiven) here->BSIM4ngcon = model->BSIM4ngcon; - here->BSIM4mult_i = here->BSIM4mult_i * here->BSIM4m; - here->BSIM4mult_q = here->BSIM4mult_q * here->BSIM4m; - here->BSIM4mult_fn = here->BSIM4mult_fn * here->BSIM4m; + // Recursive scaling produces incorrect results after second call to setup() + // here->BSIM4mult_i = here->BSIM4mult_i * here->BSIM4m; + // here->BSIM4mult_q = here->BSIM4mult_q * here->BSIM4m; + // here->BSIM4mult_fn = here->BSIM4mult_fn * here->BSIM4m; /* Process instance model selectors, some * may override their global counterparts