Patch sent by Dietmar Warning: fixed double allocation of substrate node, current sign and tempo for rb and rc.

This commit is contained in:
pnenzi 2005-11-07 13:57:10 +00:00
parent 75f2db1483
commit d921759a2a
9 changed files with 222 additions and 173 deletions

View File

@ -1,3 +1,12 @@
2005-11-07 Paolo Nenzi <p.nenzi@ieee.org>
* src/spicelib/devices/vbic/*: Dietmar Warning sent a patch to his last
vbic implementation:
- Added temperature dependence for RB and RC,
- fixed a bug in current sign (reversing vbei and vbci),
- removed double allocation of substrate node.
2005-10-19 Steven Borley <steven.borley@virgin.net>
* src/Makefile.am: Implemented fix to prevent 'multiple definition' errors

View File

@ -141,7 +141,9 @@ 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"),

View File

@ -226,13 +226,13 @@ typedef struct sVBICinstance {
#define VBICRBINOIZ 3
#define VBICRENOIZ 4
#define VBICRBPNOIZ 5
#define VBICICNOIZ 6
#define VBICIBNOIZ 7
#define VBICIBEPNOIZ 8
#define VBICFLBENOIZ 9
#define VBICFLBEPNOIZ 10
#define VBICRSNOIZ 11
#define VBICICCPNOIZ 12
#define VBICRSNOIZ 6
#define VBICICNOIZ 7
#define VBICIBNOIZ 8
#define VBICIBEPNOIZ 9
#define VBICICCPNOIZ 10
#define VBICFLBENOIZ 11
#define VBICFLBEPNOIZ 12
#define VBICTOTNOIZ 13
#define VBICNSRCS 14 /* the number of VBIC noise sources */
@ -333,13 +333,13 @@ typedef struct sVBICinstance {
#define VBICnumStates 62
#define VBICsensxpbe VBICstate+64 /* charge sensitivities and their
derivatives. +65 for the derivatives -
#define VBICsensxpbe VBICstate+62 /* charge sensitivities and their
derivatives. +63 for the derivatives -
pointer to the beginning of the array */
#define VBICsensxpbex VBICstate+66
#define VBICsensxpbc VBICstate+68
#define VBICsensxpbcx VBICstate+70
#define VBICsensxpbep VBICstate+72
#define VBICsensxpbex VBICstate+64
#define VBICsensxpbc VBICstate+66
#define VBICsensxpbcx VBICstate+68
#define VBICsensxpbep VBICstate+70
#define VBICnumSenStates 10
@ -422,7 +422,9 @@ 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;
@ -536,7 +538,9 @@ typedef struct sVBICmodel { /* model structure for a vbic */
unsigned VBICfNexpAGiven : 1;
unsigned VBICfNexpBGiven : 1;
unsigned VBICtempExpREGiven : 1;
unsigned VBICtempExpRBGiven : 1;
unsigned VBICtempExpRBIGiven : 1;
unsigned VBICtempExpRCGiven : 1;
unsigned VBICtempExpRCIGiven : 1;
unsigned VBICtempExpRSGiven : 1;
unsigned VBICtempExpVOGiven : 1;
@ -664,47 +668,49 @@ typedef struct sVBICmodel { /* model structure for a vbic */
#define VBIC_MOD_AFN 167
#define VBIC_MOD_BFN 168
#define VBIC_MOD_XRE 169
#define VBIC_MOD_XRBI 170
#define VBIC_MOD_XRCI 171
#define VBIC_MOD_XRS 172
#define VBIC_MOD_XVO 173
#define VBIC_MOD_EA 174
#define VBIC_MOD_EAIE 175
#define VBIC_MOD_EAIC 176
#define VBIC_MOD_EAIS 177
#define VBIC_MOD_EANE 178
#define VBIC_MOD_EANC 179
#define VBIC_MOD_EANS 180
#define VBIC_MOD_XIS 181
#define VBIC_MOD_XII 182
#define VBIC_MOD_XIN 183
#define VBIC_MOD_TNF 184
#define VBIC_MOD_TAVC 185
#define VBIC_MOD_RTH 186
#define VBIC_MOD_CTH 187
#define VBIC_MOD_VRT 188
#define VBIC_MOD_ART 189
#define VBIC_MOD_CCSO 190
#define VBIC_MOD_QBM 191
#define VBIC_MOD_NKF 192
#define VBIC_MOD_XIKF 193
#define VBIC_MOD_XRCX 194
#define VBIC_MOD_XRBX 195
#define VBIC_MOD_XRBP 196
#define VBIC_MOD_ISRR 197
#define VBIC_MOD_XISR 198
#define VBIC_MOD_DEAR 199
#define VBIC_MOD_EAP 200
#define VBIC_MOD_VBBE 201
#define VBIC_MOD_NBBE 202
#define VBIC_MOD_IBBE 203
#define VBIC_MOD_TVBBE1 204
#define VBIC_MOD_TVBBE2 205
#define VBIC_MOD_TNBBE 206
#define VBIC_MOD_EBBE 207
#define VBIC_MOD_DTEMP 208
#define VBIC_MOD_VERS 209
#define VBIC_MOD_VREF 210
#define VBIC_MOD_XRB 170
#define VBIC_MOD_XRBI 171
#define VBIC_MOD_XRC 172
#define VBIC_MOD_XRCI 173
#define VBIC_MOD_XRS 174
#define VBIC_MOD_XVO 175
#define VBIC_MOD_EA 176
#define VBIC_MOD_EAIE 177
#define VBIC_MOD_EAIC 178
#define VBIC_MOD_EAIS 179
#define VBIC_MOD_EANE 180
#define VBIC_MOD_EANC 181
#define VBIC_MOD_EANS 182
#define VBIC_MOD_XIS 183
#define VBIC_MOD_XII 184
#define VBIC_MOD_XIN 185
#define VBIC_MOD_TNF 186
#define VBIC_MOD_TAVC 187
#define VBIC_MOD_RTH 188
#define VBIC_MOD_CTH 189
#define VBIC_MOD_VRT 190
#define VBIC_MOD_ART 191
#define VBIC_MOD_CCSO 192
#define VBIC_MOD_QBM 193
#define VBIC_MOD_NKF 194
#define VBIC_MOD_XIKF 195
#define VBIC_MOD_XRCX 196
#define VBIC_MOD_XRBX 197
#define VBIC_MOD_XRBP 198
#define VBIC_MOD_ISRR 199
#define VBIC_MOD_XISR 200
#define VBIC_MOD_DEAR 201
#define VBIC_MOD_EAP 202
#define VBIC_MOD_VBBE 203
#define VBIC_MOD_NBBE 204
#define VBIC_MOD_IBBE 205
#define VBIC_MOD_TVBBE1 206
#define VBIC_MOD_TVBBE2 207
#define VBIC_MOD_TNBBE 208
#define VBIC_MOD_EBBE 209
#define VBIC_MOD_DTEMP 210
#define VBIC_MOD_VERS 211
#define VBIC_MOD_VREF 212
/* device questions */

View File

@ -709,14 +709,14 @@ VBICload(GENmodel *inModel, CKTcircuit *ckt)
Irbp_Vrbp = *(ckt->CKTstate0 + here->VBICirbp_Vrbp);
Irbp_Vbep = *(ckt->CKTstate0 + here->VBICirbp_Vbep);
Irbp_Vbci = *(ckt->CKTstate0 + here->VBICirbp_Vbci);
gqbeo = *(ckt->CKTstate0 + here->VBICgqbeo);
gqbco = *(ckt->CKTstate0 + here->VBICgqbco);
Ibcp = *(ckt->CKTstate0 + here->VBICibcp);
Ibcp_Vbcp = *(ckt->CKTstate0 + here->VBICibcp_Vbcp);
Iccp = *(ckt->CKTstate0 + here->VBICiccp);
Iccp_Vbep = *(ckt->CKTstate0 + here->VBICiccp_Vbep);
Iccp_Vbci = *(ckt->CKTstate0 + here->VBICiccp_Vbci);
Iccp_Vbcp = *(ckt->CKTstate0 + here->VBICiccp_Vbcp);
gqbeo = *(ckt->CKTstate0 + here->VBICgqbeo);
gqbco = *(ckt->CKTstate0 + here->VBICgqbco);
goto load;
}
/*
@ -772,6 +772,9 @@ next1:
if( (ckt->CKTmode & (MODETRAN | MODEAC)) ||
((ckt->CKTmode & MODETRANOP) && (ckt->CKTmode & MODEUIC)) ||
(ckt->CKTmode & MODEINITSMSIG)) {
/*
* charge storage elements
*/
*(ckt->CKTstate0 + here->VBICqbe) = Qbe;
*(ckt->CKTstate0 + here->VBICqbex) = Qbex;
@ -833,14 +836,14 @@ next1:
*(ckt->CKTstate0 + here->VBICirbp_Vrbp) = Irbp_Vrbp;
*(ckt->CKTstate0 + here->VBICirbp_Vbep) = Irbp_Vbep;
*(ckt->CKTstate0 + here->VBICirbp_Vbci) = Irbp_Vbci;
*(ckt->CKTstate0 + here->VBICgqbeo) = gqbeo;
*(ckt->CKTstate0 + here->VBICgqbco) = gqbco;
*(ckt->CKTstate0 + here->VBICibcp) = Ibcp;
*(ckt->CKTstate0 + here->VBICibcp_Vbcp) = Ibcp_Vbcp;
*(ckt->CKTstate0 + here->VBICiccp) = Iccp;
*(ckt->CKTstate0 + here->VBICiccp_Vbep) = Iccp_Vbep;
*(ckt->CKTstate0 + here->VBICiccp_Vbci) = Iccp_Vbci;
*(ckt->CKTstate0 + here->VBICiccp_Vbcp) = Iccp_Vbcp;
*(ckt->CKTstate0 + here->VBICgqbeo) = gqbeo;
*(ckt->CKTstate0 + here->VBICgqbco) = gqbco;
}
#ifdef SENSDEBUG
printf("storing small signal parameters for op\n");
@ -965,15 +968,16 @@ next1:
}
}
next2:
*(ckt->CKTstate0 + here->VBICvbei) = Vbei;
*(ckt->CKTstate0 + here->VBICvbex) = Vbex;
*(ckt->CKTstate0 + here->VBICvbci) = Vbci;
*(ckt->CKTstate0 + here->VBICvbcx) = Vbcx;
*(ckt->CKTstate0 + here->VBICvbep) = Vbep;
*(ckt->CKTstate0 + here->VBICvrci) = Vrci;
*(ckt->CKTstate0 + here->VBICvrbi) = Vrbi;
*(ckt->CKTstate0 + here->VBICvrbp) = Vrbp;
*(ckt->CKTstate0 + here->VBICvbcp) = Vbcp;
*(ckt->CKTstate0 + here->VBICvbei) = Vbei;
*(ckt->CKTstate0 + here->VBICvbex) = Vbex;
*(ckt->CKTstate0 + here->VBICvbci) = Vbci;
*(ckt->CKTstate0 + here->VBICvbcx) = Vbcx;
*(ckt->CKTstate0 + here->VBICvbep) = Vbep;
*(ckt->CKTstate0 + here->VBICvrci) = Vrci;
*(ckt->CKTstate0 + here->VBICvrbi) = Vrbi;
*(ckt->CKTstate0 + here->VBICvrbp) = Vrbp;
*(ckt->CKTstate0 + here->VBICvbcp) = Vbcp;
*(ckt->CKTstate0 + here->VBICibe) = Ibe;
*(ckt->CKTstate0 + here->VBICibe_Vbei) = Ibe_Vbei;
*(ckt->CKTstate0 + here->VBICibex) = Ibex;
@ -1001,8 +1005,6 @@ next2:
*(ckt->CKTstate0 + here->VBICirbp_Vrbp) = Irbp_Vrbp;
*(ckt->CKTstate0 + here->VBICirbp_Vbep) = Irbp_Vbep;
*(ckt->CKTstate0 + here->VBICirbp_Vbci) = Irbp_Vbci;
*(ckt->CKTstate0 + here->VBICgqbeo) = gqbeo;
*(ckt->CKTstate0 + here->VBICgqbco) = gqbco;
*(ckt->CKTstate0 + here->VBICibcp) = Ibcp;
*(ckt->CKTstate0 + here->VBICibcp_Vbcp) = Ibcp_Vbcp;
*(ckt->CKTstate0 + here->VBICiccp) = Iccp;
@ -1010,6 +1012,9 @@ next2:
*(ckt->CKTstate0 + here->VBICiccp_Vbci) = Iccp_Vbci;
*(ckt->CKTstate0 + here->VBICiccp_Vbcp) = Iccp_Vbcp;
*(ckt->CKTstate0 + here->VBICgqbeo) = gqbeo;
*(ckt->CKTstate0 + here->VBICgqbco) = gqbco;
/* Do not load the Jacobian and the rhs if
perturbation is being carried out */
if(SenCond) continue;
@ -1018,7 +1023,7 @@ load:
* load current excitation vector and matrix
*/
rhs_current = model->VBICtype * (*(ckt->CKTstate0 + here->VBICcqbeo) -
Vbe * gqbeo);
Vbe * gqbeo);
*(ckt->CKTrhs + here->VBICbaseNode) += -rhs_current;
*(ckt->CKTrhs + here->VBICemitNode) += rhs_current;
*(here->VBICbaseBasePtr) += gqbeo;
@ -1082,17 +1087,17 @@ c Stamp element: Itzf
/*
c Stamp element: Itzr
*/
rhs_current = model->VBICtype * (Itzr - Itzr_Vbci*Vbci - Itzr_Vbei*Vbei);
rhs_current = model->VBICtype * (Itzr - Itzr_Vbei*Vbei - Itzr_Vbci*Vbci);
*(ckt->CKTrhs + here->VBICemitEINode) += -rhs_current;
*(here->VBICemitEIBaseBIPtr) += Itzr_Vbci;
*(here->VBICemitEICollCIPtr) += -Itzr_Vbci;
*(here->VBICemitEIBaseBIPtr) += Itzr_Vbei;
*(here->VBICemitEIEmitEIPtr) += -Itzr_Vbei;
*(here->VBICemitEIBaseBIPtr) += Itzr_Vbci;
*(here->VBICemitEICollCIPtr) += -Itzr_Vbci;
*(ckt->CKTrhs + here->VBICcollCINode) += rhs_current;
*(here->VBICcollCIBaseBIPtr) += -Itzr_Vbci;
*(here->VBICcollCICollCIPtr) += Itzr_Vbci;
*(here->VBICcollCIBaseBIPtr) += -Itzr_Vbei;
*(here->VBICcollCIEmitEIPtr) += Itzr_Vbei;
*(here->VBICcollCIBaseBIPtr) += -Itzr_Vbci;
*(here->VBICcollCICollCIPtr) += Itzr_Vbci;
/*
c Stamp element: Ibc
*/
@ -1118,7 +1123,7 @@ c Stamp element: Ibep
*(here->VBICbaseBPBaseBXPtr) += -Ibep_Vbep;
*(here->VBICbaseBPBaseBPPtr) += Ibep_Vbep;
/*
c Stamp element: Ircx
c Stamp element: Rcx
*/
*(here->VBICcollCollPtr) += Ircx_Vrcx;
*(here->VBICcollCXCollCXPtr) += Ircx_Vrcx;
@ -1143,7 +1148,7 @@ c Stamp element: Irci
*(here->VBICcollCIBaseBIPtr) += -Irci_Vbcx;
*(here->VBICcollCICollCXPtr) += Irci_Vbcx;
/*
c Stamp element: Irbx
c Stamp element: Rbx
*/
*(here->VBICbaseBasePtr) += Irbx_Vrbx;
*(here->VBICbaseBXBaseBXPtr) += Irbx_Vrbx;
@ -1168,7 +1173,7 @@ c Stamp element: Irbi
*(here->VBICbaseBIBaseBIPtr) += -Irbi_Vbci;
*(here->VBICbaseBICollCIPtr) += Irbi_Vbci;
/*
c Stamp element: Ire
c Stamp element: Re
*/
*(here->VBICemitEmitPtr) += Ire_Vre;
*(here->VBICemitEIEmitEIPtr) += Ire_Vre;
@ -1221,7 +1226,7 @@ c Stamp element: Iccp
*(here->VBICsubsSISubsSIPtr) += -Iccp_Vbcp;
*(here->VBICsubsSIBaseBPPtr) += Iccp_Vbcp;
/*
c Stamp element: Irs
c Stamp element: Rs
*/
*(here->VBICsubsSubsPtr) += Irs_Vrs;
*(here->VBICsubsSISubsSIPtr) += Irs_Vrs;

