From 62242a55382c60ee3e17483395673c2db497e8fd Mon Sep 17 00:00:00 2001 From: dwarning Date: Sun, 17 Oct 2021 16:56:19 +0200 Subject: [PATCH] save few calculation effort in bjt load routine --- src/spicelib/devices/bjt/bjtacld.c | 4 +- src/spicelib/devices/bjt/bjtdset.c | 32 +++---- src/spicelib/devices/bjt/bjtload.c | 128 ++++++++++------------------ src/spicelib/devices/bjt/bjtnoise.c | 4 +- src/spicelib/devices/bjt/bjtpzld.c | 4 +- src/spicelib/devices/bjt/bjtsacl.c | 8 +- src/spicelib/devices/bjt/bjttemp.c | 47 +++++++--- 7 files changed, 104 insertions(+), 123 deletions(-) diff --git a/src/spicelib/devices/bjt/bjtacld.c b/src/spicelib/devices/bjt/bjtacld.c index 901ad5f57..a3352134a 100644 --- a/src/spicelib/devices/bjt/bjtacld.c +++ b/src/spicelib/devices/bjt/bjtacld.c @@ -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); diff --git a/src/spicelib/devices/bjt/bjtdset.c b/src/spicelib/devices/bjt/bjtdset.c index 7ad0cc129..90001b0f2 100644 --- a/src/spicelib/devices/bjt/bjtdset.c +++ b/src/spicelib/devices/bjt/bjtdset.c @@ -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; diff --git a/src/spicelib/devices/bjt/bjtload.c b/src/spicelib/devices/bjt/bjtload.c index 7d8b81ca6..7cfaeb846 100644 --- a/src/spicelib/devices/bjt/bjtload.c +++ b/src/spicelib/devices/bjt/bjtload.c @@ -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); diff --git a/src/spicelib/devices/bjt/bjtnoise.c b/src/spicelib/devices/bjt/bjtnoise.c index 13b7fb384..556e24284 100644 --- a/src/spicelib/devices/bjt/bjtnoise.c +++ b/src/spicelib/devices/bjt/bjtnoise.c @@ -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, diff --git a/src/spicelib/devices/bjt/bjtpzld.c b/src/spicelib/devices/bjt/bjtpzld.c index 95f62b322..0aa36658a 100644 --- a/src/spicelib/devices/bjt/bjtpzld.c +++ b/src/spicelib/devices/bjt/bjtpzld.c @@ -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); diff --git a/src/spicelib/devices/bjt/bjtsacl.c b/src/spicelib/devices/bjt/bjtsacl.c index 38ad2a9e4..abb0af1be 100644 --- a/src/spicelib/devices/bjt/bjtsacl.c +++ b/src/spicelib/devices/bjt/bjtsacl.c @@ -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); diff --git a/src/spicelib/devices/bjt/bjttemp.c b/src/spicelib/devices/bjt/bjttemp.c index d3418ed47..65789c830 100644 --- a/src/spicelib/devices/bjt/bjttemp.c +++ b/src/spicelib/devices/bjt/bjttemp.c @@ -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);