Browse Source

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

pre-master-46
pnenzi 21 years ago
parent
commit
d921759a2a
  1. 9
      ChangeLog
  2. 2
      src/spicelib/devices/vbic/vbic.c
  3. 114
      src/spicelib/devices/vbic/vbicdefs.h
  4. 55
      src/spicelib/devices/vbic/vbicload.c
  5. 34
      src/spicelib/devices/vbic/vbicmask.c
  6. 44
      src/spicelib/devices/vbic/vbicmpar.c
  7. 1
      src/spicelib/devices/vbic/vbicpzld.c
  8. 123
      src/spicelib/devices/vbic/vbicsetup.c
  9. 13
      src/spicelib/devices/vbic/vbictemp.c

9
ChangeLog

@ -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> 2005-10-19 Steven Borley <steven.borley@virgin.net>
* src/Makefile.am: Implemented fix to prevent 'multiple definition' errors * src/Makefile.am: Implemented fix to prevent 'multiple definition' errors

2
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("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("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("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("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("xrci", VBIC_MOD_XRCI, IF_REAL, "Temperature exponent of RCI"),
IOP("xrs", VBIC_MOD_XRS, IF_REAL, "Temperature exponent of RS"), IOP("xrs", VBIC_MOD_XRS, IF_REAL, "Temperature exponent of RS"),
IOP("xvo", VBIC_MOD_XVO, IF_REAL, "Temperature exponent of VO"), IOP("xvo", VBIC_MOD_XVO, IF_REAL, "Temperature exponent of VO"),

114
src/spicelib/devices/vbic/vbicdefs.h

@ -226,13 +226,13 @@ typedef struct sVBICinstance {
#define VBICRBINOIZ 3 #define VBICRBINOIZ 3
#define VBICRENOIZ 4 #define VBICRENOIZ 4
#define VBICRBPNOIZ 5 #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 VBICTOTNOIZ 13
#define VBICNSRCS 14 /* the number of VBIC noise sources */ #define VBICNSRCS 14 /* the number of VBIC noise sources */
@ -333,13 +333,13 @@ typedef struct sVBICinstance {
#define VBICnumStates 62 #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 */ 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 #define VBICnumSenStates 10
@ -422,7 +422,9 @@ typedef struct sVBICmodel { /* model structure for a vbic */
double VBICfNexpA; double VBICfNexpA;
double VBICfNexpB; double VBICfNexpB;
double VBICtempExpRE; double VBICtempExpRE;
double VBICtempExpRB;
double VBICtempExpRBI; double VBICtempExpRBI;
double VBICtempExpRC;
double VBICtempExpRCI; double VBICtempExpRCI;
double VBICtempExpRS; double VBICtempExpRS;
double VBICtempExpVO; double VBICtempExpVO;
@ -536,7 +538,9 @@ typedef struct sVBICmodel { /* model structure for a vbic */
unsigned VBICfNexpAGiven : 1; unsigned VBICfNexpAGiven : 1;
unsigned VBICfNexpBGiven : 1; unsigned VBICfNexpBGiven : 1;
unsigned VBICtempExpREGiven : 1; unsigned VBICtempExpREGiven : 1;
unsigned VBICtempExpRBGiven : 1;
unsigned VBICtempExpRBIGiven : 1; unsigned VBICtempExpRBIGiven : 1;
unsigned VBICtempExpRCGiven : 1;
unsigned VBICtempExpRCIGiven : 1; unsigned VBICtempExpRCIGiven : 1;
unsigned VBICtempExpRSGiven : 1; unsigned VBICtempExpRSGiven : 1;
unsigned VBICtempExpVOGiven : 1; unsigned VBICtempExpVOGiven : 1;
@ -664,47 +668,49 @@ typedef struct sVBICmodel { /* model structure for a vbic */
#define VBIC_MOD_AFN 167 #define VBIC_MOD_AFN 167
#define VBIC_MOD_BFN 168 #define VBIC_MOD_BFN 168
#define VBIC_MOD_XRE 169 #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 */ /* device questions */

55
src/spicelib/devices/vbic/vbicload.c

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

34
src/spicelib/devices/vbic/vbicmask.c

@ -172,14 +172,14 @@ VBICmAsk(CKTcircuit *ckt, GENmodel *instPtr, int which, IFvalue *value)
case VBIC_MOD_IBCNP: case VBIC_MOD_IBCNP:
value->rValue = here->VBICnidealParasitSatCurBC; value->rValue = here->VBICnidealParasitSatCurBC;
return(OK); return(OK);
case VBIC_MOD_NCNP:
case VBIC_MOD_NCNP:
value->rValue = here->VBICnidealParasitEmissCoeffBC; value->rValue = here->VBICnidealParasitEmissCoeffBC;
return(OK); return(OK);
case VBIC_MOD_VEF:
value->rValue = here->VBICearlyVoltF;
case VBIC_MOD_VEF:
value->rValue = here->VBICearlyVoltF;
return(OK); return(OK);
case VBIC_MOD_VER: case VBIC_MOD_VER:
value->rValue = here->VBICearlyVoltR;
value->rValue = here->VBICearlyVoltR;
return(OK); return(OK);
case VBIC_MOD_IKF: case VBIC_MOD_IKF:
value->rValue = here->VBICrollOffF; value->rValue = here->VBICrollOffF;
@ -223,9 +223,15 @@ VBICmAsk(CKTcircuit *ckt, GENmodel *instPtr, int which, IFvalue *value)
case VBIC_MOD_XRE: case VBIC_MOD_XRE:
value->rValue = here->VBICtempExpRE; value->rValue = here->VBICtempExpRE;
return(OK); return(OK);
case VBIC_MOD_XRB:
value->rValue = here->VBICtempExpRB;
return(OK);
case VBIC_MOD_XRBI: case VBIC_MOD_XRBI:
value->rValue = here->VBICtempExpRBI; value->rValue = here->VBICtempExpRBI;
return(OK); return(OK);
case VBIC_MOD_XRC:
value->rValue = here->VBICtempExpRC;
return(OK);
case VBIC_MOD_XRCI: case VBIC_MOD_XRCI:
value->rValue = here->VBICtempExpRCI; value->rValue = here->VBICtempExpRCI;
return(OK); return(OK);
@ -286,13 +292,13 @@ VBICmAsk(CKTcircuit *ckt, GENmodel *instPtr, int which, IFvalue *value)
case VBIC_MOD_CCSO: case VBIC_MOD_CCSO:
value->rValue = here->VBICfixedCapacitanceCS; value->rValue = here->VBICfixedCapacitanceCS;
return(OK); return(OK);
case VBIC_MOD_QBM:
value->rValue = here->VBICsgpQBselector;
case VBIC_MOD_QBM:
value->rValue = here->VBICsgpQBselector;
return(OK); return(OK);
case VBIC_MOD_NKF:
value->rValue = here->VBIChighCurrentBetaRolloff;
case VBIC_MOD_NKF:
value->rValue = here->VBIChighCurrentBetaRolloff;
return(OK); return(OK);
case VBIC_MOD_XIKF:
case VBIC_MOD_XIKF:
value->rValue = here->VBICtempExpIKF; value->rValue = here->VBICtempExpIKF;
return(OK); return(OK);
case VBIC_MOD_XRCX: case VBIC_MOD_XRCX:
@ -346,11 +352,11 @@ VBICmAsk(CKTcircuit *ckt, GENmodel *instPtr, int which, IFvalue *value)
case VBIC_MOD_VREF: case VBIC_MOD_VREF:
value->rValue = here->VBICrefVersion; value->rValue = here->VBICrefVersion;
return(OK); 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); return(OK);
default: default:
return(E_BADPARM); return(E_BADPARM);

44
src/spicelib/devices/vbic/vbicmpar.c

@ -73,7 +73,7 @@ VBICmParam(int param, IFvalue *value, GENmodel *inModel)
break; break;
case VBIC_MOD_RE: case VBIC_MOD_RE:
mods->VBICemitterResist = value->rValue; 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; mods->VBICemitterResistGiven = TRUE;
break; break;
case VBIC_MOD_RS: case VBIC_MOD_RS:
@ -242,17 +242,17 @@ VBICmParam(int param, IFvalue *value, GENmodel *inModel)
mods->VBICnidealParasitSatCurBC = value->rValue; mods->VBICnidealParasitSatCurBC = value->rValue;
mods->VBICnidealParasitSatCurBCGiven = TRUE; mods->VBICnidealParasitSatCurBCGiven = TRUE;
break; break;
case VBIC_MOD_NCNP:
case VBIC_MOD_NCNP:
mods->VBICnidealParasitEmissCoeffBC = value->rValue; mods->VBICnidealParasitEmissCoeffBC = value->rValue;
mods->VBICnidealParasitEmissCoeffBCGiven = TRUE; 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: case VBIC_MOD_VER:
mods->VBICearlyVoltR = value->rValue;
mods->VBICearlyVoltRGiven = TRUE;
mods->VBICearlyVoltR = value->rValue;
mods->VBICearlyVoltRGiven = TRUE;
break; break;
case VBIC_MOD_IKF: case VBIC_MOD_IKF:
mods->VBICrollOffF = value->rValue; mods->VBICrollOffF = value->rValue;
@ -310,10 +310,18 @@ VBICmParam(int param, IFvalue *value, GENmodel *inModel)
mods->VBICtempExpRE = value->rValue; mods->VBICtempExpRE = value->rValue;
mods->VBICtempExpREGiven = TRUE; mods->VBICtempExpREGiven = TRUE;
break; break;
case VBIC_MOD_XRB:
mods->VBICtempExpRB = value->rValue;
mods->VBICtempExpRBGiven = TRUE;
break;
case VBIC_MOD_XRBI: case VBIC_MOD_XRBI:
mods->VBICtempExpRBI = value->rValue; mods->VBICtempExpRBI = value->rValue;
mods->VBICtempExpRBIGiven = TRUE; mods->VBICtempExpRBIGiven = TRUE;
break; break;
case VBIC_MOD_XRC:
mods->VBICtempExpRC = value->rValue;
mods->VBICtempExpRCGiven = TRUE;
break;
case VBIC_MOD_XRCI: case VBIC_MOD_XRCI:
mods->VBICtempExpRCI = value->rValue; mods->VBICtempExpRCI = value->rValue;
mods->VBICtempExpRCIGiven = TRUE; mods->VBICtempExpRCIGiven = TRUE;
@ -394,15 +402,15 @@ VBICmParam(int param, IFvalue *value, GENmodel *inModel)
mods->VBICfixedCapacitanceCS = value->rValue; mods->VBICfixedCapacitanceCS = value->rValue;
mods->VBICfixedCapacitanceCSGiven = TRUE; mods->VBICfixedCapacitanceCSGiven = TRUE;
break; 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->VBICtempExpIKF = value->rValue;
mods->VBICtempExpIKFGiven = TRUE; mods->VBICtempExpIKFGiven = TRUE;
break; break;

1
src/spicelib/devices/vbic/vbicpzld.c

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

123
src/spicelib/devices/vbic/vbicsetup.c

@ -63,7 +63,7 @@ VBICsetup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt, int *states)
model->VBICintBaseResist = 0.1; model->VBICintBaseResist = 0.1;
} }
if(!model->VBICemitterResistGiven) { if(!model->VBICemitterResistGiven) {
model->VBICemitterResist = 0.1;
model->VBICemitterResist = 0.01;
} }
if(!model->VBICsubstrateResistGiven) { if(!model->VBICsubstrateResistGiven) {
model->VBICsubstrateResist = 0.1; model->VBICsubstrateResist = 0.1;
@ -149,12 +149,12 @@ VBICsetup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt, int *states)
if(!model->VBICidealSatCurBCGiven) { if(!model->VBICidealSatCurBCGiven) {
model->VBICidealSatCurBC = 1e-16; 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) { if(!model->VBICnidealEmissCoeffBCGiven) {
model->VBICnidealEmissCoeffBC = 2.0; model->VBICnidealEmissCoeffBC = 2.0;
} }
@ -239,9 +239,15 @@ VBICsetup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt, int *states)
if(!model->VBICtempExpREGiven) { if(!model->VBICtempExpREGiven) {
model->VBICtempExpRE = 0.0; model->VBICtempExpRE = 0.0;
} }
if(!model->VBICtempExpRBGiven) {
model->VBICtempExpRB = 0.0;
}
if(!model->VBICtempExpRBIGiven) { if(!model->VBICtempExpRBIGiven) {
model->VBICtempExpRBI = 0.0; model->VBICtempExpRBI = 0.0;
} }
if(!model->VBICtempExpRCGiven) {
model->VBICtempExpRC = 0.0;
}
if(!model->VBICtempExpRCIGiven) { if(!model->VBICtempExpRCIGiven) {
model->VBICtempExpRCI = 0.0; model->VBICtempExpRCI = 0.0;
} }
@ -266,12 +272,12 @@ VBICsetup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt, int *states)
if(!model->VBICactivEnergyEANEGiven) { if(!model->VBICactivEnergyEANEGiven) {
model->VBICactivEnergyEANE = 1.12; 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) { if(!model->VBICtempExpISGiven) {
model->VBICtempExpIS = 3.0; model->VBICtempExpIS = 3.0;
} }
@ -462,10 +468,6 @@ matrixpointers:
if(error) return(error); if(error) return(error);
here->VBICbaseBINode = tmp->number; 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 */ /* macro to make elements with built in test for out of memory */
#define TSTALLOC(ptr,first,second) \ #define TSTALLOC(ptr,first,second) \
if((here->ptr = SMPmakeElt(matrix,here->first,here->second))==(double *)NULL){\ if((here->ptr = SMPmakeElt(matrix,here->first,here->second))==(double *)NULL){\
@ -539,54 +541,51 @@ VBICunsetup(inModel,ckt)
VBICinstance *here; VBICinstance *here;
for (model = (VBICmodel *)inModel; model != NULL; for (model = (VBICmodel *)inModel; model != NULL;
model = model->VBICnextModel)
model = model->VBICnextModel)
{ {
for (here = model->VBICinstances; here != NULL; for (here = model->VBICinstances; here != NULL;
here=here->VBICnextInstance) 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; return OK;
} }

13
src/spicelib/devices/vbic/vbictemp.c

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

Loading…
Cancel
Save