View File

@ -172,14 +172,14 @@ VBICmAsk(CKTcircuit *ckt, GENmodel *instPtr, int which, IFvalue *value)
case VBIC_MOD_IBCNP:
value->rValue = here->VBICnidealParasitSatCurBC;
return(OK);
case VBIC_MOD_NCNP:
case VBIC_MOD_NCNP:
value->rValue = here->VBICnidealParasitEmissCoeffBC;
return(OK);
case VBIC_MOD_VEF:
value->rValue = here->VBICearlyVoltF;
case VBIC_MOD_VEF:
value->rValue = here->VBICearlyVoltF;
return(OK);
case VBIC_MOD_VER:
value->rValue = here->VBICearlyVoltR;
value->rValue = here->VBICearlyVoltR;
return(OK);
case VBIC_MOD_IKF:
value->rValue = here->VBICrollOffF;
@ -223,9 +223,15 @@ 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);
@ -286,13 +292,13 @@ VBICmAsk(CKTcircuit *ckt, GENmodel *instPtr, int which, IFvalue *value)
case VBIC_MOD_CCSO:
value->rValue = here->VBICfixedCapacitanceCS;
return(OK);
case VBIC_MOD_QBM:
value->rValue = here->VBICsgpQBselector;
case VBIC_MOD_QBM:
value->rValue = here->VBICsgpQBselector;
return(OK);
case VBIC_MOD_NKF:
value->rValue = here->VBIChighCurrentBetaRolloff;
case VBIC_MOD_NKF:
value->rValue = here->VBIChighCurrentBetaRolloff;
return(OK);
case VBIC_MOD_XIKF:
case VBIC_MOD_XIKF:
value->rValue = here->VBICtempExpIKF;
return(OK);
case VBIC_MOD_XRCX:
@ -346,11 +352,11 @@ VBICmAsk(CKTcircuit *ckt, GENmodel *instPtr, int which, IFvalue *value)
case VBIC_MOD_VREF:
value->rValue = here->VBICrefVersion;
return(OK);
case VBIC_MOD_TYPE:
if (here->VBICtype == NPN)
value->sValue = "npn";
else
value->sValue = "pnp";
case VBIC_MOD_TYPE:
if (here->VBICtype == NPN)
value->sValue = "npn";
else
value->sValue = "pnp";
return(OK);
default:
return(E_BADPARM);

