From 7bafe7c238b9bca36571e8305d4f17c2fcb489f1 Mon Sep 17 00:00:00 2001 From: dwarning Date: Wed, 30 Oct 2013 20:21:12 +0100 Subject: [PATCH] devices/bsimsoi, implement B4SOIsoaCheck() --- src/spicelib/devices/bsimsoi/Makefile.am | 1 + src/spicelib/devices/bsimsoi/b4soi.c | 7 ++ src/spicelib/devices/bsimsoi/b4soidef.h | 20 ++++ src/spicelib/devices/bsimsoi/b4soiext.h | 1 + src/spicelib/devices/bsimsoi/b4soiinit.c | 2 +- src/spicelib/devices/bsimsoi/b4soimask.c | 19 ++++ src/spicelib/devices/bsimsoi/b4soimpar.c | 26 +++++ src/spicelib/devices/bsimsoi/b4soiset.c | 14 +++ src/spicelib/devices/bsimsoi/b4soisoachk.c | 110 +++++++++++++++++++++ visualc/vngspice.vcproj | 4 + 10 files changed, 203 insertions(+), 1 deletion(-) create mode 100644 src/spicelib/devices/bsimsoi/b4soisoachk.c 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" > + +