From 8cc75de0b50328913501398a68a1564169b37b4b Mon Sep 17 00:00:00 2001 From: dwarning Date: Tue, 7 May 2013 11:14:57 +0200 Subject: [PATCH] this is the delvto/mulu0 instance extension to bsim3v3 --- src/spicelib/devices/bsim3/b3.c | 2 ++ src/spicelib/devices/bsim3/b3ask.c | 6 ++++ src/spicelib/devices/bsim3/b3ld.c | 42 +++++++++++++-------------- src/spicelib/devices/bsim3/b3par.c | 8 +++++ src/spicelib/devices/bsim3/b3set.c | 4 +++ src/spicelib/devices/bsim3/b3temp.c | 10 +++++++ src/spicelib/devices/bsim3/bsim3def.h | 13 ++++++++- 7 files changed, 63 insertions(+), 22 deletions(-) diff --git a/src/spicelib/devices/bsim3/b3.c b/src/spicelib/devices/bsim3/b3.c index c73585430..db21a8f54 100644 --- a/src/spicelib/devices/bsim3/b3.c +++ b/src/spicelib/devices/bsim3/b3.c @@ -26,6 +26,8 @@ IOP( "nrs", BSIM3_NRS, IF_REAL , "Number of squares in source"), IOP( "off", BSIM3_OFF, IF_FLAG , "Device is initially off"), IOP( "nqsmod", BSIM3_NQSMOD, IF_INTEGER, "Non-quasi-static model selector"), IOP( "acnqsmod", BSIM3_ACNQSMOD, IF_INTEGER, "AC NQS model selector"), +IOP( "delvto", BSIM3_DELVTO, IF_REAL, "Zero bias threshold voltage variation"), +IOP( "mulu0", BSIM3_MULU0, IF_REAL, "Low field mobility multiplier"), IP( "ic", BSIM3_IC, IF_REALVEC , "Vector of DS,GS,BS initial voltages"), OP( "gmbs", BSIM3_GMBS, IF_REAL, "Gmb"), OP( "gm", BSIM3_GM, IF_REAL, "Gm"), diff --git a/src/spicelib/devices/bsim3/b3ask.c b/src/spicelib/devices/bsim3/b3ask.c index 1a0138fae..be0631acc 100644 --- a/src/spicelib/devices/bsim3/b3ask.c +++ b/src/spicelib/devices/bsim3/b3ask.c @@ -65,6 +65,12 @@ BSIM3instance *here = (BSIM3instance*)inst; case BSIM3_ACNQSMOD: value->iValue = here->BSIM3acnqsMod; return(OK); + case BSIM3_DELVTO: + value->rValue = here->BSIM3delvto; + return(OK); + case BSIM3_MULU0: + value->rValue = here->BSIM3mulu0; + return(OK); case BSIM3_IC_VBS: value->rValue = here->BSIM3icVBS; return(OK); diff --git a/src/spicelib/devices/bsim3/b3ld.c b/src/spicelib/devices/bsim3/b3ld.c index 88a2ca769..2cf4bcd4e 100644 --- a/src/spicelib/devices/bsim3/b3ld.c +++ b/src/spicelib/devices/bsim3/b3ld.c @@ -212,7 +212,7 @@ for (; model != NULL; model = model->BSIM3nextModel) ((ckt->CKTmode & (MODETRAN | MODEAC|MODEDCOP | MODEDCTRANCURVE)) || (!(ckt->CKTmode & MODEUIC)))) { vbs = 0.0; - vgs = model->BSIM3type * pParam->BSIM3vth0 + 0.1; + vgs = model->BSIM3type * here->BSIM3vth0 + 0.1; vds = 0.1; } } @@ -579,7 +579,7 @@ for (; model != NULL; model = model->BSIM3nextModel) dDIBL_Sft_dVd = T3 * pParam->BSIM3theta0vb0; DIBL_Sft = dDIBL_Sft_dVd * Vds; - Vth = model->BSIM3type * pParam->BSIM3vth0 - pParam->BSIM3k1 + Vth = model->BSIM3type * here->BSIM3vth0 - pParam->BSIM3k1 * pParam->BSIM3sqrtPhi + pParam->BSIM3k1ox * sqrtPhis - pParam->BSIM3k2ox * Vbseff - Delt_vth - T2 + (pParam->BSIM3k3 + pParam->BSIM3k3b * Vbseff) * tmp2 + T1 - DIBL_Sft; @@ -614,7 +614,7 @@ for (; model != NULL; model = model->BSIM3nextModel) } /* Poly Gate Si Depletion Effect */ - T0 = pParam->BSIM3vfb + pParam->BSIM3phi; + T0 = here->BSIM3vfb + pParam->BSIM3phi; if ((pParam->BSIM3ngate > 1.e18) && (pParam->BSIM3ngate < 1.e25) && (Vgs > T0)) /* added to avoid the problem caused by ngate */ @@ -816,7 +816,7 @@ for (; model != NULL; model = model->BSIM3nextModel) dDenomi_dVb *= T9; } - here->BSIM3ueff = ueff = pParam->BSIM3u0temp / Denomi; + here->BSIM3ueff = ueff = here->BSIM3u0temp / Denomi; T9 = -ueff / Denomi; dueff_dVg = T9 * dDenomi_dVg; dueff_dVd = T9 * dDenomi_dVd; @@ -1599,7 +1599,7 @@ for (; model != NULL; model = model->BSIM3nextModel) } /* End of VgsteffCV */ if (model->BSIM3capMod == 1) - { Vfb = pParam->BSIM3vfbzb; + { Vfb = here->BSIM3vfbzb; Arg1 = Vgs_eff - VbseffCV - Vfb - Vgsteff; if (Arg1 <= 0.0) @@ -1761,7 +1761,7 @@ for (; model != NULL; model = model->BSIM3nextModel) } else if (model->BSIM3capMod == 2) - { Vfb = pParam->BSIM3vfbzb; + { Vfb = here->BSIM3vfbzb; V3 = Vfb - Vgs_eff + VbseffCV - DELTA_3; if (Vfb <= 0.0) { T0 = sqrt(V3 * V3 - 4.0 * DELTA_3 * Vfb); @@ -1925,24 +1925,24 @@ for (; model != NULL; model = model->BSIM3nextModel) /* New Charge-Thickness capMod (CTM) begins */ else if (model->BSIM3capMod == 3) - { V3 = pParam->BSIM3vfbzb - Vgs_eff + VbseffCV - DELTA_3; - if (pParam->BSIM3vfbzb <= 0.0) - { T0 = sqrt(V3 * V3 - 4.0 * DELTA_3 * pParam->BSIM3vfbzb); + { V3 = here->BSIM3vfbzb - Vgs_eff + VbseffCV - DELTA_3; + if (here->BSIM3vfbzb <= 0.0) + { T0 = sqrt(V3 * V3 - 4.0 * DELTA_3 * here->BSIM3vfbzb); T2 = -DELTA_3 / T0; } else - { T0 = sqrt(V3 * V3 + 4.0 * DELTA_3 * pParam->BSIM3vfbzb); + { T0 = sqrt(V3 * V3 + 4.0 * DELTA_3 * here->BSIM3vfbzb); T2 = DELTA_3 / T0; } T1 = 0.5 * (1.0 + V3 / T0); - Vfbeff = pParam->BSIM3vfbzb - 0.5 * (V3 + T0); + Vfbeff = here->BSIM3vfbzb - 0.5 * (V3 + T0); dVfbeff_dVg = T1 * dVgs_eff_dVg; dVfbeff_dVb = -T1 * dVbseffCV_dVb; Cox = model->BSIM3cox; Tox = 1.0e8 * model->BSIM3tox; - T0 = (Vgs_eff - VbseffCV - pParam->BSIM3vfbzb) / Tox; + T0 = (Vgs_eff - VbseffCV - here->BSIM3vfbzb) / Tox; dT0_dVg = dVgs_eff_dVg / Tox; dT0_dVb = -dVbseffCV_dVb / Tox; @@ -1979,7 +1979,7 @@ for (; model != NULL; model = model->BSIM3nextModel) dCoxeff_dVg *= dTcen_dVg; CoxWLcen = CoxWL * Coxeff / Cox; - Qac0 = CoxWLcen * (Vfbeff - pParam->BSIM3vfbzb); + Qac0 = CoxWLcen * (Vfbeff - here->BSIM3vfbzb); QovCox = Qac0 / Coxeff; dQac0_dVg = CoxWLcen * dVfbeff_dVg + QovCox * dCoxeff_dVg; @@ -2032,7 +2032,7 @@ for (; model != NULL; model = model->BSIM3nextModel) VgDP = 0.5 * (T0 + T1); dVgDP_dVg = 0.5 * (dT0_dVg + (T0 * dT0_dVg + 0.002) / T1); - T3 = 4.0 * (Vth - pParam->BSIM3vfbzb - pParam->BSIM3phi); + T3 = 4.0 * (Vth - here->BSIM3vfbzb - pParam->BSIM3phi); Tox += Tox; if (T3 >= 0.0) { T0 = (Vgsteff + T3) / Tox; @@ -2424,9 +2424,9 @@ line755: here->BSIM3cqbb = -(here->BSIM3cqgb + here->BSIM3cqdb + here->BSIM3cqsb); - gtau_drift = fabs(pParam->BSIM3tconst * qcheq) * ScalingFactor; + gtau_drift = fabs(here->BSIM3tconst * qcheq) * ScalingFactor; T0 = pParam->BSIM3leffCV * pParam->BSIM3leffCV; - gtau_diff = 16.0 * pParam->BSIM3u0temp * model->BSIM3vtm / T0 + gtau_diff = 16.0 * here->BSIM3u0temp * model->BSIM3vtm / T0 * ScalingFactor; here->BSIM3gtau = gtau_drift + gtau_diff; if (here->BSIM3acnqsMod) @@ -2535,9 +2535,9 @@ line755: } else { if (qcheq > 0.0) - T0 = pParam->BSIM3tconst * qdef * ScalingFactor; + T0 = here->BSIM3tconst * qdef * ScalingFactor; else - T0 = -pParam->BSIM3tconst * qdef * ScalingFactor; + T0 = -here->BSIM3tconst * qdef * ScalingFactor; ggtg = here->BSIM3gtg = T0 * here->BSIM3cqgb; ggtd = here->BSIM3gtd = T0 * here->BSIM3cqdb; ggts = here->BSIM3gts = T0 * here->BSIM3cqsb; @@ -2651,9 +2651,9 @@ line755: } else { if (qcheq > 0.0) - T0 = pParam->BSIM3tconst * qdef * ScalingFactor; + T0 = here->BSIM3tconst * qdef * ScalingFactor; else - T0 = -pParam->BSIM3tconst * qdef * ScalingFactor; + T0 = -here->BSIM3tconst * qdef * ScalingFactor; ggtg = here->BSIM3gtg = T0 * here->BSIM3cqgb; ggts = here->BSIM3gtd = T0 * here->BSIM3cqdb; ggtd = here->BSIM3gts = T0 * here->BSIM3cqsb; @@ -2804,7 +2804,7 @@ line850: dsxpart_dVd = dsxpart_dVg = dsxpart_dVb = dsxpart_dVs = 0.0; if (here->BSIM3nqsMod) - here->BSIM3gtau = 16.0 * pParam->BSIM3u0temp * model->BSIM3vtm + here->BSIM3gtau = 16.0 * here->BSIM3u0temp * model->BSIM3vtm / pParam->BSIM3leffCV / pParam->BSIM3leffCV * ScalingFactor; else diff --git a/src/spicelib/devices/bsim3/b3par.c b/src/spicelib/devices/bsim3/b3par.c index 7ca78cd0e..632c2c4b0 100644 --- a/src/spicelib/devices/bsim3/b3par.c +++ b/src/spicelib/devices/bsim3/b3par.c @@ -91,6 +91,14 @@ IFvalue *select) here->BSIM3acnqsMod = value->iValue; here->BSIM3acnqsModGiven = TRUE; break; + case BSIM3_DELVTO: + here->BSIM3delvto = value->rValue; + here->BSIM3delvtoGiven = TRUE; + break; + case BSIM3_MULU0: + here->BSIM3mulu0 = value->rValue; + here->BSIM3mulu0Given = TRUE; + break; case BSIM3_IC: switch(value->v.numValue){ case 3: diff --git a/src/spicelib/devices/bsim3/b3set.c b/src/spicelib/devices/bsim3/b3set.c index 44d5e5ce3..e58320828 100644 --- a/src/spicelib/devices/bsim3/b3set.c +++ b/src/spicelib/devices/bsim3/b3set.c @@ -875,6 +875,10 @@ BSIM3instance **InstArray; here->BSIM3drainPerimeter = 0.0; if (!here->BSIM3drainSquaresGiven) here->BSIM3drainSquares = 1.0; + if (!here->BSIM3delvtoGiven) + here->BSIM3delvto = 0.0; + if (!here->BSIM3mulu0Given) + here->BSIM3mulu0 = 1.0; if (!here->BSIM3icVBSGiven) here->BSIM3icVBS = 0.0; if (!here->BSIM3icVDSGiven) diff --git a/src/spicelib/devices/bsim3/b3temp.c b/src/spicelib/devices/bsim3/b3temp.c index 62783d74c..315a97940 100644 --- a/src/spicelib/devices/bsim3/b3temp.c +++ b/src/spicelib/devices/bsim3/b3temp.c @@ -795,6 +795,16 @@ int Size_Not_Found; /* End of vfbzb */ } + /* adding delvto */ + here->BSIM3vth0 = pParam->BSIM3vth0 + here->BSIM3delvto; + here->BSIM3vfb = pParam->BSIM3vfb + model->BSIM3type * here->BSIM3delvto; + here->BSIM3vfbzb = pParam->BSIM3vfbzb + model->BSIM3type * here->BSIM3delvto; + + /* low field mobility multiplier */ + here->BSIM3u0temp = pParam->BSIM3u0temp * here->BSIM3mulu0; + here->BSIM3tconst = here->BSIM3u0temp * pParam->BSIM3elm / (model->BSIM3cox + * pParam->BSIM3weffCV * pParam->BSIM3leffCV * T0); + /* process source/drain series resistance */ here->BSIM3drainConductance = model->BSIM3sheetResistance * here->BSIM3drainSquares; diff --git a/src/spicelib/devices/bsim3/bsim3def.h b/src/spicelib/devices/bsim3/bsim3def.h index 4ecbb31ca..fbe6e1c02 100644 --- a/src/spicelib/devices/bsim3/bsim3def.h +++ b/src/spicelib/devices/bsim3/bsim3def.h @@ -53,6 +53,13 @@ typedef struct sBSIM3instance double BSIM3sourcePerimeter; double BSIM3sourceConductance; double BSIM3drainConductance; + double BSIM3delvto; + double BSIM3mulu0; + double BSIM3vth0; + double BSIM3vfb; + double BSIM3vfbzb; + double BSIM3u0temp; + double BSIM3tconst; double BSIM3icVBS; double BSIM3icVDS; @@ -122,6 +129,8 @@ typedef struct sBSIM3instance unsigned BSIM3sourceSquaresGiven :1; unsigned BSIM3drainPerimeterGiven :1; unsigned BSIM3sourcePerimeterGiven :1; + unsigned BSIM3delvtoGiven :1; + unsigned BSIM3mulu0Given :1; unsigned BSIM3dNodePrimeSet :1; unsigned BSIM3sNodePrimeSet :1; unsigned BSIM3icVBSGiven :1; @@ -1278,7 +1287,6 @@ typedef struct sBSIM3model /* device parameters */ #define BSIM3_W 1 #define BSIM3_L 2 -#define BSIM3_M 16 #define BSIM3_AS 3 #define BSIM3_AD 4 #define BSIM3_PS 5 @@ -1292,6 +1300,9 @@ typedef struct sBSIM3model #define BSIM3_IC 13 #define BSIM3_NQSMOD 14 #define BSIM3_ACNQSMOD 15 +#define BSIM3_M 16 +#define BSIM3_DELVTO 17 +#define BSIM3_MULU0 18 /* model parameters */ #define BSIM3_MOD_CAPMOD 101