Patch sent by Dietmar Warning: fixed double allocation of substrate node, current sign and tempo for rb and rc.
This commit is contained in:
parent
75f2db1483
commit
d921759a2a
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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"),
|
||||
|
|
|
|||
|
|
@ -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 */
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
Loading…
Reference in New Issue