Updated vbic code (4 terminal model - no excess phase - no thermal)

This commit is contained in:
pnenzi 2004-06-22 11:19:24 +00:00
parent 8a9766a401
commit 7a8a00e968
16 changed files with 730 additions and 187 deletions

View File

@ -1,3 +1,10 @@
2004-06-22 Paolo Nenzi <p.nenzi@ieee.org>
* src/spicelib/devices/vbic: Vbic code updated. Thanks to Dietmar
Warning (warning@danalyse.de )now we have the four terminal
version of the VBIC model. The old three terminal version has
been discarded.
2004-06-21 Paolo Nenzi <p.nenzi@ieee.org> 2004-06-21 Paolo Nenzi <p.nenzi@ieee.org>
* src/frontend/subckt.c: patch from Stuart Brorson * src/frontend/subckt.c: patch from Stuart Brorson

View File

@ -327,7 +327,7 @@ VBIC - Bipolar Junction Transistor
Web Site: Web Site:
http://www.designers-guide.com/VBIC/index.html http://www.designers-guide.com/VBIC/index.html
Notes: This is the three terminals model, without excess phase Notes: This is the 4 terminals model, without excess phase
and thermal network. and thermal network.

View File

@ -28,17 +28,20 @@ IFparm VBICpTable[] = { /* parameters */
OPU("collnode", VBIC_QUEST_COLLNODE, IF_INTEGER, "Number of collector node"), OPU("collnode", VBIC_QUEST_COLLNODE, IF_INTEGER, "Number of collector node"),
OPU("basenode", VBIC_QUEST_BASENODE, IF_INTEGER, "Number of base node"), OPU("basenode", VBIC_QUEST_BASENODE, IF_INTEGER, "Number of base node"),
OPU("emitnode", VBIC_QUEST_EMITNODE, IF_INTEGER, "Number of emitter node"), OPU("emitnode", VBIC_QUEST_EMITNODE, IF_INTEGER, "Number of emitter node"),
OPU("subsnode", VBIC_QUEST_SUBSNODE, IF_INTEGER, "Number of substrate node"),
OPU("collCXnode",VBIC_QUEST_COLLCXNODE,IF_INTEGER, "Internal collector node"), OPU("collCXnode",VBIC_QUEST_COLLCXNODE,IF_INTEGER, "Internal collector node"),
OPU("collCInode",VBIC_QUEST_COLLCINODE,IF_INTEGER, "Internal collector node"), OPU("collCInode",VBIC_QUEST_COLLCINODE,IF_INTEGER, "Internal collector node"),
OPU("baseBXnode",VBIC_QUEST_BASEBXNODE,IF_INTEGER, "Internal base node"), OPU("baseBXnode",VBIC_QUEST_BASEBXNODE,IF_INTEGER, "Internal base node"),
OPU("baseBInode",VBIC_QUEST_BASEBINODE,IF_INTEGER, "Internal base node"), OPU("baseBInode",VBIC_QUEST_BASEBINODE,IF_INTEGER, "Internal base node"),
OPU("baseBPnode",VBIC_QUEST_BASEBPNODE,IF_INTEGER, "Internal base node"), OPU("baseBPnode",VBIC_QUEST_BASEBPNODE,IF_INTEGER, "Internal base node"),
OPU("emitEInode",VBIC_QUEST_EMITEINODE,IF_INTEGER, "Internal emitter node"), OPU("emitEInode",VBIC_QUEST_EMITEINODE,IF_INTEGER, "Internal emitter node"),
OPU("subsSInode",VBIC_QUEST_SUBSSINODE,IF_INTEGER, "Internal substrate node"),
OP("vbe", VBIC_QUEST_VBE, IF_REAL, "B-E voltage"), OP("vbe", VBIC_QUEST_VBE, IF_REAL, "B-E voltage"),
OP("vbc", VBIC_QUEST_VBC, IF_REAL, "B-C voltage"), OP("vbc", VBIC_QUEST_VBC, IF_REAL, "B-C voltage"),
OP("ic", VBIC_QUEST_CC, IF_REAL, "Collector current"), OP("ic", VBIC_QUEST_CC, IF_REAL, "Collector current"),
OP("ib", VBIC_QUEST_CB, IF_REAL, "Base current"), OP("ib", VBIC_QUEST_CB, IF_REAL, "Base current"),
OP("ie", VBIC_QUEST_CE, IF_REAL, "Emitter current"), OP("ie", VBIC_QUEST_CE, IF_REAL, "Emitter current"),
OP("is", VBIC_QUEST_CS, IF_REAL, "Substrate current"),
OP("gm", VBIC_QUEST_GM, IF_REAL, "Small signal transconductance dIc/dVbe"), OP("gm", VBIC_QUEST_GM, IF_REAL, "Small signal transconductance dIc/dVbe"),
OP("go", VBIC_QUEST_GO, IF_REAL, "Small signal output conductance dIc/dVbc"), OP("go", VBIC_QUEST_GO, IF_REAL, "Small signal output conductance dIc/dVbc"),
OP("gpi", VBIC_QUEST_GPI, IF_REAL, "Small signal input conductance dIb/dVbe"), OP("gpi", VBIC_QUEST_GPI, IF_REAL, "Small signal input conductance dIb/dVbe"),
@ -48,6 +51,8 @@ IFparm VBICpTable[] = { /* parameters */
OP("cbex", VBIC_QUEST_CBEX, IF_REAL, "External base to emitter capacitance"), OP("cbex", VBIC_QUEST_CBEX, IF_REAL, "External base to emitter capacitance"),
OP("cbc", VBIC_QUEST_CBC, IF_REAL, "Internal base to collector capacitance"), OP("cbc", VBIC_QUEST_CBC, IF_REAL, "Internal base to collector capacitance"),
OP("cbcx", VBIC_QUEST_CBCX, IF_REAL, "External Base to collector capacitance"), OP("cbcx", VBIC_QUEST_CBCX, IF_REAL, "External Base to collector capacitance"),
OP("cbep", VBIC_QUEST_CBEP, IF_REAL, "Parasitic Base to emitter capacitance"),
OP("cbcp", VBIC_QUEST_CBCP, IF_REAL, "Parasitic Base to collector capacitance"),
OP("p", VBIC_QUEST_POWER,IF_REAL, "Power dissipation"), OP("p", VBIC_QUEST_POWER,IF_REAL, "Power dissipation"),
OPU("geqcb",VBIC_QUEST_GEQCB,IF_REAL, "Internal C-B-base cap. equiv. cond."), OPU("geqcb",VBIC_QUEST_GEQCB,IF_REAL, "Internal C-B-base cap. equiv. cond."),
OPU("geqbx",VBIC_QUEST_GEQBX,IF_REAL, "External C-B-base cap. equiv. cond."), OPU("geqbx",VBIC_QUEST_GEQBX,IF_REAL, "External C-B-base cap. equiv. cond."),
@ -176,7 +181,7 @@ IFparm VBICmPTable[] = { /* model parameters */
IOP("ebbe", VBIC_MOD_EBBE, IF_REAL, "exp(-VBBE/(NBBE*Vtv))"), IOP("ebbe", VBIC_MOD_EBBE, IF_REAL, "exp(-VBBE/(NBBE*Vtv))"),
IOP("dtemp", VBIC_MOD_DTEMP, IF_REAL, "Locale Temperature difference"), IOP("dtemp", VBIC_MOD_DTEMP, IF_REAL, "Locale Temperature difference"),
IOP("vers", VBIC_MOD_VERS, IF_REAL, "Revision Version"), IOP("vers", VBIC_MOD_VERS, IF_REAL, "Revision Version"),
IOP("vref", VBIC_MOD_VREF, IF_REAL, "Reference Version"), IOP("vref", VBIC_MOD_VREF, IF_REAL, "Reference Version")
}; };
char *VBICnames[] = { char *VBICnames[] = {

View File

@ -26,9 +26,11 @@ VBICacLoad(GENmodel *inModel, CKTcircuit *ckt)
,Itzf_Vbei,Itzf_Vbci,Itzr_Vbci,Itzr_Vbei,Ibc_Vbci ,Itzf_Vbei,Itzf_Vbci,Itzr_Vbci,Itzr_Vbei,Ibc_Vbci
,Ibc_Vbei,Ibep_Vbep,Ircx_Vrcx,Irci_Vrci ,Ibc_Vbei,Ibep_Vbep,Ircx_Vrcx,Irci_Vrci
,Irci_Vbci,Irci_Vbcx,Irbx_Vrbx,Irbi_Vrbi,Irbi_Vbei ,Irci_Vbci,Irci_Vbcx,Irbx_Vrbx,Irbi_Vrbi,Irbi_Vbei
,Irbi_Vbci,Ire_Vre,Irbp_Vrbp,Irbp_Vbep,Irbp_Vbci; ,Irbi_Vbci,Ire_Vre,Irbp_Vrbp,Irbp_Vbep,Irbp_Vbci
,Ibcp_Vbcp,Iccp_Vbep,Irs_Vrs,Iccp_Vbci,Iccp_Vbcp;
double XQbe_Vbei, XQbe_Vbci, XQbex_Vbex, XQbc_Vbci, double XQbe_Vbei, XQbe_Vbci, XQbex_Vbex, XQbc_Vbci,
XQbcx_Vbcx, XQbep_Vbep, XQbep_Vbci; XQbcx_Vbcx, XQbep_Vbep, XQbep_Vbci,
XQbcp_Vbcp;
/* loop through all the models */ /* loop through all the models */
for( ; model != NULL; model = model->VBICnextModel) { for( ; model != NULL; model = model->VBICnextModel) {
@ -42,6 +44,7 @@ VBICacLoad(GENmodel *inModel, CKTcircuit *ckt)
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;
Irs_Vrs = 1.0 / here->VBICtsubstrateResist * here->VBICarea * here->VBICm;
Ibe_Vbei = *(ckt->CKTstate0 + here->VBICibe_Vbei); Ibe_Vbei = *(ckt->CKTstate0 + here->VBICibe_Vbei);
Ibex_Vbex = *(ckt->CKTstate0 + here->VBICibex_Vbex); Ibex_Vbex = *(ckt->CKTstate0 + here->VBICibex_Vbex);
@ -61,6 +64,10 @@ VBICacLoad(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);
Ibcp_Vbcp = *(ckt->CKTstate0 + here->VBICibcp_Vbcp);
Iccp_Vbep = *(ckt->CKTstate0 + here->VBICiccp_Vbep);
Iccp_Vbci = *(ckt->CKTstate0 + here->VBICiccp_Vbci);
Iccp_Vbcp = *(ckt->CKTstate0 + here->VBICiccp_Vbcp);
/* /*
c The real part c The real part
@ -186,6 +193,35 @@ c Stamp element: Irbp
*(here->VBICcollCXBaseBIPtr) += -Irbp_Vbci; *(here->VBICcollCXBaseBIPtr) += -Irbp_Vbci;
*(here->VBICcollCXCollCIPtr) += Irbp_Vbci; *(here->VBICcollCXCollCIPtr) += Irbp_Vbci;
/* /*
c Stamp element: Ibcp
*/
*(here->VBICsubsSISubsSIPtr) += Ibcp_Vbcp;
*(here->VBICsubsSIBaseBPPtr) += -Ibcp_Vbcp;
*(here->VBICbaseBPSubsSIPtr) += -Ibcp_Vbcp;
*(here->VBICbaseBPBaseBPPtr) += Ibcp_Vbcp;
/*
c Stamp element: Iccp
*/
*(here->VBICbaseBXBaseBXPtr) += Iccp_Vbep;
*(here->VBICbaseBXBaseBPPtr) += -Iccp_Vbep;
*(here->VBICbaseBXBaseBIPtr) += Iccp_Vbci;
*(here->VBICbaseBXCollCIPtr) += -Iccp_Vbci;
*(here->VBICbaseBXSubsSIPtr) += Iccp_Vbcp;
*(here->VBICbaseBXBaseBPPtr) += -Iccp_Vbcp;
*(here->VBICsubsSIBaseBXPtr) += -Iccp_Vbep;
*(here->VBICsubsSIBaseBPPtr) += Iccp_Vbep;
*(here->VBICsubsSIBaseBIPtr) += -Iccp_Vbci;
*(here->VBICsubsSICollCIPtr) += Iccp_Vbci;
*(here->VBICsubsSISubsSIPtr) += -Iccp_Vbcp;
*(here->VBICsubsSIBaseBPPtr) += Iccp_Vbcp;
/*
c Stamp element: Irs
*/
*(here->VBICsubsSubsPtr) += Irs_Vrs;
*(here->VBICsubsSISubsSIPtr) += Irs_Vrs;
*(here->VBICsubsSISubsPtr) += -Irs_Vrs;
*(here->VBICsubsSubsSIPtr) += -Irs_Vrs;
/*
c The complex part c The complex part
*/ */
XQbe_Vbei = *(ckt->CKTstate0 + here->VBICcqbe) * ckt->CKTomega; XQbe_Vbei = *(ckt->CKTstate0 + here->VBICcqbe) * ckt->CKTomega;
@ -195,6 +231,7 @@ c The complex part
XQbcx_Vbcx = *(ckt->CKTstate0 + here->VBICcqbcx) * ckt->CKTomega; XQbcx_Vbcx = *(ckt->CKTstate0 + here->VBICcqbcx) * ckt->CKTomega;
XQbep_Vbep = *(ckt->CKTstate0 + here->VBICcqbep) * ckt->CKTomega; XQbep_Vbep = *(ckt->CKTstate0 + here->VBICcqbep) * ckt->CKTomega;
XQbep_Vbci = *(ckt->CKTstate0 + here->VBICcqbepci) * ckt->CKTomega; XQbep_Vbci = *(ckt->CKTstate0 + here->VBICcqbepci) * ckt->CKTomega;
XQbcp_Vbcp = *(ckt->CKTstate0 + here->VBICcqbcp) * ckt->CKTomega;
/* /*
c Stamp element: Qbe c Stamp element: Qbe
*/ */
@ -238,6 +275,13 @@ c Stamp element: Qbep
*(here->VBICbaseBPBaseBPPtr + 1) += XQbep_Vbep; *(here->VBICbaseBPBaseBPPtr + 1) += XQbep_Vbep;
*(here->VBICbaseBPBaseBIPtr + 1) += -XQbep_Vbci; *(here->VBICbaseBPBaseBIPtr + 1) += -XQbep_Vbci;
*(here->VBICbaseBPCollCIPtr + 1) += XQbep_Vbci; *(here->VBICbaseBPCollCIPtr + 1) += XQbep_Vbci;
/*
c Stamp element: Qbcp
*/
*(here->VBICsubsSISubsSIPtr + 1) += XQbcp_Vbcp;
*(here->VBICsubsSIBaseBPPtr + 1) += -XQbcp_Vbcp;
*(here->VBICbaseBPSubsSIPtr + 1) += -XQbcp_Vbcp;
*(here->VBICbaseBPBaseBPPtr + 1) += XQbcp_Vbcp;
} }
} }

View File

@ -58,6 +58,9 @@ VBICask(CKTcircuit *ckt, GENinstance *instPtr, int which, IFvalue *value, IFvalu
case VBIC_QUEST_EMITNODE: case VBIC_QUEST_EMITNODE:
value->iValue = here->VBICemitNode; value->iValue = here->VBICemitNode;
return(OK); return(OK);
case VBIC_QUEST_SUBSNODE:
value->iValue = here->VBICsubsNode;
return(OK);
case VBIC_QUEST_COLLCXNODE: case VBIC_QUEST_COLLCXNODE:
value->iValue = here->VBICcollCXNode; value->iValue = here->VBICcollCXNode;
return(OK); return(OK);
@ -67,6 +70,9 @@ VBICask(CKTcircuit *ckt, GENinstance *instPtr, int which, IFvalue *value, IFvalu
case VBIC_QUEST_EMITEINODE: case VBIC_QUEST_EMITEINODE:
value->iValue = here->VBICemitEINode; value->iValue = here->VBICemitEINode;
return(OK); return(OK);
case VBIC_QUEST_SUBSSINODE:
value->iValue = here->VBICsubsSINode;
return(OK);
case VBIC_QUEST_VBE: case VBIC_QUEST_VBE:
value->rValue = *(ckt->CKTstate0 + here->VBICvbei); value->rValue = *(ckt->CKTstate0 + here->VBICvbei);
return(OK); return(OK);
@ -81,8 +87,9 @@ VBICask(CKTcircuit *ckt, GENinstance *instPtr, int which, IFvalue *value, IFvalu
case VBIC_QUEST_CB: case VBIC_QUEST_CB:
value->rValue = *(ckt->CKTstate0 + here->VBICibe) + value->rValue = *(ckt->CKTstate0 + here->VBICibe) +
*(ckt->CKTstate0 + here->VBICibc) + *(ckt->CKTstate0 + here->VBICibc) +
*(ckt->CKTstate0 + here->VBICibex) +
*(ckt->CKTstate0 + here->VBICibep) + *(ckt->CKTstate0 + here->VBICibep) +
*(ckt->CKTstate0 + here->VBICibex); *(ckt->CKTstate0 + here->VBICiccp);
return(OK); return(OK);
case VBIC_QUEST_CE: case VBIC_QUEST_CE:
value->rValue = - *(ckt->CKTstate0 + here->VBICibe) - value->rValue = - *(ckt->CKTstate0 + here->VBICibe) -
@ -90,12 +97,19 @@ VBICask(CKTcircuit *ckt, GENinstance *instPtr, int which, IFvalue *value, IFvalu
*(ckt->CKTstate0 + here->VBICitzf) + *(ckt->CKTstate0 + here->VBICitzf) +
*(ckt->CKTstate0 + here->VBICitzr); *(ckt->CKTstate0 + here->VBICitzr);
return(OK); return(OK);
case VBIC_QUEST_CS:
value->rValue = *(ckt->CKTstate0 + here->VBICiccp) -
*(ckt->CKTstate0 + here->VBICibcp);
return(OK);
case VBIC_QUEST_POWER: case VBIC_QUEST_POWER:
value->rValue = fabs(*(ckt->CKTstate0 + here->VBICitzf) - *(ckt->CKTstate0 + here->VBICitzr)) value->rValue = fabs(*(ckt->CKTstate0 + here->VBICitzf) - *(ckt->CKTstate0 + here->VBICitzr))
* fabs(*(ckt->CKTstate0 + here->VBICvbei) - *(ckt->CKTstate0 + here->VBICvbci)) + * fabs(*(ckt->CKTstate0 + here->VBICvbei) - *(ckt->CKTstate0 + here->VBICvbci)) +
fabs(*(ckt->CKTstate0 + here->VBICibe) * *(ckt->CKTstate0 + here->VBICvbei)) + fabs(*(ckt->CKTstate0 + here->VBICibe) * *(ckt->CKTstate0 + here->VBICvbei)) +
fabs(*(ckt->CKTstate0 + here->VBICibex) * *(ckt->CKTstate0 + here->VBICvbex)) + fabs(*(ckt->CKTstate0 + here->VBICibex) * *(ckt->CKTstate0 + here->VBICvbex)) +
fabs(*(ckt->CKTstate0 + here->VBICibc) * *(ckt->CKTstate0 + here->VBICvbci)); fabs(*(ckt->CKTstate0 + here->VBICibc) * *(ckt->CKTstate0 + here->VBICvbci)) +
fabs(*(ckt->CKTstate0 + here->VBICibcp) * *(ckt->CKTstate0 + here->VBICvbcp)) +
fabs(*(ckt->CKTstate0 + here->VBICiccp))
* fabs(*(ckt->CKTstate0 + here->VBICvbep) - *(ckt->CKTstate0 + here->VBICvbcp));
return(OK); return(OK);
case VBIC_QUEST_GM: case VBIC_QUEST_GM:
value->rValue = *(ckt->CKTstate0 + here->VBICitzf_Vbei); value->rValue = *(ckt->CKTstate0 + here->VBICitzf_Vbei);
@ -124,6 +138,12 @@ VBICask(CKTcircuit *ckt, GENinstance *instPtr, int which, IFvalue *value, IFvalu
case VBIC_QUEST_CBCX: case VBIC_QUEST_CBCX:
value->rValue = here->VBICcapbcx; value->rValue = here->VBICcapbcx;
return(OK); return(OK);
case VBIC_QUEST_CBEP:
value->rValue = here->VBICcapbep;
return(OK);
case VBIC_QUEST_CBCP:
value->rValue = here->VBICcapbcp;
return(OK);
case VBIC_QUEST_QBE: case VBIC_QUEST_QBE:
value->rValue = *(ckt->CKTstate0 + here->VBICqbe); value->rValue = *(ckt->CKTstate0 + here->VBICqbe);
return(OK); return(OK);

View File

@ -30,6 +30,7 @@ VBICconvTest(GENmodel *inModel, CKTcircuit *ckt)
double delvrci; double delvrci;
double delvrbi; double delvrbi;
double delvrbp; double delvrbp;
double delvbcp;
double ibehat; double ibehat;
double ibexhat; double ibexhat;
double itzfhat; double itzfhat;
@ -39,12 +40,14 @@ VBICconvTest(GENmodel *inModel, CKTcircuit *ckt)
double ircihat; double ircihat;
double irbihat; double irbihat;
double irbphat; double irbphat;
double Vbei, Vbex, Vbci, Vbcx, Vbep, Vrci, Vrbi, Vrbp; double ibcphat;
double Ibe, Ibex, Itzf, Itzr, Ibc, Ibep, Irci, Irbi, Irbp; double iccphat;
double Vbei, Vbex, Vbci, Vbcx, Vbep, Vrci, Vrbi, Vrbp, Vbcp;
double Ibe, Ibex, Itzf, Itzr, Ibc, Ibep, Irci, Irbi, Irbp, Ibcp, Iccp;
for( ; model != NULL; model = model->VBICnextModel) { for( ; model != NULL; model = model->VBICnextModel) {
for(here=model->VBICinstances;here!=NULL; for(here=model->VBICinstances;here!=NULL;here = here->VBICnextInstance) {
here = here->VBICnextInstance) {
if (here->VBICowner != ARCHme) continue; if (here->VBICowner != ARCHme) continue;
Vbei=model->VBICtype*( Vbei=model->VBICtype*(
@ -71,6 +74,9 @@ VBICconvTest(GENmodel *inModel, CKTcircuit *ckt)
Vrbp =model->VBICtype*( Vrbp =model->VBICtype*(
*(ckt->CKTrhsOld+here->VBICbaseBPNode)- *(ckt->CKTrhsOld+here->VBICbaseBPNode)-
*(ckt->CKTrhsOld+here->VBICcollCXNode)); *(ckt->CKTrhsOld+here->VBICcollCXNode));
Vbcp =model->VBICtype*(
*(ckt->CKTrhsOld+here->VBICsubsSINode)-
*(ckt->CKTrhsOld+here->VBICbaseBPNode));
delvbei = Vbei - *(ckt->CKTstate0 + here->VBICvbei); delvbei = Vbei - *(ckt->CKTstate0 + here->VBICvbei);
delvbex = Vbex - *(ckt->CKTstate0 + here->VBICvbex); delvbex = Vbex - *(ckt->CKTstate0 + here->VBICvbex);
delvbci = Vbci - *(ckt->CKTstate0 + here->VBICvbci); delvbci = Vbci - *(ckt->CKTstate0 + here->VBICvbci);
@ -79,6 +85,7 @@ VBICconvTest(GENmodel *inModel, CKTcircuit *ckt)
delvrci = Vrci - *(ckt->CKTstate0 + here->VBICvrci); delvrci = Vrci - *(ckt->CKTstate0 + here->VBICvrci);
delvrbi = Vrbi - *(ckt->CKTstate0 + here->VBICvrbi); delvrbi = Vrbi - *(ckt->CKTstate0 + here->VBICvrbi);
delvrbp = Vrbp - *(ckt->CKTstate0 + here->VBICvrbp); delvrbp = Vrbp - *(ckt->CKTstate0 + here->VBICvrbp);
delvbcp = Vbcp - *(ckt->CKTstate0 + here->VBICvbcp);
ibehat = *(ckt->CKTstate0 + here->VBICibe) + ibehat = *(ckt->CKTstate0 + here->VBICibe) +
*(ckt->CKTstate0 + here->VBICibe_Vbei)*delvbei; *(ckt->CKTstate0 + here->VBICibe_Vbei)*delvbei;
ibexhat = *(ckt->CKTstate0 + here->VBICibex) + ibexhat = *(ckt->CKTstate0 + here->VBICibex) +
@ -97,6 +104,10 @@ VBICconvTest(GENmodel *inModel, CKTcircuit *ckt)
*(ckt->CKTstate0 + here->VBICirbi_Vbei)*delvbei + *(ckt->CKTstate0 + here->VBICirbi_Vbci)*delvbci; *(ckt->CKTstate0 + here->VBICirbi_Vbei)*delvbei + *(ckt->CKTstate0 + here->VBICirbi_Vbci)*delvbci;
irbphat = *(ckt->CKTstate0 + here->VBICirbp) + *(ckt->CKTstate0 + here->VBICirbp_Vrbp)*delvrbp + irbphat = *(ckt->CKTstate0 + here->VBICirbp) + *(ckt->CKTstate0 + here->VBICirbp_Vrbp)*delvrbp +
*(ckt->CKTstate0 + here->VBICirbp_Vbep)*delvbep + *(ckt->CKTstate0 + here->VBICirbp_Vbci)*delvbci; *(ckt->CKTstate0 + here->VBICirbp_Vbep)*delvbep + *(ckt->CKTstate0 + here->VBICirbp_Vbci)*delvbci;
ibcphat = *(ckt->CKTstate0 + here->VBICibcp) +
*(ckt->CKTstate0 + here->VBICibcp_Vbcp)*delvbcp;
iccphat = *(ckt->CKTstate0 + here->VBICiccp) + *(ckt->CKTstate0 + here->VBICiccp_Vbep)*delvbep +
*(ckt->CKTstate0 + here->VBICiccp_Vbci)*delvbci + *(ckt->CKTstate0 + here->VBICiccp_Vbcp)*delvbcp;
Ibe = *(ckt->CKTstate0 + here->VBICibe); Ibe = *(ckt->CKTstate0 + here->VBICibe);
Ibex = *(ckt->CKTstate0 + here->VBICibex); Ibex = *(ckt->CKTstate0 + here->VBICibex);
Itzf = *(ckt->CKTstate0 + here->VBICitzf); Itzf = *(ckt->CKTstate0 + here->VBICitzf);
@ -106,6 +117,8 @@ VBICconvTest(GENmodel *inModel, CKTcircuit *ckt)
Irci = *(ckt->CKTstate0 + here->VBICirci); Irci = *(ckt->CKTstate0 + here->VBICirci);
Irbi = *(ckt->CKTstate0 + here->VBICirbi); Irbi = *(ckt->CKTstate0 + here->VBICirbi);
Irbp = *(ckt->CKTstate0 + here->VBICirbp); Irbp = *(ckt->CKTstate0 + here->VBICirbp);
Ibcp = *(ckt->CKTstate0 + here->VBICibcp);
Iccp = *(ckt->CKTstate0 + here->VBICiccp);
/* /*
* check convergence * check convergence
*/ */
@ -162,6 +175,20 @@ VBICconvTest(GENmodel *inModel, CKTcircuit *ckt)
ckt->CKTnoncon++; ckt->CKTnoncon++;
ckt->CKTtroubleElt = (GENinstance *) here; ckt->CKTtroubleElt = (GENinstance *) here;
return(OK); /* no reason to continue - we've failed... */ return(OK); /* no reason to continue - we've failed... */
} else {
tol=ckt->CKTreltol*MAX(fabs(ibcphat),fabs(Ibcp))+ckt->CKTabstol;
if (fabs(ibcphat-Ibcp) > tol) {
ckt->CKTnoncon++;
ckt->CKTtroubleElt = (GENinstance *) here;
return(OK); /* no reason to continue - we've failed... */
} else {
tol=ckt->CKTreltol*MAX(fabs(iccphat),fabs(Iccp))+ckt->CKTabstol;
if (fabs(iccphat-Iccp) > tol) {
ckt->CKTnoncon++;
ckt->CKTtroubleElt = (GENinstance *) here;
return(OK); /* no reason to continue - we've failed... */
}
}
} }
} }
} }

View File

@ -29,12 +29,14 @@ typedef struct sVBICinstance {
int VBICcollNode; /* number of collector node of vbic */ int VBICcollNode; /* number of collector node of vbic */
int VBICbaseNode; /* number of base node of vbic */ int VBICbaseNode; /* number of base node of vbic */
int VBICemitNode; /* number of emitter node of vbic */ int VBICemitNode; /* number of emitter node of vbic */
int VBICsubsNode; /* number of substrate node of vbic */
int VBICcollCXNode; /* number of internal collector node of vbic */ int VBICcollCXNode; /* number of internal collector node of vbic */
int VBICcollCINode; /* number of internal collector node of vbic */ int VBICcollCINode; /* number of internal collector node of vbic */
int VBICbaseBXNode; /* number of internal base node of vbic */ int VBICbaseBXNode; /* number of internal base node of vbic */
int VBICbaseBINode; /* number of internal base node of vbic */ int VBICbaseBINode; /* number of internal base node of vbic */
int VBICemitEINode; /* number of internal emitter node of vbic */ int VBICemitEINode; /* number of internal emitter node of vbic */
int VBICbaseBPNode; /* number of internal base node of vbic */ int VBICbaseBPNode; /* number of internal base node of vbic */
int VBICsubsSINode; /* number of internal substrate node */
double VBICarea; /* area factor for the vbic */ double VBICarea; /* area factor for the vbic */
double VBICicVBE; /* initial condition voltage B-E*/ double VBICicVBE; /* initial condition voltage B-E*/
@ -85,6 +87,8 @@ typedef struct sVBICinstance {
* (base,base) */ * (base,base) */
double *VBICemitEmitPtr; /* pointer to sparse matrix at double *VBICemitEmitPtr; /* pointer to sparse matrix at
* (emitter,emitter) */ * (emitter,emitter) */
double *VBICsubsSubsPtr; /* pointer to sparse matrix at
* (substrate,substrate) */
double *VBICcollCXCollCXPtr; /* pointer to sparse matrix at double *VBICcollCXCollCXPtr; /* pointer to sparse matrix at
* (collector prime,collector prime) */ * (collector prime,collector prime) */
double *VBICcollCICollCIPtr; /* pointer to sparse matrix at double *VBICcollCICollCIPtr; /* pointer to sparse matrix at
@ -97,6 +101,8 @@ typedef struct sVBICinstance {
* (collector prime,collector prime) */ * (collector prime,collector prime) */
double *VBICemitEIEmitEIPtr; /* pointer to sparse matrix at double *VBICemitEIEmitEIPtr; /* pointer to sparse matrix at
* (emitter prime,emitter prime) */ * (emitter prime,emitter prime) */
double *VBICsubsSISubsSIPtr; /* pointer to sparse matrix at
* (substrate prime, substrate prime) */
double *VBICbaseEmitPtr; /* pointer to sparse matrix at double *VBICbaseEmitPtr; /* pointer to sparse matrix at
* (base,emit) */ * (base,emit) */
@ -112,6 +118,8 @@ typedef struct sVBICinstance {
* (base,base prime) */ * (base,base prime) */
double *VBICemitEmitEIPtr; /* pointer to sparse matrix at double *VBICemitEmitEIPtr; /* pointer to sparse matrix at
* (emitter,emitter prime) */ * (emitter,emitter prime) */
double *VBICsubsSubsSIPtr; /* pointer to sparse matrix at
* (substrate, Substrate connection) */
double *VBICcollCXCollCIPtr; /* pointer to sparse matrix at double *VBICcollCXCollCIPtr; /* pointer to sparse matrix at
* (collector prime,base prime) */ * (collector prime,base prime) */
double *VBICcollCXBaseBXPtr; /* pointer to sparse matrix at double *VBICcollCXBaseBXPtr; /* pointer to sparse matrix at
@ -130,8 +138,12 @@ typedef struct sVBICinstance {
* (base primt,emitter prime) */ * (base primt,emitter prime) */
double *VBICbaseBXBaseBPPtr; /* pointer to sparse matrix at double *VBICbaseBXBaseBPPtr; /* pointer to sparse matrix at
* (base primt,emitter prime) */ * (base primt,emitter prime) */
double *VBICbaseBXSubsSIPtr; /* pointer to sparse matrix at
* (base primt,emitter prime) */
double *VBICbaseBIEmitEIPtr; /* pointer to sparse matrix at double *VBICbaseBIEmitEIPtr; /* pointer to sparse matrix at
* (base primt,emitter prime) */ * (base primt,emitter prime) */
double *VBICbaseBPSubsSIPtr; /* pointer to sparse matrix at
* (base primt,emitter prime) */
double *VBICcollCXCollPtr; /* pointer to sparse matrix at double *VBICcollCXCollPtr; /* pointer to sparse matrix at
* (collector prime,collector) */ * (collector prime,collector) */
@ -139,6 +151,8 @@ typedef struct sVBICinstance {
* (base prime,base ) */ * (base prime,base ) */
double *VBICemitEIEmitPtr; /* pointer to sparse matrix at double *VBICemitEIEmitPtr; /* pointer to sparse matrix at
* (emitter prime,emitter) */ * (emitter prime,emitter) */
double *VBICsubsSISubsPtr; /* pointer to sparse matrix at
* (Substrate connection, substrate) */
double *VBICcollCICollCXPtr; /* pointer to sparse matrix at double *VBICcollCICollCXPtr; /* pointer to sparse matrix at
* (collector prime,base prime) */ * (collector prime,base prime) */
double *VBICbaseBICollCXPtr; /* pointer to sparse matrix at double *VBICbaseBICollCXPtr; /* pointer to sparse matrix at
@ -153,16 +167,24 @@ typedef struct sVBICinstance {
* (emitter prime,collector prime) */ * (emitter prime,collector prime) */
double *VBICbaseBPCollCIPtr; /* pointer to sparse matrix at double *VBICbaseBPCollCIPtr; /* pointer to sparse matrix at
* (base primt,emitter prime) */ * (base primt,emitter prime) */
double *VBICsubsSICollCIPtr; /* pointer to sparse matrix at
* (substrate,collector prime) */
double *VBICbaseBIBaseBXPtr; /* pointer to sparse matrix at double *VBICbaseBIBaseBXPtr; /* pointer to sparse matrix at
* (base primt,emitter prime) */ * (base primt,emitter prime) */
double *VBICemitEIBaseBXPtr; /* pointer to sparse matrix at double *VBICemitEIBaseBXPtr; /* pointer to sparse matrix at
* (emitter prime,base prime) */ * (emitter prime,base prime) */
double *VBICbaseBPBaseBXPtr; /* pointer to sparse matrix at double *VBICbaseBPBaseBXPtr; /* pointer to sparse matrix at
* (base primt,emitter prime) */ * (base primt,emitter prime) */
double *VBICsubsSIBaseBXPtr; /* pointer to sparse matrix at
* (substrate,substrate) */
double *VBICemitEIBaseBIPtr; /* pointer to sparse matrix at double *VBICemitEIBaseBIPtr; /* pointer to sparse matrix at
* (emitter prime,base prime) */ * (emitter prime,base prime) */
double *VBICbaseBPBaseBIPtr; /* pointer to sparse matrix at double *VBICbaseBPBaseBIPtr; /* pointer to sparse matrix at
* (base primt,emitter prime) */ * (base primt,emitter prime) */
double *VBICsubsSIBaseBIPtr; /* pointer to sparse matrix at
* (substrate,base prime) */
double *VBICsubsSIBaseBPPtr; /* pointer to sparse matrix at
* (substrate,substrate) */
unsigned VBICareaGiven :1; /* flag to indicate area was specified */ unsigned VBICareaGiven :1; /* flag to indicate area was specified */
unsigned VBICoff :1; /* 'off' flag for vbic */ unsigned VBICoff :1; /* 'off' flag for vbic */
@ -181,6 +203,7 @@ typedef struct sVBICinstance {
double VBICcapbc; double VBICcapbc;
double VBICcapbcx; double VBICcapbcx;
double VBICcapbep; double VBICcapbep;
double VBICcapbcp;
double *VBICsens; double *VBICsens;
#define VBICsenGpi VBICsens /* stores the perturbed values of gpi */ #define VBICsenGpi VBICsens /* stores the perturbed values of gpi */
@ -208,9 +231,11 @@ typedef struct sVBICinstance {
#define VBICIBEPNOIZ 8 #define VBICIBEPNOIZ 8
#define VBICFLBENOIZ 9 #define VBICFLBENOIZ 9
#define VBICFLBEPNOIZ 10 #define VBICFLBEPNOIZ 10
#define VBICTOTNOIZ 11 #define VBICRSNOIZ 11
#define VBICICCPNOIZ 12
#define VBICTOTNOIZ 13
#define VBICNSRCS 12 /* the number of VBIC noise sources */ #define VBICNSRCS 14 /* the number of VBIC noise sources */
#ifndef NONOISE #ifndef NONOISE
double VBICnVar[NSTATVARS][VBICNSRCS]; double VBICnVar[NSTATVARS][VBICNSRCS];
@ -228,9 +253,10 @@ typedef struct sVBICinstance {
#define VBICvbci VBICstate+2 #define VBICvbci VBICstate+2
#define VBICvbcx VBICstate+3 #define VBICvbcx VBICstate+3
#define VBICvbep VBICstate+4 #define VBICvbep VBICstate+4
#define VBICvrci VBICstate+6 #define VBICvrci VBICstate+5
#define VBICvrbi VBICstate+7 #define VBICvrbi VBICstate+6
#define VBICvrbp VBICstate+8 #define VBICvrbp VBICstate+7
#define VBICvbcp VBICstate+8
#define VBICibe VBICstate+9 #define VBICibe VBICstate+9
#define VBICibe_Vbei VBICstate+10 #define VBICibe_Vbei VBICstate+10
@ -294,15 +320,26 @@ typedef struct sVBICinstance {
#define VBICcqbco VBICstate+52 #define VBICcqbco VBICstate+52
#define VBICgqbco VBICstate+53 #define VBICgqbco VBICstate+53
#define VBICnumStates 54 #define VBICibcp VBICstate+54
#define VBICibcp_Vbcp VBICstate+55
#define VBICsensxpbe VBICstate+54 /* charge sensitivities and their #define VBICiccp VBICstate+56
derivatives. +55 for the derivatives - #define VBICiccp_Vbep VBICstate+57
#define VBICiccp_Vbci VBICstate+58
#define VBICiccp_Vbcp VBICstate+59
#define VBICqbcp VBICstate+60
#define VBICcqbcp VBICstate+61
#define VBICnumStates 62
#define VBICsensxpbe VBICstate+64 /* charge sensitivities and their
derivatives. +65 for the derivatives -
pointer to the beginning of the array */ pointer to the beginning of the array */
#define VBICsensxpbex VBICstate+56 #define VBICsensxpbex VBICstate+66
#define VBICsensxpbc VBICstate+58 #define VBICsensxpbc VBICstate+68
#define VBICsensxpbcx VBICstate+60 #define VBICsensxpbcx VBICstate+70
#define VBICsensxpbep VBICstate+62 #define VBICsensxpbep VBICstate+72
#define VBICnumSenStates 10 #define VBICnumSenStates 10
@ -430,6 +467,7 @@ typedef struct sVBICmodel { /* model structure for a vbic */
double VBICcollectorConduct; /* collector conductance */ double VBICcollectorConduct; /* collector conductance */
double VBICbaseConduct; /* base conductance */ double VBICbaseConduct; /* base conductance */
double VBICemitterConduct; /* emitter conductance */ double VBICemitterConduct; /* emitter conductance */
double VBICsubstrateConduct; /* substrate conductance */
unsigned VBICtnomGiven : 1; unsigned VBICtnomGiven : 1;
unsigned VBICextCollResistGiven : 1; unsigned VBICextCollResistGiven : 1;
@ -674,52 +712,58 @@ typedef struct sVBICmodel { /* model structure for a vbic */
#define VBIC_QUEST_COLLNODE 212 #define VBIC_QUEST_COLLNODE 212
#define VBIC_QUEST_BASENODE 213 #define VBIC_QUEST_BASENODE 213
#define VBIC_QUEST_EMITNODE 214 #define VBIC_QUEST_EMITNODE 214
#define VBIC_QUEST_SUBSNODE 215
#define VBIC_QUEST_COLLCXNODE 216 #define VBIC_QUEST_COLLCXNODE 216
#define VBIC_QUEST_COLLCINODE 217 #define VBIC_QUEST_COLLCINODE 217
#define VBIC_QUEST_BASEBXNODE 218 #define VBIC_QUEST_BASEBXNODE 218
#define VBIC_QUEST_BASEBINODE 219 #define VBIC_QUEST_BASEBINODE 219
#define VBIC_QUEST_BASEBPNODE 220 #define VBIC_QUEST_BASEBPNODE 220
#define VBIC_QUEST_EMITEINODE 221 #define VBIC_QUEST_EMITEINODE 221
#define VBIC_QUEST_SUBSSINODE 222
#define VBIC_QUEST_VBE 223 #define VBIC_QUEST_VBE 223
#define VBIC_QUEST_VBC 224 #define VBIC_QUEST_VBC 224
#define VBIC_QUEST_CC 225 #define VBIC_QUEST_CC 225
#define VBIC_QUEST_CB 226 #define VBIC_QUEST_CB 226
#define VBIC_QUEST_CE 227 #define VBIC_QUEST_CE 227
#define VBIC_QUEST_GM 228 #define VBIC_QUEST_CS 228
#define VBIC_QUEST_GO 229 #define VBIC_QUEST_GM 229
#define VBIC_QUEST_GPI 230 #define VBIC_QUEST_GO 230
#define VBIC_QUEST_GMU 231 #define VBIC_QUEST_GPI 231
#define VBIC_QUEST_GX 232 #define VBIC_QUEST_GMU 232
#define VBIC_QUEST_QBE 233 #define VBIC_QUEST_GX 233
#define VBIC_QUEST_CQBE 234 #define VBIC_QUEST_QBE 234
#define VBIC_QUEST_QBC 235 #define VBIC_QUEST_CQBE 235
#define VBIC_QUEST_CQBC 236 #define VBIC_QUEST_QBC 236
#define VBIC_QUEST_QSUB 237 #define VBIC_QUEST_CQBC 237
#define VBIC_QUEST_CQSUB 238 #define VBIC_QUEST_QBX 238
#define VBIC_QUEST_QBX 239 #define VBIC_QUEST_CQBX 239
#define VBIC_QUEST_CQBX 240 #define VBIC_QUEST_QBCP 240
#define VBIC_QUEST_CEXBC 241 #define VBIC_QUEST_CQBCP 241
#define VBIC_QUEST_GEQCB 242 #define VBIC_QUEST_CEXBC 242
#define VBIC_QUEST_GCSUB 243 #define VBIC_QUEST_GEQCB 243
#define VBIC_QUEST_GDSUB 244 #define VBIC_QUEST_GCSUB 244
#define VBIC_QUEST_GEQBX 245 #define VBIC_QUEST_GDSUB 245
#define VBIC_QUEST_CBE 246 #define VBIC_QUEST_GEQBX 246
#define VBIC_QUEST_CBEX 247 #define VBIC_QUEST_CBE 247
#define VBIC_QUEST_CBC 248 #define VBIC_QUEST_CBEX 248
#define VBIC_QUEST_CBCX 249 #define VBIC_QUEST_CBC 249
#define VBIC_QUEST_SENS_REAL 250 #define VBIC_QUEST_CBCX 250
#define VBIC_QUEST_SENS_IMAG 251 #define VBIC_QUEST_CBEP 251
#define VBIC_QUEST_SENS_MAG 252 #define VBIC_QUEST_CBCP 252
#define VBIC_QUEST_SENS_PH 253 #define VBIC_QUEST_SENS_REAL 253
#define VBIC_QUEST_SENS_CPLX 254 #define VBIC_QUEST_SENS_IMAG 254
#define VBIC_QUEST_SENS_DC 255 #define VBIC_QUEST_SENS_MAG 255
#define VBIC_QUEST_POWER 256 #define VBIC_QUEST_SENS_PH 256
#define VBIC_QUEST_SENS_CPLX 257
#define VBIC_QUEST_SENS_DC 258
#define VBIC_QUEST_POWER 259
/* model questions */ /* model questions */
#define VBIC_MOD_COLLCONDUCT 301 #define VBIC_MOD_COLLCONDUCT 301
#define VBIC_MOD_BASECONDUCT 302 #define VBIC_MOD_BASECONDUCT 302
#define VBIC_MOD_EMITTERCONDUCT 303 #define VBIC_MOD_EMITTERCONDUCT 303
#define VBIC_MOD_TYPE 304 #define VBIC_MOD_SUBSTRATECONDUCT 304
#define VBIC_MOD_TYPE 305
#include "vbicext.h" #include "vbicext.h"
#endif /*VBIC*/ #endif /*VBIC*/

View File

@ -10,7 +10,7 @@
SPICEdev VBICinfo = { SPICEdev VBICinfo = {
{ {
"VBIC", "VBIC",
"Vertical Bipolar Inter-Company Model (3-terminal)", "Vertical Bipolar Inter-Company Model",
&VBICnSize, &VBICnSize,
&VBICnSize, &VBICnSize,

View File

@ -28,17 +28,19 @@ VBICload(GENmodel *inModel, CKTcircuit *ckt)
VBICmodel *model = (VBICmodel*)inModel; VBICmodel *model = (VBICmodel*)inModel;
VBICinstance *here; VBICinstance *here;
double p[108] double p[108]
,Vbei,Vbex,Vbci,Vbep,Vrcx,Vbcx ,Vbei,Vbex,Vbci,Vbep,Vbcp,Vrcx
,Vrci,Vrbx,Vrbi,Vre,Vrbp,Vbe,Vbc ,Vbcx,Vrci,Vrbx,Vrbi,Vre,Vrbp,Vrs
,Ibe,Ibe_Vbei,Ibex,Ibex_Vbex,Itzf,Itzf_Vbei,Itzf_Vbci ,Vbe,Vbc,Ibe,Ibe_Vbei,Ibex,Ibex_Vbex,Itzf
,Itzr,Itzr_Vbci,Itzr_Vbei,Ibc,Ibc_Vbci,Ibc_Vbei,Ibep ,Itzf_Vbei,Itzf_Vbci,Itzr,Itzr_Vbci,Itzr_Vbei,Ibc,Ibc_Vbci
,Ibep_Vbep,Ircx,Ircx_Vrcx,Irci,Irci_Vrci,Irci_Vbci,Irci_Vbcx ,Ibc_Vbei,Ibep,Ibep_Vbep,Ircx,Ircx_Vrcx,Irci,Irci_Vrci
,Irbx,Irbx_Vrbx,Irbi,Irbi_Vrbi,Irbi_Vbei,Irbi_Vbci,Ire ,Irci_Vbci,Irci_Vbcx,Irbx,Irbx_Vrbx,Irbi,Irbi_Vrbi,Irbi_Vbei
,Ire_Vre,Irbp,Irbp_Vrbp,Irbp_Vbep,Irbp_Vbci,Qbe,Qbe_Vbei ,Irbi_Vbci,Ire,Ire_Vre,Irbp,Irbp_Vrbp,Irbp_Vbep,Irbp_Vbci
,Qbe_Vbci,Qbex,Qbex_Vbex,Qbc,Qbc_Vbci,Qbcx,Qbcx_Vbcx ,Qbe,Qbe_Vbei,Qbe_Vbci,Qbex,Qbex_Vbex,Qbc,Qbc_Vbci
,Qbep,Qbep_Vbep,Qbep_Vbci,Qbeo,Qbeo_Vbe,Qbco,Qbco_Vbc,SCALE; ,Qbcx,Qbcx_Vbcx,Qbep,Qbep_Vbep,Qbep_Vbci,Qbeo,Qbeo_Vbe
,Qbco,Qbco_Vbc,Ibcp,Ibcp_Vbcp,Iccp,Iccp_Vbep,Iccp_Vbci
,Iccp_Vbcp,Irs,Irs_Vrs,Qbcp,Qbcp_Vbcp,SCALE;
int iret; int iret;
int vbic_3T_it_cf_fj(double * int vbic_4T_it_cf_fj(double *
,double *,double *,double *,double *,double *,double * ,double *,double *,double *,double *,double *,double *
,double *,double *,double *,double *,double *,double *, double * ,double *,double *,double *,double *,double *,double *, double *
,double *,double *,double *,double *,double *,double *, double * ,double *,double *,double *,double *,double *,double *, double *
@ -47,7 +49,9 @@ VBICload(GENmodel *inModel, CKTcircuit *ckt)
,double *,double *,double *,double *,double *,double *, double * ,double *,double *,double *,double *,double *,double *, double *
,double *,double *,double *,double *,double *,double *, double * ,double *,double *,double *,double *,double *,double *, double *
,double *,double *,double *,double *,double *,double *, double * ,double *,double *,double *,double *,double *,double *, double *
,double *,double *,double *,double *,double *,double *, double *, double *); ,double *,double *,double *,double *,double *,double *, double *
,double *,double *,double *,double *,double *,double *, double *
,double *,double *,double *,double *,double *,double *);
double vce, xfact; double vce, xfact;
double vt; double vt;
double delvbei; double delvbei;
@ -58,6 +62,7 @@ VBICload(GENmodel *inModel, CKTcircuit *ckt)
double delvrci; double delvrci;
double delvrbi; double delvrbi;
double delvrbp; double delvrbp;
double delvbcp;
double ibehat; double ibehat;
double ibexhat; double ibexhat;
double itzfhat; double itzfhat;
@ -67,9 +72,11 @@ VBICload(GENmodel *inModel, CKTcircuit *ckt)
double ircihat; double ircihat;
double irbihat; double irbihat;
double irbphat; double irbphat;
double ibcphat;
double iccphat;
double ceq, geq, rhs_current; double ceq, geq, rhs_current;
int icheck; int icheck;
int ichk1, ichk2, ichk3, ichk4; int ichk1, ichk2, ichk3, ichk4, ichk5;
int error; int error;
int SenCond=0; int SenCond=0;
double gqbeo, cqbeo, gqbco, cqbco, gbcx, cbcx; double gqbeo, cqbeo, gqbco, cqbco, gbcx, cbcx;
@ -244,6 +251,10 @@ VBICload(GENmodel *inModel, CKTcircuit *ckt)
Vre = model->VBICtype*( Vre = model->VBICtype*(
*(ckt->CKTrhsOp+here->VBICemitNode)- *(ckt->CKTrhsOp+here->VBICemitNode)-
*(ckt->CKTrhsOp+here->VBICemitEINode)); *(ckt->CKTrhsOp+here->VBICemitEINode));
Vbcp = *(ckt->CKTstate1 + here->VBICvbcp);
Vrs = model->VBICtype*(
*(ckt->CKTrhsOp+here->VBICsubsNode)-
*(ckt->CKTrhsOp+here->VBICsubsSINode));
} }
else{ else{
Vbei = *(ckt->CKTstate0 + here->VBICvbei); Vbei = *(ckt->CKTstate0 + here->VBICvbei);
@ -254,6 +265,7 @@ VBICload(GENmodel *inModel, CKTcircuit *ckt)
Vrci = *(ckt->CKTstate0 + here->VBICvrci); Vrci = *(ckt->CKTstate0 + here->VBICvrci);
Vrbi = *(ckt->CKTstate0 + here->VBICvrbi); Vrbi = *(ckt->CKTstate0 + here->VBICvrbi);
Vrbp = *(ckt->CKTstate0 + here->VBICvrbp); Vrbp = *(ckt->CKTstate0 + here->VBICvrbp);
Vbcp = *(ckt->CKTstate0 + here->VBICvbcp);
if((ckt->CKTsenInfo->SENmode == DCSEN)|| if((ckt->CKTsenInfo->SENmode == DCSEN)||
(ckt->CKTsenInfo->SENmode == TRANSEN)){ (ckt->CKTsenInfo->SENmode == TRANSEN)){
Vbe = model->VBICtype*( Vbe = model->VBICtype*(
@ -271,6 +283,9 @@ VBICload(GENmodel *inModel, CKTcircuit *ckt)
Vre = model->VBICtype*( Vre = model->VBICtype*(
*(ckt->CKTrhsOld+here->VBICemitNode)- *(ckt->CKTrhsOld+here->VBICemitNode)-
*(ckt->CKTrhsOld+here->VBICemitEINode)); *(ckt->CKTrhsOld+here->VBICemitEINode));
Vrs = model->VBICtype*(
*(ckt->CKTrhsOld+here->VBICsubsNode)-
*(ckt->CKTrhsOld+here->VBICsubsSINode));
} }
if(ckt->CKTsenInfo->SENmode == ACSEN){ if(ckt->CKTsenInfo->SENmode == ACSEN){
Vbe = model->VBICtype*( Vbe = model->VBICtype*(
@ -288,6 +303,9 @@ VBICload(GENmodel *inModel, CKTcircuit *ckt)
Vre = model->VBICtype*( Vre = model->VBICtype*(
*(ckt->CKTrhsOp+here->VBICemitNode)- *(ckt->CKTrhsOp+here->VBICemitNode)-
*(ckt->CKTrhsOp+here->VBICemitEINode)); *(ckt->CKTrhsOp+here->VBICemitEINode));
Vrs = model->VBICtype*(
*(ckt->CKTrhsOp+here->VBICsubsNode)-
*(ckt->CKTrhsOp+here->VBICsubsSINode));
} }
} }
goto next1; goto next1;
@ -321,6 +339,10 @@ VBICload(GENmodel *inModel, CKTcircuit *ckt)
Vre = model->VBICtype*( Vre = model->VBICtype*(
*(ckt->CKTrhsOld+here->VBICemitNode)- *(ckt->CKTrhsOld+here->VBICemitNode)-
*(ckt->CKTrhsOld+here->VBICemitEINode)); *(ckt->CKTrhsOld+here->VBICemitEINode));
Vbcp = *(ckt->CKTstate0 + here->VBICvbcp);
Vrs = model->VBICtype*(
*(ckt->CKTrhsOld+here->VBICsubsNode)-
*(ckt->CKTrhsOld+here->VBICsubsSINode));
} else if(ckt->CKTmode & MODEINITTRAN) { } else if(ckt->CKTmode & MODEINITTRAN) {
Vbe = model->VBICtype*( Vbe = model->VBICtype*(
*(ckt->CKTrhsOld+here->VBICbaseNode)- *(ckt->CKTrhsOld+here->VBICbaseNode)-
@ -345,6 +367,10 @@ VBICload(GENmodel *inModel, CKTcircuit *ckt)
Vre = model->VBICtype*( Vre = model->VBICtype*(
*(ckt->CKTrhsOld+here->VBICemitNode)- *(ckt->CKTrhsOld+here->VBICemitNode)-
*(ckt->CKTrhsOld+here->VBICemitEINode)); *(ckt->CKTrhsOld+here->VBICemitEINode));
Vbcp = *(ckt->CKTstate1 + here->VBICvbcp);
Vrs = model->VBICtype*(
*(ckt->CKTrhsOld+here->VBICsubsNode)-
*(ckt->CKTrhsOld+here->VBICsubsSINode));
if( (ckt->CKTmode & MODETRAN) && (ckt->CKTmode & MODEUIC) ) { if( (ckt->CKTmode & MODETRAN) && (ckt->CKTmode & MODEUIC) ) {
Vbc = model->VBICtype * (here->VBICicVBE-here->VBICicVCE); Vbc = model->VBICtype * (here->VBICicVBE-here->VBICicVCE);
} }
@ -355,23 +381,24 @@ VBICload(GENmodel *inModel, CKTcircuit *ckt)
vce=model->VBICtype*here->VBICicVCE; vce=model->VBICtype*here->VBICicVCE;
Vbc=Vbe-vce; Vbc=Vbe-vce;
Vbci=Vbcx=Vbc; Vbci=Vbcx=Vbc;
Vbep=0.0; Vbep=Vbcp=0.0;
Vrci=Vrbi=Vrbp=0.0; Vrci=Vrbi=Vrbp=0.0;
Vrcx=Vrbx=Vre=0.0; Vrcx=Vrbx=Vre=Vrs=0.0;
} else if((ckt->CKTmode & MODEINITJCT) && (here->VBICoff==0)) { } else if((ckt->CKTmode & MODEINITJCT) && (here->VBICoff==0)) {
Vbe=Vbei=Vbex=model->VBICtype*here->VBICtVcrit; Vbe=Vbei=Vbex=model->VBICtype*here->VBICtVcrit;
Vbc=Vbci=Vbcx=Vbep=0.0; Vbc=Vbci=Vbcx=Vbep=0.0;
Vbcp=Vbc-Vbe;
Vrci=Vrbi=Vrbp=0.0; Vrci=Vrbi=Vrbp=0.0;
Vrcx=Vrbx=Vre=0.0; Vrcx=Vrbx=Vre=Vrs=0.0;
} else if((ckt->CKTmode & MODEINITJCT) || } else if((ckt->CKTmode & MODEINITJCT) ||
( (ckt->CKTmode & MODEINITFIX) && (here->VBICoff!=0))) { ( (ckt->CKTmode & MODEINITFIX) && (here->VBICoff!=0))) {
Vbe=0.0; Vbe=0.0;
Vbei=Vbex=Vbe; Vbei=Vbex=Vbe;
Vbc=0.0; Vbc=0.0;
Vbci=Vbcx=Vbc; Vbci=Vbcx=Vbc;
Vbep=0.0; Vbep=Vbcp=0.0;
Vrci=Vrbi=Vrbp=0.0; Vrci=Vrbi=Vrbp=0.0;
Vrcx=Vrbx=Vre=0.0; Vrcx=Vrbx=Vre=Vrs=0.0;
} else { } else {
#ifndef PREDICTOR #ifndef PREDICTOR
if(ckt->CKTmode & MODEINITPRED) { if(ckt->CKTmode & MODEINITPRED) {
@ -392,6 +419,8 @@ VBICload(GENmodel *inModel, CKTcircuit *ckt)
xfact * *(ckt->CKTstate2 + here->VBICvrbi); xfact * *(ckt->CKTstate2 + here->VBICvrbi);
Vrbp = (1+xfact) * *(ckt->CKTstate1 + here->VBICvrbp)- Vrbp = (1+xfact) * *(ckt->CKTstate1 + here->VBICvrbp)-
xfact * *(ckt->CKTstate2 + here->VBICvrbp); xfact * *(ckt->CKTstate2 + here->VBICvrbp);
Vbcp = (1+xfact) * *(ckt->CKTstate1 + here->VBICvbcp)-
xfact * *(ckt->CKTstate2 + here->VBICvbcp);
*(ckt->CKTstate0 + here->VBICvbei) = *(ckt->CKTstate0 + here->VBICvbei) =
*(ckt->CKTstate1 + here->VBICvbei); *(ckt->CKTstate1 + here->VBICvbei);
*(ckt->CKTstate0 + here->VBICvbex) = *(ckt->CKTstate0 + here->VBICvbex) =
@ -408,6 +437,8 @@ VBICload(GENmodel *inModel, CKTcircuit *ckt)
*(ckt->CKTstate1 + here->VBICvrbi); *(ckt->CKTstate1 + here->VBICvrbi);
*(ckt->CKTstate0 + here->VBICvrbp) = *(ckt->CKTstate0 + here->VBICvrbp) =
*(ckt->CKTstate1 + here->VBICvrbp); *(ckt->CKTstate1 + here->VBICvrbp);
*(ckt->CKTstate0 + here->VBICvbcp) =
*(ckt->CKTstate1 + here->VBICvbcp);
*(ckt->CKTstate0 + here->VBICibe) = *(ckt->CKTstate0 + here->VBICibe) =
*(ckt->CKTstate1 + here->VBICibe); *(ckt->CKTstate1 + here->VBICibe);
*(ckt->CKTstate0 + here->VBICibe_Vbei) = *(ckt->CKTstate0 + here->VBICibe_Vbei) =
@ -462,6 +493,18 @@ VBICload(GENmodel *inModel, CKTcircuit *ckt)
*(ckt->CKTstate1 + here->VBICirbp_Vbep); *(ckt->CKTstate1 + here->VBICirbp_Vbep);
*(ckt->CKTstate0 + here->VBICirbp_Vbci) = *(ckt->CKTstate0 + here->VBICirbp_Vbci) =
*(ckt->CKTstate1 + here->VBICirbp_Vbci); *(ckt->CKTstate1 + here->VBICirbp_Vbci);
*(ckt->CKTstate0 + here->VBICibcp) =
*(ckt->CKTstate1 + here->VBICibcp);
*(ckt->CKTstate0 + here->VBICibcp_Vbcp) =
*(ckt->CKTstate1 + here->VBICibcp_Vbcp);
*(ckt->CKTstate0 + here->VBICiccp) =
*(ckt->CKTstate1 + here->VBICiccp);
*(ckt->CKTstate0 + here->VBICiccp_Vbep) =
*(ckt->CKTstate1 + here->VBICiccp_Vbep);
*(ckt->CKTstate0 + here->VBICiccp_Vbci) =
*(ckt->CKTstate1 + here->VBICiccp_Vbci);
*(ckt->CKTstate0 + here->VBICiccp_Vbcp) =
*(ckt->CKTstate1 + here->VBICiccp_Vbcp);
} else { } else {
#endif /* PREDICTOR */ #endif /* PREDICTOR */
/* /*
@ -491,6 +534,9 @@ VBICload(GENmodel *inModel, CKTcircuit *ckt)
Vrbp = model->VBICtype*( Vrbp = model->VBICtype*(
*(ckt->CKTrhsOld+here->VBICbaseBPNode)- *(ckt->CKTrhsOld+here->VBICbaseBPNode)-
*(ckt->CKTrhsOld+here->VBICcollCXNode)); *(ckt->CKTrhsOld+here->VBICcollCXNode));
Vbcp = model->VBICtype*(
*(ckt->CKTrhsOld+here->VBICsubsSINode)-
*(ckt->CKTrhsOld+here->VBICbaseBPNode));
#ifndef PREDICTOR #ifndef PREDICTOR
} }
#endif /* PREDICTOR */ #endif /* PREDICTOR */
@ -502,6 +548,7 @@ VBICload(GENmodel *inModel, CKTcircuit *ckt)
delvrci = Vrci - *(ckt->CKTstate0 + here->VBICvrci); delvrci = Vrci - *(ckt->CKTstate0 + here->VBICvrci);
delvrbi = Vrbi - *(ckt->CKTstate0 + here->VBICvrbi); delvrbi = Vrbi - *(ckt->CKTstate0 + here->VBICvrbi);
delvrbp = Vrbp - *(ckt->CKTstate0 + here->VBICvrbp); delvrbp = Vrbp - *(ckt->CKTstate0 + here->VBICvrbp);
delvbcp = Vbcp - *(ckt->CKTstate0 + here->VBICvbcp);
Vbe = model->VBICtype*( Vbe = model->VBICtype*(
*(ckt->CKTrhsOld+here->VBICbaseNode)- *(ckt->CKTrhsOld+here->VBICbaseNode)-
*(ckt->CKTrhsOld+here->VBICemitNode)); *(ckt->CKTrhsOld+here->VBICemitNode));
@ -517,6 +564,9 @@ VBICload(GENmodel *inModel, CKTcircuit *ckt)
Vre = model->VBICtype*( Vre = model->VBICtype*(
*(ckt->CKTrhsOld+here->VBICemitNode)- *(ckt->CKTrhsOld+here->VBICemitNode)-
*(ckt->CKTrhsOld+here->VBICemitEINode)); *(ckt->CKTrhsOld+here->VBICemitEINode));
Vrs = model->VBICtype*(
*(ckt->CKTrhsOld+here->VBICsubsNode)-
*(ckt->CKTrhsOld+here->VBICsubsSINode));
ibehat = *(ckt->CKTstate0 + here->VBICibe) + ibehat = *(ckt->CKTstate0 + here->VBICibe) +
*(ckt->CKTstate0 + here->VBICibe_Vbei)*delvbei; *(ckt->CKTstate0 + here->VBICibe_Vbei)*delvbei;
@ -536,6 +586,10 @@ VBICload(GENmodel *inModel, CKTcircuit *ckt)
*(ckt->CKTstate0 + here->VBICirbi_Vbei)*delvbei + *(ckt->CKTstate0 + here->VBICirbi_Vbci)*delvbci; *(ckt->CKTstate0 + here->VBICirbi_Vbei)*delvbei + *(ckt->CKTstate0 + here->VBICirbi_Vbci)*delvbci;
irbphat = *(ckt->CKTstate0 + here->VBICirbp) + *(ckt->CKTstate0 + here->VBICirbp_Vrbp)*delvrbp + irbphat = *(ckt->CKTstate0 + here->VBICirbp) + *(ckt->CKTstate0 + here->VBICirbp_Vrbp)*delvrbp +
*(ckt->CKTstate0 + here->VBICirbp_Vbep)*delvbep + *(ckt->CKTstate0 + here->VBICirbp_Vbci)*delvbci; *(ckt->CKTstate0 + here->VBICirbp_Vbep)*delvbep + *(ckt->CKTstate0 + here->VBICirbp_Vbci)*delvbci;
ibcphat = *(ckt->CKTstate0 + here->VBICibcp) +
*(ckt->CKTstate0 + here->VBICibcp_Vbcp)*delvbcp;
iccphat = *(ckt->CKTstate0 + here->VBICiccp) + *(ckt->CKTstate0 + here->VBICiccp_Vbep)*delvbep +
*(ckt->CKTstate0 + here->VBICiccp_Vbci)*delvbci + *(ckt->CKTstate0 + here->VBICiccp_Vbcp)*delvbcp;
/* /*
* bypass if solution has not changed * bypass if solution has not changed
*/ */
@ -569,6 +623,9 @@ VBICload(GENmodel *inModel, CKTcircuit *ckt)
if( (fabs(delvrbp) < ckt->CKTreltol*MAX(fabs(Vrbp), if( (fabs(delvrbp) < ckt->CKTreltol*MAX(fabs(Vrbp),
fabs(*(ckt->CKTstate0 + here->VBICvrbp)))+ fabs(*(ckt->CKTstate0 + here->VBICvrbp)))+
ckt->CKTvoltTol) ) ckt->CKTvoltTol) )
if( (fabs(delvbcp) < ckt->CKTreltol*MAX(fabs(Vbcp),
fabs(*(ckt->CKTstate0 + here->VBICvbcp)))+
ckt->CKTvoltTol) )
if( (fabs(ibehat-*(ckt->CKTstate0 + here->VBICibe)) < if( (fabs(ibehat-*(ckt->CKTstate0 + here->VBICibe)) <
ckt->CKTreltol* MAX(fabs(ibehat), ckt->CKTreltol* MAX(fabs(ibehat),
fabs(*(ckt->CKTstate0 + here->VBICibe)))+ fabs(*(ckt->CKTstate0 + here->VBICibe)))+
@ -604,6 +661,14 @@ VBICload(GENmodel *inModel, CKTcircuit *ckt)
if( (fabs(irbphat-*(ckt->CKTstate0 + here->VBICirbp)) < if( (fabs(irbphat-*(ckt->CKTstate0 + here->VBICirbp)) <
ckt->CKTreltol* MAX(fabs(irbphat), ckt->CKTreltol* MAX(fabs(irbphat),
fabs(*(ckt->CKTstate0 + here->VBICirbp)))+ fabs(*(ckt->CKTstate0 + here->VBICirbp)))+
ckt->CKTabstol) )
if( (fabs(ibcphat-*(ckt->CKTstate0 + here->VBICibcp)) <
ckt->CKTreltol* MAX(fabs(ibcphat),
fabs(*(ckt->CKTstate0 + here->VBICibcp)))+
ckt->CKTabstol) )
if( (fabs(iccphat-*(ckt->CKTstate0 + here->VBICiccp)) <
ckt->CKTreltol* MAX(fabs(iccphat),
fabs(*(ckt->CKTstate0 + here->VBICiccp)))+
ckt->CKTabstol) ) { ckt->CKTabstol) ) {
/* /*
* bypassing.... * bypassing....
@ -616,6 +681,7 @@ VBICload(GENmodel *inModel, CKTcircuit *ckt)
Vrci = *(ckt->CKTstate0 + here->VBICvrci); Vrci = *(ckt->CKTstate0 + here->VBICvrci);
Vrbi = *(ckt->CKTstate0 + here->VBICvrbi); Vrbi = *(ckt->CKTstate0 + here->VBICvrbi);
Vrbp = *(ckt->CKTstate0 + here->VBICvrbp); Vrbp = *(ckt->CKTstate0 + here->VBICvrbp);
Vbcp = *(ckt->CKTstate0 + here->VBICvbcp);
Ibe = *(ckt->CKTstate0 + here->VBICibe); Ibe = *(ckt->CKTstate0 + here->VBICibe);
Ibe_Vbei = *(ckt->CKTstate0 + here->VBICibe_Vbei); Ibe_Vbei = *(ckt->CKTstate0 + here->VBICibe_Vbei);
Ibex = *(ckt->CKTstate0 + here->VBICibex); Ibex = *(ckt->CKTstate0 + here->VBICibex);
@ -645,6 +711,12 @@ VBICload(GENmodel *inModel, CKTcircuit *ckt)
Irbp_Vbci = *(ckt->CKTstate0 + here->VBICirbp_Vbci); Irbp_Vbci = *(ckt->CKTstate0 + here->VBICirbp_Vbci);
gqbeo = *(ckt->CKTstate0 + here->VBICgqbeo); gqbeo = *(ckt->CKTstate0 + here->VBICgqbeo);
gqbco = *(ckt->CKTstate0 + here->VBICgqbco); 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);
goto load; goto load;
} }
/* /*
@ -661,22 +733,26 @@ VBICload(GENmodel *inModel, CKTcircuit *ckt)
here->VBICtVcrit,&ichk3); here->VBICtVcrit,&ichk3);
Vbep = DEVpnjlim(Vbep,*(ckt->CKTstate0 + here->VBICvbep),vt, Vbep = DEVpnjlim(Vbep,*(ckt->CKTstate0 + here->VBICvbep),vt,
here->VBICtVcrit,&ichk4); here->VBICtVcrit,&ichk4);
if ((ichk1 == 1) || (ichk2 == 1) || (ichk3 == 1) || (ichk4 == 1)) icheck=1; Vbcp = DEVpnjlim(Vbcp,*(ckt->CKTstate0 + here->VBICvbcp),vt,
here->VBICtVcrit,&ichk5);
if ((ichk1 == 1) || (ichk2 == 1) || (ichk3 == 1) || (ichk4 == 1) || (ichk5 == 1)) icheck=1;
} }
/* /*
* determine dc current and derivitives * determine dc current and derivitives
*/ */
next1: next1:
iret = vbic_3T_it_cf_fj(p iret = vbic_4T_it_cf_fj(p
,&Vbei,&Vbex,&Vbci,&Vbep,&Vrcx,&Vbcx ,&Vbei,&Vbex,&Vbci,&Vbep,&Vbcp,&Vrcx
,&Vrci,&Vrbx,&Vrbi,&Vre,&Vrbp,&Vbe,&Vbc ,&Vbcx,&Vrci,&Vrbx,&Vrbi,&Vre,&Vrbp,&Vrs
,&Ibe,&Ibe_Vbei,&Ibex,&Ibex_Vbex,&Itzf,&Itzf_Vbei,&Itzf_Vbci ,&Vbe,&Vbc,&Ibe,&Ibe_Vbei,&Ibex,&Ibex_Vbex,&Itzf
,&Itzr,&Itzr_Vbci,&Itzr_Vbei,&Ibc,&Ibc_Vbci,&Ibc_Vbei,&Ibep ,&Itzf_Vbei,&Itzf_Vbci,&Itzr,&Itzr_Vbci,&Itzr_Vbei,&Ibc,&Ibc_Vbci
,&Ibep_Vbep,&Ircx,&Ircx_Vrcx,&Irci,&Irci_Vrci,&Irci_Vbci,&Irci_Vbcx ,&Ibc_Vbei,&Ibep,&Ibep_Vbep,&Ircx,&Ircx_Vrcx,&Irci,&Irci_Vrci
,&Irbx,&Irbx_Vrbx,&Irbi,&Irbi_Vrbi,&Irbi_Vbei,&Irbi_Vbci,&Ire ,&Irci_Vbci,&Irci_Vbcx,&Irbx,&Irbx_Vrbx,&Irbi,&Irbi_Vrbi,&Irbi_Vbei
,&Ire_Vre,&Irbp,&Irbp_Vrbp,&Irbp_Vbep,&Irbp_Vbci,&Qbe,&Qbe_Vbei ,&Irbi_Vbci,&Ire,&Ire_Vre,&Irbp,&Irbp_Vrbp,&Irbp_Vbep,&Irbp_Vbci
,&Qbe_Vbci,&Qbex,&Qbex_Vbex,&Qbc,&Qbc_Vbci,&Qbcx,&Qbcx_Vbcx ,&Qbe,&Qbe_Vbei,&Qbe_Vbci,&Qbex,&Qbex_Vbex,&Qbc,&Qbc_Vbci
,&Qbep,&Qbep_Vbep,&Qbep_Vbci,&Qbeo,&Qbeo_Vbe,&Qbco,&Qbco_Vbc,&SCALE); ,&Qbcx,&Qbcx_Vbcx,&Qbep,&Qbep_Vbep,&Qbep_Vbci,&Qbeo,&Qbeo_Vbe
,&Qbco,&Qbco_Vbc,&Ibcp,&Ibcp_Vbcp,&Iccp,&Iccp_Vbep,&Iccp_Vbci
,&Iccp_Vbcp,&Irs,&Irs_Vrs,&Qbcp,&Qbcp_Vbcp,&SCALE);
Ibe += ckt->CKTgmin*Vbei; Ibe += ckt->CKTgmin*Vbei;
Ibe_Vbei += ckt->CKTgmin; Ibe_Vbei += ckt->CKTgmin;
@ -690,6 +766,8 @@ next1:
Irci_Vrci += ckt->CKTgmin; Irci_Vrci += ckt->CKTgmin;
Irci_Vbci += ckt->CKTgmin; Irci_Vbci += ckt->CKTgmin;
Irci_Vbcx += ckt->CKTgmin; Irci_Vbcx += ckt->CKTgmin;
Ibcp += ckt->CKTgmin*Vbcp;
Ibcp_Vbcp += ckt->CKTgmin;
if( (ckt->CKTmode & (MODETRAN | MODEAC)) || if( (ckt->CKTmode & (MODETRAN | MODEAC)) ||
((ckt->CKTmode & MODETRANOP) && (ckt->CKTmode & MODEUIC)) || ((ckt->CKTmode & MODETRANOP) && (ckt->CKTmode & MODEUIC)) ||
@ -702,12 +780,14 @@ next1:
*(ckt->CKTstate0 + here->VBICqbep) = Qbep; *(ckt->CKTstate0 + here->VBICqbep) = Qbep;
*(ckt->CKTstate0 + here->VBICqbeo) = Qbeo; *(ckt->CKTstate0 + here->VBICqbeo) = Qbeo;
*(ckt->CKTstate0 + here->VBICqbco) = Qbco; *(ckt->CKTstate0 + here->VBICqbco) = Qbco;
*(ckt->CKTstate0 + here->VBICqbcp) = Qbcp;
here->VBICcapbe = Qbe_Vbei; here->VBICcapbe = Qbe_Vbei;
here->VBICcapbex = Qbex_Vbex; here->VBICcapbex = Qbex_Vbex;
here->VBICcapbc = Qbc_Vbci; here->VBICcapbc = Qbc_Vbci;
here->VBICcapbcx = Qbcx_Vbcx; here->VBICcapbcx = Qbcx_Vbcx;
here->VBICcapbep = Qbep_Vbep; here->VBICcapbep = Qbep_Vbep;
here->VBICcapbcp = Qbcp_Vbcp;
/* /*
* store small-signal parameters * store small-signal parameters
@ -724,6 +804,7 @@ next1:
*(ckt->CKTstate0 + here->VBICcqbepci) = Qbep_Vbci; *(ckt->CKTstate0 + here->VBICcqbepci) = Qbep_Vbci;
*(ckt->CKTstate0 + here->VBICcqbeo) = Qbeo_Vbe; *(ckt->CKTstate0 + here->VBICcqbeo) = Qbeo_Vbe;
*(ckt->CKTstate0 + here->VBICcqbco) = Qbco_Vbc; *(ckt->CKTstate0 + here->VBICcqbco) = Qbco_Vbc;
*(ckt->CKTstate0 + here->VBICcqbcp) = Qbcp_Vbcp;
if(SenCond) { if(SenCond) {
*(ckt->CKTstate0 + here->VBICibe) = Ibe; *(ckt->CKTstate0 + here->VBICibe) = Ibe;
*(ckt->CKTstate0 + here->VBICibe_Vbei) = Ibe_Vbei; *(ckt->CKTstate0 + here->VBICibe_Vbei) = Ibe_Vbei;
@ -754,6 +835,12 @@ next1:
*(ckt->CKTstate0 + here->VBICirbp_Vbci) = Irbp_Vbci; *(ckt->CKTstate0 + here->VBICirbp_Vbci) = Irbp_Vbci;
*(ckt->CKTstate0 + here->VBICgqbeo) = gqbeo; *(ckt->CKTstate0 + here->VBICgqbeo) = gqbeo;
*(ckt->CKTstate0 + here->VBICgqbco) = gqbco; *(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;
} }
#ifdef SENSDEBUG #ifdef SENSDEBUG
printf("storing small signal parameters for op\n"); printf("storing small signal parameters for op\n");
@ -780,6 +867,8 @@ next1:
*(ckt->CKTstate0 + here->VBICirci) = Irci; *(ckt->CKTstate0 + here->VBICirci) = Irci;
*(ckt->CKTstate0 + here->VBICirbi) = Irbi; *(ckt->CKTstate0 + here->VBICirbi) = Irbi;
*(ckt->CKTstate0 + here->VBICirbp) = Irbp; *(ckt->CKTstate0 + here->VBICirbp) = Irbp;
*(ckt->CKTstate0 + here->VBICibcp) = Ibcp;
*(ckt->CKTstate0 + here->VBICiccp) = Iccp;
continue; continue;
} }
@ -798,6 +887,8 @@ next1:
*(ckt->CKTstate0 + here->VBICqbeo) ; *(ckt->CKTstate0 + here->VBICqbeo) ;
*(ckt->CKTstate1 + here->VBICqbco) = *(ckt->CKTstate1 + here->VBICqbco) =
*(ckt->CKTstate0 + here->VBICqbco) ; *(ckt->CKTstate0 + here->VBICqbco) ;
*(ckt->CKTstate1 + here->VBICqbcp) =
*(ckt->CKTstate0 + here->VBICqbcp) ;
} }
error = NIintegrate(ckt,&geq,&ceq,Qbe_Vbei,here->VBICqbe); error = NIintegrate(ckt,&geq,&ceq,Qbe_Vbei,here->VBICqbe);
if(error) return(error); if(error) return(error);
@ -824,6 +915,11 @@ next1:
Ibep_Vbep = Ibep_Vbep + geq; Ibep_Vbep = Ibep_Vbep + geq;
Ibep = Ibep + *(ckt->CKTstate0 + here->VBICcqbep); Ibep = Ibep + *(ckt->CKTstate0 + here->VBICcqbep);
error = NIintegrate(ckt,&geq,&ceq,Qbcp_Vbcp,here->VBICqbcp);
if(error) return(error);
Ibcp_Vbcp = Ibcp_Vbcp + geq;
Ibcp = Ibcp + *(ckt->CKTstate0 + here->VBICcqbcp);
if(ckt->CKTmode & MODEINITTRAN) { if(ckt->CKTmode & MODEINITTRAN) {
*(ckt->CKTstate1 + here->VBICcqbe) = *(ckt->CKTstate1 + here->VBICcqbe) =
*(ckt->CKTstate0 + here->VBICcqbe); *(ckt->CKTstate0 + here->VBICcqbe);
@ -835,6 +931,8 @@ next1:
*(ckt->CKTstate0 + here->VBICcqbcx); *(ckt->CKTstate0 + here->VBICcqbcx);
*(ckt->CKTstate1 + here->VBICcqbep) = *(ckt->CKTstate1 + here->VBICcqbep) =
*(ckt->CKTstate0 + here->VBICcqbep); *(ckt->CKTstate0 + here->VBICcqbep);
*(ckt->CKTstate1 + here->VBICcqbcp) =
*(ckt->CKTstate0 + here->VBICcqbcp);
} }
} }
} }
@ -875,6 +973,7 @@ next2:
*(ckt->CKTstate0 + here->VBICvrci) = Vrci; *(ckt->CKTstate0 + here->VBICvrci) = Vrci;
*(ckt->CKTstate0 + here->VBICvrbi) = Vrbi; *(ckt->CKTstate0 + here->VBICvrbi) = Vrbi;
*(ckt->CKTstate0 + here->VBICvrbp) = Vrbp; *(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;
@ -904,6 +1003,12 @@ next2:
*(ckt->CKTstate0 + here->VBICirbp_Vbci) = Irbp_Vbci; *(ckt->CKTstate0 + here->VBICirbp_Vbci) = Irbp_Vbci;
*(ckt->CKTstate0 + here->VBICgqbeo) = gqbeo; *(ckt->CKTstate0 + here->VBICgqbeo) = gqbeo;
*(ckt->CKTstate0 + here->VBICgqbco) = gqbco; *(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;
/* 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 */
@ -1087,6 +1192,41 @@ c Stamp element: Irbp
*(here->VBICcollCXBaseBPPtr) += Irbp_Vbep; *(here->VBICcollCXBaseBPPtr) += Irbp_Vbep;
*(here->VBICcollCXBaseBIPtr) += -Irbp_Vbci; *(here->VBICcollCXBaseBIPtr) += -Irbp_Vbci;
*(here->VBICcollCXCollCIPtr) += Irbp_Vbci; *(here->VBICcollCXCollCIPtr) += Irbp_Vbci;
/*
c Stamp element: Ibcp
*/
rhs_current = model->VBICtype * (Ibcp - Ibcp_Vbcp*Vbcp);
*(ckt->CKTrhs + here->VBICsubsSINode) += -rhs_current;
*(here->VBICsubsSISubsSIPtr) += Ibcp_Vbcp;
*(here->VBICsubsSIBaseBPPtr) += -Ibcp_Vbcp;
*(ckt->CKTrhs + here->VBICbaseBPNode) += rhs_current;
*(here->VBICbaseBPSubsSIPtr) += -Ibcp_Vbcp;
*(here->VBICbaseBPBaseBPPtr) += Ibcp_Vbcp;
/*
c Stamp element: Iccp
*/
rhs_current = model->VBICtype * (Iccp - Iccp_Vbep*Vbep - Iccp_Vbci*Vbci - Iccp_Vbcp*Vbcp);
*(ckt->CKTrhs + here->VBICbaseBXNode) += -rhs_current;
*(here->VBICbaseBXBaseBXPtr) += Iccp_Vbep;
*(here->VBICbaseBXBaseBPPtr) += -Iccp_Vbep;
*(here->VBICbaseBXBaseBIPtr) += Iccp_Vbci;
*(here->VBICbaseBXCollCIPtr) += -Iccp_Vbci;
*(here->VBICbaseBXSubsSIPtr) += Iccp_Vbcp;
*(here->VBICbaseBXBaseBPPtr) += -Iccp_Vbcp;
*(ckt->CKTrhs + here->VBICsubsSINode) += rhs_current;
*(here->VBICsubsSIBaseBXPtr) += -Iccp_Vbep;
*(here->VBICsubsSIBaseBPPtr) += Iccp_Vbep;
*(here->VBICsubsSIBaseBIPtr) += -Iccp_Vbci;
*(here->VBICsubsSICollCIPtr) += Iccp_Vbci;
*(here->VBICsubsSISubsSIPtr) += -Iccp_Vbcp;
*(here->VBICsubsSIBaseBPPtr) += Iccp_Vbcp;
/*
c Stamp element: Irs
*/
*(here->VBICsubsSubsPtr) += Irs_Vrs;
*(here->VBICsubsSISubsSIPtr) += Irs_Vrs;
*(here->VBICsubsSISubsPtr) += -Irs_Vrs;
*(here->VBICsubsSubsSIPtr) += -Irs_Vrs;
} }
@ -1094,26 +1234,30 @@ c Stamp element: Irbp
return(OK); return(OK);
} }
int vbic_3T_it_cf_fj(p int vbic_4T_it_cf_fj(p
,Vbei,Vbex,Vbci,Vbep,Vrcx,Vbcx ,Vbei,Vbex,Vbci,Vbep,Vbcp,Vrcx
,Vrci,Vrbx,Vrbi,Vre,Vrbp,Vbe,Vbc ,Vbcx,Vrci,Vrbx,Vrbi,Vre,Vrbp,Vrs
,Ibe,Ibe_Vbei,Ibex,Ibex_Vbex,Itzf,Itzf_Vbei,Itzf_Vbci ,Vbe,Vbc,Ibe,Ibe_Vbei,Ibex,Ibex_Vbex,Itzf
,Itzr,Itzr_Vbci,Itzr_Vbei,Ibc,Ibc_Vbci,Ibc_Vbei,Ibep ,Itzf_Vbei,Itzf_Vbci,Itzr,Itzr_Vbci,Itzr_Vbei,Ibc,Ibc_Vbci
,Ibep_Vbep,Ircx,Ircx_Vrcx,Irci,Irci_Vrci,Irci_Vbci,Irci_Vbcx ,Ibc_Vbei,Ibep,Ibep_Vbep,Ircx,Ircx_Vrcx,Irci,Irci_Vrci
,Irbx,Irbx_Vrbx,Irbi,Irbi_Vrbi,Irbi_Vbei,Irbi_Vbci,Ire ,Irci_Vbci,Irci_Vbcx,Irbx,Irbx_Vrbx,Irbi,Irbi_Vrbi,Irbi_Vbei
,Ire_Vre,Irbp,Irbp_Vrbp,Irbp_Vbep,Irbp_Vbci,Qbe,Qbe_Vbei ,Irbi_Vbci,Ire,Ire_Vre,Irbp,Irbp_Vrbp,Irbp_Vbep,Irbp_Vbci
,Qbe_Vbci,Qbex,Qbex_Vbex,Qbc,Qbc_Vbci,Qbcx,Qbcx_Vbcx ,Qbe,Qbe_Vbei,Qbe_Vbci,Qbex,Qbex_Vbex,Qbc,Qbc_Vbci
,Qbep,Qbep_Vbep,Qbep_Vbci,Qbeo,Qbeo_Vbe,Qbco,Qbco_Vbc,SCALE) ,Qbcx,Qbcx_Vbcx,Qbep,Qbep_Vbep,Qbep_Vbci,Qbeo,Qbeo_Vbe
,Qbco,Qbco_Vbc,Ibcp,Ibcp_Vbcp,Iccp,Iccp_Vbep,Iccp_Vbci
,Iccp_Vbcp,Irs,Irs_Vrs,Qbcp,Qbcp_Vbcp,SCALE)
double *p double *p
,*Vbei,*Vbex,*Vbci,*Vbep,*Vrcx,*Vbcx ,*Vbei,*Vbex,*Vbci,*Vbep,*Vbcp,*Vrcx
,*Vrci,*Vrbx,*Vrbi,*Vre,*Vrbp,*Vbe,*Vbc ,*Vbcx,*Vrci,*Vrbx,*Vrbi,*Vre,*Vrbp,*Vrs
,*Ibe,*Ibe_Vbei,*Ibex,*Ibex_Vbex,*Itzf,*Itzf_Vbei,*Itzf_Vbci ,*Vbe,*Vbc,*Ibe,*Ibe_Vbei,*Ibex,*Ibex_Vbex,*Itzf
,*Itzr,*Itzr_Vbci,*Itzr_Vbei,*Ibc,*Ibc_Vbci,*Ibc_Vbei,*Ibep ,*Itzf_Vbei,*Itzf_Vbci,*Itzr,*Itzr_Vbci,*Itzr_Vbei,*Ibc,*Ibc_Vbci
,*Ibep_Vbep,*Ircx,*Ircx_Vrcx,*Irci,*Irci_Vrci,*Irci_Vbci,*Irci_Vbcx ,*Ibc_Vbei,*Ibep,*Ibep_Vbep,*Ircx,*Ircx_Vrcx,*Irci,*Irci_Vrci
,*Irbx,*Irbx_Vrbx,*Irbi,*Irbi_Vrbi,*Irbi_Vbei,*Irbi_Vbci,*Ire ,*Irci_Vbci,*Irci_Vbcx,*Irbx,*Irbx_Vrbx,*Irbi,*Irbi_Vrbi,*Irbi_Vbei
,*Ire_Vre,*Irbp,*Irbp_Vrbp,*Irbp_Vbep,*Irbp_Vbci,*Qbe,*Qbe_Vbei ,*Irbi_Vbci,*Ire,*Ire_Vre,*Irbp,*Irbp_Vrbp,*Irbp_Vbep,*Irbp_Vbci
,*Qbe_Vbci,*Qbex,*Qbex_Vbex,*Qbc,*Qbc_Vbci,*Qbcx,*Qbcx_Vbcx ,*Qbe,*Qbe_Vbei,*Qbe_Vbci,*Qbex,*Qbex_Vbex,*Qbc,*Qbc_Vbci
,*Qbep,*Qbep_Vbep,*Qbep_Vbci,*Qbeo,*Qbeo_Vbe,*Qbco,*Qbco_Vbc,*SCALE; ,*Qbcx,*Qbcx_Vbcx,*Qbep,*Qbep_Vbep,*Qbep_Vbci,*Qbeo,*Qbeo_Vbe
,*Qbco,*Qbco_Vbc,*Ibcp,*Ibcp_Vbcp,*Iccp,*Iccp_Vbep,*Iccp_Vbci
,*Iccp_Vbcp,*Irs,*Irs_Vrs,*Qbcp,*Qbcp_Vbcp,*SCALE;
{ {
double Vtv,IVEF,IVER,IIKF,IIKR,IIKP,IVO; double Vtv,IVEF,IVER,IIKF,IIKR,IIKP,IVO;
double IHRCF,IVTF,IITF,slTF,dv0,dvh,dvh_Vbei; double IHRCF,IVTF,IITF,slTF,dv0,dvh,dvh_Vbei;
@ -1131,6 +1275,8 @@ double cl_Vbci,ql,ql_Vbci,ql_vl,ql_cl,qdbc_ql,dv_Vbci;
double mv_Vbci,qdbc_vl,dvh_Vbep,qlo_Vbep,qhi_Vbep,xvar1_Vbep,xvar3_Vbep; double mv_Vbci,qdbc_vl,dvh_Vbep,qlo_Vbep,qhi_Vbep,xvar1_Vbep,xvar3_Vbep;
double qdbep,qdbep_qlo,qdbep_Vbep,qdbep_qhi,vn_Vbep,vnl_Vbep,vl_Vbep; double qdbep,qdbep_qlo,qdbep_Vbep,qdbep_qhi,vn_Vbep,vnl_Vbep,vl_Vbep;
double sel_Vbep,cl_Vbep,ql_Vbep,qdbep_ql,dv_Vbep,mv_Vbep,qdbep_vl; double sel_Vbep,cl_Vbep,ql_Vbep,qdbep_ql,dv_Vbep,mv_Vbep,qdbep_vl;
double dvh_Vbcp,qlo_Vbcp,qhi_Vbcp,xvar1_Vbcp,xvar3_Vbcp,qdbcp,qdbcp_qlo;
double qdbcp_Vbcp,qdbcp_Vbep,qdbcp_qhi,dv_Vbcp,mv_Vbcp,vl_Vbcp,qdbcp_vl;
double argi,argi_Vbei,expi,expi_argi,expi_Vbei,Ifi,Ifi_expi; double argi,argi_Vbei,expi,expi_argi,expi_Vbei,Ifi,Ifi_expi;
double Ifi_Vbei,argi_Vbci,expi_Vbci,Iri,Iri_expi,Iri_Vbci,q1z; double Ifi_Vbei,argi_Vbci,expi_Vbci,Iri,Iri_expi,Iri_Vbci,q1z;
double q1z_qdbe,q1z_Vbei,q1z_qdbc,q1z_Vbci,q1,q1_q1z,q1_Vbei; double q1z_qdbe,q1z_Vbei,q1z_qdbc,q1z_Vbci,q1,q1_q1z,q1_Vbei;
@ -1140,21 +1286,23 @@ double qb_q1,qb_Vbei,qb_Vbci,qb_xvar4,xvar2_xvar1,xvar2_Vbei,xvar2_Vbci;
double qb_xvar2,Itzr_Iri,Itzr_qb,Itzf_Ifi,Itzf_qb,argi_Vbep,expi_Vbep; double qb_xvar2,Itzr_Iri,Itzr_qb,Itzf_Ifi,Itzf_qb,argi_Vbep,expi_Vbep;
double argx,argx_Vbci,expx,expx_argx,expx_Vbci,Ifp,Ifp_expi; double argx,argx_Vbci,expx,expx_argx,expx_Vbci,Ifp,Ifp_expi;
double Ifp_Vbep,Ifp_expx,Ifp_Vbci,q2p,q2p_Ifp,q2p_Vbep,q2p_Vbci; double Ifp_Vbep,Ifp_expx,Ifp_Vbci,q2p,q2p_Ifp,q2p_Vbep,q2p_Vbci;
double qbp,qbp_q2p,qbp_Vbep,qbp_Vbci,argn,argn_Vbei,expn; double qbp,qbp_q2p,qbp_Vbep,qbp_Vbci,argi_Vbcp,expi_Vbcp,Irp;
double expn_argn,expn_Vbei,argx_Vbei,expx_Vbei,Ibe_expi,Ibe_expn,Ibe_expx; double Irp_expi,Irp_Vbcp,Iccp_Ifp,Iccp_Irp,Iccp_qbp,argn,argn_Vbei;
double argi_Vbex,expi_Vbex,argn_Vbex,expn_Vbex,argx_Vbex,expx_Vbex,Ibex_expi; double expn,expn_argn,expn_Vbei,argx_Vbei,expx_Vbei,Ibe_expi,Ibe_expn;
double Ibex_expn,Ibex_expx,argn_Vbci,expn_Vbci,Ibcj,Ibcj_expi,Ibcj_Vbci; double Ibe_expx,argi_Vbex,expi_Vbex,argn_Vbex,expn_Vbex,argx_Vbex,expx_Vbex;
double Ibcj_expn,argn_Vbep,expn_Vbep,Ibep_expi,Ibep_expn,xvar3_vl,avalf; double Ibex_expi,Ibex_expn,Ibex_expx,argn_Vbci,expn_Vbci,Ibcj,Ibcj_expi;
double avalf_vl,avalf_Vbci,avalf_xvar4,Igc,Igc_Itzf,Igc_Vbei,Igc_Vbci; double Ibcj_Vbci,Ibcj_expn,argn_Vbep,expn_Vbep,Ibep_expi,Ibep_expn,xvar3_vl;
double Igc_Itzr,Igc_Ibcj,Igc_avalf,Ibc_Ibcj,Ibc_Igc,argx_Vbcx,expx_Vbcx; double avalf,avalf_vl,avalf_Vbci,avalf_xvar4,Igc,Igc_Itzf,Igc_Vbei;
double Kbci,Kbci_expi,Kbci_Vbci,Kbcx,Kbcx_expx,Kbcx_Vbcx,rKp1; double Igc_Vbci,Igc_Itzr,Igc_Ibcj,Igc_avalf,Ibc_Ibcj,Ibc_Igc,argx_Vbcx;
double rKp1_Kbci,rKp1_Vbci,rKp1_Kbcx,rKp1_Vbcx,xvar1_rKp1,xvar1_Vbcx,Iohm; double expx_Vbcx,Kbci,Kbci_expi,Kbci_Vbci,Kbcx,Kbcx_expx,Kbcx_Vbcx;
double Iohm_Vrci,Iohm_Kbci,Iohm_Vbci,Iohm_Kbcx,Iohm_Vbcx,Iohm_xvar1,derf; double rKp1,rKp1_Kbci,rKp1_Vbci,rKp1_Kbcx,rKp1_Vbcx,xvar1_rKp1,xvar1_Vbcx;
double derf_Iohm,derf_Vrci,derf_Vbci,derf_Vbcx,Irci_Iohm,Irci_derf,Irbi_qb; double Iohm,Iohm_Vrci,Iohm_Kbci,Iohm_Vbci,Iohm_Kbcx,Iohm_Vbcx,Iohm_xvar1;
double Irbp_qbp,sgIf,rIf,rIf_Ifi,rIf_Vbei,mIf,mIf_rIf; double derf,derf_Iohm,derf_Vrci,derf_Vbci,derf_Vbcx,Irci_Iohm,Irci_derf;
double mIf_Vbei,tff,tff_q1,tff_Vbei,tff_Vbci,tff_xvar2,tff_mIf; double Irbi_qb,Irbp_qbp,argn_Vbcp,expn_Vbcp,Ibcp_expi,Ibcp_expn,sgIf;
double Qbe_qdbe,Qbe_tff,Qbe_Ifi,Qbe_qb,Qbex_qdbex,Qbc_qdbc,Qbc_Iri; double rIf,rIf_Ifi,rIf_Vbei,mIf,mIf_rIf,mIf_Vbei,tff;
double Qbc_Kbci,Qbcx_Kbcx,Qbep_qdbep,Qbep_Ifp; double tff_q1,tff_Vbei,tff_Vbci,tff_xvar2,tff_mIf,Qbe_qdbe,Qbe_tff;
double Qbe_Ifi,Qbe_qb,Qbex_qdbex,Qbc_qdbc,Qbc_Iri,Qbc_Kbci,Qbcx_Kbcx;
double Qbep_qdbep,Qbep_Ifp,Qbcp_qdbcp;
/* Function and derivative code */ /* Function and derivative code */
@ -1599,6 +1747,87 @@ double Qbc_Kbci,Qbcx_Kbcx,Qbep_qdbep,Qbep_Ifp;
qdbep_Vbep=qdbep_Vbep+qdbep_vl*vl_Vbep; qdbep_Vbep=qdbep_Vbep+qdbep_vl*vl_Vbep;
} }
} }
if(p[27]>0.0){
dv0=-p[28]*p[14];
if(p[30]<=0.0){
dvh=(*Vbcp)+dv0;
dvh_Vbcp=1.0;
if(dvh>0.0){
xvar1=(1.0-p[14]);
xvar2=(-1.0-p[29]);
pwq=pow(xvar1,xvar2);
qlo=p[28]*(1.0-pwq*(1.0-p[14])*(1.0-p[14]))/(1.0-p[29]);
qlo_Vbep=0.0;
qlo_Vbcp=0.0;
qhi=dvh*(1.0-p[14]+0.5*p[29]*dvh/p[28])*pwq;
qhi_dvh=(0.5*dvh*p[29]/p[28]-p[14]+1.0)*pwq+0.5*dvh*p[29]*pwq/p[28];
qhi_Vbep=0.0;
qhi_Vbcp=qhi_dvh*dvh_Vbcp;
}else{
xvar1=(1.0-(*Vbcp)/p[28]);
xvar1_Vbcp=-1.0/p[28];
xvar2=(1.0-p[29]);
xvar3=pow(xvar1,xvar2);
xvar3_xvar1=xvar3*xvar2/xvar1;
xvar3_Vbcp=xvar3_xvar1*xvar1_Vbcp;
qlo=p[28]*(1.0-xvar3)/(1.0-p[29]);
qlo_xvar3=-p[28]/(1.0-p[29]);
qlo_Vbep=0.0;
qlo_Vbcp=qlo_xvar3*xvar3_Vbcp;
qhi=0.0;
qhi_Vbep=0.0;
qhi_Vbcp=0.0;
}
qdbcp=qlo+qhi;
qdbcp_qlo=1.0;
qdbcp_qhi=1.0;
qdbcp_Vbcp=qdbcp_qlo*qlo_Vbcp;
qdbcp_Vbep=qdbcp_qlo*qlo_Vbep;
qdbcp_Vbep=qdbcp_Vbep+qdbcp_qhi*qhi_Vbep;
qdbcp_Vbcp=qdbcp_Vbcp+qdbcp_qhi*qhi_Vbcp;
}else{
mv0=sqrt(dv0*dv0+4.0*p[30]*p[30]);
vl0=-0.5*(dv0+mv0);
xvar1=(1.0-vl0/p[28]);
xvar2=(1.0-p[29]);
xvar3=pow(xvar1,xvar2);
q0=-p[28]*xvar3/(1.0-p[29]);
dv=(*Vbcp)+dv0;
dv_Vbcp=1.0;
mv=sqrt(dv*dv+4.0*p[30]*p[30]);
mv_dv=dv/sqrt((dv*dv)+4.0*(p[30]*p[30]));
mv_Vbcp=mv_dv*dv_Vbcp;
vl=0.5*(dv-mv)-dv0;
vl_dv=0.5;
vl_mv=-0.5;
vl_Vbcp=vl_dv*dv_Vbcp;
vl_Vbcp=vl_Vbcp+vl_mv*mv_Vbcp;
xvar1=(1.0-vl/p[28]);
xvar1_vl=-1.0/p[28];
xvar1_Vbcp=xvar1_vl*vl_Vbcp;
xvar2=(1.0-p[29]);
xvar3=pow(xvar1,xvar2);
xvar3_xvar1=xvar3*xvar2/xvar1;
xvar3_Vbcp=xvar3_xvar1*xvar1_Vbcp;
qlo=-p[28]*xvar3/(1.0-p[29]);
qlo_xvar3=-p[28]/(1.0-p[29]);
qlo_Vbep=0.0;
qlo_Vbcp=qlo_xvar3*xvar3_Vbcp;
xvar1=(1.0-p[14]);
xvar2=(-p[29]);
xvar3=pow(xvar1,xvar2);
qdbcp=qlo+xvar3*((*Vbcp)-vl+vl0)-q0;
qdbcp_qlo=1.0;
qdbcp_Vbcp=xvar3;
qdbcp_vl=-xvar3;
qdbcp_Vbcp=qdbcp_Vbcp+qdbcp_qlo*qlo_Vbcp;
qdbcp_Vbep=qdbcp_qlo*qlo_Vbep;
qdbcp_Vbcp=qdbcp_Vbcp+qdbcp_vl*vl_Vbcp;
}
}else{
qdbcp=0.0;
qdbcp_Vbcp=0.0;
}
argi=(*Vbei)/(p[12]*Vtv); argi=(*Vbei)/(p[12]*Vtv);
argi_Vbei=1.0/(p[12]*Vtv); argi_Vbei=1.0/(p[12]*Vtv);
expi=exp(argi); expi=exp(argi);
@ -1706,6 +1935,23 @@ double Qbc_Kbci,Qbcx_Kbcx,Qbep_qdbep,Qbep_Ifp;
qbp_q2p=1.0/sqrt(4.0*q2p+1.0); qbp_q2p=1.0/sqrt(4.0*q2p+1.0);
qbp_Vbep=qbp_q2p*q2p_Vbep; qbp_Vbep=qbp_q2p*q2p_Vbep;
qbp_Vbci=qbp_q2p*q2p_Vbci; qbp_Vbci=qbp_q2p*q2p_Vbci;
argi=(*Vbcp)/(p[44]*Vtv);
argi_Vbcp=1.0/(p[44]*Vtv);
expi=exp(argi);
expi_argi=expi;
expi_Vbcp=expi_argi*argi_Vbcp;
Irp=p[42]*(expi-1.0);
Irp_expi=p[42];
Irp_Vbcp=Irp_expi*expi_Vbcp;
(*Iccp)=(Ifp-Irp)/qbp;
Iccp_Ifp=1.0/qbp;
Iccp_Irp=-1.0/qbp;
Iccp_qbp=-(Ifp-Irp)/(qbp*qbp);
*Iccp_Vbep=Iccp_Ifp*Ifp_Vbep;
*Iccp_Vbci=Iccp_Ifp*Ifp_Vbci;
*Iccp_Vbcp=Iccp_Irp*Irp_Vbcp;
*Iccp_Vbep=(*Iccp_Vbep)+Iccp_qbp*qbp_Vbep;
*Iccp_Vbci=(*Iccp_Vbci)+Iccp_qbp*qbp_Vbci;
}else{ }else{
Ifp=0.0; Ifp=0.0;
Ifp_Vbep=0.0; Ifp_Vbep=0.0;
@ -1713,6 +1959,10 @@ double Qbc_Kbci,Qbcx_Kbcx,Qbep_qdbep,Qbep_Ifp;
qbp=1.0; qbp=1.0;
qbp_Vbep=0.0; qbp_Vbep=0.0;
qbp_Vbci=0.0; qbp_Vbci=0.0;
(*Iccp)=0.0;
*Iccp_Vbep=0.0;
*Iccp_Vbci=0.0;
*Iccp_Vbcp=0.0;
} }
if(p[32]==1.0){ if(p[32]==1.0){
argi=(*Vbei)/(p[33]*Vtv); argi=(*Vbei)/(p[33]*Vtv);
@ -2018,6 +2268,33 @@ double Qbc_Kbci,Qbcx_Kbcx,Qbep_qdbep,Qbep_Ifp;
*Irbp_Vbep=0.0; *Irbp_Vbep=0.0;
*Irbp_Vbci=0.0; *Irbp_Vbci=0.0;
} }
if((p[47]>0.0)||(p[49]>0.0)){
argi=(*Vbcp)/(p[48]*Vtv);
argi_Vbcp=1.0/(p[48]*Vtv);
expi=exp(argi);
expi_argi=expi;
expi_Vbcp=expi_argi*argi_Vbcp;
argn=(*Vbcp)/(p[50]*Vtv);
argn_Vbcp=1.0/(p[50]*Vtv);
expn=exp(argn);
expn_argn=expn;
expn_Vbcp=expn_argn*argn_Vbcp;
(*Ibcp)=p[47]*(expi-1.0)+p[49]*(expn-1.0);
Ibcp_expi=p[47];
Ibcp_expn=p[49];
*Ibcp_Vbcp=Ibcp_expi*expi_Vbcp;
*Ibcp_Vbcp=(*Ibcp_Vbcp)+Ibcp_expn*expn_Vbcp;
}else{
(*Ibcp)=0.0;
*Ibcp_Vbcp=0.0;
}
if(p[9]>0.0){
(*Irs)=(*Vrs)/p[9];
*Irs_Vrs=1.0/p[9];
}else{
(*Irs)=0.0;
*Irs_Vrs=0.0;
}
if(Ifi>0.0){ if(Ifi>0.0){
sgIf=1.0; sgIf=1.0;
}else{ }else{
@ -2072,6 +2349,10 @@ double Qbc_Kbci,Qbcx_Kbcx,Qbep_qdbep,Qbep_Ifp;
*Qbep_Vbep=Qbep_qdbep*qdbep_Vbep; *Qbep_Vbep=Qbep_qdbep*qdbep_Vbep;
*Qbep_Vbep=(*Qbep_Vbep)+Qbep_Ifp*Ifp_Vbep; *Qbep_Vbep=(*Qbep_Vbep)+Qbep_Ifp*Ifp_Vbep;
*Qbep_Vbci=Qbep_Ifp*Ifp_Vbci; *Qbep_Vbci=Qbep_Ifp*Ifp_Vbci;
(*Qbcp)=p[27]*qdbcp+p[87]*(*Vbcp);
Qbcp_qdbcp=p[27];
*Qbcp_Vbcp=p[87];
*Qbcp_Vbcp=(*Qbcp_Vbcp)+Qbcp_qdbcp*qdbcp_Vbcp;
(*Qbeo)=(*Vbe)*p[15]; (*Qbeo)=(*Vbe)*p[15];
*Qbeo_Vbe=p[15]; *Qbeo_Vbe=p[15];
(*Qbco)=(*Vbc)*p[20]; (*Qbco)=(*Vbc)*p[20];
@ -2129,6 +2410,16 @@ double Qbc_Kbci,Qbcx_Kbcx,Qbep_qdbep,Qbep_Ifp;
*Qbeo_Vbe=(*SCALE)*(*Qbeo_Vbe); *Qbeo_Vbe=(*SCALE)*(*Qbeo_Vbe);
*Qbco=(*SCALE)*(*Qbco); *Qbco=(*SCALE)*(*Qbco);
*Qbco_Vbc=(*SCALE)*(*Qbco_Vbc); *Qbco_Vbc=(*SCALE)*(*Qbco_Vbc);
*Ibcp=(*SCALE)*(*Ibcp);
*Ibcp_Vbcp=(*SCALE)*(*Ibcp_Vbcp);
*Iccp=(*SCALE)*(*Iccp);
*Iccp_Vbep=(*SCALE)*(*Iccp_Vbep);
*Iccp_Vbci=(*SCALE)*(*Iccp_Vbci);
*Iccp_Vbcp=(*SCALE)*(*Iccp_Vbcp);
*Irs=(*SCALE)*(*Irs);
*Irs_Vrs=(*SCALE)*(*Irs_Vrs);
*Qbcp=(*SCALE)*(*Qbcp);
*Qbcp_Vbcp=(*SCALE)*(*Qbcp_Vbcp);
} }
return(0); return(0);
} }

View File

@ -23,7 +23,7 @@ VBICmAsk(CKTcircuit *ckt, GENmodel *instPtr, int which, IFvalue *value)
switch(which) { switch(which) {
case VBIC_MOD_TNOM: case VBIC_MOD_TNOM:
value->rValue = here->VBICtnom-CONSTCtoK; value->rValue = here->VBICtnom;
return(OK); return(OK);
case VBIC_MOD_RCX: case VBIC_MOD_RCX:
value->rValue = here->VBICextCollResist; value->rValue = here->VBICextCollResist;

View File

@ -41,6 +41,7 @@ VBICmParam(int param, IFvalue *value, GENmodel *inModel)
break; break;
case VBIC_MOD_RCX: case VBIC_MOD_RCX:
mods->VBICextCollResist = value->rValue; mods->VBICextCollResist = value->rValue;
if (mods->VBICextCollResist < 0.1) mods->VBICextCollResist = 0.1;
mods->VBICextCollResistGiven = TRUE; mods->VBICextCollResistGiven = TRUE;
break; break;
case VBIC_MOD_RCI: case VBIC_MOD_RCI:
@ -62,6 +63,7 @@ VBICmParam(int param, IFvalue *value, GENmodel *inModel)
break; break;
case VBIC_MOD_RBX: case VBIC_MOD_RBX:
mods->VBICextBaseResist = value->rValue; mods->VBICextBaseResist = value->rValue;
if (mods->VBICextBaseResist < 0.1) mods->VBICextBaseResist = 0.1;
mods->VBICextBaseResistGiven = TRUE; mods->VBICextBaseResistGiven = TRUE;
break; break;
case VBIC_MOD_RBI: case VBIC_MOD_RBI:
@ -71,10 +73,12 @@ 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;
mods->VBICemitterResistGiven = TRUE; mods->VBICemitterResistGiven = TRUE;
break; break;
case VBIC_MOD_RS: case VBIC_MOD_RS:
mods->VBICsubstrateResist = value->rValue; mods->VBICsubstrateResist = value->rValue;
if (mods->VBICsubstrateResist < 0.1) mods->VBICsubstrateResist = 0.1;
mods->VBICsubstrateResistGiven = TRUE; mods->VBICsubstrateResistGiven = TRUE;
break; break;
case VBIC_MOD_RBP: case VBIC_MOD_RBP:

View File

@ -51,9 +51,11 @@ VBICnoise (int mode, int operation, GENmodel *genmodel, CKTcircuit *ckt, Ndata *
"_rbp", /* noise due to rbp */ "_rbp", /* noise due to rbp */
"_ic", /* noise due to ic */ "_ic", /* noise due to ic */
"_ib", /* noise due to ib */ "_ib", /* noise due to ib */
"_ibep", /* noise due to ib */ "_ibep", /* noise due to ibep */
"_1overfbe", /* flicker (1/f) noise */ "_1overfbe", /* flicker (1/f) noise ibe */
"_1overfbep", /* flicker (1/f) noise */ "_1overfbep", /* flicker (1/f) noise ibep */
"_rs", /* noise due to rs */
"_iccp", /* noise due to iccp */
"" /* total transistor noise */ "" /* total transistor noise */
}; };
@ -147,6 +149,10 @@ if (!data->namelist) return(E_NOMEM);
ckt,THERMNOISE,inst->VBICemitEINode,inst->VBICemitNode, ckt,THERMNOISE,inst->VBICemitEINode,inst->VBICemitNode,
*(ckt->CKTstate0 + inst->VBICirbp_Vrbp)); *(ckt->CKTstate0 + inst->VBICirbp_Vrbp));
NevalSrc(&noizDens[VBICRSNOIZ],&lnNdens[VBICRSNOIZ],
ckt,THERMNOISE,inst->VBICsubsSINode,inst->VBICsubsNode,
model->VBICsubstrateConduct * inst->VBICarea * inst->VBICm);
NevalSrc(&noizDens[VBICICNOIZ],&lnNdens[VBICICNOIZ], NevalSrc(&noizDens[VBICICNOIZ],&lnNdens[VBICICNOIZ],
ckt,SHOTNOISE,inst->VBICcollCINode, inst->VBICemitEINode, ckt,SHOTNOISE,inst->VBICcollCINode, inst->VBICemitEINode,
@ -160,6 +166,10 @@ if (!data->namelist) return(E_NOMEM);
ckt,SHOTNOISE,inst->VBICbaseBXNode, inst->VBICbaseBPNode, ckt,SHOTNOISE,inst->VBICbaseBXNode, inst->VBICbaseBPNode,
*(ckt->CKTstate0 + inst->VBICibep)); *(ckt->CKTstate0 + inst->VBICibep));
NevalSrc(&noizDens[VBICICCPNOIZ],&lnNdens[VBICICCPNOIZ],
ckt,SHOTNOISE,inst->VBICbaseBXNode, inst->VBICsubsSINode,
*(ckt->CKTstate0 + inst->VBICiccp));
NevalSrc(&noizDens[VBICFLBENOIZ],(double*)NULL,ckt, NevalSrc(&noizDens[VBICFLBENOIZ],(double*)NULL,ckt,
N_GAIN,inst->VBICbaseBINode, inst->VBICemitEINode, N_GAIN,inst->VBICbaseBINode, inst->VBICemitEINode,

View File

@ -26,9 +26,11 @@ VBICpzLoad(GENmodel *inModel, CKTcircuit *ckt, SPcomplex *s)
,Itzf_Vbei,Itzf_Vbci,Itzr_Vbci,Itzr_Vbei,Ibc_Vbci ,Itzf_Vbei,Itzf_Vbci,Itzr_Vbci,Itzr_Vbei,Ibc_Vbci
,Ibc_Vbei,Ibep_Vbep,Ircx_Vrcx,Irci_Vrci ,Ibc_Vbei,Ibep_Vbep,Ircx_Vrcx,Irci_Vrci
,Irci_Vbci,Irci_Vbcx,Irbx_Vrbx,Irbi_Vrbi,Irbi_Vbei ,Irci_Vbci,Irci_Vbcx,Irbx_Vrbx,Irbi_Vrbi,Irbi_Vbei
,Irbi_Vbci,Ire_Vre,Irbp_Vrbp,Irbp_Vbep,Irbp_Vbci; ,Irbi_Vbci,Ire_Vre,Irbp_Vrbp,Irbp_Vbep,Irbp_Vbci
,Ibcp_Vbcp,Iccp_Vbep,Irs_Vrs,Iccp_Vbci,Iccp_Vbcp;
double XQbe_Vbei, XQbe_Vbci, XQbex_Vbex, XQbc_Vbci, double XQbe_Vbei, XQbe_Vbci, XQbex_Vbex, XQbc_Vbci,
XQbcx_Vbcx, XQbep_Vbep, XQbep_Vbci; XQbcx_Vbcx, XQbep_Vbep, XQbep_Vbci,
XQbcp_Vbcp;
/* loop through all the models */ /* loop through all the models */
for( ; model != NULL; model = model->VBICnextModel) { for( ; model != NULL; model = model->VBICnextModel) {
@ -36,12 +38,14 @@ VBICpzLoad(GENmodel *inModel, CKTcircuit *ckt, SPcomplex *s)
/* 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) {
if (here->VBICowner != ARCHme) continue; if (here->VBICowner != ARCHme) continue;
Ircx_Vrcx = 1.0 / model->VBICextCollResist * here->VBICarea * here->VBICm; Ircx_Vrcx = 1.0 / here->VBICtextCollResist * here->VBICarea * here->VBICm;
Irbx_Vrbx = 1.0 / model->VBICextBaseResist * here->VBICarea * here->VBICm; Irbx_Vrbx = 1.0 / here->VBICtextBaseResist * here->VBICarea * here->VBICm;
Ire_Vre = 1.0 / model->VBICemitterResist * here->VBICarea * here->VBICm; Ire_Vre = 1.0 / here->VBICtemitterResist * here->VBICarea * here->VBICm;
Irs_Vrs = 1.0 / here->VBICtsubstrateResist * here->VBICarea * here->VBICm;
Ibe_Vbei = *(ckt->CKTstate0 + here->VBICibe_Vbei); Ibe_Vbei = *(ckt->CKTstate0 + here->VBICibe_Vbei);
Ibex_Vbex = *(ckt->CKTstate0 + here->VBICibex_Vbex); Ibex_Vbex = *(ckt->CKTstate0 + here->VBICibex_Vbex);
@ -61,6 +65,10 @@ VBICpzLoad(GENmodel *inModel, CKTcircuit *ckt, SPcomplex *s)
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);
Ibcp_Vbcp = *(ckt->CKTstate0 + here->VBICibcp_Vbcp);
Iccp_Vbep = *(ckt->CKTstate0 + here->VBICiccp_Vbep);
Iccp_Vbci = *(ckt->CKTstate0 + here->VBICiccp_Vbci);
Iccp_Vbcp = *(ckt->CKTstate0 + here->VBICiccp_Vbcp);
/* /*
c The real part c The real part
@ -186,6 +194,35 @@ c Stamp element: Irbp
*(here->VBICcollCXBaseBIPtr) += -Irbp_Vbci; *(here->VBICcollCXBaseBIPtr) += -Irbp_Vbci;
*(here->VBICcollCXCollCIPtr) += Irbp_Vbci; *(here->VBICcollCXCollCIPtr) += Irbp_Vbci;
/* /*
c Stamp element: Ibcp
*/
*(here->VBICsubsSISubsSIPtr) += Ibcp_Vbcp;
*(here->VBICsubsSIBaseBPPtr) += -Ibcp_Vbcp;
*(here->VBICbaseBPSubsSIPtr) += -Ibcp_Vbcp;
*(here->VBICbaseBPBaseBPPtr) += Ibcp_Vbcp;
/*
c Stamp element: Iccp
*/
*(here->VBICbaseBXBaseBXPtr) += Iccp_Vbep;
*(here->VBICbaseBXBaseBPPtr) += -Iccp_Vbep;
*(here->VBICbaseBXBaseBIPtr) += Iccp_Vbci;
*(here->VBICbaseBXCollCIPtr) += -Iccp_Vbci;
*(here->VBICbaseBXSubsSIPtr) += Iccp_Vbcp;
*(here->VBICbaseBXBaseBPPtr) += -Iccp_Vbcp;
*(here->VBICsubsSIBaseBXPtr) += -Iccp_Vbep;
*(here->VBICsubsSIBaseBPPtr) += Iccp_Vbep;
*(here->VBICsubsSIBaseBIPtr) += -Iccp_Vbci;
*(here->VBICsubsSICollCIPtr) += Iccp_Vbci;
*(here->VBICsubsSISubsSIPtr) += -Iccp_Vbcp;
*(here->VBICsubsSIBaseBPPtr) += Iccp_Vbcp;
/*
c Stamp element: Irs
*/
*(here->VBICsubsSubsPtr) += Irs_Vrs;
*(here->VBICsubsSISubsSIPtr) += Irs_Vrs;
*(here->VBICsubsSISubsPtr) += -Irs_Vrs;
*(here->VBICsubsSubsSIPtr) += -Irs_Vrs;
/*
c The complex part c The complex part
*/ */
XQbe_Vbei = *(ckt->CKTstate0 + here->VBICcqbe); XQbe_Vbei = *(ckt->CKTstate0 + here->VBICcqbe);
@ -195,77 +232,89 @@ c The complex part
XQbcx_Vbcx = *(ckt->CKTstate0 + here->VBICcqbcx); XQbcx_Vbcx = *(ckt->CKTstate0 + here->VBICcqbcx);
XQbep_Vbep = *(ckt->CKTstate0 + here->VBICcqbep); XQbep_Vbep = *(ckt->CKTstate0 + here->VBICcqbep);
XQbep_Vbci = *(ckt->CKTstate0 + here->VBICcqbepci); XQbep_Vbci = *(ckt->CKTstate0 + here->VBICcqbepci);
XQbcp_Vbcp = *(ckt->CKTstate0 + here->VBICcqbcp) * ckt->CKTomega;
/* /*
c Stamp element: Qbe c Stamp element: Qbe
*/ */
*(here->VBICbaseBIBaseBIPtr) += (XQbe_Vbei * (s->real)); *(here->VBICbaseBIBaseBIPtr) += XQbe_Vbei * (s->real);
*(here->VBICbaseBIBaseBIPtr + 1) += (XQbe_Vbei * (s->imag)); *(here->VBICbaseBIBaseBIPtr + 1) += XQbe_Vbei * (s->imag);
*(here->VBICbaseBIEmitEIPtr) += (-XQbe_Vbei * (s->real)); *(here->VBICbaseBIEmitEIPtr) += -XQbe_Vbei * (s->real);
*(here->VBICbaseBIEmitEIPtr + 1) += (-XQbe_Vbei * (s->imag)); *(here->VBICbaseBIEmitEIPtr + 1) += -XQbe_Vbei * (s->imag);
*(here->VBICbaseBIBaseBIPtr) += (XQbe_Vbci * (s->real)); *(here->VBICbaseBIBaseBIPtr) += XQbe_Vbci * (s->real);
*(here->VBICbaseBIBaseBIPtr + 1) += (XQbe_Vbci * (s->imag)); *(here->VBICbaseBIBaseBIPtr + 1) += XQbe_Vbci * (s->imag);
*(here->VBICbaseBICollCIPtr) += (-XQbe_Vbci * (s->real)); *(here->VBICbaseBICollCIPtr) += -XQbe_Vbci * (s->real);
*(here->VBICbaseBICollCIPtr + 1) += (-XQbe_Vbci * (s->imag)); *(here->VBICbaseBICollCIPtr + 1) += -XQbe_Vbci * (s->imag);
*(here->VBICemitEIBaseBIPtr) += (-XQbe_Vbei * (s->real)); *(here->VBICemitEIBaseBIPtr) += -XQbe_Vbei * (s->real);
*(here->VBICemitEIBaseBIPtr + 1) += (-XQbe_Vbei * (s->imag)); *(here->VBICemitEIBaseBIPtr + 1) += -XQbe_Vbei * (s->imag);
*(here->VBICemitEIEmitEIPtr) += (XQbe_Vbei * (s->real)); *(here->VBICemitEIEmitEIPtr) += XQbe_Vbei * (s->real);
*(here->VBICemitEIEmitEIPtr + 1) += (XQbe_Vbei * (s->imag)); *(here->VBICemitEIEmitEIPtr + 1) += XQbe_Vbei * (s->imag);
*(here->VBICemitEIBaseBIPtr) += (-XQbe_Vbci * (s->real)); *(here->VBICemitEIBaseBIPtr) += -XQbe_Vbci * (s->real);
*(here->VBICemitEIBaseBIPtr + 1) += (-XQbe_Vbci * (s->imag)); *(here->VBICemitEIBaseBIPtr + 1) += -XQbe_Vbci * (s->imag);
*(here->VBICemitEICollCIPtr) += (XQbe_Vbci * (s->real)); *(here->VBICemitEICollCIPtr) += XQbe_Vbci * (s->real);
*(here->VBICemitEICollCIPtr + 1) += (XQbe_Vbci * (s->imag)); *(here->VBICemitEICollCIPtr + 1) += XQbe_Vbci * (s->imag);
/* /*
c Stamp element: Qbex c Stamp element: Qbex
*/ */
*(here->VBICbaseBXBaseBXPtr) += (XQbex_Vbex * (s->real)); *(here->VBICbaseBXBaseBXPtr) += XQbex_Vbex * (s->real);
*(here->VBICbaseBXBaseBXPtr + 1) += (XQbex_Vbex * (s->imag)); *(here->VBICbaseBXBaseBXPtr + 1) += XQbex_Vbex * (s->imag);
*(here->VBICbaseBXEmitEIPtr) += (-XQbex_Vbex * (s->real)); *(here->VBICbaseBXEmitEIPtr) += -XQbex_Vbex * (s->real);
*(here->VBICbaseBXEmitEIPtr + 1) += (-XQbex_Vbex * (s->imag)); *(here->VBICbaseBXEmitEIPtr + 1) += -XQbex_Vbex * (s->imag);
*(here->VBICemitEIBaseBXPtr) += (-XQbex_Vbex * (s->real)); *(here->VBICemitEIBaseBXPtr) += -XQbex_Vbex * (s->real);
*(here->VBICemitEIBaseBXPtr + 1) += (-XQbex_Vbex * (s->imag)); *(here->VBICemitEIBaseBXPtr + 1) += -XQbex_Vbex * (s->imag);
*(here->VBICemitEIEmitEIPtr ) += (XQbex_Vbex * (s->real)); *(here->VBICemitEIEmitEIPtr ) += XQbex_Vbex * (s->real);
*(here->VBICemitEIEmitEIPtr + 1) += (XQbex_Vbex * (s->imag)); *(here->VBICemitEIEmitEIPtr + 1) += XQbex_Vbex * (s->imag);
/* /*
c Stamp element: Qbc c Stamp element: Qbc
*/ */
*(here->VBICbaseBIBaseBIPtr) += (XQbc_Vbci * (s->real)); *(here->VBICbaseBIBaseBIPtr) += XQbc_Vbci * (s->real);
*(here->VBICbaseBIBaseBIPtr + 1) += (XQbc_Vbci * (s->imag)); *(here->VBICbaseBIBaseBIPtr + 1) += XQbc_Vbci * (s->imag);
*(here->VBICbaseBICollCIPtr) += (-XQbc_Vbci * (s->real)); *(here->VBICbaseBICollCIPtr) += -XQbc_Vbci * (s->real);
*(here->VBICbaseBICollCIPtr + 1) += (-XQbc_Vbci * (s->imag)); *(here->VBICbaseBICollCIPtr + 1) += -XQbc_Vbci * (s->imag);
*(here->VBICcollCIBaseBIPtr) += (-XQbc_Vbci * (s->real)); *(here->VBICcollCIBaseBIPtr) += -XQbc_Vbci * (s->real);
*(here->VBICcollCIBaseBIPtr + 1) += (-XQbc_Vbci * (s->imag)); *(here->VBICcollCIBaseBIPtr + 1) += -XQbc_Vbci * (s->imag);
*(here->VBICcollCICollCIPtr) += (XQbc_Vbci * (s->real)); *(here->VBICcollCICollCIPtr) += XQbc_Vbci * (s->real);
*(here->VBICcollCICollCIPtr + 1) += (XQbc_Vbci * (s->imag)); *(here->VBICcollCICollCIPtr + 1) += XQbc_Vbci * (s->imag);
/* /*
c Stamp element: Qbcx c Stamp element: Qbcx
*/ */
*(here->VBICbaseBIBaseBIPtr) += (XQbcx_Vbcx * (s->real)); *(here->VBICbaseBIBaseBIPtr) += XQbcx_Vbcx * (s->real);
*(here->VBICbaseBIBaseBIPtr + 1) += (XQbcx_Vbcx * (s->imag)); *(here->VBICbaseBIBaseBIPtr + 1) += XQbcx_Vbcx * (s->imag);
*(here->VBICbaseBICollCXPtr) += (-XQbcx_Vbcx * (s->real)); *(here->VBICbaseBICollCXPtr) += -XQbcx_Vbcx * (s->real);
*(here->VBICbaseBICollCXPtr + 1) += (-XQbcx_Vbcx * (s->imag)); *(here->VBICbaseBICollCXPtr + 1) += -XQbcx_Vbcx * (s->imag);
*(here->VBICcollCXBaseBIPtr) += (-XQbcx_Vbcx * (s->real)); *(here->VBICcollCXBaseBIPtr) += -XQbcx_Vbcx * (s->real);
*(here->VBICcollCXBaseBIPtr + 1) += (-XQbcx_Vbcx * (s->imag)); *(here->VBICcollCXBaseBIPtr + 1) += -XQbcx_Vbcx * (s->imag);
*(here->VBICcollCXCollCXPtr) += (XQbcx_Vbcx * (s->real)); *(here->VBICcollCXCollCXPtr) += XQbcx_Vbcx * (s->real);
*(here->VBICcollCXCollCXPtr + 1) += (XQbcx_Vbcx * (s->imag)); *(here->VBICcollCXCollCXPtr + 1) += XQbcx_Vbcx * (s->imag);
/* /*
c Stamp element: Qbep c Stamp element: Qbep
*/ */
*(here->VBICbaseBXBaseBXPtr) += (XQbep_Vbep * (s->real)); *(here->VBICbaseBXBaseBXPtr) += XQbep_Vbep * (s->real);
*(here->VBICbaseBXBaseBXPtr + 1) += (XQbep_Vbep * (s->imag)); *(here->VBICbaseBXBaseBXPtr + 1) += XQbep_Vbep * (s->imag);
*(here->VBICbaseBXBaseBPPtr) += (-XQbep_Vbep * (s->real)); *(here->VBICbaseBXBaseBPPtr) += -XQbep_Vbep * (s->real);
*(here->VBICbaseBXBaseBPPtr + 1) += (-XQbep_Vbep * (s->imag)); *(here->VBICbaseBXBaseBPPtr + 1) += -XQbep_Vbep * (s->imag);
*(here->VBICbaseBXBaseBIPtr) += (XQbep_Vbci * (s->real)); *(here->VBICbaseBXBaseBIPtr) += XQbep_Vbci * (s->real);
*(here->VBICbaseBXBaseBIPtr + 1) += (XQbep_Vbci * (s->imag)); *(here->VBICbaseBXBaseBIPtr + 1) += XQbep_Vbci * (s->imag);
*(here->VBICbaseBXCollCIPtr) += (-XQbep_Vbci * (s->real)); *(here->VBICbaseBXCollCIPtr) += -XQbep_Vbci * (s->real);
*(here->VBICbaseBXCollCIPtr + 1) += (-XQbep_Vbci * (s->imag)); *(here->VBICbaseBXCollCIPtr + 1) += -XQbep_Vbci * (s->imag);
*(here->VBICbaseBPBaseBXPtr) += (-XQbep_Vbep * (s->real)); *(here->VBICbaseBPBaseBXPtr) += -XQbep_Vbep * (s->real);
*(here->VBICbaseBPBaseBXPtr + 1) += (-XQbep_Vbep * (s->imag)); *(here->VBICbaseBPBaseBXPtr + 1) += -XQbep_Vbep * (s->imag);
*(here->VBICbaseBPBaseBPPtr) += (XQbep_Vbep * (s->real)); *(here->VBICbaseBPBaseBPPtr) += XQbep_Vbep * (s->real);
*(here->VBICbaseBPBaseBPPtr + 1) += (XQbep_Vbep * (s->imag)); *(here->VBICbaseBPBaseBPPtr + 1) += XQbep_Vbep * (s->imag);
*(here->VBICbaseBPBaseBIPtr) += (-XQbep_Vbci * (s->real)); *(here->VBICbaseBPBaseBIPtr) += -XQbep_Vbci * (s->real);
*(here->VBICbaseBPBaseBIPtr + 1) += (-XQbep_Vbci * (s->imag)); *(here->VBICbaseBPBaseBIPtr + 1) += -XQbep_Vbci * (s->imag);
*(here->VBICbaseBPCollCIPtr) += (XQbep_Vbci * (s->real)); *(here->VBICbaseBPCollCIPtr) += XQbep_Vbci * (s->real);
*(here->VBICbaseBPCollCIPtr + 1) += (XQbep_Vbci * (s->imag)); *(here->VBICbaseBPCollCIPtr + 1) += XQbep_Vbci * (s->imag);
/*
c Stamp element: Qbcp
*/
*(here->VBICsubsSISubsSIPtr) += XQbcp_Vbcp;
*(here->VBICsubsSISubsSIPtr + 1) += XQbcp_Vbcp;
*(here->VBICsubsSIBaseBPPtr) += -XQbcp_Vbcp;
*(here->VBICsubsSIBaseBPPtr + 1) += -XQbcp_Vbcp;
*(here->VBICbaseBPSubsSIPtr) += -XQbcp_Vbcp;
*(here->VBICbaseBPSubsSIPtr + 1) += -XQbcp_Vbcp;
*(here->VBICbaseBPBaseBPPtr) += XQbcp_Vbcp;
*(here->VBICbaseBPBaseBPPtr + 1) += XQbcp_Vbcp;
} }
} }

View File

@ -434,6 +434,21 @@ matrixpointers:
} }
} }
} }
if(model->VBICsubstrateResist == 0) {
here->VBICsubsSINode = here->VBICsubsNode;
} else if(here->VBICsubsSINode == 0) {
error = CKTmkVolt(ckt,&tmp,here->VBICname, "substrate");
if(error) return(error);
here->VBICsubsSINode = tmp->number;
if (ckt->CKTcopyNodesets) {
if (CKTinst2Node(ckt,here,4,&tmpNode,&tmpName)==OK) {
if (tmpNode->nsGiven) {
tmp->nodeset=tmpNode->nodeset;
tmp->nsGiven=tmpNode->nsGiven;
}
}
}
}
error = CKTmkVolt(ckt, &tmp, here->VBICname, "collCI"); error = CKTmkVolt(ckt, &tmp, here->VBICname, "collCI");
if(error) return(error); if(error) return(error);
@ -447,6 +462,10 @@ 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){\
@ -455,12 +474,14 @@ if((here->ptr = SMPmakeElt(matrix,here->first,here->second))==(double *)NULL){\
TSTALLOC(VBICcollCollPtr,VBICcollNode,VBICcollNode) TSTALLOC(VBICcollCollPtr,VBICcollNode,VBICcollNode)
TSTALLOC(VBICbaseBasePtr,VBICbaseNode,VBICbaseNode) TSTALLOC(VBICbaseBasePtr,VBICbaseNode,VBICbaseNode)
TSTALLOC(VBICemitEmitPtr,VBICemitNode,VBICemitNode) TSTALLOC(VBICemitEmitPtr,VBICemitNode,VBICemitNode)
TSTALLOC(VBICsubsSubsPtr,VBICsubsNode,VBICsubsNode)
TSTALLOC(VBICcollCXCollCXPtr,VBICcollCXNode,VBICcollCXNode) TSTALLOC(VBICcollCXCollCXPtr,VBICcollCXNode,VBICcollCXNode)
TSTALLOC(VBICcollCICollCIPtr,VBICcollCINode,VBICcollCINode) TSTALLOC(VBICcollCICollCIPtr,VBICcollCINode,VBICcollCINode)
TSTALLOC(VBICbaseBXBaseBXPtr,VBICbaseBXNode,VBICbaseBXNode) TSTALLOC(VBICbaseBXBaseBXPtr,VBICbaseBXNode,VBICbaseBXNode)
TSTALLOC(VBICbaseBIBaseBIPtr,VBICbaseBINode,VBICbaseBINode) TSTALLOC(VBICbaseBIBaseBIPtr,VBICbaseBINode,VBICbaseBINode)
TSTALLOC(VBICemitEIEmitEIPtr,VBICemitEINode,VBICemitEINode) TSTALLOC(VBICemitEIEmitEIPtr,VBICemitEINode,VBICemitEINode)
TSTALLOC(VBICbaseBPBaseBPPtr,VBICbaseBPNode,VBICbaseBPNode) TSTALLOC(VBICbaseBPBaseBPPtr,VBICbaseBPNode,VBICbaseBPNode)
TSTALLOC(VBICsubsSISubsSIPtr,VBICsubsSINode,VBICsubsSINode)
TSTALLOC(VBICbaseEmitPtr,VBICbaseNode,VBICemitNode) TSTALLOC(VBICbaseEmitPtr,VBICbaseNode,VBICemitNode)
TSTALLOC(VBICemitBasePtr,VBICemitNode,VBICbaseNode) TSTALLOC(VBICemitBasePtr,VBICemitNode,VBICbaseNode)
@ -469,6 +490,7 @@ if((here->ptr = SMPmakeElt(matrix,here->first,here->second))==(double *)NULL){\
TSTALLOC(VBICcollCollCXPtr,VBICcollNode,VBICcollCXNode) TSTALLOC(VBICcollCollCXPtr,VBICcollNode,VBICcollCXNode)
TSTALLOC(VBICbaseBaseBXPtr,VBICbaseNode,VBICbaseBXNode) TSTALLOC(VBICbaseBaseBXPtr,VBICbaseNode,VBICbaseBXNode)
TSTALLOC(VBICemitEmitEIPtr,VBICemitNode,VBICemitEINode) TSTALLOC(VBICemitEmitEIPtr,VBICemitNode,VBICemitEINode)
TSTALLOC(VBICsubsSubsSIPtr,VBICsubsNode,VBICsubsSINode)
TSTALLOC(VBICcollCXCollCIPtr,VBICcollCXNode,VBICcollCINode) TSTALLOC(VBICcollCXCollCIPtr,VBICcollCXNode,VBICcollCINode)
TSTALLOC(VBICcollCXBaseBXPtr,VBICcollCXNode,VBICbaseBXNode) TSTALLOC(VBICcollCXBaseBXPtr,VBICcollCXNode,VBICbaseBXNode)
TSTALLOC(VBICcollCXBaseBIPtr,VBICcollCXNode,VBICbaseBINode) TSTALLOC(VBICcollCXBaseBIPtr,VBICcollCXNode,VBICbaseBINode)
@ -478,11 +500,14 @@ if((here->ptr = SMPmakeElt(matrix,here->first,here->second))==(double *)NULL){\
TSTALLOC(VBICbaseBXBaseBIPtr,VBICbaseBXNode,VBICbaseBINode) TSTALLOC(VBICbaseBXBaseBIPtr,VBICbaseBXNode,VBICbaseBINode)
TSTALLOC(VBICbaseBXEmitEIPtr,VBICbaseBXNode,VBICemitEINode) TSTALLOC(VBICbaseBXEmitEIPtr,VBICbaseBXNode,VBICemitEINode)
TSTALLOC(VBICbaseBXBaseBPPtr,VBICbaseBXNode,VBICbaseBPNode) TSTALLOC(VBICbaseBXBaseBPPtr,VBICbaseBXNode,VBICbaseBPNode)
TSTALLOC(VBICbaseBXSubsSIPtr,VBICbaseBXNode,VBICsubsSINode)
TSTALLOC(VBICbaseBIEmitEIPtr,VBICbaseBINode,VBICemitEINode) TSTALLOC(VBICbaseBIEmitEIPtr,VBICbaseBINode,VBICemitEINode)
TSTALLOC(VBICbaseBPSubsSIPtr,VBICbaseBPNode,VBICsubsSINode)
TSTALLOC(VBICcollCXCollPtr,VBICcollCXNode,VBICcollNode) TSTALLOC(VBICcollCXCollPtr,VBICcollCXNode,VBICcollNode)
TSTALLOC(VBICbaseBXBasePtr,VBICbaseBXNode,VBICbaseNode) TSTALLOC(VBICbaseBXBasePtr,VBICbaseBXNode,VBICbaseNode)
TSTALLOC(VBICemitEIEmitPtr,VBICemitEINode,VBICemitNode) TSTALLOC(VBICemitEIEmitPtr,VBICemitEINode,VBICemitNode)
TSTALLOC(VBICsubsSISubsPtr,VBICsubsSINode,VBICsubsNode)
TSTALLOC(VBICcollCICollCXPtr,VBICcollCINode,VBICcollCXNode) TSTALLOC(VBICcollCICollCXPtr,VBICcollCINode,VBICcollCXNode)
TSTALLOC(VBICbaseBICollCXPtr,VBICbaseBINode,VBICcollCXNode) TSTALLOC(VBICbaseBICollCXPtr,VBICbaseBINode,VBICcollCXNode)
TSTALLOC(VBICbaseBPCollCXPtr,VBICbaseBPNode,VBICcollCXNode) TSTALLOC(VBICbaseBPCollCXPtr,VBICbaseBPNode,VBICcollCXNode)
@ -493,8 +518,12 @@ if((here->ptr = SMPmakeElt(matrix,here->first,here->second))==(double *)NULL){\
TSTALLOC(VBICbaseBIBaseBXPtr,VBICbaseBINode,VBICbaseBXNode) TSTALLOC(VBICbaseBIBaseBXPtr,VBICbaseBINode,VBICbaseBXNode)
TSTALLOC(VBICemitEIBaseBXPtr,VBICemitEINode,VBICbaseBXNode) TSTALLOC(VBICemitEIBaseBXPtr,VBICemitEINode,VBICbaseBXNode)
TSTALLOC(VBICbaseBPBaseBXPtr,VBICbaseBPNode,VBICbaseBXNode) TSTALLOC(VBICbaseBPBaseBXPtr,VBICbaseBPNode,VBICbaseBXNode)
TSTALLOC(VBICsubsSIBaseBXPtr,VBICsubsSINode,VBICbaseBXNode)
TSTALLOC(VBICemitEIBaseBIPtr,VBICemitEINode,VBICbaseBINode) TSTALLOC(VBICemitEIBaseBIPtr,VBICemitEINode,VBICbaseBINode)
TSTALLOC(VBICbaseBPBaseBIPtr,VBICbaseBPNode,VBICbaseBINode) TSTALLOC(VBICbaseBPBaseBIPtr,VBICbaseBPNode,VBICbaseBINode)
TSTALLOC(VBICsubsSICollCIPtr,VBICsubsSINode,VBICcollCINode)
TSTALLOC(VBICsubsSIBaseBIPtr,VBICsubsSINode,VBICbaseBINode)
TSTALLOC(VBICsubsSIBaseBPPtr,VBICsubsSINode,VBICbaseBPNode)
} }
} }
@ -551,6 +580,12 @@ VBICunsetup(inModel,ckt)
CKTdltNNum(ckt, here->VBICemitEINode); CKTdltNNum(ckt, here->VBICemitEINode);
here->VBICemitEINode = 0; here->VBICemitEINode = 0;
} }
if (here->VBICsubsSINode
&& here->VBICsubsSINode != here->VBICsubsNode)
{
CKTdltNNum(ckt, here->VBICsubsSINode);
here->VBICsubsSINode = 0;
}
} }
} }
return OK; return OK;

View File

@ -24,7 +24,7 @@ VBICtemp(GENmodel *inModel, CKTcircuit *ckt)
VBICmodel *model = (VBICmodel *)inModel; VBICmodel *model = (VBICmodel *)inModel;
VBICinstance *here; VBICinstance *here;
double p[108], pnom[108], TAMB; double p[108], pnom[108], TAMB;
int iret, vbic_3T_it_cf_t(double *, double *, double *); int iret, vbic_4T_it_cf_t(double *, double *, double *);
double vt; double vt;
/* loop through all the bipolar models */ /* loop through all the bipolar models */
@ -47,10 +47,16 @@ VBICtemp(GENmodel *inModel, CKTcircuit *ckt)
} else { } else {
model->VBICemitterConduct = 0.0; model->VBICemitterConduct = 0.0;
} }
if(model->VBICsubstrateResistGiven && model->VBICsubstrateResist != 0.0) {
model->VBICsubstrateConduct = 1.0 / model->VBICsubstrateResist;
} else {
model->VBICsubstrateConduct = 0.0;
}
/* 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) {
if (here->VBICowner != ARCHme) continue; if (here->VBICowner != ARCHme) continue;
if(!here->VBICtempGiven) here->VBICtemp = ckt->CKTtemp; if(!here->VBICtempGiven) here->VBICtemp = ckt->CKTtemp;
@ -168,7 +174,7 @@ VBICtemp(GENmodel *inModel, CKTcircuit *ckt)
pnom[106] = model->VBICrevVersion; pnom[106] = model->VBICrevVersion;
pnom[107] = model->VBICrefVersion; pnom[107] = model->VBICrefVersion;
iret = vbic_3T_it_cf_t(p,pnom,&TAMB); iret = vbic_4T_it_cf_t(p,pnom,&TAMB);
here->VBICttnom = p[0]; here->VBICttnom = p[0];
here->VBICtextCollResist = p[1]; here->VBICtextCollResist = p[1];
@ -213,7 +219,7 @@ VBICtemp(GENmodel *inModel, CKTcircuit *ckt)
return(OK); return(OK);
} }
int vbic_3T_it_cf_t(p,pnom,TAMB) int vbic_4T_it_cf_t(p,pnom,TAMB)
double *p, *pnom, *TAMB; double *p, *pnom, *TAMB;
{ {
double Tini, Tdev, Vtv, rT, dT, xvar1; double Tini, Tdev, Vtv, rT, dT, xvar1;

View File

@ -35,6 +35,7 @@ VBICtrunc(GENmodel *inModel, CKTcircuit *ckt, double *timeStep)
CKTterr(here->VBICqbep,ckt,timeStep); CKTterr(here->VBICqbep,ckt,timeStep);
CKTterr(here->VBICqbeo,ckt,timeStep); CKTterr(here->VBICqbeo,ckt,timeStep);
CKTterr(here->VBICqbco,ckt,timeStep); CKTterr(here->VBICqbco,ckt,timeStep);
CKTterr(here->VBICqbcp,ckt,timeStep);
} }
} }
return(OK); return(OK);