diff --git a/src/spicelib/devices/bsim3/b3.c b/src/spicelib/devices/bsim3/b3.c index e14770458..eedf4e24e 100644 --- a/src/spicelib/devices/bsim3/b3.c +++ b/src/spicelib/devices/bsim3/b3.c @@ -185,6 +185,10 @@ IOP( "lwl", BSIM3_MOD_LWL, IF_REAL, "Length reduction parameter"), IOP( "lwlc", BSIM3_MOD_LWLC, IF_REAL, "Length reduction parameter for CV"), IOP( "lmin", BSIM3_MOD_LMIN, IF_REAL, "Minimum length for the model"), IOP( "lmax", BSIM3_MOD_LMAX, IF_REAL, "Maximum length for the model"), + +IOP( "xl", BSIM3_MOD_XL, IF_REAL, "Length correction parameter"), +IOP( "xw", BSIM3_MOD_XW, IF_REAL, "Width correction parameter"), + IOP( "wr", BSIM3_MOD_WR, IF_REAL, "Width dependence of rds"), IOP( "wint", BSIM3_MOD_WINT, IF_REAL, "Width reduction parameter"), IOP( "dwg", BSIM3_MOD_DWG, IF_REAL, "Width reduction parameter"), diff --git a/src/spicelib/devices/bsim3/b3mask.c b/src/spicelib/devices/bsim3/b3mask.c index 46955243e..822e95920 100644 --- a/src/spicelib/devices/bsim3/b3mask.c +++ b/src/spicelib/devices/bsim3/b3mask.c @@ -1251,6 +1251,14 @@ IFvalue *value) case BSIM3_MOD_WMAX: value->rValue = model->BSIM3Wmax; return(OK); + + case BSIM3_MOD_XL: + value->rValue = model->BSIM3xl; + return(OK); + case BSIM3_MOD_XW: + value->rValue = model->BSIM3xw; + return(OK); + case BSIM3_MOD_NOIA: value->rValue = model->BSIM3oxideTrapDensityA; return(OK); diff --git a/src/spicelib/devices/bsim3/b3mpar.c b/src/spicelib/devices/bsim3/b3mpar.c index 9b3699634..f43325ed8 100644 --- a/src/spicelib/devices/bsim3/b3mpar.c +++ b/src/spicelib/devices/bsim3/b3mpar.c @@ -1678,6 +1678,15 @@ GENmodel *inMod) mod->BSIM3WmaxGiven = TRUE; break; + case BSIM3_MOD_XL: + mod->BSIM3xl = value->rValue; + mod->BSIM3xlGiven = TRUE; + break; + case BSIM3_MOD_XW: + mod->BSIM3xw = value->rValue; + mod->BSIM3xwGiven = TRUE; + break; + case BSIM3_MOD_NOIA : mod->BSIM3oxideTrapDensityA = value->rValue; mod->BSIM3oxideTrapDensityAGiven = TRUE; diff --git a/src/spicelib/devices/bsim3/b3set.c b/src/spicelib/devices/bsim3/b3set.c index 379cc4b26..ef043998c 100644 --- a/src/spicelib/devices/bsim3/b3set.c +++ b/src/spicelib/devices/bsim3/b3set.c @@ -802,6 +802,12 @@ BSIM3instance **InstArray; model->BSIM3dwc = model->BSIM3Wint; if (!model->BSIM3dlcGiven) model->BSIM3dlc = model->BSIM3Lint; + + if (!model->BSIM3xlGiven) + model->BSIM3xl = 0.0; + if (!model->BSIM3xwGiven) + model->BSIM3xw = 0.0; + if (!model->BSIM3cfGiven) model->BSIM3cf = 2.0 * EPSOX / PI * log(1.0 + 0.4e-6 / model->BSIM3tox); diff --git a/src/spicelib/devices/bsim3/b3temp.c b/src/spicelib/devices/bsim3/b3temp.c index 0e1a18574..627d99749 100644 --- a/src/spicelib/devices/bsim3/b3temp.c +++ b/src/spicelib/devices/bsim3/b3temp.c @@ -193,7 +193,7 @@ int Size_Not_Found, error; + model->BSIM3Wwlc / (T2 * T3); pParam->BSIM3dwc = model->BSIM3dwc + tmp2; - pParam->BSIM3leff = here->BSIM3l - 2.0 * pParam->BSIM3dl; + pParam->BSIM3leff = here->BSIM3l + model->BSIM3xl - 2.0 * pParam->BSIM3dl; if (pParam->BSIM3leff <= 0.0) { IFuid namarray[2]; namarray[0] = model->BSIM3modName; @@ -204,7 +204,7 @@ int Size_Not_Found, error; return(E_BADPARM); } - pParam->BSIM3weff = here->BSIM3w - 2.0 * pParam->BSIM3dw; + pParam->BSIM3weff = here->BSIM3w + model->BSIM3xw - 2.0 * pParam->BSIM3dw; if (pParam->BSIM3weff <= 0.0) { IFuid namarray[2]; namarray[0] = model->BSIM3modName; @@ -215,7 +215,7 @@ int Size_Not_Found, error; return(E_BADPARM); } - pParam->BSIM3leffCV = here->BSIM3l - 2.0 * pParam->BSIM3dlc; + pParam->BSIM3leffCV = here->BSIM3l + model->BSIM3xl - 2.0 * pParam->BSIM3dlc; if (pParam->BSIM3leffCV <= 0.0) { IFuid namarray[2]; namarray[0] = model->BSIM3modName; @@ -226,7 +226,7 @@ int Size_Not_Found, error; return(E_BADPARM); } - pParam->BSIM3weffCV = here->BSIM3w - 2.0 * pParam->BSIM3dwc; + pParam->BSIM3weffCV = here->BSIM3w + model->BSIM3xw - 2.0 * pParam->BSIM3dwc; if (pParam->BSIM3weffCV <= 0.0) { IFuid namarray[2]; namarray[0] = model->BSIM3modName;