diff --git a/src/spicelib/devices/Makefile.am b/src/spicelib/devices/Makefile.am index 8a1d77907..e36909416 100644 --- a/src/spicelib/devices/Makefile.am +++ b/src/spicelib/devices/Makefile.am @@ -8,10 +8,9 @@ SUBDIRS = \ bsim3 \ bsim3soi \ bsim4 \ - bsim4v2 \ - bsim4v3 \ bsim4v4 \ bsim4v5 \ + bsim4v6 \ bsim3v0 \ bsim3v1 \ bsim3v32 \ @@ -69,10 +68,9 @@ DIST_SUBDIRS = \ bsim3 \ bsim3soi \ bsim4 \ - bsim4v2 \ - bsim4v3 \ bsim4v4 \ bsim4v5 \ + bsim4v6 \ bsim3v0 \ bsim3v1 \ bsim3v32 \ diff --git a/src/spicelib/devices/bsim4/b4.c b/src/spicelib/devices/bsim4/b4.c index 6e88842e2..47b93ab90 100644 --- a/src/spicelib/devices/bsim4/b4.c +++ b/src/spicelib/devices/bsim4/b4.c @@ -1,8 +1,8 @@ -/**** BSIM4.6.2 Released by Wenwei Yang 07/31/2008 ****/ +/**** BSIM4.7.0 Released by Darsen Lu 04/08/2011 ****/ /********** * Copyright 2006 Regents of the University of California. All rights reserved. - * File: b4.c of BSIM4.6.2. + * File: b4.c of BSIM4.7.0. * Author: 2000 Weidong Liu * Authors: 2001- Xuemei Xi, Mohan Dunga, Ali Niknejad, Chenming Hu. * Authors: 2006- Mohan Dunga, Ali Niknejad, Chenming Hu @@ -18,6 +18,7 @@ * Modified by Mohan Dunga, 12/13/2006. * Modified by Mohan Dunga, Wenwei Yang, 05/18/2007. * Modified by Wenwei Yang, 07/31/2008. + * Modified by Tanvir Morshed, Darsen Lu 03/27/2011 **********/ #include "ngspice.h" @@ -126,9 +127,11 @@ IOP( "geomod", BSIM4_MOD_GEOMOD, IF_INTEGER, "Geometry dependent parasitics mode IOP( "fnoimod", BSIM4_MOD_FNOIMOD, IF_INTEGER, "Flicker noise model selector"), IOP( "tnoimod", BSIM4_MOD_TNOIMOD, IF_INTEGER, "Thermal noise model selector"), IOP( "mtrlmod", BSIM4_MOD_MTRLMOD, IF_INTEGER, "parameter for non-silicon substrate or metal gate selector"), +IOP( "mtrlcompatmod", BSIM4_MOD_MTRLCOMPATMOD, IF_INTEGER, "New Material Mod backward compatibility selector"), IOP( "igcmod", BSIM4_MOD_IGCMOD, IF_INTEGER, "Gate-to-channel Ig model selector"), IOP( "igbmod", BSIM4_MOD_IGBMOD, IF_INTEGER, "Gate-to-body Ig model selector"), IOP( "tempmod", BSIM4_MOD_TEMPMOD, IF_INTEGER, "Temperature model selector"), +IOP( "gidlmod", BSIM4_MOD_GIDLMOD, IF_INTEGER, "parameter for GIDL selector"), /* v4.7 New GIDL/GISL */ IOP( "paramchk", BSIM4_MOD_PARAMCHK, IF_INTEGER, "Model parameter checking selector"), IOP( "binunit", BSIM4_MOD_BINUNIT, IF_INTEGER, "Bin unit selector"), IOP( "version", BSIM4_MOD_VERSION, IF_STRING, "parameter for model version"), @@ -187,6 +190,10 @@ IOP( "k3b", BSIM4_MOD_K3B, IF_REAL, "Body effect coefficient of k3"), IOP( "w0", BSIM4_MOD_W0, IF_REAL, "Narrow width effect parameter"), IOP( "dvtp0", BSIM4_MOD_DVTP0, IF_REAL, "First parameter for Vth shift due to pocket"), IOP( "dvtp1", BSIM4_MOD_DVTP1, IF_REAL, "Second parameter for Vth shift due to pocket"), +IOP( "dvtp2", BSIM4_MOD_DVTP2, IF_REAL, "3rd parameter for Vth shift due to pocket"), +IOP( "dvtp3", BSIM4_MOD_DVTP3, IF_REAL, "4th parameter for Vth shift due to pocket"), +IOP( "dvtp4", BSIM4_MOD_DVTP4, IF_REAL, "5th parameter for Vth shift due to pocket"), +IOP( "dvtp5", BSIM4_MOD_DVTP5, IF_REAL, "6th parameter for Vth shift due to pocket"), IOP( "lpe0", BSIM4_MOD_LPE0, IF_REAL, "Equivalent length of pocket region at zero bias"), IOP( "lpeb", BSIM4_MOD_LPEB, IF_REAL, "Equivalent length of pocket region accounting for body bias"), IOP( "dvt0", BSIM4_MOD_DVT0, IF_REAL, "Short channel effect coeff. 0"), @@ -310,6 +317,9 @@ 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( "tnfactor", BSIM4_MOD_TNFACTOR, IF_REAL, "Temperature parameter for nfactor"), /* v4.7 Tanvir*/ +IOP( "teta0", BSIM4_MOD_TETA0, IF_REAL, "Temperature parameter for eta0"), /* v4.7 Tanvir*/ +IOP( "tvoffcv", BSIM4_MOD_TVOFFCV, IF_REAL, "Temperature parameter for tvoffcv"), /* v4.7 Tanvir*/ IOP( "lintnoi", BSIM4_MOD_LINTNOI, IF_REAL, "lint offset for noise calculation"), IOP( "lint", BSIM4_MOD_LINT, IF_REAL, "Length reduction parameter"), @@ -365,10 +375,16 @@ 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"), +IOP( "rgidl", BSIM4_MOD_RGIDL, IF_REAL, "GIDL vg parameter"), /* v4.7 New GIDL/GISL */ +IOP( "kgidl", BSIM4_MOD_KGIDL, IF_REAL, "GIDL vb parameter"), /* v4.7 New GIDL/GISL */ +IOP( "fgidl", BSIM4_MOD_FGIDL, IF_REAL, "GIDL vb parameter"), /* v4.7 New GIDL/GISL */ IOP( "egidl", BSIM4_MOD_EGIDL, IF_REAL, "Fitting parameter for Bandbending"), IOP( "agisl", BSIM4_MOD_AGISL, IF_REAL, "Pre-exponential constant for GISL"), IOP( "bgisl", BSIM4_MOD_BGISL, IF_REAL, "Exponential constant for GISL"), IOP( "cgisl", BSIM4_MOD_CGISL, IF_REAL, "Parameter for body-bias dependence of GISL"), +IOP( "rgisl", BSIM4_MOD_RGISL, IF_REAL, "GISL vg parameter"), /* v4.7 New GIDL/GISL */ +IOP( "kgisl", BSIM4_MOD_KGISL, IF_REAL, "GISL vb parameter"), /* v4.7 New GIDL/GISL */ +IOP( "fgisl", BSIM4_MOD_FGISL, IF_REAL, "GISL vb parameter"), /* v4.7 New GIDL/GISL */ IOP( "egisl", BSIM4_MOD_EGISL, IF_REAL, "Fitting parameter for Bandbending"), IOP( "aigc", BSIM4_MOD_AIGC, IF_REAL, "Parameter for Igc"), IOP( "bigc", BSIM4_MOD_BIGC, IF_REAL, "Parameter for Igc"), @@ -508,6 +524,10 @@ IOP( "lk3b", BSIM4_MOD_LK3B, IF_REAL, "Length dependence of k3b"), IOP( "lw0", BSIM4_MOD_LW0, IF_REAL, "Length dependence of w0"), IOP( "ldvtp0", BSIM4_MOD_LDVTP0, IF_REAL, "Length dependence of dvtp0"), IOP( "ldvtp1", BSIM4_MOD_LDVTP1, IF_REAL, "Length dependence of dvtp1"), +IOP( "ldvtp2", BSIM4_MOD_LDVTP2, IF_REAL, "Length dependence of dvtp2"), +IOP( "ldvtp3", BSIM4_MOD_LDVTP3, IF_REAL, "Length dependence of dvtp3"), +IOP( "ldvtp4", BSIM4_MOD_LDVTP4, IF_REAL, "Length dependence of dvtp4"), +IOP( "ldvtp5", BSIM4_MOD_LDVTP5, IF_REAL, "Length dependence of dvtp5"), IOP( "llpe0", BSIM4_MOD_LLPE0, IF_REAL, "Length dependence of lpe0"), IOP( "llpeb", BSIM4_MOD_LLPEB, IF_REAL, "Length dependence of lpeb"), IOP( "ldvt0", BSIM4_MOD_LDVT0, IF_REAL, "Length dependence of dvt0"), @@ -576,10 +596,16 @@ 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"), +IOP( "lrgidl", BSIM4_MOD_LRGIDL, IF_REAL, "Length dependence of rgidl"), /* v4.7 New GIDL/GISL */ +IOP( "lkgidl", BSIM4_MOD_LKGIDL, IF_REAL, "Length dependence of kgidl"), /* v4.7 New GIDL/GISL */ +IOP( "lfgidl", BSIM4_MOD_LFGIDL, IF_REAL, "Length dependence of fgidl"), /* v4.7 New GIDL/GISL */ IOP( "legidl", BSIM4_MOD_LEGIDL, IF_REAL, "Length dependence of egidl"), IOP( "lagisl", BSIM4_MOD_LAGISL, IF_REAL, "Length dependence of agisl"), IOP( "lbgisl", BSIM4_MOD_LBGISL, IF_REAL, "Length dependence of bgisl"), IOP( "lcgisl", BSIM4_MOD_LCGISL, IF_REAL, "Length dependence of cgisl"), +IOP( "lrgisl", BSIM4_MOD_LRGISL, IF_REAL, "Length dependence of rgisl"), /* v4.7 New GIDL/GISL */ +IOP( "lkgisl", BSIM4_MOD_LKGISL, IF_REAL, "Length dependence of kgisl"), /* v4.7 New GIDL/GISL */ +IOP( "lfgisl", BSIM4_MOD_LFGISL, IF_REAL, "Length dependence of fgisl"), /* v4.7 New GIDL/GISL */ IOP( "legisl", BSIM4_MOD_LEGISL, IF_REAL, "Length dependence of egisl"), IOP( "laigc", BSIM4_MOD_LAIGC, IF_REAL, "Length dependence of aigc"), IOP( "lbigc", BSIM4_MOD_LBIGC, IF_REAL, "Length dependence of bigc"), @@ -623,6 +649,9 @@ IOP( "lucs", BSIM4_MOD_LUCS, IF_REAL, "Length dependence of lucs"), 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( "ltnfactor", BSIM4_MOD_LTNFACTOR, IF_REAL, "Length dependence of tnfactor"), /* v4.7 Tanvir*/ +IOP( "lteta0", BSIM4_MOD_LTETA0, IF_REAL, "Length dependence of teta0"), /* v4.7 Tanvir*/ +IOP( "ltvoffcv", BSIM4_MOD_LTVOFFCV, IF_REAL, "Length dependence of tvoffcv"), /* v4.7 Tanvir*/ IOP( "wcdsc", BSIM4_MOD_WCDSC, IF_REAL, "Width dependence of cdsc"), IOP( "wcdscb", BSIM4_MOD_WCDSCB, IF_REAL, "Width dependence of cdscb"), @@ -657,6 +686,10 @@ IOP( "wk3b", BSIM4_MOD_WK3B, IF_REAL, "Width dependence of k3b"), IOP( "ww0", BSIM4_MOD_WW0, IF_REAL, "Width dependence of w0"), IOP( "wdvtp0", BSIM4_MOD_WDVTP0, IF_REAL, "Width dependence of dvtp0"), IOP( "wdvtp1", BSIM4_MOD_WDVTP1, IF_REAL, "Width dependence of dvtp1"), +IOP( "wdvtp2", BSIM4_MOD_WDVTP2, IF_REAL, "Width dependence of dvtp2"), +IOP( "wdvtp3", BSIM4_MOD_WDVTP3, IF_REAL, "Width dependence of dvtp3"), +IOP( "wdvtp4", BSIM4_MOD_WDVTP4, IF_REAL, "Width dependence of dvtp4"), +IOP( "wdvtp5", BSIM4_MOD_WDVTP5, IF_REAL, "Width dependence of dvtp5"), IOP( "wlpe0", BSIM4_MOD_WLPE0, IF_REAL, "Width dependence of lpe0"), IOP( "wlpeb", BSIM4_MOD_WLPEB, IF_REAL, "Width dependence of lpeb"), IOP( "wdvt0", BSIM4_MOD_WDVT0, IF_REAL, "Width dependence of dvt0"), @@ -725,10 +758,16 @@ 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"), +IOP( "wrgidl", BSIM4_MOD_WRGIDL, IF_REAL, "Width dependence of rgidl"), /* v4.7 New GIDL/GISL */ +IOP( "wkgidl", BSIM4_MOD_WKGIDL, IF_REAL, "Width dependence of kgidl"), /* v4.7 New GIDL/GISL */ +IOP( "wfgidl", BSIM4_MOD_WFGIDL, IF_REAL, "Width dependence of fgidl"), /* v4.7 New GIDL/GISL */ IOP( "wegidl", BSIM4_MOD_WEGIDL, IF_REAL, "Width dependence of egidl"), IOP( "wagisl", BSIM4_MOD_WAGISL, IF_REAL, "Width dependence of agisl"), IOP( "wbgisl", BSIM4_MOD_WBGISL, IF_REAL, "Width dependence of bgisl"), IOP( "wcgisl", BSIM4_MOD_WCGISL, IF_REAL, "Width dependence of cgisl"), +IOP( "wrgisl", BSIM4_MOD_WRGISL, IF_REAL, "Width dependence of rgisl"), /* v4.7 New GIDL/GISL */ +IOP( "wkgisl", BSIM4_MOD_WKGISL, IF_REAL, "Width dependence of kgisl"), /* v4.7 New GIDL/GISL */ +IOP( "wfgisl", BSIM4_MOD_WFGISL, IF_REAL, "Width dependence of fgisl"), /* v4.7 New GIDL/GISL */ IOP( "wegisl", BSIM4_MOD_WEGISL, IF_REAL, "Width dependence of egisl"), IOP( "waigc", BSIM4_MOD_WAIGC, IF_REAL, "Width dependence of aigc"), IOP( "wbigc", BSIM4_MOD_WBIGC, IF_REAL, "Width dependence of bigc"), @@ -771,6 +810,9 @@ IOP( "wucs", BSIM4_MOD_WUCS, IF_REAL, "Width dependence of ucs"), 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( "wtnfactor", BSIM4_MOD_WTNFACTOR, IF_REAL, "Width dependence of tnfactor"), /* v4.7 Tanvir*/ +IOP( "wteta0", BSIM4_MOD_WTETA0, IF_REAL, "Width dependence of teta0"), /* v4.7 Tanvir*/ +IOP( "wtvoffcv", BSIM4_MOD_WTVOFFCV, IF_REAL, "Width dependence of tvoffcv"), /* v4.7 Tanvir*/ IOP( "pcdsc", BSIM4_MOD_PCDSC, IF_REAL, "Cross-term dependence of cdsc"), IOP( "pcdscb", BSIM4_MOD_PCDSCB, IF_REAL, "Cross-term dependence of cdscb"), @@ -805,6 +847,10 @@ IOP( "pk3b", BSIM4_MOD_PK3B, IF_REAL, "Cross-term dependence of k3b"), IOP( "pw0", BSIM4_MOD_PW0, IF_REAL, "Cross-term dependence of w0"), IOP( "pdvtp0", BSIM4_MOD_PDVTP0, IF_REAL, "Cross-term dependence of dvtp0"), IOP( "pdvtp1", BSIM4_MOD_PDVTP1, IF_REAL, "Cross-term dependence of dvtp1"), +IOP( "pdvtp2", BSIM4_MOD_PDVTP2, IF_REAL, "Cross-term dependence of dvtp2"), +IOP( "pdvtp3", BSIM4_MOD_PDVTP3, IF_REAL, "Cross-term dependence of dvtp3"), +IOP( "pdvtp4", BSIM4_MOD_PDVTP4, IF_REAL, "Cross-term dependence of dvtp4"), +IOP( "pdvtp5", BSIM4_MOD_PDVTP5, IF_REAL, "Cross-term dependence of dvtp5"), IOP( "plpe0", BSIM4_MOD_PLPE0, IF_REAL, "Cross-term dependence of lpe0"), IOP( "plpeb", BSIM4_MOD_PLPEB, IF_REAL, "Cross-term dependence of lpeb"), IOP( "pdvt0", BSIM4_MOD_PDVT0, IF_REAL, "Cross-term dependence of dvt0"), @@ -873,11 +919,17 @@ 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"), +IOP( "prgidl", BSIM4_MOD_PRGIDL, IF_REAL, "Cross-term dependence of rgidl"), /* v4.7 New GIDL/GISL */ +IOP( "pkgidl", BSIM4_MOD_PKGIDL, IF_REAL, "Cross-term dependence of kgidl"), /* v4.7 New GIDL/GISL */ +IOP( "pfgidl", BSIM4_MOD_PFGIDL, IF_REAL, "Cross-term dependence of fgidl"), /* v4.7 New GIDL/GISL */ IOP( "pegidl", BSIM4_MOD_PEGIDL, IF_REAL, "Cross-term dependence of egidl"), IOP( "pagisl", BSIM4_MOD_PAGISL, IF_REAL, "Cross-term dependence of agisl"), IOP( "pbgisl", BSIM4_MOD_PBGISL, IF_REAL, "Cross-term dependence of bgisl"), IOP( "pcgisl", BSIM4_MOD_PCGISL, IF_REAL, "Cross-term dependence of cgisl"), IOP( "pegisl", BSIM4_MOD_PEGISL, IF_REAL, "Cross-term dependence of egisl"), +IOP( "prgisl", BSIM4_MOD_PRGISL, IF_REAL, "Cross-term dependence of rgisl"), /* v4.7 New GIDL/GISL */ +IOP( "pkgisl", BSIM4_MOD_PKGISL, IF_REAL, "Cross-term dependence of kgisl"), /* v4.7 New GIDL/GISL */ +IOP( "pfgisl", BSIM4_MOD_PFGISL, IF_REAL, "Cross-term dependence of fgisl"), /* v4.7 New GIDL/GISL */ IOP( "paigc", BSIM4_MOD_PAIGC, IF_REAL, "Cross-term dependence of aigc"), IOP( "pbigc", BSIM4_MOD_PBIGC, IF_REAL, "Cross-term dependence of bigc"), IOP( "pcigc", BSIM4_MOD_PCIGC, IF_REAL, "Cross-term dependence of cigc"), @@ -919,6 +971,9 @@ IOP( "pucs", BSIM4_MOD_PUCS, IF_REAL, "Cross-term dependence of ucs"), 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"), +IOP( "ptnfactor", BSIM4_MOD_PTNFACTOR, IF_REAL, "Cross-term dependence of tnfactor"), /* v4.7 Tanvir*/ +IOP( "pteta0", BSIM4_MOD_PTETA0, IF_REAL, "Cross-term dependence of teta0"), /* v4.7 Tanvir*/ +IOP( "ptvoffcv", BSIM4_MOD_PTVOFFCV, IF_REAL, "Cross-term dependence of tvoffcv"), /* v4.7 Tanvir*/ /* stress effect*/ IOP( "saref", BSIM4_MOD_SAREF, IF_REAL, "Reference distance between OD edge to poly of one side"), @@ -965,8 +1020,10 @@ IOP( "noib", BSIM4_MOD_NOIB, IF_REAL, "Flicker noise parameter"), IOP( "noic", BSIM4_MOD_NOIC, IF_REAL, "Flicker noise parameter"), IOP( "tnoia", BSIM4_MOD_TNOIA, IF_REAL, "Thermal noise parameter"), IOP( "tnoib", BSIM4_MOD_TNOIB, IF_REAL, "Thermal noise parameter"), +IOP( "tnoic", BSIM4_MOD_TNOIC, IF_REAL, "Thermal noise parameter"), IOP( "rnoia", BSIM4_MOD_RNOIA, IF_REAL, "Thermal noise coefficient"), IOP( "rnoib", BSIM4_MOD_RNOIB, IF_REAL, "Thermal noise coefficient"), +IOP( "rnoic", BSIM4_MOD_RNOIC, IF_REAL, "Thermal noise coefficient"), IOP( "ntnoi", BSIM4_MOD_NTNOI, IF_REAL, "Thermal noise parameter"), IOP( "em", BSIM4_MOD_EM, IF_REAL, "Flicker noise parameter"), IOP( "ef", BSIM4_MOD_EF, IF_REAL, "Flicker noise frequency exponent"), diff --git a/src/spicelib/devices/bsim4/b4acld.c b/src/spicelib/devices/bsim4/b4acld.c index 3151a58ed..2eeff1945 100644 --- a/src/spicelib/devices/bsim4/b4acld.c +++ b/src/spicelib/devices/bsim4/b4acld.c @@ -1,8 +1,8 @@ -/**** BSIM4.6.2 Released by Wenwei Yang 07/31/2008 ****/ +/**** BSIM4.7.0 Released by Darsen Lu 04/08/2011 ****/ /********** * Copyright 2006 Regents of the University of California. All rights reserved. - * File: b4acld.c of BSIM4.6.2. + * File: b4acld.c of BSIM4.7.0. * Author: 2000 Weidong Liu * Authors: 2001- Xuemei Xi, Mohan Dunga, Ali Niknejad, Chenming Hu. * Authors: 2006- Mohan Dunga, Ali Niknejad, Chenming Hu @@ -91,7 +91,7 @@ double m; Cdsr = here->BSIM4cdsb * T2; Cdbr = -(Cddr + Cdgr + Cdsr); - /* WDLiu: Cxyi mulitplied by jomega below, and actually to be of conductance */ + /* WDLiu: Cxyi mulitplied by jomega below, and actually to be of conductance */ Cddi = here->BSIM4cddb * T3 * omega; Cdgi = here->BSIM4cdgb * T3 * omega; Cdsi = here->BSIM4cdsb * T3 * omega; @@ -107,15 +107,15 @@ double m; Cssi = Css * T3 * omega; Csbi = -(Csdi + Csgi + Cssi); - Cgdr = -(Cddr + Csdr + here->BSIM4cbdb); - Cggr = -(Cdgr + Csgr + here->BSIM4cbgb); - Cgsr = -(Cdsr + Cssr + here->BSIM4cbsb); - Cgbr = -(Cgdr + Cggr + Cgsr); + Cgdr = -(Cddr + Csdr + here->BSIM4cbdb); + Cggr = -(Cdgr + Csgr + here->BSIM4cbgb); + Cgsr = -(Cdsr + Cssr + here->BSIM4cbsb); + Cgbr = -(Cgdr + Cggr + Cgsr); - Cgdi = -(Cddi + Csdi); - Cggi = -(Cdgi + Csgi); - Cgsi = -(Cdsi + Cssi); - Cgbi = -(Cgdi + Cggi + Cgsi); + Cgdi = -(Cddi + Csdi); + Cggi = -(Cdgi + Csgi); + Cgsi = -(Cdsi + Cssi); + Cgbi = -(Cgdi + Cggi + Cgsi); } else /* QS */ { gmr = here->BSIM4gm; @@ -144,11 +144,11 @@ double m; if (here->BSIM4mode >= 0) - { Gmr = gmr; + { Gmr = gmr; Gmbsr = gmbsr; FwdSumr = Gmr + Gmbsr; RevSumr = 0.0; - Gmi = gmi; + Gmi = gmi; Gmbsi = gmbsi; FwdSumi = Gmi + Gmbsi; RevSumi = 0.0; @@ -263,7 +263,7 @@ double m; else { xcdbbr = Cdbr * omega; xcsbbr = -(xcsgbr + xcsdbr + xcssbr + xcsgmb) - + here->BSIM4capbs * omega; + + here->BSIM4capbs * omega; xcbdb = here->BSIM4cbdb * omega; xcbsb = here->BSIM4cbsb * omega; @@ -476,7 +476,7 @@ double m; *(here->BSIM4GEgpPtr) -= m * geltd; *(here->BSIM4GPgpPtr +1) += m * xcggbr; - *(here->BSIM4GPgpPtr) += m * (geltd + xcggbi + gIgtotg); + *(here->BSIM4GPgpPtr) += m * (geltd + xcggbi + gIgtotg); *(here->BSIM4GPdpPtr +1) += m * xcgdbr; *(here->BSIM4GPdpPtr) += m * (xcgdbi + gIgtotd); *(here->BSIM4GPspPtr +1) += m * xcgsbr; @@ -493,13 +493,13 @@ double m; *(here->BSIM4GPgePtr) -= m * gcrg; *(here->BSIM4GPgpPtr +1) += m * xcggbr; - *(here->BSIM4GPgpPtr) -= m * (gcrgg - xcggbi - gIgtotg); + *(here->BSIM4GPgpPtr) -= m * (gcrgg - xcggbi - gIgtotg); *(here->BSIM4GPdpPtr +1) += m * xcgdbr; - *(here->BSIM4GPdpPtr) -= m * (gcrgd - xcgdbi - gIgtotd); + *(here->BSIM4GPdpPtr) -= m * (gcrgd - xcgdbi - gIgtotd); *(here->BSIM4GPspPtr +1) += m * xcgsbr; - *(here->BSIM4GPspPtr) -= m * (gcrgs - xcgsbi - gIgtots); + *(here->BSIM4GPspPtr) -= m * (gcrgs - xcgsbi - gIgtots); *(here->BSIM4GPbpPtr +1) += m * xcgbbr; - *(here->BSIM4GPbpPtr) -= m * (gcrgb - xcgbbi - gIgtotb); + *(here->BSIM4GPbpPtr) -= m * (gcrgb - xcgbbi - gIgtotb); } else if (here->BSIM4rgateMod == 3) { *(here->BSIM4GEgePtr) += m * geltd; @@ -552,7 +552,7 @@ double m; *(here->BSIM4DPdpPtr +1) += m * (xcddbr + gdsi + RevSumi); *(here->BSIM4DPdpPtr) += m * (gdpr + xcddbi + gdsr + here->BSIM4gbd - - gdtotd + RevSumr + gbdpdp - gIdtotd); + - gdtotd + RevSumr + gbdpdp - gIdtotd); *(here->BSIM4DPdPtr) -= m * (gdpr + gdtot); *(here->BSIM4DPgpPtr +1) += m * (xcdgbr + Gmi); *(here->BSIM4DPgpPtr) += m * (Gmr + xcdgbi - gdtotg + gbdpg - gIdtotg); @@ -570,7 +570,7 @@ double m; *(here->BSIM4SPgpPtr) -= m * (Gmr - xcsgbi + gstotg - gbspg + gIstotg); *(here->BSIM4SPspPtr +1) += m * (xcssbr + gdsi + FwdSumi); *(here->BSIM4SPspPtr) += m * (gspr + xcssbi + gdsr + here->BSIM4gbs - - gstots + FwdSumr + gbspsp - gIstots); + - gstots + FwdSumr + gbspsp - gIstots); *(here->BSIM4SPsPtr) -= m * (gspr + gstot); *(here->BSIM4SPbpPtr +1) += m * (xcsbbr - Gmbsi); *(here->BSIM4SPbpPtr) -= m * (gjbs + gstotb - xcsbbi + Gmbsr - gbspb + gIstotb); @@ -586,32 +586,32 @@ double m; *(here->BSIM4BPspPtr) -= m * (gjbs - gbbsp + gIbtots); *(here->BSIM4BPbpPtr +1) += m * xcbbb; *(here->BSIM4BPbpPtr) += m * (gjbd + gjbs - here->BSIM4gbbs - - gIbtotb); - ggidld = here->BSIM4ggidld; - ggidlg = here->BSIM4ggidlg; - ggidlb = here->BSIM4ggidlb; - ggislg = here->BSIM4ggislg; - ggisls = here->BSIM4ggisls; - ggislb = here->BSIM4ggislb; + - gIbtotb); + ggidld = here->BSIM4ggidld; + ggidlg = here->BSIM4ggidlg; + ggidlb = here->BSIM4ggidlb; + ggislg = here->BSIM4ggislg; + ggisls = here->BSIM4ggisls; + ggislb = here->BSIM4ggislb; - /* stamp gidl */ - (*(here->BSIM4DPdpPtr) += m * ggidld); - (*(here->BSIM4DPgpPtr) += m * ggidlg); - (*(here->BSIM4DPspPtr) -= m * ((ggidlg + ggidld) + ggidlb)); - (*(here->BSIM4DPbpPtr) += m * ggidlb); - (*(here->BSIM4BPdpPtr) -= m * ggidld); - (*(here->BSIM4BPgpPtr) -= m * ggidlg); - (*(here->BSIM4BPspPtr) += m * ((ggidlg + ggidld) + ggidlb)); - (*(here->BSIM4BPbpPtr) -= m * ggidlb); - /* stamp gisl */ - (*(here->BSIM4SPdpPtr) -= m * ((ggisls + ggislg) + ggislb)); - (*(here->BSIM4SPgpPtr) += m * ggislg); - (*(here->BSIM4SPspPtr) += m * ggisls); - (*(here->BSIM4SPbpPtr) += m * ggislb); - (*(here->BSIM4BPdpPtr) += m * ((ggislg + ggisls) + ggislb)); - (*(here->BSIM4BPgpPtr) -= m * ggislg); - (*(here->BSIM4BPspPtr) -= m * ggisls); - (*(here->BSIM4BPbpPtr) -= m * ggislb); + /* stamp gidl */ + (*(here->BSIM4DPdpPtr) += m * ggidld); + (*(here->BSIM4DPgpPtr) += m * ggidlg); + (*(here->BSIM4DPspPtr) -= m * ((ggidlg + ggidld) + ggidlb)); + (*(here->BSIM4DPbpPtr) += m * ggidlb); + (*(here->BSIM4BPdpPtr) -= m * ggidld); + (*(here->BSIM4BPgpPtr) -= m * ggidlg); + (*(here->BSIM4BPspPtr) += m * ((ggidlg + ggidld) + ggidlb)); + (*(here->BSIM4BPbpPtr) -= m * ggidlb); + /* stamp gisl */ + (*(here->BSIM4SPdpPtr) -= m * ((ggisls + ggislg) + ggislb)); + (*(here->BSIM4SPgpPtr) += m * ggislg); + (*(here->BSIM4SPspPtr) += m * ggisls); + (*(here->BSIM4SPbpPtr) += m * ggislb); + (*(here->BSIM4BPdpPtr) += m * ((ggislg + ggisls) + ggislb)); + (*(here->BSIM4BPgpPtr) -= m * ggislg); + (*(here->BSIM4BPspPtr) -= m * ggisls); + (*(here->BSIM4BPbpPtr) -= m * ggislb); if (here->BSIM4rbodyMod) { (*(here->BSIM4DPdbPtr +1) += m * xcdbdb); @@ -631,8 +631,8 @@ double m; (*(here->BSIM4BPbPtr) -= m * here->BSIM4grbpb); (*(here->BSIM4BPsbPtr) -= m * here->BSIM4grbps); (*(here->BSIM4BPbpPtr) += m * (here->BSIM4grbpd + here->BSIM4grbps - + here->BSIM4grbpb)); - /* WDLiu: (-here->BSIM4gbbs) already added to BPbpPtr */ + + here->BSIM4grbpb)); + /* WDLiu: (-here->BSIM4gbbs) already added to BPbpPtr */ (*(here->BSIM4SBspPtr +1) += m * xcsbsb); (*(here->BSIM4SBspPtr) -= m * here->BSIM4gbs); @@ -640,7 +640,7 @@ double m; (*(here->BSIM4SBbPtr) -= m * here->BSIM4grbsb); (*(here->BSIM4SBsbPtr +1) -= m * xcsbsb); (*(here->BSIM4SBsbPtr) += m * (here->BSIM4gbs - + here->BSIM4grbps + here->BSIM4grbsb)); + + here->BSIM4grbps + here->BSIM4grbsb)); (*(here->BSIM4BdbPtr) -= m * here->BSIM4grbdb); (*(here->BSIM4BbpPtr) -= m * here->BSIM4grbpb); @@ -650,12 +650,12 @@ double m; } - /* - * WDLiu: The internal charge node generated for transient NQS is not needed for - * AC NQS. The following is not doing a real job, but we have to keep it; - * otherwise a singular AC NQS matrix may occur if the transient NQS is on. - * The charge node is isolated from the instance. - */ + /* + * WDLiu: The internal charge node generated for transient NQS is not needed for + * AC NQS. The following is not doing a real job, but we have to keep it; + * otherwise a singular AC NQS matrix may occur if the transient NQS is on. + * The charge node is isolated from the instance. + */ if (here->BSIM4trnqsMod) { (*(here->BSIM4QqPtr) += m * 1.0); (*(here->BSIM4QgpPtr) += 0.0); diff --git a/src/spicelib/devices/bsim4/b4ask.c b/src/spicelib/devices/bsim4/b4ask.c index 2fd9b221e..61682c748 100644 --- a/src/spicelib/devices/bsim4/b4ask.c +++ b/src/spicelib/devices/bsim4/b4ask.c @@ -1,8 +1,8 @@ -/**** BSIM4.6.2 Released by Wenwei Yang 07/31/2008 ****/ +/**** BSIM4.7.0 Released by Darsen Lu 04/08/2011 ****/ /********** * Copyright 2006 Regents of the University of California. All rights reserved. - * File: b4ask.c of BSIM4.6.2. + * File: b4ask.c of BSIM4.7.0. * Author: 2000 Weidong Liu * Authors: 2001- Xuemei Xi, Mohan Dunga, Ali Niknejad, Chenming Hu. * Authors: 2006- Mohan Dunga, Ali Niknejad, Chenming Hu @@ -80,16 +80,16 @@ BSIM4instance *here = (BSIM4instance*)inst; case BSIM4_SD: value->rValue = here->BSIM4sd ; return(OK); - case BSIM4_SCA: + case BSIM4_SCA: value->rValue = here->BSIM4sca ; return(OK); - case BSIM4_SCB: + case BSIM4_SCB: value->rValue = here->BSIM4scb ; return(OK); - case BSIM4_SCC: + case BSIM4_SCC: value->rValue = here->BSIM4scc ; return(OK); - case BSIM4_SC: + case BSIM4_SC: value->rValue = here->BSIM4sc ; return(OK); @@ -213,10 +213,6 @@ BSIM4instance *here = (BSIM4instance*)inst; value->rValue = here->BSIM4csub; value->rValue *= here->BSIM4m; return(OK); - case BSIM4_QINV: - value->rValue = here-> BSIM4qinv; - value->rValue *= here->BSIM4m; - return(OK); case BSIM4_IGIDL: value->rValue = here->BSIM4Igidl; value->rValue *= here->BSIM4m; @@ -311,6 +307,7 @@ BSIM4instance *here = (BSIM4instance*)inst; return(OK); case BSIM4_GTAU: value->rValue = here->BSIM4gtau; + value->rValue *= here->BSIM4m; return(OK); case BSIM4_CGGB: value->rValue = here->BSIM4cggb; diff --git a/src/spicelib/devices/bsim4/b4check.c b/src/spicelib/devices/bsim4/b4check.c index 1a0b78401..e3002746a 100644 --- a/src/spicelib/devices/bsim4/b4check.c +++ b/src/spicelib/devices/bsim4/b4check.c @@ -1,8 +1,8 @@ -/**** BSIM4.6.2 Released by Wenwei Yang 07/31/2008 ****/ -/**** BSIM4.6.5 Update ngspice 09/22/2009 ****/ +/**** BSIM4.7.0 Released by Darsen Lu 04/08/2011 ****/ + /********** * Copyright 2006 Regents of the University of California. All rights reserved. - * File: b4check.c of BSIM4.6.1. + * File: b4check.c of BSIM4.7.0. * Author: 2000 Weidong Liu * Authors: 2001- Xuemei Xi, Mohan Dunga, Ali Niknejad, Chenming Hu. * Authors: 2006- Mohan Dunga, Ali Niknejad, Chenming Hu @@ -17,6 +17,7 @@ * Modified by Mohan Dunga, 12/13/2006 * Modified by Mohan Dunga, Wenwei Yang, 05/18/2007. * Modified by Wenwei Yang, 07/31/2008 . + * Modified by Tanvir Morshed, Darsen Lu 03/27/2011 **********/ #include "ngspice.h" @@ -43,13 +44,13 @@ FILE *fplog; fprintf(fplog, "BSIM4: Berkeley Short Channel IGFET Model-4\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"); + fprintf(fplog, "++++++++++ BSIM4 PARAMETER CHECKING BELOW ++++++++++\n"); - if (strcmp(model->BSIM4version, "4.6.5") != 0) - { fprintf(fplog, "Warning: This model is BSIM4.6.5; you specified a wrong version number.\n"); - printf("Warning: This model is BSIM4.6.5; you specified a wrong version number.\n"); + if (strcmp(model->BSIM4version, "4.7.0") != 0) + { fprintf(fplog, "Warning: This model is BSIM4.7.0; you specified a wrong version number.\n"); + printf("Warning: This model is BSIM4.7.0; you specified a wrong version number.\n"); } - fprintf(fplog, "Model = %s\n", model->BSIM4modName); + fprintf(fplog, "Model = %s\n", model->BSIM4modName); if ((here->BSIM4rgateMod == 2) || (here->BSIM4rgateMod == 3)) @@ -59,12 +60,12 @@ FILE *fplog; } } - if (model->BSIM4toxe <= 0.0) - { fprintf(fplog, "Fatal: Toxe = %g is not positive.\n", - model->BSIM4toxe); - printf("Fatal: Toxe = %g is not positive.\n", model->BSIM4toxe); - Fatal_Flag = 1; - } + if (model->BSIM4toxe <= 0.0) + { fprintf(fplog, "Fatal: Toxe = %g is not positive.\n", + model->BSIM4toxe); + printf("Fatal: Toxe = %g is not positive.\n", model->BSIM4toxe); + Fatal_Flag = 1; + } if (model->BSIM4toxp <= 0.0) { fprintf(fplog, "Fatal: Toxp = %g is not positive.\n", model->BSIM4toxp); @@ -137,114 +138,114 @@ FILE *fplog; pParam->BSIM4lpeb); Fatal_Flag = 1; } - if (pParam->BSIM4ndep <= 0.0) - { fprintf(fplog, "Fatal: Ndep = %g is not positive.\n", - pParam->BSIM4ndep); - printf("Fatal: Ndep = %g is not positive.\n", - pParam->BSIM4ndep); - Fatal_Flag = 1; - } + if (pParam->BSIM4ndep <= 0.0) + { fprintf(fplog, "Fatal: Ndep = %g is not positive.\n", + pParam->BSIM4ndep); + printf("Fatal: Ndep = %g is not positive.\n", + pParam->BSIM4ndep); + Fatal_Flag = 1; + } if (pParam->BSIM4phi <= 0.0) { fprintf(fplog, "Fatal: Phi = %g is not positive. Please check Phin and Ndep\n", pParam->BSIM4phi); - fprintf(fplog, " Phin = %g Ndep = %g \n", - pParam->BSIM4phin, pParam->BSIM4ndep); + fprintf(fplog, " Phin = %g Ndep = %g \n", + pParam->BSIM4phin, pParam->BSIM4ndep); printf("Fatal: Phi = %g is not positive. Please check Phin and Ndep\n", pParam->BSIM4phi); - printf(" Phin = %g Ndep = %g \n", - pParam->BSIM4phin, pParam->BSIM4ndep); + printf(" Phin = %g Ndep = %g \n", + pParam->BSIM4phin, pParam->BSIM4ndep); + Fatal_Flag = 1; + } + if (pParam->BSIM4nsub <= 0.0) + { fprintf(fplog, "Fatal: Nsub = %g is not positive.\n", + pParam->BSIM4nsub); + printf("Fatal: Nsub = %g is not positive.\n", + pParam->BSIM4nsub); + Fatal_Flag = 1; + } + if (pParam->BSIM4ngate < 0.0) + { fprintf(fplog, "Fatal: Ngate = %g is not positive.\n", + pParam->BSIM4ngate); + printf("Fatal: Ngate = %g Ngate is not positive.\n", + pParam->BSIM4ngate); + Fatal_Flag = 1; + } + if (pParam->BSIM4ngate > 1.e25) + { fprintf(fplog, "Fatal: Ngate = %g is too high.\n", + pParam->BSIM4ngate); + printf("Fatal: Ngate = %g Ngate is too high\n", + pParam->BSIM4ngate); + Fatal_Flag = 1; + } + if (pParam->BSIM4xj <= 0.0) + { fprintf(fplog, "Fatal: Xj = %g is not positive.\n", + pParam->BSIM4xj); + printf("Fatal: Xj = %g is not positive.\n", pParam->BSIM4xj); Fatal_Flag = 1; } - if (pParam->BSIM4nsub <= 0.0) - { fprintf(fplog, "Fatal: Nsub = %g is not positive.\n", - pParam->BSIM4nsub); - printf("Fatal: Nsub = %g is not positive.\n", - pParam->BSIM4nsub); - Fatal_Flag = 1; - } - if (pParam->BSIM4ngate < 0.0) - { fprintf(fplog, "Fatal: Ngate = %g is not positive.\n", - pParam->BSIM4ngate); - printf("Fatal: Ngate = %g Ngate is not positive.\n", - pParam->BSIM4ngate); - Fatal_Flag = 1; - } - if (pParam->BSIM4ngate > 1.e25) - { fprintf(fplog, "Fatal: Ngate = %g is too high.\n", - pParam->BSIM4ngate); - printf("Fatal: Ngate = %g Ngate is too high\n", - pParam->BSIM4ngate); - Fatal_Flag = 1; - } - if (pParam->BSIM4xj <= 0.0) - { fprintf(fplog, "Fatal: Xj = %g is not positive.\n", - pParam->BSIM4xj); - printf("Fatal: Xj = %g is not positive.\n", pParam->BSIM4xj); - Fatal_Flag = 1; - } - if (pParam->BSIM4dvt1 < 0.0) - { fprintf(fplog, "Fatal: Dvt1 = %g is negative.\n", - pParam->BSIM4dvt1); - printf("Fatal: Dvt1 = %g is negative.\n", pParam->BSIM4dvt1); - Fatal_Flag = 1; - } - - if (pParam->BSIM4dvt1w < 0.0) - { fprintf(fplog, "Fatal: Dvt1w = %g is negative.\n", - pParam->BSIM4dvt1w); - printf("Fatal: Dvt1w = %g is negative.\n", pParam->BSIM4dvt1w); - Fatal_Flag = 1; - } - - if (pParam->BSIM4w0 == -pParam->BSIM4weff) - { fprintf(fplog, "Fatal: (W0 + Weff) = 0 causing divided-by-zero.\n"); - printf("Fatal: (W0 + Weff) = 0 causing divided-by-zero.\n"); - Fatal_Flag = 1; + if (pParam->BSIM4dvt1 < 0.0) + { fprintf(fplog, "Fatal: Dvt1 = %g is negative.\n", + pParam->BSIM4dvt1); + printf("Fatal: Dvt1 = %g is negative.\n", pParam->BSIM4dvt1); + Fatal_Flag = 1; + } + + if (pParam->BSIM4dvt1w < 0.0) + { fprintf(fplog, "Fatal: Dvt1w = %g is negative.\n", + pParam->BSIM4dvt1w); + printf("Fatal: Dvt1w = %g is negative.\n", pParam->BSIM4dvt1w); + Fatal_Flag = 1; + } + + if (pParam->BSIM4w0 == -pParam->BSIM4weff) + { fprintf(fplog, "Fatal: (W0 + Weff) = 0 causing divided-by-zero.\n"); + printf("Fatal: (W0 + Weff) = 0 causing divided-by-zero.\n"); + Fatal_Flag = 1; } - if (pParam->BSIM4dsub < 0.0) - { fprintf(fplog, "Fatal: Dsub = %g is negative.\n", pParam->BSIM4dsub); - printf("Fatal: Dsub = %g is negative.\n", pParam->BSIM4dsub); - Fatal_Flag = 1; - } - if (pParam->BSIM4b1 == -pParam->BSIM4weff) - { fprintf(fplog, "Fatal: (B1 + Weff) = 0 causing divided-by-zero.\n"); - printf("Fatal: (B1 + Weff) = 0 causing divided-by-zero.\n"); - Fatal_Flag = 1; + if (pParam->BSIM4dsub < 0.0) + { fprintf(fplog, "Fatal: Dsub = %g is negative.\n", pParam->BSIM4dsub); + printf("Fatal: Dsub = %g is negative.\n", pParam->BSIM4dsub); + Fatal_Flag = 1; + } + if (pParam->BSIM4b1 == -pParam->BSIM4weff) + { fprintf(fplog, "Fatal: (B1 + Weff) = 0 causing divided-by-zero.\n"); + printf("Fatal: (B1 + Weff) = 0 causing divided-by-zero.\n"); + Fatal_Flag = 1; } if (here->BSIM4u0temp <= 0.0) - { fprintf(fplog, "Fatal: u0 at current temperature = %g is not positive.\n", here->BSIM4u0temp); - printf("Fatal: u0 at current temperature = %g is not positive.\n", - here->BSIM4u0temp); - Fatal_Flag = 1; + { fprintf(fplog, "Fatal: u0 at current temperature = %g is not positive.\n", here->BSIM4u0temp); + printf("Fatal: u0 at current temperature = %g is not positive.\n", + here->BSIM4u0temp); + Fatal_Flag = 1; } if (pParam->BSIM4delta < 0.0) - { fprintf(fplog, "Fatal: Delta = %g is less than zero.\n", - pParam->BSIM4delta); - printf("Fatal: Delta = %g is less than zero.\n", pParam->BSIM4delta); - Fatal_Flag = 1; + { fprintf(fplog, "Fatal: Delta = %g is less than zero.\n", + pParam->BSIM4delta); + printf("Fatal: Delta = %g is less than zero.\n", pParam->BSIM4delta); + Fatal_Flag = 1; } - if (here->BSIM4vsattemp <= 0.0) - { fprintf(fplog, "Fatal: Vsat at current temperature = %g is not positive.\n", here->BSIM4vsattemp); - printf("Fatal: Vsat at current temperature = %g is not positive.\n", - here->BSIM4vsattemp); - Fatal_Flag = 1; - } + if (here->BSIM4vsattemp <= 0.0) + { fprintf(fplog, "Fatal: Vsat at current temperature = %g is not positive.\n", here->BSIM4vsattemp); + printf("Fatal: Vsat at current temperature = %g is not positive.\n", + here->BSIM4vsattemp); + Fatal_Flag = 1; + } - if (pParam->BSIM4pclm <= 0.0) - { fprintf(fplog, "Fatal: Pclm = %g is not positive.\n", pParam->BSIM4pclm); - printf("Fatal: Pclm = %g is not positive.\n", pParam->BSIM4pclm); - Fatal_Flag = 1; - } + if (pParam->BSIM4pclm <= 0.0) + { fprintf(fplog, "Fatal: Pclm = %g is not positive.\n", pParam->BSIM4pclm); + printf("Fatal: Pclm = %g is not positive.\n", pParam->BSIM4pclm); + Fatal_Flag = 1; + } - if (pParam->BSIM4drout < 0.0) - { fprintf(fplog, "Fatal: Drout = %g is negative.\n", pParam->BSIM4drout); - printf("Fatal: Drout = %g is negative.\n", pParam->BSIM4drout); - Fatal_Flag = 1; - } + if (pParam->BSIM4drout < 0.0) + { fprintf(fplog, "Fatal: Drout = %g is negative.\n", pParam->BSIM4drout); + printf("Fatal: Drout = %g is negative.\n", pParam->BSIM4drout); + Fatal_Flag = 1; + } if (here->BSIM4m < 1.0) { fprintf(fplog, "Fatal: Number of multiplier = %g is smaller than one.\n", here->BSIM4m); @@ -259,18 +260,18 @@ FILE *fplog; } if((here->BSIM4sa > 0.0) && (here->BSIM4sb > 0.0) && - ((here->BSIM4nf == 1.0) || ((here->BSIM4nf > 1.0) && (here->BSIM4sd > 0.0))) ) + ((here->BSIM4nf == 1.0) || ((here->BSIM4nf > 1.0) && (here->BSIM4sd > 0.0))) ) { if (model->BSIM4saref <= 0.0) { fprintf(fplog, "Fatal: SAref = %g is not positive.\n",model->BSIM4saref); - printf("Fatal: SAref = %g is not positive.\n",model->BSIM4saref); - Fatal_Flag = 1; + printf("Fatal: SAref = %g is not positive.\n",model->BSIM4saref); + Fatal_Flag = 1; } if (model->BSIM4sbref <= 0.0) { fprintf(fplog, "Fatal: SBref = %g is not positive.\n",model->BSIM4sbref); - printf("Fatal: SBref = %g is not positive.\n",model->BSIM4sbref); - Fatal_Flag = 1; + printf("Fatal: SBref = %g is not positive.\n",model->BSIM4sbref); + Fatal_Flag = 1; } - } + } if ((here->BSIM4l + model->BSIM4xl) <= model->BSIM4xgl) { fprintf(fplog, "Fatal: The parameter xgl must be smaller than Ldrawn+XL.\n"); @@ -299,7 +300,7 @@ FILE *fplog; { fprintf(fplog, "Fatal: fprout = %g is negative.\n", pParam->BSIM4fprout); printf("Fatal: fprout = %g is negative.\n", pParam->BSIM4fprout); - Fatal_Flag = 1; + Fatal_Flag = 1; } if (pParam->BSIM4pdits < 0.0) { fprintf(fplog, "Fatal: pdits = %g is negative.\n", @@ -352,9 +353,9 @@ FILE *fplog; /* Check capacitance parameters */ if (pParam->BSIM4clc < 0.0) - { fprintf(fplog, "Fatal: Clc = %g is negative.\n", pParam->BSIM4clc); - printf("Fatal: Clc = %g is negative.\n", pParam->BSIM4clc); - Fatal_Flag = 1; + { fprintf(fplog, "Fatal: Clc = %g is negative.\n", pParam->BSIM4clc); + printf("Fatal: Clc = %g is negative.\n", pParam->BSIM4clc); + Fatal_Flag = 1; } /* Check overlap capacitance parameters */ @@ -371,86 +372,86 @@ 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->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 */ - if (pParam->BSIM4leff <= 1.0e-9) - { fprintf(fplog, "Warning: Leff = %g <= 1.0e-9. Recommended Leff >= 1e-8 \n", - pParam->BSIM4leff); - printf("Warning: Leff = %g <= 1.0e-9. Recommended Leff >= 1e-8 \n", - pParam->BSIM4leff); - } - - if (pParam->BSIM4leffCV <= 1.0e-9) - { fprintf(fplog, "Warning: Leff for CV = %g <= 1.0e-9. Recommended LeffCV >=1e-8 \n", - pParam->BSIM4leffCV); - printf("Warning: Leff for CV = %g <= 1.0e-9. Recommended LeffCV >=1e-8 \n", - pParam->BSIM4leffCV); - } - + if (pParam->BSIM4leff <= 1.0e-9) + { fprintf(fplog, "Warning: Leff = %g <= 1.0e-9. Recommended Leff >= 1e-8 \n", + pParam->BSIM4leff); + printf("Warning: Leff = %g <= 1.0e-9. Recommended Leff >= 1e-8 \n", + pParam->BSIM4leff); + } + + if (pParam->BSIM4leffCV <= 1.0e-9) + { fprintf(fplog, "Warning: Leff for CV = %g <= 1.0e-9. Recommended LeffCV >=1e-8 \n", + pParam->BSIM4leffCV); + printf("Warning: Leff for CV = %g <= 1.0e-9. Recommended LeffCV >=1e-8 \n", + pParam->BSIM4leffCV); + } + if (pParam->BSIM4weff <= 1.0e-9) - { fprintf(fplog, "Warning: Weff = %g <= 1.0e-9. Recommended Weff >=1e-7 \n", - pParam->BSIM4weff); - printf("Warning: Weff = %g <= 1.0e-9. Recommended Weff >=1e-7 \n", - pParam->BSIM4weff); - } - - if (pParam->BSIM4weffCV <= 1.0e-9) - { fprintf(fplog, "Warning: Weff for CV = %g <= 1.0e-9. Recommended WeffCV >= 1e-7 \n", - pParam->BSIM4weffCV); - printf("Warning: Weff for CV = %g <= 1.0e-9. Recommended WeffCV >= 1e-7 \n", - pParam->BSIM4weffCV); - } - + { fprintf(fplog, "Warning: Weff = %g <= 1.0e-9. Recommended Weff >=1e-7 \n", + pParam->BSIM4weff); + printf("Warning: Weff = %g <= 1.0e-9. Recommended Weff >=1e-7 \n", + pParam->BSIM4weff); + } + + if (pParam->BSIM4weffCV <= 1.0e-9) + { fprintf(fplog, "Warning: Weff for CV = %g <= 1.0e-9. Recommended WeffCV >= 1e-7 \n", + pParam->BSIM4weffCV); + printf("Warning: Weff for CV = %g <= 1.0e-9. Recommended WeffCV >= 1e-7 \n", + pParam->BSIM4weffCV); + } + /* Check threshold voltage parameters */ - if (model->BSIM4toxe < 1.0e-10) - { fprintf(fplog, "Warning: Toxe = %g is less than 1A. Recommended Toxe >= 5A\n", - model->BSIM4toxe); - printf("Warning: Toxe = %g is less than 1A. Recommended Toxe >= 5A\n", model->BSIM4toxe); + if (model->BSIM4toxe < 1.0e-10) + { fprintf(fplog, "Warning: Toxe = %g is less than 1A. Recommended Toxe >= 5A\n", + model->BSIM4toxe); + printf("Warning: Toxe = %g is less than 1A. Recommended Toxe >= 5A\n", model->BSIM4toxe); } if (model->BSIM4toxp < 1.0e-10) { fprintf(fplog, "Warning: Toxp = %g is less than 1A. Recommended Toxp >= 5A\n", @@ -464,95 +465,95 @@ FILE *fplog; } if (pParam->BSIM4ndep <= 1.0e12) - { fprintf(fplog, "Warning: Ndep = %g may be too small.\n", - pParam->BSIM4ndep); - printf("Warning: Ndep = %g may be too small.\n", - pParam->BSIM4ndep); - } - else if (pParam->BSIM4ndep >= 1.0e21) - { fprintf(fplog, "Warning: Ndep = %g may be too large.\n", - pParam->BSIM4ndep); - printf("Warning: Ndep = %g may be too large.\n", - pParam->BSIM4ndep); - } + { fprintf(fplog, "Warning: Ndep = %g may be too small.\n", + pParam->BSIM4ndep); + printf("Warning: Ndep = %g may be too small.\n", + pParam->BSIM4ndep); + } + else if (pParam->BSIM4ndep >= 1.0e21) + { fprintf(fplog, "Warning: Ndep = %g may be too large.\n", + pParam->BSIM4ndep); + printf("Warning: Ndep = %g may be too large.\n", + pParam->BSIM4ndep); + } - if (pParam->BSIM4nsub <= 1.0e14) - { fprintf(fplog, "Warning: Nsub = %g may be too small.\n", - pParam->BSIM4nsub); - printf("Warning: Nsub = %g may be too small.\n", - pParam->BSIM4nsub); - } - else if (pParam->BSIM4nsub >= 1.0e21) - { fprintf(fplog, "Warning: Nsub = %g may be too large.\n", - pParam->BSIM4nsub); - printf("Warning: Nsub = %g may be too large.\n", - pParam->BSIM4nsub); - } + if (pParam->BSIM4nsub <= 1.0e14) + { fprintf(fplog, "Warning: Nsub = %g may be too small.\n", + pParam->BSIM4nsub); + printf("Warning: Nsub = %g may be too small.\n", + pParam->BSIM4nsub); + } + else if (pParam->BSIM4nsub >= 1.0e21) + { fprintf(fplog, "Warning: Nsub = %g may be too large.\n", + pParam->BSIM4nsub); + printf("Warning: Nsub = %g may be too large.\n", + pParam->BSIM4nsub); + } - if ((pParam->BSIM4ngate > 0.0) && - (pParam->BSIM4ngate <= 1.e18)) - { fprintf(fplog, "Warning: Ngate = %g is less than 1.E18cm^-3.\n", - pParam->BSIM4ngate); - printf("Warning: Ngate = %g is less than 1.E18cm^-3.\n", - pParam->BSIM4ngate); - } + if ((pParam->BSIM4ngate > 0.0) && + (pParam->BSIM4ngate <= 1.e18)) + { fprintf(fplog, "Warning: Ngate = %g is less than 1.E18cm^-3.\n", + pParam->BSIM4ngate); + printf("Warning: Ngate = %g is less than 1.E18cm^-3.\n", + pParam->BSIM4ngate); + } if (pParam->BSIM4dvt0 < 0.0) - { fprintf(fplog, "Warning: Dvt0 = %g is negative.\n", - pParam->BSIM4dvt0); - printf("Warning: Dvt0 = %g is negative.\n", pParam->BSIM4dvt0); - } - - if (fabs(1.0e-8 / (pParam->BSIM4w0 + pParam->BSIM4weff)) > 10.0) - { fprintf(fplog, "Warning: (W0 + Weff) may be too small.\n"); - printf("Warning: (W0 + Weff) may be too small.\n"); + { fprintf(fplog, "Warning: Dvt0 = %g is negative.\n", + pParam->BSIM4dvt0); + printf("Warning: Dvt0 = %g is negative.\n", pParam->BSIM4dvt0); + } + + if (fabs(1.0e-8 / (pParam->BSIM4w0 + pParam->BSIM4weff)) > 10.0) + { fprintf(fplog, "Warning: (W0 + Weff) may be too small.\n"); + printf("Warning: (W0 + Weff) may be too small.\n"); } /* Check subthreshold parameters */ - if (pParam->BSIM4nfactor < 0.0) - { fprintf(fplog, "Warning: Nfactor = %g is negative.\n", - pParam->BSIM4nfactor); - printf("Warning: Nfactor = %g is negative.\n", pParam->BSIM4nfactor); - } - if (pParam->BSIM4cdsc < 0.0) - { fprintf(fplog, "Warning: Cdsc = %g is negative.\n", - pParam->BSIM4cdsc); - printf("Warning: Cdsc = %g is negative.\n", pParam->BSIM4cdsc); - } - if (pParam->BSIM4cdscd < 0.0) - { fprintf(fplog, "Warning: Cdscd = %g is negative.\n", - pParam->BSIM4cdscd); - printf("Warning: Cdscd = %g is negative.\n", pParam->BSIM4cdscd); - } + if (pParam->BSIM4nfactor < 0.0) + { fprintf(fplog, "Warning: Nfactor = %g is negative.\n", + pParam->BSIM4nfactor); + printf("Warning: Nfactor = %g is negative.\n", pParam->BSIM4nfactor); + } + if (pParam->BSIM4cdsc < 0.0) + { fprintf(fplog, "Warning: Cdsc = %g is negative.\n", + pParam->BSIM4cdsc); + printf("Warning: Cdsc = %g is negative.\n", pParam->BSIM4cdsc); + } + if (pParam->BSIM4cdscd < 0.0) + { fprintf(fplog, "Warning: Cdscd = %g is negative.\n", + pParam->BSIM4cdscd); + printf("Warning: Cdscd = %g is negative.\n", pParam->BSIM4cdscd); + } /* Check DIBL parameters */ - if (here->BSIM4eta0 < 0.0) - { fprintf(fplog, "Warning: Eta0 = %g is negative.\n", - here->BSIM4eta0); - printf("Warning: Eta0 = %g is negative.\n", here->BSIM4eta0); - } - -/* Check Abulk parameters */ - if (fabs(1.0e-8 / (pParam->BSIM4b1 + pParam->BSIM4weff)) > 10.0) - { fprintf(fplog, "Warning: (B1 + Weff) may be too small.\n"); - printf("Warning: (B1 + Weff) may be too small.\n"); + if (here->BSIM4eta0 < 0.0) + { fprintf(fplog, "Warning: Eta0 = %g is negative.\n", + here->BSIM4eta0); + printf("Warning: Eta0 = %g is negative.\n", here->BSIM4eta0); + } + +/* Check Abulk parameters */ + if (fabs(1.0e-8 / (pParam->BSIM4b1 + pParam->BSIM4weff)) > 10.0) + { fprintf(fplog, "Warning: (B1 + Weff) may be too small.\n"); + printf("Warning: (B1 + Weff) may be too small.\n"); } /* Check Saturation parameters */ - if (pParam->BSIM4a2 < 0.01) - { fprintf(fplog, "Warning: A2 = %g is too small. Set to 0.01.\n", pParam->BSIM4a2); - printf("Warning: A2 = %g is too small. Set to 0.01.\n", - pParam->BSIM4a2); - pParam->BSIM4a2 = 0.01; - } - else if (pParam->BSIM4a2 > 1.0) - { fprintf(fplog, "Warning: A2 = %g is larger than 1. A2 is set to 1 and A1 is set to 0.\n", - pParam->BSIM4a2); - printf("Warning: A2 = %g is larger than 1. A2 is set to 1 and A1 is set to 0.\n", - pParam->BSIM4a2); - pParam->BSIM4a2 = 1.0; - pParam->BSIM4a1 = 0.0; - } + if (pParam->BSIM4a2 < 0.01) + { fprintf(fplog, "Warning: A2 = %g is too small. Set to 0.01.\n", pParam->BSIM4a2); + printf("Warning: A2 = %g is too small. Set to 0.01.\n", + pParam->BSIM4a2); + pParam->BSIM4a2 = 0.01; + } + else if (pParam->BSIM4a2 > 1.0) + { fprintf(fplog, "Warning: A2 = %g is larger than 1. A2 is set to 1 and A1 is set to 0.\n", + pParam->BSIM4a2); + printf("Warning: A2 = %g is larger than 1. A2 is set to 1 and A1 is set to 0.\n", + pParam->BSIM4a2); + pParam->BSIM4a2 = 1.0; + pParam->BSIM4a1 = 0.0; + } if (pParam->BSIM4prwg < 0.0) { fprintf(fplog, "Warning: Prwg = %g is negative. Set to zero.\n", @@ -562,22 +563,22 @@ FILE *fplog; pParam->BSIM4prwg = 0.0; } - if (pParam->BSIM4rdsw < 0.0) - { fprintf(fplog, "Warning: Rdsw = %g is negative. Set to zero.\n", - pParam->BSIM4rdsw); - printf("Warning: Rdsw = %g is negative. Set to zero.\n", - pParam->BSIM4rdsw); - pParam->BSIM4rdsw = 0.0; - pParam->BSIM4rds0 = 0.0; - } + if (pParam->BSIM4rdsw < 0.0) + { fprintf(fplog, "Warning: Rdsw = %g is negative. Set to zero.\n", + pParam->BSIM4rdsw); + printf("Warning: Rdsw = %g is negative. Set to zero.\n", + pParam->BSIM4rdsw); + pParam->BSIM4rdsw = 0.0; + pParam->BSIM4rds0 = 0.0; + } - if (pParam->BSIM4rds0 < 0.0) - { fprintf(fplog, "Warning: Rds at current temperature = %g is negative. Set to zero.\n", - pParam->BSIM4rds0); - printf("Warning: Rds at current temperature = %g is negative. Set to zero.\n", - pParam->BSIM4rds0); - pParam->BSIM4rds0 = 0.0; - } + if (pParam->BSIM4rds0 < 0.0) + { fprintf(fplog, "Warning: Rds at current temperature = %g is negative. Set to zero.\n", + pParam->BSIM4rds0); + printf("Warning: Rds at current temperature = %g is negative. Set to zero.\n", + pParam->BSIM4rds0); + pParam->BSIM4rds0 = 0.0; + } if (pParam->BSIM4rdswmin < 0.0) { fprintf(fplog, "Warning: Rdswmin at current temperature = %g is negative. Set to zero.\n", @@ -594,67 +595,67 @@ FILE *fplog; } if (pParam->BSIM4vsattemp < 1.0e3) - { fprintf(fplog, "Warning: Vsat at current temperature = %g may be too small.\n", pParam->BSIM4vsattemp); - printf("Warning: Vsat at current temperature = %g may be too small.\n", pParam->BSIM4vsattemp); - } + { fprintf(fplog, "Warning: Vsat at current temperature = %g may be too small.\n", pParam->BSIM4vsattemp); + printf("Warning: Vsat at current temperature = %g may be too small.\n", pParam->BSIM4vsattemp); + } if((model->BSIM4lambdaGiven) && (pParam->BSIM4lambda > 0.0) ) { if (pParam->BSIM4lambda > 1.0e-9) - { fprintf(fplog, "Warning: Lambda = %g may be too large.\n", pParam->BSIM4lambda); - printf("Warning: Lambda = %g may be too large.\n", pParam->BSIM4lambda); - } + { fprintf(fplog, "Warning: Lambda = %g may be too large.\n", pParam->BSIM4lambda); + printf("Warning: Lambda = %g may be too large.\n", pParam->BSIM4lambda); + } } if((model->BSIM4vtlGiven) && (pParam->BSIM4vtl > 0.0) ) { if (pParam->BSIM4vtl < 6.0e4) - { fprintf(fplog, "Warning: Thermal velocity vtl = %g may be too small.\n", pParam->BSIM4vtl); - printf("Warning: Thermal velocity vtl = %g may be too small.\n", pParam->BSIM4vtl); - } + { fprintf(fplog, "Warning: Thermal velocity vtl = %g may be too small.\n", pParam->BSIM4vtl); + printf("Warning: Thermal velocity vtl = %g may be too small.\n", pParam->BSIM4vtl); + } if (pParam->BSIM4xn < 3.0) - { fprintf(fplog, "Warning: back scattering coeff xn = %g is too small.\n", pParam->BSIM4xn); - printf("Warning: back scattering coeff xn = %g is too small. Reset to 3.0 \n", pParam->BSIM4xn); - pParam->BSIM4xn = 3.0; - } + { fprintf(fplog, "Warning: back scattering coeff xn = %g is too small.\n", pParam->BSIM4xn); + printf("Warning: back scattering coeff xn = %g is too small. Reset to 3.0 \n", pParam->BSIM4xn); + pParam->BSIM4xn = 3.0; + } if (model->BSIM4lc < 0.0) - { fprintf(fplog, "Warning: back scattering coeff lc = %g is too small.\n", model->BSIM4lc); - printf("Warning: back scattering coeff lc = %g is too small. Reset to 0.0\n", model->BSIM4lc); - pParam->BSIM4lc = 0.0; - } + { fprintf(fplog, "Warning: back scattering coeff lc = %g is too small.\n", model->BSIM4lc); + printf("Warning: back scattering coeff lc = %g is too small. Reset to 0.0\n", model->BSIM4lc); + pParam->BSIM4lc = 0.0; + } } - if (pParam->BSIM4pdibl1 < 0.0) - { fprintf(fplog, "Warning: Pdibl1 = %g is negative.\n", - pParam->BSIM4pdibl1); - printf("Warning: Pdibl1 = %g is negative.\n", pParam->BSIM4pdibl1); - } - if (pParam->BSIM4pdibl2 < 0.0) - { fprintf(fplog, "Warning: Pdibl2 = %g is negative.\n", - pParam->BSIM4pdibl2); - printf("Warning: Pdibl2 = %g is negative.\n", pParam->BSIM4pdibl2); - } + if (pParam->BSIM4pdibl1 < 0.0) + { fprintf(fplog, "Warning: Pdibl1 = %g is negative.\n", + pParam->BSIM4pdibl1); + printf("Warning: Pdibl1 = %g is negative.\n", pParam->BSIM4pdibl1); + } + if (pParam->BSIM4pdibl2 < 0.0) + { fprintf(fplog, "Warning: Pdibl2 = %g is negative.\n", + pParam->BSIM4pdibl2); + printf("Warning: Pdibl2 = %g is negative.\n", pParam->BSIM4pdibl2); + } /* Check stress effect parameters */ if((here->BSIM4sa > 0.0) && (here->BSIM4sb > 0.0) && - ((here->BSIM4nf == 1.0) || ((here->BSIM4nf > 1.0) && (here->BSIM4sd > 0.0))) ) + ((here->BSIM4nf == 1.0) || ((here->BSIM4nf > 1.0) && (here->BSIM4sd > 0.0))) ) { if (model->BSIM4lodk2 <= 0.0) { fprintf(fplog, "Warning: LODK2 = %g is not positive.\n",model->BSIM4lodk2); printf("Warning: LODK2 = %g is not positive.\n",model->BSIM4lodk2); } if (model->BSIM4lodeta0 <= 0.0) { fprintf(fplog, "Warning: LODETA0 = %g is not positive.\n",model->BSIM4lodeta0); - printf("Warning: LODETA0 = %g is not positive.\n",model->BSIM4lodeta0); + printf("Warning: LODETA0 = %g is not positive.\n",model->BSIM4lodeta0); } - } + } /* Check gate resistance parameters */ if (here->BSIM4rgateMod == 1) { if (model->BSIM4rshg <= 0.0) - printf("Warning: rshg should be positive for rgateMod = 1.\n"); - } + printf("Warning: rshg should be positive for rgateMod = 1.\n"); + } else if (here->BSIM4rgateMod == 2) { if (model->BSIM4rshg <= 0.0) printf("Warning: rshg <= 0.0 for rgateMod = 2.\n"); @@ -690,109 +691,131 @@ FILE *fplog; pParam->BSIM4moin); printf("Warning: Moin = %g is too large.\n", pParam->BSIM4moin); } - if(model->BSIM4capMod ==2) { - if (pParam->BSIM4acde < 0.1) - { fprintf(fplog, "Warning: Acde = %g is too small.\n", - pParam->BSIM4acde); - printf("Warning: Acde = %g is too small.\n", pParam->BSIM4acde); - } - if (pParam->BSIM4acde > 1.6) - { fprintf(fplog, "Warning: Acde = %g is too large.\n", - pParam->BSIM4acde); - printf("Warning: Acde = %g is too large.\n", pParam->BSIM4acde); - } - } + if(model->BSIM4capMod ==2) { + if (pParam->BSIM4acde < 0.1) + { fprintf(fplog, "Warning: Acde = %g is too small.\n", + pParam->BSIM4acde); + printf("Warning: Acde = %g is too small.\n", pParam->BSIM4acde); + } + if (pParam->BSIM4acde > 1.6) + { fprintf(fplog, "Warning: Acde = %g is too large.\n", + pParam->BSIM4acde); + printf("Warning: Acde = %g is too large.\n", pParam->BSIM4acde); + } + } /* Check overlap capacitance parameters */ if (model->BSIM4cgdo < 0.0) - { fprintf(fplog, "Warning: cgdo = %g is negative. Set to zero.\n", model->BSIM4cgdo); - printf("Warning: cgdo = %g is negative. Set to zero.\n", model->BSIM4cgdo); - model->BSIM4cgdo = 0.0; + { fprintf(fplog, "Warning: cgdo = %g is negative. Set to zero.\n", model->BSIM4cgdo); + printf("Warning: cgdo = %g is negative. Set to zero.\n", model->BSIM4cgdo); + model->BSIM4cgdo = 0.0; } if (model->BSIM4cgso < 0.0) - { fprintf(fplog, "Warning: cgso = %g is negative. Set to zero.\n", model->BSIM4cgso); - printf("Warning: cgso = %g is negative. Set to zero.\n", model->BSIM4cgso); - model->BSIM4cgso = 0.0; + { fprintf(fplog, "Warning: cgso = %g is negative. Set to zero.\n", model->BSIM4cgso); + 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; + { 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); - printf("Warning: tnoia = %g is negative. Set to zero.\n", model->BSIM4tnoia); - model->BSIM4tnoia = 0.0; - } - if (model->BSIM4tnoib < 0.0) - { fprintf(fplog, "Warning: tnoib = %g is negative. Set to zero.\n", model->BSIM4tnoib); - printf("Warning: tnoib = %g is negative. Set to zero.\n", model->BSIM4tnoib); - model->BSIM4tnoib = 0.0; + + /* v4.7 */ + if (model->BSIM4tnoiMod == 1 || model->BSIM4tnoiMod == 2) { + if (model->BSIM4tnoia < 0.0) { + fprintf(fplog, "Warning: tnoia = %g is negative. Set to zero.\n", model->BSIM4tnoia); + printf("Warning: tnoia = %g is negative. Set to zero.\n", model->BSIM4tnoia); + model->BSIM4tnoia = 0.0; + } + if (model->BSIM4tnoib < 0.0) { + fprintf(fplog, "Warning: tnoib = %g is negative. Set to zero.\n", model->BSIM4tnoib); + printf("Warning: tnoib = %g is negative. Set to zero.\n", model->BSIM4tnoib); + model->BSIM4tnoib = 0.0; + } + if (model->BSIM4rnoia < 0.0) { + fprintf(fplog, "Warning: rnoia = %g is negative. Set to zero.\n", model->BSIM4rnoia); + printf("Warning: rnoia = %g is negative. Set to zero.\n", model->BSIM4rnoia); + model->BSIM4rnoia = 0.0; + } + if (model->BSIM4rnoib < 0.0) { + fprintf(fplog, "Warning: rnoib = %g is negative. Set to zero.\n", model->BSIM4rnoib); + printf("Warning: rnoib = %g is negative. Set to zero.\n", model->BSIM4rnoib); + model->BSIM4rnoib = 0.0; + } } - if (model->BSIM4rnoia < 0.0) - { fprintf(fplog, "Warning: rnoia = %g is negative. Set to zero.\n", model->BSIM4rnoia); - printf("Warning: rnoia = %g is negative. Set to zero.\n", model->BSIM4rnoia); - model->BSIM4rnoia = 0.0; + /* v4.7 */ + if (model->BSIM4tnoiMod == 2) { + if (model->BSIM4tnoic < 0.0) { + fprintf(fplog, "Warning: tnoic = %g is negative. Set to zero.\n", model->BSIM4tnoic); + printf("Warning: tnoic = %g is negative. Set to zero.\n", model->BSIM4tnoic); + model->BSIM4tnoic = 0.0; + } + if (model->BSIM4rnoic < 0.0) { + fprintf(fplog, "Warning: rnoic = %g is negative. Set to zero.\n", model->BSIM4rnoic); + printf("Warning: rnoic = %g is negative. Set to zero.\n", model->BSIM4rnoic); + model->BSIM4rnoic = 0.0; + } } - if (model->BSIM4rnoib < 0.0) - { fprintf(fplog, "Warning: rnoib = %g is negative. Set to zero.\n", model->BSIM4rnoib); - printf("Warning: rnoib = %g is negative. Set to zero.\n", model->BSIM4rnoib); - model->BSIM4rnoib = 0.0; - } - } - if (model->BSIM4SjctEmissionCoeff < 0.0) - { fprintf(fplog, "Warning: Njs = %g is negative.\n", - model->BSIM4SjctEmissionCoeff); - printf("Warning: Njs = %g is negative.\n", - model->BSIM4SjctEmissionCoeff); - } - if (model->BSIM4DjctEmissionCoeff < 0.0) - { fprintf(fplog, "Warning: Njd = %g is negative.\n", - model->BSIM4DjctEmissionCoeff); - printf("Warning: Njd = %g is negative.\n", - model->BSIM4DjctEmissionCoeff); - } - - if (model->BSIM4njtsstemp < 0.0) - { fprintf(fplog, "Warning: Njts = %g is negative at temperature = %g.\n", + /* Limits of Njs and Njd modified in BSIM4.7 */ + if (model->BSIM4SjctEmissionCoeff < 0.1) { + fprintf(fplog, "Warning: Njs = %g is less than 0.1. Setting Njs to 0.1.\n", model->BSIM4SjctEmissionCoeff); + printf("Warning: Njs = %g is less than 0.1. Setting Njs to 0.1.\n", model->BSIM4SjctEmissionCoeff); + model->BSIM4SjctEmissionCoeff = 0.1; + } + else if (model->BSIM4SjctEmissionCoeff < 0.7) { + fprintf(fplog, "Warning: Njs = %g is less than 0.7.\n", model->BSIM4SjctEmissionCoeff); + printf("Warning: Njs = %g is less than 0.7.\n", model->BSIM4SjctEmissionCoeff); + } + if (model->BSIM4DjctEmissionCoeff < 0.1) { + fprintf(fplog, "Warning: Njd = %g is less than 0.1. Setting Njd to 0.1.\n", model->BSIM4DjctEmissionCoeff); + printf("Warning: Njd = %g is less than 0.1. Setting Njd to 0.1.\n", model->BSIM4DjctEmissionCoeff); + model->BSIM4DjctEmissionCoeff = 0.1; + } + else if (model->BSIM4DjctEmissionCoeff < 0.7) { + fprintf(fplog, "Warning: Njd = %g is less than 0.7.\n", model->BSIM4DjctEmissionCoeff); + printf("Warning: Njd = %g is less than 0.7.\n", model->BSIM4DjctEmissionCoeff); + } + + if (model->BSIM4njtsstemp < 0.0) + { fprintf(fplog, "Warning: Njts = %g is negative at temperature = %g.\n", model->BSIM4njtsstemp, ckt->CKTtemp); - printf("Warning: Njts = %g is negative at temperature = %g.\n", + printf("Warning: Njts = %g is negative at temperature = %g.\n", model->BSIM4njtsstemp, ckt->CKTtemp); - } - if (model->BSIM4njtsswstemp < 0.0) - { fprintf(fplog, "Warning: Njtssw = %g is negative at temperature = %g.\n", + } + if (model->BSIM4njtsswstemp < 0.0) + { fprintf(fplog, "Warning: Njtssw = %g is negative at temperature = %g.\n", model->BSIM4njtsswstemp, ckt->CKTtemp); - printf("Warning: Njtssw = %g is negative at temperature = %g.\n", - model->BSIM4njtsswstemp, ckt->CKTtemp); - } - if (model->BSIM4njtsswgstemp < 0.0) - { fprintf(fplog, "Warning: Njtsswg = %g is negative at temperature = %g.\n", - model->BSIM4njtsswgstemp, ckt->CKTtemp); - printf("Warning: Njtsswg = %g is negative at temperature = %g.\n", - model->BSIM4njtsswgstemp, ckt->CKTtemp); - } + printf("Warning: Njtssw = %g is negative at temperature = %g.\n", + model->BSIM4njtsswstemp, ckt->CKTtemp); + } + if (model->BSIM4njtsswgstemp < 0.0) + { fprintf(fplog, "Warning: Njtsswg = %g is negative at temperature = %g.\n", + model->BSIM4njtsswgstemp, ckt->CKTtemp); + printf("Warning: Njtsswg = %g is negative at temperature = %g.\n", + model->BSIM4njtsswgstemp, ckt->CKTtemp); + } - if (model->BSIM4njtsdGiven && model->BSIM4njtsdtemp < 0.0) - { fprintf(fplog, "Warning: Njtsd = %g is negative at temperature = %g.\n", - model->BSIM4njtsdtemp, ckt->CKTtemp); - printf("Warning: Njtsd = %g is negative at temperature = %g.\n", - model->BSIM4njtsdtemp, ckt->CKTtemp); - } - if (model->BSIM4njtsswdGiven && model->BSIM4njtsswdtemp < 0.0) - { fprintf(fplog, "Warning: Njtsswd = %g is negative at temperature = %g.\n", - model->BSIM4njtsswdtemp, ckt->CKTtemp); - printf("Warning: Njtsswd = %g is negative at temperature = %g.\n", - model->BSIM4njtsswdtemp, ckt->CKTtemp); - } - if (model->BSIM4njtsswgdGiven && model->BSIM4njtsswgdtemp < 0.0) - { fprintf(fplog, "Warning: Njtsswgd = %g is negative at temperature = %g.\n", - model->BSIM4njtsswgdtemp, ckt->CKTtemp); - printf("Warning: Njtsswgd = %g is negative at temperature = %g.\n", - model->BSIM4njtsswgdtemp, ckt->CKTtemp); - } + if (model->BSIM4njtsdGiven && model->BSIM4njtsdtemp < 0.0) + { fprintf(fplog, "Warning: Njtsd = %g is negative at temperature = %g.\n", + model->BSIM4njtsdtemp, ckt->CKTtemp); + printf("Warning: Njtsd = %g is negative at temperature = %g.\n", + model->BSIM4njtsdtemp, ckt->CKTtemp); + } + if (model->BSIM4njtsswdGiven && model->BSIM4njtsswdtemp < 0.0) + { fprintf(fplog, "Warning: Njtsswd = %g is negative at temperature = %g.\n", + model->BSIM4njtsswdtemp, ckt->CKTtemp); + printf("Warning: Njtsswd = %g is negative at temperature = %g.\n", + model->BSIM4njtsswdtemp, ckt->CKTtemp); + } + if (model->BSIM4njtsswgdGiven && model->BSIM4njtsswgdtemp < 0.0) + { fprintf(fplog, "Warning: Njtsswgd = %g is negative at temperature = %g.\n", + model->BSIM4njtsswgdtemp, ckt->CKTtemp); + printf("Warning: Njtsswgd = %g is negative at temperature = %g.\n", + model->BSIM4njtsswgdtemp, ckt->CKTtemp); + } if (model->BSIM4ntnoi < 0.0) { fprintf(fplog, "Warning: ntnoi = %g is negative. Set to zero.\n", model->BSIM4ntnoi); @@ -832,16 +855,16 @@ FILE *fplog; 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; - } - /*Move these checks to temp.c for sceff calculation*/ - /* - if (here->BSIM4sca < 0.0) + 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; + } + /*Move these checks to temp.c for sceff calculation*/ + /* + 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; @@ -861,11 +884,11 @@ FILE *fplog; 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); + fclose(fplog); } else { fprintf(stderr, "Warning: Can't open log file. Parameter checking skipped.\n"); diff --git a/src/spicelib/devices/bsim4/b4cvtest.c b/src/spicelib/devices/bsim4/b4cvtest.c index f5432bf04..e51cb2ba2 100644 --- a/src/spicelib/devices/bsim4/b4cvtest.c +++ b/src/spicelib/devices/bsim4/b4cvtest.c @@ -1,8 +1,8 @@ -/**** BSIM4.6.2 Released by Wenwei Yang 04/05/2008 ****/ +/**** BSIM4.7.0 Released by Darsen Lu 04/08/2011 ****/ /********** * Copyright 2006 Regents of the University of California. All rights reserved. - * File: b4cvtest.c of BSIM4.6.2. + * File: b4cvtest.c of BSIM4.7.0. * Author: 2000 Weidong Liu * Authors: 2001- Xuemei Xi, Mohan Dunga, Ali Niknejad, Chenming Hu. * Authors: 2006- Mohan Dunga, Ali Niknejad, Chenming Hu @@ -44,7 +44,7 @@ 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; + { if (here->BSIM4owner != ARCHme) continue; vds = model->BSIM4type * (*(ckt->CKTrhsOld + here->BSIM4dNodePrime) - *(ckt->CKTrhsOld + here->BSIM4sNodePrime)); @@ -93,7 +93,7 @@ double tol0, tol1, tol2, tol3, tol4, tol5, tol6; if (here->BSIM4mode >= 0) { Idtot = here->BSIM4cd + here->BSIM4csub - here->BSIM4cbd - + here->BSIM4Igidl; + + here->BSIM4Igidl; cdhat = Idtot - here->BSIM4gbd * delvbd_jct + (here->BSIM4gmbs + here->BSIM4gbbs + here->BSIM4ggidlb) * delvbs + (here->BSIM4gm + here->BSIM4gbgs + here->BSIM4ggidlg) * delvgs @@ -146,8 +146,8 @@ double tol0, tol1, tol2, tol3, tol4, tol5, tol6; */ if ((here->BSIM4off == 0) || (!(ckt->CKTmode & MODEINITFIX))) - { tol0 = ckt->CKTreltol * MAX(fabs(cdhat), fabs(Idtot)) - + ckt->CKTabstol; + { 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)) @@ -161,7 +161,7 @@ double tol0, tol1, tol2, tol3, tol4, tol5, tol6; if ((fabs(cdhat - Idtot) >= tol0) || (fabs(cseshat - Isestot) >= tol1) || (fabs(cdedhat - Idedtot) >= tol2)) - { ckt->CKTnoncon++; + { ckt->CKTnoncon++; return(OK); } @@ -172,25 +172,25 @@ double tol0, tol1, tol2, tol3, tol4, tol5, tol6; } Ibtot = here->BSIM4cbs + here->BSIM4cbd - - here->BSIM4Igidl - here->BSIM4Igisl - here->BSIM4csub; + - here->BSIM4Igidl - here->BSIM4Igisl - here->BSIM4csub; if (here->BSIM4mode >= 0) { cbhat = Ibtot + here->BSIM4gbd * delvbd_jct + here->BSIM4gbs * delvbs_jct - (here->BSIM4gbbs + here->BSIM4ggidlb) * delvbs - (here->BSIM4gbgs + here->BSIM4ggidlg) * delvgs - (here->BSIM4gbds + here->BSIM4ggidld) * delvds - - here->BSIM4ggislg * delvgd - here->BSIM4ggislb* delvbd + here->BSIM4ggisls * delvds ; - } - else - { cbhat = Ibtot + here->BSIM4gbs * delvbs_jct + here->BSIM4gbd + - here->BSIM4ggislg * delvgd - here->BSIM4ggislb* delvbd + here->BSIM4ggisls * delvds ; + } + else + { cbhat = Ibtot + here->BSIM4gbs * delvbs_jct + here->BSIM4gbd * delvbd_jct - (here->BSIM4gbbs + here->BSIM4ggislb) * delvbd - (here->BSIM4gbgs + here->BSIM4ggislg) * delvgd - + (here->BSIM4gbds + here->BSIM4ggisld - here->BSIM4ggidls) * delvds - - here->BSIM4ggidlg * delvgs - here->BSIM4ggidlb * delvbs; - } + + (here->BSIM4gbds + here->BSIM4ggisld - here->BSIM4ggidls) * delvds + - here->BSIM4ggidlg * delvgs - here->BSIM4ggidlb * delvbs; + } tol6 = ckt->CKTreltol * MAX(fabs(cbhat), - fabs(Ibtot)) + ckt->CKTabstol; + fabs(Ibtot)) + ckt->CKTabstol; if (fabs(cbhat - Ibtot) > tol6) - { ckt->CKTnoncon++; + { ckt->CKTnoncon++; return(OK); } } diff --git a/src/spicelib/devices/bsim4/b4del.c b/src/spicelib/devices/bsim4/b4del.c index f529c13f7..3d84b93b0 100644 --- a/src/spicelib/devices/bsim4/b4del.c +++ b/src/spicelib/devices/bsim4/b4del.c @@ -1,8 +1,8 @@ -/**** BSIM4.6.2 Released by Wenwei Yang 07/31/2008 ****/ +/**** BSIM4.7.0 Released by Darsen Lu 04/08/2011 ****/ /********** * Copyright 2006 Regents of the University of California. All rights reserved. - * File: b4del.c of BSIM4.6.2. + * File: b4del.c of BSIM4.7.0. * Author: 2000 Weidong Liu * Authors: 2001- Xuemei Xi, Mohan Dunga, Ali Niknejad, Chenming Hu. * Authors: 2006- Mohan Dunga, Ali Niknejad, Chenming Hu diff --git a/src/spicelib/devices/bsim4/b4dest.c b/src/spicelib/devices/bsim4/b4dest.c index f1003e180..6cc2e8a04 100644 --- a/src/spicelib/devices/bsim4/b4dest.c +++ b/src/spicelib/devices/bsim4/b4dest.c @@ -1,8 +1,8 @@ -/**** BSIM4.6.2 Released by Wenwei Yang 07/31/2008 ****/ +/**** BSIM4.7.0 Released by Darsen Lu 04/08/2011 ****/ /********** * Copyright 2006 Regents of the University of California. All rights reserved. - * File: b4dest.c of BSIM4.6.2. + * File: b4dest.c of BSIM4.7.0. * Author: 2000 Weidong Liu * Authors: 2001- Xuemei Xi, Mohan Dunga, Ali Niknejad, Chenming Hu. * Authors: 2006- Mohan Dunga, Ali Niknejad, Chenming Hu @@ -27,7 +27,7 @@ BSIM4model *oldmod = NULL; for (; mod ; mod = mod->BSIM4nextModel) { if(oldmod) FREE(oldmod); oldmod = mod; - prev = NULL; + prev = (BSIM4instance *)NULL; for (here = mod->BSIM4instances; here; here = here->BSIM4nextInstance) { if(prev) FREE(prev); prev = here; diff --git a/src/spicelib/devices/bsim4/b4geo.c b/src/spicelib/devices/bsim4/b4geo.c index 38ce20563..c3484c8d8 100644 --- a/src/spicelib/devices/bsim4/b4geo.c +++ b/src/spicelib/devices/bsim4/b4geo.c @@ -1,8 +1,8 @@ -/**** BSIM4.6.2 Released by Wenwei Yang 07/31/2008 ****/ +/**** BSIM4.7.0 Released by Darsen Lu 04/08/2011 ****/ /********** * Copyright 2006 Regents of the University of California. All rights reserved. - * File: b4geo.c of BSIM4.6.2. + * File: b4geo.c of BSIM4.7.0. * Author: 2000 Weidong Liu * Authors: 2001- Xuemei Xi, Mohan Dunga, Ali Niknejad, Chenming Hu. * Authors: 2006- Mohan Dunga, Ali Niknejad, Chenming Hu @@ -13,6 +13,7 @@ #include "ngspice.h" #include "bsim4def.h" + /* * WDLiu: * This subrutine is a special module to process the geometry dependent @@ -21,12 +22,10 @@ */ int -BSIM4RdsEndIso(double, double, double, double, double, double, int, int, double *); -int -BSIM4RdsEndSha(double, double, double, double, double, double, int, int, double *); - -static int -BSIM4NumFingerDiff(double nf, int minSD, double *nuIntD, double *nuEndD, double *nuIntS, double *nuEndS) +BSIM4NumFingerDiff( +double nf, +int minSD, +double *nuIntD, double *nuEndD, double *nuIntS, double *nuEndS) { int NF; NF = (int)nf; @@ -53,7 +52,11 @@ return 0; int -BSIM4PAeffGeo(double nf, int geo, int minSD, double Weffcj, double DMCG, double DMCI, double DMDG, double *Ps, double *Pd, double *As, double *Ad) +BSIM4PAeffGeo( +double nf, +int geo, int minSD, +double Weffcj, double DMCG, double DMCI, double DMDG, +double *Ps, double *Pd, double *As, double *Ad) { double T0, T1, T2; double ADiso, ADsha, ADmer, ASiso, ASsha, ASmer; @@ -150,9 +153,14 @@ return 0; int -BSIM4RdseffGeo(double nf, int geo, int rgeo, int minSD, double Weffcj, double Rsh, double DMCG, double DMCI, double DMDG, int Type, double *Rtot) +BSIM4RdseffGeo( +double nf, +int geo, int rgeo, int minSD, +double Weffcj, double Rsh, double DMCG, double DMCI, double DMDG, +int Type, +double *Rtot) { -double Rint = 0.0, Rend = 0.0; +double Rint=0.0, Rend = 0.0; double nuIntD = 0.0, nuEndD = 0.0, nuIntS = 0.0, nuEndS = 0.0; if (geo < 9) /* since geo = 9 and 10 only happen when nf = even */ @@ -265,9 +273,13 @@ return 0; int -BSIM4RdsEndIso(double Weffcj, double Rsh, double DMCG, double DMCI, double DMDG, double nuEnd, int rgeo, int Type, double *Rend) +BSIM4RdsEndIso( +double Weffcj, double Rsh, double DMCG, double DMCI, double DMDG, +double nuEnd, +int rgeo, int Type, +double *Rend) { - NG_IGNORE(DMDG); + NG_IGNORE(DMDG); if (Type == 1) { switch(rgeo) @@ -322,7 +334,11 @@ return 0; int -BSIM4RdsEndSha(double Weffcj, double Rsh, double DMCG, double DMCI, double DMDG, double nuEnd, int rgeo, int Type, double *Rend) +BSIM4RdsEndSha( +double Weffcj, double Rsh, double DMCG, double DMCI, double DMDG, +double nuEnd, +int rgeo, int Type, +double *Rend) { NG_IGNORE(DMCI); NG_IGNORE(DMDG); diff --git a/src/spicelib/devices/bsim4/b4getic.c b/src/spicelib/devices/bsim4/b4getic.c index 8f192995c..030cd55f0 100644 --- a/src/spicelib/devices/bsim4/b4getic.c +++ b/src/spicelib/devices/bsim4/b4getic.c @@ -1,8 +1,8 @@ -/**** BSIM4.6.2 Released by Wenwei Yang 07/31/2008****/ +/**** BSIM4.7.0 Released by Darsen Lu 04/08/2011 ****/ /********** * Copyright 2006 Regents of the University of California. All rights reserved. - * File: b4getic.c of BSIM4.6.2. + * File: b4getic.c of BSIM4.7.0. * Author: 2000 Weidong Liu * Authors: 2001- Xuemei Xi, Mohan Dunga, Ali Niknejad, Chenming Hu. * Authors: 2006- Mohan Dunga, Ali Niknejad, Chenming Hu @@ -28,13 +28,13 @@ BSIM4instance *here; for (; model ; model = model->BSIM4nextModel) { for (here = model->BSIM4instances; here; here = here->BSIM4nextInstance) { if (here->BSIM4owner != ARCHme) continue; - if (!here->BSIM4icVDSGiven) - { here->BSIM4icVDS = *(ckt->CKTrhs + here->BSIM4dNode) - - *(ckt->CKTrhs + here->BSIM4sNode); + if (!here->BSIM4icVDSGiven) + { here->BSIM4icVDS = *(ckt->CKTrhs + here->BSIM4dNode) + - *(ckt->CKTrhs + here->BSIM4sNode); } if (!here->BSIM4icVGSGiven) - { here->BSIM4icVGS = *(ckt->CKTrhs + here->BSIM4gNodeExt) - - *(ckt->CKTrhs + here->BSIM4sNode); + { here->BSIM4icVGS = *(ckt->CKTrhs + here->BSIM4gNodeExt) + - *(ckt->CKTrhs + here->BSIM4sNode); } if(!here->BSIM4icVBSGiven) { here->BSIM4icVBS = *(ckt->CKTrhs + here->BSIM4bNode) diff --git a/src/spicelib/devices/bsim4/b4ld.c b/src/spicelib/devices/bsim4/b4ld.c index 8a075c94b..11a752682 100644 --- a/src/spicelib/devices/bsim4/b4ld.c +++ b/src/spicelib/devices/bsim4/b4ld.c @@ -1,9 +1,8 @@ -/**** BSIM4.6.2 Released by Wenwei Yang 07/31/2008****/ -/**** BSIM4.6.5 Update ngspice 09/22/2009 ****/ +/**** BSIM4.7.0 Released by Darsen Lu 04/08/2011 ****/ /**** OpenMP support ngspice 06/28/2010 ****/ /********** * Copyright 2006 Regents of the University of California. All rights reserved. - * File: b4ld.c of BSIM4.6.2. + * File: b4ld.c of BSIM4.7.0. * Author: 2000 Weidong Liu * Authors: 2001- Xuemei Xi, Mohan Dunga, Ali Niknejad, Chenming Hu. * Authors: 2006- Mohan Dunga, Ali Niknejad, Chenming Hu @@ -19,6 +18,7 @@ * Modified by Mohan Dunga, 12/13/2006. * Modified by Mohan Dunga, Wenwei Yang, 05/18/2007. * Modified by Wenwei Yang, 07/31/2008. + * Modified by Tanvir Morshed, Darsen Lu 03/27/2011 **********/ @@ -31,11 +31,10 @@ #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_EXPL 2.688117142e+43 +#define MIN_EXPL 3.720075976e-44 +#define EXPL_THRESHOLD 100.0 + #define MAX_EXP 5.834617425e14 #define MIN_EXP 1.713908431e-15 #define EXP_THRESHOLD 34.0 @@ -60,7 +59,6 @@ } \ } - #ifdef USE_OMP4 int BSIM4LoadOMP(BSIM4instance *here, CKTcircuit *ckt); void BSIM4LoadRhsMat(GENmodel *inModel, CKTcircuit *ckt); @@ -108,7 +106,7 @@ double vgs_eff, vgd_eff, dvgs_eff_dvg, dvgd_eff_dvg; 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; +double Isestot, cseshat, Idedtot, cdedhat; #ifndef NEWCONV double tol0, tol1, tol2, tol3, tol4, tol5, tol6; #endif @@ -128,9 +126,9 @@ double delvdbs, delvdbd, delvsbs; double delvbd_jct, delvbs_jct, vbs_jct, vbd_jct; double SourceSatCurrent, DrainSatCurrent; -double ag0, qgb, von, cbhat=0.0, VgstNVt, ExpVgst; +double ag0, qgb, von, cbhat, VgstNVt, ExpVgst; double ceqqb, ceqqd, ceqqg, ceqqjd=0.0, ceqqjs=0.0, ceq, geq; -double cdrain, cdhat=0.0, ceqdrn, ceqbd, ceqbs, ceqjd, ceqjs, gjbd, gjbs; +double cdrain, cdhat, ceqdrn, ceqbd, ceqbs, ceqjd, ceqjs, gjbd, gjbs; double czbd, czbdsw, czbdswg, czbs, czbssw, czbsswg, evbd, evbs, arg, sarg; double delvbd, delvbs, delvds, delvgd, delvgs; double Vfbeff, dVfbeff_dVg, dVfbeff_dVb, V3, V4; @@ -155,8 +153,9 @@ double Istoteq, gIstotg, gIstotd, gIstots, gIstotb; double Idtoteq, gIdtotg, gIdtotd, gIdtots, gIdtotb; double Ibtoteq, gIbtotg, gIbtotd, gIbtots, gIbtotb; double Igtoteq, gIgtotg, gIgtotd, gIgtots, gIgtotb; -double Igstot=0.0, cgshat=0.0, Igdtot=0.0, cgdhat=0.0, Igbtot=0.0, cgbhat=0.0; +double Igstot, cgshat, Igdtot, cgdhat, Igbtot, cgbhat; double Vgs_eff, Vfb=0.0, Vth_NarrowW; +/* double Vgd_eff, dVgd_eff_dVg; v4.7.0 */ 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, Vtm0; @@ -191,6 +190,7 @@ double Cclm, dCclm_dVg, dCclm_dVd, dCclm_dVb; double FP, dFP_dVg, PvagTerm, dPvagTerm_dVg, dPvagTerm_dVd, dPvagTerm_dVb; double VADITS, dVADITS_dVg, dVADITS_dVd; double Lpe_Vb, dDITS_Sft_dVb, dDITS_Sft_dVd; +double DITS_Sft2, dDITS_Sft2_dVd; /* v4.7 New DITS */ double VACLM, dVACLM_dVg, dVACLM_dVd, dVACLM_dVb; double VADIBL, dVADIBL_dVg, dVADIBL_dVd, dVADIBL_dVb; double Xdep, dXdep_dVb, lt1, dlt1_dVb, ltw, dltw_dVb, Delt_vth, dDelt_vth_dVb; @@ -227,7 +227,7 @@ double gbdpdp, gbdpg, gbdpb, gbdpsp; double qgdo, qgso, cgdo, cgso; double Cgg, Cgd, Cgb, Cdg, Cdd, Cds; double Csg, Csd, Css, Csb, Cbg, Cbd, Cbb; -double Cgg1, Cgb1, Cgd1, Cbg1, Cbb1, Cbd1, Qac0, Qsub0; +double Cgg1, Cgd1, Cgb1, Cbg1, Cbb1, Cbd1, Qac0, Qsub0; double dQac0_dVg, dQac0_dVb, dQsub0_dVg, dQsub0_dVd, dQsub0_dVb; double ggidld, ggidlg, ggidlb, ggislg, ggislb, ggisls; double Igisl, Ggislg, Ggislb, Ggisls; @@ -260,10 +260,10 @@ for (; model != NULL; model = model->BSIM4nextModel) Check = Check1 = Check2 = 1; ByPass = 0; - pParam = here->pParam; + pParam = here->pParam; if ((ckt->CKTmode & MODEINITSMSIG)) - { vds = *(ckt->CKTstate0 + here->BSIM4vds); + { vds = *(ckt->CKTstate0 + here->BSIM4vds); vgs = *(ckt->CKTstate0 + here->BSIM4vgs); vbs = *(ckt->CKTstate0 + here->BSIM4vbs); vges = *(ckt->CKTstate0 + here->BSIM4vges); @@ -275,8 +275,8 @@ for (; model != NULL; model = model->BSIM4nextModel) qdef = *(ckt->CKTstate0 + here->BSIM4qdef); } - else if ((ckt->CKTmode & MODEINITTRAN)) - { vds = *(ckt->CKTstate1 + here->BSIM4vds); + else if ((ckt->CKTmode & MODEINITTRAN)) + { vds = *(ckt->CKTstate1 + here->BSIM4vds); vgs = *(ckt->CKTstate1 + here->BSIM4vgs); vbs = *(ckt->CKTstate1 + here->BSIM4vbs); vges = *(ckt->CKTstate1 + here->BSIM4vges); @@ -288,44 +288,44 @@ for (; model != NULL; model = model->BSIM4nextModel) qdef = *(ckt->CKTstate1 + here->BSIM4qdef); } - else if ((ckt->CKTmode & MODEINITJCT) && !here->BSIM4off) - { vds = model->BSIM4type * here->BSIM4icVDS; + else if ((ckt->CKTmode & MODEINITJCT) && !here->BSIM4off) + { vds = model->BSIM4type * here->BSIM4icVDS; vgs = vges = vgms = model->BSIM4type * here->BSIM4icVGS; vbs = vdbs = vsbs = model->BSIM4type * here->BSIM4icVBS; - if (vds > 0.0) - { vdes = vds + 0.01; - vses = -0.01; - } - else if (vds < 0.0) + if (vds > 0.0) + { vdes = vds + 0.01; + vses = -0.01; + } + else if (vds < 0.0) { vdes = vds - 0.01; vses = 0.01; } - else - vdes = vses = 0.0; + else + vdes = vses = 0.0; qdef = 0.0; if ((vds == 0.0) && (vgs == 0.0) && (vbs == 0.0) && ((ckt->CKTmode & (MODETRAN | MODEAC|MODEDCOP | MODEDCTRANCURVE)) || (!(ckt->CKTmode & MODEUIC)))) - { vds = 0.1; - vdes = 0.11; - vses = -0.01; + { vds = 0.1; + vdes = 0.11; + vses = -0.01; vgs = vges = vgms = model->BSIM4type * here->BSIM4vth0 + 0.1; vbs = vdbs = vsbs = 0.0; } } - else if ((ckt->CKTmode & (MODEINITJCT | MODEINITFIX)) && + else if ((ckt->CKTmode & (MODEINITJCT | MODEINITFIX)) && (here->BSIM4off)) { vds = vgs = vbs = vges = vgms = 0.0; vdbs = vsbs = vdes = vses = qdef = 0.0; - } + } else - { + { #ifndef PREDICTOR if ((ckt->CKTmode & MODEINITPRED)) - { xfact = ckt->CKTdelta / ckt->CKTdeltaOld[1]; + { xfact = ckt->CKTdelta / ckt->CKTdeltaOld[1]; *(ckt->CKTstate0 + here->BSIM4vds) = *(ckt->CKTstate1 + here->BSIM4vds); vds = (1.0 + xfact)* (*(ckt->CKTstate1 + here->BSIM4vds)) @@ -374,8 +374,8 @@ for (; model != NULL; model = model->BSIM4nextModel) qdef = (1.0 + xfact)* (*(ckt->CKTstate1 + here->BSIM4qdef)) -(xfact * (*(ckt->CKTstate2 + here->BSIM4qdef))); } - else - { + else + { #endif /* PREDICTOR */ vds = model->BSIM4type * (*(ckt->CKTrhsOld + here->BSIM4dNodePrime) @@ -412,27 +412,27 @@ for (; model != NULL; model = model->BSIM4nextModel) vgdo = *(ckt->CKTstate0 + here->BSIM4vgs) - *(ckt->CKTstate0 + here->BSIM4vds); - vgedo = *(ckt->CKTstate0 + here->BSIM4vges) + vgedo = *(ckt->CKTstate0 + here->BSIM4vges) - *(ckt->CKTstate0 + here->BSIM4vds); - vgmdo = *(ckt->CKTstate0 + here->BSIM4vgms) + vgmdo = *(ckt->CKTstate0 + here->BSIM4vgms) - *(ckt->CKTstate0 + here->BSIM4vds); vbd = vbs - vds; vdbd = vdbs - vds; vgd = vgs - vds; - vged = vges - vds; - vgmd = vgms - vds; + vged = vges - vds; + vgmd = vgms - vds; delvbd = vbd - *(ckt->CKTstate0 + here->BSIM4vbd); delvdbd = vdbd - *(ckt->CKTstate0 + here->BSIM4vdbd); delvgd = vgd - vgdo; - delvged = vged - vgedo; - delvgmd = vgmd - vgmdo; + delvged = vged - vgedo; + delvgmd = vgmd - vgmdo; delvds = vds - *(ckt->CKTstate0 + here->BSIM4vds); delvgs = vgs - *(ckt->CKTstate0 + here->BSIM4vgs); - delvges = vges - *(ckt->CKTstate0 + here->BSIM4vges); - delvgms = vgms - *(ckt->CKTstate0 + here->BSIM4vgms); + delvges = vges - *(ckt->CKTstate0 + here->BSIM4vges); + delvgms = vgms - *(ckt->CKTstate0 + here->BSIM4vgms); delvbs = vbs - *(ckt->CKTstate0 + here->BSIM4vbs); delvdbs = vdbs - *(ckt->CKTstate0 + here->BSIM4vdbs); delvsbs = vsbs - *(ckt->CKTstate0 + here->BSIM4vsbs); @@ -440,37 +440,37 @@ for (; model != NULL; model = model->BSIM4nextModel) delvses = vses - (*(ckt->CKTstate0 + here->BSIM4vses)); vdedo = *(ckt->CKTstate0 + here->BSIM4vdes) - *(ckt->CKTstate0 + here->BSIM4vds); - delvdes = vdes - *(ckt->CKTstate0 + here->BSIM4vdes); + delvdes = vdes - *(ckt->CKTstate0 + here->BSIM4vdes); delvded = vdes - vds - vdedo; delvbd_jct = (!here->BSIM4rbodyMod) ? delvbd : delvdbd; delvbs_jct = (!here->BSIM4rbodyMod) ? delvbs : delvsbs; if (here->BSIM4mode >= 0) { Idtot = here->BSIM4cd + here->BSIM4csub - here->BSIM4cbd - + here->BSIM4Igidl; + + here->BSIM4Igidl; cdhat = Idtot - here->BSIM4gbd * delvbd_jct + (here->BSIM4gmbs + here->BSIM4gbbs + here->BSIM4ggidlb) * delvbs + (here->BSIM4gm + here->BSIM4gbgs + here->BSIM4ggidlg) * delvgs + (here->BSIM4gds + here->BSIM4gbds + here->BSIM4ggidld) * delvds; Ibtot = here->BSIM4cbs + here->BSIM4cbd - - here->BSIM4Igidl - here->BSIM4Igisl - here->BSIM4csub; + - here->BSIM4Igidl - here->BSIM4Igisl - here->BSIM4csub; cbhat = Ibtot + here->BSIM4gbd * delvbd_jct + here->BSIM4gbs * delvbs_jct - (here->BSIM4gbbs + here->BSIM4ggidlb) * delvbs - (here->BSIM4gbgs + here->BSIM4ggidlg) * delvgs - - (here->BSIM4gbds + here->BSIM4ggidld - here->BSIM4ggisls) * delvds - - here->BSIM4ggislg * delvgd - here->BSIM4ggislb* delvbd; + - (here->BSIM4gbds + here->BSIM4ggidld - here->BSIM4ggisls) * delvds + - here->BSIM4ggislg * delvgd - here->BSIM4ggislb* delvbd; - Igstot = here->BSIM4Igs + here->BSIM4Igcs; - cgshat = Igstot + (here->BSIM4gIgsg + here->BSIM4gIgcsg) * delvgs - + here->BSIM4gIgcsd * delvds + here->BSIM4gIgcsb * delvbs; + Igstot = here->BSIM4Igs + here->BSIM4Igcs; + cgshat = Igstot + (here->BSIM4gIgsg + here->BSIM4gIgcsg) * delvgs + + here->BSIM4gIgcsd * delvds + here->BSIM4gIgcsb * delvbs; - Igdtot = here->BSIM4Igd + here->BSIM4Igcd; - cgdhat = Igdtot + here->BSIM4gIgdg * delvgd + here->BSIM4gIgcdg * delvgs + Igdtot = here->BSIM4Igd + here->BSIM4Igcd; + cgdhat = Igdtot + here->BSIM4gIgdg * delvgd + here->BSIM4gIgcdg * delvgs + here->BSIM4gIgcdd * delvds + here->BSIM4gIgcdb * delvbs; - Igbtot = here->BSIM4Igb; - cgbhat = here->BSIM4Igb + here->BSIM4gIgbg * delvgs + here->BSIM4gIgbd - * delvds + here->BSIM4gIgbb * delvbs; + Igbtot = here->BSIM4Igb; + cgbhat = here->BSIM4Igb + here->BSIM4gIgbg * delvgs + here->BSIM4gIgbd + * delvds + here->BSIM4gIgbb * delvbs; } else { Idtot = here->BSIM4cd + here->BSIM4cbd - here->BSIM4Igidl; /* bugfix */ @@ -479,12 +479,12 @@ for (; model != NULL; model = model->BSIM4nextModel) - (here->BSIM4gds + here->BSIM4ggidls) * delvds - here->BSIM4ggidlg * delvgs - here->BSIM4ggidlb * delvbs; Ibtot = here->BSIM4cbs + here->BSIM4cbd - - here->BSIM4Igidl - here->BSIM4Igisl - here->BSIM4csub; + - here->BSIM4Igidl - here->BSIM4Igisl - here->BSIM4csub; cbhat = Ibtot + here->BSIM4gbs * delvbs_jct + here->BSIM4gbd * delvbd_jct - (here->BSIM4gbbs + here->BSIM4ggislb) * delvbd - (here->BSIM4gbgs + here->BSIM4ggislg) * delvgd - + (here->BSIM4gbds + here->BSIM4ggisld - here->BSIM4ggidls) * delvds - - here->BSIM4ggidlg * delvgs - here->BSIM4ggidlb * delvbs; + + (here->BSIM4gbds + here->BSIM4ggisld - here->BSIM4ggidls) * delvds + - here->BSIM4ggidlg * delvgs - here->BSIM4ggidlb * delvbs; Igstot = here->BSIM4Igs + here->BSIM4Igcd; cgshat = Igstot + here->BSIM4gIgsg * delvgs + here->BSIM4gIgcdg * delvgd @@ -524,10 +524,10 @@ for (; model != NULL; model = model->BSIM4nextModel) fabs(*(ckt->CKTstate0 + here->BSIM4vbs))) + ckt->CKTvoltTol))) if ((fabs(delvbd) < (ckt->CKTreltol * MAX(fabs(vbd), fabs(*(ckt->CKTstate0 + here->BSIM4vbd))) + ckt->CKTvoltTol))) - if ((here->BSIM4rgateMod == 0) || (here->BSIM4rgateMod == 1) - || (fabs(delvges) < (ckt->CKTreltol * MAX(fabs(vges), - fabs(*(ckt->CKTstate0 + here->BSIM4vges))) + ckt->CKTvoltTol))) - if ((here->BSIM4rgateMod != 3) || (fabs(delvgms) < (ckt->CKTreltol + if ((here->BSIM4rgateMod == 0) || (here->BSIM4rgateMod == 1) + || (fabs(delvges) < (ckt->CKTreltol * MAX(fabs(vges), + fabs(*(ckt->CKTstate0 + here->BSIM4vges))) + ckt->CKTvoltTol))) + if ((here->BSIM4rgateMod != 3) || (fabs(delvgms) < (ckt->CKTreltol * MAX(fabs(vgms), fabs(*(ckt->CKTstate0 + here->BSIM4vgms))) + ckt->CKTvoltTol))) if ((!here->BSIM4rbodyMod) || (fabs(delvdbs) < (ckt->CKTreltol @@ -562,8 +562,8 @@ for (; model != NULL; model = model->BSIM4nextModel) { vds = *(ckt->CKTstate0 + here->BSIM4vds); vgs = *(ckt->CKTstate0 + here->BSIM4vgs); vbs = *(ckt->CKTstate0 + here->BSIM4vbs); - vges = *(ckt->CKTstate0 + here->BSIM4vges); - vgms = *(ckt->CKTstate0 + here->BSIM4vgms); + vges = *(ckt->CKTstate0 + here->BSIM4vges); + vgms = *(ckt->CKTstate0 + here->BSIM4vgms); vbd = *(ckt->CKTstate0 + here->BSIM4vbd); vdbs = *(ckt->CKTstate0 + here->BSIM4vdbs); @@ -574,9 +574,9 @@ for (; model != NULL; model = model->BSIM4nextModel) vgd = vgs - vds; vgb = vgs - vbs; - vged = vges - vds; - vgmd = vgms - vds; - vgmb = vgms - vbs; + vged = vges - vds; + vgmd = vgms - vds; + vgmb = vgms - vbs; vbs_jct = (!here->BSIM4rbodyMod) ? vbs : vsbs; vbd_jct = (!here->BSIM4rbodyMod) ? vbd : vdbd; @@ -589,26 +589,26 @@ for (; model != NULL; model = model->BSIM4nextModel) if ((ckt->CKTmode & (MODETRAN | MODEAC)) || ((ckt->CKTmode & MODETRANOP) && (ckt->CKTmode & MODEUIC))) - { ByPass = 1; + { ByPass = 1; qgate = here->BSIM4qgate; qbulk = here->BSIM4qbulk; qdrn = here->BSIM4qdrn; - cgdo = here->BSIM4cgdo; - qgdo = here->BSIM4qgdo; + cgdo = here->BSIM4cgdo; + qgdo = here->BSIM4qgdo; cgso = here->BSIM4cgso; qgso = here->BSIM4qgso; - goto line755; + goto line755; } - else - goto line850; + else + goto line850; } #endif /*NOBYPASS*/ von = here->BSIM4von; if (*(ckt->CKTstate0 + here->BSIM4vds) >= 0.0) - { vgs = DEVfetlim(vgs, *(ckt->CKTstate0 + here->BSIM4vgs), von); + { vgs = DEVfetlim(vgs, *(ckt->CKTstate0 + here->BSIM4vgs), von); vds = vgs - vgd; vds = DEVlimvds(vds, *(ckt->CKTstate0 + here->BSIM4vds)); vgd = vgs - vds; @@ -624,18 +624,18 @@ for (; model != NULL; model = model->BSIM4nextModel) } if (model->BSIM4rdsMod) - { vdes = DEVlimvds(vdes, *(ckt->CKTstate0 + here->BSIM4vdes)); - vses = -DEVlimvds(-vses, -(*(ckt->CKTstate0 + here->BSIM4vses))); - } + { vdes = DEVlimvds(vdes, *(ckt->CKTstate0 + here->BSIM4vdes)); + vses = -DEVlimvds(-vses, -(*(ckt->CKTstate0 + here->BSIM4vses))); + } } - else - { vgd = DEVfetlim(vgd, vgdo, von); + else + { vgd = DEVfetlim(vgd, vgdo, von); vds = vgs - vgd; vds = -DEVlimvds(-vds, -(*(ckt->CKTstate0 + here->BSIM4vds))); vgs = vgd + vds; - if (here->BSIM4rgateMod == 3) + if (here->BSIM4rgateMod == 3) { vged = DEVfetlim(vged, vgedo, von); vges = vged + vds; vgmd = DEVfetlim(vgmd, vgmdo, von); @@ -653,7 +653,7 @@ for (; model != NULL; model = model->BSIM4nextModel) } if (vds >= 0.0) - { vbs = DEVpnjlim(vbs, *(ckt->CKTstate0 + here->BSIM4vbs), + { vbs = DEVpnjlim(vbs, *(ckt->CKTstate0 + here->BSIM4vbs), CONSTvt0, model->BSIM4vcrit, &Check); vbd = vbs - vds; if (here->BSIM4rbodyMod) @@ -668,7 +668,7 @@ for (; model != NULL; model = model->BSIM4nextModel) Check = 1; } } - else + else { vbd = DEVpnjlim(vbd, *(ckt->CKTstate0 + here->BSIM4vbd), CONSTvt0, model->BSIM4vcrit, &Check); vbs = vbd + vds; @@ -693,9 +693,9 @@ for (; model != NULL; model = model->BSIM4nextModel) vbd = vbs - vds; vgd = vgs - vds; vgb = vgs - vbs; - vged = vges - vds; - vgmd = vgms - vds; - vgmb = vgms - vbs; + vged = vges - vds; + vgmd = vgms - vds; + vgmb = vgms - vbs; vdbd = vdbs - vds; vbs_jct = (!here->BSIM4rbodyMod) ? vbs : vsbs; @@ -703,9 +703,12 @@ for (; model != NULL; model = model->BSIM4nextModel) /* Source/drain junction diode DC model begins */ Nvtms = model->BSIM4vtm * model->BSIM4SjctEmissionCoeff; - if ((here->BSIM4Aseff <= 0.0) && (here->BSIM4Pseff <= 0.0)) - { SourceSatCurrent = 0.0; - } +/* if ((here->BSIM4Aseff <= 0.0) && (here->BSIM4Pseff <= 0.0)) + { SourceSatCurrent = 1.0e-14; + } v4.7 */ + if ((here->BSIM4Aseff <= 0.0) && (here->BSIM4Pseff <= 0.0)) + { SourceSatCurrent = 0.0; + } else { SourceSatCurrent = here->BSIM4Aseff * model->BSIM4SjctTempSatCurDensity + here->BSIM4Pseff * model->BSIM4SjctSidewallTempSatCurDensity @@ -713,56 +716,56 @@ for (; model != NULL; model = model->BSIM4nextModel) * model->BSIM4SjctGateSidewallTempSatCurDensity; } - if (SourceSatCurrent <= 0.0) - { here->BSIM4gbs = ckt->CKTgmin; + if (SourceSatCurrent <= 0.0) + { here->BSIM4gbs = ckt->CKTgmin; here->BSIM4cbs = here->BSIM4gbs * vbs_jct; } else - { switch(model->BSIM4dioMod) + { switch(model->BSIM4dioMod) { case 0: evbs = exp(vbs_jct / Nvtms); T1 = model->BSIM4xjbvs * exp(-(model->BSIM4bvs + vbs_jct) / Nvtms); - /* WDLiu: Magic T1 in this form; different from BSIM4 beta. */ - here->BSIM4gbs = SourceSatCurrent * (evbs + T1) / Nvtms + ckt->CKTgmin; - here->BSIM4cbs = SourceSatCurrent * (evbs + here->BSIM4XExpBVS - - T1 - 1.0) + ckt->CKTgmin * vbs_jct; - break; + /* WDLiu: Magic T1 in this form; different from BSIM4 beta. */ + here->BSIM4gbs = SourceSatCurrent * (evbs + T1) / Nvtms + ckt->CKTgmin; + here->BSIM4cbs = SourceSatCurrent * (evbs + here->BSIM4XExpBVS + - T1 - 1.0) + ckt->CKTgmin * vbs_jct; + break; case 1: - T2 = vbs_jct / Nvtms; - if (T2 < -EXP_THRESHOLD) - { here->BSIM4gbs = ckt->CKTgmin; + T2 = vbs_jct / Nvtms; + if (T2 < -EXP_THRESHOLD) + { here->BSIM4gbs = ckt->CKTgmin; here->BSIM4cbs = SourceSatCurrent * (MIN_EXP - 1.0) + ckt->CKTgmin * vbs_jct; } - else if (vbs_jct <= here->BSIM4vjsmFwd) - { evbs = exp(T2); - here->BSIM4gbs = SourceSatCurrent * evbs / Nvtms + ckt->CKTgmin; + else if (vbs_jct <= here->BSIM4vjsmFwd) + { evbs = exp(T2); + here->BSIM4gbs = SourceSatCurrent * evbs / Nvtms + ckt->CKTgmin; here->BSIM4cbs = SourceSatCurrent * (evbs - 1.0) + ckt->CKTgmin * vbs_jct; - } - else - { T0 = here->BSIM4IVjsmFwd / Nvtms; + } + else + { T0 = here->BSIM4IVjsmFwd / Nvtms; here->BSIM4gbs = T0 + ckt->CKTgmin; here->BSIM4cbs = here->BSIM4IVjsmFwd - SourceSatCurrent + T0 - * (vbs_jct - here->BSIM4vjsmFwd) + ckt->CKTgmin * vbs_jct; - } + * (vbs_jct - here->BSIM4vjsmFwd) + ckt->CKTgmin * vbs_jct; + } break; case 2: if (vbs_jct < here->BSIM4vjsmRev) { T0 = vbs_jct / Nvtms; if (T0 < -EXP_THRESHOLD) { evbs = MIN_EXP; - devbs_dvb = 0.0; - } + devbs_dvb = 0.0; + } else - { evbs = exp(T0); + { evbs = exp(T0); devbs_dvb = evbs / Nvtms; - } + } - T1 = evbs - 1.0; - T2 = here->BSIM4IVjsmRev + here->BSIM4SslpRev - * (vbs_jct - here->BSIM4vjsmRev); - here->BSIM4gbs = devbs_dvb * T2 + T1 * here->BSIM4SslpRev + ckt->CKTgmin; + T1 = evbs - 1.0; + T2 = here->BSIM4IVjsmRev + here->BSIM4SslpRev + * (vbs_jct - here->BSIM4vjsmRev); + here->BSIM4gbs = devbs_dvb * T2 + T1 * here->BSIM4SslpRev + ckt->CKTgmin; here->BSIM4cbs = T1 * T2 + ckt->CKTgmin * vbs_jct; } else if (vbs_jct <= here->BSIM4vjsmFwd) @@ -776,34 +779,37 @@ for (; model != NULL; model = model->BSIM4nextModel) devbs_dvb = evbs / Nvtms; } - T1 = (model->BSIM4bvs + vbs_jct) / Nvtms; + T1 = (model->BSIM4bvs + vbs_jct) / Nvtms; if (T1 > EXP_THRESHOLD) { T2 = MIN_EXP; - T3 = 0.0; - } + T3 = 0.0; + } else - { T2 = exp(-T1); - T3 = -T2 /Nvtms; - } + { T2 = exp(-T1); + T3 = -T2 /Nvtms; + } here->BSIM4gbs = SourceSatCurrent * (devbs_dvb - model->BSIM4xjbvs * T3) - + ckt->CKTgmin; - here->BSIM4cbs = SourceSatCurrent * (evbs + here->BSIM4XExpBVS - 1.0 - - model->BSIM4xjbvs * T2) + ckt->CKTgmin * vbs_jct; + + ckt->CKTgmin; + here->BSIM4cbs = SourceSatCurrent * (evbs + here->BSIM4XExpBVS - 1.0 + - model->BSIM4xjbvs * T2) + ckt->CKTgmin * vbs_jct; } - else - { here->BSIM4gbs = here->BSIM4SslpFwd + ckt->CKTgmin; + else + { here->BSIM4gbs = here->BSIM4SslpFwd + ckt->CKTgmin; here->BSIM4cbs = here->BSIM4IVjsmFwd + here->BSIM4SslpFwd * (vbs_jct - - here->BSIM4vjsmFwd) + ckt->CKTgmin * vbs_jct; - } + - here->BSIM4vjsmFwd) + ckt->CKTgmin * vbs_jct; + } break; default: break; } - } + } Nvtmd = model->BSIM4vtm * model->BSIM4DjctEmissionCoeff; - if ((here->BSIM4Adeff <= 0.0) && (here->BSIM4Pdeff <= 0.0)) - { DrainSatCurrent = 0.0; - } +/* if ((here->BSIM4Adeff <= 0.0) && (here->BSIM4Pdeff <= 0.0)) + { DrainSatCurrent = 1.0e-14; + } v4.7 */ + if ((here->BSIM4Adeff <= 0.0) && (here->BSIM4Pdeff <= 0.0)) + { DrainSatCurrent = 0.0; + } else { DrainSatCurrent = here->BSIM4Adeff * model->BSIM4DjctTempSatCurDensity + here->BSIM4Pdeff * model->BSIM4DjctSidewallTempSatCurDensity @@ -811,8 +817,8 @@ for (; model != NULL; model = model->BSIM4nextModel) * model->BSIM4DjctGateSidewallTempSatCurDensity; } - if (DrainSatCurrent <= 0.0) - { here->BSIM4gbd = ckt->CKTgmin; + if (DrainSatCurrent <= 0.0) + { here->BSIM4gbd = ckt->CKTgmin; here->BSIM4cbd = here->BSIM4gbd * vbd_jct; } else @@ -826,7 +832,7 @@ for (; model != NULL; model = model->BSIM4nextModel) - T1 - 1.0) + ckt->CKTgmin * vbd_jct; break; case 1: - T2 = vbd_jct / Nvtmd; + T2 = vbd_jct / Nvtmd; if (T2 < -EXP_THRESHOLD) { here->BSIM4gbd = ckt->CKTgmin; here->BSIM4cbd = DrainSatCurrent * (MIN_EXP - 1.0) @@ -898,7 +904,7 @@ for (; model != NULL; model = model->BSIM4nextModel) } } - /* trap-assisted tunneling and recombination current for reverse bias */ + /* trap-assisted tunneling and recombination current for reverse bias */ Nvtmrssws = model->BSIM4vtm0 * model->BSIM4njtsswstemp; Nvtmrsswgs = model->BSIM4vtm0 * model->BSIM4njtsswgstemp; Nvtmrss = model->BSIM4vtm0 * model->BSIM4njtsstemp; @@ -984,69 +990,70 @@ for (; model != NULL; model = model->BSIM4nextModel) dT6_dVb = T10 * dT0_dVb; } - here->BSIM4gbs += here->BSIM4SjctTempRevSatCur * dT1_dVb - + here->BSIM4SswTempRevSatCur * dT3_dVb - + here->BSIM4SswgTempRevSatCur * dT5_dVb; - here->BSIM4cbs -= here->BSIM4SjctTempRevSatCur * (T1 - 1.0) - + here->BSIM4SswTempRevSatCur * (T3 - 1.0) - + here->BSIM4SswgTempRevSatCur * (T5 - 1.0); - here->BSIM4gbd += here->BSIM4DjctTempRevSatCur * dT2_dVb - + here->BSIM4DswTempRevSatCur * dT4_dVb - + here->BSIM4DswgTempRevSatCur * dT6_dVb; - here->BSIM4cbd -= here->BSIM4DjctTempRevSatCur * (T2 - 1.0) - + here->BSIM4DswTempRevSatCur * (T4 - 1.0) - + here->BSIM4DswgTempRevSatCur * (T6 - 1.0); + here->BSIM4gbs += here->BSIM4SjctTempRevSatCur * dT1_dVb + + here->BSIM4SswTempRevSatCur * dT3_dVb + + here->BSIM4SswgTempRevSatCur * dT5_dVb; + here->BSIM4cbs -= here->BSIM4SjctTempRevSatCur * (T1 - 1.0) + + here->BSIM4SswTempRevSatCur * (T3 - 1.0) + + here->BSIM4SswgTempRevSatCur * (T5 - 1.0); + here->BSIM4gbd += here->BSIM4DjctTempRevSatCur * dT2_dVb + + here->BSIM4DswTempRevSatCur * dT4_dVb + + here->BSIM4DswgTempRevSatCur * dT6_dVb; + here->BSIM4cbd -= here->BSIM4DjctTempRevSatCur * (T2 - 1.0) + + here->BSIM4DswTempRevSatCur * (T4 - 1.0) + + here->BSIM4DswgTempRevSatCur * (T6 - 1.0); /* End of diode DC model */ if (vds >= 0.0) - { here->BSIM4mode = 1; + { here->BSIM4mode = 1; Vds = vds; Vgs = vgs; Vbs = vbs; - Vdb = vds - vbs; /* WDLiu: for GIDL */ + Vdb = vds - vbs; /* WDLiu: for GIDL */ + } - else - { here->BSIM4mode = -1; + else + { here->BSIM4mode = -1; Vds = -vds; Vgs = vgd; Vbs = vbd; - Vdb = -vbs; + Vdb = -vbs; } - /* dunga */ - if(model->BSIM4mtrlMod) - { - epsrox = 3.9; - toxe = model->BSIM4eot; - epssub = EPS0 * model->BSIM4epsrsub; - } - else - { - epsrox = model->BSIM4epsrox; - toxe = model->BSIM4toxe; - epssub = EPSSI; - } + /* dunga */ + if(model->BSIM4mtrlMod) + { + epsrox = 3.9; + toxe = model->BSIM4eot; + epssub = EPS0 * model->BSIM4epsrsub; + } + else + { + epsrox = model->BSIM4epsrox; + toxe = model->BSIM4toxe; + epssub = EPSSI; + } - T0 = Vbs - here->BSIM4vbsc - 0.001; - T1 = sqrt(T0 * T0 - 0.004 * here->BSIM4vbsc); - if (T0 >= 0.0) - { Vbseff = here->BSIM4vbsc + 0.5 * (T0 + T1); + T0 = Vbs - here->BSIM4vbsc - 0.001; + T1 = sqrt(T0 * T0 - 0.004 * here->BSIM4vbsc); + if (T0 >= 0.0) + { Vbseff = here->BSIM4vbsc + 0.5 * (T0 + T1); dVbseff_dVb = 0.5 * (1.0 + T0 / T1); - } - else - { T2 = -0.002 / (T1 - T0); - Vbseff = here->BSIM4vbsc * (1.0 + T2); - dVbseff_dVb = T2 * here->BSIM4vbsc / T1; - } + } + else + { T2 = -0.002 / (T1 - T0); + Vbseff = here->BSIM4vbsc * (1.0 + T2); + dVbseff_dVb = T2 * here->BSIM4vbsc / T1; + } - /* JX: Correction to forward body bias */ - T9 = 0.95 * pParam->BSIM4phi; - T0 = T9 - Vbseff - 0.001; - T1 = sqrt(T0 * T0 + 0.004 * T9); - Vbseff = T9 - 0.5 * (T0 + T1); + /* JX: Correction to forward body bias */ + T9 = 0.95 * pParam->BSIM4phi; + T0 = T9 - Vbseff - 0.001; + T1 = sqrt(T0 * T0 + 0.004 * T9); + Vbseff = T9 - 0.5 * (T0 + T1); dVbseff_dVb *= 0.5 * (1.0 + T0 / T1); Phis = pParam->BSIM4phi - Vbseff; dPhis_dVb = -1.0; @@ -1055,7 +1062,7 @@ for (; model != NULL; model = model->BSIM4nextModel) Xdep = pParam->BSIM4Xdep0 * sqrtPhis / pParam->BSIM4sqrtPhi; dXdep_dVb = (pParam->BSIM4Xdep0 / pParam->BSIM4sqrtPhi) - * dsqrtPhis_dVb; + * dsqrtPhis_dVb; Leff = pParam->BSIM4leff; Vtm = model->BSIM4vtm; @@ -1067,27 +1074,27 @@ for (; model != NULL; model = model->BSIM4nextModel) T0 = pParam->BSIM4dvt2 * Vbseff; if (T0 >= - 0.5) - { T1 = 1.0 + T0; - T2 = pParam->BSIM4dvt2; - } - else - { T4 = 1.0 / (3.0 + 8.0 * T0); - T1 = (1.0 + 3.0 * T0) * T4; - T2 = pParam->BSIM4dvt2 * T4 * T4; - } + { T1 = 1.0 + T0; + T2 = pParam->BSIM4dvt2; + } + else + { T4 = 1.0 / (3.0 + 8.0 * T0); + T1 = (1.0 + 3.0 * T0) * T4; + T2 = pParam->BSIM4dvt2 * T4 * T4; + } lt1 = model->BSIM4factor1 * T3 * T1; dlt1_dVb = model->BSIM4factor1 * (0.5 / T3 * T1 * dXdep_dVb + T3 * T2); T0 = pParam->BSIM4dvt2w * Vbseff; if (T0 >= - 0.5) - { T1 = 1.0 + T0; - T2 = pParam->BSIM4dvt2w; - } - else - { T4 = 1.0 / (3.0 + 8.0 * T0); - T1 = (1.0 + 3.0 * T0) * T4; - T2 = pParam->BSIM4dvt2w * T4 * T4; - } + { T1 = 1.0 + T0; + T2 = pParam->BSIM4dvt2w; + } + else + { T4 = 1.0 / (3.0 + 8.0 * T0); + T1 = (1.0 + 3.0 * T0) * T4; + T2 = pParam->BSIM4dvt2w * T4 * T4; + } ltw = model->BSIM4factor1 * T3 * T1; dltw_dVb = model->BSIM4factor1 * (0.5 / T3 * T1 * dXdep_dVb + T3 * T2); @@ -1133,24 +1140,24 @@ for (; model != NULL; model = model->BSIM4nextModel) + (pParam->BSIM4kt1 + pParam->BSIM4kt1l / Leff + pParam->BSIM4kt2 * Vbseff) * TempRatio; Vth_NarrowW = toxe * pParam->BSIM4phi - / (pParam->BSIM4weff + pParam->BSIM4w0); + / (pParam->BSIM4weff + pParam->BSIM4w0); - T3 = here->BSIM4eta0 + pParam->BSIM4etab * Vbseff; - if (T3 < 1.0e-4) - { T9 = 1.0 / (3.0 - 2.0e4 * T3); - T3 = (2.0e-4 - T3) * T9; - T4 = T9 * T9; - } - else - { T4 = 1.0; - } - dDIBL_Sft_dVd = T3 * pParam->BSIM4theta0vb0; + T3 = here->BSIM4eta0 + pParam->BSIM4etab * Vbseff; + if (T3 < 1.0e-4) + { T9 = 1.0 / (3.0 - 2.0e4 * T3); + T3 = (2.0e-4 - T3) * T9; + T4 = T9 * T9; + } + else + { T4 = 1.0; + } + dDIBL_Sft_dVd = T3 * pParam->BSIM4theta0vb0; DIBL_Sft = dDIBL_Sft_dVd * Vds; - Lpe_Vb = sqrt(1.0 + pParam->BSIM4lpeb / Leff); + Lpe_Vb = sqrt(1.0 + pParam->BSIM4lpeb / Leff); Vth = model->BSIM4type * here->BSIM4vth0 + (pParam->BSIM4k1ox * sqrtPhis - - pParam->BSIM4k1 * pParam->BSIM4sqrtPhi) * Lpe_Vb + - pParam->BSIM4k1 * pParam->BSIM4sqrtPhi) * Lpe_Vb - here->BSIM4k2ox * Vbseff - Delt_vth - T2 + (pParam->BSIM4k3 + pParam->BSIM4k3b * Vbseff) * Vth_NarrowW + T1 - DIBL_Sft; @@ -1163,30 +1170,30 @@ for (; model != NULL; model = model->BSIM4nextModel) /* Calculate n */ tmp1 = epssub / Xdep; - here->BSIM4nstar = model->BSIM4vtm / Charge_q * (model->BSIM4coxe - + tmp1 + pParam->BSIM4cit); + here->BSIM4nstar = model->BSIM4vtm / Charge_q * (model->BSIM4coxe + + tmp1 + pParam->BSIM4cit); tmp2 = pParam->BSIM4nfactor * tmp1; tmp3 = pParam->BSIM4cdsc + pParam->BSIM4cdscb * Vbseff + pParam->BSIM4cdscd * Vds; - tmp4 = (tmp2 + tmp3 * Theta0 + pParam->BSIM4cit) / model->BSIM4coxe; - if (tmp4 >= -0.5) - { n = 1.0 + tmp4; - dn_dVb = (-tmp2 / Xdep * dXdep_dVb + tmp3 * dTheta0_dVb + tmp4 = (tmp2 + tmp3 * Theta0 + pParam->BSIM4cit) / model->BSIM4coxe; + if (tmp4 >= -0.5) + { n = 1.0 + tmp4; + dn_dVb = (-tmp2 / Xdep * dXdep_dVb + tmp3 * dTheta0_dVb + pParam->BSIM4cdscb * Theta0) / model->BSIM4coxe; dn_dVd = pParam->BSIM4cdscd * Theta0 / model->BSIM4coxe; - } - else - { T0 = 1.0 / (3.0 + 8.0 * tmp4); - n = (1.0 + 3.0 * tmp4) * T0; - T0 *= T0; - dn_dVb = (-tmp2 / Xdep * dXdep_dVb + tmp3 * dTheta0_dVb + } + else + { T0 = 1.0 / (3.0 + 8.0 * tmp4); + n = (1.0 + 3.0 * tmp4) * T0; + T0 *= T0; + dn_dVb = (-tmp2 / Xdep * dXdep_dVb + tmp3 * dTheta0_dVb + pParam->BSIM4cdscb * Theta0) / model->BSIM4coxe * T0; dn_dVd = pParam->BSIM4cdscd * Theta0 / model->BSIM4coxe * T0; - } + } /* Vth correction for Pocket implant */ - if (pParam->BSIM4dvtp0 > 0.0) + if (pParam->BSIM4dvtp0 > 0.0) { T0 = -pParam->BSIM4dvtp1 * Vds; if (T0 < -EXP_THRESHOLD) { T2 = MIN_EXP; @@ -1215,69 +1222,89 @@ for (; model != NULL; model = model->BSIM4nextModel) Vth -= n * T4; dVth_dVd -= dDITS_Sft_dVd; dVth_dVb -= dDITS_Sft_dVb; - } + } + + /* v4.7 DITS_SFT2 */ + if ((pParam->BSIM4dvtp4 == 0.0) || (pParam->BSIM4dvtp2factor == 0.0)) { + T0 = 0.0; + DITS_Sft2 = 0.0; + } + else + { + //T0 = exp(2.0 * pParam->BSIM4dvtp4 * Vds); /* beta code */ + T1 = 2.0 * pParam->BSIM4dvtp4 * Vds; + DEXP(T1, T0, T10); + DITS_Sft2 = pParam->BSIM4dvtp2factor * (T0-1) / (T0+1); + //dDITS_Sft2_dVd = pParam->BSIM4dvtp2factor * pParam->BSIM4dvtp4 * 4.0 * T0 / ((T0+1) * (T0+1)); /* beta code */ + dDITS_Sft2_dVd = pParam->BSIM4dvtp2factor * pParam->BSIM4dvtp4 * 4.0 * T10 / ((T0+1) * (T0+1)); + Vth -= DITS_Sft2; + dVth_dVd -= dDITS_Sft2_dVd; + } + + + here->BSIM4von = Vth; - + /* Poly Gate Si Depletion Effect */ - T0 = here->BSIM4vfb + pParam->BSIM4phi; - if(model->BSIM4mtrlMod == 0) - T1 = EPSSI; - else - T1 = model->BSIM4epsrgate * EPS0; + T0 = here->BSIM4vfb + pParam->BSIM4phi; + if(model->BSIM4mtrlMod == 0) + T1 = EPSSI; + else + T1 = model->BSIM4epsrgate * EPS0; - BSIM4polyDepletion(T0, pParam->BSIM4ngate, T1, model->BSIM4coxe, vgs, &vgs_eff, &dvgs_eff_dvg); + BSIM4polyDepletion(T0, pParam->BSIM4ngate, T1, model->BSIM4coxe, vgs, &vgs_eff, &dvgs_eff_dvg); - BSIM4polyDepletion(T0, pParam->BSIM4ngate, T1, model->BSIM4coxe, vgd, &vgd_eff, &dvgd_eff_dvg); - - if(here->BSIM4mode>0) { - Vgs_eff = vgs_eff; - dVgs_eff_dVg = dvgs_eff_dvg; - } else { - Vgs_eff = vgd_eff; - dVgs_eff_dVg = dvgd_eff_dvg; - } - here->BSIM4vgs_eff = vgs_eff; - here->BSIM4vgd_eff = vgd_eff; - here->BSIM4dvgs_eff_dvg = dvgs_eff_dvg; - here->BSIM4dvgd_eff_dvg = dvgd_eff_dvg; + BSIM4polyDepletion(T0, pParam->BSIM4ngate, T1, model->BSIM4coxe, vgd, &vgd_eff, &dvgd_eff_dvg); + + if(here->BSIM4mode>0) { + Vgs_eff = vgs_eff; + dVgs_eff_dVg = dvgs_eff_dvg; + } else { + Vgs_eff = vgd_eff; + dVgs_eff_dVg = dvgd_eff_dvg; + } + here->BSIM4vgs_eff = vgs_eff; + here->BSIM4vgd_eff = vgd_eff; + here->BSIM4dvgs_eff_dvg = dvgs_eff_dvg; + here->BSIM4dvgd_eff_dvg = dvgd_eff_dvg; Vgst = Vgs_eff - Vth; - /* Calculate Vgsteff */ - T0 = n * Vtm; - T1 = pParam->BSIM4mstar * Vgst; - T2 = T1 / T0; - if (T2 > EXP_THRESHOLD) - { T10 = T1; - dT10_dVg = pParam->BSIM4mstar * dVgs_eff_dVg; + /* Calculate Vgsteff */ + T0 = n * Vtm; + T1 = pParam->BSIM4mstar * Vgst; + T2 = T1 / T0; + if (T2 > EXP_THRESHOLD) + { T10 = T1; + dT10_dVg = pParam->BSIM4mstar * dVgs_eff_dVg; dT10_dVd = -dVth_dVd * pParam->BSIM4mstar; dT10_dVb = -dVth_dVb * pParam->BSIM4mstar; - } - else if (T2 < -EXP_THRESHOLD) - { T10 = Vtm * log(1.0 + MIN_EXP); + } + else if (T2 < -EXP_THRESHOLD) + { T10 = Vtm * log(1.0 + MIN_EXP); dT10_dVg = 0.0; dT10_dVd = T10 * dn_dVd; dT10_dVb = T10 * dn_dVb; - T10 *= n; - } - else - { ExpVgst = exp(T2); - T3 = Vtm * log(1.0 + ExpVgst); + T10 *= n; + } + else + { ExpVgst = exp(T2); + T3 = Vtm * log(1.0 + ExpVgst); T10 = n * T3; dT10_dVg = pParam->BSIM4mstar * ExpVgst / (1.0 + ExpVgst); dT10_dVb = T3 * dn_dVb - dT10_dVg * (dVth_dVb + Vgst * dn_dVb / n); dT10_dVd = T3 * dn_dVd - dT10_dVg * (dVth_dVd + Vgst * dn_dVd / n); - dT10_dVg *= dVgs_eff_dVg; - } + dT10_dVg *= dVgs_eff_dVg; + } - T1 = pParam->BSIM4voffcbn - (1.0 - pParam->BSIM4mstar) * Vgst; - T2 = T1 / T0; + T1 = pParam->BSIM4voffcbn - (1.0 - pParam->BSIM4mstar) * Vgst; + T2 = T1 / T0; if (T2 < -EXP_THRESHOLD) { T3 = model->BSIM4coxe * MIN_EXP / pParam->BSIM4cdep0; - T9 = pParam->BSIM4mstar + T3 * n; + T9 = pParam->BSIM4mstar + T3 * n; dT9_dVg = 0.0; dT9_dVd = dn_dVd * T3; dT9_dVb = dn_dVb * T3; @@ -1291,18 +1318,17 @@ for (; model != NULL; model = model->BSIM4nextModel) } else { ExpVgst = exp(T2); - T3 = model->BSIM4coxe / pParam->BSIM4cdep0; - T4 = T3 * ExpVgst; - T5 = T1 * T4 / T0; + T3 = model->BSIM4coxe / pParam->BSIM4cdep0; + T4 = T3 * ExpVgst; + T5 = T1 * T4 / T0; T9 = pParam->BSIM4mstar + n * T4; dT9_dVg = T3 * (pParam->BSIM4mstar - 1.0) * ExpVgst / Vtm; dT9_dVb = T4 * dn_dVb - dT9_dVg * dVth_dVb - T5 * dn_dVb; dT9_dVd = T4 * dn_dVd - dT9_dVg * dVth_dVd - T5 * dn_dVd; dT9_dVg *= dVgs_eff_dVg; } - here->BSIM4Vgsteff = Vgsteff = T10 / T9; - T11 = T9 * T9; + T11 = T9 * T9; dVgsteff_dVg = (T9 * dT10_dVg - T10 * dT9_dVg) / T11; dVgsteff_dVd = (T9 * dT10_dVd - T10 * dT9_dVd) / T11; dVgsteff_dVb = (T9 * dT10_dVb - T10 * dT9_dVb) / T11; @@ -1315,40 +1341,40 @@ for (; model != NULL; model = model->BSIM4nextModel) dWeff_dVb = -2.0 * pParam->BSIM4dwb * dsqrtPhis_dVb; if (Weff < 2.0e-8) /* to avoid the discontinuity problem due to Weff*/ - { T0 = 1.0 / (6.0e-8 - 2.0 * Weff); - Weff = 2.0e-8 * (4.0e-8 - Weff) * T0; - T0 *= T0 * 4.0e-16; + { T0 = 1.0 / (6.0e-8 - 2.0 * Weff); + Weff = 2.0e-8 * (4.0e-8 - Weff) * T0; + T0 *= T0 * 4.0e-16; dWeff_dVg *= T0; - dWeff_dVb *= T0; + dWeff_dVb *= T0; } - if (model->BSIM4rdsMod == 1) - Rds = dRds_dVg = dRds_dVb = 0.0; + if (model->BSIM4rdsMod == 1) + Rds = dRds_dVg = dRds_dVb = 0.0; else { T0 = 1.0 + pParam->BSIM4prwg * Vgsteff; - dT0_dVg = -pParam->BSIM4prwg / T0 / T0; - T1 = pParam->BSIM4prwb * T9; - dT1_dVb = pParam->BSIM4prwb * dsqrtPhis_dVb; + dT0_dVg = -pParam->BSIM4prwg / T0 / T0; + T1 = pParam->BSIM4prwb * T9; + dT1_dVb = pParam->BSIM4prwb * dsqrtPhis_dVb; - T2 = 1.0 / T0 + T1; - T3 = T2 + sqrt(T2 * T2 + 0.01); /* 0.01 = 4.0 * 0.05 * 0.05 */ - dT3_dVg = 1.0 + T2 / (T3 - T2); - dT3_dVb = dT3_dVg * dT1_dVb; - dT3_dVg *= dT0_dVg; + T2 = 1.0 / T0 + T1; + T3 = T2 + sqrt(T2 * T2 + 0.01); /* 0.01 = 4.0 * 0.05 * 0.05 */ + dT3_dVg = 1.0 + T2 / (T3 - T2); + dT3_dVb = dT3_dVg * dT1_dVb; + dT3_dVg *= dT0_dVg; - T4 = pParam->BSIM4rds0 * 0.5; - Rds = pParam->BSIM4rdswmin + T3 * T4; + T4 = pParam->BSIM4rds0 * 0.5; + Rds = pParam->BSIM4rdswmin + T3 * T4; dRds_dVg = T4 * dT3_dVg; dRds_dVb = T4 * dT3_dVb; - if (Rds > 0.0) - here->BSIM4grdsw = 1.0 / Rds* here->BSIM4nf; /*4.6.2*/ - else + if (Rds > 0.0) + here->BSIM4grdsw = 1.0 / Rds* here->BSIM4nf; /*4.6.2*/ + else here->BSIM4grdsw = 0.0; } - + /* Calculate Abulk */ - T9 = 0.5 * pParam->BSIM4k1ox * Lpe_Vb / sqrtPhis; + T9 = 0.5 * pParam->BSIM4k1ox * Lpe_Vb / sqrtPhis; T1 = T9 + here->BSIM4k2ox - pParam->BSIM4k3b * Vth_NarrowW; dT1_dVb = -T9 / sqrtPhis * dsqrtPhis_dVb; @@ -1370,146 +1396,146 @@ for (; model != NULL; model = model->BSIM4nextModel) dAbulk_dVg = -T1 * T8; Abulk = Abulk0 + dAbulk_dVg * Vgsteff; dAbulk_dVb = dAbulk0_dVb - T8 * Vgsteff * (dT1_dVb - + 3.0 * T1 * dT2_dVb); + + 3.0 * T1 * dT2_dVb); if (Abulk0 < 0.1) /* added to avoid the problems caused by Abulk0 */ - { T9 = 1.0 / (3.0 - 20.0 * Abulk0); - Abulk0 = (0.2 - Abulk0) * T9; - dAbulk0_dVb *= T9 * T9; - } + { T9 = 1.0 / (3.0 - 20.0 * Abulk0); + Abulk0 = (0.2 - Abulk0) * T9; + dAbulk0_dVb *= T9 * T9; + } if (Abulk < 0.1) - { T9 = 1.0 / (3.0 - 20.0 * Abulk); - Abulk = (0.2 - Abulk) * T9; + { T9 = 1.0 / (3.0 - 20.0 * Abulk); + Abulk = (0.2 - Abulk) * T9; T10 = T9 * T9; - dAbulk_dVb *= T10; + dAbulk_dVb *= T10; dAbulk_dVg *= T10; - } - here->BSIM4Abulk = Abulk; + } + here->BSIM4Abulk = Abulk; T2 = pParam->BSIM4keta * Vbseff; - if (T2 >= -0.9) - { T0 = 1.0 / (1.0 + T2); + if (T2 >= -0.9) + { T0 = 1.0 / (1.0 + T2); dT0_dVb = -pParam->BSIM4keta * T0 * T0; - } - else - { T1 = 1.0 / (0.8 + T2); - T0 = (17.0 + 20.0 * T2) * T1; + } + else + { T1 = 1.0 / (0.8 + T2); + T0 = (17.0 + 20.0 * T2) * T1; dT0_dVb = -pParam->BSIM4keta * T1 * T1; - } - dAbulk_dVg *= T0; - dAbulk_dVb = dAbulk_dVb * T0 + Abulk * dT0_dVb; - dAbulk0_dVb = dAbulk0_dVb * T0 + Abulk0 * dT0_dVb; - Abulk *= T0; - Abulk0 *= T0; + } + dAbulk_dVg *= T0; + dAbulk_dVb = dAbulk_dVb * T0 + Abulk * dT0_dVb; + dAbulk0_dVb = dAbulk0_dVb * T0 + Abulk0 * dT0_dVb; + Abulk *= T0; + Abulk0 *= T0; /* Mobility calculation */ - if (model->BSIM4mtrlMod) - T14 = 2.0 * model->BSIM4type *(model->BSIM4phig - model->BSIM4easub - 0.5*model->BSIM4Eg0 + 0.45); - else - T14 = 0.0; + if (model->BSIM4mtrlMod && model->BSIM4mtrlCompatMod == 0) + T14 = 2.0 * model->BSIM4type *(model->BSIM4phig - model->BSIM4easub - 0.5*model->BSIM4Eg0 + 0.45); + else + T14 = 0.0; if (model->BSIM4mobMod == 0) - { T0 = Vgsteff + Vth + Vth - T14; + { T0 = Vgsteff + Vth + Vth - T14; T2 = pParam->BSIM4ua + pParam->BSIM4uc * Vbseff; T3 = T0 / toxe; - T12 = sqrt(Vth * Vth + 0.0001); - T9 = 1.0/(Vgsteff + 2*T12); - T10 = T9*toxe; - T8 = pParam->BSIM4ud * T10 * T10 * Vth; + T12 = sqrt(Vth * Vth + 0.0001); + T9 = 1.0/(Vgsteff + 2*T12); + T10 = T9*toxe; + T8 = pParam->BSIM4ud * T10 * T10 * Vth; T6 = T8 * Vth; T5 = T3 * (T2 + pParam->BSIM4ub * T3) + T6; T7 = - 2.0 * T6 * T9; - T11 = T7 * Vth/T12; + T11 = T7 * Vth/T12; dDenomi_dVg = (T2 + 2.0 * pParam->BSIM4ub * T3) / toxe; - T13 = 2.0 * (dDenomi_dVg + T11 + T8); + T13 = 2.0 * (dDenomi_dVg + T11 + T8); dDenomi_dVd = T13 * dVth_dVd; dDenomi_dVb = T13 * dVth_dVb + pParam->BSIM4uc * T3; - dDenomi_dVg+= T7; + dDenomi_dVg+= T7; } else if (model->BSIM4mobMod == 1) { T0 = Vgsteff + Vth + Vth - T14; T2 = 1.0 + pParam->BSIM4uc * Vbseff; T3 = T0 / toxe; T4 = T3 * (pParam->BSIM4ua + pParam->BSIM4ub * T3); - T12 = sqrt(Vth * Vth + 0.0001); - T9 = 1.0/(Vgsteff + 2*T12); - T10 = T9*toxe; - T8 = pParam->BSIM4ud * T10 * T10 * Vth; + T12 = sqrt(Vth * Vth + 0.0001); + T9 = 1.0/(Vgsteff + 2*T12); + T10 = T9*toxe; + T8 = pParam->BSIM4ud * T10 * T10 * Vth; T6 = T8 * Vth; T5 = T4 * T2 + T6; T7 = - 2.0 * T6 * T9; - T11 = T7 * Vth/T12; + T11 = T7 * Vth/T12; dDenomi_dVg = (pParam->BSIM4ua + 2.0 * pParam->BSIM4ub * T3) * T2 / toxe; - T13 = 2.0 * (dDenomi_dVg + T11 + T8); + T13 = 2.0 * (dDenomi_dVg + T11 + T8); dDenomi_dVd = T13 * dVth_dVd; dDenomi_dVb = T13 * dVth_dVb + pParam->BSIM4uc * T4; - dDenomi_dVg+= T7; + dDenomi_dVg+= T7; } - else if (model->BSIM4mobMod == 2) - { T0 = (Vgsteff + here->BSIM4vtfbphi1) / toxe; - T1 = exp(pParam->BSIM4eu * log(T0)); - dT1_dVg = T1 * pParam->BSIM4eu / T0 / toxe; - T2 = pParam->BSIM4ua + pParam->BSIM4uc * Vbseff; + else if (model->BSIM4mobMod == 2) + { T0 = (Vgsteff + here->BSIM4vtfbphi1) / toxe; + T1 = exp(pParam->BSIM4eu * log(T0)); + dT1_dVg = T1 * pParam->BSIM4eu / T0 / toxe; + T2 = pParam->BSIM4ua + pParam->BSIM4uc * Vbseff; T3 = T0 / toxe; /*Do we need it?*/ - - T12 = sqrt(Vth * Vth + 0.0001); - T9 = 1.0/(Vgsteff + 2*T12); - T10 = T9*toxe; - T8 = pParam->BSIM4ud * T10 * T10 * Vth; + + T12 = sqrt(Vth * Vth + 0.0001); + T9 = 1.0/(Vgsteff + 2*T12); + T10 = T9*toxe; + T8 = pParam->BSIM4ud * T10 * T10 * Vth; T6 = T8 * Vth; - T5 = T1 * T2 + T6; + T5 = T1 * T2 + T6; T7 = - 2.0 * T6 * T9; - T11 = T7 * Vth/T12; - dDenomi_dVg = T2 * dT1_dVg + T7; - T13 = 2.0 * (T11 + T8); + T11 = T7 * Vth/T12; + dDenomi_dVg = T2 * dT1_dVg + T7; + T13 = 2.0 * (T11 + T8); dDenomi_dVd = T13 * dVth_dVd; dDenomi_dVb = T13 * dVth_dVb + T1 * pParam->BSIM4uc; - } - /*high K mobility*/ - else - { - - - /*univsersal mobility*/ - T0 = (Vgsteff + here->BSIM4vtfbphi1)* 1.0e-8 / toxe/6.0; - T1 = exp(pParam->BSIM4eu * log(T0)); - dT1_dVg = T1 * pParam->BSIM4eu * 1.0e-8/ T0 / toxe/6.0; - T2 = pParam->BSIM4ua + pParam->BSIM4uc * Vbseff; - - /*Coulombic*/ - VgsteffVth = pParam->BSIM4VgsteffVth; - - T10 = exp(pParam->BSIM4ucs * log(0.5 + 0.5 * Vgsteff/VgsteffVth)); - T11 = pParam->BSIM4ud/T10; - dT11_dVg = - 0.5 * pParam->BSIM4ucs * T11 /(0.5 + 0.5*Vgsteff/VgsteffVth)/VgsteffVth; - - dDenomi_dVg = T2 * dT1_dVg + dT11_dVg; - dDenomi_dVd = 0.0; - dDenomi_dVb = T1 * pParam->BSIM4uc; - - T5 = T1 * T2 + T11; - } + } + /*high K mobility*/ + else + { + + + /*univsersal mobility*/ + T0 = (Vgsteff + here->BSIM4vtfbphi1)* 1.0e-8 / toxe/6.0; + T1 = exp(pParam->BSIM4eu * log(T0)); + dT1_dVg = T1 * pParam->BSIM4eu * 1.0e-8/ T0 / toxe/6.0; + T2 = pParam->BSIM4ua + pParam->BSIM4uc * Vbseff; + + /*Coulombic*/ + VgsteffVth = pParam->BSIM4VgsteffVth; + + T10 = exp(pParam->BSIM4ucs * log(0.5 + 0.5 * Vgsteff/VgsteffVth)); + T11 = pParam->BSIM4ud/T10; + dT11_dVg = - 0.5 * pParam->BSIM4ucs * T11 /(0.5 + 0.5*Vgsteff/VgsteffVth)/VgsteffVth; + + dDenomi_dVg = T2 * dT1_dVg + dT11_dVg; + dDenomi_dVd = 0.0; + dDenomi_dVb = T1 * pParam->BSIM4uc; + + T5 = T1 * T2 + T11; + } - - + + - - if (T5 >= -0.8) - { Denomi = 1.0 + T5; - } - else - { T9 = 1.0 / (7.0 + 10.0 * T5); - Denomi = (0.6 + T5) * T9; - T9 *= T9; + + if (T5 >= -0.8) + { Denomi = 1.0 + T5; + } + else + { T9 = 1.0 / (7.0 + 10.0 * T5); + Denomi = (0.6 + T5) * T9; + T9 *= T9; dDenomi_dVg *= T9; dDenomi_dVd *= T9; dDenomi_dVb *= T9; - } - - + } + + here->BSIM4ueff = ueff = here->BSIM4u0temp / Denomi; - T9 = -ueff / Denomi; + T9 = -ueff / Denomi; dueff_dVg = T9 * dDenomi_dVg; dueff_dVd = T9 * dDenomi_dVd; dueff_dVb = T9 * dDenomi_dVb; @@ -1525,25 +1551,25 @@ for (; model != NULL; model = model->BSIM4nextModel) dEsatL_dVd = T0 * dueff_dVd; dEsatL_dVb = T0 * dueff_dVb; - /* Sqrt() */ + /* Sqrt() */ a1 = pParam->BSIM4a1; - if (a1 == 0.0) - { Lambda = pParam->BSIM4a2; - dLambda_dVg = 0.0; - } - else if (a1 > 0.0) - { T0 = 1.0 - pParam->BSIM4a2; - T1 = T0 - pParam->BSIM4a1 * Vgsteff - 0.0001; - T2 = sqrt(T1 * T1 + 0.0004 * T0); - Lambda = pParam->BSIM4a2 + T0 - 0.5 * (T1 + T2); - dLambda_dVg = 0.5 * pParam->BSIM4a1 * (1.0 + T1 / T2); - } - else - { T1 = pParam->BSIM4a2 + pParam->BSIM4a1 * Vgsteff - 0.0001; - T2 = sqrt(T1 * T1 + 0.0004 * pParam->BSIM4a2); - Lambda = 0.5 * (T1 + T2); - dLambda_dVg = 0.5 * pParam->BSIM4a1 * (1.0 + T1 / T2); - } + if (a1 == 0.0) + { Lambda = pParam->BSIM4a2; + dLambda_dVg = 0.0; + } + else if (a1 > 0.0) + { T0 = 1.0 - pParam->BSIM4a2; + T1 = T0 - pParam->BSIM4a1 * Vgsteff - 0.0001; + T2 = sqrt(T1 * T1 + 0.0004 * T0); + Lambda = pParam->BSIM4a2 + T0 - 0.5 * (T1 + T2); + dLambda_dVg = 0.5 * pParam->BSIM4a1 * (1.0 + T1 / T2); + } + else + { T1 = pParam->BSIM4a2 + pParam->BSIM4a1 * Vgsteff - 0.0001; + T2 = sqrt(T1 * T1 + 0.0004 * pParam->BSIM4a2); + Lambda = 0.5 * (T1 + T2); + dLambda_dVg = 0.5 * pParam->BSIM4a1 * (1.0 + T1 / T2); + } Vgst2Vtm = Vgsteff + 2.0 * Vtm; if (Rds > 0) @@ -1553,12 +1579,12 @@ for (; model != NULL; model = model->BSIM4nextModel) else { tmp2 = dWeff_dVg / Weff; tmp3 = dWeff_dVb / Weff; - } + } if ((Rds == 0.0) && (Lambda == 1.0)) { T0 = 1.0 / (Abulk * EsatL + Vgst2Vtm); tmp1 = 0.0; - T1 = T0 * T0; - T2 = Vgst2Vtm * T0; + T1 = T0 * T0; + T2 = Vgst2Vtm * T0; T3 = EsatL * Vgst2Vtm; Vdsat = T3 * T0; @@ -1573,28 +1599,28 @@ for (; model != NULL; model = model->BSIM4nextModel) else { tmp1 = dLambda_dVg / (Lambda * Lambda); T9 = Abulk * WVCoxRds; - T8 = Abulk * T9; - T7 = Vgst2Vtm * T9; + T8 = Abulk * T9; + T7 = Vgst2Vtm * T9; T6 = Vgst2Vtm * WVCoxRds; T0 = 2.0 * Abulk * (T9 - 1.0 + 1.0 / Lambda); dT0_dVg = 2.0 * (T8 * tmp2 - Abulk * tmp1 - + (2.0 * T9 + 1.0 / Lambda - 1.0) * dAbulk_dVg); + + (2.0 * T9 + 1.0 / Lambda - 1.0) * dAbulk_dVg); dT0_dVb = 2.0 * (T8 * (2.0 / Abulk * dAbulk_dVb + tmp3) - + (1.0 / Lambda - 1.0) * dAbulk_dVb); - dT0_dVd = 0.0; + + (1.0 / Lambda - 1.0) * dAbulk_dVb); + dT0_dVd = 0.0; T1 = Vgst2Vtm * (2.0 / Lambda - 1.0) + Abulk * EsatL + 3.0 * T7; dT1_dVg = (2.0 / Lambda - 1.0) - 2.0 * Vgst2Vtm * tmp1 - + Abulk * dEsatL_dVg + EsatL * dAbulk_dVg + 3.0 * (T9 - + T7 * tmp2 + T6 * dAbulk_dVg); + + Abulk * dEsatL_dVg + EsatL * dAbulk_dVg + 3.0 * (T9 + + T7 * tmp2 + T6 * dAbulk_dVg); dT1_dVb = Abulk * dEsatL_dVb + EsatL * dAbulk_dVb - + 3.0 * (T6 * dAbulk_dVb + T7 * tmp3); + + 3.0 * (T6 * dAbulk_dVb + T7 * tmp3); dT1_dVd = Abulk * dEsatL_dVd; T2 = Vgst2Vtm * (EsatL + 2.0 * T6); dT2_dVg = EsatL + Vgst2Vtm * dEsatL_dVg - + T6 * (4.0 + 2.0 * Vgst2Vtm * tmp2); + + T6 * (4.0 + 2.0 * Vgst2Vtm * tmp2); dT2_dVb = Vgst2Vtm * (dEsatL_dVb + 2.0 * T6 * tmp3); dT2_dVd = Vgst2Vtm * dEsatL_dVd; @@ -1602,16 +1628,16 @@ for (; model != NULL; model = model->BSIM4nextModel) Vdsat = (T1 - T3) / T0; dT3_dVg = (T1 * dT1_dVg - 2.0 * (T0 * dT2_dVg + T2 * dT0_dVg)) - / T3; + / T3; dT3_dVd = (T1 * dT1_dVd - 2.0 * (T0 * dT2_dVd + T2 * dT0_dVd)) - / T3; + / T3; dT3_dVb = (T1 * dT1_dVb - 2.0 * (T0 * dT2_dVb + T2 * dT0_dVb)) - / T3; + / T3; dVdsat_dVg = (dT1_dVg - (T1 * dT1_dVg - dT0_dVg * T2 - - T0 * dT2_dVg) / T3 - Vdsat * dT0_dVg) / T0; + - T0 * dT2_dVg) / T3 - Vdsat * dT0_dVg) / T0; dVdsat_dVb = (dT1_dVb - (T1 * dT1_dVb - dT0_dVb * T2 - - T0 * dT2_dVb) / T3 - Vdsat * dT0_dVb) / T0; + - T0 * dT2_dVb) / T3 - Vdsat * dT0_dVb) / T0; dVdsat_dVd = (dT1_dVd - (T1 * dT1_dVd - T0 * dT2_dVd) / T3) / T0; } here->BSIM4vdsat = Vdsat; @@ -1623,28 +1649,28 @@ for (; model != NULL; model = model->BSIM4nextModel) dT1_dVb = dVdsat_dVb; T2 = sqrt(T1 * T1 + 4.0 * pParam->BSIM4delta * Vdsat); - T0 = T1 / T2; - T9 = 2.0 * pParam->BSIM4delta; - T3 = T9 / T2; + T0 = T1 / T2; + T9 = 2.0 * pParam->BSIM4delta; + T3 = T9 / T2; dT2_dVg = T0 * dT1_dVg + T3 * dVdsat_dVg; dT2_dVd = T0 * dT1_dVd + T3 * dVdsat_dVd; dT2_dVb = T0 * dT1_dVb + T3 * dVdsat_dVb; - if (T1 >= 0.0) - { Vdseff = Vdsat - 0.5 * (T1 + T2); - dVdseff_dVg = dVdsat_dVg - 0.5 * (dT1_dVg + dT2_dVg); + if (T1 >= 0.0) + { Vdseff = Vdsat - 0.5 * (T1 + T2); + dVdseff_dVg = dVdsat_dVg - 0.5 * (dT1_dVg + dT2_dVg); dVdseff_dVd = dVdsat_dVd - 0.5 * (dT1_dVd + dT2_dVd); dVdseff_dVb = dVdsat_dVb - 0.5 * (dT1_dVb + dT2_dVb); - } - else - { T4 = T9 / (T2 - T1); - T5 = 1.0 - T4; - T6 = Vdsat * T4 / (T2 - T1); - Vdseff = Vdsat * T5; + } + else + { T4 = T9 / (T2 - T1); + T5 = 1.0 - T4; + T6 = Vdsat * T4 / (T2 - T1); + Vdseff = Vdsat * T5; dVdseff_dVg = dVdsat_dVg * T5 + T6 * (dT2_dVg - dT1_dVg); dVdseff_dVd = dVdsat_dVd * T5 + T6 * (dT2_dVd - dT1_dVd); dVdseff_dVb = dVdsat_dVb * T5 + T6 * (dT2_dVb - dT1_dVb); - } + } if (Vds == 0.0) { Vdseff = 0.0; @@ -1702,16 +1728,16 @@ for (; model != NULL; model = model->BSIM4nextModel) /* Calculate Vasat */ tmp4 = 1.0 - 0.5 * Abulk * Vdsat / Vgst2Vtm; T9 = WVCoxRds * Vgsteff; - T8 = T9 / Vgst2Vtm; + T8 = T9 / Vgst2Vtm; T0 = EsatL + Vdsat + 2.0 * T9 * tmp4; T7 = 2.0 * WVCoxRds * tmp4; dT0_dVg = dEsatL_dVg + dVdsat_dVg + T7 * (1.0 + tmp2 * Vgsteff) - - T8 * (Abulk * dVdsat_dVg - Abulk * Vdsat / Vgst2Vtm - + Vdsat * dAbulk_dVg); - + - T8 * (Abulk * dVdsat_dVg - Abulk * Vdsat / Vgst2Vtm + + Vdsat * dAbulk_dVg); + dT0_dVb = dEsatL_dVb + dVdsat_dVb + T7 * tmp3 * Vgsteff - - T8 * (dAbulk_dVb * Vdsat + Abulk * dVdsat_dVb); + - T8 * (dAbulk_dVb * Vdsat + Abulk * dVdsat_dVb); dT0_dVd = dEsatL_dVd + dVdsat_dVd - T8 * Abulk * dVdsat_dVd; T9 = WVCoxRds * Abulk; @@ -1724,8 +1750,8 @@ for (; model != NULL; model = model->BSIM4nextModel) dVasat_dVb = (dT0_dVb - Vasat * dT1_dVb) / T1; dVasat_dVd = dT0_dVd / T1; - /* Calculate Idl first */ - + /* Calculate Idl first */ + tmp1 = here->BSIM4vtfbphi2; tmp2 = 2.0e8 * model->BSIM4toxp; dT0_dVg = 1.0 / tmp2; @@ -1739,6 +1765,7 @@ for (; model != NULL; model = model->BSIM4nextModel) Coxeff = epssub * model->BSIM4coxp / (epssub + model->BSIM4coxp * Tcen); + here->BSIM4Coxeff = Coxeff; dCoxeff_dVg = -Coxeff * Coxeff * dTcen_dVg / epssub; CoxeffWovL = Coxeff * Weff / Leff; @@ -1786,15 +1813,15 @@ for (; model != NULL; model = model->BSIM4nextModel) /* Calculate degradation factor due to pocket implant */ - if (pParam->BSIM4fprout <= 0.0) - { FP = 1.0; - dFP_dVg = 0.0; - } - else - { T9 = pParam->BSIM4fprout * sqrt(Leff) / Vgst2Vtm; + if (pParam->BSIM4fprout <= 0.0) + { FP = 1.0; + dFP_dVg = 0.0; + } + else + { T9 = pParam->BSIM4fprout * sqrt(Leff) / Vgst2Vtm; FP = 1.0 / (1.0 + T9); dFP_dVg = FP * FP * T9 / Vgst2Vtm; - } + } /* Calculate VACLM */ T8 = pParam->BSIM4pvag / EsatL; @@ -1816,13 +1843,13 @@ for (; model != NULL; model = model->BSIM4nextModel) } if ((pParam->BSIM4pclm > MIN_EXP) && (diffVds > 1.0e-10)) - { T0 = 1.0 + Rds * Idl; + { T0 = 1.0 + Rds * Idl; dT0_dVg = dRds_dVg * Idl + Rds * dIdl_dVg; dT0_dVd = Rds * dIdl_dVd; dT0_dVb = dRds_dVb * Idl + Rds * dIdl_dVb; T2 = Vdsat / Esat; - T1 = Leff + T2; + T1 = Leff + T2; dT1_dVg = (dVdsat_dVg - T2 * dEsatL_dVg / Leff) / Esat; dT1_dVd = (dVdsat_dVd - T2 * dEsatL_dVd / Leff) / Esat; dT1_dVb = (dVdsat_dVb - T2 * dEsatL_dVb / Leff) / Esat; @@ -1848,10 +1875,10 @@ for (; model != NULL; model = model->BSIM4nextModel) /* Calculate VADIBL */ if (pParam->BSIM4thetaRout > MIN_EXP) - { T8 = Abulk * Vdsat; - T0 = Vgst2Vtm * T8; + { T8 = Abulk * Vdsat; + T0 = Vgst2Vtm * T8; dT0_dVg = Vgst2Vtm * Abulk * dVdsat_dVg + T8 - + Vgst2Vtm * Vdsat * dAbulk_dVg; + + Vgst2Vtm * Vdsat * dAbulk_dVg; dT0_dVb = Vgst2Vtm * (dAbulk_dVb * Vdsat + Abulk * dVdsat_dVb); dT0_dVd = Vgst2Vtm * Abulk * dVdsat_dVd; @@ -1860,39 +1887,39 @@ for (; model != NULL; model = model->BSIM4nextModel) dT1_dVb = Abulk * dVdsat_dVb + dAbulk_dVb * Vdsat; dT1_dVd = Abulk * dVdsat_dVd; - T9 = T1 * T1; - T2 = pParam->BSIM4thetaRout; + T9 = T1 * T1; + T2 = pParam->BSIM4thetaRout; VADIBL = (Vgst2Vtm - T0 / T1) / T2; dVADIBL_dVg = (1.0 - dT0_dVg / T1 + T0 * dT1_dVg / T9) / T2; dVADIBL_dVb = (-dT0_dVb / T1 + T0 * dT1_dVb / T9) / T2; dVADIBL_dVd = (-dT0_dVd / T1 + T0 * dT1_dVd / T9) / T2; - T7 = pParam->BSIM4pdiblb * Vbseff; - if (T7 >= -0.9) - { T3 = 1.0 / (1.0 + T7); + T7 = pParam->BSIM4pdiblb * Vbseff; + if (T7 >= -0.9) + { T3 = 1.0 / (1.0 + T7); VADIBL *= T3; dVADIBL_dVg *= T3; dVADIBL_dVb = (dVADIBL_dVb - VADIBL * pParam->BSIM4pdiblb) - * T3; + * T3; dVADIBL_dVd *= T3; - } - else - { T4 = 1.0 / (0.8 + T7); - T3 = (17.0 + 20.0 * T7) * T4; + } + else + { T4 = 1.0 / (0.8 + T7); + T3 = (17.0 + 20.0 * T7) * T4; dVADIBL_dVg *= T3; dVADIBL_dVb = dVADIBL_dVb * T3 - - VADIBL * pParam->BSIM4pdiblb * T4 * T4; + - VADIBL * pParam->BSIM4pdiblb * T4 * T4; dVADIBL_dVd *= T3; VADIBL *= T3; - } + } dVADIBL_dVg = dVADIBL_dVg * PvagTerm + VADIBL * dPvagTerm_dVg; dVADIBL_dVb = dVADIBL_dVb * PvagTerm + VADIBL * dPvagTerm_dVb; dVADIBL_dVd = dVADIBL_dVd * PvagTerm + VADIBL * dPvagTerm_dVd; VADIBL *= PvagTerm; } - else - { VADIBL = MAX_EXP; + else + { VADIBL = MAX_EXP; dVADIBL_dVd = dVADIBL_dVg = dVADIBL_dVb = 0.0; } @@ -1908,7 +1935,7 @@ for (; model != NULL; model = model->BSIM4nextModel) { T1 = MAX_EXP; dT1_dVd = 0; } - else + else { T1 = exp(T0); dT1_dVd = T1 * pParam->BSIM4pditsd; } @@ -1918,35 +1945,35 @@ for (; model != NULL; model = model->BSIM4nextModel) VADITS = (1.0 + T2 * T1) / pParam->BSIM4pdits; dVADITS_dVg = VADITS * dFP_dVg; dVADITS_dVd = FP * T2 * dT1_dVd / pParam->BSIM4pdits; - VADITS *= FP; + VADITS *= FP; } - else + else { VADITS = MAX_EXP; dVADITS_dVg = dVADITS_dVd = 0; } /* Calculate VASCBE */ - if ((pParam->BSIM4pscbe2 > 0.0)&&(pParam->BSIM4pscbe1>=0.0)) /*4.6.2*/ - { if (diffVds > pParam->BSIM4pscbe1 * pParam->BSIM4litl - / EXP_THRESHOLD) - { T0 = pParam->BSIM4pscbe1 * pParam->BSIM4litl / diffVds; - VASCBE = Leff * exp(T0) / pParam->BSIM4pscbe2; + if ((pParam->BSIM4pscbe2 > 0.0)&&(pParam->BSIM4pscbe1>=0.0)) /*4.6.2*/ + { if (diffVds > pParam->BSIM4pscbe1 * pParam->BSIM4litl + / EXP_THRESHOLD) + { T0 = pParam->BSIM4pscbe1 * pParam->BSIM4litl / diffVds; + VASCBE = Leff * exp(T0) / pParam->BSIM4pscbe2; T1 = T0 * VASCBE / diffVds; dVASCBE_dVg = T1 * dVdseff_dVg; dVASCBE_dVd = -T1 * (1.0 - dVdseff_dVd); dVASCBE_dVb = T1 * dVdseff_dVb; } - else - { VASCBE = MAX_EXP * Leff/pParam->BSIM4pscbe2; + else + { VASCBE = MAX_EXP * Leff/pParam->BSIM4pscbe2; dVASCBE_dVg = dVASCBE_dVd = dVASCBE_dVb = 0.0; } - } - else - { VASCBE = MAX_EXP; + } + else + { VASCBE = MAX_EXP; dVASCBE_dVg = dVASCBE_dVd = dVASCBE_dVb = 0.0; - } + } - /* Add DIBL to Ids */ + /* Add DIBL to Ids */ T9 = diffVds / VADIBL; T0 = 1.0 + T9; Idsa = Idl * T0; @@ -1960,7 +1987,7 @@ for (; model != NULL; model = model->BSIM4nextModel) T0 = 1.0 + T9; dIdsa_dVg = T0 * dIdsa_dVg - Idsa * (dVdseff_dVg + T9 * dVADITS_dVg) / VADITS; dIdsa_dVd = T0 * dIdsa_dVd + Idsa - * (1.0 - dVdseff_dVd - T9 * dVADITS_dVd) / VADITS; + * (1.0 - dVdseff_dVd - T9 * dVADITS_dVd) / VADITS; dIdsa_dVb = T0 * dIdsa_dVb - Idsa * dVdseff_dVb / VADITS; Idsa *= T0; @@ -2027,22 +2054,22 @@ for (; model != NULL; model = model->BSIM4nextModel) Ids = Idsa * T0; Gm = T0 * dIdsa_dVg - Idsa - * (dVdseff_dVg + T9 * dVASCBE_dVg) / VASCBE; + * (dVdseff_dVg + T9 * dVASCBE_dVg) / VASCBE; Gds = T0 * dIdsa_dVd + Idsa - * (1.0 - dVdseff_dVd - T9 * dVASCBE_dVd) / VASCBE; + * (1.0 - dVdseff_dVd - T9 * dVASCBE_dVd) / VASCBE; Gmb = T0 * dIdsa_dVb - Idsa - * (dVdseff_dVb + T9 * dVASCBE_dVb) / VASCBE; + * (dVdseff_dVb + T9 * dVASCBE_dVb) / VASCBE; - tmp1 = Gds + Gm * dVgsteff_dVd; - tmp2 = Gmb + Gm * dVgsteff_dVb; - tmp3 = Gm; + tmp1 = Gds + Gm * dVgsteff_dVd; + tmp2 = Gmb + Gm * dVgsteff_dVb; + tmp3 = Gm; Gm = (Ids * dVdseff_dVg + Vdseff * tmp3) * dVgsteff_dVg; Gds = Ids * (dVdseff_dVd + dVdseff_dVg * dVgsteff_dVd) - + Vdseff * tmp1; + + Vdseff * tmp1; Gmb = (Ids * (dVdseff_dVb + dVdseff_dVg * dVgsteff_dVb) - + Vdseff * tmp2) * dVbseff_dVb; + + Vdseff * tmp2) * dVbseff_dVb; cdrain = Ids * Vdseff; @@ -2058,21 +2085,21 @@ for (; model != NULL; model = model->BSIM4nextModel) T0 = 2 * MM; T1 = vs / (pParam->BSIM4vtl * pParam->BSIM4tfactor); if(T1 > 0.0) - { T2 = 1.0 + exp(T0 * log(T1)); - T3 = (T2 - 1.0) * T0 / vs; - Fsevl = 1.0 / exp(log(T2)/ T0); - dT2_dVg = T3 * dvs_dVg; - dT2_dVd = T3 * dvs_dVd; - dT2_dVb = T3 * dvs_dVb; - T4 = -1.0 / T0 * Fsevl / T2; - dFsevl_dVg = T4 * dT2_dVg; - dFsevl_dVd = T4 * dT2_dVd; - dFsevl_dVb = T4 * dT2_dVb; + { T2 = 1.0 + exp(T0 * log(T1)); + T3 = (T2 - 1.0) * T0 / vs; + Fsevl = 1.0 / exp(log(T2)/ T0); + dT2_dVg = T3 * dvs_dVg; + dT2_dVd = T3 * dvs_dVd; + dT2_dVb = T3 * dvs_dVb; + T4 = -1.0 / T0 * Fsevl / T2; + dFsevl_dVg = T4 * dT2_dVg; + dFsevl_dVd = T4 * dT2_dVd; + dFsevl_dVb = T4 * dT2_dVb; } else { - Fsevl = 1.0; - dFsevl_dVg = 0.0; - dFsevl_dVd = 0.0; - dFsevl_dVb = 0.0; + Fsevl = 1.0; + dFsevl_dVg = 0.0; + dFsevl_dVd = 0.0; + dFsevl_dVb = 0.0; } Gm *=Fsevl; Gm += cdrain * dFsevl_dVg; @@ -2093,43 +2120,43 @@ for (; model != NULL; model = model->BSIM4nextModel) /* Calculate Rg */ if ((here->BSIM4rgateMod > 1) || (here->BSIM4trnqsMod != 0) || (here->BSIM4acnqsMod != 0)) - { T9 = pParam->BSIM4xrcrg2 * model->BSIM4vtm; + { T9 = pParam->BSIM4xrcrg2 * model->BSIM4vtm; T0 = T9 * beta; dT0_dVd = (dbeta_dVd + dbeta_dVg * dVgsteff_dVd) * T9; dT0_dVb = (dbeta_dVb + dbeta_dVg * dVgsteff_dVb) * T9; dT0_dVg = dbeta_dVg * T9; - here->BSIM4gcrg = pParam->BSIM4xrcrg1 * ( T0 + Ids); - here->BSIM4gcrgd = pParam->BSIM4xrcrg1 * (dT0_dVd + tmp1); + here->BSIM4gcrg = pParam->BSIM4xrcrg1 * ( T0 + Ids); + here->BSIM4gcrgd = pParam->BSIM4xrcrg1 * (dT0_dVd + tmp1); here->BSIM4gcrgb = pParam->BSIM4xrcrg1 * (dT0_dVb + tmp2) - * dVbseff_dVb; + * dVbseff_dVb; here->BSIM4gcrgg = pParam->BSIM4xrcrg1 * (dT0_dVg + tmp3) - * dVgsteff_dVg; + * dVgsteff_dVg; - if (here->BSIM4nf != 1.0) - { here->BSIM4gcrg *= here->BSIM4nf; - here->BSIM4gcrgg *= here->BSIM4nf; - here->BSIM4gcrgd *= here->BSIM4nf; - here->BSIM4gcrgb *= here->BSIM4nf; - } + if (here->BSIM4nf != 1.0) + { here->BSIM4gcrg *= here->BSIM4nf; + here->BSIM4gcrgg *= here->BSIM4nf; + here->BSIM4gcrgd *= here->BSIM4nf; + here->BSIM4gcrgb *= here->BSIM4nf; + } if (here->BSIM4rgateMod == 2) { T10 = here->BSIM4grgeltd * here->BSIM4grgeltd; - T11 = here->BSIM4grgeltd + here->BSIM4gcrg; - here->BSIM4gcrg = here->BSIM4grgeltd * here->BSIM4gcrg / T11; + T11 = here->BSIM4grgeltd + here->BSIM4gcrg; + here->BSIM4gcrg = here->BSIM4grgeltd * here->BSIM4gcrg / T11; T12 = T10 / T11 / T11; here->BSIM4gcrgg *= T12; here->BSIM4gcrgd *= T12; here->BSIM4gcrgb *= T12; } here->BSIM4gcrgs = -(here->BSIM4gcrgg + here->BSIM4gcrgd - + here->BSIM4gcrgb); - } + + here->BSIM4gcrgb); + } - /* Calculate bias-dependent external S/D resistance */ + /* Calculate bias-dependent external S/D resistance */ if (model->BSIM4rdsMod) - { /* Rs(V) */ + { /* Rs(V) */ T0 = vgs - pParam->BSIM4vfbsd; T1 = sqrt(T0 * T0 + 1.0e-4); vgs_eff = 0.5 * (T0 + T1); @@ -2159,7 +2186,7 @@ for (; model != NULL; model = model->BSIM4nextModel) dgstot_dvb = T0 * dRs_dvb; dgstot_dvs = -(dgstot_dvg + dgstot_dvb + dgstot_dvd); - /* Rd(V) */ + /* Rd(V) */ T0 = vgd - pParam->BSIM4vfbsd; T1 = sqrt(T0 * T0 + 1.0e-4); vgd_eff = 0.5 * (T0 + T1); @@ -2199,26 +2226,35 @@ for (; model != NULL; model = model->BSIM4nextModel) here->BSIM4gdtotg = T2 * dgdtot_dvg; here->BSIM4gdtots = T2 * dgdtot_dvs; here->BSIM4gdtotb = T2 * dgdtot_dvb; - } - else /* WDLiu: for bypass */ - { here->BSIM4gstot = here->BSIM4gstotd = here->BSIM4gstotg = 0.0; - here->BSIM4gstots = here->BSIM4gstotb = 0.0; - here->BSIM4gdtot = here->BSIM4gdtotd = here->BSIM4gdtotg = 0.0; + } + else /* WDLiu: for bypass */ + { here->BSIM4gstot = here->BSIM4gstotd = here->BSIM4gstotg = 0.0; + here->BSIM4gstots = here->BSIM4gstotb = 0.0; + here->BSIM4gdtot = here->BSIM4gdtotd = here->BSIM4gdtotg = 0.0; here->BSIM4gdtots = here->BSIM4gdtotb = 0.0; - } + } + /* GIDL/GISL Models */ + + if(model->BSIM4mtrlMod == 0) + T0 = 3.0 * toxe; + else + T0 = model->BSIM4epsrsub * toxe / epsrox; + /* Calculate GIDL current */ + vgs_eff = here->BSIM4vgs_eff; dvgs_eff_dvg = here->BSIM4dvgs_eff_dvg; - if(model->BSIM4mtrlMod == 0) - T0 = 3.0 * toxe; - else - T0 = model->BSIM4epsrsub * toxe / epsrox; + vgd_eff = here->BSIM4vgd_eff; + dvgd_eff_dvg = here->BSIM4dvgd_eff_dvg; - if(model->BSIM4mtrlMod ==0) - T1 = (vds - vgs_eff - pParam->BSIM4egidl ) / T0; - else - T1 = (vds - vgs_eff - pParam->BSIM4egidl + pParam->BSIM4vfbsd) / T0; + if (model->BSIM4gidlMod==0){ + + if(model->BSIM4mtrlMod ==0) + T1 = (vds - vgs_eff - pParam->BSIM4egidl ) / T0; + else + T1 = (vds - vgs_eff - pParam->BSIM4egidl + pParam->BSIM4vfbsd) / T0; + if ((pParam->BSIM4agidl <= 0.0) || (pParam->BSIM4bgidl <= 0.0) || (T1 <= 0.0) || (pParam->BSIM4cgidl <= 0.0) || (vbd > 0.0)) Igidl = Ggidld = Ggidlg = Ggidlb = 0.0; @@ -2253,14 +2289,11 @@ for (; model != NULL; model = model->BSIM4nextModel) here->BSIM4ggidld = Ggidld; here->BSIM4ggidlg = Ggidlg; here->BSIM4ggidlb = Ggidlb; - /* Calculate GISL current */ - vgd_eff = here->BSIM4vgd_eff; - dvgd_eff_dvg = here->BSIM4dvgd_eff_dvg; - - if(model->BSIM4mtrlMod ==0) + + if(model->BSIM4mtrlMod ==0) T1 = (-vds - vgd_eff - pParam->BSIM4egisl ) / T0; - else + else T1 = (-vds - vgd_eff - pParam->BSIM4egisl + pParam->BSIM4vfbsd ) / T0; if ((pParam->BSIM4agisl <= 0.0) || (pParam->BSIM4bgisl <= 0.0) @@ -2297,6 +2330,121 @@ for (; model != NULL; model = model->BSIM4nextModel) here->BSIM4ggisls = Ggisls; here->BSIM4ggislg = Ggislg; here->BSIM4ggislb = Ggislb; + } + else{ + /* v4.7 New Gidl/GISL model */ + + /* GISL */ + if (model->BSIM4mtrlMod==0) + T1 = (-vds - pParam->BSIM4rgisl * vgd_eff - pParam->BSIM4egisl) / T0; + else + T1 = (-vds - pParam->BSIM4rgisl * vgd_eff - pParam->BSIM4egisl + pParam->BSIM4vfbsd) / T0; + + if ((pParam->BSIM4agisl <= 0.0) || + (pParam->BSIM4bgisl <= 0.0) || (T1 <= 0.0) || + (pParam->BSIM4cgisl < 0.0) ) + Igisl = Ggisls = Ggislg = Ggislb = 0.0; + else + { + dT1_dVd = 1 / T0; + dT1_dVg = - pParam->BSIM4rgisl * dT1_dVd * dvgd_eff_dvg; + T2 = pParam->BSIM4bgisl / T1; + if (T2 < EXPL_THRESHOLD) + { + Igisl = pParam->BSIM4weffCJ * pParam->BSIM4agisl * T1 * exp(-T2); + T3 = Igisl / T1 * (T2 + 1); + Ggisls = T3 * dT1_dVd; + Ggislg = T3 * dT1_dVg; + } + else + { + T3 = pParam->BSIM4weffCJ * pParam->BSIM4agisl * MIN_EXPL; + Igisl = T3 * T1 ; + Ggisls = T3 * dT1_dVd; + Ggislg = T3 * dT1_dVg; + + } + T4 = vbs - pParam->BSIM4fgisl; + + if (T4==0) + T5 = EXPL_THRESHOLD; + else + T5 = pParam->BSIM4kgisl / T4; + if (T5BSIM4Igisl = Igisl; + here->BSIM4ggisls = Ggisls; + here->BSIM4ggislg = Ggislg; + here->BSIM4ggislb = Ggislb; + /* End of GISL */ + + /* GIDL */ + if (model->BSIM4mtrlMod==0) + T1 = (vds - pParam->BSIM4rgidl * vgs_eff - pParam->BSIM4egidl) / T0; + else + T1 = (vds - pParam->BSIM4rgidl * vgs_eff - pParam->BSIM4egidl + pParam->BSIM4vfbsd) / T0; + + + + if ((pParam->BSIM4agidl <= 0.0) || + (pParam->BSIM4bgidl <= 0.0) || (T1 <= 0.0) || + (pParam->BSIM4cgidl < 0.0) ) + Igidl = Ggidld = Ggidlg = Ggidlb = 0.0; + else + { + dT1_dVd = 1 / T0; + dT1_dVg = - pParam->BSIM4rgidl * dT1_dVd * dvgs_eff_dvg; + T2 = pParam->BSIM4bgidl / T1; + if (T2 < EXPL_THRESHOLD) + { + Igidl = pParam->BSIM4weffCJ * pParam->BSIM4agidl * T1 * exp(-T2); + T3 = Igidl / T1 * (T2 + 1); + Ggidld = T3 * dT1_dVd; + Ggidlg = T3 * dT1_dVg; + + } else + { + T3 = pParam->BSIM4weffCJ * pParam->BSIM4agidl * MIN_EXPL; + Igidl = T3 * T1 ; + Ggidld = T3 * dT1_dVd; + Ggidlg = T3 * dT1_dVg; + } + T4 = vbd - pParam->BSIM4fgidl; + if (T4==0) + T5 = EXPL_THRESHOLD; + else + T5 = pParam->BSIM4kgidl / T4; + if (T5BSIM4Igidl = Igidl; + here->BSIM4ggidld = Ggidld; + here->BSIM4ggidlg = Ggidlg; + here->BSIM4ggidlb = Ggidlb; + /* End of New GIDL */ + } + /*End of Gidl*/ + /* Calculate gate tunneling current */ @@ -2322,20 +2470,20 @@ for (; model != NULL; model = model->BSIM4nextModel) T3 = Vgs_eff - Vfbeff - Vbseff - Vgsteff; if (pParam->BSIM4k1ox == 0.0) Voxdepinv = dVoxdepinv_dVg = dVoxdepinv_dVd - = dVoxdepinv_dVb = 0.0; + = dVoxdepinv_dVb = 0.0; else if (T3 < 0.0) { Voxdepinv = -T3; dVoxdepinv_dVg = -dVgs_eff_dVg + dVfbeff_dVg + dVgsteff_dVg; dVoxdepinv_dVd = dVgsteff_dVd; dVoxdepinv_dVb = dVfbeff_dVb + 1.0 + dVgsteff_dVb; - } + } else { T1 = sqrt(T0 * T0 + T3); T2 = T0 / T1; Voxdepinv = pParam->BSIM4k1ox * (T1 - T0); dVoxdepinv_dVg = T2 * (dVgs_eff_dVg - dVfbeff_dVg - - dVgsteff_dVg); + - dVgsteff_dVg); dVoxdepinv_dVd = -T2 * dVgsteff_dVd; dVoxdepinv_dVb = -T2 * (dVfbeff_dVb + 1.0 + dVgsteff_dVb); } @@ -2347,20 +2495,20 @@ for (; model != NULL; model = model->BSIM4nextModel) } if(model->BSIM4tempMod < 2) - tmp = Vtm; + tmp = Vtm; else /* model->BSIM4tempMod = 2 , 3*/ - tmp = Vtm0; + tmp = Vtm0; if (model->BSIM4igcMod) { 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; + 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) { + } + } else if (model->BSIM4igcMod == 2) { VxNVt = (Vgs_eff - here->BSIM4von) / T0; if (VxNVt > EXP_THRESHOLD) { Vaux = Vgs_eff - here->BSIM4von; @@ -2377,14 +2525,14 @@ for (; model != NULL; model = model->BSIM4nextModel) { ExpVxNVt = exp(VxNVt); Vaux = T0 * log(1.0 + ExpVxNVt); dVaux_dVg = ExpVxNVt / (1.0 + ExpVxNVt); - if(model->BSIM4igcMod == 1) { - dVaux_dVd = 0.0; - dVaux_dVb = 0.0; + 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; + } + dVaux_dVg *= dVgs_eff_dVg; } T2 = Vgs_eff * Vaux; @@ -2426,7 +2574,8 @@ for (; model != NULL; model = model->BSIM4nextModel) dPigcd_dVg = dPigcd_dVd = dPigcd_dVb = 0.0; } else - { T11 = pParam->BSIM4Bechvb * toxe; + { /* T11 = pParam->BSIM4Bechvb * toxe; v4.7 */ + T11 = -pParam->BSIM4Bechvb; T12 = Vgsteff + 1.0e-20; T13 = T11 / T12 / T12; T14 = -T13 / T12; @@ -2522,7 +2671,7 @@ for (; model != NULL; model = model->BSIM4nextModel) else { T6 = exp(T5); dT6_dVg = T6 * T12 * (T3 - 2.0 * T4 * vgs_eff) - * dvgs_eff_dvg; + * dvgs_eff_dvg; } Igs = T11 * T2 * T6; dIgs_dVg = T11 * (T2 * dT6_dVg + T6 * dT2_dVg); @@ -2567,16 +2716,16 @@ for (; model != NULL; model = model->BSIM4nextModel) } else { here->BSIM4Igcs = here->BSIM4gIgcsg = here->BSIM4gIgcsd - = here->BSIM4gIgcsb = 0.0; + = here->BSIM4gIgcsb = 0.0; here->BSIM4Igcd = here->BSIM4gIgcdg = here->BSIM4gIgcdd - = here->BSIM4gIgcdb = 0.0; + = here->BSIM4gIgcdb = 0.0; here->BSIM4Igs = here->BSIM4gIgsg = here->BSIM4gIgss = 0.0; here->BSIM4Igd = here->BSIM4gIgdg = here->BSIM4gIgdd = 0.0; } if (model->BSIM4igbMod) { T0 = tmp * pParam->BSIM4nigbacc; - T1 = -Vgs_eff + Vbseff + Vfb; + T1 = -Vgs_eff + Vbseff + Vfb; VxNVt = T1 / T0; if (VxNVt > EXP_THRESHOLD) { Vaux = T1; @@ -2594,18 +2743,18 @@ for (; model != NULL; model = model->BSIM4nextModel) dVaux_dVg = -dVaux_dVb * dVgs_eff_dVg; } - T2 = (Vgs_eff - Vbseff) * Vaux; + T2 = (Vgs_eff - Vbseff) * Vaux; dT2_dVg = dVgs_eff_dVg * Vaux + (Vgs_eff - Vbseff) * dVaux_dVg; dT2_dVb = -Vaux + (Vgs_eff - Vbseff) * dVaux_dVb; T11 = 4.97232e-7 * pParam->BSIM4weff - * pParam->BSIM4leff * pParam->BSIM4ToxRatio; + * pParam->BSIM4leff * pParam->BSIM4ToxRatio; T12 = -7.45669e11 * toxe; - T3 = pParam->BSIM4aigbacc * pParam->BSIM4cigbacc + T3 = pParam->BSIM4aigbacc * pParam->BSIM4cigbacc - pParam->BSIM4bigbacc; T4 = pParam->BSIM4bigbacc * pParam->BSIM4cigbacc; - T5 = T12 * (pParam->BSIM4aigbacc + T3 * Voxacc - - T4 * Voxacc * Voxacc); + T5 = T12 * (pParam->BSIM4aigbacc + T3 * Voxacc + - T4 * Voxacc * Voxacc); if (T5 > EXP_THRESHOLD) { T6 = MAX_EXP; @@ -2643,7 +2792,7 @@ for (; model != NULL; model = model->BSIM4nextModel) else { ExpVxNVt = exp(VxNVt); Vaux = T0 * log(1.0 + ExpVxNVt); - dVaux_dVg = ExpVxNVt / (1.0 + ExpVxNVt); + dVaux_dVg = ExpVxNVt / (1.0 + ExpVxNVt); dVaux_dVd = dVaux_dVg * dVoxdepinv_dVd; dVaux_dVb = dVaux_dVg * dVoxdepinv_dVb; dVaux_dVg *= dVoxdepinv_dVg; @@ -2690,15 +2839,15 @@ for (; model != NULL; model = model->BSIM4nextModel) } else { here->BSIM4Igb = here->BSIM4gIgbg = here->BSIM4gIgbd - = here->BSIM4gIgbs = here->BSIM4gIgbb = 0.0; + = here->BSIM4gIgbs = here->BSIM4gIgbb = 0.0; } /* End of Gate current */ - if (here->BSIM4nf != 1.0) + if (here->BSIM4nf != 1.0) { cdrain *= here->BSIM4nf; here->BSIM4gds *= here->BSIM4nf; here->BSIM4gm *= here->BSIM4nf; here->BSIM4gmbs *= here->BSIM4nf; - here->BSIM4IdovVds *= here->BSIM4nf; + here->BSIM4IdovVds *= here->BSIM4nf; here->BSIM4gbbs *= here->BSIM4nf; here->BSIM4gbgs *= here->BSIM4nf; @@ -2708,8 +2857,8 @@ for (; model != NULL; model = model->BSIM4nextModel) here->BSIM4Igidl *= here->BSIM4nf; here->BSIM4ggidld *= here->BSIM4nf; here->BSIM4ggidlg *= here->BSIM4nf; - here->BSIM4ggidlb *= here->BSIM4nf; - + here->BSIM4ggidlb *= here->BSIM4nf; + here->BSIM4Igisl *= here->BSIM4nf; here->BSIM4ggisls *= here->BSIM4nf; here->BSIM4ggislg *= here->BSIM4nf; @@ -2735,21 +2884,23 @@ for (; model != NULL; model = model->BSIM4nextModel) here->BSIM4gIgbg *= here->BSIM4nf; here->BSIM4gIgbd *= here->BSIM4nf; here->BSIM4gIgbb *= here->BSIM4nf; - } + } here->BSIM4ggidls = -(here->BSIM4ggidld + here->BSIM4ggidlg - + here->BSIM4ggidlb); + + here->BSIM4ggidlb); here->BSIM4ggisld = -(here->BSIM4ggisls + here->BSIM4ggislg - + here->BSIM4ggislb); + + here->BSIM4ggislb); here->BSIM4gIgbs = -(here->BSIM4gIgbg + here->BSIM4gIgbd + here->BSIM4gIgbb); here->BSIM4gIgcss = -(here->BSIM4gIgcsg + here->BSIM4gIgcsd + here->BSIM4gIgcsb); here->BSIM4gIgcds = -(here->BSIM4gIgcdg + here->BSIM4gIgcdd + here->BSIM4gIgcdb); - here->BSIM4cd = cdrain; + here->BSIM4cd = cdrain; + /* Calculations for noise analysis */ + if (model->BSIM4tnoiMod == 0) { Abulk = Abulk0 * pParam->BSIM4abulkCVfactor; Vdsat = Vgsteff / Abulk; @@ -2774,13 +2925,17 @@ for (; model != NULL; model = model->BSIM4nextModel) * pParam->BSIM4leffCV * (Vgsteff - 0.5 * T0 + Abulk * T3); } + else if(model->BSIM4tnoiMod == 2) + { + here->BSIM4noiGd0 = here->BSIM4nf * beta * Vgsteff / (1.0 + gche * Rds); + } - /* + /* * BSIM4 C-V begins - */ + */ if ((model->BSIM4xpart < 0) || (!ChargeComputationNeeded)) - { qgate = qdrn = qsrc = qbulk = 0.0; + { qgate = qdrn = qsrc = qbulk = 0.0; here->BSIM4cggb = here->BSIM4cgsb = here->BSIM4cgdb = 0.0; here->BSIM4cdgb = here->BSIM4cdsb = here->BSIM4cddb = 0.0; here->BSIM4cbgb = here->BSIM4cbsb = here->BSIM4cbdb = 0.0; @@ -2791,14 +2946,14 @@ for (; model != NULL; model = model->BSIM4nextModel) here->BSIM4gtau = 0.0; goto finished; } - else if (model->BSIM4capMod == 0) - { + else if (model->BSIM4capMod == 0) + { if (Vbseff < 0.0) - { VbseffCV = Vbs; /*4.6.2*/ + { VbseffCV = Vbs; /*4.6.2*/ dVbseffCV_dVb = 1.0; } - else - { VbseffCV = pParam->BSIM4phi - Phis; + else + { VbseffCV = pParam->BSIM4phi - Phis; dVbseffCV_dVb = -dPhis_dVb * dVbseff_dVb; /*4.6.2*/ } @@ -2814,7 +2969,7 @@ for (; model != NULL; model = model->BSIM4nextModel) Arg1 = Vgs_eff - VbseffCV - Vfb; if (Arg1 <= 0.0) - { qgate = CoxWL * Arg1; + { qgate = CoxWL * Arg1; qbulk = -qgate; qdrn = 0.0; @@ -2830,16 +2985,16 @@ for (; model != NULL; model = model->BSIM4nextModel) here->BSIM4cbdb = 0.0; here->BSIM4cbsb = -here->BSIM4cgsb; } /* Arg1 <= 0.0, end of accumulation */ - else if (Vgst <= 0.0) - { T1 = 0.5 * pParam->BSIM4k1ox; - T2 = sqrt(T1 * T1 + Arg1); - qgate = CoxWL * pParam->BSIM4k1ox * (T2 - T1); + else if (Vgst <= 0.0) + { T1 = 0.5 * pParam->BSIM4k1ox; + T2 = sqrt(T1 * T1 + Arg1); + qgate = CoxWL * pParam->BSIM4k1ox * (T2 - T1); qbulk = -qgate; qdrn = 0.0; - T0 = CoxWL * T1 / T2; - here->BSIM4cggb = T0 * dVgs_eff_dVg; - here->BSIM4cgdb = 0.0; + T0 = CoxWL * T1 / T2; + here->BSIM4cggb = T0 * dVgs_eff_dVg; + here->BSIM4cgdb = 0.0; here->BSIM4cgsb = T0 * (dVbseffCV_dVb - dVgs_eff_dVg); here->BSIM4cdgb = 0.0; @@ -2850,63 +3005,63 @@ for (; model != NULL; model = model->BSIM4nextModel) here->BSIM4cbdb = 0.0; here->BSIM4cbsb = -here->BSIM4cgsb; } /* Vgst <= 0.0, end of depletion */ - else - { One_Third_CoxWL = CoxWL / 3.0; + else + { One_Third_CoxWL = CoxWL / 3.0; Two_Third_CoxWL = 2.0 * One_Third_CoxWL; AbulkCV = Abulk0 * pParam->BSIM4abulkCVfactor; dAbulkCV_dVb = pParam->BSIM4abulkCVfactor * dAbulk0_dVb*dVbseff_dVb; - - dVdsat_dVg = 1.0 / AbulkCV; /*4.6.2*/ - Vdsat = Vgst * dVdsat_dVg; - dVdsat_dVb = - (Vdsat * dAbulkCV_dVb + dVth_dVb)* dVdsat_dVg; + + dVdsat_dVg = 1.0 / AbulkCV; /*4.6.2*/ + Vdsat = Vgst * dVdsat_dVg; + dVdsat_dVb = - (Vdsat * dAbulkCV_dVb + dVth_dVb)* dVdsat_dVg; if (model->BSIM4xpart > 0.5) - { /* 0/100 Charge partition model */ - if (Vdsat <= Vds) - { /* saturation region */ - T1 = Vdsat / 3.0; - qgate = CoxWL * (Vgs_eff - Vfb - - pParam->BSIM4phi - T1); - T2 = -Two_Third_CoxWL * Vgst; - qbulk = -(qgate + T2); - qdrn = 0.0; + { /* 0/100 Charge partition model */ + if (Vdsat <= Vds) + { /* saturation region */ + T1 = Vdsat / 3.0; + qgate = CoxWL * (Vgs_eff - Vfb + - pParam->BSIM4phi - T1); + T2 = -Two_Third_CoxWL * Vgst; + qbulk = -(qgate + T2); + qdrn = 0.0; - here->BSIM4cggb = One_Third_CoxWL * (3.0 - - dVdsat_dVg) * dVgs_eff_dVg; - T2 = -One_Third_CoxWL * dVdsat_dVb; - here->BSIM4cgsb = -(here->BSIM4cggb + T2); + here->BSIM4cggb = One_Third_CoxWL * (3.0 + - dVdsat_dVg) * dVgs_eff_dVg; + T2 = -One_Third_CoxWL * dVdsat_dVb; + here->BSIM4cgsb = -(here->BSIM4cggb + T2); here->BSIM4cgdb = 0.0; here->BSIM4cdgb = 0.0; here->BSIM4cddb = 0.0; here->BSIM4cdsb = 0.0; - here->BSIM4cbgb = -(here->BSIM4cggb - - Two_Third_CoxWL * dVgs_eff_dVg); - T3 = -(T2 + Two_Third_CoxWL * dVth_dVb); - here->BSIM4cbsb = -(here->BSIM4cbgb + T3); + here->BSIM4cbgb = -(here->BSIM4cggb + - Two_Third_CoxWL * dVgs_eff_dVg); + T3 = -(T2 + Two_Third_CoxWL * dVth_dVb); + here->BSIM4cbsb = -(here->BSIM4cbgb + T3); here->BSIM4cbdb = 0.0; - } - else - { /* linear region */ - Alphaz = Vgst / Vdsat; - T1 = 2.0 * Vdsat - Vds; - T2 = Vds / (3.0 * T1); - T3 = T2 * Vds; - T9 = 0.25 * CoxWL; - T4 = T9 * Alphaz; - T7 = 2.0 * Vds - T1 - 3.0 * T3; - T8 = T3 - T1 - 2.0 * Vds; - qgate = CoxWL * (Vgs_eff - Vfb - - pParam->BSIM4phi - 0.5 * (Vds - T3)); - T10 = T4 * T8; - qdrn = T4 * T7; - qbulk = -(qgate + qdrn + T10); + } + else + { /* linear region */ + Alphaz = Vgst / Vdsat; + T1 = 2.0 * Vdsat - Vds; + T2 = Vds / (3.0 * T1); + T3 = T2 * Vds; + T9 = 0.25 * CoxWL; + T4 = T9 * Alphaz; + T7 = 2.0 * Vds - T1 - 3.0 * T3; + T8 = T3 - T1 - 2.0 * Vds; + qgate = CoxWL * (Vgs_eff - Vfb + - pParam->BSIM4phi - 0.5 * (Vds - T3)); + T10 = T4 * T8; + qdrn = T4 * T7; + qbulk = -(qgate + qdrn + T10); T5 = T3 / T1; here->BSIM4cggb = CoxWL * (1.0 - T5 * dVdsat_dVg) - * dVgs_eff_dVg; + * dVgs_eff_dVg; T11 = -CoxWL * T5 * dVdsat_dVb; here->BSIM4cgdb = CoxWL * (T2 - 0.5 + 0.5 * T5); here->BSIM4cgsb = -(here->BSIM4cggb + T11 @@ -2918,7 +3073,7 @@ for (; model != NULL; model = model->BSIM4nextModel) T8 = T9 * T8; T9 = 2.0 * T4 * (1.0 - 3.0 * T5); here->BSIM4cdgb = (T7 * dAlphaz_dVg - T9 - * dVdsat_dVg) * dVgs_eff_dVg; + * dVdsat_dVg) * dVgs_eff_dVg; T12 = T7 * dAlphaz_dVb - T9 * dVdsat_dVb; here->BSIM4cddb = T4 * (3.0 - 6.0 * T2 - 3.0 * T5); here->BSIM4cdsb = -(here->BSIM4cdgb + T12 @@ -2926,337 +3081,337 @@ for (; model != NULL; model = model->BSIM4nextModel) T9 = 2.0 * T4 * (1.0 + T5); T10 = (T8 * dAlphaz_dVg - T9 * dVdsat_dVg) - * dVgs_eff_dVg; + * dVgs_eff_dVg; T11 = T8 * dAlphaz_dVb - T9 * dVdsat_dVb; T12 = T4 * (2.0 * T2 + T5 - 1.0); T0 = -(T10 + T11 + T12); here->BSIM4cbgb = -(here->BSIM4cggb - + here->BSIM4cdgb + T10); + + here->BSIM4cdgb + T10); here->BSIM4cbdb = -(here->BSIM4cgdb - + here->BSIM4cddb + T12); + + here->BSIM4cddb + T12); here->BSIM4cbsb = -(here->BSIM4cgsb - + here->BSIM4cdsb + T0); + + here->BSIM4cdsb + T0); } } - else if (model->BSIM4xpart < 0.5) - { /* 40/60 Charge partition model */ - if (Vds >= Vdsat) - { /* saturation region */ - T1 = Vdsat / 3.0; - qgate = CoxWL * (Vgs_eff - Vfb - - pParam->BSIM4phi - T1); - T2 = -Two_Third_CoxWL * Vgst; - qbulk = -(qgate + T2); - qdrn = 0.4 * T2; + else if (model->BSIM4xpart < 0.5) + { /* 40/60 Charge partition model */ + if (Vds >= Vdsat) + { /* saturation region */ + T1 = Vdsat / 3.0; + qgate = CoxWL * (Vgs_eff - Vfb + - pParam->BSIM4phi - T1); + T2 = -Two_Third_CoxWL * Vgst; + qbulk = -(qgate + T2); + qdrn = 0.4 * T2; - here->BSIM4cggb = One_Third_CoxWL * (3.0 - - dVdsat_dVg) * dVgs_eff_dVg; - T2 = -One_Third_CoxWL * dVdsat_dVb; - here->BSIM4cgsb = -(here->BSIM4cggb + T2); - here->BSIM4cgdb = 0.0; + here->BSIM4cggb = One_Third_CoxWL * (3.0 + - dVdsat_dVg) * dVgs_eff_dVg; + T2 = -One_Third_CoxWL * dVdsat_dVb; + here->BSIM4cgsb = -(here->BSIM4cggb + T2); + here->BSIM4cgdb = 0.0; - T3 = 0.4 * Two_Third_CoxWL; + T3 = 0.4 * Two_Third_CoxWL; here->BSIM4cdgb = -T3 * dVgs_eff_dVg; here->BSIM4cddb = 0.0; - T4 = T3 * dVth_dVb; + T4 = T3 * dVth_dVb; here->BSIM4cdsb = -(T4 + here->BSIM4cdgb); - here->BSIM4cbgb = -(here->BSIM4cggb - - Two_Third_CoxWL * dVgs_eff_dVg); - T3 = -(T2 + Two_Third_CoxWL * dVth_dVb); - here->BSIM4cbsb = -(here->BSIM4cbgb + T3); + here->BSIM4cbgb = -(here->BSIM4cggb + - Two_Third_CoxWL * dVgs_eff_dVg); + T3 = -(T2 + Two_Third_CoxWL * dVth_dVb); + here->BSIM4cbsb = -(here->BSIM4cbgb + T3); here->BSIM4cbdb = 0.0; - } - else - { /* linear region */ - Alphaz = Vgst / Vdsat; - T1 = 2.0 * Vdsat - Vds; - T2 = Vds / (3.0 * T1); - T3 = T2 * Vds; - T9 = 0.25 * CoxWL; - T4 = T9 * Alphaz; - qgate = CoxWL * (Vgs_eff - Vfb - pParam->BSIM4phi - - 0.5 * (Vds - T3)); + } + else + { /* linear region */ + Alphaz = Vgst / Vdsat; + T1 = 2.0 * Vdsat - Vds; + T2 = Vds / (3.0 * T1); + T3 = T2 * Vds; + T9 = 0.25 * CoxWL; + T4 = T9 * Alphaz; + qgate = CoxWL * (Vgs_eff - Vfb - pParam->BSIM4phi + - 0.5 * (Vds - T3)); - T5 = T3 / T1; + T5 = T3 / T1; here->BSIM4cggb = CoxWL * (1.0 - T5 * dVdsat_dVg) - * dVgs_eff_dVg; + * dVgs_eff_dVg; tmp = -CoxWL * T5 * dVdsat_dVb; here->BSIM4cgdb = CoxWL * (T2 - 0.5 + 0.5 * T5); here->BSIM4cgsb = -(here->BSIM4cggb - + here->BSIM4cgdb + tmp); + + here->BSIM4cgdb + tmp); - T6 = 1.0 / Vdsat; + T6 = 1.0 / Vdsat; dAlphaz_dVg = T6 * (1.0 - Alphaz * dVdsat_dVg); dAlphaz_dVb = -T6 * (dVth_dVb + Alphaz * dVdsat_dVb); - T6 = 8.0 * Vdsat * Vdsat - 6.0 * Vdsat * Vds - + 1.2 * Vds * Vds; - T8 = T2 / T1; - T7 = Vds - T1 - T8 * T6; - qdrn = T4 * T7; - T7 *= T9; - tmp = T8 / T1; - tmp1 = T4 * (2.0 - 4.0 * tmp * T6 - + T8 * (16.0 * Vdsat - 6.0 * Vds)); + T6 = 8.0 * Vdsat * Vdsat - 6.0 * Vdsat * Vds + + 1.2 * Vds * Vds; + T8 = T2 / T1; + T7 = Vds - T1 - T8 * T6; + qdrn = T4 * T7; + T7 *= T9; + tmp = T8 / T1; + tmp1 = T4 * (2.0 - 4.0 * tmp * T6 + + T8 * (16.0 * Vdsat - 6.0 * Vds)); here->BSIM4cdgb = (T7 * dAlphaz_dVg - tmp1 - * dVdsat_dVg) * dVgs_eff_dVg; + * dVdsat_dVg) * dVgs_eff_dVg; T10 = T7 * dAlphaz_dVb - tmp1 * dVdsat_dVb; here->BSIM4cddb = T4 * (2.0 - (1.0 / (3.0 * T1 - * T1) + 2.0 * tmp) * T6 + T8 - * (6.0 * Vdsat - 2.4 * Vds)); + * T1) + 2.0 * tmp) * T6 + T8 + * (6.0 * Vdsat - 2.4 * Vds)); here->BSIM4cdsb = -(here->BSIM4cdgb - + T10 + here->BSIM4cddb); + + T10 + here->BSIM4cddb); - T7 = 2.0 * (T1 + T3); - qbulk = -(qgate - T4 * T7); - T7 *= T9; - T0 = 4.0 * T4 * (1.0 - T5); - T12 = (-T7 * dAlphaz_dVg - T0 * dVdsat_dVg) * dVgs_eff_dVg - - here->BSIM4cdgb; /*4.6.2*/ - T11 = -T7 * dAlphaz_dVb - T10 - T0 * dVdsat_dVb; - T10 = -4.0 * T4 * (T2 - 0.5 + 0.5 * T5) - - here->BSIM4cddb; + T7 = 2.0 * (T1 + T3); + qbulk = -(qgate - T4 * T7); + T7 *= T9; + T0 = 4.0 * T4 * (1.0 - T5); + T12 = (-T7 * dAlphaz_dVg - T0 * dVdsat_dVg) * dVgs_eff_dVg + - here->BSIM4cdgb; /*4.6.2*/ + T11 = -T7 * dAlphaz_dVb - T10 - T0 * dVdsat_dVb; + T10 = -4.0 * T4 * (T2 - 0.5 + 0.5 * T5) + - here->BSIM4cddb; tmp = -(T10 + T11 + T12); here->BSIM4cbgb = -(here->BSIM4cggb - + here->BSIM4cdgb + T12); + + here->BSIM4cdgb + T12); here->BSIM4cbdb = -(here->BSIM4cgdb - + here->BSIM4cddb + T10); + + here->BSIM4cddb + T10); here->BSIM4cbsb = -(here->BSIM4cgsb - + here->BSIM4cdsb + tmp); + + here->BSIM4cdsb + tmp); } } - else - { /* 50/50 partitioning */ - if (Vds >= Vdsat) - { /* saturation region */ - T1 = Vdsat / 3.0; - qgate = CoxWL * (Vgs_eff - Vfb - - pParam->BSIM4phi - T1); - T2 = -Two_Third_CoxWL * Vgst; - qbulk = -(qgate + T2); - qdrn = 0.5 * T2; + else + { /* 50/50 partitioning */ + if (Vds >= Vdsat) + { /* saturation region */ + T1 = Vdsat / 3.0; + qgate = CoxWL * (Vgs_eff - Vfb + - pParam->BSIM4phi - T1); + T2 = -Two_Third_CoxWL * Vgst; + qbulk = -(qgate + T2); + qdrn = 0.5 * T2; - here->BSIM4cggb = One_Third_CoxWL * (3.0 - - dVdsat_dVg) * dVgs_eff_dVg; - T2 = -One_Third_CoxWL * dVdsat_dVb; - here->BSIM4cgsb = -(here->BSIM4cggb + T2); - here->BSIM4cgdb = 0.0; + here->BSIM4cggb = One_Third_CoxWL * (3.0 + - dVdsat_dVg) * dVgs_eff_dVg; + T2 = -One_Third_CoxWL * dVdsat_dVb; + here->BSIM4cgsb = -(here->BSIM4cggb + T2); + here->BSIM4cgdb = 0.0; here->BSIM4cdgb = -One_Third_CoxWL * dVgs_eff_dVg; here->BSIM4cddb = 0.0; - T4 = One_Third_CoxWL * dVth_dVb; + T4 = One_Third_CoxWL * dVth_dVb; here->BSIM4cdsb = -(T4 + here->BSIM4cdgb); - here->BSIM4cbgb = -(here->BSIM4cggb - - Two_Third_CoxWL * dVgs_eff_dVg); - T3 = -(T2 + Two_Third_CoxWL * dVth_dVb); - here->BSIM4cbsb = -(here->BSIM4cbgb + T3); + here->BSIM4cbgb = -(here->BSIM4cggb + - Two_Third_CoxWL * dVgs_eff_dVg); + T3 = -(T2 + Two_Third_CoxWL * dVth_dVb); + here->BSIM4cbsb = -(here->BSIM4cbgb + T3); here->BSIM4cbdb = 0.0; - } - else - { /* linear region */ - Alphaz = Vgst / Vdsat; - T1 = 2.0 * Vdsat - Vds; - T2 = Vds / (3.0 * T1); - T3 = T2 * Vds; - T9 = 0.25 * CoxWL; - T4 = T9 * Alphaz; - qgate = CoxWL * (Vgs_eff - Vfb - pParam->BSIM4phi - - 0.5 * (Vds - T3)); + } + else + { /* linear region */ + Alphaz = Vgst / Vdsat; + T1 = 2.0 * Vdsat - Vds; + T2 = Vds / (3.0 * T1); + T3 = T2 * Vds; + T9 = 0.25 * CoxWL; + T4 = T9 * Alphaz; + qgate = CoxWL * (Vgs_eff - Vfb - pParam->BSIM4phi + - 0.5 * (Vds - T3)); - T5 = T3 / T1; + T5 = T3 / T1; here->BSIM4cggb = CoxWL * (1.0 - T5 * dVdsat_dVg) - * dVgs_eff_dVg; + * dVgs_eff_dVg; tmp = -CoxWL * T5 * dVdsat_dVb; here->BSIM4cgdb = CoxWL * (T2 - 0.5 + 0.5 * T5); here->BSIM4cgsb = -(here->BSIM4cggb - + here->BSIM4cgdb + tmp); + + here->BSIM4cgdb + tmp); - T6 = 1.0 / Vdsat; + T6 = 1.0 / Vdsat; dAlphaz_dVg = T6 * (1.0 - Alphaz * dVdsat_dVg); dAlphaz_dVb = -T6 * (dVth_dVb + Alphaz * dVdsat_dVb); - T7 = T1 + T3; - qdrn = -T4 * T7; - qbulk = - (qgate + qdrn + qdrn); - T7 *= T9; - T0 = T4 * (2.0 * T5 - 2.0); + T7 = T1 + T3; + qdrn = -T4 * T7; + qbulk = - (qgate + qdrn + qdrn); + T7 *= T9; + T0 = T4 * (2.0 * T5 - 2.0); here->BSIM4cdgb = (T0 * dVdsat_dVg - T7 - * dAlphaz_dVg) * dVgs_eff_dVg; - T12 = T0 * dVdsat_dVb - T7 * dAlphaz_dVb; + * dAlphaz_dVg) * dVgs_eff_dVg; + T12 = T0 * dVdsat_dVb - T7 * dAlphaz_dVb; here->BSIM4cddb = T4 * (1.0 - 2.0 * T2 - T5); here->BSIM4cdsb = -(here->BSIM4cdgb + T12 + here->BSIM4cddb); here->BSIM4cbgb = -(here->BSIM4cggb - + 2.0 * here->BSIM4cdgb); + + 2.0 * here->BSIM4cdgb); here->BSIM4cbdb = -(here->BSIM4cgdb - + 2.0 * here->BSIM4cddb); + + 2.0 * here->BSIM4cddb); here->BSIM4cbsb = -(here->BSIM4cgsb - + 2.0 * here->BSIM4cdsb); + + 2.0 * here->BSIM4cdsb); } /* end of linear region */ - } /* end of 50/50 partition */ - } /* end of inversion */ + } /* end of 50/50 partition */ + } /* end of inversion */ } /* end of capMod=0 */ - else - { if (Vbseff < 0.0) - { VbseffCV = Vbseff; + else + { if (Vbseff < 0.0) + { VbseffCV = Vbseff; dVbseffCV_dVb = 1.0; } - else - { VbseffCV = pParam->BSIM4phi - Phis; + else + { VbseffCV = pParam->BSIM4phi - Phis; dVbseffCV_dVb = -dPhis_dVb; } CoxWL = model->BSIM4coxe * pParam->BSIM4weffCV - * pParam->BSIM4leffCV * here->BSIM4nf; + * pParam->BSIM4leffCV * here->BSIM4nf; - if(model->BSIM4cvchargeMod == 0) - { - /* Seperate VgsteffCV with noff and voffcv */ - noff = n * pParam->BSIM4noff; - dnoff_dVd = pParam->BSIM4noff * dn_dVd; - dnoff_dVb = pParam->BSIM4noff * dn_dVb; - T0 = Vtm * noff; - voffcv = pParam->BSIM4voffcv; - VgstNVt = (Vgst - voffcv) / T0; - - if (VgstNVt > EXP_THRESHOLD) - { - Vgsteff = Vgst - voffcv; - dVgsteff_dVg = dVgs_eff_dVg; - dVgsteff_dVd = -dVth_dVd; - dVgsteff_dVb = -dVth_dVb; - } - else if (VgstNVt < -EXP_THRESHOLD) - { - Vgsteff = T0 * log(1.0 + MIN_EXP); - dVgsteff_dVg = 0.0; - dVgsteff_dVd = Vgsteff / noff; - dVgsteff_dVb = dVgsteff_dVd * dnoff_dVb; - dVgsteff_dVd *= dnoff_dVd; - } - else - { - ExpVgst = exp(VgstNVt); - Vgsteff = T0 * log(1.0 + ExpVgst); - dVgsteff_dVg = ExpVgst / (1.0 + ExpVgst); - dVgsteff_dVd = -dVgsteff_dVg * (dVth_dVd + (Vgst - voffcv) - / noff * dnoff_dVd) + Vgsteff / noff * dnoff_dVd; - dVgsteff_dVb = -dVgsteff_dVg * (dVth_dVb + (Vgst - voffcv) - / noff * dnoff_dVb) + Vgsteff / noff * dnoff_dVb; - dVgsteff_dVg *= dVgs_eff_dVg; - } - /* End of VgsteffCV for cvchargeMod = 0 */ - } - else - { - T0 = n * Vtm; - T1 = pParam->BSIM4mstarcv * Vgst; - T2 = T1 / T0; - if (T2 > EXP_THRESHOLD) - { - T10 = T1; - dT10_dVg = pParam->BSIM4mstarcv * dVgs_eff_dVg; - dT10_dVd = -dVth_dVd * pParam->BSIM4mstarcv; - dT10_dVb = -dVth_dVb * pParam->BSIM4mstarcv; - } - else if (T2 < -EXP_THRESHOLD) - { - T10 = Vtm * log(1.0 + MIN_EXP); - dT10_dVg = 0.0; - dT10_dVd = T10 * dn_dVd; - dT10_dVb = T10 * dn_dVb; - T10 *= n; - } - else - { - ExpVgst = exp(T2); - T3 = Vtm * log(1.0 + ExpVgst); - T10 = n * T3; - dT10_dVg = pParam->BSIM4mstarcv * ExpVgst / (1.0 + ExpVgst); - dT10_dVb = T3 * dn_dVb - dT10_dVg * (dVth_dVb + Vgst * dn_dVb / n); - dT10_dVd = T3 * dn_dVd - dT10_dVg * (dVth_dVd + Vgst * dn_dVd / n); - dT10_dVg *= dVgs_eff_dVg; - } - - T1 = pParam->BSIM4voffcbncv - (1.0 - pParam->BSIM4mstarcv) * Vgst; - T2 = T1 / T0; - if (T2 < -EXP_THRESHOLD) - { - T3 = model->BSIM4coxe * MIN_EXP / pParam->BSIM4cdep0; - T9 = pParam->BSIM4mstarcv + T3 * n; - dT9_dVg = 0.0; - dT9_dVd = dn_dVd * T3; - dT9_dVb = dn_dVb * T3; - } - else if (T2 > EXP_THRESHOLD) - { - T3 = model->BSIM4coxe * MAX_EXP / pParam->BSIM4cdep0; - T9 = pParam->BSIM4mstarcv + T3 * n; - dT9_dVg = 0.0; - dT9_dVd = dn_dVd * T3; - dT9_dVb = dn_dVb * T3; - } - else - { - ExpVgst = exp(T2); - T3 = model->BSIM4coxe / pParam->BSIM4cdep0; - T4 = T3 * ExpVgst; - T5 = T1 * T4 / T0; - T9 = pParam->BSIM4mstarcv + n * T4; - dT9_dVg = T3 * (pParam->BSIM4mstarcv - 1.0) * ExpVgst / Vtm; - dT9_dVb = T4 * dn_dVb - dT9_dVg * dVth_dVb - T5 * dn_dVb; - dT9_dVd = T4 * dn_dVd - dT9_dVg * dVth_dVd - T5 * dn_dVd; - dT9_dVg *= dVgs_eff_dVg; - } - - Vgsteff = T10 / T9; - T11 = T9 * T9; - dVgsteff_dVg = (T9 * dT10_dVg - T10 * dT9_dVg) / T11; - dVgsteff_dVd = (T9 * dT10_dVd - T10 * dT9_dVd) / T11; - dVgsteff_dVb = (T9 * dT10_dVb - T10 * dT9_dVb) / T11; - /* End of VgsteffCV for cvchargeMod = 1 */ - } - + if(model->BSIM4cvchargeMod == 0) + { + /* Seperate VgsteffCV with noff and voffcv */ + noff = n * pParam->BSIM4noff; + dnoff_dVd = pParam->BSIM4noff * dn_dVd; + dnoff_dVb = pParam->BSIM4noff * dn_dVb; + T0 = Vtm * noff; + voffcv = pParam->BSIM4voffcv; + VgstNVt = (Vgst - voffcv) / T0; + + if (VgstNVt > EXP_THRESHOLD) + { + Vgsteff = Vgst - voffcv; + dVgsteff_dVg = dVgs_eff_dVg; + dVgsteff_dVd = -dVth_dVd; + dVgsteff_dVb = -dVth_dVb; + } + else if (VgstNVt < -EXP_THRESHOLD) + { + Vgsteff = T0 * log(1.0 + MIN_EXP); + dVgsteff_dVg = 0.0; + dVgsteff_dVd = Vgsteff / noff; + dVgsteff_dVb = dVgsteff_dVd * dnoff_dVb; + dVgsteff_dVd *= dnoff_dVd; + } + else + { + ExpVgst = exp(VgstNVt); + Vgsteff = T0 * log(1.0 + ExpVgst); + dVgsteff_dVg = ExpVgst / (1.0 + ExpVgst); + dVgsteff_dVd = -dVgsteff_dVg * (dVth_dVd + (Vgst - voffcv) + / noff * dnoff_dVd) + Vgsteff / noff * dnoff_dVd; + dVgsteff_dVb = -dVgsteff_dVg * (dVth_dVb + (Vgst - voffcv) + / noff * dnoff_dVb) + Vgsteff / noff * dnoff_dVb; + dVgsteff_dVg *= dVgs_eff_dVg; + } + /* End of VgsteffCV for cvchargeMod = 0 */ + } + else + { + T0 = n * Vtm; + T1 = pParam->BSIM4mstarcv * Vgst; + T2 = T1 / T0; + if (T2 > EXP_THRESHOLD) + { + T10 = T1; + dT10_dVg = pParam->BSIM4mstarcv * dVgs_eff_dVg; + dT10_dVd = -dVth_dVd * pParam->BSIM4mstarcv; + dT10_dVb = -dVth_dVb * pParam->BSIM4mstarcv; + } + else if (T2 < -EXP_THRESHOLD) + { + T10 = Vtm * log(1.0 + MIN_EXP); + dT10_dVg = 0.0; + dT10_dVd = T10 * dn_dVd; + dT10_dVb = T10 * dn_dVb; + T10 *= n; + } + else + { + ExpVgst = exp(T2); + T3 = Vtm * log(1.0 + ExpVgst); + T10 = n * T3; + dT10_dVg = pParam->BSIM4mstarcv * ExpVgst / (1.0 + ExpVgst); + dT10_dVb = T3 * dn_dVb - dT10_dVg * (dVth_dVb + Vgst * dn_dVb / n); + dT10_dVd = T3 * dn_dVd - dT10_dVg * (dVth_dVd + Vgst * dn_dVd / n); + dT10_dVg *= dVgs_eff_dVg; + } + + T1 = pParam->BSIM4voffcbncv - (1.0 - pParam->BSIM4mstarcv) * Vgst; + T2 = T1 / T0; + if (T2 < -EXP_THRESHOLD) + { + T3 = model->BSIM4coxe * MIN_EXP / pParam->BSIM4cdep0; + T9 = pParam->BSIM4mstarcv + T3 * n; + dT9_dVg = 0.0; + dT9_dVd = dn_dVd * T3; + dT9_dVb = dn_dVb * T3; + } + else if (T2 > EXP_THRESHOLD) + { + T3 = model->BSIM4coxe * MAX_EXP / pParam->BSIM4cdep0; + T9 = pParam->BSIM4mstarcv + T3 * n; + dT9_dVg = 0.0; + dT9_dVd = dn_dVd * T3; + dT9_dVb = dn_dVb * T3; + } + else + { + ExpVgst = exp(T2); + T3 = model->BSIM4coxe / pParam->BSIM4cdep0; + T4 = T3 * ExpVgst; + T5 = T1 * T4 / T0; + T9 = pParam->BSIM4mstarcv + n * T4; + dT9_dVg = T3 * (pParam->BSIM4mstarcv - 1.0) * ExpVgst / Vtm; + dT9_dVb = T4 * dn_dVb - dT9_dVg * dVth_dVb - T5 * dn_dVb; + dT9_dVd = T4 * dn_dVd - dT9_dVg * dVth_dVd - T5 * dn_dVd; + dT9_dVg *= dVgs_eff_dVg; + } + + Vgsteff = T10 / T9; + T11 = T9 * T9; + dVgsteff_dVg = (T9 * dT10_dVg - T10 * dT9_dVg) / T11; + dVgsteff_dVd = (T9 * dT10_dVd - T10 * dT9_dVd) / T11; + dVgsteff_dVb = (T9 * dT10_dVb - T10 * dT9_dVb) / T11; + /* End of VgsteffCV for cvchargeMod = 1 */ + } + - if (model->BSIM4capMod == 1) - { Vfb = here->BSIM4vfbzb; + if (model->BSIM4capMod == 1) + { Vfb = here->BSIM4vfbzb; V3 = Vfb - Vgs_eff + VbseffCV - DELTA_3; - if (Vfb <= 0.0) - T0 = sqrt(V3 * V3 - 4.0 * DELTA_3 * Vfb); - else - T0 = sqrt(V3 * V3 + 4.0 * DELTA_3 * Vfb); + if (Vfb <= 0.0) + T0 = sqrt(V3 * V3 - 4.0 * DELTA_3 * Vfb); + else + T0 = sqrt(V3 * V3 + 4.0 * DELTA_3 * Vfb); - T1 = 0.5 * (1.0 + V3 / T0); - Vfbeff = Vfb - 0.5 * (V3 + T0); - dVfbeff_dVg = T1 * dVgs_eff_dVg; - dVfbeff_dVb = -T1 * dVbseffCV_dVb; - Qac0 = CoxWL * (Vfbeff - Vfb); - dQac0_dVg = CoxWL * dVfbeff_dVg; - dQac0_dVb = CoxWL * dVfbeff_dVb; + T1 = 0.5 * (1.0 + V3 / T0); + Vfbeff = Vfb - 0.5 * (V3 + T0); + dVfbeff_dVg = T1 * dVgs_eff_dVg; + dVfbeff_dVb = -T1 * dVbseffCV_dVb; + Qac0 = CoxWL * (Vfbeff - Vfb); + dQac0_dVg = CoxWL * dVfbeff_dVg; + dQac0_dVb = CoxWL * dVfbeff_dVb; T0 = 0.5 * pParam->BSIM4k1ox; - T3 = Vgs_eff - Vfbeff - VbseffCV - Vgsteff; + T3 = Vgs_eff - Vfbeff - VbseffCV - Vgsteff; if (pParam->BSIM4k1ox == 0.0) { T1 = 0.0; T2 = 0.0; } - else if (T3 < 0.0) - { T1 = T0 + T3 / pParam->BSIM4k1ox; + else if (T3 < 0.0) + { T1 = T0 + T3 / pParam->BSIM4k1ox; T2 = CoxWL; - } - else - { T1 = sqrt(T0 * T0 + T3); + } + else + { T1 = sqrt(T0 * T0 + T3); T2 = CoxWL * T0 / T1; - } + } - Qsub0 = CoxWL * pParam->BSIM4k1ox * (T1 - T0); + Qsub0 = CoxWL * pParam->BSIM4k1ox * (T1 - T0); dQsub0_dVg = T2 * (dVgs_eff_dVg - dVfbeff_dVg - dVgsteff_dVg); dQsub0_dVd = -T2 * dVgsteff_dVd; @@ -3265,27 +3420,27 @@ for (; model != NULL; model = model->BSIM4nextModel) AbulkCV = Abulk0 * pParam->BSIM4abulkCVfactor; dAbulkCV_dVb = pParam->BSIM4abulkCVfactor * dAbulk0_dVb; - VdsatCV = Vgsteff / AbulkCV; + VdsatCV = Vgsteff / AbulkCV; - T0 = VdsatCV - Vds - DELTA_4; - dT0_dVg = 1.0 / AbulkCV; - dT0_dVb = -VdsatCV * dAbulkCV_dVb / AbulkCV; - T1 = sqrt(T0 * T0 + 4.0 * DELTA_4 * VdsatCV); + T0 = VdsatCV - Vds - DELTA_4; + dT0_dVg = 1.0 / AbulkCV; + dT0_dVb = -VdsatCV * dAbulkCV_dVb / AbulkCV; + T1 = sqrt(T0 * T0 + 4.0 * DELTA_4 * VdsatCV); dT1_dVg = (T0 + DELTA_4 + DELTA_4) / T1; dT1_dVd = -T0 / T1; dT1_dVb = dT1_dVg * dT0_dVb; - dT1_dVg *= dT0_dVg; - if (T0 >= 0.0) - { VdseffCV = VdsatCV - 0.5 * (T0 + T1); + dT1_dVg *= dT0_dVg; + if (T0 >= 0.0) + { VdseffCV = VdsatCV - 0.5 * (T0 + T1); dVdseffCV_dVg = 0.5 * (dT0_dVg - dT1_dVg); dVdseffCV_dVd = 0.5 * (1.0 - dT1_dVd); dVdseffCV_dVb = 0.5 * (dT0_dVb - dT1_dVb); - } + } else { T3 = (DELTA_4 + DELTA_4) / (T1 - T0); - T4 = 1.0 - T3; - T5 = VdsatCV * T3 / (T1 - T0); - VdseffCV = VdsatCV * T4; + T4 = 1.0 - T3; + T5 = VdsatCV * T3 / (T1 - T0); + VdseffCV = VdsatCV * T4; dVdseffCV_dVg = dT0_dVg * T4 + T5 * (dT1_dVg - dT0_dVg); dVdseffCV_dVd = T5 * (dT1_dVd + 1.0); dVdseffCV_dVb = dT0_dVb * (T4 - T5) + T5 * dT1_dVb; @@ -3297,117 +3452,117 @@ for (; model != NULL; model = model->BSIM4nextModel) dVdseffCV_dVb = 0.0; } - T0 = AbulkCV * VdseffCV; - T1 = 12.0 * (Vgsteff - 0.5 * T0 + 1.0e-20); - T2 = VdseffCV / T1; - T3 = T0 * T2; - - T4 = (1.0 - 12.0 * T2 * T2 * AbulkCV); - T5 = (6.0 * T0 * (4.0 * Vgsteff - T0) / (T1 * T1) - 0.5); - T6 = 12.0 * T2 * T2 * Vgsteff; - - qgate = CoxWL * (Vgsteff - 0.5 * VdseffCV + T3); - Cgg1 = CoxWL * (T4 + T5 * dVdseffCV_dVg); - Cgd1 = CoxWL * T5 * dVdseffCV_dVd + Cgg1 * dVgsteff_dVd; - Cgb1 = CoxWL * (T5 * dVdseffCV_dVb + T6 * dAbulkCV_dVb) - + Cgg1 * dVgsteff_dVb; - Cgg1 *= dVgsteff_dVg; - - T7 = 1.0 - AbulkCV; - qbulk = CoxWL * T7 * (0.5 * VdseffCV - T3); - T4 = -T7 * (T4 - 1.0); - T5 = -T7 * T5; - T6 = -(T7 * T6 + (0.5 * VdseffCV - T3)); - Cbg1 = CoxWL * (T4 + T5 * dVdseffCV_dVg); - Cbd1 = CoxWL * T5 * dVdseffCV_dVd + Cbg1 * dVgsteff_dVd; - Cbb1 = CoxWL * (T5 * dVdseffCV_dVb + T6 * dAbulkCV_dVb) - + Cbg1 * dVgsteff_dVb; - Cbg1 *= dVgsteff_dVg; - - if (model->BSIM4xpart > 0.5) - { /* 0/100 Charge petition model */ - T1 = T1 + T1; - qsrc = -CoxWL * (0.5 * Vgsteff + 0.25 * T0 - - T0 * T0 / T1); - T7 = (4.0 * Vgsteff - T0) / (T1 * T1); - T4 = -(0.5 + 24.0 * T0 * T0 / (T1 * T1)); - T5 = -(0.25 * AbulkCV - 12.0 * AbulkCV * T0 * T7); - T6 = -(0.25 * VdseffCV - 12.0 * T0 * VdseffCV * T7); - Csg = CoxWL * (T4 + T5 * dVdseffCV_dVg); - Csd = CoxWL * T5 * dVdseffCV_dVd + Csg * dVgsteff_dVd; - Csb = CoxWL * (T5 * dVdseffCV_dVb + T6 * dAbulkCV_dVb) - + Csg * dVgsteff_dVb; - Csg *= dVgsteff_dVg; - } - else if (model->BSIM4xpart < 0.5) - { /* 40/60 Charge petition model */ - T1 = T1 / 12.0; - T2 = 0.5 * CoxWL / (T1 * T1); - T3 = Vgsteff * (2.0 * T0 * T0 / 3.0 + Vgsteff - * (Vgsteff - 4.0 * T0 / 3.0)) - - 2.0 * T0 * T0 * T0 / 15.0; - qsrc = -T2 * T3; - T7 = 4.0 / 3.0 * Vgsteff * (Vgsteff - T0) - + 0.4 * T0 * T0; - T4 = -2.0 * qsrc / T1 - T2 * (Vgsteff * (3.0 - * Vgsteff - 8.0 * T0 / 3.0) - + 2.0 * T0 * T0 / 3.0); - T5 = (qsrc / T1 + T2 * T7) * AbulkCV; - T6 = (qsrc / T1 * VdseffCV + T2 * T7 * VdseffCV); - Csg = (T4 + T5 * dVdseffCV_dVg); - Csd = T5 * dVdseffCV_dVd + Csg * dVgsteff_dVd; - Csb = (T5 * dVdseffCV_dVb + T6 * dAbulkCV_dVb) - + Csg * dVgsteff_dVb; - Csg *= dVgsteff_dVg; - } - else - { /* 50/50 Charge petition model */ - qsrc = -0.5 * (qgate + qbulk); - Csg = -0.5 * (Cgg1 + Cbg1); - Csb = -0.5 * (Cgb1 + Cbb1); - Csd = -0.5 * (Cgd1 + Cbd1); - } - - qgate += Qac0 + Qsub0; - qbulk -= (Qac0 + Qsub0); - qdrn = -(qgate + qbulk + qsrc); - - Cgg = dQac0_dVg + dQsub0_dVg + Cgg1; - Cgd = dQsub0_dVd + Cgd1; - Cgb = dQac0_dVb + dQsub0_dVb + Cgb1; - - Cbg = Cbg1 - dQac0_dVg - dQsub0_dVg; - Cbd = Cbd1 - dQsub0_dVd; - Cbb = Cbb1 - dQac0_dVb - dQsub0_dVb; - - Cgb *= dVbseff_dVb; - Cbb *= dVbseff_dVb; - Csb *= dVbseff_dVb; - - here->BSIM4cggb = Cgg; - here->BSIM4cgsb = -(Cgg + Cgd + Cgb); - here->BSIM4cgdb = Cgd; - here->BSIM4cdgb = -(Cgg + Cbg + Csg); - here->BSIM4cdsb = (Cgg + Cgd + Cgb + Cbg + Cbd + Cbb - + Csg + Csd + Csb); - here->BSIM4cddb = -(Cgd + Cbd + Csd); - here->BSIM4cbgb = Cbg; - here->BSIM4cbsb = -(Cbg + Cbd + Cbb); - here->BSIM4cbdb = Cbd; - } - + T0 = AbulkCV * VdseffCV; + T1 = 12.0 * (Vgsteff - 0.5 * T0 + 1.0e-20); + T2 = VdseffCV / T1; + T3 = T0 * T2; + + T4 = (1.0 - 12.0 * T2 * T2 * AbulkCV); + T5 = (6.0 * T0 * (4.0 * Vgsteff - T0) / (T1 * T1) - 0.5); + T6 = 12.0 * T2 * T2 * Vgsteff; + + qgate = CoxWL * (Vgsteff - 0.5 * VdseffCV + T3); + Cgg1 = CoxWL * (T4 + T5 * dVdseffCV_dVg); + Cgd1 = CoxWL * T5 * dVdseffCV_dVd + Cgg1 * dVgsteff_dVd; + Cgb1 = CoxWL * (T5 * dVdseffCV_dVb + T6 * dAbulkCV_dVb) + + Cgg1 * dVgsteff_dVb; + Cgg1 *= dVgsteff_dVg; + + T7 = 1.0 - AbulkCV; + qbulk = CoxWL * T7 * (0.5 * VdseffCV - T3); + T4 = -T7 * (T4 - 1.0); + T5 = -T7 * T5; + T6 = -(T7 * T6 + (0.5 * VdseffCV - T3)); + Cbg1 = CoxWL * (T4 + T5 * dVdseffCV_dVg); + Cbd1 = CoxWL * T5 * dVdseffCV_dVd + Cbg1 * dVgsteff_dVd; + Cbb1 = CoxWL * (T5 * dVdseffCV_dVb + T6 * dAbulkCV_dVb) + + Cbg1 * dVgsteff_dVb; + Cbg1 *= dVgsteff_dVg; + + if (model->BSIM4xpart > 0.5) + { /* 0/100 Charge petition model */ + T1 = T1 + T1; + qsrc = -CoxWL * (0.5 * Vgsteff + 0.25 * T0 + - T0 * T0 / T1); + T7 = (4.0 * Vgsteff - T0) / (T1 * T1); + T4 = -(0.5 + 24.0 * T0 * T0 / (T1 * T1)); + T5 = -(0.25 * AbulkCV - 12.0 * AbulkCV * T0 * T7); + T6 = -(0.25 * VdseffCV - 12.0 * T0 * VdseffCV * T7); + Csg = CoxWL * (T4 + T5 * dVdseffCV_dVg); + Csd = CoxWL * T5 * dVdseffCV_dVd + Csg * dVgsteff_dVd; + Csb = CoxWL * (T5 * dVdseffCV_dVb + T6 * dAbulkCV_dVb) + + Csg * dVgsteff_dVb; + Csg *= dVgsteff_dVg; + } + else if (model->BSIM4xpart < 0.5) + { /* 40/60 Charge petition model */ + T1 = T1 / 12.0; + T2 = 0.5 * CoxWL / (T1 * T1); + T3 = Vgsteff * (2.0 * T0 * T0 / 3.0 + Vgsteff + * (Vgsteff - 4.0 * T0 / 3.0)) + - 2.0 * T0 * T0 * T0 / 15.0; + qsrc = -T2 * T3; + T7 = 4.0 / 3.0 * Vgsteff * (Vgsteff - T0) + + 0.4 * T0 * T0; + T4 = -2.0 * qsrc / T1 - T2 * (Vgsteff * (3.0 + * Vgsteff - 8.0 * T0 / 3.0) + + 2.0 * T0 * T0 / 3.0); + T5 = (qsrc / T1 + T2 * T7) * AbulkCV; + T6 = (qsrc / T1 * VdseffCV + T2 * T7 * VdseffCV); + Csg = (T4 + T5 * dVdseffCV_dVg); + Csd = T5 * dVdseffCV_dVd + Csg * dVgsteff_dVd; + Csb = (T5 * dVdseffCV_dVb + T6 * dAbulkCV_dVb) + + Csg * dVgsteff_dVb; + Csg *= dVgsteff_dVg; + } + else + { /* 50/50 Charge petition model */ + qsrc = -0.5 * (qgate + qbulk); + Csg = -0.5 * (Cgg1 + Cbg1); + Csb = -0.5 * (Cgb1 + Cbb1); + Csd = -0.5 * (Cgd1 + Cbd1); + } + + qgate += Qac0 + Qsub0; + qbulk -= (Qac0 + Qsub0); + qdrn = -(qgate + qbulk + qsrc); + + Cgg = dQac0_dVg + dQsub0_dVg + Cgg1; + Cgd = dQsub0_dVd + Cgd1; + Cgb = dQac0_dVb + dQsub0_dVb + Cgb1; + + Cbg = Cbg1 - dQac0_dVg - dQsub0_dVg; + Cbd = Cbd1 - dQsub0_dVd; + Cbb = Cbb1 - dQac0_dVb - dQsub0_dVb; + + Cgb *= dVbseff_dVb; + Cbb *= dVbseff_dVb; + Csb *= dVbseff_dVb; + + here->BSIM4cggb = Cgg; + here->BSIM4cgsb = -(Cgg + Cgd + Cgb); + here->BSIM4cgdb = Cgd; + here->BSIM4cdgb = -(Cgg + Cbg + Csg); + here->BSIM4cdsb = (Cgg + Cgd + Cgb + Cbg + Cbd + Cbb + + Csg + Csd + Csb); + here->BSIM4cddb = -(Cgd + Cbd + Csd); + here->BSIM4cbgb = Cbg; + here->BSIM4cbsb = -(Cbg + Cbd + Cbb); + here->BSIM4cbdb = Cbd; + } + /* Charge-Thickness capMod (CTM) begins */ - else if (model->BSIM4capMod == 2) - { V3 = here->BSIM4vfbzb - Vgs_eff + VbseffCV - DELTA_3; - if (here->BSIM4vfbzb <= 0.0) - T0 = sqrt(V3 * V3 - 4.0 * DELTA_3 * here->BSIM4vfbzb); - else - T0 = sqrt(V3 * V3 + 4.0 * DELTA_3 * here->BSIM4vfbzb); + else if (model->BSIM4capMod == 2) + { V3 = here->BSIM4vfbzb - Vgs_eff + VbseffCV - DELTA_3; + if (here->BSIM4vfbzb <= 0.0) + T0 = sqrt(V3 * V3 - 4.0 * DELTA_3 * here->BSIM4vfbzb); + else + T0 = sqrt(V3 * V3 + 4.0 * DELTA_3 * here->BSIM4vfbzb); - T1 = 0.5 * (1.0 + V3 / T0); - Vfbeff = here->BSIM4vfbzb - 0.5 * (V3 + T0); - dVfbeff_dVg = T1 * dVgs_eff_dVg; - dVfbeff_dVb = -T1 * dVbseffCV_dVb; + T1 = 0.5 * (1.0 + V3 / T0); + Vfbeff = here->BSIM4vfbzb - 0.5 * (V3 + T0); + dVfbeff_dVg = T1 * dVgs_eff_dVg; + dVfbeff_dVb = -T1 * dVbseffCV_dVb; Cox = model->BSIM4coxp; Tox = 1.0e8 * model->BSIM4toxp; @@ -3453,7 +3608,7 @@ for (; model != NULL; model = model->BSIM4nextModel) dQac0_dVg = CoxWLcen * dVfbeff_dVg + QovCox * dCoxeff_dVg; dQac0_dVb = CoxWLcen * dVfbeff_dVb - + QovCox * dCoxeff_dVb; + + QovCox * dCoxeff_dVb; T0 = 0.5 * pParam->BSIM4k1ox; T3 = Vgs_eff - Vfbeff - VbseffCV - Vgsteff; @@ -3478,28 +3633,28 @@ for (; model != NULL; model = model->BSIM4nextModel) dQsub0_dVb = -T2 * (dVfbeff_dVb + dVbseffCV_dVb + dVgsteff_dVb) + QovCox * dCoxeff_dVb; - /* Gate-bias dependent delta Phis begins */ - if (pParam->BSIM4k1ox <= 0.0) - { Denomi = 0.25 * pParam->BSIM4moin * Vtm; + /* Gate-bias dependent delta Phis begins */ + if (pParam->BSIM4k1ox <= 0.0) + { Denomi = 0.25 * pParam->BSIM4moin * Vtm; T0 = 0.5 * pParam->BSIM4sqrtPhi; - } - else - { Denomi = pParam->BSIM4moin * Vtm - * pParam->BSIM4k1ox * pParam->BSIM4k1ox; + } + else + { Denomi = pParam->BSIM4moin * Vtm + * pParam->BSIM4k1ox * pParam->BSIM4k1ox; T0 = pParam->BSIM4k1ox * pParam->BSIM4sqrtPhi; - } + } T1 = 2.0 * T0 + Vgsteff; - DeltaPhi = Vtm * log(1.0 + T1 * Vgsteff / Denomi); - dDeltaPhi_dVg = 2.0 * Vtm * (T1 -T0) / (Denomi + T1 * Vgsteff); - /* End of delta Phis */ + DeltaPhi = Vtm * log(1.0 + T1 * Vgsteff / Denomi); + 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); + /* 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; @@ -3512,15 +3667,15 @@ for (; model != NULL; model = model->BSIM4nextModel) dTcen_dVb = dTcen_dVg * dVgsteff_dVb; dTcen_dVg *= dVgsteff_dVg; - Ccen = epssub / Tcen; - T0 = Cox / (Cox + Ccen); - Coxeff = T0 * Ccen; - T1 = -Ccen / Tcen; - dCoxeff_dVg = T0 * T0 * T1; - dCoxeff_dVd = dCoxeff_dVg * dTcen_dVd; - dCoxeff_dVb = dCoxeff_dVg * dTcen_dVb; - dCoxeff_dVg *= dTcen_dVg; - CoxWLcen = CoxWL * Coxeff / model->BSIM4coxe; + Ccen = epssub / Tcen; + T0 = Cox / (Cox + Ccen); + Coxeff = T0 * Ccen; + T1 = -Ccen / Tcen; + dCoxeff_dVg = T0 * T0 * T1; + dCoxeff_dVd = dCoxeff_dVg * dTcen_dVd; + dCoxeff_dVb = dCoxeff_dVg * dTcen_dVb; + dCoxeff_dVg *= dTcen_dVg; + CoxWLcen = CoxWL * Coxeff / model->BSIM4coxe; AbulkCV = Abulk0 * pParam->BSIM4abulkCVfactor; dAbulkCV_dVb = pParam->BSIM4abulkCVfactor * dAbulk0_dVb; @@ -3557,22 +3712,22 @@ for (; model != NULL; model = model->BSIM4nextModel) } T0 = AbulkCV * VdseffCV; - T1 = VgDP; + T1 = VgDP; T2 = 12.0 * (T1 - 0.5 * T0 + 1.0e-20); T3 = T0 / T2; T4 = 1.0 - 12.0 * T3 * T3; T5 = AbulkCV * (6.0 * T0 * (4.0 * T1 - T0) / (T2 * T2) - 0.5); - T6 = T5 * VdseffCV / AbulkCV; + T6 = T5 * VdseffCV / AbulkCV; qgate = CoxWLcen * (T1 - T0 * (0.5 - T3)); - QovCox = qgate / Coxeff; - Cgg1 = CoxWLcen * (T4 * dVgDP_dVg - + T5 * dVdseffCV_dVg); - Cgd1 = CoxWLcen * T5 * dVdseffCV_dVd + Cgg1 - * dVgsteff_dVd + QovCox * dCoxeff_dVd; - Cgb1 = CoxWLcen * (T5 * dVdseffCV_dVb + T6 * dAbulkCV_dVb) - + Cgg1 * dVgsteff_dVb + QovCox * dCoxeff_dVb; - Cgg1 = Cgg1 * dVgsteff_dVg + QovCox * dCoxeff_dVg; + QovCox = qgate / Coxeff; + Cgg1 = CoxWLcen * (T4 * dVgDP_dVg + + T5 * dVdseffCV_dVg); + Cgd1 = CoxWLcen * T5 * dVdseffCV_dVd + Cgg1 + * dVgsteff_dVd + QovCox * dCoxeff_dVd; + Cgb1 = CoxWLcen * (T5 * dVdseffCV_dVb + T6 * dAbulkCV_dVb) + + Cgg1 * dVgsteff_dVb + QovCox * dCoxeff_dVb; + Cgg1 = Cgg1 * dVgsteff_dVg + QovCox * dCoxeff_dVg; T7 = 1.0 - AbulkCV; @@ -3582,90 +3737,90 @@ for (; model != NULL; model = model->BSIM4nextModel) T11 = -T7 * T5 / AbulkCV; T12 = -(T9 * T1 / AbulkCV + VdseffCV * (0.5 - T0 / T2)); - qbulk = CoxWLcen * T7 * (0.5 * VdseffCV - T0 * VdseffCV / T2); - QovCox = qbulk / Coxeff; - Cbg1 = CoxWLcen * (T10 + T11 * dVdseffCV_dVg); - Cbd1 = CoxWLcen * T11 * dVdseffCV_dVd + Cbg1 - * dVgsteff_dVd + QovCox * dCoxeff_dVd; - Cbb1 = CoxWLcen * (T11 * dVdseffCV_dVb + T12 * dAbulkCV_dVb) - + Cbg1 * dVgsteff_dVb + QovCox * dCoxeff_dVb; - Cbg1 = Cbg1 * dVgsteff_dVg + QovCox * dCoxeff_dVg; + qbulk = CoxWLcen * T7 * (0.5 * VdseffCV - T0 * VdseffCV / T2); + QovCox = qbulk / Coxeff; + Cbg1 = CoxWLcen * (T10 + T11 * dVdseffCV_dVg); + Cbd1 = CoxWLcen * T11 * dVdseffCV_dVd + Cbg1 + * dVgsteff_dVd + QovCox * dCoxeff_dVd; + Cbb1 = CoxWLcen * (T11 * dVdseffCV_dVb + T12 * dAbulkCV_dVb) + + Cbg1 * dVgsteff_dVb + QovCox * dCoxeff_dVb; + Cbg1 = Cbg1 * dVgsteff_dVg + QovCox * dCoxeff_dVg; if (model->BSIM4xpart > 0.5) - { /* 0/100 partition */ - qsrc = -CoxWLcen * (T1 / 2.0 + T0 / 4.0 - - 0.5 * T0 * T0 / T2); - QovCox = qsrc / Coxeff; - T2 += T2; - T3 = T2 * T2; - T7 = -(0.25 - 12.0 * T0 * (4.0 * T1 - T0) / T3); - T4 = -(0.5 + 24.0 * T0 * T0 / T3) * dVgDP_dVg; - T5 = T7 * AbulkCV; - T6 = T7 * VdseffCV; + { /* 0/100 partition */ + qsrc = -CoxWLcen * (T1 / 2.0 + T0 / 4.0 + - 0.5 * T0 * T0 / T2); + QovCox = qsrc / Coxeff; + T2 += T2; + T3 = T2 * T2; + T7 = -(0.25 - 12.0 * T0 * (4.0 * T1 - T0) / T3); + T4 = -(0.5 + 24.0 * T0 * T0 / T3) * dVgDP_dVg; + T5 = T7 * AbulkCV; + T6 = T7 * VdseffCV; - Csg = CoxWLcen * (T4 + T5 * dVdseffCV_dVg); - Csd = CoxWLcen * T5 * dVdseffCV_dVd + Csg * dVgsteff_dVd - + QovCox * dCoxeff_dVd; - Csb = CoxWLcen * (T5 * dVdseffCV_dVb + T6 * dAbulkCV_dVb) - + Csg * dVgsteff_dVb + QovCox * dCoxeff_dVb; - Csg = Csg * dVgsteff_dVg + QovCox * dCoxeff_dVg; + Csg = CoxWLcen * (T4 + T5 * dVdseffCV_dVg); + Csd = CoxWLcen * T5 * dVdseffCV_dVd + Csg * dVgsteff_dVd + + QovCox * dCoxeff_dVd; + Csb = CoxWLcen * (T5 * dVdseffCV_dVb + T6 * dAbulkCV_dVb) + + Csg * dVgsteff_dVb + QovCox * dCoxeff_dVb; + Csg = Csg * dVgsteff_dVg + QovCox * dCoxeff_dVg; } - else if (model->BSIM4xpart < 0.5) - { /* 40/60 partition */ - T2 = T2 / 12.0; - T3 = 0.5 * CoxWLcen / (T2 * T2); + else if (model->BSIM4xpart < 0.5) + { /* 40/60 partition */ + T2 = T2 / 12.0; + T3 = 0.5 * CoxWLcen / (T2 * T2); T4 = T1 * (2.0 * T0 * T0 / 3.0 + T1 * (T1 - 4.0 * T0 / 3.0)) - 2.0 * T0 * T0 * T0 / 15.0; - qsrc = -T3 * T4; - QovCox = qsrc / Coxeff; - T8 = 4.0 / 3.0 * T1 * (T1 - T0) + 0.4 * T0 * T0; - T5 = -2.0 * qsrc / T2 - T3 * (T1 * (3.0 * T1 - 8.0 - * T0 / 3.0) + 2.0 * T0 * T0 / 3.0); - T6 = AbulkCV * (qsrc / T2 + T3 * T8); - T7 = T6 * VdseffCV / AbulkCV; + qsrc = -T3 * T4; + QovCox = qsrc / Coxeff; + T8 = 4.0 / 3.0 * T1 * (T1 - T0) + 0.4 * T0 * T0; + T5 = -2.0 * qsrc / T2 - T3 * (T1 * (3.0 * T1 - 8.0 + * T0 / 3.0) + 2.0 * T0 * T0 / 3.0); + T6 = AbulkCV * (qsrc / T2 + T3 * T8); + T7 = T6 * VdseffCV / AbulkCV; - Csg = T5 * dVgDP_dVg + T6 * dVdseffCV_dVg; - Csd = Csg * dVgsteff_dVd + T6 * dVdseffCV_dVd - + QovCox * dCoxeff_dVd; - Csb = Csg * dVgsteff_dVb + T6 * dVdseffCV_dVb - + T7 * dAbulkCV_dVb + QovCox * dCoxeff_dVb; - Csg = Csg * dVgsteff_dVg + QovCox * dCoxeff_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 + + T7 * dAbulkCV_dVb + QovCox * dCoxeff_dVb; + Csg = Csg * dVgsteff_dVg + QovCox * dCoxeff_dVg; } - else - { /* 50/50 partition */ + else + { /* 50/50 partition */ qsrc = -0.5 * qgate; Csg = -0.5 * Cgg1; Csd = -0.5 * Cgd1; Csb = -0.5 * Cgb1; } - qgate += Qac0 + Qsub0 - qbulk; - qbulk -= (Qac0 + Qsub0); + qgate += Qac0 + Qsub0 - qbulk; + qbulk -= (Qac0 + Qsub0); qdrn = -(qgate + qbulk + qsrc); - Cbg = Cbg1 - dQac0_dVg - dQsub0_dVg; - Cbd = Cbd1 - dQsub0_dVd; - Cbb = Cbb1 - dQac0_dVb - dQsub0_dVb; + Cbg = Cbg1 - dQac0_dVg - dQsub0_dVg; + Cbd = Cbd1 - dQsub0_dVd; + Cbb = Cbb1 - dQac0_dVb - dQsub0_dVb; Cgg = Cgg1 - Cbg; Cgd = Cgd1 - Cbd; Cgb = Cgb1 - Cbb; - Cgb *= dVbseff_dVb; - Cbb *= dVbseff_dVb; - Csb *= dVbseff_dVb; + Cgb *= dVbseff_dVb; + Cbb *= dVbseff_dVb; + Csb *= dVbseff_dVb; here->BSIM4cggb = Cgg; - here->BSIM4cgsb = -(Cgg + Cgd + Cgb); - here->BSIM4cgdb = Cgd; + here->BSIM4cgsb = -(Cgg + Cgd + Cgb); + here->BSIM4cgdb = Cgd; here->BSIM4cdgb = -(Cgg + Cbg + Csg); - here->BSIM4cdsb = (Cgg + Cgd + Cgb + Cbg + Cbd + Cbb - + Csg + Csd + Csb); - here->BSIM4cddb = -(Cgd + Cbd + Csd); + here->BSIM4cdsb = (Cgg + Cgd + Cgb + Cbg + Cbd + Cbb + + Csg + Csd + Csb); + here->BSIM4cddb = -(Cgd + Cbd + Csd); here->BSIM4cbgb = Cbg; - here->BSIM4cbsb = -(Cbg + Cbd + Cbb); - here->BSIM4cbdb = Cbd; - } /* End of CTM */ + here->BSIM4cbsb = -(Cbg + Cbd + Cbb); + here->BSIM4cbdb = Cbd; + } /* End of CTM */ } here->BSIM4csgb = - here->BSIM4cggb - here->BSIM4cdgb - here->BSIM4cbgb; @@ -3694,26 +3849,26 @@ for (; model != NULL; model = model->BSIM4nextModel) T1 = here->BSIM4gcrg / CoxWL; /* 1 / tau */ here->BSIM4gtau = T1 * ScalingFactor; - if (here->BSIM4acnqsMod) + if (here->BSIM4acnqsMod) here->BSIM4taunet = 1.0 / T1; *(ckt->CKTstate0 + here->BSIM4qcheq) = qcheq; if (ckt->CKTmode & MODEINITTRAN) *(ckt->CKTstate1 + here->BSIM4qcheq) = *(ckt->CKTstate0 + here->BSIM4qcheq); - if (here->BSIM4trnqsMod) + if (here->BSIM4trnqsMod) { error = NIintegrate(ckt, &geq, &ceq, 0.0, here->BSIM4qcheq); if (error) return(error); - } + } } finished: - /* Calculate junction C-V */ + /* Calculate junction C-V */ if (ChargeComputationNeeded) - { czbd = model->BSIM4DunitAreaTempJctCap * here->BSIM4Adeff; /* bug fix */ + { czbd = model->BSIM4DunitAreaTempJctCap * here->BSIM4Adeff; /* bug fix */ czbs = model->BSIM4SunitAreaTempJctCap * here->BSIM4Aseff; czbdsw = model->BSIM4DunitLengthSidewallTempJctCap * here->BSIM4Pdeff; czbdswg = model->BSIM4DunitLengthGateSidewallTempJctCap @@ -3724,56 +3879,56 @@ finished: MJS = model->BSIM4SbulkJctBotGradingCoeff; MJSWS = model->BSIM4SbulkJctSideGradingCoeff; - MJSWGS = model->BSIM4SbulkJctGateSideGradingCoeff; + MJSWGS = model->BSIM4SbulkJctGateSideGradingCoeff; MJD = model->BSIM4DbulkJctBotGradingCoeff; MJSWD = model->BSIM4DbulkJctSideGradingCoeff; MJSWGD = model->BSIM4DbulkJctGateSideGradingCoeff; /* Source Bulk Junction */ - if (vbs_jct == 0.0) - { *(ckt->CKTstate0 + here->BSIM4qbs) = 0.0; + if (vbs_jct == 0.0) + { *(ckt->CKTstate0 + here->BSIM4qbs) = 0.0; here->BSIM4capbs = czbs + czbssw + czbsswg; - } - else if (vbs_jct < 0.0) - { if (czbs > 0.0) - { arg = 1.0 - vbs_jct / model->BSIM4PhiBS; - if (MJS == 0.5) + } + else if (vbs_jct < 0.0) + { if (czbs > 0.0) + { arg = 1.0 - vbs_jct / model->BSIM4PhiBS; + if (MJS == 0.5) sarg = 1.0 / sqrt(arg); - else + else sarg = exp(-MJS * log(arg)); *(ckt->CKTstate0 + here->BSIM4qbs) = model->BSIM4PhiBS * czbs - * (1.0 - arg * sarg) / (1.0 - MJS); - here->BSIM4capbs = czbs * sarg; - } - else - { *(ckt->CKTstate0 + here->BSIM4qbs) = 0.0; - here->BSIM4capbs = 0.0; - } - if (czbssw > 0.0) - { arg = 1.0 - vbs_jct / model->BSIM4PhiBSWS; - if (MJSWS == 0.5) + * (1.0 - arg * sarg) / (1.0 - MJS); + here->BSIM4capbs = czbs * sarg; + } + else + { *(ckt->CKTstate0 + here->BSIM4qbs) = 0.0; + here->BSIM4capbs = 0.0; + } + if (czbssw > 0.0) + { arg = 1.0 - vbs_jct / model->BSIM4PhiBSWS; + if (MJSWS == 0.5) sarg = 1.0 / sqrt(arg); - else + else sarg = exp(-MJSWS * log(arg)); *(ckt->CKTstate0 + here->BSIM4qbs) += model->BSIM4PhiBSWS * czbssw - * (1.0 - arg * sarg) / (1.0 - MJSWS); + * (1.0 - arg * sarg) / (1.0 - MJSWS); here->BSIM4capbs += czbssw * sarg; - } - if (czbsswg > 0.0) - { arg = 1.0 - vbs_jct / model->BSIM4PhiBSWGS; - if (MJSWGS == 0.5) + } + if (czbsswg > 0.0) + { arg = 1.0 - vbs_jct / model->BSIM4PhiBSWGS; + if (MJSWGS == 0.5) sarg = 1.0 / sqrt(arg); - else + else sarg = exp(-MJSWGS * log(arg)); *(ckt->CKTstate0 + here->BSIM4qbs) += model->BSIM4PhiBSWGS * czbsswg - * (1.0 - arg * sarg) / (1.0 - MJSWGS); + * (1.0 - arg * sarg) / (1.0 - MJSWGS); here->BSIM4capbs += czbsswg * sarg; - } + } } - else - { T0 = czbs + czbssw + czbsswg; + else + { T0 = czbs + czbssw + czbsswg; T1 = vbs_jct * (czbs * MJS / model->BSIM4PhiBS + czbssw * MJSWS / model->BSIM4PhiBSWS + czbsswg * MJSWGS / model->BSIM4PhiBSWGS); *(ckt->CKTstate0 + here->BSIM4qbs) = vbs_jct * (T0 + 0.5 * T1); @@ -3781,48 +3936,48 @@ finished: } /* Drain Bulk Junction */ - if (vbd_jct == 0.0) - { *(ckt->CKTstate0 + here->BSIM4qbd) = 0.0; + if (vbd_jct == 0.0) + { *(ckt->CKTstate0 + here->BSIM4qbd) = 0.0; here->BSIM4capbd = czbd + czbdsw + czbdswg; - } - else if (vbd_jct < 0.0) - { if (czbd > 0.0) - { arg = 1.0 - vbd_jct / model->BSIM4PhiBD; - if (MJD == 0.5) + } + else if (vbd_jct < 0.0) + { if (czbd > 0.0) + { arg = 1.0 - vbd_jct / model->BSIM4PhiBD; + if (MJD == 0.5) sarg = 1.0 / sqrt(arg); - else + else sarg = exp(-MJD * log(arg)); *(ckt->CKTstate0 + here->BSIM4qbd) = model->BSIM4PhiBD* czbd - * (1.0 - arg * sarg) / (1.0 - MJD); + * (1.0 - arg * sarg) / (1.0 - MJD); here->BSIM4capbd = czbd * sarg; - } - else - { *(ckt->CKTstate0 + here->BSIM4qbd) = 0.0; + } + else + { *(ckt->CKTstate0 + here->BSIM4qbd) = 0.0; here->BSIM4capbd = 0.0; - } - if (czbdsw > 0.0) - { arg = 1.0 - vbd_jct / model->BSIM4PhiBSWD; - if (MJSWD == 0.5) + } + if (czbdsw > 0.0) + { arg = 1.0 - vbd_jct / model->BSIM4PhiBSWD; + if (MJSWD == 0.5) sarg = 1.0 / sqrt(arg); - else + else sarg = exp(-MJSWD * log(arg)); *(ckt->CKTstate0 + here->BSIM4qbd) += model->BSIM4PhiBSWD * czbdsw - * (1.0 - arg * sarg) / (1.0 - MJSWD); + * (1.0 - arg * sarg) / (1.0 - MJSWD); here->BSIM4capbd += czbdsw * sarg; - } - if (czbdswg > 0.0) - { arg = 1.0 - vbd_jct / model->BSIM4PhiBSWGD; - if (MJSWGD == 0.5) + } + if (czbdswg > 0.0) + { arg = 1.0 - vbd_jct / model->BSIM4PhiBSWGD; + if (MJSWGD == 0.5) sarg = 1.0 / sqrt(arg); - else + else sarg = exp(-MJSWGD * log(arg)); *(ckt->CKTstate0 + here->BSIM4qbd) += model->BSIM4PhiBSWGD * czbdswg - * (1.0 - arg * sarg) / (1.0 - MJSWGD); + * (1.0 - arg * sarg) / (1.0 - MJSWGD); here->BSIM4capbd += czbdswg * sarg; - } + } } - else - { T0 = czbd + czbdsw + czbdswg; + else + { T0 = czbd + czbdsw + czbdswg; T1 = vbd_jct * (czbd * MJD / model->BSIM4PhiBD + czbdsw * MJSWD / model->BSIM4PhiBSWD + czbdswg * MJSWGD / model->BSIM4PhiBSWGD); *(ckt->CKTstate0 + here->BSIM4qbd) = vbd_jct * (T0 + 0.5 * T1); @@ -3836,21 +3991,21 @@ finished: */ if ((here->BSIM4off == 0) || (!(ckt->CKTmode & MODEINITFIX))) - { if (Check == 1) - { ckt->CKTnoncon++; + { if (Check == 1) + { ckt->CKTnoncon++; #ifndef NEWCONV } - else + else { if (here->BSIM4mode >= 0) { Idtot = here->BSIM4cd + here->BSIM4csub - + here->BSIM4Igidl - here->BSIM4cbd; + + 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)) + tol1 = ckt->CKTreltol * MAX(fabs(cseshat), fabs(Isestot)) + ckt->CKTabstol; tol2 = ckt->CKTreltol * MAX(fabs(cdedhat), fabs(Idedtot)) + ckt->CKTabstol; @@ -3861,20 +4016,20 @@ finished: tol5 = ckt->CKTreltol * MAX(fabs(cgbhat), fabs(Igbtot)) + ckt->CKTabstol; if ((fabs(cdhat - Idtot) >= tol0) || (fabs(cseshat - Isestot) >= tol1) - || (fabs(cdedhat - Idedtot) >= tol2)) + || (fabs(cdedhat - Idedtot) >= tol2)) { ckt->CKTnoncon++; } - else if ((fabs(cgshat - Igstot) >= tol3) || (fabs(cgdhat - Igdtot) >= tol4) - || (fabs(cgbhat - Igbtot) >= tol5)) + 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; + - here->BSIM4Igidl - here->BSIM4Igisl - here->BSIM4csub; tol6 = ckt->CKTreltol * MAX(fabs(cbhat), fabs(Ibtot)) + ckt->CKTabstol; if (fabs(cbhat - Ibtot) > tol6) - { ckt->CKTnoncon++; + { ckt->CKTnoncon++; } } #endif /* NEWCONV */ @@ -3884,8 +4039,8 @@ finished: *(ckt->CKTstate0 + here->BSIM4vgs) = vgs; *(ckt->CKTstate0 + here->BSIM4vbs) = vbs; *(ckt->CKTstate0 + here->BSIM4vbd) = vbd; - *(ckt->CKTstate0 + here->BSIM4vges) = vges; - *(ckt->CKTstate0 + here->BSIM4vgms) = vgms; + *(ckt->CKTstate0 + here->BSIM4vges) = vges; + *(ckt->CKTstate0 + here->BSIM4vgms) = vgms; *(ckt->CKTstate0 + here->BSIM4vdbs) = vdbs; *(ckt->CKTstate0 + here->BSIM4vdbd) = vdbd; *(ckt->CKTstate0 + here->BSIM4vsbs) = vsbs; @@ -3897,52 +4052,52 @@ finished: if (!ChargeComputationNeeded) goto line850; - if (here->BSIM4rgateMod == 3) - { - vgdx = vgmd; - vgsx = vgms; - } - else /* For rgateMod == 0, 1 and 2 */ - { - vgdx = vgd; - vgsx = vgs; - } - if (model->BSIM4capMod == 0) - { - cgdo = pParam->BSIM4cgdo; - qgdo = pParam->BSIM4cgdo * vgdx; - cgso = pParam->BSIM4cgso; - qgso = pParam->BSIM4cgso * vgsx; - } - else /* For both capMod == 1 and 2 */ - { T0 = vgdx + DELTA_1; - T1 = sqrt(T0 * T0 + 4.0 * DELTA_1); - T2 = 0.5 * (T0 - T1); + if (here->BSIM4rgateMod == 3) + { + vgdx = vgmd; + vgsx = vgms; + } + else /* For rgateMod == 0, 1 and 2 */ + { + vgdx = vgd; + vgsx = vgs; + } + if (model->BSIM4capMod == 0) + { + cgdo = pParam->BSIM4cgdo; + qgdo = pParam->BSIM4cgdo * vgdx; + cgso = pParam->BSIM4cgso; + qgso = pParam->BSIM4cgso * vgsx; + } + else /* For both capMod == 1 and 2 */ + { T0 = vgdx + DELTA_1; + T1 = sqrt(T0 * T0 + 4.0 * DELTA_1); + T2 = 0.5 * (T0 - T1); - T3 = pParam->BSIM4weffCV * pParam->BSIM4cgdl; - T4 = sqrt(1.0 - 4.0 * T2 / pParam->BSIM4ckappad); - cgdo = pParam->BSIM4cgdo + T3 - T3 * (1.0 - 1.0 / T4) - * (0.5 - 0.5 * T0 / T1); - qgdo = (pParam->BSIM4cgdo + T3) * vgdx - T3 * (T2 - + 0.5 * pParam->BSIM4ckappad * (T4 - 1.0)); + T3 = pParam->BSIM4weffCV * pParam->BSIM4cgdl; + T4 = sqrt(1.0 - 4.0 * T2 / pParam->BSIM4ckappad); + cgdo = pParam->BSIM4cgdo + T3 - T3 * (1.0 - 1.0 / T4) + * (0.5 - 0.5 * T0 / T1); + qgdo = (pParam->BSIM4cgdo + T3) * vgdx - T3 * (T2 + + 0.5 * pParam->BSIM4ckappad * (T4 - 1.0)); - T0 = vgsx + DELTA_1; - T1 = sqrt(T0 * T0 + 4.0 * DELTA_1); - T2 = 0.5 * (T0 - T1); - T3 = pParam->BSIM4weffCV * pParam->BSIM4cgsl; - T4 = sqrt(1.0 - 4.0 * T2 / pParam->BSIM4ckappas); - cgso = pParam->BSIM4cgso + T3 - T3 * (1.0 - 1.0 / T4) - * (0.5 - 0.5 * T0 / T1); - qgso = (pParam->BSIM4cgso + T3) * vgsx - T3 * (T2 - + 0.5 * pParam->BSIM4ckappas * (T4 - 1.0)); - } + T0 = vgsx + DELTA_1; + T1 = sqrt(T0 * T0 + 4.0 * DELTA_1); + T2 = 0.5 * (T0 - T1); + T3 = pParam->BSIM4weffCV * pParam->BSIM4cgsl; + T4 = sqrt(1.0 - 4.0 * T2 / pParam->BSIM4ckappas); + cgso = pParam->BSIM4cgso + T3 - T3 * (1.0 - 1.0 / T4) + * (0.5 - 0.5 * T0 / T1); + qgso = (pParam->BSIM4cgso + T3) * vgsx - T3 * (T2 + + 0.5 * pParam->BSIM4ckappas * (T4 - 1.0)); + } - if (here->BSIM4nf != 1.0) - { cgdo *= here->BSIM4nf; - cgso *= here->BSIM4nf; + if (here->BSIM4nf != 1.0) + { cgdo *= here->BSIM4nf; + cgso *= here->BSIM4nf; qgdo *= here->BSIM4nf; qgso *= here->BSIM4nf; - } + } here->BSIM4cgdo = cgdo; here->BSIM4qgdo = qgdo; here->BSIM4cgso = cgso; @@ -3955,9 +4110,9 @@ line755: if (here->BSIM4mode > 0) { if (here->BSIM4trnqsMod == 0) { qdrn -= qgdo; - if (here->BSIM4rgateMod == 3) - { gcgmgmb = (cgdo + cgso + pParam->BSIM4cgbo) * ag0; - gcgmdb = -cgdo * ag0; + if (here->BSIM4rgateMod == 3) + { gcgmgmb = (cgdo + cgso + pParam->BSIM4cgbo) * ag0; + gcgmdb = -cgdo * ag0; gcgmsb = -cgso * ag0; gcgmbb = -pParam->BSIM4cgbo * ag0; @@ -3965,13 +4120,13 @@ line755: gcsgmb = gcgmsb; gcbgmb = gcgmbb; - gcggb = here->BSIM4cggb * ag0; + gcggb = here->BSIM4cggb * ag0; gcgdb = here->BSIM4cgdb * ag0; gcgsb = here->BSIM4cgsb * ag0; gcgbb = -(gcggb + gcgdb + gcgsb); - gcdgb = here->BSIM4cdgb * ag0; - gcsgb = -(here->BSIM4cggb + here->BSIM4cbgb + gcdgb = here->BSIM4cdgb * ag0; + gcsgb = -(here->BSIM4cggb + here->BSIM4cbgb + here->BSIM4cdgb) * ag0; gcbgb = here->BSIM4cbgb * ag0; @@ -3979,26 +4134,26 @@ line755: qgmid = qgdo + qgso + qgmb; qbulk -= qgmb; qsrc = -(qgate + qgmid + qbulk + qdrn); - } - else - { gcggb = (here->BSIM4cggb + cgdo + cgso + } + else + { gcggb = (here->BSIM4cggb + cgdo + cgso + pParam->BSIM4cgbo ) * ag0; gcgdb = (here->BSIM4cgdb - cgdo) * ag0; gcgsb = (here->BSIM4cgsb - cgso) * ag0; gcgbb = -(gcggb + gcgdb + gcgsb); - gcdgb = (here->BSIM4cdgb - cgdo) * ag0; + gcdgb = (here->BSIM4cdgb - cgdo) * ag0; gcsgb = -(here->BSIM4cggb + here->BSIM4cbgb + here->BSIM4cdgb + cgso) * ag0; gcbgb = (here->BSIM4cbgb - pParam->BSIM4cgbo) * ag0; - gcdgmb = gcsgmb = gcbgmb = 0.0; + gcdgmb = gcsgmb = gcbgmb = 0.0; qgb = pParam->BSIM4cgbo * vgb; qgate += qgdo + qgso + qgb; qbulk -= qgb; qsrc = -(qgate + qbulk + qdrn); - } + } gcddb = (here->BSIM4cddb + here->BSIM4capbd + cgdo) * ag0; gcdsb = here->BSIM4cdsb * ag0; @@ -4018,20 +4173,20 @@ line755: { gcdbb = -(here->BSIM4cddb + here->BSIM4cdgb + here->BSIM4cdsb) * ag0; gcsbb = -(gcsgb + gcsdb + gcssb + gcsgmb) - + here->BSIM4capbs * ag0; + + here->BSIM4capbs * ag0; gcbdb = here->BSIM4cbdb * ag0; gcbsb = here->BSIM4cbsb * ag0; gcdbdb = -here->BSIM4capbd * ag0; gcsbsb = -here->BSIM4capbs * ag0; } - gcbbb = -(gcbdb + gcbgb + gcbsb + gcbgmb); + gcbbb = -(gcbdb + gcbgb + gcbsb + gcbgmb); ggtg = ggtd = ggtb = ggts = 0.0; - sxpart = 0.6; + sxpart = 0.6; dxpart = 0.4; - ddxpart_dVd = ddxpart_dVg = ddxpart_dVb = ddxpart_dVs = 0.0; - dsxpart_dVd = dsxpart_dVg = dsxpart_dVb = dsxpart_dVs = 0.0; + ddxpart_dVd = ddxpart_dVg = ddxpart_dVb = ddxpart_dVs = 0.0; + dsxpart_dVd = dsxpart_dVg = dsxpart_dVb = dsxpart_dVs = 0.0; } else { qcheq = here->BSIM4qchqs; @@ -4043,7 +4198,7 @@ line755: ggtd = here->BSIM4gtd = T0 * here->BSIM4gcrgd; ggts = here->BSIM4gts = T0 * here->BSIM4gcrgs; ggtb = here->BSIM4gtb = T0 * here->BSIM4gcrgb; - gqdef = ScalingFactor * ag0; + gqdef = ScalingFactor * ag0; gcqgb = here->BSIM4cqgb * ag0; gcqdb = here->BSIM4cqdb * ag0; @@ -4098,20 +4253,20 @@ line755: gcbgmb = gcgmbb; gcdgb = gcsgb = gcbgb = 0.0; - gcggb = gcgdb = gcgsb = gcgbb = 0.0; + gcggb = gcgdb = gcgsb = gcgbb = 0.0; qgmb = pParam->BSIM4cgbo * vgmb; qgmid = qgdo + qgso + qgmb; - qgate = 0.0; + qgate = 0.0; qbulk = -qgmb; - qdrn = -qgdo; + qdrn = -qgdo; qsrc = -(qgmid + qbulk + qdrn); } else { gcggb = (cgdo + cgso + pParam->BSIM4cgbo ) * ag0; gcgdb = -cgdo * ag0; gcgsb = -cgso * ag0; - gcgbb = -pParam->BSIM4cgbo * ag0; + gcgbb = -pParam->BSIM4cgbo * ag0; gcdgb = gcgdb; gcsgb = gcgsb; @@ -4121,7 +4276,7 @@ line755: qgb = pParam->BSIM4cgbo * vgb; qgate = qgdo + qgso + qgb; qbulk = -qgb; - qdrn = -qgdo; + qdrn = -qgdo; qsrc = -(qgate + qbulk + qdrn); } @@ -4147,11 +4302,11 @@ line755: else { if (here->BSIM4trnqsMod == 0) { qsrc = qdrn - qgso; - if (here->BSIM4rgateMod == 3) - { gcgmgmb = (cgdo + cgso + pParam->BSIM4cgbo) * ag0; - gcgmdb = -cgdo * ag0; - gcgmsb = -cgso * ag0; - gcgmbb = -pParam->BSIM4cgbo * ag0; + if (here->BSIM4rgateMod == 3) + { gcgmgmb = (cgdo + cgso + pParam->BSIM4cgbo) * ag0; + gcgmdb = -cgdo * ag0; + gcgmsb = -cgso * ag0; + gcgmbb = -pParam->BSIM4cgbo * ag0; gcdgmb = gcgmdb; gcsgmb = gcgmsb; @@ -4171,9 +4326,9 @@ line755: qgmid = qgdo + qgso + qgmb; qbulk -= qgmb; qdrn = -(qgate + qgmid + qbulk + qsrc); - } - else - { gcggb = (here->BSIM4cggb + cgdo + cgso + } + else + { gcggb = (here->BSIM4cggb + cgdo + cgso + pParam->BSIM4cgbo ) * ag0; gcgdb = (here->BSIM4cgsb - cgdo) * ag0; gcgsb = (here->BSIM4cgdb - cgso) * ag0; @@ -4190,7 +4345,7 @@ line755: qgate += qgdo + qgso + qgb; qbulk -= qgb; qdrn = -(qgate + qbulk + qsrc); - } + } gcddb = (here->BSIM4capbd + cgdo - (here->BSIM4cgsb + here->BSIM4cbsb + here->BSIM4cdsb)) * ag0; gcdsb = -(here->BSIM4cgdb + here->BSIM4cbdb @@ -4199,8 +4354,8 @@ line755: gcsdb = here->BSIM4cdsb * ag0; gcssb = (here->BSIM4cddb + here->BSIM4capbs + cgso) * ag0; - if (!here->BSIM4rbodyMod) - { gcdbb = -(gcdgb + gcddb + gcdsb + gcdgmb); + if (!here->BSIM4rbodyMod) + { gcdbb = -(gcdgb + gcddb + gcdsb + gcdgmb); gcsbb = -(gcsgb + gcsdb + gcssb + gcsgmb); gcbdb = (here->BSIM4cbsb - here->BSIM4capbd) * ag0; gcbsb = (here->BSIM4cbdb - here->BSIM4capbs) * ag0; @@ -4208,21 +4363,21 @@ line755: } else { gcdbb = -(gcdgb + gcddb + gcdsb + gcdgmb) - + here->BSIM4capbd * ag0; + + here->BSIM4capbd * ag0; gcsbb = -(here->BSIM4cddb + here->BSIM4cdgb + here->BSIM4cdsb) * ag0; gcbdb = here->BSIM4cbsb * ag0; gcbsb = here->BSIM4cbdb * ag0; gcdbdb = -here->BSIM4capbd * ag0; - gcsbsb = -here->BSIM4capbs * ag0; + gcsbsb = -here->BSIM4capbs * ag0; } - gcbbb = -(gcbgb + gcbdb + gcbsb + gcbgmb); + gcbbb = -(gcbgb + gcbdb + gcbsb + gcbgmb); ggtg = ggtd = ggtb = ggts = 0.0; - sxpart = 0.4; + sxpart = 0.4; dxpart = 0.6; - ddxpart_dVd = ddxpart_dVg = ddxpart_dVb = ddxpart_dVs = 0.0; - dsxpart_dVd = dsxpart_dVg = dsxpart_dVb = dsxpart_dVs = 0.0; + ddxpart_dVd = ddxpart_dVg = ddxpart_dVb = ddxpart_dVs = 0.0; + dsxpart_dVd = dsxpart_dVg = dsxpart_dVb = dsxpart_dVs = 0.0; } else { qcheq = here->BSIM4qchqs; @@ -4233,7 +4388,7 @@ line755: ggts = here->BSIM4gts = T0 * here->BSIM4gcrgd; ggtd = here->BSIM4gtd = T0 * here->BSIM4gcrgs; ggtb = here->BSIM4gtb = T0 * here->BSIM4gcrgb; - gqdef = ScalingFactor * ag0; + gqdef = ScalingFactor * ag0; gcqgb = here->BSIM4cqgb * ag0; gcqdb = here->BSIM4cqsb * ag0; @@ -4352,8 +4507,8 @@ line755: - *(ckt->CKTstate0 + here->BSIM4qbd); *(ckt->CKTstate0 + here->BSIM4qs) = qsrc - *(ckt->CKTstate0 + here->BSIM4qbs); - if (here->BSIM4rgateMod == 3) - *(ckt->CKTstate0 + here->BSIM4qgmid) = qgmid; + if (here->BSIM4rgateMod == 3) + *(ckt->CKTstate0 + here->BSIM4qgmid) = qgmid; if (!here->BSIM4rbodyMod) { *(ckt->CKTstate0 + here->BSIM4qb) = qbulk @@ -4428,15 +4583,15 @@ line850: gcggb = gcgdb = gcgsb = gcgbb = 0.0; gcbdb = gcbgb = gcbsb = gcbbb = 0.0; - gcgmgmb = gcgmdb = gcgmsb = gcgmbb = 0.0; - gcdgmb = gcsgmb = gcbgmb = ceqqgmid = 0.0; + gcgmgmb = gcgmdb = gcgmsb = gcgmbb = 0.0; + gcdgmb = gcsgmb = gcbgmb = ceqqgmid = 0.0; gcdbdb = gcsbsb = 0.0; - gqdef = gcqgb = gcqdb = gcqsb = gcqbb = 0.0; + gqdef = gcqgb = gcqdb = gcqsb = gcqbb = 0.0; ggtg = ggtd = ggtb = ggts = 0.0; sxpart = (1.0 - (dxpart = (here->BSIM4mode > 0) ? 0.4 : 0.6)); - ddxpart_dVd = ddxpart_dVg = ddxpart_dVb = ddxpart_dVs = 0.0; - dsxpart_dVd = dsxpart_dVg = dsxpart_dVb = dsxpart_dVs = 0.0; + ddxpart_dVd = ddxpart_dVg = ddxpart_dVb = ddxpart_dVs = 0.0; + dsxpart_dVd = dsxpart_dVg = dsxpart_dVb = dsxpart_dVs = 0.0; if (here->BSIM4trnqsMod) { CoxWL = model->BSIM4coxe * pParam->BSIM4weffCV * here->BSIM4nf @@ -4444,7 +4599,7 @@ line850: T1 = here->BSIM4gcrg / CoxWL; here->BSIM4gtau = T1 * ScalingFactor; } - else + else here->BSIM4gtau = 0.0; goto line900; @@ -4459,16 +4614,16 @@ line860: ceqqg = cqgate - gcggb * vgb + gcgdb * vbd + gcgsb * vbs; ceqqd = cqdrn - gcdgb * vgb - gcdgmb * vgmb + (gcddb + gcdbdb) - * vbd - gcdbdb * vbd_jct + gcdsb * vbs; - ceqqb = cqbody - gcbgb * vgb - gcbgmb * vgmb + * vbd - gcdbdb * vbd_jct + gcdsb * vbs; + ceqqb = cqbody - gcbgb * vgb - gcbgmb * vgmb + gcbdb * vbd + gcbsb * vbs; if (here->BSIM4rgateMod == 3) ceqqgmid = *(ckt->CKTstate0 + here->BSIM4cqgmid) + gcgmdb * vbd + gcgmsb * vbs - gcgmgmb * vgmb; - else - ceqqgmid = 0.0; + else + ceqqgmid = 0.0; if (here->BSIM4rbodyMod) { ceqqjs = *(ckt->CKTstate0 + here->BSIM4cqbs) + gcsbsb * vbs_jct; @@ -4478,9 +4633,9 @@ line860: if (here->BSIM4trnqsMod) { T0 = ggtg * vgb - ggtd * vbd - ggts * vbs; ceqqg += T0; - T1 = qdef * here->BSIM4gtau; + T1 = qdef * here->BSIM4gtau; ceqqd -= dxpart * T0 + T1 * (ddxpart_dVg * vgb - ddxpart_dVd - * vbd - ddxpart_dVs * vbs); + * vbd - ddxpart_dVs * vbs); cqdef = *(ckt->CKTstate0 + here->BSIM4cqcdump) - gqdef * qdef; cqcheq = *(ckt->CKTstate0 + here->BSIM4cqcheq) - (gcqgb * vgb - gcqdb * vbd - gcqsb * vbs) + T0; @@ -4513,23 +4668,23 @@ line860: line900: if (here->BSIM4mode >= 0) - { Gm = here->BSIM4gm; + { Gm = here->BSIM4gm; Gmbs = here->BSIM4gmbs; FwdSum = Gm + Gmbs; RevSum = 0.0; ceqdrn = model->BSIM4type * (cdrain - here->BSIM4gds * vds - - Gm * vgs - Gmbs * vbs); + - Gm * vgs - Gmbs * vbs); ceqbd = model->BSIM4type * (here->BSIM4csub + here->BSIM4Igidl - (here->BSIM4gbds + here->BSIM4ggidld) * vds - - (here->BSIM4gbgs + here->BSIM4ggidlg) * vgs - - (here->BSIM4gbbs + here->BSIM4ggidlb) * vbs); + - (here->BSIM4gbgs + here->BSIM4ggidlg) * vgs + - (here->BSIM4gbbs + here->BSIM4ggidlb) * vbs); ceqbs = model->BSIM4type * (here->BSIM4Igisl + here->BSIM4ggisls * vds - - here->BSIM4ggislg * vgd - here->BSIM4ggislb * vbd); + - here->BSIM4ggislg * vgd - here->BSIM4ggislb * vbd); gbbdp = -(here->BSIM4gbds); gbbsp = here->BSIM4gbds + here->BSIM4gbgs + here->BSIM4gbbs; - + gbdpg = here->BSIM4gbgs; gbdpdp = here->BSIM4gbds; gbdpb = here->BSIM4gbbs; @@ -4541,13 +4696,13 @@ line900: gbspsp = 0.0; if (model->BSIM4igcMod) - { gIstotg = here->BSIM4gIgsg + here->BSIM4gIgcsg; - gIstotd = here->BSIM4gIgcsd; + { gIstotg = here->BSIM4gIgsg + here->BSIM4gIgcsg; + gIstotd = here->BSIM4gIgcsd; gIstots = here->BSIM4gIgss + here->BSIM4gIgcss; gIstotb = here->BSIM4gIgcsb; - Istoteq = model->BSIM4type * (here->BSIM4Igs + here->BSIM4Igcs - - gIstotg * vgs - here->BSIM4gIgcsd * vds - - here->BSIM4gIgcsb * vbs); + Istoteq = model->BSIM4type * (here->BSIM4Igs + here->BSIM4Igcs + - gIstotg * vgs - here->BSIM4gIgcsd * vds + - here->BSIM4gIgcsb * vbs); gIdtotg = here->BSIM4gIgdg + here->BSIM4gIgcdg; gIdtotd = here->BSIM4gIgdd + here->BSIM4gIgcdd; @@ -4555,12 +4710,12 @@ line900: gIdtotb = here->BSIM4gIgcdb; Idtoteq = model->BSIM4type * (here->BSIM4Igd + here->BSIM4Igcd - here->BSIM4gIgdg * vgd - here->BSIM4gIgcdg * vgs - - here->BSIM4gIgcdd * vds - here->BSIM4gIgcdb * vbs); - } - else - { gIstotg = gIstotd = gIstots = gIstotb = Istoteq = 0.0; - gIdtotg = gIdtotd = gIdtots = gIdtotb = Idtoteq = 0.0; - } + - here->BSIM4gIgcdd * vds - here->BSIM4gIgcdb * vbs); + } + else + { gIstotg = gIstotd = gIstots = gIstotb = Istoteq = 0.0; + gIdtotg = gIdtotd = gIdtots = gIdtotb = Idtoteq = 0.0; + } if (model->BSIM4igbMod) { gIbtotg = here->BSIM4gIgbg; @@ -4580,9 +4735,9 @@ line900: gIgtots = gIstots + gIdtots + gIbtots; gIgtotb = gIstotb + gIdtotb + gIbtotb; Igtoteq = Istoteq + Idtoteq + Ibtoteq; - } - else - gIgtotg = gIgtotd = gIgtots = gIgtotb = Igtoteq = 0.0; + } + else + gIgtotg = gIgtotd = gIgtots = gIgtotb = Igtoteq = 0.0; if (here->BSIM4rgateMod == 2) @@ -4600,10 +4755,10 @@ line900: gcrg = here->BSIM4gcrg; } else - ceqgcrg = gcrg = gcrgd = gcrgg = gcrgs = gcrgb = 0.0; + ceqgcrg = gcrg = gcrgd = gcrgg = gcrgs = gcrgb = 0.0; } - else - { Gm = -here->BSIM4gm; + else + { Gm = -here->BSIM4gm; Gmbs = -here->BSIM4gmbs; FwdSum = 0.0; RevSum = -(Gm + Gmbs); @@ -4613,10 +4768,10 @@ line900: ceqbs = model->BSIM4type * (here->BSIM4csub + here->BSIM4Igisl + (here->BSIM4gbds + here->BSIM4ggisls) * vds - - (here->BSIM4gbgs + here->BSIM4ggislg) * vgd + - (here->BSIM4gbgs + here->BSIM4ggislg) * vgd - (here->BSIM4gbbs + here->BSIM4ggislb) * vbd); ceqbd = model->BSIM4type * (here->BSIM4Igidl - here->BSIM4ggidld * vds - - here->BSIM4ggidlg * vgs - here->BSIM4ggidlb * vbs); + - here->BSIM4ggidlg * vgs - here->BSIM4ggidlb * vbs); gbbsp = -(here->BSIM4gbds); gbbdp = here->BSIM4gbds + here->BSIM4gbgs + here->BSIM4gbbs; @@ -4638,7 +4793,7 @@ line900: gIstotb = here->BSIM4gIgcdb; Istoteq = model->BSIM4type * (here->BSIM4Igs + here->BSIM4Igcd - here->BSIM4gIgsg * vgs - here->BSIM4gIgcdg * vgd - + here->BSIM4gIgcdd * vds - here->BSIM4gIgcdb * vbd); + + here->BSIM4gIgcdd * vds - here->BSIM4gIgcdb * vbd); gIdtotg = here->BSIM4gIgdg + here->BSIM4gIgcsg; gIdtotd = here->BSIM4gIgdd + here->BSIM4gIgcss; @@ -4718,11 +4873,11 @@ line900: gdtot = gdtotd = gdtotg = gdtots = gdtotb = ceqgdtot = 0.0; } - if (model->BSIM4type > 0) + if (model->BSIM4type > 0) { ceqjs = (here->BSIM4cbs - here->BSIM4gbs * vbs_jct); ceqjd = (here->BSIM4cbd - here->BSIM4gbd * vbd_jct); } - else + else { ceqjs = -(here->BSIM4cbs - here->BSIM4gbs * vbs_jct); ceqjd = -(here->BSIM4cbd - here->BSIM4gbd * vbd_jct); ceqqg = -ceqqg; @@ -4733,23 +4888,23 @@ line900: if (here->BSIM4trnqsMod) { cqdef = -cqdef; cqcheq = -cqcheq; - } + } if (here->BSIM4rbodyMod) { ceqqjs = -ceqqjs; ceqqjd = -ceqqjd; } - if (here->BSIM4rgateMod == 3) - ceqqgmid = -ceqqgmid; - } + if (here->BSIM4rgateMod == 3) + ceqqgmid = -ceqqgmid; + } /* * Loading RHS */ - m = here->BSIM4m; + m = here->BSIM4m; #ifdef USE_OMP4 here->BSIM4rhsdPrime = m * (ceqjd - ceqbd + ceqgdtot @@ -4759,7 +4914,7 @@ line900: if (here->BSIM4rgateMod == 2) here->BSIM4rhsgExt = m * ceqgcrg; else if (here->BSIM4rgateMod == 3) - here->BSIM4grhsMid = m * (ceqqgmid + ceqgcrg); + here->BSIM4grhsMid = m * (ceqqgmid + ceqgcrg); if (!here->BSIM4rbodyMod) { here->BSIM4rhsbPrime = m * (ceqbd + ceqbs - ceqjd @@ -4790,7 +4945,7 @@ line900: if (here->BSIM4rgateMod == 2) (*(ckt->CKTrhs + here->BSIM4gNodeExt) -= m * ceqgcrg); else if (here->BSIM4rgateMod == 3) - (*(ckt->CKTrhs + here->BSIM4gNodeMid) -= m * (ceqqgmid + ceqgcrg)); + (*(ckt->CKTrhs + here->BSIM4gNodeMid) -= m * (ceqqgmid + ceqgcrg)); if (!here->BSIM4rbodyMod) { (*(ckt->CKTrhs + here->BSIM4bNodePrime) += m * (ceqbd + ceqbs - ceqjd @@ -4820,7 +4975,7 @@ line900: * Loading matrix */ - if (!here->BSIM4rbodyMod) + if (!here->BSIM4rbodyMod) { gjbd = here->BSIM4gbd; gjbs = here->BSIM4gbs; } @@ -4842,85 +4997,83 @@ line900: { here->BSIM4_1 = m * geltd; here->BSIM4_2 = m * geltd; here->BSIM4_3 = m * geltd; - here->BSIM4_4 = m * (gcggb + geltd - ggtg + gIgtotg); - here->BSIM4_5 = m * (gcgdb - ggtd + gIgtotd); - here->BSIM4_6 = m * (gcgsb - ggts + gIgtots); - here->BSIM4_7 = m * (gcgbb - ggtb + gIgtotb); - } /* WDLiu: gcrg already subtracted from all gcrgg below */ - else if (here->BSIM4rgateMod == 2) - { here->BSIM4_8 = m * gcrg; - here->BSIM4_9 = m * gcrgg; - here->BSIM4_10 = m * gcrgd; - here->BSIM4_11 = m * gcrgs; - here->BSIM4_12 = m * gcrgb; + here->BSIM4_4 = m * (gcggb + geltd - ggtg + gIgtotg); + here->BSIM4_5 = m * (gcgdb - ggtd + gIgtotd); + here->BSIM4_6 = m * (gcgsb - ggts + gIgtots); + here->BSIM4_7 = m * (gcgbb - ggtb + gIgtotb); + } /* WDLiu: gcrg already subtracted from all gcrgg below */ + else if (here->BSIM4rgateMod == 2) + { here->BSIM4_8 = m * gcrg; + here->BSIM4_9 = m * gcrgg; + here->BSIM4_10 = m * gcrgd; + here->BSIM4_11 = m * gcrgs; + here->BSIM4_12 = m * gcrgb; - here->BSIM4_13 = m * gcrg; - here->BSIM4_14 = m * (gcggb - gcrgg - ggtg + gIgtotg); - here->BSIM4_15 = m * (gcgdb - gcrgd - ggtd + gIgtotd); - here->BSIM4_16 = m * (gcgsb - gcrgs - ggts + gIgtots); - here->BSIM4_17 = m * (gcgbb - gcrgb - ggtb + gIgtotb); - } - else if (here->BSIM4rgateMod == 3) - { here->BSIM4_18 = m * geltd; - here->BSIM4_19 = m * geltd; - here->BSIM4_20 = m * geltd; - here->BSIM4_21 = m * (geltd + gcrg + gcgmgmb); + here->BSIM4_13 = m * gcrg; + here->BSIM4_14 = m * (gcggb - gcrgg - ggtg + gIgtotg); + here->BSIM4_15 = m * (gcgdb - gcrgd - ggtd + gIgtotd); + here->BSIM4_16 = m * (gcgsb - gcrgs - ggts + gIgtots); + here->BSIM4_17 = m * (gcgbb - gcrgb - ggtb + gIgtotb); + } + else if (here->BSIM4rgateMod == 3) + { here->BSIM4_18 = m * geltd; + here->BSIM4_19 = m * geltd; + here->BSIM4_20 = m * geltd; + here->BSIM4_21 = m * (geltd + gcrg + gcgmgmb); - here->BSIM4_22 = m * (gcrgd + gcgmdb); - here->BSIM4_23 = m * gcrgg; - here->BSIM4_24 = m * (gcrgs + gcgmsb); - here->BSIM4_25 = m * (gcrgb + gcgmbb); + here->BSIM4_22 = m * (gcrgd + gcgmdb); + here->BSIM4_23 = m * gcrgg; + here->BSIM4_24 = m * (gcrgs + gcgmsb); + here->BSIM4_25 = m * (gcrgb + gcgmbb); - here->BSIM4_26 = m * gcdgmb; - here->BSIM4_26 = m * gcrg; - here->BSIM4_28 = m * gcsgmb; - here->BSIM4_29 = m * gcbgmb; + here->BSIM4_26 = m * gcdgmb; + here->BSIM4_26 = m * gcrg; + here->BSIM4_28 = m * gcsgmb; + here->BSIM4_29 = m * gcbgmb; - here->BSIM4_30 = m * (gcggb - gcrgg - ggtg + gIgtotg); - here->BSIM4_31 = m * (gcgdb - gcrgd - ggtd + gIgtotd); - here->BSIM4_32 = m * (gcgsb - gcrgs - ggts + gIgtots); - here->BSIM4_33 = m * (gcgbb - gcrgb - ggtb + gIgtotb); - } - - else - { here->BSIM4_34 = m * (gcggb - ggtg + gIgtotg); - here->BSIM4_35 = m * (gcgdb - ggtd + gIgtotd); + here->BSIM4_30 = m * (gcggb - gcrgg - ggtg + gIgtotg); + here->BSIM4_31 = m * (gcgdb - gcrgd - ggtd + gIgtotd); + here->BSIM4_32 = m * (gcgsb - gcrgs - ggts + gIgtots); + here->BSIM4_33 = m * (gcgbb - gcrgb - ggtb + gIgtotb); + } + else + { here->BSIM4_34 = m * (gcggb - ggtg + gIgtotg); + here->BSIM4_35 = m * (gcgdb - ggtd + gIgtotd); here->BSIM4_36 = m * (gcgsb - ggts + gIgtots); - here->BSIM4_37 = m * (gcgbb - ggtb + gIgtotb); - } + here->BSIM4_37 = m * (gcgbb - ggtb + gIgtotb); + } - if (model->BSIM4rdsMod) - { here->BSIM4_38 = m * gdtotg; - here->BSIM4_39 = m * gdtots; + if (model->BSIM4rdsMod) + { here->BSIM4_38 = m * gdtotg; + here->BSIM4_39 = m * gdtots; here->BSIM4_40 = m * gdtotb; here->BSIM4_41 = m * gstotd; here->BSIM4_42 = m * gstotg; here->BSIM4_43 = m * gstotb; - } + } here->BSIM4_44 = m * (gdpr + here->BSIM4gds + here->BSIM4gbd + T1 * ddxpart_dVd - gdtotd + RevSum + gcddb + gbdpdp + dxpart * ggtd - gIdtotd); here->BSIM4_45 = m * (gdpr + gdtot); - here->BSIM4_46 = m * (Gm + gcdgb - gdtotg + gbdpg - gIdtotg - + dxpart * ggtg + T1 * ddxpart_dVg); + + dxpart * ggtg + T1 * ddxpart_dVg); here->BSIM4_47 = m * (here->BSIM4gds + gdtots - dxpart * ggts + gIdtots - - T1 * ddxpart_dVs + FwdSum - gcdsb - gbdpsp); + - T1 * ddxpart_dVs + FwdSum - gcdsb - gbdpsp); here->BSIM4_48 = m * (gjbd + gdtotb - Gmbs - gcdbb - gbdpb + gIdtotb - - T1 * ddxpart_dVb - dxpart * ggtb); + - T1 * ddxpart_dVb - dxpart * ggtb); here->BSIM4_49 = m * (gdpr - gdtotd); here->BSIM4_50 = m * (gdpr + gdtot); here->BSIM4_51 = m * (here->BSIM4gds + gstotd + RevSum - gcsdb - gbspdp - - T1 * dsxpart_dVd - sxpart * ggtd + gIstotd); + - T1 * dsxpart_dVd - sxpart * ggtd + gIstotd); here->BSIM4_52 = m * (gcsgb - Gm - gstotg + gbspg + sxpart * ggtg - + T1 * dsxpart_dVg - gIstotg); + + T1 * dsxpart_dVg - gIstotg); here->BSIM4_53 = m * (gspr + here->BSIM4gds + here->BSIM4gbs + T1 * dsxpart_dVs - gstots + FwdSum + gcssb + gbspsp + sxpart * ggts - gIstots); here->BSIM4_54 = m * (gspr + gstot); here->BSIM4_55 = m * (gjbs + gstotb + Gmbs - gcsbb - gbspb - sxpart * ggtb - - T1 * dsxpart_dVb + gIstotb); + - T1 * dsxpart_dVb + gIstotb); here->BSIM4_56 = m * (gspr - gstots); here->BSIM4_57 = m * (gspr + gstot); @@ -4962,7 +5115,7 @@ line900: here->BSIM4_80 = m * (gcdbdb - here->BSIM4gbd); here->BSIM4_81 = m * (here->BSIM4gbd - gcdbdb - + here->BSIM4grbpd + here->BSIM4grbdb); + + here->BSIM4grbpd + here->BSIM4grbdb); here->BSIM4_82 = m * here->BSIM4grbpd; here->BSIM4_83 = m * here->BSIM4grbdb; @@ -4970,21 +5123,21 @@ line900: here->BSIM4_85 = m * here->BSIM4grbpb; here->BSIM4_86 = m * here->BSIM4grbps; here->BSIM4_87 = m * (here->BSIM4grbpd + here->BSIM4grbps - + here->BSIM4grbpb); - /* WDLiu: (gcbbb - here->BSIM4gbbs) already added to BPbpPtr */ + + here->BSIM4grbpb); + /* WDLiu: (gcbbb - here->BSIM4gbbs) already added to BPbpPtr */ here->BSIM4_88 = m * (gcsbsb - here->BSIM4gbs); here->BSIM4_89 = m * here->BSIM4grbps; here->BSIM4_90 = m * here->BSIM4grbsb; here->BSIM4_91 = m * (here->BSIM4gbs - gcsbsb - + here->BSIM4grbps + here->BSIM4grbsb); + + here->BSIM4grbps + here->BSIM4grbsb); - here->BSIM4_92 = m * here->BSIM4grbdb; - here->BSIM4_93 = m * here->BSIM4grbpb; - here->BSIM4_94 = m * here->BSIM4grbsb; - here->BSIM4_95 = m * (here->BSIM4grbsb + here->BSIM4grbdb - + here->BSIM4grbpb); - } + here->BSIM4_92 = m * here->BSIM4grbdb; + here->BSIM4_93 = m * here->BSIM4grbpb; + here->BSIM4_94 = m * here->BSIM4grbsb; + here->BSIM4_95 = m * (here->BSIM4grbsb + here->BSIM4grbdb + + here->BSIM4grbpb); + } if (here->BSIM4trnqsMod) { here->BSIM4_96 = m * (gqdef + here->BSIM4gtau); @@ -5002,26 +5155,26 @@ line900: { (*(here->BSIM4GEgePtr) += m * geltd); (*(here->BSIM4GPgePtr) -= m * geltd); (*(here->BSIM4GEgpPtr) -= m * geltd); - (*(here->BSIM4GPgpPtr) += m * (gcggb + geltd - ggtg + gIgtotg)); - (*(here->BSIM4GPdpPtr) += m * (gcgdb - ggtd + gIgtotd)); - (*(here->BSIM4GPspPtr) += m * (gcgsb - ggts + gIgtots)); - (*(here->BSIM4GPbpPtr) += m * (gcgbb - ggtb + gIgtotb)); + (*(here->BSIM4GPgpPtr) += m * (gcggb + geltd - ggtg + gIgtotg)); + (*(here->BSIM4GPdpPtr) += m * (gcgdb - ggtd + gIgtotd)); + (*(here->BSIM4GPspPtr) += m * (gcgsb - ggts + gIgtots)); + (*(here->BSIM4GPbpPtr) += m * (gcgbb - ggtb + gIgtotb)); } /* WDLiu: gcrg already subtracted from all gcrgg below */ - else if (here->BSIM4rgateMod == 2) + else if (here->BSIM4rgateMod == 2) { (*(here->BSIM4GEgePtr) += m * gcrg); (*(here->BSIM4GEgpPtr) += m * gcrgg); (*(here->BSIM4GEdpPtr) += m * gcrgd); (*(here->BSIM4GEspPtr) += m * gcrgs); - (*(here->BSIM4GEbpPtr) += m * gcrgb); + (*(here->BSIM4GEbpPtr) += m * gcrgb); (*(here->BSIM4GPgePtr) -= m * gcrg); - (*(here->BSIM4GPgpPtr) += m * (gcggb - gcrgg - ggtg + gIgtotg)); - (*(here->BSIM4GPdpPtr) += m * (gcgdb - gcrgd - ggtd + gIgtotd)); - (*(here->BSIM4GPspPtr) += m * (gcgsb - gcrgs - ggts + gIgtots)); - (*(here->BSIM4GPbpPtr) += m * (gcgbb - gcrgb - ggtb + gIgtotb)); - } - else if (here->BSIM4rgateMod == 3) - { (*(here->BSIM4GEgePtr) += m * geltd); + (*(here->BSIM4GPgpPtr) += m * (gcggb - gcrgg - ggtg + gIgtotg)); + (*(here->BSIM4GPdpPtr) += m * (gcgdb - gcrgd - ggtd + gIgtotd)); + (*(here->BSIM4GPspPtr) += m * (gcgsb - gcrgs - ggts + gIgtots)); + (*(here->BSIM4GPbpPtr) += m * (gcgbb - gcrgb - ggtb + gIgtotb)); + } + else if (here->BSIM4rgateMod == 3) + { (*(here->BSIM4GEgePtr) += m * geltd); (*(here->BSIM4GEgmPtr) -= m * geltd); (*(here->BSIM4GMgePtr) -= m * geltd); (*(here->BSIM4GMgmPtr) += m * (geltd + gcrg + gcgmgmb)); @@ -5040,45 +5193,45 @@ line900: (*(here->BSIM4GPdpPtr) += m * (gcgdb - gcrgd - ggtd + gIgtotd)); (*(here->BSIM4GPspPtr) += m * (gcgsb - gcrgs - ggts + gIgtots)); (*(here->BSIM4GPbpPtr) += m * (gcgbb - gcrgb - ggtb + gIgtotb)); - } - else - { (*(here->BSIM4GPgpPtr) += m * (gcggb - ggtg + gIgtotg)); - (*(here->BSIM4GPdpPtr) += m * (gcgdb - ggtd + gIgtotd)); + } + else + { (*(here->BSIM4GPgpPtr) += m * (gcggb - ggtg + gIgtotg)); + (*(here->BSIM4GPdpPtr) += m * (gcgdb - ggtd + gIgtotd)); (*(here->BSIM4GPspPtr) += m * (gcgsb - ggts + gIgtots)); - (*(here->BSIM4GPbpPtr) += m * (gcgbb - ggtb + gIgtotb)); - } + (*(here->BSIM4GPbpPtr) += m * (gcgbb - ggtb + gIgtotb)); + } - if (model->BSIM4rdsMod) - { (*(here->BSIM4DgpPtr) += m * gdtotg); - (*(here->BSIM4DspPtr) += m * gdtots); + if (model->BSIM4rdsMod) + { (*(here->BSIM4DgpPtr) += m * gdtotg); + (*(here->BSIM4DspPtr) += m * gdtots); (*(here->BSIM4DbpPtr) += m * gdtotb); (*(here->BSIM4SdpPtr) += m * gstotd); (*(here->BSIM4SgpPtr) += m * gstotg); (*(here->BSIM4SbpPtr) += m * gstotb); - } + } (*(here->BSIM4DPdpPtr) += m * (gdpr + here->BSIM4gds + here->BSIM4gbd + T1 * ddxpart_dVd - gdtotd + RevSum + gcddb + gbdpdp + dxpart * ggtd - gIdtotd)); (*(here->BSIM4DPdPtr) -= m * (gdpr + gdtot)); (*(here->BSIM4DPgpPtr) += m * (Gm + gcdgb - gdtotg + gbdpg - gIdtotg - + dxpart * ggtg + T1 * ddxpart_dVg)); + + dxpart * ggtg + T1 * ddxpart_dVg)); (*(here->BSIM4DPspPtr) -= m * (here->BSIM4gds + gdtots - dxpart * ggts + gIdtots - - T1 * ddxpart_dVs + FwdSum - gcdsb - gbdpsp)); + - T1 * ddxpart_dVs + FwdSum - gcdsb - gbdpsp)); (*(here->BSIM4DPbpPtr) -= m * (gjbd + gdtotb - Gmbs - gcdbb - gbdpb + gIdtotb - - T1 * ddxpart_dVb - dxpart * ggtb)); + - T1 * ddxpart_dVb - dxpart * ggtb)); (*(here->BSIM4DdpPtr) -= m * (gdpr - gdtotd)); (*(here->BSIM4DdPtr) += m * (gdpr + gdtot)); (*(here->BSIM4SPdpPtr) -= m * (here->BSIM4gds + gstotd + RevSum - gcsdb - gbspdp - - T1 * dsxpart_dVd - sxpart * ggtd + gIstotd)); + - T1 * dsxpart_dVd - sxpart * ggtd + gIstotd)); (*(here->BSIM4SPgpPtr) += m * (gcsgb - Gm - gstotg + gbspg + sxpart * ggtg - + T1 * dsxpart_dVg - gIstotg)); + + T1 * dsxpart_dVg - gIstotg)); (*(here->BSIM4SPspPtr) += m * (gspr + here->BSIM4gds + here->BSIM4gbs + T1 * dsxpart_dVs - gstots + FwdSum + gcssb + gbspsp + sxpart * ggts - gIstots)); (*(here->BSIM4SPsPtr) -= m * (gspr + gstot)); (*(here->BSIM4SPbpPtr) -= m * (gjbs + gstotb + Gmbs - gcsbb - gbspb - sxpart * ggtb - - T1 * dsxpart_dVb + gIstotb)); + - T1 * dsxpart_dVb + gIstotb)); (*(here->BSIM4SspPtr) -= m * (gspr - gstots)); (*(here->BSIM4SsPtr) += m * (gspr + gstot)); @@ -5087,7 +5240,7 @@ line900: (*(here->BSIM4BPgpPtr) += m * (gcbgb - here->BSIM4gbgs - gIbtotg)); (*(here->BSIM4BPspPtr) += m * (gcbsb - gjbs + gbbsp - gIbtots)); (*(here->BSIM4BPbpPtr) += m * (gjbd + gjbs + gcbbb - here->BSIM4gbbs - - gIbtotb)); + - gIbtotb)); ggidld = here->BSIM4ggidld; ggidlg = here->BSIM4ggidlg; @@ -5131,7 +5284,7 @@ line900: (*(here->BSIM4BPsbPtr) -= m * here->BSIM4grbps); (*(here->BSIM4BPbpPtr) += m * (here->BSIM4grbpd + here->BSIM4grbps + here->BSIM4grbpb)); - /* WDLiu: (gcbbb - here->BSIM4gbbs) already added to BPbpPtr */ + /* WDLiu: (gcbbb - here->BSIM4gbbs) already added to BPbpPtr */ (*(here->BSIM4SBspPtr) += m * (gcsbsb - here->BSIM4gbs)); (*(here->BSIM4SBbpPtr) -= m * here->BSIM4grbps); @@ -5223,7 +5376,7 @@ void BSIM4LoadRhsMat(GENmodel *inModel, CKTcircuit *ckt) if (here->BSIM4rgateMod == 2) (*(ckt->CKTrhs + here->BSIM4gNodeExt) -= here->BSIM4rhsgExt); else if (here->BSIM4rgateMod == 3) - (*(ckt->CKTrhs + here->BSIM4gNodeMid) -= here->BSIM4grhsMid); + (*(ckt->CKTrhs + here->BSIM4gNodeMid) -= here->BSIM4grhsMid); if (!here->BSIM4rbodyMod) { (*(ckt->CKTrhs + here->BSIM4bNodePrime) += here->BSIM4rhsbPrime); @@ -5237,9 +5390,9 @@ void BSIM4LoadRhsMat(GENmodel *inModel, CKTcircuit *ckt) } if (model->BSIM4rdsMod) - { (*(ckt->CKTrhs + here->BSIM4dNode) -= here->BSIM4rhsd); - (*(ckt->CKTrhs + here->BSIM4sNode) += here->BSIM4rhss); - } + { (*(ckt->CKTrhs + here->BSIM4dNode) -= here->BSIM4rhsd); + (*(ckt->CKTrhs + here->BSIM4sNode) += here->BSIM4rhss); + } if (here->BSIM4trnqsMod) *(ckt->CKTrhs + here->BSIM4qNode) += here->BSIM4rhsq; @@ -5250,26 +5403,26 @@ void BSIM4LoadRhsMat(GENmodel *inModel, CKTcircuit *ckt) { (*(here->BSIM4GEgePtr) += here->BSIM4_1); (*(here->BSIM4GPgePtr) -= here->BSIM4_2); (*(here->BSIM4GEgpPtr) -= here->BSIM4_3); - (*(here->BSIM4GPgpPtr) += here->BSIM4_4); + (*(here->BSIM4GPgpPtr) += here->BSIM4_4); (*(here->BSIM4GPdpPtr) += here->BSIM4_5); (*(here->BSIM4GPspPtr) += here->BSIM4_6); (*(here->BSIM4GPbpPtr) += here->BSIM4_7); } - else if (here->BSIM4rgateMod == 2) + else if (here->BSIM4rgateMod == 2) { (*(here->BSIM4GEgePtr) += here->BSIM4_8); (*(here->BSIM4GEgpPtr) += here->BSIM4_9); (*(here->BSIM4GEdpPtr) += here->BSIM4_10); (*(here->BSIM4GEspPtr) += here->BSIM4_11); - (*(here->BSIM4GEbpPtr) += here->BSIM4_12); + (*(here->BSIM4GEbpPtr) += here->BSIM4_12); (*(here->BSIM4GPgePtr) -= here->BSIM4_13); - (*(here->BSIM4GPgpPtr) += here->BSIM4_14); - (*(here->BSIM4GPdpPtr) += here->BSIM4_15); - (*(here->BSIM4GPspPtr) += here->BSIM4_16); - (*(here->BSIM4GPbpPtr) += here->BSIM4_17); - } - else if (here->BSIM4rgateMod == 3) - { (*(here->BSIM4GEgePtr) += here->BSIM4_18); + (*(here->BSIM4GPgpPtr) += here->BSIM4_14); + (*(here->BSIM4GPdpPtr) += here->BSIM4_15); + (*(here->BSIM4GPspPtr) += here->BSIM4_16); + (*(here->BSIM4GPbpPtr) += here->BSIM4_17); + } + else if (here->BSIM4rgateMod == 3) + { (*(here->BSIM4GEgePtr) += here->BSIM4_18); (*(here->BSIM4GEgmPtr) -= here->BSIM4_19); (*(here->BSIM4GMgePtr) -= here->BSIM4_20); (*(here->BSIM4GMgmPtr) += here->BSIM4_21); @@ -5288,25 +5441,25 @@ void BSIM4LoadRhsMat(GENmodel *inModel, CKTcircuit *ckt) (*(here->BSIM4GPdpPtr) += here->BSIM4_31); (*(here->BSIM4GPspPtr) += here->BSIM4_32); (*(here->BSIM4GPbpPtr) += here->BSIM4_33); - } + } - else - { (*(here->BSIM4GPgpPtr) += here->BSIM4_34); - (*(here->BSIM4GPdpPtr) += here->BSIM4_35); + else + { (*(here->BSIM4GPgpPtr) += here->BSIM4_34); + (*(here->BSIM4GPdpPtr) += here->BSIM4_35); (*(here->BSIM4GPspPtr) += here->BSIM4_36); - (*(here->BSIM4GPbpPtr) += here->BSIM4_37); - } + (*(here->BSIM4GPbpPtr) += here->BSIM4_37); + } - if (model->BSIM4rdsMod) - { (*(here->BSIM4DgpPtr) += here->BSIM4_38); - (*(here->BSIM4DspPtr) += here->BSIM4_39); + if (model->BSIM4rdsMod) + { (*(here->BSIM4DgpPtr) += here->BSIM4_38); + (*(here->BSIM4DspPtr) += here->BSIM4_39); (*(here->BSIM4DbpPtr) += here->BSIM4_40); (*(here->BSIM4SdpPtr) += here->BSIM4_41); (*(here->BSIM4SgpPtr) += here->BSIM4_42); (*(here->BSIM4SbpPtr) += here->BSIM4_43); - } + } (*(here->BSIM4DPdpPtr) += here->BSIM4_44); (*(here->BSIM4DPdPtr) -= here->BSIM4_45); diff --git a/src/spicelib/devices/bsim4/b4mask.c b/src/spicelib/devices/bsim4/b4mask.c index 4a0cdf52c..bf9d77e4f 100644 --- a/src/spicelib/devices/bsim4/b4mask.c +++ b/src/spicelib/devices/bsim4/b4mask.c @@ -1,8 +1,8 @@ -/**** BSIM4.6.2 Released by Wenwei Yang 07/31/2008 ****/ +/**** BSIM4.7.0 Released by Darsen Lu 04/08/2011 ****/ /********** * Copyright 2006 Regents of the University of California. All rights reserved. - * File: b4mask.c of BSIM4.6.2. + * File: b4mask.c of BSIM4.7.0. * Author: 2000 Weidong Liu * Authors: 2001- Xuemei Xi, Mohan Dunga, Ali Niknejad, Chenming Hu. * Authors: 2006- Mohan Dunga, Ali Niknejad, Chenming Hu @@ -15,6 +15,7 @@ * Modified by Xuemei Xi, Mohan Dunga, 07/29/2005. * Modified by Mohan Dunga, 12/13/2006 * Modified by Mohan Dunga, Wenwei Yang, 07/31/2008. + * Modified by Tanvir Morshed, Darsen Lu 03/27/2011 **********/ @@ -86,7 +87,12 @@ IFvalue *value) case BSIM4_MOD_MTRLMOD : value->iValue = model->BSIM4mtrlMod; return(OK); - + case BSIM4_MOD_GIDLMOD : /* v4.7 New GIDL/GISL*/ + value->iValue = model->BSIM4gidlMod; + return(OK); + case BSIM4_MOD_MTRLCOMPATMOD : + value->iValue = model->BSIM4mtrlCompatMod; + return(OK); case BSIM4_MOD_IGCMOD : value->iValue = model->BSIM4igcMod; return(OK); @@ -109,13 +115,13 @@ IFvalue *value) case BSIM4_MOD_VDDEOT : value->rValue = model->BSIM4vddeot; return(OK); - case BSIM4_MOD_TEMPEOT : + case BSIM4_MOD_TEMPEOT : value->rValue = model->BSIM4tempeot; return(OK); - case BSIM4_MOD_LEFFEOT : + case BSIM4_MOD_LEFFEOT : value->rValue = model->BSIM4leffeot; return(OK); - case BSIM4_MOD_WEFFEOT : + case BSIM4_MOD_WEFFEOT : value->rValue = model->BSIM4weffeot; return(OK); case BSIM4_MOD_ADOS : @@ -281,6 +287,18 @@ IFvalue *value) case BSIM4_MOD_DVTP1: value->rValue = model->BSIM4dvtp1; return(OK); + case BSIM4_MOD_DVTP2: + value->rValue = model->BSIM4dvtp2; /* New DIBL/Rout */ + return(OK); + case BSIM4_MOD_DVTP3: + value->rValue = model->BSIM4dvtp3; + return(OK); + case BSIM4_MOD_DVTP4: + value->rValue = model->BSIM4dvtp4; + return(OK); + case BSIM4_MOD_DVTP5: + value->rValue = model->BSIM4dvtp5; + return(OK); case BSIM4_MOD_DVT0 : value->rValue = model->BSIM4dvt0; return(OK); @@ -311,7 +329,7 @@ IFvalue *value) case BSIM4_MOD_EU: value->rValue = model->BSIM4eu; return(OK); - case BSIM4_MOD_UCS: + case BSIM4_MOD_UCS: value->rValue = model->BSIM4ucs; return(OK); case BSIM4_MOD_UA: @@ -350,7 +368,7 @@ IFvalue *value) case BSIM4_MOD_UTE: value->rValue = model->BSIM4ute; return(OK); - case BSIM4_MOD_UCSTE: + case BSIM4_MOD_UCSTE: value->rValue = model->BSIM4ucste; return(OK); case BSIM4_MOD_VOFF: @@ -359,6 +377,15 @@ IFvalue *value) case BSIM4_MOD_TVOFF: value->rValue = model->BSIM4tvoff; return(OK); + case BSIM4_MOD_TNFACTOR: /* v4.7 temp dep of leakage current */ + value->rValue = model->BSIM4tnfactor; + return(OK); + case BSIM4_MOD_TETA0: /* v4.7 temp dep of leakage current */ + value->rValue = model->BSIM4teta0; + return(OK); + case BSIM4_MOD_TVOFFCV: /* v4.7 temp dep of leakage current */ + value->rValue = model->BSIM4tvoffcv; + return(OK); case BSIM4_MOD_VFBSDOFF: value->rValue = model->BSIM4vfbsdoff; return(OK); @@ -482,6 +509,15 @@ IFvalue *value) case BSIM4_MOD_EGIDL: value->rValue = model->BSIM4egidl; return(OK); + case BSIM4_MOD_FGIDL: /* v4.7 New GIDL/GISL*/ + value->rValue = model->BSIM4fgidl; + return(OK); + case BSIM4_MOD_KGIDL: /* v4.7 New GIDL/GISL*/ + value->rValue = model->BSIM4kgidl; + return(OK); + case BSIM4_MOD_RGIDL: /* v4.7 New GIDL/GISL*/ + value->rValue = model->BSIM4rgidl; + return(OK); case BSIM4_MOD_AGISL: value->rValue = model->BSIM4agisl; return(OK); @@ -494,6 +530,15 @@ IFvalue *value) case BSIM4_MOD_EGISL: value->rValue = model->BSIM4egisl; return(OK); + case BSIM4_MOD_FGISL: /* v4.7 New GIDL/GISL*/ + value->rValue = model->BSIM4fgisl; + return(OK); + case BSIM4_MOD_KGISL: /* v4.7 New GIDL/GISL*/ + value->rValue = model->BSIM4kgisl; + return(OK); + case BSIM4_MOD_RGISL: /* v4.7 New GIDL/GISL*/ + value->rValue = model->BSIM4rgisl; + return(OK); case BSIM4_MOD_AIGC: value->rValue = model->BSIM4aigc; return(OK); @@ -584,12 +629,18 @@ IFvalue *value) case BSIM4_MOD_TNOIB: value->rValue = model->BSIM4tnoib; return(OK); + case BSIM4_MOD_TNOIC: + value->rValue = model->BSIM4tnoic; + return(OK); case BSIM4_MOD_RNOIA: value->rValue = model->BSIM4rnoia; return(OK); case BSIM4_MOD_RNOIB: value->rValue = model->BSIM4rnoib; return(OK); + case BSIM4_MOD_RNOIC: + value->rValue = model->BSIM4rnoic; + return(OK); case BSIM4_MOD_NTNOI: value->rValue = model->BSIM4ntnoi; return(OK); @@ -639,9 +690,9 @@ IFvalue *value) case BSIM4_MOD_JTSSWGD: value->rValue = model->BSIM4jtsswgd; return(OK); - case BSIM4_MOD_JTWEFF: - value->rValue = model->BSIM4jtweff; - return(OK); + case BSIM4_MOD_JTWEFF: + value->rValue = model->BSIM4jtweff; + return(OK); case BSIM4_MOD_NJTS: value->rValue = model->BSIM4njts; return(OK); @@ -1015,6 +1066,18 @@ IFvalue *value) case BSIM4_MOD_LDVTP1: value->rValue = model->BSIM4ldvtp1; return(OK); + case BSIM4_MOD_LDVTP2: + value->rValue = model->BSIM4ldvtp2; /* New DIBL/Rout */ + return(OK); + case BSIM4_MOD_LDVTP3: + value->rValue = model->BSIM4ldvtp3; + return(OK); + case BSIM4_MOD_LDVTP4: + value->rValue = model->BSIM4ldvtp4; + return(OK); + case BSIM4_MOD_LDVTP5: + value->rValue = model->BSIM4ldvtp5; + return(OK); case BSIM4_MOD_LDVT0: value->rValue = model->BSIM4ldvt0; return(OK); @@ -1078,7 +1141,7 @@ IFvalue *value) case BSIM4_MOD_LUTE: value->rValue = model->BSIM4lute; return(OK); - case BSIM4_MOD_LUCSTE: + case BSIM4_MOD_LUCSTE: value->rValue = model->BSIM4lucste; return(OK); case BSIM4_MOD_LVOFF: @@ -1087,6 +1150,15 @@ IFvalue *value) case BSIM4_MOD_LTVOFF: value->rValue = model->BSIM4ltvoff; return(OK); + case BSIM4_MOD_LTNFACTOR: /* v4.7 temp dep of leakage current */ + value->rValue = model->BSIM4ltnfactor; + return(OK); + case BSIM4_MOD_LTETA0: /* v4.7 temp dep of leakage current */ + value->rValue = model->BSIM4lteta0; + return(OK); + case BSIM4_MOD_LTVOFFCV: /* v4.7 temp dep of leakage current */ + value->rValue = model->BSIM4ltvoffcv; + return(OK); case BSIM4_MOD_LMINV: value->rValue = model->BSIM4lminv; return(OK); @@ -1183,9 +1255,18 @@ IFvalue *value) case BSIM4_MOD_LCGIDL: value->rValue = model->BSIM4lcgidl; return(OK); - case BSIM4_MOD_LEGIDL: + case BSIM4_MOD_LEGIDL: value->rValue = model->BSIM4legidl; return(OK); + case BSIM4_MOD_LFGIDL: /* v4.7 New GIDL/GISL*/ + value->rValue = model->BSIM4lfgidl; + return(OK); + case BSIM4_MOD_LKGIDL: /* v4.7 New GIDL/GISL*/ + value->rValue = model->BSIM4lkgidl; + return(OK); + case BSIM4_MOD_LRGIDL: /* v4.7 New GIDL/GISL*/ + value->rValue = model->BSIM4lrgidl; + return(OK); case BSIM4_MOD_LAGISL: value->rValue = model->BSIM4lagisl; return(OK); @@ -1198,6 +1279,15 @@ IFvalue *value) case BSIM4_MOD_LEGISL: value->rValue = model->BSIM4legisl; return(OK); + case BSIM4_MOD_LFGISL: /* v4.7 New GIDL/GISL*/ + value->rValue = model->BSIM4lfgisl; + return(OK); + case BSIM4_MOD_LKGISL: /* v4.7 New GIDL/GISL*/ + value->rValue = model->BSIM4lkgisl; + return(OK); + case BSIM4_MOD_LRGISL: /* v4.7 New GIDL/GISL*/ + value->rValue = model->BSIM4lrgisl; + return(OK); case BSIM4_MOD_LAIGC: value->rValue = model->BSIM4laigc; return(OK); @@ -1285,7 +1375,7 @@ IFvalue *value) case BSIM4_MOD_LEU: value->rValue = model->BSIM4leu; return(OK); - case BSIM4_MOD_LUCS: + case BSIM4_MOD_LUCS: value->rValue = model->BSIM4lucs; return(OK); case BSIM4_MOD_LVFB: @@ -1435,6 +1525,18 @@ IFvalue *value) case BSIM4_MOD_WDVTP1: value->rValue = model->BSIM4wdvtp1; return(OK); + case BSIM4_MOD_WDVTP2: + value->rValue = model->BSIM4wdvtp2; /* New DIBL/Rout */ + return(OK); + case BSIM4_MOD_WDVTP3: + value->rValue = model->BSIM4wdvtp3; + return(OK); + case BSIM4_MOD_WDVTP4: + value->rValue = model->BSIM4wdvtp4; + return(OK); + case BSIM4_MOD_WDVTP5: + value->rValue = model->BSIM4wdvtp5; + return(OK); case BSIM4_MOD_WLPEB: value->rValue = model->BSIM4wlpeb; return(OK); @@ -1501,7 +1603,7 @@ IFvalue *value) case BSIM4_MOD_WUTE: value->rValue = model->BSIM4wute; return(OK); - case BSIM4_MOD_WUCSTE: + case BSIM4_MOD_WUCSTE: value->rValue = model->BSIM4wucste; return(OK); case BSIM4_MOD_WVOFF: @@ -1510,6 +1612,15 @@ IFvalue *value) case BSIM4_MOD_WTVOFF: value->rValue = model->BSIM4wtvoff; return(OK); + case BSIM4_MOD_WTNFACTOR: /* v4.7 temp dep of leakage current */ + value->rValue = model->BSIM4wtnfactor; + return(OK); + case BSIM4_MOD_WTETA0: /* v4.7 temp dep of leakage current */ + value->rValue = model->BSIM4wteta0; + return(OK); + case BSIM4_MOD_WTVOFFCV: /* v4.7 temp dep of leakage current */ + value->rValue = model->BSIM4wtvoffcv; + return(OK); case BSIM4_MOD_WMINV: value->rValue = model->BSIM4wminv; return(OK); @@ -1609,6 +1720,15 @@ IFvalue *value) case BSIM4_MOD_WEGIDL: value->rValue = model->BSIM4wegidl; return(OK); + case BSIM4_MOD_WFGIDL: /* v4.7 New GIDL/GISL*/ + value->rValue = model->BSIM4wfgidl; + return(OK); + case BSIM4_MOD_WKGIDL: /* v4.7 New GIDL/GISL*/ + value->rValue = model->BSIM4wkgidl; + return(OK); + case BSIM4_MOD_WRGIDL: /* v4.7 New GIDL/GISL*/ + value->rValue = model->BSIM4wrgidl; + return(OK); case BSIM4_MOD_WAGISL: value->rValue = model->BSIM4wagisl; return(OK); @@ -1621,6 +1741,15 @@ IFvalue *value) case BSIM4_MOD_WEGISL: value->rValue = model->BSIM4wegisl; return(OK); + case BSIM4_MOD_WFGISL: /* v4.7 New GIDL/GISL*/ + value->rValue = model->BSIM4wfgisl; + return(OK); + case BSIM4_MOD_WKGISL: /* v4.7 New GIDL/GISL*/ + value->rValue = model->BSIM4wkgisl; + return(OK); + case BSIM4_MOD_WRGISL: /* v4.7 New GIDL/GISL*/ + value->rValue = model->BSIM4wrgisl; + return(OK); case BSIM4_MOD_WAIGC: value->rValue = model->BSIM4waigc; return(OK); @@ -1708,7 +1837,7 @@ IFvalue *value) case BSIM4_MOD_WEU: value->rValue = model->BSIM4weu; return(OK); - case BSIM4_MOD_WUCS: + case BSIM4_MOD_WUCS: value->rValue = model->BSIM4wucs; return(OK); case BSIM4_MOD_WVFB: @@ -1861,6 +1990,18 @@ IFvalue *value) case BSIM4_MOD_PDVTP1: value->rValue = model->BSIM4pdvtp1; return(OK); + case BSIM4_MOD_PDVTP2: + value->rValue = model->BSIM4pdvtp2; /* New DIBL/Rout */ + return(OK); + case BSIM4_MOD_PDVTP3: + value->rValue = model->BSIM4pdvtp3; + return(OK); + case BSIM4_MOD_PDVTP4: + value->rValue = model->BSIM4pdvtp4; + return(OK); + case BSIM4_MOD_PDVTP5: + value->rValue = model->BSIM4pdvtp5; + return(OK); case BSIM4_MOD_PDVT0 : value->rValue = model->BSIM4pdvt0; return(OK); @@ -1924,7 +2065,7 @@ IFvalue *value) case BSIM4_MOD_PUTE: value->rValue = model->BSIM4pute; return(OK); - case BSIM4_MOD_PUCSTE: + case BSIM4_MOD_PUCSTE: value->rValue = model->BSIM4pucste; return(OK); case BSIM4_MOD_PVOFF: @@ -1933,6 +2074,15 @@ IFvalue *value) case BSIM4_MOD_PTVOFF: value->rValue = model->BSIM4ptvoff; return(OK); + case BSIM4_MOD_PTNFACTOR: /* v4.7 temp dep of leakage current */ + value->rValue = model->BSIM4ptnfactor; + return(OK); + case BSIM4_MOD_PTETA0: /* v4.7 temp dep of leakage current */ + value->rValue = model->BSIM4pteta0; + return(OK); + case BSIM4_MOD_PTVOFFCV: /* v4.7 temp dep of leakage current */ + value->rValue = model->BSIM4ptvoffcv; + return(OK); case BSIM4_MOD_PMINV: value->rValue = model->BSIM4pminv; return(OK); @@ -2032,6 +2182,15 @@ IFvalue *value) case BSIM4_MOD_PEGIDL: value->rValue = model->BSIM4pegidl; return(OK); + case BSIM4_MOD_PFGIDL: /* v4.7 New GIDL/GISL*/ + value->rValue = model->BSIM4pfgidl; + return(OK); + case BSIM4_MOD_PKGIDL: /* v4.7 New GIDL/GISL*/ + value->rValue = model->BSIM4pkgidl; + return(OK); + case BSIM4_MOD_PRGIDL: /* v4.7 New GIDL/GISL*/ + value->rValue = model->BSIM4prgidl; + return(OK); case BSIM4_MOD_PAGISL: value->rValue = model->BSIM4pagisl; return(OK); @@ -2044,6 +2203,15 @@ IFvalue *value) case BSIM4_MOD_PEGISL: value->rValue = model->BSIM4pegisl; return(OK); + case BSIM4_MOD_PFGISL: /* v4.7 New GIDL/GISL*/ + value->rValue = model->BSIM4pfgisl; + return(OK); + case BSIM4_MOD_PKGISL: /* v4.7 New GIDL/GISL*/ + value->rValue = model->BSIM4pkgisl; + return(OK); + case BSIM4_MOD_PRGISL: /* v4.7 New GIDL/GISL*/ + value->rValue = model->BSIM4prgisl; + return(OK); case BSIM4_MOD_PAIGC: value->rValue = model->BSIM4paigc; return(OK); @@ -2131,7 +2299,7 @@ IFvalue *value) case BSIM4_MOD_PEU: value->rValue = model->BSIM4peu; return(OK); - case BSIM4_MOD_PUCS: + case BSIM4_MOD_PUCS: value->rValue = model->BSIM4pucs; return(OK); case BSIM4_MOD_PVFB: diff --git a/src/spicelib/devices/bsim4/b4mdel.c b/src/spicelib/devices/bsim4/b4mdel.c index dd18c43d4..fdb128833 100644 --- a/src/spicelib/devices/bsim4/b4mdel.c +++ b/src/spicelib/devices/bsim4/b4mdel.c @@ -1,8 +1,8 @@ -/**** BSIM4.6.2 Released by Wenwei Yang 07/31/2008 ****/ +/**** BSIM4.7.0 Released by Darsen Lu 04/08/2011 ****/ /********** * Copyright 2006 Regents of the University of California. All rights reserved. - * File: b4mdel.c of BSIM4.6.2. + * File: b4mdel.c of BSIM4.7.0. * Author: 2000 Weidong Liu * Authors: 2001- Xuemei Xi, Mohan Dunga, Ali Niknejad, Chenming Hu. * Authors: 2006- Mohan Dunga, Ali Niknejad, Chenming Hu @@ -18,7 +18,7 @@ int BSIM4mDelete( GENmodel **inModel, -IFuid modname, +IFuid modname, GENmodel *kill) { BSIM4model **model = (BSIM4model**)inModel; diff --git a/src/spicelib/devices/bsim4/b4mpar.c b/src/spicelib/devices/bsim4/b4mpar.c index d0f69422c..44b3e077c 100644 --- a/src/spicelib/devices/bsim4/b4mpar.c +++ b/src/spicelib/devices/bsim4/b4mpar.c @@ -1,8 +1,8 @@ -/**** BSIM4.6.2 Released by Wenwei Yang 07/31/2008 ****/ +/**** BSIM4.7.0 Released by Darsen Lu 04/08/2011 ****/ /********** * Copyright 2006 Regents of the University of California. All rights reserved. - * File: b4mpar.c of BSIM4.6.1. + * File: b4mpar.c of BSIM4.7.0. * Author: 2000 Weidong Liu * Authors: 2001- Xuemei Xi, Mohan Dunga, Ali Niknejad, Chenming Hu. * Authors: 2006- Mohan Dunga, Ali Niknejad, Chenming Hu @@ -18,6 +18,7 @@ * Modified by Mohan Dunga, 12/13/2006 * Modified by Mohan Dunga, Wenwei Yang, 05/18/2007. * Modified by Wenwei Yang, 07/31/2008. + * Modified by Tanvir Morshed, Darsen Lu 03/27/2011 **********/ #include "ngspice.h" @@ -99,6 +100,14 @@ GENmodel *inMod) mod->BSIM4mtrlMod = value->iValue; mod->BSIM4mtrlModGiven = TRUE; break; + case BSIM4_MOD_MTRLCOMPATMOD : + mod->BSIM4mtrlCompatMod = value->iValue; + mod->BSIM4mtrlCompatModGiven = TRUE; + break; + case BSIM4_MOD_GIDLMOD : /* v4.7 New GIDL/GISL */ + mod->BSIM4gidlMod = value->iValue; + mod->BSIM4gidlModGiven = TRUE; + break; case BSIM4_MOD_IGCMOD : mod->BSIM4igcMod = value->iValue; mod->BSIM4igcModGiven = TRUE; @@ -128,15 +137,15 @@ GENmodel *inMod) mod->BSIM4vddeot = value->rValue; mod->BSIM4vddeotGiven = TRUE; break; - case BSIM4_MOD_TEMPEOT : + case BSIM4_MOD_TEMPEOT : mod->BSIM4tempeot = value->rValue; mod->BSIM4tempeotGiven = TRUE; break; - case BSIM4_MOD_LEFFEOT : + case BSIM4_MOD_LEFFEOT : mod->BSIM4leffeot = value->rValue; mod->BSIM4leffeotGiven = TRUE; break; - case BSIM4_MOD_WEFFEOT : + case BSIM4_MOD_WEFFEOT : mod->BSIM4weffeot = value->rValue; mod->BSIM4weffeotGiven = TRUE; break; @@ -230,13 +239,13 @@ GENmodel *inMod) mod->BSIM4nsubGiven = TRUE; break; case BSIM4_MOD_PHIG: - mod->BSIM4phig = value->rValue; - mod->BSIM4phigGiven = TRUE; - break; + mod->BSIM4phig = value->rValue; + mod->BSIM4phigGiven = TRUE; + break; case BSIM4_MOD_EPSRGATE: - mod->BSIM4epsrgate = value->rValue; - mod->BSIM4epsrgateGiven = TRUE; - break; + mod->BSIM4epsrgate = value->rValue; + mod->BSIM4epsrgateGiven = TRUE; + break; case BSIM4_MOD_EASUB: mod->BSIM4easub = value->rValue; mod->BSIM4easubGiven = TRUE; @@ -264,8 +273,8 @@ GENmodel *inMod) case BSIM4_MOD_NDEP: mod->BSIM4ndep = value->rValue; mod->BSIM4ndepGiven = TRUE; - if (mod->BSIM4ndep > 1.0e20) - mod->BSIM4ndep *= 1.0e-6; + if (mod->BSIM4ndep > 1.0e20) + mod->BSIM4ndep *= 1.0e-6; break; case BSIM4_MOD_NSD: mod->BSIM4nsd = value->rValue; @@ -276,8 +285,8 @@ GENmodel *inMod) case BSIM4_MOD_NGATE: mod->BSIM4ngate = value->rValue; mod->BSIM4ngateGiven = TRUE; - if (mod->BSIM4ngate > 1.0e23) - mod->BSIM4ngate *= 1.0e-6; + if (mod->BSIM4ngate > 1.0e23) + mod->BSIM4ngate *= 1.0e-6; break; case BSIM4_MOD_GAMMA1: mod->BSIM4gamma1 = value->rValue; @@ -343,6 +352,22 @@ GENmodel *inMod) mod->BSIM4dvtp1 = value->rValue; mod->BSIM4dvtp1Given = TRUE; break; + case BSIM4_MOD_DVTP2: /* New DIBL/Rout */ + mod->BSIM4dvtp2 = value->rValue; + mod->BSIM4dvtp2Given = TRUE; + break; + case BSIM4_MOD_DVTP3: + mod->BSIM4dvtp3 = value->rValue; + mod->BSIM4dvtp3Given = TRUE; + break; + case BSIM4_MOD_DVTP4: + mod->BSIM4dvtp4 = value->rValue; + mod->BSIM4dvtp4Given = TRUE; + break; + case BSIM4_MOD_DVTP5: + mod->BSIM4dvtp5 = value->rValue; + mod->BSIM4dvtp5Given = TRUE; + break; case BSIM4_MOD_W0: mod->BSIM4w0 = value->rValue; mod->BSIM4w0Given = TRUE; @@ -387,7 +412,7 @@ GENmodel *inMod) mod->BSIM4eu = value->rValue; mod->BSIM4euGiven = TRUE; break; - case BSIM4_MOD_UCS: + case BSIM4_MOD_UCS: mod->BSIM4ucs = value->rValue; mod->BSIM4ucsGiven = TRUE; break; @@ -501,6 +526,18 @@ GENmodel *inMod) mod->BSIM4tvoff = value->rValue; mod->BSIM4tvoffGiven = TRUE; break; + case BSIM4_MOD_TNFACTOR: /* v4.7 temp dep of leakage current */ + mod->BSIM4tnfactor = value->rValue; + mod->BSIM4tnfactorGiven = TRUE; + break; + case BSIM4_MOD_TETA0: /* v4.7 temp dep of leakage current */ + mod->BSIM4teta0 = value->rValue; + mod->BSIM4teta0Given = TRUE; + break; + case BSIM4_MOD_TVOFFCV: /* v4.7 temp dep of leakage current */ + mod->BSIM4tvoffcv = value->rValue; + mod->BSIM4tvoffcvGiven = TRUE; + break; case BSIM4_MOD_VOFFL: mod->BSIM4voffl = value->rValue; mod->BSIM4vofflGiven = TRUE; @@ -657,6 +694,18 @@ GENmodel *inMod) mod->BSIM4egidl = value->rValue; mod->BSIM4egidlGiven = TRUE; break; + case BSIM4_MOD_FGIDL : /* v4.7 New GIDL/GISL */ + mod->BSIM4fgidl = value->rValue; + mod->BSIM4fgidlGiven = TRUE; + break; + case BSIM4_MOD_KGIDL : /* v4.7 New GIDL/GISL */ + mod->BSIM4kgidl = value->rValue; + mod->BSIM4kgidlGiven = TRUE; + break; + case BSIM4_MOD_RGIDL : /* v4.7 New GIDL/GISL */ + mod->BSIM4rgidl = value->rValue; + mod->BSIM4rgidlGiven = TRUE; + break; case BSIM4_MOD_AGISL : mod->BSIM4agisl = value->rValue; mod->BSIM4agislGiven = TRUE; @@ -673,6 +722,18 @@ GENmodel *inMod) mod->BSIM4egisl = value->rValue; mod->BSIM4egislGiven = TRUE; break; + case BSIM4_MOD_FGISL : /* v4.7 New GIDL/GISL */ + mod->BSIM4fgisl = value->rValue; + mod->BSIM4fgislGiven = TRUE; + break; + case BSIM4_MOD_KGISL : /* v4.7 New GIDL/GISL */ + mod->BSIM4kgisl = value->rValue; + mod->BSIM4kgislGiven = TRUE; + break; + case BSIM4_MOD_RGISL : /* v4.7 New GIDL/GISL */ + mod->BSIM4rgisl = value->rValue; + mod->BSIM4rgislGiven = TRUE; + break; case BSIM4_MOD_AIGC : mod->BSIM4aigc = value->rValue; mod->BSIM4aigcGiven = TRUE; @@ -805,6 +866,10 @@ GENmodel *inMod) mod->BSIM4tnoib = value->rValue; mod->BSIM4tnoibGiven = TRUE; break; + case BSIM4_MOD_TNOIC : + mod->BSIM4tnoic = value->rValue; + mod->BSIM4tnoicGiven = TRUE; + break; case BSIM4_MOD_RNOIA : mod->BSIM4rnoia = value->rValue; mod->BSIM4rnoiaGiven = TRUE; @@ -813,6 +878,10 @@ GENmodel *inMod) mod->BSIM4rnoib = value->rValue; mod->BSIM4rnoibGiven = TRUE; break; + case BSIM4_MOD_RNOIC : + mod->BSIM4rnoic = value->rValue; + mod->BSIM4rnoicGiven = TRUE; + break; case BSIM4_MOD_NTNOI : mod->BSIM4ntnoi = value->rValue; mod->BSIM4ntnoiGiven = TRUE; @@ -920,7 +989,7 @@ GENmodel *inMod) mod->BSIM4web = value->rValue; mod->BSIM4webGiven = TRUE; break; - case BSIM4_MOD_WEC : + case BSIM4_MOD_WEC : mod->BSIM4wec = value->rValue; mod->BSIM4wecGiven = TRUE; break; @@ -1043,9 +1112,9 @@ GENmodel *inMod) mod->BSIM4jtsswgd = value->rValue; mod->BSIM4jtsswgdGiven = TRUE; break; - case BSIM4_MOD_JTWEFF : - mod->BSIM4jtweff = value->rValue; - mod->BSIM4jtweffGiven = TRUE; + case BSIM4_MOD_JTWEFF : + mod->BSIM4jtweff = value->rValue; + mod->BSIM4jtweffGiven = TRUE; break; case BSIM4_MOD_NJTS : mod->BSIM4njts = value->rValue; @@ -1416,7 +1485,7 @@ GENmodel *inMod) mod->BSIM4tpbswgGiven = TRUE; break; - /* Length dependence */ + /* Length dependence */ case BSIM4_MOD_LCDSC : mod->BSIM4lcdsc = value->rValue; mod->BSIM4lcdscGiven = TRUE; @@ -1480,8 +1549,8 @@ GENmodel *inMod) case BSIM4_MOD_LNDEP: mod->BSIM4lndep = value->rValue; mod->BSIM4lndepGiven = TRUE; - if (mod->BSIM4lndep > 1.0e20) - mod->BSIM4lndep *= 1.0e-6; + if (mod->BSIM4lndep > 1.0e20) + mod->BSIM4lndep *= 1.0e-6; break; case BSIM4_MOD_LNSD: mod->BSIM4lnsd = value->rValue; @@ -1492,8 +1561,8 @@ GENmodel *inMod) case BSIM4_MOD_LNGATE: mod->BSIM4lngate = value->rValue; mod->BSIM4lngateGiven = TRUE; - if (mod->BSIM4lngate > 1.0e23) - mod->BSIM4lngate *= 1.0e-6; + if (mod->BSIM4lngate > 1.0e23) + mod->BSIM4lngate *= 1.0e-6; break; case BSIM4_MOD_LGAMMA1: mod->BSIM4lgamma1 = value->rValue; @@ -1559,6 +1628,22 @@ GENmodel *inMod) mod->BSIM4ldvtp1 = value->rValue; mod->BSIM4ldvtp1Given = TRUE; break; + case BSIM4_MOD_LDVTP2: /* New DIBL/Rout */ + mod->BSIM4ldvtp2 = value->rValue; + mod->BSIM4ldvtp2Given = TRUE; + break; + case BSIM4_MOD_LDVTP3: + mod->BSIM4ldvtp3 = value->rValue; + mod->BSIM4ldvtp3Given = TRUE; + break; + case BSIM4_MOD_LDVTP4: + mod->BSIM4ldvtp4 = value->rValue; + mod->BSIM4ldvtp4Given = TRUE; + break; + case BSIM4_MOD_LDVTP5: + mod->BSIM4ldvtp5 = value->rValue; + mod->BSIM4ldvtp5Given = TRUE; + break; case BSIM4_MOD_LW0: mod->BSIM4lw0 = value->rValue; mod->BSIM4lw0Given = TRUE; @@ -1631,7 +1716,7 @@ GENmodel *inMod) mod->BSIM4lute = value->rValue; mod->BSIM4luteGiven = TRUE; break; - case BSIM4_MOD_LUCSTE : + case BSIM4_MOD_LUCSTE : mod->BSIM4lucste = value->rValue; mod->BSIM4lucsteGiven = TRUE; break; @@ -1643,6 +1728,18 @@ GENmodel *inMod) mod->BSIM4ltvoff = value->rValue; mod->BSIM4ltvoffGiven = TRUE; break; + case BSIM4_MOD_LTNFACTOR: /* v4.7 temp dep of leakage current */ + mod->BSIM4ltnfactor = value->rValue; + mod->BSIM4ltnfactorGiven = TRUE; + break; + case BSIM4_MOD_LTETA0: /* v4.7 temp dep of leakage current */ + mod->BSIM4lteta0 = value->rValue; + mod->BSIM4lteta0Given = TRUE; + break; + case BSIM4_MOD_LTVOFFCV: /* v4.7 temp dep of leakage current */ + mod->BSIM4ltvoffcv = value->rValue; + mod->BSIM4ltvoffcvGiven = TRUE; + break; case BSIM4_MOD_LMINV: mod->BSIM4lminv = value->rValue; mod->BSIM4lminvGiven = TRUE; @@ -1779,6 +1876,18 @@ GENmodel *inMod) mod->BSIM4legidl = value->rValue; mod->BSIM4legidlGiven = TRUE; break; + case BSIM4_MOD_LFGIDL : /* v4.7 New GIDL/GISL */ + mod->BSIM4lfgidl = value->rValue; + mod->BSIM4lfgidlGiven = TRUE; + break; + case BSIM4_MOD_LKGIDL : /* v4.7 New GIDL/GISL */ + mod->BSIM4lkgidl = value->rValue; + mod->BSIM4lkgidlGiven = TRUE; + break; + case BSIM4_MOD_LRGIDL : /* v4.7 New GIDL/GISL */ + mod->BSIM4lrgidl = value->rValue; + mod->BSIM4lrgidlGiven = TRUE; + break; case BSIM4_MOD_LAGISL : mod->BSIM4lagisl = value->rValue; mod->BSIM4lagislGiven = TRUE; @@ -1795,6 +1904,18 @@ GENmodel *inMod) mod->BSIM4legisl = value->rValue; mod->BSIM4legislGiven = TRUE; break; + case BSIM4_MOD_LFGISL : /* v4.7 New GIDL/GISL */ + mod->BSIM4lfgisl = value->rValue; + mod->BSIM4lfgislGiven = TRUE; + break; + case BSIM4_MOD_LKGISL : /* v4.7 New GIDL/GISL */ + mod->BSIM4lkgisl = value->rValue; + mod->BSIM4lkgislGiven = TRUE; + break; + case BSIM4_MOD_LRGISL : /* v4.7 New GIDL/GISL */ + mod->BSIM4lrgisl = value->rValue; + mod->BSIM4lrgislGiven = TRUE; + break; case BSIM4_MOD_LAIGC : mod->BSIM4laigc = value->rValue; mod->BSIM4laigcGiven = TRUE; @@ -1927,7 +2048,7 @@ GENmodel *inMod) mod->BSIM4leu = value->rValue; mod->BSIM4leuGiven = TRUE; break; - case BSIM4_MOD_LUCS : + case BSIM4_MOD_LUCS : mod->BSIM4lucs = value->rValue; mod->BSIM4lucsGiven = TRUE; break; @@ -1984,7 +2105,7 @@ GENmodel *inMod) mod->BSIM4lvoffcvGiven = TRUE; break; - /* Width dependence */ + /* Width dependence */ case BSIM4_MOD_WCDSC : mod->BSIM4wcdsc = value->rValue; mod->BSIM4wcdscGiven = TRUE; @@ -2048,8 +2169,8 @@ GENmodel *inMod) case BSIM4_MOD_WNDEP: mod->BSIM4wndep = value->rValue; mod->BSIM4wndepGiven = TRUE; - if (mod->BSIM4wndep > 1.0e20) - mod->BSIM4wndep *= 1.0e-6; + if (mod->BSIM4wndep > 1.0e20) + mod->BSIM4wndep *= 1.0e-6; break; case BSIM4_MOD_WNSD: mod->BSIM4wnsd = value->rValue; @@ -2060,8 +2181,8 @@ GENmodel *inMod) case BSIM4_MOD_WNGATE: mod->BSIM4wngate = value->rValue; mod->BSIM4wngateGiven = TRUE; - if (mod->BSIM4wngate > 1.0e23) - mod->BSIM4wngate *= 1.0e-6; + if (mod->BSIM4wngate > 1.0e23) + mod->BSIM4wngate *= 1.0e-6; break; case BSIM4_MOD_WGAMMA1: mod->BSIM4wgamma1 = value->rValue; @@ -2127,6 +2248,22 @@ GENmodel *inMod) mod->BSIM4wdvtp1 = value->rValue; mod->BSIM4wdvtp1Given = TRUE; break; + case BSIM4_MOD_WDVTP2: /* New DIBL/Rout */ + mod->BSIM4wdvtp2 = value->rValue; + mod->BSIM4wdvtp2Given = TRUE; + break; + case BSIM4_MOD_WDVTP3: + mod->BSIM4wdvtp3 = value->rValue; + mod->BSIM4wdvtp3Given = TRUE; + break; + case BSIM4_MOD_WDVTP4: + mod->BSIM4wdvtp4 = value->rValue; + mod->BSIM4wdvtp4Given = TRUE; + break; + case BSIM4_MOD_WDVTP5: + mod->BSIM4wdvtp5 = value->rValue; + mod->BSIM4wdvtp5Given = TRUE; + break; case BSIM4_MOD_WW0: mod->BSIM4ww0 = value->rValue; mod->BSIM4ww0Given = TRUE; @@ -2199,7 +2336,7 @@ GENmodel *inMod) mod->BSIM4wute = value->rValue; mod->BSIM4wuteGiven = TRUE; break; - case BSIM4_MOD_WUCSTE : + case BSIM4_MOD_WUCSTE : mod->BSIM4wucste = value->rValue; mod->BSIM4wucsteGiven = TRUE; break; @@ -2211,6 +2348,18 @@ GENmodel *inMod) mod->BSIM4wtvoff = value->rValue; mod->BSIM4wtvoffGiven = TRUE; break; + case BSIM4_MOD_WTNFACTOR: /* v4.7 temp dep of leakage current */ + mod->BSIM4wtnfactor = value->rValue; + mod->BSIM4wtnfactorGiven = TRUE; + break; + case BSIM4_MOD_WTETA0: /* v4.7 temp dep of leakage current */ + mod->BSIM4wteta0 = value->rValue; + mod->BSIM4wteta0Given = TRUE; + break; + case BSIM4_MOD_WTVOFFCV: /* v4.7 temp dep of leakage current */ + mod->BSIM4wtvoffcv = value->rValue; + mod->BSIM4wtvoffcvGiven = TRUE; + break; case BSIM4_MOD_WMINV: mod->BSIM4wminv = value->rValue; mod->BSIM4wminvGiven = TRUE; @@ -2347,6 +2496,18 @@ GENmodel *inMod) mod->BSIM4wegidl = value->rValue; mod->BSIM4wegidlGiven = TRUE; break; + case BSIM4_MOD_WFGIDL : /* v4.7 New GIDL/GISL */ + mod->BSIM4wfgidl = value->rValue; + mod->BSIM4wfgidlGiven = TRUE; + break; + case BSIM4_MOD_WKGIDL : /* v4.7 New GIDL/GISL */ + mod->BSIM4wkgidl = value->rValue; + mod->BSIM4wkgidlGiven = TRUE; + break; + case BSIM4_MOD_WRGIDL : /* v4.7 New GIDL/GISL */ + mod->BSIM4wrgidl = value->rValue; + mod->BSIM4wrgidlGiven = TRUE; + break; case BSIM4_MOD_WAGISL : mod->BSIM4wagisl = value->rValue; mod->BSIM4wagislGiven = TRUE; @@ -2363,6 +2524,18 @@ GENmodel *inMod) mod->BSIM4wegisl = value->rValue; mod->BSIM4wegislGiven = TRUE; break; + case BSIM4_MOD_WFGISL : /* v4.7 New GIDL/GISL */ + mod->BSIM4wfgisl = value->rValue; + mod->BSIM4wfgislGiven = TRUE; + break; + case BSIM4_MOD_WKGISL : /* v4.7 New GIDL/GISL */ + mod->BSIM4wkgisl = value->rValue; + mod->BSIM4wkgislGiven = TRUE; + break; + case BSIM4_MOD_WRGISL : /* v4.7 New GIDL/GISL */ + mod->BSIM4wrgisl = value->rValue; + mod->BSIM4wrgislGiven = TRUE; + break; case BSIM4_MOD_WAIGC : mod->BSIM4waigc = value->rValue; mod->BSIM4waigcGiven = TRUE; @@ -2495,7 +2668,7 @@ GENmodel *inMod) mod->BSIM4weu = value->rValue; mod->BSIM4weuGiven = TRUE; break; - case BSIM4_MOD_WUCS : + case BSIM4_MOD_WUCS : mod->BSIM4wucs = value->rValue; mod->BSIM4wucsGiven = TRUE; break; @@ -2552,7 +2725,7 @@ GENmodel *inMod) mod->BSIM4wvoffcvGiven = TRUE; break; - /* Cross-term dependence */ + /* Cross-term dependence */ case BSIM4_MOD_PCDSC : mod->BSIM4pcdsc = value->rValue; mod->BSIM4pcdscGiven = TRUE; @@ -2616,8 +2789,8 @@ GENmodel *inMod) case BSIM4_MOD_PNDEP: mod->BSIM4pndep = value->rValue; mod->BSIM4pndepGiven = TRUE; - if (mod->BSIM4pndep > 1.0e20) - mod->BSIM4pndep *= 1.0e-6; + if (mod->BSIM4pndep > 1.0e20) + mod->BSIM4pndep *= 1.0e-6; break; case BSIM4_MOD_PNSD: mod->BSIM4pnsd = value->rValue; @@ -2628,8 +2801,8 @@ GENmodel *inMod) case BSIM4_MOD_PNGATE: mod->BSIM4pngate = value->rValue; mod->BSIM4pngateGiven = TRUE; - if (mod->BSIM4pngate > 1.0e23) - mod->BSIM4pngate *= 1.0e-6; + if (mod->BSIM4pngate > 1.0e23) + mod->BSIM4pngate *= 1.0e-6; break; case BSIM4_MOD_PGAMMA1: mod->BSIM4pgamma1 = value->rValue; @@ -2695,6 +2868,22 @@ GENmodel *inMod) mod->BSIM4pdvtp1 = value->rValue; mod->BSIM4pdvtp1Given = TRUE; break; + case BSIM4_MOD_PDVTP2: /* New DIBL/Rout */ + mod->BSIM4pdvtp2 = value->rValue; + mod->BSIM4pdvtp2Given = TRUE; + break; + case BSIM4_MOD_PDVTP3: + mod->BSIM4pdvtp3 = value->rValue; + mod->BSIM4pdvtp3Given = TRUE; + break; + case BSIM4_MOD_PDVTP4: + mod->BSIM4pdvtp4 = value->rValue; + mod->BSIM4pdvtp4Given = TRUE; + break; + case BSIM4_MOD_PDVTP5: + mod->BSIM4pdvtp5 = value->rValue; + mod->BSIM4pdvtp5Given = TRUE; + break; case BSIM4_MOD_PW0: mod->BSIM4pw0 = value->rValue; mod->BSIM4pw0Given = TRUE; @@ -2767,7 +2956,7 @@ GENmodel *inMod) mod->BSIM4pute = value->rValue; mod->BSIM4puteGiven = TRUE; break; - case BSIM4_MOD_PUCSTE : + case BSIM4_MOD_PUCSTE : mod->BSIM4pucste = value->rValue; mod->BSIM4pucsteGiven = TRUE; break; @@ -2779,6 +2968,18 @@ GENmodel *inMod) mod->BSIM4ptvoff = value->rValue; mod->BSIM4ptvoffGiven = TRUE; break; + case BSIM4_MOD_PTNFACTOR: /* v4.7 temp dep of leakage current */ + mod->BSIM4ptnfactor = value->rValue; + mod->BSIM4ptnfactorGiven = TRUE; + break; + case BSIM4_MOD_PTETA0: /* v4.7 temp dep of leakage current */ + mod->BSIM4pteta0 = value->rValue; + mod->BSIM4pteta0Given = TRUE; + break; + case BSIM4_MOD_PTVOFFCV: /* v4.7 temp dep of leakage current */ + mod->BSIM4ptvoffcv = value->rValue; + mod->BSIM4ptvoffcvGiven = TRUE; + break; case BSIM4_MOD_PMINV: mod->BSIM4pminv = value->rValue; mod->BSIM4pminvGiven = TRUE; @@ -2915,6 +3116,18 @@ GENmodel *inMod) mod->BSIM4pegidl = value->rValue; mod->BSIM4pegidlGiven = TRUE; break; + case BSIM4_MOD_PFGIDL : /* v4.7 New GIDL/GISL */ + mod->BSIM4pfgidl = value->rValue; + mod->BSIM4pfgidlGiven = TRUE; + break; + case BSIM4_MOD_PKGIDL : /* v4.7 New GIDL/GISL */ + mod->BSIM4pkgidl = value->rValue; + mod->BSIM4pkgidlGiven = TRUE; + break; + case BSIM4_MOD_PRGIDL : /* v4.7 New GIDL/GISL */ + mod->BSIM4prgidl = value->rValue; + mod->BSIM4prgidlGiven = TRUE; + break; case BSIM4_MOD_PAGISL : mod->BSIM4pagisl = value->rValue; mod->BSIM4pagislGiven = TRUE; @@ -2931,6 +3144,18 @@ GENmodel *inMod) mod->BSIM4pegisl = value->rValue; mod->BSIM4pegislGiven = TRUE; break; + case BSIM4_MOD_PFGISL : /* v4.7 New GIDL/GISL */ + mod->BSIM4pfgisl = value->rValue; + mod->BSIM4pfgislGiven = TRUE; + break; + case BSIM4_MOD_PKGISL : /* v4.7 New GIDL/GISL */ + mod->BSIM4pkgisl = value->rValue; + mod->BSIM4pkgislGiven = TRUE; + break; + case BSIM4_MOD_PRGISL : /* v4.7 New GIDL/GISL */ + mod->BSIM4prgisl = value->rValue; + mod->BSIM4prgislGiven = TRUE; + break; case BSIM4_MOD_PAIGC : mod->BSIM4paigc = value->rValue; mod->BSIM4paigcGiven = TRUE; @@ -3063,7 +3288,7 @@ GENmodel *inMod) mod->BSIM4peu = value->rValue; mod->BSIM4peuGiven = TRUE; break; - case BSIM4_MOD_PUCS : + case BSIM4_MOD_PUCS : mod->BSIM4pucs = value->rValue; mod->BSIM4pucsGiven = TRUE; break; diff --git a/src/spicelib/devices/bsim4/b4noi.c b/src/spicelib/devices/bsim4/b4noi.c index 297b3fc81..27b49b9e6 100644 --- a/src/spicelib/devices/bsim4/b4noi.c +++ b/src/spicelib/devices/bsim4/b4noi.c @@ -1,13 +1,13 @@ -/**** BSIM4.6.2 Released by Wenwei Yang 07/31/2008 ****/ -/**** BSIM4.6.4 Update ngspice 08/22/2009 ****/ +/**** BSIM4.7.0 Released by Darsen Lu 04/08/2011 ****/ + /********** * Copyright 2006 Regents of the University of California. All rights reserved. - * File: b4noi.c of BSIM4.6.2. + * File: b4noi.c of BSIM4.7.0. * Author: 2000 Weidong Liu * Authors: 2001- Xuemei Xi, Mohan Dunga, Ali Niknejad, Chenming Hu. * Authors: 2006- Mohan Dunga, Ali Niknejad, Chenming Hu * Authors: 2007- Mohan Dunga, Wenwei Yang, Ali Niknejad, Chenming Hu - * Authors: 2008- Wenwei Yang, Ali Niknejad, Chenming Hu + * Authors: 2008- Wenwei Yang, Ali Niknejad, Chenming Hu * Project Director: Prof. Chenming Hu. * Modified by Xuemei Xi, 04/06/2001. * Modified by Xuemei Xi, 10/05/2001. @@ -15,7 +15,8 @@ * Modified by Xuemei Xi, 03/04/2004. * Modified by Xuemei Xi, 07/29/2005. * Modified by Mohan Dunga, 12/13/2006 - * Modified by Wenwei Yang, 07/31/2008. + * Modified by Wenwei Yang, 07/31/2008. + * Modified by Tanvir Morshed, Darsen Lu 03/27/2011 **********/ #include "ngspice.h" @@ -27,18 +28,26 @@ #include "const.h" +extern void NevalSrc(); +extern void NevalSrc2(); /* for tnoiMod=2 (v4.7) */ +extern double Nintegrate(); + /* * WDL: 1/f noise model has been smoothed out and enhanced with * bulk charge effect as well as physical N* equ. and necessary * conversion into the SI unit system. */ -static double -Eval1ovFNoise(double Vds, BSIM4model *model, BSIM4instance *here, double freq, double temp) +double +Eval1ovFNoise( +double Vds, +BSIM4model *model, +BSIM4instance *here, +double freq, double temp) { struct bsim4SizeDependParam *pParam; double cd, esat, DelClm, EffFreq, N0, Nl, Leff, Leffsq; -double T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, Ssi; +double T0=0.0, T1, T2, T3, T4, T5, T6, T7, T8, T9, Ssi; pParam = here->pParam; cd = fabs(here->BSIM4cd); @@ -47,10 +56,10 @@ double T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, Ssi; esat = 2.0 * here->BSIM4vsattemp / here->BSIM4ueff; if(model->BSIM4em<=0.0) DelClm = 0.0; /* flicker noise modified -JX */ else { - 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 */ + 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; @@ -75,9 +84,8 @@ double T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, Ssi; int -BSIM4noise( -int mode, -int operation, +BSIM4noise ( +int mode, int operation, GENmodel *inModel, CKTcircuit *ckt, Ndata *data, @@ -92,121 +100,135 @@ double tempInoise; double noizDens[BSIM4NSRCS]; double lnNdens[BSIM4NSRCS]; -double T0, T1, T2, T5, T10, T11; +double T0, T1, T2, T3, T4, T5, T6, T7, T8, T10, T11; double Vds, Ssi, Swi; double tmp=0.0, gdpr, gspr, npart_theta=0.0, npart_beta=0.0, igsquare, bodymode; -double m; +/* tnoiMod=2 (v4.7) */ +double eta, Leff, Lvsat, gamma, delta, epsilon, GammaGd0=0.0; +double npart_c, sigrat=0.0, C0, omega, ctnoi=0.0; int i; +double m; + /* define the names of the noise sources */ static char *BSIM4nNames[BSIM4NSRCS] = { /* Note that we have to keep the order */ - ".rd", /* noise due to rd */ - ".rs", /* noise due to rs */ + ".rd", /* noise due to rd */ + ".rs", /* noise due to rs */ ".rg", /* noise due to rgeltd */ ".rbps", /* noise due to rbps */ ".rbpd", /* noise due to rbpd */ ".rbpb", /* noise due to rbpb */ ".rbsb", /* noise due to rbsb */ ".rbdb", /* noise due to rbdb */ - ".id", /* noise due to id */ - ".1overf", /* flicker (1/f) noise */ + ".id", /* noise due to id (for tnoiMod2: uncorrelated portion only) */ + ".1overf", /* flicker (1/f) noise */ ".igs", /* shot noise due to IGS */ ".igd", /* shot noise due to IGD */ ".igb", /* shot noise due to IGB */ - "" /* total transistor noise */ + ".corl", /* contribution of correlated drain and induced gate noise */ + "" /* total transistor noise */ }; for (; model != NULL; model = model->BSIM4nextModel) { for (here = model->BSIM4instances; here != NULL; - here = here->BSIM4nextInstance) - { pParam = here->pParam; - switch (operation) - { case N_OPEN: - /* see if we have to to produce a summary report */ - /* if so, name all the noise generators */ + here = here->BSIM4nextInstance) + { pParam = here->pParam; + switch (operation) + { case N_OPEN: + /* see if we have to to produce a summary report */ + /* if so, name all the noise generators */ - if (((NOISEAN*)ckt->CKTcurJob)->NStpsSm != 0) - { switch (mode) - { case N_DENS: - for (i = 0; i < BSIM4NSRCS; i++) - { (void) sprintf(name, "onoise.%s%s", - here->BSIM4name, - BSIM4nNames[i]); - data->namelist = TREALLOC(IFuid, data->namelist, data->numPlots + 1); + if (((NOISEAN*)ckt->CKTcurJob)->NStpsSm != 0) + { switch (mode) + { case N_DENS: + for (i = 0; i < BSIM4NSRCS; i++) + { (void) sprintf(name, "onoise.%s%s", + here->BSIM4name, + BSIM4nNames[i]); + data->namelist = (IFuid *) trealloc( + (char *) data->namelist, + (data->numPlots + 1) + * sizeof(IFuid)); if (!data->namelist) - return(E_NOMEM); - SPfrontEnd->IFnewUid (ckt, - &(data->namelist[data->numPlots++]), - NULL, name, UID_OTHER, - NULL); - /* we've added one more plot */ - } - break; - case INT_NOIZ: - for (i = 0; i < BSIM4NSRCS; i++) - { (void) sprintf(name, "onoise_total.%s%s", - here->BSIM4name, - BSIM4nNames[i]); - data->namelist = TREALLOC(IFuid, data->namelist, data->numPlots + 1); + return(E_NOMEM); + (*(SPfrontEnd->IFnewUid)) (ckt, + &(data->namelist[data->numPlots++]), + (IFuid) NULL, name, UID_OTHER, + NULL); + /* we've added one more plot */ + } + break; + case INT_NOIZ: + for (i = 0; i < BSIM4NSRCS; i++) + { (void) sprintf(name, "onoise_total.%s%s", + here->BSIM4name, + BSIM4nNames[i]); + data->namelist = (IFuid *) trealloc( + (char *) data->namelist, + (data->numPlots + 1) + * sizeof(IFuid)); if (!data->namelist) - return(E_NOMEM); - SPfrontEnd->IFnewUid (ckt, - &(data->namelist[data->numPlots++]), - NULL, name, UID_OTHER, - NULL); - /* we've added one more plot */ + return(E_NOMEM); + (*(SPfrontEnd->IFnewUid)) (ckt, + &(data->namelist[data->numPlots++]), + (IFuid) NULL, name, UID_OTHER, + NULL); + /* we've added one more plot */ - (void) sprintf(name, "inoise_total.%s%s", - here->BSIM4name, - BSIM4nNames[i]); - data->namelist = TREALLOC(IFuid, data->namelist, data->numPlots + 1); + (void) sprintf(name, "inoise_total.%s%s", + here->BSIM4name, + BSIM4nNames[i]); + data->namelist = (IFuid *) trealloc( + (char *) data->namelist, + (data->numPlots + 1) + * sizeof(IFuid)); if (!data->namelist) - return(E_NOMEM); - SPfrontEnd->IFnewUid (ckt, - &(data->namelist[data->numPlots++]), - NULL, name, UID_OTHER, - NULL); - /* we've added one more plot */ - } - break; - } - } - break; - case N_CALC: - m = here->BSIM4m; - switch (mode) - { case N_DENS: - if (model->BSIM4tnoiMod == 0) - { if (model->BSIM4rdsMod == 0) - { gspr = here->BSIM4sourceConductance; + return(E_NOMEM); + (*(SPfrontEnd->IFnewUid)) (ckt, + &(data->namelist[data->numPlots++]), + (IFuid) NULL, name, UID_OTHER, + NULL); + /* we've added one more plot */ + } + break; + } + } + break; + case N_CALC: + m = here->BSIM4m; + switch (mode) + { case N_DENS: + if (model->BSIM4tnoiMod == 0) + { if (model->BSIM4rdsMod == 0) + { gspr = here->BSIM4sourceConductance; gdpr = here->BSIM4drainConductance; - if (here->BSIM4grdsw > 0.0) - tmp = 1.0 / here->BSIM4grdsw; /* tmp used below */ - else - tmp = 0.0; - } - else - { gspr = here->BSIM4gstot; + if (here->BSIM4grdsw > 0.0) + tmp = 1.0 / here->BSIM4grdsw; /* tmp used below */ + else + tmp = 0.0; + } + else + { gspr = here->BSIM4gstot; gdpr = here->BSIM4gdtot; tmp = 0.0; - } - } - else - { T5 = here->BSIM4Vgsteff / here->BSIM4EsatL; - T5 *= T5; - npart_beta = model->BSIM4rnoia * (1.0 + T5 - * model->BSIM4tnoia * pParam->BSIM4leff); - npart_theta = model->BSIM4rnoib * (1.0 + T5 + } + } + else if(model->BSIM4tnoiMod == 1) + { T5 = here->BSIM4Vgsteff / here->BSIM4EsatL; + T5 *= T5; + npart_beta = model->BSIM4rnoia * (1.0 + T5 + * model->BSIM4tnoia * pParam->BSIM4leff); + npart_theta = model->BSIM4rnoib * (1.0 + T5 * model->BSIM4tnoib * pParam->BSIM4leff); - if(npart_theta > 0.9) - npart_theta = 0.9; - if(npart_theta > 0.9 * npart_beta) - npart_theta = 0.9 * npart_beta; //4.6.2 + if(npart_theta > 0.9) + npart_theta = 0.9; + if(npart_theta > 0.9 * npart_beta) + npart_theta = 0.9 * npart_beta; //4.6.2 - if (model->BSIM4rdsMod == 0) + if (model->BSIM4rdsMod == 0) { gspr = here->BSIM4sourceConductance; gdpr = here->BSIM4drainConductance; } @@ -215,128 +237,141 @@ int i; gdpr = here->BSIM4gdtot; } - if ((*(ckt->CKTstates[0] + here->BSIM4vds)) >= 0.0) - gspr = gspr * (1.0 + npart_theta * npart_theta * gspr - / here->BSIM4IdovVds); /* bugfix */ - else - gdpr = gdpr * (1.0 + npart_theta * npart_theta * gdpr + if ((*(ckt->CKTstates[0] + here->BSIM4vds)) >= 0.0) + gspr = gspr * (1.0 + npart_theta * npart_theta * gspr / here->BSIM4IdovVds); - } + else + gdpr = gdpr * (1.0 + npart_theta * npart_theta * gdpr + / here->BSIM4IdovVds); + } + else + { /* tnoiMod=2 (v4.7) */ - NevalSrc(&noizDens[BSIM4RDNOIZ], - &lnNdens[BSIM4RDNOIZ], ckt, THERMNOISE, - here->BSIM4dNodePrime, here->BSIM4dNode, - gdpr * m); + if (model->BSIM4rdsMod == 0) + { gspr = here->BSIM4sourceConductance; + gdpr = here->BSIM4drainConductance; + } + else + { gspr = here->BSIM4gstot; + gdpr = here->BSIM4gdtot; + } - NevalSrc(&noizDens[BSIM4RSNOIZ], - &lnNdens[BSIM4RSNOIZ], ckt, THERMNOISE, - here->BSIM4sNodePrime, here->BSIM4sNode, - gspr * m); + } + + NevalSrc(&noizDens[BSIM4RDNOIZ], + &lnNdens[BSIM4RDNOIZ], ckt, THERMNOISE, + here->BSIM4dNodePrime, here->BSIM4dNode, + gdpr * m); + + NevalSrc(&noizDens[BSIM4RSNOIZ], + &lnNdens[BSIM4RSNOIZ], ckt, THERMNOISE, + here->BSIM4sNodePrime, here->BSIM4sNode, + gspr * m); - if (here->BSIM4rgateMod == 1) - { NevalSrc(&noizDens[BSIM4RGNOIZ], + if (here->BSIM4rgateMod == 1) + { NevalSrc(&noizDens[BSIM4RGNOIZ], &lnNdens[BSIM4RGNOIZ], ckt, THERMNOISE, here->BSIM4gNodePrime, here->BSIM4gNodeExt, here->BSIM4grgeltd * m); - } - else if (here->BSIM4rgateMod == 2) - { - T0 = 1.0 + here->BSIM4grgeltd/here->BSIM4gcrg; - T1 = T0 * T0; - NevalSrc(&noizDens[BSIM4RGNOIZ], + } + else if (here->BSIM4rgateMod == 2) + { + T0 = 1.0 + here->BSIM4grgeltd/here->BSIM4gcrg; + T1 = T0 * T0; + NevalSrc(&noizDens[BSIM4RGNOIZ], &lnNdens[BSIM4RGNOIZ], ckt, THERMNOISE, here->BSIM4gNodePrime, here->BSIM4gNodeExt, here->BSIM4grgeltd * m / T1); - } - else if (here->BSIM4rgateMod == 3) - { NevalSrc(&noizDens[BSIM4RGNOIZ], + } + else if (here->BSIM4rgateMod == 3) + { NevalSrc(&noizDens[BSIM4RGNOIZ], &lnNdens[BSIM4RGNOIZ], ckt, THERMNOISE, here->BSIM4gNodeMid, here->BSIM4gNodeExt, here->BSIM4grgeltd * m); - } - else - { noizDens[BSIM4RGNOIZ] = 0.0; - lnNdens[BSIM4RGNOIZ] = - 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) - { - 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; + { noizDens[BSIM4RGNOIZ] = 0.0; + lnNdens[BSIM4RGNOIZ] = + 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) + { + 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; noizDens[BSIM4RBPBNOIZ] = 0.0; noizDens[BSIM4RBSBNOIZ] = noizDens[BSIM4RBDBNOIZ] = 0.0; lnNdens[BSIM4RBPSNOIZ] = @@ -351,51 +386,124 @@ int i; log(MAX(noizDens[BSIM4RBDBNOIZ], N_MINLOG)); } + if(model->BSIM4tnoiMod == 2) + { + eta = 1.0 - here->BSIM4Vdseff * here->BSIM4AbovVgst2Vtm; + T0 = 1.0 - eta; + T1 = 1.0 + eta; + T2 = T1 + 2.0 * here->BSIM4Abulk * model->BSIM4vtm / here->BSIM4Vgsteff; + Leff = pParam->BSIM4leff; + Lvsat = Leff * (1.0 + here->BSIM4Vdseff / here->BSIM4EsatL); + T6 = Leff / Lvsat; + T5 = here->BSIM4Vgsteff / here->BSIM4EsatL; + T5 = T5 * T5; + gamma = T6 * (0.5 * T1 + T0 * T0 / (6.0 * T2)); + T3 = T2 * T2; + T4 = T0 * T0; + T5 = T3 * T3; + delta = (T1 / T3 - (5.0 * T1 + T2) * T4 / (15.0 * T5) + T4 * T4 / (9.0 * T5 * T2)) / (6.0 * T6 * T6 * T6); + T7 = T0 / T2; + epsilon = (T7 - T7 * T7 * T7 / 3.0) / (6.0 * T6); + + T8 = here->BSIM4Vgsteff / here->BSIM4EsatL; + T8 *= T8; + npart_c = model->BSIM4rnoic * (1.0 + T8 + * model->BSIM4tnoic * Leff); + ctnoi = epsilon / sqrt(gamma * delta) + * (2.5316 * npart_c); + + npart_beta = model->BSIM4rnoia * (1.0 + T8 + * model->BSIM4tnoia * Leff); + npart_theta = model->BSIM4rnoib * (1.0 + T8 + * model->BSIM4tnoib * Leff); + gamma = gamma * (3.0 * npart_beta * npart_beta); + delta = delta * (3.75 * npart_theta * npart_theta); + + GammaGd0 = gamma * here->BSIM4noiGd0; + C0 = here->BSIM4Coxeff * pParam->BSIM4weffCV * here->BSIM4nf * pParam->BSIM4leffCV; + T0 = C0 / here->BSIM4noiGd0; + sigrat = T0 * sqrt(delta / gamma); + } switch(model->BSIM4tnoiMod) - { case 0: - T0 = m * here->BSIM4ueff * fabs(here->BSIM4qinv); - T1 = T0 * tmp + pParam->BSIM4leff + { case 0: + T0 = m * here->BSIM4ueff * fabs(here->BSIM4qinv); + T1 = T0 * tmp + pParam->BSIM4leff * pParam->BSIM4leff; - NevalSrc(&noizDens[BSIM4IDNOIZ], - &lnNdens[BSIM4IDNOIZ], ckt, - THERMNOISE, here->BSIM4dNodePrime, + NevalSrc(&noizDens[BSIM4IDNOIZ], + &lnNdens[BSIM4IDNOIZ], ckt, + THERMNOISE, here->BSIM4dNodePrime, here->BSIM4sNodePrime, - (T0 / T1) * model->BSIM4ntnoi); - break; - case 1: - T0 = m * here->BSIM4gm + here->BSIM4gmbs + here->BSIM4gds; - T0 *= T0; - igsquare = npart_theta * npart_theta * T0 / here->BSIM4IdovVds; - T1 = npart_beta * (here->BSIM4gm - + here->BSIM4gmbs) + here->BSIM4gds; - T2 = T1 * T1 / here->BSIM4IdovVds; + (T0 / T1) * model->BSIM4ntnoi); + break; + case 1: + T0 = m * (here->BSIM4gm + here->BSIM4gmbs + here->BSIM4gds); + T0 *= T0; + igsquare = npart_theta * npart_theta * T0 / here->BSIM4IdovVds; + T1 = npart_beta * (here->BSIM4gm + + here->BSIM4gmbs) + here->BSIM4gds; + T2 = T1 * T1 / here->BSIM4IdovVds; NevalSrc(&noizDens[BSIM4IDNOIZ], &lnNdens[BSIM4IDNOIZ], ckt, THERMNOISE, here->BSIM4dNodePrime, here->BSIM4sNodePrime, (T2 - igsquare)); break; - } + case 2: + T2 = GammaGd0; + T3 = ctnoi * ctnoi; + T4 = 1.0 - T3; + NevalSrc(&noizDens[BSIM4IDNOIZ], + &lnNdens[BSIM4IDNOIZ], ckt, + THERMNOISE, here->BSIM4dNodePrime, + here->BSIM4sNodePrime, T2 * T4); - NevalSrc(&noizDens[BSIM4FLNOIZ], NULL, - ckt, N_GAIN, here->BSIM4dNodePrime, - here->BSIM4sNodePrime, (double) 0.0); + /* Evaluate output noise due to two correlated noise sources */ + omega = 2.0 * M_PI * data->freq; + T5 = omega * sigrat; + T6 = T5 * T5; + T7 = T6 / (1.0 + T6); + + if (here->BSIM4mode >= 0) { + NevalSrc2(&noizDens[BSIM4CORLNOIZ], + &lnNdens[BSIM4CORLNOIZ], ckt, + THERMNOISE, here->BSIM4dNodePrime, + here->BSIM4sNodePrime, T2 * T3, + here->BSIM4gNodePrime, + here->BSIM4sNodePrime, + T2 * T7, 0.5 * M_PI); + } + else + { + NevalSrc2(&noizDens[BSIM4CORLNOIZ], + &lnNdens[BSIM4CORLNOIZ], ckt, + THERMNOISE, here->BSIM4sNodePrime, + here->BSIM4dNodePrime, T2 * T3, + here->BSIM4gNodePrime, + here->BSIM4dNodePrime, + T2 * T7, 0.5 * M_PI); + } + break; + } + + NevalSrc(&noizDens[BSIM4FLNOIZ], (double*) NULL, + ckt, N_GAIN, here->BSIM4dNodePrime, + here->BSIM4sNodePrime, (double) 0.0); switch(model->BSIM4fnoiMod) - { case 0: - noizDens[BSIM4FLNOIZ] *= m * model->BSIM4kf - * exp(model->BSIM4af - * log(MAX(fabs(here->BSIM4cd), - N_MINLOG))) - / (pow(data->freq, model->BSIM4ef) - * pParam->BSIM4leff - * pParam->BSIM4leff - * model->BSIM4coxe); - break; - case 1: - Vds = *(ckt->CKTstates[0] + here->BSIM4vds); - if (Vds < 0.0) - Vds = -Vds; + { case 0: + noizDens[BSIM4FLNOIZ] *= m * model->BSIM4kf + * exp(model->BSIM4af + * log(MAX(fabs(here->BSIM4cd), + N_MINLOG))) + / (pow(data->freq, model->BSIM4ef) + * pParam->BSIM4leff + * pParam->BSIM4leff + * model->BSIM4coxe); + break; + case 1: + Vds = *(ckt->CKTstates[0] + here->BSIM4vds); + if (Vds < 0.0) + Vds = -Vds; Ssi = Eval1ovFNoise(Vds, model, here, data->freq, ckt->CKTtemp); @@ -403,7 +511,7 @@ int i; * CONSTboltz * ckt->CKTtemp; T11 = pParam->BSIM4weff * here->BSIM4nf * pParam->BSIM4leff * pow(data->freq, model->BSIM4ef) * 1.0e10 - * here->BSIM4nstar * here->BSIM4nstar; + * here->BSIM4nstar * here->BSIM4nstar; Swi = T10 / T11 * here->BSIM4cd * here->BSIM4cd; T1 = Swi + Ssi; @@ -411,14 +519,14 @@ int i; noizDens[BSIM4FLNOIZ] *= m * (Ssi * Swi) / T1; else noizDens[BSIM4FLNOIZ] *= 0.0; - break; - } + break; + } - lnNdens[BSIM4FLNOIZ] = - log(MAX(noizDens[BSIM4FLNOIZ], N_MINLOG)); + lnNdens[BSIM4FLNOIZ] = + log(MAX(noizDens[BSIM4FLNOIZ], N_MINLOG)); - if(here->BSIM4mode >= 0) { /* bugfix */ + if(here->BSIM4mode >= 0) { /* bugfix */ NevalSrc(&noizDens[BSIM4IGSNOIZ], &lnNdens[BSIM4IGSNOIZ], ckt, SHOTNOISE, here->BSIM4gNodePrime, here->BSIM4sNodePrime, @@ -427,7 +535,7 @@ int i; &lnNdens[BSIM4IGDNOIZ], ckt, SHOTNOISE, here->BSIM4gNodePrime, here->BSIM4dNodePrime, m * (here->BSIM4Igd + here->BSIM4Igcd)); - } else { + } else { NevalSrc(&noizDens[BSIM4IGSNOIZ], &lnNdens[BSIM4IGSNOIZ], ckt, SHOTNOISE, here->BSIM4gNodePrime, here->BSIM4sNodePrime, @@ -443,101 +551,101 @@ int i; m * here->BSIM4Igb); - noizDens[BSIM4TOTNOIZ] = noizDens[BSIM4RDNOIZ] - + noizDens[BSIM4RSNOIZ] + noizDens[BSIM4RGNOIZ] - + noizDens[BSIM4RBPSNOIZ] + noizDens[BSIM4RBPDNOIZ] - + noizDens[BSIM4RBPBNOIZ] - + noizDens[BSIM4RBSBNOIZ] + noizDens[BSIM4RBDBNOIZ] - + noizDens[BSIM4IDNOIZ] + noizDens[BSIM4FLNOIZ] + noizDens[BSIM4TOTNOIZ] = noizDens[BSIM4RDNOIZ] + + noizDens[BSIM4RSNOIZ] + noizDens[BSIM4RGNOIZ] + + noizDens[BSIM4RBPSNOIZ] + noizDens[BSIM4RBPDNOIZ] + + noizDens[BSIM4RBPBNOIZ] + + noizDens[BSIM4RBSBNOIZ] + noizDens[BSIM4RBDBNOIZ] + + noizDens[BSIM4IDNOIZ] + noizDens[BSIM4FLNOIZ] + noizDens[BSIM4IGSNOIZ] + noizDens[BSIM4IGDNOIZ] - + noizDens[BSIM4IGBNOIZ]; - lnNdens[BSIM4TOTNOIZ] = - log(MAX(noizDens[BSIM4TOTNOIZ], N_MINLOG)); + + noizDens[BSIM4IGBNOIZ] + noizDens[BSIM4CORLNOIZ]; + lnNdens[BSIM4TOTNOIZ] = + log(MAX(noizDens[BSIM4TOTNOIZ], N_MINLOG)); - *OnDens += noizDens[BSIM4TOTNOIZ]; + *OnDens += noizDens[BSIM4TOTNOIZ]; - if (data->delFreq == 0.0) - { /* if we haven't done any previous - integration, we need to initialize our - "history" variables. - */ + if (data->delFreq == 0.0) + { /* if we haven't done any previous + integration, we need to initialize our + "history" variables. + */ - for (i = 0; i < BSIM4NSRCS; i++) - { here->BSIM4nVar[LNLSTDENS][i] = - lnNdens[i]; - } + for (i = 0; i < BSIM4NSRCS; i++) + { here->BSIM4nVar[LNLSTDENS][i] = + lnNdens[i]; + } - /* clear out our integration variables - if it's the first pass - */ - if (data->freq == - ((NOISEAN*) ckt->CKTcurJob)->NstartFreq) - { for (i = 0; i < BSIM4NSRCS; i++) - { here->BSIM4nVar[OUTNOIZ][i] = 0.0; - here->BSIM4nVar[INNOIZ][i] = 0.0; - } - } - } - else - { /* data->delFreq != 0.0, - we have to integrate. - */ - for (i = 0; i < BSIM4NSRCS; i++) - { if (i != BSIM4TOTNOIZ) - { tempOnoise = Nintegrate(noizDens[i], - lnNdens[i], - here->BSIM4nVar[LNLSTDENS][i], - data); - tempInoise = Nintegrate(noizDens[i] - * data->GainSqInv, lnNdens[i] - + data->lnGainInv, - here->BSIM4nVar[LNLSTDENS][i] - + data->lnGainInv, data); - here->BSIM4nVar[LNLSTDENS][i] = - lnNdens[i]; - data->outNoiz += tempOnoise; - data->inNoise += tempInoise; - if (((NOISEAN*) - ckt->CKTcurJob)->NStpsSm != 0) - { here->BSIM4nVar[OUTNOIZ][i] - += tempOnoise; - here->BSIM4nVar[OUTNOIZ][BSIM4TOTNOIZ] - += tempOnoise; - here->BSIM4nVar[INNOIZ][i] - += tempInoise; - here->BSIM4nVar[INNOIZ][BSIM4TOTNOIZ] - += tempInoise; + /* clear out our integration variables + if it's the first pass + */ + if (data->freq == + ((NOISEAN*) ckt->CKTcurJob)->NstartFreq) + { for (i = 0; i < BSIM4NSRCS; i++) + { here->BSIM4nVar[OUTNOIZ][i] = 0.0; + here->BSIM4nVar[INNOIZ][i] = 0.0; + } + } + } + else + { /* data->delFreq != 0.0, + we have to integrate. + */ + for (i = 0; i < BSIM4NSRCS; i++) + { if (i != BSIM4TOTNOIZ) + { tempOnoise = Nintegrate(noizDens[i], + lnNdens[i], + here->BSIM4nVar[LNLSTDENS][i], + data); + tempInoise = Nintegrate(noizDens[i] + * data->GainSqInv, lnNdens[i] + + data->lnGainInv, + here->BSIM4nVar[LNLSTDENS][i] + + data->lnGainInv, data); + here->BSIM4nVar[LNLSTDENS][i] = + lnNdens[i]; + data->outNoiz += tempOnoise; + data->inNoise += tempInoise; + if (((NOISEAN*) + ckt->CKTcurJob)->NStpsSm != 0) + { here->BSIM4nVar[OUTNOIZ][i] + += tempOnoise; + here->BSIM4nVar[OUTNOIZ][BSIM4TOTNOIZ] + += tempOnoise; + here->BSIM4nVar[INNOIZ][i] + += tempInoise; + here->BSIM4nVar[INNOIZ][BSIM4TOTNOIZ] + += tempInoise; } - } - } - } - if (data->prtSummary) - { for (i = 0; i < BSIM4NSRCS; i++) - { /* print a summary report */ - data->outpVector[data->outNumber++] - = noizDens[i]; - } - } - break; - case INT_NOIZ: - /* already calculated, just output */ - if (((NOISEAN*)ckt->CKTcurJob)->NStpsSm != 0) - { for (i = 0; i < BSIM4NSRCS; i++) - { data->outpVector[data->outNumber++] - = here->BSIM4nVar[OUTNOIZ][i]; - data->outpVector[data->outNumber++] - = here->BSIM4nVar[INNOIZ][i]; - } - } - break; - } - break; - case N_CLOSE: - /* do nothing, the main calling routine will close */ - return (OK); - break; /* the plots */ - } /* switch (operation) */ - } /* for here */ + } + } + } + if (data->prtSummary) + { for (i = 0; i < BSIM4NSRCS; i++) + { /* print a summary report */ + data->outpVector[data->outNumber++] + = noizDens[i]; + } + } + break; + case INT_NOIZ: + /* already calculated, just output */ + if (((NOISEAN*)ckt->CKTcurJob)->NStpsSm != 0) + { for (i = 0; i < BSIM4NSRCS; i++) + { data->outpVector[data->outNumber++] + = here->BSIM4nVar[OUTNOIZ][i]; + data->outpVector[data->outNumber++] + = here->BSIM4nVar[INNOIZ][i]; + } + } + break; + } + break; + case N_CLOSE: + /* do nothing, the main calling routine will close */ + return (OK); + break; /* the plots */ + } /* switch (operation) */ + } /* for here */ } /* for model */ return(OK); diff --git a/src/spicelib/devices/bsim4/b4par.c b/src/spicelib/devices/bsim4/b4par.c index 2cb309ede..24cf9e0e7 100644 --- a/src/spicelib/devices/bsim4/b4par.c +++ b/src/spicelib/devices/bsim4/b4par.c @@ -1,8 +1,8 @@ -/**** BSIM4.6.2 Released by Wenwei Yang 07/31/2008 ****/ +/**** BSIM4.7.0 Released by Darsen Lu 04/08/2011 ****/ /********** * Copyright 2006 Regents of the University of California. All rights reserved. - * File: b4par.c of BSIM4.6.2. + * File: b4par.c of BSIM4.7.0. * Author: 2000 Weidong Liu * Authors: 2001- Xuemei Xi, Mohan Dunga, Ali Niknejad, Chenming Hu. * Authors: 2006- Mohan Dunga, Ali Niknejad, Chenming Hu @@ -19,7 +19,6 @@ #include "bsim4def.h" #include "sperror.h" #include "suffix.h" -#include "fteext.h" int BSIM4param( @@ -28,22 +27,17 @@ IFvalue *value, GENinstance *inst, IFvalue *select) { - double scale; - BSIM4instance *here = (BSIM4instance*)inst; NG_IGNORE(select); - if (!cp_getvar("scale", CP_REAL, &scale)) - scale = 1; - switch(param) { case BSIM4_W: - here->BSIM4w = value->rValue*scale; + here->BSIM4w = value->rValue; here->BSIM4wGiven = TRUE; break; case BSIM4_L: - here->BSIM4l = value->rValue*scale; + here->BSIM4l = value->rValue; here->BSIM4lGiven = TRUE; break; case BSIM4_M: @@ -59,19 +53,19 @@ IFvalue *select) here->BSIM4minGiven = TRUE; break; case BSIM4_AS: - here->BSIM4sourceArea = value->rValue*scale*scale; + here->BSIM4sourceArea = value->rValue; here->BSIM4sourceAreaGiven = TRUE; break; case BSIM4_AD: - here->BSIM4drainArea = value->rValue*scale*scale; + here->BSIM4drainArea = value->rValue; here->BSIM4drainAreaGiven = TRUE; break; case BSIM4_PS: - here->BSIM4sourcePerimeter = value->rValue*scale; + here->BSIM4sourcePerimeter = value->rValue; here->BSIM4sourcePerimeterGiven = TRUE; break; case BSIM4_PD: - here->BSIM4drainPerimeter = value->rValue*scale; + here->BSIM4drainPerimeter = value->rValue; here->BSIM4drainPerimeterGiven = TRUE; break; case BSIM4_NRS: diff --git a/src/spicelib/devices/bsim4/b4pzld.c b/src/spicelib/devices/bsim4/b4pzld.c index 64eae5ee6..bd70969eb 100644 --- a/src/spicelib/devices/bsim4/b4pzld.c +++ b/src/spicelib/devices/bsim4/b4pzld.c @@ -1,8 +1,8 @@ -/**** BSIM4.6.2 Released by Wenwei Yang 07/31/2008 ****/ +/**** BSIM4.7.0 Released by Darsen Lu 04/08/2011 ****/ /********** * Copyright 2006 Regents of the University of California. All rights reserved. - * File: b4pzld.c of BSIM4.6.2. + * File: b4pzld.c of BSIM4.7.0. * Author: 2000 Weidong Liu * Authors: 2001- Xuemei Xi, Mohan Dunga, Ali Niknejad, Chenming Hu. * Authors: 2006- Mohan Dunga, Ali Niknejad, Chenming Hu @@ -52,9 +52,9 @@ double ggidld, ggidlg, ggidlb, ggislg, ggislb, ggisls; double m; - for (; model != NULL; model = model->BSIM4nextModel) + for (; model != NULL; model = model->BSIM4nextModel) { for (here = model->BSIM4instances; here!= NULL; - here = here->BSIM4nextInstance) + here = here->BSIM4nextInstance) { if (here->BSIM4owner != ARCHme) continue; pParam = here->pParam; capbd = here->BSIM4capbd; @@ -63,7 +63,7 @@ double m; cgdo = here->BSIM4cgdo; cgbo = pParam->BSIM4cgbo; - if (here->BSIM4mode >= 0) + if (here->BSIM4mode >= 0) { Gm = here->BSIM4gm; Gmbs = here->BSIM4gmbs; FwdSum = Gm + Gmbs; @@ -196,12 +196,12 @@ double m; xcbbb = -(xcbdb + xcbgb + xcbsb + xcbgmb); xgtg = xgtd = xgts = xgtb = 0.0; - sxpart = 0.6; + sxpart = 0.6; dxpart = 0.4; - ddxpart_dVd = ddxpart_dVg = ddxpart_dVb - = ddxpart_dVs = 0.0; - dsxpart_dVd = dsxpart_dVg = dsxpart_dVb - = dsxpart_dVs = 0.0; + ddxpart_dVd = ddxpart_dVg = ddxpart_dVb + = ddxpart_dVs = 0.0; + dsxpart_dVd = dsxpart_dVg = dsxpart_dVb + = dsxpart_dVs = 0.0; } else { xcggb = xcgdb = xcgsb = xcgbb = 0.0; @@ -209,7 +209,7 @@ double m; xcdgb = xcddb = xcdsb = xcdbb = 0.0; xcsgb = xcsdb = xcssb = xcsbb = 0.0; - xgtg = here->BSIM4gtg; + xgtg = here->BSIM4gtg; xgtd = here->BSIM4gtd; xgts = here->BSIM4gts; xgtb = here->BSIM4gtb; @@ -219,46 +219,46 @@ double m; xcqsb = here->BSIM4cqsb; xcqbb = here->BSIM4cqbb; - CoxWL = model->BSIM4coxe * here->pParam->BSIM4weffCV + CoxWL = model->BSIM4coxe * here->pParam->BSIM4weffCV * here->BSIM4nf * here->pParam->BSIM4leffCV; - qcheq = -(here->BSIM4qgate + here->BSIM4qbulk); - if (fabs(qcheq) <= 1.0e-5 * CoxWL) - { if (model->BSIM4xpart < 0.5) - { dxpart = 0.4; - } - else if (model->BSIM4xpart > 0.5) - { dxpart = 0.0; - } - else - { dxpart = 0.5; - } - ddxpart_dVd = ddxpart_dVg = ddxpart_dVb - = ddxpart_dVs = 0.0; - } - else - { dxpart = here->BSIM4qdrn / qcheq; - Cdd = here->BSIM4cddb; - Csd = -(here->BSIM4cgdb + here->BSIM4cddb - + here->BSIM4cbdb); - ddxpart_dVd = (Cdd - dxpart * (Cdd + Csd)) / qcheq; - Cdg = here->BSIM4cdgb; - Csg = -(here->BSIM4cggb + here->BSIM4cdgb - + here->BSIM4cbgb); - ddxpart_dVg = (Cdg - dxpart * (Cdg + Csg)) / qcheq; + qcheq = -(here->BSIM4qgate + here->BSIM4qbulk); + if (fabs(qcheq) <= 1.0e-5 * CoxWL) + { if (model->BSIM4xpart < 0.5) + { dxpart = 0.4; + } + else if (model->BSIM4xpart > 0.5) + { dxpart = 0.0; + } + else + { dxpart = 0.5; + } + ddxpart_dVd = ddxpart_dVg = ddxpart_dVb + = ddxpart_dVs = 0.0; + } + else + { dxpart = here->BSIM4qdrn / qcheq; + Cdd = here->BSIM4cddb; + Csd = -(here->BSIM4cgdb + here->BSIM4cddb + + here->BSIM4cbdb); + ddxpart_dVd = (Cdd - dxpart * (Cdd + Csd)) / qcheq; + Cdg = here->BSIM4cdgb; + Csg = -(here->BSIM4cggb + here->BSIM4cdgb + + here->BSIM4cbgb); + ddxpart_dVg = (Cdg - dxpart * (Cdg + Csg)) / qcheq; - Cds = here->BSIM4cdsb; - Css = -(here->BSIM4cgsb + here->BSIM4cdsb - + here->BSIM4cbsb); - ddxpart_dVs = (Cds - dxpart * (Cds + Css)) / qcheq; + Cds = here->BSIM4cdsb; + Css = -(here->BSIM4cgsb + here->BSIM4cdsb + + here->BSIM4cbsb); + ddxpart_dVs = (Cds - dxpart * (Cds + Css)) / qcheq; - ddxpart_dVb = -(ddxpart_dVd + ddxpart_dVg - + ddxpart_dVs); - } - sxpart = 1.0 - dxpart; - dsxpart_dVd = -ddxpart_dVd; - dsxpart_dVg = -ddxpart_dVg; - dsxpart_dVs = -ddxpart_dVs; - dsxpart_dVb = -(dsxpart_dVd + dsxpart_dVg + dsxpart_dVs); + ddxpart_dVb = -(ddxpart_dVd + ddxpart_dVg + + ddxpart_dVs); + } + sxpart = 1.0 - dxpart; + dsxpart_dVd = -ddxpart_dVd; + dsxpart_dVg = -ddxpart_dVg; + dsxpart_dVs = -ddxpart_dVs; + dsxpart_dVb = -(dsxpart_dVd + dsxpart_dVg + dsxpart_dVs); } } else @@ -337,7 +337,7 @@ double m; xcgmdb = -cgdo; xcgmsb = -cgso; xcgmbb = -pParam->BSIM4cgbo; - + xcdgmb = xcgmdb; xcsgmb = xcgmsb; xcbgmb = xcgmbb; @@ -394,12 +394,12 @@ double m; xcbbb = -(xcbgb + xcbdb + xcbsb + xcbgmb); xgtg = xgtd = xgts = xgtb = 0.0; - sxpart = 0.4; + sxpart = 0.4; dxpart = 0.6; - ddxpart_dVd = ddxpart_dVg = ddxpart_dVb - = ddxpart_dVs = 0.0; - dsxpart_dVd = dsxpart_dVg = dsxpart_dVb - = dsxpart_dVs = 0.0; + ddxpart_dVd = ddxpart_dVg = ddxpart_dVb + = ddxpart_dVs = 0.0; + dsxpart_dVd = dsxpart_dVg = dsxpart_dVb + = dsxpart_dVs = 0.0; } else { xcggb = xcgdb = xcgsb = xcgbb = 0.0; @@ -407,7 +407,7 @@ double m; xcdgb = xcddb = xcdsb = xcdbb = 0.0; xcsgb = xcsdb = xcssb = xcsbb = 0.0; - xgtg = here->BSIM4gtg; + xgtg = here->BSIM4gtg; xgtd = here->BSIM4gts; xgts = here->BSIM4gtd; xgtb = here->BSIM4gtb; @@ -417,46 +417,46 @@ double m; xcqsb = here->BSIM4cqdb; xcqbb = here->BSIM4cqbb; - CoxWL = model->BSIM4coxe * here->pParam->BSIM4weffCV + CoxWL = model->BSIM4coxe * here->pParam->BSIM4weffCV * here->BSIM4nf * here->pParam->BSIM4leffCV; - qcheq = -(here->BSIM4qgate + here->BSIM4qbulk); - if (fabs(qcheq) <= 1.0e-5 * CoxWL) - { if (model->BSIM4xpart < 0.5) - { sxpart = 0.4; - } - else if (model->BSIM4xpart > 0.5) - { sxpart = 0.0; - } - else - { sxpart = 0.5; - } - dsxpart_dVd = dsxpart_dVg = dsxpart_dVb - = dsxpart_dVs = 0.0; - } - else - { sxpart = here->BSIM4qdrn / qcheq; - Css = here->BSIM4cddb; - Cds = -(here->BSIM4cgdb + here->BSIM4cddb - + here->BSIM4cbdb); - dsxpart_dVs = (Css - sxpart * (Css + Cds)) / qcheq; - Csg = here->BSIM4cdgb; - Cdg = -(here->BSIM4cggb + here->BSIM4cdgb - + here->BSIM4cbgb); - dsxpart_dVg = (Csg - sxpart * (Csg + Cdg)) / qcheq; + qcheq = -(here->BSIM4qgate + here->BSIM4qbulk); + if (fabs(qcheq) <= 1.0e-5 * CoxWL) + { if (model->BSIM4xpart < 0.5) + { sxpart = 0.4; + } + else if (model->BSIM4xpart > 0.5) + { sxpart = 0.0; + } + else + { sxpart = 0.5; + } + dsxpart_dVd = dsxpart_dVg = dsxpart_dVb + = dsxpart_dVs = 0.0; + } + else + { sxpart = here->BSIM4qdrn / qcheq; + Css = here->BSIM4cddb; + Cds = -(here->BSIM4cgdb + here->BSIM4cddb + + here->BSIM4cbdb); + dsxpart_dVs = (Css - sxpart * (Css + Cds)) / qcheq; + Csg = here->BSIM4cdgb; + Cdg = -(here->BSIM4cggb + here->BSIM4cdgb + + here->BSIM4cbgb); + dsxpart_dVg = (Csg - sxpart * (Csg + Cdg)) / qcheq; - Csd = here->BSIM4cdsb; - Cdd = -(here->BSIM4cgsb + here->BSIM4cdsb - + here->BSIM4cbsb); - dsxpart_dVd = (Csd - sxpart * (Csd + Cdd)) / qcheq; + Csd = here->BSIM4cdsb; + Cdd = -(here->BSIM4cgsb + here->BSIM4cdsb + + here->BSIM4cbsb); + dsxpart_dVd = (Csd - sxpart * (Csd + Cdd)) / qcheq; - dsxpart_dVb = -(dsxpart_dVd + dsxpart_dVg - + dsxpart_dVs); - } - dxpart = 1.0 - sxpart; - ddxpart_dVd = -dsxpart_dVd; - ddxpart_dVg = -dsxpart_dVg; - ddxpart_dVs = -dsxpart_dVs; - ddxpart_dVb = -(ddxpart_dVd + ddxpart_dVg + ddxpart_dVs); + dsxpart_dVb = -(dsxpart_dVd + dsxpart_dVg + + dsxpart_dVs); + } + dxpart = 1.0 - sxpart; + ddxpart_dVd = -dsxpart_dVd; + ddxpart_dVg = -dsxpart_dVg; + ddxpart_dVs = -dsxpart_dVs; + ddxpart_dVb = -(ddxpart_dVd + ddxpart_dVg + ddxpart_dVs); } } @@ -479,7 +479,7 @@ double m; } - T1 = *(ckt->CKTstate0 + here->BSIM4qdef) * here->BSIM4gtau; + T1 = *(ckt->CKTstate0 + here->BSIM4qdef) * here->BSIM4gtau; gds = here->BSIM4gds; /* @@ -513,13 +513,13 @@ double m; *(here->BSIM4GPgpPtr) += m * (geltd - xgtg + gIgtotg); *(here->BSIM4GPdpPtr ) += m * xcgdb * s->real; *(here->BSIM4GPdpPtr +1) += m * xcgdb * s->imag; - *(here->BSIM4GPdpPtr) -= m * (xgtd - gIgtotd); + *(here->BSIM4GPdpPtr) -= m * (xgtd - gIgtotd); *(here->BSIM4GPspPtr ) += m * xcgsb * s->real; *(here->BSIM4GPspPtr +1) += m * xcgsb * s->imag; *(here->BSIM4GPspPtr) -= m * (xgts - gIgtots); *(here->BSIM4GPbpPtr ) += m * xcgbb * s->real; *(here->BSIM4GPbpPtr +1) += m * xcgbb * s->imag; - *(here->BSIM4GPbpPtr) -= m * (xgtb - gIgtotb); + *(here->BSIM4GPbpPtr) -= m * (xgtb - gIgtotb); } else if (here->BSIM4rgateMod == 2) { *(here->BSIM4GEgePtr) += m * gcrg; @@ -585,16 +585,16 @@ double m; else { *(here->BSIM4GPdpPtr ) += m * xcgdb * s->real; *(here->BSIM4GPdpPtr +1) += m * xcgdb * s->imag; - *(here->BSIM4GPdpPtr) -= m * (xgtd - gIgtotd); + *(here->BSIM4GPdpPtr) -= m * (xgtd - gIgtotd); *(here->BSIM4GPgpPtr ) += m * xcggb * s->real; *(here->BSIM4GPgpPtr +1) += m * xcggb * s->imag; - *(here->BSIM4GPgpPtr) -= m * (xgtg - gIgtotg); + *(here->BSIM4GPgpPtr) -= m * (xgtg - gIgtotg); *(here->BSIM4GPspPtr ) += m * xcgsb * s->real; *(here->BSIM4GPspPtr +1) += m * xcgsb * s->imag; *(here->BSIM4GPspPtr) -= m * (xgts - gIgtots); *(here->BSIM4GPbpPtr ) += m * xcgbb * s->real; *(here->BSIM4GPbpPtr +1) += m * xcgbb * s->imag; - *(here->BSIM4GPbpPtr) -= m * (xgtb - gIgtotb); + *(here->BSIM4GPbpPtr) -= m * (xgtb - gIgtotb); } if (model->BSIM4rdsMod) @@ -609,21 +609,21 @@ double m; *(here->BSIM4DPdpPtr ) += m * xcddb * s->real; *(here->BSIM4DPdpPtr +1) += m * xcddb * s->imag; *(here->BSIM4DPdpPtr) += m * (gdpr + gds + here->BSIM4gbd - - gdtotd + RevSum + gbdpdp - gIdtotd - + dxpart * xgtd + T1 * ddxpart_dVd); + - gdtotd + RevSum + gbdpdp - gIdtotd + + dxpart * xgtd + T1 * ddxpart_dVd); *(here->BSIM4DPdPtr) -= m * (gdpr + gdtot); *(here->BSIM4DPgpPtr ) += m * xcdgb * s->real; *(here->BSIM4DPgpPtr +1) += m * xcdgb * s->imag; *(here->BSIM4DPgpPtr) += m * (Gm - gdtotg + gbdpg - gIdtotg - + T1 * ddxpart_dVg + dxpart * xgtg); + + T1 * ddxpart_dVg + dxpart * xgtg); *(here->BSIM4DPspPtr ) += m * xcdsb * s->real; *(here->BSIM4DPspPtr +1) += m * xcdsb * s->imag; *(here->BSIM4DPspPtr) -= m * (gds + FwdSum + gdtots - gbdpsp + gIdtots - - T1 * ddxpart_dVs - dxpart * xgts); + - T1 * ddxpart_dVs - dxpart * xgts); *(here->BSIM4DPbpPtr ) += m * xcdbb * s->real; *(here->BSIM4DPbpPtr +1) += m * xcdbb * s->imag; *(here->BSIM4DPbpPtr) -= m * (gjbd + gdtotb - Gmbs - gbdpb + gIdtotb - - T1 * ddxpart_dVb - dxpart * xgtb); + - T1 * ddxpart_dVb - dxpart * xgtb); *(here->BSIM4DdpPtr) -= m * (gdpr - gdtotd); *(here->BSIM4DdPtr) += m * (gdpr + gdtot); @@ -631,21 +631,21 @@ double m; *(here->BSIM4SPdpPtr ) += m * xcsdb * s->real; *(here->BSIM4SPdpPtr +1) += m * xcsdb * s->imag; *(here->BSIM4SPdpPtr) -= m * (gds + gstotd + RevSum - gbspdp + gIstotd - - T1 * dsxpart_dVd - sxpart * xgtd); + - T1 * dsxpart_dVd - sxpart * xgtd); *(here->BSIM4SPgpPtr ) += m * xcsgb * s->real; *(here->BSIM4SPgpPtr +1) += m * xcsgb * s->imag; *(here->BSIM4SPgpPtr) -= m * (Gm + gstotg - gbspg + gIstotg - - T1 * dsxpart_dVg - sxpart * xgtg); + - T1 * dsxpart_dVg - sxpart * xgtg); *(here->BSIM4SPspPtr ) += m * xcssb * s->real; *(here->BSIM4SPspPtr +1) += m * xcssb * s->imag; *(here->BSIM4SPspPtr) += m * (gspr + gds + here->BSIM4gbs - gIstots - - gstots + FwdSum + gbspsp - + sxpart * xgts + T1 * dsxpart_dVs); + - gstots + FwdSum + gbspsp + + sxpart * xgts + T1 * dsxpart_dVs); *(here->BSIM4SPsPtr) -= m * (gspr + gstot); *(here->BSIM4SPbpPtr ) += m * xcsbb * s->real; *(here->BSIM4SPbpPtr +1) += m * xcsbb * s->imag; *(here->BSIM4SPbpPtr) -= m * (gjbs + gstotb + Gmbs - gbspb + gIstotb - - T1 * dsxpart_dVb - sxpart * xgtb); + - T1 * dsxpart_dVb - sxpart * xgtb); *(here->BSIM4SspPtr) -= m * (gspr - gstots); *(here->BSIM4SsPtr) += m * (gspr + gstot); @@ -662,32 +662,32 @@ double m; *(here->BSIM4BPbpPtr ) += m * xcbbb * s->real; *(here->BSIM4BPbpPtr +1) += m * xcbbb * s->imag; *(here->BSIM4BPbpPtr) += m * (gjbd + gjbs - here->BSIM4gbbs - - gIbtotb); - ggidld = here->BSIM4ggidld; - ggidlg = here->BSIM4ggidlg; - ggidlb = here->BSIM4ggidlb; - ggislg = here->BSIM4ggislg; - ggisls = here->BSIM4ggisls; - ggislb = here->BSIM4ggislb; + - gIbtotb); + ggidld = here->BSIM4ggidld; + ggidlg = here->BSIM4ggidlg; + ggidlb = here->BSIM4ggidlb; + ggislg = here->BSIM4ggislg; + ggisls = here->BSIM4ggisls; + ggislb = here->BSIM4ggislb; - /* stamp gidl */ - (*(here->BSIM4DPdpPtr) += m * ggidld); - (*(here->BSIM4DPgpPtr) += m * ggidlg); - (*(here->BSIM4DPspPtr) -= m * ((ggidlg + ggidld) + ggidlb)); - (*(here->BSIM4DPbpPtr) += m * ggidlb); - (*(here->BSIM4BPdpPtr) -= m * ggidld); - (*(here->BSIM4BPgpPtr) -= m * ggidlg); - (*(here->BSIM4BPspPtr) += m * ((ggidlg + ggidld) + ggidlb)); - (*(here->BSIM4BPbpPtr) -= m * ggidlb); - /* stamp gisl */ - (*(here->BSIM4SPdpPtr) -= m * ((ggisls + ggislg) + ggislb)); - (*(here->BSIM4SPgpPtr) += m * ggislg); - (*(here->BSIM4SPspPtr) += m * ggisls); - (*(here->BSIM4SPbpPtr) += m * ggislb); - (*(here->BSIM4BPdpPtr) += m * ((ggislg + ggisls) + ggislb)); - (*(here->BSIM4BPgpPtr) -= m * ggislg); - (*(here->BSIM4BPspPtr) -= m * ggisls); - (*(here->BSIM4BPbpPtr) -= m * ggislb); + /* stamp gidl */ + (*(here->BSIM4DPdpPtr) += m * ggidld); + (*(here->BSIM4DPgpPtr) += m * ggidlg); + (*(here->BSIM4DPspPtr) -= m * ((ggidlg + ggidld) + ggidlb)); + (*(here->BSIM4DPbpPtr) += m * ggidlb); + (*(here->BSIM4BPdpPtr) -= m * ggidld); + (*(here->BSIM4BPgpPtr) -= m * ggidlg); + (*(here->BSIM4BPspPtr) += m * ((ggidlg + ggidld) + ggidlb)); + (*(here->BSIM4BPbpPtr) -= m * ggidlb); + /* stamp gisl */ + (*(here->BSIM4SPdpPtr) -= m * ((ggisls + ggislg) + ggislb)); + (*(here->BSIM4SPgpPtr) += m * ggislg); + (*(here->BSIM4SPspPtr) += m * ggisls); + (*(here->BSIM4SPbpPtr) += m * ggislb); + (*(here->BSIM4BPdpPtr) += m * ((ggislg + ggisls) + ggislb)); + (*(here->BSIM4BPgpPtr) -= m * ggislg); + (*(here->BSIM4BPspPtr) -= m * ggisls); + (*(here->BSIM4BPbpPtr) -= m * ggislb); if (here->BSIM4rbodyMod) { (*(here->BSIM4DPdbPtr ) += m * xcdbdb * s->real); @@ -711,7 +711,7 @@ double m; (*(here->BSIM4BPbPtr) -= m * here->BSIM4grbpb); (*(here->BSIM4BPsbPtr) -= m * here->BSIM4grbps); (*(here->BSIM4BPbpPtr) += m * (here->BSIM4grbpd + here->BSIM4grbps - + here->BSIM4grbpb)); + + here->BSIM4grbpb)); /* WDL: (-here->BSIM4gbbs) already added to BPbpPtr */ (*(here->BSIM4SBspPtr ) += m * xcsbsb * s->real); @@ -722,7 +722,7 @@ double m; (*(here->BSIM4SBsbPtr ) -= m * xcsbsb * s->real); (*(here->BSIM4SBsbPtr +1) -= m * xcsbsb * s->imag); (*(here->BSIM4SBsbPtr) += m * (here->BSIM4gbs - + here->BSIM4grbps + here->BSIM4grbsb)); + + here->BSIM4grbps + here->BSIM4grbsb)); (*(here->BSIM4BdbPtr) -= m * here->BSIM4grbdb); (*(here->BSIM4BbpPtr) -= m * here->BSIM4grbpb); diff --git a/src/spicelib/devices/bsim4/b4set.c b/src/spicelib/devices/bsim4/b4set.c index 4279263b1..80488b803 100644 --- a/src/spicelib/devices/bsim4/b4set.c +++ b/src/spicelib/devices/bsim4/b4set.c @@ -1,9 +1,8 @@ -/**** BSIM4.6.2 Released by Wenwei Yang 07/31/2008 ****/ -/**** BSIM4.6.4 Update ngspice 08/22/2009 ****/ -/**** OpenMP support ngspice 06/28/2010 ****/ +/**** BSIM4.7.0 Released by Darsen Lu 04/08/2011 ****/ + /********** * Copyright 2006 Regents of the University of California. All rights reserved. - * File: b4set.c of BSIM4.6.2. + * File: b4set.c of BSIM4.7.0. * Author: 2000 Weidong Liu * Authors: 2001- Xuemei Xi, Mohan Dunga, Ali Niknejad, Chenming Hu. * Authors: 2006- Mohan Dunga, Ali Niknejad, Chenming Hu @@ -19,6 +18,7 @@ * Modified by Mohan Dunga, 12/13/2006 * Modified by Mohan Dunga, Wenwei Yang, 05/18/2007. * Modified by Wenwei Yang, 07/31/2008. + * Modified by Tanvir Morshed, Darsen Lu 03/27/2011 **********/ #include "ngspice.h" @@ -59,7 +59,6 @@ int noiseAnalGiven = 0, createNode; /* Criteria for new node creation */ double Rtot, DMCGeff, DMCIeff, DMDGeff; JOB *job; - #ifdef USE_OMP4 unsigned int idx, InstCount; BSIM4instance **InstArray; @@ -67,7 +66,7 @@ int nthreads; #endif /* Search for a noise analysis request */ - for (job = ft_curckt->ci_curTask->jobs; job; job = job->JOBnextJob) { + for (job = ((TSKtask *)ft_curckt->ci_curTask)->jobs;job;job = job->JOBnextJob) { if(strcmp(job->JOBname,"Noise Analysis")==0) { noiseAnalGiven = 1; break; @@ -82,11 +81,11 @@ int nthreads; if (!model->BSIM4mobModGiven) model->BSIM4mobMod = 0; - else if ((model->BSIM4mobMod != 0) && (model->BSIM4mobMod != 1) - && (model->BSIM4mobMod != 2) && (model->BSIM4mobMod != 3)) - { model->BSIM4mobMod = 0; + else if ((model->BSIM4mobMod != 0) && (model->BSIM4mobMod != 1) + && (model->BSIM4mobMod != 2)&& (model->BSIM4mobMod != 3)) + { model->BSIM4mobMod = 0; printf("Warning: mobMod has been set to its default value: 0.\n"); - } + } if (!model->BSIM4binUnitGiven) model->BSIM4binUnit = 1; @@ -113,10 +112,10 @@ int nthreads; if (!model->BSIM4rdsModGiven) model->BSIM4rdsMod = 0; - else if ((model->BSIM4rdsMod != 0) && (model->BSIM4rdsMod != 1)) + else if ((model->BSIM4rdsMod != 0) && (model->BSIM4rdsMod != 1)) { model->BSIM4rdsMod = 0; - printf("Warning: rdsMod has been set to its default value: 0.\n"); - } + printf("Warning: rdsMod has been set to its default value: 0.\n"); + } if (!model->BSIM4rbodyModGiven) model->BSIM4rbodyMod = 0; else if ((model->BSIM4rbodyMod != 0) && (model->BSIM4rbodyMod != 1) && (model->BSIM4rbodyMod != 2)) @@ -150,7 +149,7 @@ int nthreads; } if (!model->BSIM4tnoiModGiven) model->BSIM4tnoiMod = 0; /* WDLiu: tnoiMod=1 needs to set internal S/D nodes */ - else if ((model->BSIM4tnoiMod != 0) && (model->BSIM4tnoiMod != 1)) + else if ((model->BSIM4tnoiMod != 0) && (model->BSIM4tnoiMod != 1) && (model->BSIM4tnoiMod != 2)) /* v4.7 */ { model->BSIM4tnoiMod = 0; printf("Warning: tnoiMod has been set to its default value: 0.\n"); } @@ -168,13 +167,25 @@ int nthreads; printf("Warning: acnqsMod has been set to its default value: 0.\n"); } - if (!model->BSIM4mtrlModGiven) + if (!model->BSIM4mtrlModGiven) model->BSIM4mtrlMod = 0; + else if((model->BSIM4mtrlMod != 0) && (model->BSIM4mtrlMod != 1)) + { + model->BSIM4mtrlMod = 0; + printf("Warning: mtrlMod has been set to its default value: 0.\n"); + } + if (!model->BSIM4mtrlCompatModGiven) + model->BSIM4mtrlCompatMod = 0; + else if((model->BSIM4mtrlCompatMod != 0) && (model->BSIM4mtrlCompatMod != 1)) + { + model->BSIM4mtrlCompatMod = 0; + printf("Warning: mtrlCompatMod has been set to its default value: 0.\n"); + } if (!model->BSIM4igcModGiven) model->BSIM4igcMod = 0; else if ((model->BSIM4igcMod != 0) && (model->BSIM4igcMod != 1) - && (model->BSIM4igcMod != 2)) + && (model->BSIM4igcMod != 2)) { model->BSIM4igcMod = 0; printf("Warning: igcMod has been set to its default value: 0.\n"); } @@ -187,13 +198,13 @@ int nthreads; if (!model->BSIM4tempModGiven) model->BSIM4tempMod = 0; else if ((model->BSIM4tempMod != 0) && (model->BSIM4tempMod != 1) - && (model->BSIM4tempMod != 2) && (model->BSIM4tempMod != 3)) + && (model->BSIM4tempMod != 2) && (model->BSIM4tempMod != 3)) { model->BSIM4tempMod = 0; printf("Warning: tempMod has been set to its default value: 0.\n"); } if (!model->BSIM4versionGiven) - model->BSIM4version = "4.6.4"; + model->BSIM4version = "4.7.0"; if (!model->BSIM4toxrefGiven) model->BSIM4toxref = 30.0e-10; if (!model->BSIM4eotGiven) @@ -205,7 +216,7 @@ int nthreads; if (!model->BSIM4leffeotGiven) model->BSIM4leffeot = 1; if (!model->BSIM4weffeotGiven) - model->BSIM4weffeot = 10; + model->BSIM4weffeot = 10; if (!model->BSIM4adosGiven) model->BSIM4ados = 1.0; if (!model->BSIM4bdosGiven) @@ -222,15 +233,15 @@ int nthreads; model->BSIM4epsrox = 3.9; if (!model->BSIM4cdscGiven) - model->BSIM4cdsc = 2.4e-4; /* unit Q/V/m^2 */ + model->BSIM4cdsc = 2.4e-4; /* unit Q/V/m^2 */ if (!model->BSIM4cdscbGiven) - model->BSIM4cdscb = 0.0; /* unit Q/V/m^2 */ - if (!model->BSIM4cdscdGiven) - model->BSIM4cdscd = 0.0; /* unit Q/V/m^2 */ + model->BSIM4cdscb = 0.0; /* unit Q/V/m^2 */ + if (!model->BSIM4cdscdGiven) + model->BSIM4cdscd = 0.0; /* unit Q/V/m^2 */ if (!model->BSIM4citGiven) - model->BSIM4cit = 0.0; /* unit Q/V/m^2 */ + model->BSIM4cit = 0.0; /* unit Q/V/m^2 */ if (!model->BSIM4nfactorGiven) - model->BSIM4nfactor = 1.0; + model->BSIM4nfactor = 1.0; if (!model->BSIM4xjGiven) model->BSIM4xj = .15e-6; if (!model->BSIM4vsatGiven) @@ -250,21 +261,21 @@ int nthreads; if (!model->BSIM4nsubGiven) model->BSIM4nsub = 6.0e16; /* unit 1/cm3 */ if (!model->BSIM4phigGiven) - model->BSIM4phig = 4.05; + model->BSIM4phig = 4.05; if (!model->BSIM4epsrgateGiven) - model->BSIM4epsrgate = 11.7; + model->BSIM4epsrgate = 11.7; if (!model->BSIM4easubGiven) model->BSIM4easub = 4.05; if (!model->BSIM4epsrsubGiven) - model->BSIM4epsrsub = 11.7; + model->BSIM4epsrsub = 11.7; if (!model->BSIM4ni0subGiven) model->BSIM4ni0sub = 1.45e10; /* unit 1/cm3 */ if (!model->BSIM4bg0subGiven) model->BSIM4bg0sub = 1.16; /* unit eV */ if (!model->BSIM4tbgasubGiven) - model->BSIM4tbgasub = 7.02e-4; + model->BSIM4tbgasub = 7.02e-4; if (!model->BSIM4tbgbsubGiven) - model->BSIM4tbgbsub = 1108.0; + model->BSIM4tbgbsub = 1108.0; if (!model->BSIM4ndepGiven) model->BSIM4ndep = 1.7e17; /* unit 1/cm3 */ if (!model->BSIM4nsdGiven) @@ -274,9 +285,9 @@ int nthreads; if (!model->BSIM4ngateGiven) model->BSIM4ngate = 0; /* unit 1/cm3 */ if (!model->BSIM4vbmGiven) - model->BSIM4vbm = -3.0; + model->BSIM4vbm = -3.0; if (!model->BSIM4xtGiven) - model->BSIM4xt = 1.55e-7; + model->BSIM4xt = 1.55e-7; if (!model->BSIM4kt1Given) model->BSIM4kt1 = -0.11; /* unit V */ if (!model->BSIM4kt1lGiven) @@ -297,6 +308,14 @@ int nthreads; model->BSIM4dvtp0 = 0.0; if (!model->BSIM4dvtp1Given) model->BSIM4dvtp1 = 0.0; + if (!model->BSIM4dvtp2Given) /* New DIBL/Rout */ + model->BSIM4dvtp2 = 0.0; + if (!model->BSIM4dvtp3Given) + model->BSIM4dvtp3 = 0.0; + if (!model->BSIM4dvtp4Given) + model->BSIM4dvtp4 = 0.0; + if (!model->BSIM4dvtp5Given) + model->BSIM4dvtp5 = 0.0; if (!model->BSIM4dvt0Given) model->BSIM4dvt0 = 2.2; if (!model->BSIM4dvt1Given) @@ -317,11 +336,11 @@ int nthreads; model->BSIM4dsub = model->BSIM4drout; if (!model->BSIM4vth0Given) model->BSIM4vth0 = (model->BSIM4type == NMOS) ? 0.7 : -0.7; - if (!model->BSIM4vfbGiven) - model->BSIM4vfb = -1.0; + if (!model->BSIM4vfbGiven) + model->BSIM4vfb = -1.0; if (!model->BSIM4euGiven) model->BSIM4eu = (model->BSIM4type == NMOS) ? 1.67 : 1.0; - if (!model->BSIM4ucsGiven) + if (!model->BSIM4ucsGiven) model->BSIM4ucs = (model->BSIM4type == NMOS) ? 1.67 : 1.0; if (!model->BSIM4uaGiven) model->BSIM4ua = ((model->BSIM4mobMod == 2)) ? 1.0e-15 : 1.0e-9; /* unit m/V */ @@ -346,11 +365,11 @@ int nthreads; if (!model->BSIM4u0Given) model->BSIM4u0 = (model->BSIM4type == NMOS) ? 0.067 : 0.025; if (!model->BSIM4uteGiven) - model->BSIM4ute = -1.5; + model->BSIM4ute = -1.5; if (!model->BSIM4ucsteGiven) - model->BSIM4ucste = -4.775e-3; + model->BSIM4ucste = -4.775e-3; if (!model->BSIM4voffGiven) - model->BSIM4voff = -0.08; + model->BSIM4voff = -0.08; if (!model->BSIM4vofflGiven) model->BSIM4voffl = 0.0; if (!model->BSIM4voffcvlGiven) @@ -376,7 +395,7 @@ int nthreads; if (!model->BSIM4rswminGiven) model->BSIM4rswmin = 0.0; if (!model->BSIM4rdswGiven) - model->BSIM4rdsw = 200.0; /* in ohm*um */ + model->BSIM4rdsw = 200.0; /* in ohm*um */ if (!model->BSIM4rdwGiven) model->BSIM4rdw = 100.0; if (!model->BSIM4rswGiven) @@ -422,6 +441,8 @@ int nthreads; model->BSIM4alpha1 = 0.0; if (!model->BSIM4beta0Given) model->BSIM4beta0 = 0.0; + if (!model->BSIM4gidlModGiven) + model->BSIM4gidlMod = 0; /* v4.7 New GIDL/GISL */ if (!model->BSIM4agidlGiven) model->BSIM4agidl = 0.0; if (!model->BSIM4bgidlGiven) @@ -430,6 +451,12 @@ int nthreads; model->BSIM4cgidl = 0.5; /* V^3 */ if (!model->BSIM4egidlGiven) model->BSIM4egidl = 0.8; /* V */ + if (!model->BSIM4rgidlGiven) /* v4.7 New GIDL/GISL */ + model->BSIM4rgidl = 1.0; + if (!model->BSIM4kgidlGiven) /* v4.7 New GIDL/GISL */ + model->BSIM4kgidl = 0.0; + if (!model->BSIM4fgidlGiven) /* v4.7 New GIDL/GISL */ + model->BSIM4fgidl = 0.0; if (!model->BSIM4agislGiven) { if (model->BSIM4agidlGiven) @@ -458,6 +485,12 @@ int nthreads; else model->BSIM4egisl = 0.8; /* V */ } + if (!model->BSIM4rgislGiven) /* v4.7 New GIDL/GISL */ + model->BSIM4rgisl = model->BSIM4rgidl; + if (!model->BSIM4kgislGiven) /* v4.7 New GIDL/GISL */ + model->BSIM4kgisl = model->BSIM4kgidl; + if (!model->BSIM4fgislGiven) /* v4.7 New GIDL/GISL */ + model->BSIM4fgisl = model->BSIM4fgidl; if (!model->BSIM4aigcGiven) model->BSIM4aigc = (model->BSIM4type == NMOS) ? 1.36e-2 : 9.80e-3; if (!model->BSIM4bigcGiven) @@ -542,10 +575,14 @@ int nthreads; model->BSIM4tnoia = 1.5; if (!model->BSIM4tnoibGiven) model->BSIM4tnoib = 3.5; + if (!model->BSIM4tnoicGiven) + model->BSIM4tnoic = 0.0; if (!model->BSIM4rnoiaGiven) model->BSIM4rnoia = 0.577; if (!model->BSIM4rnoibGiven) model->BSIM4rnoib = 0.5164; + if (!model->BSIM4rnoicGiven) + model->BSIM4rnoic = 0.395; if (!model->BSIM4ntnoiGiven) model->BSIM4ntnoi = 1.0; if (!model->BSIM4lambdaGiven) @@ -562,6 +599,12 @@ int nthreads; model->BSIM4tvfbsdoff = 0.0; if (!model->BSIM4tvoffGiven) model->BSIM4tvoff = 0.0; + if (!model->BSIM4tnfactorGiven) /* v4.7 temp dep of leakage current */ + model->BSIM4tnfactor = 0.0; + if (!model->BSIM4teta0Given) /* v4.7 temp dep of leakage current */ + model->BSIM4teta0 = 0.0; + if (!model->BSIM4tvoffcvGiven) /* v4.7 temp dep of leakage current */ + model->BSIM4tvoffcv = 0.0; if (!model->BSIM4lintnoiGiven) model->BSIM4lintnoi = 0.0; /* unit m */ @@ -698,17 +741,17 @@ int nthreads; if (!model->BSIM4tpbswgGiven) model->BSIM4tpbswg = 0.0; - /* Length dependence */ + /* Length dependence */ if (!model->BSIM4lcdscGiven) - model->BSIM4lcdsc = 0.0; + model->BSIM4lcdsc = 0.0; if (!model->BSIM4lcdscbGiven) - model->BSIM4lcdscb = 0.0; - if (!model->BSIM4lcdscdGiven) - model->BSIM4lcdscd = 0.0; + model->BSIM4lcdscb = 0.0; + if (!model->BSIM4lcdscdGiven) + model->BSIM4lcdscd = 0.0; if (!model->BSIM4lcitGiven) - model->BSIM4lcit = 0.0; + model->BSIM4lcit = 0.0; if (!model->BSIM4lnfactorGiven) - model->BSIM4lnfactor = 0.0; + model->BSIM4lnfactor = 0.0; if (!model->BSIM4lxjGiven) model->BSIM4lxj = 0.0; if (!model->BSIM4lvsatGiven) @@ -736,9 +779,9 @@ int nthreads; if (!model->BSIM4lngateGiven) model->BSIM4lngate = 0.0; if (!model->BSIM4lvbmGiven) - model->BSIM4lvbm = 0.0; + model->BSIM4lvbm = 0.0; if (!model->BSIM4lxtGiven) - model->BSIM4lxt = 0.0; + model->BSIM4lxt = 0.0; if (!model->BSIM4lkt1Given) model->BSIM4lkt1 = 0.0; if (!model->BSIM4lkt1lGiven) @@ -759,6 +802,14 @@ int nthreads; model->BSIM4ldvtp0 = 0.0; if (!model->BSIM4ldvtp1Given) model->BSIM4ldvtp1 = 0.0; + if (!model->BSIM4ldvtp2Given) /* New DIBL/Rout */ + model->BSIM4ldvtp2 = 0.0; + if (!model->BSIM4ldvtp3Given) + model->BSIM4ldvtp3 = 0.0; + if (!model->BSIM4ldvtp4Given) + model->BSIM4ldvtp4 = 0.0; + if (!model->BSIM4ldvtp5Given) + model->BSIM4ldvtp5 = 0.0; if (!model->BSIM4ldvt0Given) model->BSIM4ldvt0 = 0.0; if (!model->BSIM4ldvt1Given) @@ -800,11 +851,11 @@ int nthreads; if (!model->BSIM4lu0Given) model->BSIM4lu0 = 0.0; if (!model->BSIM4luteGiven) - model->BSIM4lute = 0.0; + model->BSIM4lute = 0.0; if (!model->BSIM4lucsteGiven) - model->BSIM4lucste = 0.0; + model->BSIM4lucste = 0.0; if (!model->BSIM4lvoffGiven) - model->BSIM4lvoff = 0.0; + model->BSIM4lvoff = 0.0; if (!model->BSIM4lminvGiven) model->BSIM4lminv = 0.0; if (!model->BSIM4lminvcvGiven) @@ -871,6 +922,13 @@ int nthreads; model->BSIM4lcgidl = 0.0; if (!model->BSIM4legidlGiven) model->BSIM4legidl = 0.0; + if (!model->BSIM4lrgidlGiven) /* v4.7 New GIDL/GISL */ + model->BSIM4lrgidl = 0.0; + if (!model->BSIM4lkgidlGiven) /* v4.7 New GIDL/GISL */ + model->BSIM4lkgidl = 0.0; + if (!model->BSIM4lfgidlGiven) /* v4.7 New GIDL/GISL */ + model->BSIM4lfgidl = 0.0; + if (!model->BSIM4lagislGiven) { if (model->BSIM4lagidlGiven) @@ -899,13 +957,28 @@ int nthreads; else model->BSIM4legisl = 0.0; } + if (!model->BSIM4lrgislGiven) /* v4.7 New GIDL/GISL */ + { + if (model->BSIM4lrgidlGiven) + model->BSIM4lrgisl = model->BSIM4lrgidl; + } + if (!model->BSIM4lkgislGiven) /* v4.7 New GIDL/GISL */ + { + if (model->BSIM4lkgidlGiven) + model->BSIM4lkgisl = model->BSIM4lkgidl; + } + if (!model->BSIM4lfgislGiven) /* v4.7 New GIDL/GISL */ + { + if (model->BSIM4lfgidlGiven) + model->BSIM4lfgisl = model->BSIM4lfgidl; + } if (!model->BSIM4laigcGiven) model->BSIM4laigc = 0.0; if (!model->BSIM4lbigcGiven) model->BSIM4lbigc = 0.0; if (!model->BSIM4lcigcGiven) model->BSIM4lcigc = 0.0; - if (!model->BSIM4aigsdGiven && (model->BSIM4aigsGiven || model->BSIM4aigdGiven)) + if (!model->BSIM4aigsdGiven && (model->BSIM4aigsGiven || model->BSIM4aigdGiven)) { if (!model->BSIM4laigsGiven) model->BSIM4laigs = 0.0; @@ -913,12 +986,12 @@ int nthreads; model->BSIM4laigd = 0.0; } else - { - if (!model->BSIM4laigsdGiven) - model->BSIM4laigsd = 0.0; - model->BSIM4laigs = model->BSIM4laigd = model->BSIM4laigsd; + { + if (!model->BSIM4laigsdGiven) + model->BSIM4laigsd = 0.0; + model->BSIM4laigs = model->BSIM4laigd = model->BSIM4laigsd; } - if (!model->BSIM4bigsdGiven && (model->BSIM4bigsGiven || model->BSIM4bigdGiven)) + if (!model->BSIM4bigsdGiven && (model->BSIM4bigsGiven || model->BSIM4bigdGiven)) { if (!model->BSIM4lbigsGiven) model->BSIM4lbigs = 0.0; @@ -926,12 +999,12 @@ int nthreads; model->BSIM4lbigd = 0.0; } else - { - if (!model->BSIM4lbigsdGiven) - model->BSIM4lbigsd = 0.0; - model->BSIM4lbigs = model->BSIM4lbigd = model->BSIM4lbigsd; + { + if (!model->BSIM4lbigsdGiven) + model->BSIM4lbigsd = 0.0; + model->BSIM4lbigs = model->BSIM4lbigd = model->BSIM4lbigsd; } - if (!model->BSIM4cigsdGiven && (model->BSIM4cigsGiven || model->BSIM4cigdGiven)) + if (!model->BSIM4cigsdGiven && (model->BSIM4cigsGiven || model->BSIM4cigdGiven)) { if (!model->BSIM4lcigsGiven) model->BSIM4lcigs = 0.0; @@ -939,10 +1012,10 @@ int nthreads; model->BSIM4lcigd = 0.0; } else - { - if (!model->BSIM4lcigsdGiven) - model->BSIM4lcigsd = 0.0; - model->BSIM4lcigs = model->BSIM4lcigd = model->BSIM4lcigsd; + { + if (!model->BSIM4lcigsdGiven) + model->BSIM4lcigsd = 0.0; + model->BSIM4lcigs = model->BSIM4lcigd = model->BSIM4lcigsd; } if (!model->BSIM4laigbaccGiven) model->BSIM4laigbacc = 0.0; @@ -976,7 +1049,7 @@ int nthreads; model->BSIM4lxrcrg2 = 0.0; if (!model->BSIM4leuGiven) model->BSIM4leu = 0.0; - if (!model->BSIM4lucsGiven) + if (!model->BSIM4lucsGiven) model->BSIM4lucs = 0.0; if (!model->BSIM4lvfbGiven) model->BSIM4lvfb = 0.0; @@ -992,6 +1065,12 @@ int nthreads; model->BSIM4ltvfbsdoff = 0.0; if (!model->BSIM4ltvoffGiven) model->BSIM4ltvoff = 0.0; + if (!model->BSIM4ltnfactorGiven) /* v4.7 temp dep of leakage current */ + model->BSIM4ltnfactor = 0.0; + if (!model->BSIM4lteta0Given) /* v4.7 temp dep of leakage current */ + model->BSIM4lteta0 = 0.0; + if (!model->BSIM4ltvoffcvGiven) /* v4.7 temp dep of leakage current */ + model->BSIM4ltvoffcv = 0.0; if (!model->BSIM4lcgslGiven) @@ -1019,17 +1098,17 @@ int nthreads; if (!model->BSIM4lvoffcvGiven) model->BSIM4lvoffcv = 0.0; - /* Width dependence */ + /* Width dependence */ if (!model->BSIM4wcdscGiven) - model->BSIM4wcdsc = 0.0; + model->BSIM4wcdsc = 0.0; if (!model->BSIM4wcdscbGiven) - model->BSIM4wcdscb = 0.0; - if (!model->BSIM4wcdscdGiven) - model->BSIM4wcdscd = 0.0; + model->BSIM4wcdscb = 0.0; + if (!model->BSIM4wcdscdGiven) + model->BSIM4wcdscd = 0.0; if (!model->BSIM4wcitGiven) - model->BSIM4wcit = 0.0; + model->BSIM4wcit = 0.0; if (!model->BSIM4wnfactorGiven) - model->BSIM4wnfactor = 0.0; + model->BSIM4wnfactor = 0.0; if (!model->BSIM4wxjGiven) model->BSIM4wxj = 0.0; if (!model->BSIM4wvsatGiven) @@ -1057,9 +1136,9 @@ int nthreads; if (!model->BSIM4wngateGiven) model->BSIM4wngate = 0.0; if (!model->BSIM4wvbmGiven) - model->BSIM4wvbm = 0.0; + model->BSIM4wvbm = 0.0; if (!model->BSIM4wxtGiven) - model->BSIM4wxt = 0.0; + model->BSIM4wxt = 0.0; if (!model->BSIM4wkt1Given) model->BSIM4wkt1 = 0.0; if (!model->BSIM4wkt1lGiven) @@ -1080,6 +1159,14 @@ int nthreads; model->BSIM4wdvtp0 = 0.0; if (!model->BSIM4wdvtp1Given) model->BSIM4wdvtp1 = 0.0; + if (!model->BSIM4wdvtp2Given) /* New DIBL/Rout */ + model->BSIM4wdvtp2 = 0.0; + if (!model->BSIM4wdvtp3Given) + model->BSIM4wdvtp3 = 0.0; + if (!model->BSIM4wdvtp4Given) + model->BSIM4wdvtp4 = 0.0; + if (!model->BSIM4wdvtp5Given) + model->BSIM4wdvtp5 = 0.0; if (!model->BSIM4wdvt0Given) model->BSIM4wdvt0 = 0.0; if (!model->BSIM4wdvt1Given) @@ -1121,11 +1208,11 @@ int nthreads; if (!model->BSIM4wu0Given) model->BSIM4wu0 = 0.0; if (!model->BSIM4wuteGiven) - model->BSIM4wute = 0.0; + model->BSIM4wute = 0.0; if (!model->BSIM4wucsteGiven) - model->BSIM4wucste = 0.0; + model->BSIM4wucste = 0.0; if (!model->BSIM4wvoffGiven) - model->BSIM4wvoff = 0.0; + model->BSIM4wvoff = 0.0; if (!model->BSIM4wminvGiven) model->BSIM4wminv = 0.0; if (!model->BSIM4wminvcvGiven) @@ -1192,6 +1279,13 @@ int nthreads; model->BSIM4wcgidl = 0.0; if (!model->BSIM4wegidlGiven) model->BSIM4wegidl = 0.0; + if (!model->BSIM4wrgidlGiven) /* v4.7 New GIDL/GISL */ + model->BSIM4wrgidl = 0.0; + if (!model->BSIM4wkgidlGiven) /* v4.7 New GIDL/GISL */ + model->BSIM4wkgidl = 0.0; + if (!model->BSIM4wfgidlGiven) /* v4.7 New GIDL/GISL */ + model->BSIM4wfgidl = 0.0; + if (!model->BSIM4wagislGiven) { if (model->BSIM4wagidlGiven) @@ -1220,13 +1314,28 @@ int nthreads; else model->BSIM4wegisl = 0.0; } + if (!model->BSIM4wrgislGiven) /* v4.7 New GIDL/GISL */ + { + if (model->BSIM4wrgidlGiven) + model->BSIM4wrgisl = model->BSIM4wrgidl; + } + if (!model->BSIM4wkgislGiven) /* v4.7 New GIDL/GISL */ + { + if (model->BSIM4wkgidlGiven) + model->BSIM4wkgisl = model->BSIM4wkgidl; + } + if (!model->BSIM4wfgislGiven) /* v4.7 New GIDL/GISL */ + { + if (model->BSIM4wfgidlGiven) + model->BSIM4wfgisl = model->BSIM4wfgidl; + } if (!model->BSIM4waigcGiven) model->BSIM4waigc = 0.0; if (!model->BSIM4wbigcGiven) model->BSIM4wbigc = 0.0; if (!model->BSIM4wcigcGiven) model->BSIM4wcigc = 0.0; - if (!model->BSIM4aigsdGiven && (model->BSIM4aigsGiven || model->BSIM4aigdGiven)) + if (!model->BSIM4aigsdGiven && (model->BSIM4aigsGiven || model->BSIM4aigdGiven)) { if (!model->BSIM4waigsGiven) model->BSIM4waigs = 0.0; @@ -1234,12 +1343,12 @@ int nthreads; model->BSIM4waigd = 0.0; } else - { - if (!model->BSIM4waigsdGiven) - model->BSIM4waigsd = 0.0; - model->BSIM4waigs = model->BSIM4waigd = model->BSIM4waigsd; + { + if (!model->BSIM4waigsdGiven) + model->BSIM4waigsd = 0.0; + model->BSIM4waigs = model->BSIM4waigd = model->BSIM4waigsd; } - if (!model->BSIM4bigsdGiven && (model->BSIM4bigsGiven || model->BSIM4bigdGiven)) + if (!model->BSIM4bigsdGiven && (model->BSIM4bigsGiven || model->BSIM4bigdGiven)) { if (!model->BSIM4wbigsGiven) model->BSIM4wbigs = 0.0; @@ -1247,12 +1356,12 @@ int nthreads; model->BSIM4wbigd = 0.0; } else - { - if (!model->BSIM4wbigsdGiven) - model->BSIM4wbigsd = 0.0; - model->BSIM4wbigs = model->BSIM4wbigd = model->BSIM4wbigsd; + { + if (!model->BSIM4wbigsdGiven) + model->BSIM4wbigsd = 0.0; + model->BSIM4wbigs = model->BSIM4wbigd = model->BSIM4wbigsd; } - if (!model->BSIM4cigsdGiven && (model->BSIM4cigsGiven || model->BSIM4cigdGiven)) + if (!model->BSIM4cigsdGiven && (model->BSIM4cigsGiven || model->BSIM4cigdGiven)) { if (!model->BSIM4wcigsGiven) model->BSIM4wcigs = 0.0; @@ -1260,10 +1369,10 @@ int nthreads; model->BSIM4wcigd = 0.0; } else - { - if (!model->BSIM4wcigsdGiven) - model->BSIM4wcigsd = 0.0; - model->BSIM4wcigs = model->BSIM4wcigd = model->BSIM4wcigsd; + { + if (!model->BSIM4wcigsdGiven) + model->BSIM4wcigsd = 0.0; + model->BSIM4wcigs = model->BSIM4wcigd = model->BSIM4wcigsd; } if (!model->BSIM4waigbaccGiven) model->BSIM4waigbacc = 0.0; @@ -1297,7 +1406,7 @@ int nthreads; model->BSIM4wxrcrg2 = 0.0; if (!model->BSIM4weuGiven) model->BSIM4weu = 0.0; - if (!model->BSIM4wucsGiven) + if (!model->BSIM4wucsGiven) model->BSIM4wucs = 0.0; if (!model->BSIM4wvfbGiven) model->BSIM4wvfb = 0.0; @@ -1313,6 +1422,12 @@ int nthreads; model->BSIM4wtvfbsdoff = 0.0; if (!model->BSIM4wtvoffGiven) model->BSIM4wtvoff = 0.0; + if (!model->BSIM4wtnfactorGiven) /* v4.7 temp dep of leakage current */ + model->BSIM4wtnfactor = 0.0; + if (!model->BSIM4wteta0Given) /* v4.7 temp dep of leakage current */ + model->BSIM4wteta0 = 0.0; + if (!model->BSIM4wtvoffcvGiven) /* v4.7 temp dep of leakage current */ + model->BSIM4wtvoffcv = 0.0; if (!model->BSIM4wcgslGiven) model->BSIM4wcgsl = 0.0; @@ -1339,17 +1454,17 @@ int nthreads; if (!model->BSIM4wvoffcvGiven) model->BSIM4wvoffcv = 0.0; - /* Cross-term dependence */ + /* Cross-term dependence */ if (!model->BSIM4pcdscGiven) - model->BSIM4pcdsc = 0.0; + model->BSIM4pcdsc = 0.0; if (!model->BSIM4pcdscbGiven) - model->BSIM4pcdscb = 0.0; - if (!model->BSIM4pcdscdGiven) - model->BSIM4pcdscd = 0.0; + model->BSIM4pcdscb = 0.0; + if (!model->BSIM4pcdscdGiven) + model->BSIM4pcdscd = 0.0; if (!model->BSIM4pcitGiven) - model->BSIM4pcit = 0.0; + model->BSIM4pcit = 0.0; if (!model->BSIM4pnfactorGiven) - model->BSIM4pnfactor = 0.0; + model->BSIM4pnfactor = 0.0; if (!model->BSIM4pxjGiven) model->BSIM4pxj = 0.0; if (!model->BSIM4pvsatGiven) @@ -1378,9 +1493,9 @@ int nthreads; if (!model->BSIM4pngateGiven) model->BSIM4pngate = 0.0; if (!model->BSIM4pvbmGiven) - model->BSIM4pvbm = 0.0; + model->BSIM4pvbm = 0.0; if (!model->BSIM4pxtGiven) - model->BSIM4pxt = 0.0; + model->BSIM4pxt = 0.0; if (!model->BSIM4pkt1Given) model->BSIM4pkt1 = 0.0; if (!model->BSIM4pkt1lGiven) @@ -1401,6 +1516,14 @@ int nthreads; model->BSIM4pdvtp0 = 0.0; if (!model->BSIM4pdvtp1Given) model->BSIM4pdvtp1 = 0.0; + if (!model->BSIM4pdvtp2Given) /* New DIBL/Rout */ + model->BSIM4pdvtp2 = 0.0; + if (!model->BSIM4pdvtp3Given) + model->BSIM4pdvtp3 = 0.0; + if (!model->BSIM4pdvtp4Given) + model->BSIM4pdvtp4 = 0.0; + if (!model->BSIM4pdvtp5Given) + model->BSIM4pdvtp5 = 0.0; if (!model->BSIM4pdvt0Given) model->BSIM4pdvt0 = 0.0; if (!model->BSIM4pdvt1Given) @@ -1442,11 +1565,11 @@ int nthreads; if (!model->BSIM4pu0Given) model->BSIM4pu0 = 0.0; if (!model->BSIM4puteGiven) - model->BSIM4pute = 0.0; + model->BSIM4pute = 0.0; if (!model->BSIM4pucsteGiven) - model->BSIM4pucste = 0.0; + model->BSIM4pucste = 0.0; if (!model->BSIM4pvoffGiven) - model->BSIM4pvoff = 0.0; + model->BSIM4pvoff = 0.0; if (!model->BSIM4pminvGiven) model->BSIM4pminv = 0.0; if (!model->BSIM4pminvcvGiven) @@ -1513,6 +1636,13 @@ int nthreads; model->BSIM4pcgidl = 0.0; if (!model->BSIM4pegidlGiven) model->BSIM4pegidl = 0.0; + if (!model->BSIM4prgidlGiven) /* v4.7 New GIDL/GISL */ + model->BSIM4prgidl = 0.0; + if (!model->BSIM4pkgidlGiven) /* v4.7 New GIDL/GISL */ + model->BSIM4pkgidl = 0.0; + if (!model->BSIM4pfgidlGiven) /* v4.7 New GIDL/GISL */ + model->BSIM4pfgidl = 0.0; + if (!model->BSIM4pagislGiven) { if (model->BSIM4pagidlGiven) @@ -1541,13 +1671,28 @@ int nthreads; else model->BSIM4pegisl = 0.0; } + if (!model->BSIM4prgislGiven) /* v4.7 New GIDL/GISL */ + { + if (model->BSIM4prgidlGiven) + model->BSIM4prgisl = model->BSIM4prgidl; + } + if (!model->BSIM4pkgislGiven) /* v4.7 New GIDL/GISL */ + { + if (model->BSIM4pkgidlGiven) + model->BSIM4pkgisl = model->BSIM4pkgidl; + } + if (!model->BSIM4pfgislGiven) /* v4.7 New GIDL/GISL */ + { + if (model->BSIM4pfgidlGiven) + model->BSIM4pfgisl = model->BSIM4pfgidl; + } if (!model->BSIM4paigcGiven) model->BSIM4paigc = 0.0; if (!model->BSIM4pbigcGiven) model->BSIM4pbigc = 0.0; if (!model->BSIM4pcigcGiven) model->BSIM4pcigc = 0.0; - if (!model->BSIM4aigsdGiven && (model->BSIM4aigsGiven || model->BSIM4aigdGiven)) + if (!model->BSIM4aigsdGiven && (model->BSIM4aigsGiven || model->BSIM4aigdGiven)) { if (!model->BSIM4paigsGiven) model->BSIM4paigs = 0.0; @@ -1555,12 +1700,12 @@ int nthreads; model->BSIM4paigd = 0.0; } else - { - if (!model->BSIM4paigsdGiven) - model->BSIM4paigsd = 0.0; - model->BSIM4paigs = model->BSIM4paigd = model->BSIM4paigsd; + { + if (!model->BSIM4paigsdGiven) + model->BSIM4paigsd = 0.0; + model->BSIM4paigs = model->BSIM4paigd = model->BSIM4paigsd; } - if (!model->BSIM4bigsdGiven && (model->BSIM4bigsGiven || model->BSIM4bigdGiven)) + if (!model->BSIM4bigsdGiven && (model->BSIM4bigsGiven || model->BSIM4bigdGiven)) { if (!model->BSIM4pbigsGiven) model->BSIM4pbigs = 0.0; @@ -1568,12 +1713,12 @@ int nthreads; model->BSIM4pbigd = 0.0; } else - { - if (!model->BSIM4pbigsdGiven) - model->BSIM4pbigsd = 0.0; - model->BSIM4pbigs = model->BSIM4pbigd = model->BSIM4pbigsd; + { + if (!model->BSIM4pbigsdGiven) + model->BSIM4pbigsd = 0.0; + model->BSIM4pbigs = model->BSIM4pbigd = model->BSIM4pbigsd; } - if (!model->BSIM4cigsdGiven && (model->BSIM4cigsGiven || model->BSIM4cigdGiven)) + if (!model->BSIM4cigsdGiven && (model->BSIM4cigsGiven || model->BSIM4cigdGiven)) { if (!model->BSIM4pcigsGiven) model->BSIM4pcigs = 0.0; @@ -1581,10 +1726,10 @@ int nthreads; model->BSIM4pcigd = 0.0; } else - { - if (!model->BSIM4pcigsdGiven) - model->BSIM4pcigsd = 0.0; - model->BSIM4pcigs = model->BSIM4pcigd = model->BSIM4pcigsd; + { + if (!model->BSIM4pcigsdGiven) + model->BSIM4pcigsd = 0.0; + model->BSIM4pcigs = model->BSIM4pcigd = model->BSIM4pcigsd; } if (!model->BSIM4paigbaccGiven) model->BSIM4paigbacc = 0.0; @@ -1618,7 +1763,7 @@ int nthreads; model->BSIM4pxrcrg2 = 0.0; if (!model->BSIM4peuGiven) model->BSIM4peu = 0.0; - if (!model->BSIM4pucsGiven) + if (!model->BSIM4pucsGiven) model->BSIM4pucs = 0.0; if (!model->BSIM4pvfbGiven) model->BSIM4pvfb = 0.0; @@ -1634,6 +1779,12 @@ int nthreads; model->BSIM4ptvfbsdoff = 0.0; if (!model->BSIM4ptvoffGiven) model->BSIM4ptvoff = 0.0; + if (!model->BSIM4ptnfactorGiven) /* v4.7 temp dep of leakage current */ + model->BSIM4ptnfactor = 0.0; + if (!model->BSIM4pteta0Given) /* v4.7 temp dep of leakage current */ + model->BSIM4pteta0 = 0.0; + if (!model->BSIM4ptvoffcvGiven) /* v4.7 temp dep of leakage current */ + model->BSIM4ptvoffcv = 0.0; if (!model->BSIM4pcgslGiven) model->BSIM4pcgsl = 0.0; @@ -1687,7 +1838,7 @@ int nthreads; /* unit degree celcius */ if (!model->BSIM4tnomGiven) - model->BSIM4tnom = ckt->CKTnomTemp; + model->BSIM4tnom = ckt->CKTnomTemp; if (!model->BSIM4LintGiven) model->BSIM4Lint = 0.0; if (!model->BSIM4LlGiven) @@ -1746,14 +1897,14 @@ int nthreads; { if (model->BSIM4dlcigGiven) model->BSIM4dlcigd = model->BSIM4dlcig; - else + else model->BSIM4dlcigd = model->BSIM4Lint; } if (!model->BSIM4dwjGiven) model->BSIM4dwj = model->BSIM4dwc; - if (!model->BSIM4cfGiven) + if (!model->BSIM4cfGiven) model->BSIM4cf = 2.0 * model->BSIM4epsrox * EPS0 / PI - * log(1.0 + 0.4e-6 / model->BSIM4toxe); + * log(1.0 + 0.4e-6 / model->BSIM4toxe); if (!model->BSIM4xpartGiven) model->BSIM4xpart = 0.0; @@ -1829,34 +1980,34 @@ int nthreads; model->BSIM4jtsswgs = 0.0; if (!model->BSIM4jtsswgdGiven) model->BSIM4jtsswgd = model->BSIM4jtsswgs; - if (!model->BSIM4jtweffGiven) - model->BSIM4jtweff = 0.0; + if (!model->BSIM4jtweffGiven) + model->BSIM4jtweff = 0.0; if (!model->BSIM4njtsGiven) model->BSIM4njts = 20.0; if (!model->BSIM4njtsswGiven) model->BSIM4njtssw = 20.0; if (!model->BSIM4njtsswgGiven) model->BSIM4njtsswg = 20.0; - if (!model->BSIM4njtsdGiven) + if (!model->BSIM4njtsdGiven) { if (model->BSIM4njtsGiven) model->BSIM4njtsd = model->BSIM4njts; - else - model->BSIM4njtsd = 20.0; + else + model->BSIM4njtsd = 20.0; } - if (!model->BSIM4njtsswdGiven) + if (!model->BSIM4njtsswdGiven) { if (model->BSIM4njtsswGiven) model->BSIM4njtsswd = model->BSIM4njtssw; - else - model->BSIM4njtsswd = 20.0; + else + model->BSIM4njtsswd = 20.0; } - if (!model->BSIM4njtsswgdGiven) + if (!model->BSIM4njtsswgdGiven) { if (model->BSIM4njtsswgGiven) model->BSIM4njtsswgd = model->BSIM4njtsswg; - else - model->BSIM4njtsswgd = 20.0; + else + model->BSIM4njtsswgd = 20.0; } if (!model->BSIM4xtssGiven) model->BSIM4xtss = 0.02; @@ -1876,26 +2027,26 @@ int nthreads; model->BSIM4tnjtssw = 0.0; if (!model->BSIM4tnjtsswgGiven) model->BSIM4tnjtsswg = 0.0; - if (!model->BSIM4tnjtsdGiven) + if (!model->BSIM4tnjtsdGiven) { if (model->BSIM4tnjtsGiven) model->BSIM4tnjtsd = model->BSIM4tnjts; - else - model->BSIM4tnjtsd = 0.0; + else + model->BSIM4tnjtsd = 0.0; } - if (!model->BSIM4tnjtsswdGiven) + if (!model->BSIM4tnjtsswdGiven) { if (model->BSIM4tnjtsswGiven) model->BSIM4tnjtsswd = model->BSIM4tnjtssw; - else - model->BSIM4tnjtsswd = 0.0; + else + model->BSIM4tnjtsswd = 0.0; } - if (!model->BSIM4tnjtsswgdGiven) + if (!model->BSIM4tnjtsswgdGiven) { if (model->BSIM4tnjtsswgGiven) model->BSIM4tnjtsswgd = model->BSIM4tnjtsswg; - else - model->BSIM4tnjtsswgd = 0.0; + else + model->BSIM4tnjtsswgd = 0.0; } if (!model->BSIM4vtssGiven) model->BSIM4vtss = 10.0; @@ -1911,17 +2062,17 @@ int nthreads; model->BSIM4vtsswgd = model->BSIM4vtsswgs; if (!model->BSIM4oxideTrapDensityAGiven) - { if (model->BSIM4type == NMOS) + { if (model->BSIM4type == NMOS) model->BSIM4oxideTrapDensityA = 6.25e41; else model->BSIM4oxideTrapDensityA= 6.188e40; - } + } if (!model->BSIM4oxideTrapDensityBGiven) - { if (model->BSIM4type == NMOS) + { if (model->BSIM4type == NMOS) model->BSIM4oxideTrapDensityB = 3.125e26; else model->BSIM4oxideTrapDensityB = 1.5e25; - } + } if (!model->BSIM4oxideTrapDensityCGiven) model->BSIM4oxideTrapDensityC = 8.75e9; if (!model->BSIM4emGiven) @@ -1977,7 +2128,7 @@ int nthreads; if (!model->BSIM4lodeta0Given) model->BSIM4lodeta0 = 1.0; - /* Well Proximity Effect */ + /* Well Proximity Effect */ if (!model->BSIM4webGiven) model->BSIM4web = 0.0; if (!model->BSIM4wecGiven) @@ -2019,14 +2170,14 @@ int nthreads; DMCIeff = model->BSIM4dmci; DMDGeff = model->BSIM4dmdg - model->BSIM4dmcgt; - /* + /* * End processing models and begin to loop * through all the instances of the model */ for (here = model->BSIM4instances; here != NULL ; here=here->BSIM4nextInstance) - { + { if (here->BSIM4owner == ARCHme) { /* allocate a chunk of the state vector */ here->BSIM4states = *states; @@ -2082,19 +2233,19 @@ int nthreads; /* Process instance model selectors, some * may override their global counterparts - */ + */ if (!here->BSIM4rbodyModGiven) here->BSIM4rbodyMod = model->BSIM4rbodyMod; 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); + model->BSIM4rbodyMod); } if (!here->BSIM4rgateModGiven) here->BSIM4rgateMod = model->BSIM4rgateMod; else if ((here->BSIM4rgateMod != 0) && (here->BSIM4rgateMod != 1) - && (here->BSIM4rgateMod != 2) && (here->BSIM4rgateMod != 3)) + && (here->BSIM4rgateMod != 2) && (here->BSIM4rgateMod != 3)) { here->BSIM4rgateMod = model->BSIM4rgateMod; printf("Warning: rgateMod has been set to its global value %d.\n", model->BSIM4rgateMod); @@ -2127,20 +2278,20 @@ int nthreads; here->BSIM4sb = 0.0; if (!here->BSIM4sdGiven) here->BSIM4sd = 2 * model->BSIM4dmcg; - /* Well Proximity Effect */ - if (!here->BSIM4scaGiven) + /* Well Proximity Effect */ + if (!here->BSIM4scaGiven) here->BSIM4sca = 0.0; - if (!here->BSIM4scbGiven) + if (!here->BSIM4scbGiven) here->BSIM4scb = 0.0; - if (!here->BSIM4sccGiven) + if (!here->BSIM4sccGiven) here->BSIM4scc = 0.0; - if (!here->BSIM4scGiven) + if (!here->BSIM4scGiven) here->BSIM4sc = 0.0; /* m */ /* process drain series resistance */ createNode = 0; if ( (model->BSIM4rdsMod != 0) - || (model->BSIM4tnoiMod != 0 && noiseAnalGiven)) + || (model->BSIM4tnoiMod == 1 && noiseAnalGiven)) { createNode = 1; } else if (model->BSIM4sheetResistance > 0) @@ -2182,7 +2333,7 @@ int nthreads; /* process source series resistance */ createNode = 0; if ( (model->BSIM4rdsMod != 0) - || (model->BSIM4tnoiMod != 0 && noiseAnalGiven)) + || (model->BSIM4tnoiMod == 1 && noiseAnalGiven)) { createNode = 1; } else if (model->BSIM4sheetResistance > 0) @@ -2250,11 +2401,11 @@ int nthreads; /* internal body nodes for body resistance model */ if ((here->BSIM4rbodyMod ==1) || (here->BSIM4rbodyMod ==2)) { if (here->BSIM4dbNode == 0) - { error = CKTmkVolt(ckt,&tmp,here->BSIM4name,"dbody"); + { error = CKTmkVolt(ckt,&tmp,here->BSIM4name,"dbody"); if(error) return(error); here->BSIM4dbNode = tmp->number; - } - if (here->BSIM4bNodePrime == 0) + } + if (here->BSIM4bNodePrime == 0) { error = CKTmkVolt(ckt,&tmp,here->BSIM4name,"body"); if(error) return(error); here->BSIM4bNodePrime = tmp->number; @@ -2269,29 +2420,30 @@ int nthreads; } } } - if (here->BSIM4sbNode == 0) + if (here->BSIM4sbNode == 0) { error = CKTmkVolt(ckt,&tmp,here->BSIM4name,"sbody"); if(error) return(error); here->BSIM4sbNode = tmp->number; } } - else - here->BSIM4dbNode = here->BSIM4bNodePrime = here->BSIM4sbNode - = here->BSIM4bNode; + else + here->BSIM4dbNode = here->BSIM4bNodePrime = here->BSIM4sbNode + = here->BSIM4bNode; /* NQS node */ if ((here->BSIM4trnqsMod) && (here->BSIM4qNode == 0)) - { error = CKTmkVolt(ckt,&tmp,here->BSIM4name,"charge"); + { error = CKTmkVolt(ckt,&tmp,here->BSIM4name,"charge"); if(error) return(error); here->BSIM4qNode = tmp->number; } - else - here->BSIM4qNode = 0; + else + here->BSIM4qNode = 0; + /* set Sparse Matrix Pointers * macro to make elements with built-in out-of-memory test */ #define TSTALLOC(ptr,first,second) \ -if((here->ptr = SMPmakeElt(matrix, here->first, here->second)) == NULL){\ +if((here->ptr = SMPmakeElt(matrix,here->first,here->second))==(double *)NULL){\ return(E_NOMEM);\ } @@ -2348,7 +2500,7 @@ if((here->ptr = SMPmakeElt(matrix, here->first, here->second)) == NULL){\ TSTALLOC(BSIM4GEgmPtr, BSIM4gNodeExt, BSIM4gNodeMid) TSTALLOC(BSIM4SPgmPtr, BSIM4sNodePrime, BSIM4gNodeMid) TSTALLOC(BSIM4BPgmPtr, BSIM4bNodePrime, BSIM4gNodeMid) - } + } if ((here->BSIM4rbodyMod ==1) || (here->BSIM4rbodyMod ==2)) { TSTALLOC(BSIM4DPdbPtr, BSIM4dNodePrime, BSIM4dbNode) @@ -2383,7 +2535,7 @@ if((here->ptr = SMPmakeElt(matrix, here->first, here->second)) == NULL){\ TSTALLOC(BSIM4SbpPtr, BSIM4sNode, BSIM4bNodePrime) } } - } /* end of loop through all the BSIM4 device models */ + } #ifdef USE_OMP4 if (!cp_getvar("num_threads", CP_NUM, &nthreads)) @@ -2430,7 +2582,9 @@ if((here->ptr = SMPmakeElt(matrix, here->first, here->second)) == NULL){\ } int -BSIM4unsetup(GENmodel *inModel, CKTcircuit *ckt) +BSIM4unsetup( +GENmodel *inModel, +CKTcircuit *ckt) { #ifndef HAS_BATCHSIM BSIM4model *model; diff --git a/src/spicelib/devices/bsim4/b4temp.c b/src/spicelib/devices/bsim4/b4temp.c index da25e8d85..4dc7b7992 100644 --- a/src/spicelib/devices/bsim4/b4temp.c +++ b/src/spicelib/devices/bsim4/b4temp.c @@ -1,13 +1,13 @@ -/**** BSIM4.6.2 Released by Wenwei Yang 07/31/2008 ****/ -/**** BSIM4.6.5 Update ngspice 09/22/2009 ****/ +/**** BSIM4.7.0 Released by Darsen Lu 04/08/2011 ****/ + /********** * Copyright 2006 Regents of the University of California. All rights reserved. - * File: b4temp.c of BSIM4.6.3. + * File: b4temp.c of BSIM4.7.0. * Author: 2000 Weidong Liu * Authors: 2001- Xuemei Xi, Mohan Dunga, Ali Niknejad, Chenming Hu. * Authors: 2006- Mohan Dunga, Ali Niknejad, Chenming Hu * Authors: 2007- Mohan Dunga, Wenwei Yang, Ali Niknejad, Chenming Hu - * Authors: 2008- Wenwei Yang, Ali Niknejad, Chenming Hu + * Authors: 2008- Wenwei Yang, Ali Niknejad, Chenming Hu * Project Director: Prof. Chenming Hu. * Modified by Xuemei Xi, 04/06/2001. * Modified by Xuemei Xi, 10/05/2001. @@ -18,6 +18,7 @@ * Modified by Mohan Dunga, 12/13/2006. * Modified by Mohan Dunga, Wenwei Yang, 05/18/2007. * Modified by Wenwei Yang, 07/31/2008. + * Modified by Tanvir Morshed, Darsen Lu 03/27/2011 **********/ @@ -30,7 +31,7 @@ #include "suffix.h" #define Kb 1.3806226e-23 -#define KboQ 8.617087e-5 +#define KboQ 8.617087e-5 #define EPS0 8.85418e-12 #define EPSSI 1.03594e-10 #define PI 3.141592654 @@ -49,9 +50,10 @@ } \ } - -static int -BSIM4DioIjthVjmEval(double Nvtm, double Ijth, double Isb, double XExpBV, double *Vjm) +int +BSIM4DioIjthVjmEval( +double Nvtm, double Ijth, double Isb, double XExpBV, +double *Vjm) { double Tb, Tc, EVjmovNv; @@ -84,7 +86,7 @@ double W_tmp, Inv_ODeff, OD_offset, dk2_lod, deta0_lod; double lnl, lnw, lnnf, rbpbx, rbpby, rbsbx, rbsby, rbdbx, rbdby,bodymode; double kvsat, wlod, sceff, Wdrn; double V0, lt1, ltw, Theta0, Delt_vth, Vth_NarrowW, Lpe_Vb, Vth; -double n, n0, Vgsteff, Vgs_eff, niter, toxpf, toxpi, Tcen, toxe, epsrox, vddeot; +double n,n0, Vgsteff, Vgs_eff, niter, toxpf, toxpi, Tcen, toxe, epsrox, vddeot; double vtfbphi2eot, phieot, TempRatioeot, Vtm0eot, Vtmeot,vbieot; int Size_Not_Found, i; @@ -92,20 +94,20 @@ int Size_Not_Found, i; /* loop through all the BSIM4 device models */ for (; model != NULL; model = model->BSIM4nextModel) { Temp = ckt->CKTtemp; - if (model->BSIM4SbulkJctPotential < 0.1) - { model->BSIM4SbulkJctPotential = 0.1; - fprintf(stderr, "Given pbs is less than 0.1. Pbs is set to 0.1.\n"); - } + if (model->BSIM4SbulkJctPotential < 0.1) + { model->BSIM4SbulkJctPotential = 0.1; + fprintf(stderr, "Given pbs is less than 0.1. Pbs is set to 0.1.\n"); + } if (model->BSIM4SsidewallJctPotential < 0.1) - { model->BSIM4SsidewallJctPotential = 0.1; - fprintf(stderr, "Given pbsws is less than 0.1. Pbsws is set to 0.1.\n"); - } + { model->BSIM4SsidewallJctPotential = 0.1; + fprintf(stderr, "Given pbsws is less than 0.1. Pbsws is set to 0.1.\n"); + } if (model->BSIM4SGatesidewallJctPotential < 0.1) - { model->BSIM4SGatesidewallJctPotential = 0.1; - fprintf(stderr, "Given pbswgs is less than 0.1. Pbswgs is set to 0.1.\n"); - } + { model->BSIM4SGatesidewallJctPotential = 0.1; + fprintf(stderr, "Given pbswgs is less than 0.1. Pbswgs is set to 0.1.\n"); + } - if (model->BSIM4DbulkJctPotential < 0.1) + if (model->BSIM4DbulkJctPotential < 0.1) { model->BSIM4DbulkJctPotential = 0.1; fprintf(stderr, "Given pbd is less than 0.1. Pbd is set to 0.1.\n"); } @@ -118,36 +120,55 @@ int Size_Not_Found, i; fprintf(stderr, "Given pbswgd is less than 0.1. Pbswgd is set to 0.1.\n"); } - if(model->BSIM4mtrlMod == 0) - { - if ((model->BSIM4toxeGiven) && (model->BSIM4toxpGiven) && (model->BSIM4dtoxGiven) - && (model->BSIM4toxe != (model->BSIM4toxp + model->BSIM4dtox))) - printf("Warning: toxe, toxp and dtox all given and toxe != toxp + dtox; dtox ignored.\n"); - else if ((model->BSIM4toxeGiven) && (!model->BSIM4toxpGiven)) - model->BSIM4toxp = model->BSIM4toxe - model->BSIM4dtox; - else if ((!model->BSIM4toxeGiven) && (model->BSIM4toxpGiven)) - model->BSIM4toxe = model->BSIM4toxp + model->BSIM4dtox; - } + if(model->BSIM4mtrlMod == 0) + { + if ((model->BSIM4toxeGiven) && (model->BSIM4toxpGiven) && (model->BSIM4dtoxGiven) + && (model->BSIM4toxe != (model->BSIM4toxp + model->BSIM4dtox))) + printf("Warning: toxe, toxp and dtox all given and toxe != toxp + dtox; dtox ignored.\n"); + else if ((model->BSIM4toxeGiven) && (!model->BSIM4toxpGiven)) + model->BSIM4toxp = model->BSIM4toxe - model->BSIM4dtox; + else if ((!model->BSIM4toxeGiven) && (model->BSIM4toxpGiven)){ + model->BSIM4toxe = model->BSIM4toxp + model->BSIM4dtox; + if (!model->BSIM4toxmGiven) /* v4.7 */ + model->BSIM4toxm = model->BSIM4toxe; + } + } + else if(model->BSIM4mtrlCompatMod != 0) /* v4.7 */ + { + T0 = model->BSIM4epsrox / 3.9; + if ((model->BSIM4eotGiven) && (model->BSIM4toxpGiven) && (model->BSIM4dtoxGiven) + && (ABS(model->BSIM4eot * T0 - (model->BSIM4toxp + model->BSIM4dtox)) > 1.0e-20)) + { + printf("Warning: eot, toxp and dtox all given and eot * EPSROX / 3.9 != toxp + dtox; dtox ignored.\n"); + } + else if ((model->BSIM4eotGiven) && (!model->BSIM4toxpGiven)) + model->BSIM4toxp = T0 * model->BSIM4eot - model->BSIM4dtox; + else if ((!model->BSIM4eotGiven) && (model->BSIM4toxpGiven)){ + model->BSIM4eot = (model->BSIM4toxp + model->BSIM4dtox) / T0; + if (!model->BSIM4toxmGiven) + model->BSIM4toxm = model->BSIM4eot; + } + } + + if(model->BSIM4mtrlMod) + { + epsrox = 3.9; + toxe = model->BSIM4eot; + epssub = EPS0 * model->BSIM4epsrsub; + } + else + { + epsrox = model->BSIM4epsrox; + toxe = model->BSIM4toxe; + epssub = EPSSI; + } - if(model->BSIM4mtrlMod) - { - epsrox = 3.9; - toxe = model->BSIM4eot; - epssub = EPS0 * model->BSIM4epsrsub; - } - else - { - epsrox = model->BSIM4epsrox; - toxe = model->BSIM4toxe; - epssub = EPSSI; - } - model->BSIM4coxe = epsrox * EPS0 / toxe; - if(model->BSIM4mtrlMod == 0) - model->BSIM4coxp = model->BSIM4epsrox * EPS0 / model->BSIM4toxp; + if(model->BSIM4mtrlMod == 0 || model->BSIM4mtrlCompatMod != 0) + model->BSIM4coxp = model->BSIM4epsrox * EPS0 / model->BSIM4toxp; - if (!model->BSIM4cgdoGiven) + if (!model->BSIM4cgdoGiven) { if (model->BSIM4dlcGiven && (model->BSIM4dlc > 0.0)) model->BSIM4cgdo = model->BSIM4dlc * model->BSIM4coxe - model->BSIM4cgdl ; @@ -166,50 +187,50 @@ int Size_Not_Found, i; model->pSizeDependParamKnot = NULL; pLastKnot = NULL; - Tnom = model->BSIM4tnom; - TRatio = Temp / Tnom; + Tnom = model->BSIM4tnom; + TRatio = Temp / Tnom; - model->BSIM4vcrit = CONSTvt0 * log(CONSTvt0 / (CONSTroot2 * 1.0e-14)); + model->BSIM4vcrit = CONSTvt0 * log(CONSTvt0 / (CONSTroot2 * 1.0e-14)); model->BSIM4factor1 = sqrt(epssub / (epsrox * EPS0)* toxe); Vtm0 = model->BSIM4vtm0 = KboQ * Tnom; - - if(model->BSIM4mtrlMod==0) - { - Eg0 = 1.16 - 7.02e-4 * Tnom * Tnom / (Tnom + 1108.0); - ni = 1.45e10 * (Tnom / 300.15) * sqrt(Tnom / 300.15) - * exp(21.5565981 - Eg0 / (2.0 * Vtm0)); - } - else - { - Eg0 = model->BSIM4bg0sub - model->BSIM4tbgasub * Tnom * Tnom - / (Tnom + model->BSIM4tbgbsub); - T0 = model->BSIM4bg0sub - model->BSIM4tbgasub * 90090.0225 - / (300.15 + model->BSIM4tbgbsub); - ni = model->BSIM4ni0sub * (Tnom / 300.15) * sqrt(Tnom / 300.15) - * exp((T0 - Eg0) / (2.0 * Vtm0)); - } - model->BSIM4Eg0 = Eg0; + if(model->BSIM4mtrlMod==0) + { + Eg0 = 1.16 - 7.02e-4 * Tnom * Tnom / (Tnom + 1108.0); + ni = 1.45e10 * (Tnom / 300.15) * sqrt(Tnom / 300.15) + * exp(21.5565981 - Eg0 / (2.0 * Vtm0)); + } + else + { + Eg0 = model->BSIM4bg0sub - model->BSIM4tbgasub * Tnom * Tnom + / (Tnom + model->BSIM4tbgbsub); + T0 = model->BSIM4bg0sub - model->BSIM4tbgasub * 90090.0225 + / (300.15 + model->BSIM4tbgbsub); + ni = model->BSIM4ni0sub * (Tnom / 300.15) * sqrt(Tnom / 300.15) + * exp((T0 - Eg0) / (2.0 * Vtm0)); + } + + model->BSIM4Eg0 = Eg0; model->BSIM4vtm = KboQ * Temp; - if(model->BSIM4mtrlMod == 0) - Eg = 1.16 - 7.02e-4 * Temp * Temp / (Temp + 1108.0); - else - Eg = model->BSIM4bg0sub - model->BSIM4tbgasub * Temp * Temp + if(model->BSIM4mtrlMod == 0) + Eg = 1.16 - 7.02e-4 * Temp * Temp / (Temp + 1108.0); + else + Eg = model->BSIM4bg0sub - model->BSIM4tbgasub * Temp * Temp / (Temp + model->BSIM4tbgbsub); - if (Temp != Tnom) - { T0 = Eg0 / Vtm0 - Eg / model->BSIM4vtm; - T1 = log(Temp / Tnom); - T2 = T0 + model->BSIM4SjctTempExponent * T1; - T3 = exp(T2 / model->BSIM4SjctEmissionCoeff); - model->BSIM4SjctTempSatCurDensity = model->BSIM4SjctSatCurDensity - * T3; - model->BSIM4SjctSidewallTempSatCurDensity - = model->BSIM4SjctSidewallSatCurDensity * T3; + if (Temp != Tnom) + { T0 = Eg0 / Vtm0 - Eg / model->BSIM4vtm; + T1 = log(Temp / Tnom); + T2 = T0 + model->BSIM4SjctTempExponent * T1; + T3 = exp(T2 / model->BSIM4SjctEmissionCoeff); + model->BSIM4SjctTempSatCurDensity = model->BSIM4SjctSatCurDensity + * T3; + model->BSIM4SjctSidewallTempSatCurDensity + = model->BSIM4SjctSidewallSatCurDensity * T3; model->BSIM4SjctGateSidewallTempSatCurDensity = model->BSIM4SjctGateSidewallSatCurDensity * T3; - T2 = T0 + model->BSIM4DjctTempExponent * T1; + T2 = T0 + model->BSIM4DjctTempExponent * T1; T3 = exp(T2 / model->BSIM4DjctEmissionCoeff); model->BSIM4DjctTempSatCurDensity = model->BSIM4DjctSatCurDensity * T3; @@ -217,11 +238,11 @@ int Size_Not_Found, i; = model->BSIM4DjctSidewallSatCurDensity * T3; model->BSIM4DjctGateSidewallTempSatCurDensity = model->BSIM4DjctGateSidewallSatCurDensity * T3; - } - else - { model->BSIM4SjctTempSatCurDensity = model->BSIM4SjctSatCurDensity; - model->BSIM4SjctSidewallTempSatCurDensity - = model->BSIM4SjctSidewallSatCurDensity; + } + else + { model->BSIM4SjctTempSatCurDensity = model->BSIM4SjctSatCurDensity; + model->BSIM4SjctSidewallTempSatCurDensity + = model->BSIM4SjctSidewallSatCurDensity; model->BSIM4SjctGateSidewallTempSatCurDensity = model->BSIM4SjctGateSidewallSatCurDensity; model->BSIM4DjctTempSatCurDensity = model->BSIM4DjctSatCurDensity; @@ -229,12 +250,12 @@ int Size_Not_Found, i; = model->BSIM4DjctSidewallSatCurDensity; model->BSIM4DjctGateSidewallTempSatCurDensity = model->BSIM4DjctGateSidewallSatCurDensity; - } + } - if (model->BSIM4SjctTempSatCurDensity < 0.0) - model->BSIM4SjctTempSatCurDensity = 0.0; - if (model->BSIM4SjctSidewallTempSatCurDensity < 0.0) - model->BSIM4SjctSidewallTempSatCurDensity = 0.0; + if (model->BSIM4SjctTempSatCurDensity < 0.0) + model->BSIM4SjctTempSatCurDensity = 0.0; + if (model->BSIM4SjctSidewallTempSatCurDensity < 0.0) + model->BSIM4SjctSidewallTempSatCurDensity = 0.0; if (model->BSIM4SjctGateSidewallTempSatCurDensity < 0.0) model->BSIM4SjctGateSidewallTempSatCurDensity = 0.0; if (model->BSIM4DjctTempSatCurDensity < 0.0) @@ -244,66 +265,66 @@ int Size_Not_Found, i; if (model->BSIM4DjctGateSidewallTempSatCurDensity < 0.0) model->BSIM4DjctGateSidewallTempSatCurDensity = 0.0; - /* Temperature dependence of D/B and S/B diode capacitance begins */ - delTemp = ckt->CKTtemp - model->BSIM4tnom; - T0 = model->BSIM4tcj * delTemp; - if (T0 >= -1.0) - { model->BSIM4SunitAreaTempJctCap = model->BSIM4SunitAreaJctCap *(1.0 + T0); /*bug_fix -JX */ + /* Temperature dependence of D/B and S/B diode capacitance begins */ + delTemp = ckt->CKTtemp - model->BSIM4tnom; + T0 = model->BSIM4tcj * delTemp; + if (T0 >= -1.0) + { model->BSIM4SunitAreaTempJctCap = model->BSIM4SunitAreaJctCap *(1.0 + T0); /*bug_fix -JX */ model->BSIM4DunitAreaTempJctCap = model->BSIM4DunitAreaJctCap *(1.0 + T0); - } - else - { if (model->BSIM4SunitAreaJctCap > 0.0) - { model->BSIM4SunitAreaTempJctCap = 0.0; - fprintf(stderr, "Temperature effect has caused cjs to be negative. Cjs is clamped to zero.\n"); + } + else + { if (model->BSIM4SunitAreaJctCap > 0.0) + { model->BSIM4SunitAreaTempJctCap = 0.0; + fprintf(stderr, "Temperature effect has caused cjs to be negative. Cjs is clamped to zero.\n"); } - if (model->BSIM4DunitAreaJctCap > 0.0) + if (model->BSIM4DunitAreaJctCap > 0.0) { model->BSIM4DunitAreaTempJctCap = 0.0; fprintf(stderr, "Temperature effect has caused cjd to be negative. Cjd is clamped to zero.\n"); } - } + } T0 = model->BSIM4tcjsw * delTemp; - if (model->BSIM4SunitLengthSidewallJctCap < 0.0)/*4.6.2*/ - {model->BSIM4SunitLengthSidewallJctCap = 0.0; - fprintf(stderr, "CJSWS is negative. Cjsws is clamped to zero.\n");} - if (model->BSIM4DunitLengthSidewallJctCap < 0.0) - {model->BSIM4DunitLengthSidewallJctCap = 0.0; - fprintf(stderr, "CJSWD is negative. Cjswd is clamped to zero.\n");} - if (T0 >= -1.0) - { model->BSIM4SunitLengthSidewallTempJctCap = model->BSIM4SunitLengthSidewallJctCap *(1.0 + T0); + if (model->BSIM4SunitLengthSidewallJctCap < 0.0)/*4.6.2*/ + {model->BSIM4SunitLengthSidewallJctCap = 0.0; + fprintf(stderr, "CJSWS is negative. Cjsws is clamped to zero.\n");} + if (model->BSIM4DunitLengthSidewallJctCap < 0.0) + {model->BSIM4DunitLengthSidewallJctCap = 0.0; + fprintf(stderr, "CJSWD is negative. Cjswd is clamped to zero.\n");} + if (T0 >= -1.0) + { model->BSIM4SunitLengthSidewallTempJctCap = model->BSIM4SunitLengthSidewallJctCap *(1.0 + T0); model->BSIM4DunitLengthSidewallTempJctCap = model->BSIM4DunitLengthSidewallJctCap *(1.0 + T0); - } - else - { if (model->BSIM4SunitLengthSidewallJctCap > 0.0) - { model->BSIM4SunitLengthSidewallTempJctCap = 0.0; - fprintf(stderr, "Temperature effect has caused cjsws to be negative. Cjsws is clamped to zero.\n"); - } - if (model->BSIM4DunitLengthSidewallJctCap > 0.0) + } + else + { if (model->BSIM4SunitLengthSidewallJctCap > 0.0) + { model->BSIM4SunitLengthSidewallTempJctCap = 0.0; + fprintf(stderr, "Temperature effect has caused cjsws to be negative. Cjsws is clamped to zero.\n"); + } + if (model->BSIM4DunitLengthSidewallJctCap > 0.0) { model->BSIM4DunitLengthSidewallTempJctCap = 0.0; fprintf(stderr, "Temperature effect has caused cjswd to be negative. Cjswd is clamped to zero.\n"); - } - } + } + } T0 = model->BSIM4tcjswg * delTemp; - if (T0 >= -1.0) - { model->BSIM4SunitLengthGateSidewallTempJctCap = model->BSIM4SunitLengthGateSidewallJctCap *(1.0 + T0); + if (T0 >= -1.0) + { model->BSIM4SunitLengthGateSidewallTempJctCap = model->BSIM4SunitLengthGateSidewallJctCap *(1.0 + T0); model->BSIM4DunitLengthGateSidewallTempJctCap = model->BSIM4DunitLengthGateSidewallJctCap *(1.0 + T0); - } - else - { if (model->BSIM4SunitLengthGateSidewallJctCap > 0.0) - { model->BSIM4SunitLengthGateSidewallTempJctCap = 0.0; - fprintf(stderr, "Temperature effect has caused cjswgs to be negative. Cjswgs is clamped to zero.\n"); - } - if (model->BSIM4DunitLengthGateSidewallJctCap > 0.0) + } + else + { if (model->BSIM4SunitLengthGateSidewallJctCap > 0.0) + { model->BSIM4SunitLengthGateSidewallTempJctCap = 0.0; + fprintf(stderr, "Temperature effect has caused cjswgs to be negative. Cjswgs is clamped to zero.\n"); + } + if (model->BSIM4DunitLengthGateSidewallJctCap > 0.0) { model->BSIM4DunitLengthGateSidewallTempJctCap = 0.0; fprintf(stderr, "Temperature effect has caused cjswgd to be negative. Cjswgd is clamped to zero.\n"); } - } + } model->BSIM4PhiBS = model->BSIM4SbulkJctPotential - - model->BSIM4tpb * delTemp; + - model->BSIM4tpb * delTemp; if (model->BSIM4PhiBS < 0.01) - { model->BSIM4PhiBS = 0.01; - fprintf(stderr, "Temperature effect has caused pbs to be less than 0.01. Pbs is clamped to 0.01.\n"); - } + { model->BSIM4PhiBS = 0.01; + fprintf(stderr, "Temperature effect has caused pbs to be less than 0.01. Pbs is clamped to 0.01.\n"); + } model->BSIM4PhiBD = model->BSIM4DbulkJctPotential - model->BSIM4tpb * delTemp; if (model->BSIM4PhiBD < 0.01) @@ -314,9 +335,9 @@ int Size_Not_Found, i; model->BSIM4PhiBSWS = model->BSIM4SsidewallJctPotential - model->BSIM4tpbsw * delTemp; if (model->BSIM4PhiBSWS <= 0.01) - { model->BSIM4PhiBSWS = 0.01; - fprintf(stderr, "Temperature effect has caused pbsws to be less than 0.01. Pbsws is clamped to 0.01.\n"); - } + { model->BSIM4PhiBSWS = 0.01; + fprintf(stderr, "Temperature effect has caused pbsws to be less than 0.01. Pbsws is clamped to 0.01.\n"); + } model->BSIM4PhiBSWD = model->BSIM4DsidewallJctPotential - model->BSIM4tpbsw * delTemp; if (model->BSIM4PhiBSWD <= 0.01) @@ -324,12 +345,12 @@ int Size_Not_Found, i; fprintf(stderr, "Temperature effect has caused pbswd to be less than 0.01. Pbswd is clamped to 0.01.\n"); } - model->BSIM4PhiBSWGS = model->BSIM4SGatesidewallJctPotential + model->BSIM4PhiBSWGS = model->BSIM4SGatesidewallJctPotential - model->BSIM4tpbswg * delTemp; if (model->BSIM4PhiBSWGS <= 0.01) - { model->BSIM4PhiBSWGS = 0.01; - fprintf(stderr, "Temperature effect has caused pbswgs to be less than 0.01. Pbswgs is clamped to 0.01.\n"); - } + { model->BSIM4PhiBSWGS = 0.01; + fprintf(stderr, "Temperature effect has caused pbswgs to be less than 0.01. Pbswgs is clamped to 0.01.\n"); + } model->BSIM4PhiBSWGD = model->BSIM4DGatesidewallJctPotential - model->BSIM4tpbswg * delTemp; if (model->BSIM4PhiBSWGD <= 0.01) @@ -346,7 +367,7 @@ int Size_Not_Found, i; { model->BSIM4ijthsfwd = 0.0; fprintf(stderr, "Ijthsfwd reset to %g.\n", model->BSIM4ijthsfwd); } - if (model->BSIM4ijthdrev <= 0.0) + if (model->BSIM4ijthdrev <= 0.0) { model->BSIM4ijthdrev = 0.0; fprintf(stderr, "Ijthdrev reset to %g.\n", model->BSIM4ijthdrev); } @@ -386,40 +407,41 @@ 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; - pSizeDependParamKnot = model->pSizeDependParamKnot; - Size_Not_Found = 1; - while ((pSizeDependParamKnot != NULL) && Size_Not_Found) - { if ((here->BSIM4l == pSizeDependParamKnot->Length) - && (here->BSIM4w == pSizeDependParamKnot->Width) - && (here->BSIM4nf == pSizeDependParamKnot->NFinger)) + here = here->BSIM4nextInstance) + { if (here->BSIM4owner != ARCHme) continue; + pSizeDependParamKnot = model->pSizeDependParamKnot; + Size_Not_Found = 1; + while ((pSizeDependParamKnot != NULL) && Size_Not_Found) + { if ((here->BSIM4l == pSizeDependParamKnot->Length) + && (here->BSIM4w == pSizeDependParamKnot->Width) + && (here->BSIM4nf == pSizeDependParamKnot->NFinger)) { Size_Not_Found = 0; - here->pParam = pSizeDependParamKnot; - pParam = here->pParam; /*bug-fix */ - } - else - { pLastKnot = pSizeDependParamKnot; - pSizeDependParamKnot = pSizeDependParamKnot->pNext; - } + here->pParam = pSizeDependParamKnot; + pParam = here->pParam; /*bug-fix */ + } + else + { pLastKnot = pSizeDependParamKnot; + pSizeDependParamKnot = pSizeDependParamKnot->pNext; + } } - /* stress effect */ - Ldrn = here->BSIM4l; - Wdrn = here->BSIM4w / here->BSIM4nf; + /* stress effect */ + Ldrn = here->BSIM4l; + Wdrn = here->BSIM4w / here->BSIM4nf; - if (Size_Not_Found) - { pParam = TMALLOC(struct bsim4SizeDependParam, 1); + if (Size_Not_Found) + { pParam = (struct bsim4SizeDependParam *)malloc( + sizeof(struct bsim4SizeDependParam)); if (pLastKnot == NULL) - model->pSizeDependParamKnot = pParam; + model->pSizeDependParamKnot = pParam; else - pLastKnot->pNext = pParam; + pLastKnot->pNext = pParam; pParam->pNext = NULL; here->pParam = pParam; pParam->Length = here->BSIM4l; pParam->Width = here->BSIM4w; - pParam->NFinger = here->BSIM4nf; + pParam->NFinger = here->BSIM4nf; Lnew = here->BSIM4l + model->BSIM4xl ; Wnew = here->BSIM4w / here->BSIM4nf + model->BSIM4xw; @@ -438,16 +460,16 @@ int Size_Not_Found, i; + model->BSIM4Wwl / (T2 * T3); pParam->BSIM4dw = model->BSIM4Wint + tmp1; tmp2 = model->BSIM4Wlc / T2 + model->BSIM4Wwc / T3 - + model->BSIM4Wwlc / (T2 * T3); + + model->BSIM4Wwlc / (T2 * T3); pParam->BSIM4dwc = model->BSIM4dwc + tmp2; pParam->BSIM4dwj = model->BSIM4dwj + tmp2; pParam->BSIM4leff = Lnew - 2.0 * pParam->BSIM4dl; if (pParam->BSIM4leff <= 0.0) - { IFuid namarray[2]; + { IFuid namarray[2]; namarray[0] = model->BSIM4modName; namarray[1] = here->BSIM4name; - SPfrontEnd->IFerror (ERR_FATAL, + (*(SPfrontEnd->IFerror))(ERR_FATAL, "BSIM4: mosfet %s, model %s: Effective channel length <= 0", namarray); return(E_BADPARM); @@ -455,10 +477,10 @@ int Size_Not_Found, i; pParam->BSIM4weff = Wnew - 2.0 * pParam->BSIM4dw; if (pParam->BSIM4weff <= 0.0) - { IFuid namarray[2]; + { IFuid namarray[2]; namarray[0] = model->BSIM4modName; namarray[1] = here->BSIM4name; - SPfrontEnd->IFerror (ERR_FATAL, + (*(SPfrontEnd->IFerror))(ERR_FATAL, "BSIM4: mosfet %s, model %s: Effective channel width <= 0", namarray); return(E_BADPARM); @@ -466,10 +488,10 @@ int Size_Not_Found, i; pParam->BSIM4leffCV = Lnew - 2.0 * pParam->BSIM4dlc; if (pParam->BSIM4leffCV <= 0.0) - { IFuid namarray[2]; + { IFuid namarray[2]; namarray[0] = model->BSIM4modName; namarray[1] = here->BSIM4name; - SPfrontEnd->IFerror (ERR_FATAL, + (*(SPfrontEnd->IFerror))(ERR_FATAL, "BSIM4: mosfet %s, model %s: Effective channel length for C-V <= 0", namarray); return(E_BADPARM); @@ -477,10 +499,10 @@ int Size_Not_Found, i; pParam->BSIM4weffCV = Wnew - 2.0 * pParam->BSIM4dwc; if (pParam->BSIM4weffCV <= 0.0) - { IFuid namarray[2]; + { IFuid namarray[2]; namarray[0] = model->BSIM4modName; namarray[1] = here->BSIM4name; - SPfrontEnd->IFerror (ERR_FATAL, + (*(SPfrontEnd->IFerror))(ERR_FATAL, "BSIM4: mosfet %s, model %s: Effective channel width for C-V <= 0", namarray); return(E_BADPARM); @@ -491,89 +513,93 @@ int Size_Not_Found, i; { IFuid namarray[2]; namarray[0] = model->BSIM4modName; namarray[1] = here->BSIM4name; - SPfrontEnd->IFerror (ERR_FATAL, + (*(SPfrontEnd->IFerror))(ERR_FATAL, "BSIM4: mosfet %s, model %s: Effective channel width for S/D junctions <= 0", namarray); return(E_BADPARM); } - if (model->BSIM4binUnit == 1) - { Inv_L = 1.0e-6 / pParam->BSIM4leff; - Inv_W = 1.0e-6 / pParam->BSIM4weff; - Inv_LW = 1.0e-12 / (pParam->BSIM4leff - * pParam->BSIM4weff); - } - else - { Inv_L = 1.0 / pParam->BSIM4leff; - Inv_W = 1.0 / pParam->BSIM4weff; - Inv_LW = 1.0 / (pParam->BSIM4leff - * pParam->BSIM4weff); - } - pParam->BSIM4cdsc = model->BSIM4cdsc - + model->BSIM4lcdsc * Inv_L - + model->BSIM4wcdsc * Inv_W - + model->BSIM4pcdsc * Inv_LW; - pParam->BSIM4cdscb = model->BSIM4cdscb - + model->BSIM4lcdscb * Inv_L - + model->BSIM4wcdscb * Inv_W - + model->BSIM4pcdscb * Inv_LW; - - pParam->BSIM4cdscd = model->BSIM4cdscd - + model->BSIM4lcdscd * Inv_L - + model->BSIM4wcdscd * Inv_W - + model->BSIM4pcdscd * Inv_LW; - - pParam->BSIM4cit = model->BSIM4cit - + model->BSIM4lcit * Inv_L - + model->BSIM4wcit * Inv_W - + model->BSIM4pcit * Inv_LW; - pParam->BSIM4nfactor = model->BSIM4nfactor - + model->BSIM4lnfactor * Inv_L - + model->BSIM4wnfactor * Inv_W - + model->BSIM4pnfactor * Inv_LW; - pParam->BSIM4xj = model->BSIM4xj - + model->BSIM4lxj * Inv_L - + model->BSIM4wxj * Inv_W - + model->BSIM4pxj * Inv_LW; - pParam->BSIM4vsat = model->BSIM4vsat - + model->BSIM4lvsat * Inv_L - + model->BSIM4wvsat * Inv_W - + model->BSIM4pvsat * Inv_LW; - pParam->BSIM4at = model->BSIM4at - + model->BSIM4lat * Inv_L - + model->BSIM4wat * Inv_W - + model->BSIM4pat * Inv_LW; - pParam->BSIM4a0 = model->BSIM4a0 - + model->BSIM4la0 * Inv_L - + model->BSIM4wa0 * Inv_W - + model->BSIM4pa0 * Inv_LW; - - pParam->BSIM4ags = model->BSIM4ags - + model->BSIM4lags * Inv_L - + model->BSIM4wags * Inv_W - + model->BSIM4pags * Inv_LW; - - pParam->BSIM4a1 = model->BSIM4a1 - + model->BSIM4la1 * Inv_L - + model->BSIM4wa1 * Inv_W - + model->BSIM4pa1 * Inv_LW; - pParam->BSIM4a2 = model->BSIM4a2 - + model->BSIM4la2 * Inv_L - + model->BSIM4wa2 * Inv_W - + model->BSIM4pa2 * Inv_LW; - pParam->BSIM4keta = model->BSIM4keta - + model->BSIM4lketa * Inv_L - + model->BSIM4wketa * Inv_W - + model->BSIM4pketa * Inv_LW; - pParam->BSIM4nsub = model->BSIM4nsub - + model->BSIM4lnsub * Inv_L - + model->BSIM4wnsub * Inv_W - + model->BSIM4pnsub * Inv_LW; - pParam->BSIM4ndep = model->BSIM4ndep - + model->BSIM4lndep * Inv_L - + model->BSIM4wndep * Inv_W - + model->BSIM4pndep * Inv_LW; + if (model->BSIM4binUnit == 1) + { Inv_L = 1.0e-6 / pParam->BSIM4leff; + Inv_W = 1.0e-6 / pParam->BSIM4weff; + Inv_LW = 1.0e-12 / (pParam->BSIM4leff + * pParam->BSIM4weff); + } + else + { Inv_L = 1.0 / pParam->BSIM4leff; + Inv_W = 1.0 / pParam->BSIM4weff; + Inv_LW = 1.0 / (pParam->BSIM4leff + * pParam->BSIM4weff); + } + pParam->BSIM4cdsc = model->BSIM4cdsc + + model->BSIM4lcdsc * Inv_L + + model->BSIM4wcdsc * Inv_W + + model->BSIM4pcdsc * Inv_LW; + pParam->BSIM4cdscb = model->BSIM4cdscb + + model->BSIM4lcdscb * Inv_L + + model->BSIM4wcdscb * Inv_W + + model->BSIM4pcdscb * Inv_LW; + + pParam->BSIM4cdscd = model->BSIM4cdscd + + model->BSIM4lcdscd * Inv_L + + model->BSIM4wcdscd * Inv_W + + model->BSIM4pcdscd * Inv_LW; + + pParam->BSIM4cit = model->BSIM4cit + + model->BSIM4lcit * Inv_L + + model->BSIM4wcit * Inv_W + + model->BSIM4pcit * Inv_LW; + pParam->BSIM4nfactor = model->BSIM4nfactor + + model->BSIM4lnfactor * Inv_L + + model->BSIM4wnfactor * Inv_W + + model->BSIM4pnfactor * Inv_LW; + pParam->BSIM4tnfactor = model->BSIM4tnfactor /* v4.7 */ + + model->BSIM4ltnfactor * Inv_L + + model->BSIM4wtnfactor * Inv_W + + model->BSIM4ptnfactor * Inv_LW; + pParam->BSIM4xj = model->BSIM4xj + + model->BSIM4lxj * Inv_L + + model->BSIM4wxj * Inv_W + + model->BSIM4pxj * Inv_LW; + pParam->BSIM4vsat = model->BSIM4vsat + + model->BSIM4lvsat * Inv_L + + model->BSIM4wvsat * Inv_W + + model->BSIM4pvsat * Inv_LW; + pParam->BSIM4at = model->BSIM4at + + model->BSIM4lat * Inv_L + + model->BSIM4wat * Inv_W + + model->BSIM4pat * Inv_LW; + pParam->BSIM4a0 = model->BSIM4a0 + + model->BSIM4la0 * Inv_L + + model->BSIM4wa0 * Inv_W + + model->BSIM4pa0 * Inv_LW; + + pParam->BSIM4ags = model->BSIM4ags + + model->BSIM4lags * Inv_L + + model->BSIM4wags * Inv_W + + model->BSIM4pags * Inv_LW; + + pParam->BSIM4a1 = model->BSIM4a1 + + model->BSIM4la1 * Inv_L + + model->BSIM4wa1 * Inv_W + + model->BSIM4pa1 * Inv_LW; + pParam->BSIM4a2 = model->BSIM4a2 + + model->BSIM4la2 * Inv_L + + model->BSIM4wa2 * Inv_W + + model->BSIM4pa2 * Inv_LW; + pParam->BSIM4keta = model->BSIM4keta + + model->BSIM4lketa * Inv_L + + model->BSIM4wketa * Inv_W + + model->BSIM4pketa * Inv_LW; + pParam->BSIM4nsub = model->BSIM4nsub + + model->BSIM4lnsub * Inv_L + + model->BSIM4wnsub * Inv_W + + model->BSIM4pnsub * Inv_LW; + pParam->BSIM4ndep = model->BSIM4ndep + + model->BSIM4lndep * Inv_L + + model->BSIM4wndep * Inv_W + + model->BSIM4pndep * Inv_LW; pParam->BSIM4nsd = model->BSIM4nsd + model->BSIM4lnsd * Inv_L + model->BSIM4wnsd * Inv_W @@ -582,70 +608,70 @@ int Size_Not_Found, i; + model->BSIM4lphin * Inv_L + model->BSIM4wphin * Inv_W + model->BSIM4pphin * Inv_LW; - pParam->BSIM4ngate = model->BSIM4ngate - + model->BSIM4lngate * Inv_L - + model->BSIM4wngate * Inv_W - + model->BSIM4pngate * Inv_LW; - pParam->BSIM4gamma1 = model->BSIM4gamma1 - + model->BSIM4lgamma1 * Inv_L - + model->BSIM4wgamma1 * Inv_W - + model->BSIM4pgamma1 * Inv_LW; - pParam->BSIM4gamma2 = model->BSIM4gamma2 - + model->BSIM4lgamma2 * Inv_L - + model->BSIM4wgamma2 * Inv_W - + model->BSIM4pgamma2 * Inv_LW; - pParam->BSIM4vbx = model->BSIM4vbx - + model->BSIM4lvbx * Inv_L - + model->BSIM4wvbx * Inv_W - + model->BSIM4pvbx * Inv_LW; - pParam->BSIM4vbm = model->BSIM4vbm - + model->BSIM4lvbm * Inv_L - + model->BSIM4wvbm * Inv_W - + model->BSIM4pvbm * Inv_LW; - pParam->BSIM4xt = model->BSIM4xt - + model->BSIM4lxt * Inv_L - + model->BSIM4wxt * Inv_W - + model->BSIM4pxt * Inv_LW; + pParam->BSIM4ngate = model->BSIM4ngate + + model->BSIM4lngate * Inv_L + + model->BSIM4wngate * Inv_W + + model->BSIM4pngate * Inv_LW; + pParam->BSIM4gamma1 = model->BSIM4gamma1 + + model->BSIM4lgamma1 * Inv_L + + model->BSIM4wgamma1 * Inv_W + + model->BSIM4pgamma1 * Inv_LW; + pParam->BSIM4gamma2 = model->BSIM4gamma2 + + model->BSIM4lgamma2 * Inv_L + + model->BSIM4wgamma2 * Inv_W + + model->BSIM4pgamma2 * Inv_LW; + pParam->BSIM4vbx = model->BSIM4vbx + + model->BSIM4lvbx * Inv_L + + model->BSIM4wvbx * Inv_W + + model->BSIM4pvbx * Inv_LW; + pParam->BSIM4vbm = model->BSIM4vbm + + model->BSIM4lvbm * Inv_L + + model->BSIM4wvbm * Inv_W + + model->BSIM4pvbm * Inv_LW; + pParam->BSIM4xt = model->BSIM4xt + + model->BSIM4lxt * Inv_L + + model->BSIM4wxt * Inv_W + + model->BSIM4pxt * Inv_LW; pParam->BSIM4vfb = model->BSIM4vfb + model->BSIM4lvfb * Inv_L + model->BSIM4wvfb * Inv_W + model->BSIM4pvfb * Inv_LW; - pParam->BSIM4k1 = model->BSIM4k1 - + model->BSIM4lk1 * Inv_L - + model->BSIM4wk1 * Inv_W - + model->BSIM4pk1 * Inv_LW; - pParam->BSIM4kt1 = model->BSIM4kt1 - + model->BSIM4lkt1 * Inv_L - + model->BSIM4wkt1 * Inv_W - + model->BSIM4pkt1 * Inv_LW; - pParam->BSIM4kt1l = model->BSIM4kt1l - + model->BSIM4lkt1l * Inv_L - + model->BSIM4wkt1l * Inv_W - + model->BSIM4pkt1l * Inv_LW; - pParam->BSIM4k2 = model->BSIM4k2 - + model->BSIM4lk2 * Inv_L - + model->BSIM4wk2 * Inv_W - + model->BSIM4pk2 * Inv_LW; - pParam->BSIM4kt2 = model->BSIM4kt2 - + model->BSIM4lkt2 * Inv_L - + model->BSIM4wkt2 * Inv_W - + model->BSIM4pkt2 * Inv_LW; - pParam->BSIM4k3 = model->BSIM4k3 - + model->BSIM4lk3 * Inv_L - + model->BSIM4wk3 * Inv_W - + model->BSIM4pk3 * Inv_LW; - pParam->BSIM4k3b = model->BSIM4k3b - + model->BSIM4lk3b * Inv_L - + model->BSIM4wk3b * Inv_W - + model->BSIM4pk3b * Inv_LW; - pParam->BSIM4w0 = model->BSIM4w0 - + model->BSIM4lw0 * Inv_L - + model->BSIM4ww0 * Inv_W - + model->BSIM4pw0 * Inv_LW; - pParam->BSIM4lpe0 = model->BSIM4lpe0 - + model->BSIM4llpe0 * Inv_L - + model->BSIM4wlpe0 * Inv_W - + model->BSIM4plpe0 * Inv_LW; + pParam->BSIM4k1 = model->BSIM4k1 + + model->BSIM4lk1 * Inv_L + + model->BSIM4wk1 * Inv_W + + model->BSIM4pk1 * Inv_LW; + pParam->BSIM4kt1 = model->BSIM4kt1 + + model->BSIM4lkt1 * Inv_L + + model->BSIM4wkt1 * Inv_W + + model->BSIM4pkt1 * Inv_LW; + pParam->BSIM4kt1l = model->BSIM4kt1l + + model->BSIM4lkt1l * Inv_L + + model->BSIM4wkt1l * Inv_W + + model->BSIM4pkt1l * Inv_LW; + pParam->BSIM4k2 = model->BSIM4k2 + + model->BSIM4lk2 * Inv_L + + model->BSIM4wk2 * Inv_W + + model->BSIM4pk2 * Inv_LW; + pParam->BSIM4kt2 = model->BSIM4kt2 + + model->BSIM4lkt2 * Inv_L + + model->BSIM4wkt2 * Inv_W + + model->BSIM4pkt2 * Inv_LW; + pParam->BSIM4k3 = model->BSIM4k3 + + model->BSIM4lk3 * Inv_L + + model->BSIM4wk3 * Inv_W + + model->BSIM4pk3 * Inv_LW; + pParam->BSIM4k3b = model->BSIM4k3b + + model->BSIM4lk3b * Inv_L + + model->BSIM4wk3b * Inv_W + + model->BSIM4pk3b * Inv_LW; + pParam->BSIM4w0 = model->BSIM4w0 + + model->BSIM4lw0 * Inv_L + + model->BSIM4ww0 * Inv_W + + model->BSIM4pw0 * Inv_LW; + pParam->BSIM4lpe0 = model->BSIM4lpe0 + + model->BSIM4llpe0 * Inv_L + + model->BSIM4wlpe0 * Inv_W + + model->BSIM4plpe0 * Inv_LW; pParam->BSIM4lpeb = model->BSIM4lpeb + model->BSIM4llpeb * Inv_L + model->BSIM4wlpeb * Inv_W @@ -658,112 +684,128 @@ int Size_Not_Found, i; + model->BSIM4ldvtp1 * Inv_L + model->BSIM4wdvtp1 * Inv_W + model->BSIM4pdvtp1 * Inv_LW; - pParam->BSIM4dvt0 = model->BSIM4dvt0 - + model->BSIM4ldvt0 * Inv_L - + model->BSIM4wdvt0 * Inv_W - + model->BSIM4pdvt0 * Inv_LW; - pParam->BSIM4dvt1 = model->BSIM4dvt1 - + model->BSIM4ldvt1 * Inv_L - + model->BSIM4wdvt1 * Inv_W - + model->BSIM4pdvt1 * Inv_LW; - pParam->BSIM4dvt2 = model->BSIM4dvt2 - + model->BSIM4ldvt2 * Inv_L - + model->BSIM4wdvt2 * Inv_W - + model->BSIM4pdvt2 * Inv_LW; - pParam->BSIM4dvt0w = model->BSIM4dvt0w - + model->BSIM4ldvt0w * Inv_L - + model->BSIM4wdvt0w * Inv_W - + model->BSIM4pdvt0w * Inv_LW; - pParam->BSIM4dvt1w = model->BSIM4dvt1w - + model->BSIM4ldvt1w * Inv_L - + model->BSIM4wdvt1w * Inv_W - + model->BSIM4pdvt1w * Inv_LW; - pParam->BSIM4dvt2w = model->BSIM4dvt2w - + model->BSIM4ldvt2w * Inv_L - + model->BSIM4wdvt2w * Inv_W - + model->BSIM4pdvt2w * Inv_LW; - pParam->BSIM4drout = model->BSIM4drout - + model->BSIM4ldrout * Inv_L - + model->BSIM4wdrout * Inv_W - + model->BSIM4pdrout * Inv_LW; - pParam->BSIM4dsub = model->BSIM4dsub - + model->BSIM4ldsub * Inv_L - + model->BSIM4wdsub * Inv_W - + model->BSIM4pdsub * Inv_LW; - pParam->BSIM4vth0 = model->BSIM4vth0 - + model->BSIM4lvth0 * Inv_L - + model->BSIM4wvth0 * Inv_W - + model->BSIM4pvth0 * Inv_LW; - pParam->BSIM4ua = model->BSIM4ua - + model->BSIM4lua * Inv_L - + model->BSIM4wua * Inv_W - + model->BSIM4pua * Inv_LW; - pParam->BSIM4ua1 = model->BSIM4ua1 - + model->BSIM4lua1 * Inv_L - + model->BSIM4wua1 * Inv_W - + model->BSIM4pua1 * Inv_LW; - pParam->BSIM4ub = model->BSIM4ub - + model->BSIM4lub * Inv_L - + model->BSIM4wub * Inv_W - + model->BSIM4pub * Inv_LW; - pParam->BSIM4ub1 = model->BSIM4ub1 - + model->BSIM4lub1 * Inv_L - + model->BSIM4wub1 * Inv_W - + model->BSIM4pub1 * Inv_LW; - pParam->BSIM4uc = model->BSIM4uc - + model->BSIM4luc * Inv_L - + model->BSIM4wuc * Inv_W - + model->BSIM4puc * Inv_LW; - pParam->BSIM4uc1 = model->BSIM4uc1 - + 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->BSIM4dvtp2 = model->BSIM4dvtp2 /* v4.7 */ + + model->BSIM4ldvtp2 * Inv_L + + model->BSIM4wdvtp2 * Inv_W + + model->BSIM4pdvtp2 * Inv_LW; + pParam->BSIM4dvtp3 = model->BSIM4dvtp3 /* v4.7 */ + + model->BSIM4ldvtp3 * Inv_L + + model->BSIM4wdvtp3 * Inv_W + + model->BSIM4pdvtp3 * Inv_LW; + pParam->BSIM4dvtp4 = model->BSIM4dvtp4 /* v4.7 */ + + model->BSIM4ldvtp4 * Inv_L + + model->BSIM4wdvtp4 * Inv_W + + model->BSIM4pdvtp4 * Inv_LW; + pParam->BSIM4dvtp5 = model->BSIM4dvtp5 /* v4.7 */ + + model->BSIM4ldvtp5 * Inv_L + + model->BSIM4wdvtp5 * Inv_W + + model->BSIM4pdvtp5 * Inv_LW; + pParam->BSIM4dvt0 = model->BSIM4dvt0 + + model->BSIM4ldvt0 * Inv_L + + model->BSIM4wdvt0 * Inv_W + + model->BSIM4pdvt0 * Inv_LW; + pParam->BSIM4dvt1 = model->BSIM4dvt1 + + model->BSIM4ldvt1 * Inv_L + + model->BSIM4wdvt1 * Inv_W + + model->BSIM4pdvt1 * Inv_LW; + pParam->BSIM4dvt2 = model->BSIM4dvt2 + + model->BSIM4ldvt2 * Inv_L + + model->BSIM4wdvt2 * Inv_W + + model->BSIM4pdvt2 * Inv_LW; + pParam->BSIM4dvt0w = model->BSIM4dvt0w + + model->BSIM4ldvt0w * Inv_L + + model->BSIM4wdvt0w * Inv_W + + model->BSIM4pdvt0w * Inv_LW; + pParam->BSIM4dvt1w = model->BSIM4dvt1w + + model->BSIM4ldvt1w * Inv_L + + model->BSIM4wdvt1w * Inv_W + + model->BSIM4pdvt1w * Inv_LW; + pParam->BSIM4dvt2w = model->BSIM4dvt2w + + model->BSIM4ldvt2w * Inv_L + + model->BSIM4wdvt2w * Inv_W + + model->BSIM4pdvt2w * Inv_LW; + pParam->BSIM4drout = model->BSIM4drout + + model->BSIM4ldrout * Inv_L + + model->BSIM4wdrout * Inv_W + + model->BSIM4pdrout * Inv_LW; + pParam->BSIM4dsub = model->BSIM4dsub + + model->BSIM4ldsub * Inv_L + + model->BSIM4wdsub * Inv_W + + model->BSIM4pdsub * Inv_LW; + pParam->BSIM4vth0 = model->BSIM4vth0 + + model->BSIM4lvth0 * Inv_L + + model->BSIM4wvth0 * Inv_W + + model->BSIM4pvth0 * Inv_LW; + pParam->BSIM4ua = model->BSIM4ua + + model->BSIM4lua * Inv_L + + model->BSIM4wua * Inv_W + + model->BSIM4pua * Inv_LW; + pParam->BSIM4ua1 = model->BSIM4ua1 + + model->BSIM4lua1 * Inv_L + + model->BSIM4wua1 * Inv_W + + model->BSIM4pua1 * Inv_LW; + pParam->BSIM4ub = model->BSIM4ub + + model->BSIM4lub * Inv_L + + model->BSIM4wub * Inv_W + + model->BSIM4pub * Inv_LW; + pParam->BSIM4ub1 = model->BSIM4ub1 + + model->BSIM4lub1 * Inv_L + + model->BSIM4wub1 * Inv_W + + model->BSIM4pub1 * Inv_LW; + pParam->BSIM4uc = model->BSIM4uc + + model->BSIM4luc * Inv_L + + model->BSIM4wuc * Inv_W + + model->BSIM4puc * Inv_LW; + pParam->BSIM4uc1 = model->BSIM4uc1 + + 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 + model->BSIM4peu * Inv_LW; - pParam->BSIM4u0 = model->BSIM4u0 - + model->BSIM4lu0 * Inv_L - + model->BSIM4wu0 * Inv_W - + model->BSIM4pu0 * Inv_LW; - pParam->BSIM4ute = model->BSIM4ute - + model->BSIM4lute * Inv_L - + model->BSIM4wute * Inv_W - + model->BSIM4pute * Inv_LW; - /*high k mobility*/ - pParam->BSIM4ucs = model->BSIM4ucs - + model->BSIM4lucs * Inv_L - + model->BSIM4wucs * Inv_W - + model->BSIM4pucs * Inv_LW; - pParam->BSIM4ucste = model->BSIM4ucste - + model->BSIM4lucste * Inv_L - + model->BSIM4wucste * Inv_W - + model->BSIM4pucste * Inv_LW; - - pParam->BSIM4voff = model->BSIM4voff - + 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->BSIM4u0 = model->BSIM4u0 + + model->BSIM4lu0 * Inv_L + + model->BSIM4wu0 * Inv_W + + model->BSIM4pu0 * Inv_LW; + pParam->BSIM4ute = model->BSIM4ute + + model->BSIM4lute * Inv_L + + model->BSIM4wute * Inv_W + + model->BSIM4pute * Inv_LW; + /*high k mobility*/ + pParam->BSIM4ucs = model->BSIM4ucs + + model->BSIM4lucs * Inv_L + + model->BSIM4wucs * Inv_W + + model->BSIM4pucs * Inv_LW; + pParam->BSIM4ucste = model->BSIM4ucste + + model->BSIM4lucste * Inv_L + + model->BSIM4wucste * Inv_W + + model->BSIM4pucste * Inv_LW; + + pParam->BSIM4voff = model->BSIM4voff + + 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 @@ -772,7 +814,7 @@ int Size_Not_Found, i; + model->BSIM4lminvcv * Inv_L + model->BSIM4wminvcv * Inv_W + model->BSIM4pminvcv * Inv_LW; - pParam->BSIM4fprout = model->BSIM4fprout + pParam->BSIM4fprout = model->BSIM4fprout + model->BSIM4lfprout * Inv_L + model->BSIM4wfprout * Inv_W + model->BSIM4pfprout * Inv_LW; @@ -784,14 +826,14 @@ int Size_Not_Found, i; + model->BSIM4lpditsd * Inv_L + model->BSIM4wpditsd * Inv_W + model->BSIM4ppditsd * Inv_LW; - pParam->BSIM4delta = model->BSIM4delta - + model->BSIM4ldelta * Inv_L - + model->BSIM4wdelta * Inv_W - + model->BSIM4pdelta * Inv_LW; - pParam->BSIM4rdsw = model->BSIM4rdsw - + model->BSIM4lrdsw * Inv_L - + model->BSIM4wrdsw * Inv_W - + model->BSIM4prdsw * Inv_LW; + pParam->BSIM4delta = model->BSIM4delta + + model->BSIM4ldelta * Inv_L + + model->BSIM4wdelta * Inv_W + + model->BSIM4pdelta * Inv_LW; + pParam->BSIM4rdsw = model->BSIM4rdsw + + model->BSIM4lrdsw * Inv_L + + model->BSIM4wrdsw * Inv_W + + model->BSIM4prdsw * Inv_LW; pParam->BSIM4rdw = model->BSIM4rdw + model->BSIM4lrdw * Inv_L + model->BSIM4wrdw * Inv_W @@ -800,86 +842,90 @@ int Size_Not_Found, i; + model->BSIM4lrsw * Inv_L + model->BSIM4wrsw * Inv_W + model->BSIM4prsw * Inv_LW; - pParam->BSIM4prwg = model->BSIM4prwg - + model->BSIM4lprwg * Inv_L - + model->BSIM4wprwg * Inv_W - + model->BSIM4pprwg * Inv_LW; - pParam->BSIM4prwb = model->BSIM4prwb - + model->BSIM4lprwb * Inv_L - + model->BSIM4wprwb * Inv_W - + model->BSIM4pprwb * Inv_LW; - pParam->BSIM4prt = model->BSIM4prt - + model->BSIM4lprt * Inv_L - + model->BSIM4wprt * Inv_W - + model->BSIM4pprt * Inv_LW; - pParam->BSIM4eta0 = model->BSIM4eta0 - + model->BSIM4leta0 * Inv_L - + model->BSIM4weta0 * Inv_W - + model->BSIM4peta0 * Inv_LW; - pParam->BSIM4etab = model->BSIM4etab - + model->BSIM4letab * Inv_L - + model->BSIM4wetab * Inv_W - + model->BSIM4petab * Inv_LW; - pParam->BSIM4pclm = model->BSIM4pclm - + model->BSIM4lpclm * Inv_L - + model->BSIM4wpclm * Inv_W - + model->BSIM4ppclm * Inv_LW; - pParam->BSIM4pdibl1 = model->BSIM4pdibl1 - + model->BSIM4lpdibl1 * Inv_L - + model->BSIM4wpdibl1 * Inv_W - + model->BSIM4ppdibl1 * Inv_LW; - pParam->BSIM4pdibl2 = model->BSIM4pdibl2 - + model->BSIM4lpdibl2 * Inv_L - + model->BSIM4wpdibl2 * Inv_W - + model->BSIM4ppdibl2 * Inv_LW; - pParam->BSIM4pdiblb = model->BSIM4pdiblb - + model->BSIM4lpdiblb * Inv_L - + model->BSIM4wpdiblb * Inv_W - + model->BSIM4ppdiblb * Inv_LW; - pParam->BSIM4pscbe1 = model->BSIM4pscbe1 - + model->BSIM4lpscbe1 * Inv_L - + model->BSIM4wpscbe1 * Inv_W - + model->BSIM4ppscbe1 * Inv_LW; - pParam->BSIM4pscbe2 = model->BSIM4pscbe2 - + model->BSIM4lpscbe2 * Inv_L - + model->BSIM4wpscbe2 * Inv_W - + model->BSIM4ppscbe2 * Inv_LW; - pParam->BSIM4pvag = model->BSIM4pvag - + model->BSIM4lpvag * Inv_L - + model->BSIM4wpvag * Inv_W - + model->BSIM4ppvag * Inv_LW; - pParam->BSIM4wr = model->BSIM4wr - + model->BSIM4lwr * Inv_L - + model->BSIM4wwr * Inv_W - + model->BSIM4pwr * Inv_LW; - pParam->BSIM4dwg = model->BSIM4dwg - + model->BSIM4ldwg * Inv_L - + model->BSIM4wdwg * Inv_W - + model->BSIM4pdwg * Inv_LW; - pParam->BSIM4dwb = model->BSIM4dwb - + model->BSIM4ldwb * Inv_L - + model->BSIM4wdwb * Inv_W - + model->BSIM4pdwb * Inv_LW; - pParam->BSIM4b0 = model->BSIM4b0 - + model->BSIM4lb0 * Inv_L - + model->BSIM4wb0 * Inv_W - + model->BSIM4pb0 * Inv_LW; - pParam->BSIM4b1 = model->BSIM4b1 - + model->BSIM4lb1 * Inv_L - + model->BSIM4wb1 * Inv_W - + model->BSIM4pb1 * Inv_LW; - pParam->BSIM4alpha0 = model->BSIM4alpha0 - + model->BSIM4lalpha0 * Inv_L - + model->BSIM4walpha0 * Inv_W - + model->BSIM4palpha0 * Inv_LW; + pParam->BSIM4prwg = model->BSIM4prwg + + model->BSIM4lprwg * Inv_L + + model->BSIM4wprwg * Inv_W + + model->BSIM4pprwg * Inv_LW; + pParam->BSIM4prwb = model->BSIM4prwb + + model->BSIM4lprwb * Inv_L + + model->BSIM4wprwb * Inv_W + + model->BSIM4pprwb * Inv_LW; + pParam->BSIM4prt = model->BSIM4prt + + model->BSIM4lprt * Inv_L + + model->BSIM4wprt * Inv_W + + model->BSIM4pprt * Inv_LW; + pParam->BSIM4eta0 = model->BSIM4eta0 + + model->BSIM4leta0 * Inv_L + + model->BSIM4weta0 * Inv_W + + model->BSIM4peta0 * Inv_LW; + pParam->BSIM4teta0 = model->BSIM4teta0 /* v4.7 */ + + model->BSIM4lteta0 * Inv_L + + model->BSIM4wteta0 * Inv_W + + model->BSIM4pteta0 * Inv_LW; + pParam->BSIM4etab = model->BSIM4etab + + model->BSIM4letab * Inv_L + + model->BSIM4wetab * Inv_W + + model->BSIM4petab * Inv_LW; + pParam->BSIM4pclm = model->BSIM4pclm + + model->BSIM4lpclm * Inv_L + + model->BSIM4wpclm * Inv_W + + model->BSIM4ppclm * Inv_LW; + pParam->BSIM4pdibl1 = model->BSIM4pdibl1 + + model->BSIM4lpdibl1 * Inv_L + + model->BSIM4wpdibl1 * Inv_W + + model->BSIM4ppdibl1 * Inv_LW; + pParam->BSIM4pdibl2 = model->BSIM4pdibl2 + + model->BSIM4lpdibl2 * Inv_L + + model->BSIM4wpdibl2 * Inv_W + + model->BSIM4ppdibl2 * Inv_LW; + pParam->BSIM4pdiblb = model->BSIM4pdiblb + + model->BSIM4lpdiblb * Inv_L + + model->BSIM4wpdiblb * Inv_W + + model->BSIM4ppdiblb * Inv_LW; + pParam->BSIM4pscbe1 = model->BSIM4pscbe1 + + model->BSIM4lpscbe1 * Inv_L + + model->BSIM4wpscbe1 * Inv_W + + model->BSIM4ppscbe1 * Inv_LW; + pParam->BSIM4pscbe2 = model->BSIM4pscbe2 + + model->BSIM4lpscbe2 * Inv_L + + model->BSIM4wpscbe2 * Inv_W + + model->BSIM4ppscbe2 * Inv_LW; + pParam->BSIM4pvag = model->BSIM4pvag + + model->BSIM4lpvag * Inv_L + + model->BSIM4wpvag * Inv_W + + model->BSIM4ppvag * Inv_LW; + pParam->BSIM4wr = model->BSIM4wr + + model->BSIM4lwr * Inv_L + + model->BSIM4wwr * Inv_W + + model->BSIM4pwr * Inv_LW; + pParam->BSIM4dwg = model->BSIM4dwg + + model->BSIM4ldwg * Inv_L + + model->BSIM4wdwg * Inv_W + + model->BSIM4pdwg * Inv_LW; + pParam->BSIM4dwb = model->BSIM4dwb + + model->BSIM4ldwb * Inv_L + + model->BSIM4wdwb * Inv_W + + model->BSIM4pdwb * Inv_LW; + pParam->BSIM4b0 = model->BSIM4b0 + + model->BSIM4lb0 * Inv_L + + model->BSIM4wb0 * Inv_W + + model->BSIM4pb0 * Inv_LW; + pParam->BSIM4b1 = model->BSIM4b1 + + model->BSIM4lb1 * Inv_L + + model->BSIM4wb1 * Inv_W + + model->BSIM4pb1 * Inv_LW; + pParam->BSIM4alpha0 = model->BSIM4alpha0 + + model->BSIM4lalpha0 * Inv_L + + model->BSIM4walpha0 * Inv_W + + model->BSIM4palpha0 * Inv_LW; pParam->BSIM4alpha1 = model->BSIM4alpha1 + model->BSIM4lalpha1 * Inv_L + model->BSIM4walpha1 * Inv_W + model->BSIM4palpha1 * Inv_LW; - pParam->BSIM4beta0 = model->BSIM4beta0 - + model->BSIM4lbeta0 * Inv_L - + model->BSIM4wbeta0 * Inv_W - + model->BSIM4pbeta0 * Inv_LW; + pParam->BSIM4beta0 = model->BSIM4beta0 + + model->BSIM4lbeta0 * Inv_L + + model->BSIM4wbeta0 * Inv_W + + model->BSIM4pbeta0 * Inv_LW; pParam->BSIM4agidl = model->BSIM4agidl + model->BSIM4lagidl * Inv_L + model->BSIM4wagidl * Inv_W @@ -896,6 +942,18 @@ int Size_Not_Found, i; + model->BSIM4legidl * Inv_L + model->BSIM4wegidl * Inv_W + model->BSIM4pegidl * Inv_LW; + pParam->BSIM4rgidl = model->BSIM4rgidl /* v4.7 New GIDL/GISL */ + + model->BSIM4lrgidl * Inv_L + + model->BSIM4wrgidl * Inv_W + + model->BSIM4prgidl * Inv_LW; + pParam->BSIM4kgidl = model->BSIM4kgidl /* v4.7 New GIDL/GISL */ + + model->BSIM4lkgidl * Inv_L + + model->BSIM4wkgidl * Inv_W + + model->BSIM4pkgidl * Inv_LW; + pParam->BSIM4fgidl = model->BSIM4fgidl /* v4.7 New GIDL/GISL */ + + model->BSIM4lfgidl * Inv_L + + model->BSIM4wfgidl * Inv_W + + model->BSIM4pfgidl * Inv_LW; pParam->BSIM4agisl = model->BSIM4agisl + model->BSIM4lagisl * Inv_L + model->BSIM4wagisl * Inv_W @@ -912,6 +970,18 @@ int Size_Not_Found, i; + model->BSIM4legisl * Inv_L + model->BSIM4wegisl * Inv_W + model->BSIM4pegisl * Inv_LW; + pParam->BSIM4rgisl = model->BSIM4rgisl /* v4.7 New GIDL/GISL */ + + model->BSIM4lrgisl * Inv_L + + model->BSIM4wrgisl * Inv_W + + model->BSIM4prgisl * Inv_LW; + pParam->BSIM4kgisl = model->BSIM4kgisl /* v4.7 New GIDL/GISL */ + + model->BSIM4lkgisl * Inv_L + + model->BSIM4wkgisl * Inv_W + + model->BSIM4pkgisl * Inv_LW; + pParam->BSIM4fgisl = model->BSIM4fgisl /* v4.7 New GIDL/GISL */ + + model->BSIM4lfgisl * Inv_L + + model->BSIM4wfgisl * Inv_W + + model->BSIM4pfgisl * Inv_LW; pParam->BSIM4aigc = model->BSIM4aigc + model->BSIM4laigc * Inv_L + model->BSIM4waigc * Inv_W @@ -1029,38 +1099,38 @@ int Size_Not_Found, i; + model->BSIM4wtvfbsdoff * Inv_W + model->BSIM4ptvfbsdoff * Inv_LW; - pParam->BSIM4cgsl = model->BSIM4cgsl - + model->BSIM4lcgsl * Inv_L - + model->BSIM4wcgsl * Inv_W - + model->BSIM4pcgsl * Inv_LW; - pParam->BSIM4cgdl = model->BSIM4cgdl - + model->BSIM4lcgdl * Inv_L - + model->BSIM4wcgdl * Inv_W - + model->BSIM4pcgdl * Inv_LW; - pParam->BSIM4ckappas = model->BSIM4ckappas - + model->BSIM4lckappas * Inv_L - + model->BSIM4wckappas * Inv_W - + model->BSIM4pckappas * Inv_LW; + pParam->BSIM4cgsl = model->BSIM4cgsl + + model->BSIM4lcgsl * Inv_L + + model->BSIM4wcgsl * Inv_W + + model->BSIM4pcgsl * Inv_LW; + pParam->BSIM4cgdl = model->BSIM4cgdl + + model->BSIM4lcgdl * Inv_L + + model->BSIM4wcgdl * Inv_W + + model->BSIM4pcgdl * Inv_LW; + pParam->BSIM4ckappas = model->BSIM4ckappas + + model->BSIM4lckappas * Inv_L + + model->BSIM4wckappas * Inv_W + + model->BSIM4pckappas * Inv_LW; pParam->BSIM4ckappad = model->BSIM4ckappad + model->BSIM4lckappad * Inv_L + model->BSIM4wckappad * Inv_W + model->BSIM4pckappad * Inv_LW; - pParam->BSIM4cf = model->BSIM4cf - + model->BSIM4lcf * Inv_L - + model->BSIM4wcf * Inv_W - + model->BSIM4pcf * Inv_LW; - pParam->BSIM4clc = model->BSIM4clc - + model->BSIM4lclc * Inv_L - + model->BSIM4wclc * Inv_W - + model->BSIM4pclc * Inv_LW; - pParam->BSIM4cle = model->BSIM4cle - + model->BSIM4lcle * Inv_L - + model->BSIM4wcle * Inv_W - + model->BSIM4pcle * Inv_LW; - pParam->BSIM4vfbcv = model->BSIM4vfbcv - + model->BSIM4lvfbcv * Inv_L - + model->BSIM4wvfbcv * Inv_W - + model->BSIM4pvfbcv * Inv_LW; + pParam->BSIM4cf = model->BSIM4cf + + model->BSIM4lcf * Inv_L + + model->BSIM4wcf * Inv_W + + model->BSIM4pcf * Inv_LW; + pParam->BSIM4clc = model->BSIM4clc + + model->BSIM4lclc * Inv_L + + model->BSIM4wclc * Inv_W + + model->BSIM4pclc * Inv_LW; + pParam->BSIM4cle = model->BSIM4cle + + model->BSIM4lcle * Inv_L + + model->BSIM4wcle * Inv_W + + model->BSIM4pcle * Inv_LW; + pParam->BSIM4vfbcv = model->BSIM4vfbcv + + model->BSIM4lvfbcv * Inv_L + + model->BSIM4wvfbcv * Inv_W + + model->BSIM4pvfbcv * Inv_LW; pParam->BSIM4acde = model->BSIM4acde + model->BSIM4lacde * Inv_L + model->BSIM4wacde * Inv_W @@ -1091,71 +1161,81 @@ int Size_Not_Found, i; + model->BSIM4pku0we * Inv_LW; pParam->BSIM4abulkCVfactor = 1.0 + pow((pParam->BSIM4clc - / pParam->BSIM4leffCV), - pParam->BSIM4cle); + / pParam->BSIM4leffCV), + pParam->BSIM4cle); - T0 = (TRatio - 1.0); + T0 = (TRatio - 1.0); - PowWeffWr = pow(pParam->BSIM4weffCJ * 1.0e6, pParam->BSIM4wr) * here->BSIM4nf; + PowWeffWr = pow(pParam->BSIM4weffCJ * 1.0e6, pParam->BSIM4wr) * here->BSIM4nf; - T1 = T2 = T3 = T4 = 0.0; - pParam->BSIM4ucs = pParam->BSIM4ucs * pow(TRatio, pParam->BSIM4ucste); - if(model->BSIM4tempMod == 0) { - 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) { - /* External Rd(V) */ - T1 = pParam->BSIM4rdw + T10; - T2 = model->BSIM4rdwmin + T10; - /* External Rs(V) */ - T3 = pParam->BSIM4rsw + T10; - T4 = model->BSIM4rswmin + T10; - } - /* Internal Rds(V) in IV */ - pParam->BSIM4rds0 = (pParam->BSIM4rdsw + T10) - * here->BSIM4nf / PowWeffWr; - pParam->BSIM4rdswmin = (model->BSIM4rdswmin + T10) - * here->BSIM4nf / PowWeffWr; - } else { - if (model->BSIM4tempMod == 3) - {pParam->BSIM4ua = pParam->BSIM4ua * pow(TRatio, pParam->BSIM4ua1) ; - pParam->BSIM4ub = pParam->BSIM4ub * pow(TRatio, pParam->BSIM4ub1); - pParam->BSIM4uc = pParam->BSIM4uc * pow(TRatio, pParam->BSIM4uc1); - pParam->BSIM4ud = pParam->BSIM4ud * pow(TRatio, pParam->BSIM4ud1); - } - else{ /* tempMod = 1, 2 */ - pParam->BSIM4ua = pParam->BSIM4ua * (1.0 + pParam->BSIM4ua1 * delTemp) ; - pParam->BSIM4ub = pParam->BSIM4ub * (1.0 + pParam->BSIM4ub1 * delTemp); - pParam->BSIM4uc = pParam->BSIM4uc * (1.0 + pParam->BSIM4uc1 * delTemp); - pParam->BSIM4ud = pParam->BSIM4ud * (1.0 + pParam->BSIM4ud1 * delTemp); - } - pParam->BSIM4vsattemp = pParam->BSIM4vsat * (1.0 - pParam->BSIM4at * delTemp); - T10 = 1.0 + pParam->BSIM4prt * delTemp; - if(model->BSIM4rdsMod) { - /* External Rd(V) */ - T1 = pParam->BSIM4rdw * T10; - T2 = model->BSIM4rdwmin * T10; - /* External Rs(V) */ - T3 = pParam->BSIM4rsw * T10; - T4 = model->BSIM4rswmin * T10; - } - /* Internal Rds(V) in IV */ - pParam->BSIM4rds0 = pParam->BSIM4rdsw * T10 * here->BSIM4nf / PowWeffWr; - pParam->BSIM4rdswmin = model->BSIM4rdswmin * T10 * here->BSIM4nf / PowWeffWr; + T1 = T2 = T3 = T4 = 0.0; + pParam->BSIM4ucs = pParam->BSIM4ucs * pow(TRatio, pParam->BSIM4ucste); + if(model->BSIM4tempMod == 0) + { + 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) + { + /* External Rd(V) */ + T1 = pParam->BSIM4rdw + T10; + T2 = model->BSIM4rdwmin + T10; + /* External Rs(V) */ + T3 = pParam->BSIM4rsw + T10; + T4 = model->BSIM4rswmin + T10; + } + /* Internal Rds(V) in IV */ + pParam->BSIM4rds0 = (pParam->BSIM4rdsw + T10) + * here->BSIM4nf / PowWeffWr; + pParam->BSIM4rdswmin = (model->BSIM4rdswmin + T10) + * here->BSIM4nf / PowWeffWr; } - if (T1 < 0.0) - { T1 = 0.0; - printf("Warning: Rdw at current temperature is negative; set to 0.\n"); - } - if (T2 < 0.0) + else + { + if (model->BSIM4tempMod == 3) + { + pParam->BSIM4ua = pParam->BSIM4ua * pow(TRatio, pParam->BSIM4ua1) ; + pParam->BSIM4ub = pParam->BSIM4ub * pow(TRatio, pParam->BSIM4ub1); + pParam->BSIM4uc = pParam->BSIM4uc * pow(TRatio, pParam->BSIM4uc1); + pParam->BSIM4ud = pParam->BSIM4ud * pow(TRatio, pParam->BSIM4ud1); + } + else + { + /* tempMod = 1, 2 */ + pParam->BSIM4ua = pParam->BSIM4ua * (1.0 + pParam->BSIM4ua1 * delTemp) ; + pParam->BSIM4ub = pParam->BSIM4ub * (1.0 + pParam->BSIM4ub1 * delTemp); + pParam->BSIM4uc = pParam->BSIM4uc * (1.0 + pParam->BSIM4uc1 * delTemp); + pParam->BSIM4ud = pParam->BSIM4ud * (1.0 + pParam->BSIM4ud1 * delTemp); + } + pParam->BSIM4vsattemp = pParam->BSIM4vsat * (1.0 - pParam->BSIM4at * delTemp); + T10 = 1.0 + pParam->BSIM4prt * delTemp; + if(model->BSIM4rdsMod) + { + /* External Rd(V) */ + T1 = pParam->BSIM4rdw * T10; + T2 = model->BSIM4rdwmin * T10; + + /* External Rs(V) */ + T3 = pParam->BSIM4rsw * T10; + T4 = model->BSIM4rswmin * T10; + } + /* Internal Rds(V) in IV */ + pParam->BSIM4rds0 = pParam->BSIM4rdsw * T10 * here->BSIM4nf / PowWeffWr; + pParam->BSIM4rdswmin = model->BSIM4rdswmin * T10 * here->BSIM4nf / PowWeffWr; + } + + if (T1 < 0.0) + { T1 = 0.0; + printf("Warning: Rdw at current temperature is negative; set to 0.\n"); + } + if (T2 < 0.0) { T2 = 0.0; printf("Warning: Rdwmin at current temperature is negative; set to 0.\n"); } - pParam->BSIM4rd0 = T1 / PowWeffWr; + pParam->BSIM4rd0 = T1 / PowWeffWr; pParam->BSIM4rdwmin = T2 / PowWeffWr; if (T3 < 0.0) { T3 = 0.0; @@ -1168,38 +1248,42 @@ int Size_Not_Found, i; pParam->BSIM4rs0 = T3 / PowWeffWr; pParam->BSIM4rswmin = T4 / PowWeffWr; - if (pParam->BSIM4u0 > 1.0) + if (pParam->BSIM4u0 > 1.0) pParam->BSIM4u0 = pParam->BSIM4u0 / 1.0e4; /* mobility channel length dependence */ T5 = 1.0 - pParam->BSIM4up * exp( - pParam->BSIM4leff / pParam->BSIM4lp); pParam->BSIM4u0temp = pParam->BSIM4u0 * T5 - * pow(TRatio, pParam->BSIM4ute); + * pow(TRatio, pParam->BSIM4ute); if (pParam->BSIM4eu < 0.0) { pParam->BSIM4eu = 0.0; - printf("Warning: eu has been negative; reset to 0.0.\n"); - } + printf("Warning: eu has been negative; reset to 0.0.\n"); + } if (pParam->BSIM4ucs < 0.0) { pParam->BSIM4ucs = 0.0; - printf("Warning: ucs has been negative; reset to 0.0.\n"); - } + printf("Warning: ucs 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); + pParam->BSIM4vfbsdoff = pParam->BSIM4vfbsdoff * (1.0 + pParam->BSIM4tvfbsdoff * delTemp); + pParam->BSIM4voff = pParam->BSIM4voff * (1.0 + pParam->BSIM4tvoff * delTemp); + + pParam->BSIM4nfactor = pParam->BSIM4nfactor + pParam->BSIM4tnfactor * delTemp / Tnom; /* v4.7 temp dep of leakage currents */ + pParam->BSIM4voffcv = pParam->BSIM4voffcv * (1.0 + pParam->BSIM4tvoffcv * delTemp); /* v4.7 temp dep of leakage currents */ + pParam->BSIM4eta0 = pParam->BSIM4eta0 + pParam->BSIM4teta0 * delTemp / Tnom; /* v4.7 temp dep of leakage currents */ /* Source End Velocity Limit */ - if((model->BSIM4vtlGiven) && (model->BSIM4vtl > 0.0) ) - { + if((model->BSIM4vtlGiven) && (model->BSIM4vtl > 0.0) ) + { if(model->BSIM4lc < 0.0) pParam->BSIM4lc = 0.0; else pParam->BSIM4lc = model->BSIM4lc ; T0 = pParam->BSIM4leff / (pParam->BSIM4xn * pParam->BSIM4leff + pParam->BSIM4lc); pParam->BSIM4tfactor = (1.0 - T0) / (1.0 + T0 ); - } + } pParam->BSIM4cgdo = (model->BSIM4cgdo + pParam->BSIM4cf) - * pParam->BSIM4weffCV; + * pParam->BSIM4weffCV; pParam->BSIM4cgso = (model->BSIM4cgso + pParam->BSIM4cf) - * pParam->BSIM4weffCV; + * pParam->BSIM4weffCV; pParam->BSIM4cgbo = model->BSIM4cgbo * pParam->BSIM4leffCV * here->BSIM4nf; if (!model->BSIM4ndepGiven && model->BSIM4gamma1Given) @@ -1207,51 +1291,51 @@ int Size_Not_Found, i; pParam->BSIM4ndep = 3.01248e22 * T0 * T0; } - pParam->BSIM4phi = Vtm0 * log(pParam->BSIM4ndep / ni) - + pParam->BSIM4phin + 0.4; + pParam->BSIM4phi = Vtm0 * log(pParam->BSIM4ndep / ni) + + pParam->BSIM4phin + 0.4; + + pParam->BSIM4sqrtPhi = sqrt(pParam->BSIM4phi); + pParam->BSIM4phis3 = pParam->BSIM4sqrtPhi * pParam->BSIM4phi; - pParam->BSIM4sqrtPhi = sqrt(pParam->BSIM4phi); - pParam->BSIM4phis3 = pParam->BSIM4sqrtPhi * pParam->BSIM4phi; - pParam->BSIM4Xdep0 = sqrt(2.0 * epssub / (Charge_q - * pParam->BSIM4ndep * 1.0e6)) - * pParam->BSIM4sqrtPhi; + * pParam->BSIM4ndep * 1.0e6)) + * pParam->BSIM4sqrtPhi; pParam->BSIM4sqrtXdep0 = sqrt(pParam->BSIM4Xdep0); - if(model->BSIM4mtrlMod == 0) - pParam->BSIM4litl = sqrt(3.0 * 3.9 / epsrox * pParam->BSIM4xj * toxe); - else - pParam->BSIM4litl = sqrt(model->BSIM4epsrsub/epsrox * pParam->BSIM4xj * toxe); + if(model->BSIM4mtrlMod == 0) + pParam->BSIM4litl = sqrt(3.0 * 3.9 / epsrox * pParam->BSIM4xj * toxe); + else + pParam->BSIM4litl = sqrt(model->BSIM4epsrsub/epsrox * pParam->BSIM4xj * toxe); pParam->BSIM4vbi = Vtm0 * log(pParam->BSIM4nsd - * pParam->BSIM4ndep / (ni * ni)); + * pParam->BSIM4ndep / (ni * ni)); - if (model->BSIM4mtrlMod == 0) - { - if (pParam->BSIM4ngate > 0.0) - { pParam->BSIM4vfbsd = Vtm0 * log(pParam->BSIM4ngate + if (model->BSIM4mtrlMod == 0) + { + if (pParam->BSIM4ngate > 0.0) + { pParam->BSIM4vfbsd = Vtm0 * log(pParam->BSIM4ngate / pParam->BSIM4nsd); - } - else - pParam->BSIM4vfbsd = 0.0; - } - else - { - T0 = Vtm0 * log(pParam->BSIM4nsd/ni); - T1 = 0.5 * Eg0; - if(T0 > T1) - T0 = T1; - T2 = model->BSIM4easub + T1 - model->BSIM4type * T0; - pParam->BSIM4vfbsd = model->BSIM4phig - T2; - } + } + else + pParam->BSIM4vfbsd = 0.0; + } + else + { + T0 = Vtm0 * log(pParam->BSIM4nsd/ni); + T1 = 0.5 * Eg0; + if(T0 > T1) + T0 = T1; + T2 = model->BSIM4easub + T1 - model->BSIM4type * T0; + pParam->BSIM4vfbsd = model->BSIM4phig - T2; + } pParam->BSIM4cdep0 = sqrt(Charge_q * epssub - * pParam->BSIM4ndep * 1.0e6 / 2.0 - / pParam->BSIM4phi); + * pParam->BSIM4ndep * 1.0e6 / 2.0 + / pParam->BSIM4phi); pParam->BSIM4ToxRatio = exp(pParam->BSIM4ntox - * log(model->BSIM4toxref / toxe)) - / toxe / toxe; + * log(model->BSIM4toxref / toxe)) + / toxe / toxe; pParam->BSIM4ToxRatioEdge = exp(pParam->BSIM4ntox * log(model->BSIM4toxref / (toxe * pParam->BSIM4poxedge))) @@ -1260,13 +1344,13 @@ 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->BSIM4AechvbEdgeS = pParam->BSIM4Aechvb * pParam->BSIM4weff - * model->BSIM4dlcig * pParam->BSIM4ToxRatioEdge; + * model->BSIM4dlcig * pParam->BSIM4ToxRatioEdge; pParam->BSIM4AechvbEdgeD = pParam->BSIM4Aechvb * pParam->BSIM4weff - * model->BSIM4dlcigd * pParam->BSIM4ToxRatioEdge; + * model->BSIM4dlcigd * pParam->BSIM4ToxRatioEdge; pParam->BSIM4BechvbEdge = -pParam->BSIM4Bechvb - * toxe * pParam->BSIM4poxedge; + * toxe * pParam->BSIM4poxedge; pParam->BSIM4Aechvb *= pParam->BSIM4weff * pParam->BSIM4leff - * pParam->BSIM4ToxRatio; + * pParam->BSIM4ToxRatio; pParam->BSIM4Bechvb *= -toxe; @@ -1307,85 +1391,85 @@ int Size_Not_Found, i; } } else - { if (!model->BSIM4vbxGiven) - pParam->BSIM4vbx = pParam->BSIM4phi - 7.7348e-4 + { if (!model->BSIM4vbxGiven) + pParam->BSIM4vbx = pParam->BSIM4phi - 7.7348e-4 * pParam->BSIM4ndep - * pParam->BSIM4xt * pParam->BSIM4xt; - if (pParam->BSIM4vbx > 0.0) - pParam->BSIM4vbx = -pParam->BSIM4vbx; - if (pParam->BSIM4vbm > 0.0) + * pParam->BSIM4xt * pParam->BSIM4xt; + if (pParam->BSIM4vbx > 0.0) + pParam->BSIM4vbx = -pParam->BSIM4vbx; + if (pParam->BSIM4vbm > 0.0) pParam->BSIM4vbm = -pParam->BSIM4vbm; - + if (!model->BSIM4gamma1Given) pParam->BSIM4gamma1 = 5.753e-12 - * sqrt(pParam->BSIM4ndep) + * sqrt(pParam->BSIM4ndep) / model->BSIM4coxe; if (!model->BSIM4gamma2Given) pParam->BSIM4gamma2 = 5.753e-12 - * sqrt(pParam->BSIM4nsub) + * sqrt(pParam->BSIM4nsub) / model->BSIM4coxe; T0 = pParam->BSIM4gamma1 - pParam->BSIM4gamma2; T1 = sqrt(pParam->BSIM4phi - pParam->BSIM4vbx) - - pParam->BSIM4sqrtPhi; + - pParam->BSIM4sqrtPhi; T2 = sqrt(pParam->BSIM4phi * (pParam->BSIM4phi - - pParam->BSIM4vbm)) - pParam->BSIM4phi; + - pParam->BSIM4vbm)) - pParam->BSIM4phi; pParam->BSIM4k2 = T0 * T1 / (2.0 * T2 + pParam->BSIM4vbm); pParam->BSIM4k1 = pParam->BSIM4gamma2 - 2.0 - * pParam->BSIM4k2 * sqrt(pParam->BSIM4phi - - pParam->BSIM4vbm); + * pParam->BSIM4k2 * sqrt(pParam->BSIM4phi + - pParam->BSIM4vbm); } if (!model->BSIM4vfbGiven) - { - if (model->BSIM4vth0Given) + { + if (model->BSIM4vth0Given) { pParam->BSIM4vfb = model->BSIM4type * pParam->BSIM4vth0 - pParam->BSIM4phi - pParam->BSIM4k1 * pParam->BSIM4sqrtPhi; } else - { - if ((model->BSIM4mtrlMod) && (model->BSIM4phigGiven) && - (model->BSIM4nsubGiven)) - { - T0 = Vtm0 * log(pParam->BSIM4nsub/ni); - T1 = 0.5 * Eg0; - if(T0 > T1) - T0 = T1; - T2 = model->BSIM4easub + T1 + model->BSIM4type * T0; - pParam->BSIM4vfb = model->BSIM4phig - T2; - } - else - { - pParam->BSIM4vfb = -1.0; - } - } + { + if ((model->BSIM4mtrlMod) && (model->BSIM4phigGiven) && + (model->BSIM4nsubGiven)) + { + T0 = Vtm0 * log(pParam->BSIM4nsub/ni); + T1 = 0.5 * Eg0; + if(T0 > T1) + T0 = T1; + T2 = model->BSIM4easub + T1 + model->BSIM4type * T0; + pParam->BSIM4vfb = model->BSIM4phig - T2; + } + else + { + pParam->BSIM4vfb = -1.0; + } + } } if (!model->BSIM4vth0Given) { pParam->BSIM4vth0 = model->BSIM4type * (pParam->BSIM4vfb + pParam->BSIM4phi + pParam->BSIM4k1 * pParam->BSIM4sqrtPhi); } - + pParam->BSIM4k1ox = pParam->BSIM4k1 * toxe / model->BSIM4toxm; tmp = sqrt(epssub / (epsrox * EPS0) * toxe * pParam->BSIM4Xdep0); - T0 = pParam->BSIM4dsub * pParam->BSIM4leff / tmp; + T0 = pParam->BSIM4dsub * pParam->BSIM4leff / tmp; if (T0 < EXP_THRESHOLD) - { T1 = exp(T0); - T2 = T1 - 1.0; - T3 = T2 * T2; + { T1 = exp(T0); + T2 = T1 - 1.0; + T3 = T2 * T2; T4 = T3 + 2.0 * T1 * MIN_EXP; pParam->BSIM4theta0vb0 = T1 / T4; } else pParam->BSIM4theta0vb0 = 1.0 / (MAX_EXP - 2.0); - T0 = pParam->BSIM4drout * pParam->BSIM4leff / tmp; - if (T0 < EXP_THRESHOLD) - { T1 = exp(T0); - T2 = T1 - 1.0; + T0 = pParam->BSIM4drout * pParam->BSIM4leff / tmp; + if (T0 < EXP_THRESHOLD) + { T1 = exp(T0); + T2 = T1 - 1.0; T3 = T2 * T2; T4 = T3 + 2.0 * T1 * MIN_EXP; T5 = T1 / T4; @@ -1420,7 +1504,7 @@ int Size_Not_Found, i; T3 = T2 * T2; T4 = T3 + 2.0 * T1 * MIN_EXP; T9 = T1 / T4; - } + } else T9 = 1.0 / (MAX_EXP - 2.0); T9 = pParam->BSIM4dvt0 * T9 * tmp1; @@ -1430,25 +1514,25 @@ int Size_Not_Found, i; T0 = sqrt(1.0 + pParam->BSIM4lpe0 / pParam->BSIM4leff); if((model->BSIM4tempMod == 1) || (model->BSIM4tempMod == 0)) - T3 = (pParam->BSIM4kt1 + pParam->BSIM4kt1l / pParam->BSIM4leff) - * (TRatio - 1.0); + T3 = (pParam->BSIM4kt1 + pParam->BSIM4kt1l / pParam->BSIM4leff) + * (TRatio - 1.0); if((model->BSIM4tempMod == 2)||(model->BSIM4tempMod == 3)) T3 = - pParam->BSIM4kt1 * (TRatio - 1.0); T5 = pParam->BSIM4k1ox * (T0 - 1.0) * pParam->BSIM4sqrtPhi + T3; pParam->BSIM4vfbzbfactor = - T8 - T9 + pParam->BSIM4k3 * T4 + T5 - - pParam->BSIM4phi - pParam->BSIM4k1 * pParam->BSIM4sqrtPhi; + - pParam->BSIM4phi - pParam->BSIM4k1 * pParam->BSIM4sqrtPhi; - /* stress effect */ + /* 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; - } + 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 + wlod; + W_tmp = Wnew + wlod; T1 = pow(W_tmp, model->BSIM4wlodku0); tmp1 = model->BSIM4lku0 / T0 + model->BSIM4wku0 / T1 + model->BSIM4pku0 / (T0 * T1); @@ -1459,41 +1543,41 @@ int Size_Not_Found, i; tmp1 = model->BSIM4lkvth0 / T0 + model->BSIM4wkvth0 / T1 + model->BSIM4pkvth0 / (T0 * T1); pParam->BSIM4kvth0 = 1.0 + tmp1; - pParam->BSIM4kvth0 = sqrt(pParam->BSIM4kvth0*pParam->BSIM4kvth0 + DELTA); + pParam->BSIM4kvth0 = sqrt(pParam->BSIM4kvth0*pParam->BSIM4kvth0 + DELTA); T0 = (TRatio - 1.0); pParam->BSIM4ku0temp = pParam->BSIM4ku0 * (1.0 + model->BSIM4tku0 *T0) + DELTA; Inv_saref = 1.0/(model->BSIM4saref + 0.5*Ldrn); Inv_sbref = 1.0/(model->BSIM4sbref + 0.5*Ldrn); - pParam->BSIM4inv_od_ref = Inv_saref + Inv_sbref; - pParam->BSIM4rho_ref = model->BSIM4ku0 / pParam->BSIM4ku0temp * pParam->BSIM4inv_od_ref; + pParam->BSIM4inv_od_ref = Inv_saref + Inv_sbref; + pParam->BSIM4rho_ref = model->BSIM4ku0 / pParam->BSIM4ku0temp * pParam->BSIM4inv_od_ref; } /* End of SizeNotFound */ /* stress effect */ - if( (here->BSIM4sa > 0.0) && (here->BSIM4sb > 0.0) && - ((here->BSIM4nf == 1.0) || ((here->BSIM4nf > 1.0) && (here->BSIM4sd > 0.0))) ) - { Inv_sa = 0; - Inv_sb = 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; 1.0 is used.\n",model->BSIM4kvsat); - kvsat = 1.0; - } - - for(i = 0; i < here->BSIM4nf; i++){ - T0 = 1.0 / here->BSIM4nf / (here->BSIM4sa + 0.5*Ldrn + i * (here->BSIM4sd +Ldrn)); - T1 = 1.0 / here->BSIM4nf / (here->BSIM4sb + 0.5*Ldrn + i * (here->BSIM4sd +Ldrn)); - Inv_sa += T0; - Inv_sb += T1; + if( (here->BSIM4sa > 0.0) && (here->BSIM4sb > 0.0) && + ((here->BSIM4nf == 1.0) || ((here->BSIM4nf > 1.0) && (here->BSIM4sd > 0.0))) ) + { Inv_sa = 0; + Inv_sb = 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; 1.0 is used.\n",model->BSIM4kvsat); + kvsat = 1.0; + } + + for(i = 0; i < here->BSIM4nf; i++){ + T0 = 1.0 / here->BSIM4nf / (here->BSIM4sa + 0.5*Ldrn + i * (here->BSIM4sd +Ldrn)); + T1 = 1.0 / here->BSIM4nf / (here->BSIM4sb + 0.5*Ldrn + i * (here->BSIM4sd +Ldrn)); + Inv_sa += T0; + Inv_sb += T1; } - Inv_ODeff = Inv_sa + Inv_sb; + Inv_ODeff = Inv_sa + Inv_sb; rho = model->BSIM4ku0 / pParam->BSIM4ku0temp * Inv_ODeff; T0 = (1.0 + rho)/(1.0 + pParam->BSIM4rho_ref); here->BSIM4u0temp = pParam->BSIM4u0temp * T0; @@ -1501,83 +1585,83 @@ int Size_Not_Found, i; T1 = (1.0 + kvsat * rho)/(1.0 + kvsat * pParam->BSIM4rho_ref); here->BSIM4vsattemp = pParam->BSIM4vsattemp * T1; - OD_offset = Inv_ODeff - pParam->BSIM4inv_od_ref; - dvth0_lod = model->BSIM4kvth0 / pParam->BSIM4kvth0 * OD_offset; + OD_offset = Inv_ODeff - pParam->BSIM4inv_od_ref; + dvth0_lod = model->BSIM4kvth0 / pParam->BSIM4kvth0 * OD_offset; dk2_lod = model->BSIM4stk2 / pow(pParam->BSIM4kvth0, model->BSIM4lodk2) * OD_offset; deta0_lod = model->BSIM4steta0 / pow(pParam->BSIM4kvth0, model->BSIM4lodeta0) * OD_offset; - here->BSIM4vth0 = pParam->BSIM4vth0 + dvth0_lod; + here->BSIM4vth0 = pParam->BSIM4vth0 + dvth0_lod; here->BSIM4eta0 = pParam->BSIM4eta0 + deta0_lod; - here->BSIM4k2 = pParam->BSIM4k2 + dk2_lod; - } else { - here->BSIM4u0temp = pParam->BSIM4u0temp; + here->BSIM4k2 = pParam->BSIM4k2 + dk2_lod; + } else { + here->BSIM4u0temp = pParam->BSIM4u0temp; here->BSIM4vth0 = pParam->BSIM4vth0; here->BSIM4vsattemp = pParam->BSIM4vsattemp; here->BSIM4eta0 = pParam->BSIM4eta0; here->BSIM4k2 = pParam->BSIM4k2; } - /* Well Proximity Effect */ - if (model->BSIM4wpemod) + /* 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; + { 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 * here->BSIM4sc * T2) + - (0.05 * T1 + 0.0025 * model->BSIM4scref) * exp(-20.0 * T1 * T2) ) / Wdrn; - } else { + } else { fprintf(stderr, "Warning: No WPE as none of SCA, SCB, SCC, SC is given and/or SC not positive.\n"); - } - } - - if (here->BSIM4sca < 0.0) - { + } + } + + if (here->BSIM4sca < 0.0) + { printf("Warning: SCA = %g is negative. Set to 0.0.\n", here->BSIM4sca); here->BSIM4sca = 0.0; } if (here->BSIM4scb < 0.0) - { + { printf("Warning: SCB = %g is negative. Set to 0.0.\n", here->BSIM4scb); here->BSIM4scb = 0.0; } if (here->BSIM4scc < 0.0) - { + { printf("Warning: SCC = %g is negative. Set to 0.0.\n", here->BSIM4scc); here->BSIM4scc = 0.0; } if (here->BSIM4sc < 0.0) - { + { printf("Warning: SC = %g is negative. Set to 0.0.\n", here->BSIM4sc); here->BSIM4sc = 0.0; } - /*4.6.2*/ - sceff = here->BSIM4sca + model->BSIM4web * here->BSIM4scb + /*4.6.2*/ + 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; + 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; + } + here->BSIM4u0temp *= T3; } - /* adding delvto */ + /* adding delvto */ here->BSIM4vth0 += here->BSIM4delvto; here->BSIM4vfb = pParam->BSIM4vfb + model->BSIM4type * here->BSIM4delvto; - /* Instance variables calculation */ + /* Instance variables calculation */ T3 = model->BSIM4type * here->BSIM4vth0 - here->BSIM4vfb - pParam->BSIM4phi; T4 = T3 + T3; @@ -1605,57 +1689,57 @@ int Size_Not_Found, i; here->BSIM4k2ox = here->BSIM4k2 * toxe / model->BSIM4toxm; - here->BSIM4vfbzb = pParam->BSIM4vfbzbfactor - + model->BSIM4type * here->BSIM4vth0 ; - + here->BSIM4vfbzb = pParam->BSIM4vfbzbfactor + + model->BSIM4type * here->BSIM4vth0 ; + here->BSIM4cgso = pParam->BSIM4cgso; here->BSIM4cgdo = pParam->BSIM4cgdo; - - 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; + lnl = log(pParam->BSIM4leff * 1.0e6); + lnw = log(pParam->BSIM4weff * 1.0e6); + lnnf = log(here->BSIM4nf); - 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); + bodymode = 5; + if( ( !model->BSIM4rbps0Given) || + ( !model->BSIM4rbpd0Given) ) + bodymode = 1; + else + if( (!model->BSIM4rbsbx0Given && !model->BSIM4rbsby0Given) || + (!model->BSIM4rbdbx0Given && !model->BSIM4rbdby0Given) ) + bodymode = 3; - - 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(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); - 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); - } + + 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)) ) @@ -1682,8 +1766,8 @@ int Size_Not_Found, i; } - if((here->BSIM4rbodyMod == 2) && (bodymode == 3)) - { + if((here->BSIM4rbodyMod == 2) && (bodymode == 3)) + { here->BSIM4grbdb = here->BSIM4grbsb = model->BSIM4gbmin; if (here->BSIM4rbpb < 1.0e-3) here->BSIM4grbpb = 1.0e3; @@ -1699,10 +1783,10 @@ int Size_Not_Found, i; here->BSIM4grbpd = model->BSIM4gbmin + 1.0 / here->BSIM4rbpd; } - if((here->BSIM4rbodyMod == 2) && (bodymode == 1)) - { + if((here->BSIM4rbodyMod == 2) && (bodymode == 1)) + { here->BSIM4grbdb = here->BSIM4grbsb = model->BSIM4gbmin; - here->BSIM4grbps = here->BSIM4grbpd = 1.0e3; + here->BSIM4grbps = here->BSIM4grbpd = 1.0e3; if (here->BSIM4rbpb < 1.0e-3) here->BSIM4grbpb = 1.0e3; else @@ -1710,9 +1794,9 @@ int Size_Not_Found, i; } - /* + /* * Process geomertry dependent parasitics - */ + */ here->BSIM4grgeltd = model->BSIM4rshg * (here->BSIM4xgw + pParam->BSIM4weffCJ / 3.0 / here->BSIM4ngcon) / @@ -1722,79 +1806,114 @@ int Size_Not_Found, i; here->BSIM4grgeltd = 1.0 / here->BSIM4grgeltd; else { here->BSIM4grgeltd = 1.0e3; /* mho */ - if (here->BSIM4rgateMod != 0) + if (here->BSIM4rgateMod != 0) printf("Warning: The gate conductance reset to 1.0e3 mho.\n"); } - DMCGeff = model->BSIM4dmcg - model->BSIM4dmcgt; + DMCGeff = model->BSIM4dmcg - model->BSIM4dmcgt; DMCIeff = model->BSIM4dmci; DMDGeff = model->BSIM4dmdg - model->BSIM4dmcgt; - if (here->BSIM4sourcePerimeterGiven) - { - if(here->BSIM4sourcePerimeter == 0.0) - here->BSIM4Pseff = 0.0; - else if (here->BSIM4sourcePerimeter < 0.0) - { - printf("Warning: Source Perimeter is specified as negative, it is set to zero.\n"); - here->BSIM4Pseff = 0.0; - } - else - { - if (model->BSIM4perMod == 0) - here->BSIM4Pseff = here->BSIM4sourcePerimeter; +/* if (here->BSIM4sourcePerimeterGiven) + { if (model->BSIM4perMod == 0) + here->BSIM4Pseff = here->BSIM4sourcePerimeter; else - here->BSIM4Pseff = here->BSIM4sourcePerimeter + here->BSIM4Pseff = here->BSIM4sourcePerimeter - pParam->BSIM4weffCJ * here->BSIM4nf; - } - } - else - BSIM4PAeffGeo(here->BSIM4nf, here->BSIM4geoMod, here->BSIM4min, - pParam->BSIM4weffCJ, DMCGeff, DMCIeff, DMDGeff, - &(here->BSIM4Pseff), &dumPd, &dumAs, &dumAd); - if (here->BSIM4Pseff < 0.0) /*4.6.2*/ - here->BSIM4Pseff = 0.0; - - if (here->BSIM4drainPerimeterGiven) - { - if(here->BSIM4drainPerimeter == 0.0) - here->BSIM4Pdeff = 0.0; - else if (here->BSIM4drainPerimeter < 0.0) - { - printf("Warning: Drain Perimeter is specified as negative, it is set to zero\n"); - here->BSIM4Pdeff = 0.0; - } - else - { - if (model->BSIM4perMod == 0) - here->BSIM4Pdeff = here->BSIM4drainPerimeter; - else - here->BSIM4Pdeff = here->BSIM4drainPerimeter - - pParam->BSIM4weffCJ * here->BSIM4nf; - } } else BSIM4PAeffGeo(here->BSIM4nf, here->BSIM4geoMod, here->BSIM4min, - pParam->BSIM4weffCJ, DMCGeff, DMCIeff, DMDGeff, - &dumPs, &(here->BSIM4Pdeff), &dumAs, &dumAd); - if (here->BSIM4Pdeff < 0.0) /*4.6.2*/ - here->BSIM4Pdeff = 0.0; - + pParam->BSIM4weffCJ, DMCGeff, DMCIeff, DMDGeff, + &(here->BSIM4Pseff), &dumPd, &dumAs, &dumAd); + if (here->BSIM4Pseff < 0.0) /4.6.2/ + here->BSIM4Pseff = 0.0; */ + + /* New Diode Model v4.7*/ + if (here->BSIM4sourcePerimeterGiven) + { /* given */ + if (here->BSIM4sourcePerimeter == 0.0) + here->BSIM4Pseff = 0.0; + else if (here->BSIM4sourcePerimeter < 0.0) + { + printf("Warning: Source Perimeter is specified as negative, it is set to zero.\n"); + here->BSIM4Pseff = 0.0; + } else + { + if (model->BSIM4perMod == 0) + here->BSIM4Pseff = here->BSIM4sourcePerimeter; + else + here->BSIM4Pseff = here->BSIM4sourcePerimeter + - pParam->BSIM4weffCJ * here->BSIM4nf; + } + } else /* not given */ + BSIM4PAeffGeo(here->BSIM4nf, here->BSIM4geoMod, here->BSIM4min, + pParam->BSIM4weffCJ, DMCGeff, DMCIeff, DMDGeff, + &(here->BSIM4Pseff), &dumPd, &dumAs, &dumAd); + + if (here->BSIM4Pseff < 0.0){ /* v4.7 final check */ + here->BSIM4Pseff = 0.0; + printf("Warning: Pseff is negative, it is set to zero.\n"); + } + /* if (here->BSIM4drainPerimeterGiven) + { if (model->BSIM4perMod == 0) + here->BSIM4Pdeff = here->BSIM4drainPerimeter; + else + here->BSIM4Pdeff = here->BSIM4drainPerimeter + - pParam->BSIM4weffCJ * here->BSIM4nf; + } + else + BSIM4PAeffGeo(here->BSIM4nf, here->BSIM4geoMod, here->BSIM4min, + pParam->BSIM4weffCJ, DMCGeff, DMCIeff, DMDGeff, + &dumPs, &(here->BSIM4Pdeff), &dumAs, &dumAd); + if (here->BSIM4Pdeff < 0.0) /4.6.2/ + here->BSIM4Pdeff = 0.0; */ + + if (here->BSIM4drainPerimeterGiven) + { /* given */ + if (here->BSIM4drainPerimeter == 0.0) + here->BSIM4Pdeff = 0.0; + else if (here->BSIM4drainPerimeter < 0.0) + { + printf("Warning: Drain Perimeter is specified as negative, it is set to zero.\n"); + here->BSIM4Pdeff = 0.0; + } else + { + if (model->BSIM4perMod == 0) + here->BSIM4Pdeff = here->BSIM4drainPerimeter; + else + here->BSIM4Pdeff = here->BSIM4drainPerimeter + - pParam->BSIM4weffCJ * here->BSIM4nf; + } + } else /* not given */ + BSIM4PAeffGeo(here->BSIM4nf, here->BSIM4geoMod, here->BSIM4min, + pParam->BSIM4weffCJ, DMCGeff, DMCIeff, DMDGeff, + &dumPs, &(here->BSIM4Pdeff), &dumAs, &dumAd); + + if (here->BSIM4Pdeff < 0.0){ + here->BSIM4Pdeff = 0.0; /*New Diode v4.7*/ + printf("Warning: Pdeff is negative, it is set to zero.\n"); + } if (here->BSIM4sourceAreaGiven) here->BSIM4Aseff = here->BSIM4sourceArea; else BSIM4PAeffGeo(here->BSIM4nf, here->BSIM4geoMod, here->BSIM4min, pParam->BSIM4weffCJ, DMCGeff, DMCIeff, DMDGeff, &dumPs, &dumPd, &(here->BSIM4Aseff), &dumAd); - + if (here->BSIM4Aseff < 0.0){ + here->BSIM4Aseff = 0.0; /* v4.7 */ + printf("Warning: Aseff is negative, it is set to zero.\n"); + } if (here->BSIM4drainAreaGiven) here->BSIM4Adeff = here->BSIM4drainArea; else BSIM4PAeffGeo(here->BSIM4nf, here->BSIM4geoMod, here->BSIM4min, pParam->BSIM4weffCJ, DMCGeff, DMCIeff, DMDGeff, - &dumPs, &dumPd, &dumAs, &(here->BSIM4Adeff)); - - /* Processing S/D resistance and conductance below */ + &dumPs, &dumPd, &dumAs, &(here->BSIM4Adeff)); + if (here->BSIM4Adeff < 0.0){ + here->BSIM4Adeff = 0.0; /* v4.7 */ + printf("Warning: Adeff is negative, it is set to zero.\n"); + } + /* Processing S/D resistance and conductance below */ if(here->BSIM4sNodePrime != here->BSIM4sNode) { here->BSIM4sourceConductance = 0.0; @@ -1807,7 +1926,7 @@ int Size_Not_Found, i; BSIM4RdseffGeo(here->BSIM4nf, here->BSIM4geoMod, here->BSIM4rgeoMod, here->BSIM4min, pParam->BSIM4weffCJ, model->BSIM4sheetResistance, - DMCGeff, DMCIeff, DMDGeff, 1, &(here->BSIM4sourceConductance)); + DMCGeff, DMCIeff, DMDGeff, 1, &(here->BSIM4sourceConductance)); } else { here->BSIM4sourceConductance = 0.0; @@ -1838,7 +1957,7 @@ int Size_Not_Found, i; BSIM4RdseffGeo(here->BSIM4nf, here->BSIM4geoMod, here->BSIM4rgeoMod, here->BSIM4min, pParam->BSIM4weffCJ, model->BSIM4sheetResistance, - DMCGeff, DMCIeff, DMDGeff, 0, &(here->BSIM4drainConductance)); + DMCGeff, DMCIeff, DMDGeff, 0, &(here->BSIM4drainConductance)); } else { here->BSIM4drainConductance = 0.0; @@ -1856,62 +1975,63 @@ int Size_Not_Found, i; { here->BSIM4drainConductance = 0.0; } - + /* End of Rsd processing */ Nvtms = model->BSIM4vtm * model->BSIM4SjctEmissionCoeff; if ((here->BSIM4Aseff <= 0.0) && (here->BSIM4Pseff <= 0.0)) - { SourceSatCurrent = 0.0; + { SourceSatCurrent = 0.0; /* v4.7 */ + /* SourceSatCurrent = 1.0e-14; */ } else { SourceSatCurrent = here->BSIM4Aseff * model->BSIM4SjctTempSatCurDensity - + here->BSIM4Pseff * model->BSIM4SjctSidewallTempSatCurDensity + + here->BSIM4Pseff * model->BSIM4SjctSidewallTempSatCurDensity + pParam->BSIM4weffCJ * here->BSIM4nf * model->BSIM4SjctGateSidewallTempSatCurDensity; } if (SourceSatCurrent > 0.0) { switch(model->BSIM4dioMod) { case 0: - if ((model->BSIM4bvs / Nvtms) > EXP_THRESHOLD) - here->BSIM4XExpBVS = model->BSIM4xjbvs * MIN_EXP; - else - here->BSIM4XExpBVS = model->BSIM4xjbvs * exp(-model->BSIM4bvs / Nvtms); - break; + if ((model->BSIM4bvs / Nvtms) > EXP_THRESHOLD) + here->BSIM4XExpBVS = model->BSIM4xjbvs * MIN_EXP; + else + here->BSIM4XExpBVS = model->BSIM4xjbvs * exp(-model->BSIM4bvs / Nvtms); + break; case 1: - BSIM4DioIjthVjmEval(Nvtms, model->BSIM4ijthsfwd, SourceSatCurrent, - 0.0, &(here->BSIM4vjsmFwd)); + BSIM4DioIjthVjmEval(Nvtms, model->BSIM4ijthsfwd, SourceSatCurrent, + 0.0, &(here->BSIM4vjsmFwd)); here->BSIM4IVjsmFwd = SourceSatCurrent * exp(here->BSIM4vjsmFwd / Nvtms); break; case 2: if ((model->BSIM4bvs / Nvtms) > EXP_THRESHOLD) { here->BSIM4XExpBVS = model->BSIM4xjbvs * MIN_EXP; - tmp = MIN_EXP; - } + tmp = MIN_EXP; + } else - { here->BSIM4XExpBVS = exp(-model->BSIM4bvs / Nvtms); - tmp = here->BSIM4XExpBVS; - here->BSIM4XExpBVS *= model->BSIM4xjbvs; - } + { here->BSIM4XExpBVS = exp(-model->BSIM4bvs / Nvtms); + tmp = here->BSIM4XExpBVS; + here->BSIM4XExpBVS *= model->BSIM4xjbvs; + } - BSIM4DioIjthVjmEval(Nvtms, model->BSIM4ijthsfwd, SourceSatCurrent, - here->BSIM4XExpBVS, &(here->BSIM4vjsmFwd)); - T0 = exp(here->BSIM4vjsmFwd / Nvtms); + BSIM4DioIjthVjmEval(Nvtms, model->BSIM4ijthsfwd, SourceSatCurrent, + here->BSIM4XExpBVS, &(here->BSIM4vjsmFwd)); + T0 = exp(here->BSIM4vjsmFwd / Nvtms); here->BSIM4IVjsmFwd = SourceSatCurrent * (T0 - here->BSIM4XExpBVS / T0 - + here->BSIM4XExpBVS - 1.0); - here->BSIM4SslpFwd = SourceSatCurrent - * (T0 + here->BSIM4XExpBVS / T0) / Nvtms; + + here->BSIM4XExpBVS - 1.0); + here->BSIM4SslpFwd = SourceSatCurrent + * (T0 + here->BSIM4XExpBVS / T0) / Nvtms; - T2 = model->BSIM4ijthsrev / SourceSatCurrent; - if (T2 < 1.0) - { T2 = 10.0; - fprintf(stderr, "Warning: ijthsrev too small and set to 10 times IsbSat.\n"); - } + T2 = model->BSIM4ijthsrev / SourceSatCurrent; + if (T2 < 1.0) + { T2 = 10.0; + fprintf(stderr, "Warning: ijthsrev too small and set to 10 times IsbSat.\n"); + } here->BSIM4vjsmRev = -model->BSIM4bvs - - Nvtms * log((T2 - 1.0) / model->BSIM4xjbvs); - T1 = model->BSIM4xjbvs * exp(-(model->BSIM4bvs - + here->BSIM4vjsmRev) / Nvtms); - here->BSIM4IVjsmRev = SourceSatCurrent * (1.0 + T1); + - Nvtms * log((T2 - 1.0) / model->BSIM4xjbvs); + T1 = model->BSIM4xjbvs * exp(-(model->BSIM4bvs + + here->BSIM4vjsmRev) / Nvtms); + here->BSIM4IVjsmRev = SourceSatCurrent * (1.0 + T1); here->BSIM4SslpRev = -SourceSatCurrent * T1 / Nvtms; break; default: @@ -1920,12 +2040,13 @@ int Size_Not_Found, i; } Nvtmd = model->BSIM4vtm * model->BSIM4DjctEmissionCoeff; - if ((here->BSIM4Adeff <= 0.0) && (here->BSIM4Pdeff <= 0.0)) - { DrainSatCurrent = 0.0; + if ((here->BSIM4Adeff <= 0.0) && (here->BSIM4Pdeff <= 0.0)) + { /* DrainSatCurrent = 1.0e-14; v4.7 */ + DrainSatCurrent = 0.0; } else { DrainSatCurrent = here->BSIM4Adeff * model->BSIM4DjctTempSatCurDensity - + here->BSIM4Pdeff * model->BSIM4DjctSidewallTempSatCurDensity + + here->BSIM4Pdeff * model->BSIM4DjctSidewallTempSatCurDensity + pParam->BSIM4weffCJ * here->BSIM4nf * model->BSIM4DjctGateSidewallTempSatCurDensity; } @@ -1962,7 +2083,7 @@ int Size_Not_Found, i; * (T0 + here->BSIM4XExpBVD / T0) / Nvtmd; T2 = model->BSIM4ijthdrev / DrainSatCurrent; - if (T2 < 1.0) + if (T2 < 1.0) { T2 = 10.0; fprintf(stderr, "Warning: ijthdrev too small and set to 10 times IdbSat.\n"); } @@ -1978,8 +2099,8 @@ int Size_Not_Found, i; } } - /* GEDL current reverse bias */ - T0 = (TRatio - 1.0); + /* GEDL current reverse bias */ + T0 = (TRatio - 1.0); model->BSIM4njtsstemp = model->BSIM4njts * (1.0 + model->BSIM4tnjts * T0); model->BSIM4njtsswstemp = model->BSIM4njtssw * (1.0 + model->BSIM4tnjtssw * T0); model->BSIM4njtsswgstemp = model->BSIM4njtsswg * (1.0 + model->BSIM4tnjtsswg * T0); @@ -1999,199 +2120,203 @@ int Size_Not_Found, i; DEXP(T9, T5); T9 = model->BSIM4xtsswgd * T7; DEXP(T9, T6); - /*IBM TAT*/ - if(model->BSIM4jtweff < 0.0) - { model->BSIM4jtweff = 0.0; - fprintf(stderr, "TAT width dependence effect is negative. Jtweff is clamped to zero.\n"); - } - T11 = sqrt(model->BSIM4jtweff / pParam->BSIM4weffCJ) + 1.0; + /*IBM TAT*/ + if(model->BSIM4jtweff < 0.0) + { model->BSIM4jtweff = 0.0; + fprintf(stderr, "TAT width dependence effect is negative. Jtweff is clamped to zero.\n"); + } + T11 = sqrt(model->BSIM4jtweff / pParam->BSIM4weffCJ) + 1.0; - T10 = pParam->BSIM4weffCJ * here->BSIM4nf; - here->BSIM4SjctTempRevSatCur = T1 * here->BSIM4Aseff * model->BSIM4jtss; - here->BSIM4DjctTempRevSatCur = T2 * here->BSIM4Adeff * model->BSIM4jtsd; - here->BSIM4SswTempRevSatCur = T3 * here->BSIM4Pseff * model->BSIM4jtssws; - here->BSIM4DswTempRevSatCur = T4 * here->BSIM4Pdeff * model->BSIM4jtsswd; - here->BSIM4SswgTempRevSatCur = T5 * T10 * T11 * model->BSIM4jtsswgs; - here->BSIM4DswgTempRevSatCur = T6 * T10 * T11 * model->BSIM4jtsswgd; + T10 = pParam->BSIM4weffCJ * here->BSIM4nf; + here->BSIM4SjctTempRevSatCur = T1 * here->BSIM4Aseff * model->BSIM4jtss; + here->BSIM4DjctTempRevSatCur = T2 * here->BSIM4Adeff * model->BSIM4jtsd; + here->BSIM4SswTempRevSatCur = T3 * here->BSIM4Pseff * model->BSIM4jtssws; + here->BSIM4DswTempRevSatCur = T4 * here->BSIM4Pdeff * model->BSIM4jtsswd; + here->BSIM4SswgTempRevSatCur = T5 * T10 * T11 * model->BSIM4jtsswgs; + here->BSIM4DswgTempRevSatCur = T6 * T10 * T11 * model->BSIM4jtsswgd; - /*high k*/ - /*Calculate VgsteffVth for mobMod=3*/ - if(model->BSIM4mobMod==3) - { /*Calculate n @ Vbs=Vds=0*/ - V0 = pParam->BSIM4vbi - pParam->BSIM4phi; - lt1 = model->BSIM4factor1* pParam->BSIM4sqrtXdep0; - ltw = lt1; - T0 = pParam->BSIM4dvt1 * pParam->BSIM4leff / lt1; - if (T0 < EXP_THRESHOLD) - { - T1 = exp(T0); - T2 = T1 - 1.0; - T3 = T2 * T2; - T4 = T3 + 2.0 * T1 * MIN_EXP; - Theta0 = T1 / T4; - } - else - Theta0 = 1.0 / (MAX_EXP - 2.0); - - tmp1 = epssub / pParam->BSIM4Xdep0; - here->BSIM4nstar = model->BSIM4vtm / Charge_q * - (model->BSIM4coxe + tmp1 + pParam->BSIM4cit); - tmp2 = pParam->BSIM4nfactor * tmp1; - tmp3 = (tmp2 + pParam->BSIM4cdsc * Theta0 + pParam->BSIM4cit) / model->BSIM4coxe; - if (tmp3 >= -0.5) - n0 = 1.0 + tmp3; - else - { - T0 = 1.0 / (3.0 + 8.0 * tmp3); - n0 = (1.0 + 3.0 * tmp3) * T0; - } - - T0 = n0 * model->BSIM4vtm; - T1 = pParam->BSIM4voffcbn; - T2 = T1/T0; - if (T2 < -EXP_THRESHOLD) - { T3 = model->BSIM4coxe * MIN_EXP / pParam->BSIM4cdep0; - T4 = pParam->BSIM4mstar + T3 * n0; - } - else if (T2 > EXP_THRESHOLD) - { T3 = model->BSIM4coxe * MAX_EXP / pParam->BSIM4cdep0; - T4 = pParam->BSIM4mstar + T3 * n0; - } - else - { T3 = exp(T2)* model->BSIM4coxe / pParam->BSIM4cdep0; - T4 = pParam->BSIM4mstar + T3 * n0; - - } - pParam->BSIM4VgsteffVth = T0 * log(2.0)/T4; - - } - - if(model->BSIM4mtrlMod) - { - /* Calculate TOXP from EOT */ - /* Calculate Vgs_eff @ Vgs = VDD with Poly Depletion Effect */ - Vtm0eot = KboQ * model->BSIM4tempeot; - Vtmeot = Vtm0eot; - vbieot = Vtm0eot * log(pParam->BSIM4nsd - * pParam->BSIM4ndep / (ni * ni)); - phieot = Vtm0eot * log(pParam->BSIM4ndep / ni) - + pParam->BSIM4phin + 0.4; - tmp2 = here->BSIM4vfb + phieot; - vddeot = model->BSIM4type * model->BSIM4vddeot; - T0 = model->BSIM4epsrgate * EPS0; - if ((pParam->BSIM4ngate > 1.0e18) && (pParam->BSIM4ngate < 1.0e25) - && (vddeot > tmp2) && (T0!=0)) - { - T1 = 1.0e6 * CHARGE * T0 * pParam->BSIM4ngate / - (model->BSIM4coxe * model->BSIM4coxe); - T8 = vddeot - tmp2; - T4 = sqrt(1.0 + 2.0 * T8 / T1); - T2 = 2.0 * T8 / (T4 + 1.0); - T3 = 0.5 * T2 * T2 / T1; - T7 = 1.12 - T3 - 0.05; - T6 = sqrt(T7 * T7 + 0.224); - T5 = 1.12 - 0.5 * (T7 + T6); - Vgs_eff = vddeot - T5; - } - else - Vgs_eff = vddeot; - - /* Calculate Vth @ Vds=Vbs=0 */ - - V0 = vbieot - phieot; - lt1 = model->BSIM4factor1* pParam->BSIM4sqrtXdep0; - ltw = lt1; - T0 = pParam->BSIM4dvt1 * model->BSIM4leffeot / lt1; - if (T0 < EXP_THRESHOLD) - { - T1 = exp(T0); - T2 = T1 - 1.0; - T3 = T2 * T2; - T4 = T3 + 2.0 * T1 * MIN_EXP; - Theta0 = T1 / T4; - } - else - Theta0 = 1.0 / (MAX_EXP - 2.0); - Delt_vth = pParam->BSIM4dvt0 * Theta0 * V0; - T0 = pParam->BSIM4dvt1w * model->BSIM4weffeot * model->BSIM4leffeot / ltw; - if (T0 < EXP_THRESHOLD) - { T1 = exp(T0); - T2 = T1 - 1.0; - T3 = T2 * T2; - T4 = T3 + 2.0 * T1 * MIN_EXP; - T5 = T1 / T4; - } - else - T5 = 1.0 / (MAX_EXP - 2.0); /* 3.0 * MIN_EXP omitted */ - T2 = pParam->BSIM4dvt0w * T5 * V0; - TempRatioeot = model->BSIM4tempeot / model->BSIM4tnom - 1.0; - T0 = sqrt(1.0 + pParam->BSIM4lpe0 / model->BSIM4leffeot); - T1 = pParam->BSIM4k1ox * (T0 - 1.0) * sqrt(phieot) - + (pParam->BSIM4kt1 + pParam->BSIM4kt1l / model->BSIM4leffeot) * TempRatioeot; - Vth_NarrowW = toxe * phieot - / (model->BSIM4weffeot + pParam->BSIM4w0); - Lpe_Vb = sqrt(1.0 + pParam->BSIM4lpeb / model->BSIM4leffeot); - Vth = model->BSIM4type * here->BSIM4vth0 + - (pParam->BSIM4k1ox - pParam->BSIM4k1)*sqrt(phieot)*Lpe_Vb - - Delt_vth - T2 + pParam->BSIM4k3 * Vth_NarrowW + T1; - - /* Calculate n */ - tmp1 = epssub / pParam->BSIM4Xdep0; - here->BSIM4nstar = Vtmeot / Charge_q * - (model->BSIM4coxe + tmp1 + pParam->BSIM4cit); - tmp2 = pParam->BSIM4nfactor * tmp1; - tmp3 = (tmp2 + pParam->BSIM4cdsc * Theta0 + pParam->BSIM4cit) / model->BSIM4coxe; - if (tmp3 >= -0.5) - n = 1.0 + tmp3; - else - { - T0 = 1.0 / (3.0 + 8.0 * tmp3); - n = (1.0 + 3.0 * tmp3) * T0; - } - - /* Vth correction for Pocket implant */ - if (pParam->BSIM4dvtp0 > 0.0) - { - T3 = model->BSIM4leffeot + pParam->BSIM4dvtp0 * 2.0; - if (model->BSIM4tempMod < 2) - T4 = Vtmeot * log(model->BSIM4leffeot / T3); - else - T4 = Vtm0eot * log(model->BSIM4leffeot / T3); - Vth -= n * T4; - } - Vgsteff = Vgs_eff-Vth; - /* calculating Toxp */ - T3 = model->BSIM4type * here->BSIM4vth0 + /*high k*/ + /*Calculate VgsteffVth for mobMod=3*/ + if(model->BSIM4mobMod==3) + { /*Calculate n @ Vbs=Vds=0*/ + V0 = pParam->BSIM4vbi - pParam->BSIM4phi; + lt1 = model->BSIM4factor1* pParam->BSIM4sqrtXdep0; + ltw = lt1; + T0 = pParam->BSIM4dvt1 * pParam->BSIM4leff / lt1; + if (T0 < EXP_THRESHOLD) + { + T1 = exp(T0); + T2 = T1 - 1.0; + T3 = T2 * T2; + T4 = T3 + 2.0 * T1 * MIN_EXP; + Theta0 = T1 / T4; + } + else + Theta0 = 1.0 / (MAX_EXP - 2.0); + + tmp1 = epssub / pParam->BSIM4Xdep0; + here->BSIM4nstar = model->BSIM4vtm / Charge_q * + (model->BSIM4coxe + tmp1 + pParam->BSIM4cit); + tmp2 = pParam->BSIM4nfactor * tmp1; + tmp3 = (tmp2 + pParam->BSIM4cdsc * Theta0 + pParam->BSIM4cit) / model->BSIM4coxe; + if (tmp3 >= -0.5) + n0 = 1.0 + tmp3; + else + { + T0 = 1.0 / (3.0 + 8.0 * tmp3); + n0 = (1.0 + 3.0 * tmp3) * T0; + } + + T0 = n0 * model->BSIM4vtm; + T1 = pParam->BSIM4voffcbn; + T2 = T1/T0; + if (T2 < -EXP_THRESHOLD) + { T3 = model->BSIM4coxe * MIN_EXP / pParam->BSIM4cdep0; + T4 = pParam->BSIM4mstar + T3 * n0; + } + else if (T2 > EXP_THRESHOLD) + { T3 = model->BSIM4coxe * MAX_EXP / pParam->BSIM4cdep0; + T4 = pParam->BSIM4mstar + T3 * n0; + } + else + { T3 = exp(T2)* model->BSIM4coxe / pParam->BSIM4cdep0; + T4 = pParam->BSIM4mstar + T3 * n0; + } + pParam->BSIM4VgsteffVth = T0 * log(2.0)/T4; + + } + + /* New DITS term added in 4.7 */ + T0 = -pParam->BSIM4dvtp3 * log(pParam->BSIM4leff); + DEXP(T0, T1); + pParam->BSIM4dvtp2factor = pParam->BSIM4dvtp5 + pParam->BSIM4dvtp2 * T1; + + if(model->BSIM4mtrlMod != 0 && model->BSIM4mtrlCompatMod == 0) + { + /* Calculate TOXP from EOT */ + /* Calculate Vgs_eff @ Vgs = VDD with Poly Depletion Effect */ + Vtm0eot = KboQ * model->BSIM4tempeot; + Vtmeot = Vtm0eot; + vbieot = Vtm0eot * log(pParam->BSIM4nsd + * pParam->BSIM4ndep / (ni * ni)); + phieot = Vtm0eot * log(pParam->BSIM4ndep / ni) + + pParam->BSIM4phin + 0.4; + tmp2 = here->BSIM4vfb + phieot; + vddeot = model->BSIM4type * model->BSIM4vddeot; + T0 = model->BSIM4epsrgate * EPS0; + if ((pParam->BSIM4ngate > 1.0e18) && (pParam->BSIM4ngate < 1.0e25) + && (vddeot > tmp2) && (T0!=0)) + { + T1 = 1.0e6 * CHARGE * T0 * pParam->BSIM4ngate / + (model->BSIM4coxe * model->BSIM4coxe); + T8 = vddeot - tmp2; + T4 = sqrt(1.0 + 2.0 * T8 / T1); + T2 = 2.0 * T8 / (T4 + 1.0); + T3 = 0.5 * T2 * T2 / T1; + T7 = 1.12 - T3 - 0.05; + T6 = sqrt(T7 * T7 + 0.224); + T5 = 1.12 - 0.5 * (T7 + T6); + Vgs_eff = vddeot - T5; + } + else + Vgs_eff = vddeot; + + /* Calculate Vth @ Vds=Vbs=0 */ + + V0 = vbieot - phieot; + lt1 = model->BSIM4factor1* pParam->BSIM4sqrtXdep0; + ltw = lt1; + T0 = pParam->BSIM4dvt1 * model->BSIM4leffeot / lt1; + if (T0 < EXP_THRESHOLD) + { + T1 = exp(T0); + T2 = T1 - 1.0; + T3 = T2 * T2; + T4 = T3 + 2.0 * T1 * MIN_EXP; + Theta0 = T1 / T4; + } + else + Theta0 = 1.0 / (MAX_EXP - 2.0); + Delt_vth = pParam->BSIM4dvt0 * Theta0 * V0; + T0 = pParam->BSIM4dvt1w * model->BSIM4weffeot * model->BSIM4leffeot / ltw; + if (T0 < EXP_THRESHOLD) + { T1 = exp(T0); + T2 = T1 - 1.0; + T3 = T2 * T2; + T4 = T3 + 2.0 * T1 * MIN_EXP; + T5 = T1 / T4; + } + else + T5 = 1.0 / (MAX_EXP - 2.0); /* 3.0 * MIN_EXP omitted */ + T2 = pParam->BSIM4dvt0w * T5 * V0; + TempRatioeot = model->BSIM4tempeot / model->BSIM4tnom - 1.0; + T0 = sqrt(1.0 + pParam->BSIM4lpe0 / model->BSIM4leffeot); + T1 = pParam->BSIM4k1ox * (T0 - 1.0) * sqrt(phieot) + + (pParam->BSIM4kt1 + pParam->BSIM4kt1l / model->BSIM4leffeot) * TempRatioeot; + Vth_NarrowW = toxe * phieot + / (model->BSIM4weffeot + pParam->BSIM4w0); + Lpe_Vb = sqrt(1.0 + pParam->BSIM4lpeb / model->BSIM4leffeot); + Vth = model->BSIM4type * here->BSIM4vth0 + + (pParam->BSIM4k1ox - pParam->BSIM4k1)*sqrt(phieot)*Lpe_Vb + - Delt_vth - T2 + pParam->BSIM4k3 * Vth_NarrowW + T1; + + /* Calculate n */ + tmp1 = epssub / pParam->BSIM4Xdep0; + here->BSIM4nstar = Vtmeot / Charge_q * + (model->BSIM4coxe + tmp1 + pParam->BSIM4cit); + tmp2 = pParam->BSIM4nfactor * tmp1; + tmp3 = (tmp2 + pParam->BSIM4cdsc * Theta0 + pParam->BSIM4cit) / model->BSIM4coxe; + if (tmp3 >= -0.5) + n = 1.0 + tmp3; + else + { + T0 = 1.0 / (3.0 + 8.0 * tmp3); + n = (1.0 + 3.0 * tmp3) * T0; + } + + /* Vth correction for Pocket implant */ + if (pParam->BSIM4dvtp0 > 0.0) + { + T3 = model->BSIM4leffeot + pParam->BSIM4dvtp0 * 2.0; + if (model->BSIM4tempMod < 2) + T4 = Vtmeot * log(model->BSIM4leffeot / T3); + else + T4 = Vtm0eot * log(model->BSIM4leffeot / T3); + Vth -= n * T4; + } + Vgsteff = Vgs_eff-Vth; + /* calculating Toxp */ + T3 = model->BSIM4type * here->BSIM4vth0 - here->BSIM4vfb - phieot; T4 = T3 + T3; T5 = 2.5 * T3; - + vtfbphi2eot = 4.0 * T3; if (vtfbphi2eot < 0.0) vtfbphi2eot = 0.0; - - niter = 0; - toxpf = toxe; - do - { - toxpi = toxpf; - tmp2 = 2.0e8 * toxpf; - T0 = (Vgsteff + vtfbphi2eot) / tmp2; - T1 = 1.0 + exp(model->BSIM4bdos * 0.7 * log(T0)); - Tcen = model->BSIM4ados * 1.9e-9 / T1; - toxpf = toxe - epsrox/model->BSIM4epsrsub * Tcen; - niter++; - } while ((niter<=4)&&(ABS(toxpf-toxpi)>1e-12)); - model->BSIM4toxp = toxpf; - model->BSIM4coxp = epsrox * EPS0 / model->BSIM4toxp; - } + + niter = 0; + toxpf = toxe; + do + { + toxpi = toxpf; + tmp2 = 2.0e8 * toxpf; + T0 = (Vgsteff + vtfbphi2eot) / tmp2; + T1 = 1.0 + exp(model->BSIM4bdos * 0.7 * log(T0)); + Tcen = model->BSIM4ados * 1.9e-9 / T1; + toxpf = toxe - epsrox/model->BSIM4epsrsub * Tcen; + niter++; + } while ((niter<=4)&&(ABS(toxpf-toxpi)>1e-12)); + model->BSIM4toxp = toxpf; + model->BSIM4coxp = epsrox * EPS0 / model->BSIM4toxp; + } if (BSIM4checkModel(model, here, ckt)) { IFuid namarray[2]; namarray[0] = model->BSIM4modName; namarray[1] = here->BSIM4name; - SPfrontEnd->IFerror (ERR_FATAL, "Fatal error(s) detected during BSIM4.6.4 parameter checking for %s in model %s", namarray); + (*(SPfrontEnd->IFerror)) (ERR_FATAL, "Fatal error(s) detected during BSIM4.6.0 parameter checking for %s in model %s", namarray); return(E_BADPARM); } } /* End instance */ diff --git a/src/spicelib/devices/bsim4/b4trunc.c b/src/spicelib/devices/bsim4/b4trunc.c index 60dbe0354..8990c9e3d 100644 --- a/src/spicelib/devices/bsim4/b4trunc.c +++ b/src/spicelib/devices/bsim4/b4trunc.c @@ -1,8 +1,8 @@ -/**** BSIM4.6.2 Released by Wenwei Yang 07/31/2008 ****/ +/**** BSIM4.7.0 Released by Darsen Lu 04/08/2011 ****/ /********** * Copyright 2006 Regents of the University of California. All rights reserved. - * File: b4trunc.c of BSIM4.6.2. + * File: b4trunc.c of BSIM4.7.0. * Author: 2000 Weidong Liu * Authors: 2001- Xuemei Xi, Mohan Dunga, Ali Niknejad, Chenming Hu. * Authors: 2006- Mohan Dunga, Ali Niknejad, Chenming Hu @@ -33,8 +33,8 @@ BSIM4instance *here; 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; #ifdef STEPDEBUG debugtemp = *timeStep; #endif /* STEPDEBUG */ @@ -46,12 +46,12 @@ BSIM4instance *here; if (here->BSIM4rbodyMod) { CKTterr(here->BSIM4qbs,ckt,timeStep); CKTterr(here->BSIM4qbd,ckt,timeStep); - } - if (here->BSIM4rgateMod == 3) - CKTterr(here->BSIM4qgmid,ckt,timeStep); + } + if (here->BSIM4rgateMod == 3) + CKTterr(here->BSIM4qgmid,ckt,timeStep); #ifdef STEPDEBUG if(debugtemp != *timeStep) - { printf("device %s reduces step from %g to %g\n", + { printf("device %s reduces step from %g to %g\n", here->BSIM4name,debugtemp,*timeStep); } #endif /* STEPDEBUG */ diff --git a/src/spicelib/devices/bsim4/bsim4def.h b/src/spicelib/devices/bsim4/bsim4def.h index 605356a47..88b23d9dc 100644 --- a/src/spicelib/devices/bsim4/bsim4def.h +++ b/src/spicelib/devices/bsim4/bsim4def.h @@ -1,5 +1,5 @@ /**** BSIM4.6.2 Released by Wenwei Yang 07/31/2008 ****/ -/**** OpenMP support for ngspice by Holger Vogt 06/28/2010 ****/ + /********** Copyright 2006 Regents of the University of California. All rights reserved. File: bsim4def.h @@ -7,7 +7,7 @@ Author: 2000 Weidong Liu. Authors: 2001- Xuemei Xi, Mohan Dunga, Ali Niknejad, Chenming Hu. Authors: 2006- Mohan Dunga, Ali Niknejad, Chenming Hu Authors: 2007- Mohan Dunga, Wenwei Yang, Ali Niknejad, Chenming Hu -Authors: 2008- Wenwei Yang, Ali Niknejad, Chenming Hu +Authors: 2008- Wenwei Yang, Ali Niknejad, Chenming Hu Modified by Xuemei Xi, 11/15/2002. Modified by Xuemei Xi, 05/09/2003. Modified by Xuemei Xi, 03/04/2004. @@ -16,6 +16,7 @@ Modified by Xuemei Xi, 07/29/2005. Modified by Mohan Dunga, 12/13/2006 Modified by Mohan Dunga, Wenwei Yang, 05/18/2007. Modified by Wenwei Yang, 07/31/2008. + * Modified by Tanvir Morshed, Darsen Lu 03/27/2011 **********/ #ifndef BSIM4 @@ -25,7 +26,7 @@ Modified by Wenwei Yang, 07/31/2008. #include "gendefs.h" #include "cktdefs.h" #include "complex.h" -#include "noisedef.h" +#include "noisedef.h" #ifdef USE_OMP #define USE_OMP4 @@ -57,7 +58,7 @@ typedef struct sBSIM4instance int BSIM4qNode; double BSIM4ueff; - double BSIM4thetavth; + double BSIM4thetavth; double BSIM4von; double BSIM4vdsat; double BSIM4cgdo; @@ -115,7 +116,7 @@ typedef struct sBSIM4instance double BSIM4rbpb; double BSIM4rbps; double BSIM4rbpd; - + double BSIM4delvto; double BSIM4xgw; double BSIM4ngcon; @@ -172,6 +173,8 @@ typedef struct sBSIM4instance double BSIM4gmbs; double BSIM4gbd; double BSIM4gbs; + double BSIM4noiGd0; /* tnoiMod=2 (v4.7) */ + double BSIM4Coxeff; double BSIM4gbbs; double BSIM4gbgs; @@ -512,7 +515,6 @@ typedef struct sBSIM4instance double BSIM4_101; double BSIM4_102; double BSIM4_103; - #endif #define BSIM4vbd BSIM4states+ 0 @@ -566,9 +568,10 @@ typedef struct sBSIM4instance #define BSIM4IGSNOIZ 10 #define BSIM4IGDNOIZ 11 #define BSIM4IGBNOIZ 12 -#define BSIM4TOTNOIZ 13 +#define BSIM4CORLNOIZ 13 +#define BSIM4TOTNOIZ 14 -#define BSIM4NSRCS 14 /* Number of BSIM4 noise sources */ +#define BSIM4NSRCS 15 /* Number of BSIM4 noise sources */ #ifndef NONOISE double BSIM4nVar[NSTATVARS][BSIM4NSRCS]; @@ -584,30 +587,30 @@ struct bsim4SizeDependParam double Length; double NFinger; - double BSIM4cdsc; - double BSIM4cdscb; - double BSIM4cdscd; - double BSIM4cit; - double BSIM4nfactor; + double BSIM4cdsc; + double BSIM4cdscb; + double BSIM4cdscd; + double BSIM4cit; + double BSIM4nfactor; double BSIM4xj; - double BSIM4vsat; - double BSIM4at; - double BSIM4a0; - double BSIM4ags; - double BSIM4a1; - double BSIM4a2; - double BSIM4keta; + double BSIM4vsat; + double BSIM4at; + double BSIM4a0; + double BSIM4ags; + double BSIM4a1; + double BSIM4a2; + double BSIM4keta; double BSIM4nsub; - double BSIM4ndep; + double BSIM4ndep; double BSIM4nsd; double BSIM4phin; - double BSIM4ngate; - double BSIM4gamma1; - double BSIM4gamma2; - double BSIM4vbx; - double BSIM4vbi; - double BSIM4vbm; - double BSIM4xt; + double BSIM4ngate; + double BSIM4gamma1; + double BSIM4gamma2; + double BSIM4vbx; + double BSIM4vbi; + double BSIM4vbm; + double BSIM4xt; double BSIM4phi; double BSIM4litl; double BSIM4k1; @@ -620,16 +623,20 @@ struct bsim4SizeDependParam double BSIM4w0; double BSIM4dvtp0; double BSIM4dvtp1; + double BSIM4dvtp2; /* New DIBL/Rout */ + double BSIM4dvtp3; + double BSIM4dvtp4; + double BSIM4dvtp5; double BSIM4lpe0; double BSIM4lpeb; - double BSIM4dvt0; - double BSIM4dvt1; - double BSIM4dvt2; - double BSIM4dvt0w; - double BSIM4dvt1w; - double BSIM4dvt2w; - double BSIM4drout; - double BSIM4dsub; + double BSIM4dvt0; + double BSIM4dvt1; + double BSIM4dvt2; + double BSIM4dvt0w; + double BSIM4dvt1w; + double BSIM4dvt2w; + double BSIM4drout; + double BSIM4dsub; double BSIM4vth0; double BSIM4ua; double BSIM4ua1; @@ -643,36 +650,39 @@ struct bsim4SizeDependParam double BSIM4lp; double BSIM4u0; double BSIM4eu; - double BSIM4ucs; + double BSIM4ucs; double BSIM4ute; - double BSIM4ucste; + double BSIM4ucste; double BSIM4voff; double BSIM4tvoff; + double BSIM4tnfactor; /* v4.7 Temp dep of leakage current */ + double BSIM4teta0; /* v4.7 temp dep of leakage current */ + double BSIM4tvoffcv; /* v4.7 temp dep of leakage current */ double BSIM4minv; double BSIM4minvcv; double BSIM4vfb; double BSIM4delta; - double BSIM4rdsw; - double BSIM4rds0; + double BSIM4rdsw; + double BSIM4rds0; double BSIM4rs0; double BSIM4rd0; double BSIM4rsw; double BSIM4rdw; - double BSIM4prwg; - double BSIM4prwb; - double BSIM4prt; - double BSIM4eta0; - double BSIM4etab; - double BSIM4pclm; - double BSIM4pdibl1; - double BSIM4pdibl2; - double BSIM4pdiblb; + double BSIM4prwg; + double BSIM4prwb; + double BSIM4prt; + double BSIM4eta0; + double BSIM4etab; + double BSIM4pclm; + double BSIM4pdibl1; + double BSIM4pdibl2; + double BSIM4pdiblb; double BSIM4fprout; double BSIM4pdits; double BSIM4pditsd; - double BSIM4pscbe1; - double BSIM4pscbe2; - double BSIM4pvag; + double BSIM4pscbe1; + double BSIM4pscbe2; + double BSIM4pvag; double BSIM4wr; double BSIM4dwg; double BSIM4dwb; @@ -685,10 +695,16 @@ struct bsim4SizeDependParam double BSIM4bgidl; double BSIM4cgidl; double BSIM4egidl; + double BSIM4fgidl; /* v4.7 New GIDL/GISL */ + double BSIM4kgidl; /* v4.7 New GIDL/GISL */ + double BSIM4rgidl; /* v4.7 New GIDL/GISL */ double BSIM4agisl; double BSIM4bgisl; double BSIM4cgisl; double BSIM4egisl; + double BSIM4fgisl; /* v4.7 New GIDL/GISL */ + double BSIM4kgisl; /* v4.7 New GIDL/GISL */ + double BSIM4rgisl; /* v4.7 New GIDL/GISL */ double BSIM4aigc; double BSIM4bigc; double BSIM4cigc; @@ -719,7 +735,7 @@ struct bsim4SizeDependParam double BSIM4lc; /* back scattering parameter */ double BSIM4tfactor; /* ballistic transportation factor */ double BSIM4vfbsdoff; /* S/D flatband offset voltage */ - double BSIM4tvfbsdoff; + double BSIM4tvfbsdoff; /* added for stress effect */ double BSIM4ku0; @@ -764,16 +780,16 @@ struct bsim4SizeDependParam double BSIM4cgdo; double BSIM4cgbo; - double BSIM4u0temp; - double BSIM4vsattemp; - double BSIM4sqrtPhi; - double BSIM4phis3; - double BSIM4Xdep0; - double BSIM4sqrtXdep0; + double BSIM4u0temp; + double BSIM4vsattemp; + double BSIM4sqrtPhi; + double BSIM4phis3; + double BSIM4Xdep0; + double BSIM4sqrtXdep0; double BSIM4theta0vb0; - double BSIM4thetaRout; + double BSIM4thetaRout; double BSIM4mstar; - double BSIM4VgsteffVth; + double BSIM4VgsteffVth; double BSIM4mstarcv; double BSIM4voffcbn; double BSIM4voffcbncv; @@ -798,17 +814,17 @@ struct bsim4SizeDependParam double BSIM4k1ox; double BSIM4k2ox; double BSIM4vfbzbfactor; - + double BSIM4dvtp2factor; /* v4.7 */ struct bsim4SizeDependParam *pNext; }; -typedef struct sBSIM4model +typedef struct sBSIM4model { int BSIM4modType; struct sBSIM4model *BSIM4nextModel; BSIM4instance *BSIM4instances; - IFuid BSIM4modName; + IFuid BSIM4modName; int BSIM4type; int BSIM4mobMod; @@ -825,6 +841,8 @@ typedef struct sBSIM4model int BSIM4perMod; int BSIM4geoMod; int BSIM4mtrlMod; + int BSIM4mtrlCompatMod; /* v4.7 */ + int BSIM4gidlMod; /* v4.7 New GIDL/GISL */ int BSIM4igcMod; int BSIM4igbMod; int BSIM4tempMod; @@ -833,29 +851,29 @@ typedef struct sBSIM4model char *BSIM4version; double BSIM4eot; double BSIM4vddeot; - double BSIM4tempeot; - double BSIM4leffeot; - double BSIM4weffeot; + double BSIM4tempeot; + double BSIM4leffeot; + double BSIM4weffeot; double BSIM4ados; double BSIM4bdos; - double BSIM4toxe; + double BSIM4toxe; double BSIM4toxp; double BSIM4toxm; double BSIM4dtox; double BSIM4epsrox; - double BSIM4cdsc; - double BSIM4cdscb; - double BSIM4cdscd; - double BSIM4cit; - double BSIM4nfactor; + double BSIM4cdsc; + double BSIM4cdscb; + double BSIM4cdscd; + double BSIM4cit; + double BSIM4nfactor; double BSIM4xj; - double BSIM4vsat; - double BSIM4at; - double BSIM4a0; - double BSIM4ags; - double BSIM4a1; - double BSIM4a2; - double BSIM4keta; + double BSIM4vsat; + double BSIM4at; + double BSIM4a0; + double BSIM4ags; + double BSIM4a1; + double BSIM4a2; + double BSIM4keta; double BSIM4nsub; double BSIM4phig; double BSIM4epsrgate; @@ -865,15 +883,15 @@ typedef struct sBSIM4model double BSIM4bg0sub; double BSIM4tbgasub; double BSIM4tbgbsub; - double BSIM4ndep; + double BSIM4ndep; double BSIM4nsd; double BSIM4phin; - double BSIM4ngate; - double BSIM4gamma1; - double BSIM4gamma2; - double BSIM4vbx; - double BSIM4vbm; - double BSIM4xt; + double BSIM4ngate; + double BSIM4gamma1; + double BSIM4gamma2; + double BSIM4vbx; + double BSIM4vbm; + double BSIM4xt; double BSIM4k1; double BSIM4kt1; double BSIM4kt1l; @@ -884,19 +902,23 @@ typedef struct sBSIM4model double BSIM4w0; double BSIM4dvtp0; double BSIM4dvtp1; + double BSIM4dvtp2; /* New DIBL/Rout */ + double BSIM4dvtp3; + double BSIM4dvtp4; + double BSIM4dvtp5; double BSIM4lpe0; double BSIM4lpeb; - double BSIM4dvt0; - double BSIM4dvt1; - double BSIM4dvt2; - double BSIM4dvt0w; - double BSIM4dvt1w; - double BSIM4dvt2w; - double BSIM4drout; - double BSIM4dsub; + double BSIM4dvt0; + double BSIM4dvt1; + double BSIM4dvt2; + double BSIM4dvt0w; + double BSIM4dvt1w; + double BSIM4dvt2w; + double BSIM4drout; + double BSIM4dsub; double BSIM4vth0; double BSIM4eu; - double BSIM4ucs; + double BSIM4ucs; double BSIM4ua; double BSIM4ua1; double BSIM4ub; @@ -909,15 +931,18 @@ typedef struct sBSIM4model double BSIM4lp; double BSIM4u0; double BSIM4ute; - double BSIM4ucste; + double BSIM4ucste; double BSIM4voff; double BSIM4tvoff; + double BSIM4tnfactor; /* v4.7 Temp dep of leakage current */ + double BSIM4teta0; /* v4.7 temp dep of leakage current */ + double BSIM4tvoffcv; /* v4.7 temp dep of leakage current */ double BSIM4minv; double BSIM4minvcv; double BSIM4voffl; double BSIM4voffcvl; double BSIM4delta; - double BSIM4rdsw; + double BSIM4rdsw; double BSIM4rdswmin; double BSIM4rdwmin; double BSIM4rswmin; @@ -925,20 +950,20 @@ typedef struct sBSIM4model double BSIM4rdw; double BSIM4prwg; double BSIM4prwb; - double BSIM4prt; - double BSIM4eta0; - double BSIM4etab; - double BSIM4pclm; - double BSIM4pdibl1; - double BSIM4pdibl2; + double BSIM4prt; + double BSIM4eta0; + double BSIM4etab; + double BSIM4pclm; + double BSIM4pdibl1; + double BSIM4pdibl2; double BSIM4pdiblb; double BSIM4fprout; double BSIM4pdits; double BSIM4pditsd; double BSIM4pditsl; - double BSIM4pscbe1; - double BSIM4pscbe2; - double BSIM4pvag; + double BSIM4pscbe1; + double BSIM4pscbe2; + double BSIM4pvag; double BSIM4wr; double BSIM4dwg; double BSIM4dwb; @@ -951,10 +976,16 @@ typedef struct sBSIM4model double BSIM4bgidl; double BSIM4cgidl; double BSIM4egidl; + double BSIM4fgidl; /* v4.7 New GIDL/GISL */ + double BSIM4kgidl; /* v4.7 New GIDL/GISL */ + double BSIM4rgidl; /* v4.7 New GIDL/GISL */ double BSIM4agisl; double BSIM4bgisl; double BSIM4cgisl; double BSIM4egisl; + double BSIM4fgisl; /* v4.7 New GIDL/GISL */ + double BSIM4kgisl; /* v4.7 New GIDL/GISL */ + double BSIM4rgisl; /* v4.7 New GIDL/GISL */ double BSIM4aigc; double BSIM4bigc; double BSIM4cigc; @@ -996,7 +1027,7 @@ typedef struct sBSIM4model double BSIM4jtsswd; double BSIM4jtsswgs; double BSIM4jtsswgd; - double BSIM4jtweff; + double BSIM4jtweff; double BSIM4njts; double BSIM4njtssw; double BSIM4njtsswg; @@ -1025,12 +1056,12 @@ typedef struct sBSIM4model double BSIM4xrcrg1; double BSIM4xrcrg2; double BSIM4lambda; - double BSIM4vtl; - double BSIM4lc; - double BSIM4xn; + double BSIM4vtl; + double BSIM4lc; + double BSIM4xn; double BSIM4vfbsdoff; /* S/D flatband offset voltage */ double BSIM4lintnoi; /* lint offset for noise calculation */ - double BSIM4tvfbsdoff; + double BSIM4tvfbsdoff; double BSIM4vfb; double BSIM4gbmin; @@ -1073,8 +1104,10 @@ typedef struct sBSIM4model double BSIM4tnoia; double BSIM4tnoib; + double BSIM4tnoic; double BSIM4rnoia; double BSIM4rnoib; + double BSIM4rnoic; double BSIM4ntnoi; /* CV model and Parasitics */ @@ -1113,29 +1146,29 @@ typedef struct sBSIM4model double BSIM4ngcon; /* Length Dependence */ - double BSIM4lcdsc; - double BSIM4lcdscb; - double BSIM4lcdscd; - double BSIM4lcit; - double BSIM4lnfactor; + double BSIM4lcdsc; + double BSIM4lcdscb; + double BSIM4lcdscd; + double BSIM4lcit; + double BSIM4lnfactor; double BSIM4lxj; - double BSIM4lvsat; - double BSIM4lat; - double BSIM4la0; - double BSIM4lags; - double BSIM4la1; - double BSIM4la2; - double BSIM4lketa; + double BSIM4lvsat; + double BSIM4lat; + double BSIM4la0; + double BSIM4lags; + double BSIM4la1; + double BSIM4la2; + double BSIM4lketa; double BSIM4lnsub; - double BSIM4lndep; + double BSIM4lndep; double BSIM4lnsd; double BSIM4lphin; - double BSIM4lngate; - double BSIM4lgamma1; - double BSIM4lgamma2; - double BSIM4lvbx; - double BSIM4lvbm; - double BSIM4lxt; + double BSIM4lngate; + double BSIM4lgamma1; + double BSIM4lgamma2; + double BSIM4lvbx; + double BSIM4lvbm; + double BSIM4lxt; double BSIM4lk1; double BSIM4lkt1; double BSIM4lkt1l; @@ -1146,16 +1179,20 @@ typedef struct sBSIM4model double BSIM4lw0; double BSIM4ldvtp0; double BSIM4ldvtp1; + double BSIM4ldvtp2; /* New DIBL/Rout */ + double BSIM4ldvtp3; + double BSIM4ldvtp4; + double BSIM4ldvtp5; double BSIM4llpe0; double BSIM4llpeb; - double BSIM4ldvt0; - double BSIM4ldvt1; - double BSIM4ldvt2; - double BSIM4ldvt0w; - double BSIM4ldvt1w; - double BSIM4ldvt2w; - double BSIM4ldrout; - double BSIM4ldsub; + double BSIM4ldvt0; + double BSIM4ldvt1; + double BSIM4ldvt2; + double BSIM4ldvt0w; + double BSIM4ldvt1w; + double BSIM4ldvt2w; + double BSIM4ldrout; + double BSIM4ldsub; double BSIM4lvth0; double BSIM4lua; double BSIM4lua1; @@ -1169,32 +1206,35 @@ typedef struct sBSIM4model double BSIM4llp; double BSIM4lu0; double BSIM4leu; - double BSIM4lucs; + double BSIM4lucs; double BSIM4lute; - double BSIM4lucste; + double BSIM4lucste; double BSIM4lvoff; double BSIM4ltvoff; + double BSIM4ltnfactor; /* v4.7 Temp dep of leakage current */ + double BSIM4lteta0; /* v4.7 temp dep of leakage current */ + double BSIM4ltvoffcv; /* v4.7 temp dep of leakage current */ double BSIM4lminv; double BSIM4lminvcv; double BSIM4ldelta; - double BSIM4lrdsw; + double BSIM4lrdsw; double BSIM4lrsw; double BSIM4lrdw; double BSIM4lprwg; double BSIM4lprwb; - double BSIM4lprt; - double BSIM4leta0; - double BSIM4letab; - double BSIM4lpclm; - double BSIM4lpdibl1; - double BSIM4lpdibl2; + double BSIM4lprt; + double BSIM4leta0; + double BSIM4letab; + double BSIM4lpclm; + double BSIM4lpdibl1; + double BSIM4lpdibl2; double BSIM4lpdiblb; double BSIM4lfprout; double BSIM4lpdits; double BSIM4lpditsd; - double BSIM4lpscbe1; - double BSIM4lpscbe2; - double BSIM4lpvag; + double BSIM4lpscbe1; + double BSIM4lpscbe2; + double BSIM4lpvag; double BSIM4lwr; double BSIM4ldwg; double BSIM4ldwb; @@ -1208,10 +1248,16 @@ typedef struct sBSIM4model double BSIM4lbgidl; double BSIM4lcgidl; double BSIM4legidl; + double BSIM4lfgidl; /* v4.7 New GIDL/GISL */ + double BSIM4lkgidl; /* v4.7 New GIDL/GISL */ + double BSIM4lrgidl; /* v4.7 New GIDL/GISL */ double BSIM4lagisl; double BSIM4lbgisl; double BSIM4lcgisl; double BSIM4legisl; + double BSIM4lfgisl; /* v4.7 New GIDL/GISL */ + double BSIM4lkgisl; /* v4.7 New GIDL/GISL */ + double BSIM4lrgisl; /* v4.7 New GIDL/GISL */ double BSIM4laigc; double BSIM4lbigc; double BSIM4lcigc; @@ -1240,10 +1286,10 @@ typedef struct sBSIM4model double BSIM4lxrcrg1; double BSIM4lxrcrg2; double BSIM4llambda; - double BSIM4lvtl; - double BSIM4lxn; - double BSIM4lvfbsdoff; - double BSIM4ltvfbsdoff; + double BSIM4lvtl; + double BSIM4lxn; + double BSIM4lvfbsdoff; + double BSIM4ltvfbsdoff; /* CV model */ double BSIM4lcgsl; @@ -1260,29 +1306,29 @@ typedef struct sBSIM4model double BSIM4lmoin; /* Width Dependence */ - double BSIM4wcdsc; - double BSIM4wcdscb; - double BSIM4wcdscd; - double BSIM4wcit; - double BSIM4wnfactor; + double BSIM4wcdsc; + double BSIM4wcdscb; + double BSIM4wcdscd; + double BSIM4wcit; + double BSIM4wnfactor; double BSIM4wxj; - double BSIM4wvsat; - double BSIM4wat; - double BSIM4wa0; - double BSIM4wags; - double BSIM4wa1; - double BSIM4wa2; - double BSIM4wketa; + double BSIM4wvsat; + double BSIM4wat; + double BSIM4wa0; + double BSIM4wags; + double BSIM4wa1; + double BSIM4wa2; + double BSIM4wketa; double BSIM4wnsub; - double BSIM4wndep; + double BSIM4wndep; double BSIM4wnsd; double BSIM4wphin; - double BSIM4wngate; - double BSIM4wgamma1; - double BSIM4wgamma2; - double BSIM4wvbx; - double BSIM4wvbm; - double BSIM4wxt; + double BSIM4wngate; + double BSIM4wgamma1; + double BSIM4wgamma2; + double BSIM4wvbx; + double BSIM4wvbm; + double BSIM4wxt; double BSIM4wk1; double BSIM4wkt1; double BSIM4wkt1l; @@ -1293,16 +1339,20 @@ typedef struct sBSIM4model double BSIM4ww0; double BSIM4wdvtp0; double BSIM4wdvtp1; + double BSIM4wdvtp2; /* New DIBL/Rout */ + double BSIM4wdvtp3; + double BSIM4wdvtp4; + double BSIM4wdvtp5; double BSIM4wlpe0; double BSIM4wlpeb; - double BSIM4wdvt0; - double BSIM4wdvt1; - double BSIM4wdvt2; - double BSIM4wdvt0w; - double BSIM4wdvt1w; - double BSIM4wdvt2w; - double BSIM4wdrout; - double BSIM4wdsub; + double BSIM4wdvt0; + double BSIM4wdvt1; + double BSIM4wdvt2; + double BSIM4wdvt0w; + double BSIM4wdvt1w; + double BSIM4wdvt2w; + double BSIM4wdrout; + double BSIM4wdsub; double BSIM4wvth0; double BSIM4wua; double BSIM4wua1; @@ -1316,32 +1366,35 @@ typedef struct sBSIM4model double BSIM4wlp; double BSIM4wu0; double BSIM4weu; - double BSIM4wucs; + double BSIM4wucs; double BSIM4wute; - double BSIM4wucste; + double BSIM4wucste; double BSIM4wvoff; double BSIM4wtvoff; + double BSIM4wtnfactor; /* v4.7 Temp dep of leakage current */ + double BSIM4wteta0; /* v4.7 temp dep of leakage current */ + double BSIM4wtvoffcv; /* v4.7 temp dep of leakage current */ double BSIM4wminv; double BSIM4wminvcv; double BSIM4wdelta; - double BSIM4wrdsw; + double BSIM4wrdsw; double BSIM4wrsw; double BSIM4wrdw; double BSIM4wprwg; double BSIM4wprwb; - double BSIM4wprt; - double BSIM4weta0; - double BSIM4wetab; - double BSIM4wpclm; - double BSIM4wpdibl1; - double BSIM4wpdibl2; + double BSIM4wprt; + double BSIM4weta0; + double BSIM4wetab; + double BSIM4wpclm; + double BSIM4wpdibl1; + double BSIM4wpdibl2; double BSIM4wpdiblb; double BSIM4wfprout; double BSIM4wpdits; double BSIM4wpditsd; - double BSIM4wpscbe1; - double BSIM4wpscbe2; - double BSIM4wpvag; + double BSIM4wpscbe1; + double BSIM4wpscbe2; + double BSIM4wpvag; double BSIM4wwr; double BSIM4wdwg; double BSIM4wdwb; @@ -1355,10 +1408,16 @@ typedef struct sBSIM4model double BSIM4wbgidl; double BSIM4wcgidl; double BSIM4wegidl; + double BSIM4wfgidl; /* v4.7 New GIDL/GISL */ + double BSIM4wkgidl; /* v4.7 New GIDL/GISL */ + double BSIM4wrgidl; /* v4.7 New GIDL/GISL */ double BSIM4wagisl; double BSIM4wbgisl; double BSIM4wcgisl; double BSIM4wegisl; + double BSIM4wfgisl; /* v4.7 New GIDL/GISL */ + double BSIM4wkgisl; /* v4.7 New GIDL/GISL */ + double BSIM4wrgisl; /* v4.7 New GIDL/GISL */ double BSIM4waigc; double BSIM4wbigc; double BSIM4wcigc; @@ -1387,10 +1446,10 @@ typedef struct sBSIM4model double BSIM4wxrcrg1; double BSIM4wxrcrg2; double BSIM4wlambda; - double BSIM4wvtl; - double BSIM4wxn; - double BSIM4wvfbsdoff; - double BSIM4wtvfbsdoff; + double BSIM4wvtl; + double BSIM4wxn; + double BSIM4wvfbsdoff; + double BSIM4wtvfbsdoff; /* CV model */ double BSIM4wcgsl; @@ -1407,29 +1466,29 @@ typedef struct sBSIM4model double BSIM4wmoin; /* Cross-term Dependence */ - double BSIM4pcdsc; - double BSIM4pcdscb; - double BSIM4pcdscd; - double BSIM4pcit; - double BSIM4pnfactor; + double BSIM4pcdsc; + double BSIM4pcdscb; + double BSIM4pcdscd; + double BSIM4pcit; + double BSIM4pnfactor; double BSIM4pxj; - double BSIM4pvsat; - double BSIM4pat; - double BSIM4pa0; - double BSIM4pags; - double BSIM4pa1; - double BSIM4pa2; - double BSIM4pketa; + double BSIM4pvsat; + double BSIM4pat; + double BSIM4pa0; + double BSIM4pags; + double BSIM4pa1; + double BSIM4pa2; + double BSIM4pketa; double BSIM4pnsub; - double BSIM4pndep; + double BSIM4pndep; double BSIM4pnsd; double BSIM4pphin; - double BSIM4pngate; - double BSIM4pgamma1; - double BSIM4pgamma2; - double BSIM4pvbx; - double BSIM4pvbm; - double BSIM4pxt; + double BSIM4pngate; + double BSIM4pgamma1; + double BSIM4pgamma2; + double BSIM4pvbx; + double BSIM4pvbm; + double BSIM4pxt; double BSIM4pk1; double BSIM4pkt1; double BSIM4pkt1l; @@ -1440,16 +1499,20 @@ typedef struct sBSIM4model double BSIM4pw0; double BSIM4pdvtp0; double BSIM4pdvtp1; + double BSIM4pdvtp2; /* New DIBL/Rout */ + double BSIM4pdvtp3; + double BSIM4pdvtp4; + double BSIM4pdvtp5; double BSIM4plpe0; double BSIM4plpeb; - double BSIM4pdvt0; - double BSIM4pdvt1; - double BSIM4pdvt2; - double BSIM4pdvt0w; - double BSIM4pdvt1w; - double BSIM4pdvt2w; - double BSIM4pdrout; - double BSIM4pdsub; + double BSIM4pdvt0; + double BSIM4pdvt1; + double BSIM4pdvt2; + double BSIM4pdvt0w; + double BSIM4pdvt1w; + double BSIM4pdvt2w; + double BSIM4pdrout; + double BSIM4pdsub; double BSIM4pvth0; double BSIM4pua; double BSIM4pua1; @@ -1463,11 +1526,14 @@ typedef struct sBSIM4model double BSIM4plp; double BSIM4pu0; double BSIM4peu; - double BSIM4pucs; + double BSIM4pucs; double BSIM4pute; - double BSIM4pucste; + double BSIM4pucste; double BSIM4pvoff; double BSIM4ptvoff; + double BSIM4ptnfactor; /* v4.7 Temp dep of leakage current */ + double BSIM4pteta0; /* v4.7 temp dep of leakage current */ + double BSIM4ptvoffcv; /* v4.7 temp dep of leakage current */ double BSIM4pminv; double BSIM4pminvcv; double BSIM4pdelta; @@ -1476,19 +1542,19 @@ typedef struct sBSIM4model double BSIM4prdw; double BSIM4pprwg; double BSIM4pprwb; - double BSIM4pprt; - double BSIM4peta0; - double BSIM4petab; - double BSIM4ppclm; - double BSIM4ppdibl1; - double BSIM4ppdibl2; + double BSIM4pprt; + double BSIM4peta0; + double BSIM4petab; + double BSIM4ppclm; + double BSIM4ppdibl1; + double BSIM4ppdibl2; double BSIM4ppdiblb; double BSIM4pfprout; double BSIM4ppdits; double BSIM4ppditsd; - double BSIM4ppscbe1; - double BSIM4ppscbe2; - double BSIM4ppvag; + double BSIM4ppscbe1; + double BSIM4ppscbe2; + double BSIM4ppvag; double BSIM4pwr; double BSIM4pdwg; double BSIM4pdwb; @@ -1502,10 +1568,16 @@ typedef struct sBSIM4model double BSIM4pbgidl; double BSIM4pcgidl; double BSIM4pegidl; + double BSIM4pfgidl; /* v4.7 New GIDL/GISL */ + double BSIM4pkgidl; /* v4.7 New GIDL/GISL */ + double BSIM4prgidl; /* v4.7 New GIDL/GISL */ double BSIM4pagisl; double BSIM4pbgisl; double BSIM4pcgisl; double BSIM4pegisl; + double BSIM4pfgisl; /* v4.7 New GIDL/GISL */ + double BSIM4pkgisl; /* v4.7 New GIDL/GISL */ + double BSIM4prgisl; /* v4.7 New GIDL/GISL */ double BSIM4paigc; double BSIM4pbigc; double BSIM4pcigc; @@ -1535,9 +1607,9 @@ typedef struct sBSIM4model double BSIM4pxrcrg2; double BSIM4plambda; double BSIM4pvtl; - double BSIM4pxn; - double BSIM4pvfbsdoff; - double BSIM4ptvfbsdoff; + double BSIM4pxn; + double BSIM4pvfbsdoff; + double BSIM4ptvfbsdoff; /* CV model */ double BSIM4pcgsl; @@ -1644,13 +1716,13 @@ typedef struct sBSIM4model double BSIM4steta0; double BSIM4lodeta0; - double BSIM4web; + double BSIM4web; double BSIM4wec; - double BSIM4kvth0we; - double BSIM4k2we; - double BSIM4ku0we; - double BSIM4scref; - double BSIM4wpemod; + double BSIM4kvth0we; + double BSIM4k2we; + double BSIM4ku0we; + double BSIM4scref; + double BSIM4wpemod; double BSIM4lkvth0we; double BSIM4lk2we; double BSIM4lku0we; @@ -1664,8 +1736,8 @@ typedef struct sBSIM4model /* Pre-calculated constants * move to size-dependent param */ double BSIM4Eg0; - double BSIM4vtm; - double BSIM4vtm0; + double BSIM4vtm; + double BSIM4vtm0; double BSIM4coxe; double BSIM4coxp; double BSIM4cof1; @@ -1693,17 +1765,16 @@ typedef struct sBSIM4model double BSIM4SunitLengthGateSidewallTempJctCap; double BSIM4DunitLengthGateSidewallTempJctCap; - double BSIM4oxideTrapDensityA; - double BSIM4oxideTrapDensityB; - double BSIM4oxideTrapDensityC; - double BSIM4em; - double BSIM4ef; - double BSIM4af; - double BSIM4kf; + double BSIM4oxideTrapDensityA; + double BSIM4oxideTrapDensityB; + double BSIM4oxideTrapDensityC; + double BSIM4em; + double BSIM4ef; + double BSIM4af; + double BSIM4kf; struct bsim4SizeDependParam *pSizeDependParamKnot; - #ifdef USE_OMP4 int BSIM4InstCount; struct sBSIM4instance **BSIM4InstanceArray; @@ -1726,6 +1797,8 @@ typedef struct sBSIM4model unsigned BSIM4fnoiModGiven :1; unsigned BSIM4tnoiModGiven :1; unsigned BSIM4mtrlModGiven :1; + unsigned BSIM4mtrlCompatModGiven :1; + unsigned BSIM4gidlModGiven :1; /* v4.7 New GIDL/GISL */ unsigned BSIM4igcModGiven :1; unsigned BSIM4igbModGiven :1; unsigned BSIM4tempModGiven :1; @@ -1733,9 +1806,9 @@ typedef struct sBSIM4model unsigned BSIM4toxrefGiven :1; unsigned BSIM4eotGiven :1; unsigned BSIM4vddeotGiven :1; - unsigned BSIM4tempeotGiven :1; - unsigned BSIM4leffeotGiven :1; - unsigned BSIM4weffeotGiven :1; + unsigned BSIM4tempeotGiven :1; + unsigned BSIM4leffeotGiven :1; + unsigned BSIM4weffeotGiven :1; unsigned BSIM4adosGiven :1; unsigned BSIM4bdosGiven :1; unsigned BSIM4toxeGiven :1; @@ -1756,7 +1829,7 @@ typedef struct sBSIM4model unsigned BSIM4agsGiven :1; unsigned BSIM4a1Given :1; unsigned BSIM4a2Given :1; - unsigned BSIM4ketaGiven :1; + unsigned BSIM4ketaGiven :1; unsigned BSIM4nsubGiven :1; unsigned BSIM4phigGiven :1; unsigned BSIM4epsrgateGiven :1; @@ -1785,19 +1858,23 @@ typedef struct sBSIM4model unsigned BSIM4w0Given :1; unsigned BSIM4dvtp0Given :1; unsigned BSIM4dvtp1Given :1; + unsigned BSIM4dvtp2Given :1; /* New DIBL/Rout */ + unsigned BSIM4dvtp3Given :1; + unsigned BSIM4dvtp4Given :1; + unsigned BSIM4dvtp5Given :1; unsigned BSIM4lpe0Given :1; unsigned BSIM4lpebGiven :1; - unsigned BSIM4dvt0Given :1; - unsigned BSIM4dvt1Given :1; - unsigned BSIM4dvt2Given :1; - unsigned BSIM4dvt0wGiven :1; - unsigned BSIM4dvt1wGiven :1; - unsigned BSIM4dvt2wGiven :1; - unsigned BSIM4droutGiven :1; - unsigned BSIM4dsubGiven :1; + unsigned BSIM4dvt0Given :1; + unsigned BSIM4dvt1Given :1; + unsigned BSIM4dvt2Given :1; + unsigned BSIM4dvt0wGiven :1; + unsigned BSIM4dvt1wGiven :1; + unsigned BSIM4dvt2wGiven :1; + unsigned BSIM4droutGiven :1; + unsigned BSIM4dsubGiven :1; unsigned BSIM4vth0Given :1; unsigned BSIM4euGiven :1; - unsigned BSIM4ucsGiven :1; + unsigned BSIM4ucsGiven :1; unsigned BSIM4uaGiven :1; unsigned BSIM4ua1Given :1; unsigned BSIM4ubGiven :1; @@ -1810,36 +1887,39 @@ typedef struct sBSIM4model unsigned BSIM4lpGiven :1; unsigned BSIM4u0Given :1; unsigned BSIM4uteGiven :1; - unsigned BSIM4ucsteGiven :1; + unsigned BSIM4ucsteGiven :1; unsigned BSIM4voffGiven :1; unsigned BSIM4tvoffGiven :1; + unsigned BSIM4tnfactorGiven :1; /* v4.7 Temp dep of leakage current */ + unsigned BSIM4teta0Given :1; /* v4.7 temp dep of leakage current */ + unsigned BSIM4tvoffcvGiven :1; /* v4.7 temp dep of leakage current */ unsigned BSIM4vofflGiven :1; unsigned BSIM4voffcvlGiven :1; unsigned BSIM4minvGiven :1; unsigned BSIM4minvcvGiven :1; - unsigned BSIM4rdswGiven :1; + unsigned BSIM4rdswGiven :1; unsigned BSIM4rdswminGiven :1; unsigned BSIM4rdwminGiven :1; unsigned BSIM4rswminGiven :1; unsigned BSIM4rswGiven :1; unsigned BSIM4rdwGiven :1; - unsigned BSIM4prwgGiven :1; - unsigned BSIM4prwbGiven :1; - unsigned BSIM4prtGiven :1; - unsigned BSIM4eta0Given :1; - unsigned BSIM4etabGiven :1; - unsigned BSIM4pclmGiven :1; - unsigned BSIM4pdibl1Given :1; - unsigned BSIM4pdibl2Given :1; - unsigned BSIM4pdiblbGiven :1; + unsigned BSIM4prwgGiven :1; + unsigned BSIM4prwbGiven :1; + unsigned BSIM4prtGiven :1; + unsigned BSIM4eta0Given :1; + unsigned BSIM4etabGiven :1; + unsigned BSIM4pclmGiven :1; + unsigned BSIM4pdibl1Given :1; + unsigned BSIM4pdibl2Given :1; + unsigned BSIM4pdiblbGiven :1; unsigned BSIM4fproutGiven :1; unsigned BSIM4pditsGiven :1; unsigned BSIM4pditsdGiven :1; unsigned BSIM4pditslGiven :1; - unsigned BSIM4pscbe1Given :1; - unsigned BSIM4pscbe2Given :1; - unsigned BSIM4pvagGiven :1; - unsigned BSIM4deltaGiven :1; + unsigned BSIM4pscbe1Given :1; + unsigned BSIM4pscbe2Given :1; + unsigned BSIM4pvagGiven :1; + unsigned BSIM4deltaGiven :1; unsigned BSIM4wrGiven :1; unsigned BSIM4dwgGiven :1; unsigned BSIM4dwbGiven :1; @@ -1852,10 +1932,16 @@ typedef struct sBSIM4model unsigned BSIM4bgidlGiven :1; unsigned BSIM4cgidlGiven :1; unsigned BSIM4egidlGiven :1; + unsigned BSIM4fgidlGiven :1; /* v4.7 New GIDL/GISL */ + unsigned BSIM4kgidlGiven :1; /* v4.7 New GIDL/GISL */ + unsigned BSIM4rgidlGiven :1; /* v4.7 New GIDL/GISL */ unsigned BSIM4agislGiven :1; unsigned BSIM4bgislGiven :1; unsigned BSIM4cgislGiven :1; unsigned BSIM4egislGiven :1; + unsigned BSIM4fgislGiven :1; /* v4.7 New GIDL/GISL */ + unsigned BSIM4kgislGiven :1; /* v4.7 New GIDL/GISL */ + unsigned BSIM4rgislGiven :1; /* v4.7 New GIDL/GISL */ unsigned BSIM4aigcGiven :1; unsigned BSIM4bigcGiven :1; unsigned BSIM4cigcGiven :1; @@ -1896,7 +1982,7 @@ typedef struct sBSIM4model unsigned BSIM4jtsswdGiven :1; unsigned BSIM4jtsswgsGiven :1; unsigned BSIM4jtsswgdGiven :1; - unsigned BSIM4jtweffGiven :1; + unsigned BSIM4jtweffGiven :1; unsigned BSIM4njtsGiven :1; unsigned BSIM4njtsswGiven :1; unsigned BSIM4njtsswgGiven :1; @@ -1965,8 +2051,10 @@ typedef struct sBSIM4model unsigned BSIM4xrcrg2Given :1; unsigned BSIM4tnoiaGiven :1; unsigned BSIM4tnoibGiven :1; + unsigned BSIM4tnoicGiven :1; unsigned BSIM4rnoiaGiven :1; unsigned BSIM4rnoibGiven :1; + unsigned BSIM4rnoicGiven :1; unsigned BSIM4ntnoiGiven :1; unsigned BSIM4lambdaGiven :1; @@ -2026,7 +2114,7 @@ typedef struct sBSIM4model unsigned BSIM4lagsGiven :1; unsigned BSIM4la1Given :1; unsigned BSIM4la2Given :1; - unsigned BSIM4lketaGiven :1; + unsigned BSIM4lketaGiven :1; unsigned BSIM4lnsubGiven :1; unsigned BSIM4lndepGiven :1; unsigned BSIM4lnsdGiven :1; @@ -2047,16 +2135,20 @@ typedef struct sBSIM4model unsigned BSIM4lw0Given :1; unsigned BSIM4ldvtp0Given :1; unsigned BSIM4ldvtp1Given :1; + unsigned BSIM4ldvtp2Given :1; /* New DIBL/Rout */ + unsigned BSIM4ldvtp3Given :1; + unsigned BSIM4ldvtp4Given :1; + unsigned BSIM4ldvtp5Given :1; unsigned BSIM4llpe0Given :1; unsigned BSIM4llpebGiven :1; - unsigned BSIM4ldvt0Given :1; - unsigned BSIM4ldvt1Given :1; - unsigned BSIM4ldvt2Given :1; - unsigned BSIM4ldvt0wGiven :1; - unsigned BSIM4ldvt1wGiven :1; - unsigned BSIM4ldvt2wGiven :1; - unsigned BSIM4ldroutGiven :1; - unsigned BSIM4ldsubGiven :1; + unsigned BSIM4ldvt0Given :1; + unsigned BSIM4ldvt1Given :1; + unsigned BSIM4ldvt2Given :1; + unsigned BSIM4ldvt0wGiven :1; + unsigned BSIM4ldvt1wGiven :1; + unsigned BSIM4ldvt2wGiven :1; + unsigned BSIM4ldroutGiven :1; + unsigned BSIM4ldsubGiven :1; unsigned BSIM4lvth0Given :1; unsigned BSIM4luaGiven :1; unsigned BSIM4lua1Given :1; @@ -2070,32 +2162,35 @@ typedef struct sBSIM4model unsigned BSIM4llpGiven :1; unsigned BSIM4lu0Given :1; unsigned BSIM4leuGiven :1; - unsigned BSIM4lucsGiven :1; + unsigned BSIM4lucsGiven :1; unsigned BSIM4luteGiven :1; - unsigned BSIM4lucsteGiven :1; + unsigned BSIM4lucsteGiven :1; unsigned BSIM4lvoffGiven :1; unsigned BSIM4ltvoffGiven :1; + unsigned BSIM4ltnfactorGiven :1; /* v4.7 Temp dep of leakage current */ + unsigned BSIM4lteta0Given :1; /* v4.7 temp dep of leakage current */ + unsigned BSIM4ltvoffcvGiven :1; /* v4.7 temp dep of leakage current */ unsigned BSIM4lminvGiven :1; unsigned BSIM4lminvcvGiven :1; - unsigned BSIM4lrdswGiven :1; + unsigned BSIM4lrdswGiven :1; unsigned BSIM4lrswGiven :1; unsigned BSIM4lrdwGiven :1; - unsigned BSIM4lprwgGiven :1; - unsigned BSIM4lprwbGiven :1; - unsigned BSIM4lprtGiven :1; - unsigned BSIM4leta0Given :1; - unsigned BSIM4letabGiven :1; - unsigned BSIM4lpclmGiven :1; - unsigned BSIM4lpdibl1Given :1; - unsigned BSIM4lpdibl2Given :1; - unsigned BSIM4lpdiblbGiven :1; + unsigned BSIM4lprwgGiven :1; + unsigned BSIM4lprwbGiven :1; + unsigned BSIM4lprtGiven :1; + unsigned BSIM4leta0Given :1; + unsigned BSIM4letabGiven :1; + unsigned BSIM4lpclmGiven :1; + unsigned BSIM4lpdibl1Given :1; + unsigned BSIM4lpdibl2Given :1; + unsigned BSIM4lpdiblbGiven :1; unsigned BSIM4lfproutGiven :1; unsigned BSIM4lpditsGiven :1; unsigned BSIM4lpditsdGiven :1; - unsigned BSIM4lpscbe1Given :1; - unsigned BSIM4lpscbe2Given :1; - unsigned BSIM4lpvagGiven :1; - unsigned BSIM4ldeltaGiven :1; + unsigned BSIM4lpscbe1Given :1; + unsigned BSIM4lpscbe2Given :1; + unsigned BSIM4lpvagGiven :1; + unsigned BSIM4ldeltaGiven :1; unsigned BSIM4lwrGiven :1; unsigned BSIM4ldwgGiven :1; unsigned BSIM4ldwbGiven :1; @@ -2109,10 +2204,16 @@ typedef struct sBSIM4model unsigned BSIM4lbgidlGiven :1; unsigned BSIM4lcgidlGiven :1; unsigned BSIM4legidlGiven :1; + unsigned BSIM4lfgidlGiven :1; /* v4.7 New GIDL/GISL */ + unsigned BSIM4lkgidlGiven :1; /* v4.7 New GIDL/GISL */ + unsigned BSIM4lrgidlGiven :1; /* v4.7 New GIDL/GISL */ unsigned BSIM4lagislGiven :1; unsigned BSIM4lbgislGiven :1; unsigned BSIM4lcgislGiven :1; unsigned BSIM4legislGiven :1; + unsigned BSIM4lfgislGiven :1; /* v4.7 New GIDL/GISL */ + unsigned BSIM4lkgislGiven :1; /* v4.7 New GIDL/GISL */ + unsigned BSIM4lrgislGiven :1; /* v4.7 New GIDL/GISL */ unsigned BSIM4laigcGiven :1; unsigned BSIM4lbigcGiven :1; unsigned BSIM4lcigcGiven :1; @@ -2173,7 +2274,7 @@ typedef struct sBSIM4model unsigned BSIM4wagsGiven :1; unsigned BSIM4wa1Given :1; unsigned BSIM4wa2Given :1; - unsigned BSIM4wketaGiven :1; + unsigned BSIM4wketaGiven :1; unsigned BSIM4wnsubGiven :1; unsigned BSIM4wndepGiven :1; unsigned BSIM4wnsdGiven :1; @@ -2194,16 +2295,20 @@ typedef struct sBSIM4model unsigned BSIM4ww0Given :1; unsigned BSIM4wdvtp0Given :1; unsigned BSIM4wdvtp1Given :1; + unsigned BSIM4wdvtp2Given :1; /* New DIBL/Rout */ + unsigned BSIM4wdvtp3Given :1; + unsigned BSIM4wdvtp4Given :1; + unsigned BSIM4wdvtp5Given :1; unsigned BSIM4wlpe0Given :1; unsigned BSIM4wlpebGiven :1; - unsigned BSIM4wdvt0Given :1; - unsigned BSIM4wdvt1Given :1; - unsigned BSIM4wdvt2Given :1; - unsigned BSIM4wdvt0wGiven :1; - unsigned BSIM4wdvt1wGiven :1; - unsigned BSIM4wdvt2wGiven :1; - unsigned BSIM4wdroutGiven :1; - unsigned BSIM4wdsubGiven :1; + unsigned BSIM4wdvt0Given :1; + unsigned BSIM4wdvt1Given :1; + unsigned BSIM4wdvt2Given :1; + unsigned BSIM4wdvt0wGiven :1; + unsigned BSIM4wdvt1wGiven :1; + unsigned BSIM4wdvt2wGiven :1; + unsigned BSIM4wdroutGiven :1; + unsigned BSIM4wdsubGiven :1; unsigned BSIM4wvth0Given :1; unsigned BSIM4wuaGiven :1; unsigned BSIM4wua1Given :1; @@ -2217,32 +2322,35 @@ typedef struct sBSIM4model unsigned BSIM4wlpGiven :1; unsigned BSIM4wu0Given :1; unsigned BSIM4weuGiven :1; - unsigned BSIM4wucsGiven :1; + unsigned BSIM4wucsGiven :1; unsigned BSIM4wuteGiven :1; - unsigned BSIM4wucsteGiven :1; + unsigned BSIM4wucsteGiven :1; unsigned BSIM4wvoffGiven :1; unsigned BSIM4wtvoffGiven :1; + unsigned BSIM4wtnfactorGiven :1; /* v4.7 Temp dep of leakage current */ + unsigned BSIM4wteta0Given :1; /* v4.7 temp dep of leakage current */ + unsigned BSIM4wtvoffcvGiven :1; /* v4.7 temp dep of leakage current */ unsigned BSIM4wminvGiven :1; unsigned BSIM4wminvcvGiven :1; - unsigned BSIM4wrdswGiven :1; + unsigned BSIM4wrdswGiven :1; unsigned BSIM4wrswGiven :1; unsigned BSIM4wrdwGiven :1; - unsigned BSIM4wprwgGiven :1; - unsigned BSIM4wprwbGiven :1; - unsigned BSIM4wprtGiven :1; - unsigned BSIM4weta0Given :1; - unsigned BSIM4wetabGiven :1; - unsigned BSIM4wpclmGiven :1; - unsigned BSIM4wpdibl1Given :1; - unsigned BSIM4wpdibl2Given :1; - unsigned BSIM4wpdiblbGiven :1; + unsigned BSIM4wprwgGiven :1; + unsigned BSIM4wprwbGiven :1; + unsigned BSIM4wprtGiven :1; + unsigned BSIM4weta0Given :1; + unsigned BSIM4wetabGiven :1; + unsigned BSIM4wpclmGiven :1; + unsigned BSIM4wpdibl1Given :1; + unsigned BSIM4wpdibl2Given :1; + unsigned BSIM4wpdiblbGiven :1; unsigned BSIM4wfproutGiven :1; unsigned BSIM4wpditsGiven :1; unsigned BSIM4wpditsdGiven :1; - unsigned BSIM4wpscbe1Given :1; - unsigned BSIM4wpscbe2Given :1; - unsigned BSIM4wpvagGiven :1; - unsigned BSIM4wdeltaGiven :1; + unsigned BSIM4wpscbe1Given :1; + unsigned BSIM4wpscbe2Given :1; + unsigned BSIM4wpvagGiven :1; + unsigned BSIM4wdeltaGiven :1; unsigned BSIM4wwrGiven :1; unsigned BSIM4wdwgGiven :1; unsigned BSIM4wdwbGiven :1; @@ -2256,10 +2364,16 @@ typedef struct sBSIM4model unsigned BSIM4wbgidlGiven :1; unsigned BSIM4wcgidlGiven :1; unsigned BSIM4wegidlGiven :1; + unsigned BSIM4wfgidlGiven :1; /* v4.7 New GIDL/GISL */ + unsigned BSIM4wkgidlGiven :1; /* v4.7 New GIDL/GISL */ + unsigned BSIM4wrgidlGiven :1; /* v4.7 New GIDL/GISL */ unsigned BSIM4wagislGiven :1; unsigned BSIM4wbgislGiven :1; unsigned BSIM4wcgislGiven :1; unsigned BSIM4wegislGiven :1; + unsigned BSIM4wfgislGiven :1; /* v4.7 New GIDL/GISL */ + unsigned BSIM4wkgislGiven :1; /* v4.7 New GIDL/GISL */ + unsigned BSIM4wrgislGiven :1; /* v4.7 New GIDL/GISL */ unsigned BSIM4waigcGiven :1; unsigned BSIM4wbigcGiven :1; unsigned BSIM4wcigcGiven :1; @@ -2320,7 +2434,7 @@ typedef struct sBSIM4model unsigned BSIM4pagsGiven :1; unsigned BSIM4pa1Given :1; unsigned BSIM4pa2Given :1; - unsigned BSIM4pketaGiven :1; + unsigned BSIM4pketaGiven :1; unsigned BSIM4pnsubGiven :1; unsigned BSIM4pndepGiven :1; unsigned BSIM4pnsdGiven :1; @@ -2341,16 +2455,20 @@ typedef struct sBSIM4model unsigned BSIM4pw0Given :1; unsigned BSIM4pdvtp0Given :1; unsigned BSIM4pdvtp1Given :1; + unsigned BSIM4pdvtp2Given :1; /* New DIBL/Rout */ + unsigned BSIM4pdvtp3Given :1; + unsigned BSIM4pdvtp4Given :1; + unsigned BSIM4pdvtp5Given :1; unsigned BSIM4plpe0Given :1; unsigned BSIM4plpebGiven :1; - unsigned BSIM4pdvt0Given :1; - unsigned BSIM4pdvt1Given :1; - unsigned BSIM4pdvt2Given :1; - unsigned BSIM4pdvt0wGiven :1; - unsigned BSIM4pdvt1wGiven :1; - unsigned BSIM4pdvt2wGiven :1; - unsigned BSIM4pdroutGiven :1; - unsigned BSIM4pdsubGiven :1; + unsigned BSIM4pdvt0Given :1; + unsigned BSIM4pdvt1Given :1; + unsigned BSIM4pdvt2Given :1; + unsigned BSIM4pdvt0wGiven :1; + unsigned BSIM4pdvt1wGiven :1; + unsigned BSIM4pdvt2wGiven :1; + unsigned BSIM4pdroutGiven :1; + unsigned BSIM4pdsubGiven :1; unsigned BSIM4pvth0Given :1; unsigned BSIM4puaGiven :1; unsigned BSIM4pua1Given :1; @@ -2364,32 +2482,35 @@ typedef struct sBSIM4model unsigned BSIM4plpGiven :1; unsigned BSIM4pu0Given :1; unsigned BSIM4peuGiven :1; - unsigned BSIM4pucsGiven :1; + unsigned BSIM4pucsGiven :1; unsigned BSIM4puteGiven :1; - unsigned BSIM4pucsteGiven :1; + unsigned BSIM4pucsteGiven :1; unsigned BSIM4pvoffGiven :1; unsigned BSIM4ptvoffGiven :1; + unsigned BSIM4ptnfactorGiven :1; /* v4.7 Temp dep of leakage current */ + unsigned BSIM4pteta0Given :1; /* v4.7 temp dep of leakage current */ + unsigned BSIM4ptvoffcvGiven :1; /* v4.7 temp dep of leakage current */ unsigned BSIM4pminvGiven :1; unsigned BSIM4pminvcvGiven :1; - unsigned BSIM4prdswGiven :1; + unsigned BSIM4prdswGiven :1; unsigned BSIM4prswGiven :1; unsigned BSIM4prdwGiven :1; - unsigned BSIM4pprwgGiven :1; - unsigned BSIM4pprwbGiven :1; - unsigned BSIM4pprtGiven :1; - unsigned BSIM4peta0Given :1; - unsigned BSIM4petabGiven :1; - unsigned BSIM4ppclmGiven :1; - unsigned BSIM4ppdibl1Given :1; - unsigned BSIM4ppdibl2Given :1; - unsigned BSIM4ppdiblbGiven :1; + unsigned BSIM4pprwgGiven :1; + unsigned BSIM4pprwbGiven :1; + unsigned BSIM4pprtGiven :1; + unsigned BSIM4peta0Given :1; + unsigned BSIM4petabGiven :1; + unsigned BSIM4ppclmGiven :1; + unsigned BSIM4ppdibl1Given :1; + unsigned BSIM4ppdibl2Given :1; + unsigned BSIM4ppdiblbGiven :1; unsigned BSIM4pfproutGiven :1; unsigned BSIM4ppditsGiven :1; unsigned BSIM4ppditsdGiven :1; - unsigned BSIM4ppscbe1Given :1; - unsigned BSIM4ppscbe2Given :1; - unsigned BSIM4ppvagGiven :1; - unsigned BSIM4pdeltaGiven :1; + unsigned BSIM4ppscbe1Given :1; + unsigned BSIM4ppscbe2Given :1; + unsigned BSIM4ppvagGiven :1; + unsigned BSIM4pdeltaGiven :1; unsigned BSIM4pwrGiven :1; unsigned BSIM4pdwgGiven :1; unsigned BSIM4pdwbGiven :1; @@ -2403,10 +2524,16 @@ typedef struct sBSIM4model unsigned BSIM4pbgidlGiven :1; unsigned BSIM4pcgidlGiven :1; unsigned BSIM4pegidlGiven :1; + unsigned BSIM4pfgidlGiven :1; /* v4.7 New GIDL/GISL */ + unsigned BSIM4pkgidlGiven :1; /* v4.7 New GIDL/GISL */ + unsigned BSIM4prgidlGiven :1; /* v4.7 New GIDL/GISL */ unsigned BSIM4pagislGiven :1; unsigned BSIM4pbgislGiven :1; unsigned BSIM4pcgislGiven :1; unsigned BSIM4pegislGiven :1; + unsigned BSIM4pfgislGiven :1; /* v4.7 New GIDL/GISL */ + unsigned BSIM4pkgislGiven :1; /* v4.7 New GIDL/GISL */ + unsigned BSIM4prgislGiven :1; /* v4.7 New GIDL/GISL */ unsigned BSIM4paigcGiven :1; unsigned BSIM4pbigcGiven :1; unsigned BSIM4pcigcGiven :1; @@ -2476,7 +2603,7 @@ typedef struct sBSIM4model unsigned BSIM4SbulkJctGateSideGradingCoeffGiven :1; unsigned BSIM4SunitLengthGateSidewallJctCapGiven :1; unsigned BSIM4SjctEmissionCoeffGiven :1; - unsigned BSIM4SjctTempExponentGiven :1; + unsigned BSIM4SjctTempExponentGiven :1; unsigned BSIM4DjctSatCurDensityGiven :1; unsigned BSIM4DjctSidewallSatCurDensityGiven :1; @@ -2493,13 +2620,13 @@ typedef struct sBSIM4model unsigned BSIM4DjctEmissionCoeffGiven :1; unsigned BSIM4DjctTempExponentGiven :1; - unsigned BSIM4oxideTrapDensityAGiven :1; - unsigned BSIM4oxideTrapDensityBGiven :1; - unsigned BSIM4oxideTrapDensityCGiven :1; - unsigned BSIM4emGiven :1; - unsigned BSIM4efGiven :1; - unsigned BSIM4afGiven :1; - unsigned BSIM4kfGiven :1; + unsigned BSIM4oxideTrapDensityAGiven :1; + unsigned BSIM4oxideTrapDensityBGiven :1; + unsigned BSIM4oxideTrapDensityCGiven :1; + unsigned BSIM4emGiven :1; + unsigned BSIM4efGiven :1; + unsigned BSIM4afGiven :1; + unsigned BSIM4kfGiven :1; unsigned BSIM4LintGiven :1; unsigned BSIM4LlGiven :1; @@ -2595,7 +2722,7 @@ typedef struct sBSIM4model #define BSIM4_GEOMOD 17 #define BSIM4_RGEOMOD 18 #define BSIM4_NF 19 -#define BSIM4_MIN 20 +#define BSIM4_MIN 20 #define BSIM4_ACNQSMOD 22 #define BSIM4_RBDB 23 #define BSIM4_RBSB 24 @@ -2610,7 +2737,7 @@ typedef struct sBSIM4model #define BSIM4_NGCON 33 #define BSIM4_SCA 34 #define BSIM4_SCB 35 -#define BSIM4_SCC 36 +#define BSIM4_SCC 36 #define BSIM4_SC 37 #define BSIM4_M 38 @@ -2643,10 +2770,10 @@ typedef struct sBSIM4model #define BSIM4_MOD_RBODYMOD 91 #define BSIM4_MOD_CAPMOD 92 #define BSIM4_MOD_TRNQSMOD 93 -#define BSIM4_MOD_MOBMOD 94 +#define BSIM4_MOD_MOBMOD 94 #define BSIM4_MOD_TNOIMOD 95 #define BSIM4_MOD_EOT 96 -#define BSIM4_MOD_VDDEOT 97 +#define BSIM4_MOD_VDDEOT 97 #define BSIM4_MOD_TOXE 98 #define BSIM4_MOD_CDSC 99 #define BSIM4_MOD_CDSCB 100 @@ -2658,7 +2785,7 @@ typedef struct sBSIM4model #define BSIM4_MOD_A0 106 #define BSIM4_MOD_A1 107 #define BSIM4_MOD_A2 108 -#define BSIM4_MOD_KETA 109 +#define BSIM4_MOD_KETA 109 #define BSIM4_MOD_NSUB 110 #define BSIM4_MOD_PHIG 111 #define BSIM4_MOD_EPSRGATE 112 @@ -2673,7 +2800,7 @@ typedef struct sBSIM4model #define BSIM4_MOD_GAMMA1 121 #define BSIM4_MOD_GAMMA2 122 #define BSIM4_MOD_VBX 123 -#define BSIM4_MOD_BINUNIT 124 +#define BSIM4_MOD_BINUNIT 124 #define BSIM4_MOD_VBM 125 #define BSIM4_MOD_XT 126 #define BSIM4_MOD_K1 129 @@ -2807,7 +2934,7 @@ typedef struct sBSIM4model #define BSIM4_MOD_CIGC 261 #define BSIM4_MOD_AIGBACC 262 #define BSIM4_MOD_BIGBACC 263 -#define BSIM4_MOD_CIGBACC 264 +#define BSIM4_MOD_CIGBACC 264 #define BSIM4_MOD_AIGBINV 265 #define BSIM4_MOD_BIGBINV 266 #define BSIM4_MOD_CIGBINV 267 @@ -2841,6 +2968,7 @@ typedef struct sBSIM4model #define BSIM4_MOD_TVFBSDOFF 295 #define BSIM4_MOD_MINVCV 296 #define BSIM4_MOD_VOFFCVL 297 +#define BSIM4_MOD_MTRLCOMPATMOD 380 /* Length dependence */ #define BSIM4_MOD_LCDSC 301 @@ -2951,7 +3079,7 @@ typedef struct sBSIM4model #define BSIM4_MOD_LAIGC 416 #define BSIM4_MOD_LBIGC 417 #define BSIM4_MOD_LCIGC 418 -#define BSIM4_MOD_LAIGBACC 419 +#define BSIM4_MOD_LAIGBACC 419 #define BSIM4_MOD_LBIGBACC 420 #define BSIM4_MOD_LCIGBACC 421 #define BSIM4_MOD_LAIGBINV 422 @@ -2978,6 +3106,48 @@ typedef struct sBSIM4model #define BSIM4_MOD_LLP 442 #define BSIM4_MOD_LMINVCV 443 +#define BSIM4_MOD_FGIDL 444 /* v4.7 New GIDL/GISL*/ +#define BSIM4_MOD_KGIDL 445 /* v4.7 New GIDL/GISL*/ +#define BSIM4_MOD_RGIDL 446 /* v4.7 New GIDL/GISL*/ +#define BSIM4_MOD_FGISL 447 /* v4.7 New GIDL/GISL*/ +#define BSIM4_MOD_KGISL 448 /* v4.7 New GIDL/GISL*/ +#define BSIM4_MOD_RGISL 449 /* v4.7 New GIDL/GISL*/ +#define BSIM4_MOD_LFGIDL 450 /* v4.7 New GIDL/GISL*/ +#define BSIM4_MOD_LKGIDL 451 /* v4.7 New GIDL/GISL*/ +#define BSIM4_MOD_LRGIDL 452 /* v4.7 New GIDL/GISL*/ +#define BSIM4_MOD_LFGISL 453 /* v4.7 New GIDL/GISL*/ +#define BSIM4_MOD_LKGISL 454 /* v4.7 New GIDL/GISL*/ +#define BSIM4_MOD_LRGISL 455 /* v4.7 New GIDL/GISL*/ +#define BSIM4_MOD_WFGIDL 456 /* v4.7 New GIDL/GISL*/ +#define BSIM4_MOD_WKGIDL 457 /* v4.7 New GIDL/GISL*/ +#define BSIM4_MOD_WRGIDL 458 /* v4.7 New GIDL/GISL*/ +#define BSIM4_MOD_WFGISL 459 /* v4.7 New GIDL/GISL*/ +#define BSIM4_MOD_WKGISL 460 /* v4.7 New GIDL/GISL*/ +#define BSIM4_MOD_WRGISL 461 /* v4.7 New GIDL/GISL*/ +#define BSIM4_MOD_PFGIDL 462 /* v4.7 New GIDL/GISL*/ +#define BSIM4_MOD_PKGIDL 463 /* v4.7 New GIDL/GISL*/ +#define BSIM4_MOD_PRGIDL 464 /* v4.7 New GIDL/GISL*/ +#define BSIM4_MOD_PFGISL 465 /* v4.7 New GIDL/GISL*/ +#define BSIM4_MOD_PKGISL 466 /* v4.7 New GIDL/GISL*/ +#define BSIM4_MOD_PRGISL 467 /* v4.7 New GIDL/GISL*/ +#define BSIM4_MOD_GIDLMOD 379 /* v4.7 New GIDL/GISL*/ +#define BSIM4_MOD_DVTP2 468 /* v4.7 NEW DIBL/Rout*/ +#define BSIM4_MOD_DVTP3 469 /* v4.7 NEW DIBL/Rout*/ +#define BSIM4_MOD_DVTP4 470 /* v4.7 NEW DIBL/Rout*/ +#define BSIM4_MOD_DVTP5 471 /* v4.7 NEW DIBL/Rout*/ +#define BSIM4_MOD_LDVTP2 472 /* v4.7 NEW DIBL/Rout*/ +#define BSIM4_MOD_LDVTP3 473 /* v4.7 NEW DIBL/Rout*/ +#define BSIM4_MOD_LDVTP4 474 /* v4.7 NEW DIBL/Rout*/ +#define BSIM4_MOD_LDVTP5 475 /* v4.7 NEW DIBL/Rout*/ +#define BSIM4_MOD_WDVTP2 476 /* v4.7 NEW DIBL/Rout*/ +#define BSIM4_MOD_WDVTP3 477 /* v4.7 NEW DIBL/Rout*/ +#define BSIM4_MOD_WDVTP4 478 /* v4.7 NEW DIBL/Rout*/ +#define BSIM4_MOD_WDVTP5 479 /* v4.7 NEW DIBL/Rout*/ +#define BSIM4_MOD_PDVTP2 480 /* v4.7 NEW DIBL/Rout*/ +#define BSIM4_MOD_PDVTP3 298 /* v4.7 NEW DIBL/Rout*/ +#define BSIM4_MOD_PDVTP4 299 /* v4.7 NEW DIBL/Rout*/ +#define BSIM4_MOD_PDVTP5 300 /* v4.7 NEW DIBL/Rout*/ + /* Width dependence */ #define BSIM4_MOD_WCDSC 481 #define BSIM4_MOD_WCDSCB 482 @@ -3087,7 +3257,7 @@ typedef struct sBSIM4model #define BSIM4_MOD_WAIGC 596 #define BSIM4_MOD_WBIGC 597 #define BSIM4_MOD_WCIGC 598 -#define BSIM4_MOD_WAIGBACC 599 +#define BSIM4_MOD_WAIGBACC 599 #define BSIM4_MOD_WBIGBACC 600 #define BSIM4_MOD_WCIGBACC 601 #define BSIM4_MOD_WAIGBINV 602 @@ -3229,7 +3399,7 @@ typedef struct sBSIM4model #define BSIM4_MOD_PAIGC 776 #define BSIM4_MOD_PBIGC 777 #define BSIM4_MOD_PCIGC 778 -#define BSIM4_MOD_PAIGBACC 779 +#define BSIM4_MOD_PAIGBACC 779 #define BSIM4_MOD_PBIGBACC 780 #define BSIM4_MOD_PCIGBACC 781 #define BSIM4_MOD_PAIGBINV 782 @@ -3262,11 +3432,11 @@ typedef struct sBSIM4model #define BSIM4_MOD_LKVTH0 808 #define BSIM4_MOD_WKVTH0 809 #define BSIM4_MOD_PKVTH0 810 -#define BSIM4_MOD_WLOD 811 -#define BSIM4_MOD_STK2 812 -#define BSIM4_MOD_LODK2 813 -#define BSIM4_MOD_STETA0 814 -#define BSIM4_MOD_LODETA0 815 +#define BSIM4_MOD_WLOD 811 +#define BSIM4_MOD_STK2 812 +#define BSIM4_MOD_LODK2 813 +#define BSIM4_MOD_STETA0 814 +#define BSIM4_MOD_LODETA0 815 #define BSIM4_MOD_WEB 816 #define BSIM4_MOD_WEC 817 @@ -3355,29 +3525,29 @@ typedef struct sBSIM4model /* trap-assisted tunneling */ #define BSIM4_MOD_JTSS 900 -#define BSIM4_MOD_JTSD 901 -#define BSIM4_MOD_JTSSWS 902 -#define BSIM4_MOD_JTSSWD 903 -#define BSIM4_MOD_JTSSWGS 904 -#define BSIM4_MOD_JTSSWGD 905 -#define BSIM4_MOD_NJTS 906 -#define BSIM4_MOD_NJTSSW 907 -#define BSIM4_MOD_NJTSSWG 908 -#define BSIM4_MOD_XTSS 909 -#define BSIM4_MOD_XTSD 910 -#define BSIM4_MOD_XTSSWS 911 -#define BSIM4_MOD_XTSSWD 912 -#define BSIM4_MOD_XTSSWGS 913 -#define BSIM4_MOD_XTSSWGD 914 -#define BSIM4_MOD_TNJTS 915 -#define BSIM4_MOD_TNJTSSW 916 -#define BSIM4_MOD_TNJTSSWG 917 +#define BSIM4_MOD_JTSD 901 +#define BSIM4_MOD_JTSSWS 902 +#define BSIM4_MOD_JTSSWD 903 +#define BSIM4_MOD_JTSSWGS 904 +#define BSIM4_MOD_JTSSWGD 905 +#define BSIM4_MOD_NJTS 906 +#define BSIM4_MOD_NJTSSW 907 +#define BSIM4_MOD_NJTSSWG 908 +#define BSIM4_MOD_XTSS 909 +#define BSIM4_MOD_XTSD 910 +#define BSIM4_MOD_XTSSWS 911 +#define BSIM4_MOD_XTSSWD 912 +#define BSIM4_MOD_XTSSWGS 913 +#define BSIM4_MOD_XTSSWGD 914 +#define BSIM4_MOD_TNJTS 915 +#define BSIM4_MOD_TNJTSSW 916 +#define BSIM4_MOD_TNJTSSWG 917 #define BSIM4_MOD_VTSS 918 -#define BSIM4_MOD_VTSD 919 -#define BSIM4_MOD_VTSSWS 920 -#define BSIM4_MOD_VTSSWD 921 -#define BSIM4_MOD_VTSSWGS 922 -#define BSIM4_MOD_VTSSWGD 923 +#define BSIM4_MOD_VTSD 919 +#define BSIM4_MOD_VTSSWS 920 +#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 @@ -3434,9 +3604,9 @@ typedef struct sBSIM4model #define BSIM4_DRAINCONDUCT 991 #define BSIM4_CBDB 992 #define BSIM4_CBSB 993 -#define BSIM4_CSUB 994 -#define BSIM4_QINV 995 -#define BSIM4_IGIDL 996 +#define BSIM4_CSUB 994 +#define BSIM4_QINV 995 +#define BSIM4_IGIDL 996 #define BSIM4_CSGB 997 #define BSIM4_CSDB 998 #define BSIM4_CSSB 999 @@ -3445,14 +3615,14 @@ typedef struct sBSIM4model #define BSIM4_CSBB 1002 #define BSIM4_CBBB 1003 #define BSIM4_QS 1004 -#define BSIM4_IGISL 1005 -#define BSIM4_IGS 1006 -#define BSIM4_IGD 1007 -#define BSIM4_IGB 1008 -#define BSIM4_IGCS 1009 -#define BSIM4_IGCD 1010 -#define BSIM4_QDEF 1011 -#define BSIM4_DELVT0 1012 +#define BSIM4_IGISL 1005 +#define BSIM4_IGS 1006 +#define BSIM4_IGD 1007 +#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 @@ -3465,13 +3635,13 @@ typedef struct sBSIM4model #define BSIM4_MOD_LKVTH0WE 1061 #define BSIM4_MOD_LK2WE 1062 -#define BSIM4_MOD_LKU0WE 1063 +#define BSIM4_MOD_LKU0WE 1063 #define BSIM4_MOD_WKVTH0WE 1064 #define BSIM4_MOD_WK2WE 1065 -#define BSIM4_MOD_WKU0WE 1066 +#define BSIM4_MOD_WKU0WE 1066 #define BSIM4_MOD_PKVTH0WE 1067 #define BSIM4_MOD_PK2WE 1068 -#define BSIM4_MOD_PKU0WE 1069 +#define BSIM4_MOD_PKU0WE 1069 #define BSIM4_MOD_RBPS0 1101 #define BSIM4_MOD_RBPSL 1102 @@ -3553,16 +3723,36 @@ typedef struct sBSIM4model #define BSIM4_MOD_TNJTSSWD 1254 #define BSIM4_MOD_TNJTSSWGD 1255 +/* v4.7 temp dep of leakage current */ + +#define BSIM4_MOD_TNFACTOR 1256 +#define BSIM4_MOD_TETA0 1257 +#define BSIM4_MOD_TVOFFCV 1258 +#define BSIM4_MOD_LTNFACTOR 1260 +#define BSIM4_MOD_LTETA0 1261 +#define BSIM4_MOD_LTVOFFCV 1262 +#define BSIM4_MOD_WTNFACTOR 1264 +#define BSIM4_MOD_WTETA0 1265 +#define BSIM4_MOD_WTVOFFCV 1266 +#define BSIM4_MOD_PTNFACTOR 1268 +#define BSIM4_MOD_PTETA0 1269 +#define BSIM4_MOD_PTVOFFCV 1270 + +/* tnoiMod=2 (v4.7) */ +#define BSIM4_MOD_TNOIC 1272 +#define BSIM4_MOD_RNOIC 1273 + #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*, + double*,double*,double*, double*, double*, double*, double*, + double*, double*, double*, double*, double*, double*, double*, double*, double*, double*, double*, CKTcircuit*); extern int BSIM4debug(BSIM4model*, BSIM4instance*, CKTcircuit*, int); extern int BSIM4checkModel(BSIM4model*, BSIM4instance*, CKTcircuit*); extern int BSIM4PAeffGeo(double, int, int, double, double, double, double, double *, double *, double *, double *); extern int BSIM4RdseffGeo(double, int, int, int, double, double, double, double, double, int, double *); - +extern int BSIM4RdsEndIso(double, double, double, double, double, double, int, int, double *); +extern int BSIM4RdsEndSha(double, double, double, double, double, double, int, int, double *); #endif /*BSIM4*/ diff --git a/src/spicelib/devices/bsim4v6/.cvsignore b/src/spicelib/devices/bsim4v6/.cvsignore new file mode 100644 index 000000000..dc4caac80 --- /dev/null +++ b/src/spicelib/devices/bsim4v6/.cvsignore @@ -0,0 +1,6 @@ +Makefile.in +Makefile +.deps +.libs +*.lo +*.la diff --git a/src/spicelib/devices/bsim4v6/B4TERMS_OF_USE b/src/spicelib/devices/bsim4v6/B4TERMS_OF_USE new file mode 100644 index 000000000..5cc4023bb --- /dev/null +++ b/src/spicelib/devices/bsim4v6/B4TERMS_OF_USE @@ -0,0 +1,33 @@ + +The terms under which the software is provided are as the following. + +Software is distributed as is, completely without warranty or service +support. The University of California and its employees are not liable +for the condition or performance of the software. + +The University owns the copyright but shall not be liable for any +infringement of copyright or other proprietary rights brought by third +parties against the users of the software. + +The University of California hereby disclaims all implied warranties. + +The University of California grants the users the right to modify, copy, +and redistribute the software and documentation, both within the user's +organization and externally, subject to the following restrictions: + +1. The users agree not to charge for the University of California code + itself but may charge for additions, extensions, or support. + +2. In any product based on the software, the users agree to acknowledge + the UC Berkeley BSIM Research Group that developed the software. This + acknowledgment shall appear in the product documentation. + +3. The users agree to obey all U.S. Government restrictions governing + redistribution or export of the software. + +4. The users agree to reproduce any copyright notice which appears on + the software on any copy or modification of such made available + to others. + +Chenming Hu, and Weidong Liu +Mar. 2000 diff --git a/src/spicelib/devices/bsim4v6/Makefile.am b/src/spicelib/devices/bsim4v6/Makefile.am new file mode 100644 index 000000000..b157e473d --- /dev/null +++ b/src/spicelib/devices/bsim4v6/Makefile.am @@ -0,0 +1,37 @@ +## Process this file with automake to produce Makefile.in + +noinst_LTLIBRARIES = libbsim4v6.la + +libbsim4v6_la_SOURCES = \ + b4v6.c \ + b4v6acld.c \ + b4v6ask.c \ + b4v6check.c \ + b4v6cvtest.c \ + b4v6del.c \ + b4v6dest.c \ + b4v6geo.c \ + b4v6getic.c \ + b4v6ld.c \ + b4v6mask.c \ + b4v6mdel.c \ + b4v6mpar.c \ + b4v6noi.c \ + b4v6par.c \ + b4v6pzld.c \ + b4v6set.c \ + b4v6temp.c \ + b4v6trunc.c \ + bsim4v6def.h \ + bsim4v6ext.h \ + bsim4v6init.c \ + bsim4v6init.h \ + bsim4v6itf.h + + + +AM_CPPFLAGS = -I$(top_srcdir)/src/include + +MAINTAINERCLEANFILES = Makefile.in + +EXTRA_DIST = B4TERMS_OF_USE diff --git a/src/spicelib/devices/bsim4v6/b4v6.c b/src/spicelib/devices/bsim4v6/b4v6.c new file mode 100644 index 000000000..810e0f078 --- /dev/null +++ b/src/spicelib/devices/bsim4v6/b4v6.c @@ -0,0 +1,992 @@ +/**** BSIM4.6.2 Released by Wenwei Yang 07/31/2008 ****/ + +/********** + * Copyright 2006 Regents of the University of California. All rights reserved. + * File: b4.c of BSIM4.6.2. + * Author: 2000 Weidong Liu + * Authors: 2001- Xuemei Xi, Mohan Dunga, Ali Niknejad, Chenming Hu. + * Authors: 2006- Mohan Dunga, Ali Niknejad, Chenming Hu + * Authors: 2007- Mohan Dunga, Wenwei Yang, Ali Niknejad, Chenming Hu + * Authors: 2008- Wenwei Yang, 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. + * Modified by Mohan Dunga, 12/13/2006. + * Modified by Mohan Dunga, Wenwei Yang, 05/18/2007. + * Modified by Wenwei Yang, 07/31/2008. + **********/ + +#include "ngspice.h" +#include "devdefs.h" +#include "bsim4v6def.h" +#include "suffix.h" + +IFparm BSIM4v6pTable[] = { /* parameters */ +IOP( "l", BSIM4v6_L, IF_REAL , "Length"), +IOP( "w", BSIM4v6_W, IF_REAL , "Width"), +IOP( "m", BSIM4v6_M, IF_REAL , "Separate Parallel multiplier"), +IOP( "nf", BSIM4v6_NF, IF_REAL , "Number of fingers"), +IOP( "sa", BSIM4v6_SA, IF_REAL , "distance between OD edge to poly of one side "), +IOP( "sb", BSIM4v6_SB, IF_REAL , "distance between OD edge to poly of the other side"), +IOP( "sd", BSIM4v6_SD, IF_REAL , "distance between neighbour fingers"), +IOP( "sca", BSIM4v6_SCA, IF_REAL , "Integral of the first distribution function for scattered well dopant"), +IOP( "scb", BSIM4v6_SCB, IF_REAL , "Integral of the second distribution function for scattered well dopant"), +IOP( "scc", BSIM4v6_SCC, IF_REAL , "Integral of the third distribution function for scattered well dopant"), +IOP( "sc", BSIM4v6_SC, IF_REAL , "Distance to a single well edge "), +IOP( "min", BSIM4v6_MIN, IF_INTEGER , "Minimize either D or S"), +IOP( "ad", BSIM4v6_AD, IF_REAL , "Drain area"), +IOP( "as", BSIM4v6_AS, IF_REAL , "Source area"), +IOP( "pd", BSIM4v6_PD, IF_REAL , "Drain perimeter"), +IOP( "ps", BSIM4v6_PS, IF_REAL , "Source perimeter"), +IOP( "nrd", BSIM4v6_NRD, IF_REAL , "Number of squares in drain"), +IOP( "nrs", BSIM4v6_NRS, IF_REAL , "Number of squares in source"), +IOP( "off", BSIM4v6_OFF, IF_FLAG , "Device is initially off"), +IOP( "rbdb", BSIM4v6_RBDB, IF_REAL , "Body resistance"), +IOP( "rbsb", BSIM4v6_RBSB, IF_REAL , "Body resistance"), +IOP( "rbpb", BSIM4v6_RBPB, IF_REAL , "Body resistance"), +IOP( "rbps", BSIM4v6_RBPS, IF_REAL , "Body resistance"), +IOP( "rbpd", BSIM4v6_RBPD, IF_REAL , "Body resistance"), +IOP( "delvto", BSIM4v6_DELVTO, IF_REAL , "Zero bias threshold voltage variation"), +IOP( "xgw", BSIM4v6_XGW, IF_REAL, "Distance from gate contact center to device edge"), +IOP( "ngcon", BSIM4v6_NGCON, IF_REAL, "Number of gate contacts"), + + +IOP( "trnqsmod", BSIM4v6_TRNQSMOD, IF_INTEGER, "Transient NQS model selector"), +IOP( "acnqsmod", BSIM4v6_ACNQSMOD, IF_INTEGER, "AC NQS model selector"), +IOP( "rbodymod", BSIM4v6_RBODYMOD, IF_INTEGER, "Distributed body R model selector"), +IOP( "rgatemod", BSIM4v6_RGATEMOD, IF_INTEGER, "Gate resistance model selector"), +IOP( "geomod", BSIM4v6_GEOMOD, IF_INTEGER, "Geometry dependent parasitics model selector"), +IOP( "rgeomod", BSIM4v6_RGEOMOD, IF_INTEGER, "S/D resistance and contact model selector"), +IP( "ic", BSIM4v6_IC, IF_REALVEC , "Vector of DS,GS,BS initial voltages"), +OP( "gmbs", BSIM4v6_GMBS, IF_REAL, "Gmb"), +OP( "gm", BSIM4v6_GM, IF_REAL, "Gm"), +OP( "gds", BSIM4v6_GDS, IF_REAL, "Gds"), +OP( "vdsat", BSIM4v6_VDSAT, IF_REAL, "Vdsat"), +OP( "vth", BSIM4v6_VON, IF_REAL, "Vth"), +OP( "id", BSIM4v6_CD, IF_REAL, "Ids"), +OP( "ibd", BSIM4v6_CBD, IF_REAL, "Ibd"), +OP( "ibs", BSIM4v6_CBS, IF_REAL, "Ibs"), +OP( "gbd", BSIM4v6_GBD, IF_REAL, "gbd"), +OP( "gbs", BSIM4v6_GBS, IF_REAL, "gbs"), +OP( "isub", BSIM4v6_CSUB, IF_REAL, "Isub"), +OP( "igidl", BSIM4v6_IGIDL, IF_REAL, "Igidl"), +OP( "igisl", BSIM4v6_IGISL, IF_REAL, "Igisl"), +OP( "igs", BSIM4v6_IGS, IF_REAL, "Igs"), +OP( "igd", BSIM4v6_IGD, IF_REAL, "Igd"), +OP( "igb", BSIM4v6_IGB, IF_REAL, "Igb"), +OP( "igcs", BSIM4v6_IGCS, IF_REAL, "Igcs"), +OP( "igcd", BSIM4v6_IGCD, IF_REAL, "Igcd"), +OP( "vbs", BSIM4v6_VBS, IF_REAL, "Vbs"), +OP( "vgs", BSIM4v6_VGS, IF_REAL, "Vgs"), +OP( "vds", BSIM4v6_VDS, IF_REAL, "Vds"), +OP( "cgg", BSIM4v6_CGGB, IF_REAL, "Cggb"), +OP( "cgs", BSIM4v6_CGSB, IF_REAL, "Cgsb"), +OP( "cgd", BSIM4v6_CGDB, IF_REAL, "Cgdb"), +OP( "cbg", BSIM4v6_CBGB, IF_REAL, "Cbgb"), +OP( "cbd", BSIM4v6_CBDB, IF_REAL, "Cbdb"), +OP( "cbs", BSIM4v6_CBSB, IF_REAL, "Cbsb"), +OP( "cdg", BSIM4v6_CDGB, IF_REAL, "Cdgb"), +OP( "cdd", BSIM4v6_CDDB, IF_REAL, "Cddb"), +OP( "cds", BSIM4v6_CDSB, IF_REAL, "Cdsb"), +OP( "csg", BSIM4v6_CSGB, IF_REAL, "Csgb"), +OP( "csd", BSIM4v6_CSDB, IF_REAL, "Csdb"), +OP( "css", BSIM4v6_CSSB, IF_REAL, "Cssb"), +OP( "cgb", BSIM4v6_CGBB, IF_REAL, "Cgbb"), +OP( "cdb", BSIM4v6_CDBB, IF_REAL, "Cdbb"), +OP( "csb", BSIM4v6_CSBB, IF_REAL, "Csbb"), +OP( "cbb", BSIM4v6_CBBB, IF_REAL, "Cbbb"), +OP( "capbd", BSIM4v6_CAPBD, IF_REAL, "Capbd"), +OP( "capbs", BSIM4v6_CAPBS, IF_REAL, "Capbs"), +OP( "qg", BSIM4v6_QG, IF_REAL, "Qgate"), +OP( "qb", BSIM4v6_QB, IF_REAL, "Qbulk"), +OP( "qd", BSIM4v6_QD, IF_REAL, "Qdrain"), +OP( "qs", BSIM4v6_QS, IF_REAL, "Qsource"), +OP( "qinv", BSIM4v6_QINV, IF_REAL, "Qinversion"), +OP( "qdef", BSIM4v6_QDEF, IF_REAL, "Qdef"), +OP( "gcrg", BSIM4v6_GCRG, IF_REAL, "Gcrg"), +OP( "gtau", BSIM4v6_GTAU, IF_REAL, "Gtau"), +}; + +IFparm BSIM4v6mPTable[] = { /* model parameters */ +IOP( "cvchargemod", BSIM4v6_MOD_CVCHARGEMOD, IF_INTEGER, "Capacitance Charge model selector"), +IOP( "capmod", BSIM4v6_MOD_CAPMOD, IF_INTEGER, "Capacitance model selector"), +IOP( "diomod", BSIM4v6_MOD_DIOMOD, IF_INTEGER, "Diode IV model selector"), +IOP( "rdsmod", BSIM4v6_MOD_RDSMOD, IF_INTEGER, "Bias-dependent S/D resistance model selector"), +IOP( "trnqsmod", BSIM4v6_MOD_TRNQSMOD, IF_INTEGER, "Transient NQS model selector"), +IOP( "acnqsmod", BSIM4v6_MOD_ACNQSMOD, IF_INTEGER, "AC NQS model selector"), +IOP( "mobmod", BSIM4v6_MOD_MOBMOD, IF_INTEGER, "Mobility model selector"), +IOP( "rbodymod", BSIM4v6_MOD_RBODYMOD, IF_INTEGER, "Distributed body R model selector"), +IOP( "rgatemod", BSIM4v6_MOD_RGATEMOD, IF_INTEGER, "Gate R model selector"), +IOP( "permod", BSIM4v6_MOD_PERMOD, IF_INTEGER, "Pd and Ps model selector"), +IOP( "geomod", BSIM4v6_MOD_GEOMOD, IF_INTEGER, "Geometry dependent parasitics model selector"), +IOP( "fnoimod", BSIM4v6_MOD_FNOIMOD, IF_INTEGER, "Flicker noise model selector"), +IOP( "tnoimod", BSIM4v6_MOD_TNOIMOD, IF_INTEGER, "Thermal noise model selector"), +IOP( "mtrlmod", BSIM4v6_MOD_MTRLMOD, IF_INTEGER, "parameter for non-silicon substrate or metal gate selector"), +IOP( "igcmod", BSIM4v6_MOD_IGCMOD, IF_INTEGER, "Gate-to-channel Ig model selector"), +IOP( "igbmod", BSIM4v6_MOD_IGBMOD, IF_INTEGER, "Gate-to-body Ig model selector"), +IOP( "tempmod", BSIM4v6_MOD_TEMPMOD, IF_INTEGER, "Temperature model selector"), +IOP( "paramchk", BSIM4v6_MOD_PARAMCHK, IF_INTEGER, "Model parameter checking selector"), +IOP( "binunit", BSIM4v6_MOD_BINUNIT, IF_INTEGER, "Bin unit selector"), +IOP( "version", BSIM4v6_MOD_VERSION, IF_STRING, "parameter for model version"), +IOP( "eot", BSIM4v6_MOD_EOT, IF_REAL, "Equivalent gate oxide thickness in meters"), +IOP( "vddeot", BSIM4v6_MOD_VDDEOT, IF_REAL, "Voltage for extraction of Equivalent gate oxide thickness"), +IOP( "tempeot", BSIM4v6_MOD_TEMPEOT, IF_REAL, " Temperature for extraction of EOT"), +IOP( "leffeot", BSIM4v6_MOD_LEFFEOT, IF_REAL, " Effective length for extraction of EOT"), +IOP( "weffeot", BSIM4v6_MOD_WEFFEOT, IF_REAL, "Effective width for extraction of EOT"), +IOP( "ados", BSIM4v6_MOD_ADOS, IF_REAL, "Charge centroid parameter"), +IOP( "bdos", BSIM4v6_MOD_BDOS, IF_REAL, "Charge centroid parameter"), +IOP( "toxe", BSIM4v6_MOD_TOXE, IF_REAL, "Electrical gate oxide thickness in meters"), +IOP( "toxp", BSIM4v6_MOD_TOXP, IF_REAL, "Physical gate oxide thickness in meters"), +IOP( "toxm", BSIM4v6_MOD_TOXM, IF_REAL, "Gate oxide thickness at which parameters are extracted"), +IOP( "toxref", BSIM4v6_MOD_TOXREF, IF_REAL, "Target tox value"), +IOP( "dtox", BSIM4v6_MOD_DTOX, IF_REAL, "Defined as (toxe - toxp) "), +IOP( "epsrox", BSIM4v6_MOD_EPSROX, IF_REAL, "Dielectric constant of the gate oxide relative to vacuum"), +IOP( "cdsc", BSIM4v6_MOD_CDSC, IF_REAL, "Drain/Source and channel coupling capacitance"), +IOP( "cdscb", BSIM4v6_MOD_CDSCB, IF_REAL, "Body-bias dependence of cdsc"), +IOP( "cdscd", BSIM4v6_MOD_CDSCD, IF_REAL, "Drain-bias dependence of cdsc"), +IOP( "cit", BSIM4v6_MOD_CIT, IF_REAL, "Interface state capacitance"), +IOP( "nfactor", BSIM4v6_MOD_NFACTOR, IF_REAL, "Subthreshold swing Coefficient"), +IOP( "xj", BSIM4v6_MOD_XJ, IF_REAL, "Junction depth in meters"), +IOP( "vsat", BSIM4v6_MOD_VSAT, IF_REAL, "Saturation velocity at tnom"), +IOP( "at", BSIM4v6_MOD_AT, IF_REAL, "Temperature coefficient of vsat"), +IOP( "a0", BSIM4v6_MOD_A0, IF_REAL, "Non-uniform depletion width effect coefficient."), +IOP( "ags", BSIM4v6_MOD_AGS, IF_REAL, "Gate bias coefficient of Abulk."), +IOP( "a1", BSIM4v6_MOD_A1, IF_REAL, "Non-saturation effect coefficient"), +IOP( "a2", BSIM4v6_MOD_A2, IF_REAL, "Non-saturation effect coefficient"), +IOP( "keta", BSIM4v6_MOD_KETA, IF_REAL, "Body-bias coefficient of non-uniform depletion width effect."), +IOP( "phig", BSIM4v6_MOD_PHIG, IF_REAL, "Work function of gate"), +IOP( "epsrgate", BSIM4v6_MOD_EPSRGATE, IF_REAL, "Dielectric constant of gate relative to vacuum"), +IOP( "easub",BSIM4v6_MOD_EASUB, IF_REAL, "Electron affinity of substrate"), +IOP( "epsrsub", BSIM4v6_MOD_EPSRSUB, IF_REAL, "Dielectric constant of substrate relative to vacuum"), +IOP( "ni0sub", BSIM4v6_MOD_NI0SUB, IF_REAL, "Intrinsic carrier concentration of substrate at 300.15K"), +IOP( "bg0sub", BSIM4v6_MOD_BG0SUB, IF_REAL, "Band-gap of substrate at T=0K"), +IOP( "tbgasub", BSIM4v6_MOD_TBGASUB, IF_REAL, "First parameter of band-gap change due to temperature"), +IOP( "tbgbsub", BSIM4v6_MOD_TBGBSUB, IF_REAL, "Second parameter of band-gap change due to temperature"), +IOP( "nsub", BSIM4v6_MOD_NSUB, IF_REAL, "Substrate doping concentration"), +IOP( "ndep", BSIM4v6_MOD_NDEP, IF_REAL, "Channel doping concentration at the depletion edge"), +IOP( "nsd", BSIM4v6_MOD_NSD, IF_REAL, "S/D doping concentration"), +IOP( "phin", BSIM4v6_MOD_PHIN, IF_REAL, "Adjusting parameter for surface potential due to non-uniform vertical doping"), +IOP( "ngate", BSIM4v6_MOD_NGATE, IF_REAL, "Poly-gate doping concentration"), +IOP( "gamma1", BSIM4v6_MOD_GAMMA1, IF_REAL, "Vth body coefficient"), +IOP( "gamma2", BSIM4v6_MOD_GAMMA2, IF_REAL, "Vth body coefficient"), +IOP( "vbx", BSIM4v6_MOD_VBX, IF_REAL, "Vth transition body Voltage"), +IOP( "vbm", BSIM4v6_MOD_VBM, IF_REAL, "Maximum body voltage"), + +IOP( "xt", BSIM4v6_MOD_XT, IF_REAL, "Doping depth"), +IOP( "k1", BSIM4v6_MOD_K1, IF_REAL, "Bulk effect coefficient 1"), +IOP( "kt1", BSIM4v6_MOD_KT1, IF_REAL, "Temperature coefficient of Vth"), +IOP( "kt1l", BSIM4v6_MOD_KT1L, IF_REAL, "Temperature coefficient of Vth"), +IOP( "kt2", BSIM4v6_MOD_KT2, IF_REAL, "Body-coefficient of kt1"), +IOP( "k2", BSIM4v6_MOD_K2, IF_REAL, "Bulk effect coefficient 2"), +IOP( "k3", BSIM4v6_MOD_K3, IF_REAL, "Narrow width effect coefficient"), +IOP( "k3b", BSIM4v6_MOD_K3B, IF_REAL, "Body effect coefficient of k3"), +IOP( "w0", BSIM4v6_MOD_W0, IF_REAL, "Narrow width effect parameter"), +IOP( "dvtp0", BSIM4v6_MOD_DVTP0, IF_REAL, "First parameter for Vth shift due to pocket"), +IOP( "dvtp1", BSIM4v6_MOD_DVTP1, IF_REAL, "Second parameter for Vth shift due to pocket"), +IOP( "lpe0", BSIM4v6_MOD_LPE0, IF_REAL, "Equivalent length of pocket region at zero bias"), +IOP( "lpeb", BSIM4v6_MOD_LPEB, IF_REAL, "Equivalent length of pocket region accounting for body bias"), +IOP( "dvt0", BSIM4v6_MOD_DVT0, IF_REAL, "Short channel effect coeff. 0"), +IOP( "dvt1", BSIM4v6_MOD_DVT1, IF_REAL, "Short channel effect coeff. 1"), +IOP( "dvt2", BSIM4v6_MOD_DVT2, IF_REAL, "Short channel effect coeff. 2"), +IOP( "dvt0w", BSIM4v6_MOD_DVT0W, IF_REAL, "Narrow Width coeff. 0"), +IOP( "dvt1w", BSIM4v6_MOD_DVT1W, IF_REAL, "Narrow Width effect coeff. 1"), +IOP( "dvt2w", BSIM4v6_MOD_DVT2W, IF_REAL, "Narrow Width effect coeff. 2"), +IOP( "drout", BSIM4v6_MOD_DROUT, IF_REAL, "DIBL coefficient of output resistance"), +IOP( "dsub", BSIM4v6_MOD_DSUB, IF_REAL, "DIBL coefficient in the subthreshold region"), +IOP( "vth0", BSIM4v6_MOD_VTH0, IF_REAL,"Threshold voltage"), +IOP( "vtho", BSIM4v6_MOD_VTH0, IF_REAL,"Threshold voltage"), +IOP( "ua", BSIM4v6_MOD_UA, IF_REAL, "Linear gate dependence of mobility"), +IOP( "ua1", BSIM4v6_MOD_UA1, IF_REAL, "Temperature coefficient of ua"), +IOP( "ub", BSIM4v6_MOD_UB, IF_REAL, "Quadratic gate dependence of mobility"), +IOP( "ub1", BSIM4v6_MOD_UB1, IF_REAL, "Temperature coefficient of ub"), +IOP( "uc", BSIM4v6_MOD_UC, IF_REAL, "Body-bias dependence of mobility"), +IOP( "uc1", BSIM4v6_MOD_UC1, IF_REAL, "Temperature coefficient of uc"), +IOP( "ud", BSIM4v6_MOD_UD, IF_REAL, "Coulomb scattering factor of mobility"), +IOP( "ud1", BSIM4v6_MOD_UD1, IF_REAL, "Temperature coefficient of ud"), +IOP( "up", BSIM4v6_MOD_UP, IF_REAL, "Channel length linear factor of mobility"), +IOP( "lp", BSIM4v6_MOD_LP, IF_REAL, "Channel length exponential factor of mobility"), +IOP( "u0", BSIM4v6_MOD_U0, IF_REAL, "Low-field mobility at Tnom"), +IOP( "eu", BSIM4v6_MOD_EU, IF_REAL, "Mobility exponent"), +IOP( "ucs", BSIM4v6_MOD_UCS, IF_REAL, "Colombic scattering exponent"), +IOP( "ute", BSIM4v6_MOD_UTE, IF_REAL, "Temperature coefficient of mobility"), +IOP( "ucste", BSIM4v6_MOD_UCSTE, IF_REAL,"Temperature coefficient of colombic mobility"), +IOP( "voff", BSIM4v6_MOD_VOFF, IF_REAL, "Threshold voltage offset"), +IOP( "minv", BSIM4v6_MOD_MINV, IF_REAL, "Fitting parameter for moderate inversion in Vgsteff"), +IOP( "minvcv", BSIM4v6_MOD_MINVCV, IF_REAL, "Fitting parameter for moderate inversion in Vgsteffcv"), +IOP( "voffl", BSIM4v6_MOD_VOFFL, IF_REAL, "Length dependence parameter for Vth offset"), +IOP( "voffcvl", BSIM4v6_MOD_VOFFCVL, IF_REAL, "Length dependence parameter for Vth offset in CV"), +IOP( "tnom", BSIM4v6_MOD_TNOM, IF_REAL, "Parameter measurement temperature"), +IOP( "cgso", BSIM4v6_MOD_CGSO, IF_REAL, "Gate-source overlap capacitance per width"), +IOP( "cgdo", BSIM4v6_MOD_CGDO, IF_REAL, "Gate-drain overlap capacitance per width"), +IOP( "cgbo", BSIM4v6_MOD_CGBO, IF_REAL, "Gate-bulk overlap capacitance per length"), +IOP( "xpart", BSIM4v6_MOD_XPART, IF_REAL, "Channel charge partitioning"), +IOP( "delta", BSIM4v6_MOD_DELTA, IF_REAL, "Effective Vds parameter"), +IOP( "rsh", BSIM4v6_MOD_RSH, IF_REAL, "Source-drain sheet resistance"), +IOP( "rdsw", BSIM4v6_MOD_RDSW, IF_REAL, "Source-drain resistance per width"), +IOP( "rdswmin", BSIM4v6_MOD_RDSWMIN, IF_REAL, "Source-drain resistance per width at high Vg"), +IOP( "rsw", BSIM4v6_MOD_RSW, IF_REAL, "Source resistance per width"), +IOP( "rdw", BSIM4v6_MOD_RDW, IF_REAL, "Drain resistance per width"), +IOP( "rdwmin", BSIM4v6_MOD_RDWMIN, IF_REAL, "Drain resistance per width at high Vg"), +IOP( "rswmin", BSIM4v6_MOD_RSWMIN, IF_REAL, "Source resistance per width at high Vg"), + +IOP( "prwg", BSIM4v6_MOD_PRWG, IF_REAL, "Gate-bias effect on parasitic resistance "), +IOP( "prwb", BSIM4v6_MOD_PRWB, IF_REAL, "Body-effect on parasitic resistance "), + +IOP( "prt", BSIM4v6_MOD_PRT, IF_REAL, "Temperature coefficient of parasitic resistance "), +IOP( "eta0", BSIM4v6_MOD_ETA0, IF_REAL, "Subthreshold region DIBL coefficient"), +IOP( "etab", BSIM4v6_MOD_ETAB, IF_REAL, "Subthreshold region DIBL coefficient"), +IOP( "pclm", BSIM4v6_MOD_PCLM, IF_REAL, "Channel length modulation Coefficient"), +IOP( "pdiblc1", BSIM4v6_MOD_PDIBL1, IF_REAL, "Drain-induced barrier lowering coefficient"), +IOP( "pdiblc2", BSIM4v6_MOD_PDIBL2, IF_REAL, "Drain-induced barrier lowering coefficient"), +IOP( "pdiblcb", BSIM4v6_MOD_PDIBLB, IF_REAL, "Body-effect on drain-induced barrier lowering"), +IOP( "fprout", BSIM4v6_MOD_FPROUT, IF_REAL, "Rout degradation coefficient for pocket devices"), +IOP( "pdits", BSIM4v6_MOD_PDITS, IF_REAL, "Coefficient for drain-induced Vth shifts"), +IOP( "pditsl", BSIM4v6_MOD_PDITSL, IF_REAL, "Length dependence of drain-induced Vth shifts"), +IOP( "pditsd", BSIM4v6_MOD_PDITSD, IF_REAL, "Vds dependence of drain-induced Vth shifts"), +IOP( "pscbe1", BSIM4v6_MOD_PSCBE1, IF_REAL, "Substrate current body-effect coefficient"), +IOP( "pscbe2", BSIM4v6_MOD_PSCBE2, IF_REAL, "Substrate current body-effect coefficient"), +IOP( "pvag", BSIM4v6_MOD_PVAG, IF_REAL, "Gate dependence of output resistance parameter"), + +IOP( "jss", BSIM4v6_MOD_JSS, IF_REAL, "Bottom source junction reverse saturation current density"), +IOP( "jsws", BSIM4v6_MOD_JSWS, IF_REAL, "Isolation edge sidewall source junction reverse saturation current density"), +IOP( "jswgs", BSIM4v6_MOD_JSWGS, IF_REAL, "Gate edge source junction reverse saturation current density"), +IOP( "pbs", BSIM4v6_MOD_PBS, IF_REAL, "Source junction built-in potential"), +IOP( "njs", BSIM4v6_MOD_NJS, IF_REAL, "Source junction emission coefficient"), +IOP( "xtis", BSIM4v6_MOD_XTIS, IF_REAL, "Source junction current temperature exponent"), +IOP( "mjs", BSIM4v6_MOD_MJS, IF_REAL, "Source bottom junction capacitance grading coefficient"), +IOP( "pbsws", BSIM4v6_MOD_PBSWS, IF_REAL, "Source sidewall junction capacitance built in potential"), +IOP( "mjsws", BSIM4v6_MOD_MJSWS, IF_REAL, "Source sidewall junction capacitance grading coefficient"), +IOP( "pbswgs", BSIM4v6_MOD_PBSWGS, IF_REAL, "Source (gate side) sidewall junction capacitance built in potential"), +IOP( "mjswgs", BSIM4v6_MOD_MJSWGS, IF_REAL, "Source (gate side) sidewall junction capacitance grading coefficient"), +IOP( "cjs", BSIM4v6_MOD_CJS, IF_REAL, "Source bottom junction capacitance per unit area"), +IOP( "cjsws", BSIM4v6_MOD_CJSWS, IF_REAL, "Source sidewall junction capacitance per unit periphery"), +IOP( "cjswgs", BSIM4v6_MOD_CJSWGS, IF_REAL, "Source (gate side) sidewall junction capacitance per unit width"), + +IOP( "jsd", BSIM4v6_MOD_JSD, IF_REAL, "Bottom drain junction reverse saturation current density"), +IOP( "jswd", BSIM4v6_MOD_JSWD, IF_REAL, "Isolation edge sidewall drain junction reverse saturation current density"), +IOP( "jswgd", BSIM4v6_MOD_JSWGD, IF_REAL, "Gate edge drain junction reverse saturation current density"), +IOP( "pbd", BSIM4v6_MOD_PBD, IF_REAL, "Drain junction built-in potential"), +IOP( "njd", BSIM4v6_MOD_NJD, IF_REAL, "Drain junction emission coefficient"), +IOP( "xtid", BSIM4v6_MOD_XTID, IF_REAL, "Drainjunction current temperature exponent"), +IOP( "mjd", BSIM4v6_MOD_MJD, IF_REAL, "Drain bottom junction capacitance grading coefficient"), +IOP( "pbswd", BSIM4v6_MOD_PBSWD, IF_REAL, "Drain sidewall junction capacitance built in potential"), +IOP( "mjswd", BSIM4v6_MOD_MJSWD, IF_REAL, "Drain sidewall junction capacitance grading coefficient"), +IOP( "pbswgd", BSIM4v6_MOD_PBSWGD, IF_REAL, "Drain (gate side) sidewall junction capacitance built in potential"), +IOP( "mjswgd", BSIM4v6_MOD_MJSWGD, IF_REAL, "Drain (gate side) sidewall junction capacitance grading coefficient"), +IOP( "cjd", BSIM4v6_MOD_CJD, IF_REAL, "Drain bottom junction capacitance per unit area"), +IOP( "cjswd", BSIM4v6_MOD_CJSWD, IF_REAL, "Drain sidewall junction capacitance per unit periphery"), +IOP( "cjswgd", BSIM4v6_MOD_CJSWGD, IF_REAL, "Drain (gate side) sidewall junction capacitance per unit width"), + +IOP( "vfbcv", BSIM4v6_MOD_VFBCV, IF_REAL, "Flat Band Voltage parameter for capmod=0 only"), +IOP( "vfb", BSIM4v6_MOD_VFB, IF_REAL, "Flat Band Voltage"), +IOP( "tpb", BSIM4v6_MOD_TPB, IF_REAL, "Temperature coefficient of pb"), +IOP( "tcj", BSIM4v6_MOD_TCJ, IF_REAL, "Temperature coefficient of cj"), +IOP( "tpbsw", BSIM4v6_MOD_TPBSW, IF_REAL, "Temperature coefficient of pbsw"), +IOP( "tcjsw", BSIM4v6_MOD_TCJSW, IF_REAL, "Temperature coefficient of cjsw"), +IOP( "tpbswg", BSIM4v6_MOD_TPBSWG, IF_REAL, "Temperature coefficient of pbswg"), +IOP( "tcjswg", BSIM4v6_MOD_TCJSWG, IF_REAL, "Temperature coefficient of cjswg"), +IOP( "acde", BSIM4v6_MOD_ACDE, IF_REAL, "Exponential coefficient for finite charge thickness"), +IOP( "moin", BSIM4v6_MOD_MOIN, IF_REAL, "Coefficient for gate-bias dependent surface potential"), +IOP( "noff", BSIM4v6_MOD_NOFF, IF_REAL, "C-V turn-on/off parameter"), +IOP( "voffcv", BSIM4v6_MOD_VOFFCV, IF_REAL, "C-V lateral-shift parameter"), +IOP( "dmcg", BSIM4v6_MOD_DMCG, IF_REAL, "Distance of Mid-Contact to Gate edge"), +IOP( "dmci", BSIM4v6_MOD_DMCI, IF_REAL, "Distance of Mid-Contact to Isolation"), +IOP( "dmdg", BSIM4v6_MOD_DMDG, IF_REAL, "Distance of Mid-Diffusion to Gate edge"), +IOP( "dmcgt", BSIM4v6_MOD_DMCGT, IF_REAL, "Distance of Mid-Contact to Gate edge in Test structures"), +IOP( "xgw", BSIM4v6_MOD_XGW, IF_REAL, "Distance from gate contact center to device edge"), +IOP( "xgl", BSIM4v6_MOD_XGL, IF_REAL, "Variation in Ldrawn"), +IOP( "rshg", BSIM4v6_MOD_RSHG, IF_REAL, "Gate sheet resistance"), +IOP( "ngcon", BSIM4v6_MOD_NGCON, IF_REAL, "Number of gate contacts"), +IOP( "xrcrg1", BSIM4v6_MOD_XRCRG1, IF_REAL, "First fitting parameter the bias-dependent Rg"), +IOP( "xrcrg2", BSIM4v6_MOD_XRCRG2, IF_REAL, "Second fitting parameter the bias-dependent Rg"), +IOP( "lambda", BSIM4v6_MOD_LAMBDA, IF_REAL, " Velocity overshoot parameter"), +IOP( "vtl", BSIM4v6_MOD_VTL, IF_REAL, " thermal velocity"), +IOP( "lc", BSIM4v6_MOD_LC, IF_REAL, " back scattering parameter"), +IOP( "xn", BSIM4v6_MOD_XN, IF_REAL, " back scattering parameter"), +IOP( "vfbsdoff", BSIM4v6_MOD_VFBSDOFF, IF_REAL, "S/D flatband voltage offset"), +IOP( "tvfbsdoff", BSIM4v6_MOD_TVFBSDOFF, IF_REAL, "Temperature parameter for vfbsdoff"), +IOP( "tvoff", BSIM4v6_MOD_TVOFF, IF_REAL, "Temperature parameter for voff"), + +IOP( "lintnoi", BSIM4v6_MOD_LINTNOI, IF_REAL, "lint offset for noise calculation"), +IOP( "lint", BSIM4v6_MOD_LINT, IF_REAL, "Length reduction parameter"), +IOP( "ll", BSIM4v6_MOD_LL, IF_REAL, "Length reduction parameter"), +IOP( "llc", BSIM4v6_MOD_LLC, IF_REAL, "Length reduction parameter for CV"), +IOP( "lln", BSIM4v6_MOD_LLN, IF_REAL, "Length reduction parameter"), +IOP( "lw", BSIM4v6_MOD_LW, IF_REAL, "Length reduction parameter"), +IOP( "lwc", BSIM4v6_MOD_LWC, IF_REAL, "Length reduction parameter for CV"), +IOP( "lwn", BSIM4v6_MOD_LWN, IF_REAL, "Length reduction parameter"), +IOP( "lwl", BSIM4v6_MOD_LWL, IF_REAL, "Length reduction parameter"), +IOP( "lwlc", BSIM4v6_MOD_LWLC, IF_REAL, "Length reduction parameter for CV"), +IOP( "lmin", BSIM4v6_MOD_LMIN, IF_REAL, "Minimum length for the model"), +IOP( "lmax", BSIM4v6_MOD_LMAX, IF_REAL, "Maximum length for the model"), + +IOP( "wr", BSIM4v6_MOD_WR, IF_REAL, "Width dependence of rds"), +IOP( "wint", BSIM4v6_MOD_WINT, IF_REAL, "Width reduction parameter"), +IOP( "dwg", BSIM4v6_MOD_DWG, IF_REAL, "Width reduction parameter"), +IOP( "dwb", BSIM4v6_MOD_DWB, IF_REAL, "Width reduction parameter"), + +IOP( "wl", BSIM4v6_MOD_WL, IF_REAL, "Width reduction parameter"), +IOP( "wlc", BSIM4v6_MOD_WLC, IF_REAL, "Width reduction parameter for CV"), +IOP( "wln", BSIM4v6_MOD_WLN, IF_REAL, "Width reduction parameter"), +IOP( "ww", BSIM4v6_MOD_WW, IF_REAL, "Width reduction parameter"), +IOP( "wwc", BSIM4v6_MOD_WWC, IF_REAL, "Width reduction parameter for CV"), +IOP( "wwn", BSIM4v6_MOD_WWN, IF_REAL, "Width reduction parameter"), +IOP( "wwl", BSIM4v6_MOD_WWL, IF_REAL, "Width reduction parameter"), +IOP( "wwlc", BSIM4v6_MOD_WWLC, IF_REAL, "Width reduction parameter for CV"), +IOP( "wmin", BSIM4v6_MOD_WMIN, IF_REAL, "Minimum width for the model"), +IOP( "wmax", BSIM4v6_MOD_WMAX, IF_REAL, "Maximum width for the model"), + +IOP( "b0", BSIM4v6_MOD_B0, IF_REAL, "Abulk narrow width parameter"), +IOP( "b1", BSIM4v6_MOD_B1, IF_REAL, "Abulk narrow width parameter"), + +IOP( "cgsl", BSIM4v6_MOD_CGSL, IF_REAL, "New C-V model parameter"), +IOP( "cgdl", BSIM4v6_MOD_CGDL, IF_REAL, "New C-V model parameter"), +IOP( "ckappas", BSIM4v6_MOD_CKAPPAS, IF_REAL, "S/G overlap C-V parameter "), +IOP( "ckappad", BSIM4v6_MOD_CKAPPAD, IF_REAL, "D/G overlap C-V parameter"), +IOP( "cf", BSIM4v6_MOD_CF, IF_REAL, "Fringe capacitance parameter"), +IOP( "clc", BSIM4v6_MOD_CLC, IF_REAL, "Vdsat parameter for C-V model"), +IOP( "cle", BSIM4v6_MOD_CLE, IF_REAL, "Vdsat parameter for C-V model"), +IOP( "dwc", BSIM4v6_MOD_DWC, IF_REAL, "Delta W for C-V model"), +IOP( "dlc", BSIM4v6_MOD_DLC, IF_REAL, "Delta L for C-V model"), +IOP( "xw", BSIM4v6_MOD_XW, IF_REAL, "W offset for channel width due to mask/etch effect"), +IOP( "xl", BSIM4v6_MOD_XL, IF_REAL, "L offset for channel length due to mask/etch effect"), +IOP( "dlcig", BSIM4v6_MOD_DLCIG, IF_REAL, "Delta L for Ig model"), +IOP( "dlcigd", BSIM4v6_MOD_DLCIGD, IF_REAL, "Delta L for Ig model drain side"), +IOP( "dwj", BSIM4v6_MOD_DWJ, IF_REAL, "Delta W for S/D junctions"), + +IOP( "alpha0", BSIM4v6_MOD_ALPHA0, IF_REAL, "substrate current model parameter"), +IOP( "alpha1", BSIM4v6_MOD_ALPHA1, IF_REAL, "substrate current model parameter"), +IOP( "beta0", BSIM4v6_MOD_BETA0, IF_REAL, "substrate current model parameter"), + +IOP( "agidl", BSIM4v6_MOD_AGIDL, IF_REAL, "Pre-exponential constant for GIDL"), +IOP( "bgidl", BSIM4v6_MOD_BGIDL, IF_REAL, "Exponential constant for GIDL"), +IOP( "cgidl", BSIM4v6_MOD_CGIDL, IF_REAL, "Parameter for body-bias dependence of GIDL"), +IOP( "egidl", BSIM4v6_MOD_EGIDL, IF_REAL, "Fitting parameter for Bandbending"), +IOP( "agisl", BSIM4v6_MOD_AGISL, IF_REAL, "Pre-exponential constant for GISL"), +IOP( "bgisl", BSIM4v6_MOD_BGISL, IF_REAL, "Exponential constant for GISL"), +IOP( "cgisl", BSIM4v6_MOD_CGISL, IF_REAL, "Parameter for body-bias dependence of GISL"), +IOP( "egisl", BSIM4v6_MOD_EGISL, IF_REAL, "Fitting parameter for Bandbending"), +IOP( "aigc", BSIM4v6_MOD_AIGC, IF_REAL, "Parameter for Igc"), +IOP( "bigc", BSIM4v6_MOD_BIGC, IF_REAL, "Parameter for Igc"), +IOP( "cigc", BSIM4v6_MOD_CIGC, IF_REAL, "Parameter for Igc"), +IOP( "aigsd", BSIM4v6_MOD_AIGSD, IF_REAL, "Parameter for Igs,d"), +IOP( "bigsd", BSIM4v6_MOD_BIGSD, IF_REAL, "Parameter for Igs,d"), +IOP( "cigsd", BSIM4v6_MOD_CIGSD, IF_REAL, "Parameter for Igs,d"), +IOP( "aigs", BSIM4v6_MOD_AIGS, IF_REAL, "Parameter for Igs"), +IOP( "bigs", BSIM4v6_MOD_BIGS, IF_REAL, "Parameter for Igs"), +IOP( "cigs", BSIM4v6_MOD_CIGS, IF_REAL, "Parameter for Igs"), +IOP( "aigd", BSIM4v6_MOD_AIGD, IF_REAL, "Parameter for Igd"), +IOP( "bigd", BSIM4v6_MOD_BIGD, IF_REAL, "Parameter for Igd"), +IOP( "cigd", BSIM4v6_MOD_CIGD, IF_REAL, "Parameter for Igd"), +IOP( "aigbacc", BSIM4v6_MOD_AIGBACC, IF_REAL, "Parameter for Igb"), +IOP( "bigbacc", BSIM4v6_MOD_BIGBACC, IF_REAL, "Parameter for Igb"), +IOP( "cigbacc", BSIM4v6_MOD_CIGBACC, IF_REAL, "Parameter for Igb"), +IOP( "aigbinv", BSIM4v6_MOD_AIGBINV, IF_REAL, "Parameter for Igb"), +IOP( "bigbinv", BSIM4v6_MOD_BIGBINV, IF_REAL, "Parameter for Igb"), +IOP( "cigbinv", BSIM4v6_MOD_CIGBINV, IF_REAL, "Parameter for Igb"), +IOP( "nigc", BSIM4v6_MOD_NIGC, IF_REAL, "Parameter for Igc slope"), +IOP( "nigbinv", BSIM4v6_MOD_NIGBINV, IF_REAL, "Parameter for Igbinv slope"), +IOP( "nigbacc", BSIM4v6_MOD_NIGBACC, IF_REAL, "Parameter for Igbacc slope"), +IOP( "ntox", BSIM4v6_MOD_NTOX, IF_REAL, "Exponent for Tox ratio"), +IOP( "eigbinv", BSIM4v6_MOD_EIGBINV, IF_REAL, "Parameter for the Si bandgap for Igbinv"), +IOP( "pigcd", BSIM4v6_MOD_PIGCD, IF_REAL, "Parameter for Igc partition"), +IOP( "poxedge", BSIM4v6_MOD_POXEDGE, IF_REAL, "Factor for the gate edge Tox"), + +IOP( "ijthdfwd", BSIM4v6_MOD_IJTHDFWD, IF_REAL, "Forward drain diode forward limiting current"), +IOP( "ijthsfwd", BSIM4v6_MOD_IJTHSFWD, IF_REAL, "Forward source diode forward limiting current"), +IOP( "ijthdrev", BSIM4v6_MOD_IJTHDREV, IF_REAL, "Reverse drain diode forward limiting current"), +IOP( "ijthsrev", BSIM4v6_MOD_IJTHSREV, IF_REAL, "Reverse source diode forward limiting current"), +IOP( "xjbvd", BSIM4v6_MOD_XJBVD, IF_REAL, "Fitting parameter for drain diode breakdown current"), +IOP( "xjbvs", BSIM4v6_MOD_XJBVS, IF_REAL, "Fitting parameter for source diode breakdown current"), +IOP( "bvd", BSIM4v6_MOD_BVD, IF_REAL, "Drain diode breakdown voltage"), +IOP( "bvs", BSIM4v6_MOD_BVS, IF_REAL, "Source diode breakdown voltage"), + +IOP( "jtss", BSIM4v6_MOD_JTSS, IF_REAL, "Source bottom trap-assisted saturation current density"), +IOP( "jtsd", BSIM4v6_MOD_JTSD, IF_REAL, "Drain bottom trap-assisted saturation current density"), +IOP( "jtssws", BSIM4v6_MOD_JTSSWS, IF_REAL, "Source STI sidewall trap-assisted saturation current density"), +IOP( "jtsswd", BSIM4v6_MOD_JTSSWD, IF_REAL, "Drain STI sidewall trap-assisted saturation current density"), +IOP( "jtsswgs", BSIM4v6_MOD_JTSSWGS, IF_REAL, "Source gate-edge sidewall trap-assisted saturation current density"), +IOP( "jtsswgd", BSIM4v6_MOD_JTSSWGD, IF_REAL, "Drain gate-edge sidewall trap-assisted saturation current density"), +IOP( "jtweff", BSIM4v6_MOD_JTWEFF, IF_REAL, "TAT current width dependance"), +IOP( "njts", BSIM4v6_MOD_NJTS, IF_REAL, "Non-ideality factor for bottom junction"), +IOP( "njtssw", BSIM4v6_MOD_NJTSSW, IF_REAL, "Non-ideality factor for STI sidewall junction"), +IOP( "njtsswg", BSIM4v6_MOD_NJTSSWG, IF_REAL, "Non-ideality factor for gate-edge sidewall junction"), +IOP( "njtsd", BSIM4v6_MOD_NJTSD, IF_REAL, "Non-ideality factor for bottom junction drain side"), +IOP( "njtsswd", BSIM4v6_MOD_NJTSSWD, IF_REAL, "Non-ideality factor for STI sidewall junction drain side"), +IOP( "njtsswgd", BSIM4v6_MOD_NJTSSWGD, IF_REAL, "Non-ideality factor for gate-edge sidewall junction drain side"), +IOP( "xtss", BSIM4v6_MOD_XTSS, IF_REAL, "Power dependence of JTSS on temperature"), +IOP( "xtsd", BSIM4v6_MOD_XTSD, IF_REAL, "Power dependence of JTSD on temperature"), +IOP( "xtssws", BSIM4v6_MOD_XTSSWS, IF_REAL, "Power dependence of JTSSWS on temperature"), +IOP( "xtsswd", BSIM4v6_MOD_XTSSWD, IF_REAL, "Power dependence of JTSSWD on temperature"), +IOP( "xtsswgs", BSIM4v6_MOD_XTSSWGS, IF_REAL, "Power dependence of JTSSWGS on temperature"), +IOP( "xtsswgd", BSIM4v6_MOD_XTSSWGD, IF_REAL, "Power dependence of JTSSWGD on temperature"), +IOP( "tnjts", BSIM4v6_MOD_TNJTS, IF_REAL, "Temperature coefficient for NJTS"), +IOP( "tnjtssw", BSIM4v6_MOD_TNJTSSW, IF_REAL, "Temperature coefficient for NJTSSW"), +IOP( "tnjtsswg", BSIM4v6_MOD_TNJTSSWG, IF_REAL, "Temperature coefficient for NJTSSWG"), +IOP( "tnjtsd", BSIM4v6_MOD_TNJTSD, IF_REAL, "Temperature coefficient for NJTSD"), +IOP( "tnjtsswd", BSIM4v6_MOD_TNJTSSWD, IF_REAL, "Temperature coefficient for NJTSSWD"), +IOP( "tnjtsswgd", BSIM4v6_MOD_TNJTSSWGD, IF_REAL, "Temperature coefficient for NJTSSWGD"), +IOP( "vtss", BSIM4v6_MOD_VTSS, IF_REAL, "Source bottom trap-assisted voltage dependent parameter"), +IOP( "vtsd", BSIM4v6_MOD_VTSD, IF_REAL, "Drain bottom trap-assisted voltage dependent parameter"), +IOP( "vtssws", BSIM4v6_MOD_VTSSWS, IF_REAL, "Source STI sidewall trap-assisted voltage dependent parameter"), +IOP( "vtsswd", BSIM4v6_MOD_VTSSWD, IF_REAL, "Drain STI sidewall trap-assisted voltage dependent parameter"), +IOP( "vtsswgs", BSIM4v6_MOD_VTSSWGS, IF_REAL, "Source gate-edge sidewall trap-assisted voltage dependent parameter"), +IOP( "vtsswgd", BSIM4v6_MOD_VTSSWGD, IF_REAL, "Drain gate-edge sidewall trap-assisted voltage dependent parameter"), + +IOP( "gbmin", BSIM4v6_MOD_GBMIN, IF_REAL, "Minimum body conductance"), +IOP( "rbdb", BSIM4v6_MOD_RBDB, IF_REAL, "Resistance between bNode and dbNode"), +IOP( "rbpb", BSIM4v6_MOD_RBPB, IF_REAL, "Resistance between bNodePrime and bNode"), +IOP( "rbsb", BSIM4v6_MOD_RBSB, IF_REAL, "Resistance between bNode and sbNode"), +IOP( "rbps", BSIM4v6_MOD_RBPS, IF_REAL, "Resistance between bNodePrime and sbNode"), +IOP( "rbpd", BSIM4v6_MOD_RBPD, IF_REAL, "Resistance between bNodePrime and bNode"), + +IOP( "rbps0", BSIM4v6_MOD_RBPS0, IF_REAL , "Body resistance RBPS scaling"), +IOP( "rbpsl", BSIM4v6_MOD_RBPSL, IF_REAL , "Body resistance RBPS L scaling"), +IOP( "rbpsw", BSIM4v6_MOD_RBPSW, IF_REAL , "Body resistance RBPS W scaling"), +IOP( "rbpsnf", BSIM4v6_MOD_RBPSNF, IF_REAL , "Body resistance RBPS NF scaling"), + +IOP( "rbpd0", BSIM4v6_MOD_RBPD0, IF_REAL , "Body resistance RBPD scaling"), +IOP( "rbpdl", BSIM4v6_MOD_RBPDL, IF_REAL , "Body resistance RBPD L scaling"), +IOP( "rbpdw", BSIM4v6_MOD_RBPDW, IF_REAL , "Body resistance RBPD W scaling"), +IOP( "rbpdnf", BSIM4v6_MOD_RBPDNF, IF_REAL , "Body resistance RBPD NF scaling"), + +IOP( "rbpbx0", BSIM4v6_MOD_RBPBX0, IF_REAL , "Body resistance RBPBX scaling"), +IOP( "rbpbxl", BSIM4v6_MOD_RBPBXL, IF_REAL , "Body resistance RBPBX L scaling"), +IOP( "rbpbxw", BSIM4v6_MOD_RBPBXW, IF_REAL , "Body resistance RBPBX W scaling"), +IOP( "rbpbxnf", BSIM4v6_MOD_RBPBXNF, IF_REAL , "Body resistance RBPBX NF scaling"), +IOP( "rbpby0", BSIM4v6_MOD_RBPBY0, IF_REAL , "Body resistance RBPBY scaling"), +IOP( "rbpbyl", BSIM4v6_MOD_RBPBYL, IF_REAL , "Body resistance RBPBY L scaling"), +IOP( "rbpbyw", BSIM4v6_MOD_RBPBYW, IF_REAL , "Body resistance RBPBY W scaling"), +IOP( "rbpbynf", BSIM4v6_MOD_RBPBYNF, IF_REAL , "Body resistance RBPBY NF scaling"), + +IOP( "rbsbx0", BSIM4v6_MOD_RBSBX0, IF_REAL , "Body resistance RBSBX scaling"), +IOP( "rbsby0", BSIM4v6_MOD_RBSBY0, IF_REAL , "Body resistance RBSBY scaling"), +IOP( "rbdbx0", BSIM4v6_MOD_RBDBX0, IF_REAL , "Body resistance RBDBX scaling"), +IOP( "rbdby0", BSIM4v6_MOD_RBDBY0, IF_REAL , "Body resistance RBDBY scaling"), + +IOP( "rbsdbxl", BSIM4v6_MOD_RBSDBXL, IF_REAL , "Body resistance RBSDBX L scaling"), +IOP( "rbsdbxw", BSIM4v6_MOD_RBSDBXW, IF_REAL , "Body resistance RBSDBX W scaling"), +IOP( "rbsdbxnf", BSIM4v6_MOD_RBSDBXNF, IF_REAL , "Body resistance RBSDBX NF scaling"), +IOP( "rbsdbyl", BSIM4v6_MOD_RBSDBYL, IF_REAL , "Body resistance RBSDBY L scaling"), +IOP( "rbsdbyw", BSIM4v6_MOD_RBSDBYW, IF_REAL , "Body resistance RBSDBY W scaling"), +IOP( "rbsdbynf", BSIM4v6_MOD_RBSDBYNF, IF_REAL , "Body resistance RBSDBY NF scaling"), + +IOP( "lcdsc", BSIM4v6_MOD_LCDSC, IF_REAL, "Length dependence of cdsc"), +IOP( "lcdscb", BSIM4v6_MOD_LCDSCB, IF_REAL, "Length dependence of cdscb"), +IOP( "lcdscd", BSIM4v6_MOD_LCDSCD, IF_REAL, "Length dependence of cdscd"), +IOP( "lcit", BSIM4v6_MOD_LCIT, IF_REAL, "Length dependence of cit"), +IOP( "lnfactor", BSIM4v6_MOD_LNFACTOR, IF_REAL, "Length dependence of nfactor"), +IOP( "lxj", BSIM4v6_MOD_LXJ, IF_REAL, "Length dependence of xj"), +IOP( "lvsat", BSIM4v6_MOD_LVSAT, IF_REAL, "Length dependence of vsat"), +IOP( "lat", BSIM4v6_MOD_LAT, IF_REAL, "Length dependence of at"), +IOP( "la0", BSIM4v6_MOD_LA0, IF_REAL, "Length dependence of a0"), +IOP( "lags", BSIM4v6_MOD_LAGS, IF_REAL, "Length dependence of ags"), +IOP( "la1", BSIM4v6_MOD_LA1, IF_REAL, "Length dependence of a1"), +IOP( "la2", BSIM4v6_MOD_LA2, IF_REAL, "Length dependence of a2"), +IOP( "lketa", BSIM4v6_MOD_LKETA, IF_REAL, "Length dependence of keta"), +IOP( "lnsub", BSIM4v6_MOD_LNSUB, IF_REAL, "Length dependence of nsub"), +IOP( "lndep", BSIM4v6_MOD_LNDEP, IF_REAL, "Length dependence of ndep"), +IOP( "lnsd", BSIM4v6_MOD_LNSD, IF_REAL, "Length dependence of nsd"), +IOP( "lphin", BSIM4v6_MOD_LPHIN, IF_REAL, "Length dependence of phin"), +IOP( "lngate", BSIM4v6_MOD_LNGATE, IF_REAL, "Length dependence of ngate"), +IOP( "lgamma1", BSIM4v6_MOD_LGAMMA1, IF_REAL, "Length dependence of gamma1"), +IOP( "lgamma2", BSIM4v6_MOD_LGAMMA2, IF_REAL, "Length dependence of gamma2"), +IOP( "lvbx", BSIM4v6_MOD_LVBX, IF_REAL, "Length dependence of vbx"), +IOP( "lvbm", BSIM4v6_MOD_LVBM, IF_REAL, "Length dependence of vbm"), +IOP( "lxt", BSIM4v6_MOD_LXT, IF_REAL, "Length dependence of xt"), +IOP( "lk1", BSIM4v6_MOD_LK1, IF_REAL, "Length dependence of k1"), +IOP( "lkt1", BSIM4v6_MOD_LKT1, IF_REAL, "Length dependence of kt1"), +IOP( "lkt1l", BSIM4v6_MOD_LKT1L, IF_REAL, "Length dependence of kt1l"), +IOP( "lkt2", BSIM4v6_MOD_LKT2, IF_REAL, "Length dependence of kt2"), +IOP( "lk2", BSIM4v6_MOD_LK2, IF_REAL, "Length dependence of k2"), +IOP( "lk3", BSIM4v6_MOD_LK3, IF_REAL, "Length dependence of k3"), +IOP( "lk3b", BSIM4v6_MOD_LK3B, IF_REAL, "Length dependence of k3b"), +IOP( "lw0", BSIM4v6_MOD_LW0, IF_REAL, "Length dependence of w0"), +IOP( "ldvtp0", BSIM4v6_MOD_LDVTP0, IF_REAL, "Length dependence of dvtp0"), +IOP( "ldvtp1", BSIM4v6_MOD_LDVTP1, IF_REAL, "Length dependence of dvtp1"), +IOP( "llpe0", BSIM4v6_MOD_LLPE0, IF_REAL, "Length dependence of lpe0"), +IOP( "llpeb", BSIM4v6_MOD_LLPEB, IF_REAL, "Length dependence of lpeb"), +IOP( "ldvt0", BSIM4v6_MOD_LDVT0, IF_REAL, "Length dependence of dvt0"), +IOP( "ldvt1", BSIM4v6_MOD_LDVT1, IF_REAL, "Length dependence of dvt1"), +IOP( "ldvt2", BSIM4v6_MOD_LDVT2, IF_REAL, "Length dependence of dvt2"), +IOP( "ldvt0w", BSIM4v6_MOD_LDVT0W, IF_REAL, "Length dependence of dvt0w"), +IOP( "ldvt1w", BSIM4v6_MOD_LDVT1W, IF_REAL, "Length dependence of dvt1w"), +IOP( "ldvt2w", BSIM4v6_MOD_LDVT2W, IF_REAL, "Length dependence of dvt2w"), +IOP( "ldrout", BSIM4v6_MOD_LDROUT, IF_REAL, "Length dependence of drout"), +IOP( "ldsub", BSIM4v6_MOD_LDSUB, IF_REAL, "Length dependence of dsub"), +IOP( "lvth0", BSIM4v6_MOD_LVTH0, IF_REAL,"Length dependence of vto"), +IOP( "lvtho", BSIM4v6_MOD_LVTH0, IF_REAL,"Length dependence of vto"), +IOP( "lua", BSIM4v6_MOD_LUA, IF_REAL, "Length dependence of ua"), +IOP( "lua1", BSIM4v6_MOD_LUA1, IF_REAL, "Length dependence of ua1"), +IOP( "lub", BSIM4v6_MOD_LUB, IF_REAL, "Length dependence of ub"), +IOP( "lub1", BSIM4v6_MOD_LUB1, IF_REAL, "Length dependence of ub1"), +IOP( "luc", BSIM4v6_MOD_LUC, IF_REAL, "Length dependence of uc"), +IOP( "luc1", BSIM4v6_MOD_LUC1, IF_REAL, "Length dependence of uc1"), +IOP( "lud", BSIM4v6_MOD_LUD, IF_REAL, "Length dependence of ud"), +IOP( "lud1", BSIM4v6_MOD_LUD1, IF_REAL, "Length dependence of ud1"), +IOP( "lup", BSIM4v6_MOD_LUP, IF_REAL, "Length dependence of up"), +IOP( "llp", BSIM4v6_MOD_LLP, IF_REAL, "Length dependence of lp"), +IOP( "lu0", BSIM4v6_MOD_LU0, IF_REAL, "Length dependence of u0"), +IOP( "lute", BSIM4v6_MOD_LUTE, IF_REAL, "Length dependence of ute"), +IOP( "lucste", BSIM4v6_MOD_LUCSTE, IF_REAL, "Length dependence of ucste"), +IOP( "lvoff", BSIM4v6_MOD_LVOFF, IF_REAL, "Length dependence of voff"), +IOP( "lminv", BSIM4v6_MOD_LMINV, IF_REAL, "Length dependence of minv"), +IOP( "lminvcv", BSIM4v6_MOD_LMINVCV, IF_REAL, "Length dependence of minvcv"), +IOP( "ldelta", BSIM4v6_MOD_LDELTA, IF_REAL, "Length dependence of delta"), +IOP( "lrdsw", BSIM4v6_MOD_LRDSW, IF_REAL, "Length dependence of rdsw "), +IOP( "lrsw", BSIM4v6_MOD_LRSW, IF_REAL, "Length dependence of rsw"), +IOP( "lrdw", BSIM4v6_MOD_LRDW, IF_REAL, "Length dependence of rdw"), + +IOP( "lprwg", BSIM4v6_MOD_LPRWG, IF_REAL, "Length dependence of prwg "), +IOP( "lprwb", BSIM4v6_MOD_LPRWB, IF_REAL, "Length dependence of prwb "), + +IOP( "lprt", BSIM4v6_MOD_LPRT, IF_REAL, "Length dependence of prt "), +IOP( "leta0", BSIM4v6_MOD_LETA0, IF_REAL, "Length dependence of eta0"), +IOP( "letab", BSIM4v6_MOD_LETAB, IF_REAL, "Length dependence of etab"), +IOP( "lpclm", BSIM4v6_MOD_LPCLM, IF_REAL, "Length dependence of pclm"), +IOP( "lpdiblc1", BSIM4v6_MOD_LPDIBL1, IF_REAL, "Length dependence of pdiblc1"), +IOP( "lpdiblc2", BSIM4v6_MOD_LPDIBL2, IF_REAL, "Length dependence of pdiblc2"), +IOP( "lpdiblcb", BSIM4v6_MOD_LPDIBLB, IF_REAL, "Length dependence of pdiblcb"), +IOP( "lfprout", BSIM4v6_MOD_LFPROUT, IF_REAL, "Length dependence of pdiblcb"), +IOP( "lpdits", BSIM4v6_MOD_LPDITS, IF_REAL, "Length dependence of pdits"), +IOP( "lpditsd", BSIM4v6_MOD_LPDITSD, IF_REAL, "Length dependence of pditsd"), +IOP( "lpscbe1", BSIM4v6_MOD_LPSCBE1, IF_REAL, "Length dependence of pscbe1"), +IOP( "lpscbe2", BSIM4v6_MOD_LPSCBE2, IF_REAL, "Length dependence of pscbe2"), +IOP( "lpvag", BSIM4v6_MOD_LPVAG, IF_REAL, "Length dependence of pvag"), +IOP( "lwr", BSIM4v6_MOD_LWR, IF_REAL, "Length dependence of wr"), +IOP( "ldwg", BSIM4v6_MOD_LDWG, IF_REAL, "Length dependence of dwg"), +IOP( "ldwb", BSIM4v6_MOD_LDWB, IF_REAL, "Length dependence of dwb"), +IOP( "lb0", BSIM4v6_MOD_LB0, IF_REAL, "Length dependence of b0"), +IOP( "lb1", BSIM4v6_MOD_LB1, IF_REAL, "Length dependence of b1"), +IOP( "lcgsl", BSIM4v6_MOD_LCGSL, IF_REAL, "Length dependence of cgsl"), +IOP( "lcgdl", BSIM4v6_MOD_LCGDL, IF_REAL, "Length dependence of cgdl"), +IOP( "lckappas", BSIM4v6_MOD_LCKAPPAS, IF_REAL, "Length dependence of ckappas"), +IOP( "lckappad", BSIM4v6_MOD_LCKAPPAD, IF_REAL, "Length dependence of ckappad"), +IOP( "lcf", BSIM4v6_MOD_LCF, IF_REAL, "Length dependence of cf"), +IOP( "lclc", BSIM4v6_MOD_LCLC, IF_REAL, "Length dependence of clc"), +IOP( "lcle", BSIM4v6_MOD_LCLE, IF_REAL, "Length dependence of cle"), +IOP( "lalpha0", BSIM4v6_MOD_LALPHA0, IF_REAL, "Length dependence of alpha0"), +IOP( "lalpha1", BSIM4v6_MOD_LALPHA1, IF_REAL, "Length dependence of alpha1"), +IOP( "lbeta0", BSIM4v6_MOD_LBETA0, IF_REAL, "Length dependence of beta0"), + +IOP( "lagidl", BSIM4v6_MOD_LAGIDL, IF_REAL, "Length dependence of agidl"), +IOP( "lbgidl", BSIM4v6_MOD_LBGIDL, IF_REAL, "Length dependence of bgidl"), +IOP( "lcgidl", BSIM4v6_MOD_LCGIDL, IF_REAL, "Length dependence of cgidl"), +IOP( "legidl", BSIM4v6_MOD_LEGIDL, IF_REAL, "Length dependence of egidl"), +IOP( "lagisl", BSIM4v6_MOD_LAGISL, IF_REAL, "Length dependence of agisl"), +IOP( "lbgisl", BSIM4v6_MOD_LBGISL, IF_REAL, "Length dependence of bgisl"), +IOP( "lcgisl", BSIM4v6_MOD_LCGISL, IF_REAL, "Length dependence of cgisl"), +IOP( "legisl", BSIM4v6_MOD_LEGISL, IF_REAL, "Length dependence of egisl"), +IOP( "laigc", BSIM4v6_MOD_LAIGC, IF_REAL, "Length dependence of aigc"), +IOP( "lbigc", BSIM4v6_MOD_LBIGC, IF_REAL, "Length dependence of bigc"), +IOP( "lcigc", BSIM4v6_MOD_LCIGC, IF_REAL, "Length dependence of cigc"), +IOP( "laigsd", BSIM4v6_MOD_LAIGSD, IF_REAL, "Length dependence of aigsd"), +IOP( "lbigsd", BSIM4v6_MOD_LBIGSD, IF_REAL, "Length dependence of bigsd"), +IOP( "lcigsd", BSIM4v6_MOD_LCIGSD, IF_REAL, "Length dependence of cigsd"), +IOP( "laigs", BSIM4v6_MOD_LAIGS, IF_REAL, "Length dependence of aigs"), +IOP( "lbigs", BSIM4v6_MOD_LBIGS, IF_REAL, "Length dependence of bigs"), +IOP( "lcigs", BSIM4v6_MOD_LCIGS, IF_REAL, "Length dependence of cigs"), +IOP( "laigd", BSIM4v6_MOD_LAIGD, IF_REAL, "Length dependence of aigd"), +IOP( "lbigd", BSIM4v6_MOD_LBIGD, IF_REAL, "Length dependence of bigd"), +IOP( "lcigd", BSIM4v6_MOD_LCIGD, IF_REAL, "Length dependence of cigd"), +IOP( "laigbacc", BSIM4v6_MOD_LAIGBACC, IF_REAL, "Length dependence of aigbacc"), +IOP( "lbigbacc", BSIM4v6_MOD_LBIGBACC, IF_REAL, "Length dependence of bigbacc"), +IOP( "lcigbacc", BSIM4v6_MOD_LCIGBACC, IF_REAL, "Length dependence of cigbacc"), +IOP( "laigbinv", BSIM4v6_MOD_LAIGBINV, IF_REAL, "Length dependence of aigbinv"), +IOP( "lbigbinv", BSIM4v6_MOD_LBIGBINV, IF_REAL, "Length dependence of bigbinv"), +IOP( "lcigbinv", BSIM4v6_MOD_LCIGBINV, IF_REAL, "Length dependence of cigbinv"), +IOP( "lnigc", BSIM4v6_MOD_LNIGC, IF_REAL, "Length dependence of nigc"), +IOP( "lnigbinv", BSIM4v6_MOD_LNIGBINV, IF_REAL, "Length dependence of nigbinv"), +IOP( "lnigbacc", BSIM4v6_MOD_LNIGBACC, IF_REAL, "Length dependence of nigbacc"), +IOP( "lntox", BSIM4v6_MOD_LNTOX, IF_REAL, "Length dependence of ntox"), +IOP( "leigbinv", BSIM4v6_MOD_LEIGBINV, IF_REAL, "Length dependence for eigbinv"), +IOP( "lpigcd", BSIM4v6_MOD_LPIGCD, IF_REAL, "Length dependence for pigcd"), +IOP( "lpoxedge", BSIM4v6_MOD_LPOXEDGE, IF_REAL, "Length dependence for poxedge"), + +IOP( "lvfbcv", BSIM4v6_MOD_LVFBCV, IF_REAL, "Length dependence of vfbcv"), +IOP( "lvfb", BSIM4v6_MOD_LVFB, IF_REAL, "Length dependence of vfb"), +IOP( "lacde", BSIM4v6_MOD_LACDE, IF_REAL, "Length dependence of acde"), +IOP( "lmoin", BSIM4v6_MOD_LMOIN, IF_REAL, "Length dependence of moin"), +IOP( "lnoff", BSIM4v6_MOD_LNOFF, IF_REAL, "Length dependence of noff"), +IOP( "lvoffcv", BSIM4v6_MOD_LVOFFCV, IF_REAL, "Length dependence of voffcv"), +IOP( "lxrcrg1", BSIM4v6_MOD_LXRCRG1, IF_REAL, "Length dependence of xrcrg1"), +IOP( "lxrcrg2", BSIM4v6_MOD_LXRCRG2, IF_REAL, "Length dependence of xrcrg2"), +IOP( "llambda", BSIM4v6_MOD_LLAMBDA, IF_REAL, "Length dependence of lambda"), +IOP( "lvtl", BSIM4v6_MOD_LVTL, IF_REAL, " Length dependence of vtl"), +IOP( "lxn", BSIM4v6_MOD_LXN, IF_REAL, " Length dependence of xn"), +IOP( "leu", BSIM4v6_MOD_LEU, IF_REAL, " Length dependence of eu"), +IOP( "lucs", BSIM4v6_MOD_LUCS, IF_REAL, "Length dependence of lucs"), +IOP( "lvfbsdoff", BSIM4v6_MOD_LVFBSDOFF, IF_REAL, "Length dependence of vfbsdoff"), +IOP( "ltvfbsdoff", BSIM4v6_MOD_LTVFBSDOFF, IF_REAL, "Length dependence of tvfbsdoff"), +IOP( "ltvoff", BSIM4v6_MOD_LTVOFF, IF_REAL, "Length dependence of tvoff"), + +IOP( "wcdsc", BSIM4v6_MOD_WCDSC, IF_REAL, "Width dependence of cdsc"), +IOP( "wcdscb", BSIM4v6_MOD_WCDSCB, IF_REAL, "Width dependence of cdscb"), +IOP( "wcdscd", BSIM4v6_MOD_WCDSCD, IF_REAL, "Width dependence of cdscd"), +IOP( "wcit", BSIM4v6_MOD_WCIT, IF_REAL, "Width dependence of cit"), +IOP( "wnfactor", BSIM4v6_MOD_WNFACTOR, IF_REAL, "Width dependence of nfactor"), +IOP( "wxj", BSIM4v6_MOD_WXJ, IF_REAL, "Width dependence of xj"), +IOP( "wvsat", BSIM4v6_MOD_WVSAT, IF_REAL, "Width dependence of vsat"), +IOP( "wat", BSIM4v6_MOD_WAT, IF_REAL, "Width dependence of at"), +IOP( "wa0", BSIM4v6_MOD_WA0, IF_REAL, "Width dependence of a0"), +IOP( "wags", BSIM4v6_MOD_WAGS, IF_REAL, "Width dependence of ags"), +IOP( "wa1", BSIM4v6_MOD_WA1, IF_REAL, "Width dependence of a1"), +IOP( "wa2", BSIM4v6_MOD_WA2, IF_REAL, "Width dependence of a2"), +IOP( "wketa", BSIM4v6_MOD_WKETA, IF_REAL, "Width dependence of keta"), +IOP( "wnsub", BSIM4v6_MOD_WNSUB, IF_REAL, "Width dependence of nsub"), +IOP( "wndep", BSIM4v6_MOD_WNDEP, IF_REAL, "Width dependence of ndep"), +IOP( "wnsd", BSIM4v6_MOD_WNSD, IF_REAL, "Width dependence of nsd"), +IOP( "wphin", BSIM4v6_MOD_WPHIN, IF_REAL, "Width dependence of phin"), +IOP( "wngate", BSIM4v6_MOD_WNGATE, IF_REAL, "Width dependence of ngate"), +IOP( "wgamma1", BSIM4v6_MOD_WGAMMA1, IF_REAL, "Width dependence of gamma1"), +IOP( "wgamma2", BSIM4v6_MOD_WGAMMA2, IF_REAL, "Width dependence of gamma2"), +IOP( "wvbx", BSIM4v6_MOD_WVBX, IF_REAL, "Width dependence of vbx"), +IOP( "wvbm", BSIM4v6_MOD_WVBM, IF_REAL, "Width dependence of vbm"), +IOP( "wxt", BSIM4v6_MOD_WXT, IF_REAL, "Width dependence of xt"), +IOP( "wk1", BSIM4v6_MOD_WK1, IF_REAL, "Width dependence of k1"), +IOP( "wkt1", BSIM4v6_MOD_WKT1, IF_REAL, "Width dependence of kt1"), +IOP( "wkt1l", BSIM4v6_MOD_WKT1L, IF_REAL, "Width dependence of kt1l"), +IOP( "wkt2", BSIM4v6_MOD_WKT2, IF_REAL, "Width dependence of kt2"), +IOP( "wk2", BSIM4v6_MOD_WK2, IF_REAL, "Width dependence of k2"), +IOP( "wk3", BSIM4v6_MOD_WK3, IF_REAL, "Width dependence of k3"), +IOP( "wk3b", BSIM4v6_MOD_WK3B, IF_REAL, "Width dependence of k3b"), +IOP( "ww0", BSIM4v6_MOD_WW0, IF_REAL, "Width dependence of w0"), +IOP( "wdvtp0", BSIM4v6_MOD_WDVTP0, IF_REAL, "Width dependence of dvtp0"), +IOP( "wdvtp1", BSIM4v6_MOD_WDVTP1, IF_REAL, "Width dependence of dvtp1"), +IOP( "wlpe0", BSIM4v6_MOD_WLPE0, IF_REAL, "Width dependence of lpe0"), +IOP( "wlpeb", BSIM4v6_MOD_WLPEB, IF_REAL, "Width dependence of lpeb"), +IOP( "wdvt0", BSIM4v6_MOD_WDVT0, IF_REAL, "Width dependence of dvt0"), +IOP( "wdvt1", BSIM4v6_MOD_WDVT1, IF_REAL, "Width dependence of dvt1"), +IOP( "wdvt2", BSIM4v6_MOD_WDVT2, IF_REAL, "Width dependence of dvt2"), +IOP( "wdvt0w", BSIM4v6_MOD_WDVT0W, IF_REAL, "Width dependence of dvt0w"), +IOP( "wdvt1w", BSIM4v6_MOD_WDVT1W, IF_REAL, "Width dependence of dvt1w"), +IOP( "wdvt2w", BSIM4v6_MOD_WDVT2W, IF_REAL, "Width dependence of dvt2w"), +IOP( "wdrout", BSIM4v6_MOD_WDROUT, IF_REAL, "Width dependence of drout"), +IOP( "wdsub", BSIM4v6_MOD_WDSUB, IF_REAL, "Width dependence of dsub"), +IOP( "wvth0", BSIM4v6_MOD_WVTH0, IF_REAL,"Width dependence of vto"), +IOP( "wvtho", BSIM4v6_MOD_WVTH0, IF_REAL,"Width dependence of vto"), +IOP( "wua", BSIM4v6_MOD_WUA, IF_REAL, "Width dependence of ua"), +IOP( "wua1", BSIM4v6_MOD_WUA1, IF_REAL, "Width dependence of ua1"), +IOP( "wub", BSIM4v6_MOD_WUB, IF_REAL, "Width dependence of ub"), +IOP( "wub1", BSIM4v6_MOD_WUB1, IF_REAL, "Width dependence of ub1"), +IOP( "wuc", BSIM4v6_MOD_WUC, IF_REAL, "Width dependence of uc"), +IOP( "wuc1", BSIM4v6_MOD_WUC1, IF_REAL, "Width dependence of uc1"), +IOP( "wud", BSIM4v6_MOD_WUD, IF_REAL, "Width dependence of ud"), +IOP( "wud1", BSIM4v6_MOD_WUD1, IF_REAL, "Width dependence of ud1"), +IOP( "wup", BSIM4v6_MOD_WUP, IF_REAL, "Width dependence of up"), +IOP( "wlp", BSIM4v6_MOD_WLP, IF_REAL, "Width dependence of lp"), +IOP( "wu0", BSIM4v6_MOD_WU0, IF_REAL, "Width dependence of u0"), +IOP( "wute", BSIM4v6_MOD_WUTE, IF_REAL, "Width dependence of ute"), +IOP( "wucste", BSIM4v6_MOD_WUCSTE, IF_REAL, "Width dependence of ucste"), +IOP( "wvoff", BSIM4v6_MOD_WVOFF, IF_REAL, "Width dependence of voff"), +IOP( "wminv", BSIM4v6_MOD_WMINV, IF_REAL, "Width dependence of minv"), +IOP( "wminvcv", BSIM4v6_MOD_WMINVCV, IF_REAL, "Width dependence of minvcv"), +IOP( "wdelta", BSIM4v6_MOD_WDELTA, IF_REAL, "Width dependence of delta"), +IOP( "wrdsw", BSIM4v6_MOD_WRDSW, IF_REAL, "Width dependence of rdsw "), +IOP( "wrsw", BSIM4v6_MOD_WRSW, IF_REAL, "Width dependence of rsw"), +IOP( "wrdw", BSIM4v6_MOD_WRDW, IF_REAL, "Width dependence of rdw"), + +IOP( "wprwg", BSIM4v6_MOD_WPRWG, IF_REAL, "Width dependence of prwg "), +IOP( "wprwb", BSIM4v6_MOD_WPRWB, IF_REAL, "Width dependence of prwb "), + +IOP( "wprt", BSIM4v6_MOD_WPRT, IF_REAL, "Width dependence of prt"), +IOP( "weta0", BSIM4v6_MOD_WETA0, IF_REAL, "Width dependence of eta0"), +IOP( "wetab", BSIM4v6_MOD_WETAB, IF_REAL, "Width dependence of etab"), +IOP( "wpclm", BSIM4v6_MOD_WPCLM, IF_REAL, "Width dependence of pclm"), +IOP( "wpdiblc1", BSIM4v6_MOD_WPDIBL1, IF_REAL, "Width dependence of pdiblc1"), +IOP( "wpdiblc2", BSIM4v6_MOD_WPDIBL2, IF_REAL, "Width dependence of pdiblc2"), +IOP( "wpdiblcb", BSIM4v6_MOD_WPDIBLB, IF_REAL, "Width dependence of pdiblcb"), +IOP( "wfprout", BSIM4v6_MOD_WFPROUT, IF_REAL, "Width dependence of pdiblcb"), +IOP( "wpdits", BSIM4v6_MOD_WPDITS, IF_REAL, "Width dependence of pdits"), +IOP( "wpditsd", BSIM4v6_MOD_WPDITSD, IF_REAL, "Width dependence of pditsd"), +IOP( "wpscbe1", BSIM4v6_MOD_WPSCBE1, IF_REAL, "Width dependence of pscbe1"), +IOP( "wpscbe2", BSIM4v6_MOD_WPSCBE2, IF_REAL, "Width dependence of pscbe2"), +IOP( "wpvag", BSIM4v6_MOD_WPVAG, IF_REAL, "Width dependence of pvag"), +IOP( "wwr", BSIM4v6_MOD_WWR, IF_REAL, "Width dependence of wr"), +IOP( "wdwg", BSIM4v6_MOD_WDWG, IF_REAL, "Width dependence of dwg"), +IOP( "wdwb", BSIM4v6_MOD_WDWB, IF_REAL, "Width dependence of dwb"), +IOP( "wb0", BSIM4v6_MOD_WB0, IF_REAL, "Width dependence of b0"), +IOP( "wb1", BSIM4v6_MOD_WB1, IF_REAL, "Width dependence of b1"), +IOP( "wcgsl", BSIM4v6_MOD_WCGSL, IF_REAL, "Width dependence of cgsl"), +IOP( "wcgdl", BSIM4v6_MOD_WCGDL, IF_REAL, "Width dependence of cgdl"), +IOP( "wckappas", BSIM4v6_MOD_WCKAPPAS, IF_REAL, "Width dependence of ckappas"), +IOP( "wckappad", BSIM4v6_MOD_WCKAPPAD, IF_REAL, "Width dependence of ckappad"), +IOP( "wcf", BSIM4v6_MOD_WCF, IF_REAL, "Width dependence of cf"), +IOP( "wclc", BSIM4v6_MOD_WCLC, IF_REAL, "Width dependence of clc"), +IOP( "wcle", BSIM4v6_MOD_WCLE, IF_REAL, "Width dependence of cle"), +IOP( "walpha0", BSIM4v6_MOD_WALPHA0, IF_REAL, "Width dependence of alpha0"), +IOP( "walpha1", BSIM4v6_MOD_WALPHA1, IF_REAL, "Width dependence of alpha1"), +IOP( "wbeta0", BSIM4v6_MOD_WBETA0, IF_REAL, "Width dependence of beta0"), + +IOP( "wagidl", BSIM4v6_MOD_WAGIDL, IF_REAL, "Width dependence of agidl"), +IOP( "wbgidl", BSIM4v6_MOD_WBGIDL, IF_REAL, "Width dependence of bgidl"), +IOP( "wcgidl", BSIM4v6_MOD_WCGIDL, IF_REAL, "Width dependence of cgidl"), +IOP( "wegidl", BSIM4v6_MOD_WEGIDL, IF_REAL, "Width dependence of egidl"), +IOP( "wagisl", BSIM4v6_MOD_WAGISL, IF_REAL, "Width dependence of agisl"), +IOP( "wbgisl", BSIM4v6_MOD_WBGISL, IF_REAL, "Width dependence of bgisl"), +IOP( "wcgisl", BSIM4v6_MOD_WCGISL, IF_REAL, "Width dependence of cgisl"), +IOP( "wegisl", BSIM4v6_MOD_WEGISL, IF_REAL, "Width dependence of egisl"), +IOP( "waigc", BSIM4v6_MOD_WAIGC, IF_REAL, "Width dependence of aigc"), +IOP( "wbigc", BSIM4v6_MOD_WBIGC, IF_REAL, "Width dependence of bigc"), +IOP( "wcigc", BSIM4v6_MOD_WCIGC, IF_REAL, "Width dependence of cigc"), +IOP( "waigsd", BSIM4v6_MOD_WAIGSD, IF_REAL, "Width dependence of aigsd"), +IOP( "wbigsd", BSIM4v6_MOD_WBIGSD, IF_REAL, "Width dependence of bigsd"), +IOP( "wcigsd", BSIM4v6_MOD_WCIGSD, IF_REAL, "Width dependence of cigsd"), +IOP( "waigs", BSIM4v6_MOD_WAIGS, IF_REAL, "Width dependence of aigs"), +IOP( "wbigs", BSIM4v6_MOD_WBIGS, IF_REAL, "Width dependence of bigs"), +IOP( "wcigs", BSIM4v6_MOD_WCIGS, IF_REAL, "Width dependence of cigs"), +IOP( "waigd", BSIM4v6_MOD_WAIGD, IF_REAL, "Width dependence of aigd"), +IOP( "wbigd", BSIM4v6_MOD_WBIGD, IF_REAL, "Width dependence of bigd"), +IOP( "wcigd", BSIM4v6_MOD_WCIGD, IF_REAL, "Width dependence of cigd"), +IOP( "waigbacc", BSIM4v6_MOD_WAIGBACC, IF_REAL, "Width dependence of aigbacc"), +IOP( "wbigbacc", BSIM4v6_MOD_WBIGBACC, IF_REAL, "Width dependence of bigbacc"), +IOP( "wcigbacc", BSIM4v6_MOD_WCIGBACC, IF_REAL, "Width dependence of cigbacc"), +IOP( "waigbinv", BSIM4v6_MOD_WAIGBINV, IF_REAL, "Width dependence of aigbinv"), +IOP( "wbigbinv", BSIM4v6_MOD_WBIGBINV, IF_REAL, "Width dependence of bigbinv"), +IOP( "wcigbinv", BSIM4v6_MOD_WCIGBINV, IF_REAL, "Width dependence of cigbinv"), +IOP( "wnigc", BSIM4v6_MOD_WNIGC, IF_REAL, "Width dependence of nigc"), +IOP( "wnigbinv", BSIM4v6_MOD_WNIGBINV, IF_REAL, "Width dependence of nigbinv"), +IOP( "wnigbacc", BSIM4v6_MOD_WNIGBACC, IF_REAL, "Width dependence of nigbacc"), +IOP( "wntox", BSIM4v6_MOD_WNTOX, IF_REAL, "Width dependence of ntox"), +IOP( "weigbinv", BSIM4v6_MOD_WEIGBINV, IF_REAL, "Width dependence for eigbinv"), +IOP( "wpigcd", BSIM4v6_MOD_WPIGCD, IF_REAL, "Width dependence for pigcd"), +IOP( "wpoxedge", BSIM4v6_MOD_WPOXEDGE, IF_REAL, "Width dependence for poxedge"), +IOP( "wvfbcv", BSIM4v6_MOD_WVFBCV, IF_REAL, "Width dependence of vfbcv"), +IOP( "wvfb", BSIM4v6_MOD_WVFB, IF_REAL, "Width dependence of vfb"), +IOP( "wacde", BSIM4v6_MOD_WACDE, IF_REAL, "Width dependence of acde"), +IOP( "wmoin", BSIM4v6_MOD_WMOIN, IF_REAL, "Width dependence of moin"), +IOP( "wnoff", BSIM4v6_MOD_WNOFF, IF_REAL, "Width dependence of noff"), +IOP( "wvoffcv", BSIM4v6_MOD_WVOFFCV, IF_REAL, "Width dependence of voffcv"), +IOP( "wxrcrg1", BSIM4v6_MOD_WXRCRG1, IF_REAL, "Width dependence of xrcrg1"), +IOP( "wxrcrg2", BSIM4v6_MOD_WXRCRG2, IF_REAL, "Width dependence of xrcrg2"), +IOP( "wlambda", BSIM4v6_MOD_WLAMBDA, IF_REAL, "Width dependence of lambda"), +IOP( "wvtl", BSIM4v6_MOD_WVTL, IF_REAL, "Width dependence of vtl"), +IOP( "wxn", BSIM4v6_MOD_WXN, IF_REAL, "Width dependence of xn"), +IOP( "weu", BSIM4v6_MOD_WEU, IF_REAL, "Width dependence of eu"), +IOP( "wucs", BSIM4v6_MOD_WUCS, IF_REAL, "Width dependence of ucs"), +IOP( "wvfbsdoff", BSIM4v6_MOD_WVFBSDOFF, IF_REAL, "Width dependence of vfbsdoff"), +IOP( "wtvfbsdoff", BSIM4v6_MOD_WTVFBSDOFF, IF_REAL, "Width dependence of tvfbsdoff"), +IOP( "wtvoff", BSIM4v6_MOD_WTVOFF, IF_REAL, "Width dependence of tvoff"), + +IOP( "pcdsc", BSIM4v6_MOD_PCDSC, IF_REAL, "Cross-term dependence of cdsc"), +IOP( "pcdscb", BSIM4v6_MOD_PCDSCB, IF_REAL, "Cross-term dependence of cdscb"), +IOP( "pcdscd", BSIM4v6_MOD_PCDSCD, IF_REAL, "Cross-term dependence of cdscd"), +IOP( "pcit", BSIM4v6_MOD_PCIT, IF_REAL, "Cross-term dependence of cit"), +IOP( "pnfactor", BSIM4v6_MOD_PNFACTOR, IF_REAL, "Cross-term dependence of nfactor"), +IOP( "pxj", BSIM4v6_MOD_PXJ, IF_REAL, "Cross-term dependence of xj"), +IOP( "pvsat", BSIM4v6_MOD_PVSAT, IF_REAL, "Cross-term dependence of vsat"), +IOP( "pat", BSIM4v6_MOD_PAT, IF_REAL, "Cross-term dependence of at"), +IOP( "pa0", BSIM4v6_MOD_PA0, IF_REAL, "Cross-term dependence of a0"), +IOP( "pags", BSIM4v6_MOD_PAGS, IF_REAL, "Cross-term dependence of ags"), +IOP( "pa1", BSIM4v6_MOD_PA1, IF_REAL, "Cross-term dependence of a1"), +IOP( "pa2", BSIM4v6_MOD_PA2, IF_REAL, "Cross-term dependence of a2"), +IOP( "pketa", BSIM4v6_MOD_PKETA, IF_REAL, "Cross-term dependence of keta"), +IOP( "pnsub", BSIM4v6_MOD_PNSUB, IF_REAL, "Cross-term dependence of nsub"), +IOP( "pndep", BSIM4v6_MOD_PNDEP, IF_REAL, "Cross-term dependence of ndep"), +IOP( "pnsd", BSIM4v6_MOD_PNSD, IF_REAL, "Cross-term dependence of nsd"), +IOP( "pphin", BSIM4v6_MOD_PPHIN, IF_REAL, "Cross-term dependence of phin"), +IOP( "pngate", BSIM4v6_MOD_PNGATE, IF_REAL, "Cross-term dependence of ngate"), +IOP( "pgamma1", BSIM4v6_MOD_PGAMMA1, IF_REAL, "Cross-term dependence of gamma1"), +IOP( "pgamma2", BSIM4v6_MOD_PGAMMA2, IF_REAL, "Cross-term dependence of gamma2"), +IOP( "pvbx", BSIM4v6_MOD_PVBX, IF_REAL, "Cross-term dependence of vbx"), +IOP( "pvbm", BSIM4v6_MOD_PVBM, IF_REAL, "Cross-term dependence of vbm"), +IOP( "pxt", BSIM4v6_MOD_PXT, IF_REAL, "Cross-term dependence of xt"), +IOP( "pk1", BSIM4v6_MOD_PK1, IF_REAL, "Cross-term dependence of k1"), +IOP( "pkt1", BSIM4v6_MOD_PKT1, IF_REAL, "Cross-term dependence of kt1"), +IOP( "pkt1l", BSIM4v6_MOD_PKT1L, IF_REAL, "Cross-term dependence of kt1l"), +IOP( "pkt2", BSIM4v6_MOD_PKT2, IF_REAL, "Cross-term dependence of kt2"), +IOP( "pk2", BSIM4v6_MOD_PK2, IF_REAL, "Cross-term dependence of k2"), +IOP( "pk3", BSIM4v6_MOD_PK3, IF_REAL, "Cross-term dependence of k3"), +IOP( "pk3b", BSIM4v6_MOD_PK3B, IF_REAL, "Cross-term dependence of k3b"), +IOP( "pw0", BSIM4v6_MOD_PW0, IF_REAL, "Cross-term dependence of w0"), +IOP( "pdvtp0", BSIM4v6_MOD_PDVTP0, IF_REAL, "Cross-term dependence of dvtp0"), +IOP( "pdvtp1", BSIM4v6_MOD_PDVTP1, IF_REAL, "Cross-term dependence of dvtp1"), +IOP( "plpe0", BSIM4v6_MOD_PLPE0, IF_REAL, "Cross-term dependence of lpe0"), +IOP( "plpeb", BSIM4v6_MOD_PLPEB, IF_REAL, "Cross-term dependence of lpeb"), +IOP( "pdvt0", BSIM4v6_MOD_PDVT0, IF_REAL, "Cross-term dependence of dvt0"), +IOP( "pdvt1", BSIM4v6_MOD_PDVT1, IF_REAL, "Cross-term dependence of dvt1"), +IOP( "pdvt2", BSIM4v6_MOD_PDVT2, IF_REAL, "Cross-term dependence of dvt2"), +IOP( "pdvt0w", BSIM4v6_MOD_PDVT0W, IF_REAL, "Cross-term dependence of dvt0w"), +IOP( "pdvt1w", BSIM4v6_MOD_PDVT1W, IF_REAL, "Cross-term dependence of dvt1w"), +IOP( "pdvt2w", BSIM4v6_MOD_PDVT2W, IF_REAL, "Cross-term dependence of dvt2w"), +IOP( "pdrout", BSIM4v6_MOD_PDROUT, IF_REAL, "Cross-term dependence of drout"), +IOP( "pdsub", BSIM4v6_MOD_PDSUB, IF_REAL, "Cross-term dependence of dsub"), +IOP( "pvth0", BSIM4v6_MOD_PVTH0, IF_REAL,"Cross-term dependence of vto"), +IOP( "pvtho", BSIM4v6_MOD_PVTH0, IF_REAL,"Cross-term dependence of vto"), +IOP( "pua", BSIM4v6_MOD_PUA, IF_REAL, "Cross-term dependence of ua"), +IOP( "pua1", BSIM4v6_MOD_PUA1, IF_REAL, "Cross-term dependence of ua1"), +IOP( "pub", BSIM4v6_MOD_PUB, IF_REAL, "Cross-term dependence of ub"), +IOP( "pub1", BSIM4v6_MOD_PUB1, IF_REAL, "Cross-term dependence of ub1"), +IOP( "puc", BSIM4v6_MOD_PUC, IF_REAL, "Cross-term dependence of uc"), +IOP( "puc1", BSIM4v6_MOD_PUC1, IF_REAL, "Cross-term dependence of uc1"), +IOP( "pud", BSIM4v6_MOD_PUD, IF_REAL, "Cross-term dependence of ud"), +IOP( "pud1", BSIM4v6_MOD_PUD1, IF_REAL, "Cross-term dependence of ud1"), +IOP( "pup", BSIM4v6_MOD_PUP, IF_REAL, "Cross-term dependence of up"), +IOP( "plp", BSIM4v6_MOD_PLP, IF_REAL, "Cross-term dependence of lp"), +IOP( "pu0", BSIM4v6_MOD_PU0, IF_REAL, "Cross-term dependence of u0"), +IOP( "pute", BSIM4v6_MOD_PUTE, IF_REAL, "Cross-term dependence of ute"), +IOP( "pucste", BSIM4v6_MOD_PUCSTE, IF_REAL, "Cross-term dependence of ucste"), +IOP( "pvoff", BSIM4v6_MOD_PVOFF, IF_REAL, "Cross-term dependence of voff"), +IOP( "pminv", BSIM4v6_MOD_PMINV, IF_REAL, "Cross-term dependence of minv"), +IOP( "pminvcv", BSIM4v6_MOD_PMINVCV, IF_REAL, "Cross-term dependence of minvcv"), +IOP( "pdelta", BSIM4v6_MOD_PDELTA, IF_REAL, "Cross-term dependence of delta"), +IOP( "prdsw", BSIM4v6_MOD_PRDSW, IF_REAL, "Cross-term dependence of rdsw "), +IOP( "prsw", BSIM4v6_MOD_PRSW, IF_REAL, "Cross-term dependence of rsw"), +IOP( "prdw", BSIM4v6_MOD_PRDW, IF_REAL, "Cross-term dependence of rdw"), + +IOP( "pprwg", BSIM4v6_MOD_PPRWG, IF_REAL, "Cross-term dependence of prwg "), +IOP( "pprwb", BSIM4v6_MOD_PPRWB, IF_REAL, "Cross-term dependence of prwb "), + +IOP( "pprt", BSIM4v6_MOD_PPRT, IF_REAL, "Cross-term dependence of prt "), +IOP( "peta0", BSIM4v6_MOD_PETA0, IF_REAL, "Cross-term dependence of eta0"), +IOP( "petab", BSIM4v6_MOD_PETAB, IF_REAL, "Cross-term dependence of etab"), +IOP( "ppclm", BSIM4v6_MOD_PPCLM, IF_REAL, "Cross-term dependence of pclm"), +IOP( "ppdiblc1", BSIM4v6_MOD_PPDIBL1, IF_REAL, "Cross-term dependence of pdiblc1"), +IOP( "ppdiblc2", BSIM4v6_MOD_PPDIBL2, IF_REAL, "Cross-term dependence of pdiblc2"), +IOP( "ppdiblcb", BSIM4v6_MOD_PPDIBLB, IF_REAL, "Cross-term dependence of pdiblcb"), +IOP( "pfprout", BSIM4v6_MOD_PFPROUT, IF_REAL, "Cross-term dependence of pdiblcb"), +IOP( "ppdits", BSIM4v6_MOD_PPDITS, IF_REAL, "Cross-term dependence of pdits"), +IOP( "ppditsd", BSIM4v6_MOD_PPDITSD, IF_REAL, "Cross-term dependence of pditsd"), +IOP( "ppscbe1", BSIM4v6_MOD_PPSCBE1, IF_REAL, "Cross-term dependence of pscbe1"), +IOP( "ppscbe2", BSIM4v6_MOD_PPSCBE2, IF_REAL, "Cross-term dependence of pscbe2"), +IOP( "ppvag", BSIM4v6_MOD_PPVAG, IF_REAL, "Cross-term dependence of pvag"), +IOP( "pwr", BSIM4v6_MOD_PWR, IF_REAL, "Cross-term dependence of wr"), +IOP( "pdwg", BSIM4v6_MOD_PDWG, IF_REAL, "Cross-term dependence of dwg"), +IOP( "pdwb", BSIM4v6_MOD_PDWB, IF_REAL, "Cross-term dependence of dwb"), +IOP( "pb0", BSIM4v6_MOD_PB0, IF_REAL, "Cross-term dependence of b0"), +IOP( "pb1", BSIM4v6_MOD_PB1, IF_REAL, "Cross-term dependence of b1"), +IOP( "pcgsl", BSIM4v6_MOD_PCGSL, IF_REAL, "Cross-term dependence of cgsl"), +IOP( "pcgdl", BSIM4v6_MOD_PCGDL, IF_REAL, "Cross-term dependence of cgdl"), +IOP( "pckappas", BSIM4v6_MOD_PCKAPPAS, IF_REAL, "Cross-term dependence of ckappas"), +IOP( "pckappad", BSIM4v6_MOD_PCKAPPAD, IF_REAL, "Cross-term dependence of ckappad"), +IOP( "pcf", BSIM4v6_MOD_PCF, IF_REAL, "Cross-term dependence of cf"), +IOP( "pclc", BSIM4v6_MOD_PCLC, IF_REAL, "Cross-term dependence of clc"), +IOP( "pcle", BSIM4v6_MOD_PCLE, IF_REAL, "Cross-term dependence of cle"), +IOP( "palpha0", BSIM4v6_MOD_PALPHA0, IF_REAL, "Cross-term dependence of alpha0"), +IOP( "palpha1", BSIM4v6_MOD_PALPHA1, IF_REAL, "Cross-term dependence of alpha1"), +IOP( "pbeta0", BSIM4v6_MOD_PBETA0, IF_REAL, "Cross-term dependence of beta0"), + +IOP( "pagidl", BSIM4v6_MOD_PAGIDL, IF_REAL, "Cross-term dependence of agidl"), +IOP( "pbgidl", BSIM4v6_MOD_PBGIDL, IF_REAL, "Cross-term dependence of bgidl"), +IOP( "pcgidl", BSIM4v6_MOD_PCGIDL, IF_REAL, "Cross-term dependence of cgidl"), +IOP( "pegidl", BSIM4v6_MOD_PEGIDL, IF_REAL, "Cross-term dependence of egidl"), +IOP( "pagisl", BSIM4v6_MOD_PAGISL, IF_REAL, "Cross-term dependence of agisl"), +IOP( "pbgisl", BSIM4v6_MOD_PBGISL, IF_REAL, "Cross-term dependence of bgisl"), +IOP( "pcgisl", BSIM4v6_MOD_PCGISL, IF_REAL, "Cross-term dependence of cgisl"), +IOP( "pegisl", BSIM4v6_MOD_PEGISL, IF_REAL, "Cross-term dependence of egisl"), +IOP( "paigc", BSIM4v6_MOD_PAIGC, IF_REAL, "Cross-term dependence of aigc"), +IOP( "pbigc", BSIM4v6_MOD_PBIGC, IF_REAL, "Cross-term dependence of bigc"), +IOP( "pcigc", BSIM4v6_MOD_PCIGC, IF_REAL, "Cross-term dependence of cigc"), +IOP( "paigsd", BSIM4v6_MOD_PAIGSD, IF_REAL, "Cross-term dependence of aigsd"), +IOP( "pbigsd", BSIM4v6_MOD_PBIGSD, IF_REAL, "Cross-term dependence of bigsd"), +IOP( "pcigsd", BSIM4v6_MOD_PCIGSD, IF_REAL, "Cross-term dependence of cigsd"), +IOP( "paigs", BSIM4v6_MOD_PAIGS, IF_REAL, "Cross-term dependence of aigs"), +IOP( "pbigs", BSIM4v6_MOD_PBIGS, IF_REAL, "Cross-term dependence of bigs"), +IOP( "pcigs", BSIM4v6_MOD_PCIGS, IF_REAL, "Cross-term dependence of cigs"), +IOP( "paigd", BSIM4v6_MOD_PAIGD, IF_REAL, "Cross-term dependence of aigd"), +IOP( "pbigd", BSIM4v6_MOD_PBIGD, IF_REAL, "Cross-term dependence of bigd"), +IOP( "pcigd", BSIM4v6_MOD_PCIGD, IF_REAL, "Cross-term dependence of cigd"), +IOP( "paigbacc", BSIM4v6_MOD_PAIGBACC, IF_REAL, "Cross-term dependence of aigbacc"), +IOP( "pbigbacc", BSIM4v6_MOD_PBIGBACC, IF_REAL, "Cross-term dependence of bigbacc"), +IOP( "pcigbacc", BSIM4v6_MOD_PCIGBACC, IF_REAL, "Cross-term dependence of cigbacc"), +IOP( "paigbinv", BSIM4v6_MOD_PAIGBINV, IF_REAL, "Cross-term dependence of aigbinv"), +IOP( "pbigbinv", BSIM4v6_MOD_PBIGBINV, IF_REAL, "Cross-term dependence of bigbinv"), +IOP( "pcigbinv", BSIM4v6_MOD_PCIGBINV, IF_REAL, "Cross-term dependence of cigbinv"), +IOP( "pnigc", BSIM4v6_MOD_PNIGC, IF_REAL, "Cross-term dependence of nigc"), +IOP( "pnigbinv", BSIM4v6_MOD_PNIGBINV, IF_REAL, "Cross-term dependence of nigbinv"), +IOP( "pnigbacc", BSIM4v6_MOD_PNIGBACC, IF_REAL, "Cross-term dependence of nigbacc"), +IOP( "pntox", BSIM4v6_MOD_PNTOX, IF_REAL, "Cross-term dependence of ntox"), +IOP( "peigbinv", BSIM4v6_MOD_PEIGBINV, IF_REAL, "Cross-term dependence for eigbinv"), +IOP( "ppigcd", BSIM4v6_MOD_PPIGCD, IF_REAL, "Cross-term dependence for pigcd"), +IOP( "ppoxedge", BSIM4v6_MOD_PPOXEDGE, IF_REAL, "Cross-term dependence for poxedge"), +IOP( "pvfbcv", BSIM4v6_MOD_PVFBCV, IF_REAL, "Cross-term dependence of vfbcv"), +IOP( "pvfb", BSIM4v6_MOD_PVFB, IF_REAL, "Cross-term dependence of vfb"), +IOP( "pacde", BSIM4v6_MOD_PACDE, IF_REAL, "Cross-term dependence of acde"), +IOP( "pmoin", BSIM4v6_MOD_PMOIN, IF_REAL, "Cross-term dependence of moin"), +IOP( "pnoff", BSIM4v6_MOD_PNOFF, IF_REAL, "Cross-term dependence of noff"), +IOP( "pvoffcv", BSIM4v6_MOD_PVOFFCV, IF_REAL, "Cross-term dependence of voffcv"), +IOP( "pxrcrg1", BSIM4v6_MOD_PXRCRG1, IF_REAL, "Cross-term dependence of xrcrg1"), +IOP( "pxrcrg2", BSIM4v6_MOD_PXRCRG2, IF_REAL, "Cross-term dependence of xrcrg2"), +IOP( "plambda", BSIM4v6_MOD_PLAMBDA, IF_REAL, "Cross-term dependence of lambda"), +IOP( "pvtl", BSIM4v6_MOD_PVTL, IF_REAL, "Cross-term dependence of vtl"), +IOP( "pxn", BSIM4v6_MOD_PXN, IF_REAL, "Cross-term dependence of xn"), +IOP( "peu", BSIM4v6_MOD_PEU, IF_REAL, "Cross-term dependence of eu"), +IOP( "pucs", BSIM4v6_MOD_PUCS, IF_REAL, "Cross-term dependence of ucs"), +IOP( "pvfbsdoff", BSIM4v6_MOD_PVFBSDOFF, IF_REAL, "Cross-term dependence of vfbsdoff"), +IOP( "ptvfbsdoff", BSIM4v6_MOD_PTVFBSDOFF, IF_REAL, "Cross-term dependence of tvfbsdoff"), +IOP( "ptvoff", BSIM4v6_MOD_PTVOFF, IF_REAL, "Cross-term dependence of tvoff"), + +/* stress effect*/ +IOP( "saref", BSIM4v6_MOD_SAREF, IF_REAL, "Reference distance between OD edge to poly of one side"), +IOP( "sbref", BSIM4v6_MOD_SBREF, IF_REAL, "Reference distance between OD edge to poly of the other side"), +IOP( "wlod", BSIM4v6_MOD_WLOD, IF_REAL, "Width parameter for stress effect"), +IOP( "ku0", BSIM4v6_MOD_KU0, IF_REAL, "Mobility degradation/enhancement coefficient for LOD"), +IOP( "kvsat", BSIM4v6_MOD_KVSAT, IF_REAL, "Saturation velocity degradation/enhancement parameter for LOD"), +IOP( "kvth0", BSIM4v6_MOD_KVTH0, IF_REAL, "Threshold degradation/enhancement parameter for LOD"), +IOP( "tku0", BSIM4v6_MOD_TKU0, IF_REAL, "Temperature coefficient of KU0"), +IOP( "llodku0", BSIM4v6_MOD_LLODKU0, IF_REAL, "Length parameter for u0 LOD effect"), +IOP( "wlodku0", BSIM4v6_MOD_WLODKU0, IF_REAL, "Width parameter for u0 LOD effect"), +IOP( "llodvth", BSIM4v6_MOD_LLODVTH, IF_REAL, "Length parameter for vth LOD effect"), +IOP( "wlodvth", BSIM4v6_MOD_WLODVTH, IF_REAL, "Width parameter for vth LOD effect"), +IOP( "lku0", BSIM4v6_MOD_LKU0, IF_REAL, "Length dependence of ku0"), +IOP( "wku0", BSIM4v6_MOD_WKU0, IF_REAL, "Width dependence of ku0"), +IOP( "pku0", BSIM4v6_MOD_PKU0, IF_REAL, "Cross-term dependence of ku0"), +IOP( "lkvth0", BSIM4v6_MOD_LKVTH0, IF_REAL, "Length dependence of kvth0"), +IOP( "wkvth0", BSIM4v6_MOD_WKVTH0, IF_REAL, "Width dependence of kvth0"), +IOP( "pkvth0", BSIM4v6_MOD_PKVTH0, IF_REAL, "Cross-term dependence of kvth0"), +IOP( "stk2", BSIM4v6_MOD_STK2, IF_REAL, "K2 shift factor related to stress effect on vth"), +IOP( "lodk2", BSIM4v6_MOD_LODK2, IF_REAL, "K2 shift modification factor for stress effect"), +IOP( "steta0", BSIM4v6_MOD_STETA0, IF_REAL, "eta0 shift factor related to stress effect on vth"), +IOP( "lodeta0", BSIM4v6_MOD_LODETA0, IF_REAL, "eta0 shift modification factor for stress effect"), +/* Well Proximity Effect */ +IOP( "web", BSIM4v6_MOD_WEB, IF_REAL, "Coefficient for SCB"), +IOP( "wec", BSIM4v6_MOD_WEC, IF_REAL, "Coefficient for SCC"), +IOP( "kvth0we", BSIM4v6_MOD_KVTH0WE, IF_REAL, "Threshold shift factor for well proximity effect"), +IOP( "k2we", BSIM4v6_MOD_K2WE, IF_REAL, " K2 shift factor for well proximity effect "), +IOP( "ku0we", BSIM4v6_MOD_KU0WE, IF_REAL, " Mobility degradation factor for well proximity effect "), +IOP( "scref", BSIM4v6_MOD_SCREF, IF_REAL, " Reference distance to calculate SCA, SCB and SCC"), +IOP( "wpemod", BSIM4v6_MOD_WPEMOD, IF_REAL, " Flag for WPE model (WPEMOD=1 to activate this model) "), +IOP( "lkvth0we", BSIM4v6_MOD_LKVTH0WE, IF_REAL, "Length dependence of kvth0we"), +IOP( "lk2we", BSIM4v6_MOD_LK2WE, IF_REAL, " Length dependence of k2we "), +IOP( "lku0we", BSIM4v6_MOD_LKU0WE, IF_REAL, " Length dependence of ku0we "), +IOP( "wkvth0we", BSIM4v6_MOD_WKVTH0WE, IF_REAL, "Width dependence of kvth0we"), +IOP( "wk2we", BSIM4v6_MOD_WK2WE, IF_REAL, " Width dependence of k2we "), +IOP( "wku0we", BSIM4v6_MOD_WKU0WE, IF_REAL, " Width dependence of ku0we "), +IOP( "pkvth0we", BSIM4v6_MOD_PKVTH0WE, IF_REAL, "Cross-term dependence of kvth0we"), +IOP( "pk2we", BSIM4v6_MOD_PK2WE, IF_REAL, " Cross-term dependence of k2we "), +IOP( "pku0we", BSIM4v6_MOD_PKU0WE, IF_REAL, " Cross-term dependence of ku0we "), + +IOP( "noia", BSIM4v6_MOD_NOIA, IF_REAL, "Flicker noise parameter"), +IOP( "noib", BSIM4v6_MOD_NOIB, IF_REAL, "Flicker noise parameter"), +IOP( "noic", BSIM4v6_MOD_NOIC, IF_REAL, "Flicker noise parameter"), +IOP( "tnoia", BSIM4v6_MOD_TNOIA, IF_REAL, "Thermal noise parameter"), +IOP( "tnoib", BSIM4v6_MOD_TNOIB, IF_REAL, "Thermal noise parameter"), +IOP( "rnoia", BSIM4v6_MOD_RNOIA, IF_REAL, "Thermal noise coefficient"), +IOP( "rnoib", BSIM4v6_MOD_RNOIB, IF_REAL, "Thermal noise coefficient"), +IOP( "ntnoi", BSIM4v6_MOD_NTNOI, IF_REAL, "Thermal noise parameter"), +IOP( "em", BSIM4v6_MOD_EM, IF_REAL, "Flicker noise parameter"), +IOP( "ef", BSIM4v6_MOD_EF, IF_REAL, "Flicker noise frequency exponent"), +IOP( "af", BSIM4v6_MOD_AF, IF_REAL, "Flicker noise exponent"), +IOP( "kf", BSIM4v6_MOD_KF, IF_REAL, "Flicker noise coefficient"), + +IP( "nmos", BSIM4v6_MOD_NMOS, IF_FLAG, "Flag to indicate NMOS"), +IP( "pmos", BSIM4v6_MOD_PMOS, IF_FLAG, "Flag to indicate PMOS"), +}; + +char *BSIM4v6names[] = { + "Drain", + "Gate", + "Source", + "Bulk", + "Charge" +}; + +int BSIM4v6nSize = NUMELEMS(BSIM4v6names); +int BSIM4v6pTSize = NUMELEMS(BSIM4v6pTable); +int BSIM4v6mPTSize = NUMELEMS(BSIM4v6mPTable); +int BSIM4v6iSize = sizeof(BSIM4v6instance); +int BSIM4v6mSize = sizeof(BSIM4v6model); diff --git a/src/spicelib/devices/bsim4v6/b4v6acld.c b/src/spicelib/devices/bsim4v6/b4v6acld.c new file mode 100644 index 000000000..fe9ec09ce --- /dev/null +++ b/src/spicelib/devices/bsim4v6/b4v6acld.c @@ -0,0 +1,673 @@ +/**** BSIM4.6.2 Released by Wenwei Yang 07/31/2008 ****/ + +/********** + * Copyright 2006 Regents of the University of California. All rights reserved. + * File: b4acld.c of BSIM4.6.2. + * Author: 2000 Weidong Liu + * Authors: 2001- Xuemei Xi, Mohan Dunga, Ali Niknejad, Chenming Hu. + * Authors: 2006- Mohan Dunga, Ali Niknejad, Chenming Hu + * Authors: 2007- Mohan Dunga, Wenwei Yang, Ali Niknejad, Chenming Hu + * Project Director: Prof. Chenming Hu. + * Modified by Xuemei Xi, 10/05/2001. + **********/ + +#include "ngspice.h" +#include "cktdefs.h" +#include "bsim4v6def.h" +#include "sperror.h" +#include "suffix.h" + + +int +BSIM4v6acLoad( +GENmodel *inModel, +CKTcircuit *ckt) +{ +BSIM4v6model *model = (BSIM4v6model*)inModel; +BSIM4v6instance *here; + +double gjbd, gjbs, geltd, gcrg, gcrgg, gcrgd, gcrgs, gcrgb; +double xcbgb, xcbdb, xcbsb, xcbbb; +double xcggbr, xcgdbr, xcgsbr, xcgbbr, xcggbi, xcgdbi, xcgsbi, xcgbbi; +double Cggr, Cgdr, Cgsr, Cgbr, Cggi, Cgdi, Cgsi, Cgbi; +double xcddbr, xcdgbr, xcdsbr, xcdbbr, xcsdbr, xcsgbr, xcssbr, xcsbbr; +double xcddbi, xcdgbi, xcdsbi, xcdbbi, xcsdbi, xcsgbi, xcssbi, xcsbbi; +double xcdbdb, xcsbsb=0.0, xcgmgmb=0.0, xcgmdb=0.0, xcgmsb=0.0, xcdgmb, xcsgmb; +double xcgmbb=0.0, xcbgmb; +double capbd, capbs, omega; +double gstot, gstotd, gstotg, gstots, gstotb, gspr; +double gdtot, gdtotd, gdtotg, gdtots, gdtotb, gdpr; +double gIstotg, gIstotd, gIstots, gIstotb; +double gIdtotg, gIdtotd, gIdtots, gIdtotb; +double gIbtotg, gIbtotd, gIbtots, gIbtotb; +double gIgtotg, gIgtotd, gIgtots, gIgtotb; +double cgso, cgdo, cgbo; +double gbspsp, gbbdp, gbbsp, gbspg, gbspb; +double gbspdp, gbdpdp, gbdpg, gbdpb, gbdpsp; +double T0=0.0, T1, T2, T3; +double Csg, Csd, Css; +double Cdgr, Cddr, Cdsr, Cdbr, Csgr, Csdr, Cssr, Csbr; +double Cdgi, Cddi, Cdsi, Cdbi, Csgi, Csdi, Cssi, Csbi; +double gmr, gmi, gmbsr, gmbsi, gdsr, gdsi; +double FwdSumr, RevSumr, Gmr, Gmbsr; +double FwdSumi, RevSumi, Gmi, Gmbsi; +struct bsim4v6SizeDependParam *pParam; +double ggidld, ggidlg, ggidlb, ggislg, ggislb, ggisls; + +double m; + + omega = ckt->CKTomega; + for (; model != NULL; model = model->BSIM4v6nextModel) + { for (here = model->BSIM4v6instances; here!= NULL; + here = here->BSIM4v6nextInstance) + { if (here->BSIM4v6owner != ARCHme) continue; + pParam = here->pParam; + capbd = here->BSIM4v6capbd; + capbs = here->BSIM4v6capbs; + cgso = here->BSIM4v6cgso; + cgdo = here->BSIM4v6cgdo; + cgbo = pParam->BSIM4v6cgbo; + + Csd = -(here->BSIM4v6cddb + here->BSIM4v6cgdb + here->BSIM4v6cbdb); + Csg = -(here->BSIM4v6cdgb + here->BSIM4v6cggb + here->BSIM4v6cbgb); + Css = -(here->BSIM4v6cdsb + here->BSIM4v6cgsb + here->BSIM4v6cbsb); + + if (here->BSIM4v6acnqsMod) + { T0 = omega * here->BSIM4v6taunet; + T1 = T0 * T0; + T2 = 1.0 / (1.0 + T1); + T3 = T0 * T2; + + gmr = here->BSIM4v6gm * T2; + gmbsr = here->BSIM4v6gmbs * T2; + gdsr = here->BSIM4v6gds * T2; + + gmi = -here->BSIM4v6gm * T3; + gmbsi = -here->BSIM4v6gmbs * T3; + gdsi = -here->BSIM4v6gds * T3; + + Cddr = here->BSIM4v6cddb * T2; + Cdgr = here->BSIM4v6cdgb * T2; + Cdsr = here->BSIM4v6cdsb * T2; + Cdbr = -(Cddr + Cdgr + Cdsr); + + /* WDLiu: Cxyi mulitplied by jomega below, and actually to be of conductance */ + Cddi = here->BSIM4v6cddb * T3 * omega; + Cdgi = here->BSIM4v6cdgb * T3 * omega; + Cdsi = here->BSIM4v6cdsb * T3 * omega; + Cdbi = -(Cddi + Cdgi + Cdsi); + + Csdr = Csd * T2; + Csgr = Csg * T2; + Cssr = Css * T2; + Csbr = -(Csdr + Csgr + Cssr); + + Csdi = Csd * T3 * omega; + Csgi = Csg * T3 * omega; + Cssi = Css * T3 * omega; + Csbi = -(Csdi + Csgi + Cssi); + + Cgdr = -(Cddr + Csdr + here->BSIM4v6cbdb); + Cggr = -(Cdgr + Csgr + here->BSIM4v6cbgb); + Cgsr = -(Cdsr + Cssr + here->BSIM4v6cbsb); + Cgbr = -(Cgdr + Cggr + Cgsr); + + Cgdi = -(Cddi + Csdi); + Cggi = -(Cdgi + Csgi); + Cgsi = -(Cdsi + Cssi); + Cgbi = -(Cgdi + Cggi + Cgsi); + } + else /* QS */ + { gmr = here->BSIM4v6gm; + gmbsr = here->BSIM4v6gmbs; + gdsr = here->BSIM4v6gds; + gmi = gmbsi = gdsi = 0.0; + + Cddr = here->BSIM4v6cddb; + Cdgr = here->BSIM4v6cdgb; + Cdsr = here->BSIM4v6cdsb; + Cdbr = -(Cddr + Cdgr + Cdsr); + Cddi = Cdgi = Cdsi = Cdbi = 0.0; + + Csdr = Csd; + Csgr = Csg; + Cssr = Css; + Csbr = -(Csdr + Csgr + Cssr); + Csdi = Csgi = Cssi = Csbi = 0.0; + + Cgdr = here->BSIM4v6cgdb; + Cggr = here->BSIM4v6cggb; + Cgsr = here->BSIM4v6cgsb; + Cgbr = -(Cgdr + Cggr + Cgsr); + Cgdi = Cggi = Cgsi = Cgbi = 0.0; + } + + + if (here->BSIM4v6mode >= 0) + { Gmr = gmr; + Gmbsr = gmbsr; + FwdSumr = Gmr + Gmbsr; + RevSumr = 0.0; + Gmi = gmi; + Gmbsi = gmbsi; + FwdSumi = Gmi + Gmbsi; + RevSumi = 0.0; + + gbbdp = -(here->BSIM4v6gbds); + gbbsp = here->BSIM4v6gbds + here->BSIM4v6gbgs + here->BSIM4v6gbbs; + gbdpg = here->BSIM4v6gbgs; + gbdpdp = here->BSIM4v6gbds; + gbdpb = here->BSIM4v6gbbs; + gbdpsp = -(gbdpg + gbdpdp + gbdpb); + + gbspdp = 0.0; + gbspg = 0.0; + gbspb = 0.0; + gbspsp = 0.0; + + if (model->BSIM4v6igcMod) + { gIstotg = here->BSIM4v6gIgsg + here->BSIM4v6gIgcsg; + gIstotd = here->BSIM4v6gIgcsd; + gIstots = here->BSIM4v6gIgss + here->BSIM4v6gIgcss; + gIstotb = here->BSIM4v6gIgcsb; + + gIdtotg = here->BSIM4v6gIgdg + here->BSIM4v6gIgcdg; + gIdtotd = here->BSIM4v6gIgdd + here->BSIM4v6gIgcdd; + gIdtots = here->BSIM4v6gIgcds; + gIdtotb = here->BSIM4v6gIgcdb; + } + else + { gIstotg = gIstotd = gIstots = gIstotb = 0.0; + gIdtotg = gIdtotd = gIdtots = gIdtotb = 0.0; + } + + if (model->BSIM4v6igbMod) + { gIbtotg = here->BSIM4v6gIgbg; + gIbtotd = here->BSIM4v6gIgbd; + gIbtots = here->BSIM4v6gIgbs; + gIbtotb = here->BSIM4v6gIgbb; + } + else + gIbtotg = gIbtotd = gIbtots = gIbtotb = 0.0; + + if ((model->BSIM4v6igcMod != 0) || (model->BSIM4v6igbMod != 0)) + { gIgtotg = gIstotg + gIdtotg + gIbtotg; + gIgtotd = gIstotd + gIdtotd + gIbtotd ; + gIgtots = gIstots + gIdtots + gIbtots; + gIgtotb = gIstotb + gIdtotb + gIbtotb; + } + else + gIgtotg = gIgtotd = gIgtots = gIgtotb = 0.0; + + if (here->BSIM4v6rgateMod == 2) + T0 = *(ckt->CKTstates[0] + here->BSIM4v6vges) + - *(ckt->CKTstates[0] + here->BSIM4v6vgs); + else if (here->BSIM4v6rgateMod == 3) + T0 = *(ckt->CKTstates[0] + here->BSIM4v6vgms) + - *(ckt->CKTstates[0] + here->BSIM4v6vgs); + if (here->BSIM4v6rgateMod > 1) + { gcrgd = here->BSIM4v6gcrgd * T0; + gcrgg = here->BSIM4v6gcrgg * T0; + gcrgs = here->BSIM4v6gcrgs * T0; + gcrgb = here->BSIM4v6gcrgb * T0; + gcrgg -= here->BSIM4v6gcrg; + gcrg = here->BSIM4v6gcrg; + } + else + gcrg = gcrgd = gcrgg = gcrgs = gcrgb = 0.0; + + if (here->BSIM4v6rgateMod == 3) + { xcgmgmb = (cgdo + cgso + pParam->BSIM4v6cgbo) * omega; + xcgmdb = -cgdo * omega; + xcgmsb = -cgso * omega; + xcgmbb = -pParam->BSIM4v6cgbo * omega; + + xcdgmb = xcgmdb; + xcsgmb = xcgmsb; + xcbgmb = xcgmbb; + + xcggbr = Cggr * omega; + xcgdbr = Cgdr * omega; + xcgsbr = Cgsr * omega; + xcgbbr = -(xcggbr + xcgdbr + xcgsbr); + + xcdgbr = Cdgr * omega; + xcsgbr = Csgr * omega; + xcbgb = here->BSIM4v6cbgb * omega; + } + else + { xcggbr = (Cggr + cgdo + cgso + pParam->BSIM4v6cgbo ) * omega; + xcgdbr = (Cgdr - cgdo) * omega; + xcgsbr = (Cgsr - cgso) * omega; + xcgbbr = -(xcggbr + xcgdbr + xcgsbr); + + xcdgbr = (Cdgr - cgdo) * omega; + xcsgbr = (Csgr - cgso) * omega; + xcbgb = (here->BSIM4v6cbgb - pParam->BSIM4v6cgbo) * omega; + + xcdgmb = xcsgmb = xcbgmb = 0.0; + } + xcddbr = (Cddr + here->BSIM4v6capbd + cgdo) * omega; + xcdsbr = Cdsr * omega; + xcsdbr = Csdr * omega; + xcssbr = (here->BSIM4v6capbs + cgso + Cssr) * omega; + + if (!here->BSIM4v6rbodyMod) + { xcdbbr = -(xcdgbr + xcddbr + xcdsbr + xcdgmb); + xcsbbr = -(xcsgbr + xcsdbr + xcssbr + xcsgmb); + + xcbdb = (here->BSIM4v6cbdb - here->BSIM4v6capbd) * omega; + xcbsb = (here->BSIM4v6cbsb - here->BSIM4v6capbs) * omega; + xcdbdb = 0.0; + } + else + { xcdbbr = Cdbr * omega; + xcsbbr = -(xcsgbr + xcsdbr + xcssbr + xcsgmb) + + here->BSIM4v6capbs * omega; + + xcbdb = here->BSIM4v6cbdb * omega; + xcbsb = here->BSIM4v6cbsb * omega; + + xcdbdb = -here->BSIM4v6capbd * omega; + xcsbsb = -here->BSIM4v6capbs * omega; + } + xcbbb = -(xcbdb + xcbgb + xcbsb + xcbgmb); + + xcdgbi = Cdgi; + xcsgbi = Csgi; + xcddbi = Cddi; + xcdsbi = Cdsi; + xcsdbi = Csdi; + xcssbi = Cssi; + xcdbbi = Cdbi; + xcsbbi = Csbi; + xcggbi = Cggi; + xcgdbi = Cgdi; + xcgsbi = Cgsi; + xcgbbi = Cgbi; + } + else /* Reverse mode */ + { Gmr = -gmr; + Gmbsr = -gmbsr; + FwdSumr = 0.0; + RevSumr = -(Gmr + Gmbsr); + Gmi = -gmi; + Gmbsi = -gmbsi; + FwdSumi = 0.0; + RevSumi = -(Gmi + Gmbsi); + + gbbsp = -(here->BSIM4v6gbds); + gbbdp = here->BSIM4v6gbds + here->BSIM4v6gbgs + here->BSIM4v6gbbs; + + gbdpg = 0.0; + gbdpsp = 0.0; + gbdpb = 0.0; + gbdpdp = 0.0; + + gbspg = here->BSIM4v6gbgs; + gbspsp = here->BSIM4v6gbds; + gbspb = here->BSIM4v6gbbs; + gbspdp = -(gbspg + gbspsp + gbspb); + + if (model->BSIM4v6igcMod) + { gIstotg = here->BSIM4v6gIgsg + here->BSIM4v6gIgcdg; + gIstotd = here->BSIM4v6gIgcds; + gIstots = here->BSIM4v6gIgss + here->BSIM4v6gIgcdd; + gIstotb = here->BSIM4v6gIgcdb; + + gIdtotg = here->BSIM4v6gIgdg + here->BSIM4v6gIgcsg; + gIdtotd = here->BSIM4v6gIgdd + here->BSIM4v6gIgcss; + gIdtots = here->BSIM4v6gIgcsd; + gIdtotb = here->BSIM4v6gIgcsb; + } + else + { gIstotg = gIstotd = gIstots = gIstotb = 0.0; + gIdtotg = gIdtotd = gIdtots = gIdtotb = 0.0; + } + + if (model->BSIM4v6igbMod) + { gIbtotg = here->BSIM4v6gIgbg; + gIbtotd = here->BSIM4v6gIgbs; + gIbtots = here->BSIM4v6gIgbd; + gIbtotb = here->BSIM4v6gIgbb; + } + else + gIbtotg = gIbtotd = gIbtots = gIbtotb = 0.0; + + if ((model->BSIM4v6igcMod != 0) || (model->BSIM4v6igbMod != 0)) + { gIgtotg = gIstotg + gIdtotg + gIbtotg; + gIgtotd = gIstotd + gIdtotd + gIbtotd ; + gIgtots = gIstots + gIdtots + gIbtots; + gIgtotb = gIstotb + gIdtotb + gIbtotb; + } + else + gIgtotg = gIgtotd = gIgtots = gIgtotb = 0.0; + + if (here->BSIM4v6rgateMod == 2) + T0 = *(ckt->CKTstates[0] + here->BSIM4v6vges) + - *(ckt->CKTstates[0] + here->BSIM4v6vgs); + else if (here->BSIM4v6rgateMod == 3) + T0 = *(ckt->CKTstates[0] + here->BSIM4v6vgms) + - *(ckt->CKTstates[0] + here->BSIM4v6vgs); + if (here->BSIM4v6rgateMod > 1) + { gcrgd = here->BSIM4v6gcrgs * T0; + gcrgg = here->BSIM4v6gcrgg * T0; + gcrgs = here->BSIM4v6gcrgd * T0; + gcrgb = here->BSIM4v6gcrgb * T0; + gcrgg -= here->BSIM4v6gcrg; + gcrg = here->BSIM4v6gcrg; + } + else + gcrg = gcrgd = gcrgg = gcrgs = gcrgb = 0.0; + + if (here->BSIM4v6rgateMod == 3) + { xcgmgmb = (cgdo + cgso + pParam->BSIM4v6cgbo) * omega; + xcgmdb = -cgdo * omega; + xcgmsb = -cgso * omega; + xcgmbb = -pParam->BSIM4v6cgbo * omega; + + xcdgmb = xcgmdb; + xcsgmb = xcgmsb; + xcbgmb = xcgmbb; + + xcggbr = Cggr * omega; + xcgdbr = Cgsr * omega; + xcgsbr = Cgdr * omega; + xcgbbr = -(xcggbr + xcgdbr + xcgsbr); + + xcdgbr = Csgr * omega; + xcsgbr = Cdgr * omega; + xcbgb = here->BSIM4v6cbgb * omega; + } + else + { xcggbr = (Cggr + cgdo + cgso + pParam->BSIM4v6cgbo ) * omega; + xcgdbr = (Cgsr - cgdo) * omega; + xcgsbr = (Cgdr - cgso) * omega; + xcgbbr = -(xcggbr + xcgdbr + xcgsbr); + + xcdgbr = (Csgr - cgdo) * omega; + xcsgbr = (Cdgr - cgso) * omega; + xcbgb = (here->BSIM4v6cbgb - pParam->BSIM4v6cgbo) * omega; + + xcdgmb = xcsgmb = xcbgmb = 0.0; + } + xcddbr = (here->BSIM4v6capbd + cgdo + Cssr) * omega; + xcdsbr = Csdr * omega; + xcsdbr = Cdsr * omega; + xcssbr = (Cddr + here->BSIM4v6capbs + cgso) * omega; + + if (!here->BSIM4v6rbodyMod) + { xcdbbr = -(xcdgbr + xcddbr + xcdsbr + xcdgmb); + xcsbbr = -(xcsgbr + xcsdbr + xcssbr + xcsgmb); + + xcbdb = (here->BSIM4v6cbsb - here->BSIM4v6capbd) * omega; + xcbsb = (here->BSIM4v6cbdb - here->BSIM4v6capbs) * omega; + xcdbdb = 0.0; + } + else + { xcdbbr = -(xcdgbr + xcddbr + xcdsbr + xcdgmb) + + here->BSIM4v6capbd * omega; + xcsbbr = Cdbr * omega; + + xcbdb = here->BSIM4v6cbsb * omega; + xcbsb = here->BSIM4v6cbdb * omega; + xcdbdb = -here->BSIM4v6capbd * omega; + xcsbsb = -here->BSIM4v6capbs * omega; + } + xcbbb = -(xcbgb + xcbdb + xcbsb + xcbgmb); + + xcdgbi = Csgi; + xcsgbi = Cdgi; + xcddbi = Cssi; + xcdsbi = Csdi; + xcsdbi = Cdsi; + xcssbi = Cddi; + xcdbbi = Csbi; + xcsbbi = Cdbi; + xcggbi = Cggi; + xcgdbi = Cgsi; + xcgsbi = Cgdi; + xcgbbi = Cgbi; + } + + if (model->BSIM4v6rdsMod == 1) + { gstot = here->BSIM4v6gstot; + gstotd = here->BSIM4v6gstotd; + gstotg = here->BSIM4v6gstotg; + gstots = here->BSIM4v6gstots - gstot; + gstotb = here->BSIM4v6gstotb; + + gdtot = here->BSIM4v6gdtot; + gdtotd = here->BSIM4v6gdtotd - gdtot; + gdtotg = here->BSIM4v6gdtotg; + gdtots = here->BSIM4v6gdtots; + gdtotb = here->BSIM4v6gdtotb; + } + else + { gstot = gstotd = gstotg = gstots = gstotb = 0.0; + gdtot = gdtotd = gdtotg = gdtots = gdtotb = 0.0; + } + + + /* + * Loading AC matrix + */ + m = here->BSIM4v6m; + + if (!model->BSIM4v6rdsMod) + { gdpr = here->BSIM4v6drainConductance; + gspr = here->BSIM4v6sourceConductance; + } + else + gdpr = gspr = 0.0; + + if (!here->BSIM4v6rbodyMod) + { gjbd = here->BSIM4v6gbd; + gjbs = here->BSIM4v6gbs; + } + else + gjbd = gjbs = 0.0; + + geltd = here->BSIM4v6grgeltd; + + if (here->BSIM4v6rgateMod == 1) + { *(here->BSIM4v6GEgePtr) += m * geltd; + *(here->BSIM4v6GPgePtr) -= m * geltd; + *(here->BSIM4v6GEgpPtr) -= m * geltd; + + *(here->BSIM4v6GPgpPtr +1) += m * xcggbr; + *(here->BSIM4v6GPgpPtr) += m * (geltd + xcggbi + gIgtotg); + *(here->BSIM4v6GPdpPtr +1) += m * xcgdbr; + *(here->BSIM4v6GPdpPtr) += m * (xcgdbi + gIgtotd); + *(here->BSIM4v6GPspPtr +1) += m * xcgsbr; + *(here->BSIM4v6GPspPtr) += m * (xcgsbi + gIgtots); + *(here->BSIM4v6GPbpPtr +1) += m * xcgbbr; + *(here->BSIM4v6GPbpPtr) += m * (xcgbbi + gIgtotb); + } /* WDLiu: gcrg already subtracted from all gcrgg below */ + else if (here->BSIM4v6rgateMod == 2) + { *(here->BSIM4v6GEgePtr) += m * gcrg; + *(here->BSIM4v6GEgpPtr) += m * gcrgg; + *(here->BSIM4v6GEdpPtr) += m * gcrgd; + *(here->BSIM4v6GEspPtr) += m * gcrgs; + *(here->BSIM4v6GEbpPtr) += m * gcrgb; + + *(here->BSIM4v6GPgePtr) -= m * gcrg; + *(here->BSIM4v6GPgpPtr +1) += m * xcggbr; + *(here->BSIM4v6GPgpPtr) -= m * (gcrgg - xcggbi - gIgtotg); + *(here->BSIM4v6GPdpPtr +1) += m * xcgdbr; + *(here->BSIM4v6GPdpPtr) -= m * (gcrgd - xcgdbi - gIgtotd); + *(here->BSIM4v6GPspPtr +1) += m * xcgsbr; + *(here->BSIM4v6GPspPtr) -= m * (gcrgs - xcgsbi - gIgtots); + *(here->BSIM4v6GPbpPtr +1) += m * xcgbbr; + *(here->BSIM4v6GPbpPtr) -= m * (gcrgb - xcgbbi - gIgtotb); + } + else if (here->BSIM4v6rgateMod == 3) + { *(here->BSIM4v6GEgePtr) += m * geltd; + *(here->BSIM4v6GEgmPtr) -= m * geltd; + *(here->BSIM4v6GMgePtr) -= m * geltd; + *(here->BSIM4v6GMgmPtr) += m * (geltd + gcrg); + *(here->BSIM4v6GMgmPtr +1) += m * xcgmgmb; + + *(here->BSIM4v6GMdpPtr) += m * gcrgd; + *(here->BSIM4v6GMdpPtr +1) += m * xcgmdb; + *(here->BSIM4v6GMgpPtr) += m * gcrgg; + *(here->BSIM4v6GMspPtr) += m * gcrgs; + *(here->BSIM4v6GMspPtr +1) += m * xcgmsb; + *(here->BSIM4v6GMbpPtr) += m * gcrgb; + *(here->BSIM4v6GMbpPtr +1) += m * xcgmbb; + + *(here->BSIM4v6DPgmPtr +1) += m * xcdgmb; + *(here->BSIM4v6GPgmPtr) -= m * gcrg; + *(here->BSIM4v6SPgmPtr +1) += m * xcsgmb; + *(here->BSIM4v6BPgmPtr +1) += m * xcbgmb; + + *(here->BSIM4v6GPgpPtr) -= m * (gcrgg - xcggbi - gIgtotg); + *(here->BSIM4v6GPgpPtr +1) += m * xcggbr; + *(here->BSIM4v6GPdpPtr) -= m * (gcrgd - xcgdbi - gIgtotd); + *(here->BSIM4v6GPdpPtr +1) += m * xcgdbr; + *(here->BSIM4v6GPspPtr) -= m * (gcrgs - xcgsbi - gIgtots); + *(here->BSIM4v6GPspPtr +1) += m * xcgsbr; + *(here->BSIM4v6GPbpPtr) -= m * (gcrgb - xcgbbi - gIgtotb); + *(here->BSIM4v6GPbpPtr +1) += m * xcgbbr; + } + else + { *(here->BSIM4v6GPgpPtr +1) += m * xcggbr; + *(here->BSIM4v6GPgpPtr) += m * (xcggbi + gIgtotg); + *(here->BSIM4v6GPdpPtr +1) += m * xcgdbr; + *(here->BSIM4v6GPdpPtr) += m * (xcgdbi + gIgtotd); + *(here->BSIM4v6GPspPtr +1) += m * xcgsbr; + *(here->BSIM4v6GPspPtr) += m * (xcgsbi + gIgtots); + *(here->BSIM4v6GPbpPtr +1) += m * xcgbbr; + *(here->BSIM4v6GPbpPtr) += m * (xcgbbi + gIgtotb); + } + + if (model->BSIM4v6rdsMod) + { (*(here->BSIM4v6DgpPtr) += m * gdtotg); + (*(here->BSIM4v6DspPtr) += m * gdtots); + (*(here->BSIM4v6DbpPtr) += m * gdtotb); + (*(here->BSIM4v6SdpPtr) += m * gstotd); + (*(here->BSIM4v6SgpPtr) += m * gstotg); + (*(here->BSIM4v6SbpPtr) += m * gstotb); + } + + *(here->BSIM4v6DPdpPtr +1) += m * (xcddbr + gdsi + RevSumi); + *(here->BSIM4v6DPdpPtr) += m * (gdpr + xcddbi + gdsr + here->BSIM4v6gbd + - gdtotd + RevSumr + gbdpdp - gIdtotd); + *(here->BSIM4v6DPdPtr) -= m * (gdpr + gdtot); + *(here->BSIM4v6DPgpPtr +1) += m * (xcdgbr + Gmi); + *(here->BSIM4v6DPgpPtr) += m * (Gmr + xcdgbi - gdtotg + gbdpg - gIdtotg); + *(here->BSIM4v6DPspPtr +1) += m * (xcdsbr - gdsi - FwdSumi); + *(here->BSIM4v6DPspPtr) -= m * (gdsr - xcdsbi + FwdSumr + gdtots - gbdpsp + gIdtots); + *(here->BSIM4v6DPbpPtr +1) += m * (xcdbbr + Gmbsi); + *(here->BSIM4v6DPbpPtr) -= m * (gjbd + gdtotb - xcdbbi - Gmbsr - gbdpb + gIdtotb); + + *(here->BSIM4v6DdpPtr) -= m * (gdpr - gdtotd); + *(here->BSIM4v6DdPtr) += m * (gdpr + gdtot); + + *(here->BSIM4v6SPdpPtr +1) += m * (xcsdbr - gdsi - RevSumi); + *(here->BSIM4v6SPdpPtr) -= m * (gdsr - xcsdbi + gstotd + RevSumr - gbspdp + gIstotd); + *(here->BSIM4v6SPgpPtr +1) += m * (xcsgbr - Gmi); + *(here->BSIM4v6SPgpPtr) -= m * (Gmr - xcsgbi + gstotg - gbspg + gIstotg); + *(here->BSIM4v6SPspPtr +1) += m * (xcssbr + gdsi + FwdSumi); + *(here->BSIM4v6SPspPtr) += m * (gspr + xcssbi + gdsr + here->BSIM4v6gbs + - gstots + FwdSumr + gbspsp - gIstots); + *(here->BSIM4v6SPsPtr) -= m * (gspr + gstot); + *(here->BSIM4v6SPbpPtr +1) += m * (xcsbbr - Gmbsi); + *(here->BSIM4v6SPbpPtr) -= m * (gjbs + gstotb - xcsbbi + Gmbsr - gbspb + gIstotb); + + *(here->BSIM4v6SspPtr) -= m * (gspr - gstots); + *(here->BSIM4v6SsPtr) += m * (gspr + gstot); + + *(here->BSIM4v6BPdpPtr +1) += m * xcbdb; + *(here->BSIM4v6BPdpPtr) -= m * (gjbd - gbbdp + gIbtotd); + *(here->BSIM4v6BPgpPtr +1) += m * xcbgb; + *(here->BSIM4v6BPgpPtr) -= m * (here->BSIM4v6gbgs + gIbtotg); + *(here->BSIM4v6BPspPtr +1) += m * xcbsb; + *(here->BSIM4v6BPspPtr) -= m * (gjbs - gbbsp + gIbtots); + *(here->BSIM4v6BPbpPtr +1) += m * xcbbb; + *(here->BSIM4v6BPbpPtr) += m * (gjbd + gjbs - here->BSIM4v6gbbs + - gIbtotb); + ggidld = here->BSIM4v6ggidld; + ggidlg = here->BSIM4v6ggidlg; + ggidlb = here->BSIM4v6ggidlb; + ggislg = here->BSIM4v6ggislg; + ggisls = here->BSIM4v6ggisls; + ggislb = here->BSIM4v6ggislb; + + /* stamp gidl */ + (*(here->BSIM4v6DPdpPtr) += m * ggidld); + (*(here->BSIM4v6DPgpPtr) += m * ggidlg); + (*(here->BSIM4v6DPspPtr) -= m * ((ggidlg + ggidld) + ggidlb)); + (*(here->BSIM4v6DPbpPtr) += m * ggidlb); + (*(here->BSIM4v6BPdpPtr) -= m * ggidld); + (*(here->BSIM4v6BPgpPtr) -= m * ggidlg); + (*(here->BSIM4v6BPspPtr) += m * ((ggidlg + ggidld) + ggidlb)); + (*(here->BSIM4v6BPbpPtr) -= m * ggidlb); + /* stamp gisl */ + (*(here->BSIM4v6SPdpPtr) -= m * ((ggisls + ggislg) + ggislb)); + (*(here->BSIM4v6SPgpPtr) += m * ggislg); + (*(here->BSIM4v6SPspPtr) += m * ggisls); + (*(here->BSIM4v6SPbpPtr) += m * ggislb); + (*(here->BSIM4v6BPdpPtr) += m * ((ggislg + ggisls) + ggislb)); + (*(here->BSIM4v6BPgpPtr) -= m * ggislg); + (*(here->BSIM4v6BPspPtr) -= m * ggisls); + (*(here->BSIM4v6BPbpPtr) -= m * ggislb); + + if (here->BSIM4v6rbodyMod) + { (*(here->BSIM4v6DPdbPtr +1) += m * xcdbdb); + (*(here->BSIM4v6DPdbPtr) -= m * here->BSIM4v6gbd); + (*(here->BSIM4v6SPsbPtr +1) += m * xcsbsb); + (*(here->BSIM4v6SPsbPtr) -= m * here->BSIM4v6gbs); + + (*(here->BSIM4v6DBdpPtr +1) += m * xcdbdb); + (*(here->BSIM4v6DBdpPtr) -= m * here->BSIM4v6gbd); + (*(here->BSIM4v6DBdbPtr +1) -= m * xcdbdb); + (*(here->BSIM4v6DBdbPtr) += m * (here->BSIM4v6gbd + here->BSIM4v6grbpd + + here->BSIM4v6grbdb)); + (*(here->BSIM4v6DBbpPtr) -= m * here->BSIM4v6grbpd); + (*(here->BSIM4v6DBbPtr) -= m * here->BSIM4v6grbdb); + + (*(here->BSIM4v6BPdbPtr) -= m * here->BSIM4v6grbpd); + (*(here->BSIM4v6BPbPtr) -= m * here->BSIM4v6grbpb); + (*(here->BSIM4v6BPsbPtr) -= m * here->BSIM4v6grbps); + (*(here->BSIM4v6BPbpPtr) += m * (here->BSIM4v6grbpd + here->BSIM4v6grbps + + here->BSIM4v6grbpb)); + /* WDLiu: (-here->BSIM4v6gbbs) already added to BPbpPtr */ + + (*(here->BSIM4v6SBspPtr +1) += m * xcsbsb); + (*(here->BSIM4v6SBspPtr) -= m * here->BSIM4v6gbs); + (*(here->BSIM4v6SBbpPtr) -= m * here->BSIM4v6grbps); + (*(here->BSIM4v6SBbPtr) -= m * here->BSIM4v6grbsb); + (*(here->BSIM4v6SBsbPtr +1) -= m * xcsbsb); + (*(here->BSIM4v6SBsbPtr) += m * (here->BSIM4v6gbs + + here->BSIM4v6grbps + here->BSIM4v6grbsb)); + + (*(here->BSIM4v6BdbPtr) -= m * here->BSIM4v6grbdb); + (*(here->BSIM4v6BbpPtr) -= m * here->BSIM4v6grbpb); + (*(here->BSIM4v6BsbPtr) -= m * here->BSIM4v6grbsb); + (*(here->BSIM4v6BbPtr) += m * (here->BSIM4v6grbsb + here->BSIM4v6grbdb + + here->BSIM4v6grbpb)); + } + + + /* + * WDLiu: The internal charge node generated for transient NQS is not needed for + * AC NQS. The following is not doing a real job, but we have to keep it; + * otherwise a singular AC NQS matrix may occur if the transient NQS is on. + * The charge node is isolated from the instance. + */ + if (here->BSIM4v6trnqsMod) + { (*(here->BSIM4v6QqPtr) += m * 1.0); + (*(here->BSIM4v6QgpPtr) += 0.0); + (*(here->BSIM4v6QdpPtr) += 0.0); + (*(here->BSIM4v6QspPtr) += 0.0); + (*(here->BSIM4v6QbpPtr) += 0.0); + + (*(here->BSIM4v6DPqPtr) += 0.0); + (*(here->BSIM4v6SPqPtr) += 0.0); + (*(here->BSIM4v6GPqPtr) += 0.0); + } + } + } + return(OK); +} diff --git a/src/spicelib/devices/bsim4v6/b4v6ask.c b/src/spicelib/devices/bsim4v6/b4v6ask.c new file mode 100644 index 000000000..6fd2e79cf --- /dev/null +++ b/src/spicelib/devices/bsim4v6/b4v6ask.c @@ -0,0 +1,404 @@ +/**** BSIM4.6.2 Released by Wenwei Yang 07/31/2008 ****/ + +/********** + * Copyright 2006 Regents of the University of California. All rights reserved. + * File: b4ask.c of BSIM4.6.2. + * Author: 2000 Weidong Liu + * Authors: 2001- Xuemei Xi, Mohan Dunga, Ali Niknejad, Chenming Hu. + * Authors: 2006- Mohan Dunga, Ali Niknejad, Chenming Hu + * Authors: 2007- Mohan Dunga, Wenwei Yang, 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" +#include "ifsim.h" +#include "cktdefs.h" +#include "devdefs.h" +#include "bsim4v6def.h" +#include "sperror.h" +#include "suffix.h" + +int +BSIM4v6ask( +CKTcircuit *ckt, +GENinstance *inst, +int which, +IFvalue *value, +IFvalue *select) +{ +BSIM4v6instance *here = (BSIM4v6instance*)inst; + + NG_IGNORE(select); + + switch(which) + { case BSIM4v6_L: + value->rValue = here->BSIM4v6l; + return(OK); + case BSIM4v6_W: + value->rValue = here->BSIM4v6w; + return(OK); + case BSIM4v6_M: + value->rValue = here->BSIM4v6m; + return(OK); + case BSIM4v6_NF: + value->rValue = here->BSIM4v6nf; + return(OK); + case BSIM4v6_MIN: + value->iValue = here->BSIM4v6min; + return(OK); + case BSIM4v6_AS: + value->rValue = here->BSIM4v6sourceArea; + return(OK); + case BSIM4v6_AD: + value->rValue = here->BSIM4v6drainArea; + return(OK); + case BSIM4v6_PS: + value->rValue = here->BSIM4v6sourcePerimeter; + return(OK); + case BSIM4v6_PD: + value->rValue = here->BSIM4v6drainPerimeter; + return(OK); + case BSIM4v6_NRS: + value->rValue = here->BSIM4v6sourceSquares; + return(OK); + case BSIM4v6_NRD: + value->rValue = here->BSIM4v6drainSquares; + return(OK); + case BSIM4v6_OFF: + value->rValue = here->BSIM4v6off; + return(OK); + case BSIM4v6_SA: + value->rValue = here->BSIM4v6sa ; + return(OK); + case BSIM4v6_SB: + value->rValue = here->BSIM4v6sb ; + return(OK); + case BSIM4v6_SD: + value->rValue = here->BSIM4v6sd ; + return(OK); + case BSIM4v6_SCA: + value->rValue = here->BSIM4v6sca ; + return(OK); + case BSIM4v6_SCB: + value->rValue = here->BSIM4v6scb ; + return(OK); + case BSIM4v6_SCC: + value->rValue = here->BSIM4v6scc ; + return(OK); + case BSIM4v6_SC: + value->rValue = here->BSIM4v6sc ; + return(OK); + + case BSIM4v6_RBSB: + value->rValue = here->BSIM4v6rbsb; + return(OK); + case BSIM4v6_RBDB: + value->rValue = here->BSIM4v6rbdb; + return(OK); + case BSIM4v6_RBPB: + value->rValue = here->BSIM4v6rbpb; + return(OK); + case BSIM4v6_RBPS: + value->rValue = here->BSIM4v6rbps; + return(OK); + case BSIM4v6_RBPD: + value->rValue = here->BSIM4v6rbpd; + return(OK); + case BSIM4v6_DELVTO: + value->rValue = here->BSIM4v6delvto; + return(OK); + case BSIM4v6_XGW: + value->rValue = here->BSIM4v6xgw; + return(OK); + case BSIM4v6_NGCON: + value->rValue = here->BSIM4v6ngcon; + return(OK); + case BSIM4v6_TRNQSMOD: + value->iValue = here->BSIM4v6trnqsMod; + return(OK); + case BSIM4v6_ACNQSMOD: + value->iValue = here->BSIM4v6acnqsMod; + return(OK); + case BSIM4v6_RBODYMOD: + value->iValue = here->BSIM4v6rbodyMod; + return(OK); + case BSIM4v6_RGATEMOD: + value->iValue = here->BSIM4v6rgateMod; + return(OK); + case BSIM4v6_GEOMOD: + value->iValue = here->BSIM4v6geoMod; + return(OK); + case BSIM4v6_RGEOMOD: + value->iValue = here->BSIM4v6rgeoMod; + return(OK); + case BSIM4v6_IC_VDS: + value->rValue = here->BSIM4v6icVDS; + return(OK); + case BSIM4v6_IC_VGS: + value->rValue = here->BSIM4v6icVGS; + return(OK); + case BSIM4v6_IC_VBS: + value->rValue = here->BSIM4v6icVBS; + return(OK); + case BSIM4v6_DNODE: + value->iValue = here->BSIM4v6dNode; + return(OK); + case BSIM4v6_GNODEEXT: + value->iValue = here->BSIM4v6gNodeExt; + return(OK); + case BSIM4v6_SNODE: + value->iValue = here->BSIM4v6sNode; + return(OK); + case BSIM4v6_BNODE: + value->iValue = here->BSIM4v6bNode; + return(OK); + case BSIM4v6_DNODEPRIME: + value->iValue = here->BSIM4v6dNodePrime; + return(OK); + case BSIM4v6_GNODEPRIME: + value->iValue = here->BSIM4v6gNodePrime; + return(OK); + case BSIM4v6_GNODEMID: + value->iValue = here->BSIM4v6gNodeMid; + return(OK); + case BSIM4v6_SNODEPRIME: + value->iValue = here->BSIM4v6sNodePrime; + return(OK); + case BSIM4v6_DBNODE: + value->iValue = here->BSIM4v6dbNode; + return(OK); + case BSIM4v6_BNODEPRIME: + value->iValue = here->BSIM4v6bNodePrime; + return(OK); + case BSIM4v6_SBNODE: + value->iValue = here->BSIM4v6sbNode; + return(OK); + case BSIM4v6_SOURCECONDUCT: + value->rValue = here->BSIM4v6sourceConductance; + value->rValue *= here->BSIM4v6m; + return(OK); + case BSIM4v6_DRAINCONDUCT: + value->rValue = here->BSIM4v6drainConductance; + value->rValue *= here->BSIM4v6m; + return(OK); + case BSIM4v6_VBD: + value->rValue = *(ckt->CKTstate0 + here->BSIM4v6vbd); + return(OK); + case BSIM4v6_VBS: + value->rValue = *(ckt->CKTstate0 + here->BSIM4v6vbs); + return(OK); + case BSIM4v6_VGS: + value->rValue = *(ckt->CKTstate0 + here->BSIM4v6vgs); + return(OK); + case BSIM4v6_VDS: + value->rValue = *(ckt->CKTstate0 + here->BSIM4v6vds); + return(OK); + case BSIM4v6_CD: + value->rValue = here->BSIM4v6cd; + value->rValue *= here->BSIM4v6m; + return(OK); + case BSIM4v6_CBS: + value->rValue = here->BSIM4v6cbs; + value->rValue *= here->BSIM4v6m; + return(OK); + case BSIM4v6_CBD: + value->rValue = here->BSIM4v6cbd; + value->rValue *= here->BSIM4v6m; + return(OK); + case BSIM4v6_CSUB: + value->rValue = here->BSIM4v6csub; + value->rValue *= here->BSIM4v6m; + return(OK); + case BSIM4v6_QINV: + value->rValue = here-> BSIM4v6qinv; + value->rValue *= here->BSIM4v6m; + return(OK); + case BSIM4v6_IGIDL: + value->rValue = here->BSIM4v6Igidl; + value->rValue *= here->BSIM4v6m; + return(OK); + case BSIM4v6_IGISL: + value->rValue = here->BSIM4v6Igisl; + value->rValue *= here->BSIM4v6m; + return(OK); + case BSIM4v6_IGS: + value->rValue = here->BSIM4v6Igs; + value->rValue *= here->BSIM4v6m; + return(OK); + case BSIM4v6_IGD: + value->rValue = here->BSIM4v6Igd; + value->rValue *= here->BSIM4v6m; + return(OK); + case BSIM4v6_IGB: + value->rValue = here->BSIM4v6Igb; + value->rValue *= here->BSIM4v6m; + return(OK); + case BSIM4v6_IGCS: + value->rValue = here->BSIM4v6Igcs; + value->rValue *= here->BSIM4v6m; + return(OK); + case BSIM4v6_IGCD: + value->rValue = here->BSIM4v6Igcd; + value->rValue *= here->BSIM4v6m; + return(OK); + case BSIM4v6_GM: + value->rValue = here->BSIM4v6gm; + value->rValue *= here->BSIM4v6m; + return(OK); + case BSIM4v6_GDS: + value->rValue = here->BSIM4v6gds; + value->rValue *= here->BSIM4v6m; + return(OK); + case BSIM4v6_GMBS: + value->rValue = here->BSIM4v6gmbs; + value->rValue *= here->BSIM4v6m; + return(OK); + case BSIM4v6_GBD: + value->rValue = here->BSIM4v6gbd; + value->rValue *= here->BSIM4v6m; + return(OK); + case BSIM4v6_GBS: + value->rValue = here->BSIM4v6gbs; + value->rValue *= here->BSIM4v6m; + return(OK); +/* case BSIM4v6_QB: + value->rValue = *(ckt->CKTstate0 + here->BSIM4v6qb); + return(OK); */ + case BSIM4v6_CQB: + value->rValue = *(ckt->CKTstate0 + here->BSIM4v6cqb); + return(OK); +/* case BSIM4v6_QG: + value->rValue = *(ckt->CKTstate0 + here->BSIM4v6qg); + return(OK); */ + case BSIM4v6_CQG: + value->rValue = *(ckt->CKTstate0 + here->BSIM4v6cqg); + return(OK); +/* case BSIM4v6_QD: + value->rValue = *(ckt->CKTstate0 + here->BSIM4v6qd); + return(OK); */ + case BSIM4v6_CQD: + value->rValue = *(ckt->CKTstate0 + here->BSIM4v6cqd); + return(OK); +/* case BSIM4v6_QS: + value->rValue = *(ckt->CKTstate0 + here->BSIM4v6qs); + return(OK); */ + case BSIM4v6_QB: + value->rValue = here->BSIM4v6qbulk; + value->rValue *= here->BSIM4v6m; + return(OK); + case BSIM4v6_QG: + value->rValue = here->BSIM4v6qgate; + value->rValue *= here->BSIM4v6m; + return(OK); + case BSIM4v6_QS: + value->rValue = here->BSIM4v6qsrc; + value->rValue *= here->BSIM4v6m; + return(OK); + case BSIM4v6_QD: + value->rValue = here->BSIM4v6qdrn; + value->rValue *= here->BSIM4v6m; + return(OK); + case BSIM4v6_QDEF: + value->rValue = *(ckt->CKTstate0 + here->BSIM4v6qdef); + return(OK); + case BSIM4v6_GCRG: + value->rValue = here->BSIM4v6gcrg; + value->rValue *= here->BSIM4v6m; + return(OK); + case BSIM4v6_GTAU: + value->rValue = here->BSIM4v6gtau; + return(OK); + case BSIM4v6_CGGB: + value->rValue = here->BSIM4v6cggb; + value->rValue *= here->BSIM4v6m; + return(OK); + case BSIM4v6_CGDB: + value->rValue = here->BSIM4v6cgdb; + value->rValue *= here->BSIM4v6m; + return(OK); + case BSIM4v6_CGSB: + value->rValue = here->BSIM4v6cgsb; + value->rValue *= here->BSIM4v6m; + return(OK); + case BSIM4v6_CDGB: + value->rValue = here->BSIM4v6cdgb; + value->rValue *= here->BSIM4v6m; + return(OK); + case BSIM4v6_CDDB: + value->rValue = here->BSIM4v6cddb; + value->rValue *= here->BSIM4v6m; + return(OK); + case BSIM4v6_CDSB: + value->rValue = here->BSIM4v6cdsb; + value->rValue *= here->BSIM4v6m; + return(OK); + case BSIM4v6_CBGB: + value->rValue = here->BSIM4v6cbgb; + value->rValue *= here->BSIM4v6m; + return(OK); + case BSIM4v6_CBDB: + value->rValue = here->BSIM4v6cbdb; + value->rValue *= here->BSIM4v6m; + return(OK); + case BSIM4v6_CBSB: + value->rValue = here->BSIM4v6cbsb; + value->rValue *= here->BSIM4v6m; + return(OK); + case BSIM4v6_CSGB: + value->rValue = here->BSIM4v6csgb; + value->rValue *= here->BSIM4v6m; + return(OK); + case BSIM4v6_CSDB: + value->rValue = here->BSIM4v6csdb; + value->rValue *= here->BSIM4v6m; + return(OK); + case BSIM4v6_CSSB: + value->rValue = here->BSIM4v6cssb; + value->rValue *= here->BSIM4v6m; + return(OK); + case BSIM4v6_CGBB: + value->rValue = here->BSIM4v6cgbb; + value->rValue *= here->BSIM4v6m; + return(OK); + case BSIM4v6_CDBB: + value->rValue = here->BSIM4v6cdbb; + value->rValue *= here->BSIM4v6m; + return(OK); + case BSIM4v6_CSBB: + value->rValue = here->BSIM4v6csbb; + value->rValue *= here->BSIM4v6m; + return(OK); + case BSIM4v6_CBBB: + value->rValue = here->BSIM4v6cbbb; + value->rValue *= here->BSIM4v6m; + return(OK); + case BSIM4v6_CAPBD: + value->rValue = here->BSIM4v6capbd; + value->rValue *= here->BSIM4v6m; + return(OK); + case BSIM4v6_CAPBS: + value->rValue = here->BSIM4v6capbs; + value->rValue *= here->BSIM4v6m; + return(OK); + case BSIM4v6_VON: + value->rValue = here->BSIM4v6von; + return(OK); + case BSIM4v6_VDSAT: + value->rValue = here->BSIM4v6vdsat; + return(OK); + case BSIM4v6_QBS: + value->rValue = *(ckt->CKTstate0 + here->BSIM4v6qbs); + return(OK); + case BSIM4v6_QBD: + value->rValue = *(ckt->CKTstate0 + here->BSIM4v6qbd); + return(OK); + default: + return(E_BADPARM); + } + /* NOTREACHED */ +} + diff --git a/src/spicelib/devices/bsim4v6/b4v6check.c b/src/spicelib/devices/bsim4v6/b4v6check.c new file mode 100644 index 000000000..8bdb9369a --- /dev/null +++ b/src/spicelib/devices/bsim4v6/b4v6check.c @@ -0,0 +1,876 @@ +/**** BSIM4.6.2 Released by Wenwei Yang 07/31/2008 ****/ +/**** BSIM4.6.5 Update ngspice 09/22/2009 ****/ +/********** + * Copyright 2006 Regents of the University of California. All rights reserved. + * File: b4check.c of BSIM4.6.1. + * Author: 2000 Weidong Liu + * Authors: 2001- Xuemei Xi, Mohan Dunga, Ali Niknejad, Chenming Hu. + * Authors: 2006- Mohan Dunga, Ali Niknejad, Chenming Hu + * Authors: 2007- Mohan Dunga, Wenwei Yang, 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. + * Modified by Mohan Dunga, 12/13/2006 + * Modified by Mohan Dunga, Wenwei Yang, 05/18/2007. + * Modified by Wenwei Yang, 07/31/2008 . + **********/ + +#include "ngspice.h" +#include "cktdefs.h" +#include "bsim4v6def.h" +#include "trandefs.h" +#include "const.h" +#include "sperror.h" +#include "devdefs.h" +#include "suffix.h" + +int +BSIM4v6checkModel( +BSIM4v6model *model, +BSIM4v6instance *here, +CKTcircuit *ckt) +{ +struct bsim4v6SizeDependParam *pParam; +int Fatal_Flag = 0; +FILE *fplog; + + if ((fplog = fopen("bsim4v6.out", "w")) != NULL) + { pParam = here->pParam; + fprintf(fplog, "BSIM4v6: Berkeley Short Channel IGFET Model-4\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, "++++++++++ BSIM4v6 PARAMETER CHECKING BELOW ++++++++++\n"); + + if (strcmp(model->BSIM4v6version, "4.6.5") != 0) + { fprintf(fplog, "Warning: This model is BSIM4.6.5; you specified a wrong version number.\n"); + printf("Warning: This model is BSIM4.6.5; you specified a wrong version number.\n"); + } + fprintf(fplog, "Model = %s\n", model->BSIM4v6modName); + + + if ((here->BSIM4v6rgateMod == 2) || (here->BSIM4v6rgateMod == 3)) + { if ((here->BSIM4v6trnqsMod == 1) || (here->BSIM4v6acnqsMod == 1)) + { fprintf(fplog, "Warning: You've selected both Rg and charge deficit NQS; select one only.\n"); + printf("Warning: You've selected both Rg and charge deficit NQS; select one only.\n"); + } + } + + if (model->BSIM4v6toxe <= 0.0) + { fprintf(fplog, "Fatal: Toxe = %g is not positive.\n", + model->BSIM4v6toxe); + printf("Fatal: Toxe = %g is not positive.\n", model->BSIM4v6toxe); + Fatal_Flag = 1; + } + if (model->BSIM4v6toxp <= 0.0) + { fprintf(fplog, "Fatal: Toxp = %g is not positive.\n", + model->BSIM4v6toxp); + printf("Fatal: Toxp = %g is not positive.\n", model->BSIM4v6toxp); + Fatal_Flag = 1; + } + if (model->BSIM4v6eot <= 0.0) + { fprintf(fplog, "Fatal: EOT = %g is not positive.\n", + model->BSIM4v6eot); + printf("Fatal: EOT = %g is not positive.\n", model->BSIM4v6eot); + Fatal_Flag = 1; + } + if (model->BSIM4v6epsrgate < 0.0) + { fprintf(fplog, "Fatal: Epsrgate = %g is not positive.\n", + model->BSIM4v6epsrgate); + printf("Fatal: Epsrgate = %g is not positive.\n", model->BSIM4v6epsrgate); + Fatal_Flag = 1; + } + if (model->BSIM4v6epsrsub < 0.0) + { fprintf(fplog, "Fatal: Epsrsub = %g is not positive.\n", + model->BSIM4v6epsrsub); + printf("Fatal: Epsrsub = %g is not positive.\n", model->BSIM4v6epsrsub); + Fatal_Flag = 1; + } + if (model->BSIM4v6easub < 0.0) + { fprintf(fplog, "Fatal: Easub = %g is not positive.\n", + model->BSIM4v6easub); + printf("Fatal: Easub = %g is not positive.\n", model->BSIM4v6easub); + Fatal_Flag = 1; + } + if (model->BSIM4v6ni0sub <= 0.0) + { fprintf(fplog, "Fatal: Ni0sub = %g is not positive.\n", + model->BSIM4v6ni0sub); + printf("Fatal: Easub = %g is not positive.\n", model->BSIM4v6ni0sub); + Fatal_Flag = 1; + } + + if (model->BSIM4v6toxm <= 0.0) + { fprintf(fplog, "Fatal: Toxm = %g is not positive.\n", + model->BSIM4v6toxm); + printf("Fatal: Toxm = %g is not positive.\n", model->BSIM4v6toxm); + Fatal_Flag = 1; + } + + if (model->BSIM4v6toxref <= 0.0) + { fprintf(fplog, "Fatal: Toxref = %g is not positive.\n", + model->BSIM4v6toxref); + printf("Fatal: Toxref = %g is not positive.\n", model->BSIM4v6toxref); + Fatal_Flag = 1; + } + + if (pParam->BSIM4v6lpe0 < -pParam->BSIM4v6leff) + { fprintf(fplog, "Fatal: Lpe0 = %g is less than -Leff.\n", + pParam->BSIM4v6lpe0); + printf("Fatal: Lpe0 = %g is less than -Leff.\n", + pParam->BSIM4v6lpe0); + Fatal_Flag = 1; + } + if (model->BSIM4v6lintnoi > pParam->BSIM4v6leff/2) + { fprintf(fplog, "Fatal: Lintnoi = %g is too large - Leff for noise is negative.\n", + model->BSIM4v6lintnoi); + printf("Fatal: Lintnoi = %g is too large - Leff for noise is negative.\n", + model->BSIM4v6lintnoi); + Fatal_Flag = 1; + } + if (pParam->BSIM4v6lpeb < -pParam->BSIM4v6leff) + { fprintf(fplog, "Fatal: Lpeb = %g is less than -Leff.\n", + pParam->BSIM4v6lpeb); + printf("Fatal: Lpeb = %g is less than -Leff.\n", + pParam->BSIM4v6lpeb); + Fatal_Flag = 1; + } + if (pParam->BSIM4v6ndep <= 0.0) + { fprintf(fplog, "Fatal: Ndep = %g is not positive.\n", + pParam->BSIM4v6ndep); + printf("Fatal: Ndep = %g is not positive.\n", + pParam->BSIM4v6ndep); + Fatal_Flag = 1; + } + if (pParam->BSIM4v6phi <= 0.0) + { fprintf(fplog, "Fatal: Phi = %g is not positive. Please check Phin and Ndep\n", + pParam->BSIM4v6phi); + fprintf(fplog, " Phin = %g Ndep = %g \n", + pParam->BSIM4v6phin, pParam->BSIM4v6ndep); + printf("Fatal: Phi = %g is not positive. Please check Phin and Ndep\n", + pParam->BSIM4v6phi); + printf(" Phin = %g Ndep = %g \n", + pParam->BSIM4v6phin, pParam->BSIM4v6ndep); + Fatal_Flag = 1; + } + if (pParam->BSIM4v6nsub <= 0.0) + { fprintf(fplog, "Fatal: Nsub = %g is not positive.\n", + pParam->BSIM4v6nsub); + printf("Fatal: Nsub = %g is not positive.\n", + pParam->BSIM4v6nsub); + Fatal_Flag = 1; + } + if (pParam->BSIM4v6ngate < 0.0) + { fprintf(fplog, "Fatal: Ngate = %g is not positive.\n", + pParam->BSIM4v6ngate); + printf("Fatal: Ngate = %g Ngate is not positive.\n", + pParam->BSIM4v6ngate); + Fatal_Flag = 1; + } + if (pParam->BSIM4v6ngate > 1.e25) + { fprintf(fplog, "Fatal: Ngate = %g is too high.\n", + pParam->BSIM4v6ngate); + printf("Fatal: Ngate = %g Ngate is too high\n", + pParam->BSIM4v6ngate); + Fatal_Flag = 1; + } + if (pParam->BSIM4v6xj <= 0.0) + { fprintf(fplog, "Fatal: Xj = %g is not positive.\n", + pParam->BSIM4v6xj); + printf("Fatal: Xj = %g is not positive.\n", pParam->BSIM4v6xj); + Fatal_Flag = 1; + } + + if (pParam->BSIM4v6dvt1 < 0.0) + { fprintf(fplog, "Fatal: Dvt1 = %g is negative.\n", + pParam->BSIM4v6dvt1); + printf("Fatal: Dvt1 = %g is negative.\n", pParam->BSIM4v6dvt1); + Fatal_Flag = 1; + } + + if (pParam->BSIM4v6dvt1w < 0.0) + { fprintf(fplog, "Fatal: Dvt1w = %g is negative.\n", + pParam->BSIM4v6dvt1w); + printf("Fatal: Dvt1w = %g is negative.\n", pParam->BSIM4v6dvt1w); + Fatal_Flag = 1; + } + + if (pParam->BSIM4v6w0 == -pParam->BSIM4v6weff) + { fprintf(fplog, "Fatal: (W0 + Weff) = 0 causing divided-by-zero.\n"); + printf("Fatal: (W0 + Weff) = 0 causing divided-by-zero.\n"); + Fatal_Flag = 1; + } + + if (pParam->BSIM4v6dsub < 0.0) + { fprintf(fplog, "Fatal: Dsub = %g is negative.\n", pParam->BSIM4v6dsub); + printf("Fatal: Dsub = %g is negative.\n", pParam->BSIM4v6dsub); + Fatal_Flag = 1; + } + if (pParam->BSIM4v6b1 == -pParam->BSIM4v6weff) + { fprintf(fplog, "Fatal: (B1 + Weff) = 0 causing divided-by-zero.\n"); + printf("Fatal: (B1 + Weff) = 0 causing divided-by-zero.\n"); + Fatal_Flag = 1; + } + if (here->BSIM4v6u0temp <= 0.0) + { fprintf(fplog, "Fatal: u0 at current temperature = %g is not positive.\n", here->BSIM4v6u0temp); + printf("Fatal: u0 at current temperature = %g is not positive.\n", + here->BSIM4v6u0temp); + Fatal_Flag = 1; + } + + if (pParam->BSIM4v6delta < 0.0) + { fprintf(fplog, "Fatal: Delta = %g is less than zero.\n", + pParam->BSIM4v6delta); + printf("Fatal: Delta = %g is less than zero.\n", pParam->BSIM4v6delta); + Fatal_Flag = 1; + } + + if (here->BSIM4v6vsattemp <= 0.0) + { fprintf(fplog, "Fatal: Vsat at current temperature = %g is not positive.\n", here->BSIM4v6vsattemp); + printf("Fatal: Vsat at current temperature = %g is not positive.\n", + here->BSIM4v6vsattemp); + Fatal_Flag = 1; + } + + if (pParam->BSIM4v6pclm <= 0.0) + { fprintf(fplog, "Fatal: Pclm = %g is not positive.\n", pParam->BSIM4v6pclm); + printf("Fatal: Pclm = %g is not positive.\n", pParam->BSIM4v6pclm); + Fatal_Flag = 1; + } + + if (pParam->BSIM4v6drout < 0.0) + { fprintf(fplog, "Fatal: Drout = %g is negative.\n", pParam->BSIM4v6drout); + printf("Fatal: Drout = %g is negative.\n", pParam->BSIM4v6drout); + Fatal_Flag = 1; + } + + if (here->BSIM4v6m < 1.0) + { fprintf(fplog, "Fatal: Number of multiplier = %g is smaller than one.\n", here->BSIM4v6m); + printf("Fatal: Number of multiplier = %g is smaller than one.\n", here->BSIM4v6m); + Fatal_Flag = 1; + } + + if (here->BSIM4v6nf < 1.0) + { fprintf(fplog, "Fatal: Number of finger = %g is smaller than one.\n", here->BSIM4v6nf); + printf("Fatal: Number of finger = %g is smaller than one.\n", here->BSIM4v6nf); + Fatal_Flag = 1; + } + + if((here->BSIM4v6sa > 0.0) && (here->BSIM4v6sb > 0.0) && + ((here->BSIM4v6nf == 1.0) || ((here->BSIM4v6nf > 1.0) && (here->BSIM4v6sd > 0.0))) ) + { if (model->BSIM4v6saref <= 0.0) + { fprintf(fplog, "Fatal: SAref = %g is not positive.\n",model->BSIM4v6saref); + printf("Fatal: SAref = %g is not positive.\n",model->BSIM4v6saref); + Fatal_Flag = 1; + } + if (model->BSIM4v6sbref <= 0.0) + { fprintf(fplog, "Fatal: SBref = %g is not positive.\n",model->BSIM4v6sbref); + printf("Fatal: SBref = %g is not positive.\n",model->BSIM4v6sbref); + Fatal_Flag = 1; + } + } + + if ((here->BSIM4v6l + model->BSIM4v6xl) <= model->BSIM4v6xgl) + { fprintf(fplog, "Fatal: The parameter xgl must be smaller than Ldrawn+XL.\n"); + printf("Fatal: The parameter xgl must be smaller than Ldrawn+XL.\n"); + Fatal_Flag = 1; + } + if (here->BSIM4v6ngcon < 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 ((here->BSIM4v6ngcon != 1.0) && (here->BSIM4v6ngcon != 2.0)) + { here->BSIM4v6ngcon = 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"); + } + + if (model->BSIM4v6gbmin < 1.0e-20) + { fprintf(fplog, "Warning: Gbmin = %g is too small.\n", + model->BSIM4v6gbmin); + printf("Warning: Gbmin = %g is too small.\n", model->BSIM4v6gbmin); + } + + /* Check saturation parameters */ + if (pParam->BSIM4v6fprout < 0.0) + { fprintf(fplog, "Fatal: fprout = %g is negative.\n", + pParam->BSIM4v6fprout); + printf("Fatal: fprout = %g is negative.\n", pParam->BSIM4v6fprout); + Fatal_Flag = 1; + } + if (pParam->BSIM4v6pdits < 0.0) + { fprintf(fplog, "Fatal: pdits = %g is negative.\n", + pParam->BSIM4v6pdits); + printf("Fatal: pdits = %g is negative.\n", pParam->BSIM4v6pdits); + Fatal_Flag = 1; + } + if (model->BSIM4v6pditsl < 0.0) + { fprintf(fplog, "Fatal: pditsl = %g is negative.\n", + model->BSIM4v6pditsl); + printf("Fatal: pditsl = %g is negative.\n", model->BSIM4v6pditsl); + Fatal_Flag = 1; + } + + /* Check gate current parameters */ + if (model->BSIM4v6igbMod) { + if (pParam->BSIM4v6nigbinv <= 0.0) + { fprintf(fplog, "Fatal: nigbinv = %g is non-positive.\n", + pParam->BSIM4v6nigbinv); + printf("Fatal: nigbinv = %g is non-positive.\n", pParam->BSIM4v6nigbinv); + Fatal_Flag = 1; + } + if (pParam->BSIM4v6nigbacc <= 0.0) + { fprintf(fplog, "Fatal: nigbacc = %g is non-positive.\n", + pParam->BSIM4v6nigbacc); + printf("Fatal: nigbacc = %g is non-positive.\n", pParam->BSIM4v6nigbacc); + Fatal_Flag = 1; + } + } + if (model->BSIM4v6igcMod) { + if (pParam->BSIM4v6nigc <= 0.0) + { fprintf(fplog, "Fatal: nigc = %g is non-positive.\n", + pParam->BSIM4v6nigc); + printf("Fatal: nigc = %g is non-positive.\n", pParam->BSIM4v6nigc); + Fatal_Flag = 1; + } + if (pParam->BSIM4v6poxedge <= 0.0) + { fprintf(fplog, "Fatal: poxedge = %g is non-positive.\n", + pParam->BSIM4v6poxedge); + printf("Fatal: poxedge = %g is non-positive.\n", pParam->BSIM4v6poxedge); + Fatal_Flag = 1; + } + if (pParam->BSIM4v6pigcd <= 0.0) + { fprintf(fplog, "Fatal: pigcd = %g is non-positive.\n", + pParam->BSIM4v6pigcd); + printf("Fatal: pigcd = %g is non-positive.\n", pParam->BSIM4v6pigcd); + Fatal_Flag = 1; + } + } + + /* Check capacitance parameters */ + if (pParam->BSIM4v6clc < 0.0) + { fprintf(fplog, "Fatal: Clc = %g is negative.\n", pParam->BSIM4v6clc); + printf("Fatal: Clc = %g is negative.\n", pParam->BSIM4v6clc); + Fatal_Flag = 1; + } + + /* Check overlap capacitance parameters */ + if (pParam->BSIM4v6ckappas < 0.02) + { fprintf(fplog, "Warning: ckappas = %g is too small. Set to 0.02\n", + pParam->BSIM4v6ckappas); + printf("Warning: ckappas = %g is too small.\n", pParam->BSIM4v6ckappas); + pParam->BSIM4v6ckappas = 0.02; + } + if (pParam->BSIM4v6ckappad < 0.02) + { fprintf(fplog, "Warning: ckappad = %g is too small. Set to 0.02\n", + pParam->BSIM4v6ckappad); + printf("Warning: ckappad = %g is too small.\n", pParam->BSIM4v6ckappad); + pParam->BSIM4v6ckappad = 0.02; + } + + if (model->BSIM4v6vtss < 0.0) + { fprintf(fplog, "Fatal: Vtss = %g is negative.\n", + model->BSIM4v6vtss); + printf("Fatal: Vtss = %g is negative.\n", + model->BSIM4v6vtss); + Fatal_Flag = 1; + } + if (model->BSIM4v6vtsd < 0.0) + { fprintf(fplog, "Fatal: Vtsd = %g is negative.\n", + model->BSIM4v6vtsd); + printf("Fatal: Vtsd = %g is negative.\n", + model->BSIM4v6vtsd); + Fatal_Flag = 1; + } + if (model->BSIM4v6vtssws < 0.0) + { fprintf(fplog, "Fatal: Vtssws = %g is negative.\n", + model->BSIM4v6vtssws); + printf("Fatal: Vtssws = %g is negative.\n", + model->BSIM4v6vtssws); + Fatal_Flag = 1; + } + if (model->BSIM4v6vtsswd < 0.0) + { fprintf(fplog, "Fatal: Vtsswd = %g is negative.\n", + model->BSIM4v6vtsswd); + printf("Fatal: Vtsswd = %g is negative.\n", + model->BSIM4v6vtsswd); + Fatal_Flag = 1; + } + if (model->BSIM4v6vtsswgs < 0.0) + { fprintf(fplog, "Fatal: Vtsswgs = %g is negative.\n", + model->BSIM4v6vtsswgs); + printf("Fatal: Vtsswgs = %g is negative.\n", + model->BSIM4v6vtsswgs); + Fatal_Flag = 1; + } + if (model->BSIM4v6vtsswgd < 0.0) + { fprintf(fplog, "Fatal: Vtsswgd = %g is negative.\n", + model->BSIM4v6vtsswgd); + printf("Fatal: Vtsswgd = %g is negative.\n", + model->BSIM4v6vtsswgd); + Fatal_Flag = 1; + } + + + if (model->BSIM4v6paramChk ==1) + { +/* Check L and W parameters */ + if (pParam->BSIM4v6leff <= 1.0e-9) + { fprintf(fplog, "Warning: Leff = %g <= 1.0e-9. Recommended Leff >= 1e-8 \n", + pParam->BSIM4v6leff); + printf("Warning: Leff = %g <= 1.0e-9. Recommended Leff >= 1e-8 \n", + pParam->BSIM4v6leff); + } + + if (pParam->BSIM4v6leffCV <= 1.0e-9) + { fprintf(fplog, "Warning: Leff for CV = %g <= 1.0e-9. Recommended LeffCV >=1e-8 \n", + pParam->BSIM4v6leffCV); + printf("Warning: Leff for CV = %g <= 1.0e-9. Recommended LeffCV >=1e-8 \n", + pParam->BSIM4v6leffCV); + } + + if (pParam->BSIM4v6weff <= 1.0e-9) + { fprintf(fplog, "Warning: Weff = %g <= 1.0e-9. Recommended Weff >=1e-7 \n", + pParam->BSIM4v6weff); + printf("Warning: Weff = %g <= 1.0e-9. Recommended Weff >=1e-7 \n", + pParam->BSIM4v6weff); + } + + if (pParam->BSIM4v6weffCV <= 1.0e-9) + { fprintf(fplog, "Warning: Weff for CV = %g <= 1.0e-9. Recommended WeffCV >= 1e-7 \n", + pParam->BSIM4v6weffCV); + printf("Warning: Weff for CV = %g <= 1.0e-9. Recommended WeffCV >= 1e-7 \n", + pParam->BSIM4v6weffCV); + } + + /* Check threshold voltage parameters */ + if (model->BSIM4v6toxe < 1.0e-10) + { fprintf(fplog, "Warning: Toxe = %g is less than 1A. Recommended Toxe >= 5A\n", + model->BSIM4v6toxe); + printf("Warning: Toxe = %g is less than 1A. Recommended Toxe >= 5A\n", model->BSIM4v6toxe); + } + if (model->BSIM4v6toxp < 1.0e-10) + { fprintf(fplog, "Warning: Toxp = %g is less than 1A. Recommended Toxp >= 5A\n", + model->BSIM4v6toxp); + printf("Warning: Toxp = %g is less than 1A. Recommended Toxp >= 5A\n", model->BSIM4v6toxp); + } + if (model->BSIM4v6toxm < 1.0e-10) + { fprintf(fplog, "Warning: Toxm = %g is less than 1A. Recommended Toxm >= 5A\n", + model->BSIM4v6toxm); + printf("Warning: Toxm = %g is less than 1A. Recommended Toxm >= 5A\n", model->BSIM4v6toxm); + } + + if (pParam->BSIM4v6ndep <= 1.0e12) + { fprintf(fplog, "Warning: Ndep = %g may be too small.\n", + pParam->BSIM4v6ndep); + printf("Warning: Ndep = %g may be too small.\n", + pParam->BSIM4v6ndep); + } + else if (pParam->BSIM4v6ndep >= 1.0e21) + { fprintf(fplog, "Warning: Ndep = %g may be too large.\n", + pParam->BSIM4v6ndep); + printf("Warning: Ndep = %g may be too large.\n", + pParam->BSIM4v6ndep); + } + + if (pParam->BSIM4v6nsub <= 1.0e14) + { fprintf(fplog, "Warning: Nsub = %g may be too small.\n", + pParam->BSIM4v6nsub); + printf("Warning: Nsub = %g may be too small.\n", + pParam->BSIM4v6nsub); + } + else if (pParam->BSIM4v6nsub >= 1.0e21) + { fprintf(fplog, "Warning: Nsub = %g may be too large.\n", + pParam->BSIM4v6nsub); + printf("Warning: Nsub = %g may be too large.\n", + pParam->BSIM4v6nsub); + } + + if ((pParam->BSIM4v6ngate > 0.0) && + (pParam->BSIM4v6ngate <= 1.e18)) + { fprintf(fplog, "Warning: Ngate = %g is less than 1.E18cm^-3.\n", + pParam->BSIM4v6ngate); + printf("Warning: Ngate = %g is less than 1.E18cm^-3.\n", + pParam->BSIM4v6ngate); + } + + if (pParam->BSIM4v6dvt0 < 0.0) + { fprintf(fplog, "Warning: Dvt0 = %g is negative.\n", + pParam->BSIM4v6dvt0); + printf("Warning: Dvt0 = %g is negative.\n", pParam->BSIM4v6dvt0); + } + + if (fabs(1.0e-8 / (pParam->BSIM4v6w0 + pParam->BSIM4v6weff)) > 10.0) + { fprintf(fplog, "Warning: (W0 + Weff) may be too small.\n"); + printf("Warning: (W0 + Weff) may be too small.\n"); + } + +/* Check subthreshold parameters */ + if (pParam->BSIM4v6nfactor < 0.0) + { fprintf(fplog, "Warning: Nfactor = %g is negative.\n", + pParam->BSIM4v6nfactor); + printf("Warning: Nfactor = %g is negative.\n", pParam->BSIM4v6nfactor); + } + if (pParam->BSIM4v6cdsc < 0.0) + { fprintf(fplog, "Warning: Cdsc = %g is negative.\n", + pParam->BSIM4v6cdsc); + printf("Warning: Cdsc = %g is negative.\n", pParam->BSIM4v6cdsc); + } + if (pParam->BSIM4v6cdscd < 0.0) + { fprintf(fplog, "Warning: Cdscd = %g is negative.\n", + pParam->BSIM4v6cdscd); + printf("Warning: Cdscd = %g is negative.\n", pParam->BSIM4v6cdscd); + } +/* Check DIBL parameters */ + if (here->BSIM4v6eta0 < 0.0) + { fprintf(fplog, "Warning: Eta0 = %g is negative.\n", + here->BSIM4v6eta0); + printf("Warning: Eta0 = %g is negative.\n", here->BSIM4v6eta0); + } + +/* Check Abulk parameters */ + if (fabs(1.0e-8 / (pParam->BSIM4v6b1 + pParam->BSIM4v6weff)) > 10.0) + { fprintf(fplog, "Warning: (B1 + Weff) may be too small.\n"); + printf("Warning: (B1 + Weff) may be too small.\n"); + } + + +/* Check Saturation parameters */ + if (pParam->BSIM4v6a2 < 0.01) + { fprintf(fplog, "Warning: A2 = %g is too small. Set to 0.01.\n", pParam->BSIM4v6a2); + printf("Warning: A2 = %g is too small. Set to 0.01.\n", + pParam->BSIM4v6a2); + pParam->BSIM4v6a2 = 0.01; + } + else if (pParam->BSIM4v6a2 > 1.0) + { fprintf(fplog, "Warning: A2 = %g is larger than 1. A2 is set to 1 and A1 is set to 0.\n", + pParam->BSIM4v6a2); + printf("Warning: A2 = %g is larger than 1. A2 is set to 1 and A1 is set to 0.\n", + pParam->BSIM4v6a2); + pParam->BSIM4v6a2 = 1.0; + pParam->BSIM4v6a1 = 0.0; + } + + if (pParam->BSIM4v6prwg < 0.0) + { fprintf(fplog, "Warning: Prwg = %g is negative. Set to zero.\n", + pParam->BSIM4v6prwg); + printf("Warning: Prwg = %g is negative. Set to zero.\n", + pParam->BSIM4v6prwg); + pParam->BSIM4v6prwg = 0.0; + } + + if (pParam->BSIM4v6rdsw < 0.0) + { fprintf(fplog, "Warning: Rdsw = %g is negative. Set to zero.\n", + pParam->BSIM4v6rdsw); + printf("Warning: Rdsw = %g is negative. Set to zero.\n", + pParam->BSIM4v6rdsw); + pParam->BSIM4v6rdsw = 0.0; + pParam->BSIM4v6rds0 = 0.0; + } + + if (pParam->BSIM4v6rds0 < 0.0) + { fprintf(fplog, "Warning: Rds at current temperature = %g is negative. Set to zero.\n", + pParam->BSIM4v6rds0); + printf("Warning: Rds at current temperature = %g is negative. Set to zero.\n", + pParam->BSIM4v6rds0); + pParam->BSIM4v6rds0 = 0.0; + } + + if (pParam->BSIM4v6rdswmin < 0.0) + { fprintf(fplog, "Warning: Rdswmin at current temperature = %g is negative. Set to zero.\n", + pParam->BSIM4v6rdswmin); + printf("Warning: Rdswmin at current temperature = %g is negative. Set to zero.\n", + pParam->BSIM4v6rdswmin); + pParam->BSIM4v6rdswmin = 0.0; + } + + if (pParam->BSIM4v6pscbe2 <= 0.0) + { fprintf(fplog, "Warning: Pscbe2 = %g is not positive.\n", + pParam->BSIM4v6pscbe2); + printf("Warning: Pscbe2 = %g is not positive.\n", pParam->BSIM4v6pscbe2); + } + + if (pParam->BSIM4v6vsattemp < 1.0e3) + { fprintf(fplog, "Warning: Vsat at current temperature = %g may be too small.\n", pParam->BSIM4v6vsattemp); + printf("Warning: Vsat at current temperature = %g may be too small.\n", pParam->BSIM4v6vsattemp); + } + + if((model->BSIM4v6lambdaGiven) && (pParam->BSIM4v6lambda > 0.0) ) + { + if (pParam->BSIM4v6lambda > 1.0e-9) + { fprintf(fplog, "Warning: Lambda = %g may be too large.\n", pParam->BSIM4v6lambda); + printf("Warning: Lambda = %g may be too large.\n", pParam->BSIM4v6lambda); + } + } + + if((model->BSIM4v6vtlGiven) && (pParam->BSIM4v6vtl > 0.0) ) + { + if (pParam->BSIM4v6vtl < 6.0e4) + { fprintf(fplog, "Warning: Thermal velocity vtl = %g may be too small.\n", pParam->BSIM4v6vtl); + printf("Warning: Thermal velocity vtl = %g may be too small.\n", pParam->BSIM4v6vtl); + } + + if (pParam->BSIM4v6xn < 3.0) + { fprintf(fplog, "Warning: back scattering coeff xn = %g is too small.\n", pParam->BSIM4v6xn); + printf("Warning: back scattering coeff xn = %g is too small. Reset to 3.0 \n", pParam->BSIM4v6xn); + pParam->BSIM4v6xn = 3.0; + } + + if (model->BSIM4v6lc < 0.0) + { fprintf(fplog, "Warning: back scattering coeff lc = %g is too small.\n", model->BSIM4v6lc); + printf("Warning: back scattering coeff lc = %g is too small. Reset to 0.0\n", model->BSIM4v6lc); + pParam->BSIM4v6lc = 0.0; + } + } + + if (pParam->BSIM4v6pdibl1 < 0.0) + { fprintf(fplog, "Warning: Pdibl1 = %g is negative.\n", + pParam->BSIM4v6pdibl1); + printf("Warning: Pdibl1 = %g is negative.\n", pParam->BSIM4v6pdibl1); + } + if (pParam->BSIM4v6pdibl2 < 0.0) + { fprintf(fplog, "Warning: Pdibl2 = %g is negative.\n", + pParam->BSIM4v6pdibl2); + printf("Warning: Pdibl2 = %g is negative.\n", pParam->BSIM4v6pdibl2); + } + +/* Check stress effect parameters */ + if((here->BSIM4v6sa > 0.0) && (here->BSIM4v6sb > 0.0) && + ((here->BSIM4v6nf == 1.0) || ((here->BSIM4v6nf > 1.0) && (here->BSIM4v6sd > 0.0))) ) + { if (model->BSIM4v6lodk2 <= 0.0) + { fprintf(fplog, "Warning: LODK2 = %g is not positive.\n",model->BSIM4v6lodk2); + printf("Warning: LODK2 = %g is not positive.\n",model->BSIM4v6lodk2); + } + if (model->BSIM4v6lodeta0 <= 0.0) + { fprintf(fplog, "Warning: LODETA0 = %g is not positive.\n",model->BSIM4v6lodeta0); + printf("Warning: LODETA0 = %g is not positive.\n",model->BSIM4v6lodeta0); + } + } + +/* Check gate resistance parameters */ + if (here->BSIM4v6rgateMod == 1) + { if (model->BSIM4v6rshg <= 0.0) + printf("Warning: rshg should be positive for rgateMod = 1.\n"); + } + else if (here->BSIM4v6rgateMod == 2) + { if (model->BSIM4v6rshg <= 0.0) + printf("Warning: rshg <= 0.0 for rgateMod = 2.\n"); + else if (pParam->BSIM4v6xrcrg1 <= 0.0) + printf("Warning: xrcrg1 <= 0.0 for rgateMod = 2.\n"); + } + if (here->BSIM4v6rgateMod == 3) + { if (model->BSIM4v6rshg <= 0.0) + printf("Warning: rshg should be positive for rgateMod = 3.\n"); + else if (pParam->BSIM4v6xrcrg1 <= 0.0) + printf("Warning: xrcrg1 should be positive for rgateMod = 3.\n"); + } + +/* Check capacitance parameters */ + if (pParam->BSIM4v6noff < 0.1) + { fprintf(fplog, "Warning: Noff = %g is too small.\n", + pParam->BSIM4v6noff); + printf("Warning: Noff = %g is too small.\n", pParam->BSIM4v6noff); + } + + if (pParam->BSIM4v6voffcv < -0.5) + { fprintf(fplog, "Warning: Voffcv = %g is too small.\n", + pParam->BSIM4v6voffcv); + printf("Warning: Voffcv = %g is too small.\n", pParam->BSIM4v6voffcv); + } + if (pParam->BSIM4v6moin < 5.0) + { fprintf(fplog, "Warning: Moin = %g is too small.\n", + pParam->BSIM4v6moin); + printf("Warning: Moin = %g is too small.\n", pParam->BSIM4v6moin); + } + if (pParam->BSIM4v6moin > 25.0) + { fprintf(fplog, "Warning: Moin = %g is too large.\n", + pParam->BSIM4v6moin); + printf("Warning: Moin = %g is too large.\n", pParam->BSIM4v6moin); + } + if(model->BSIM4v6capMod ==2) { + if (pParam->BSIM4v6acde < 0.1) + { fprintf(fplog, "Warning: Acde = %g is too small.\n", + pParam->BSIM4v6acde); + printf("Warning: Acde = %g is too small.\n", pParam->BSIM4v6acde); + } + if (pParam->BSIM4v6acde > 1.6) + { fprintf(fplog, "Warning: Acde = %g is too large.\n", + pParam->BSIM4v6acde); + printf("Warning: Acde = %g is too large.\n", pParam->BSIM4v6acde); + } + } + +/* Check overlap capacitance parameters */ + if (model->BSIM4v6cgdo < 0.0) + { fprintf(fplog, "Warning: cgdo = %g is negative. Set to zero.\n", model->BSIM4v6cgdo); + printf("Warning: cgdo = %g is negative. Set to zero.\n", model->BSIM4v6cgdo); + model->BSIM4v6cgdo = 0.0; + } + if (model->BSIM4v6cgso < 0.0) + { fprintf(fplog, "Warning: cgso = %g is negative. Set to zero.\n", model->BSIM4v6cgso); + printf("Warning: cgso = %g is negative. Set to zero.\n", model->BSIM4v6cgso); + model->BSIM4v6cgso = 0.0; + } + if (model->BSIM4v6cgbo < 0.0) + { fprintf(fplog, "Warning: cgbo = %g is negative. Set to zero.\n", model->BSIM4v6cgbo); + printf("Warning: cgbo = %g is negative. Set to zero.\n", model->BSIM4v6cgbo); + model->BSIM4v6cgbo = 0.0; + } + if (model->BSIM4v6tnoiMod == 1) { + if (model->BSIM4v6tnoia < 0.0) + { fprintf(fplog, "Warning: tnoia = %g is negative. Set to zero.\n", model->BSIM4v6tnoia); + printf("Warning: tnoia = %g is negative. Set to zero.\n", model->BSIM4v6tnoia); + model->BSIM4v6tnoia = 0.0; + } + if (model->BSIM4v6tnoib < 0.0) + { fprintf(fplog, "Warning: tnoib = %g is negative. Set to zero.\n", model->BSIM4v6tnoib); + printf("Warning: tnoib = %g is negative. Set to zero.\n", model->BSIM4v6tnoib); + model->BSIM4v6tnoib = 0.0; + } + + if (model->BSIM4v6rnoia < 0.0) + { fprintf(fplog, "Warning: rnoia = %g is negative. Set to zero.\n", model->BSIM4v6rnoia); + printf("Warning: rnoia = %g is negative. Set to zero.\n", model->BSIM4v6rnoia); + model->BSIM4v6rnoia = 0.0; + } + if (model->BSIM4v6rnoib < 0.0) + { fprintf(fplog, "Warning: rnoib = %g is negative. Set to zero.\n", model->BSIM4v6rnoib); + printf("Warning: rnoib = %g is negative. Set to zero.\n", model->BSIM4v6rnoib); + model->BSIM4v6rnoib = 0.0; + } + } + + if (model->BSIM4v6SjctEmissionCoeff < 0.0) + { fprintf(fplog, "Warning: Njs = %g is negative.\n", + model->BSIM4v6SjctEmissionCoeff); + printf("Warning: Njs = %g is negative.\n", + model->BSIM4v6SjctEmissionCoeff); + } + if (model->BSIM4v6DjctEmissionCoeff < 0.0) + { fprintf(fplog, "Warning: Njd = %g is negative.\n", + model->BSIM4v6DjctEmissionCoeff); + printf("Warning: Njd = %g is negative.\n", + model->BSIM4v6DjctEmissionCoeff); + } + + if (model->BSIM4v6njtsstemp < 0.0) + { fprintf(fplog, "Warning: Njts = %g is negative at temperature = %g.\n", + model->BSIM4v6njtsstemp, ckt->CKTtemp); + printf("Warning: Njts = %g is negative at temperature = %g.\n", + model->BSIM4v6njtsstemp, ckt->CKTtemp); + } + if (model->BSIM4v6njtsswstemp < 0.0) + { fprintf(fplog, "Warning: Njtssw = %g is negative at temperature = %g.\n", + model->BSIM4v6njtsswstemp, ckt->CKTtemp); + printf("Warning: Njtssw = %g is negative at temperature = %g.\n", + model->BSIM4v6njtsswstemp, ckt->CKTtemp); + } + if (model->BSIM4v6njtsswgstemp < 0.0) + { fprintf(fplog, "Warning: Njtsswg = %g is negative at temperature = %g.\n", + model->BSIM4v6njtsswgstemp, ckt->CKTtemp); + printf("Warning: Njtsswg = %g is negative at temperature = %g.\n", + model->BSIM4v6njtsswgstemp, ckt->CKTtemp); + } + + if (model->BSIM4v6njtsdGiven && model->BSIM4v6njtsdtemp < 0.0) + { fprintf(fplog, "Warning: Njtsd = %g is negative at temperature = %g.\n", + model->BSIM4v6njtsdtemp, ckt->CKTtemp); + printf("Warning: Njtsd = %g is negative at temperature = %g.\n", + model->BSIM4v6njtsdtemp, ckt->CKTtemp); + } + if (model->BSIM4v6njtsswdGiven && model->BSIM4v6njtsswdtemp < 0.0) + { fprintf(fplog, "Warning: Njtsswd = %g is negative at temperature = %g.\n", + model->BSIM4v6njtsswdtemp, ckt->CKTtemp); + printf("Warning: Njtsswd = %g is negative at temperature = %g.\n", + model->BSIM4v6njtsswdtemp, ckt->CKTtemp); + } + if (model->BSIM4v6njtsswgdGiven && model->BSIM4v6njtsswgdtemp < 0.0) + { fprintf(fplog, "Warning: Njtsswgd = %g is negative at temperature = %g.\n", + model->BSIM4v6njtsswgdtemp, ckt->CKTtemp); + printf("Warning: Njtsswgd = %g is negative at temperature = %g.\n", + model->BSIM4v6njtsswgdtemp, ckt->CKTtemp); + } + + if (model->BSIM4v6ntnoi < 0.0) + { fprintf(fplog, "Warning: ntnoi = %g is negative. Set to zero.\n", model->BSIM4v6ntnoi); + printf("Warning: ntnoi = %g is negative. Set to zero.\n", model->BSIM4v6ntnoi); + model->BSIM4v6ntnoi = 0.0; + } + + /* diode model */ + if (model->BSIM4v6SbulkJctBotGradingCoeff >= 0.99) + { fprintf(fplog, "Warning: MJS = %g is too big. Set to 0.99.\n", model->BSIM4v6SbulkJctBotGradingCoeff); + printf("Warning: MJS = %g is too big. Set to 0.99.\n", model->BSIM4v6SbulkJctBotGradingCoeff); + model->BSIM4v6SbulkJctBotGradingCoeff = 0.99; + } + if (model->BSIM4v6SbulkJctSideGradingCoeff >= 0.99) + { fprintf(fplog, "Warning: MJSWS = %g is too big. Set to 0.99.\n", model->BSIM4v6SbulkJctSideGradingCoeff); + printf("Warning: MJSWS = %g is too big. Set to 0.99.\n", model->BSIM4v6SbulkJctSideGradingCoeff); + model->BSIM4v6SbulkJctSideGradingCoeff = 0.99; + } + if (model->BSIM4v6SbulkJctGateSideGradingCoeff >= 0.99) + { fprintf(fplog, "Warning: MJSWGS = %g is too big. Set to 0.99.\n", model->BSIM4v6SbulkJctGateSideGradingCoeff); + printf("Warning: MJSWGS = %g is too big. Set to 0.99.\n", model->BSIM4v6SbulkJctGateSideGradingCoeff); + model->BSIM4v6SbulkJctGateSideGradingCoeff = 0.99; + } + + if (model->BSIM4v6DbulkJctBotGradingCoeff >= 0.99) + { fprintf(fplog, "Warning: MJD = %g is too big. Set to 0.99.\n", model->BSIM4v6DbulkJctBotGradingCoeff); + printf("Warning: MJD = %g is too big. Set to 0.99.\n", model->BSIM4v6DbulkJctBotGradingCoeff); + model->BSIM4v6DbulkJctBotGradingCoeff = 0.99; + } + if (model->BSIM4v6DbulkJctSideGradingCoeff >= 0.99) + { fprintf(fplog, "Warning: MJSWD = %g is too big. Set to 0.99.\n", model->BSIM4v6DbulkJctSideGradingCoeff); + printf("Warning: MJSWD = %g is too big. Set to 0.99.\n", model->BSIM4v6DbulkJctSideGradingCoeff); + model->BSIM4v6DbulkJctSideGradingCoeff = 0.99; + } + if (model->BSIM4v6DbulkJctGateSideGradingCoeff >= 0.99) + { fprintf(fplog, "Warning: MJSWGD = %g is too big. Set to 0.99.\n", model->BSIM4v6DbulkJctGateSideGradingCoeff); + printf("Warning: MJSWGD = %g is too big. Set to 0.99.\n", model->BSIM4v6DbulkJctGateSideGradingCoeff); + model->BSIM4v6DbulkJctGateSideGradingCoeff = 0.99; + } + if (model->BSIM4v6wpemod == 1) + { + if (model->BSIM4v6scref <= 0.0) + { fprintf(fplog, "Warning: SCREF = %g is not positive. Set to 1e-6.\n", model->BSIM4v6scref); + printf("Warning: SCREF = %g is not positive. Set to 1e-6.\n", model->BSIM4v6scref); + model->BSIM4v6scref = 1e-6; + } + /*Move these checks to temp.c for sceff calculation*/ + /* + if (here->BSIM4v6sca < 0.0) + { fprintf(fplog, "Warning: SCA = %g is negative. Set to 0.0.\n", here->BSIM4v6sca); + printf("Warning: SCA = %g is negative. Set to 0.0.\n", here->BSIM4v6sca); + here->BSIM4v6sca = 0.0; + } + if (here->BSIM4v6scb < 0.0) + { fprintf(fplog, "Warning: SCB = %g is negative. Set to 0.0.\n", here->BSIM4v6scb); + printf("Warning: SCB = %g is negative. Set to 0.0.\n", here->BSIM4v6scb); + here->BSIM4v6scb = 0.0; + } + if (here->BSIM4v6scc < 0.0) + { fprintf(fplog, "Warning: SCC = %g is negative. Set to 0.0.\n", here->BSIM4v6scc); + printf("Warning: SCC = %g is negative. Set to 0.0.\n", here->BSIM4v6scc); + here->BSIM4v6scc = 0.0; + } + if (here->BSIM4v6sc < 0.0) + { fprintf(fplog, "Warning: SC = %g is negative. Set to 0.0.\n", here->BSIM4v6sc); + printf("Warning: SC = %g is negative. Set to 0.0.\n", here->BSIM4v6sc); + here->BSIM4v6sc = 0.0; + } + */ + + } + }/* loop for the parameter check for warning messages */ + fclose(fplog); + } + else + { fprintf(stderr, "Warning: Can't open log file. Parameter checking skipped.\n"); + } + + return(Fatal_Flag); +} + diff --git a/src/spicelib/devices/bsim4v6/b4v6cvtest.c b/src/spicelib/devices/bsim4v6/b4v6cvtest.c new file mode 100644 index 000000000..0d6842a44 --- /dev/null +++ b/src/spicelib/devices/bsim4v6/b4v6cvtest.c @@ -0,0 +1,200 @@ +/**** BSIM4.6.2 Released by Wenwei Yang 04/05/2008 ****/ + +/********** + * Copyright 2006 Regents of the University of California. All rights reserved. + * File: b4cvtest.c of BSIM4.6.2. + * Author: 2000 Weidong Liu + * Authors: 2001- Xuemei Xi, Mohan Dunga, Ali Niknejad, Chenming Hu. + * Authors: 2006- Mohan Dunga, Ali Niknejad, Chenming Hu + * Authors: 2007- Mohan Dunga, Wenwei Yang, 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. + **********/ + +#include "ngspice.h" +#include "cktdefs.h" +#include "bsim4v6def.h" +#include "trandefs.h" +#include "const.h" +#include "devdefs.h" +#include "sperror.h" +#include "suffix.h" + + +int +BSIM4v6convTest( +GENmodel *inModel, +CKTcircuit *ckt) +{ +BSIM4v6model *model = (BSIM4v6model*)inModel; +BSIM4v6instance *here; +double delvbd, delvbs, delvds, delvgd, delvgs; +double delvdbd, delvsbs; +double delvbd_jct, delvbs_jct; +double vds, vgs, vgd, vgdo, vbs, vbd; +double vdbd, vdbs, vsbs; +double cbhat, cdhat, Idtot, Ibtot; +double vses, vdes, vdedo, delvses, delvded, delvdes; +double Isestot, cseshat, Idedtot, cdedhat; +double Igstot, cgshat, Igdtot, cgdhat, Igbtot, cgbhat; +double tol0, tol1, tol2, tol3, tol4, tol5, tol6; + + for (; model != NULL; model = model->BSIM4v6nextModel) + { for (here = model->BSIM4v6instances; here != NULL ; + here=here->BSIM4v6nextInstance) + { if (here->BSIM4v6owner != ARCHme) continue; + vds = model->BSIM4v6type + * (*(ckt->CKTrhsOld + here->BSIM4v6dNodePrime) + - *(ckt->CKTrhsOld + here->BSIM4v6sNodePrime)); + vgs = model->BSIM4v6type + * (*(ckt->CKTrhsOld + here->BSIM4v6gNodePrime) + - *(ckt->CKTrhsOld + here->BSIM4v6sNodePrime)); + vbs = model->BSIM4v6type + * (*(ckt->CKTrhsOld + here->BSIM4v6bNodePrime) + - *(ckt->CKTrhsOld + here->BSIM4v6sNodePrime)); + vdbs = model->BSIM4v6type + * (*(ckt->CKTrhsOld + here->BSIM4v6dbNode) + - *(ckt->CKTrhsOld + here->BSIM4v6sNodePrime)); + vsbs = model->BSIM4v6type + * (*(ckt->CKTrhsOld + here->BSIM4v6sbNode) + - *(ckt->CKTrhsOld + here->BSIM4v6sNodePrime)); + vses = model->BSIM4v6type + * (*(ckt->CKTrhsOld + here->BSIM4v6sNode) + - *(ckt->CKTrhsOld + here->BSIM4v6sNodePrime)); + vdes = model->BSIM4v6type + * (*(ckt->CKTrhsOld + here->BSIM4v6dNode) + - *(ckt->CKTrhsOld + here->BSIM4v6sNodePrime)); + + vgdo = *(ckt->CKTstate0 + here->BSIM4v6vgs) + - *(ckt->CKTstate0 + here->BSIM4v6vds); + vbd = vbs - vds; + vdbd = vdbs - vds; + vgd = vgs - vds; + + delvbd = vbd - *(ckt->CKTstate0 + here->BSIM4v6vbd); + delvdbd = vdbd - *(ckt->CKTstate0 + here->BSIM4v6vdbd); + delvgd = vgd - vgdo; + + delvds = vds - *(ckt->CKTstate0 + here->BSIM4v6vds); + delvgs = vgs - *(ckt->CKTstate0 + here->BSIM4v6vgs); + delvbs = vbs - *(ckt->CKTstate0 + here->BSIM4v6vbs); + delvsbs = vsbs - *(ckt->CKTstate0 + here->BSIM4v6vsbs); + + delvses = vses - (*(ckt->CKTstate0 + here->BSIM4v6vses)); + vdedo = *(ckt->CKTstate0 + here->BSIM4v6vdes) + - *(ckt->CKTstate0 + here->BSIM4v6vds); + delvdes = vdes - *(ckt->CKTstate0 + here->BSIM4v6vdes); + delvded = vdes - vds - vdedo; + + delvbd_jct = (!here->BSIM4v6rbodyMod) ? delvbd : delvdbd; + delvbs_jct = (!here->BSIM4v6rbodyMod) ? delvbs : delvsbs; + + if (here->BSIM4v6mode >= 0) + { Idtot = here->BSIM4v6cd + here->BSIM4v6csub - here->BSIM4v6cbd + + here->BSIM4v6Igidl; + cdhat = Idtot - here->BSIM4v6gbd * delvbd_jct + + (here->BSIM4v6gmbs + here->BSIM4v6gbbs + here->BSIM4v6ggidlb) * delvbs + + (here->BSIM4v6gm + here->BSIM4v6gbgs + here->BSIM4v6ggidlg) * delvgs + + (here->BSIM4v6gds + here->BSIM4v6gbds + here->BSIM4v6ggidld) * delvds; + + Igstot = here->BSIM4v6Igs + here->BSIM4v6Igcs; + cgshat = Igstot + (here->BSIM4v6gIgsg + here->BSIM4v6gIgcsg) * delvgs + + here->BSIM4v6gIgcsd * delvds + here->BSIM4v6gIgcsb * delvbs; + + Igdtot = here->BSIM4v6Igd + here->BSIM4v6Igcd; + cgdhat = Igdtot + here->BSIM4v6gIgdg * delvgd + here->BSIM4v6gIgcdg * delvgs + + here->BSIM4v6gIgcdd * delvds + here->BSIM4v6gIgcdb * delvbs; + + Igbtot = here->BSIM4v6Igb; + cgbhat = here->BSIM4v6Igb + here->BSIM4v6gIgbg * delvgs + here->BSIM4v6gIgbd + * delvds + here->BSIM4v6gIgbb * delvbs; + } + else + { Idtot = here->BSIM4v6cd + here->BSIM4v6cbd - here->BSIM4v6Igidl; /* bugfix */ + cdhat = Idtot + here->BSIM4v6gbd * delvbd_jct + here->BSIM4v6gmbs + * delvbd + here->BSIM4v6gm * delvgd + - (here->BSIM4v6gds + here->BSIM4v6ggidls) * delvds + - here->BSIM4v6ggidlg * delvgs - here->BSIM4v6ggidlb * delvbs; + + Igstot = here->BSIM4v6Igs + here->BSIM4v6Igcd; + cgshat = Igstot + here->BSIM4v6gIgsg * delvgs + here->BSIM4v6gIgcdg * delvgd + - here->BSIM4v6gIgcdd * delvds + here->BSIM4v6gIgcdb * delvbd; + + Igdtot = here->BSIM4v6Igd + here->BSIM4v6Igcs; + cgdhat = Igdtot + (here->BSIM4v6gIgdg + here->BSIM4v6gIgcsg) * delvgd + - here->BSIM4v6gIgcsd * delvds + here->BSIM4v6gIgcsb * delvbd; + + Igbtot = here->BSIM4v6Igb; + cgbhat = here->BSIM4v6Igb + here->BSIM4v6gIgbg * delvgd - here->BSIM4v6gIgbd + * delvds + here->BSIM4v6gIgbb * delvbd; + } + + Isestot = here->BSIM4v6gstot * (*(ckt->CKTstate0 + here->BSIM4v6vses)); + cseshat = Isestot + here->BSIM4v6gstot * delvses + + here->BSIM4v6gstotd * delvds + here->BSIM4v6gstotg * delvgs + + here->BSIM4v6gstotb * delvbs; + + Idedtot = here->BSIM4v6gdtot * vdedo; + cdedhat = Idedtot + here->BSIM4v6gdtot * delvded + + here->BSIM4v6gdtotd * delvds + here->BSIM4v6gdtotg * delvgs + + here->BSIM4v6gdtotb * delvbs; + + /* + * Check convergence + */ + + if ((here->BSIM4v6off == 0) || (!(ckt->CKTmode & MODEINITFIX))) + { 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++; + return(OK); + } + + if ((fabs(cgshat - Igstot) >= tol3) || (fabs(cgdhat - Igdtot) >= tol4) + || (fabs(cgbhat - Igbtot) >= tol5)) + { ckt->CKTnoncon++; + return(OK); + } + + Ibtot = here->BSIM4v6cbs + here->BSIM4v6cbd + - here->BSIM4v6Igidl - here->BSIM4v6Igisl - here->BSIM4v6csub; + if (here->BSIM4v6mode >= 0) + { cbhat = Ibtot + here->BSIM4v6gbd * delvbd_jct + + here->BSIM4v6gbs * delvbs_jct - (here->BSIM4v6gbbs + here->BSIM4v6ggidlb) + * delvbs - (here->BSIM4v6gbgs + here->BSIM4v6ggidlg) * delvgs + - (here->BSIM4v6gbds + here->BSIM4v6ggidld) * delvds + - here->BSIM4v6ggislg * delvgd - here->BSIM4v6ggislb* delvbd + here->BSIM4v6ggisls * delvds ; + } + else + { cbhat = Ibtot + here->BSIM4v6gbs * delvbs_jct + here->BSIM4v6gbd + * delvbd_jct - (here->BSIM4v6gbbs + here->BSIM4v6ggislb) * delvbd + - (here->BSIM4v6gbgs + here->BSIM4v6ggislg) * delvgd + + (here->BSIM4v6gbds + here->BSIM4v6ggisld - here->BSIM4v6ggidls) * delvds + - here->BSIM4v6ggidlg * delvgs - here->BSIM4v6ggidlb * delvbs; + } + tol6 = ckt->CKTreltol * MAX(fabs(cbhat), + fabs(Ibtot)) + ckt->CKTabstol; + if (fabs(cbhat - Ibtot) > tol6) + { ckt->CKTnoncon++; + return(OK); + } + } + } + } + return(OK); +} diff --git a/src/spicelib/devices/bsim4v6/b4v6del.c b/src/spicelib/devices/bsim4v6/b4v6del.c new file mode 100644 index 000000000..6a2aa8d4b --- /dev/null +++ b/src/spicelib/devices/bsim4v6/b4v6del.c @@ -0,0 +1,43 @@ +/**** BSIM4.6.2 Released by Wenwei Yang 07/31/2008 ****/ + +/********** + * Copyright 2006 Regents of the University of California. All rights reserved. + * File: b4del.c of BSIM4.6.2. + * Author: 2000 Weidong Liu + * Authors: 2001- Xuemei Xi, Mohan Dunga, Ali Niknejad, Chenming Hu. + * Authors: 2006- Mohan Dunga, Ali Niknejad, Chenming Hu + * Authors: 2007- Mohan Dunga, Wenwei Yang, Ali Niknejad, Chenming Hu + * Project Director: Prof. Chenming Hu. + **********/ + +#include "ngspice.h" +#include "bsim4v6def.h" +#include "sperror.h" +#include "gendefs.h" +#include "suffix.h" + + +int +BSIM4v6delete( +GENmodel *inModel, +IFuid name, +GENinstance **inInst) +{ +BSIM4v6instance **fast = (BSIM4v6instance**)inInst; +BSIM4v6model *model = (BSIM4v6model*)inModel; +BSIM4v6instance **prev = NULL; +BSIM4v6instance *here; + + for (; model ; model = model->BSIM4v6nextModel) + { prev = &(model->BSIM4v6instances); + for (here = *prev; here ; here = *prev) + { if (here->BSIM4v6name == name || (fast && here==*fast)) + { *prev= here->BSIM4v6nextInstance; + FREE(here); + return(OK); + } + prev = &(here->BSIM4v6nextInstance); + } + } + return(E_NODEV); +} diff --git a/src/spicelib/devices/bsim4v6/b4v6dest.c b/src/spicelib/devices/bsim4v6/b4v6dest.c new file mode 100644 index 000000000..efbb26502 --- /dev/null +++ b/src/spicelib/devices/bsim4v6/b4v6dest.c @@ -0,0 +1,40 @@ +/**** BSIM4.6.2 Released by Wenwei Yang 07/31/2008 ****/ + +/********** + * Copyright 2006 Regents of the University of California. All rights reserved. + * File: b4dest.c of BSIM4.6.2. + * Author: 2000 Weidong Liu + * Authors: 2001- Xuemei Xi, Mohan Dunga, Ali Niknejad, Chenming Hu. + * Authors: 2006- Mohan Dunga, Ali Niknejad, Chenming Hu + * Authors: 2007- Mohan Dunga, Wenwei Yang, Ali Niknejad, Chenming Hu + * Project Director: Prof. Chenming Hu. + **********/ + +#include "ngspice.h" +#include "bsim4v6def.h" +#include "suffix.h" + +void +BSIM4v6destroy( +GENmodel **inModel) +{ +BSIM4v6model **model = (BSIM4v6model**)inModel; +BSIM4v6instance *here; +BSIM4v6instance *prev = NULL; +BSIM4v6model *mod = *model; +BSIM4v6model *oldmod = NULL; + + for (; mod ; mod = mod->BSIM4v6nextModel) + { if(oldmod) FREE(oldmod); + oldmod = mod; + prev = NULL; + for (here = mod->BSIM4v6instances; here; here = here->BSIM4v6nextInstance) + { if(prev) FREE(prev); + prev = here; + } + if(prev) FREE(prev); + } + if(oldmod) FREE(oldmod); + *model = NULL; + return; +} diff --git a/src/spicelib/devices/bsim4v6/b4v6geo.c b/src/spicelib/devices/bsim4v6/b4v6geo.c new file mode 100644 index 000000000..108a9009c --- /dev/null +++ b/src/spicelib/devices/bsim4v6/b4v6geo.c @@ -0,0 +1,379 @@ +/**** BSIM4.6.2 Released by Wenwei Yang 07/31/2008 ****/ + +/********** + * Copyright 2006 Regents of the University of California. All rights reserved. + * File: b4geo.c of BSIM4.6.2. + * Author: 2000 Weidong Liu + * Authors: 2001- Xuemei Xi, Mohan Dunga, Ali Niknejad, Chenming Hu. + * Authors: 2006- Mohan Dunga, Ali Niknejad, Chenming Hu + * Authors: 2007- Mohan Dunga, Wenwei Yang, Ali Niknejad, Chenming Hu + * Project Director: Prof. Chenming Hu. + **********/ + +#include "ngspice.h" +#include "bsim4v6def.h" + +/* + * WDLiu: + * This subrutine is a special module to process the geometry dependent + * parasitics for BSIM4v6, which calculates Ps, Pd, As, Ad, and Rs and Rd + * for multi-fingers and varous GEO and RGEO options. + */ + +int +BSIM4v6RdsEndIso(double, double, double, double, double, double, int, int, double *); +int +BSIM4v6RdsEndSha(double, double, double, double, double, double, int, int, double *); + +static int +BSIM4v6NumFingerDiff(double nf, int minSD, double *nuIntD, double *nuEndD, double *nuIntS, double *nuEndS) +{ +int NF; + NF = (int)nf; + if ((NF%2) != 0) + { *nuEndD = *nuEndS = 1.0; + *nuIntD = *nuIntS = 2.0 * MAX((nf - 1.0) / 2.0, 0.0); + } + else + { if (minSD == 1) /* minimize # of source */ + { *nuEndD = 2.0; + *nuIntD = 2.0 * MAX((nf / 2.0 - 1.0), 0.0); + *nuEndS = 0.0; + *nuIntS = nf; + } + else + { *nuEndD = 0.0; + *nuIntD = nf; + *nuEndS = 2.0; + *nuIntS = 2.0 * MAX((nf / 2.0 - 1.0), 0.0); + } + } +return 0; +} + + +int +BSIM4v6PAeffGeo(double nf, int geo, int minSD, double Weffcj, double DMCG, double DMCI, double DMDG, double *Ps, double *Pd, double *As, double *Ad) +{ +double T0, T1, T2; +double ADiso, ADsha, ADmer, ASiso, ASsha, ASmer; +double PDiso, PDsha, PDmer, PSiso, PSsha, PSmer; +double nuIntD = 0.0, nuEndD = 0.0, nuIntS = 0.0, nuEndS = 0.0; + + if (geo < 9) /* For geo = 9 and 10, the numbers of S/D diffusions already known */ + BSIM4v6NumFingerDiff(nf, minSD, &nuIntD, &nuEndD, &nuIntS, &nuEndS); + + T0 = DMCG + DMCI; + T1 = DMCG + DMCG; + T2 = DMDG + DMDG; + + PSiso = PDiso = T0 + T0 + Weffcj; + PSsha = PDsha = T1; + PSmer = PDmer = T2; + + ASiso = ADiso = T0 * Weffcj; + ASsha = ADsha = DMCG * Weffcj; + ASmer = ADmer = DMDG * Weffcj; + + switch(geo) + { case 0: + *Ps = nuEndS * PSiso + nuIntS * PSsha; + *Pd = nuEndD * PDiso + nuIntD * PDsha; + *As = nuEndS * ASiso + nuIntS * ASsha; + *Ad = nuEndD * ADiso + nuIntD * ADsha; + break; + case 1: + *Ps = nuEndS * PSiso + nuIntS * PSsha; + *Pd = (nuEndD + nuIntD) * PDsha; + *As = nuEndS * ASiso + nuIntS * ASsha; + *Ad = (nuEndD + nuIntD) * ADsha; + break; + case 2: + *Ps = (nuEndS + nuIntS) * PSsha; + *Pd = nuEndD * PDiso + nuIntD * PDsha; + *As = (nuEndS + nuIntS) * ASsha; + *Ad = nuEndD * ADiso + nuIntD * ADsha; + break; + case 3: + *Ps = (nuEndS + nuIntS) * PSsha; + *Pd = (nuEndD + nuIntD) * PDsha; + *As = (nuEndS + nuIntS) * ASsha; + *Ad = (nuEndD + nuIntD) * ADsha; + break; + case 4: + *Ps = nuEndS * PSiso + nuIntS * PSsha; + *Pd = nuEndD * PDmer + nuIntD * PDsha; + *As = nuEndS * ASiso + nuIntS * ASsha; + *Ad = nuEndD * ADmer + nuIntD * ADsha; + break; + case 5: + *Ps = (nuEndS + nuIntS) * PSsha; + *Pd = nuEndD * PDmer + nuIntD * PDsha; + *As = (nuEndS + nuIntS) * ASsha; + *Ad = nuEndD * ADmer + nuIntD * ADsha; + break; + case 6: + *Ps = nuEndS * PSmer + nuIntS * PSsha; + *Pd = nuEndD * PDiso + nuIntD * PDsha; + *As = nuEndS * ASmer + nuIntS * ASsha; + *Ad = nuEndD * ADiso + nuIntD * ADsha; + break; + case 7: + *Ps = nuEndS * PSmer + nuIntS * PSsha; + *Pd = (nuEndD + nuIntD) * PDsha; + *As = nuEndS * ASmer + nuIntS * ASsha; + *Ad = (nuEndD + nuIntD) * ADsha; + break; + case 8: + *Ps = nuEndS * PSmer + nuIntS * PSsha; + *Pd = nuEndD * PDmer + nuIntD * PDsha; + *As = nuEndS * ASmer + nuIntS * ASsha; + *Ad = nuEndD * ADmer + nuIntD * ADsha; + break; + case 9: /* geo = 9 and 10 happen only when nf = even */ + *Ps = PSiso + (nf - 1.0) * PSsha; + *Pd = nf * PDsha; + *As = ASiso + (nf - 1.0) * ASsha; + *Ad = nf * ADsha; + break; + case 10: + *Ps = nf * PSsha; + *Pd = PDiso + (nf - 1.0) * PDsha; + *As = nf * ASsha; + *Ad = ADiso + (nf - 1.0) * ADsha; + break; + default: + printf("Warning: Specified GEO = %d not matched\n", geo); + } +return 0; +} + + +int +BSIM4v6RdseffGeo(double nf, int geo, int rgeo, int minSD, double Weffcj, double Rsh, double DMCG, double DMCI, double DMDG, int Type, double *Rtot) +{ +double Rint = 0.0, Rend = 0.0; +double nuIntD = 0.0, nuEndD = 0.0, nuIntS = 0.0, nuEndS = 0.0; + + if (geo < 9) /* since geo = 9 and 10 only happen when nf = even */ + { BSIM4v6NumFingerDiff(nf, minSD, &nuIntD, &nuEndD, &nuIntS, &nuEndS); + + /* Internal S/D resistance -- assume shared S or D and all wide contacts */ + if (Type == 1) + { if (nuIntS == 0.0) + Rint = 0.0; + else + Rint = Rsh * DMCG / ( Weffcj * nuIntS); + } + else + { if (nuIntD == 0.0) + Rint = 0.0; + else + Rint = Rsh * DMCG / ( Weffcj * nuIntD); + } + } + + /* End S/D resistance -- geo dependent */ + switch(geo) + { case 0: + if (Type == 1) BSIM4v6RdsEndIso(Weffcj, Rsh, DMCG, DMCI, DMDG, + nuEndS, rgeo, 1, &Rend); + else BSIM4v6RdsEndIso(Weffcj, Rsh, DMCG, DMCI, DMDG, + nuEndD, rgeo, 0, &Rend); + break; + case 1: + if (Type == 1) BSIM4v6RdsEndIso(Weffcj, Rsh, DMCG, DMCI, DMDG, + nuEndS, rgeo, 1, &Rend); + else BSIM4v6RdsEndSha(Weffcj, Rsh, DMCG, DMCI, DMDG, + nuEndD, rgeo, 0, &Rend); + break; + case 2: + if (Type == 1) BSIM4v6RdsEndSha(Weffcj, Rsh, DMCG, DMCI, DMDG, + nuEndS, rgeo, 1, &Rend); + else BSIM4v6RdsEndIso(Weffcj, Rsh, DMCG, DMCI, DMDG, + nuEndD, rgeo, 0, &Rend); + break; + case 3: + if (Type == 1) BSIM4v6RdsEndSha(Weffcj, Rsh, DMCG, DMCI, DMDG, + nuEndS, rgeo, 1, &Rend); + else BSIM4v6RdsEndSha(Weffcj, Rsh, DMCG, DMCI, DMDG, + nuEndD, rgeo, 0, &Rend); + break; + case 4: + if (Type == 1) BSIM4v6RdsEndIso(Weffcj, Rsh, DMCG, DMCI, DMDG, + nuEndS, rgeo, 1, &Rend); + else Rend = Rsh * DMDG / Weffcj; + break; + case 5: + if (Type == 1) BSIM4v6RdsEndSha(Weffcj, Rsh, DMCG, DMCI, DMDG, + nuEndS, rgeo, 1, &Rend); + else Rend = Rsh * DMDG / (Weffcj * nuEndD); + break; + case 6: + if (Type == 1) Rend = Rsh * DMDG / Weffcj; + else BSIM4v6RdsEndIso(Weffcj, Rsh, DMCG, DMCI, DMDG, + nuEndD, rgeo, 0, &Rend); + break; + case 7: + if (Type == 1) Rend = Rsh * DMDG / (Weffcj * nuEndS); + else BSIM4v6RdsEndSha(Weffcj, Rsh, DMCG, DMCI, DMDG, + nuEndD, rgeo, 0, &Rend); + break; + case 8: + Rend = Rsh * DMDG / Weffcj; + break; + case 9: /* all wide contacts assumed for geo = 9 and 10 */ + if (Type == 1) + { Rend = 0.5 * Rsh * DMCG / Weffcj; + if (nf == 2.0) + Rint = 0.0; + else + Rint = Rsh * DMCG / (Weffcj * (nf - 2.0)); + } + else + { Rend = 0.0; + Rint = Rsh * DMCG / (Weffcj * nf); + } + break; + case 10: + if (Type == 1) + { Rend = 0.0; + Rint = Rsh * DMCG / (Weffcj * nf); + } + else + { Rend = 0.5 * Rsh * DMCG / Weffcj;; + if (nf == 2.0) + Rint = 0.0; + else + Rint = Rsh * DMCG / (Weffcj * (nf - 2.0)); + } + break; + default: + printf("Warning: Specified GEO = %d not matched\n", geo); + } + + if (Rint <= 0.0) + *Rtot = Rend; + else if (Rend <= 0.0) + *Rtot = Rint; + else + *Rtot = Rint * Rend / (Rint + Rend); +if(*Rtot==0.0) + printf("Warning: Zero resistance returned from RdseffGeo\n"); +return 0; +} + + +int +BSIM4v6RdsEndIso(double Weffcj, double Rsh, double DMCG, double DMCI, double DMDG, double nuEnd, int rgeo, int Type, double *Rend) +{ + NG_IGNORE(DMDG); + + if (Type == 1) + { switch(rgeo) + { case 1: + case 2: + case 5: + if (nuEnd == 0.0) + *Rend = 0.0; + else + *Rend = Rsh * DMCG / (Weffcj * nuEnd); + break; + case 3: + case 4: + case 6: + if ((DMCG + DMCI) == 0.0) + printf("(DMCG + DMCI) can not be equal to zero\n"); + if ((nuEnd == 0.0)||((DMCG+DMCI)==0.0)) + *Rend = 0.0; + else + *Rend = Rsh * Weffcj / (3.0 * nuEnd * (DMCG + DMCI)); + break; + default: + printf("Warning: Specified RGEO = %d not matched\n", rgeo); + } + } + else + { switch(rgeo) + { case 1: + case 3: + case 7: + if (nuEnd == 0.0) + *Rend = 0.0; + else + *Rend = Rsh * DMCG / (Weffcj * nuEnd); + break; + case 2: + case 4: + case 8: + if ((DMCG + DMCI) == 0.0) + printf("(DMCG + DMCI) can not be equal to zero\n"); + if ((nuEnd == 0.0)||((DMCG + DMCI)==0.0)) + *Rend = 0.0; + else + *Rend = Rsh * Weffcj / (3.0 * nuEnd * (DMCG + DMCI)); + break; + default: + printf("Warning: Specified RGEO = %d not matched\n", rgeo); + } + } +return 0; +} + + +int +BSIM4v6RdsEndSha(double Weffcj, double Rsh, double DMCG, double DMCI, double DMDG, double nuEnd, int rgeo, int Type, double *Rend) +{ + NG_IGNORE(DMCI); + NG_IGNORE(DMDG); + + if (Type == 1) + { switch(rgeo) + { case 1: + case 2: + case 5: + if (nuEnd == 0.0) + *Rend = 0.0; + else + *Rend = Rsh * DMCG / (Weffcj * nuEnd); + break; + case 3: + case 4: + case 6: + if (DMCG == 0.0) + printf("DMCG can not be equal to zero\n"); + if (nuEnd == 0.0) + *Rend = 0.0; + else + *Rend = Rsh * Weffcj / (6.0 * nuEnd * DMCG); + break; + default: + printf("Warning: Specified RGEO = %d not matched\n", rgeo); + } + } + else + { switch(rgeo) + { case 1: + case 3: + case 7: + if (nuEnd == 0.0) + *Rend = 0.0; + else + *Rend = Rsh * DMCG / (Weffcj * nuEnd); + break; + case 2: + case 4: + case 8: + if (DMCG == 0.0) + printf("DMCG can not be equal to zero\n"); + if (nuEnd == 0.0) + *Rend = 0.0; + else + *Rend = Rsh * Weffcj / (6.0 * nuEnd * DMCG); + break; + default: + printf("Warning: Specified RGEO = %d not matched\n", rgeo); + } + } +return 0; +} diff --git a/src/spicelib/devices/bsim4v6/b4v6getic.c b/src/spicelib/devices/bsim4v6/b4v6getic.c new file mode 100644 index 000000000..61adc565c --- /dev/null +++ b/src/spicelib/devices/bsim4v6/b4v6getic.c @@ -0,0 +1,46 @@ +/**** BSIM4.6.2 Released by Wenwei Yang 07/31/2008****/ + +/********** + * Copyright 2006 Regents of the University of California. All rights reserved. + * File: b4getic.c of BSIM4.6.2. + * Author: 2000 Weidong Liu + * Authors: 2001- Xuemei Xi, Mohan Dunga, Ali Niknejad, Chenming Hu. + * Authors: 2006- Mohan Dunga, Ali Niknejad, Chenming Hu + * Authors: 2007- Mohan Dunga, Wenwei Yang, Ali Niknejad, Chenming Hu + * Project Director: Prof. Chenming Hu. + **********/ + +#include "ngspice.h" +#include "cktdefs.h" +#include "bsim4v6def.h" +#include "sperror.h" +#include "suffix.h" + + +int +BSIM4v6getic( +GENmodel *inModel, +CKTcircuit *ckt) +{ +BSIM4v6model *model = (BSIM4v6model*)inModel; +BSIM4v6instance *here; + + for (; model ; model = model->BSIM4v6nextModel) + { for (here = model->BSIM4v6instances; here; here = here->BSIM4v6nextInstance) + { if (here->BSIM4v6owner != ARCHme) continue; + if (!here->BSIM4v6icVDSGiven) + { here->BSIM4v6icVDS = *(ckt->CKTrhs + here->BSIM4v6dNode) + - *(ckt->CKTrhs + here->BSIM4v6sNode); + } + if (!here->BSIM4v6icVGSGiven) + { here->BSIM4v6icVGS = *(ckt->CKTrhs + here->BSIM4v6gNodeExt) + - *(ckt->CKTrhs + here->BSIM4v6sNode); + } + if(!here->BSIM4v6icVBSGiven) + { here->BSIM4v6icVBS = *(ckt->CKTrhs + here->BSIM4v6bNode) + - *(ckt->CKTrhs + here->BSIM4v6sNode); + } + } + } + return(OK); +} diff --git a/src/spicelib/devices/bsim4v6/b4v6ld.c b/src/spicelib/devices/bsim4v6/b4v6ld.c new file mode 100644 index 000000000..ad3fe22a5 --- /dev/null +++ b/src/spicelib/devices/bsim4v6/b4v6ld.c @@ -0,0 +1,5391 @@ +/**** BSIM4.6.2 Released by Wenwei Yang 07/31/2008****/ +/**** BSIM4.6.5 Update ngspice 09/22/2009 ****/ +/**** OpenMP support ngspice 06/28/2010 ****/ +/********** + * Copyright 2006 Regents of the University of California. All rights reserved. + * File: b4ld.c of BSIM4.6.2. + * Author: 2000 Weidong Liu + * Authors: 2001- Xuemei Xi, Mohan Dunga, Ali Niknejad, Chenming Hu. + * Authors: 2006- Mohan Dunga, Ali Niknejad, Chenming Hu + * Authors: 2007- Mohan Dunga, Wenwei Yang, Ali Niknejad, Chenming Hu + * Authors: 2008- Wenwei Yang, 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. + * Modified by Mohan Dunga, 12/13/2006. + * Modified by Mohan Dunga, Wenwei Yang, 05/18/2007. + * Modified by Wenwei Yang, 07/31/2008. + **********/ + + +#include "ngspice.h" +#include "cktdefs.h" +#include "bsim4v6def.h" +#include "trandefs.h" +#include "const.h" +#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 +#define EPS0 8.85418e-12 +#define EPSSI 1.03594e-10 +#define Charge_q 1.60219e-19 +#define DELTA_1 0.02 +#define DELTA_2 0.02 +#define DELTA_3 0.02 +#define DELTA_4 0.02 +#define MM 3 /* smooth coeff */ +#define DEXP(A,B,C) { \ + if (A > EXP_THRESHOLD) { \ + B = MAX_EXP*(1.0+(A)-EXP_THRESHOLD); \ + C = MAX_EXP; \ + } else if (A < -EXP_THRESHOLD) { \ + B = MIN_EXP; \ + C = 0; \ + } else { \ + B = exp(A); \ + C = B; \ + } \ + } + + +#ifdef USE_OMP4 +int BSIM4v6LoadOMP(BSIM4v6instance *here, CKTcircuit *ckt); +void BSIM4v6LoadRhsMat(GENmodel *inModel, CKTcircuit *ckt); +extern int nthreads; +#endif + +int BSIM4v6polyDepletion(double phi, double ngate,double epsgate, double coxe, double Vgs, double *Vgs_eff, double *dVgs_eff_dVg); + +int +BSIM4v6load( +GENmodel *inModel, +CKTcircuit *ckt) +{ +#ifdef USE_OMP4 + int idx; + BSIM4v6model *model = (BSIM4v6model*)inModel; + int good = 0; + BSIM4v6instance *here; + BSIM4v6instance **InstArray; + InstArray = model->BSIM4v6InstanceArray; + +#pragma omp parallel for num_threads(nthreads) private(here) + for (idx = 0; idx < model->BSIM4v6InstCount; idx++) { + here = InstArray[idx]; + good = BSIM4v6LoadOMP(here, ckt); + } + + BSIM4v6LoadRhsMat(inModel, ckt); + + return good; +} + + +int BSIM4v6LoadOMP(BSIM4v6instance *here, CKTcircuit *ckt) { +BSIM4v6model *model; +#else +BSIM4v6model *model = (BSIM4v6model*)inModel; +BSIM4v6instance *here; +#endif +double ceqgstot, dgstot_dvd, dgstot_dvg, dgstot_dvs, dgstot_dvb; +double ceqgdtot, dgdtot_dvd, dgdtot_dvg, dgdtot_dvs, dgdtot_dvb; +double gstot, gstotd, gstotg, gstots, gstotb, gspr, Rs, Rd; +double gdtot, gdtotd, gdtotg, gdtots, gdtotb, gdpr; +double vgs_eff, vgd_eff, dvgs_eff_dvg, dvgd_eff_dvg; +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 geltd, gcrg, gcrgg, gcrgd, gcrgs, gcrgb, ceqgcrg; +double vges, vgms, vgedo, vgmdo, vged, vgmd, delvged, delvgmd; +double delvges, delvgms, vgmb; +double gcgmgmb=0.0, gcgmdb=0.0, gcgmsb=0.0, gcdgmb, gcsgmb; +double gcgmbb=0.0, gcbgmb, qgmb, qgmid=0.0, ceqqgmid; + +double vbd, vbs, vds, vgb, vgd, vgs, vgdo; +#ifndef PREDICTOR +double xfact; +#endif +double vdbs, vdbd, vsbs, vsbdo, vsbd; +double delvdbs, delvdbd, delvsbs; +double delvbd_jct, delvbs_jct, vbs_jct, vbd_jct; + +double SourceSatCurrent, DrainSatCurrent; +double ag0, qgb, von, cbhat=0.0, VgstNVt, ExpVgst; +double ceqqb, ceqqd, ceqqg, ceqqjd=0.0, ceqqjs=0.0, ceq, geq; +double cdrain, cdhat=0.0, ceqdrn, ceqbd, ceqbs, ceqjd, ceqjs, gjbd, gjbs; +double czbd, czbdsw, czbdswg, czbs, czbssw, czbsswg, evbd, evbs, arg, sarg; +double delvbd, delvbs, delvds, delvgd, delvgs; +double Vfbeff, dVfbeff_dVg, dVfbeff_dVb, V3, V4; +double gcbdb, gcbgb, gcbsb, gcddb, gcdgb, gcdsb, gcgdb, gcggb, gcgsb, gcsdb; +double gcgbb, gcdbb, gcsbb, gcbbb; +double gcdbdb, gcsbsb; +double gcsgb, gcssb, MJD, MJSWD, MJSWGD, MJS, MJSWS, MJSWGS; +double qgate=0.0, qbulk=0.0, qdrn=0.0, qsrc, cqgate, cqbody, cqdrn; +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=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; +double Igs, dIgs_dVg, dIgs_dVs, Igd, dIgd_dVg, dIgd_dVd; +double Igbacc, dIgbacc_dVg, dIgbacc_dVb; +double Igbinv, dIgbinv_dVg, dIgbinv_dVd, dIgbinv_dVb; +double Pigcd, dPigcd_dVg, dPigcd_dVd, dPigcd_dVb; +double Istoteq, gIstotg, gIstotd, gIstots, gIstotb; +double Idtoteq, gIdtotg, gIdtotd, gIdtots, gIdtotb; +double Ibtoteq, gIbtotg, gIbtotd, gIbtots, gIbtotb; +double Igtoteq, gIgtotg, gIgtotd, gIgtots, gIgtotb; +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, Vtm0; +double n, dn_dVb, dn_dVd, voffcv, noff, dnoff_dVd, dnoff_dVb; +double V0, CoxWLcen, QovCox, LINK; +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; +double ueff, dueff_dVg, dueff_dVd, dueff_dVb; +double Esat, Vdsat; +double EsatL, dEsatL_dVg, dEsatL_dVd, dEsatL_dVb; +double dVdsat_dVg, dVdsat_dVb, dVdsat_dVd, Vasat, dAlphaz_dVg, dAlphaz_dVb; +double dVasat_dVg, dVasat_dVb, dVasat_dVd, Va, dVa_dVd, dVa_dVg, dVa_dVb; +double Vbseff, dVbseff_dVb, VbseffCV, dVbseffCV_dVb; +double VgsteffVth, dT11_dVg; +double Arg1, One_Third_CoxWL, Two_Third_CoxWL, Alphaz, CoxWL; +double T0=0.0, dT0_dVg, dT0_dVd, dT0_dVb; +double T1, dT1_dVg, dT1_dVd, dT1_dVb; +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, 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; +double T10, dT10_dVg, dT10_dVb, dT10_dVd; +double T11, T12, T13, T14; +double tmp, Abulk, dAbulk_dVb, Abulk0, dAbulk0_dVb; +double Cclm, dCclm_dVg, dCclm_dVd, dCclm_dVb; +double FP, dFP_dVg, PvagTerm, dPvagTerm_dVg, dPvagTerm_dVd, dPvagTerm_dVb; +double VADITS, dVADITS_dVg, dVADITS_dVd; +double Lpe_Vb, dDITS_Sft_dVb, dDITS_Sft_dVd; +double VACLM, dVACLM_dVg, dVACLM_dVd, dVACLM_dVb; +double VADIBL, dVADIBL_dVg, dVADIBL_dVd, dVADIBL_dVb; +double Xdep, dXdep_dVb, lt1, dlt1_dVb, ltw, dltw_dVb, Delt_vth, dDelt_vth_dVb; +double Theta0, dTheta0_dVb; +double TempRatio, tmp1, tmp2, tmp3, tmp4; +double DIBL_Sft, dDIBL_Sft_dVd, Lambda, dLambda_dVg; +double Idtot, Ibtot, a1, ScalingFactor; + +double Vgsteff, dVgsteff_dVg, dVgsteff_dVd, dVgsteff_dVb; +double Vdseff, dVdseff_dVg, dVdseff_dVd, dVdseff_dVb; +double VdseffCV, dVdseffCV_dVg, dVdseffCV_dVd, dVdseffCV_dVb; +double diffVds, dAbulk_dVg; +double beta, dbeta_dVg, dbeta_dVd, dbeta_dVb; +double gche, dgche_dVg, dgche_dVd, dgche_dVb; +double fgche1, dfgche1_dVg, dfgche1_dVd, dfgche1_dVb; +double fgche2, dfgche2_dVg, dfgche2_dVd, dfgche2_dVb; +double Idl, dIdl_dVg, dIdl_dVd, dIdl_dVb; +double Idsa, dIdsa_dVg, dIdsa_dVd, dIdsa_dVb; +double Ids, Gm, Gds, Gmb, devbs_dvb, devbd_dvb; +double Isub, Gbd, Gbg, Gbb; +double VASCBE, dVASCBE_dVg, dVASCBE_dVd, dVASCBE_dVb; +double CoxeffWovL; +double Rds, dRds_dVg, dRds_dVb, WVCox, WVCoxRds; +double Vgst2Vtm, VdsatCV; +double Leff, Weff, dWeff_dVg, dWeff_dVb; +double AbulkCV, dAbulkCV_dVb; +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; +double dsxpart_dVd, dsxpart_dVg, dsxpart_dVb, dsxpart_dVs; +double gbspsp, gbbdp, gbbsp, gbspg, gbspb, gbspdp; +double gbdpdp, gbdpg, gbdpb, gbdpsp; +double qgdo, qgso, cgdo, cgso; +double Cgg, Cgd, Cgb, Cdg, Cdd, Cds; +double Csg, Csd, Css, Csb, Cbg, Cbd, Cbb; +double Cgg1, Cgb1, Cgd1, Cbg1, Cbb1, Cbd1, Qac0, Qsub0; +double dQac0_dVg, dQac0_dVb, dQsub0_dVg, dQsub0_dVd, dQsub0_dVb; +double ggidld, ggidlg, ggidlb, ggislg, ggislb, ggisls; +double Igisl, Ggislg, Ggislb, Ggisls; +double Nvtmrss, Nvtmrssws, Nvtmrsswgs; +double Nvtmrsd, Nvtmrsswd, Nvtmrsswgd; + +double vs, Fsevl, dvs_dVg, dvs_dVd, dvs_dVb, dFsevl_dVg, dFsevl_dVd, dFsevl_dVb; +double vgdx, vgsx, epssub, toxe, epsrox; +struct bsim4v6SizeDependParam *pParam; +int ByPass, ChargeComputationNeeded, error, Check, Check1, Check2; + +double m; + +#ifdef USE_OMP4 +model = here->BSIM4v6modPtr; +#endif + +ScalingFactor = 1.0e-9; +ChargeComputationNeeded = + ((ckt->CKTmode & (MODEAC | MODETRAN | MODEINITSMSIG)) || + ((ckt->CKTmode & MODETRANOP) && (ckt->CKTmode & MODEUIC))) + ? 1 : 0; + +#ifndef USE_OMP4 +for (; model != NULL; model = model->BSIM4v6nextModel) +{ for (here = model->BSIM4v6instances; here != NULL; + here = here->BSIM4v6nextInstance) + { if (here->BSIM4v6owner != ARCHme) continue; +#endif + + Check = Check1 = Check2 = 1; + ByPass = 0; + pParam = here->pParam; + + if ((ckt->CKTmode & MODEINITSMSIG)) + { vds = *(ckt->CKTstate0 + here->BSIM4v6vds); + vgs = *(ckt->CKTstate0 + here->BSIM4v6vgs); + vbs = *(ckt->CKTstate0 + here->BSIM4v6vbs); + vges = *(ckt->CKTstate0 + here->BSIM4v6vges); + vgms = *(ckt->CKTstate0 + here->BSIM4v6vgms); + vdbs = *(ckt->CKTstate0 + here->BSIM4v6vdbs); + vsbs = *(ckt->CKTstate0 + here->BSIM4v6vsbs); + vses = *(ckt->CKTstate0 + here->BSIM4v6vses); + vdes = *(ckt->CKTstate0 + here->BSIM4v6vdes); + + qdef = *(ckt->CKTstate0 + here->BSIM4v6qdef); + } + else if ((ckt->CKTmode & MODEINITTRAN)) + { vds = *(ckt->CKTstate1 + here->BSIM4v6vds); + vgs = *(ckt->CKTstate1 + here->BSIM4v6vgs); + vbs = *(ckt->CKTstate1 + here->BSIM4v6vbs); + vges = *(ckt->CKTstate1 + here->BSIM4v6vges); + vgms = *(ckt->CKTstate1 + here->BSIM4v6vgms); + vdbs = *(ckt->CKTstate1 + here->BSIM4v6vdbs); + vsbs = *(ckt->CKTstate1 + here->BSIM4v6vsbs); + vses = *(ckt->CKTstate1 + here->BSIM4v6vses); + vdes = *(ckt->CKTstate1 + here->BSIM4v6vdes); + + qdef = *(ckt->CKTstate1 + here->BSIM4v6qdef); + } + else if ((ckt->CKTmode & MODEINITJCT) && !here->BSIM4v6off) + { vds = model->BSIM4v6type * here->BSIM4v6icVDS; + vgs = vges = vgms = model->BSIM4v6type * here->BSIM4v6icVGS; + vbs = vdbs = vsbs = model->BSIM4v6type * here->BSIM4v6icVBS; + if (vds > 0.0) + { vdes = vds + 0.01; + vses = -0.01; + } + else if (vds < 0.0) + { vdes = vds - 0.01; + vses = 0.01; + } + else + vdes = vses = 0.0; + + qdef = 0.0; + + if ((vds == 0.0) && (vgs == 0.0) && (vbs == 0.0) && + ((ckt->CKTmode & (MODETRAN | MODEAC|MODEDCOP | + MODEDCTRANCURVE)) || (!(ckt->CKTmode & MODEUIC)))) + { vds = 0.1; + vdes = 0.11; + vses = -0.01; + vgs = vges = vgms = model->BSIM4v6type + * here->BSIM4v6vth0 + 0.1; + vbs = vdbs = vsbs = 0.0; + } + } + else if ((ckt->CKTmode & (MODEINITJCT | MODEINITFIX)) && + (here->BSIM4v6off)) + { vds = vgs = vbs = vges = vgms = 0.0; + vdbs = vsbs = vdes = vses = qdef = 0.0; + } + else + { +#ifndef PREDICTOR + if ((ckt->CKTmode & MODEINITPRED)) + { xfact = ckt->CKTdelta / ckt->CKTdeltaOld[1]; + *(ckt->CKTstate0 + here->BSIM4v6vds) = + *(ckt->CKTstate1 + here->BSIM4v6vds); + vds = (1.0 + xfact)* (*(ckt->CKTstate1 + here->BSIM4v6vds)) + - (xfact * (*(ckt->CKTstate2 + here->BSIM4v6vds))); + *(ckt->CKTstate0 + here->BSIM4v6vgs) = + *(ckt->CKTstate1 + here->BSIM4v6vgs); + vgs = (1.0 + xfact)* (*(ckt->CKTstate1 + here->BSIM4v6vgs)) + - (xfact * (*(ckt->CKTstate2 + here->BSIM4v6vgs))); + *(ckt->CKTstate0 + here->BSIM4v6vges) = + *(ckt->CKTstate1 + here->BSIM4v6vges); + vges = (1.0 + xfact)* (*(ckt->CKTstate1 + here->BSIM4v6vges)) + - (xfact * (*(ckt->CKTstate2 + here->BSIM4v6vges))); + *(ckt->CKTstate0 + here->BSIM4v6vgms) = + *(ckt->CKTstate1 + here->BSIM4v6vgms); + vgms = (1.0 + xfact)* (*(ckt->CKTstate1 + here->BSIM4v6vgms)) + - (xfact * (*(ckt->CKTstate2 + here->BSIM4v6vgms))); + *(ckt->CKTstate0 + here->BSIM4v6vbs) = + *(ckt->CKTstate1 + here->BSIM4v6vbs); + vbs = (1.0 + xfact)* (*(ckt->CKTstate1 + here->BSIM4v6vbs)) + - (xfact * (*(ckt->CKTstate2 + here->BSIM4v6vbs))); + *(ckt->CKTstate0 + here->BSIM4v6vbd) = + *(ckt->CKTstate0 + here->BSIM4v6vbs) + - *(ckt->CKTstate0 + here->BSIM4v6vds); + *(ckt->CKTstate0 + here->BSIM4v6vdbs) = + *(ckt->CKTstate1 + here->BSIM4v6vdbs); + vdbs = (1.0 + xfact)* (*(ckt->CKTstate1 + here->BSIM4v6vdbs)) + - (xfact * (*(ckt->CKTstate2 + here->BSIM4v6vdbs))); + *(ckt->CKTstate0 + here->BSIM4v6vdbd) = + *(ckt->CKTstate0 + here->BSIM4v6vdbs) + - *(ckt->CKTstate0 + here->BSIM4v6vds); + *(ckt->CKTstate0 + here->BSIM4v6vsbs) = + *(ckt->CKTstate1 + here->BSIM4v6vsbs); + vsbs = (1.0 + xfact)* (*(ckt->CKTstate1 + here->BSIM4v6vsbs)) + - (xfact * (*(ckt->CKTstate2 + here->BSIM4v6vsbs))); + *(ckt->CKTstate0 + here->BSIM4v6vses) = + *(ckt->CKTstate1 + here->BSIM4v6vses); + vses = (1.0 + xfact)* (*(ckt->CKTstate1 + here->BSIM4v6vses)) + - (xfact * (*(ckt->CKTstate2 + here->BSIM4v6vses))); + *(ckt->CKTstate0 + here->BSIM4v6vdes) = + *(ckt->CKTstate1 + here->BSIM4v6vdes); + vdes = (1.0 + xfact)* (*(ckt->CKTstate1 + here->BSIM4v6vdes)) + - (xfact * (*(ckt->CKTstate2 + here->BSIM4v6vdes))); + + *(ckt->CKTstate0 + here->BSIM4v6qdef) = + *(ckt->CKTstate1 + here->BSIM4v6qdef); + qdef = (1.0 + xfact)* (*(ckt->CKTstate1 + here->BSIM4v6qdef)) + -(xfact * (*(ckt->CKTstate2 + here->BSIM4v6qdef))); + } + else + { +#endif /* PREDICTOR */ + vds = model->BSIM4v6type + * (*(ckt->CKTrhsOld + here->BSIM4v6dNodePrime) + - *(ckt->CKTrhsOld + here->BSIM4v6sNodePrime)); + vgs = model->BSIM4v6type + * (*(ckt->CKTrhsOld + here->BSIM4v6gNodePrime) + - *(ckt->CKTrhsOld + here->BSIM4v6sNodePrime)); + vbs = model->BSIM4v6type + * (*(ckt->CKTrhsOld + here->BSIM4v6bNodePrime) + - *(ckt->CKTrhsOld + here->BSIM4v6sNodePrime)); + vges = model->BSIM4v6type + * (*(ckt->CKTrhsOld + here->BSIM4v6gNodeExt) + - *(ckt->CKTrhsOld + here->BSIM4v6sNodePrime)); + vgms = model->BSIM4v6type + * (*(ckt->CKTrhsOld + here->BSIM4v6gNodeMid) + - *(ckt->CKTrhsOld + here->BSIM4v6sNodePrime)); + vdbs = model->BSIM4v6type + * (*(ckt->CKTrhsOld + here->BSIM4v6dbNode) + - *(ckt->CKTrhsOld + here->BSIM4v6sNodePrime)); + vsbs = model->BSIM4v6type + * (*(ckt->CKTrhsOld + here->BSIM4v6sbNode) + - *(ckt->CKTrhsOld + here->BSIM4v6sNodePrime)); + vses = model->BSIM4v6type + * (*(ckt->CKTrhsOld + here->BSIM4v6sNode) + - *(ckt->CKTrhsOld + here->BSIM4v6sNodePrime)); + vdes = model->BSIM4v6type + * (*(ckt->CKTrhsOld + here->BSIM4v6dNode) + - *(ckt->CKTrhsOld + here->BSIM4v6sNodePrime)); + qdef = model->BSIM4v6type + * (*(ckt->CKTrhsOld + here->BSIM4v6qNode)); +#ifndef PREDICTOR + } +#endif /* PREDICTOR */ + + vgdo = *(ckt->CKTstate0 + here->BSIM4v6vgs) + - *(ckt->CKTstate0 + here->BSIM4v6vds); + vgedo = *(ckt->CKTstate0 + here->BSIM4v6vges) + - *(ckt->CKTstate0 + here->BSIM4v6vds); + vgmdo = *(ckt->CKTstate0 + here->BSIM4v6vgms) + - *(ckt->CKTstate0 + here->BSIM4v6vds); + + vbd = vbs - vds; + vdbd = vdbs - vds; + vgd = vgs - vds; + vged = vges - vds; + vgmd = vgms - vds; + + delvbd = vbd - *(ckt->CKTstate0 + here->BSIM4v6vbd); + delvdbd = vdbd - *(ckt->CKTstate0 + here->BSIM4v6vdbd); + delvgd = vgd - vgdo; + delvged = vged - vgedo; + delvgmd = vgmd - vgmdo; + + delvds = vds - *(ckt->CKTstate0 + here->BSIM4v6vds); + delvgs = vgs - *(ckt->CKTstate0 + here->BSIM4v6vgs); + delvges = vges - *(ckt->CKTstate0 + here->BSIM4v6vges); + delvgms = vgms - *(ckt->CKTstate0 + here->BSIM4v6vgms); + delvbs = vbs - *(ckt->CKTstate0 + here->BSIM4v6vbs); + delvdbs = vdbs - *(ckt->CKTstate0 + here->BSIM4v6vdbs); + delvsbs = vsbs - *(ckt->CKTstate0 + here->BSIM4v6vsbs); + + delvses = vses - (*(ckt->CKTstate0 + here->BSIM4v6vses)); + vdedo = *(ckt->CKTstate0 + here->BSIM4v6vdes) + - *(ckt->CKTstate0 + here->BSIM4v6vds); + delvdes = vdes - *(ckt->CKTstate0 + here->BSIM4v6vdes); + delvded = vdes - vds - vdedo; + + delvbd_jct = (!here->BSIM4v6rbodyMod) ? delvbd : delvdbd; + delvbs_jct = (!here->BSIM4v6rbodyMod) ? delvbs : delvsbs; + if (here->BSIM4v6mode >= 0) + { Idtot = here->BSIM4v6cd + here->BSIM4v6csub - here->BSIM4v6cbd + + here->BSIM4v6Igidl; + cdhat = Idtot - here->BSIM4v6gbd * delvbd_jct + + (here->BSIM4v6gmbs + here->BSIM4v6gbbs + here->BSIM4v6ggidlb) * delvbs + + (here->BSIM4v6gm + here->BSIM4v6gbgs + here->BSIM4v6ggidlg) * delvgs + + (here->BSIM4v6gds + here->BSIM4v6gbds + here->BSIM4v6ggidld) * delvds; + Ibtot = here->BSIM4v6cbs + here->BSIM4v6cbd + - here->BSIM4v6Igidl - here->BSIM4v6Igisl - here->BSIM4v6csub; + cbhat = Ibtot + here->BSIM4v6gbd * delvbd_jct + + here->BSIM4v6gbs * delvbs_jct - (here->BSIM4v6gbbs + here->BSIM4v6ggidlb) + * delvbs - (here->BSIM4v6gbgs + here->BSIM4v6ggidlg) * delvgs + - (here->BSIM4v6gbds + here->BSIM4v6ggidld - here->BSIM4v6ggisls) * delvds + - here->BSIM4v6ggislg * delvgd - here->BSIM4v6ggislb* delvbd; + + Igstot = here->BSIM4v6Igs + here->BSIM4v6Igcs; + cgshat = Igstot + (here->BSIM4v6gIgsg + here->BSIM4v6gIgcsg) * delvgs + + here->BSIM4v6gIgcsd * delvds + here->BSIM4v6gIgcsb * delvbs; + + Igdtot = here->BSIM4v6Igd + here->BSIM4v6Igcd; + cgdhat = Igdtot + here->BSIM4v6gIgdg * delvgd + here->BSIM4v6gIgcdg * delvgs + + here->BSIM4v6gIgcdd * delvds + here->BSIM4v6gIgcdb * delvbs; + + Igbtot = here->BSIM4v6Igb; + cgbhat = here->BSIM4v6Igb + here->BSIM4v6gIgbg * delvgs + here->BSIM4v6gIgbd + * delvds + here->BSIM4v6gIgbb * delvbs; + } + else + { Idtot = here->BSIM4v6cd + here->BSIM4v6cbd - here->BSIM4v6Igidl; /* bugfix */ + cdhat = Idtot + here->BSIM4v6gbd * delvbd_jct + here->BSIM4v6gmbs + * delvbd + here->BSIM4v6gm * delvgd + - (here->BSIM4v6gds + here->BSIM4v6ggidls) * delvds + - here->BSIM4v6ggidlg * delvgs - here->BSIM4v6ggidlb * delvbs; + Ibtot = here->BSIM4v6cbs + here->BSIM4v6cbd + - here->BSIM4v6Igidl - here->BSIM4v6Igisl - here->BSIM4v6csub; + cbhat = Ibtot + here->BSIM4v6gbs * delvbs_jct + here->BSIM4v6gbd + * delvbd_jct - (here->BSIM4v6gbbs + here->BSIM4v6ggislb) * delvbd + - (here->BSIM4v6gbgs + here->BSIM4v6ggislg) * delvgd + + (here->BSIM4v6gbds + here->BSIM4v6ggisld - here->BSIM4v6ggidls) * delvds + - here->BSIM4v6ggidlg * delvgs - here->BSIM4v6ggidlb * delvbs; + + Igstot = here->BSIM4v6Igs + here->BSIM4v6Igcd; + cgshat = Igstot + here->BSIM4v6gIgsg * delvgs + here->BSIM4v6gIgcdg * delvgd + - here->BSIM4v6gIgcdd * delvds + here->BSIM4v6gIgcdb * delvbd; + + Igdtot = here->BSIM4v6Igd + here->BSIM4v6Igcs; + cgdhat = Igdtot + (here->BSIM4v6gIgdg + here->BSIM4v6gIgcsg) * delvgd + - here->BSIM4v6gIgcsd * delvds + here->BSIM4v6gIgcsb * delvbd; + + Igbtot = here->BSIM4v6Igb; + cgbhat = here->BSIM4v6Igb + here->BSIM4v6gIgbg * delvgd - here->BSIM4v6gIgbd + * delvds + here->BSIM4v6gIgbb * delvbd; + } + + Isestot = here->BSIM4v6gstot * (*(ckt->CKTstate0 + here->BSIM4v6vses)); + cseshat = Isestot + here->BSIM4v6gstot * delvses + + here->BSIM4v6gstotd * delvds + here->BSIM4v6gstotg * delvgs + + here->BSIM4v6gstotb * delvbs; + + Idedtot = here->BSIM4v6gdtot * vdedo; + cdedhat = Idedtot + here->BSIM4v6gdtot * delvded + + here->BSIM4v6gdtotd * delvds + here->BSIM4v6gdtotg * delvgs + + here->BSIM4v6gdtotb * delvbs; + + +#ifndef NOBYPASS + /* Following should be one IF statement, but some C compilers + * can't handle that all at once, so we split it into several + * successive IF's */ + + if ((!(ckt->CKTmode & MODEINITPRED)) && (ckt->CKTbypass)) + if ((fabs(delvds) < (ckt->CKTreltol * MAX(fabs(vds), + fabs(*(ckt->CKTstate0 + here->BSIM4v6vds))) + ckt->CKTvoltTol))) + if ((fabs(delvgs) < (ckt->CKTreltol * MAX(fabs(vgs), + fabs(*(ckt->CKTstate0 + here->BSIM4v6vgs))) + ckt->CKTvoltTol))) + if ((fabs(delvbs) < (ckt->CKTreltol * MAX(fabs(vbs), + fabs(*(ckt->CKTstate0 + here->BSIM4v6vbs))) + ckt->CKTvoltTol))) + if ((fabs(delvbd) < (ckt->CKTreltol * MAX(fabs(vbd), + fabs(*(ckt->CKTstate0 + here->BSIM4v6vbd))) + ckt->CKTvoltTol))) + if ((here->BSIM4v6rgateMod == 0) || (here->BSIM4v6rgateMod == 1) + || (fabs(delvges) < (ckt->CKTreltol * MAX(fabs(vges), + fabs(*(ckt->CKTstate0 + here->BSIM4v6vges))) + ckt->CKTvoltTol))) + if ((here->BSIM4v6rgateMod != 3) || (fabs(delvgms) < (ckt->CKTreltol + * MAX(fabs(vgms), fabs(*(ckt->CKTstate0 + here->BSIM4v6vgms))) + + ckt->CKTvoltTol))) + if ((!here->BSIM4v6rbodyMod) || (fabs(delvdbs) < (ckt->CKTreltol + * MAX(fabs(vdbs), fabs(*(ckt->CKTstate0 + here->BSIM4v6vdbs))) + + ckt->CKTvoltTol))) + if ((!here->BSIM4v6rbodyMod) || (fabs(delvdbd) < (ckt->CKTreltol + * MAX(fabs(vdbd), fabs(*(ckt->CKTstate0 + here->BSIM4v6vdbd))) + + ckt->CKTvoltTol))) + if ((!here->BSIM4v6rbodyMod) || (fabs(delvsbs) < (ckt->CKTreltol + * MAX(fabs(vsbs), fabs(*(ckt->CKTstate0 + here->BSIM4v6vsbs))) + + ckt->CKTvoltTol))) + if ((!model->BSIM4v6rdsMod) || (fabs(delvses) < (ckt->CKTreltol + * MAX(fabs(vses), fabs(*(ckt->CKTstate0 + here->BSIM4v6vses))) + + ckt->CKTvoltTol))) + if ((!model->BSIM4v6rdsMod) || (fabs(delvdes) < (ckt->CKTreltol + * MAX(fabs(vdes), fabs(*(ckt->CKTstate0 + here->BSIM4v6vdes))) + + ckt->CKTvoltTol))) + if ((fabs(cdhat - Idtot) < ckt->CKTreltol + * MAX(fabs(cdhat), fabs(Idtot)) + ckt->CKTabstol)) + if ((fabs(cbhat - Ibtot) < ckt->CKTreltol + * MAX(fabs(cbhat), fabs(Ibtot)) + ckt->CKTabstol)) + if ((!model->BSIM4v6igcMod) || ((fabs(cgshat - Igstot) < ckt->CKTreltol + * MAX(fabs(cgshat), fabs(Igstot)) + ckt->CKTabstol))) + if ((!model->BSIM4v6igcMod) || ((fabs(cgdhat - Igdtot) < ckt->CKTreltol + * MAX(fabs(cgdhat), fabs(Igdtot)) + ckt->CKTabstol))) + if ((!model->BSIM4v6igbMod) || ((fabs(cgbhat - Igbtot) < ckt->CKTreltol + * MAX(fabs(cgbhat), fabs(Igbtot)) + ckt->CKTabstol))) + if ((!model->BSIM4v6rdsMod) || ((fabs(cseshat - Isestot) < ckt->CKTreltol + * MAX(fabs(cseshat), fabs(Isestot)) + ckt->CKTabstol))) + if ((!model->BSIM4v6rdsMod) || ((fabs(cdedhat - Idedtot) < ckt->CKTreltol + * MAX(fabs(cdedhat), fabs(Idedtot)) + ckt->CKTabstol))) + { vds = *(ckt->CKTstate0 + here->BSIM4v6vds); + vgs = *(ckt->CKTstate0 + here->BSIM4v6vgs); + vbs = *(ckt->CKTstate0 + here->BSIM4v6vbs); + vges = *(ckt->CKTstate0 + here->BSIM4v6vges); + vgms = *(ckt->CKTstate0 + here->BSIM4v6vgms); + + vbd = *(ckt->CKTstate0 + here->BSIM4v6vbd); + vdbs = *(ckt->CKTstate0 + here->BSIM4v6vdbs); + vdbd = *(ckt->CKTstate0 + here->BSIM4v6vdbd); + vsbs = *(ckt->CKTstate0 + here->BSIM4v6vsbs); + vses = *(ckt->CKTstate0 + here->BSIM4v6vses); + vdes = *(ckt->CKTstate0 + here->BSIM4v6vdes); + + vgd = vgs - vds; + vgb = vgs - vbs; + vged = vges - vds; + vgmd = vgms - vds; + vgmb = vgms - vbs; + + vbs_jct = (!here->BSIM4v6rbodyMod) ? vbs : vsbs; + vbd_jct = (!here->BSIM4v6rbodyMod) ? vbd : vdbd; + +/*** qdef should not be kept fixed even if vgs, vds & vbs has converged +**** qdef = *(ckt->CKTstate0 + here->BSIM4v6qdef); +***/ + cdrain = here->BSIM4v6cd; + + if ((ckt->CKTmode & (MODETRAN | MODEAC)) || + ((ckt->CKTmode & MODETRANOP) && + (ckt->CKTmode & MODEUIC))) + { ByPass = 1; + + qgate = here->BSIM4v6qgate; + qbulk = here->BSIM4v6qbulk; + qdrn = here->BSIM4v6qdrn; + cgdo = here->BSIM4v6cgdo; + qgdo = here->BSIM4v6qgdo; + cgso = here->BSIM4v6cgso; + qgso = here->BSIM4v6qgso; + + goto line755; + } + else + goto line850; + } +#endif /*NOBYPASS*/ + + von = here->BSIM4v6von; + if (*(ckt->CKTstate0 + here->BSIM4v6vds) >= 0.0) + { vgs = DEVfetlim(vgs, *(ckt->CKTstate0 + here->BSIM4v6vgs), von); + vds = vgs - vgd; + vds = DEVlimvds(vds, *(ckt->CKTstate0 + here->BSIM4v6vds)); + vgd = vgs - vds; + if (here->BSIM4v6rgateMod == 3) + { vges = DEVfetlim(vges, *(ckt->CKTstate0 + here->BSIM4v6vges), von); + vgms = DEVfetlim(vgms, *(ckt->CKTstate0 + here->BSIM4v6vgms), von); + vged = vges - vds; + vgmd = vgms - vds; + } + else if ((here->BSIM4v6rgateMod == 1) || (here->BSIM4v6rgateMod == 2)) + { vges = DEVfetlim(vges, *(ckt->CKTstate0 + here->BSIM4v6vges), von); + vged = vges - vds; + } + + if (model->BSIM4v6rdsMod) + { vdes = DEVlimvds(vdes, *(ckt->CKTstate0 + here->BSIM4v6vdes)); + vses = -DEVlimvds(-vses, -(*(ckt->CKTstate0 + here->BSIM4v6vses))); + } + + } + else + { vgd = DEVfetlim(vgd, vgdo, von); + vds = vgs - vgd; + vds = -DEVlimvds(-vds, -(*(ckt->CKTstate0 + here->BSIM4v6vds))); + vgs = vgd + vds; + + if (here->BSIM4v6rgateMod == 3) + { vged = DEVfetlim(vged, vgedo, von); + vges = vged + vds; + vgmd = DEVfetlim(vgmd, vgmdo, von); + vgms = vgmd + vds; + } + if ((here->BSIM4v6rgateMod == 1) || (here->BSIM4v6rgateMod == 2)) + { vged = DEVfetlim(vged, vgedo, von); + vges = vged + vds; + } + + if (model->BSIM4v6rdsMod) + { vdes = -DEVlimvds(-vdes, -(*(ckt->CKTstate0 + here->BSIM4v6vdes))); + vses = DEVlimvds(vses, *(ckt->CKTstate0 + here->BSIM4v6vses)); + } + } + + if (vds >= 0.0) + { vbs = DEVpnjlim(vbs, *(ckt->CKTstate0 + here->BSIM4v6vbs), + CONSTvt0, model->BSIM4v6vcrit, &Check); + vbd = vbs - vds; + if (here->BSIM4v6rbodyMod) + { vdbs = DEVpnjlim(vdbs, *(ckt->CKTstate0 + here->BSIM4v6vdbs), + CONSTvt0, model->BSIM4v6vcrit, &Check1); + vdbd = vdbs - vds; + vsbs = DEVpnjlim(vsbs, *(ckt->CKTstate0 + here->BSIM4v6vsbs), + CONSTvt0, model->BSIM4v6vcrit, &Check2); + if ((Check1 == 0) && (Check2 == 0)) + Check = 0; + else + Check = 1; + } + } + else + { vbd = DEVpnjlim(vbd, *(ckt->CKTstate0 + here->BSIM4v6vbd), + CONSTvt0, model->BSIM4v6vcrit, &Check); + vbs = vbd + vds; + if (here->BSIM4v6rbodyMod) + { vdbd = DEVpnjlim(vdbd, *(ckt->CKTstate0 + here->BSIM4v6vdbd), + CONSTvt0, model->BSIM4v6vcrit, &Check1); + vdbs = vdbd + vds; + vsbdo = *(ckt->CKTstate0 + here->BSIM4v6vsbs) + - *(ckt->CKTstate0 + here->BSIM4v6vds); + vsbd = vsbs - vds; + vsbd = DEVpnjlim(vsbd, vsbdo, CONSTvt0, model->BSIM4v6vcrit, &Check2); + vsbs = vsbd + vds; + if ((Check1 == 0) && (Check2 == 0)) + Check = 0; + else + Check = 1; + } + } + } + + /* Calculate DC currents and their derivatives */ + vbd = vbs - vds; + vgd = vgs - vds; + vgb = vgs - vbs; + vged = vges - vds; + vgmd = vgms - vds; + vgmb = vgms - vbs; + vdbd = vdbs - vds; + + vbs_jct = (!here->BSIM4v6rbodyMod) ? vbs : vsbs; + vbd_jct = (!here->BSIM4v6rbodyMod) ? vbd : vdbd; + + /* Source/drain junction diode DC model begins */ + Nvtms = model->BSIM4v6vtm * model->BSIM4v6SjctEmissionCoeff; + if ((here->BSIM4v6Aseff <= 0.0) && (here->BSIM4v6Pseff <= 0.0)) + { SourceSatCurrent = 0.0; + } + else + { SourceSatCurrent = here->BSIM4v6Aseff * model->BSIM4v6SjctTempSatCurDensity + + here->BSIM4v6Pseff * model->BSIM4v6SjctSidewallTempSatCurDensity + + pParam->BSIM4v6weffCJ * here->BSIM4v6nf + * model->BSIM4v6SjctGateSidewallTempSatCurDensity; + } + + if (SourceSatCurrent <= 0.0) + { here->BSIM4v6gbs = ckt->CKTgmin; + here->BSIM4v6cbs = here->BSIM4v6gbs * vbs_jct; + } + else + { switch(model->BSIM4v6dioMod) + { case 0: + evbs = exp(vbs_jct / Nvtms); + T1 = model->BSIM4v6xjbvs * exp(-(model->BSIM4v6bvs + vbs_jct) / Nvtms); + /* WDLiu: Magic T1 in this form; different from BSIM4v6 beta. */ + here->BSIM4v6gbs = SourceSatCurrent * (evbs + T1) / Nvtms + ckt->CKTgmin; + here->BSIM4v6cbs = SourceSatCurrent * (evbs + here->BSIM4v6XExpBVS + - T1 - 1.0) + ckt->CKTgmin * vbs_jct; + break; + case 1: + T2 = vbs_jct / Nvtms; + if (T2 < -EXP_THRESHOLD) + { here->BSIM4v6gbs = ckt->CKTgmin; + here->BSIM4v6cbs = SourceSatCurrent * (MIN_EXP - 1.0) + + ckt->CKTgmin * vbs_jct; + } + else if (vbs_jct <= here->BSIM4v6vjsmFwd) + { evbs = exp(T2); + here->BSIM4v6gbs = SourceSatCurrent * evbs / Nvtms + ckt->CKTgmin; + here->BSIM4v6cbs = SourceSatCurrent * (evbs - 1.0) + + ckt->CKTgmin * vbs_jct; + } + else + { T0 = here->BSIM4v6IVjsmFwd / Nvtms; + here->BSIM4v6gbs = T0 + ckt->CKTgmin; + here->BSIM4v6cbs = here->BSIM4v6IVjsmFwd - SourceSatCurrent + T0 + * (vbs_jct - here->BSIM4v6vjsmFwd) + ckt->CKTgmin * vbs_jct; + } + break; + case 2: + if (vbs_jct < here->BSIM4v6vjsmRev) + { T0 = vbs_jct / Nvtms; + if (T0 < -EXP_THRESHOLD) + { evbs = MIN_EXP; + devbs_dvb = 0.0; + } + else + { evbs = exp(T0); + devbs_dvb = evbs / Nvtms; + } + + T1 = evbs - 1.0; + T2 = here->BSIM4v6IVjsmRev + here->BSIM4v6SslpRev + * (vbs_jct - here->BSIM4v6vjsmRev); + here->BSIM4v6gbs = devbs_dvb * T2 + T1 * here->BSIM4v6SslpRev + ckt->CKTgmin; + here->BSIM4v6cbs = T1 * T2 + ckt->CKTgmin * vbs_jct; + } + else if (vbs_jct <= here->BSIM4v6vjsmFwd) + { T0 = vbs_jct / Nvtms; + if (T0 < -EXP_THRESHOLD) + { evbs = MIN_EXP; + devbs_dvb = 0.0; + } + else + { evbs = exp(T0); + devbs_dvb = evbs / Nvtms; + } + + T1 = (model->BSIM4v6bvs + vbs_jct) / Nvtms; + if (T1 > EXP_THRESHOLD) + { T2 = MIN_EXP; + T3 = 0.0; + } + else + { T2 = exp(-T1); + T3 = -T2 /Nvtms; + } + here->BSIM4v6gbs = SourceSatCurrent * (devbs_dvb - model->BSIM4v6xjbvs * T3) + + ckt->CKTgmin; + here->BSIM4v6cbs = SourceSatCurrent * (evbs + here->BSIM4v6XExpBVS - 1.0 + - model->BSIM4v6xjbvs * T2) + ckt->CKTgmin * vbs_jct; + } + else + { here->BSIM4v6gbs = here->BSIM4v6SslpFwd + ckt->CKTgmin; + here->BSIM4v6cbs = here->BSIM4v6IVjsmFwd + here->BSIM4v6SslpFwd * (vbs_jct + - here->BSIM4v6vjsmFwd) + ckt->CKTgmin * vbs_jct; + } + break; + default: break; + } + } + + Nvtmd = model->BSIM4v6vtm * model->BSIM4v6DjctEmissionCoeff; + if ((here->BSIM4v6Adeff <= 0.0) && (here->BSIM4v6Pdeff <= 0.0)) + { DrainSatCurrent = 0.0; + } + else + { DrainSatCurrent = here->BSIM4v6Adeff * model->BSIM4v6DjctTempSatCurDensity + + here->BSIM4v6Pdeff * model->BSIM4v6DjctSidewallTempSatCurDensity + + pParam->BSIM4v6weffCJ * here->BSIM4v6nf + * model->BSIM4v6DjctGateSidewallTempSatCurDensity; + } + + if (DrainSatCurrent <= 0.0) + { here->BSIM4v6gbd = ckt->CKTgmin; + here->BSIM4v6cbd = here->BSIM4v6gbd * vbd_jct; + } + else + { switch(model->BSIM4v6dioMod) + { case 0: + evbd = exp(vbd_jct / Nvtmd); + T1 = model->BSIM4v6xjbvd * exp(-(model->BSIM4v6bvd + vbd_jct) / Nvtmd); + /* WDLiu: Magic T1 in this form; different from BSIM4v6 beta. */ + here->BSIM4v6gbd = DrainSatCurrent * (evbd + T1) / Nvtmd + ckt->CKTgmin; + here->BSIM4v6cbd = DrainSatCurrent * (evbd + here->BSIM4v6XExpBVD + - T1 - 1.0) + ckt->CKTgmin * vbd_jct; + break; + case 1: + T2 = vbd_jct / Nvtmd; + if (T2 < -EXP_THRESHOLD) + { here->BSIM4v6gbd = ckt->CKTgmin; + here->BSIM4v6cbd = DrainSatCurrent * (MIN_EXP - 1.0) + + ckt->CKTgmin * vbd_jct; + } + else if (vbd_jct <= here->BSIM4v6vjdmFwd) + { evbd = exp(T2); + here->BSIM4v6gbd = DrainSatCurrent * evbd / Nvtmd + ckt->CKTgmin; + here->BSIM4v6cbd = DrainSatCurrent * (evbd - 1.0) + + ckt->CKTgmin * vbd_jct; + } + else + { T0 = here->BSIM4v6IVjdmFwd / Nvtmd; + here->BSIM4v6gbd = T0 + ckt->CKTgmin; + here->BSIM4v6cbd = here->BSIM4v6IVjdmFwd - DrainSatCurrent + T0 + * (vbd_jct - here->BSIM4v6vjdmFwd) + ckt->CKTgmin * vbd_jct; + } + break; + case 2: + if (vbd_jct < here->BSIM4v6vjdmRev) + { T0 = vbd_jct / Nvtmd; + if (T0 < -EXP_THRESHOLD) + { evbd = MIN_EXP; + devbd_dvb = 0.0; + } + else + { evbd = exp(T0); + devbd_dvb = evbd / Nvtmd; + } + + T1 = evbd - 1.0; + T2 = here->BSIM4v6IVjdmRev + here->BSIM4v6DslpRev + * (vbd_jct - here->BSIM4v6vjdmRev); + here->BSIM4v6gbd = devbd_dvb * T2 + T1 * here->BSIM4v6DslpRev + ckt->CKTgmin; + here->BSIM4v6cbd = T1 * T2 + ckt->CKTgmin * vbd_jct; + } + else if (vbd_jct <= here->BSIM4v6vjdmFwd) + { T0 = vbd_jct / Nvtmd; + if (T0 < -EXP_THRESHOLD) + { evbd = MIN_EXP; + devbd_dvb = 0.0; + } + else + { evbd = exp(T0); + devbd_dvb = evbd / Nvtmd; + } + + T1 = (model->BSIM4v6bvd + vbd_jct) / Nvtmd; + if (T1 > EXP_THRESHOLD) + { T2 = MIN_EXP; + T3 = 0.0; + } + else + { T2 = exp(-T1); + T3 = -T2 /Nvtmd; + } + here->BSIM4v6gbd = DrainSatCurrent * (devbd_dvb - model->BSIM4v6xjbvd * T3) + + ckt->CKTgmin; + here->BSIM4v6cbd = DrainSatCurrent * (evbd + here->BSIM4v6XExpBVD - 1.0 + - model->BSIM4v6xjbvd * T2) + ckt->CKTgmin * vbd_jct; + } + else + { here->BSIM4v6gbd = here->BSIM4v6DslpFwd + ckt->CKTgmin; + here->BSIM4v6cbd = here->BSIM4v6IVjdmFwd + here->BSIM4v6DslpFwd * (vbd_jct + - here->BSIM4v6vjdmFwd) + ckt->CKTgmin * vbd_jct; + } + break; + default: break; + } + } + + /* trap-assisted tunneling and recombination current for reverse bias */ + Nvtmrssws = model->BSIM4v6vtm0 * model->BSIM4v6njtsswstemp; + Nvtmrsswgs = model->BSIM4v6vtm0 * model->BSIM4v6njtsswgstemp; + Nvtmrss = model->BSIM4v6vtm0 * model->BSIM4v6njtsstemp; + Nvtmrsswd = model->BSIM4v6vtm0 * model->BSIM4v6njtsswdtemp; + Nvtmrsswgd = model->BSIM4v6vtm0 * model->BSIM4v6njtsswgdtemp; + Nvtmrsd = model->BSIM4v6vtm0 * model->BSIM4v6njtsdtemp; + + if ((model->BSIM4v6vtss - vbs_jct) < (model->BSIM4v6vtss * 1e-3)) + { T9 = 1.0e3; + T0 = - vbs_jct / Nvtmrss * T9; + DEXP(T0, T1, T10); + dT1_dVb = T10 / Nvtmrss * T9; + } else { + T9 = 1.0 / (model->BSIM4v6vtss - vbs_jct); + T0 = -vbs_jct / Nvtmrss * model->BSIM4v6vtss * T9; + dT0_dVb = model->BSIM4v6vtss / Nvtmrss * (T9 + vbs_jct * T9 * T9) ; + DEXP(T0, T1, T10); + dT1_dVb = T10 * dT0_dVb; + } + + if ((model->BSIM4v6vtsd - vbd_jct) < (model->BSIM4v6vtsd * 1e-3) ) + { T9 = 1.0e3; + T0 = -vbd_jct / Nvtmrsd * T9; + DEXP(T0, T2, T10); + dT2_dVb = T10 / Nvtmrsd * T9; + } else { + T9 = 1.0 / (model->BSIM4v6vtsd - vbd_jct); + T0 = -vbd_jct / Nvtmrsd * model->BSIM4v6vtsd * T9; + dT0_dVb = model->BSIM4v6vtsd / Nvtmrsd * (T9 + vbd_jct * T9 * T9) ; + DEXP(T0, T2, T10); + dT2_dVb = T10 * dT0_dVb; + } + + if ((model->BSIM4v6vtssws - vbs_jct) < (model->BSIM4v6vtssws * 1e-3) ) + { T9 = 1.0e3; + T0 = -vbs_jct / Nvtmrssws * T9; + DEXP(T0, T3, T10); + dT3_dVb = T10 / Nvtmrssws * T9; + } else { + T9 = 1.0 / (model->BSIM4v6vtssws - vbs_jct); + T0 = -vbs_jct / Nvtmrssws * model->BSIM4v6vtssws * T9; + dT0_dVb = model->BSIM4v6vtssws / Nvtmrssws * (T9 + vbs_jct * T9 * T9) ; + DEXP(T0, T3, T10); + dT3_dVb = T10 * dT0_dVb; + } + + if ((model->BSIM4v6vtsswd - vbd_jct) < (model->BSIM4v6vtsswd * 1e-3) ) + { T9 = 1.0e3; + T0 = -vbd_jct / Nvtmrsswd * T9; + DEXP(T0, T4, T10); + dT4_dVb = T10 / Nvtmrsswd * T9; + } else { + T9 = 1.0 / (model->BSIM4v6vtsswd - vbd_jct); + T0 = -vbd_jct / Nvtmrsswd * model->BSIM4v6vtsswd * T9; + dT0_dVb = model->BSIM4v6vtsswd / Nvtmrsswd * (T9 + vbd_jct * T9 * T9) ; + DEXP(T0, T4, T10); + dT4_dVb = T10 * dT0_dVb; + } + + if ((model->BSIM4v6vtsswgs - vbs_jct) < (model->BSIM4v6vtsswgs * 1e-3) ) + { T9 = 1.0e3; + T0 = -vbs_jct / Nvtmrsswgs * T9; + DEXP(T0, T5, T10); + dT5_dVb = T10 / Nvtmrsswgs * T9; + } else { + T9 = 1.0 / (model->BSIM4v6vtsswgs - vbs_jct); + T0 = -vbs_jct / Nvtmrsswgs * model->BSIM4v6vtsswgs * T9; + dT0_dVb = model->BSIM4v6vtsswgs / Nvtmrsswgs * (T9 + vbs_jct * T9 * T9) ; + DEXP(T0, T5, T10); + dT5_dVb = T10 * dT0_dVb; + } + + if ((model->BSIM4v6vtsswgd - vbd_jct) < (model->BSIM4v6vtsswgd * 1e-3) ) + { T9 = 1.0e3; + T0 = -vbd_jct / Nvtmrsswgd * T9; + DEXP(T0, T6, T10); + dT6_dVb = T10 / Nvtmrsswgd * T9; + } else { + T9 = 1.0 / (model->BSIM4v6vtsswgd - vbd_jct); + T0 = -vbd_jct / Nvtmrsswgd * model->BSIM4v6vtsswgd * T9; + dT0_dVb = model->BSIM4v6vtsswgd / Nvtmrsswgd * (T9 + vbd_jct * T9 * T9) ; + DEXP(T0, T6, T10); + dT6_dVb = T10 * dT0_dVb; + } + + here->BSIM4v6gbs += here->BSIM4v6SjctTempRevSatCur * dT1_dVb + + here->BSIM4v6SswTempRevSatCur * dT3_dVb + + here->BSIM4v6SswgTempRevSatCur * dT5_dVb; + here->BSIM4v6cbs -= here->BSIM4v6SjctTempRevSatCur * (T1 - 1.0) + + here->BSIM4v6SswTempRevSatCur * (T3 - 1.0) + + here->BSIM4v6SswgTempRevSatCur * (T5 - 1.0); + here->BSIM4v6gbd += here->BSIM4v6DjctTempRevSatCur * dT2_dVb + + here->BSIM4v6DswTempRevSatCur * dT4_dVb + + here->BSIM4v6DswgTempRevSatCur * dT6_dVb; + here->BSIM4v6cbd -= here->BSIM4v6DjctTempRevSatCur * (T2 - 1.0) + + here->BSIM4v6DswTempRevSatCur * (T4 - 1.0) + + here->BSIM4v6DswgTempRevSatCur * (T6 - 1.0); + + /* End of diode DC model */ + + if (vds >= 0.0) + { here->BSIM4v6mode = 1; + Vds = vds; + Vgs = vgs; + Vbs = vbs; + Vdb = vds - vbs; /* WDLiu: for GIDL */ + } + else + { here->BSIM4v6mode = -1; + Vds = -vds; + Vgs = vgd; + Vbs = vbd; + Vdb = -vbs; + } + + + /* dunga */ + if(model->BSIM4v6mtrlMod) + { + epsrox = 3.9; + toxe = model->BSIM4v6eot; + epssub = EPS0 * model->BSIM4v6epsrsub; + } + else + { + epsrox = model->BSIM4v6epsrox; + toxe = model->BSIM4v6toxe; + epssub = EPSSI; + } + + + T0 = Vbs - here->BSIM4v6vbsc - 0.001; + T1 = sqrt(T0 * T0 - 0.004 * here->BSIM4v6vbsc); + if (T0 >= 0.0) + { Vbseff = here->BSIM4v6vbsc + 0.5 * (T0 + T1); + dVbseff_dVb = 0.5 * (1.0 + T0 / T1); + } + else + { T2 = -0.002 / (T1 - T0); + Vbseff = here->BSIM4v6vbsc * (1.0 + T2); + dVbseff_dVb = T2 * here->BSIM4v6vbsc / T1; + } + + /* JX: Correction to forward body bias */ + T9 = 0.95 * pParam->BSIM4v6phi; + T0 = T9 - Vbseff - 0.001; + T1 = sqrt(T0 * T0 + 0.004 * T9); + Vbseff = T9 - 0.5 * (T0 + T1); + dVbseff_dVb *= 0.5 * (1.0 + T0 / T1); + Phis = pParam->BSIM4v6phi - Vbseff; + dPhis_dVb = -1.0; + sqrtPhis = sqrt(Phis); + dsqrtPhis_dVb = -0.5 / sqrtPhis; + + Xdep = pParam->BSIM4v6Xdep0 * sqrtPhis / pParam->BSIM4v6sqrtPhi; + dXdep_dVb = (pParam->BSIM4v6Xdep0 / pParam->BSIM4v6sqrtPhi) + * dsqrtPhis_dVb; + + Leff = pParam->BSIM4v6leff; + Vtm = model->BSIM4v6vtm; + Vtm0 = model->BSIM4v6vtm0; + + /* Vth Calculation */ + T3 = sqrt(Xdep); + V0 = pParam->BSIM4v6vbi - pParam->BSIM4v6phi; + + T0 = pParam->BSIM4v6dvt2 * Vbseff; + if (T0 >= - 0.5) + { T1 = 1.0 + T0; + T2 = pParam->BSIM4v6dvt2; + } + else + { T4 = 1.0 / (3.0 + 8.0 * T0); + T1 = (1.0 + 3.0 * T0) * T4; + T2 = pParam->BSIM4v6dvt2 * T4 * T4; + } + lt1 = model->BSIM4v6factor1 * T3 * T1; + dlt1_dVb = model->BSIM4v6factor1 * (0.5 / T3 * T1 * dXdep_dVb + T3 * T2); + + T0 = pParam->BSIM4v6dvt2w * Vbseff; + if (T0 >= - 0.5) + { T1 = 1.0 + T0; + T2 = pParam->BSIM4v6dvt2w; + } + else + { T4 = 1.0 / (3.0 + 8.0 * T0); + T1 = (1.0 + 3.0 * T0) * T4; + T2 = pParam->BSIM4v6dvt2w * T4 * T4; + } + ltw = model->BSIM4v6factor1 * T3 * T1; + dltw_dVb = model->BSIM4v6factor1 * (0.5 / T3 * T1 * dXdep_dVb + T3 * T2); + + T0 = pParam->BSIM4v6dvt1 * Leff / lt1; + if (T0 < EXP_THRESHOLD) + { T1 = exp(T0); + T2 = T1 - 1.0; + T3 = T2 * T2; + T4 = T3 + 2.0 * T1 * MIN_EXP; + Theta0 = T1 / T4; + dT1_dVb = -T0 * T1 * dlt1_dVb / lt1; + dTheta0_dVb = dT1_dVb * (T4 - 2.0 * T1 * (T2 + MIN_EXP)) / T4 / T4; + } + else + { Theta0 = 1.0 / (MAX_EXP - 2.0); /* 3.0 * MIN_EXP omitted */ + dTheta0_dVb = 0.0; + } + here->BSIM4v6thetavth = pParam->BSIM4v6dvt0 * Theta0; + Delt_vth = here->BSIM4v6thetavth * V0; + dDelt_vth_dVb = pParam->BSIM4v6dvt0 * dTheta0_dVb * V0; + + T0 = pParam->BSIM4v6dvt1w * pParam->BSIM4v6weff * Leff / ltw; + if (T0 < EXP_THRESHOLD) + { T1 = exp(T0); + T2 = T1 - 1.0; + T3 = T2 * T2; + T4 = T3 + 2.0 * T1 * MIN_EXP; + T5 = T1 / T4; + dT1_dVb = -T0 * T1 * dltw_dVb / ltw; + dT5_dVb = dT1_dVb * (T4 - 2.0 * T1 * (T2 + MIN_EXP)) / T4 / T4; + } + else + { T5 = 1.0 / (MAX_EXP - 2.0); /* 3.0 * MIN_EXP omitted */ + dT5_dVb = 0.0; + } + T0 = pParam->BSIM4v6dvt0w * T5; + T2 = T0 * V0; + dT2_dVb = pParam->BSIM4v6dvt0w * dT5_dVb * V0; + + TempRatio = ckt->CKTtemp / model->BSIM4v6tnom - 1.0; + T0 = sqrt(1.0 + pParam->BSIM4v6lpe0 / Leff); + T1 = pParam->BSIM4v6k1ox * (T0 - 1.0) * pParam->BSIM4v6sqrtPhi + + (pParam->BSIM4v6kt1 + pParam->BSIM4v6kt1l / Leff + + pParam->BSIM4v6kt2 * Vbseff) * TempRatio; + Vth_NarrowW = toxe * pParam->BSIM4v6phi + / (pParam->BSIM4v6weff + pParam->BSIM4v6w0); + + T3 = here->BSIM4v6eta0 + pParam->BSIM4v6etab * Vbseff; + if (T3 < 1.0e-4) + { T9 = 1.0 / (3.0 - 2.0e4 * T3); + T3 = (2.0e-4 - T3) * T9; + T4 = T9 * T9; + } + else + { T4 = 1.0; + } + dDIBL_Sft_dVd = T3 * pParam->BSIM4v6theta0vb0; + DIBL_Sft = dDIBL_Sft_dVd * Vds; + + Lpe_Vb = sqrt(1.0 + pParam->BSIM4v6lpeb / Leff); + + Vth = model->BSIM4v6type * here->BSIM4v6vth0 + (pParam->BSIM4v6k1ox * sqrtPhis + - pParam->BSIM4v6k1 * pParam->BSIM4v6sqrtPhi) * Lpe_Vb + - here->BSIM4v6k2ox * Vbseff - Delt_vth - T2 + (pParam->BSIM4v6k3 + + pParam->BSIM4v6k3b * Vbseff) * Vth_NarrowW + T1 - DIBL_Sft; + + dVth_dVb = Lpe_Vb * pParam->BSIM4v6k1ox * dsqrtPhis_dVb - here->BSIM4v6k2ox + - dDelt_vth_dVb - dT2_dVb + pParam->BSIM4v6k3b * Vth_NarrowW + - pParam->BSIM4v6etab * Vds * pParam->BSIM4v6theta0vb0 * T4 + + pParam->BSIM4v6kt2 * TempRatio; + dVth_dVd = -dDIBL_Sft_dVd; + + + /* Calculate n */ + tmp1 = epssub / Xdep; + here->BSIM4v6nstar = model->BSIM4v6vtm / Charge_q * (model->BSIM4v6coxe + + tmp1 + pParam->BSIM4v6cit); + tmp2 = pParam->BSIM4v6nfactor * tmp1; + tmp3 = pParam->BSIM4v6cdsc + pParam->BSIM4v6cdscb * Vbseff + + pParam->BSIM4v6cdscd * Vds; + tmp4 = (tmp2 + tmp3 * Theta0 + pParam->BSIM4v6cit) / model->BSIM4v6coxe; + if (tmp4 >= -0.5) + { n = 1.0 + tmp4; + dn_dVb = (-tmp2 / Xdep * dXdep_dVb + tmp3 * dTheta0_dVb + + pParam->BSIM4v6cdscb * Theta0) / model->BSIM4v6coxe; + dn_dVd = pParam->BSIM4v6cdscd * Theta0 / model->BSIM4v6coxe; + } + else + { T0 = 1.0 / (3.0 + 8.0 * tmp4); + n = (1.0 + 3.0 * tmp4) * T0; + T0 *= T0; + dn_dVb = (-tmp2 / Xdep * dXdep_dVb + tmp3 * dTheta0_dVb + + pParam->BSIM4v6cdscb * Theta0) / model->BSIM4v6coxe * T0; + dn_dVd = pParam->BSIM4v6cdscd * Theta0 / model->BSIM4v6coxe * T0; + } + + + /* Vth correction for Pocket implant */ + if (pParam->BSIM4v6dvtp0 > 0.0) + { T0 = -pParam->BSIM4v6dvtp1 * Vds; + if (T0 < -EXP_THRESHOLD) + { T2 = MIN_EXP; + dT2_dVd = 0.0; + } + else + { T2 = exp(T0); + dT2_dVd = -pParam->BSIM4v6dvtp1 * T2; + } + + T3 = Leff + pParam->BSIM4v6dvtp0 * (1.0 + T2); + dT3_dVd = pParam->BSIM4v6dvtp0 * dT2_dVd; + if (model->BSIM4v6tempMod < 2) + { + T4 = Vtm * log(Leff / T3); + dT4_dVd = -Vtm * dT3_dVd / T3; + } + else + { + T4 = model->BSIM4v6vtm0 * log(Leff / T3); + dT4_dVd = -model->BSIM4v6vtm0 * dT3_dVd / T3; + } + dDITS_Sft_dVd = dn_dVd * T4 + n * dT4_dVd; + dDITS_Sft_dVb = T4 * dn_dVb; + + Vth -= n * T4; + dVth_dVd -= dDITS_Sft_dVd; + dVth_dVb -= dDITS_Sft_dVb; + } + here->BSIM4v6von = Vth; + + + /* Poly Gate Si Depletion Effect */ + T0 = here->BSIM4v6vfb + pParam->BSIM4v6phi; + if(model->BSIM4v6mtrlMod == 0) + T1 = EPSSI; + else + T1 = model->BSIM4v6epsrgate * EPS0; + + + BSIM4v6polyDepletion(T0, pParam->BSIM4v6ngate, T1, model->BSIM4v6coxe, vgs, &vgs_eff, &dvgs_eff_dvg); + + BSIM4v6polyDepletion(T0, pParam->BSIM4v6ngate, T1, model->BSIM4v6coxe, vgd, &vgd_eff, &dvgd_eff_dvg); + + if(here->BSIM4v6mode>0) { + Vgs_eff = vgs_eff; + dVgs_eff_dVg = dvgs_eff_dvg; + } else { + Vgs_eff = vgd_eff; + dVgs_eff_dVg = dvgd_eff_dvg; + } + here->BSIM4v6vgs_eff = vgs_eff; + here->BSIM4v6vgd_eff = vgd_eff; + here->BSIM4v6dvgs_eff_dvg = dvgs_eff_dvg; + here->BSIM4v6dvgd_eff_dvg = dvgd_eff_dvg; + + + Vgst = Vgs_eff - Vth; + + /* Calculate Vgsteff */ + T0 = n * Vtm; + T1 = pParam->BSIM4v6mstar * Vgst; + T2 = T1 / T0; + if (T2 > EXP_THRESHOLD) + { T10 = T1; + dT10_dVg = pParam->BSIM4v6mstar * dVgs_eff_dVg; + dT10_dVd = -dVth_dVd * pParam->BSIM4v6mstar; + dT10_dVb = -dVth_dVb * pParam->BSIM4v6mstar; + } + else if (T2 < -EXP_THRESHOLD) + { T10 = Vtm * log(1.0 + MIN_EXP); + dT10_dVg = 0.0; + dT10_dVd = T10 * dn_dVd; + dT10_dVb = T10 * dn_dVb; + T10 *= n; + } + else + { ExpVgst = exp(T2); + T3 = Vtm * log(1.0 + ExpVgst); + T10 = n * T3; + dT10_dVg = pParam->BSIM4v6mstar * ExpVgst / (1.0 + ExpVgst); + dT10_dVb = T3 * dn_dVb - dT10_dVg * (dVth_dVb + Vgst * dn_dVb / n); + dT10_dVd = T3 * dn_dVd - dT10_dVg * (dVth_dVd + Vgst * dn_dVd / n); + dT10_dVg *= dVgs_eff_dVg; + } + + T1 = pParam->BSIM4v6voffcbn - (1.0 - pParam->BSIM4v6mstar) * Vgst; + T2 = T1 / T0; + if (T2 < -EXP_THRESHOLD) + { T3 = model->BSIM4v6coxe * MIN_EXP / pParam->BSIM4v6cdep0; + T9 = pParam->BSIM4v6mstar + T3 * n; + dT9_dVg = 0.0; + dT9_dVd = dn_dVd * T3; + dT9_dVb = dn_dVb * T3; + } + else if (T2 > EXP_THRESHOLD) + { T3 = model->BSIM4v6coxe * MAX_EXP / pParam->BSIM4v6cdep0; + T9 = pParam->BSIM4v6mstar + T3 * n; + dT9_dVg = 0.0; + dT9_dVd = dn_dVd * T3; + dT9_dVb = dn_dVb * T3; + } + else + { ExpVgst = exp(T2); + T3 = model->BSIM4v6coxe / pParam->BSIM4v6cdep0; + T4 = T3 * ExpVgst; + T5 = T1 * T4 / T0; + T9 = pParam->BSIM4v6mstar + n * T4; + dT9_dVg = T3 * (pParam->BSIM4v6mstar - 1.0) * ExpVgst / Vtm; + dT9_dVb = T4 * dn_dVb - dT9_dVg * dVth_dVb - T5 * dn_dVb; + dT9_dVd = T4 * dn_dVd - dT9_dVg * dVth_dVd - T5 * dn_dVd; + dT9_dVg *= dVgs_eff_dVg; + } + + here->BSIM4v6Vgsteff = Vgsteff = T10 / T9; + T11 = T9 * T9; + dVgsteff_dVg = (T9 * dT10_dVg - T10 * dT9_dVg) / T11; + dVgsteff_dVd = (T9 * dT10_dVd - T10 * dT9_dVd) / T11; + dVgsteff_dVb = (T9 * dT10_dVb - T10 * dT9_dVb) / T11; + + /* Calculate Effective Channel Geometry */ + T9 = sqrtPhis - pParam->BSIM4v6sqrtPhi; + Weff = pParam->BSIM4v6weff - 2.0 * (pParam->BSIM4v6dwg * Vgsteff + + pParam->BSIM4v6dwb * T9); + dWeff_dVg = -2.0 * pParam->BSIM4v6dwg; + dWeff_dVb = -2.0 * pParam->BSIM4v6dwb * dsqrtPhis_dVb; + + if (Weff < 2.0e-8) /* to avoid the discontinuity problem due to Weff*/ + { T0 = 1.0 / (6.0e-8 - 2.0 * Weff); + Weff = 2.0e-8 * (4.0e-8 - Weff) * T0; + T0 *= T0 * 4.0e-16; + dWeff_dVg *= T0; + dWeff_dVb *= T0; + } + + if (model->BSIM4v6rdsMod == 1) + Rds = dRds_dVg = dRds_dVb = 0.0; + else + { T0 = 1.0 + pParam->BSIM4v6prwg * Vgsteff; + dT0_dVg = -pParam->BSIM4v6prwg / T0 / T0; + T1 = pParam->BSIM4v6prwb * T9; + dT1_dVb = pParam->BSIM4v6prwb * dsqrtPhis_dVb; + + T2 = 1.0 / T0 + T1; + T3 = T2 + sqrt(T2 * T2 + 0.01); /* 0.01 = 4.0 * 0.05 * 0.05 */ + dT3_dVg = 1.0 + T2 / (T3 - T2); + dT3_dVb = dT3_dVg * dT1_dVb; + dT3_dVg *= dT0_dVg; + + T4 = pParam->BSIM4v6rds0 * 0.5; + Rds = pParam->BSIM4v6rdswmin + T3 * T4; + dRds_dVg = T4 * dT3_dVg; + dRds_dVb = T4 * dT3_dVb; + + if (Rds > 0.0) + here->BSIM4v6grdsw = 1.0 / Rds* here->BSIM4v6nf; /*4.6.2*/ + else + here->BSIM4v6grdsw = 0.0; + } + + /* Calculate Abulk */ + T9 = 0.5 * pParam->BSIM4v6k1ox * Lpe_Vb / sqrtPhis; + T1 = T9 + here->BSIM4v6k2ox - pParam->BSIM4v6k3b * Vth_NarrowW; + dT1_dVb = -T9 / sqrtPhis * dsqrtPhis_dVb; + + T9 = sqrt(pParam->BSIM4v6xj * Xdep); + tmp1 = Leff + 2.0 * T9; + T5 = Leff / tmp1; + tmp2 = pParam->BSIM4v6a0 * T5; + tmp3 = pParam->BSIM4v6weff + pParam->BSIM4v6b1; + tmp4 = pParam->BSIM4v6b0 / tmp3; + T2 = tmp2 + tmp4; + dT2_dVb = -T9 / tmp1 / Xdep * dXdep_dVb; + T6 = T5 * T5; + T7 = T5 * T6; + + Abulk0 = 1.0 + T1 * T2; + dAbulk0_dVb = T1 * tmp2 * dT2_dVb + T2 * dT1_dVb; + + T8 = pParam->BSIM4v6ags * pParam->BSIM4v6a0 * T7; + dAbulk_dVg = -T1 * T8; + Abulk = Abulk0 + dAbulk_dVg * Vgsteff; + dAbulk_dVb = dAbulk0_dVb - T8 * Vgsteff * (dT1_dVb + + 3.0 * T1 * dT2_dVb); + + if (Abulk0 < 0.1) /* added to avoid the problems caused by Abulk0 */ + { T9 = 1.0 / (3.0 - 20.0 * Abulk0); + Abulk0 = (0.2 - Abulk0) * T9; + dAbulk0_dVb *= T9 * T9; + } + + if (Abulk < 0.1) + { T9 = 1.0 / (3.0 - 20.0 * Abulk); + Abulk = (0.2 - Abulk) * T9; + T10 = T9 * T9; + dAbulk_dVb *= T10; + dAbulk_dVg *= T10; + } + here->BSIM4v6Abulk = Abulk; + + T2 = pParam->BSIM4v6keta * Vbseff; + if (T2 >= -0.9) + { T0 = 1.0 / (1.0 + T2); + dT0_dVb = -pParam->BSIM4v6keta * T0 * T0; + } + else + { T1 = 1.0 / (0.8 + T2); + T0 = (17.0 + 20.0 * T2) * T1; + dT0_dVb = -pParam->BSIM4v6keta * T1 * T1; + } + dAbulk_dVg *= T0; + dAbulk_dVb = dAbulk_dVb * T0 + Abulk * dT0_dVb; + dAbulk0_dVb = dAbulk0_dVb * T0 + Abulk0 * dT0_dVb; + Abulk *= T0; + Abulk0 *= T0; + + /* Mobility calculation */ + if (model->BSIM4v6mtrlMod) + T14 = 2.0 * model->BSIM4v6type *(model->BSIM4v6phig - model->BSIM4v6easub - 0.5*model->BSIM4v6Eg0 + 0.45); + else + T14 = 0.0; + + if (model->BSIM4v6mobMod == 0) + { T0 = Vgsteff + Vth + Vth - T14; + T2 = pParam->BSIM4v6ua + pParam->BSIM4v6uc * Vbseff; + T3 = T0 / toxe; + T12 = sqrt(Vth * Vth + 0.0001); + T9 = 1.0/(Vgsteff + 2*T12); + T10 = T9*toxe; + T8 = pParam->BSIM4v6ud * T10 * T10 * Vth; + T6 = T8 * Vth; + T5 = T3 * (T2 + pParam->BSIM4v6ub * T3) + T6; + T7 = - 2.0 * T6 * T9; + T11 = T7 * Vth/T12; + dDenomi_dVg = (T2 + 2.0 * pParam->BSIM4v6ub * T3) / toxe; + T13 = 2.0 * (dDenomi_dVg + T11 + T8); + dDenomi_dVd = T13 * dVth_dVd; + dDenomi_dVb = T13 * dVth_dVb + pParam->BSIM4v6uc * T3; + dDenomi_dVg+= T7; + } + else if (model->BSIM4v6mobMod == 1) + { T0 = Vgsteff + Vth + Vth - T14; + T2 = 1.0 + pParam->BSIM4v6uc * Vbseff; + T3 = T0 / toxe; + T4 = T3 * (pParam->BSIM4v6ua + pParam->BSIM4v6ub * T3); + T12 = sqrt(Vth * Vth + 0.0001); + T9 = 1.0/(Vgsteff + 2*T12); + T10 = T9*toxe; + T8 = pParam->BSIM4v6ud * T10 * T10 * Vth; + T6 = T8 * Vth; + T5 = T4 * T2 + T6; + T7 = - 2.0 * T6 * T9; + T11 = T7 * Vth/T12; + dDenomi_dVg = (pParam->BSIM4v6ua + 2.0 * pParam->BSIM4v6ub * T3) * T2 / toxe; + T13 = 2.0 * (dDenomi_dVg + T11 + T8); + dDenomi_dVd = T13 * dVth_dVd; + dDenomi_dVb = T13 * dVth_dVb + pParam->BSIM4v6uc * T4; + dDenomi_dVg+= T7; + } + else if (model->BSIM4v6mobMod == 2) + { T0 = (Vgsteff + here->BSIM4v6vtfbphi1) / toxe; + T1 = exp(pParam->BSIM4v6eu * log(T0)); + dT1_dVg = T1 * pParam->BSIM4v6eu / T0 / toxe; + T2 = pParam->BSIM4v6ua + pParam->BSIM4v6uc * Vbseff; + T3 = T0 / toxe; /*Do we need it?*/ + + T12 = sqrt(Vth * Vth + 0.0001); + T9 = 1.0/(Vgsteff + 2*T12); + T10 = T9*toxe; + T8 = pParam->BSIM4v6ud * T10 * T10 * Vth; + T6 = T8 * Vth; + T5 = T1 * T2 + T6; + T7 = - 2.0 * T6 * T9; + T11 = T7 * Vth/T12; + dDenomi_dVg = T2 * dT1_dVg + T7; + T13 = 2.0 * (T11 + T8); + dDenomi_dVd = T13 * dVth_dVd; + dDenomi_dVb = T13 * dVth_dVb + T1 * pParam->BSIM4v6uc; + } + /*high K mobility*/ + else + { + + + /*univsersal mobility*/ + T0 = (Vgsteff + here->BSIM4v6vtfbphi1)* 1.0e-8 / toxe/6.0; + T1 = exp(pParam->BSIM4v6eu * log(T0)); + dT1_dVg = T1 * pParam->BSIM4v6eu * 1.0e-8/ T0 / toxe/6.0; + T2 = pParam->BSIM4v6ua + pParam->BSIM4v6uc * Vbseff; + + /*Coulombic*/ + VgsteffVth = pParam->BSIM4v6VgsteffVth; + + T10 = exp(pParam->BSIM4v6ucs * log(0.5 + 0.5 * Vgsteff/VgsteffVth)); + T11 = pParam->BSIM4v6ud/T10; + dT11_dVg = - 0.5 * pParam->BSIM4v6ucs * T11 /(0.5 + 0.5*Vgsteff/VgsteffVth)/VgsteffVth; + + dDenomi_dVg = T2 * dT1_dVg + dT11_dVg; + dDenomi_dVd = 0.0; + dDenomi_dVb = T1 * pParam->BSIM4v6uc; + + T5 = T1 * T2 + T11; + } + + + + + + if (T5 >= -0.8) + { Denomi = 1.0 + T5; + } + else + { T9 = 1.0 / (7.0 + 10.0 * T5); + Denomi = (0.6 + T5) * T9; + T9 *= T9; + dDenomi_dVg *= T9; + dDenomi_dVd *= T9; + dDenomi_dVb *= T9; + } + + + here->BSIM4v6ueff = ueff = here->BSIM4v6u0temp / Denomi; + T9 = -ueff / Denomi; + dueff_dVg = T9 * dDenomi_dVg; + dueff_dVd = T9 * dDenomi_dVd; + dueff_dVb = T9 * dDenomi_dVb; + + /* Saturation Drain Voltage Vdsat */ + WVCox = Weff * here->BSIM4v6vsattemp * model->BSIM4v6coxe; + WVCoxRds = WVCox * Rds; + + Esat = 2.0 * here->BSIM4v6vsattemp / ueff; + here->BSIM4v6EsatL = EsatL = Esat * Leff; + T0 = -EsatL /ueff; + dEsatL_dVg = T0 * dueff_dVg; + dEsatL_dVd = T0 * dueff_dVd; + dEsatL_dVb = T0 * dueff_dVb; + + /* Sqrt() */ + a1 = pParam->BSIM4v6a1; + if (a1 == 0.0) + { Lambda = pParam->BSIM4v6a2; + dLambda_dVg = 0.0; + } + else if (a1 > 0.0) + { T0 = 1.0 - pParam->BSIM4v6a2; + T1 = T0 - pParam->BSIM4v6a1 * Vgsteff - 0.0001; + T2 = sqrt(T1 * T1 + 0.0004 * T0); + Lambda = pParam->BSIM4v6a2 + T0 - 0.5 * (T1 + T2); + dLambda_dVg = 0.5 * pParam->BSIM4v6a1 * (1.0 + T1 / T2); + } + else + { T1 = pParam->BSIM4v6a2 + pParam->BSIM4v6a1 * Vgsteff - 0.0001; + T2 = sqrt(T1 * T1 + 0.0004 * pParam->BSIM4v6a2); + Lambda = 0.5 * (T1 + T2); + dLambda_dVg = 0.5 * pParam->BSIM4v6a1 * (1.0 + T1 / T2); + } + + Vgst2Vtm = Vgsteff + 2.0 * Vtm; + if (Rds > 0) + { tmp2 = dRds_dVg / Rds + dWeff_dVg / Weff; + tmp3 = dRds_dVb / Rds + dWeff_dVb / Weff; + } + else + { tmp2 = dWeff_dVg / Weff; + tmp3 = dWeff_dVb / Weff; + } + if ((Rds == 0.0) && (Lambda == 1.0)) + { T0 = 1.0 / (Abulk * EsatL + Vgst2Vtm); + tmp1 = 0.0; + T1 = T0 * T0; + T2 = Vgst2Vtm * T0; + T3 = EsatL * Vgst2Vtm; + Vdsat = T3 * T0; + + dT0_dVg = -(Abulk * dEsatL_dVg + EsatL * dAbulk_dVg + 1.0) * T1; + dT0_dVd = -(Abulk * dEsatL_dVd) * T1; + dT0_dVb = -(Abulk * dEsatL_dVb + dAbulk_dVb * EsatL) * T1; + + dVdsat_dVg = T3 * dT0_dVg + T2 * dEsatL_dVg + EsatL * T0; + dVdsat_dVd = T3 * dT0_dVd + T2 * dEsatL_dVd; + dVdsat_dVb = T3 * dT0_dVb + T2 * dEsatL_dVb; + } + else + { tmp1 = dLambda_dVg / (Lambda * Lambda); + T9 = Abulk * WVCoxRds; + T8 = Abulk * T9; + T7 = Vgst2Vtm * T9; + T6 = Vgst2Vtm * WVCoxRds; + T0 = 2.0 * Abulk * (T9 - 1.0 + 1.0 / Lambda); + dT0_dVg = 2.0 * (T8 * tmp2 - Abulk * tmp1 + + (2.0 * T9 + 1.0 / Lambda - 1.0) * dAbulk_dVg); + + dT0_dVb = 2.0 * (T8 * (2.0 / Abulk * dAbulk_dVb + tmp3) + + (1.0 / Lambda - 1.0) * dAbulk_dVb); + dT0_dVd = 0.0; + T1 = Vgst2Vtm * (2.0 / Lambda - 1.0) + Abulk * EsatL + 3.0 * T7; + + dT1_dVg = (2.0 / Lambda - 1.0) - 2.0 * Vgst2Vtm * tmp1 + + Abulk * dEsatL_dVg + EsatL * dAbulk_dVg + 3.0 * (T9 + + T7 * tmp2 + T6 * dAbulk_dVg); + dT1_dVb = Abulk * dEsatL_dVb + EsatL * dAbulk_dVb + + 3.0 * (T6 * dAbulk_dVb + T7 * tmp3); + dT1_dVd = Abulk * dEsatL_dVd; + + T2 = Vgst2Vtm * (EsatL + 2.0 * T6); + dT2_dVg = EsatL + Vgst2Vtm * dEsatL_dVg + + T6 * (4.0 + 2.0 * Vgst2Vtm * tmp2); + dT2_dVb = Vgst2Vtm * (dEsatL_dVb + 2.0 * T6 * tmp3); + dT2_dVd = Vgst2Vtm * dEsatL_dVd; + + T3 = sqrt(T1 * T1 - 2.0 * T0 * T2); + Vdsat = (T1 - T3) / T0; + + dT3_dVg = (T1 * dT1_dVg - 2.0 * (T0 * dT2_dVg + T2 * dT0_dVg)) + / T3; + dT3_dVd = (T1 * dT1_dVd - 2.0 * (T0 * dT2_dVd + T2 * dT0_dVd)) + / T3; + dT3_dVb = (T1 * dT1_dVb - 2.0 * (T0 * dT2_dVb + T2 * dT0_dVb)) + / T3; + + dVdsat_dVg = (dT1_dVg - (T1 * dT1_dVg - dT0_dVg * T2 + - T0 * dT2_dVg) / T3 - Vdsat * dT0_dVg) / T0; + dVdsat_dVb = (dT1_dVb - (T1 * dT1_dVb - dT0_dVb * T2 + - T0 * dT2_dVb) / T3 - Vdsat * dT0_dVb) / T0; + dVdsat_dVd = (dT1_dVd - (T1 * dT1_dVd - T0 * dT2_dVd) / T3) / T0; + } + here->BSIM4v6vdsat = Vdsat; + + /* Calculate Vdseff */ + T1 = Vdsat - Vds - pParam->BSIM4v6delta; + dT1_dVg = dVdsat_dVg; + dT1_dVd = dVdsat_dVd - 1.0; + dT1_dVb = dVdsat_dVb; + + T2 = sqrt(T1 * T1 + 4.0 * pParam->BSIM4v6delta * Vdsat); + T0 = T1 / T2; + T9 = 2.0 * pParam->BSIM4v6delta; + T3 = T9 / T2; + dT2_dVg = T0 * dT1_dVg + T3 * dVdsat_dVg; + dT2_dVd = T0 * dT1_dVd + T3 * dVdsat_dVd; + dT2_dVb = T0 * dT1_dVb + T3 * dVdsat_dVb; + + if (T1 >= 0.0) + { Vdseff = Vdsat - 0.5 * (T1 + T2); + dVdseff_dVg = dVdsat_dVg - 0.5 * (dT1_dVg + dT2_dVg); + dVdseff_dVd = dVdsat_dVd - 0.5 * (dT1_dVd + dT2_dVd); + dVdseff_dVb = dVdsat_dVb - 0.5 * (dT1_dVb + dT2_dVb); + } + else + { T4 = T9 / (T2 - T1); + T5 = 1.0 - T4; + T6 = Vdsat * T4 / (T2 - T1); + Vdseff = Vdsat * T5; + dVdseff_dVg = dVdsat_dVg * T5 + T6 * (dT2_dVg - dT1_dVg); + dVdseff_dVd = dVdsat_dVd * T5 + T6 * (dT2_dVd - dT1_dVd); + dVdseff_dVb = dVdsat_dVb * T5 + T6 * (dT2_dVb - dT1_dVb); + } + + if (Vds == 0.0) + { Vdseff = 0.0; + dVdseff_dVg = 0.0; + dVdseff_dVb = 0.0; + } + + if (Vdseff > Vds) + Vdseff = Vds; + diffVds = Vds - Vdseff; + here->BSIM4v6Vdseff = Vdseff; + + /* Velocity Overshoot */ + if((model->BSIM4v6lambdaGiven) && (model->BSIM4v6lambda > 0.0) ) + { + T1 = Leff * ueff; + T2 = pParam->BSIM4v6lambda / T1; + T3 = -T2 / T1 * Leff; + dT2_dVd = T3 * dueff_dVd; + dT2_dVg = T3 * dueff_dVg; + dT2_dVb = T3 * dueff_dVb; + T5 = 1.0 / (Esat * pParam->BSIM4v6litl); + T4 = -T5 / EsatL; + dT5_dVg = dEsatL_dVg * T4; + dT5_dVd = dEsatL_dVd * T4; + dT5_dVb = dEsatL_dVb * T4; + T6 = 1.0 + diffVds * T5; + dT6_dVg = dT5_dVg * diffVds - dVdseff_dVg * T5; + dT6_dVd = dT5_dVd * diffVds + (1.0 - dVdseff_dVd) * T5; + dT6_dVb = dT5_dVb * diffVds - dVdseff_dVb * T5; + T7 = 2.0 / (T6 * T6 + 1.0); + T8 = 1.0 - T7; + T9 = T6 * T7 * T7; + dT8_dVg = T9 * dT6_dVg; + dT8_dVd = T9 * dT6_dVd; + dT8_dVb = T9 * dT6_dVb; + T10 = 1.0 + T2 * T8; + dT10_dVg = dT2_dVg * T8 + T2 * dT8_dVg; + dT10_dVd = dT2_dVd * T8 + T2 * dT8_dVd; + dT10_dVb = dT2_dVb * T8 + T2 * dT8_dVb; + if(T10 == 1.0) + dT10_dVg = dT10_dVd = dT10_dVb = 0.0; + + dEsatL_dVg *= T10; + dEsatL_dVg += EsatL * dT10_dVg; + dEsatL_dVd *= T10; + dEsatL_dVd += EsatL * dT10_dVd; + dEsatL_dVb *= T10; + dEsatL_dVb += EsatL * dT10_dVb; + EsatL *= T10; + Esat = EsatL / Leff; /* bugfix by Wenwei Yang (4.6.4) */ + here->BSIM4v6EsatL = EsatL; + } + + /* Calculate Vasat */ + tmp4 = 1.0 - 0.5 * Abulk * Vdsat / Vgst2Vtm; + T9 = WVCoxRds * Vgsteff; + T8 = T9 / Vgst2Vtm; + T0 = EsatL + Vdsat + 2.0 * T9 * tmp4; + + T7 = 2.0 * WVCoxRds * tmp4; + dT0_dVg = dEsatL_dVg + dVdsat_dVg + T7 * (1.0 + tmp2 * Vgsteff) + - T8 * (Abulk * dVdsat_dVg - Abulk * Vdsat / Vgst2Vtm + + Vdsat * dAbulk_dVg); + + dT0_dVb = dEsatL_dVb + dVdsat_dVb + T7 * tmp3 * Vgsteff + - T8 * (dAbulk_dVb * Vdsat + Abulk * dVdsat_dVb); + dT0_dVd = dEsatL_dVd + dVdsat_dVd - T8 * Abulk * dVdsat_dVd; + + T9 = WVCoxRds * Abulk; + T1 = 2.0 / Lambda - 1.0 + T9; + dT1_dVg = -2.0 * tmp1 + WVCoxRds * (Abulk * tmp2 + dAbulk_dVg); + dT1_dVb = dAbulk_dVb * WVCoxRds + T9 * tmp3; + + Vasat = T0 / T1; + dVasat_dVg = (dT0_dVg - Vasat * dT1_dVg) / T1; + dVasat_dVb = (dT0_dVb - Vasat * dT1_dVb) / T1; + dVasat_dVd = dT0_dVd / T1; + + /* Calculate Idl first */ + + tmp1 = here->BSIM4v6vtfbphi2; + tmp2 = 2.0e8 * model->BSIM4v6toxp; + dT0_dVg = 1.0 / tmp2; + T0 = (Vgsteff + tmp1) * dT0_dVg; + + tmp3 = exp(model->BSIM4v6bdos * 0.7 * log(T0)); + T1 = 1.0 + tmp3; + T2 = model->BSIM4v6bdos * 0.7 * tmp3 / T0; + Tcen = model->BSIM4v6ados * 1.9e-9 / T1; + dTcen_dVg = -Tcen * T2 * dT0_dVg / T1; + + Coxeff = epssub * model->BSIM4v6coxp + / (epssub + model->BSIM4v6coxp * Tcen); + dCoxeff_dVg = -Coxeff * Coxeff * dTcen_dVg / epssub; + + CoxeffWovL = Coxeff * Weff / Leff; + beta = ueff * CoxeffWovL; + T3 = ueff / Leff; + dbeta_dVg = CoxeffWovL * dueff_dVg + T3 + * (Weff * dCoxeff_dVg + Coxeff * dWeff_dVg); + dbeta_dVd = CoxeffWovL * dueff_dVd; + dbeta_dVb = CoxeffWovL * dueff_dVb + T3 * Coxeff * dWeff_dVb; + + here->BSIM4v6AbovVgst2Vtm = Abulk / Vgst2Vtm; + T0 = 1.0 - 0.5 * Vdseff * here->BSIM4v6AbovVgst2Vtm; + dT0_dVg = -0.5 * (Abulk * dVdseff_dVg + - Abulk * Vdseff / Vgst2Vtm + Vdseff * dAbulk_dVg) / Vgst2Vtm; + dT0_dVd = -0.5 * Abulk * dVdseff_dVd / Vgst2Vtm; + dT0_dVb = -0.5 * (Abulk * dVdseff_dVb + dAbulk_dVb * Vdseff) + / Vgst2Vtm; + + fgche1 = Vgsteff * T0; + dfgche1_dVg = Vgsteff * dT0_dVg + T0; + dfgche1_dVd = Vgsteff * dT0_dVd; + dfgche1_dVb = Vgsteff * dT0_dVb; + + T9 = Vdseff / EsatL; + fgche2 = 1.0 + T9; + dfgche2_dVg = (dVdseff_dVg - T9 * dEsatL_dVg) / EsatL; + dfgche2_dVd = (dVdseff_dVd - T9 * dEsatL_dVd) / EsatL; + dfgche2_dVb = (dVdseff_dVb - T9 * dEsatL_dVb) / EsatL; + + gche = beta * fgche1 / fgche2; + dgche_dVg = (beta * dfgche1_dVg + fgche1 * dbeta_dVg + - gche * dfgche2_dVg) / fgche2; + dgche_dVd = (beta * dfgche1_dVd + fgche1 * dbeta_dVd + - gche * dfgche2_dVd) / fgche2; + dgche_dVb = (beta * dfgche1_dVb + fgche1 * dbeta_dVb + - gche * dfgche2_dVb) / fgche2; + + T0 = 1.0 + gche * Rds; + Idl = gche / T0; + T1 = (1.0 - Idl * Rds) / T0; + T2 = Idl * Idl; + dIdl_dVg = T1 * dgche_dVg - T2 * dRds_dVg; + dIdl_dVd = T1 * dgche_dVd; + dIdl_dVb = T1 * dgche_dVb - T2 * dRds_dVb; + + /* Calculate degradation factor due to pocket implant */ + + if (pParam->BSIM4v6fprout <= 0.0) + { FP = 1.0; + dFP_dVg = 0.0; + } + else + { T9 = pParam->BSIM4v6fprout * sqrt(Leff) / Vgst2Vtm; + FP = 1.0 / (1.0 + T9); + dFP_dVg = FP * FP * T9 / Vgst2Vtm; + } + + /* Calculate VACLM */ + T8 = pParam->BSIM4v6pvag / EsatL; + T9 = T8 * Vgsteff; + if (T9 > -0.9) + { PvagTerm = 1.0 + T9; + dPvagTerm_dVg = T8 * (1.0 - Vgsteff * dEsatL_dVg / EsatL); + dPvagTerm_dVb = -T9 * dEsatL_dVb / EsatL; + dPvagTerm_dVd = -T9 * dEsatL_dVd / EsatL; + } + else + { T4 = 1.0 / (17.0 + 20.0 * T9); + PvagTerm = (0.8 + T9) * T4; + T4 *= T4; + dPvagTerm_dVg = T8 * (1.0 - Vgsteff * dEsatL_dVg / EsatL) * T4; + T9 *= T4 / EsatL; + dPvagTerm_dVb = -T9 * dEsatL_dVb; + dPvagTerm_dVd = -T9 * dEsatL_dVd; + } + + if ((pParam->BSIM4v6pclm > MIN_EXP) && (diffVds > 1.0e-10)) + { T0 = 1.0 + Rds * Idl; + dT0_dVg = dRds_dVg * Idl + Rds * dIdl_dVg; + dT0_dVd = Rds * dIdl_dVd; + dT0_dVb = dRds_dVb * Idl + Rds * dIdl_dVb; + + T2 = Vdsat / Esat; + T1 = Leff + T2; + dT1_dVg = (dVdsat_dVg - T2 * dEsatL_dVg / Leff) / Esat; + dT1_dVd = (dVdsat_dVd - T2 * dEsatL_dVd / Leff) / Esat; + dT1_dVb = (dVdsat_dVb - T2 * dEsatL_dVb / Leff) / Esat; + + Cclm = FP * PvagTerm * T0 * T1 / (pParam->BSIM4v6pclm * pParam->BSIM4v6litl); + dCclm_dVg = Cclm * (dFP_dVg / FP + dPvagTerm_dVg / PvagTerm + + dT0_dVg / T0 + dT1_dVg / T1); + dCclm_dVb = Cclm * (dPvagTerm_dVb / PvagTerm + dT0_dVb / T0 + + dT1_dVb / T1); + dCclm_dVd = Cclm * (dPvagTerm_dVd / PvagTerm + dT0_dVd / T0 + + dT1_dVd / T1); + VACLM = Cclm * diffVds; + + dVACLM_dVg = dCclm_dVg * diffVds - dVdseff_dVg * Cclm; + dVACLM_dVb = dCclm_dVb * diffVds - dVdseff_dVb * Cclm; + dVACLM_dVd = dCclm_dVd * diffVds + (1.0 - dVdseff_dVd) * Cclm; + } + else + { VACLM = Cclm = MAX_EXP; + dVACLM_dVd = dVACLM_dVg = dVACLM_dVb = 0.0; + dCclm_dVd = dCclm_dVg = dCclm_dVb = 0.0; + } + + /* Calculate VADIBL */ + if (pParam->BSIM4v6thetaRout > MIN_EXP) + { T8 = Abulk * Vdsat; + T0 = Vgst2Vtm * T8; + dT0_dVg = Vgst2Vtm * Abulk * dVdsat_dVg + T8 + + Vgst2Vtm * Vdsat * dAbulk_dVg; + dT0_dVb = Vgst2Vtm * (dAbulk_dVb * Vdsat + Abulk * dVdsat_dVb); + dT0_dVd = Vgst2Vtm * Abulk * dVdsat_dVd; + + T1 = Vgst2Vtm + T8; + dT1_dVg = 1.0 + Abulk * dVdsat_dVg + Vdsat * dAbulk_dVg; + dT1_dVb = Abulk * dVdsat_dVb + dAbulk_dVb * Vdsat; + dT1_dVd = Abulk * dVdsat_dVd; + + T9 = T1 * T1; + T2 = pParam->BSIM4v6thetaRout; + VADIBL = (Vgst2Vtm - T0 / T1) / T2; + dVADIBL_dVg = (1.0 - dT0_dVg / T1 + T0 * dT1_dVg / T9) / T2; + dVADIBL_dVb = (-dT0_dVb / T1 + T0 * dT1_dVb / T9) / T2; + dVADIBL_dVd = (-dT0_dVd / T1 + T0 * dT1_dVd / T9) / T2; + + T7 = pParam->BSIM4v6pdiblb * Vbseff; + if (T7 >= -0.9) + { T3 = 1.0 / (1.0 + T7); + VADIBL *= T3; + dVADIBL_dVg *= T3; + dVADIBL_dVb = (dVADIBL_dVb - VADIBL * pParam->BSIM4v6pdiblb) + * T3; + dVADIBL_dVd *= T3; + } + else + { T4 = 1.0 / (0.8 + T7); + T3 = (17.0 + 20.0 * T7) * T4; + dVADIBL_dVg *= T3; + dVADIBL_dVb = dVADIBL_dVb * T3 + - VADIBL * pParam->BSIM4v6pdiblb * T4 * T4; + dVADIBL_dVd *= T3; + VADIBL *= T3; + } + + dVADIBL_dVg = dVADIBL_dVg * PvagTerm + VADIBL * dPvagTerm_dVg; + dVADIBL_dVb = dVADIBL_dVb * PvagTerm + VADIBL * dPvagTerm_dVb; + dVADIBL_dVd = dVADIBL_dVd * PvagTerm + VADIBL * dPvagTerm_dVd; + VADIBL *= PvagTerm; + } + else + { VADIBL = MAX_EXP; + dVADIBL_dVd = dVADIBL_dVg = dVADIBL_dVb = 0.0; + } + + /* Calculate Va */ + Va = Vasat + VACLM; + dVa_dVg = dVasat_dVg + dVACLM_dVg; + dVa_dVb = dVasat_dVb + dVACLM_dVb; + dVa_dVd = dVasat_dVd + dVACLM_dVd; + + /* Calculate VADITS */ + T0 = pParam->BSIM4v6pditsd * Vds; + if (T0 > EXP_THRESHOLD) + { T1 = MAX_EXP; + dT1_dVd = 0; + } + else + { T1 = exp(T0); + dT1_dVd = T1 * pParam->BSIM4v6pditsd; + } + + if (pParam->BSIM4v6pdits > MIN_EXP) + { T2 = 1.0 + model->BSIM4v6pditsl * Leff; + VADITS = (1.0 + T2 * T1) / pParam->BSIM4v6pdits; + dVADITS_dVg = VADITS * dFP_dVg; + dVADITS_dVd = FP * T2 * dT1_dVd / pParam->BSIM4v6pdits; + VADITS *= FP; + } + else + { VADITS = MAX_EXP; + dVADITS_dVg = dVADITS_dVd = 0; + } + + /* Calculate VASCBE */ + if ((pParam->BSIM4v6pscbe2 > 0.0)&&(pParam->BSIM4v6pscbe1>=0.0)) /*4.6.2*/ + { if (diffVds > pParam->BSIM4v6pscbe1 * pParam->BSIM4v6litl + / EXP_THRESHOLD) + { T0 = pParam->BSIM4v6pscbe1 * pParam->BSIM4v6litl / diffVds; + VASCBE = Leff * exp(T0) / pParam->BSIM4v6pscbe2; + T1 = T0 * VASCBE / diffVds; + dVASCBE_dVg = T1 * dVdseff_dVg; + dVASCBE_dVd = -T1 * (1.0 - dVdseff_dVd); + dVASCBE_dVb = T1 * dVdseff_dVb; + } + else + { VASCBE = MAX_EXP * Leff/pParam->BSIM4v6pscbe2; + dVASCBE_dVg = dVASCBE_dVd = dVASCBE_dVb = 0.0; + } + } + else + { VASCBE = MAX_EXP; + dVASCBE_dVg = dVASCBE_dVd = dVASCBE_dVb = 0.0; + } + + /* Add DIBL to Ids */ + T9 = diffVds / VADIBL; + T0 = 1.0 + T9; + Idsa = Idl * T0; + dIdsa_dVg = T0 * dIdl_dVg - Idl * (dVdseff_dVg + T9 * dVADIBL_dVg) / VADIBL; + dIdsa_dVd = T0 * dIdl_dVd + Idl + * (1.0 - dVdseff_dVd - T9 * dVADIBL_dVd) / VADIBL; + dIdsa_dVb = T0 * dIdl_dVb - Idl * (dVdseff_dVb + T9 * dVADIBL_dVb) / VADIBL; + + /* Add DITS to Ids */ + T9 = diffVds / VADITS; + T0 = 1.0 + T9; + dIdsa_dVg = T0 * dIdsa_dVg - Idsa * (dVdseff_dVg + T9 * dVADITS_dVg) / VADITS; + dIdsa_dVd = T0 * dIdsa_dVd + Idsa + * (1.0 - dVdseff_dVd - T9 * dVADITS_dVd) / VADITS; + dIdsa_dVb = T0 * dIdsa_dVb - Idsa * dVdseff_dVb / VADITS; + Idsa *= T0; + + /* Add CLM to Ids */ + T0 = log(Va / Vasat); + dT0_dVg = dVa_dVg / Va - dVasat_dVg / Vasat; + dT0_dVb = dVa_dVb / Va - dVasat_dVb / Vasat; + dT0_dVd = dVa_dVd / Va - dVasat_dVd / Vasat; + T1 = T0 / Cclm; + T9 = 1.0 + T1; + dT9_dVg = (dT0_dVg - T1 * dCclm_dVg) / Cclm; + dT9_dVb = (dT0_dVb - T1 * dCclm_dVb) / Cclm; + dT9_dVd = (dT0_dVd - T1 * dCclm_dVd) / Cclm; + + dIdsa_dVg = dIdsa_dVg * T9 + Idsa * dT9_dVg; + dIdsa_dVb = dIdsa_dVb * T9 + Idsa * dT9_dVb; + dIdsa_dVd = dIdsa_dVd * T9 + Idsa * dT9_dVd; + Idsa *= T9; + + /* Substrate current begins */ + tmp = pParam->BSIM4v6alpha0 + pParam->BSIM4v6alpha1 * Leff; + if ((tmp <= 0.0) || (pParam->BSIM4v6beta0 <= 0.0)) + { Isub = Gbd = Gbb = Gbg = 0.0; + } + else + { T2 = tmp / Leff; + if (diffVds > pParam->BSIM4v6beta0 / EXP_THRESHOLD) + { T0 = -pParam->BSIM4v6beta0 / diffVds; + T1 = T2 * diffVds * exp(T0); + T3 = T1 / diffVds * (T0 - 1.0); + dT1_dVg = T3 * dVdseff_dVg; + dT1_dVd = T3 * (dVdseff_dVd - 1.0); + dT1_dVb = T3 * dVdseff_dVb; + } + else + { T3 = T2 * MIN_EXP; + T1 = T3 * diffVds; + dT1_dVg = -T3 * dVdseff_dVg; + dT1_dVd = T3 * (1.0 - dVdseff_dVd); + dT1_dVb = -T3 * dVdseff_dVb; + } + T4 = Idsa * Vdseff; + Isub = T1 * T4; + Gbg = T1 * (dIdsa_dVg * Vdseff + Idsa * dVdseff_dVg) + + T4 * dT1_dVg; + Gbd = T1 * (dIdsa_dVd * Vdseff + Idsa * dVdseff_dVd) + + T4 * dT1_dVd; + Gbb = T1 * (dIdsa_dVb * Vdseff + Idsa * dVdseff_dVb) + + T4 * dT1_dVb; + + Gbd += Gbg * dVgsteff_dVd; + Gbb += Gbg * dVgsteff_dVb; + Gbg *= dVgsteff_dVg; + Gbb *= dVbseff_dVb; + } + here->BSIM4v6csub = Isub; + here->BSIM4v6gbbs = Gbb; + here->BSIM4v6gbgs = Gbg; + here->BSIM4v6gbds = Gbd; + + /* Add SCBE to Ids */ + T9 = diffVds / VASCBE; + T0 = 1.0 + T9; + Ids = Idsa * T0; + + Gm = T0 * dIdsa_dVg - Idsa + * (dVdseff_dVg + T9 * dVASCBE_dVg) / VASCBE; + Gds = T0 * dIdsa_dVd + Idsa + * (1.0 - dVdseff_dVd - T9 * dVASCBE_dVd) / VASCBE; + Gmb = T0 * dIdsa_dVb - Idsa + * (dVdseff_dVb + T9 * dVASCBE_dVb) / VASCBE; + + + tmp1 = Gds + Gm * dVgsteff_dVd; + tmp2 = Gmb + Gm * dVgsteff_dVb; + tmp3 = Gm; + + Gm = (Ids * dVdseff_dVg + Vdseff * tmp3) * dVgsteff_dVg; + Gds = Ids * (dVdseff_dVd + dVdseff_dVg * dVgsteff_dVd) + + Vdseff * tmp1; + Gmb = (Ids * (dVdseff_dVb + dVdseff_dVg * dVgsteff_dVb) + + Vdseff * tmp2) * dVbseff_dVb; + + cdrain = Ids * Vdseff; + + /* Source End Velocity Limit */ + if((model->BSIM4v6vtlGiven) && (model->BSIM4v6vtl > 0.0) ) { + T12 = 1.0 / Leff / CoxeffWovL; + T11 = T12 / Vgsteff; + T10 = -T11 / Vgsteff; + vs = cdrain * T11; /* vs */ + dvs_dVg = Gm * T11 + cdrain * T10 * dVgsteff_dVg; + dvs_dVd = Gds * T11 + cdrain * T10 * dVgsteff_dVd; + dvs_dVb = Gmb * T11 + cdrain * T10 * dVgsteff_dVb; + T0 = 2 * MM; + T1 = vs / (pParam->BSIM4v6vtl * pParam->BSIM4v6tfactor); + if(T1 > 0.0) + { T2 = 1.0 + exp(T0 * log(T1)); + T3 = (T2 - 1.0) * T0 / vs; + Fsevl = 1.0 / exp(log(T2)/ T0); + dT2_dVg = T3 * dvs_dVg; + dT2_dVd = T3 * dvs_dVd; + dT2_dVb = T3 * dvs_dVb; + T4 = -1.0 / T0 * Fsevl / T2; + dFsevl_dVg = T4 * dT2_dVg; + dFsevl_dVd = T4 * dT2_dVd; + dFsevl_dVb = T4 * dT2_dVb; + } else { + Fsevl = 1.0; + dFsevl_dVg = 0.0; + dFsevl_dVd = 0.0; + dFsevl_dVb = 0.0; + } + Gm *=Fsevl; + Gm += cdrain * dFsevl_dVg; + Gmb *=Fsevl; + Gmb += cdrain * dFsevl_dVb; + Gds *=Fsevl; + Gds += cdrain * dFsevl_dVd; + + cdrain *= Fsevl; + } + + here->BSIM4v6gds = Gds; + here->BSIM4v6gm = Gm; + here->BSIM4v6gmbs = Gmb; + here->BSIM4v6IdovVds = Ids; + if( here->BSIM4v6IdovVds <= 1.0e-9) here->BSIM4v6IdovVds = 1.0e-9; + + /* Calculate Rg */ + if ((here->BSIM4v6rgateMod > 1) || + (here->BSIM4v6trnqsMod != 0) || (here->BSIM4v6acnqsMod != 0)) + { T9 = pParam->BSIM4v6xrcrg2 * model->BSIM4v6vtm; + T0 = T9 * beta; + dT0_dVd = (dbeta_dVd + dbeta_dVg * dVgsteff_dVd) * T9; + dT0_dVb = (dbeta_dVb + dbeta_dVg * dVgsteff_dVb) * T9; + dT0_dVg = dbeta_dVg * T9; + + here->BSIM4v6gcrg = pParam->BSIM4v6xrcrg1 * ( T0 + Ids); + here->BSIM4v6gcrgd = pParam->BSIM4v6xrcrg1 * (dT0_dVd + tmp1); + here->BSIM4v6gcrgb = pParam->BSIM4v6xrcrg1 * (dT0_dVb + tmp2) + * dVbseff_dVb; + here->BSIM4v6gcrgg = pParam->BSIM4v6xrcrg1 * (dT0_dVg + tmp3) + * dVgsteff_dVg; + + if (here->BSIM4v6nf != 1.0) + { here->BSIM4v6gcrg *= here->BSIM4v6nf; + here->BSIM4v6gcrgg *= here->BSIM4v6nf; + here->BSIM4v6gcrgd *= here->BSIM4v6nf; + here->BSIM4v6gcrgb *= here->BSIM4v6nf; + } + + if (here->BSIM4v6rgateMod == 2) + { T10 = here->BSIM4v6grgeltd * here->BSIM4v6grgeltd; + T11 = here->BSIM4v6grgeltd + here->BSIM4v6gcrg; + here->BSIM4v6gcrg = here->BSIM4v6grgeltd * here->BSIM4v6gcrg / T11; + T12 = T10 / T11 / T11; + here->BSIM4v6gcrgg *= T12; + here->BSIM4v6gcrgd *= T12; + here->BSIM4v6gcrgb *= T12; + } + here->BSIM4v6gcrgs = -(here->BSIM4v6gcrgg + here->BSIM4v6gcrgd + + here->BSIM4v6gcrgb); + } + + + /* Calculate bias-dependent external S/D resistance */ + if (model->BSIM4v6rdsMod) + { /* Rs(V) */ + T0 = vgs - pParam->BSIM4v6vfbsd; + T1 = sqrt(T0 * T0 + 1.0e-4); + vgs_eff = 0.5 * (T0 + T1); + dvgs_eff_dvg = vgs_eff / T1; + + T0 = 1.0 + pParam->BSIM4v6prwg * vgs_eff; + dT0_dvg = -pParam->BSIM4v6prwg / T0 / T0 * dvgs_eff_dvg; + T1 = -pParam->BSIM4v6prwb * vbs; + dT1_dvb = -pParam->BSIM4v6prwb; + + T2 = 1.0 / T0 + T1; + T3 = T2 + sqrt(T2 * T2 + 0.01); + dT3_dvg = T3 / (T3 - T2); + dT3_dvb = dT3_dvg * dT1_dvb; + dT3_dvg *= dT0_dvg; + + T4 = pParam->BSIM4v6rs0 * 0.5; + Rs = pParam->BSIM4v6rswmin + T3 * T4; + dRs_dvg = T4 * dT3_dvg; + dRs_dvb = T4 * dT3_dvb; + + T0 = 1.0 + here->BSIM4v6sourceConductance * Rs; + here->BSIM4v6gstot = here->BSIM4v6sourceConductance / T0; + T0 = -here->BSIM4v6gstot * here->BSIM4v6gstot; + dgstot_dvd = 0.0; /* place holder */ + dgstot_dvg = T0 * dRs_dvg; + dgstot_dvb = T0 * dRs_dvb; + dgstot_dvs = -(dgstot_dvg + dgstot_dvb + dgstot_dvd); + + /* Rd(V) */ + T0 = vgd - pParam->BSIM4v6vfbsd; + T1 = sqrt(T0 * T0 + 1.0e-4); + vgd_eff = 0.5 * (T0 + T1); + dvgd_eff_dvg = vgd_eff / T1; + + T0 = 1.0 + pParam->BSIM4v6prwg * vgd_eff; + dT0_dvg = -pParam->BSIM4v6prwg / T0 / T0 * dvgd_eff_dvg; + T1 = -pParam->BSIM4v6prwb * vbd; + dT1_dvb = -pParam->BSIM4v6prwb; + + T2 = 1.0 / T0 + T1; + T3 = T2 + sqrt(T2 * T2 + 0.01); + dT3_dvg = T3 / (T3 - T2); + dT3_dvb = dT3_dvg * dT1_dvb; + dT3_dvg *= dT0_dvg; + + T4 = pParam->BSIM4v6rd0 * 0.5; + Rd = pParam->BSIM4v6rdwmin + T3 * T4; + dRd_dvg = T4 * dT3_dvg; + dRd_dvb = T4 * dT3_dvb; + + T0 = 1.0 + here->BSIM4v6drainConductance * Rd; + here->BSIM4v6gdtot = here->BSIM4v6drainConductance / T0; + T0 = -here->BSIM4v6gdtot * here->BSIM4v6gdtot; + dgdtot_dvs = 0.0; + dgdtot_dvg = T0 * dRd_dvg; + dgdtot_dvb = T0 * dRd_dvb; + dgdtot_dvd = -(dgdtot_dvg + dgdtot_dvb + dgdtot_dvs); + + here->BSIM4v6gstotd = vses * dgstot_dvd; + here->BSIM4v6gstotg = vses * dgstot_dvg; + here->BSIM4v6gstots = vses * dgstot_dvs; + here->BSIM4v6gstotb = vses * dgstot_dvb; + + T2 = vdes - vds; + here->BSIM4v6gdtotd = T2 * dgdtot_dvd; + here->BSIM4v6gdtotg = T2 * dgdtot_dvg; + here->BSIM4v6gdtots = T2 * dgdtot_dvs; + here->BSIM4v6gdtotb = T2 * dgdtot_dvb; + } + else /* WDLiu: for bypass */ + { here->BSIM4v6gstot = here->BSIM4v6gstotd = here->BSIM4v6gstotg = 0.0; + here->BSIM4v6gstots = here->BSIM4v6gstotb = 0.0; + here->BSIM4v6gdtot = here->BSIM4v6gdtotd = here->BSIM4v6gdtotg = 0.0; + here->BSIM4v6gdtots = here->BSIM4v6gdtotb = 0.0; + } + + /* Calculate GIDL current */ + vgs_eff = here->BSIM4v6vgs_eff; + dvgs_eff_dvg = here->BSIM4v6dvgs_eff_dvg; + if(model->BSIM4v6mtrlMod == 0) + T0 = 3.0 * toxe; + else + T0 = model->BSIM4v6epsrsub * toxe / epsrox; + + if(model->BSIM4v6mtrlMod ==0) + T1 = (vds - vgs_eff - pParam->BSIM4v6egidl ) / T0; + else + T1 = (vds - vgs_eff - pParam->BSIM4v6egidl + pParam->BSIM4v6vfbsd) / T0; + if ((pParam->BSIM4v6agidl <= 0.0) || (pParam->BSIM4v6bgidl <= 0.0) + || (T1 <= 0.0) || (pParam->BSIM4v6cgidl <= 0.0) || (vbd > 0.0)) + Igidl = Ggidld = Ggidlg = Ggidlb = 0.0; + else { + dT1_dVd = 1.0 / T0; + dT1_dVg = -dvgs_eff_dvg * dT1_dVd; + T2 = pParam->BSIM4v6bgidl / T1; + if (T2 < 100.0) + { Igidl = pParam->BSIM4v6agidl * pParam->BSIM4v6weffCJ * T1 * exp(-T2); + T3 = Igidl * (1.0 + T2) / T1; + Ggidld = T3 * dT1_dVd; + Ggidlg = T3 * dT1_dVg; + } + else + { Igidl = pParam->BSIM4v6agidl * pParam->BSIM4v6weffCJ * 3.720075976e-44; + Ggidld = Igidl * dT1_dVd; + Ggidlg = Igidl * dT1_dVg; + Igidl *= T1; + } + + T4 = vbd * vbd; + T5 = -vbd * T4; + T6 = pParam->BSIM4v6cgidl + T5; + T7 = T5 / T6; + T8 = 3.0 * pParam->BSIM4v6cgidl * T4 / T6 / T6; + Ggidld = Ggidld * T7 + Igidl * T8; + Ggidlg = Ggidlg * T7; + Ggidlb = -Igidl * T8; + Igidl *= T7; + } + here->BSIM4v6Igidl = Igidl; + here->BSIM4v6ggidld = Ggidld; + here->BSIM4v6ggidlg = Ggidlg; + here->BSIM4v6ggidlb = Ggidlb; + + /* Calculate GISL current */ + vgd_eff = here->BSIM4v6vgd_eff; + dvgd_eff_dvg = here->BSIM4v6dvgd_eff_dvg; + + if(model->BSIM4v6mtrlMod ==0) + T1 = (-vds - vgd_eff - pParam->BSIM4v6egisl ) / T0; + else + T1 = (-vds - vgd_eff - pParam->BSIM4v6egisl + pParam->BSIM4v6vfbsd ) / T0; + + if ((pParam->BSIM4v6agisl <= 0.0) || (pParam->BSIM4v6bgisl <= 0.0) + || (T1 <= 0.0) || (pParam->BSIM4v6cgisl <= 0.0) || (vbs > 0.0)) + Igisl = Ggisls = Ggislg = Ggislb = 0.0; + else { + dT1_dVd = 1.0 / T0; + dT1_dVg = -dvgd_eff_dvg * dT1_dVd; + T2 = pParam->BSIM4v6bgisl / T1; + if (T2 < 100.0) + { Igisl = pParam->BSIM4v6agisl * pParam->BSIM4v6weffCJ * T1 * exp(-T2); + T3 = Igisl * (1.0 + T2) / T1; + Ggisls = T3 * dT1_dVd; + Ggislg = T3 * dT1_dVg; + } + else + { Igisl = pParam->BSIM4v6agisl * pParam->BSIM4v6weffCJ * 3.720075976e-44; + Ggisls = Igisl * dT1_dVd; + Ggislg = Igisl * dT1_dVg; + Igisl *= T1; + } + + T4 = vbs * vbs; + T5 = -vbs * T4; + T6 = pParam->BSIM4v6cgisl + T5; + T7 = T5 / T6; + T8 = 3.0 * pParam->BSIM4v6cgisl * T4 / T6 / T6; + Ggisls = Ggisls * T7 + Igisl * T8; + Ggislg = Ggislg * T7; + Ggislb = -Igisl * T8; + Igisl *= T7; + } + here->BSIM4v6Igisl = Igisl; + here->BSIM4v6ggisls = Ggisls; + here->BSIM4v6ggislg = Ggislg; + here->BSIM4v6ggislb = Ggislb; + + + /* Calculate gate tunneling current */ + if ((model->BSIM4v6igcMod != 0) || (model->BSIM4v6igbMod != 0)) + { Vfb = here->BSIM4v6vfbzb; + V3 = Vfb - Vgs_eff + Vbseff - DELTA_3; + if (Vfb <= 0.0) + T0 = sqrt(V3 * V3 - 4.0 * DELTA_3 * Vfb); + else + T0 = sqrt(V3 * V3 + 4.0 * DELTA_3 * Vfb); + T1 = 0.5 * (1.0 + V3 / T0); + Vfbeff = Vfb - 0.5 * (V3 + T0); + dVfbeff_dVg = T1 * dVgs_eff_dVg; + dVfbeff_dVb = -T1; /* WDLiu: -No surprise? No. -Good! */ + + Voxacc = Vfb - Vfbeff; + dVoxacc_dVg = -dVfbeff_dVg; + dVoxacc_dVb = -dVfbeff_dVb; + if (Voxacc < 0.0) /* WDLiu: Avoiding numerical instability. */ + Voxacc = dVoxacc_dVg = dVoxacc_dVb = 0.0; + + T0 = 0.5 * pParam->BSIM4v6k1ox; + T3 = Vgs_eff - Vfbeff - Vbseff - Vgsteff; + if (pParam->BSIM4v6k1ox == 0.0) + Voxdepinv = dVoxdepinv_dVg = dVoxdepinv_dVd + = dVoxdepinv_dVb = 0.0; + else if (T3 < 0.0) + { Voxdepinv = -T3; + dVoxdepinv_dVg = -dVgs_eff_dVg + dVfbeff_dVg + + dVgsteff_dVg; + dVoxdepinv_dVd = dVgsteff_dVd; + dVoxdepinv_dVb = dVfbeff_dVb + 1.0 + dVgsteff_dVb; + } + else + { T1 = sqrt(T0 * T0 + T3); + T2 = T0 / T1; + Voxdepinv = pParam->BSIM4v6k1ox * (T1 - T0); + dVoxdepinv_dVg = T2 * (dVgs_eff_dVg - dVfbeff_dVg + - dVgsteff_dVg); + dVoxdepinv_dVd = -T2 * dVgsteff_dVd; + dVoxdepinv_dVb = -T2 * (dVfbeff_dVb + 1.0 + dVgsteff_dVb); + } + + Voxdepinv += Vgsteff; + dVoxdepinv_dVg += dVgsteff_dVg; + dVoxdepinv_dVd += dVgsteff_dVd; + dVoxdepinv_dVb += dVgsteff_dVb; + } + + if(model->BSIM4v6tempMod < 2) + tmp = Vtm; + else /* model->BSIM4v6tempMod = 2 , 3*/ + tmp = Vtm0; + if (model->BSIM4v6igcMod) + { T0 = tmp * pParam->BSIM4v6nigc; + if(model->BSIM4v6igcMod == 1) { + VxNVt = (Vgs_eff - model->BSIM4v6type * here->BSIM4v6vth0) / T0; + if (VxNVt > EXP_THRESHOLD) + { Vaux = Vgs_eff - model->BSIM4v6type * here->BSIM4v6vth0; + dVaux_dVg = dVgs_eff_dVg; + dVaux_dVd = 0.0; + dVaux_dVb = 0.0; + } + } else if (model->BSIM4v6igcMod == 2) { + VxNVt = (Vgs_eff - here->BSIM4v6von) / T0; + if (VxNVt > EXP_THRESHOLD) + { Vaux = Vgs_eff - here->BSIM4v6von; + 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 if ((VxNVt >= -EXP_THRESHOLD) && (VxNVt <= EXP_THRESHOLD)) + { ExpVxNVt = exp(VxNVt); + Vaux = T0 * log(1.0 + ExpVxNVt); + dVaux_dVg = ExpVxNVt / (1.0 + ExpVxNVt); + if(model->BSIM4v6igcMod == 1) { + dVaux_dVd = 0.0; + dVaux_dVb = 0.0; + } else if (model->BSIM4v6igcMod == 2) { + dVaux_dVd = -dVgs_eff_dVg * dVth_dVd; + dVaux_dVb = -dVgs_eff_dVg * dVth_dVb; + } + dVaux_dVg *= dVgs_eff_dVg; + } + + T2 = Vgs_eff * Vaux; + dT2_dVg = dVgs_eff_dVg * Vaux + Vgs_eff * dVaux_dVg; + dT2_dVd = Vgs_eff * dVaux_dVd; + dT2_dVb = Vgs_eff * dVaux_dVb; + + T11 = pParam->BSIM4v6Aechvb; + T12 = pParam->BSIM4v6Bechvb; + T3 = pParam->BSIM4v6aigc * pParam->BSIM4v6cigc + - pParam->BSIM4v6bigc; + T4 = pParam->BSIM4v6bigc * pParam->BSIM4v6cigc; + T5 = T12 * (pParam->BSIM4v6aigc + T3 * Voxdepinv + - T4 * Voxdepinv * Voxdepinv); + + if (T5 > EXP_THRESHOLD) + { T6 = MAX_EXP; + dT6_dVg = dT6_dVd = dT6_dVb = 0.0; + } + else if (T5 < -EXP_THRESHOLD) + { T6 = MIN_EXP; + dT6_dVg = dT6_dVd = dT6_dVb = 0.0; + } + else + { T6 = exp(T5); + dT6_dVg = T6 * T12 * (T3 - 2.0 * T4 * Voxdepinv); + dT6_dVd = dT6_dVg * dVoxdepinv_dVd; + dT6_dVb = dT6_dVg * dVoxdepinv_dVb; + dT6_dVg *= dVoxdepinv_dVg; + } + + Igc = T11 * T2 * T6; + dIgc_dVg = T11 * (T2 * dT6_dVg + T6 * dT2_dVg); + dIgc_dVd = T11 * (T2 * dT6_dVd + T6 * dT2_dVd); + dIgc_dVb = T11 * (T2 * dT6_dVb + T6 * dT2_dVb); + + if (model->BSIM4v6pigcdGiven) + { Pigcd = pParam->BSIM4v6pigcd; + dPigcd_dVg = dPigcd_dVd = dPigcd_dVb = 0.0; + } + else + { T11 = pParam->BSIM4v6Bechvb * toxe; + T12 = Vgsteff + 1.0e-20; + T13 = T11 / T12 / T12; + T14 = -T13 / T12; + Pigcd = T13 * (1.0 - 0.5 * Vdseff / T12); + dPigcd_dVg = T14 * (2.0 + 0.5 * (dVdseff_dVg + - 3.0 * Vdseff / T12)); + dPigcd_dVd = 0.5 * T14 * dVdseff_dVd; + dPigcd_dVb = 0.5 * T14 * dVdseff_dVb; + } + + T7 = -Pigcd * Vdseff; /* bugfix */ + dT7_dVg = -Vdseff * dPigcd_dVg - Pigcd * dVdseff_dVg; + dT7_dVd = -Vdseff * dPigcd_dVd - Pigcd * dVdseff_dVd + dT7_dVg * dVgsteff_dVd; + dT7_dVb = -Vdseff * dPigcd_dVb - Pigcd * dVdseff_dVb + dT7_dVg * dVgsteff_dVb; + dT7_dVg *= dVgsteff_dVg; + dT7_dVb *= dVbseff_dVb; + T8 = T7 * T7 + 2.0e-4; + dT8_dVg = 2.0 * T7; + dT8_dVd = dT8_dVg * dT7_dVd; + dT8_dVb = dT8_dVg * dT7_dVb; + dT8_dVg *= dT7_dVg; + + if (T7 > EXP_THRESHOLD) + { T9 = MAX_EXP; + dT9_dVg = dT9_dVd = dT9_dVb = 0.0; + } + else if (T7 < -EXP_THRESHOLD) + { T9 = MIN_EXP; + dT9_dVg = dT9_dVd = dT9_dVb = 0.0; + } + else + { T9 = exp(T7); + dT9_dVg = T9 * dT7_dVg; + dT9_dVd = T9 * dT7_dVd; + dT9_dVb = T9 * dT7_dVb; + } + + T0 = T8 * T8; + T1 = T9 - 1.0 + 1.0e-4; + T10 = (T1 - T7) / T8; + dT10_dVg = (dT9_dVg - dT7_dVg - T10 * dT8_dVg) / T8; + dT10_dVd = (dT9_dVd - dT7_dVd - T10 * dT8_dVd) / T8; + dT10_dVb = (dT9_dVb - dT7_dVb - T10 * dT8_dVb) / T8; + + Igcs = Igc * T10; + dIgcs_dVg = dIgc_dVg * T10 + Igc * dT10_dVg; + dIgcs_dVd = dIgc_dVd * T10 + Igc * dT10_dVd; + dIgcs_dVb = dIgc_dVb * T10 + Igc * dT10_dVb; + + T1 = T9 - 1.0 - 1.0e-4; + T10 = (T7 * T9 - T1) / T8; + dT10_dVg = (dT7_dVg * T9 + (T7 - 1.0) * dT9_dVg + - T10 * dT8_dVg) / T8; + dT10_dVd = (dT7_dVd * T9 + (T7 - 1.0) * dT9_dVd + - T10 * dT8_dVd) / T8; + dT10_dVb = (dT7_dVb * T9 + (T7 - 1.0) * dT9_dVb + - T10 * dT8_dVb) / T8; + Igcd = Igc * T10; + dIgcd_dVg = dIgc_dVg * T10 + Igc * dT10_dVg; + dIgcd_dVd = dIgc_dVd * T10 + Igc * dT10_dVd; + dIgcd_dVb = dIgc_dVb * T10 + Igc * dT10_dVb; + + here->BSIM4v6Igcs = Igcs; + here->BSIM4v6gIgcsg = dIgcs_dVg; + here->BSIM4v6gIgcsd = dIgcs_dVd; + here->BSIM4v6gIgcsb = dIgcs_dVb * dVbseff_dVb; + here->BSIM4v6Igcd = Igcd; + here->BSIM4v6gIgcdg = dIgcd_dVg; + here->BSIM4v6gIgcdd = dIgcd_dVd; + here->BSIM4v6gIgcdb = dIgcd_dVb * dVbseff_dVb; + + T0 = vgs - (pParam->BSIM4v6vfbsd + pParam->BSIM4v6vfbsdoff); + vgs_eff = sqrt(T0 * T0 + 1.0e-4); + dvgs_eff_dvg = T0 / vgs_eff; + + T2 = vgs * vgs_eff; + dT2_dVg = vgs * dvgs_eff_dvg + vgs_eff; + T11 = pParam->BSIM4v6AechvbEdgeS; + T12 = pParam->BSIM4v6BechvbEdge; + T3 = pParam->BSIM4v6aigs * pParam->BSIM4v6cigs + - pParam->BSIM4v6bigs; + T4 = pParam->BSIM4v6bigs * pParam->BSIM4v6cigs; + T5 = T12 * (pParam->BSIM4v6aigs + T3 * vgs_eff + - T4 * vgs_eff * vgs_eff); + if (T5 > EXP_THRESHOLD) + { T6 = MAX_EXP; + dT6_dVg = 0.0; + } + else if (T5 < -EXP_THRESHOLD) + { T6 = MIN_EXP; + dT6_dVg = 0.0; + } + else + { T6 = exp(T5); + dT6_dVg = T6 * T12 * (T3 - 2.0 * T4 * vgs_eff) + * dvgs_eff_dvg; + } + Igs = T11 * T2 * T6; + dIgs_dVg = T11 * (T2 * dT6_dVg + T6 * dT2_dVg); + dIgs_dVs = -dIgs_dVg; + + + T0 = vgd - (pParam->BSIM4v6vfbsd + pParam->BSIM4v6vfbsdoff); + vgd_eff = sqrt(T0 * T0 + 1.0e-4); + dvgd_eff_dvg = T0 / vgd_eff; + + T2 = vgd * vgd_eff; + dT2_dVg = vgd * dvgd_eff_dvg + vgd_eff; + T11 = pParam->BSIM4v6AechvbEdgeD; + T3 = pParam->BSIM4v6aigd * pParam->BSIM4v6cigd + - pParam->BSIM4v6bigd; + T4 = pParam->BSIM4v6bigd * pParam->BSIM4v6cigd; + T5 = T12 * (pParam->BSIM4v6aigd + T3 * vgd_eff + - T4 * vgd_eff * vgd_eff); + if (T5 > EXP_THRESHOLD) + { T6 = MAX_EXP; + dT6_dVg = 0.0; + } + else if (T5 < -EXP_THRESHOLD) + { T6 = MIN_EXP; + dT6_dVg = 0.0; + } + else + { T6 = exp(T5); + dT6_dVg = T6 * T12 * (T3 - 2.0 * T4 * vgd_eff) + * dvgd_eff_dvg; + } + Igd = T11 * T2 * T6; + dIgd_dVg = T11 * (T2 * dT6_dVg + T6 * dT2_dVg); + dIgd_dVd = -dIgd_dVg; + + here->BSIM4v6Igs = Igs; + here->BSIM4v6gIgsg = dIgs_dVg; + here->BSIM4v6gIgss = dIgs_dVs; + here->BSIM4v6Igd = Igd; + here->BSIM4v6gIgdg = dIgd_dVg; + here->BSIM4v6gIgdd = dIgd_dVd; + } + else + { here->BSIM4v6Igcs = here->BSIM4v6gIgcsg = here->BSIM4v6gIgcsd + = here->BSIM4v6gIgcsb = 0.0; + here->BSIM4v6Igcd = here->BSIM4v6gIgcdg = here->BSIM4v6gIgcdd + = here->BSIM4v6gIgcdb = 0.0; + here->BSIM4v6Igs = here->BSIM4v6gIgsg = here->BSIM4v6gIgss = 0.0; + here->BSIM4v6Igd = here->BSIM4v6gIgdg = here->BSIM4v6gIgdd = 0.0; + } + + if (model->BSIM4v6igbMod) + { T0 = tmp * pParam->BSIM4v6nigbacc; + T1 = -Vgs_eff + Vbseff + Vfb; + VxNVt = T1 / T0; + if (VxNVt > EXP_THRESHOLD) + { Vaux = T1; + dVaux_dVg = -dVgs_eff_dVg; + dVaux_dVb = 1.0; + } + else if (VxNVt < -EXP_THRESHOLD) + { Vaux = T0 * log(1.0 + MIN_EXP); + dVaux_dVg = dVaux_dVb = 0.0; + } + else + { ExpVxNVt = exp(VxNVt); + Vaux = T0 * log(1.0 + ExpVxNVt); + dVaux_dVb = ExpVxNVt / (1.0 + ExpVxNVt); + dVaux_dVg = -dVaux_dVb * dVgs_eff_dVg; + } + + T2 = (Vgs_eff - Vbseff) * Vaux; + dT2_dVg = dVgs_eff_dVg * Vaux + (Vgs_eff - Vbseff) * dVaux_dVg; + dT2_dVb = -Vaux + (Vgs_eff - Vbseff) * dVaux_dVb; + + T11 = 4.97232e-7 * pParam->BSIM4v6weff + * pParam->BSIM4v6leff * pParam->BSIM4v6ToxRatio; + T12 = -7.45669e11 * toxe; + T3 = pParam->BSIM4v6aigbacc * pParam->BSIM4v6cigbacc + - pParam->BSIM4v6bigbacc; + T4 = pParam->BSIM4v6bigbacc * pParam->BSIM4v6cigbacc; + T5 = T12 * (pParam->BSIM4v6aigbacc + T3 * Voxacc + - T4 * Voxacc * Voxacc); + + if (T5 > EXP_THRESHOLD) + { T6 = MAX_EXP; + dT6_dVg = dT6_dVb = 0.0; + } + else if (T5 < -EXP_THRESHOLD) + { T6 = MIN_EXP; + dT6_dVg = dT6_dVb = 0.0; + } + else + { T6 = exp(T5); + dT6_dVg = T6 * T12 * (T3 - 2.0 * T4 * Voxacc); + dT6_dVb = dT6_dVg * dVoxacc_dVb; + dT6_dVg *= dVoxacc_dVg; + } + + Igbacc = T11 * T2 * T6; + dIgbacc_dVg = T11 * (T2 * dT6_dVg + T6 * dT2_dVg); + dIgbacc_dVb = T11 * (T2 * dT6_dVb + T6 * dT2_dVb); + + + T0 = tmp * pParam->BSIM4v6nigbinv; + T1 = Voxdepinv - pParam->BSIM4v6eigbinv; + VxNVt = T1 / T0; + if (VxNVt > EXP_THRESHOLD) + { Vaux = T1; + dVaux_dVg = dVoxdepinv_dVg; + dVaux_dVd = dVoxdepinv_dVd; + dVaux_dVb = dVoxdepinv_dVb; + } + else if (VxNVt < -EXP_THRESHOLD) + { Vaux = T0 * log(1.0 + MIN_EXP); + dVaux_dVg = dVaux_dVd = dVaux_dVb = 0.0; + } + else + { ExpVxNVt = exp(VxNVt); + Vaux = T0 * log(1.0 + ExpVxNVt); + dVaux_dVg = ExpVxNVt / (1.0 + ExpVxNVt); + dVaux_dVd = dVaux_dVg * dVoxdepinv_dVd; + dVaux_dVb = dVaux_dVg * dVoxdepinv_dVb; + dVaux_dVg *= dVoxdepinv_dVg; + } + + T2 = (Vgs_eff - Vbseff) * Vaux; + dT2_dVg = dVgs_eff_dVg * Vaux + (Vgs_eff - Vbseff) * dVaux_dVg; + dT2_dVd = (Vgs_eff - Vbseff) * dVaux_dVd; + dT2_dVb = -Vaux + (Vgs_eff - Vbseff) * dVaux_dVb; + + T11 *= 0.75610; + T12 *= 1.31724; + T3 = pParam->BSIM4v6aigbinv * pParam->BSIM4v6cigbinv + - pParam->BSIM4v6bigbinv; + T4 = pParam->BSIM4v6bigbinv * pParam->BSIM4v6cigbinv; + T5 = T12 * (pParam->BSIM4v6aigbinv + T3 * Voxdepinv + - T4 * Voxdepinv * Voxdepinv); + + if (T5 > EXP_THRESHOLD) + { T6 = MAX_EXP; + dT6_dVg = dT6_dVd = dT6_dVb = 0.0; + } + else if (T5 < -EXP_THRESHOLD) + { T6 = MIN_EXP; + dT6_dVg = dT6_dVd = dT6_dVb = 0.0; + } + else + { T6 = exp(T5); + dT6_dVg = T6 * T12 * (T3 - 2.0 * T4 * Voxdepinv); + dT6_dVd = dT6_dVg * dVoxdepinv_dVd; + dT6_dVb = dT6_dVg * dVoxdepinv_dVb; + dT6_dVg *= dVoxdepinv_dVg; + } + + Igbinv = T11 * T2 * T6; + dIgbinv_dVg = T11 * (T2 * dT6_dVg + T6 * dT2_dVg); + dIgbinv_dVd = T11 * (T2 * dT6_dVd + T6 * dT2_dVd); + dIgbinv_dVb = T11 * (T2 * dT6_dVb + T6 * dT2_dVb); + + here->BSIM4v6Igb = Igbinv + Igbacc; + here->BSIM4v6gIgbg = dIgbinv_dVg + dIgbacc_dVg; + here->BSIM4v6gIgbd = dIgbinv_dVd; + here->BSIM4v6gIgbb = (dIgbinv_dVb + dIgbacc_dVb) * dVbseff_dVb; + } + else + { here->BSIM4v6Igb = here->BSIM4v6gIgbg = here->BSIM4v6gIgbd + = here->BSIM4v6gIgbs = here->BSIM4v6gIgbb = 0.0; + } /* End of Gate current */ + + if (here->BSIM4v6nf != 1.0) + { cdrain *= here->BSIM4v6nf; + here->BSIM4v6gds *= here->BSIM4v6nf; + here->BSIM4v6gm *= here->BSIM4v6nf; + here->BSIM4v6gmbs *= here->BSIM4v6nf; + here->BSIM4v6IdovVds *= here->BSIM4v6nf; + + here->BSIM4v6gbbs *= here->BSIM4v6nf; + here->BSIM4v6gbgs *= here->BSIM4v6nf; + here->BSIM4v6gbds *= here->BSIM4v6nf; + here->BSIM4v6csub *= here->BSIM4v6nf; + + here->BSIM4v6Igidl *= here->BSIM4v6nf; + here->BSIM4v6ggidld *= here->BSIM4v6nf; + here->BSIM4v6ggidlg *= here->BSIM4v6nf; + here->BSIM4v6ggidlb *= here->BSIM4v6nf; + + here->BSIM4v6Igisl *= here->BSIM4v6nf; + here->BSIM4v6ggisls *= here->BSIM4v6nf; + here->BSIM4v6ggislg *= here->BSIM4v6nf; + here->BSIM4v6ggislb *= here->BSIM4v6nf; + + here->BSIM4v6Igcs *= here->BSIM4v6nf; + here->BSIM4v6gIgcsg *= here->BSIM4v6nf; + here->BSIM4v6gIgcsd *= here->BSIM4v6nf; + here->BSIM4v6gIgcsb *= here->BSIM4v6nf; + here->BSIM4v6Igcd *= here->BSIM4v6nf; + here->BSIM4v6gIgcdg *= here->BSIM4v6nf; + here->BSIM4v6gIgcdd *= here->BSIM4v6nf; + here->BSIM4v6gIgcdb *= here->BSIM4v6nf; + + here->BSIM4v6Igs *= here->BSIM4v6nf; + here->BSIM4v6gIgsg *= here->BSIM4v6nf; + here->BSIM4v6gIgss *= here->BSIM4v6nf; + here->BSIM4v6Igd *= here->BSIM4v6nf; + here->BSIM4v6gIgdg *= here->BSIM4v6nf; + here->BSIM4v6gIgdd *= here->BSIM4v6nf; + + here->BSIM4v6Igb *= here->BSIM4v6nf; + here->BSIM4v6gIgbg *= here->BSIM4v6nf; + here->BSIM4v6gIgbd *= here->BSIM4v6nf; + here->BSIM4v6gIgbb *= here->BSIM4v6nf; + } + + here->BSIM4v6ggidls = -(here->BSIM4v6ggidld + here->BSIM4v6ggidlg + + here->BSIM4v6ggidlb); + here->BSIM4v6ggisld = -(here->BSIM4v6ggisls + here->BSIM4v6ggislg + + here->BSIM4v6ggislb); + here->BSIM4v6gIgbs = -(here->BSIM4v6gIgbg + here->BSIM4v6gIgbd + + here->BSIM4v6gIgbb); + here->BSIM4v6gIgcss = -(here->BSIM4v6gIgcsg + here->BSIM4v6gIgcsd + + here->BSIM4v6gIgcsb); + here->BSIM4v6gIgcds = -(here->BSIM4v6gIgcdg + here->BSIM4v6gIgcdd + + here->BSIM4v6gIgcdb); + here->BSIM4v6cd = cdrain; + + + if (model->BSIM4v6tnoiMod == 0) + { Abulk = Abulk0 * pParam->BSIM4v6abulkCVfactor; + Vdsat = Vgsteff / Abulk; + T0 = Vdsat - Vds - DELTA_4; + T1 = sqrt(T0 * T0 + 4.0 * DELTA_4 * Vdsat); + if (T0 >= 0.0) + Vdseff = Vdsat - 0.5 * (T0 + T1); + else + { T3 = (DELTA_4 + DELTA_4) / (T1 - T0); + T4 = 1.0 - T3; + T5 = Vdsat * T3 / (T1 - T0); + Vdseff = Vdsat * T4; + } + if (Vds == 0.0) + Vdseff = 0.0; + + T0 = Abulk * Vdseff; + T1 = 12.0 * (Vgsteff - 0.5 * T0 + 1.0e-20); + T2 = Vdseff / T1; + T3 = T0 * T2; + here->BSIM4v6qinv = Coxeff * pParam->BSIM4v6weffCV * here->BSIM4v6nf + * pParam->BSIM4v6leffCV + * (Vgsteff - 0.5 * T0 + Abulk * T3); + } + + /* + * BSIM4v6 C-V begins + */ + + if ((model->BSIM4v6xpart < 0) || (!ChargeComputationNeeded)) + { qgate = qdrn = qsrc = qbulk = 0.0; + here->BSIM4v6cggb = here->BSIM4v6cgsb = here->BSIM4v6cgdb = 0.0; + here->BSIM4v6cdgb = here->BSIM4v6cdsb = here->BSIM4v6cddb = 0.0; + here->BSIM4v6cbgb = here->BSIM4v6cbsb = here->BSIM4v6cbdb = 0.0; + here->BSIM4v6csgb = here->BSIM4v6cssb = here->BSIM4v6csdb = 0.0; + here->BSIM4v6cgbb = here->BSIM4v6csbb = here->BSIM4v6cdbb = here->BSIM4v6cbbb = 0.0; + here->BSIM4v6cqdb = here->BSIM4v6cqsb = here->BSIM4v6cqgb + = here->BSIM4v6cqbb = 0.0; + here->BSIM4v6gtau = 0.0; + goto finished; + } + else if (model->BSIM4v6capMod == 0) + { + if (Vbseff < 0.0) + { VbseffCV = Vbs; /*4.6.2*/ + dVbseffCV_dVb = 1.0; + } + else + { VbseffCV = pParam->BSIM4v6phi - Phis; + dVbseffCV_dVb = -dPhis_dVb * dVbseff_dVb; /*4.6.2*/ + } + + Vfb = pParam->BSIM4v6vfbcv; + Vth = Vfb + pParam->BSIM4v6phi + pParam->BSIM4v6k1ox * sqrtPhis; + Vgst = Vgs_eff - Vth; + dVth_dVb = pParam->BSIM4v6k1ox * dsqrtPhis_dVb *dVbseff_dVb; /*4.6.2*/ + dVgst_dVb = -dVth_dVb; + dVgst_dVg = dVgs_eff_dVg; + + CoxWL = model->BSIM4v6coxe * pParam->BSIM4v6weffCV + * pParam->BSIM4v6leffCV * here->BSIM4v6nf; + Arg1 = Vgs_eff - VbseffCV - Vfb; + + if (Arg1 <= 0.0) + { qgate = CoxWL * Arg1; + qbulk = -qgate; + qdrn = 0.0; + + here->BSIM4v6cggb = CoxWL * dVgs_eff_dVg; + here->BSIM4v6cgdb = 0.0; + here->BSIM4v6cgsb = CoxWL * (dVbseffCV_dVb - dVgs_eff_dVg); + + here->BSIM4v6cdgb = 0.0; + here->BSIM4v6cddb = 0.0; + here->BSIM4v6cdsb = 0.0; + + here->BSIM4v6cbgb = -CoxWL * dVgs_eff_dVg; + here->BSIM4v6cbdb = 0.0; + here->BSIM4v6cbsb = -here->BSIM4v6cgsb; + } /* Arg1 <= 0.0, end of accumulation */ + else if (Vgst <= 0.0) + { T1 = 0.5 * pParam->BSIM4v6k1ox; + T2 = sqrt(T1 * T1 + Arg1); + qgate = CoxWL * pParam->BSIM4v6k1ox * (T2 - T1); + qbulk = -qgate; + qdrn = 0.0; + + T0 = CoxWL * T1 / T2; + here->BSIM4v6cggb = T0 * dVgs_eff_dVg; + here->BSIM4v6cgdb = 0.0; + here->BSIM4v6cgsb = T0 * (dVbseffCV_dVb - dVgs_eff_dVg); + + here->BSIM4v6cdgb = 0.0; + here->BSIM4v6cddb = 0.0; + here->BSIM4v6cdsb = 0.0; + + here->BSIM4v6cbgb = -here->BSIM4v6cggb; + here->BSIM4v6cbdb = 0.0; + here->BSIM4v6cbsb = -here->BSIM4v6cgsb; + } /* Vgst <= 0.0, end of depletion */ + else + { One_Third_CoxWL = CoxWL / 3.0; + Two_Third_CoxWL = 2.0 * One_Third_CoxWL; + + AbulkCV = Abulk0 * pParam->BSIM4v6abulkCVfactor; + dAbulkCV_dVb = pParam->BSIM4v6abulkCVfactor * dAbulk0_dVb*dVbseff_dVb; + + dVdsat_dVg = 1.0 / AbulkCV; /*4.6.2*/ + Vdsat = Vgst * dVdsat_dVg; + dVdsat_dVb = - (Vdsat * dAbulkCV_dVb + dVth_dVb)* dVdsat_dVg; + + if (model->BSIM4v6xpart > 0.5) + { /* 0/100 Charge partition model */ + if (Vdsat <= Vds) + { /* saturation region */ + T1 = Vdsat / 3.0; + qgate = CoxWL * (Vgs_eff - Vfb + - pParam->BSIM4v6phi - T1); + T2 = -Two_Third_CoxWL * Vgst; + qbulk = -(qgate + T2); + qdrn = 0.0; + + here->BSIM4v6cggb = One_Third_CoxWL * (3.0 + - dVdsat_dVg) * dVgs_eff_dVg; + T2 = -One_Third_CoxWL * dVdsat_dVb; + here->BSIM4v6cgsb = -(here->BSIM4v6cggb + T2); + here->BSIM4v6cgdb = 0.0; + + here->BSIM4v6cdgb = 0.0; + here->BSIM4v6cddb = 0.0; + here->BSIM4v6cdsb = 0.0; + + here->BSIM4v6cbgb = -(here->BSIM4v6cggb + - Two_Third_CoxWL * dVgs_eff_dVg); + T3 = -(T2 + Two_Third_CoxWL * dVth_dVb); + here->BSIM4v6cbsb = -(here->BSIM4v6cbgb + T3); + here->BSIM4v6cbdb = 0.0; + } + else + { /* linear region */ + Alphaz = Vgst / Vdsat; + T1 = 2.0 * Vdsat - Vds; + T2 = Vds / (3.0 * T1); + T3 = T2 * Vds; + T9 = 0.25 * CoxWL; + T4 = T9 * Alphaz; + T7 = 2.0 * Vds - T1 - 3.0 * T3; + T8 = T3 - T1 - 2.0 * Vds; + qgate = CoxWL * (Vgs_eff - Vfb + - pParam->BSIM4v6phi - 0.5 * (Vds - T3)); + T10 = T4 * T8; + qdrn = T4 * T7; + qbulk = -(qgate + qdrn + T10); + + T5 = T3 / T1; + here->BSIM4v6cggb = CoxWL * (1.0 - T5 * dVdsat_dVg) + * dVgs_eff_dVg; + T11 = -CoxWL * T5 * dVdsat_dVb; + here->BSIM4v6cgdb = CoxWL * (T2 - 0.5 + 0.5 * T5); + here->BSIM4v6cgsb = -(here->BSIM4v6cggb + T11 + + here->BSIM4v6cgdb); + T6 = 1.0 / Vdsat; + dAlphaz_dVg = T6 * (1.0 - Alphaz * dVdsat_dVg); + dAlphaz_dVb = -T6 * (dVth_dVb + Alphaz * dVdsat_dVb); + T7 = T9 * T7; + T8 = T9 * T8; + T9 = 2.0 * T4 * (1.0 - 3.0 * T5); + here->BSIM4v6cdgb = (T7 * dAlphaz_dVg - T9 + * dVdsat_dVg) * dVgs_eff_dVg; + T12 = T7 * dAlphaz_dVb - T9 * dVdsat_dVb; + here->BSIM4v6cddb = T4 * (3.0 - 6.0 * T2 - 3.0 * T5); + here->BSIM4v6cdsb = -(here->BSIM4v6cdgb + T12 + + here->BSIM4v6cddb); + + T9 = 2.0 * T4 * (1.0 + T5); + T10 = (T8 * dAlphaz_dVg - T9 * dVdsat_dVg) + * dVgs_eff_dVg; + T11 = T8 * dAlphaz_dVb - T9 * dVdsat_dVb; + T12 = T4 * (2.0 * T2 + T5 - 1.0); + T0 = -(T10 + T11 + T12); + + here->BSIM4v6cbgb = -(here->BSIM4v6cggb + + here->BSIM4v6cdgb + T10); + here->BSIM4v6cbdb = -(here->BSIM4v6cgdb + + here->BSIM4v6cddb + T12); + here->BSIM4v6cbsb = -(here->BSIM4v6cgsb + + here->BSIM4v6cdsb + T0); + } + } + else if (model->BSIM4v6xpart < 0.5) + { /* 40/60 Charge partition model */ + if (Vds >= Vdsat) + { /* saturation region */ + T1 = Vdsat / 3.0; + qgate = CoxWL * (Vgs_eff - Vfb + - pParam->BSIM4v6phi - T1); + T2 = -Two_Third_CoxWL * Vgst; + qbulk = -(qgate + T2); + qdrn = 0.4 * T2; + + here->BSIM4v6cggb = One_Third_CoxWL * (3.0 + - dVdsat_dVg) * dVgs_eff_dVg; + T2 = -One_Third_CoxWL * dVdsat_dVb; + here->BSIM4v6cgsb = -(here->BSIM4v6cggb + T2); + here->BSIM4v6cgdb = 0.0; + + T3 = 0.4 * Two_Third_CoxWL; + here->BSIM4v6cdgb = -T3 * dVgs_eff_dVg; + here->BSIM4v6cddb = 0.0; + T4 = T3 * dVth_dVb; + here->BSIM4v6cdsb = -(T4 + here->BSIM4v6cdgb); + + here->BSIM4v6cbgb = -(here->BSIM4v6cggb + - Two_Third_CoxWL * dVgs_eff_dVg); + T3 = -(T2 + Two_Third_CoxWL * dVth_dVb); + here->BSIM4v6cbsb = -(here->BSIM4v6cbgb + T3); + here->BSIM4v6cbdb = 0.0; + } + else + { /* linear region */ + Alphaz = Vgst / Vdsat; + T1 = 2.0 * Vdsat - Vds; + T2 = Vds / (3.0 * T1); + T3 = T2 * Vds; + T9 = 0.25 * CoxWL; + T4 = T9 * Alphaz; + qgate = CoxWL * (Vgs_eff - Vfb - pParam->BSIM4v6phi + - 0.5 * (Vds - T3)); + + T5 = T3 / T1; + here->BSIM4v6cggb = CoxWL * (1.0 - T5 * dVdsat_dVg) + * dVgs_eff_dVg; + tmp = -CoxWL * T5 * dVdsat_dVb; + here->BSIM4v6cgdb = CoxWL * (T2 - 0.5 + 0.5 * T5); + here->BSIM4v6cgsb = -(here->BSIM4v6cggb + + here->BSIM4v6cgdb + tmp); + + T6 = 1.0 / Vdsat; + dAlphaz_dVg = T6 * (1.0 - Alphaz * dVdsat_dVg); + dAlphaz_dVb = -T6 * (dVth_dVb + Alphaz * dVdsat_dVb); + + T6 = 8.0 * Vdsat * Vdsat - 6.0 * Vdsat * Vds + + 1.2 * Vds * Vds; + T8 = T2 / T1; + T7 = Vds - T1 - T8 * T6; + qdrn = T4 * T7; + T7 *= T9; + tmp = T8 / T1; + tmp1 = T4 * (2.0 - 4.0 * tmp * T6 + + T8 * (16.0 * Vdsat - 6.0 * Vds)); + + here->BSIM4v6cdgb = (T7 * dAlphaz_dVg - tmp1 + * dVdsat_dVg) * dVgs_eff_dVg; + T10 = T7 * dAlphaz_dVb - tmp1 * dVdsat_dVb; + here->BSIM4v6cddb = T4 * (2.0 - (1.0 / (3.0 * T1 + * T1) + 2.0 * tmp) * T6 + T8 + * (6.0 * Vdsat - 2.4 * Vds)); + here->BSIM4v6cdsb = -(here->BSIM4v6cdgb + + T10 + here->BSIM4v6cddb); + + T7 = 2.0 * (T1 + T3); + qbulk = -(qgate - T4 * T7); + T7 *= T9; + T0 = 4.0 * T4 * (1.0 - T5); + T12 = (-T7 * dAlphaz_dVg - T0 * dVdsat_dVg) * dVgs_eff_dVg + - here->BSIM4v6cdgb; /*4.6.2*/ + T11 = -T7 * dAlphaz_dVb - T10 - T0 * dVdsat_dVb; + T10 = -4.0 * T4 * (T2 - 0.5 + 0.5 * T5) + - here->BSIM4v6cddb; + tmp = -(T10 + T11 + T12); + + here->BSIM4v6cbgb = -(here->BSIM4v6cggb + + here->BSIM4v6cdgb + T12); + here->BSIM4v6cbdb = -(here->BSIM4v6cgdb + + here->BSIM4v6cddb + T10); + here->BSIM4v6cbsb = -(here->BSIM4v6cgsb + + here->BSIM4v6cdsb + tmp); + } + } + else + { /* 50/50 partitioning */ + if (Vds >= Vdsat) + { /* saturation region */ + T1 = Vdsat / 3.0; + qgate = CoxWL * (Vgs_eff - Vfb + - pParam->BSIM4v6phi - T1); + T2 = -Two_Third_CoxWL * Vgst; + qbulk = -(qgate + T2); + qdrn = 0.5 * T2; + + here->BSIM4v6cggb = One_Third_CoxWL * (3.0 + - dVdsat_dVg) * dVgs_eff_dVg; + T2 = -One_Third_CoxWL * dVdsat_dVb; + here->BSIM4v6cgsb = -(here->BSIM4v6cggb + T2); + here->BSIM4v6cgdb = 0.0; + + here->BSIM4v6cdgb = -One_Third_CoxWL * dVgs_eff_dVg; + here->BSIM4v6cddb = 0.0; + T4 = One_Third_CoxWL * dVth_dVb; + here->BSIM4v6cdsb = -(T4 + here->BSIM4v6cdgb); + + here->BSIM4v6cbgb = -(here->BSIM4v6cggb + - Two_Third_CoxWL * dVgs_eff_dVg); + T3 = -(T2 + Two_Third_CoxWL * dVth_dVb); + here->BSIM4v6cbsb = -(here->BSIM4v6cbgb + T3); + here->BSIM4v6cbdb = 0.0; + } + else + { /* linear region */ + Alphaz = Vgst / Vdsat; + T1 = 2.0 * Vdsat - Vds; + T2 = Vds / (3.0 * T1); + T3 = T2 * Vds; + T9 = 0.25 * CoxWL; + T4 = T9 * Alphaz; + qgate = CoxWL * (Vgs_eff - Vfb - pParam->BSIM4v6phi + - 0.5 * (Vds - T3)); + + T5 = T3 / T1; + here->BSIM4v6cggb = CoxWL * (1.0 - T5 * dVdsat_dVg) + * dVgs_eff_dVg; + tmp = -CoxWL * T5 * dVdsat_dVb; + here->BSIM4v6cgdb = CoxWL * (T2 - 0.5 + 0.5 * T5); + here->BSIM4v6cgsb = -(here->BSIM4v6cggb + + here->BSIM4v6cgdb + tmp); + + T6 = 1.0 / Vdsat; + dAlphaz_dVg = T6 * (1.0 - Alphaz * dVdsat_dVg); + dAlphaz_dVb = -T6 * (dVth_dVb + Alphaz * dVdsat_dVb); + + T7 = T1 + T3; + qdrn = -T4 * T7; + qbulk = - (qgate + qdrn + qdrn); + T7 *= T9; + T0 = T4 * (2.0 * T5 - 2.0); + + here->BSIM4v6cdgb = (T0 * dVdsat_dVg - T7 + * dAlphaz_dVg) * dVgs_eff_dVg; + T12 = T0 * dVdsat_dVb - T7 * dAlphaz_dVb; + here->BSIM4v6cddb = T4 * (1.0 - 2.0 * T2 - T5); + here->BSIM4v6cdsb = -(here->BSIM4v6cdgb + T12 + + here->BSIM4v6cddb); + + here->BSIM4v6cbgb = -(here->BSIM4v6cggb + + 2.0 * here->BSIM4v6cdgb); + here->BSIM4v6cbdb = -(here->BSIM4v6cgdb + + 2.0 * here->BSIM4v6cddb); + here->BSIM4v6cbsb = -(here->BSIM4v6cgsb + + 2.0 * here->BSIM4v6cdsb); + } /* end of linear region */ + } /* end of 50/50 partition */ + } /* end of inversion */ + } /* end of capMod=0 */ + else + { if (Vbseff < 0.0) + { VbseffCV = Vbseff; + dVbseffCV_dVb = 1.0; + } + else + { VbseffCV = pParam->BSIM4v6phi - Phis; + dVbseffCV_dVb = -dPhis_dVb; + } + + CoxWL = model->BSIM4v6coxe * pParam->BSIM4v6weffCV + * pParam->BSIM4v6leffCV * here->BSIM4v6nf; + + if(model->BSIM4v6cvchargeMod == 0) + { + /* Seperate VgsteffCV with noff and voffcv */ + noff = n * pParam->BSIM4v6noff; + dnoff_dVd = pParam->BSIM4v6noff * dn_dVd; + dnoff_dVb = pParam->BSIM4v6noff * dn_dVb; + T0 = Vtm * noff; + voffcv = pParam->BSIM4v6voffcv; + VgstNVt = (Vgst - voffcv) / T0; + + if (VgstNVt > EXP_THRESHOLD) + { + Vgsteff = Vgst - voffcv; + dVgsteff_dVg = dVgs_eff_dVg; + dVgsteff_dVd = -dVth_dVd; + dVgsteff_dVb = -dVth_dVb; + } + else if (VgstNVt < -EXP_THRESHOLD) + { + Vgsteff = T0 * log(1.0 + MIN_EXP); + dVgsteff_dVg = 0.0; + dVgsteff_dVd = Vgsteff / noff; + dVgsteff_dVb = dVgsteff_dVd * dnoff_dVb; + dVgsteff_dVd *= dnoff_dVd; + } + else + { + ExpVgst = exp(VgstNVt); + Vgsteff = T0 * log(1.0 + ExpVgst); + dVgsteff_dVg = ExpVgst / (1.0 + ExpVgst); + dVgsteff_dVd = -dVgsteff_dVg * (dVth_dVd + (Vgst - voffcv) + / noff * dnoff_dVd) + Vgsteff / noff * dnoff_dVd; + dVgsteff_dVb = -dVgsteff_dVg * (dVth_dVb + (Vgst - voffcv) + / noff * dnoff_dVb) + Vgsteff / noff * dnoff_dVb; + dVgsteff_dVg *= dVgs_eff_dVg; + } + /* End of VgsteffCV for cvchargeMod = 0 */ + } + else + { + T0 = n * Vtm; + T1 = pParam->BSIM4v6mstarcv * Vgst; + T2 = T1 / T0; + if (T2 > EXP_THRESHOLD) + { + T10 = T1; + dT10_dVg = pParam->BSIM4v6mstarcv * dVgs_eff_dVg; + dT10_dVd = -dVth_dVd * pParam->BSIM4v6mstarcv; + dT10_dVb = -dVth_dVb * pParam->BSIM4v6mstarcv; + } + else if (T2 < -EXP_THRESHOLD) + { + T10 = Vtm * log(1.0 + MIN_EXP); + dT10_dVg = 0.0; + dT10_dVd = T10 * dn_dVd; + dT10_dVb = T10 * dn_dVb; + T10 *= n; + } + else + { + ExpVgst = exp(T2); + T3 = Vtm * log(1.0 + ExpVgst); + T10 = n * T3; + dT10_dVg = pParam->BSIM4v6mstarcv * ExpVgst / (1.0 + ExpVgst); + dT10_dVb = T3 * dn_dVb - dT10_dVg * (dVth_dVb + Vgst * dn_dVb / n); + dT10_dVd = T3 * dn_dVd - dT10_dVg * (dVth_dVd + Vgst * dn_dVd / n); + dT10_dVg *= dVgs_eff_dVg; + } + + T1 = pParam->BSIM4v6voffcbncv - (1.0 - pParam->BSIM4v6mstarcv) * Vgst; + T2 = T1 / T0; + if (T2 < -EXP_THRESHOLD) + { + T3 = model->BSIM4v6coxe * MIN_EXP / pParam->BSIM4v6cdep0; + T9 = pParam->BSIM4v6mstarcv + T3 * n; + dT9_dVg = 0.0; + dT9_dVd = dn_dVd * T3; + dT9_dVb = dn_dVb * T3; + } + else if (T2 > EXP_THRESHOLD) + { + T3 = model->BSIM4v6coxe * MAX_EXP / pParam->BSIM4v6cdep0; + T9 = pParam->BSIM4v6mstarcv + T3 * n; + dT9_dVg = 0.0; + dT9_dVd = dn_dVd * T3; + dT9_dVb = dn_dVb * T3; + } + else + { + ExpVgst = exp(T2); + T3 = model->BSIM4v6coxe / pParam->BSIM4v6cdep0; + T4 = T3 * ExpVgst; + T5 = T1 * T4 / T0; + T9 = pParam->BSIM4v6mstarcv + n * T4; + dT9_dVg = T3 * (pParam->BSIM4v6mstarcv - 1.0) * ExpVgst / Vtm; + dT9_dVb = T4 * dn_dVb - dT9_dVg * dVth_dVb - T5 * dn_dVb; + dT9_dVd = T4 * dn_dVd - dT9_dVg * dVth_dVd - T5 * dn_dVd; + dT9_dVg *= dVgs_eff_dVg; + } + + Vgsteff = T10 / T9; + T11 = T9 * T9; + dVgsteff_dVg = (T9 * dT10_dVg - T10 * dT9_dVg) / T11; + dVgsteff_dVd = (T9 * dT10_dVd - T10 * dT9_dVd) / T11; + dVgsteff_dVb = (T9 * dT10_dVb - T10 * dT9_dVb) / T11; + /* End of VgsteffCV for cvchargeMod = 1 */ + } + + + if (model->BSIM4v6capMod == 1) + { Vfb = here->BSIM4v6vfbzb; + V3 = Vfb - Vgs_eff + VbseffCV - DELTA_3; + if (Vfb <= 0.0) + T0 = sqrt(V3 * V3 - 4.0 * DELTA_3 * Vfb); + else + T0 = sqrt(V3 * V3 + 4.0 * DELTA_3 * Vfb); + + T1 = 0.5 * (1.0 + V3 / T0); + Vfbeff = Vfb - 0.5 * (V3 + T0); + dVfbeff_dVg = T1 * dVgs_eff_dVg; + dVfbeff_dVb = -T1 * dVbseffCV_dVb; + Qac0 = CoxWL * (Vfbeff - Vfb); + dQac0_dVg = CoxWL * dVfbeff_dVg; + dQac0_dVb = CoxWL * dVfbeff_dVb; + + T0 = 0.5 * pParam->BSIM4v6k1ox; + T3 = Vgs_eff - Vfbeff - VbseffCV - Vgsteff; + if (pParam->BSIM4v6k1ox == 0.0) + { T1 = 0.0; + T2 = 0.0; + } + else if (T3 < 0.0) + { T1 = T0 + T3 / pParam->BSIM4v6k1ox; + T2 = CoxWL; + } + else + { T1 = sqrt(T0 * T0 + T3); + T2 = CoxWL * T0 / T1; + } + + Qsub0 = CoxWL * pParam->BSIM4v6k1ox * (T1 - T0); + + dQsub0_dVg = T2 * (dVgs_eff_dVg - dVfbeff_dVg - dVgsteff_dVg); + dQsub0_dVd = -T2 * dVgsteff_dVd; + dQsub0_dVb = -T2 * (dVfbeff_dVb + dVbseffCV_dVb + + dVgsteff_dVb); + + AbulkCV = Abulk0 * pParam->BSIM4v6abulkCVfactor; + dAbulkCV_dVb = pParam->BSIM4v6abulkCVfactor * dAbulk0_dVb; + VdsatCV = Vgsteff / AbulkCV; + + T0 = VdsatCV - Vds - DELTA_4; + dT0_dVg = 1.0 / AbulkCV; + dT0_dVb = -VdsatCV * dAbulkCV_dVb / AbulkCV; + T1 = sqrt(T0 * T0 + 4.0 * DELTA_4 * VdsatCV); + dT1_dVg = (T0 + DELTA_4 + DELTA_4) / T1; + dT1_dVd = -T0 / T1; + dT1_dVb = dT1_dVg * dT0_dVb; + dT1_dVg *= dT0_dVg; + if (T0 >= 0.0) + { VdseffCV = VdsatCV - 0.5 * (T0 + T1); + dVdseffCV_dVg = 0.5 * (dT0_dVg - dT1_dVg); + dVdseffCV_dVd = 0.5 * (1.0 - dT1_dVd); + dVdseffCV_dVb = 0.5 * (dT0_dVb - dT1_dVb); + } + else + { T3 = (DELTA_4 + DELTA_4) / (T1 - T0); + T4 = 1.0 - T3; + T5 = VdsatCV * T3 / (T1 - T0); + VdseffCV = VdsatCV * T4; + dVdseffCV_dVg = dT0_dVg * T4 + T5 * (dT1_dVg - dT0_dVg); + dVdseffCV_dVd = T5 * (dT1_dVd + 1.0); + dVdseffCV_dVb = dT0_dVb * (T4 - T5) + T5 * dT1_dVb; + } + + if (Vds == 0.0) + { VdseffCV = 0.0; + dVdseffCV_dVg = 0.0; + dVdseffCV_dVb = 0.0; + } + + T0 = AbulkCV * VdseffCV; + T1 = 12.0 * (Vgsteff - 0.5 * T0 + 1.0e-20); + T2 = VdseffCV / T1; + T3 = T0 * T2; + + T4 = (1.0 - 12.0 * T2 * T2 * AbulkCV); + T5 = (6.0 * T0 * (4.0 * Vgsteff - T0) / (T1 * T1) - 0.5); + T6 = 12.0 * T2 * T2 * Vgsteff; + + qgate = CoxWL * (Vgsteff - 0.5 * VdseffCV + T3); + Cgg1 = CoxWL * (T4 + T5 * dVdseffCV_dVg); + Cgd1 = CoxWL * T5 * dVdseffCV_dVd + Cgg1 * dVgsteff_dVd; + Cgb1 = CoxWL * (T5 * dVdseffCV_dVb + T6 * dAbulkCV_dVb) + + Cgg1 * dVgsteff_dVb; + Cgg1 *= dVgsteff_dVg; + + T7 = 1.0 - AbulkCV; + qbulk = CoxWL * T7 * (0.5 * VdseffCV - T3); + T4 = -T7 * (T4 - 1.0); + T5 = -T7 * T5; + T6 = -(T7 * T6 + (0.5 * VdseffCV - T3)); + Cbg1 = CoxWL * (T4 + T5 * dVdseffCV_dVg); + Cbd1 = CoxWL * T5 * dVdseffCV_dVd + Cbg1 * dVgsteff_dVd; + Cbb1 = CoxWL * (T5 * dVdseffCV_dVb + T6 * dAbulkCV_dVb) + + Cbg1 * dVgsteff_dVb; + Cbg1 *= dVgsteff_dVg; + + if (model->BSIM4v6xpart > 0.5) + { /* 0/100 Charge petition model */ + T1 = T1 + T1; + qsrc = -CoxWL * (0.5 * Vgsteff + 0.25 * T0 + - T0 * T0 / T1); + T7 = (4.0 * Vgsteff - T0) / (T1 * T1); + T4 = -(0.5 + 24.0 * T0 * T0 / (T1 * T1)); + T5 = -(0.25 * AbulkCV - 12.0 * AbulkCV * T0 * T7); + T6 = -(0.25 * VdseffCV - 12.0 * T0 * VdseffCV * T7); + Csg = CoxWL * (T4 + T5 * dVdseffCV_dVg); + Csd = CoxWL * T5 * dVdseffCV_dVd + Csg * dVgsteff_dVd; + Csb = CoxWL * (T5 * dVdseffCV_dVb + T6 * dAbulkCV_dVb) + + Csg * dVgsteff_dVb; + Csg *= dVgsteff_dVg; + } + else if (model->BSIM4v6xpart < 0.5) + { /* 40/60 Charge petition model */ + T1 = T1 / 12.0; + T2 = 0.5 * CoxWL / (T1 * T1); + T3 = Vgsteff * (2.0 * T0 * T0 / 3.0 + Vgsteff + * (Vgsteff - 4.0 * T0 / 3.0)) + - 2.0 * T0 * T0 * T0 / 15.0; + qsrc = -T2 * T3; + T7 = 4.0 / 3.0 * Vgsteff * (Vgsteff - T0) + + 0.4 * T0 * T0; + T4 = -2.0 * qsrc / T1 - T2 * (Vgsteff * (3.0 + * Vgsteff - 8.0 * T0 / 3.0) + + 2.0 * T0 * T0 / 3.0); + T5 = (qsrc / T1 + T2 * T7) * AbulkCV; + T6 = (qsrc / T1 * VdseffCV + T2 * T7 * VdseffCV); + Csg = (T4 + T5 * dVdseffCV_dVg); + Csd = T5 * dVdseffCV_dVd + Csg * dVgsteff_dVd; + Csb = (T5 * dVdseffCV_dVb + T6 * dAbulkCV_dVb) + + Csg * dVgsteff_dVb; + Csg *= dVgsteff_dVg; + } + else + { /* 50/50 Charge petition model */ + qsrc = -0.5 * (qgate + qbulk); + Csg = -0.5 * (Cgg1 + Cbg1); + Csb = -0.5 * (Cgb1 + Cbb1); + Csd = -0.5 * (Cgd1 + Cbd1); + } + + qgate += Qac0 + Qsub0; + qbulk -= (Qac0 + Qsub0); + qdrn = -(qgate + qbulk + qsrc); + + Cgg = dQac0_dVg + dQsub0_dVg + Cgg1; + Cgd = dQsub0_dVd + Cgd1; + Cgb = dQac0_dVb + dQsub0_dVb + Cgb1; + + Cbg = Cbg1 - dQac0_dVg - dQsub0_dVg; + Cbd = Cbd1 - dQsub0_dVd; + Cbb = Cbb1 - dQac0_dVb - dQsub0_dVb; + + Cgb *= dVbseff_dVb; + Cbb *= dVbseff_dVb; + Csb *= dVbseff_dVb; + + here->BSIM4v6cggb = Cgg; + here->BSIM4v6cgsb = -(Cgg + Cgd + Cgb); + here->BSIM4v6cgdb = Cgd; + here->BSIM4v6cdgb = -(Cgg + Cbg + Csg); + here->BSIM4v6cdsb = (Cgg + Cgd + Cgb + Cbg + Cbd + Cbb + + Csg + Csd + Csb); + here->BSIM4v6cddb = -(Cgd + Cbd + Csd); + here->BSIM4v6cbgb = Cbg; + here->BSIM4v6cbsb = -(Cbg + Cbd + Cbb); + here->BSIM4v6cbdb = Cbd; + } + + /* Charge-Thickness capMod (CTM) begins */ + else if (model->BSIM4v6capMod == 2) + { V3 = here->BSIM4v6vfbzb - Vgs_eff + VbseffCV - DELTA_3; + if (here->BSIM4v6vfbzb <= 0.0) + T0 = sqrt(V3 * V3 - 4.0 * DELTA_3 * here->BSIM4v6vfbzb); + else + T0 = sqrt(V3 * V3 + 4.0 * DELTA_3 * here->BSIM4v6vfbzb); + + T1 = 0.5 * (1.0 + V3 / T0); + Vfbeff = here->BSIM4v6vfbzb - 0.5 * (V3 + T0); + dVfbeff_dVg = T1 * dVgs_eff_dVg; + dVfbeff_dVb = -T1 * dVbseffCV_dVb; + + Cox = model->BSIM4v6coxp; + Tox = 1.0e8 * model->BSIM4v6toxp; + T0 = (Vgs_eff - VbseffCV - here->BSIM4v6vfbzb) / Tox; + dT0_dVg = dVgs_eff_dVg / Tox; + dT0_dVb = -dVbseffCV_dVb / Tox; + + tmp = T0 * pParam->BSIM4v6acde; + if ((-EXP_THRESHOLD < tmp) && (tmp < EXP_THRESHOLD)) + { Tcen = pParam->BSIM4v6ldeb * exp(tmp); + dTcen_dVg = pParam->BSIM4v6acde * Tcen; + dTcen_dVb = dTcen_dVg * dT0_dVb; + dTcen_dVg *= dT0_dVg; + } + else if (tmp <= -EXP_THRESHOLD) + { Tcen = pParam->BSIM4v6ldeb * MIN_EXP; + dTcen_dVg = dTcen_dVb = 0.0; + } + else + { Tcen = pParam->BSIM4v6ldeb * MAX_EXP; + dTcen_dVg = dTcen_dVb = 0.0; + } + + LINK = 1.0e-3 * model->BSIM4v6toxp; + V3 = pParam->BSIM4v6ldeb - Tcen - LINK; + V4 = sqrt(V3 * V3 + 4.0 * LINK * pParam->BSIM4v6ldeb); + Tcen = pParam->BSIM4v6ldeb - 0.5 * (V3 + V4); + T1 = 0.5 * (1.0 + V3 / V4); + dTcen_dVg *= T1; + dTcen_dVb *= T1; + + Ccen = epssub / Tcen; + T2 = Cox / (Cox + Ccen); + Coxeff = T2 * Ccen; + T3 = -Ccen / Tcen; + dCoxeff_dVg = T2 * T2 * T3; + dCoxeff_dVb = dCoxeff_dVg * dTcen_dVb; + dCoxeff_dVg *= dTcen_dVg; + CoxWLcen = CoxWL * Coxeff / model->BSIM4v6coxe; + + Qac0 = CoxWLcen * (Vfbeff - here->BSIM4v6vfbzb); + QovCox = Qac0 / Coxeff; + dQac0_dVg = CoxWLcen * dVfbeff_dVg + + QovCox * dCoxeff_dVg; + dQac0_dVb = CoxWLcen * dVfbeff_dVb + + QovCox * dCoxeff_dVb; + + T0 = 0.5 * pParam->BSIM4v6k1ox; + T3 = Vgs_eff - Vfbeff - VbseffCV - Vgsteff; + if (pParam->BSIM4v6k1ox == 0.0) + { T1 = 0.0; + T2 = 0.0; + } + else if (T3 < 0.0) + { T1 = T0 + T3 / pParam->BSIM4v6k1ox; + T2 = CoxWLcen; + } + else + { T1 = sqrt(T0 * T0 + T3); + T2 = CoxWLcen * T0 / T1; + } + + Qsub0 = CoxWLcen * pParam->BSIM4v6k1ox * (T1 - T0); + QovCox = Qsub0 / Coxeff; + dQsub0_dVg = T2 * (dVgs_eff_dVg - dVfbeff_dVg - dVgsteff_dVg) + + QovCox * dCoxeff_dVg; + dQsub0_dVd = -T2 * dVgsteff_dVd; + dQsub0_dVb = -T2 * (dVfbeff_dVb + dVbseffCV_dVb + dVgsteff_dVb) + + QovCox * dCoxeff_dVb; + + /* Gate-bias dependent delta Phis begins */ + if (pParam->BSIM4v6k1ox <= 0.0) + { Denomi = 0.25 * pParam->BSIM4v6moin * Vtm; + T0 = 0.5 * pParam->BSIM4v6sqrtPhi; + } + else + { Denomi = pParam->BSIM4v6moin * Vtm + * pParam->BSIM4v6k1ox * pParam->BSIM4v6k1ox; + T0 = pParam->BSIM4v6k1ox * pParam->BSIM4v6sqrtPhi; + } + T1 = 2.0 * T0 + Vgsteff; + + DeltaPhi = Vtm * log(1.0 + T1 * Vgsteff / Denomi); + 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->BSIM4v6vtfbphi2) / Tox; + tmp = exp(model->BSIM4v6bdos * 0.7 * log(T0)); + T1 = 1.0 + tmp; + T2 = model->BSIM4v6bdos * 0.7 * tmp / (T0 * Tox); + Tcen = model->BSIM4v6ados * 1.9e-9 / T1; + dTcen_dVg = -Tcen * T2 / T1; + dTcen_dVd = dTcen_dVg * dVgsteff_dVd; + dTcen_dVb = dTcen_dVg * dVgsteff_dVb; + dTcen_dVg *= dVgsteff_dVg; + + Ccen = epssub / Tcen; + T0 = Cox / (Cox + Ccen); + Coxeff = T0 * Ccen; + T1 = -Ccen / Tcen; + dCoxeff_dVg = T0 * T0 * T1; + dCoxeff_dVd = dCoxeff_dVg * dTcen_dVd; + dCoxeff_dVb = dCoxeff_dVg * dTcen_dVb; + dCoxeff_dVg *= dTcen_dVg; + CoxWLcen = CoxWL * Coxeff / model->BSIM4v6coxe; + + AbulkCV = Abulk0 * pParam->BSIM4v6abulkCVfactor; + dAbulkCV_dVb = pParam->BSIM4v6abulkCVfactor * dAbulk0_dVb; + VdsatCV = VgDP / AbulkCV; + + T0 = VdsatCV - Vds - DELTA_4; + 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; + dT1_dVd = -T0 / T1; + dT1_dVb = dT1_dVg * dT0_dVb; + dT1_dVg *= dT0_dVg; + if (T0 >= 0.0) + { VdseffCV = VdsatCV - 0.5 * (T0 + T1); + dVdseffCV_dVg = 0.5 * (dT0_dVg - dT1_dVg); + dVdseffCV_dVd = 0.5 * (1.0 - dT1_dVd); + dVdseffCV_dVb = 0.5 * (dT0_dVb - dT1_dVb); + } + else + { T3 = (DELTA_4 + DELTA_4) / (T1 - T0); + T4 = 1.0 - T3; + T5 = VdsatCV * T3 / (T1 - T0); + VdseffCV = VdsatCV * T4; + dVdseffCV_dVg = dT0_dVg * T4 + T5 * (dT1_dVg - dT0_dVg); + dVdseffCV_dVd = T5 * (dT1_dVd + 1.0); + dVdseffCV_dVb = dT0_dVb * (T4 - T5) + T5 * dT1_dVb; + } + + if (Vds == 0.0) + { VdseffCV = 0.0; + dVdseffCV_dVg = 0.0; + dVdseffCV_dVb = 0.0; + } + + T0 = AbulkCV * VdseffCV; + T1 = VgDP; + T2 = 12.0 * (T1 - 0.5 * T0 + 1.0e-20); + T3 = T0 / T2; + T4 = 1.0 - 12.0 * T3 * T3; + T5 = AbulkCV * (6.0 * T0 * (4.0 * T1 - T0) / (T2 * T2) - 0.5); + T6 = T5 * VdseffCV / AbulkCV; + + qgate = CoxWLcen * (T1 - T0 * (0.5 - T3)); + QovCox = qgate / Coxeff; + Cgg1 = CoxWLcen * (T4 * dVgDP_dVg + + T5 * dVdseffCV_dVg); + Cgd1 = CoxWLcen * T5 * dVdseffCV_dVd + Cgg1 + * dVgsteff_dVd + QovCox * dCoxeff_dVd; + Cgb1 = CoxWLcen * (T5 * dVdseffCV_dVb + T6 * dAbulkCV_dVb) + + Cgg1 * dVgsteff_dVb + QovCox * dCoxeff_dVb; + Cgg1 = Cgg1 * dVgsteff_dVg + QovCox * dCoxeff_dVg; + + + T7 = 1.0 - AbulkCV; + T8 = T2 * T2; + T9 = 12.0 * T7 * T0 * T0 / (T8 * AbulkCV); + T10 = T9 * dVgDP_dVg; + T11 = -T7 * T5 / AbulkCV; + T12 = -(T9 * T1 / AbulkCV + VdseffCV * (0.5 - T0 / T2)); + + qbulk = CoxWLcen * T7 * (0.5 * VdseffCV - T0 * VdseffCV / T2); + QovCox = qbulk / Coxeff; + Cbg1 = CoxWLcen * (T10 + T11 * dVdseffCV_dVg); + Cbd1 = CoxWLcen * T11 * dVdseffCV_dVd + Cbg1 + * dVgsteff_dVd + QovCox * dCoxeff_dVd; + Cbb1 = CoxWLcen * (T11 * dVdseffCV_dVb + T12 * dAbulkCV_dVb) + + Cbg1 * dVgsteff_dVb + QovCox * dCoxeff_dVb; + Cbg1 = Cbg1 * dVgsteff_dVg + QovCox * dCoxeff_dVg; + + if (model->BSIM4v6xpart > 0.5) + { /* 0/100 partition */ + qsrc = -CoxWLcen * (T1 / 2.0 + T0 / 4.0 + - 0.5 * T0 * T0 / T2); + QovCox = qsrc / Coxeff; + T2 += T2; + T3 = T2 * T2; + T7 = -(0.25 - 12.0 * T0 * (4.0 * T1 - T0) / T3); + T4 = -(0.5 + 24.0 * T0 * T0 / T3) * dVgDP_dVg; + T5 = T7 * AbulkCV; + T6 = T7 * VdseffCV; + + Csg = CoxWLcen * (T4 + T5 * dVdseffCV_dVg); + Csd = CoxWLcen * T5 * dVdseffCV_dVd + Csg * dVgsteff_dVd + + QovCox * dCoxeff_dVd; + Csb = CoxWLcen * (T5 * dVdseffCV_dVb + T6 * dAbulkCV_dVb) + + Csg * dVgsteff_dVb + QovCox * dCoxeff_dVb; + Csg = Csg * dVgsteff_dVg + QovCox * dCoxeff_dVg; + } + else if (model->BSIM4v6xpart < 0.5) + { /* 40/60 partition */ + T2 = T2 / 12.0; + T3 = 0.5 * CoxWLcen / (T2 * T2); + T4 = T1 * (2.0 * T0 * T0 / 3.0 + T1 * (T1 - 4.0 + * T0 / 3.0)) - 2.0 * T0 * T0 * T0 / 15.0; + qsrc = -T3 * T4; + QovCox = qsrc / Coxeff; + T8 = 4.0 / 3.0 * T1 * (T1 - T0) + 0.4 * T0 * T0; + T5 = -2.0 * qsrc / T2 - T3 * (T1 * (3.0 * T1 - 8.0 + * T0 / 3.0) + 2.0 * T0 * T0 / 3.0); + T6 = AbulkCV * (qsrc / T2 + T3 * T8); + T7 = T6 * VdseffCV / AbulkCV; + + Csg = T5 * dVgDP_dVg + T6 * dVdseffCV_dVg; + Csd = Csg * dVgsteff_dVd + T6 * dVdseffCV_dVd + + QovCox * dCoxeff_dVd; + Csb = Csg * dVgsteff_dVb + T6 * dVdseffCV_dVb + + T7 * dAbulkCV_dVb + QovCox * dCoxeff_dVb; + Csg = Csg * dVgsteff_dVg + QovCox * dCoxeff_dVg; + } + else + { /* 50/50 partition */ + qsrc = -0.5 * qgate; + Csg = -0.5 * Cgg1; + Csd = -0.5 * Cgd1; + Csb = -0.5 * Cgb1; + } + + qgate += Qac0 + Qsub0 - qbulk; + qbulk -= (Qac0 + Qsub0); + qdrn = -(qgate + qbulk + qsrc); + + Cbg = Cbg1 - dQac0_dVg - dQsub0_dVg; + Cbd = Cbd1 - dQsub0_dVd; + Cbb = Cbb1 - dQac0_dVb - dQsub0_dVb; + + Cgg = Cgg1 - Cbg; + Cgd = Cgd1 - Cbd; + Cgb = Cgb1 - Cbb; + + Cgb *= dVbseff_dVb; + Cbb *= dVbseff_dVb; + Csb *= dVbseff_dVb; + + here->BSIM4v6cggb = Cgg; + here->BSIM4v6cgsb = -(Cgg + Cgd + Cgb); + here->BSIM4v6cgdb = Cgd; + here->BSIM4v6cdgb = -(Cgg + Cbg + Csg); + here->BSIM4v6cdsb = (Cgg + Cgd + Cgb + Cbg + Cbd + Cbb + + Csg + Csd + Csb); + here->BSIM4v6cddb = -(Cgd + Cbd + Csd); + here->BSIM4v6cbgb = Cbg; + here->BSIM4v6cbsb = -(Cbg + Cbd + Cbb); + here->BSIM4v6cbdb = Cbd; + } /* End of CTM */ + } + + here->BSIM4v6csgb = - here->BSIM4v6cggb - here->BSIM4v6cdgb - here->BSIM4v6cbgb; + here->BSIM4v6csdb = - here->BSIM4v6cgdb - here->BSIM4v6cddb - here->BSIM4v6cbdb; + here->BSIM4v6cssb = - here->BSIM4v6cgsb - here->BSIM4v6cdsb - here->BSIM4v6cbsb; + here->BSIM4v6cgbb = - here->BSIM4v6cgdb - here->BSIM4v6cggb - here->BSIM4v6cgsb; + here->BSIM4v6cdbb = - here->BSIM4v6cddb - here->BSIM4v6cdgb - here->BSIM4v6cdsb; + here->BSIM4v6cbbb = - here->BSIM4v6cbgb - here->BSIM4v6cbdb - here->BSIM4v6cbsb; + here->BSIM4v6csbb = - here->BSIM4v6cgbb - here->BSIM4v6cdbb - here->BSIM4v6cbbb; + here->BSIM4v6qgate = qgate; + here->BSIM4v6qbulk = qbulk; + here->BSIM4v6qdrn = qdrn; + here->BSIM4v6qsrc = -(qgate + qbulk + qdrn); + + /* NQS begins */ + if ((here->BSIM4v6trnqsMod) || (here->BSIM4v6acnqsMod)) + { here->BSIM4v6qchqs = qcheq = -(qbulk + qgate); + here->BSIM4v6cqgb = -(here->BSIM4v6cggb + here->BSIM4v6cbgb); + here->BSIM4v6cqdb = -(here->BSIM4v6cgdb + here->BSIM4v6cbdb); + here->BSIM4v6cqsb = -(here->BSIM4v6cgsb + here->BSIM4v6cbsb); + here->BSIM4v6cqbb = -(here->BSIM4v6cqgb + here->BSIM4v6cqdb + + here->BSIM4v6cqsb); + + CoxWL = model->BSIM4v6coxe * pParam->BSIM4v6weffCV * here->BSIM4v6nf + * pParam->BSIM4v6leffCV; + T1 = here->BSIM4v6gcrg / CoxWL; /* 1 / tau */ + here->BSIM4v6gtau = T1 * ScalingFactor; + + if (here->BSIM4v6acnqsMod) + here->BSIM4v6taunet = 1.0 / T1; + + *(ckt->CKTstate0 + here->BSIM4v6qcheq) = qcheq; + if (ckt->CKTmode & MODEINITTRAN) + *(ckt->CKTstate1 + here->BSIM4v6qcheq) = + *(ckt->CKTstate0 + here->BSIM4v6qcheq); + if (here->BSIM4v6trnqsMod) + { error = NIintegrate(ckt, &geq, &ceq, 0.0, here->BSIM4v6qcheq); + if (error) + return(error); + } + } + + +finished: + + /* Calculate junction C-V */ + if (ChargeComputationNeeded) + { czbd = model->BSIM4v6DunitAreaTempJctCap * here->BSIM4v6Adeff; /* bug fix */ + czbs = model->BSIM4v6SunitAreaTempJctCap * here->BSIM4v6Aseff; + czbdsw = model->BSIM4v6DunitLengthSidewallTempJctCap * here->BSIM4v6Pdeff; + czbdswg = model->BSIM4v6DunitLengthGateSidewallTempJctCap + * pParam->BSIM4v6weffCJ * here->BSIM4v6nf; + czbssw = model->BSIM4v6SunitLengthSidewallTempJctCap * here->BSIM4v6Pseff; + czbsswg = model->BSIM4v6SunitLengthGateSidewallTempJctCap + * pParam->BSIM4v6weffCJ * here->BSIM4v6nf; + + MJS = model->BSIM4v6SbulkJctBotGradingCoeff; + MJSWS = model->BSIM4v6SbulkJctSideGradingCoeff; + MJSWGS = model->BSIM4v6SbulkJctGateSideGradingCoeff; + + MJD = model->BSIM4v6DbulkJctBotGradingCoeff; + MJSWD = model->BSIM4v6DbulkJctSideGradingCoeff; + MJSWGD = model->BSIM4v6DbulkJctGateSideGradingCoeff; + + /* Source Bulk Junction */ + if (vbs_jct == 0.0) + { *(ckt->CKTstate0 + here->BSIM4v6qbs) = 0.0; + here->BSIM4v6capbs = czbs + czbssw + czbsswg; + } + else if (vbs_jct < 0.0) + { if (czbs > 0.0) + { arg = 1.0 - vbs_jct / model->BSIM4v6PhiBS; + if (MJS == 0.5) + sarg = 1.0 / sqrt(arg); + else + sarg = exp(-MJS * log(arg)); + *(ckt->CKTstate0 + here->BSIM4v6qbs) = model->BSIM4v6PhiBS * czbs + * (1.0 - arg * sarg) / (1.0 - MJS); + here->BSIM4v6capbs = czbs * sarg; + } + else + { *(ckt->CKTstate0 + here->BSIM4v6qbs) = 0.0; + here->BSIM4v6capbs = 0.0; + } + if (czbssw > 0.0) + { arg = 1.0 - vbs_jct / model->BSIM4v6PhiBSWS; + if (MJSWS == 0.5) + sarg = 1.0 / sqrt(arg); + else + sarg = exp(-MJSWS * log(arg)); + *(ckt->CKTstate0 + here->BSIM4v6qbs) += model->BSIM4v6PhiBSWS * czbssw + * (1.0 - arg * sarg) / (1.0 - MJSWS); + here->BSIM4v6capbs += czbssw * sarg; + } + if (czbsswg > 0.0) + { arg = 1.0 - vbs_jct / model->BSIM4v6PhiBSWGS; + if (MJSWGS == 0.5) + sarg = 1.0 / sqrt(arg); + else + sarg = exp(-MJSWGS * log(arg)); + *(ckt->CKTstate0 + here->BSIM4v6qbs) += model->BSIM4v6PhiBSWGS * czbsswg + * (1.0 - arg * sarg) / (1.0 - MJSWGS); + here->BSIM4v6capbs += czbsswg * sarg; + } + + } + else + { T0 = czbs + czbssw + czbsswg; + T1 = vbs_jct * (czbs * MJS / model->BSIM4v6PhiBS + czbssw * MJSWS + / model->BSIM4v6PhiBSWS + czbsswg * MJSWGS / model->BSIM4v6PhiBSWGS); + *(ckt->CKTstate0 + here->BSIM4v6qbs) = vbs_jct * (T0 + 0.5 * T1); + here->BSIM4v6capbs = T0 + T1; + } + + /* Drain Bulk Junction */ + if (vbd_jct == 0.0) + { *(ckt->CKTstate0 + here->BSIM4v6qbd) = 0.0; + here->BSIM4v6capbd = czbd + czbdsw + czbdswg; + } + else if (vbd_jct < 0.0) + { if (czbd > 0.0) + { arg = 1.0 - vbd_jct / model->BSIM4v6PhiBD; + if (MJD == 0.5) + sarg = 1.0 / sqrt(arg); + else + sarg = exp(-MJD * log(arg)); + *(ckt->CKTstate0 + here->BSIM4v6qbd) = model->BSIM4v6PhiBD* czbd + * (1.0 - arg * sarg) / (1.0 - MJD); + here->BSIM4v6capbd = czbd * sarg; + } + else + { *(ckt->CKTstate0 + here->BSIM4v6qbd) = 0.0; + here->BSIM4v6capbd = 0.0; + } + if (czbdsw > 0.0) + { arg = 1.0 - vbd_jct / model->BSIM4v6PhiBSWD; + if (MJSWD == 0.5) + sarg = 1.0 / sqrt(arg); + else + sarg = exp(-MJSWD * log(arg)); + *(ckt->CKTstate0 + here->BSIM4v6qbd) += model->BSIM4v6PhiBSWD * czbdsw + * (1.0 - arg * sarg) / (1.0 - MJSWD); + here->BSIM4v6capbd += czbdsw * sarg; + } + if (czbdswg > 0.0) + { arg = 1.0 - vbd_jct / model->BSIM4v6PhiBSWGD; + if (MJSWGD == 0.5) + sarg = 1.0 / sqrt(arg); + else + sarg = exp(-MJSWGD * log(arg)); + *(ckt->CKTstate0 + here->BSIM4v6qbd) += model->BSIM4v6PhiBSWGD * czbdswg + * (1.0 - arg * sarg) / (1.0 - MJSWGD); + here->BSIM4v6capbd += czbdswg * sarg; + } + } + else + { T0 = czbd + czbdsw + czbdswg; + T1 = vbd_jct * (czbd * MJD / model->BSIM4v6PhiBD + czbdsw * MJSWD + / model->BSIM4v6PhiBSWD + czbdswg * MJSWGD / model->BSIM4v6PhiBSWGD); + *(ckt->CKTstate0 + here->BSIM4v6qbd) = vbd_jct * (T0 + 0.5 * T1); + here->BSIM4v6capbd = T0 + T1; + } + } + + + /* + * check convergence + */ + + if ((here->BSIM4v6off == 0) || (!(ckt->CKTmode & MODEINITFIX))) + { if (Check == 1) + { ckt->CKTnoncon++; +#ifndef NEWCONV + } + else + { if (here->BSIM4v6mode >= 0) + { Idtot = here->BSIM4v6cd + here->BSIM4v6csub + + here->BSIM4v6Igidl - here->BSIM4v6cbd; + } + else + { Idtot = here->BSIM4v6cd + here->BSIM4v6cbd - here->BSIM4v6Igidl; /* 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->BSIM4v6cbs + here->BSIM4v6cbd + - here->BSIM4v6Igidl - here->BSIM4v6Igisl - here->BSIM4v6csub; + tol6 = ckt->CKTreltol * MAX(fabs(cbhat), fabs(Ibtot)) + + ckt->CKTabstol; + if (fabs(cbhat - Ibtot) > tol6) + { ckt->CKTnoncon++; + } + } +#endif /* NEWCONV */ + } + } + *(ckt->CKTstate0 + here->BSIM4v6vds) = vds; + *(ckt->CKTstate0 + here->BSIM4v6vgs) = vgs; + *(ckt->CKTstate0 + here->BSIM4v6vbs) = vbs; + *(ckt->CKTstate0 + here->BSIM4v6vbd) = vbd; + *(ckt->CKTstate0 + here->BSIM4v6vges) = vges; + *(ckt->CKTstate0 + here->BSIM4v6vgms) = vgms; + *(ckt->CKTstate0 + here->BSIM4v6vdbs) = vdbs; + *(ckt->CKTstate0 + here->BSIM4v6vdbd) = vdbd; + *(ckt->CKTstate0 + here->BSIM4v6vsbs) = vsbs; + *(ckt->CKTstate0 + here->BSIM4v6vses) = vses; + *(ckt->CKTstate0 + here->BSIM4v6vdes) = vdes; + *(ckt->CKTstate0 + here->BSIM4v6qdef) = qdef; + + + if (!ChargeComputationNeeded) + goto line850; + + if (here->BSIM4v6rgateMod == 3) + { + vgdx = vgmd; + vgsx = vgms; + } + else /* For rgateMod == 0, 1 and 2 */ + { + vgdx = vgd; + vgsx = vgs; + } + if (model->BSIM4v6capMod == 0) + { + cgdo = pParam->BSIM4v6cgdo; + qgdo = pParam->BSIM4v6cgdo * vgdx; + cgso = pParam->BSIM4v6cgso; + qgso = pParam->BSIM4v6cgso * vgsx; + } + else /* For both capMod == 1 and 2 */ + { T0 = vgdx + DELTA_1; + T1 = sqrt(T0 * T0 + 4.0 * DELTA_1); + T2 = 0.5 * (T0 - T1); + + T3 = pParam->BSIM4v6weffCV * pParam->BSIM4v6cgdl; + T4 = sqrt(1.0 - 4.0 * T2 / pParam->BSIM4v6ckappad); + cgdo = pParam->BSIM4v6cgdo + T3 - T3 * (1.0 - 1.0 / T4) + * (0.5 - 0.5 * T0 / T1); + qgdo = (pParam->BSIM4v6cgdo + T3) * vgdx - T3 * (T2 + + 0.5 * pParam->BSIM4v6ckappad * (T4 - 1.0)); + + T0 = vgsx + DELTA_1; + T1 = sqrt(T0 * T0 + 4.0 * DELTA_1); + T2 = 0.5 * (T0 - T1); + T3 = pParam->BSIM4v6weffCV * pParam->BSIM4v6cgsl; + T4 = sqrt(1.0 - 4.0 * T2 / pParam->BSIM4v6ckappas); + cgso = pParam->BSIM4v6cgso + T3 - T3 * (1.0 - 1.0 / T4) + * (0.5 - 0.5 * T0 / T1); + qgso = (pParam->BSIM4v6cgso + T3) * vgsx - T3 * (T2 + + 0.5 * pParam->BSIM4v6ckappas * (T4 - 1.0)); + } + + if (here->BSIM4v6nf != 1.0) + { cgdo *= here->BSIM4v6nf; + cgso *= here->BSIM4v6nf; + qgdo *= here->BSIM4v6nf; + qgso *= here->BSIM4v6nf; + } + here->BSIM4v6cgdo = cgdo; + here->BSIM4v6qgdo = qgdo; + here->BSIM4v6cgso = cgso; + here->BSIM4v6qgso = qgso; + +#ifndef NOBYPASS +line755: +#endif + ag0 = ckt->CKTag[0]; + if (here->BSIM4v6mode > 0) + { if (here->BSIM4v6trnqsMod == 0) + { qdrn -= qgdo; + if (here->BSIM4v6rgateMod == 3) + { gcgmgmb = (cgdo + cgso + pParam->BSIM4v6cgbo) * ag0; + gcgmdb = -cgdo * ag0; + gcgmsb = -cgso * ag0; + gcgmbb = -pParam->BSIM4v6cgbo * ag0; + + gcdgmb = gcgmdb; + gcsgmb = gcgmsb; + gcbgmb = gcgmbb; + + gcggb = here->BSIM4v6cggb * ag0; + gcgdb = here->BSIM4v6cgdb * ag0; + gcgsb = here->BSIM4v6cgsb * ag0; + gcgbb = -(gcggb + gcgdb + gcgsb); + + gcdgb = here->BSIM4v6cdgb * ag0; + gcsgb = -(here->BSIM4v6cggb + here->BSIM4v6cbgb + + here->BSIM4v6cdgb) * ag0; + gcbgb = here->BSIM4v6cbgb * ag0; + + qgmb = pParam->BSIM4v6cgbo * vgmb; + qgmid = qgdo + qgso + qgmb; + qbulk -= qgmb; + qsrc = -(qgate + qgmid + qbulk + qdrn); + } + else + { gcggb = (here->BSIM4v6cggb + cgdo + cgso + + pParam->BSIM4v6cgbo ) * ag0; + gcgdb = (here->BSIM4v6cgdb - cgdo) * ag0; + gcgsb = (here->BSIM4v6cgsb - cgso) * ag0; + gcgbb = -(gcggb + gcgdb + gcgsb); + + gcdgb = (here->BSIM4v6cdgb - cgdo) * ag0; + gcsgb = -(here->BSIM4v6cggb + here->BSIM4v6cbgb + + here->BSIM4v6cdgb + cgso) * ag0; + gcbgb = (here->BSIM4v6cbgb - pParam->BSIM4v6cgbo) * ag0; + + gcdgmb = gcsgmb = gcbgmb = 0.0; + + qgb = pParam->BSIM4v6cgbo * vgb; + qgate += qgdo + qgso + qgb; + qbulk -= qgb; + qsrc = -(qgate + qbulk + qdrn); + } + gcddb = (here->BSIM4v6cddb + here->BSIM4v6capbd + cgdo) * ag0; + gcdsb = here->BSIM4v6cdsb * ag0; + + gcsdb = -(here->BSIM4v6cgdb + here->BSIM4v6cbdb + + here->BSIM4v6cddb) * ag0; + gcssb = (here->BSIM4v6capbs + cgso - (here->BSIM4v6cgsb + + here->BSIM4v6cbsb + here->BSIM4v6cdsb)) * ag0; + + if (!here->BSIM4v6rbodyMod) + { gcdbb = -(gcdgb + gcddb + gcdsb + gcdgmb); + gcsbb = -(gcsgb + gcsdb + gcssb + gcsgmb); + gcbdb = (here->BSIM4v6cbdb - here->BSIM4v6capbd) * ag0; + gcbsb = (here->BSIM4v6cbsb - here->BSIM4v6capbs) * ag0; + gcdbdb = 0.0; gcsbsb = 0.0; + } + else + { gcdbb = -(here->BSIM4v6cddb + here->BSIM4v6cdgb + + here->BSIM4v6cdsb) * ag0; + gcsbb = -(gcsgb + gcsdb + gcssb + gcsgmb) + + here->BSIM4v6capbs * ag0; + gcbdb = here->BSIM4v6cbdb * ag0; + gcbsb = here->BSIM4v6cbsb * ag0; + + gcdbdb = -here->BSIM4v6capbd * ag0; + gcsbsb = -here->BSIM4v6capbs * ag0; + } + gcbbb = -(gcbdb + gcbgb + gcbsb + gcbgmb); + + ggtg = ggtd = ggtb = ggts = 0.0; + sxpart = 0.6; + dxpart = 0.4; + ddxpart_dVd = ddxpart_dVg = ddxpart_dVb = ddxpart_dVs = 0.0; + dsxpart_dVd = dsxpart_dVg = dsxpart_dVb = dsxpart_dVs = 0.0; + } + else + { qcheq = here->BSIM4v6qchqs; + CoxWL = model->BSIM4v6coxe * pParam->BSIM4v6weffCV * here->BSIM4v6nf + * pParam->BSIM4v6leffCV; + T0 = qdef * ScalingFactor / CoxWL; + + ggtg = here->BSIM4v6gtg = T0 * here->BSIM4v6gcrgg; + ggtd = here->BSIM4v6gtd = T0 * here->BSIM4v6gcrgd; + ggts = here->BSIM4v6gts = T0 * here->BSIM4v6gcrgs; + ggtb = here->BSIM4v6gtb = T0 * here->BSIM4v6gcrgb; + gqdef = ScalingFactor * ag0; + + gcqgb = here->BSIM4v6cqgb * ag0; + gcqdb = here->BSIM4v6cqdb * ag0; + gcqsb = here->BSIM4v6cqsb * ag0; + gcqbb = here->BSIM4v6cqbb * ag0; + + if (fabs(qcheq) <= 1.0e-5 * CoxWL) + { if (model->BSIM4v6xpart < 0.5) + { dxpart = 0.4; + } + else if (model->BSIM4v6xpart > 0.5) + { dxpart = 0.0; + } + else + { dxpart = 0.5; + } + ddxpart_dVd = ddxpart_dVg = ddxpart_dVb + = ddxpart_dVs = 0.0; + } + else + { dxpart = qdrn / qcheq; + Cdd = here->BSIM4v6cddb; + Csd = -(here->BSIM4v6cgdb + here->BSIM4v6cddb + + here->BSIM4v6cbdb); + ddxpart_dVd = (Cdd - dxpart * (Cdd + Csd)) / qcheq; + Cdg = here->BSIM4v6cdgb; + Csg = -(here->BSIM4v6cggb + here->BSIM4v6cdgb + + here->BSIM4v6cbgb); + ddxpart_dVg = (Cdg - dxpart * (Cdg + Csg)) / qcheq; + + Cds = here->BSIM4v6cdsb; + Css = -(here->BSIM4v6cgsb + here->BSIM4v6cdsb + + here->BSIM4v6cbsb); + ddxpart_dVs = (Cds - dxpart * (Cds + Css)) / qcheq; + + ddxpart_dVb = -(ddxpart_dVd + ddxpart_dVg + ddxpart_dVs); + } + sxpart = 1.0 - dxpart; + dsxpart_dVd = -ddxpart_dVd; + dsxpart_dVg = -ddxpart_dVg; + dsxpart_dVs = -ddxpart_dVs; + dsxpart_dVb = -(dsxpart_dVd + dsxpart_dVg + dsxpart_dVs); + + if (here->BSIM4v6rgateMod == 3) + { gcgmgmb = (cgdo + cgso + pParam->BSIM4v6cgbo) * ag0; + gcgmdb = -cgdo * ag0; + gcgmsb = -cgso * ag0; + gcgmbb = -pParam->BSIM4v6cgbo * ag0; + + gcdgmb = gcgmdb; + gcsgmb = gcgmsb; + gcbgmb = gcgmbb; + + gcdgb = gcsgb = gcbgb = 0.0; + gcggb = gcgdb = gcgsb = gcgbb = 0.0; + + qgmb = pParam->BSIM4v6cgbo * vgmb; + qgmid = qgdo + qgso + qgmb; + qgate = 0.0; + qbulk = -qgmb; + qdrn = -qgdo; + qsrc = -(qgmid + qbulk + qdrn); + } + else + { gcggb = (cgdo + cgso + pParam->BSIM4v6cgbo ) * ag0; + gcgdb = -cgdo * ag0; + gcgsb = -cgso * ag0; + gcgbb = -pParam->BSIM4v6cgbo * ag0; + + gcdgb = gcgdb; + gcsgb = gcgsb; + gcbgb = gcgbb; + gcdgmb = gcsgmb = gcbgmb = 0.0; + + qgb = pParam->BSIM4v6cgbo * vgb; + qgate = qgdo + qgso + qgb; + qbulk = -qgb; + qdrn = -qgdo; + qsrc = -(qgate + qbulk + qdrn); + } + + gcddb = (here->BSIM4v6capbd + cgdo) * ag0; + gcdsb = gcsdb = 0.0; + gcssb = (here->BSIM4v6capbs + cgso) * ag0; + + if (!here->BSIM4v6rbodyMod) + { gcdbb = -(gcdgb + gcddb + gcdgmb); + gcsbb = -(gcsgb + gcssb + gcsgmb); + gcbdb = -here->BSIM4v6capbd * ag0; + gcbsb = -here->BSIM4v6capbs * ag0; + gcdbdb = 0.0; gcsbsb = 0.0; + } + else + { gcdbb = gcsbb = gcbdb = gcbsb = 0.0; + gcdbdb = -here->BSIM4v6capbd * ag0; + gcsbsb = -here->BSIM4v6capbs * ag0; + } + gcbbb = -(gcbdb + gcbgb + gcbsb + gcbgmb); + } + } + else + { if (here->BSIM4v6trnqsMod == 0) + { qsrc = qdrn - qgso; + if (here->BSIM4v6rgateMod == 3) + { gcgmgmb = (cgdo + cgso + pParam->BSIM4v6cgbo) * ag0; + gcgmdb = -cgdo * ag0; + gcgmsb = -cgso * ag0; + gcgmbb = -pParam->BSIM4v6cgbo * ag0; + + gcdgmb = gcgmdb; + gcsgmb = gcgmsb; + gcbgmb = gcgmbb; + + gcggb = here->BSIM4v6cggb * ag0; + gcgdb = here->BSIM4v6cgsb * ag0; + gcgsb = here->BSIM4v6cgdb * ag0; + gcgbb = -(gcggb + gcgdb + gcgsb); + + gcdgb = -(here->BSIM4v6cggb + here->BSIM4v6cbgb + + here->BSIM4v6cdgb) * ag0; + gcsgb = here->BSIM4v6cdgb * ag0; + gcbgb = here->BSIM4v6cbgb * ag0; + + qgmb = pParam->BSIM4v6cgbo * vgmb; + qgmid = qgdo + qgso + qgmb; + qbulk -= qgmb; + qdrn = -(qgate + qgmid + qbulk + qsrc); + } + else + { gcggb = (here->BSIM4v6cggb + cgdo + cgso + + pParam->BSIM4v6cgbo ) * ag0; + gcgdb = (here->BSIM4v6cgsb - cgdo) * ag0; + gcgsb = (here->BSIM4v6cgdb - cgso) * ag0; + gcgbb = -(gcggb + gcgdb + gcgsb); + + gcdgb = -(here->BSIM4v6cggb + here->BSIM4v6cbgb + + here->BSIM4v6cdgb + cgdo) * ag0; + gcsgb = (here->BSIM4v6cdgb - cgso) * ag0; + gcbgb = (here->BSIM4v6cbgb - pParam->BSIM4v6cgbo) * ag0; + + gcdgmb = gcsgmb = gcbgmb = 0.0; + + qgb = pParam->BSIM4v6cgbo * vgb; + qgate += qgdo + qgso + qgb; + qbulk -= qgb; + qdrn = -(qgate + qbulk + qsrc); + } + gcddb = (here->BSIM4v6capbd + cgdo - (here->BSIM4v6cgsb + + here->BSIM4v6cbsb + here->BSIM4v6cdsb)) * ag0; + gcdsb = -(here->BSIM4v6cgdb + here->BSIM4v6cbdb + + here->BSIM4v6cddb) * ag0; + + gcsdb = here->BSIM4v6cdsb * ag0; + gcssb = (here->BSIM4v6cddb + here->BSIM4v6capbs + cgso) * ag0; + + if (!here->BSIM4v6rbodyMod) + { gcdbb = -(gcdgb + gcddb + gcdsb + gcdgmb); + gcsbb = -(gcsgb + gcsdb + gcssb + gcsgmb); + gcbdb = (here->BSIM4v6cbsb - here->BSIM4v6capbd) * ag0; + gcbsb = (here->BSIM4v6cbdb - here->BSIM4v6capbs) * ag0; + gcdbdb = 0.0; gcsbsb = 0.0; + } + else + { gcdbb = -(gcdgb + gcddb + gcdsb + gcdgmb) + + here->BSIM4v6capbd * ag0; + gcsbb = -(here->BSIM4v6cddb + here->BSIM4v6cdgb + + here->BSIM4v6cdsb) * ag0; + gcbdb = here->BSIM4v6cbsb * ag0; + gcbsb = here->BSIM4v6cbdb * ag0; + gcdbdb = -here->BSIM4v6capbd * ag0; + gcsbsb = -here->BSIM4v6capbs * ag0; + } + gcbbb = -(gcbgb + gcbdb + gcbsb + gcbgmb); + + ggtg = ggtd = ggtb = ggts = 0.0; + sxpart = 0.4; + dxpart = 0.6; + ddxpart_dVd = ddxpart_dVg = ddxpart_dVb = ddxpart_dVs = 0.0; + dsxpart_dVd = dsxpart_dVg = dsxpart_dVb = dsxpart_dVs = 0.0; + } + else + { qcheq = here->BSIM4v6qchqs; + CoxWL = model->BSIM4v6coxe * pParam->BSIM4v6weffCV * here->BSIM4v6nf + * pParam->BSIM4v6leffCV; + T0 = qdef * ScalingFactor / CoxWL; + ggtg = here->BSIM4v6gtg = T0 * here->BSIM4v6gcrgg; + ggts = here->BSIM4v6gts = T0 * here->BSIM4v6gcrgd; + ggtd = here->BSIM4v6gtd = T0 * here->BSIM4v6gcrgs; + ggtb = here->BSIM4v6gtb = T0 * here->BSIM4v6gcrgb; + gqdef = ScalingFactor * ag0; + + gcqgb = here->BSIM4v6cqgb * ag0; + gcqdb = here->BSIM4v6cqsb * ag0; + gcqsb = here->BSIM4v6cqdb * ag0; + gcqbb = here->BSIM4v6cqbb * ag0; + + if (fabs(qcheq) <= 1.0e-5 * CoxWL) + { if (model->BSIM4v6xpart < 0.5) + { sxpart = 0.4; + } + else if (model->BSIM4v6xpart > 0.5) + { sxpart = 0.0; + } + else + { sxpart = 0.5; + } + dsxpart_dVd = dsxpart_dVg = dsxpart_dVb + = dsxpart_dVs = 0.0; + } + else + { sxpart = qdrn / qcheq; + Css = here->BSIM4v6cddb; + Cds = -(here->BSIM4v6cgdb + here->BSIM4v6cddb + + here->BSIM4v6cbdb); + dsxpart_dVs = (Css - sxpart * (Css + Cds)) / qcheq; + Csg = here->BSIM4v6cdgb; + Cdg = -(here->BSIM4v6cggb + here->BSIM4v6cdgb + + here->BSIM4v6cbgb); + dsxpart_dVg = (Csg - sxpart * (Csg + Cdg)) / qcheq; + + Csd = here->BSIM4v6cdsb; + Cdd = -(here->BSIM4v6cgsb + here->BSIM4v6cdsb + + here->BSIM4v6cbsb); + dsxpart_dVd = (Csd - sxpart * (Csd + Cdd)) / qcheq; + + dsxpart_dVb = -(dsxpart_dVd + dsxpart_dVg + dsxpart_dVs); + } + dxpart = 1.0 - sxpart; + ddxpart_dVd = -dsxpart_dVd; + ddxpart_dVg = -dsxpart_dVg; + ddxpart_dVs = -dsxpart_dVs; + ddxpart_dVb = -(ddxpart_dVd + ddxpart_dVg + ddxpart_dVs); + + if (here->BSIM4v6rgateMod == 3) + { gcgmgmb = (cgdo + cgso + pParam->BSIM4v6cgbo) * ag0; + gcgmdb = -cgdo * ag0; + gcgmsb = -cgso * ag0; + gcgmbb = -pParam->BSIM4v6cgbo * ag0; + + gcdgmb = gcgmdb; + gcsgmb = gcgmsb; + gcbgmb = gcgmbb; + + gcdgb = gcsgb = gcbgb = 0.0; + gcggb = gcgdb = gcgsb = gcgbb = 0.0; + + qgmb = pParam->BSIM4v6cgbo * vgmb; + qgmid = qgdo + qgso + qgmb; + qgate = 0.0; + qbulk = -qgmb; + qdrn = -qgdo; + qsrc = -qgso; + } + else + { gcggb = (cgdo + cgso + pParam->BSIM4v6cgbo ) * ag0; + gcgdb = -cgdo * ag0; + gcgsb = -cgso * ag0; + gcgbb = -pParam->BSIM4v6cgbo * ag0; + + gcdgb = gcgdb; + gcsgb = gcgsb; + gcbgb = gcgbb; + gcdgmb = gcsgmb = gcbgmb = 0.0; + + qgb = pParam->BSIM4v6cgbo * vgb; + qgate = qgdo + qgso + qgb; + qbulk = -qgb; + qdrn = -qgdo; + qsrc = -qgso; + } + + gcddb = (here->BSIM4v6capbd + cgdo) * ag0; + gcdsb = gcsdb = 0.0; + gcssb = (here->BSIM4v6capbs + cgso) * ag0; + if (!here->BSIM4v6rbodyMod) + { gcdbb = -(gcdgb + gcddb + gcdgmb); + gcsbb = -(gcsgb + gcssb + gcsgmb); + gcbdb = -here->BSIM4v6capbd * ag0; + gcbsb = -here->BSIM4v6capbs * ag0; + gcdbdb = 0.0; gcsbsb = 0.0; + } + else + { gcdbb = gcsbb = gcbdb = gcbsb = 0.0; + gcdbdb = -here->BSIM4v6capbd * ag0; + gcsbsb = -here->BSIM4v6capbs * ag0; + } + gcbbb = -(gcbdb + gcbgb + gcbsb + gcbgmb); + } + } + + + if (here->BSIM4v6trnqsMod) + { *(ckt->CKTstate0 + here->BSIM4v6qcdump) = qdef * ScalingFactor; + if (ckt->CKTmode & MODEINITTRAN) + *(ckt->CKTstate1 + here->BSIM4v6qcdump) = + *(ckt->CKTstate0 + here->BSIM4v6qcdump); + error = NIintegrate(ckt, &geq, &ceq, 0.0, here->BSIM4v6qcdump); + if (error) + return(error); + } + + if (ByPass) goto line860; + + *(ckt->CKTstate0 + here->BSIM4v6qg) = qgate; + *(ckt->CKTstate0 + here->BSIM4v6qd) = qdrn + - *(ckt->CKTstate0 + here->BSIM4v6qbd); + *(ckt->CKTstate0 + here->BSIM4v6qs) = qsrc + - *(ckt->CKTstate0 + here->BSIM4v6qbs); + if (here->BSIM4v6rgateMod == 3) + *(ckt->CKTstate0 + here->BSIM4v6qgmid) = qgmid; + + if (!here->BSIM4v6rbodyMod) + { *(ckt->CKTstate0 + here->BSIM4v6qb) = qbulk + + *(ckt->CKTstate0 + here->BSIM4v6qbd) + + *(ckt->CKTstate0 + here->BSIM4v6qbs); + } + else + *(ckt->CKTstate0 + here->BSIM4v6qb) = qbulk; + + + /* Store small signal parameters */ + if (ckt->CKTmode & MODEINITSMSIG) + { goto line1000; + } + + if (!ChargeComputationNeeded) + goto line850; + + if (ckt->CKTmode & MODEINITTRAN) + { *(ckt->CKTstate1 + here->BSIM4v6qb) = + *(ckt->CKTstate0 + here->BSIM4v6qb); + *(ckt->CKTstate1 + here->BSIM4v6qg) = + *(ckt->CKTstate0 + here->BSIM4v6qg); + *(ckt->CKTstate1 + here->BSIM4v6qd) = + *(ckt->CKTstate0 + here->BSIM4v6qd); + if (here->BSIM4v6rgateMod == 3) + *(ckt->CKTstate1 + here->BSIM4v6qgmid) = + *(ckt->CKTstate0 + here->BSIM4v6qgmid); + if (here->BSIM4v6rbodyMod) + { *(ckt->CKTstate1 + here->BSIM4v6qbs) = + *(ckt->CKTstate0 + here->BSIM4v6qbs); + *(ckt->CKTstate1 + here->BSIM4v6qbd) = + *(ckt->CKTstate0 + here->BSIM4v6qbd); + } + } + + error = NIintegrate(ckt, &geq, &ceq, 0.0, here->BSIM4v6qb); + if (error) + return(error); + error = NIintegrate(ckt, &geq, &ceq, 0.0, here->BSIM4v6qg); + if (error) + return(error); + error = NIintegrate(ckt, &geq, &ceq, 0.0, here->BSIM4v6qd); + if (error) + return(error); + + if (here->BSIM4v6rgateMod == 3) + { error = NIintegrate(ckt, &geq, &ceq, 0.0, here->BSIM4v6qgmid); + if (error) return(error); + } + + if (here->BSIM4v6rbodyMod) + { error = NIintegrate(ckt, &geq, &ceq, 0.0, here->BSIM4v6qbs); + if (error) + return(error); + error = NIintegrate(ckt, &geq, &ceq, 0.0, here->BSIM4v6qbd); + if (error) + return(error); + } + + goto line860; + + +line850: + /* Zero gcap and ceqcap if (!ChargeComputationNeeded) */ + ceqqg = ceqqb = ceqqd = 0.0; + ceqqjd = ceqqjs = 0.0; + cqcheq = cqdef = 0.0; + + gcdgb = gcddb = gcdsb = gcdbb = 0.0; + gcsgb = gcsdb = gcssb = gcsbb = 0.0; + gcggb = gcgdb = gcgsb = gcgbb = 0.0; + gcbdb = gcbgb = gcbsb = gcbbb = 0.0; + + gcgmgmb = gcgmdb = gcgmsb = gcgmbb = 0.0; + gcdgmb = gcsgmb = gcbgmb = ceqqgmid = 0.0; + gcdbdb = gcsbsb = 0.0; + + gqdef = gcqgb = gcqdb = gcqsb = gcqbb = 0.0; + ggtg = ggtd = ggtb = ggts = 0.0; + sxpart = (1.0 - (dxpart = (here->BSIM4v6mode > 0) ? 0.4 : 0.6)); + ddxpart_dVd = ddxpart_dVg = ddxpart_dVb = ddxpart_dVs = 0.0; + dsxpart_dVd = dsxpart_dVg = dsxpart_dVb = dsxpart_dVs = 0.0; + + if (here->BSIM4v6trnqsMod) + { CoxWL = model->BSIM4v6coxe * pParam->BSIM4v6weffCV * here->BSIM4v6nf + * pParam->BSIM4v6leffCV; + T1 = here->BSIM4v6gcrg / CoxWL; + here->BSIM4v6gtau = T1 * ScalingFactor; + } + else + here->BSIM4v6gtau = 0.0; + + goto line900; + + +line860: + /* Calculate equivalent charge current */ + + cqgate = *(ckt->CKTstate0 + here->BSIM4v6cqg); + cqbody = *(ckt->CKTstate0 + here->BSIM4v6cqb); + cqdrn = *(ckt->CKTstate0 + here->BSIM4v6cqd); + + ceqqg = cqgate - gcggb * vgb + gcgdb * vbd + gcgsb * vbs; + ceqqd = cqdrn - gcdgb * vgb - gcdgmb * vgmb + (gcddb + gcdbdb) + * vbd - gcdbdb * vbd_jct + gcdsb * vbs; + ceqqb = cqbody - gcbgb * vgb - gcbgmb * vgmb + + gcbdb * vbd + gcbsb * vbs; + + + if (here->BSIM4v6rgateMod == 3) + ceqqgmid = *(ckt->CKTstate0 + here->BSIM4v6cqgmid) + + gcgmdb * vbd + gcgmsb * vbs - gcgmgmb * vgmb; + else + ceqqgmid = 0.0; + + if (here->BSIM4v6rbodyMod) + { ceqqjs = *(ckt->CKTstate0 + here->BSIM4v6cqbs) + gcsbsb * vbs_jct; + ceqqjd = *(ckt->CKTstate0 + here->BSIM4v6cqbd) + gcdbdb * vbd_jct; + } + + if (here->BSIM4v6trnqsMod) + { T0 = ggtg * vgb - ggtd * vbd - ggts * vbs; + ceqqg += T0; + T1 = qdef * here->BSIM4v6gtau; + ceqqd -= dxpart * T0 + T1 * (ddxpart_dVg * vgb - ddxpart_dVd + * vbd - ddxpart_dVs * vbs); + cqdef = *(ckt->CKTstate0 + here->BSIM4v6cqcdump) - gqdef * qdef; + cqcheq = *(ckt->CKTstate0 + here->BSIM4v6cqcheq) + - (gcqgb * vgb - gcqdb * vbd - gcqsb * vbs) + T0; + } + + if (ckt->CKTmode & MODEINITTRAN) + { *(ckt->CKTstate1 + here->BSIM4v6cqb) = + *(ckt->CKTstate0 + here->BSIM4v6cqb); + *(ckt->CKTstate1 + here->BSIM4v6cqg) = + *(ckt->CKTstate0 + here->BSIM4v6cqg); + *(ckt->CKTstate1 + here->BSIM4v6cqd) = + *(ckt->CKTstate0 + here->BSIM4v6cqd); + + if (here->BSIM4v6rgateMod == 3) + *(ckt->CKTstate1 + here->BSIM4v6cqgmid) = + *(ckt->CKTstate0 + here->BSIM4v6cqgmid); + + if (here->BSIM4v6rbodyMod) + { *(ckt->CKTstate1 + here->BSIM4v6cqbs) = + *(ckt->CKTstate0 + here->BSIM4v6cqbs); + *(ckt->CKTstate1 + here->BSIM4v6cqbd) = + *(ckt->CKTstate0 + here->BSIM4v6cqbd); + } + } + + + /* + * Load current vector + */ + +line900: + if (here->BSIM4v6mode >= 0) + { Gm = here->BSIM4v6gm; + Gmbs = here->BSIM4v6gmbs; + FwdSum = Gm + Gmbs; + RevSum = 0.0; + + ceqdrn = model->BSIM4v6type * (cdrain - here->BSIM4v6gds * vds + - Gm * vgs - Gmbs * vbs); + ceqbd = model->BSIM4v6type * (here->BSIM4v6csub + here->BSIM4v6Igidl + - (here->BSIM4v6gbds + here->BSIM4v6ggidld) * vds + - (here->BSIM4v6gbgs + here->BSIM4v6ggidlg) * vgs + - (here->BSIM4v6gbbs + here->BSIM4v6ggidlb) * vbs); + ceqbs = model->BSIM4v6type * (here->BSIM4v6Igisl + here->BSIM4v6ggisls * vds + - here->BSIM4v6ggislg * vgd - here->BSIM4v6ggislb * vbd); + + gbbdp = -(here->BSIM4v6gbds); + gbbsp = here->BSIM4v6gbds + here->BSIM4v6gbgs + here->BSIM4v6gbbs; + + gbdpg = here->BSIM4v6gbgs; + gbdpdp = here->BSIM4v6gbds; + gbdpb = here->BSIM4v6gbbs; + gbdpsp = -(gbdpg + gbdpdp + gbdpb); + + gbspg = 0.0; + gbspdp = 0.0; + gbspb = 0.0; + gbspsp = 0.0; + + if (model->BSIM4v6igcMod) + { gIstotg = here->BSIM4v6gIgsg + here->BSIM4v6gIgcsg; + gIstotd = here->BSIM4v6gIgcsd; + gIstots = here->BSIM4v6gIgss + here->BSIM4v6gIgcss; + gIstotb = here->BSIM4v6gIgcsb; + Istoteq = model->BSIM4v6type * (here->BSIM4v6Igs + here->BSIM4v6Igcs + - gIstotg * vgs - here->BSIM4v6gIgcsd * vds + - here->BSIM4v6gIgcsb * vbs); + + gIdtotg = here->BSIM4v6gIgdg + here->BSIM4v6gIgcdg; + gIdtotd = here->BSIM4v6gIgdd + here->BSIM4v6gIgcdd; + gIdtots = here->BSIM4v6gIgcds; + gIdtotb = here->BSIM4v6gIgcdb; + Idtoteq = model->BSIM4v6type * (here->BSIM4v6Igd + here->BSIM4v6Igcd + - here->BSIM4v6gIgdg * vgd - here->BSIM4v6gIgcdg * vgs + - here->BSIM4v6gIgcdd * vds - here->BSIM4v6gIgcdb * vbs); + } + else + { gIstotg = gIstotd = gIstots = gIstotb = Istoteq = 0.0; + gIdtotg = gIdtotd = gIdtots = gIdtotb = Idtoteq = 0.0; + } + + if (model->BSIM4v6igbMod) + { gIbtotg = here->BSIM4v6gIgbg; + gIbtotd = here->BSIM4v6gIgbd; + gIbtots = here->BSIM4v6gIgbs; + gIbtotb = here->BSIM4v6gIgbb; + Ibtoteq = model->BSIM4v6type * (here->BSIM4v6Igb + - here->BSIM4v6gIgbg * vgs - here->BSIM4v6gIgbd * vds + - here->BSIM4v6gIgbb * vbs); + } + else + gIbtotg = gIbtotd = gIbtots = gIbtotb = Ibtoteq = 0.0; + + if ((model->BSIM4v6igcMod != 0) || (model->BSIM4v6igbMod != 0)) + { gIgtotg = gIstotg + gIdtotg + gIbtotg; + gIgtotd = gIstotd + gIdtotd + gIbtotd ; + gIgtots = gIstots + gIdtots + gIbtots; + gIgtotb = gIstotb + gIdtotb + gIbtotb; + Igtoteq = Istoteq + Idtoteq + Ibtoteq; + } + else + gIgtotg = gIgtotd = gIgtots = gIgtotb = Igtoteq = 0.0; + + + if (here->BSIM4v6rgateMod == 2) + T0 = vges - vgs; + else if (here->BSIM4v6rgateMod == 3) + T0 = vgms - vgs; + if (here->BSIM4v6rgateMod > 1) + { gcrgd = here->BSIM4v6gcrgd * T0; + gcrgg = here->BSIM4v6gcrgg * T0; + gcrgs = here->BSIM4v6gcrgs * T0; + gcrgb = here->BSIM4v6gcrgb * T0; + ceqgcrg = -(gcrgd * vds + gcrgg * vgs + + gcrgb * vbs); + gcrgg -= here->BSIM4v6gcrg; + gcrg = here->BSIM4v6gcrg; + } + else + ceqgcrg = gcrg = gcrgd = gcrgg = gcrgs = gcrgb = 0.0; + } + else + { Gm = -here->BSIM4v6gm; + Gmbs = -here->BSIM4v6gmbs; + FwdSum = 0.0; + RevSum = -(Gm + Gmbs); + + ceqdrn = -model->BSIM4v6type * (cdrain + here->BSIM4v6gds * vds + + Gm * vgd + Gmbs * vbd); + + ceqbs = model->BSIM4v6type * (here->BSIM4v6csub + here->BSIM4v6Igisl + + (here->BSIM4v6gbds + here->BSIM4v6ggisls) * vds + - (here->BSIM4v6gbgs + here->BSIM4v6ggislg) * vgd + - (here->BSIM4v6gbbs + here->BSIM4v6ggislb) * vbd); + ceqbd = model->BSIM4v6type * (here->BSIM4v6Igidl - here->BSIM4v6ggidld * vds + - here->BSIM4v6ggidlg * vgs - here->BSIM4v6ggidlb * vbs); + + gbbsp = -(here->BSIM4v6gbds); + gbbdp = here->BSIM4v6gbds + here->BSIM4v6gbgs + here->BSIM4v6gbbs; + + gbdpg = 0.0; + gbdpsp = 0.0; + gbdpb = 0.0; + gbdpdp = 0.0; + + gbspg = here->BSIM4v6gbgs; + gbspsp = here->BSIM4v6gbds; + gbspb = here->BSIM4v6gbbs; + gbspdp = -(gbspg + gbspsp + gbspb); + + if (model->BSIM4v6igcMod) + { gIstotg = here->BSIM4v6gIgsg + here->BSIM4v6gIgcdg; + gIstotd = here->BSIM4v6gIgcds; + gIstots = here->BSIM4v6gIgss + here->BSIM4v6gIgcdd; + gIstotb = here->BSIM4v6gIgcdb; + Istoteq = model->BSIM4v6type * (here->BSIM4v6Igs + here->BSIM4v6Igcd + - here->BSIM4v6gIgsg * vgs - here->BSIM4v6gIgcdg * vgd + + here->BSIM4v6gIgcdd * vds - here->BSIM4v6gIgcdb * vbd); + + gIdtotg = here->BSIM4v6gIgdg + here->BSIM4v6gIgcsg; + gIdtotd = here->BSIM4v6gIgdd + here->BSIM4v6gIgcss; + gIdtots = here->BSIM4v6gIgcsd; + gIdtotb = here->BSIM4v6gIgcsb; + Idtoteq = model->BSIM4v6type * (here->BSIM4v6Igd + here->BSIM4v6Igcs + - (here->BSIM4v6gIgdg + here->BSIM4v6gIgcsg) * vgd + + here->BSIM4v6gIgcsd * vds - here->BSIM4v6gIgcsb * vbd); + } + else + { gIstotg = gIstotd = gIstots = gIstotb = Istoteq = 0.0; + gIdtotg = gIdtotd = gIdtots = gIdtotb = Idtoteq = 0.0; + } + + if (model->BSIM4v6igbMod) + { gIbtotg = here->BSIM4v6gIgbg; + gIbtotd = here->BSIM4v6gIgbs; + gIbtots = here->BSIM4v6gIgbd; + gIbtotb = here->BSIM4v6gIgbb; + Ibtoteq = model->BSIM4v6type * (here->BSIM4v6Igb + - here->BSIM4v6gIgbg * vgd + here->BSIM4v6gIgbd * vds + - here->BSIM4v6gIgbb * vbd); + } + else + gIbtotg = gIbtotd = gIbtots = gIbtotb = Ibtoteq = 0.0; + + if ((model->BSIM4v6igcMod != 0) || (model->BSIM4v6igbMod != 0)) + { gIgtotg = gIstotg + gIdtotg + gIbtotg; + gIgtotd = gIstotd + gIdtotd + gIbtotd ; + gIgtots = gIstots + gIdtots + gIbtots; + gIgtotb = gIstotb + gIdtotb + gIbtotb; + Igtoteq = Istoteq + Idtoteq + Ibtoteq; + } + else + gIgtotg = gIgtotd = gIgtots = gIgtotb = Igtoteq = 0.0; + + + if (here->BSIM4v6rgateMod == 2) + T0 = vges - vgs; + else if (here->BSIM4v6rgateMod == 3) + T0 = vgms - vgs; + if (here->BSIM4v6rgateMod > 1) + { gcrgd = here->BSIM4v6gcrgs * T0; + gcrgg = here->BSIM4v6gcrgg * T0; + gcrgs = here->BSIM4v6gcrgd * T0; + gcrgb = here->BSIM4v6gcrgb * T0; + ceqgcrg = -(gcrgg * vgd - gcrgs * vds + + gcrgb * vbd); + gcrgg -= here->BSIM4v6gcrg; + gcrg = here->BSIM4v6gcrg; + } + else + ceqgcrg = gcrg = gcrgd = gcrgg = gcrgs = gcrgb = 0.0; + } + + if (model->BSIM4v6rdsMod == 1) + { ceqgstot = model->BSIM4v6type * (here->BSIM4v6gstotd * vds + + here->BSIM4v6gstotg * vgs + here->BSIM4v6gstotb * vbs); + /* WDLiu: ceqgstot flowing away from sNodePrime */ + gstot = here->BSIM4v6gstot; + gstotd = here->BSIM4v6gstotd; + gstotg = here->BSIM4v6gstotg; + gstots = here->BSIM4v6gstots - gstot; + gstotb = here->BSIM4v6gstotb; + + ceqgdtot = -model->BSIM4v6type * (here->BSIM4v6gdtotd * vds + + here->BSIM4v6gdtotg * vgs + here->BSIM4v6gdtotb * vbs); + /* WDLiu: ceqgdtot defined as flowing into dNodePrime */ + gdtot = here->BSIM4v6gdtot; + gdtotd = here->BSIM4v6gdtotd - gdtot; + gdtotg = here->BSIM4v6gdtotg; + gdtots = here->BSIM4v6gdtots; + gdtotb = here->BSIM4v6gdtotb; + } + else + { gstot = gstotd = gstotg = gstots = gstotb = ceqgstot = 0.0; + gdtot = gdtotd = gdtotg = gdtots = gdtotb = ceqgdtot = 0.0; + } + + if (model->BSIM4v6type > 0) + { ceqjs = (here->BSIM4v6cbs - here->BSIM4v6gbs * vbs_jct); + ceqjd = (here->BSIM4v6cbd - here->BSIM4v6gbd * vbd_jct); + } + else + { ceqjs = -(here->BSIM4v6cbs - here->BSIM4v6gbs * vbs_jct); + ceqjd = -(here->BSIM4v6cbd - here->BSIM4v6gbd * vbd_jct); + ceqqg = -ceqqg; + ceqqd = -ceqqd; + ceqqb = -ceqqb; + ceqgcrg = -ceqgcrg; + + if (here->BSIM4v6trnqsMod) + { cqdef = -cqdef; + cqcheq = -cqcheq; + } + + if (here->BSIM4v6rbodyMod) + { ceqqjs = -ceqqjs; + ceqqjd = -ceqqjd; + } + + if (here->BSIM4v6rgateMod == 3) + ceqqgmid = -ceqqgmid; + } + + + /* + * Loading RHS + */ + + m = here->BSIM4v6m; + +#ifdef USE_OMP4 + here->BSIM4v6rhsdPrime = m * (ceqjd - ceqbd + ceqgdtot + - ceqdrn - ceqqd + Idtoteq); + here->BSIM4v6rhsgPrime = m * (ceqqg - ceqgcrg + Igtoteq); + + if (here->BSIM4v6rgateMod == 2) + here->BSIM4v6rhsgExt = m * ceqgcrg; + else if (here->BSIM4v6rgateMod == 3) + here->BSIM4v6grhsMid = m * (ceqqgmid + ceqgcrg); + + if (!here->BSIM4v6rbodyMod) + { here->BSIM4v6rhsbPrime = m * (ceqbd + ceqbs - ceqjd + - ceqjs - ceqqb + Ibtoteq); + here->BSIM4v6rhssPrime = m * (ceqdrn - ceqbs + ceqjs + + ceqqg + ceqqb + ceqqd + ceqqgmid - ceqgstot + Istoteq); + } + else + { here->BSIM4v6rhsdb = m * (ceqjd + ceqqjd); + here->BSIM4v6rhsbPrime = m * (ceqbd + ceqbs - ceqqb + Ibtoteq); + here->BSIM4v6rhssb = m * (ceqjs + ceqqjs); + here->BSIM4v6rhssPrime = m * (ceqdrn - ceqbs + ceqjs + ceqqd + + ceqqg + ceqqb + ceqqjd + ceqqjs + ceqqgmid - ceqgstot + Istoteq); + } + + if (model->BSIM4v6rdsMod) + { here->BSIM4v6rhsd = m * ceqgdtot; + here->BSIM4v6rhss = m * ceqgstot; + } + + if (here->BSIM4v6trnqsMod) + here->BSIM4v6rhsq = m * (cqcheq - cqdef); +#else + (*(ckt->CKTrhs + here->BSIM4v6dNodePrime) += m * (ceqjd - ceqbd + ceqgdtot + - ceqdrn - ceqqd + Idtoteq)); + (*(ckt->CKTrhs + here->BSIM4v6gNodePrime) -= m * (ceqqg - ceqgcrg + Igtoteq)); + + if (here->BSIM4v6rgateMod == 2) + (*(ckt->CKTrhs + here->BSIM4v6gNodeExt) -= m * ceqgcrg); + else if (here->BSIM4v6rgateMod == 3) + (*(ckt->CKTrhs + here->BSIM4v6gNodeMid) -= m * (ceqqgmid + ceqgcrg)); + + if (!here->BSIM4v6rbodyMod) + { (*(ckt->CKTrhs + here->BSIM4v6bNodePrime) += m * (ceqbd + ceqbs - ceqjd + - ceqjs - ceqqb + Ibtoteq)); + (*(ckt->CKTrhs + here->BSIM4v6sNodePrime) += m * (ceqdrn - ceqbs + ceqjs + + ceqqg + ceqqb + ceqqd + ceqqgmid - ceqgstot + Istoteq)); + } + + else + { (*(ckt->CKTrhs + here->BSIM4v6dbNode) -= m * (ceqjd + ceqqjd)); + (*(ckt->CKTrhs + here->BSIM4v6bNodePrime) += m * (ceqbd + ceqbs - ceqqb + Ibtoteq)); + (*(ckt->CKTrhs + here->BSIM4v6sbNode) -= m * (ceqjs + ceqqjs)); + (*(ckt->CKTrhs + here->BSIM4v6sNodePrime) += m * (ceqdrn - ceqbs + ceqjs + ceqqd + + ceqqg + ceqqb + ceqqjd + ceqqjs + ceqqgmid - ceqgstot + Istoteq)); + } + + if (model->BSIM4v6rdsMod) + { (*(ckt->CKTrhs + here->BSIM4v6dNode) -= m * ceqgdtot); + (*(ckt->CKTrhs + here->BSIM4v6sNode) += m * ceqgstot); + } + + if (here->BSIM4v6trnqsMod) + *(ckt->CKTrhs + here->BSIM4v6qNode) += m * (cqcheq - cqdef); +#endif + + /* + * Loading matrix + */ + + if (!here->BSIM4v6rbodyMod) + { gjbd = here->BSIM4v6gbd; + gjbs = here->BSIM4v6gbs; + } + else + gjbd = gjbs = 0.0; + + if (!model->BSIM4v6rdsMod) + { gdpr = here->BSIM4v6drainConductance; + gspr = here->BSIM4v6sourceConductance; + } + else + gdpr = gspr = 0.0; + + geltd = here->BSIM4v6grgeltd; + + T1 = qdef * here->BSIM4v6gtau; +#ifdef USE_OMP4 + if (here->BSIM4v6rgateMod == 1) + { here->BSIM4v6_1 = m * geltd; + here->BSIM4v6_2 = m * geltd; + here->BSIM4v6_3 = m * geltd; + here->BSIM4v6_4 = m * (gcggb + geltd - ggtg + gIgtotg); + here->BSIM4v6_5 = m * (gcgdb - ggtd + gIgtotd); + here->BSIM4v6_6 = m * (gcgsb - ggts + gIgtots); + here->BSIM4v6_7 = m * (gcgbb - ggtb + gIgtotb); + } /* WDLiu: gcrg already subtracted from all gcrgg below */ + else if (here->BSIM4v6rgateMod == 2) + { here->BSIM4v6_8 = m * gcrg; + here->BSIM4v6_9 = m * gcrgg; + here->BSIM4v6_10 = m * gcrgd; + here->BSIM4v6_11 = m * gcrgs; + here->BSIM4v6_12 = m * gcrgb; + + here->BSIM4v6_13 = m * gcrg; + here->BSIM4v6_14 = m * (gcggb - gcrgg - ggtg + gIgtotg); + here->BSIM4v6_15 = m * (gcgdb - gcrgd - ggtd + gIgtotd); + here->BSIM4v6_16 = m * (gcgsb - gcrgs - ggts + gIgtots); + here->BSIM4v6_17 = m * (gcgbb - gcrgb - ggtb + gIgtotb); + } + else if (here->BSIM4v6rgateMod == 3) + { here->BSIM4v6_18 = m * geltd; + here->BSIM4v6_19 = m * geltd; + here->BSIM4v6_20 = m * geltd; + here->BSIM4v6_21 = m * (geltd + gcrg + gcgmgmb); + + here->BSIM4v6_22 = m * (gcrgd + gcgmdb); + here->BSIM4v6_23 = m * gcrgg; + here->BSIM4v6_24 = m * (gcrgs + gcgmsb); + here->BSIM4v6_25 = m * (gcrgb + gcgmbb); + + here->BSIM4v6_26 = m * gcdgmb; + here->BSIM4v6_26 = m * gcrg; + here->BSIM4v6_28 = m * gcsgmb; + here->BSIM4v6_29 = m * gcbgmb; + + here->BSIM4v6_30 = m * (gcggb - gcrgg - ggtg + gIgtotg); + here->BSIM4v6_31 = m * (gcgdb - gcrgd - ggtd + gIgtotd); + here->BSIM4v6_32 = m * (gcgsb - gcrgs - ggts + gIgtots); + here->BSIM4v6_33 = m * (gcgbb - gcrgb - ggtb + gIgtotb); + } + else + { here->BSIM4v6_34 = m * (gcggb - ggtg + gIgtotg); + here->BSIM4v6_35 = m * (gcgdb - ggtd + gIgtotd); + here->BSIM4v6_36 = m * (gcgsb - ggts + gIgtots); + here->BSIM4v6_37 = m * (gcgbb - ggtb + gIgtotb); + } + + if (model->BSIM4v6rdsMod) + { here->BSIM4v6_38 = m * gdtotg; + here->BSIM4v6_39 = m * gdtots; + here->BSIM4v6_40 = m * gdtotb; + here->BSIM4v6_41 = m * gstotd; + here->BSIM4v6_42 = m * gstotg; + here->BSIM4v6_43 = m * gstotb; + } + + here->BSIM4v6_44 = m * (gdpr + here->BSIM4v6gds + here->BSIM4v6gbd + T1 * ddxpart_dVd + - gdtotd + RevSum + gcddb + gbdpdp + dxpart * ggtd - gIdtotd); + here->BSIM4v6_45 = m * (gdpr + gdtot); + here->BSIM4v6_46 = m * (Gm + gcdgb - gdtotg + gbdpg - gIdtotg + + dxpart * ggtg + T1 * ddxpart_dVg); + here->BSIM4v6_47 = m * (here->BSIM4v6gds + gdtots - dxpart * ggts + gIdtots + - T1 * ddxpart_dVs + FwdSum - gcdsb - gbdpsp); + here->BSIM4v6_48 = m * (gjbd + gdtotb - Gmbs - gcdbb - gbdpb + gIdtotb + - T1 * ddxpart_dVb - dxpart * ggtb); + + here->BSIM4v6_49 = m * (gdpr - gdtotd); + here->BSIM4v6_50 = m * (gdpr + gdtot); + + here->BSIM4v6_51 = m * (here->BSIM4v6gds + gstotd + RevSum - gcsdb - gbspdp + - T1 * dsxpart_dVd - sxpart * ggtd + gIstotd); + here->BSIM4v6_52 = m * (gcsgb - Gm - gstotg + gbspg + sxpart * ggtg + + T1 * dsxpart_dVg - gIstotg); + here->BSIM4v6_53 = m * (gspr + here->BSIM4v6gds + here->BSIM4v6gbs + T1 * dsxpart_dVs + - gstots + FwdSum + gcssb + gbspsp + sxpart * ggts - gIstots); + here->BSIM4v6_54 = m * (gspr + gstot); + here->BSIM4v6_55 = m * (gjbs + gstotb + Gmbs - gcsbb - gbspb - sxpart * ggtb + - T1 * dsxpart_dVb + gIstotb); + + here->BSIM4v6_56 = m * (gspr - gstots); + here->BSIM4v6_57 = m * (gspr + gstot); + + here->BSIM4v6_58 = m * (gcbdb - gjbd + gbbdp - gIbtotd); + here->BSIM4v6_59 = m * (gcbgb - here->BSIM4v6gbgs - gIbtotg); + here->BSIM4v6_60 = m * (gcbsb - gjbs + gbbsp - gIbtots); + here->BSIM4v6_61 = m * (gjbd + gjbs + gcbbb - here->BSIM4v6gbbs - gIbtotb); + + ggidld = here->BSIM4v6ggidld; + ggidlg = here->BSIM4v6ggidlg; + ggidlb = here->BSIM4v6ggidlb; + ggislg = here->BSIM4v6ggislg; + ggisls = here->BSIM4v6ggisls; + ggislb = here->BSIM4v6ggislb; + + /* stamp gidl */ + here->BSIM4v6_62 = m * ggidld; + here->BSIM4v6_63 = m * ggidlg; + here->BSIM4v6_64 = m * (ggidlg + ggidld + ggidlb); + here->BSIM4v6_65 = m * ggidlb; + here->BSIM4v6_66 = m * ggidld; + here->BSIM4v6_67 = m * ggidlg; + here->BSIM4v6_68 = m * (ggidlg + ggidld + ggidlb); + here->BSIM4v6_69 = m * ggidlb; + /* stamp gisl */ + here->BSIM4v6_70 = m * (ggisls + ggislg + ggislb); + here->BSIM4v6_71 = m * ggislg; + here->BSIM4v6_72 = m * ggisls; + here->BSIM4v6_73 = m * ggislb; + here->BSIM4v6_74 = m * (ggislg + ggisls + ggislb); + here->BSIM4v6_75 = m * ggislg; + here->BSIM4v6_76 = m * ggisls; + here->BSIM4v6_77 = m * ggislb; + + if (here->BSIM4v6rbodyMod) + { here->BSIM4v6_78 = m * (gcdbdb - here->BSIM4v6gbd); + here->BSIM4v6_79 = m * (here->BSIM4v6gbs - gcsbsb); + + here->BSIM4v6_80 = m * (gcdbdb - here->BSIM4v6gbd); + here->BSIM4v6_81 = m * (here->BSIM4v6gbd - gcdbdb + + here->BSIM4v6grbpd + here->BSIM4v6grbdb); + here->BSIM4v6_82 = m * here->BSIM4v6grbpd; + here->BSIM4v6_83 = m * here->BSIM4v6grbdb; + + here->BSIM4v6_84 = m * here->BSIM4v6grbpd; + here->BSIM4v6_85 = m * here->BSIM4v6grbpb; + here->BSIM4v6_86 = m * here->BSIM4v6grbps; + here->BSIM4v6_87 = m * (here->BSIM4v6grbpd + here->BSIM4v6grbps + + here->BSIM4v6grbpb); + /* WDLiu: (gcbbb - here->BSIM4v6gbbs) already added to BPbpPtr */ + + here->BSIM4v6_88 = m * (gcsbsb - here->BSIM4v6gbs); + here->BSIM4v6_89 = m * here->BSIM4v6grbps; + here->BSIM4v6_90 = m * here->BSIM4v6grbsb; + here->BSIM4v6_91 = m * (here->BSIM4v6gbs - gcsbsb + + here->BSIM4v6grbps + here->BSIM4v6grbsb); + + here->BSIM4v6_92 = m * here->BSIM4v6grbdb; + here->BSIM4v6_93 = m * here->BSIM4v6grbpb; + here->BSIM4v6_94 = m * here->BSIM4v6grbsb; + here->BSIM4v6_95 = m * (here->BSIM4v6grbsb + here->BSIM4v6grbdb + + here->BSIM4v6grbpb); + } + + if (here->BSIM4v6trnqsMod) + { here->BSIM4v6_96 = m * (gqdef + here->BSIM4v6gtau); + here->BSIM4v6_97 = m * (ggtg - gcqgb); + here->BSIM4v6_98 = m * (ggtd - gcqdb); + here->BSIM4v6_99 = m * (ggts - gcqsb); + here->BSIM4v6_100 = m * (ggtb - gcqbb); + + here->BSIM4v6_101 = m * dxpart * here->BSIM4v6gtau; + here->BSIM4v6_102 = m * sxpart * here->BSIM4v6gtau; + here->BSIM4v6_103 = m * here->BSIM4v6gtau; + } +#else + if (here->BSIM4v6rgateMod == 1) + { (*(here->BSIM4v6GEgePtr) += m * geltd); + (*(here->BSIM4v6GPgePtr) -= m * geltd); + (*(here->BSIM4v6GEgpPtr) -= m * geltd); + (*(here->BSIM4v6GPgpPtr) += m * (gcggb + geltd - ggtg + gIgtotg)); + (*(here->BSIM4v6GPdpPtr) += m * (gcgdb - ggtd + gIgtotd)); + (*(here->BSIM4v6GPspPtr) += m * (gcgsb - ggts + gIgtots)); + (*(here->BSIM4v6GPbpPtr) += m * (gcgbb - ggtb + gIgtotb)); + } /* WDLiu: gcrg already subtracted from all gcrgg below */ + else if (here->BSIM4v6rgateMod == 2) + { (*(here->BSIM4v6GEgePtr) += m * gcrg); + (*(here->BSIM4v6GEgpPtr) += m * gcrgg); + (*(here->BSIM4v6GEdpPtr) += m * gcrgd); + (*(here->BSIM4v6GEspPtr) += m * gcrgs); + (*(here->BSIM4v6GEbpPtr) += m * gcrgb); + + (*(here->BSIM4v6GPgePtr) -= m * gcrg); + (*(here->BSIM4v6GPgpPtr) += m * (gcggb - gcrgg - ggtg + gIgtotg)); + (*(here->BSIM4v6GPdpPtr) += m * (gcgdb - gcrgd - ggtd + gIgtotd)); + (*(here->BSIM4v6GPspPtr) += m * (gcgsb - gcrgs - ggts + gIgtots)); + (*(here->BSIM4v6GPbpPtr) += m * (gcgbb - gcrgb - ggtb + gIgtotb)); + } + else if (here->BSIM4v6rgateMod == 3) + { (*(here->BSIM4v6GEgePtr) += m * geltd); + (*(here->BSIM4v6GEgmPtr) -= m * geltd); + (*(here->BSIM4v6GMgePtr) -= m * geltd); + (*(here->BSIM4v6GMgmPtr) += m * (geltd + gcrg + gcgmgmb)); + + (*(here->BSIM4v6GMdpPtr) += m * (gcrgd + gcgmdb)); + (*(here->BSIM4v6GMgpPtr) += m * gcrgg); + (*(here->BSIM4v6GMspPtr) += m * (gcrgs + gcgmsb)); + (*(here->BSIM4v6GMbpPtr) += m * (gcrgb + gcgmbb)); + + (*(here->BSIM4v6DPgmPtr) += m * gcdgmb); + (*(here->BSIM4v6GPgmPtr) -= m * gcrg); + (*(here->BSIM4v6SPgmPtr) += m * gcsgmb); + (*(here->BSIM4v6BPgmPtr) += m * gcbgmb); + + (*(here->BSIM4v6GPgpPtr) += m * (gcggb - gcrgg - ggtg + gIgtotg)); + (*(here->BSIM4v6GPdpPtr) += m * (gcgdb - gcrgd - ggtd + gIgtotd)); + (*(here->BSIM4v6GPspPtr) += m * (gcgsb - gcrgs - ggts + gIgtots)); + (*(here->BSIM4v6GPbpPtr) += m * (gcgbb - gcrgb - ggtb + gIgtotb)); + } + else + { (*(here->BSIM4v6GPgpPtr) += m * (gcggb - ggtg + gIgtotg)); + (*(here->BSIM4v6GPdpPtr) += m * (gcgdb - ggtd + gIgtotd)); + (*(here->BSIM4v6GPspPtr) += m * (gcgsb - ggts + gIgtots)); + (*(here->BSIM4v6GPbpPtr) += m * (gcgbb - ggtb + gIgtotb)); + } + + if (model->BSIM4v6rdsMod) + { (*(here->BSIM4v6DgpPtr) += m * gdtotg); + (*(here->BSIM4v6DspPtr) += m * gdtots); + (*(here->BSIM4v6DbpPtr) += m * gdtotb); + (*(here->BSIM4v6SdpPtr) += m * gstotd); + (*(here->BSIM4v6SgpPtr) += m * gstotg); + (*(here->BSIM4v6SbpPtr) += m * gstotb); + } + + (*(here->BSIM4v6DPdpPtr) += m * (gdpr + here->BSIM4v6gds + here->BSIM4v6gbd + T1 * ddxpart_dVd + - gdtotd + RevSum + gcddb + gbdpdp + dxpart * ggtd - gIdtotd)); + (*(here->BSIM4v6DPdPtr) -= m * (gdpr + gdtot)); + (*(here->BSIM4v6DPgpPtr) += m * (Gm + gcdgb - gdtotg + gbdpg - gIdtotg + + dxpart * ggtg + T1 * ddxpart_dVg)); + (*(here->BSIM4v6DPspPtr) -= m * (here->BSIM4v6gds + gdtots - dxpart * ggts + gIdtots + - T1 * ddxpart_dVs + FwdSum - gcdsb - gbdpsp)); + (*(here->BSIM4v6DPbpPtr) -= m * (gjbd + gdtotb - Gmbs - gcdbb - gbdpb + gIdtotb + - T1 * ddxpart_dVb - dxpart * ggtb)); + + (*(here->BSIM4v6DdpPtr) -= m * (gdpr - gdtotd)); + (*(here->BSIM4v6DdPtr) += m * (gdpr + gdtot)); + + (*(here->BSIM4v6SPdpPtr) -= m * (here->BSIM4v6gds + gstotd + RevSum - gcsdb - gbspdp + - T1 * dsxpart_dVd - sxpart * ggtd + gIstotd)); + (*(here->BSIM4v6SPgpPtr) += m * (gcsgb - Gm - gstotg + gbspg + sxpart * ggtg + + T1 * dsxpart_dVg - gIstotg)); + (*(here->BSIM4v6SPspPtr) += m * (gspr + here->BSIM4v6gds + here->BSIM4v6gbs + T1 * dsxpart_dVs + - gstots + FwdSum + gcssb + gbspsp + sxpart * ggts - gIstots)); + (*(here->BSIM4v6SPsPtr) -= m * (gspr + gstot)); + (*(here->BSIM4v6SPbpPtr) -= m * (gjbs + gstotb + Gmbs - gcsbb - gbspb - sxpart * ggtb + - T1 * dsxpart_dVb + gIstotb)); + + (*(here->BSIM4v6SspPtr) -= m * (gspr - gstots)); + (*(here->BSIM4v6SsPtr) += m * (gspr + gstot)); + + (*(here->BSIM4v6BPdpPtr) += m * (gcbdb - gjbd + gbbdp - gIbtotd)); + (*(here->BSIM4v6BPgpPtr) += m * (gcbgb - here->BSIM4v6gbgs - gIbtotg)); + (*(here->BSIM4v6BPspPtr) += m * (gcbsb - gjbs + gbbsp - gIbtots)); + (*(here->BSIM4v6BPbpPtr) += m * (gjbd + gjbs + gcbbb - here->BSIM4v6gbbs + - gIbtotb)); + + ggidld = here->BSIM4v6ggidld; + ggidlg = here->BSIM4v6ggidlg; + ggidlb = here->BSIM4v6ggidlb; + ggislg = here->BSIM4v6ggislg; + ggisls = here->BSIM4v6ggisls; + ggislb = here->BSIM4v6ggislb; + + /* stamp gidl */ + (*(here->BSIM4v6DPdpPtr) += m * ggidld); + (*(here->BSIM4v6DPgpPtr) += m * ggidlg); + (*(here->BSIM4v6DPspPtr) -= m * (ggidlg + ggidld + ggidlb)); + (*(here->BSIM4v6DPbpPtr) += m * ggidlb); + (*(here->BSIM4v6BPdpPtr) -= m * ggidld); + (*(here->BSIM4v6BPgpPtr) -= m * ggidlg); + (*(here->BSIM4v6BPspPtr) += m * (ggidlg + ggidld + ggidlb)); + (*(here->BSIM4v6BPbpPtr) -= m * ggidlb); + /* stamp gisl */ + (*(here->BSIM4v6SPdpPtr) -= m * (ggisls + ggislg + ggislb)); + (*(here->BSIM4v6SPgpPtr) += m * ggislg); + (*(here->BSIM4v6SPspPtr) += m * ggisls); + (*(here->BSIM4v6SPbpPtr) += m * ggislb); + (*(here->BSIM4v6BPdpPtr) += m * (ggislg + ggisls + ggislb)); + (*(here->BSIM4v6BPgpPtr) -= m * ggislg); + (*(here->BSIM4v6BPspPtr) -= m * ggisls); + (*(here->BSIM4v6BPbpPtr) -= m * ggislb); + + + if (here->BSIM4v6rbodyMod) + { (*(here->BSIM4v6DPdbPtr) += m * (gcdbdb - here->BSIM4v6gbd)); + (*(here->BSIM4v6SPsbPtr) -= m * (here->BSIM4v6gbs - gcsbsb)); + + (*(here->BSIM4v6DBdpPtr) += m * (gcdbdb - here->BSIM4v6gbd)); + (*(here->BSIM4v6DBdbPtr) += m * (here->BSIM4v6gbd - gcdbdb + + here->BSIM4v6grbpd + here->BSIM4v6grbdb)); + (*(here->BSIM4v6DBbpPtr) -= m * here->BSIM4v6grbpd); + (*(here->BSIM4v6DBbPtr) -= m * here->BSIM4v6grbdb); + + (*(here->BSIM4v6BPdbPtr) -= m * here->BSIM4v6grbpd); + (*(here->BSIM4v6BPbPtr) -= m * here->BSIM4v6grbpb); + (*(here->BSIM4v6BPsbPtr) -= m * here->BSIM4v6grbps); + (*(here->BSIM4v6BPbpPtr) += m * (here->BSIM4v6grbpd + here->BSIM4v6grbps + + here->BSIM4v6grbpb)); + /* WDLiu: (gcbbb - here->BSIM4v6gbbs) already added to BPbpPtr */ + + (*(here->BSIM4v6SBspPtr) += m * (gcsbsb - here->BSIM4v6gbs)); + (*(here->BSIM4v6SBbpPtr) -= m * here->BSIM4v6grbps); + (*(here->BSIM4v6SBbPtr) -= m * here->BSIM4v6grbsb); + (*(here->BSIM4v6SBsbPtr) += m * (here->BSIM4v6gbs - gcsbsb + + here->BSIM4v6grbps + here->BSIM4v6grbsb)); + + (*(here->BSIM4v6BdbPtr) -= m * here->BSIM4v6grbdb); + (*(here->BSIM4v6BbpPtr) -= m * here->BSIM4v6grbpb); + (*(here->BSIM4v6BsbPtr) -= m * here->BSIM4v6grbsb); + (*(here->BSIM4v6BbPtr) += m * (here->BSIM4v6grbsb + here->BSIM4v6grbdb + + here->BSIM4v6grbpb)); + } + + if (here->BSIM4v6trnqsMod) + { (*(here->BSIM4v6QqPtr) += m * (gqdef + here->BSIM4v6gtau)); + (*(here->BSIM4v6QgpPtr) += m * (ggtg - gcqgb)); + (*(here->BSIM4v6QdpPtr) += m * (ggtd - gcqdb)); + (*(here->BSIM4v6QspPtr) += m * (ggts - gcqsb)); + (*(here->BSIM4v6QbpPtr) += m * (ggtb - gcqbb)); + + (*(here->BSIM4v6DPqPtr) += m * dxpart * here->BSIM4v6gtau); + (*(here->BSIM4v6SPqPtr) += m * sxpart * here->BSIM4v6gtau); + (*(here->BSIM4v6GPqPtr) -= m * here->BSIM4v6gtau); + } +#endif + +line1000: ; + +#ifndef USE_OMP4 + } /* End of MOSFET Instance */ +} /* End of Model Instance */ +#endif + +return(OK); +} + +/* function to compute poly depletion effect */ +int BSIM4v6polyDepletion( + double phi, + double ngate, + double epsgate, + double coxe, + double Vgs, + double *Vgs_eff, + double *dVgs_eff_dVg) +{ + double T1, T2, T3, T4, T5, T6, T7, T8; + + /* Poly Gate Si Depletion Effect */ + if ((ngate > 1.0e18) && + (ngate < 1.0e25) && (Vgs > phi) && (epsgate!=0) + ){ + T1 = 1.0e6 * CHARGE * epsgate * ngate / (coxe * coxe); + T8 = Vgs - phi; + T4 = sqrt(1.0 + 2.0 * T8 / T1); + T2 = 2.0 * T8 / (T4 + 1.0); + T3 = 0.5 * T2 * T2 / T1; /* T3 = Vpoly */ + T7 = 1.12 - T3 - 0.05; + T6 = sqrt(T7 * T7 + 0.224); + T5 = 1.12 - 0.5 * (T7 + T6); + *Vgs_eff = Vgs - T5; + *dVgs_eff_dVg = 1.0 - (0.5 - 0.5 / T4) * (1.0 + T7 / T6); + } + else { + *Vgs_eff = Vgs; + *dVgs_eff_dVg = 1.0; + } + return(0); +} + +#ifdef USE_OMP4 +void BSIM4v6LoadRhsMat(GENmodel *inModel, CKTcircuit *ckt) +{ + unsigned int InstCount, idx; + BSIM4v6instance **InstArray; + BSIM4v6instance *here; + BSIM4v6model *model = (BSIM4v6model*)inModel; + + InstArray = model->BSIM4v6InstanceArray; + InstCount = model->BSIM4v6InstCount; + + for(idx = 0; idx < InstCount; idx++) { + here = InstArray[idx]; + /* Update b for Ax = b */ + (*(ckt->CKTrhs + here->BSIM4v6dNodePrime) += here->BSIM4v6rhsdPrime); + (*(ckt->CKTrhs + here->BSIM4v6gNodePrime) -= here->BSIM4v6rhsgPrime); + + if (here->BSIM4v6rgateMod == 2) + (*(ckt->CKTrhs + here->BSIM4v6gNodeExt) -= here->BSIM4v6rhsgExt); + else if (here->BSIM4v6rgateMod == 3) + (*(ckt->CKTrhs + here->BSIM4v6gNodeMid) -= here->BSIM4v6grhsMid); + + if (!here->BSIM4v6rbodyMod) + { (*(ckt->CKTrhs + here->BSIM4v6bNodePrime) += here->BSIM4v6rhsbPrime); + (*(ckt->CKTrhs + here->BSIM4v6sNodePrime) += here->BSIM4v6rhssPrime); + } + else + { (*(ckt->CKTrhs + here->BSIM4v6dbNode) -= here->BSIM4v6rhsdb); + (*(ckt->CKTrhs + here->BSIM4v6bNodePrime) += here->BSIM4v6rhsbPrime); + (*(ckt->CKTrhs + here->BSIM4v6sbNode) -= here->BSIM4v6rhssb); + (*(ckt->CKTrhs + here->BSIM4v6sNodePrime) += here->BSIM4v6rhssPrime); + } + + if (model->BSIM4v6rdsMod) + { (*(ckt->CKTrhs + here->BSIM4v6dNode) -= here->BSIM4v6rhsd); + (*(ckt->CKTrhs + here->BSIM4v6sNode) += here->BSIM4v6rhss); + } + + if (here->BSIM4v6trnqsMod) + *(ckt->CKTrhs + here->BSIM4v6qNode) += here->BSIM4v6rhsq; + + + /* Update A for Ax = b */ + if (here->BSIM4v6rgateMod == 1) + { (*(here->BSIM4v6GEgePtr) += here->BSIM4v6_1); + (*(here->BSIM4v6GPgePtr) -= here->BSIM4v6_2); + (*(here->BSIM4v6GEgpPtr) -= here->BSIM4v6_3); + (*(here->BSIM4v6GPgpPtr) += here->BSIM4v6_4); + (*(here->BSIM4v6GPdpPtr) += here->BSIM4v6_5); + (*(here->BSIM4v6GPspPtr) += here->BSIM4v6_6); + (*(here->BSIM4v6GPbpPtr) += here->BSIM4v6_7); + } + else if (here->BSIM4v6rgateMod == 2) + { (*(here->BSIM4v6GEgePtr) += here->BSIM4v6_8); + (*(here->BSIM4v6GEgpPtr) += here->BSIM4v6_9); + (*(here->BSIM4v6GEdpPtr) += here->BSIM4v6_10); + (*(here->BSIM4v6GEspPtr) += here->BSIM4v6_11); + (*(here->BSIM4v6GEbpPtr) += here->BSIM4v6_12); + + (*(here->BSIM4v6GPgePtr) -= here->BSIM4v6_13); + (*(here->BSIM4v6GPgpPtr) += here->BSIM4v6_14); + (*(here->BSIM4v6GPdpPtr) += here->BSIM4v6_15); + (*(here->BSIM4v6GPspPtr) += here->BSIM4v6_16); + (*(here->BSIM4v6GPbpPtr) += here->BSIM4v6_17); + } + else if (here->BSIM4v6rgateMod == 3) + { (*(here->BSIM4v6GEgePtr) += here->BSIM4v6_18); + (*(here->BSIM4v6GEgmPtr) -= here->BSIM4v6_19); + (*(here->BSIM4v6GMgePtr) -= here->BSIM4v6_20); + (*(here->BSIM4v6GMgmPtr) += here->BSIM4v6_21); + + (*(here->BSIM4v6GMdpPtr) += here->BSIM4v6_22); + (*(here->BSIM4v6GMgpPtr) += here->BSIM4v6_23); + (*(here->BSIM4v6GMspPtr) += here->BSIM4v6_24); + (*(here->BSIM4v6GMbpPtr) += here->BSIM4v6_25); + + (*(here->BSIM4v6DPgmPtr) += here->BSIM4v6_26); + (*(here->BSIM4v6GPgmPtr) -= here->BSIM4v6_27); + (*(here->BSIM4v6SPgmPtr) += here->BSIM4v6_28); + (*(here->BSIM4v6BPgmPtr) += here->BSIM4v6_29); + + (*(here->BSIM4v6GPgpPtr) += here->BSIM4v6_30); + (*(here->BSIM4v6GPdpPtr) += here->BSIM4v6_31); + (*(here->BSIM4v6GPspPtr) += here->BSIM4v6_32); + (*(here->BSIM4v6GPbpPtr) += here->BSIM4v6_33); + } + + + else + { (*(here->BSIM4v6GPgpPtr) += here->BSIM4v6_34); + (*(here->BSIM4v6GPdpPtr) += here->BSIM4v6_35); + (*(here->BSIM4v6GPspPtr) += here->BSIM4v6_36); + (*(here->BSIM4v6GPbpPtr) += here->BSIM4v6_37); + } + + + if (model->BSIM4v6rdsMod) + { (*(here->BSIM4v6DgpPtr) += here->BSIM4v6_38); + (*(here->BSIM4v6DspPtr) += here->BSIM4v6_39); + (*(here->BSIM4v6DbpPtr) += here->BSIM4v6_40); + (*(here->BSIM4v6SdpPtr) += here->BSIM4v6_41); + (*(here->BSIM4v6SgpPtr) += here->BSIM4v6_42); + (*(here->BSIM4v6SbpPtr) += here->BSIM4v6_43); + } + + (*(here->BSIM4v6DPdpPtr) += here->BSIM4v6_44); + (*(here->BSIM4v6DPdPtr) -= here->BSIM4v6_45); + (*(here->BSIM4v6DPgpPtr) += here->BSIM4v6_46); + (*(here->BSIM4v6DPspPtr) -= here->BSIM4v6_47); + (*(here->BSIM4v6DPbpPtr) -= here->BSIM4v6_48); + + (*(here->BSIM4v6DdpPtr) -= here->BSIM4v6_49); + (*(here->BSIM4v6DdPtr) += here->BSIM4v6_50); + + (*(here->BSIM4v6SPdpPtr) -= here->BSIM4v6_51); + (*(here->BSIM4v6SPgpPtr) += here->BSIM4v6_52); + (*(here->BSIM4v6SPspPtr) += here->BSIM4v6_53); + (*(here->BSIM4v6SPsPtr) -= here->BSIM4v6_54); + (*(here->BSIM4v6SPbpPtr) -= here->BSIM4v6_55); + + (*(here->BSIM4v6SspPtr) -= here->BSIM4v6_56); + (*(here->BSIM4v6SsPtr) += here->BSIM4v6_57); + + (*(here->BSIM4v6BPdpPtr) += here->BSIM4v6_58); + (*(here->BSIM4v6BPgpPtr) += here->BSIM4v6_59); + (*(here->BSIM4v6BPspPtr) += here->BSIM4v6_60); + (*(here->BSIM4v6BPbpPtr) += here->BSIM4v6_61); + + /* stamp gidl */ + (*(here->BSIM4v6DPdpPtr) += here->BSIM4v6_62); + (*(here->BSIM4v6DPgpPtr) += here->BSIM4v6_63); + (*(here->BSIM4v6DPspPtr) -= here->BSIM4v6_64); + (*(here->BSIM4v6DPbpPtr) += here->BSIM4v6_65); + (*(here->BSIM4v6BPdpPtr) -= here->BSIM4v6_66); + (*(here->BSIM4v6BPgpPtr) -= here->BSIM4v6_67); + (*(here->BSIM4v6BPspPtr) += here->BSIM4v6_68); + (*(here->BSIM4v6BPbpPtr) -= here->BSIM4v6_69); + /* stamp gisl */ + (*(here->BSIM4v6SPdpPtr) -= here->BSIM4v6_70); + (*(here->BSIM4v6SPgpPtr) += here->BSIM4v6_71); + (*(here->BSIM4v6SPspPtr) += here->BSIM4v6_72); + (*(here->BSIM4v6SPbpPtr) += here->BSIM4v6_73); + (*(here->BSIM4v6BPdpPtr) += here->BSIM4v6_74); + (*(here->BSIM4v6BPgpPtr) -= here->BSIM4v6_75); + (*(here->BSIM4v6BPspPtr) -= here->BSIM4v6_76); + (*(here->BSIM4v6BPbpPtr) -= here->BSIM4v6_77); + + + if (here->BSIM4v6rbodyMod) + { (*(here->BSIM4v6DPdbPtr) += here->BSIM4v6_78); + (*(here->BSIM4v6SPsbPtr) -= here->BSIM4v6_79); + + (*(here->BSIM4v6DBdpPtr) += here->BSIM4v6_80); + (*(here->BSIM4v6DBdbPtr) += here->BSIM4v6_81); + (*(here->BSIM4v6DBbpPtr) -= here->BSIM4v6_82); + (*(here->BSIM4v6DBbPtr) -= here->BSIM4v6_83); + + (*(here->BSIM4v6BPdbPtr) -= here->BSIM4v6_84); + (*(here->BSIM4v6BPbPtr) -= here->BSIM4v6_85); + (*(here->BSIM4v6BPsbPtr) -= here->BSIM4v6_86); + (*(here->BSIM4v6BPbpPtr) += here->BSIM4v6_87); + + (*(here->BSIM4v6SBspPtr) += here->BSIM4v6_88); + (*(here->BSIM4v6SBbpPtr) -= here->BSIM4v6_89); + (*(here->BSIM4v6SBbPtr) -= here->BSIM4v6_90); + (*(here->BSIM4v6SBsbPtr) += here->BSIM4v6_91); + + (*(here->BSIM4v6BdbPtr) -= here->BSIM4v6_92); + (*(here->BSIM4v6BbpPtr) -= here->BSIM4v6_93); + (*(here->BSIM4v6BsbPtr) -= here->BSIM4v6_94); + (*(here->BSIM4v6BbPtr) += here->BSIM4v6_95); + } + + if (here->BSIM4v6trnqsMod) + { (*(here->BSIM4v6QqPtr) += here->BSIM4v6_96); + (*(here->BSIM4v6QgpPtr) += here->BSIM4v6_97); + (*(here->BSIM4v6QdpPtr) += here->BSIM4v6_98); + (*(here->BSIM4v6QspPtr) += here->BSIM4v6_99); + (*(here->BSIM4v6QbpPtr) += here->BSIM4v6_100); + + (*(here->BSIM4v6DPqPtr) += here->BSIM4v6_101); + (*(here->BSIM4v6SPqPtr) += here->BSIM4v6_102); + (*(here->BSIM4v6GPqPtr) -= here->BSIM4v6_103); + } + } +} + +#endif diff --git a/src/spicelib/devices/bsim4v6/b4v6mask.c b/src/spicelib/devices/bsim4v6/b4v6mask.c new file mode 100644 index 000000000..9bd4cf85f --- /dev/null +++ b/src/spicelib/devices/bsim4v6/b4v6mask.c @@ -0,0 +1,2496 @@ +/**** BSIM4.6.2 Released by Wenwei Yang 07/31/2008 ****/ + +/********** + * Copyright 2006 Regents of the University of California. All rights reserved. + * File: b4mask.c of BSIM4.6.2. + * Author: 2000 Weidong Liu + * Authors: 2001- Xuemei Xi, Mohan Dunga, Ali Niknejad, Chenming Hu. + * Authors: 2006- Mohan Dunga, Ali Niknejad, Chenming Hu + * Authors: 2007- Mohan Dunga, Wenwei Yang, 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. + * Modified by Mohan Dunga, 12/13/2006 + * Modified by Mohan Dunga, Wenwei Yang, 07/31/2008. + **********/ + + +#include "ngspice.h" +#include "ifsim.h" +#include "cktdefs.h" +#include "devdefs.h" +#include "bsim4v6def.h" +#include "sperror.h" +#include "suffix.h" + +int +BSIM4v6mAsk( +CKTcircuit *ckt, +GENmodel *inst, +int which, +IFvalue *value) +{ + BSIM4v6model *model = (BSIM4v6model *)inst; + + NG_IGNORE(ckt); + + switch(which) + { case BSIM4v6_MOD_MOBMOD : + value->iValue = model->BSIM4v6mobMod; + return(OK); + case BSIM4v6_MOD_PARAMCHK : + value->iValue = model->BSIM4v6paramChk; + return(OK); + case BSIM4v6_MOD_BINUNIT : + value->iValue = model->BSIM4v6binUnit; + return(OK); + case BSIM4v6_MOD_CVCHARGEMOD : + value->iValue = model->BSIM4v6cvchargeMod; + return(OK); + case BSIM4v6_MOD_CAPMOD : + value->iValue = model->BSIM4v6capMod; + return(OK); + case BSIM4v6_MOD_DIOMOD : + value->iValue = model->BSIM4v6dioMod; + return(OK); + case BSIM4v6_MOD_TRNQSMOD : + value->iValue = model->BSIM4v6trnqsMod; + return(OK); + case BSIM4v6_MOD_ACNQSMOD : + value->iValue = model->BSIM4v6acnqsMod; + return(OK); + case BSIM4v6_MOD_FNOIMOD : + value->iValue = model->BSIM4v6fnoiMod; + return(OK); + case BSIM4v6_MOD_TNOIMOD : + value->iValue = model->BSIM4v6tnoiMod; + return(OK); + case BSIM4v6_MOD_RDSMOD : + value->iValue = model->BSIM4v6rdsMod; + return(OK); + case BSIM4v6_MOD_RBODYMOD : + value->iValue = model->BSIM4v6rbodyMod; + return(OK); + case BSIM4v6_MOD_RGATEMOD : + value->iValue = model->BSIM4v6rgateMod; + return(OK); + case BSIM4v6_MOD_PERMOD : + value->iValue = model->BSIM4v6perMod; + return(OK); + case BSIM4v6_MOD_GEOMOD : + value->iValue = model->BSIM4v6geoMod; + return(OK); + case BSIM4v6_MOD_MTRLMOD : + value->iValue = model->BSIM4v6mtrlMod; + return(OK); + + case BSIM4v6_MOD_IGCMOD : + value->iValue = model->BSIM4v6igcMod; + return(OK); + case BSIM4v6_MOD_IGBMOD : + value->iValue = model->BSIM4v6igbMod; + return(OK); + case BSIM4v6_MOD_TEMPMOD : + value->iValue = model->BSIM4v6tempMod; + return(OK); + + case BSIM4v6_MOD_VERSION : + value->sValue = model->BSIM4v6version; + return(OK); + case BSIM4v6_MOD_TOXREF : + value->rValue = model->BSIM4v6toxref; + return(OK); + case BSIM4v6_MOD_EOT : + value->rValue = model->BSIM4v6eot; + return(OK); + case BSIM4v6_MOD_VDDEOT : + value->rValue = model->BSIM4v6vddeot; + return(OK); + case BSIM4v6_MOD_TEMPEOT : + value->rValue = model->BSIM4v6tempeot; + return(OK); + case BSIM4v6_MOD_LEFFEOT : + value->rValue = model->BSIM4v6leffeot; + return(OK); + case BSIM4v6_MOD_WEFFEOT : + value->rValue = model->BSIM4v6weffeot; + return(OK); + case BSIM4v6_MOD_ADOS : + value->rValue = model->BSIM4v6ados; + return(OK); + case BSIM4v6_MOD_BDOS : + value->rValue = model->BSIM4v6bdos; + return(OK); + case BSIM4v6_MOD_TOXE : + value->rValue = model->BSIM4v6toxe; + return(OK); + case BSIM4v6_MOD_TOXP : + value->rValue = model->BSIM4v6toxp; + return(OK); + case BSIM4v6_MOD_TOXM : + value->rValue = model->BSIM4v6toxm; + return(OK); + case BSIM4v6_MOD_DTOX : + value->rValue = model->BSIM4v6dtox; + return(OK); + case BSIM4v6_MOD_EPSROX : + value->rValue = model->BSIM4v6epsrox; + return(OK); + case BSIM4v6_MOD_CDSC : + value->rValue = model->BSIM4v6cdsc; + return(OK); + case BSIM4v6_MOD_CDSCB : + value->rValue = model->BSIM4v6cdscb; + return(OK); + + case BSIM4v6_MOD_CDSCD : + value->rValue = model->BSIM4v6cdscd; + return(OK); + + case BSIM4v6_MOD_CIT : + value->rValue = model->BSIM4v6cit; + return(OK); + case BSIM4v6_MOD_NFACTOR : + value->rValue = model->BSIM4v6nfactor; + return(OK); + case BSIM4v6_MOD_XJ: + value->rValue = model->BSIM4v6xj; + return(OK); + case BSIM4v6_MOD_VSAT: + value->rValue = model->BSIM4v6vsat; + return(OK); + case BSIM4v6_MOD_VTL: + value->rValue = model->BSIM4v6vtl; + return(OK); + case BSIM4v6_MOD_XN: + value->rValue = model->BSIM4v6xn; + return(OK); + case BSIM4v6_MOD_LC: + value->rValue = model->BSIM4v6lc; + return(OK); + case BSIM4v6_MOD_LAMBDA: + value->rValue = model->BSIM4v6lambda; + return(OK); + case BSIM4v6_MOD_AT: + value->rValue = model->BSIM4v6at; + return(OK); + case BSIM4v6_MOD_A0: + value->rValue = model->BSIM4v6a0; + return(OK); + + case BSIM4v6_MOD_AGS: + value->rValue = model->BSIM4v6ags; + return(OK); + + case BSIM4v6_MOD_A1: + value->rValue = model->BSIM4v6a1; + return(OK); + case BSIM4v6_MOD_A2: + value->rValue = model->BSIM4v6a2; + return(OK); + case BSIM4v6_MOD_KETA: + value->rValue = model->BSIM4v6keta; + return(OK); + case BSIM4v6_MOD_NSUB: + value->rValue = model->BSIM4v6nsub; + return(OK); + case BSIM4v6_MOD_PHIG: + value->rValue = model->BSIM4v6phig; + return(OK); + case BSIM4v6_MOD_EPSRGATE: + value->rValue = model->BSIM4v6epsrgate; + return(OK); + case BSIM4v6_MOD_EASUB: + value->rValue = model->BSIM4v6easub; + return(OK); + case BSIM4v6_MOD_EPSRSUB: + value->rValue = model->BSIM4v6epsrsub; + return(OK); + case BSIM4v6_MOD_NI0SUB: + value->rValue = model->BSIM4v6ni0sub; + return(OK); + case BSIM4v6_MOD_BG0SUB: + value->rValue = model->BSIM4v6bg0sub; + return(OK); + case BSIM4v6_MOD_TBGASUB: + value->rValue = model->BSIM4v6tbgasub; + return(OK); + case BSIM4v6_MOD_TBGBSUB: + value->rValue = model->BSIM4v6tbgbsub; + return(OK); + case BSIM4v6_MOD_NDEP: + value->rValue = model->BSIM4v6ndep; + return(OK); + case BSIM4v6_MOD_NSD: + value->rValue = model->BSIM4v6nsd; + return(OK); + case BSIM4v6_MOD_NGATE: + value->rValue = model->BSIM4v6ngate; + return(OK); + case BSIM4v6_MOD_GAMMA1: + value->rValue = model->BSIM4v6gamma1; + return(OK); + case BSIM4v6_MOD_GAMMA2: + value->rValue = model->BSIM4v6gamma2; + return(OK); + case BSIM4v6_MOD_VBX: + value->rValue = model->BSIM4v6vbx; + return(OK); + case BSIM4v6_MOD_VBM: + value->rValue = model->BSIM4v6vbm; + return(OK); + case BSIM4v6_MOD_XT: + value->rValue = model->BSIM4v6xt; + return(OK); + case BSIM4v6_MOD_K1: + value->rValue = model->BSIM4v6k1; + return(OK); + case BSIM4v6_MOD_KT1: + value->rValue = model->BSIM4v6kt1; + return(OK); + case BSIM4v6_MOD_KT1L: + value->rValue = model->BSIM4v6kt1l; + return(OK); + case BSIM4v6_MOD_KT2 : + value->rValue = model->BSIM4v6kt2; + return(OK); + case BSIM4v6_MOD_K2 : + value->rValue = model->BSIM4v6k2; + return(OK); + case BSIM4v6_MOD_K3: + value->rValue = model->BSIM4v6k3; + return(OK); + case BSIM4v6_MOD_K3B: + value->rValue = model->BSIM4v6k3b; + return(OK); + case BSIM4v6_MOD_W0: + value->rValue = model->BSIM4v6w0; + return(OK); + case BSIM4v6_MOD_LPE0: + value->rValue = model->BSIM4v6lpe0; + return(OK); + case BSIM4v6_MOD_LPEB: + value->rValue = model->BSIM4v6lpeb; + return(OK); + case BSIM4v6_MOD_DVTP0: + value->rValue = model->BSIM4v6dvtp0; + return(OK); + case BSIM4v6_MOD_DVTP1: + value->rValue = model->BSIM4v6dvtp1; + return(OK); + case BSIM4v6_MOD_DVT0 : + value->rValue = model->BSIM4v6dvt0; + return(OK); + case BSIM4v6_MOD_DVT1 : + value->rValue = model->BSIM4v6dvt1; + return(OK); + case BSIM4v6_MOD_DVT2 : + value->rValue = model->BSIM4v6dvt2; + return(OK); + case BSIM4v6_MOD_DVT0W : + value->rValue = model->BSIM4v6dvt0w; + return(OK); + case BSIM4v6_MOD_DVT1W : + value->rValue = model->BSIM4v6dvt1w; + return(OK); + case BSIM4v6_MOD_DVT2W : + value->rValue = model->BSIM4v6dvt2w; + return(OK); + case BSIM4v6_MOD_DROUT : + value->rValue = model->BSIM4v6drout; + return(OK); + case BSIM4v6_MOD_DSUB : + value->rValue = model->BSIM4v6dsub; + return(OK); + case BSIM4v6_MOD_VTH0: + value->rValue = model->BSIM4v6vth0; + return(OK); + case BSIM4v6_MOD_EU: + value->rValue = model->BSIM4v6eu; + return(OK); + case BSIM4v6_MOD_UCS: + value->rValue = model->BSIM4v6ucs; + return(OK); + case BSIM4v6_MOD_UA: + value->rValue = model->BSIM4v6ua; + return(OK); + case BSIM4v6_MOD_UA1: + value->rValue = model->BSIM4v6ua1; + return(OK); + case BSIM4v6_MOD_UB: + value->rValue = model->BSIM4v6ub; + return(OK); + case BSIM4v6_MOD_UB1: + value->rValue = model->BSIM4v6ub1; + return(OK); + case BSIM4v6_MOD_UC: + value->rValue = model->BSIM4v6uc; + return(OK); + case BSIM4v6_MOD_UC1: + value->rValue = model->BSIM4v6uc1; + return(OK); + case BSIM4v6_MOD_UD: + value->rValue = model->BSIM4v6ud; + return(OK); + case BSIM4v6_MOD_UD1: + value->rValue = model->BSIM4v6ud1; + return(OK); + case BSIM4v6_MOD_UP: + value->rValue = model->BSIM4v6up; + return(OK); + case BSIM4v6_MOD_LP: + value->rValue = model->BSIM4v6lp; + return(OK); + case BSIM4v6_MOD_U0: + value->rValue = model->BSIM4v6u0; + return(OK); + case BSIM4v6_MOD_UTE: + value->rValue = model->BSIM4v6ute; + return(OK); + case BSIM4v6_MOD_UCSTE: + value->rValue = model->BSIM4v6ucste; + return(OK); + case BSIM4v6_MOD_VOFF: + value->rValue = model->BSIM4v6voff; + return(OK); + case BSIM4v6_MOD_TVOFF: + value->rValue = model->BSIM4v6tvoff; + return(OK); + case BSIM4v6_MOD_VFBSDOFF: + value->rValue = model->BSIM4v6vfbsdoff; + return(OK); + case BSIM4v6_MOD_TVFBSDOFF: + value->rValue = model->BSIM4v6tvfbsdoff; + return(OK); + case BSIM4v6_MOD_VOFFL: + value->rValue = model->BSIM4v6voffl; + return(OK); + case BSIM4v6_MOD_VOFFCVL: + value->rValue = model->BSIM4v6voffcvl; + return(OK); + case BSIM4v6_MOD_MINV: + value->rValue = model->BSIM4v6minv; + return(OK); + case BSIM4v6_MOD_MINVCV: + value->rValue = model->BSIM4v6minvcv; + return(OK); + case BSIM4v6_MOD_FPROUT: + value->rValue = model->BSIM4v6fprout; + return(OK); + case BSIM4v6_MOD_PDITS: + value->rValue = model->BSIM4v6pdits; + return(OK); + case BSIM4v6_MOD_PDITSD: + value->rValue = model->BSIM4v6pditsd; + return(OK); + case BSIM4v6_MOD_PDITSL: + value->rValue = model->BSIM4v6pditsl; + return(OK); + case BSIM4v6_MOD_DELTA: + value->rValue = model->BSIM4v6delta; + return(OK); + case BSIM4v6_MOD_RDSW: + value->rValue = model->BSIM4v6rdsw; + return(OK); + case BSIM4v6_MOD_RDSWMIN: + value->rValue = model->BSIM4v6rdswmin; + return(OK); + case BSIM4v6_MOD_RDWMIN: + value->rValue = model->BSIM4v6rdwmin; + return(OK); + case BSIM4v6_MOD_RSWMIN: + value->rValue = model->BSIM4v6rswmin; + return(OK); + case BSIM4v6_MOD_RDW: + value->rValue = model->BSIM4v6rdw; + return(OK); + case BSIM4v6_MOD_RSW: + value->rValue = model->BSIM4v6rsw; + return(OK); + case BSIM4v6_MOD_PRWG: + value->rValue = model->BSIM4v6prwg; + return(OK); + case BSIM4v6_MOD_PRWB: + value->rValue = model->BSIM4v6prwb; + return(OK); + case BSIM4v6_MOD_PRT: + value->rValue = model->BSIM4v6prt; + return(OK); + case BSIM4v6_MOD_ETA0: + value->rValue = model->BSIM4v6eta0; + return(OK); + case BSIM4v6_MOD_ETAB: + value->rValue = model->BSIM4v6etab; + return(OK); + case BSIM4v6_MOD_PCLM: + value->rValue = model->BSIM4v6pclm; + return(OK); + case BSIM4v6_MOD_PDIBL1: + value->rValue = model->BSIM4v6pdibl1; + return(OK); + case BSIM4v6_MOD_PDIBL2: + value->rValue = model->BSIM4v6pdibl2; + return(OK); + case BSIM4v6_MOD_PDIBLB: + value->rValue = model->BSIM4v6pdiblb; + return(OK); + case BSIM4v6_MOD_PSCBE1: + value->rValue = model->BSIM4v6pscbe1; + return(OK); + case BSIM4v6_MOD_PSCBE2: + value->rValue = model->BSIM4v6pscbe2; + return(OK); + case BSIM4v6_MOD_PVAG: + value->rValue = model->BSIM4v6pvag; + return(OK); + case BSIM4v6_MOD_WR: + value->rValue = model->BSIM4v6wr; + return(OK); + case BSIM4v6_MOD_DWG: + value->rValue = model->BSIM4v6dwg; + return(OK); + case BSIM4v6_MOD_DWB: + value->rValue = model->BSIM4v6dwb; + return(OK); + case BSIM4v6_MOD_B0: + value->rValue = model->BSIM4v6b0; + return(OK); + case BSIM4v6_MOD_B1: + value->rValue = model->BSIM4v6b1; + return(OK); + case BSIM4v6_MOD_ALPHA0: + value->rValue = model->BSIM4v6alpha0; + return(OK); + case BSIM4v6_MOD_ALPHA1: + value->rValue = model->BSIM4v6alpha1; + return(OK); + case BSIM4v6_MOD_BETA0: + value->rValue = model->BSIM4v6beta0; + return(OK); + case BSIM4v6_MOD_AGIDL: + value->rValue = model->BSIM4v6agidl; + return(OK); + case BSIM4v6_MOD_BGIDL: + value->rValue = model->BSIM4v6bgidl; + return(OK); + case BSIM4v6_MOD_CGIDL: + value->rValue = model->BSIM4v6cgidl; + return(OK); + case BSIM4v6_MOD_EGIDL: + value->rValue = model->BSIM4v6egidl; + return(OK); + case BSIM4v6_MOD_AGISL: + value->rValue = model->BSIM4v6agisl; + return(OK); + case BSIM4v6_MOD_BGISL: + value->rValue = model->BSIM4v6bgisl; + return(OK); + case BSIM4v6_MOD_CGISL: + value->rValue = model->BSIM4v6cgisl; + return(OK); + case BSIM4v6_MOD_EGISL: + value->rValue = model->BSIM4v6egisl; + return(OK); + case BSIM4v6_MOD_AIGC: + value->rValue = model->BSIM4v6aigc; + return(OK); + case BSIM4v6_MOD_BIGC: + value->rValue = model->BSIM4v6bigc; + return(OK); + case BSIM4v6_MOD_CIGC: + value->rValue = model->BSIM4v6cigc; + return(OK); + case BSIM4v6_MOD_AIGSD: + value->rValue = model->BSIM4v6aigsd; + return(OK); + case BSIM4v6_MOD_BIGSD: + value->rValue = model->BSIM4v6bigsd; + return(OK); + case BSIM4v6_MOD_CIGSD: + value->rValue = model->BSIM4v6cigsd; + return(OK); + case BSIM4v6_MOD_AIGS: + value->rValue = model->BSIM4v6aigs; + return(OK); + case BSIM4v6_MOD_BIGS: + value->rValue = model->BSIM4v6bigs; + return(OK); + case BSIM4v6_MOD_CIGS: + value->rValue = model->BSIM4v6cigs; + return(OK); + case BSIM4v6_MOD_AIGD: + value->rValue = model->BSIM4v6aigd; + return(OK); + case BSIM4v6_MOD_BIGD: + value->rValue = model->BSIM4v6bigd; + return(OK); + case BSIM4v6_MOD_CIGD: + value->rValue = model->BSIM4v6cigd; + return(OK); + case BSIM4v6_MOD_AIGBACC: + value->rValue = model->BSIM4v6aigbacc; + return(OK); + case BSIM4v6_MOD_BIGBACC: + value->rValue = model->BSIM4v6bigbacc; + return(OK); + case BSIM4v6_MOD_CIGBACC: + value->rValue = model->BSIM4v6cigbacc; + return(OK); + case BSIM4v6_MOD_AIGBINV: + value->rValue = model->BSIM4v6aigbinv; + return(OK); + case BSIM4v6_MOD_BIGBINV: + value->rValue = model->BSIM4v6bigbinv; + return(OK); + case BSIM4v6_MOD_CIGBINV: + value->rValue = model->BSIM4v6cigbinv; + return(OK); + case BSIM4v6_MOD_NIGC: + value->rValue = model->BSIM4v6nigc; + return(OK); + case BSIM4v6_MOD_NIGBACC: + value->rValue = model->BSIM4v6nigbacc; + return(OK); + case BSIM4v6_MOD_NIGBINV: + value->rValue = model->BSIM4v6nigbinv; + return(OK); + case BSIM4v6_MOD_NTOX: + value->rValue = model->BSIM4v6ntox; + return(OK); + case BSIM4v6_MOD_EIGBINV: + value->rValue = model->BSIM4v6eigbinv; + return(OK); + case BSIM4v6_MOD_PIGCD: + value->rValue = model->BSIM4v6pigcd; + return(OK); + case BSIM4v6_MOD_POXEDGE: + value->rValue = model->BSIM4v6poxedge; + return(OK); + case BSIM4v6_MOD_PHIN: + value->rValue = model->BSIM4v6phin; + return(OK); + case BSIM4v6_MOD_XRCRG1: + value->rValue = model->BSIM4v6xrcrg1; + return(OK); + case BSIM4v6_MOD_XRCRG2: + value->rValue = model->BSIM4v6xrcrg2; + return(OK); + case BSIM4v6_MOD_TNOIA: + value->rValue = model->BSIM4v6tnoia; + return(OK); + case BSIM4v6_MOD_TNOIB: + value->rValue = model->BSIM4v6tnoib; + return(OK); + case BSIM4v6_MOD_RNOIA: + value->rValue = model->BSIM4v6rnoia; + return(OK); + case BSIM4v6_MOD_RNOIB: + value->rValue = model->BSIM4v6rnoib; + return(OK); + case BSIM4v6_MOD_NTNOI: + value->rValue = model->BSIM4v6ntnoi; + return(OK); + case BSIM4v6_MOD_IJTHDFWD: + value->rValue = model->BSIM4v6ijthdfwd; + return(OK); + case BSIM4v6_MOD_IJTHSFWD: + value->rValue = model->BSIM4v6ijthsfwd; + return(OK); + case BSIM4v6_MOD_IJTHDREV: + value->rValue = model->BSIM4v6ijthdrev; + return(OK); + case BSIM4v6_MOD_IJTHSREV: + value->rValue = model->BSIM4v6ijthsrev; + return(OK); + case BSIM4v6_MOD_XJBVD: + value->rValue = model->BSIM4v6xjbvd; + return(OK); + case BSIM4v6_MOD_XJBVS: + value->rValue = model->BSIM4v6xjbvs; + return(OK); + case BSIM4v6_MOD_BVD: + value->rValue = model->BSIM4v6bvd; + return(OK); + case BSIM4v6_MOD_BVS: + value->rValue = model->BSIM4v6bvs; + return(OK); + case BSIM4v6_MOD_VFB: + value->rValue = model->BSIM4v6vfb; + return(OK); + + case BSIM4v6_MOD_JTSS: + value->rValue = model->BSIM4v6jtss; + return(OK); + case BSIM4v6_MOD_JTSD: + value->rValue = model->BSIM4v6jtsd; + return(OK); + case BSIM4v6_MOD_JTSSWS: + value->rValue = model->BSIM4v6jtssws; + return(OK); + case BSIM4v6_MOD_JTSSWD: + value->rValue = model->BSIM4v6jtsswd; + return(OK); + case BSIM4v6_MOD_JTSSWGS: + value->rValue = model->BSIM4v6jtsswgs; + return(OK); + case BSIM4v6_MOD_JTSSWGD: + value->rValue = model->BSIM4v6jtsswgd; + return(OK); + case BSIM4v6_MOD_JTWEFF: + value->rValue = model->BSIM4v6jtweff; + return(OK); + case BSIM4v6_MOD_NJTS: + value->rValue = model->BSIM4v6njts; + return(OK); + case BSIM4v6_MOD_NJTSSW: + value->rValue = model->BSIM4v6njtssw; + return(OK); + case BSIM4v6_MOD_NJTSSWG: + value->rValue = model->BSIM4v6njtsswg; + return(OK); + case BSIM4v6_MOD_NJTSD: + value->rValue = model->BSIM4v6njtsd; + return(OK); + case BSIM4v6_MOD_NJTSSWD: + value->rValue = model->BSIM4v6njtsswd; + return(OK); + case BSIM4v6_MOD_NJTSSWGD: + value->rValue = model->BSIM4v6njtsswgd; + return(OK); + case BSIM4v6_MOD_XTSS: + value->rValue = model->BSIM4v6xtss; + return(OK); + case BSIM4v6_MOD_XTSD: + value->rValue = model->BSIM4v6xtsd; + return(OK); + case BSIM4v6_MOD_XTSSWS: + value->rValue = model->BSIM4v6xtssws; + return(OK); + case BSIM4v6_MOD_XTSSWD: + value->rValue = model->BSIM4v6xtsswd; + return(OK); + case BSIM4v6_MOD_XTSSWGS: + value->rValue = model->BSIM4v6xtsswgs; + return(OK); + case BSIM4v6_MOD_XTSSWGD: + value->rValue = model->BSIM4v6xtsswgd; + return(OK); + case BSIM4v6_MOD_TNJTS: + value->rValue = model->BSIM4v6tnjts; + return(OK); + case BSIM4v6_MOD_TNJTSSW: + value->rValue = model->BSIM4v6tnjtssw; + return(OK); + case BSIM4v6_MOD_TNJTSSWG: + value->rValue = model->BSIM4v6tnjtsswg; + return(OK); + case BSIM4v6_MOD_TNJTSD: + value->rValue = model->BSIM4v6tnjtsd; + return(OK); + case BSIM4v6_MOD_TNJTSSWD: + value->rValue = model->BSIM4v6tnjtsswd; + return(OK); + case BSIM4v6_MOD_TNJTSSWGD: + value->rValue = model->BSIM4v6tnjtsswgd; + return(OK); + case BSIM4v6_MOD_VTSS: + value->rValue = model->BSIM4v6vtss; + return(OK); + case BSIM4v6_MOD_VTSD: + value->rValue = model->BSIM4v6vtsd; + return(OK); + case BSIM4v6_MOD_VTSSWS: + value->rValue = model->BSIM4v6vtssws; + return(OK); + case BSIM4v6_MOD_VTSSWD: + value->rValue = model->BSIM4v6vtsswd; + return(OK); + case BSIM4v6_MOD_VTSSWGS: + value->rValue = model->BSIM4v6vtsswgs; + return(OK); + case BSIM4v6_MOD_VTSSWGD: + value->rValue = model->BSIM4v6vtsswgd; + return(OK); + + case BSIM4v6_MOD_GBMIN: + value->rValue = model->BSIM4v6gbmin; + return(OK); + case BSIM4v6_MOD_RBDB: + value->rValue = model->BSIM4v6rbdb; + return(OK); + case BSIM4v6_MOD_RBPB: + value->rValue = model->BSIM4v6rbpb; + return(OK); + case BSIM4v6_MOD_RBSB: + value->rValue = model->BSIM4v6rbsb; + return(OK); + case BSIM4v6_MOD_RBPS: + value->rValue = model->BSIM4v6rbps; + return(OK); + case BSIM4v6_MOD_RBPD: + value->rValue = model->BSIM4v6rbpd; + return(OK); + + case BSIM4v6_MOD_RBPS0: + value->rValue = model->BSIM4v6rbps0; + return(OK); + case BSIM4v6_MOD_RBPSL: + value->rValue = model->BSIM4v6rbpsl; + return(OK); + case BSIM4v6_MOD_RBPSW: + value->rValue = model->BSIM4v6rbpsw; + return(OK); + case BSIM4v6_MOD_RBPSNF: + value->rValue = model->BSIM4v6rbpsnf; + return(OK); + case BSIM4v6_MOD_RBPD0: + value->rValue = model->BSIM4v6rbpd0; + return(OK); + case BSIM4v6_MOD_RBPDL: + value->rValue = model->BSIM4v6rbpdl; + return(OK); + case BSIM4v6_MOD_RBPDW: + value->rValue = model->BSIM4v6rbpdw; + return(OK); + case BSIM4v6_MOD_RBPDNF: + value->rValue = model->BSIM4v6rbpdnf; + return(OK); + case BSIM4v6_MOD_RBPBX0: + value->rValue = model->BSIM4v6rbpbx0; + return(OK); + case BSIM4v6_MOD_RBPBXL: + value->rValue = model->BSIM4v6rbpbxl; + return(OK); + case BSIM4v6_MOD_RBPBXW: + value->rValue = model->BSIM4v6rbpbxw; + return(OK); + case BSIM4v6_MOD_RBPBXNF: + value->rValue = model->BSIM4v6rbpbxnf; + return(OK); + case BSIM4v6_MOD_RBPBY0: + value->rValue = model->BSIM4v6rbpby0; + return(OK); + case BSIM4v6_MOD_RBPBYL: + value->rValue = model->BSIM4v6rbpbyl; + return(OK); + case BSIM4v6_MOD_RBPBYW: + value->rValue = model->BSIM4v6rbpbyw; + return(OK); + case BSIM4v6_MOD_RBPBYNF: + value->rValue = model->BSIM4v6rbpbynf; + return(OK); + + case BSIM4v6_MOD_RBSBX0: + value->rValue = model->BSIM4v6rbsbx0; + return(OK); + case BSIM4v6_MOD_RBSBY0: + value->rValue = model->BSIM4v6rbsby0; + return(OK); + case BSIM4v6_MOD_RBDBX0: + value->rValue = model->BSIM4v6rbdbx0; + return(OK); + case BSIM4v6_MOD_RBDBY0: + value->rValue = model->BSIM4v6rbdby0; + return(OK); + case BSIM4v6_MOD_RBSDBXL: + value->rValue = model->BSIM4v6rbsdbxl; + return(OK); + case BSIM4v6_MOD_RBSDBXW: + value->rValue = model->BSIM4v6rbsdbxw; + return(OK); + case BSIM4v6_MOD_RBSDBXNF: + value->rValue = model->BSIM4v6rbsdbxnf; + return(OK); + case BSIM4v6_MOD_RBSDBYL: + value->rValue = model->BSIM4v6rbsdbyl; + return(OK); + case BSIM4v6_MOD_RBSDBYW: + value->rValue = model->BSIM4v6rbsdbyw; + return(OK); + case BSIM4v6_MOD_RBSDBYNF: + value->rValue = model->BSIM4v6rbsdbynf; + return(OK); + + + case BSIM4v6_MOD_CGSL: + value->rValue = model->BSIM4v6cgsl; + return(OK); + case BSIM4v6_MOD_CGDL: + value->rValue = model->BSIM4v6cgdl; + return(OK); + case BSIM4v6_MOD_CKAPPAS: + value->rValue = model->BSIM4v6ckappas; + return(OK); + case BSIM4v6_MOD_CKAPPAD: + value->rValue = model->BSIM4v6ckappad; + return(OK); + case BSIM4v6_MOD_CF: + value->rValue = model->BSIM4v6cf; + return(OK); + case BSIM4v6_MOD_CLC: + value->rValue = model->BSIM4v6clc; + return(OK); + case BSIM4v6_MOD_CLE: + value->rValue = model->BSIM4v6cle; + return(OK); + case BSIM4v6_MOD_DWC: + value->rValue = model->BSIM4v6dwc; + return(OK); + case BSIM4v6_MOD_DLC: + value->rValue = model->BSIM4v6dlc; + return(OK); + case BSIM4v6_MOD_XW: + value->rValue = model->BSIM4v6xw; + return(OK); + case BSIM4v6_MOD_XL: + value->rValue = model->BSIM4v6xl; + return(OK); + case BSIM4v6_MOD_DLCIG: + value->rValue = model->BSIM4v6dlcig; + return(OK); + case BSIM4v6_MOD_DLCIGD: + value->rValue = model->BSIM4v6dlcigd; + return(OK); + case BSIM4v6_MOD_DWJ: + value->rValue = model->BSIM4v6dwj; + return(OK); + case BSIM4v6_MOD_VFBCV: + value->rValue = model->BSIM4v6vfbcv; + return(OK); + case BSIM4v6_MOD_ACDE: + value->rValue = model->BSIM4v6acde; + return(OK); + case BSIM4v6_MOD_MOIN: + value->rValue = model->BSIM4v6moin; + return(OK); + case BSIM4v6_MOD_NOFF: + value->rValue = model->BSIM4v6noff; + return(OK); + case BSIM4v6_MOD_VOFFCV: + value->rValue = model->BSIM4v6voffcv; + return(OK); + case BSIM4v6_MOD_DMCG: + value->rValue = model->BSIM4v6dmcg; + return(OK); + case BSIM4v6_MOD_DMCI: + value->rValue = model->BSIM4v6dmci; + return(OK); + case BSIM4v6_MOD_DMDG: + value->rValue = model->BSIM4v6dmdg; + return(OK); + case BSIM4v6_MOD_DMCGT: + value->rValue = model->BSIM4v6dmcgt; + return(OK); + case BSIM4v6_MOD_XGW: + value->rValue = model->BSIM4v6xgw; + return(OK); + case BSIM4v6_MOD_XGL: + value->rValue = model->BSIM4v6xgl; + return(OK); + case BSIM4v6_MOD_RSHG: + value->rValue = model->BSIM4v6rshg; + return(OK); + case BSIM4v6_MOD_TCJ: + value->rValue = model->BSIM4v6tcj; + return(OK); + case BSIM4v6_MOD_TPB: + value->rValue = model->BSIM4v6tpb; + return(OK); + case BSIM4v6_MOD_TCJSW: + value->rValue = model->BSIM4v6tcjsw; + return(OK); + case BSIM4v6_MOD_TPBSW: + value->rValue = model->BSIM4v6tpbsw; + return(OK); + case BSIM4v6_MOD_TCJSWG: + value->rValue = model->BSIM4v6tcjswg; + return(OK); + case BSIM4v6_MOD_TPBSWG: + value->rValue = model->BSIM4v6tpbswg; + return(OK); + + /* Length dependence */ + case BSIM4v6_MOD_LCDSC : + value->rValue = model->BSIM4v6lcdsc; + return(OK); + case BSIM4v6_MOD_LCDSCB : + value->rValue = model->BSIM4v6lcdscb; + return(OK); + case BSIM4v6_MOD_LCDSCD : + value->rValue = model->BSIM4v6lcdscd; + return(OK); + case BSIM4v6_MOD_LCIT : + value->rValue = model->BSIM4v6lcit; + return(OK); + case BSIM4v6_MOD_LNFACTOR : + value->rValue = model->BSIM4v6lnfactor; + return(OK); + case BSIM4v6_MOD_LXJ: + value->rValue = model->BSIM4v6lxj; + return(OK); + case BSIM4v6_MOD_LVSAT: + value->rValue = model->BSIM4v6lvsat; + return(OK); + case BSIM4v6_MOD_LAT: + value->rValue = model->BSIM4v6lat; + return(OK); + case BSIM4v6_MOD_LA0: + value->rValue = model->BSIM4v6la0; + return(OK); + case BSIM4v6_MOD_LAGS: + value->rValue = model->BSIM4v6lags; + return(OK); + case BSIM4v6_MOD_LA1: + value->rValue = model->BSIM4v6la1; + return(OK); + case BSIM4v6_MOD_LA2: + value->rValue = model->BSIM4v6la2; + return(OK); + case BSIM4v6_MOD_LKETA: + value->rValue = model->BSIM4v6lketa; + return(OK); + case BSIM4v6_MOD_LNSUB: + value->rValue = model->BSIM4v6lnsub; + return(OK); + case BSIM4v6_MOD_LNDEP: + value->rValue = model->BSIM4v6lndep; + return(OK); + case BSIM4v6_MOD_LNSD: + value->rValue = model->BSIM4v6lnsd; + return(OK); + case BSIM4v6_MOD_LNGATE: + value->rValue = model->BSIM4v6lngate; + return(OK); + case BSIM4v6_MOD_LGAMMA1: + value->rValue = model->BSIM4v6lgamma1; + return(OK); + case BSIM4v6_MOD_LGAMMA2: + value->rValue = model->BSIM4v6lgamma2; + return(OK); + case BSIM4v6_MOD_LVBX: + value->rValue = model->BSIM4v6lvbx; + return(OK); + case BSIM4v6_MOD_LVBM: + value->rValue = model->BSIM4v6lvbm; + return(OK); + case BSIM4v6_MOD_LXT: + value->rValue = model->BSIM4v6lxt; + return(OK); + case BSIM4v6_MOD_LK1: + value->rValue = model->BSIM4v6lk1; + return(OK); + case BSIM4v6_MOD_LKT1: + value->rValue = model->BSIM4v6lkt1; + return(OK); + case BSIM4v6_MOD_LKT1L: + value->rValue = model->BSIM4v6lkt1l; + return(OK); + case BSIM4v6_MOD_LKT2 : + value->rValue = model->BSIM4v6lkt2; + return(OK); + case BSIM4v6_MOD_LK2 : + value->rValue = model->BSIM4v6lk2; + return(OK); + case BSIM4v6_MOD_LK3: + value->rValue = model->BSIM4v6lk3; + return(OK); + case BSIM4v6_MOD_LK3B: + value->rValue = model->BSIM4v6lk3b; + return(OK); + case BSIM4v6_MOD_LW0: + value->rValue = model->BSIM4v6lw0; + return(OK); + case BSIM4v6_MOD_LLPE0: + value->rValue = model->BSIM4v6llpe0; + return(OK); + case BSIM4v6_MOD_LLPEB: + value->rValue = model->BSIM4v6llpeb; + return(OK); + case BSIM4v6_MOD_LDVTP0: + value->rValue = model->BSIM4v6ldvtp0; + return(OK); + case BSIM4v6_MOD_LDVTP1: + value->rValue = model->BSIM4v6ldvtp1; + return(OK); + case BSIM4v6_MOD_LDVT0: + value->rValue = model->BSIM4v6ldvt0; + return(OK); + case BSIM4v6_MOD_LDVT1 : + value->rValue = model->BSIM4v6ldvt1; + return(OK); + case BSIM4v6_MOD_LDVT2 : + value->rValue = model->BSIM4v6ldvt2; + return(OK); + case BSIM4v6_MOD_LDVT0W : + value->rValue = model->BSIM4v6ldvt0w; + return(OK); + case BSIM4v6_MOD_LDVT1W : + value->rValue = model->BSIM4v6ldvt1w; + return(OK); + case BSIM4v6_MOD_LDVT2W : + value->rValue = model->BSIM4v6ldvt2w; + return(OK); + case BSIM4v6_MOD_LDROUT : + value->rValue = model->BSIM4v6ldrout; + return(OK); + case BSIM4v6_MOD_LDSUB : + value->rValue = model->BSIM4v6ldsub; + return(OK); + case BSIM4v6_MOD_LVTH0: + value->rValue = model->BSIM4v6lvth0; + return(OK); + case BSIM4v6_MOD_LUA: + value->rValue = model->BSIM4v6lua; + return(OK); + case BSIM4v6_MOD_LUA1: + value->rValue = model->BSIM4v6lua1; + return(OK); + case BSIM4v6_MOD_LUB: + value->rValue = model->BSIM4v6lub; + return(OK); + case BSIM4v6_MOD_LUB1: + value->rValue = model->BSIM4v6lub1; + return(OK); + case BSIM4v6_MOD_LUC: + value->rValue = model->BSIM4v6luc; + return(OK); + case BSIM4v6_MOD_LUC1: + value->rValue = model->BSIM4v6luc1; + return(OK); + case BSIM4v6_MOD_LUD: + value->rValue = model->BSIM4v6lud; + return(OK); + case BSIM4v6_MOD_LUD1: + value->rValue = model->BSIM4v6lud1; + return(OK); + case BSIM4v6_MOD_LUP: + value->rValue = model->BSIM4v6lup; + return(OK); + case BSIM4v6_MOD_LLP: + value->rValue = model->BSIM4v6llp; + return(OK); + case BSIM4v6_MOD_LU0: + value->rValue = model->BSIM4v6lu0; + return(OK); + case BSIM4v6_MOD_LUTE: + value->rValue = model->BSIM4v6lute; + return(OK); + case BSIM4v6_MOD_LUCSTE: + value->rValue = model->BSIM4v6lucste; + return(OK); + case BSIM4v6_MOD_LVOFF: + value->rValue = model->BSIM4v6lvoff; + return(OK); + case BSIM4v6_MOD_LTVOFF: + value->rValue = model->BSIM4v6ltvoff; + return(OK); + case BSIM4v6_MOD_LMINV: + value->rValue = model->BSIM4v6lminv; + return(OK); + case BSIM4v6_MOD_LMINVCV: + value->rValue = model->BSIM4v6lminvcv; + return(OK); + case BSIM4v6_MOD_LFPROUT: + value->rValue = model->BSIM4v6lfprout; + return(OK); + case BSIM4v6_MOD_LPDITS: + value->rValue = model->BSIM4v6lpdits; + return(OK); + case BSIM4v6_MOD_LPDITSD: + value->rValue = model->BSIM4v6lpditsd; + return(OK); + case BSIM4v6_MOD_LDELTA: + value->rValue = model->BSIM4v6ldelta; + return(OK); + case BSIM4v6_MOD_LRDSW: + value->rValue = model->BSIM4v6lrdsw; + return(OK); + case BSIM4v6_MOD_LRDW: + value->rValue = model->BSIM4v6lrdw; + return(OK); + case BSIM4v6_MOD_LRSW: + value->rValue = model->BSIM4v6lrsw; + return(OK); + case BSIM4v6_MOD_LPRWB: + value->rValue = model->BSIM4v6lprwb; + return(OK); + case BSIM4v6_MOD_LPRWG: + value->rValue = model->BSIM4v6lprwg; + return(OK); + case BSIM4v6_MOD_LPRT: + value->rValue = model->BSIM4v6lprt; + return(OK); + case BSIM4v6_MOD_LETA0: + value->rValue = model->BSIM4v6leta0; + return(OK); + case BSIM4v6_MOD_LETAB: + value->rValue = model->BSIM4v6letab; + return(OK); + case BSIM4v6_MOD_LPCLM: + value->rValue = model->BSIM4v6lpclm; + return(OK); + case BSIM4v6_MOD_LPDIBL1: + value->rValue = model->BSIM4v6lpdibl1; + return(OK); + case BSIM4v6_MOD_LPDIBL2: + value->rValue = model->BSIM4v6lpdibl2; + return(OK); + case BSIM4v6_MOD_LPDIBLB: + value->rValue = model->BSIM4v6lpdiblb; + return(OK); + case BSIM4v6_MOD_LPSCBE1: + value->rValue = model->BSIM4v6lpscbe1; + return(OK); + case BSIM4v6_MOD_LPSCBE2: + value->rValue = model->BSIM4v6lpscbe2; + return(OK); + case BSIM4v6_MOD_LPVAG: + value->rValue = model->BSIM4v6lpvag; + return(OK); + case BSIM4v6_MOD_LWR: + value->rValue = model->BSIM4v6lwr; + return(OK); + case BSIM4v6_MOD_LDWG: + value->rValue = model->BSIM4v6ldwg; + return(OK); + case BSIM4v6_MOD_LDWB: + value->rValue = model->BSIM4v6ldwb; + return(OK); + case BSIM4v6_MOD_LB0: + value->rValue = model->BSIM4v6lb0; + return(OK); + case BSIM4v6_MOD_LB1: + value->rValue = model->BSIM4v6lb1; + return(OK); + case BSIM4v6_MOD_LALPHA0: + value->rValue = model->BSIM4v6lalpha0; + return(OK); + case BSIM4v6_MOD_LALPHA1: + value->rValue = model->BSIM4v6lalpha1; + return(OK); + case BSIM4v6_MOD_LBETA0: + value->rValue = model->BSIM4v6lbeta0; + return(OK); + case BSIM4v6_MOD_LAGIDL: + value->rValue = model->BSIM4v6lagidl; + return(OK); + case BSIM4v6_MOD_LBGIDL: + value->rValue = model->BSIM4v6lbgidl; + return(OK); + case BSIM4v6_MOD_LCGIDL: + value->rValue = model->BSIM4v6lcgidl; + return(OK); + case BSIM4v6_MOD_LEGIDL: + value->rValue = model->BSIM4v6legidl; + return(OK); + case BSIM4v6_MOD_LAGISL: + value->rValue = model->BSIM4v6lagisl; + return(OK); + case BSIM4v6_MOD_LBGISL: + value->rValue = model->BSIM4v6lbgisl; + return(OK); + case BSIM4v6_MOD_LCGISL: + value->rValue = model->BSIM4v6lcgisl; + return(OK); + case BSIM4v6_MOD_LEGISL: + value->rValue = model->BSIM4v6legisl; + return(OK); + case BSIM4v6_MOD_LAIGC: + value->rValue = model->BSIM4v6laigc; + return(OK); + case BSIM4v6_MOD_LBIGC: + value->rValue = model->BSIM4v6lbigc; + return(OK); + case BSIM4v6_MOD_LCIGC: + value->rValue = model->BSIM4v6lcigc; + return(OK); + case BSIM4v6_MOD_LAIGSD: + value->rValue = model->BSIM4v6laigsd; + return(OK); + case BSIM4v6_MOD_LBIGSD: + value->rValue = model->BSIM4v6lbigsd; + return(OK); + case BSIM4v6_MOD_LCIGSD: + value->rValue = model->BSIM4v6lcigsd; + return(OK); + case BSIM4v6_MOD_LAIGS: + value->rValue = model->BSIM4v6laigs; + return(OK); + case BSIM4v6_MOD_LBIGS: + value->rValue = model->BSIM4v6lbigs; + return(OK); + case BSIM4v6_MOD_LCIGS: + value->rValue = model->BSIM4v6lcigs; + return(OK); + case BSIM4v6_MOD_LAIGD: + value->rValue = model->BSIM4v6laigd; + return(OK); + case BSIM4v6_MOD_LBIGD: + value->rValue = model->BSIM4v6lbigd; + return(OK); + case BSIM4v6_MOD_LCIGD: + value->rValue = model->BSIM4v6lcigd; + return(OK); + case BSIM4v6_MOD_LAIGBACC: + value->rValue = model->BSIM4v6laigbacc; + return(OK); + case BSIM4v6_MOD_LBIGBACC: + value->rValue = model->BSIM4v6lbigbacc; + return(OK); + case BSIM4v6_MOD_LCIGBACC: + value->rValue = model->BSIM4v6lcigbacc; + return(OK); + case BSIM4v6_MOD_LAIGBINV: + value->rValue = model->BSIM4v6laigbinv; + return(OK); + case BSIM4v6_MOD_LBIGBINV: + value->rValue = model->BSIM4v6lbigbinv; + return(OK); + case BSIM4v6_MOD_LCIGBINV: + value->rValue = model->BSIM4v6lcigbinv; + return(OK); + case BSIM4v6_MOD_LNIGC: + value->rValue = model->BSIM4v6lnigc; + return(OK); + case BSIM4v6_MOD_LNIGBACC: + value->rValue = model->BSIM4v6lnigbacc; + return(OK); + case BSIM4v6_MOD_LNIGBINV: + value->rValue = model->BSIM4v6lnigbinv; + return(OK); + case BSIM4v6_MOD_LNTOX: + value->rValue = model->BSIM4v6lntox; + return(OK); + case BSIM4v6_MOD_LEIGBINV: + value->rValue = model->BSIM4v6leigbinv; + return(OK); + case BSIM4v6_MOD_LPIGCD: + value->rValue = model->BSIM4v6lpigcd; + return(OK); + case BSIM4v6_MOD_LPOXEDGE: + value->rValue = model->BSIM4v6lpoxedge; + return(OK); + case BSIM4v6_MOD_LPHIN: + value->rValue = model->BSIM4v6lphin; + return(OK); + case BSIM4v6_MOD_LXRCRG1: + value->rValue = model->BSIM4v6lxrcrg1; + return(OK); + case BSIM4v6_MOD_LXRCRG2: + value->rValue = model->BSIM4v6lxrcrg2; + return(OK); + case BSIM4v6_MOD_LEU: + value->rValue = model->BSIM4v6leu; + return(OK); + case BSIM4v6_MOD_LUCS: + value->rValue = model->BSIM4v6lucs; + return(OK); + case BSIM4v6_MOD_LVFB: + value->rValue = model->BSIM4v6lvfb; + return(OK); + + case BSIM4v6_MOD_LCGSL: + value->rValue = model->BSIM4v6lcgsl; + return(OK); + case BSIM4v6_MOD_LCGDL: + value->rValue = model->BSIM4v6lcgdl; + return(OK); + case BSIM4v6_MOD_LCKAPPAS: + value->rValue = model->BSIM4v6lckappas; + return(OK); + case BSIM4v6_MOD_LCKAPPAD: + value->rValue = model->BSIM4v6lckappad; + return(OK); + case BSIM4v6_MOD_LCF: + value->rValue = model->BSIM4v6lcf; + return(OK); + case BSIM4v6_MOD_LCLC: + value->rValue = model->BSIM4v6lclc; + return(OK); + case BSIM4v6_MOD_LCLE: + value->rValue = model->BSIM4v6lcle; + return(OK); + case BSIM4v6_MOD_LVFBCV: + value->rValue = model->BSIM4v6lvfbcv; + return(OK); + case BSIM4v6_MOD_LACDE: + value->rValue = model->BSIM4v6lacde; + return(OK); + case BSIM4v6_MOD_LMOIN: + value->rValue = model->BSIM4v6lmoin; + return(OK); + case BSIM4v6_MOD_LNOFF: + value->rValue = model->BSIM4v6lnoff; + return(OK); + case BSIM4v6_MOD_LVOFFCV: + value->rValue = model->BSIM4v6lvoffcv; + return(OK); + case BSIM4v6_MOD_LVFBSDOFF: + value->rValue = model->BSIM4v6lvfbsdoff; + return(OK); + case BSIM4v6_MOD_LTVFBSDOFF: + value->rValue = model->BSIM4v6ltvfbsdoff; + return(OK); + + /* Width dependence */ + case BSIM4v6_MOD_WCDSC : + value->rValue = model->BSIM4v6wcdsc; + return(OK); + case BSIM4v6_MOD_WCDSCB : + value->rValue = model->BSIM4v6wcdscb; + return(OK); + case BSIM4v6_MOD_WCDSCD : + value->rValue = model->BSIM4v6wcdscd; + return(OK); + case BSIM4v6_MOD_WCIT : + value->rValue = model->BSIM4v6wcit; + return(OK); + case BSIM4v6_MOD_WNFACTOR : + value->rValue = model->BSIM4v6wnfactor; + return(OK); + case BSIM4v6_MOD_WXJ: + value->rValue = model->BSIM4v6wxj; + return(OK); + case BSIM4v6_MOD_WVSAT: + value->rValue = model->BSIM4v6wvsat; + return(OK); + case BSIM4v6_MOD_WAT: + value->rValue = model->BSIM4v6wat; + return(OK); + case BSIM4v6_MOD_WA0: + value->rValue = model->BSIM4v6wa0; + return(OK); + case BSIM4v6_MOD_WAGS: + value->rValue = model->BSIM4v6wags; + return(OK); + case BSIM4v6_MOD_WA1: + value->rValue = model->BSIM4v6wa1; + return(OK); + case BSIM4v6_MOD_WA2: + value->rValue = model->BSIM4v6wa2; + return(OK); + case BSIM4v6_MOD_WKETA: + value->rValue = model->BSIM4v6wketa; + return(OK); + case BSIM4v6_MOD_WNSUB: + value->rValue = model->BSIM4v6wnsub; + return(OK); + case BSIM4v6_MOD_WNDEP: + value->rValue = model->BSIM4v6wndep; + return(OK); + case BSIM4v6_MOD_WNSD: + value->rValue = model->BSIM4v6wnsd; + return(OK); + case BSIM4v6_MOD_WNGATE: + value->rValue = model->BSIM4v6wngate; + return(OK); + case BSIM4v6_MOD_WGAMMA1: + value->rValue = model->BSIM4v6wgamma1; + return(OK); + case BSIM4v6_MOD_WGAMMA2: + value->rValue = model->BSIM4v6wgamma2; + return(OK); + case BSIM4v6_MOD_WVBX: + value->rValue = model->BSIM4v6wvbx; + return(OK); + case BSIM4v6_MOD_WVBM: + value->rValue = model->BSIM4v6wvbm; + return(OK); + case BSIM4v6_MOD_WXT: + value->rValue = model->BSIM4v6wxt; + return(OK); + case BSIM4v6_MOD_WK1: + value->rValue = model->BSIM4v6wk1; + return(OK); + case BSIM4v6_MOD_WKT1: + value->rValue = model->BSIM4v6wkt1; + return(OK); + case BSIM4v6_MOD_WKT1L: + value->rValue = model->BSIM4v6wkt1l; + return(OK); + case BSIM4v6_MOD_WKT2 : + value->rValue = model->BSIM4v6wkt2; + return(OK); + case BSIM4v6_MOD_WK2 : + value->rValue = model->BSIM4v6wk2; + return(OK); + case BSIM4v6_MOD_WK3: + value->rValue = model->BSIM4v6wk3; + return(OK); + case BSIM4v6_MOD_WK3B: + value->rValue = model->BSIM4v6wk3b; + return(OK); + case BSIM4v6_MOD_WW0: + value->rValue = model->BSIM4v6ww0; + return(OK); + case BSIM4v6_MOD_WLPE0: + value->rValue = model->BSIM4v6wlpe0; + return(OK); + case BSIM4v6_MOD_WDVTP0: + value->rValue = model->BSIM4v6wdvtp0; + return(OK); + case BSIM4v6_MOD_WDVTP1: + value->rValue = model->BSIM4v6wdvtp1; + return(OK); + case BSIM4v6_MOD_WLPEB: + value->rValue = model->BSIM4v6wlpeb; + return(OK); + case BSIM4v6_MOD_WDVT0: + value->rValue = model->BSIM4v6wdvt0; + return(OK); + case BSIM4v6_MOD_WDVT1 : + value->rValue = model->BSIM4v6wdvt1; + return(OK); + case BSIM4v6_MOD_WDVT2 : + value->rValue = model->BSIM4v6wdvt2; + return(OK); + case BSIM4v6_MOD_WDVT0W : + value->rValue = model->BSIM4v6wdvt0w; + return(OK); + case BSIM4v6_MOD_WDVT1W : + value->rValue = model->BSIM4v6wdvt1w; + return(OK); + case BSIM4v6_MOD_WDVT2W : + value->rValue = model->BSIM4v6wdvt2w; + return(OK); + case BSIM4v6_MOD_WDROUT : + value->rValue = model->BSIM4v6wdrout; + return(OK); + case BSIM4v6_MOD_WDSUB : + value->rValue = model->BSIM4v6wdsub; + return(OK); + case BSIM4v6_MOD_WVTH0: + value->rValue = model->BSIM4v6wvth0; + return(OK); + case BSIM4v6_MOD_WUA: + value->rValue = model->BSIM4v6wua; + return(OK); + case BSIM4v6_MOD_WUA1: + value->rValue = model->BSIM4v6wua1; + return(OK); + case BSIM4v6_MOD_WUB: + value->rValue = model->BSIM4v6wub; + return(OK); + case BSIM4v6_MOD_WUB1: + value->rValue = model->BSIM4v6wub1; + return(OK); + case BSIM4v6_MOD_WUC: + value->rValue = model->BSIM4v6wuc; + return(OK); + case BSIM4v6_MOD_WUC1: + value->rValue = model->BSIM4v6wuc1; + return(OK); + case BSIM4v6_MOD_WUD: + value->rValue = model->BSIM4v6wud; + return(OK); + case BSIM4v6_MOD_WUD1: + value->rValue = model->BSIM4v6wud1; + return(OK); + case BSIM4v6_MOD_WUP: + value->rValue = model->BSIM4v6wup; + return(OK); + case BSIM4v6_MOD_WLP: + value->rValue = model->BSIM4v6wlp; + return(OK); + case BSIM4v6_MOD_WU0: + value->rValue = model->BSIM4v6wu0; + return(OK); + case BSIM4v6_MOD_WUTE: + value->rValue = model->BSIM4v6wute; + return(OK); + case BSIM4v6_MOD_WUCSTE: + value->rValue = model->BSIM4v6wucste; + return(OK); + case BSIM4v6_MOD_WVOFF: + value->rValue = model->BSIM4v6wvoff; + return(OK); + case BSIM4v6_MOD_WTVOFF: + value->rValue = model->BSIM4v6wtvoff; + return(OK); + case BSIM4v6_MOD_WMINV: + value->rValue = model->BSIM4v6wminv; + return(OK); + case BSIM4v6_MOD_WMINVCV: + value->rValue = model->BSIM4v6wminvcv; + return(OK); + case BSIM4v6_MOD_WFPROUT: + value->rValue = model->BSIM4v6wfprout; + return(OK); + case BSIM4v6_MOD_WPDITS: + value->rValue = model->BSIM4v6wpdits; + return(OK); + case BSIM4v6_MOD_WPDITSD: + value->rValue = model->BSIM4v6wpditsd; + return(OK); + case BSIM4v6_MOD_WDELTA: + value->rValue = model->BSIM4v6wdelta; + return(OK); + case BSIM4v6_MOD_WRDSW: + value->rValue = model->BSIM4v6wrdsw; + return(OK); + case BSIM4v6_MOD_WRDW: + value->rValue = model->BSIM4v6wrdw; + return(OK); + case BSIM4v6_MOD_WRSW: + value->rValue = model->BSIM4v6wrsw; + return(OK); + case BSIM4v6_MOD_WPRWB: + value->rValue = model->BSIM4v6wprwb; + return(OK); + case BSIM4v6_MOD_WPRWG: + value->rValue = model->BSIM4v6wprwg; + return(OK); + case BSIM4v6_MOD_WPRT: + value->rValue = model->BSIM4v6wprt; + return(OK); + case BSIM4v6_MOD_WETA0: + value->rValue = model->BSIM4v6weta0; + return(OK); + case BSIM4v6_MOD_WETAB: + value->rValue = model->BSIM4v6wetab; + return(OK); + case BSIM4v6_MOD_WPCLM: + value->rValue = model->BSIM4v6wpclm; + return(OK); + case BSIM4v6_MOD_WPDIBL1: + value->rValue = model->BSIM4v6wpdibl1; + return(OK); + case BSIM4v6_MOD_WPDIBL2: + value->rValue = model->BSIM4v6wpdibl2; + return(OK); + case BSIM4v6_MOD_WPDIBLB: + value->rValue = model->BSIM4v6wpdiblb; + return(OK); + case BSIM4v6_MOD_WPSCBE1: + value->rValue = model->BSIM4v6wpscbe1; + return(OK); + case BSIM4v6_MOD_WPSCBE2: + value->rValue = model->BSIM4v6wpscbe2; + return(OK); + case BSIM4v6_MOD_WPVAG: + value->rValue = model->BSIM4v6wpvag; + return(OK); + case BSIM4v6_MOD_WWR: + value->rValue = model->BSIM4v6wwr; + return(OK); + case BSIM4v6_MOD_WDWG: + value->rValue = model->BSIM4v6wdwg; + return(OK); + case BSIM4v6_MOD_WDWB: + value->rValue = model->BSIM4v6wdwb; + return(OK); + case BSIM4v6_MOD_WB0: + value->rValue = model->BSIM4v6wb0; + return(OK); + case BSIM4v6_MOD_WB1: + value->rValue = model->BSIM4v6wb1; + return(OK); + case BSIM4v6_MOD_WALPHA0: + value->rValue = model->BSIM4v6walpha0; + return(OK); + case BSIM4v6_MOD_WALPHA1: + value->rValue = model->BSIM4v6walpha1; + return(OK); + case BSIM4v6_MOD_WBETA0: + value->rValue = model->BSIM4v6wbeta0; + return(OK); + case BSIM4v6_MOD_WAGIDL: + value->rValue = model->BSIM4v6wagidl; + return(OK); + case BSIM4v6_MOD_WBGIDL: + value->rValue = model->BSIM4v6wbgidl; + return(OK); + case BSIM4v6_MOD_WCGIDL: + value->rValue = model->BSIM4v6wcgidl; + return(OK); + case BSIM4v6_MOD_WEGIDL: + value->rValue = model->BSIM4v6wegidl; + return(OK); + case BSIM4v6_MOD_WAGISL: + value->rValue = model->BSIM4v6wagisl; + return(OK); + case BSIM4v6_MOD_WBGISL: + value->rValue = model->BSIM4v6wbgisl; + return(OK); + case BSIM4v6_MOD_WCGISL: + value->rValue = model->BSIM4v6wcgisl; + return(OK); + case BSIM4v6_MOD_WEGISL: + value->rValue = model->BSIM4v6wegisl; + return(OK); + case BSIM4v6_MOD_WAIGC: + value->rValue = model->BSIM4v6waigc; + return(OK); + case BSIM4v6_MOD_WBIGC: + value->rValue = model->BSIM4v6wbigc; + return(OK); + case BSIM4v6_MOD_WCIGC: + value->rValue = model->BSIM4v6wcigc; + return(OK); + case BSIM4v6_MOD_WAIGSD: + value->rValue = model->BSIM4v6waigsd; + return(OK); + case BSIM4v6_MOD_WBIGSD: + value->rValue = model->BSIM4v6wbigsd; + return(OK); + case BSIM4v6_MOD_WCIGSD: + value->rValue = model->BSIM4v6wcigsd; + return(OK); + case BSIM4v6_MOD_WAIGS: + value->rValue = model->BSIM4v6waigs; + return(OK); + case BSIM4v6_MOD_WBIGS: + value->rValue = model->BSIM4v6wbigs; + return(OK); + case BSIM4v6_MOD_WCIGS: + value->rValue = model->BSIM4v6wcigs; + return(OK); + case BSIM4v6_MOD_WAIGD: + value->rValue = model->BSIM4v6waigd; + return(OK); + case BSIM4v6_MOD_WBIGD: + value->rValue = model->BSIM4v6wbigd; + return(OK); + case BSIM4v6_MOD_WCIGD: + value->rValue = model->BSIM4v6wcigd; + return(OK); + case BSIM4v6_MOD_WAIGBACC: + value->rValue = model->BSIM4v6waigbacc; + return(OK); + case BSIM4v6_MOD_WBIGBACC: + value->rValue = model->BSIM4v6wbigbacc; + return(OK); + case BSIM4v6_MOD_WCIGBACC: + value->rValue = model->BSIM4v6wcigbacc; + return(OK); + case BSIM4v6_MOD_WAIGBINV: + value->rValue = model->BSIM4v6waigbinv; + return(OK); + case BSIM4v6_MOD_WBIGBINV: + value->rValue = model->BSIM4v6wbigbinv; + return(OK); + case BSIM4v6_MOD_WCIGBINV: + value->rValue = model->BSIM4v6wcigbinv; + return(OK); + case BSIM4v6_MOD_WNIGC: + value->rValue = model->BSIM4v6wnigc; + return(OK); + case BSIM4v6_MOD_WNIGBACC: + value->rValue = model->BSIM4v6wnigbacc; + return(OK); + case BSIM4v6_MOD_WNIGBINV: + value->rValue = model->BSIM4v6wnigbinv; + return(OK); + case BSIM4v6_MOD_WNTOX: + value->rValue = model->BSIM4v6wntox; + return(OK); + case BSIM4v6_MOD_WEIGBINV: + value->rValue = model->BSIM4v6weigbinv; + return(OK); + case BSIM4v6_MOD_WPIGCD: + value->rValue = model->BSIM4v6wpigcd; + return(OK); + case BSIM4v6_MOD_WPOXEDGE: + value->rValue = model->BSIM4v6wpoxedge; + return(OK); + case BSIM4v6_MOD_WPHIN: + value->rValue = model->BSIM4v6wphin; + return(OK); + case BSIM4v6_MOD_WXRCRG1: + value->rValue = model->BSIM4v6wxrcrg1; + return(OK); + case BSIM4v6_MOD_WXRCRG2: + value->rValue = model->BSIM4v6wxrcrg2; + return(OK); + case BSIM4v6_MOD_WEU: + value->rValue = model->BSIM4v6weu; + return(OK); + case BSIM4v6_MOD_WUCS: + value->rValue = model->BSIM4v6wucs; + return(OK); + case BSIM4v6_MOD_WVFB: + value->rValue = model->BSIM4v6wvfb; + return(OK); + + case BSIM4v6_MOD_WCGSL: + value->rValue = model->BSIM4v6wcgsl; + return(OK); + case BSIM4v6_MOD_WCGDL: + value->rValue = model->BSIM4v6wcgdl; + return(OK); + case BSIM4v6_MOD_WCKAPPAS: + value->rValue = model->BSIM4v6wckappas; + return(OK); + case BSIM4v6_MOD_WCKAPPAD: + value->rValue = model->BSIM4v6wckappad; + return(OK); + case BSIM4v6_MOD_WCF: + value->rValue = model->BSIM4v6wcf; + return(OK); + case BSIM4v6_MOD_WCLC: + value->rValue = model->BSIM4v6wclc; + return(OK); + case BSIM4v6_MOD_WCLE: + value->rValue = model->BSIM4v6wcle; + return(OK); + case BSIM4v6_MOD_WVFBCV: + value->rValue = model->BSIM4v6wvfbcv; + return(OK); + case BSIM4v6_MOD_WACDE: + value->rValue = model->BSIM4v6wacde; + return(OK); + case BSIM4v6_MOD_WMOIN: + value->rValue = model->BSIM4v6wmoin; + return(OK); + case BSIM4v6_MOD_WNOFF: + value->rValue = model->BSIM4v6wnoff; + return(OK); + case BSIM4v6_MOD_WVOFFCV: + value->rValue = model->BSIM4v6wvoffcv; + return(OK); + case BSIM4v6_MOD_WVFBSDOFF: + value->rValue = model->BSIM4v6wvfbsdoff; + return(OK); + case BSIM4v6_MOD_WTVFBSDOFF: + value->rValue = model->BSIM4v6wtvfbsdoff; + return(OK); + + /* Cross-term dependence */ + case BSIM4v6_MOD_PCDSC : + value->rValue = model->BSIM4v6pcdsc; + return(OK); + case BSIM4v6_MOD_PCDSCB : + value->rValue = model->BSIM4v6pcdscb; + return(OK); + case BSIM4v6_MOD_PCDSCD : + value->rValue = model->BSIM4v6pcdscd; + return(OK); + case BSIM4v6_MOD_PCIT : + value->rValue = model->BSIM4v6pcit; + return(OK); + case BSIM4v6_MOD_PNFACTOR : + value->rValue = model->BSIM4v6pnfactor; + return(OK); + case BSIM4v6_MOD_PXJ: + value->rValue = model->BSIM4v6pxj; + return(OK); + case BSIM4v6_MOD_PVSAT: + value->rValue = model->BSIM4v6pvsat; + return(OK); + case BSIM4v6_MOD_PAT: + value->rValue = model->BSIM4v6pat; + return(OK); + case BSIM4v6_MOD_PA0: + value->rValue = model->BSIM4v6pa0; + return(OK); + case BSIM4v6_MOD_PAGS: + value->rValue = model->BSIM4v6pags; + return(OK); + case BSIM4v6_MOD_PA1: + value->rValue = model->BSIM4v6pa1; + return(OK); + case BSIM4v6_MOD_PA2: + value->rValue = model->BSIM4v6pa2; + return(OK); + case BSIM4v6_MOD_PKETA: + value->rValue = model->BSIM4v6pketa; + return(OK); + case BSIM4v6_MOD_PNSUB: + value->rValue = model->BSIM4v6pnsub; + return(OK); + case BSIM4v6_MOD_PNDEP: + value->rValue = model->BSIM4v6pndep; + return(OK); + case BSIM4v6_MOD_PNSD: + value->rValue = model->BSIM4v6pnsd; + return(OK); + case BSIM4v6_MOD_PNGATE: + value->rValue = model->BSIM4v6pngate; + return(OK); + case BSIM4v6_MOD_PGAMMA1: + value->rValue = model->BSIM4v6pgamma1; + return(OK); + case BSIM4v6_MOD_PGAMMA2: + value->rValue = model->BSIM4v6pgamma2; + return(OK); + case BSIM4v6_MOD_PVBX: + value->rValue = model->BSIM4v6pvbx; + return(OK); + case BSIM4v6_MOD_PVBM: + value->rValue = model->BSIM4v6pvbm; + return(OK); + case BSIM4v6_MOD_PXT: + value->rValue = model->BSIM4v6pxt; + return(OK); + case BSIM4v6_MOD_PK1: + value->rValue = model->BSIM4v6pk1; + return(OK); + case BSIM4v6_MOD_PKT1: + value->rValue = model->BSIM4v6pkt1; + return(OK); + case BSIM4v6_MOD_PKT1L: + value->rValue = model->BSIM4v6pkt1l; + return(OK); + case BSIM4v6_MOD_PKT2 : + value->rValue = model->BSIM4v6pkt2; + return(OK); + case BSIM4v6_MOD_PK2 : + value->rValue = model->BSIM4v6pk2; + return(OK); + case BSIM4v6_MOD_PK3: + value->rValue = model->BSIM4v6pk3; + return(OK); + case BSIM4v6_MOD_PK3B: + value->rValue = model->BSIM4v6pk3b; + return(OK); + case BSIM4v6_MOD_PW0: + value->rValue = model->BSIM4v6pw0; + return(OK); + case BSIM4v6_MOD_PLPE0: + value->rValue = model->BSIM4v6plpe0; + return(OK); + case BSIM4v6_MOD_PLPEB: + value->rValue = model->BSIM4v6plpeb; + return(OK); + case BSIM4v6_MOD_PDVTP0: + value->rValue = model->BSIM4v6pdvtp0; + return(OK); + case BSIM4v6_MOD_PDVTP1: + value->rValue = model->BSIM4v6pdvtp1; + return(OK); + case BSIM4v6_MOD_PDVT0 : + value->rValue = model->BSIM4v6pdvt0; + return(OK); + case BSIM4v6_MOD_PDVT1 : + value->rValue = model->BSIM4v6pdvt1; + return(OK); + case BSIM4v6_MOD_PDVT2 : + value->rValue = model->BSIM4v6pdvt2; + return(OK); + case BSIM4v6_MOD_PDVT0W : + value->rValue = model->BSIM4v6pdvt0w; + return(OK); + case BSIM4v6_MOD_PDVT1W : + value->rValue = model->BSIM4v6pdvt1w; + return(OK); + case BSIM4v6_MOD_PDVT2W : + value->rValue = model->BSIM4v6pdvt2w; + return(OK); + case BSIM4v6_MOD_PDROUT : + value->rValue = model->BSIM4v6pdrout; + return(OK); + case BSIM4v6_MOD_PDSUB : + value->rValue = model->BSIM4v6pdsub; + return(OK); + case BSIM4v6_MOD_PVTH0: + value->rValue = model->BSIM4v6pvth0; + return(OK); + case BSIM4v6_MOD_PUA: + value->rValue = model->BSIM4v6pua; + return(OK); + case BSIM4v6_MOD_PUA1: + value->rValue = model->BSIM4v6pua1; + return(OK); + case BSIM4v6_MOD_PUB: + value->rValue = model->BSIM4v6pub; + return(OK); + case BSIM4v6_MOD_PUB1: + value->rValue = model->BSIM4v6pub1; + return(OK); + case BSIM4v6_MOD_PUC: + value->rValue = model->BSIM4v6puc; + return(OK); + case BSIM4v6_MOD_PUC1: + value->rValue = model->BSIM4v6puc1; + return(OK); + case BSIM4v6_MOD_PUD: + value->rValue = model->BSIM4v6pud; + return(OK); + case BSIM4v6_MOD_PUD1: + value->rValue = model->BSIM4v6pud1; + return(OK); + case BSIM4v6_MOD_PUP: + value->rValue = model->BSIM4v6pup; + return(OK); + case BSIM4v6_MOD_PLP: + value->rValue = model->BSIM4v6plp; + return(OK); + case BSIM4v6_MOD_PU0: + value->rValue = model->BSIM4v6pu0; + return(OK); + case BSIM4v6_MOD_PUTE: + value->rValue = model->BSIM4v6pute; + return(OK); + case BSIM4v6_MOD_PUCSTE: + value->rValue = model->BSIM4v6pucste; + return(OK); + case BSIM4v6_MOD_PVOFF: + value->rValue = model->BSIM4v6pvoff; + return(OK); + case BSIM4v6_MOD_PTVOFF: + value->rValue = model->BSIM4v6ptvoff; + return(OK); + case BSIM4v6_MOD_PMINV: + value->rValue = model->BSIM4v6pminv; + return(OK); + case BSIM4v6_MOD_PMINVCV: + value->rValue = model->BSIM4v6pminvcv; + return(OK); + case BSIM4v6_MOD_PFPROUT: + value->rValue = model->BSIM4v6pfprout; + return(OK); + case BSIM4v6_MOD_PPDITS: + value->rValue = model->BSIM4v6ppdits; + return(OK); + case BSIM4v6_MOD_PPDITSD: + value->rValue = model->BSIM4v6ppditsd; + return(OK); + case BSIM4v6_MOD_PDELTA: + value->rValue = model->BSIM4v6pdelta; + return(OK); + case BSIM4v6_MOD_PRDSW: + value->rValue = model->BSIM4v6prdsw; + return(OK); + case BSIM4v6_MOD_PRDW: + value->rValue = model->BSIM4v6prdw; + return(OK); + case BSIM4v6_MOD_PRSW: + value->rValue = model->BSIM4v6prsw; + return(OK); + case BSIM4v6_MOD_PPRWB: + value->rValue = model->BSIM4v6pprwb; + return(OK); + case BSIM4v6_MOD_PPRWG: + value->rValue = model->BSIM4v6pprwg; + return(OK); + case BSIM4v6_MOD_PPRT: + value->rValue = model->BSIM4v6pprt; + return(OK); + case BSIM4v6_MOD_PETA0: + value->rValue = model->BSIM4v6peta0; + return(OK); + case BSIM4v6_MOD_PETAB: + value->rValue = model->BSIM4v6petab; + return(OK); + case BSIM4v6_MOD_PPCLM: + value->rValue = model->BSIM4v6ppclm; + return(OK); + case BSIM4v6_MOD_PPDIBL1: + value->rValue = model->BSIM4v6ppdibl1; + return(OK); + case BSIM4v6_MOD_PPDIBL2: + value->rValue = model->BSIM4v6ppdibl2; + return(OK); + case BSIM4v6_MOD_PPDIBLB: + value->rValue = model->BSIM4v6ppdiblb; + return(OK); + case BSIM4v6_MOD_PPSCBE1: + value->rValue = model->BSIM4v6ppscbe1; + return(OK); + case BSIM4v6_MOD_PPSCBE2: + value->rValue = model->BSIM4v6ppscbe2; + return(OK); + case BSIM4v6_MOD_PPVAG: + value->rValue = model->BSIM4v6ppvag; + return(OK); + case BSIM4v6_MOD_PWR: + value->rValue = model->BSIM4v6pwr; + return(OK); + case BSIM4v6_MOD_PDWG: + value->rValue = model->BSIM4v6pdwg; + return(OK); + case BSIM4v6_MOD_PDWB: + value->rValue = model->BSIM4v6pdwb; + return(OK); + case BSIM4v6_MOD_PB0: + value->rValue = model->BSIM4v6pb0; + return(OK); + case BSIM4v6_MOD_PB1: + value->rValue = model->BSIM4v6pb1; + return(OK); + case BSIM4v6_MOD_PALPHA0: + value->rValue = model->BSIM4v6palpha0; + return(OK); + case BSIM4v6_MOD_PALPHA1: + value->rValue = model->BSIM4v6palpha1; + return(OK); + case BSIM4v6_MOD_PBETA0: + value->rValue = model->BSIM4v6pbeta0; + return(OK); + case BSIM4v6_MOD_PAGIDL: + value->rValue = model->BSIM4v6pagidl; + return(OK); + case BSIM4v6_MOD_PBGIDL: + value->rValue = model->BSIM4v6pbgidl; + return(OK); + case BSIM4v6_MOD_PCGIDL: + value->rValue = model->BSIM4v6pcgidl; + return(OK); + case BSIM4v6_MOD_PEGIDL: + value->rValue = model->BSIM4v6pegidl; + return(OK); + case BSIM4v6_MOD_PAGISL: + value->rValue = model->BSIM4v6pagisl; + return(OK); + case BSIM4v6_MOD_PBGISL: + value->rValue = model->BSIM4v6pbgisl; + return(OK); + case BSIM4v6_MOD_PCGISL: + value->rValue = model->BSIM4v6pcgisl; + return(OK); + case BSIM4v6_MOD_PEGISL: + value->rValue = model->BSIM4v6pegisl; + return(OK); + case BSIM4v6_MOD_PAIGC: + value->rValue = model->BSIM4v6paigc; + return(OK); + case BSIM4v6_MOD_PBIGC: + value->rValue = model->BSIM4v6pbigc; + return(OK); + case BSIM4v6_MOD_PCIGC: + value->rValue = model->BSIM4v6pcigc; + return(OK); + case BSIM4v6_MOD_PAIGSD: + value->rValue = model->BSIM4v6paigsd; + return(OK); + case BSIM4v6_MOD_PBIGSD: + value->rValue = model->BSIM4v6pbigsd; + return(OK); + case BSIM4v6_MOD_PCIGSD: + value->rValue = model->BSIM4v6pcigsd; + return(OK); + case BSIM4v6_MOD_PAIGS: + value->rValue = model->BSIM4v6paigs; + return(OK); + case BSIM4v6_MOD_PBIGS: + value->rValue = model->BSIM4v6pbigs; + return(OK); + case BSIM4v6_MOD_PCIGS: + value->rValue = model->BSIM4v6pcigs; + return(OK); + case BSIM4v6_MOD_PAIGD: + value->rValue = model->BSIM4v6paigd; + return(OK); + case BSIM4v6_MOD_PBIGD: + value->rValue = model->BSIM4v6pbigd; + return(OK); + case BSIM4v6_MOD_PCIGD: + value->rValue = model->BSIM4v6pcigd; + return(OK); + case BSIM4v6_MOD_PAIGBACC: + value->rValue = model->BSIM4v6paigbacc; + return(OK); + case BSIM4v6_MOD_PBIGBACC: + value->rValue = model->BSIM4v6pbigbacc; + return(OK); + case BSIM4v6_MOD_PCIGBACC: + value->rValue = model->BSIM4v6pcigbacc; + return(OK); + case BSIM4v6_MOD_PAIGBINV: + value->rValue = model->BSIM4v6paigbinv; + return(OK); + case BSIM4v6_MOD_PBIGBINV: + value->rValue = model->BSIM4v6pbigbinv; + return(OK); + case BSIM4v6_MOD_PCIGBINV: + value->rValue = model->BSIM4v6pcigbinv; + return(OK); + case BSIM4v6_MOD_PNIGC: + value->rValue = model->BSIM4v6pnigc; + return(OK); + case BSIM4v6_MOD_PNIGBACC: + value->rValue = model->BSIM4v6pnigbacc; + return(OK); + case BSIM4v6_MOD_PNIGBINV: + value->rValue = model->BSIM4v6pnigbinv; + return(OK); + case BSIM4v6_MOD_PNTOX: + value->rValue = model->BSIM4v6pntox; + return(OK); + case BSIM4v6_MOD_PEIGBINV: + value->rValue = model->BSIM4v6peigbinv; + return(OK); + case BSIM4v6_MOD_PPIGCD: + value->rValue = model->BSIM4v6ppigcd; + return(OK); + case BSIM4v6_MOD_PPOXEDGE: + value->rValue = model->BSIM4v6ppoxedge; + return(OK); + case BSIM4v6_MOD_PPHIN: + value->rValue = model->BSIM4v6pphin; + return(OK); + case BSIM4v6_MOD_PXRCRG1: + value->rValue = model->BSIM4v6pxrcrg1; + return(OK); + case BSIM4v6_MOD_PXRCRG2: + value->rValue = model->BSIM4v6pxrcrg2; + return(OK); + case BSIM4v6_MOD_PEU: + value->rValue = model->BSIM4v6peu; + return(OK); + case BSIM4v6_MOD_PUCS: + value->rValue = model->BSIM4v6pucs; + return(OK); + case BSIM4v6_MOD_PVFB: + value->rValue = model->BSIM4v6pvfb; + return(OK); + + case BSIM4v6_MOD_PCGSL: + value->rValue = model->BSIM4v6pcgsl; + return(OK); + case BSIM4v6_MOD_PCGDL: + value->rValue = model->BSIM4v6pcgdl; + return(OK); + case BSIM4v6_MOD_PCKAPPAS: + value->rValue = model->BSIM4v6pckappas; + return(OK); + case BSIM4v6_MOD_PCKAPPAD: + value->rValue = model->BSIM4v6pckappad; + return(OK); + case BSIM4v6_MOD_PCF: + value->rValue = model->BSIM4v6pcf; + return(OK); + case BSIM4v6_MOD_PCLC: + value->rValue = model->BSIM4v6pclc; + return(OK); + case BSIM4v6_MOD_PCLE: + value->rValue = model->BSIM4v6pcle; + return(OK); + case BSIM4v6_MOD_PVFBCV: + value->rValue = model->BSIM4v6pvfbcv; + return(OK); + case BSIM4v6_MOD_PACDE: + value->rValue = model->BSIM4v6pacde; + return(OK); + case BSIM4v6_MOD_PMOIN: + value->rValue = model->BSIM4v6pmoin; + return(OK); + case BSIM4v6_MOD_PNOFF: + value->rValue = model->BSIM4v6pnoff; + return(OK); + case BSIM4v6_MOD_PVOFFCV: + value->rValue = model->BSIM4v6pvoffcv; + return(OK); + case BSIM4v6_MOD_PVFBSDOFF: + value->rValue = model->BSIM4v6pvfbsdoff; + return(OK); + case BSIM4v6_MOD_PTVFBSDOFF: + value->rValue = model->BSIM4v6ptvfbsdoff; + return(OK); + + case BSIM4v6_MOD_TNOM : + value->rValue = model->BSIM4v6tnom; + return(OK); + case BSIM4v6_MOD_CGSO: + value->rValue = model->BSIM4v6cgso; + return(OK); + case BSIM4v6_MOD_CGDO: + value->rValue = model->BSIM4v6cgdo; + return(OK); + case BSIM4v6_MOD_CGBO: + value->rValue = model->BSIM4v6cgbo; + return(OK); + case BSIM4v6_MOD_XPART: + value->rValue = model->BSIM4v6xpart; + return(OK); + case BSIM4v6_MOD_RSH: + value->rValue = model->BSIM4v6sheetResistance; + return(OK); + case BSIM4v6_MOD_JSS: + value->rValue = model->BSIM4v6SjctSatCurDensity; + return(OK); + case BSIM4v6_MOD_JSWS: + value->rValue = model->BSIM4v6SjctSidewallSatCurDensity; + return(OK); + case BSIM4v6_MOD_JSWGS: + value->rValue = model->BSIM4v6SjctGateSidewallSatCurDensity; + return(OK); + case BSIM4v6_MOD_PBS: + value->rValue = model->BSIM4v6SbulkJctPotential; + return(OK); + case BSIM4v6_MOD_MJS: + value->rValue = model->BSIM4v6SbulkJctBotGradingCoeff; + return(OK); + case BSIM4v6_MOD_PBSWS: + value->rValue = model->BSIM4v6SsidewallJctPotential; + return(OK); + case BSIM4v6_MOD_MJSWS: + value->rValue = model->BSIM4v6SbulkJctSideGradingCoeff; + return(OK); + case BSIM4v6_MOD_CJS: + value->rValue = model->BSIM4v6SunitAreaJctCap; + return(OK); + case BSIM4v6_MOD_CJSWS: + value->rValue = model->BSIM4v6SunitLengthSidewallJctCap; + return(OK); + case BSIM4v6_MOD_PBSWGS: + value->rValue = model->BSIM4v6SGatesidewallJctPotential; + return(OK); + case BSIM4v6_MOD_MJSWGS: + value->rValue = model->BSIM4v6SbulkJctGateSideGradingCoeff; + return(OK); + case BSIM4v6_MOD_CJSWGS: + value->rValue = model->BSIM4v6SunitLengthGateSidewallJctCap; + return(OK); + case BSIM4v6_MOD_NJS: + value->rValue = model->BSIM4v6SjctEmissionCoeff; + return(OK); + case BSIM4v6_MOD_XTIS: + value->rValue = model->BSIM4v6SjctTempExponent; + return(OK); + case BSIM4v6_MOD_JSD: + value->rValue = model->BSIM4v6DjctSatCurDensity; + return(OK); + case BSIM4v6_MOD_JSWD: + value->rValue = model->BSIM4v6DjctSidewallSatCurDensity; + return(OK); + case BSIM4v6_MOD_JSWGD: + value->rValue = model->BSIM4v6DjctGateSidewallSatCurDensity; + return(OK); + case BSIM4v6_MOD_PBD: + value->rValue = model->BSIM4v6DbulkJctPotential; + return(OK); + case BSIM4v6_MOD_MJD: + value->rValue = model->BSIM4v6DbulkJctBotGradingCoeff; + return(OK); + case BSIM4v6_MOD_PBSWD: + value->rValue = model->BSIM4v6DsidewallJctPotential; + return(OK); + case BSIM4v6_MOD_MJSWD: + value->rValue = model->BSIM4v6DbulkJctSideGradingCoeff; + return(OK); + case BSIM4v6_MOD_CJD: + value->rValue = model->BSIM4v6DunitAreaJctCap; + return(OK); + case BSIM4v6_MOD_CJSWD: + value->rValue = model->BSIM4v6DunitLengthSidewallJctCap; + return(OK); + case BSIM4v6_MOD_PBSWGD: + value->rValue = model->BSIM4v6DGatesidewallJctPotential; + return(OK); + case BSIM4v6_MOD_MJSWGD: + value->rValue = model->BSIM4v6DbulkJctGateSideGradingCoeff; + return(OK); + case BSIM4v6_MOD_CJSWGD: + value->rValue = model->BSIM4v6DunitLengthGateSidewallJctCap; + return(OK); + case BSIM4v6_MOD_NJD: + value->rValue = model->BSIM4v6DjctEmissionCoeff; + return(OK); + case BSIM4v6_MOD_XTID: + value->rValue = model->BSIM4v6DjctTempExponent; + return(OK); + case BSIM4v6_MOD_LINT: + value->rValue = model->BSIM4v6Lint; + return(OK); + case BSIM4v6_MOD_LL: + value->rValue = model->BSIM4v6Ll; + return(OK); + case BSIM4v6_MOD_LLC: + value->rValue = model->BSIM4v6Llc; + return(OK); + case BSIM4v6_MOD_LLN: + value->rValue = model->BSIM4v6Lln; + return(OK); + case BSIM4v6_MOD_LW: + value->rValue = model->BSIM4v6Lw; + return(OK); + case BSIM4v6_MOD_LWC: + value->rValue = model->BSIM4v6Lwc; + return(OK); + case BSIM4v6_MOD_LWN: + value->rValue = model->BSIM4v6Lwn; + return(OK); + case BSIM4v6_MOD_LWL: + value->rValue = model->BSIM4v6Lwl; + return(OK); + case BSIM4v6_MOD_LWLC: + value->rValue = model->BSIM4v6Lwlc; + return(OK); + case BSIM4v6_MOD_LMIN: + value->rValue = model->BSIM4v6Lmin; + return(OK); + case BSIM4v6_MOD_LMAX: + value->rValue = model->BSIM4v6Lmax; + return(OK); + case BSIM4v6_MOD_WINT: + value->rValue = model->BSIM4v6Wint; + return(OK); + case BSIM4v6_MOD_WL: + value->rValue = model->BSIM4v6Wl; + return(OK); + case BSIM4v6_MOD_WLC: + value->rValue = model->BSIM4v6Wlc; + return(OK); + case BSIM4v6_MOD_WLN: + value->rValue = model->BSIM4v6Wln; + return(OK); + case BSIM4v6_MOD_WW: + value->rValue = model->BSIM4v6Ww; + return(OK); + case BSIM4v6_MOD_WWC: + value->rValue = model->BSIM4v6Wwc; + return(OK); + case BSIM4v6_MOD_WWN: + value->rValue = model->BSIM4v6Wwn; + return(OK); + case BSIM4v6_MOD_WWL: + value->rValue = model->BSIM4v6Wwl; + return(OK); + case BSIM4v6_MOD_WWLC: + value->rValue = model->BSIM4v6Wwlc; + return(OK); + case BSIM4v6_MOD_WMIN: + value->rValue = model->BSIM4v6Wmin; + return(OK); + case BSIM4v6_MOD_WMAX: + value->rValue = model->BSIM4v6Wmax; + return(OK); + + /* stress effect */ + case BSIM4v6_MOD_SAREF: + value->rValue = model->BSIM4v6saref; + return(OK); + case BSIM4v6_MOD_SBREF: + value->rValue = model->BSIM4v6sbref; + return(OK); + case BSIM4v6_MOD_WLOD: + value->rValue = model->BSIM4v6wlod; + return(OK); + case BSIM4v6_MOD_KU0: + value->rValue = model->BSIM4v6ku0; + return(OK); + case BSIM4v6_MOD_KVSAT: + value->rValue = model->BSIM4v6kvsat; + return(OK); + case BSIM4v6_MOD_KVTH0: + value->rValue = model->BSIM4v6kvth0; + return(OK); + case BSIM4v6_MOD_TKU0: + value->rValue = model->BSIM4v6tku0; + return(OK); + case BSIM4v6_MOD_LLODKU0: + value->rValue = model->BSIM4v6llodku0; + return(OK); + case BSIM4v6_MOD_WLODKU0: + value->rValue = model->BSIM4v6wlodku0; + return(OK); + case BSIM4v6_MOD_LLODVTH: + value->rValue = model->BSIM4v6llodvth; + return(OK); + case BSIM4v6_MOD_WLODVTH: + value->rValue = model->BSIM4v6wlodvth; + return(OK); + case BSIM4v6_MOD_LKU0: + value->rValue = model->BSIM4v6lku0; + return(OK); + case BSIM4v6_MOD_WKU0: + value->rValue = model->BSIM4v6wku0; + return(OK); + case BSIM4v6_MOD_PKU0: + value->rValue = model->BSIM4v6pku0; + return(OK); + case BSIM4v6_MOD_LKVTH0: + value->rValue = model->BSIM4v6lkvth0; + return(OK); + case BSIM4v6_MOD_WKVTH0: + value->rValue = model->BSIM4v6wkvth0; + return(OK); + case BSIM4v6_MOD_PKVTH0: + value->rValue = model->BSIM4v6pkvth0; + return(OK); + case BSIM4v6_MOD_STK2: + value->rValue = model->BSIM4v6stk2; + return(OK); + case BSIM4v6_MOD_LODK2: + value->rValue = model->BSIM4v6lodk2; + return(OK); + case BSIM4v6_MOD_STETA0: + value->rValue = model->BSIM4v6steta0; + return(OK); + case BSIM4v6_MOD_LODETA0: + value->rValue = model->BSIM4v6lodeta0; + return(OK); + + /* Well Proximity Effect */ + case BSIM4v6_MOD_WEB: + value->rValue = model->BSIM4v6web; + return(OK); + case BSIM4v6_MOD_WEC: + value->rValue = model->BSIM4v6wec; + return(OK); + case BSIM4v6_MOD_KVTH0WE: + value->rValue = model->BSIM4v6kvth0we; + return(OK); + case BSIM4v6_MOD_K2WE: + value->rValue = model->BSIM4v6k2we; + return(OK); + case BSIM4v6_MOD_KU0WE: + value->rValue = model->BSIM4v6ku0we; + return(OK); + case BSIM4v6_MOD_SCREF: + value->rValue = model->BSIM4v6scref; + return(OK); + case BSIM4v6_MOD_WPEMOD: + value->rValue = model->BSIM4v6wpemod; + return(OK); + case BSIM4v6_MOD_LKVTH0WE: + value->rValue = model->BSIM4v6lkvth0we; + return(OK); + case BSIM4v6_MOD_LK2WE: + value->rValue = model->BSIM4v6lk2we; + return(OK); + case BSIM4v6_MOD_LKU0WE: + value->rValue = model->BSIM4v6lku0we; + return(OK); + case BSIM4v6_MOD_WKVTH0WE: + value->rValue = model->BSIM4v6wkvth0we; + return(OK); + case BSIM4v6_MOD_WK2WE: + value->rValue = model->BSIM4v6wk2we; + return(OK); + case BSIM4v6_MOD_WKU0WE: + value->rValue = model->BSIM4v6wku0we; + return(OK); + case BSIM4v6_MOD_PKVTH0WE: + value->rValue = model->BSIM4v6pkvth0we; + return(OK); + case BSIM4v6_MOD_PK2WE: + value->rValue = model->BSIM4v6pk2we; + return(OK); + case BSIM4v6_MOD_PKU0WE: + value->rValue = model->BSIM4v6pku0we; + return(OK); + + case BSIM4v6_MOD_NOIA: + value->rValue = model->BSIM4v6oxideTrapDensityA; + return(OK); + case BSIM4v6_MOD_NOIB: + value->rValue = model->BSIM4v6oxideTrapDensityB; + return(OK); + case BSIM4v6_MOD_NOIC: + value->rValue = model->BSIM4v6oxideTrapDensityC; + return(OK); + case BSIM4v6_MOD_EM: + value->rValue = model->BSIM4v6em; + return(OK); + case BSIM4v6_MOD_EF: + value->rValue = model->BSIM4v6ef; + return(OK); + case BSIM4v6_MOD_AF: + value->rValue = model->BSIM4v6af; + return(OK); + case BSIM4v6_MOD_KF: + value->rValue = model->BSIM4v6kf; + return(OK); + default: + return(E_BADPARM); + } + /* NOTREACHED */ +} + + + diff --git a/src/spicelib/devices/bsim4v6/b4v6mdel.c b/src/spicelib/devices/bsim4v6/b4v6mdel.c new file mode 100644 index 000000000..e70d4ac36 --- /dev/null +++ b/src/spicelib/devices/bsim4v6/b4v6mdel.c @@ -0,0 +1,48 @@ +/**** BSIM4.6.2 Released by Wenwei Yang 07/31/2008 ****/ + +/********** + * Copyright 2006 Regents of the University of California. All rights reserved. + * File: b4mdel.c of BSIM4.6.2. + * Author: 2000 Weidong Liu + * Authors: 2001- Xuemei Xi, Mohan Dunga, Ali Niknejad, Chenming Hu. + * Authors: 2006- Mohan Dunga, Ali Niknejad, Chenming Hu + * Authors: 2007- Mohan Dunga, Wenwei Yang, Ali Niknejad, Chenming Hu + * Project Director: Prof. Chenming Hu. + **********/ + +#include "ngspice.h" +#include "bsim4v6def.h" +#include "sperror.h" +#include "suffix.h" + +int +BSIM4v6mDelete( +GENmodel **inModel, +IFuid modname, +GENmodel *kill) +{ +BSIM4v6model **model = (BSIM4v6model**)inModel; +BSIM4v6model *modfast = (BSIM4v6model*)kill; +BSIM4v6instance *here; +BSIM4v6instance *prev = NULL; +BSIM4v6model **oldmod; + + oldmod = model; + for (; *model ; model = &((*model)->BSIM4v6nextModel)) + { if ((*model)->BSIM4v6modName == modname || + (modfast && *model == modfast)) + goto delgot; + oldmod = model; + } + return(E_NOMOD); + +delgot: + *oldmod = (*model)->BSIM4v6nextModel; /* cut deleted device out of list */ + for (here = (*model)->BSIM4v6instances; here; here = here->BSIM4v6nextInstance) + { if(prev) FREE(prev); + prev = here; + } + if(prev) FREE(prev); + FREE(*model); + return(OK); +} diff --git a/src/spicelib/devices/bsim4v6/b4v6mpar.c b/src/spicelib/devices/bsim4v6/b4v6mpar.c new file mode 100644 index 000000000..5ca5959b6 --- /dev/null +++ b/src/spicelib/devices/bsim4v6/b4v6mpar.c @@ -0,0 +1,3394 @@ +/**** BSIM4.6.2 Released by Wenwei Yang 07/31/2008 ****/ + +/********** + * Copyright 2006 Regents of the University of California. All rights reserved. + * File: b4mpar.c of BSIM4.6.1. + * Author: 2000 Weidong Liu + * Authors: 2001- Xuemei Xi, Mohan Dunga, Ali Niknejad, Chenming Hu. + * Authors: 2006- Mohan Dunga, Ali Niknejad, Chenming Hu + * Authors: 2007- Mohan Dunga, Wenwei Yang, Ali Niknejad, Chenming Hu + * Authors: 2008- Wenwei Yang, 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. + * Modified by Mohan Dunga, 12/13/2006 + * Modified by Mohan Dunga, Wenwei Yang, 05/18/2007. + * Modified by Wenwei Yang, 07/31/2008. + **********/ + +#include "ngspice.h" +#include "bsim4v6def.h" +#include "ifsim.h" +#include "sperror.h" +#include "suffix.h" +#include "const.h" + +int +BSIM4v6mParam( +int param, +IFvalue *value, +GENmodel *inMod) +{ + BSIM4v6model *mod = (BSIM4v6model*)inMod; + switch(param) + { case BSIM4v6_MOD_MOBMOD : + mod->BSIM4v6mobMod = value->iValue; + mod->BSIM4v6mobModGiven = TRUE; + break; + case BSIM4v6_MOD_BINUNIT : + mod->BSIM4v6binUnit = value->iValue; + mod->BSIM4v6binUnitGiven = TRUE; + break; + case BSIM4v6_MOD_PARAMCHK : + mod->BSIM4v6paramChk = value->iValue; + mod->BSIM4v6paramChkGiven = TRUE; + break; + case BSIM4v6_MOD_CVCHARGEMOD : + mod->BSIM4v6cvchargeMod = value->iValue; + mod->BSIM4v6cvchargeModGiven = TRUE; + break; + case BSIM4v6_MOD_CAPMOD : + mod->BSIM4v6capMod = value->iValue; + mod->BSIM4v6capModGiven = TRUE; + break; + case BSIM4v6_MOD_DIOMOD : + mod->BSIM4v6dioMod = value->iValue; + mod->BSIM4v6dioModGiven = TRUE; + break; + case BSIM4v6_MOD_RDSMOD : + mod->BSIM4v6rdsMod = value->iValue; + mod->BSIM4v6rdsModGiven = TRUE; + break; + case BSIM4v6_MOD_TRNQSMOD : + mod->BSIM4v6trnqsMod = value->iValue; + mod->BSIM4v6trnqsModGiven = TRUE; + break; + case BSIM4v6_MOD_ACNQSMOD : + mod->BSIM4v6acnqsMod = value->iValue; + mod->BSIM4v6acnqsModGiven = TRUE; + break; + case BSIM4v6_MOD_RBODYMOD : + mod->BSIM4v6rbodyMod = value->iValue; + mod->BSIM4v6rbodyModGiven = TRUE; + break; + case BSIM4v6_MOD_RGATEMOD : + mod->BSIM4v6rgateMod = value->iValue; + mod->BSIM4v6rgateModGiven = TRUE; + break; + case BSIM4v6_MOD_PERMOD : + mod->BSIM4v6perMod = value->iValue; + mod->BSIM4v6perModGiven = TRUE; + break; + case BSIM4v6_MOD_GEOMOD : + mod->BSIM4v6geoMod = value->iValue; + mod->BSIM4v6geoModGiven = TRUE; + break; + case BSIM4v6_MOD_FNOIMOD : + mod->BSIM4v6fnoiMod = value->iValue; + mod->BSIM4v6fnoiModGiven = TRUE; + break; + case BSIM4v6_MOD_TNOIMOD : + mod->BSIM4v6tnoiMod = value->iValue; + mod->BSIM4v6tnoiModGiven = TRUE; + break; + case BSIM4v6_MOD_MTRLMOD : + mod->BSIM4v6mtrlMod = value->iValue; + mod->BSIM4v6mtrlModGiven = TRUE; + break; + case BSIM4v6_MOD_IGCMOD : + mod->BSIM4v6igcMod = value->iValue; + mod->BSIM4v6igcModGiven = TRUE; + break; + case BSIM4v6_MOD_IGBMOD : + mod->BSIM4v6igbMod = value->iValue; + mod->BSIM4v6igbModGiven = TRUE; + break; + case BSIM4v6_MOD_TEMPMOD : + mod->BSIM4v6tempMod = value->iValue; + mod->BSIM4v6tempModGiven = TRUE; + break; + + case BSIM4v6_MOD_VERSION : + mod->BSIM4v6version = value->sValue; + mod->BSIM4v6versionGiven = TRUE; + break; + case BSIM4v6_MOD_TOXREF : + mod->BSIM4v6toxref = value->rValue; + mod->BSIM4v6toxrefGiven = TRUE; + break; + case BSIM4v6_MOD_EOT : + mod->BSIM4v6eot = value->rValue; + mod->BSIM4v6eotGiven = TRUE; + break; + case BSIM4v6_MOD_VDDEOT : + mod->BSIM4v6vddeot = value->rValue; + mod->BSIM4v6vddeotGiven = TRUE; + break; + case BSIM4v6_MOD_TEMPEOT : + mod->BSIM4v6tempeot = value->rValue; + mod->BSIM4v6tempeotGiven = TRUE; + break; + case BSIM4v6_MOD_LEFFEOT : + mod->BSIM4v6leffeot = value->rValue; + mod->BSIM4v6leffeotGiven = TRUE; + break; + case BSIM4v6_MOD_WEFFEOT : + mod->BSIM4v6weffeot = value->rValue; + mod->BSIM4v6weffeotGiven = TRUE; + break; + case BSIM4v6_MOD_ADOS : + mod->BSIM4v6ados = value->rValue; + mod->BSIM4v6adosGiven = TRUE; + break; + case BSIM4v6_MOD_BDOS : + mod->BSIM4v6bdos = value->rValue; + mod->BSIM4v6bdosGiven = TRUE; + break; + case BSIM4v6_MOD_TOXE : + mod->BSIM4v6toxe = value->rValue; + mod->BSIM4v6toxeGiven = TRUE; + break; + case BSIM4v6_MOD_TOXP : + mod->BSIM4v6toxp = value->rValue; + mod->BSIM4v6toxpGiven = TRUE; + break; + case BSIM4v6_MOD_TOXM : + mod->BSIM4v6toxm = value->rValue; + mod->BSIM4v6toxmGiven = TRUE; + break; + case BSIM4v6_MOD_DTOX : + mod->BSIM4v6dtox = value->rValue; + mod->BSIM4v6dtoxGiven = TRUE; + break; + case BSIM4v6_MOD_EPSROX : + mod->BSIM4v6epsrox = value->rValue; + mod->BSIM4v6epsroxGiven = TRUE; + break; + + case BSIM4v6_MOD_CDSC : + mod->BSIM4v6cdsc = value->rValue; + mod->BSIM4v6cdscGiven = TRUE; + break; + case BSIM4v6_MOD_CDSCB : + mod->BSIM4v6cdscb = value->rValue; + mod->BSIM4v6cdscbGiven = TRUE; + break; + + case BSIM4v6_MOD_CDSCD : + mod->BSIM4v6cdscd = value->rValue; + mod->BSIM4v6cdscdGiven = TRUE; + break; + + case BSIM4v6_MOD_CIT : + mod->BSIM4v6cit = value->rValue; + mod->BSIM4v6citGiven = TRUE; + break; + case BSIM4v6_MOD_NFACTOR : + mod->BSIM4v6nfactor = value->rValue; + mod->BSIM4v6nfactorGiven = TRUE; + break; + case BSIM4v6_MOD_XJ: + mod->BSIM4v6xj = value->rValue; + mod->BSIM4v6xjGiven = TRUE; + break; + case BSIM4v6_MOD_VSAT: + mod->BSIM4v6vsat = value->rValue; + mod->BSIM4v6vsatGiven = TRUE; + break; + case BSIM4v6_MOD_A0: + mod->BSIM4v6a0 = value->rValue; + mod->BSIM4v6a0Given = TRUE; + break; + + case BSIM4v6_MOD_AGS: + mod->BSIM4v6ags= value->rValue; + mod->BSIM4v6agsGiven = TRUE; + break; + + case BSIM4v6_MOD_A1: + mod->BSIM4v6a1 = value->rValue; + mod->BSIM4v6a1Given = TRUE; + break; + case BSIM4v6_MOD_A2: + mod->BSIM4v6a2 = value->rValue; + mod->BSIM4v6a2Given = TRUE; + break; + case BSIM4v6_MOD_AT: + mod->BSIM4v6at = value->rValue; + mod->BSIM4v6atGiven = TRUE; + break; + case BSIM4v6_MOD_KETA: + mod->BSIM4v6keta = value->rValue; + mod->BSIM4v6ketaGiven = TRUE; + break; + case BSIM4v6_MOD_NSUB: + mod->BSIM4v6nsub = value->rValue; + mod->BSIM4v6nsubGiven = TRUE; + break; + case BSIM4v6_MOD_PHIG: + mod->BSIM4v6phig = value->rValue; + mod->BSIM4v6phigGiven = TRUE; + break; + case BSIM4v6_MOD_EPSRGATE: + mod->BSIM4v6epsrgate = value->rValue; + mod->BSIM4v6epsrgateGiven = TRUE; + break; + case BSIM4v6_MOD_EASUB: + mod->BSIM4v6easub = value->rValue; + mod->BSIM4v6easubGiven = TRUE; + break; + case BSIM4v6_MOD_EPSRSUB: + mod->BSIM4v6epsrsub = value->rValue; + mod->BSIM4v6epsrsubGiven = TRUE; + break; + case BSIM4v6_MOD_NI0SUB: + mod->BSIM4v6ni0sub = value->rValue; + mod->BSIM4v6ni0subGiven = TRUE; + break; + case BSIM4v6_MOD_BG0SUB: + mod->BSIM4v6bg0sub = value->rValue; + mod->BSIM4v6bg0subGiven = TRUE; + break; + case BSIM4v6_MOD_TBGASUB: + mod->BSIM4v6tbgasub = value->rValue; + mod->BSIM4v6tbgasubGiven = TRUE; + break; + case BSIM4v6_MOD_TBGBSUB: + mod->BSIM4v6tbgbsub = value->rValue; + mod->BSIM4v6tbgbsubGiven = TRUE; + break; + case BSIM4v6_MOD_NDEP: + mod->BSIM4v6ndep = value->rValue; + mod->BSIM4v6ndepGiven = TRUE; + if (mod->BSIM4v6ndep > 1.0e20) + mod->BSIM4v6ndep *= 1.0e-6; + break; + case BSIM4v6_MOD_NSD: + mod->BSIM4v6nsd = value->rValue; + mod->BSIM4v6nsdGiven = TRUE; + if (mod->BSIM4v6nsd > 1.0e23) + mod->BSIM4v6nsd *= 1.0e-6; + break; + case BSIM4v6_MOD_NGATE: + mod->BSIM4v6ngate = value->rValue; + mod->BSIM4v6ngateGiven = TRUE; + if (mod->BSIM4v6ngate > 1.0e23) + mod->BSIM4v6ngate *= 1.0e-6; + break; + case BSIM4v6_MOD_GAMMA1: + mod->BSIM4v6gamma1 = value->rValue; + mod->BSIM4v6gamma1Given = TRUE; + break; + case BSIM4v6_MOD_GAMMA2: + mod->BSIM4v6gamma2 = value->rValue; + mod->BSIM4v6gamma2Given = TRUE; + break; + case BSIM4v6_MOD_VBX: + mod->BSIM4v6vbx = value->rValue; + mod->BSIM4v6vbxGiven = TRUE; + break; + case BSIM4v6_MOD_VBM: + mod->BSIM4v6vbm = value->rValue; + mod->BSIM4v6vbmGiven = TRUE; + break; + case BSIM4v6_MOD_XT: + mod->BSIM4v6xt = value->rValue; + mod->BSIM4v6xtGiven = TRUE; + break; + case BSIM4v6_MOD_K1: + mod->BSIM4v6k1 = value->rValue; + mod->BSIM4v6k1Given = TRUE; + break; + case BSIM4v6_MOD_KT1: + mod->BSIM4v6kt1 = value->rValue; + mod->BSIM4v6kt1Given = TRUE; + break; + case BSIM4v6_MOD_KT1L: + mod->BSIM4v6kt1l = value->rValue; + mod->BSIM4v6kt1lGiven = TRUE; + break; + case BSIM4v6_MOD_KT2: + mod->BSIM4v6kt2 = value->rValue; + mod->BSIM4v6kt2Given = TRUE; + break; + case BSIM4v6_MOD_K2: + mod->BSIM4v6k2 = value->rValue; + mod->BSIM4v6k2Given = TRUE; + break; + case BSIM4v6_MOD_K3: + mod->BSIM4v6k3 = value->rValue; + mod->BSIM4v6k3Given = TRUE; + break; + case BSIM4v6_MOD_K3B: + mod->BSIM4v6k3b = value->rValue; + mod->BSIM4v6k3bGiven = TRUE; + break; + case BSIM4v6_MOD_LPE0: + mod->BSIM4v6lpe0 = value->rValue; + mod->BSIM4v6lpe0Given = TRUE; + break; + case BSIM4v6_MOD_LPEB: + mod->BSIM4v6lpeb = value->rValue; + mod->BSIM4v6lpebGiven = TRUE; + break; + case BSIM4v6_MOD_DVTP0: + mod->BSIM4v6dvtp0 = value->rValue; + mod->BSIM4v6dvtp0Given = TRUE; + break; + case BSIM4v6_MOD_DVTP1: + mod->BSIM4v6dvtp1 = value->rValue; + mod->BSIM4v6dvtp1Given = TRUE; + break; + case BSIM4v6_MOD_W0: + mod->BSIM4v6w0 = value->rValue; + mod->BSIM4v6w0Given = TRUE; + break; + case BSIM4v6_MOD_DVT0: + mod->BSIM4v6dvt0 = value->rValue; + mod->BSIM4v6dvt0Given = TRUE; + break; + case BSIM4v6_MOD_DVT1: + mod->BSIM4v6dvt1 = value->rValue; + mod->BSIM4v6dvt1Given = TRUE; + break; + case BSIM4v6_MOD_DVT2: + mod->BSIM4v6dvt2 = value->rValue; + mod->BSIM4v6dvt2Given = TRUE; + break; + case BSIM4v6_MOD_DVT0W: + mod->BSIM4v6dvt0w = value->rValue; + mod->BSIM4v6dvt0wGiven = TRUE; + break; + case BSIM4v6_MOD_DVT1W: + mod->BSIM4v6dvt1w = value->rValue; + mod->BSIM4v6dvt1wGiven = TRUE; + break; + case BSIM4v6_MOD_DVT2W: + mod->BSIM4v6dvt2w = value->rValue; + mod->BSIM4v6dvt2wGiven = TRUE; + break; + case BSIM4v6_MOD_DROUT: + mod->BSIM4v6drout = value->rValue; + mod->BSIM4v6droutGiven = TRUE; + break; + case BSIM4v6_MOD_DSUB: + mod->BSIM4v6dsub = value->rValue; + mod->BSIM4v6dsubGiven = TRUE; + break; + case BSIM4v6_MOD_VTH0: + mod->BSIM4v6vth0 = value->rValue; + mod->BSIM4v6vth0Given = TRUE; + break; + case BSIM4v6_MOD_EU: + mod->BSIM4v6eu = value->rValue; + mod->BSIM4v6euGiven = TRUE; + break; + case BSIM4v6_MOD_UCS: + mod->BSIM4v6ucs = value->rValue; + mod->BSIM4v6ucsGiven = TRUE; + break; + case BSIM4v6_MOD_UA: + mod->BSIM4v6ua = value->rValue; + mod->BSIM4v6uaGiven = TRUE; + break; + case BSIM4v6_MOD_UA1: + mod->BSIM4v6ua1 = value->rValue; + mod->BSIM4v6ua1Given = TRUE; + break; + case BSIM4v6_MOD_UB: + mod->BSIM4v6ub = value->rValue; + mod->BSIM4v6ubGiven = TRUE; + break; + case BSIM4v6_MOD_UB1: + mod->BSIM4v6ub1 = value->rValue; + mod->BSIM4v6ub1Given = TRUE; + break; + case BSIM4v6_MOD_UC: + mod->BSIM4v6uc = value->rValue; + mod->BSIM4v6ucGiven = TRUE; + break; + case BSIM4v6_MOD_UC1: + mod->BSIM4v6uc1 = value->rValue; + mod->BSIM4v6uc1Given = TRUE; + break; + case BSIM4v6_MOD_U0 : + mod->BSIM4v6u0 = value->rValue; + mod->BSIM4v6u0Given = TRUE; + break; + case BSIM4v6_MOD_UTE : + mod->BSIM4v6ute = value->rValue; + mod->BSIM4v6uteGiven = TRUE; + break; + case BSIM4v6_MOD_UCSTE : + mod->BSIM4v6ucste = value->rValue; + mod->BSIM4v6ucsteGiven = TRUE; + break; + case BSIM4v6_MOD_UD: + mod->BSIM4v6ud = value->rValue; + mod->BSIM4v6udGiven = TRUE; + break; + case BSIM4v6_MOD_UD1: + mod->BSIM4v6ud1 = value->rValue; + mod->BSIM4v6ud1Given = TRUE; + break; + case BSIM4v6_MOD_UP: + mod->BSIM4v6up = value->rValue; + mod->BSIM4v6upGiven = TRUE; + break; + case BSIM4v6_MOD_LP: + mod->BSIM4v6lp = value->rValue; + mod->BSIM4v6lpGiven = TRUE; + break; + case BSIM4v6_MOD_LUD: + mod->BSIM4v6lud = value->rValue; + mod->BSIM4v6ludGiven = TRUE; + break; + case BSIM4v6_MOD_LUD1: + mod->BSIM4v6lud1 = value->rValue; + mod->BSIM4v6lud1Given = TRUE; + break; + case BSIM4v6_MOD_LUP: + mod->BSIM4v6lup = value->rValue; + mod->BSIM4v6lupGiven = TRUE; + break; + case BSIM4v6_MOD_LLP: + mod->BSIM4v6llp = value->rValue; + mod->BSIM4v6llpGiven = TRUE; + break; + case BSIM4v6_MOD_WUD: + mod->BSIM4v6wud = value->rValue; + mod->BSIM4v6wudGiven = TRUE; + break; + case BSIM4v6_MOD_WUD1: + mod->BSIM4v6wud1 = value->rValue; + mod->BSIM4v6wud1Given = TRUE; + break; + case BSIM4v6_MOD_WUP: + mod->BSIM4v6wup = value->rValue; + mod->BSIM4v6wupGiven = TRUE; + break; + case BSIM4v6_MOD_WLP: + mod->BSIM4v6wlp = value->rValue; + mod->BSIM4v6wlpGiven = TRUE; + break; + case BSIM4v6_MOD_PUD: + mod->BSIM4v6pud = value->rValue; + mod->BSIM4v6pudGiven = TRUE; + break; + case BSIM4v6_MOD_PUD1: + mod->BSIM4v6pud1 = value->rValue; + mod->BSIM4v6pud1Given = TRUE; + break; + case BSIM4v6_MOD_PUP: + mod->BSIM4v6pup = value->rValue; + mod->BSIM4v6pupGiven = TRUE; + break; + case BSIM4v6_MOD_PLP: + mod->BSIM4v6plp = value->rValue; + mod->BSIM4v6plpGiven = TRUE; + break; + + + case BSIM4v6_MOD_VOFF: + mod->BSIM4v6voff = value->rValue; + mod->BSIM4v6voffGiven = TRUE; + break; + case BSIM4v6_MOD_TVOFF: + mod->BSIM4v6tvoff = value->rValue; + mod->BSIM4v6tvoffGiven = TRUE; + break; + case BSIM4v6_MOD_VOFFL: + mod->BSIM4v6voffl = value->rValue; + mod->BSIM4v6vofflGiven = TRUE; + break; + case BSIM4v6_MOD_VOFFCVL: + mod->BSIM4v6voffcvl = value->rValue; + mod->BSIM4v6voffcvlGiven = TRUE; + break; + case BSIM4v6_MOD_MINV: + mod->BSIM4v6minv = value->rValue; + mod->BSIM4v6minvGiven = TRUE; + break; + case BSIM4v6_MOD_MINVCV: + mod->BSIM4v6minvcv = value->rValue; + mod->BSIM4v6minvcvGiven = TRUE; + break; + case BSIM4v6_MOD_FPROUT: + mod->BSIM4v6fprout = value->rValue; + mod->BSIM4v6fproutGiven = TRUE; + break; + case BSIM4v6_MOD_PDITS: + mod->BSIM4v6pdits = value->rValue; + mod->BSIM4v6pditsGiven = TRUE; + break; + case BSIM4v6_MOD_PDITSD: + mod->BSIM4v6pditsd = value->rValue; + mod->BSIM4v6pditsdGiven = TRUE; + break; + case BSIM4v6_MOD_PDITSL: + mod->BSIM4v6pditsl = value->rValue; + mod->BSIM4v6pditslGiven = TRUE; + break; + case BSIM4v6_MOD_DELTA : + mod->BSIM4v6delta = value->rValue; + mod->BSIM4v6deltaGiven = TRUE; + break; + case BSIM4v6_MOD_RDSW: + mod->BSIM4v6rdsw = value->rValue; + mod->BSIM4v6rdswGiven = TRUE; + break; + case BSIM4v6_MOD_RDSWMIN: + mod->BSIM4v6rdswmin = value->rValue; + mod->BSIM4v6rdswminGiven = TRUE; + break; + case BSIM4v6_MOD_RDWMIN: + mod->BSIM4v6rdwmin = value->rValue; + mod->BSIM4v6rdwminGiven = TRUE; + break; + case BSIM4v6_MOD_RSWMIN: + mod->BSIM4v6rswmin = value->rValue; + mod->BSIM4v6rswminGiven = TRUE; + break; + case BSIM4v6_MOD_RDW: + mod->BSIM4v6rdw = value->rValue; + mod->BSIM4v6rdwGiven = TRUE; + break; + case BSIM4v6_MOD_RSW: + mod->BSIM4v6rsw = value->rValue; + mod->BSIM4v6rswGiven = TRUE; + break; + case BSIM4v6_MOD_PRWG: + mod->BSIM4v6prwg = value->rValue; + mod->BSIM4v6prwgGiven = TRUE; + break; + case BSIM4v6_MOD_PRWB: + mod->BSIM4v6prwb = value->rValue; + mod->BSIM4v6prwbGiven = TRUE; + break; + case BSIM4v6_MOD_PRT: + mod->BSIM4v6prt = value->rValue; + mod->BSIM4v6prtGiven = TRUE; + break; + case BSIM4v6_MOD_ETA0: + mod->BSIM4v6eta0 = value->rValue; + mod->BSIM4v6eta0Given = TRUE; + break; + case BSIM4v6_MOD_ETAB: + mod->BSIM4v6etab = value->rValue; + mod->BSIM4v6etabGiven = TRUE; + break; + case BSIM4v6_MOD_PCLM: + mod->BSIM4v6pclm = value->rValue; + mod->BSIM4v6pclmGiven = TRUE; + break; + case BSIM4v6_MOD_PDIBL1: + mod->BSIM4v6pdibl1 = value->rValue; + mod->BSIM4v6pdibl1Given = TRUE; + break; + case BSIM4v6_MOD_PDIBL2: + mod->BSIM4v6pdibl2 = value->rValue; + mod->BSIM4v6pdibl2Given = TRUE; + break; + case BSIM4v6_MOD_PDIBLB: + mod->BSIM4v6pdiblb = value->rValue; + mod->BSIM4v6pdiblbGiven = TRUE; + break; + case BSIM4v6_MOD_PSCBE1: + mod->BSIM4v6pscbe1 = value->rValue; + mod->BSIM4v6pscbe1Given = TRUE; + break; + case BSIM4v6_MOD_PSCBE2: + mod->BSIM4v6pscbe2 = value->rValue; + mod->BSIM4v6pscbe2Given = TRUE; + break; + case BSIM4v6_MOD_PVAG: + mod->BSIM4v6pvag = value->rValue; + mod->BSIM4v6pvagGiven = TRUE; + break; + case BSIM4v6_MOD_WR : + mod->BSIM4v6wr = value->rValue; + mod->BSIM4v6wrGiven = TRUE; + break; + case BSIM4v6_MOD_DWG : + mod->BSIM4v6dwg = value->rValue; + mod->BSIM4v6dwgGiven = TRUE; + break; + case BSIM4v6_MOD_DWB : + mod->BSIM4v6dwb = value->rValue; + mod->BSIM4v6dwbGiven = TRUE; + break; + case BSIM4v6_MOD_B0 : + mod->BSIM4v6b0 = value->rValue; + mod->BSIM4v6b0Given = TRUE; + break; + case BSIM4v6_MOD_B1 : + mod->BSIM4v6b1 = value->rValue; + mod->BSIM4v6b1Given = TRUE; + break; + case BSIM4v6_MOD_ALPHA0 : + mod->BSIM4v6alpha0 = value->rValue; + mod->BSIM4v6alpha0Given = TRUE; + break; + case BSIM4v6_MOD_ALPHA1 : + mod->BSIM4v6alpha1 = value->rValue; + mod->BSIM4v6alpha1Given = TRUE; + break; + case BSIM4v6_MOD_PHIN : + mod->BSIM4v6phin = value->rValue; + mod->BSIM4v6phinGiven = TRUE; + break; + case BSIM4v6_MOD_AGIDL : + mod->BSIM4v6agidl = value->rValue; + mod->BSIM4v6agidlGiven = TRUE; + break; + case BSIM4v6_MOD_BGIDL : + mod->BSIM4v6bgidl = value->rValue; + mod->BSIM4v6bgidlGiven = TRUE; + break; + case BSIM4v6_MOD_CGIDL : + mod->BSIM4v6cgidl = value->rValue; + mod->BSIM4v6cgidlGiven = TRUE; + break; + case BSIM4v6_MOD_EGIDL : + mod->BSIM4v6egidl = value->rValue; + mod->BSIM4v6egidlGiven = TRUE; + break; + case BSIM4v6_MOD_AGISL : + mod->BSIM4v6agisl = value->rValue; + mod->BSIM4v6agislGiven = TRUE; + break; + case BSIM4v6_MOD_BGISL : + mod->BSIM4v6bgisl = value->rValue; + mod->BSIM4v6bgislGiven = TRUE; + break; + case BSIM4v6_MOD_CGISL : + mod->BSIM4v6cgisl = value->rValue; + mod->BSIM4v6cgislGiven = TRUE; + break; + case BSIM4v6_MOD_EGISL : + mod->BSIM4v6egisl = value->rValue; + mod->BSIM4v6egislGiven = TRUE; + break; + case BSIM4v6_MOD_AIGC : + mod->BSIM4v6aigc = value->rValue; + mod->BSIM4v6aigcGiven = TRUE; + break; + case BSIM4v6_MOD_BIGC : + mod->BSIM4v6bigc = value->rValue; + mod->BSIM4v6bigcGiven = TRUE; + break; + case BSIM4v6_MOD_CIGC : + mod->BSIM4v6cigc = value->rValue; + mod->BSIM4v6cigcGiven = TRUE; + break; + case BSIM4v6_MOD_AIGSD : + mod->BSIM4v6aigsd = value->rValue; + mod->BSIM4v6aigsdGiven = TRUE; + break; + case BSIM4v6_MOD_BIGSD : + mod->BSIM4v6bigsd = value->rValue; + mod->BSIM4v6bigsdGiven = TRUE; + break; + case BSIM4v6_MOD_CIGSD : + mod->BSIM4v6cigsd = value->rValue; + mod->BSIM4v6cigsdGiven = TRUE; + break; + case BSIM4v6_MOD_AIGS : + mod->BSIM4v6aigs = value->rValue; + mod->BSIM4v6aigsGiven = TRUE; + break; + case BSIM4v6_MOD_BIGS : + mod->BSIM4v6bigs = value->rValue; + mod->BSIM4v6bigsGiven = TRUE; + break; + case BSIM4v6_MOD_CIGS : + mod->BSIM4v6cigs = value->rValue; + mod->BSIM4v6cigsGiven = TRUE; + break; + case BSIM4v6_MOD_AIGD : + mod->BSIM4v6aigd = value->rValue; + mod->BSIM4v6aigdGiven = TRUE; + break; + case BSIM4v6_MOD_BIGD : + mod->BSIM4v6bigd = value->rValue; + mod->BSIM4v6bigdGiven = TRUE; + break; + case BSIM4v6_MOD_CIGD : + mod->BSIM4v6cigd = value->rValue; + mod->BSIM4v6cigdGiven = TRUE; + break; + case BSIM4v6_MOD_AIGBACC : + mod->BSIM4v6aigbacc = value->rValue; + mod->BSIM4v6aigbaccGiven = TRUE; + break; + case BSIM4v6_MOD_BIGBACC : + mod->BSIM4v6bigbacc = value->rValue; + mod->BSIM4v6bigbaccGiven = TRUE; + break; + case BSIM4v6_MOD_CIGBACC : + mod->BSIM4v6cigbacc = value->rValue; + mod->BSIM4v6cigbaccGiven = TRUE; + break; + case BSIM4v6_MOD_AIGBINV : + mod->BSIM4v6aigbinv = value->rValue; + mod->BSIM4v6aigbinvGiven = TRUE; + break; + case BSIM4v6_MOD_BIGBINV : + mod->BSIM4v6bigbinv = value->rValue; + mod->BSIM4v6bigbinvGiven = TRUE; + break; + case BSIM4v6_MOD_CIGBINV : + mod->BSIM4v6cigbinv = value->rValue; + mod->BSIM4v6cigbinvGiven = TRUE; + break; + case BSIM4v6_MOD_NIGC : + mod->BSIM4v6nigc = value->rValue; + mod->BSIM4v6nigcGiven = TRUE; + break; + case BSIM4v6_MOD_NIGBINV : + mod->BSIM4v6nigbinv = value->rValue; + mod->BSIM4v6nigbinvGiven = TRUE; + break; + case BSIM4v6_MOD_NIGBACC : + mod->BSIM4v6nigbacc = value->rValue; + mod->BSIM4v6nigbaccGiven = TRUE; + break; + case BSIM4v6_MOD_NTOX : + mod->BSIM4v6ntox = value->rValue; + mod->BSIM4v6ntoxGiven = TRUE; + break; + case BSIM4v6_MOD_EIGBINV : + mod->BSIM4v6eigbinv = value->rValue; + mod->BSIM4v6eigbinvGiven = TRUE; + break; + case BSIM4v6_MOD_PIGCD : + mod->BSIM4v6pigcd = value->rValue; + mod->BSIM4v6pigcdGiven = TRUE; + break; + case BSIM4v6_MOD_POXEDGE : + mod->BSIM4v6poxedge = value->rValue; + mod->BSIM4v6poxedgeGiven = TRUE; + break; + case BSIM4v6_MOD_XRCRG1 : + mod->BSIM4v6xrcrg1 = value->rValue; + mod->BSIM4v6xrcrg1Given = TRUE; + break; + case BSIM4v6_MOD_XRCRG2 : + mod->BSIM4v6xrcrg2 = value->rValue; + mod->BSIM4v6xrcrg2Given = TRUE; + break; + case BSIM4v6_MOD_LAMBDA : + mod->BSIM4v6lambda = value->rValue; + mod->BSIM4v6lambdaGiven = TRUE; + break; + case BSIM4v6_MOD_VTL : + mod->BSIM4v6vtl = value->rValue; + mod->BSIM4v6vtlGiven = TRUE; + break; + case BSIM4v6_MOD_XN: + mod->BSIM4v6xn = value->rValue; + mod->BSIM4v6xnGiven = TRUE; + break; + case BSIM4v6_MOD_LC: + mod->BSIM4v6lc = value->rValue; + mod->BSIM4v6lcGiven = TRUE; + break; + case BSIM4v6_MOD_TNOIA : + mod->BSIM4v6tnoia = value->rValue; + mod->BSIM4v6tnoiaGiven = TRUE; + break; + case BSIM4v6_MOD_TNOIB : + mod->BSIM4v6tnoib = value->rValue; + mod->BSIM4v6tnoibGiven = TRUE; + break; + case BSIM4v6_MOD_RNOIA : + mod->BSIM4v6rnoia = value->rValue; + mod->BSIM4v6rnoiaGiven = TRUE; + break; + case BSIM4v6_MOD_RNOIB : + mod->BSIM4v6rnoib = value->rValue; + mod->BSIM4v6rnoibGiven = TRUE; + break; + case BSIM4v6_MOD_NTNOI : + mod->BSIM4v6ntnoi = value->rValue; + mod->BSIM4v6ntnoiGiven = TRUE; + break; + case BSIM4v6_MOD_VFBSDOFF: + mod->BSIM4v6vfbsdoff = value->rValue; + mod->BSIM4v6vfbsdoffGiven = TRUE; + break; + case BSIM4v6_MOD_TVFBSDOFF: + mod->BSIM4v6tvfbsdoff = value->rValue; + mod->BSIM4v6tvfbsdoffGiven = TRUE; + break; + case BSIM4v6_MOD_LINTNOI: + mod->BSIM4v6lintnoi = value->rValue; + mod->BSIM4v6lintnoiGiven = TRUE; + break; + + /* stress effect */ + case BSIM4v6_MOD_SAREF : + mod->BSIM4v6saref = value->rValue; + mod->BSIM4v6sarefGiven = TRUE; + break; + case BSIM4v6_MOD_SBREF : + mod->BSIM4v6sbref = value->rValue; + mod->BSIM4v6sbrefGiven = TRUE; + break; + case BSIM4v6_MOD_WLOD : + mod->BSIM4v6wlod = value->rValue; + mod->BSIM4v6wlodGiven = TRUE; + break; + case BSIM4v6_MOD_KU0 : + mod->BSIM4v6ku0 = value->rValue; + mod->BSIM4v6ku0Given = TRUE; + break; + case BSIM4v6_MOD_KVSAT : + mod->BSIM4v6kvsat = value->rValue; + mod->BSIM4v6kvsatGiven = TRUE; + break; + case BSIM4v6_MOD_KVTH0 : + mod->BSIM4v6kvth0 = value->rValue; + mod->BSIM4v6kvth0Given = TRUE; + break; + case BSIM4v6_MOD_TKU0 : + mod->BSIM4v6tku0 = value->rValue; + mod->BSIM4v6tku0Given = TRUE; + break; + case BSIM4v6_MOD_LLODKU0 : + mod->BSIM4v6llodku0 = value->rValue; + mod->BSIM4v6llodku0Given = TRUE; + break; + case BSIM4v6_MOD_WLODKU0 : + mod->BSIM4v6wlodku0 = value->rValue; + mod->BSIM4v6wlodku0Given = TRUE; + break; + case BSIM4v6_MOD_LLODVTH : + mod->BSIM4v6llodvth = value->rValue; + mod->BSIM4v6llodvthGiven = TRUE; + break; + case BSIM4v6_MOD_WLODVTH : + mod->BSIM4v6wlodvth = value->rValue; + mod->BSIM4v6wlodvthGiven = TRUE; + break; + case BSIM4v6_MOD_LKU0 : + mod->BSIM4v6lku0 = value->rValue; + mod->BSIM4v6lku0Given = TRUE; + break; + case BSIM4v6_MOD_WKU0 : + mod->BSIM4v6wku0 = value->rValue; + mod->BSIM4v6wku0Given = TRUE; + break; + case BSIM4v6_MOD_PKU0 : + mod->BSIM4v6pku0 = value->rValue; + mod->BSIM4v6pku0Given = TRUE; + break; + case BSIM4v6_MOD_LKVTH0 : + mod->BSIM4v6lkvth0 = value->rValue; + mod->BSIM4v6lkvth0Given = TRUE; + break; + case BSIM4v6_MOD_WKVTH0 : + mod->BSIM4v6wkvth0 = value->rValue; + mod->BSIM4v6wkvth0Given = TRUE; + break; + case BSIM4v6_MOD_PKVTH0 : + mod->BSIM4v6pkvth0 = value->rValue; + mod->BSIM4v6pkvth0Given = TRUE; + break; + case BSIM4v6_MOD_STK2 : + mod->BSIM4v6stk2 = value->rValue; + mod->BSIM4v6stk2Given = TRUE; + break; + case BSIM4v6_MOD_LODK2 : + mod->BSIM4v6lodk2 = value->rValue; + mod->BSIM4v6lodk2Given = TRUE; + break; + case BSIM4v6_MOD_STETA0 : + mod->BSIM4v6steta0 = value->rValue; + mod->BSIM4v6steta0Given = TRUE; + break; + case BSIM4v6_MOD_LODETA0 : + mod->BSIM4v6lodeta0 = value->rValue; + mod->BSIM4v6lodeta0Given = TRUE; + break; + + case BSIM4v6_MOD_WEB : + mod->BSIM4v6web = value->rValue; + mod->BSIM4v6webGiven = TRUE; + break; + case BSIM4v6_MOD_WEC : + mod->BSIM4v6wec = value->rValue; + mod->BSIM4v6wecGiven = TRUE; + break; + case BSIM4v6_MOD_KVTH0WE : + mod->BSIM4v6kvth0we = value->rValue; + mod->BSIM4v6kvth0weGiven = TRUE; + break; + case BSIM4v6_MOD_K2WE : + mod->BSIM4v6k2we = value->rValue; + mod->BSIM4v6k2weGiven = TRUE; + break; + case BSIM4v6_MOD_KU0WE : + mod->BSIM4v6ku0we = value->rValue; + mod->BSIM4v6ku0weGiven = TRUE; + break; + case BSIM4v6_MOD_SCREF : + mod->BSIM4v6scref = value->rValue; + mod->BSIM4v6screfGiven = TRUE; + break; + case BSIM4v6_MOD_WPEMOD : + mod->BSIM4v6wpemod = value->rValue; + mod->BSIM4v6wpemodGiven = TRUE; + break; + case BSIM4v6_MOD_LKVTH0WE : + mod->BSIM4v6lkvth0we = value->rValue; + mod->BSIM4v6lkvth0weGiven = TRUE; + break; + case BSIM4v6_MOD_LK2WE : + mod->BSIM4v6lk2we = value->rValue; + mod->BSIM4v6lk2weGiven = TRUE; + break; + case BSIM4v6_MOD_LKU0WE : + mod->BSIM4v6lku0we = value->rValue; + mod->BSIM4v6lku0weGiven = TRUE; + break; + case BSIM4v6_MOD_WKVTH0WE : + mod->BSIM4v6wkvth0we = value->rValue; + mod->BSIM4v6wkvth0weGiven = TRUE; + break; + case BSIM4v6_MOD_WK2WE : + mod->BSIM4v6wk2we = value->rValue; + mod->BSIM4v6wk2weGiven = TRUE; + break; + case BSIM4v6_MOD_WKU0WE : + mod->BSIM4v6wku0we = value->rValue; + mod->BSIM4v6wku0weGiven = TRUE; + break; + case BSIM4v6_MOD_PKVTH0WE : + mod->BSIM4v6pkvth0we = value->rValue; + mod->BSIM4v6pkvth0weGiven = TRUE; + break; + case BSIM4v6_MOD_PK2WE : + mod->BSIM4v6pk2we = value->rValue; + mod->BSIM4v6pk2weGiven = TRUE; + break; + case BSIM4v6_MOD_PKU0WE : + mod->BSIM4v6pku0we = value->rValue; + mod->BSIM4v6pku0weGiven = TRUE; + break; + + case BSIM4v6_MOD_BETA0 : + mod->BSIM4v6beta0 = value->rValue; + mod->BSIM4v6beta0Given = TRUE; + break; + case BSIM4v6_MOD_IJTHDFWD : + mod->BSIM4v6ijthdfwd = value->rValue; + mod->BSIM4v6ijthdfwdGiven = TRUE; + break; + case BSIM4v6_MOD_IJTHSFWD : + mod->BSIM4v6ijthsfwd = value->rValue; + mod->BSIM4v6ijthsfwdGiven = TRUE; + break; + case BSIM4v6_MOD_IJTHDREV : + mod->BSIM4v6ijthdrev = value->rValue; + mod->BSIM4v6ijthdrevGiven = TRUE; + break; + case BSIM4v6_MOD_IJTHSREV : + mod->BSIM4v6ijthsrev = value->rValue; + mod->BSIM4v6ijthsrevGiven = TRUE; + break; + case BSIM4v6_MOD_XJBVD : + mod->BSIM4v6xjbvd = value->rValue; + mod->BSIM4v6xjbvdGiven = TRUE; + break; + case BSIM4v6_MOD_XJBVS : + mod->BSIM4v6xjbvs = value->rValue; + mod->BSIM4v6xjbvsGiven = TRUE; + break; + case BSIM4v6_MOD_BVD : + mod->BSIM4v6bvd = value->rValue; + mod->BSIM4v6bvdGiven = TRUE; + break; + case BSIM4v6_MOD_BVS : + mod->BSIM4v6bvs = value->rValue; + mod->BSIM4v6bvsGiven = TRUE; + break; + + /* reverse diode */ + case BSIM4v6_MOD_JTSS : + mod->BSIM4v6jtss = value->rValue; + mod->BSIM4v6jtssGiven = TRUE; + break; + case BSIM4v6_MOD_JTSD : + mod->BSIM4v6jtsd = value->rValue; + mod->BSIM4v6jtsdGiven = TRUE; + break; + case BSIM4v6_MOD_JTSSWS : + mod->BSIM4v6jtssws = value->rValue; + mod->BSIM4v6jtsswsGiven = TRUE; + break; + case BSIM4v6_MOD_JTSSWD : + mod->BSIM4v6jtsswd = value->rValue; + mod->BSIM4v6jtsswdGiven = TRUE; + break; + case BSIM4v6_MOD_JTSSWGS : + mod->BSIM4v6jtsswgs = value->rValue; + mod->BSIM4v6jtsswgsGiven = TRUE; + break; + case BSIM4v6_MOD_JTSSWGD : + mod->BSIM4v6jtsswgd = value->rValue; + mod->BSIM4v6jtsswgdGiven = TRUE; + break; + case BSIM4v6_MOD_JTWEFF : + mod->BSIM4v6jtweff = value->rValue; + mod->BSIM4v6jtweffGiven = TRUE; + break; + case BSIM4v6_MOD_NJTS : + mod->BSIM4v6njts = value->rValue; + mod->BSIM4v6njtsGiven = TRUE; + break; + case BSIM4v6_MOD_NJTSSW : + mod->BSIM4v6njtssw = value->rValue; + mod->BSIM4v6njtsswGiven = TRUE; + break; + case BSIM4v6_MOD_NJTSSWG : + mod->BSIM4v6njtsswg = value->rValue; + mod->BSIM4v6njtsswgGiven = TRUE; + break; + case BSIM4v6_MOD_NJTSD : + mod->BSIM4v6njtsd = value->rValue; + mod->BSIM4v6njtsdGiven = TRUE; + break; + case BSIM4v6_MOD_NJTSSWD : + mod->BSIM4v6njtsswd = value->rValue; + mod->BSIM4v6njtsswdGiven = TRUE; + break; + case BSIM4v6_MOD_NJTSSWGD : + mod->BSIM4v6njtsswgd = value->rValue; + mod->BSIM4v6njtsswgdGiven = TRUE; + break; + case BSIM4v6_MOD_XTSS : + mod->BSIM4v6xtss = value->rValue; + mod->BSIM4v6xtssGiven = TRUE; + break; + case BSIM4v6_MOD_XTSD : + mod->BSIM4v6xtsd = value->rValue; + mod->BSIM4v6xtsdGiven = TRUE; + break; + case BSIM4v6_MOD_XTSSWS : + mod->BSIM4v6xtssws = value->rValue; + mod->BSIM4v6xtsswsGiven = TRUE; + break; + case BSIM4v6_MOD_XTSSWD : + mod->BSIM4v6xtsswd = value->rValue; + mod->BSIM4v6xtsswdGiven = TRUE; + break; + case BSIM4v6_MOD_XTSSWGS : + mod->BSIM4v6xtsswgs = value->rValue; + mod->BSIM4v6xtsswgsGiven = TRUE; + break; + case BSIM4v6_MOD_XTSSWGD : + mod->BSIM4v6xtsswgd = value->rValue; + mod->BSIM4v6xtsswgdGiven = TRUE; + break; + case BSIM4v6_MOD_TNJTS : + mod->BSIM4v6tnjts = value->rValue; + mod->BSIM4v6tnjtsGiven = TRUE; + break; + case BSIM4v6_MOD_TNJTSSW : + mod->BSIM4v6tnjtssw = value->rValue; + mod->BSIM4v6tnjtsswGiven = TRUE; + break; + case BSIM4v6_MOD_TNJTSSWG : + mod->BSIM4v6tnjtsswg = value->rValue; + mod->BSIM4v6tnjtsswgGiven = TRUE; + break; + case BSIM4v6_MOD_TNJTSD : + mod->BSIM4v6tnjtsd = value->rValue; + mod->BSIM4v6tnjtsdGiven = TRUE; + break; + case BSIM4v6_MOD_TNJTSSWD : + mod->BSIM4v6tnjtsswd = value->rValue; + mod->BSIM4v6tnjtsswdGiven = TRUE; + break; + case BSIM4v6_MOD_TNJTSSWGD : + mod->BSIM4v6tnjtsswgd = value->rValue; + mod->BSIM4v6tnjtsswgdGiven = TRUE; + break; + case BSIM4v6_MOD_VTSS : + mod->BSIM4v6vtss = value->rValue; + mod->BSIM4v6vtssGiven = TRUE; + break; + case BSIM4v6_MOD_VTSD : + mod->BSIM4v6vtsd = value->rValue; + mod->BSIM4v6vtsdGiven = TRUE; + break; + case BSIM4v6_MOD_VTSSWS : + mod->BSIM4v6vtssws = value->rValue; + mod->BSIM4v6vtsswsGiven = TRUE; + break; + case BSIM4v6_MOD_VTSSWD : + mod->BSIM4v6vtsswd = value->rValue; + mod->BSIM4v6vtsswdGiven = TRUE; + break; + case BSIM4v6_MOD_VTSSWGS : + mod->BSIM4v6vtsswgs = value->rValue; + mod->BSIM4v6vtsswgsGiven = TRUE; + break; + case BSIM4v6_MOD_VTSSWGD : + mod->BSIM4v6vtsswgd = value->rValue; + mod->BSIM4v6vtsswgdGiven = TRUE; + break; + + case BSIM4v6_MOD_VFB : + mod->BSIM4v6vfb = value->rValue; + mod->BSIM4v6vfbGiven = TRUE; + break; + + case BSIM4v6_MOD_GBMIN : + mod->BSIM4v6gbmin = value->rValue; + mod->BSIM4v6gbminGiven = TRUE; + break; + case BSIM4v6_MOD_RBDB : + mod->BSIM4v6rbdb = value->rValue; + mod->BSIM4v6rbdbGiven = TRUE; + break; + case BSIM4v6_MOD_RBPB : + mod->BSIM4v6rbpb = value->rValue; + mod->BSIM4v6rbpbGiven = TRUE; + break; + case BSIM4v6_MOD_RBSB : + mod->BSIM4v6rbsb = value->rValue; + mod->BSIM4v6rbsbGiven = TRUE; + break; + case BSIM4v6_MOD_RBPS : + mod->BSIM4v6rbps = value->rValue; + mod->BSIM4v6rbpsGiven = TRUE; + break; + case BSIM4v6_MOD_RBPD : + mod->BSIM4v6rbpd = value->rValue; + mod->BSIM4v6rbpdGiven = TRUE; + break; + + case BSIM4v6_MOD_RBPS0 : + mod->BSIM4v6rbps0 = value->rValue; + mod->BSIM4v6rbps0Given = TRUE; + break; + case BSIM4v6_MOD_RBPSL : + mod->BSIM4v6rbpsl = value->rValue; + mod->BSIM4v6rbpslGiven = TRUE; + break; + case BSIM4v6_MOD_RBPSW : + mod->BSIM4v6rbpsw = value->rValue; + mod->BSIM4v6rbpswGiven = TRUE; + break; + case BSIM4v6_MOD_RBPSNF : + mod->BSIM4v6rbpsnf = value->rValue; + mod->BSIM4v6rbpsnfGiven = TRUE; + break; + + case BSIM4v6_MOD_RBPD0 : + mod->BSIM4v6rbpd0 = value->rValue; + mod->BSIM4v6rbpd0Given = TRUE; + break; + case BSIM4v6_MOD_RBPDL : + mod->BSIM4v6rbpdl = value->rValue; + mod->BSIM4v6rbpdlGiven = TRUE; + break; + case BSIM4v6_MOD_RBPDW : + mod->BSIM4v6rbpdw = value->rValue; + mod->BSIM4v6rbpdwGiven = TRUE; + break; + case BSIM4v6_MOD_RBPDNF : + mod->BSIM4v6rbpdnf = value->rValue; + mod->BSIM4v6rbpdnfGiven = TRUE; + break; + + case BSIM4v6_MOD_RBPBX0 : + mod->BSIM4v6rbpbx0 = value->rValue; + mod->BSIM4v6rbpbx0Given = TRUE; + break; + case BSIM4v6_MOD_RBPBXL : + mod->BSIM4v6rbpbxl = value->rValue; + mod->BSIM4v6rbpbxlGiven = TRUE; + break; + case BSIM4v6_MOD_RBPBXW : + mod->BSIM4v6rbpbxw = value->rValue; + mod->BSIM4v6rbpbxwGiven = TRUE; + break; + case BSIM4v6_MOD_RBPBXNF : + mod->BSIM4v6rbpbxnf = value->rValue; + mod->BSIM4v6rbpbxnfGiven = TRUE; + break; + case BSIM4v6_MOD_RBPBY0 : + mod->BSIM4v6rbpby0 = value->rValue; + mod->BSIM4v6rbpby0Given = TRUE; + break; + case BSIM4v6_MOD_RBPBYL : + mod->BSIM4v6rbpbyl = value->rValue; + mod->BSIM4v6rbpbylGiven = TRUE; + break; + case BSIM4v6_MOD_RBPBYW : + mod->BSIM4v6rbpbyw = value->rValue; + mod->BSIM4v6rbpbywGiven = TRUE; + break; + case BSIM4v6_MOD_RBPBYNF : + mod->BSIM4v6rbpbynf = value->rValue; + mod->BSIM4v6rbpbynfGiven = TRUE; + break; + case BSIM4v6_MOD_RBSBX0 : + mod->BSIM4v6rbsbx0 = value->rValue; + mod->BSIM4v6rbsbx0Given = TRUE; + break; + case BSIM4v6_MOD_RBSBY0 : + mod->BSIM4v6rbsby0 = value->rValue; + mod->BSIM4v6rbsby0Given = TRUE; + break; + case BSIM4v6_MOD_RBDBX0 : + mod->BSIM4v6rbdbx0 = value->rValue; + mod->BSIM4v6rbdbx0Given = TRUE; + break; + case BSIM4v6_MOD_RBDBY0 : + mod->BSIM4v6rbdby0 = value->rValue; + mod->BSIM4v6rbdby0Given = TRUE; + break; + + + case BSIM4v6_MOD_RBSDBXL : + mod->BSIM4v6rbsdbxl = value->rValue; + mod->BSIM4v6rbsdbxlGiven = TRUE; + break; + case BSIM4v6_MOD_RBSDBXW : + mod->BSIM4v6rbsdbxw = value->rValue; + mod->BSIM4v6rbsdbxwGiven = TRUE; + break; + case BSIM4v6_MOD_RBSDBXNF : + mod->BSIM4v6rbsdbxnf = value->rValue; + mod->BSIM4v6rbsdbxnfGiven = TRUE; + break; + case BSIM4v6_MOD_RBSDBYL : + mod->BSIM4v6rbsdbyl = value->rValue; + mod->BSIM4v6rbsdbylGiven = TRUE; + break; + case BSIM4v6_MOD_RBSDBYW : + mod->BSIM4v6rbsdbyw = value->rValue; + mod->BSIM4v6rbsdbywGiven = TRUE; + break; + case BSIM4v6_MOD_RBSDBYNF : + mod->BSIM4v6rbsdbynf = value->rValue; + mod->BSIM4v6rbsdbynfGiven = TRUE; + break; + + case BSIM4v6_MOD_CGSL : + mod->BSIM4v6cgsl = value->rValue; + mod->BSIM4v6cgslGiven = TRUE; + break; + case BSIM4v6_MOD_CGDL : + mod->BSIM4v6cgdl = value->rValue; + mod->BSIM4v6cgdlGiven = TRUE; + break; + case BSIM4v6_MOD_CKAPPAS : + mod->BSIM4v6ckappas = value->rValue; + mod->BSIM4v6ckappasGiven = TRUE; + break; + case BSIM4v6_MOD_CKAPPAD : + mod->BSIM4v6ckappad = value->rValue; + mod->BSIM4v6ckappadGiven = TRUE; + break; + case BSIM4v6_MOD_CF : + mod->BSIM4v6cf = value->rValue; + mod->BSIM4v6cfGiven = TRUE; + break; + case BSIM4v6_MOD_CLC : + mod->BSIM4v6clc = value->rValue; + mod->BSIM4v6clcGiven = TRUE; + break; + case BSIM4v6_MOD_CLE : + mod->BSIM4v6cle = value->rValue; + mod->BSIM4v6cleGiven = TRUE; + break; + case BSIM4v6_MOD_DWC : + mod->BSIM4v6dwc = value->rValue; + mod->BSIM4v6dwcGiven = TRUE; + break; + case BSIM4v6_MOD_DLC : + mod->BSIM4v6dlc = value->rValue; + mod->BSIM4v6dlcGiven = TRUE; + break; + case BSIM4v6_MOD_XW : + mod->BSIM4v6xw = value->rValue; + mod->BSIM4v6xwGiven = TRUE; + break; + case BSIM4v6_MOD_XL : + mod->BSIM4v6xl = value->rValue; + mod->BSIM4v6xlGiven = TRUE; + break; + case BSIM4v6_MOD_DLCIG : + mod->BSIM4v6dlcig = value->rValue; + mod->BSIM4v6dlcigGiven = TRUE; + break; + case BSIM4v6_MOD_DLCIGD : + mod->BSIM4v6dlcigd = value->rValue; + mod->BSIM4v6dlcigdGiven = TRUE; + break; + case BSIM4v6_MOD_DWJ : + mod->BSIM4v6dwj = value->rValue; + mod->BSIM4v6dwjGiven = TRUE; + break; + case BSIM4v6_MOD_VFBCV : + mod->BSIM4v6vfbcv = value->rValue; + mod->BSIM4v6vfbcvGiven = TRUE; + break; + case BSIM4v6_MOD_ACDE : + mod->BSIM4v6acde = value->rValue; + mod->BSIM4v6acdeGiven = TRUE; + break; + case BSIM4v6_MOD_MOIN : + mod->BSIM4v6moin = value->rValue; + mod->BSIM4v6moinGiven = TRUE; + break; + case BSIM4v6_MOD_NOFF : + mod->BSIM4v6noff = value->rValue; + mod->BSIM4v6noffGiven = TRUE; + break; + case BSIM4v6_MOD_VOFFCV : + mod->BSIM4v6voffcv = value->rValue; + mod->BSIM4v6voffcvGiven = TRUE; + break; + case BSIM4v6_MOD_DMCG : + mod->BSIM4v6dmcg = value->rValue; + mod->BSIM4v6dmcgGiven = TRUE; + break; + case BSIM4v6_MOD_DMCI : + mod->BSIM4v6dmci = value->rValue; + mod->BSIM4v6dmciGiven = TRUE; + break; + case BSIM4v6_MOD_DMDG : + mod->BSIM4v6dmdg = value->rValue; + mod->BSIM4v6dmdgGiven = TRUE; + break; + case BSIM4v6_MOD_DMCGT : + mod->BSIM4v6dmcgt = value->rValue; + mod->BSIM4v6dmcgtGiven = TRUE; + break; + case BSIM4v6_MOD_XGW : + mod->BSIM4v6xgw = value->rValue; + mod->BSIM4v6xgwGiven = TRUE; + break; + case BSIM4v6_MOD_XGL : + mod->BSIM4v6xgl = value->rValue; + mod->BSIM4v6xglGiven = TRUE; + break; + case BSIM4v6_MOD_RSHG : + mod->BSIM4v6rshg = value->rValue; + mod->BSIM4v6rshgGiven = TRUE; + break; + case BSIM4v6_MOD_NGCON : + mod->BSIM4v6ngcon = value->rValue; + mod->BSIM4v6ngconGiven = TRUE; + break; + case BSIM4v6_MOD_TCJ : + mod->BSIM4v6tcj = value->rValue; + mod->BSIM4v6tcjGiven = TRUE; + break; + case BSIM4v6_MOD_TPB : + mod->BSIM4v6tpb = value->rValue; + mod->BSIM4v6tpbGiven = TRUE; + break; + case BSIM4v6_MOD_TCJSW : + mod->BSIM4v6tcjsw = value->rValue; + mod->BSIM4v6tcjswGiven = TRUE; + break; + case BSIM4v6_MOD_TPBSW : + mod->BSIM4v6tpbsw = value->rValue; + mod->BSIM4v6tpbswGiven = TRUE; + break; + case BSIM4v6_MOD_TCJSWG : + mod->BSIM4v6tcjswg = value->rValue; + mod->BSIM4v6tcjswgGiven = TRUE; + break; + case BSIM4v6_MOD_TPBSWG : + mod->BSIM4v6tpbswg = value->rValue; + mod->BSIM4v6tpbswgGiven = TRUE; + break; + + /* Length dependence */ + case BSIM4v6_MOD_LCDSC : + mod->BSIM4v6lcdsc = value->rValue; + mod->BSIM4v6lcdscGiven = TRUE; + break; + + + case BSIM4v6_MOD_LCDSCB : + mod->BSIM4v6lcdscb = value->rValue; + mod->BSIM4v6lcdscbGiven = TRUE; + break; + case BSIM4v6_MOD_LCDSCD : + mod->BSIM4v6lcdscd = value->rValue; + mod->BSIM4v6lcdscdGiven = TRUE; + break; + case BSIM4v6_MOD_LCIT : + mod->BSIM4v6lcit = value->rValue; + mod->BSIM4v6lcitGiven = TRUE; + break; + case BSIM4v6_MOD_LNFACTOR : + mod->BSIM4v6lnfactor = value->rValue; + mod->BSIM4v6lnfactorGiven = TRUE; + break; + case BSIM4v6_MOD_LXJ: + mod->BSIM4v6lxj = value->rValue; + mod->BSIM4v6lxjGiven = TRUE; + break; + case BSIM4v6_MOD_LVSAT: + mod->BSIM4v6lvsat = value->rValue; + mod->BSIM4v6lvsatGiven = TRUE; + break; + + + case BSIM4v6_MOD_LA0: + mod->BSIM4v6la0 = value->rValue; + mod->BSIM4v6la0Given = TRUE; + break; + case BSIM4v6_MOD_LAGS: + mod->BSIM4v6lags = value->rValue; + mod->BSIM4v6lagsGiven = TRUE; + break; + case BSIM4v6_MOD_LA1: + mod->BSIM4v6la1 = value->rValue; + mod->BSIM4v6la1Given = TRUE; + break; + case BSIM4v6_MOD_LA2: + mod->BSIM4v6la2 = value->rValue; + mod->BSIM4v6la2Given = TRUE; + break; + case BSIM4v6_MOD_LAT: + mod->BSIM4v6lat = value->rValue; + mod->BSIM4v6latGiven = TRUE; + break; + case BSIM4v6_MOD_LKETA: + mod->BSIM4v6lketa = value->rValue; + mod->BSIM4v6lketaGiven = TRUE; + break; + case BSIM4v6_MOD_LNSUB: + mod->BSIM4v6lnsub = value->rValue; + mod->BSIM4v6lnsubGiven = TRUE; + break; + case BSIM4v6_MOD_LNDEP: + mod->BSIM4v6lndep = value->rValue; + mod->BSIM4v6lndepGiven = TRUE; + if (mod->BSIM4v6lndep > 1.0e20) + mod->BSIM4v6lndep *= 1.0e-6; + break; + case BSIM4v6_MOD_LNSD: + mod->BSIM4v6lnsd = value->rValue; + mod->BSIM4v6lnsdGiven = TRUE; + if (mod->BSIM4v6lnsd > 1.0e23) + mod->BSIM4v6lnsd *= 1.0e-6; + break; + case BSIM4v6_MOD_LNGATE: + mod->BSIM4v6lngate = value->rValue; + mod->BSIM4v6lngateGiven = TRUE; + if (mod->BSIM4v6lngate > 1.0e23) + mod->BSIM4v6lngate *= 1.0e-6; + break; + case BSIM4v6_MOD_LGAMMA1: + mod->BSIM4v6lgamma1 = value->rValue; + mod->BSIM4v6lgamma1Given = TRUE; + break; + case BSIM4v6_MOD_LGAMMA2: + mod->BSIM4v6lgamma2 = value->rValue; + mod->BSIM4v6lgamma2Given = TRUE; + break; + case BSIM4v6_MOD_LVBX: + mod->BSIM4v6lvbx = value->rValue; + mod->BSIM4v6lvbxGiven = TRUE; + break; + case BSIM4v6_MOD_LVBM: + mod->BSIM4v6lvbm = value->rValue; + mod->BSIM4v6lvbmGiven = TRUE; + break; + case BSIM4v6_MOD_LXT: + mod->BSIM4v6lxt = value->rValue; + mod->BSIM4v6lxtGiven = TRUE; + break; + case BSIM4v6_MOD_LK1: + mod->BSIM4v6lk1 = value->rValue; + mod->BSIM4v6lk1Given = TRUE; + break; + case BSIM4v6_MOD_LKT1: + mod->BSIM4v6lkt1 = value->rValue; + mod->BSIM4v6lkt1Given = TRUE; + break; + case BSIM4v6_MOD_LKT1L: + mod->BSIM4v6lkt1l = value->rValue; + mod->BSIM4v6lkt1lGiven = TRUE; + break; + case BSIM4v6_MOD_LKT2: + mod->BSIM4v6lkt2 = value->rValue; + mod->BSIM4v6lkt2Given = TRUE; + break; + case BSIM4v6_MOD_LK2: + mod->BSIM4v6lk2 = value->rValue; + mod->BSIM4v6lk2Given = TRUE; + break; + case BSIM4v6_MOD_LK3: + mod->BSIM4v6lk3 = value->rValue; + mod->BSIM4v6lk3Given = TRUE; + break; + case BSIM4v6_MOD_LK3B: + mod->BSIM4v6lk3b = value->rValue; + mod->BSIM4v6lk3bGiven = TRUE; + break; + case BSIM4v6_MOD_LLPE0: + mod->BSIM4v6llpe0 = value->rValue; + mod->BSIM4v6llpe0Given = TRUE; + break; + case BSIM4v6_MOD_LLPEB: + mod->BSIM4v6llpeb = value->rValue; + mod->BSIM4v6llpebGiven = TRUE; + break; + case BSIM4v6_MOD_LDVTP0: + mod->BSIM4v6ldvtp0 = value->rValue; + mod->BSIM4v6ldvtp0Given = TRUE; + break; + case BSIM4v6_MOD_LDVTP1: + mod->BSIM4v6ldvtp1 = value->rValue; + mod->BSIM4v6ldvtp1Given = TRUE; + break; + case BSIM4v6_MOD_LW0: + mod->BSIM4v6lw0 = value->rValue; + mod->BSIM4v6lw0Given = TRUE; + break; + case BSIM4v6_MOD_LDVT0: + mod->BSIM4v6ldvt0 = value->rValue; + mod->BSIM4v6ldvt0Given = TRUE; + break; + case BSIM4v6_MOD_LDVT1: + mod->BSIM4v6ldvt1 = value->rValue; + mod->BSIM4v6ldvt1Given = TRUE; + break; + case BSIM4v6_MOD_LDVT2: + mod->BSIM4v6ldvt2 = value->rValue; + mod->BSIM4v6ldvt2Given = TRUE; + break; + case BSIM4v6_MOD_LDVT0W: + mod->BSIM4v6ldvt0w = value->rValue; + mod->BSIM4v6ldvt0wGiven = TRUE; + break; + case BSIM4v6_MOD_LDVT1W: + mod->BSIM4v6ldvt1w = value->rValue; + mod->BSIM4v6ldvt1wGiven = TRUE; + break; + case BSIM4v6_MOD_LDVT2W: + mod->BSIM4v6ldvt2w = value->rValue; + mod->BSIM4v6ldvt2wGiven = TRUE; + break; + case BSIM4v6_MOD_LDROUT: + mod->BSIM4v6ldrout = value->rValue; + mod->BSIM4v6ldroutGiven = TRUE; + break; + case BSIM4v6_MOD_LDSUB: + mod->BSIM4v6ldsub = value->rValue; + mod->BSIM4v6ldsubGiven = TRUE; + break; + case BSIM4v6_MOD_LVTH0: + mod->BSIM4v6lvth0 = value->rValue; + mod->BSIM4v6lvth0Given = TRUE; + break; + case BSIM4v6_MOD_LUA: + mod->BSIM4v6lua = value->rValue; + mod->BSIM4v6luaGiven = TRUE; + break; + case BSIM4v6_MOD_LUA1: + mod->BSIM4v6lua1 = value->rValue; + mod->BSIM4v6lua1Given = TRUE; + break; + case BSIM4v6_MOD_LUB: + mod->BSIM4v6lub = value->rValue; + mod->BSIM4v6lubGiven = TRUE; + break; + case BSIM4v6_MOD_LUB1: + mod->BSIM4v6lub1 = value->rValue; + mod->BSIM4v6lub1Given = TRUE; + break; + case BSIM4v6_MOD_LUC: + mod->BSIM4v6luc = value->rValue; + mod->BSIM4v6lucGiven = TRUE; + break; + case BSIM4v6_MOD_LUC1: + mod->BSIM4v6luc1 = value->rValue; + mod->BSIM4v6luc1Given = TRUE; + break; + case BSIM4v6_MOD_LU0 : + mod->BSIM4v6lu0 = value->rValue; + mod->BSIM4v6lu0Given = TRUE; + break; + case BSIM4v6_MOD_LUTE : + mod->BSIM4v6lute = value->rValue; + mod->BSIM4v6luteGiven = TRUE; + break; + case BSIM4v6_MOD_LUCSTE : + mod->BSIM4v6lucste = value->rValue; + mod->BSIM4v6lucsteGiven = TRUE; + break; + case BSIM4v6_MOD_LVOFF: + mod->BSIM4v6lvoff = value->rValue; + mod->BSIM4v6lvoffGiven = TRUE; + break; + case BSIM4v6_MOD_LTVOFF: + mod->BSIM4v6ltvoff = value->rValue; + mod->BSIM4v6ltvoffGiven = TRUE; + break; + case BSIM4v6_MOD_LMINV: + mod->BSIM4v6lminv = value->rValue; + mod->BSIM4v6lminvGiven = TRUE; + break; + case BSIM4v6_MOD_LMINVCV: + mod->BSIM4v6lminvcv = value->rValue; + mod->BSIM4v6lminvcvGiven = TRUE; + break; + case BSIM4v6_MOD_LFPROUT: + mod->BSIM4v6lfprout = value->rValue; + mod->BSIM4v6lfproutGiven = TRUE; + break; + case BSIM4v6_MOD_LPDITS: + mod->BSIM4v6lpdits = value->rValue; + mod->BSIM4v6lpditsGiven = TRUE; + break; + case BSIM4v6_MOD_LPDITSD: + mod->BSIM4v6lpditsd = value->rValue; + mod->BSIM4v6lpditsdGiven = TRUE; + break; + case BSIM4v6_MOD_LDELTA : + mod->BSIM4v6ldelta = value->rValue; + mod->BSIM4v6ldeltaGiven = TRUE; + break; + case BSIM4v6_MOD_LRDSW: + mod->BSIM4v6lrdsw = value->rValue; + mod->BSIM4v6lrdswGiven = TRUE; + break; + case BSIM4v6_MOD_LRDW: + mod->BSIM4v6lrdw = value->rValue; + mod->BSIM4v6lrdwGiven = TRUE; + break; + case BSIM4v6_MOD_LRSW: + mod->BSIM4v6lrsw = value->rValue; + mod->BSIM4v6lrswGiven = TRUE; + break; + case BSIM4v6_MOD_LPRWB: + mod->BSIM4v6lprwb = value->rValue; + mod->BSIM4v6lprwbGiven = TRUE; + break; + case BSIM4v6_MOD_LPRWG: + mod->BSIM4v6lprwg = value->rValue; + mod->BSIM4v6lprwgGiven = TRUE; + break; + case BSIM4v6_MOD_LPRT: + mod->BSIM4v6lprt = value->rValue; + mod->BSIM4v6lprtGiven = TRUE; + break; + case BSIM4v6_MOD_LETA0: + mod->BSIM4v6leta0 = value->rValue; + mod->BSIM4v6leta0Given = TRUE; + break; + case BSIM4v6_MOD_LETAB: + mod->BSIM4v6letab = value->rValue; + mod->BSIM4v6letabGiven = TRUE; + break; + case BSIM4v6_MOD_LPCLM: + mod->BSIM4v6lpclm = value->rValue; + mod->BSIM4v6lpclmGiven = TRUE; + break; + case BSIM4v6_MOD_LPDIBL1: + mod->BSIM4v6lpdibl1 = value->rValue; + mod->BSIM4v6lpdibl1Given = TRUE; + break; + case BSIM4v6_MOD_LPDIBL2: + mod->BSIM4v6lpdibl2 = value->rValue; + mod->BSIM4v6lpdibl2Given = TRUE; + break; + case BSIM4v6_MOD_LPDIBLB: + mod->BSIM4v6lpdiblb = value->rValue; + mod->BSIM4v6lpdiblbGiven = TRUE; + break; + case BSIM4v6_MOD_LPSCBE1: + mod->BSIM4v6lpscbe1 = value->rValue; + mod->BSIM4v6lpscbe1Given = TRUE; + break; + case BSIM4v6_MOD_LPSCBE2: + mod->BSIM4v6lpscbe2 = value->rValue; + mod->BSIM4v6lpscbe2Given = TRUE; + break; + case BSIM4v6_MOD_LPVAG: + mod->BSIM4v6lpvag = value->rValue; + mod->BSIM4v6lpvagGiven = TRUE; + break; + case BSIM4v6_MOD_LWR : + mod->BSIM4v6lwr = value->rValue; + mod->BSIM4v6lwrGiven = TRUE; + break; + case BSIM4v6_MOD_LDWG : + mod->BSIM4v6ldwg = value->rValue; + mod->BSIM4v6ldwgGiven = TRUE; + break; + case BSIM4v6_MOD_LDWB : + mod->BSIM4v6ldwb = value->rValue; + mod->BSIM4v6ldwbGiven = TRUE; + break; + case BSIM4v6_MOD_LB0 : + mod->BSIM4v6lb0 = value->rValue; + mod->BSIM4v6lb0Given = TRUE; + break; + case BSIM4v6_MOD_LB1 : + mod->BSIM4v6lb1 = value->rValue; + mod->BSIM4v6lb1Given = TRUE; + break; + case BSIM4v6_MOD_LALPHA0 : + mod->BSIM4v6lalpha0 = value->rValue; + mod->BSIM4v6lalpha0Given = TRUE; + break; + case BSIM4v6_MOD_LALPHA1 : + mod->BSIM4v6lalpha1 = value->rValue; + mod->BSIM4v6lalpha1Given = TRUE; + break; + case BSIM4v6_MOD_LBETA0 : + mod->BSIM4v6lbeta0 = value->rValue; + mod->BSIM4v6lbeta0Given = TRUE; + break; + case BSIM4v6_MOD_LPHIN : + mod->BSIM4v6lphin = value->rValue; + mod->BSIM4v6lphinGiven = TRUE; + break; + case BSIM4v6_MOD_LAGIDL : + mod->BSIM4v6lagidl = value->rValue; + mod->BSIM4v6lagidlGiven = TRUE; + break; + case BSIM4v6_MOD_LBGIDL : + mod->BSIM4v6lbgidl = value->rValue; + mod->BSIM4v6lbgidlGiven = TRUE; + break; + case BSIM4v6_MOD_LCGIDL : + mod->BSIM4v6lcgidl = value->rValue; + mod->BSIM4v6lcgidlGiven = TRUE; + break; + case BSIM4v6_MOD_LEGIDL : + mod->BSIM4v6legidl = value->rValue; + mod->BSIM4v6legidlGiven = TRUE; + break; + case BSIM4v6_MOD_LAGISL : + mod->BSIM4v6lagisl = value->rValue; + mod->BSIM4v6lagislGiven = TRUE; + break; + case BSIM4v6_MOD_LBGISL : + mod->BSIM4v6lbgisl = value->rValue; + mod->BSIM4v6lbgislGiven = TRUE; + break; + case BSIM4v6_MOD_LCGISL : + mod->BSIM4v6lcgisl = value->rValue; + mod->BSIM4v6lcgislGiven = TRUE; + break; + case BSIM4v6_MOD_LEGISL : + mod->BSIM4v6legisl = value->rValue; + mod->BSIM4v6legislGiven = TRUE; + break; + case BSIM4v6_MOD_LAIGC : + mod->BSIM4v6laigc = value->rValue; + mod->BSIM4v6laigcGiven = TRUE; + break; + case BSIM4v6_MOD_LBIGC : + mod->BSIM4v6lbigc = value->rValue; + mod->BSIM4v6lbigcGiven = TRUE; + break; + case BSIM4v6_MOD_LCIGC : + mod->BSIM4v6lcigc = value->rValue; + mod->BSIM4v6lcigcGiven = TRUE; + break; + case BSIM4v6_MOD_LAIGSD : + mod->BSIM4v6laigsd = value->rValue; + mod->BSIM4v6laigsdGiven = TRUE; + break; + case BSIM4v6_MOD_LBIGSD : + mod->BSIM4v6lbigsd = value->rValue; + mod->BSIM4v6lbigsdGiven = TRUE; + break; + case BSIM4v6_MOD_LCIGSD : + mod->BSIM4v6lcigsd = value->rValue; + mod->BSIM4v6lcigsdGiven = TRUE; + break; + case BSIM4v6_MOD_LAIGS : + mod->BSIM4v6laigs = value->rValue; + mod->BSIM4v6laigsGiven = TRUE; + break; + case BSIM4v6_MOD_LBIGS : + mod->BSIM4v6lbigs = value->rValue; + mod->BSIM4v6lbigsGiven = TRUE; + break; + case BSIM4v6_MOD_LCIGS : + mod->BSIM4v6lcigs = value->rValue; + mod->BSIM4v6lcigsGiven = TRUE; + break; + case BSIM4v6_MOD_LAIGD : + mod->BSIM4v6laigd = value->rValue; + mod->BSIM4v6laigdGiven = TRUE; + break; + case BSIM4v6_MOD_LBIGD : + mod->BSIM4v6lbigd = value->rValue; + mod->BSIM4v6lbigdGiven = TRUE; + break; + case BSIM4v6_MOD_LCIGD : + mod->BSIM4v6lcigd = value->rValue; + mod->BSIM4v6lcigdGiven = TRUE; + break; + case BSIM4v6_MOD_LAIGBACC : + mod->BSIM4v6laigbacc = value->rValue; + mod->BSIM4v6laigbaccGiven = TRUE; + break; + case BSIM4v6_MOD_LBIGBACC : + mod->BSIM4v6lbigbacc = value->rValue; + mod->BSIM4v6lbigbaccGiven = TRUE; + break; + case BSIM4v6_MOD_LCIGBACC : + mod->BSIM4v6lcigbacc = value->rValue; + mod->BSIM4v6lcigbaccGiven = TRUE; + break; + case BSIM4v6_MOD_LAIGBINV : + mod->BSIM4v6laigbinv = value->rValue; + mod->BSIM4v6laigbinvGiven = TRUE; + break; + case BSIM4v6_MOD_LBIGBINV : + mod->BSIM4v6lbigbinv = value->rValue; + mod->BSIM4v6lbigbinvGiven = TRUE; + break; + case BSIM4v6_MOD_LCIGBINV : + mod->BSIM4v6lcigbinv = value->rValue; + mod->BSIM4v6lcigbinvGiven = TRUE; + break; + case BSIM4v6_MOD_LNIGC : + mod->BSIM4v6lnigc = value->rValue; + mod->BSIM4v6lnigcGiven = TRUE; + break; + case BSIM4v6_MOD_LNIGBINV : + mod->BSIM4v6lnigbinv = value->rValue; + mod->BSIM4v6lnigbinvGiven = TRUE; + break; + case BSIM4v6_MOD_LNIGBACC : + mod->BSIM4v6lnigbacc = value->rValue; + mod->BSIM4v6lnigbaccGiven = TRUE; + break; + case BSIM4v6_MOD_LNTOX : + mod->BSIM4v6lntox = value->rValue; + mod->BSIM4v6lntoxGiven = TRUE; + break; + case BSIM4v6_MOD_LEIGBINV : + mod->BSIM4v6leigbinv = value->rValue; + mod->BSIM4v6leigbinvGiven = TRUE; + break; + case BSIM4v6_MOD_LPIGCD : + mod->BSIM4v6lpigcd = value->rValue; + mod->BSIM4v6lpigcdGiven = TRUE; + break; + case BSIM4v6_MOD_LPOXEDGE : + mod->BSIM4v6lpoxedge = value->rValue; + mod->BSIM4v6lpoxedgeGiven = TRUE; + break; + case BSIM4v6_MOD_LXRCRG1 : + mod->BSIM4v6lxrcrg1 = value->rValue; + mod->BSIM4v6lxrcrg1Given = TRUE; + break; + case BSIM4v6_MOD_LXRCRG2 : + mod->BSIM4v6lxrcrg2 = value->rValue; + mod->BSIM4v6lxrcrg2Given = TRUE; + break; + case BSIM4v6_MOD_LLAMBDA : + mod->BSIM4v6llambda = value->rValue; + mod->BSIM4v6llambdaGiven = TRUE; + break; + case BSIM4v6_MOD_LVTL : + mod->BSIM4v6lvtl = value->rValue; + mod->BSIM4v6lvtlGiven = TRUE; + break; + case BSIM4v6_MOD_LXN: + mod->BSIM4v6lxn = value->rValue; + mod->BSIM4v6lxnGiven = TRUE; + break; + case BSIM4v6_MOD_LVFBSDOFF: + mod->BSIM4v6lvfbsdoff = value->rValue; + mod->BSIM4v6lvfbsdoffGiven = TRUE; + break; + case BSIM4v6_MOD_LTVFBSDOFF: + mod->BSIM4v6ltvfbsdoff = value->rValue; + mod->BSIM4v6ltvfbsdoffGiven = TRUE; + break; + case BSIM4v6_MOD_LEU : + mod->BSIM4v6leu = value->rValue; + mod->BSIM4v6leuGiven = TRUE; + break; + case BSIM4v6_MOD_LUCS : + mod->BSIM4v6lucs = value->rValue; + mod->BSIM4v6lucsGiven = TRUE; + break; + case BSIM4v6_MOD_LVFB : + mod->BSIM4v6lvfb = value->rValue; + mod->BSIM4v6lvfbGiven = TRUE; + break; + case BSIM4v6_MOD_LCGSL : + mod->BSIM4v6lcgsl = value->rValue; + mod->BSIM4v6lcgslGiven = TRUE; + break; + case BSIM4v6_MOD_LCGDL : + mod->BSIM4v6lcgdl = value->rValue; + mod->BSIM4v6lcgdlGiven = TRUE; + break; + case BSIM4v6_MOD_LCKAPPAS : + mod->BSIM4v6lckappas = value->rValue; + mod->BSIM4v6lckappasGiven = TRUE; + break; + case BSIM4v6_MOD_LCKAPPAD : + mod->BSIM4v6lckappad = value->rValue; + mod->BSIM4v6lckappadGiven = TRUE; + break; + case BSIM4v6_MOD_LCF : + mod->BSIM4v6lcf = value->rValue; + mod->BSIM4v6lcfGiven = TRUE; + break; + case BSIM4v6_MOD_LCLC : + mod->BSIM4v6lclc = value->rValue; + mod->BSIM4v6lclcGiven = TRUE; + break; + case BSIM4v6_MOD_LCLE : + mod->BSIM4v6lcle = value->rValue; + mod->BSIM4v6lcleGiven = TRUE; + break; + case BSIM4v6_MOD_LVFBCV : + mod->BSIM4v6lvfbcv = value->rValue; + mod->BSIM4v6lvfbcvGiven = TRUE; + break; + case BSIM4v6_MOD_LACDE : + mod->BSIM4v6lacde = value->rValue; + mod->BSIM4v6lacdeGiven = TRUE; + break; + case BSIM4v6_MOD_LMOIN : + mod->BSIM4v6lmoin = value->rValue; + mod->BSIM4v6lmoinGiven = TRUE; + break; + case BSIM4v6_MOD_LNOFF : + mod->BSIM4v6lnoff = value->rValue; + mod->BSIM4v6lnoffGiven = TRUE; + break; + case BSIM4v6_MOD_LVOFFCV : + mod->BSIM4v6lvoffcv = value->rValue; + mod->BSIM4v6lvoffcvGiven = TRUE; + break; + + /* Width dependence */ + case BSIM4v6_MOD_WCDSC : + mod->BSIM4v6wcdsc = value->rValue; + mod->BSIM4v6wcdscGiven = TRUE; + break; + + + case BSIM4v6_MOD_WCDSCB : + mod->BSIM4v6wcdscb = value->rValue; + mod->BSIM4v6wcdscbGiven = TRUE; + break; + case BSIM4v6_MOD_WCDSCD : + mod->BSIM4v6wcdscd = value->rValue; + mod->BSIM4v6wcdscdGiven = TRUE; + break; + case BSIM4v6_MOD_WCIT : + mod->BSIM4v6wcit = value->rValue; + mod->BSIM4v6wcitGiven = TRUE; + break; + case BSIM4v6_MOD_WNFACTOR : + mod->BSIM4v6wnfactor = value->rValue; + mod->BSIM4v6wnfactorGiven = TRUE; + break; + case BSIM4v6_MOD_WXJ: + mod->BSIM4v6wxj = value->rValue; + mod->BSIM4v6wxjGiven = TRUE; + break; + case BSIM4v6_MOD_WVSAT: + mod->BSIM4v6wvsat = value->rValue; + mod->BSIM4v6wvsatGiven = TRUE; + break; + + + case BSIM4v6_MOD_WA0: + mod->BSIM4v6wa0 = value->rValue; + mod->BSIM4v6wa0Given = TRUE; + break; + case BSIM4v6_MOD_WAGS: + mod->BSIM4v6wags = value->rValue; + mod->BSIM4v6wagsGiven = TRUE; + break; + case BSIM4v6_MOD_WA1: + mod->BSIM4v6wa1 = value->rValue; + mod->BSIM4v6wa1Given = TRUE; + break; + case BSIM4v6_MOD_WA2: + mod->BSIM4v6wa2 = value->rValue; + mod->BSIM4v6wa2Given = TRUE; + break; + case BSIM4v6_MOD_WAT: + mod->BSIM4v6wat = value->rValue; + mod->BSIM4v6watGiven = TRUE; + break; + case BSIM4v6_MOD_WKETA: + mod->BSIM4v6wketa = value->rValue; + mod->BSIM4v6wketaGiven = TRUE; + break; + case BSIM4v6_MOD_WNSUB: + mod->BSIM4v6wnsub = value->rValue; + mod->BSIM4v6wnsubGiven = TRUE; + break; + case BSIM4v6_MOD_WNDEP: + mod->BSIM4v6wndep = value->rValue; + mod->BSIM4v6wndepGiven = TRUE; + if (mod->BSIM4v6wndep > 1.0e20) + mod->BSIM4v6wndep *= 1.0e-6; + break; + case BSIM4v6_MOD_WNSD: + mod->BSIM4v6wnsd = value->rValue; + mod->BSIM4v6wnsdGiven = TRUE; + if (mod->BSIM4v6wnsd > 1.0e23) + mod->BSIM4v6wnsd *= 1.0e-6; + break; + case BSIM4v6_MOD_WNGATE: + mod->BSIM4v6wngate = value->rValue; + mod->BSIM4v6wngateGiven = TRUE; + if (mod->BSIM4v6wngate > 1.0e23) + mod->BSIM4v6wngate *= 1.0e-6; + break; + case BSIM4v6_MOD_WGAMMA1: + mod->BSIM4v6wgamma1 = value->rValue; + mod->BSIM4v6wgamma1Given = TRUE; + break; + case BSIM4v6_MOD_WGAMMA2: + mod->BSIM4v6wgamma2 = value->rValue; + mod->BSIM4v6wgamma2Given = TRUE; + break; + case BSIM4v6_MOD_WVBX: + mod->BSIM4v6wvbx = value->rValue; + mod->BSIM4v6wvbxGiven = TRUE; + break; + case BSIM4v6_MOD_WVBM: + mod->BSIM4v6wvbm = value->rValue; + mod->BSIM4v6wvbmGiven = TRUE; + break; + case BSIM4v6_MOD_WXT: + mod->BSIM4v6wxt = value->rValue; + mod->BSIM4v6wxtGiven = TRUE; + break; + case BSIM4v6_MOD_WK1: + mod->BSIM4v6wk1 = value->rValue; + mod->BSIM4v6wk1Given = TRUE; + break; + case BSIM4v6_MOD_WKT1: + mod->BSIM4v6wkt1 = value->rValue; + mod->BSIM4v6wkt1Given = TRUE; + break; + case BSIM4v6_MOD_WKT1L: + mod->BSIM4v6wkt1l = value->rValue; + mod->BSIM4v6wkt1lGiven = TRUE; + break; + case BSIM4v6_MOD_WKT2: + mod->BSIM4v6wkt2 = value->rValue; + mod->BSIM4v6wkt2Given = TRUE; + break; + case BSIM4v6_MOD_WK2: + mod->BSIM4v6wk2 = value->rValue; + mod->BSIM4v6wk2Given = TRUE; + break; + case BSIM4v6_MOD_WK3: + mod->BSIM4v6wk3 = value->rValue; + mod->BSIM4v6wk3Given = TRUE; + break; + case BSIM4v6_MOD_WK3B: + mod->BSIM4v6wk3b = value->rValue; + mod->BSIM4v6wk3bGiven = TRUE; + break; + case BSIM4v6_MOD_WLPE0: + mod->BSIM4v6wlpe0 = value->rValue; + mod->BSIM4v6wlpe0Given = TRUE; + break; + case BSIM4v6_MOD_WLPEB: + mod->BSIM4v6wlpeb = value->rValue; + mod->BSIM4v6wlpebGiven = TRUE; + break; + case BSIM4v6_MOD_WDVTP0: + mod->BSIM4v6wdvtp0 = value->rValue; + mod->BSIM4v6wdvtp0Given = TRUE; + break; + case BSIM4v6_MOD_WDVTP1: + mod->BSIM4v6wdvtp1 = value->rValue; + mod->BSIM4v6wdvtp1Given = TRUE; + break; + case BSIM4v6_MOD_WW0: + mod->BSIM4v6ww0 = value->rValue; + mod->BSIM4v6ww0Given = TRUE; + break; + case BSIM4v6_MOD_WDVT0: + mod->BSIM4v6wdvt0 = value->rValue; + mod->BSIM4v6wdvt0Given = TRUE; + break; + case BSIM4v6_MOD_WDVT1: + mod->BSIM4v6wdvt1 = value->rValue; + mod->BSIM4v6wdvt1Given = TRUE; + break; + case BSIM4v6_MOD_WDVT2: + mod->BSIM4v6wdvt2 = value->rValue; + mod->BSIM4v6wdvt2Given = TRUE; + break; + case BSIM4v6_MOD_WDVT0W: + mod->BSIM4v6wdvt0w = value->rValue; + mod->BSIM4v6wdvt0wGiven = TRUE; + break; + case BSIM4v6_MOD_WDVT1W: + mod->BSIM4v6wdvt1w = value->rValue; + mod->BSIM4v6wdvt1wGiven = TRUE; + break; + case BSIM4v6_MOD_WDVT2W: + mod->BSIM4v6wdvt2w = value->rValue; + mod->BSIM4v6wdvt2wGiven = TRUE; + break; + case BSIM4v6_MOD_WDROUT: + mod->BSIM4v6wdrout = value->rValue; + mod->BSIM4v6wdroutGiven = TRUE; + break; + case BSIM4v6_MOD_WDSUB: + mod->BSIM4v6wdsub = value->rValue; + mod->BSIM4v6wdsubGiven = TRUE; + break; + case BSIM4v6_MOD_WVTH0: + mod->BSIM4v6wvth0 = value->rValue; + mod->BSIM4v6wvth0Given = TRUE; + break; + case BSIM4v6_MOD_WUA: + mod->BSIM4v6wua = value->rValue; + mod->BSIM4v6wuaGiven = TRUE; + break; + case BSIM4v6_MOD_WUA1: + mod->BSIM4v6wua1 = value->rValue; + mod->BSIM4v6wua1Given = TRUE; + break; + case BSIM4v6_MOD_WUB: + mod->BSIM4v6wub = value->rValue; + mod->BSIM4v6wubGiven = TRUE; + break; + case BSIM4v6_MOD_WUB1: + mod->BSIM4v6wub1 = value->rValue; + mod->BSIM4v6wub1Given = TRUE; + break; + case BSIM4v6_MOD_WUC: + mod->BSIM4v6wuc = value->rValue; + mod->BSIM4v6wucGiven = TRUE; + break; + case BSIM4v6_MOD_WUC1: + mod->BSIM4v6wuc1 = value->rValue; + mod->BSIM4v6wuc1Given = TRUE; + break; + case BSIM4v6_MOD_WU0 : + mod->BSIM4v6wu0 = value->rValue; + mod->BSIM4v6wu0Given = TRUE; + break; + case BSIM4v6_MOD_WUTE : + mod->BSIM4v6wute = value->rValue; + mod->BSIM4v6wuteGiven = TRUE; + break; + case BSIM4v6_MOD_WUCSTE : + mod->BSIM4v6wucste = value->rValue; + mod->BSIM4v6wucsteGiven = TRUE; + break; + case BSIM4v6_MOD_WVOFF: + mod->BSIM4v6wvoff = value->rValue; + mod->BSIM4v6wvoffGiven = TRUE; + break; + case BSIM4v6_MOD_WTVOFF: + mod->BSIM4v6wtvoff = value->rValue; + mod->BSIM4v6wtvoffGiven = TRUE; + break; + case BSIM4v6_MOD_WMINV: + mod->BSIM4v6wminv = value->rValue; + mod->BSIM4v6wminvGiven = TRUE; + break; + case BSIM4v6_MOD_WMINVCV: + mod->BSIM4v6wminvcv = value->rValue; + mod->BSIM4v6wminvcvGiven = TRUE; + break; + case BSIM4v6_MOD_WFPROUT: + mod->BSIM4v6wfprout = value->rValue; + mod->BSIM4v6wfproutGiven = TRUE; + break; + case BSIM4v6_MOD_WPDITS: + mod->BSIM4v6wpdits = value->rValue; + mod->BSIM4v6wpditsGiven = TRUE; + break; + case BSIM4v6_MOD_WPDITSD: + mod->BSIM4v6wpditsd = value->rValue; + mod->BSIM4v6wpditsdGiven = TRUE; + break; + case BSIM4v6_MOD_WDELTA : + mod->BSIM4v6wdelta = value->rValue; + mod->BSIM4v6wdeltaGiven = TRUE; + break; + case BSIM4v6_MOD_WRDSW: + mod->BSIM4v6wrdsw = value->rValue; + mod->BSIM4v6wrdswGiven = TRUE; + break; + case BSIM4v6_MOD_WRDW: + mod->BSIM4v6wrdw = value->rValue; + mod->BSIM4v6wrdwGiven = TRUE; + break; + case BSIM4v6_MOD_WRSW: + mod->BSIM4v6wrsw = value->rValue; + mod->BSIM4v6wrswGiven = TRUE; + break; + case BSIM4v6_MOD_WPRWB: + mod->BSIM4v6wprwb = value->rValue; + mod->BSIM4v6wprwbGiven = TRUE; + break; + case BSIM4v6_MOD_WPRWG: + mod->BSIM4v6wprwg = value->rValue; + mod->BSIM4v6wprwgGiven = TRUE; + break; + case BSIM4v6_MOD_WPRT: + mod->BSIM4v6wprt = value->rValue; + mod->BSIM4v6wprtGiven = TRUE; + break; + case BSIM4v6_MOD_WETA0: + mod->BSIM4v6weta0 = value->rValue; + mod->BSIM4v6weta0Given = TRUE; + break; + case BSIM4v6_MOD_WETAB: + mod->BSIM4v6wetab = value->rValue; + mod->BSIM4v6wetabGiven = TRUE; + break; + case BSIM4v6_MOD_WPCLM: + mod->BSIM4v6wpclm = value->rValue; + mod->BSIM4v6wpclmGiven = TRUE; + break; + case BSIM4v6_MOD_WPDIBL1: + mod->BSIM4v6wpdibl1 = value->rValue; + mod->BSIM4v6wpdibl1Given = TRUE; + break; + case BSIM4v6_MOD_WPDIBL2: + mod->BSIM4v6wpdibl2 = value->rValue; + mod->BSIM4v6wpdibl2Given = TRUE; + break; + case BSIM4v6_MOD_WPDIBLB: + mod->BSIM4v6wpdiblb = value->rValue; + mod->BSIM4v6wpdiblbGiven = TRUE; + break; + case BSIM4v6_MOD_WPSCBE1: + mod->BSIM4v6wpscbe1 = value->rValue; + mod->BSIM4v6wpscbe1Given = TRUE; + break; + case BSIM4v6_MOD_WPSCBE2: + mod->BSIM4v6wpscbe2 = value->rValue; + mod->BSIM4v6wpscbe2Given = TRUE; + break; + case BSIM4v6_MOD_WPVAG: + mod->BSIM4v6wpvag = value->rValue; + mod->BSIM4v6wpvagGiven = TRUE; + break; + case BSIM4v6_MOD_WWR : + mod->BSIM4v6wwr = value->rValue; + mod->BSIM4v6wwrGiven = TRUE; + break; + case BSIM4v6_MOD_WDWG : + mod->BSIM4v6wdwg = value->rValue; + mod->BSIM4v6wdwgGiven = TRUE; + break; + case BSIM4v6_MOD_WDWB : + mod->BSIM4v6wdwb = value->rValue; + mod->BSIM4v6wdwbGiven = TRUE; + break; + case BSIM4v6_MOD_WB0 : + mod->BSIM4v6wb0 = value->rValue; + mod->BSIM4v6wb0Given = TRUE; + break; + case BSIM4v6_MOD_WB1 : + mod->BSIM4v6wb1 = value->rValue; + mod->BSIM4v6wb1Given = TRUE; + break; + case BSIM4v6_MOD_WALPHA0 : + mod->BSIM4v6walpha0 = value->rValue; + mod->BSIM4v6walpha0Given = TRUE; + break; + case BSIM4v6_MOD_WALPHA1 : + mod->BSIM4v6walpha1 = value->rValue; + mod->BSIM4v6walpha1Given = TRUE; + break; + case BSIM4v6_MOD_WBETA0 : + mod->BSIM4v6wbeta0 = value->rValue; + mod->BSIM4v6wbeta0Given = TRUE; + break; + case BSIM4v6_MOD_WPHIN : + mod->BSIM4v6wphin = value->rValue; + mod->BSIM4v6wphinGiven = TRUE; + break; + case BSIM4v6_MOD_WAGIDL : + mod->BSIM4v6wagidl = value->rValue; + mod->BSIM4v6wagidlGiven = TRUE; + break; + case BSIM4v6_MOD_WBGIDL : + mod->BSIM4v6wbgidl = value->rValue; + mod->BSIM4v6wbgidlGiven = TRUE; + break; + case BSIM4v6_MOD_WCGIDL : + mod->BSIM4v6wcgidl = value->rValue; + mod->BSIM4v6wcgidlGiven = TRUE; + break; + case BSIM4v6_MOD_WEGIDL : + mod->BSIM4v6wegidl = value->rValue; + mod->BSIM4v6wegidlGiven = TRUE; + break; + case BSIM4v6_MOD_WAGISL : + mod->BSIM4v6wagisl = value->rValue; + mod->BSIM4v6wagislGiven = TRUE; + break; + case BSIM4v6_MOD_WBGISL : + mod->BSIM4v6wbgisl = value->rValue; + mod->BSIM4v6wbgislGiven = TRUE; + break; + case BSIM4v6_MOD_WCGISL : + mod->BSIM4v6wcgisl = value->rValue; + mod->BSIM4v6wcgislGiven = TRUE; + break; + case BSIM4v6_MOD_WEGISL : + mod->BSIM4v6wegisl = value->rValue; + mod->BSIM4v6wegislGiven = TRUE; + break; + case BSIM4v6_MOD_WAIGC : + mod->BSIM4v6waigc = value->rValue; + mod->BSIM4v6waigcGiven = TRUE; + break; + case BSIM4v6_MOD_WBIGC : + mod->BSIM4v6wbigc = value->rValue; + mod->BSIM4v6wbigcGiven = TRUE; + break; + case BSIM4v6_MOD_WCIGC : + mod->BSIM4v6wcigc = value->rValue; + mod->BSIM4v6wcigcGiven = TRUE; + break; + case BSIM4v6_MOD_WAIGSD : + mod->BSIM4v6waigsd = value->rValue; + mod->BSIM4v6waigsdGiven = TRUE; + break; + case BSIM4v6_MOD_WBIGSD : + mod->BSIM4v6wbigsd = value->rValue; + mod->BSIM4v6wbigsdGiven = TRUE; + break; + case BSIM4v6_MOD_WCIGSD : + mod->BSIM4v6wcigsd = value->rValue; + mod->BSIM4v6wcigsdGiven = TRUE; + break; + case BSIM4v6_MOD_WAIGS : + mod->BSIM4v6waigs = value->rValue; + mod->BSIM4v6waigsGiven = TRUE; + break; + case BSIM4v6_MOD_WBIGS : + mod->BSIM4v6wbigs = value->rValue; + mod->BSIM4v6wbigsGiven = TRUE; + break; + case BSIM4v6_MOD_WCIGS : + mod->BSIM4v6wcigs = value->rValue; + mod->BSIM4v6wcigsGiven = TRUE; + break; + case BSIM4v6_MOD_WAIGD : + mod->BSIM4v6waigd = value->rValue; + mod->BSIM4v6waigdGiven = TRUE; + break; + case BSIM4v6_MOD_WBIGD : + mod->BSIM4v6wbigd = value->rValue; + mod->BSIM4v6wbigdGiven = TRUE; + break; + case BSIM4v6_MOD_WCIGD : + mod->BSIM4v6wcigd = value->rValue; + mod->BSIM4v6wcigdGiven = TRUE; + break; + case BSIM4v6_MOD_WAIGBACC : + mod->BSIM4v6waigbacc = value->rValue; + mod->BSIM4v6waigbaccGiven = TRUE; + break; + case BSIM4v6_MOD_WBIGBACC : + mod->BSIM4v6wbigbacc = value->rValue; + mod->BSIM4v6wbigbaccGiven = TRUE; + break; + case BSIM4v6_MOD_WCIGBACC : + mod->BSIM4v6wcigbacc = value->rValue; + mod->BSIM4v6wcigbaccGiven = TRUE; + break; + case BSIM4v6_MOD_WAIGBINV : + mod->BSIM4v6waigbinv = value->rValue; + mod->BSIM4v6waigbinvGiven = TRUE; + break; + case BSIM4v6_MOD_WBIGBINV : + mod->BSIM4v6wbigbinv = value->rValue; + mod->BSIM4v6wbigbinvGiven = TRUE; + break; + case BSIM4v6_MOD_WCIGBINV : + mod->BSIM4v6wcigbinv = value->rValue; + mod->BSIM4v6wcigbinvGiven = TRUE; + break; + case BSIM4v6_MOD_WNIGC : + mod->BSIM4v6wnigc = value->rValue; + mod->BSIM4v6wnigcGiven = TRUE; + break; + case BSIM4v6_MOD_WNIGBINV : + mod->BSIM4v6wnigbinv = value->rValue; + mod->BSIM4v6wnigbinvGiven = TRUE; + break; + case BSIM4v6_MOD_WNIGBACC : + mod->BSIM4v6wnigbacc = value->rValue; + mod->BSIM4v6wnigbaccGiven = TRUE; + break; + case BSIM4v6_MOD_WNTOX : + mod->BSIM4v6wntox = value->rValue; + mod->BSIM4v6wntoxGiven = TRUE; + break; + case BSIM4v6_MOD_WEIGBINV : + mod->BSIM4v6weigbinv = value->rValue; + mod->BSIM4v6weigbinvGiven = TRUE; + break; + case BSIM4v6_MOD_WPIGCD : + mod->BSIM4v6wpigcd = value->rValue; + mod->BSIM4v6wpigcdGiven = TRUE; + break; + case BSIM4v6_MOD_WPOXEDGE : + mod->BSIM4v6wpoxedge = value->rValue; + mod->BSIM4v6wpoxedgeGiven = TRUE; + break; + case BSIM4v6_MOD_WXRCRG1 : + mod->BSIM4v6wxrcrg1 = value->rValue; + mod->BSIM4v6wxrcrg1Given = TRUE; + break; + case BSIM4v6_MOD_WXRCRG2 : + mod->BSIM4v6wxrcrg2 = value->rValue; + mod->BSIM4v6wxrcrg2Given = TRUE; + break; + case BSIM4v6_MOD_WLAMBDA : + mod->BSIM4v6wlambda = value->rValue; + mod->BSIM4v6wlambdaGiven = TRUE; + break; + case BSIM4v6_MOD_WVTL : + mod->BSIM4v6wvtl = value->rValue; + mod->BSIM4v6wvtlGiven = TRUE; + break; + case BSIM4v6_MOD_WXN: + mod->BSIM4v6wxn = value->rValue; + mod->BSIM4v6wxnGiven = TRUE; + break; + case BSIM4v6_MOD_WVFBSDOFF: + mod->BSIM4v6wvfbsdoff = value->rValue; + mod->BSIM4v6wvfbsdoffGiven = TRUE; + break; + case BSIM4v6_MOD_WTVFBSDOFF: + mod->BSIM4v6wtvfbsdoff = value->rValue; + mod->BSIM4v6wtvfbsdoffGiven = TRUE; + break; + case BSIM4v6_MOD_WEU : + mod->BSIM4v6weu = value->rValue; + mod->BSIM4v6weuGiven = TRUE; + break; + case BSIM4v6_MOD_WUCS : + mod->BSIM4v6wucs = value->rValue; + mod->BSIM4v6wucsGiven = TRUE; + break; + case BSIM4v6_MOD_WVFB : + mod->BSIM4v6wvfb = value->rValue; + mod->BSIM4v6wvfbGiven = TRUE; + break; + case BSIM4v6_MOD_WCGSL : + mod->BSIM4v6wcgsl = value->rValue; + mod->BSIM4v6wcgslGiven = TRUE; + break; + case BSIM4v6_MOD_WCGDL : + mod->BSIM4v6wcgdl = value->rValue; + mod->BSIM4v6wcgdlGiven = TRUE; + break; + case BSIM4v6_MOD_WCKAPPAS : + mod->BSIM4v6wckappas = value->rValue; + mod->BSIM4v6wckappasGiven = TRUE; + break; + case BSIM4v6_MOD_WCKAPPAD : + mod->BSIM4v6wckappad = value->rValue; + mod->BSIM4v6wckappadGiven = TRUE; + break; + case BSIM4v6_MOD_WCF : + mod->BSIM4v6wcf = value->rValue; + mod->BSIM4v6wcfGiven = TRUE; + break; + case BSIM4v6_MOD_WCLC : + mod->BSIM4v6wclc = value->rValue; + mod->BSIM4v6wclcGiven = TRUE; + break; + case BSIM4v6_MOD_WCLE : + mod->BSIM4v6wcle = value->rValue; + mod->BSIM4v6wcleGiven = TRUE; + break; + case BSIM4v6_MOD_WVFBCV : + mod->BSIM4v6wvfbcv = value->rValue; + mod->BSIM4v6wvfbcvGiven = TRUE; + break; + case BSIM4v6_MOD_WACDE : + mod->BSIM4v6wacde = value->rValue; + mod->BSIM4v6wacdeGiven = TRUE; + break; + case BSIM4v6_MOD_WMOIN : + mod->BSIM4v6wmoin = value->rValue; + mod->BSIM4v6wmoinGiven = TRUE; + break; + case BSIM4v6_MOD_WNOFF : + mod->BSIM4v6wnoff = value->rValue; + mod->BSIM4v6wnoffGiven = TRUE; + break; + case BSIM4v6_MOD_WVOFFCV : + mod->BSIM4v6wvoffcv = value->rValue; + mod->BSIM4v6wvoffcvGiven = TRUE; + break; + + /* Cross-term dependence */ + case BSIM4v6_MOD_PCDSC : + mod->BSIM4v6pcdsc = value->rValue; + mod->BSIM4v6pcdscGiven = TRUE; + break; + + + case BSIM4v6_MOD_PCDSCB : + mod->BSIM4v6pcdscb = value->rValue; + mod->BSIM4v6pcdscbGiven = TRUE; + break; + case BSIM4v6_MOD_PCDSCD : + mod->BSIM4v6pcdscd = value->rValue; + mod->BSIM4v6pcdscdGiven = TRUE; + break; + case BSIM4v6_MOD_PCIT : + mod->BSIM4v6pcit = value->rValue; + mod->BSIM4v6pcitGiven = TRUE; + break; + case BSIM4v6_MOD_PNFACTOR : + mod->BSIM4v6pnfactor = value->rValue; + mod->BSIM4v6pnfactorGiven = TRUE; + break; + case BSIM4v6_MOD_PXJ: + mod->BSIM4v6pxj = value->rValue; + mod->BSIM4v6pxjGiven = TRUE; + break; + case BSIM4v6_MOD_PVSAT: + mod->BSIM4v6pvsat = value->rValue; + mod->BSIM4v6pvsatGiven = TRUE; + break; + + + case BSIM4v6_MOD_PA0: + mod->BSIM4v6pa0 = value->rValue; + mod->BSIM4v6pa0Given = TRUE; + break; + case BSIM4v6_MOD_PAGS: + mod->BSIM4v6pags = value->rValue; + mod->BSIM4v6pagsGiven = TRUE; + break; + case BSIM4v6_MOD_PA1: + mod->BSIM4v6pa1 = value->rValue; + mod->BSIM4v6pa1Given = TRUE; + break; + case BSIM4v6_MOD_PA2: + mod->BSIM4v6pa2 = value->rValue; + mod->BSIM4v6pa2Given = TRUE; + break; + case BSIM4v6_MOD_PAT: + mod->BSIM4v6pat = value->rValue; + mod->BSIM4v6patGiven = TRUE; + break; + case BSIM4v6_MOD_PKETA: + mod->BSIM4v6pketa = value->rValue; + mod->BSIM4v6pketaGiven = TRUE; + break; + case BSIM4v6_MOD_PNSUB: + mod->BSIM4v6pnsub = value->rValue; + mod->BSIM4v6pnsubGiven = TRUE; + break; + case BSIM4v6_MOD_PNDEP: + mod->BSIM4v6pndep = value->rValue; + mod->BSIM4v6pndepGiven = TRUE; + if (mod->BSIM4v6pndep > 1.0e20) + mod->BSIM4v6pndep *= 1.0e-6; + break; + case BSIM4v6_MOD_PNSD: + mod->BSIM4v6pnsd = value->rValue; + mod->BSIM4v6pnsdGiven = TRUE; + if (mod->BSIM4v6pnsd > 1.0e23) + mod->BSIM4v6pnsd *= 1.0e-6; + break; + case BSIM4v6_MOD_PNGATE: + mod->BSIM4v6pngate = value->rValue; + mod->BSIM4v6pngateGiven = TRUE; + if (mod->BSIM4v6pngate > 1.0e23) + mod->BSIM4v6pngate *= 1.0e-6; + break; + case BSIM4v6_MOD_PGAMMA1: + mod->BSIM4v6pgamma1 = value->rValue; + mod->BSIM4v6pgamma1Given = TRUE; + break; + case BSIM4v6_MOD_PGAMMA2: + mod->BSIM4v6pgamma2 = value->rValue; + mod->BSIM4v6pgamma2Given = TRUE; + break; + case BSIM4v6_MOD_PVBX: + mod->BSIM4v6pvbx = value->rValue; + mod->BSIM4v6pvbxGiven = TRUE; + break; + case BSIM4v6_MOD_PVBM: + mod->BSIM4v6pvbm = value->rValue; + mod->BSIM4v6pvbmGiven = TRUE; + break; + case BSIM4v6_MOD_PXT: + mod->BSIM4v6pxt = value->rValue; + mod->BSIM4v6pxtGiven = TRUE; + break; + case BSIM4v6_MOD_PK1: + mod->BSIM4v6pk1 = value->rValue; + mod->BSIM4v6pk1Given = TRUE; + break; + case BSIM4v6_MOD_PKT1: + mod->BSIM4v6pkt1 = value->rValue; + mod->BSIM4v6pkt1Given = TRUE; + break; + case BSIM4v6_MOD_PKT1L: + mod->BSIM4v6pkt1l = value->rValue; + mod->BSIM4v6pkt1lGiven = TRUE; + break; + case BSIM4v6_MOD_PKT2: + mod->BSIM4v6pkt2 = value->rValue; + mod->BSIM4v6pkt2Given = TRUE; + break; + case BSIM4v6_MOD_PK2: + mod->BSIM4v6pk2 = value->rValue; + mod->BSIM4v6pk2Given = TRUE; + break; + case BSIM4v6_MOD_PK3: + mod->BSIM4v6pk3 = value->rValue; + mod->BSIM4v6pk3Given = TRUE; + break; + case BSIM4v6_MOD_PK3B: + mod->BSIM4v6pk3b = value->rValue; + mod->BSIM4v6pk3bGiven = TRUE; + break; + case BSIM4v6_MOD_PLPE0: + mod->BSIM4v6plpe0 = value->rValue; + mod->BSIM4v6plpe0Given = TRUE; + break; + case BSIM4v6_MOD_PLPEB: + mod->BSIM4v6plpeb = value->rValue; + mod->BSIM4v6plpebGiven = TRUE; + break; + case BSIM4v6_MOD_PDVTP0: + mod->BSIM4v6pdvtp0 = value->rValue; + mod->BSIM4v6pdvtp0Given = TRUE; + break; + case BSIM4v6_MOD_PDVTP1: + mod->BSIM4v6pdvtp1 = value->rValue; + mod->BSIM4v6pdvtp1Given = TRUE; + break; + case BSIM4v6_MOD_PW0: + mod->BSIM4v6pw0 = value->rValue; + mod->BSIM4v6pw0Given = TRUE; + break; + case BSIM4v6_MOD_PDVT0: + mod->BSIM4v6pdvt0 = value->rValue; + mod->BSIM4v6pdvt0Given = TRUE; + break; + case BSIM4v6_MOD_PDVT1: + mod->BSIM4v6pdvt1 = value->rValue; + mod->BSIM4v6pdvt1Given = TRUE; + break; + case BSIM4v6_MOD_PDVT2: + mod->BSIM4v6pdvt2 = value->rValue; + mod->BSIM4v6pdvt2Given = TRUE; + break; + case BSIM4v6_MOD_PDVT0W: + mod->BSIM4v6pdvt0w = value->rValue; + mod->BSIM4v6pdvt0wGiven = TRUE; + break; + case BSIM4v6_MOD_PDVT1W: + mod->BSIM4v6pdvt1w = value->rValue; + mod->BSIM4v6pdvt1wGiven = TRUE; + break; + case BSIM4v6_MOD_PDVT2W: + mod->BSIM4v6pdvt2w = value->rValue; + mod->BSIM4v6pdvt2wGiven = TRUE; + break; + case BSIM4v6_MOD_PDROUT: + mod->BSIM4v6pdrout = value->rValue; + mod->BSIM4v6pdroutGiven = TRUE; + break; + case BSIM4v6_MOD_PDSUB: + mod->BSIM4v6pdsub = value->rValue; + mod->BSIM4v6pdsubGiven = TRUE; + break; + case BSIM4v6_MOD_PVTH0: + mod->BSIM4v6pvth0 = value->rValue; + mod->BSIM4v6pvth0Given = TRUE; + break; + case BSIM4v6_MOD_PUA: + mod->BSIM4v6pua = value->rValue; + mod->BSIM4v6puaGiven = TRUE; + break; + case BSIM4v6_MOD_PUA1: + mod->BSIM4v6pua1 = value->rValue; + mod->BSIM4v6pua1Given = TRUE; + break; + case BSIM4v6_MOD_PUB: + mod->BSIM4v6pub = value->rValue; + mod->BSIM4v6pubGiven = TRUE; + break; + case BSIM4v6_MOD_PUB1: + mod->BSIM4v6pub1 = value->rValue; + mod->BSIM4v6pub1Given = TRUE; + break; + case BSIM4v6_MOD_PUC: + mod->BSIM4v6puc = value->rValue; + mod->BSIM4v6pucGiven = TRUE; + break; + case BSIM4v6_MOD_PUC1: + mod->BSIM4v6puc1 = value->rValue; + mod->BSIM4v6puc1Given = TRUE; + break; + case BSIM4v6_MOD_PU0 : + mod->BSIM4v6pu0 = value->rValue; + mod->BSIM4v6pu0Given = TRUE; + break; + case BSIM4v6_MOD_PUTE : + mod->BSIM4v6pute = value->rValue; + mod->BSIM4v6puteGiven = TRUE; + break; + case BSIM4v6_MOD_PUCSTE : + mod->BSIM4v6pucste = value->rValue; + mod->BSIM4v6pucsteGiven = TRUE; + break; + case BSIM4v6_MOD_PVOFF: + mod->BSIM4v6pvoff = value->rValue; + mod->BSIM4v6pvoffGiven = TRUE; + break; + case BSIM4v6_MOD_PTVOFF: + mod->BSIM4v6ptvoff = value->rValue; + mod->BSIM4v6ptvoffGiven = TRUE; + break; + case BSIM4v6_MOD_PMINV: + mod->BSIM4v6pminv = value->rValue; + mod->BSIM4v6pminvGiven = TRUE; + break; + case BSIM4v6_MOD_PMINVCV: + mod->BSIM4v6pminvcv = value->rValue; + mod->BSIM4v6pminvcvGiven = TRUE; + break; + case BSIM4v6_MOD_PFPROUT: + mod->BSIM4v6pfprout = value->rValue; + mod->BSIM4v6pfproutGiven = TRUE; + break; + case BSIM4v6_MOD_PPDITS: + mod->BSIM4v6ppdits = value->rValue; + mod->BSIM4v6ppditsGiven = TRUE; + break; + case BSIM4v6_MOD_PPDITSD: + mod->BSIM4v6ppditsd = value->rValue; + mod->BSIM4v6ppditsdGiven = TRUE; + break; + case BSIM4v6_MOD_PDELTA : + mod->BSIM4v6pdelta = value->rValue; + mod->BSIM4v6pdeltaGiven = TRUE; + break; + case BSIM4v6_MOD_PRDSW: + mod->BSIM4v6prdsw = value->rValue; + mod->BSIM4v6prdswGiven = TRUE; + break; + case BSIM4v6_MOD_PRDW: + mod->BSIM4v6prdw = value->rValue; + mod->BSIM4v6prdwGiven = TRUE; + break; + case BSIM4v6_MOD_PRSW: + mod->BSIM4v6prsw = value->rValue; + mod->BSIM4v6prswGiven = TRUE; + break; + case BSIM4v6_MOD_PPRWB: + mod->BSIM4v6pprwb = value->rValue; + mod->BSIM4v6pprwbGiven = TRUE; + break; + case BSIM4v6_MOD_PPRWG: + mod->BSIM4v6pprwg = value->rValue; + mod->BSIM4v6pprwgGiven = TRUE; + break; + case BSIM4v6_MOD_PPRT: + mod->BSIM4v6pprt = value->rValue; + mod->BSIM4v6pprtGiven = TRUE; + break; + case BSIM4v6_MOD_PETA0: + mod->BSIM4v6peta0 = value->rValue; + mod->BSIM4v6peta0Given = TRUE; + break; + case BSIM4v6_MOD_PETAB: + mod->BSIM4v6petab = value->rValue; + mod->BSIM4v6petabGiven = TRUE; + break; + case BSIM4v6_MOD_PPCLM: + mod->BSIM4v6ppclm = value->rValue; + mod->BSIM4v6ppclmGiven = TRUE; + break; + case BSIM4v6_MOD_PPDIBL1: + mod->BSIM4v6ppdibl1 = value->rValue; + mod->BSIM4v6ppdibl1Given = TRUE; + break; + case BSIM4v6_MOD_PPDIBL2: + mod->BSIM4v6ppdibl2 = value->rValue; + mod->BSIM4v6ppdibl2Given = TRUE; + break; + case BSIM4v6_MOD_PPDIBLB: + mod->BSIM4v6ppdiblb = value->rValue; + mod->BSIM4v6ppdiblbGiven = TRUE; + break; + case BSIM4v6_MOD_PPSCBE1: + mod->BSIM4v6ppscbe1 = value->rValue; + mod->BSIM4v6ppscbe1Given = TRUE; + break; + case BSIM4v6_MOD_PPSCBE2: + mod->BSIM4v6ppscbe2 = value->rValue; + mod->BSIM4v6ppscbe2Given = TRUE; + break; + case BSIM4v6_MOD_PPVAG: + mod->BSIM4v6ppvag = value->rValue; + mod->BSIM4v6ppvagGiven = TRUE; + break; + case BSIM4v6_MOD_PWR : + mod->BSIM4v6pwr = value->rValue; + mod->BSIM4v6pwrGiven = TRUE; + break; + case BSIM4v6_MOD_PDWG : + mod->BSIM4v6pdwg = value->rValue; + mod->BSIM4v6pdwgGiven = TRUE; + break; + case BSIM4v6_MOD_PDWB : + mod->BSIM4v6pdwb = value->rValue; + mod->BSIM4v6pdwbGiven = TRUE; + break; + case BSIM4v6_MOD_PB0 : + mod->BSIM4v6pb0 = value->rValue; + mod->BSIM4v6pb0Given = TRUE; + break; + case BSIM4v6_MOD_PB1 : + mod->BSIM4v6pb1 = value->rValue; + mod->BSIM4v6pb1Given = TRUE; + break; + case BSIM4v6_MOD_PALPHA0 : + mod->BSIM4v6palpha0 = value->rValue; + mod->BSIM4v6palpha0Given = TRUE; + break; + case BSIM4v6_MOD_PALPHA1 : + mod->BSIM4v6palpha1 = value->rValue; + mod->BSIM4v6palpha1Given = TRUE; + break; + case BSIM4v6_MOD_PBETA0 : + mod->BSIM4v6pbeta0 = value->rValue; + mod->BSIM4v6pbeta0Given = TRUE; + break; + case BSIM4v6_MOD_PPHIN : + mod->BSIM4v6pphin = value->rValue; + mod->BSIM4v6pphinGiven = TRUE; + break; + case BSIM4v6_MOD_PAGIDL : + mod->BSIM4v6pagidl = value->rValue; + mod->BSIM4v6pagidlGiven = TRUE; + break; + case BSIM4v6_MOD_PBGIDL : + mod->BSIM4v6pbgidl = value->rValue; + mod->BSIM4v6pbgidlGiven = TRUE; + break; + case BSIM4v6_MOD_PCGIDL : + mod->BSIM4v6pcgidl = value->rValue; + mod->BSIM4v6pcgidlGiven = TRUE; + break; + case BSIM4v6_MOD_PEGIDL : + mod->BSIM4v6pegidl = value->rValue; + mod->BSIM4v6pegidlGiven = TRUE; + break; + case BSIM4v6_MOD_PAGISL : + mod->BSIM4v6pagisl = value->rValue; + mod->BSIM4v6pagislGiven = TRUE; + break; + case BSIM4v6_MOD_PBGISL : + mod->BSIM4v6pbgisl = value->rValue; + mod->BSIM4v6pbgislGiven = TRUE; + break; + case BSIM4v6_MOD_PCGISL : + mod->BSIM4v6pcgisl = value->rValue; + mod->BSIM4v6pcgislGiven = TRUE; + break; + case BSIM4v6_MOD_PEGISL : + mod->BSIM4v6pegisl = value->rValue; + mod->BSIM4v6pegislGiven = TRUE; + break; + case BSIM4v6_MOD_PAIGC : + mod->BSIM4v6paigc = value->rValue; + mod->BSIM4v6paigcGiven = TRUE; + break; + case BSIM4v6_MOD_PBIGC : + mod->BSIM4v6pbigc = value->rValue; + mod->BSIM4v6pbigcGiven = TRUE; + break; + case BSIM4v6_MOD_PCIGC : + mod->BSIM4v6pcigc = value->rValue; + mod->BSIM4v6pcigcGiven = TRUE; + break; + case BSIM4v6_MOD_PAIGSD : + mod->BSIM4v6paigsd = value->rValue; + mod->BSIM4v6paigsdGiven = TRUE; + break; + case BSIM4v6_MOD_PBIGSD : + mod->BSIM4v6pbigsd = value->rValue; + mod->BSIM4v6pbigsdGiven = TRUE; + break; + case BSIM4v6_MOD_PCIGSD : + mod->BSIM4v6pcigsd = value->rValue; + mod->BSIM4v6pcigsdGiven = TRUE; + break; + case BSIM4v6_MOD_PAIGS : + mod->BSIM4v6paigs = value->rValue; + mod->BSIM4v6paigsGiven = TRUE; + break; + case BSIM4v6_MOD_PBIGS : + mod->BSIM4v6pbigs = value->rValue; + mod->BSIM4v6pbigsGiven = TRUE; + break; + case BSIM4v6_MOD_PCIGS : + mod->BSIM4v6pcigs = value->rValue; + mod->BSIM4v6pcigsGiven = TRUE; + break; + case BSIM4v6_MOD_PAIGD : + mod->BSIM4v6paigd = value->rValue; + mod->BSIM4v6paigdGiven = TRUE; + break; + case BSIM4v6_MOD_PBIGD : + mod->BSIM4v6pbigd = value->rValue; + mod->BSIM4v6pbigdGiven = TRUE; + break; + case BSIM4v6_MOD_PCIGD : + mod->BSIM4v6pcigd = value->rValue; + mod->BSIM4v6pcigdGiven = TRUE; + break; + case BSIM4v6_MOD_PAIGBACC : + mod->BSIM4v6paigbacc = value->rValue; + mod->BSIM4v6paigbaccGiven = TRUE; + break; + case BSIM4v6_MOD_PBIGBACC : + mod->BSIM4v6pbigbacc = value->rValue; + mod->BSIM4v6pbigbaccGiven = TRUE; + break; + case BSIM4v6_MOD_PCIGBACC : + mod->BSIM4v6pcigbacc = value->rValue; + mod->BSIM4v6pcigbaccGiven = TRUE; + break; + case BSIM4v6_MOD_PAIGBINV : + mod->BSIM4v6paigbinv = value->rValue; + mod->BSIM4v6paigbinvGiven = TRUE; + break; + case BSIM4v6_MOD_PBIGBINV : + mod->BSIM4v6pbigbinv = value->rValue; + mod->BSIM4v6pbigbinvGiven = TRUE; + break; + case BSIM4v6_MOD_PCIGBINV : + mod->BSIM4v6pcigbinv = value->rValue; + mod->BSIM4v6pcigbinvGiven = TRUE; + break; + case BSIM4v6_MOD_PNIGC : + mod->BSIM4v6pnigc = value->rValue; + mod->BSIM4v6pnigcGiven = TRUE; + break; + case BSIM4v6_MOD_PNIGBINV : + mod->BSIM4v6pnigbinv = value->rValue; + mod->BSIM4v6pnigbinvGiven = TRUE; + break; + case BSIM4v6_MOD_PNIGBACC : + mod->BSIM4v6pnigbacc = value->rValue; + mod->BSIM4v6pnigbaccGiven = TRUE; + break; + case BSIM4v6_MOD_PNTOX : + mod->BSIM4v6pntox = value->rValue; + mod->BSIM4v6pntoxGiven = TRUE; + break; + case BSIM4v6_MOD_PEIGBINV : + mod->BSIM4v6peigbinv = value->rValue; + mod->BSIM4v6peigbinvGiven = TRUE; + break; + case BSIM4v6_MOD_PPIGCD : + mod->BSIM4v6ppigcd = value->rValue; + mod->BSIM4v6ppigcdGiven = TRUE; + break; + case BSIM4v6_MOD_PPOXEDGE : + mod->BSIM4v6ppoxedge = value->rValue; + mod->BSIM4v6ppoxedgeGiven = TRUE; + break; + case BSIM4v6_MOD_PXRCRG1 : + mod->BSIM4v6pxrcrg1 = value->rValue; + mod->BSIM4v6pxrcrg1Given = TRUE; + break; + case BSIM4v6_MOD_PXRCRG2 : + mod->BSIM4v6pxrcrg2 = value->rValue; + mod->BSIM4v6pxrcrg2Given = TRUE; + break; + case BSIM4v6_MOD_PLAMBDA : + mod->BSIM4v6plambda = value->rValue; + mod->BSIM4v6plambdaGiven = TRUE; + break; + case BSIM4v6_MOD_PVTL : + mod->BSIM4v6pvtl = value->rValue; + mod->BSIM4v6pvtlGiven = TRUE; + break; + case BSIM4v6_MOD_PXN: + mod->BSIM4v6pxn = value->rValue; + mod->BSIM4v6pxnGiven = TRUE; + break; + case BSIM4v6_MOD_PVFBSDOFF: + mod->BSIM4v6pvfbsdoff = value->rValue; + mod->BSIM4v6pvfbsdoffGiven = TRUE; + break; + case BSIM4v6_MOD_PTVFBSDOFF: + mod->BSIM4v6ptvfbsdoff = value->rValue; + mod->BSIM4v6ptvfbsdoffGiven = TRUE; + break; + case BSIM4v6_MOD_PEU : + mod->BSIM4v6peu = value->rValue; + mod->BSIM4v6peuGiven = TRUE; + break; + case BSIM4v6_MOD_PUCS : + mod->BSIM4v6pucs = value->rValue; + mod->BSIM4v6pucsGiven = TRUE; + break; + case BSIM4v6_MOD_PVFB : + mod->BSIM4v6pvfb = value->rValue; + mod->BSIM4v6pvfbGiven = TRUE; + break; + case BSIM4v6_MOD_PCGSL : + mod->BSIM4v6pcgsl = value->rValue; + mod->BSIM4v6pcgslGiven = TRUE; + break; + case BSIM4v6_MOD_PCGDL : + mod->BSIM4v6pcgdl = value->rValue; + mod->BSIM4v6pcgdlGiven = TRUE; + break; + case BSIM4v6_MOD_PCKAPPAS : + mod->BSIM4v6pckappas = value->rValue; + mod->BSIM4v6pckappasGiven = TRUE; + break; + case BSIM4v6_MOD_PCKAPPAD : + mod->BSIM4v6pckappad = value->rValue; + mod->BSIM4v6pckappadGiven = TRUE; + break; + case BSIM4v6_MOD_PCF : + mod->BSIM4v6pcf = value->rValue; + mod->BSIM4v6pcfGiven = TRUE; + break; + case BSIM4v6_MOD_PCLC : + mod->BSIM4v6pclc = value->rValue; + mod->BSIM4v6pclcGiven = TRUE; + break; + case BSIM4v6_MOD_PCLE : + mod->BSIM4v6pcle = value->rValue; + mod->BSIM4v6pcleGiven = TRUE; + break; + case BSIM4v6_MOD_PVFBCV : + mod->BSIM4v6pvfbcv = value->rValue; + mod->BSIM4v6pvfbcvGiven = TRUE; + break; + case BSIM4v6_MOD_PACDE : + mod->BSIM4v6pacde = value->rValue; + mod->BSIM4v6pacdeGiven = TRUE; + break; + case BSIM4v6_MOD_PMOIN : + mod->BSIM4v6pmoin = value->rValue; + mod->BSIM4v6pmoinGiven = TRUE; + break; + case BSIM4v6_MOD_PNOFF : + mod->BSIM4v6pnoff = value->rValue; + mod->BSIM4v6pnoffGiven = TRUE; + break; + case BSIM4v6_MOD_PVOFFCV : + mod->BSIM4v6pvoffcv = value->rValue; + mod->BSIM4v6pvoffcvGiven = TRUE; + break; + + case BSIM4v6_MOD_TNOM : + mod->BSIM4v6tnom = value->rValue + CONSTCtoK; + mod->BSIM4v6tnomGiven = TRUE; + break; + case BSIM4v6_MOD_CGSO : + mod->BSIM4v6cgso = value->rValue; + mod->BSIM4v6cgsoGiven = TRUE; + break; + case BSIM4v6_MOD_CGDO : + mod->BSIM4v6cgdo = value->rValue; + mod->BSIM4v6cgdoGiven = TRUE; + break; + case BSIM4v6_MOD_CGBO : + mod->BSIM4v6cgbo = value->rValue; + mod->BSIM4v6cgboGiven = TRUE; + break; + case BSIM4v6_MOD_XPART : + mod->BSIM4v6xpart = value->rValue; + mod->BSIM4v6xpartGiven = TRUE; + break; + case BSIM4v6_MOD_RSH : + mod->BSIM4v6sheetResistance = value->rValue; + mod->BSIM4v6sheetResistanceGiven = TRUE; + break; + case BSIM4v6_MOD_JSS : + mod->BSIM4v6SjctSatCurDensity = value->rValue; + mod->BSIM4v6SjctSatCurDensityGiven = TRUE; + break; + case BSIM4v6_MOD_JSWS : + mod->BSIM4v6SjctSidewallSatCurDensity = value->rValue; + mod->BSIM4v6SjctSidewallSatCurDensityGiven = TRUE; + break; + case BSIM4v6_MOD_JSWGS : + mod->BSIM4v6SjctGateSidewallSatCurDensity = value->rValue; + mod->BSIM4v6SjctGateSidewallSatCurDensityGiven = TRUE; + break; + case BSIM4v6_MOD_PBS : + mod->BSIM4v6SbulkJctPotential = value->rValue; + mod->BSIM4v6SbulkJctPotentialGiven = TRUE; + break; + case BSIM4v6_MOD_MJS : + mod->BSIM4v6SbulkJctBotGradingCoeff = value->rValue; + mod->BSIM4v6SbulkJctBotGradingCoeffGiven = TRUE; + break; + case BSIM4v6_MOD_PBSWS : + mod->BSIM4v6SsidewallJctPotential = value->rValue; + mod->BSIM4v6SsidewallJctPotentialGiven = TRUE; + break; + case BSIM4v6_MOD_MJSWS : + mod->BSIM4v6SbulkJctSideGradingCoeff = value->rValue; + mod->BSIM4v6SbulkJctSideGradingCoeffGiven = TRUE; + break; + case BSIM4v6_MOD_CJS : + mod->BSIM4v6SunitAreaJctCap = value->rValue; + mod->BSIM4v6SunitAreaJctCapGiven = TRUE; + break; + case BSIM4v6_MOD_CJSWS : + mod->BSIM4v6SunitLengthSidewallJctCap = value->rValue; + mod->BSIM4v6SunitLengthSidewallJctCapGiven = TRUE; + break; + case BSIM4v6_MOD_NJS : + mod->BSIM4v6SjctEmissionCoeff = value->rValue; + mod->BSIM4v6SjctEmissionCoeffGiven = TRUE; + break; + case BSIM4v6_MOD_PBSWGS : + mod->BSIM4v6SGatesidewallJctPotential = value->rValue; + mod->BSIM4v6SGatesidewallJctPotentialGiven = TRUE; + break; + case BSIM4v6_MOD_MJSWGS : + mod->BSIM4v6SbulkJctGateSideGradingCoeff = value->rValue; + mod->BSIM4v6SbulkJctGateSideGradingCoeffGiven = TRUE; + break; + case BSIM4v6_MOD_CJSWGS : + mod->BSIM4v6SunitLengthGateSidewallJctCap = value->rValue; + mod->BSIM4v6SunitLengthGateSidewallJctCapGiven = TRUE; + break; + case BSIM4v6_MOD_XTIS : + mod->BSIM4v6SjctTempExponent = value->rValue; + mod->BSIM4v6SjctTempExponentGiven = TRUE; + break; + case BSIM4v6_MOD_JSD : + mod->BSIM4v6DjctSatCurDensity = value->rValue; + mod->BSIM4v6DjctSatCurDensityGiven = TRUE; + break; + case BSIM4v6_MOD_JSWD : + mod->BSIM4v6DjctSidewallSatCurDensity = value->rValue; + mod->BSIM4v6DjctSidewallSatCurDensityGiven = TRUE; + break; + case BSIM4v6_MOD_JSWGD : + mod->BSIM4v6DjctGateSidewallSatCurDensity = value->rValue; + mod->BSIM4v6DjctGateSidewallSatCurDensityGiven = TRUE; + break; + case BSIM4v6_MOD_PBD : + mod->BSIM4v6DbulkJctPotential = value->rValue; + mod->BSIM4v6DbulkJctPotentialGiven = TRUE; + break; + case BSIM4v6_MOD_MJD : + mod->BSIM4v6DbulkJctBotGradingCoeff = value->rValue; + mod->BSIM4v6DbulkJctBotGradingCoeffGiven = TRUE; + break; + case BSIM4v6_MOD_PBSWD : + mod->BSIM4v6DsidewallJctPotential = value->rValue; + mod->BSIM4v6DsidewallJctPotentialGiven = TRUE; + break; + case BSIM4v6_MOD_MJSWD : + mod->BSIM4v6DbulkJctSideGradingCoeff = value->rValue; + mod->BSIM4v6DbulkJctSideGradingCoeffGiven = TRUE; + break; + case BSIM4v6_MOD_CJD : + mod->BSIM4v6DunitAreaJctCap = value->rValue; + mod->BSIM4v6DunitAreaJctCapGiven = TRUE; + break; + case BSIM4v6_MOD_CJSWD : + mod->BSIM4v6DunitLengthSidewallJctCap = value->rValue; + mod->BSIM4v6DunitLengthSidewallJctCapGiven = TRUE; + break; + case BSIM4v6_MOD_NJD : + mod->BSIM4v6DjctEmissionCoeff = value->rValue; + mod->BSIM4v6DjctEmissionCoeffGiven = TRUE; + break; + case BSIM4v6_MOD_PBSWGD : + mod->BSIM4v6DGatesidewallJctPotential = value->rValue; + mod->BSIM4v6DGatesidewallJctPotentialGiven = TRUE; + break; + case BSIM4v6_MOD_MJSWGD : + mod->BSIM4v6DbulkJctGateSideGradingCoeff = value->rValue; + mod->BSIM4v6DbulkJctGateSideGradingCoeffGiven = TRUE; + break; + case BSIM4v6_MOD_CJSWGD : + mod->BSIM4v6DunitLengthGateSidewallJctCap = value->rValue; + mod->BSIM4v6DunitLengthGateSidewallJctCapGiven = TRUE; + break; + case BSIM4v6_MOD_XTID : + mod->BSIM4v6DjctTempExponent = value->rValue; + mod->BSIM4v6DjctTempExponentGiven = TRUE; + break; + case BSIM4v6_MOD_LINT : + mod->BSIM4v6Lint = value->rValue; + mod->BSIM4v6LintGiven = TRUE; + break; + case BSIM4v6_MOD_LL : + mod->BSIM4v6Ll = value->rValue; + mod->BSIM4v6LlGiven = TRUE; + break; + case BSIM4v6_MOD_LLC : + mod->BSIM4v6Llc = value->rValue; + mod->BSIM4v6LlcGiven = TRUE; + break; + case BSIM4v6_MOD_LLN : + mod->BSIM4v6Lln = value->rValue; + mod->BSIM4v6LlnGiven = TRUE; + break; + case BSIM4v6_MOD_LW : + mod->BSIM4v6Lw = value->rValue; + mod->BSIM4v6LwGiven = TRUE; + break; + case BSIM4v6_MOD_LWC : + mod->BSIM4v6Lwc = value->rValue; + mod->BSIM4v6LwcGiven = TRUE; + break; + case BSIM4v6_MOD_LWN : + mod->BSIM4v6Lwn = value->rValue; + mod->BSIM4v6LwnGiven = TRUE; + break; + case BSIM4v6_MOD_LWL : + mod->BSIM4v6Lwl = value->rValue; + mod->BSIM4v6LwlGiven = TRUE; + break; + case BSIM4v6_MOD_LWLC : + mod->BSIM4v6Lwlc = value->rValue; + mod->BSIM4v6LwlcGiven = TRUE; + break; + case BSIM4v6_MOD_LMIN : + mod->BSIM4v6Lmin = value->rValue; + mod->BSIM4v6LminGiven = TRUE; + break; + case BSIM4v6_MOD_LMAX : + mod->BSIM4v6Lmax = value->rValue; + mod->BSIM4v6LmaxGiven = TRUE; + break; + case BSIM4v6_MOD_WINT : + mod->BSIM4v6Wint = value->rValue; + mod->BSIM4v6WintGiven = TRUE; + break; + case BSIM4v6_MOD_WL : + mod->BSIM4v6Wl = value->rValue; + mod->BSIM4v6WlGiven = TRUE; + break; + case BSIM4v6_MOD_WLC : + mod->BSIM4v6Wlc = value->rValue; + mod->BSIM4v6WlcGiven = TRUE; + break; + case BSIM4v6_MOD_WLN : + mod->BSIM4v6Wln = value->rValue; + mod->BSIM4v6WlnGiven = TRUE; + break; + case BSIM4v6_MOD_WW : + mod->BSIM4v6Ww = value->rValue; + mod->BSIM4v6WwGiven = TRUE; + break; + case BSIM4v6_MOD_WWC : + mod->BSIM4v6Wwc = value->rValue; + mod->BSIM4v6WwcGiven = TRUE; + break; + case BSIM4v6_MOD_WWN : + mod->BSIM4v6Wwn = value->rValue; + mod->BSIM4v6WwnGiven = TRUE; + break; + case BSIM4v6_MOD_WWL : + mod->BSIM4v6Wwl = value->rValue; + mod->BSIM4v6WwlGiven = TRUE; + break; + case BSIM4v6_MOD_WWLC : + mod->BSIM4v6Wwlc = value->rValue; + mod->BSIM4v6WwlcGiven = TRUE; + break; + case BSIM4v6_MOD_WMIN : + mod->BSIM4v6Wmin = value->rValue; + mod->BSIM4v6WminGiven = TRUE; + break; + case BSIM4v6_MOD_WMAX : + mod->BSIM4v6Wmax = value->rValue; + mod->BSIM4v6WmaxGiven = TRUE; + break; + + case BSIM4v6_MOD_NOIA : + mod->BSIM4v6oxideTrapDensityA = value->rValue; + mod->BSIM4v6oxideTrapDensityAGiven = TRUE; + break; + case BSIM4v6_MOD_NOIB : + mod->BSIM4v6oxideTrapDensityB = value->rValue; + mod->BSIM4v6oxideTrapDensityBGiven = TRUE; + break; + case BSIM4v6_MOD_NOIC : + mod->BSIM4v6oxideTrapDensityC = value->rValue; + mod->BSIM4v6oxideTrapDensityCGiven = TRUE; + break; + case BSIM4v6_MOD_EM : + mod->BSIM4v6em = value->rValue; + mod->BSIM4v6emGiven = TRUE; + break; + case BSIM4v6_MOD_EF : + mod->BSIM4v6ef = value->rValue; + mod->BSIM4v6efGiven = TRUE; + break; + case BSIM4v6_MOD_AF : + mod->BSIM4v6af = value->rValue; + mod->BSIM4v6afGiven = TRUE; + break; + case BSIM4v6_MOD_KF : + mod->BSIM4v6kf = value->rValue; + mod->BSIM4v6kfGiven = TRUE; + break; + case BSIM4v6_MOD_NMOS : + if(value->iValue) { + mod->BSIM4v6type = 1; + mod->BSIM4v6typeGiven = TRUE; + } + break; + case BSIM4v6_MOD_PMOS : + if(value->iValue) { + mod->BSIM4v6type = - 1; + mod->BSIM4v6typeGiven = TRUE; + } + break; + default: + return(E_BADPARM); + } + return(OK); +} + + diff --git a/src/spicelib/devices/bsim4v6/b4v6noi.c b/src/spicelib/devices/bsim4v6/b4v6noi.c new file mode 100644 index 000000000..691d2aaa0 --- /dev/null +++ b/src/spicelib/devices/bsim4v6/b4v6noi.c @@ -0,0 +1,544 @@ +/**** BSIM4.6.2 Released by Wenwei Yang 07/31/2008 ****/ +/**** BSIM4.6.4 Update ngspice 08/22/2009 ****/ +/********** + * Copyright 2006 Regents of the University of California. All rights reserved. + * File: b4noi.c of BSIM4.6.2. + * Author: 2000 Weidong Liu + * Authors: 2001- Xuemei Xi, Mohan Dunga, Ali Niknejad, Chenming Hu. + * Authors: 2006- Mohan Dunga, Ali Niknejad, Chenming Hu + * Authors: 2007- Mohan Dunga, Wenwei Yang, Ali Niknejad, Chenming Hu + * Authors: 2008- Wenwei Yang, 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, 03/04/2004. + * Modified by Xuemei Xi, 07/29/2005. + * Modified by Mohan Dunga, 12/13/2006 + * Modified by Wenwei Yang, 07/31/2008. + **********/ + +#include "ngspice.h" +#include "bsim4v6def.h" +#include "cktdefs.h" +#include "iferrmsg.h" +#include "noisedef.h" +#include "suffix.h" +#include "const.h" + + +/* + * WDL: 1/f noise model has been smoothed out and enhanced with + * bulk charge effect as well as physical N* equ. and necessary + * conversion into the SI unit system. + */ + +static double +Eval1ovFNoise(double Vds, BSIM4v6model *model, BSIM4v6instance *here, double freq, double temp) +{ +struct bsim4v6SizeDependParam *pParam; +double cd, esat, DelClm, EffFreq, N0, Nl, Leff, Leffsq; +double T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, Ssi; + + pParam = here->pParam; + cd = fabs(here->BSIM4v6cd); + Leff = pParam->BSIM4v6leff - 2.0 * model->BSIM4v6lintnoi; + Leffsq = Leff * Leff; + esat = 2.0 * here->BSIM4v6vsattemp / here->BSIM4v6ueff; + if(model->BSIM4v6em<=0.0) DelClm = 0.0; /* flicker noise modified -JX */ + else { + T0 = ((((Vds - here->BSIM4v6Vdseff) / pParam->BSIM4v6litl) + + model->BSIM4v6em) / esat); + DelClm = pParam->BSIM4v6litl * log (MAX(T0, N_MINLOG)); + if (DelClm < 0.0) DelClm = 0.0; /* bugfix */ + } + EffFreq = pow(freq, model->BSIM4v6ef); + T1 = CHARGE * CHARGE * CONSTboltz * cd * temp * here->BSIM4v6ueff; + T2 = 1.0e10 * EffFreq * here->BSIM4v6Abulk * model->BSIM4v6coxe * Leffsq; + N0 = model->BSIM4v6coxe * here->BSIM4v6Vgsteff / CHARGE; + Nl = model->BSIM4v6coxe * here->BSIM4v6Vgsteff + * (1.0 - here->BSIM4v6AbovVgst2Vtm * here->BSIM4v6Vdseff) / CHARGE; + + T3 = model->BSIM4v6oxideTrapDensityA + * log(MAX(((N0 + here->BSIM4v6nstar) / (Nl + here->BSIM4v6nstar)), N_MINLOG)); + T4 = model->BSIM4v6oxideTrapDensityB * (N0 - Nl); + T5 = model->BSIM4v6oxideTrapDensityC * 0.5 * (N0 * N0 - Nl * Nl); + + T6 = CONSTboltz * temp * cd * cd; + T7 = 1.0e10 * EffFreq * Leffsq * pParam->BSIM4v6weff * here->BSIM4v6nf; + T8 = model->BSIM4v6oxideTrapDensityA + model->BSIM4v6oxideTrapDensityB * Nl + + model->BSIM4v6oxideTrapDensityC * Nl * Nl; + T9 = (Nl + here->BSIM4v6nstar) * (Nl + here->BSIM4v6nstar); + Ssi = T1 / T2 * (T3 + T4 + T5) + T6 / T7 * DelClm * T8 / T9; + return Ssi; +} + + +int +BSIM4v6noise( +int mode, +int operation, +GENmodel *inModel, +CKTcircuit *ckt, +Ndata *data, +double *OnDens) +{ +BSIM4v6model *model = (BSIM4v6model *)inModel; +BSIM4v6instance *here; +struct bsim4v6SizeDependParam *pParam; +char name[N_MXVLNTH]; +double tempOnoise; +double tempInoise; +double noizDens[BSIM4v6NSRCS]; +double lnNdens[BSIM4v6NSRCS]; + +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, bodymode; + +double m; + +int i; + + /* define the names of the noise sources */ + static char *BSIM4v6nNames[BSIM4v6NSRCS] = + { /* Note that we have to keep the order */ + ".rd", /* noise due to rd */ + ".rs", /* noise due to rs */ + ".rg", /* noise due to rgeltd */ + ".rbps", /* noise due to rbps */ + ".rbpd", /* noise due to rbpd */ + ".rbpb", /* noise due to rbpb */ + ".rbsb", /* noise due to rbsb */ + ".rbdb", /* noise due to rbdb */ + ".id", /* noise due to id */ + ".1overf", /* flicker (1/f) noise */ + ".igs", /* shot noise due to IGS */ + ".igd", /* shot noise due to IGD */ + ".igb", /* shot noise due to IGB */ + "" /* total transistor noise */ + }; + + for (; model != NULL; model = model->BSIM4v6nextModel) + { for (here = model->BSIM4v6instances; here != NULL; + here = here->BSIM4v6nextInstance) + { pParam = here->pParam; + switch (operation) + { case N_OPEN: + /* see if we have to to produce a summary report */ + /* if so, name all the noise generators */ + + if (((NOISEAN*)ckt->CKTcurJob)->NStpsSm != 0) + { switch (mode) + { case N_DENS: + for (i = 0; i < BSIM4v6NSRCS; i++) + { (void) sprintf(name, "onoise.%s%s", + here->BSIM4v6name, + BSIM4v6nNames[i]); + data->namelist = TREALLOC(IFuid, data->namelist, data->numPlots + 1); + if (!data->namelist) + return(E_NOMEM); + SPfrontEnd->IFnewUid (ckt, + &(data->namelist[data->numPlots++]), + NULL, name, UID_OTHER, + NULL); + /* we've added one more plot */ + } + break; + case INT_NOIZ: + for (i = 0; i < BSIM4v6NSRCS; i++) + { (void) sprintf(name, "onoise_total.%s%s", + here->BSIM4v6name, + BSIM4v6nNames[i]); + data->namelist = TREALLOC(IFuid, data->namelist, data->numPlots + 1); + if (!data->namelist) + return(E_NOMEM); + SPfrontEnd->IFnewUid (ckt, + &(data->namelist[data->numPlots++]), + NULL, name, UID_OTHER, + NULL); + /* we've added one more plot */ + + (void) sprintf(name, "inoise_total.%s%s", + here->BSIM4v6name, + BSIM4v6nNames[i]); + data->namelist = TREALLOC(IFuid, data->namelist, data->numPlots + 1); + if (!data->namelist) + return(E_NOMEM); + SPfrontEnd->IFnewUid (ckt, + &(data->namelist[data->numPlots++]), + NULL, name, UID_OTHER, + NULL); + /* we've added one more plot */ + } + break; + } + } + break; + case N_CALC: + m = here->BSIM4v6m; + switch (mode) + { case N_DENS: + if (model->BSIM4v6tnoiMod == 0) + { if (model->BSIM4v6rdsMod == 0) + { gspr = here->BSIM4v6sourceConductance; + gdpr = here->BSIM4v6drainConductance; + if (here->BSIM4v6grdsw > 0.0) + tmp = 1.0 / here->BSIM4v6grdsw; /* tmp used below */ + else + tmp = 0.0; + } + else + { gspr = here->BSIM4v6gstot; + gdpr = here->BSIM4v6gdtot; + tmp = 0.0; + } + } + else + { T5 = here->BSIM4v6Vgsteff / here->BSIM4v6EsatL; + T5 *= T5; + npart_beta = model->BSIM4v6rnoia * (1.0 + T5 + * model->BSIM4v6tnoia * pParam->BSIM4v6leff); + npart_theta = model->BSIM4v6rnoib * (1.0 + T5 + * model->BSIM4v6tnoib * pParam->BSIM4v6leff); + if(npart_theta > 0.9) + npart_theta = 0.9; + if(npart_theta > 0.9 * npart_beta) + npart_theta = 0.9 * npart_beta; //4.6.2 + + if (model->BSIM4v6rdsMod == 0) + { gspr = here->BSIM4v6sourceConductance; + gdpr = here->BSIM4v6drainConductance; + } + else + { gspr = here->BSIM4v6gstot; + gdpr = here->BSIM4v6gdtot; + } + + if ((*(ckt->CKTstates[0] + here->BSIM4v6vds)) >= 0.0) + gspr = gspr * (1.0 + npart_theta * npart_theta * gspr + / here->BSIM4v6IdovVds); /* bugfix */ + else + gdpr = gdpr * (1.0 + npart_theta * npart_theta * gdpr + / here->BSIM4v6IdovVds); + } + + NevalSrc(&noizDens[BSIM4v6RDNOIZ], + &lnNdens[BSIM4v6RDNOIZ], ckt, THERMNOISE, + here->BSIM4v6dNodePrime, here->BSIM4v6dNode, + gdpr * m); + + NevalSrc(&noizDens[BSIM4v6RSNOIZ], + &lnNdens[BSIM4v6RSNOIZ], ckt, THERMNOISE, + here->BSIM4v6sNodePrime, here->BSIM4v6sNode, + gspr * m); + + + if (here->BSIM4v6rgateMod == 1) + { NevalSrc(&noizDens[BSIM4v6RGNOIZ], + &lnNdens[BSIM4v6RGNOIZ], ckt, THERMNOISE, + here->BSIM4v6gNodePrime, here->BSIM4v6gNodeExt, + here->BSIM4v6grgeltd * m); + } + else if (here->BSIM4v6rgateMod == 2) + { + T0 = 1.0 + here->BSIM4v6grgeltd/here->BSIM4v6gcrg; + T1 = T0 * T0; + NevalSrc(&noizDens[BSIM4v6RGNOIZ], + &lnNdens[BSIM4v6RGNOIZ], ckt, THERMNOISE, + here->BSIM4v6gNodePrime, here->BSIM4v6gNodeExt, + here->BSIM4v6grgeltd * m / T1); + } + else if (here->BSIM4v6rgateMod == 3) + { NevalSrc(&noizDens[BSIM4v6RGNOIZ], + &lnNdens[BSIM4v6RGNOIZ], ckt, THERMNOISE, + here->BSIM4v6gNodeMid, here->BSIM4v6gNodeExt, + here->BSIM4v6grgeltd * m); + } + else + { noizDens[BSIM4v6RGNOIZ] = 0.0; + lnNdens[BSIM4v6RGNOIZ] = + log(MAX(noizDens[BSIM4v6RGNOIZ], N_MINLOG)); + } + + bodymode = 5; + if (here->BSIM4v6rbodyMod == 2) + { if( ( !model->BSIM4v6rbps0Given) || + ( !model->BSIM4v6rbpd0Given) ) + bodymode = 1; + else + if( (!model->BSIM4v6rbsbx0Given && !model->BSIM4v6rbsby0Given) || + (!model->BSIM4v6rbdbx0Given && !model->BSIM4v6rbdby0Given) ) + bodymode = 3; + } + + if (here->BSIM4v6rbodyMod) + { + if(bodymode == 5) + { + NevalSrc(&noizDens[BSIM4v6RBPSNOIZ], + &lnNdens[BSIM4v6RBPSNOIZ], ckt, THERMNOISE, + here->BSIM4v6bNodePrime, here->BSIM4v6sbNode, + here->BSIM4v6grbps * m); + NevalSrc(&noizDens[BSIM4v6RBPDNOIZ], + &lnNdens[BSIM4v6RBPDNOIZ], ckt, THERMNOISE, + here->BSIM4v6bNodePrime, here->BSIM4v6dbNode, + here->BSIM4v6grbpd * m); + NevalSrc(&noizDens[BSIM4v6RBPBNOIZ], + &lnNdens[BSIM4v6RBPBNOIZ], ckt, THERMNOISE, + here->BSIM4v6bNodePrime, here->BSIM4v6bNode, + here->BSIM4v6grbpb * m); + NevalSrc(&noizDens[BSIM4v6RBSBNOIZ], + &lnNdens[BSIM4v6RBSBNOIZ], ckt, THERMNOISE, + here->BSIM4v6bNode, here->BSIM4v6sbNode, + here->BSIM4v6grbsb * m); + NevalSrc(&noizDens[BSIM4v6RBDBNOIZ], + &lnNdens[BSIM4v6RBDBNOIZ], ckt, THERMNOISE, + here->BSIM4v6bNode, here->BSIM4v6dbNode, + here->BSIM4v6grbdb * m); + } + if(bodymode == 3) + { + NevalSrc(&noizDens[BSIM4v6RBPSNOIZ], + &lnNdens[BSIM4v6RBPSNOIZ], ckt, THERMNOISE, + here->BSIM4v6bNodePrime, here->BSIM4v6sbNode, + here->BSIM4v6grbps * m); + NevalSrc(&noizDens[BSIM4v6RBPDNOIZ], + &lnNdens[BSIM4v6RBPDNOIZ], ckt, THERMNOISE, + here->BSIM4v6bNodePrime, here->BSIM4v6dbNode, + here->BSIM4v6grbpd * m); + NevalSrc(&noizDens[BSIM4v6RBPBNOIZ], + &lnNdens[BSIM4v6RBPBNOIZ], ckt, THERMNOISE, + here->BSIM4v6bNodePrime, here->BSIM4v6bNode, + here->BSIM4v6grbpb * m); + noizDens[BSIM4v6RBSBNOIZ] = noizDens[BSIM4v6RBDBNOIZ] = 0.0; + lnNdens[BSIM4v6RBSBNOIZ] = + log(MAX(noizDens[BSIM4v6RBSBNOIZ], N_MINLOG)); + lnNdens[BSIM4v6RBDBNOIZ] = + log(MAX(noizDens[BSIM4v6RBDBNOIZ], N_MINLOG)); + } + if(bodymode == 1) + { + NevalSrc(&noizDens[BSIM4v6RBPBNOIZ], + &lnNdens[BSIM4v6RBPBNOIZ], ckt, THERMNOISE, + here->BSIM4v6bNodePrime, here->BSIM4v6bNode, + here->BSIM4v6grbpb * m); + noizDens[BSIM4v6RBPSNOIZ] = noizDens[BSIM4v6RBPDNOIZ] = 0.0; + noizDens[BSIM4v6RBSBNOIZ] = noizDens[BSIM4v6RBDBNOIZ] = 0.0; + lnNdens[BSIM4v6RBPSNOIZ] = + log(MAX(noizDens[BSIM4v6RBPSNOIZ], N_MINLOG)); + lnNdens[BSIM4v6RBPDNOIZ] = + log(MAX(noizDens[BSIM4v6RBPDNOIZ], N_MINLOG)); + lnNdens[BSIM4v6RBSBNOIZ] = + log(MAX(noizDens[BSIM4v6RBSBNOIZ], N_MINLOG)); + lnNdens[BSIM4v6RBDBNOIZ] = + log(MAX(noizDens[BSIM4v6RBDBNOIZ], N_MINLOG)); + } + } + else + { noizDens[BSIM4v6RBPSNOIZ] = noizDens[BSIM4v6RBPDNOIZ] = 0.0; + noizDens[BSIM4v6RBPBNOIZ] = 0.0; + noizDens[BSIM4v6RBSBNOIZ] = noizDens[BSIM4v6RBDBNOIZ] = 0.0; + lnNdens[BSIM4v6RBPSNOIZ] = + log(MAX(noizDens[BSIM4v6RBPSNOIZ], N_MINLOG)); + lnNdens[BSIM4v6RBPDNOIZ] = + log(MAX(noizDens[BSIM4v6RBPDNOIZ], N_MINLOG)); + lnNdens[BSIM4v6RBPBNOIZ] = + log(MAX(noizDens[BSIM4v6RBPBNOIZ], N_MINLOG)); + lnNdens[BSIM4v6RBSBNOIZ] = + log(MAX(noizDens[BSIM4v6RBSBNOIZ], N_MINLOG)); + lnNdens[BSIM4v6RBDBNOIZ] = + log(MAX(noizDens[BSIM4v6RBDBNOIZ], N_MINLOG)); + } + + + switch(model->BSIM4v6tnoiMod) + { case 0: + T0 = m * here->BSIM4v6ueff * fabs(here->BSIM4v6qinv); + T1 = T0 * tmp + pParam->BSIM4v6leff + * pParam->BSIM4v6leff; + NevalSrc(&noizDens[BSIM4v6IDNOIZ], + &lnNdens[BSIM4v6IDNOIZ], ckt, + THERMNOISE, here->BSIM4v6dNodePrime, + here->BSIM4v6sNodePrime, + (T0 / T1) * model->BSIM4v6ntnoi); + break; + case 1: + T0 = m * (here->BSIM4v6gm + here->BSIM4v6gmbs + here->BSIM4v6gds); + T0 *= T0; + igsquare = npart_theta * npart_theta * T0 / here->BSIM4v6IdovVds; + T1 = npart_beta * (here->BSIM4v6gm + + here->BSIM4v6gmbs) + here->BSIM4v6gds; + T2 = T1 * T1 / here->BSIM4v6IdovVds; + NevalSrc(&noizDens[BSIM4v6IDNOIZ], + &lnNdens[BSIM4v6IDNOIZ], ckt, + THERMNOISE, here->BSIM4v6dNodePrime, + here->BSIM4v6sNodePrime, (T2 - igsquare)); + break; + } + + NevalSrc(&noizDens[BSIM4v6FLNOIZ], NULL, + ckt, N_GAIN, here->BSIM4v6dNodePrime, + here->BSIM4v6sNodePrime, (double) 0.0); + + switch(model->BSIM4v6fnoiMod) + { case 0: + noizDens[BSIM4v6FLNOIZ] *= m * model->BSIM4v6kf + * exp(model->BSIM4v6af + * log(MAX(fabs(here->BSIM4v6cd), + N_MINLOG))) + / (pow(data->freq, model->BSIM4v6ef) + * pParam->BSIM4v6leff + * pParam->BSIM4v6leff + * model->BSIM4v6coxe); + break; + case 1: + Vds = *(ckt->CKTstates[0] + here->BSIM4v6vds); + if (Vds < 0.0) + Vds = -Vds; + + Ssi = Eval1ovFNoise(Vds, model, here, + data->freq, ckt->CKTtemp); + T10 = model->BSIM4v6oxideTrapDensityA + * CONSTboltz * ckt->CKTtemp; + T11 = pParam->BSIM4v6weff * here->BSIM4v6nf * pParam->BSIM4v6leff + * pow(data->freq, model->BSIM4v6ef) * 1.0e10 + * here->BSIM4v6nstar * here->BSIM4v6nstar; + Swi = T10 / T11 * here->BSIM4v6cd + * here->BSIM4v6cd; + T1 = Swi + Ssi; + if (T1 > 0.0) + noizDens[BSIM4v6FLNOIZ] *= m * (Ssi * Swi) / T1; + else + noizDens[BSIM4v6FLNOIZ] *= 0.0; + break; + } + + lnNdens[BSIM4v6FLNOIZ] = + log(MAX(noizDens[BSIM4v6FLNOIZ], N_MINLOG)); + + + if(here->BSIM4v6mode >= 0) { /* bugfix */ + NevalSrc(&noizDens[BSIM4v6IGSNOIZ], + &lnNdens[BSIM4v6IGSNOIZ], ckt, SHOTNOISE, + here->BSIM4v6gNodePrime, here->BSIM4v6sNodePrime, + m * (here->BSIM4v6Igs + here->BSIM4v6Igcs)); + NevalSrc(&noizDens[BSIM4v6IGDNOIZ], + &lnNdens[BSIM4v6IGDNOIZ], ckt, SHOTNOISE, + here->BSIM4v6gNodePrime, here->BSIM4v6dNodePrime, + m * (here->BSIM4v6Igd + here->BSIM4v6Igcd)); + } else { + NevalSrc(&noizDens[BSIM4v6IGSNOIZ], + &lnNdens[BSIM4v6IGSNOIZ], ckt, SHOTNOISE, + here->BSIM4v6gNodePrime, here->BSIM4v6sNodePrime, + m * (here->BSIM4v6Igs + here->BSIM4v6Igcd)); + NevalSrc(&noizDens[BSIM4v6IGDNOIZ], + &lnNdens[BSIM4v6IGDNOIZ], ckt, SHOTNOISE, + here->BSIM4v6gNodePrime, here->BSIM4v6dNodePrime, + m * (here->BSIM4v6Igd + here->BSIM4v6Igcs)); + } + NevalSrc(&noizDens[BSIM4v6IGBNOIZ], + &lnNdens[BSIM4v6IGBNOIZ], ckt, SHOTNOISE, + here->BSIM4v6gNodePrime, here->BSIM4v6bNodePrime, + m * here->BSIM4v6Igb); + + + noizDens[BSIM4v6TOTNOIZ] = noizDens[BSIM4v6RDNOIZ] + + noizDens[BSIM4v6RSNOIZ] + noizDens[BSIM4v6RGNOIZ] + + noizDens[BSIM4v6RBPSNOIZ] + noizDens[BSIM4v6RBPDNOIZ] + + noizDens[BSIM4v6RBPBNOIZ] + + noizDens[BSIM4v6RBSBNOIZ] + noizDens[BSIM4v6RBDBNOIZ] + + noizDens[BSIM4v6IDNOIZ] + noizDens[BSIM4v6FLNOIZ] + + noizDens[BSIM4v6IGSNOIZ] + noizDens[BSIM4v6IGDNOIZ] + + noizDens[BSIM4v6IGBNOIZ]; + lnNdens[BSIM4v6TOTNOIZ] = + log(MAX(noizDens[BSIM4v6TOTNOIZ], N_MINLOG)); + + *OnDens += noizDens[BSIM4v6TOTNOIZ]; + + if (data->delFreq == 0.0) + { /* if we haven't done any previous + integration, we need to initialize our + "history" variables. + */ + + for (i = 0; i < BSIM4v6NSRCS; i++) + { here->BSIM4v6nVar[LNLSTDENS][i] = + lnNdens[i]; + } + + /* clear out our integration variables + if it's the first pass + */ + if (data->freq == + ((NOISEAN*) ckt->CKTcurJob)->NstartFreq) + { for (i = 0; i < BSIM4v6NSRCS; i++) + { here->BSIM4v6nVar[OUTNOIZ][i] = 0.0; + here->BSIM4v6nVar[INNOIZ][i] = 0.0; + } + } + } + else + { /* data->delFreq != 0.0, + we have to integrate. + */ + for (i = 0; i < BSIM4v6NSRCS; i++) + { if (i != BSIM4v6TOTNOIZ) + { tempOnoise = Nintegrate(noizDens[i], + lnNdens[i], + here->BSIM4v6nVar[LNLSTDENS][i], + data); + tempInoise = Nintegrate(noizDens[i] + * data->GainSqInv, lnNdens[i] + + data->lnGainInv, + here->BSIM4v6nVar[LNLSTDENS][i] + + data->lnGainInv, data); + here->BSIM4v6nVar[LNLSTDENS][i] = + lnNdens[i]; + data->outNoiz += tempOnoise; + data->inNoise += tempInoise; + if (((NOISEAN*) + ckt->CKTcurJob)->NStpsSm != 0) + { here->BSIM4v6nVar[OUTNOIZ][i] + += tempOnoise; + here->BSIM4v6nVar[OUTNOIZ][BSIM4v6TOTNOIZ] + += tempOnoise; + here->BSIM4v6nVar[INNOIZ][i] + += tempInoise; + here->BSIM4v6nVar[INNOIZ][BSIM4v6TOTNOIZ] + += tempInoise; + } + } + } + } + if (data->prtSummary) + { for (i = 0; i < BSIM4v6NSRCS; i++) + { /* print a summary report */ + data->outpVector[data->outNumber++] + = noizDens[i]; + } + } + break; + case INT_NOIZ: + /* already calculated, just output */ + if (((NOISEAN*)ckt->CKTcurJob)->NStpsSm != 0) + { for (i = 0; i < BSIM4v6NSRCS; i++) + { data->outpVector[data->outNumber++] + = here->BSIM4v6nVar[OUTNOIZ][i]; + data->outpVector[data->outNumber++] + = here->BSIM4v6nVar[INNOIZ][i]; + } + } + break; + } + break; + case N_CLOSE: + /* do nothing, the main calling routine will close */ + return (OK); + break; /* the plots */ + } /* switch (operation) */ + } /* for here */ + } /* for model */ + + return(OK); +} diff --git a/src/spicelib/devices/bsim4v6/b4v6par.c b/src/spicelib/devices/bsim4v6/b4v6par.c new file mode 100644 index 000000000..d23fcdc6a --- /dev/null +++ b/src/spicelib/devices/bsim4v6/b4v6par.c @@ -0,0 +1,204 @@ +/**** BSIM4.6.2 Released by Wenwei Yang 07/31/2008 ****/ + +/********** + * Copyright 2006 Regents of the University of California. All rights reserved. + * File: b4par.c of BSIM4.6.2. + * Author: 2000 Weidong Liu + * Authors: 2001- Xuemei Xi, Mohan Dunga, Ali Niknejad, Chenming Hu. + * Authors: 2006- Mohan Dunga, Ali Niknejad, Chenming Hu + * Authors: 2007- Mohan Dunga, Wenwei Yang, 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" +#include "bsim4v6def.h" +#include "sperror.h" +#include "suffix.h" +#include "fteext.h" + +int +BSIM4v6param( +int param, +IFvalue *value, +GENinstance *inst, +IFvalue *select) +{ + double scale; + + BSIM4v6instance *here = (BSIM4v6instance*)inst; + + NG_IGNORE(select); + + if (!cp_getvar("scale", CP_REAL, &scale)) + scale = 1; + + switch(param) + { case BSIM4v6_W: + here->BSIM4v6w = value->rValue*scale; + here->BSIM4v6wGiven = TRUE; + break; + case BSIM4v6_L: + here->BSIM4v6l = value->rValue*scale; + here->BSIM4v6lGiven = TRUE; + break; + case BSIM4v6_M: + here->BSIM4v6m = value->rValue; + here->BSIM4v6mGiven = TRUE; + break; + case BSIM4v6_NF: + here->BSIM4v6nf = value->rValue; + here->BSIM4v6nfGiven = TRUE; + break; + case BSIM4v6_MIN: + here->BSIM4v6min = value->iValue; + here->BSIM4v6minGiven = TRUE; + break; + case BSIM4v6_AS: + here->BSIM4v6sourceArea = value->rValue*scale*scale; + here->BSIM4v6sourceAreaGiven = TRUE; + break; + case BSIM4v6_AD: + here->BSIM4v6drainArea = value->rValue*scale*scale; + here->BSIM4v6drainAreaGiven = TRUE; + break; + case BSIM4v6_PS: + here->BSIM4v6sourcePerimeter = value->rValue*scale; + here->BSIM4v6sourcePerimeterGiven = TRUE; + break; + case BSIM4v6_PD: + here->BSIM4v6drainPerimeter = value->rValue*scale; + here->BSIM4v6drainPerimeterGiven = TRUE; + break; + case BSIM4v6_NRS: + here->BSIM4v6sourceSquares = value->rValue; + here->BSIM4v6sourceSquaresGiven = TRUE; + break; + case BSIM4v6_NRD: + here->BSIM4v6drainSquares = value->rValue; + here->BSIM4v6drainSquaresGiven = TRUE; + break; + case BSIM4v6_OFF: + here->BSIM4v6off = value->iValue; + break; + case BSIM4v6_SA: + here->BSIM4v6sa = value->rValue; + here->BSIM4v6saGiven = TRUE; + break; + case BSIM4v6_SB: + here->BSIM4v6sb = value->rValue; + here->BSIM4v6sbGiven = TRUE; + break; + case BSIM4v6_SD: + here->BSIM4v6sd = value->rValue; + here->BSIM4v6sdGiven = TRUE; + break; + case BSIM4v6_SCA: + here->BSIM4v6sca = value->rValue; + here->BSIM4v6scaGiven = TRUE; + break; + case BSIM4v6_SCB: + here->BSIM4v6scb = value->rValue; + here->BSIM4v6scbGiven = TRUE; + break; + case BSIM4v6_SCC: + here->BSIM4v6scc = value->rValue; + here->BSIM4v6sccGiven = TRUE; + break; + case BSIM4v6_SC: + here->BSIM4v6sc = value->rValue; + here->BSIM4v6scGiven = TRUE; + break; + case BSIM4v6_RBSB: + here->BSIM4v6rbsb = value->rValue; + here->BSIM4v6rbsbGiven = TRUE; + break; + case BSIM4v6_RBDB: + here->BSIM4v6rbdb = value->rValue; + here->BSIM4v6rbdbGiven = TRUE; + break; + case BSIM4v6_RBPB: + here->BSIM4v6rbpb = value->rValue; + here->BSIM4v6rbpbGiven = TRUE; + break; + case BSIM4v6_RBPS: + here->BSIM4v6rbps = value->rValue; + here->BSIM4v6rbpsGiven = TRUE; + break; + case BSIM4v6_RBPD: + here->BSIM4v6rbpd = value->rValue; + here->BSIM4v6rbpdGiven = TRUE; + break; + case BSIM4v6_DELVTO: + here->BSIM4v6delvto = value->rValue; + here->BSIM4v6delvtoGiven = TRUE; + break; + case BSIM4v6_XGW: + here->BSIM4v6xgw = value->rValue; + here->BSIM4v6xgwGiven = TRUE; + break; + case BSIM4v6_NGCON: + here->BSIM4v6ngcon = value->rValue; + here->BSIM4v6ngconGiven = TRUE; + break; + case BSIM4v6_TRNQSMOD: + here->BSIM4v6trnqsMod = value->iValue; + here->BSIM4v6trnqsModGiven = TRUE; + break; + case BSIM4v6_ACNQSMOD: + here->BSIM4v6acnqsMod = value->iValue; + here->BSIM4v6acnqsModGiven = TRUE; + break; + case BSIM4v6_RBODYMOD: + here->BSIM4v6rbodyMod = value->iValue; + here->BSIM4v6rbodyModGiven = TRUE; + break; + case BSIM4v6_RGATEMOD: + here->BSIM4v6rgateMod = value->iValue; + here->BSIM4v6rgateModGiven = TRUE; + break; + case BSIM4v6_GEOMOD: + here->BSIM4v6geoMod = value->iValue; + here->BSIM4v6geoModGiven = TRUE; + break; + case BSIM4v6_RGEOMOD: + here->BSIM4v6rgeoMod = value->iValue; + here->BSIM4v6rgeoModGiven = TRUE; + break; + case BSIM4v6_IC_VDS: + here->BSIM4v6icVDS = value->rValue; + here->BSIM4v6icVDSGiven = TRUE; + break; + case BSIM4v6_IC_VGS: + here->BSIM4v6icVGS = value->rValue; + here->BSIM4v6icVGSGiven = TRUE; + break; + case BSIM4v6_IC_VBS: + here->BSIM4v6icVBS = value->rValue; + here->BSIM4v6icVBSGiven = TRUE; + break; + case BSIM4v6_IC: + switch(value->v.numValue) + { case 3: + here->BSIM4v6icVBS = *(value->v.vec.rVec+2); + here->BSIM4v6icVBSGiven = TRUE; + case 2: + here->BSIM4v6icVGS = *(value->v.vec.rVec+1); + here->BSIM4v6icVGSGiven = TRUE; + case 1: + here->BSIM4v6icVDS = *(value->v.vec.rVec); + here->BSIM4v6icVDSGiven = TRUE; + break; + default: + return(E_BADPARM); + } + break; + default: + return(E_BADPARM); + } + return(OK); +} diff --git a/src/spicelib/devices/bsim4v6/b4v6pzld.c b/src/spicelib/devices/bsim4v6/b4v6pzld.c new file mode 100644 index 000000000..f29f81868 --- /dev/null +++ b/src/spicelib/devices/bsim4v6/b4v6pzld.c @@ -0,0 +1,759 @@ +/**** BSIM4.6.2 Released by Wenwei Yang 07/31/2008 ****/ + +/********** + * Copyright 2006 Regents of the University of California. All rights reserved. + * File: b4pzld.c of BSIM4.6.2. + * Author: 2000 Weidong Liu + * Authors: 2001- Xuemei Xi, Mohan Dunga, Ali Niknejad, Chenming Hu. + * Authors: 2006- Mohan Dunga, Ali Niknejad, Chenming Hu + * Authors: 2007- Mohan Dunga, Wenwei Yang, Ali Niknejad, Chenming Hu + * Project Director: Prof. Chenming Hu. + * Modified by Xuemei Xi, 10/05/2001. + **********/ + +#include "ngspice.h" +#include "cktdefs.h" +#include "complex.h" +#include "sperror.h" +#include "bsim4v6def.h" +#include "suffix.h" + +int +BSIM4v6pzLoad( +GENmodel *inModel, +CKTcircuit *ckt, +SPcomplex *s) +{ +BSIM4v6model *model = (BSIM4v6model*)inModel; +BSIM4v6instance *here; + +double gjbd, gjbs, geltd, gcrg, gcrgg, gcrgd, gcrgs, gcrgb; +double xcggb, xcgdb, xcgsb, xcgbb, xcbgb, xcbdb, xcbsb, xcbbb; +double xcdgb, xcddb, xcdsb, xcdbb, xcsgb, xcsdb, xcssb, xcsbb; +double gds, capbd, capbs, FwdSum, RevSum, Gm, Gmbs; +double gstot, gstotd, gstotg, gstots, gstotb, gspr; +double gdtot, gdtotd, gdtotg, gdtots, gdtotb, gdpr; +double gIstotg, gIstotd, gIstots, gIstotb; +double gIdtotg, gIdtotd, gIdtots, gIdtotb; +double gIbtotg, gIbtotd, gIbtots, gIbtotb; +double gIgtotg, gIgtotd, gIgtots, gIgtotb; +double cgso, cgdo, cgbo; +double xcdbdb=0.0, xcsbsb=0.0, xcgmgmb=0.0, xcgmdb=0.0, xcgmsb=0.0, xcdgmb=0.0, xcsgmb=0.0; +double xcgmbb=0.0, xcbgmb=0.0; +double dxpart, sxpart, xgtg, xgtd, xgts, xgtb, xcqgb=0.0, xcqdb=0.0, xcqsb=0.0, xcqbb=0.0; +double gbspsp, gbbdp, gbbsp, gbspg, gbspb; +double gbspdp, gbdpdp, gbdpg, gbdpb, gbdpsp; +double ddxpart_dVd, ddxpart_dVg, ddxpart_dVb, ddxpart_dVs; +double dsxpart_dVd, dsxpart_dVg, dsxpart_dVb, dsxpart_dVs; +double T0=0.0, T1, CoxWL, qcheq, Cdg, Cdd, Cds, Csg, Csd, Css; +double ScalingFactor = 1.0e-9; +struct bsim4v6SizeDependParam *pParam; +double ggidld, ggidlg, ggidlb, ggislg, ggislb, ggisls; + +double m; + + for (; model != NULL; model = model->BSIM4v6nextModel) + { for (here = model->BSIM4v6instances; here!= NULL; + here = here->BSIM4v6nextInstance) + { if (here->BSIM4v6owner != ARCHme) continue; + pParam = here->pParam; + capbd = here->BSIM4v6capbd; + capbs = here->BSIM4v6capbs; + cgso = here->BSIM4v6cgso; + cgdo = here->BSIM4v6cgdo; + cgbo = pParam->BSIM4v6cgbo; + + if (here->BSIM4v6mode >= 0) + { Gm = here->BSIM4v6gm; + Gmbs = here->BSIM4v6gmbs; + FwdSum = Gm + Gmbs; + RevSum = 0.0; + + gbbdp = -(here->BSIM4v6gbds); + gbbsp = here->BSIM4v6gbds + here->BSIM4v6gbgs + here->BSIM4v6gbbs; + gbdpg = here->BSIM4v6gbgs; + gbdpdp = here->BSIM4v6gbds; + gbdpb = here->BSIM4v6gbbs; + gbdpsp = -(gbdpg + gbdpdp + gbdpb); + + gbspdp = 0.0; + gbspg = 0.0; + gbspb = 0.0; + gbspsp = 0.0; + + if (model->BSIM4v6igcMod) + { gIstotg = here->BSIM4v6gIgsg + here->BSIM4v6gIgcsg; + gIstotd = here->BSIM4v6gIgcsd; + gIstots = here->BSIM4v6gIgss + here->BSIM4v6gIgcss; + gIstotb = here->BSIM4v6gIgcsb; + + gIdtotg = here->BSIM4v6gIgdg + here->BSIM4v6gIgcdg; + gIdtotd = here->BSIM4v6gIgdd + here->BSIM4v6gIgcdd; + gIdtots = here->BSIM4v6gIgcds; + gIdtotb = here->BSIM4v6gIgcdb; + } + else + { gIstotg = gIstotd = gIstots = gIstotb = 0.0; + gIdtotg = gIdtotd = gIdtots = gIdtotb = 0.0; + } + + if (model->BSIM4v6igbMod) + { gIbtotg = here->BSIM4v6gIgbg; + gIbtotd = here->BSIM4v6gIgbd; + gIbtots = here->BSIM4v6gIgbs; + gIbtotb = here->BSIM4v6gIgbb; + } + else + gIbtotg = gIbtotd = gIbtots = gIbtotb = 0.0; + + if ((model->BSIM4v6igcMod != 0) || (model->BSIM4v6igbMod != 0)) + { gIgtotg = gIstotg + gIdtotg + gIbtotg; + gIgtotd = gIstotd + gIdtotd + gIbtotd ; + gIgtots = gIstots + gIdtots + gIbtots; + gIgtotb = gIstotb + gIdtotb + gIbtotb; + } + else + gIgtotg = gIgtotd = gIgtots = gIgtotb = 0.0; + + if (here->BSIM4v6rgateMod == 2) + T0 = *(ckt->CKTstates[0] + here->BSIM4v6vges) + - *(ckt->CKTstates[0] + here->BSIM4v6vgs); + else if (here->BSIM4v6rgateMod == 3) + T0 = *(ckt->CKTstates[0] + here->BSIM4v6vgms) + - *(ckt->CKTstates[0] + here->BSIM4v6vgs); + if (here->BSIM4v6rgateMod > 1) + { gcrgd = here->BSIM4v6gcrgd * T0; + gcrgg = here->BSIM4v6gcrgg * T0; + gcrgs = here->BSIM4v6gcrgs * T0; + gcrgb = here->BSIM4v6gcrgb * T0; + gcrgg -= here->BSIM4v6gcrg; + gcrg = here->BSIM4v6gcrg; + } + else + gcrg = gcrgd = gcrgg = gcrgs = gcrgb = 0.0; + + if (here->BSIM4v6acnqsMod == 0) + { if (here->BSIM4v6rgateMod == 3) + { xcgmgmb = cgdo + cgso + pParam->BSIM4v6cgbo; + xcgmdb = -cgdo; + xcgmsb = -cgso; + xcgmbb = -pParam->BSIM4v6cgbo; + + xcdgmb = xcgmdb; + xcsgmb = xcgmsb; + xcbgmb = xcgmbb; + + xcggb = here->BSIM4v6cggb; + xcgdb = here->BSIM4v6cgdb; + xcgsb = here->BSIM4v6cgsb; + xcgbb = -(xcggb + xcgdb + xcgsb); + + xcdgb = here->BSIM4v6cdgb; + xcsgb = -(here->BSIM4v6cggb + here->BSIM4v6cbgb + + here->BSIM4v6cdgb); + xcbgb = here->BSIM4v6cbgb; + } + else + { xcggb = here->BSIM4v6cggb + cgdo + cgso + + pParam->BSIM4v6cgbo; + xcgdb = here->BSIM4v6cgdb - cgdo; + xcgsb = here->BSIM4v6cgsb - cgso; + xcgbb = -(xcggb + xcgdb + xcgsb); + + xcdgb = here->BSIM4v6cdgb - cgdo; + xcsgb = -(here->BSIM4v6cggb + here->BSIM4v6cbgb + + here->BSIM4v6cdgb + cgso); + xcbgb = here->BSIM4v6cbgb - pParam->BSIM4v6cgbo; + + xcdgmb = xcsgmb = xcbgmb = 0.0; + } + xcddb = here->BSIM4v6cddb + here->BSIM4v6capbd + cgdo; + xcdsb = here->BSIM4v6cdsb; + + xcsdb = -(here->BSIM4v6cgdb + here->BSIM4v6cbdb + + here->BSIM4v6cddb); + xcssb = here->BSIM4v6capbs + cgso - (here->BSIM4v6cgsb + + here->BSIM4v6cbsb + here->BSIM4v6cdsb); + + if (!here->BSIM4v6rbodyMod) + { xcdbb = -(xcdgb + xcddb + xcdsb + xcdgmb); + xcsbb = -(xcsgb + xcsdb + xcssb + xcsgmb); + xcbdb = here->BSIM4v6cbdb - here->BSIM4v6capbd; + xcbsb = here->BSIM4v6cbsb - here->BSIM4v6capbs; + xcdbdb = 0.0; + } + else + { xcdbb = -(here->BSIM4v6cddb + here->BSIM4v6cdgb + + here->BSIM4v6cdsb); + xcsbb = -(xcsgb + xcsdb + xcssb + xcsgmb) + + here->BSIM4v6capbs; + xcbdb = here->BSIM4v6cbdb; + xcbsb = here->BSIM4v6cbsb; + + xcdbdb = -here->BSIM4v6capbd; + xcsbsb = -here->BSIM4v6capbs; + } + xcbbb = -(xcbdb + xcbgb + xcbsb + xcbgmb); + + xgtg = xgtd = xgts = xgtb = 0.0; + sxpart = 0.6; + dxpart = 0.4; + ddxpart_dVd = ddxpart_dVg = ddxpart_dVb + = ddxpart_dVs = 0.0; + dsxpart_dVd = dsxpart_dVg = dsxpart_dVb + = dsxpart_dVs = 0.0; + } + else + { xcggb = xcgdb = xcgsb = xcgbb = 0.0; + xcbgb = xcbdb = xcbsb = xcbbb = 0.0; + xcdgb = xcddb = xcdsb = xcdbb = 0.0; + xcsgb = xcsdb = xcssb = xcsbb = 0.0; + + xgtg = here->BSIM4v6gtg; + xgtd = here->BSIM4v6gtd; + xgts = here->BSIM4v6gts; + xgtb = here->BSIM4v6gtb; + + xcqgb = here->BSIM4v6cqgb; + xcqdb = here->BSIM4v6cqdb; + xcqsb = here->BSIM4v6cqsb; + xcqbb = here->BSIM4v6cqbb; + + CoxWL = model->BSIM4v6coxe * here->pParam->BSIM4v6weffCV + * here->BSIM4v6nf * here->pParam->BSIM4v6leffCV; + qcheq = -(here->BSIM4v6qgate + here->BSIM4v6qbulk); + if (fabs(qcheq) <= 1.0e-5 * CoxWL) + { if (model->BSIM4v6xpart < 0.5) + { dxpart = 0.4; + } + else if (model->BSIM4v6xpart > 0.5) + { dxpart = 0.0; + } + else + { dxpart = 0.5; + } + ddxpart_dVd = ddxpart_dVg = ddxpart_dVb + = ddxpart_dVs = 0.0; + } + else + { dxpart = here->BSIM4v6qdrn / qcheq; + Cdd = here->BSIM4v6cddb; + Csd = -(here->BSIM4v6cgdb + here->BSIM4v6cddb + + here->BSIM4v6cbdb); + ddxpart_dVd = (Cdd - dxpart * (Cdd + Csd)) / qcheq; + Cdg = here->BSIM4v6cdgb; + Csg = -(here->BSIM4v6cggb + here->BSIM4v6cdgb + + here->BSIM4v6cbgb); + ddxpart_dVg = (Cdg - dxpart * (Cdg + Csg)) / qcheq; + + Cds = here->BSIM4v6cdsb; + Css = -(here->BSIM4v6cgsb + here->BSIM4v6cdsb + + here->BSIM4v6cbsb); + ddxpart_dVs = (Cds - dxpart * (Cds + Css)) / qcheq; + + ddxpart_dVb = -(ddxpart_dVd + ddxpart_dVg + + ddxpart_dVs); + } + sxpart = 1.0 - dxpart; + dsxpart_dVd = -ddxpart_dVd; + dsxpart_dVg = -ddxpart_dVg; + dsxpart_dVs = -ddxpart_dVs; + dsxpart_dVb = -(dsxpart_dVd + dsxpart_dVg + dsxpart_dVs); + } + } + else + { Gm = -here->BSIM4v6gm; + Gmbs = -here->BSIM4v6gmbs; + FwdSum = 0.0; + RevSum = -(Gm + Gmbs); + + gbbsp = -(here->BSIM4v6gbds); + gbbdp = here->BSIM4v6gbds + here->BSIM4v6gbgs + here->BSIM4v6gbbs; + + gbdpg = 0.0; + gbdpsp = 0.0; + gbdpb = 0.0; + gbdpdp = 0.0; + + gbspg = here->BSIM4v6gbgs; + gbspsp = here->BSIM4v6gbds; + gbspb = here->BSIM4v6gbbs; + gbspdp = -(gbspg + gbspsp + gbspb); + + if (model->BSIM4v6igcMod) + { gIstotg = here->BSIM4v6gIgsg + here->BSIM4v6gIgcdg; + gIstotd = here->BSIM4v6gIgcds; + gIstots = here->BSIM4v6gIgss + here->BSIM4v6gIgcdd; + gIstotb = here->BSIM4v6gIgcdb; + + gIdtotg = here->BSIM4v6gIgdg + here->BSIM4v6gIgcsg; + gIdtotd = here->BSIM4v6gIgdd + here->BSIM4v6gIgcss; + gIdtots = here->BSIM4v6gIgcsd; + gIdtotb = here->BSIM4v6gIgcsb; + } + else + { gIstotg = gIstotd = gIstots = gIstotb = 0.0; + gIdtotg = gIdtotd = gIdtots = gIdtotb = 0.0; + } + + if (model->BSIM4v6igbMod) + { gIbtotg = here->BSIM4v6gIgbg; + gIbtotd = here->BSIM4v6gIgbs; + gIbtots = here->BSIM4v6gIgbd; + gIbtotb = here->BSIM4v6gIgbb; + } + else + gIbtotg = gIbtotd = gIbtots = gIbtotb = 0.0; + + if ((model->BSIM4v6igcMod != 0) || (model->BSIM4v6igbMod != 0)) + { gIgtotg = gIstotg + gIdtotg + gIbtotg; + gIgtotd = gIstotd + gIdtotd + gIbtotd ; + gIgtots = gIstots + gIdtots + gIbtots; + gIgtotb = gIstotb + gIdtotb + gIbtotb; + } + else + gIgtotg = gIgtotd = gIgtots = gIgtotb = 0.0; + + if (here->BSIM4v6rgateMod == 2) + T0 = *(ckt->CKTstates[0] + here->BSIM4v6vges) + - *(ckt->CKTstates[0] + here->BSIM4v6vgs); + else if (here->BSIM4v6rgateMod == 3) + T0 = *(ckt->CKTstates[0] + here->BSIM4v6vgms) + - *(ckt->CKTstates[0] + here->BSIM4v6vgs); + if (here->BSIM4v6rgateMod > 1) + { gcrgd = here->BSIM4v6gcrgs * T0; + gcrgg = here->BSIM4v6gcrgg * T0; + gcrgs = here->BSIM4v6gcrgd * T0; + gcrgb = here->BSIM4v6gcrgb * T0; + gcrgg -= here->BSIM4v6gcrg; + gcrg = here->BSIM4v6gcrg; + } + else + gcrg = gcrgd = gcrgg = gcrgs = gcrgb = 0.0; + + if (here->BSIM4v6acnqsMod == 0) + { if (here->BSIM4v6rgateMod == 3) + { xcgmgmb = cgdo + cgso + pParam->BSIM4v6cgbo; + xcgmdb = -cgdo; + xcgmsb = -cgso; + xcgmbb = -pParam->BSIM4v6cgbo; + + xcdgmb = xcgmdb; + xcsgmb = xcgmsb; + xcbgmb = xcgmbb; + + xcggb = here->BSIM4v6cggb; + xcgdb = here->BSIM4v6cgsb; + xcgsb = here->BSIM4v6cgdb; + xcgbb = -(xcggb + xcgdb + xcgsb); + + xcdgb = -(here->BSIM4v6cggb + here->BSIM4v6cbgb + + here->BSIM4v6cdgb); + xcsgb = here->BSIM4v6cdgb; + xcbgb = here->BSIM4v6cbgb; + } + else + { xcggb = here->BSIM4v6cggb + cgdo + cgso + + pParam->BSIM4v6cgbo; + xcgdb = here->BSIM4v6cgsb - cgdo; + xcgsb = here->BSIM4v6cgdb - cgso; + xcgbb = -(xcggb + xcgdb + xcgsb); + + xcdgb = -(here->BSIM4v6cggb + here->BSIM4v6cbgb + + here->BSIM4v6cdgb + cgdo); + xcsgb = here->BSIM4v6cdgb - cgso; + xcbgb = here->BSIM4v6cbgb - pParam->BSIM4v6cgbo; + + xcdgmb = xcsgmb = xcbgmb = 0.0; + } + xcddb = here->BSIM4v6capbd + cgdo - (here->BSIM4v6cgsb + + here->BSIM4v6cbsb + here->BSIM4v6cdsb); + xcdsb = -(here->BSIM4v6cgdb + here->BSIM4v6cbdb + + here->BSIM4v6cddb); + + xcsdb = here->BSIM4v6cdsb; + xcssb = here->BSIM4v6cddb + here->BSIM4v6capbs + cgso; + + if (!here->BSIM4v6rbodyMod) + { xcdbb = -(xcdgb + xcddb + xcdsb + xcdgmb); + xcsbb = -(xcsgb + xcsdb + xcssb + xcsgmb); + xcbdb = here->BSIM4v6cbsb - here->BSIM4v6capbd; + xcbsb = here->BSIM4v6cbdb - here->BSIM4v6capbs; + xcdbdb = 0.0; + } + else + { xcdbb = -(xcdgb + xcddb + xcdsb + xcdgmb) + + here->BSIM4v6capbd; + xcsbb = -(here->BSIM4v6cddb + here->BSIM4v6cdgb + + here->BSIM4v6cdsb); + xcbdb = here->BSIM4v6cbsb; + xcbsb = here->BSIM4v6cbdb; + xcdbdb = -here->BSIM4v6capbd; + xcsbsb = -here->BSIM4v6capbs; + } + xcbbb = -(xcbgb + xcbdb + xcbsb + xcbgmb); + + xgtg = xgtd = xgts = xgtb = 0.0; + sxpart = 0.4; + dxpart = 0.6; + ddxpart_dVd = ddxpart_dVg = ddxpart_dVb + = ddxpart_dVs = 0.0; + dsxpart_dVd = dsxpart_dVg = dsxpart_dVb + = dsxpart_dVs = 0.0; + } + else + { xcggb = xcgdb = xcgsb = xcgbb = 0.0; + xcbgb = xcbdb = xcbsb = xcbbb = 0.0; + xcdgb = xcddb = xcdsb = xcdbb = 0.0; + xcsgb = xcsdb = xcssb = xcsbb = 0.0; + + xgtg = here->BSIM4v6gtg; + xgtd = here->BSIM4v6gts; + xgts = here->BSIM4v6gtd; + xgtb = here->BSIM4v6gtb; + + xcqgb = here->BSIM4v6cqgb; + xcqdb = here->BSIM4v6cqsb; + xcqsb = here->BSIM4v6cqdb; + xcqbb = here->BSIM4v6cqbb; + + CoxWL = model->BSIM4v6coxe * here->pParam->BSIM4v6weffCV + * here->BSIM4v6nf * here->pParam->BSIM4v6leffCV; + qcheq = -(here->BSIM4v6qgate + here->BSIM4v6qbulk); + if (fabs(qcheq) <= 1.0e-5 * CoxWL) + { if (model->BSIM4v6xpart < 0.5) + { sxpart = 0.4; + } + else if (model->BSIM4v6xpart > 0.5) + { sxpart = 0.0; + } + else + { sxpart = 0.5; + } + dsxpart_dVd = dsxpart_dVg = dsxpart_dVb + = dsxpart_dVs = 0.0; + } + else + { sxpart = here->BSIM4v6qdrn / qcheq; + Css = here->BSIM4v6cddb; + Cds = -(here->BSIM4v6cgdb + here->BSIM4v6cddb + + here->BSIM4v6cbdb); + dsxpart_dVs = (Css - sxpart * (Css + Cds)) / qcheq; + Csg = here->BSIM4v6cdgb; + Cdg = -(here->BSIM4v6cggb + here->BSIM4v6cdgb + + here->BSIM4v6cbgb); + dsxpart_dVg = (Csg - sxpart * (Csg + Cdg)) / qcheq; + + Csd = here->BSIM4v6cdsb; + Cdd = -(here->BSIM4v6cgsb + here->BSIM4v6cdsb + + here->BSIM4v6cbsb); + dsxpart_dVd = (Csd - sxpart * (Csd + Cdd)) / qcheq; + + dsxpart_dVb = -(dsxpart_dVd + dsxpart_dVg + + dsxpart_dVs); + } + dxpart = 1.0 - sxpart; + ddxpart_dVd = -dsxpart_dVd; + ddxpart_dVg = -dsxpart_dVg; + ddxpart_dVs = -dsxpart_dVs; + ddxpart_dVb = -(ddxpart_dVd + ddxpart_dVg + ddxpart_dVs); + } + } + + if (model->BSIM4v6rdsMod == 1) + { gstot = here->BSIM4v6gstot; + gstotd = here->BSIM4v6gstotd; + gstotg = here->BSIM4v6gstotg; + gstots = here->BSIM4v6gstots - gstot; + gstotb = here->BSIM4v6gstotb; + + gdtot = here->BSIM4v6gdtot; + gdtotd = here->BSIM4v6gdtotd - gdtot; + gdtotg = here->BSIM4v6gdtotg; + gdtots = here->BSIM4v6gdtots; + gdtotb = here->BSIM4v6gdtotb; + } + else + { gstot = gstotd = gstotg = gstots = gstotb = 0.0; + gdtot = gdtotd = gdtotg = gdtots = gdtotb = 0.0; + } + + + T1 = *(ckt->CKTstate0 + here->BSIM4v6qdef) * here->BSIM4v6gtau; + gds = here->BSIM4v6gds; + + /* + * Loading PZ matrix + */ + m = here->BSIM4v6m; + + if (!model->BSIM4v6rdsMod) + { gdpr = here->BSIM4v6drainConductance; + gspr = here->BSIM4v6sourceConductance; + } + else + gdpr = gspr = 0.0; + + if (!here->BSIM4v6rbodyMod) + { gjbd = here->BSIM4v6gbd; + gjbs = here->BSIM4v6gbs; + } + else + gjbd = gjbs = 0.0; + + geltd = here->BSIM4v6grgeltd; + + if (here->BSIM4v6rgateMod == 1) + { *(here->BSIM4v6GEgePtr) += m * geltd; + *(here->BSIM4v6GPgePtr) -= m * geltd; + *(here->BSIM4v6GEgpPtr) -= m * geltd; + + *(here->BSIM4v6GPgpPtr ) += m * xcggb * s->real; + *(here->BSIM4v6GPgpPtr +1) += m * xcggb * s->imag; + *(here->BSIM4v6GPgpPtr) += m * (geltd - xgtg + gIgtotg); + *(here->BSIM4v6GPdpPtr ) += m * xcgdb * s->real; + *(here->BSIM4v6GPdpPtr +1) += m * xcgdb * s->imag; + *(here->BSIM4v6GPdpPtr) -= m * (xgtd - gIgtotd); + *(here->BSIM4v6GPspPtr ) += m * xcgsb * s->real; + *(here->BSIM4v6GPspPtr +1) += m * xcgsb * s->imag; + *(here->BSIM4v6GPspPtr) -= m * (xgts - gIgtots); + *(here->BSIM4v6GPbpPtr ) += m * xcgbb * s->real; + *(here->BSIM4v6GPbpPtr +1) += m * xcgbb * s->imag; + *(here->BSIM4v6GPbpPtr) -= m * (xgtb - gIgtotb); + } + else if (here->BSIM4v6rgateMod == 2) + { *(here->BSIM4v6GEgePtr) += m * gcrg; + *(here->BSIM4v6GEgpPtr) += m * gcrgg; + *(here->BSIM4v6GEdpPtr) += m * gcrgd; + *(here->BSIM4v6GEspPtr) += m * gcrgs; + *(here->BSIM4v6GEbpPtr) += m * gcrgb; + + *(here->BSIM4v6GPgePtr) -= m * gcrg; + *(here->BSIM4v6GPgpPtr ) += m * xcggb * s->real; + *(here->BSIM4v6GPgpPtr +1) += m * xcggb * s->imag; + *(here->BSIM4v6GPgpPtr) -= m * (gcrgg + xgtg - gIgtotg); + *(here->BSIM4v6GPdpPtr ) += m * xcgdb * s->real; + *(here->BSIM4v6GPdpPtr +1) += m * xcgdb * s->imag; + *(here->BSIM4v6GPdpPtr) -= m * (gcrgd + xgtd - gIgtotd); + *(here->BSIM4v6GPspPtr ) += m * xcgsb * s->real; + *(here->BSIM4v6GPspPtr +1) += m * xcgsb * s->imag; + *(here->BSIM4v6GPspPtr) -= m * (gcrgs + xgts - gIgtots); + *(here->BSIM4v6GPbpPtr ) += m * xcgbb * s->real; + *(here->BSIM4v6GPbpPtr +1) += m * xcgbb * s->imag; + *(here->BSIM4v6GPbpPtr) -= m * (gcrgb + xgtb - gIgtotb); + } + else if (here->BSIM4v6rgateMod == 3) + { *(here->BSIM4v6GEgePtr) += m * geltd; + *(here->BSIM4v6GEgmPtr) -= m * geltd; + *(here->BSIM4v6GMgePtr) -= m * geltd; + *(here->BSIM4v6GMgmPtr) += m * (geltd + gcrg); + *(here->BSIM4v6GMgmPtr ) += m * xcgmgmb * s->real; + *(here->BSIM4v6GMgmPtr +1) += m * xcgmgmb * s->imag; + + *(here->BSIM4v6GMdpPtr) += m * gcrgd; + *(here->BSIM4v6GMdpPtr ) += m * xcgmdb * s->real; + *(here->BSIM4v6GMdpPtr +1) += m * xcgmdb * s->imag; + *(here->BSIM4v6GMgpPtr) += m * gcrgg; + *(here->BSIM4v6GMspPtr) += m * gcrgs; + *(here->BSIM4v6GMspPtr ) += m * xcgmsb * s->real; + *(here->BSIM4v6GMspPtr +1) += m * xcgmsb * s->imag; + *(here->BSIM4v6GMbpPtr) += m * gcrgb; + *(here->BSIM4v6GMbpPtr ) += m * xcgmbb * s->real; + *(here->BSIM4v6GMbpPtr +1) += m * xcgmbb * s->imag; + + *(here->BSIM4v6DPgmPtr ) += m * xcdgmb * s->real; + *(here->BSIM4v6DPgmPtr +1) += m * xcdgmb * s->imag; + *(here->BSIM4v6GPgmPtr) -= m * gcrg; + *(here->BSIM4v6SPgmPtr ) += m * xcsgmb * s->real; + *(here->BSIM4v6SPgmPtr +1) += m * xcsgmb * s->imag; + *(here->BSIM4v6BPgmPtr ) += m * xcbgmb * s->real; + *(here->BSIM4v6BPgmPtr +1) += m * xcbgmb * s->imag; + + *(here->BSIM4v6GPgpPtr) -= m * (gcrgg + xgtg - gIgtotg); + *(here->BSIM4v6GPgpPtr ) += m * xcggb * s->real; + *(here->BSIM4v6GPgpPtr +1) += m * xcggb * s->imag; + *(here->BSIM4v6GPdpPtr) -= m * (gcrgd + xgtd - gIgtotd); + *(here->BSIM4v6GPdpPtr ) += m * xcgdb * s->real; + *(here->BSIM4v6GPdpPtr +1) += m * xcgdb * s->imag; + *(here->BSIM4v6GPspPtr) -= m * (gcrgs + xgts - gIgtots); + *(here->BSIM4v6GPspPtr ) += m * xcgsb * s->real; + *(here->BSIM4v6GPspPtr +1) += m * xcgsb * s->imag; + *(here->BSIM4v6GPbpPtr) -= m * (gcrgb + xgtb - gIgtotb); + *(here->BSIM4v6GPbpPtr ) += m * xcgbb * s->real; + *(here->BSIM4v6GPbpPtr +1) += m * xcgbb * s->imag; + } + else + { *(here->BSIM4v6GPdpPtr ) += m * xcgdb * s->real; + *(here->BSIM4v6GPdpPtr +1) += m * xcgdb * s->imag; + *(here->BSIM4v6GPdpPtr) -= m * (xgtd - gIgtotd); + *(here->BSIM4v6GPgpPtr ) += m * xcggb * s->real; + *(here->BSIM4v6GPgpPtr +1) += m * xcggb * s->imag; + *(here->BSIM4v6GPgpPtr) -= m * (xgtg - gIgtotg); + *(here->BSIM4v6GPspPtr ) += m * xcgsb * s->real; + *(here->BSIM4v6GPspPtr +1) += m * xcgsb * s->imag; + *(here->BSIM4v6GPspPtr) -= m * (xgts - gIgtots); + *(here->BSIM4v6GPbpPtr ) += m * xcgbb * s->real; + *(here->BSIM4v6GPbpPtr +1) += m * xcgbb * s->imag; + *(here->BSIM4v6GPbpPtr) -= m * (xgtb - gIgtotb); + } + + if (model->BSIM4v6rdsMod) + { (*(here->BSIM4v6DgpPtr) += m * gdtotg); + (*(here->BSIM4v6DspPtr) += m * gdtots); + (*(here->BSIM4v6DbpPtr) += m * gdtotb); + (*(here->BSIM4v6SdpPtr) += m * gstotd); + (*(here->BSIM4v6SgpPtr) += m * gstotg); + (*(here->BSIM4v6SbpPtr) += m * gstotb); + } + + *(here->BSIM4v6DPdpPtr ) += m * xcddb * s->real; + *(here->BSIM4v6DPdpPtr +1) += m * xcddb * s->imag; + *(here->BSIM4v6DPdpPtr) += m * (gdpr + gds + here->BSIM4v6gbd + - gdtotd + RevSum + gbdpdp - gIdtotd + + dxpart * xgtd + T1 * ddxpart_dVd); + *(here->BSIM4v6DPdPtr) -= m * (gdpr + gdtot); + *(here->BSIM4v6DPgpPtr ) += m * xcdgb * s->real; + *(here->BSIM4v6DPgpPtr +1) += m * xcdgb * s->imag; + *(here->BSIM4v6DPgpPtr) += m * (Gm - gdtotg + gbdpg - gIdtotg + + T1 * ddxpart_dVg + dxpart * xgtg); + *(here->BSIM4v6DPspPtr ) += m * xcdsb * s->real; + *(here->BSIM4v6DPspPtr +1) += m * xcdsb * s->imag; + *(here->BSIM4v6DPspPtr) -= m * (gds + FwdSum + gdtots - gbdpsp + gIdtots + - T1 * ddxpart_dVs - dxpart * xgts); + *(here->BSIM4v6DPbpPtr ) += m * xcdbb * s->real; + *(here->BSIM4v6DPbpPtr +1) += m * xcdbb * s->imag; + *(here->BSIM4v6DPbpPtr) -= m * (gjbd + gdtotb - Gmbs - gbdpb + gIdtotb + - T1 * ddxpart_dVb - dxpart * xgtb); + + *(here->BSIM4v6DdpPtr) -= m * (gdpr - gdtotd); + *(here->BSIM4v6DdPtr) += m * (gdpr + gdtot); + + *(here->BSIM4v6SPdpPtr ) += m * xcsdb * s->real; + *(here->BSIM4v6SPdpPtr +1) += m * xcsdb * s->imag; + *(here->BSIM4v6SPdpPtr) -= m * (gds + gstotd + RevSum - gbspdp + gIstotd + - T1 * dsxpart_dVd - sxpart * xgtd); + *(here->BSIM4v6SPgpPtr ) += m * xcsgb * s->real; + *(here->BSIM4v6SPgpPtr +1) += m * xcsgb * s->imag; + *(here->BSIM4v6SPgpPtr) -= m * (Gm + gstotg - gbspg + gIstotg + - T1 * dsxpart_dVg - sxpart * xgtg); + *(here->BSIM4v6SPspPtr ) += m * xcssb * s->real; + *(here->BSIM4v6SPspPtr +1) += m * xcssb * s->imag; + *(here->BSIM4v6SPspPtr) += m * (gspr + gds + here->BSIM4v6gbs - gIstots + - gstots + FwdSum + gbspsp + + sxpart * xgts + T1 * dsxpart_dVs); + *(here->BSIM4v6SPsPtr) -= m * (gspr + gstot); + *(here->BSIM4v6SPbpPtr ) += m * xcsbb * s->real; + *(here->BSIM4v6SPbpPtr +1) += m * xcsbb * s->imag; + *(here->BSIM4v6SPbpPtr) -= m * (gjbs + gstotb + Gmbs - gbspb + gIstotb + - T1 * dsxpart_dVb - sxpart * xgtb); + + *(here->BSIM4v6SspPtr) -= m * (gspr - gstots); + *(here->BSIM4v6SsPtr) += m * (gspr + gstot); + + *(here->BSIM4v6BPdpPtr ) += m * xcbdb * s->real; + *(here->BSIM4v6BPdpPtr +1) += m * xcbdb * s->imag; + *(here->BSIM4v6BPdpPtr) -= m * (gjbd - gbbdp + gIbtotd); + *(here->BSIM4v6BPgpPtr ) += m * xcbgb * s->real; + *(here->BSIM4v6BPgpPtr +1) += m * xcbgb * s->imag; + *(here->BSIM4v6BPgpPtr) -= m * (here->BSIM4v6gbgs + gIbtotg); + *(here->BSIM4v6BPspPtr ) += m * xcbsb * s->real; + *(here->BSIM4v6BPspPtr +1) += m * xcbsb * s->imag; + *(here->BSIM4v6BPspPtr) -= m * (gjbs - gbbsp + gIbtots); + *(here->BSIM4v6BPbpPtr ) += m * xcbbb * s->real; + *(here->BSIM4v6BPbpPtr +1) += m * xcbbb * s->imag; + *(here->BSIM4v6BPbpPtr) += m * (gjbd + gjbs - here->BSIM4v6gbbs + - gIbtotb); + ggidld = here->BSIM4v6ggidld; + ggidlg = here->BSIM4v6ggidlg; + ggidlb = here->BSIM4v6ggidlb; + ggislg = here->BSIM4v6ggislg; + ggisls = here->BSIM4v6ggisls; + ggislb = here->BSIM4v6ggislb; + + /* stamp gidl */ + (*(here->BSIM4v6DPdpPtr) += m * ggidld); + (*(here->BSIM4v6DPgpPtr) += m * ggidlg); + (*(here->BSIM4v6DPspPtr) -= m * ((ggidlg + ggidld) + ggidlb)); + (*(here->BSIM4v6DPbpPtr) += m * ggidlb); + (*(here->BSIM4v6BPdpPtr) -= m * ggidld); + (*(here->BSIM4v6BPgpPtr) -= m * ggidlg); + (*(here->BSIM4v6BPspPtr) += m * ((ggidlg + ggidld) + ggidlb)); + (*(here->BSIM4v6BPbpPtr) -= m * ggidlb); + /* stamp gisl */ + (*(here->BSIM4v6SPdpPtr) -= m * ((ggisls + ggislg) + ggislb)); + (*(here->BSIM4v6SPgpPtr) += m * ggislg); + (*(here->BSIM4v6SPspPtr) += m * ggisls); + (*(here->BSIM4v6SPbpPtr) += m * ggislb); + (*(here->BSIM4v6BPdpPtr) += m * ((ggislg + ggisls) + ggislb)); + (*(here->BSIM4v6BPgpPtr) -= m * ggislg); + (*(here->BSIM4v6BPspPtr) -= m * ggisls); + (*(here->BSIM4v6BPbpPtr) -= m * ggislb); + + if (here->BSIM4v6rbodyMod) + { (*(here->BSIM4v6DPdbPtr ) += m * xcdbdb * s->real); + (*(here->BSIM4v6DPdbPtr +1) += m * xcdbdb * s->imag); + (*(here->BSIM4v6DPdbPtr) -= m * here->BSIM4v6gbd); + (*(here->BSIM4v6SPsbPtr ) += m * xcsbsb * s->real); + (*(here->BSIM4v6SPsbPtr +1) += m * xcsbsb * s->imag); + (*(here->BSIM4v6SPsbPtr) -= m * here->BSIM4v6gbs); + + (*(here->BSIM4v6DBdpPtr ) += m * xcdbdb * s->real); + (*(here->BSIM4v6DBdpPtr +1) += m * xcdbdb * s->imag); + (*(here->BSIM4v6DBdpPtr) -= m * here->BSIM4v6gbd); + (*(here->BSIM4v6DBdbPtr ) -= m * xcdbdb * s->real); + (*(here->BSIM4v6DBdbPtr +1) -= m * xcdbdb * s->imag); + (*(here->BSIM4v6DBdbPtr) += m * (here->BSIM4v6gbd + here->BSIM4v6grbpd + + here->BSIM4v6grbdb)); + (*(here->BSIM4v6DBbpPtr) -= m * here->BSIM4v6grbpd); + (*(here->BSIM4v6DBbPtr) -= m * here->BSIM4v6grbdb); + + (*(here->BSIM4v6BPdbPtr) -= m * here->BSIM4v6grbpd); + (*(here->BSIM4v6BPbPtr) -= m * here->BSIM4v6grbpb); + (*(here->BSIM4v6BPsbPtr) -= m * here->BSIM4v6grbps); + (*(here->BSIM4v6BPbpPtr) += m * (here->BSIM4v6grbpd + here->BSIM4v6grbps + + here->BSIM4v6grbpb)); + /* WDL: (-here->BSIM4v6gbbs) already added to BPbpPtr */ + + (*(here->BSIM4v6SBspPtr ) += m * xcsbsb * s->real); + (*(here->BSIM4v6SBspPtr +1) += m * xcsbsb * s->imag); + (*(here->BSIM4v6SBspPtr) -= m * here->BSIM4v6gbs); + (*(here->BSIM4v6SBbpPtr) -= m * here->BSIM4v6grbps); + (*(here->BSIM4v6SBbPtr) -= m * here->BSIM4v6grbsb); + (*(here->BSIM4v6SBsbPtr ) -= m * xcsbsb * s->real); + (*(here->BSIM4v6SBsbPtr +1) -= m * xcsbsb * s->imag); + (*(here->BSIM4v6SBsbPtr) += m * (here->BSIM4v6gbs + + here->BSIM4v6grbps + here->BSIM4v6grbsb)); + + (*(here->BSIM4v6BdbPtr) -= m * here->BSIM4v6grbdb); + (*(here->BSIM4v6BbpPtr) -= m * here->BSIM4v6grbpb); + (*(here->BSIM4v6BsbPtr) -= m * here->BSIM4v6grbsb); + (*(here->BSIM4v6BbPtr) += m * (here->BSIM4v6grbsb + here->BSIM4v6grbdb + + here->BSIM4v6grbpb)); + } + + if (here->BSIM4v6acnqsMod) + { *(here->BSIM4v6QqPtr ) += m * s->real * ScalingFactor; + *(here->BSIM4v6QqPtr +1) += m * s->imag * ScalingFactor; + *(here->BSIM4v6QgpPtr ) -= m * xcqgb * s->real; + *(here->BSIM4v6QgpPtr +1) -= m * xcqgb * s->imag; + *(here->BSIM4v6QdpPtr ) -= m * xcqdb * s->real; + *(here->BSIM4v6QdpPtr +1) -= m * xcqdb * s->imag; + *(here->BSIM4v6QbpPtr ) -= m * xcqbb * s->real; + *(here->BSIM4v6QbpPtr +1) -= m * xcqbb * s->imag; + *(here->BSIM4v6QspPtr ) -= m * xcqsb * s->real; + *(here->BSIM4v6QspPtr +1) -= m * xcqsb * s->imag; + + *(here->BSIM4v6GPqPtr) -= m * here->BSIM4v6gtau; + *(here->BSIM4v6DPqPtr) += m * dxpart * here->BSIM4v6gtau; + *(here->BSIM4v6SPqPtr) += m * sxpart * here->BSIM4v6gtau; + + *(here->BSIM4v6QqPtr) += m * here->BSIM4v6gtau; + *(here->BSIM4v6QgpPtr) += m * xgtg; + *(here->BSIM4v6QdpPtr) += m * xgtd; + *(here->BSIM4v6QbpPtr) += m * xgtb; + *(here->BSIM4v6QspPtr) += m * xgts; + } + } + } + return(OK); +} diff --git a/src/spicelib/devices/bsim4v6/b4v6set.c b/src/spicelib/devices/bsim4v6/b4v6set.c new file mode 100644 index 000000000..ac979406f --- /dev/null +++ b/src/spicelib/devices/bsim4v6/b4v6set.c @@ -0,0 +1,2461 @@ +/**** BSIM4.6.2 Released by Wenwei Yang 07/31/2008 ****/ +/**** BSIM4.6.4 Update ngspice 08/22/2009 ****/ +/**** OpenMP support ngspice 06/28/2010 ****/ +/********** + * Copyright 2006 Regents of the University of California. All rights reserved. + * File: b4set.c of BSIM4.6.2. + * Author: 2000 Weidong Liu + * Authors: 2001- Xuemei Xi, Mohan Dunga, Ali Niknejad, Chenming Hu. + * Authors: 2006- Mohan Dunga, Ali Niknejad, Chenming Hu + * Authors: 2007- Mohan Dunga, Wenwei Yang, Ali Niknejad, Chenming Hu + * Authors: 2008- Wenwei Yang, 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. + * Modified by Mohan Dunga, 12/13/2006 + * Modified by Mohan Dunga, Wenwei Yang, 05/18/2007. + * Modified by Wenwei Yang, 07/31/2008. +**********/ + +#include "ngspice.h" +#include "jobdefs.h" +#include "ftedefs.h" +#include "smpdefs.h" +#include "cktdefs.h" +#include "bsim4v6def.h" +#include "const.h" +#include "sperror.h" +#include "suffix.h" + +#ifdef USE_OMP4 +#include "cpextern.h" +int nthreads; +#endif + +#define MAX_EXP 5.834617425e14 +#define MIN_EXP 1.713908431e-15 +#define EXP_THRESHOLD 34.0 +#define EPS0 8.85418e-12 +#define EPSSI 1.03594e-10 +#define PI 3.141592654 +#define Charge_q 1.60219e-19 + +int +BSIM4v6setup( +SMPmatrix *matrix, +GENmodel *inModel, +CKTcircuit *ckt, +int *states) +{ +BSIM4v6model *model = (BSIM4v6model*)inModel; +BSIM4v6instance *here; +int error; +CKTnode *tmp; +int noiseAnalGiven = 0, createNode; /* Criteria for new node creation */ +double Rtot, DMCGeff, DMCIeff, DMDGeff; +JOB *job; + + +#ifdef USE_OMP4 +unsigned int idx, InstCount; +BSIM4v6instance **InstArray; +int nthreads; +#endif + + /* Search for a noise analysis request */ + for (job = ft_curckt->ci_curTask->jobs; job; job = job->JOBnextJob) { + if(strcmp(job->JOBname,"Noise Analysis")==0) { + noiseAnalGiven = 1; + break; + } + } + + /* loop through all the BSIM4v6 device models */ + for( ; model != NULL; model = model->BSIM4v6nextModel ) + { /* process defaults of model parameters */ + if (!model->BSIM4v6typeGiven) + model->BSIM4v6type = NMOS; + + if (!model->BSIM4v6mobModGiven) + model->BSIM4v6mobMod = 0; + else if ((model->BSIM4v6mobMod != 0) && (model->BSIM4v6mobMod != 1) + && (model->BSIM4v6mobMod != 2) && (model->BSIM4v6mobMod != 3)) + { model->BSIM4v6mobMod = 0; + printf("Warning: mobMod has been set to its default value: 0.\n"); + } + + if (!model->BSIM4v6binUnitGiven) + model->BSIM4v6binUnit = 1; + if (!model->BSIM4v6paramChkGiven) + model->BSIM4v6paramChk = 1; + + if (!model->BSIM4v6dioModGiven) + model->BSIM4v6dioMod = 1; + else if ((model->BSIM4v6dioMod != 0) && (model->BSIM4v6dioMod != 1) + && (model->BSIM4v6dioMod != 2)) + { model->BSIM4v6dioMod = 1; + printf("Warning: dioMod has been set to its default value: 1.\n"); + } + + if (!model->BSIM4v6cvchargeModGiven) + model->BSIM4v6cvchargeMod = 0; + if (!model->BSIM4v6capModGiven) + model->BSIM4v6capMod = 2; + else if ((model->BSIM4v6capMod != 0) && (model->BSIM4v6capMod != 1) + && (model->BSIM4v6capMod != 2)) + { model->BSIM4v6capMod = 2; + printf("Warning: capMod has been set to its default value: 2.\n"); + } + + if (!model->BSIM4v6rdsModGiven) + model->BSIM4v6rdsMod = 0; + else if ((model->BSIM4v6rdsMod != 0) && (model->BSIM4v6rdsMod != 1)) + { model->BSIM4v6rdsMod = 0; + printf("Warning: rdsMod has been set to its default value: 0.\n"); + } + if (!model->BSIM4v6rbodyModGiven) + model->BSIM4v6rbodyMod = 0; + else if ((model->BSIM4v6rbodyMod != 0) && (model->BSIM4v6rbodyMod != 1) && (model->BSIM4v6rbodyMod != 2)) + { model->BSIM4v6rbodyMod = 0; + printf("Warning: rbodyMod has been set to its default value: 0.\n"); + } + + if (!model->BSIM4v6rgateModGiven) + model->BSIM4v6rgateMod = 0; + else if ((model->BSIM4v6rgateMod != 0) && (model->BSIM4v6rgateMod != 1) + && (model->BSIM4v6rgateMod != 2) && (model->BSIM4v6rgateMod != 3)) + { model->BSIM4v6rgateMod = 0; + printf("Warning: rgateMod has been set to its default value: 0.\n"); + } + + if (!model->BSIM4v6perModGiven) + model->BSIM4v6perMod = 1; + else if ((model->BSIM4v6perMod != 0) && (model->BSIM4v6perMod != 1)) + { model->BSIM4v6perMod = 1; + printf("Warning: perMod has been set to its default value: 1.\n"); + } + + if (!model->BSIM4v6geoModGiven) + model->BSIM4v6geoMod = 0; + + if (!model->BSIM4v6fnoiModGiven) + model->BSIM4v6fnoiMod = 1; + else if ((model->BSIM4v6fnoiMod != 0) && (model->BSIM4v6fnoiMod != 1)) + { model->BSIM4v6fnoiMod = 1; + printf("Warning: fnoiMod has been set to its default value: 1.\n"); + } + if (!model->BSIM4v6tnoiModGiven) + model->BSIM4v6tnoiMod = 0; /* WDLiu: tnoiMod=1 needs to set internal S/D nodes */ + else if ((model->BSIM4v6tnoiMod != 0) && (model->BSIM4v6tnoiMod != 1)) + { model->BSIM4v6tnoiMod = 0; + printf("Warning: tnoiMod has been set to its default value: 0.\n"); + } + + if (!model->BSIM4v6trnqsModGiven) + model->BSIM4v6trnqsMod = 0; + else if ((model->BSIM4v6trnqsMod != 0) && (model->BSIM4v6trnqsMod != 1)) + { model->BSIM4v6trnqsMod = 0; + printf("Warning: trnqsMod has been set to its default value: 0.\n"); + } + if (!model->BSIM4v6acnqsModGiven) + model->BSIM4v6acnqsMod = 0; + else if ((model->BSIM4v6acnqsMod != 0) && (model->BSIM4v6acnqsMod != 1)) + { model->BSIM4v6acnqsMod = 0; + printf("Warning: acnqsMod has been set to its default value: 0.\n"); + } + + if (!model->BSIM4v6mtrlModGiven) + model->BSIM4v6mtrlMod = 0; + + if (!model->BSIM4v6igcModGiven) + model->BSIM4v6igcMod = 0; + else if ((model->BSIM4v6igcMod != 0) && (model->BSIM4v6igcMod != 1) + && (model->BSIM4v6igcMod != 2)) + { model->BSIM4v6igcMod = 0; + printf("Warning: igcMod has been set to its default value: 0.\n"); + } + if (!model->BSIM4v6igbModGiven) + model->BSIM4v6igbMod = 0; + else if ((model->BSIM4v6igbMod != 0) && (model->BSIM4v6igbMod != 1)) + { model->BSIM4v6igbMod = 0; + printf("Warning: igbMod has been set to its default value: 0.\n"); + } + if (!model->BSIM4v6tempModGiven) + model->BSIM4v6tempMod = 0; + else if ((model->BSIM4v6tempMod != 0) && (model->BSIM4v6tempMod != 1) + && (model->BSIM4v6tempMod != 2) && (model->BSIM4v6tempMod != 3)) + { model->BSIM4v6tempMod = 0; + printf("Warning: tempMod has been set to its default value: 0.\n"); + } + + if (!model->BSIM4v6versionGiven) + model->BSIM4v6version = "4.6.4"; + if (!model->BSIM4v6toxrefGiven) + model->BSIM4v6toxref = 30.0e-10; + if (!model->BSIM4v6eotGiven) + model->BSIM4v6eot = 15.0e-10; + if (!model->BSIM4v6vddeotGiven) + model->BSIM4v6vddeot = (model->BSIM4v6type == NMOS) ? 1.5 : -1.5; + if (!model->BSIM4v6tempeotGiven) + model->BSIM4v6tempeot = 300.15; + if (!model->BSIM4v6leffeotGiven) + model->BSIM4v6leffeot = 1; + if (!model->BSIM4v6weffeotGiven) + model->BSIM4v6weffeot = 10; + if (!model->BSIM4v6adosGiven) + model->BSIM4v6ados = 1.0; + if (!model->BSIM4v6bdosGiven) + model->BSIM4v6bdos = 1.0; + if (!model->BSIM4v6toxeGiven) + model->BSIM4v6toxe = 30.0e-10; + if (!model->BSIM4v6toxpGiven) + model->BSIM4v6toxp = model->BSIM4v6toxe; + if (!model->BSIM4v6toxmGiven) + model->BSIM4v6toxm = model->BSIM4v6toxe; + if (!model->BSIM4v6dtoxGiven) + model->BSIM4v6dtox = 0.0; + if (!model->BSIM4v6epsroxGiven) + model->BSIM4v6epsrox = 3.9; + + if (!model->BSIM4v6cdscGiven) + model->BSIM4v6cdsc = 2.4e-4; /* unit Q/V/m^2 */ + if (!model->BSIM4v6cdscbGiven) + model->BSIM4v6cdscb = 0.0; /* unit Q/V/m^2 */ + if (!model->BSIM4v6cdscdGiven) + model->BSIM4v6cdscd = 0.0; /* unit Q/V/m^2 */ + if (!model->BSIM4v6citGiven) + model->BSIM4v6cit = 0.0; /* unit Q/V/m^2 */ + if (!model->BSIM4v6nfactorGiven) + model->BSIM4v6nfactor = 1.0; + if (!model->BSIM4v6xjGiven) + model->BSIM4v6xj = .15e-6; + if (!model->BSIM4v6vsatGiven) + model->BSIM4v6vsat = 8.0e4; /* unit m/s */ + if (!model->BSIM4v6atGiven) + model->BSIM4v6at = 3.3e4; /* unit m/s */ + if (!model->BSIM4v6a0Given) + model->BSIM4v6a0 = 1.0; + if (!model->BSIM4v6agsGiven) + model->BSIM4v6ags = 0.0; + if (!model->BSIM4v6a1Given) + model->BSIM4v6a1 = 0.0; + if (!model->BSIM4v6a2Given) + model->BSIM4v6a2 = 1.0; + if (!model->BSIM4v6ketaGiven) + model->BSIM4v6keta = -0.047; /* unit / V */ + if (!model->BSIM4v6nsubGiven) + model->BSIM4v6nsub = 6.0e16; /* unit 1/cm3 */ + if (!model->BSIM4v6phigGiven) + model->BSIM4v6phig = 4.05; + if (!model->BSIM4v6epsrgateGiven) + model->BSIM4v6epsrgate = 11.7; + if (!model->BSIM4v6easubGiven) + model->BSIM4v6easub = 4.05; + if (!model->BSIM4v6epsrsubGiven) + model->BSIM4v6epsrsub = 11.7; + if (!model->BSIM4v6ni0subGiven) + model->BSIM4v6ni0sub = 1.45e10; /* unit 1/cm3 */ + if (!model->BSIM4v6bg0subGiven) + model->BSIM4v6bg0sub = 1.16; /* unit eV */ + if (!model->BSIM4v6tbgasubGiven) + model->BSIM4v6tbgasub = 7.02e-4; + if (!model->BSIM4v6tbgbsubGiven) + model->BSIM4v6tbgbsub = 1108.0; + if (!model->BSIM4v6ndepGiven) + model->BSIM4v6ndep = 1.7e17; /* unit 1/cm3 */ + if (!model->BSIM4v6nsdGiven) + model->BSIM4v6nsd = 1.0e20; /* unit 1/cm3 */ + if (!model->BSIM4v6phinGiven) + model->BSIM4v6phin = 0.0; /* unit V */ + if (!model->BSIM4v6ngateGiven) + model->BSIM4v6ngate = 0; /* unit 1/cm3 */ + if (!model->BSIM4v6vbmGiven) + model->BSIM4v6vbm = -3.0; + if (!model->BSIM4v6xtGiven) + model->BSIM4v6xt = 1.55e-7; + if (!model->BSIM4v6kt1Given) + model->BSIM4v6kt1 = -0.11; /* unit V */ + if (!model->BSIM4v6kt1lGiven) + model->BSIM4v6kt1l = 0.0; /* unit V*m */ + if (!model->BSIM4v6kt2Given) + model->BSIM4v6kt2 = 0.022; /* No unit */ + if (!model->BSIM4v6k3Given) + model->BSIM4v6k3 = 80.0; + if (!model->BSIM4v6k3bGiven) + model->BSIM4v6k3b = 0.0; + if (!model->BSIM4v6w0Given) + model->BSIM4v6w0 = 2.5e-6; + if (!model->BSIM4v6lpe0Given) + model->BSIM4v6lpe0 = 1.74e-7; + if (!model->BSIM4v6lpebGiven) + model->BSIM4v6lpeb = 0.0; + if (!model->BSIM4v6dvtp0Given) + model->BSIM4v6dvtp0 = 0.0; + if (!model->BSIM4v6dvtp1Given) + model->BSIM4v6dvtp1 = 0.0; + if (!model->BSIM4v6dvt0Given) + model->BSIM4v6dvt0 = 2.2; + if (!model->BSIM4v6dvt1Given) + model->BSIM4v6dvt1 = 0.53; + if (!model->BSIM4v6dvt2Given) + model->BSIM4v6dvt2 = -0.032; /* unit 1 / V */ + + if (!model->BSIM4v6dvt0wGiven) + model->BSIM4v6dvt0w = 0.0; + if (!model->BSIM4v6dvt1wGiven) + model->BSIM4v6dvt1w = 5.3e6; + if (!model->BSIM4v6dvt2wGiven) + model->BSIM4v6dvt2w = -0.032; + + if (!model->BSIM4v6droutGiven) + model->BSIM4v6drout = 0.56; + if (!model->BSIM4v6dsubGiven) + model->BSIM4v6dsub = model->BSIM4v6drout; + if (!model->BSIM4v6vth0Given) + model->BSIM4v6vth0 = (model->BSIM4v6type == NMOS) ? 0.7 : -0.7; + if (!model->BSIM4v6vfbGiven) + model->BSIM4v6vfb = -1.0; + if (!model->BSIM4v6euGiven) + model->BSIM4v6eu = (model->BSIM4v6type == NMOS) ? 1.67 : 1.0; + if (!model->BSIM4v6ucsGiven) + model->BSIM4v6ucs = (model->BSIM4v6type == NMOS) ? 1.67 : 1.0; + if (!model->BSIM4v6uaGiven) + model->BSIM4v6ua = ((model->BSIM4v6mobMod == 2)) ? 1.0e-15 : 1.0e-9; /* unit m/V */ + if (!model->BSIM4v6ua1Given) + model->BSIM4v6ua1 = 1.0e-9; /* unit m/V */ + if (!model->BSIM4v6ubGiven) + model->BSIM4v6ub = 1.0e-19; /* unit (m/V)**2 */ + if (!model->BSIM4v6ub1Given) + model->BSIM4v6ub1 = -1.0e-18; /* unit (m/V)**2 */ + if (!model->BSIM4v6ucGiven) + model->BSIM4v6uc = (model->BSIM4v6mobMod == 1) ? -0.0465 : -0.0465e-9; + if (!model->BSIM4v6uc1Given) + model->BSIM4v6uc1 = (model->BSIM4v6mobMod == 1) ? -0.056 : -0.056e-9; + if (!model->BSIM4v6udGiven) + model->BSIM4v6ud = 0.0; /* unit m**(-2) */ + if (!model->BSIM4v6ud1Given) + model->BSIM4v6ud1 = 0.0; + if (!model->BSIM4v6upGiven) + model->BSIM4v6up = 0.0; + if (!model->BSIM4v6lpGiven) + model->BSIM4v6lp = 1.0e-8; + if (!model->BSIM4v6u0Given) + model->BSIM4v6u0 = (model->BSIM4v6type == NMOS) ? 0.067 : 0.025; + if (!model->BSIM4v6uteGiven) + model->BSIM4v6ute = -1.5; + if (!model->BSIM4v6ucsteGiven) + model->BSIM4v6ucste = -4.775e-3; + if (!model->BSIM4v6voffGiven) + model->BSIM4v6voff = -0.08; + if (!model->BSIM4v6vofflGiven) + model->BSIM4v6voffl = 0.0; + if (!model->BSIM4v6voffcvlGiven) + model->BSIM4v6voffcvl = 0.0; + if (!model->BSIM4v6minvGiven) + model->BSIM4v6minv = 0.0; + if (!model->BSIM4v6minvcvGiven) + model->BSIM4v6minvcv = 0.0; + if (!model->BSIM4v6fproutGiven) + model->BSIM4v6fprout = 0.0; + if (!model->BSIM4v6pditsGiven) + model->BSIM4v6pdits = 0.0; + if (!model->BSIM4v6pditsdGiven) + model->BSIM4v6pditsd = 0.0; + if (!model->BSIM4v6pditslGiven) + model->BSIM4v6pditsl = 0.0; + if (!model->BSIM4v6deltaGiven) + model->BSIM4v6delta = 0.01; + if (!model->BSIM4v6rdswminGiven) + model->BSIM4v6rdswmin = 0.0; + if (!model->BSIM4v6rdwminGiven) + model->BSIM4v6rdwmin = 0.0; + if (!model->BSIM4v6rswminGiven) + model->BSIM4v6rswmin = 0.0; + if (!model->BSIM4v6rdswGiven) + model->BSIM4v6rdsw = 200.0; /* in ohm*um */ + if (!model->BSIM4v6rdwGiven) + model->BSIM4v6rdw = 100.0; + if (!model->BSIM4v6rswGiven) + model->BSIM4v6rsw = 100.0; + if (!model->BSIM4v6prwgGiven) + model->BSIM4v6prwg = 1.0; /* in 1/V */ + if (!model->BSIM4v6prwbGiven) + model->BSIM4v6prwb = 0.0; + if (!model->BSIM4v6prtGiven) + if (!model->BSIM4v6prtGiven) + model->BSIM4v6prt = 0.0; + if (!model->BSIM4v6eta0Given) + model->BSIM4v6eta0 = 0.08; /* no unit */ + if (!model->BSIM4v6etabGiven) + model->BSIM4v6etab = -0.07; /* unit 1/V */ + if (!model->BSIM4v6pclmGiven) + model->BSIM4v6pclm = 1.3; /* no unit */ + if (!model->BSIM4v6pdibl1Given) + model->BSIM4v6pdibl1 = 0.39; /* no unit */ + if (!model->BSIM4v6pdibl2Given) + model->BSIM4v6pdibl2 = 0.0086; /* no unit */ + if (!model->BSIM4v6pdiblbGiven) + model->BSIM4v6pdiblb = 0.0; /* 1/V */ + if (!model->BSIM4v6pscbe1Given) + model->BSIM4v6pscbe1 = 4.24e8; + if (!model->BSIM4v6pscbe2Given) + model->BSIM4v6pscbe2 = 1.0e-5; + if (!model->BSIM4v6pvagGiven) + model->BSIM4v6pvag = 0.0; + if (!model->BSIM4v6wrGiven) + model->BSIM4v6wr = 1.0; + if (!model->BSIM4v6dwgGiven) + model->BSIM4v6dwg = 0.0; + if (!model->BSIM4v6dwbGiven) + model->BSIM4v6dwb = 0.0; + if (!model->BSIM4v6b0Given) + model->BSIM4v6b0 = 0.0; + if (!model->BSIM4v6b1Given) + model->BSIM4v6b1 = 0.0; + if (!model->BSIM4v6alpha0Given) + model->BSIM4v6alpha0 = 0.0; + if (!model->BSIM4v6alpha1Given) + model->BSIM4v6alpha1 = 0.0; + if (!model->BSIM4v6beta0Given) + model->BSIM4v6beta0 = 0.0; + if (!model->BSIM4v6agidlGiven) + model->BSIM4v6agidl = 0.0; + if (!model->BSIM4v6bgidlGiven) + model->BSIM4v6bgidl = 2.3e9; /* V/m */ + if (!model->BSIM4v6cgidlGiven) + model->BSIM4v6cgidl = 0.5; /* V^3 */ + if (!model->BSIM4v6egidlGiven) + model->BSIM4v6egidl = 0.8; /* V */ + if (!model->BSIM4v6agislGiven) + { + if (model->BSIM4v6agidlGiven) + model->BSIM4v6agisl = model->BSIM4v6agidl; + else + model->BSIM4v6agisl = 0.0; + } + if (!model->BSIM4v6bgislGiven) + { + if (model->BSIM4v6bgidlGiven) + model->BSIM4v6bgisl = model->BSIM4v6bgidl; + else + model->BSIM4v6bgisl = 2.3e9; /* V/m */ + } + if (!model->BSIM4v6cgislGiven) + { + if (model->BSIM4v6cgidlGiven) + model->BSIM4v6cgisl = model->BSIM4v6cgidl; + else + model->BSIM4v6cgisl = 0.5; /* V^3 */ + } + if (!model->BSIM4v6egislGiven) + { + if (model->BSIM4v6egidlGiven) + model->BSIM4v6egisl = model->BSIM4v6egidl; + else + model->BSIM4v6egisl = 0.8; /* V */ + } + if (!model->BSIM4v6aigcGiven) + model->BSIM4v6aigc = (model->BSIM4v6type == NMOS) ? 1.36e-2 : 9.80e-3; + if (!model->BSIM4v6bigcGiven) + model->BSIM4v6bigc = (model->BSIM4v6type == NMOS) ? 1.71e-3 : 7.59e-4; + if (!model->BSIM4v6cigcGiven) + model->BSIM4v6cigc = (model->BSIM4v6type == NMOS) ? 0.075 : 0.03; + if (model->BSIM4v6aigsdGiven) + { + model->BSIM4v6aigs = model->BSIM4v6aigd = model->BSIM4v6aigsd; + } + else + { + model->BSIM4v6aigsd = (model->BSIM4v6type == NMOS) ? 1.36e-2 : 9.80e-3; + if (!model->BSIM4v6aigsGiven) + model->BSIM4v6aigs = (model->BSIM4v6type == NMOS) ? 1.36e-2 : 9.80e-3; + if (!model->BSIM4v6aigdGiven) + model->BSIM4v6aigd = (model->BSIM4v6type == NMOS) ? 1.36e-2 : 9.80e-3; + } + if (model->BSIM4v6bigsdGiven) + { + model->BSIM4v6bigs = model->BSIM4v6bigd = model->BSIM4v6bigsd; + } + else + { + model->BSIM4v6bigsd = (model->BSIM4v6type == NMOS) ? 1.71e-3 : 7.59e-4; + if (!model->BSIM4v6bigsGiven) + model->BSIM4v6bigs = (model->BSIM4v6type == NMOS) ? 1.71e-3 : 7.59e-4; + if (!model->BSIM4v6bigdGiven) + model->BSIM4v6bigd = (model->BSIM4v6type == NMOS) ? 1.71e-3 : 7.59e-4; + } + if (model->BSIM4v6cigsdGiven) + { + model->BSIM4v6cigs = model->BSIM4v6cigd = model->BSIM4v6cigsd; + } + else + { + model->BSIM4v6cigsd = (model->BSIM4v6type == NMOS) ? 0.075 : 0.03; + if (!model->BSIM4v6cigsGiven) + model->BSIM4v6cigs = (model->BSIM4v6type == NMOS) ? 0.075 : 0.03; + if (!model->BSIM4v6cigdGiven) + model->BSIM4v6cigd = (model->BSIM4v6type == NMOS) ? 0.075 : 0.03; + } + if (!model->BSIM4v6aigbaccGiven) + model->BSIM4v6aigbacc = 1.36e-2; + if (!model->BSIM4v6bigbaccGiven) + model->BSIM4v6bigbacc = 1.71e-3; + if (!model->BSIM4v6cigbaccGiven) + model->BSIM4v6cigbacc = 0.075; + if (!model->BSIM4v6aigbinvGiven) + model->BSIM4v6aigbinv = 1.11e-2; + if (!model->BSIM4v6bigbinvGiven) + model->BSIM4v6bigbinv = 9.49e-4; + if (!model->BSIM4v6cigbinvGiven) + model->BSIM4v6cigbinv = 0.006; + if (!model->BSIM4v6nigcGiven) + model->BSIM4v6nigc = 1.0; + if (!model->BSIM4v6nigbinvGiven) + model->BSIM4v6nigbinv = 3.0; + if (!model->BSIM4v6nigbaccGiven) + model->BSIM4v6nigbacc = 1.0; + if (!model->BSIM4v6ntoxGiven) + model->BSIM4v6ntox = 1.0; + if (!model->BSIM4v6eigbinvGiven) + model->BSIM4v6eigbinv = 1.1; + if (!model->BSIM4v6pigcdGiven) + model->BSIM4v6pigcd = 1.0; + if (!model->BSIM4v6poxedgeGiven) + model->BSIM4v6poxedge = 1.0; + if (!model->BSIM4v6xrcrg1Given) + model->BSIM4v6xrcrg1 = 12.0; + if (!model->BSIM4v6xrcrg2Given) + model->BSIM4v6xrcrg2 = 1.0; + if (!model->BSIM4v6ijthsfwdGiven) + model->BSIM4v6ijthsfwd = 0.1; /* unit A */ + if (!model->BSIM4v6ijthdfwdGiven) + model->BSIM4v6ijthdfwd = model->BSIM4v6ijthsfwd; + if (!model->BSIM4v6ijthsrevGiven) + model->BSIM4v6ijthsrev = 0.1; /* unit A */ + if (!model->BSIM4v6ijthdrevGiven) + model->BSIM4v6ijthdrev = model->BSIM4v6ijthsrev; + if (!model->BSIM4v6tnoiaGiven) + model->BSIM4v6tnoia = 1.5; + if (!model->BSIM4v6tnoibGiven) + model->BSIM4v6tnoib = 3.5; + if (!model->BSIM4v6rnoiaGiven) + model->BSIM4v6rnoia = 0.577; + if (!model->BSIM4v6rnoibGiven) + model->BSIM4v6rnoib = 0.5164; + if (!model->BSIM4v6ntnoiGiven) + model->BSIM4v6ntnoi = 1.0; + if (!model->BSIM4v6lambdaGiven) + model->BSIM4v6lambda = 0.0; + if (!model->BSIM4v6vtlGiven) + model->BSIM4v6vtl = 2.0e5; /* unit m/s */ + if (!model->BSIM4v6xnGiven) + model->BSIM4v6xn = 3.0; + if (!model->BSIM4v6lcGiven) + model->BSIM4v6lc = 5.0e-9; + if (!model->BSIM4v6vfbsdoffGiven) + model->BSIM4v6vfbsdoff = 0.0; /* unit v */ + if (!model->BSIM4v6tvfbsdoffGiven) + model->BSIM4v6tvfbsdoff = 0.0; + if (!model->BSIM4v6tvoffGiven) + model->BSIM4v6tvoff = 0.0; + + if (!model->BSIM4v6lintnoiGiven) + model->BSIM4v6lintnoi = 0.0; /* unit m */ + + if (!model->BSIM4v6xjbvsGiven) + model->BSIM4v6xjbvs = 1.0; /* no unit */ + if (!model->BSIM4v6xjbvdGiven) + model->BSIM4v6xjbvd = model->BSIM4v6xjbvs; + if (!model->BSIM4v6bvsGiven) + model->BSIM4v6bvs = 10.0; /* V */ + if (!model->BSIM4v6bvdGiven) + model->BSIM4v6bvd = model->BSIM4v6bvs; + + if (!model->BSIM4v6gbminGiven) + model->BSIM4v6gbmin = 1.0e-12; /* in mho */ + if (!model->BSIM4v6rbdbGiven) + model->BSIM4v6rbdb = 50.0; /* in ohm */ + if (!model->BSIM4v6rbpbGiven) + model->BSIM4v6rbpb = 50.0; + if (!model->BSIM4v6rbsbGiven) + model->BSIM4v6rbsb = 50.0; + if (!model->BSIM4v6rbpsGiven) + model->BSIM4v6rbps = 50.0; + if (!model->BSIM4v6rbpdGiven) + model->BSIM4v6rbpd = 50.0; + + if (!model->BSIM4v6rbps0Given) + model->BSIM4v6rbps0 = 50.0; + if (!model->BSIM4v6rbpslGiven) + model->BSIM4v6rbpsl = 0.0; + if (!model->BSIM4v6rbpswGiven) + model->BSIM4v6rbpsw = 0.0; + if (!model->BSIM4v6rbpsnfGiven) + model->BSIM4v6rbpsnf = 0.0; + + if (!model->BSIM4v6rbpd0Given) + model->BSIM4v6rbpd0 = 50.0; + if (!model->BSIM4v6rbpdlGiven) + model->BSIM4v6rbpdl = 0.0; + if (!model->BSIM4v6rbpdwGiven) + model->BSIM4v6rbpdw = 0.0; + if (!model->BSIM4v6rbpdnfGiven) + model->BSIM4v6rbpdnf = 0.0; + + if (!model->BSIM4v6rbpbx0Given) + model->BSIM4v6rbpbx0 = 100.0; + if (!model->BSIM4v6rbpbxlGiven) + model->BSIM4v6rbpbxl = 0.0; + if (!model->BSIM4v6rbpbxwGiven) + model->BSIM4v6rbpbxw = 0.0; + if (!model->BSIM4v6rbpbxnfGiven) + model->BSIM4v6rbpbxnf = 0.0; + if (!model->BSIM4v6rbpby0Given) + model->BSIM4v6rbpby0 = 100.0; + if (!model->BSIM4v6rbpbylGiven) + model->BSIM4v6rbpbyl = 0.0; + if (!model->BSIM4v6rbpbywGiven) + model->BSIM4v6rbpbyw = 0.0; + if (!model->BSIM4v6rbpbynfGiven) + model->BSIM4v6rbpbynf = 0.0; + + + if (!model->BSIM4v6rbsbx0Given) + model->BSIM4v6rbsbx0 = 100.0; + if (!model->BSIM4v6rbsby0Given) + model->BSIM4v6rbsby0 = 100.0; + if (!model->BSIM4v6rbdbx0Given) + model->BSIM4v6rbdbx0 = 100.0; + if (!model->BSIM4v6rbdby0Given) + model->BSIM4v6rbdby0 = 100.0; + + + if (!model->BSIM4v6rbsdbxlGiven) + model->BSIM4v6rbsdbxl = 0.0; + if (!model->BSIM4v6rbsdbxwGiven) + model->BSIM4v6rbsdbxw = 0.0; + if (!model->BSIM4v6rbsdbxnfGiven) + model->BSIM4v6rbsdbxnf = 0.0; + if (!model->BSIM4v6rbsdbylGiven) + model->BSIM4v6rbsdbyl = 0.0; + if (!model->BSIM4v6rbsdbywGiven) + model->BSIM4v6rbsdbyw = 0.0; + if (!model->BSIM4v6rbsdbynfGiven) + model->BSIM4v6rbsdbynf = 0.0; + + if (!model->BSIM4v6cgslGiven) + model->BSIM4v6cgsl = 0.0; + if (!model->BSIM4v6cgdlGiven) + model->BSIM4v6cgdl = 0.0; + if (!model->BSIM4v6ckappasGiven) + model->BSIM4v6ckappas = 0.6; + if (!model->BSIM4v6ckappadGiven) + model->BSIM4v6ckappad = model->BSIM4v6ckappas; + if (!model->BSIM4v6clcGiven) + model->BSIM4v6clc = 0.1e-6; + if (!model->BSIM4v6cleGiven) + model->BSIM4v6cle = 0.6; + if (!model->BSIM4v6vfbcvGiven) + model->BSIM4v6vfbcv = -1.0; + if (!model->BSIM4v6acdeGiven) + model->BSIM4v6acde = 1.0; + if (!model->BSIM4v6moinGiven) + model->BSIM4v6moin = 15.0; + if (!model->BSIM4v6noffGiven) + model->BSIM4v6noff = 1.0; + if (!model->BSIM4v6voffcvGiven) + model->BSIM4v6voffcv = 0.0; + if (!model->BSIM4v6dmcgGiven) + model->BSIM4v6dmcg = 0.0; + if (!model->BSIM4v6dmciGiven) + model->BSIM4v6dmci = model->BSIM4v6dmcg; + if (!model->BSIM4v6dmdgGiven) + model->BSIM4v6dmdg = 0.0; + if (!model->BSIM4v6dmcgtGiven) + model->BSIM4v6dmcgt = 0.0; + if (!model->BSIM4v6xgwGiven) + model->BSIM4v6xgw = 0.0; + if (!model->BSIM4v6xglGiven) + model->BSIM4v6xgl = 0.0; + if (!model->BSIM4v6rshgGiven) + model->BSIM4v6rshg = 0.1; + if (!model->BSIM4v6ngconGiven) + model->BSIM4v6ngcon = 1.0; + if (!model->BSIM4v6tcjGiven) + model->BSIM4v6tcj = 0.0; + if (!model->BSIM4v6tpbGiven) + model->BSIM4v6tpb = 0.0; + if (!model->BSIM4v6tcjswGiven) + model->BSIM4v6tcjsw = 0.0; + if (!model->BSIM4v6tpbswGiven) + model->BSIM4v6tpbsw = 0.0; + if (!model->BSIM4v6tcjswgGiven) + model->BSIM4v6tcjswg = 0.0; + if (!model->BSIM4v6tpbswgGiven) + model->BSIM4v6tpbswg = 0.0; + + /* Length dependence */ + if (!model->BSIM4v6lcdscGiven) + model->BSIM4v6lcdsc = 0.0; + if (!model->BSIM4v6lcdscbGiven) + model->BSIM4v6lcdscb = 0.0; + if (!model->BSIM4v6lcdscdGiven) + model->BSIM4v6lcdscd = 0.0; + if (!model->BSIM4v6lcitGiven) + model->BSIM4v6lcit = 0.0; + if (!model->BSIM4v6lnfactorGiven) + model->BSIM4v6lnfactor = 0.0; + if (!model->BSIM4v6lxjGiven) + model->BSIM4v6lxj = 0.0; + if (!model->BSIM4v6lvsatGiven) + model->BSIM4v6lvsat = 0.0; + if (!model->BSIM4v6latGiven) + model->BSIM4v6lat = 0.0; + if (!model->BSIM4v6la0Given) + model->BSIM4v6la0 = 0.0; + if (!model->BSIM4v6lagsGiven) + model->BSIM4v6lags = 0.0; + if (!model->BSIM4v6la1Given) + model->BSIM4v6la1 = 0.0; + if (!model->BSIM4v6la2Given) + model->BSIM4v6la2 = 0.0; + if (!model->BSIM4v6lketaGiven) + model->BSIM4v6lketa = 0.0; + if (!model->BSIM4v6lnsubGiven) + model->BSIM4v6lnsub = 0.0; + if (!model->BSIM4v6lndepGiven) + model->BSIM4v6lndep = 0.0; + if (!model->BSIM4v6lnsdGiven) + model->BSIM4v6lnsd = 0.0; + if (!model->BSIM4v6lphinGiven) + model->BSIM4v6lphin = 0.0; + if (!model->BSIM4v6lngateGiven) + model->BSIM4v6lngate = 0.0; + if (!model->BSIM4v6lvbmGiven) + model->BSIM4v6lvbm = 0.0; + if (!model->BSIM4v6lxtGiven) + model->BSIM4v6lxt = 0.0; + if (!model->BSIM4v6lkt1Given) + model->BSIM4v6lkt1 = 0.0; + if (!model->BSIM4v6lkt1lGiven) + model->BSIM4v6lkt1l = 0.0; + if (!model->BSIM4v6lkt2Given) + model->BSIM4v6lkt2 = 0.0; + if (!model->BSIM4v6lk3Given) + model->BSIM4v6lk3 = 0.0; + if (!model->BSIM4v6lk3bGiven) + model->BSIM4v6lk3b = 0.0; + if (!model->BSIM4v6lw0Given) + model->BSIM4v6lw0 = 0.0; + if (!model->BSIM4v6llpe0Given) + model->BSIM4v6llpe0 = 0.0; + if (!model->BSIM4v6llpebGiven) + model->BSIM4v6llpeb = 0.0; + if (!model->BSIM4v6ldvtp0Given) + model->BSIM4v6ldvtp0 = 0.0; + if (!model->BSIM4v6ldvtp1Given) + model->BSIM4v6ldvtp1 = 0.0; + if (!model->BSIM4v6ldvt0Given) + model->BSIM4v6ldvt0 = 0.0; + if (!model->BSIM4v6ldvt1Given) + model->BSIM4v6ldvt1 = 0.0; + if (!model->BSIM4v6ldvt2Given) + model->BSIM4v6ldvt2 = 0.0; + if (!model->BSIM4v6ldvt0wGiven) + model->BSIM4v6ldvt0w = 0.0; + if (!model->BSIM4v6ldvt1wGiven) + model->BSIM4v6ldvt1w = 0.0; + if (!model->BSIM4v6ldvt2wGiven) + model->BSIM4v6ldvt2w = 0.0; + if (!model->BSIM4v6ldroutGiven) + model->BSIM4v6ldrout = 0.0; + if (!model->BSIM4v6ldsubGiven) + model->BSIM4v6ldsub = 0.0; + if (!model->BSIM4v6lvth0Given) + model->BSIM4v6lvth0 = 0.0; + if (!model->BSIM4v6luaGiven) + model->BSIM4v6lua = 0.0; + if (!model->BSIM4v6lua1Given) + model->BSIM4v6lua1 = 0.0; + if (!model->BSIM4v6lubGiven) + model->BSIM4v6lub = 0.0; + if (!model->BSIM4v6lub1Given) + model->BSIM4v6lub1 = 0.0; + if (!model->BSIM4v6lucGiven) + model->BSIM4v6luc = 0.0; + if (!model->BSIM4v6luc1Given) + model->BSIM4v6luc1 = 0.0; + if (!model->BSIM4v6ludGiven) + model->BSIM4v6lud = 0.0; + if (!model->BSIM4v6lud1Given) + model->BSIM4v6lud1 = 0.0; + if (!model->BSIM4v6lupGiven) + model->BSIM4v6lup = 0.0; + if (!model->BSIM4v6llpGiven) + model->BSIM4v6llp = 0.0; + if (!model->BSIM4v6lu0Given) + model->BSIM4v6lu0 = 0.0; + if (!model->BSIM4v6luteGiven) + model->BSIM4v6lute = 0.0; + if (!model->BSIM4v6lucsteGiven) + model->BSIM4v6lucste = 0.0; + if (!model->BSIM4v6lvoffGiven) + model->BSIM4v6lvoff = 0.0; + if (!model->BSIM4v6lminvGiven) + model->BSIM4v6lminv = 0.0; + if (!model->BSIM4v6lminvcvGiven) + model->BSIM4v6lminvcv = 0.0; + if (!model->BSIM4v6lfproutGiven) + model->BSIM4v6lfprout = 0.0; + if (!model->BSIM4v6lpditsGiven) + model->BSIM4v6lpdits = 0.0; + if (!model->BSIM4v6lpditsdGiven) + model->BSIM4v6lpditsd = 0.0; + if (!model->BSIM4v6ldeltaGiven) + model->BSIM4v6ldelta = 0.0; + if (!model->BSIM4v6lrdswGiven) + model->BSIM4v6lrdsw = 0.0; + if (!model->BSIM4v6lrdwGiven) + model->BSIM4v6lrdw = 0.0; + if (!model->BSIM4v6lrswGiven) + model->BSIM4v6lrsw = 0.0; + if (!model->BSIM4v6lprwbGiven) + model->BSIM4v6lprwb = 0.0; + if (!model->BSIM4v6lprwgGiven) + model->BSIM4v6lprwg = 0.0; + if (!model->BSIM4v6lprtGiven) + model->BSIM4v6lprt = 0.0; + if (!model->BSIM4v6leta0Given) + model->BSIM4v6leta0 = 0.0; + if (!model->BSIM4v6letabGiven) + model->BSIM4v6letab = -0.0; + if (!model->BSIM4v6lpclmGiven) + model->BSIM4v6lpclm = 0.0; + if (!model->BSIM4v6lpdibl1Given) + model->BSIM4v6lpdibl1 = 0.0; + if (!model->BSIM4v6lpdibl2Given) + model->BSIM4v6lpdibl2 = 0.0; + if (!model->BSIM4v6lpdiblbGiven) + model->BSIM4v6lpdiblb = 0.0; + if (!model->BSIM4v6lpscbe1Given) + model->BSIM4v6lpscbe1 = 0.0; + if (!model->BSIM4v6lpscbe2Given) + model->BSIM4v6lpscbe2 = 0.0; + if (!model->BSIM4v6lpvagGiven) + model->BSIM4v6lpvag = 0.0; + if (!model->BSIM4v6lwrGiven) + model->BSIM4v6lwr = 0.0; + if (!model->BSIM4v6ldwgGiven) + model->BSIM4v6ldwg = 0.0; + if (!model->BSIM4v6ldwbGiven) + model->BSIM4v6ldwb = 0.0; + if (!model->BSIM4v6lb0Given) + model->BSIM4v6lb0 = 0.0; + if (!model->BSIM4v6lb1Given) + model->BSIM4v6lb1 = 0.0; + if (!model->BSIM4v6lalpha0Given) + model->BSIM4v6lalpha0 = 0.0; + if (!model->BSIM4v6lalpha1Given) + model->BSIM4v6lalpha1 = 0.0; + if (!model->BSIM4v6lbeta0Given) + model->BSIM4v6lbeta0 = 0.0; + if (!model->BSIM4v6lagidlGiven) + model->BSIM4v6lagidl = 0.0; + if (!model->BSIM4v6lbgidlGiven) + model->BSIM4v6lbgidl = 0.0; + if (!model->BSIM4v6lcgidlGiven) + model->BSIM4v6lcgidl = 0.0; + if (!model->BSIM4v6legidlGiven) + model->BSIM4v6legidl = 0.0; + if (!model->BSIM4v6lagislGiven) + { + if (model->BSIM4v6lagidlGiven) + model->BSIM4v6lagisl = model->BSIM4v6lagidl; + else + model->BSIM4v6lagisl = 0.0; + } + if (!model->BSIM4v6lbgislGiven) + { + if (model->BSIM4v6lbgidlGiven) + model->BSIM4v6lbgisl = model->BSIM4v6lbgidl; + else + model->BSIM4v6lbgisl = 0.0; + } + if (!model->BSIM4v6lcgislGiven) + { + if (model->BSIM4v6lcgidlGiven) + model->BSIM4v6lcgisl = model->BSIM4v6lcgidl; + else + model->BSIM4v6lcgisl = 0.0; + } + if (!model->BSIM4v6legislGiven) + { + if (model->BSIM4v6legidlGiven) + model->BSIM4v6legisl = model->BSIM4v6legidl; + else + model->BSIM4v6legisl = 0.0; + } + if (!model->BSIM4v6laigcGiven) + model->BSIM4v6laigc = 0.0; + if (!model->BSIM4v6lbigcGiven) + model->BSIM4v6lbigc = 0.0; + if (!model->BSIM4v6lcigcGiven) + model->BSIM4v6lcigc = 0.0; + if (!model->BSIM4v6aigsdGiven && (model->BSIM4v6aigsGiven || model->BSIM4v6aigdGiven)) + { + if (!model->BSIM4v6laigsGiven) + model->BSIM4v6laigs = 0.0; + if (!model->BSIM4v6laigdGiven) + model->BSIM4v6laigd = 0.0; + } + else + { + if (!model->BSIM4v6laigsdGiven) + model->BSIM4v6laigsd = 0.0; + model->BSIM4v6laigs = model->BSIM4v6laigd = model->BSIM4v6laigsd; + } + if (!model->BSIM4v6bigsdGiven && (model->BSIM4v6bigsGiven || model->BSIM4v6bigdGiven)) + { + if (!model->BSIM4v6lbigsGiven) + model->BSIM4v6lbigs = 0.0; + if (!model->BSIM4v6lbigdGiven) + model->BSIM4v6lbigd = 0.0; + } + else + { + if (!model->BSIM4v6lbigsdGiven) + model->BSIM4v6lbigsd = 0.0; + model->BSIM4v6lbigs = model->BSIM4v6lbigd = model->BSIM4v6lbigsd; + } + if (!model->BSIM4v6cigsdGiven && (model->BSIM4v6cigsGiven || model->BSIM4v6cigdGiven)) + { + if (!model->BSIM4v6lcigsGiven) + model->BSIM4v6lcigs = 0.0; + if (!model->BSIM4v6lcigdGiven) + model->BSIM4v6lcigd = 0.0; + } + else + { + if (!model->BSIM4v6lcigsdGiven) + model->BSIM4v6lcigsd = 0.0; + model->BSIM4v6lcigs = model->BSIM4v6lcigd = model->BSIM4v6lcigsd; + } + if (!model->BSIM4v6laigbaccGiven) + model->BSIM4v6laigbacc = 0.0; + if (!model->BSIM4v6lbigbaccGiven) + model->BSIM4v6lbigbacc = 0.0; + if (!model->BSIM4v6lcigbaccGiven) + model->BSIM4v6lcigbacc = 0.0; + if (!model->BSIM4v6laigbinvGiven) + model->BSIM4v6laigbinv = 0.0; + if (!model->BSIM4v6lbigbinvGiven) + model->BSIM4v6lbigbinv = 0.0; + if (!model->BSIM4v6lcigbinvGiven) + model->BSIM4v6lcigbinv = 0.0; + if (!model->BSIM4v6lnigcGiven) + model->BSIM4v6lnigc = 0.0; + if (!model->BSIM4v6lnigbinvGiven) + model->BSIM4v6lnigbinv = 0.0; + if (!model->BSIM4v6lnigbaccGiven) + model->BSIM4v6lnigbacc = 0.0; + if (!model->BSIM4v6lntoxGiven) + model->BSIM4v6lntox = 0.0; + if (!model->BSIM4v6leigbinvGiven) + model->BSIM4v6leigbinv = 0.0; + if (!model->BSIM4v6lpigcdGiven) + model->BSIM4v6lpigcd = 0.0; + if (!model->BSIM4v6lpoxedgeGiven) + model->BSIM4v6lpoxedge = 0.0; + if (!model->BSIM4v6lxrcrg1Given) + model->BSIM4v6lxrcrg1 = 0.0; + if (!model->BSIM4v6lxrcrg2Given) + model->BSIM4v6lxrcrg2 = 0.0; + if (!model->BSIM4v6leuGiven) + model->BSIM4v6leu = 0.0; + if (!model->BSIM4v6lucsGiven) + model->BSIM4v6lucs = 0.0; + if (!model->BSIM4v6lvfbGiven) + model->BSIM4v6lvfb = 0.0; + if (!model->BSIM4v6llambdaGiven) + model->BSIM4v6llambda = 0.0; + if (!model->BSIM4v6lvtlGiven) + model->BSIM4v6lvtl = 0.0; + if (!model->BSIM4v6lxnGiven) + model->BSIM4v6lxn = 0.0; + if (!model->BSIM4v6lvfbsdoffGiven) + model->BSIM4v6lvfbsdoff = 0.0; + if (!model->BSIM4v6ltvfbsdoffGiven) + model->BSIM4v6ltvfbsdoff = 0.0; + if (!model->BSIM4v6ltvoffGiven) + model->BSIM4v6ltvoff = 0.0; + + + if (!model->BSIM4v6lcgslGiven) + model->BSIM4v6lcgsl = 0.0; + if (!model->BSIM4v6lcgdlGiven) + model->BSIM4v6lcgdl = 0.0; + if (!model->BSIM4v6lckappasGiven) + model->BSIM4v6lckappas = 0.0; + if (!model->BSIM4v6lckappadGiven) + model->BSIM4v6lckappad = 0.0; + if (!model->BSIM4v6lclcGiven) + model->BSIM4v6lclc = 0.0; + if (!model->BSIM4v6lcleGiven) + model->BSIM4v6lcle = 0.0; + if (!model->BSIM4v6lcfGiven) + model->BSIM4v6lcf = 0.0; + if (!model->BSIM4v6lvfbcvGiven) + model->BSIM4v6lvfbcv = 0.0; + if (!model->BSIM4v6lacdeGiven) + model->BSIM4v6lacde = 0.0; + if (!model->BSIM4v6lmoinGiven) + model->BSIM4v6lmoin = 0.0; + if (!model->BSIM4v6lnoffGiven) + model->BSIM4v6lnoff = 0.0; + if (!model->BSIM4v6lvoffcvGiven) + model->BSIM4v6lvoffcv = 0.0; + + /* Width dependence */ + if (!model->BSIM4v6wcdscGiven) + model->BSIM4v6wcdsc = 0.0; + if (!model->BSIM4v6wcdscbGiven) + model->BSIM4v6wcdscb = 0.0; + if (!model->BSIM4v6wcdscdGiven) + model->BSIM4v6wcdscd = 0.0; + if (!model->BSIM4v6wcitGiven) + model->BSIM4v6wcit = 0.0; + if (!model->BSIM4v6wnfactorGiven) + model->BSIM4v6wnfactor = 0.0; + if (!model->BSIM4v6wxjGiven) + model->BSIM4v6wxj = 0.0; + if (!model->BSIM4v6wvsatGiven) + model->BSIM4v6wvsat = 0.0; + if (!model->BSIM4v6watGiven) + model->BSIM4v6wat = 0.0; + if (!model->BSIM4v6wa0Given) + model->BSIM4v6wa0 = 0.0; + if (!model->BSIM4v6wagsGiven) + model->BSIM4v6wags = 0.0; + if (!model->BSIM4v6wa1Given) + model->BSIM4v6wa1 = 0.0; + if (!model->BSIM4v6wa2Given) + model->BSIM4v6wa2 = 0.0; + if (!model->BSIM4v6wketaGiven) + model->BSIM4v6wketa = 0.0; + if (!model->BSIM4v6wnsubGiven) + model->BSIM4v6wnsub = 0.0; + if (!model->BSIM4v6wndepGiven) + model->BSIM4v6wndep = 0.0; + if (!model->BSIM4v6wnsdGiven) + model->BSIM4v6wnsd = 0.0; + if (!model->BSIM4v6wphinGiven) + model->BSIM4v6wphin = 0.0; + if (!model->BSIM4v6wngateGiven) + model->BSIM4v6wngate = 0.0; + if (!model->BSIM4v6wvbmGiven) + model->BSIM4v6wvbm = 0.0; + if (!model->BSIM4v6wxtGiven) + model->BSIM4v6wxt = 0.0; + if (!model->BSIM4v6wkt1Given) + model->BSIM4v6wkt1 = 0.0; + if (!model->BSIM4v6wkt1lGiven) + model->BSIM4v6wkt1l = 0.0; + if (!model->BSIM4v6wkt2Given) + model->BSIM4v6wkt2 = 0.0; + if (!model->BSIM4v6wk3Given) + model->BSIM4v6wk3 = 0.0; + if (!model->BSIM4v6wk3bGiven) + model->BSIM4v6wk3b = 0.0; + if (!model->BSIM4v6ww0Given) + model->BSIM4v6ww0 = 0.0; + if (!model->BSIM4v6wlpe0Given) + model->BSIM4v6wlpe0 = 0.0; + if (!model->BSIM4v6wlpebGiven) + model->BSIM4v6wlpeb = 0.0; + if (!model->BSIM4v6wdvtp0Given) + model->BSIM4v6wdvtp0 = 0.0; + if (!model->BSIM4v6wdvtp1Given) + model->BSIM4v6wdvtp1 = 0.0; + if (!model->BSIM4v6wdvt0Given) + model->BSIM4v6wdvt0 = 0.0; + if (!model->BSIM4v6wdvt1Given) + model->BSIM4v6wdvt1 = 0.0; + if (!model->BSIM4v6wdvt2Given) + model->BSIM4v6wdvt2 = 0.0; + if (!model->BSIM4v6wdvt0wGiven) + model->BSIM4v6wdvt0w = 0.0; + if (!model->BSIM4v6wdvt1wGiven) + model->BSIM4v6wdvt1w = 0.0; + if (!model->BSIM4v6wdvt2wGiven) + model->BSIM4v6wdvt2w = 0.0; + if (!model->BSIM4v6wdroutGiven) + model->BSIM4v6wdrout = 0.0; + if (!model->BSIM4v6wdsubGiven) + model->BSIM4v6wdsub = 0.0; + if (!model->BSIM4v6wvth0Given) + model->BSIM4v6wvth0 = 0.0; + if (!model->BSIM4v6wuaGiven) + model->BSIM4v6wua = 0.0; + if (!model->BSIM4v6wua1Given) + model->BSIM4v6wua1 = 0.0; + if (!model->BSIM4v6wubGiven) + model->BSIM4v6wub = 0.0; + if (!model->BSIM4v6wub1Given) + model->BSIM4v6wub1 = 0.0; + if (!model->BSIM4v6wucGiven) + model->BSIM4v6wuc = 0.0; + if (!model->BSIM4v6wuc1Given) + model->BSIM4v6wuc1 = 0.0; + if (!model->BSIM4v6wudGiven) + model->BSIM4v6wud = 0.0; + if (!model->BSIM4v6wud1Given) + model->BSIM4v6wud1 = 0.0; + if (!model->BSIM4v6wupGiven) + model->BSIM4v6wup = 0.0; + if (!model->BSIM4v6wlpGiven) + model->BSIM4v6wlp = 0.0; + if (!model->BSIM4v6wu0Given) + model->BSIM4v6wu0 = 0.0; + if (!model->BSIM4v6wuteGiven) + model->BSIM4v6wute = 0.0; + if (!model->BSIM4v6wucsteGiven) + model->BSIM4v6wucste = 0.0; + if (!model->BSIM4v6wvoffGiven) + model->BSIM4v6wvoff = 0.0; + if (!model->BSIM4v6wminvGiven) + model->BSIM4v6wminv = 0.0; + if (!model->BSIM4v6wminvcvGiven) + model->BSIM4v6wminvcv = 0.0; + if (!model->BSIM4v6wfproutGiven) + model->BSIM4v6wfprout = 0.0; + if (!model->BSIM4v6wpditsGiven) + model->BSIM4v6wpdits = 0.0; + if (!model->BSIM4v6wpditsdGiven) + model->BSIM4v6wpditsd = 0.0; + if (!model->BSIM4v6wdeltaGiven) + model->BSIM4v6wdelta = 0.0; + if (!model->BSIM4v6wrdswGiven) + model->BSIM4v6wrdsw = 0.0; + if (!model->BSIM4v6wrdwGiven) + model->BSIM4v6wrdw = 0.0; + if (!model->BSIM4v6wrswGiven) + model->BSIM4v6wrsw = 0.0; + if (!model->BSIM4v6wprwbGiven) + model->BSIM4v6wprwb = 0.0; + if (!model->BSIM4v6wprwgGiven) + model->BSIM4v6wprwg = 0.0; + if (!model->BSIM4v6wprtGiven) + model->BSIM4v6wprt = 0.0; + if (!model->BSIM4v6weta0Given) + model->BSIM4v6weta0 = 0.0; + if (!model->BSIM4v6wetabGiven) + model->BSIM4v6wetab = 0.0; + if (!model->BSIM4v6wpclmGiven) + model->BSIM4v6wpclm = 0.0; + if (!model->BSIM4v6wpdibl1Given) + model->BSIM4v6wpdibl1 = 0.0; + if (!model->BSIM4v6wpdibl2Given) + model->BSIM4v6wpdibl2 = 0.0; + if (!model->BSIM4v6wpdiblbGiven) + model->BSIM4v6wpdiblb = 0.0; + if (!model->BSIM4v6wpscbe1Given) + model->BSIM4v6wpscbe1 = 0.0; + if (!model->BSIM4v6wpscbe2Given) + model->BSIM4v6wpscbe2 = 0.0; + if (!model->BSIM4v6wpvagGiven) + model->BSIM4v6wpvag = 0.0; + if (!model->BSIM4v6wwrGiven) + model->BSIM4v6wwr = 0.0; + if (!model->BSIM4v6wdwgGiven) + model->BSIM4v6wdwg = 0.0; + if (!model->BSIM4v6wdwbGiven) + model->BSIM4v6wdwb = 0.0; + if (!model->BSIM4v6wb0Given) + model->BSIM4v6wb0 = 0.0; + if (!model->BSIM4v6wb1Given) + model->BSIM4v6wb1 = 0.0; + if (!model->BSIM4v6walpha0Given) + model->BSIM4v6walpha0 = 0.0; + if (!model->BSIM4v6walpha1Given) + model->BSIM4v6walpha1 = 0.0; + if (!model->BSIM4v6wbeta0Given) + model->BSIM4v6wbeta0 = 0.0; + if (!model->BSIM4v6wagidlGiven) + model->BSIM4v6wagidl = 0.0; + if (!model->BSIM4v6wbgidlGiven) + model->BSIM4v6wbgidl = 0.0; + if (!model->BSIM4v6wcgidlGiven) + model->BSIM4v6wcgidl = 0.0; + if (!model->BSIM4v6wegidlGiven) + model->BSIM4v6wegidl = 0.0; + if (!model->BSIM4v6wagislGiven) + { + if (model->BSIM4v6wagidlGiven) + model->BSIM4v6wagisl = model->BSIM4v6wagidl; + else + model->BSIM4v6wagisl = 0.0; + } + if (!model->BSIM4v6wbgislGiven) + { + if (model->BSIM4v6wbgidlGiven) + model->BSIM4v6wbgisl = model->BSIM4v6wbgidl; + else + model->BSIM4v6wbgisl = 0.0; + } + if (!model->BSIM4v6wcgislGiven) + { + if (model->BSIM4v6wcgidlGiven) + model->BSIM4v6wcgisl = model->BSIM4v6wcgidl; + else + model->BSIM4v6wcgisl = 0.0; + } + if (!model->BSIM4v6wegislGiven) + { + if (model->BSIM4v6wegidlGiven) + model->BSIM4v6wegisl = model->BSIM4v6wegidl; + else + model->BSIM4v6wegisl = 0.0; + } + if (!model->BSIM4v6waigcGiven) + model->BSIM4v6waigc = 0.0; + if (!model->BSIM4v6wbigcGiven) + model->BSIM4v6wbigc = 0.0; + if (!model->BSIM4v6wcigcGiven) + model->BSIM4v6wcigc = 0.0; + if (!model->BSIM4v6aigsdGiven && (model->BSIM4v6aigsGiven || model->BSIM4v6aigdGiven)) + { + if (!model->BSIM4v6waigsGiven) + model->BSIM4v6waigs = 0.0; + if (!model->BSIM4v6waigdGiven) + model->BSIM4v6waigd = 0.0; + } + else + { + if (!model->BSIM4v6waigsdGiven) + model->BSIM4v6waigsd = 0.0; + model->BSIM4v6waigs = model->BSIM4v6waigd = model->BSIM4v6waigsd; + } + if (!model->BSIM4v6bigsdGiven && (model->BSIM4v6bigsGiven || model->BSIM4v6bigdGiven)) + { + if (!model->BSIM4v6wbigsGiven) + model->BSIM4v6wbigs = 0.0; + if (!model->BSIM4v6wbigdGiven) + model->BSIM4v6wbigd = 0.0; + } + else + { + if (!model->BSIM4v6wbigsdGiven) + model->BSIM4v6wbigsd = 0.0; + model->BSIM4v6wbigs = model->BSIM4v6wbigd = model->BSIM4v6wbigsd; + } + if (!model->BSIM4v6cigsdGiven && (model->BSIM4v6cigsGiven || model->BSIM4v6cigdGiven)) + { + if (!model->BSIM4v6wcigsGiven) + model->BSIM4v6wcigs = 0.0; + if (!model->BSIM4v6wcigdGiven) + model->BSIM4v6wcigd = 0.0; + } + else + { + if (!model->BSIM4v6wcigsdGiven) + model->BSIM4v6wcigsd = 0.0; + model->BSIM4v6wcigs = model->BSIM4v6wcigd = model->BSIM4v6wcigsd; + } + if (!model->BSIM4v6waigbaccGiven) + model->BSIM4v6waigbacc = 0.0; + if (!model->BSIM4v6wbigbaccGiven) + model->BSIM4v6wbigbacc = 0.0; + if (!model->BSIM4v6wcigbaccGiven) + model->BSIM4v6wcigbacc = 0.0; + if (!model->BSIM4v6waigbinvGiven) + model->BSIM4v6waigbinv = 0.0; + if (!model->BSIM4v6wbigbinvGiven) + model->BSIM4v6wbigbinv = 0.0; + if (!model->BSIM4v6wcigbinvGiven) + model->BSIM4v6wcigbinv = 0.0; + if (!model->BSIM4v6wnigcGiven) + model->BSIM4v6wnigc = 0.0; + if (!model->BSIM4v6wnigbinvGiven) + model->BSIM4v6wnigbinv = 0.0; + if (!model->BSIM4v6wnigbaccGiven) + model->BSIM4v6wnigbacc = 0.0; + if (!model->BSIM4v6wntoxGiven) + model->BSIM4v6wntox = 0.0; + if (!model->BSIM4v6weigbinvGiven) + model->BSIM4v6weigbinv = 0.0; + if (!model->BSIM4v6wpigcdGiven) + model->BSIM4v6wpigcd = 0.0; + if (!model->BSIM4v6wpoxedgeGiven) + model->BSIM4v6wpoxedge = 0.0; + if (!model->BSIM4v6wxrcrg1Given) + model->BSIM4v6wxrcrg1 = 0.0; + if (!model->BSIM4v6wxrcrg2Given) + model->BSIM4v6wxrcrg2 = 0.0; + if (!model->BSIM4v6weuGiven) + model->BSIM4v6weu = 0.0; + if (!model->BSIM4v6wucsGiven) + model->BSIM4v6wucs = 0.0; + if (!model->BSIM4v6wvfbGiven) + model->BSIM4v6wvfb = 0.0; + if (!model->BSIM4v6wlambdaGiven) + model->BSIM4v6wlambda = 0.0; + if (!model->BSIM4v6wvtlGiven) + model->BSIM4v6wvtl = 0.0; + if (!model->BSIM4v6wxnGiven) + model->BSIM4v6wxn = 0.0; + if (!model->BSIM4v6wvfbsdoffGiven) + model->BSIM4v6wvfbsdoff = 0.0; + if (!model->BSIM4v6wtvfbsdoffGiven) + model->BSIM4v6wtvfbsdoff = 0.0; + if (!model->BSIM4v6wtvoffGiven) + model->BSIM4v6wtvoff = 0.0; + + if (!model->BSIM4v6wcgslGiven) + model->BSIM4v6wcgsl = 0.0; + if (!model->BSIM4v6wcgdlGiven) + model->BSIM4v6wcgdl = 0.0; + if (!model->BSIM4v6wckappasGiven) + model->BSIM4v6wckappas = 0.0; + if (!model->BSIM4v6wckappadGiven) + model->BSIM4v6wckappad = 0.0; + if (!model->BSIM4v6wcfGiven) + model->BSIM4v6wcf = 0.0; + if (!model->BSIM4v6wclcGiven) + model->BSIM4v6wclc = 0.0; + if (!model->BSIM4v6wcleGiven) + model->BSIM4v6wcle = 0.0; + if (!model->BSIM4v6wvfbcvGiven) + model->BSIM4v6wvfbcv = 0.0; + if (!model->BSIM4v6wacdeGiven) + model->BSIM4v6wacde = 0.0; + if (!model->BSIM4v6wmoinGiven) + model->BSIM4v6wmoin = 0.0; + if (!model->BSIM4v6wnoffGiven) + model->BSIM4v6wnoff = 0.0; + if (!model->BSIM4v6wvoffcvGiven) + model->BSIM4v6wvoffcv = 0.0; + + /* Cross-term dependence */ + if (!model->BSIM4v6pcdscGiven) + model->BSIM4v6pcdsc = 0.0; + if (!model->BSIM4v6pcdscbGiven) + model->BSIM4v6pcdscb = 0.0; + if (!model->BSIM4v6pcdscdGiven) + model->BSIM4v6pcdscd = 0.0; + if (!model->BSIM4v6pcitGiven) + model->BSIM4v6pcit = 0.0; + if (!model->BSIM4v6pnfactorGiven) + model->BSIM4v6pnfactor = 0.0; + if (!model->BSIM4v6pxjGiven) + model->BSIM4v6pxj = 0.0; + if (!model->BSIM4v6pvsatGiven) + model->BSIM4v6pvsat = 0.0; + if (!model->BSIM4v6patGiven) + model->BSIM4v6pat = 0.0; + if (!model->BSIM4v6pa0Given) + model->BSIM4v6pa0 = 0.0; + + if (!model->BSIM4v6pagsGiven) + model->BSIM4v6pags = 0.0; + if (!model->BSIM4v6pa1Given) + model->BSIM4v6pa1 = 0.0; + if (!model->BSIM4v6pa2Given) + model->BSIM4v6pa2 = 0.0; + if (!model->BSIM4v6pketaGiven) + model->BSIM4v6pketa = 0.0; + if (!model->BSIM4v6pnsubGiven) + model->BSIM4v6pnsub = 0.0; + if (!model->BSIM4v6pndepGiven) + model->BSIM4v6pndep = 0.0; + if (!model->BSIM4v6pnsdGiven) + model->BSIM4v6pnsd = 0.0; + if (!model->BSIM4v6pphinGiven) + model->BSIM4v6pphin = 0.0; + if (!model->BSIM4v6pngateGiven) + model->BSIM4v6pngate = 0.0; + if (!model->BSIM4v6pvbmGiven) + model->BSIM4v6pvbm = 0.0; + if (!model->BSIM4v6pxtGiven) + model->BSIM4v6pxt = 0.0; + if (!model->BSIM4v6pkt1Given) + model->BSIM4v6pkt1 = 0.0; + if (!model->BSIM4v6pkt1lGiven) + model->BSIM4v6pkt1l = 0.0; + if (!model->BSIM4v6pkt2Given) + model->BSIM4v6pkt2 = 0.0; + if (!model->BSIM4v6pk3Given) + model->BSIM4v6pk3 = 0.0; + if (!model->BSIM4v6pk3bGiven) + model->BSIM4v6pk3b = 0.0; + if (!model->BSIM4v6pw0Given) + model->BSIM4v6pw0 = 0.0; + if (!model->BSIM4v6plpe0Given) + model->BSIM4v6plpe0 = 0.0; + if (!model->BSIM4v6plpebGiven) + model->BSIM4v6plpeb = 0.0; + if (!model->BSIM4v6pdvtp0Given) + model->BSIM4v6pdvtp0 = 0.0; + if (!model->BSIM4v6pdvtp1Given) + model->BSIM4v6pdvtp1 = 0.0; + if (!model->BSIM4v6pdvt0Given) + model->BSIM4v6pdvt0 = 0.0; + if (!model->BSIM4v6pdvt1Given) + model->BSIM4v6pdvt1 = 0.0; + if (!model->BSIM4v6pdvt2Given) + model->BSIM4v6pdvt2 = 0.0; + if (!model->BSIM4v6pdvt0wGiven) + model->BSIM4v6pdvt0w = 0.0; + if (!model->BSIM4v6pdvt1wGiven) + model->BSIM4v6pdvt1w = 0.0; + if (!model->BSIM4v6pdvt2wGiven) + model->BSIM4v6pdvt2w = 0.0; + if (!model->BSIM4v6pdroutGiven) + model->BSIM4v6pdrout = 0.0; + if (!model->BSIM4v6pdsubGiven) + model->BSIM4v6pdsub = 0.0; + if (!model->BSIM4v6pvth0Given) + model->BSIM4v6pvth0 = 0.0; + if (!model->BSIM4v6puaGiven) + model->BSIM4v6pua = 0.0; + if (!model->BSIM4v6pua1Given) + model->BSIM4v6pua1 = 0.0; + if (!model->BSIM4v6pubGiven) + model->BSIM4v6pub = 0.0; + if (!model->BSIM4v6pub1Given) + model->BSIM4v6pub1 = 0.0; + if (!model->BSIM4v6pucGiven) + model->BSIM4v6puc = 0.0; + if (!model->BSIM4v6puc1Given) + model->BSIM4v6puc1 = 0.0; + if (!model->BSIM4v6pudGiven) + model->BSIM4v6pud = 0.0; + if (!model->BSIM4v6pud1Given) + model->BSIM4v6pud1 = 0.0; + if (!model->BSIM4v6pupGiven) + model->BSIM4v6pup = 0.0; + if (!model->BSIM4v6plpGiven) + model->BSIM4v6plp = 0.0; + if (!model->BSIM4v6pu0Given) + model->BSIM4v6pu0 = 0.0; + if (!model->BSIM4v6puteGiven) + model->BSIM4v6pute = 0.0; + if (!model->BSIM4v6pucsteGiven) + model->BSIM4v6pucste = 0.0; + if (!model->BSIM4v6pvoffGiven) + model->BSIM4v6pvoff = 0.0; + if (!model->BSIM4v6pminvGiven) + model->BSIM4v6pminv = 0.0; + if (!model->BSIM4v6pminvcvGiven) + model->BSIM4v6pminvcv = 0.0; + if (!model->BSIM4v6pfproutGiven) + model->BSIM4v6pfprout = 0.0; + if (!model->BSIM4v6ppditsGiven) + model->BSIM4v6ppdits = 0.0; + if (!model->BSIM4v6ppditsdGiven) + model->BSIM4v6ppditsd = 0.0; + if (!model->BSIM4v6pdeltaGiven) + model->BSIM4v6pdelta = 0.0; + if (!model->BSIM4v6prdswGiven) + model->BSIM4v6prdsw = 0.0; + if (!model->BSIM4v6prdwGiven) + model->BSIM4v6prdw = 0.0; + if (!model->BSIM4v6prswGiven) + model->BSIM4v6prsw = 0.0; + if (!model->BSIM4v6pprwbGiven) + model->BSIM4v6pprwb = 0.0; + if (!model->BSIM4v6pprwgGiven) + model->BSIM4v6pprwg = 0.0; + if (!model->BSIM4v6pprtGiven) + model->BSIM4v6pprt = 0.0; + if (!model->BSIM4v6peta0Given) + model->BSIM4v6peta0 = 0.0; + if (!model->BSIM4v6petabGiven) + model->BSIM4v6petab = 0.0; + if (!model->BSIM4v6ppclmGiven) + model->BSIM4v6ppclm = 0.0; + if (!model->BSIM4v6ppdibl1Given) + model->BSIM4v6ppdibl1 = 0.0; + if (!model->BSIM4v6ppdibl2Given) + model->BSIM4v6ppdibl2 = 0.0; + if (!model->BSIM4v6ppdiblbGiven) + model->BSIM4v6ppdiblb = 0.0; + if (!model->BSIM4v6ppscbe1Given) + model->BSIM4v6ppscbe1 = 0.0; + if (!model->BSIM4v6ppscbe2Given) + model->BSIM4v6ppscbe2 = 0.0; + if (!model->BSIM4v6ppvagGiven) + model->BSIM4v6ppvag = 0.0; + if (!model->BSIM4v6pwrGiven) + model->BSIM4v6pwr = 0.0; + if (!model->BSIM4v6pdwgGiven) + model->BSIM4v6pdwg = 0.0; + if (!model->BSIM4v6pdwbGiven) + model->BSIM4v6pdwb = 0.0; + if (!model->BSIM4v6pb0Given) + model->BSIM4v6pb0 = 0.0; + if (!model->BSIM4v6pb1Given) + model->BSIM4v6pb1 = 0.0; + if (!model->BSIM4v6palpha0Given) + model->BSIM4v6palpha0 = 0.0; + if (!model->BSIM4v6palpha1Given) + model->BSIM4v6palpha1 = 0.0; + if (!model->BSIM4v6pbeta0Given) + model->BSIM4v6pbeta0 = 0.0; + if (!model->BSIM4v6pagidlGiven) + model->BSIM4v6pagidl = 0.0; + if (!model->BSIM4v6pbgidlGiven) + model->BSIM4v6pbgidl = 0.0; + if (!model->BSIM4v6pcgidlGiven) + model->BSIM4v6pcgidl = 0.0; + if (!model->BSIM4v6pegidlGiven) + model->BSIM4v6pegidl = 0.0; + if (!model->BSIM4v6pagislGiven) + { + if (model->BSIM4v6pagidlGiven) + model->BSIM4v6pagisl = model->BSIM4v6pagidl; + else + model->BSIM4v6pagisl = 0.0; + } + if (!model->BSIM4v6pbgislGiven) + { + if (model->BSIM4v6pbgidlGiven) + model->BSIM4v6pbgisl = model->BSIM4v6pbgidl; + else + model->BSIM4v6pbgisl = 0.0; + } + if (!model->BSIM4v6pcgislGiven) + { + if (model->BSIM4v6pcgidlGiven) + model->BSIM4v6pcgisl = model->BSIM4v6pcgidl; + else + model->BSIM4v6pcgisl = 0.0; + } + if (!model->BSIM4v6pegislGiven) + { + if (model->BSIM4v6pegidlGiven) + model->BSIM4v6pegisl = model->BSIM4v6pegidl; + else + model->BSIM4v6pegisl = 0.0; + } + if (!model->BSIM4v6paigcGiven) + model->BSIM4v6paigc = 0.0; + if (!model->BSIM4v6pbigcGiven) + model->BSIM4v6pbigc = 0.0; + if (!model->BSIM4v6pcigcGiven) + model->BSIM4v6pcigc = 0.0; + if (!model->BSIM4v6aigsdGiven && (model->BSIM4v6aigsGiven || model->BSIM4v6aigdGiven)) + { + if (!model->BSIM4v6paigsGiven) + model->BSIM4v6paigs = 0.0; + if (!model->BSIM4v6paigdGiven) + model->BSIM4v6paigd = 0.0; + } + else + { + if (!model->BSIM4v6paigsdGiven) + model->BSIM4v6paigsd = 0.0; + model->BSIM4v6paigs = model->BSIM4v6paigd = model->BSIM4v6paigsd; + } + if (!model->BSIM4v6bigsdGiven && (model->BSIM4v6bigsGiven || model->BSIM4v6bigdGiven)) + { + if (!model->BSIM4v6pbigsGiven) + model->BSIM4v6pbigs = 0.0; + if (!model->BSIM4v6pbigdGiven) + model->BSIM4v6pbigd = 0.0; + } + else + { + if (!model->BSIM4v6pbigsdGiven) + model->BSIM4v6pbigsd = 0.0; + model->BSIM4v6pbigs = model->BSIM4v6pbigd = model->BSIM4v6pbigsd; + } + if (!model->BSIM4v6cigsdGiven && (model->BSIM4v6cigsGiven || model->BSIM4v6cigdGiven)) + { + if (!model->BSIM4v6pcigsGiven) + model->BSIM4v6pcigs = 0.0; + if (!model->BSIM4v6pcigdGiven) + model->BSIM4v6pcigd = 0.0; + } + else + { + if (!model->BSIM4v6pcigsdGiven) + model->BSIM4v6pcigsd = 0.0; + model->BSIM4v6pcigs = model->BSIM4v6pcigd = model->BSIM4v6pcigsd; + } + if (!model->BSIM4v6paigbaccGiven) + model->BSIM4v6paigbacc = 0.0; + if (!model->BSIM4v6pbigbaccGiven) + model->BSIM4v6pbigbacc = 0.0; + if (!model->BSIM4v6pcigbaccGiven) + model->BSIM4v6pcigbacc = 0.0; + if (!model->BSIM4v6paigbinvGiven) + model->BSIM4v6paigbinv = 0.0; + if (!model->BSIM4v6pbigbinvGiven) + model->BSIM4v6pbigbinv = 0.0; + if (!model->BSIM4v6pcigbinvGiven) + model->BSIM4v6pcigbinv = 0.0; + if (!model->BSIM4v6pnigcGiven) + model->BSIM4v6pnigc = 0.0; + if (!model->BSIM4v6pnigbinvGiven) + model->BSIM4v6pnigbinv = 0.0; + if (!model->BSIM4v6pnigbaccGiven) + model->BSIM4v6pnigbacc = 0.0; + if (!model->BSIM4v6pntoxGiven) + model->BSIM4v6pntox = 0.0; + if (!model->BSIM4v6peigbinvGiven) + model->BSIM4v6peigbinv = 0.0; + if (!model->BSIM4v6ppigcdGiven) + model->BSIM4v6ppigcd = 0.0; + if (!model->BSIM4v6ppoxedgeGiven) + model->BSIM4v6ppoxedge = 0.0; + if (!model->BSIM4v6pxrcrg1Given) + model->BSIM4v6pxrcrg1 = 0.0; + if (!model->BSIM4v6pxrcrg2Given) + model->BSIM4v6pxrcrg2 = 0.0; + if (!model->BSIM4v6peuGiven) + model->BSIM4v6peu = 0.0; + if (!model->BSIM4v6pucsGiven) + model->BSIM4v6pucs = 0.0; + if (!model->BSIM4v6pvfbGiven) + model->BSIM4v6pvfb = 0.0; + if (!model->BSIM4v6plambdaGiven) + model->BSIM4v6plambda = 0.0; + if (!model->BSIM4v6pvtlGiven) + model->BSIM4v6pvtl = 0.0; + if (!model->BSIM4v6pxnGiven) + model->BSIM4v6pxn = 0.0; + if (!model->BSIM4v6pvfbsdoffGiven) + model->BSIM4v6pvfbsdoff = 0.0; + if (!model->BSIM4v6ptvfbsdoffGiven) + model->BSIM4v6ptvfbsdoff = 0.0; + if (!model->BSIM4v6ptvoffGiven) + model->BSIM4v6ptvoff = 0.0; + + if (!model->BSIM4v6pcgslGiven) + model->BSIM4v6pcgsl = 0.0; + if (!model->BSIM4v6pcgdlGiven) + model->BSIM4v6pcgdl = 0.0; + if (!model->BSIM4v6pckappasGiven) + model->BSIM4v6pckappas = 0.0; + if (!model->BSIM4v6pckappadGiven) + model->BSIM4v6pckappad = 0.0; + if (!model->BSIM4v6pcfGiven) + model->BSIM4v6pcf = 0.0; + if (!model->BSIM4v6pclcGiven) + model->BSIM4v6pclc = 0.0; + if (!model->BSIM4v6pcleGiven) + model->BSIM4v6pcle = 0.0; + if (!model->BSIM4v6pvfbcvGiven) + model->BSIM4v6pvfbcv = 0.0; + if (!model->BSIM4v6pacdeGiven) + model->BSIM4v6pacde = 0.0; + if (!model->BSIM4v6pmoinGiven) + model->BSIM4v6pmoin = 0.0; + if (!model->BSIM4v6pnoffGiven) + model->BSIM4v6pnoff = 0.0; + if (!model->BSIM4v6pvoffcvGiven) + model->BSIM4v6pvoffcv = 0.0; + + if (!model->BSIM4v6gamma1Given) + model->BSIM4v6gamma1 = 0.0; + if (!model->BSIM4v6lgamma1Given) + model->BSIM4v6lgamma1 = 0.0; + if (!model->BSIM4v6wgamma1Given) + model->BSIM4v6wgamma1 = 0.0; + if (!model->BSIM4v6pgamma1Given) + model->BSIM4v6pgamma1 = 0.0; + if (!model->BSIM4v6gamma2Given) + model->BSIM4v6gamma2 = 0.0; + if (!model->BSIM4v6lgamma2Given) + model->BSIM4v6lgamma2 = 0.0; + if (!model->BSIM4v6wgamma2Given) + model->BSIM4v6wgamma2 = 0.0; + if (!model->BSIM4v6pgamma2Given) + model->BSIM4v6pgamma2 = 0.0; + if (!model->BSIM4v6vbxGiven) + model->BSIM4v6vbx = 0.0; + if (!model->BSIM4v6lvbxGiven) + model->BSIM4v6lvbx = 0.0; + if (!model->BSIM4v6wvbxGiven) + model->BSIM4v6wvbx = 0.0; + if (!model->BSIM4v6pvbxGiven) + model->BSIM4v6pvbx = 0.0; + + /* unit degree celcius */ + if (!model->BSIM4v6tnomGiven) + model->BSIM4v6tnom = ckt->CKTnomTemp; + if (!model->BSIM4v6LintGiven) + model->BSIM4v6Lint = 0.0; + if (!model->BSIM4v6LlGiven) + model->BSIM4v6Ll = 0.0; + if (!model->BSIM4v6LlcGiven) + model->BSIM4v6Llc = model->BSIM4v6Ll; + if (!model->BSIM4v6LlnGiven) + model->BSIM4v6Lln = 1.0; + if (!model->BSIM4v6LwGiven) + model->BSIM4v6Lw = 0.0; + if (!model->BSIM4v6LwcGiven) + model->BSIM4v6Lwc = model->BSIM4v6Lw; + if (!model->BSIM4v6LwnGiven) + model->BSIM4v6Lwn = 1.0; + if (!model->BSIM4v6LwlGiven) + model->BSIM4v6Lwl = 0.0; + if (!model->BSIM4v6LwlcGiven) + model->BSIM4v6Lwlc = model->BSIM4v6Lwl; + if (!model->BSIM4v6LminGiven) + model->BSIM4v6Lmin = 0.0; + if (!model->BSIM4v6LmaxGiven) + model->BSIM4v6Lmax = 1.0; + if (!model->BSIM4v6WintGiven) + model->BSIM4v6Wint = 0.0; + if (!model->BSIM4v6WlGiven) + model->BSIM4v6Wl = 0.0; + if (!model->BSIM4v6WlcGiven) + model->BSIM4v6Wlc = model->BSIM4v6Wl; + if (!model->BSIM4v6WlnGiven) + model->BSIM4v6Wln = 1.0; + if (!model->BSIM4v6WwGiven) + model->BSIM4v6Ww = 0.0; + if (!model->BSIM4v6WwcGiven) + model->BSIM4v6Wwc = model->BSIM4v6Ww; + if (!model->BSIM4v6WwnGiven) + model->BSIM4v6Wwn = 1.0; + if (!model->BSIM4v6WwlGiven) + model->BSIM4v6Wwl = 0.0; + if (!model->BSIM4v6WwlcGiven) + model->BSIM4v6Wwlc = model->BSIM4v6Wwl; + if (!model->BSIM4v6WminGiven) + model->BSIM4v6Wmin = 0.0; + if (!model->BSIM4v6WmaxGiven) + model->BSIM4v6Wmax = 1.0; + if (!model->BSIM4v6dwcGiven) + model->BSIM4v6dwc = model->BSIM4v6Wint; + if (!model->BSIM4v6dlcGiven) + model->BSIM4v6dlc = model->BSIM4v6Lint; + if (!model->BSIM4v6xlGiven) + model->BSIM4v6xl = 0.0; + if (!model->BSIM4v6xwGiven) + model->BSIM4v6xw = 0.0; + if (!model->BSIM4v6dlcigGiven) + model->BSIM4v6dlcig = model->BSIM4v6Lint; + if (!model->BSIM4v6dlcigdGiven) + { + if (model->BSIM4v6dlcigGiven) + model->BSIM4v6dlcigd = model->BSIM4v6dlcig; + else + model->BSIM4v6dlcigd = model->BSIM4v6Lint; + } + if (!model->BSIM4v6dwjGiven) + model->BSIM4v6dwj = model->BSIM4v6dwc; + if (!model->BSIM4v6cfGiven) + model->BSIM4v6cf = 2.0 * model->BSIM4v6epsrox * EPS0 / PI + * log(1.0 + 0.4e-6 / model->BSIM4v6toxe); + + if (!model->BSIM4v6xpartGiven) + model->BSIM4v6xpart = 0.0; + if (!model->BSIM4v6sheetResistanceGiven) + model->BSIM4v6sheetResistance = 0.0; + + if (!model->BSIM4v6SunitAreaJctCapGiven) + model->BSIM4v6SunitAreaJctCap = 5.0E-4; + if (!model->BSIM4v6DunitAreaJctCapGiven) + model->BSIM4v6DunitAreaJctCap = model->BSIM4v6SunitAreaJctCap; + if (!model->BSIM4v6SunitLengthSidewallJctCapGiven) + model->BSIM4v6SunitLengthSidewallJctCap = 5.0E-10; + if (!model->BSIM4v6DunitLengthSidewallJctCapGiven) + model->BSIM4v6DunitLengthSidewallJctCap = model->BSIM4v6SunitLengthSidewallJctCap; + if (!model->BSIM4v6SunitLengthGateSidewallJctCapGiven) + model->BSIM4v6SunitLengthGateSidewallJctCap = model->BSIM4v6SunitLengthSidewallJctCap ; + if (!model->BSIM4v6DunitLengthGateSidewallJctCapGiven) + model->BSIM4v6DunitLengthGateSidewallJctCap = model->BSIM4v6SunitLengthGateSidewallJctCap; + if (!model->BSIM4v6SjctSatCurDensityGiven) + model->BSIM4v6SjctSatCurDensity = 1.0E-4; + if (!model->BSIM4v6DjctSatCurDensityGiven) + model->BSIM4v6DjctSatCurDensity = model->BSIM4v6SjctSatCurDensity; + if (!model->BSIM4v6SjctSidewallSatCurDensityGiven) + model->BSIM4v6SjctSidewallSatCurDensity = 0.0; + if (!model->BSIM4v6DjctSidewallSatCurDensityGiven) + model->BSIM4v6DjctSidewallSatCurDensity = model->BSIM4v6SjctSidewallSatCurDensity; + if (!model->BSIM4v6SjctGateSidewallSatCurDensityGiven) + model->BSIM4v6SjctGateSidewallSatCurDensity = 0.0; + if (!model->BSIM4v6DjctGateSidewallSatCurDensityGiven) + model->BSIM4v6DjctGateSidewallSatCurDensity = model->BSIM4v6SjctGateSidewallSatCurDensity; + if (!model->BSIM4v6SbulkJctPotentialGiven) + model->BSIM4v6SbulkJctPotential = 1.0; + if (!model->BSIM4v6DbulkJctPotentialGiven) + model->BSIM4v6DbulkJctPotential = model->BSIM4v6SbulkJctPotential; + if (!model->BSIM4v6SsidewallJctPotentialGiven) + model->BSIM4v6SsidewallJctPotential = 1.0; + if (!model->BSIM4v6DsidewallJctPotentialGiven) + model->BSIM4v6DsidewallJctPotential = model->BSIM4v6SsidewallJctPotential; + if (!model->BSIM4v6SGatesidewallJctPotentialGiven) + model->BSIM4v6SGatesidewallJctPotential = model->BSIM4v6SsidewallJctPotential; + if (!model->BSIM4v6DGatesidewallJctPotentialGiven) + model->BSIM4v6DGatesidewallJctPotential = model->BSIM4v6SGatesidewallJctPotential; + if (!model->BSIM4v6SbulkJctBotGradingCoeffGiven) + model->BSIM4v6SbulkJctBotGradingCoeff = 0.5; + if (!model->BSIM4v6DbulkJctBotGradingCoeffGiven) + model->BSIM4v6DbulkJctBotGradingCoeff = model->BSIM4v6SbulkJctBotGradingCoeff; + if (!model->BSIM4v6SbulkJctSideGradingCoeffGiven) + model->BSIM4v6SbulkJctSideGradingCoeff = 0.33; + if (!model->BSIM4v6DbulkJctSideGradingCoeffGiven) + model->BSIM4v6DbulkJctSideGradingCoeff = model->BSIM4v6SbulkJctSideGradingCoeff; + if (!model->BSIM4v6SbulkJctGateSideGradingCoeffGiven) + model->BSIM4v6SbulkJctGateSideGradingCoeff = model->BSIM4v6SbulkJctSideGradingCoeff; + if (!model->BSIM4v6DbulkJctGateSideGradingCoeffGiven) + model->BSIM4v6DbulkJctGateSideGradingCoeff = model->BSIM4v6SbulkJctGateSideGradingCoeff; + if (!model->BSIM4v6SjctEmissionCoeffGiven) + model->BSIM4v6SjctEmissionCoeff = 1.0; + if (!model->BSIM4v6DjctEmissionCoeffGiven) + model->BSIM4v6DjctEmissionCoeff = model->BSIM4v6SjctEmissionCoeff; + if (!model->BSIM4v6SjctTempExponentGiven) + model->BSIM4v6SjctTempExponent = 3.0; + if (!model->BSIM4v6DjctTempExponentGiven) + model->BSIM4v6DjctTempExponent = model->BSIM4v6SjctTempExponent; + + if (!model->BSIM4v6jtssGiven) + model->BSIM4v6jtss = 0.0; + if (!model->BSIM4v6jtsdGiven) + model->BSIM4v6jtsd = model->BSIM4v6jtss; + if (!model->BSIM4v6jtsswsGiven) + model->BSIM4v6jtssws = 0.0; + if (!model->BSIM4v6jtsswdGiven) + model->BSIM4v6jtsswd = model->BSIM4v6jtssws; + if (!model->BSIM4v6jtsswgsGiven) + model->BSIM4v6jtsswgs = 0.0; + if (!model->BSIM4v6jtsswgdGiven) + model->BSIM4v6jtsswgd = model->BSIM4v6jtsswgs; + if (!model->BSIM4v6jtweffGiven) + model->BSIM4v6jtweff = 0.0; + if (!model->BSIM4v6njtsGiven) + model->BSIM4v6njts = 20.0; + if (!model->BSIM4v6njtsswGiven) + model->BSIM4v6njtssw = 20.0; + if (!model->BSIM4v6njtsswgGiven) + model->BSIM4v6njtsswg = 20.0; + if (!model->BSIM4v6njtsdGiven) + { + if (model->BSIM4v6njtsGiven) + model->BSIM4v6njtsd = model->BSIM4v6njts; + else + model->BSIM4v6njtsd = 20.0; + } + if (!model->BSIM4v6njtsswdGiven) + { + if (model->BSIM4v6njtsswGiven) + model->BSIM4v6njtsswd = model->BSIM4v6njtssw; + else + model->BSIM4v6njtsswd = 20.0; + } + if (!model->BSIM4v6njtsswgdGiven) + { + if (model->BSIM4v6njtsswgGiven) + model->BSIM4v6njtsswgd = model->BSIM4v6njtsswg; + else + model->BSIM4v6njtsswgd = 20.0; + } + if (!model->BSIM4v6xtssGiven) + model->BSIM4v6xtss = 0.02; + if (!model->BSIM4v6xtsdGiven) + model->BSIM4v6xtsd = model->BSIM4v6xtss; + if (!model->BSIM4v6xtsswsGiven) + model->BSIM4v6xtssws = 0.02; + if (!model->BSIM4v6xtsswdGiven) + model->BSIM4v6xtsswd = model->BSIM4v6xtssws; + if (!model->BSIM4v6xtsswgsGiven) + model->BSIM4v6xtsswgs = 0.02; + if (!model->BSIM4v6xtsswgdGiven) + model->BSIM4v6xtsswgd = model->BSIM4v6xtsswgs; + if (!model->BSIM4v6tnjtsGiven) + model->BSIM4v6tnjts = 0.0; + if (!model->BSIM4v6tnjtsswGiven) + model->BSIM4v6tnjtssw = 0.0; + if (!model->BSIM4v6tnjtsswgGiven) + model->BSIM4v6tnjtsswg = 0.0; + if (!model->BSIM4v6tnjtsdGiven) + { + if (model->BSIM4v6tnjtsGiven) + model->BSIM4v6tnjtsd = model->BSIM4v6tnjts; + else + model->BSIM4v6tnjtsd = 0.0; + } + if (!model->BSIM4v6tnjtsswdGiven) + { + if (model->BSIM4v6tnjtsswGiven) + model->BSIM4v6tnjtsswd = model->BSIM4v6tnjtssw; + else + model->BSIM4v6tnjtsswd = 0.0; + } + if (!model->BSIM4v6tnjtsswgdGiven) + { + if (model->BSIM4v6tnjtsswgGiven) + model->BSIM4v6tnjtsswgd = model->BSIM4v6tnjtsswg; + else + model->BSIM4v6tnjtsswgd = 0.0; + } + if (!model->BSIM4v6vtssGiven) + model->BSIM4v6vtss = 10.0; + if (!model->BSIM4v6vtsdGiven) + model->BSIM4v6vtsd = model->BSIM4v6vtss; + if (!model->BSIM4v6vtsswsGiven) + model->BSIM4v6vtssws = 10.0; + if (!model->BSIM4v6vtsswdGiven) + model->BSIM4v6vtsswd = model->BSIM4v6vtssws; + if (!model->BSIM4v6vtsswgsGiven) + model->BSIM4v6vtsswgs = 10.0; + if (!model->BSIM4v6vtsswgdGiven) + model->BSIM4v6vtsswgd = model->BSIM4v6vtsswgs; + + if (!model->BSIM4v6oxideTrapDensityAGiven) + { if (model->BSIM4v6type == NMOS) + model->BSIM4v6oxideTrapDensityA = 6.25e41; + else + model->BSIM4v6oxideTrapDensityA= 6.188e40; + } + if (!model->BSIM4v6oxideTrapDensityBGiven) + { if (model->BSIM4v6type == NMOS) + model->BSIM4v6oxideTrapDensityB = 3.125e26; + else + model->BSIM4v6oxideTrapDensityB = 1.5e25; + } + if (!model->BSIM4v6oxideTrapDensityCGiven) + model->BSIM4v6oxideTrapDensityC = 8.75e9; + if (!model->BSIM4v6emGiven) + model->BSIM4v6em = 4.1e7; /* V/m */ + if (!model->BSIM4v6efGiven) + model->BSIM4v6ef = 1.0; + if (!model->BSIM4v6afGiven) + model->BSIM4v6af = 1.0; + if (!model->BSIM4v6kfGiven) + model->BSIM4v6kf = 0.0; + + /* stress effect */ + if (!model->BSIM4v6sarefGiven) + model->BSIM4v6saref = 1e-6; /* m */ + if (!model->BSIM4v6sbrefGiven) + model->BSIM4v6sbref = 1e-6; /* m */ + if (!model->BSIM4v6wlodGiven) + model->BSIM4v6wlod = 0; /* m */ + if (!model->BSIM4v6ku0Given) + model->BSIM4v6ku0 = 0; /* 1/m */ + if (!model->BSIM4v6kvsatGiven) + model->BSIM4v6kvsat = 0; + if (!model->BSIM4v6kvth0Given) /* m */ + model->BSIM4v6kvth0 = 0; + if (!model->BSIM4v6tku0Given) + model->BSIM4v6tku0 = 0; + if (!model->BSIM4v6llodku0Given) + model->BSIM4v6llodku0 = 0; + if (!model->BSIM4v6wlodku0Given) + model->BSIM4v6wlodku0 = 0; + if (!model->BSIM4v6llodvthGiven) + model->BSIM4v6llodvth = 0; + if (!model->BSIM4v6wlodvthGiven) + model->BSIM4v6wlodvth = 0; + if (!model->BSIM4v6lku0Given) + model->BSIM4v6lku0 = 0; + if (!model->BSIM4v6wku0Given) + model->BSIM4v6wku0 = 0; + if (!model->BSIM4v6pku0Given) + model->BSIM4v6pku0 = 0; + if (!model->BSIM4v6lkvth0Given) + model->BSIM4v6lkvth0 = 0; + if (!model->BSIM4v6wkvth0Given) + model->BSIM4v6wkvth0 = 0; + if (!model->BSIM4v6pkvth0Given) + model->BSIM4v6pkvth0 = 0; + if (!model->BSIM4v6stk2Given) + model->BSIM4v6stk2 = 0; + if (!model->BSIM4v6lodk2Given) + model->BSIM4v6lodk2 = 1.0; + if (!model->BSIM4v6steta0Given) + model->BSIM4v6steta0 = 0; + if (!model->BSIM4v6lodeta0Given) + model->BSIM4v6lodeta0 = 1.0; + + /* Well Proximity Effect */ + if (!model->BSIM4v6webGiven) + model->BSIM4v6web = 0.0; + if (!model->BSIM4v6wecGiven) + model->BSIM4v6wec = 0.0; + if (!model->BSIM4v6kvth0weGiven) + model->BSIM4v6kvth0we = 0.0; + if (!model->BSIM4v6k2weGiven) + model->BSIM4v6k2we = 0.0; + if (!model->BSIM4v6ku0weGiven) + model->BSIM4v6ku0we = 0.0; + if (!model->BSIM4v6screfGiven) + model->BSIM4v6scref = 1.0E-6; /* m */ + if (!model->BSIM4v6wpemodGiven) + model->BSIM4v6wpemod = 0; + else if ((model->BSIM4v6wpemod != 0) && (model->BSIM4v6wpemod != 1)) + { model->BSIM4v6wpemod = 0; + printf("Warning: wpemod has been set to its default value: 0.\n"); + } + if (!model->BSIM4v6lkvth0weGiven) + model->BSIM4v6lkvth0we = 0; + if (!model->BSIM4v6lk2weGiven) + model->BSIM4v6lk2we = 0; + if (!model->BSIM4v6lku0weGiven) + model->BSIM4v6lku0we = 0; + if (!model->BSIM4v6wkvth0weGiven) + model->BSIM4v6wkvth0we = 0; + if (!model->BSIM4v6wk2weGiven) + model->BSIM4v6wk2we = 0; + if (!model->BSIM4v6wku0weGiven) + model->BSIM4v6wku0we = 0; + if (!model->BSIM4v6pkvth0weGiven) + model->BSIM4v6pkvth0we = 0; + if (!model->BSIM4v6pk2weGiven) + model->BSIM4v6pk2we = 0; + if (!model->BSIM4v6pku0weGiven) + model->BSIM4v6pku0we = 0; + + DMCGeff = model->BSIM4v6dmcg - model->BSIM4v6dmcgt; + DMCIeff = model->BSIM4v6dmci; + DMDGeff = model->BSIM4v6dmdg - model->BSIM4v6dmcgt; + + /* + * End processing models and begin to loop + * through all the instances of the model + */ + + for (here = model->BSIM4v6instances; here != NULL ; + here=here->BSIM4v6nextInstance) + { + if (here->BSIM4v6owner == ARCHme) { + /* allocate a chunk of the state vector */ + here->BSIM4v6states = *states; + *states += BSIM4v6numStates; + } + /* perform the parameter defaulting */ + if (!here->BSIM4v6lGiven) + here->BSIM4v6l = 5.0e-6; + if (!here->BSIM4v6wGiven) + here->BSIM4v6w = 5.0e-6; + if (!here->BSIM4v6mGiven) + here->BSIM4v6m = 1.0; + if (!here->BSIM4v6nfGiven) + here->BSIM4v6nf = 1.0; + if (!here->BSIM4v6minGiven) + here->BSIM4v6min = 0; /* integer */ + if (!here->BSIM4v6icVDSGiven) + here->BSIM4v6icVDS = 0.0; + if (!here->BSIM4v6icVGSGiven) + here->BSIM4v6icVGS = 0.0; + if (!here->BSIM4v6icVBSGiven) + here->BSIM4v6icVBS = 0.0; + if (!here->BSIM4v6drainAreaGiven) + here->BSIM4v6drainArea = 0.0; + if (!here->BSIM4v6drainPerimeterGiven) + here->BSIM4v6drainPerimeter = 0.0; + if (!here->BSIM4v6drainSquaresGiven) + here->BSIM4v6drainSquares = 1.0; + if (!here->BSIM4v6sourceAreaGiven) + here->BSIM4v6sourceArea = 0.0; + if (!here->BSIM4v6sourcePerimeterGiven) + here->BSIM4v6sourcePerimeter = 0.0; + if (!here->BSIM4v6sourceSquaresGiven) + here->BSIM4v6sourceSquares = 1.0; + + if (!here->BSIM4v6rbdbGiven) + here->BSIM4v6rbdb = model->BSIM4v6rbdb; /* in ohm */ + if (!here->BSIM4v6rbsbGiven) + here->BSIM4v6rbsb = model->BSIM4v6rbsb; + if (!here->BSIM4v6rbpbGiven) + here->BSIM4v6rbpb = model->BSIM4v6rbpb; + if (!here->BSIM4v6rbpsGiven) + here->BSIM4v6rbps = model->BSIM4v6rbps; + if (!here->BSIM4v6rbpdGiven) + here->BSIM4v6rbpd = model->BSIM4v6rbpd; + if (!here->BSIM4v6delvtoGiven) + here->BSIM4v6delvto = 0.0; + if (!here->BSIM4v6xgwGiven) + here->BSIM4v6xgw = model->BSIM4v6xgw; + if (!here->BSIM4v6ngconGiven) + here->BSIM4v6ngcon = model->BSIM4v6ngcon; + + + /* Process instance model selectors, some + * may override their global counterparts + */ + if (!here->BSIM4v6rbodyModGiven) + here->BSIM4v6rbodyMod = model->BSIM4v6rbodyMod; + else if ((here->BSIM4v6rbodyMod != 0) && (here->BSIM4v6rbodyMod != 1) && (here->BSIM4v6rbodyMod != 2)) + { here->BSIM4v6rbodyMod = model->BSIM4v6rbodyMod; + printf("Warning: rbodyMod has been set to its global value %d.\n", + model->BSIM4v6rbodyMod); + } + + if (!here->BSIM4v6rgateModGiven) + here->BSIM4v6rgateMod = model->BSIM4v6rgateMod; + else if ((here->BSIM4v6rgateMod != 0) && (here->BSIM4v6rgateMod != 1) + && (here->BSIM4v6rgateMod != 2) && (here->BSIM4v6rgateMod != 3)) + { here->BSIM4v6rgateMod = model->BSIM4v6rgateMod; + printf("Warning: rgateMod has been set to its global value %d.\n", + model->BSIM4v6rgateMod); + } + + if (!here->BSIM4v6geoModGiven) + here->BSIM4v6geoMod = model->BSIM4v6geoMod; + if (!here->BSIM4v6rgeoModGiven) + here->BSIM4v6rgeoMod = 0; + if (!here->BSIM4v6trnqsModGiven) + here->BSIM4v6trnqsMod = model->BSIM4v6trnqsMod; + else if ((here->BSIM4v6trnqsMod != 0) && (here->BSIM4v6trnqsMod != 1)) + { here->BSIM4v6trnqsMod = model->BSIM4v6trnqsMod; + printf("Warning: trnqsMod has been set to its global value %d.\n", + model->BSIM4v6trnqsMod); + } + + if (!here->BSIM4v6acnqsModGiven) + here->BSIM4v6acnqsMod = model->BSIM4v6acnqsMod; + else if ((here->BSIM4v6acnqsMod != 0) && (here->BSIM4v6acnqsMod != 1)) + { here->BSIM4v6acnqsMod = model->BSIM4v6acnqsMod; + printf("Warning: acnqsMod has been set to its global value %d.\n", + model->BSIM4v6acnqsMod); + } + + /* stress effect */ + if (!here->BSIM4v6saGiven) + here->BSIM4v6sa = 0.0; + if (!here->BSIM4v6sbGiven) + here->BSIM4v6sb = 0.0; + if (!here->BSIM4v6sdGiven) + here->BSIM4v6sd = 2 * model->BSIM4v6dmcg; + /* Well Proximity Effect */ + if (!here->BSIM4v6scaGiven) + here->BSIM4v6sca = 0.0; + if (!here->BSIM4v6scbGiven) + here->BSIM4v6scb = 0.0; + if (!here->BSIM4v6sccGiven) + here->BSIM4v6scc = 0.0; + if (!here->BSIM4v6scGiven) + here->BSIM4v6sc = 0.0; /* m */ + + /* process drain series resistance */ + createNode = 0; + if ( (model->BSIM4v6rdsMod != 0) + || (model->BSIM4v6tnoiMod != 0 && noiseAnalGiven)) + { + createNode = 1; + } else if (model->BSIM4v6sheetResistance > 0) + { + if (here->BSIM4v6drainSquaresGiven + && here->BSIM4v6drainSquares > 0) + { + createNode = 1; + } else if (!here->BSIM4v6drainSquaresGiven + && (here->BSIM4v6rgeoMod != 0)) + { + BSIM4v6RdseffGeo(here->BSIM4v6nf*here->BSIM4v6m, here->BSIM4v6geoMod, + here->BSIM4v6rgeoMod, here->BSIM4v6min, + here->BSIM4v6w, model->BSIM4v6sheetResistance, + DMCGeff, DMCIeff, DMDGeff, 0, &Rtot); + if(Rtot > 0) + createNode = 1; + } + } + if ( createNode != 0 && (here->BSIM4v6dNodePrime == 0)) + { error = CKTmkVolt(ckt,&tmp,here->BSIM4v6name,"drain"); + if(error) return(error); + here->BSIM4v6dNodePrime = tmp->number; + if (ckt->CKTcopyNodesets) { + 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->BSIM4v6dNodePrime = here->BSIM4v6dNode; + } + + /* process source series resistance */ + createNode = 0; + if ( (model->BSIM4v6rdsMod != 0) + || (model->BSIM4v6tnoiMod != 0 && noiseAnalGiven)) + { + createNode = 1; + } else if (model->BSIM4v6sheetResistance > 0) + { + if (here->BSIM4v6sourceSquaresGiven + && here->BSIM4v6sourceSquares > 0) + { + createNode = 1; + } else if (!here->BSIM4v6sourceSquaresGiven + && (here->BSIM4v6rgeoMod != 0)) + { + BSIM4v6RdseffGeo(here->BSIM4v6nf*here->BSIM4v6m, here->BSIM4v6geoMod, + here->BSIM4v6rgeoMod, here->BSIM4v6min, + here->BSIM4v6w, model->BSIM4v6sheetResistance, + DMCGeff, DMCIeff, DMDGeff, 1, &Rtot); + if(Rtot > 0) + createNode = 1; + } + } + if ( createNode != 0 && here->BSIM4v6sNodePrime == 0) + { error = CKTmkVolt(ckt,&tmp,here->BSIM4v6name,"source"); + if(error) return(error); + here->BSIM4v6sNodePrime = tmp->number; + 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->BSIM4v6sNodePrime = here->BSIM4v6sNode; + + if ((here->BSIM4v6rgateMod > 0) && (here->BSIM4v6gNodePrime == 0)) + { error = CKTmkVolt(ckt,&tmp,here->BSIM4v6name,"gate"); + if(error) return(error); + here->BSIM4v6gNodePrime = tmp->number; + 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; + } + } + } + } + else + here->BSIM4v6gNodePrime = here->BSIM4v6gNodeExt; + + if ((here->BSIM4v6rgateMod == 3) && (here->BSIM4v6gNodeMid == 0)) + { error = CKTmkVolt(ckt,&tmp,here->BSIM4v6name,"midgate"); + if(error) return(error); + here->BSIM4v6gNodeMid = tmp->number; + } + else + here->BSIM4v6gNodeMid = here->BSIM4v6gNodeExt; + + + /* internal body nodes for body resistance model */ + if ((here->BSIM4v6rbodyMod ==1) || (here->BSIM4v6rbodyMod ==2)) + { if (here->BSIM4v6dbNode == 0) + { error = CKTmkVolt(ckt,&tmp,here->BSIM4v6name,"dbody"); + if(error) return(error); + here->BSIM4v6dbNode = tmp->number; + } + if (here->BSIM4v6bNodePrime == 0) + { error = CKTmkVolt(ckt,&tmp,here->BSIM4v6name,"body"); + if(error) return(error); + here->BSIM4v6bNodePrime = 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->BSIM4v6sbNode == 0) + { error = CKTmkVolt(ckt,&tmp,here->BSIM4v6name,"sbody"); + if(error) return(error); + here->BSIM4v6sbNode = tmp->number; + } + } + else + here->BSIM4v6dbNode = here->BSIM4v6bNodePrime = here->BSIM4v6sbNode + = here->BSIM4v6bNode; + + /* NQS node */ + if ((here->BSIM4v6trnqsMod) && (here->BSIM4v6qNode == 0)) + { error = CKTmkVolt(ckt,&tmp,here->BSIM4v6name,"charge"); + if(error) return(error); + here->BSIM4v6qNode = tmp->number; + } + else + here->BSIM4v6qNode = 0; + +/* set Sparse Matrix Pointers + * macro to make elements with built-in out-of-memory test */ +#define TSTALLOC(ptr,first,second) \ +if((here->ptr = SMPmakeElt(matrix, here->first, here->second)) == NULL){\ + return(E_NOMEM);\ +} + + TSTALLOC(BSIM4v6DPbpPtr, BSIM4v6dNodePrime, BSIM4v6bNodePrime) + TSTALLOC(BSIM4v6GPbpPtr, BSIM4v6gNodePrime, BSIM4v6bNodePrime) + TSTALLOC(BSIM4v6SPbpPtr, BSIM4v6sNodePrime, BSIM4v6bNodePrime) + + TSTALLOC(BSIM4v6BPdpPtr, BSIM4v6bNodePrime, BSIM4v6dNodePrime) + TSTALLOC(BSIM4v6BPgpPtr, BSIM4v6bNodePrime, BSIM4v6gNodePrime) + TSTALLOC(BSIM4v6BPspPtr, BSIM4v6bNodePrime, BSIM4v6sNodePrime) + TSTALLOC(BSIM4v6BPbpPtr, BSIM4v6bNodePrime, BSIM4v6bNodePrime) + + TSTALLOC(BSIM4v6DdPtr, BSIM4v6dNode, BSIM4v6dNode) + TSTALLOC(BSIM4v6GPgpPtr, BSIM4v6gNodePrime, BSIM4v6gNodePrime) + TSTALLOC(BSIM4v6SsPtr, BSIM4v6sNode, BSIM4v6sNode) + TSTALLOC(BSIM4v6DPdpPtr, BSIM4v6dNodePrime, BSIM4v6dNodePrime) + TSTALLOC(BSIM4v6SPspPtr, BSIM4v6sNodePrime, BSIM4v6sNodePrime) + TSTALLOC(BSIM4v6DdpPtr, BSIM4v6dNode, BSIM4v6dNodePrime) + TSTALLOC(BSIM4v6GPdpPtr, BSIM4v6gNodePrime, BSIM4v6dNodePrime) + TSTALLOC(BSIM4v6GPspPtr, BSIM4v6gNodePrime, BSIM4v6sNodePrime) + TSTALLOC(BSIM4v6SspPtr, BSIM4v6sNode, BSIM4v6sNodePrime) + TSTALLOC(BSIM4v6DPspPtr, BSIM4v6dNodePrime, BSIM4v6sNodePrime) + TSTALLOC(BSIM4v6DPdPtr, BSIM4v6dNodePrime, BSIM4v6dNode) + TSTALLOC(BSIM4v6DPgpPtr, BSIM4v6dNodePrime, BSIM4v6gNodePrime) + TSTALLOC(BSIM4v6SPgpPtr, BSIM4v6sNodePrime, BSIM4v6gNodePrime) + TSTALLOC(BSIM4v6SPsPtr, BSIM4v6sNodePrime, BSIM4v6sNode) + TSTALLOC(BSIM4v6SPdpPtr, BSIM4v6sNodePrime, BSIM4v6dNodePrime) + + TSTALLOC(BSIM4v6QqPtr, BSIM4v6qNode, BSIM4v6qNode) + TSTALLOC(BSIM4v6QbpPtr, BSIM4v6qNode, BSIM4v6bNodePrime) + TSTALLOC(BSIM4v6QdpPtr, BSIM4v6qNode, BSIM4v6dNodePrime) + TSTALLOC(BSIM4v6QspPtr, BSIM4v6qNode, BSIM4v6sNodePrime) + TSTALLOC(BSIM4v6QgpPtr, BSIM4v6qNode, BSIM4v6gNodePrime) + TSTALLOC(BSIM4v6DPqPtr, BSIM4v6dNodePrime, BSIM4v6qNode) + TSTALLOC(BSIM4v6SPqPtr, BSIM4v6sNodePrime, BSIM4v6qNode) + TSTALLOC(BSIM4v6GPqPtr, BSIM4v6gNodePrime, BSIM4v6qNode) + + if (here->BSIM4v6rgateMod != 0) + { TSTALLOC(BSIM4v6GEgePtr, BSIM4v6gNodeExt, BSIM4v6gNodeExt) + TSTALLOC(BSIM4v6GEgpPtr, BSIM4v6gNodeExt, BSIM4v6gNodePrime) + TSTALLOC(BSIM4v6GPgePtr, BSIM4v6gNodePrime, BSIM4v6gNodeExt) + TSTALLOC(BSIM4v6GEdpPtr, BSIM4v6gNodeExt, BSIM4v6dNodePrime) + TSTALLOC(BSIM4v6GEspPtr, BSIM4v6gNodeExt, BSIM4v6sNodePrime) + TSTALLOC(BSIM4v6GEbpPtr, BSIM4v6gNodeExt, BSIM4v6bNodePrime) + + TSTALLOC(BSIM4v6GMdpPtr, BSIM4v6gNodeMid, BSIM4v6dNodePrime) + TSTALLOC(BSIM4v6GMgpPtr, BSIM4v6gNodeMid, BSIM4v6gNodePrime) + TSTALLOC(BSIM4v6GMgmPtr, BSIM4v6gNodeMid, BSIM4v6gNodeMid) + TSTALLOC(BSIM4v6GMgePtr, BSIM4v6gNodeMid, BSIM4v6gNodeExt) + TSTALLOC(BSIM4v6GMspPtr, BSIM4v6gNodeMid, BSIM4v6sNodePrime) + TSTALLOC(BSIM4v6GMbpPtr, BSIM4v6gNodeMid, BSIM4v6bNodePrime) + TSTALLOC(BSIM4v6DPgmPtr, BSIM4v6dNodePrime, BSIM4v6gNodeMid) + TSTALLOC(BSIM4v6GPgmPtr, BSIM4v6gNodePrime, BSIM4v6gNodeMid) + TSTALLOC(BSIM4v6GEgmPtr, BSIM4v6gNodeExt, BSIM4v6gNodeMid) + TSTALLOC(BSIM4v6SPgmPtr, BSIM4v6sNodePrime, BSIM4v6gNodeMid) + TSTALLOC(BSIM4v6BPgmPtr, BSIM4v6bNodePrime, BSIM4v6gNodeMid) + } + + if ((here->BSIM4v6rbodyMod ==1) || (here->BSIM4v6rbodyMod ==2)) + { TSTALLOC(BSIM4v6DPdbPtr, BSIM4v6dNodePrime, BSIM4v6dbNode) + TSTALLOC(BSIM4v6SPsbPtr, BSIM4v6sNodePrime, BSIM4v6sbNode) + + TSTALLOC(BSIM4v6DBdpPtr, BSIM4v6dbNode, BSIM4v6dNodePrime) + TSTALLOC(BSIM4v6DBdbPtr, BSIM4v6dbNode, BSIM4v6dbNode) + TSTALLOC(BSIM4v6DBbpPtr, BSIM4v6dbNode, BSIM4v6bNodePrime) + TSTALLOC(BSIM4v6DBbPtr, BSIM4v6dbNode, BSIM4v6bNode) + + TSTALLOC(BSIM4v6BPdbPtr, BSIM4v6bNodePrime, BSIM4v6dbNode) + TSTALLOC(BSIM4v6BPbPtr, BSIM4v6bNodePrime, BSIM4v6bNode) + TSTALLOC(BSIM4v6BPsbPtr, BSIM4v6bNodePrime, BSIM4v6sbNode) + + TSTALLOC(BSIM4v6SBspPtr, BSIM4v6sbNode, BSIM4v6sNodePrime) + TSTALLOC(BSIM4v6SBbpPtr, BSIM4v6sbNode, BSIM4v6bNodePrime) + TSTALLOC(BSIM4v6SBbPtr, BSIM4v6sbNode, BSIM4v6bNode) + TSTALLOC(BSIM4v6SBsbPtr, BSIM4v6sbNode, BSIM4v6sbNode) + + TSTALLOC(BSIM4v6BdbPtr, BSIM4v6bNode, BSIM4v6dbNode) + TSTALLOC(BSIM4v6BbpPtr, BSIM4v6bNode, BSIM4v6bNodePrime) + TSTALLOC(BSIM4v6BsbPtr, BSIM4v6bNode, BSIM4v6sbNode) + TSTALLOC(BSIM4v6BbPtr, BSIM4v6bNode, BSIM4v6bNode) + } + + if (model->BSIM4v6rdsMod) + { TSTALLOC(BSIM4v6DgpPtr, BSIM4v6dNode, BSIM4v6gNodePrime) + TSTALLOC(BSIM4v6DspPtr, BSIM4v6dNode, BSIM4v6sNodePrime) + TSTALLOC(BSIM4v6DbpPtr, BSIM4v6dNode, BSIM4v6bNodePrime) + TSTALLOC(BSIM4v6SdpPtr, BSIM4v6sNode, BSIM4v6dNodePrime) + TSTALLOC(BSIM4v6SgpPtr, BSIM4v6sNode, BSIM4v6gNodePrime) + TSTALLOC(BSIM4v6SbpPtr, BSIM4v6sNode, BSIM4v6bNodePrime) + } + } + } /* end of loop through all the BSIM4v6 device models */ + +#ifdef USE_OMP4 + if (!cp_getvar("num_threads", CP_NUM, &nthreads)) + nthreads = 2; + + omp_set_num_threads(nthreads); + if (nthreads == 1) + printf("OpenMP: %d thread is requested in BSIM4v6\n", nthreads); + else + printf("OpenMP: %d threads are requested in BSIM4v6\n", nthreads); + InstCount = 0; + model = (BSIM4v6model*)inModel; + /* loop through all the BSIM4v6 device models + to count the number of instances */ + + for( ; model != NULL; model = model->BSIM4v6nextModel ) + { + /* loop through all the instances of the model */ + for (here = model->BSIM4v6instances; here != NULL ; + here=here->BSIM4v6nextInstance) + { + InstCount++; + } + } + InstArray = TMALLOC(BSIM4v6instance*, InstCount); + model = (BSIM4v6model*)inModel; + idx = 0; + for( ; model != NULL; model = model->BSIM4v6nextModel ) + { + /* loop through all the instances of the model */ + for (here = model->BSIM4v6instances; here != NULL ; + here=here->BSIM4v6nextInstance) + { + InstArray[idx] = here; + idx++; + } + /* set the array pointer and instance count into each model */ + model->BSIM4v6InstCount = InstCount; + model->BSIM4v6InstanceArray = InstArray; + } +#endif + + return(OK); +} + +int +BSIM4v6unsetup(GENmodel *inModel, CKTcircuit *ckt) +{ +#ifndef HAS_BATCHSIM + BSIM4v6model *model; + BSIM4v6instance *here; + + for (model = (BSIM4v6model *)inModel; model != NULL; + model = model->BSIM4v6nextModel) + { + for (here = model->BSIM4v6instances; here != NULL; + here=here->BSIM4v6nextInstance) + { + if (here->BSIM4v6dNodePrime + && here->BSIM4v6dNodePrime != here->BSIM4v6dNode) + { + CKTdltNNum(ckt, here->BSIM4v6dNodePrime); + here->BSIM4v6dNodePrime = 0; + } + if (here->BSIM4v6sNodePrime + && here->BSIM4v6sNodePrime != here->BSIM4v6sNode) + { + CKTdltNNum(ckt, here->BSIM4v6sNodePrime); + here->BSIM4v6sNodePrime = 0; + } + } + } +#endif + return OK; +} diff --git a/src/spicelib/devices/bsim4v6/b4v6temp.c b/src/spicelib/devices/bsim4v6/b4v6temp.c new file mode 100644 index 000000000..7232e708b --- /dev/null +++ b/src/spicelib/devices/bsim4v6/b4v6temp.c @@ -0,0 +1,2200 @@ +/**** BSIM4.6.2 Released by Wenwei Yang 07/31/2008 ****/ +/**** BSIM4.6.5 Update ngspice 09/22/2009 ****/ +/********** + * Copyright 2006 Regents of the University of California. All rights reserved. + * File: b4temp.c of BSIM4.6.3. + * Author: 2000 Weidong Liu + * Authors: 2001- Xuemei Xi, Mohan Dunga, Ali Niknejad, Chenming Hu. + * Authors: 2006- Mohan Dunga, Ali Niknejad, Chenming Hu + * Authors: 2007- Mohan Dunga, Wenwei Yang, Ali Niknejad, Chenming Hu + * Authors: 2008- Wenwei Yang, 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. + * Modified by Mohan Dunga, 12/13/2006. + * Modified by Mohan Dunga, Wenwei Yang, 05/18/2007. + * Modified by Wenwei Yang, 07/31/2008. + **********/ + + +#include "ngspice.h" +#include "smpdefs.h" +#include "cktdefs.h" +#include "bsim4v6def.h" +#include "const.h" +#include "sperror.h" +#include "suffix.h" + +#define Kb 1.3806226e-23 +#define KboQ 8.617087e-5 +#define EPS0 8.85418e-12 +#define EPSSI 1.03594e-10 +#define PI 3.141592654 +#define MAX_EXP 5.834617425e14 +#define MIN_EXP 1.713908431e-15 +#define EXP_THRESHOLD 34.0 +#define Charge_q 1.60219e-19 +#define DELTA 1.0E-9 +#define DEXP(A,B) { \ + if (A > EXP_THRESHOLD) { \ + B = MAX_EXP*(1.0+(A)-EXP_THRESHOLD); \ + } else if (A < -EXP_THRESHOLD) { \ + B = MIN_EXP; \ + } else { \ + B = exp(A); \ + } \ + } + + +static int +BSIM4v6DioIjthVjmEval(double Nvtm, double Ijth, double Isb, double XExpBV, double *Vjm) +{ +double Tb, Tc, EVjmovNv; + + Tc = XExpBV; + Tb = 1.0 + Ijth / Isb - Tc; + EVjmovNv = 0.5 * (Tb + sqrt(Tb * Tb + 4.0 * Tc)); + *Vjm = Nvtm * log(EVjmovNv); + +return 0; +} + + +int +BSIM4v6temp( +GENmodel *inModel, +CKTcircuit *ckt) +{ +BSIM4v6model *model = (BSIM4v6model*) inModel; +BSIM4v6instance *here; +struct bsim4v6SizeDependParam *pSizeDependParamKnot, *pLastKnot, *pParam=NULL; +double tmp, tmp1, tmp2, tmp3, Eg, Eg0, ni, epssub; +double T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, Lnew=0.0, Wnew; +double delTemp, Temp, TRatio, Inv_L, Inv_W, Inv_LW, Vtm0, Tnom; +double dumPs, dumPd, dumAs, dumAd, PowWeffWr; +double DMCGeff, DMCIeff, DMDGeff; +double Nvtms, Nvtmd, SourceSatCurrent, DrainSatCurrent; +double T10, T11; +double Inv_saref, Inv_sbref, Inv_sa, Inv_sb, rho, Ldrn, dvth0_lod; +double W_tmp, Inv_ODeff, OD_offset, dk2_lod, deta0_lod; +double lnl, lnw, lnnf, rbpbx, rbpby, rbsbx, rbsby, rbdbx, rbdby,bodymode; +double kvsat, wlod, sceff, Wdrn; +double V0, lt1, ltw, Theta0, Delt_vth, Vth_NarrowW, Lpe_Vb, Vth; +double n, n0, Vgsteff, Vgs_eff, niter, toxpf, toxpi, Tcen, toxe, epsrox, vddeot; +double vtfbphi2eot, phieot, TempRatioeot, Vtm0eot, Vtmeot,vbieot; + +int Size_Not_Found, i; + + /* loop through all the BSIM4v6 device models */ + for (; model != NULL; model = model->BSIM4v6nextModel) + { Temp = ckt->CKTtemp; + if (model->BSIM4v6SbulkJctPotential < 0.1) + { model->BSIM4v6SbulkJctPotential = 0.1; + fprintf(stderr, "Given pbs is less than 0.1. Pbs is set to 0.1.\n"); + } + if (model->BSIM4v6SsidewallJctPotential < 0.1) + { model->BSIM4v6SsidewallJctPotential = 0.1; + fprintf(stderr, "Given pbsws is less than 0.1. Pbsws is set to 0.1.\n"); + } + if (model->BSIM4v6SGatesidewallJctPotential < 0.1) + { model->BSIM4v6SGatesidewallJctPotential = 0.1; + fprintf(stderr, "Given pbswgs is less than 0.1. Pbswgs is set to 0.1.\n"); + } + + if (model->BSIM4v6DbulkJctPotential < 0.1) + { model->BSIM4v6DbulkJctPotential = 0.1; + fprintf(stderr, "Given pbd is less than 0.1. Pbd is set to 0.1.\n"); + } + if (model->BSIM4v6DsidewallJctPotential < 0.1) + { model->BSIM4v6DsidewallJctPotential = 0.1; + fprintf(stderr, "Given pbswd is less than 0.1. Pbswd is set to 0.1.\n"); + } + if (model->BSIM4v6DGatesidewallJctPotential < 0.1) + { model->BSIM4v6DGatesidewallJctPotential = 0.1; + fprintf(stderr, "Given pbswgd is less than 0.1. Pbswgd is set to 0.1.\n"); + } + + if(model->BSIM4v6mtrlMod == 0) + { + if ((model->BSIM4v6toxeGiven) && (model->BSIM4v6toxpGiven) && (model->BSIM4v6dtoxGiven) + && (model->BSIM4v6toxe != (model->BSIM4v6toxp + model->BSIM4v6dtox))) + printf("Warning: toxe, toxp and dtox all given and toxe != toxp + dtox; dtox ignored.\n"); + else if ((model->BSIM4v6toxeGiven) && (!model->BSIM4v6toxpGiven)) + model->BSIM4v6toxp = model->BSIM4v6toxe - model->BSIM4v6dtox; + else if ((!model->BSIM4v6toxeGiven) && (model->BSIM4v6toxpGiven)) + model->BSIM4v6toxe = model->BSIM4v6toxp + model->BSIM4v6dtox; + } + + if(model->BSIM4v6mtrlMod) + { + epsrox = 3.9; + toxe = model->BSIM4v6eot; + epssub = EPS0 * model->BSIM4v6epsrsub; + } + else + { + epsrox = model->BSIM4v6epsrox; + toxe = model->BSIM4v6toxe; + epssub = EPSSI; + } + + + model->BSIM4v6coxe = epsrox * EPS0 / toxe; + if(model->BSIM4v6mtrlMod == 0) + model->BSIM4v6coxp = model->BSIM4v6epsrox * EPS0 / model->BSIM4v6toxp; + + if (!model->BSIM4v6cgdoGiven) + { if (model->BSIM4v6dlcGiven && (model->BSIM4v6dlc > 0.0)) + model->BSIM4v6cgdo = model->BSIM4v6dlc * model->BSIM4v6coxe + - model->BSIM4v6cgdl ; + else + model->BSIM4v6cgdo = 0.6 * model->BSIM4v6xj * model->BSIM4v6coxe; + } + if (!model->BSIM4v6cgsoGiven) + { if (model->BSIM4v6dlcGiven && (model->BSIM4v6dlc > 0.0)) + model->BSIM4v6cgso = model->BSIM4v6dlc * model->BSIM4v6coxe + - model->BSIM4v6cgsl ; + else + model->BSIM4v6cgso = 0.6 * model->BSIM4v6xj * model->BSIM4v6coxe; + } + if (!model->BSIM4v6cgboGiven) + model->BSIM4v6cgbo = 2.0 * model->BSIM4v6dwc * model->BSIM4v6coxe; + model->pSizeDependParamKnot = NULL; + pLastKnot = NULL; + + Tnom = model->BSIM4v6tnom; + TRatio = Temp / Tnom; + + model->BSIM4v6vcrit = CONSTvt0 * log(CONSTvt0 / (CONSTroot2 * 1.0e-14)); + model->BSIM4v6factor1 = sqrt(epssub / (epsrox * EPS0)* toxe); + + Vtm0 = model->BSIM4v6vtm0 = KboQ * Tnom; + + if(model->BSIM4v6mtrlMod==0) + { + Eg0 = 1.16 - 7.02e-4 * Tnom * Tnom / (Tnom + 1108.0); + ni = 1.45e10 * (Tnom / 300.15) * sqrt(Tnom / 300.15) + * exp(21.5565981 - Eg0 / (2.0 * Vtm0)); + } + else + { + Eg0 = model->BSIM4v6bg0sub - model->BSIM4v6tbgasub * Tnom * Tnom + / (Tnom + model->BSIM4v6tbgbsub); + T0 = model->BSIM4v6bg0sub - model->BSIM4v6tbgasub * 90090.0225 + / (300.15 + model->BSIM4v6tbgbsub); + ni = model->BSIM4v6ni0sub * (Tnom / 300.15) * sqrt(Tnom / 300.15) + * exp((T0 - Eg0) / (2.0 * Vtm0)); + } + + model->BSIM4v6Eg0 = Eg0; + model->BSIM4v6vtm = KboQ * Temp; + if(model->BSIM4v6mtrlMod == 0) + Eg = 1.16 - 7.02e-4 * Temp * Temp / (Temp + 1108.0); + else + Eg = model->BSIM4v6bg0sub - model->BSIM4v6tbgasub * Temp * Temp + / (Temp + model->BSIM4v6tbgbsub); + if (Temp != Tnom) + { T0 = Eg0 / Vtm0 - Eg / model->BSIM4v6vtm; + T1 = log(Temp / Tnom); + T2 = T0 + model->BSIM4v6SjctTempExponent * T1; + T3 = exp(T2 / model->BSIM4v6SjctEmissionCoeff); + model->BSIM4v6SjctTempSatCurDensity = model->BSIM4v6SjctSatCurDensity + * T3; + model->BSIM4v6SjctSidewallTempSatCurDensity + = model->BSIM4v6SjctSidewallSatCurDensity * T3; + model->BSIM4v6SjctGateSidewallTempSatCurDensity + = model->BSIM4v6SjctGateSidewallSatCurDensity * T3; + + T2 = T0 + model->BSIM4v6DjctTempExponent * T1; + T3 = exp(T2 / model->BSIM4v6DjctEmissionCoeff); + model->BSIM4v6DjctTempSatCurDensity = model->BSIM4v6DjctSatCurDensity + * T3; + model->BSIM4v6DjctSidewallTempSatCurDensity + = model->BSIM4v6DjctSidewallSatCurDensity * T3; + model->BSIM4v6DjctGateSidewallTempSatCurDensity + = model->BSIM4v6DjctGateSidewallSatCurDensity * T3; + } + else + { model->BSIM4v6SjctTempSatCurDensity = model->BSIM4v6SjctSatCurDensity; + model->BSIM4v6SjctSidewallTempSatCurDensity + = model->BSIM4v6SjctSidewallSatCurDensity; + model->BSIM4v6SjctGateSidewallTempSatCurDensity + = model->BSIM4v6SjctGateSidewallSatCurDensity; + model->BSIM4v6DjctTempSatCurDensity = model->BSIM4v6DjctSatCurDensity; + model->BSIM4v6DjctSidewallTempSatCurDensity + = model->BSIM4v6DjctSidewallSatCurDensity; + model->BSIM4v6DjctGateSidewallTempSatCurDensity + = model->BSIM4v6DjctGateSidewallSatCurDensity; + } + + if (model->BSIM4v6SjctTempSatCurDensity < 0.0) + model->BSIM4v6SjctTempSatCurDensity = 0.0; + if (model->BSIM4v6SjctSidewallTempSatCurDensity < 0.0) + model->BSIM4v6SjctSidewallTempSatCurDensity = 0.0; + if (model->BSIM4v6SjctGateSidewallTempSatCurDensity < 0.0) + model->BSIM4v6SjctGateSidewallTempSatCurDensity = 0.0; + if (model->BSIM4v6DjctTempSatCurDensity < 0.0) + model->BSIM4v6DjctTempSatCurDensity = 0.0; + if (model->BSIM4v6DjctSidewallTempSatCurDensity < 0.0) + model->BSIM4v6DjctSidewallTempSatCurDensity = 0.0; + if (model->BSIM4v6DjctGateSidewallTempSatCurDensity < 0.0) + model->BSIM4v6DjctGateSidewallTempSatCurDensity = 0.0; + + /* Temperature dependence of D/B and S/B diode capacitance begins */ + delTemp = ckt->CKTtemp - model->BSIM4v6tnom; + T0 = model->BSIM4v6tcj * delTemp; + if (T0 >= -1.0) + { model->BSIM4v6SunitAreaTempJctCap = model->BSIM4v6SunitAreaJctCap *(1.0 + T0); /*bug_fix -JX */ + model->BSIM4v6DunitAreaTempJctCap = model->BSIM4v6DunitAreaJctCap *(1.0 + T0); + } + else + { if (model->BSIM4v6SunitAreaJctCap > 0.0) + { model->BSIM4v6SunitAreaTempJctCap = 0.0; + fprintf(stderr, "Temperature effect has caused cjs to be negative. Cjs is clamped to zero.\n"); + } + if (model->BSIM4v6DunitAreaJctCap > 0.0) + { model->BSIM4v6DunitAreaTempJctCap = 0.0; + fprintf(stderr, "Temperature effect has caused cjd to be negative. Cjd is clamped to zero.\n"); + } + } + T0 = model->BSIM4v6tcjsw * delTemp; + if (model->BSIM4v6SunitLengthSidewallJctCap < 0.0)/*4.6.2*/ + {model->BSIM4v6SunitLengthSidewallJctCap = 0.0; + fprintf(stderr, "CJSWS is negative. Cjsws is clamped to zero.\n");} + if (model->BSIM4v6DunitLengthSidewallJctCap < 0.0) + {model->BSIM4v6DunitLengthSidewallJctCap = 0.0; + fprintf(stderr, "CJSWD is negative. Cjswd is clamped to zero.\n");} + if (T0 >= -1.0) + { model->BSIM4v6SunitLengthSidewallTempJctCap = model->BSIM4v6SunitLengthSidewallJctCap *(1.0 + T0); + model->BSIM4v6DunitLengthSidewallTempJctCap = model->BSIM4v6DunitLengthSidewallJctCap *(1.0 + T0); + } + else + { if (model->BSIM4v6SunitLengthSidewallJctCap > 0.0) + { model->BSIM4v6SunitLengthSidewallTempJctCap = 0.0; + fprintf(stderr, "Temperature effect has caused cjsws to be negative. Cjsws is clamped to zero.\n"); + } + if (model->BSIM4v6DunitLengthSidewallJctCap > 0.0) + { model->BSIM4v6DunitLengthSidewallTempJctCap = 0.0; + fprintf(stderr, "Temperature effect has caused cjswd to be negative. Cjswd is clamped to zero.\n"); + } + } + T0 = model->BSIM4v6tcjswg * delTemp; + if (T0 >= -1.0) + { model->BSIM4v6SunitLengthGateSidewallTempJctCap = model->BSIM4v6SunitLengthGateSidewallJctCap *(1.0 + T0); + model->BSIM4v6DunitLengthGateSidewallTempJctCap = model->BSIM4v6DunitLengthGateSidewallJctCap *(1.0 + T0); + } + else + { if (model->BSIM4v6SunitLengthGateSidewallJctCap > 0.0) + { model->BSIM4v6SunitLengthGateSidewallTempJctCap = 0.0; + fprintf(stderr, "Temperature effect has caused cjswgs to be negative. Cjswgs is clamped to zero.\n"); + } + if (model->BSIM4v6DunitLengthGateSidewallJctCap > 0.0) + { model->BSIM4v6DunitLengthGateSidewallTempJctCap = 0.0; + fprintf(stderr, "Temperature effect has caused cjswgd to be negative. Cjswgd is clamped to zero.\n"); + } + } + + model->BSIM4v6PhiBS = model->BSIM4v6SbulkJctPotential + - model->BSIM4v6tpb * delTemp; + if (model->BSIM4v6PhiBS < 0.01) + { model->BSIM4v6PhiBS = 0.01; + fprintf(stderr, "Temperature effect has caused pbs to be less than 0.01. Pbs is clamped to 0.01.\n"); + } + model->BSIM4v6PhiBD = model->BSIM4v6DbulkJctPotential + - model->BSIM4v6tpb * delTemp; + if (model->BSIM4v6PhiBD < 0.01) + { model->BSIM4v6PhiBD = 0.01; + fprintf(stderr, "Temperature effect has caused pbd to be less than 0.01. Pbd is clamped to 0.01.\n"); + } + + model->BSIM4v6PhiBSWS = model->BSIM4v6SsidewallJctPotential + - model->BSIM4v6tpbsw * delTemp; + if (model->BSIM4v6PhiBSWS <= 0.01) + { model->BSIM4v6PhiBSWS = 0.01; + fprintf(stderr, "Temperature effect has caused pbsws to be less than 0.01. Pbsws is clamped to 0.01.\n"); + } + model->BSIM4v6PhiBSWD = model->BSIM4v6DsidewallJctPotential + - model->BSIM4v6tpbsw * delTemp; + if (model->BSIM4v6PhiBSWD <= 0.01) + { model->BSIM4v6PhiBSWD = 0.01; + fprintf(stderr, "Temperature effect has caused pbswd to be less than 0.01. Pbswd is clamped to 0.01.\n"); + } + + model->BSIM4v6PhiBSWGS = model->BSIM4v6SGatesidewallJctPotential + - model->BSIM4v6tpbswg * delTemp; + if (model->BSIM4v6PhiBSWGS <= 0.01) + { model->BSIM4v6PhiBSWGS = 0.01; + fprintf(stderr, "Temperature effect has caused pbswgs to be less than 0.01. Pbswgs is clamped to 0.01.\n"); + } + model->BSIM4v6PhiBSWGD = model->BSIM4v6DGatesidewallJctPotential + - model->BSIM4v6tpbswg * delTemp; + if (model->BSIM4v6PhiBSWGD <= 0.01) + { model->BSIM4v6PhiBSWGD = 0.01; + fprintf(stderr, "Temperature effect has caused pbswgd to be less than 0.01. Pbswgd is clamped to 0.01.\n"); + } /* End of junction capacitance */ + + + if (model->BSIM4v6ijthdfwd <= 0.0) + { model->BSIM4v6ijthdfwd = 0.0; + fprintf(stderr, "Ijthdfwd reset to %g.\n", model->BSIM4v6ijthdfwd); + } + if (model->BSIM4v6ijthsfwd <= 0.0) + { model->BSIM4v6ijthsfwd = 0.0; + fprintf(stderr, "Ijthsfwd reset to %g.\n", model->BSIM4v6ijthsfwd); + } + if (model->BSIM4v6ijthdrev <= 0.0) + { model->BSIM4v6ijthdrev = 0.0; + fprintf(stderr, "Ijthdrev reset to %g.\n", model->BSIM4v6ijthdrev); + } + if (model->BSIM4v6ijthsrev <= 0.0) + { model->BSIM4v6ijthsrev = 0.0; + fprintf(stderr, "Ijthsrev reset to %g.\n", model->BSIM4v6ijthsrev); + } + + if ((model->BSIM4v6xjbvd <= 0.0) && (model->BSIM4v6dioMod == 2)) + { model->BSIM4v6xjbvd = 0.0; + fprintf(stderr, "Xjbvd reset to %g.\n", model->BSIM4v6xjbvd); + } + else if ((model->BSIM4v6xjbvd < 0.0) && (model->BSIM4v6dioMod == 0)) + { model->BSIM4v6xjbvd = 0.0; + fprintf(stderr, "Xjbvd reset to %g.\n", model->BSIM4v6xjbvd); + } + + if (model->BSIM4v6bvd <= 0.0) /*4.6.2*/ + { model->BSIM4v6bvd = 0.0; + fprintf(stderr, "BVD reset to %g.\n", model->BSIM4v6bvd); + } + + if ((model->BSIM4v6xjbvs <= 0.0) && (model->BSIM4v6dioMod == 2)) + { model->BSIM4v6xjbvs = 0.0; + fprintf(stderr, "Xjbvs reset to %g.\n", model->BSIM4v6xjbvs); + } + else if ((model->BSIM4v6xjbvs < 0.0) && (model->BSIM4v6dioMod == 0)) + { model->BSIM4v6xjbvs = 0.0; + fprintf(stderr, "Xjbvs reset to %g.\n", model->BSIM4v6xjbvs); + } + + if (model->BSIM4v6bvs <= 0.0) + { model->BSIM4v6bvs = 0.0; + fprintf(stderr, "BVS reset to %g.\n", model->BSIM4v6bvs); + } + + + /* loop through all the instances of the model */ + for (here = model->BSIM4v6instances; here != NULL; + here = here->BSIM4v6nextInstance) + { if (here->BSIM4v6owner != ARCHme) continue; + pSizeDependParamKnot = model->pSizeDependParamKnot; + Size_Not_Found = 1; + while ((pSizeDependParamKnot != NULL) && Size_Not_Found) + { if ((here->BSIM4v6l == pSizeDependParamKnot->Length) + && (here->BSIM4v6w == pSizeDependParamKnot->Width) + && (here->BSIM4v6nf == pSizeDependParamKnot->NFinger)) + { Size_Not_Found = 0; + here->pParam = pSizeDependParamKnot; + pParam = here->pParam; /*bug-fix */ + } + else + { pLastKnot = pSizeDependParamKnot; + pSizeDependParamKnot = pSizeDependParamKnot->pNext; + } + } + + /* stress effect */ + Ldrn = here->BSIM4v6l; + Wdrn = here->BSIM4v6w / here->BSIM4v6nf; + + if (Size_Not_Found) + { pParam = TMALLOC(struct bsim4v6SizeDependParam, 1); + if (pLastKnot == NULL) + model->pSizeDependParamKnot = pParam; + else + pLastKnot->pNext = pParam; + pParam->pNext = NULL; + here->pParam = pParam; + + pParam->Length = here->BSIM4v6l; + pParam->Width = here->BSIM4v6w; + pParam->NFinger = here->BSIM4v6nf; + Lnew = here->BSIM4v6l + model->BSIM4v6xl ; + Wnew = here->BSIM4v6w / here->BSIM4v6nf + model->BSIM4v6xw; + + T0 = pow(Lnew, model->BSIM4v6Lln); + T1 = pow(Wnew, model->BSIM4v6Lwn); + tmp1 = model->BSIM4v6Ll / T0 + model->BSIM4v6Lw / T1 + + model->BSIM4v6Lwl / (T0 * T1); + pParam->BSIM4v6dl = model->BSIM4v6Lint + tmp1; + tmp2 = model->BSIM4v6Llc / T0 + model->BSIM4v6Lwc / T1 + + model->BSIM4v6Lwlc / (T0 * T1); + pParam->BSIM4v6dlc = model->BSIM4v6dlc + tmp2; + + T2 = pow(Lnew, model->BSIM4v6Wln); + T3 = pow(Wnew, model->BSIM4v6Wwn); + tmp1 = model->BSIM4v6Wl / T2 + model->BSIM4v6Ww / T3 + + model->BSIM4v6Wwl / (T2 * T3); + pParam->BSIM4v6dw = model->BSIM4v6Wint + tmp1; + tmp2 = model->BSIM4v6Wlc / T2 + model->BSIM4v6Wwc / T3 + + model->BSIM4v6Wwlc / (T2 * T3); + pParam->BSIM4v6dwc = model->BSIM4v6dwc + tmp2; + pParam->BSIM4v6dwj = model->BSIM4v6dwj + tmp2; + + pParam->BSIM4v6leff = Lnew - 2.0 * pParam->BSIM4v6dl; + if (pParam->BSIM4v6leff <= 0.0) + { IFuid namarray[2]; + namarray[0] = model->BSIM4v6modName; + namarray[1] = here->BSIM4v6name; + SPfrontEnd->IFerror (ERR_FATAL, + "BSIM4v6: mosfet %s, model %s: Effective channel length <= 0", + namarray); + return(E_BADPARM); + } + + pParam->BSIM4v6weff = Wnew - 2.0 * pParam->BSIM4v6dw; + if (pParam->BSIM4v6weff <= 0.0) + { IFuid namarray[2]; + namarray[0] = model->BSIM4v6modName; + namarray[1] = here->BSIM4v6name; + SPfrontEnd->IFerror (ERR_FATAL, + "BSIM4v6: mosfet %s, model %s: Effective channel width <= 0", + namarray); + return(E_BADPARM); + } + + pParam->BSIM4v6leffCV = Lnew - 2.0 * pParam->BSIM4v6dlc; + if (pParam->BSIM4v6leffCV <= 0.0) + { IFuid namarray[2]; + namarray[0] = model->BSIM4v6modName; + namarray[1] = here->BSIM4v6name; + SPfrontEnd->IFerror (ERR_FATAL, + "BSIM4v6: mosfet %s, model %s: Effective channel length for C-V <= 0", + namarray); + return(E_BADPARM); + } + + pParam->BSIM4v6weffCV = Wnew - 2.0 * pParam->BSIM4v6dwc; + if (pParam->BSIM4v6weffCV <= 0.0) + { IFuid namarray[2]; + namarray[0] = model->BSIM4v6modName; + namarray[1] = here->BSIM4v6name; + SPfrontEnd->IFerror (ERR_FATAL, + "BSIM4v6: mosfet %s, model %s: Effective channel width for C-V <= 0", + namarray); + return(E_BADPARM); + } + + pParam->BSIM4v6weffCJ = Wnew - 2.0 * pParam->BSIM4v6dwj; + if (pParam->BSIM4v6weffCJ <= 0.0) + { IFuid namarray[2]; + namarray[0] = model->BSIM4v6modName; + namarray[1] = here->BSIM4v6name; + SPfrontEnd->IFerror (ERR_FATAL, + "BSIM4v6: mosfet %s, model %s: Effective channel width for S/D junctions <= 0", + namarray); + return(E_BADPARM); + } + + + if (model->BSIM4v6binUnit == 1) + { Inv_L = 1.0e-6 / pParam->BSIM4v6leff; + Inv_W = 1.0e-6 / pParam->BSIM4v6weff; + Inv_LW = 1.0e-12 / (pParam->BSIM4v6leff + * pParam->BSIM4v6weff); + } + else + { Inv_L = 1.0 / pParam->BSIM4v6leff; + Inv_W = 1.0 / pParam->BSIM4v6weff; + Inv_LW = 1.0 / (pParam->BSIM4v6leff + * pParam->BSIM4v6weff); + } + pParam->BSIM4v6cdsc = model->BSIM4v6cdsc + + model->BSIM4v6lcdsc * Inv_L + + model->BSIM4v6wcdsc * Inv_W + + model->BSIM4v6pcdsc * Inv_LW; + pParam->BSIM4v6cdscb = model->BSIM4v6cdscb + + model->BSIM4v6lcdscb * Inv_L + + model->BSIM4v6wcdscb * Inv_W + + model->BSIM4v6pcdscb * Inv_LW; + + pParam->BSIM4v6cdscd = model->BSIM4v6cdscd + + model->BSIM4v6lcdscd * Inv_L + + model->BSIM4v6wcdscd * Inv_W + + model->BSIM4v6pcdscd * Inv_LW; + + pParam->BSIM4v6cit = model->BSIM4v6cit + + model->BSIM4v6lcit * Inv_L + + model->BSIM4v6wcit * Inv_W + + model->BSIM4v6pcit * Inv_LW; + pParam->BSIM4v6nfactor = model->BSIM4v6nfactor + + model->BSIM4v6lnfactor * Inv_L + + model->BSIM4v6wnfactor * Inv_W + + model->BSIM4v6pnfactor * Inv_LW; + pParam->BSIM4v6xj = model->BSIM4v6xj + + model->BSIM4v6lxj * Inv_L + + model->BSIM4v6wxj * Inv_W + + model->BSIM4v6pxj * Inv_LW; + pParam->BSIM4v6vsat = model->BSIM4v6vsat + + model->BSIM4v6lvsat * Inv_L + + model->BSIM4v6wvsat * Inv_W + + model->BSIM4v6pvsat * Inv_LW; + pParam->BSIM4v6at = model->BSIM4v6at + + model->BSIM4v6lat * Inv_L + + model->BSIM4v6wat * Inv_W + + model->BSIM4v6pat * Inv_LW; + pParam->BSIM4v6a0 = model->BSIM4v6a0 + + model->BSIM4v6la0 * Inv_L + + model->BSIM4v6wa0 * Inv_W + + model->BSIM4v6pa0 * Inv_LW; + + pParam->BSIM4v6ags = model->BSIM4v6ags + + model->BSIM4v6lags * Inv_L + + model->BSIM4v6wags * Inv_W + + model->BSIM4v6pags * Inv_LW; + + pParam->BSIM4v6a1 = model->BSIM4v6a1 + + model->BSIM4v6la1 * Inv_L + + model->BSIM4v6wa1 * Inv_W + + model->BSIM4v6pa1 * Inv_LW; + pParam->BSIM4v6a2 = model->BSIM4v6a2 + + model->BSIM4v6la2 * Inv_L + + model->BSIM4v6wa2 * Inv_W + + model->BSIM4v6pa2 * Inv_LW; + pParam->BSIM4v6keta = model->BSIM4v6keta + + model->BSIM4v6lketa * Inv_L + + model->BSIM4v6wketa * Inv_W + + model->BSIM4v6pketa * Inv_LW; + pParam->BSIM4v6nsub = model->BSIM4v6nsub + + model->BSIM4v6lnsub * Inv_L + + model->BSIM4v6wnsub * Inv_W + + model->BSIM4v6pnsub * Inv_LW; + pParam->BSIM4v6ndep = model->BSIM4v6ndep + + model->BSIM4v6lndep * Inv_L + + model->BSIM4v6wndep * Inv_W + + model->BSIM4v6pndep * Inv_LW; + pParam->BSIM4v6nsd = model->BSIM4v6nsd + + model->BSIM4v6lnsd * Inv_L + + model->BSIM4v6wnsd * Inv_W + + model->BSIM4v6pnsd * Inv_LW; + pParam->BSIM4v6phin = model->BSIM4v6phin + + model->BSIM4v6lphin * Inv_L + + model->BSIM4v6wphin * Inv_W + + model->BSIM4v6pphin * Inv_LW; + pParam->BSIM4v6ngate = model->BSIM4v6ngate + + model->BSIM4v6lngate * Inv_L + + model->BSIM4v6wngate * Inv_W + + model->BSIM4v6pngate * Inv_LW; + pParam->BSIM4v6gamma1 = model->BSIM4v6gamma1 + + model->BSIM4v6lgamma1 * Inv_L + + model->BSIM4v6wgamma1 * Inv_W + + model->BSIM4v6pgamma1 * Inv_LW; + pParam->BSIM4v6gamma2 = model->BSIM4v6gamma2 + + model->BSIM4v6lgamma2 * Inv_L + + model->BSIM4v6wgamma2 * Inv_W + + model->BSIM4v6pgamma2 * Inv_LW; + pParam->BSIM4v6vbx = model->BSIM4v6vbx + + model->BSIM4v6lvbx * Inv_L + + model->BSIM4v6wvbx * Inv_W + + model->BSIM4v6pvbx * Inv_LW; + pParam->BSIM4v6vbm = model->BSIM4v6vbm + + model->BSIM4v6lvbm * Inv_L + + model->BSIM4v6wvbm * Inv_W + + model->BSIM4v6pvbm * Inv_LW; + pParam->BSIM4v6xt = model->BSIM4v6xt + + model->BSIM4v6lxt * Inv_L + + model->BSIM4v6wxt * Inv_W + + model->BSIM4v6pxt * Inv_LW; + pParam->BSIM4v6vfb = model->BSIM4v6vfb + + model->BSIM4v6lvfb * Inv_L + + model->BSIM4v6wvfb * Inv_W + + model->BSIM4v6pvfb * Inv_LW; + pParam->BSIM4v6k1 = model->BSIM4v6k1 + + model->BSIM4v6lk1 * Inv_L + + model->BSIM4v6wk1 * Inv_W + + model->BSIM4v6pk1 * Inv_LW; + pParam->BSIM4v6kt1 = model->BSIM4v6kt1 + + model->BSIM4v6lkt1 * Inv_L + + model->BSIM4v6wkt1 * Inv_W + + model->BSIM4v6pkt1 * Inv_LW; + pParam->BSIM4v6kt1l = model->BSIM4v6kt1l + + model->BSIM4v6lkt1l * Inv_L + + model->BSIM4v6wkt1l * Inv_W + + model->BSIM4v6pkt1l * Inv_LW; + pParam->BSIM4v6k2 = model->BSIM4v6k2 + + model->BSIM4v6lk2 * Inv_L + + model->BSIM4v6wk2 * Inv_W + + model->BSIM4v6pk2 * Inv_LW; + pParam->BSIM4v6kt2 = model->BSIM4v6kt2 + + model->BSIM4v6lkt2 * Inv_L + + model->BSIM4v6wkt2 * Inv_W + + model->BSIM4v6pkt2 * Inv_LW; + pParam->BSIM4v6k3 = model->BSIM4v6k3 + + model->BSIM4v6lk3 * Inv_L + + model->BSIM4v6wk3 * Inv_W + + model->BSIM4v6pk3 * Inv_LW; + pParam->BSIM4v6k3b = model->BSIM4v6k3b + + model->BSIM4v6lk3b * Inv_L + + model->BSIM4v6wk3b * Inv_W + + model->BSIM4v6pk3b * Inv_LW; + pParam->BSIM4v6w0 = model->BSIM4v6w0 + + model->BSIM4v6lw0 * Inv_L + + model->BSIM4v6ww0 * Inv_W + + model->BSIM4v6pw0 * Inv_LW; + pParam->BSIM4v6lpe0 = model->BSIM4v6lpe0 + + model->BSIM4v6llpe0 * Inv_L + + model->BSIM4v6wlpe0 * Inv_W + + model->BSIM4v6plpe0 * Inv_LW; + pParam->BSIM4v6lpeb = model->BSIM4v6lpeb + + model->BSIM4v6llpeb * Inv_L + + model->BSIM4v6wlpeb * Inv_W + + model->BSIM4v6plpeb * Inv_LW; + pParam->BSIM4v6dvtp0 = model->BSIM4v6dvtp0 + + model->BSIM4v6ldvtp0 * Inv_L + + model->BSIM4v6wdvtp0 * Inv_W + + model->BSIM4v6pdvtp0 * Inv_LW; + pParam->BSIM4v6dvtp1 = model->BSIM4v6dvtp1 + + model->BSIM4v6ldvtp1 * Inv_L + + model->BSIM4v6wdvtp1 * Inv_W + + model->BSIM4v6pdvtp1 * Inv_LW; + pParam->BSIM4v6dvt0 = model->BSIM4v6dvt0 + + model->BSIM4v6ldvt0 * Inv_L + + model->BSIM4v6wdvt0 * Inv_W + + model->BSIM4v6pdvt0 * Inv_LW; + pParam->BSIM4v6dvt1 = model->BSIM4v6dvt1 + + model->BSIM4v6ldvt1 * Inv_L + + model->BSIM4v6wdvt1 * Inv_W + + model->BSIM4v6pdvt1 * Inv_LW; + pParam->BSIM4v6dvt2 = model->BSIM4v6dvt2 + + model->BSIM4v6ldvt2 * Inv_L + + model->BSIM4v6wdvt2 * Inv_W + + model->BSIM4v6pdvt2 * Inv_LW; + pParam->BSIM4v6dvt0w = model->BSIM4v6dvt0w + + model->BSIM4v6ldvt0w * Inv_L + + model->BSIM4v6wdvt0w * Inv_W + + model->BSIM4v6pdvt0w * Inv_LW; + pParam->BSIM4v6dvt1w = model->BSIM4v6dvt1w + + model->BSIM4v6ldvt1w * Inv_L + + model->BSIM4v6wdvt1w * Inv_W + + model->BSIM4v6pdvt1w * Inv_LW; + pParam->BSIM4v6dvt2w = model->BSIM4v6dvt2w + + model->BSIM4v6ldvt2w * Inv_L + + model->BSIM4v6wdvt2w * Inv_W + + model->BSIM4v6pdvt2w * Inv_LW; + pParam->BSIM4v6drout = model->BSIM4v6drout + + model->BSIM4v6ldrout * Inv_L + + model->BSIM4v6wdrout * Inv_W + + model->BSIM4v6pdrout * Inv_LW; + pParam->BSIM4v6dsub = model->BSIM4v6dsub + + model->BSIM4v6ldsub * Inv_L + + model->BSIM4v6wdsub * Inv_W + + model->BSIM4v6pdsub * Inv_LW; + pParam->BSIM4v6vth0 = model->BSIM4v6vth0 + + model->BSIM4v6lvth0 * Inv_L + + model->BSIM4v6wvth0 * Inv_W + + model->BSIM4v6pvth0 * Inv_LW; + pParam->BSIM4v6ua = model->BSIM4v6ua + + model->BSIM4v6lua * Inv_L + + model->BSIM4v6wua * Inv_W + + model->BSIM4v6pua * Inv_LW; + pParam->BSIM4v6ua1 = model->BSIM4v6ua1 + + model->BSIM4v6lua1 * Inv_L + + model->BSIM4v6wua1 * Inv_W + + model->BSIM4v6pua1 * Inv_LW; + pParam->BSIM4v6ub = model->BSIM4v6ub + + model->BSIM4v6lub * Inv_L + + model->BSIM4v6wub * Inv_W + + model->BSIM4v6pub * Inv_LW; + pParam->BSIM4v6ub1 = model->BSIM4v6ub1 + + model->BSIM4v6lub1 * Inv_L + + model->BSIM4v6wub1 * Inv_W + + model->BSIM4v6pub1 * Inv_LW; + pParam->BSIM4v6uc = model->BSIM4v6uc + + model->BSIM4v6luc * Inv_L + + model->BSIM4v6wuc * Inv_W + + model->BSIM4v6puc * Inv_LW; + pParam->BSIM4v6uc1 = model->BSIM4v6uc1 + + model->BSIM4v6luc1 * Inv_L + + model->BSIM4v6wuc1 * Inv_W + + model->BSIM4v6puc1 * Inv_LW; + pParam->BSIM4v6ud = model->BSIM4v6ud + + model->BSIM4v6lud * Inv_L + + model->BSIM4v6wud * Inv_W + + model->BSIM4v6pud * Inv_LW; + pParam->BSIM4v6ud1 = model->BSIM4v6ud1 + + model->BSIM4v6lud1 * Inv_L + + model->BSIM4v6wud1 * Inv_W + + model->BSIM4v6pud1 * Inv_LW; + pParam->BSIM4v6up = model->BSIM4v6up + + model->BSIM4v6lup * Inv_L + + model->BSIM4v6wup * Inv_W + + model->BSIM4v6pup * Inv_LW; + pParam->BSIM4v6lp = model->BSIM4v6lp + + model->BSIM4v6llp * Inv_L + + model->BSIM4v6wlp * Inv_W + + model->BSIM4v6plp * Inv_LW; + pParam->BSIM4v6eu = model->BSIM4v6eu + + model->BSIM4v6leu * Inv_L + + model->BSIM4v6weu * Inv_W + + model->BSIM4v6peu * Inv_LW; + pParam->BSIM4v6u0 = model->BSIM4v6u0 + + model->BSIM4v6lu0 * Inv_L + + model->BSIM4v6wu0 * Inv_W + + model->BSIM4v6pu0 * Inv_LW; + pParam->BSIM4v6ute = model->BSIM4v6ute + + model->BSIM4v6lute * Inv_L + + model->BSIM4v6wute * Inv_W + + model->BSIM4v6pute * Inv_LW; + /*high k mobility*/ + pParam->BSIM4v6ucs = model->BSIM4v6ucs + + model->BSIM4v6lucs * Inv_L + + model->BSIM4v6wucs * Inv_W + + model->BSIM4v6pucs * Inv_LW; + pParam->BSIM4v6ucste = model->BSIM4v6ucste + + model->BSIM4v6lucste * Inv_L + + model->BSIM4v6wucste * Inv_W + + model->BSIM4v6pucste * Inv_LW; + + pParam->BSIM4v6voff = model->BSIM4v6voff + + model->BSIM4v6lvoff * Inv_L + + model->BSIM4v6wvoff * Inv_W + + model->BSIM4v6pvoff * Inv_LW; + pParam->BSIM4v6tvoff = model->BSIM4v6tvoff + + model->BSIM4v6ltvoff * Inv_L + + model->BSIM4v6wtvoff * Inv_W + + model->BSIM4v6ptvoff * Inv_LW; + pParam->BSIM4v6minv = model->BSIM4v6minv + + model->BSIM4v6lminv * Inv_L + + model->BSIM4v6wminv * Inv_W + + model->BSIM4v6pminv * Inv_LW; + pParam->BSIM4v6minvcv = model->BSIM4v6minvcv + + model->BSIM4v6lminvcv * Inv_L + + model->BSIM4v6wminvcv * Inv_W + + model->BSIM4v6pminvcv * Inv_LW; + pParam->BSIM4v6fprout = model->BSIM4v6fprout + + model->BSIM4v6lfprout * Inv_L + + model->BSIM4v6wfprout * Inv_W + + model->BSIM4v6pfprout * Inv_LW; + pParam->BSIM4v6pdits = model->BSIM4v6pdits + + model->BSIM4v6lpdits * Inv_L + + model->BSIM4v6wpdits * Inv_W + + model->BSIM4v6ppdits * Inv_LW; + pParam->BSIM4v6pditsd = model->BSIM4v6pditsd + + model->BSIM4v6lpditsd * Inv_L + + model->BSIM4v6wpditsd * Inv_W + + model->BSIM4v6ppditsd * Inv_LW; + pParam->BSIM4v6delta = model->BSIM4v6delta + + model->BSIM4v6ldelta * Inv_L + + model->BSIM4v6wdelta * Inv_W + + model->BSIM4v6pdelta * Inv_LW; + pParam->BSIM4v6rdsw = model->BSIM4v6rdsw + + model->BSIM4v6lrdsw * Inv_L + + model->BSIM4v6wrdsw * Inv_W + + model->BSIM4v6prdsw * Inv_LW; + pParam->BSIM4v6rdw = model->BSIM4v6rdw + + model->BSIM4v6lrdw * Inv_L + + model->BSIM4v6wrdw * Inv_W + + model->BSIM4v6prdw * Inv_LW; + pParam->BSIM4v6rsw = model->BSIM4v6rsw + + model->BSIM4v6lrsw * Inv_L + + model->BSIM4v6wrsw * Inv_W + + model->BSIM4v6prsw * Inv_LW; + pParam->BSIM4v6prwg = model->BSIM4v6prwg + + model->BSIM4v6lprwg * Inv_L + + model->BSIM4v6wprwg * Inv_W + + model->BSIM4v6pprwg * Inv_LW; + pParam->BSIM4v6prwb = model->BSIM4v6prwb + + model->BSIM4v6lprwb * Inv_L + + model->BSIM4v6wprwb * Inv_W + + model->BSIM4v6pprwb * Inv_LW; + pParam->BSIM4v6prt = model->BSIM4v6prt + + model->BSIM4v6lprt * Inv_L + + model->BSIM4v6wprt * Inv_W + + model->BSIM4v6pprt * Inv_LW; + pParam->BSIM4v6eta0 = model->BSIM4v6eta0 + + model->BSIM4v6leta0 * Inv_L + + model->BSIM4v6weta0 * Inv_W + + model->BSIM4v6peta0 * Inv_LW; + pParam->BSIM4v6etab = model->BSIM4v6etab + + model->BSIM4v6letab * Inv_L + + model->BSIM4v6wetab * Inv_W + + model->BSIM4v6petab * Inv_LW; + pParam->BSIM4v6pclm = model->BSIM4v6pclm + + model->BSIM4v6lpclm * Inv_L + + model->BSIM4v6wpclm * Inv_W + + model->BSIM4v6ppclm * Inv_LW; + pParam->BSIM4v6pdibl1 = model->BSIM4v6pdibl1 + + model->BSIM4v6lpdibl1 * Inv_L + + model->BSIM4v6wpdibl1 * Inv_W + + model->BSIM4v6ppdibl1 * Inv_LW; + pParam->BSIM4v6pdibl2 = model->BSIM4v6pdibl2 + + model->BSIM4v6lpdibl2 * Inv_L + + model->BSIM4v6wpdibl2 * Inv_W + + model->BSIM4v6ppdibl2 * Inv_LW; + pParam->BSIM4v6pdiblb = model->BSIM4v6pdiblb + + model->BSIM4v6lpdiblb * Inv_L + + model->BSIM4v6wpdiblb * Inv_W + + model->BSIM4v6ppdiblb * Inv_LW; + pParam->BSIM4v6pscbe1 = model->BSIM4v6pscbe1 + + model->BSIM4v6lpscbe1 * Inv_L + + model->BSIM4v6wpscbe1 * Inv_W + + model->BSIM4v6ppscbe1 * Inv_LW; + pParam->BSIM4v6pscbe2 = model->BSIM4v6pscbe2 + + model->BSIM4v6lpscbe2 * Inv_L + + model->BSIM4v6wpscbe2 * Inv_W + + model->BSIM4v6ppscbe2 * Inv_LW; + pParam->BSIM4v6pvag = model->BSIM4v6pvag + + model->BSIM4v6lpvag * Inv_L + + model->BSIM4v6wpvag * Inv_W + + model->BSIM4v6ppvag * Inv_LW; + pParam->BSIM4v6wr = model->BSIM4v6wr + + model->BSIM4v6lwr * Inv_L + + model->BSIM4v6wwr * Inv_W + + model->BSIM4v6pwr * Inv_LW; + pParam->BSIM4v6dwg = model->BSIM4v6dwg + + model->BSIM4v6ldwg * Inv_L + + model->BSIM4v6wdwg * Inv_W + + model->BSIM4v6pdwg * Inv_LW; + pParam->BSIM4v6dwb = model->BSIM4v6dwb + + model->BSIM4v6ldwb * Inv_L + + model->BSIM4v6wdwb * Inv_W + + model->BSIM4v6pdwb * Inv_LW; + pParam->BSIM4v6b0 = model->BSIM4v6b0 + + model->BSIM4v6lb0 * Inv_L + + model->BSIM4v6wb0 * Inv_W + + model->BSIM4v6pb0 * Inv_LW; + pParam->BSIM4v6b1 = model->BSIM4v6b1 + + model->BSIM4v6lb1 * Inv_L + + model->BSIM4v6wb1 * Inv_W + + model->BSIM4v6pb1 * Inv_LW; + pParam->BSIM4v6alpha0 = model->BSIM4v6alpha0 + + model->BSIM4v6lalpha0 * Inv_L + + model->BSIM4v6walpha0 * Inv_W + + model->BSIM4v6palpha0 * Inv_LW; + pParam->BSIM4v6alpha1 = model->BSIM4v6alpha1 + + model->BSIM4v6lalpha1 * Inv_L + + model->BSIM4v6walpha1 * Inv_W + + model->BSIM4v6palpha1 * Inv_LW; + pParam->BSIM4v6beta0 = model->BSIM4v6beta0 + + model->BSIM4v6lbeta0 * Inv_L + + model->BSIM4v6wbeta0 * Inv_W + + model->BSIM4v6pbeta0 * Inv_LW; + pParam->BSIM4v6agidl = model->BSIM4v6agidl + + model->BSIM4v6lagidl * Inv_L + + model->BSIM4v6wagidl * Inv_W + + model->BSIM4v6pagidl * Inv_LW; + pParam->BSIM4v6bgidl = model->BSIM4v6bgidl + + model->BSIM4v6lbgidl * Inv_L + + model->BSIM4v6wbgidl * Inv_W + + model->BSIM4v6pbgidl * Inv_LW; + pParam->BSIM4v6cgidl = model->BSIM4v6cgidl + + model->BSIM4v6lcgidl * Inv_L + + model->BSIM4v6wcgidl * Inv_W + + model->BSIM4v6pcgidl * Inv_LW; + pParam->BSIM4v6egidl = model->BSIM4v6egidl + + model->BSIM4v6legidl * Inv_L + + model->BSIM4v6wegidl * Inv_W + + model->BSIM4v6pegidl * Inv_LW; + pParam->BSIM4v6agisl = model->BSIM4v6agisl + + model->BSIM4v6lagisl * Inv_L + + model->BSIM4v6wagisl * Inv_W + + model->BSIM4v6pagisl * Inv_LW; + pParam->BSIM4v6bgisl = model->BSIM4v6bgisl + + model->BSIM4v6lbgisl * Inv_L + + model->BSIM4v6wbgisl * Inv_W + + model->BSIM4v6pbgisl * Inv_LW; + pParam->BSIM4v6cgisl = model->BSIM4v6cgisl + + model->BSIM4v6lcgisl * Inv_L + + model->BSIM4v6wcgisl * Inv_W + + model->BSIM4v6pcgisl * Inv_LW; + pParam->BSIM4v6egisl = model->BSIM4v6egisl + + model->BSIM4v6legisl * Inv_L + + model->BSIM4v6wegisl * Inv_W + + model->BSIM4v6pegisl * Inv_LW; + pParam->BSIM4v6aigc = model->BSIM4v6aigc + + model->BSIM4v6laigc * Inv_L + + model->BSIM4v6waigc * Inv_W + + model->BSIM4v6paigc * Inv_LW; + pParam->BSIM4v6bigc = model->BSIM4v6bigc + + model->BSIM4v6lbigc * Inv_L + + model->BSIM4v6wbigc * Inv_W + + model->BSIM4v6pbigc * Inv_LW; + pParam->BSIM4v6cigc = model->BSIM4v6cigc + + model->BSIM4v6lcigc * Inv_L + + model->BSIM4v6wcigc * Inv_W + + model->BSIM4v6pcigc * Inv_LW; + pParam->BSIM4v6aigs = model->BSIM4v6aigs + + model->BSIM4v6laigs * Inv_L + + model->BSIM4v6waigs * Inv_W + + model->BSIM4v6paigs * Inv_LW; + pParam->BSIM4v6bigs = model->BSIM4v6bigs + + model->BSIM4v6lbigs * Inv_L + + model->BSIM4v6wbigs * Inv_W + + model->BSIM4v6pbigs * Inv_LW; + pParam->BSIM4v6cigs = model->BSIM4v6cigs + + model->BSIM4v6lcigs * Inv_L + + model->BSIM4v6wcigs * Inv_W + + model->BSIM4v6pcigs * Inv_LW; + pParam->BSIM4v6aigd = model->BSIM4v6aigd + + model->BSIM4v6laigd * Inv_L + + model->BSIM4v6waigd * Inv_W + + model->BSIM4v6paigd * Inv_LW; + pParam->BSIM4v6bigd = model->BSIM4v6bigd + + model->BSIM4v6lbigd * Inv_L + + model->BSIM4v6wbigd * Inv_W + + model->BSIM4v6pbigd * Inv_LW; + pParam->BSIM4v6cigd = model->BSIM4v6cigd + + model->BSIM4v6lcigd * Inv_L + + model->BSIM4v6wcigd * Inv_W + + model->BSIM4v6pcigd * Inv_LW; + pParam->BSIM4v6aigbacc = model->BSIM4v6aigbacc + + model->BSIM4v6laigbacc * Inv_L + + model->BSIM4v6waigbacc * Inv_W + + model->BSIM4v6paigbacc * Inv_LW; + pParam->BSIM4v6bigbacc = model->BSIM4v6bigbacc + + model->BSIM4v6lbigbacc * Inv_L + + model->BSIM4v6wbigbacc * Inv_W + + model->BSIM4v6pbigbacc * Inv_LW; + pParam->BSIM4v6cigbacc = model->BSIM4v6cigbacc + + model->BSIM4v6lcigbacc * Inv_L + + model->BSIM4v6wcigbacc * Inv_W + + model->BSIM4v6pcigbacc * Inv_LW; + pParam->BSIM4v6aigbinv = model->BSIM4v6aigbinv + + model->BSIM4v6laigbinv * Inv_L + + model->BSIM4v6waigbinv * Inv_W + + model->BSIM4v6paigbinv * Inv_LW; + pParam->BSIM4v6bigbinv = model->BSIM4v6bigbinv + + model->BSIM4v6lbigbinv * Inv_L + + model->BSIM4v6wbigbinv * Inv_W + + model->BSIM4v6pbigbinv * Inv_LW; + pParam->BSIM4v6cigbinv = model->BSIM4v6cigbinv + + model->BSIM4v6lcigbinv * Inv_L + + model->BSIM4v6wcigbinv * Inv_W + + model->BSIM4v6pcigbinv * Inv_LW; + pParam->BSIM4v6nigc = model->BSIM4v6nigc + + model->BSIM4v6lnigc * Inv_L + + model->BSIM4v6wnigc * Inv_W + + model->BSIM4v6pnigc * Inv_LW; + pParam->BSIM4v6nigbacc = model->BSIM4v6nigbacc + + model->BSIM4v6lnigbacc * Inv_L + + model->BSIM4v6wnigbacc * Inv_W + + model->BSIM4v6pnigbacc * Inv_LW; + pParam->BSIM4v6nigbinv = model->BSIM4v6nigbinv + + model->BSIM4v6lnigbinv * Inv_L + + model->BSIM4v6wnigbinv * Inv_W + + model->BSIM4v6pnigbinv * Inv_LW; + pParam->BSIM4v6ntox = model->BSIM4v6ntox + + model->BSIM4v6lntox * Inv_L + + model->BSIM4v6wntox * Inv_W + + model->BSIM4v6pntox * Inv_LW; + pParam->BSIM4v6eigbinv = model->BSIM4v6eigbinv + + model->BSIM4v6leigbinv * Inv_L + + model->BSIM4v6weigbinv * Inv_W + + model->BSIM4v6peigbinv * Inv_LW; + pParam->BSIM4v6pigcd = model->BSIM4v6pigcd + + model->BSIM4v6lpigcd * Inv_L + + model->BSIM4v6wpigcd * Inv_W + + model->BSIM4v6ppigcd * Inv_LW; + pParam->BSIM4v6poxedge = model->BSIM4v6poxedge + + model->BSIM4v6lpoxedge * Inv_L + + model->BSIM4v6wpoxedge * Inv_W + + model->BSIM4v6ppoxedge * Inv_LW; + pParam->BSIM4v6xrcrg1 = model->BSIM4v6xrcrg1 + + model->BSIM4v6lxrcrg1 * Inv_L + + model->BSIM4v6wxrcrg1 * Inv_W + + model->BSIM4v6pxrcrg1 * Inv_LW; + pParam->BSIM4v6xrcrg2 = model->BSIM4v6xrcrg2 + + model->BSIM4v6lxrcrg2 * Inv_L + + model->BSIM4v6wxrcrg2 * Inv_W + + model->BSIM4v6pxrcrg2 * Inv_LW; + pParam->BSIM4v6lambda = model->BSIM4v6lambda + + model->BSIM4v6llambda * Inv_L + + model->BSIM4v6wlambda * Inv_W + + model->BSIM4v6plambda * Inv_LW; + pParam->BSIM4v6vtl = model->BSIM4v6vtl + + model->BSIM4v6lvtl * Inv_L + + model->BSIM4v6wvtl * Inv_W + + model->BSIM4v6pvtl * Inv_LW; + pParam->BSIM4v6xn = model->BSIM4v6xn + + model->BSIM4v6lxn * Inv_L + + model->BSIM4v6wxn * Inv_W + + model->BSIM4v6pxn * Inv_LW; + pParam->BSIM4v6vfbsdoff = model->BSIM4v6vfbsdoff + + model->BSIM4v6lvfbsdoff * Inv_L + + model->BSIM4v6wvfbsdoff * Inv_W + + model->BSIM4v6pvfbsdoff * Inv_LW; + pParam->BSIM4v6tvfbsdoff = model->BSIM4v6tvfbsdoff + + model->BSIM4v6ltvfbsdoff * Inv_L + + model->BSIM4v6wtvfbsdoff * Inv_W + + model->BSIM4v6ptvfbsdoff * Inv_LW; + + pParam->BSIM4v6cgsl = model->BSIM4v6cgsl + + model->BSIM4v6lcgsl * Inv_L + + model->BSIM4v6wcgsl * Inv_W + + model->BSIM4v6pcgsl * Inv_LW; + pParam->BSIM4v6cgdl = model->BSIM4v6cgdl + + model->BSIM4v6lcgdl * Inv_L + + model->BSIM4v6wcgdl * Inv_W + + model->BSIM4v6pcgdl * Inv_LW; + pParam->BSIM4v6ckappas = model->BSIM4v6ckappas + + model->BSIM4v6lckappas * Inv_L + + model->BSIM4v6wckappas * Inv_W + + model->BSIM4v6pckappas * Inv_LW; + pParam->BSIM4v6ckappad = model->BSIM4v6ckappad + + model->BSIM4v6lckappad * Inv_L + + model->BSIM4v6wckappad * Inv_W + + model->BSIM4v6pckappad * Inv_LW; + pParam->BSIM4v6cf = model->BSIM4v6cf + + model->BSIM4v6lcf * Inv_L + + model->BSIM4v6wcf * Inv_W + + model->BSIM4v6pcf * Inv_LW; + pParam->BSIM4v6clc = model->BSIM4v6clc + + model->BSIM4v6lclc * Inv_L + + model->BSIM4v6wclc * Inv_W + + model->BSIM4v6pclc * Inv_LW; + pParam->BSIM4v6cle = model->BSIM4v6cle + + model->BSIM4v6lcle * Inv_L + + model->BSIM4v6wcle * Inv_W + + model->BSIM4v6pcle * Inv_LW; + pParam->BSIM4v6vfbcv = model->BSIM4v6vfbcv + + model->BSIM4v6lvfbcv * Inv_L + + model->BSIM4v6wvfbcv * Inv_W + + model->BSIM4v6pvfbcv * Inv_LW; + pParam->BSIM4v6acde = model->BSIM4v6acde + + model->BSIM4v6lacde * Inv_L + + model->BSIM4v6wacde * Inv_W + + model->BSIM4v6pacde * Inv_LW; + pParam->BSIM4v6moin = model->BSIM4v6moin + + model->BSIM4v6lmoin * Inv_L + + model->BSIM4v6wmoin * Inv_W + + model->BSIM4v6pmoin * Inv_LW; + pParam->BSIM4v6noff = model->BSIM4v6noff + + model->BSIM4v6lnoff * Inv_L + + model->BSIM4v6wnoff * Inv_W + + model->BSIM4v6pnoff * Inv_LW; + pParam->BSIM4v6voffcv = model->BSIM4v6voffcv + + model->BSIM4v6lvoffcv * Inv_L + + model->BSIM4v6wvoffcv * Inv_W + + model->BSIM4v6pvoffcv * Inv_LW; + pParam->BSIM4v6kvth0we = model->BSIM4v6kvth0we + + model->BSIM4v6lkvth0we * Inv_L + + model->BSIM4v6wkvth0we * Inv_W + + model->BSIM4v6pkvth0we * Inv_LW; + pParam->BSIM4v6k2we = model->BSIM4v6k2we + + model->BSIM4v6lk2we * Inv_L + + model->BSIM4v6wk2we * Inv_W + + model->BSIM4v6pk2we * Inv_LW; + pParam->BSIM4v6ku0we = model->BSIM4v6ku0we + + model->BSIM4v6lku0we * Inv_L + + model->BSIM4v6wku0we * Inv_W + + model->BSIM4v6pku0we * Inv_LW; + + pParam->BSIM4v6abulkCVfactor = 1.0 + pow((pParam->BSIM4v6clc + / pParam->BSIM4v6leffCV), + pParam->BSIM4v6cle); + + T0 = (TRatio - 1.0); + + PowWeffWr = pow(pParam->BSIM4v6weffCJ * 1.0e6, pParam->BSIM4v6wr) * here->BSIM4v6nf; + + T1 = T2 = T3 = T4 = 0.0; + pParam->BSIM4v6ucs = pParam->BSIM4v6ucs * pow(TRatio, pParam->BSIM4v6ucste); + if(model->BSIM4v6tempMod == 0) { + pParam->BSIM4v6ua = pParam->BSIM4v6ua + pParam->BSIM4v6ua1 * T0; + pParam->BSIM4v6ub = pParam->BSIM4v6ub + pParam->BSIM4v6ub1 * T0; + pParam->BSIM4v6uc = pParam->BSIM4v6uc + pParam->BSIM4v6uc1 * T0; + pParam->BSIM4v6ud = pParam->BSIM4v6ud + pParam->BSIM4v6ud1 * T0; + pParam->BSIM4v6vsattemp = pParam->BSIM4v6vsat - pParam->BSIM4v6at * T0; + T10 = pParam->BSIM4v6prt * T0; + if(model->BSIM4v6rdsMod) { + /* External Rd(V) */ + T1 = pParam->BSIM4v6rdw + T10; + T2 = model->BSIM4v6rdwmin + T10; + /* External Rs(V) */ + T3 = pParam->BSIM4v6rsw + T10; + T4 = model->BSIM4v6rswmin + T10; + } + /* Internal Rds(V) in IV */ + pParam->BSIM4v6rds0 = (pParam->BSIM4v6rdsw + T10) + * here->BSIM4v6nf / PowWeffWr; + pParam->BSIM4v6rdswmin = (model->BSIM4v6rdswmin + T10) + * here->BSIM4v6nf / PowWeffWr; + } else { + if (model->BSIM4v6tempMod == 3) + {pParam->BSIM4v6ua = pParam->BSIM4v6ua * pow(TRatio, pParam->BSIM4v6ua1) ; + pParam->BSIM4v6ub = pParam->BSIM4v6ub * pow(TRatio, pParam->BSIM4v6ub1); + pParam->BSIM4v6uc = pParam->BSIM4v6uc * pow(TRatio, pParam->BSIM4v6uc1); + pParam->BSIM4v6ud = pParam->BSIM4v6ud * pow(TRatio, pParam->BSIM4v6ud1); + } + else{ /* tempMod = 1, 2 */ + pParam->BSIM4v6ua = pParam->BSIM4v6ua * (1.0 + pParam->BSIM4v6ua1 * delTemp) ; + pParam->BSIM4v6ub = pParam->BSIM4v6ub * (1.0 + pParam->BSIM4v6ub1 * delTemp); + pParam->BSIM4v6uc = pParam->BSIM4v6uc * (1.0 + pParam->BSIM4v6uc1 * delTemp); + pParam->BSIM4v6ud = pParam->BSIM4v6ud * (1.0 + pParam->BSIM4v6ud1 * delTemp); + } + pParam->BSIM4v6vsattemp = pParam->BSIM4v6vsat * (1.0 - pParam->BSIM4v6at * delTemp); + T10 = 1.0 + pParam->BSIM4v6prt * delTemp; + if(model->BSIM4v6rdsMod) { + /* External Rd(V) */ + T1 = pParam->BSIM4v6rdw * T10; + T2 = model->BSIM4v6rdwmin * T10; + /* External Rs(V) */ + T3 = pParam->BSIM4v6rsw * T10; + T4 = model->BSIM4v6rswmin * T10; + } + /* Internal Rds(V) in IV */ + pParam->BSIM4v6rds0 = pParam->BSIM4v6rdsw * T10 * here->BSIM4v6nf / PowWeffWr; + pParam->BSIM4v6rdswmin = model->BSIM4v6rdswmin * T10 * here->BSIM4v6nf / PowWeffWr; + } + if (T1 < 0.0) + { T1 = 0.0; + printf("Warning: Rdw at current temperature is negative; set to 0.\n"); + } + if (T2 < 0.0) + { T2 = 0.0; + printf("Warning: Rdwmin at current temperature is negative; set to 0.\n"); + } + pParam->BSIM4v6rd0 = T1 / PowWeffWr; + pParam->BSIM4v6rdwmin = T2 / PowWeffWr; + if (T3 < 0.0) + { T3 = 0.0; + printf("Warning: Rsw at current temperature is negative; set to 0.\n"); + } + if (T4 < 0.0) + { T4 = 0.0; + printf("Warning: Rswmin at current temperature is negative; set to 0.\n"); + } + pParam->BSIM4v6rs0 = T3 / PowWeffWr; + pParam->BSIM4v6rswmin = T4 / PowWeffWr; + + if (pParam->BSIM4v6u0 > 1.0) + pParam->BSIM4v6u0 = pParam->BSIM4v6u0 / 1.0e4; + + /* mobility channel length dependence */ + T5 = 1.0 - pParam->BSIM4v6up * exp( - pParam->BSIM4v6leff / pParam->BSIM4v6lp); + pParam->BSIM4v6u0temp = pParam->BSIM4v6u0 * T5 + * pow(TRatio, pParam->BSIM4v6ute); + if (pParam->BSIM4v6eu < 0.0) + { pParam->BSIM4v6eu = 0.0; + printf("Warning: eu has been negative; reset to 0.0.\n"); + } + if (pParam->BSIM4v6ucs < 0.0) + { pParam->BSIM4v6ucs = 0.0; + printf("Warning: ucs has been negative; reset to 0.0.\n"); + } + + pParam->BSIM4v6vfbsdoff = pParam->BSIM4v6vfbsdoff * (1.0 + pParam->BSIM4v6tvfbsdoff * delTemp); + pParam->BSIM4v6voff = pParam->BSIM4v6voff * (1.0 + pParam->BSIM4v6tvoff * delTemp); + + /* Source End Velocity Limit */ + if((model->BSIM4v6vtlGiven) && (model->BSIM4v6vtl > 0.0) ) + { + if(model->BSIM4v6lc < 0.0) pParam->BSIM4v6lc = 0.0; + else pParam->BSIM4v6lc = model->BSIM4v6lc ; + T0 = pParam->BSIM4v6leff / (pParam->BSIM4v6xn * pParam->BSIM4v6leff + pParam->BSIM4v6lc); + pParam->BSIM4v6tfactor = (1.0 - T0) / (1.0 + T0 ); + } + + pParam->BSIM4v6cgdo = (model->BSIM4v6cgdo + pParam->BSIM4v6cf) + * pParam->BSIM4v6weffCV; + pParam->BSIM4v6cgso = (model->BSIM4v6cgso + pParam->BSIM4v6cf) + * pParam->BSIM4v6weffCV; + pParam->BSIM4v6cgbo = model->BSIM4v6cgbo * pParam->BSIM4v6leffCV * here->BSIM4v6nf; + + if (!model->BSIM4v6ndepGiven && model->BSIM4v6gamma1Given) + { T0 = pParam->BSIM4v6gamma1 * model->BSIM4v6coxe; + pParam->BSIM4v6ndep = 3.01248e22 * T0 * T0; + } + + pParam->BSIM4v6phi = Vtm0 * log(pParam->BSIM4v6ndep / ni) + + pParam->BSIM4v6phin + 0.4; + + pParam->BSIM4v6sqrtPhi = sqrt(pParam->BSIM4v6phi); + pParam->BSIM4v6phis3 = pParam->BSIM4v6sqrtPhi * pParam->BSIM4v6phi; + + pParam->BSIM4v6Xdep0 = sqrt(2.0 * epssub / (Charge_q + * pParam->BSIM4v6ndep * 1.0e6)) + * pParam->BSIM4v6sqrtPhi; + pParam->BSIM4v6sqrtXdep0 = sqrt(pParam->BSIM4v6Xdep0); + + if(model->BSIM4v6mtrlMod == 0) + pParam->BSIM4v6litl = sqrt(3.0 * 3.9 / epsrox * pParam->BSIM4v6xj * toxe); + else + pParam->BSIM4v6litl = sqrt(model->BSIM4v6epsrsub/epsrox * pParam->BSIM4v6xj * toxe); + + pParam->BSIM4v6vbi = Vtm0 * log(pParam->BSIM4v6nsd + * pParam->BSIM4v6ndep / (ni * ni)); + + if (model->BSIM4v6mtrlMod == 0) + { + if (pParam->BSIM4v6ngate > 0.0) + { pParam->BSIM4v6vfbsd = Vtm0 * log(pParam->BSIM4v6ngate + / pParam->BSIM4v6nsd); + } + else + pParam->BSIM4v6vfbsd = 0.0; + } + else + { + T0 = Vtm0 * log(pParam->BSIM4v6nsd/ni); + T1 = 0.5 * Eg0; + if(T0 > T1) + T0 = T1; + T2 = model->BSIM4v6easub + T1 - model->BSIM4v6type * T0; + pParam->BSIM4v6vfbsd = model->BSIM4v6phig - T2; + } + + pParam->BSIM4v6cdep0 = sqrt(Charge_q * epssub + * pParam->BSIM4v6ndep * 1.0e6 / 2.0 + / pParam->BSIM4v6phi); + + pParam->BSIM4v6ToxRatio = exp(pParam->BSIM4v6ntox + * log(model->BSIM4v6toxref / toxe)) + / toxe / toxe; + pParam->BSIM4v6ToxRatioEdge = exp(pParam->BSIM4v6ntox + * log(model->BSIM4v6toxref + / (toxe * pParam->BSIM4v6poxedge))) + / toxe / toxe + / pParam->BSIM4v6poxedge / pParam->BSIM4v6poxedge; + pParam->BSIM4v6Aechvb = (model->BSIM4v6type == NMOS) ? 4.97232e-7 : 3.42537e-7; + pParam->BSIM4v6Bechvb = (model->BSIM4v6type == NMOS) ? 7.45669e11 : 1.16645e12; + pParam->BSIM4v6AechvbEdgeS = pParam->BSIM4v6Aechvb * pParam->BSIM4v6weff + * model->BSIM4v6dlcig * pParam->BSIM4v6ToxRatioEdge; + pParam->BSIM4v6AechvbEdgeD = pParam->BSIM4v6Aechvb * pParam->BSIM4v6weff + * model->BSIM4v6dlcigd * pParam->BSIM4v6ToxRatioEdge; + pParam->BSIM4v6BechvbEdge = -pParam->BSIM4v6Bechvb + * toxe * pParam->BSIM4v6poxedge; + pParam->BSIM4v6Aechvb *= pParam->BSIM4v6weff * pParam->BSIM4v6leff + * pParam->BSIM4v6ToxRatio; + pParam->BSIM4v6Bechvb *= -toxe; + + + pParam->BSIM4v6mstar = 0.5 + atan(pParam->BSIM4v6minv) / PI; + pParam->BSIM4v6mstarcv = 0.5 + atan(pParam->BSIM4v6minvcv) / PI; + pParam->BSIM4v6voffcbn = pParam->BSIM4v6voff + model->BSIM4v6voffl / pParam->BSIM4v6leff; + pParam->BSIM4v6voffcbncv = pParam->BSIM4v6voffcv + model->BSIM4v6voffcvl / pParam->BSIM4v6leff; + + pParam->BSIM4v6ldeb = sqrt(epssub * Vtm0 / (Charge_q + * pParam->BSIM4v6ndep * 1.0e6)) / 3.0; + pParam->BSIM4v6acde *= pow((pParam->BSIM4v6ndep / 2.0e16), -0.25); + + + if (model->BSIM4v6k1Given || model->BSIM4v6k2Given) + { if (!model->BSIM4v6k1Given) + { + if ((!ckt->CKTcurJob) || (ckt->CKTcurJob->JOBtype < 9)) /* don't print in sensitivity */ + fprintf(stdout, "Warning: k1 should be specified with k2.\n"); + pParam->BSIM4v6k1 = 0.53; + } + if (!model->BSIM4v6k2Given) + { + if ((!ckt->CKTcurJob) || (ckt->CKTcurJob->JOBtype < 9)) /* don't print in sensitivity */ + fprintf(stdout, "Warning: k2 should be specified with k1.\n"); + pParam->BSIM4v6k2 = -0.0186; + } + if ((!ckt->CKTcurJob) || (ckt->CKTcurJob->JOBtype < 9)) { /* don't print in sensitivity */ + if (model->BSIM4v6nsubGiven) + fprintf(stdout, "Warning: nsub is ignored because k1 or k2 is given.\n"); + if (model->BSIM4v6xtGiven) + fprintf(stdout, "Warning: xt is ignored because k1 or k2 is given.\n"); + if (model->BSIM4v6vbxGiven) + fprintf(stdout, "Warning: vbx is ignored because k1 or k2 is given.\n"); + if (model->BSIM4v6gamma1Given) + fprintf(stdout, "Warning: gamma1 is ignored because k1 or k2 is given.\n"); + if (model->BSIM4v6gamma2Given) + fprintf(stdout, "Warning: gamma2 is ignored because k1 or k2 is given.\n"); + } + } + else + { if (!model->BSIM4v6vbxGiven) + pParam->BSIM4v6vbx = pParam->BSIM4v6phi - 7.7348e-4 + * pParam->BSIM4v6ndep + * pParam->BSIM4v6xt * pParam->BSIM4v6xt; + if (pParam->BSIM4v6vbx > 0.0) + pParam->BSIM4v6vbx = -pParam->BSIM4v6vbx; + if (pParam->BSIM4v6vbm > 0.0) + pParam->BSIM4v6vbm = -pParam->BSIM4v6vbm; + + if (!model->BSIM4v6gamma1Given) + pParam->BSIM4v6gamma1 = 5.753e-12 + * sqrt(pParam->BSIM4v6ndep) + / model->BSIM4v6coxe; + if (!model->BSIM4v6gamma2Given) + pParam->BSIM4v6gamma2 = 5.753e-12 + * sqrt(pParam->BSIM4v6nsub) + / model->BSIM4v6coxe; + + T0 = pParam->BSIM4v6gamma1 - pParam->BSIM4v6gamma2; + T1 = sqrt(pParam->BSIM4v6phi - pParam->BSIM4v6vbx) + - pParam->BSIM4v6sqrtPhi; + T2 = sqrt(pParam->BSIM4v6phi * (pParam->BSIM4v6phi + - pParam->BSIM4v6vbm)) - pParam->BSIM4v6phi; + pParam->BSIM4v6k2 = T0 * T1 / (2.0 * T2 + pParam->BSIM4v6vbm); + pParam->BSIM4v6k1 = pParam->BSIM4v6gamma2 - 2.0 + * pParam->BSIM4v6k2 * sqrt(pParam->BSIM4v6phi + - pParam->BSIM4v6vbm); + } + + if (!model->BSIM4v6vfbGiven) + { + if (model->BSIM4v6vth0Given) + { pParam->BSIM4v6vfb = model->BSIM4v6type * pParam->BSIM4v6vth0 + - pParam->BSIM4v6phi - pParam->BSIM4v6k1 + * pParam->BSIM4v6sqrtPhi; + } + else + { + if ((model->BSIM4v6mtrlMod) && (model->BSIM4v6phigGiven) && + (model->BSIM4v6nsubGiven)) + { + T0 = Vtm0 * log(pParam->BSIM4v6nsub/ni); + T1 = 0.5 * Eg0; + if(T0 > T1) + T0 = T1; + T2 = model->BSIM4v6easub + T1 + model->BSIM4v6type * T0; + pParam->BSIM4v6vfb = model->BSIM4v6phig - T2; + } + else + { + pParam->BSIM4v6vfb = -1.0; + } + } + } + if (!model->BSIM4v6vth0Given) + { pParam->BSIM4v6vth0 = model->BSIM4v6type * (pParam->BSIM4v6vfb + + pParam->BSIM4v6phi + pParam->BSIM4v6k1 + * pParam->BSIM4v6sqrtPhi); + } + + pParam->BSIM4v6k1ox = pParam->BSIM4v6k1 * toxe + / model->BSIM4v6toxm; + + tmp = sqrt(epssub / (epsrox * EPS0) * toxe * pParam->BSIM4v6Xdep0); + T0 = pParam->BSIM4v6dsub * pParam->BSIM4v6leff / tmp; + if (T0 < EXP_THRESHOLD) + { T1 = exp(T0); + T2 = T1 - 1.0; + T3 = T2 * T2; + T4 = T3 + 2.0 * T1 * MIN_EXP; + pParam->BSIM4v6theta0vb0 = T1 / T4; + } + else + pParam->BSIM4v6theta0vb0 = 1.0 / (MAX_EXP - 2.0); + + T0 = pParam->BSIM4v6drout * pParam->BSIM4v6leff / tmp; + if (T0 < EXP_THRESHOLD) + { T1 = exp(T0); + T2 = T1 - 1.0; + T3 = T2 * T2; + T4 = T3 + 2.0 * T1 * MIN_EXP; + T5 = T1 / T4; + } + else + T5 = 1.0 / (MAX_EXP - 2.0); /* 3.0 * MIN_EXP omitted */ + pParam->BSIM4v6thetaRout = pParam->BSIM4v6pdibl1 * T5 + + pParam->BSIM4v6pdibl2; + + tmp = sqrt(pParam->BSIM4v6Xdep0); + tmp1 = pParam->BSIM4v6vbi - pParam->BSIM4v6phi; + tmp2 = model->BSIM4v6factor1 * tmp; + + T0 = pParam->BSIM4v6dvt1w * pParam->BSIM4v6weff + * pParam->BSIM4v6leff / tmp2; + if (T0 < EXP_THRESHOLD) + { T1 = exp(T0); + T2 = T1 - 1.0; + T3 = T2 * T2; + T4 = T3 + 2.0 * T1 * MIN_EXP; + T8 = T1 / T4; + } + else + T8 = 1.0 / (MAX_EXP - 2.0); + T0 = pParam->BSIM4v6dvt0w * T8; + T8 = T0 * tmp1; + + T0 = pParam->BSIM4v6dvt1 * pParam->BSIM4v6leff / tmp2; + if (T0 < EXP_THRESHOLD) + { T1 = exp(T0); + T2 = T1 - 1.0; + T3 = T2 * T2; + T4 = T3 + 2.0 * T1 * MIN_EXP; + T9 = T1 / T4; + } + else + T9 = 1.0 / (MAX_EXP - 2.0); + T9 = pParam->BSIM4v6dvt0 * T9 * tmp1; + + T4 = toxe * pParam->BSIM4v6phi + / (pParam->BSIM4v6weff + pParam->BSIM4v6w0); + + T0 = sqrt(1.0 + pParam->BSIM4v6lpe0 / pParam->BSIM4v6leff); + if((model->BSIM4v6tempMod == 1) || (model->BSIM4v6tempMod == 0)) + T3 = (pParam->BSIM4v6kt1 + pParam->BSIM4v6kt1l / pParam->BSIM4v6leff) + * (TRatio - 1.0); + if((model->BSIM4v6tempMod == 2)||(model->BSIM4v6tempMod == 3)) + T3 = - pParam->BSIM4v6kt1 * (TRatio - 1.0); + + T5 = pParam->BSIM4v6k1ox * (T0 - 1.0) * pParam->BSIM4v6sqrtPhi + + T3; + pParam->BSIM4v6vfbzbfactor = - T8 - T9 + pParam->BSIM4v6k3 * T4 + T5 + - pParam->BSIM4v6phi - pParam->BSIM4v6k1 * pParam->BSIM4v6sqrtPhi; + + /* stress effect */ + + wlod = model->BSIM4v6wlod; + if (model->BSIM4v6wlod < 0.0) + { fprintf(stderr, "Warning: WLOD = %g is less than 0. 0.0 is used\n",model->BSIM4v6wlod); + wlod = 0.0; + } + T0 = pow(Lnew, model->BSIM4v6llodku0); + W_tmp = Wnew + wlod; + T1 = pow(W_tmp, model->BSIM4v6wlodku0); + tmp1 = model->BSIM4v6lku0 / T0 + model->BSIM4v6wku0 / T1 + + model->BSIM4v6pku0 / (T0 * T1); + pParam->BSIM4v6ku0 = 1.0 + tmp1; + + T0 = pow(Lnew, model->BSIM4v6llodvth); + T1 = pow(W_tmp, model->BSIM4v6wlodvth); + tmp1 = model->BSIM4v6lkvth0 / T0 + model->BSIM4v6wkvth0 / T1 + + model->BSIM4v6pkvth0 / (T0 * T1); + pParam->BSIM4v6kvth0 = 1.0 + tmp1; + pParam->BSIM4v6kvth0 = sqrt(pParam->BSIM4v6kvth0*pParam->BSIM4v6kvth0 + DELTA); + + T0 = (TRatio - 1.0); + pParam->BSIM4v6ku0temp = pParam->BSIM4v6ku0 * (1.0 + model->BSIM4v6tku0 *T0) + DELTA; + + Inv_saref = 1.0/(model->BSIM4v6saref + 0.5*Ldrn); + Inv_sbref = 1.0/(model->BSIM4v6sbref + 0.5*Ldrn); + pParam->BSIM4v6inv_od_ref = Inv_saref + Inv_sbref; + pParam->BSIM4v6rho_ref = model->BSIM4v6ku0 / pParam->BSIM4v6ku0temp * pParam->BSIM4v6inv_od_ref; + + } /* End of SizeNotFound */ + + /* stress effect */ + if( (here->BSIM4v6sa > 0.0) && (here->BSIM4v6sb > 0.0) && + ((here->BSIM4v6nf == 1.0) || ((here->BSIM4v6nf > 1.0) && (here->BSIM4v6sd > 0.0))) ) + { Inv_sa = 0; + Inv_sb = 0; + + kvsat = model->BSIM4v6kvsat; + if (model->BSIM4v6kvsat < -1.0 ) + { fprintf(stderr, "Warning: KVSAT = %g is too small; -1.0 is used.\n",model->BSIM4v6kvsat); + kvsat = -1.0; + } + if (model->BSIM4v6kvsat > 1.0) + { fprintf(stderr, "Warning: KVSAT = %g is too big; 1.0 is used.\n",model->BSIM4v6kvsat); + kvsat = 1.0; + } + + for(i = 0; i < here->BSIM4v6nf; i++){ + T0 = 1.0 / here->BSIM4v6nf / (here->BSIM4v6sa + 0.5*Ldrn + i * (here->BSIM4v6sd +Ldrn)); + T1 = 1.0 / here->BSIM4v6nf / (here->BSIM4v6sb + 0.5*Ldrn + i * (here->BSIM4v6sd +Ldrn)); + Inv_sa += T0; + Inv_sb += T1; + } + Inv_ODeff = Inv_sa + Inv_sb; + rho = model->BSIM4v6ku0 / pParam->BSIM4v6ku0temp * Inv_ODeff; + T0 = (1.0 + rho)/(1.0 + pParam->BSIM4v6rho_ref); + here->BSIM4v6u0temp = pParam->BSIM4v6u0temp * T0; + + T1 = (1.0 + kvsat * rho)/(1.0 + kvsat * pParam->BSIM4v6rho_ref); + here->BSIM4v6vsattemp = pParam->BSIM4v6vsattemp * T1; + + OD_offset = Inv_ODeff - pParam->BSIM4v6inv_od_ref; + dvth0_lod = model->BSIM4v6kvth0 / pParam->BSIM4v6kvth0 * OD_offset; + dk2_lod = model->BSIM4v6stk2 / pow(pParam->BSIM4v6kvth0, model->BSIM4v6lodk2) * + OD_offset; + deta0_lod = model->BSIM4v6steta0 / pow(pParam->BSIM4v6kvth0, model->BSIM4v6lodeta0) * + OD_offset; + here->BSIM4v6vth0 = pParam->BSIM4v6vth0 + dvth0_lod; + + here->BSIM4v6eta0 = pParam->BSIM4v6eta0 + deta0_lod; + here->BSIM4v6k2 = pParam->BSIM4v6k2 + dk2_lod; + } else { + here->BSIM4v6u0temp = pParam->BSIM4v6u0temp; + here->BSIM4v6vth0 = pParam->BSIM4v6vth0; + here->BSIM4v6vsattemp = pParam->BSIM4v6vsattemp; + here->BSIM4v6eta0 = pParam->BSIM4v6eta0; + here->BSIM4v6k2 = pParam->BSIM4v6k2; + } + + /* Well Proximity Effect */ + if (model->BSIM4v6wpemod) + { if( (!here->BSIM4v6scaGiven) && (!here->BSIM4v6scbGiven) && (!here->BSIM4v6sccGiven) ) + { if((here->BSIM4v6scGiven) && (here->BSIM4v6sc > 0.0) ) + { T1 = here->BSIM4v6sc + Wdrn; + T2 = 1.0 / model->BSIM4v6scref; + here->BSIM4v6sca = model->BSIM4v6scref * model->BSIM4v6scref + / (here->BSIM4v6sc * T1); + here->BSIM4v6scb = ( (0.1 * here->BSIM4v6sc + 0.01 * model->BSIM4v6scref) + * exp(-10.0 * here->BSIM4v6sc * T2) + - (0.1 * T1 + 0.01 * model->BSIM4v6scref) + * exp(-10.0 * T1 * T2) ) / Wdrn; + here->BSIM4v6scc = ( (0.05 * here->BSIM4v6sc + 0.0025 * model->BSIM4v6scref) + * exp(-20.0 * here->BSIM4v6sc * T2) + - (0.05 * T1 + 0.0025 * model->BSIM4v6scref) + * 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"); + } + } + + if (here->BSIM4v6sca < 0.0) + { + printf("Warning: SCA = %g is negative. Set to 0.0.\n", here->BSIM4v6sca); + here->BSIM4v6sca = 0.0; + } + if (here->BSIM4v6scb < 0.0) + { + printf("Warning: SCB = %g is negative. Set to 0.0.\n", here->BSIM4v6scb); + here->BSIM4v6scb = 0.0; + } + if (here->BSIM4v6scc < 0.0) + { + printf("Warning: SCC = %g is negative. Set to 0.0.\n", here->BSIM4v6scc); + here->BSIM4v6scc = 0.0; + } + if (here->BSIM4v6sc < 0.0) + { + printf("Warning: SC = %g is negative. Set to 0.0.\n", here->BSIM4v6sc); + here->BSIM4v6sc = 0.0; + } + /*4.6.2*/ + sceff = here->BSIM4v6sca + model->BSIM4v6web * here->BSIM4v6scb + + model->BSIM4v6wec * here->BSIM4v6scc; + here->BSIM4v6vth0 += pParam->BSIM4v6kvth0we * sceff; + here->BSIM4v6k2 += pParam->BSIM4v6k2we * sceff; + T3 = 1.0 + pParam->BSIM4v6ku0we * sceff; + if (T3 <= 0.0) + { T3 = 0.0; + fprintf(stderr, "Warning: ku0we = %g is negatively too high. Negative mobility! \n", pParam->BSIM4v6ku0we); + } + here->BSIM4v6u0temp *= T3; + } + + /* adding delvto */ + here->BSIM4v6vth0 += here->BSIM4v6delvto; + here->BSIM4v6vfb = pParam->BSIM4v6vfb + model->BSIM4v6type * here->BSIM4v6delvto; + + /* Instance variables calculation */ + T3 = model->BSIM4v6type * here->BSIM4v6vth0 + - here->BSIM4v6vfb - pParam->BSIM4v6phi; + T4 = T3 + T3; + T5 = 2.5 * T3; + here->BSIM4v6vtfbphi1 = (model->BSIM4v6type == NMOS) ? T4 : T5; + if (here->BSIM4v6vtfbphi1 < 0.0) + here->BSIM4v6vtfbphi1 = 0.0; + + here->BSIM4v6vtfbphi2 = 4.0 * T3; + if (here->BSIM4v6vtfbphi2 < 0.0) + here->BSIM4v6vtfbphi2 = 0.0; + + if (here->BSIM4v6k2 < 0.0) + { T0 = 0.5 * pParam->BSIM4v6k1 / here->BSIM4v6k2; + here->BSIM4v6vbsc = 0.9 * (pParam->BSIM4v6phi - T0 * T0); + if (here->BSIM4v6vbsc > -3.0) + here->BSIM4v6vbsc = -3.0; + else if (here->BSIM4v6vbsc < -30.0) + here->BSIM4v6vbsc = -30.0; + } + else + here->BSIM4v6vbsc = -30.0; + if (here->BSIM4v6vbsc > pParam->BSIM4v6vbm) + here->BSIM4v6vbsc = pParam->BSIM4v6vbm; + here->BSIM4v6k2ox = here->BSIM4v6k2 * toxe + / model->BSIM4v6toxm; + + here->BSIM4v6vfbzb = pParam->BSIM4v6vfbzbfactor + + model->BSIM4v6type * here->BSIM4v6vth0 ; + + here->BSIM4v6cgso = pParam->BSIM4v6cgso; + here->BSIM4v6cgdo = pParam->BSIM4v6cgdo; + + lnl = log(pParam->BSIM4v6leff * 1.0e6); + lnw = log(pParam->BSIM4v6weff * 1.0e6); + lnnf = log(here->BSIM4v6nf); + + bodymode = 5; + if( ( !model->BSIM4v6rbps0Given) || + ( !model->BSIM4v6rbpd0Given) ) + bodymode = 1; + else + if( (!model->BSIM4v6rbsbx0Given && !model->BSIM4v6rbsby0Given) || + (!model->BSIM4v6rbdbx0Given && !model->BSIM4v6rbdby0Given) ) + bodymode = 3; + + if(here->BSIM4v6rbodyMod == 2) + { + if (bodymode == 5) + { + rbsbx = exp( log(model->BSIM4v6rbsbx0) + model->BSIM4v6rbsdbxl * lnl + + model->BSIM4v6rbsdbxw * lnw + model->BSIM4v6rbsdbxnf * lnnf ); + rbsby = exp( log(model->BSIM4v6rbsby0) + model->BSIM4v6rbsdbyl * lnl + + model->BSIM4v6rbsdbyw * lnw + model->BSIM4v6rbsdbynf * lnnf ); + here->BSIM4v6rbsb = rbsbx * rbsby / (rbsbx + rbsby); + + + rbdbx = exp( log(model->BSIM4v6rbdbx0) + model->BSIM4v6rbsdbxl * lnl + + model->BSIM4v6rbsdbxw * lnw + model->BSIM4v6rbsdbxnf * lnnf ); + rbdby = exp( log(model->BSIM4v6rbdby0) + model->BSIM4v6rbsdbyl * lnl + + model->BSIM4v6rbsdbyw * lnw + model->BSIM4v6rbsdbynf * lnnf ); + here->BSIM4v6rbdb = rbdbx * rbdby / (rbdbx + rbdby); + } + + if ((bodymode == 3)|| (bodymode == 5)) + { + here->BSIM4v6rbps = exp( log(model->BSIM4v6rbps0) + model->BSIM4v6rbpsl * lnl + + model->BSIM4v6rbpsw * lnw + model->BSIM4v6rbpsnf * lnnf ); + here->BSIM4v6rbpd = exp( log(model->BSIM4v6rbpd0) + model->BSIM4v6rbpdl * lnl + + model->BSIM4v6rbpdw * lnw + model->BSIM4v6rbpdnf * lnnf ); + } + + rbpbx = exp( log(model->BSIM4v6rbpbx0) + model->BSIM4v6rbpbxl * lnl + + model->BSIM4v6rbpbxw * lnw + model->BSIM4v6rbpbxnf * lnnf ); + rbpby = exp( log(model->BSIM4v6rbpby0) + model->BSIM4v6rbpbyl * lnl + + model->BSIM4v6rbpbyw * lnw + model->BSIM4v6rbpbynf * lnnf ); + here->BSIM4v6rbpb = rbpbx*rbpby/(rbpbx + rbpby); + } + + + if ((here->BSIM4v6rbodyMod == 1 ) || ((here->BSIM4v6rbodyMod == 2 ) && (bodymode == 5)) ) + { if (here->BSIM4v6rbdb < 1.0e-3) + here->BSIM4v6grbdb = 1.0e3; /* in mho */ + else + here->BSIM4v6grbdb = model->BSIM4v6gbmin + 1.0 / here->BSIM4v6rbdb; + if (here->BSIM4v6rbpb < 1.0e-3) + here->BSIM4v6grbpb = 1.0e3; + else + here->BSIM4v6grbpb = model->BSIM4v6gbmin + 1.0 / here->BSIM4v6rbpb; + if (here->BSIM4v6rbps < 1.0e-3) + here->BSIM4v6grbps = 1.0e3; + else + here->BSIM4v6grbps = model->BSIM4v6gbmin + 1.0 / here->BSIM4v6rbps; + if (here->BSIM4v6rbsb < 1.0e-3) + here->BSIM4v6grbsb = 1.0e3; + else + here->BSIM4v6grbsb = model->BSIM4v6gbmin + 1.0 / here->BSIM4v6rbsb; + if (here->BSIM4v6rbpd < 1.0e-3) + here->BSIM4v6grbpd = 1.0e3; + else + here->BSIM4v6grbpd = model->BSIM4v6gbmin + 1.0 / here->BSIM4v6rbpd; + + } + + if((here->BSIM4v6rbodyMod == 2) && (bodymode == 3)) + { + here->BSIM4v6grbdb = here->BSIM4v6grbsb = model->BSIM4v6gbmin; + if (here->BSIM4v6rbpb < 1.0e-3) + here->BSIM4v6grbpb = 1.0e3; + else + here->BSIM4v6grbpb = model->BSIM4v6gbmin + 1.0 / here->BSIM4v6rbpb; + if (here->BSIM4v6rbps < 1.0e-3) + here->BSIM4v6grbps = 1.0e3; + else + here->BSIM4v6grbps = model->BSIM4v6gbmin + 1.0 / here->BSIM4v6rbps; + if (here->BSIM4v6rbpd < 1.0e-3) + here->BSIM4v6grbpd = 1.0e3; + else + here->BSIM4v6grbpd = model->BSIM4v6gbmin + 1.0 / here->BSIM4v6rbpd; + } + + if((here->BSIM4v6rbodyMod == 2) && (bodymode == 1)) + { + here->BSIM4v6grbdb = here->BSIM4v6grbsb = model->BSIM4v6gbmin; + here->BSIM4v6grbps = here->BSIM4v6grbpd = 1.0e3; + if (here->BSIM4v6rbpb < 1.0e-3) + here->BSIM4v6grbpb = 1.0e3; + else + here->BSIM4v6grbpb = model->BSIM4v6gbmin + 1.0 / here->BSIM4v6rbpb; + } + + + /* + * Process geomertry dependent parasitics + */ + + here->BSIM4v6grgeltd = model->BSIM4v6rshg * (here->BSIM4v6xgw + + pParam->BSIM4v6weffCJ / 3.0 / here->BSIM4v6ngcon) / + (here->BSIM4v6ngcon * here->BSIM4v6nf * + (Lnew - model->BSIM4v6xgl)); + if (here->BSIM4v6grgeltd > 0.0) + here->BSIM4v6grgeltd = 1.0 / here->BSIM4v6grgeltd; + else + { here->BSIM4v6grgeltd = 1.0e3; /* mho */ + if (here->BSIM4v6rgateMod != 0) + printf("Warning: The gate conductance reset to 1.0e3 mho.\n"); + } + + DMCGeff = model->BSIM4v6dmcg - model->BSIM4v6dmcgt; + DMCIeff = model->BSIM4v6dmci; + DMDGeff = model->BSIM4v6dmdg - model->BSIM4v6dmcgt; + + if (here->BSIM4v6sourcePerimeterGiven) + { + if(here->BSIM4v6sourcePerimeter == 0.0) + here->BSIM4v6Pseff = 0.0; + else if (here->BSIM4v6sourcePerimeter < 0.0) + { + printf("Warning: Source Perimeter is specified as negative, it is set to zero.\n"); + here->BSIM4v6Pseff = 0.0; + } + else + { + if (model->BSIM4v6perMod == 0) + here->BSIM4v6Pseff = here->BSIM4v6sourcePerimeter; + else + here->BSIM4v6Pseff = here->BSIM4v6sourcePerimeter + - pParam->BSIM4v6weffCJ * here->BSIM4v6nf; + } + } + else + BSIM4v6PAeffGeo(here->BSIM4v6nf, here->BSIM4v6geoMod, here->BSIM4v6min, + pParam->BSIM4v6weffCJ, DMCGeff, DMCIeff, DMDGeff, + &(here->BSIM4v6Pseff), &dumPd, &dumAs, &dumAd); + if (here->BSIM4v6Pseff < 0.0) /*4.6.2*/ + here->BSIM4v6Pseff = 0.0; + + if (here->BSIM4v6drainPerimeterGiven) + { + if(here->BSIM4v6drainPerimeter == 0.0) + here->BSIM4v6Pdeff = 0.0; + else if (here->BSIM4v6drainPerimeter < 0.0) + { + printf("Warning: Drain Perimeter is specified as negative, it is set to zero\n"); + here->BSIM4v6Pdeff = 0.0; + } + else + { + if (model->BSIM4v6perMod == 0) + here->BSIM4v6Pdeff = here->BSIM4v6drainPerimeter; + else + here->BSIM4v6Pdeff = here->BSIM4v6drainPerimeter + - pParam->BSIM4v6weffCJ * here->BSIM4v6nf; + } + } + else + BSIM4v6PAeffGeo(here->BSIM4v6nf, here->BSIM4v6geoMod, here->BSIM4v6min, + pParam->BSIM4v6weffCJ, DMCGeff, DMCIeff, DMDGeff, + &dumPs, &(here->BSIM4v6Pdeff), &dumAs, &dumAd); + if (here->BSIM4v6Pdeff < 0.0) /*4.6.2*/ + here->BSIM4v6Pdeff = 0.0; + + if (here->BSIM4v6sourceAreaGiven) + here->BSIM4v6Aseff = here->BSIM4v6sourceArea; + else + BSIM4v6PAeffGeo(here->BSIM4v6nf, here->BSIM4v6geoMod, here->BSIM4v6min, + pParam->BSIM4v6weffCJ, DMCGeff, DMCIeff, DMDGeff, + &dumPs, &dumPd, &(here->BSIM4v6Aseff), &dumAd); + + if (here->BSIM4v6drainAreaGiven) + here->BSIM4v6Adeff = here->BSIM4v6drainArea; + else + BSIM4v6PAeffGeo(here->BSIM4v6nf, here->BSIM4v6geoMod, here->BSIM4v6min, + pParam->BSIM4v6weffCJ, DMCGeff, DMCIeff, DMDGeff, + &dumPs, &dumPd, &dumAs, &(here->BSIM4v6Adeff)); + + /* Processing S/D resistance and conductance below */ + if(here->BSIM4v6sNodePrime != here->BSIM4v6sNode) + { + here->BSIM4v6sourceConductance = 0.0; + if(here->BSIM4v6sourceSquaresGiven) + { + here->BSIM4v6sourceConductance = model->BSIM4v6sheetResistance + * here->BSIM4v6sourceSquares; + } else if (here->BSIM4v6rgeoMod > 0) + { + BSIM4v6RdseffGeo(here->BSIM4v6nf, here->BSIM4v6geoMod, + here->BSIM4v6rgeoMod, here->BSIM4v6min, + pParam->BSIM4v6weffCJ, model->BSIM4v6sheetResistance, + DMCGeff, DMCIeff, DMDGeff, 1, &(here->BSIM4v6sourceConductance)); + } else + { + here->BSIM4v6sourceConductance = 0.0; + } + + if (here->BSIM4v6sourceConductance > 0.0) + here->BSIM4v6sourceConductance = 1.0 + / here->BSIM4v6sourceConductance; + else + { + here->BSIM4v6sourceConductance = 1.0e3; /* mho */ + printf ("Warning: Source conductance reset to 1.0e3 mho.\n"); + } + } else + { + here->BSIM4v6sourceConductance = 0.0; + } + + if(here->BSIM4v6dNodePrime != here->BSIM4v6dNode) + { + here->BSIM4v6drainConductance = 0.0; + if(here->BSIM4v6drainSquaresGiven) + { + here->BSIM4v6drainConductance = model->BSIM4v6sheetResistance + * here->BSIM4v6drainSquares; + } else if (here->BSIM4v6rgeoMod > 0) + { + BSIM4v6RdseffGeo(here->BSIM4v6nf, here->BSIM4v6geoMod, + here->BSIM4v6rgeoMod, here->BSIM4v6min, + pParam->BSIM4v6weffCJ, model->BSIM4v6sheetResistance, + DMCGeff, DMCIeff, DMDGeff, 0, &(here->BSIM4v6drainConductance)); + } else + { + here->BSIM4v6drainConductance = 0.0; + } + + if (here->BSIM4v6drainConductance > 0.0) + here->BSIM4v6drainConductance = 1.0 + / here->BSIM4v6drainConductance; + else + { + here->BSIM4v6drainConductance = 1.0e3; /* mho */ + printf ("Warning: Drain conductance reset to 1.0e3 mho.\n"); + } + } else + { + here->BSIM4v6drainConductance = 0.0; + } + + /* End of Rsd processing */ + + + Nvtms = model->BSIM4v6vtm * model->BSIM4v6SjctEmissionCoeff; + if ((here->BSIM4v6Aseff <= 0.0) && (here->BSIM4v6Pseff <= 0.0)) + { SourceSatCurrent = 0.0; + } + else + { SourceSatCurrent = here->BSIM4v6Aseff * model->BSIM4v6SjctTempSatCurDensity + + here->BSIM4v6Pseff * model->BSIM4v6SjctSidewallTempSatCurDensity + + pParam->BSIM4v6weffCJ * here->BSIM4v6nf + * model->BSIM4v6SjctGateSidewallTempSatCurDensity; + } + if (SourceSatCurrent > 0.0) + { switch(model->BSIM4v6dioMod) + { case 0: + if ((model->BSIM4v6bvs / Nvtms) > EXP_THRESHOLD) + here->BSIM4v6XExpBVS = model->BSIM4v6xjbvs * MIN_EXP; + else + here->BSIM4v6XExpBVS = model->BSIM4v6xjbvs * exp(-model->BSIM4v6bvs / Nvtms); + break; + case 1: + BSIM4v6DioIjthVjmEval(Nvtms, model->BSIM4v6ijthsfwd, SourceSatCurrent, + 0.0, &(here->BSIM4v6vjsmFwd)); + here->BSIM4v6IVjsmFwd = SourceSatCurrent * exp(here->BSIM4v6vjsmFwd / Nvtms); + break; + case 2: + if ((model->BSIM4v6bvs / Nvtms) > EXP_THRESHOLD) + { here->BSIM4v6XExpBVS = model->BSIM4v6xjbvs * MIN_EXP; + tmp = MIN_EXP; + } + else + { here->BSIM4v6XExpBVS = exp(-model->BSIM4v6bvs / Nvtms); + tmp = here->BSIM4v6XExpBVS; + here->BSIM4v6XExpBVS *= model->BSIM4v6xjbvs; + } + + BSIM4v6DioIjthVjmEval(Nvtms, model->BSIM4v6ijthsfwd, SourceSatCurrent, + here->BSIM4v6XExpBVS, &(here->BSIM4v6vjsmFwd)); + T0 = exp(here->BSIM4v6vjsmFwd / Nvtms); + here->BSIM4v6IVjsmFwd = SourceSatCurrent * (T0 - here->BSIM4v6XExpBVS / T0 + + here->BSIM4v6XExpBVS - 1.0); + here->BSIM4v6SslpFwd = SourceSatCurrent + * (T0 + here->BSIM4v6XExpBVS / T0) / Nvtms; + + T2 = model->BSIM4v6ijthsrev / SourceSatCurrent; + if (T2 < 1.0) + { T2 = 10.0; + fprintf(stderr, "Warning: ijthsrev too small and set to 10 times IsbSat.\n"); + } + here->BSIM4v6vjsmRev = -model->BSIM4v6bvs + - Nvtms * log((T2 - 1.0) / model->BSIM4v6xjbvs); + T1 = model->BSIM4v6xjbvs * exp(-(model->BSIM4v6bvs + + here->BSIM4v6vjsmRev) / Nvtms); + here->BSIM4v6IVjsmRev = SourceSatCurrent * (1.0 + T1); + here->BSIM4v6SslpRev = -SourceSatCurrent * T1 / Nvtms; + break; + default: + printf("Specified dioMod = %d not matched\n", model->BSIM4v6dioMod); + } + } + + Nvtmd = model->BSIM4v6vtm * model->BSIM4v6DjctEmissionCoeff; + if ((here->BSIM4v6Adeff <= 0.0) && (here->BSIM4v6Pdeff <= 0.0)) + { DrainSatCurrent = 0.0; + } + else + { DrainSatCurrent = here->BSIM4v6Adeff * model->BSIM4v6DjctTempSatCurDensity + + here->BSIM4v6Pdeff * model->BSIM4v6DjctSidewallTempSatCurDensity + + pParam->BSIM4v6weffCJ * here->BSIM4v6nf + * model->BSIM4v6DjctGateSidewallTempSatCurDensity; + } + if (DrainSatCurrent > 0.0) + { switch(model->BSIM4v6dioMod) + { case 0: + if ((model->BSIM4v6bvd / Nvtmd) > EXP_THRESHOLD) + here->BSIM4v6XExpBVD = model->BSIM4v6xjbvd * MIN_EXP; + else + here->BSIM4v6XExpBVD = model->BSIM4v6xjbvd * exp(-model->BSIM4v6bvd / Nvtmd); + break; + case 1: + BSIM4v6DioIjthVjmEval(Nvtmd, model->BSIM4v6ijthdfwd, DrainSatCurrent, + 0.0, &(here->BSIM4v6vjdmFwd)); + here->BSIM4v6IVjdmFwd = DrainSatCurrent * exp(here->BSIM4v6vjdmFwd / Nvtmd); + break; + case 2: + if ((model->BSIM4v6bvd / Nvtmd) > EXP_THRESHOLD) + { here->BSIM4v6XExpBVD = model->BSIM4v6xjbvd * MIN_EXP; + tmp = MIN_EXP; + } + else + { here->BSIM4v6XExpBVD = exp(-model->BSIM4v6bvd / Nvtmd); + tmp = here->BSIM4v6XExpBVD; + here->BSIM4v6XExpBVD *= model->BSIM4v6xjbvd; + } + + BSIM4v6DioIjthVjmEval(Nvtmd, model->BSIM4v6ijthdfwd, DrainSatCurrent, + here->BSIM4v6XExpBVD, &(here->BSIM4v6vjdmFwd)); + T0 = exp(here->BSIM4v6vjdmFwd / Nvtmd); + here->BSIM4v6IVjdmFwd = DrainSatCurrent * (T0 - here->BSIM4v6XExpBVD / T0 + + here->BSIM4v6XExpBVD - 1.0); + here->BSIM4v6DslpFwd = DrainSatCurrent + * (T0 + here->BSIM4v6XExpBVD / T0) / Nvtmd; + + T2 = model->BSIM4v6ijthdrev / DrainSatCurrent; + if (T2 < 1.0) + { T2 = 10.0; + fprintf(stderr, "Warning: ijthdrev too small and set to 10 times IdbSat.\n"); + } + here->BSIM4v6vjdmRev = -model->BSIM4v6bvd + - Nvtmd * log((T2 - 1.0) / model->BSIM4v6xjbvd); /* bugfix */ + T1 = model->BSIM4v6xjbvd * exp(-(model->BSIM4v6bvd + + here->BSIM4v6vjdmRev) / Nvtmd); + here->BSIM4v6IVjdmRev = DrainSatCurrent * (1.0 + T1); + here->BSIM4v6DslpRev = -DrainSatCurrent * T1 / Nvtmd; + break; + default: + printf("Specified dioMod = %d not matched\n", model->BSIM4v6dioMod); + } + } + + /* GEDL current reverse bias */ + T0 = (TRatio - 1.0); + model->BSIM4v6njtsstemp = model->BSIM4v6njts * (1.0 + model->BSIM4v6tnjts * T0); + model->BSIM4v6njtsswstemp = model->BSIM4v6njtssw * (1.0 + model->BSIM4v6tnjtssw * T0); + model->BSIM4v6njtsswgstemp = model->BSIM4v6njtsswg * (1.0 + model->BSIM4v6tnjtsswg * T0); + model->BSIM4v6njtsdtemp = model->BSIM4v6njtsd * (1.0 + model->BSIM4v6tnjtsd * T0); + model->BSIM4v6njtsswdtemp = model->BSIM4v6njtsswd * (1.0 + model->BSIM4v6tnjtsswd * T0); + model->BSIM4v6njtsswgdtemp = model->BSIM4v6njtsswgd * (1.0 + model->BSIM4v6tnjtsswgd * T0); + T7 = Eg0 / model->BSIM4v6vtm * T0; + T9 = model->BSIM4v6xtss * T7; + DEXP(T9, T1); + T9 = model->BSIM4v6xtsd * T7; + DEXP(T9, T2); + T9 = model->BSIM4v6xtssws * T7; + DEXP(T9, T3); + T9 = model->BSIM4v6xtsswd * T7; + DEXP(T9, T4); + T9 = model->BSIM4v6xtsswgs * T7; + DEXP(T9, T5); + T9 = model->BSIM4v6xtsswgd * T7; + DEXP(T9, T6); + /*IBM TAT*/ + if(model->BSIM4v6jtweff < 0.0) + { model->BSIM4v6jtweff = 0.0; + fprintf(stderr, "TAT width dependence effect is negative. Jtweff is clamped to zero.\n"); + } + T11 = sqrt(model->BSIM4v6jtweff / pParam->BSIM4v6weffCJ) + 1.0; + + T10 = pParam->BSIM4v6weffCJ * here->BSIM4v6nf; + here->BSIM4v6SjctTempRevSatCur = T1 * here->BSIM4v6Aseff * model->BSIM4v6jtss; + here->BSIM4v6DjctTempRevSatCur = T2 * here->BSIM4v6Adeff * model->BSIM4v6jtsd; + here->BSIM4v6SswTempRevSatCur = T3 * here->BSIM4v6Pseff * model->BSIM4v6jtssws; + here->BSIM4v6DswTempRevSatCur = T4 * here->BSIM4v6Pdeff * model->BSIM4v6jtsswd; + here->BSIM4v6SswgTempRevSatCur = T5 * T10 * T11 * model->BSIM4v6jtsswgs; + here->BSIM4v6DswgTempRevSatCur = T6 * T10 * T11 * model->BSIM4v6jtsswgd; + + /*high k*/ + /*Calculate VgsteffVth for mobMod=3*/ + if(model->BSIM4v6mobMod==3) + { /*Calculate n @ Vbs=Vds=0*/ + V0 = pParam->BSIM4v6vbi - pParam->BSIM4v6phi; + lt1 = model->BSIM4v6factor1* pParam->BSIM4v6sqrtXdep0; + ltw = lt1; + T0 = pParam->BSIM4v6dvt1 * pParam->BSIM4v6leff / lt1; + if (T0 < EXP_THRESHOLD) + { + T1 = exp(T0); + T2 = T1 - 1.0; + T3 = T2 * T2; + T4 = T3 + 2.0 * T1 * MIN_EXP; + Theta0 = T1 / T4; + } + else + Theta0 = 1.0 / (MAX_EXP - 2.0); + + tmp1 = epssub / pParam->BSIM4v6Xdep0; + here->BSIM4v6nstar = model->BSIM4v6vtm / Charge_q * + (model->BSIM4v6coxe + tmp1 + pParam->BSIM4v6cit); + tmp2 = pParam->BSIM4v6nfactor * tmp1; + tmp3 = (tmp2 + pParam->BSIM4v6cdsc * Theta0 + pParam->BSIM4v6cit) / model->BSIM4v6coxe; + if (tmp3 >= -0.5) + n0 = 1.0 + tmp3; + else + { + T0 = 1.0 / (3.0 + 8.0 * tmp3); + n0 = (1.0 + 3.0 * tmp3) * T0; + } + + T0 = n0 * model->BSIM4v6vtm; + T1 = pParam->BSIM4v6voffcbn; + T2 = T1/T0; + if (T2 < -EXP_THRESHOLD) + { T3 = model->BSIM4v6coxe * MIN_EXP / pParam->BSIM4v6cdep0; + T4 = pParam->BSIM4v6mstar + T3 * n0; + } + else if (T2 > EXP_THRESHOLD) + { T3 = model->BSIM4v6coxe * MAX_EXP / pParam->BSIM4v6cdep0; + T4 = pParam->BSIM4v6mstar + T3 * n0; + } + else + { T3 = exp(T2)* model->BSIM4v6coxe / pParam->BSIM4v6cdep0; + T4 = pParam->BSIM4v6mstar + T3 * n0; + + } + pParam->BSIM4v6VgsteffVth = T0 * log(2.0)/T4; + + } + + if(model->BSIM4v6mtrlMod) + { + /* Calculate TOXP from EOT */ + /* Calculate Vgs_eff @ Vgs = VDD with Poly Depletion Effect */ + Vtm0eot = KboQ * model->BSIM4v6tempeot; + Vtmeot = Vtm0eot; + vbieot = Vtm0eot * log(pParam->BSIM4v6nsd + * pParam->BSIM4v6ndep / (ni * ni)); + phieot = Vtm0eot * log(pParam->BSIM4v6ndep / ni) + + pParam->BSIM4v6phin + 0.4; + tmp2 = here->BSIM4v6vfb + phieot; + vddeot = model->BSIM4v6type * model->BSIM4v6vddeot; + T0 = model->BSIM4v6epsrgate * EPS0; + if ((pParam->BSIM4v6ngate > 1.0e18) && (pParam->BSIM4v6ngate < 1.0e25) + && (vddeot > tmp2) && (T0!=0)) + { + T1 = 1.0e6 * CHARGE * T0 * pParam->BSIM4v6ngate / + (model->BSIM4v6coxe * model->BSIM4v6coxe); + T8 = vddeot - tmp2; + T4 = sqrt(1.0 + 2.0 * T8 / T1); + T2 = 2.0 * T8 / (T4 + 1.0); + T3 = 0.5 * T2 * T2 / T1; + T7 = 1.12 - T3 - 0.05; + T6 = sqrt(T7 * T7 + 0.224); + T5 = 1.12 - 0.5 * (T7 + T6); + Vgs_eff = vddeot - T5; + } + else + Vgs_eff = vddeot; + + /* Calculate Vth @ Vds=Vbs=0 */ + + V0 = vbieot - phieot; + lt1 = model->BSIM4v6factor1* pParam->BSIM4v6sqrtXdep0; + ltw = lt1; + T0 = pParam->BSIM4v6dvt1 * model->BSIM4v6leffeot / lt1; + if (T0 < EXP_THRESHOLD) + { + T1 = exp(T0); + T2 = T1 - 1.0; + T3 = T2 * T2; + T4 = T3 + 2.0 * T1 * MIN_EXP; + Theta0 = T1 / T4; + } + else + Theta0 = 1.0 / (MAX_EXP - 2.0); + Delt_vth = pParam->BSIM4v6dvt0 * Theta0 * V0; + T0 = pParam->BSIM4v6dvt1w * model->BSIM4v6weffeot * model->BSIM4v6leffeot / ltw; + if (T0 < EXP_THRESHOLD) + { T1 = exp(T0); + T2 = T1 - 1.0; + T3 = T2 * T2; + T4 = T3 + 2.0 * T1 * MIN_EXP; + T5 = T1 / T4; + } + else + T5 = 1.0 / (MAX_EXP - 2.0); /* 3.0 * MIN_EXP omitted */ + T2 = pParam->BSIM4v6dvt0w * T5 * V0; + TempRatioeot = model->BSIM4v6tempeot / model->BSIM4v6tnom - 1.0; + T0 = sqrt(1.0 + pParam->BSIM4v6lpe0 / model->BSIM4v6leffeot); + T1 = pParam->BSIM4v6k1ox * (T0 - 1.0) * sqrt(phieot) + + (pParam->BSIM4v6kt1 + pParam->BSIM4v6kt1l / model->BSIM4v6leffeot) * TempRatioeot; + Vth_NarrowW = toxe * phieot + / (model->BSIM4v6weffeot + pParam->BSIM4v6w0); + Lpe_Vb = sqrt(1.0 + pParam->BSIM4v6lpeb / model->BSIM4v6leffeot); + Vth = model->BSIM4v6type * here->BSIM4v6vth0 + + (pParam->BSIM4v6k1ox - pParam->BSIM4v6k1)*sqrt(phieot)*Lpe_Vb + - Delt_vth - T2 + pParam->BSIM4v6k3 * Vth_NarrowW + T1; + + /* Calculate n */ + tmp1 = epssub / pParam->BSIM4v6Xdep0; + here->BSIM4v6nstar = Vtmeot / Charge_q * + (model->BSIM4v6coxe + tmp1 + pParam->BSIM4v6cit); + tmp2 = pParam->BSIM4v6nfactor * tmp1; + tmp3 = (tmp2 + pParam->BSIM4v6cdsc * Theta0 + pParam->BSIM4v6cit) / model->BSIM4v6coxe; + if (tmp3 >= -0.5) + n = 1.0 + tmp3; + else + { + T0 = 1.0 / (3.0 + 8.0 * tmp3); + n = (1.0 + 3.0 * tmp3) * T0; + } + + /* Vth correction for Pocket implant */ + if (pParam->BSIM4v6dvtp0 > 0.0) + { + T3 = model->BSIM4v6leffeot + pParam->BSIM4v6dvtp0 * 2.0; + if (model->BSIM4v6tempMod < 2) + T4 = Vtmeot * log(model->BSIM4v6leffeot / T3); + else + T4 = Vtm0eot * log(model->BSIM4v6leffeot / T3); + Vth -= n * T4; + } + Vgsteff = Vgs_eff-Vth; + /* calculating Toxp */ + T3 = model->BSIM4v6type * here->BSIM4v6vth0 + - here->BSIM4v6vfb - phieot; + T4 = T3 + T3; + T5 = 2.5 * T3; + + vtfbphi2eot = 4.0 * T3; + if (vtfbphi2eot < 0.0) + vtfbphi2eot = 0.0; + + + niter = 0; + toxpf = toxe; + do + { + toxpi = toxpf; + tmp2 = 2.0e8 * toxpf; + T0 = (Vgsteff + vtfbphi2eot) / tmp2; + T1 = 1.0 + exp(model->BSIM4v6bdos * 0.7 * log(T0)); + Tcen = model->BSIM4v6ados * 1.9e-9 / T1; + toxpf = toxe - epsrox/model->BSIM4v6epsrsub * Tcen; + niter++; + } while ((niter<=4)&&(ABS(toxpf-toxpi)>1e-12)); + model->BSIM4v6toxp = toxpf; + model->BSIM4v6coxp = epsrox * EPS0 / model->BSIM4v6toxp; + } + + if (BSIM4v6checkModel(model, here, ckt)) + { IFuid namarray[2]; + namarray[0] = model->BSIM4v6modName; + namarray[1] = here->BSIM4v6name; + SPfrontEnd->IFerror (ERR_FATAL, "Fatal error(s) detected during BSIM4.6.4 parameter checking for %s in model %s", namarray); + return(E_BADPARM); + } + } /* End instance */ + } + return(OK); +} diff --git a/src/spicelib/devices/bsim4v6/b4v6trunc.c b/src/spicelib/devices/bsim4v6/b4v6trunc.c new file mode 100644 index 000000000..18e94cf30 --- /dev/null +++ b/src/spicelib/devices/bsim4v6/b4v6trunc.c @@ -0,0 +1,61 @@ +/**** BSIM4.6.2 Released by Wenwei Yang 07/31/2008 ****/ + +/********** + * Copyright 2006 Regents of the University of California. All rights reserved. + * File: b4trunc.c of BSIM4.6.2. + * Author: 2000 Weidong Liu + * Authors: 2001- Xuemei Xi, Mohan Dunga, Ali Niknejad, Chenming Hu. + * Authors: 2006- Mohan Dunga, Ali Niknejad, Chenming Hu + * Authors: 2007- Mohan Dunga, Wenwei Yang, Ali Niknejad, Chenming Hu + * Project Director: Prof. Chenming Hu. + **********/ + +#include "ngspice.h" +#include "cktdefs.h" +#include "bsim4v6def.h" +#include "sperror.h" +#include "suffix.h" + + +int +BSIM4v6trunc( +GENmodel *inModel, +CKTcircuit *ckt, +double *timeStep) +{ +BSIM4v6model *model = (BSIM4v6model*)inModel; +BSIM4v6instance *here; + +#ifdef STEPDEBUG + double debugtemp; +#endif /* STEPDEBUG */ + + for (; model != NULL; model = model->BSIM4v6nextModel) + { for (here = model->BSIM4v6instances; here != NULL; + here = here->BSIM4v6nextInstance) + { + if (here->BSIM4v6owner != ARCHme) continue; +#ifdef STEPDEBUG + debugtemp = *timeStep; +#endif /* STEPDEBUG */ + CKTterr(here->BSIM4v6qb,ckt,timeStep); + CKTterr(here->BSIM4v6qg,ckt,timeStep); + CKTterr(here->BSIM4v6qd,ckt,timeStep); + if (here->BSIM4v6trnqsMod) + CKTterr(here->BSIM4v6qcdump,ckt,timeStep); + if (here->BSIM4v6rbodyMod) + { CKTterr(here->BSIM4v6qbs,ckt,timeStep); + CKTterr(here->BSIM4v6qbd,ckt,timeStep); + } + if (here->BSIM4v6rgateMod == 3) + CKTterr(here->BSIM4v6qgmid,ckt,timeStep); +#ifdef STEPDEBUG + if(debugtemp != *timeStep) + { printf("device %s reduces step from %g to %g\n", + here->BSIM4v6name,debugtemp,*timeStep); + } +#endif /* STEPDEBUG */ + } + } + return(OK); +} diff --git a/src/spicelib/devices/bsim4v6/bsim4v6def.h b/src/spicelib/devices/bsim4v6/bsim4v6def.h new file mode 100644 index 000000000..773fed08d --- /dev/null +++ b/src/spicelib/devices/bsim4v6/bsim4v6def.h @@ -0,0 +1,3568 @@ +/**** BSIM4.6.2 Released by Wenwei Yang 07/31/2008 ****/ +/**** OpenMP support for ngspice by Holger Vogt 06/28/2010 ****/ +/********** +Copyright 2006 Regents of the University of California. All rights reserved. +File: bsim4v6def.h +Author: 2000 Weidong Liu. +Authors: 2001- Xuemei Xi, Mohan Dunga, Ali Niknejad, Chenming Hu. +Authors: 2006- Mohan Dunga, Ali Niknejad, Chenming Hu +Authors: 2007- Mohan Dunga, Wenwei Yang, Ali Niknejad, Chenming Hu +Authors: 2008- Wenwei Yang, Ali Niknejad, Chenming Hu +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. +Modified by Mohan Dunga, 12/13/2006 +Modified by Mohan Dunga, Wenwei Yang, 05/18/2007. +Modified by Wenwei Yang, 07/31/2008. +**********/ + +#ifndef BSIM4v6 +#define BSIM4v6 + +#include "ifsim.h" +#include "gendefs.h" +#include "cktdefs.h" +#include "complex.h" +#include "noisedef.h" + +#ifdef USE_OMP +#define USE_OMP4 +#endif + + +#ifdef USE_OMP4 +#include +#endif + +typedef struct sBSIM4v6instance +{ + struct sBSIM4v6model *BSIM4v6modPtr; + struct sBSIM4v6instance *BSIM4v6nextInstance; + IFuid BSIM4v6name; + int BSIM4v6owner; /* Number of owner process */ + int BSIM4v6states; /* index into state table for this device */ + int BSIM4v6dNode; + int BSIM4v6gNodeExt; + int BSIM4v6sNode; + int BSIM4v6bNode; + int BSIM4v6dNodePrime; + int BSIM4v6gNodePrime; + int BSIM4v6gNodeMid; + int BSIM4v6sNodePrime; + int BSIM4v6bNodePrime; + int BSIM4v6dbNode; + int BSIM4v6sbNode; + int BSIM4v6qNode; + + double BSIM4v6ueff; + double BSIM4v6thetavth; + double BSIM4v6von; + double BSIM4v6vdsat; + double BSIM4v6cgdo; + double BSIM4v6qgdo; + double BSIM4v6cgso; + double BSIM4v6qgso; + double BSIM4v6grbsb; + double BSIM4v6grbdb; + double BSIM4v6grbpb; + double BSIM4v6grbps; + double BSIM4v6grbpd; + + double BSIM4v6vjsmFwd; + double BSIM4v6vjsmRev; + double BSIM4v6vjdmFwd; + double BSIM4v6vjdmRev; + double BSIM4v6XExpBVS; + double BSIM4v6XExpBVD; + double BSIM4v6SslpFwd; + double BSIM4v6SslpRev; + double BSIM4v6DslpFwd; + double BSIM4v6DslpRev; + double BSIM4v6IVjsmFwd; + double BSIM4v6IVjsmRev; + double BSIM4v6IVjdmFwd; + double BSIM4v6IVjdmRev; + + double BSIM4v6grgeltd; + double BSIM4v6Pseff; + double BSIM4v6Pdeff; + double BSIM4v6Aseff; + double BSIM4v6Adeff; + + double BSIM4v6l; + double BSIM4v6w; + double BSIM4v6drainArea; + double BSIM4v6sourceArea; + double BSIM4v6drainSquares; + double BSIM4v6sourceSquares; + double BSIM4v6drainPerimeter; + double BSIM4v6sourcePerimeter; + double BSIM4v6sourceConductance; + double BSIM4v6drainConductance; + /* stress effect instance param */ + double BSIM4v6sa; + double BSIM4v6sb; + double BSIM4v6sd; + double BSIM4v6sca; + double BSIM4v6scb; + double BSIM4v6scc; + double BSIM4v6sc; + + double BSIM4v6rbdb; + double BSIM4v6rbsb; + double BSIM4v6rbpb; + double BSIM4v6rbps; + double BSIM4v6rbpd; + + double BSIM4v6delvto; + double BSIM4v6xgw; + double BSIM4v6ngcon; + + /* added here to account stress effect instance dependence */ + double BSIM4v6u0temp; + double BSIM4v6vsattemp; + double BSIM4v6vth0; + double BSIM4v6vfb; + double BSIM4v6vfbzb; + double BSIM4v6vtfbphi1; + double BSIM4v6vtfbphi2; + double BSIM4v6k2; + double BSIM4v6vbsc; + double BSIM4v6k2ox; + double BSIM4v6eta0; + + double BSIM4v6icVDS; + double BSIM4v6icVGS; + double BSIM4v6icVBS; + double BSIM4v6m; + double BSIM4v6nf; + int BSIM4v6off; + int BSIM4v6mode; + int BSIM4v6trnqsMod; + int BSIM4v6acnqsMod; + int BSIM4v6rbodyMod; + int BSIM4v6rgateMod; + int BSIM4v6geoMod; + int BSIM4v6rgeoMod; + int BSIM4v6min; + + + /* OP point */ + double BSIM4v6Vgsteff; + double BSIM4v6vgs_eff; + double BSIM4v6vgd_eff; + double BSIM4v6dvgs_eff_dvg; + double BSIM4v6dvgd_eff_dvg; + double BSIM4v6Vdseff; + double BSIM4v6nstar; + double BSIM4v6Abulk; + double BSIM4v6EsatL; + double BSIM4v6AbovVgst2Vtm; + double BSIM4v6qinv; + double BSIM4v6cd; + double BSIM4v6cbs; + double BSIM4v6cbd; + double BSIM4v6csub; + double BSIM4v6Igidl; + double BSIM4v6Igisl; + double BSIM4v6gm; + double BSIM4v6gds; + double BSIM4v6gmbs; + double BSIM4v6gbd; + double BSIM4v6gbs; + + double BSIM4v6gbbs; + double BSIM4v6gbgs; + double BSIM4v6gbds; + double BSIM4v6ggidld; + double BSIM4v6ggidlg; + double BSIM4v6ggidls; + double BSIM4v6ggidlb; + double BSIM4v6ggisld; + double BSIM4v6ggislg; + double BSIM4v6ggisls; + double BSIM4v6ggislb; + + double BSIM4v6Igcs; + double BSIM4v6gIgcsg; + double BSIM4v6gIgcsd; + double BSIM4v6gIgcss; + double BSIM4v6gIgcsb; + double BSIM4v6Igcd; + double BSIM4v6gIgcdg; + double BSIM4v6gIgcdd; + double BSIM4v6gIgcds; + double BSIM4v6gIgcdb; + + double BSIM4v6Igs; + double BSIM4v6gIgsg; + double BSIM4v6gIgss; + double BSIM4v6Igd; + double BSIM4v6gIgdg; + double BSIM4v6gIgdd; + + double BSIM4v6Igb; + double BSIM4v6gIgbg; + double BSIM4v6gIgbd; + double BSIM4v6gIgbs; + double BSIM4v6gIgbb; + + double BSIM4v6grdsw; + double BSIM4v6IdovVds; + double BSIM4v6gcrg; + double BSIM4v6gcrgd; + double BSIM4v6gcrgg; + double BSIM4v6gcrgs; + double BSIM4v6gcrgb; + + double BSIM4v6gstot; + double BSIM4v6gstotd; + double BSIM4v6gstotg; + double BSIM4v6gstots; + double BSIM4v6gstotb; + + double BSIM4v6gdtot; + double BSIM4v6gdtotd; + double BSIM4v6gdtotg; + double BSIM4v6gdtots; + double BSIM4v6gdtotb; + + double BSIM4v6cggb; + double BSIM4v6cgdb; + double BSIM4v6cgsb; + double BSIM4v6cbgb; + double BSIM4v6cbdb; + double BSIM4v6cbsb; + double BSIM4v6cdgb; + double BSIM4v6cddb; + double BSIM4v6cdsb; + double BSIM4v6csgb; + double BSIM4v6csdb; + double BSIM4v6cssb; + double BSIM4v6cgbb; + double BSIM4v6cdbb; + double BSIM4v6csbb; + double BSIM4v6cbbb; + double BSIM4v6capbd; + double BSIM4v6capbs; + + double BSIM4v6cqgb; + double BSIM4v6cqdb; + double BSIM4v6cqsb; + double BSIM4v6cqbb; + + double BSIM4v6qgate; + double BSIM4v6qbulk; + double BSIM4v6qdrn; + double BSIM4v6qsrc; + double BSIM4v6qdef; + + double BSIM4v6qchqs; + double BSIM4v6taunet; + double BSIM4v6gtau; + double BSIM4v6gtg; + double BSIM4v6gtd; + double BSIM4v6gts; + double BSIM4v6gtb; + double BSIM4v6SjctTempRevSatCur; + double BSIM4v6DjctTempRevSatCur; + double BSIM4v6SswTempRevSatCur; + double BSIM4v6DswTempRevSatCur; + double BSIM4v6SswgTempRevSatCur; + double BSIM4v6DswgTempRevSatCur; + + struct bsim4v6SizeDependParam *pParam; + + unsigned BSIM4v6lGiven :1; + unsigned BSIM4v6wGiven :1; + unsigned BSIM4v6mGiven :1; + unsigned BSIM4v6nfGiven :1; + unsigned BSIM4v6minGiven :1; + unsigned BSIM4v6drainAreaGiven :1; + unsigned BSIM4v6sourceAreaGiven :1; + unsigned BSIM4v6drainSquaresGiven :1; + unsigned BSIM4v6sourceSquaresGiven :1; + unsigned BSIM4v6drainPerimeterGiven :1; + unsigned BSIM4v6sourcePerimeterGiven :1; + unsigned BSIM4v6saGiven :1; + unsigned BSIM4v6sbGiven :1; + unsigned BSIM4v6sdGiven :1; + unsigned BSIM4v6scaGiven :1; + unsigned BSIM4v6scbGiven :1; + unsigned BSIM4v6sccGiven :1; + unsigned BSIM4v6scGiven :1; + unsigned BSIM4v6rbdbGiven :1; + unsigned BSIM4v6rbsbGiven :1; + unsigned BSIM4v6rbpbGiven :1; + unsigned BSIM4v6rbpdGiven :1; + unsigned BSIM4v6rbpsGiven :1; + unsigned BSIM4v6delvtoGiven :1; + unsigned BSIM4v6xgwGiven :1; + unsigned BSIM4v6ngconGiven :1; + unsigned BSIM4v6icVDSGiven :1; + unsigned BSIM4v6icVGSGiven :1; + unsigned BSIM4v6icVBSGiven :1; + unsigned BSIM4v6trnqsModGiven :1; + unsigned BSIM4v6acnqsModGiven :1; + unsigned BSIM4v6rbodyModGiven :1; + unsigned BSIM4v6rgateModGiven :1; + unsigned BSIM4v6geoModGiven :1; + unsigned BSIM4v6rgeoModGiven :1; + + + double *BSIM4v6DPdPtr; + double *BSIM4v6DPdpPtr; + double *BSIM4v6DPgpPtr; + double *BSIM4v6DPgmPtr; + double *BSIM4v6DPspPtr; + double *BSIM4v6DPbpPtr; + double *BSIM4v6DPdbPtr; + + double *BSIM4v6DdPtr; + double *BSIM4v6DdpPtr; + + double *BSIM4v6GPdpPtr; + double *BSIM4v6GPgpPtr; + double *BSIM4v6GPgmPtr; + double *BSIM4v6GPgePtr; + double *BSIM4v6GPspPtr; + double *BSIM4v6GPbpPtr; + + double *BSIM4v6GMdpPtr; + double *BSIM4v6GMgpPtr; + double *BSIM4v6GMgmPtr; + double *BSIM4v6GMgePtr; + double *BSIM4v6GMspPtr; + double *BSIM4v6GMbpPtr; + + double *BSIM4v6GEdpPtr; + double *BSIM4v6GEgpPtr; + double *BSIM4v6GEgmPtr; + double *BSIM4v6GEgePtr; + double *BSIM4v6GEspPtr; + double *BSIM4v6GEbpPtr; + + double *BSIM4v6SPdpPtr; + double *BSIM4v6SPgpPtr; + double *BSIM4v6SPgmPtr; + double *BSIM4v6SPsPtr; + double *BSIM4v6SPspPtr; + double *BSIM4v6SPbpPtr; + double *BSIM4v6SPsbPtr; + + double *BSIM4v6SspPtr; + double *BSIM4v6SsPtr; + + double *BSIM4v6BPdpPtr; + double *BSIM4v6BPgpPtr; + double *BSIM4v6BPgmPtr; + double *BSIM4v6BPspPtr; + double *BSIM4v6BPdbPtr; + double *BSIM4v6BPbPtr; + double *BSIM4v6BPsbPtr; + double *BSIM4v6BPbpPtr; + + double *BSIM4v6DBdpPtr; + double *BSIM4v6DBdbPtr; + double *BSIM4v6DBbpPtr; + double *BSIM4v6DBbPtr; + + double *BSIM4v6SBspPtr; + double *BSIM4v6SBbpPtr; + double *BSIM4v6SBbPtr; + double *BSIM4v6SBsbPtr; + + double *BSIM4v6BdbPtr; + double *BSIM4v6BbpPtr; + double *BSIM4v6BsbPtr; + double *BSIM4v6BbPtr; + + double *BSIM4v6DgpPtr; + double *BSIM4v6DspPtr; + double *BSIM4v6DbpPtr; + double *BSIM4v6SdpPtr; + double *BSIM4v6SgpPtr; + double *BSIM4v6SbpPtr; + + double *BSIM4v6QdpPtr; + double *BSIM4v6QgpPtr; + double *BSIM4v6QspPtr; + double *BSIM4v6QbpPtr; + double *BSIM4v6QqPtr; + double *BSIM4v6DPqPtr; + double *BSIM4v6GPqPtr; + double *BSIM4v6SPqPtr; + +#ifdef USE_OMP4 + /* per instance storage of results, to update matrix at a later stge */ + double BSIM4v6rhsdPrime; + double BSIM4v6rhsgPrime; + double BSIM4v6rhsgExt; + double BSIM4v6grhsMid; + double BSIM4v6rhsbPrime; + double BSIM4v6rhssPrime; + double BSIM4v6rhsdb; + double BSIM4v6rhssb; + double BSIM4v6rhsd; + double BSIM4v6rhss; + double BSIM4v6rhsq; + + double BSIM4v6_1; + double BSIM4v6_2; + double BSIM4v6_3; + double BSIM4v6_4; + double BSIM4v6_5; + double BSIM4v6_6; + double BSIM4v6_7; + double BSIM4v6_8; + double BSIM4v6_9; + double BSIM4v6_10; + double BSIM4v6_11; + double BSIM4v6_12; + double BSIM4v6_13; + double BSIM4v6_14; + double BSIM4v6_15; + double BSIM4v6_16; + double BSIM4v6_17; + double BSIM4v6_18; + double BSIM4v6_19; + double BSIM4v6_20; + double BSIM4v6_21; + double BSIM4v6_22; + double BSIM4v6_23; + double BSIM4v6_24; + double BSIM4v6_25; + double BSIM4v6_26; + double BSIM4v6_27; + double BSIM4v6_28; + double BSIM4v6_29; + double BSIM4v6_30; + double BSIM4v6_31; + double BSIM4v6_32; + double BSIM4v6_33; + double BSIM4v6_34; + double BSIM4v6_35; + double BSIM4v6_36; + double BSIM4v6_37; + double BSIM4v6_38; + double BSIM4v6_39; + double BSIM4v6_40; + double BSIM4v6_41; + double BSIM4v6_42; + double BSIM4v6_43; + double BSIM4v6_44; + double BSIM4v6_45; + double BSIM4v6_46; + double BSIM4v6_47; + double BSIM4v6_48; + double BSIM4v6_49; + double BSIM4v6_50; + double BSIM4v6_51; + double BSIM4v6_52; + double BSIM4v6_53; + double BSIM4v6_54; + double BSIM4v6_55; + double BSIM4v6_56; + double BSIM4v6_57; + double BSIM4v6_58; + double BSIM4v6_59; + double BSIM4v6_60; + double BSIM4v6_61; + double BSIM4v6_62; + double BSIM4v6_63; + double BSIM4v6_64; + double BSIM4v6_65; + double BSIM4v6_66; + double BSIM4v6_67; + double BSIM4v6_68; + double BSIM4v6_69; + double BSIM4v6_70; + double BSIM4v6_71; + double BSIM4v6_72; + double BSIM4v6_73; + double BSIM4v6_74; + double BSIM4v6_75; + double BSIM4v6_76; + double BSIM4v6_77; + double BSIM4v6_78; + double BSIM4v6_79; + double BSIM4v6_80; + double BSIM4v6_81; + double BSIM4v6_82; + double BSIM4v6_83; + double BSIM4v6_84; + double BSIM4v6_85; + double BSIM4v6_86; + double BSIM4v6_87; + double BSIM4v6_88; + double BSIM4v6_89; + double BSIM4v6_90; + double BSIM4v6_91; + double BSIM4v6_92; + double BSIM4v6_93; + double BSIM4v6_94; + double BSIM4v6_95; + double BSIM4v6_96; + double BSIM4v6_97; + double BSIM4v6_98; + double BSIM4v6_99; + double BSIM4v6_100; + double BSIM4v6_101; + double BSIM4v6_102; + double BSIM4v6_103; + +#endif + +#define BSIM4v6vbd BSIM4v6states+ 0 +#define BSIM4v6vbs BSIM4v6states+ 1 +#define BSIM4v6vgs BSIM4v6states+ 2 +#define BSIM4v6vds BSIM4v6states+ 3 +#define BSIM4v6vdbs BSIM4v6states+ 4 +#define BSIM4v6vdbd BSIM4v6states+ 5 +#define BSIM4v6vsbs BSIM4v6states+ 6 +#define BSIM4v6vges BSIM4v6states+ 7 +#define BSIM4v6vgms BSIM4v6states+ 8 +#define BSIM4v6vses BSIM4v6states+ 9 +#define BSIM4v6vdes BSIM4v6states+ 10 + +#define BSIM4v6qb BSIM4v6states+ 11 +#define BSIM4v6cqb BSIM4v6states+ 12 +#define BSIM4v6qg BSIM4v6states+ 13 +#define BSIM4v6cqg BSIM4v6states+ 14 +#define BSIM4v6qd BSIM4v6states+ 15 +#define BSIM4v6cqd BSIM4v6states+ 16 +#define BSIM4v6qgmid BSIM4v6states+ 17 +#define BSIM4v6cqgmid BSIM4v6states+ 18 + +#define BSIM4v6qbs BSIM4v6states+ 19 +#define BSIM4v6cqbs BSIM4v6states+ 20 +#define BSIM4v6qbd BSIM4v6states+ 21 +#define BSIM4v6cqbd BSIM4v6states+ 22 + +#define BSIM4v6qcheq BSIM4v6states+ 23 +#define BSIM4v6cqcheq BSIM4v6states+ 24 +#define BSIM4v6qcdump BSIM4v6states+ 25 +#define BSIM4v6cqcdump BSIM4v6states+ 26 +#define BSIM4v6qdef BSIM4v6states+ 27 +#define BSIM4v6qs BSIM4v6states+ 28 + +#define BSIM4v6numStates 29 + + +/* indices to the array of BSIM4v6 NOISE SOURCES */ + +#define BSIM4v6RDNOIZ 0 +#define BSIM4v6RSNOIZ 1 +#define BSIM4v6RGNOIZ 2 +#define BSIM4v6RBPSNOIZ 3 +#define BSIM4v6RBPDNOIZ 4 +#define BSIM4v6RBPBNOIZ 5 +#define BSIM4v6RBSBNOIZ 6 +#define BSIM4v6RBDBNOIZ 7 +#define BSIM4v6IDNOIZ 8 +#define BSIM4v6FLNOIZ 9 +#define BSIM4v6IGSNOIZ 10 +#define BSIM4v6IGDNOIZ 11 +#define BSIM4v6IGBNOIZ 12 +#define BSIM4v6TOTNOIZ 13 + +#define BSIM4v6NSRCS 14 /* Number of BSIM4v6 noise sources */ + +#ifndef NONOISE + double BSIM4v6nVar[NSTATVARS][BSIM4v6NSRCS]; +#else /* NONOISE */ + double **BSIM4v6nVar; +#endif /* NONOISE */ + +} BSIM4v6instance ; + +struct bsim4v6SizeDependParam +{ + double Width; + double Length; + double NFinger; + + double BSIM4v6cdsc; + double BSIM4v6cdscb; + double BSIM4v6cdscd; + double BSIM4v6cit; + double BSIM4v6nfactor; + double BSIM4v6xj; + double BSIM4v6vsat; + double BSIM4v6at; + double BSIM4v6a0; + double BSIM4v6ags; + double BSIM4v6a1; + double BSIM4v6a2; + double BSIM4v6keta; + double BSIM4v6nsub; + double BSIM4v6ndep; + double BSIM4v6nsd; + double BSIM4v6phin; + double BSIM4v6ngate; + double BSIM4v6gamma1; + double BSIM4v6gamma2; + double BSIM4v6vbx; + double BSIM4v6vbi; + double BSIM4v6vbm; + double BSIM4v6xt; + double BSIM4v6phi; + double BSIM4v6litl; + double BSIM4v6k1; + double BSIM4v6kt1; + double BSIM4v6kt1l; + double BSIM4v6kt2; + double BSIM4v6k2; + double BSIM4v6k3; + double BSIM4v6k3b; + double BSIM4v6w0; + double BSIM4v6dvtp0; + double BSIM4v6dvtp1; + double BSIM4v6lpe0; + double BSIM4v6lpeb; + double BSIM4v6dvt0; + double BSIM4v6dvt1; + double BSIM4v6dvt2; + double BSIM4v6dvt0w; + double BSIM4v6dvt1w; + double BSIM4v6dvt2w; + double BSIM4v6drout; + double BSIM4v6dsub; + double BSIM4v6vth0; + double BSIM4v6ua; + double BSIM4v6ua1; + double BSIM4v6ub; + double BSIM4v6ub1; + double BSIM4v6uc; + double BSIM4v6uc1; + double BSIM4v6ud; + double BSIM4v6ud1; + double BSIM4v6up; + double BSIM4v6lp; + double BSIM4v6u0; + double BSIM4v6eu; + double BSIM4v6ucs; + double BSIM4v6ute; + double BSIM4v6ucste; + double BSIM4v6voff; + double BSIM4v6tvoff; + double BSIM4v6minv; + double BSIM4v6minvcv; + double BSIM4v6vfb; + double BSIM4v6delta; + double BSIM4v6rdsw; + double BSIM4v6rds0; + double BSIM4v6rs0; + double BSIM4v6rd0; + double BSIM4v6rsw; + double BSIM4v6rdw; + double BSIM4v6prwg; + double BSIM4v6prwb; + double BSIM4v6prt; + double BSIM4v6eta0; + double BSIM4v6etab; + double BSIM4v6pclm; + double BSIM4v6pdibl1; + double BSIM4v6pdibl2; + double BSIM4v6pdiblb; + double BSIM4v6fprout; + double BSIM4v6pdits; + double BSIM4v6pditsd; + double BSIM4v6pscbe1; + double BSIM4v6pscbe2; + double BSIM4v6pvag; + double BSIM4v6wr; + double BSIM4v6dwg; + double BSIM4v6dwb; + double BSIM4v6b0; + double BSIM4v6b1; + double BSIM4v6alpha0; + double BSIM4v6alpha1; + double BSIM4v6beta0; + double BSIM4v6agidl; + double BSIM4v6bgidl; + double BSIM4v6cgidl; + double BSIM4v6egidl; + double BSIM4v6agisl; + double BSIM4v6bgisl; + double BSIM4v6cgisl; + double BSIM4v6egisl; + double BSIM4v6aigc; + double BSIM4v6bigc; + double BSIM4v6cigc; + double BSIM4v6aigs; + double BSIM4v6bigs; + double BSIM4v6cigs; + double BSIM4v6aigd; + double BSIM4v6bigd; + double BSIM4v6cigd; + double BSIM4v6aigbacc; + double BSIM4v6bigbacc; + double BSIM4v6cigbacc; + double BSIM4v6aigbinv; + double BSIM4v6bigbinv; + double BSIM4v6cigbinv; + double BSIM4v6nigc; + double BSIM4v6nigbacc; + double BSIM4v6nigbinv; + double BSIM4v6ntox; + double BSIM4v6eigbinv; + double BSIM4v6pigcd; + double BSIM4v6poxedge; + double BSIM4v6xrcrg1; + double BSIM4v6xrcrg2; + double BSIM4v6lambda; /* overshoot */ + double BSIM4v6vtl; /* thermal velocity limit */ + double BSIM4v6xn; /* back scattering parameter */ + double BSIM4v6lc; /* back scattering parameter */ + double BSIM4v6tfactor; /* ballistic transportation factor */ + double BSIM4v6vfbsdoff; /* S/D flatband offset voltage */ + double BSIM4v6tvfbsdoff; + +/* added for stress effect */ + double BSIM4v6ku0; + double BSIM4v6kvth0; + double BSIM4v6ku0temp; + double BSIM4v6rho_ref; + double BSIM4v6inv_od_ref; +/* added for well proximity effect */ + double BSIM4v6kvth0we; + double BSIM4v6k2we; + double BSIM4v6ku0we; + + /* CV model */ + double BSIM4v6cgsl; + double BSIM4v6cgdl; + double BSIM4v6ckappas; + double BSIM4v6ckappad; + double BSIM4v6cf; + double BSIM4v6clc; + double BSIM4v6cle; + double BSIM4v6vfbcv; + double BSIM4v6noff; + double BSIM4v6voffcv; + double BSIM4v6acde; + double BSIM4v6moin; + +/* Pre-calculated constants */ + + double BSIM4v6dw; + double BSIM4v6dl; + double BSIM4v6leff; + double BSIM4v6weff; + + double BSIM4v6dwc; + double BSIM4v6dlc; + double BSIM4v6dwj; + double BSIM4v6leffCV; + double BSIM4v6weffCV; + double BSIM4v6weffCJ; + double BSIM4v6abulkCVfactor; + double BSIM4v6cgso; + double BSIM4v6cgdo; + double BSIM4v6cgbo; + + double BSIM4v6u0temp; + double BSIM4v6vsattemp; + double BSIM4v6sqrtPhi; + double BSIM4v6phis3; + double BSIM4v6Xdep0; + double BSIM4v6sqrtXdep0; + double BSIM4v6theta0vb0; + double BSIM4v6thetaRout; + double BSIM4v6mstar; + double BSIM4v6VgsteffVth; + double BSIM4v6mstarcv; + double BSIM4v6voffcbn; + double BSIM4v6voffcbncv; + double BSIM4v6rdswmin; + double BSIM4v6rdwmin; + double BSIM4v6rswmin; + double BSIM4v6vfbsd; + + double BSIM4v6cof1; + double BSIM4v6cof2; + double BSIM4v6cof3; + double BSIM4v6cof4; + double BSIM4v6cdep0; + double BSIM4v6ToxRatio; + double BSIM4v6Aechvb; + double BSIM4v6Bechvb; + double BSIM4v6ToxRatioEdge; + double BSIM4v6AechvbEdgeS; + double BSIM4v6AechvbEdgeD; + double BSIM4v6BechvbEdge; + double BSIM4v6ldeb; + double BSIM4v6k1ox; + double BSIM4v6k2ox; + double BSIM4v6vfbzbfactor; + + struct bsim4v6SizeDependParam *pNext; +}; + + +typedef struct sBSIM4v6model +{ + int BSIM4v6modType; + struct sBSIM4v6model *BSIM4v6nextModel; + BSIM4v6instance *BSIM4v6instances; + IFuid BSIM4v6modName; + int BSIM4v6type; + + int BSIM4v6mobMod; + int BSIM4v6cvchargeMod; + int BSIM4v6capMod; + int BSIM4v6dioMod; + int BSIM4v6trnqsMod; + int BSIM4v6acnqsMod; + int BSIM4v6fnoiMod; + int BSIM4v6tnoiMod; + int BSIM4v6rdsMod; + int BSIM4v6rbodyMod; + int BSIM4v6rgateMod; + int BSIM4v6perMod; + int BSIM4v6geoMod; + int BSIM4v6mtrlMod; + int BSIM4v6igcMod; + int BSIM4v6igbMod; + int BSIM4v6tempMod; + int BSIM4v6binUnit; + int BSIM4v6paramChk; + char *BSIM4v6version; + double BSIM4v6eot; + double BSIM4v6vddeot; + double BSIM4v6tempeot; + double BSIM4v6leffeot; + double BSIM4v6weffeot; + double BSIM4v6ados; + double BSIM4v6bdos; + double BSIM4v6toxe; + double BSIM4v6toxp; + double BSIM4v6toxm; + double BSIM4v6dtox; + double BSIM4v6epsrox; + double BSIM4v6cdsc; + double BSIM4v6cdscb; + double BSIM4v6cdscd; + double BSIM4v6cit; + double BSIM4v6nfactor; + double BSIM4v6xj; + double BSIM4v6vsat; + double BSIM4v6at; + double BSIM4v6a0; + double BSIM4v6ags; + double BSIM4v6a1; + double BSIM4v6a2; + double BSIM4v6keta; + double BSIM4v6nsub; + double BSIM4v6phig; + double BSIM4v6epsrgate; + double BSIM4v6easub; + double BSIM4v6epsrsub; + double BSIM4v6ni0sub; + double BSIM4v6bg0sub; + double BSIM4v6tbgasub; + double BSIM4v6tbgbsub; + double BSIM4v6ndep; + double BSIM4v6nsd; + double BSIM4v6phin; + double BSIM4v6ngate; + double BSIM4v6gamma1; + double BSIM4v6gamma2; + double BSIM4v6vbx; + double BSIM4v6vbm; + double BSIM4v6xt; + double BSIM4v6k1; + double BSIM4v6kt1; + double BSIM4v6kt1l; + double BSIM4v6kt2; + double BSIM4v6k2; + double BSIM4v6k3; + double BSIM4v6k3b; + double BSIM4v6w0; + double BSIM4v6dvtp0; + double BSIM4v6dvtp1; + double BSIM4v6lpe0; + double BSIM4v6lpeb; + double BSIM4v6dvt0; + double BSIM4v6dvt1; + double BSIM4v6dvt2; + double BSIM4v6dvt0w; + double BSIM4v6dvt1w; + double BSIM4v6dvt2w; + double BSIM4v6drout; + double BSIM4v6dsub; + double BSIM4v6vth0; + double BSIM4v6eu; + double BSIM4v6ucs; + double BSIM4v6ua; + double BSIM4v6ua1; + double BSIM4v6ub; + double BSIM4v6ub1; + double BSIM4v6uc; + double BSIM4v6uc1; + double BSIM4v6ud; + double BSIM4v6ud1; + double BSIM4v6up; + double BSIM4v6lp; + double BSIM4v6u0; + double BSIM4v6ute; + double BSIM4v6ucste; + double BSIM4v6voff; + double BSIM4v6tvoff; + double BSIM4v6minv; + double BSIM4v6minvcv; + double BSIM4v6voffl; + double BSIM4v6voffcvl; + double BSIM4v6delta; + double BSIM4v6rdsw; + double BSIM4v6rdswmin; + double BSIM4v6rdwmin; + double BSIM4v6rswmin; + double BSIM4v6rsw; + double BSIM4v6rdw; + double BSIM4v6prwg; + double BSIM4v6prwb; + double BSIM4v6prt; + double BSIM4v6eta0; + double BSIM4v6etab; + double BSIM4v6pclm; + double BSIM4v6pdibl1; + double BSIM4v6pdibl2; + double BSIM4v6pdiblb; + double BSIM4v6fprout; + double BSIM4v6pdits; + double BSIM4v6pditsd; + double BSIM4v6pditsl; + double BSIM4v6pscbe1; + double BSIM4v6pscbe2; + double BSIM4v6pvag; + double BSIM4v6wr; + double BSIM4v6dwg; + double BSIM4v6dwb; + double BSIM4v6b0; + double BSIM4v6b1; + double BSIM4v6alpha0; + double BSIM4v6alpha1; + double BSIM4v6beta0; + double BSIM4v6agidl; + double BSIM4v6bgidl; + double BSIM4v6cgidl; + double BSIM4v6egidl; + double BSIM4v6agisl; + double BSIM4v6bgisl; + double BSIM4v6cgisl; + double BSIM4v6egisl; + double BSIM4v6aigc; + double BSIM4v6bigc; + double BSIM4v6cigc; + double BSIM4v6aigsd; + double BSIM4v6bigsd; + double BSIM4v6cigsd; + double BSIM4v6aigs; + double BSIM4v6bigs; + double BSIM4v6cigs; + double BSIM4v6aigd; + double BSIM4v6bigd; + double BSIM4v6cigd; + double BSIM4v6aigbacc; + double BSIM4v6bigbacc; + double BSIM4v6cigbacc; + double BSIM4v6aigbinv; + double BSIM4v6bigbinv; + double BSIM4v6cigbinv; + double BSIM4v6nigc; + double BSIM4v6nigbacc; + double BSIM4v6nigbinv; + double BSIM4v6ntox; + double BSIM4v6eigbinv; + double BSIM4v6pigcd; + double BSIM4v6poxedge; + double BSIM4v6toxref; + double BSIM4v6ijthdfwd; + double BSIM4v6ijthsfwd; + double BSIM4v6ijthdrev; + double BSIM4v6ijthsrev; + double BSIM4v6xjbvd; + double BSIM4v6xjbvs; + double BSIM4v6bvd; + double BSIM4v6bvs; + + double BSIM4v6jtss; + double BSIM4v6jtsd; + double BSIM4v6jtssws; + double BSIM4v6jtsswd; + double BSIM4v6jtsswgs; + double BSIM4v6jtsswgd; + double BSIM4v6jtweff; + double BSIM4v6njts; + double BSIM4v6njtssw; + double BSIM4v6njtsswg; + double BSIM4v6njtsd; + double BSIM4v6njtsswd; + double BSIM4v6njtsswgd; + double BSIM4v6xtss; + double BSIM4v6xtsd; + double BSIM4v6xtssws; + double BSIM4v6xtsswd; + double BSIM4v6xtsswgs; + double BSIM4v6xtsswgd; + double BSIM4v6tnjts; + double BSIM4v6tnjtssw; + double BSIM4v6tnjtsswg; + double BSIM4v6tnjtsd; + double BSIM4v6tnjtsswd; + double BSIM4v6tnjtsswgd; + double BSIM4v6vtss; + double BSIM4v6vtsd; + double BSIM4v6vtssws; + double BSIM4v6vtsswd; + double BSIM4v6vtsswgs; + double BSIM4v6vtsswgd; + + double BSIM4v6xrcrg1; + double BSIM4v6xrcrg2; + double BSIM4v6lambda; + double BSIM4v6vtl; + double BSIM4v6lc; + double BSIM4v6xn; + double BSIM4v6vfbsdoff; /* S/D flatband offset voltage */ + double BSIM4v6lintnoi; /* lint offset for noise calculation */ + double BSIM4v6tvfbsdoff; + + double BSIM4v6vfb; + double BSIM4v6gbmin; + double BSIM4v6rbdb; + double BSIM4v6rbsb; + double BSIM4v6rbpb; + double BSIM4v6rbps; + double BSIM4v6rbpd; + + double BSIM4v6rbps0; + double BSIM4v6rbpsl; + double BSIM4v6rbpsw; + double BSIM4v6rbpsnf; + + double BSIM4v6rbpd0; + double BSIM4v6rbpdl; + double BSIM4v6rbpdw; + double BSIM4v6rbpdnf; + + double BSIM4v6rbpbx0; + double BSIM4v6rbpbxl; + double BSIM4v6rbpbxw; + double BSIM4v6rbpbxnf; + double BSIM4v6rbpby0; + double BSIM4v6rbpbyl; + double BSIM4v6rbpbyw; + double BSIM4v6rbpbynf; + + double BSIM4v6rbsbx0; + double BSIM4v6rbsby0; + double BSIM4v6rbdbx0; + double BSIM4v6rbdby0; + + double BSIM4v6rbsdbxl; + double BSIM4v6rbsdbxw; + double BSIM4v6rbsdbxnf; + double BSIM4v6rbsdbyl; + double BSIM4v6rbsdbyw; + double BSIM4v6rbsdbynf; + + double BSIM4v6tnoia; + double BSIM4v6tnoib; + double BSIM4v6rnoia; + double BSIM4v6rnoib; + double BSIM4v6ntnoi; + + /* CV model and Parasitics */ + double BSIM4v6cgsl; + double BSIM4v6cgdl; + double BSIM4v6ckappas; + double BSIM4v6ckappad; + double BSIM4v6cf; + double BSIM4v6vfbcv; + double BSIM4v6clc; + double BSIM4v6cle; + double BSIM4v6dwc; + double BSIM4v6dlc; + double BSIM4v6xw; + double BSIM4v6xl; + double BSIM4v6dlcig; + double BSIM4v6dlcigd; + double BSIM4v6dwj; + double BSIM4v6noff; + double BSIM4v6voffcv; + double BSIM4v6acde; + double BSIM4v6moin; + double BSIM4v6tcj; + double BSIM4v6tcjsw; + double BSIM4v6tcjswg; + double BSIM4v6tpb; + double BSIM4v6tpbsw; + double BSIM4v6tpbswg; + double BSIM4v6dmcg; + double BSIM4v6dmci; + double BSIM4v6dmdg; + double BSIM4v6dmcgt; + double BSIM4v6xgw; + double BSIM4v6xgl; + double BSIM4v6rshg; + double BSIM4v6ngcon; + + /* Length Dependence */ + double BSIM4v6lcdsc; + double BSIM4v6lcdscb; + double BSIM4v6lcdscd; + double BSIM4v6lcit; + double BSIM4v6lnfactor; + double BSIM4v6lxj; + double BSIM4v6lvsat; + double BSIM4v6lat; + double BSIM4v6la0; + double BSIM4v6lags; + double BSIM4v6la1; + double BSIM4v6la2; + double BSIM4v6lketa; + double BSIM4v6lnsub; + double BSIM4v6lndep; + double BSIM4v6lnsd; + double BSIM4v6lphin; + double BSIM4v6lngate; + double BSIM4v6lgamma1; + double BSIM4v6lgamma2; + double BSIM4v6lvbx; + double BSIM4v6lvbm; + double BSIM4v6lxt; + double BSIM4v6lk1; + double BSIM4v6lkt1; + double BSIM4v6lkt1l; + double BSIM4v6lkt2; + double BSIM4v6lk2; + double BSIM4v6lk3; + double BSIM4v6lk3b; + double BSIM4v6lw0; + double BSIM4v6ldvtp0; + double BSIM4v6ldvtp1; + double BSIM4v6llpe0; + double BSIM4v6llpeb; + double BSIM4v6ldvt0; + double BSIM4v6ldvt1; + double BSIM4v6ldvt2; + double BSIM4v6ldvt0w; + double BSIM4v6ldvt1w; + double BSIM4v6ldvt2w; + double BSIM4v6ldrout; + double BSIM4v6ldsub; + double BSIM4v6lvth0; + double BSIM4v6lua; + double BSIM4v6lua1; + double BSIM4v6lub; + double BSIM4v6lub1; + double BSIM4v6luc; + double BSIM4v6luc1; + double BSIM4v6lud; + double BSIM4v6lud1; + double BSIM4v6lup; + double BSIM4v6llp; + double BSIM4v6lu0; + double BSIM4v6leu; + double BSIM4v6lucs; + double BSIM4v6lute; + double BSIM4v6lucste; + double BSIM4v6lvoff; + double BSIM4v6ltvoff; + double BSIM4v6lminv; + double BSIM4v6lminvcv; + double BSIM4v6ldelta; + double BSIM4v6lrdsw; + double BSIM4v6lrsw; + double BSIM4v6lrdw; + double BSIM4v6lprwg; + double BSIM4v6lprwb; + double BSIM4v6lprt; + double BSIM4v6leta0; + double BSIM4v6letab; + double BSIM4v6lpclm; + double BSIM4v6lpdibl1; + double BSIM4v6lpdibl2; + double BSIM4v6lpdiblb; + double BSIM4v6lfprout; + double BSIM4v6lpdits; + double BSIM4v6lpditsd; + double BSIM4v6lpscbe1; + double BSIM4v6lpscbe2; + double BSIM4v6lpvag; + double BSIM4v6lwr; + double BSIM4v6ldwg; + double BSIM4v6ldwb; + double BSIM4v6lb0; + double BSIM4v6lb1; + double BSIM4v6lalpha0; + double BSIM4v6lalpha1; + double BSIM4v6lbeta0; + double BSIM4v6lvfb; + double BSIM4v6lagidl; + double BSIM4v6lbgidl; + double BSIM4v6lcgidl; + double BSIM4v6legidl; + double BSIM4v6lagisl; + double BSIM4v6lbgisl; + double BSIM4v6lcgisl; + double BSIM4v6legisl; + double BSIM4v6laigc; + double BSIM4v6lbigc; + double BSIM4v6lcigc; + double BSIM4v6laigsd; + double BSIM4v6lbigsd; + double BSIM4v6lcigsd; + double BSIM4v6laigs; + double BSIM4v6lbigs; + double BSIM4v6lcigs; + double BSIM4v6laigd; + double BSIM4v6lbigd; + double BSIM4v6lcigd; + double BSIM4v6laigbacc; + double BSIM4v6lbigbacc; + double BSIM4v6lcigbacc; + double BSIM4v6laigbinv; + double BSIM4v6lbigbinv; + double BSIM4v6lcigbinv; + double BSIM4v6lnigc; + double BSIM4v6lnigbacc; + double BSIM4v6lnigbinv; + double BSIM4v6lntox; + double BSIM4v6leigbinv; + double BSIM4v6lpigcd; + double BSIM4v6lpoxedge; + double BSIM4v6lxrcrg1; + double BSIM4v6lxrcrg2; + double BSIM4v6llambda; + double BSIM4v6lvtl; + double BSIM4v6lxn; + double BSIM4v6lvfbsdoff; + double BSIM4v6ltvfbsdoff; + + /* CV model */ + double BSIM4v6lcgsl; + double BSIM4v6lcgdl; + double BSIM4v6lckappas; + double BSIM4v6lckappad; + double BSIM4v6lcf; + double BSIM4v6lclc; + double BSIM4v6lcle; + double BSIM4v6lvfbcv; + double BSIM4v6lnoff; + double BSIM4v6lvoffcv; + double BSIM4v6lacde; + double BSIM4v6lmoin; + + /* Width Dependence */ + double BSIM4v6wcdsc; + double BSIM4v6wcdscb; + double BSIM4v6wcdscd; + double BSIM4v6wcit; + double BSIM4v6wnfactor; + double BSIM4v6wxj; + double BSIM4v6wvsat; + double BSIM4v6wat; + double BSIM4v6wa0; + double BSIM4v6wags; + double BSIM4v6wa1; + double BSIM4v6wa2; + double BSIM4v6wketa; + double BSIM4v6wnsub; + double BSIM4v6wndep; + double BSIM4v6wnsd; + double BSIM4v6wphin; + double BSIM4v6wngate; + double BSIM4v6wgamma1; + double BSIM4v6wgamma2; + double BSIM4v6wvbx; + double BSIM4v6wvbm; + double BSIM4v6wxt; + double BSIM4v6wk1; + double BSIM4v6wkt1; + double BSIM4v6wkt1l; + double BSIM4v6wkt2; + double BSIM4v6wk2; + double BSIM4v6wk3; + double BSIM4v6wk3b; + double BSIM4v6ww0; + double BSIM4v6wdvtp0; + double BSIM4v6wdvtp1; + double BSIM4v6wlpe0; + double BSIM4v6wlpeb; + double BSIM4v6wdvt0; + double BSIM4v6wdvt1; + double BSIM4v6wdvt2; + double BSIM4v6wdvt0w; + double BSIM4v6wdvt1w; + double BSIM4v6wdvt2w; + double BSIM4v6wdrout; + double BSIM4v6wdsub; + double BSIM4v6wvth0; + double BSIM4v6wua; + double BSIM4v6wua1; + double BSIM4v6wub; + double BSIM4v6wub1; + double BSIM4v6wuc; + double BSIM4v6wuc1; + double BSIM4v6wud; + double BSIM4v6wud1; + double BSIM4v6wup; + double BSIM4v6wlp; + double BSIM4v6wu0; + double BSIM4v6weu; + double BSIM4v6wucs; + double BSIM4v6wute; + double BSIM4v6wucste; + double BSIM4v6wvoff; + double BSIM4v6wtvoff; + double BSIM4v6wminv; + double BSIM4v6wminvcv; + double BSIM4v6wdelta; + double BSIM4v6wrdsw; + double BSIM4v6wrsw; + double BSIM4v6wrdw; + double BSIM4v6wprwg; + double BSIM4v6wprwb; + double BSIM4v6wprt; + double BSIM4v6weta0; + double BSIM4v6wetab; + double BSIM4v6wpclm; + double BSIM4v6wpdibl1; + double BSIM4v6wpdibl2; + double BSIM4v6wpdiblb; + double BSIM4v6wfprout; + double BSIM4v6wpdits; + double BSIM4v6wpditsd; + double BSIM4v6wpscbe1; + double BSIM4v6wpscbe2; + double BSIM4v6wpvag; + double BSIM4v6wwr; + double BSIM4v6wdwg; + double BSIM4v6wdwb; + double BSIM4v6wb0; + double BSIM4v6wb1; + double BSIM4v6walpha0; + double BSIM4v6walpha1; + double BSIM4v6wbeta0; + double BSIM4v6wvfb; + double BSIM4v6wagidl; + double BSIM4v6wbgidl; + double BSIM4v6wcgidl; + double BSIM4v6wegidl; + double BSIM4v6wagisl; + double BSIM4v6wbgisl; + double BSIM4v6wcgisl; + double BSIM4v6wegisl; + double BSIM4v6waigc; + double BSIM4v6wbigc; + double BSIM4v6wcigc; + double BSIM4v6waigsd; + double BSIM4v6wbigsd; + double BSIM4v6wcigsd; + double BSIM4v6waigs; + double BSIM4v6wbigs; + double BSIM4v6wcigs; + double BSIM4v6waigd; + double BSIM4v6wbigd; + double BSIM4v6wcigd; + double BSIM4v6waigbacc; + double BSIM4v6wbigbacc; + double BSIM4v6wcigbacc; + double BSIM4v6waigbinv; + double BSIM4v6wbigbinv; + double BSIM4v6wcigbinv; + double BSIM4v6wnigc; + double BSIM4v6wnigbacc; + double BSIM4v6wnigbinv; + double BSIM4v6wntox; + double BSIM4v6weigbinv; + double BSIM4v6wpigcd; + double BSIM4v6wpoxedge; + double BSIM4v6wxrcrg1; + double BSIM4v6wxrcrg2; + double BSIM4v6wlambda; + double BSIM4v6wvtl; + double BSIM4v6wxn; + double BSIM4v6wvfbsdoff; + double BSIM4v6wtvfbsdoff; + + /* CV model */ + double BSIM4v6wcgsl; + double BSIM4v6wcgdl; + double BSIM4v6wckappas; + double BSIM4v6wckappad; + double BSIM4v6wcf; + double BSIM4v6wclc; + double BSIM4v6wcle; + double BSIM4v6wvfbcv; + double BSIM4v6wnoff; + double BSIM4v6wvoffcv; + double BSIM4v6wacde; + double BSIM4v6wmoin; + + /* Cross-term Dependence */ + double BSIM4v6pcdsc; + double BSIM4v6pcdscb; + double BSIM4v6pcdscd; + double BSIM4v6pcit; + double BSIM4v6pnfactor; + double BSIM4v6pxj; + double BSIM4v6pvsat; + double BSIM4v6pat; + double BSIM4v6pa0; + double BSIM4v6pags; + double BSIM4v6pa1; + double BSIM4v6pa2; + double BSIM4v6pketa; + double BSIM4v6pnsub; + double BSIM4v6pndep; + double BSIM4v6pnsd; + double BSIM4v6pphin; + double BSIM4v6pngate; + double BSIM4v6pgamma1; + double BSIM4v6pgamma2; + double BSIM4v6pvbx; + double BSIM4v6pvbm; + double BSIM4v6pxt; + double BSIM4v6pk1; + double BSIM4v6pkt1; + double BSIM4v6pkt1l; + double BSIM4v6pkt2; + double BSIM4v6pk2; + double BSIM4v6pk3; + double BSIM4v6pk3b; + double BSIM4v6pw0; + double BSIM4v6pdvtp0; + double BSIM4v6pdvtp1; + double BSIM4v6plpe0; + double BSIM4v6plpeb; + double BSIM4v6pdvt0; + double BSIM4v6pdvt1; + double BSIM4v6pdvt2; + double BSIM4v6pdvt0w; + double BSIM4v6pdvt1w; + double BSIM4v6pdvt2w; + double BSIM4v6pdrout; + double BSIM4v6pdsub; + double BSIM4v6pvth0; + double BSIM4v6pua; + double BSIM4v6pua1; + double BSIM4v6pub; + double BSIM4v6pub1; + double BSIM4v6puc; + double BSIM4v6puc1; + double BSIM4v6pud; + double BSIM4v6pud1; + double BSIM4v6pup; + double BSIM4v6plp; + double BSIM4v6pu0; + double BSIM4v6peu; + double BSIM4v6pucs; + double BSIM4v6pute; + double BSIM4v6pucste; + double BSIM4v6pvoff; + double BSIM4v6ptvoff; + double BSIM4v6pminv; + double BSIM4v6pminvcv; + double BSIM4v6pdelta; + double BSIM4v6prdsw; + double BSIM4v6prsw; + double BSIM4v6prdw; + double BSIM4v6pprwg; + double BSIM4v6pprwb; + double BSIM4v6pprt; + double BSIM4v6peta0; + double BSIM4v6petab; + double BSIM4v6ppclm; + double BSIM4v6ppdibl1; + double BSIM4v6ppdibl2; + double BSIM4v6ppdiblb; + double BSIM4v6pfprout; + double BSIM4v6ppdits; + double BSIM4v6ppditsd; + double BSIM4v6ppscbe1; + double BSIM4v6ppscbe2; + double BSIM4v6ppvag; + double BSIM4v6pwr; + double BSIM4v6pdwg; + double BSIM4v6pdwb; + double BSIM4v6pb0; + double BSIM4v6pb1; + double BSIM4v6palpha0; + double BSIM4v6palpha1; + double BSIM4v6pbeta0; + double BSIM4v6pvfb; + double BSIM4v6pagidl; + double BSIM4v6pbgidl; + double BSIM4v6pcgidl; + double BSIM4v6pegidl; + double BSIM4v6pagisl; + double BSIM4v6pbgisl; + double BSIM4v6pcgisl; + double BSIM4v6pegisl; + double BSIM4v6paigc; + double BSIM4v6pbigc; + double BSIM4v6pcigc; + double BSIM4v6paigsd; + double BSIM4v6pbigsd; + double BSIM4v6pcigsd; + double BSIM4v6paigs; + double BSIM4v6pbigs; + double BSIM4v6pcigs; + double BSIM4v6paigd; + double BSIM4v6pbigd; + double BSIM4v6pcigd; + double BSIM4v6paigbacc; + double BSIM4v6pbigbacc; + double BSIM4v6pcigbacc; + double BSIM4v6paigbinv; + double BSIM4v6pbigbinv; + double BSIM4v6pcigbinv; + double BSIM4v6pnigc; + double BSIM4v6pnigbacc; + double BSIM4v6pnigbinv; + double BSIM4v6pntox; + double BSIM4v6peigbinv; + double BSIM4v6ppigcd; + double BSIM4v6ppoxedge; + double BSIM4v6pxrcrg1; + double BSIM4v6pxrcrg2; + double BSIM4v6plambda; + double BSIM4v6pvtl; + double BSIM4v6pxn; + double BSIM4v6pvfbsdoff; + double BSIM4v6ptvfbsdoff; + + /* CV model */ + double BSIM4v6pcgsl; + double BSIM4v6pcgdl; + double BSIM4v6pckappas; + double BSIM4v6pckappad; + double BSIM4v6pcf; + double BSIM4v6pclc; + double BSIM4v6pcle; + double BSIM4v6pvfbcv; + double BSIM4v6pnoff; + double BSIM4v6pvoffcv; + double BSIM4v6pacde; + double BSIM4v6pmoin; + + double BSIM4v6tnom; + double BSIM4v6cgso; + double BSIM4v6cgdo; + double BSIM4v6cgbo; + double BSIM4v6xpart; + double BSIM4v6cFringOut; + double BSIM4v6cFringMax; + + double BSIM4v6sheetResistance; + double BSIM4v6SjctSatCurDensity; + double BSIM4v6DjctSatCurDensity; + double BSIM4v6SjctSidewallSatCurDensity; + double BSIM4v6DjctSidewallSatCurDensity; + double BSIM4v6SjctGateSidewallSatCurDensity; + double BSIM4v6DjctGateSidewallSatCurDensity; + double BSIM4v6SbulkJctPotential; + double BSIM4v6DbulkJctPotential; + double BSIM4v6SbulkJctBotGradingCoeff; + double BSIM4v6DbulkJctBotGradingCoeff; + double BSIM4v6SbulkJctSideGradingCoeff; + double BSIM4v6DbulkJctSideGradingCoeff; + double BSIM4v6SbulkJctGateSideGradingCoeff; + double BSIM4v6DbulkJctGateSideGradingCoeff; + double BSIM4v6SsidewallJctPotential; + double BSIM4v6DsidewallJctPotential; + double BSIM4v6SGatesidewallJctPotential; + double BSIM4v6DGatesidewallJctPotential; + double BSIM4v6SunitAreaJctCap; + double BSIM4v6DunitAreaJctCap; + double BSIM4v6SunitLengthSidewallJctCap; + double BSIM4v6DunitLengthSidewallJctCap; + double BSIM4v6SunitLengthGateSidewallJctCap; + double BSIM4v6DunitLengthGateSidewallJctCap; + double BSIM4v6SjctEmissionCoeff; + double BSIM4v6DjctEmissionCoeff; + double BSIM4v6SjctTempExponent; + double BSIM4v6DjctTempExponent; + double BSIM4v6njtsstemp; + double BSIM4v6njtsswstemp; + double BSIM4v6njtsswgstemp; + double BSIM4v6njtsdtemp; + double BSIM4v6njtsswdtemp; + double BSIM4v6njtsswgdtemp; + + double BSIM4v6Lint; + double BSIM4v6Ll; + double BSIM4v6Llc; + double BSIM4v6Lln; + double BSIM4v6Lw; + double BSIM4v6Lwc; + double BSIM4v6Lwn; + double BSIM4v6Lwl; + double BSIM4v6Lwlc; + double BSIM4v6Lmin; + double BSIM4v6Lmax; + + double BSIM4v6Wint; + double BSIM4v6Wl; + double BSIM4v6Wlc; + double BSIM4v6Wln; + double BSIM4v6Ww; + double BSIM4v6Wwc; + double BSIM4v6Wwn; + double BSIM4v6Wwl; + double BSIM4v6Wwlc; + double BSIM4v6Wmin; + double BSIM4v6Wmax; + + /* added for stress effect */ + double BSIM4v6saref; + double BSIM4v6sbref; + double BSIM4v6wlod; + double BSIM4v6ku0; + double BSIM4v6kvsat; + double BSIM4v6kvth0; + double BSIM4v6tku0; + double BSIM4v6llodku0; + double BSIM4v6wlodku0; + double BSIM4v6llodvth; + double BSIM4v6wlodvth; + double BSIM4v6lku0; + double BSIM4v6wku0; + double BSIM4v6pku0; + double BSIM4v6lkvth0; + double BSIM4v6wkvth0; + double BSIM4v6pkvth0; + double BSIM4v6stk2; + double BSIM4v6lodk2; + double BSIM4v6steta0; + double BSIM4v6lodeta0; + + double BSIM4v6web; + double BSIM4v6wec; + double BSIM4v6kvth0we; + double BSIM4v6k2we; + double BSIM4v6ku0we; + double BSIM4v6scref; + double BSIM4v6wpemod; + double BSIM4v6lkvth0we; + double BSIM4v6lk2we; + double BSIM4v6lku0we; + double BSIM4v6wkvth0we; + double BSIM4v6wk2we; + double BSIM4v6wku0we; + double BSIM4v6pkvth0we; + double BSIM4v6pk2we; + double BSIM4v6pku0we; + +/* Pre-calculated constants + * move to size-dependent param */ + double BSIM4v6Eg0; + double BSIM4v6vtm; + double BSIM4v6vtm0; + double BSIM4v6coxe; + double BSIM4v6coxp; + double BSIM4v6cof1; + double BSIM4v6cof2; + double BSIM4v6cof3; + double BSIM4v6cof4; + double BSIM4v6vcrit; + double BSIM4v6factor1; + double BSIM4v6PhiBS; + double BSIM4v6PhiBSWS; + double BSIM4v6PhiBSWGS; + double BSIM4v6SjctTempSatCurDensity; + double BSIM4v6SjctSidewallTempSatCurDensity; + double BSIM4v6SjctGateSidewallTempSatCurDensity; + double BSIM4v6PhiBD; + double BSIM4v6PhiBSWD; + double BSIM4v6PhiBSWGD; + double BSIM4v6DjctTempSatCurDensity; + double BSIM4v6DjctSidewallTempSatCurDensity; + double BSIM4v6DjctGateSidewallTempSatCurDensity; + double BSIM4v6SunitAreaTempJctCap; + double BSIM4v6DunitAreaTempJctCap; + double BSIM4v6SunitLengthSidewallTempJctCap; + double BSIM4v6DunitLengthSidewallTempJctCap; + double BSIM4v6SunitLengthGateSidewallTempJctCap; + double BSIM4v6DunitLengthGateSidewallTempJctCap; + + double BSIM4v6oxideTrapDensityA; + double BSIM4v6oxideTrapDensityB; + double BSIM4v6oxideTrapDensityC; + double BSIM4v6em; + double BSIM4v6ef; + double BSIM4v6af; + double BSIM4v6kf; + + struct bsim4v6SizeDependParam *pSizeDependParamKnot; + + +#ifdef USE_OMP4 + int BSIM4v6InstCount; + struct sBSIM4v6instance **BSIM4v6InstanceArray; +#endif + + /* Flags */ + unsigned BSIM4v6mobModGiven :1; + unsigned BSIM4v6binUnitGiven :1; + unsigned BSIM4v6cvchargeModGiven :1; + unsigned BSIM4v6capModGiven :1; + unsigned BSIM4v6dioModGiven :1; + unsigned BSIM4v6rdsModGiven :1; + unsigned BSIM4v6rbodyModGiven :1; + unsigned BSIM4v6rgateModGiven :1; + unsigned BSIM4v6perModGiven :1; + unsigned BSIM4v6geoModGiven :1; + unsigned BSIM4v6paramChkGiven :1; + unsigned BSIM4v6trnqsModGiven :1; + unsigned BSIM4v6acnqsModGiven :1; + unsigned BSIM4v6fnoiModGiven :1; + unsigned BSIM4v6tnoiModGiven :1; + unsigned BSIM4v6mtrlModGiven :1; + unsigned BSIM4v6igcModGiven :1; + unsigned BSIM4v6igbModGiven :1; + unsigned BSIM4v6tempModGiven :1; + unsigned BSIM4v6typeGiven :1; + unsigned BSIM4v6toxrefGiven :1; + unsigned BSIM4v6eotGiven :1; + unsigned BSIM4v6vddeotGiven :1; + unsigned BSIM4v6tempeotGiven :1; + unsigned BSIM4v6leffeotGiven :1; + unsigned BSIM4v6weffeotGiven :1; + unsigned BSIM4v6adosGiven :1; + unsigned BSIM4v6bdosGiven :1; + unsigned BSIM4v6toxeGiven :1; + unsigned BSIM4v6toxpGiven :1; + unsigned BSIM4v6toxmGiven :1; + unsigned BSIM4v6dtoxGiven :1; + unsigned BSIM4v6epsroxGiven :1; + unsigned BSIM4v6versionGiven :1; + unsigned BSIM4v6cdscGiven :1; + unsigned BSIM4v6cdscbGiven :1; + unsigned BSIM4v6cdscdGiven :1; + unsigned BSIM4v6citGiven :1; + unsigned BSIM4v6nfactorGiven :1; + unsigned BSIM4v6xjGiven :1; + unsigned BSIM4v6vsatGiven :1; + unsigned BSIM4v6atGiven :1; + unsigned BSIM4v6a0Given :1; + unsigned BSIM4v6agsGiven :1; + unsigned BSIM4v6a1Given :1; + unsigned BSIM4v6a2Given :1; + unsigned BSIM4v6ketaGiven :1; + unsigned BSIM4v6nsubGiven :1; + unsigned BSIM4v6phigGiven :1; + unsigned BSIM4v6epsrgateGiven :1; + unsigned BSIM4v6easubGiven :1; + unsigned BSIM4v6epsrsubGiven :1; + unsigned BSIM4v6ni0subGiven :1; + unsigned BSIM4v6bg0subGiven :1; + unsigned BSIM4v6tbgasubGiven :1; + unsigned BSIM4v6tbgbsubGiven :1; + unsigned BSIM4v6ndepGiven :1; + unsigned BSIM4v6nsdGiven :1; + unsigned BSIM4v6phinGiven :1; + unsigned BSIM4v6ngateGiven :1; + unsigned BSIM4v6gamma1Given :1; + unsigned BSIM4v6gamma2Given :1; + unsigned BSIM4v6vbxGiven :1; + unsigned BSIM4v6vbmGiven :1; + unsigned BSIM4v6xtGiven :1; + unsigned BSIM4v6k1Given :1; + unsigned BSIM4v6kt1Given :1; + unsigned BSIM4v6kt1lGiven :1; + unsigned BSIM4v6kt2Given :1; + unsigned BSIM4v6k2Given :1; + unsigned BSIM4v6k3Given :1; + unsigned BSIM4v6k3bGiven :1; + unsigned BSIM4v6w0Given :1; + unsigned BSIM4v6dvtp0Given :1; + unsigned BSIM4v6dvtp1Given :1; + unsigned BSIM4v6lpe0Given :1; + unsigned BSIM4v6lpebGiven :1; + unsigned BSIM4v6dvt0Given :1; + unsigned BSIM4v6dvt1Given :1; + unsigned BSIM4v6dvt2Given :1; + unsigned BSIM4v6dvt0wGiven :1; + unsigned BSIM4v6dvt1wGiven :1; + unsigned BSIM4v6dvt2wGiven :1; + unsigned BSIM4v6droutGiven :1; + unsigned BSIM4v6dsubGiven :1; + unsigned BSIM4v6vth0Given :1; + unsigned BSIM4v6euGiven :1; + unsigned BSIM4v6ucsGiven :1; + unsigned BSIM4v6uaGiven :1; + unsigned BSIM4v6ua1Given :1; + unsigned BSIM4v6ubGiven :1; + unsigned BSIM4v6ub1Given :1; + unsigned BSIM4v6ucGiven :1; + unsigned BSIM4v6uc1Given :1; + unsigned BSIM4v6udGiven :1; + unsigned BSIM4v6ud1Given :1; + unsigned BSIM4v6upGiven :1; + unsigned BSIM4v6lpGiven :1; + unsigned BSIM4v6u0Given :1; + unsigned BSIM4v6uteGiven :1; + unsigned BSIM4v6ucsteGiven :1; + unsigned BSIM4v6voffGiven :1; + unsigned BSIM4v6tvoffGiven :1; + unsigned BSIM4v6vofflGiven :1; + unsigned BSIM4v6voffcvlGiven :1; + unsigned BSIM4v6minvGiven :1; + unsigned BSIM4v6minvcvGiven :1; + unsigned BSIM4v6rdswGiven :1; + unsigned BSIM4v6rdswminGiven :1; + unsigned BSIM4v6rdwminGiven :1; + unsigned BSIM4v6rswminGiven :1; + unsigned BSIM4v6rswGiven :1; + unsigned BSIM4v6rdwGiven :1; + unsigned BSIM4v6prwgGiven :1; + unsigned BSIM4v6prwbGiven :1; + unsigned BSIM4v6prtGiven :1; + unsigned BSIM4v6eta0Given :1; + unsigned BSIM4v6etabGiven :1; + unsigned BSIM4v6pclmGiven :1; + unsigned BSIM4v6pdibl1Given :1; + unsigned BSIM4v6pdibl2Given :1; + unsigned BSIM4v6pdiblbGiven :1; + unsigned BSIM4v6fproutGiven :1; + unsigned BSIM4v6pditsGiven :1; + unsigned BSIM4v6pditsdGiven :1; + unsigned BSIM4v6pditslGiven :1; + unsigned BSIM4v6pscbe1Given :1; + unsigned BSIM4v6pscbe2Given :1; + unsigned BSIM4v6pvagGiven :1; + unsigned BSIM4v6deltaGiven :1; + unsigned BSIM4v6wrGiven :1; + unsigned BSIM4v6dwgGiven :1; + unsigned BSIM4v6dwbGiven :1; + unsigned BSIM4v6b0Given :1; + unsigned BSIM4v6b1Given :1; + unsigned BSIM4v6alpha0Given :1; + unsigned BSIM4v6alpha1Given :1; + unsigned BSIM4v6beta0Given :1; + unsigned BSIM4v6agidlGiven :1; + unsigned BSIM4v6bgidlGiven :1; + unsigned BSIM4v6cgidlGiven :1; + unsigned BSIM4v6egidlGiven :1; + unsigned BSIM4v6agislGiven :1; + unsigned BSIM4v6bgislGiven :1; + unsigned BSIM4v6cgislGiven :1; + unsigned BSIM4v6egislGiven :1; + unsigned BSIM4v6aigcGiven :1; + unsigned BSIM4v6bigcGiven :1; + unsigned BSIM4v6cigcGiven :1; + unsigned BSIM4v6aigsdGiven :1; + unsigned BSIM4v6bigsdGiven :1; + unsigned BSIM4v6cigsdGiven :1; + unsigned BSIM4v6aigsGiven :1; + unsigned BSIM4v6bigsGiven :1; + unsigned BSIM4v6cigsGiven :1; + unsigned BSIM4v6aigdGiven :1; + unsigned BSIM4v6bigdGiven :1; + unsigned BSIM4v6cigdGiven :1; + unsigned BSIM4v6aigbaccGiven :1; + unsigned BSIM4v6bigbaccGiven :1; + unsigned BSIM4v6cigbaccGiven :1; + unsigned BSIM4v6aigbinvGiven :1; + unsigned BSIM4v6bigbinvGiven :1; + unsigned BSIM4v6cigbinvGiven :1; + unsigned BSIM4v6nigcGiven :1; + unsigned BSIM4v6nigbinvGiven :1; + unsigned BSIM4v6nigbaccGiven :1; + unsigned BSIM4v6ntoxGiven :1; + unsigned BSIM4v6eigbinvGiven :1; + unsigned BSIM4v6pigcdGiven :1; + unsigned BSIM4v6poxedgeGiven :1; + unsigned BSIM4v6ijthdfwdGiven :1; + unsigned BSIM4v6ijthsfwdGiven :1; + unsigned BSIM4v6ijthdrevGiven :1; + unsigned BSIM4v6ijthsrevGiven :1; + unsigned BSIM4v6xjbvdGiven :1; + unsigned BSIM4v6xjbvsGiven :1; + unsigned BSIM4v6bvdGiven :1; + unsigned BSIM4v6bvsGiven :1; + + unsigned BSIM4v6jtssGiven :1; + unsigned BSIM4v6jtsdGiven :1; + unsigned BSIM4v6jtsswsGiven :1; + unsigned BSIM4v6jtsswdGiven :1; + unsigned BSIM4v6jtsswgsGiven :1; + unsigned BSIM4v6jtsswgdGiven :1; + unsigned BSIM4v6jtweffGiven :1; + unsigned BSIM4v6njtsGiven :1; + unsigned BSIM4v6njtsswGiven :1; + unsigned BSIM4v6njtsswgGiven :1; + unsigned BSIM4v6njtsdGiven :1; + unsigned BSIM4v6njtsswdGiven :1; + unsigned BSIM4v6njtsswgdGiven :1; + unsigned BSIM4v6xtssGiven :1; + unsigned BSIM4v6xtsdGiven :1; + unsigned BSIM4v6xtsswsGiven :1; + unsigned BSIM4v6xtsswdGiven :1; + unsigned BSIM4v6xtsswgsGiven :1; + unsigned BSIM4v6xtsswgdGiven :1; + unsigned BSIM4v6tnjtsGiven :1; + unsigned BSIM4v6tnjtsswGiven :1; + unsigned BSIM4v6tnjtsswgGiven :1; + unsigned BSIM4v6tnjtsdGiven :1; + unsigned BSIM4v6tnjtsswdGiven :1; + unsigned BSIM4v6tnjtsswgdGiven :1; + unsigned BSIM4v6vtssGiven :1; + unsigned BSIM4v6vtsdGiven :1; + unsigned BSIM4v6vtsswsGiven :1; + unsigned BSIM4v6vtsswdGiven :1; + unsigned BSIM4v6vtsswgsGiven :1; + unsigned BSIM4v6vtsswgdGiven :1; + + unsigned BSIM4v6vfbGiven :1; + unsigned BSIM4v6gbminGiven :1; + unsigned BSIM4v6rbdbGiven :1; + unsigned BSIM4v6rbsbGiven :1; + unsigned BSIM4v6rbpsGiven :1; + unsigned BSIM4v6rbpdGiven :1; + unsigned BSIM4v6rbpbGiven :1; + + unsigned BSIM4v6rbps0Given :1; + unsigned BSIM4v6rbpslGiven :1; + unsigned BSIM4v6rbpswGiven :1; + unsigned BSIM4v6rbpsnfGiven :1; + + unsigned BSIM4v6rbpd0Given :1; + unsigned BSIM4v6rbpdlGiven :1; + unsigned BSIM4v6rbpdwGiven :1; + unsigned BSIM4v6rbpdnfGiven :1; + + unsigned BSIM4v6rbpbx0Given :1; + unsigned BSIM4v6rbpbxlGiven :1; + unsigned BSIM4v6rbpbxwGiven :1; + unsigned BSIM4v6rbpbxnfGiven :1; + unsigned BSIM4v6rbpby0Given :1; + unsigned BSIM4v6rbpbylGiven :1; + unsigned BSIM4v6rbpbywGiven :1; + unsigned BSIM4v6rbpbynfGiven :1; + + unsigned BSIM4v6rbsbx0Given :1; + unsigned BSIM4v6rbsby0Given :1; + unsigned BSIM4v6rbdbx0Given :1; + unsigned BSIM4v6rbdby0Given :1; + + unsigned BSIM4v6rbsdbxlGiven :1; + unsigned BSIM4v6rbsdbxwGiven :1; + unsigned BSIM4v6rbsdbxnfGiven :1; + unsigned BSIM4v6rbsdbylGiven :1; + unsigned BSIM4v6rbsdbywGiven :1; + unsigned BSIM4v6rbsdbynfGiven :1; + + unsigned BSIM4v6xrcrg1Given :1; + unsigned BSIM4v6xrcrg2Given :1; + unsigned BSIM4v6tnoiaGiven :1; + unsigned BSIM4v6tnoibGiven :1; + unsigned BSIM4v6rnoiaGiven :1; + unsigned BSIM4v6rnoibGiven :1; + unsigned BSIM4v6ntnoiGiven :1; + + unsigned BSIM4v6lambdaGiven :1; + unsigned BSIM4v6vtlGiven :1; + unsigned BSIM4v6lcGiven :1; + unsigned BSIM4v6xnGiven :1; + unsigned BSIM4v6vfbsdoffGiven :1; + unsigned BSIM4v6lintnoiGiven :1; + unsigned BSIM4v6tvfbsdoffGiven :1; + + /* CV model and parasitics */ + unsigned BSIM4v6cgslGiven :1; + unsigned BSIM4v6cgdlGiven :1; + unsigned BSIM4v6ckappasGiven :1; + unsigned BSIM4v6ckappadGiven :1; + unsigned BSIM4v6cfGiven :1; + unsigned BSIM4v6vfbcvGiven :1; + unsigned BSIM4v6clcGiven :1; + unsigned BSIM4v6cleGiven :1; + unsigned BSIM4v6dwcGiven :1; + unsigned BSIM4v6dlcGiven :1; + unsigned BSIM4v6xwGiven :1; + unsigned BSIM4v6xlGiven :1; + unsigned BSIM4v6dlcigGiven :1; + unsigned BSIM4v6dlcigdGiven :1; + unsigned BSIM4v6dwjGiven :1; + unsigned BSIM4v6noffGiven :1; + unsigned BSIM4v6voffcvGiven :1; + unsigned BSIM4v6acdeGiven :1; + unsigned BSIM4v6moinGiven :1; + unsigned BSIM4v6tcjGiven :1; + unsigned BSIM4v6tcjswGiven :1; + unsigned BSIM4v6tcjswgGiven :1; + unsigned BSIM4v6tpbGiven :1; + unsigned BSIM4v6tpbswGiven :1; + unsigned BSIM4v6tpbswgGiven :1; + unsigned BSIM4v6dmcgGiven :1; + unsigned BSIM4v6dmciGiven :1; + unsigned BSIM4v6dmdgGiven :1; + unsigned BSIM4v6dmcgtGiven :1; + unsigned BSIM4v6xgwGiven :1; + unsigned BSIM4v6xglGiven :1; + unsigned BSIM4v6rshgGiven :1; + unsigned BSIM4v6ngconGiven :1; + + + /* Length dependence */ + unsigned BSIM4v6lcdscGiven :1; + unsigned BSIM4v6lcdscbGiven :1; + unsigned BSIM4v6lcdscdGiven :1; + unsigned BSIM4v6lcitGiven :1; + unsigned BSIM4v6lnfactorGiven :1; + unsigned BSIM4v6lxjGiven :1; + unsigned BSIM4v6lvsatGiven :1; + unsigned BSIM4v6latGiven :1; + unsigned BSIM4v6la0Given :1; + unsigned BSIM4v6lagsGiven :1; + unsigned BSIM4v6la1Given :1; + unsigned BSIM4v6la2Given :1; + unsigned BSIM4v6lketaGiven :1; + unsigned BSIM4v6lnsubGiven :1; + unsigned BSIM4v6lndepGiven :1; + unsigned BSIM4v6lnsdGiven :1; + unsigned BSIM4v6lphinGiven :1; + unsigned BSIM4v6lngateGiven :1; + unsigned BSIM4v6lgamma1Given :1; + unsigned BSIM4v6lgamma2Given :1; + unsigned BSIM4v6lvbxGiven :1; + unsigned BSIM4v6lvbmGiven :1; + unsigned BSIM4v6lxtGiven :1; + unsigned BSIM4v6lk1Given :1; + unsigned BSIM4v6lkt1Given :1; + unsigned BSIM4v6lkt1lGiven :1; + unsigned BSIM4v6lkt2Given :1; + unsigned BSIM4v6lk2Given :1; + unsigned BSIM4v6lk3Given :1; + unsigned BSIM4v6lk3bGiven :1; + unsigned BSIM4v6lw0Given :1; + unsigned BSIM4v6ldvtp0Given :1; + unsigned BSIM4v6ldvtp1Given :1; + unsigned BSIM4v6llpe0Given :1; + unsigned BSIM4v6llpebGiven :1; + unsigned BSIM4v6ldvt0Given :1; + unsigned BSIM4v6ldvt1Given :1; + unsigned BSIM4v6ldvt2Given :1; + unsigned BSIM4v6ldvt0wGiven :1; + unsigned BSIM4v6ldvt1wGiven :1; + unsigned BSIM4v6ldvt2wGiven :1; + unsigned BSIM4v6ldroutGiven :1; + unsigned BSIM4v6ldsubGiven :1; + unsigned BSIM4v6lvth0Given :1; + unsigned BSIM4v6luaGiven :1; + unsigned BSIM4v6lua1Given :1; + unsigned BSIM4v6lubGiven :1; + unsigned BSIM4v6lub1Given :1; + unsigned BSIM4v6lucGiven :1; + unsigned BSIM4v6luc1Given :1; + unsigned BSIM4v6ludGiven :1; + unsigned BSIM4v6lud1Given :1; + unsigned BSIM4v6lupGiven :1; + unsigned BSIM4v6llpGiven :1; + unsigned BSIM4v6lu0Given :1; + unsigned BSIM4v6leuGiven :1; + unsigned BSIM4v6lucsGiven :1; + unsigned BSIM4v6luteGiven :1; + unsigned BSIM4v6lucsteGiven :1; + unsigned BSIM4v6lvoffGiven :1; + unsigned BSIM4v6ltvoffGiven :1; + unsigned BSIM4v6lminvGiven :1; + unsigned BSIM4v6lminvcvGiven :1; + unsigned BSIM4v6lrdswGiven :1; + unsigned BSIM4v6lrswGiven :1; + unsigned BSIM4v6lrdwGiven :1; + unsigned BSIM4v6lprwgGiven :1; + unsigned BSIM4v6lprwbGiven :1; + unsigned BSIM4v6lprtGiven :1; + unsigned BSIM4v6leta0Given :1; + unsigned BSIM4v6letabGiven :1; + unsigned BSIM4v6lpclmGiven :1; + unsigned BSIM4v6lpdibl1Given :1; + unsigned BSIM4v6lpdibl2Given :1; + unsigned BSIM4v6lpdiblbGiven :1; + unsigned BSIM4v6lfproutGiven :1; + unsigned BSIM4v6lpditsGiven :1; + unsigned BSIM4v6lpditsdGiven :1; + unsigned BSIM4v6lpscbe1Given :1; + unsigned BSIM4v6lpscbe2Given :1; + unsigned BSIM4v6lpvagGiven :1; + unsigned BSIM4v6ldeltaGiven :1; + unsigned BSIM4v6lwrGiven :1; + unsigned BSIM4v6ldwgGiven :1; + unsigned BSIM4v6ldwbGiven :1; + unsigned BSIM4v6lb0Given :1; + unsigned BSIM4v6lb1Given :1; + unsigned BSIM4v6lalpha0Given :1; + unsigned BSIM4v6lalpha1Given :1; + unsigned BSIM4v6lbeta0Given :1; + unsigned BSIM4v6lvfbGiven :1; + unsigned BSIM4v6lagidlGiven :1; + unsigned BSIM4v6lbgidlGiven :1; + unsigned BSIM4v6lcgidlGiven :1; + unsigned BSIM4v6legidlGiven :1; + unsigned BSIM4v6lagislGiven :1; + unsigned BSIM4v6lbgislGiven :1; + unsigned BSIM4v6lcgislGiven :1; + unsigned BSIM4v6legislGiven :1; + unsigned BSIM4v6laigcGiven :1; + unsigned BSIM4v6lbigcGiven :1; + unsigned BSIM4v6lcigcGiven :1; + unsigned BSIM4v6laigsdGiven :1; + unsigned BSIM4v6lbigsdGiven :1; + unsigned BSIM4v6lcigsdGiven :1; + unsigned BSIM4v6laigsGiven :1; + unsigned BSIM4v6lbigsGiven :1; + unsigned BSIM4v6lcigsGiven :1; + unsigned BSIM4v6laigdGiven :1; + unsigned BSIM4v6lbigdGiven :1; + unsigned BSIM4v6lcigdGiven :1; + unsigned BSIM4v6laigbaccGiven :1; + unsigned BSIM4v6lbigbaccGiven :1; + unsigned BSIM4v6lcigbaccGiven :1; + unsigned BSIM4v6laigbinvGiven :1; + unsigned BSIM4v6lbigbinvGiven :1; + unsigned BSIM4v6lcigbinvGiven :1; + unsigned BSIM4v6lnigcGiven :1; + unsigned BSIM4v6lnigbinvGiven :1; + unsigned BSIM4v6lnigbaccGiven :1; + unsigned BSIM4v6lntoxGiven :1; + unsigned BSIM4v6leigbinvGiven :1; + unsigned BSIM4v6lpigcdGiven :1; + unsigned BSIM4v6lpoxedgeGiven :1; + unsigned BSIM4v6lxrcrg1Given :1; + unsigned BSIM4v6lxrcrg2Given :1; + unsigned BSIM4v6llambdaGiven :1; + unsigned BSIM4v6lvtlGiven :1; + unsigned BSIM4v6lxnGiven :1; + unsigned BSIM4v6lvfbsdoffGiven :1; + unsigned BSIM4v6ltvfbsdoffGiven :1; + + /* CV model */ + unsigned BSIM4v6lcgslGiven :1; + unsigned BSIM4v6lcgdlGiven :1; + unsigned BSIM4v6lckappasGiven :1; + unsigned BSIM4v6lckappadGiven :1; + unsigned BSIM4v6lcfGiven :1; + unsigned BSIM4v6lclcGiven :1; + unsigned BSIM4v6lcleGiven :1; + unsigned BSIM4v6lvfbcvGiven :1; + unsigned BSIM4v6lnoffGiven :1; + unsigned BSIM4v6lvoffcvGiven :1; + unsigned BSIM4v6lacdeGiven :1; + unsigned BSIM4v6lmoinGiven :1; + + /* Width dependence */ + unsigned BSIM4v6wcdscGiven :1; + unsigned BSIM4v6wcdscbGiven :1; + unsigned BSIM4v6wcdscdGiven :1; + unsigned BSIM4v6wcitGiven :1; + unsigned BSIM4v6wnfactorGiven :1; + unsigned BSIM4v6wxjGiven :1; + unsigned BSIM4v6wvsatGiven :1; + unsigned BSIM4v6watGiven :1; + unsigned BSIM4v6wa0Given :1; + unsigned BSIM4v6wagsGiven :1; + unsigned BSIM4v6wa1Given :1; + unsigned BSIM4v6wa2Given :1; + unsigned BSIM4v6wketaGiven :1; + unsigned BSIM4v6wnsubGiven :1; + unsigned BSIM4v6wndepGiven :1; + unsigned BSIM4v6wnsdGiven :1; + unsigned BSIM4v6wphinGiven :1; + unsigned BSIM4v6wngateGiven :1; + unsigned BSIM4v6wgamma1Given :1; + unsigned BSIM4v6wgamma2Given :1; + unsigned BSIM4v6wvbxGiven :1; + unsigned BSIM4v6wvbmGiven :1; + unsigned BSIM4v6wxtGiven :1; + unsigned BSIM4v6wk1Given :1; + unsigned BSIM4v6wkt1Given :1; + unsigned BSIM4v6wkt1lGiven :1; + unsigned BSIM4v6wkt2Given :1; + unsigned BSIM4v6wk2Given :1; + unsigned BSIM4v6wk3Given :1; + unsigned BSIM4v6wk3bGiven :1; + unsigned BSIM4v6ww0Given :1; + unsigned BSIM4v6wdvtp0Given :1; + unsigned BSIM4v6wdvtp1Given :1; + unsigned BSIM4v6wlpe0Given :1; + unsigned BSIM4v6wlpebGiven :1; + unsigned BSIM4v6wdvt0Given :1; + unsigned BSIM4v6wdvt1Given :1; + unsigned BSIM4v6wdvt2Given :1; + unsigned BSIM4v6wdvt0wGiven :1; + unsigned BSIM4v6wdvt1wGiven :1; + unsigned BSIM4v6wdvt2wGiven :1; + unsigned BSIM4v6wdroutGiven :1; + unsigned BSIM4v6wdsubGiven :1; + unsigned BSIM4v6wvth0Given :1; + unsigned BSIM4v6wuaGiven :1; + unsigned BSIM4v6wua1Given :1; + unsigned BSIM4v6wubGiven :1; + unsigned BSIM4v6wub1Given :1; + unsigned BSIM4v6wucGiven :1; + unsigned BSIM4v6wuc1Given :1; + unsigned BSIM4v6wudGiven :1; + unsigned BSIM4v6wud1Given :1; + unsigned BSIM4v6wupGiven :1; + unsigned BSIM4v6wlpGiven :1; + unsigned BSIM4v6wu0Given :1; + unsigned BSIM4v6weuGiven :1; + unsigned BSIM4v6wucsGiven :1; + unsigned BSIM4v6wuteGiven :1; + unsigned BSIM4v6wucsteGiven :1; + unsigned BSIM4v6wvoffGiven :1; + unsigned BSIM4v6wtvoffGiven :1; + unsigned BSIM4v6wminvGiven :1; + unsigned BSIM4v6wminvcvGiven :1; + unsigned BSIM4v6wrdswGiven :1; + unsigned BSIM4v6wrswGiven :1; + unsigned BSIM4v6wrdwGiven :1; + unsigned BSIM4v6wprwgGiven :1; + unsigned BSIM4v6wprwbGiven :1; + unsigned BSIM4v6wprtGiven :1; + unsigned BSIM4v6weta0Given :1; + unsigned BSIM4v6wetabGiven :1; + unsigned BSIM4v6wpclmGiven :1; + unsigned BSIM4v6wpdibl1Given :1; + unsigned BSIM4v6wpdibl2Given :1; + unsigned BSIM4v6wpdiblbGiven :1; + unsigned BSIM4v6wfproutGiven :1; + unsigned BSIM4v6wpditsGiven :1; + unsigned BSIM4v6wpditsdGiven :1; + unsigned BSIM4v6wpscbe1Given :1; + unsigned BSIM4v6wpscbe2Given :1; + unsigned BSIM4v6wpvagGiven :1; + unsigned BSIM4v6wdeltaGiven :1; + unsigned BSIM4v6wwrGiven :1; + unsigned BSIM4v6wdwgGiven :1; + unsigned BSIM4v6wdwbGiven :1; + unsigned BSIM4v6wb0Given :1; + unsigned BSIM4v6wb1Given :1; + unsigned BSIM4v6walpha0Given :1; + unsigned BSIM4v6walpha1Given :1; + unsigned BSIM4v6wbeta0Given :1; + unsigned BSIM4v6wvfbGiven :1; + unsigned BSIM4v6wagidlGiven :1; + unsigned BSIM4v6wbgidlGiven :1; + unsigned BSIM4v6wcgidlGiven :1; + unsigned BSIM4v6wegidlGiven :1; + unsigned BSIM4v6wagislGiven :1; + unsigned BSIM4v6wbgislGiven :1; + unsigned BSIM4v6wcgislGiven :1; + unsigned BSIM4v6wegislGiven :1; + unsigned BSIM4v6waigcGiven :1; + unsigned BSIM4v6wbigcGiven :1; + unsigned BSIM4v6wcigcGiven :1; + unsigned BSIM4v6waigsdGiven :1; + unsigned BSIM4v6wbigsdGiven :1; + unsigned BSIM4v6wcigsdGiven :1; + unsigned BSIM4v6waigsGiven :1; + unsigned BSIM4v6wbigsGiven :1; + unsigned BSIM4v6wcigsGiven :1; + unsigned BSIM4v6waigdGiven :1; + unsigned BSIM4v6wbigdGiven :1; + unsigned BSIM4v6wcigdGiven :1; + unsigned BSIM4v6waigbaccGiven :1; + unsigned BSIM4v6wbigbaccGiven :1; + unsigned BSIM4v6wcigbaccGiven :1; + unsigned BSIM4v6waigbinvGiven :1; + unsigned BSIM4v6wbigbinvGiven :1; + unsigned BSIM4v6wcigbinvGiven :1; + unsigned BSIM4v6wnigcGiven :1; + unsigned BSIM4v6wnigbinvGiven :1; + unsigned BSIM4v6wnigbaccGiven :1; + unsigned BSIM4v6wntoxGiven :1; + unsigned BSIM4v6weigbinvGiven :1; + unsigned BSIM4v6wpigcdGiven :1; + unsigned BSIM4v6wpoxedgeGiven :1; + unsigned BSIM4v6wxrcrg1Given :1; + unsigned BSIM4v6wxrcrg2Given :1; + unsigned BSIM4v6wlambdaGiven :1; + unsigned BSIM4v6wvtlGiven :1; + unsigned BSIM4v6wxnGiven :1; + unsigned BSIM4v6wvfbsdoffGiven :1; + unsigned BSIM4v6wtvfbsdoffGiven :1; + + /* CV model */ + unsigned BSIM4v6wcgslGiven :1; + unsigned BSIM4v6wcgdlGiven :1; + unsigned BSIM4v6wckappasGiven :1; + unsigned BSIM4v6wckappadGiven :1; + unsigned BSIM4v6wcfGiven :1; + unsigned BSIM4v6wclcGiven :1; + unsigned BSIM4v6wcleGiven :1; + unsigned BSIM4v6wvfbcvGiven :1; + unsigned BSIM4v6wnoffGiven :1; + unsigned BSIM4v6wvoffcvGiven :1; + unsigned BSIM4v6wacdeGiven :1; + unsigned BSIM4v6wmoinGiven :1; + + /* Cross-term dependence */ + unsigned BSIM4v6pcdscGiven :1; + unsigned BSIM4v6pcdscbGiven :1; + unsigned BSIM4v6pcdscdGiven :1; + unsigned BSIM4v6pcitGiven :1; + unsigned BSIM4v6pnfactorGiven :1; + unsigned BSIM4v6pxjGiven :1; + unsigned BSIM4v6pvsatGiven :1; + unsigned BSIM4v6patGiven :1; + unsigned BSIM4v6pa0Given :1; + unsigned BSIM4v6pagsGiven :1; + unsigned BSIM4v6pa1Given :1; + unsigned BSIM4v6pa2Given :1; + unsigned BSIM4v6pketaGiven :1; + unsigned BSIM4v6pnsubGiven :1; + unsigned BSIM4v6pndepGiven :1; + unsigned BSIM4v6pnsdGiven :1; + unsigned BSIM4v6pphinGiven :1; + unsigned BSIM4v6pngateGiven :1; + unsigned BSIM4v6pgamma1Given :1; + unsigned BSIM4v6pgamma2Given :1; + unsigned BSIM4v6pvbxGiven :1; + unsigned BSIM4v6pvbmGiven :1; + unsigned BSIM4v6pxtGiven :1; + unsigned BSIM4v6pk1Given :1; + unsigned BSIM4v6pkt1Given :1; + unsigned BSIM4v6pkt1lGiven :1; + unsigned BSIM4v6pkt2Given :1; + unsigned BSIM4v6pk2Given :1; + unsigned BSIM4v6pk3Given :1; + unsigned BSIM4v6pk3bGiven :1; + unsigned BSIM4v6pw0Given :1; + unsigned BSIM4v6pdvtp0Given :1; + unsigned BSIM4v6pdvtp1Given :1; + unsigned BSIM4v6plpe0Given :1; + unsigned BSIM4v6plpebGiven :1; + unsigned BSIM4v6pdvt0Given :1; + unsigned BSIM4v6pdvt1Given :1; + unsigned BSIM4v6pdvt2Given :1; + unsigned BSIM4v6pdvt0wGiven :1; + unsigned BSIM4v6pdvt1wGiven :1; + unsigned BSIM4v6pdvt2wGiven :1; + unsigned BSIM4v6pdroutGiven :1; + unsigned BSIM4v6pdsubGiven :1; + unsigned BSIM4v6pvth0Given :1; + unsigned BSIM4v6puaGiven :1; + unsigned BSIM4v6pua1Given :1; + unsigned BSIM4v6pubGiven :1; + unsigned BSIM4v6pub1Given :1; + unsigned BSIM4v6pucGiven :1; + unsigned BSIM4v6puc1Given :1; + unsigned BSIM4v6pudGiven :1; + unsigned BSIM4v6pud1Given :1; + unsigned BSIM4v6pupGiven :1; + unsigned BSIM4v6plpGiven :1; + unsigned BSIM4v6pu0Given :1; + unsigned BSIM4v6peuGiven :1; + unsigned BSIM4v6pucsGiven :1; + unsigned BSIM4v6puteGiven :1; + unsigned BSIM4v6pucsteGiven :1; + unsigned BSIM4v6pvoffGiven :1; + unsigned BSIM4v6ptvoffGiven :1; + unsigned BSIM4v6pminvGiven :1; + unsigned BSIM4v6pminvcvGiven :1; + unsigned BSIM4v6prdswGiven :1; + unsigned BSIM4v6prswGiven :1; + unsigned BSIM4v6prdwGiven :1; + unsigned BSIM4v6pprwgGiven :1; + unsigned BSIM4v6pprwbGiven :1; + unsigned BSIM4v6pprtGiven :1; + unsigned BSIM4v6peta0Given :1; + unsigned BSIM4v6petabGiven :1; + unsigned BSIM4v6ppclmGiven :1; + unsigned BSIM4v6ppdibl1Given :1; + unsigned BSIM4v6ppdibl2Given :1; + unsigned BSIM4v6ppdiblbGiven :1; + unsigned BSIM4v6pfproutGiven :1; + unsigned BSIM4v6ppditsGiven :1; + unsigned BSIM4v6ppditsdGiven :1; + unsigned BSIM4v6ppscbe1Given :1; + unsigned BSIM4v6ppscbe2Given :1; + unsigned BSIM4v6ppvagGiven :1; + unsigned BSIM4v6pdeltaGiven :1; + unsigned BSIM4v6pwrGiven :1; + unsigned BSIM4v6pdwgGiven :1; + unsigned BSIM4v6pdwbGiven :1; + unsigned BSIM4v6pb0Given :1; + unsigned BSIM4v6pb1Given :1; + unsigned BSIM4v6palpha0Given :1; + unsigned BSIM4v6palpha1Given :1; + unsigned BSIM4v6pbeta0Given :1; + unsigned BSIM4v6pvfbGiven :1; + unsigned BSIM4v6pagidlGiven :1; + unsigned BSIM4v6pbgidlGiven :1; + unsigned BSIM4v6pcgidlGiven :1; + unsigned BSIM4v6pegidlGiven :1; + unsigned BSIM4v6pagislGiven :1; + unsigned BSIM4v6pbgislGiven :1; + unsigned BSIM4v6pcgislGiven :1; + unsigned BSIM4v6pegislGiven :1; + unsigned BSIM4v6paigcGiven :1; + unsigned BSIM4v6pbigcGiven :1; + unsigned BSIM4v6pcigcGiven :1; + unsigned BSIM4v6paigsdGiven :1; + unsigned BSIM4v6pbigsdGiven :1; + unsigned BSIM4v6pcigsdGiven :1; + unsigned BSIM4v6paigsGiven :1; + unsigned BSIM4v6pbigsGiven :1; + unsigned BSIM4v6pcigsGiven :1; + unsigned BSIM4v6paigdGiven :1; + unsigned BSIM4v6pbigdGiven :1; + unsigned BSIM4v6pcigdGiven :1; + unsigned BSIM4v6paigbaccGiven :1; + unsigned BSIM4v6pbigbaccGiven :1; + unsigned BSIM4v6pcigbaccGiven :1; + unsigned BSIM4v6paigbinvGiven :1; + unsigned BSIM4v6pbigbinvGiven :1; + unsigned BSIM4v6pcigbinvGiven :1; + unsigned BSIM4v6pnigcGiven :1; + unsigned BSIM4v6pnigbinvGiven :1; + unsigned BSIM4v6pnigbaccGiven :1; + unsigned BSIM4v6pntoxGiven :1; + unsigned BSIM4v6peigbinvGiven :1; + unsigned BSIM4v6ppigcdGiven :1; + unsigned BSIM4v6ppoxedgeGiven :1; + unsigned BSIM4v6pxrcrg1Given :1; + unsigned BSIM4v6pxrcrg2Given :1; + unsigned BSIM4v6plambdaGiven :1; + unsigned BSIM4v6pvtlGiven :1; + unsigned BSIM4v6pxnGiven :1; + unsigned BSIM4v6pvfbsdoffGiven :1; + unsigned BSIM4v6ptvfbsdoffGiven :1; + + /* CV model */ + unsigned BSIM4v6pcgslGiven :1; + unsigned BSIM4v6pcgdlGiven :1; + unsigned BSIM4v6pckappasGiven :1; + unsigned BSIM4v6pckappadGiven :1; + unsigned BSIM4v6pcfGiven :1; + unsigned BSIM4v6pclcGiven :1; + unsigned BSIM4v6pcleGiven :1; + unsigned BSIM4v6pvfbcvGiven :1; + unsigned BSIM4v6pnoffGiven :1; + unsigned BSIM4v6pvoffcvGiven :1; + unsigned BSIM4v6pacdeGiven :1; + unsigned BSIM4v6pmoinGiven :1; + + unsigned BSIM4v6useFringeGiven :1; + + unsigned BSIM4v6tnomGiven :1; + unsigned BSIM4v6cgsoGiven :1; + unsigned BSIM4v6cgdoGiven :1; + unsigned BSIM4v6cgboGiven :1; + unsigned BSIM4v6xpartGiven :1; + unsigned BSIM4v6sheetResistanceGiven :1; + + unsigned BSIM4v6SjctSatCurDensityGiven :1; + unsigned BSIM4v6SjctSidewallSatCurDensityGiven :1; + unsigned BSIM4v6SjctGateSidewallSatCurDensityGiven :1; + unsigned BSIM4v6SbulkJctPotentialGiven :1; + unsigned BSIM4v6SbulkJctBotGradingCoeffGiven :1; + unsigned BSIM4v6SsidewallJctPotentialGiven :1; + unsigned BSIM4v6SGatesidewallJctPotentialGiven :1; + unsigned BSIM4v6SbulkJctSideGradingCoeffGiven :1; + unsigned BSIM4v6SunitAreaJctCapGiven :1; + unsigned BSIM4v6SunitLengthSidewallJctCapGiven :1; + unsigned BSIM4v6SbulkJctGateSideGradingCoeffGiven :1; + unsigned BSIM4v6SunitLengthGateSidewallJctCapGiven :1; + unsigned BSIM4v6SjctEmissionCoeffGiven :1; + unsigned BSIM4v6SjctTempExponentGiven :1; + + unsigned BSIM4v6DjctSatCurDensityGiven :1; + unsigned BSIM4v6DjctSidewallSatCurDensityGiven :1; + unsigned BSIM4v6DjctGateSidewallSatCurDensityGiven :1; + unsigned BSIM4v6DbulkJctPotentialGiven :1; + unsigned BSIM4v6DbulkJctBotGradingCoeffGiven :1; + unsigned BSIM4v6DsidewallJctPotentialGiven :1; + unsigned BSIM4v6DGatesidewallJctPotentialGiven :1; + unsigned BSIM4v6DbulkJctSideGradingCoeffGiven :1; + unsigned BSIM4v6DunitAreaJctCapGiven :1; + unsigned BSIM4v6DunitLengthSidewallJctCapGiven :1; + unsigned BSIM4v6DbulkJctGateSideGradingCoeffGiven :1; + unsigned BSIM4v6DunitLengthGateSidewallJctCapGiven :1; + unsigned BSIM4v6DjctEmissionCoeffGiven :1; + unsigned BSIM4v6DjctTempExponentGiven :1; + + unsigned BSIM4v6oxideTrapDensityAGiven :1; + unsigned BSIM4v6oxideTrapDensityBGiven :1; + unsigned BSIM4v6oxideTrapDensityCGiven :1; + unsigned BSIM4v6emGiven :1; + unsigned BSIM4v6efGiven :1; + unsigned BSIM4v6afGiven :1; + unsigned BSIM4v6kfGiven :1; + + unsigned BSIM4v6LintGiven :1; + unsigned BSIM4v6LlGiven :1; + unsigned BSIM4v6LlcGiven :1; + unsigned BSIM4v6LlnGiven :1; + unsigned BSIM4v6LwGiven :1; + unsigned BSIM4v6LwcGiven :1; + unsigned BSIM4v6LwnGiven :1; + unsigned BSIM4v6LwlGiven :1; + unsigned BSIM4v6LwlcGiven :1; + unsigned BSIM4v6LminGiven :1; + unsigned BSIM4v6LmaxGiven :1; + + unsigned BSIM4v6WintGiven :1; + unsigned BSIM4v6WlGiven :1; + unsigned BSIM4v6WlcGiven :1; + unsigned BSIM4v6WlnGiven :1; + unsigned BSIM4v6WwGiven :1; + unsigned BSIM4v6WwcGiven :1; + unsigned BSIM4v6WwnGiven :1; + unsigned BSIM4v6WwlGiven :1; + unsigned BSIM4v6WwlcGiven :1; + unsigned BSIM4v6WminGiven :1; + unsigned BSIM4v6WmaxGiven :1; + + /* added for stress effect */ + unsigned BSIM4v6sarefGiven :1; + unsigned BSIM4v6sbrefGiven :1; + unsigned BSIM4v6wlodGiven :1; + unsigned BSIM4v6ku0Given :1; + unsigned BSIM4v6kvsatGiven :1; + unsigned BSIM4v6kvth0Given :1; + unsigned BSIM4v6tku0Given :1; + unsigned BSIM4v6llodku0Given :1; + unsigned BSIM4v6wlodku0Given :1; + unsigned BSIM4v6llodvthGiven :1; + unsigned BSIM4v6wlodvthGiven :1; + unsigned BSIM4v6lku0Given :1; + unsigned BSIM4v6wku0Given :1; + unsigned BSIM4v6pku0Given :1; + unsigned BSIM4v6lkvth0Given :1; + unsigned BSIM4v6wkvth0Given :1; + unsigned BSIM4v6pkvth0Given :1; + unsigned BSIM4v6stk2Given :1; + unsigned BSIM4v6lodk2Given :1; + unsigned BSIM4v6steta0Given :1; + unsigned BSIM4v6lodeta0Given :1; + + unsigned BSIM4v6webGiven :1; + unsigned BSIM4v6wecGiven :1; + unsigned BSIM4v6kvth0weGiven :1; + unsigned BSIM4v6k2weGiven :1; + unsigned BSIM4v6ku0weGiven :1; + unsigned BSIM4v6screfGiven :1; + unsigned BSIM4v6wpemodGiven :1; + unsigned BSIM4v6lkvth0weGiven :1; + unsigned BSIM4v6lk2weGiven :1; + unsigned BSIM4v6lku0weGiven :1; + unsigned BSIM4v6wkvth0weGiven :1; + unsigned BSIM4v6wk2weGiven :1; + unsigned BSIM4v6wku0weGiven :1; + unsigned BSIM4v6pkvth0weGiven :1; + unsigned BSIM4v6pk2weGiven :1; + unsigned BSIM4v6pku0weGiven :1; + + +} BSIM4v6model; + + +#ifndef NMOS +#define NMOS 1 +#define PMOS -1 +#endif /*NMOS*/ + + +/* Instance parameters */ +#define BSIM4v6_W 1 +#define BSIM4v6_L 2 +#define BSIM4v6_AS 3 +#define BSIM4v6_AD 4 +#define BSIM4v6_PS 5 +#define BSIM4v6_PD 6 +#define BSIM4v6_NRS 7 +#define BSIM4v6_NRD 8 +#define BSIM4v6_OFF 9 +#define BSIM4v6_IC 10 +#define BSIM4v6_IC_VDS 11 +#define BSIM4v6_IC_VGS 12 +#define BSIM4v6_IC_VBS 13 +#define BSIM4v6_TRNQSMOD 14 +#define BSIM4v6_RBODYMOD 15 +#define BSIM4v6_RGATEMOD 16 +#define BSIM4v6_GEOMOD 17 +#define BSIM4v6_RGEOMOD 18 +#define BSIM4v6_NF 19 +#define BSIM4v6_MIN 20 +#define BSIM4v6_ACNQSMOD 22 +#define BSIM4v6_RBDB 23 +#define BSIM4v6_RBSB 24 +#define BSIM4v6_RBPB 25 +#define BSIM4v6_RBPS 26 +#define BSIM4v6_RBPD 27 +#define BSIM4v6_SA 28 +#define BSIM4v6_SB 29 +#define BSIM4v6_SD 30 +#define BSIM4v6_DELVTO 31 +#define BSIM4v6_XGW 32 +#define BSIM4v6_NGCON 33 +#define BSIM4v6_SCA 34 +#define BSIM4v6_SCB 35 +#define BSIM4v6_SCC 36 +#define BSIM4v6_SC 37 +#define BSIM4v6_M 38 + +/* Global parameters */ +#define BSIM4v6_MOD_TEMPEOT 66 +#define BSIM4v6_MOD_LEFFEOT 67 +#define BSIM4v6_MOD_WEFFEOT 68 +#define BSIM4v6_MOD_UCSTE 69 +#define BSIM4v6_MOD_LUCSTE 70 +#define BSIM4v6_MOD_WUCSTE 71 +#define BSIM4v6_MOD_PUCSTE 72 +#define BSIM4v6_MOD_UCS 73 +#define BSIM4v6_MOD_LUCS 74 +#define BSIM4v6_MOD_WUCS 75 +#define BSIM4v6_MOD_PUCS 76 +#define BSIM4v6_MOD_CVCHARGEMOD 77 +#define BSIM4v6_MOD_ADOS 78 +#define BSIM4v6_MOD_BDOS 79 +#define BSIM4v6_MOD_TEMPMOD 80 +#define BSIM4v6_MOD_MTRLMOD 81 +#define BSIM4v6_MOD_IGCMOD 82 +#define BSIM4v6_MOD_IGBMOD 83 +#define BSIM4v6_MOD_ACNQSMOD 84 +#define BSIM4v6_MOD_FNOIMOD 85 +#define BSIM4v6_MOD_RDSMOD 86 +#define BSIM4v6_MOD_DIOMOD 87 +#define BSIM4v6_MOD_PERMOD 88 +#define BSIM4v6_MOD_GEOMOD 89 +#define BSIM4v6_MOD_RGATEMOD 90 +#define BSIM4v6_MOD_RBODYMOD 91 +#define BSIM4v6_MOD_CAPMOD 92 +#define BSIM4v6_MOD_TRNQSMOD 93 +#define BSIM4v6_MOD_MOBMOD 94 +#define BSIM4v6_MOD_TNOIMOD 95 +#define BSIM4v6_MOD_EOT 96 +#define BSIM4v6_MOD_VDDEOT 97 +#define BSIM4v6_MOD_TOXE 98 +#define BSIM4v6_MOD_CDSC 99 +#define BSIM4v6_MOD_CDSCB 100 +#define BSIM4v6_MOD_CIT 101 +#define BSIM4v6_MOD_NFACTOR 102 +#define BSIM4v6_MOD_XJ 103 +#define BSIM4v6_MOD_VSAT 104 +#define BSIM4v6_MOD_AT 105 +#define BSIM4v6_MOD_A0 106 +#define BSIM4v6_MOD_A1 107 +#define BSIM4v6_MOD_A2 108 +#define BSIM4v6_MOD_KETA 109 +#define BSIM4v6_MOD_NSUB 110 +#define BSIM4v6_MOD_PHIG 111 +#define BSIM4v6_MOD_EPSRGATE 112 +#define BSIM4v6_MOD_EASUB 113 +#define BSIM4v6_MOD_EPSRSUB 114 +#define BSIM4v6_MOD_NI0SUB 115 +#define BSIM4v6_MOD_BG0SUB 116 +#define BSIM4v6_MOD_TBGASUB 117 +#define BSIM4v6_MOD_TBGBSUB 118 +#define BSIM4v6_MOD_NDEP 119 +#define BSIM4v6_MOD_NGATE 120 +#define BSIM4v6_MOD_GAMMA1 121 +#define BSIM4v6_MOD_GAMMA2 122 +#define BSIM4v6_MOD_VBX 123 +#define BSIM4v6_MOD_BINUNIT 124 +#define BSIM4v6_MOD_VBM 125 +#define BSIM4v6_MOD_XT 126 +#define BSIM4v6_MOD_K1 129 +#define BSIM4v6_MOD_KT1 130 +#define BSIM4v6_MOD_KT1L 131 +#define BSIM4v6_MOD_K2 132 +#define BSIM4v6_MOD_KT2 133 +#define BSIM4v6_MOD_K3 134 +#define BSIM4v6_MOD_K3B 135 +#define BSIM4v6_MOD_W0 136 +#define BSIM4v6_MOD_LPE0 137 +#define BSIM4v6_MOD_DVT0 138 +#define BSIM4v6_MOD_DVT1 139 +#define BSIM4v6_MOD_DVT2 140 +#define BSIM4v6_MOD_DVT0W 141 +#define BSIM4v6_MOD_DVT1W 142 +#define BSIM4v6_MOD_DVT2W 143 +#define BSIM4v6_MOD_DROUT 144 +#define BSIM4v6_MOD_DSUB 145 +#define BSIM4v6_MOD_VTH0 146 +#define BSIM4v6_MOD_UA 147 +#define BSIM4v6_MOD_UA1 148 +#define BSIM4v6_MOD_UB 149 +#define BSIM4v6_MOD_UB1 150 +#define BSIM4v6_MOD_UC 151 +#define BSIM4v6_MOD_UC1 152 +#define BSIM4v6_MOD_U0 153 +#define BSIM4v6_MOD_UTE 154 +#define BSIM4v6_MOD_VOFF 155 +#define BSIM4v6_MOD_DELTA 156 +#define BSIM4v6_MOD_RDSW 157 +#define BSIM4v6_MOD_PRT 158 +#define BSIM4v6_MOD_LDD 159 +#define BSIM4v6_MOD_ETA 160 +#define BSIM4v6_MOD_ETA0 161 +#define BSIM4v6_MOD_ETAB 162 +#define BSIM4v6_MOD_PCLM 163 +#define BSIM4v6_MOD_PDIBL1 164 +#define BSIM4v6_MOD_PDIBL2 165 +#define BSIM4v6_MOD_PSCBE1 166 +#define BSIM4v6_MOD_PSCBE2 167 +#define BSIM4v6_MOD_PVAG 168 +#define BSIM4v6_MOD_WR 169 +#define BSIM4v6_MOD_DWG 170 +#define BSIM4v6_MOD_DWB 171 +#define BSIM4v6_MOD_B0 172 +#define BSIM4v6_MOD_B1 173 +#define BSIM4v6_MOD_ALPHA0 174 +#define BSIM4v6_MOD_BETA0 175 +#define BSIM4v6_MOD_PDIBLB 178 +#define BSIM4v6_MOD_PRWG 179 +#define BSIM4v6_MOD_PRWB 180 +#define BSIM4v6_MOD_CDSCD 181 +#define BSIM4v6_MOD_AGS 182 +#define BSIM4v6_MOD_FRINGE 184 +#define BSIM4v6_MOD_CGSL 186 +#define BSIM4v6_MOD_CGDL 187 +#define BSIM4v6_MOD_CKAPPAS 188 +#define BSIM4v6_MOD_CF 189 +#define BSIM4v6_MOD_CLC 190 +#define BSIM4v6_MOD_CLE 191 +#define BSIM4v6_MOD_PARAMCHK 192 +#define BSIM4v6_MOD_VERSION 193 +#define BSIM4v6_MOD_VFBCV 194 +#define BSIM4v6_MOD_ACDE 195 +#define BSIM4v6_MOD_MOIN 196 +#define BSIM4v6_MOD_NOFF 197 +#define BSIM4v6_MOD_IJTHDFWD 198 +#define BSIM4v6_MOD_ALPHA1 199 +#define BSIM4v6_MOD_VFB 200 +#define BSIM4v6_MOD_TOXM 201 +#define BSIM4v6_MOD_TCJ 202 +#define BSIM4v6_MOD_TCJSW 203 +#define BSIM4v6_MOD_TCJSWG 204 +#define BSIM4v6_MOD_TPB 205 +#define BSIM4v6_MOD_TPBSW 206 +#define BSIM4v6_MOD_TPBSWG 207 +#define BSIM4v6_MOD_VOFFCV 208 +#define BSIM4v6_MOD_GBMIN 209 +#define BSIM4v6_MOD_RBDB 210 +#define BSIM4v6_MOD_RBSB 211 +#define BSIM4v6_MOD_RBPB 212 +#define BSIM4v6_MOD_RBPS 213 +#define BSIM4v6_MOD_RBPD 214 +#define BSIM4v6_MOD_DMCG 215 +#define BSIM4v6_MOD_DMCI 216 +#define BSIM4v6_MOD_DMDG 217 +#define BSIM4v6_MOD_XGW 218 +#define BSIM4v6_MOD_XGL 219 +#define BSIM4v6_MOD_RSHG 220 +#define BSIM4v6_MOD_NGCON 221 +#define BSIM4v6_MOD_AGIDL 222 +#define BSIM4v6_MOD_BGIDL 223 +#define BSIM4v6_MOD_EGIDL 224 +#define BSIM4v6_MOD_IJTHSFWD 225 +#define BSIM4v6_MOD_XJBVD 226 +#define BSIM4v6_MOD_XJBVS 227 +#define BSIM4v6_MOD_BVD 228 +#define BSIM4v6_MOD_BVS 229 +#define BSIM4v6_MOD_TOXP 230 +#define BSIM4v6_MOD_DTOX 231 +#define BSIM4v6_MOD_XRCRG1 232 +#define BSIM4v6_MOD_XRCRG2 233 +#define BSIM4v6_MOD_EU 234 +#define BSIM4v6_MOD_IJTHSREV 235 +#define BSIM4v6_MOD_IJTHDREV 236 +#define BSIM4v6_MOD_MINV 237 +#define BSIM4v6_MOD_VOFFL 238 +#define BSIM4v6_MOD_PDITS 239 +#define BSIM4v6_MOD_PDITSD 240 +#define BSIM4v6_MOD_PDITSL 241 +#define BSIM4v6_MOD_TNOIA 242 +#define BSIM4v6_MOD_TNOIB 243 +#define BSIM4v6_MOD_NTNOI 244 +#define BSIM4v6_MOD_FPROUT 245 +#define BSIM4v6_MOD_LPEB 246 +#define BSIM4v6_MOD_DVTP0 247 +#define BSIM4v6_MOD_DVTP1 248 +#define BSIM4v6_MOD_CGIDL 249 +#define BSIM4v6_MOD_PHIN 250 +#define BSIM4v6_MOD_RDSWMIN 251 +#define BSIM4v6_MOD_RSW 252 +#define BSIM4v6_MOD_RDW 253 +#define BSIM4v6_MOD_RDWMIN 254 +#define BSIM4v6_MOD_RSWMIN 255 +#define BSIM4v6_MOD_NSD 256 +#define BSIM4v6_MOD_CKAPPAD 257 +#define BSIM4v6_MOD_DMCGT 258 +#define BSIM4v6_MOD_AIGC 259 +#define BSIM4v6_MOD_BIGC 260 +#define BSIM4v6_MOD_CIGC 261 +#define BSIM4v6_MOD_AIGBACC 262 +#define BSIM4v6_MOD_BIGBACC 263 +#define BSIM4v6_MOD_CIGBACC 264 +#define BSIM4v6_MOD_AIGBINV 265 +#define BSIM4v6_MOD_BIGBINV 266 +#define BSIM4v6_MOD_CIGBINV 267 +#define BSIM4v6_MOD_NIGC 268 +#define BSIM4v6_MOD_NIGBACC 269 +#define BSIM4v6_MOD_NIGBINV 270 +#define BSIM4v6_MOD_NTOX 271 +#define BSIM4v6_MOD_TOXREF 272 +#define BSIM4v6_MOD_EIGBINV 273 +#define BSIM4v6_MOD_PIGCD 274 +#define BSIM4v6_MOD_POXEDGE 275 +#define BSIM4v6_MOD_EPSROX 276 +#define BSIM4v6_MOD_AIGSD 277 +#define BSIM4v6_MOD_BIGSD 278 +#define BSIM4v6_MOD_CIGSD 279 +#define BSIM4v6_MOD_JSWGS 280 +#define BSIM4v6_MOD_JSWGD 281 +#define BSIM4v6_MOD_LAMBDA 282 +#define BSIM4v6_MOD_VTL 283 +#define BSIM4v6_MOD_LC 284 +#define BSIM4v6_MOD_XN 285 +#define BSIM4v6_MOD_RNOIA 286 +#define BSIM4v6_MOD_RNOIB 287 +#define BSIM4v6_MOD_VFBSDOFF 288 +#define BSIM4v6_MOD_LINTNOI 289 +#define BSIM4v6_MOD_UD 290 +#define BSIM4v6_MOD_UD1 291 +#define BSIM4v6_MOD_UP 292 +#define BSIM4v6_MOD_LP 293 +#define BSIM4v6_MOD_TVOFF 294 +#define BSIM4v6_MOD_TVFBSDOFF 295 +#define BSIM4v6_MOD_MINVCV 296 +#define BSIM4v6_MOD_VOFFCVL 297 + +/* Length dependence */ +#define BSIM4v6_MOD_LCDSC 301 +#define BSIM4v6_MOD_LCDSCB 302 +#define BSIM4v6_MOD_LCIT 303 +#define BSIM4v6_MOD_LNFACTOR 304 +#define BSIM4v6_MOD_LXJ 305 +#define BSIM4v6_MOD_LVSAT 306 +#define BSIM4v6_MOD_LAT 307 +#define BSIM4v6_MOD_LA0 308 +#define BSIM4v6_MOD_LA1 309 +#define BSIM4v6_MOD_LA2 310 +#define BSIM4v6_MOD_LKETA 311 +#define BSIM4v6_MOD_LNSUB 312 +#define BSIM4v6_MOD_LNDEP 313 +#define BSIM4v6_MOD_LNGATE 315 +#define BSIM4v6_MOD_LGAMMA1 316 +#define BSIM4v6_MOD_LGAMMA2 317 +#define BSIM4v6_MOD_LVBX 318 +#define BSIM4v6_MOD_LVBM 320 +#define BSIM4v6_MOD_LXT 322 +#define BSIM4v6_MOD_LK1 325 +#define BSIM4v6_MOD_LKT1 326 +#define BSIM4v6_MOD_LKT1L 327 +#define BSIM4v6_MOD_LK2 328 +#define BSIM4v6_MOD_LKT2 329 +#define BSIM4v6_MOD_LK3 330 +#define BSIM4v6_MOD_LK3B 331 +#define BSIM4v6_MOD_LW0 332 +#define BSIM4v6_MOD_LLPE0 333 +#define BSIM4v6_MOD_LDVT0 334 +#define BSIM4v6_MOD_LDVT1 335 +#define BSIM4v6_MOD_LDVT2 336 +#define BSIM4v6_MOD_LDVT0W 337 +#define BSIM4v6_MOD_LDVT1W 338 +#define BSIM4v6_MOD_LDVT2W 339 +#define BSIM4v6_MOD_LDROUT 340 +#define BSIM4v6_MOD_LDSUB 341 +#define BSIM4v6_MOD_LVTH0 342 +#define BSIM4v6_MOD_LUA 343 +#define BSIM4v6_MOD_LUA1 344 +#define BSIM4v6_MOD_LUB 345 +#define BSIM4v6_MOD_LUB1 346 +#define BSIM4v6_MOD_LUC 347 +#define BSIM4v6_MOD_LUC1 348 +#define BSIM4v6_MOD_LU0 349 +#define BSIM4v6_MOD_LUTE 350 +#define BSIM4v6_MOD_LVOFF 351 +#define BSIM4v6_MOD_LDELTA 352 +#define BSIM4v6_MOD_LRDSW 353 +#define BSIM4v6_MOD_LPRT 354 +#define BSIM4v6_MOD_LLDD 355 +#define BSIM4v6_MOD_LETA 356 +#define BSIM4v6_MOD_LETA0 357 +#define BSIM4v6_MOD_LETAB 358 +#define BSIM4v6_MOD_LPCLM 359 +#define BSIM4v6_MOD_LPDIBL1 360 +#define BSIM4v6_MOD_LPDIBL2 361 +#define BSIM4v6_MOD_LPSCBE1 362 +#define BSIM4v6_MOD_LPSCBE2 363 +#define BSIM4v6_MOD_LPVAG 364 +#define BSIM4v6_MOD_LWR 365 +#define BSIM4v6_MOD_LDWG 366 +#define BSIM4v6_MOD_LDWB 367 +#define BSIM4v6_MOD_LB0 368 +#define BSIM4v6_MOD_LB1 369 +#define BSIM4v6_MOD_LALPHA0 370 +#define BSIM4v6_MOD_LBETA0 371 +#define BSIM4v6_MOD_LPDIBLB 374 +#define BSIM4v6_MOD_LPRWG 375 +#define BSIM4v6_MOD_LPRWB 376 +#define BSIM4v6_MOD_LCDSCD 377 +#define BSIM4v6_MOD_LAGS 378 + +#define BSIM4v6_MOD_LFRINGE 381 +#define BSIM4v6_MOD_LCGSL 383 +#define BSIM4v6_MOD_LCGDL 384 +#define BSIM4v6_MOD_LCKAPPAS 385 +#define BSIM4v6_MOD_LCF 386 +#define BSIM4v6_MOD_LCLC 387 +#define BSIM4v6_MOD_LCLE 388 +#define BSIM4v6_MOD_LVFBCV 389 +#define BSIM4v6_MOD_LACDE 390 +#define BSIM4v6_MOD_LMOIN 391 +#define BSIM4v6_MOD_LNOFF 392 +#define BSIM4v6_MOD_LALPHA1 394 +#define BSIM4v6_MOD_LVFB 395 +#define BSIM4v6_MOD_LVOFFCV 396 +#define BSIM4v6_MOD_LAGIDL 397 +#define BSIM4v6_MOD_LBGIDL 398 +#define BSIM4v6_MOD_LEGIDL 399 +#define BSIM4v6_MOD_LXRCRG1 400 +#define BSIM4v6_MOD_LXRCRG2 401 +#define BSIM4v6_MOD_LEU 402 +#define BSIM4v6_MOD_LMINV 403 +#define BSIM4v6_MOD_LPDITS 404 +#define BSIM4v6_MOD_LPDITSD 405 +#define BSIM4v6_MOD_LFPROUT 406 +#define BSIM4v6_MOD_LLPEB 407 +#define BSIM4v6_MOD_LDVTP0 408 +#define BSIM4v6_MOD_LDVTP1 409 +#define BSIM4v6_MOD_LCGIDL 410 +#define BSIM4v6_MOD_LPHIN 411 +#define BSIM4v6_MOD_LRSW 412 +#define BSIM4v6_MOD_LRDW 413 +#define BSIM4v6_MOD_LNSD 414 +#define BSIM4v6_MOD_LCKAPPAD 415 +#define BSIM4v6_MOD_LAIGC 416 +#define BSIM4v6_MOD_LBIGC 417 +#define BSIM4v6_MOD_LCIGC 418 +#define BSIM4v6_MOD_LAIGBACC 419 +#define BSIM4v6_MOD_LBIGBACC 420 +#define BSIM4v6_MOD_LCIGBACC 421 +#define BSIM4v6_MOD_LAIGBINV 422 +#define BSIM4v6_MOD_LBIGBINV 423 +#define BSIM4v6_MOD_LCIGBINV 424 +#define BSIM4v6_MOD_LNIGC 425 +#define BSIM4v6_MOD_LNIGBACC 426 +#define BSIM4v6_MOD_LNIGBINV 427 +#define BSIM4v6_MOD_LNTOX 428 +#define BSIM4v6_MOD_LEIGBINV 429 +#define BSIM4v6_MOD_LPIGCD 430 +#define BSIM4v6_MOD_LPOXEDGE 431 +#define BSIM4v6_MOD_LAIGSD 432 +#define BSIM4v6_MOD_LBIGSD 433 +#define BSIM4v6_MOD_LCIGSD 434 + +#define BSIM4v6_MOD_LLAMBDA 435 +#define BSIM4v6_MOD_LVTL 436 +#define BSIM4v6_MOD_LXN 437 +#define BSIM4v6_MOD_LVFBSDOFF 438 +#define BSIM4v6_MOD_LUD 439 +#define BSIM4v6_MOD_LUD1 440 +#define BSIM4v6_MOD_LUP 441 +#define BSIM4v6_MOD_LLP 442 +#define BSIM4v6_MOD_LMINVCV 443 + +/* Width dependence */ +#define BSIM4v6_MOD_WCDSC 481 +#define BSIM4v6_MOD_WCDSCB 482 +#define BSIM4v6_MOD_WCIT 483 +#define BSIM4v6_MOD_WNFACTOR 484 +#define BSIM4v6_MOD_WXJ 485 +#define BSIM4v6_MOD_WVSAT 486 +#define BSIM4v6_MOD_WAT 487 +#define BSIM4v6_MOD_WA0 488 +#define BSIM4v6_MOD_WA1 489 +#define BSIM4v6_MOD_WA2 490 +#define BSIM4v6_MOD_WKETA 491 +#define BSIM4v6_MOD_WNSUB 492 +#define BSIM4v6_MOD_WNDEP 493 +#define BSIM4v6_MOD_WNGATE 495 +#define BSIM4v6_MOD_WGAMMA1 496 +#define BSIM4v6_MOD_WGAMMA2 497 +#define BSIM4v6_MOD_WVBX 498 +#define BSIM4v6_MOD_WVBM 500 +#define BSIM4v6_MOD_WXT 502 +#define BSIM4v6_MOD_WK1 505 +#define BSIM4v6_MOD_WKT1 506 +#define BSIM4v6_MOD_WKT1L 507 +#define BSIM4v6_MOD_WK2 508 +#define BSIM4v6_MOD_WKT2 509 +#define BSIM4v6_MOD_WK3 510 +#define BSIM4v6_MOD_WK3B 511 +#define BSIM4v6_MOD_WW0 512 +#define BSIM4v6_MOD_WLPE0 513 +#define BSIM4v6_MOD_WDVT0 514 +#define BSIM4v6_MOD_WDVT1 515 +#define BSIM4v6_MOD_WDVT2 516 +#define BSIM4v6_MOD_WDVT0W 517 +#define BSIM4v6_MOD_WDVT1W 518 +#define BSIM4v6_MOD_WDVT2W 519 +#define BSIM4v6_MOD_WDROUT 520 +#define BSIM4v6_MOD_WDSUB 521 +#define BSIM4v6_MOD_WVTH0 522 +#define BSIM4v6_MOD_WUA 523 +#define BSIM4v6_MOD_WUA1 524 +#define BSIM4v6_MOD_WUB 525 +#define BSIM4v6_MOD_WUB1 526 +#define BSIM4v6_MOD_WUC 527 +#define BSIM4v6_MOD_WUC1 528 +#define BSIM4v6_MOD_WU0 529 +#define BSIM4v6_MOD_WUTE 530 +#define BSIM4v6_MOD_WVOFF 531 +#define BSIM4v6_MOD_WDELTA 532 +#define BSIM4v6_MOD_WRDSW 533 +#define BSIM4v6_MOD_WPRT 534 +#define BSIM4v6_MOD_WLDD 535 +#define BSIM4v6_MOD_WETA 536 +#define BSIM4v6_MOD_WETA0 537 +#define BSIM4v6_MOD_WETAB 538 +#define BSIM4v6_MOD_WPCLM 539 +#define BSIM4v6_MOD_WPDIBL1 540 +#define BSIM4v6_MOD_WPDIBL2 541 +#define BSIM4v6_MOD_WPSCBE1 542 +#define BSIM4v6_MOD_WPSCBE2 543 +#define BSIM4v6_MOD_WPVAG 544 +#define BSIM4v6_MOD_WWR 545 +#define BSIM4v6_MOD_WDWG 546 +#define BSIM4v6_MOD_WDWB 547 +#define BSIM4v6_MOD_WB0 548 +#define BSIM4v6_MOD_WB1 549 +#define BSIM4v6_MOD_WALPHA0 550 +#define BSIM4v6_MOD_WBETA0 551 +#define BSIM4v6_MOD_WPDIBLB 554 +#define BSIM4v6_MOD_WPRWG 555 +#define BSIM4v6_MOD_WPRWB 556 +#define BSIM4v6_MOD_WCDSCD 557 +#define BSIM4v6_MOD_WAGS 558 + +#define BSIM4v6_MOD_WFRINGE 561 +#define BSIM4v6_MOD_WCGSL 563 +#define BSIM4v6_MOD_WCGDL 564 +#define BSIM4v6_MOD_WCKAPPAS 565 +#define BSIM4v6_MOD_WCF 566 +#define BSIM4v6_MOD_WCLC 567 +#define BSIM4v6_MOD_WCLE 568 +#define BSIM4v6_MOD_WVFBCV 569 +#define BSIM4v6_MOD_WACDE 570 +#define BSIM4v6_MOD_WMOIN 571 +#define BSIM4v6_MOD_WNOFF 572 +#define BSIM4v6_MOD_WALPHA1 574 +#define BSIM4v6_MOD_WVFB 575 +#define BSIM4v6_MOD_WVOFFCV 576 +#define BSIM4v6_MOD_WAGIDL 577 +#define BSIM4v6_MOD_WBGIDL 578 +#define BSIM4v6_MOD_WEGIDL 579 +#define BSIM4v6_MOD_WXRCRG1 580 +#define BSIM4v6_MOD_WXRCRG2 581 +#define BSIM4v6_MOD_WEU 582 +#define BSIM4v6_MOD_WMINV 583 +#define BSIM4v6_MOD_WPDITS 584 +#define BSIM4v6_MOD_WPDITSD 585 +#define BSIM4v6_MOD_WFPROUT 586 +#define BSIM4v6_MOD_WLPEB 587 +#define BSIM4v6_MOD_WDVTP0 588 +#define BSIM4v6_MOD_WDVTP1 589 +#define BSIM4v6_MOD_WCGIDL 590 +#define BSIM4v6_MOD_WPHIN 591 +#define BSIM4v6_MOD_WRSW 592 +#define BSIM4v6_MOD_WRDW 593 +#define BSIM4v6_MOD_WNSD 594 +#define BSIM4v6_MOD_WCKAPPAD 595 +#define BSIM4v6_MOD_WAIGC 596 +#define BSIM4v6_MOD_WBIGC 597 +#define BSIM4v6_MOD_WCIGC 598 +#define BSIM4v6_MOD_WAIGBACC 599 +#define BSIM4v6_MOD_WBIGBACC 600 +#define BSIM4v6_MOD_WCIGBACC 601 +#define BSIM4v6_MOD_WAIGBINV 602 +#define BSIM4v6_MOD_WBIGBINV 603 +#define BSIM4v6_MOD_WCIGBINV 604 +#define BSIM4v6_MOD_WNIGC 605 +#define BSIM4v6_MOD_WNIGBACC 606 +#define BSIM4v6_MOD_WNIGBINV 607 +#define BSIM4v6_MOD_WNTOX 608 +#define BSIM4v6_MOD_WEIGBINV 609 +#define BSIM4v6_MOD_WPIGCD 610 +#define BSIM4v6_MOD_WPOXEDGE 611 +#define BSIM4v6_MOD_WAIGSD 612 +#define BSIM4v6_MOD_WBIGSD 613 +#define BSIM4v6_MOD_WCIGSD 614 +#define BSIM4v6_MOD_WLAMBDA 615 +#define BSIM4v6_MOD_WVTL 616 +#define BSIM4v6_MOD_WXN 617 +#define BSIM4v6_MOD_WVFBSDOFF 618 +#define BSIM4v6_MOD_WUD 619 +#define BSIM4v6_MOD_WUD1 620 +#define BSIM4v6_MOD_WUP 621 +#define BSIM4v6_MOD_WLP 622 +#define BSIM4v6_MOD_WMINVCV 623 + +/* Cross-term dependence */ +#define BSIM4v6_MOD_PCDSC 661 +#define BSIM4v6_MOD_PCDSCB 662 +#define BSIM4v6_MOD_PCIT 663 +#define BSIM4v6_MOD_PNFACTOR 664 +#define BSIM4v6_MOD_PXJ 665 +#define BSIM4v6_MOD_PVSAT 666 +#define BSIM4v6_MOD_PAT 667 +#define BSIM4v6_MOD_PA0 668 +#define BSIM4v6_MOD_PA1 669 +#define BSIM4v6_MOD_PA2 670 +#define BSIM4v6_MOD_PKETA 671 +#define BSIM4v6_MOD_PNSUB 672 +#define BSIM4v6_MOD_PNDEP 673 +#define BSIM4v6_MOD_PNGATE 675 +#define BSIM4v6_MOD_PGAMMA1 676 +#define BSIM4v6_MOD_PGAMMA2 677 +#define BSIM4v6_MOD_PVBX 678 + +#define BSIM4v6_MOD_PVBM 680 + +#define BSIM4v6_MOD_PXT 682 +#define BSIM4v6_MOD_PK1 685 +#define BSIM4v6_MOD_PKT1 686 +#define BSIM4v6_MOD_PKT1L 687 +#define BSIM4v6_MOD_PK2 688 +#define BSIM4v6_MOD_PKT2 689 +#define BSIM4v6_MOD_PK3 690 +#define BSIM4v6_MOD_PK3B 691 +#define BSIM4v6_MOD_PW0 692 +#define BSIM4v6_MOD_PLPE0 693 + +#define BSIM4v6_MOD_PDVT0 694 +#define BSIM4v6_MOD_PDVT1 695 +#define BSIM4v6_MOD_PDVT2 696 + +#define BSIM4v6_MOD_PDVT0W 697 +#define BSIM4v6_MOD_PDVT1W 698 +#define BSIM4v6_MOD_PDVT2W 699 + +#define BSIM4v6_MOD_PDROUT 700 +#define BSIM4v6_MOD_PDSUB 701 +#define BSIM4v6_MOD_PVTH0 702 +#define BSIM4v6_MOD_PUA 703 +#define BSIM4v6_MOD_PUA1 704 +#define BSIM4v6_MOD_PUB 705 +#define BSIM4v6_MOD_PUB1 706 +#define BSIM4v6_MOD_PUC 707 +#define BSIM4v6_MOD_PUC1 708 +#define BSIM4v6_MOD_PU0 709 +#define BSIM4v6_MOD_PUTE 710 +#define BSIM4v6_MOD_PVOFF 711 +#define BSIM4v6_MOD_PDELTA 712 +#define BSIM4v6_MOD_PRDSW 713 +#define BSIM4v6_MOD_PPRT 714 +#define BSIM4v6_MOD_PLDD 715 +#define BSIM4v6_MOD_PETA 716 +#define BSIM4v6_MOD_PETA0 717 +#define BSIM4v6_MOD_PETAB 718 +#define BSIM4v6_MOD_PPCLM 719 +#define BSIM4v6_MOD_PPDIBL1 720 +#define BSIM4v6_MOD_PPDIBL2 721 +#define BSIM4v6_MOD_PPSCBE1 722 +#define BSIM4v6_MOD_PPSCBE2 723 +#define BSIM4v6_MOD_PPVAG 724 +#define BSIM4v6_MOD_PWR 725 +#define BSIM4v6_MOD_PDWG 726 +#define BSIM4v6_MOD_PDWB 727 +#define BSIM4v6_MOD_PB0 728 +#define BSIM4v6_MOD_PB1 729 +#define BSIM4v6_MOD_PALPHA0 730 +#define BSIM4v6_MOD_PBETA0 731 +#define BSIM4v6_MOD_PPDIBLB 734 + +#define BSIM4v6_MOD_PPRWG 735 +#define BSIM4v6_MOD_PPRWB 736 + +#define BSIM4v6_MOD_PCDSCD 737 +#define BSIM4v6_MOD_PAGS 738 + +#define BSIM4v6_MOD_PFRINGE 741 +#define BSIM4v6_MOD_PCGSL 743 +#define BSIM4v6_MOD_PCGDL 744 +#define BSIM4v6_MOD_PCKAPPAS 745 +#define BSIM4v6_MOD_PCF 746 +#define BSIM4v6_MOD_PCLC 747 +#define BSIM4v6_MOD_PCLE 748 +#define BSIM4v6_MOD_PVFBCV 749 +#define BSIM4v6_MOD_PACDE 750 +#define BSIM4v6_MOD_PMOIN 751 +#define BSIM4v6_MOD_PNOFF 752 +#define BSIM4v6_MOD_PALPHA1 754 +#define BSIM4v6_MOD_PVFB 755 +#define BSIM4v6_MOD_PVOFFCV 756 +#define BSIM4v6_MOD_PAGIDL 757 +#define BSIM4v6_MOD_PBGIDL 758 +#define BSIM4v6_MOD_PEGIDL 759 +#define BSIM4v6_MOD_PXRCRG1 760 +#define BSIM4v6_MOD_PXRCRG2 761 +#define BSIM4v6_MOD_PEU 762 +#define BSIM4v6_MOD_PMINV 763 +#define BSIM4v6_MOD_PPDITS 764 +#define BSIM4v6_MOD_PPDITSD 765 +#define BSIM4v6_MOD_PFPROUT 766 +#define BSIM4v6_MOD_PLPEB 767 +#define BSIM4v6_MOD_PDVTP0 768 +#define BSIM4v6_MOD_PDVTP1 769 +#define BSIM4v6_MOD_PCGIDL 770 +#define BSIM4v6_MOD_PPHIN 771 +#define BSIM4v6_MOD_PRSW 772 +#define BSIM4v6_MOD_PRDW 773 +#define BSIM4v6_MOD_PNSD 774 +#define BSIM4v6_MOD_PCKAPPAD 775 +#define BSIM4v6_MOD_PAIGC 776 +#define BSIM4v6_MOD_PBIGC 777 +#define BSIM4v6_MOD_PCIGC 778 +#define BSIM4v6_MOD_PAIGBACC 779 +#define BSIM4v6_MOD_PBIGBACC 780 +#define BSIM4v6_MOD_PCIGBACC 781 +#define BSIM4v6_MOD_PAIGBINV 782 +#define BSIM4v6_MOD_PBIGBINV 783 +#define BSIM4v6_MOD_PCIGBINV 784 +#define BSIM4v6_MOD_PNIGC 785 +#define BSIM4v6_MOD_PNIGBACC 786 +#define BSIM4v6_MOD_PNIGBINV 787 +#define BSIM4v6_MOD_PNTOX 788 +#define BSIM4v6_MOD_PEIGBINV 789 +#define BSIM4v6_MOD_PPIGCD 790 +#define BSIM4v6_MOD_PPOXEDGE 791 +#define BSIM4v6_MOD_PAIGSD 792 +#define BSIM4v6_MOD_PBIGSD 793 +#define BSIM4v6_MOD_PCIGSD 794 + +#define BSIM4v6_MOD_SAREF 795 +#define BSIM4v6_MOD_SBREF 796 +#define BSIM4v6_MOD_KU0 797 +#define BSIM4v6_MOD_KVSAT 798 +#define BSIM4v6_MOD_TKU0 799 +#define BSIM4v6_MOD_LLODKU0 800 +#define BSIM4v6_MOD_WLODKU0 801 +#define BSIM4v6_MOD_LLODVTH 802 +#define BSIM4v6_MOD_WLODVTH 803 +#define BSIM4v6_MOD_LKU0 804 +#define BSIM4v6_MOD_WKU0 805 +#define BSIM4v6_MOD_PKU0 806 +#define BSIM4v6_MOD_KVTH0 807 +#define BSIM4v6_MOD_LKVTH0 808 +#define BSIM4v6_MOD_WKVTH0 809 +#define BSIM4v6_MOD_PKVTH0 810 +#define BSIM4v6_MOD_WLOD 811 +#define BSIM4v6_MOD_STK2 812 +#define BSIM4v6_MOD_LODK2 813 +#define BSIM4v6_MOD_STETA0 814 +#define BSIM4v6_MOD_LODETA0 815 + +#define BSIM4v6_MOD_WEB 816 +#define BSIM4v6_MOD_WEC 817 +#define BSIM4v6_MOD_KVTH0WE 818 +#define BSIM4v6_MOD_K2WE 819 +#define BSIM4v6_MOD_KU0WE 820 +#define BSIM4v6_MOD_SCREF 821 +#define BSIM4v6_MOD_WPEMOD 822 +#define BSIM4v6_MOD_PMINVCV 823 + +#define BSIM4v6_MOD_PLAMBDA 825 +#define BSIM4v6_MOD_PVTL 826 +#define BSIM4v6_MOD_PXN 827 +#define BSIM4v6_MOD_PVFBSDOFF 828 + +#define BSIM4v6_MOD_TNOM 831 +#define BSIM4v6_MOD_CGSO 832 +#define BSIM4v6_MOD_CGDO 833 +#define BSIM4v6_MOD_CGBO 834 +#define BSIM4v6_MOD_XPART 835 +#define BSIM4v6_MOD_RSH 836 +#define BSIM4v6_MOD_JSS 837 +#define BSIM4v6_MOD_PBS 838 +#define BSIM4v6_MOD_MJS 839 +#define BSIM4v6_MOD_PBSWS 840 +#define BSIM4v6_MOD_MJSWS 841 +#define BSIM4v6_MOD_CJS 842 +#define BSIM4v6_MOD_CJSWS 843 +#define BSIM4v6_MOD_NMOS 844 +#define BSIM4v6_MOD_PMOS 845 +#define BSIM4v6_MOD_NOIA 846 +#define BSIM4v6_MOD_NOIB 847 +#define BSIM4v6_MOD_NOIC 848 +#define BSIM4v6_MOD_LINT 849 +#define BSIM4v6_MOD_LL 850 +#define BSIM4v6_MOD_LLN 851 +#define BSIM4v6_MOD_LW 852 +#define BSIM4v6_MOD_LWN 853 +#define BSIM4v6_MOD_LWL 854 +#define BSIM4v6_MOD_LMIN 855 +#define BSIM4v6_MOD_LMAX 856 +#define BSIM4v6_MOD_WINT 857 +#define BSIM4v6_MOD_WL 858 +#define BSIM4v6_MOD_WLN 859 +#define BSIM4v6_MOD_WW 860 +#define BSIM4v6_MOD_WWN 861 +#define BSIM4v6_MOD_WWL 862 +#define BSIM4v6_MOD_WMIN 863 +#define BSIM4v6_MOD_WMAX 864 +#define BSIM4v6_MOD_DWC 865 +#define BSIM4v6_MOD_DLC 866 +#define BSIM4v6_MOD_XL 867 +#define BSIM4v6_MOD_XW 868 +#define BSIM4v6_MOD_EM 869 +#define BSIM4v6_MOD_EF 870 +#define BSIM4v6_MOD_AF 871 +#define BSIM4v6_MOD_KF 872 +#define BSIM4v6_MOD_NJS 873 +#define BSIM4v6_MOD_XTIS 874 +#define BSIM4v6_MOD_PBSWGS 875 +#define BSIM4v6_MOD_MJSWGS 876 +#define BSIM4v6_MOD_CJSWGS 877 +#define BSIM4v6_MOD_JSWS 878 +#define BSIM4v6_MOD_LLC 879 +#define BSIM4v6_MOD_LWC 880 +#define BSIM4v6_MOD_LWLC 881 +#define BSIM4v6_MOD_WLC 882 +#define BSIM4v6_MOD_WWC 883 +#define BSIM4v6_MOD_WWLC 884 +#define BSIM4v6_MOD_DWJ 885 +#define BSIM4v6_MOD_JSD 886 +#define BSIM4v6_MOD_PBD 887 +#define BSIM4v6_MOD_MJD 888 +#define BSIM4v6_MOD_PBSWD 889 +#define BSIM4v6_MOD_MJSWD 890 +#define BSIM4v6_MOD_CJD 891 +#define BSIM4v6_MOD_CJSWD 892 +#define BSIM4v6_MOD_NJD 893 +#define BSIM4v6_MOD_XTID 894 +#define BSIM4v6_MOD_PBSWGD 895 +#define BSIM4v6_MOD_MJSWGD 896 +#define BSIM4v6_MOD_CJSWGD 897 +#define BSIM4v6_MOD_JSWD 898 +#define BSIM4v6_MOD_DLCIG 899 + +/* trap-assisted tunneling */ + +#define BSIM4v6_MOD_JTSS 900 +#define BSIM4v6_MOD_JTSD 901 +#define BSIM4v6_MOD_JTSSWS 902 +#define BSIM4v6_MOD_JTSSWD 903 +#define BSIM4v6_MOD_JTSSWGS 904 +#define BSIM4v6_MOD_JTSSWGD 905 +#define BSIM4v6_MOD_NJTS 906 +#define BSIM4v6_MOD_NJTSSW 907 +#define BSIM4v6_MOD_NJTSSWG 908 +#define BSIM4v6_MOD_XTSS 909 +#define BSIM4v6_MOD_XTSD 910 +#define BSIM4v6_MOD_XTSSWS 911 +#define BSIM4v6_MOD_XTSSWD 912 +#define BSIM4v6_MOD_XTSSWGS 913 +#define BSIM4v6_MOD_XTSSWGD 914 +#define BSIM4v6_MOD_TNJTS 915 +#define BSIM4v6_MOD_TNJTSSW 916 +#define BSIM4v6_MOD_TNJTSSWG 917 +#define BSIM4v6_MOD_VTSS 918 +#define BSIM4v6_MOD_VTSD 919 +#define BSIM4v6_MOD_VTSSWS 920 +#define BSIM4v6_MOD_VTSSWD 921 +#define BSIM4v6_MOD_VTSSWGS 922 +#define BSIM4v6_MOD_VTSSWGD 923 +#define BSIM4v6_MOD_PUD 924 +#define BSIM4v6_MOD_PUD1 925 +#define BSIM4v6_MOD_PUP 926 +#define BSIM4v6_MOD_PLP 927 +#define BSIM4v6_MOD_JTWEFF 928 + +/* device questions */ +#define BSIM4v6_DNODE 945 +#define BSIM4v6_GNODEEXT 946 +#define BSIM4v6_SNODE 947 +#define BSIM4v6_BNODE 948 +#define BSIM4v6_DNODEPRIME 949 +#define BSIM4v6_GNODEPRIME 950 +#define BSIM4v6_GNODEMIDE 951 +#define BSIM4v6_GNODEMID 952 +#define BSIM4v6_SNODEPRIME 953 +#define BSIM4v6_BNODEPRIME 954 +#define BSIM4v6_DBNODE 955 +#define BSIM4v6_SBNODE 956 +#define BSIM4v6_VBD 957 +#define BSIM4v6_VBS 958 +#define BSIM4v6_VGS 959 +#define BSIM4v6_VDS 960 +#define BSIM4v6_CD 961 +#define BSIM4v6_CBS 962 +#define BSIM4v6_CBD 963 +#define BSIM4v6_GM 964 +#define BSIM4v6_GDS 965 +#define BSIM4v6_GMBS 966 +#define BSIM4v6_GBD 967 +#define BSIM4v6_GBS 968 +#define BSIM4v6_QB 969 +#define BSIM4v6_CQB 970 +#define BSIM4v6_QG 971 +#define BSIM4v6_CQG 972 +#define BSIM4v6_QD 973 +#define BSIM4v6_CQD 974 +#define BSIM4v6_CGGB 975 +#define BSIM4v6_CGDB 976 +#define BSIM4v6_CGSB 977 +#define BSIM4v6_CBGB 978 +#define BSIM4v6_CAPBD 979 +#define BSIM4v6_CQBD 980 +#define BSIM4v6_CAPBS 981 +#define BSIM4v6_CQBS 982 +#define BSIM4v6_CDGB 983 +#define BSIM4v6_CDDB 984 +#define BSIM4v6_CDSB 985 +#define BSIM4v6_VON 986 +#define BSIM4v6_VDSAT 987 +#define BSIM4v6_QBS 988 +#define BSIM4v6_QBD 989 +#define BSIM4v6_SOURCECONDUCT 990 +#define BSIM4v6_DRAINCONDUCT 991 +#define BSIM4v6_CBDB 992 +#define BSIM4v6_CBSB 993 +#define BSIM4v6_CSUB 994 +#define BSIM4v6_QINV 995 +#define BSIM4v6_IGIDL 996 +#define BSIM4v6_CSGB 997 +#define BSIM4v6_CSDB 998 +#define BSIM4v6_CSSB 999 +#define BSIM4v6_CGBB 1000 +#define BSIM4v6_CDBB 1001 +#define BSIM4v6_CSBB 1002 +#define BSIM4v6_CBBB 1003 +#define BSIM4v6_QS 1004 +#define BSIM4v6_IGISL 1005 +#define BSIM4v6_IGS 1006 +#define BSIM4v6_IGD 1007 +#define BSIM4v6_IGB 1008 +#define BSIM4v6_IGCS 1009 +#define BSIM4v6_IGCD 1010 +#define BSIM4v6_QDEF 1011 +#define BSIM4v6_DELVT0 1012 +#define BSIM4v6_GCRG 1013 +#define BSIM4v6_GTAU 1014 + +#define BSIM4v6_MOD_LTVOFF 1051 +#define BSIM4v6_MOD_LTVFBSDOFF 1052 +#define BSIM4v6_MOD_WTVOFF 1053 +#define BSIM4v6_MOD_WTVFBSDOFF 1054 +#define BSIM4v6_MOD_PTVOFF 1055 +#define BSIM4v6_MOD_PTVFBSDOFF 1056 + +#define BSIM4v6_MOD_LKVTH0WE 1061 +#define BSIM4v6_MOD_LK2WE 1062 +#define BSIM4v6_MOD_LKU0WE 1063 +#define BSIM4v6_MOD_WKVTH0WE 1064 +#define BSIM4v6_MOD_WK2WE 1065 +#define BSIM4v6_MOD_WKU0WE 1066 +#define BSIM4v6_MOD_PKVTH0WE 1067 +#define BSIM4v6_MOD_PK2WE 1068 +#define BSIM4v6_MOD_PKU0WE 1069 + +#define BSIM4v6_MOD_RBPS0 1101 +#define BSIM4v6_MOD_RBPSL 1102 +#define BSIM4v6_MOD_RBPSW 1103 +#define BSIM4v6_MOD_RBPSNF 1104 +#define BSIM4v6_MOD_RBPD0 1105 +#define BSIM4v6_MOD_RBPDL 1106 +#define BSIM4v6_MOD_RBPDW 1107 +#define BSIM4v6_MOD_RBPDNF 1108 + +#define BSIM4v6_MOD_RBPBX0 1109 +#define BSIM4v6_MOD_RBPBXL 1110 +#define BSIM4v6_MOD_RBPBXW 1111 +#define BSIM4v6_MOD_RBPBXNF 1112 +#define BSIM4v6_MOD_RBPBY0 1113 +#define BSIM4v6_MOD_RBPBYL 1114 +#define BSIM4v6_MOD_RBPBYW 1115 +#define BSIM4v6_MOD_RBPBYNF 1116 + +#define BSIM4v6_MOD_RBSBX0 1117 +#define BSIM4v6_MOD_RBSBY0 1118 +#define BSIM4v6_MOD_RBDBX0 1119 +#define BSIM4v6_MOD_RBDBY0 1120 + +#define BSIM4v6_MOD_RBSDBXL 1121 +#define BSIM4v6_MOD_RBSDBXW 1122 +#define BSIM4v6_MOD_RBSDBXNF 1123 +#define BSIM4v6_MOD_RBSDBYL 1124 +#define BSIM4v6_MOD_RBSDBYW 1125 +#define BSIM4v6_MOD_RBSDBYNF 1126 + +#define BSIM4v6_MOD_AGISL 1200 +#define BSIM4v6_MOD_BGISL 1201 +#define BSIM4v6_MOD_EGISL 1202 +#define BSIM4v6_MOD_CGISL 1203 +#define BSIM4v6_MOD_LAGISL 1204 +#define BSIM4v6_MOD_LBGISL 1205 +#define BSIM4v6_MOD_LEGISL 1206 +#define BSIM4v6_MOD_LCGISL 1207 +#define BSIM4v6_MOD_WAGISL 1208 +#define BSIM4v6_MOD_WBGISL 1209 +#define BSIM4v6_MOD_WEGISL 1210 +#define BSIM4v6_MOD_WCGISL 1211 +#define BSIM4v6_MOD_PAGISL 1212 +#define BSIM4v6_MOD_PBGISL 1213 +#define BSIM4v6_MOD_PEGISL 1214 +#define BSIM4v6_MOD_PCGISL 1215 + +#define BSIM4v6_MOD_AIGS 1220 +#define BSIM4v6_MOD_BIGS 1221 +#define BSIM4v6_MOD_CIGS 1222 +#define BSIM4v6_MOD_LAIGS 1223 +#define BSIM4v6_MOD_LBIGS 1224 +#define BSIM4v6_MOD_LCIGS 1225 +#define BSIM4v6_MOD_WAIGS 1226 +#define BSIM4v6_MOD_WBIGS 1227 +#define BSIM4v6_MOD_WCIGS 1228 +#define BSIM4v6_MOD_PAIGS 1229 +#define BSIM4v6_MOD_PBIGS 1230 +#define BSIM4v6_MOD_PCIGS 1231 +#define BSIM4v6_MOD_AIGD 1232 +#define BSIM4v6_MOD_BIGD 1233 +#define BSIM4v6_MOD_CIGD 1234 +#define BSIM4v6_MOD_LAIGD 1235 +#define BSIM4v6_MOD_LBIGD 1236 +#define BSIM4v6_MOD_LCIGD 1237 +#define BSIM4v6_MOD_WAIGD 1238 +#define BSIM4v6_MOD_WBIGD 1239 +#define BSIM4v6_MOD_WCIGD 1240 +#define BSIM4v6_MOD_PAIGD 1241 +#define BSIM4v6_MOD_PBIGD 1242 +#define BSIM4v6_MOD_PCIGD 1243 +#define BSIM4v6_MOD_DLCIGD 1244 + +#define BSIM4v6_MOD_NJTSD 1250 +#define BSIM4v6_MOD_NJTSSWD 1251 +#define BSIM4v6_MOD_NJTSSWGD 1252 +#define BSIM4v6_MOD_TNJTSD 1253 +#define BSIM4v6_MOD_TNJTSSWD 1254 +#define BSIM4v6_MOD_TNJTSSWGD 1255 + +#include "bsim4v6ext.h" + +extern void BSIM4v6evaluate(double,double,double,BSIM4v6instance*,BSIM4v6model*, + double*,double*,double*, double*, double*, double*, double*, + double*, double*, double*, double*, double*, double*, double*, + double*, double*, double*, double*, CKTcircuit*); +extern int BSIM4v6debug(BSIM4v6model*, BSIM4v6instance*, CKTcircuit*, int); +extern int BSIM4v6checkModel(BSIM4v6model*, BSIM4v6instance*, CKTcircuit*); +extern int BSIM4v6PAeffGeo(double, int, int, double, double, double, double, double *, double *, double *, double *); +extern int BSIM4v6RdseffGeo(double, int, int, int, double, double, double, double, double, int, double *); + + +#endif /*BSIM4v6*/ diff --git a/src/spicelib/devices/bsim4v6/bsim4v6ext.h b/src/spicelib/devices/bsim4v6/bsim4v6ext.h new file mode 100644 index 000000000..c78426430 --- /dev/null +++ b/src/spicelib/devices/bsim4v6/bsim4v6ext.h @@ -0,0 +1,30 @@ +/********** +Copyright 2004 Regents of the University of California. All rights reserved. +Author: 2000 Weidong Liu +Author: 2001- Xuemei Xi +File: bsim4v6ext.h +**********/ + +extern int BSIM4v6acLoad(GENmodel *,CKTcircuit*); +extern int BSIM4v6ask(CKTcircuit *,GENinstance*,int,IFvalue*,IFvalue*); +extern int BSIM4v6convTest(GENmodel *,CKTcircuit*); +extern int BSIM4v6delete(GENmodel*,IFuid,GENinstance**); +extern void BSIM4v6destroy(GENmodel**); +extern int BSIM4v6getic(GENmodel*,CKTcircuit*); +extern int BSIM4v6load(GENmodel*,CKTcircuit*); +extern int BSIM4v6mAsk(CKTcircuit*,GENmodel *,int, IFvalue*); +extern int BSIM4v6mDelete(GENmodel**,IFuid,GENmodel*); +extern int BSIM4v6mParam(int,IFvalue*,GENmodel*); +extern void BSIM4v6mosCap(CKTcircuit*, double, double, double, double, + double, double, double, double, double, double, double, + double, double, double, double, double, double, double*, + double*, double*, double*, double*, double*, double*, double*, + double*, double*, double*, double*, double*, double*, double*, + double*); +extern int BSIM4v6param(int,IFvalue*,GENinstance*,IFvalue*); +extern int BSIM4v6pzLoad(GENmodel*,CKTcircuit*,SPcomplex*); +extern int BSIM4v6setup(SMPmatrix*,GENmodel*,CKTcircuit*,int*); +extern int BSIM4v6temp(GENmodel*,CKTcircuit*); +extern int BSIM4v6trunc(GENmodel*,CKTcircuit*,double*); +extern int BSIM4v6noise(int,int,GENmodel*,CKTcircuit*,Ndata*,double*); +extern int BSIM4v6unsetup(GENmodel*,CKTcircuit*); diff --git a/src/spicelib/devices/bsim4v6/bsim4v6init.c b/src/spicelib/devices/bsim4v6/bsim4v6init.c new file mode 100644 index 000000000..de1ac3499 --- /dev/null +++ b/src/spicelib/devices/bsim4v6/bsim4v6init.c @@ -0,0 +1,83 @@ +#include "config.h" + +#include "devdefs.h" + +#include "bsim4v6itf.h" +#include "bsim4v6ext.h" +#include "bsim4v6init.h" + + +SPICEdev BSIM4v6info = { + { + "BSIM4v6", + "Berkeley Short Channel IGFET Model-4", + + &BSIM4v6nSize, + &BSIM4v6nSize, + BSIM4v6names, + + &BSIM4v6pTSize, + BSIM4v6pTable, + + &BSIM4v6mPTSize, + BSIM4v6mPTable, + +#ifdef XSPICE +/*---- Fixed by SDB 5.2.2003 to enable XSPICE/tclspice integration -----*/ + NULL, /* This is a SPICE device, it has no MIF info data */ + + 0, /* This is a SPICE device, it has no MIF info data */ + NULL, /* This is a SPICE device, it has no MIF info data */ + + 0, /* This is a SPICE device, it has no MIF info data */ + NULL, /* This is a SPICE device, it has no MIF info data */ + + 0, /* This is a SPICE device, it has no MIF info data */ + NULL, /* This is a SPICE device, it has no MIF info data */ +/*--------------------------- End of SDB fix -------------------------*/ +#endif + + DEV_DEFAULT + }, + + BSIM4v6param, /* DEVparam */ + BSIM4v6mParam, /* DEVmodParam */ + BSIM4v6load, /* DEVload */ + BSIM4v6setup, /* DEVsetup */ + BSIM4v6unsetup, /* DEVunsetup */ + BSIM4v6setup, /* DEVpzSetup */ + BSIM4v6temp, /* DEVtemperature */ + BSIM4v6trunc, /* DEVtrunc */ + NULL, /* DEVfindBranch */ + BSIM4v6acLoad, /* DEVacLoad */ + NULL, /* DEVaccept */ + BSIM4v6destroy, /* DEVdestroy */ + BSIM4v6mDelete, /* DEVmodDelete */ + BSIM4v6delete, /* DEVdelete */ + BSIM4v6getic, /* DEVsetic */ + BSIM4v6ask, /* DEVask */ + BSIM4v6mAsk, /* DEVmodAsk */ + BSIM4v6pzLoad, /* DEVpzLoad */ + BSIM4v6convTest, /* DEVconvTest */ + NULL, /* DEVsenSetup */ + NULL, /* DEVsenLoad */ + NULL, /* DEVsenUpdate */ + NULL, /* DEVsenAcLoad */ + NULL, /* DEVsenPrint */ + NULL, /* DEVsenTrunc */ + NULL, /* DEVdisto */ + BSIM4v6noise, /* DEVnoise */ +#ifdef CIDER + NULL, /* DEVdump */ + NULL, /* DEVacct */ +#endif + &BSIM4v6iSize, /* DEVinstSize */ + &BSIM4v6mSize /* DEVmodSize */ +}; + + +SPICEdev * +get_bsim4v6_info(void) +{ + return &BSIM4v6info; +} diff --git a/src/spicelib/devices/bsim4v6/bsim4v6init.h b/src/spicelib/devices/bsim4v6/bsim4v6init.h new file mode 100644 index 000000000..51e4ae05c --- /dev/null +++ b/src/spicelib/devices/bsim4v6/bsim4v6init.h @@ -0,0 +1,13 @@ +#ifndef _BSIM4v6INIT_H +#define _BSIM4v6INIT_H + +extern IFparm BSIM4v6pTable[ ]; +extern IFparm BSIM4v6mPTable[ ]; +extern char *BSIM4v6names[ ]; +extern int BSIM4v6pTSize; +extern int BSIM4v6mPTSize; +extern int BSIM4v6nSize; +extern int BSIM4v6iSize; +extern int BSIM4v6mSize; + +#endif diff --git a/src/spicelib/devices/bsim4v6/bsim4v6itf.h b/src/spicelib/devices/bsim4v6/bsim4v6itf.h new file mode 100644 index 000000000..7acd92f7e --- /dev/null +++ b/src/spicelib/devices/bsim4v6/bsim4v6itf.h @@ -0,0 +1,13 @@ +/********** +Copyright 2004 Regents of the University of California. All rights reserved. +Author: 2000 Weidong Liu. +Author: 2001- Xuemei Xi +File: bsim4v6itf.h +**********/ + +#ifndef DEV_BSIM4v6 +#define DEV_BSIM4v6 + +SPICEdev *get_bsim4v6_info(void); + +#endif diff --git a/src/spicelib/devices/dev.c b/src/spicelib/devices/dev.c index 67f67a231..d66955972 100644 --- a/src/spicelib/devices/dev.c +++ b/src/spicelib/devices/dev.c @@ -83,10 +83,9 @@ int add_udn(int,Evt_Udn_Info_t **); #include "bsim3v1/bsim3v1itf.h" #include "bsim3v32/bsim3v32itf.h" #include "bsim4/bsim4itf.h" -#include "bsim4v2/bsim4v2itf.h" -#include "bsim4v3/bsim4v3itf.h" #include "bsim4v4/bsim4v4itf.h" #include "bsim4v5/bsim4v5itf.h" +#include "bsim4v6/bsim4v6itf.h" #include "bsim3soi/b4soiitf.h" #include "bsim3soi_pd/b3soipditf.h" #include "bsim3soi_fd/b3soifditf.h" @@ -193,80 +192,79 @@ spice_init_devices(void) DEVices[ 8] = get_bsim3v32_info(); DEVices[ 9] = get_b4soi_info(); DEVices[10] = get_bsim4_info(); - DEVices[11] = get_bsim4v2_info(); - DEVices[12] = get_bsim4v3_info(); - DEVices[13] = get_bsim4v4_info(); - DEVices[14] = get_bsim4v5_info(); - DEVices[15] = get_b3soipd_info(); - DEVices[16] = get_b3soifd_info(); - DEVices[17] = get_b3soidd_info(); - DEVices[18] = get_cap_info(); - DEVices[19] = get_cccs_info(); - DEVices[20] = get_ccvs_info(); - DEVices[21] = get_cpl_info(); - DEVices[22] = get_csw_info(); - DEVices[23] = get_dio_info(); - DEVices[24] = get_hfeta_info(); - DEVices[25] = get_hfet2_info(); - DEVices[26] = get_hsm2_info(); - DEVices[27] = get_hsmhv_info(); - DEVices[28] = get_ind_info(); - DEVices[29] = get_mut_info(); - DEVices[30] = get_isrc_info(); - DEVices[31] = get_jfet_info(); - DEVices[32] = get_jfet2_info(); - DEVices[33] = get_ltra_info(); - DEVices[34] = get_mes_info(); - DEVices[35] = get_mesa_info(); - DEVices[36] = get_mos1_info(); - DEVices[37] = get_mos2_info(); - DEVices[38] = get_mos3_info(); - DEVices[39] = get_mos6_info(); - DEVices[40] = get_mos9_info(); - DEVices[41] = get_res_info(); - DEVices[42] = get_soi3_info(); - DEVices[43] = get_sw_info(); - DEVices[44] = get_tra_info(); - DEVices[45] = get_txl_info(); - DEVices[46] = get_vbic_info(); - DEVices[47] = get_vccs_info(); - DEVices[48] = get_vcvs_info(); - DEVices[49] = get_vsrc_info(); + DEVices[11] = get_bsim4v4_info(); + DEVices[12] = get_bsim4v5_info(); + DEVices[13] = get_bsim4v6_info(); + DEVices[14] = get_b3soipd_info(); + DEVices[15] = get_b3soifd_info(); + DEVices[16] = get_b3soidd_info(); + DEVices[17] = get_cap_info(); + DEVices[18] = get_cccs_info(); + DEVices[19] = get_ccvs_info(); + DEVices[20] = get_cpl_info(); + DEVices[21] = get_csw_info(); + DEVices[22] = get_dio_info(); + DEVices[23] = get_hfeta_info(); + DEVices[24] = get_hfet2_info(); + DEVices[25] = get_hsm2_info(); + DEVices[26] = get_hsmhv_info(); + DEVices[27] = get_ind_info(); + DEVices[28] = get_mut_info(); + DEVices[29] = get_isrc_info(); + DEVices[30] = get_jfet_info(); + DEVices[31] = get_jfet2_info(); + DEVices[32] = get_ltra_info(); + DEVices[33] = get_mes_info(); + DEVices[34] = get_mesa_info(); + DEVices[35] = get_mos1_info(); + DEVices[36] = get_mos2_info(); + DEVices[37] = get_mos3_info(); + DEVices[38] = get_mos6_info(); + DEVices[39] = get_mos9_info(); + DEVices[40] = get_res_info(); + DEVices[41] = get_soi3_info(); + DEVices[42] = get_sw_info(); + DEVices[43] = get_tra_info(); + DEVices[44] = get_txl_info(); + DEVices[45] = get_vbic_info(); + DEVices[46] = get_vccs_info(); + DEVices[47] = get_vcvs_info(); + DEVices[48] = get_vsrc_info(); #ifdef CIDER - DEVices[50] = get_nbjt_info(); - DEVices[51] = get_nbjt2_info(); - DEVices[52] = get_numd_info(); - DEVices[53] = get_numd2_info(); - DEVices[54] = get_numos_info(); + DEVices[49] = get_nbjt_info(); + DEVices[50] = get_nbjt2_info(); + DEVices[51] = get_numd_info(); + DEVices[52] = get_numd2_info(); + DEVices[53] = get_numos_info(); #else + DEVices[49] = NULL; DEVices[50] = NULL; DEVices[51] = NULL; DEVices[52] = NULL; - DEVices[53] = NULL; - DEVices[54] = NULL; + DEVices[53] = NULL; #endif #ifdef ADMS - DEVices[55] = get_hicum0_info(); - DEVices[56] = get_hicum2_info(); - DEVices[57] = get_mextram_info(); - DEVices[58] = get_ekv_info(); - DEVices[59] = get_psp102_info(); + DEVices[54] = get_hicum0_info(); + DEVices[55] = get_hicum2_info(); + DEVices[56] = get_mextram_info(); + DEVices[57] = get_ekv_info(); + DEVices[58] = get_psp102_info(); #else + DEVices[54] = NULL; DEVices[55] = NULL; DEVices[56] = NULL; DEVices[57] = NULL; DEVices[58] = NULL; - DEVices[59] = NULL; #endif #ifdef NDEV /* NDEV */ - DEVices[60] = get_ndev_info(); + DEVices[59] = get_ndev_info(); #else - DEVices[60] = NULL; + DEVices[59] = NULL; #endif + DEVices[60] = NULL; DEVices[61] = NULL; - DEVices[62] = NULL; return; } @@ -290,12 +288,12 @@ SPICEdev ** devices(void) /*not yet usable*/ #ifdef ADMS -#define DEVICES_USED {"asrc", "bjt", "vbic", "bsim1", "bsim2", "bsim3", "bsim3v32", "bsim3v2", "bsim3v1", "bsim4", "bsim4v2", "bsim4v3", "bsim4v4", "bsim4v5", \ +#define DEVICES_USED {"asrc", "bjt", "vbic", "bsim1", "bsim2", "bsim3", "bsim3v32", "bsim3v2", "bsim3v1", "bsim4", "bsim4v4", "bsim4v5", "bsim4v6", \ "bsim4soi", "bsim3soipd", "bsim3soifd", "bsim3soidd", "hisim2", "hisimhv", \ "cap", "cccs", "ccvs", "csw", "dio", "hfet", "hfet2", "ind", "isrc", "jfet", "ltra", "mes", "mesa" ,"mos1", "mos2", "mos3", \ "mos6", "mos9", "res", "soi3", "sw", "tra", "urc", "vccs", "vcvs", "vsrc", "hicum0", "hicum2", "mextram", "ekv", "psp102"} #else -#define DEVICES_USED {"asrc", "bjt", "vbic", "bsim1", "bsim2", "bsim3", "bsim3v32", "bsim3v2", "bsim3v1", "bsim4", "bsim4v4", "bsim4v2", "bsim4v3", "bsim4v4", "bsim4v5", \ +#define DEVICES_USED {"asrc", "bjt", "vbic", "bsim1", "bsim2", "bsim3", "bsim3v32", "bsim3v2", "bsim3v1", "bsim4", "bsim4v4", "bsim4v5", "bsim4v6", \ "bsim4soi", "bsim3soipd", "bsim3soifd", "bsim3soidd", "hisim2", "hisimhv", \ "cap", "cccs", "ccvs", "csw", "dio", "hfet", "hfet2", "ind", "isrc", "jfet", "ltra", "mes", "mesa" ,"mos1", "mos2", "mos3", \ "mos6", "mos9", "res", "soi3", "sw", "tra", "urc", "vccs", "vcvs", "vsrc"}