general update: fix temperature update, improve performance

This commit is contained in:
dwarning 2023-04-08 17:10:04 +02:00 committed by Holger Vogt
parent f33e899fda
commit de09636d1a
7 changed files with 1259 additions and 265 deletions

View File

@ -66,6 +66,7 @@ IFparm VBICpTable[] = { /* parameters */
IFparm VBICmPTable[] = { /* model parameters */
OP("type", VBIC_MOD_TYPE, IF_STRING, "NPN or PNP"),
IOP("selft", VBIC_MOD_SELFT, IF_INTEGER, "0: self-heating off, 1: self-heating on"),
IOPU("npn", VBIC_MOD_NPN, IF_FLAG, "NPN type device"),
IOPU("pnp", VBIC_MOD_PNP, IF_FLAG, "PNP type device"),
IOP("tnom", VBIC_MOD_TNOM, IF_REAL, "Parameter measurement temperature"),
@ -73,6 +74,7 @@ IFparm VBICmPTable[] = { /* model parameters */
IOP("rcx", VBIC_MOD_RCX, IF_REAL, "Extrinsic coll resistance"),
IOP("rci", VBIC_MOD_RCI, IF_REAL, "Intrinsic coll resistance"),
IOP("vo", VBIC_MOD_VO, IF_REAL, "Epi drift saturation voltage"),
IOPR("v0", VBIC_MOD_VO, IF_REAL, "Epi drift saturation voltage"),
IOP("gamm", VBIC_MOD_GAMM, IF_REAL, "Epi doping parameter"),
IOP("hrcf", VBIC_MOD_HRCF, IF_REAL, "High current RC factor"),
IOP("rbx", VBIC_MOD_RBX, IF_REAL, "Extrinsic base resistance"),
@ -85,13 +87,16 @@ IFparm VBICmPTable[] = { /* model parameters */
IOP("nr", VBIC_MOD_NR, IF_REAL, "Reverse emission coefficient"),
IOP("fc", VBIC_MOD_FC, IF_REAL, "Fwd bias depletion capacitance limit"),
IOP("cbeo", VBIC_MOD_CBEO, IF_REAL, "Extrinsic B-E overlap capacitance"),
IOPR("cbe0", VBIC_MOD_CBEO, IF_REAL, "Extrinsic B-E overlap capacitance"),
IOP("cje", VBIC_MOD_CJE, IF_REAL, "Zero bias B-E depletion capacitance"),
IOP("pe", VBIC_MOD_PE, IF_REAL, "B-E built in potential"),
IOP("me", VBIC_MOD_ME, IF_REAL, "B-E junction grading coefficient"),
IOP("aje", VBIC_MOD_AJE, IF_REAL, "B-E capacitance smoothing factor"),
IOP("cbco", VBIC_MOD_CBCO, IF_REAL, "Extrinsic B-C overlap capacitance"),
IOPR("cbc0", VBIC_MOD_CBCO, IF_REAL, "Extrinsic B-C overlap capacitance"),
IOP("cjc", VBIC_MOD_CJC, IF_REAL, "Zero bias B-C depletion capacitance"),
IOP("qco", VBIC_MOD_QCO, IF_REAL, "Epi charge parameter"),
IOPR("qc0", VBIC_MOD_QCO, IF_REAL, "Epi charge parameter"),
IOP("cjep", VBIC_MOD_CJEP, IF_REAL, "B-C extrinsic zero bias capacitance"),
IOP("pc", VBIC_MOD_PC, IF_REAL, "B-C built in potential"),
IOP("mc", VBIC_MOD_MC, IF_REAL, "B-C junction grading coefficient"),
@ -136,12 +141,11 @@ IFparm VBICmPTable[] = { /* model parameters */
IOP("afn", VBIC_MOD_AFN, IF_REAL, "B-E Flicker Noise Exponent"),
IOP("bfn", VBIC_MOD_BFN, IF_REAL, "B-E Flicker Noise 1/f dependence"),
IOP("xre", VBIC_MOD_XRE, IF_REAL, "Temperature exponent of RE"),
IOP("xrb", VBIC_MOD_XRB, IF_REAL, "Temperature exponent of RB"),
IOP("xrbi", VBIC_MOD_XRBI, IF_REAL, "Temperature exponent of RBI"),
IOP("xrc", VBIC_MOD_XRC, IF_REAL, "Temperature exponent of RC"),
IOP("xrci", VBIC_MOD_XRCI, IF_REAL, "Temperature exponent of RCI"),
IOP("xrs", VBIC_MOD_XRS, IF_REAL, "Temperature exponent of RS"),
IOP("xvo", VBIC_MOD_XVO, IF_REAL, "Temperature exponent of VO"),
IOPR("xv0", VBIC_MOD_XVO, IF_REAL, "Temperature exponent of VO"),
IOP("ea", VBIC_MOD_EA, IF_REAL, "Activation energy for IS"),
IOP("eaie", VBIC_MOD_EAIE, IF_REAL, "Activation energy for IBEI"),
IOP("eaic", VBIC_MOD_EAIC, IF_REAL, "Activation energy for IBCI/IBEIP"),
@ -163,7 +167,9 @@ IFparm VBICmPTable[] = { /* model parameters */
IOP("nkf", VBIC_MOD_NKF, IF_REAL, "High current beta rolloff"),
IOP("xikf", VBIC_MOD_XIKF, IF_REAL, "Temperature exponent of IKF"),
IOP("xrcx", VBIC_MOD_XRCX, IF_REAL, "Temperature exponent of RCX"),
IOPR("xrc", VBIC_MOD_XRCX, IF_REAL, "Temperature exponent of RCX"),
IOP("xrbx", VBIC_MOD_XRBX, IF_REAL, "Temperature exponent of RBX"),
IOPR("xrb", VBIC_MOD_XRBX, IF_REAL, "Temperature exponent of RBX"),
IOP("xrbp", VBIC_MOD_XRBP, IF_REAL, "Temperature exponent of RBP"),
IOP("isrr", VBIC_MOD_ISRR, IF_REAL, "Separate IS for fwd and rev"),
IOP("xisr", VBIC_MOD_XISR, IF_REAL, "Temperature exponent of ISR"),
@ -189,8 +195,7 @@ IFparm VBICmPTable[] = { /* model parameters */
IOPR("bvsub", VBIC_MOD_VSUB_MAX, IF_REAL, "maximum voltage C-substrate branch"),
IOP("vbefwd", VBIC_MOD_VBEFWD_MAX, IF_REAL, "maximum forward voltage B-E junction"),
IOP("vbcfwd", VBIC_MOD_VBCFWD_MAX, IF_REAL, "maximum forward voltage B-C junction"),
IOP("vsubfwd", VBIC_MOD_VSUBFWD_MAX, IF_REAL, "maximum forward voltage C-substrate junction"),
IOP("selft", VBIC_MOD_SELFT, IF_INTEGER, "0: self-heating off, 1: self-heating on")
IOP("vsubfwd", VBIC_MOD_VSUBFWD_MAX, IF_REAL, "maximum forward voltage C-substrate junction")
};
char *VBICnames[] = {

View File

@ -369,7 +369,7 @@ typedef struct sVBICmodel { /* model structure for a vbic */
#define VBICmodName gen.GENmodName
int VBICtype;
int VBICselft;
double VBICtnom;
double VBICextCollResist;
double VBICintCollResist;
@ -437,9 +437,7 @@ typedef struct sVBICmodel { /* model structure for a vbic */
double VBICfNexpA;
double VBICfNexpB;
double VBICtempExpRE;
double VBICtempExpRB;
double VBICtempExpRBI;
double VBICtempExpRC;
double VBICtempExpRCI;
double VBICtempExpRS;
double VBICtempExpVO;
@ -457,7 +455,6 @@ typedef struct sVBICmodel { /* model structure for a vbic */
double VBICtempExpAVC;
double VBICthermalResist;
double VBICthermalCapacitance;
int VBICselft;
double VBICpunchThroughVoltageBC;
double VBICdeplCapCoeff1;
double VBICfixedCapacitanceCS;
@ -490,6 +487,7 @@ typedef struct sVBICmodel { /* model structure for a vbic */
double VBICvbefwdMax; /* maximum forward voltage over C-E branch */
double VBICvsubfwdMax; /* maximum forward voltage over C-substrate branch */
unsigned VBICselftGiven : 1;
unsigned VBICtnomGiven : 1;
unsigned VBICextCollResistGiven : 1;
unsigned VBICintCollResistGiven : 1;
@ -576,7 +574,6 @@ typedef struct sVBICmodel { /* model structure for a vbic */
unsigned VBICtempExpNFGiven : 1;
unsigned VBICtempExpAVCGiven : 1;
unsigned VBICthermalResistGiven : 1;
unsigned VBICselftGiven : 1;
unsigned VBICthermalCapacitanceGiven : 1;
unsigned VBICpunchThroughVoltageBCGiven : 1;
unsigned VBICdeplCapCoeff1Given : 1;

File diff suppressed because it is too large Load Diff

View File

@ -225,15 +225,9 @@ VBICmAsk(CKTcircuit *ckt, GENmodel *instPtr, int which, IFvalue *value)
case VBIC_MOD_XRE:
value->rValue = here->VBICtempExpRE;
return(OK);
case VBIC_MOD_XRB:
value->rValue = here->VBICtempExpRB;
return(OK);
case VBIC_MOD_XRBI:
value->rValue = here->VBICtempExpRBI;
return(OK);
case VBIC_MOD_XRC:
value->rValue = here->VBICtempExpRC;
return(OK);
case VBIC_MOD_XRCI:
value->rValue = here->VBICtempExpRCI;
return(OK);

View File

@ -325,18 +325,10 @@ VBICmParam(int param, IFvalue *value, GENmodel *inModel)
mods->VBICtempExpRE = value->rValue;
mods->VBICtempExpREGiven = TRUE;
break;
case VBIC_MOD_XRB:
mods->VBICtempExpRB = value->rValue;
mods->VBICtempExpRBGiven = TRUE;
break;
case VBIC_MOD_XRBI:
mods->VBICtempExpRBI = value->rValue;
mods->VBICtempExpRBIGiven = TRUE;
break;
case VBIC_MOD_XRC:
mods->VBICtempExpRC = value->rValue;
mods->VBICtempExpRCGiven = TRUE;
break;
case VBIC_MOD_XRCI:
mods->VBICtempExpRCI = value->rValue;
mods->VBICtempExpRCIGiven = TRUE;

View File

@ -239,15 +239,9 @@ VBICsetup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt, int *states)
if(!model->VBICtempExpREGiven) {
model->VBICtempExpRE = 0.0;
}
if(!model->VBICtempExpRBGiven) {
model->VBICtempExpRB = 0.0;
}
if(!model->VBICtempExpRBIGiven) {
model->VBICtempExpRBI = 0.0;
}
if(!model->VBICtempExpRCGiven) {
model->VBICtempExpRC = 0.0;
}
if(!model->VBICtempExpRCIGiven) {
model->VBICtempExpRCI = 0.0;
}
@ -369,19 +363,6 @@ VBICsetup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt, int *states)
model->VBICrefVersion = 0.0;
}
if(model->VBICtempExpRBGiven && !model->VBICtempExpRBIGiven) {
model->VBICtempExpRBI = model->VBICtempExpRB;
}
if(model->VBICtempExpRBGiven && !model->VBICtempExpRBXGiven) {
model->VBICtempExpRBX = model->VBICtempExpRB;
}
if(model->VBICtempExpRCGiven && !model->VBICtempExpRCIGiven) {
model->VBICtempExpRCI = model->VBICtempExpRC;
}
if(model->VBICtempExpRCGiven && !model->VBICtempExpRCXGiven) {
model->VBICtempExpRCX = model->VBICtempExpRC;
}
if(!model->VBICvbeMaxGiven) {
model->VBICvbeMax = 1e99;
}

View File

@ -42,114 +42,7 @@ VBICtemp(GENmodel *inModel, CKTcircuit *ckt)
TAMB = here->VBICtemp - CONSTCtoK;
pnom[0] = model->VBICtnom;
pnom[1] = model->VBICextCollResist;
pnom[2] = model->VBICintCollResist;
pnom[3] = model->VBICepiSatVoltage;
pnom[4] = model->VBICepiDoping;
pnom[5] = model->VBIChighCurFac;
pnom[6] = model->VBICextBaseResist;
pnom[7] = model->VBICintBaseResist;
pnom[8] = model->VBICemitterResist;
pnom[9] = model->VBICsubstrateResist;
pnom[10] = model->VBICparBaseResist;
pnom[11] = model->VBICsatCur;
pnom[12] = model->VBICemissionCoeffF;
pnom[13] = model->VBICemissionCoeffR;
pnom[14] = model->VBICdeplCapLimitF;
pnom[15] = model->VBICextOverlapCapBE;
pnom[16] = model->VBICdepletionCapBE;
pnom[17] = model->VBICpotentialBE;
pnom[18] = model->VBICjunctionExpBE;
pnom[19] = model->VBICsmoothCapBE;
pnom[20] = model->VBICextOverlapCapBC;
pnom[21] = model->VBICdepletionCapBC;
pnom[22] = model->VBICepiCharge;
pnom[23] = model->VBICextCapBC;
pnom[24] = model->VBICpotentialBC;
pnom[25] = model->VBICjunctionExpBC;
pnom[26] = model->VBICsmoothCapBC;
pnom[27] = model->VBICextCapSC;
pnom[28] = model->VBICpotentialSC;
pnom[29] = model->VBICjunctionExpSC;
pnom[30] = model->VBICsmoothCapSC;
pnom[31] = model->VBICidealSatCurBE;
pnom[32] = model->VBICportionIBEI;
pnom[33] = model->VBICidealEmissCoeffBE;
pnom[34] = model->VBICnidealSatCurBE;
pnom[35] = model->VBICnidealEmissCoeffBE;
pnom[36] = model->VBICidealSatCurBC;
pnom[37] = model->VBICidealEmissCoeffBC;
pnom[38] = model->VBICnidealSatCurBC;
pnom[39] = model->VBICnidealEmissCoeffBC;
pnom[40] = model->VBICavalanchePar1BC;
pnom[41] = model->VBICavalanchePar2BC;
pnom[42] = model->VBICparasitSatCur;
pnom[43] = model->VBICportionICCP;
pnom[44] = model->VBICparasitFwdEmissCoeff;
pnom[45] = model->VBICidealParasitSatCurBE;
pnom[46] = model->VBICnidealParasitSatCurBE;
pnom[47] = model->VBICidealParasitSatCurBC;
pnom[48] = model->VBICidealParasitEmissCoeffBC;
pnom[49] = model->VBICnidealParasitSatCurBC;
pnom[50] = model->VBICnidealParasitEmissCoeffBC;
pnom[51] = model->VBICearlyVoltF;
pnom[52] = model->VBICearlyVoltR;
pnom[53] = model->VBICrollOffF;
pnom[54] = model->VBICrollOffR;
pnom[55] = model->VBICparRollOff;
pnom[56] = model->VBICtransitTimeF;
pnom[57] = model->VBICvarTransitTimeF;
pnom[58] = model->VBICtransitTimeBiasCoeffF;
pnom[59] = model->VBICtransitTimeFVBC;
pnom[60] = model->VBICtransitTimeHighCurrentF;
pnom[61] = model->VBICtransitTimeR;
pnom[62] = model->VBICdelayTimeF;
pnom[63] = model->VBICfNcoef;
pnom[64] = model->VBICfNexpA;
pnom[65] = model->VBICfNexpB;
pnom[66] = model->VBICtempExpRE;
pnom[67] = model->VBICtempExpRBI;
pnom[68] = model->VBICtempExpRCI;
pnom[69] = model->VBICtempExpRS;
pnom[70] = model->VBICtempExpVO;
pnom[71] = model->VBICactivEnergyEA;
pnom[72] = model->VBICactivEnergyEAIE;
pnom[73] = model->VBICactivEnergyEAIC;
pnom[74] = model->VBICactivEnergyEAIS;
pnom[75] = model->VBICactivEnergyEANE;
pnom[76] = model->VBICactivEnergyEANC;
pnom[77] = model->VBICactivEnergyEANS;
pnom[78] = model->VBICtempExpIS;
pnom[79] = model->VBICtempExpII;
pnom[80] = model->VBICtempExpIN;
pnom[81] = model->VBICtempExpNF;
pnom[82] = model->VBICtempExpAVC;
pnom[83] = model->VBICthermalResist;
pnom[84] = model->VBICthermalCapacitance;
pnom[85] = model->VBICpunchThroughVoltageBC;
pnom[86] = model->VBICdeplCapCoeff1;
pnom[87] = model->VBICfixedCapacitanceCS;
pnom[88] = model->VBICsgpQBselector;
pnom[89] = model->VBIChighCurrentBetaRolloff;
pnom[90] = model->VBICtempExpIKF;
pnom[91] = model->VBICtempExpRCX;
pnom[92] = model->VBICtempExpRBX;
pnom[93] = model->VBICtempExpRBP;
pnom[94] = model->VBICsepISRR;
pnom[95] = model->VBICtempExpXISR;
pnom[96] = model->VBICdear;
pnom[97] = model->VBICeap;
pnom[98] = model->VBICvbbe;
pnom[99] = model->VBICnbbe;
pnom[100] = model->VBICibbe;
pnom[101] = model->VBICtvbbe1;
pnom[102] = model->VBICtvbbe2;
pnom[103] = model->VBICtnbbe;
pnom[104] = model->VBICebbe;
pnom[105] = model->VBIClocTempDiff;
pnom[106] = model->VBICrevVersion;
pnom[107] = model->VBICrefVersion;
memcpy (&pnom, &model->VBICtnom, 108*8);
iret = vbic_4T_et_cf_t(p,pnom,&TAMB);