Browse Source

VDMOS separate dc and thermal parts

pre-master-46
dwarning 6 years ago
committed by Holger Vogt
parent
commit
034f415621
  1. 17
      src/spicelib/devices/vdmos/vdmosload.c

17
src/spicelib/devices/vdmos/vdmosload.c

@ -110,8 +110,6 @@ VDMOSload(GENmodel *inModel, CKTcircuit *ckt)
else else
Check_th = 0; Check_th = 0;
vt = CONSTKoverQ * here->VDMOStemp;
/* first, we compute a few useful values - these could be /* first, we compute a few useful values - these could be
* pre-computed, but for historical reasons are still done * pre-computed, but for historical reasons are still done
* here. They may be moved at the expense of instance size * here. They may be moved at the expense of instance size
@ -142,7 +140,7 @@ VDMOSload(GENmodel *inModel, CKTcircuit *ckt)
vds = 0.0; vds = 0.0;
} }
} else if ((ckt->CKTmode & (MODEINITJCT | MODEINITFIX)) && (here->VDMOSoff)) { } else if ((ckt->CKTmode & (MODEINITJCT | MODEINITFIX)) && (here->VDMOSoff)) {
delTemp = vgs = vds = 0.0;
vgs = vds = delTemp = 0.0;
/* /*
* ok - now to do the start-up operations * ok - now to do the start-up operations
@ -307,7 +305,7 @@ VDMOSload(GENmodel *inModel, CKTcircuit *ckt)
} }
Temp = delTemp + here->VDMOStemp;
Temp = here->VDMOStemp + delTemp;
here->VDMOSTempSH = Temp; /* added for portability of SH Temp for noise analysis */ here->VDMOSTempSH = Temp; /* added for portability of SH Temp for noise analysis */
/* Calculate temperature dependent values for self-heating effect */ /* Calculate temperature dependent values for self-heating effect */
@ -594,21 +592,21 @@ bypass:
xnrm = 1; xnrm = 1;
xrev = 0; xrev = 0;
cdreq = model->VDMOStype*(cdrain - here->VDMOSgds*vds cdreq = model->VDMOStype*(cdrain - here->VDMOSgds*vds
- here->VDMOSgm*vgs)
- GmT * delTemp;
- here->VDMOSgm*vgs);
} else { } else {
xnrm = 0; xnrm = 0;
xrev = 1; xrev = 1;
cdreq = -(model->VDMOStype)*(cdrain - here->VDMOSgds*(-vds) cdreq = -(model->VDMOStype)*(cdrain - here->VDMOSgds*(-vds)
- here->VDMOSgm*vgd)
- GmT * delTemp;
- here->VDMOSgm*vgd);
} }
*(ckt->CKTrhs + here->VDMOSgNodePrime) -= (model->VDMOStype * (ceqgs + ceqgd)); *(ckt->CKTrhs + here->VDMOSgNodePrime) -= (model->VDMOStype * (ceqgs + ceqgd));
*(ckt->CKTrhs + here->VDMOSdNodePrime) += (-cdreq + model->VDMOStype * ceqgd); *(ckt->CKTrhs + here->VDMOSdNodePrime) += (-cdreq + model->VDMOStype * ceqgd);
*(ckt->CKTrhs + here->VDMOSsNodePrime) += cdreq + model->VDMOStype * ceqgs; *(ckt->CKTrhs + here->VDMOSsNodePrime) += cdreq + model->VDMOStype * ceqgs;
if (selfheat) { if (selfheat) {
*(ckt->CKTrhs + here->VDMOStempNode) -= here->VDMOScth + ceqqth; /* dissipated power + Cthj current */
*(ckt->CKTrhs + here->VDMOSdNodePrime) += GmT * delTemp;
*(ckt->CKTrhs + here->VDMOSsNodePrime) += -GmT * delTemp;
*(ckt->CKTrhs + here->VDMOStempNode) -= here->VDMOScth + ceqqth; /* MOS dissipated power + Cthj current */
*(ckt->CKTrhs + here->VDMOSvcktTbranch) = ckt->CKTtemp-CONSTCtoK; /* ckt temperature */ *(ckt->CKTrhs + here->VDMOSvcktTbranch) = ckt->CKTtemp-CONSTCtoK; /* ckt temperature */
} }
@ -686,6 +684,7 @@ bypass:
gdb = 0.0; gdb = 0.0;
csat = here->VDIOtSatCur; csat = here->VDIOtSatCur;
gspr = here->VDIOtConductance; gspr = here->VDIOtConductance;
vt = CONSTKoverQ * Temp;
vte = model->VDMOSn * vt; vte = model->VDMOSn * vt;
vtebrk = model->VDIObrkdEmissionCoeff * vt; vtebrk = model->VDIObrkdEmissionCoeff * vt;
vbrknp = here->VDIOtBrkdwnV; vbrknp = here->VDIOtBrkdwnV;

Loading…
Cancel
Save