diff --git a/src/spicelib/devices/bsimsoi/Makefile.am b/src/spicelib/devices/bsimsoi/Makefile.am
index 7a7ed8ea0..ba4676815 100644
--- a/src/spicelib/devices/bsimsoi/Makefile.am
+++ b/src/spicelib/devices/bsimsoi/Makefile.am
@@ -19,6 +19,7 @@ libbsim4soi_la_SOURCES = \
b4soipar.c \
b4soipzld.c \
b4soiset.c \
+ b4soisoachk.c \
b4soitemp.c \
b4soitrunc.c \
b4soidef.h \
diff --git a/src/spicelib/devices/bsimsoi/b4soi.c b/src/spicelib/devices/bsimsoi/b4soi.c
index f4b660698..9a35ec384 100644
--- a/src/spicelib/devices/bsimsoi/b4soi.c
+++ b/src/spicelib/devices/bsimsoi/b4soi.c
@@ -1103,6 +1103,13 @@ IOP( "pngidl", B4SOI_MOD_PNGIDL, IF_REAL, "Cross-term dependence of ngidl"),
/* Added for binning - END */
+IOP("vgs_max", B4SOI_MOD_VGS_MAX, IF_REAL, "maximum voltage G-S branch"),
+IOP("vgd_max", B4SOI_MOD_VGD_MAX, IF_REAL, "maximum voltage G-D branch"),
+IOP("vgb_max", B4SOI_MOD_VGB_MAX, IF_REAL, "maximum voltage G-B branch"),
+IOP("vds_max", B4SOI_MOD_VDS_MAX, IF_REAL, "maximum voltage D-S branch"),
+IOP("vbs_max", B4SOI_MOD_VBS_MAX, IF_REAL, "maximum voltage B-S branch"),
+IOP("vbd_max", B4SOI_MOD_VBD_MAX, IF_REAL, "maximum voltage B-D branch"),
+
IP( "nmos", B4SOI_MOD_NMOS, IF_FLAG, "Flag to indicate NMOS"),
IP( "pmos", B4SOI_MOD_PMOS, IF_FLAG, "Flag to indicate PMOS"),
};
diff --git a/src/spicelib/devices/bsimsoi/b4soidef.h b/src/spicelib/devices/bsimsoi/b4soidef.h
index cf7c902de..32b488fab 100644
--- a/src/spicelib/devices/bsimsoi/b4soidef.h
+++ b/src/spicelib/devices/bsimsoi/b4soidef.h
@@ -2107,6 +2107,19 @@ typedef struct sB4SOImodel
unsigned B4SOIwngidlGiven :1;
unsigned B4SOIpngidlGiven :1;
+ double B4SOIvgsMax;
+ double B4SOIvgdMax;
+ double B4SOIvgbMax;
+ double B4SOIvdsMax;
+ double B4SOIvbsMax;
+ double B4SOIvbdMax;
+ unsigned B4SOIvgsMaxGiven :1;
+ unsigned B4SOIvgdMaxGiven :1;
+ unsigned B4SOIvgbMaxGiven :1;
+ unsigned B4SOIvdsMaxGiven :1;
+ unsigned B4SOIvbsMaxGiven :1;
+ unsigned B4SOIvbdMaxGiven :1;
+
struct b4soiSizeDependParam *pSizeDependParamKnot;
#ifdef USE_OMP
@@ -4242,6 +4255,13 @@ typedef struct sB4SOImodel
#define B4SOI_MOD_WNLX 2106
#define B4SOI_MOD_PNLX 2107
+#define B4SOI_MOD_VGS_MAX 2201
+#define B4SOI_MOD_VGD_MAX 2202
+#define B4SOI_MOD_VGB_MAX 2203
+#define B4SOI_MOD_VDS_MAX 2204
+#define B4SOI_MOD_VBS_MAX 2205
+#define B4SOI_MOD_VBD_MAX 2206
+
#include "b4soiext.h"
extern void B4SOIevaluate(double,double,double,B4SOIinstance*,B4SOImodel*,
diff --git a/src/spicelib/devices/bsimsoi/b4soiext.h b/src/spicelib/devices/bsimsoi/b4soiext.h
index a3c663f6f..bb252b941 100644
--- a/src/spicelib/devices/bsimsoi/b4soiext.h
+++ b/src/spicelib/devices/bsimsoi/b4soiext.h
@@ -30,3 +30,4 @@ extern int B4SOItemp(GENmodel*,CKTcircuit*);
extern int B4SOItrunc(GENmodel*,CKTcircuit*,double*);
extern int B4SOInoise(int,int,GENmodel*,CKTcircuit*,Ndata*,double*);
extern int B4SOIunsetup(GENmodel*,CKTcircuit*);
+extern int B4SOIsoaCheck(CKTcircuit *, GENmodel *);
diff --git a/src/spicelib/devices/bsimsoi/b4soiinit.c b/src/spicelib/devices/bsimsoi/b4soiinit.c
index 63276c6a6..1372967e4 100644
--- a/src/spicelib/devices/bsimsoi/b4soiinit.c
+++ b/src/spicelib/devices/bsimsoi/b4soiinit.c
@@ -65,7 +65,7 @@ SPICEdev B4SOIinfo = {
/* DEVsenTrunc */ NULL,
/* DEVdisto */ NULL,
/* DEVnoise */ B4SOInoise,
- /* DEVsoaCheck */ NULL,
+ /* DEVsoaCheck */ B4SOIsoaCheck,
#ifdef CIDER
/* DEVdump */ NULL,
/* DEVacct */ NULL,
diff --git a/src/spicelib/devices/bsimsoi/b4soimask.c b/src/spicelib/devices/bsimsoi/b4soimask.c
index cab3fe126..fcbdf3d3f 100644
--- a/src/spicelib/devices/bsimsoi/b4soimask.c
+++ b/src/spicelib/devices/bsimsoi/b4soimask.c
@@ -2800,6 +2800,25 @@ IFvalue *value)
return(OK); /* v3.2 */
/* Added for binning - END */
+ case B4SOI_MOD_VGS_MAX:
+ value->rValue = model->B4SOIvgsMax;
+ return(OK);
+ case B4SOI_MOD_VGD_MAX:
+ value->rValue = model->B4SOIvgdMax;
+ return(OK);
+ case B4SOI_MOD_VGB_MAX:
+ value->rValue = model->B4SOIvgbMax;
+ return(OK);
+ case B4SOI_MOD_VDS_MAX:
+ value->rValue = model->B4SOIvdsMax;
+ return(OK);
+ case B4SOI_MOD_VBS_MAX:
+ value->rValue = model->B4SOIvbsMax;
+ return(OK);
+ case B4SOI_MOD_VBD_MAX:
+ value->rValue = model->B4SOIvbdMax;
+ return(OK);
+
default:
return(E_BADPARM);
}
diff --git a/src/spicelib/devices/bsimsoi/b4soimpar.c b/src/spicelib/devices/bsimsoi/b4soimpar.c
index 0208d3273..bc4294f71 100644
--- a/src/spicelib/devices/bsimsoi/b4soimpar.c
+++ b/src/spicelib/devices/bsimsoi/b4soimpar.c
@@ -3758,6 +3758,32 @@ case B4SOI_MOD_UD:
mod->B4SOIpngidl = value->rValue;
mod->B4SOIpngidlGiven = TRUE;
break;
+
+ case B4SOI_MOD_VGS_MAX:
+ mod->B4SOIvgsMax = value->rValue;
+ mod->B4SOIvgsMaxGiven = TRUE;
+ break;
+ case B4SOI_MOD_VGD_MAX:
+ mod->B4SOIvgdMax = value->rValue;
+ mod->B4SOIvgdMaxGiven = TRUE;
+ break;
+ case B4SOI_MOD_VGB_MAX:
+ mod->B4SOIvgbMax = value->rValue;
+ mod->B4SOIvgbMaxGiven = TRUE;
+ break;
+ case B4SOI_MOD_VDS_MAX:
+ mod->B4SOIvdsMax = value->rValue;
+ mod->B4SOIvdsMaxGiven = TRUE;
+ break;
+ case B4SOI_MOD_VBS_MAX:
+ mod->B4SOIvbsMax = value->rValue;
+ mod->B4SOIvbsMaxGiven = TRUE;
+ break;
+ case B4SOI_MOD_VBD_MAX:
+ mod->B4SOIvbdMax = value->rValue;
+ mod->B4SOIvbdMaxGiven = TRUE;
+ break;
+
case B4SOI_MOD_NMOS :
if(value->iValue) {
mod->B4SOItype = 1;
diff --git a/src/spicelib/devices/bsimsoi/b4soiset.c b/src/spicelib/devices/bsimsoi/b4soiset.c
index 29d6df025..0cf5d9196 100644
--- a/src/spicelib/devices/bsimsoi/b4soiset.c
+++ b/src/spicelib/devices/bsimsoi/b4soiset.c
@@ -2053,6 +2053,20 @@ B4SOIinstance **InstArray;
if (!model->B4SOIlodeta0Given)
model->B4SOIlodeta0 = 1.0;
/* stress effect end */
+
+ if (!model->B4SOIvgsMaxGiven)
+ model->B4SOIvgsMax = 1e99;
+ if (!model->B4SOIvgdMaxGiven)
+ model->B4SOIvgdMax = 1e99;
+ if (!model->B4SOIvgbMaxGiven)
+ model->B4SOIvgbMax = 1e99;
+ if (!model->B4SOIvdsMaxGiven)
+ model->B4SOIvdsMax = 1e99;
+ if (!model->B4SOIvbsMaxGiven)
+ model->B4SOIvbsMax = 1e99;
+ if (!model->B4SOIvbdMaxGiven)
+ model->B4SOIvbdMax = 1e99;
+
if (!model->B4SOIfdModGiven)
model->B4SOIfdMod = 0;
if (!model->B4SOIvsceGiven)
diff --git a/src/spicelib/devices/bsimsoi/b4soisoachk.c b/src/spicelib/devices/bsimsoi/b4soisoachk.c
new file mode 100644
index 000000000..dc85fa06e
--- /dev/null
+++ b/src/spicelib/devices/bsimsoi/b4soisoachk.c
@@ -0,0 +1,110 @@
+/**********
+Copyright 2013 Dietmar Warning. All rights reserved.
+Author: 2013 Dietmar Warning
+**********/
+
+#include "ngspice/ngspice.h"
+#include "ngspice/cktdefs.h"
+#include "b4soidef.h"
+#include "ngspice/trandefs.h"
+#include "ngspice/sperror.h"
+#include "ngspice/suffix.h"
+#include "ngspice/cpdefs.h"
+
+
+int
+B4SOIsoaCheck(CKTcircuit *ckt, GENmodel *inModel)
+{
+ B4SOImodel *model = (B4SOImodel *) inModel;
+ B4SOIinstance *here;
+ double vgs, vgd, vgb, vds, vbs, vbd; /* actual mos voltages */
+ int maxwarns;
+ static int warns_vgs = 0, warns_vgd = 0, warns_vgb = 0, warns_vds = 0, warns_vbs = 0, warns_vbd = 0;
+
+ if (!ckt) {
+ warns_vgs = 0;
+ warns_vgd = 0;
+ warns_vgb = 0;
+ warns_vds = 0;
+ warns_vbs = 0;
+ warns_vbd = 0;
+ return OK;
+ }
+
+ maxwarns = ckt->CKTsoaMaxWarns;
+
+ for (; model; model = model->B4SOInextModel) {
+
+ for (here = model->B4SOIinstances; here; here = here->B4SOInextInstance) {
+
+ vgs = fabs(ckt->CKTrhsOld [here->B4SOIgNode] -
+ ckt->CKTrhsOld [here->B4SOIsNodePrime]);
+
+ vgd = fabs(ckt->CKTrhsOld [here->B4SOIgNode] -
+ ckt->CKTrhsOld [here->B4SOIdNodePrime]);
+
+ vgb = fabs(ckt->CKTrhsOld [here->B4SOIgNode] -
+ ckt->CKTrhsOld [here->B4SOIbNode]);
+
+ vds = fabs(ckt->CKTrhsOld [here->B4SOIdNodePrime] -
+ ckt->CKTrhsOld [here->B4SOIsNodePrime]);
+
+ vbs = fabs(ckt->CKTrhsOld [here->B4SOIbNode] -
+ ckt->CKTrhsOld [here->B4SOIsNodePrime]);
+
+ vbd = fabs(ckt->CKTrhsOld [here->B4SOIbNode] -
+ ckt->CKTrhsOld [here->B4SOIdNodePrime]);
+
+ if (vgs > model->B4SOIvgsMax)
+ if (warns_vgs < maxwarns) {
+ soa_printf(ckt, (GENinstance*) here,
+ "|Vgs|=%g has exceeded Vgs_max=%g\n",
+ vgs, model->B4SOIvgsMax);
+ warns_vgs++;
+ }
+
+ if (vgd > model->B4SOIvgdMax)
+ if (warns_vgd < maxwarns) {
+ soa_printf(ckt, (GENinstance*) here,
+ "|Vgd|=%g has exceeded Vgd_max=%g\n",
+ vgd, model->B4SOIvgdMax);
+ warns_vgd++;
+ }
+
+ if (vgb > model->B4SOIvgbMax)
+ if (warns_vgb < maxwarns) {
+ soa_printf(ckt, (GENinstance*) here,
+ "|Vgb|=%g has exceeded Vgb_max=%g\n",
+ vgb, model->B4SOIvgbMax);
+ warns_vgb++;
+ }
+
+ if (vds > model->B4SOIvdsMax)
+ if (warns_vds < maxwarns) {
+ soa_printf(ckt, (GENinstance*) here,
+ "|Vds|=%g has exceeded Vds_max=%g\n",
+ vds, model->B4SOIvdsMax);
+ warns_vds++;
+ }
+
+ if (vbs > model->B4SOIvbsMax)
+ if (warns_vbs < maxwarns) {
+ soa_printf(ckt, (GENinstance*) here,
+ "|Vbs|=%g has exceeded Vbs_max=%g\n",
+ vbs, model->B4SOIvbsMax);
+ warns_vbs++;
+ }
+
+ if (vbd > model->B4SOIvbdMax)
+ if (warns_vbd < maxwarns) {
+ soa_printf(ckt, (GENinstance*) here,
+ "|Vbd|=%g has exceeded Vbd_max=%g\n",
+ vbd, model->B4SOIvbdMax);
+ warns_vbd++;
+ }
+
+ }
+ }
+
+ return OK;
+}
diff --git a/visualc/vngspice.vcproj b/visualc/vngspice.vcproj
index feec3a5f0..0d39db8eb 100644
--- a/visualc/vngspice.vcproj
+++ b/visualc/vngspice.vcproj
@@ -4056,6 +4056,10 @@
RelativePath="..\src\spicelib\devices\bsimsoi\b4soiset.c"
>
+
+