no stimod switch as model parameter
This commit is contained in:
parent
75f68291aa
commit
9e24a8ac83
|
|
@ -1,4 +1,10 @@
|
|||
2008-11-04 Holger Vogt
|
||||
2008-11-26 Dietmar Warning
|
||||
* src/spicelib/devices/bsim4v4, bsim4v5: this is a backup because the patch of
|
||||
Phil Barker are providing only a placeholder for propriarity sti stress model -
|
||||
not any equation. If the stimod feature is some time published we can implement
|
||||
it again.
|
||||
|
||||
2008-11-26 Holger Vogt
|
||||
* frontend/numparam/xpressn.c: agauss, sinh, cosh tanh, added (source: S. Thiel)
|
||||
* b3soi*ld.c: _isnan defined for _MSC_VER
|
||||
* main.c, cmath2.c, xpressn.c: random, srandom defined extern for _MSC_VER
|
||||
|
|
|
|||
|
|
@ -93,7 +93,6 @@ OP( "qinv", BSIM4v4_QINV, IF_REAL, "Qinversion"),
|
|||
};
|
||||
|
||||
IFparm BSIM4v4mPTable[] = { /* model parameters */
|
||||
IOP( "rgeomod", BSIM4v4_MOD_RGEOMOD, IF_INTEGER, "S/D resistance and contact model selector"),
|
||||
IOP( "capmod", BSIM4v4_MOD_CAPMOD, IF_INTEGER, "Capacitance model selector"),
|
||||
IOP( "diomod", BSIM4v4_MOD_DIOMOD, IF_INTEGER, "Diode IV model selector"),
|
||||
IOP( "rdsmod", BSIM4v4_MOD_RDSMOD, IF_INTEGER, "Bias-dependent S/D resistance model selector"),
|
||||
|
|
@ -801,10 +800,6 @@ IOP( "ef", BSIM4v4_MOD_EF, IF_REAL, "Flicker noise frequency exponent"),
|
|||
IOP( "af", BSIM4v4_MOD_AF, IF_REAL, "Flicker noise exponent"),
|
||||
IOP( "kf", BSIM4v4_MOD_KF, IF_REAL, "Flicker noise coefficient"),
|
||||
|
||||
IOP( "stimod", BSIM4v4_MOD_STIMOD, IF_REAL, "Stress effect model selector"),
|
||||
IOP( "sa0", BSIM4v4_MOD_SA0, IF_REAL, "Distance between OD edge to poly of one side"),
|
||||
IOP( "sb0", BSIM4v4_MOD_SB0, IF_REAL, "Distance between OD edge to poly of other side"),
|
||||
|
||||
IP( "nmos", BSIM4v4_MOD_NMOS, IF_FLAG, "Flag to indicate NMOS"),
|
||||
IP( "pmos", BSIM4v4_MOD_PMOS, IF_FLAG, "Flag to indicate PMOS"),
|
||||
};
|
||||
|
|
|
|||
|
|
@ -444,12 +444,11 @@ FILE *fplog;
|
|||
printf("Warning: Cdscd = %g is negative.\n", pParam->BSIM4v4cdscd);
|
||||
}
|
||||
/* Check DIBL parameters */
|
||||
/* if (here->BSIM4v4eta0 < 0.0)
|
||||
if (here->BSIM4v4eta0 < 0.0)
|
||||
{ fprintf(fplog, "Warning: Eta0 = %g is negative.\n",
|
||||
here->BSIM4v4eta0);
|
||||
printf("Warning: Eta0 = %g is negative.\n", here->BSIM4v4eta0);
|
||||
}
|
||||
*/
|
||||
|
||||
/* Check Abulk parameters */
|
||||
if (fabs(1.0e-8 / (pParam->BSIM4v4b1 + pParam->BSIM4v4weff)) > 10.0)
|
||||
|
|
@ -551,12 +550,11 @@ FILE *fplog;
|
|||
pParam->BSIM4v4pdibl1);
|
||||
printf("Warning: Pdibl1 = %g is negative.\n", pParam->BSIM4v4pdibl1);
|
||||
}
|
||||
/* if (pParam->BSIM4v4pdibl2 < 0.0)
|
||||
if (pParam->BSIM4v4pdibl2 < 0.0)
|
||||
{ fprintf(fplog, "Warning: Pdibl2 = %g is negative.\n",
|
||||
pParam->BSIM4v4pdibl2);
|
||||
printf("Warning: Pdibl2 = %g is negative.\n", pParam->BSIM4v4pdibl2);
|
||||
}
|
||||
*/
|
||||
|
||||
/* Check stress effect parameters */
|
||||
if((here->BSIM4v4sa > 0.0) && (here->BSIM4v4sb > 0.0) &&
|
||||
|
|
|
|||
|
|
@ -1957,18 +1957,6 @@ IFvalue *value;
|
|||
case BSIM4v4_MOD_KF:
|
||||
value->rValue = model->BSIM4v4kf;
|
||||
return(OK);
|
||||
case BSIM4v4_MOD_STIMOD:
|
||||
value->rValue = model->BSIM4v4stimod;
|
||||
return(OK);
|
||||
case BSIM4v4_MOD_RGEOMOD:
|
||||
value->rValue = model->BSIM4v4rgeomod;
|
||||
return(OK);
|
||||
case BSIM4v4_MOD_SA0:
|
||||
value->rValue = model->BSIM4v4sa0;
|
||||
return(OK);
|
||||
case BSIM4v4_MOD_SB0:
|
||||
value->rValue = model->BSIM4v4sb0;
|
||||
return(OK);
|
||||
default:
|
||||
return(E_BADPARM);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -2780,22 +2780,6 @@ GENmodel *inMod;
|
|||
mod->BSIM4v4kf = value->rValue;
|
||||
mod->BSIM4v4kfGiven = TRUE;
|
||||
break;
|
||||
case BSIM4v4_MOD_STIMOD :
|
||||
mod->BSIM4v4stimod = value->rValue;
|
||||
mod->BSIM4v4stimodGiven = TRUE;
|
||||
break;
|
||||
case BSIM4v4_MOD_RGEOMOD :
|
||||
mod->BSIM4v4rgeomod = value->rValue;
|
||||
mod->BSIM4v4rgeomodGiven = TRUE;
|
||||
break;
|
||||
case BSIM4v4_MOD_SA0 :
|
||||
mod->BSIM4v4sa0 = value->rValue;
|
||||
mod->BSIM4v4sa0Given = TRUE;
|
||||
break;
|
||||
case BSIM4v4_MOD_SB0 :
|
||||
mod->BSIM4v4sb0 = value->rValue;
|
||||
mod->BSIM4v4sb0Given = TRUE;
|
||||
break;
|
||||
case BSIM4v4_MOD_NMOS :
|
||||
if(value->iValue) {
|
||||
mod->BSIM4v4type = 1;
|
||||
|
|
|
|||
|
|
@ -1452,14 +1452,6 @@ JOB *job;
|
|||
model->BSIM4v4af = 1.0;
|
||||
if (!model->BSIM4v4kfGiven)
|
||||
model->BSIM4v4kf = 0.0;
|
||||
if (!model->BSIM4v4stimodGiven)
|
||||
model->BSIM4v4stimod = 0.0;
|
||||
if (!model->BSIM4v4rgeomodGiven)
|
||||
model->BSIM4v4rgeomod = 0;
|
||||
if (!model->BSIM4v4sa0Given)
|
||||
model->BSIM4v4sa0 = 0.0;
|
||||
if (!model->BSIM4v4sb0Given)
|
||||
model->BSIM4v4sb0 = 0.0;
|
||||
|
||||
/* stress effect */
|
||||
if (!model->BSIM4v4sarefGiven)
|
||||
|
|
@ -1516,9 +1508,9 @@ JOB *job;
|
|||
|
||||
for (here = model->BSIM4v4instances; here != NULL ;
|
||||
here=here->BSIM4v4nextInstance)
|
||||
{
|
||||
if (here->BSIM4v4owner == ARCHme) {
|
||||
/* allocate a chunk of the state vector */
|
||||
{
|
||||
if (here->BSIM4v4owner == ARCHme) {
|
||||
/* allocate a chunk of the state vector */
|
||||
here->BSIM4v4states = *states;
|
||||
*states += BSIM4v4numStates;
|
||||
}
|
||||
|
|
@ -1594,7 +1586,7 @@ JOB *job;
|
|||
if (!here->BSIM4v4geoModGiven)
|
||||
here->BSIM4v4geoMod = model->BSIM4v4geoMod;
|
||||
if (!here->BSIM4v4rgeoModGiven)
|
||||
here->BSIM4v4rgeoMod = model->BSIM4v4rgeomod;
|
||||
here->BSIM4v4rgeoMod = 0.0;
|
||||
if (!here->BSIM4v4trnqsModGiven)
|
||||
here->BSIM4v4trnqsMod = model->BSIM4v4trnqsMod;
|
||||
else if ((here->BSIM4v4trnqsMod != 0) && (here->BSIM4v4trnqsMod != 1))
|
||||
|
|
|
|||
|
|
@ -1373,21 +1373,9 @@ typedef struct sBSIM4v4model
|
|||
double BSIM4v4af;
|
||||
double BSIM4v4kf;
|
||||
|
||||
int BSIM4v4rgeomod;
|
||||
|
||||
/* strain parameters */
|
||||
double BSIM4v4stimod;
|
||||
double BSIM4v4sa0;
|
||||
double BSIM4v4sb0;
|
||||
|
||||
struct bsim4SizeDependParam *pSizeDependParamKnot;
|
||||
|
||||
/* Flags */
|
||||
unsigned BSIM4v4rgeomodGiven :1;
|
||||
unsigned BSIM4v4stimodGiven :1;
|
||||
unsigned BSIM4v4sa0Given :1;
|
||||
unsigned BSIM4v4sb0Given :1;
|
||||
|
||||
unsigned BSIM4v4mobModGiven :1;
|
||||
unsigned BSIM4v4binUnitGiven :1;
|
||||
unsigned BSIM4v4capModGiven :1;
|
||||
|
|
@ -2847,12 +2835,6 @@ typedef struct sBSIM4v4model
|
|||
#define BSIM4v4_MOD_VTSSWGS 922
|
||||
#define BSIM4v4_MOD_VTSSWGD 923
|
||||
|
||||
#define BSIM4v4_MOD_STIMOD 930
|
||||
#define BSIM4v4_MOD_SA0 931
|
||||
#define BSIM4v4_MOD_SB0 932
|
||||
|
||||
#define BSIM4v4_MOD_RGEOMOD 933
|
||||
|
||||
/* device questions */
|
||||
#define BSIM4v4_DNODE 945
|
||||
#define BSIM4v4_GNODEEXT 946
|
||||
|
|
|
|||
|
|
@ -106,7 +106,6 @@ OP( "gtau", BSIM4v5_GTAU, IF_REAL, "Gtau"),
|
|||
};
|
||||
|
||||
IFparm BSIM4v5mPTable[] = { /* model parameters */
|
||||
IOP( "rgeomod", BSIM4v5_MOD_RGEOMOD, IF_INTEGER, "S/D resistance and contact model selector"),
|
||||
IOP( "capmod", BSIM4v5_MOD_CAPMOD, IF_INTEGER, "Capacitance model selector"),
|
||||
IOP( "diomod", BSIM4v5_MOD_DIOMOD, IF_INTEGER, "Diode IV model selector"),
|
||||
IOP( "rdsmod", BSIM4v5_MOD_RDSMOD, IF_INTEGER, "Bias-dependent S/D resistance model selector"),
|
||||
|
|
@ -890,10 +889,6 @@ IOP( "ef", BSIM4v5_MOD_EF, IF_REAL, "Flicker noise frequency exponent"),
|
|||
IOP( "af", BSIM4v5_MOD_AF, IF_REAL, "Flicker noise exponent"),
|
||||
IOP( "kf", BSIM4v5_MOD_KF, IF_REAL, "Flicker noise coefficient"),
|
||||
|
||||
IOP( "stimod", BSIM4v5_MOD_STIMOD, IF_REAL, "Stress effect model selector"),
|
||||
IOP( "sa0", BSIM4v5_MOD_SA0, IF_REAL, "Distance between OD edge to poly of one side"),
|
||||
IOP( "sb0", BSIM4v5_MOD_SB0, IF_REAL, "Distance between OD edge to poly of other side"),
|
||||
|
||||
IP( "nmos", BSIM4v5_MOD_NMOS, IF_FLAG, "Flag to indicate NMOS"),
|
||||
IP( "pmos", BSIM4v5_MOD_PMOS, IF_FLAG, "Flag to indicate PMOS"),
|
||||
};
|
||||
|
|
|
|||
|
|
@ -780,27 +780,27 @@ FILE *fplog;
|
|||
{
|
||||
if (model->BSIM4v5scref <= 0.0)
|
||||
{ fprintf(fplog, "Warning: SCREF = %g is not positive. Set to 1e-6.\n", model->BSIM4v5scref);
|
||||
//printf("Warning: SCREF = %g is not positive. Set to 1e-6.\n", model->BSIM4v5scref);
|
||||
printf("Warning: SCREF = %g is not positive. Set to 1e-6.\n", model->BSIM4v5scref);
|
||||
model->BSIM4v5scref = 1e-6;
|
||||
}
|
||||
if (here->BSIM4v5sca < 0.0)
|
||||
{ fprintf(fplog, "Warning: SCA = %g is negative. Set to 0.0.\n", here->BSIM4v5sca);
|
||||
//printf("Warning: SCA = %g is negative. Set to 0.0.\n", here->BSIM4v5sca);
|
||||
printf("Warning: SCA = %g is negative. Set to 0.0.\n", here->BSIM4v5sca);
|
||||
here->BSIM4v5sca = 0.0;
|
||||
}
|
||||
if (here->BSIM4v5scb < 0.0)
|
||||
{ fprintf(fplog, "Warning: SCB = %g is negative. Set to 0.0.\n", here->BSIM4v5scb);
|
||||
//printf("Warning: SCB = %g is negative. Set to 0.0.\n", here->BSIM4v5scb);
|
||||
printf("Warning: SCB = %g is negative. Set to 0.0.\n", here->BSIM4v5scb);
|
||||
here->BSIM4v5scb = 0.0;
|
||||
}
|
||||
if (here->BSIM4v5scc < 0.0)
|
||||
{ fprintf(fplog, "Warning: SCC = %g is negative. Set to 0.0.\n", here->BSIM4v5scc);
|
||||
//printf("Warning: SCC = %g is negative. Set to 0.0.\n", here->BSIM4v5scc);
|
||||
printf("Warning: SCC = %g is negative. Set to 0.0.\n", here->BSIM4v5scc);
|
||||
here->BSIM4v5scc = 0.0;
|
||||
}
|
||||
if (here->BSIM4v5sc < 0.0)
|
||||
{ fprintf(fplog, "Warning: SC = %g is negative. Set to 0.0.\n", here->BSIM4v5sc);
|
||||
//printf("Warning: SC = %g is negative. Set to 0.0.\n", here->BSIM4v5sc);
|
||||
printf("Warning: SC = %g is negative. Set to 0.0.\n", here->BSIM4v5sc);
|
||||
here->BSIM4v5sc = 0.0;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -2247,18 +2247,6 @@ IFvalue *value;
|
|||
case BSIM4v5_MOD_KF:
|
||||
value->rValue = model->BSIM4v5kf;
|
||||
return(OK);
|
||||
case BSIM4v5_MOD_STIMOD:
|
||||
value->rValue = model->BSIM4v5stimod;
|
||||
return(OK);
|
||||
case BSIM4v5_MOD_RGEOMOD:
|
||||
value->rValue = model->BSIM4v5rgeomod;
|
||||
return(OK);
|
||||
case BSIM4v5_MOD_SA0:
|
||||
value->rValue = model->BSIM4v5sa0;
|
||||
return(OK);
|
||||
case BSIM4v5_MOD_SB0:
|
||||
value->rValue = model->BSIM4v5sb0;
|
||||
return(OK);
|
||||
default:
|
||||
return(E_BADPARM);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -3056,22 +3056,6 @@ GENmodel *inMod;
|
|||
mod->BSIM4v5kf = value->rValue;
|
||||
mod->BSIM4v5kfGiven = TRUE;
|
||||
break;
|
||||
case BSIM4v5_MOD_STIMOD :
|
||||
mod->BSIM4v5stimod = value->rValue;
|
||||
mod->BSIM4v5stimodGiven = TRUE;
|
||||
break;
|
||||
case BSIM4v5_MOD_RGEOMOD :
|
||||
mod->BSIM4v5rgeomod = value->rValue;
|
||||
mod->BSIM4v5rgeomodGiven = TRUE;
|
||||
break;
|
||||
case BSIM4v5_MOD_SA0 :
|
||||
mod->BSIM4v5sa0 = value->rValue;
|
||||
mod->BSIM4v5sa0Given = TRUE;
|
||||
break;
|
||||
case BSIM4v5_MOD_SB0 :
|
||||
mod->BSIM4v5sb0 = value->rValue;
|
||||
mod->BSIM4v5sb0Given = TRUE;
|
||||
break;
|
||||
case BSIM4v5_MOD_NMOS :
|
||||
if(value->iValue) {
|
||||
mod->BSIM4v5type = 1;
|
||||
|
|
|
|||
|
|
@ -1561,14 +1561,6 @@ JOB *job;
|
|||
model->BSIM4v5af = 1.0;
|
||||
if (!model->BSIM4v5kfGiven)
|
||||
model->BSIM4v5kf = 0.0;
|
||||
if (!model->BSIM4v5stimodGiven)
|
||||
model->BSIM4v5stimod = 0.0;
|
||||
if (!model->BSIM4v5rgeomodGiven)
|
||||
model->BSIM4v5rgeomod = 0;
|
||||
if (!model->BSIM4v5sa0Given)
|
||||
model->BSIM4v5sa0 = 0.0;
|
||||
if (!model->BSIM4v5sb0Given)
|
||||
model->BSIM4v5sb0 = 0.0;
|
||||
|
||||
/* stress effect */
|
||||
if (!model->BSIM4v5sarefGiven)
|
||||
|
|
@ -1663,9 +1655,9 @@ JOB *job;
|
|||
|
||||
for (here = model->BSIM4v5instances; here != NULL ;
|
||||
here=here->BSIM4v5nextInstance)
|
||||
{
|
||||
if (here->BSIM4v5owner == ARCHme) {
|
||||
/* allocate a chunk of the state vector */
|
||||
{
|
||||
if (here->BSIM4v5owner == ARCHme) {
|
||||
/* allocate a chunk of the state vector */
|
||||
here->BSIM4v5states = *states;
|
||||
*states += BSIM4v5numStates;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -343,29 +343,29 @@ int Size_Not_Found, i;
|
|||
/* loop through all the instances of the model */
|
||||
for (here = model->BSIM4v5instances; here != NULL;
|
||||
here = here->BSIM4v5nextInstance)
|
||||
{ if (here->BSIM4v5owner != ARCHme) continue;
|
||||
pSizeDependParamKnot = model->pSizeDependParamKnot;
|
||||
Size_Not_Found = 1;
|
||||
while ((pSizeDependParamKnot != NULL) && Size_Not_Found)
|
||||
{ if ((here->BSIM4v5l == pSizeDependParamKnot->Length)
|
||||
&& (here->BSIM4v5w == pSizeDependParamKnot->Width)
|
||||
&& (here->BSIM4v5nf == pSizeDependParamKnot->NFinger))
|
||||
{ if (here->BSIM4v5owner != ARCHme) continue;
|
||||
pSizeDependParamKnot = model->pSizeDependParamKnot;
|
||||
Size_Not_Found = 1;
|
||||
while ((pSizeDependParamKnot != NULL) && Size_Not_Found)
|
||||
{ if ((here->BSIM4v5l == pSizeDependParamKnot->Length)
|
||||
&& (here->BSIM4v5w == pSizeDependParamKnot->Width)
|
||||
&& (here->BSIM4v5nf == pSizeDependParamKnot->NFinger))
|
||||
{ Size_Not_Found = 0;
|
||||
here->pParam = pSizeDependParamKnot;
|
||||
pParam = here->pParam; /*bug-fix */
|
||||
}
|
||||
else
|
||||
{ pLastKnot = pSizeDependParamKnot;
|
||||
pSizeDependParamKnot = pSizeDependParamKnot->pNext;
|
||||
}
|
||||
here->pParam = pSizeDependParamKnot;
|
||||
pParam = here->pParam; /*bug-fix */
|
||||
}
|
||||
else
|
||||
{ pLastKnot = pSizeDependParamKnot;
|
||||
pSizeDependParamKnot = pSizeDependParamKnot->pNext;
|
||||
}
|
||||
}
|
||||
|
||||
/* stress effect */
|
||||
Ldrn = here->BSIM4v5l;
|
||||
Wdrn = here->BSIM4v5w / here->BSIM4v5nf;
|
||||
/* stress effect */
|
||||
Ldrn = here->BSIM4v5l;
|
||||
Wdrn = here->BSIM4v5w / here->BSIM4v5nf;
|
||||
|
||||
if (Size_Not_Found)
|
||||
{ pParam = (struct bsim4v5SizeDependParam *)tmalloc(
|
||||
if (Size_Not_Found)
|
||||
{ pParam = (struct bsim4v5SizeDependParam *)tmalloc(
|
||||
sizeof(struct bsim4v5SizeDependParam));
|
||||
if (pLastKnot == NULL)
|
||||
model->pSizeDependParamKnot = pParam;
|
||||
|
|
|
|||
|
|
@ -1470,13 +1470,6 @@ typedef struct sBSIM4v5model
|
|||
double BSIM4v5af;
|
||||
double BSIM4v5kf;
|
||||
|
||||
int BSIM4v5rgeomod;
|
||||
|
||||
/* strain parameters */
|
||||
double BSIM4v5stimod;
|
||||
double BSIM4v5sa0;
|
||||
double BSIM4v5sb0;
|
||||
|
||||
struct bsim4v5SizeDependParam *pSizeDependParamKnot;
|
||||
|
||||
/* Flags */
|
||||
|
|
@ -3050,12 +3043,6 @@ typedef struct sBSIM4v5model
|
|||
#define BSIM4v5_MOD_PUP 926
|
||||
#define BSIM4v5_MOD_PLP 927
|
||||
|
||||
#define BSIM4v5_MOD_STIMOD 930
|
||||
#define BSIM4v5_MOD_SA0 931
|
||||
#define BSIM4v5_MOD_SB0 932
|
||||
|
||||
#define BSIM4v5_MOD_RGEOMOD 933
|
||||
|
||||
/* device questions */
|
||||
#define BSIM4v5_DNODE 945
|
||||
#define BSIM4v5_GNODEEXT 946
|
||||
|
|
|
|||
Loading…
Reference in New Issue