VDMOS scaling fixed.

This commit is contained in:
Árpád Bűrmen 2025-11-13 15:31:40 +01:00
parent 807ff2b90c
commit 8d26e8b2cb
3 changed files with 15 additions and 9 deletions

View File

@ -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;

View File

@ -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);

View File

@ -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));