enable breakdown capability of parallel bulk diode

This commit is contained in:
Holger Vogt 2018-04-09 15:33:34 +02:00 committed by rlar
parent 2bf70fa259
commit 45f52c859b
1 changed files with 23 additions and 23 deletions

View File

@ -159,6 +159,7 @@ VDMOSload(GENmodel *inModel, CKTcircuit *ckt)
/* now some common crunching for some more useful quantities */
vbs = 0;
vbd = vbs - vds;
vgd = vgs - vds;
vgdo = *(ckt->CKTstate0 + here->VDMOSvgs) -
@ -319,7 +320,7 @@ VDMOSload(GENmodel *inModel, CKTcircuit *ckt)
((ckt->CKTmode &
(MODETRAN | MODEDCOP | MODEDCTRANCURVE)) ||
(!(ckt->CKTmode & MODEUIC)))) {
vbs = -1;
vbs = 0;
vgs = model->VDMOStype * here->VDMOStVto;
vds = 0;
}
@ -666,7 +667,7 @@ VDMOSload(GENmodel *inModel, CKTcircuit *ckt)
double vd; /* current diode voltage */
double vdtemp;
double vte;
double vtebrk;
double vtebrk, vbrknp;
double cd, cdb, csat, cdeq;
double czero;
double czof2;
@ -687,6 +688,7 @@ VDMOSload(GENmodel *inModel, CKTcircuit *ckt)
gspr = here->VDIOtConductance;
vte = model->VDMOSDn * vt;
vtebrk = model->VDIObrkdEmissionCoeff * vt;
vbrknp = model->VDMOStype * here->VDIOtBrkdwnV;
Check = 1;
if (ckt->CKTmode & MODEINITSMSIG) {
@ -715,8 +717,8 @@ VDMOSload(GENmodel *inModel, CKTcircuit *ckt)
}
else {
#endif /* PREDICTOR */
vd = *(ckt->CKTrhsOld + here->VDIOposPrimeNode) -
*(ckt->CKTrhsOld + here->VDMOSdNode);
vd = model->VDMOStype * (*(ckt->CKTrhsOld + here->VDIOposPrimeNode) -
*(ckt->CKTrhsOld + here->VDMOSdNode));
#ifndef PREDICTOR
}
#endif /* PREDICTOR */
@ -748,13 +750,13 @@ VDMOSload(GENmodel *inModel, CKTcircuit *ckt)
* limit new junction voltage
*/
if ((model->VDMOSDbvGiven) &&
(vd < MIN(0, -here->VDIOtBrkdwnV + 10 * vtebrk))) {
vdtemp = -(vd + here->VDIOtBrkdwnV);
(vd < MIN(0, -vbrknp + 10 * vtebrk))) {
vdtemp = -(vd + vbrknp);
vdtemp = DEVpnjlim(vdtemp,
-(*(ckt->CKTstate0 + here->VDIOvoltage) +
here->VDIOtBrkdwnV), vtebrk,
vbrknp), vtebrk,
here->VDIOtVcrit, &Check);
vd = -(vdtemp + here->VDIOtBrkdwnV);
vd = -(vdtemp + vbrknp);
}
else {
vd = DEVpnjlim(vd, *(ckt->CKTstate0 + here->VDIOvoltage),
@ -772,7 +774,7 @@ VDMOSload(GENmodel *inModel, CKTcircuit *ckt)
}
else if ((!(model->VDMOSDbvGiven)) ||
vd >= -here->VDIOtBrkdwnV) { /* reverse */
vd >= -vbrknp) { /* reverse */
arg = 3 * vte / (vd*CONSTe);
arg = arg * arg * arg;
@ -782,7 +784,7 @@ VDMOSload(GENmodel *inModel, CKTcircuit *ckt)
}
else { /* breakdown */
evrev = exp(-(here->VDIOtBrkdwnV + vd) / vtebrk);
evrev = exp(-(vbrknp + vd) / vtebrk);
cdb = -csat*evrev;
gdb = csat*evrev / vtebrk;
@ -866,32 +868,30 @@ VDMOSload(GENmodel *inModel, CKTcircuit *ckt)
*(ckt->CKTstate0 + here->VDIOconduct) = gd;
#ifndef NOBYPASS
load :
load :
#endif
/*
* load current vector
*/
cdeq = cd - gd*vd;
*(ckt->CKTrhs + here->VDMOSdNode) += cdeq;
*(ckt->CKTrhs + here->VDIOposPrimeNode) -= cdeq;
if (model->VDMOStype == 1) {
*(ckt->CKTrhs + here->VDMOSdNode) += cdeq;
*(ckt->CKTrhs + here->VDIOposPrimeNode) -= cdeq;
}
else {
*(ckt->CKTrhs + here->VDMOSdNode) -= cdeq;
*(ckt->CKTrhs + here->VDIOposPrimeNode) += cdeq;
}
/*
* load matrix
*/
/*
*(here->DIOposPosPtr) += gspr;
*(here->DIOnegNegPtr) += gd;
*(here->DIOposPrimePosPrimePtr) += (gd + gspr);
*(here->DIOposPosPrimePtr) -= gspr;
*(here->DIOnegPosPrimePtr) -= gd;
*(here->DIOposPrimePosPtr) -= gspr;
*(here->DIOposPrimeNegPtr) -= gd;
*/
*(here->VDMOSSsPtr) += gspr;
*(here->VDMOSDdPtr) += gd;
*(here->VDIORPrpPtr) += (gd + gspr);
*(here->VDIOSrpPtr) -= gspr;
*(here->VDIODrpPtr) -= gd;
*(here->VDIOSrpPtr) -= gspr;
*(here->VDIORPsPtr) -= gspr;
*(here->VDIORPdPtr) -= gd;
}
}