From 7b1ecb261ba8454ab929d1cea006e8d84bbe38eb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=81rp=C3=A1d=20B=C5=B1rmen?= Date: Wed, 2 Apr 2025 07:54:21 +0200 Subject: [PATCH 1/4] Fixed MOS1 noise scaling. --- src/spicelib/devices/mos1/mos1noi.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/spicelib/devices/mos1/mos1noi.c b/src/spicelib/devices/mos1/mos1noi.c index dcd31a497..7b3f9f696 100644 --- a/src/spicelib/devices/mos1/mos1noi.c +++ b/src/spicelib/devices/mos1/mos1noi.c @@ -145,9 +145,9 @@ MOS1noise(int mode, int operation, GENmodel * genmodel, CKTcircuit * ckt, N_GAIN, inst->MOS1dNodePrime, inst->MOS1sNodePrime, (double) 0.0); if (newcompat.s3) { - noizDens[MOS1FLNOIZ] *= model->MOS1fNcoef * + noizDens[MOS1FLNOIZ] *= inst->MOS1m * model->MOS1fNcoef * exp(model->MOS1fNexp * - log(MAX(fabs(inst->MOS1cd), N_MINLOG))) / + log(MAX(fabs(inst->MOS1cd / inst->MOS1m), N_MINLOG))) / (data->freq * inst->MOS1w * (inst->MOS1l - 2 * model->MOS1latDiff) * @@ -155,18 +155,18 @@ MOS1noise(int mode, int operation, GENmodel * genmodel, CKTcircuit * ckt, } else { switch (model->MOS1nlev) { case 0: - noizDens[MOS1FLNOIZ] *= model->MOS1fNcoef * + noizDens[MOS1FLNOIZ] *= inst->MOS1m * model->MOS1fNcoef * exp(model->MOS1fNexp * - log(MAX(fabs(inst->MOS1cd), N_MINLOG))) / + log(MAX(fabs(inst->MOS1cd / inst->MOS1m), N_MINLOG))) / (data->freq * (inst->MOS1l - 2 * model->MOS1latDiff) * (inst->MOS1l - 2 * model->MOS1latDiff) * sqrt(coxSquared)); break; case 1: - noizDens[MOS1FLNOIZ] *= model->MOS1fNcoef * + noizDens[MOS1FLNOIZ] *= inst->MOS1m * model->MOS1fNcoef * exp(model->MOS1fNexp * - log(MAX(fabs(inst->MOS1cd), N_MINLOG))) / + log(MAX(fabs(inst->MOS1cd / inst->MOS1m), N_MINLOG))) / (data->freq * inst->MOS1w * (inst->MOS1l - 2 * model->MOS1latDiff) * @@ -174,7 +174,7 @@ MOS1noise(int mode, int operation, GENmodel * genmodel, CKTcircuit * ckt, break; case 2: case 3: noizDens[MOS1FLNOIZ] *= model->MOS1fNcoef * - inst->MOS1gm * inst->MOS1gm / + inst->MOS1gm * inst->MOS1gm / inst->MOS1m / (pow(data->freq, model->MOS1fNexp) * inst->MOS1w * (inst->MOS1l - 2 * model->MOS1latDiff) * From 1a175dde2f62770bd2a5cd96053b84bbc3e6e435 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=81rp=C3=A1d=20B=C5=B1rmen?= Date: Thu, 17 Apr 2025 13:49:47 +0200 Subject: [PATCH 2/4] Fixed MOS2 scaling. --- src/spicelib/devices/mos2/mos2load.c | 10 +++++----- src/spicelib/devices/mos2/mos2noi.c | 14 +++++++------- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/spicelib/devices/mos2/mos2load.c b/src/spicelib/devices/mos2/mos2load.c index 161a1641a..c82f927d2 100644 --- a/src/spicelib/devices/mos2/mos2load.c +++ b/src/spicelib/devices/mos2/mos2load.c @@ -34,7 +34,7 @@ MOS2load(GENmodel *inModel, CKTcircuit *ckt) double GateBulkOverlapCap; double GateDrainOverlapCap; double GateSourceOverlapCap; - double OxideCap; + double OxideCap, unscaledOxideCap; double SourceSatCur; double arg; double cbhat; @@ -144,8 +144,8 @@ MOS2load(GENmodel *inModel, CKTcircuit *ckt) here->MOS2m * EffectiveLength; Beta = here->MOS2tTransconductance * here->MOS2w * here->MOS2m/EffectiveLength; - OxideCap = model->MOS2oxideCapFactor * EffectiveLength * - here->MOS2m * here->MOS2w; + unscaledOxideCap = model->MOS2oxideCapFactor * EffectiveLength * here->MOS2w; + OxideCap = unscaledOxideCap*here->MOS2m; if(SenCond){ @@ -599,7 +599,7 @@ next1: if(vbs <= -3*vt) { /*XXX constant per device */ factor = 0.125*model->MOS2narrowFactor*2.0*M_PI*EPSSIL/ - OxideCap*EffectiveLength; + unscaledOxideCap*EffectiveLength; /*XXX constant per device */ eta = 1.0+factor; vbin = here->MOS2tVbi*model->MOS2type+factor*phiMinVbs; @@ -664,7 +664,7 @@ next1: if(vbs <= -3*vt) { 1e4 /*(cm**2/m**2)*/; cdonco = -(gamasd*dsrgdb+dgddvb*sarg1)+factor; - xn = 1.0+cfs/OxideCap*here->MOS2m* + xn = 1.0+cfs/unscaledOxideCap* here->MOS2w*EffectiveLength+cdonco; tmp = vt*xn; diff --git a/src/spicelib/devices/mos2/mos2noi.c b/src/spicelib/devices/mos2/mos2noi.c index 1d208b5d9..fdbecb7f6 100644 --- a/src/spicelib/devices/mos2/mos2noi.c +++ b/src/spicelib/devices/mos2/mos2noi.c @@ -134,9 +134,9 @@ MOS2noise(int mode, int operation, GENmodel * genmodel, CKTcircuit * ckt, N_GAIN, inst->MOS2dNodePrime, inst->MOS2sNodePrime, (double) 0.0); if (newcompat.s3) { - noizDens[MOS2FLNOIZ] *= model->MOS2fNcoef * + noizDens[MOS2FLNOIZ] *= inst->MOS2m * model->MOS2fNcoef * exp(model->MOS2fNexp * - log(MAX(fabs(inst->MOS2cd), N_MINLOG))) / + log(MAX(fabs(inst->MOS2cd / inst->MOS2m), N_MINLOG))) / (data->freq * inst->MOS2w * (inst->MOS2l - 2 * model->MOS2latDiff) * @@ -144,18 +144,18 @@ MOS2noise(int mode, int operation, GENmodel * genmodel, CKTcircuit * ckt, } else { switch (model->MOS2nlev) { case 0: - noizDens[MOS2FLNOIZ] *= model->MOS2fNcoef * + noizDens[MOS2FLNOIZ] *= inst->MOS2m * model->MOS2fNcoef * exp(model->MOS2fNexp * - log(MAX(fabs(inst->MOS2cd), N_MINLOG))) / + log(MAX(fabs(inst->MOS2cd / inst->MOS2m), N_MINLOG))) / (data->freq * (inst->MOS2l - 2 * model->MOS2latDiff) * (inst->MOS2l - 2 * model->MOS2latDiff) * model->MOS2oxideCapFactor); break; case 1: - noizDens[MOS2FLNOIZ] *= model->MOS2fNcoef * + noizDens[MOS2FLNOIZ] *= inst->MOS2m * model->MOS2fNcoef * exp(model->MOS2fNexp * - log(MAX(fabs(inst->MOS2cd), N_MINLOG))) / + log(MAX(fabs(inst->MOS2cd / inst->MOS2m), N_MINLOG))) / (data->freq * inst->MOS2w * (inst->MOS2l - 2 * model->MOS2latDiff) * @@ -163,7 +163,7 @@ MOS2noise(int mode, int operation, GENmodel * genmodel, CKTcircuit * ckt, break; case 2: case 3: noizDens[MOS2FLNOIZ] *= model->MOS2fNcoef * - inst->MOS2gm * inst->MOS2gm / + inst->MOS2gm * inst->MOS2gm / inst->MOS2m / (pow(data->freq, model->MOS2fNexp) * inst->MOS2w * (inst->MOS2l - 2 * model->MOS2latDiff) * From 86467457edf114c209d693539c510de86dd59fe1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=81rp=C3=A1d=20B=C5=B1rmen?= Date: Fri, 18 Apr 2025 13:22:06 +0200 Subject: [PATCH 3/4] Fixed MOS3 scaling. --- src/spicelib/devices/mos3/mos3noi.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/spicelib/devices/mos3/mos3noi.c b/src/spicelib/devices/mos3/mos3noi.c index 4787fa335..65afec9e7 100644 --- a/src/spicelib/devices/mos3/mos3noi.c +++ b/src/spicelib/devices/mos3/mos3noi.c @@ -134,9 +134,9 @@ MOS3noise(int mode, int operation, GENmodel * genmodel, CKTcircuit * ckt, N_GAIN, inst->MOS3dNodePrime, inst->MOS3sNodePrime, (double) 0.0); if (newcompat.s3) { - noizDens[MOS3FLNOIZ] *= model->MOS3fNcoef * + noizDens[MOS3FLNOIZ] *= inst->MOS3m * model->MOS3fNcoef * exp(model->MOS3fNexp * - log(MAX(fabs(inst->MOS3cd), N_MINLOG))) / + log(MAX(fabs(inst->MOS3cd / inst->MOS3m), N_MINLOG))) / (data->freq * (inst->MOS3w - 2 * model->MOS3widthNarrow) * (inst->MOS3l - 2 * model->MOS3latDiff) * @@ -144,18 +144,18 @@ MOS3noise(int mode, int operation, GENmodel * genmodel, CKTcircuit * ckt, } else { switch (model->MOS3nlev) { case 0: - noizDens[MOS3FLNOIZ] *= model->MOS3fNcoef * + noizDens[MOS3FLNOIZ] *= inst->MOS3m * model->MOS3fNcoef * exp(model->MOS3fNexp * - log(MAX(fabs(inst->MOS3cd), N_MINLOG))) / + log(MAX(fabs(inst->MOS3cd / inst->MOS3m), N_MINLOG))) / (data->freq * (inst->MOS3l - 2 * model->MOS3latDiff) * (inst->MOS3l - 2 * model->MOS3latDiff) * model->MOS3oxideCapFactor); break; case 1: - noizDens[MOS3FLNOIZ] *= model->MOS3fNcoef * + noizDens[MOS3FLNOIZ] *= inst->MOS3m * model->MOS3fNcoef * exp(model->MOS3fNexp * - log(MAX(fabs(inst->MOS3cd), N_MINLOG))) / + log(MAX(fabs(inst->MOS3cd / inst->MOS3m), N_MINLOG))) / (data->freq * (inst->MOS3w - 2 * model->MOS3widthNarrow) * (inst->MOS3l - 2 * model->MOS3latDiff) * @@ -163,7 +163,7 @@ MOS3noise(int mode, int operation, GENmodel * genmodel, CKTcircuit * ckt, break; case 2: case 3: noizDens[MOS3FLNOIZ] *= model->MOS3fNcoef * - inst->MOS3gm * inst->MOS3gm / + inst->MOS3gm * inst->MOS3gm / inst->MOS3m / (pow(data->freq, model->MOS3fNexp) * (inst->MOS3w - 2 * model->MOS3widthNarrow) * (inst->MOS3l - 2 * model->MOS3latDiff) * From 8da323b5020c9ea63415868d555b2d6d49ba9720 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=81rp=C3=A1d=20B=C5=B1rmen?= Date: Wed, 23 Apr 2025 14:04:06 +0200 Subject: [PATCH 4/4] Fixed MOS9 scaling. --- src/spicelib/devices/mos9/mos9noi.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/spicelib/devices/mos9/mos9noi.c b/src/spicelib/devices/mos9/mos9noi.c index 69f9bfd80..63dbe3146 100644 --- a/src/spicelib/devices/mos9/mos9noi.c +++ b/src/spicelib/devices/mos9/mos9noi.c @@ -94,12 +94,11 @@ MOS9noise (int mode, int operation, GENmodel *genmodel, CKTcircuit *ckt, NevalSrc(&noizDens[MOS9FLNOIZ], NULL, ckt, N_GAIN,inst->MOS9dNodePrime, inst->MOS9sNodePrime, (double)0.0); - noizDens[MOS9FLNOIZ] *= model->MOS9fNcoef * + noizDens[MOS9FLNOIZ] *= inst->MOS9m * model->MOS9fNcoef * exp(model->MOS9fNexp * - log(MAX(fabs(inst->MOS9cd),N_MINLOG))) / + log(MAX(fabs(inst->MOS9cd / inst->MOS9m),N_MINLOG))) / (data->freq * (inst->MOS9w - 2*model->MOS9widthNarrow) * - inst->MOS9m * (inst->MOS9l - 2*model->MOS9latDiff) * model->MOS9oxideCapFactor * model->MOS9oxideCapFactor); lnNdens[MOS9FLNOIZ] =