Updated vbic code (4 terminal model - no excess phase - no thermal)
This commit is contained in:
parent
8a9766a401
commit
7a8a00e968
|
|
@ -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
|
||||
|
|
|
|||
2
DEVICES
2
DEVICES
|
|
@ -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.
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -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[] = {
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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... */
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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*/
|
||||
|
|
|
|||
|
|
@ -10,7 +10,7 @@
|
|||
SPICEdev VBICinfo = {
|
||||
{
|
||||
"VBIC",
|
||||
"Vertical Bipolar Inter-Company Model (3-terminal)",
|
||||
"Vertical Bipolar Inter-Company Model",
|
||||
|
||||
&VBICnSize,
|
||||
&VBICnSize,
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
@ -716,7 +796,7 @@ next1:
|
|||
(!(ckt->CKTmode & MODEUIC)) ) {
|
||||
if(ckt->CKTmode & MODEINITSMSIG) {
|
||||
*(ckt->CKTstate0 + here->VBICcqbe) = Qbe_Vbei;
|
||||
*(ckt->CKTstate0 + here->VBICcqbeci) = Qbe_Vbci;
|
||||
*(ckt->CKTstate0 + here->VBICcqbeci) = Qbe_Vbci;
|
||||
*(ckt->CKTstate0 + here->VBICcqbex) = Qbex_Vbex;
|
||||
*(ckt->CKTstate0 + here->VBICcqbc) = Qbc_Vbci;
|
||||
*(ckt->CKTstate0 + here->VBICcqbcx) = Qbcx_Vbcx;
|
||||
|
|
@ -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;
|
||||
|
|
@ -752,8 +833,14 @@ next1:
|
|||
*(ckt->CKTstate0 + here->VBICirbp_Vrbp) = Irbp_Vrbp;
|
||||
*(ckt->CKTstate0 + here->VBICirbp_Vbep) = Irbp_Vbep;
|
||||
*(ckt->CKTstate0 + here->VBICirbp_Vbci) = Irbp_Vbci;
|
||||
*(ckt->CKTstate0 + here->VBICgqbeo) = gqbeo;
|
||||
*(ckt->CKTstate0 + here->VBICgqbco) = gqbco;
|
||||
*(ckt->CKTstate0 + here->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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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:
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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,11 +47,17 @@ 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->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;
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
Loading…
Reference in New Issue