enable breakdown capability of parallel bulk diode
This commit is contained in:
parent
2bf70fa259
commit
45f52c859b
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue