diff --git a/src/spicelib/devices/bjt/bjt.c b/src/spicelib/devices/bjt/bjt.c index 3c282f34f..2ddcb7de6 100644 --- a/src/spicelib/devices/bjt/bjt.c +++ b/src/spicelib/devices/bjt/bjt.c @@ -206,7 +206,13 @@ IFparm BJTmPTable[] = { /* model parameters */ IOP("tmjs2",BJT_MOD_TMJS2, IF_REAL, "MJS 2. temperature coefficient"), IOP("tns1", BJT_MOD_TNS1, IF_REAL, "NS 1. temperature coefficient"), IOP("tns2", BJT_MOD_TNS2, IF_REAL, "NS 2. temperature coefficient"), - IOP("nkf", BJT_MOD_NKF, IF_REAL, "NKF High current beta rolloff exponent") + IOP("nkf", BJT_MOD_NKF, IF_REAL, "NKF High current beta rolloff exponent"), + IOP("tis1", BJT_MOD_TIS1, IF_REAL, "IS 1. temperature coefficient"), + IOP("tis2", BJT_MOD_TIS2, IF_REAL, "IS 2. temperature coefficient"), + IOP("tise1", BJT_MOD_TISE1, IF_REAL, "ISE 1. temperature coefficient"), + IOP("tise2", BJT_MOD_TISE2, IF_REAL, "ISE 2. temperature coefficient"), + IOP("tisc1", BJT_MOD_TISC1, IF_REAL, "ISC 1. temperature coefficient"), + IOP("tisc2", BJT_MOD_TISC2, IF_REAL, "ISC 2. temperature coefficient") }; char *BJTnames[] = { diff --git a/src/spicelib/devices/bjt/bjtdefs.h b/src/spicelib/devices/bjt/bjtdefs.h index 20132e2cd..47ba5aad4 100644 --- a/src/spicelib/devices/bjt/bjtdefs.h +++ b/src/spicelib/devices/bjt/bjtdefs.h @@ -443,6 +443,12 @@ typedef struct sBJTmodel { /* model structure for a bjt */ double BJTf3; double BJTf6; double BJTf7; + double BJTtis1; + double BJTtis2; + double BJTtise1; + double BJTtise2; + double BJTtisc1; + double BJTtisc2; unsigned BJTsubsGiven : 1; unsigned BJTtnomGiven : 1; @@ -543,6 +549,12 @@ typedef struct sBJTmodel { /* model structure for a bjt */ unsigned BJTtns1Given : 1; unsigned BJTtns2Given : 1; unsigned BJTnkfGiven : 1; + unsigned BJTtis1Given : 1; + unsigned BJTtis2Given : 1; + unsigned BJTtise1Given : 1; + unsigned BJTtise2Given : 1; + unsigned BJTtisc1Given : 1; + unsigned BJTtisc2Given : 1; } BJTmodel; #ifndef NPN @@ -673,7 +685,13 @@ typedef struct sBJTmodel { /* model structure for a bjt */ #define BJT_MOD_TNS1 198 #define BJT_MOD_TNS2 199 #define BJT_MOD_SUBS 200 -#define BJT_MOD_NKF 100 +#define BJT_MOD_NKF 201 +#define BJT_MOD_TIS1 202 +#define BJT_MOD_TIS2 203 +#define BJT_MOD_TISE1 204 +#define BJT_MOD_TISE2 205 +#define BJT_MOD_TISC1 206 +#define BJT_MOD_TISC2 207 /* device questions */ #define BJT_QUEST_FT 201 diff --git a/src/spicelib/devices/bjt/bjtmask.c b/src/spicelib/devices/bjt/bjtmask.c index a2baed0fb..adc83bae1 100644 --- a/src/spicelib/devices/bjt/bjtmask.c +++ b/src/spicelib/devices/bjt/bjtmask.c @@ -360,6 +360,24 @@ BJTmAsk(CKTcircuit *ckt, GENmodel *instPtr, int which, IFvalue *value) case BJT_MOD_NKF: value->rValue = here->BJTnkf; return(OK); + case BJT_MOD_TIS1: + value->rValue = here->BJTtis1; + return(OK); + case BJT_MOD_TIS2: + value->rValue = here->BJTtis2; + return(OK); + case BJT_MOD_TISE1: + value->rValue = here->BJTtise1; + return(OK); + case BJT_MOD_TISE2: + value->rValue = here->BJTtise2; + return(OK); + case BJT_MOD_TISC1: + value->rValue = here->BJTtisc1; + return(OK); + case BJT_MOD_TISC2: + value->rValue = here->BJTtisc2; + return(OK); default: return(E_BADPARM); } diff --git a/src/spicelib/devices/bjt/bjtmpar.c b/src/spicelib/devices/bjt/bjtmpar.c index fcc6ab16c..1d55c13c4 100644 --- a/src/spicelib/devices/bjt/bjtmpar.c +++ b/src/spicelib/devices/bjt/bjtmpar.c @@ -430,6 +430,30 @@ BJTmParam(int param, IFvalue *value, GENmodel *inModel) mods->BJTnkf = value->rValue; mods->BJTnkfGiven = TRUE; break; + case BJT_MOD_TIS1: + mods->BJTtis1 = value->rValue; + mods->BJTtis1Given = TRUE; + break; + case BJT_MOD_TIS2: + mods->BJTtis2 = value->rValue; + mods->BJTtis2Given = TRUE; + break; + case BJT_MOD_TISE1: + mods->BJTtise1 = value->rValue; + mods->BJTtise1Given = TRUE; + break; + case BJT_MOD_TISE2: + mods->BJTtise2 = value->rValue; + mods->BJTtise2Given = TRUE; + break; + case BJT_MOD_TISC1: + mods->BJTtisc1 = value->rValue; + mods->BJTtisc1Given = TRUE; + break; + case BJT_MOD_TISC2: + mods->BJTtisc2 = value->rValue; + mods->BJTtisc2Given = TRUE; + break; default: return(E_BADPARM); } diff --git a/src/spicelib/devices/bjt/bjtsetup.c b/src/spicelib/devices/bjt/bjtsetup.c index 20f225229..6915293c0 100644 --- a/src/spicelib/devices/bjt/bjtsetup.c +++ b/src/spicelib/devices/bjt/bjtsetup.c @@ -304,6 +304,24 @@ BJTsetup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt, int *states) model->BJTnkf = 1.0; } } + if(!model->BJTtis1Given) { + model->BJTtis1 = 0.0; + } + if(!model->BJTtis2Given) { + model->BJTtis2 = 0.0; + } + if(!model->BJTtise1Given) { + model->BJTtise1 = 0.0; + } + if(!model->BJTtise2Given) { + model->BJTtise2 = 0.0; + } + if(!model->BJTtisc1Given) { + model->BJTtisc1 = 0.0; + } + if(!model->BJTtisc2Given) { + model->BJTtisc2 = 0.0; + } /* * COMPATABILITY WARNING! diff --git a/src/spicelib/devices/bjt/bjttemp.c b/src/spicelib/devices/bjt/bjttemp.c index 146e3604b..d4a90bd94 100644 --- a/src/spicelib/devices/bjt/bjttemp.c +++ b/src/spicelib/devices/bjt/bjttemp.c @@ -156,21 +156,25 @@ BJTtemp(GENmodel *inModel, CKTcircuit *ckt) here->BJTtjunctionExpSub = model->BJTexponentialSubstrate * (1+model->BJTtmjs1*dt+model->BJTtmjs2*dt*dt); here->BJTtemissionCoeffS = model->BJTemissionCoeffS * (1+model->BJTtns1*dt+model->BJTtns2*dt*dt); - vt = here->BJTtemp * CONSTKoverQ; - fact2 = here->BJTtemp/REFTEMP; - egfet = 1.16-(7.02e-4*here->BJTtemp*here->BJTtemp)/ - (here->BJTtemp+1108); - arg = -egfet/(2*CONSTboltz*here->BJTtemp)+ - 1.1150877/(CONSTboltz*(REFTEMP+REFTEMP)); - pbfact = -2*vt*(1.5*log(fact2)+CHARGE*arg); + if ((model->BJTtlev == 0) || (model->BJTtlev == 1)) { + vt = here->BJTtemp * CONSTKoverQ; + fact2 = here->BJTtemp/REFTEMP; + egfet = 1.16-(7.02e-4*here->BJTtemp*here->BJTtemp)/ + (here->BJTtemp+1108); + arg = -egfet/(2*CONSTboltz*here->BJTtemp)+ + 1.1150877/(CONSTboltz*(REFTEMP+REFTEMP)); + pbfact = -2*vt*(1.5*log(fact2)+CHARGE*arg); - ratlog = log(here->BJTtemp/model->BJTtnom); - ratio1 = here->BJTtemp/model->BJTtnom -1; - factlog = ratio1 * model->BJTenergyGap/vt + - model->BJTtempExpIS*ratlog; - factor = exp(factlog); - here->BJTtSatCur = model->BJTsatCur * factor; - here->BJTtSubSatCur = model->BJTsubSatCur * factor; + ratlog = log(here->BJTtemp/model->BJTtnom); + ratio1 = here->BJTtemp/model->BJTtnom -1; + factlog = ratio1 * model->BJTenergyGap/vt + + model->BJTtempExpIS*ratlog; + factor = exp(factlog); + here->BJTtSatCur = model->BJTsatCur * factor; + here->BJTtSubSatCur = model->BJTsubSatCur * factor; + } else if (model->BJTtlev == 3) { + here->BJTtSatCur = pow(model->BJTsatCur,(1+model->BJTtis1*dt+model->BJTtis2*dt*dt)); + } if (model->BJTtlev == 0) { bfactor = exp(ratlog*model->BJTbetaExp); @@ -186,10 +190,15 @@ BJTtemp(GENmodel *inModel, CKTcircuit *ckt) else here->BJTtBetaR = model->BJTbetaR * bfactor; - here->BJTtBEleakCur = model->BJTleakBEcurrent * - exp(factlog/model->BJTleakBEemissionCoeff)/bfactor; - here->BJTtBCleakCur = model->BJTleakBCcurrent * - exp(factlog/model->BJTleakBCemissionCoeff)/bfactor; + if ((model->BJTtlev == 0) || (model->BJTtlev == 1)) { + here->BJTtBEleakCur = 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->BJTtBCleakCur = pow(model->BJTleakBCcurrent,(1+model->BJTtisc1*dt+model->BJTtisc2*dt*dt)); + } if (model->BJTtlevc == 0) { pbo = (model->BJTpotentialBE-pbfact)/fact1;