From 8d26e8b2cb734b2ae39405f9d6355d5b9f7688cb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=81rp=C3=A1d=20B=C5=B1rmen?= Date: Thu, 13 Nov 2025 15:31:40 +0100 Subject: [PATCH] VDMOS scaling fixed. --- src/spicelib/devices/vdmos/vdmosacld.c | 6 ++++-- src/spicelib/devices/vdmos/vdmosload.c | 13 ++++++++----- src/spicelib/devices/vdmos/vdmosnoi.c | 5 +++-- 3 files changed, 15 insertions(+), 9 deletions(-) diff --git a/src/spicelib/devices/vdmos/vdmosacld.c b/src/spicelib/devices/vdmos/vdmosacld.c index 5e5315611..4a4826994 100644 --- a/src/spicelib/devices/vdmos/vdmosacld.c +++ b/src/spicelib/devices/vdmos/vdmosacld.c @@ -48,7 +48,8 @@ VDMOSacLoad(GENmodel *inModel, CKTcircuit *ckt) GmT = model->VDMOStype * here->VDMOSgmT; cgT = model->VDMOStype * here->VDMOScgT; cdT = model->VDMOStype * here->VDMOScdT; - cTt = model->VDMOScthj; + // Everything is computed for m parallel instances... so scale cthj accordingly + cTt = here->VDMOSm * model->VDMOScthj; gTtg = here->VDMOSgtempg; gTtdp = here->VDMOSgtempd; gTtt = here->VDMOSgtempT; @@ -57,7 +58,8 @@ VDMOSacLoad(GENmodel *inModel, CKTcircuit *ckt) GmT = -model->VDMOStype * here->VDMOSgmT; cgT = -model->VDMOStype * here->VDMOScgT; cdT = -model->VDMOStype * here->VDMOScdT; - cTt = -model->VDMOScthj; + // Everything is computed for m parallel instances... so scale cthj accordingly + cTt = - here->VDMOSm * model->VDMOScthj; gTtg = -here->VDMOSgtempg; gTtdp = -here->VDMOSgtempd; gTtt = -here->VDMOSgtempT; diff --git a/src/spicelib/devices/vdmos/vdmosload.c b/src/spicelib/devices/vdmos/vdmosload.c index fd464fd20..ac15a251b 100644 --- a/src/spicelib/devices/vdmos/vdmosload.c +++ b/src/spicelib/devices/vdmos/vdmosload.c @@ -462,10 +462,12 @@ VDMOSload(GENmodel *inModel, CKTcircuit *ckt) * you must add in the other half from previous time * and the constant part */ - DevCapVDMOS(vgd, cgdmin, cgdmax, a, cgs, + // Everything is computed for m parallel instances... scale ggdmin, cgdmax, and cgs accordingly + DevCapVDMOS(vgd, here->VDMOSm*cgdmin, here->VDMOSm*cgdmax, a, here->VDMOSm*cgs, (ckt->CKTstate0 + here->VDMOScapgs), (ckt->CKTstate0 + here->VDMOScapgd)); - *(ckt->CKTstate0 + here->VDMOScapth) = model->VDMOScthj; /* always constant */ + // Everything is computed for m parallel instances... so scale cthj accordingly + *(ckt->CKTstate0 + here->VDMOScapth) = here->VDMOSm * model->VDMOScthj; /* always constant */ vgs1 = *(ckt->CKTstate1 + here->VDMOSvgs); vgd1 = vgs1 - *(ckt->CKTstate1 + here->VDMOSvds); @@ -604,7 +606,7 @@ bypass: vCktTemp *= ckt->CKTsrcFact; *(ckt->CKTrhs + here->VDMOSvcktTbranch)+= vCktTemp; } - + /* * load y matrix */ @@ -639,8 +641,9 @@ bypass: if (selfheat) { - double gthjc = 1/model->VDMOSrthjc; - double gthca = 1/model->VDMOSrthca; + // Everything is computed for m parallel instances... so scale gthjc and gthja accordingly + double gthjc = here->VDMOSm / model->VDMOSrthjc; + double gthca = here->VDMOSm / model->VDMOSrthca; (*(here->VDMOSDtempPtr) += dIrd_dT); (*(here->VDMOSDPtempPtr) += GmT - dIrd_dT); (*(here->VDMOSSPtempPtr) += -GmT); diff --git a/src/spicelib/devices/vdmos/vdmosnoi.c b/src/spicelib/devices/vdmos/vdmosnoi.c index 273d4f34e..8896bd54d 100644 --- a/src/spicelib/devices/vdmos/vdmosnoi.c +++ b/src/spicelib/devices/vdmos/vdmosnoi.c @@ -110,11 +110,12 @@ VDMOSnoise (int mode, int operation, GENmodel *genmodel, CKTcircuit *ckt, NevalSrc(&noizDens[VDMOSFLNOIZ], NULL, ckt, N_GAIN,inst->VDMOSdNodePrime, inst->VDMOSsNodePrime, (double)0.0); + // VDMOScd is scaled with m, no need to scale coxSquared (which is a constant) + // Should be proportional to m noizDens[VDMOSFLNOIZ] *= model->VDMOSfNcoef * exp(model->VDMOSfNexp * log(MAX(fabs(inst->VDMOScd),N_MINLOG))) / - (data->freq * - inst->VDMOSm * coxSquared); + (data->freq * coxSquared); lnNdens[VDMOSFLNOIZ] = log(MAX(noizDens[VDMOSFLNOIZ],N_MINLOG));