devices/bsimsoi, implement B4SOIsoaCheck()
This commit is contained in:
parent
8a005d8e4c
commit
7bafe7c238
|
|
@ -19,6 +19,7 @@ libbsim4soi_la_SOURCES = \
|
|||
b4soipar.c \
|
||||
b4soipzld.c \
|
||||
b4soiset.c \
|
||||
b4soisoachk.c \
|
||||
b4soitemp.c \
|
||||
b4soitrunc.c \
|
||||
b4soidef.h \
|
||||
|
|
|
|||
|
|
@ -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"),
|
||||
};
|
||||
|
|
|
|||
|
|
@ -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*,
|
||||
|
|
|
|||
|
|
@ -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 *);
|
||||
|
|
|
|||
|
|
@ -65,7 +65,7 @@ SPICEdev B4SOIinfo = {
|
|||
/* DEVsenTrunc */ NULL,
|
||||
/* DEVdisto */ NULL,
|
||||
/* DEVnoise */ B4SOInoise,
|
||||
/* DEVsoaCheck */ NULL,
|
||||
/* DEVsoaCheck */ B4SOIsoaCheck,
|
||||
#ifdef CIDER
|
||||
/* DEVdump */ NULL,
|
||||
/* DEVacct */ NULL,
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
@ -4056,6 +4056,10 @@
|
|||
RelativePath="..\src\spicelib\devices\bsimsoi\b4soiset.c"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\src\spicelib\devices\bsimsoi\b4soisoachk.c"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\src\spicelib\devices\bsimsoi\b4soitemp.c"
|
||||
>
|
||||
|
|
|
|||
Loading…
Reference in New Issue