diff --git a/ChangeLog b/ChangeLog
index e7979a0f4..160f4179e 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+2005-11-07 Paolo Nenzi
+
+ * 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
* src/Makefile.am: Implemented fix to prevent 'multiple definition' errors
diff --git a/src/spicelib/devices/vbic/vbic.c b/src/spicelib/devices/vbic/vbic.c
index 3cd32aa15..54abf110a 100644
--- a/src/spicelib/devices/vbic/vbic.c
+++ b/src/spicelib/devices/vbic/vbic.c
@@ -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"),
diff --git a/src/spicelib/devices/vbic/vbicdefs.h b/src/spicelib/devices/vbic/vbicdefs.h
index 9fef0d9d3..2258c5a4f 100644
--- a/src/spicelib/devices/vbic/vbicdefs.h
+++ b/src/spicelib/devices/vbic/vbicdefs.h
@@ -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 */
diff --git a/src/spicelib/devices/vbic/vbicload.c b/src/spicelib/devices/vbic/vbicload.c
index 2459e3726..002147601 100644
--- a/src/spicelib/devices/vbic/vbicload.c
+++ b/src/spicelib/devices/vbic/vbicload.c
@@ -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;
diff --git a/src/spicelib/devices/vbic/vbicmask.c b/src/spicelib/devices/vbic/vbicmask.c
index babc94cd0..df6533934 100644
--- a/src/spicelib/devices/vbic/vbicmask.c
+++ b/src/spicelib/devices/vbic/vbicmask.c
@@ -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);
diff --git a/src/spicelib/devices/vbic/vbicmpar.c b/src/spicelib/devices/vbic/vbicmpar.c
index 66ffaaaf6..f6985ff4e 100644
--- a/src/spicelib/devices/vbic/vbicmpar.c
+++ b/src/spicelib/devices/vbic/vbicmpar.c
@@ -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;
diff --git a/src/spicelib/devices/vbic/vbicpzld.c b/src/spicelib/devices/vbic/vbicpzld.c
index e3e0465d9..f6465cabb 100644
--- a/src/spicelib/devices/vbic/vbicpzld.c
+++ b/src/spicelib/devices/vbic/vbicpzld.c
@@ -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;
diff --git a/src/spicelib/devices/vbic/vbicsetup.c b/src/spicelib/devices/vbic/vbicsetup.c
index 27aeae2dc..038d216ae 100644
--- a/src/spicelib/devices/vbic/vbicsetup.c
+++ b/src/spicelib/devices/vbic/vbicsetup.c
@@ -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;
}
diff --git a/src/spicelib/devices/vbic/vbictemp.c b/src/spicelib/devices/vbic/vbictemp.c
index 1f9755922..a7486893a 100644
--- a/src/spicelib/devices/vbic/vbictemp.c
+++ b/src/spicelib/devices/vbic/vbictemp.c
@@ -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) {