save few calculation effort in bjt load routine

This commit is contained in:
dwarning 2021-10-17 16:56:19 +02:00 committed by Holger Vogt
parent 133f9c46e7
commit 62242a5538
7 changed files with 104 additions and 123 deletions

View File

@ -44,8 +44,8 @@ BJTacLoad(GENmodel *inModel, CKTcircuit *ckt)
m = here->BJTm;
gcpr=here->BJTtcollectorConduct * here->BJTarea;
gepr=here->BJTtemitterConduct * here->BJTarea;
gcpr=here->BJTtcollectorConduct;
gepr=here->BJTtemitterConduct;
gpi= *(ckt->CKTstate0 + here->BJTgpi);
gmu= *(ckt->CKTstate0 + here->BJTgmu);
gm= *(ckt->CKTstate0 + here->BJTgm);

View File

@ -153,21 +153,17 @@ int BJTdSetup(GENmodel *inModel, CKTcircuit *ckt)
/*
* dc model paramters
*/
csatbe=here->BJTBEtSatCur*here->BJTarea * here->BJTm;
csatbc=here->BJTBCtSatCur*here->BJTarea * here->BJTm;
rbpr=here->BJTtminBaseResist/(here->BJTarea * here->BJTm);
rbpi=here->BJTtbaseResist/(here->BJTarea * here->BJTm)-rbpr;
oik=here->BJTtinvRollOffF/(here->BJTarea * here->BJTm);
c2=here->BJTtBEleakCur*here->BJTarea * here->BJTm;
csatbe=here->BJTBEtSatCur * here->BJTm;
csatbc=here->BJTBCtSatCur * here->BJTm;
rbpr=here->BJTtminBaseResist/here->BJTm;
rbpi=here->BJTtbaseResist/here->BJTm-rbpr;
oik=here->BJTtinvRollOffF/here->BJTm;
c2=here->BJTtBEleakCur * here->BJTm;
vte=here->BJTtleakBEemissionCoeff*vt;
oikr=here->BJTtinvRollOffR/(here->BJTarea * here->BJTm);
oikr=here->BJTtinvRollOffR/here->BJTm;
c4=here->BJTtBCleakCur * here->BJTm;
if (model->BJTsubs == VERTICAL)
c4 *= here->BJTareab;
else
c4 *= here->BJTareac; /* lateral transistor */
vtc=here->BJTtleakBCemissionCoeff*vt;
xjrb=here->BJTtbaseCurrentHalfResist*here->BJTarea * here->BJTm;
xjrb=here->BJTtbaseCurrentHalfResist * here->BJTm;
/*
@ -488,25 +484,17 @@ int BJTdSetup(GENmodel *inModel, CKTcircuit *ckt)
xme=here->BJTtjunctionExpBE;
cdis=model->BJTbaseFractionBCcap;
ctot=here->BJTtBCcap * here->BJTm;
if (model->BJTsubs == VERTICAL)
ctot *= here->BJTareab;
else
ctot *= here->BJTareac;
czbc=ctot*cdis;
czbx=ctot-czbc;
pc=here->BJTtBCpot;
xmc=here->BJTtjunctionExpBC;
fcpe=here->BJTtDepCap;
czcs=model->BJTcapSub * here->BJTm;
if (model->BJTsubs == VERTICAL)
czcs *= here->BJTareac;
else
czcs *= here->BJTareab;
czcs=here->BJTtSubcap * here->BJTm;
ps=model->BJTpotentialSubstrate;
xms=model->BJTexponentialSubstrate;
xtf=model->BJTtransitTimeBiasCoeffF;
ovtf=model->BJTtransitTimeVBCFactor;
xjtf=here->BJTttransitTimeHighCurrentF*here->BJTarea * here->BJTm;
xjtf=here->BJTttransitTimeHighCurrentF * here->BJTm;
if(tf != 0 && vbe >0) {
EqualDeriv(&d_cbe, &d_p);
d_cbe.value = cbe;

View File

@ -31,8 +31,6 @@ BJTload(GENmodel *inModel, CKTcircuit *ckt)
double arg3;
double arg;
double argtf;
double c2;
double c4;
double capbc;
double capbe;
double capbx=0;
@ -53,8 +51,6 @@ BJTload(GENmodel *inModel, CKTcircuit *ckt)
double geqsub;
double ceqsub;
double cex;
double csatbe, csatbc;
double csubsat;
double ctot;
double czbc;
double czbcf2;
@ -83,8 +79,6 @@ BJTload(GENmodel *inModel, CKTcircuit *ckt)
double gbe;
double gben;
double gcsub;
double gcpr;
double gepr;
double geq;
double geqbx;
double geqcb;
@ -94,8 +88,6 @@ BJTload(GENmodel *inModel, CKTcircuit *ckt)
double go;
double gpi;
double gx;
double oik;
double oikr;
double ovtf;
double pc;
double pe;
@ -104,10 +96,8 @@ BJTload(GENmodel *inModel, CKTcircuit *ckt)
double q2;
double qb;
double rbpi;
double rbpr;
double sarg;
double sqarg;
double td;
double temp;
double tf;
double tr;
@ -125,7 +115,6 @@ BJTload(GENmodel *inModel, CKTcircuit *ckt)
#ifndef PREDICTOR
double xfact;
#endif
double xjrb;
double xjtf;
double xmc;
double xme;
@ -172,26 +161,9 @@ BJTload(GENmodel *inModel, CKTcircuit *ckt)
/*
* dc model paramters
*/
csatbe=here->BJTBEtSatCur*here->BJTarea;
if (model->BJTsubs == VERTICAL) {
csatbc=here->BJTBCtSatCur * here->BJTareab;
c4=here->BJTtBCleakCur * here->BJTareab;
} else {
csatbc=here->BJTBCtSatCur * here->BJTareac;
c4=here->BJTtBCleakCur * here->BJTareac;
}
csubsat=here->BJTtSubSatCur*here->BJTarea;
rbpr=here->BJTtminBaseResist/here->BJTarea;
rbpi=here->BJTtbaseResist/here->BJTarea-rbpr;
gcpr=here->BJTtcollectorConduct*here->BJTarea;
gepr=here->BJTtemitterConduct*here->BJTarea;
oik=here->BJTtinvRollOffF/here->BJTarea;
c2=here->BJTtBEleakCur*here->BJTarea;
rbpi=here->BJTtbaseResist-here->BJTtminBaseResist;
vte=here->BJTtleakBEemissionCoeff*vt;
oikr=here->BJTtinvRollOffR/here->BJTarea;
vtc=here->BJTtleakBCemissionCoeff*vt;
td=model->BJTexcessPhaseFactor;
xjrb=here->BJTtbaseCurrentHalfResist*here->BJTarea;
if(SenCond){
#ifdef SENSDEBUG
@ -454,27 +426,27 @@ next1: vtn=vt*here->BJTtemissionCoeffF;
if(vbe >= -3*vtn){
evbe=exp(vbe/vtn);
cbe=csatbe*(evbe-1);
gbe=csatbe*evbe/vtn;
cbe=here->BJTBEtSatCur*(evbe-1);
gbe=here->BJTBEtSatCur*evbe/vtn;
} else {
arg=3*vtn/(vbe*CONSTe);
arg = arg * arg * arg;
cbe = -csatbe*(1+arg);
gbe = csatbe*3*arg/vbe;
cbe = -here->BJTBEtSatCur*(1+arg);
gbe = here->BJTBEtSatCur*3*arg/vbe;
}
if (c2 == 0) {
if (here->BJTtBEleakCur == 0) {
cben=0;
gben=0;
} else {
if(vbe >= -3*vte){
evben=exp(vbe/vte);
cben=c2*(evben-1);
gben=c2*evben/vte;
cben=here->BJTtBEleakCur*(evben-1);
gben=here->BJTtBEleakCur*evben/vte;
} else {
arg=3*vte/(vbe*CONSTe);
arg = arg * arg * arg;
cben = -c2*(1+arg);
gben = c2*3*arg/vbe;
cben = -here->BJTtBEleakCur*(1+arg);
gben = here->BJTtBEleakCur*3*arg/vbe;
}
}
gben+=ckt->CKTgmin;
@ -484,27 +456,27 @@ next1: vtn=vt*here->BJTtemissionCoeffF;
if(vbc >= -3*vtn) {
evbc=exp(vbc/vtn);
cbc=csatbc*(evbc-1);
gbc=csatbc*evbc/vtn;
cbc=here->BJTBCtSatCur*(evbc-1);
gbc=here->BJTBCtSatCur*evbc/vtn;
} else {
arg=3*vtn/(vbc*CONSTe);
arg = arg * arg * arg;
cbc = -csatbc*(1+arg);
gbc = csatbc*3*arg/vbc;
cbc = -here->BJTBCtSatCur*(1+arg);
gbc = here->BJTBCtSatCur*3*arg/vbc;
}
if (c4 == 0) {
if (here->BJTtBCleakCur == 0) {
cbcn=0;
gbcn=0;
} else {
if(vbc >= -3*vtc) {
evbcn=exp(vbc/vtc);
cbcn=c4*(evbcn-1);
gbcn=c4*evbcn/vtc;
cbcn=here->BJTtBCleakCur*(evbcn-1);
gbcn=here->BJTtBCleakCur*evbcn/vtc;
} else {
arg=3*vtc/(vbc*CONSTe);
arg = arg * arg * arg;
cbcn = -c4*(1+arg);
gbcn = c4*3*arg/vbc;
cbcn = -here->BJTtBCleakCur*(1+arg);
gbcn = here->BJTtBCleakCur*3*arg/vbc;
}
}
gbcn+=ckt->CKTgmin;
@ -515,12 +487,12 @@ next1: vtn=vt*here->BJTtemissionCoeffF;
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;
gdsub = here->BJTtSubSatCur*3*arg/vsub+ckt->CKTgmin;
cdsub = -here->BJTtSubSatCur*(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;
gdsub = here->BJTtSubSatCur*evsub/vts + ckt->CKTgmin;
cdsub = here->BJTtSubSatCur*(evsub-1) + ckt->CKTgmin*vsub;
}
} else {
gdsub = ckt->CKTgmin;
@ -588,12 +560,12 @@ next1: vtn=vt*here->BJTtemissionCoeffF;
* determine base charge terms
*/
q1=1/(1-here->BJTtinvEarlyVoltF*vbc-here->BJTtinvEarlyVoltR*vbe);
if(oik == 0 && oikr == 0) {
if(here->BJTtinvRollOffF == 0 && here->BJTtinvRollOffR == 0) {
qb=q1;
dqbdve=q1*qb*here->BJTtinvEarlyVoltR;
dqbdvc=q1*qb*here->BJTtinvEarlyVoltF;
} else {
q2=oik*cbe+oikr*cbc;
q2=here->BJTtinvRollOffF*cbe+here->BJTtinvRollOffR*cbc;
arg=MAX(0,1+4*q2);
sqarg=1;
if(!model->BJTnkfGiven) {
@ -603,11 +575,11 @@ next1: vtn=vt*here->BJTtemissionCoeffF;
}
qb=q1*(1+sqarg)/2;
if(!model->BJTnkfGiven) {
dqbdve=q1*(qb*here->BJTtinvEarlyVoltR+oik*gbe/sqarg);
dqbdvc=q1*(qb*here->BJTtinvEarlyVoltF+oikr*gbc/sqarg);
dqbdve=q1*(qb*here->BJTtinvEarlyVoltR+here->BJTtinvRollOffF*gbe/sqarg);
dqbdvc=q1*(qb*here->BJTtinvEarlyVoltF+here->BJTtinvRollOffR*gbc/sqarg);
} else {
dqbdve=q1*(qb*here->BJTtinvEarlyVoltR+oik*gbe*2*sqarg*model->BJTnkf/arg);
dqbdvc=q1*(qb*here->BJTtinvEarlyVoltF+oikr*gbc*2*sqarg*model->BJTnkf/arg);
dqbdve=q1*(qb*here->BJTtinvEarlyVoltR+here->BJTtinvRollOffF*gbe*2*sqarg*model->BJTnkf/arg);
dqbdvc=q1*(qb*here->BJTtinvEarlyVoltF+here->BJTtinvRollOffR*gbc*2*sqarg*model->BJTnkf/arg);
}
}
/*
@ -617,8 +589,8 @@ next1: vtn=vt*here->BJTtemissionCoeffF;
cc=0;
cex=cbe;
gex=gbe;
if(ckt->CKTmode & (MODETRAN | MODEAC) && td != 0) {
arg1=ckt->CKTdelta/td;
if(ckt->CKTmode & (MODETRAN | MODEAC) && model->BJTexcessPhaseFactor != 0) {
arg1=ckt->CKTdelta/model->BJTexcessPhaseFactor;
arg2=3*arg1;
arg1=arg2*arg1;
denom=1+arg1+arg2;
@ -641,12 +613,12 @@ next1: vtn=vt*here->BJTtemissionCoeffF;
*/
cc=cc+(cex-cbc)/qb-cbc/here->BJTtBetaR-cbcn;
cb=cbe/here->BJTtBetaF+cben+cbc/here->BJTtBetaR+cbcn;
gx=rbpr+rbpi/qb;
if(xjrb != 0) {
arg1=MAX(cb/xjrb,1e-9);
gx=here->BJTtminBaseResist+rbpi/qb;
if(here->BJTtbaseCurrentHalfResist != 0) {
arg1=MAX(cb/here->BJTtbaseCurrentHalfResist,1e-9);
arg2=(-1+sqrt(1+14.59025*arg1))/2.4317/sqrt(arg1);
arg1=tan(arg2);
gx=rbpr+3*rbpi*(arg1-arg2)/arg2/arg1/arg1;
gx=here->BJTtminBaseResist+3*rbpi*(arg1-arg2)/arg2/arg1/arg1;
}
if(gx != 0) gx=1/gx;
gpi=gbe/here->BJTtBetaF+gben;
@ -661,28 +633,22 @@ next1: vtn=vt*here->BJTtemissionCoeffF;
*/
tf=here->BJTttransitTimeF;
tr=here->BJTttransitTimeR;
czbe=here->BJTtBEcap*here->BJTarea;
czbe=here->BJTtBEcap;
pe=here->BJTtBEpot;
xme=here->BJTtjunctionExpBE;
cdis=model->BJTbaseFractionBCcap;
if (model->BJTsubs == VERTICAL)
ctot=here->BJTtBCcap*here->BJTareab;
else
ctot=here->BJTtBCcap*here->BJTareac;
ctot=here->BJTtBCcap;
czbc=ctot*cdis;
czbx=ctot-czbc;
pc=here->BJTtBCpot;
xmc=here->BJTtjunctionExpBC;
fcpe=here->BJTtDepCap;
if (model->BJTsubs == VERTICAL)
czsub=here->BJTtSubcap*here->BJTareac;
else
czsub=here->BJTtSubcap*here->BJTareab;
czsub=here->BJTtSubcap;
ps=here->BJTtSubpot;
xms=here->BJTtjunctionExpSub;
xtf=model->BJTtransitTimeBiasCoeffF;
ovtf=model->BJTtransitTimeVBCFactor;
xjtf=here->BJTttransitTimeHighCurrentF*here->BJTarea;
xjtf=here->BJTttransitTimeHighCurrentF;
if(tf != 0 && vbe >0) {
argtf=0;
arg2=0;
@ -936,24 +902,24 @@ load:
/*
* load y matrix
*/
*(here->BJTcolColPtr) += m * (gcpr);
*(here->BJTcolColPtr) += m * (here->BJTtcollectorConduct);
*(here->BJTbaseBasePtr) += m * (gx+geqbx);
*(here->BJTemitEmitPtr) += m * (gepr);
*(here->BJTemitEmitPtr) += m * (here->BJTtemitterConduct);
*(here->BJTcolPrimeColPrimePtr) += m * (gmu+go+geqbx);
*(here->BJTcollCXcollCXPtr) += m * (gcpr);
*(here->BJTcollCXcollCXPtr) += m * (here->BJTtcollectorConduct);
*(here->BJTsubstConSubstConPtr) += m * (geqsub);
*(here->BJTbasePrimeBasePrimePtr) += m * (gx +gpi+gmu+geqcb);
*(here->BJTemitPrimeEmitPrimePtr) += m * (gpi+gepr+gm+go);
*(here->BJTcollCollCXPtr) += m * (-gcpr);
*(here->BJTemitPrimeEmitPrimePtr) += m * (gpi+here->BJTtemitterConduct+gm+go);
*(here->BJTcollCollCXPtr) += m * (-here->BJTtcollectorConduct);
*(here->BJTbaseBasePrimePtr) += m * (-gx);
*(here->BJTemitEmitPrimePtr) += m * (-gepr);
*(here->BJTcollCXCollPtr) += m * (-gcpr);
*(here->BJTemitEmitPrimePtr) += m * (-here->BJTtemitterConduct);
*(here->BJTcollCXCollPtr) += m * (-here->BJTtcollectorConduct);
*(here->BJTcolPrimeBasePrimePtr) += m * (-gmu+gm);
*(here->BJTcolPrimeEmitPrimePtr) += m * (-gm-go);
*(here->BJTbasePrimeBasePtr) += m * (-gx);
*(here->BJTbasePrimeColPrimePtr) += m * (-gmu-geqcb);
*(here->BJTbasePrimeEmitPrimePtr) += m * (-gpi);
*(here->BJTemitPrimeEmitPtr) += m * (-gepr);
*(here->BJTemitPrimeEmitPtr) += m * (-here->BJTtemitterConduct);
*(here->BJTemitPrimeColPrimePtr) += m * (-go+geqcb);
*(here->BJTemitPrimeBasePrimePtr) += m * (-gpi-gm-geqcb);
*(here->BJTsubstSubstPtr) += m * (geqsub);

View File

@ -86,7 +86,7 @@ for (model=firstModel; model != NULL; model=BJTnextModel(model)) {
case N_DENS:
NevalSrc(&noizDens[BJTRCNOIZ],&lnNdens[BJTRCNOIZ],
ckt,THERMNOISE,inst->BJTcollCXNode,inst->BJTcolNode,
inst->BJTtcollectorConduct * inst->BJTarea * inst->BJTm);
inst->BJTtcollectorConduct * inst->BJTm);
NevalSrc(&noizDens[BJTRBNOIZ],&lnNdens[BJTRBNOIZ],
ckt,THERMNOISE,inst->BJTbasePrimeNode,inst->BJTbaseNode,
@ -94,7 +94,7 @@ for (model=firstModel; model != NULL; model=BJTnextModel(model)) {
NevalSrc(&noizDens[BJT_RE_NOISE],&lnNdens[BJT_RE_NOISE],
ckt,THERMNOISE,inst->BJTemitPrimeNode,inst->BJTemitNode,
inst->BJTtemitterConduct * inst->BJTarea * inst-> BJTm);
inst->BJTtemitterConduct * inst-> BJTm);
NevalSrc(&noizDens[BJTICNOIZ],&lnNdens[BJTICNOIZ],
ckt,SHOTNOISE,inst->BJTcolPrimeNode, inst->BJTemitPrimeNode,

View File

@ -40,8 +40,8 @@ BJTpzLoad(GENmodel *inModel, CKTcircuit *ckt, SPcomplex *s)
m = here->BJTm;
gcpr=here->BJTtcollectorConduct * here->BJTarea;
gepr=here->BJTtemitterConduct * here->BJTarea;
gcpr=here->BJTtcollectorConduct;
gepr=here->BJTtemitterConduct;
gpi= *(ckt->CKTstate0 + here->BJTgpi);
gmu= *(ckt->CKTstate0 + here->BJTgmu);
gm= *(ckt->CKTstate0 + here->BJTgm);

View File

@ -168,8 +168,8 @@ BJTsAcLoad(GENmodel *inModel, CKTcircuit *ckt)
*(here->BJTsenCsub)= *(ckt->CKTstate0 + here->BJTcqsub);
*(here->BJTsenCmcb)= *(ckt->CKTstate0 + here->BJTcexbc);
}
gcpr = here->BJTtcollectorConduct * A0;
gepr = here->BJTtemitterConduct * A0;
gcpr = here->BJTtcollectorConduct;
gepr = here->BJTtemitterConduct;
gpi= *(here->BJTsenGpi);
gmu= *(here->BJTsenGmu);
gm= *(here->BJTsenGm);
@ -465,8 +465,8 @@ pertvcs: /* Perturbation of vcs */
goto next2;
load:
gcpr=here->BJTtcollectorConduct * here->BJTarea;
gepr=here->BJTtemitterConduct * here->BJTarea;
gcpr=here->BJTtcollectorConduct;
gepr=here->BJTtemitterConduct;
gpi= *(here->BJTsenGpi + flag+1);
gmu= *(here->BJTsenGmu + flag+1);
gm= *(here->BJTsenGm + flag+1);

View File

@ -87,6 +87,7 @@ BJTtemp(GENmodel *inModel, CKTcircuit *ckt)
}
if(model->BJTrollOffFGiven && model->BJTrollOffF != 0) {
here->BJTtinvRollOffF = 1/(model->BJTrollOffF * (1+model->BJTtikf1*dt+model->BJTtikf2*dt*dt));
here->BJTtinvRollOffF /= here->BJTarea;
} else {
here->BJTtinvRollOffF = 0;
}
@ -97,28 +98,35 @@ BJTtemp(GENmodel *inModel, CKTcircuit *ckt)
}
if(model->BJTrollOffRGiven && model->BJTrollOffR != 0) {
here->BJTtinvRollOffR = 1/(model->BJTrollOffR * (1+model->BJTtikr1*dt+model->BJTtikr2*dt*dt));
here->BJTtinvRollOffR /= here->BJTarea;
} else {
here->BJTtinvRollOffR = 0;
}
if(model->BJTcollectorResistGiven && model->BJTcollectorResist != 0) {
here->BJTtcollectorConduct = 1/(model->BJTcollectorResist * (1+model->BJTtrc1*dt+model->BJTtrc2*dt*dt));
here->BJTtcollectorConduct *= here->BJTarea;
} else {
here->BJTtcollectorConduct = 0;
}
if(model->BJTemitterResistGiven && model->BJTemitterResist != 0) {
here->BJTtemitterConduct = 1/(model->BJTemitterResist * (1+model->BJTtre1*dt+model->BJTtre2*dt*dt));
here->BJTtemitterConduct *= here->BJTarea;
} else {
here->BJTtemitterConduct = 0;
}
here->BJTtbaseResist = model->BJTbaseResist * (1+model->BJTtrb1*dt+model->BJTtrb2*dt*dt);
here->BJTtbaseResist /= here->BJTarea;
here->BJTtminBaseResist = model->BJTminBaseResist*(1+model->BJTtrm1*dt+model->BJTtrm2*dt*dt);
here->BJTtminBaseResist /= here->BJTarea;
here->BJTtbaseCurrentHalfResist = model->BJTbaseCurrentHalfResist * (1+model->BJTtirb1*dt+model->BJTtirb2*dt*dt);
here->BJTtbaseCurrentHalfResist *= here->BJTarea;
here->BJTtemissionCoeffF = model->BJTemissionCoeffF * (1+model->BJTtnf1*dt+model->BJTtnf2*dt*dt);
here->BJTtemissionCoeffR = model->BJTemissionCoeffR * (1+model->BJTtnr1*dt+model->BJTtnr2*dt*dt);
here->BJTtleakBEemissionCoeff = model->BJTleakBEemissionCoeff * (1+model->BJTtne1*dt+model->BJTtne2*dt*dt);
here->BJTtleakBCemissionCoeff = model->BJTleakBCemissionCoeff * (1+model->BJTtnc1*dt+model->BJTtnc2*dt*dt);
here->BJTttransitTimeHighCurrentF = model->BJTtransitTimeHighCurrentF * (1+model->BJTtitf1*dt+model->BJTtitf2*dt*dt);
here->BJTttransitTimeHighCurrentF *= here->BJTarea;
here->BJTttransitTimeF = model->BJTtransitTimeF * (1+model->BJTttf1*dt+model->BJTttf2*dt*dt);
here->BJTttransitTimeR = model->BJTtransitTimeR * (1+model->BJTttr1*dt+model->BJTttr2*dt*dt);
here->BJTtjunctionExpBE = model->BJTjunctionExpBE * (1+model->BJTtmje1*dt+model->BJTtmje2*dt*dt);
@ -145,10 +153,10 @@ BJTtemp(GENmodel *inModel, CKTcircuit *ckt)
model->BJTtempExpIS*ratlog;
if ((model->BJTtlev == 0) || (model->BJTtlev == 1)) {
factor = exp(factlog);
here->BJTtSatCur = model->BJTsatCur * factor;
here->BJTtSatCur = here->BJTarea * model->BJTsatCur * factor;
if (model->BJTBEsatCurGiven) {
factor = exp(factlog / model->BJTemissionCoeffF);
here->BJTBEtSatCur = model->BJTBEsatCur * factor;
here->BJTBEtSatCur = here->BJTarea * model->BJTBEsatCur * factor;
} else {
here->BJTBEtSatCur = here->BJTtSatCur;
}
@ -159,11 +167,11 @@ BJTtemp(GENmodel *inModel, CKTcircuit *ckt)
here->BJTBCtSatCur = here->BJTtSatCur;
}
if (model->BJTsubSatCurGiven)
here->BJTtSubSatCur = model->BJTsubSatCur * factor;
here->BJTtSubSatCur = here->BJTarea * model->BJTsubSatCur * factor;
} else if (model->BJTtlev == 3) {
here->BJTtSatCur = pow(model->BJTsatCur,(1+model->BJTtis1*dt+model->BJTtis2*dt*dt));
here->BJTtSatCur = here->BJTarea * pow(model->BJTsatCur,(1+model->BJTtis1*dt+model->BJTtis2*dt*dt));
if (model->BJTBEsatCurGiven) {
here->BJTBEtSatCur = pow(model->BJTBEsatCur,(1+model->BJTtis1*dt+model->BJTtis2*dt*dt));
here->BJTBEtSatCur = here->BJTarea * pow(model->BJTBEsatCur,(1+model->BJTtis1*dt+model->BJTtis2*dt*dt));
} else {
here->BJTBEtSatCur = here->BJTtSatCur;
}
@ -173,7 +181,12 @@ BJTtemp(GENmodel *inModel, CKTcircuit *ckt)
here->BJTBCtSatCur = here->BJTtSatCur;
}
if (model->BJTsubSatCurGiven)
here->BJTtSubSatCur = pow(model->BJTsubSatCur,(1+model->BJTtiss1*dt+model->BJTtiss2*dt*dt));
here->BJTtSubSatCur = here->BJTarea * pow(model->BJTsubSatCur,(1+model->BJTtiss1*dt+model->BJTtiss2*dt*dt));
}
if (model->BJTsubs == VERTICAL) {
here->BJTBCtSatCur *= here->BJTareab;
} else {
here->BJTBCtSatCur *= here->BJTareac;
}
if (model->BJTintCollResistGiven) {
@ -207,14 +220,19 @@ BJTtemp(GENmodel *inModel, CKTcircuit *ckt)
here->BJTtBetaR = model->BJTbetaR * bfactor;
if ((model->BJTtlev == 0) || (model->BJTtlev == 1)) {
here->BJTtBEleakCur = model->BJTleakBEcurrent *
here->BJTtBEleakCur = here->BJTarea * model->BJTleakBEcurrent *
exp(factlog/model->BJTleakBEemissionCoeff)/bfactor;
here->BJTtBCleakCur = model->BJTleakBCcurrent *
exp(factlog/model->BJTleakBCemissionCoeff)/bfactor;
} else if (model->BJTtlev == 3) {
here->BJTtBEleakCur = pow(model->BJTleakBEcurrent,(1+model->BJTtise1*dt+model->BJTtise2*dt*dt));
here->BJTtBEleakCur = here->BJTarea * pow(model->BJTleakBEcurrent,(1+model->BJTtise1*dt+model->BJTtise2*dt*dt));
here->BJTtBCleakCur = pow(model->BJTleakBCcurrent,(1+model->BJTtisc1*dt+model->BJTtisc2*dt*dt));
}
if (model->BJTsubs == VERTICAL) {
here->BJTtBCleakCur *= here->BJTareab;
} else {
here->BJTtBCleakCur *= here->BJTareac;
}
if (model->BJTtlevc == 0) {
pbo = (model->BJTpotentialBE-pbfact1)/fact1;
@ -231,6 +249,7 @@ BJTtemp(GENmodel *inModel, CKTcircuit *ckt)
(1+model->BJTcte*dt);
here->BJTtBEpot = model->BJTpotentialBE - model->BJTtvje*dt;
}
here->BJTtBEcap *= here->BJTarea;
if (model->BJTtlevc == 0) {
pbo = (model->BJTpotentialBC-pbfact1)/fact1;
gmaold = (model->BJTpotentialBC-pbo)/pbo;
@ -246,6 +265,10 @@ BJTtemp(GENmodel *inModel, CKTcircuit *ckt)
(1+model->BJTctc*dt);
here->BJTtBCpot = model->BJTpotentialBC - model->BJTtvjc*dt;
}
if (model->BJTsubs == VERTICAL)
here->BJTtBCcap *= here->BJTareab;
else
here->BJTtBCcap *= here->BJTareac;
if (model->BJTtlevc == 0) {
pbo = (model->BJTpotentialSubstrate-pbfact1)/fact1;
gmaold = (model->BJTpotentialSubstrate-pbo)/pbo;
@ -261,6 +284,10 @@ BJTtemp(GENmodel *inModel, CKTcircuit *ckt)
(1+model->BJTcts*dt);
here->BJTtSubpot = model->BJTpotentialSubstrate - model->BJTtvjs*dt;
}
if (model->BJTsubs == VERTICAL)
here->BJTtSubcap *= here->BJTareac;
else
here->BJTtSubcap *= here->BJTareab;
here->BJTtDepCap = model->BJTdepletionCapCoeff * here->BJTtBEpot;
here->BJTtf1 = here->BJTtBEpot * (1 - exp((1 -
@ -271,10 +298,10 @@ BJTtemp(GENmodel *inModel, CKTcircuit *ckt)
here->BJTtjunctionExpBC) * xfc)) /
(1 - here->BJTtjunctionExpBC);
here->BJTtVcrit = vt *
log(vt / (CONSTroot2*here->BJTtSatCur*here->BJTarea));
log(vt / (CONSTroot2*here->BJTtSatCur));
if (model->BJTsubSatCurGiven)
here->BJTtSubVcrit = vt *
log(vt / (CONSTroot2*here->BJTtSubSatCur*here->BJTarea));
log(vt / (CONSTroot2*here->BJTtSubSatCur));
here->BJTtf2 = exp((1 + here->BJTtjunctionExpBE) * xfc);
here->BJTtf3 = 1 - model->BJTdepletionCapCoeff *
(1 + here->BJTtjunctionExpBE);