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*);
-
-