diff --git a/src/spicelib/devices/bsim4/b4.c b/src/spicelib/devices/bsim4/b4.c index a37a78c84..934e51e0e 100644 --- a/src/spicelib/devices/bsim4/b4.c +++ b/src/spicelib/devices/bsim4/b4.c @@ -55,6 +55,7 @@ IOP( "rbps", BSIM4_RBPS, IF_REAL , "Body resistance"), IOP( "rbpd", BSIM4_RBPD, IF_REAL , "Body resistance"), IOP( "delvto", BSIM4_DELVTO, IF_REAL , "Zero bias threshold voltage variation"), IOPR( "delvt0", BSIM4_DELVTO, IF_REAL , "Zero bias threshold voltage variation"), +IOP( "mulu0", BSIM4_MULU0, IF_REAL, "Low field mobility multiplier"), IOP( "xgw", BSIM4_XGW, IF_REAL, "Distance from gate contact center to device edge"), IOP( "ngcon", BSIM4_NGCON, IF_REAL, "Number of gate contacts"), diff --git a/src/spicelib/devices/bsim4/b4ask.c b/src/spicelib/devices/bsim4/b4ask.c index 21266d2fc..2ca51bca0 100644 --- a/src/spicelib/devices/bsim4/b4ask.c +++ b/src/spicelib/devices/bsim4/b4ask.c @@ -111,6 +111,9 @@ BSIM4instance *here = (BSIM4instance*)inst; case BSIM4_DELVTO: value->rValue = here->BSIM4delvto; return(OK); + case BSIM4_MULU0: + value->rValue = here->BSIM4mulu0; + return(OK); case BSIM4_XGW: value->rValue = here->BSIM4xgw; return(OK); diff --git a/src/spicelib/devices/bsim4/b4par.c b/src/spicelib/devices/bsim4/b4par.c index 6a2fa7ca4..d84ddda49 100644 --- a/src/spicelib/devices/bsim4/b4par.c +++ b/src/spicelib/devices/bsim4/b4par.c @@ -137,6 +137,10 @@ IFvalue *select) here->BSIM4delvto = value->rValue; here->BSIM4delvtoGiven = TRUE; break; + case BSIM4_MULU0: + here->BSIM4mulu0 = value->rValue; + here->BSIM4mulu0Given = TRUE; + break; case BSIM4_XGW: here->BSIM4xgw = value->rValue; here->BSIM4xgwGiven = TRUE; diff --git a/src/spicelib/devices/bsim4/b4set.c b/src/spicelib/devices/bsim4/b4set.c index 9dbfb389c..99b92935e 100644 --- a/src/spicelib/devices/bsim4/b4set.c +++ b/src/spicelib/devices/bsim4/b4set.c @@ -2326,6 +2326,8 @@ BSIM4instance **InstArray; here->BSIM4rbpd = model->BSIM4rbpd; if (!here->BSIM4delvtoGiven) here->BSIM4delvto = 0.0; + if (!here->BSIM4mulu0Given) + here->BSIM4mulu0 = 1.0; if (!here->BSIM4xgwGiven) here->BSIM4xgw = model->BSIM4xgw; if (!here->BSIM4ngconGiven) diff --git a/src/spicelib/devices/bsim4/b4temp.c b/src/spicelib/devices/bsim4/b4temp.c index eb1367a7e..9b71b127d 100644 --- a/src/spicelib/devices/bsim4/b4temp.c +++ b/src/spicelib/devices/bsim4/b4temp.c @@ -1718,6 +1718,9 @@ int Size_Not_Found, i; here->BSIM4vth0 += here->BSIM4delvto; here->BSIM4vfb = pParam->BSIM4vfb + model->BSIM4type * here->BSIM4delvto; + /* low field mobility multiplier */ + here->BSIM4u0temp = pParam->BSIM4u0temp * here->BSIM4mulu0; + /* Instance variables calculation */ T3 = model->BSIM4type * here->BSIM4vth0 - here->BSIM4vfb - pParam->BSIM4phi; diff --git a/src/spicelib/devices/bsim4/bsim4def.h b/src/spicelib/devices/bsim4/bsim4def.h index b3206d16e..0b4efec63 100644 --- a/src/spicelib/devices/bsim4/bsim4def.h +++ b/src/spicelib/devices/bsim4/bsim4def.h @@ -109,6 +109,7 @@ typedef struct sBSIM4instance double BSIM4rbpd; double BSIM4delvto; + double BSIM4mulu0; double BSIM4xgw; double BSIM4ngcon; @@ -295,6 +296,7 @@ typedef struct sBSIM4instance unsigned BSIM4rbpdGiven :1; unsigned BSIM4rbpsGiven :1; unsigned BSIM4delvtoGiven :1; + unsigned BSIM4mulu0Given :1; unsigned BSIM4xgwGiven :1; unsigned BSIM4ngconGiven :1; unsigned BSIM4icVDSGiven :1; @@ -2755,6 +2757,7 @@ typedef struct sBSIM4model #define BSIM4_SCC 36 #define BSIM4_SC 37 #define BSIM4_M 38 +#define BSIM4_MULU0 39 /* Global parameters */ #define BSIM4_MOD_TEMPEOT 65 diff --git a/src/spicelib/devices/bsim4v7/b4v7.c b/src/spicelib/devices/bsim4v7/b4v7.c index ea633ee38..95407b61e 100644 --- a/src/spicelib/devices/bsim4v7/b4v7.c +++ b/src/spicelib/devices/bsim4v7/b4v7.c @@ -53,6 +53,7 @@ IOP( "rbps", BSIM4v7_RBPS, IF_REAL , "Body resistance"), IOP( "rbpd", BSIM4v7_RBPD, IF_REAL , "Body resistance"), IOP( "delvto", BSIM4v7_DELVTO, IF_REAL , "Zero bias threshold voltage variation"), IOPR( "delvt0", BSIM4v7_DELVTO, IF_REAL , "Zero bias threshold voltage variation"), +IOP( "mulu0", BSIM4v7_MULU0, IF_REAL, "Low field mobility multiplier"), IOP( "xgw", BSIM4v7_XGW, IF_REAL, "Distance from gate contact center to device edge"), IOP( "ngcon", BSIM4v7_NGCON, IF_REAL, "Number of gate contacts"), diff --git a/src/spicelib/devices/bsim4v7/b4v7ask.c b/src/spicelib/devices/bsim4v7/b4v7ask.c index b23b92666..2b77f77f0 100644 --- a/src/spicelib/devices/bsim4v7/b4v7ask.c +++ b/src/spicelib/devices/bsim4v7/b4v7ask.c @@ -111,6 +111,9 @@ BSIM4v7instance *here = (BSIM4v7instance*)inst; case BSIM4v7_DELVTO: value->rValue = here->BSIM4v7delvto; return(OK); + case BSIM4v7_MULU0: + value->rValue = here->BSIM4v7mulu0; + return(OK); case BSIM4v7_XGW: value->rValue = here->BSIM4v7xgw; return(OK); diff --git a/src/spicelib/devices/bsim4v7/b4v7par.c b/src/spicelib/devices/bsim4v7/b4v7par.c index 3301e2366..ea503747f 100644 --- a/src/spicelib/devices/bsim4v7/b4v7par.c +++ b/src/spicelib/devices/bsim4v7/b4v7par.c @@ -137,6 +137,10 @@ IFvalue *select) here->BSIM4v7delvto = value->rValue; here->BSIM4v7delvtoGiven = TRUE; break; + case BSIM4v7_MULU0: + here->BSIM4v7mulu0 = value->rValue; + here->BSIM4v7mulu0Given = TRUE; + break; case BSIM4v7_XGW: here->BSIM4v7xgw = value->rValue; here->BSIM4v7xgwGiven = TRUE; diff --git a/src/spicelib/devices/bsim4v7/b4v7set.c b/src/spicelib/devices/bsim4v7/b4v7set.c index e34e8a93c..4ad16d83f 100644 --- a/src/spicelib/devices/bsim4v7/b4v7set.c +++ b/src/spicelib/devices/bsim4v7/b4v7set.c @@ -2241,6 +2241,8 @@ BSIM4v7instance **InstArray; here->BSIM4v7rbpd = model->BSIM4v7rbpd; if (!here->BSIM4v7delvtoGiven) here->BSIM4v7delvto = 0.0; + if (!here->BSIM4v7mulu0Given) + here->BSIM4v7mulu0 = 1.0; if (!here->BSIM4v7xgwGiven) here->BSIM4v7xgw = model->BSIM4v7xgw; if (!here->BSIM4v7ngconGiven) diff --git a/src/spicelib/devices/bsim4v7/b4v7temp.c b/src/spicelib/devices/bsim4v7/b4v7temp.c index 03a9a6a59..089de1aeb 100644 --- a/src/spicelib/devices/bsim4v7/b4v7temp.c +++ b/src/spicelib/devices/bsim4v7/b4v7temp.c @@ -1650,6 +1650,9 @@ int Size_Not_Found, i; here->BSIM4v7vth0 += here->BSIM4v7delvto; here->BSIM4v7vfb = pParam->BSIM4v7vfb + model->BSIM4v7type * here->BSIM4v7delvto; + /* low field mobility multiplier */ + here->BSIM4v7u0temp = pParam->BSIM4v7u0temp * here->BSIM4v7mulu0; + /* Instance variables calculation */ T3 = model->BSIM4v7type * here->BSIM4v7vth0 - here->BSIM4v7vfb - pParam->BSIM4v7phi; diff --git a/src/spicelib/devices/bsim4v7/bsim4v7def.h b/src/spicelib/devices/bsim4v7/bsim4v7def.h index 838644242..8ca3d86a4 100644 --- a/src/spicelib/devices/bsim4v7/bsim4v7def.h +++ b/src/spicelib/devices/bsim4v7/bsim4v7def.h @@ -108,6 +108,7 @@ typedef struct sBSIM4v7instance double BSIM4v7rbpd; double BSIM4v7delvto; + double BSIM4v7mulu0; double BSIM4v7xgw; double BSIM4v7ngcon; @@ -292,6 +293,7 @@ typedef struct sBSIM4v7instance unsigned BSIM4v7rbpdGiven :1; unsigned BSIM4v7rbpsGiven :1; unsigned BSIM4v7delvtoGiven :1; + unsigned BSIM4v7mulu0Given :1; unsigned BSIM4v7xgwGiven :1; unsigned BSIM4v7ngconGiven :1; unsigned BSIM4v7icVDSGiven :1; @@ -2749,6 +2751,7 @@ typedef struct sBSIM4v7model #define BSIM4v7_SCC 36 #define BSIM4v7_SC 37 #define BSIM4v7_M 38 +#define BSIM4v7_MULU0 39 /* Global parameters */ #define BSIM4v7_MOD_TEMPEOT 65