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] 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) *