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) {