sub-coll junction calculation only if ISS given

This commit is contained in:
dwarning 2021-05-05 22:53:39 +02:00 committed by Holger Vogt
parent 3a908c76ef
commit 6bafdf70d5
2 changed files with 32 additions and 25 deletions

View File

@ -434,8 +434,13 @@ BJTload(GENmodel *inModel, CKTcircuit *ckt)
vbc = DEVpnjlim(vbc,*(ckt->CKTstate0 + here->BJTvbc),vt,
here->BJTtVcrit,&ichk1);
if (ichk1 == 1) icheck=1;
vsub = DEVpnjlim(vsub,*(ckt->CKTstate0 + here->BJTvsub),vt,
here->BJTtSubVcrit,&ichk1);
if (model->BJTsubSatCurGiven) {
vsub = DEVpnjlim(vsub,*(ckt->CKTstate0 + here->BJTvsub),vt,
here->BJTtSubVcrit,&ichk1);
} else {
vsub = DEVpnjlim(vsub,*(ckt->CKTstate0 + here->BJTvsub),vt,
50,&ichk1);
}
if (ichk1 == 1) icheck=1;
vrci = vbc - vbcx; /* in case vbc was limited */
}
@ -502,19 +507,22 @@ next1: vtn=vt*here->BJTtemissionCoeffF;
gbcn+=ckt->CKTgmin;
cbcn+=ckt->CKTgmin*vbc;
vts=vt*here->BJTtemissionCoeffS;
if(vsub <= -3*vts) {
arg=3*vts/(vsub*CONSTe);
arg = arg * arg * arg;
gdsub = csubsat*3*arg/vsub+ckt->CKTgmin;
cdsub = -csubsat*(1+arg)+ckt->CKTgmin*vsub;
if (model->BJTsubSatCurGiven) {
vts=vt*here->BJTtemissionCoeffS;
if(vsub <= -3*vts) {
arg=3*vts/(vsub*CONSTe);
arg = arg * arg * arg;
gdsub = csubsat*3*arg/vsub+ckt->CKTgmin;
cdsub = -csubsat*(1+arg)+ckt->CKTgmin*vsub;
} else {
evsub = exp(MIN(MAX_EXP_ARG,vsub/vts));
gdsub = csubsat*evsub/vts + ckt->CKTgmin;
cdsub = csubsat*(evsub-1) + ckt->CKTgmin*vsub;
}
} else {
evsub = exp(MIN(MAX_EXP_ARG,vsub/vts));
gdsub = csubsat*evsub/vts + ckt->CKTgmin;
cdsub = csubsat*(evsub-1) + ckt->CKTgmin*vsub;
gdsub = ckt->CKTgmin;
cdsub = ckt->CKTgmin*vsub;
}
/*
* Kull's Quasi-Saturation model
*/

View File

@ -170,12 +170,14 @@ BJTtemp(GENmodel *inModel, CKTcircuit *ckt)
factlog = ratio1 * model->BJTenergyGap/vt +
model->BJTtempExpIS*ratlog;
if ((model->BJTtlev == 0) || (model->BJTtlev == 1)) {
factor = exp(factlog);
here->BJTtSatCur = model->BJTsatCur * factor;
here->BJTtSubSatCur = model->BJTsubSatCur * factor;
factor = exp(factlog);
here->BJTtSatCur = model->BJTsatCur * factor;
if (model->BJTsubSatCurGiven)
here->BJTtSubSatCur = model->BJTsubSatCur * factor;
} else if (model->BJTtlev == 3) {
here->BJTtSatCur = pow(model->BJTsatCur,(1+model->BJTtis1*dt+model->BJTtis2*dt*dt));
here->BJTtSubSatCur = pow(model->BJTsubSatCur,(1+model->BJTtiss1*dt+model->BJTtiss2*dt*dt));
here->BJTtSatCur = pow(model->BJTsatCur,(1+model->BJTtis1*dt+model->BJTtis2*dt*dt));
if (model->BJTsubSatCurGiven)
here->BJTtSubSatCur = pow(model->BJTsubSatCur,(1+model->BJTtiss1*dt+model->BJTtiss2*dt*dt));
}
if (model->BJTintCollResistGiven) {
@ -230,7 +232,7 @@ BJTtemp(GENmodel *inModel, CKTcircuit *ckt)
(4e-4*(here->BJTtemp-REFTEMP)-gmanew);
} else if (model->BJTtlevc == 1) {
here->BJTtBEcap = model->BJTdepletionCapBE*
(1+model->BJTcte*dt);
(1+model->BJTcte*dt);
here->BJTtBEpot = model->BJTpotentialBE - model->BJTtvje*dt;
}
if (model->BJTtlevc == 0) {
@ -245,7 +247,7 @@ BJTtemp(GENmodel *inModel, CKTcircuit *ckt)
(4e-4*(here->BJTtemp-REFTEMP)-gmanew);
} else if (model->BJTtlevc == 1) {
here->BJTtBCcap = model->BJTdepletionCapBC*
(1+model->BJTctc*dt);
(1+model->BJTctc*dt);
here->BJTtBCpot = model->BJTpotentialBC - model->BJTtvjc*dt;
}
if (model->BJTtlevc == 0) {
@ -260,7 +262,7 @@ BJTtemp(GENmodel *inModel, CKTcircuit *ckt)
(4e-4*(here->BJTtemp-REFTEMP)-gmanew);
} else if (model->BJTtlevc == 1) {
here->BJTtSubcap = model->BJTcapSub*
(1+model->BJTcts*dt);
(1+model->BJTcts*dt);
here->BJTtSubpot = model->BJTpotentialSubstrate - model->BJTtvjs*dt;
}
@ -274,12 +276,9 @@ BJTtemp(GENmodel *inModel, CKTcircuit *ckt)
(1 - here->BJTtjunctionExpBC);
here->BJTtVcrit = vt *
log(vt / (CONSTroot2*here->BJTtSatCur*here->BJTarea));
if(model->BJTsubSatCurGiven) {
if (model->BJTsubSatCurGiven)
here->BJTtSubVcrit = vt *
log(vt / (CONSTroot2*here->BJTtSubSatCur*here->BJTarea));
} else {
here->BJTtSubVcrit = here->BJTtVcrit;
}
here->BJTtf2 = exp((1 + here->BJTtjunctionExpBE) * xfc);
here->BJTtf3 = 1 - model->BJTdepletionCapCoeff *
(1 + here->BJTtjunctionExpBE);