From 87e555908830e690b75dde524b9e55f10c641d84 Mon Sep 17 00:00:00 2001 From: dwarning Date: Sat, 22 Aug 2009 18:13:17 +0000 Subject: [PATCH] Update to version 4.6.4 --- DEVICES | 16 +++++---- src/spicelib/devices/bsim4/b4ld.c | 3 +- src/spicelib/devices/bsim4/b4noi.c | 6 ++-- src/spicelib/devices/bsim4/b4set.c | 6 ++-- src/spicelib/devices/bsim4/b4temp.c | 51 ++++++++++------------------- 5 files changed, 35 insertions(+), 47 deletions(-) diff --git a/DEVICES b/DEVICES index d6bb1d81d..567ff7692 100644 --- a/DEVICES +++ b/DEVICES @@ -650,13 +650,13 @@ will be updated every time the device specific code is altered or changed to ref Dir: devices/bsim3 Status: TO BE TESTED - This is the BSIM3v3.2.4 model from Berkeley device group. + This is the actual BSIM3 model from Berkeley Device Group. You can find some test netlists with results for this model on its web site. - Web site: http://www-device.eecs.berkeley.edu/~bsim3 + Web site: http://www-device.eecs.berkeley.edu/~bsim3 - Enhancements over the original model: + Enhancements over the original model: - Parallel Multiplier - ACM Area Calculation Method - Multirevision code (supports all 3v3.2 minor revisions) @@ -665,17 +665,21 @@ will be updated every time the device specific code is altered or changed to ref 11.13 BSIM4 - BSIM model level 4 - Ver: 4.2.0 - 4.6.3 + Ver: 4.2.0 - 4.6.4 Class: M - Level: 14 & 54, version = 4.2, 4.3, 4.4, 4.5, 4.6.3 + Level: 14 & 54, version = 4.0, 4.1, 4.2, 4.3, 4.4, 4.5, 4.6 Dir: devices/bsim4 Status: - This is the BSIM4 device model from Berkeley Device Group. + This is the actual BSIM4 model from Berkeley Device Group. Test are available on its web site. Web site: http://www-device.eecs.berkeley.edu/~bsim3/bsim4.html + Enhancements over the original model: + - Parallel Multiplier + - NodesetFix + 11.14 HiSIM - Hiroshima-university STARC IGFET Model diff --git a/src/spicelib/devices/bsim4/b4ld.c b/src/spicelib/devices/bsim4/b4ld.c index adec0c8ef..c3963662a 100644 --- a/src/spicelib/devices/bsim4/b4ld.c +++ b/src/spicelib/devices/bsim4/b4ld.c @@ -1,5 +1,5 @@ /**** BSIM4.6.2 Released by Wenwei Yang 07/31/2008****/ - +/**** BSIM4.6.4 Update ngspice 08/22/2009 ****/ /********** * Copyright 2006 Regents of the University of California. All rights reserved. * File: b4ld.c of BSIM4.6.2. @@ -1651,6 +1651,7 @@ for (; model != NULL; model = model->BSIM4nextModel) dEsatL_dVb *= T10; dEsatL_dVb += EsatL * dT10_dVb; EsatL *= T10; + Esat = EsatL / Leff; /* bugfix by Wenwei Yang (4.6.4) */ here->BSIM4EsatL = EsatL; } diff --git a/src/spicelib/devices/bsim4/b4noi.c b/src/spicelib/devices/bsim4/b4noi.c index 8ddc6e3d6..c0dbc4ea4 100644 --- a/src/spicelib/devices/bsim4/b4noi.c +++ b/src/spicelib/devices/bsim4/b4noi.c @@ -1,5 +1,5 @@ /**** BSIM4.6.2 Released by Wenwei Yang 07/31/2008 ****/ - +/**** BSIM4.6.4 Update ngspice 08/22/2009 ****/ /********** * Copyright 2006 Regents of the University of California. All rights reserved. * File: b4noi.c of BSIM4.6.2. @@ -222,10 +222,10 @@ int i; } if ((*(ckt->CKTstates[0] + here->BSIM4vds)) >= 0.0) - gspr = gspr / (1.0 + npart_theta * npart_theta * gspr + gspr = gspr * (1.0 + npart_theta * npart_theta * gspr / here->BSIM4IdovVds); /* bugfix */ else - gdpr = gdpr / (1.0 + npart_theta * npart_theta * gdpr + gdpr = gdpr * (1.0 + npart_theta * npart_theta * gdpr / here->BSIM4IdovVds); } diff --git a/src/spicelib/devices/bsim4/b4set.c b/src/spicelib/devices/bsim4/b4set.c index 725211c1d..04b758964 100644 --- a/src/spicelib/devices/bsim4/b4set.c +++ b/src/spicelib/devices/bsim4/b4set.c @@ -1,5 +1,5 @@ /**** BSIM4.6.2 Released by Wenwei Yang 07/31/2008 ****/ - +/**** BSIM4.6.4 Update ngspice 08/22/2009 ****/ /********** * Copyright 2006 Regents of the University of California. All rights reserved. * File: b4set.c of BSIM4.6.2. @@ -175,13 +175,13 @@ JOB *job; if (!model->BSIM4tempModGiven) model->BSIM4tempMod = 0; else if ((model->BSIM4tempMod != 0) && (model->BSIM4tempMod != 1) - && (model->BSIM4tempMod != 2)) + && (model->BSIM4tempMod != 2) && (model->BSIM4tempMod != 3)) { model->BSIM4tempMod = 0; printf("Warning: tempMod has been set to its default value: 0.\n"); } if (!model->BSIM4versionGiven) - model->BSIM4version = "4.6.3"; + model->BSIM4version = "4.6.4"; if (!model->BSIM4toxrefGiven) model->BSIM4toxref = 30.0e-10; if (!model->BSIM4eotGiven) diff --git a/src/spicelib/devices/bsim4/b4temp.c b/src/spicelib/devices/bsim4/b4temp.c index b48f7cdc2..368ffcdfc 100644 --- a/src/spicelib/devices/bsim4/b4temp.c +++ b/src/spicelib/devices/bsim4/b4temp.c @@ -1,5 +1,5 @@ -/**** BSIM4.6.3 Released by Wenwei Yang 07/31/2008 ****/ - +/**** BSIM4.6.2 Released by Wenwei Yang 07/31/2008 ****/ +/**** BSIM4.6.4 Update ngspice 08/22/2009 ****/ /********** * Copyright 2006 Regents of the University of California. All rights reserved. * File: b4temp.c of BSIM4.6.3. @@ -76,18 +76,18 @@ BSIM4model *model = (BSIM4model*) inModel; BSIM4instance *here; struct bsim4SizeDependParam *pSizeDependParamKnot, *pLastKnot, *pParam=NULL; double tmp, tmp1, tmp2, tmp3, Eg, Eg0, ni, epssub; -double T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T11, Lnew=0.0, Wnew; +double T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, Lnew=0.0, Wnew; double delTemp, Temp, TRatio, Inv_L, Inv_W, Inv_LW, Vtm0, Tnom; double dumPs, dumPd, dumAs, dumAd, PowWeffWr; double DMCGeff, DMCIeff, DMDGeff; double Nvtms, Nvtmd, SourceSatCurrent, DrainSatCurrent; -double T10; +double T10, T11; double Inv_saref, Inv_sbref, Inv_sa, Inv_sb, rho, Ldrn, dvth0_lod; double W_tmp, Inv_ODeff, OD_offset, dk2_lod, deta0_lod; double lnl, lnw, lnnf, rbpbx, rbpby, rbsbx, rbsby, rbdbx, rbdby,bodymode; double kvsat, wlod, sceff, Wdrn; double V0, lt1, ltw, Theta0, Delt_vth, Vth_NarrowW, Lpe_Vb, Vth; -double n, n0, Vtm=0.0, Vgsteff, Vgs_eff, niter, toxpf, toxpi, Tcen, toxe, epsrox, vddeot; +double n, n0, Vgsteff, Vgs_eff, niter, toxpf, toxpi, Tcen, toxe, epsrox, vddeot; double vtfbphi2eot, phieot, TempRatioeot, Vtm0eot, Vtmeot,vbieot; int Size_Not_Found, i; @@ -722,16 +722,6 @@ int Size_Not_Found, i; + model->BSIM4luc1 * Inv_L + model->BSIM4wuc1 * Inv_W + model->BSIM4puc1 * Inv_LW; - - /*high k mobility*/ - pParam->BSIM4ucs = model->BSIM4ucs - + model->BSIM4lucs * Inv_L - + model->BSIM4wucs * Inv_W - + model->BSIM4pucs * Inv_LW; - - - - pParam->BSIM4ud = model->BSIM4ud + model->BSIM4lud * Inv_L + model->BSIM4wud * Inv_W @@ -1135,18 +1125,18 @@ int Size_Not_Found, i; pParam->BSIM4rdswmin = (model->BSIM4rdswmin + T10) * here->BSIM4nf / PowWeffWr; } else { - if (model->BSIM4tempMod == 3) - {pParam->BSIM4ua = pParam->BSIM4ua * pow(TRatio, pParam->BSIM4ua1) ; + if (model->BSIM4tempMod == 3) + {pParam->BSIM4ua = pParam->BSIM4ua * pow(TRatio, pParam->BSIM4ua1) ; pParam->BSIM4ub = pParam->BSIM4ub * pow(TRatio, pParam->BSIM4ub1); pParam->BSIM4uc = pParam->BSIM4uc * pow(TRatio, pParam->BSIM4uc1); pParam->BSIM4ud = pParam->BSIM4ud * pow(TRatio, pParam->BSIM4ud1); - } - else{ /* tempMod = 1, 2 */ - pParam->BSIM4ua = pParam->BSIM4ua * (1.0 + pParam->BSIM4ua1 * delTemp) ; - pParam->BSIM4ub = pParam->BSIM4ub * (1.0 + pParam->BSIM4ub1 * delTemp); - pParam->BSIM4uc = pParam->BSIM4uc * (1.0 + pParam->BSIM4uc1 * delTemp); - pParam->BSIM4ud = pParam->BSIM4ud * (1.0 + pParam->BSIM4ud1 * delTemp); - } + } + else{ /* tempMod = 1, 2 */ + pParam->BSIM4ua = pParam->BSIM4ua * (1.0 + pParam->BSIM4ua1 * delTemp) ; + pParam->BSIM4ub = pParam->BSIM4ub * (1.0 + pParam->BSIM4ub1 * delTemp); + pParam->BSIM4uc = pParam->BSIM4uc * (1.0 + pParam->BSIM4uc1 * delTemp); + pParam->BSIM4ud = pParam->BSIM4ud * (1.0 + pParam->BSIM4ud1 * delTemp); + } pParam->BSIM4vsattemp = pParam->BSIM4vsat * (1.0 - pParam->BSIM4at * delTemp); T10 = 1.0 + pParam->BSIM4prt * delTemp; if(model->BSIM4rdsMod) { @@ -1161,13 +1151,6 @@ int Size_Not_Found, i; pParam->BSIM4rds0 = pParam->BSIM4rdsw * T10 * here->BSIM4nf / PowWeffWr; pParam->BSIM4rdswmin = model->BSIM4rdswmin * T10 * here->BSIM4nf / PowWeffWr; } - /*high k mobility*/ - if (model->BSIM4mobMod == 3) - { - pParam->BSIM4ua = pParam->BSIM4ua * pow(TRatio, pParam->BSIM4ua1) ; - pParam->BSIM4uc = pParam->BSIM4uc * pow(TRatio, pParam->BSIM4uc1) ; - pParam->BSIM4ud = pParam->BSIM4ud * pow(TRatio, pParam->BSIM4ud1) ; - } if (T1 < 0.0) { T1 = 0.0; printf("Warning: Rdw at current temperature is negative; set to 0.\n"); @@ -1240,7 +1223,7 @@ int Size_Not_Found, i; pParam->BSIM4sqrtXdep0 = sqrt(pParam->BSIM4Xdep0); if(model->BSIM4mtrlMod == 0) - pParam->BSIM4litl = sqrt(3.0 * 3.9/epsrox * pParam->BSIM4xj * toxe); + pParam->BSIM4litl = sqrt(3.0 * 3.9 / epsrox * pParam->BSIM4xj * toxe); else pParam->BSIM4litl = sqrt(model->BSIM4epsrsub/epsrox * pParam->BSIM4xj * toxe); @@ -2041,7 +2024,7 @@ int Size_Not_Found, i; n0 = (1.0 + 3.0 * tmp3) * T0; } - T0 = n0 * Vtm; + T0 = n0 * model->BSIM4vtm; T1 = pParam->BSIM4voffcbn; T2 = T1/T0; if (T2 < -EXP_THRESHOLD) @@ -2186,7 +2169,7 @@ int Size_Not_Found, i; { IFuid namarray[2]; namarray[0] = model->BSIM4modName; namarray[1] = here->BSIM4name; - (*(SPfrontEnd->IFerror)) (ERR_FATAL, "Fatal error(s) detected during BSIM4.6.3 parameter checking for %s in model %s", namarray); + (*(SPfrontEnd->IFerror)) (ERR_FATAL, "Fatal error(s) detected during BSIM4.6.4 parameter checking for %s in model %s", namarray); return(E_BADPARM); } } /* End instance */