Browse Source

Add SOA-check for collector-substrate diode (model parameter bvsub)

pre-master-46
Holger Vogt 3 years ago
parent
commit
443567dbaf
  1. 2
      src/spicelib/devices/vbic/vbic.c
  2. 3
      src/spicelib/devices/vbic/vbicdefs.h
  3. 3
      src/spicelib/devices/vbic/vbicmask.c
  4. 4
      src/spicelib/devices/vbic/vbicmpar.c
  5. 14
      src/spicelib/devices/vbic/vbicsoachk.c

2
src/spicelib/devices/vbic/vbic.c

@ -185,6 +185,8 @@ IFparm VBICmPTable[] = { /* model parameters */
IOPR("bvbc", VBIC_MOD_VBC_MAX, IF_REAL, "maximum voltage B-C junction"), 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"), 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"), 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") IOP("selft", VBIC_MOD_SELFT, IF_INTEGER, "0: self-heating off, 1: self-heating on")
}; };

3
src/spicelib/devices/vbic/vbicdefs.h

@ -485,6 +485,7 @@ typedef struct sVBICmodel { /* model structure for a vbic */
double VBICvbeMax; /* maximum voltage over B-E junction */ double VBICvbeMax; /* maximum voltage over B-E junction */
double VBICvbcMax; /* maximum voltage over B-C junction */ double VBICvbcMax; /* maximum voltage over B-C junction */
double VBICvceMax; /* maximum voltage over C-E branch */ double VBICvceMax; /* maximum voltage over C-E branch */
double VBICvsubMax; /* maximum voltage over C-substrate branch */
unsigned VBICtnomGiven : 1; unsigned VBICtnomGiven : 1;
unsigned VBICextCollResistGiven : 1; unsigned VBICextCollResistGiven : 1;
@ -600,6 +601,7 @@ typedef struct sVBICmodel { /* model structure for a vbic */
unsigned VBICvbeMaxGiven : 1; unsigned VBICvbeMaxGiven : 1;
unsigned VBICvbcMaxGiven : 1; unsigned VBICvbcMaxGiven : 1;
unsigned VBICvceMaxGiven : 1; unsigned VBICvceMaxGiven : 1;
unsigned VBICvsubMaxGiven : 1;
} VBICmodel; } VBICmodel;
#ifndef NPN #ifndef NPN
@ -736,6 +738,7 @@ enum {
VBIC_MOD_VBE_MAX, VBIC_MOD_VBE_MAX,
VBIC_MOD_VBC_MAX, VBIC_MOD_VBC_MAX,
VBIC_MOD_VCE_MAX, VBIC_MOD_VCE_MAX,
VBIC_MOD_VSUB_MAX,
VBIC_MOD_SELFT, VBIC_MOD_SELFT,
}; };

3
src/spicelib/devices/vbic/vbicmask.c

@ -363,6 +363,9 @@ VBICmAsk(CKTcircuit *ckt, GENmodel *instPtr, int which, IFvalue *value)
case VBIC_MOD_VCE_MAX: case VBIC_MOD_VCE_MAX:
value->rValue = here->VBICvceMax; value->rValue = here->VBICvceMax;
return(OK); return(OK);
case VBIC_MOD_VSUB_MAX:
value->rValue = here->VBICvsubMax;
return(OK);
case VBIC_MOD_TYPE: case VBIC_MOD_TYPE:
if (here->VBICtype == NPN) if (here->VBICtype == NPN)
value->sValue = "npn"; value->sValue = "npn";

4
src/spicelib/devices/vbic/vbicmpar.c

@ -509,6 +509,10 @@ VBICmParam(int param, IFvalue *value, GENmodel *inModel)
mods->VBICvceMax = value->rValue; mods->VBICvceMax = value->rValue;
mods->VBICvceMaxGiven = TRUE; mods->VBICvceMaxGiven = TRUE;
break; break;
case VBIC_MOD_VSUB_MAX:
mods->VBICvsubMax = value->rValue;
mods->VBICvsubMaxGiven = TRUE;
break;
case VBIC_MOD_SELFT: case VBIC_MOD_SELFT:
mods->VBICselft = value->iValue; mods->VBICselft = value->iValue;
mods->VBICselftGiven = TRUE; mods->VBICselftGiven = TRUE;

14
src/spicelib/devices/vbic/vbicsoachk.c

@ -17,14 +17,15 @@ VBICsoaCheck(CKTcircuit *ckt, GENmodel *inModel)
{ {
VBICmodel *model = (VBICmodel *) inModel; VBICmodel *model = (VBICmodel *) inModel;
VBICinstance *here; VBICinstance *here;
double vbe, vbc, vce; /* actual bjt voltages */
double vbe, vbc, vce, vsub; /* actual bjt voltages */
int maxwarns; 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) { if (!ckt) {
warns_vbe = 0; warns_vbe = 0;
warns_vbc = 0; warns_vbc = 0;
warns_vce = 0; warns_vce = 0;
warns_vsub = 0;
return OK; return OK;
} }
@ -40,6 +41,8 @@ VBICsoaCheck(CKTcircuit *ckt, GENmodel *inModel)
ckt->CKTrhsOld [here->VBICcollNode]); ckt->CKTrhsOld [here->VBICcollNode]);
vce = fabs(ckt->CKTrhsOld [here->VBICcollNode] - vce = fabs(ckt->CKTrhsOld [here->VBICcollNode] -
ckt->CKTrhsOld [here->VBICemitNode]); ckt->CKTrhsOld [here->VBICemitNode]);
vsub = fabs(ckt->CKTrhsOld [here->VBICcollNode] -
ckt->CKTrhsOld [here->VBICsubsNode]);
if (vbe > model->VBICvbeMax) if (vbe > model->VBICvbeMax)
if (warns_vbe < maxwarns) { if (warns_vbe < maxwarns) {
@ -65,6 +68,13 @@ VBICsoaCheck(CKTcircuit *ckt, GENmodel *inModel)
warns_vce++; 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…
Cancel
Save