diff --git a/src/spicelib/devices/vbic/vbic.c b/src/spicelib/devices/vbic/vbic.c index df398a1ce..7463cfa71 100644 --- a/src/spicelib/devices/vbic/vbic.c +++ b/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"), 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") }; diff --git a/src/spicelib/devices/vbic/vbicdefs.h b/src/spicelib/devices/vbic/vbicdefs.h index 50653a95f..2f771084e 100644 --- a/src/spicelib/devices/vbic/vbicdefs.h +++ b/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 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, }; diff --git a/src/spicelib/devices/vbic/vbicmask.c b/src/spicelib/devices/vbic/vbicmask.c index e8d1f94a1..18142d917 100644 --- a/src/spicelib/devices/vbic/vbicmask.c +++ b/src/spicelib/devices/vbic/vbicmask.c @@ -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"; diff --git a/src/spicelib/devices/vbic/vbicmpar.c b/src/spicelib/devices/vbic/vbicmpar.c index 73ed58ad6..efd8a8fdf 100644 --- a/src/spicelib/devices/vbic/vbicmpar.c +++ b/src/spicelib/devices/vbic/vbicmpar.c @@ -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; diff --git a/src/spicelib/devices/vbic/vbicsoachk.c b/src/spicelib/devices/vbic/vbicsoachk.c index 34d6755ac..f6d6b4a25 100644 --- a/src/spicelib/devices/vbic/vbicsoachk.c +++ b/src/spicelib/devices/vbic/vbicsoachk.c @@ -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++; + } } }