View File

@ -73,7 +73,7 @@ VBICmParam(int param, IFvalue *value, GENmodel *inModel)
break;
case VBIC_MOD_RE:
mods->VBICemitterResist = value->rValue;
if (mods->VBICemitterResist < 0.1) mods->VBICemitterResist = 0.1;
if (mods->VBICemitterResist < 0.01) mods->VBICemitterResist = 0.01;
mods->VBICemitterResistGiven = TRUE;
break;
case VBIC_MOD_RS:
@ -242,17 +242,17 @@ VBICmParam(int param, IFvalue *value, GENmodel *inModel)
mods->VBICnidealParasitSatCurBC = value->rValue;
mods->VBICnidealParasitSatCurBCGiven = TRUE;
break;
case VBIC_MOD_NCNP:
case VBIC_MOD_NCNP:
mods->VBICnidealParasitEmissCoeffBC = value->rValue;
mods->VBICnidealParasitEmissCoeffBCGiven = TRUE;
break;
case VBIC_MOD_VEF:
mods->VBICearlyVoltF = value->rValue;
mods->VBICearlyVoltFGiven = TRUE;
break;
break;
case VBIC_MOD_VEF:
mods->VBICearlyVoltF = value->rValue;
mods->VBICearlyVoltFGiven = TRUE;
break;
case VBIC_MOD_VER:
mods->VBICearlyVoltR = value->rValue;
mods->VBICearlyVoltRGiven = TRUE;
mods->VBICearlyVoltR = value->rValue;
mods->VBICearlyVoltRGiven = TRUE;
break;
case VBIC_MOD_IKF:
mods->VBICrollOffF = value->rValue;
@ -310,10 +310,18 @@ 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;
@ -394,15 +402,15 @@ VBICmParam(int param, IFvalue *value, GENmodel *inModel)
mods->VBICfixedCapacitanceCS = value->rValue;
mods->VBICfixedCapacitanceCSGiven = TRUE;
break;
case VBIC_MOD_QBM:
mods->VBICsgpQBselector = value->rValue;
mods->VBICsgpQBselectorGiven = TRUE;
break;
case VBIC_MOD_NKF:
mods->VBIChighCurrentBetaRolloff = value->rValue;
mods->VBIChighCurrentBetaRolloffGiven = TRUE;
break;
case VBIC_MOD_XIKF:
case VBIC_MOD_QBM:
mods->VBICsgpQBselector = value->rValue;
mods->VBICsgpQBselectorGiven = TRUE;
break;
case VBIC_MOD_NKF:
mods->VBIChighCurrentBetaRolloff = value->rValue;
mods->VBIChighCurrentBetaRolloffGiven = TRUE;
break;
case VBIC_MOD_XIKF:
mods->VBICtempExpIKF = value->rValue;
mods->VBICtempExpIKFGiven = TRUE;
break;

