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>
* src/frontend/subckt.c: patch from Stuart Brorson

View File

@ -327,7 +327,7 @@ VBIC - Bipolar Junction Transistor
Web Site:
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.

View File

@ -28,17 +28,20 @@ IFparm VBICpTable[] = { /* parameters */
OPU("collnode", VBIC_QUEST_COLLNODE, IF_INTEGER, "Number of collector node"),
OPU("basenode", VBIC_QUEST_BASENODE, IF_INTEGER, "Number of base 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("collCInode",VBIC_QUEST_COLLCINODE,IF_INTEGER, "Internal collector node"),
OPU("baseBXnode",VBIC_QUEST_BASEBXNODE,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("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("vbc", VBIC_QUEST_VBC, IF_REAL, "B-C voltage"),
OP("ic", VBIC_QUEST_CC, IF_REAL, "Collector current"),
OP("ib", VBIC_QUEST_CB, IF_REAL, "Base 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("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"),
@ -48,6 +51,8 @@ IFparm VBICpTable[] = { /* parameters */
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("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"),
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."),
@ -176,7 +181,7 @@ IFparm VBICmPTable[] = { /* model parameters */
IOP("ebbe", VBIC_MOD_EBBE, IF_REAL, "exp(-VBBE/(NBBE*Vtv))"),
IOP("dtemp", VBIC_MOD_DTEMP, IF_REAL, "Locale Temperature difference"),
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[] = {

View File

@ -26,9 +26,11 @@ VBICacLoad(GENmodel *inModel, CKTcircuit *ckt)
,Itzf_Vbei,Itzf_Vbci,Itzr_Vbci,Itzr_Vbei,Ibc_Vbci
,Ibc_Vbei,Ibep_Vbep,Ircx_Vrcx,Irci_Vrci
,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,
XQbcx_Vbcx, XQbep_Vbep, XQbep_Vbci;
XQbcx_Vbcx, XQbep_Vbep, XQbep_Vbci,
XQbcp_Vbcp;
/* loop through all the models */
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;
Irbx_Vrbx = 1.0 / here->VBICtextBaseResist * 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);
Ibex_Vbex = *(ckt->CKTstate0 + here->VBICibex_Vbex);
@ -61,6 +64,10 @@ VBICacLoad(GENmodel *inModel, CKTcircuit *ckt)
Irbp_Vrbp = *(ckt->CKTstate0 + here->VBICirbp_Vrbp);
Irbp_Vbep = *(ckt->CKTstate0 + here->VBICirbp_Vbep);
Irbp_Vbci = *(ckt->CKTstate0 + here->VBICirbp_Vbci);
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
@ -186,6 +193,35 @@ c Stamp element: Irbp
*(here->VBICcollCXBaseBIPtr) += -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
*/
XQbe_Vbei = *(ckt->CKTstate0 + here->VBICcqbe) * ckt->CKTomega;
@ -195,6 +231,7 @@ c The complex part
XQbcx_Vbcx = *(ckt->CKTstate0 + here->VBICcqbcx) * ckt->CKTomega;
XQbep_Vbep = *(ckt->CKTstate0 + here->VBICcqbep) * ckt->CKTomega;
XQbep_Vbci = *(ckt->CKTstate0 + here->VBICcqbepci) * ckt->CKTomega;
XQbcp_Vbcp = *(ckt->CKTstate0 + here->VBICcqbcp) * ckt->CKTomega;
/*
c Stamp element: Qbe
*/
@ -238,6 +275,13 @@ c Stamp element: Qbep
*(here->VBICbaseBPBaseBPPtr + 1) += XQbep_Vbep;
*(here->VBICbaseBPBaseBIPtr + 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:
value->iValue = here->VBICemitNode;
return(OK);
case VBIC_QUEST_SUBSNODE:
value->iValue = here->VBICsubsNode;
return(OK);
case VBIC_QUEST_COLLCXNODE:
value->iValue = here->VBICcollCXNode;
return(OK);
@ -67,6 +70,9 @@ VBICask(CKTcircuit *ckt, GENinstance *instPtr, int which, IFvalue *value, IFvalu
case VBIC_QUEST_EMITEINODE:
value->iValue = here->VBICemitEINode;
return(OK);
case VBIC_QUEST_SUBSSINODE:
value->iValue = here->VBICsubsSINode;
return(OK);
case VBIC_QUEST_VBE:
value->rValue = *(ckt->CKTstate0 + here->VBICvbei);
return(OK);
@ -81,8 +87,9 @@ VBICask(CKTcircuit *ckt, GENinstance *instPtr, int which, IFvalue *value, IFvalu
case VBIC_QUEST_CB:
value->rValue = *(ckt->CKTstate0 + here->VBICibe) +
*(ckt->CKTstate0 + here->VBICibc) +
*(ckt->CKTstate0 + here->VBICibex) +
*(ckt->CKTstate0 + here->VBICibep) +
*(ckt->CKTstate0 + here->VBICibex);
*(ckt->CKTstate0 + here->VBICiccp);
return(OK);
case VBIC_QUEST_CE:
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->VBICitzr);
return(OK);
case VBIC_QUEST_CS:
value->rValue = *(ckt->CKTstate0 + here->VBICiccp) -
*(ckt->CKTstate0 + here->VBICibcp);
return(OK);
case VBIC_QUEST_POWER:
value->rValue = fabs(*(ckt->CKTstate0 + here->VBICitzf) - *(ckt->CKTstate0 + here->VBICitzr))
* fabs(*(ckt->CKTstate0 + here->VBICvbei) - *(ckt->CKTstate0 + here->VBICvbci)) +
fabs(*(ckt->CKTstate0 + here->VBICibe) * *(ckt->CKTstate0 + here->VBICvbei)) +
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);
case VBIC_QUEST_GM:
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:
value->rValue = here->VBICcapbcx;
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:
value->rValue = *(ckt->CKTstate0 + here->VBICqbe);
return(OK);

View File

@ -30,6 +30,7 @@ VBICconvTest(GENmodel *inModel, CKTcircuit *ckt)
double delvrci;
double delvrbi;
double delvrbp;
double delvbcp;
double ibehat;
double ibexhat;
double itzfhat;
@ -39,12 +40,14 @@ VBICconvTest(GENmodel *inModel, CKTcircuit *ckt)
double ircihat;
double irbihat;
double irbphat;
double Vbei, Vbex, Vbci, Vbcx, Vbep, Vrci, Vrbi, Vrbp;
double Ibe, Ibex, Itzf, Itzr, Ibc, Ibep, Irci, Irbi, Irbp;
double ibcphat;
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(here=model->VBICinstances;here!=NULL;
here = here->VBICnextInstance) {
for(here=model->VBICinstances;here!=NULL;here = here->VBICnextInstance) {
if (here->VBICowner != ARCHme) continue;
Vbei=model->VBICtype*(
@ -71,6 +74,9 @@ VBICconvTest(GENmodel *inModel, CKTcircuit *ckt)
Vrbp =model->VBICtype*(
*(ckt->CKTrhsOld+here->VBICbaseBPNode)-
*(ckt->CKTrhsOld+here->VBICcollCXNode));
Vbcp =model->VBICtype*(
*(ckt->CKTrhsOld+here->VBICsubsSINode)-
*(ckt->CKTrhsOld+here->VBICbaseBPNode));
delvbei = Vbei - *(ckt->CKTstate0 + here->VBICvbei);
delvbex = Vbex - *(ckt->CKTstate0 + here->VBICvbex);
delvbci = Vbci - *(ckt->CKTstate0 + here->VBICvbci);
@ -79,6 +85,7 @@ VBICconvTest(GENmodel *inModel, CKTcircuit *ckt)
delvrci = Vrci - *(ckt->CKTstate0 + here->VBICvrci);
delvrbi = Vrbi - *(ckt->CKTstate0 + here->VBICvrbi);
delvrbp = Vrbp - *(ckt->CKTstate0 + here->VBICvrbp);
delvbcp = Vbcp - *(ckt->CKTstate0 + here->VBICvbcp);
ibehat = *(ckt->CKTstate0 + here->VBICibe) +
*(ckt->CKTstate0 + here->VBICibe_Vbei)*delvbei;
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;
irbphat = *(ckt->CKTstate0 + here->VBICirbp) + *(ckt->CKTstate0 + here->VBICirbp_Vrbp)*delvrbp +
*(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);
Ibex = *(ckt->CKTstate0 + here->VBICibex);
Itzf = *(ckt->CKTstate0 + here->VBICitzf);
@ -106,6 +117,8 @@ VBICconvTest(GENmodel *inModel, CKTcircuit *ckt)
Irci = *(ckt->CKTstate0 + here->VBICirci);
Irbi = *(ckt->CKTstate0 + here->VBICirbi);
Irbp = *(ckt->CKTstate0 + here->VBICirbp);
Ibcp = *(ckt->CKTstate0 + here->VBICibcp);
Iccp = *(ckt->CKTstate0 + here->VBICiccp);
/*
* check convergence
*/
@ -162,6 +175,20 @@ VBICconvTest(GENmodel *inModel, CKTcircuit *ckt)
ckt->CKTnoncon++;
ckt->CKTtroubleElt = (GENinstance *) here;
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 VBICbaseNode; /* number of base 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 VBICcollCINode; /* number of internal collector node of vbic */
int VBICbaseBXNode; /* 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 VBICbaseBPNode; /* number of internal base node of vbic */
int VBICsubsSINode; /* number of internal substrate node */
double VBICarea; /* area factor for the vbic */
double VBICicVBE; /* initial condition voltage B-E*/
@ -85,6 +87,8 @@ typedef struct sVBICinstance {
* (base,base) */
double *VBICemitEmitPtr; /* pointer to sparse matrix at
* (emitter,emitter) */
double *VBICsubsSubsPtr; /* pointer to sparse matrix at
* (substrate,substrate) */
double *VBICcollCXCollCXPtr; /* pointer to sparse matrix at
* (collector prime,collector prime) */
double *VBICcollCICollCIPtr; /* pointer to sparse matrix at
@ -97,6 +101,8 @@ typedef struct sVBICinstance {
* (collector prime,collector prime) */
double *VBICemitEIEmitEIPtr; /* pointer to sparse matrix at
* (emitter prime,emitter prime) */
double *VBICsubsSISubsSIPtr; /* pointer to sparse matrix at
* (substrate prime, substrate prime) */
double *VBICbaseEmitPtr; /* pointer to sparse matrix at
* (base,emit) */
@ -112,6 +118,8 @@ typedef struct sVBICinstance {
* (base,base prime) */
double *VBICemitEmitEIPtr; /* pointer to sparse matrix at
* (emitter,emitter prime) */
double *VBICsubsSubsSIPtr; /* pointer to sparse matrix at
* (substrate, Substrate connection) */
double *VBICcollCXCollCIPtr; /* pointer to sparse matrix at
* (collector prime,base prime) */
double *VBICcollCXBaseBXPtr; /* pointer to sparse matrix at
@ -130,8 +138,12 @@ typedef struct sVBICinstance {
* (base primt,emitter prime) */
double *VBICbaseBXBaseBPPtr; /* pointer to sparse matrix at
* (base primt,emitter prime) */
double *VBICbaseBXSubsSIPtr; /* pointer to sparse matrix at
* (base primt,emitter prime) */
double *VBICbaseBIEmitEIPtr; /* pointer to sparse matrix at
* (base primt,emitter prime) */
double *VBICbaseBPSubsSIPtr; /* pointer to sparse matrix at
* (base primt,emitter prime) */
double *VBICcollCXCollPtr; /* pointer to sparse matrix at
* (collector prime,collector) */
@ -139,6 +151,8 @@ typedef struct sVBICinstance {
* (base prime,base ) */
double *VBICemitEIEmitPtr; /* pointer to sparse matrix at
* (emitter prime,emitter) */
double *VBICsubsSISubsPtr; /* pointer to sparse matrix at
* (Substrate connection, substrate) */
double *VBICcollCICollCXPtr; /* pointer to sparse matrix at
* (collector prime,base prime) */
double *VBICbaseBICollCXPtr; /* pointer to sparse matrix at
@ -153,16 +167,24 @@ typedef struct sVBICinstance {
* (emitter prime,collector prime) */
double *VBICbaseBPCollCIPtr; /* pointer to sparse matrix at
* (base primt,emitter prime) */
double *VBICsubsSICollCIPtr; /* pointer to sparse matrix at
* (substrate,collector prime) */
double *VBICbaseBIBaseBXPtr; /* pointer to sparse matrix at
* (base primt,emitter prime) */
double *VBICemitEIBaseBXPtr; /* pointer to sparse matrix at
* (emitter prime,base prime) */
double *VBICbaseBPBaseBXPtr; /* pointer to sparse matrix at
* (base primt,emitter prime) */
double *VBICsubsSIBaseBXPtr; /* pointer to sparse matrix at
* (substrate,substrate) */
double *VBICemitEIBaseBIPtr; /* pointer to sparse matrix at
* (emitter prime,base prime) */
double *VBICbaseBPBaseBIPtr; /* pointer to sparse matrix at
* (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 VBICoff :1; /* 'off' flag for vbic */
@ -181,6 +203,7 @@ typedef struct sVBICinstance {
double VBICcapbc;
double VBICcapbcx;
double VBICcapbep;
double VBICcapbcp;
double *VBICsens;
#define VBICsenGpi VBICsens /* stores the perturbed values of gpi */
@ -208,9 +231,11 @@ typedef struct sVBICinstance {
#define VBICIBEPNOIZ 8
#define VBICFLBENOIZ 9
#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
double VBICnVar[NSTATVARS][VBICNSRCS];
@ -228,9 +253,10 @@ typedef struct sVBICinstance {
#define VBICvbci VBICstate+2
#define VBICvbcx VBICstate+3
#define VBICvbep VBICstate+4
#define VBICvrci VBICstate+6
#define VBICvrbi VBICstate+7
#define VBICvrbp VBICstate+8
#define VBICvrci VBICstate+5
#define VBICvrbi VBICstate+6
#define VBICvrbp VBICstate+7
#define VBICvbcp VBICstate+8
#define VBICibe VBICstate+9
#define VBICibe_Vbei VBICstate+10
@ -294,15 +320,26 @@ typedef struct sVBICinstance {
#define VBICcqbco VBICstate+52
#define VBICgqbco VBICstate+53
#define VBICnumStates 54
#define VBICibcp VBICstate+54
#define VBICibcp_Vbcp VBICstate+55
#define VBICsensxpbe VBICstate+54 /* charge sensitivities and their
derivatives. +55 for the derivatives -
#define VBICiccp VBICstate+56
#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 */
#define VBICsensxpbex VBICstate+56
#define VBICsensxpbc VBICstate+58
#define VBICsensxpbcx VBICstate+60
#define VBICsensxpbep VBICstate+62
#define VBICsensxpbex VBICstate+66
#define VBICsensxpbc VBICstate+68
#define VBICsensxpbcx VBICstate+70
#define VBICsensxpbep VBICstate+72
#define VBICnumSenStates 10
@ -430,6 +467,7 @@ typedef struct sVBICmodel { /* model structure for a vbic */
double VBICcollectorConduct; /* collector conductance */
double VBICbaseConduct; /* base conductance */
double VBICemitterConduct; /* emitter conductance */
double VBICsubstrateConduct; /* substrate conductance */
unsigned VBICtnomGiven : 1;
unsigned VBICextCollResistGiven : 1;
@ -674,52 +712,58 @@ typedef struct sVBICmodel { /* model structure for a vbic */
#define VBIC_QUEST_COLLNODE 212
#define VBIC_QUEST_BASENODE 213
#define VBIC_QUEST_EMITNODE 214
#define VBIC_QUEST_SUBSNODE 215
#define VBIC_QUEST_COLLCXNODE 216
#define VBIC_QUEST_COLLCINODE 217
#define VBIC_QUEST_BASEBXNODE 218
#define VBIC_QUEST_BASEBINODE 219
#define VBIC_QUEST_BASEBPNODE 220
#define VBIC_QUEST_EMITEINODE 221
#define VBIC_QUEST_SUBSSINODE 222
#define VBIC_QUEST_VBE 223
#define VBIC_QUEST_VBC 224
#define VBIC_QUEST_CC 225
#define VBIC_QUEST_CB 226
#define VBIC_QUEST_CE 227
#define VBIC_QUEST_GM 228
#define VBIC_QUEST_GO 229
#define VBIC_QUEST_GPI 230
#define VBIC_QUEST_GMU 231
#define VBIC_QUEST_GX 232
#define VBIC_QUEST_QBE 233
#define VBIC_QUEST_CQBE 234
#define VBIC_QUEST_QBC 235
#define VBIC_QUEST_CQBC 236
#define VBIC_QUEST_QSUB 237
#define VBIC_QUEST_CQSUB 238
#define VBIC_QUEST_QBX 239
#define VBIC_QUEST_CQBX 240
#define VBIC_QUEST_CEXBC 241
#define VBIC_QUEST_GEQCB 242
#define VBIC_QUEST_GCSUB 243
#define VBIC_QUEST_GDSUB 244
#define VBIC_QUEST_GEQBX 245
#define VBIC_QUEST_CBE 246
#define VBIC_QUEST_CBEX 247
#define VBIC_QUEST_CBC 248
#define VBIC_QUEST_CBCX 249
#define VBIC_QUEST_SENS_REAL 250
#define VBIC_QUEST_SENS_IMAG 251
#define VBIC_QUEST_SENS_MAG 252
#define VBIC_QUEST_SENS_PH 253
#define VBIC_QUEST_SENS_CPLX 254
#define VBIC_QUEST_SENS_DC 255
#define VBIC_QUEST_POWER 256
#define VBIC_QUEST_CS 228
#define VBIC_QUEST_GM 229
#define VBIC_QUEST_GO 230
#define VBIC_QUEST_GPI 231
#define VBIC_QUEST_GMU 232
#define VBIC_QUEST_GX 233
#define VBIC_QUEST_QBE 234
#define VBIC_QUEST_CQBE 235
#define VBIC_QUEST_QBC 236
#define VBIC_QUEST_CQBC 237
#define VBIC_QUEST_QBX 238
#define VBIC_QUEST_CQBX 239
#define VBIC_QUEST_QBCP 240
#define VBIC_QUEST_CQBCP 241
#define VBIC_QUEST_CEXBC 242
#define VBIC_QUEST_GEQCB 243
#define VBIC_QUEST_GCSUB 244
#define VBIC_QUEST_GDSUB 245
#define VBIC_QUEST_GEQBX 246
#define VBIC_QUEST_CBE 247
#define VBIC_QUEST_CBEX 248
#define VBIC_QUEST_CBC 249
#define VBIC_QUEST_CBCX 250
#define VBIC_QUEST_CBEP 251
#define VBIC_QUEST_CBCP 252
#define VBIC_QUEST_SENS_REAL 253
#define VBIC_QUEST_SENS_IMAG 254
#define VBIC_QUEST_SENS_MAG 255
#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 */
#define VBIC_MOD_COLLCONDUCT 301
#define VBIC_MOD_BASECONDUCT 302
#define VBIC_MOD_EMITTERCONDUCT 303
#define VBIC_MOD_TYPE 304
#define VBIC_MOD_SUBSTRATECONDUCT 304
#define VBIC_MOD_TYPE 305
#include "vbicext.h"
#endif /*VBIC*/

View File

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

View File

@ -28,17 +28,19 @@ VBICload(GENmodel *inModel, CKTcircuit *ckt)
VBICmodel *model = (VBICmodel*)inModel;
VBICinstance *here;
double p[108]
,Vbei,Vbex,Vbci,Vbep,Vrcx,Vbcx
,Vrci,Vrbx,Vrbi,Vre,Vrbp,Vbe,Vbc
,Ibe,Ibe_Vbei,Ibex,Ibex_Vbex,Itzf,Itzf_Vbei,Itzf_Vbci
,Itzr,Itzr_Vbci,Itzr_Vbei,Ibc,Ibc_Vbci,Ibc_Vbei,Ibep
,Ibep_Vbep,Ircx,Ircx_Vrcx,Irci,Irci_Vrci,Irci_Vbci,Irci_Vbcx
,Irbx,Irbx_Vrbx,Irbi,Irbi_Vrbi,Irbi_Vbei,Irbi_Vbci,Ire
,Ire_Vre,Irbp,Irbp_Vrbp,Irbp_Vbep,Irbp_Vbci,Qbe,Qbe_Vbei
,Qbe_Vbci,Qbex,Qbex_Vbex,Qbc,Qbc_Vbci,Qbcx,Qbcx_Vbcx
,Qbep,Qbep_Vbep,Qbep_Vbci,Qbeo,Qbeo_Vbe,Qbco,Qbco_Vbc,SCALE;
,Vbei,Vbex,Vbci,Vbep,Vbcp,Vrcx
,Vbcx,Vrci,Vrbx,Vrbi,Vre,Vrbp,Vrs
,Vbe,Vbc,Ibe,Ibe_Vbei,Ibex,Ibex_Vbex,Itzf
,Itzf_Vbei,Itzf_Vbci,Itzr,Itzr_Vbci,Itzr_Vbei,Ibc,Ibc_Vbci
,Ibc_Vbei,Ibep,Ibep_Vbep,Ircx,Ircx_Vrcx,Irci,Irci_Vrci
,Irci_Vbci,Irci_Vbcx,Irbx,Irbx_Vrbx,Irbi,Irbi_Vrbi,Irbi_Vbei
,Irbi_Vbci,Ire,Ire_Vre,Irbp,Irbp_Vrbp,Irbp_Vbep,Irbp_Vbci
,Qbe,Qbe_Vbei,Qbe_Vbci,Qbex,Qbex_Vbex,Qbc,Qbc_Vbci
,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 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 *
@ -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 vce, xfact;
double vt;
double delvbei;
@ -58,6 +62,7 @@ VBICload(GENmodel *inModel, CKTcircuit *ckt)
double delvrci;
double delvrbi;
double delvrbp;
double delvbcp;
double ibehat;
double ibexhat;
double itzfhat;
@ -67,9 +72,11 @@ VBICload(GENmodel *inModel, CKTcircuit *ckt)
double ircihat;
double irbihat;
double irbphat;
double ibcphat;
double iccphat;
double ceq, geq, rhs_current;
int icheck;
int ichk1, ichk2, ichk3, ichk4;
int ichk1, ichk2, ichk3, ichk4, ichk5;
int error;
int SenCond=0;
double gqbeo, cqbeo, gqbco, cqbco, gbcx, cbcx;
@ -244,6 +251,10 @@ VBICload(GENmodel *inModel, CKTcircuit *ckt)
Vre = model->VBICtype*(
*(ckt->CKTrhsOp+here->VBICemitNode)-
*(ckt->CKTrhsOp+here->VBICemitEINode));
Vbcp = *(ckt->CKTstate1 + here->VBICvbcp);
Vrs = model->VBICtype*(
*(ckt->CKTrhsOp+here->VBICsubsNode)-
*(ckt->CKTrhsOp+here->VBICsubsSINode));
}
else{
Vbei = *(ckt->CKTstate0 + here->VBICvbei);
@ -254,6 +265,7 @@ VBICload(GENmodel *inModel, CKTcircuit *ckt)
Vrci = *(ckt->CKTstate0 + here->VBICvrci);
Vrbi = *(ckt->CKTstate0 + here->VBICvrbi);
Vrbp = *(ckt->CKTstate0 + here->VBICvrbp);
Vbcp = *(ckt->CKTstate0 + here->VBICvbcp);
if((ckt->CKTsenInfo->SENmode == DCSEN)||
(ckt->CKTsenInfo->SENmode == TRANSEN)){
Vbe = model->VBICtype*(
@ -271,6 +283,9 @@ VBICload(GENmodel *inModel, CKTcircuit *ckt)
Vre = model->VBICtype*(
*(ckt->CKTrhsOld+here->VBICemitNode)-
*(ckt->CKTrhsOld+here->VBICemitEINode));
Vrs = model->VBICtype*(
*(ckt->CKTrhsOld+here->VBICsubsNode)-
*(ckt->CKTrhsOld+here->VBICsubsSINode));
}
if(ckt->CKTsenInfo->SENmode == ACSEN){
Vbe = model->VBICtype*(
@ -288,6 +303,9 @@ VBICload(GENmodel *inModel, CKTcircuit *ckt)
Vre = model->VBICtype*(
*(ckt->CKTrhsOp+here->VBICemitNode)-
*(ckt->CKTrhsOp+here->VBICemitEINode));
Vrs = model->VBICtype*(
*(ckt->CKTrhsOp+here->VBICsubsNode)-
*(ckt->CKTrhsOp+here->VBICsubsSINode));
}
}
goto next1;
@ -321,6 +339,10 @@ VBICload(GENmodel *inModel, CKTcircuit *ckt)
Vre = model->VBICtype*(
*(ckt->CKTrhsOld+here->VBICemitNode)-
*(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) {
Vbe = model->VBICtype*(
*(ckt->CKTrhsOld+here->VBICbaseNode)-
@ -345,6 +367,10 @@ VBICload(GENmodel *inModel, CKTcircuit *ckt)
Vre = model->VBICtype*(
*(ckt->CKTrhsOld+here->VBICemitNode)-
*(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) ) {
Vbc = model->VBICtype * (here->VBICicVBE-here->VBICicVCE);
}
@ -355,23 +381,24 @@ VBICload(GENmodel *inModel, CKTcircuit *ckt)
vce=model->VBICtype*here->VBICicVCE;
Vbc=Vbe-vce;
Vbci=Vbcx=Vbc;
Vbep=0.0;
Vbep=Vbcp=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)) {
Vbe=Vbei=Vbex=model->VBICtype*here->VBICtVcrit;
Vbc=Vbci=Vbcx=Vbep=0.0;
Vbcp=Vbc-Vbe;
Vrci=Vrbi=Vrbp=0.0;
Vrcx=Vrbx=Vre=0.0;
Vrcx=Vrbx=Vre=Vrs=0.0;
} else if((ckt->CKTmode & MODEINITJCT) ||
( (ckt->CKTmode & MODEINITFIX) && (here->VBICoff!=0))) {
Vbe=0.0;
Vbei=Vbex=Vbe;
Vbc=0.0;
Vbci=Vbcx=Vbc;
Vbep=0.0;
Vbep=Vbcp=0.0;
Vrci=Vrbi=Vrbp=0.0;
Vrcx=Vrbx=Vre=0.0;
Vrcx=Vrbx=Vre=Vrs=0.0;
} else {
#ifndef PREDICTOR
if(ckt->CKTmode & MODEINITPRED) {
@ -392,6 +419,8 @@ VBICload(GENmodel *inModel, CKTcircuit *ckt)
xfact * *(ckt->CKTstate2 + here->VBICvrbi);
Vrbp = (1+xfact) * *(ckt->CKTstate1 + here->VBICvrbp)-
xfact * *(ckt->CKTstate2 + here->VBICvrbp);
Vbcp = (1+xfact) * *(ckt->CKTstate1 + here->VBICvbcp)-
xfact * *(ckt->CKTstate2 + here->VBICvbcp);
*(ckt->CKTstate0 + here->VBICvbei) =
*(ckt->CKTstate1 + here->VBICvbei);
*(ckt->CKTstate0 + here->VBICvbex) =
@ -408,6 +437,8 @@ VBICload(GENmodel *inModel, CKTcircuit *ckt)
*(ckt->CKTstate1 + here->VBICvrbi);
*(ckt->CKTstate0 + here->VBICvrbp) =
*(ckt->CKTstate1 + here->VBICvrbp);
*(ckt->CKTstate0 + here->VBICvbcp) =
*(ckt->CKTstate1 + here->VBICvbcp);
*(ckt->CKTstate0 + here->VBICibe) =
*(ckt->CKTstate1 + here->VBICibe);
*(ckt->CKTstate0 + here->VBICibe_Vbei) =
@ -462,6 +493,18 @@ VBICload(GENmodel *inModel, CKTcircuit *ckt)
*(ckt->CKTstate1 + here->VBICirbp_Vbep);
*(ckt->CKTstate0 + 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 {
#endif /* PREDICTOR */
/*
@ -491,6 +534,9 @@ VBICload(GENmodel *inModel, CKTcircuit *ckt)
Vrbp = model->VBICtype*(
*(ckt->CKTrhsOld+here->VBICbaseBPNode)-
*(ckt->CKTrhsOld+here->VBICcollCXNode));
Vbcp = model->VBICtype*(
*(ckt->CKTrhsOld+here->VBICsubsSINode)-
*(ckt->CKTrhsOld+here->VBICbaseBPNode));
#ifndef PREDICTOR
}
#endif /* PREDICTOR */
@ -502,6 +548,7 @@ VBICload(GENmodel *inModel, CKTcircuit *ckt)
delvrci = Vrci - *(ckt->CKTstate0 + here->VBICvrci);
delvrbi = Vrbi - *(ckt->CKTstate0 + here->VBICvrbi);
delvrbp = Vrbp - *(ckt->CKTstate0 + here->VBICvrbp);
delvbcp = Vbcp - *(ckt->CKTstate0 + here->VBICvbcp);
Vbe = model->VBICtype*(
*(ckt->CKTrhsOld+here->VBICbaseNode)-
*(ckt->CKTrhsOld+here->VBICemitNode));
@ -517,6 +564,9 @@ VBICload(GENmodel *inModel, CKTcircuit *ckt)
Vre = model->VBICtype*(
*(ckt->CKTrhsOld+here->VBICemitNode)-
*(ckt->CKTrhsOld+here->VBICemitEINode));
Vrs = model->VBICtype*(
*(ckt->CKTrhsOld+here->VBICsubsNode)-
*(ckt->CKTrhsOld+here->VBICsubsSINode));
ibehat = *(ckt->CKTstate0 + here->VBICibe) +
*(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;
irbphat = *(ckt->CKTstate0 + here->VBICirbp) + *(ckt->CKTstate0 + here->VBICirbp_Vrbp)*delvrbp +
*(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
*/
@ -569,6 +623,9 @@ VBICload(GENmodel *inModel, CKTcircuit *ckt)
if( (fabs(delvrbp) < ckt->CKTreltol*MAX(fabs(Vrbp),
fabs(*(ckt->CKTstate0 + here->VBICvrbp)))+
ckt->CKTvoltTol) )
if( (fabs(delvbcp) < ckt->CKTreltol*MAX(fabs(Vbcp),
fabs(*(ckt->CKTstate0 + here->VBICvbcp)))+
ckt->CKTvoltTol) )
if( (fabs(ibehat-*(ckt->CKTstate0 + here->VBICibe)) <
ckt->CKTreltol* MAX(fabs(ibehat),
fabs(*(ckt->CKTstate0 + here->VBICibe)))+
@ -604,6 +661,14 @@ VBICload(GENmodel *inModel, CKTcircuit *ckt)
if( (fabs(irbphat-*(ckt->CKTstate0 + here->VBICirbp)) <
ckt->CKTreltol* MAX(fabs(irbphat),
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) ) {
/*
* bypassing....
@ -616,6 +681,7 @@ VBICload(GENmodel *inModel, CKTcircuit *ckt)
Vrci = *(ckt->CKTstate0 + here->VBICvrci);
Vrbi = *(ckt->CKTstate0 + here->VBICvrbi);
Vrbp = *(ckt->CKTstate0 + here->VBICvrbp);
Vbcp = *(ckt->CKTstate0 + here->VBICvbcp);
Ibe = *(ckt->CKTstate0 + here->VBICibe);
Ibe_Vbei = *(ckt->CKTstate0 + here->VBICibe_Vbei);
Ibex = *(ckt->CKTstate0 + here->VBICibex);
@ -645,6 +711,12 @@ VBICload(GENmodel *inModel, CKTcircuit *ckt)
Irbp_Vbci = *(ckt->CKTstate0 + here->VBICirbp_Vbci);
gqbeo = *(ckt->CKTstate0 + here->VBICgqbeo);
gqbco = *(ckt->CKTstate0 + here->VBICgqbco);
Ibcp = *(ckt->CKTstate0 + here->VBICibcp);
Ibcp_Vbcp = *(ckt->CKTstate0 + here->VBICibcp_Vbcp);
Iccp = *(ckt->CKTstate0 + here->VBICiccp);
Iccp_Vbep = *(ckt->CKTstate0 + here->VBICiccp_Vbep);
Iccp_Vbci = *(ckt->CKTstate0 + here->VBICiccp_Vbci);
Iccp_Vbcp = *(ckt->CKTstate0 + here->VBICiccp_Vbcp);
goto load;
}
/*
@ -661,22 +733,26 @@ VBICload(GENmodel *inModel, CKTcircuit *ckt)
here->VBICtVcrit,&ichk3);
Vbep = DEVpnjlim(Vbep,*(ckt->CKTstate0 + here->VBICvbep),vt,
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
*/
next1:
iret = vbic_3T_it_cf_fj(p
,&Vbei,&Vbex,&Vbci,&Vbep,&Vrcx,&Vbcx
,&Vrci,&Vrbx,&Vrbi,&Vre,&Vrbp,&Vbe,&Vbc
,&Ibe,&Ibe_Vbei,&Ibex,&Ibex_Vbex,&Itzf,&Itzf_Vbei,&Itzf_Vbci
,&Itzr,&Itzr_Vbci,&Itzr_Vbei,&Ibc,&Ibc_Vbci,&Ibc_Vbei,&Ibep
,&Ibep_Vbep,&Ircx,&Ircx_Vrcx,&Irci,&Irci_Vrci,&Irci_Vbci,&Irci_Vbcx
,&Irbx,&Irbx_Vrbx,&Irbi,&Irbi_Vrbi,&Irbi_Vbei,&Irbi_Vbci,&Ire
,&Ire_Vre,&Irbp,&Irbp_Vrbp,&Irbp_Vbep,&Irbp_Vbci,&Qbe,&Qbe_Vbei
,&Qbe_Vbci,&Qbex,&Qbex_Vbex,&Qbc,&Qbc_Vbci,&Qbcx,&Qbcx_Vbcx
,&Qbep,&Qbep_Vbep,&Qbep_Vbci,&Qbeo,&Qbeo_Vbe,&Qbco,&Qbco_Vbc,&SCALE);
iret = vbic_4T_it_cf_fj(p
,&Vbei,&Vbex,&Vbci,&Vbep,&Vbcp,&Vrcx
,&Vbcx,&Vrci,&Vrbx,&Vrbi,&Vre,&Vrbp,&Vrs
,&Vbe,&Vbc,&Ibe,&Ibe_Vbei,&Ibex,&Ibex_Vbex,&Itzf
,&Itzf_Vbei,&Itzf_Vbci,&Itzr,&Itzr_Vbci,&Itzr_Vbei,&Ibc,&Ibc_Vbci
,&Ibc_Vbei,&Ibep,&Ibep_Vbep,&Ircx,&Ircx_Vrcx,&Irci,&Irci_Vrci
,&Irci_Vbci,&Irci_Vbcx,&Irbx,&Irbx_Vrbx,&Irbi,&Irbi_Vrbi,&Irbi_Vbei
,&Irbi_Vbci,&Ire,&Ire_Vre,&Irbp,&Irbp_Vrbp,&Irbp_Vbep,&Irbp_Vbci
,&Qbe,&Qbe_Vbei,&Qbe_Vbci,&Qbex,&Qbex_Vbex,&Qbc,&Qbc_Vbci
,&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_Vbei += ckt->CKTgmin;
@ -690,6 +766,8 @@ next1:
Irci_Vrci += ckt->CKTgmin;
Irci_Vbci += ckt->CKTgmin;
Irci_Vbcx += ckt->CKTgmin;
Ibcp += ckt->CKTgmin*Vbcp;
Ibcp_Vbcp += ckt->CKTgmin;
if( (ckt->CKTmode & (MODETRAN | MODEAC)) ||
((ckt->CKTmode & MODETRANOP) && (ckt->CKTmode & MODEUIC)) ||
@ -702,12 +780,14 @@ next1:
*(ckt->CKTstate0 + here->VBICqbep) = Qbep;
*(ckt->CKTstate0 + here->VBICqbeo) = Qbeo;
*(ckt->CKTstate0 + here->VBICqbco) = Qbco;
*(ckt->CKTstate0 + here->VBICqbcp) = Qbcp;
here->VBICcapbe = Qbe_Vbei;
here->VBICcapbex = Qbex_Vbex;
here->VBICcapbc = Qbc_Vbci;
here->VBICcapbcx = Qbcx_Vbcx;
here->VBICcapbep = Qbep_Vbep;
here->VBICcapbcp = Qbcp_Vbcp;
/*
* store small-signal parameters
@ -724,6 +804,7 @@ next1:
*(ckt->CKTstate0 + here->VBICcqbepci) = Qbep_Vbci;
*(ckt->CKTstate0 + here->VBICcqbeo) = Qbeo_Vbe;
*(ckt->CKTstate0 + here->VBICcqbco) = Qbco_Vbc;
*(ckt->CKTstate0 + here->VBICcqbcp) = Qbcp_Vbcp;
if(SenCond) {
*(ckt->CKTstate0 + here->VBICibe) = Ibe;
*(ckt->CKTstate0 + here->VBICibe_Vbei) = Ibe_Vbei;
@ -754,6 +835,12 @@ next1:
*(ckt->CKTstate0 + here->VBICirbp_Vbci) = Irbp_Vbci;
*(ckt->CKTstate0 + here->VBICgqbeo) = gqbeo;
*(ckt->CKTstate0 + here->VBICgqbco) = gqbco;
*(ckt->CKTstate0 + here->VBICibcp) = Ibcp;
*(ckt->CKTstate0 + here->VBICibcp_Vbcp) = Ibcp_Vbcp;
*(ckt->CKTstate0 + here->VBICiccp) = Iccp;
*(ckt->CKTstate0 + here->VBICiccp_Vbep) = Iccp_Vbep;
*(ckt->CKTstate0 + here->VBICiccp_Vbci) = Iccp_Vbci;
*(ckt->CKTstate0 + here->VBICiccp_Vbcp) = Iccp_Vbcp;
}
#ifdef SENSDEBUG
printf("storing small signal parameters for op\n");
@ -780,6 +867,8 @@ next1:
*(ckt->CKTstate0 + here->VBICirci) = Irci;
*(ckt->CKTstate0 + here->VBICirbi) = Irbi;
*(ckt->CKTstate0 + here->VBICirbp) = Irbp;
*(ckt->CKTstate0 + here->VBICibcp) = Ibcp;
*(ckt->CKTstate0 + here->VBICiccp) = Iccp;
continue;
}
@ -798,6 +887,8 @@ next1:
*(ckt->CKTstate0 + here->VBICqbeo) ;
*(ckt->CKTstate1 + here->VBICqbco) =
*(ckt->CKTstate0 + here->VBICqbco) ;
*(ckt->CKTstate1 + here->VBICqbcp) =
*(ckt->CKTstate0 + here->VBICqbcp) ;
}
error = NIintegrate(ckt,&geq,&ceq,Qbe_Vbei,here->VBICqbe);
if(error) return(error);
@ -824,6 +915,11 @@ next1:
Ibep_Vbep = Ibep_Vbep + geq;
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) {
*(ckt->CKTstate1 + here->VBICcqbe) =
*(ckt->CKTstate0 + here->VBICcqbe);
@ -835,6 +931,8 @@ next1:
*(ckt->CKTstate0 + here->VBICcqbcx);
*(ckt->CKTstate1 + 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->VBICvrbi) = Vrbi;
*(ckt->CKTstate0 + here->VBICvrbp) = Vrbp;
*(ckt->CKTstate0 + here->VBICvbcp) = Vbcp;
*(ckt->CKTstate0 + here->VBICibe) = Ibe;
*(ckt->CKTstate0 + here->VBICibe_Vbei) = Ibe_Vbei;
*(ckt->CKTstate0 + here->VBICibex) = Ibex;
@ -904,6 +1003,12 @@ next2:
*(ckt->CKTstate0 + here->VBICirbp_Vbci) = Irbp_Vbci;
*(ckt->CKTstate0 + here->VBICgqbeo) = gqbeo;
*(ckt->CKTstate0 + here->VBICgqbco) = gqbco;
*(ckt->CKTstate0 + here->VBICibcp) = Ibcp;
*(ckt->CKTstate0 + here->VBICibcp_Vbcp) = Ibcp_Vbcp;
*(ckt->CKTstate0 + here->VBICiccp) = Iccp;
*(ckt->CKTstate0 + here->VBICiccp_Vbep) = Iccp_Vbep;
*(ckt->CKTstate0 + here->VBICiccp_Vbci) = Iccp_Vbci;
*(ckt->CKTstate0 + here->VBICiccp_Vbcp) = Iccp_Vbcp;
/* Do not load the Jacobian and the rhs if
perturbation is being carried out */
@ -1087,6 +1192,41 @@ c Stamp element: Irbp
*(here->VBICcollCXBaseBPPtr) += Irbp_Vbep;
*(here->VBICcollCXBaseBIPtr) += -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);
}
int vbic_3T_it_cf_fj(p
,Vbei,Vbex,Vbci,Vbep,Vrcx,Vbcx
,Vrci,Vrbx,Vrbi,Vre,Vrbp,Vbe,Vbc
,Ibe,Ibe_Vbei,Ibex,Ibex_Vbex,Itzf,Itzf_Vbei,Itzf_Vbci
,Itzr,Itzr_Vbci,Itzr_Vbei,Ibc,Ibc_Vbci,Ibc_Vbei,Ibep
,Ibep_Vbep,Ircx,Ircx_Vrcx,Irci,Irci_Vrci,Irci_Vbci,Irci_Vbcx
,Irbx,Irbx_Vrbx,Irbi,Irbi_Vrbi,Irbi_Vbei,Irbi_Vbci,Ire
,Ire_Vre,Irbp,Irbp_Vrbp,Irbp_Vbep,Irbp_Vbci,Qbe,Qbe_Vbei
,Qbe_Vbci,Qbex,Qbex_Vbex,Qbc,Qbc_Vbci,Qbcx,Qbcx_Vbcx
,Qbep,Qbep_Vbep,Qbep_Vbci,Qbeo,Qbeo_Vbe,Qbco,Qbco_Vbc,SCALE)
int vbic_4T_it_cf_fj(p
,Vbei,Vbex,Vbci,Vbep,Vbcp,Vrcx
,Vbcx,Vrci,Vrbx,Vrbi,Vre,Vrbp,Vrs
,Vbe,Vbc,Ibe,Ibe_Vbei,Ibex,Ibex_Vbex,Itzf
,Itzf_Vbei,Itzf_Vbci,Itzr,Itzr_Vbci,Itzr_Vbei,Ibc,Ibc_Vbci
,Ibc_Vbei,Ibep,Ibep_Vbep,Ircx,Ircx_Vrcx,Irci,Irci_Vrci
,Irci_Vbci,Irci_Vbcx,Irbx,Irbx_Vrbx,Irbi,Irbi_Vrbi,Irbi_Vbei
,Irbi_Vbci,Ire,Ire_Vre,Irbp,Irbp_Vrbp,Irbp_Vbep,Irbp_Vbci
,Qbe,Qbe_Vbei,Qbe_Vbci,Qbex,Qbex_Vbex,Qbc,Qbc_Vbci
,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
,*Vbei,*Vbex,*Vbci,*Vbep,*Vrcx,*Vbcx
,*Vrci,*Vrbx,*Vrbi,*Vre,*Vrbp,*Vbe,*Vbc
,*Ibe,*Ibe_Vbei,*Ibex,*Ibex_Vbex,*Itzf,*Itzf_Vbei,*Itzf_Vbci
,*Itzr,*Itzr_Vbci,*Itzr_Vbei,*Ibc,*Ibc_Vbci,*Ibc_Vbei,*Ibep
,*Ibep_Vbep,*Ircx,*Ircx_Vrcx,*Irci,*Irci_Vrci,*Irci_Vbci,*Irci_Vbcx
,*Irbx,*Irbx_Vrbx,*Irbi,*Irbi_Vrbi,*Irbi_Vbei,*Irbi_Vbci,*Ire
,*Ire_Vre,*Irbp,*Irbp_Vrbp,*Irbp_Vbep,*Irbp_Vbci,*Qbe,*Qbe_Vbei
,*Qbe_Vbci,*Qbex,*Qbex_Vbex,*Qbc,*Qbc_Vbci,*Qbcx,*Qbcx_Vbcx
,*Qbep,*Qbep_Vbep,*Qbep_Vbci,*Qbeo,*Qbeo_Vbe,*Qbco,*Qbco_Vbc,*SCALE;
,*Vbei,*Vbex,*Vbci,*Vbep,*Vbcp,*Vrcx
,*Vbcx,*Vrci,*Vrbx,*Vrbi,*Vre,*Vrbp,*Vrs
,*Vbe,*Vbc,*Ibe,*Ibe_Vbei,*Ibex,*Ibex_Vbex,*Itzf
,*Itzf_Vbei,*Itzf_Vbci,*Itzr,*Itzr_Vbci,*Itzr_Vbei,*Ibc,*Ibc_Vbci
,*Ibc_Vbei,*Ibep,*Ibep_Vbep,*Ircx,*Ircx_Vrcx,*Irci,*Irci_Vrci
,*Irci_Vbci,*Irci_Vbcx,*Irbx,*Irbx_Vrbx,*Irbi,*Irbi_Vrbi,*Irbi_Vbei
,*Irbi_Vbci,*Ire,*Ire_Vre,*Irbp,*Irbp_Vrbp,*Irbp_Vbep,*Irbp_Vbci
,*Qbe,*Qbe_Vbei,*Qbe_Vbci,*Qbex,*Qbex_Vbex,*Qbc,*Qbc_Vbci
,*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 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 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 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 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;
@ -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 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 qbp,qbp_q2p,qbp_Vbep,qbp_Vbci,argn,argn_Vbei,expn;
double expn_argn,expn_Vbei,argx_Vbei,expx_Vbei,Ibe_expi,Ibe_expn,Ibe_expx;
double argi_Vbex,expi_Vbex,argn_Vbex,expn_Vbex,argx_Vbex,expx_Vbex,Ibex_expi;
double Ibex_expn,Ibex_expx,argn_Vbci,expn_Vbci,Ibcj,Ibcj_expi,Ibcj_Vbci;
double Ibcj_expn,argn_Vbep,expn_Vbep,Ibep_expi,Ibep_expn,xvar3_vl,avalf;
double avalf_vl,avalf_Vbci,avalf_xvar4,Igc,Igc_Itzf,Igc_Vbei,Igc_Vbci;
double Igc_Itzr,Igc_Ibcj,Igc_avalf,Ibc_Ibcj,Ibc_Igc,argx_Vbcx,expx_Vbcx;
double Kbci,Kbci_expi,Kbci_Vbci,Kbcx,Kbcx_expx,Kbcx_Vbcx,rKp1;
double rKp1_Kbci,rKp1_Vbci,rKp1_Kbcx,rKp1_Vbcx,xvar1_rKp1,xvar1_Vbcx,Iohm;
double Iohm_Vrci,Iohm_Kbci,Iohm_Vbci,Iohm_Kbcx,Iohm_Vbcx,Iohm_xvar1,derf;
double derf_Iohm,derf_Vrci,derf_Vbci,derf_Vbcx,Irci_Iohm,Irci_derf,Irbi_qb;
double Irbp_qbp,sgIf,rIf,rIf_Ifi,rIf_Vbei,mIf,mIf_rIf;
double mIf_Vbei,tff,tff_q1,tff_Vbei,tff_Vbci,tff_xvar2,tff_mIf;
double Qbe_qdbe,Qbe_tff,Qbe_Ifi,Qbe_qb,Qbex_qdbex,Qbc_qdbc,Qbc_Iri;
double Qbc_Kbci,Qbcx_Kbcx,Qbep_qdbep,Qbep_Ifp;
double qbp,qbp_q2p,qbp_Vbep,qbp_Vbci,argi_Vbcp,expi_Vbcp,Irp;
double Irp_expi,Irp_Vbcp,Iccp_Ifp,Iccp_Irp,Iccp_qbp,argn,argn_Vbei;
double expn,expn_argn,expn_Vbei,argx_Vbei,expx_Vbei,Ibe_expi,Ibe_expn;
double Ibe_expx,argi_Vbex,expi_Vbex,argn_Vbex,expn_Vbex,argx_Vbex,expx_Vbex;
double Ibex_expi,Ibex_expn,Ibex_expx,argn_Vbci,expn_Vbci,Ibcj,Ibcj_expi;
double Ibcj_Vbci,Ibcj_expn,argn_Vbep,expn_Vbep,Ibep_expi,Ibep_expn,xvar3_vl;
double avalf,avalf_vl,avalf_Vbci,avalf_xvar4,Igc,Igc_Itzf,Igc_Vbei;
double Igc_Vbci,Igc_Itzr,Igc_Ibcj,Igc_avalf,Ibc_Ibcj,Ibc_Igc,argx_Vbcx;
double expx_Vbcx,Kbci,Kbci_expi,Kbci_Vbci,Kbcx,Kbcx_expx,Kbcx_Vbcx;
double rKp1,rKp1_Kbci,rKp1_Vbci,rKp1_Kbcx,rKp1_Vbcx,xvar1_rKp1,xvar1_Vbcx;
double Iohm,Iohm_Vrci,Iohm_Kbci,Iohm_Vbci,Iohm_Kbcx,Iohm_Vbcx,Iohm_xvar1;
double derf,derf_Iohm,derf_Vrci,derf_Vbci,derf_Vbcx,Irci_Iohm,Irci_derf;
double Irbi_qb,Irbp_qbp,argn_Vbcp,expn_Vbcp,Ibcp_expi,Ibcp_expn,sgIf;
double rIf,rIf_Ifi,rIf_Vbei,mIf,mIf_rIf,mIf_Vbei,tff;
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 */
@ -1599,6 +1747,87 @@ double Qbc_Kbci,Qbcx_Kbcx,Qbep_qdbep,Qbep_Ifp;
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=1.0/(p[12]*Vtv);
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_Vbep=qbp_q2p*q2p_Vbep;
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{
Ifp=0.0;
Ifp_Vbep=0.0;
@ -1713,6 +1959,10 @@ double Qbc_Kbci,Qbcx_Kbcx,Qbep_qdbep,Qbep_Ifp;
qbp=1.0;
qbp_Vbep=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){
argi=(*Vbei)/(p[33]*Vtv);
@ -2018,6 +2268,33 @@ double Qbc_Kbci,Qbcx_Kbcx,Qbep_qdbep,Qbep_Ifp;
*Irbp_Vbep=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){
sgIf=1.0;
}else{
@ -2072,6 +2349,10 @@ double Qbc_Kbci,Qbcx_Kbcx,Qbep_qdbep,Qbep_Ifp;
*Qbep_Vbep=Qbep_qdbep*qdbep_Vbep;
*Qbep_Vbep=(*Qbep_Vbep)+Qbep_Ifp*Ifp_Vbep;
*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];
(*Qbco)=(*Vbc)*p[20];
@ -2129,6 +2410,16 @@ double Qbc_Kbci,Qbcx_Kbcx,Qbep_qdbep,Qbep_Ifp;
*Qbeo_Vbe=(*SCALE)*(*Qbeo_Vbe);
*Qbco=(*SCALE)*(*Qbco);
*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);
}

View File

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

View File

@ -41,6 +41,7 @@ VBICmParam(int param, IFvalue *value, GENmodel *inModel)
break;
case VBIC_MOD_RCX:
mods->VBICextCollResist = value->rValue;
if (mods->VBICextCollResist < 0.1) mods->VBICextCollResist = 0.1;
mods->VBICextCollResistGiven = TRUE;
break;
case VBIC_MOD_RCI:
@ -62,6 +63,7 @@ VBICmParam(int param, IFvalue *value, GENmodel *inModel)
break;
case VBIC_MOD_RBX:
mods->VBICextBaseResist = value->rValue;
if (mods->VBICextBaseResist < 0.1) mods->VBICextBaseResist = 0.1;
mods->VBICextBaseResistGiven = TRUE;
break;
case VBIC_MOD_RBI:
@ -71,10 +73,12 @@ VBICmParam(int param, IFvalue *value, GENmodel *inModel)
break;
case VBIC_MOD_RE:
mods->VBICemitterResist = value->rValue;
if (mods->VBICemitterResist < 0.1) mods->VBICemitterResist = 0.1;
mods->VBICemitterResistGiven = TRUE;
break;
case VBIC_MOD_RS:
mods->VBICsubstrateResist = value->rValue;
if (mods->VBICsubstrateResist < 0.1) mods->VBICsubstrateResist = 0.1;
mods->VBICsubstrateResistGiven = TRUE;
break;
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 */
"_ic", /* noise due to ic */
"_ib", /* noise due to ib */
"_ibep", /* noise due to ib */
"_1overfbe", /* flicker (1/f) noise */
"_1overfbep", /* flicker (1/f) noise */
"_ibep", /* noise due to ibep */
"_1overfbe", /* flicker (1/f) noise ibe */
"_1overfbep", /* flicker (1/f) noise ibep */
"_rs", /* noise due to rs */
"_iccp", /* noise due to iccp */
"" /* total transistor noise */
};
@ -147,6 +149,10 @@ if (!data->namelist) return(E_NOMEM);
ckt,THERMNOISE,inst->VBICemitEINode,inst->VBICemitNode,
*(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],
ckt,SHOTNOISE,inst->VBICcollCINode, inst->VBICemitEINode,
@ -160,6 +166,10 @@ if (!data->namelist) return(E_NOMEM);
ckt,SHOTNOISE,inst->VBICbaseBXNode, inst->VBICbaseBPNode,
*(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,
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
,Ibc_Vbei,Ibep_Vbep,Ircx_Vrcx,Irci_Vrci
,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,
XQbcx_Vbcx, XQbep_Vbep, XQbep_Vbci;
XQbcx_Vbcx, XQbep_Vbep, XQbep_Vbci,
XQbcp_Vbcp;
/* loop through all the models */
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 */
for( here = model->VBICinstances; here!= NULL;
here = here->VBICnextInstance) {
if (here->VBICowner != ARCHme) continue;
Ircx_Vrcx = 1.0 / model->VBICextCollResist * here->VBICarea * here->VBICm;
Irbx_Vrbx = 1.0 / model->VBICextBaseResist * here->VBICarea * here->VBICm;
Ire_Vre = 1.0 / model->VBICemitterResist * here->VBICarea * here->VBICm;
Ircx_Vrcx = 1.0 / here->VBICtextCollResist * here->VBICarea * here->VBICm;
Irbx_Vrbx = 1.0 / here->VBICtextBaseResist * here->VBICarea * here->VBICm;
Ire_Vre = 1.0 / here->VBICtemitterResist * here->VBICarea * here->VBICm;
Irs_Vrs = 1.0 / here->VBICtsubstrateResist * here->VBICarea * here->VBICm;
Ibe_Vbei = *(ckt->CKTstate0 + here->VBICibe_Vbei);
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_Vbep = *(ckt->CKTstate0 + here->VBICirbp_Vbep);
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
@ -186,6 +194,35 @@ c Stamp element: Irbp
*(here->VBICcollCXBaseBIPtr) += -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
*/
XQbe_Vbei = *(ckt->CKTstate0 + here->VBICcqbe);
@ -195,77 +232,89 @@ c The complex part
XQbcx_Vbcx = *(ckt->CKTstate0 + here->VBICcqbcx);
XQbep_Vbep = *(ckt->CKTstate0 + here->VBICcqbep);
XQbep_Vbci = *(ckt->CKTstate0 + here->VBICcqbepci);
XQbcp_Vbcp = *(ckt->CKTstate0 + here->VBICcqbcp) * ckt->CKTomega;
/*
c Stamp element: Qbe
*/
*(here->VBICbaseBIBaseBIPtr) += (XQbe_Vbei * (s->real));
*(here->VBICbaseBIBaseBIPtr + 1) += (XQbe_Vbei * (s->imag));
*(here->VBICbaseBIEmitEIPtr) += (-XQbe_Vbei * (s->real));
*(here->VBICbaseBIEmitEIPtr + 1) += (-XQbe_Vbei * (s->imag));
*(here->VBICbaseBIBaseBIPtr) += (XQbe_Vbci * (s->real));
*(here->VBICbaseBIBaseBIPtr + 1) += (XQbe_Vbci * (s->imag));
*(here->VBICbaseBICollCIPtr) += (-XQbe_Vbci * (s->real));
*(here->VBICbaseBICollCIPtr + 1) += (-XQbe_Vbci * (s->imag));
*(here->VBICemitEIBaseBIPtr) += (-XQbe_Vbei * (s->real));
*(here->VBICemitEIBaseBIPtr + 1) += (-XQbe_Vbei * (s->imag));
*(here->VBICemitEIEmitEIPtr) += (XQbe_Vbei * (s->real));
*(here->VBICemitEIEmitEIPtr + 1) += (XQbe_Vbei * (s->imag));
*(here->VBICemitEIBaseBIPtr) += (-XQbe_Vbci * (s->real));
*(here->VBICemitEIBaseBIPtr + 1) += (-XQbe_Vbci * (s->imag));
*(here->VBICemitEICollCIPtr) += (XQbe_Vbci * (s->real));
*(here->VBICemitEICollCIPtr + 1) += (XQbe_Vbci * (s->imag));
*(here->VBICbaseBIBaseBIPtr) += XQbe_Vbei * (s->real);
*(here->VBICbaseBIBaseBIPtr + 1) += XQbe_Vbei * (s->imag);
*(here->VBICbaseBIEmitEIPtr) += -XQbe_Vbei * (s->real);
*(here->VBICbaseBIEmitEIPtr + 1) += -XQbe_Vbei * (s->imag);
*(here->VBICbaseBIBaseBIPtr) += XQbe_Vbci * (s->real);
*(here->VBICbaseBIBaseBIPtr + 1) += XQbe_Vbci * (s->imag);
*(here->VBICbaseBICollCIPtr) += -XQbe_Vbci * (s->real);
*(here->VBICbaseBICollCIPtr + 1) += -XQbe_Vbci * (s->imag);
*(here->VBICemitEIBaseBIPtr) += -XQbe_Vbei * (s->real);
*(here->VBICemitEIBaseBIPtr + 1) += -XQbe_Vbei * (s->imag);
*(here->VBICemitEIEmitEIPtr) += XQbe_Vbei * (s->real);
*(here->VBICemitEIEmitEIPtr + 1) += XQbe_Vbei * (s->imag);
*(here->VBICemitEIBaseBIPtr) += -XQbe_Vbci * (s->real);
*(here->VBICemitEIBaseBIPtr + 1) += -XQbe_Vbci * (s->imag);
*(here->VBICemitEICollCIPtr) += XQbe_Vbci * (s->real);
*(here->VBICemitEICollCIPtr + 1) += XQbe_Vbci * (s->imag);
/*
c Stamp element: Qbex
*/
*(here->VBICbaseBXBaseBXPtr) += (XQbex_Vbex * (s->real));
*(here->VBICbaseBXBaseBXPtr + 1) += (XQbex_Vbex * (s->imag));
*(here->VBICbaseBXEmitEIPtr) += (-XQbex_Vbex * (s->real));
*(here->VBICbaseBXEmitEIPtr + 1) += (-XQbex_Vbex * (s->imag));
*(here->VBICemitEIBaseBXPtr) += (-XQbex_Vbex * (s->real));
*(here->VBICemitEIBaseBXPtr + 1) += (-XQbex_Vbex * (s->imag));
*(here->VBICemitEIEmitEIPtr ) += (XQbex_Vbex * (s->real));
*(here->VBICemitEIEmitEIPtr + 1) += (XQbex_Vbex * (s->imag));
*(here->VBICbaseBXBaseBXPtr) += XQbex_Vbex * (s->real);
*(here->VBICbaseBXBaseBXPtr + 1) += XQbex_Vbex * (s->imag);
*(here->VBICbaseBXEmitEIPtr) += -XQbex_Vbex * (s->real);
*(here->VBICbaseBXEmitEIPtr + 1) += -XQbex_Vbex * (s->imag);
*(here->VBICemitEIBaseBXPtr) += -XQbex_Vbex * (s->real);
*(here->VBICemitEIBaseBXPtr + 1) += -XQbex_Vbex * (s->imag);
*(here->VBICemitEIEmitEIPtr ) += XQbex_Vbex * (s->real);
*(here->VBICemitEIEmitEIPtr + 1) += XQbex_Vbex * (s->imag);
/*
c Stamp element: Qbc
*/
*(here->VBICbaseBIBaseBIPtr) += (XQbc_Vbci * (s->real));
*(here->VBICbaseBIBaseBIPtr + 1) += (XQbc_Vbci * (s->imag));
*(here->VBICbaseBICollCIPtr) += (-XQbc_Vbci * (s->real));
*(here->VBICbaseBICollCIPtr + 1) += (-XQbc_Vbci * (s->imag));
*(here->VBICcollCIBaseBIPtr) += (-XQbc_Vbci * (s->real));
*(here->VBICcollCIBaseBIPtr + 1) += (-XQbc_Vbci * (s->imag));
*(here->VBICcollCICollCIPtr) += (XQbc_Vbci * (s->real));
*(here->VBICcollCICollCIPtr + 1) += (XQbc_Vbci * (s->imag));
*(here->VBICbaseBIBaseBIPtr) += XQbc_Vbci * (s->real);
*(here->VBICbaseBIBaseBIPtr + 1) += XQbc_Vbci * (s->imag);
*(here->VBICbaseBICollCIPtr) += -XQbc_Vbci * (s->real);
*(here->VBICbaseBICollCIPtr + 1) += -XQbc_Vbci * (s->imag);
*(here->VBICcollCIBaseBIPtr) += -XQbc_Vbci * (s->real);
*(here->VBICcollCIBaseBIPtr + 1) += -XQbc_Vbci * (s->imag);
*(here->VBICcollCICollCIPtr) += XQbc_Vbci * (s->real);
*(here->VBICcollCICollCIPtr + 1) += XQbc_Vbci * (s->imag);
/*
c Stamp element: Qbcx
*/
*(here->VBICbaseBIBaseBIPtr) += (XQbcx_Vbcx * (s->real));
*(here->VBICbaseBIBaseBIPtr + 1) += (XQbcx_Vbcx * (s->imag));
*(here->VBICbaseBICollCXPtr) += (-XQbcx_Vbcx * (s->real));
*(here->VBICbaseBICollCXPtr + 1) += (-XQbcx_Vbcx * (s->imag));
*(here->VBICcollCXBaseBIPtr) += (-XQbcx_Vbcx * (s->real));
*(here->VBICcollCXBaseBIPtr + 1) += (-XQbcx_Vbcx * (s->imag));
*(here->VBICcollCXCollCXPtr) += (XQbcx_Vbcx * (s->real));
*(here->VBICcollCXCollCXPtr + 1) += (XQbcx_Vbcx * (s->imag));
*(here->VBICbaseBIBaseBIPtr) += XQbcx_Vbcx * (s->real);
*(here->VBICbaseBIBaseBIPtr + 1) += XQbcx_Vbcx * (s->imag);
*(here->VBICbaseBICollCXPtr) += -XQbcx_Vbcx * (s->real);
*(here->VBICbaseBICollCXPtr + 1) += -XQbcx_Vbcx * (s->imag);
*(here->VBICcollCXBaseBIPtr) += -XQbcx_Vbcx * (s->real);
*(here->VBICcollCXBaseBIPtr + 1) += -XQbcx_Vbcx * (s->imag);
*(here->VBICcollCXCollCXPtr) += XQbcx_Vbcx * (s->real);
*(here->VBICcollCXCollCXPtr + 1) += XQbcx_Vbcx * (s->imag);
/*
c Stamp element: Qbep
*/
*(here->VBICbaseBXBaseBXPtr) += (XQbep_Vbep * (s->real));
*(here->VBICbaseBXBaseBXPtr + 1) += (XQbep_Vbep * (s->imag));
*(here->VBICbaseBXBaseBPPtr) += (-XQbep_Vbep * (s->real));
*(here->VBICbaseBXBaseBPPtr + 1) += (-XQbep_Vbep * (s->imag));
*(here->VBICbaseBXBaseBIPtr) += (XQbep_Vbci * (s->real));
*(here->VBICbaseBXBaseBIPtr + 1) += (XQbep_Vbci * (s->imag));
*(here->VBICbaseBXCollCIPtr) += (-XQbep_Vbci * (s->real));
*(here->VBICbaseBXCollCIPtr + 1) += (-XQbep_Vbci * (s->imag));
*(here->VBICbaseBPBaseBXPtr) += (-XQbep_Vbep * (s->real));
*(here->VBICbaseBPBaseBXPtr + 1) += (-XQbep_Vbep * (s->imag));
*(here->VBICbaseBPBaseBPPtr) += (XQbep_Vbep * (s->real));
*(here->VBICbaseBPBaseBPPtr + 1) += (XQbep_Vbep * (s->imag));
*(here->VBICbaseBPBaseBIPtr) += (-XQbep_Vbci * (s->real));
*(here->VBICbaseBPBaseBIPtr + 1) += (-XQbep_Vbci * (s->imag));
*(here->VBICbaseBPCollCIPtr) += (XQbep_Vbci * (s->real));
*(here->VBICbaseBPCollCIPtr + 1) += (XQbep_Vbci * (s->imag));
*(here->VBICbaseBXBaseBXPtr) += XQbep_Vbep * (s->real);
*(here->VBICbaseBXBaseBXPtr + 1) += XQbep_Vbep * (s->imag);
*(here->VBICbaseBXBaseBPPtr) += -XQbep_Vbep * (s->real);
*(here->VBICbaseBXBaseBPPtr + 1) += -XQbep_Vbep * (s->imag);
*(here->VBICbaseBXBaseBIPtr) += XQbep_Vbci * (s->real);
*(here->VBICbaseBXBaseBIPtr + 1) += XQbep_Vbci * (s->imag);
*(here->VBICbaseBXCollCIPtr) += -XQbep_Vbci * (s->real);
*(here->VBICbaseBXCollCIPtr + 1) += -XQbep_Vbci * (s->imag);
*(here->VBICbaseBPBaseBXPtr) += -XQbep_Vbep * (s->real);
*(here->VBICbaseBPBaseBXPtr + 1) += -XQbep_Vbep * (s->imag);
*(here->VBICbaseBPBaseBPPtr) += XQbep_Vbep * (s->real);
*(here->VBICbaseBPBaseBPPtr + 1) += XQbep_Vbep * (s->imag);
*(here->VBICbaseBPBaseBIPtr) += -XQbep_Vbci * (s->real);
*(here->VBICbaseBPBaseBIPtr + 1) += -XQbep_Vbci * (s->imag);
*(here->VBICbaseBPCollCIPtr) += XQbep_Vbci * (s->real);
*(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");
if(error) return(error);
@ -447,6 +462,10 @@ matrixpointers:
if(error) return(error);
here->VBICbaseBINode = tmp->number;
error = CKTmkVolt(ckt, &tmp, here->VBICname, "subsSI");
if(error) return(error);
here->VBICsubsSINode = tmp->number;
/* macro to make elements with built in test for out of memory */
#define TSTALLOC(ptr,first,second) \
if((here->ptr = SMPmakeElt(matrix,here->first,here->second))==(double *)NULL){\
@ -455,12 +474,14 @@ if((here->ptr = SMPmakeElt(matrix,here->first,here->second))==(double *)NULL){\
TSTALLOC(VBICcollCollPtr,VBICcollNode,VBICcollNode)
TSTALLOC(VBICbaseBasePtr,VBICbaseNode,VBICbaseNode)
TSTALLOC(VBICemitEmitPtr,VBICemitNode,VBICemitNode)
TSTALLOC(VBICsubsSubsPtr,VBICsubsNode,VBICsubsNode)
TSTALLOC(VBICcollCXCollCXPtr,VBICcollCXNode,VBICcollCXNode)
TSTALLOC(VBICcollCICollCIPtr,VBICcollCINode,VBICcollCINode)
TSTALLOC(VBICbaseBXBaseBXPtr,VBICbaseBXNode,VBICbaseBXNode)
TSTALLOC(VBICbaseBIBaseBIPtr,VBICbaseBINode,VBICbaseBINode)
TSTALLOC(VBICemitEIEmitEIPtr,VBICemitEINode,VBICemitEINode)
TSTALLOC(VBICbaseBPBaseBPPtr,VBICbaseBPNode,VBICbaseBPNode)
TSTALLOC(VBICsubsSISubsSIPtr,VBICsubsSINode,VBICsubsSINode)
TSTALLOC(VBICbaseEmitPtr,VBICbaseNode,VBICemitNode)
TSTALLOC(VBICemitBasePtr,VBICemitNode,VBICbaseNode)
@ -469,6 +490,7 @@ if((here->ptr = SMPmakeElt(matrix,here->first,here->second))==(double *)NULL){\
TSTALLOC(VBICcollCollCXPtr,VBICcollNode,VBICcollCXNode)
TSTALLOC(VBICbaseBaseBXPtr,VBICbaseNode,VBICbaseBXNode)
TSTALLOC(VBICemitEmitEIPtr,VBICemitNode,VBICemitEINode)
TSTALLOC(VBICsubsSubsSIPtr,VBICsubsNode,VBICsubsSINode)
TSTALLOC(VBICcollCXCollCIPtr,VBICcollCXNode,VBICcollCINode)
TSTALLOC(VBICcollCXBaseBXPtr,VBICcollCXNode,VBICbaseBXNode)
TSTALLOC(VBICcollCXBaseBIPtr,VBICcollCXNode,VBICbaseBINode)
@ -478,11 +500,14 @@ if((here->ptr = SMPmakeElt(matrix,here->first,here->second))==(double *)NULL){\
TSTALLOC(VBICbaseBXBaseBIPtr,VBICbaseBXNode,VBICbaseBINode)
TSTALLOC(VBICbaseBXEmitEIPtr,VBICbaseBXNode,VBICemitEINode)
TSTALLOC(VBICbaseBXBaseBPPtr,VBICbaseBXNode,VBICbaseBPNode)
TSTALLOC(VBICbaseBXSubsSIPtr,VBICbaseBXNode,VBICsubsSINode)
TSTALLOC(VBICbaseBIEmitEIPtr,VBICbaseBINode,VBICemitEINode)
TSTALLOC(VBICbaseBPSubsSIPtr,VBICbaseBPNode,VBICsubsSINode)
TSTALLOC(VBICcollCXCollPtr,VBICcollCXNode,VBICcollNode)
TSTALLOC(VBICbaseBXBasePtr,VBICbaseBXNode,VBICbaseNode)
TSTALLOC(VBICemitEIEmitPtr,VBICemitEINode,VBICemitNode)
TSTALLOC(VBICsubsSISubsPtr,VBICsubsSINode,VBICsubsNode)
TSTALLOC(VBICcollCICollCXPtr,VBICcollCINode,VBICcollCXNode)
TSTALLOC(VBICbaseBICollCXPtr,VBICbaseBINode,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(VBICemitEIBaseBXPtr,VBICemitEINode,VBICbaseBXNode)
TSTALLOC(VBICbaseBPBaseBXPtr,VBICbaseBPNode,VBICbaseBXNode)
TSTALLOC(VBICsubsSIBaseBXPtr,VBICsubsSINode,VBICbaseBXNode)
TSTALLOC(VBICemitEIBaseBIPtr,VBICemitEINode,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);
here->VBICemitEINode = 0;
}
if (here->VBICsubsSINode
&& here->VBICsubsSINode != here->VBICsubsNode)
{
CKTdltNNum(ckt, here->VBICsubsSINode);
here->VBICsubsSINode = 0;
}
}
}
return OK;

View File

@ -24,7 +24,7 @@ VBICtemp(GENmodel *inModel, CKTcircuit *ckt)
VBICmodel *model = (VBICmodel *)inModel;
VBICinstance *here;
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;
/* loop through all the bipolar models */
@ -47,10 +47,16 @@ VBICtemp(GENmodel *inModel, CKTcircuit *ckt)
} else {
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 */
for (here = model->VBICinstances; here != NULL ;
here=here->VBICnextInstance) {
if (here->VBICowner != ARCHme) continue;
if(!here->VBICtempGiven) here->VBICtemp = ckt->CKTtemp;
@ -168,7 +174,7 @@ VBICtemp(GENmodel *inModel, CKTcircuit *ckt)
pnom[106] = model->VBICrevVersion;
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->VBICtextCollResist = p[1];
@ -213,7 +219,7 @@ VBICtemp(GENmodel *inModel, CKTcircuit *ckt)
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 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->VBICqbeo,ckt,timeStep);
CKTterr(here->VBICqbco,ckt,timeStep);
CKTterr(here->VBICqbcp,ckt,timeStep);
}
}
return(OK);