no stimod switch as model parameter

This commit is contained in:
dwarning 2008-11-26 21:12:34 +00:00
parent 75f68291aa
commit 9e24a8ac83
14 changed files with 40 additions and 149 deletions

View File

@ -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

View File

@ -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"),
};

View File

@ -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) &&

View File

@ -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);
}

View File

@ -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;

View File

@ -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))

View File

@ -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

View File

@ -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"),
};

View File

@ -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;
}
}

View File

@ -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);
}

View File

@ -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;

View File

@ -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;
}

View File

@ -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;

View File

@ -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