View File

@ -41,6 +41,7 @@ VBICpzLoad(GENmodel *inModel, CKTcircuit *ckt, SPcomplex *s)
if (here->VBICowner != ARCHme) continue;
Ircx_Vrcx = 1.0 / here->VBICtextCollResist * here->VBICarea * here->VBICm;
Irbx_Vrbx = 1.0 / here->VBICtextBaseResist * here->VBICarea * here->VBICm;
Ire_Vre = 1.0 / here->VBICtemitterResist * here->VBICarea * here->VBICm;

View File

@ -63,7 +63,7 @@ VBICsetup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt, int *states)
model->VBICintBaseResist = 0.1;
}
if(!model->VBICemitterResistGiven) {
model->VBICemitterResist = 0.1;
model->VBICemitterResist = 0.01;
}
if(!model->VBICsubstrateResistGiven) {
model->VBICsubstrateResist = 0.1;
@ -149,12 +149,12 @@ VBICsetup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt, int *states)
if(!model->VBICidealSatCurBCGiven) {
model->VBICidealSatCurBC = 1e-16;
}
if(!model->VBICidealEmissCoeffBCGiven) {
model->VBICidealEmissCoeffBC = 1.0;
}
if(!model->VBICnidealSatCurBCGiven) {
model->VBICnidealSatCurBC = 0.0;
}
if(!model->VBICidealEmissCoeffBCGiven) {
model->VBICidealEmissCoeffBC = 1.0;
}
if(!model->VBICnidealSatCurBCGiven) {
model->VBICnidealSatCurBC = 0.0;
}
if(!model->VBICnidealEmissCoeffBCGiven) {
model->VBICnidealEmissCoeffBC = 2.0;
}
@ -239,9 +239,15 @@ 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;
}
@ -266,12 +272,12 @@ VBICsetup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt, int *states)
if(!model->VBICactivEnergyEANEGiven) {
model->VBICactivEnergyEANE = 1.12;
}
if(!model->VBICactivEnergyEANCGiven) {
model->VBICactivEnergyEANC = 1.12;
}
if(!model->VBICactivEnergyEANSGiven) {
model->VBICactivEnergyEANS = 1.12;
}
if(!model->VBICactivEnergyEANCGiven) {
model->VBICactivEnergyEANC = 1.12;
}
if(!model->VBICactivEnergyEANSGiven) {
model->VBICactivEnergyEANS = 1.12;
}
if(!model->VBICtempExpISGiven) {
model->VBICtempExpIS = 3.0;
}
@ -462,10 +468,6 @@ matrixpointers:
if(error) return(error);
here->VBICbaseBINode = tmp->number;
error = CKTmkVolt(ckt, &tmp, here->VBICname, "subsSI");
if(error) return(error);
here->VBICsubsSINode = tmp->number;
/* macro to make elements with built in test for out of memory */
#define TSTALLOC(ptr,first,second) \
if((here->ptr = SMPmakeElt(matrix,here->first,here->second))==(double *)NULL){\
@ -539,54 +541,51 @@ VBICunsetup(inModel,ckt)
VBICinstance *here;
for (model = (VBICmodel *)inModel; model != NULL;
model = model->VBICnextModel)
model = model->VBICnextModel)
{
for (here = model->VBICinstances; here != NULL;
here=here->VBICnextInstance)
{
if (here->VBICcollCXNode
&& here->VBICcollCXNode != here->VBICcollNode)
{
CKTdltNNum(ckt, here->VBICcollCXNode);
here->VBICcollCXNode = 0;
}
if (here->VBICcollCINode
&& here->VBICcollCINode != here->VBICcollNode)
{
CKTdltNNum(ckt, here->VBICcollCINode);
here->VBICcollCINode = 0;
}
if (here->VBICbaseBXNode
&& here->VBICbaseBXNode != here->VBICbaseNode)
{
CKTdltNNum(ckt, here->VBICbaseBXNode);
here->VBICbaseBXNode = 0;
}
if (here->VBICbaseBINode
&& here->VBICbaseBINode != here->VBICbaseNode)
{
CKTdltNNum(ckt, here->VBICbaseBINode);
here->VBICbaseBINode = 0;
}
if (here->VBICbaseBPNode
&& here->VBICbaseBPNode != here->VBICbaseNode)
{
CKTdltNNum(ckt, here->VBICbaseBPNode);
here->VBICbaseBPNode = 0;
}
if (here->VBICemitEINode
&& here->VBICemitEINode != here->VBICemitNode)
{
CKTdltNNum(ckt, here->VBICemitEINode);
here->VBICemitEINode = 0;
}
if (here->VBICsubsSINode
&& here->VBICsubsSINode != here->VBICsubsNode)
{
CKTdltNNum(ckt, here->VBICsubsSINode);
here->VBICsubsSINode = 0;
}
}
{
if (here->VBICcollCXNode
&& here->VBICcollCXNode != here->VBICcollNode)
{
CKTdltNNum(ckt, here->VBICcollCXNode);
here->VBICcollCXNode = 0;
}
if (here->VBICbaseBXNode
&& here->VBICbaseBXNode != here->VBICbaseNode)
{
CKTdltNNum(ckt, here->VBICbaseBXNode);
here->VBICbaseBXNode = 0;
}
if (here->VBICemitEINode
&& here->VBICemitEINode != here->VBICemitNode)
{
CKTdltNNum(ckt, here->VBICemitEINode);
here->VBICemitEINode = 0;
}
if (here->VBICsubsSINode
&& here->VBICsubsSINode != here->VBICsubsNode)
{
CKTdltNNum(ckt, here->VBICsubsSINode);
here->VBICsubsSINode = 0;
}
if (here->VBICcollCINode)
{
CKTdltNNum(ckt, here->VBICcollCINode);
here->VBICcollCINode = 0;
}
if (here->VBICbaseBINode)
{
CKTdltNNum(ckt, here->VBICbaseBINode);
here->VBICbaseBINode = 0;
}
if (here->VBICbaseBPNode)
{
CKTdltNNum(ckt, here->VBICbaseBPNode);
here->VBICbaseBPNode = 0;
}
}
}
return OK;
}

View File

@ -53,6 +53,19 @@ VBICtemp(GENmodel *inModel, CKTcircuit *ckt)
model->VBICsubstrateConduct = 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;
}
/* loop through all the instances of the model */
for (here = model->VBICinstances; here != NULL ;
here=here->VBICnextInstance) {