diff --git a/ChangeLog b/ChangeLog index 160f4179e..e6f4671fe 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,13 @@ +2005-11-13 Paolo Nenzi + + * src/spicelib/devices/bsim4/*: Updated bsim4 to version 4.5.0 using the + code hacked by Hitoshi Tanaka and Dietmar Warning. Changes from original + Berkeley's device group implementation: + - Added multiplier parameter (m parameter). + - Added NodeSet for internal nodes. + - Removed #ifdef STDC and non STDC function prototypes + - Added missing "pParam->BSIM4ku0we" to fprintf in b4temp.c. + 2005-11-07 Paolo Nenzi * src/spicelib/devices/vbic/*: Dietmar Warning sent a patch to his last diff --git a/DEVICES b/DEVICES index a8ddbd092..e14c3c715 100644 --- a/DEVICES +++ b/DEVICES @@ -637,7 +637,7 @@ BSIM3 - BSIM model level 3 BSIM4 - BSIM model level 4 (0.18 um) Initial Release. - Ver: 4.4.0 + Ver: 4.5.0 Class: M Level: 14 Dir: devices/bsim4 @@ -649,7 +649,7 @@ BSIM4 - BSIM model level 4 (0.18 um) Web site: http://www-device.eecs.berkeley.edu/~bsim3/bsim4.html - Updated to 4.4.0 YET UNTESTED. + Updated to 4.5.0 YET UNTESTED. HiSIM - Hiroshima-university STARC IGFET Model diff --git a/src/spicelib/devices/bsim4/b4.c b/src/spicelib/devices/bsim4/b4.c index 8b50e9952..0666ac73c 100644 --- a/src/spicelib/devices/bsim4/b4.c +++ b/src/spicelib/devices/bsim4/b4.c @@ -1,16 +1,17 @@ -/**** BSIM4.4.0 Released by Xuemei (Jane) Xi 03/04/2004 ****/ +/**** BSIM4.5.0 Released by Xuemei (Jane) Xi 07/29/2005 ****/ /********** - * Copyright 2004 Regents of the University of California. All rights reserved. - * File: b4.c of BSIM4.4.0. + * Copyright 2005 Regents of the University of California. All rights reserved. + * File: b4.c of BSIM4.5.0. * Author: 2000 Weidong Liu - * Authors: 2001- Xuemei Xi, Jin He, Kanyu Cao, Mohan Dunga, Mansun Chan, Ali Niknejad, Chenming Hu. + * Authors: 2001- Xuemei Xi, Mohan Dunga, Ali Niknejad, Chenming Hu. * Project Director: Prof. Chenming Hu. * Modified by Xuemei Xi, 04/06/2001. * Modified by Xuemei Xi, 10/05/2001. * Modified by Xuemei Xi, 11/15/2002. * Modified by Xuemei Xi, 05/09/2003. * Modified by Xuemei Xi, 03/04/2004. + * Modified by Xuemei Xi, Mohan Dunga, 07/29/2005. **********/ #include "ngspice.h" @@ -26,6 +27,10 @@ IOP( "nf", BSIM4_NF, IF_REAL , "Number of fingers"), IOP( "sa", BSIM4_SA, IF_REAL , "distance between OD edge to poly of one side "), IOP( "sb", BSIM4_SB, IF_REAL , "distance between OD edge to poly of the other side"), IOP( "sd", BSIM4_SD, IF_REAL , "distance between neighbour fingers"), +IOP( "sca", BSIM4_SCA, IF_REAL , "Integral of the first distribution function for scattered well dopant"), +IOP( "scb", BSIM4_SCB, IF_REAL , "Integral of the second distribution function for scattered well dopant"), +IOP( "scc", BSIM4_SCC, IF_REAL , "Integral of the third distribution function for scattered well dopant"), +IOP( "sc", BSIM4_SCA, IF_REAL , "Distance to a single well edge "), IOP( "min", BSIM4_MIN, IF_INTEGER , "Minimize either D or S"), IOP( "ad", BSIM4_AD, IF_REAL , "Drain area"), IOP( "as", BSIM4_AS, IF_REAL , "Source area"), @@ -39,6 +44,11 @@ IOP( "rbsb", BSIM4_RBSB, IF_REAL , "Body resistance"), IOP( "rbpb", BSIM4_RBPB, IF_REAL , "Body resistance"), 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"), +IOP( "xgw", BSIM4_XGW, IF_REAL, "Distance from gate contact center to device edge"), +IOP( "ngcon", BSIM4_NGCON, IF_REAL, "Number of gate contacts"), + + IOP( "trnqsmod", BSIM4_TRNQSMOD, IF_INTEGER, "Transient NQS model selector"), IOP( "acnqsmod", BSIM4_ACNQSMOD, IF_INTEGER, "AC NQS model selector"), IOP( "rbodymod", BSIM4_RBODYMOD, IF_INTEGER, "Distributed body R model selector"), @@ -90,6 +100,9 @@ OP( "qb", BSIM4_QB, IF_REAL, "Qbulk"), OP( "qd", BSIM4_QD, IF_REAL, "Qdrain"), OP( "qs", BSIM4_QS, IF_REAL, "Qsource"), OP( "qinv", BSIM4_QINV, IF_REAL, "Qinversion"), +OP( "qdef", BSIM4_QDEF, IF_REAL, "Qdef"), +OP( "gcrg", BSIM4_GCRG, IF_REAL, "Gcrg"), +OP( "gtau", BSIM4_GTAU, IF_REAL, "Gtau"), }; IFparm BSIM4mPTable[] = { /* model parameters */ @@ -169,6 +182,10 @@ IOP( "ub", BSIM4_MOD_UB, IF_REAL, "Quadratic gate dependence of mobility"), IOP( "ub1", BSIM4_MOD_UB1, IF_REAL, "Temperature coefficient of ub"), IOP( "uc", BSIM4_MOD_UC, IF_REAL, "Body-bias dependence of mobility"), IOP( "uc1", BSIM4_MOD_UC1, IF_REAL, "Temperature coefficient of uc"), +IOP( "ud", BSIM4_MOD_UD, IF_REAL, "Coulomb scattering factor of mobility"), +IOP( "ud1", BSIM4_MOD_UD1, IF_REAL, "Temperature coefficient of ud"), +IOP( "up", BSIM4_MOD_UP, IF_REAL, "Channel length linear factor of mobility"), +IOP( "lp", BSIM4_MOD_LP, IF_REAL, "Channel length exponential factor of mobility"), IOP( "u0", BSIM4_MOD_U0, IF_REAL, "Low-field mobility at Tnom"), IOP( "eu", BSIM4_MOD_EU, IF_REAL, "Mobility exponent"), IOP( "ute", BSIM4_MOD_UTE, IF_REAL, "Temperature coefficient of mobility"), @@ -264,6 +281,9 @@ IOP( "vtl", BSIM4_MOD_VTL, IF_REAL, " thermal velocity"), IOP( "lc", BSIM4_MOD_LC, IF_REAL, " back scattering parameter"), IOP( "xn", BSIM4_MOD_XN, IF_REAL, " back scattering parameter"), IOP( "vfbsdoff", BSIM4_MOD_VFBSDOFF, IF_REAL, "S/D flatband voltage offset"), +IOP( "tvfbsdoff", BSIM4_MOD_TVFBSDOFF, IF_REAL, "Temperature parameter for vfbsdoff"), +IOP( "tvoff", BSIM4_MOD_TVOFF, IF_REAL, "Temperature parameter for voff"), + IOP( "lintnoi", BSIM4_MOD_LINTNOI, IF_REAL, "lint offset for noise calculation"), IOP( "lint", BSIM4_MOD_LINT, IF_REAL, "Length reduction parameter"), IOP( "ll", BSIM4_MOD_LL, IF_REAL, "Length reduction parameter"), @@ -313,6 +333,7 @@ IOP( "dwj", BSIM4_MOD_DWJ, IF_REAL, "Delta W for S/D junctions"), IOP( "alpha0", BSIM4_MOD_ALPHA0, IF_REAL, "substrate current model parameter"), IOP( "alpha1", BSIM4_MOD_ALPHA1, IF_REAL, "substrate current model parameter"), IOP( "beta0", BSIM4_MOD_BETA0, IF_REAL, "substrate current model parameter"), + IOP( "agidl", BSIM4_MOD_AGIDL, IF_REAL, "Pre-exponential constant for GIDL"), IOP( "bgidl", BSIM4_MOD_BGIDL, IF_REAL, "Exponential constant for GIDL"), IOP( "cgidl", BSIM4_MOD_CGIDL, IF_REAL, "Parameter for body-bias dependence of GIDL"), @@ -378,6 +399,37 @@ IOP( "rbsb", BSIM4_MOD_RBSB, IF_REAL, "Resistance between bNode and sbNode"), IOP( "rbps", BSIM4_MOD_RBPS, IF_REAL, "Resistance between bNodePrime and sbNode"), IOP( "rbpd", BSIM4_MOD_RBPD, IF_REAL, "Resistance between bNodePrime and bNode"), +IOP( "rbps0", BSIM4_MOD_RBPS0, IF_REAL , "Body resistance RBPS scaling"), +IOP( "rbpsl", BSIM4_MOD_RBPSL, IF_REAL , "Body resistance RBPS L scaling"), +IOP( "rbpsw", BSIM4_MOD_RBPSW, IF_REAL , "Body resistance RBPS W scaling"), +IOP( "rbpsnf", BSIM4_MOD_RBPSNF, IF_REAL , "Body resistance RBPS NF scaling"), + +IOP( "rbpd0", BSIM4_MOD_RBPD0, IF_REAL , "Body resistance RBPD scaling"), +IOP( "rbpdl", BSIM4_MOD_RBPDL, IF_REAL , "Body resistance RBPD L scaling"), +IOP( "rbpdw", BSIM4_MOD_RBPDW, IF_REAL , "Body resistance RBPD W scaling"), +IOP( "rbpdnf", BSIM4_MOD_RBPDNF, IF_REAL , "Body resistance RBPD NF scaling"), + +IOP( "rbpbx0", BSIM4_MOD_RBPBX0, IF_REAL , "Body resistance RBPBX scaling"), +IOP( "rbpbxl", BSIM4_MOD_RBPBXL, IF_REAL , "Body resistance RBPBX L scaling"), +IOP( "rbpbxw", BSIM4_MOD_RBPBXW, IF_REAL , "Body resistance RBPBX W scaling"), +IOP( "rbpbxnf", BSIM4_MOD_RBPBXNF, IF_REAL , "Body resistance RBPBX NF scaling"), +IOP( "rbpby0", BSIM4_MOD_RBPBY0, IF_REAL , "Body resistance RBPBY scaling"), +IOP( "rbpbyl", BSIM4_MOD_RBPBYL, IF_REAL , "Body resistance RBPBY L scaling"), +IOP( "rbpbyw", BSIM4_MOD_RBPBYW, IF_REAL , "Body resistance RBPBY W scaling"), +IOP( "rbpbynf", BSIM4_MOD_RBPBYNF, IF_REAL , "Body resistance RBPBY NF scaling"), + +IOP( "rbsbx0", BSIM4_MOD_RBSBX0, IF_REAL , "Body resistance RBSBX scaling"), +IOP( "rbsby0", BSIM4_MOD_RBSBY0, IF_REAL , "Body resistance RBSBY scaling"), +IOP( "rbdbx0", BSIM4_MOD_RBDBX0, IF_REAL , "Body resistance RBDBX scaling"), +IOP( "rbdby0", BSIM4_MOD_RBDBY0, IF_REAL , "Body resistance RBDBY scaling"), + +IOP( "rbsdbxl", BSIM4_MOD_RBSDBXL, IF_REAL , "Body resistance RBSDBX L scaling"), +IOP( "rbsdbxw", BSIM4_MOD_RBSDBXW, IF_REAL , "Body resistance RBSDBX W scaling"), +IOP( "rbsdbxnf", BSIM4_MOD_RBSDBXNF, IF_REAL , "Body resistance RBSDBX NF scaling"), +IOP( "rbsdbyl", BSIM4_MOD_RBSDBYL, IF_REAL , "Body resistance RBSDBY L scaling"), +IOP( "rbsdbyw", BSIM4_MOD_RBSDBYW, IF_REAL , "Body resistance RBSDBY W scaling"), +IOP( "rbsdbynf", BSIM4_MOD_RBSDBYNF, IF_REAL , "Body resistance RBSDBY NF scaling"), + IOP( "lcdsc", BSIM4_MOD_LCDSC, IF_REAL, "Length dependence of cdsc"), IOP( "lcdscb", BSIM4_MOD_LCDSCB, IF_REAL, "Length dependence of cdscb"), IOP( "lcdscd", BSIM4_MOD_LCDSCD, IF_REAL, "Length dependence of cdscd"), @@ -429,6 +481,10 @@ IOP( "lub", BSIM4_MOD_LUB, IF_REAL, "Length dependence of ub"), IOP( "lub1", BSIM4_MOD_LUB1, IF_REAL, "Length dependence of ub1"), IOP( "luc", BSIM4_MOD_LUC, IF_REAL, "Length dependence of uc"), IOP( "luc1", BSIM4_MOD_LUC1, IF_REAL, "Length dependence of uc1"), +IOP( "lud", BSIM4_MOD_LUD, IF_REAL, "Length dependence of ud"), +IOP( "lud1", BSIM4_MOD_LUD1, IF_REAL, "Length dependence of ud1"), +IOP( "lup", BSIM4_MOD_LUP, IF_REAL, "Length dependence of up"), +IOP( "llp", BSIM4_MOD_LLP, IF_REAL, "Length dependence of lp"), IOP( "lu0", BSIM4_MOD_LU0, IF_REAL, "Length dependence of u0"), IOP( "lute", BSIM4_MOD_LUTE, IF_REAL, "Length dependence of ute"), IOP( "lvoff", BSIM4_MOD_LVOFF, IF_REAL, "Length dependence of voff"), @@ -469,6 +525,7 @@ IOP( "lcle", BSIM4_MOD_LCLE, IF_REAL, "Length dependence of cle"), IOP( "lalpha0", BSIM4_MOD_LALPHA0, IF_REAL, "Length dependence of alpha0"), IOP( "lalpha1", BSIM4_MOD_LALPHA1, IF_REAL, "Length dependence of alpha1"), IOP( "lbeta0", BSIM4_MOD_LBETA0, IF_REAL, "Length dependence of beta0"), + IOP( "lagidl", BSIM4_MOD_LAGIDL, IF_REAL, "Length dependence of agidl"), IOP( "lbgidl", BSIM4_MOD_LBGIDL, IF_REAL, "Length dependence of bgidl"), IOP( "lcgidl", BSIM4_MOD_LCGIDL, IF_REAL, "Length dependence of cgidl"), @@ -506,6 +563,8 @@ IOP( "lvtl", BSIM4_MOD_LVTL, IF_REAL, " Length dependence of vtl"), IOP( "lxn", BSIM4_MOD_LXN, IF_REAL, " Length dependence of xn"), IOP( "leu", BSIM4_MOD_LEU, IF_REAL, " Length dependence of eu"), IOP( "lvfbsdoff", BSIM4_MOD_LVFBSDOFF, IF_REAL, "Length dependence of vfbsdoff"), +IOP( "ltvfbsdoff", BSIM4_MOD_LTVFBSDOFF, IF_REAL, "Length dependence of tvfbsdoff"), +IOP( "ltvoff", BSIM4_MOD_LTVOFF, IF_REAL, "Length dependence of tvoff"), IOP( "wcdsc", BSIM4_MOD_WCDSC, IF_REAL, "Width dependence of cdsc"), IOP( "wcdscb", BSIM4_MOD_WCDSCB, IF_REAL, "Width dependence of cdscb"), @@ -558,6 +617,10 @@ IOP( "wub", BSIM4_MOD_WUB, IF_REAL, "Width dependence of ub"), IOP( "wub1", BSIM4_MOD_WUB1, IF_REAL, "Width dependence of ub1"), IOP( "wuc", BSIM4_MOD_WUC, IF_REAL, "Width dependence of uc"), IOP( "wuc1", BSIM4_MOD_WUC1, IF_REAL, "Width dependence of uc1"), +IOP( "wud", BSIM4_MOD_WUD, IF_REAL, "Width dependence of ud"), +IOP( "wud1", BSIM4_MOD_WUD1, IF_REAL, "Width dependence of ud1"), +IOP( "wup", BSIM4_MOD_WUP, IF_REAL, "Width dependence of up"), +IOP( "wlp", BSIM4_MOD_WLP, IF_REAL, "Width dependence of lp"), IOP( "wu0", BSIM4_MOD_WU0, IF_REAL, "Width dependence of u0"), IOP( "wute", BSIM4_MOD_WUTE, IF_REAL, "Width dependence of ute"), IOP( "wvoff", BSIM4_MOD_WVOFF, IF_REAL, "Width dependence of voff"), @@ -598,6 +661,7 @@ IOP( "wcle", BSIM4_MOD_WCLE, IF_REAL, "Width dependence of cle"), IOP( "walpha0", BSIM4_MOD_WALPHA0, IF_REAL, "Width dependence of alpha0"), IOP( "walpha1", BSIM4_MOD_WALPHA1, IF_REAL, "Width dependence of alpha1"), IOP( "wbeta0", BSIM4_MOD_WBETA0, IF_REAL, "Width dependence of beta0"), + IOP( "wagidl", BSIM4_MOD_WAGIDL, IF_REAL, "Width dependence of agidl"), IOP( "wbgidl", BSIM4_MOD_WBGIDL, IF_REAL, "Width dependence of bgidl"), IOP( "wcgidl", BSIM4_MOD_WCGIDL, IF_REAL, "Width dependence of cgidl"), @@ -634,6 +698,8 @@ IOP( "wvtl", BSIM4_MOD_WVTL, IF_REAL, "Width dependence of vtl"), IOP( "wxn", BSIM4_MOD_WXN, IF_REAL, "Width dependence of xn"), IOP( "weu", BSIM4_MOD_WEU, IF_REAL, "Width dependence of eu"), IOP( "wvfbsdoff", BSIM4_MOD_WVFBSDOFF, IF_REAL, "Width dependence of vfbsdoff"), +IOP( "wtvfbsdoff", BSIM4_MOD_WTVFBSDOFF, IF_REAL, "Width dependence of tvfbsdoff"), +IOP( "wtvoff", BSIM4_MOD_WTVOFF, IF_REAL, "Width dependence of tvoff"), IOP( "pcdsc", BSIM4_MOD_PCDSC, IF_REAL, "Cross-term dependence of cdsc"), IOP( "pcdscb", BSIM4_MOD_PCDSCB, IF_REAL, "Cross-term dependence of cdscb"), @@ -686,6 +752,10 @@ IOP( "pub", BSIM4_MOD_PUB, IF_REAL, "Cross-term dependence of ub"), IOP( "pub1", BSIM4_MOD_PUB1, IF_REAL, "Cross-term dependence of ub1"), IOP( "puc", BSIM4_MOD_PUC, IF_REAL, "Cross-term dependence of uc"), IOP( "puc1", BSIM4_MOD_PUC1, IF_REAL, "Cross-term dependence of uc1"), +IOP( "pud", BSIM4_MOD_PUD, IF_REAL, "Cross-term dependence of ud"), +IOP( "pud1", BSIM4_MOD_PUD1, IF_REAL, "Cross-term dependence of ud1"), +IOP( "pup", BSIM4_MOD_PUP, IF_REAL, "Cross-term dependence of up"), +IOP( "plp", BSIM4_MOD_PLP, IF_REAL, "Cross-term dependence of lp"), IOP( "pu0", BSIM4_MOD_PU0, IF_REAL, "Cross-term dependence of u0"), IOP( "pute", BSIM4_MOD_PUTE, IF_REAL, "Cross-term dependence of ute"), IOP( "pvoff", BSIM4_MOD_PVOFF, IF_REAL, "Cross-term dependence of voff"), @@ -726,6 +796,7 @@ IOP( "pcle", BSIM4_MOD_PCLE, IF_REAL, "Cross-term dependence of cle"), IOP( "palpha0", BSIM4_MOD_PALPHA0, IF_REAL, "Cross-term dependence of alpha0"), IOP( "palpha1", BSIM4_MOD_PALPHA1, IF_REAL, "Cross-term dependence of alpha1"), IOP( "pbeta0", BSIM4_MOD_PBETA0, IF_REAL, "Cross-term dependence of beta0"), + IOP( "pagidl", BSIM4_MOD_PAGIDL, IF_REAL, "Cross-term dependence of agidl"), IOP( "pbgidl", BSIM4_MOD_PBGIDL, IF_REAL, "Cross-term dependence of bgidl"), IOP( "pcgidl", BSIM4_MOD_PCGIDL, IF_REAL, "Cross-term dependence of cgidl"), @@ -762,6 +833,8 @@ IOP( "pvtl", BSIM4_MOD_PVTL, IF_REAL, "Cross-term dependence of vtl"), IOP( "pxn", BSIM4_MOD_PXN, IF_REAL, "Cross-term dependence of xn"), IOP( "peu", BSIM4_MOD_PEU, IF_REAL, "Cross-term dependence of eu"), IOP( "pvfbsdoff", BSIM4_MOD_PVFBSDOFF, IF_REAL, "Cross-term dependence of vfbsdoff"), +IOP( "ptvfbsdoff", BSIM4_MOD_PTVFBSDOFF, IF_REAL, "Cross-term dependence of tvfbsdoff"), +IOP( "ptvoff", BSIM4_MOD_PTVOFF, IF_REAL, "Cross-term dependence of tvoff"), /* stress effect*/ IOP( "saref", BSIM4_MOD_SAREF, IF_REAL, "Reference distance between OD edge to poly of one side"), @@ -785,7 +858,23 @@ IOP( "stk2", BSIM4_MOD_STK2, IF_REAL, "K2 shift factor related to stress effect IOP( "lodk2", BSIM4_MOD_LODK2, IF_REAL, "K2 shift modification factor for stress effect"), IOP( "steta0", BSIM4_MOD_STETA0, IF_REAL, "eta0 shift factor related to stress effect on vth"), IOP( "lodeta0", BSIM4_MOD_LODETA0, IF_REAL, "eta0 shift modification factor for stress effect"), - +/* Well Proximity Effect */ +IOP( "web", BSIM4_MOD_WEB, IF_REAL, "Coefficient for SCB"), +IOP( "wec", BSIM4_MOD_WEC, IF_REAL, "Coefficient for SCC"), +IOP( "kvth0we", BSIM4_MOD_KVTH0WE, IF_REAL, "Threshold shift factor for well proximity effect"), +IOP( "k2we", BSIM4_MOD_K2WE, IF_REAL, " K2 shift factor for well proximity effect "), +IOP( "ku0we", BSIM4_MOD_KU0WE, IF_REAL, " Mobility degradation factor for well proximity effect "), +IOP( "scref", BSIM4_MOD_SCREF, IF_REAL, " Reference distance to calculate SCA, SCB and SCC"), +IOP( "wpemod", BSIM4_MOD_WPEMOD, IF_REAL, " Flag for WPE model (WPEMOD=1 to activate this model) "), +IOP( "lkvth0we", BSIM4_MOD_LKVTH0WE, IF_REAL, "Length dependence of kvth0we"), +IOP( "lk2we", BSIM4_MOD_LK2WE, IF_REAL, " Length dependence of k2we "), +IOP( "lku0we", BSIM4_MOD_LKU0WE, IF_REAL, " Length dependence of ku0we "), +IOP( "wkvth0we", BSIM4_MOD_WKVTH0WE, IF_REAL, "Width dependence of kvth0we"), +IOP( "wk2we", BSIM4_MOD_WK2WE, IF_REAL, " Width dependence of k2we "), +IOP( "wku0we", BSIM4_MOD_WKU0WE, IF_REAL, " Width dependence of ku0we "), +IOP( "pkvth0we", BSIM4_MOD_PKVTH0WE, IF_REAL, "Cross-term dependence of kvth0we"), +IOP( "pk2we", BSIM4_MOD_PK2WE, IF_REAL, " Cross-term dependence of k2we "), +IOP( "pku0we", BSIM4_MOD_PKU0WE, IF_REAL, " Cross-term dependence of ku0we "), IOP( "noia", BSIM4_MOD_NOIA, IF_REAL, "Flicker noise parameter"), IOP( "noib", BSIM4_MOD_NOIB, IF_REAL, "Flicker noise parameter"), diff --git a/src/spicelib/devices/bsim4/b4acld.c b/src/spicelib/devices/bsim4/b4acld.c index e1be82e7f..7949daf81 100644 --- a/src/spicelib/devices/bsim4/b4acld.c +++ b/src/spicelib/devices/bsim4/b4acld.c @@ -1,10 +1,10 @@ -/**** BSIM4.4.0 Released by Xuemei (Jane) Xi 03/04/2004 ****/ +/**** BSIM4.5.0 Released by Xuemei (Jane) Xi 07/29/2005 ****/ /********** - * Copyright 2004 Regents of the University of California. All rights reserved. - * File: b4acld.c of BSIM4.4.0. + * Copyright 2005 Regents of the University of California. All rights reserved. + * File: b4acld.c of BSIM4.5.0. * Author: 2000 Weidong Liu - * Authors: 2001- Xuemei Xi, Jin He, Kanyu Cao, Mohan Dunga, Mansun Chan, Ali Niknejad, Chenming Hu. + * Authors: 2001- Xuemei Xi, Mohan Dunga, Ali Niknejad, Chenming Hu. * Project Director: Prof. Chenming Hu. * Modified by Xuemei Xi, 10/05/2001. **********/ @@ -58,8 +58,8 @@ double m; for (; model != NULL; model = model->BSIM4nextModel) { for (here = model->BSIM4instances; here!= NULL; here = here->BSIM4nextInstance) - { if (here->BSIM4owner != ARCHme) continue; - pParam = here->pParam; + { if (here->BSIM4owner != ARCHme) continue; + pParam = here->pParam; capbd = here->BSIM4capbd; capbs = here->BSIM4capbs; cgso = here->BSIM4cgso; @@ -450,7 +450,6 @@ double m; /* * Loading AC matrix */ - m = here->BSIM4m; if (!model->BSIM4rdsMod) diff --git a/src/spicelib/devices/bsim4/b4ask.c b/src/spicelib/devices/bsim4/b4ask.c index e3e88f92f..56641b20c 100644 --- a/src/spicelib/devices/bsim4/b4ask.c +++ b/src/spicelib/devices/bsim4/b4ask.c @@ -1,14 +1,15 @@ -/**** BSIM4.4.0 Released by Xuemei (Jane) Xi 03/04/2004 ****/ +/**** BSIM4.5.0 Released by Xuemei (Jane) Xi 07/27/2005 ****/ /********** - * Copyright 2004 Regents of the University of California. All rights reserved. - * File: b4ask.c of BSIM4.4.0. + * Copyright 2005 Regents of the University of California. All rights reserved. + * File: b4ask.c of BSIM4.5.0. * Author: 2000 Weidong Liu - * Authors: 2001- Xuemei Xi, Jin He, Kanyu Cao, Mohan Dunga, Mansun Chan, Ali Niknejad, Chenming Hu. + * Authors: 2001- Xuemei Xi, Mohan Dunga, Ali Niknejad, Chenming Hu. * Project Director: Prof. Chenming Hu. * Modified by Xuemei Xi, 04/06/2001. * Modified by Xuemei Xi, 10/05/2001. * Modified by Xuemei Xi, 05/09/2003. + * Modified by Xuemei Xi, Mohan Dunga, 07/29/2005. **********/ #include "ngspice.h" @@ -39,7 +40,7 @@ BSIM4instance *here = (BSIM4instance*)inst; case BSIM4_M: value->rValue = here->BSIM4m; return(OK); - case BSIM4_NF: + case BSIM4_NF: value->rValue = here->BSIM4nf; return(OK); case BSIM4_MIN: @@ -75,6 +76,19 @@ BSIM4instance *here = (BSIM4instance*)inst; case BSIM4_SD: value->rValue = here->BSIM4sd ; return(OK); + case BSIM4_SCA: + value->rValue = here->BSIM4sca ; + return(OK); + case BSIM4_SCB: + value->rValue = here->BSIM4scb ; + return(OK); + case BSIM4_SCC: + value->rValue = here->BSIM4scc ; + return(OK); + case BSIM4_SC: + value->rValue = here->BSIM4sc ; + return(OK); + case BSIM4_RBSB: value->rValue = here->BSIM4rbsb; return(OK); @@ -90,6 +104,15 @@ BSIM4instance *here = (BSIM4instance*)inst; case BSIM4_RBPD: value->rValue = here->BSIM4rbpd; return(OK); + case BSIM4_DELVTO: + value->rValue = here->BSIM4delvto; + return(OK); + case BSIM4_XGW: + value->rValue = here->BSIM4xgw; + return(OK); + case BSIM4_NGCON: + value->rValue = here->BSIM4ngcon; + return(OK); case BSIM4_TRNQSMOD: value->iValue = here->BSIM4trnqsMod; return(OK); @@ -249,6 +272,15 @@ BSIM4instance *here = (BSIM4instance*)inst; case BSIM4_QD: value->rValue = here->BSIM4qdrn; return(OK); + case BSIM4_QDEF: + value->rValue = *(ckt->CKTstate0 + here->BSIM4qdef); + return(OK); + case BSIM4_GCRG: + value->rValue = here->BSIM4gcrg; + return(OK); + case BSIM4_GTAU: + value->rValue = here->BSIM4gtau; + return(OK); case BSIM4_CGGB: value->rValue = here->BSIM4cggb; return(OK); diff --git a/src/spicelib/devices/bsim4/b4check.c b/src/spicelib/devices/bsim4/b4check.c index 861a881aa..6a59e52f4 100644 --- a/src/spicelib/devices/bsim4/b4check.c +++ b/src/spicelib/devices/bsim4/b4check.c @@ -1,16 +1,17 @@ -/**** BSIM4.4.0 Released by Xuemei (Jane) Xi 03/04/2004 ****/ +/**** BSIM4.5.0 Released by Xuemei (Jane) Xi 07/29/2005 ****/ /********** - * Copyright 2004 Regents of the University of California. All rights reserved. - * File: b4check.c of BSIM4.4.0. + * Copyright 2005 Regents of the University of California. All rights reserved. + * File: b4check.c of BSIM4.5.0. * Author: 2000 Weidong Liu - * Authors: 2001- Xuemei Xi, Jin He, Kanyu Cao, Mohan Dunga, Mansun Chan, Ali Niknejad, Chenming Hu. + * Authors: 2001- Xuemei Xi, Mohan Dunga, Ali Niknejad, Chenming Hu. * Project Director: Prof. Chenming Hu. * Modified by Xuemei Xi, 04/06/2001. * Modified by Xuemei Xi, 10/05/2001. * Modified by Xuemei Xi, 11/15/2002. * Modified by Xuemei Xi, 05/09/2003. * Modified by Xuemei Xi, 03/04/2004. + * Modified by Xuemei Xi, 07/29/2005. **********/ #include "ngspice.h" @@ -35,13 +36,13 @@ FILE *fplog; if ((fplog = fopen("bsim4.out", "w")) != NULL) { pParam = here->pParam; fprintf(fplog, "BSIM4: Berkeley Short Channel IGFET Model-4\n"); - fprintf(fplog, "Developed by Xuemei (Jane) Xi, Jin He, Mohan Dunga, Prof. Ali Niknejad and Prof. Chenming Hu in 2003.\n"); + fprintf(fplog, "Developed by Xuemei (Jane) Xi, Mohan Dunga, Prof. Ali Niknejad and Prof. Chenming Hu in 2003.\n"); fprintf(fplog, "\n"); fprintf(fplog, "++++++++++ BSIM4 PARAMETER CHECKING BELOW ++++++++++\n"); - if (strcmp(model->BSIM4version, "4.4.0") != 0) - { fprintf(fplog, "Warning: This model is BSIM4.4.0; you specified a wrong version number.\n"); - printf("Warning: This model is BSIM4.4.0; you specified a wrong version number.\n"); + if (strcmp(model->BSIM4version, "4.5.0") != 0) + { fprintf(fplog, "Warning: This model is BSIM4.5.0; you specified a wrong version number.\n"); + printf("Warning: This model is BSIM4.5.0; you specified a wrong version number.\n"); } fprintf(fplog, "Model = %s\n", model->BSIM4modName); @@ -209,12 +210,13 @@ FILE *fplog; printf("Fatal: Drout = %g is negative.\n", pParam->BSIM4drout); Fatal_Flag = 1; } - - if (here->BSIM4m < 1.0) + + /*if (here->BSIM4m < 1.0) { fprintf(fplog, "Fatal: Number of multiplier = %g is smaller than one.\n", here->BSIM4m); printf("Fatal: Number of multiplier = %g is smaller than one.\n", here->BSIM4m); Fatal_Flag = 1; - } + }*/ + if (here->BSIM4nf < 1.0) { fprintf(fplog, "Fatal: Number of finger = %g is smaller than one.\n", here->BSIM4nf); printf("Fatal: Number of finger = %g is smaller than one.\n", here->BSIM4nf); @@ -240,13 +242,13 @@ FILE *fplog; printf("Fatal: The parameter xgl must be smaller than Ldrawn+XL.\n"); Fatal_Flag = 1; } - if (model->BSIM4ngcon < 1.0) + if (here->BSIM4ngcon < 1.0) { fprintf(fplog, "Fatal: The parameter ngcon cannot be smaller than one.\n"); printf("Fatal: The parameter ngcon cannot be smaller than one.\n"); Fatal_Flag = 1; } - if ((model->BSIM4ngcon != 1.0) && (model->BSIM4ngcon != 2.0)) - { model->BSIM4ngcon = 1.0; + if ((here->BSIM4ngcon != 1.0) && (here->BSIM4ngcon != 2.0)) + { here->BSIM4ngcon = 1.0; fprintf(fplog, "Warning: Ngcon must be equal to one or two; reset to 1.0.\n"); printf("Warning: Ngcon must be equal to one or two; reset to 1.0.\n"); } @@ -334,6 +336,50 @@ FILE *fplog; pParam->BSIM4ckappad = 0.02; } + if (model->BSIM4vtss < 0.0) + { fprintf(fplog, "Fatal: Vtss = %g is negative.\n", + model->BSIM4vtss); + printf("Fatal: Vtss = %g is negative.\n", + model->BSIM4vtss); + Fatal_Flag = 1; + } + if (model->BSIM4vtsd < 0.0) + { fprintf(fplog, "Fatal: Vtsd = %g is negative.\n", + model->BSIM4vtsd); + printf("Fatal: Vtsd = %g is negative.\n", + model->BSIM4vtsd); + Fatal_Flag = 1; + } + if (model->BSIM4vtssws < 0.0) + { fprintf(fplog, "Fatal: Vtssws = %g is negative.\n", + model->BSIM4vtssws); + printf("Fatal: Vtssws = %g is negative.\n", + model->BSIM4vtssws); + Fatal_Flag = 1; + } + if (model->BSIM4vtsswd < 0.0) + { fprintf(fplog, "Fatal: Vtsswd = %g is negative.\n", + model->BSIM4vtsswd); + printf("Fatal: Vtsswd = %g is negative.\n", + model->BSIM4vtsswd); + Fatal_Flag = 1; + } + if (model->BSIM4vtsswgs < 0.0) + { fprintf(fplog, "Fatal: Vtsswgs = %g is negative.\n", + model->BSIM4vtsswgs); + printf("Fatal: Vtsswgs = %g is negative.\n", + model->BSIM4vtsswgs); + Fatal_Flag = 1; + } + if (model->BSIM4vtsswgd < 0.0) + { fprintf(fplog, "Fatal: Vtsswgd = %g is negative.\n", + model->BSIM4vtsswgd); + printf("Fatal: Vtsswgd = %g is negative.\n", + model->BSIM4vtsswgd); + Fatal_Flag = 1; + } + + if (model->BSIM4paramChk ==1) { /* Check L and W parameters */ @@ -634,7 +680,11 @@ FILE *fplog; printf("Warning: cgso = %g is negative. Set to zero.\n", model->BSIM4cgso); model->BSIM4cgso = 0.0; } - + if (model->BSIM4cgbo < 0.0) + { fprintf(fplog, "Warning: cgbo = %g is negative. Set to zero.\n", model->BSIM4cgbo); + printf("Warning: cgbo = %g is negative. Set to zero.\n", model->BSIM4cgbo); + model->BSIM4cgbo = 0.0; + } if (model->BSIM4tnoiMod == 1) { if (model->BSIM4tnoia < 0.0) { fprintf(fplog, "Warning: tnoia = %g is negative. Set to zero.\n", model->BSIM4tnoia); @@ -689,49 +739,72 @@ FILE *fplog; printf("Warning: Njtsswg = %g is negative at temperature = %g.\n", model->BSIM4njtsswgtemp, ckt->CKTtemp); } - if (model->BSIM4vtss < 0.0) - { fprintf(fplog, "Warning: Vtss = %g is negative.\n", - model->BSIM4vtss); - printf("Warning: Vtss = %g is negative.\n", - model->BSIM4vtss); - } - if (model->BSIM4vtsd < 0.0) - { fprintf(fplog, "Warning: Vtsd = %g is negative.\n", - model->BSIM4vtsd); - printf("Warning: Vtsd = %g is negative.\n", - model->BSIM4vtsd); - } - if (model->BSIM4vtssws < 0.0) - { fprintf(fplog, "Warning: Vtssws = %g is negative.\n", - model->BSIM4vtssws); - printf("Warning: Vtssws = %g is negative.\n", - model->BSIM4vtssws); - } - if (model->BSIM4vtsswd < 0.0) - { fprintf(fplog, "Warning: Vtsswd = %g is negative.\n", - model->BSIM4vtsswd); - printf("Warning: Vtsswd = %g is negative.\n", - model->BSIM4vtsswd); - } - if (model->BSIM4vtsswgs < 0.0) - { fprintf(fplog, "Warning: Vtsswgs = %g is negative.\n", - model->BSIM4vtsswgs); - printf("Warning: Vtsswgs = %g is negative.\n", - model->BSIM4vtsswgs); - } - if (model->BSIM4vtsswgd < 0.0) - { fprintf(fplog, "Warning: Vtsswgd = %g is negative.\n", - model->BSIM4vtsswgd); - printf("Warning: Vtsswgd = %g is negative.\n", - model->BSIM4vtsswgd); - } - if (model->BSIM4ntnoi < 0.0) { fprintf(fplog, "Warning: ntnoi = %g is negative. Set to zero.\n", model->BSIM4ntnoi); printf("Warning: ntnoi = %g is negative. Set to zero.\n", model->BSIM4ntnoi); model->BSIM4ntnoi = 0.0; } + /* diode model */ + if (model->BSIM4SbulkJctBotGradingCoeff >= 0.99) + { fprintf(fplog, "Warning: MJS = %g is too big. Set to 0.99.\n", model->BSIM4SbulkJctBotGradingCoeff); + printf("Warning: MJS = %g is too big. Set to 0.99.\n", model->BSIM4SbulkJctBotGradingCoeff); + model->BSIM4SbulkJctBotGradingCoeff = 0.99; + } + if (model->BSIM4SbulkJctSideGradingCoeff >= 0.99) + { fprintf(fplog, "Warning: MJSWS = %g is too big. Set to 0.99.\n", model->BSIM4SbulkJctSideGradingCoeff); + printf("Warning: MJSWS = %g is too big. Set to 0.99.\n", model->BSIM4SbulkJctSideGradingCoeff); + model->BSIM4SbulkJctSideGradingCoeff = 0.99; + } + if (model->BSIM4SbulkJctGateSideGradingCoeff >= 0.99) + { fprintf(fplog, "Warning: MJSWGS = %g is too big. Set to 0.99.\n", model->BSIM4SbulkJctGateSideGradingCoeff); + printf("Warning: MJSWGS = %g is too big. Set to 0.99.\n", model->BSIM4SbulkJctGateSideGradingCoeff); + model->BSIM4SbulkJctGateSideGradingCoeff = 0.99; + } + + if (model->BSIM4DbulkJctBotGradingCoeff >= 0.99) + { fprintf(fplog, "Warning: MJD = %g is too big. Set to 0.99.\n", model->BSIM4DbulkJctBotGradingCoeff); + printf("Warning: MJD = %g is too big. Set to 0.99.\n", model->BSIM4DbulkJctBotGradingCoeff); + model->BSIM4DbulkJctBotGradingCoeff = 0.99; + } + if (model->BSIM4DbulkJctSideGradingCoeff >= 0.99) + { fprintf(fplog, "Warning: MJSWD = %g is too big. Set to 0.99.\n", model->BSIM4DbulkJctSideGradingCoeff); + printf("Warning: MJSWD = %g is too big. Set to 0.99.\n", model->BSIM4DbulkJctSideGradingCoeff); + model->BSIM4DbulkJctSideGradingCoeff = 0.99; + } + if (model->BSIM4DbulkJctGateSideGradingCoeff >= 0.99) + { fprintf(fplog, "Warning: MJSWGD = %g is too big. Set to 0.99.\n", model->BSIM4DbulkJctGateSideGradingCoeff); + printf("Warning: MJSWGD = %g is too big. Set to 0.99.\n", model->BSIM4DbulkJctGateSideGradingCoeff); + model->BSIM4DbulkJctGateSideGradingCoeff = 0.99; + } + if (model->BSIM4wpemod == 1) + { + if (model->BSIM4scref <= 0.0) + { fprintf(fplog, "Warning: SCREF = %g is not positive. Set to 1e-6.\n", model->BSIM4scref); + printf("Warning: SCREF = %g is not positive. Set to 1e-6.\n", model->BSIM4scref); + model->BSIM4scref = 1e-6; + } + if (here->BSIM4sca < 0.0) + { fprintf(fplog, "Warning: SCA = %g is negative. Set to 0.0.\n", here->BSIM4sca); + printf("Warning: SCA = %g is negative. Set to 0.0.\n", here->BSIM4sca); + here->BSIM4sca = 0.0; + } + if (here->BSIM4scb < 0.0) + { fprintf(fplog, "Warning: SCB = %g is negative. Set to 0.0.\n", here->BSIM4scb); + printf("Warning: SCB = %g is negative. Set to 0.0.\n", here->BSIM4scb); + here->BSIM4scb = 0.0; + } + if (here->BSIM4scc < 0.0) + { fprintf(fplog, "Warning: SCC = %g is negative. Set to 0.0.\n", here->BSIM4scc); + printf("Warning: SCC = %g is negative. Set to 0.0.\n", here->BSIM4scc); + here->BSIM4scc = 0.0; + } + if (here->BSIM4sc < 0.0) + { fprintf(fplog, "Warning: SC = %g is negative. Set to 0.0.\n", here->BSIM4sc); + printf("Warning: SC = %g is negative. Set to 0.0.\n", here->BSIM4sc); + here->BSIM4sc = 0.0; + } + } }/* loop for the parameter check for warning messages */ fclose(fplog); } diff --git a/src/spicelib/devices/bsim4/b4cvtest.c b/src/spicelib/devices/bsim4/b4cvtest.c index 9bceba234..faa18ee48 100644 --- a/src/spicelib/devices/bsim4/b4cvtest.c +++ b/src/spicelib/devices/bsim4/b4cvtest.c @@ -1,10 +1,10 @@ -/**** BSIM4.4.0 Released by Xuemei (Jane) Xi 03/04/2004 ****/ +/**** BSIM4.5.0 Released by Xuemei (Jane) Xi 07/29/2005 ****/ /********** - * Copyright 2004 Regents of the University of California. All rights reserved. - * File: b4cvtest.c of BSIM4.4.0. + * Copyright 2005 Regents of the University of California. All rights reserved. + * File: b4cvtest.c of BSIM4.5.0. * Author: 2000 Weidong Liu - * Authors: 2001- Xuemei Xi, Jin He, Kanyu Cao, Mohan Dunga, Mansun Chan, Ali Niknejad, Chenming Hu. + * Authors: 2001- Xuemei Xi, Mohan Dunga, Ali Niknejad, Chenming Hu. * Project Director: Prof. Chenming Hu. * Modified by Xuemei Xi, 04/06/2001. * Modified by Xuemei Xi, 10/05/2001. @@ -42,9 +42,8 @@ double tol0, tol1, tol2, tol3, tol4, tol5, tol6; for (; model != NULL; model = model->BSIM4nextModel) { for (here = model->BSIM4instances; here != NULL ; here=here->BSIM4nextInstance) - { - if (here->BSIM4owner != ARCHme) continue; - vds = model->BSIM4type + { if (here->BSIM4owner != ARCHme) continue; + vds = model->BSIM4type * (*(ckt->CKTrhsOld + here->BSIM4dNodePrime) - *(ckt->CKTrhsOld + here->BSIM4sNodePrime)); vgs = model->BSIM4type diff --git a/src/spicelib/devices/bsim4/b4del.c b/src/spicelib/devices/bsim4/b4del.c index 8f5fad6f9..d49e2e60f 100644 --- a/src/spicelib/devices/bsim4/b4del.c +++ b/src/spicelib/devices/bsim4/b4del.c @@ -1,10 +1,10 @@ -/**** BSIM4.4.0 Released by Xuemei (Jane) Xi 03/04/2004 ****/ +/**** BSIM4.5.0 Released by Xuemei (Jane) Xi 07/29/2005 ****/ /********** - * Copyright 2004 Regents of the University of California. All rights reserved. - * File: b4del.c of BSIM4.4.0. + * Copyright 2005 Regents of the University of California. All rights reserved. + * File: b4del.c of BSIM4.5.0. * Author: 2000 Weidong Liu - * Authors: 2001- Xuemei Xi, Jin He, Kanyu Cao, Mohan Dunga, Mansun Chan, Ali Niknejad, Chenming Hu. + * Authors: 2001- Xuemei Xi, Mohan Dunga, Ali Niknejad, Chenming Hu. * Project Director: Prof. Chenming Hu. **********/ diff --git a/src/spicelib/devices/bsim4/b4dest.c b/src/spicelib/devices/bsim4/b4dest.c index 78e738923..eb60d1fe9 100644 --- a/src/spicelib/devices/bsim4/b4dest.c +++ b/src/spicelib/devices/bsim4/b4dest.c @@ -1,10 +1,10 @@ -/**** BSIM4.4.0 Released by Xuemei (Jane) Xi 03/04/2004 ****/ +/**** BSIM4.5.0 Released by Xuemei (Jane) Xi 07/29/2005 ****/ /********** - * Copyright 2004 Regents of the University of California. All rights reserved. - * File: b4dest.c of BSIM4.4.0. + * Copyright 2005 Regents of the University of California. All rights reserved. + * File: b4dest.c of BSIM4.5.0. * Author: 2000 Weidong Liu - * Authors: 2001- Xuemei Xi, Jin He, Kanyu Cao, Mohan Dunga, Mansun Chan, Ali Niknejad, Chenming Hu. + * Authors: 2001- Xuemei Xi, Mohan Dunga, Ali Niknejad, Chenming Hu. * Project Director: Prof. Chenming Hu. **********/ diff --git a/src/spicelib/devices/bsim4/b4geo.c b/src/spicelib/devices/bsim4/b4geo.c index 936b32908..408d59199 100644 --- a/src/spicelib/devices/bsim4/b4geo.c +++ b/src/spicelib/devices/bsim4/b4geo.c @@ -1,10 +1,10 @@ -/**** BSIM4.4.0 Released by Xuemei(Jane) Xi 03/04/2004 ****/ +/**** BSIM4.5.0 Released by Xuemei (Jane) Xi 07/29/2005 ****/ /********** - * Copyright 2003 Regents of the University of California. All rights reserved. - * File: b4geo.c of BSIM4.4.0. + * Copyright 2005 Regents of the University of California. All rights reserved. + * File: b4geo.c of BSIM4.5.0. * Author: 2000 Weidong Liu - * Authors: 2001- Xuemei Xi, Jin He, Kanyu Cao, Mohan Dunga, Mansun Chan, Ali Niknejad, Chenming Hu. + * Authors: 2001- Xuemei Xi, Mohan Dunga, Ali Niknejad, Chenming Hu. * Project Director: Prof. Chenming Hu. **********/ diff --git a/src/spicelib/devices/bsim4/b4getic.c b/src/spicelib/devices/bsim4/b4getic.c index 87181313f..55c609a42 100644 --- a/src/spicelib/devices/bsim4/b4getic.c +++ b/src/spicelib/devices/bsim4/b4getic.c @@ -1,10 +1,10 @@ -/**** BSIM4.4.0 Released by Xuemei (Jane) Xi 03/04/2004 ****/ +/**** BSIM4.5.0 Released by Xuemei (Jane) Xi 07/29/2005 ****/ /********** - * Copyright 2004 Regents of the University of California. All rights reserved. - * File: b4getic.c of BSIM4.4.0. + * Copyright 2005 Regents of the University of California. All rights reserved. + * File: b4getic.c of BSIM4.5.0. * Author: 2000 Weidong Liu - * Authors: 2001- Xuemei Xi, Jin He, Kanyu Cao, Mohan Dunga, Mansun Chan, Ali Niknejad, Chenming Hu. + * Authors: 2001- Xuemei Xi, Mohan Dunga, Ali Niknejad, Chenming Hu. * Project Director: Prof. Chenming Hu. **********/ @@ -25,8 +25,8 @@ BSIM4instance *here; for (; model ; model = model->BSIM4nextModel) { for (here = model->BSIM4instances; here; here = here->BSIM4nextInstance) - { if (here->BSIM4owner != ARCHme) continue; - if (!here->BSIM4icVDSGiven) + { if (here->BSIM4owner != ARCHme) continue; + if (!here->BSIM4icVDSGiven) { here->BSIM4icVDS = *(ckt->CKTrhs + here->BSIM4dNode) - *(ckt->CKTrhs + here->BSIM4sNode); } diff --git a/src/spicelib/devices/bsim4/b4ld.c b/src/spicelib/devices/bsim4/b4ld.c index e4b664179..519b357af 100644 --- a/src/spicelib/devices/bsim4/b4ld.c +++ b/src/spicelib/devices/bsim4/b4ld.c @@ -1,19 +1,17 @@ -/**** - BSIM4.4.0 Released by Xuemei (Jane) Xi 03/04/2004 - $Id$ -****/ +/**** BSIM4.5.0 Released by Xuemei (Jane) Xi 07/29/2005 ****/ /********** - * Copyright 2004 Regents of the University of California. All rights reserved. - * File: b4ld.c of BSIM4.4.0. + * Copyright 2005 Regents of the University of California. All rights reserved. + * File: b4ld.c of BSIM4.5.0. * Author: 2000 Weidong Liu - * Authors: 2001- Xuemei Xi, Jin He, Kanyu Cao, Mohan Dunga, Mansun Chan, Ali Niknejad, Chenming Hu. + * Authors: 2001- Xuemei Xi, Mohan Dunga, Ali Niknejad, Chenming Hu. * Project Director: Prof. Chenming Hu. * Modified by Xuemei Xi, 04/06/2001. * Modified by Xuemei Xi, 10/05/2001. * Modified by Xuemei Xi, 11/15/2002. * Modified by Xuemei Xi, 05/09/2003. - * Modified by Xuemei Xi, 03/04/2004. + * Modified by Xuemei Xi, 02/06/2004. + * Modified by Xuemei Xi, Mohan Dunga, 07/29/2005. **********/ #include "ngspice.h" @@ -24,7 +22,11 @@ #include "sperror.h" #include "devdefs.h" #include "suffix.h" - +/* +#define MAX_EXP 2.688117142e+43 +#define MIN_EXP 3.720075976e-44 +#define EXP_THRESHOLD 100.0 +*/ #define MAX_EXP 5.834617425e14 #define MIN_EXP 1.713908431e-15 #define EXP_THRESHOLD 34.0 @@ -67,9 +69,7 @@ double dRs_dvg, dRd_dvg, dRs_dvb, dRd_dvb; double dT0_dvg, dT1_dvb, dT3_dvg, dT3_dvb; double vses, vdes, vdedo, delvses, delvded, delvdes; double Isestot=0.0, cseshat=0.0, Idedtot=0.0, cdedhat=0.0; -//#ifndef NEWCONV -//double tol0, tol1, tol2, tol3, tol4, tol5, tol6; -//#endif +double tol0, tol1, tol2, tol3, tol4, tol5, tol6; double geltd, gcrg, gcrgg, gcrgd, gcrgs, gcrgb, ceqgcrg; double vges, vgms, vgedo, vgmdo, vged, vgmd, delvged, delvgmd; @@ -98,7 +98,7 @@ double Vdb, Vds, Vgs, Vbs, Gmbs, FwdSum, RevSum; double Igidl, Ggidld, Ggidlg, Ggidlb; double Voxacc=0.0, dVoxacc_dVg=0.0, dVoxacc_dVb=0.0; double Voxdepinv=0.0, dVoxdepinv_dVg=0.0, dVoxdepinv_dVd=0.0, dVoxdepinv_dVb=0.0; -double VxNVt, ExpVxNVt, Vaux, dVaux_dVg, dVaux_dVd, dVaux_dVb; +double VxNVt=0.0, ExpVxNVt, Vaux=0.0, dVaux_dVg=0.0, dVaux_dVd=0.0, dVaux_dVb=0.0; double Igc, dIgc_dVg, dIgc_dVd, dIgc_dVb; double Igcs, dIgcs_dVg, dIgcs_dVd, dIgcs_dVb; double Igcd, dIgcd_dVg, dIgcd_dVd, dIgcd_dVb; @@ -114,10 +114,10 @@ double Igstot=0.0, cgshat=0.0, Igdtot=0.0, cgdhat=0.0, Igbtot=0.0, cgbhat=0.0; double Vgs_eff, Vfb=0.0, Vth_NarrowW; double Phis, dPhis_dVb, sqrtPhis, dsqrtPhis_dVb, Vth, dVth_dVb, dVth_dVd; double Vgst, dVgst_dVg, dVgst_dVb, dVgs_eff_dVg, Nvtms, Nvtmd; -double Vtm; +double Vtm, Vtm0; double n, dn_dVb, dn_dVd, voffcv, noff, dnoff_dVd, dnoff_dVb; double V0, CoxWLcen, QovCox, LINK; -double DeltaPhi, dDeltaPhi_dVg; +double DeltaPhi, dDeltaPhi_dVg, VgDP, dVgDP_dVg; double Cox, Tox, Tcen, dTcen_dVg, dTcen_dVd, dTcen_dVb; double Ccen, Coxeff, dCoxeff_dVd, dCoxeff_dVg, dCoxeff_dVb; double Denomi, dDenomi_dVg, dDenomi_dVd, dDenomi_dVb; @@ -134,7 +134,7 @@ double T2, dT2_dVg, dT2_dVd, dT2_dVb; double T3, dT3_dVg, dT3_dVd, dT3_dVb; double T4, dT4_dVd, dT4_dVb; double T5, dT5_dVg, dT5_dVd, dT5_dVb; -double T6=0.0, dT6_dVg, dT6_dVd, dT6_dVb; +double T6, dT6_dVg, dT6_dVd, dT6_dVb; double T7, dT7_dVg, dT7_dVd, dT7_dVb; double T8, dT8_dVg, dT8_dVd, dT8_dVb; double T9, dT9_dVg, dT9_dVd, dT9_dVb; @@ -171,7 +171,7 @@ double Rds, dRds_dVg, dRds_dVb, WVCox, WVCoxRds; double Vgst2Vtm, VdsatCV; double Leff, Weff, dWeff_dVg, dWeff_dVb; double AbulkCV, dAbulkCV_dVb; -double qcheq=0.0, qdef, gqdef=0.0, cqdef=0.0, cqcheq=0.0; +double qcheq, qdef, gqdef=0.0, cqdef=0.0, cqcheq=0.0; double gcqdb=0.0, gcqsb=0.0, gcqgb=0.0, gcqbb=0.0; double dxpart, sxpart, ggtg, ggtd, ggts, ggtb; double ddxpart_dVd, ddxpart_dVg, ddxpart_dVb, ddxpart_dVs; @@ -187,7 +187,6 @@ double ggidld, ggidlg, ggidlb, ggislg, ggislb, ggisls; double Igisl, Ggislg, Ggislb, Ggisls; double Nvtmrs, Nvtmrssw, Nvtmrsswg; - double vs, Fsevl, dvs_dVg, dvs_dVd, dvs_dVb, dFsevl_dVg, dFsevl_dVd, dFsevl_dVb; double vgdx, vgsx; struct bsim4SizeDependParam *pParam; @@ -200,11 +199,12 @@ ChargeComputationNeeded = ((ckt->CKTmode & (MODEAC | MODETRAN | MODEINITSMSIG)) || ((ckt->CKTmode & MODETRANOP) && (ckt->CKTmode & MODEUIC))) ? 1 : 0; +ChargeComputationNeeded = 1; for (; model != NULL; model = model->BSIM4nextModel) { for (here = model->BSIM4instances; here != NULL; here = here->BSIM4nextInstance) - { if (here->BSIM4owner != ARCHme) continue; + { if (here->BSIM4owner != ARCHme) continue; Check = Check1 = Check2 = 1; ByPass = 0; pParam = here->pParam; @@ -845,83 +845,85 @@ for (; model != NULL; model = model->BSIM4nextModel) } } - /* trap-assisted tunneling and recombination current for reverse bias */ + /* trap-assisted tunneling and recombination current for reverse bias */ Nvtmrssw = model->BSIM4vtm0 * model->BSIM4njtsswtemp; Nvtmrsswg = model->BSIM4vtm0 * model->BSIM4njtsswgtemp; Nvtmrs = model->BSIM4vtm0 * model->BSIM4njtstemp; - if ((model->BSIM4vtss - vbs) < 1e-3) + if ((model->BSIM4vtss - vbs_jct) < (model->BSIM4vtss * 1e-3)) { T9 = 1.0e3; - T0 = - vbs / Nvtmrs * T9; + T0 = - vbs_jct / Nvtmrs * T9; DEXP(T0, T1, T10); dT1_dVb = T10 / Nvtmrs * T9; } else { - T9 = 1.0 / (model->BSIM4vtss - vbs); - T0 = -vbs / Nvtmrs * model->BSIM4vtss * T9; - dT0_dVb = model->BSIM4vtss / Nvtmrs * (T9 + vbs * T9 * T9) ; + T9 = 1.0 / (model->BSIM4vtss - vbs_jct); + T0 = -vbs_jct / Nvtmrs * model->BSIM4vtss * T9; + dT0_dVb = model->BSIM4vtss / Nvtmrs * (T9 + vbs_jct * T9 * T9) ; DEXP(T0, T1, T10); dT1_dVb = T10 * dT0_dVb; } - if ((model->BSIM4vtsd - vbd) < 1e-3) - { T9 = 1.0e3; - T0 = -vbd / Nvtmrs * T9; + if ((model->BSIM4vtsd - vbd_jct) < (model->BSIM4vtsd * 1e-3) ) + { T9 = 1.0e3; + T0 = -vbd_jct / Nvtmrs * T9; DEXP(T0, T2, T10); dT2_dVb = T10 / Nvtmrs * T9; } else { - T9 = 1.0 / (model->BSIM4vtsd - vbd); - T0 = -vbd / Nvtmrs * model->BSIM4vtsd * T9; - dT0_dVb = model->BSIM4vtsd / Nvtmrs * (T9 + vbd * T9 * T9) ; + T9 = 1.0 / (model->BSIM4vtsd - vbd_jct); + T0 = -vbd_jct / Nvtmrs * model->BSIM4vtsd * T9; + dT0_dVb = model->BSIM4vtsd / Nvtmrs * (T9 + vbd_jct * T9 * T9) ; DEXP(T0, T2, T10); dT2_dVb = T10 * dT0_dVb; } - - if ((model->BSIM4vtssws - vbs) < 1e-3) + + if ((model->BSIM4vtssws - vbs_jct) < (model->BSIM4vtssws * 1e-3) ) { T9 = 1.0e3; - T0 = -vbs / Nvtmrssw * T9; + T0 = -vbs_jct / Nvtmrssw * T9; DEXP(T0, T3, T10); dT3_dVb = T10 / Nvtmrssw * T9; } else { - T9 = 1.0 / (model->BSIM4vtssws - vbs); - T0 = -vbs / Nvtmrssw * model->BSIM4vtssws * T9; - dT0_dVb = model->BSIM4vtssws / Nvtmrssw * (T9 + vbs * T9 * T9) ; + T9 = 1.0 / (model->BSIM4vtssws - vbs_jct); + T0 = -vbs_jct / Nvtmrssw * model->BSIM4vtssws * T9; + dT0_dVb = model->BSIM4vtssws / Nvtmrssw * (T9 + vbs_jct * T9 * T9) ; DEXP(T0, T3, T10); dT3_dVb = T10 * dT0_dVb; } - if ((model->BSIM4vtsswd - vbd) < 1e-3) + + if ((model->BSIM4vtsswd - vbd_jct) < (model->BSIM4vtsswd * 1e-3) ) { T9 = 1.0e3; - T0 = -vbd / Nvtmrssw * T9; + T0 = -vbd_jct / Nvtmrssw * T9; DEXP(T0, T4, T10); dT4_dVb = T10 / Nvtmrssw * T9; } else { - T9 = 1.0 / (model->BSIM4vtsswd - vbd); - T0 = -vbd / Nvtmrssw * model->BSIM4vtsswd * T9; - dT0_dVb = model->BSIM4vtsswd / Nvtmrssw * (T9 + vbd * T9 * T9) ; + T9 = 1.0 / (model->BSIM4vtsswd - vbd_jct); + T0 = -vbd_jct / Nvtmrssw * model->BSIM4vtsswd * T9; + dT0_dVb = model->BSIM4vtsswd / Nvtmrssw * (T9 + vbd_jct * T9 * T9) ; DEXP(T0, T4, T10); dT4_dVb = T10 * dT0_dVb; } - if ((model->BSIM4vtsswgs - vbs) < 1e-3) + if ((model->BSIM4vtsswgs - vbs_jct) < (model->BSIM4vtsswgs * 1e-3) ) { T9 = 1.0e3; - T0 = -vbs / Nvtmrsswg * T9; + T0 = -vbs_jct / Nvtmrsswg * T9; DEXP(T0, T5, T10); dT5_dVb = T10 / Nvtmrsswg * T9; } else { - T9 = 1.0 / (model->BSIM4vtsswgs - vbs); - T0 = -vbs / Nvtmrsswg * model->BSIM4vtsswgs * T9; - dT0_dVb = model->BSIM4vtsswgs / Nvtmrsswg * (T9 + vbs * T9 * T9) ; + T9 = 1.0 / (model->BSIM4vtsswgs - vbs_jct); + T0 = -vbs_jct / Nvtmrsswg * model->BSIM4vtsswgs * T9; + dT0_dVb = model->BSIM4vtsswgs / Nvtmrsswg * (T9 + vbs_jct * T9 * T9) ; DEXP(T0, T5, T10); dT5_dVb = T10 * dT0_dVb; } - if ((model->BSIM4vtsswgd - vbd) < 1e-3) + + if ((model->BSIM4vtsswgd - vbd_jct) < (model->BSIM4vtsswgd * 1e-3) ) { T9 = 1.0e3; - T0 = -vbd / Nvtmrsswg * T9; - DEXP(T0, T4, T10); + T0 = -vbd_jct / Nvtmrsswg * T9; + DEXP(T0, T6, T10); dT6_dVb = T10 / Nvtmrsswg * T9; } else { - T9 = 1.0 / (model->BSIM4vtsswgd - vbd); - T0 = -vbd / Nvtmrsswg * model->BSIM4vtsswgd * T9; - dT0_dVb = model->BSIM4vtsswgd / Nvtmrsswg * (T9 + vbd * T9 * T9) ; + T9 = 1.0 / (model->BSIM4vtsswgd - vbd_jct); + T0 = -vbd_jct / Nvtmrsswg * model->BSIM4vtsswgd * T9; + dT0_dVb = model->BSIM4vtsswgd / Nvtmrsswg * (T9 + vbd_jct * T9 * T9) ; DEXP(T0, T6, T10); dT6_dVb = T10 * dT0_dVb; } @@ -968,7 +970,7 @@ for (; model != NULL; model = model->BSIM4nextModel) dVbseff_dVb = T2 * here->BSIM4vbsc / T1; } - /* JX: Correction to forward body bias */ + /* JX: Correction to forward body bias */ T9 = 0.95 * pParam->BSIM4phi; T0 = T9 - Vbseff - 0.001; T1 = sqrt(T0 * T0 + 0.004 * T9); @@ -980,13 +982,13 @@ for (; model != NULL; model = model->BSIM4nextModel) sqrtPhis = sqrt(Phis); dsqrtPhis_dVb = -0.5 / sqrtPhis; - Xdep = pParam->BSIM4Xdep0 * sqrtPhis / pParam->BSIM4sqrtPhi; dXdep_dVb = (pParam->BSIM4Xdep0 / pParam->BSIM4sqrtPhi) * dsqrtPhis_dVb; Leff = pParam->BSIM4leff; Vtm = model->BSIM4vtm; + Vtm0 = model->BSIM4vtm0; /* Vth Calculation */ T3 = sqrt(Xdep); @@ -1126,8 +1128,16 @@ for (; model != NULL; model = model->BSIM4nextModel) T3 = Leff + pParam->BSIM4dvtp0 * (1.0 + T2); dT3_dVd = pParam->BSIM4dvtp0 * dT2_dVd; - T4 = Vtm * log(Leff / T3); - dT4_dVd = -Vtm * dT3_dVd / T3; + if (model->BSIM4tempMod < 2) + { + T4 = Vtm * log(Leff / T3); + dT4_dVd = -Vtm * dT3_dVd / T3; + } + else + { + T4 = model->BSIM4vtm0 * log(Leff / T3); + dT4_dVd = -model->BSIM4vtm0 * dT3_dVd / T3; + } dDITS_Sft_dVd = dn_dVd * T4 + n * dT4_dVd; dDITS_Sft_dVb = T4 * dn_dVb; @@ -1322,8 +1332,10 @@ for (; model != NULL; model = model->BSIM4nextModel) { T0 = Vgsteff + Vth + Vth; T2 = pParam->BSIM4ua + pParam->BSIM4uc * Vbseff; T3 = T0 / model->BSIM4toxe; - T5 = T3 * (T2 + pParam->BSIM4ub * T3); - dDenomi_dVg = (T2 + 2.0 * pParam->BSIM4ub * T3) / model->BSIM4toxe; + T6 = pParam->BSIM4ud / T3 / T3 * Vth * Vth; + T5 = T3 * (T2 + pParam->BSIM4ub * T3) + T6; + T7 = - 2.0 * T6 / T0; + dDenomi_dVg = (T2 + 2.0 * pParam->BSIM4ub * T3) / model->BSIM4toxe + T7; dDenomi_dVd = dDenomi_dVg * 2.0 * dVth_dVd; dDenomi_dVb = dDenomi_dVg * 2.0 * dVth_dVb + pParam->BSIM4uc * T3; } @@ -1332,9 +1344,11 @@ for (; model != NULL; model = model->BSIM4nextModel) T2 = 1.0 + pParam->BSIM4uc * Vbseff; T3 = T0 / model->BSIM4toxe; T4 = T3 * (pParam->BSIM4ua + pParam->BSIM4ub * T3); - T5 = T4 * T2; + T6 = pParam->BSIM4ud / T3 / T3 * Vth * Vth; + T5 = T4 * T2 + T6; + T7 = - 2.0 * T6 / T0; dDenomi_dVg = (pParam->BSIM4ua + 2.0 * pParam->BSIM4ub * T3) * T2 - / model->BSIM4toxe; + / model->BSIM4toxe + T7; dDenomi_dVd = dDenomi_dVg * 2.0 * dVth_dVd; dDenomi_dVb = dDenomi_dVg * 2.0 * dVth_dVb + pParam->BSIM4uc * T4; } @@ -1343,8 +1357,11 @@ for (; model != NULL; model = model->BSIM4nextModel) T1 = exp(pParam->BSIM4eu * log(T0)); dT1_dVg = T1 * pParam->BSIM4eu / T0 / model->BSIM4toxe; T2 = pParam->BSIM4ua + pParam->BSIM4uc * Vbseff; - T5 = T1 * T2; - dDenomi_dVg = T2 * dT1_dVg; + T3 = T0 / model->BSIM4toxe; + T6 = pParam->BSIM4ud / T3 / T3 * Vth * Vth; + T5 = T1 * T2 + T6; + T7 = - 2.0 * T6 / T0; + dDenomi_dVg = T2 * dT1_dVg + T7; dDenomi_dVd = 0.0; dDenomi_dVb = T1 * pParam->BSIM4uc; } @@ -1853,10 +1870,10 @@ for (; model != NULL; model = model->BSIM4nextModel) dT1_dVd = T3 * (1.0 - dVdseff_dVd); dT1_dVb = -T3 * dVdseff_dVb; } - T4 = Idsa * Vdseff; + T4 = Idsa * Vdseff; Isub = T1 * T4; Gbg = T1 * (dIdsa_dVg * Vdseff + Idsa * dVdseff_dVg) - + T4 * dT1_dVg; + + T4 * dT1_dVg; Gbd = T1 * (dIdsa_dVd * Vdseff + Idsa * dVdseff_dVd) + T4 * dT1_dVd; Gbb = T1 * (dIdsa_dVb * Vdseff + Idsa * dVdseff_dVb) @@ -2188,26 +2205,45 @@ for (; model != NULL; model = model->BSIM4nextModel) dVoxdepinv_dVb += dVgsteff_dVb; } + if(model->BSIM4tempMod < 2) + tmp = Vtm; + else /* model->BSIM4tempMod = 2 */ + tmp = Vtm0; if (model->BSIM4igcMod) - { T0 = Vtm * pParam->BSIM4nigc; - VxNVt = (Vgs_eff - model->BSIM4type * here->BSIM4vth0) / T0; - if (VxNVt > EXP_THRESHOLD) - { Vaux = Vgs_eff - model->BSIM4type * here->BSIM4vth0; - dVaux_dVg = dVgs_eff_dVg; - dVaux_dVd = 0.0; - dVaux_dVb = 0.0; - } - else if (VxNVt < -EXP_THRESHOLD) + { T0 = tmp * pParam->BSIM4nigc; + if(model->BSIM4igcMod == 1) { + VxNVt = (Vgs_eff - model->BSIM4type * here->BSIM4vth0) / T0; + if (VxNVt > EXP_THRESHOLD) + { Vaux = Vgs_eff - model->BSIM4type * here->BSIM4vth0; + dVaux_dVg = dVgs_eff_dVg; + dVaux_dVd = 0.0; + dVaux_dVb = 0.0; + } + } else if (model->BSIM4igcMod == 2) { + VxNVt = (Vgs_eff - here->BSIM4von) / T0; + if (VxNVt > EXP_THRESHOLD) + { Vaux = Vgs_eff - here->BSIM4von; + dVaux_dVg = dVgs_eff_dVg; + dVaux_dVd = -dVth_dVd; + dVaux_dVb = -dVth_dVb; + } + } + if (VxNVt < -EXP_THRESHOLD) { Vaux = T0 * log(1.0 + MIN_EXP); dVaux_dVg = dVaux_dVd = dVaux_dVb = 0.0; } - else + else if ((VxNVt >= -EXP_THRESHOLD) && (VxNVt <= EXP_THRESHOLD)) { ExpVxNVt = exp(VxNVt); Vaux = T0 * log(1.0 + ExpVxNVt); dVaux_dVg = ExpVxNVt / (1.0 + ExpVxNVt); - dVaux_dVd = 0.0; - dVaux_dVb = 0.0; - dVaux_dVg *= dVgs_eff_dVg; + if(model->BSIM4igcMod == 1) { + dVaux_dVd = 0.0; + dVaux_dVb = 0.0; + } else if (model->BSIM4igcMod == 2) { + dVaux_dVd = -dVgs_eff_dVg * dVth_dVd; + dVaux_dVb = -dVgs_eff_dVg * dVth_dVb; + } + dVaux_dVg *= dVgs_eff_dVg; } T2 = Vgs_eff * Vaux; @@ -2255,12 +2291,9 @@ for (; model != NULL; model = model->BSIM4nextModel) T14 = -T13 / T12; Pigcd = T13 * (1.0 - 0.5 * Vdseff / T12); dPigcd_dVg = T14 * (2.0 + 0.5 * (dVdseff_dVg - * Vgsteff - 3.0 * Vdseff) / T12); - dPigcd_dVd = 0.5 * T14 * dVdseff_dVd - + dPigcd_dVg * dVgsteff_dVd; - dPigcd_dVb = 0.5 * T14 * dVdseff_dVb - + dPigcd_dVg * dVgsteff_dVb; - dPigcd_dVg *= dVgsteff_dVg; + - 3.0 * Vdseff / T12)); + dPigcd_dVd = 0.5 * T14 * dVdseff_dVd; + dPigcd_dVb = 0.5 * T14 * dVdseff_dVb; } T7 = -Pigcd * Vdseff; /* bugfix */ @@ -2397,7 +2430,7 @@ for (; model != NULL; model = model->BSIM4nextModel) } if (model->BSIM4igbMod) - { T0 = Vtm * pParam->BSIM4nigbacc; + { T0 = tmp * pParam->BSIM4nigbacc; T1 = -Vgs_eff + Vbseff + Vfb; VxNVt = T1 / T0; if (VxNVt > EXP_THRESHOLD) @@ -2449,7 +2482,7 @@ for (; model != NULL; model = model->BSIM4nextModel) dIgbacc_dVb = T11 * (T2 * dT6_dVb + T6 * dT2_dVb); - T0 = Vtm * pParam->BSIM4nigbinv; + T0 = tmp * pParam->BSIM4nigbinv; T1 = Voxdepinv - pParam->BSIM4eigbinv; VxNVt = T1 / T0; if (VxNVt > EXP_THRESHOLD) @@ -3239,6 +3272,13 @@ for (; model != NULL; model = model->BSIM4nextModel) dDeltaPhi_dVg = 2.0 * Vtm * (T1 -T0) / (Denomi + T1 * Vgsteff); /* End of delta Phis */ + /* VgDP = Vgsteff - DeltaPhi */ + T0 = Vgsteff - DeltaPhi - 0.001; + dT0_dVg = 1.0 - dDeltaPhi_dVg; + T1 = sqrt(T0 * T0 + Vgsteff * 0.004); + VgDP = 0.5 * (T0 + T1); + dVgDP_dVg = 0.5 * (dT0_dVg + (T0 * dT0_dVg + 0.002) / T1); + Tox += Tox; /* WDLiu: Tcen reevaluated below due to different Vgsteff */ T0 = (Vgsteff + here->BSIM4vtfbphi2) / Tox; tmp = exp(0.7 * log(T0)); @@ -3262,10 +3302,10 @@ for (; model != NULL; model = model->BSIM4nextModel) AbulkCV = Abulk0 * pParam->BSIM4abulkCVfactor; dAbulkCV_dVb = pParam->BSIM4abulkCVfactor * dAbulk0_dVb; - VdsatCV = (Vgsteff - DeltaPhi) / AbulkCV; + VdsatCV = VgDP / AbulkCV; T0 = VdsatCV - Vds - DELTA_4; - dT0_dVg = (1.0 - dDeltaPhi_dVg) / AbulkCV; + dT0_dVg = dVgDP_dVg / AbulkCV; dT0_dVb = -VdsatCV * dAbulkCV_dVb / AbulkCV; T1 = sqrt(T0 * T0 + 4.0 * DELTA_4 * VdsatCV); dT1_dVg = (T0 + DELTA_4 + DELTA_4) / T1; @@ -3295,7 +3335,7 @@ for (; model != NULL; model = model->BSIM4nextModel) } T0 = AbulkCV * VdseffCV; - T1 = Vgsteff - DeltaPhi; + T1 = VgDP; T2 = 12.0 * (T1 - 0.5 * T0 + 1.0e-20); T3 = T0 / T2; T4 = 1.0 - 12.0 * T3 * T3; @@ -3304,7 +3344,7 @@ for (; model != NULL; model = model->BSIM4nextModel) qgate = CoxWLcen * (T1 - T0 * (0.5 - T3)); QovCox = qgate / Coxeff; - Cgg1 = CoxWLcen * (T4 * (1.0 - dDeltaPhi_dVg) + Cgg1 = CoxWLcen * (T4 * dVgDP_dVg + T5 * dVdseffCV_dVg); Cgd1 = CoxWLcen * T5 * dVdseffCV_dVd + Cgg1 * dVgsteff_dVd + QovCox * dCoxeff_dVd; @@ -3316,7 +3356,7 @@ for (; model != NULL; model = model->BSIM4nextModel) T7 = 1.0 - AbulkCV; T8 = T2 * T2; T9 = 12.0 * T7 * T0 * T0 / (T8 * AbulkCV); - T10 = T9 * (1.0 - dDeltaPhi_dVg); + T10 = T9 * dVgDP_dVg; T11 = -T7 * T5 / AbulkCV; T12 = -(T9 * T1 / AbulkCV + VdseffCV * (0.5 - T0 / T2)); @@ -3337,7 +3377,7 @@ for (; model != NULL; model = model->BSIM4nextModel) T2 += T2; T3 = T2 * T2; T7 = -(0.25 - 12.0 * T0 * (4.0 * T1 - T0) / T3); - T4 = -(0.5 + 24.0 * T0 * T0 / T3) * (1.0 - dDeltaPhi_dVg); + T4 = -(0.5 + 24.0 * T0 * T0 / T3) * dVgDP_dVg; T5 = T7 * AbulkCV; T6 = T7 * VdseffCV; @@ -3362,7 +3402,7 @@ for (; model != NULL; model = model->BSIM4nextModel) T6 = AbulkCV * (qsrc / T2 + T3 * T8); T7 = T6 * VdseffCV / AbulkCV; - Csg = T5 * (1.0 - dDeltaPhi_dVg) + T6 * dVdseffCV_dVg; + Csg = T5 * dVgDP_dVg + T6 * dVdseffCV_dVg; Csd = Csg * dVgsteff_dVd + T6 * dVdseffCV_dVd + QovCox * dCoxeff_dVd; Csb = Csg * dVgsteff_dVb + T6 * dVdseffCV_dVb @@ -3576,46 +3616,50 @@ finished: if ((here->BSIM4off == 0) || (!(ckt->CKTmode & MODEINITFIX))) { if (Check == 1) { ckt->CKTnoncon++; -// #ifndef NEWCONV -// } -// else -// { if (here->BSIM4mode >= 0) -// { Idtot = here->BSIM4cd + here->BSIM4csub -// + here->BSIM4Igidl - here->BSIM4cbd; -// } -// else -// { Idtot = here->BSIM4cd + here->BSIM4cbd - here->BSIM4Igidl; /* bugfix */ -// } -// tol0 = ckt->CKTreltol * MAX(fabs(cdhat), fabs(Idtot)) -// + ckt->CKTabstol; -// tol1 = ckt->CKTreltol * MAX(fabs(cseshat), fabs(Isestot)) -// + ckt->CKTabstol; -// tol2 = ckt->CKTreltol * MAX(fabs(cdedhat), fabs(Idedtot)) -// + ckt->CKTabstol; -// tol3 = ckt->CKTreltol * MAX(fabs(cgshat), fabs(Igstot)) -// + ckt->CKTabstol; -// tol4 = ckt->CKTreltol * MAX(fabs(cgdhat), fabs(Igdtot)) -// + ckt->CKTabstol; -// tol5 = ckt->CKTreltol * MAX(fabs(cgbhat), fabs(Igbtot)) -// + ckt->CKTabstol; -// if ((fabs(cdhat - Idtot) >= tol0) || (fabs(cseshat - Isestot) >= tol1) -// || (fabs(cdedhat - Idedtot) >= tol2)) -// { ckt->CKTnoncon++; -// } -// else if ((fabs(cgshat - Igstot) >= tol3) || (fabs(cgdhat - Igdtot) >= tol4) -// || (fabs(cgbhat - Igbtot) >= tol5)) -// { ckt->CKTnoncon++; -// } -// else -// { Ibtot = here->BSIM4cbs + here->BSIM4cbd -// - here->BSIM4Igidl - here->BSIM4Igisl - here->BSIM4csub; -// tol6 = ckt->CKTreltol * MAX(fabs(cbhat), fabs(Ibtot)) -// + ckt->CKTabstol; -// if (fabs(cbhat - Ibtot) > tol6) -// { ckt->CKTnoncon++; -// } -// } -// #endif /* NEWCONV */ + +/* "Following #ifndef NEWCONV" to "#endif" is commented out in the former version. + However, since it was satisfactory when I checked, it has left as it is. + Please comment out, supposing you get a problem. */ +#ifndef NEWCONV + } + else + { if (here->BSIM4mode >= 0) + { Idtot = here->BSIM4cd + here->BSIM4csub + + here->BSIM4Igidl - here->BSIM4cbd; + } + else + { Idtot = here->BSIM4cd + here->BSIM4cbd - here->BSIM4Igidl; /* bugfix */ + } + tol0 = ckt->CKTreltol * MAX(fabs(cdhat), fabs(Idtot)) + + ckt->CKTabstol; + tol1 = ckt->CKTreltol * MAX(fabs(cseshat), fabs(Isestot)) + + ckt->CKTabstol; + tol2 = ckt->CKTreltol * MAX(fabs(cdedhat), fabs(Idedtot)) + + ckt->CKTabstol; + tol3 = ckt->CKTreltol * MAX(fabs(cgshat), fabs(Igstot)) + + ckt->CKTabstol; + tol4 = ckt->CKTreltol * MAX(fabs(cgdhat), fabs(Igdtot)) + + ckt->CKTabstol; + tol5 = ckt->CKTreltol * MAX(fabs(cgbhat), fabs(Igbtot)) + + ckt->CKTabstol; + if ((fabs(cdhat - Idtot) >= tol0) || (fabs(cseshat - Isestot) >= tol1) + || (fabs(cdedhat - Idedtot) >= tol2)) + { ckt->CKTnoncon++; + } + else if ((fabs(cgshat - Igstot) >= tol3) || (fabs(cgdhat - Igdtot) >= tol4) + || (fabs(cgbhat - Igbtot) >= tol5)) + { ckt->CKTnoncon++; + } + else + { Ibtot = here->BSIM4cbs + here->BSIM4cbd + - here->BSIM4Igidl - here->BSIM4Igisl - here->BSIM4csub; + tol6 = ckt->CKTreltol * MAX(fabs(cbhat), fabs(Ibtot)) + + ckt->CKTabstol; + if (fabs(cbhat - Ibtot) > tol6) + { ckt->CKTnoncon++; + } + } +#endif /* NEWCONV */ } } *(ckt->CKTstate0 + here->BSIM4vds) = vds; @@ -3967,8 +4011,8 @@ line755: * pParam->BSIM4leffCV; T0 = qdef * ScalingFactor / CoxWL; ggtg = here->BSIM4gtg = T0 * here->BSIM4gcrgg; - ggts = here->BSIM4gtd = T0 * here->BSIM4gcrgs; - ggtd = here->BSIM4gts = T0 * here->BSIM4gcrgd; + ggts = here->BSIM4gts = T0 * here->BSIM4gcrgd; + ggtd = here->BSIM4gtd = T0 * here->BSIM4gcrgs; ggtb = here->BSIM4gtb = T0 * here->BSIM4gcrgb; gqdef = ScalingFactor * ag0; @@ -4565,7 +4609,7 @@ line900: (*(here->BSIM4GPbpPtr) += m * (gcgbb - gcrgb - ggtb + gIgtotb)); } else if (here->BSIM4rgateMod == 3) - { (*(here->BSIM4GEgePtr) += geltd); + { (*(here->BSIM4GEgePtr) += m * geltd); (*(here->BSIM4GEgmPtr) -= m * geltd); (*(here->BSIM4GMgePtr) -= m * geltd); (*(here->BSIM4GMgmPtr) += m * (geltd + gcrg + gcgmgmb)); diff --git a/src/spicelib/devices/bsim4/b4mask.c b/src/spicelib/devices/bsim4/b4mask.c index e4bb8906a..49626213d 100644 --- a/src/spicelib/devices/bsim4/b4mask.c +++ b/src/spicelib/devices/bsim4/b4mask.c @@ -1,15 +1,16 @@ -/**** BSIM4.4.0 Released by Xuemei (Jane) Xi 03/04/2004 ****/ +/**** BSIM4.5.0 Released by Xuemei (Jane) Xi 07/29/2005 ****/ /********** - * Copyright 2004 Regents of the University of California. All rights reserved. - * File: b4mask.c of BSIM4.4.0. + * Copyright 2005 Regents of the University of California. All rights reserved. + * File: b4mask.c of BSIM4.5.0. * Author: 2000 Weidong Liu - * Authors: 2001- Xuemei Xi, Jin He, Kanyu Cao, Mohan Dunga, Mansun Chan, Ali Niknejad, Chenming Hu. + * Authors: 2001- Xuemei Xi, Mohan Dunga, Ali Niknejad, Chenming Hu. * Project Director: Prof. Chenming Hu. * Modified by Xuemei Xi, 04/06/2001. * Modified by Xuemei Xi, 10/05/2001. * Modified by Xuemei Xi, 11/15/2002. * Modified by Xuemei Xi, 05/09/2003. + * Modified by Xuemei Xi, Mohan Dunga, 07/29/2005. **********/ @@ -21,7 +22,6 @@ #include "sperror.h" #include "suffix.h" - int BSIM4mAsk(ckt,inst,which,value) CKTcircuit *ckt; @@ -82,6 +82,7 @@ IFvalue *value; case BSIM4_MOD_TEMPMOD : value->iValue = model->BSIM4tempMod; return(OK); + case BSIM4_MOD_VERSION : value->sValue = model->BSIM4version; return(OK); @@ -269,6 +270,18 @@ IFvalue *value; case BSIM4_MOD_UC1: value->rValue = model->BSIM4uc1; return(OK); + case BSIM4_MOD_UD: + value->rValue = model->BSIM4ud; + return(OK); + case BSIM4_MOD_UD1: + value->rValue = model->BSIM4ud1; + return(OK); + case BSIM4_MOD_UP: + value->rValue = model->BSIM4up; + return(OK); + case BSIM4_MOD_LP: + value->rValue = model->BSIM4lp; + return(OK); case BSIM4_MOD_U0: value->rValue = model->BSIM4u0; return(OK); @@ -278,6 +291,15 @@ IFvalue *value; case BSIM4_MOD_VOFF: value->rValue = model->BSIM4voff; return(OK); + case BSIM4_MOD_TVOFF: + value->rValue = model->BSIM4tvoff; + return(OK); + case BSIM4_MOD_VFBSDOFF: + value->rValue = model->BSIM4vfbsdoff; + return(OK); + case BSIM4_MOD_TVFBSDOFF: + value->rValue = model->BSIM4tvfbsdoff; + return(OK); case BSIM4_MOD_VOFFL: value->rValue = model->BSIM4voffl; return(OK); @@ -498,6 +520,79 @@ IFvalue *value; value->rValue = model->BSIM4vfb; return(OK); + case BSIM4_MOD_JTSS: + value->rValue = model->BSIM4jtss; + return(OK); + case BSIM4_MOD_JTSD: + value->rValue = model->BSIM4jtsd; + return(OK); + case BSIM4_MOD_JTSSWS: + value->rValue = model->BSIM4jtssws; + return(OK); + case BSIM4_MOD_JTSSWD: + value->rValue = model->BSIM4jtsswd; + return(OK); + case BSIM4_MOD_JTSSWGS: + value->rValue = model->BSIM4jtsswgs; + return(OK); + case BSIM4_MOD_JTSSWGD: + value->rValue = model->BSIM4jtsswgd; + return(OK); + case BSIM4_MOD_NJTS: + value->rValue = model->BSIM4njts; + return(OK); + case BSIM4_MOD_NJTSSW: + value->rValue = model->BSIM4njtssw; + return(OK); + case BSIM4_MOD_NJTSSWG: + value->rValue = model->BSIM4njtsswg; + return(OK); + case BSIM4_MOD_XTSS: + value->rValue = model->BSIM4xtss; + return(OK); + case BSIM4_MOD_XTSD: + value->rValue = model->BSIM4xtsd; + return(OK); + case BSIM4_MOD_XTSSWS: + value->rValue = model->BSIM4xtssws; + return(OK); + case BSIM4_MOD_XTSSWD: + value->rValue = model->BSIM4xtsswd; + return(OK); + case BSIM4_MOD_XTSSWGS: + value->rValue = model->BSIM4xtsswgs; + return(OK); + case BSIM4_MOD_XTSSWGD: + value->rValue = model->BSIM4xtsswgd; + return(OK); + case BSIM4_MOD_TNJTS: + value->rValue = model->BSIM4tnjts; + return(OK); + case BSIM4_MOD_TNJTSSW: + value->rValue = model->BSIM4tnjtssw; + return(OK); + case BSIM4_MOD_TNJTSSWG: + value->rValue = model->BSIM4tnjtsswg; + return(OK); + case BSIM4_MOD_VTSS: + value->rValue = model->BSIM4vtss; + return(OK); + case BSIM4_MOD_VTSD: + value->rValue = model->BSIM4vtsd; + return(OK); + case BSIM4_MOD_VTSSWS: + value->rValue = model->BSIM4vtssws; + return(OK); + case BSIM4_MOD_VTSSWD: + value->rValue = model->BSIM4vtsswd; + return(OK); + case BSIM4_MOD_VTSSWGS: + value->rValue = model->BSIM4vtsswgs; + return(OK); + case BSIM4_MOD_VTSSWGD: + value->rValue = model->BSIM4vtsswgd; + return(OK); + case BSIM4_MOD_GBMIN: value->rValue = model->BSIM4gbmin; return(OK); @@ -517,6 +612,87 @@ IFvalue *value; value->rValue = model->BSIM4rbpd; return(OK); + case BSIM4_MOD_RBPS0: + value->rValue = model->BSIM4rbps0; + return(OK); + case BSIM4_MOD_RBPSL: + value->rValue = model->BSIM4rbpsl; + return(OK); + case BSIM4_MOD_RBPSW: + value->rValue = model->BSIM4rbpsw; + return(OK); + case BSIM4_MOD_RBPSNF: + value->rValue = model->BSIM4rbpsnf; + return(OK); + case BSIM4_MOD_RBPD0: + value->rValue = model->BSIM4rbpd0; + return(OK); + case BSIM4_MOD_RBPDL: + value->rValue = model->BSIM4rbpdl; + return(OK); + case BSIM4_MOD_RBPDW: + value->rValue = model->BSIM4rbpdw; + return(OK); + case BSIM4_MOD_RBPDNF: + value->rValue = model->BSIM4rbpdnf; + return(OK); + case BSIM4_MOD_RBPBX0: + value->rValue = model->BSIM4rbpbx0; + return(OK); + case BSIM4_MOD_RBPBXL: + value->rValue = model->BSIM4rbpbxl; + return(OK); + case BSIM4_MOD_RBPBXW: + value->rValue = model->BSIM4rbpbxw; + return(OK); + case BSIM4_MOD_RBPBXNF: + value->rValue = model->BSIM4rbpbxnf; + return(OK); + case BSIM4_MOD_RBPBY0: + value->rValue = model->BSIM4rbpby0; + return(OK); + case BSIM4_MOD_RBPBYL: + value->rValue = model->BSIM4rbpbyl; + return(OK); + case BSIM4_MOD_RBPBYW: + value->rValue = model->BSIM4rbpbyw; + return(OK); + case BSIM4_MOD_RBPBYNF: + value->rValue = model->BSIM4rbpbynf; + return(OK); + + case BSIM4_MOD_RBSBX0: + value->rValue = model->BSIM4rbsbx0; + return(OK); + case BSIM4_MOD_RBSBY0: + value->rValue = model->BSIM4rbsby0; + return(OK); + case BSIM4_MOD_RBDBX0: + value->rValue = model->BSIM4rbdbx0; + return(OK); + case BSIM4_MOD_RBDBY0: + value->rValue = model->BSIM4rbdby0; + return(OK); + case BSIM4_MOD_RBSDBXL: + value->rValue = model->BSIM4rbsdbxl; + return(OK); + case BSIM4_MOD_RBSDBXW: + value->rValue = model->BSIM4rbsdbxw; + return(OK); + case BSIM4_MOD_RBSDBXNF: + value->rValue = model->BSIM4rbsdbxnf; + return(OK); + case BSIM4_MOD_RBSDBYL: + value->rValue = model->BSIM4rbsdbyl; + return(OK); + case BSIM4_MOD_RBSDBYW: + value->rValue = model->BSIM4rbsdbyw; + return(OK); + case BSIM4_MOD_RBSDBYNF: + value->rValue = model->BSIM4rbsdbynf; + return(OK); + + case BSIM4_MOD_CGSL: value->rValue = model->BSIM4cgsl; return(OK); @@ -592,9 +768,6 @@ IFvalue *value; case BSIM4_MOD_RSHG: value->rValue = model->BSIM4rshg; return(OK); - case BSIM4_MOD_NGCON: - value->rValue = model->BSIM4ngcon; - return(OK); case BSIM4_MOD_TCJ: value->rValue = model->BSIM4tcj; return(OK); @@ -762,6 +935,18 @@ IFvalue *value; case BSIM4_MOD_LUC1: value->rValue = model->BSIM4luc1; return(OK); + case BSIM4_MOD_LUD: + value->rValue = model->BSIM4lud; + return(OK); + case BSIM4_MOD_LUD1: + value->rValue = model->BSIM4lud1; + return(OK); + case BSIM4_MOD_LUP: + value->rValue = model->BSIM4lup; + return(OK); + case BSIM4_MOD_LLP: + value->rValue = model->BSIM4llp; + return(OK); case BSIM4_MOD_LU0: value->rValue = model->BSIM4lu0; return(OK); @@ -771,6 +956,9 @@ IFvalue *value; case BSIM4_MOD_LVOFF: value->rValue = model->BSIM4lvoff; return(OK); + case BSIM4_MOD_LTVOFF: + value->rValue = model->BSIM4ltvoff; + return(OK); case BSIM4_MOD_LMINV: value->rValue = model->BSIM4lminv; return(OK); @@ -976,6 +1164,12 @@ IFvalue *value; case BSIM4_MOD_LVOFFCV: value->rValue = model->BSIM4lvoffcv; return(OK); + case BSIM4_MOD_LVFBSDOFF: + value->rValue = model->BSIM4lvfbsdoff; + return(OK); + case BSIM4_MOD_LTVFBSDOFF: + value->rValue = model->BSIM4ltvfbsdoff; + return(OK); /* Width dependence */ case BSIM4_MOD_WCDSC : @@ -1125,6 +1319,18 @@ IFvalue *value; case BSIM4_MOD_WUC1: value->rValue = model->BSIM4wuc1; return(OK); + case BSIM4_MOD_WUD: + value->rValue = model->BSIM4wud; + return(OK); + case BSIM4_MOD_WUD1: + value->rValue = model->BSIM4wud1; + return(OK); + case BSIM4_MOD_WUP: + value->rValue = model->BSIM4wup; + return(OK); + case BSIM4_MOD_WLP: + value->rValue = model->BSIM4wlp; + return(OK); case BSIM4_MOD_WU0: value->rValue = model->BSIM4wu0; return(OK); @@ -1134,6 +1340,9 @@ IFvalue *value; case BSIM4_MOD_WVOFF: value->rValue = model->BSIM4wvoff; return(OK); + case BSIM4_MOD_WTVOFF: + value->rValue = model->BSIM4wtvoff; + return(OK); case BSIM4_MOD_WMINV: value->rValue = model->BSIM4wminv; return(OK); @@ -1339,6 +1548,12 @@ IFvalue *value; case BSIM4_MOD_WVOFFCV: value->rValue = model->BSIM4wvoffcv; return(OK); + case BSIM4_MOD_WVFBSDOFF: + value->rValue = model->BSIM4wvfbsdoff; + return(OK); + case BSIM4_MOD_WTVFBSDOFF: + value->rValue = model->BSIM4wtvfbsdoff; + return(OK); /* Cross-term dependence */ case BSIM4_MOD_PCDSC : @@ -1488,6 +1703,18 @@ IFvalue *value; case BSIM4_MOD_PUC1: value->rValue = model->BSIM4puc1; return(OK); + case BSIM4_MOD_PUD: + value->rValue = model->BSIM4pud; + return(OK); + case BSIM4_MOD_PUD1: + value->rValue = model->BSIM4pud1; + return(OK); + case BSIM4_MOD_PUP: + value->rValue = model->BSIM4pup; + return(OK); + case BSIM4_MOD_PLP: + value->rValue = model->BSIM4plp; + return(OK); case BSIM4_MOD_PU0: value->rValue = model->BSIM4pu0; return(OK); @@ -1497,6 +1724,9 @@ IFvalue *value; case BSIM4_MOD_PVOFF: value->rValue = model->BSIM4pvoff; return(OK); + case BSIM4_MOD_PTVOFF: + value->rValue = model->BSIM4ptvoff; + return(OK); case BSIM4_MOD_PMINV: value->rValue = model->BSIM4pminv; return(OK); @@ -1702,6 +1932,12 @@ IFvalue *value; case BSIM4_MOD_PVOFFCV: value->rValue = model->BSIM4pvoffcv; return(OK); + case BSIM4_MOD_PVFBSDOFF: + value->rValue = model->BSIM4pvfbsdoff; + return(OK); + case BSIM4_MOD_PTVFBSDOFF: + value->rValue = model->BSIM4ptvfbsdoff; + return(OK); case BSIM4_MOD_TNOM : value->rValue = model->BSIM4tnom; @@ -1937,6 +2173,56 @@ IFvalue *value; value->rValue = model->BSIM4lodeta0; return(OK); + /* Well Proximity Effect */ + case BSIM4_MOD_WEB: + value->rValue = model->BSIM4web; + return(OK); + case BSIM4_MOD_WEC: + value->rValue = model->BSIM4wec; + return(OK); + case BSIM4_MOD_KVTH0WE: + value->rValue = model->BSIM4kvth0we; + return(OK); + case BSIM4_MOD_K2WE: + value->rValue = model->BSIM4k2we; + return(OK); + case BSIM4_MOD_KU0WE: + value->rValue = model->BSIM4ku0we; + return(OK); + case BSIM4_MOD_SCREF: + value->rValue = model->BSIM4scref; + return(OK); + case BSIM4_MOD_WPEMOD: + value->rValue = model->BSIM4wpemod; + return(OK); + case BSIM4_MOD_LKVTH0WE: + value->rValue = model->BSIM4lkvth0we; + return(OK); + case BSIM4_MOD_LK2WE: + value->rValue = model->BSIM4lk2we; + return(OK); + case BSIM4_MOD_LKU0WE: + value->rValue = model->BSIM4lku0we; + return(OK); + case BSIM4_MOD_WKVTH0WE: + value->rValue = model->BSIM4wkvth0we; + return(OK); + case BSIM4_MOD_WK2WE: + value->rValue = model->BSIM4wk2we; + return(OK); + case BSIM4_MOD_WKU0WE: + value->rValue = model->BSIM4wku0we; + return(OK); + case BSIM4_MOD_PKVTH0WE: + value->rValue = model->BSIM4pkvth0we; + return(OK); + case BSIM4_MOD_PK2WE: + value->rValue = model->BSIM4pk2we; + return(OK); + case BSIM4_MOD_PKU0WE: + value->rValue = model->BSIM4pku0we; + return(OK); + case BSIM4_MOD_NOIA: value->rValue = model->BSIM4oxideTrapDensityA; return(OK); diff --git a/src/spicelib/devices/bsim4/b4mdel.c b/src/spicelib/devices/bsim4/b4mdel.c index 2b35ff139..66f16782e 100644 --- a/src/spicelib/devices/bsim4/b4mdel.c +++ b/src/spicelib/devices/bsim4/b4mdel.c @@ -1,10 +1,10 @@ -/**** BSIM4.4.0 Released by Xuemei (Jane) Xi 03/04/2004 ****/ +/**** BSIM4.5.0 Released by Xuemei (Jane) Xi 07/29/2005 ****/ /********** - * Copyright 2004 Regents of the University of California. All rights reserved. - * File: b4mdel.c of BSIM4.4.0. + * Copyright 2005 Regents of the University of California. All rights reserved. + * File: b4mdel.c of BSIM4.5.0. * Author: 2000 Weidong Liu - * Authors: 2001- Xuemei Xi, Jin He, Kanyu Cao, Mohan Dunga, Mansun Chan, Ali Niknejad, Chenming Hu. + * Authors: 2001- Xuemei Xi, Mohan Dunga, Ali Niknejad, Chenming Hu. * Project Director: Prof. Chenming Hu. **********/ @@ -13,7 +13,6 @@ #include "sperror.h" #include "suffix.h" - int BSIM4mDelete(inModel,modname,kill) GENmodel **inModel; diff --git a/src/spicelib/devices/bsim4/b4mpar.c b/src/spicelib/devices/bsim4/b4mpar.c index 92d65549b..614b3649a 100644 --- a/src/spicelib/devices/bsim4/b4mpar.c +++ b/src/spicelib/devices/bsim4/b4mpar.c @@ -1,16 +1,17 @@ -/**** BSIM4.4.0 Released by Xuemei (Jane) Xi 03/04/2004 ****/ +/**** BSIM4.5.0 Released by Xuemei (Jane) Xi 07/29/2005 ****/ /********** - * Copyright 2004 Regents of the University of California. All rights reserved. - * File: b4mpar.c of BSIM4.4.0. + * Copyright 2005 Regents of the University of California. All rights reserved. + * File: b4mpar.c of BSIM4.5.0. * Author: 2000 Weidong Liu - * Authors: 2001- Xuemei Xi, Jin He, Kanyu Cao, Mohan Dunga, Mansun Chan, Ali Niknejad, Chenming Hu. + * Authors: 2001- Xuemei Xi, Mohan Dunga, Ali Niknejad, Chenming Hu. * Project Director: Prof. Chenming Hu. * Modified by Xuemei Xi, 04/06/2001. * Modified by Xuemei Xi, 10/05/2001. * Modified by Xuemei Xi, 11/15/2002. * Modified by Xuemei Xi, 05/09/2003. * Modified by Xuemei Xi, 03/04/2004. + * Modified by Xuemei Xi, Mohan Dunga, 07/29/2005. **********/ #include "ngspice.h" @@ -95,6 +96,7 @@ GENmodel *inMod; mod->BSIM4tempMod = value->iValue; mod->BSIM4tempModGiven = TRUE; break; + case BSIM4_MOD_VERSION : mod->BSIM4version = value->sValue; mod->BSIM4versionGiven = TRUE; @@ -342,10 +344,81 @@ GENmodel *inMod; mod->BSIM4ute = value->rValue; mod->BSIM4uteGiven = TRUE; break; + + case BSIM4_MOD_UD: + mod->BSIM4ud = value->rValue; + mod->BSIM4udGiven = TRUE; + break; + case BSIM4_MOD_UD1: + mod->BSIM4ud1 = value->rValue; + mod->BSIM4ud1Given = TRUE; + break; + case BSIM4_MOD_UP: + mod->BSIM4up = value->rValue; + mod->BSIM4upGiven = TRUE; + break; + case BSIM4_MOD_LP: + mod->BSIM4lp = value->rValue; + mod->BSIM4lpGiven = TRUE; + break; + case BSIM4_MOD_LUD: + mod->BSIM4lud = value->rValue; + mod->BSIM4ludGiven = TRUE; + break; + case BSIM4_MOD_LUD1: + mod->BSIM4lud1 = value->rValue; + mod->BSIM4lud1Given = TRUE; + break; + case BSIM4_MOD_LUP: + mod->BSIM4lup = value->rValue; + mod->BSIM4lupGiven = TRUE; + break; + case BSIM4_MOD_LLP: + mod->BSIM4llp = value->rValue; + mod->BSIM4llpGiven = TRUE; + break; + case BSIM4_MOD_WUD: + mod->BSIM4wud = value->rValue; + mod->BSIM4wudGiven = TRUE; + break; + case BSIM4_MOD_WUD1: + mod->BSIM4wud1 = value->rValue; + mod->BSIM4wud1Given = TRUE; + break; + case BSIM4_MOD_WUP: + mod->BSIM4wup = value->rValue; + mod->BSIM4wupGiven = TRUE; + break; + case BSIM4_MOD_WLP: + mod->BSIM4wlp = value->rValue; + mod->BSIM4wlpGiven = TRUE; + break; + case BSIM4_MOD_PUD: + mod->BSIM4pud = value->rValue; + mod->BSIM4pudGiven = TRUE; + break; + case BSIM4_MOD_PUD1: + mod->BSIM4pud1 = value->rValue; + mod->BSIM4pud1Given = TRUE; + break; + case BSIM4_MOD_PUP: + mod->BSIM4pup = value->rValue; + mod->BSIM4pupGiven = TRUE; + break; + case BSIM4_MOD_PLP: + mod->BSIM4plp = value->rValue; + mod->BSIM4plpGiven = TRUE; + break; + + case BSIM4_MOD_VOFF: mod->BSIM4voff = value->rValue; mod->BSIM4voffGiven = TRUE; break; + case BSIM4_MOD_TVOFF: + mod->BSIM4tvoff = value->rValue; + mod->BSIM4tvoffGiven = TRUE; + break; case BSIM4_MOD_VOFFL: mod->BSIM4voffl = value->rValue; mod->BSIM4vofflGiven = TRUE; @@ -618,6 +691,10 @@ GENmodel *inMod; mod->BSIM4vfbsdoff = value->rValue; mod->BSIM4vfbsdoffGiven = TRUE; break; + case BSIM4_MOD_TVFBSDOFF: + mod->BSIM4tvfbsdoff = value->rValue; + mod->BSIM4tvfbsdoffGiven = TRUE; + break; case BSIM4_MOD_LINTNOI: mod->BSIM4lintnoi = value->rValue; mod->BSIM4lintnoiGiven = TRUE; @@ -709,6 +786,71 @@ GENmodel *inMod; mod->BSIM4lodeta0Given = TRUE; break; + case BSIM4_MOD_WEB : + mod->BSIM4web = value->rValue; + mod->BSIM4webGiven = TRUE; + break; + case BSIM4_MOD_WEC : + mod->BSIM4wec = value->rValue; + mod->BSIM4wecGiven = TRUE; + break; + case BSIM4_MOD_KVTH0WE : + mod->BSIM4kvth0we = value->rValue; + mod->BSIM4kvth0weGiven = TRUE; + break; + case BSIM4_MOD_K2WE : + mod->BSIM4k2we = value->rValue; + mod->BSIM4k2weGiven = TRUE; + break; + case BSIM4_MOD_KU0WE : + mod->BSIM4ku0we = value->rValue; + mod->BSIM4ku0weGiven = TRUE; + break; + case BSIM4_MOD_SCREF : + mod->BSIM4scref = value->rValue; + mod->BSIM4screfGiven = TRUE; + break; + case BSIM4_MOD_WPEMOD : + mod->BSIM4wpemod = value->rValue; + mod->BSIM4wpemodGiven = TRUE; + break; + case BSIM4_MOD_LKVTH0WE : + mod->BSIM4lkvth0we = value->rValue; + mod->BSIM4lkvth0weGiven = TRUE; + break; + case BSIM4_MOD_LK2WE : + mod->BSIM4lk2we = value->rValue; + mod->BSIM4lk2weGiven = TRUE; + break; + case BSIM4_MOD_LKU0WE : + mod->BSIM4lku0we = value->rValue; + mod->BSIM4lku0weGiven = TRUE; + break; + case BSIM4_MOD_WKVTH0WE : + mod->BSIM4wkvth0we = value->rValue; + mod->BSIM4wkvth0weGiven = TRUE; + break; + case BSIM4_MOD_WK2WE : + mod->BSIM4wk2we = value->rValue; + mod->BSIM4wk2weGiven = TRUE; + break; + case BSIM4_MOD_WKU0WE : + mod->BSIM4wku0we = value->rValue; + mod->BSIM4wku0weGiven = TRUE; + break; + case BSIM4_MOD_PKVTH0WE : + mod->BSIM4pkvth0we = value->rValue; + mod->BSIM4pkvth0weGiven = TRUE; + break; + case BSIM4_MOD_PK2WE : + mod->BSIM4pk2we = value->rValue; + mod->BSIM4pk2weGiven = TRUE; + break; + case BSIM4_MOD_PKU0WE : + mod->BSIM4pku0we = value->rValue; + mod->BSIM4pku0weGiven = TRUE; + break; + case BSIM4_MOD_BETA0 : mod->BSIM4beta0 = value->rValue; mod->BSIM4beta0Given = TRUE; @@ -874,6 +1016,115 @@ GENmodel *inMod; mod->BSIM4rbpdGiven = TRUE; break; + case BSIM4_MOD_RBPS0 : + mod->BSIM4rbps0 = value->rValue; + mod->BSIM4rbps0Given = TRUE; + break; + case BSIM4_MOD_RBPSL : + mod->BSIM4rbpsl = value->rValue; + mod->BSIM4rbpslGiven = TRUE; + break; + case BSIM4_MOD_RBPSW : + mod->BSIM4rbpsw = value->rValue; + mod->BSIM4rbpswGiven = TRUE; + break; + case BSIM4_MOD_RBPSNF : + mod->BSIM4rbpsnf = value->rValue; + mod->BSIM4rbpsnfGiven = TRUE; + break; + + case BSIM4_MOD_RBPD0 : + mod->BSIM4rbpd0 = value->rValue; + mod->BSIM4rbpd0Given = TRUE; + break; + case BSIM4_MOD_RBPDL : + mod->BSIM4rbpdl = value->rValue; + mod->BSIM4rbpdlGiven = TRUE; + break; + case BSIM4_MOD_RBPDW : + mod->BSIM4rbpdw = value->rValue; + mod->BSIM4rbpdwGiven = TRUE; + break; + case BSIM4_MOD_RBPDNF : + mod->BSIM4rbpdnf = value->rValue; + mod->BSIM4rbpdnfGiven = TRUE; + break; + + case BSIM4_MOD_RBPBX0 : + mod->BSIM4rbpbx0 = value->rValue; + mod->BSIM4rbpbx0Given = TRUE; + break; + case BSIM4_MOD_RBPBXL : + mod->BSIM4rbpbxl = value->rValue; + mod->BSIM4rbpbxlGiven = TRUE; + break; + case BSIM4_MOD_RBPBXW : + mod->BSIM4rbpbxw = value->rValue; + mod->BSIM4rbpbxwGiven = TRUE; + break; + case BSIM4_MOD_RBPBXNF : + mod->BSIM4rbpbxnf = value->rValue; + mod->BSIM4rbpbxnfGiven = TRUE; + break; + case BSIM4_MOD_RBPBY0 : + mod->BSIM4rbpby0 = value->rValue; + mod->BSIM4rbpby0Given = TRUE; + break; + case BSIM4_MOD_RBPBYL : + mod->BSIM4rbpbyl = value->rValue; + mod->BSIM4rbpbylGiven = TRUE; + break; + case BSIM4_MOD_RBPBYW : + mod->BSIM4rbpbyw = value->rValue; + mod->BSIM4rbpbywGiven = TRUE; + break; + case BSIM4_MOD_RBPBYNF : + mod->BSIM4rbpbynf = value->rValue; + mod->BSIM4rbpbynfGiven = TRUE; + break; + case BSIM4_MOD_RBSBX0 : + mod->BSIM4rbsbx0 = value->rValue; + mod->BSIM4rbsbx0Given = TRUE; + break; + case BSIM4_MOD_RBSBY0 : + mod->BSIM4rbsby0 = value->rValue; + mod->BSIM4rbsby0Given = TRUE; + break; + case BSIM4_MOD_RBDBX0 : + mod->BSIM4rbdbx0 = value->rValue; + mod->BSIM4rbdbx0Given = TRUE; + break; + case BSIM4_MOD_RBDBY0 : + mod->BSIM4rbdby0 = value->rValue; + mod->BSIM4rbdby0Given = TRUE; + break; + + + case BSIM4_MOD_RBSDBXL : + mod->BSIM4rbsdbxl = value->rValue; + mod->BSIM4rbsdbxlGiven = TRUE; + break; + case BSIM4_MOD_RBSDBXW : + mod->BSIM4rbsdbxw = value->rValue; + mod->BSIM4rbsdbxwGiven = TRUE; + break; + case BSIM4_MOD_RBSDBXNF : + mod->BSIM4rbsdbxnf = value->rValue; + mod->BSIM4rbsdbxnfGiven = TRUE; + break; + case BSIM4_MOD_RBSDBYL : + mod->BSIM4rbsdbyl = value->rValue; + mod->BSIM4rbsdbylGiven = TRUE; + break; + case BSIM4_MOD_RBSDBYW : + mod->BSIM4rbsdbyw = value->rValue; + mod->BSIM4rbsdbywGiven = TRUE; + break; + case BSIM4_MOD_RBSDBYNF : + mod->BSIM4rbsdbynf = value->rValue; + mod->BSIM4rbsdbynfGiven = TRUE; + break; + case BSIM4_MOD_CGSL : mod->BSIM4cgsl = value->rValue; mod->BSIM4cgslGiven = TRUE; @@ -1222,6 +1473,10 @@ GENmodel *inMod; mod->BSIM4lvoff = value->rValue; mod->BSIM4lvoffGiven = TRUE; break; + case BSIM4_MOD_LTVOFF: + mod->BSIM4ltvoff = value->rValue; + mod->BSIM4ltvoffGiven = TRUE; + break; case BSIM4_MOD_LMINV: mod->BSIM4lminv = value->rValue; mod->BSIM4lminvGiven = TRUE; @@ -1454,6 +1709,10 @@ GENmodel *inMod; mod->BSIM4lvfbsdoff = value->rValue; mod->BSIM4lvfbsdoffGiven = TRUE; break; + case BSIM4_MOD_LTVFBSDOFF: + mod->BSIM4ltvfbsdoff = value->rValue; + mod->BSIM4ltvfbsdoffGiven = TRUE; + break; case BSIM4_MOD_LEU : mod->BSIM4leu = value->rValue; mod->BSIM4leuGiven = TRUE; @@ -1730,6 +1989,10 @@ GENmodel *inMod; mod->BSIM4wvoff = value->rValue; mod->BSIM4wvoffGiven = TRUE; break; + case BSIM4_MOD_WTVOFF: + mod->BSIM4wtvoff = value->rValue; + mod->BSIM4wtvoffGiven = TRUE; + break; case BSIM4_MOD_WMINV: mod->BSIM4wminv = value->rValue; mod->BSIM4wminvGiven = TRUE; @@ -1962,6 +2225,10 @@ GENmodel *inMod; mod->BSIM4wvfbsdoff = value->rValue; mod->BSIM4wvfbsdoffGiven = TRUE; break; + case BSIM4_MOD_WTVFBSDOFF: + mod->BSIM4wtvfbsdoff = value->rValue; + mod->BSIM4wtvfbsdoffGiven = TRUE; + break; case BSIM4_MOD_WEU : mod->BSIM4weu = value->rValue; mod->BSIM4weuGiven = TRUE; @@ -2238,6 +2505,10 @@ GENmodel *inMod; mod->BSIM4pvoff = value->rValue; mod->BSIM4pvoffGiven = TRUE; break; + case BSIM4_MOD_PTVOFF: + mod->BSIM4ptvoff = value->rValue; + mod->BSIM4ptvoffGiven = TRUE; + break; case BSIM4_MOD_PMINV: mod->BSIM4pminv = value->rValue; mod->BSIM4pminvGiven = TRUE; @@ -2470,6 +2741,10 @@ GENmodel *inMod; mod->BSIM4pvfbsdoff = value->rValue; mod->BSIM4pvfbsdoffGiven = TRUE; break; + case BSIM4_MOD_PTVFBSDOFF: + mod->BSIM4ptvfbsdoff = value->rValue; + mod->BSIM4ptvfbsdoffGiven = TRUE; + break; case BSIM4_MOD_PEU : mod->BSIM4peu = value->rValue; mod->BSIM4peuGiven = TRUE; diff --git a/src/spicelib/devices/bsim4/b4noi.c b/src/spicelib/devices/bsim4/b4noi.c index 53bd12bc4..551867f41 100644 --- a/src/spicelib/devices/bsim4/b4noi.c +++ b/src/spicelib/devices/bsim4/b4noi.c @@ -1,16 +1,17 @@ -/**** BSIM4.4.0 Released by Xuemei (Jane) Xi 03/04/2004 ****/ +/**** BSIM4.5.0 Released by Xuemei (Jane) Xi 07/29/2005 ****/ /********** - * Copyright 2004 Regents of the University of California. All rights reserved. - * File: b4noi.c of BSIM4.4.0. + * Copyright 2005 Regents of the University of California. All rights reserved. + * File: b4noi.c of BSIM4.5.0. * Author: 2000 Weidong Liu - * Authors: 2001- Xuemei Xi, Jin He, Kanyu Cao, Mohan Dunga, Mansun Chan, Ali Niknejad, Chenming Hu. + * Authors: 2001- Xuemei Xi, Mohan Dunga, Ali Niknejad, Chenming Hu. * Project Director: Prof. Chenming Hu. * Modified by Xuemei Xi, 04/06/2001. * Modified by Xuemei Xi, 10/05/2001. * Modified by Xuemei Xi, 11/15/2002. * Modified by Xuemei Xi, 05/09/2003. * Modified by Xuemei Xi, 03/04/2004. + * Modified by Xuemei Xi, 07/29/2005. **********/ #include "ngspice.h" @@ -51,6 +52,7 @@ double T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, Ssi; T0 = ((((Vds - here->BSIM4Vdseff) / pParam->BSIM4litl) + model->BSIM4em) / esat); DelClm = pParam->BSIM4litl * log (MAX(T0, N_MINLOG)); + if (DelClm < 0.0) DelClm = 0.0; /* bugfix */ } EffFreq = pow(freq, model->BSIM4ef); T1 = CHARGE * CHARGE * CONSTboltz * cd * temp * here->BSIM4ueff; @@ -65,7 +67,7 @@ double T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, Ssi; T5 = model->BSIM4oxideTrapDensityC * 0.5 * (N0 * N0 - Nl * Nl); T6 = CONSTboltz * temp * cd * cd; - T7 = 1.0e10 * EffFreq * Leffsq * pParam->BSIM4weff; + T7 = 1.0e10 * EffFreq * Leffsq * pParam->BSIM4weff * here->BSIM4nf; T8 = model->BSIM4oxideTrapDensityA + model->BSIM4oxideTrapDensityB * Nl + model->BSIM4oxideTrapDensityC * Nl * Nl; T9 = (Nl + here->BSIM4nstar) * (Nl + here->BSIM4nstar); @@ -93,7 +95,7 @@ double lnNdens[BSIM4NSRCS]; double T0, T1, T2, T5, T10, T11; double Vds, Ssi, Swi; -double tmp=0.0, gdpr, gspr, npart_theta=0.0, npart_beta=0.0, igsquare; +double tmp=0.0, gdpr, gspr, npart_theta=0.0, npart_beta=0.0, igsquare, bodymode; double m; @@ -256,28 +258,79 @@ int i; log(MAX(noizDens[BSIM4RGNOIZ], N_MINLOG)); } + bodymode = 5; + if (here->BSIM4rbodyMod == 2) + { if( ( !model->BSIM4rbps0Given) || + ( !model->BSIM4rbpd0Given) ) + bodymode = 1; + else + if( (!model->BSIM4rbsbx0Given && !model->BSIM4rbsby0Given) || + (!model->BSIM4rbdbx0Given && !model->BSIM4rbdby0Given) ) + bodymode = 3; + } if (here->BSIM4rbodyMod) - { NevalSrc(&noizDens[BSIM4RBPSNOIZ], - &lnNdens[BSIM4RBPSNOIZ], ckt, THERMNOISE, - here->BSIM4bNodePrime, here->BSIM4sbNode, - here->BSIM4grbps * m); - NevalSrc(&noizDens[BSIM4RBPDNOIZ], - &lnNdens[BSIM4RBPDNOIZ], ckt, THERMNOISE, - here->BSIM4bNodePrime, here->BSIM4dbNode, - here->BSIM4grbpd * m); - NevalSrc(&noizDens[BSIM4RBPBNOIZ], - &lnNdens[BSIM4RBPBNOIZ], ckt, THERMNOISE, - here->BSIM4bNodePrime, here->BSIM4bNode, - here->BSIM4grbpb * m); - NevalSrc(&noizDens[BSIM4RBSBNOIZ], - &lnNdens[BSIM4RBSBNOIZ], ckt, THERMNOISE, - here->BSIM4bNode, here->BSIM4sbNode, - here->BSIM4grbsb * m); - NevalSrc(&noizDens[BSIM4RBDBNOIZ], - &lnNdens[BSIM4RBDBNOIZ], ckt, THERMNOISE, - here->BSIM4bNode, here->BSIM4dbNode, - here->BSIM4grbdb * m); + { + if(bodymode == 5) + { + NevalSrc(&noizDens[BSIM4RBPSNOIZ], + &lnNdens[BSIM4RBPSNOIZ], ckt, THERMNOISE, + here->BSIM4bNodePrime, here->BSIM4sbNode, + here->BSIM4grbps * m); + NevalSrc(&noizDens[BSIM4RBPDNOIZ], + &lnNdens[BSIM4RBPDNOIZ], ckt, THERMNOISE, + here->BSIM4bNodePrime, here->BSIM4dbNode, + here->BSIM4grbpd * m); + NevalSrc(&noizDens[BSIM4RBPBNOIZ], + &lnNdens[BSIM4RBPBNOIZ], ckt, THERMNOISE, + here->BSIM4bNodePrime, here->BSIM4bNode, + here->BSIM4grbpb * m); + NevalSrc(&noizDens[BSIM4RBSBNOIZ], + &lnNdens[BSIM4RBSBNOIZ], ckt, THERMNOISE, + here->BSIM4bNode, here->BSIM4sbNode, + here->BSIM4grbsb * m); + NevalSrc(&noizDens[BSIM4RBDBNOIZ], + &lnNdens[BSIM4RBDBNOIZ], ckt, THERMNOISE, + here->BSIM4bNode, here->BSIM4dbNode, + here->BSIM4grbdb * m); + } + if(bodymode == 3) + { + NevalSrc(&noizDens[BSIM4RBPSNOIZ], + &lnNdens[BSIM4RBPSNOIZ], ckt, THERMNOISE, + here->BSIM4bNodePrime, here->BSIM4sbNode, + here->BSIM4grbps * m); + NevalSrc(&noizDens[BSIM4RBPDNOIZ], + &lnNdens[BSIM4RBPDNOIZ], ckt, THERMNOISE, + here->BSIM4bNodePrime, here->BSIM4dbNode, + here->BSIM4grbpd * m); + NevalSrc(&noizDens[BSIM4RBPBNOIZ], + &lnNdens[BSIM4RBPBNOIZ], ckt, THERMNOISE, + here->BSIM4bNodePrime, here->BSIM4bNode, + here->BSIM4grbpb * m); + noizDens[BSIM4RBSBNOIZ] = noizDens[BSIM4RBDBNOIZ] = 0.0; + lnNdens[BSIM4RBSBNOIZ] = + log(MAX(noizDens[BSIM4RBSBNOIZ], N_MINLOG)); + lnNdens[BSIM4RBDBNOIZ] = + log(MAX(noizDens[BSIM4RBDBNOIZ], N_MINLOG)); + } + if(bodymode == 1) + { + NevalSrc(&noizDens[BSIM4RBPBNOIZ], + &lnNdens[BSIM4RBPBNOIZ], ckt, THERMNOISE, + here->BSIM4bNodePrime, here->BSIM4bNode, + here->BSIM4grbpb * m); + noizDens[BSIM4RBPSNOIZ] = noizDens[BSIM4RBPDNOIZ] = 0.0; + noizDens[BSIM4RBSBNOIZ] = noizDens[BSIM4RBDBNOIZ] = 0.0; + lnNdens[BSIM4RBPSNOIZ] = + log(MAX(noizDens[BSIM4RBPSNOIZ], N_MINLOG)); + lnNdens[BSIM4RBPDNOIZ] = + log(MAX(noizDens[BSIM4RBPDNOIZ], N_MINLOG)); + lnNdens[BSIM4RBSBNOIZ] = + log(MAX(noizDens[BSIM4RBSBNOIZ], N_MINLOG)); + lnNdens[BSIM4RBDBNOIZ] = + log(MAX(noizDens[BSIM4RBDBNOIZ], N_MINLOG)); + } } else { noizDens[BSIM4RBPSNOIZ] = noizDens[BSIM4RBPDNOIZ] = 0.0; @@ -308,7 +361,7 @@ int i; (T0 / T1) * model->BSIM4ntnoi); break; case 1: - T0 = m * (here->BSIM4gm + here->BSIM4gmbs + here->BSIM4gds); + T0 = m * here->BSIM4gm + here->BSIM4gmbs + here->BSIM4gds; T0 *= T0; igsquare = npart_theta * npart_theta * T0 / here->BSIM4IdovVds; T1 = npart_beta * (here->BSIM4gm @@ -345,7 +398,7 @@ int i; data->freq, ckt->CKTtemp); T10 = model->BSIM4oxideTrapDensityA * CONSTboltz * ckt->CKTtemp; - T11 = pParam->BSIM4weff * pParam->BSIM4leff + T11 = pParam->BSIM4weff * here->BSIM4nf * pParam->BSIM4leff * pow(data->freq, model->BSIM4ef) * 1.0e10 * here->BSIM4nstar * here->BSIM4nstar; Swi = T10 / T11 * here->BSIM4cd diff --git a/src/spicelib/devices/bsim4/b4par.c b/src/spicelib/devices/bsim4/b4par.c index 6dd3ae1ec..58abee1dc 100644 --- a/src/spicelib/devices/bsim4/b4par.c +++ b/src/spicelib/devices/bsim4/b4par.c @@ -1,15 +1,16 @@ -/**** BSIM4.4.0 Released by Xuemei (Jane) Xi 03/04/2004 ****/ +/**** BSIM4.5.0 Released by Xuemei (Jane) Xi 07/29/2005 ****/ /********** * Copyright 2004 Regents of the University of California. All rights reserved. - * File: b4par.c of BSIM4.4.0. + * File: b4par.c of BSIM4.5.0. * Author: 2000 Weidong Liu - * Authors: 2001- Xuemei Xi, Jin He, Kanyu Cao, Mohan Dunga, Mansun Chan, Ali Niknejad, Chenming Hu. + * Authors: 2001- Xuemei Xi, Mohan Dunga, Ali Niknejad, Chenming Hu. * Project Director: Prof. Chenming Hu. * Modified by Xuemei Xi, 04/06/2001. * Modified by Xuemei Xi, 11/15/2002. * Modified by Xuemei Xi, 05/09/2003. - **********/ + * Modified by Xuemei Xi, Mohan Dunga, 07/29/2005. +**********/ #include "ngspice.h" #include "ifsim.h" @@ -38,7 +39,7 @@ IFvalue *select; here->BSIM4m = value->rValue; here->BSIM4mGiven = TRUE; break; - case BSIM4_NF: + case BSIM4_NF: here->BSIM4nf = value->rValue; here->BSIM4nfGiven = TRUE; break; @@ -85,6 +86,22 @@ IFvalue *select; here->BSIM4sd = value->rValue; here->BSIM4sdGiven = TRUE; break; + case BSIM4_SCA: + here->BSIM4sca = value->rValue; + here->BSIM4scaGiven = TRUE; + break; + case BSIM4_SCB: + here->BSIM4scb = value->rValue; + here->BSIM4scbGiven = TRUE; + break; + case BSIM4_SCC: + here->BSIM4scc = value->rValue; + here->BSIM4sccGiven = TRUE; + break; + case BSIM4_SC: + here->BSIM4sc = value->rValue; + here->BSIM4scGiven = TRUE; + break; case BSIM4_RBSB: here->BSIM4rbsb = value->rValue; here->BSIM4rbsbGiven = TRUE; @@ -105,6 +122,18 @@ IFvalue *select; here->BSIM4rbpd = value->rValue; here->BSIM4rbpdGiven = TRUE; break; + case BSIM4_DELVTO: + here->BSIM4delvto = value->rValue; + here->BSIM4delvtoGiven = TRUE; + break; + case BSIM4_XGW: + here->BSIM4xgw = value->rValue; + here->BSIM4xgwGiven = TRUE; + break; + case BSIM4_NGCON: + here->BSIM4ngcon = value->rValue; + here->BSIM4ngconGiven = TRUE; + break; case BSIM4_TRNQSMOD: here->BSIM4trnqsMod = value->iValue; here->BSIM4trnqsModGiven = TRUE; diff --git a/src/spicelib/devices/bsim4/b4pzld.c b/src/spicelib/devices/bsim4/b4pzld.c index d5c3871ef..484ed1452 100644 --- a/src/spicelib/devices/bsim4/b4pzld.c +++ b/src/spicelib/devices/bsim4/b4pzld.c @@ -1,10 +1,10 @@ -/**** BSIM4.4.0 Released by Xuemei (Jane) Xi 03/04/2004 ****/ +/**** BSIM4.5.0 Released by Xuemei (Jane) Xi 07/29/2005 ****/ /********** - * Copyright 2004 Regents of the University of California. All rights reserved. - * File: b4pzld.c of BSIM4.4.0. + * Copyright 2005 Regents of the University of California. All rights reserved. + * File: b4pzld.c of BSIM4.5.0. * Author: 2000 Weidong Liu - * Authors: 2001- Xuemei Xi, Jin He, Kanyu Cao, Mohan Dunga, Mansun Chan, Ali Niknejad, Chenming Hu. + * Authors: 2001- Xuemei Xi, Mohan Dunga, Ali Niknejad, Chenming Hu. * Project Director: Prof. Chenming Hu. * Modified by Xuemei Xi, 10/05/2001. **********/ @@ -53,8 +53,8 @@ double m; for (; model != NULL; model = model->BSIM4nextModel) { for (here = model->BSIM4instances; here!= NULL; here = here->BSIM4nextInstance) - { if (here->BSIM4owner != ARCHme) continue; - pParam = here->pParam; + { if (here->BSIM4owner != ARCHme) continue; + pParam = here->pParam; capbd = here->BSIM4capbd; capbs = here->BSIM4capbs; cgso = here->BSIM4cgso; @@ -483,7 +483,6 @@ double m; /* * Loading PZ matrix */ - m = here->BSIM4m; if (!model->BSIM4rdsMod) diff --git a/src/spicelib/devices/bsim4/b4set.c b/src/spicelib/devices/bsim4/b4set.c index 3e1180e31..bef502c0c 100644 --- a/src/spicelib/devices/bsim4/b4set.c +++ b/src/spicelib/devices/bsim4/b4set.c @@ -1,17 +1,18 @@ -/**** BSIM4.4.0 Released by Xuemei (Jane) Xi 03/04/2004 ****/ +/**** BSIM4.5.0 Released by Xuemei (Jane) Xi 07/29/2005 ****/ /********** - * Copyright 2004 Regents of the University of California. All rights reserved. - * File: b4set.c of BSIM4.4.0. + * Copyright 2005 Regents of the University of California. All rights reserved. + * File: b4set.c of BSIM4.5.0. * Author: 2000 Weidong Liu - * Authors: 2001- Xuemei Xi, Jin He, Kanyu Cao, Mohan Dunga, Mansun Chan, Ali Niknejad, Chenming Hu. + * Authors: 2001- Xuemei Xi, Mohan Dunga, Ali Niknejad, Chenming Hu. * Project Director: Prof. Chenming Hu. * Modified by Xuemei Xi, 04/06/2001. * Modified by Xuemei Xi, 10/05/2001. * Modified by Xuemei Xi, 11/15/2002. * Modified by Xuemei Xi, 05/09/2003. * Modified by Xuemei Xi, 03/04/2004. - **********/ + * Modified by Xuemei Xi, Mohan Dunga, 07/29/2005. +**********/ #include "ngspice.h" #include "jobdefs.h" /* Needed because the model searches for noise Analysis */ @@ -23,7 +24,6 @@ #include "sperror.h" #include "suffix.h" - #define MAX_EXP 5.834617425e14 #define MIN_EXP 1.713908431e-15 #define EXP_THRESHOLD 34.0 @@ -103,7 +103,7 @@ JOB *job; } if (!model->BSIM4rbodyModGiven) model->BSIM4rbodyMod = 0; - else if ((model->BSIM4rbodyMod != 0) && (model->BSIM4rbodyMod != 1)) + else if ((model->BSIM4rbodyMod != 0) && (model->BSIM4rbodyMod != 1) && (model->BSIM4rbodyMod != 2)) { model->BSIM4rbodyMod = 0; printf("Warning: rbodyMod has been set to its default value: 0.\n"); } @@ -154,7 +154,8 @@ JOB *job; if (!model->BSIM4igcModGiven) model->BSIM4igcMod = 0; - else if ((model->BSIM4igcMod != 0) && (model->BSIM4igcMod != 1)) + else if ((model->BSIM4igcMod != 0) && (model->BSIM4igcMod != 1) + && (model->BSIM4igcMod != 2)) { model->BSIM4igcMod = 0; printf("Warning: igcMod has been set to its default value: 0.\n"); } @@ -166,13 +167,14 @@ JOB *job; } if (!model->BSIM4tempModGiven) model->BSIM4tempMod = 0; - else if ((model->BSIM4tempMod != 0) && (model->BSIM4tempMod != 1)) + else if ((model->BSIM4tempMod != 0) && (model->BSIM4tempMod != 1) + && (model->BSIM4tempMod != 2)) { model->BSIM4tempMod = 0; printf("Warning: tempMod has been set to its default value: 0.\n"); } if (!model->BSIM4versionGiven) - model->BSIM4version = "4.4.0"; + model->BSIM4version = "4.5.0"; if (!model->BSIM4toxrefGiven) model->BSIM4toxref = 30.0e-10; if (!model->BSIM4toxeGiven) @@ -280,6 +282,14 @@ JOB *job; model->BSIM4uc = (model->BSIM4mobMod == 1) ? -0.0465 : -0.0465e-9; if (!model->BSIM4uc1Given) model->BSIM4uc1 = (model->BSIM4mobMod == 1) ? -0.056 : -0.056e-9; + if (!model->BSIM4udGiven) + model->BSIM4ud = 1.0e14; /* unit m**(-2) */ + if (!model->BSIM4ud1Given) + model->BSIM4ud1 = 0.0; + if (!model->BSIM4upGiven) + model->BSIM4up = 0.0; + if (!model->BSIM4lpGiven) + model->BSIM4lp = 1.0e-8; if (!model->BSIM4u0Given) model->BSIM4u0 = (model->BSIM4type == NMOS) ? 0.067 : 0.025; if (!model->BSIM4uteGiven) @@ -352,7 +362,7 @@ JOB *job; if (!model->BSIM4alpha1Given) model->BSIM4alpha1 = 0.0; if (!model->BSIM4beta0Given) - model->BSIM4beta0 = 30.0; + model->BSIM4beta0 = 0.0; if (!model->BSIM4agidlGiven) model->BSIM4agidl = 0.0; if (!model->BSIM4bgidlGiven) @@ -362,27 +372,27 @@ JOB *job; if (!model->BSIM4egidlGiven) model->BSIM4egidl = 0.8; /* V */ if (!model->BSIM4aigcGiven) - model->BSIM4aigc = (model->BSIM4type == NMOS) ? 0.43 : 0.31; + model->BSIM4aigc = (model->BSIM4type == NMOS) ? 1.36e-2 : 9.80e-3; if (!model->BSIM4bigcGiven) - model->BSIM4bigc = (model->BSIM4type == NMOS) ? 0.054 : 0.024; + model->BSIM4bigc = (model->BSIM4type == NMOS) ? 1.71e-3 : 7.59e-4; if (!model->BSIM4cigcGiven) model->BSIM4cigc = (model->BSIM4type == NMOS) ? 0.075 : 0.03; if (!model->BSIM4aigsdGiven) - model->BSIM4aigsd = (model->BSIM4type == NMOS) ? 0.43 : 0.31; + model->BSIM4aigsd = (model->BSIM4type == NMOS) ? 1.36e-2 : 9.80e-3; if (!model->BSIM4bigsdGiven) - model->BSIM4bigsd = (model->BSIM4type == NMOS) ? 0.054 : 0.024; + model->BSIM4bigsd = (model->BSIM4type == NMOS) ? 1.71e-3 : 7.59e-4; if (!model->BSIM4cigsdGiven) model->BSIM4cigsd = (model->BSIM4type == NMOS) ? 0.075 : 0.03; if (!model->BSIM4aigbaccGiven) - model->BSIM4aigbacc = 0.43; + model->BSIM4aigbacc = 1.36e-2; if (!model->BSIM4bigbaccGiven) - model->BSIM4bigbacc = 0.054; + model->BSIM4bigbacc = 1.71e-3; if (!model->BSIM4cigbaccGiven) model->BSIM4cigbacc = 0.075; if (!model->BSIM4aigbinvGiven) - model->BSIM4aigbinv = 0.35; + model->BSIM4aigbinv = 1.11e-2; if (!model->BSIM4bigbinvGiven) - model->BSIM4bigbinv = 0.03; + model->BSIM4bigbinv = 9.49e-4; if (!model->BSIM4cigbinvGiven) model->BSIM4cigbinv = 0.006; if (!model->BSIM4nigcGiven) @@ -431,6 +441,11 @@ JOB *job; model->BSIM4lc = 5.0e-9; if (!model->BSIM4vfbsdoffGiven) model->BSIM4vfbsdoff = 0.0; /* unit v */ + if (!model->BSIM4tvfbsdoffGiven) + model->BSIM4tvfbsdoff = 0.0; + if (!model->BSIM4tvoffGiven) + model->BSIM4tvoff = 0.0; + if (!model->BSIM4lintnoiGiven) model->BSIM4lintnoi = 0.0; /* unit m */ @@ -456,6 +471,65 @@ JOB *job; if (!model->BSIM4rbpdGiven) model->BSIM4rbpd = 50.0; + if (!model->BSIM4rbps0Given) + model->BSIM4rbps0 = 50.0; + if (!model->BSIM4rbpslGiven) + model->BSIM4rbpsl = 0.0; + if (!model->BSIM4rbpswGiven) + model->BSIM4rbpsw = 0.0; + if (!model->BSIM4rbpsnfGiven) + model->BSIM4rbpsnf = 0.0; + + if (!model->BSIM4rbpd0Given) + model->BSIM4rbpd0 = 50.0; + if (!model->BSIM4rbpdlGiven) + model->BSIM4rbpdl = 0.0; + if (!model->BSIM4rbpdwGiven) + model->BSIM4rbpdw = 0.0; + if (!model->BSIM4rbpdnfGiven) + model->BSIM4rbpdnf = 0.0; + + if (!model->BSIM4rbpbx0Given) + model->BSIM4rbpbx0 = 100.0; + if (!model->BSIM4rbpbxlGiven) + model->BSIM4rbpbxl = 0.0; + if (!model->BSIM4rbpbxwGiven) + model->BSIM4rbpbxw = 0.0; + if (!model->BSIM4rbpbxnfGiven) + model->BSIM4rbpbxnf = 0.0; + if (!model->BSIM4rbpby0Given) + model->BSIM4rbpby0 = 100.0; + if (!model->BSIM4rbpbylGiven) + model->BSIM4rbpbyl = 0.0; + if (!model->BSIM4rbpbywGiven) + model->BSIM4rbpbyw = 0.0; + if (!model->BSIM4rbpbynfGiven) + model->BSIM4rbpbynf = 0.0; + + + if (!model->BSIM4rbsbx0Given) + model->BSIM4rbsbx0 = 100.0; + if (!model->BSIM4rbsby0Given) + model->BSIM4rbsby0 = 100.0; + if (!model->BSIM4rbdbx0Given) + model->BSIM4rbdbx0 = 100.0; + if (!model->BSIM4rbdby0Given) + model->BSIM4rbdby0 = 100.0; + + + if (!model->BSIM4rbsdbxlGiven) + model->BSIM4rbsdbxl = 0.0; + if (!model->BSIM4rbsdbxwGiven) + model->BSIM4rbsdbxw = 0.0; + if (!model->BSIM4rbsdbxnfGiven) + model->BSIM4rbsdbxnf = 0.0; + if (!model->BSIM4rbsdbylGiven) + model->BSIM4rbsdbyl = 0.0; + if (!model->BSIM4rbsdbywGiven) + model->BSIM4rbsdbyw = 0.0; + if (!model->BSIM4rbsdbynfGiven) + model->BSIM4rbsdbynf = 0.0; + if (!model->BSIM4cgslGiven) model->BSIM4cgsl = 0.0; if (!model->BSIM4cgdlGiven) @@ -598,6 +672,14 @@ JOB *job; model->BSIM4luc = 0.0; if (!model->BSIM4luc1Given) model->BSIM4luc1 = 0.0; + if (!model->BSIM4ludGiven) + model->BSIM4lud = 0.0; + if (!model->BSIM4lud1Given) + model->BSIM4lud1 = 0.0; + if (!model->BSIM4lupGiven) + model->BSIM4lup = 0.0; + if (!model->BSIM4llpGiven) + model->BSIM4llp = 0.0; if (!model->BSIM4lu0Given) model->BSIM4lu0 = 0.0; if (!model->BSIM4luteGiven) @@ -722,6 +804,11 @@ JOB *job; model->BSIM4lxn = 0.0; if (!model->BSIM4lvfbsdoffGiven) model->BSIM4lvfbsdoff = 0.0; + if (!model->BSIM4ltvfbsdoffGiven) + model->BSIM4ltvfbsdoff = 0.0; + if (!model->BSIM4ltvoffGiven) + model->BSIM4ltvoff = 0.0; + if (!model->BSIM4lcgslGiven) model->BSIM4lcgsl = 0.0; @@ -839,6 +926,14 @@ JOB *job; model->BSIM4wuc = 0.0; if (!model->BSIM4wuc1Given) model->BSIM4wuc1 = 0.0; + if (!model->BSIM4wudGiven) + model->BSIM4wud = 0.0; + if (!model->BSIM4wud1Given) + model->BSIM4wud1 = 0.0; + if (!model->BSIM4wupGiven) + model->BSIM4wup = 0.0; + if (!model->BSIM4wlpGiven) + model->BSIM4wlp = 0.0; if (!model->BSIM4wu0Given) model->BSIM4wu0 = 0.0; if (!model->BSIM4wuteGiven) @@ -963,6 +1058,10 @@ JOB *job; model->BSIM4wxn = 0.0; if (!model->BSIM4wvfbsdoffGiven) model->BSIM4wvfbsdoff = 0.0; + if (!model->BSIM4wtvfbsdoffGiven) + model->BSIM4wtvfbsdoff = 0.0; + if (!model->BSIM4wtvoffGiven) + model->BSIM4wtvoff = 0.0; if (!model->BSIM4wcgslGiven) model->BSIM4wcgsl = 0.0; @@ -1081,6 +1180,14 @@ JOB *job; model->BSIM4puc = 0.0; if (!model->BSIM4puc1Given) model->BSIM4puc1 = 0.0; + if (!model->BSIM4pudGiven) + model->BSIM4pud = 0.0; + if (!model->BSIM4pud1Given) + model->BSIM4pud1 = 0.0; + if (!model->BSIM4pupGiven) + model->BSIM4pup = 0.0; + if (!model->BSIM4plpGiven) + model->BSIM4plp = 0.0; if (!model->BSIM4pu0Given) model->BSIM4pu0 = 0.0; if (!model->BSIM4puteGiven) @@ -1205,6 +1312,10 @@ JOB *job; model->BSIM4pxn = 0.0; if (!model->BSIM4pvfbsdoffGiven) model->BSIM4pvfbsdoff = 0.0; + if (!model->BSIM4ptvfbsdoffGiven) + model->BSIM4ptvfbsdoff = 0.0; + if (!model->BSIM4ptvoffGiven) + model->BSIM4ptvoff = 0.0; if (!model->BSIM4pcgslGiven) model->BSIM4pcgsl = 0.0; @@ -1405,7 +1516,7 @@ JOB *job; model->BSIM4xtsd = model->BSIM4xtss; if (!model->BSIM4xtsswsGiven) model->BSIM4xtssws = 0.02; - if (!model->BSIM4jtsswdGiven) + if (!model->BSIM4xtsswdGiven) model->BSIM4xtsswd = model->BSIM4xtssws; if (!model->BSIM4xtsswgsGiven) model->BSIM4xtsswgs = 0.02; @@ -1497,6 +1608,44 @@ JOB *job; if (!model->BSIM4lodeta0Given) model->BSIM4lodeta0 = 1.0; + /* Well Proximity Effect */ + if (!model->BSIM4webGiven) + model->BSIM4web = 0.0; + if (!model->BSIM4wecGiven) + model->BSIM4wec = 0.0; + if (!model->BSIM4kvth0weGiven) + model->BSIM4kvth0we = 0.0; + if (!model->BSIM4k2weGiven) + model->BSIM4k2we = 0.0; + if (!model->BSIM4ku0weGiven) + model->BSIM4ku0we = 0.0; + if (!model->BSIM4screfGiven) + model->BSIM4scref = 1.0E-6; /* m */ + if (!model->BSIM4wpemodGiven) + model->BSIM4wpemod = 0; + else if ((model->BSIM4wpemod != 0) && (model->BSIM4wpemod != 1)) + { model->BSIM4wpemod = 0; + printf("Warning: wpemod has been set to its default value: 0.\n"); + } + if (!model->BSIM4lkvth0weGiven) + model->BSIM4lkvth0we = 0; + if (!model->BSIM4lk2weGiven) + model->BSIM4lk2we = 0; + if (!model->BSIM4lku0weGiven) + model->BSIM4lku0we = 0; + if (!model->BSIM4wkvth0weGiven) + model->BSIM4wkvth0we = 0; + if (!model->BSIM4wk2weGiven) + model->BSIM4wk2we = 0; + if (!model->BSIM4wku0weGiven) + model->BSIM4wku0we = 0; + if (!model->BSIM4pkvth0weGiven) + model->BSIM4pkvth0we = 0; + if (!model->BSIM4pk2weGiven) + model->BSIM4pk2we = 0; + if (!model->BSIM4pku0weGiven) + model->BSIM4pku0we = 0; + DMCGeff = model->BSIM4dmcg - model->BSIM4dmcgt; DMCIeff = model->BSIM4dmci; DMDGeff = model->BSIM4dmdg - model->BSIM4dmcgt; @@ -1509,10 +1658,10 @@ JOB *job; for (here = model->BSIM4instances; here != NULL ; here=here->BSIM4nextInstance) { - if (here->BSIM4owner == ARCHme) { - /* allocate a chunk of the state vector */ - here->BSIM4states = *states; - *states += BSIM4numStates; + if (here->BSIM4owner == ARCHme) { + /* allocate a chunk of the state vector */ + here->BSIM4states = *states; + *states += BSIM4numStates; } /* perform the parameter defaulting */ if (!here->BSIM4lGiven) @@ -1544,13 +1693,6 @@ JOB *job; if (!here->BSIM4sourceSquaresGiven) here->BSIM4sourceSquares = 1.0; - if (!here->BSIM4saGiven) - here->BSIM4sa = 0.0; - if (!here->BSIM4sbGiven) - here->BSIM4sb = 0.0; - if (!here->BSIM4sdGiven) - here->BSIM4sd = 0.0; - if (!here->BSIM4rbdbGiven) here->BSIM4rbdb = model->BSIM4rbdb; /* in ohm */ if (!here->BSIM4rbsbGiven) @@ -1561,6 +1703,12 @@ JOB *job; here->BSIM4rbps = model->BSIM4rbps; if (!here->BSIM4rbpdGiven) here->BSIM4rbpd = model->BSIM4rbpd; + if (!here->BSIM4delvtoGiven) + here->BSIM4delvto = 0.0; + if (!here->BSIM4xgwGiven) + here->BSIM4xgw = model->BSIM4xgw; + if (!here->BSIM4ngconGiven) + here->BSIM4ngcon = model->BSIM4ngcon; /* Process instance model selectors, some @@ -1568,7 +1716,7 @@ JOB *job; */ if (!here->BSIM4rbodyModGiven) here->BSIM4rbodyMod = model->BSIM4rbodyMod; - else if ((here->BSIM4rbodyMod != 0) && (here->BSIM4rbodyMod != 1)) + else if ((here->BSIM4rbodyMod != 0) && (here->BSIM4rbodyMod != 1) && (here->BSIM4rbodyMod != 2)) { here->BSIM4rbodyMod = model->BSIM4rbodyMod; printf("Warning: rbodyMod has been set to its global value %d.\n", model->BSIM4rbodyMod); @@ -1609,8 +1757,16 @@ JOB *job; if (!here->BSIM4sbGiven) here->BSIM4sb = 0.0; if (!here->BSIM4sdGiven) - here->BSIM4sd = 0.0; - + here->BSIM4sd = 2 * model->BSIM4dmcg; + /* Well Proximity Effect */ + if (!here->BSIM4scaGiven) + here->BSIM4sca = 0.0; + if (!here->BSIM4scbGiven) + here->BSIM4scb = 0.0; + if (!here->BSIM4sccGiven) + here->BSIM4scc = 0.0; + if (!here->BSIM4scGiven) + here->BSIM4sc = 0.0; /* m */ /* process drain series resistance */ createNode = 0; @@ -1639,19 +1795,16 @@ JOB *job; { error = CKTmkVolt(ckt,&tmp,here->BSIM4name,"drain"); if(error) return(error); here->BSIM4dNodePrime = tmp->number; - if (ckt->CKTcopyNodesets) { - CKTnode *tmpNode; - IFuid tmpName; + CKTnode *tmpNode; + IFuid tmpName; if (CKTinst2Node(ckt,here,1,&tmpNode,&tmpName)==OK) { if (tmpNode->nsGiven) { tmp->nodeset=tmpNode->nodeset; tmp->nsGiven=tmpNode->nsGiven; } } - -} - + } } else { here->BSIM4dNodePrime = here->BSIM4dNode; @@ -1684,18 +1837,16 @@ JOB *job; { error = CKTmkVolt(ckt,&tmp,here->BSIM4name,"source"); if(error) return(error); here->BSIM4sNodePrime = tmp->number; - - if (ckt->CKTcopyNodesets) { - CKTnode *tmpNode; - IFuid tmpName; + if (ckt->CKTcopyNodesets) { + CKTnode *tmpNode; + IFuid tmpName; if (CKTinst2Node(ckt,here,3,&tmpNode,&tmpName)==OK) { if (tmpNode->nsGiven) { tmp->nodeset=tmpNode->nodeset; tmp->nsGiven=tmpNode->nsGiven; } } - } - + } } else here->BSIM4sNodePrime = here->BSIM4sNode; @@ -1704,18 +1855,16 @@ JOB *job; { error = CKTmkVolt(ckt,&tmp,here->BSIM4name,"gate"); if(error) return(error); here->BSIM4gNodePrime = tmp->number; - - if (ckt->CKTcopyNodesets) { - CKTnode *tmpNode; - IFuid tmpName; + if (ckt->CKTcopyNodesets) { + CKTnode *tmpNode; + IFuid tmpName; if (CKTinst2Node(ckt,here,2,&tmpNode,&tmpName)==OK) { - if (tmpNode->nsGiven) { - tmp->nodeset=tmpNode->nodeset; - tmp->nsGiven=tmpNode->nsGiven; - } + if (tmpNode->nsGiven) { + tmp->nodeset=tmpNode->nodeset; + tmp->nsGiven=tmpNode->nsGiven; + } } } - } else here->BSIM4gNodePrime = here->BSIM4gNodeExt; @@ -1730,27 +1879,26 @@ JOB *job; /* internal body nodes for body resistance model */ - if (here->BSIM4rbodyMod) + if ((here->BSIM4rbodyMod ==1) || (here->BSIM4rbodyMod ==2)) { if (here->BSIM4dbNode == 0) { error = CKTmkVolt(ckt,&tmp,here->BSIM4name,"dbody"); if(error) return(error); here->BSIM4dbNode = tmp->number; - - if (ckt->CKTcopyNodesets) { - CKTnode *tmpNode; - IFuid tmpName; - if (CKTinst2Node(ckt,here,4,&tmpNode,&tmpName)==OK) { - if (tmpNode->nsGiven) { - tmp->nodeset=tmpNode->nodeset; - tmp->nsGiven=tmpNode->nsGiven; - } - } - } } if (here->BSIM4bNodePrime == 0) { error = CKTmkVolt(ckt,&tmp,here->BSIM4name,"body"); if(error) return(error); here->BSIM4bNodePrime = tmp->number; + if (ckt->CKTcopyNodesets) { + CKTnode *tmpNode; + IFuid tmpName; + if (CKTinst2Node(ckt,here,4,&tmpNode,&tmpName)==OK) { + if (tmpNode->nsGiven) { + tmp->nodeset=tmpNode->nodeset; + tmp->nsGiven=tmpNode->nsGiven; + } + } + } } if (here->BSIM4sbNode == 0) { error = CKTmkVolt(ckt,&tmp,here->BSIM4name,"sbody"); @@ -1767,17 +1915,6 @@ JOB *job; { error = CKTmkVolt(ckt,&tmp,here->BSIM4name,"charge"); if(error) return(error); here->BSIM4qNode = tmp->number; - - if (ckt->CKTcopyNodesets) { - CKTnode *tmpNode; - IFuid tmpName; - if (CKTinst2Node(ckt,here,5,&tmpNode,&tmpName)==OK) { - if (tmpNode->nsGiven) { - tmp->nodeset=tmpNode->nodeset; - tmp->nsGiven=tmpNode->nsGiven; - } - } - } } else here->BSIM4qNode = 0; @@ -1844,7 +1981,7 @@ if((here->ptr = SMPmakeElt(matrix,here->first,here->second))==(double *)NULL){\ TSTALLOC(BSIM4BPgmPtr, BSIM4bNodePrime, BSIM4gNodeMid) } - if (here->BSIM4rbodyMod) + if ((here->BSIM4rbodyMod ==1) || (here->BSIM4rbodyMod ==2)) { TSTALLOC(BSIM4DPdbPtr, BSIM4dNodePrime, BSIM4dbNode) TSTALLOC(BSIM4SPsbPtr, BSIM4sNodePrime, BSIM4sbNode) @@ -1886,7 +2023,7 @@ BSIM4unsetup(inModel,ckt) GENmodel *inModel; CKTcircuit *ckt; { - +#ifndef HAS_BATCHSIM BSIM4model *model; BSIM4instance *here; @@ -1910,5 +2047,6 @@ BSIM4unsetup(inModel,ckt) } } } +#endif return OK; } diff --git a/src/spicelib/devices/bsim4/b4temp.c b/src/spicelib/devices/bsim4/b4temp.c index 936e05990..1a2385c1c 100644 --- a/src/spicelib/devices/bsim4/b4temp.c +++ b/src/spicelib/devices/bsim4/b4temp.c @@ -1,16 +1,17 @@ -/**** BSIM4.4.0 Released by Xuemei (Jane) Xi 03/04/2004 ****/ +/**** BSIM4.5.0 Released by Xuemei (Jane) Xi 07/29/2005 ****/ /********** - * Copyright 2004 Regents of the University of California. All rights reserved. - * File: b4temp.c of BSIM4.4.0. + * Copyright 2005 Regents of the University of California. All rights reserved. + * File: b4temp.c of BSIM4.5.0. * Author: 2000 Weidong Liu - * Authors: 2001- Xuemei Xi, Jin He, Kanyu Cao, Mohan Dunga, Mansun Chan, Ali Niknejad, Chenming Hu. + * Authors: 2001- Xuemei Xi, Mohan Dunga, Ali Niknejad, Chenming Hu. * Project Director: Prof. Chenming Hu. * Modified by Xuemei Xi, 04/06/2001. * Modified by Xuemei Xi, 10/05/2001. * Modified by Xuemei Xi, 11/15/2002. * Modified by Xuemei Xi, 05/09/2003. * Modified by Xuemei Xi, 03/04/2004. + * Modified by Xuemei Xi, Mohan Dunga, 07/29/2005. **********/ #include "ngspice.h" @@ -71,7 +72,7 @@ CKTcircuit *ckt; BSIM4model *model = (BSIM4model*) inModel; BSIM4instance *here; struct bsim4SizeDependParam *pSizeDependParamKnot, *pLastKnot, *pParam=NULL; -double tmp, tmp1, tmp2, tmp3, Eg, Eg0, ni; +double tmp, tmp1, tmp2, Eg, Eg0, ni; 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; @@ -80,6 +81,8 @@ double Nvtms, Nvtmd, SourceSatCurrent, DrainSatCurrent; double T10; 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; int Size_Not_Found, i; @@ -340,7 +343,7 @@ int Size_Not_Found, i; /* loop through all the instances of the model */ for (here = model->BSIM4instances; here != NULL; here = here->BSIM4nextInstance) - { if (here->BSIM4owner != ARCHme) continue; + { if (here->BSIM4owner != ARCHme) continue; pSizeDependParamKnot = model->pSizeDependParamKnot; Size_Not_Found = 1; while ((pSizeDependParamKnot != NULL) && Size_Not_Found) @@ -359,10 +362,11 @@ int Size_Not_Found, i; /* stress effect */ Ldrn = here->BSIM4l; + Wdrn = here->BSIM4w / here->BSIM4nf; if (Size_Not_Found) { pParam = (struct bsim4SizeDependParam *)malloc( - sizeof(struct bsim4SizeDependParam)); + sizeof(struct bsim4SizeDependParam)); if (pLastKnot == NULL) model->pSizeDependParamKnot = pParam; else @@ -384,7 +388,6 @@ int Size_Not_Found, i; tmp2 = model->BSIM4Llc / T0 + model->BSIM4Lwc / T1 + model->BSIM4Lwlc / (T0 * T1); pParam->BSIM4dlc = model->BSIM4dlc + tmp2; - pParam->BSIM4dlcig = model->BSIM4dlcig; T2 = pow(Lnew, model->BSIM4Wln); T3 = pow(Wnew, model->BSIM4Wwn); @@ -672,6 +675,22 @@ int Size_Not_Found, i; + model->BSIM4luc1 * Inv_L + model->BSIM4wuc1 * Inv_W + model->BSIM4puc1 * Inv_LW; + pParam->BSIM4ud = model->BSIM4ud + + model->BSIM4lud * Inv_L + + model->BSIM4wud * Inv_W + + model->BSIM4pud * Inv_LW; + pParam->BSIM4ud1 = model->BSIM4ud1 + + model->BSIM4lud1 * Inv_L + + model->BSIM4wud1 * Inv_W + + model->BSIM4pud1 * Inv_LW; + pParam->BSIM4up = model->BSIM4up + + model->BSIM4lup * Inv_L + + model->BSIM4wup * Inv_W + + model->BSIM4pup * Inv_LW; + pParam->BSIM4lp = model->BSIM4lp + + model->BSIM4llp * Inv_L + + model->BSIM4wlp * Inv_W + + model->BSIM4plp * Inv_LW; pParam->BSIM4eu = model->BSIM4eu + model->BSIM4leu * Inv_L + model->BSIM4weu * Inv_W @@ -688,6 +707,10 @@ int Size_Not_Found, i; + model->BSIM4lvoff * Inv_L + model->BSIM4wvoff * Inv_W + model->BSIM4pvoff * Inv_LW; + pParam->BSIM4tvoff = model->BSIM4tvoff + + model->BSIM4ltvoff * Inv_L + + model->BSIM4wtvoff * Inv_W + + model->BSIM4ptvoff * Inv_LW; pParam->BSIM4minv = model->BSIM4minv + model->BSIM4lminv * Inv_L + model->BSIM4wminv * Inv_W @@ -916,6 +939,10 @@ int Size_Not_Found, i; + model->BSIM4lvfbsdoff * Inv_L + model->BSIM4wvfbsdoff * Inv_W + model->BSIM4pvfbsdoff * Inv_LW; + pParam->BSIM4tvfbsdoff = model->BSIM4tvfbsdoff + + model->BSIM4ltvfbsdoff * Inv_L + + model->BSIM4wtvfbsdoff * Inv_W + + model->BSIM4ptvfbsdoff * Inv_LW; pParam->BSIM4cgsl = model->BSIM4cgsl + model->BSIM4lcgsl * Inv_L @@ -965,6 +992,18 @@ int Size_Not_Found, i; + model->BSIM4lvoffcv * Inv_L + model->BSIM4wvoffcv * Inv_W + model->BSIM4pvoffcv * Inv_LW; + pParam->BSIM4kvth0we = model->BSIM4kvth0we + + model->BSIM4lkvth0we * Inv_L + + model->BSIM4wkvth0we * Inv_W + + model->BSIM4pkvth0we * Inv_LW; + pParam->BSIM4k2we = model->BSIM4k2we + + model->BSIM4lk2we * Inv_L + + model->BSIM4wk2we * Inv_W + + model->BSIM4pk2we * Inv_LW; + pParam->BSIM4ku0we = model->BSIM4ku0we + + model->BSIM4lku0we * Inv_L + + model->BSIM4wku0we * Inv_W + + model->BSIM4pku0we * Inv_LW; pParam->BSIM4abulkCVfactor = 1.0 + pow((pParam->BSIM4clc / pParam->BSIM4leffCV), @@ -979,6 +1018,7 @@ int Size_Not_Found, i; pParam->BSIM4ua = pParam->BSIM4ua + pParam->BSIM4ua1 * T0; pParam->BSIM4ub = pParam->BSIM4ub + pParam->BSIM4ub1 * T0; pParam->BSIM4uc = pParam->BSIM4uc + pParam->BSIM4uc1 * T0; + pParam->BSIM4ud = pParam->BSIM4ud + pParam->BSIM4ud1 * T0; pParam->BSIM4vsattemp = pParam->BSIM4vsat - pParam->BSIM4at * T0; T10 = pParam->BSIM4prt * T0; if(model->BSIM4rdsMod) { @@ -994,10 +1034,11 @@ int Size_Not_Found, i; * here->BSIM4nf / PowWeffWr; pParam->BSIM4rdswmin = (model->BSIM4rdswmin + T10) * here->BSIM4nf / PowWeffWr; - } else { /* tempMod = 1 */ + } 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) { @@ -1036,13 +1077,18 @@ int Size_Not_Found, i; if (pParam->BSIM4u0 > 1.0) pParam->BSIM4u0 = pParam->BSIM4u0 / 1.0e4; - pParam->BSIM4u0temp = pParam->BSIM4u0 + /* mobility channel length dependence */ + T5 = 1.0 - pParam->BSIM4up * exp( - pParam->BSIM4leff / pParam->BSIM4lp); + pParam->BSIM4u0temp = pParam->BSIM4u0 * T5 * pow(TRatio, pParam->BSIM4ute); if (pParam->BSIM4eu < 0.0) { pParam->BSIM4eu = 0.0; printf("Warning: eu has been negative; reset to 0.0.\n"); } + pParam->BSIM4vfbsdoff = pParam->BSIM4vfbsdoff * (1.0 + pParam->BSIM4tvfbsdoff * delTemp); + pParam->BSIM4voff = pParam->BSIM4voff * (1.0 + pParam->BSIM4tvoff * delTemp); + /* Source End Velocity Limit */ if((model->BSIM4vtlGiven) && (model->BSIM4vtl > 0.0) ) { @@ -1100,7 +1146,7 @@ int Size_Not_Found, i; pParam->BSIM4Aechvb = (model->BSIM4type == NMOS) ? 4.97232e-7 : 3.42537e-7; pParam->BSIM4Bechvb = (model->BSIM4type == NMOS) ? 7.45669e11 : 1.16645e12; pParam->BSIM4AechvbEdge = pParam->BSIM4Aechvb * pParam->BSIM4weff - * pParam->BSIM4dlcig * pParam->BSIM4ToxRatioEdge; + * model->BSIM4dlcig * pParam->BSIM4ToxRatioEdge; pParam->BSIM4BechvbEdge = -pParam->BSIM4Bechvb * model->BSIM4toxe * pParam->BSIM4poxedge; pParam->BSIM4Aechvb *= pParam->BSIM4weff * pParam->BSIM4leff @@ -1165,20 +1211,6 @@ int Size_Not_Found, i; * pParam->BSIM4k2 * sqrt(pParam->BSIM4phi - pParam->BSIM4vbm); } - - if (pParam->BSIM4k2 < 0.0) - { T0 = 0.5 * pParam->BSIM4k1 / pParam->BSIM4k2; - pParam->BSIM4vbsc = 0.9 * (pParam->BSIM4phi - T0 * T0); - if (pParam->BSIM4vbsc > -3.0) - pParam->BSIM4vbsc = -3.0; - else if (pParam->BSIM4vbsc < -30.0) - pParam->BSIM4vbsc = -30.0; - } - else - { pParam->BSIM4vbsc = -30.0; - } - if (pParam->BSIM4vbsc > pParam->BSIM4vbm) - pParam->BSIM4vbsc = pParam->BSIM4vbm; if (!model->BSIM4vfbGiven) { if (model->BSIM4vth0Given) @@ -1195,23 +1227,9 @@ int Size_Not_Found, i; + pParam->BSIM4phi + pParam->BSIM4k1 * pParam->BSIM4sqrtPhi); } - + pParam->BSIM4k1ox = pParam->BSIM4k1 * model->BSIM4toxe / model->BSIM4toxm; - pParam->BSIM4k2ox = pParam->BSIM4k2 * model->BSIM4toxe - / model->BSIM4toxm; - - T3 = model->BSIM4type * pParam->BSIM4vth0 - - pParam->BSIM4vfb - pParam->BSIM4phi; - T4 = T3 + T3; - T5 = 2.5 * T3; - pParam->BSIM4vtfbphi1 = (model->BSIM4type == NMOS) ? T4 : T5; - if (pParam->BSIM4vtfbphi1 < 0.0) - pParam->BSIM4vtfbphi1 = 0.0; - - pParam->BSIM4vtfbphi2 = 4.0 * T3; - if (pParam->BSIM4vtfbphi2 < 0.0) - pParam->BSIM4vtfbphi2 = 0.0; tmp = sqrt(EPSSI / (model->BSIM4epsrox * EPS0) * model->BSIM4toxe * pParam->BSIM4Xdep0); @@ -1273,18 +1291,26 @@ int Size_Not_Found, i; / (pParam->BSIM4weff + pParam->BSIM4w0); T0 = sqrt(1.0 + pParam->BSIM4lpe0 / pParam->BSIM4leff); - T5 = pParam->BSIM4k1ox * (T0 - 1.0) * pParam->BSIM4sqrtPhi - + (pParam->BSIM4kt1 + pParam->BSIM4kt1l / pParam->BSIM4leff) - * (TRatio - 1.0); + if((model->BSIM4tempMod == 1) || (model->BSIM4tempMod == 0)) + T3 = (pParam->BSIM4kt1 + pParam->BSIM4kt1l / pParam->BSIM4leff) + * (TRatio - 1.0); + if(model->BSIM4tempMod == 2) + T3 = - pParam->BSIM4kt1 * (TRatio - 1.0); - tmp3 = model->BSIM4type * pParam->BSIM4vth0 - - T8 - T9 + pParam->BSIM4k3 * T4 + T5; - pParam->BSIM4vfbzb = tmp3 - pParam->BSIM4phi - pParam->BSIM4k1 - * pParam->BSIM4sqrtPhi; /* End of vfbzb */ + T5 = pParam->BSIM4k1ox * (T0 - 1.0) * pParam->BSIM4sqrtPhi + + T3; + pParam->BSIM4vfbzbfactor = - T8 - T9 + pParam->BSIM4k3 * T4 + T5 + - pParam->BSIM4phi - pParam->BSIM4k1 * pParam->BSIM4sqrtPhi; /* stress effect */ + + wlod = model->BSIM4wlod; + if (model->BSIM4wlod < 0.0) + { fprintf(stderr, "Warning: WLOD = %g is less than 0. 0.0 is used\n",model->BSIM4wlod); + wlod = 0.0; + } T0 = pow(Lnew, model->BSIM4llodku0); - W_tmp = Wnew + model->BSIM4wlod; + W_tmp = Wnew + wlod; T1 = pow(W_tmp, model->BSIM4wlodku0); tmp1 = model->BSIM4lku0 / T0 + model->BSIM4wku0 / T1 + model->BSIM4pku0 / (T0 * T1); @@ -1313,17 +1339,14 @@ int Size_Not_Found, i; { Inv_sa = 0; Inv_sb = 0; - if (model->BSIM4wlod < 0.0) - { fprintf(stderr, "Warning: WLOD = %g is less than 0. Set to 0.0\n",model->BSIM4wlod); - model->BSIM4wlod = 0.0; - } - if (model->BSIM4kvsat < -1.0 ) - { fprintf(stderr, "Warning: KVSAT = %g is too small; Reset to -1.0.\n",model->BSIM4kvsat); - model->BSIM4kvsat = -1.0; + kvsat = model->BSIM4kvsat; + if (model->BSIM4kvsat < -1.0 ) + { fprintf(stderr, "Warning: KVSAT = %g is too small; -1.0 is used.\n",model->BSIM4kvsat); + kvsat = -1.0; } if (model->BSIM4kvsat > 1.0) - { fprintf(stderr, "Warning: KVSAT = %g is too big; Reset to 1.0.\n",model->BSIM4kvsat); - model->BSIM4kvsat = 1.0; + { fprintf(stderr, "Warning: KVSAT = %g is too big; 1.0 is used.\n",model->BSIM4kvsat); + kvsat = 1.0; } for(i = 0; i < here->BSIM4nf; i++){ @@ -1337,7 +1360,7 @@ int Size_Not_Found, i; T0 = (1.0 + rho)/(1.0 + pParam->BSIM4rho_ref); here->BSIM4u0temp = pParam->BSIM4u0temp * T0; - T1 = (1.0 + model->BSIM4kvsat * rho)/(1.0 + model->BSIM4kvsat * pParam->BSIM4rho_ref); + T1 = (1.0 + kvsat * rho)/(1.0 + kvsat * pParam->BSIM4rho_ref); here->BSIM4vsattemp = pParam->BSIM4vsattemp * T1; OD_offset = Inv_ODeff - pParam->BSIM4inv_od_ref; @@ -1348,59 +1371,134 @@ int Size_Not_Found, i; OD_offset; here->BSIM4vth0 = pParam->BSIM4vth0 + dvth0_lod; - if (!model->BSIM4vfbGiven && !model->BSIM4vth0Given) - here->BSIM4vfb = -1.0; - else - here->BSIM4vfb = pParam->BSIM4vfb + model->BSIM4type * dvth0_lod; - here->BSIM4vfbzb = pParam->BSIM4vfbzb + model->BSIM4type * dvth0_lod; - - T3 = model->BSIM4type * here->BSIM4vth0 - - here->BSIM4vfb - pParam->BSIM4phi; - T4 = T3 + T3; - T5 = 2.5 * T3; - here->BSIM4vtfbphi1 = (model->BSIM4type == NMOS) ? T4 : T5; - if (here->BSIM4vtfbphi1 < 0.0) - here->BSIM4vtfbphi1 = 0.0; - - here->BSIM4vtfbphi2 = 4.0 * T3; - if (here->BSIM4vtfbphi2 < 0.0) - here->BSIM4vtfbphi2 = 0.0; - - here->BSIM4k2 = pParam->BSIM4k2 + dk2_lod; - if (here->BSIM4k2 < 0.0) - { T0 = 0.5 * pParam->BSIM4k1 / here->BSIM4k2; - here->BSIM4vbsc = 0.9 * (pParam->BSIM4phi - T0 * T0); - if (here->BSIM4vbsc > -3.0) - here->BSIM4vbsc = -3.0; - else if (here->BSIM4vbsc < -30.0) - here->BSIM4vbsc = -30.0; - } - else - here->BSIM4vbsc = -30.0; - if (here->BSIM4vbsc > pParam->BSIM4vbm) - here->BSIM4vbsc = pParam->BSIM4vbm; - here->BSIM4k2ox = here->BSIM4k2 * model->BSIM4toxe - / model->BSIM4toxm; - here->BSIM4eta0 = pParam->BSIM4eta0 + deta0_lod; + here->BSIM4k2 = pParam->BSIM4k2 + dk2_lod; } else { here->BSIM4u0temp = pParam->BSIM4u0temp; here->BSIM4vth0 = pParam->BSIM4vth0; here->BSIM4vsattemp = pParam->BSIM4vsattemp; - here->BSIM4vfb = pParam->BSIM4vfb; - here->BSIM4vfbzb = pParam->BSIM4vfbzb; - here->BSIM4vtfbphi1 = pParam->BSIM4vtfbphi1; - here->BSIM4vtfbphi2 = pParam->BSIM4vtfbphi2; - here->BSIM4k2 = pParam->BSIM4k2; - here->BSIM4vbsc = pParam->BSIM4vbsc; - here->BSIM4k2ox = pParam->BSIM4k2ox; here->BSIM4eta0 = pParam->BSIM4eta0; + here->BSIM4k2 = pParam->BSIM4k2; } - + + /* Well Proximity Effect */ + if (model->BSIM4wpemod) + { if( (!here->BSIM4scaGiven) && (!here->BSIM4scbGiven) && (!here->BSIM4sccGiven) ) + { if((here->BSIM4scGiven) && (here->BSIM4sc > 0.0) ) + { T1 = here->BSIM4sc + Wdrn; + T2 = 1.0 / model->BSIM4scref; + here->BSIM4sca = model->BSIM4scref * model->BSIM4scref + / (here->BSIM4sc * T1); + here->BSIM4scb = ( (0.1 * here->BSIM4sc + 0.01 * model->BSIM4scref) + * exp(-10.0 * here->BSIM4sc * T2) + - (0.1 * T1 + 0.01 * model->BSIM4scref) + * exp(-10.0 * T1 * T2) ) / Wdrn; + here->BSIM4scc = ( (0.05 * here->BSIM4sc + 0.0025 * model->BSIM4scref) + * exp(-20.0 * here->BSIM4sc * T2) + - (0.05 * T1 + 0.0025 * model->BSIM4scref) + * exp(-20.0 * T1 * T2) ) / Wdrn; + } else { + fprintf(stderr, "Warning: No WPE as none of SCA, SCB, SCC, SC is given and/or SC not positive.\n"); + } + } + sceff = here->BSIM4sca + model->BSIM4web * here->BSIM4scb + + model->BSIM4wec * here->BSIM4scc; + here->BSIM4vth0 += pParam->BSIM4kvth0we * sceff; + here->BSIM4k2 += pParam->BSIM4k2we * sceff; + T3 = 1.0 + pParam->BSIM4ku0we * sceff; + if (T3 <= 0.0) + { T3 = 0.0; + fprintf(stderr, "Warning: ku0we = %g is negatively too high. Negative mobility! \n", pParam->BSIM4ku0we); + } + here->BSIM4u0temp *= T3; + } + + /* adding delvto */ + here->BSIM4vth0 += here->BSIM4delvto; + here->BSIM4vfb = pParam->BSIM4vfb + model->BSIM4type * here->BSIM4delvto; + + /* Instance variables calculation */ + T3 = model->BSIM4type * here->BSIM4vth0 + - here->BSIM4vfb - pParam->BSIM4phi; + T4 = T3 + T3; + T5 = 2.5 * T3; + here->BSIM4vtfbphi1 = (model->BSIM4type == NMOS) ? T4 : T5; + if (here->BSIM4vtfbphi1 < 0.0) + here->BSIM4vtfbphi1 = 0.0; + + here->BSIM4vtfbphi2 = 4.0 * T3; + if (here->BSIM4vtfbphi2 < 0.0) + here->BSIM4vtfbphi2 = 0.0; + + if (here->BSIM4k2 < 0.0) + { T0 = 0.5 * pParam->BSIM4k1 / here->BSIM4k2; + here->BSIM4vbsc = 0.9 * (pParam->BSIM4phi - T0 * T0); + if (here->BSIM4vbsc > -3.0) + here->BSIM4vbsc = -3.0; + else if (here->BSIM4vbsc < -30.0) + here->BSIM4vbsc = -30.0; + } + else + here->BSIM4vbsc = -30.0; + if (here->BSIM4vbsc > pParam->BSIM4vbm) + here->BSIM4vbsc = pParam->BSIM4vbm; + here->BSIM4k2ox = here->BSIM4k2 * model->BSIM4toxe + / model->BSIM4toxm; + + here->BSIM4vfbzb = pParam->BSIM4vfbzbfactor + + model->BSIM4type * here->BSIM4vth0 ; + here->BSIM4cgso = pParam->BSIM4cgso; here->BSIM4cgdo = pParam->BSIM4cgdo; - if (here->BSIM4rbodyMod) + lnl = log(pParam->BSIM4leff * 1.0e6); + lnw = log(pParam->BSIM4weff * 1.0e6); + lnnf = log(here->BSIM4nf); + + bodymode = 5; + if( ( !model->BSIM4rbps0Given) || + ( !model->BSIM4rbpd0Given) ) + bodymode = 1; + else + if( (!model->BSIM4rbsbx0Given && !model->BSIM4rbsby0Given) || + (!model->BSIM4rbdbx0Given && !model->BSIM4rbdby0Given) ) + bodymode = 3; + + if(here->BSIM4rbodyMod == 2) + { + if (bodymode == 5) + { + rbsbx = exp( log(model->BSIM4rbsbx0) + model->BSIM4rbsdbxl * lnl + + model->BSIM4rbsdbxw * lnw + model->BSIM4rbsdbxnf * lnnf ); + rbsby = exp( log(model->BSIM4rbsby0) + model->BSIM4rbsdbyl * lnl + + model->BSIM4rbsdbyw * lnw + model->BSIM4rbsdbynf * lnnf ); + here->BSIM4rbsb = rbsbx * rbsby / (rbsbx + rbsby); + + + rbdbx = exp( log(model->BSIM4rbdbx0) + model->BSIM4rbsdbxl * lnl + + model->BSIM4rbsdbxw * lnw + model->BSIM4rbsdbxnf * lnnf ); + rbdby = exp( log(model->BSIM4rbdby0) + model->BSIM4rbsdbyl * lnl + + model->BSIM4rbsdbyw * lnw + model->BSIM4rbsdbynf * lnnf ); + here->BSIM4rbdb = rbdbx * rbdby / (rbdbx + rbdby); + } + + if ((bodymode == 3)|| (bodymode == 5)) + { + here->BSIM4rbps = exp( log(model->BSIM4rbps0) + model->BSIM4rbpsl * lnl + + model->BSIM4rbpsw * lnw + model->BSIM4rbpsnf * lnnf ); + here->BSIM4rbpd = exp( log(model->BSIM4rbpd0) + model->BSIM4rbpdl * lnl + + model->BSIM4rbpdw * lnw + model->BSIM4rbpdnf * lnnf ); + } + + rbpbx = exp( log(model->BSIM4rbpbx0) + model->BSIM4rbpbxl * lnl + + model->BSIM4rbpbxw * lnw + model->BSIM4rbpbxnf * lnnf ); + rbpby = exp( log(model->BSIM4rbpby0) + model->BSIM4rbpbyl * lnl + + model->BSIM4rbpbyw * lnw + model->BSIM4rbpbynf * lnnf ); + here->BSIM4rbpb = rbpbx*rbpby/(rbpbx + rbpby); + } + + + if ((here->BSIM4rbodyMod == 1 ) || ((here->BSIM4rbodyMod == 2 ) && (bodymode == 5)) ) { if (here->BSIM4rbdb < 1.0e-3) here->BSIM4grbdb = 1.0e3; /* in mho */ else @@ -1421,6 +1519,34 @@ int Size_Not_Found, i; here->BSIM4grbpd = 1.0e3; else here->BSIM4grbpd = model->BSIM4gbmin + 1.0 / here->BSIM4rbpd; + + } + + if((here->BSIM4rbodyMod == 2) && (bodymode == 3)) + { + here->BSIM4grbdb = here->BSIM4grbsb = model->BSIM4gbmin; + if (here->BSIM4rbpb < 1.0e-3) + here->BSIM4grbpb = 1.0e3; + else + here->BSIM4grbpb = model->BSIM4gbmin + 1.0 / here->BSIM4rbpb; + if (here->BSIM4rbps < 1.0e-3) + here->BSIM4grbps = 1.0e3; + else + here->BSIM4grbps = model->BSIM4gbmin + 1.0 / here->BSIM4rbps; + if (here->BSIM4rbpd < 1.0e-3) + here->BSIM4grbpd = 1.0e3; + else + here->BSIM4grbpd = model->BSIM4gbmin + 1.0 / here->BSIM4rbpd; + } + + if((here->BSIM4rbodyMod == 2) && (bodymode == 1)) + { + here->BSIM4grbdb = here->BSIM4grbsb = model->BSIM4gbmin; + here->BSIM4grbps = here->BSIM4grbpd = 1.0e3; + if (here->BSIM4rbpb < 1.0e-3) + here->BSIM4grbpb = 1.0e3; + else + here->BSIM4grbpb = model->BSIM4gbmin + 1.0 / here->BSIM4rbpb; } @@ -1428,9 +1554,9 @@ int Size_Not_Found, i; * Process geomertry dependent parasitics */ - here->BSIM4grgeltd = model->BSIM4rshg * (model->BSIM4xgw - + pParam->BSIM4weffCJ / 3.0 / model->BSIM4ngcon) / - (model->BSIM4ngcon * here->BSIM4nf * + here->BSIM4grgeltd = model->BSIM4rshg * (here->BSIM4xgw + + pParam->BSIM4weffCJ / 3.0 / here->BSIM4ngcon) / + (here->BSIM4ngcon * here->BSIM4nf * (Lnew - model->BSIM4xgl)); if (here->BSIM4grgeltd > 0.0) here->BSIM4grgeltd = 1.0 / here->BSIM4grgeltd; @@ -1698,7 +1824,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.4.0 parameter checking for %s in model %s", namarray); + (*(SPfrontEnd->IFerror)) (ERR_FATAL, "Fatal error(s) detected during BSIM4.5.0 parameter checking for %s in model %s", namarray); return(E_BADPARM); } } /* End instance */ diff --git a/src/spicelib/devices/bsim4/b4trunc.c b/src/spicelib/devices/bsim4/b4trunc.c index eb94bdade..2dfea6ddf 100644 --- a/src/spicelib/devices/bsim4/b4trunc.c +++ b/src/spicelib/devices/bsim4/b4trunc.c @@ -1,10 +1,10 @@ -/**** BSIM4.4.0 Released by Xuemei (Jane) Xi 03/04/2004 ****/ +/**** BSIM4.5.0 Released by Xuemei (Jane) Xi 07/29/2005 ****/ /********** * Copyright 2004 Regents of the University of California. All rights reserved. - * File: b4trunc.c of BSIM4.4.0. + * File: b4trunc.c of BSIM4.5.0. * Author: 2000 Weidong Liu - * Authors: 2001- Xuemei Xi, Jin He, Kanyu Cao, Mohan Dunga, Mansun Chan, Ali Niknejad, Chenming Hu. + * Authors: 2001- Xuemei Xi, Mohan Dunga, Ali Niknejad, Chenming Hu. * Project Director: Prof. Chenming Hu. **********/ @@ -14,6 +14,7 @@ #include "sperror.h" #include "suffix.h" + int BSIM4trunc(inModel,ckt,timeStep) GENmodel *inModel; diff --git a/src/spicelib/devices/bsim4/bsim4def.h b/src/spicelib/devices/bsim4/bsim4def.h index 401b3d723..93e9e5119 100644 --- a/src/spicelib/devices/bsim4/bsim4def.h +++ b/src/spicelib/devices/bsim4/bsim4def.h @@ -1,9 +1,11 @@ /********** -Copyright 2004 Regents of the University of California. All rights reserved. +Copyright 2005 Regents of the University of California. All rights reserved. Author: 2000 Weidong Liu. Modified by Xuemei Xi, 11/15/2002. Modified by Xuemei Xi, 05/09/2003. Modified by Xuemei Xi, 03/04/2004. +Modified by Xuemei Xi, Mohan Dunga, 09/24/2004. +Modified by Xuemei Xi, 07/29/2005. File: bsim4def.h **********/ @@ -14,8 +16,8 @@ File: bsim4def.h #include "gendefs.h" #include "cktdefs.h" #include "complex.h" -#include "noisedef.h" - +#include "noisedef.h" + typedef struct sBSIM4instance { struct sBSIM4model *BSIM4modPtr; @@ -85,12 +87,20 @@ typedef struct sBSIM4instance double BSIM4sa; double BSIM4sb; double BSIM4sd; + double BSIM4sca; + double BSIM4scb; + double BSIM4scc; + double BSIM4sc; double BSIM4rbdb; double BSIM4rbsb; double BSIM4rbpb; double BSIM4rbps; double BSIM4rbpd; + + double BSIM4delvto; + double BSIM4xgw; + double BSIM4ngcon; /* added here to account stress effect instance dependence */ double BSIM4u0temp; @@ -108,8 +118,8 @@ typedef struct sBSIM4instance double BSIM4icVDS; double BSIM4icVGS; double BSIM4icVBS; - double BSIM4nf; double BSIM4m; + double BSIM4nf; int BSIM4off; int BSIM4mode; int BSIM4trnqsMod; @@ -229,6 +239,7 @@ typedef struct sBSIM4instance double BSIM4qbulk; double BSIM4qdrn; double BSIM4qsrc; + double BSIM4qdef; double BSIM4qchqs; double BSIM4taunet; @@ -260,11 +271,18 @@ typedef struct sBSIM4instance unsigned BSIM4saGiven :1; unsigned BSIM4sbGiven :1; unsigned BSIM4sdGiven :1; + unsigned BSIM4scaGiven :1; + unsigned BSIM4scbGiven :1; + unsigned BSIM4sccGiven :1; + unsigned BSIM4scGiven :1; unsigned BSIM4rbdbGiven :1; unsigned BSIM4rbsbGiven :1; unsigned BSIM4rbpbGiven :1; unsigned BSIM4rbpdGiven :1; unsigned BSIM4rbpsGiven :1; + unsigned BSIM4delvtoGiven :1; + unsigned BSIM4xgwGiven :1; + unsigned BSIM4ngconGiven :1; unsigned BSIM4icVDSGiven :1; unsigned BSIM4icVGSGiven :1; unsigned BSIM4icVBSGiven :1; @@ -452,7 +470,6 @@ struct bsim4SizeDependParam double BSIM4vbx; double BSIM4vbi; double BSIM4vbm; - double BSIM4vbsc; double BSIM4xt; double BSIM4phi; double BSIM4litl; @@ -483,10 +500,15 @@ struct bsim4SizeDependParam double BSIM4ub1; double BSIM4uc; double BSIM4uc1; + double BSIM4ud; + double BSIM4ud1; + double BSIM4up; + double BSIM4lp; double BSIM4u0; double BSIM4eu; double BSIM4ute; double BSIM4voff; + double BSIM4tvoff; double BSIM4minv; double BSIM4vfb; double BSIM4delta; @@ -550,6 +572,7 @@ struct bsim4SizeDependParam double BSIM4lc; /* back scattering parameter */ double BSIM4tfactor; /* ballistic transportation factor */ double BSIM4vfbsdoff; /* S/D flatband offset voltage */ + double BSIM4tvfbsdoff; /* added for stress effect */ double BSIM4ku0; @@ -557,6 +580,10 @@ struct bsim4SizeDependParam double BSIM4ku0temp; double BSIM4rho_ref; double BSIM4inv_od_ref; +/* added for well proximity effect */ + double BSIM4kvth0we; + double BSIM4k2we; + double BSIM4ku0we; /* CV model */ double BSIM4cgsl; @@ -611,9 +638,6 @@ struct bsim4SizeDependParam double BSIM4cof3; double BSIM4cof4; double BSIM4cdep0; - double BSIM4vfbzb; - double BSIM4vtfbphi1; - double BSIM4vtfbphi2; double BSIM4ToxRatio; double BSIM4Aechvb; double BSIM4Bechvb; @@ -623,6 +647,8 @@ struct bsim4SizeDependParam double BSIM4ldeb; double BSIM4k1ox; double BSIM4k2ox; + double BSIM4vfbzbfactor; + struct bsim4SizeDependParam *pNext; }; @@ -710,9 +736,14 @@ typedef struct sBSIM4model double BSIM4ub1; double BSIM4uc; double BSIM4uc1; + double BSIM4ud; + double BSIM4ud1; + double BSIM4up; + double BSIM4lp; double BSIM4u0; double BSIM4ute; double BSIM4voff; + double BSIM4tvoff; double BSIM4minv; double BSIM4voffl; double BSIM4delta; @@ -812,6 +843,7 @@ typedef struct sBSIM4model double BSIM4xn; double BSIM4vfbsdoff; /* S/D flatband offset voltage */ double BSIM4lintnoi; /* lint offset for noise calculation */ + double BSIM4tvfbsdoff; double BSIM4vfb; double BSIM4gbmin; @@ -820,6 +852,38 @@ typedef struct sBSIM4model double BSIM4rbpb; double BSIM4rbps; double BSIM4rbpd; + + double BSIM4rbps0; + double BSIM4rbpsl; + double BSIM4rbpsw; + double BSIM4rbpsnf; + + double BSIM4rbpd0; + double BSIM4rbpdl; + double BSIM4rbpdw; + double BSIM4rbpdnf; + + double BSIM4rbpbx0; + double BSIM4rbpbxl; + double BSIM4rbpbxw; + double BSIM4rbpbxnf; + double BSIM4rbpby0; + double BSIM4rbpbyl; + double BSIM4rbpbyw; + double BSIM4rbpbynf; + + double BSIM4rbsbx0; + double BSIM4rbsby0; + double BSIM4rbdbx0; + double BSIM4rbdby0; + + double BSIM4rbsdbxl; + double BSIM4rbsdbxw; + double BSIM4rbsdbxnf; + double BSIM4rbsdbyl; + double BSIM4rbsdbyw; + double BSIM4rbsdbynf; + double BSIM4tnoia; double BSIM4tnoib; double BSIM4rnoia; @@ -911,10 +975,15 @@ typedef struct sBSIM4model double BSIM4lub1; double BSIM4luc; double BSIM4luc1; + double BSIM4lud; + double BSIM4lud1; + double BSIM4lup; + double BSIM4llp; double BSIM4lu0; double BSIM4leu; double BSIM4lute; double BSIM4lvoff; + double BSIM4ltvoff; double BSIM4lminv; double BSIM4ldelta; double BSIM4lrdsw; @@ -973,6 +1042,7 @@ typedef struct sBSIM4model double BSIM4lvtl; double BSIM4lxn; double BSIM4lvfbsdoff; + double BSIM4ltvfbsdoff; /* CV model */ double BSIM4lcgsl; @@ -1039,10 +1109,15 @@ typedef struct sBSIM4model double BSIM4wub1; double BSIM4wuc; double BSIM4wuc1; + double BSIM4wud; + double BSIM4wud1; + double BSIM4wup; + double BSIM4wlp; double BSIM4wu0; double BSIM4weu; double BSIM4wute; double BSIM4wvoff; + double BSIM4wtvoff; double BSIM4wminv; double BSIM4wdelta; double BSIM4wrdsw; @@ -1101,6 +1176,7 @@ typedef struct sBSIM4model double BSIM4wvtl; double BSIM4wxn; double BSIM4wvfbsdoff; + double BSIM4wtvfbsdoff; /* CV model */ double BSIM4wcgsl; @@ -1167,10 +1243,15 @@ typedef struct sBSIM4model double BSIM4pub1; double BSIM4puc; double BSIM4puc1; + double BSIM4pud; + double BSIM4pud1; + double BSIM4pup; + double BSIM4plp; double BSIM4pu0; double BSIM4peu; double BSIM4pute; double BSIM4pvoff; + double BSIM4ptvoff; double BSIM4pminv; double BSIM4pdelta; double BSIM4prdsw; @@ -1229,6 +1310,7 @@ typedef struct sBSIM4model double BSIM4pvtl; double BSIM4pxn; double BSIM4pvfbsdoff; + double BSIM4ptvfbsdoff; /* CV model */ double BSIM4pcgsl; @@ -1332,7 +1414,22 @@ typedef struct sBSIM4model double BSIM4steta0; double BSIM4lodeta0; - + double BSIM4web; + double BSIM4wec; + double BSIM4kvth0we; + double BSIM4k2we; + double BSIM4ku0we; + double BSIM4scref; + double BSIM4wpemod; + double BSIM4lkvth0we; + double BSIM4lk2we; + double BSIM4lku0we; + double BSIM4wkvth0we; + double BSIM4wk2we; + double BSIM4wku0we; + double BSIM4pkvth0we; + double BSIM4pk2we; + double BSIM4pku0we; /* Pre-calculated constants * move to size-dependent param */ @@ -1452,9 +1549,14 @@ typedef struct sBSIM4model unsigned BSIM4ub1Given :1; unsigned BSIM4ucGiven :1; unsigned BSIM4uc1Given :1; + unsigned BSIM4udGiven :1; + unsigned BSIM4ud1Given :1; + unsigned BSIM4upGiven :1; + unsigned BSIM4lpGiven :1; unsigned BSIM4u0Given :1; unsigned BSIM4uteGiven :1; unsigned BSIM4voffGiven :1; + unsigned BSIM4tvoffGiven :1; unsigned BSIM4vofflGiven :1; unsigned BSIM4minvGiven :1; unsigned BSIM4rdswGiven :1; @@ -1552,6 +1654,38 @@ typedef struct sBSIM4model unsigned BSIM4rbpsGiven :1; unsigned BSIM4rbpdGiven :1; unsigned BSIM4rbpbGiven :1; + + unsigned BSIM4rbps0Given :1; + unsigned BSIM4rbpslGiven :1; + unsigned BSIM4rbpswGiven :1; + unsigned BSIM4rbpsnfGiven :1; + + unsigned BSIM4rbpd0Given :1; + unsigned BSIM4rbpdlGiven :1; + unsigned BSIM4rbpdwGiven :1; + unsigned BSIM4rbpdnfGiven :1; + + unsigned BSIM4rbpbx0Given :1; + unsigned BSIM4rbpbxlGiven :1; + unsigned BSIM4rbpbxwGiven :1; + unsigned BSIM4rbpbxnfGiven :1; + unsigned BSIM4rbpby0Given :1; + unsigned BSIM4rbpbylGiven :1; + unsigned BSIM4rbpbywGiven :1; + unsigned BSIM4rbpbynfGiven :1; + + unsigned BSIM4rbsbx0Given :1; + unsigned BSIM4rbsby0Given :1; + unsigned BSIM4rbdbx0Given :1; + unsigned BSIM4rbdby0Given :1; + + unsigned BSIM4rbsdbxlGiven :1; + unsigned BSIM4rbsdbxwGiven :1; + unsigned BSIM4rbsdbxnfGiven :1; + unsigned BSIM4rbsdbylGiven :1; + unsigned BSIM4rbsdbywGiven :1; + unsigned BSIM4rbsdbynfGiven :1; + unsigned BSIM4xrcrg1Given :1; unsigned BSIM4xrcrg2Given :1; unsigned BSIM4tnoiaGiven :1; @@ -1566,6 +1700,7 @@ typedef struct sBSIM4model unsigned BSIM4xnGiven :1; unsigned BSIM4vfbsdoffGiven :1; unsigned BSIM4lintnoiGiven :1; + unsigned BSIM4tvfbsdoffGiven :1; /* CV model and parasitics */ unsigned BSIM4cgslGiven :1; @@ -1653,10 +1788,15 @@ typedef struct sBSIM4model unsigned BSIM4lub1Given :1; unsigned BSIM4lucGiven :1; unsigned BSIM4luc1Given :1; + unsigned BSIM4ludGiven :1; + unsigned BSIM4lud1Given :1; + unsigned BSIM4lupGiven :1; + unsigned BSIM4llpGiven :1; unsigned BSIM4lu0Given :1; unsigned BSIM4leuGiven :1; unsigned BSIM4luteGiven :1; unsigned BSIM4lvoffGiven :1; + unsigned BSIM4ltvoffGiven :1; unsigned BSIM4lminvGiven :1; unsigned BSIM4lrdswGiven :1; unsigned BSIM4lrswGiven :1; @@ -1715,6 +1855,7 @@ typedef struct sBSIM4model unsigned BSIM4lvtlGiven :1; unsigned BSIM4lxnGiven :1; unsigned BSIM4lvfbsdoffGiven :1; + unsigned BSIM4ltvfbsdoffGiven :1; /* CV model */ unsigned BSIM4lcgslGiven :1; @@ -1781,10 +1922,15 @@ typedef struct sBSIM4model unsigned BSIM4wub1Given :1; unsigned BSIM4wucGiven :1; unsigned BSIM4wuc1Given :1; + unsigned BSIM4wudGiven :1; + unsigned BSIM4wud1Given :1; + unsigned BSIM4wupGiven :1; + unsigned BSIM4wlpGiven :1; unsigned BSIM4wu0Given :1; unsigned BSIM4weuGiven :1; unsigned BSIM4wuteGiven :1; unsigned BSIM4wvoffGiven :1; + unsigned BSIM4wtvoffGiven :1; unsigned BSIM4wminvGiven :1; unsigned BSIM4wrdswGiven :1; unsigned BSIM4wrswGiven :1; @@ -1843,6 +1989,7 @@ typedef struct sBSIM4model unsigned BSIM4wvtlGiven :1; unsigned BSIM4wxnGiven :1; unsigned BSIM4wvfbsdoffGiven :1; + unsigned BSIM4wtvfbsdoffGiven :1; /* CV model */ unsigned BSIM4wcgslGiven :1; @@ -1909,10 +2056,15 @@ typedef struct sBSIM4model unsigned BSIM4pub1Given :1; unsigned BSIM4pucGiven :1; unsigned BSIM4puc1Given :1; + unsigned BSIM4pudGiven :1; + unsigned BSIM4pud1Given :1; + unsigned BSIM4pupGiven :1; + unsigned BSIM4plpGiven :1; unsigned BSIM4pu0Given :1; unsigned BSIM4peuGiven :1; unsigned BSIM4puteGiven :1; unsigned BSIM4pvoffGiven :1; + unsigned BSIM4ptvoffGiven :1; unsigned BSIM4pminvGiven :1; unsigned BSIM4prdswGiven :1; unsigned BSIM4prswGiven :1; @@ -1971,6 +2123,7 @@ typedef struct sBSIM4model unsigned BSIM4pvtlGiven :1; unsigned BSIM4pxnGiven :1; unsigned BSIM4pvfbsdoffGiven :1; + unsigned BSIM4ptvfbsdoffGiven :1; /* CV model */ unsigned BSIM4pcgslGiven :1; @@ -2080,6 +2233,23 @@ typedef struct sBSIM4model unsigned BSIM4steta0Given :1; unsigned BSIM4lodeta0Given :1; + unsigned BSIM4webGiven :1; + unsigned BSIM4wecGiven :1; + unsigned BSIM4kvth0weGiven :1; + unsigned BSIM4k2weGiven :1; + unsigned BSIM4ku0weGiven :1; + unsigned BSIM4screfGiven :1; + unsigned BSIM4wpemodGiven :1; + unsigned BSIM4lkvth0weGiven :1; + unsigned BSIM4lk2weGiven :1; + unsigned BSIM4lku0weGiven :1; + unsigned BSIM4wkvth0weGiven :1; + unsigned BSIM4wk2weGiven :1; + unsigned BSIM4wku0weGiven :1; + unsigned BSIM4pkvth0weGiven :1; + unsigned BSIM4pk2weGiven :1; + unsigned BSIM4pku0weGiven :1; + } BSIM4model; @@ -2120,7 +2290,14 @@ typedef struct sBSIM4model #define BSIM4_SA 28 #define BSIM4_SB 29 #define BSIM4_SD 30 -#define BSIM4_M 31 +#define BSIM4_DELVTO 31 +#define BSIM4_XGW 32 +#define BSIM4_NGCON 33 +#define BSIM4_SCA 34 +#define BSIM4_SCB 35 +#define BSIM4_SCC 36 +#define BSIM4_SC 37 +#define BSIM4_M 38 /* Global parameters */ #define BSIM4_MOD_TEMPMOD 89 @@ -2316,6 +2493,12 @@ typedef struct sBSIM4model #define BSIM4_MOD_RNOIB 287 #define BSIM4_MOD_VFBSDOFF 288 #define BSIM4_MOD_LINTNOI 289 +#define BSIM4_MOD_UD 290 +#define BSIM4_MOD_UD1 291 +#define BSIM4_MOD_UP 292 +#define BSIM4_MOD_LP 293 +#define BSIM4_MOD_TVOFF 294 +#define BSIM4_MOD_TVFBSDOFF 295 /* Length dependence */ #define BSIM4_MOD_LCDSC 301 @@ -2447,6 +2630,10 @@ typedef struct sBSIM4model #define BSIM4_MOD_LVTL 436 #define BSIM4_MOD_LXN 437 #define BSIM4_MOD_LVFBSDOFF 438 +#define BSIM4_MOD_LUD 439 +#define BSIM4_MOD_LUD1 440 +#define BSIM4_MOD_LUP 441 +#define BSIM4_MOD_LLP 442 /* Width dependence */ #define BSIM4_MOD_WCDSC 481 @@ -2577,6 +2764,10 @@ typedef struct sBSIM4model #define BSIM4_MOD_WVTL 616 #define BSIM4_MOD_WXN 617 #define BSIM4_MOD_WVFBSDOFF 618 +#define BSIM4_MOD_WUD 619 +#define BSIM4_MOD_WUD1 620 +#define BSIM4_MOD_WUP 621 +#define BSIM4_MOD_WLP 622 /* Cross-term dependence */ #define BSIM4_MOD_PCDSC 661 @@ -2733,6 +2924,14 @@ typedef struct sBSIM4model #define BSIM4_MOD_STETA0 814 #define BSIM4_MOD_LODETA0 815 +#define BSIM4_MOD_WEB 816 +#define BSIM4_MOD_WEC 817 +#define BSIM4_MOD_KVTH0WE 818 +#define BSIM4_MOD_K2WE 819 +#define BSIM4_MOD_KU0WE 820 +#define BSIM4_MOD_SCREF 821 +#define BSIM4_MOD_WPEMOD 822 + #define BSIM4_MOD_PLAMBDA 825 #define BSIM4_MOD_PVTL 826 #define BSIM4_MOD_PXN 827 @@ -2834,6 +3033,10 @@ typedef struct sBSIM4model #define BSIM4_MOD_VTSSWD 921 #define BSIM4_MOD_VTSSWGS 922 #define BSIM4_MOD_VTSSWGD 923 +#define BSIM4_MOD_PUD 924 +#define BSIM4_MOD_PUD1 925 +#define BSIM4_MOD_PUP 926 +#define BSIM4_MOD_PLP 927 /* device questions */ #define BSIM4_DNODE 945 @@ -2902,11 +3105,60 @@ typedef struct sBSIM4model #define BSIM4_IGB 1008 #define BSIM4_IGCS 1009 #define BSIM4_IGCD 1010 +#define BSIM4_QDEF 1011 +#define BSIM4_DELVT0 1012 +#define BSIM4_GCRG 1013 +#define BSIM4_GTAU 1014 + +#define BSIM4_MOD_LTVOFF 1051 +#define BSIM4_MOD_LTVFBSDOFF 1052 +#define BSIM4_MOD_WTVOFF 1053 +#define BSIM4_MOD_WTVFBSDOFF 1054 +#define BSIM4_MOD_PTVOFF 1055 +#define BSIM4_MOD_PTVFBSDOFF 1056 + +#define BSIM4_MOD_LKVTH0WE 1061 +#define BSIM4_MOD_LK2WE 1062 +#define BSIM4_MOD_LKU0WE 1063 +#define BSIM4_MOD_WKVTH0WE 1064 +#define BSIM4_MOD_WK2WE 1065 +#define BSIM4_MOD_WKU0WE 1066 +#define BSIM4_MOD_PKVTH0WE 1067 +#define BSIM4_MOD_PK2WE 1068 +#define BSIM4_MOD_PKU0WE 1069 + +#define BSIM4_MOD_RBPS0 1101 +#define BSIM4_MOD_RBPSL 1102 +#define BSIM4_MOD_RBPSW 1103 +#define BSIM4_MOD_RBPSNF 1104 +#define BSIM4_MOD_RBPD0 1105 +#define BSIM4_MOD_RBPDL 1106 +#define BSIM4_MOD_RBPDW 1107 +#define BSIM4_MOD_RBPDNF 1108 + +#define BSIM4_MOD_RBPBX0 1109 +#define BSIM4_MOD_RBPBXL 1110 +#define BSIM4_MOD_RBPBXW 1111 +#define BSIM4_MOD_RBPBXNF 1112 +#define BSIM4_MOD_RBPBY0 1113 +#define BSIM4_MOD_RBPBYL 1114 +#define BSIM4_MOD_RBPBYW 1115 +#define BSIM4_MOD_RBPBYNF 1116 + +#define BSIM4_MOD_RBSBX0 1117 +#define BSIM4_MOD_RBSBY0 1118 +#define BSIM4_MOD_RBDBX0 1119 +#define BSIM4_MOD_RBDBY0 1120 + +#define BSIM4_MOD_RBSDBXL 1121 +#define BSIM4_MOD_RBSDBXW 1122 +#define BSIM4_MOD_RBSDBXNF 1123 +#define BSIM4_MOD_RBSDBYL 1124 +#define BSIM4_MOD_RBSDBYW 1125 +#define BSIM4_MOD_RBSDBYNF 1126 -# #include "bsim4ext.h" - extern void BSIM4evaluate(double,double,double,BSIM4instance*,BSIM4model*, double*,double*,double*, double*, double*, double*, double*, double*, double*, double*, double*, double*, double*, double*, diff --git a/src/spicelib/devices/bsim4/bsim4ext.h b/src/spicelib/devices/bsim4/bsim4ext.h index db4370089..171406ae5 100644 --- a/src/spicelib/devices/bsim4/bsim4ext.h +++ b/src/spicelib/devices/bsim4/bsim4ext.h @@ -5,7 +5,6 @@ Author: 2001- Xuemei Xi File: bsim4ext.h **********/ - extern int BSIM4acLoad(GENmodel *,CKTcircuit*); extern int BSIM4ask(CKTcircuit *,GENinstance*,int,IFvalue*,IFvalue*); extern int BSIM4convTest(GENmodel *,CKTcircuit*); @@ -29,5 +28,3 @@ extern int BSIM4temp(GENmodel*,CKTcircuit*); extern int BSIM4trunc(GENmodel*,CKTcircuit*,double*); extern int BSIM4noise(int,int,GENmodel*,CKTcircuit*,Ndata*,double*); extern int BSIM4unsetup(GENmodel*,CKTcircuit*); - -