Add SOA-check for collector-substrate diode (model parameter bvsub)
This commit is contained in:
parent
ff77c583d7
commit
443567dbaf
|
|
@ -185,6 +185,8 @@ IFparm VBICmPTable[] = { /* model parameters */
|
|||
IOPR("bvbc", VBIC_MOD_VBC_MAX, IF_REAL, "maximum voltage B-C junction"),
|
||||
IOP("vce_max", VBIC_MOD_VCE_MAX, IF_REAL, "maximum voltage C-E branch"),
|
||||
IOPR("bvce", VBIC_MOD_VCE_MAX, IF_REAL, "maximum voltage C-E branch"),
|
||||
IOP("vsub_max", VBIC_MOD_VSUB_MAX, IF_REAL, "maximum voltage C-substrate branch"),
|
||||
IOPR("bvsub", VBIC_MOD_VSUB_MAX, IF_REAL, "maximum voltage C-substrate branch"),
|
||||
IOP("selft", VBIC_MOD_SELFT, IF_INTEGER, "0: self-heating off, 1: self-heating on")
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -485,6 +485,7 @@ typedef struct sVBICmodel { /* model structure for a vbic */
|
|||
double VBICvbeMax; /* maximum voltage over B-E junction */
|
||||
double VBICvbcMax; /* maximum voltage over B-C junction */
|
||||
double VBICvceMax; /* maximum voltage over C-E branch */
|
||||
double VBICvsubMax; /* maximum voltage over C-substrate branch */
|
||||
|
||||
unsigned VBICtnomGiven : 1;
|
||||
unsigned VBICextCollResistGiven : 1;
|
||||
|
|
@ -600,6 +601,7 @@ typedef struct sVBICmodel { /* model structure for a vbic */
|
|||
unsigned VBICvbeMaxGiven : 1;
|
||||
unsigned VBICvbcMaxGiven : 1;
|
||||
unsigned VBICvceMaxGiven : 1;
|
||||
unsigned VBICvsubMaxGiven : 1;
|
||||
} VBICmodel;
|
||||
|
||||
#ifndef NPN
|
||||
|
|
@ -736,6 +738,7 @@ enum {
|
|||
VBIC_MOD_VBE_MAX,
|
||||
VBIC_MOD_VBC_MAX,
|
||||
VBIC_MOD_VCE_MAX,
|
||||
VBIC_MOD_VSUB_MAX,
|
||||
VBIC_MOD_SELFT,
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -363,6 +363,9 @@ VBICmAsk(CKTcircuit *ckt, GENmodel *instPtr, int which, IFvalue *value)
|
|||
case VBIC_MOD_VCE_MAX:
|
||||
value->rValue = here->VBICvceMax;
|
||||
return(OK);
|
||||
case VBIC_MOD_VSUB_MAX:
|
||||
value->rValue = here->VBICvsubMax;
|
||||
return(OK);
|
||||
case VBIC_MOD_TYPE:
|
||||
if (here->VBICtype == NPN)
|
||||
value->sValue = "npn";
|
||||
|
|
|
|||
|
|
@ -509,6 +509,10 @@ VBICmParam(int param, IFvalue *value, GENmodel *inModel)
|
|||
mods->VBICvceMax = value->rValue;
|
||||
mods->VBICvceMaxGiven = TRUE;
|
||||
break;
|
||||
case VBIC_MOD_VSUB_MAX:
|
||||
mods->VBICvsubMax = value->rValue;
|
||||
mods->VBICvsubMaxGiven = TRUE;
|
||||
break;
|
||||
case VBIC_MOD_SELFT:
|
||||
mods->VBICselft = value->iValue;
|
||||
mods->VBICselftGiven = TRUE;
|
||||
|
|
|
|||
|
|
@ -17,14 +17,15 @@ VBICsoaCheck(CKTcircuit *ckt, GENmodel *inModel)
|
|||
{
|
||||
VBICmodel *model = (VBICmodel *) inModel;
|
||||
VBICinstance *here;
|
||||
double vbe, vbc, vce; /* actual bjt voltages */
|
||||
double vbe, vbc, vce, vsub; /* actual bjt voltages */
|
||||
int maxwarns;
|
||||
static int warns_vbe = 0, warns_vbc = 0, warns_vce = 0;
|
||||
static int warns_vbe = 0, warns_vbc = 0, warns_vce = 0, warns_vsub = 0;
|
||||
|
||||
if (!ckt) {
|
||||
warns_vbe = 0;
|
||||
warns_vbc = 0;
|
||||
warns_vce = 0;
|
||||
warns_vsub = 0;
|
||||
return OK;
|
||||
}
|
||||
|
||||
|
|
@ -40,6 +41,8 @@ VBICsoaCheck(CKTcircuit *ckt, GENmodel *inModel)
|
|||
ckt->CKTrhsOld [here->VBICcollNode]);
|
||||
vce = fabs(ckt->CKTrhsOld [here->VBICcollNode] -
|
||||
ckt->CKTrhsOld [here->VBICemitNode]);
|
||||
vsub = fabs(ckt->CKTrhsOld [here->VBICcollNode] -
|
||||
ckt->CKTrhsOld [here->VBICsubsNode]);
|
||||
|
||||
if (vbe > model->VBICvbeMax)
|
||||
if (warns_vbe < maxwarns) {
|
||||
|
|
@ -65,6 +68,13 @@ VBICsoaCheck(CKTcircuit *ckt, GENmodel *inModel)
|
|||
warns_vce++;
|
||||
}
|
||||
|
||||
if (vsub > model->VBICvsubMax)
|
||||
if (warns_vsub < maxwarns) {
|
||||
soa_printf(ckt, (GENinstance*) here,
|
||||
"|Vce|=%g has exceeded Vce_max=%g\n",
|
||||
vsub, model->VBICvsubMax);
|
||||
warns_vsub++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue