Updated BSIM4 model to BSIM4.5.0 (Hitoshi Tanaka and Dietmar Warning)
This commit is contained in:
parent
d921759a2a
commit
3403580a05
10
ChangeLog
10
ChangeLog
|
|
@ -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
|
||||
|
|
|
|||
4
DEVICES
4
DEVICES
|
|
@ -637,7 +637,7 @@ BSIM3 - BSIM model level 3
|
|||
|
||||
BSIM4 - BSIM model level 4 (0.18 um)
|
||||
Initial Release.
|
||||
Ver: 4.4.0
|
||||
Ver: 4.5.0
|
||||
Class: M
|
||||
Level: 14
|
||||
Dir: devices/bsim4
|
||||
|
|
@ -649,7 +649,7 @@ BSIM4 - BSIM model level 4 (0.18 um)
|
|||
Web site:
|
||||
http://www-device.eecs.berkeley.edu/~bsim3/bsim4.html
|
||||
|
||||
Updated to 4.4.0 YET UNTESTED.
|
||||
Updated to 4.5.0 YET UNTESTED.
|
||||
|
||||
|
||||
HiSIM - Hiroshima-university STARC IGFET Model
|
||||
|
|
|
|||
|
|
@ -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"),
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
**********/
|
||||
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
**********/
|
||||
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
**********/
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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));
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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 */
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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*,
|
||||
|
|
|
|||
|
|
@ -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*);
|
||||
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue