Updated BSIM4 model to BSIM4.5.0 (Hitoshi Tanaka and Dietmar Warning)

This commit is contained in:
pnenzi 2005-11-13 20:56:33 +00:00
parent d921759a2a
commit 3403580a05
23 changed files with 1893 additions and 492 deletions

View File

@ -1,3 +1,13 @@
2005-11-13 Paolo Nenzi <p.nenzi@ieee.org>
* 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 <p.nenzi@ieee.org>
* src/spicelib/devices/vbic/*: Dietmar Warning sent a patch to his last

View File

@ -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

View File

@ -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"),

View File

@ -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)

View File

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

View File

@ -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);
}

View File

@ -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

View File

@ -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.
**********/

View File

@ -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.
**********/

View File

@ -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.
**********/

View File

@ -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);
}

View File

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

View File

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

View File

@ -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;

View File

@ -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;

View File

@ -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

View File

@ -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;

View File

@ -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)

View File

@ -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;
}

View File

@ -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 */

View File

@ -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;

View File

@ -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*,

View File

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