From 27ae680b99e87eb197338b00670e4ec912fd7e92 Mon Sep 17 00:00:00 2001 From: dwarning Date: Thu, 23 May 2013 23:13:10 +0200 Subject: [PATCH] add nqsmod as model parameter for bsim3 --- src/spicelib/devices/bsim3/b3.c | 1 + src/spicelib/devices/bsim3/b3mask.c | 3 ++ src/spicelib/devices/bsim3/b3mpar.c | 6 +++- src/spicelib/devices/bsim3/b3set.c | 13 +++++++- src/spicelib/devices/bsim3/bsim3def.h | 5 +++- src/spicelib/devices/bsim3v32/b3v32.c | 1 + src/spicelib/devices/bsim3v32/b3v32mask.c | 3 ++ src/spicelib/devices/bsim3v32/b3v32mpar.c | 4 +++ src/spicelib/devices/bsim3v32/b3v32set.c | 13 +++++++- src/spicelib/devices/bsim3v32/bsim3v32def.h | 33 +++++++++++---------- 10 files changed, 63 insertions(+), 19 deletions(-) diff --git a/src/spicelib/devices/bsim3/b3.c b/src/spicelib/devices/bsim3/b3.c index 985e7b32d..ac2dbd20f 100644 --- a/src/spicelib/devices/bsim3/b3.c +++ b/src/spicelib/devices/bsim3/b3.c @@ -66,6 +66,7 @@ IFparm BSIM3mPTable[] = { /* model parameters */ IOP( "capmod", BSIM3_MOD_CAPMOD, IF_INTEGER, "Capacitance model selector"), IOP( "mobmod", BSIM3_MOD_MOBMOD, IF_INTEGER, "Mobility model selector"), IOP( "noimod", BSIM3_MOD_NOIMOD, IF_INTEGER, "Noise model selector"), +IOP( "nqsmod", BSIM3_MOD_NQSMOD, IF_INTEGER, "Non-quasi-static model selector"), IOP( "acnqsmod", BSIM3_MOD_ACNQSMOD, IF_INTEGER, "AC NQS model selector"), IOP( "acm", BSIM3_MOD_ACMMOD, IF_INTEGER, "Area calculation method selector"), IOP( "calcacm", BSIM3_MOD_CALCACM, IF_INTEGER, "Area calculation method ACM=12"), diff --git a/src/spicelib/devices/bsim3/b3mask.c b/src/spicelib/devices/bsim3/b3mask.c index fa138ab89..3ca862033 100644 --- a/src/spicelib/devices/bsim3/b3mask.c +++ b/src/spicelib/devices/bsim3/b3mask.c @@ -43,6 +43,9 @@ IFvalue *value) case BSIM3_MOD_NOIMOD: value->iValue = model->BSIM3noiMod; return(OK); + case BSIM3_MOD_NQSMOD: + value->iValue = model->BSIM3nqsMod; + return(OK); case BSIM3_MOD_ACNQSMOD: value->iValue = model->BSIM3acnqsMod; return(OK); diff --git a/src/spicelib/devices/bsim3/b3mpar.c b/src/spicelib/devices/bsim3/b3mpar.c index 038e25e76..3cd3dc4a9 100644 --- a/src/spicelib/devices/bsim3/b3mpar.c +++ b/src/spicelib/devices/bsim3/b3mpar.c @@ -51,11 +51,15 @@ GENmodel *inMod) mod->BSIM3noiMod = value->iValue; mod->BSIM3noiModGiven = TRUE; break; + case BSIM3_MOD_NQSMOD : + mod->BSIM3nqsMod = value->iValue; + mod->BSIM3nqsModGiven = TRUE; + break; case BSIM3_MOD_ACNQSMOD : mod->BSIM3acnqsMod = value->iValue; mod->BSIM3acnqsModGiven = TRUE; break; - case BSIM3_MOD_VERSION : + case BSIM3_MOD_VERSION : mod->BSIM3version = value->sValue; mod->BSIM3versionGiven = TRUE; break; diff --git a/src/spicelib/devices/bsim3/b3set.c b/src/spicelib/devices/bsim3/b3set.c index 064ed2922..7a59dc334 100644 --- a/src/spicelib/devices/bsim3/b3set.c +++ b/src/spicelib/devices/bsim3/b3set.c @@ -67,6 +67,12 @@ BSIM3instance **InstArray; model->BSIM3calcacm = 0; if (!model->BSIM3noiModGiven) model->BSIM3noiMod = 1; + if (!model->BSIM3nqsModGiven) + model->BSIM3nqsMod = 0; + else if ((model->BSIM3nqsMod != 0) && (model->BSIM3nqsMod != 1)) + { model->BSIM3nqsMod = 0; + printf("Warning: nqsMod has been set to its default value: 0.\n"); + } if (!model->BSIM3acnqsModGiven) model->BSIM3acnqsMod = 0; else if ((model->BSIM3acnqsMod != 0) && (model->BSIM3acnqsMod != 1)) @@ -934,7 +940,12 @@ BSIM3instance **InstArray; if (!here->BSIM3wGiven) here->BSIM3w = 5.0e-6; if (!here->BSIM3nqsModGiven) - here->BSIM3nqsMod = 0; + here->BSIM3nqsMod = model->BSIM3nqsMod; + else if ((here->BSIM3nqsMod != 0) && (here->BSIM3nqsMod != 1)) + { here->BSIM3nqsMod = model->BSIM3nqsMod; + printf("Warning: nqsMod has been set to its global value %d.\n", + model->BSIM3nqsMod); + } if (!here->BSIM3acnqsModGiven) here->BSIM3acnqsMod = model->BSIM3acnqsMod; else if ((here->BSIM3acnqsMod != 0) && (here->BSIM3acnqsMod != 1)) diff --git a/src/spicelib/devices/bsim3/bsim3def.h b/src/spicelib/devices/bsim3/bsim3def.h index e480358b7..0a944d553 100644 --- a/src/spicelib/devices/bsim3/bsim3def.h +++ b/src/spicelib/devices/bsim3/bsim3def.h @@ -410,6 +410,7 @@ typedef struct sBSIM3model int BSIM3acmMod; int BSIM3calcacm; int BSIM3noiMod; + int BSIM3nqsMod; int BSIM3acnqsMod; int BSIM3binUnit; int BSIM3paramChk; @@ -876,6 +877,7 @@ typedef struct sBSIM3model unsigned BSIM3calcacmGiven :1; unsigned BSIM3paramChkGiven :1; unsigned BSIM3noiModGiven :1; + unsigned BSIM3nqsModGiven :1; unsigned BSIM3acnqsModGiven :1; unsigned BSIM3typeGiven :1; unsigned BSIM3toxGiven :1; @@ -1449,7 +1451,8 @@ typedef struct sBSIM3model #define BSIM3_MOD_TPBSWG 207 #define BSIM3_MOD_VOFFCV 208 #define BSIM3_MOD_LINTNOI 209 -#define BSIM3_MOD_ACNQSMOD 210 +#define BSIM3_MOD_NQSMOD 210 +#define BSIM3_MOD_ACNQSMOD 211 /* Length dependence */ #define BSIM3_MOD_LCDSC 251 diff --git a/src/spicelib/devices/bsim3v32/b3v32.c b/src/spicelib/devices/bsim3v32/b3v32.c index d6f766822..b2d17ba94 100644 --- a/src/spicelib/devices/bsim3v32/b3v32.c +++ b/src/spicelib/devices/bsim3v32/b3v32.c @@ -66,6 +66,7 @@ IFparm BSIM3v32mPTable[] = { /* model parameters */ IOP( "capmod", BSIM3v32_MOD_CAPMOD, IF_INTEGER, "Capacitance model selector"), IOP( "mobmod", BSIM3v32_MOD_MOBMOD, IF_INTEGER, "Mobility model selector"), IOP( "noimod", BSIM3v32_MOD_NOIMOD, IF_INTEGER, "Noise model selector"), +IOP( "nqsmod", BSIM3v32_MOD_NQSMOD, IF_INTEGER, "Non-quasi-static model selector"), IOP( "acm", BSIM3v32_MOD_ACMMOD, IF_INTEGER, "Area calculation method selector"), IOP( "calcacm", BSIM3v32_MOD_CALCACM, IF_INTEGER, "Area calculation method ACM=12"), IOP( "paramchk", BSIM3v32_MOD_PARAMCHK, IF_INTEGER, "Model parameter checking selector"), diff --git a/src/spicelib/devices/bsim3v32/b3v32mask.c b/src/spicelib/devices/bsim3v32/b3v32mask.c index bf66890a0..f90beb13b 100644 --- a/src/spicelib/devices/bsim3v32/b3v32mask.c +++ b/src/spicelib/devices/bsim3v32/b3v32mask.c @@ -40,6 +40,9 @@ BSIM3v32mAsk (CKTcircuit *ckt, GENmodel *inst, int which, IFvalue *value) case BSIM3v32_MOD_NOIMOD: value->iValue = model->BSIM3v32noiMod; return(OK); + case BSIM3v32_MOD_NQSMOD: + value->iValue = model->BSIM3v32nqsMod; + return(OK); case BSIM3v32_MOD_ACMMOD: value->iValue = model->BSIM3v32acmMod; return(OK); diff --git a/src/spicelib/devices/bsim3v32/b3v32mpar.c b/src/spicelib/devices/bsim3v32/b3v32mpar.c index 46cd00364..353f6320d 100644 --- a/src/spicelib/devices/bsim3v32/b3v32mpar.c +++ b/src/spicelib/devices/bsim3v32/b3v32mpar.c @@ -49,6 +49,10 @@ BSIM3v32mParam(int param, IFvalue *value, GENmodel *inMod) mod->BSIM3v32noiMod = value->iValue; mod->BSIM3v32noiModGiven = TRUE; break; + case BSIM3v32_MOD_NQSMOD : + mod->BSIM3v32nqsMod = value->iValue; + mod->BSIM3v32nqsModGiven = TRUE; + break; case BSIM3v32_MOD_VERSION : mod->BSIM3v32version = value->sValue; mod->BSIM3v32versionGiven = TRUE; diff --git a/src/spicelib/devices/bsim3v32/b3v32set.c b/src/spicelib/devices/bsim3v32/b3v32set.c index 52e8acd0a..185681c77 100644 --- a/src/spicelib/devices/bsim3v32/b3v32set.c +++ b/src/spicelib/devices/bsim3v32/b3v32set.c @@ -58,6 +58,12 @@ IFuid tmpName; model->BSIM3v32calcacm = 0; if (!model->BSIM3v32noiModGiven) model->BSIM3v32noiMod = 1; + if (!model->BSIM3v32nqsModGiven) + model->BSIM3v32nqsMod = 0; + else if ((model->BSIM3v32nqsMod != 0) && (model->BSIM3v32nqsMod != 1)) + { model->BSIM3v32nqsMod = 0; + printf("Warning: nqsMod has been set to its default value: 0.\n"); + } /* If the user does not provide the model revision, * we always choose the most recent. @@ -942,7 +948,12 @@ IFuid tmpName; if (!here->BSIM3v32wGiven) here->BSIM3v32w = 5.0e-6; if (!here->BSIM3v32nqsModGiven) - here->BSIM3v32nqsMod = 0; + here->BSIM3v32nqsMod = model->BSIM3v32nqsMod; + else if ((here->BSIM3v32nqsMod != 0) && (here->BSIM3v32nqsMod != 1)) + { here->BSIM3v32nqsMod = model->BSIM3v32nqsMod; + printf("Warning: nqsMod has been set to its global value %d.\n", + model->BSIM3v32nqsMod); + } if (!here->BSIM3v32geoGiven) here->BSIM3v32geo = 0; diff --git a/src/spicelib/devices/bsim3v32/bsim3v32def.h b/src/spicelib/devices/bsim3v32/bsim3v32def.h index 8428f4413..a98f2b59f 100644 --- a/src/spicelib/devices/bsim3v32/bsim3v32def.h +++ b/src/spicelib/devices/bsim3v32/bsim3v32def.h @@ -365,6 +365,7 @@ typedef struct sBSIM3v32model int BSIM3v32acmMod; int BSIM3v32calcacm; int BSIM3v32noiMod; + int BSIM3v32nqsMod; int BSIM3v32binUnit; int BSIM3v32paramChk; char *BSIM3v32version; @@ -831,6 +832,7 @@ typedef struct sBSIM3v32model unsigned BSIM3v32calcacmGiven :1; unsigned BSIM3v32paramChkGiven :1; unsigned BSIM3v32noiModGiven :1; + unsigned BSIM3v32nqsModGiven :1; unsigned BSIM3v32typeGiven :1; unsigned BSIM3v32toxGiven :1; unsigned BSIM3v32versionGiven :1; @@ -1292,22 +1294,23 @@ typedef struct sBSIM3v32model #define BSIM3v32_MOD_CALCACM 102 #define BSIM3v32_MOD_MOBMOD 103 #define BSIM3v32_MOD_NOIMOD 104 +#define BSIM3v32_MOD_NQSMOD 105 -#define BSIM3v32_MOD_TOX 105 +#define BSIM3v32_MOD_TOX 106 -#define BSIM3v32_MOD_CDSC 106 -#define BSIM3v32_MOD_CDSCB 107 -#define BSIM3v32_MOD_CIT 108 -#define BSIM3v32_MOD_NFACTOR 109 -#define BSIM3v32_MOD_XJ 110 -#define BSIM3v32_MOD_VSAT 111 -#define BSIM3v32_MOD_AT 112 -#define BSIM3v32_MOD_A0 113 -#define BSIM3v32_MOD_A1 114 -#define BSIM3v32_MOD_A2 115 -#define BSIM3v32_MOD_KETA 116 -#define BSIM3v32_MOD_NSUB 117 -#define BSIM3v32_MOD_NPEAK 118 +#define BSIM3v32_MOD_CDSC 107 +#define BSIM3v32_MOD_CDSCB 108 +#define BSIM3v32_MOD_CIT 109 +#define BSIM3v32_MOD_NFACTOR 110 +#define BSIM3v32_MOD_XJ 111 +#define BSIM3v32_MOD_VSAT 112 +#define BSIM3v32_MOD_AT 113 +#define BSIM3v32_MOD_A0 114 +#define BSIM3v32_MOD_A1 115 +#define BSIM3v32_MOD_A2 116 +#define BSIM3v32_MOD_KETA 117 +#define BSIM3v32_MOD_NSUB 118 +#define BSIM3v32_MOD_NPEAK 119 #define BSIM3v32_MOD_NGATE 120 #define BSIM3v32_MOD_GAMMA1 121 #define BSIM3v32_MOD_GAMMA2 122 @@ -1316,7 +1319,7 @@ typedef struct sBSIM3v32model #define BSIM3v32_MOD_VBM 125 -#define BSIM3v32_MOD_XT 126 +#define BSIM3v32_MOD_XT 128 #define BSIM3v32_MOD_K1 129 #define BSIM3v32_MOD_KT1 130 #define BSIM3v32_MOD_KT1L 131