diff --git a/src/spicelib/devices/bsim4/b4.c b/src/spicelib/devices/bsim4/b4.c index b48168e14..3353b2133 100644 --- a/src/spicelib/devices/bsim4/b4.c +++ b/src/spicelib/devices/bsim4/b4.c @@ -124,6 +124,7 @@ IOP( "rbodymod", BSIM4_MOD_RBODYMOD, IF_INTEGER, "Distributed body R model selec IOP( "rgatemod", BSIM4_MOD_RGATEMOD, IF_INTEGER, "Gate R model selector"), IOP( "permod", BSIM4_MOD_PERMOD, IF_INTEGER, "Pd and Ps model selector"), IOP( "geomod", BSIM4_MOD_GEOMOD, IF_INTEGER, "Geometry dependent parasitics model selector"), +IOP( "rgeomod", BSIM4_MOD_RGEOMOD, IF_INTEGER, "S/D resistance and contact model selector"), IOP( "fnoimod", BSIM4_MOD_FNOIMOD, IF_INTEGER, "Flicker noise model selector"), IOP( "tnoimod", BSIM4_MOD_TNOIMOD, IF_INTEGER, "Thermal noise model selector"), IOP( "mtrlmod", BSIM4_MOD_MTRLMOD, IF_INTEGER, "parameter for non-silicon substrate or metal gate selector"), diff --git a/src/spicelib/devices/bsim4/b4mask.c b/src/spicelib/devices/bsim4/b4mask.c index 52fcd9a96..4b2487834 100644 --- a/src/spicelib/devices/bsim4/b4mask.c +++ b/src/spicelib/devices/bsim4/b4mask.c @@ -84,6 +84,9 @@ IFvalue *value) case BSIM4_MOD_GEOMOD : value->iValue = model->BSIM4geoMod; return(OK); + case BSIM4_MOD_RGEOMOD : + value->iValue = model->BSIM4rgeoMod; + return(OK); case BSIM4_MOD_MTRLMOD : value->iValue = model->BSIM4mtrlMod; return(OK); diff --git a/src/spicelib/devices/bsim4/b4mpar.c b/src/spicelib/devices/bsim4/b4mpar.c index bcf8d6cf8..ca3578a3c 100644 --- a/src/spicelib/devices/bsim4/b4mpar.c +++ b/src/spicelib/devices/bsim4/b4mpar.c @@ -88,6 +88,10 @@ GENmodel *inMod) mod->BSIM4geoMod = value->iValue; mod->BSIM4geoModGiven = TRUE; break; + case BSIM4_MOD_RGEOMOD : + mod->BSIM4rgeoMod = value->iValue; + mod->BSIM4rgeoModGiven = TRUE; + break; case BSIM4_MOD_FNOIMOD : mod->BSIM4fnoiMod = value->iValue; mod->BSIM4fnoiModGiven = TRUE; diff --git a/src/spicelib/devices/bsim4/b4set.c b/src/spicelib/devices/bsim4/b4set.c index 2c58e9693..dd7ce8948 100644 --- a/src/spicelib/devices/bsim4/b4set.c +++ b/src/spicelib/devices/bsim4/b4set.c @@ -139,6 +139,12 @@ BSIM4instance **InstArray; if (!model->BSIM4geoModGiven) model->BSIM4geoMod = 0; + if (!model->BSIM4rgeoModGiven) + model->BSIM4rgeoMod = 0; + else if ((model->BSIM4rgeoMod != 0) && (model->BSIM4rgeoMod != 1)) + { model->BSIM4rgeoMod = 1; + printf("Warning: rgeoMod has been set to its default value: 1.\n"); + } if (!model->BSIM4fnoiModGiven) model->BSIM4fnoiMod = 1; else if ((model->BSIM4fnoiMod != 0) && (model->BSIM4fnoiMod != 1)) @@ -2250,8 +2256,15 @@ BSIM4instance **InstArray; if (!here->BSIM4geoModGiven) here->BSIM4geoMod = model->BSIM4geoMod; + if (!here->BSIM4rgeoModGiven) - here->BSIM4rgeoMod = 0; + here->BSIM4rgeoMod = model->BSIM4rgeoMod; + else if ((here->BSIM4rgeoMod != 0) && (here->BSIM4rgeoMod != 1)) + { here->BSIM4rgeoMod = model->BSIM4rgeoMod; + printf("Warning: rgeoMod has been set to its global value %d.\n", + model->BSIM4rgeoMod); + } + if (!here->BSIM4trnqsModGiven) here->BSIM4trnqsMod = model->BSIM4trnqsMod; else if ((here->BSIM4trnqsMod != 0) && (here->BSIM4trnqsMod != 1)) diff --git a/src/spicelib/devices/bsim4/bsim4def.h b/src/spicelib/devices/bsim4/bsim4def.h index 5f1cbec06..3505fc347 100644 --- a/src/spicelib/devices/bsim4/bsim4def.h +++ b/src/spicelib/devices/bsim4/bsim4def.h @@ -830,6 +830,7 @@ typedef struct sBSIM4model int BSIM4rgateMod; int BSIM4perMod; int BSIM4geoMod; + int BSIM4rgeoMod; int BSIM4mtrlMod; int BSIM4mtrlCompatMod; /* v4.7 */ int BSIM4gidlMod; /* v4.7 New GIDL/GISL */ @@ -1781,6 +1782,7 @@ typedef struct sBSIM4model unsigned BSIM4rgateModGiven :1; unsigned BSIM4perModGiven :1; unsigned BSIM4geoModGiven :1; + unsigned BSIM4rgeoModGiven :1; unsigned BSIM4paramChkGiven :1; unsigned BSIM4trnqsModGiven :1; unsigned BSIM4acnqsModGiven :1; @@ -2732,30 +2734,31 @@ typedef struct sBSIM4model #define BSIM4_M 38 /* Global parameters */ -#define BSIM4_MOD_TEMPEOT 66 -#define BSIM4_MOD_LEFFEOT 67 -#define BSIM4_MOD_WEFFEOT 68 -#define BSIM4_MOD_UCSTE 69 -#define BSIM4_MOD_LUCSTE 70 -#define BSIM4_MOD_WUCSTE 71 -#define BSIM4_MOD_PUCSTE 72 -#define BSIM4_MOD_UCS 73 -#define BSIM4_MOD_LUCS 74 -#define BSIM4_MOD_WUCS 75 -#define BSIM4_MOD_PUCS 76 -#define BSIM4_MOD_CVCHARGEMOD 77 -#define BSIM4_MOD_ADOS 78 -#define BSIM4_MOD_BDOS 79 -#define BSIM4_MOD_TEMPMOD 80 -#define BSIM4_MOD_MTRLMOD 81 -#define BSIM4_MOD_IGCMOD 82 -#define BSIM4_MOD_IGBMOD 83 -#define BSIM4_MOD_ACNQSMOD 84 -#define BSIM4_MOD_FNOIMOD 85 -#define BSIM4_MOD_RDSMOD 86 -#define BSIM4_MOD_DIOMOD 87 -#define BSIM4_MOD_PERMOD 88 -#define BSIM4_MOD_GEOMOD 89 +#define BSIM4_MOD_TEMPEOT 65 +#define BSIM4_MOD_LEFFEOT 66 +#define BSIM4_MOD_WEFFEOT 67 +#define BSIM4_MOD_UCSTE 68 +#define BSIM4_MOD_LUCSTE 69 +#define BSIM4_MOD_WUCSTE 70 +#define BSIM4_MOD_PUCSTE 71 +#define BSIM4_MOD_UCS 72 +#define BSIM4_MOD_LUCS 73 +#define BSIM4_MOD_WUCS 74 +#define BSIM4_MOD_PUCS 75 +#define BSIM4_MOD_CVCHARGEMOD 76 +#define BSIM4_MOD_ADOS 77 +#define BSIM4_MOD_BDOS 78 +#define BSIM4_MOD_TEMPMOD 79 +#define BSIM4_MOD_MTRLMOD 80 +#define BSIM4_MOD_IGCMOD 81 +#define BSIM4_MOD_IGBMOD 82 +#define BSIM4_MOD_ACNQSMOD 83 +#define BSIM4_MOD_FNOIMOD 84 +#define BSIM4_MOD_RDSMOD 85 +#define BSIM4_MOD_DIOMOD 86 +#define BSIM4_MOD_PERMOD 87 +#define BSIM4_MOD_GEOMOD 88 +#define BSIM4_MOD_RGEOMOD 89 #define BSIM4_MOD_RGATEMOD 90 #define BSIM4_MOD_RBODYMOD 91 #define BSIM4_MOD_CAPMOD 92 diff --git a/src/spicelib/devices/bsim4v5/b4v5.c b/src/spicelib/devices/bsim4v5/b4v5.c index c32892bb4..2f6ecea14 100644 --- a/src/spicelib/devices/bsim4v5/b4v5.c +++ b/src/spicelib/devices/bsim4v5/b4v5.c @@ -116,6 +116,7 @@ IOP( "rbodymod", BSIM4v5_MOD_RBODYMOD, IF_INTEGER, "Distributed body R model sel IOP( "rgatemod", BSIM4v5_MOD_RGATEMOD, IF_INTEGER, "Gate R model selector"), IOP( "permod", BSIM4v5_MOD_PERMOD, IF_INTEGER, "Pd and Ps model selector"), IOP( "geomod", BSIM4v5_MOD_GEOMOD, IF_INTEGER, "Geometry dependent parasitics model selector"), +IOP( "rgeomod", BSIM4v5_MOD_RGEOMOD, IF_INTEGER, "S/D resistance and contact model selector"), IOP( "fnoimod", BSIM4v5_MOD_FNOIMOD, IF_INTEGER, "Flicker noise model selector"), IOP( "tnoimod", BSIM4v5_MOD_TNOIMOD, IF_INTEGER, "Thermal noise model selector"), IOP( "igcmod", BSIM4v5_MOD_IGCMOD, IF_INTEGER, "Gate-to-channel Ig model selector"), diff --git a/src/spicelib/devices/bsim4v5/b4v5mask.c b/src/spicelib/devices/bsim4v5/b4v5mask.c index c5be19b88..909f2fa14 100644 --- a/src/spicelib/devices/bsim4v5/b4v5mask.c +++ b/src/spicelib/devices/bsim4v5/b4v5mask.c @@ -76,6 +76,9 @@ IFvalue *value) case BSIM4v5_MOD_GEOMOD : value->iValue = model->BSIM4v5geoMod; return(OK); + case BSIM4v5_MOD_RGEOMOD : + value->iValue = model->BSIM4v5rgeoMod; + return(OK); case BSIM4v5_MOD_IGCMOD : value->iValue = model->BSIM4v5igcMod; return(OK); diff --git a/src/spicelib/devices/bsim4v5/b4v5mpar.c b/src/spicelib/devices/bsim4v5/b4v5mpar.c index 750e24de3..7b138f18d 100644 --- a/src/spicelib/devices/bsim4v5/b4v5mpar.c +++ b/src/spicelib/devices/bsim4v5/b4v5mpar.c @@ -77,6 +77,10 @@ GENmodel *inMod) mod->BSIM4v5geoMod = value->iValue; mod->BSIM4v5geoModGiven = TRUE; break; + case BSIM4v5_MOD_RGEOMOD : + mod->BSIM4v5rgeoMod = value->iValue; + mod->BSIM4v5rgeoModGiven = TRUE; + break; case BSIM4v5_MOD_FNOIMOD : mod->BSIM4v5fnoiMod = value->iValue; mod->BSIM4v5fnoiModGiven = TRUE; diff --git a/src/spicelib/devices/bsim4v5/b4v5set.c b/src/spicelib/devices/bsim4v5/b4v5set.c index 3d23a91a8..f3909ae14 100644 --- a/src/spicelib/devices/bsim4v5/b4v5set.c +++ b/src/spicelib/devices/bsim4v5/b4v5set.c @@ -122,6 +122,13 @@ JOB *job; if (!model->BSIM4v5geoModGiven) model->BSIM4v5geoMod = 0; + if (!model->BSIM4v5rgeoModGiven) + model->BSIM4v5rgeoMod = 0; + else if ((model->BSIM4v5rgeoMod != 0) && (model->BSIM4v5rgeoMod != 1)) + { model->BSIM4v5rgeoMod = 1; + printf("Warning: rgeoMod has been set to its default value: 1.\n"); + } + if (!model->BSIM4v5fnoiModGiven) model->BSIM4v5fnoiMod = 1; else if ((model->BSIM4v5fnoiMod != 0) && (model->BSIM4v5fnoiMod != 1)) @@ -1735,8 +1742,14 @@ JOB *job; if (!here->BSIM4v5geoModGiven) here->BSIM4v5geoMod = model->BSIM4v5geoMod; + if (!here->BSIM4v5rgeoModGiven) - here->BSIM4v5rgeoMod = 0; + here->BSIM4v5rgeoMod = model->BSIM4v5rgeoMod; + else if ((here->BSIM4v5rgeoMod != 0) && (here->BSIM4v5rgeoMod != 1)) + { here->BSIM4v5rgeoMod = model->BSIM4v5rgeoMod; + printf("Warning: rgeoMod has been set to its global value %d.\n", + model->BSIM4v5rgeoMod); + } if (!here->BSIM4v5trnqsModGiven) here->BSIM4v5trnqsMod = model->BSIM4v5trnqsMod; else if ((here->BSIM4v5trnqsMod != 0) && (here->BSIM4v5trnqsMod != 1)) diff --git a/src/spicelib/devices/bsim4v5/bsim4v5def.h b/src/spicelib/devices/bsim4v5/bsim4v5def.h index a44504518..3a7a59855 100644 --- a/src/spicelib/devices/bsim4v5/bsim4v5def.h +++ b/src/spicelib/devices/bsim4v5/bsim4v5def.h @@ -673,6 +673,7 @@ typedef struct sBSIM4v5model int BSIM4v5rgateMod; int BSIM4v5perMod; int BSIM4v5geoMod; + int BSIM4v5rgeoMod; int BSIM4v5igcMod; int BSIM4v5igbMod; int BSIM4v5tempMod; @@ -1486,6 +1487,7 @@ typedef struct sBSIM4v5model unsigned BSIM4v5rgateModGiven :1; unsigned BSIM4v5perModGiven :1; unsigned BSIM4v5geoModGiven :1; + unsigned BSIM4v5rgeoModGiven :1; unsigned BSIM4v5paramChkGiven :1; unsigned BSIM4v5trnqsModGiven :1; unsigned BSIM4v5acnqsModGiven :1; @@ -2310,9 +2312,10 @@ typedef struct sBSIM4v5model #define BSIM4v5_MOD_ACNQSMOD 92 #define BSIM4v5_MOD_FNOIMOD 93 #define BSIM4v5_MOD_RDSMOD 94 -#define BSIM4v5_MOD_DIOMOD 96 -#define BSIM4v5_MOD_PERMOD 97 -#define BSIM4v5_MOD_GEOMOD 98 +#define BSIM4v5_MOD_DIOMOD 95 +#define BSIM4v5_MOD_PERMOD 96 +#define BSIM4v5_MOD_GEOMOD 97 +#define BSIM4v5_MOD_RGEOMOD 98 #define BSIM4v5_MOD_RGATEMOD 99 #define BSIM4v5_MOD_RBODYMOD 100 #define BSIM4v5_MOD_CAPMOD 101 diff --git a/src/spicelib/devices/bsim4v6/b4v6.c b/src/spicelib/devices/bsim4v6/b4v6.c index 5b422cf1f..acb95ab00 100644 --- a/src/spicelib/devices/bsim4v6/b4v6.c +++ b/src/spicelib/devices/bsim4v6/b4v6.c @@ -123,6 +123,7 @@ IOP( "rbodymod", BSIM4v6_MOD_RBODYMOD, IF_INTEGER, "Distributed body R model sel IOP( "rgatemod", BSIM4v6_MOD_RGATEMOD, IF_INTEGER, "Gate R model selector"), IOP( "permod", BSIM4v6_MOD_PERMOD, IF_INTEGER, "Pd and Ps model selector"), IOP( "geomod", BSIM4v6_MOD_GEOMOD, IF_INTEGER, "Geometry dependent parasitics model selector"), +IOP( "rgeomod", BSIM4v6_MOD_RGEOMOD, IF_INTEGER, "S/D resistance and contact model selector"), IOP( "fnoimod", BSIM4v6_MOD_FNOIMOD, IF_INTEGER, "Flicker noise model selector"), IOP( "tnoimod", BSIM4v6_MOD_TNOIMOD, IF_INTEGER, "Thermal noise model selector"), IOP( "mtrlmod", BSIM4v6_MOD_MTRLMOD, IF_INTEGER, "parameter for non-silicon substrate or metal gate selector"), diff --git a/src/spicelib/devices/bsim4v6/b4v6mask.c b/src/spicelib/devices/bsim4v6/b4v6mask.c index 626b43388..39bb05a0a 100644 --- a/src/spicelib/devices/bsim4v6/b4v6mask.c +++ b/src/spicelib/devices/bsim4v6/b4v6mask.c @@ -83,6 +83,9 @@ IFvalue *value) case BSIM4v6_MOD_GEOMOD : value->iValue = model->BSIM4v6geoMod; return(OK); + case BSIM4v6_MOD_RGEOMOD : + value->iValue = model->BSIM4v6rgeoMod; + return(OK); case BSIM4v6_MOD_MTRLMOD : value->iValue = model->BSIM4v6mtrlMod; return(OK); diff --git a/src/spicelib/devices/bsim4v6/b4v6mpar.c b/src/spicelib/devices/bsim4v6/b4v6mpar.c index 0d70ae64e..181139846 100644 --- a/src/spicelib/devices/bsim4v6/b4v6mpar.c +++ b/src/spicelib/devices/bsim4v6/b4v6mpar.c @@ -87,6 +87,10 @@ GENmodel *inMod) mod->BSIM4v6geoMod = value->iValue; mod->BSIM4v6geoModGiven = TRUE; break; + case BSIM4v6_MOD_RGEOMOD : + mod->BSIM4v6rgeoMod = value->iValue; + mod->BSIM4v6rgeoModGiven = TRUE; + break; case BSIM4v6_MOD_FNOIMOD : mod->BSIM4v6fnoiMod = value->iValue; mod->BSIM4v6fnoiModGiven = TRUE; diff --git a/src/spicelib/devices/bsim4v6/b4v6set.c b/src/spicelib/devices/bsim4v6/b4v6set.c index 6cd97e4cc..fe2e32cb0 100644 --- a/src/spicelib/devices/bsim4v6/b4v6set.c +++ b/src/spicelib/devices/bsim4v6/b4v6set.c @@ -140,6 +140,12 @@ BSIM4v6instance **InstArray; if (!model->BSIM4v6geoModGiven) model->BSIM4v6geoMod = 0; + if (!model->BSIM4v6rgeoModGiven) + model->BSIM4v6rgeoMod = 0; + else if ((model->BSIM4v6rgeoMod != 0) && (model->BSIM4v6rgeoMod != 1)) + { model->BSIM4v6rgeoMod = 1; + printf("Warning: rgeoMod has been set to its default value: 1.\n"); + } if (!model->BSIM4v6fnoiModGiven) model->BSIM4v6fnoiMod = 1; else if ((model->BSIM4v6fnoiMod != 0) && (model->BSIM4v6fnoiMod != 1)) @@ -2099,8 +2105,14 @@ BSIM4v6instance **InstArray; if (!here->BSIM4v6geoModGiven) here->BSIM4v6geoMod = model->BSIM4v6geoMod; + if (!here->BSIM4v6rgeoModGiven) - here->BSIM4v6rgeoMod = 0; + here->BSIM4v6rgeoMod = model->BSIM4v6rgeoMod; + else if ((here->BSIM4v6rgeoMod != 0) && (here->BSIM4v6rgeoMod != 1)) + { here->BSIM4v6rgeoMod = model->BSIM4v6rgeoMod; + printf("Warning: rgeoMod has been set to its global value %d.\n", + model->BSIM4v6rgeoMod); + } if (!here->BSIM4v6trnqsModGiven) here->BSIM4v6trnqsMod = model->BSIM4v6trnqsMod; else if ((here->BSIM4v6trnqsMod != 0) && (here->BSIM4v6trnqsMod != 1)) diff --git a/src/spicelib/devices/bsim4v6/bsim4v6def.h b/src/spicelib/devices/bsim4v6/bsim4v6def.h index 5961b14a3..fc0900441 100644 --- a/src/spicelib/devices/bsim4v6/bsim4v6def.h +++ b/src/spicelib/devices/bsim4v6/bsim4v6def.h @@ -814,6 +814,7 @@ typedef struct sBSIM4v6model int BSIM4v6rgateMod; int BSIM4v6perMod; int BSIM4v6geoMod; + int BSIM4v6rgeoMod; int BSIM4v6mtrlMod; int BSIM4v6igcMod; int BSIM4v6igbMod; @@ -1710,6 +1711,7 @@ typedef struct sBSIM4v6model unsigned BSIM4v6rgateModGiven :1; unsigned BSIM4v6perModGiven :1; unsigned BSIM4v6geoModGiven :1; + unsigned BSIM4v6rgeoModGiven :1; unsigned BSIM4v6paramChkGiven :1; unsigned BSIM4v6trnqsModGiven :1; unsigned BSIM4v6acnqsModGiven :1; @@ -2605,30 +2607,31 @@ typedef struct sBSIM4v6model #define BSIM4v6_M 38 /* Global parameters */ -#define BSIM4v6_MOD_TEMPEOT 66 -#define BSIM4v6_MOD_LEFFEOT 67 -#define BSIM4v6_MOD_WEFFEOT 68 -#define BSIM4v6_MOD_UCSTE 69 -#define BSIM4v6_MOD_LUCSTE 70 -#define BSIM4v6_MOD_WUCSTE 71 -#define BSIM4v6_MOD_PUCSTE 72 -#define BSIM4v6_MOD_UCS 73 -#define BSIM4v6_MOD_LUCS 74 -#define BSIM4v6_MOD_WUCS 75 -#define BSIM4v6_MOD_PUCS 76 -#define BSIM4v6_MOD_CVCHARGEMOD 77 -#define BSIM4v6_MOD_ADOS 78 -#define BSIM4v6_MOD_BDOS 79 -#define BSIM4v6_MOD_TEMPMOD 80 -#define BSIM4v6_MOD_MTRLMOD 81 -#define BSIM4v6_MOD_IGCMOD 82 -#define BSIM4v6_MOD_IGBMOD 83 -#define BSIM4v6_MOD_ACNQSMOD 84 -#define BSIM4v6_MOD_FNOIMOD 85 -#define BSIM4v6_MOD_RDSMOD 86 -#define BSIM4v6_MOD_DIOMOD 87 -#define BSIM4v6_MOD_PERMOD 88 -#define BSIM4v6_MOD_GEOMOD 89 +#define BSIM4v6_MOD_TEMPEOT 65 +#define BSIM4v6_MOD_LEFFEOT 66 +#define BSIM4v6_MOD_WEFFEOT 67 +#define BSIM4v6_MOD_UCSTE 68 +#define BSIM4v6_MOD_LUCSTE 69 +#define BSIM4v6_MOD_WUCSTE 70 +#define BSIM4v6_MOD_PUCSTE 71 +#define BSIM4v6_MOD_UCS 72 +#define BSIM4v6_MOD_LUCS 73 +#define BSIM4v6_MOD_WUCS 74 +#define BSIM4v6_MOD_PUCS 75 +#define BSIM4v6_MOD_CVCHARGEMOD 76 +#define BSIM4v6_MOD_ADOS 77 +#define BSIM4v6_MOD_BDOS 78 +#define BSIM4v6_MOD_TEMPMOD 79 +#define BSIM4v6_MOD_MTRLMOD 80 +#define BSIM4v6_MOD_IGCMOD 81 +#define BSIM4v6_MOD_IGBMOD 82 +#define BSIM4v6_MOD_ACNQSMOD 83 +#define BSIM4v6_MOD_FNOIMOD 84 +#define BSIM4v6_MOD_RDSMOD 85 +#define BSIM4v6_MOD_DIOMOD 86 +#define BSIM4v6_MOD_PERMOD 87 +#define BSIM4v6_MOD_GEOMOD 88 +#define BSIM4v6_MOD_RGEOMOD 89 #define BSIM4v6_MOD_RGATEMOD 90 #define BSIM4v6_MOD_RBODYMOD 91 #define BSIM4v6_MOD_CAPMOD 92