temperature model update tlev, tlevc
This commit is contained in:
parent
c797dedb7c
commit
1671cf2f02
|
|
@ -27,8 +27,8 @@ IFparm BJTpTable[] = { /* parameters */
|
|||
IOPU("areab", BJT_AREAB, IF_REAL, "Base area factor"),
|
||||
IOPU("areac", BJT_AREAC, IF_REAL, "Collector area factor"),
|
||||
IOPU("m", BJT_M, IF_REAL, "Parallel Multiplier"),
|
||||
IP("ic", BJT_IC, IF_REALVEC, "Initial condition vector"),
|
||||
IP("sens_area",BJT_AREA_SENS,IF_FLAG, "flag to request sensitivity WRT area"),
|
||||
IP("ic", BJT_IC, IF_REALVEC, "Initial condition vector"),
|
||||
IP("sens_area", BJT_AREA_SENS,IF_FLAG, "flag to request sensitivity WRT area"),
|
||||
OPU("colnode", BJT_QUEST_COLNODE, IF_INTEGER, "Number of collector node"),
|
||||
OPU("basenode", BJT_QUEST_BASENODE, IF_INTEGER, "Number of base node"),
|
||||
OPU("emitnode", BJT_QUEST_EMITNODE, IF_INTEGER, "Number of emitter node"),
|
||||
|
|
@ -50,23 +50,23 @@ IFparm BJTpTable[] = { /* parameters */
|
|||
OP("gx", BJT_QUEST_GX, IF_REAL, "Conductance from base to internal base"),
|
||||
OP("go", BJT_QUEST_GO, IF_REAL, "Small signal output conductance"),
|
||||
OPU("geqcb",BJT_QUEST_GEQCB,IF_REAL, "d(Ibe)/d(Vbc)"),
|
||||
OPU("gccs", BJT_QUEST_GCCS, IF_REAL, "Internal C-S cap. equiv. cond."),
|
||||
OPU("gcsub",BJT_QUEST_GCSUB, IF_REAL, "Internal Subs. cap. equiv. cond."),
|
||||
OPU("gdsub", BJT_QUEST_GDSUB, IF_REAL, "Internal Subs. Diode equiv. cond."),
|
||||
OPU("geqbx",BJT_QUEST_GEQBX,IF_REAL, "Internal C-B-base cap. equiv. cond."),
|
||||
|
||||
OP("cpi",BJT_QUEST_CPI, IF_REAL, "Internal base to emitter capactance"),
|
||||
OP("cmu",BJT_QUEST_CMU, IF_REAL, "Internal base to collector capactiance"),
|
||||
OP("cpi",BJT_QUEST_CPI, IF_REAL, "Internal base to emitter capacitance"),
|
||||
OP("cmu",BJT_QUEST_CMU, IF_REAL, "Internal base to collector capacitance"),
|
||||
OP("cbx",BJT_QUEST_CBX, IF_REAL, "Base to collector capacitance"),
|
||||
OP("ccs",BJT_QUEST_CCS, IF_REAL, "Collector to substrate capacitance"),
|
||||
|
||||
OP("csub",BJT_QUEST_CSUB, IF_REAL, "Substrate capacitance"),
|
||||
OPU("cqbe", BJT_QUEST_CQBE, IF_REAL, "Cap. due to charge storage in B-E jct."),
|
||||
OPU("cqbc", BJT_QUEST_CQBC, IF_REAL, "Cap. due to charge storage in B-C jct."),
|
||||
OPU("cqcs", BJT_QUEST_CQCS, IF_REAL, "Cap. due to charge storage in C-S jct."),
|
||||
OPU("cqsub", BJT_QUEST_CQSUB, IF_REAL, "Cap. due to charge storage in Subs. jct."),
|
||||
OPU("cqbx", BJT_QUEST_CQBX, IF_REAL, "Cap. due to charge storage in B-X jct."),
|
||||
OPU("cexbc",BJT_QUEST_CEXBC,IF_REAL, "Total Capacitance in B-X junction"),
|
||||
|
||||
OPU("qbe", BJT_QUEST_QBE, IF_REAL, "Charge storage B-E junction"),
|
||||
OPU("qbc", BJT_QUEST_QBC, IF_REAL, "Charge storage B-C junction"),
|
||||
OPU("qcs", BJT_QUEST_QCS, IF_REAL, "Charge storage C-S junction"),
|
||||
OPU("qsub", BJT_QUEST_QSUB, IF_REAL, "Charge storage Subs. junction"),
|
||||
OPU("qbx", BJT_QUEST_QBX, IF_REAL, "Charge storage B-X junction"),
|
||||
OPU("p", BJT_QUEST_POWER,IF_REAL, "Power dissipation"),
|
||||
OPU("sens_dc", BJT_QUEST_SENS_DC, IF_REAL, "dc sensitivity "),
|
||||
|
|
@ -84,6 +84,9 @@ IFparm BJTmPTable[] = { /* model parameters */
|
|||
OP("type", BJT_MOD_TYPE, IF_STRING, "NPN or PNP"),
|
||||
IOPU("npn", BJT_MOD_NPN, IF_FLAG, "NPN type device"),
|
||||
IOPU("pnp", BJT_MOD_PNP, IF_FLAG, "PNP type device"),
|
||||
IOPU("subs", BJT_MOD_SUBS, IF_INTEGER, "Vertical or Lateral device"),
|
||||
IOP("tnom", BJT_MOD_TNOM, IF_REAL, "Parameter measurement temperature"),
|
||||
IOPR("tref", BJT_MOD_TNOM, IF_REAL, "Parameter measurement temperature"),
|
||||
IOP("is", BJT_MOD_IS, IF_REAL, "Saturation Current"),
|
||||
IOP("bf", BJT_MOD_BF, IF_REAL, "Ideal forward beta"),
|
||||
IOP("nf", BJT_MOD_NF, IF_REAL, "Forward emission coefficient"),
|
||||
|
|
@ -128,8 +131,8 @@ IFparm BJTmPTable[] = { /* model parameters */
|
|||
IOPR("mc", BJT_MOD_MJC, IF_REAL, "B-C junction grading coefficient"),
|
||||
IOPA("xcjc",BJT_MOD_XCJC, IF_REAL, "Fraction of B-C cap to internal base"),
|
||||
IOPA("tr", BJT_MOD_TR, IF_REAL, "Ideal reverse transit time"),
|
||||
IOPA("cjs", BJT_MOD_CJS, IF_REAL, "Zero bias C-S capacitance"),
|
||||
IOPA("ccs", BJT_MOD_CJS, IF_REAL, "Zero bias C-S capacitance"),
|
||||
IOPA("cjs", BJT_MOD_CJS, IF_REAL, "Zero bias Substrate capacitance"),
|
||||
IOPR("csub", BJT_MOD_CJS, IF_REAL, "Zero bias Substrate capacitance"),
|
||||
IOPA("vjs", BJT_MOD_VJS, IF_REAL, "Substrate junction built in potential"),
|
||||
IOPR("ps", BJT_MOD_VJS, IF_REAL, "Substrate junction built in potential"),
|
||||
IOPA("mjs", BJT_MOD_MJS, IF_REAL, "Substrate junction grading coefficient"),
|
||||
|
|
@ -138,6 +141,8 @@ IFparm BJTmPTable[] = { /* model parameters */
|
|||
IOP("eg", BJT_MOD_EG, IF_REAL, "Energy gap for IS temp. dependency"),
|
||||
IOP("xti", BJT_MOD_XTI, IF_REAL, "Temp. exponent for IS"),
|
||||
IOP("fc", BJT_MOD_FC, IF_REAL, "Forward bias junction fit parameter"),
|
||||
IOP("kf", BJT_MOD_KF, IF_REAL, "Flicker Noise Coefficient"),
|
||||
IOP("af", BJT_MOD_AF, IF_REAL,"Flicker Noise Exponent"),
|
||||
OPU("invearlyvoltf",BJT_MOD_INVEARLYF,IF_REAL,"Inverse early voltage:forward"),
|
||||
OPU("invearlyvoltr",BJT_MOD_INVEARLYR,IF_REAL,"Inverse early voltage:reverse"),
|
||||
OPU("invrollofff", BJT_MOD_INVROLLOFFF, IF_REAL,"Inverse roll off - forward"),
|
||||
|
|
@ -146,11 +151,10 @@ IFparm BJTmPTable[] = { /* model parameters */
|
|||
OPU("emitterconduct", BJT_MOD_EMITTERCONDUCT,IF_REAL, "Emitter conductance"),
|
||||
OPU("transtimevbcfact",BJT_MOD_TRANSVBCFACT,IF_REAL,"Transit time VBC factor"),
|
||||
OPU("excessphasefactor",BJT_MOD_EXCESSPHASEFACTOR,IF_REAL, "Excess phase fact."),
|
||||
IOP("tnom", BJT_MOD_TNOM, IF_REAL, "Parameter measurement temperature"),
|
||||
|
||||
IOPR("tref", BJT_MOD_TNOM, IF_REAL, "Parameter measurement temperature"),
|
||||
IOP("tlev", BJT_MOD_TLEV, IF_REAL, "Temperature equation selector"),
|
||||
IOP("tlevc", BJT_MOD_TLEVC, IF_REAL, "Temperature equation selector"),
|
||||
IOP("iss", BJT_MOD_ISS, IF_REAL, "Substrate Jct. Saturation Current"),
|
||||
IOP("ns", BJT_MOD_NS, IF_REAL, "Substrate current emission coefficient"),
|
||||
IOP("tlev", BJT_MOD_TLEV, IF_INTEGER, "Temperature equation selector"),
|
||||
IOP("tlevc", BJT_MOD_TLEVC, IF_INTEGER, "Temperature equation selector"),
|
||||
IOP("tbf1", BJT_MOD_TBF1, IF_REAL, "BF 1. temperature coefficient"),
|
||||
IOP("tbf2", BJT_MOD_TBF2, IF_REAL, "BF 2. temperature coefficient"),
|
||||
IOP("tbr1", BJT_MOD_TBR1, IF_REAL, "BR 1. temperature coefficient"),
|
||||
|
|
@ -197,9 +201,10 @@ IFparm BJTmPTable[] = { /* model parameters */
|
|||
IOP("tmje2",BJT_MOD_TMJE2, IF_REAL, "MJE 2. temperature coefficient"),
|
||||
IOP("tmjc1",BJT_MOD_TMJC1, IF_REAL, "MJC 1. temperature coefficient"),
|
||||
IOP("tmjc2",BJT_MOD_TMJC2, IF_REAL, "MJC 2. temperature coefficient"),
|
||||
|
||||
IOP("kf", BJT_MOD_KF, IF_REAL, "Flicker Noise Coefficient"),
|
||||
IOP("af", BJT_MOD_AF, IF_REAL,"Flicker Noise Exponent")
|
||||
IOP("tmjs1",BJT_MOD_TMJS1, IF_REAL, "MJS 1. temperature coefficient"),
|
||||
IOP("tmjs2",BJT_MOD_TMJS2, IF_REAL, "MJS 2. temperature coefficient"),
|
||||
IOP("tns1", BJT_MOD_TNS1, IF_REAL, "NS 1. temperature coefficient"),
|
||||
IOP("tns2", BJT_MOD_TNS2, IF_REAL, "NS 2. temperature coefficient")
|
||||
};
|
||||
|
||||
char *BJTnames[] = {
|
||||
|
|
|
|||
|
|
@ -41,17 +41,17 @@ BJTask(CKTcircuit *ckt, GENinstance *instPtr, int which, IFvalue *value, IFvalue
|
|||
return(OK);
|
||||
case BJT_DTEMP:
|
||||
value->rValue = here->BJTdtemp;
|
||||
return(OK);
|
||||
return(OK);
|
||||
case BJT_AREA:
|
||||
value->rValue = here->BJTarea;
|
||||
return(OK);
|
||||
case BJT_AREAB:
|
||||
case BJT_AREAB:
|
||||
value->rValue = here->BJTareab;
|
||||
return(OK);
|
||||
case BJT_AREAC:
|
||||
case BJT_AREAC:
|
||||
value->rValue = here->BJTareac;
|
||||
return(OK);
|
||||
case BJT_M:
|
||||
case BJT_M:
|
||||
value->rValue = here->BJTm;
|
||||
return(OK);
|
||||
case BJT_OFF:
|
||||
|
|
@ -92,140 +92,150 @@ BJTask(CKTcircuit *ckt, GENinstance *instPtr, int which, IFvalue *value, IFvalue
|
|||
return(OK);
|
||||
case BJT_QUEST_CC:
|
||||
value->rValue = *(ckt->CKTstate0 + here->BJTcc);
|
||||
value->rValue *= here->BJTm;
|
||||
value->rValue *= here->BJTm;
|
||||
return(OK);
|
||||
case BJT_QUEST_CB:
|
||||
value->rValue = *(ckt->CKTstate0 + here->BJTcb);
|
||||
value->rValue *= here->BJTm;
|
||||
if (here->BJTmodPtr->BJTsubs==LATERAL) {
|
||||
value->rValue -= *(ckt->CKTstate0 + here->BJTcdsub);
|
||||
if ((ckt->CKTcurrentAnalysis & DOING_TRAN) &&
|
||||
!(ckt->CKTmode & MODETRANOP)) {
|
||||
value->rValue -= *(ckt->CKTstate0 + here->BJTcqsub);
|
||||
}
|
||||
};
|
||||
value->rValue *= here->BJTm;
|
||||
return(OK);
|
||||
case BJT_QUEST_GPI:
|
||||
value->rValue = *(ckt->CKTstate0 + here->BJTgpi);
|
||||
value->rValue *= here->BJTm;
|
||||
value->rValue *= here->BJTm;
|
||||
return(OK);
|
||||
case BJT_QUEST_GMU:
|
||||
value->rValue = *(ckt->CKTstate0 + here->BJTgmu);
|
||||
value->rValue *= here->BJTm;
|
||||
value->rValue *= here->BJTm;
|
||||
return(OK);
|
||||
case BJT_QUEST_GM:
|
||||
value->rValue = *(ckt->CKTstate0 + here->BJTgm);
|
||||
value->rValue *= here->BJTm;
|
||||
value->rValue *= here->BJTm;
|
||||
return(OK);
|
||||
case BJT_QUEST_GO:
|
||||
value->rValue = *(ckt->CKTstate0 + here->BJTgo);
|
||||
value->rValue *= here->BJTm;
|
||||
value->rValue *= here->BJTm;
|
||||
return(OK);
|
||||
case BJT_QUEST_QBE:
|
||||
value->rValue = *(ckt->CKTstate0 + here->BJTqbe);
|
||||
value->rValue *= here->BJTm;
|
||||
value->rValue *= here->BJTm;
|
||||
return(OK);
|
||||
case BJT_QUEST_CQBE:
|
||||
value->rValue = *(ckt->CKTstate0 + here->BJTcqbe);
|
||||
value->rValue *= here->BJTm;
|
||||
value->rValue *= here->BJTm;
|
||||
return(OK);
|
||||
case BJT_QUEST_QBC:
|
||||
value->rValue = *(ckt->CKTstate0 + here->BJTqbc);
|
||||
value->rValue *= here->BJTm;
|
||||
value->rValue *= here->BJTm;
|
||||
return(OK);
|
||||
case BJT_QUEST_CQBC:
|
||||
value->rValue = *(ckt->CKTstate0 + here->BJTcqbc);
|
||||
value->rValue *= here->BJTm;
|
||||
value->rValue *= here->BJTm;
|
||||
return(OK);
|
||||
case BJT_QUEST_QCS:
|
||||
value->rValue = *(ckt->CKTstate0 + here->BJTqcs);
|
||||
value->rValue *= here->BJTm;
|
||||
case BJT_QUEST_QSUB:
|
||||
value->rValue = *(ckt->CKTstate0 + here->BJTqsub);
|
||||
value->rValue *= here->BJTm;
|
||||
return(OK);
|
||||
case BJT_QUEST_CQCS:
|
||||
value->rValue = *(ckt->CKTstate0 + here->BJTcqcs);
|
||||
value->rValue *= here->BJTm;
|
||||
case BJT_QUEST_CQSUB:
|
||||
value->rValue = *(ckt->CKTstate0 + here->BJTcqsub);
|
||||
value->rValue *= here->BJTm;
|
||||
return(OK);
|
||||
case BJT_QUEST_QBX:
|
||||
value->rValue = *(ckt->CKTstate0 + here->BJTqbx);
|
||||
value->rValue *= here->BJTm;
|
||||
value->rValue *= here->BJTm;
|
||||
return(OK);
|
||||
case BJT_QUEST_CQBX:
|
||||
value->rValue = *(ckt->CKTstate0 + here->BJTcqbx);
|
||||
value->rValue *= here->BJTm;
|
||||
value->rValue *= here->BJTm;
|
||||
return(OK);
|
||||
case BJT_QUEST_GX:
|
||||
value->rValue = *(ckt->CKTstate0 + here->BJTgx);
|
||||
value->rValue *= here->BJTm;
|
||||
value->rValue *= here->BJTm;
|
||||
return(OK);
|
||||
case BJT_QUEST_CEXBC:
|
||||
value->rValue = *(ckt->CKTstate0 + here->BJTcexbc);
|
||||
value->rValue *= here->BJTm;
|
||||
value->rValue *= here->BJTm;
|
||||
return(OK);
|
||||
case BJT_QUEST_GEQCB:
|
||||
value->rValue = *(ckt->CKTstate0 + here->BJTgeqcb);
|
||||
value->rValue *= here->BJTm;
|
||||
value->rValue *= here->BJTm;
|
||||
return(OK);
|
||||
case BJT_QUEST_GCCS:
|
||||
value->rValue = *(ckt->CKTstate0 + here->BJTgccs);
|
||||
value->rValue *= here->BJTm;
|
||||
case BJT_QUEST_GCSUB:
|
||||
value->rValue = *(ckt->CKTstate0 + here->BJTgcsub);
|
||||
value->rValue *= here->BJTm;
|
||||
return(OK);
|
||||
case BJT_QUEST_GDSUB:
|
||||
value->rValue = *(ckt->CKTstate0 + here->BJTgdsub);
|
||||
value->rValue *= here->BJTm;
|
||||
return(OK);
|
||||
case BJT_QUEST_GEQBX:
|
||||
value->rValue = *(ckt->CKTstate0 + here->BJTgeqbx);
|
||||
value->rValue *= here->BJTm;
|
||||
value->rValue *= here->BJTm;
|
||||
return(OK);
|
||||
case BJT_QUEST_SENS_DC:
|
||||
if(ckt->CKTsenInfo){
|
||||
value->rValue = *(ckt->CKTsenInfo->SEN_Sap[select->iValue + 1]+
|
||||
here->BJTsenParmNo);
|
||||
case BJT_QUEST_SENS_DC:
|
||||
if(ckt->CKTsenInfo){
|
||||
value->rValue = *(ckt->CKTsenInfo->SEN_Sap[select->iValue + 1]+
|
||||
here->BJTsenParmNo);
|
||||
}
|
||||
return(OK);
|
||||
case BJT_QUEST_SENS_REAL:
|
||||
if(ckt->CKTsenInfo){
|
||||
value->rValue = *(ckt->CKTsenInfo->SEN_RHS[select->iValue + 1]+
|
||||
here->BJTsenParmNo);
|
||||
return(OK);
|
||||
case BJT_QUEST_SENS_REAL:
|
||||
if(ckt->CKTsenInfo){
|
||||
value->rValue = *(ckt->CKTsenInfo->SEN_RHS[select->iValue + 1]+
|
||||
here->BJTsenParmNo);
|
||||
}
|
||||
return(OK);
|
||||
case BJT_QUEST_SENS_IMAG:
|
||||
if(ckt->CKTsenInfo){
|
||||
value->rValue = *(ckt->CKTsenInfo->SEN_iRHS[select->iValue + 1]+
|
||||
here->BJTsenParmNo);
|
||||
return(OK);
|
||||
case BJT_QUEST_SENS_IMAG:
|
||||
if(ckt->CKTsenInfo){
|
||||
value->rValue = *(ckt->CKTsenInfo->SEN_iRHS[select->iValue + 1]+
|
||||
here->BJTsenParmNo);
|
||||
}
|
||||
return(OK);
|
||||
case BJT_QUEST_SENS_MAG:
|
||||
if(ckt->CKTsenInfo){
|
||||
vr = *(ckt->CKTrhsOld + select->iValue + 1);
|
||||
vi = *(ckt->CKTirhsOld + select->iValue + 1);
|
||||
vm = sqrt(vr*vr + vi*vi);
|
||||
if(vm == 0){
|
||||
value->rValue = 0;
|
||||
return(OK);
|
||||
}
|
||||
sr = *(ckt->CKTsenInfo->SEN_RHS[select->iValue + 1]+
|
||||
here->BJTsenParmNo);
|
||||
si = *(ckt->CKTsenInfo->SEN_iRHS[select->iValue + 1]+
|
||||
here->BJTsenParmNo);
|
||||
return(OK);
|
||||
case BJT_QUEST_SENS_MAG:
|
||||
if(ckt->CKTsenInfo){
|
||||
vr = *(ckt->CKTrhsOld + select->iValue + 1);
|
||||
vi = *(ckt->CKTirhsOld + select->iValue + 1);
|
||||
vm = sqrt(vr*vr + vi*vi);
|
||||
if(vm == 0){
|
||||
value->rValue = 0;
|
||||
return(OK);
|
||||
}
|
||||
sr = *(ckt->CKTsenInfo->SEN_RHS[select->iValue + 1]+
|
||||
here->BJTsenParmNo);
|
||||
si = *(ckt->CKTsenInfo->SEN_iRHS[select->iValue + 1]+
|
||||
here->BJTsenParmNo);
|
||||
value->rValue = (vr * sr + vi * si)/vm;
|
||||
}
|
||||
return(OK);
|
||||
case BJT_QUEST_SENS_PH:
|
||||
if(ckt->CKTsenInfo){
|
||||
vr = *(ckt->CKTrhsOld + select->iValue + 1);
|
||||
vi = *(ckt->CKTirhsOld + select->iValue + 1);
|
||||
vm = vr*vr + vi*vi;
|
||||
if(vm == 0){
|
||||
value->rValue = 0;
|
||||
return(OK);
|
||||
}
|
||||
sr = *(ckt->CKTsenInfo->SEN_RHS[select->iValue + 1]+
|
||||
here->BJTsenParmNo);
|
||||
si = *(ckt->CKTsenInfo->SEN_iRHS[select->iValue + 1]+
|
||||
here->BJTsenParmNo);
|
||||
|
||||
return(OK);
|
||||
case BJT_QUEST_SENS_PH:
|
||||
if(ckt->CKTsenInfo){
|
||||
vr = *(ckt->CKTrhsOld + select->iValue + 1);
|
||||
vi = *(ckt->CKTirhsOld + select->iValue + 1);
|
||||
vm = vr*vr + vi*vi;
|
||||
if(vm == 0){
|
||||
value->rValue = 0;
|
||||
return(OK);
|
||||
}
|
||||
sr = *(ckt->CKTsenInfo->SEN_RHS[select->iValue + 1]+
|
||||
here->BJTsenParmNo);
|
||||
si = *(ckt->CKTsenInfo->SEN_iRHS[select->iValue + 1]+
|
||||
here->BJTsenParmNo);
|
||||
value->rValue = (vr * si - vi * sr)/vm;
|
||||
}
|
||||
return(OK);
|
||||
case BJT_QUEST_SENS_CPLX:
|
||||
if(ckt->CKTsenInfo){
|
||||
itmp = select->iValue + 1;
|
||||
value->cValue.real= *(ckt->CKTsenInfo->SEN_RHS[itmp]+
|
||||
here->BJTsenParmNo);
|
||||
value->cValue.imag= *(ckt->CKTsenInfo->SEN_iRHS[itmp]+
|
||||
here->BJTsenParmNo);
|
||||
}
|
||||
return(OK);
|
||||
}
|
||||
return(OK);
|
||||
case BJT_QUEST_SENS_CPLX:
|
||||
if(ckt->CKTsenInfo){
|
||||
itmp = select->iValue + 1;
|
||||
value->cValue.real= *(ckt->CKTsenInfo->SEN_RHS[itmp]+
|
||||
here->BJTsenParmNo);
|
||||
value->cValue.imag= *(ckt->CKTsenInfo->SEN_iRHS[itmp]+
|
||||
here->BJTsenParmNo);
|
||||
}
|
||||
return(OK);
|
||||
case BJT_QUEST_CS :
|
||||
if (ckt->CKTcurrentAnalysis & DOING_AC) {
|
||||
errMsg = TMALLOC(char, strlen(msg) + 1);
|
||||
|
|
@ -238,8 +248,11 @@ BJTask(CKTcircuit *ckt, GENinstance *instPtr, int which, IFvalue *value, IFvalue
|
|||
(ckt->CKTmode & MODETRANOP)) {
|
||||
value->rValue = 0;
|
||||
} else {
|
||||
value->rValue = -*(ckt->CKTstate0 + here->BJTcqcs);
|
||||
value->rValue = -(here->BJTmodPtr->BJTsubs *
|
||||
(*(ckt->CKTstate0 + here->BJTcqsub) +
|
||||
*(ckt->CKTstate0 + here->BJTcdsub)));
|
||||
}
|
||||
value->rValue *= here->BJTm;
|
||||
return(OK);
|
||||
case BJT_QUEST_CE :
|
||||
if (ckt->CKTcurrentAnalysis & DOING_AC) {
|
||||
|
|
@ -250,11 +263,15 @@ BJTask(CKTcircuit *ckt, GENinstance *instPtr, int which, IFvalue *value, IFvalue
|
|||
} else {
|
||||
value->rValue = -*(ckt->CKTstate0 + here->BJTcc);
|
||||
value->rValue -= *(ckt->CKTstate0 + here->BJTcb);
|
||||
if ((ckt->CKTcurrentAnalysis & DOING_TRAN) &&
|
||||
!(ckt->CKTmode & MODETRANOP)) {
|
||||
value->rValue += *(ckt->CKTstate0 + here->BJTcqcs);
|
||||
if (here->BJTmodPtr->BJTsubs==VERTICAL) {
|
||||
value->rValue += *(ckt->CKTstate0 + here->BJTcdsub);
|
||||
if ((ckt->CKTcurrentAnalysis & DOING_TRAN) &&
|
||||
!(ckt->CKTmode & MODETRANOP)) {
|
||||
value->rValue += *(ckt->CKTstate0 + here->BJTcqsub);
|
||||
}
|
||||
}
|
||||
}
|
||||
value->rValue *= here->BJTm;
|
||||
return(OK);
|
||||
case BJT_QUEST_POWER :
|
||||
if (ckt->CKTcurrentAnalysis & DOING_AC) {
|
||||
|
|
@ -263,41 +280,42 @@ BJTask(CKTcircuit *ckt, GENinstance *instPtr, int which, IFvalue *value, IFvalue
|
|||
strcpy(errMsg,msg);
|
||||
return(E_ASKPOWER);
|
||||
} else {
|
||||
value->rValue = *(ckt->CKTstate0 + here->BJTcc) *
|
||||
*(ckt->CKTrhsOld + here->BJTcolNode);
|
||||
value->rValue += *(ckt->CKTstate0 + here->BJTcb) *
|
||||
*(ckt->CKTrhsOld + here->BJTbaseNode);
|
||||
value->rValue = fabs( *(ckt->CKTstate0 + here->BJTcc) *
|
||||
(*(ckt->CKTrhsOld + here->BJTcolNode)-
|
||||
*(ckt->CKTrhsOld + here->BJTemitNode))
|
||||
);
|
||||
value->rValue +=fabs( *(ckt->CKTstate0 + here->BJTcb) *
|
||||
(*(ckt->CKTrhsOld + here->BJTbaseNode)-
|
||||
*(ckt->CKTrhsOld + here->BJTemitNode))
|
||||
);
|
||||
value->rValue +=fabs( *(ckt->CKTstate0 + here->BJTcdsub) *
|
||||
(*(ckt->CKTrhsOld + here->BJTsubstConNode)-
|
||||
*(ckt->CKTrhsOld + here->BJTsubstNode))
|
||||
);
|
||||
if ((ckt->CKTcurrentAnalysis & DOING_TRAN) && !(ckt->CKTmode &
|
||||
MODETRANOP)) {
|
||||
value->rValue -= *(ckt->CKTstate0 + here->BJTcqcs) *
|
||||
*(ckt->CKTrhsOld + here->BJTsubstNode);
|
||||
value->rValue += *(ckt->CKTstate0 + here->BJTcqsub) *
|
||||
fabs(*(ckt->CKTrhsOld + here->BJTsubstConNode)-
|
||||
*(ckt->CKTrhsOld + here->BJTsubstNode));
|
||||
}
|
||||
tmp = -*(ckt->CKTstate0 + here->BJTcc);
|
||||
tmp -= *(ckt->CKTstate0 + here->BJTcb);
|
||||
if ((ckt->CKTcurrentAnalysis & DOING_TRAN) &&
|
||||
!(ckt->CKTmode & MODETRANOP)) {
|
||||
tmp += *(ckt->CKTstate0 + here->BJTcqcs);
|
||||
}
|
||||
value->rValue += tmp * *(ckt->CKTrhsOld +
|
||||
here->BJTemitNode);
|
||||
}
|
||||
value->rValue *= here->BJTm;
|
||||
value->rValue *= here->BJTm;
|
||||
return(OK);
|
||||
case BJT_QUEST_CPI:
|
||||
value->rValue = here->BJTcapbe;
|
||||
value->rValue *= here->BJTm;
|
||||
case BJT_QUEST_CPI:
|
||||
value->rValue = here->BJTcapbe;
|
||||
value->rValue *= here->BJTm;
|
||||
return(OK);
|
||||
case BJT_QUEST_CMU:
|
||||
value->rValue = here->BJTcapbc;
|
||||
value->rValue *= here->BJTm;
|
||||
case BJT_QUEST_CMU:
|
||||
value->rValue = here->BJTcapbc;
|
||||
value->rValue *= here->BJTm;
|
||||
return(OK);
|
||||
case BJT_QUEST_CBX:
|
||||
value->rValue = here->BJTcapbx;
|
||||
value->rValue *= here->BJTm;
|
||||
case BJT_QUEST_CBX:
|
||||
value->rValue = here->BJTcapbx;
|
||||
value->rValue *= here->BJTm;
|
||||
return(OK);
|
||||
case BJT_QUEST_CCS:
|
||||
value->rValue = here->BJTcapcs;
|
||||
value->rValue *= here->BJTm;
|
||||
case BJT_QUEST_CSUB:
|
||||
value->rValue = here->BJTcapsub;
|
||||
value->rValue *= here->BJTm;
|
||||
return(OK);
|
||||
default:
|
||||
return(E_BADPARM);
|
||||
|
|
|
|||
|
|
@ -31,6 +31,10 @@ typedef struct sBJTinstance {
|
|||
int BJTcolPrimeNode; /* number of internal collector node of bjt */
|
||||
int BJTbasePrimeNode; /* number of internal base node of bjt */
|
||||
int BJTemitPrimeNode; /* number of internal emitter node of bjt */
|
||||
int BJTsubstConNode; /* number of node which substrate is connected to */
|
||||
/* Substrate connection is either base prime *
|
||||
* or collector prime depending on whether *
|
||||
* the device is VERTICAL or LATERAL */
|
||||
double BJTarea; /* (emitter) area factor for the bjt */
|
||||
double BJTareab; /* base area factor for the bjt */
|
||||
double BJTareac; /* collector area factor for the bjt */
|
||||
|
|
@ -48,11 +52,15 @@ typedef struct sBJTinstance {
|
|||
double BJTtBEpot; /* temperature adjusted B-E potential */
|
||||
double BJTtBCcap; /* temperature adjusted B-C capacitance */
|
||||
double BJTtBCpot; /* temperature adjusted B-C potential */
|
||||
double BJTtSubcap; /* temperature adjusted Substrate capacitance */
|
||||
double BJTtSubpot; /* temperature adjusted Substrate potential */
|
||||
double BJTtDepCap; /* temperature adjusted join point in diode curve */
|
||||
double BJTtf1; /* temperature adjusted polynomial coefficient */
|
||||
double BJTtf4; /* temperature adjusted polynomial coefficient */
|
||||
double BJTtf5; /* temperature adjusted polynomial coefficient */
|
||||
double BJTtVcrit; /* temperature adjusted critical voltage */
|
||||
double BJTtSubVcrit; /* temperature adjusted substrate critical voltage */
|
||||
double BJTtSubSatCur; /* temperature adjusted subst. saturation current */
|
||||
double BJTtcollectorConduct; /* temperature adjusted */
|
||||
double BJTtemitterConduct; /* temperature adjusted */
|
||||
double BJTtbaseResist; /* temperature adjusted */
|
||||
|
|
@ -62,15 +70,17 @@ typedef struct sBJTinstance {
|
|||
double BJTtinvEarlyVoltR; /* temperature adjusted */
|
||||
double BJTtinvRollOffF; /* temperature adjusted */
|
||||
double BJTtinvRollOffR; /* temperature adjusted */
|
||||
double BJTtemissionCoeffF; /* temperature adjusted */
|
||||
double BJTtemissionCoeffR; /* temperature adjusted */
|
||||
double BJTtleakBEemissionCoeff; /* temperature adjusted */
|
||||
double BJTtleakBCemissionCoeff; /* temperature adjusted */
|
||||
double BJTtemissionCoeffF; /* temperature adjusted NF */
|
||||
double BJTtemissionCoeffR; /* temperature adjusted NR */
|
||||
double BJTtleakBEemissionCoeff; /* temperature adjusted NE */
|
||||
double BJTtleakBCemissionCoeff; /* temperature adjusted NC */
|
||||
double BJTttransitTimeHighCurrentF; /* temperature adjusted */
|
||||
double BJTttransitTimeF; /* temperature adjusted */
|
||||
double BJTttransitTimeR; /* temperature adjusted */
|
||||
double BJTtjunctionExpBE; /* temperature adjusted */
|
||||
double BJTtjunctionExpBC; /* temperature adjusted */
|
||||
double BJTtjunctionExpBE; /* temperature adjusted MJE */
|
||||
double BJTtjunctionExpBC; /* temperature adjusted MJC */
|
||||
double BJTtjunctionExpSub; /* temperature adjusted MJS */
|
||||
double BJTtemissionCoeffS; /* temperature adjusted NS */
|
||||
|
||||
double *BJTcolColPrimePtr; /* pointer to sparse matrix at
|
||||
* (collector,collector prime) */
|
||||
|
|
@ -110,10 +120,15 @@ typedef struct sBJTinstance {
|
|||
* (emitter prime,emitter prime) */
|
||||
double *BJTsubstSubstPtr; /* pointer to sparse matrix at
|
||||
* (substrate,substrate) */
|
||||
double *BJTcolPrimeSubstPtr; /* pointer to sparse matrix at
|
||||
* (collector prime,substrate) */
|
||||
double *BJTsubstColPrimePtr; /* pointer to sparse matrix at
|
||||
* (substrate,collector prime) */
|
||||
double *BJTsubstConSubstPtr; /* pointer to sparse matrix at
|
||||
* (Substrate connection, substrate) */
|
||||
double *BJTsubstSubstConPtr; /* pointer to sparse matrix at
|
||||
* (substrate, Substrate connection) */
|
||||
double *BJTsubstConSubstConPtr; /* pointer to sparse matrix at
|
||||
* (Substrate connection, Substrate connection) */
|
||||
/* Substrate connection is either base prime *
|
||||
* or collector prime depending on whether *
|
||||
* the device is VERTICAL or LATERAL */
|
||||
double *BJTbaseColPrimePtr; /* pointer to sparse matrix at
|
||||
* (base,collector prime) */
|
||||
double *BJTcolPrimeBasePtr; /* pointer to sparse matrix at
|
||||
|
|
@ -135,7 +150,7 @@ typedef struct sBJTinstance {
|
|||
set equal to 0 if not a design parameter*/
|
||||
double BJTcapbe;
|
||||
double BJTcapbc;
|
||||
double BJTcapcs;
|
||||
double BJTcapsub;
|
||||
double BJTcapbx;
|
||||
double *BJTsens;
|
||||
|
||||
|
|
@ -148,10 +163,10 @@ typedef struct sBJTinstance {
|
|||
#define BJTsenCmu BJTsens+30 /* stores the perturbed values of cmu */
|
||||
#define BJTsenCbx BJTsens+35 /* stores the perturbed values of cbx */
|
||||
#define BJTsenCmcb BJTsens+40 /* stores the perturbed values of cmcb */
|
||||
#define BJTsenCcs BJTsens+45 /* stores the perturbed values of ccs */
|
||||
#define BJTsenCsub BJTsens+45 /* stores the perturbed values of csub */
|
||||
#define BJTdphibedp BJTsens+51
|
||||
#define BJTdphibcdp BJTsens+52
|
||||
#define BJTdphicsdp BJTsens+53
|
||||
#define BJTdphisubdp BJTsens+53
|
||||
#define BJTdphibxdp BJTsens+54
|
||||
|
||||
/*
|
||||
|
|
@ -254,11 +269,11 @@ typedef struct sBJTinstance {
|
|||
|
||||
#define BJTRCNOIZ 0
|
||||
#define BJTRBNOIZ 1
|
||||
#define BJT_RE_NOISE 2
|
||||
#define BJT_RE_NOISE 2
|
||||
#define BJTICNOIZ 3
|
||||
#define BJTIBNOIZ 4
|
||||
#define BJTFLNOIZ 5
|
||||
#define BJTTOTNOIZ 6
|
||||
#define BJTFLNOIZ 5
|
||||
#define BJTTOTNOIZ 6
|
||||
|
||||
#define BJTNSRCS 7 /* the number of BJT noise sources */
|
||||
|
||||
|
|
@ -284,23 +299,26 @@ typedef struct sBJTinstance {
|
|||
#define BJTcqbe BJTstate+9
|
||||
#define BJTqbc BJTstate+10
|
||||
#define BJTcqbc BJTstate+11
|
||||
#define BJTqcs BJTstate+12
|
||||
#define BJTcqcs BJTstate+13
|
||||
#define BJTqsub BJTstate+12
|
||||
#define BJTcqsub BJTstate+13
|
||||
#define BJTqbx BJTstate+14
|
||||
#define BJTcqbx BJTstate+15
|
||||
#define BJTgx BJTstate+16
|
||||
#define BJTcexbc BJTstate+17
|
||||
#define BJTgeqcb BJTstate+18
|
||||
#define BJTgccs BJTstate+19
|
||||
#define BJTgcsub BJTstate+19
|
||||
#define BJTgeqbx BJTstate+20
|
||||
#define BJTnumStates 21
|
||||
#define BJTvsub BJTstate+21
|
||||
#define BJTcdsub BJTstate+22
|
||||
#define BJTgdsub BJTstate+23
|
||||
#define BJTnumStates 24
|
||||
|
||||
#define BJTsensxpbe BJTstate+21 /* charge sensitivities and their
|
||||
derivatives. +22 for the derivatives -
|
||||
#define BJTsensxpbe BJTstate+24 /* charge sensitivities and their
|
||||
derivatives. +25 for the derivatives -
|
||||
pointer to the beginning of the array */
|
||||
#define BJTsensxpbc BJTstate+23
|
||||
#define BJTsensxpcs BJTstate+25
|
||||
#define BJTsensxpbx BJTstate+27
|
||||
#define BJTsensxpbc BJTstate+26
|
||||
#define BJTsensxpsub BJTstate+28
|
||||
#define BJTsensxpbx BJTstate+30
|
||||
|
||||
#define BJTnumSenStates 8
|
||||
|
||||
|
|
@ -313,6 +331,7 @@ typedef struct sBJTmodel { /* model structure for a bjt */
|
|||
* that have this model */
|
||||
IFuid BJTmodName; /* pointer to character string naming this model */
|
||||
int BJTtype;
|
||||
int BJTsubs;
|
||||
|
||||
double BJTtnom; /* nominal temperature */
|
||||
double BJTsatCur; /* input - don't use */
|
||||
|
|
@ -348,7 +367,7 @@ typedef struct sBJTmodel { /* model structure for a bjt */
|
|||
double BJTjunctionExpBC;
|
||||
double BJTbaseFractionBCcap;
|
||||
double BJTtransitTimeR;
|
||||
double BJTcapCS;
|
||||
double BJTcapSub;
|
||||
double BJTpotentialSubstrate;
|
||||
double BJTexponentialSubstrate;
|
||||
double BJTbetaExp;
|
||||
|
|
@ -357,6 +376,8 @@ typedef struct sBJTmodel { /* model structure for a bjt */
|
|||
double BJTdepletionCapCoeff;
|
||||
double BJTfNcoef;
|
||||
double BJTfNexp;
|
||||
double BJTsubSatCur; /* input - don't use */
|
||||
double BJTemissionCoeffS;
|
||||
unsigned BJTtlev;
|
||||
unsigned BJTtlevc;
|
||||
double BJTtbf1;
|
||||
|
|
@ -405,7 +426,10 @@ typedef struct sBJTmodel { /* model structure for a bjt */
|
|||
double BJTtmje2;
|
||||
double BJTtmjc1;
|
||||
double BJTtmjc2;
|
||||
|
||||
double BJTtmjs1;
|
||||
double BJTtmjs2;
|
||||
double BJTtns1;
|
||||
double BJTtns2;
|
||||
double BJTinvEarlyVoltF; /* inverse of BJTearlyVoltF */
|
||||
double BJTinvEarlyVoltR; /* inverse of BJTearlyVoltR */
|
||||
double BJTinvRollOffF; /* inverse of BJTrollOffF */
|
||||
|
|
@ -419,6 +443,7 @@ typedef struct sBJTmodel { /* model structure for a bjt */
|
|||
double BJTf6;
|
||||
double BJTf7;
|
||||
|
||||
unsigned BJTsubsGiven : 1;
|
||||
unsigned BJTtnomGiven : 1;
|
||||
unsigned BJTsatCurGiven : 1;
|
||||
unsigned BJTbetaFGiven : 1;
|
||||
|
|
@ -453,7 +478,7 @@ typedef struct sBJTmodel { /* model structure for a bjt */
|
|||
unsigned BJTjunctionExpBCGiven : 1;
|
||||
unsigned BJTbaseFractionBCcapGiven : 1;
|
||||
unsigned BJTtransitTimeRGiven : 1;
|
||||
unsigned BJTcapCSGiven : 1;
|
||||
unsigned BJTcapSubGiven : 1;
|
||||
unsigned BJTpotentialSubstrateGiven : 1;
|
||||
unsigned BJTexponentialSubstrateGiven : 1;
|
||||
unsigned BJTbetaExpGiven : 1;
|
||||
|
|
@ -462,6 +487,8 @@ typedef struct sBJTmodel { /* model structure for a bjt */
|
|||
unsigned BJTdepletionCapCoeffGiven : 1;
|
||||
unsigned BJTfNcoefGiven : 1;
|
||||
unsigned BJTfNexpGiven :1;
|
||||
unsigned BJTsubSatCurGiven : 1;
|
||||
unsigned BJTemissionCoeffSGiven : 1;
|
||||
unsigned BJTtlevGiven : 1;
|
||||
unsigned BJTtlevcGiven : 1;
|
||||
unsigned BJTtbf1Given : 1;
|
||||
|
|
@ -510,6 +537,10 @@ typedef struct sBJTmodel { /* model structure for a bjt */
|
|||
unsigned BJTtmje2Given : 1;
|
||||
unsigned BJTtmjc1Given : 1;
|
||||
unsigned BJTtmjc2Given : 1;
|
||||
unsigned BJTtmjs1Given : 1;
|
||||
unsigned BJTtmjs2Given : 1;
|
||||
unsigned BJTtns1Given : 1;
|
||||
unsigned BJTtns2Given : 1;
|
||||
} BJTmodel;
|
||||
|
||||
#ifndef NPN
|
||||
|
|
@ -517,6 +548,15 @@ typedef struct sBJTmodel { /* model structure for a bjt */
|
|||
#define PNP -1
|
||||
#endif /*NPN*/
|
||||
|
||||
/*
|
||||
* BJT defaults to vertical for both NPN and
|
||||
* PNP devices.
|
||||
*/
|
||||
#ifndef VERTICAL
|
||||
#define VERTICAL 1
|
||||
#define LATERAL -1
|
||||
#endif /* VERTICAL */
|
||||
|
||||
/* device parameters */
|
||||
#define BJT_AREA 1
|
||||
#define BJT_OFF 2
|
||||
|
|
@ -573,57 +613,64 @@ typedef struct sBJTmodel { /* model structure for a bjt */
|
|||
#define BJT_MOD_EG 140
|
||||
#define BJT_MOD_XTI 141
|
||||
#define BJT_MOD_FC 142
|
||||
#define BJT_MOD_TNOM 143
|
||||
#define BJT_MOD_TLEV 144
|
||||
#define BJT_MOD_TLEVC 145
|
||||
#define BJT_MOD_TBF1 146
|
||||
#define BJT_MOD_TBF2 147
|
||||
#define BJT_MOD_TBR1 148
|
||||
#define BJT_MOD_TBR2 149
|
||||
#define BJT_MOD_TIKF1 150
|
||||
#define BJT_MOD_TIKF2 151
|
||||
#define BJT_MOD_TIKR1 152
|
||||
#define BJT_MOD_TIKR2 153
|
||||
#define BJT_MOD_TIRB1 154
|
||||
#define BJT_MOD_TIRB2 155
|
||||
#define BJT_MOD_TNC1 156
|
||||
#define BJT_MOD_TNC2 157
|
||||
#define BJT_MOD_TNE1 158
|
||||
#define BJT_MOD_TNE2 159
|
||||
#define BJT_MOD_TNF1 160
|
||||
#define BJT_MOD_TNF2 161
|
||||
#define BJT_MOD_TNR1 162
|
||||
#define BJT_MOD_TNR2 163
|
||||
#define BJT_MOD_TRB1 164
|
||||
#define BJT_MOD_TRB2 165
|
||||
#define BJT_MOD_TRC1 166
|
||||
#define BJT_MOD_TRC2 167
|
||||
#define BJT_MOD_TRE1 168
|
||||
#define BJT_MOD_TRE2 169
|
||||
#define BJT_MOD_TRM1 170
|
||||
#define BJT_MOD_TRM2 171
|
||||
#define BJT_MOD_TVAF1 172
|
||||
#define BJT_MOD_TVAF2 173
|
||||
#define BJT_MOD_TVAR1 174
|
||||
#define BJT_MOD_TVAR2 175
|
||||
#define BJT_MOD_CTC 176
|
||||
#define BJT_MOD_CTE 177
|
||||
#define BJT_MOD_CTS 178
|
||||
#define BJT_MOD_TVJC 179
|
||||
#define BJT_MOD_TVJE 180
|
||||
#define BJT_MOD_TVJS 181
|
||||
#define BJT_MOD_AF 182
|
||||
#define BJT_MOD_KF 183
|
||||
#define BJT_MOD_TITF1 184
|
||||
#define BJT_MOD_TITF2 185
|
||||
#define BJT_MOD_TTF1 186
|
||||
#define BJT_MOD_TTF2 187
|
||||
#define BJT_MOD_TTR1 188
|
||||
#define BJT_MOD_TTR2 189
|
||||
#define BJT_MOD_TMJE1 190
|
||||
#define BJT_MOD_TMJE2 191
|
||||
#define BJT_MOD_TMJC1 192
|
||||
#define BJT_MOD_TMJC2 192
|
||||
#define BJT_MOD_AF 143
|
||||
#define BJT_MOD_KF 144
|
||||
#define BJT_MOD_ISS 145
|
||||
#define BJT_MOD_NS 146
|
||||
#define BJT_MOD_TNOM 147
|
||||
#define BJT_MOD_TLEV 148
|
||||
#define BJT_MOD_TLEVC 149
|
||||
#define BJT_MOD_TBF1 150
|
||||
#define BJT_MOD_TBF2 151
|
||||
#define BJT_MOD_TBR1 152
|
||||
#define BJT_MOD_TBR2 153
|
||||
#define BJT_MOD_TIKF1 154
|
||||
#define BJT_MOD_TIKF2 155
|
||||
#define BJT_MOD_TIKR1 156
|
||||
#define BJT_MOD_TIKR2 157
|
||||
#define BJT_MOD_TIRB1 158
|
||||
#define BJT_MOD_TIRB2 159
|
||||
#define BJT_MOD_TNC1 160
|
||||
#define BJT_MOD_TNC2 161
|
||||
#define BJT_MOD_TNE1 162
|
||||
#define BJT_MOD_TNE2 163
|
||||
#define BJT_MOD_TNF1 164
|
||||
#define BJT_MOD_TNF2 165
|
||||
#define BJT_MOD_TNR1 166
|
||||
#define BJT_MOD_TNR2 167
|
||||
#define BJT_MOD_TRB1 168
|
||||
#define BJT_MOD_TRB2 169
|
||||
#define BJT_MOD_TRC1 170
|
||||
#define BJT_MOD_TRC2 171
|
||||
#define BJT_MOD_TRE1 172
|
||||
#define BJT_MOD_TRE2 173
|
||||
#define BJT_MOD_TRM1 174
|
||||
#define BJT_MOD_TRM2 175
|
||||
#define BJT_MOD_TVAF1 176
|
||||
#define BJT_MOD_TVAF2 177
|
||||
#define BJT_MOD_TVAR1 178
|
||||
#define BJT_MOD_TVAR2 179
|
||||
#define BJT_MOD_CTC 180
|
||||
#define BJT_MOD_CTE 181
|
||||
#define BJT_MOD_CTS 182
|
||||
#define BJT_MOD_TVJC 183
|
||||
#define BJT_MOD_TVJE 184
|
||||
#define BJT_MOD_TVJS 185
|
||||
#define BJT_MOD_TITF1 186
|
||||
#define BJT_MOD_TITF2 187
|
||||
#define BJT_MOD_TTF1 188
|
||||
#define BJT_MOD_TTF2 189
|
||||
#define BJT_MOD_TTR1 190
|
||||
#define BJT_MOD_TTR2 191
|
||||
#define BJT_MOD_TMJE1 192
|
||||
#define BJT_MOD_TMJE2 193
|
||||
#define BJT_MOD_TMJC1 194
|
||||
#define BJT_MOD_TMJC2 195
|
||||
#define BJT_MOD_TMJS1 196
|
||||
#define BJT_MOD_TMJS2 197
|
||||
#define BJT_MOD_TNS1 198
|
||||
#define BJT_MOD_TNS2 199
|
||||
#define BJT_MOD_SUBS 200
|
||||
|
||||
/* device questions */
|
||||
#define BJT_QUEST_FT 201
|
||||
|
|
@ -646,14 +693,14 @@ typedef struct sBJTmodel { /* model structure for a bjt */
|
|||
#define BJT_QUEST_CQBE 218
|
||||
#define BJT_QUEST_QBC 219
|
||||
#define BJT_QUEST_CQBC 220
|
||||
#define BJT_QUEST_QCS 221
|
||||
#define BJT_QUEST_CQCS 222
|
||||
#define BJT_QUEST_QSUB 221
|
||||
#define BJT_QUEST_CQSUB 222
|
||||
#define BJT_QUEST_QBX 223
|
||||
#define BJT_QUEST_CQBX 224
|
||||
#define BJT_QUEST_GX 225
|
||||
#define BJT_QUEST_CEXBC 226
|
||||
#define BJT_QUEST_GEQCB 227
|
||||
#define BJT_QUEST_GCCS 228
|
||||
#define BJT_QUEST_GCSUB 228
|
||||
#define BJT_QUEST_GEQBX 229
|
||||
#define BJT_QUEST_SENS_REAL 230
|
||||
#define BJT_QUEST_SENS_IMAG 231
|
||||
|
|
@ -664,11 +711,11 @@ typedef struct sBJTmodel { /* model structure for a bjt */
|
|||
#define BJT_QUEST_CE 236
|
||||
#define BJT_QUEST_CS 237
|
||||
#define BJT_QUEST_POWER 238
|
||||
|
||||
#define BJT_QUEST_CPI 239
|
||||
#define BJT_QUEST_CMU 240
|
||||
#define BJT_QUEST_CBX 241
|
||||
#define BJT_QUEST_CCS 242
|
||||
#define BJT_QUEST_CSUB 242
|
||||
#define BJT_QUEST_GDSUB 243
|
||||
|
||||
/* model questions */
|
||||
#define BJT_MOD_INVEARLYF 301
|
||||
|
|
@ -679,8 +726,8 @@ typedef struct sBJTmodel { /* model structure for a bjt */
|
|||
#define BJT_MOD_EMITTERCONDUCT 306
|
||||
#define BJT_MOD_TRANSVBCFACT 307
|
||||
#define BJT_MOD_EXCESSPHASEFACTOR 308
|
||||
#define BJT_MOD_TYPE 309
|
||||
|
||||
#define BJT_MOD_TYPE 309
|
||||
#define BJT_MOD_QUEST_SUBS 310
|
||||
|
||||
#include "bjtext.h"
|
||||
#endif /*BJT*/
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load Diff
|
|
@ -20,7 +20,7 @@ Modified: 2000 AlansFixes
|
|||
|
||||
int
|
||||
BJTload(GENmodel *inModel, CKTcircuit *ckt)
|
||||
/* actually load the current resistance value into the
|
||||
/* actually load the current resistance value into the
|
||||
* sparse matrix previously provided
|
||||
*/
|
||||
{
|
||||
|
|
@ -36,7 +36,7 @@ BJTload(GENmodel *inModel, CKTcircuit *ckt)
|
|||
double capbc;
|
||||
double capbe;
|
||||
double capbx=0;
|
||||
double capcs=0;
|
||||
double capsub=0;
|
||||
double cb;
|
||||
double cbc;
|
||||
double cbcn;
|
||||
|
|
@ -50,9 +50,11 @@ BJTload(GENmodel *inModel, CKTcircuit *ckt)
|
|||
double ceqbc;
|
||||
double ceqbe;
|
||||
double ceqbx;
|
||||
double ceqcs;
|
||||
double geqsub;
|
||||
double ceqsub;
|
||||
double cex;
|
||||
double csat;
|
||||
double csubsat;
|
||||
double ctot;
|
||||
double czbc;
|
||||
double czbcf2;
|
||||
|
|
@ -60,7 +62,7 @@ BJTload(GENmodel *inModel, CKTcircuit *ckt)
|
|||
double czbef2;
|
||||
double czbx;
|
||||
double czbxf2;
|
||||
double czcs;
|
||||
double czsub;
|
||||
double delvbc;
|
||||
double delvbe;
|
||||
double denom;
|
||||
|
|
@ -79,7 +81,7 @@ BJTload(GENmodel *inModel, CKTcircuit *ckt)
|
|||
double gbcn;
|
||||
double gbe;
|
||||
double gben;
|
||||
double gccs;
|
||||
double gcsub;
|
||||
double gcpr;
|
||||
double gepr;
|
||||
double geq;
|
||||
|
|
@ -110,13 +112,14 @@ BJTload(GENmodel *inModel, CKTcircuit *ckt)
|
|||
double tr;
|
||||
double vbc;
|
||||
double vbe;
|
||||
double vbx=0;
|
||||
double vbx=0.0;
|
||||
double vce;
|
||||
double vcs=0;
|
||||
double vsub=0.0;
|
||||
double vt;
|
||||
double vtc;
|
||||
double vte;
|
||||
double vtn;
|
||||
double vts;
|
||||
#ifndef PREDICTOR
|
||||
double xfact;
|
||||
#endif
|
||||
|
|
@ -126,7 +129,10 @@ BJTload(GENmodel *inModel, CKTcircuit *ckt)
|
|||
double xme;
|
||||
double xms;
|
||||
double xtf;
|
||||
int icheck;
|
||||
double evsub;
|
||||
double gdsub;
|
||||
double cdsub;
|
||||
int icheck=1;
|
||||
int ichk1;
|
||||
int error;
|
||||
int SenCond=0;
|
||||
|
|
@ -155,8 +161,8 @@ BJTload(GENmodel *inModel, CKTcircuit *ckt)
|
|||
}
|
||||
|
||||
|
||||
gccs=0;
|
||||
ceqcs=0;
|
||||
gcsub=0;
|
||||
ceqsub=0;
|
||||
geqbx=0;
|
||||
ceqbx=0;
|
||||
geqcb=0;
|
||||
|
|
@ -164,6 +170,7 @@ BJTload(GENmodel *inModel, CKTcircuit *ckt)
|
|||
* dc model paramters
|
||||
*/
|
||||
csat=here->BJTtSatCur*here->BJTarea;
|
||||
csubsat=here->BJTtSubSatCur*here->BJTarea;
|
||||
rbpr=here->BJTtminBaseResist/here->BJTarea;
|
||||
rbpi=here->BJTtbaseResist/here->BJTarea-rbpr;
|
||||
gcpr=here->BJTtcollectorConduct*here->BJTarea;
|
||||
|
|
@ -172,7 +179,10 @@ BJTload(GENmodel *inModel, CKTcircuit *ckt)
|
|||
c2=here->BJTtBEleakCur*here->BJTarea;
|
||||
vte=here->BJTtleakBEemissionCoeff*vt;
|
||||
oikr=here->BJTtinvRollOffR/here->BJTarea;
|
||||
c4=here->BJTtBCleakCur*here->BJTareab;
|
||||
if (model->BJTsubs == VERTICAL)
|
||||
c4=here->BJTtBCleakCur * here->BJTareab;
|
||||
else
|
||||
c4=here->BJTtBCleakCur * here->BJTareac;
|
||||
vtc=here->BJTtleakBCemissionCoeff*vt;
|
||||
td=model->BJTexcessPhaseFactor;
|
||||
xjrb=here->BJTtbaseCurrentHalfResist*here->BJTarea;
|
||||
|
|
@ -189,9 +199,9 @@ BJTload(GENmodel *inModel, CKTcircuit *ckt)
|
|||
vbx=model->BJTtype*(
|
||||
*(ckt->CKTrhsOp+here->BJTbaseNode)-
|
||||
*(ckt->CKTrhsOp+here->BJTcolPrimeNode));
|
||||
vcs=model->BJTtype*(
|
||||
vsub=model->BJTtype*model->BJTsubs*(
|
||||
*(ckt->CKTrhsOp+here->BJTsubstNode)-
|
||||
*(ckt->CKTrhsOp+here->BJTcolPrimeNode));
|
||||
*(ckt->CKTrhsOp+here->BJTsubstConNode));
|
||||
}
|
||||
else{
|
||||
vbe = *(ckt->CKTstate0 + here->BJTvbe);
|
||||
|
|
@ -201,17 +211,17 @@ BJTload(GENmodel *inModel, CKTcircuit *ckt)
|
|||
vbx=model->BJTtype*(
|
||||
*(ckt->CKTrhsOld+here->BJTbaseNode)-
|
||||
*(ckt->CKTrhsOld+here->BJTcolPrimeNode));
|
||||
vcs=model->BJTtype*(
|
||||
vsub=model->BJTtype*model->BJTsubs*(
|
||||
*(ckt->CKTrhsOld+here->BJTsubstNode)-
|
||||
*(ckt->CKTrhsOld+here->BJTcolPrimeNode));
|
||||
*(ckt->CKTrhsOld+here->BJTsubstConNode));
|
||||
}
|
||||
if(ckt->CKTsenInfo->SENmode == ACSEN){
|
||||
vbx=model->BJTtype*(
|
||||
*(ckt->CKTrhsOp+here->BJTbaseNode)-
|
||||
*(ckt->CKTrhsOp+here->BJTcolPrimeNode));
|
||||
vcs=model->BJTtype*(
|
||||
vsub=model->BJTtype*model->BJTsubs*(
|
||||
*(ckt->CKTrhsOp+here->BJTsubstNode)-
|
||||
*(ckt->CKTrhsOp+here->BJTcolPrimeNode));
|
||||
*(ckt->CKTrhsOp+here->BJTsubstConNode));
|
||||
}
|
||||
}
|
||||
goto next1;
|
||||
|
|
@ -227,21 +237,21 @@ BJTload(GENmodel *inModel, CKTcircuit *ckt)
|
|||
vbx=model->BJTtype*(
|
||||
*(ckt->CKTrhsOld+here->BJTbaseNode)-
|
||||
*(ckt->CKTrhsOld+here->BJTcolPrimeNode));
|
||||
vcs=model->BJTtype*(
|
||||
vsub=model->BJTtype*model->BJTsubs*(
|
||||
*(ckt->CKTrhsOld+here->BJTsubstNode)-
|
||||
*(ckt->CKTrhsOld+here->BJTcolPrimeNode));
|
||||
*(ckt->CKTrhsOld+here->BJTsubstConNode));
|
||||
} else if(ckt->CKTmode & MODEINITTRAN) {
|
||||
vbe = *(ckt->CKTstate1 + here->BJTvbe);
|
||||
vbc = *(ckt->CKTstate1 + here->BJTvbc);
|
||||
vbx=model->BJTtype*(
|
||||
*(ckt->CKTrhsOld+here->BJTbaseNode)-
|
||||
*(ckt->CKTrhsOld+here->BJTcolPrimeNode));
|
||||
vcs=model->BJTtype*(
|
||||
vsub=model->BJTtype*model->BJTsubs*(
|
||||
*(ckt->CKTrhsOld+here->BJTsubstNode)-
|
||||
*(ckt->CKTrhsOld+here->BJTcolPrimeNode));
|
||||
*(ckt->CKTrhsOld+here->BJTsubstConNode));
|
||||
if( (ckt->CKTmode & MODETRAN) && (ckt->CKTmode & MODEUIC) ) {
|
||||
vbx=model->BJTtype*(here->BJTicVBE-here->BJTicVCE);
|
||||
vcs=0;
|
||||
vsub=0;
|
||||
}
|
||||
} else if((ckt->CKTmode & MODEINITJCT) &&
|
||||
(ckt->CKTmode & MODETRANOP) && (ckt->CKTmode & MODEUIC)){
|
||||
|
|
@ -249,18 +259,18 @@ BJTload(GENmodel *inModel, CKTcircuit *ckt)
|
|||
vce=model->BJTtype*here->BJTicVCE;
|
||||
vbc=vbe-vce;
|
||||
vbx=vbc;
|
||||
vcs=0;
|
||||
vsub=0;
|
||||
} else if((ckt->CKTmode & MODEINITJCT) && (here->BJToff==0)) {
|
||||
vbe=here->BJTtVcrit;
|
||||
vbc=0;
|
||||
/* ERROR: need to initialize VCS, VBX here */
|
||||
vcs=vbx=0;
|
||||
/* ERROR: need to initialize VSUB, VBX here */
|
||||
vsub=vbx=0;
|
||||
} else if((ckt->CKTmode & MODEINITJCT) ||
|
||||
( (ckt->CKTmode & MODEINITFIX) && (here->BJToff!=0))) {
|
||||
vbe=0;
|
||||
vbc=0;
|
||||
/* ERROR: need to initialize VCS, VBX here */
|
||||
vcs=vbx=0;
|
||||
/* ERROR: need to initialize VSUB, VBX here */
|
||||
vsub=vbx=0;
|
||||
} else {
|
||||
#ifndef PREDICTOR
|
||||
if(ckt->CKTmode & MODEINITPRED) {
|
||||
|
|
@ -287,6 +297,10 @@ BJTload(GENmodel *inModel, CKTcircuit *ckt)
|
|||
*(ckt->CKTstate1 + here->BJTgo);
|
||||
*(ckt->CKTstate0 + here->BJTgx) =
|
||||
*(ckt->CKTstate1 + here->BJTgx);
|
||||
*(ckt->CKTstate0 + here->BJTvsub) =
|
||||
*(ckt->CKTstate1 + here->BJTvsub);
|
||||
vsub = (1+xfact)**(ckt->CKTstate1 + here->BJTvsub)-
|
||||
xfact* *(ckt->CKTstate2 + here->BJTvsub);
|
||||
} else {
|
||||
#endif /* PREDICTOR */
|
||||
/*
|
||||
|
|
@ -298,6 +312,9 @@ BJTload(GENmodel *inModel, CKTcircuit *ckt)
|
|||
vbc=model->BJTtype*(
|
||||
*(ckt->CKTrhsOld+here->BJTbasePrimeNode)-
|
||||
*(ckt->CKTrhsOld+here->BJTcolPrimeNode));
|
||||
vsub=model->BJTtype*model->BJTsubs*(
|
||||
*(ckt->CKTrhsOld+here->BJTsubstNode)-
|
||||
*(ckt->CKTrhsOld+here->BJTsubstConNode));
|
||||
#ifndef PREDICTOR
|
||||
}
|
||||
#endif /* PREDICTOR */
|
||||
|
|
@ -306,9 +323,9 @@ BJTload(GENmodel *inModel, CKTcircuit *ckt)
|
|||
vbx=model->BJTtype*(
|
||||
*(ckt->CKTrhsOld+here->BJTbaseNode)-
|
||||
*(ckt->CKTrhsOld+here->BJTcolPrimeNode));
|
||||
vcs=model->BJTtype*(
|
||||
vsub=model->BJTtype*model->BJTsubs*(
|
||||
*(ckt->CKTrhsOld+here->BJTsubstNode)-
|
||||
*(ckt->CKTrhsOld+here->BJTcolPrimeNode));
|
||||
*(ckt->CKTrhsOld+here->BJTsubstConNode));
|
||||
cchat= *(ckt->CKTstate0 + here->BJTcc)+(*(ckt->CKTstate0 +
|
||||
here->BJTgm)+ *(ckt->CKTstate0 + here->BJTgo))*delvbe-
|
||||
(*(ckt->CKTstate0 + here->BJTgo)+*(ckt->CKTstate0 +
|
||||
|
|
@ -353,8 +370,11 @@ BJTload(GENmodel *inModel, CKTcircuit *ckt)
|
|||
go = *(ckt->CKTstate0 + here->BJTgo);
|
||||
gx = *(ckt->CKTstate0 + here->BJTgx);
|
||||
geqcb = *(ckt->CKTstate0 + here->BJTgeqcb);
|
||||
gccs = *(ckt->CKTstate0 + here->BJTgccs);
|
||||
gcsub = *(ckt->CKTstate0 + here->BJTgcsub);
|
||||
geqbx = *(ckt->CKTstate0 + here->BJTgeqbx);
|
||||
vsub = *(ckt->CKTstate0 + here->BJTvsub);
|
||||
gdsub = *(ckt->CKTstate0 + here->BJTgdsub);
|
||||
cdsub = *(ckt->CKTstate0 + here->BJTcdsub);
|
||||
goto load;
|
||||
}
|
||||
#endif /*NOBYPASS*/
|
||||
|
|
@ -366,12 +386,14 @@ BJTload(GENmodel *inModel, CKTcircuit *ckt)
|
|||
here->BJTtVcrit,&icheck);
|
||||
vbc = DEVpnjlim(vbc,*(ckt->CKTstate0 + here->BJTvbc),vt,
|
||||
here->BJTtVcrit,&ichk1);
|
||||
vsub = DEVpnjlim(vsub,*(ckt->CKTstate0 + here->BJTvsub),vt,
|
||||
here->BJTtSubVcrit,&ichk1);
|
||||
if (ichk1 == 1) icheck=1;
|
||||
}
|
||||
/*
|
||||
* determine dc current and derivitives
|
||||
*/
|
||||
next1: vtn=vt*model->BJTemissionCoeffF;
|
||||
next1: vtn=vt*here->BJTtemissionCoeffF;
|
||||
|
||||
if(vbe >= -3*vtn){
|
||||
evbe=exp(vbe/vtn);
|
||||
|
|
@ -401,9 +423,9 @@ next1: vtn=vt*model->BJTemissionCoeffF;
|
|||
gben+=ckt->CKTgmin;
|
||||
cben+=ckt->CKTgmin*vbe;
|
||||
|
||||
vtn=vt*model->BJTemissionCoeffR;
|
||||
vtn=vt*here->BJTtemissionCoeffR;
|
||||
|
||||
if(vbc >= -3*vtn) {
|
||||
if(vbc >= -3*vtn) {
|
||||
evbc=exp(vbc/vtn);
|
||||
cbc=csat*(evbc-1);
|
||||
gbc=csat*evbc/vtn;
|
||||
|
|
@ -431,6 +453,18 @@ next1: vtn=vt*model->BJTemissionCoeffF;
|
|||
gbcn+=ckt->CKTgmin;
|
||||
cbcn+=ckt->CKTgmin*vbc;
|
||||
|
||||
vts=vt*here->BJTtemissionCoeffS;
|
||||
|
||||
if(vsub <= -3*vts) {
|
||||
arg=3*vts/(vsub*CONSTe);
|
||||
arg = arg * arg * arg;
|
||||
gdsub = csubsat*3*arg/vsub+ckt->CKTgmin;
|
||||
cdsub = -csubsat*(1+arg)+ckt->CKTgmin*vsub;
|
||||
} else {
|
||||
evsub = exp(MIN(MAX_EXP_ARG,vsub/vts));
|
||||
gdsub = csubsat*evsub/vts + ckt->CKTgmin;
|
||||
cdsub = csubsat*(evsub-1) + ckt->CKTgmin*vsub;
|
||||
}
|
||||
/*
|
||||
* determine base charge terms
|
||||
*/
|
||||
|
|
@ -503,15 +537,21 @@ next1: vtn=vt*model->BJTemissionCoeffF;
|
|||
pe=here->BJTtBEpot;
|
||||
xme=here->BJTtjunctionExpBE;
|
||||
cdis=model->BJTbaseFractionBCcap;
|
||||
ctot=here->BJTtBCcap*here->BJTarea;
|
||||
if (model->BJTsubs == VERTICAL)
|
||||
ctot=here->BJTtBCcap*here->BJTareab;
|
||||
else
|
||||
ctot=here->BJTtBCcap*here->BJTareac;
|
||||
czbc=ctot*cdis;
|
||||
czbx=ctot-czbc;
|
||||
pc=here->BJTtBCpot;
|
||||
xmc=here->BJTtjunctionExpBC;
|
||||
fcpe=here->BJTtDepCap;
|
||||
czcs=model->BJTcapCS*here->BJTareac;
|
||||
ps=model->BJTpotentialSubstrate;
|
||||
xms=model->BJTexponentialSubstrate;
|
||||
if (model->BJTsubs == VERTICAL)
|
||||
czsub=here->BJTtSubcap*here->BJTareac;
|
||||
else
|
||||
czsub=here->BJTtSubcap*here->BJTareab;
|
||||
ps=here->BJTtSubpot;
|
||||
xms=here->BJTtjunctionExpSub;
|
||||
xtf=model->BJTtransitTimeBiasCoeffF;
|
||||
ovtf=model->BJTtransitTimeVBCFactor;
|
||||
xjtf=here->BJTttransitTimeHighCurrentF*here->BJTarea;
|
||||
|
|
@ -579,21 +619,21 @@ next1: vtn=vt*model->BJTemissionCoeffF;
|
|||
(f3*(vbx-fcpc)+(xmc/(pc+pc))*(vbx*vbx-fcpc*fcpc));
|
||||
capbx=czbxf2*(f3+xmc*vbx/pc);
|
||||
}
|
||||
if(vcs < 0){
|
||||
arg=1-vcs/ps;
|
||||
if(vsub < 0){
|
||||
arg=1-vsub/ps;
|
||||
sarg=exp(-xms*log(arg));
|
||||
*(ckt->CKTstate0 + here->BJTqcs) = ps*czcs*(1-arg*sarg)/
|
||||
*(ckt->CKTstate0 + here->BJTqsub) = ps*czsub*(1-arg*sarg)/
|
||||
(1-xms);
|
||||
capcs=czcs*sarg;
|
||||
capsub=czsub*sarg;
|
||||
} else {
|
||||
*(ckt->CKTstate0 + here->BJTqcs) = vcs*czcs*(1+xms*vcs/
|
||||
*(ckt->CKTstate0 + here->BJTqsub) = vsub*czsub*(1+xms*vsub/
|
||||
(2*ps));
|
||||
capcs=czcs*(1+xms*vcs/ps);
|
||||
}
|
||||
here->BJTcapbe = capbe;
|
||||
here->BJTcapbc = capbc;
|
||||
here->BJTcapcs = capcs;
|
||||
here->BJTcapbx = capbx;
|
||||
capsub=czsub*(1+xms*vsub/ps);
|
||||
}
|
||||
here->BJTcapbe = capbe;
|
||||
here->BJTcapbc = capbc;
|
||||
here->BJTcapsub = capsub;
|
||||
here->BJTcapbx = capbx;
|
||||
|
||||
/*
|
||||
* store small-signal parameters
|
||||
|
|
@ -603,7 +643,7 @@ next1: vtn=vt*model->BJTemissionCoeffF;
|
|||
if(ckt->CKTmode & MODEINITSMSIG) {
|
||||
*(ckt->CKTstate0 + here->BJTcqbe) = capbe;
|
||||
*(ckt->CKTstate0 + here->BJTcqbc) = capbc;
|
||||
*(ckt->CKTstate0 + here->BJTcqcs) = capcs;
|
||||
*(ckt->CKTstate0 + here->BJTcqsub) = capsub;
|
||||
*(ckt->CKTstate0 + here->BJTcqbx) = capbx;
|
||||
*(ckt->CKTstate0 + here->BJTcexbc) = geqcb;
|
||||
if(SenCond){
|
||||
|
|
@ -614,17 +654,17 @@ next1: vtn=vt*model->BJTemissionCoeffF;
|
|||
*(ckt->CKTstate0 + here->BJTgm) = gm;
|
||||
*(ckt->CKTstate0 + here->BJTgo) = go;
|
||||
*(ckt->CKTstate0 + here->BJTgx) = gx;
|
||||
*(ckt->CKTstate0 + here->BJTgccs) = gccs;
|
||||
*(ckt->CKTstate0 + here->BJTgcsub) = gcsub;
|
||||
*(ckt->CKTstate0 + here->BJTgeqbx) = geqbx;
|
||||
}
|
||||
#ifdef SENSDEBUG
|
||||
printf("storing small signal parameters for op\n");
|
||||
printf("capbe = %.7e ,capbc = %.7e\n",capbe,capbc);
|
||||
printf("capcs = %.7e ,capbx = %.7e\n",capcs,capbx);
|
||||
printf("capsub = %.7e ,capbx = %.7e\n",capsub,capbx);
|
||||
printf("geqcb = %.7e ,gpi = %.7e\n",geqcb,gpi);
|
||||
printf("gmu = %.7e ,gm = %.7e\n",gmu,gm);
|
||||
printf("go = %.7e ,gx = %.7e\n",go,gx);
|
||||
printf("gccs = %.7e ,geqbx = %.7e\n",gccs,geqbx);
|
||||
printf("gcsub = %.7e ,geqbx = %.7e\n",gcsub,geqbx);
|
||||
printf("cc = %.7e ,cb = %.7e\n",cc,cb);
|
||||
#endif /* SENSDEBUG */
|
||||
continue; /* go to 1000 */
|
||||
|
|
@ -646,8 +686,8 @@ next1: vtn=vt*model->BJTemissionCoeffF;
|
|||
*(ckt->CKTstate0 + here->BJTqbc) ;
|
||||
*(ckt->CKTstate1 + here->BJTqbx) =
|
||||
*(ckt->CKTstate0 + here->BJTqbx) ;
|
||||
*(ckt->CKTstate1 + here->BJTqcs) =
|
||||
*(ckt->CKTstate0 + here->BJTqcs) ;
|
||||
*(ckt->CKTstate1 + here->BJTqsub) =
|
||||
*(ckt->CKTstate0 + here->BJTqsub) ;
|
||||
}
|
||||
error = NIintegrate(ckt,&geq,&ceq,capbe,here->BJTqbe);
|
||||
if(error) return(error);
|
||||
|
|
@ -676,7 +716,7 @@ next1: vtn=vt*model->BJTemissionCoeffF;
|
|||
if ( (!(ckt->CKTmode & MODEINITFIX))||(!(here->BJToff))) {
|
||||
if (icheck == 1) {
|
||||
ckt->CKTnoncon++;
|
||||
ckt->CKTtroubleElt = (GENinstance *) here;
|
||||
ckt->CKTtroubleElt = (GENinstance *) here;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -684,15 +724,15 @@ next1: vtn=vt*model->BJTemissionCoeffF;
|
|||
* charge storage for c-s and b-x junctions
|
||||
*/
|
||||
if(ckt->CKTmode & (MODETRAN | MODEAC)) {
|
||||
error = NIintegrate(ckt,&gccs,&ceq,capcs,here->BJTqcs);
|
||||
error = NIintegrate(ckt,&gcsub,&ceq,capsub,here->BJTqsub);
|
||||
if(error) return(error);
|
||||
error = NIintegrate(ckt,&geqbx,&ceq,capbx,here->BJTqbx);
|
||||
if(error) return(error);
|
||||
if(ckt->CKTmode & MODEINITTRAN) {
|
||||
*(ckt->CKTstate1 + here->BJTcqbx) =
|
||||
*(ckt->CKTstate0 + here->BJTcqbx);
|
||||
*(ckt->CKTstate1 + here->BJTcqcs) =
|
||||
*(ckt->CKTstate0 + here->BJTcqcs);
|
||||
*(ckt->CKTstate1 + here->BJTcqsub) =
|
||||
*(ckt->CKTstate0 + here->BJTcqsub);
|
||||
}
|
||||
}
|
||||
next2:
|
||||
|
|
@ -706,8 +746,11 @@ next2:
|
|||
*(ckt->CKTstate0 + here->BJTgo) = go;
|
||||
*(ckt->CKTstate0 + here->BJTgx) = gx;
|
||||
*(ckt->CKTstate0 + here->BJTgeqcb) = geqcb;
|
||||
*(ckt->CKTstate0 + here->BJTgccs) = gccs;
|
||||
*(ckt->CKTstate0 + here->BJTgcsub) = gcsub;
|
||||
*(ckt->CKTstate0 + here->BJTgeqbx) = geqbx;
|
||||
*(ckt->CKTstate0 + here->BJTvsub) = vsub;
|
||||
*(ckt->CKTstate0 + here->BJTgdsub) = gdsub;
|
||||
*(ckt->CKTstate0 + here->BJTcdsub) = cdsub;
|
||||
|
||||
/* Do not load the Jacobian and the rhs if
|
||||
perturbation is being carried out */
|
||||
|
|
@ -717,10 +760,11 @@ next2:
|
|||
load:
|
||||
#endif
|
||||
/*
|
||||
* load current excitation vector
|
||||
*/
|
||||
ceqcs=model->BJTtype * (*(ckt->CKTstate0 + here->BJTcqcs) -
|
||||
vcs * gccs);
|
||||
* load current excitation vector
|
||||
*/
|
||||
geqsub = gcsub + gdsub;
|
||||
ceqsub=model->BJTtype * model->BJTsubs *
|
||||
(*(ckt->CKTstate0 + here->BJTcqsub) + cdsub - vsub * geqsub);
|
||||
ceqbx=model->BJTtype * (*(ckt->CKTstate0 + here->BJTcqbx) -
|
||||
vbx * geqbx);
|
||||
ceqbe=model->BJTtype * (cc + cb - vbe * (gm + go + gpi) + vbc *
|
||||
|
|
@ -729,18 +773,20 @@ load:
|
|||
|
||||
*(ckt->CKTrhs + here->BJTbaseNode) += m * (-ceqbx);
|
||||
*(ckt->CKTrhs + here->BJTcolPrimeNode) +=
|
||||
m * (ceqcs+ceqbx+ceqbc);
|
||||
m * (ceqbx+ceqbc);
|
||||
*(ckt->CKTrhs + here->BJTsubstConNode) += m * ceqsub;
|
||||
*(ckt->CKTrhs + here->BJTbasePrimeNode) +=
|
||||
m * (-ceqbe-ceqbc);
|
||||
*(ckt->CKTrhs + here->BJTemitPrimeNode) += m * (ceqbe);
|
||||
*(ckt->CKTrhs + here->BJTsubstNode) += m * (-ceqcs);
|
||||
*(ckt->CKTrhs + here->BJTsubstNode) += m * (-ceqsub);
|
||||
/*
|
||||
* load y matrix
|
||||
*/
|
||||
*(here->BJTcolColPtr) += m * (gcpr);
|
||||
*(here->BJTbaseBasePtr) += m * (gx+geqbx);
|
||||
*(here->BJTemitEmitPtr) += m * (gepr);
|
||||
*(here->BJTcolPrimeColPrimePtr) += m * (gmu+go+gcpr+gccs+geqbx);
|
||||
*(here->BJTcolPrimeColPrimePtr) += m * (gmu+go+gcpr+geqbx);
|
||||
*(here->BJTsubstConSubstConPtr) += m * (geqsub);
|
||||
*(here->BJTbasePrimeBasePrimePtr) += m * (gx +gpi+gmu+geqcb);
|
||||
*(here->BJTemitPrimeEmitPrimePtr) += m * (gpi+gepr+gm+go);
|
||||
*(here->BJTcolColPrimePtr) += m * (-gcpr);
|
||||
|
|
@ -755,9 +801,9 @@ load:
|
|||
*(here->BJTemitPrimeEmitPtr) += m * (-gepr);
|
||||
*(here->BJTemitPrimeColPrimePtr) += m * (-go+geqcb);
|
||||
*(here->BJTemitPrimeBasePrimePtr) += m * (-gpi-gm-geqcb);
|
||||
*(here->BJTsubstSubstPtr) += m * (gccs);
|
||||
*(here->BJTcolPrimeSubstPtr) += m * (-gccs);
|
||||
*(here->BJTsubstColPrimePtr) += m * (-gccs);
|
||||
*(here->BJTsubstSubstPtr) += m * (geqsub);
|
||||
*(here->BJTsubstConSubstPtr) += m * (-geqsub);
|
||||
*(here->BJTsubstSubstConPtr) += m * (-geqsub);
|
||||
*(here->BJTbaseColPrimePtr) += m * (-geqbx);
|
||||
*(here->BJTcolPrimeBasePtr) += m * (-geqbx);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -24,6 +24,18 @@ BJTmAsk(CKTcircuit *ckt, GENmodel *instPtr, int which, IFvalue *value)
|
|||
NG_IGNORE(ckt);
|
||||
|
||||
switch(which) {
|
||||
case BJT_MOD_TYPE:
|
||||
if (here->BJTtype == NPN)
|
||||
value->sValue = "npn";
|
||||
else
|
||||
value->sValue = "pnp";
|
||||
return(OK);
|
||||
case BJT_MOD_SUBS:
|
||||
if (here->BJTsubs == LATERAL)
|
||||
value->sValue = "Lateral";
|
||||
else
|
||||
value->sValue = "Vertical";
|
||||
return(OK);
|
||||
case BJT_MOD_TNOM:
|
||||
value->rValue = here->BJTtnom-CONSTCtoK;
|
||||
return(OK);
|
||||
|
|
@ -127,7 +139,7 @@ BJTmAsk(CKTcircuit *ckt, GENmodel *instPtr, int which, IFvalue *value)
|
|||
value->rValue = here->BJTtransitTimeR;
|
||||
return(OK);
|
||||
case BJT_MOD_CJS:
|
||||
value->rValue = here->BJTcapCS;
|
||||
value->rValue = here->BJTcapSub;
|
||||
return(OK);
|
||||
case BJT_MOD_VJS:
|
||||
value->rValue = here->BJTpotentialSubstrate;
|
||||
|
|
@ -147,6 +159,18 @@ BJTmAsk(CKTcircuit *ckt, GENmodel *instPtr, int which, IFvalue *value)
|
|||
case BJT_MOD_FC:
|
||||
value->rValue = here->BJTdepletionCapCoeff;
|
||||
return(OK);
|
||||
case BJT_MOD_KF:
|
||||
if (here->BJTfNcoefGiven)
|
||||
value->rValue = here->BJTfNcoef;
|
||||
else
|
||||
value->rValue = 0.0;
|
||||
return(OK);
|
||||
case BJT_MOD_AF:
|
||||
if (here->BJTfNexpGiven)
|
||||
value->rValue = here->BJTfNexp;
|
||||
else
|
||||
value->rValue = 0.0;
|
||||
return(OK);
|
||||
case BJT_MOD_INVEARLYF:
|
||||
value->rValue = here->BJTinvEarlyVoltF;
|
||||
return(OK);
|
||||
|
|
@ -171,6 +195,12 @@ BJTmAsk(CKTcircuit *ckt, GENmodel *instPtr, int which, IFvalue *value)
|
|||
case BJT_MOD_EXCESSPHASEFACTOR:
|
||||
value->rValue = here->BJTexcessPhaseFactor;
|
||||
return(OK);
|
||||
case BJT_MOD_ISS:
|
||||
value->rValue = here->BJTsubSatCur;
|
||||
return(OK);
|
||||
case BJT_MOD_NS:
|
||||
value->rValue = here->BJTemissionCoeffS;
|
||||
return(OK);
|
||||
case BJT_MOD_TLEV:
|
||||
value->iValue = here->BJTtlev;
|
||||
return(OK);
|
||||
|
|
@ -285,23 +315,47 @@ BJTmAsk(CKTcircuit *ckt, GENmodel *instPtr, int which, IFvalue *value)
|
|||
case BJT_MOD_TVJS:
|
||||
value->rValue = here->BJTtvjs;
|
||||
return(OK);
|
||||
case BJT_MOD_KF:
|
||||
if (here->BJTfNcoefGiven)
|
||||
value->rValue = here->BJTfNcoef;
|
||||
else
|
||||
value->rValue = 0.0;
|
||||
case BJT_MOD_TITF1:
|
||||
value->rValue = here->BJTtitf1;
|
||||
return(OK);
|
||||
case BJT_MOD_AF:
|
||||
if (here->BJTfNexpGiven)
|
||||
value->rValue = here->BJTfNexp;
|
||||
else
|
||||
value->rValue = 0.0;
|
||||
case BJT_MOD_TITF2:
|
||||
value->rValue = here->BJTtitf2;
|
||||
return(OK);
|
||||
case BJT_MOD_TYPE:
|
||||
if (here->BJTtype == NPN)
|
||||
value->sValue = "npn";
|
||||
else
|
||||
value->sValue = "pnp";
|
||||
case BJT_MOD_TTF1:
|
||||
value->rValue = here->BJTttf1;
|
||||
return(OK);
|
||||
case BJT_MOD_TTF2:
|
||||
value->rValue = here->BJTttf2;
|
||||
return(OK);
|
||||
case BJT_MOD_TTR1:
|
||||
value->rValue = here->BJTttr1;
|
||||
return(OK);
|
||||
case BJT_MOD_TTR2:
|
||||
value->rValue = here->BJTttr2;
|
||||
return(OK);
|
||||
case BJT_MOD_TMJE1:
|
||||
value->rValue = here->BJTtmje1;
|
||||
return(OK);
|
||||
case BJT_MOD_TMJE2:
|
||||
value->rValue = here->BJTtmje2;
|
||||
return(OK);
|
||||
case BJT_MOD_TMJC1:
|
||||
value->rValue = here->BJTtmjc1;
|
||||
return(OK);
|
||||
case BJT_MOD_TMJC2:
|
||||
value->rValue = here->BJTtmjc2;
|
||||
return(OK);
|
||||
case BJT_MOD_TMJS1:
|
||||
value->rValue = here->BJTtmjs1;
|
||||
return(OK);
|
||||
case BJT_MOD_TMJS2:
|
||||
value->rValue = here->BJTtmjs2;
|
||||
return(OK);
|
||||
case BJT_MOD_TNS1:
|
||||
value->rValue = here->BJTtns1;
|
||||
return(OK);
|
||||
case BJT_MOD_TNS2:
|
||||
value->rValue = here->BJTtns2;
|
||||
return(OK);
|
||||
default:
|
||||
return(E_BADPARM);
|
||||
|
|
|
|||
|
|
@ -34,6 +34,10 @@ BJTmParam(int param, IFvalue *value, GENmodel *inModel)
|
|||
mods->BJTtype = PNP;
|
||||
}
|
||||
break;
|
||||
case BJT_MOD_SUBS:
|
||||
mods->BJTsubs = value->iValue;
|
||||
mods->BJTsubsGiven = TRUE;
|
||||
break;
|
||||
case BJT_MOD_TNOM:
|
||||
mods->BJTtnom = value->rValue+CONSTCtoK;
|
||||
mods->BJTtnomGiven = TRUE;
|
||||
|
|
@ -171,8 +175,8 @@ BJTmParam(int param, IFvalue *value, GENmodel *inModel)
|
|||
mods->BJTtransitTimeRGiven = TRUE;
|
||||
break;
|
||||
case BJT_MOD_CJS:
|
||||
mods->BJTcapCS = value->rValue;
|
||||
mods->BJTcapCSGiven = TRUE;
|
||||
mods->BJTcapSub = value->rValue;
|
||||
mods->BJTcapSubGiven = TRUE;
|
||||
break;
|
||||
case BJT_MOD_VJS:
|
||||
mods->BJTpotentialSubstrate = value->rValue;
|
||||
|
|
@ -198,6 +202,22 @@ BJTmParam(int param, IFvalue *value, GENmodel *inModel)
|
|||
mods->BJTdepletionCapCoeff = value->rValue;
|
||||
mods->BJTdepletionCapCoeffGiven = TRUE;
|
||||
break;
|
||||
case BJT_MOD_KF:
|
||||
mods->BJTfNcoef = value->rValue;
|
||||
mods->BJTfNcoefGiven = TRUE;
|
||||
break;
|
||||
case BJT_MOD_AF:
|
||||
mods->BJTfNexp = value->rValue;
|
||||
mods->BJTfNexpGiven = TRUE;
|
||||
break;
|
||||
case BJT_MOD_ISS:
|
||||
mods->BJTsubSatCur = value->rValue;
|
||||
mods->BJTsubSatCurGiven = TRUE;
|
||||
break;
|
||||
case BJT_MOD_NS:
|
||||
mods->BJTemissionCoeffS = value->rValue;
|
||||
mods->BJTemissionCoeffSGiven = TRUE;
|
||||
break;
|
||||
case BJT_MOD_TLEV:
|
||||
mods->BJTtlev = value->iValue;
|
||||
mods->BJTtlevGiven = TRUE;
|
||||
|
|
@ -350,13 +370,61 @@ BJTmParam(int param, IFvalue *value, GENmodel *inModel)
|
|||
mods->BJTtvjs = value->rValue;
|
||||
mods->BJTtvjsGiven = TRUE;
|
||||
break;
|
||||
case BJT_MOD_KF:
|
||||
mods->BJTfNcoef = value->rValue;
|
||||
mods->BJTfNcoefGiven = TRUE;
|
||||
case BJT_MOD_TITF1:
|
||||
mods->BJTtitf1 = value->rValue;
|
||||
mods->BJTtitf1Given = TRUE;
|
||||
break;
|
||||
case BJT_MOD_AF:
|
||||
mods->BJTfNexp = value->rValue;
|
||||
mods->BJTfNexpGiven = TRUE;
|
||||
case BJT_MOD_TITF2:
|
||||
mods->BJTtitf2 = value->rValue;
|
||||
mods->BJTtitf2Given = TRUE;
|
||||
break;
|
||||
case BJT_MOD_TTF1:
|
||||
mods->BJTttf1 = value->rValue;
|
||||
mods->BJTttf1Given = TRUE;
|
||||
break;
|
||||
case BJT_MOD_TTF2:
|
||||
mods->BJTttf2 = value->rValue;
|
||||
mods->BJTttf2Given = TRUE;
|
||||
break;
|
||||
case BJT_MOD_TTR1:
|
||||
mods->BJTttr1 = value->rValue;
|
||||
mods->BJTttr1Given = TRUE;
|
||||
break;
|
||||
case BJT_MOD_TTR2:
|
||||
mods->BJTttr2 = value->rValue;
|
||||
mods->BJTttr2Given = TRUE;
|
||||
break;
|
||||
case BJT_MOD_TMJE1:
|
||||
mods->BJTtmje1 = value->rValue;
|
||||
mods->BJTtmje1Given = TRUE;
|
||||
break;
|
||||
case BJT_MOD_TMJE2:
|
||||
mods->BJTtmje2 = value->rValue;
|
||||
mods->BJTtmje2Given = TRUE;
|
||||
break;
|
||||
case BJT_MOD_TMJC1:
|
||||
mods->BJTtmjc1 = value->rValue;
|
||||
mods->BJTtmjc1Given = TRUE;
|
||||
break;
|
||||
case BJT_MOD_TMJC2:
|
||||
mods->BJTtmjc2 = value->rValue;
|
||||
mods->BJTtmjc2Given = TRUE;
|
||||
break;
|
||||
case BJT_MOD_TMJS1:
|
||||
mods->BJTtmjs1 = value->rValue;
|
||||
mods->BJTtmjs1Given = TRUE;
|
||||
break;
|
||||
case BJT_MOD_TMJS2:
|
||||
mods->BJTtmjs2 = value->rValue;
|
||||
mods->BJTtmjs2Given = TRUE;
|
||||
break;
|
||||
case BJT_MOD_TNS1:
|
||||
mods->BJTtns1 = value->rValue;
|
||||
mods->BJTtns1Given = TRUE;
|
||||
break;
|
||||
case BJT_MOD_TNS2:
|
||||
mods->BJTtns2 = value->rValue;
|
||||
mods->BJTtns2Given = TRUE;
|
||||
break;
|
||||
default:
|
||||
return(E_BADPARM);
|
||||
|
|
|
|||
|
|
@ -165,11 +165,11 @@ BJTsAcLoad(GENmodel *inModel, CKTcircuit *ckt)
|
|||
*(here->BJTsenCpi)= *(ckt->CKTstate0 + here->BJTcqbe);
|
||||
*(here->BJTsenCmu)= *(ckt->CKTstate0 + here->BJTcqbc);
|
||||
*(here->BJTsenCbx)= *(ckt->CKTstate0 + here->BJTcqbx);
|
||||
*(here->BJTsenCcs)= *(ckt->CKTstate0 + here->BJTcqcs);
|
||||
*(here->BJTsenCsub)= *(ckt->CKTstate0 + here->BJTcqsub);
|
||||
*(here->BJTsenCmcb)= *(ckt->CKTstate0 + here->BJTcexbc);
|
||||
}
|
||||
gcpr = model->BJTcollectorConduct * A0;
|
||||
gepr = model->BJTemitterConduct * A0;
|
||||
gcpr = here->BJTtcollectorConduct * A0;
|
||||
gepr = here->BJTtemitterConduct * A0;
|
||||
gpi= *(here->BJTsenGpi);
|
||||
gmu= *(here->BJTsenGmu);
|
||||
gm= *(here->BJTsenGm);
|
||||
|
|
@ -186,7 +186,7 @@ BJTsAcLoad(GENmodel *inModel, CKTcircuit *ckt)
|
|||
xcpi= *(here->BJTsenCpi) * ckt->CKTomega;
|
||||
xcmu= *(here->BJTsenCmu) * ckt->CKTomega;
|
||||
xcbx= *(here->BJTsenCbx) * ckt->CKTomega;
|
||||
xccs= *(here->BJTsenCcs) * ckt->CKTomega;
|
||||
xccs= *(here->BJTsenCsub) * ckt->CKTomega;
|
||||
xcmcb= *(here->BJTsenCmcb) * ckt->CKTomega;
|
||||
|
||||
|
||||
|
|
@ -282,7 +282,7 @@ BJTsAcLoad(GENmodel *inModel, CKTcircuit *ckt)
|
|||
*(here->BJTsenCpi + 1)= *(ckt->CKTstate0 + here->BJTcqbe);
|
||||
*(here->BJTsenCmu + 1)= *(ckt->CKTstate0 + here->BJTcqbc);
|
||||
*(here->BJTsenCbx + 1)= *(ckt->CKTstate0 + here->BJTcqbx);
|
||||
*(here->BJTsenCcs + 1)= *(ckt->CKTstate0 + here->BJTcqcs);
|
||||
*(here->BJTsenCsub + 1)= *(ckt->CKTstate0 + here->BJTcqsub);
|
||||
*(here->BJTsenCmcb + 1)= *(ckt->CKTstate0 + here->BJTcexbc);
|
||||
}
|
||||
|
||||
|
|
@ -322,7 +322,7 @@ pertvbx: /* Perturbation of vbx */
|
|||
*(here->BJTsenCpi + 2)= *(ckt->CKTstate0 + here->BJTcqbe);
|
||||
*(here->BJTsenCmu + 2)= *(ckt->CKTstate0 + here->BJTcqbc);
|
||||
*(here->BJTsenCbx + 2)= *(ckt->CKTstate0 + here->BJTcqbx);
|
||||
*(here->BJTsenCcs + 2)= *(ckt->CKTstate0 + here->BJTcqcs);
|
||||
*(here->BJTsenCsub + 2)= *(ckt->CKTstate0 + here->BJTcqsub);
|
||||
*(here->BJTsenCmcb + 2)= *(ckt->CKTstate0 + here->BJTcexbc);
|
||||
}
|
||||
|
||||
|
|
@ -362,7 +362,7 @@ pertvbe: /* Perturbation of vbe */
|
|||
*(here->BJTsenCpi + 3)= *(ckt->CKTstate0 + here->BJTcqbe);
|
||||
*(here->BJTsenCmu + 3)= *(ckt->CKTstate0 + here->BJTcqbc);
|
||||
*(here->BJTsenCbx + 3)= *(ckt->CKTstate0 + here->BJTcqbx);
|
||||
*(here->BJTsenCcs + 3)= *(ckt->CKTstate0 + here->BJTcqcs);
|
||||
*(here->BJTsenCsub + 3)= *(ckt->CKTstate0 + here->BJTcqsub);
|
||||
*(here->BJTsenCmcb + 3)= *(ckt->CKTstate0 + here->BJTcexbc);
|
||||
}
|
||||
|
||||
|
|
@ -404,7 +404,7 @@ pertvbc: /* Perturbation of vbc */
|
|||
*(here->BJTsenCpi + 4)= *(ckt->CKTstate0 + here->BJTcqbe);
|
||||
*(here->BJTsenCmu + 4)= *(ckt->CKTstate0 + here->BJTcqbc);
|
||||
*(here->BJTsenCbx + 4)= *(ckt->CKTstate0 + here->BJTcqbx);
|
||||
*(here->BJTsenCcs + 4)= *(ckt->CKTstate0 + here->BJTcqcs);
|
||||
*(here->BJTsenCsub + 4)= *(ckt->CKTstate0 + here->BJTcqsub);
|
||||
*(here->BJTsenCmcb + 4)= *(ckt->CKTstate0 + here->BJTcexbc);
|
||||
|
||||
}
|
||||
|
|
@ -436,7 +436,7 @@ pertvcs: /* Perturbation of vcs */
|
|||
*/
|
||||
if ((error = BJTload((GENmodel*)model,ckt)) != 0)
|
||||
return(error);
|
||||
*(here->BJTsenCcs + 5)= *(ckt->CKTstate0 + here->BJTcqcs);
|
||||
*(here->BJTsenCsub + 5)= *(ckt->CKTstate0 + here->BJTcqsub);
|
||||
|
||||
}
|
||||
|
||||
|
|
@ -444,7 +444,7 @@ pertvcs: /* Perturbation of vcs */
|
|||
flag = 4;
|
||||
|
||||
*(ckt->CKTrhsOp + here->BJTsubstNode) -= DELA;
|
||||
xccs= *(here->BJTsenCcs + 5) * ckt->CKTomega;
|
||||
xccs= *(here->BJTsenCsub + 5) * ckt->CKTomega;
|
||||
|
||||
ccs=( -xccs * ivcs) ;
|
||||
iccs= xccs * vcs ;
|
||||
|
|
@ -465,8 +465,8 @@ pertvcs: /* Perturbation of vcs */
|
|||
goto next2;
|
||||
|
||||
load:
|
||||
gcpr=model->BJTcollectorConduct * here->BJTarea;
|
||||
gepr=model->BJTemitterConduct * here->BJTarea;
|
||||
gcpr=here->BJTtcollectorConduct * here->BJTarea;
|
||||
gepr=here->BJTtemitterConduct * here->BJTarea;
|
||||
gpi= *(here->BJTsenGpi + flag+1);
|
||||
gmu= *(here->BJTsenGmu + flag+1);
|
||||
gm= *(here->BJTsenGm + flag+1);
|
||||
|
|
@ -483,7 +483,7 @@ load:
|
|||
xcpi= *(here->BJTsenCpi + flag+1) * ckt->CKTomega;
|
||||
xcmu= *(here->BJTsenCmu + flag+1) * ckt->CKTomega;
|
||||
xcbx= *(here->BJTsenCbx + flag+1) * ckt->CKTomega;
|
||||
xccs= *(here->BJTsenCcs + flag+1) * ckt->CKTomega;
|
||||
xccs= *(here->BJTsenCsub + flag+1) * ckt->CKTomega;
|
||||
xcmcb= *(here->BJTsenCmcb + flag+1) * ckt->CKTomega;
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -37,6 +37,13 @@ BJTsetup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt, int *states)
|
|||
if(model->BJTtype != NPN && model->BJTtype != PNP) {
|
||||
model->BJTtype = NPN;
|
||||
}
|
||||
if(!model->BJTsubsGiven ||
|
||||
(model->BJTsubs != VERTICAL && model->BJTsubs != LATERAL)) {
|
||||
if (model->BJTtype == NPN)
|
||||
model->BJTsubs = VERTICAL; /* Vertical for NPN */
|
||||
else
|
||||
model->BJTsubs = LATERAL; /* Lateral for PNP */
|
||||
}
|
||||
if(!model->BJTsatCurGiven) {
|
||||
model->BJTsatCur = 1e-16;
|
||||
}
|
||||
|
|
@ -103,8 +110,8 @@ BJTsetup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt, int *states)
|
|||
if(!model->BJTtransitTimeRGiven) {
|
||||
model->BJTtransitTimeR = 0;
|
||||
}
|
||||
if(!model->BJTcapCSGiven) {
|
||||
model->BJTcapCS = 0;
|
||||
if(!model->BJTcapSubGiven) {
|
||||
model->BJTcapSub = 0;
|
||||
}
|
||||
if(!model->BJTpotentialSubstrateGiven) {
|
||||
model->BJTpotentialSubstrate = .75;
|
||||
|
|
@ -121,7 +128,18 @@ BJTsetup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt, int *states)
|
|||
if(!model->BJTtempExpISGiven) {
|
||||
model->BJTtempExpIS = 3;
|
||||
}
|
||||
|
||||
if(!model->BJTfNcoefGiven) {
|
||||
model->BJTfNcoef = 0;
|
||||
}
|
||||
if(!model->BJTfNexpGiven) {
|
||||
model->BJTfNexp = 1;
|
||||
}
|
||||
if(!model->BJTsubSatCurGiven) {
|
||||
model->BJTsubSatCur = 0.0;
|
||||
}
|
||||
if(!model->BJTemissionCoeffSGiven) {
|
||||
model->BJTemissionCoeffS = 1.0;
|
||||
}
|
||||
if(!model->BJTtlevGiven) {
|
||||
model->BJTtlev = 0;
|
||||
}
|
||||
|
|
@ -236,12 +254,47 @@ BJTsetup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt, int *states)
|
|||
if(!model->BJTtvjsGiven) {
|
||||
model->BJTtvjs = 0.0;
|
||||
}
|
||||
|
||||
if(!model->BJTfNcoefGiven) {
|
||||
model->BJTfNcoef = 0;
|
||||
if(!model->BJTtitf1Given) {
|
||||
model->BJTtitf1 = 0.0;
|
||||
}
|
||||
if(!model->BJTfNexpGiven) {
|
||||
model->BJTfNexp = 1;
|
||||
if(!model->BJTtitf2Given) {
|
||||
model->BJTtitf2 = 0.0;
|
||||
}
|
||||
if(!model->BJTttf1Given) {
|
||||
model->BJTttf1 = 0.0;
|
||||
}
|
||||
if(!model->BJTttf2Given) {
|
||||
model->BJTttf2 = 0.0;
|
||||
}
|
||||
if(!model->BJTttr1Given) {
|
||||
model->BJTttr1 = 0.0;
|
||||
}
|
||||
if(!model->BJTttr2Given) {
|
||||
model->BJTttr2 = 0.0;
|
||||
}
|
||||
if(!model->BJTtmje1Given) {
|
||||
model->BJTtmje1 = 0.0;
|
||||
}
|
||||
if(!model->BJTtmje2Given) {
|
||||
model->BJTtmje2 = 0.0;
|
||||
}
|
||||
if(!model->BJTtmjc1Given) {
|
||||
model->BJTtmjc1 = 0.0;
|
||||
}
|
||||
if(!model->BJTtmjc2Given) {
|
||||
model->BJTtmjc2 = 0.0;
|
||||
}
|
||||
if(!model->BJTtmjs1Given) {
|
||||
model->BJTtmjs1 = 0.0;
|
||||
}
|
||||
if(!model->BJTtmjs2Given) {
|
||||
model->BJTtmjs2 = 0.0;
|
||||
}
|
||||
if(!model->BJTtns1Given) {
|
||||
model->BJTtns1 = 0.0;
|
||||
}
|
||||
if(!model->BJTtns2Given) {
|
||||
model->BJTtns2 = 0.0;
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
@ -367,8 +420,15 @@ if((here->ptr = SMPmakeElt(matrix,here->first,here->second))==(double *)NULL){\
|
|||
TSTALLOC(BJTbasePrimeBasePrimePtr,BJTbasePrimeNode,BJTbasePrimeNode)
|
||||
TSTALLOC(BJTemitPrimeEmitPrimePtr,BJTemitPrimeNode,BJTemitPrimeNode)
|
||||
TSTALLOC(BJTsubstSubstPtr,BJTsubstNode,BJTsubstNode)
|
||||
TSTALLOC(BJTcolPrimeSubstPtr,BJTcolPrimeNode,BJTsubstNode)
|
||||
TSTALLOC(BJTsubstColPrimePtr,BJTsubstNode,BJTcolPrimeNode)
|
||||
if (model -> BJTsubs == LATERAL) {
|
||||
here -> BJTsubstConNode = here -> BJTbasePrimeNode;
|
||||
here -> BJTsubstConSubstConPtr = here -> BJTbasePrimeBasePrimePtr;
|
||||
} else {
|
||||
here -> BJTsubstConNode = here -> BJTcolPrimeNode;
|
||||
here -> BJTsubstConSubstConPtr = here -> BJTcolPrimeColPrimePtr;
|
||||
}
|
||||
TSTALLOC(BJTsubstConSubstPtr,BJTsubstConNode,BJTsubstNode)
|
||||
TSTALLOC(BJTsubstSubstConPtr,BJTsubstNode,BJTsubstConNode)
|
||||
TSTALLOC(BJTbaseColPrimePtr,BJTbaseNode,BJTcolPrimeNode)
|
||||
TSTALLOC(BJTcolPrimeBasePtr,BJTcolPrimeNode,BJTbaseNode)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -111,7 +111,7 @@ BJTsLoad(GENmodel *inModel, CKTcircuit *ckt)
|
|||
*(SaveState0 + 22) = *(ckt->CKTstate2 + here->BJTcexbc);
|
||||
*(SaveState0 + 23) = here->BJTcapbe;
|
||||
*(SaveState0 + 24) = here->BJTcapbc;
|
||||
*(SaveState0 + 25) = here->BJTcapcs;
|
||||
*(SaveState0 + 25) = here->BJTcapsub;
|
||||
*(SaveState0 + 26) = here->BJTcapbx;
|
||||
|
||||
if(here->BJTsenParmNo == 0) goto next;
|
||||
|
|
@ -130,7 +130,7 @@ BJTsLoad(GENmodel *inModel, CKTcircuit *ckt)
|
|||
|
||||
qbe0 = *(ckt->CKTstate0 + here->BJTqbe);
|
||||
qbc0 = *(ckt->CKTstate0 + here->BJTqbc);
|
||||
qcs0 = *(ckt->CKTstate0 + here->BJTqcs);
|
||||
qcs0 = *(ckt->CKTstate0 + here->BJTqsub);
|
||||
qbx0 = *(ckt->CKTstate0 + here->BJTqbx);
|
||||
|
||||
/* perturbation of area */
|
||||
|
|
@ -153,7 +153,7 @@ BJTsLoad(GENmodel *inModel, CKTcircuit *ckt)
|
|||
|
||||
qbe = *(ckt->CKTstate0 + here->BJTqbe);
|
||||
qbc = *(ckt->CKTstate0 + here->BJTqbc);
|
||||
qcs = *(ckt->CKTstate0 + here->BJTqcs);
|
||||
qcs = *(ckt->CKTstate0 + here->BJTqsub);
|
||||
qbx = *(ckt->CKTstate0 + here->BJTqbx);
|
||||
|
||||
/* compute the gradients of currents */
|
||||
|
|
@ -182,7 +182,7 @@ BJTsLoad(GENmodel *inModel, CKTcircuit *ckt)
|
|||
|
||||
*(here->BJTdphibedp) = DqbeDp;
|
||||
*(here->BJTdphibcdp) = DqbcDp;
|
||||
*(here->BJTdphicsdp) = DqcsDp;
|
||||
*(here->BJTdphisubdp) = DqcsDp;
|
||||
*(here->BJTdphibxdp) = DqbxDp;
|
||||
|
||||
#ifdef SENSDEBUG
|
||||
|
|
@ -254,9 +254,9 @@ next:
|
|||
+ tag1 * *(ckt->CKTstate1 + here->BJTsensxpbc +
|
||||
8*(iparmno - 1) + 1);
|
||||
|
||||
Osxpcs = tag0 * *(ckt->CKTstate1 + here->BJTsensxpcs +
|
||||
Osxpcs = tag0 * *(ckt->CKTstate1 + here->BJTsensxpsub +
|
||||
8*(iparmno - 1))
|
||||
+ tag1 * *(ckt->CKTstate1 + here->BJTsensxpcs +
|
||||
+ tag1 * *(ckt->CKTstate1 + here->BJTsensxpsub +
|
||||
8*(iparmno - 1) + 1);
|
||||
|
||||
Osxpbx = tag0 * *(ckt->CKTstate1 + here->BJTsensxpbx +
|
||||
|
|
@ -318,7 +318,7 @@ restore:
|
|||
*(ckt->CKTstate1 + here->BJTcexbc) = *(SaveState0 + 21);
|
||||
here->BJTcapbe = *(SaveState0 + 23) ;
|
||||
here->BJTcapbc = *(SaveState0 + 24) ;
|
||||
here->BJTcapcs = *(SaveState0 + 25) ;
|
||||
here->BJTcapsub = *(SaveState0 + 25) ;
|
||||
here->BJTcapbx = *(SaveState0 + 26) ;
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -141,8 +141,8 @@ BJTtemp(GENmodel *inModel, CKTcircuit *ckt)
|
|||
here->BJTtemitterConduct = 0;
|
||||
}
|
||||
|
||||
here->BJTtminBaseResist = model->BJTminBaseResist*(1+model->BJTtrm1*dt+model->BJTtrm2*dt*dt);
|
||||
here->BJTtbaseResist = model->BJTbaseResist * (1+model->BJTtrb1*dt+model->BJTtrb2*dt*dt);
|
||||
here->BJTtminBaseResist = model->BJTminBaseResist*(1+model->BJTtrm1*dt+model->BJTtrm2*dt*dt);
|
||||
here->BJTtbaseCurrentHalfResist = model->BJTbaseCurrentHalfResist * (1+model->BJTtirb1*dt+model->BJTtirb2*dt*dt);
|
||||
here->BJTtemissionCoeffF = model->BJTemissionCoeffF * (1+model->BJTtnf1*dt+model->BJTtnf2*dt*dt);
|
||||
here->BJTtemissionCoeffR = model->BJTemissionCoeffR * (1+model->BJTtnr1*dt+model->BJTtnr2*dt*dt);
|
||||
|
|
@ -153,6 +153,8 @@ BJTtemp(GENmodel *inModel, CKTcircuit *ckt)
|
|||
here->BJTttransitTimeR = model->BJTtransitTimeR * (1+model->BJTttr1*dt+model->BJTttr2*dt*dt);
|
||||
here->BJTtjunctionExpBE = model->BJTjunctionExpBE * (1+model->BJTtmje1*dt+model->BJTtmje2*dt*dt);
|
||||
here->BJTtjunctionExpBC = model->BJTjunctionExpBC * (1+model->BJTtmjc1*dt+model->BJTtmjc2*dt*dt);
|
||||
here->BJTtjunctionExpSub = model->BJTexponentialSubstrate * (1+model->BJTtmjs1*dt+model->BJTtmjs2*dt*dt);
|
||||
here->BJTtemissionCoeffS = model->BJTemissionCoeffS * (1+model->BJTtns1*dt+model->BJTtns2*dt*dt);
|
||||
|
||||
vt = here->BJTtemp * CONSTKoverQ;
|
||||
fact2 = here->BJTtemp/REFTEMP;
|
||||
|
|
@ -168,6 +170,7 @@ BJTtemp(GENmodel *inModel, CKTcircuit *ckt)
|
|||
model->BJTtempExpIS*ratlog;
|
||||
factor = exp(factlog);
|
||||
here->BJTtSatCur = model->BJTsatCur * factor;
|
||||
here->BJTtSubSatCur = model->BJTsubSatCur * factor;
|
||||
|
||||
if (model->BJTtlev == 0) {
|
||||
bfactor = exp(ratlog*model->BJTbetaExp);
|
||||
|
|
@ -192,42 +195,57 @@ BJTtemp(GENmodel *inModel, CKTcircuit *ckt)
|
|||
pbo = (model->BJTpotentialBE-pbfact)/fact1;
|
||||
gmaold = (model->BJTpotentialBE-pbo)/pbo;
|
||||
here->BJTtBEcap = model->BJTdepletionCapBE/
|
||||
(1+model->BJTjunctionExpBE*
|
||||
(1+here->BJTtjunctionExpBE*
|
||||
(4e-4*(model->BJTtnom-REFTEMP)-gmaold));
|
||||
here->BJTtBEpot = fact2 * pbo+pbfact;
|
||||
gmanew = (here->BJTtBEpot-pbo)/pbo;
|
||||
here->BJTtBEcap *= 1+model->BJTjunctionExpBE*
|
||||
here->BJTtBEcap *= 1+here->BJTtjunctionExpBE*
|
||||
(4e-4*(here->BJTtemp-REFTEMP)-gmanew);
|
||||
} else if (model->BJTtlevc == 1) {
|
||||
here->BJTtBEcap = model->BJTdepletionCapBE*
|
||||
(1+model->BJTcte*dt);
|
||||
}
|
||||
|
||||
if (model->BJTtlevc == 0) {
|
||||
pbo = (model->BJTpotentialBC-pbfact)/fact1;
|
||||
gmaold = (model->BJTpotentialBC-pbo)/pbo;
|
||||
here->BJTtBCcap = model->BJTdepletionCapBC/
|
||||
(1+model->BJTjunctionExpBC*
|
||||
(1+here->BJTtjunctionExpBC*
|
||||
(4e-4*(model->BJTtnom-REFTEMP)-gmaold));
|
||||
here->BJTtBCpot = fact2 * pbo+pbfact;
|
||||
gmanew = (here->BJTtBCpot-pbo)/pbo;
|
||||
here->BJTtBCcap *= 1+model->BJTjunctionExpBC*
|
||||
here->BJTtBCcap *= 1+here->BJTtjunctionExpBC*
|
||||
(4e-4*(here->BJTtemp-REFTEMP)-gmanew);
|
||||
} else if (model->BJTtlevc == 1) {
|
||||
here->BJTtBCcap = model->BJTdepletionCapBC*
|
||||
(1+model->BJTctc*dt);
|
||||
}
|
||||
if (model->BJTtlevc == 0) {
|
||||
pbo = (model->BJTpotentialSubstrate-pbfact)/fact1;
|
||||
gmaold = (model->BJTpotentialSubstrate-pbo)/pbo;
|
||||
here->BJTtSubcap = model->BJTcapSub/
|
||||
(1+here->BJTtjunctionExpSub*
|
||||
(4e-4*(model->BJTtnom-REFTEMP)-gmaold));
|
||||
here->BJTtSubpot = fact2 * pbo+pbfact;
|
||||
gmanew = (here->BJTtSubpot-pbo)/pbo;
|
||||
here->BJTtSubcap *= 1+here->BJTtjunctionExpSub*
|
||||
(4e-4*(here->BJTtemp-REFTEMP)-gmanew);
|
||||
} else if (model->BJTtlevc == 1) {
|
||||
here->BJTtSubcap = model->BJTcapSub*
|
||||
(1+model->BJTcts*dt);
|
||||
}
|
||||
|
||||
here->BJTtDepCap = model->BJTdepletionCapCoeff * here->BJTtBEpot;
|
||||
here->BJTtf1 = here->BJTtBEpot * (1 - exp((1 -
|
||||
model->BJTjunctionExpBE) * xfc)) /
|
||||
(1 - model->BJTjunctionExpBE);
|
||||
here->BJTtjunctionExpBE) * xfc)) /
|
||||
(1 - here->BJTtjunctionExpBE);
|
||||
here->BJTtf4 = model->BJTdepletionCapCoeff * here->BJTtBCpot;
|
||||
here->BJTtf5 = here->BJTtBCpot * (1 - exp((1 -
|
||||
model->BJTjunctionExpBC) * xfc)) /
|
||||
(1 - model->BJTjunctionExpBC);
|
||||
here->BJTtjunctionExpBC) * xfc)) /
|
||||
(1 - here->BJTtjunctionExpBC);
|
||||
here->BJTtVcrit = vt *
|
||||
log(vt / (CONSTroot2*here->BJTtSatCur*here->BJTarea));
|
||||
here->BJTtSubVcrit = vt *
|
||||
log(vt / (CONSTroot2*here->BJTtSubSatCur*here->BJTarea));
|
||||
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -30,7 +30,7 @@ BJTtrunc(GENmodel *inModel, CKTcircuit *ckt, double *timeStep)
|
|||
|
||||
CKTterr(here->BJTqbe,ckt,timeStep);
|
||||
CKTterr(here->BJTqbc,ckt,timeStep);
|
||||
CKTterr(here->BJTqcs,ckt,timeStep);
|
||||
CKTterr(here->BJTqsub,ckt,timeStep);
|
||||
}
|
||||
}
|
||||
return(OK);
|
||||
|
|
|
|||
|
|
@ -68,8 +68,8 @@ IFparm DIOmPTable[] = { /* model parameters */
|
|||
IOPR( "ik", DIO_MOD_IKF, IF_REAL, "Forward Knee current"),
|
||||
IOP( "ikr", DIO_MOD_IKR, IF_REAL, "Reverse Knee current"),
|
||||
|
||||
IOP( "tlev", DIO_MOD_TLEV, IF_REAL, "Diode temperature equation selector"),
|
||||
IOP( "tlevc", DIO_MOD_TLEVC, IF_REAL, "Diode temperature equation selector"),
|
||||
IOP( "tlev", DIO_MOD_TLEV, IF_INTEGER, "Diode temperature equation selector"),
|
||||
IOP( "tlevc", DIO_MOD_TLEVC, IF_INTEGER, "Diode temperature equation selector"),
|
||||
IOP( "eg", DIO_MOD_EG, IF_REAL, "Activation energy"),
|
||||
IOP( "xti", DIO_MOD_XTI, IF_REAL, "Saturation current temperature exp."),
|
||||
IOP( "cta", DIO_MOD_CTA, IF_REAL, "Area junction temperature coefficient"),
|
||||
|
|
|
|||
Loading…
Reference in New Issue