diff --git a/%bsim6.el b/%bsim6.el
index 6d75512d1..865c1cd51 100644
--- a/%bsim6.el
+++ b/%bsim6.el
@@ -16,6 +16,7 @@ Using: /home/larice/s/ngspice.work/work/ngspice/adms/ADMS/testcases/../admsXml/a
(compile "cd src/spicelib/devices/adms/mextram/admsva && make -if my.mak to")
(compile "cd src/spicelib/devices/adms/psp102/admsva && make -if my.mak to")
(compile "cd src/spicelib/devices/adms/ekv/admsva && make -if my.mak to")
+(compile "cd src/spicelib/devices/adms/bsimcmg/admsva && make -if my.mak to")
;; note only some blessed module names are accepted, see ngspiceVersion.xml
;; here I reuse r2_cmc
@@ -38,3 +39,7 @@ and all the code in bsim..h
((GEOMOD)==(0))
kommt in /* case */ als GEOMOD statt here->GEOMOD
+
+(compile "wget http://bsim.berkeley.edu/BSIMCMG/BSIMCMG110.0.0_20160101.tar.gz")
+(compile "mkdir -p src/spicelib/devices/adms/bsimcmg/admsva")
+(compile "tar --dir src/spicelib/devices/adms/bsimcmg/admsva -zxvf BSIMCMG110.0.0_20160101.tar.gz code")
diff --git a/src/spicelib/devices/adms/admst/ngspiceVersion.xml b/src/spicelib/devices/adms/admst/ngspiceVersion.xml
index 49f9c5ee4..470a5cfc0 100644
--- a/src/spicelib/devices/adms/admst/ngspiceVersion.xml
+++ b/src/spicelib/devices/adms/admst/ngspiceVersion.xml
@@ -2182,6 +2182,53 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/spicelib/devices/adms/bsimcmg/admsva/bsimcmg.va b/src/spicelib/devices/adms/bsimcmg/admsva/bsimcmg.va
new file mode 100644
index 000000000..5f15f3875
--- /dev/null
+++ b/src/spicelib/devices/adms/bsimcmg/admsva/bsimcmg.va
@@ -0,0 +1,117 @@
+// ********************************************************
+// **** BSIM-CMG 110.0.0 released by Sourabh Khandelwal on 01/01/2016 *****/
+// * BSIM Common Multi-Gate Model Equations (Verilog-A)
+// ********************************************************
+//
+// ********************************************************
+// * Copyright 2016 Regents of the University of California.
+// * All rights reserved.
+// *
+// * Project Director: Prof. Chenming Hu.
+// * Authors: Sriramkumar V., Navid Paydavosi, Juan Duarte, Darsen Lu, Sourabh Khandelwal
+// * Chung-Hsun Lin, Mohan Dunga, Shijing Yao,
+// * Ali Niknejad, Chenming Hu
+// ********************************************************
+// ********************************************************
+// * NONDISCLOSURE STATEMENT
+// 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 of California owns the copyright and grants users a perpetual,
+// irrevocable, worldwide, non-exclusive, royalty-free license with
+// respect to the software as set forth below.
+// 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 University of California 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
+// Agreed to on __Jan 01, 2016__________________
+// By: ___University of California, Berkeley____
+// ___Chenming Hu_____________________
+// ___Professor in Graduate School _______
+// ********************************************************
+
+
+`include "constants.vams"
+`include "disciplines.vams"
+
+/**************************************************************/
+/* SHMOD is a model parameter */
+/* SHMOD = 1 : Self-heating turned on */
+/* SHMOD = 0 : Self-heating turned off */
+/* */
+/* RDSMOD is a model parameter */
+/* RDSMOD = 1 : External source/drain resistance model */
+/* RDSMOD = 0 : Internal source/drain resistance model */
+/* RDSMOD = 2 : Internal Bias Dependent and Bias Independent part of source/drain resistance */
+/* */
+/* NQSMOD is a model parameter */
+/* NQSMOD = 1 : NQS Resistance / gi node turned on */
+/* NQSMOD = 0 : NQS Resistance / gi node turned off */
+/* */
+/* RGATEMOD is a model parameter */
+/* RGATEMOD = 1 : Gate Resistance / ge node turned on */
+/* RGATEMOD = 0 : Gate Resistance / ge node turned off */
+/**************************************************************/
+//
+// In Verilog-A the number of internal nodes cannot be controlled by
+// a model parameter. Therefore we use `define statements
+// to control it. Comment the following lines whenever
+// possible for best computational efficiency.
+`define __OPINFO__
+`define __DEBUG__
+`define __SHMOD__
+`define __RDSMOD__
+//`define __NQSMOD1__
+//`define __NQSMOD2__
+`define __RGATEMOD__
+`define __TNOIMOD1__ //Correlated Thermal Noise Switch
+
+`include "common_defs.include"
+`include "bsimcmg_cfringe.include"
+
+
+module bsimcmg(d, g, s, e, t);
+ inout g, d, s, e, t;
+ electrical g, d, s, e;
+ electrical si, di;
+
+`ifdef __NQSMOD1__
+ electrical gi;
+`endif
+
+`ifdef __NQSMOD2__
+ electrical q;
+`endif
+
+`ifdef __RGATEMOD__
+ electrical ge;
+`endif
+
+`ifdef __SHMOD__
+ thermal t;
+ branch (t) rth_branch;
+ branch (t) ith_branch;
+`else
+ thermal t;
+`endif
+
+// Internal node controlled by Correlated Thermal Noise Switch
+`ifdef __TNOIMOD1__
+ electrical N;
+`endif
+
+`include "bsimcmg_body.include"
+
+
+endmodule
+
diff --git a/src/spicelib/devices/adms/bsimcmg/admsva/bsimcmg_binning_parameters.include b/src/spicelib/devices/adms/bsimcmg/admsva/bsimcmg_binning_parameters.include
new file mode 100644
index 000000000..f55c5d9ed
--- /dev/null
+++ b/src/spicelib/devices/adms/bsimcmg/admsva/bsimcmg_binning_parameters.include
@@ -0,0 +1,756 @@
+// ********************************************************
+// **** BSIM-CMG 110.0.0 released by Sourabh Khandelwal on 01/01/2016 ****/
+// * BSIM Common Multi-Gate Model Equations (Verilog-A)
+// ********************************************************
+//
+// ********************************************************
+// * Copyright 2016 Regents of the University of California.
+// * All rights reserved.
+// *
+// * Project Director: Prof. Chenming Hu.
+// * Authors: Sriramkumar V., Navid Paydavosi, Juan Duarte, Darsen Lu, Sourabh Khandelwal
+// * Chung-Hsun Lin, Mohan Dunga, Shijing Yao,
+// * Ali Niknejad, Chenming Hu
+// ********************************************************
+// ********************************************************
+// * NONDISCLOSURE STATEMENT
+// 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 of California owns the copyright and grants users a perpetual,
+// irrevocable, worldwide, non-exclusive, royalty-free license with
+// respect to the software as set forth below.
+// 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 University of California 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
+// Agreed to on __Jan 01, 2016_________________
+// By: ___University of California, Berkeley____
+// ___Chenming Hu_____________________
+// ___Professor in Graduate School _______
+// ********************************************************
+`MPRnb( LNBODY ,0.0 ,"m^-2" ,"" )
+`MPRnb( NNBODY ,0.0 ,"m^-2" ,"" )
+`MPRnb( PNBODY ,0.0 ,"m^-1" ,"" )
+
+`MPRnb( LPHIG ,0.0 ,"m*eV" ,"" )
+`MPRnb( NPHIG ,0.0 ,"m*eV" ,"" )
+`MPRnb( PPHIG ,0.0 ,"(m^2)*eV" ,"" )
+
+`MPRnb( LNGATE ,0.0 ,"m^-2" ,"" )
+`MPRnb( NNGATE ,0.0 ,"m^-2" ,"" )
+`MPRnb( PNGATE ,0.0 ,"m^-1" ,"" )
+
+`MPRnb( LCIT ,0.0 ,"F/m" ,"" )
+`MPRnb( NCIT ,0.0 ,"F/m" ,"" )
+`MPRnb( PCIT ,0.0 ,"F" ,"" )
+
+`MPRnb( LCITR ,LCIT ,"" ,"" )
+`MPRnb( NCITR ,NCIT ,"" ,"" )
+`MPRnb( PCITR ,PCIT ,"" ,"" )
+
+`MPRnb( LCDSC ,0.0 ,"F/m" ,"" )
+`MPRnb( NCDSC ,0.0 ,"F/m" ,"" )
+`MPRnb( PCDSC ,0.0 ,"F" ,"" )
+
+`MPRnb( LCDSCD ,0.0 ,"F/m" ,"" )
+`MPRnb( NCDSCD ,0.0 ,"F/m" ,"" )
+`MPRnb( PCDSCD ,0.0 ,"F" ,"" )
+
+`MPRnb( LCDSCDR ,LCDSCD ,"F/m" ,"" )
+`MPRnb( NCDSCDR ,NCDSCD ,"F/m" ,"" )
+`MPRnb( PCDSCDR ,PCDSCD ,"F" ,"" )
+
+`MPRnb( LDVT0 ,0.0 ,"" ,"" )
+`MPRnb( NDVT0 ,0.0 ,"" ,"" )
+`MPRnb( PDVT0 ,0.0 ,"" ,"" )
+
+`MPRnb( LDVT1 ,0.0 ,"" ,"" )
+`MPRnb( NDVT1 ,0.0 ,"" ,"" )
+`MPRnb( PDVT1 ,0.0 ,"" ,"" )
+
+`MPRnb( LDVT1SS ,LDVT1 ,"" ,"" )
+`MPRnb( NDVT1SS ,NDVT1 ,"" ,"" )
+`MPRnb( PDVT1SS ,PDVT1 ,"" ,"" )
+
+`MPRnb( LPHIN ,0.0 ,"m*V" ,"" )
+`MPRnb( NPHIN ,0.0 ,"m*V" ,"" )
+`MPRnb( PPHIN ,0.0 ,"(m^2)*V" ,"" )
+
+`MPRnb( LETA0 ,0.0 ,"" ,"" )
+`MPRnb( NETA0 ,0.0 ,"" ,"" )
+`MPRnb( PETA0 ,0.0 ,"" ,"" )
+
+`MPRnb( LETA0R ,LETA0 ,"" ,"" )
+`MPRnb( NETA0R ,NETA0 ,"" ,"" )
+`MPRnb( PETA0R ,PETA0 ,"" ,"" )
+
+`MPRnb( LDSUB ,0.0 ,"" ,"" )
+`MPRnb( NDSUB ,0.0 ,"" ,"" )
+`MPRnb( PDSUB ,0.0 ,"" ,"" )
+
+`MPRnb( LK1RSCE ,0.0 ,"m*V^(1/2)" ,"" )
+`MPRnb( NK1RSCE ,0.0 ,"m*V^(1/2)" ,"" )
+`MPRnb( PK1RSCE ,0.0 ,"(m^2)*V^(1/2)" ,"" )
+
+`MPRnb( LLPE0 ,0.0 ,"m^2" ,"" )
+`MPRnb( NLPE0 ,0.0 ,"m^2" ,"" )
+`MPRnb( PLPE0 ,0.0 ,"m^3" ,"" )
+
+`MPRnb( LDVTSHIFT ,0.0 ,"m*V" ,"" )
+`MPRnb( NDVTSHIFT ,0.0 ,"m*V" ,"" )
+`MPRnb( PDVTSHIFT ,0.0 ,"(m^2)*V" ,"" )
+
+`MPRnb( LDVTSHIFTR ,LDVTSHIFT ,"" ,"" )
+`MPRnb( NDVTSHIFTR ,NDVTSHIFT ,"" ,"" )
+`MPRnb( PDVTSHIFTR ,PDVTSHIFT ,"" ,"" )
+
+`MPRnb( LPHIBE ,0.0 ,"m*V" ,"" )
+`MPRnb( NPHIBE ,0.0 ,"m*V" ,"" )
+`MPRnb( PPHIBE ,0.0 ,"(m^2)*V" ,"" )
+
+`MPRnb( LK0 ,0.0 ,"m*V" ,"" )
+`MPRnb( NK0 ,0.0 ,"m*V" ,"" )
+`MPRnb( PK0 ,0.0 ,"(m^2)*V" ,"" )
+
+`MPRnb( LK01 ,0.0 ,"(m*V)/K" ,"" )
+`MPRnb( NK01 ,0.0 ,"(m*V)/K" ,"" )
+`MPRnb( PK01 ,0.0 ,"(m^2*V)/K" ,"" )
+
+`MPRnb( LK0SI ,0.0 ,"" ,"" )
+`MPRnb( NK0SI ,0.0 ,"" ,"" )
+`MPRnb( PK0SI ,0.0 ,"" ,"" )
+
+`MPRnb( LK0SI1 ,0.0 ,"m/K" ,"" )
+`MPRnb( NK0SI1 ,0.0 ,"m/K" ,"" )
+`MPRnb( PK0SI1 ,0.0 ,"(m^2)/K" ,"" )
+
+`MPRnb( LK1 ,0.0 ,"m*V^(1/2)" ,"" )
+`MPRnb( NK1 ,0.0 ,"m*V^(1/2)" ,"" )
+`MPRnb( PK1 ,0.0 ,"(m^2)*V^(1/2)" ,"" )
+
+`MPRnb( LK11 ,0.0 ,"(m*V^(-1/2))/K" ,"" )
+`MPRnb( NK11 ,0.0 ,"(m*V^(-1/2))/K" ,"" )
+`MPRnb( PK11 ,0.0 ,"(m^2*V^(-1/2))/K" ,"" )
+
+`MPRnb( LK2SI ,LK0SI ,"" ,"" )
+`MPRnb( NK2SI ,NK0SI ,"" ,"" )
+`MPRnb( PK2SI ,PK0SI ,"" ,"" )
+
+`MPRnb( LK2SI1 ,LK0SI1 ,"" ,"" )
+`MPRnb( NK2SI1 ,NK0SI1 ,"" ,"" )
+`MPRnb( PK2SI1 ,PK0SI1 ,"" ,"" )
+
+`MPRnb( LK0SISAT ,0.0 ,"" ,"" )
+`MPRnb( NK0SISAT ,0.0 ,"" ,"" )
+`MPRnb( PK0SISAT ,0.0 ,"" ,"" )
+
+`MPRnb( LK0SISAT1 ,0.0 ,"" ,"" )
+`MPRnb( NK0SISAT1 ,0.0 ,"" ,"" )
+`MPRnb( PK0SISAT1 ,0.0 ,"" ,"" )
+
+`MPRnb( LK2SISAT ,LK0SISAT ,"" ,"" )
+`MPRnb( NK2SISAT ,NK0SISAT ,"" ,"" )
+`MPRnb( PK2SISAT ,PK0SISAT ,"" ,"" )
+
+`MPRnb( LK2SISAT1 ,LK0SISAT1 ,"" ,"" )
+`MPRnb( NK2SISAT1 ,NK0SISAT1 ,"" ,"" )
+`MPRnb( PK2SISAT1 ,PK0SISAT1 ,"" ,"" )
+
+`MPRnb( LK2SAT ,0.0 ,"" ,"" )
+`MPRnb( NK2SAT ,0.0 ,"" ,"" )
+`MPRnb( PK2SAT ,0.0 ,"" ,"" )
+
+`MPRnb( LK2SAT1 ,0.0 ,"" ,"" )
+`MPRnb( NK2SAT1 ,0.0 ,"" ,"" )
+`MPRnb( PK2SAT1 ,0.0 ,"" ,"" )
+
+`MPRnb( LK2 ,0.0 ,"" ,"" )
+`MPRnb( NK2 ,0.0 ,"" ,"" )
+`MPRnb( PK2 ,0.0 ,"" ,"" )
+
+`MPRnb( LK21 ,0.0 ,"" ,"" )
+`MPRnb( NK21 ,0.0 ,"" ,"" )
+`MPRnb( PK21 ,0.0 ,"" ,"" )
+
+`MPRnb( LDVTB ,0.0 ,"" ,"" )
+`MPRnb( NDVTB ,0.0 ,"" ,"" )
+`MPRnb( PDVTB ,0.0 ,"" ,"" )
+
+`MPRnb( LLPEB ,0.0 ,"" ,"" )
+`MPRnb( NLPEB ,0.0 ,"" ,"" )
+`MPRnb( PLPEB ,0.0 ,"" ,"" )
+
+`MPRnb( LQMFACTOR ,0.0 ,"" ,"" )
+`MPRnb( NQMFACTOR ,0.0 ,"" ,"" )
+`MPRnb( PQMFACTOR ,0.0 ,"" ,"" )
+
+`MPRnb( LQMTCENCV ,0.0 ,"" ,"" )
+`MPRnb( NQMTCENCV ,0.0 ,"" ,"" )
+`MPRnb( PQMTCENCV ,0.0 ,"" ,"" )
+
+`MPRnb( LQMTCENCVA ,0.0 ,"" ,"" )
+`MPRnb( NQMTCENCVA ,0.0 ,"" ,"" )
+`MPRnb( PQMTCENCVA ,0.0 ,"" ,"" )
+
+`MPRnb( LVSAT ,0.0 ,"(m^2)/s" ,"" )
+`MPRnb( NVSAT ,0.0 ,"(m^2)/s" ,"" )
+`MPRnb( PVSAT ,0.0 ,"(m^3)/s" ,"" )
+
+`MPRnb( LVSATR ,LVSAT ,"" ,"" )
+`MPRnb( NVSATR ,NVSAT ,"" ,"" )
+`MPRnb( PVSATR ,PVSAT ,"" ,"" )
+
+`MPRnb( LVSAT1 ,LVSAT ,"" ,"" )
+`MPRnb( NVSAT1 ,NVSAT ,"" ,"" )
+`MPRnb( PVSAT1 ,PVSAT ,"" ,"" )
+
+`MPRnb( LVSAT1R ,LVSAT1 ,"(m^2)/s" ,"" )
+`MPRnb( NVSAT1R ,NVSAT1 ,"(m^2)/s" ,"" )
+`MPRnb( PVSAT1R ,PVSAT1 ,"(m^3)/s" ,"" )
+
+`MPRnb( LPSAT ,0.0 ,"" ,"" )
+`MPRnb( NPSAT ,0.0 ,"" ,"" )
+`MPRnb( PPSAT ,0.0 ,"" ,"" )
+
+`MPRnb( LDELTAVSAT ,0.0 ,"" ,"" )
+`MPRnb( NDELTAVSAT ,0.0 ,"" ,"" )
+`MPRnb( PDELTAVSAT ,0.0 ,"" ,"" )
+
+`MPRnb( LKSATIV ,0.0 ,"" ,"" )
+`MPRnb( NKSATIV ,0.0 ,"" ,"" )
+`MPRnb( PKSATIV ,0.0 ,"" ,"" )
+
+`MPRnb( LKSATIVR ,LKSATIV ,"" ,"" )
+`MPRnb( NKSATIVR ,NKSATIV ,"" ,"" )
+`MPRnb( PKSATIVR ,PKSATIV ,"" ,"" )
+
+`MPRnb( LVSATCV ,0.0 ,"(m^2)/s" ,"" )
+`MPRnb( NVSATCV ,0.0 ,"(m^2)/s" ,"" )
+`MPRnb( PVSATCV ,0.0 ,"(m^3)/s" ,"" )
+
+`MPRnb( LPSATCV ,0.0 ,"" ,"" )
+`MPRnb( NPSATCV ,0.0 ,"" ,"" )
+`MPRnb( PPSATCV ,0.0 ,"" ,"" )
+
+`MPRnb( LDELTAVSATCV ,0.0 ,"" ,"" )
+`MPRnb( NDELTAVSATCV ,0.0 ,"" ,"" )
+`MPRnb( PDELTAVSATCV ,0.0 ,"" ,"" )
+
+`MPRnb( LMEXP ,0.0 ,"" ,"" )
+`MPRnb( NMEXP ,0.0 ,"" ,"" )
+`MPRnb( PMEXP ,0.0 ,"" ,"" )
+
+`MPRnb( LMEXPR ,LMEXP ,"" ,"" )
+`MPRnb( NMEXPR ,NMEXP ,"" ,"" )
+`MPRnb( PMEXPR ,PMEXP ,"" ,"" )
+
+`MPRnb( LPTWG ,0.0 ,"m*(V^-2)" ,"" )
+`MPRnb( NPTWG ,0.0 ,"m*(V^-2)" ,"" )
+`MPRnb( PPTWG ,0.0 ,"m^2*(V^-2)" ,"" )
+
+`MPRnb( LPTWGR ,LPTWG ,"m*(V^-2)" ,"" )
+`MPRnb( NPTWGR ,NPTWG ,"m*(V^-2)" ,"" )
+`MPRnb( PPTWGR ,PPTWG ,"m^2*(V^-2)" ,"" )
+
+`MPRnb( LU0 ,0.0 ,"(m^3)/V*s" ,"" )
+`MPRnb( NU0 ,0.0 ,"(m^3)/V*s" ,"" )
+`MPRnb( PU0 ,0.0 ,"(m^4)/V*s" ,"" )
+
+`MPRnb( LU0R ,LU0 ,"" ,"" )
+`MPRnb( NU0R ,NU0 ,"" ,"" )
+`MPRnb( PU0R ,PU0 ,"" ,"" )
+
+`MPRnb( LETAMOB ,0.0 ,"" ,"" )
+`MPRnb( NETAMOB ,0.0 ,"" ,"" )
+`MPRnb( PETAMOB ,0.0 ,"" ,"" )
+
+`MPRnb( LUP ,0.0 ,"m*(um^LPA)" ,"" )
+`MPRnb( NUP ,0.0 ,"m*(um^LPA)" ,"" )
+`MPRnb( PUP ,0.0 ,"m^2*(um^LPA)" ,"" )
+
+`MPRnb( LUPR ,LUP ,"" ,"" )
+`MPRnb( NUPR ,NUP ,"" ,"" )
+`MPRnb( PUPR ,PUP ,"" ,"" )
+
+`MPRnb( LUA ,0.0 ,"m*((cm/MV)^EU)" ,"" )
+`MPRnb( NUA ,0.0 ,"m*((cm/MV)^EU)" ,"" )
+`MPRnb( PUA ,0.0 ,"m^2*((cm/MV)^EU)" ,"" )
+
+`MPRnb( LUAR ,LUA ,"" ,"" )
+`MPRnb( NUAR ,NUA ,"" ,"" )
+`MPRnb( PUAR ,PUA ,"" ,"" )
+
+`MPRnb( LUC ,0.0 ,"" ,"" )
+`MPRnb( NUC ,0.0 ,"" ,"" )
+`MPRnb( PUC ,0.0 ,"" ,"" )
+
+`MPRnb( LUCR ,LUC ,"" ,"" )
+`MPRnb( NUCR ,NUC ,"" ,"" )
+`MPRnb( PUCR ,PUC ,"" ,"" )
+
+`MPRnb( LEU ,0.0 ,"m*(cm/MV)" ,"" )
+`MPRnb( NEU ,0.0 ,"m*(cm/MV)" ,"" )
+`MPRnb( PEU ,0.0 ,"m^2*(cm/MV)" ,"" )
+
+`MPRnb( LEUR ,LEU ,"" ,"" )
+`MPRnb( NEUR ,NEU ,"" ,"" )
+`MPRnb( PEUR ,PEU ,"" ,"" )
+
+`MPRnb( LUD ,0.0 ,"m*(cm/MV)" ,"" )
+`MPRnb( NUD ,0.0 ,"m*(cm/MV)" ,"" )
+`MPRnb( PUD ,0.0 ,"m^2*(cm/MV)" ,"" )
+
+`MPRnb( LUDR ,LUD ,"" ,"" )
+`MPRnb( NUDR ,NUD ,"" ,"" )
+`MPRnb( PUDR ,PUD ,"" ,"" )
+
+`MPRnb( LUCS ,0.0 ,"" ,"" )
+`MPRnb( NUCS ,0.0 ,"" ,"" )
+`MPRnb( PUCS ,0.0 ,"" ,"" )
+
+`MPRnb( LPCLM ,0.0 ,"" ,"" )
+`MPRnb( NPCLM ,0.0 ,"" ,"" )
+`MPRnb( PPCLM ,0.0 ,"" ,"" )
+
+`MPRnb( LPCLMR ,LPCLM ,"" ,"" )
+`MPRnb( NPCLMR ,NPCLM ,"" ,"" )
+`MPRnb( PPCLMR ,PPCLM ,"" ,"" )
+
+`MPRnb( LPCLMG ,0.0 ,"" ,"" )
+`MPRnb( NPCLMG ,0.0 ,"" ,"" )
+`MPRnb( PPCLMG ,0.0 ,"" ,"" )
+
+`MPRnb( LPCLMCV ,LPCLM ,"" ,"" )
+`MPRnb( NPCLMCV ,NPCLM ,"" ,"" )
+`MPRnb( PPCLMCV ,PPCLM ,"" ,"" )
+
+`MPRnb( LA1 ,0.0 ,"m*(V^-2)" ,"" )
+`MPRnb( NA1 ,0.0 ,"m*(V^-2)" ,"" )
+`MPRnb( PA1 ,0.0 ,"m^2*(V^-2)" ,"" )
+
+`MPRnb( LA11 ,0.0 ,"m*(V^-2/K)" ,"" )
+`MPRnb( NA11 ,0.0 ,"m*(V^-2/K)" ,"" )
+`MPRnb( PA11 ,0.0 ,"m^2*(V^-2/K)" ,"" )
+
+`MPRnb( LA2 ,0.0 ,"m*(V^-1)" ,"" )
+`MPRnb( NA2 ,0.0 ,"m*(V^-1)" ,"" )
+`MPRnb( PA2 ,0.0 ,"m^2*(V^-1)" ,"" )
+
+`MPRnb( LA21 ,0.0 ,"m*(V^-1/K)" ,"" )
+`MPRnb( NA21 ,0.0 ,"m*(V^-1/K)" ,"" )
+`MPRnb( PA21 ,0.0 ,"m^2*(V^-1/K)" ,"" )
+
+`MPRnb( LRDSW ,0.0 ,"m*(ohm-um^WR)" ,"" )
+`MPRnb( NRDSW ,0.0 ,"m*(ohm-um^WR)" ,"" )
+`MPRnb( PRDSW ,0.0 ,"(m^2)*(ohm-um^WR)" ,"" )
+
+`MPRnb( LRSW ,0.0 ,"m*(ohm-um^WR)" ,"" )
+`MPRnb( NRSW ,0.0 ,"m*(ohm-um^WR)" ,"" )
+`MPRnb( PRSW ,0.0 ,"(m^2)*(ohm-um^WR)" ,"" )
+
+`MPRnb( LRDW ,0.0 ,"m*(ohm-um^WR)" ,"" )
+`MPRnb( NRDW ,0.0 ,"m*(ohm-um^WR)" ,"" )
+`MPRnb( PRDW ,0.0 ,"(m^2)*(ohm-um^WR)" ,"" )
+
+`MPRnb( LPRWGS ,0.0 ,"m/V" ,"" )
+`MPRnb( NPRWGS ,0.0 ,"m/V" ,"" )
+`MPRnb( PPRWGS ,0.0 ,"(m^2)/V" ,"" )
+
+`MPRnb( LPRWGD ,0.0 ,"m/V" ,"" )
+`MPRnb( NPRWGD ,0.0 ,"m/V" ,"" )
+`MPRnb( PPRWGD ,0.0 ,"(m^2)/V" ,"" )
+
+`MPRnb( LWR ,0.0 ,"" ,"" )
+`MPRnb( NWR ,0.0 ,"" ,"" )
+`MPRnb( PWR ,0.0 ,"" ,"" )
+
+`MPRnb( LPDIBL1 ,0.0 ,"" ,"" )
+`MPRnb( NPDIBL1 ,0.0 ,"" ,"" )
+`MPRnb( PPDIBL1 ,0.0 ,"" ,"" )
+
+`MPRnb( LPDIBL1R ,LPDIBL1 ,"" ,"" )
+`MPRnb( NPDIBL1R ,NPDIBL1 ,"" ,"" )
+`MPRnb( PPDIBL1R ,PPDIBL1 ,"" ,"" )
+
+`MPRnb( LPDIBL2 ,0.0 ,"" ,"" )
+`MPRnb( NPDIBL2 ,0.0 ,"" ,"" )
+`MPRnb( PPDIBL2 ,0.0 ,"" ,"" )
+
+`MPRnb( LPDIBL2R ,LPDIBL2 ,"" ,"" )
+`MPRnb( NPDIBL2R ,NPDIBL2 ,"" ,"" )
+`MPRnb( PPDIBL2R ,PPDIBL2 ,"" ,"" )
+
+`MPRnb( LDROUT ,0.0 ,"" ,"" )
+`MPRnb( NDROUT ,0.0 ,"" ,"" )
+`MPRnb( PDROUT ,0.0 ,"" ,"" )
+
+`MPRnb( LPVAG ,0.0 ,"" ,"" )
+`MPRnb( NPVAG ,0.0 ,"" ,"" )
+`MPRnb( PPVAG ,0.0 ,"" ,"" )
+
+`MPRnb( LAIGBINV ,0.0 ,"(F*s^2/g)^0.5" ,"" )
+`MPRnb( NAIGBINV ,0.0 ,"(F*s^2/g)^0.5" ,"" )
+`MPRnb( PAIGBINV ,0.0 ,"((F*s^2/g)^0.5)*m" ,"" )
+
+`MPRnb( LAIGBINV1 ,0.0 ,"((F*s^2/g)^0.5)/K" ,"" )
+`MPRnb( NAIGBINV1 ,0.0 ,"((F*s^2/g)^0.5)/K" ,"" )
+`MPRnb( PAIGBINV1 ,0.0 ,"((F*s^2/g)^0.5)*(m/K)" ,"" )
+
+`MPRnb( LBIGBINV ,0.0 ,"((F*s^2/g)^0.5)/V" ,"" )
+`MPRnb( NBIGBINV ,0.0 ,"((F*s^2/g)^0.5)/V" ,"" )
+`MPRnb( PBIGBINV ,0.0 ,"((F*s^2/g)^0.5)*(m/V)" ,"" )
+
+`MPRnb( LCIGBINV ,0.0 ,"m/V" ,"" )
+`MPRnb( NCIGBINV ,0.0 ,"m/V" ,"" )
+`MPRnb( PCIGBINV ,0.0 ,"(m^2)/V" ,"" )
+
+`MPRnb( LEIGBINV ,0.0 ,"m*V" ,"" )
+`MPRnb( NEIGBINV ,0.0 ,"m*V" ,"" )
+`MPRnb( PEIGBINV ,0.0 ,"(m^2)*V" ,"" )
+
+`MPRnb( LNIGBINV ,0.0 ,"" ,"" )
+`MPRnb( NNIGBINV ,0.0 ,"" ,"" )
+`MPRnb( PNIGBINV ,0.0 ,"" ,"" )
+
+`MPRnb( LAIGBACC ,0.0 ,"(F*s^2/g)^0.5" ,"" )
+`MPRnb( NAIGBACC ,0.0 ,"(F*s^2/g)^0.5" ,"" )
+`MPRnb( PAIGBACC ,0.0 ,"((F*s^2/g)^0.5)*m" ,"" )
+
+`MPRnb( LAIGBACC1 ,0.0 ,"((F*s^2/g)^0.5)/K" ,"" )
+`MPRnb( NAIGBACC1 ,0.0 ,"((F*s^2/g)^0.5)/K" ,"" )
+`MPRnb( PAIGBACC1 ,0.0 ,"((F*s^2/g)^0.5)*(m/K)" ,"" )
+
+`MPRnb( LBIGBACC ,0.0 ,"((F*s^2/g)^0.5)/V" ,"" )
+`MPRnb( NBIGBACC ,0.0 ,"((F*s^2/g)^0.5)/V" ,"" )
+`MPRnb( PBIGBACC ,0.0 ,"((F*s^2/g)^0.5)*(m/V)" ,"" )
+
+`MPRnb( LCIGBACC ,0.0 ,"m/V" ,"" )
+`MPRnb( NCIGBACC ,0.0 ,"m/V" ,"" )
+`MPRnb( PCIGBACC ,0.0 ,"(m^2)/V" ,"" )
+
+`MPRnb( LNIGBACC ,0.0 ,"" ,"" )
+`MPRnb( NNIGBACC ,0.0 ,"" ,"" )
+`MPRnb( PNIGBACC ,0.0 ,"" ,"" )
+
+`MPRnb( LAIGC ,0.0 ,"(F*s^2/g)^0.5" ,"" )
+`MPRnb( NAIGC ,0.0 ,"(F*s^2/g)^0.5" ,"" )
+`MPRnb( PAIGC ,0.0 ,"((F*s^2/g)^0.5)*m" ,"" )
+
+`MPRnb( LAIGC1 ,0.0 ,"((F*s^2/g)^0.5)/K" ,"" )
+`MPRnb( NAIGC1 ,0.0 ,"((F*s^2/g)^0.5)/K" ,"" )
+`MPRnb( PAIGC1 ,0.0 ,"((F*s^2/g)^0.5)*(m/K)" ,"" )
+
+`MPRnb( LBIGC ,0.0 ,"((F*s^2/g)^0.5)/V" ,"" )
+`MPRnb( NBIGC ,0.0 ,"((F*s^2/g)^0.5)/V" ,"" )
+`MPRnb( PBIGC ,0.0 ,"((F*s^2/g)^0.5)*(m/V)" ,"" )
+
+`MPRnb( LCIGC ,0.0 ,"m/V" ,"" )
+`MPRnb( NCIGC ,0.0 ,"m/V" ,"" )
+`MPRnb( PCIGC ,0.0 ,"(m^2)/V" ,"" )
+
+`MPRnb( LPIGCD ,0.0 ,"" ,"" )
+`MPRnb( NPIGCD ,0.0 ,"" ,"" )
+`MPRnb( PPIGCD ,0.0 ,"" ,"" )
+
+`MPRnb( LAIGS ,0.0 ,"(F*s^2/g)^0.5" ,"" )
+`MPRnb( NAIGS ,0.0 ,"(F*s^2/g)^0.5" ,"" )
+`MPRnb( PAIGS ,0.0 ,"((F*s^2/g)^0.5)*m" ,"" )
+
+`MPRnb( LAIGS1 ,0.0 ,"((F*s^2/g)^0.5)/K" ,"" )
+`MPRnb( NAIGS1 ,0.0 ,"((F*s^2/g)^0.5)/K" ,"" )
+`MPRnb( PAIGS1 ,0.0 ,"((F*s^2/g)^0.5)*(m/K)" ,"" )
+
+`MPRnb( LBIGS ,0.0 ,"((F*s^2/g)^0.5)/V" ,"" )
+`MPRnb( NBIGS ,0.0 ,"((F*s^2/g)^0.5)/V" ,"" )
+`MPRnb( PBIGS ,0.0 ,"((F*s^2/g)^0.5)*(m/V)" ,"" )
+
+`MPRnb( LCIGS ,0.0 ,"m/V" ,"" )
+`MPRnb( NCIGS ,0.0 ,"m/V" ,"" )
+`MPRnb( PCIGS ,0.0 ,"(m^2)/V" ,"" )
+
+`MPRnb( LAIGD ,LAIGS ,"(F*s^2/g)^0.5" ,"" )
+`MPRnb( NAIGD ,NAIGS ,"(F*s^2/g)^0.5" ,"" )
+`MPRnb( PAIGD ,PAIGS ,"((F*s^2/g)^0.5)*m" ,"" )
+
+`MPRnb( LAIGD1 ,LAIGS1 ,"((F*s^2/g)^0.5)/K" ,"" )
+`MPRnb( NAIGD1 ,NAIGS1 ,"((F*s^2/g)^0.5)/K" ,"" )
+`MPRnb( PAIGD1 ,PAIGS1 ,"((F*s^2/g)^0.5)*(m/K)" ,"" )
+
+`MPRnb( LBIGD ,LBIGS ,"((F*s^2/g)^0.5)/V" ,"" )
+`MPRnb( NBIGD ,NBIGS ,"((F*s^2/g)^0.5)/V" ,"" )
+`MPRnb( PBIGD ,PBIGS ,"((F*s^2/g)^0.5)*(m/V)" ,"" )
+
+`MPRnb( LCIGD ,LCIGS ,"m/V" ,"" )
+`MPRnb( NCIGD ,NCIGS ,"m/V" ,"" )
+`MPRnb( PCIGD ,PCIGS ,"(m^2)/V" ,"" )
+
+`MPRnb( LNTOX ,0.0 ,"" ,"" )
+`MPRnb( NNTOX ,0.0 ,"" ,"" )
+`MPRnb( PNTOX ,0.0 ,"" ,"" )
+
+`MPRnb( LPOXEDGE ,0.0 ,"" ,"" )
+`MPRnb( NPOXEDGE ,0.0 ,"" ,"" )
+`MPRnb( PPOXEDGE ,0.0 ,"" ,"" )
+
+`MPRnb( LAGISL ,0.0 ,"m/ohm" ,"" )
+`MPRnb( NAGISL ,0.0 ,"m/ohm" ,"" )
+`MPRnb( PAGISL ,0.0 ,"(m^2)/ohm" ,"" )
+
+`MPRnb( LBGISL ,0.0 ,"V" ,"" )
+`MPRnb( NBGISL ,0.0 ,"V" ,"" )
+`MPRnb( PBGISL ,0.0 ,"m*V" ,"" )
+
+`MPRnb( LCGISL ,0.0 ,"m*(V^3)" ,"" )
+`MPRnb( NCGISL ,0.0 ,"m*(V^3)" ,"" )
+`MPRnb( PCGISL ,0.0 ,"(m^2)*(V^3)" ,"" )
+
+`MPRnb( LEGISL ,0.0 ,"m*V" ,"" )
+`MPRnb( NEGISL ,0.0 ,"m*V" ,"" )
+`MPRnb( PEGISL ,0.0 ,"(m^2)*V" ,"" )
+
+`MPRnb( LPGISL ,0.0 ,"" ,"" )
+`MPRnb( NPGISL ,0.0 ,"" ,"" )
+`MPRnb( PPGISL ,0.0 ,"" ,"" )
+
+`MPRnb( LAGIDL ,LAGISL ,"m/ohm" ,"" )
+`MPRnb( NAGIDL ,NAGISL ,"m/ohm" ,"" )
+`MPRnb( PAGIDL ,PAGISL ,"(m^2)/ohm" ,"" )
+
+`MPRnb( LBGIDL ,LBGISL ,"V" ,"" )
+`MPRnb( NBGIDL ,NBGISL ,"V" ,"" )
+`MPRnb( PBGIDL ,PBGISL ,"m*V" ,"" )
+
+`MPRnb( LCGIDL ,LCGISL ,"m*(V^3)" ,"" )
+`MPRnb( NCGIDL ,NCGISL ,"m*(V^3)" ,"" )
+`MPRnb( PCGIDL ,PCGISL ,"(m^2)*(V^3)" ,"" )
+
+`MPRnb( LEGIDL ,LEGISL ,"m*V" ,"" )
+`MPRnb( NEGIDL ,NEGISL ,"m*V" ,"" )
+`MPRnb( PEGIDL ,PEGISL ,"(m^2)*V" ,"" )
+
+`MPRnb( LPGIDL ,LPGISL ,"" ,"" )
+`MPRnb( NPGIDL ,NPGISL ,"" ,"" )
+`MPRnb( PPGIDL ,PPGISL ,"" ,"" )
+
+`MPRnb( LALPHA0 ,0.0 ,"(m^2)/V" ,"" )
+`MPRnb( NALPHA0 ,0.0 ,"(m^2)/V" ,"" )
+`MPRnb( PALPHA0 ,0.0 ,"(m^3)/V" ,"" )
+
+`MPRnb( LALPHA1 ,0.0 ,"m/V" ,"" )
+`MPRnb( NALPHA1 ,0.0 ,"m/V" ,"" )
+`MPRnb( PALPHA1 ,0.0 ,"(m^2)/V" ,"" )
+
+`MPRnb( LALPHAII0 ,0.0 ,"(m^2)/V" ,"" )
+`MPRnb( NALPHAII0 ,0.0 ,"(m^2)/V" ,"" )
+`MPRnb( PALPHAII0 ,0.0 ,"(m^3)/V" ,"" )
+
+`MPRnb( LALPHAII1 ,0.0 ,"m/V" ,"" )
+`MPRnb( NALPHAII1 ,0.0 ,"m/V" ,"" )
+`MPRnb( PALPHAII1 ,0.0 ,"(m^2)/V" ,"" )
+
+`MPRnb( LBETA0 ,0.0 ,"m/V" ,"" )
+`MPRnb( NBETA0 ,0.0 ,"m/V" ,"" )
+`MPRnb( PBETA0 ,0.0 ,"(m^2)/V" ,"" )
+
+`MPRnb( LBETAII0 ,0.0 ,"m/V" ,"" )
+`MPRnb( NBETAII0 ,0.0 ,"m/V" ,"" )
+`MPRnb( PBETAII0 ,0.0 ,"(m^2)/V" ,"" )
+
+`MPRnb( LBETAII1 ,0.0 ,"" ,"" )
+`MPRnb( NBETAII1 ,0.0 ,"" ,"" )
+`MPRnb( PBETAII1 ,0.0 ,"" ,"" )
+
+`MPRnb( LBETAII2 ,0.0 ,"m*V" ,"" )
+`MPRnb( NBETAII2 ,0.0 ,"m*V" ,"" )
+`MPRnb( PBETAII2 ,0.0 ,"(m^2)*V" ,"" )
+
+`MPRnb( LESATII ,0.0 ,"V" ,"" )
+`MPRnb( NESATII ,0.0 ,"V" ,"" )
+`MPRnb( PESATII ,0.0 ,"m*V" ,"" )
+
+`MPRnb( LLII ,0.0 ,"(m^2)*V" ,"" )
+`MPRnb( NLII ,0.0 ,"(m^2)*V" ,"" )
+`MPRnb( PLII ,0.0 ,"(m^3)*V" ,"" )
+
+`MPRnb( LSII0 ,0.0 ,"m/V" ,"" )
+`MPRnb( NSII0 ,0.0 ,"m/V" ,"" )
+`MPRnb( PSII0 ,0.0 ,"(m^2)/V" ,"" )
+
+`MPRnb( LSII1 ,0.0 ,"" ,"" )
+`MPRnb( NSII1 ,0.0 ,"" ,"" )
+`MPRnb( PSII1 ,0.0 ,"" ,"" )
+
+`MPRnb( LSII2 ,0.0 ,"m*V" ,"" )
+`MPRnb( NSII2 ,0.0 ,"m*V" ,"" )
+`MPRnb( PSII2 ,0.0 ,"(m^2)*V" ,"" )
+
+`MPRnb( LSIID ,0.0 ,"m*V" ,"" )
+`MPRnb( NSIID ,0.0 ,"m*V" ,"" )
+`MPRnb( PSIID ,0.0 ,"(m^2)*V" ,"" )
+
+`MPRnb( LCFS ,0.0 ,"F" ,"" )
+`MPRnb( NCFS ,0.0 ,"F" ,"" )
+`MPRnb( PCFS ,0.0 ,"F*m" ,"" )
+
+`MPRnb( LCFD ,LCFS ,"F" ,"" )
+`MPRnb( NCFD ,NCFS ,"F" ,"" )
+`MPRnb( PCFD ,PCFS ,"F*m" ,"" )
+
+`MPRnb( LCOVS ,0.0 ,"F" ,"" )
+`MPRnb( NCOVS ,0.0 ,"F" ,"" )
+`MPRnb( PCOVS ,0.0 ,"F*m" ,"" )
+
+`MPRnb( LCOVD ,LCOVS ,"F" ,"" )
+`MPRnb( NCOVD ,NCOVS ,"F" ,"" )
+`MPRnb( PCOVD ,PCOVS ,"F*m" ,"" )
+
+`MPRnb( LCGSL ,0.0 ,"F" ,"" )
+`MPRnb( NCGSL ,0.0 ,"F" ,"" )
+`MPRnb( PCGSL ,0.0 ,"F*m" ,"" )
+
+`MPRnb( LCGDL ,LCGSL ,"F" ,"" )
+`MPRnb( NCGDL ,NCGSL ,"F" ,"" )
+`MPRnb( PCGDL ,PCGSL ,"F*m" ,"" )
+
+`MPRnb( LCKAPPAS ,0.0 ,"m*V" ,"" )
+`MPRnb( NCKAPPAS ,0.0 ,"m*V" ,"" )
+`MPRnb( PCKAPPAS ,0.0 ,"(m^2)*V" ,"" )
+
+`MPRnb( LCKAPPAD ,LCKAPPAS ,"m*V" ,"" )
+`MPRnb( NCKAPPAD ,NCKAPPAS ,"m*V" ,"" )
+`MPRnb( PCKAPPAD ,PCKAPPAS ,"(m^2)*V" ,"" )
+
+`MPRnb( LCGBL ,0.0 ,"F" ,"" )
+`MPRnb( NCGBL ,0.0 ,"F" ,"" )
+`MPRnb( PCGBL ,0.0 ,"F*m" ,"" )
+
+`MPRnb( LCKAPPAB ,0.0 ,"m*V" ,"" )
+`MPRnb( NCKAPPAB ,0.0 ,"m*V" ,"" )
+`MPRnb( PCKAPPAB ,0.0 ,"(m^2)*V" ,"" )
+
+`MPRnb( LNTGEN ,0.0 ,"" ,"" )
+`MPRnb( NNTGEN ,0.0 ,"" ,"" )
+`MPRnb( PNTGEN ,0.0 ,"" ,"" )
+
+`MPRnb( LAIGEN ,0.0 ,"(m^-2)*(V^-1)" ,"" )
+`MPRnb( NAIGEN ,0.0 ,"(m^-2)*(V^-1)" ,"" )
+`MPRnb( PAIGEN ,0.0 ,"(m^-1)*(V^-1)" ,"" )
+
+`MPRnb( LBIGEN ,0.0 ,"(m^-2)*(V^-3)" ,"" )
+`MPRnb( NBIGEN ,0.0 ,"(m^-2)*(V^-3)" ,"" )
+`MPRnb( PBIGEN ,0.0 ,"(m^-1)*(V^-3)" ,"" )
+
+`MPRnb( LXRCRG1 ,0.0 ,"" ,"" )
+`MPRnb( NXRCRG1 ,0.0 ,"" ,"" )
+`MPRnb( PXRCRG1 ,0.0 ,"" ,"" )
+
+`MPRnb( LXRCRG2 ,0.0 ,"" ,"" )
+`MPRnb( NXRCRG2 ,0.0 ,"" ,"" )
+`MPRnb( PXRCRG2 ,0.0 ,"" ,"" )
+
+`MPRnb( LUTE ,0.0 ,"" ,"" )
+`MPRnb( NUTE ,0.0 ,"" ,"" )
+`MPRnb( PUTE ,0.0 ,"" ,"" )
+
+`MPRnb( LUTER ,LUTE ,"" ,"" )
+`MPRnb( NUTER ,NUTE ,"" ,"" )
+`MPRnb( PUTER ,PUTE ,"" ,"" )
+
+`MPRnb( LUTL ,0.0 ,"" ,"" )
+`MPRnb( NUTL ,0.0 ,"" ,"" )
+`MPRnb( PUTL ,0.0 ,"" ,"" )
+
+`MPRnb( LUTLR ,LUTL ,"" ,"" )
+`MPRnb( NUTLR ,NUTL ,"" ,"" )
+`MPRnb( PUTLR ,PUTL ,"" ,"" )
+
+`MPRnb( LEMOBT ,0.0 ,"" ,"" )
+`MPRnb( NEMOBT ,0.0 ,"" ,"" )
+`MPRnb( PEMOBT ,0.0 ,"" ,"" )
+
+`MPRnb( LUA1 ,0.0 ,"" ,"" )
+`MPRnb( NUA1 ,0.0 ,"" ,"" )
+`MPRnb( PUA1 ,0.0 ,"" ,"" )
+
+`MPRnb( LUA1R ,LUA1 ,"" ,"" )
+`MPRnb( NUA1R ,NUA1 ,"" ,"" )
+`MPRnb( PUA1R ,PUA1 ,"" ,"" )
+
+`MPRnb( LUC1 ,0.0 ,"" ,"" )
+`MPRnb( NUC1 ,0.0 ,"" ,"" )
+`MPRnb( PUC1 ,0.0 ,"" ,"" )
+
+`MPRnb( LUC1R ,LUC1 ,"" ,"" )
+`MPRnb( NUC1R ,NUC1 ,"" ,"" )
+`MPRnb( PUC1R ,PUC1 ,"" ,"" )
+
+`MPRnb( LUD1 ,0.0 ,"" ,"" )
+`MPRnb( NUD1 ,0.0 ,"" ,"" )
+`MPRnb( PUD1 ,0.0 ,"" ,"" )
+
+`MPRnb( LUD1R ,LUD1 ,"" ,"" )
+`MPRnb( NUD1R ,NUD1 ,"" ,"" )
+`MPRnb( PUD1R ,PUD1 ,"" ,"" )
+
+`MPRnb( LUCSTE ,0.0 ,"" ,"" )
+`MPRnb( NUCSTE ,0.0 ,"" ,"" )
+`MPRnb( PUCSTE ,0.0 ,"" ,"" )
+
+`MPRnb( LPTWGT ,0.0 ,"m/K" ,"" )
+`MPRnb( NPTWGT ,0.0 ,"m/K" ,"" )
+`MPRnb( PPTWGT ,0.0 ,"(m^2)/K" ,"" )
+
+`MPRnb( LAT ,0.0 ,"m/K" ,"" )
+`MPRnb( NAT ,0.0 ,"m/K" ,"" )
+`MPRnb( PAT ,0.0 ,"(m^2)/K" ,"" )
+
+`MPRnb( LATR ,LAT ,"" ,"" )
+`MPRnb( NATR ,NAT ,"" ,"" )
+`MPRnb( PATR ,PAT ,"" ,"" )
+
+`MPRnb( LATCV ,0.0 ,"m/K" ,"" )
+`MPRnb( NATCV ,0.0 ,"m/K" ,"" )
+`MPRnb( PATCV ,0.0 ,"(m^2)/K" ,"" )
+
+`MPRnb( LSTTHETASAT ,0.0 ,"" ,"" )
+`MPRnb( NSTTHETASAT ,0.0 ,"" ,"" )
+`MPRnb( PSTTHETASAT ,0.0 ,"" ,"" )
+
+`MPRnb( LPRT ,0.0 ,"m/K" ,"" )
+`MPRnb( NPRT ,0.0 ,"m/K" ,"" )
+`MPRnb( PPRT ,0.0 ,"(m^2)/K" ,"" )
+
+`MPRnb( LKT1 ,0.0 ,"m*V" ,"" )
+`MPRnb( NKT1 ,0.0 ,"m*V" ,"" )
+`MPRnb( PKT1 ,0.0 ,"(m^2)*V" ,"" )
+
+`MPRnb( LTSS ,0.0 ,"" ,"" )
+`MPRnb( NTSS ,0.0 ,"" ,"" )
+`MPRnb( PTSS ,0.0 ,"" ,"" )
+
+`MPRnb( LIIT ,0.0 ,"" ,"" )
+`MPRnb( NIIT ,0.0 ,"" ,"" )
+`MPRnb( PIIT ,0.0 ,"" ,"" )
+
+`MPRnb( LTII ,0.0 ,"" ,"" )
+`MPRnb( NTII ,0.0 ,"" ,"" )
+`MPRnb( PTII ,0.0 ,"" ,"" )
+
+`MPRnb( LTGIDL ,0.0 ,"m/K" ,"" )
+`MPRnb( NTGIDL ,0.0 ,"m/K" ,"" )
+`MPRnb( PTGIDL ,0.0 ,"(m^2)/K" ,"" )
+
+`MPRnb( LIGT ,0.0 ,"" ,"" )
+`MPRnb( NIGT ,0.0 ,"" ,"" )
+`MPRnb( PIGT ,0.0 ,"" ,"" )
diff --git a/src/spicelib/devices/adms/bsimcmg/admsva/bsimcmg_body.include b/src/spicelib/devices/adms/bsimcmg/admsva/bsimcmg_body.include
new file mode 100644
index 000000000..22b9025d3
--- /dev/null
+++ b/src/spicelib/devices/adms/bsimcmg/admsva/bsimcmg_body.include
@@ -0,0 +1,4110 @@
+// ********************************************************
+// ********************************************************
+// *** BSIM-CMG 110.0.0 released by Sourabh Khandelwal on 01/01/2016 ****/
+// * BSIM Common Multi-Gate Model Equations (Verilog-A)
+// ********************************************************
+//
+// ********************************************************
+// * Copyright 2016 Regents of the University of California.
+// * All rights reserved.
+// *
+// * Project Director: Prof. Chenming Hu.
+// * Authors: Sriramkumar V., Navid Paydavosi, Juan Duarte, Sourabh Khandelwal, Darsen Lu,
+// * Chung-Hsun Lin, Mohan Dunga, Shijing Yao,
+// * Ali Niknejad, Chenming Hu
+// ********************************************************
+// ********************************************************
+// * NONDISCLOSURE STATEMENT
+// 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 of California owns the copyright and grants users a perpetual,
+// irrevocable, worldwide, non-exclusive, royalty-free license with
+// respect to the software as set forth below.
+// 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 University of California 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
+// Agreed to on __Jan 01, 2016__________________
+// By: ___University of California, Berkeley____
+// ___Chenming Hu_____________________
+// ___Professor in Graduate School _______
+// ********************************************************
+
+// Clamped Exponential Function
+analog function real lexp;
+ input x;
+ real x;
+
+ begin
+ if (x > `EXPL_THRESHOLD) begin
+ lexp = `MAX_EXPL * (1.0 + x - `EXPL_THRESHOLD);
+ end else if (x < -`EXPL_THRESHOLD) begin
+ lexp = `MIN_EXPL;
+ end else begin
+ lexp = exp(x);
+ end
+ end
+endfunction
+
+// Clamped log Function
+analog function real lln;
+ input x;
+ real x;
+
+ begin
+ lln = ln(max(x, `N_MINLOG));
+ end
+endfunction
+
+// Hyperbolic Smoothing Function
+analog function real hypsmooth;
+ input x, c;
+ real x, c;
+
+ begin
+ hypsmooth = 0.5 * (x + sqrt(x * x + 4.0 * c * c));
+ end
+endfunction
+
+// Hyperbolic Smoothing max Function
+analog function real hypmax;
+ input x, xmin, c;
+ real x, xmin, c;
+
+ begin
+ hypmax = xmin + 0.5 * (x - xmin - c + sqrt((x - xmin - c) * (x - xmin - c) - 4.0 * xmin * c));
+ end
+endfunction
+
+// Temperature Dependence Type
+analog function real Tempdep;
+ input PARAML, PARAMT, DELTEMP, TEMPMOD;
+ real PARAML, PARAMT, DELTEMP, TEMPMOD;
+
+ begin
+ if (TEMPMOD != 0) begin
+ Tempdep = PARAML + hypmax(PARAMT * DELTEMP, -PARAML, 1.0e-6);
+ end else begin
+ Tempdep = PARAML * hypsmooth(1.0 + PARAMT * DELTEMP - 1.0e-6, 1.0e-3);
+ end
+ end
+endfunction
+
+// Node Definitions
+`ifdef __RGATEMOD__
+ `define GateEdgeNode ge
+`else
+ `define GateEdgeNode g
+`endif
+`ifdef __NQSMOD1__
+ `define IntrinsicGate gi
+`else
+ `define IntrinsicGate `GateEdgeNode
+`endif
+
+// ***************************
+// * Instance Parameters *
+// ***************************
+
+// Note: Some instance parameters are also model parameters. Please refer to the technical note for details.
+`IPRco( L ,3.0e-8 ,"m" ,1.0e-9 ,inf ,"Designed gate length" )
+`IPRco( D ,4.0e-8 ,"m" ,1.0e-9 ,inf ,"Diameter of the cylinder (GEOMOD=3)" )
+`IPRco( TFIN ,1.5e-8 ,"m" ,1.0e-9 ,inf ,"Body (fin) thickness" )
+`IPRco( FPITCH ,8.0e-8 ,"m" ,TFIN ,inf ,"Fin pitch" )
+`IPIco( NF ,1 ,"" ,1 ,inf ,"Number of fingers" )
+`IPRoz( NFIN ,1.0 ,"" ,"Number of fins per finger (real number enables optimization)" )
+`IPIcc( NGCON ,1 ,"" ,1 ,2 ,"Number of gate contact (1 or 2 sided)" )
+`IPRcz( ASEO ,0.0 ,"m^2" ,"Source-to-substrate overlap area through oxide" )
+`IPRcz( ADEO ,0.0 ,"m^2" ,"Drain-to-substrate overlap area through oxide" )
+`IPRcz( PSEO ,0.0 ,"m" ,"Perimeter of source-to-substrate overlap region through oxide" )
+`IPRcz( PDEO ,0.0 ,"m" ,"Perimeter of drain-to-substrate overlap region through oxide" )
+`IPRcz( ASEJ ,0.0 ,"m^2" ,"Source junction area (BULKMOD=1 or 2)" )
+`IPRcz( ADEJ ,0.0 ,"m^2" ,"Drain junction area (BULKMOD=1 or 2)" )
+`IPRcz( PSEJ ,0.0 ,"m" ,"Source-to-substrate PN junction perimeter (BULKMOD=1 or 2)" )
+`IPRcz( PDEJ ,0.0 ,"m" ,"Drain-to-substrate PN junction perimeter (BULKMOD=1 or 2)" )
+`IPRcz( COVS ,0.0 ,"F/m" ,"Constant gate-to-source overlap capacitance (CGEOMOD=1)" )
+`IPRcz( COVD ,COVS ,"F/m" ,"Constant gate-to-drain overlap capacitance (CGEOMOD=1)" )
+`IPRcz( CGSP ,0.0 ,"F/m" ,"Constant gate-to-source fringe capacitance (CGEOMOD=1)" )
+`IPRcz( CGDP ,0.0 ,"F/m" ,"Constant gate-to-drain fringe capacitance (CGEOMOD=1)" )
+`IPRcz( CDSP ,0.0 ,"F" ,"Constant drain-to-source fringe capacitance (all CGEOMOD)" )
+`IPRcz( NRS ,0.0 ,"" ,"Number of source diffusion squares" )
+`IPRcz( NRD ,0.0 ,"" ,"Number of source diffusion squares" )
+`IPRoz( LRSD ,L ,"m" ,"Length of the source/drain" )
+`IPRoz( NFINNOM ,1.0 ,"" ,"Nominal number of fins per finger" )
+
+// Variability Handles
+`MPRnb( XL ,0.0 ,"m" ,"L offset for channel length due to mask/etch effect" )
+`MPRnb( DTEMP ,0.0 ,"Celsius" ,"Variability in device temperature" )
+`MPRnb( DELVTRAND ,0.0 ,"V" ,"Variability in Vth" )
+`MPRcz( U0MULT ,1.0 ,"" ,"Variability in carrier mobility" )
+`MPRcz( IDS0MULT ,1.0 ,"" ,"Variability in drain current for miscellaneous reasons" )
+
+// ************************
+// * Model Parameters *
+// ************************
+`MPIcc( DEVTYPE ,`ntype ,"" ,`ptype ,`ntype ,"0: PMOS; 1: NMOS" )
+`MPIcc( TYPE ,DEVTYPE ,"" ,`ptype ,`ntype ,"0: PMOS; 1: NMOS" )
+`MPIcc( BULKMOD ,0 ,"" ,0 ,2 ,"0: SOI multi-gate; 1: Bulk multi-gate; 2: for decoupled bulk multi-gate" )
+`MPIcc( GEOMOD ,0 ,"" ,0 ,4 ,"0: Double gate; 1: Triple gate; 2: Quadruple gate; 3: Cylindrical gate; 4: Unified fin Shape" )
+`MPIcc( CGEO1SW ,0 ,"" ,0 ,1 ,"For CGEOMOD=1 only, this switch enables the parameters COVS, COVD, CGSP, and CGDP to be in F per fin, per gate-finger, per unit channel width" )
+`MPIcc( RDSMOD ,0 ,"" ,0 ,2 ,"0: Internal S/D resistance model; 1: External S/D resistance model; 2: Both bias dependent and independent part of S/D resistance internal" )
+`MPIcc( ASYMMOD ,0 ,"" ,0 ,1 ,"0: Turn off asymmetry model - forward mode parameters used; 1: Turn on asymmetry model" )
+`MPIcc( IGCMOD ,0 ,"" ,0 ,1 ,"0: Turn off Igc, Igs and Igd; 1: Turn on Igc, Igs and Igd" )
+`MPIcc( IGBMOD ,0 ,"" ,0 ,1 ,"0: Turn off Igb; 1: Turn on Igb" )
+`MPIcc( GIDLMOD ,0 ,"" ,0 ,1 ,"0: Turn off GIDL/GISL current; 1: Turn on GIDL/GISL current" )
+`MPIcc( IIMOD ,0 ,"" ,0 ,2 ,"0: Turn off impact ionization current; 1: BSIM4-based model; 2: BSIMSOI-based model" )
+`MPIcc( TNOIMOD ,0 ,"" ,0 ,1 ,"0: Charge-based, 1: Correlated thermal noise model" )
+`MPIcc( NQSMOD ,0 ,"" ,0 ,2 ,"0: Turn off NQS model; 1: NQS gate resistance (with gi node); 2: NQS charge deficit model from BSIM4 (with q node)" )
+`MPIcc( SHMOD ,0 ,"" ,0 ,1 ,"0: Turn off self-heating; 1: Turn on self-heating" )
+`MPIcc( TEMPMOD ,0 ,"" ,0 ,1 ,"1: Change temperature dependence of specific parameters" )
+`MPIcc( RGATEMOD ,0 ,"" ,0 ,1 ,"0: Turn off gate electrode resistance (without ge node); 1: Turn on gate electrode resistance (with ge node)" )
+`MPIcc( RGEOMOD ,0 ,"" ,0 ,1 ,"Geometry-dependent source/drain resistance; 0: RSH-based; 1: Holistic" )
+`MPIcc( CGEOMOD ,0 ,"" ,0 ,2 ,"Geometry-dependent parasitic capacitance model selector" )
+`MPIcc( SH_WARN ,0 ,"" ,0 ,1 ,"0: Disable self-heating warnings; 1: Enable self-heating warnings" )
+`MPIcc( IGCLAMP ,1 ,"" ,0 ,1 ,"0: Disable gate current clamps; 1: Enable gate current clamps" )
+`MPRnb( LINT ,0.0 ,"m" ,"Length reduction parameter (dopant diffusion effect)" )
+`MPRnb( LL ,0.0 ,"m^(LLN+1)" ,"Length reduction parameter (dopant diffusion effect)" )
+`MPRnb( LLN ,1.0 ,"" ,"Length reduction parameter (dopant diffusion effect)" )
+`MPRnb( DLC ,0.0 ,"m" ,"Delta L for C-V model" )
+`MPRnb( DLCACC ,0.0 ,"m" ,"Delta L for C-V model in accumulation region (BULKMOD=1 or 2)" )
+`MPRnb( DLBIN ,0.0 ,"m" ,"Delta L for binning" )
+`MPRnb( LLC ,0.0 ,"m^(LLN+1)" ,"Length reduction parameter (dopant diffusion effect)" )
+`MPRco( EOT ,1.0e-9 ,"m" ,1.0e-10 ,inf ,"Equivalent oxide thickness" )
+`MPRco( TOXP ,1.2e-9 ,"m" ,1.0e-10 ,inf ,"Physical oxide thickness" )
+`MPRco( EOTBOX ,1.4e-7 ,"m" ,1.0e-9 ,inf ,"Equivalent oxide thickness of the buried oxide (SOI FinFET)" )
+`MPRco( HFIN ,3.0e-8 ,"m" ,1.0e-9 ,inf ,"Fin height" )
+`MPRcz( FECH ,1.0 ,"" ,"End-channel factor for different orientation/shape" )
+`MPRnb( DELTAW ,0.0 ,"m" ,"Change of effective width due to shape of fin/cylinder" )
+`MPRcz( FECHCV ,1.0 ,"" ,"CV end-channel factor for different orientation/shape" )
+`MPRnb( DELTAWCV ,0.0 ,"m" ,"CV change of effective width due to shape of fin/cylinder" )
+`MPRnb( NBODY ,1.0e22 ,"/m^3" ,"Channel (body) doping" )
+`MPRnb( NBODYN1 ,0.0 ,"" ,"NFIN dependence of channel (body) doping" )
+`MPRex( NBODYN2 ,1.0e5 ,"" ,0.0 ,"NFIN dependence of channel (body) doping" )
+`MPRcc( NSD ,2.0e26 ,"/m^3" ,2.0e25 ,1.0e27 ,"Source/drain active doping concentration" )
+`MPRcz( PHIG ,4.61 ,"eV" ,"Gate workfunction" )
+`MPRnb( PHIGL ,0.0 ,"eV/m" ,"Length dependence of gate workfunction" )
+`MPRnb( PHIGLT ,0.0 ,"/m" ,"Coupled NFIN and length dependence of gate workfunction" )
+`MPRnb( PHIGN1 ,0.0 ,"" ,"NFIN dependence of gate workfunction" )
+`MPRex( PHIGN2 ,1.0e5 ,"" ,0.0 ,"NFIN dependence of gate workfunction" )
+`MPRco( EPSROX ,3.9 ,"" ,1.0 ,inf ,"Relative dielectric constant of the gate dielectric" )
+`MPRco( EPSRSUB ,11.9 ,"" ,1.0 ,inf ,"Relative dielectric constant of the channel material" )
+`MPRcz( EASUB ,4.05 ,"eV" ,"Electron affinity of substrate" )
+`MPRnb( NI0SUB ,1.1e16 ,"/m^3" ,"Intrinsic carrier constant at 300.15K" )
+`MPRnb( BG0SUB ,1.12 ,"eV" ,"Bandgap of substrate at 300.15K" )
+`MPRnb( NC0SUB ,2.86e25 ,"/m^3" ,"Conduction band density of states" )
+`MPRnb( NGATE ,0.0 ,"/m^3" ,"Parameter for poly gate doping. For metal gate please set NGATE = 0" )
+`MPRnb( Imin ,1.0e-15 ,"A/m^2" ,"Parameter for Vgs clamping for inversion region calculation in accumulation" )
+
+// Short Channel Effects
+`MPRnb( CIT ,0.0 ,"F/m^2" ,"Parameter for interface trap" )
+`MPRnb( CITR ,CIT ,"" ,"Parameter for interface trap in reverse mode for asymmetric model" )
+`MPRnb( CDSC ,7.0e-3 ,"F/m^2" ,"Coupling capacitance between S/D and channel" )
+`MPRnb( CDSCN1 ,0.0 ,"" ,"NFIN dependence of CDSC" )
+`MPRnb( CDSCN2 ,1.0e5 ,"" ,"NFIN dependence of CDSC" )
+`MPRnb( CDSCD ,7.0e-3 ,"F/m^2" ,"Drain-bias sensitivity of CDSC" )
+`MPRnb( CDSCDN1 ,0.0 ,"" ,"NFIN dependence of CDSCD" )
+`MPRex( CDSCDN2 ,1.0e5 ,"" ,0.0 ,"NFIN dependence of CDSCD" )
+`MPRnb( CDSCDR ,CDSCD ,"F/m^2" ,"Reverse-mode drain-bias sensitivity of CDSC" )
+`MPRnb( CDSCDRN1 ,CDSCDN1 ,"" ,"NFIN dependence of CDSCD" )
+`MPRex( CDSCDRN2 ,CDSCDN2 ,"" ,0.0 ,"NFIN dependence of CDSCD" )
+`MPRnb( DVT0 ,0.0 ,"" ,"SCE coefficient" )
+`MPRnb( DVT1 ,0.6 ,"" ,"SCE exponent coefficient. After binning it should be within (0:inf)" )
+`MPRnb( DVT1SS ,DVT1 ,"" ,"Subthreshold swing exponent coefficient. After binning it should be within (0:inf)" )
+`MPRnb( PHIN ,0.05 ,"V" ,"Nonuniform vertical doping effect on surface potential" )
+`MPRnb( ETA0 ,0.6 ,"" ,"DIBL coefficient" )
+`MPRnb( ETA0N1 ,0.0 ,"" ,"NFIN dependence of ETA0" )
+`MPRco( ETA0N2 ,1.0e5 ,"" ,1.0e-5 ,inf ,"NFIN dependence of ETA0" )
+`MPRnb( ETA0LT ,0.0 ,"/m" ,"Coupled NFIN and length dependence of ETA0" )
+`MPRnb( TETA0 ,0.0 ,"/K" ,"Temperature dependence of DIBL coefficient" )
+`MPRnb( ETA0R ,ETA0 ,"" ,"Reverse-mode DIBL coefficient" )
+`MPRnb( TETA0R ,TETA0 ,"/K" ,"Temperature dependence of reverse-mode DIBL coefficient" )
+`MPRnb( DSUB ,1.06 ,"" ,"DIBL exponent coefficient" )
+`MPRnb( DVTP0 ,0.0 ,"" ,"Coefficient for drain-induced Vth shift (DITS)" )
+`MPRnb( DVTP1 ,0.0 ,"" ,"DITS exponent coefficient" )
+`MPRnb( ADVTP0 ,0.0 ,"" ,"Pre-exponential coefficient for DITS" )
+`MPRex( BDVTP0 ,1.0e-7 ,"" ,0.0 ,"Exponential coefficient for DITS" )
+`MPRnb( ADVTP1 ,0.0 ,"" ,"Pre-exponential coefficient for DVTP1" )
+`MPRex( BDVTP1 ,1.0e-7 ,"" ,0.0 ,"Exponential coefficient for DVTP1" )
+`MPRnb( DVTP2 ,0.0 ,"" ,"DITS model parameter" )
+`MPRnb( K1RSCE ,0.0 ,"/V^(0.5)" ,"K1 for reverse short channel effect calculation" )
+`MPRnb( LPE0 ,5.0e-9 ,"m" ,"Equivalent length of pocket region at zero bias" )
+`MPRnb( DVTSHIFT ,0.0 ,"V" ,"Vth shift handle" )
+`MPRnb( DVTSHIFTR ,DVTSHIFT ,"" ,"Vth shift handle for asymmetric mode" )
+`MPRnb( THETASCE ,0.0 ,"" ,"Vth roll-off length dependence. If defined by user, it will overwrite Theta_SCE in the code")
+`MPRnb( THETADIBL ,0.0 ,"" ,"DIBL length dependence. If defined by user, will overwrite Theta_DIBL in the code" )
+`MPRnb( THETASW ,0.0 ,"" ,"Subthreshold swing length dependence. If defined by user, it will overwrite Theta_SW in the code" )
+`MPRnb( NVTM ,0.0 ,"V" ,"Subthreshold swing factor multiplied by Vtm. If defined by user, it will overwrite nVtm in the code" )
+
+// Lateral non-uniform doping effect (IV-CV Vth shift)
+`MPRnb( K0 ,0.0 ,"V" ,"Lateral NUD voltage parameter" )
+`MPRnb( K01 ,0.0 ,"V/K" ,"Temperature dependence of lateral NUD voltage parameter" )
+`MPRnb( K0SI ,1.0 ,"" ,"Correction factor for strong inversion used in Mnud. After binning it should be within (0:inf)" )
+`MPRnb( K0SI1 ,0.0 ,"/K" ,"Temperature dependence of K0SI" )
+`MPRnb( K2SI ,K0SI ,"" ,"Correction factor for strong inversion used in Mob" )
+`MPRnb( K2SI1 ,K0SI1 ,"" ,"Temperature dependence of K2SI" )
+`MPRnb( K0SISAT ,0.0 ,"" ,"Correction factor for strong inversion used in Mnud" )
+`MPRnb( K0SISAT1 ,0.0 ,"" ,"Temperature dependence of K0SISAT" )
+`MPRnb( K2SISAT ,K0SISAT ,"" ,"Correction factor for strong inversion used in Mob" )
+`MPRnb( K2SISAT1 ,K0SISAT1 ,"" ,"Temperature dependence of K2SISAT" )
+
+// Body Effect for MG Devices on Bulk Substrate (ex: FinFETs on BULK)
+`MPRnb( PHIBE ,0.7 ,"V" ,"Body effect voltage parameter. After binning it should be within [0.2:1.2]" )
+`MPRco( K1 ,1.0e-6 ,"V^(0.5)" ,1.0e-6 ,inf ,"Body effect coefficient for subthreshold region" )
+`MPRnb( K11 ,0.0 ,"V^(0.5)/K" ,"Temperature dependence of K1" )
+`MPRnb( K2SAT ,0.0 ,"" ,"Correction factor for K2 in saturation (high Vds)" )
+`MPRnb( K2SAT1 ,0.0 ,"" ,"Temperature dependence of K2SAT" )
+`MPRnb( K2 ,0.0 ,"" ,"Body effect coefficient for BULKMOD==2" )
+`MPRnb( K21 ,0.0 ,"" ,"Temperature dependence of K2" )
+
+// Quantum Mechanical Effect
+`MPRnb( QMFACTOR ,0.0 ,"" ,"Prefactor + switch for QM Vth correction" )
+`MPRnb( QMTCENCV ,0.0 ,"" ,"Prefactor + switch for QM Width and Toxeff correction for CV" )
+`MPRnb( QMTCENCVA ,0.0 ,"" ,"Prefactor + switch for QM Width and Toxeff correction for CV (accumulation region)" )
+`MPRnb( AQMTCEN ,0.0 ,"" ,"Parameter for geometric dependence of Tcen on R/TFIN/HFIN" )
+`MPRex( BQMTCEN ,1.2e-8 ,"" ,0.0 ,"Parameter for geometric dependence of Tcen on R/TFIN/HFIN" )
+`MPRnb( ETAQM ,0.54 ,"" ,"Bulk charge coefficient for Tcen" )
+`MPRnb( QM0 ,1.0e-3 ,"V" ,"Knee-point for Tcen in inversion (Charge normalized to Cox)" )
+`MPRnb( PQM ,0.66 ,"" ,"Slope of normalized Tcen in inversion" )
+`MPRnb( QM0ACC ,1.0e-3 ,"V" ,"Knee-point for Tcen in accumulation (Charge normalized to Cox)" )
+`MPRnb( PQMACC ,0.66 ,"" ,"Slope of normalized Tcen in accumulation" )
+
+// Velocity Saturation Model
+`MPRnb( VSAT ,8.5e4 ,"m/s" ,"Saturation velocity for the saturation region" )
+`MPRnb( VSATR ,VSAT ,"m/s" ,"Saturation velocity for the saturation region in the reverse mode" )
+`MPRnb( VSATN1 ,0.0 ,"" ,"NFIN dependence of VSAT" )
+`MPRex( VSATN2 ,1.0e5 ,"" ,0.0 ,"NFIN dependence of VSAT" )
+`MPRnb( VSATRN1 ,VSATN1 ,"" ,"NFIN dependence of VSATR" )
+`MPRex( VSATRN2 ,VSATN2 ,"" ,0.0 ,"NFIN dependence of VSATR" )
+`MPRnb( AVSAT ,0.0 ,"" ,"Pre-exponential coefficient for VSAT" )
+`MPRex( BVSAT ,1.0e-7 ,"" ,0.0 ,"Exponential coefficient for VSAT" )
+`MPRnb( VSAT1 ,VSAT ,"m/s" ,"Velocity saturation parameter for Ion degradation - forward mode" )
+`MPRnb( VSAT1N1 ,VSATN1 ,"" ,"NFIN dependence of VSAT1" )
+`MPRex( VSAT1N2 ,VSATN2 ,"" ,0.0 ,"NFIN dependence of VSAT1" )
+`MPRnb( VSAT1R ,VSAT1 ,"m/s" ,"Velocity saturation parameter for Ion degradation - reverse mode" )
+`MPRnb( VSAT1RN1 ,VSAT1N1 ,"" ,"NFIN dependence of VSAT1R" )
+`MPRex( VSAT1RN2 ,VSAT1N2 ,"" ,0.0 ,"NFIN dependence of VSAT1R" )
+`MPRnb( AVSAT1 ,AVSAT ,"" ,"Pre-exponential coefficient for VSAT1" )
+`MPRex( BVSAT1 ,BVSAT ,"" ,0.0 ,"Exponential coefficient for VSAT1" )
+`MPRnb( DELTAVSAT ,1.0 ,"" ,"velocity saturation parameter in the linear region" )
+`MPRnb( PSAT ,2.0 ,"" ,"Velocity saturation exponent, after binnig should be from [2.0:inf)" )
+`MPRnb( APSAT ,0.0 ,"" ,"Pre-exponential coefficient for PSAT" )
+`MPRex( BPSAT ,1.0 ,"" ,0.0 ,"Exponential coefficient for PSAT" )
+`MPRnb( KSATIV ,1.0 ,"" ,"Parameter for long channel Vdsat" )
+`MPRnb( KSATIVR ,KSATIV ,"" ,"KSATIV in asymmetric mode" )
+`MPRnb( VSATCV ,VSAT ,"m/s" ,"Velocity saturation parameter for CV" )
+`MPRnb( AVSATCV ,AVSAT ,"" ,"Pre-exponential coefficient for VSATCV" )
+`MPRex( BVSATCV ,BVSAT ,"" ,0.0 ,"Exponential coefficient for VSATCV" )
+`MPRnb( DELTAVSATCV ,DELTAVSAT ,"" ,"Velocity saturation parameter in the linear region for the capacitance model" )
+`MPRnb( PSATCV ,PSAT ,"" ,"Velocity saturation exponent for C-V" )
+`MPRnb( APSATCV ,APSAT ,"" ,"Pre-exponential coefficient for PSATCV" )
+`MPRex( BPSATCV ,BPSAT ,"" ,0.0 ,"Exponential coefficient for PSATCV" )
+`MPRnb( MEXP ,4.0 ,"" ,"Smoothing function factor for Vdsat" )
+`MPRnb( AMEXP ,0.0 ,"" ,"Pre-exponential coefficient for MEXP" )
+`MPRnb( BMEXP ,1.0 ,"" ,"Exponential coefficient for MEXP" )
+`MPRnb( MEXPR ,MEXP ,"" ,"Reverse-mode smoothing function factor for Vdsat" )
+`MPRnb( AMEXPR ,AMEXP ,"" ,"Pre-exponential coefficient for MEXPR" )
+`MPRnb( BMEXPR ,BMEXP ,"" ,"Exponential coefficient for MEXPR" )
+`MPRnb( PTWG ,0.0 ,"/V^2" ,"Gmsat degradation parameter - forward mode" )
+`MPRnb( PTWGR ,PTWG ,"/V^2" ,"Gmsat degradation parameter - reverse mode" )
+`MPRnb( APTWG ,0.0 ,"" ,"Pre-exponential coefficient for PTWG" )
+`MPRex( BPTWG ,1.0e-7 ,"" ,0.0 ,"Exponential coefficient for PTWG" )
+`MPRnb( AT ,-1.56e-3 ,"/K" ,"Saturation velocity temperature coefficient" )
+`MPRnb( ATR ,AT ,"" ,"Reverse-mode saturation velocity temperature coefficient" )
+`MPRnb( ATCV ,AT ,"/K" ,"Saturation velocity temperature coefficient for CV" )
+`MPRnb( TMEXP ,0.0 ,"/K" ,"Temperature coefficient for Vdseff smoothing" )
+`MPRnb( TMEXPR ,TMEXP ,"/K" ,"Reverse-mode temperature coefficient for Vdseff smoothing" )
+`MPRnb( PTWGT ,4.0e-3 ,"/K" ,"PTWG temperature coefficient" )
+
+// Mobility Model
+`MPRnb( U0 ,3.0e-2 ,"m^2/(V*s)" ,"Low-field mobility" )
+`MPRnb( U0R ,U0 ,"m^2/(V*s)" ,"Reverse-mode low-field mobility" )
+`MPRnb( U0N1 ,0.0 ,"" ,"NFIN dependence of U0" )
+`MPRnb( U0N1R ,U0N1 ,"" ,"Reverse-mode NFIN dependence of U0" )
+`MPRex( U0N2 ,1.0e5 ,"" ,0.0 ,"NFIN dependence of U0" )
+`MPRex( U0N2R ,U0N2 ,"" ,0.0 ,"Reverse-mode NFIN dependence of U0" )
+`MPRnb( U0LT ,0.0 ,"/m" ,"Coupled NFIN and length dependence of U0" )
+`MPRnb( ETAMOB ,2.0 ,"" ,"Effective field parameter" )
+`MPRnb( UP ,0.0 ,"um^LPA" ,"Mobility L coefficient" )
+`MPRnb( LPA ,1.0 ,"" ,"Mobility L power coefficient" )
+`MPRnb( UPR ,UP ,"um^LPA" ,"Reverse-mode mobility L coefficient" )
+`MPRnb( LPAR ,LPA ,"" ,"Reverse-mode mobility L power coefficient" )
+`MPRnb( UA ,0.3 ,"(cm/MV)^EU" ,"Phonon/surface roughness scattering parameter" )
+`MPRnb( UAR ,UA ,"(cm/MV)^EU" ,"Reverse-mode phonon/surface roughness scattering parameter" )
+`MPRnb( AUA ,0.0 ,"" ,"Pre-exponential coefficient for UA" )
+`MPRnb( AUAR ,AUA ,"" ,"Reverse-mode pre-exponential coefficient for UA" )
+`MPRex( BUA ,1.0e-7 ,"" ,0.0 ,"Exponential coefficient for UA" )
+`MPRex( BUAR ,BUA ,"" ,0.0 ,"Reverse-mode exponential coefficient for UAR" )
+`MPRnb( UC ,0.0 ,"(1e-6*cm/MV^2)^EU" ,"Body effect for mobility degradation parameter - BULKMOD=1 or 2" )
+`MPRnb( UCR ,UC ,"" ,"Reverse-mode body effect for mobility degradation parameter - BULKMOD=1 or 2" )
+`MPRnb( EU ,2.5 ,"cm/MV" ,"Phonon/surface roughness scattering parameter" )
+`MPRnb( EUR ,EU ,"cm/MV" ,"Reverse-mode phonon/surface roughness scattering parameter" )
+`MPRnb( AEU ,0.0 ,"" ,"Pre-exponential coefficient for EU" )
+`MPRnb( AEUR ,AEU ,"" ,"Reverse-mode pre-exponential coefficient for EU" )
+`MPRex( BEU ,1.0e-7 ,"" ,0.0 ,"Exponential coefficient for EU" )
+`MPRex( BEUR ,BEU ,"" ,0.0 ,"Reverse-mode exponential coefficient for EU" )
+`MPRnb( UD ,0.0 ,"cm/MV" ,"Columbic scattering parameter" )
+`MPRnb( UDR ,UD ,"cm/MV" ,"Reverse-mode columbic scattering parameter" )
+`MPRnb( AUD ,0.0 ,"" ,"Pre-exponential coefficient for UD" )
+`MPRnb( AUDR ,AUD ,"" ,"Reverse-mode pre-exponential coefficient for UD" )
+`MPRex( BUD ,5.0e-8 ,"" ,0.0 ,"Exponential coefficient for UD" )
+`MPRex( BUDR ,BUD ,"" ,0.0 ,"Reverse-mode exponential coefficient for UD" )
+`MPRnb( UCS ,1.0 ,"" ,"Columbic scattering parameter" )
+`MPRnb( UTE ,0.0 ,"" ,"Mobility temperature coefficient" )
+`MPRnb( UTER ,UTE ,"" ,"Reverse-mode for mobility temperature coefficient" )
+`MPRnb( UTL ,-1.5e-3 ,"" ,"Mobility temperature coefficient" )
+`MPRnb( UTLR ,UTL ,"" ,"Reverse-mode for mobility temperature coefficient" )
+`MPRnb( EMOBT ,0.0 ,"" ,"Temperature coefficient of ETAMOB" )
+`MPRnb( UA1 ,1.032e-3 ,"" ,"Mobility temperature coefficient for UA" )
+`MPRnb( UA1R ,UA1 ,"" ,"Reverse-mode mobility temperature coefficient for UA" )
+`MPRnb( UC1 ,5.6e-11 ,"" ,"Mobility temperature coefficient for UC" )
+`MPRnb( UC1R ,UC1 ,"" ,"Reverse-mode mobility temperature coefficient for UC" )
+`MPRnb( UD1 ,0.0 ,"" ,"Mobility temperature coefficient for UC" )
+`MPRnb( UD1R ,UD1 ,"" ,"Reverse-mode mobility temperature coefficient for UD" )
+`MPRnb( UCSTE ,-4.775e-3 ,"" ,"Mobility temperature coefficient" )
+`MPRcc( CHARGEWF ,0.0 ,"" ,-1.0 ,1.0 ,"Average channel charge weighting factor, +1: source-side, 0: middle, -1: drain-side" )
+
+// Access Resistance Model
+`MPRnb( RDSWMIN ,0.0 ,"ohm*(um^(WR))" ,"RDSMOD = 0 S/D extension resistance per unit width at high Vgs" )
+`MPRnb( RDSW ,1.0e2 ,"ohm*(um^(WR))" ,"RDSMOD = 0 zero bias S/D extension resistance per unit width" )
+`MPRnb( ARDSW ,0.0 ,"" ,"Pre-exponential coefficient for RDSW" )
+`MPRex( BRDSW ,1.0e-7 ,"" ,0.0 ,"exponential coefficient for RDSW" )
+`MPRnb( RSWMIN ,0.0 ,"ohm*(um^(WR))" ,"RDSMOD = 1 source extension resistance per unit width at high Vgs" )
+`MPRnb( RSW ,5.0e1 ,"ohm*(um^(WR))" ,"RDSMOD = 1 zero bias source extension resistance per unit width" )
+`MPRnb( ARSW ,0.0 ,"" ,"Pre-exponential coefficient for RSW" )
+`MPRex( BRSW ,1.0e-7 ,"" ,0.0 ,"Exponential coefficient for RSW" )
+`MPRnb( RDWMIN ,0.0 ,"ohm*(um^(WR))" ,"RDSMOD = 1 drain extension resistance per unit width at high Vgs" )
+`MPRnb( RDW ,5.0e1 ,"" ,"RDSMOD = 1 zero bias drain extension resistance per unit width" )
+`MPRnb( ARDW ,0.0 ,"" ,"Pre-exponential coefficient for RDW" )
+`MPRex( BRDW ,1.0e-7 ,"" ,0.0 ,"Exponential coefficient for RDW" )
+`MPRcz( RSDR ,0.0 ,"V^(-PRSDR)" ,"Source-side drift resistance parameter - forward mode" )
+`MPRcz( RSDRR ,RSDR ,"V^(-PRSDR)" ,"Source-side drift resistance parameter - reverse mode" )
+`MPRcz( RDDR ,RSDR ,"V^(-PRDDR)" ,"Drain-side drift resistance parameter - forward mode" )
+`MPRcz( RDDRR ,RDDR ,"V^(-PRDDR)" ,"Drain-side drift resistance parameter - reverse mode" )
+`MPRnb( PRSDR ,1.0 ,"" ,"Source-side quasi-saturation parameter" )
+`MPRnb( PRDDR ,PRSDR ,"" ,"Drain-side quasi-saturation parameter" )
+`MPRnb( PRWGS ,0.0 ,"/V" ,"Gate bias dependence of source extension resistance" )
+`MPRnb( PRWGD ,PRWGS ,"/V" ,"Gate bias dependence of drain extension resistance" )
+`MPRnb( WR ,1.0 ,"" ,"W dependence parameter of S/D extension resistance" )
+`MPRnb( PRT ,1.0e-3 ,"/K" ,"Series resistance temperature coefficient" )
+`MPRnb( TRSDR ,0.0 ,"/K" ,"Source-side drift resistance temperature coefficient" )
+`MPRnb( TRDDR ,TRSDR ,"/K" ,"Drain-side drift resistance temperature coefficient" )
+
+// DIBL Model
+`MPRnb( PDIBL1 ,1.3 ,"" ,"DIBL output conductance parameter - forward mode" )
+`MPRnb( PDIBL1R ,PDIBL1 ,"" ,"DIBL output conductance parameter - reverse mode" )
+`MPRnb( PDIBL2 ,2.0e-4 ,"" ,"DIBL output conductance parameter" )
+`MPRnb( PDIBL2R ,PDIBL2 ,"" ,"DIBL output conductance parameter - reverse mode" )
+`MPRnb( DROUT ,1.06 ,"" ,"L dependence of DIBL effect on Rout" )
+`MPRnb( PVAG ,1.0 ,"" ,"Vgs dependence on early voltage" )
+
+// Channel Length Modulation Effect
+`MPRnb( PCLM ,1.3e-2 ,"" ,"Channel length modulation (CLM) parameter" )
+`MPRnb( PCLMR ,PCLM ,"" ,"Reverse model PCLM parameter" )
+`MPRnb( APCLM ,0.0 ,"" ,"Pre-exponential coefficient for PCLM" )
+`MPRnb( APCLMR ,APCLM ,"" ,"Reverse-mode pre-exponential coefficient for PCLM" )
+`MPRex( BPCLM ,1.0e-7 ,"" ,0.0 ,"Exponential coefficient for PCLM" )
+`MPRex( BPCLMR ,BPCLM ,"" ,0.0 ,"Reverse-mode exponential coefficient for PCLM" )
+`MPRnb( PCLMG ,0.0 ,"" ,"Gate bias dependence parameter for CLM" )
+`MPRnb( PCLMCV ,PCLM ,"" ,"CLM parameter for short-channel CV" )
+
+// Non-Saturation Effect
+`MPRnb( A1 ,0.0 ,"" ,"Non-saturation effect parameter for strong inversion Region" )
+`MPRnb( A11 ,0.0 ,"(V^-2)/K" ,"Temperature dependence of A1" )
+`MPRnb( A2 ,0.0 ,"" ,"Non-saturation effect parameter for moderate Inversion Region" )
+`MPRnb( A21 ,0.0 ,"(V^-1)/K" ,"Temperature dependence of A2" )
+
+// Gate Electrode Resistance
+`MPRcz( RGEXT ,0.0 ,"ohm" ,"Effective gate electrode external resistance" )
+`MPRco( RGFIN ,1.0e-3 ,"ohm" ,1.0e-3 ,inf ,"Effective gate electrode per finger per fin resistance" )
+
+// Geometry Dependent Source/Drain Resistance of RGEOMOD = 0
+`MPRnb( RSHS ,0.0 ,"ohm" ,"Source-side sheet resistance" )
+`MPRnb( RSHD ,RSHS ,"ohm" ,"Drain-side sheet resistance" )
+
+// Geometry Dependent Source/Drain Resistance of RGEOMOD = 1 for variability modeling
+// These parameters are shared with CGEOMOD = 2
+`MPRnb( HEPI ,1.0e-8 ,"m" ,"Height of the raised source/drain on top of the fin" )
+`MPRnb( TSILI ,1.0e-8 ,"m" ,"Thickness of the silicide on top of the raised source/drain" )
+`MPRcc( RHOC ,1.0e-12 ,"ohm*(m^2)" ,1.0e-18 ,1.0e-9 ,"Contact resistivity at the silicon/silicide interface" )
+`MPRoz( RHORSD ,1.0 ,"ohm*(m)" ,"Average resistivity of silicon in the raised source/drain region" )
+`MPRcc( CRATIO ,0.5 ,"" ,0.0 ,1.0 ,"Ratio of the corner area filled with silicon to the total corner area" )
+`MPRoo( DELTAPRSD ,0.0 ,"m" ,-FPITCH ,inf ,"Change in silicon/silicide interface length due to non-rectangular epi" )
+`MPIcc( SDTERM ,0 ,"" ,0 ,1 ,"Indicator of whether the source/drain are terminated with silicide" )
+`MPRnb( LSP ,(0.2*(L + XL)) ,"m" ,"Thickness of the gate sidewall spacer" )
+`MPRco( EPSRSP ,3.9 ,"" ,1.0 ,inf ,"Relative dielectric constant of the spacer" )
+`MPRoz( TGATE ,3.0e-8 ,"m" ,"Gate height on top of the hard mask" )
+`MPRcz( TMASK ,3.0e-8 ,"m" ,"Height of hard mask on top of the fin" )
+`MPRcz( ASILIEND ,0.0 ,"m^2" ,"Extra silicide cross sectional area at the two ends of the FinFET" )
+`MPRcz( ARSDEND ,0.0 ,"m^2" ,"Extra raised source/drain cross sectional areaat the two ends of the FinFET" )
+`MPRcz( PRSDEND ,0.0 ,"m" ,"Extra silicon/silicide interface perimeter at the two ends of the FinFET" )
+`MPRcc( NSDE ,2.0e25 ,"/(m^3)" ,1.0e25 ,1.0e26 ,"Source/drain active doping concentration at Leff edge" )
+`MPRnb( RGEOA ,1.0 ,"" ,"Fitting parameter for RGEOMOD=1" )
+`MPRnb( RGEOB ,0.0 ,"/m" ,"Fitting parameter for RGEOMOD=1" )
+`MPRnb( RGEOC ,0.0 ,"/m" ,"Fitting parameter for RGEOMOD=1" )
+`MPRnb( RGEOD ,0.0 ,"/m" ,"Fitting parameter for RGEOMOD=1" )
+`MPRnb( RGEOE ,0.0 ,"/m" ,"Fitting parameter for RGEOMOD=1" )
+`MPRnb( CGEOA ,1.0 ,"" ,"Fitting parameter for CGEOMOD=2" )
+`MPRnb( CGEOB ,0.0 ,"/m" ,"Fitting parameter for CGEOMOD=2" )
+`MPRnb( CGEOC ,0.0 ,"/m" ,"Fitting parameter for CGEOMOD=2" )
+`MPRnb( CGEOD ,0.0 ,"/m" ,"Fitting parameter for CGEOMOD=2" )
+`MPRcz( CGEOE ,1.0 ,"" ,"Fitting parameter for CGEOMOD=2" )
+
+// Gate Current
+`MPRnb( AIGBINV ,1.11e-2 ,"((F*s^2/g)^0.5)*m^-1" ,"Parameter for Igb in inversion" )
+`MPRnb( AIGBINV1 ,0.0 ,"((F*s^2/g)^0.5)*m^-1/K" ,"Parameter for Igb in inversion" )
+`MPRnb( BIGBINV ,9.49e-4 ,"((F*s^2/g)^0.5)*(m*V)^-1" ,"Parameter for Igb in inversion" )
+`MPRnb( CIGBINV ,6.0e-3 ,"/V" ,"Parameter for Igb in inversion" )
+`MPRnb( EIGBINV ,1.1 ,"V" ,"Parameter for Igb in inversion" )
+`MPRnb( NIGBINV ,3.0 ,"" ,"Parameter for Igb in inversion" )
+`MPRnb( AIGBACC ,1.36e-2 ,"((F*s^2/g)^0.5)*m^-1" ,"Parameter for Igb in accumulation" )
+`MPRnb( AIGBACC1 ,0.0 ,"((F*s^2/g)^0.5)*m^-1/K" ,"Parameter for Igb in accumulation" )
+`MPRnb( BIGBACC ,1.71e-3 ,"((F*s^2/g)^0.5)*(m*V)^-1" ,"Parameter for Igb in accumulation" )
+`MPRnb( CIGBACC ,7.5e-2 ,"/V" ,"Parameter for Igb in accumulation" )
+`MPRnb( NIGBACC ,1.0 ,"" ,"Parameter for Igb in accumulation" )
+`MPRnb( AIGC ,1.36e-2 ,"((F*s^2/g)^0.5)*m^-1" ,"Parameter for Igc in inversion" )
+`MPRnb( AIGC1 ,0.0 ,"((F*s^2/g)^0.5)*m^-1/K" ,"Parameter for Igc in inversion" )
+`MPRnb( BIGC ,1.71e-3 ,"((F*s^2/g)^0.5)*(m*V)^-1" ,"Parameter for Igc in inversion" )
+`MPRnb( CIGC ,7.5e-2 ,"/V" ,"Parameter for Igc in inversion" )
+`MPRnb( PIGCD ,1.0 ,"" ,"Parameter for Igc partition" )
+`MPRnb( DLCIGS ,0.0 ,"m" ,"Delta L for Igs model" )
+`MPRnb( AIGS ,1.36e-2 ,"((F*s^2/g)^0.5)*m^-1" ,"Parameter for Igs in inversion" )
+`MPRnb( AIGS1 ,0.0 ,"((F*s^2/g)^0.5)*m^-1/K" ,"Parameter for Igs in inversion" )
+`MPRnb( BIGS ,1.71e-3 ,"((F*s^2/g)^0.5)*(m*V)^-1" ,"Parameter for Igs in inversion" )
+`MPRnb( CIGS ,7.5e-2 ,"/V" ,"Parameter for Igs in inversion" )
+`MPRnb( DLCIGD ,DLCIGS ,"m" ,"Delta L for Igd model" )
+`MPRnb( AIGD ,AIGS ,"((F*s^2/g)^0.5)*m^-1" ,"Parameter for Igd in inversion" )
+`MPRnb( AIGD1 ,AIGS1 ,"((F*s^2/g)^0.5)*m^-1/K" ,"Parameter for Igd in inversion" )
+`MPRnb( BIGD ,BIGS ,"((F*s^2/g)^0.5)*(m*V)^-1" ,"Parameter for Igd in inversion" )
+`MPRnb( CIGD ,CIGS ,"/V" ,"Parameter for Igd in inversion" )
+`MPRnb( VFBSD ,0.0 ,"V" ,"Flatband voltage for S/D region" )
+`MPRnb( VFBSDCV ,VFBSD ,"V" ,"Flatband voltage for S/D region for C-V calculations" )
+`MPRoz( TOXREF ,1.2e-9 ,"m" ,"Target tox value" )
+`MPRnb( TOXG ,TOXP ,"m" ,"Oxide thickness for gate current model" )
+`MPRnb( NTOX ,1.0 ,"" ,"Exponent for Tox ratio" )
+`MPRnb( POXEDGE ,1.0 ,"" ,"Factor for the gate edge Tox" )
+
+// GIDL/GISL Current
+`MPRnb( AGISL ,6.055e-12 ,"mho" ,"Pre-exponential coefficient for GISL" )
+`MPRnb( BGISL ,3.0e8 ,"V/m" ,"Exponential coefficient for GISL" )
+`MPRnb( CGISL ,0.5 ,"V^3" ,"Parameter for body-effect of GISL" )
+`MPRnb( EGISL ,0.2 ,"V" ,"Band bending parameter for GISL" )
+`MPRnb( PGISL ,1.0 ,"" ,"Parameter for body-bias effect on GISL" )
+`MPRnb( AGIDL ,AGISL ,"mho" ,"Pre-exponential coefficient for GIDL" )
+`MPRnb( BGIDL ,BGISL ,"V/m" ,"Exponential coefficient for GIDL" )
+`MPRnb( CGIDL ,CGISL ,"V^3" ,"Parameter for body-effect of GIDL" )
+`MPRnb( EGIDL ,EGISL ,"V" ,"Band bending parameter for GIDL" )
+`MPRnb( PGIDL ,PGISL ,"" ,"Parameter for body-bias effect on GIDL" )
+
+// Impact Ionization Current
+// IIMOD = 1
+`MPRnb( ALPHA0 ,0.0 ,"m/V" ,"First parameter of Iii" )
+`MPRnb( ALPHA01 ,0.0 ,"m/V/K" ,"Temperature dependence of ALPHA0" )
+`MPRnb( ALPHA1 ,0.0 ,"/V" ,"L scaling parameter of Iii" )
+`MPRnb( ALPHA11 ,0.0 ,"/V/K" ,"Temperature dependence ALPHA1" )
+`MPRnb( BETA0 ,0.0 ,"/V" ,"Vds dependence parameter of Iii" )
+
+// IIMOD = 2
+`MPRnb( ALPHAII0 ,0.0 ,"m/V" ,"First parameter of Iii for IIMOD=2" )
+`MPRnb( ALPHAII01 ,0.0 ,"m/V/K" ,"Temperature dependence of ALPHAII0" )
+`MPRnb( ALPHAII1 ,0.0 ,"/V" ,"L scaling parameter of Iii for IIMOD=2" )
+`MPRnb( ALPHAII11 ,0.0 ,"m/V/K" ,"Temperature dependence of ALPHAII1" )
+`MPRnb( BETAII0 ,0.0 ,"/V" ,"Vds dependence parameter of Iii" )
+`MPRnb( BETAII1 ,0.0 ,"" ,"Vds dependence parameter of Iii" )
+`MPRnb( BETAII2 ,0.1 ,"V" ,"Vds dependence parameter of Iii" )
+`MPRnb( ESATII ,1.0e7 ,"V/m" ,"Saturation channel E-field for Iii" )
+`MPRnb( LII ,0.5e-9 ,"V*m" ,"Channel length dependence parameter of Iii" )
+`MPRnb( SII0 ,0.5 ,"/V" ,"Vgs dependence parameter of Iii" )
+`MPRnb( SII1 ,0.1 ,"" ,"1st Vgs dependence parameter of Iii" )
+`MPRnb( SII2 ,0.0 ,"V" ,"2nd Vgs dependence parameter of Iii" )
+`MPRnb( SIID ,0.0 ,"V" ,"3rd Vds dependence parameter of Iii" )
+`MPRoo( IIMOD2CLAMP1 ,0.1 ,"V" ,0.0 ,inf ,"Clamp1 of SII1*Vg term in IIMOD=2 model" )
+`MPRoo( IIMOD2CLAMP2 ,0.1 ,"V" ,0.0 ,inf ,"Clamp2 of SII0*Vg term in IIMOD=2 model" )
+`MPRoo( IIMOD2CLAMP3 ,0.1 ,"V" ,0.0 ,inf ,"Clamp3 of Ratio term in IIMOD=2 model" )
+
+// Accumulation Capacitance
+`MPRco( EOTACC ,EOT ,"m" ,1.0e-10 ,inf ,"Equivalent oxide thickness for accumulation region" )
+`MPRnb( DELVFBACC ,0.0 ,"V" ,"Change in flatband voltage: Vfb_accumulation - Vfb_inversion" )
+
+// Fringe Capacitance
+// CGEOMOD=0
+`MPRcz( CFS ,2.5e-11 ,"F/m" ,"Outer fringe capacitance at source side" )
+`MPRcz( CFD ,CFS ,"F/m" ,"Outer fringe capacitance at drain side" )
+
+// Overlap Capacitance for CGEOMOD = 0 and 2
+`MPRcz( CGSO ,0.0 ,"F/m" ,"Non LDD region source-gate overlap capacitance per unit channel width" )
+`MPRcz( CGDO ,CGSO ,"F/m" ,"Non LDD region drain-gate overlap capacitance per unit channel width" )
+`MPRcz( CGSL ,0.0 ,"F/m" ,"Overlap capacitance between gate and lightly-doped source region (for CGEOMOD = 0, 2)" )
+`MPRcz( CGDL ,CGSL ,"F/m" ,"Overlap capacitance between gate and lightly-doped drain region (for CGEOMOD = 0, 2)" )
+`MPRco( CKAPPAS ,0.6 ,"V" ,2.0e-2 ,inf ,"Coefficient of bias-dependent overlap capacitance for the source side (for CGEOMOD = 0, 2)" )
+`MPRco( CKAPPAD ,CKAPPAS ,"V" ,2.0e-2 ,inf ,"Coefficient of bias-dependent overlap capacitance for the drain side (for CGEOMOD = 0, 2)" )
+`MPRcz( CGBO ,0.0 ,"F/m" ,"Gate-to-substrate overlap capacitance per unit channel length per finger per NGCON" )
+`MPRcz( CGBN ,0.0 ,"F/m" ,"Gate-to-substrate overlap capacitance per unit channel length per fin per finger" )
+`MPRcz( CGBL ,0.0 ,"F/m" ,"Bias dependent component of gate-to-substrate overlap capacitance per unit channel length per fin per finger" )
+`MPRco( CKAPPAB ,0.6 ,"" ,2.0e-2 ,inf ,"Bias dependent gate-to-substrate parasitic capacitance" )
+
+// Source/Drain-to-Substrate Sidewall Capacitance
+`MPRcz( CSDESW ,0.0 ,"F/m" ,"Coefficient for source/drain-to-substrate sidewall capacitance" )
+
+// Junction Current and Capacitance
+// Junction Capacitance
+`MPRnb( CJS ,5.0e-4 ,"F/m^2" ,"Unit area source-side junction capacitance at zero bias" )
+`MPRnb( CJD ,CJS ,"F/m^2" ,"Unit area drain-side junction capacitance at zero bias" )
+`MPRnb( CJSWS ,5.0e-10 ,"F/m" ,"Unit length source-side sidewall junction capacitance at zero bias" )
+`MPRnb( CJSWD ,CJSWS ,"F/m" ,"Unit length drain-side sidewall junction capacitance at zero bias" )
+`MPRnb( CJSWGS ,0.0 ,"F/m" ,"Unit length source-side gate sidewall junction capacitance at zero bias" )
+`MPRnb( CJSWGD ,CJSWGS ,"F/m" ,"Unit length drain-side gate sidewall junction capacitance at zero bias" )
+`MPRnb( PBS ,1.0 ,"V" ,"Source-side bulk junction built-in potential" )
+`MPRnb( PBD ,PBS ,"V" ,"Drain-side bulk junction built-in potential" )
+`MPRnb( PBSWS ,1.0 ,"V" ,"Built-in potential for Source-side sidewall junction capacitance" )
+`MPRnb( PBSWD ,PBSWS ,"V" ,"Built-in potential for Drain-side sidewall junction capacitance" )
+`MPRnb( PBSWGS ,PBSWS ,"V" ,"Built-in potential for Source-side gate sidewall junction capacitance" )
+`MPRnb( PBSWGD ,PBSWGS ,"V" ,"Built-in potential for Drain-side gate sidewall junction capacitance" )
+`MPRnb( MJS ,0.5 ,"" ,"Source bottom junction capacitance grading coefficient" )
+`MPRnb( MJD ,MJS ,"" ,"Drain bottom junction capacitance grading coefficient" )
+`MPRnb( MJSWS ,0.33 ,"" ,"Source sidewall junction capacitance grading coefficient" )
+`MPRnb( MJSWD ,MJSWS ,"" ,"Drain sidewall junction capacitance grading coefficient" )
+`MPRnb( MJSWGS ,MJSWS ,"" ,"Source-side gate sidewall junction capacitance grading coefficient" )
+`MPRnb( MJSWGD ,MJSWGS ,"" ,"Drain-side gate sidewall junction capacitance grading coefficient" )
+
+// Second Junction for Two-Step Junction Capacitance
+`MPRcz( SJS ,0.0 ,"" ,"Constant for source-side two-step second junction" )
+`MPRcz( SJD ,SJS ,"" ,"Constant for drain-side two-step second junction" )
+`MPRcz( SJSWS ,0.0 ,"" ,"Constant for source-side sidewall two-step second junction" )
+`MPRcz( SJSWD ,SJSWS ,"" ,"Constant for drain-side sidewall two-step second junction" )
+`MPRcz( SJSWGS ,0.0 ,"" ,"Constant for source-side gate sidewall two-step second junction" )
+`MPRcz( SJSWGD ,SJSWGS ,"" ,"Constant for source-side gate sidewall two-step second junction" )
+`MPRnb( MJS2 ,1.25e-1 ,"" ,"Source bottom two-step second junction capacitance grading coefficient" )
+`MPRnb( MJD2 ,MJS2 ,"" ,"Drain bottom two-step second junction capacitance grading coefficient" )
+`MPRnb( MJSWS2 ,8.3e-2 ,"" ,"Source sidewall two-step second junction capacitance grading coefficient" )
+`MPRnb( MJSWD2 ,MJSWS2 ,"" ,"Drain sidewall two-step second junction capacitance grading coefficient" )
+`MPRnb( MJSWGS2 ,MJSWS2 ,"" ,"Source-side gate sidewall two-step second junction capacitance grading coefficient" )
+`MPRnb( MJSWGD2 ,MJSWGS2 ,"" ,"Drain-side gate sidewall two-step second junction capacitance grading coefficient" )
+
+// Junction Current
+`MPRnb( JSS ,1.0e-4 ,"A/m^2" ,"Bottom source junction reverse saturation current density" )
+`MPRnb( JSD ,JSS ,"A/m^2" ,"Bottom drain junction reverse saturation current density" )
+`MPRnb( JSWS ,0.0 ,"A/m" ,"Unit length reverse saturation current for sidewall source junction" )
+`MPRnb( JSWD ,JSWS ,"A/m" ,"Unit length reverse saturation current for sidewall drain junction" )
+`MPRnb( JSWGS ,0.0 ,"A/m" ,"Unit length reverse saturation current for gate-edge sidewall source junction" )
+`MPRnb( JSWGD ,JSWGS ,"A/m" ,"Unit length reverse saturation current for gate-edge sidewall drain junction" )
+`MPRex( NJS ,1.0 ,"" ,0.0 ,"Source junction emission coefficient" )
+`MPRex( NJD ,NJS ,"" ,0.0 ,"Drain junction emission coefficient" )
+`MPRnb( IJTHSFWD ,0.1 ,"A" ,"Forward source diode breakdown limiting current" )
+`MPRnb( IJTHDFWD ,IJTHSFWD ,"A" ,"Forward drain diode breakdown limiting current" )
+`MPRnb( IJTHSREV ,0.1 ,"A" ,"Reverse source diode breakdown limiting current" )
+`MPRnb( IJTHDREV ,IJTHSREV ,"A" ,"Reverse drain diode breakdown limiting current" )
+`MPRnb( BVS ,1.0e1 ,"V" ,"Source diode breakdown voltage" )
+`MPRnb( BVD ,BVS ,"V" ,"Drain diode breakdown voltage" )
+`MPRnb( XJBVS ,1.0 ,"" ,"Fitting parameter for source diode breakdown current" )
+`MPRnb( XJBVD ,XJBVS ,"" ,"Fitting parameter for drain diode breakdown current" )
+
+// Tunneling Component of Junction Current
+`MPRnb( JTSS ,0.0 ,"A/m^2" ,"Bottom source junction trap-assisted saturation current density" )
+`MPRnb( JTSD ,JTSS ,"A/m^2" ,"Bottom drain junction trap-assisted saturation current density" )
+`MPRnb( JTSSWS ,0.0 ,"A/m" ,"Unit length trap-assisted saturation current for sidewall source junction" )
+`MPRnb( JTSSWD ,JTSSWS ,"A/m" ,"Unit length trap-assisted saturation current for sidewall drain junction" )
+`MPRnb( JTSSWGS ,0.0 ,"A/m" ,"Unit length trap-assisted saturation current for gate-edge sidewall source junction" )
+`MPRnb( JTSSWGD ,JTSSWGS ,"A/m" ,"Unit length trap-assisted saturation current for gate-edge sidewall drain junction" )
+`MPRnb( JTWEFF ,0.0 ,"m" ,"Trap-assisted tunneling current width dependence" )
+`MPRnb( NJTS ,2.0e1 ,"" ,"Non-ideality factor for JTSS" )
+`MPRnb( NJTSD ,NJTS ,"" ,"Non-ideality factor for JTSD" )
+`MPRnb( NJTSSW ,2.0e1 ,"" ,"Non-ideality factor for JTSSWS" )
+`MPRnb( NJTSSWD ,NJTSSW ,"" ,"Non-ideality factor for JTSSWD" )
+`MPRnb( NJTSSWG ,2.0e1 ,"" ,"Non-ideality factor for JTSSWGS" )
+`MPRnb( NJTSSWGD ,NJTSSWG ,"" ,"Non-ideality factor for JTSSWGD" )
+`MPRnb( VTSS ,1.0e1 ,"V" ,"Bottom source junction trap-assisted current voltage dependent parameter" )
+`MPRnb( VTSD ,VTSS ,"V" ,"Bottom drain junction trap-assisted current voltage dependent parameter" )
+`MPRnb( VTSSWS ,1.0e1 ,"V" ,"Unit length trap-assisted current voltage dependent parameter for sidewall source junction" )
+`MPRnb( VTSSWD ,VTSSWS ,"V" ,"Unit length trap-assisted current voltage dependent parameter for sidewall drain junction" )
+`MPRnb( VTSSWGS ,1.0e1 ,"V" ,"Unit length trap-assisted current voltage dependent parameter for gate-edge sidewall source junction" )
+`MPRnb( VTSSWGD ,VTSSWGS ,"V" ,"Unit length trap-assisted current voltage dependent parameter for gate-edge sidewall drain junction" )
+
+// Recombination-Generation Current
+`MPRnb( LINTIGEN ,0.0 ,"m" ,"Lint for thermal generation current" )
+`MPRnb( NTGEN ,1.0 ,"" ,"Thermal generation current parameter" )
+`MPRnb( AIGEN ,0.0 ,"(m^-3)*(V^-1)" ,"Thermal generation current parameter" )
+`MPRnb( BIGEN ,0.0 ,"(m^-3)*(V^-3)" ,"Thermal generation current parameter" )
+
+// NQS Gate Resistance Model & NQS Charge Deficit Model
+// For NQSMOD=1, Set XRCRG1=0 to turn off NQS gate resistance
+`MPRnb( XRCRG1 ,1.2e1 ,"" ,"Parameter for non-quasistatic gate resistance (NQSMOD = 1) and NQSMOD = 2" )
+`MPRnb( XRCRG2 ,1.0 ,"" ,"Parameter for non-quasistatic gate resistance (NQSMOD = 1) and NQSMOD = 2" )
+
+// NQS Charge Segmentation Model
+`MPIcc( NSEG ,4 ,"" ,4 ,10 ,"Number of segments for NQSMOD=3 (3, 5 & 10 supported)" )
+
+// Flicker Noise
+`MPRnb( EF ,1.0 ,"" ,"Flicker noise frequency exponent" )
+`MPRnb( EM ,4.1e7 ,"V/m" ,"Flicker noise parameter" )
+`MPRnb( NOIA ,6.25e39 ,"(eV^-1)*(s^(1-EF))*(m^-3)" ,"Flicker noise parameter" )
+`MPRnb( NOIB ,3.125e24 ,"(eV^-1)*(s^(1-EF))*(m^-1)" ,"Flicker noise parameter" )
+`MPRnb( NOIC ,8.75e7 ,"(eV^-1)*(s^(1-EF))*(m)" ,"Flicker noise parameter" )
+`MPRnb( LINTNOI ,0.0 ,"m^2" ,"L offset for flicker noise calculation" )
+
+// Thermal Noise
+`MPRcz( NTNOI ,1.0 ,"" ,"Thermal noise parameter" )
+`MPRnb( TNOIA ,1.5 ,"/m" ,"Thermal noise parameter" )
+`MPRnb( TNOIB ,3.5 ,"/m" ,"Thermal noise parameter" )
+`MPRnb( RNOIA ,5.77e-1 ,"" ,"Thermal noise coefficient" )
+`MPRnb( RNOIB ,3.7e-1 ,"" ,"Thermal noise coefficient" )
+
+// Parameters Controlled by Correlated Thermal Noise Switch
+`ifdef __TNOIMOD1__
+`MPRnb( TNOIC ,3.5 ,"" ,"Thermal noise parameter for TNOIMOD=1" )
+`MPRnb( RNOIC ,3.95e-1 ,"" ,"Thermal noise coefficient for TNOIMOD=1" )
+`MPRex( SCALEN ,1.0e5 ,"" ,0.0 ,"Noise scaling parameter for TNOIMOD=1" )
+`endif
+
+// Temperature Effects
+`MPRco( TNOM ,27.0 ,"Celsius" ,-`P_CELSIUS0,inf ,"Temperature at which the model is extracted" )
+`MPRnb( TBGASUB ,7.02e-4 ,"eV/K" ,"Bandgap temperature coefficient" )
+`MPRnb( TBGBSUB ,1.108e3 ,"K" ,"Bandgap temperature coefficient" )
+`MPRnb( KT1 ,0.0 ,"V" ,"Vth temperature coefficient" )
+`MPRnb( KT1L ,0.0 ,"V*m" ,"Vth temperature L coefficient" )
+`MPRnb( TSS ,0.0 ,"/K" ,"Swing temperature coefficient" )
+`MPRnb( IIT ,-0.5 ,"" ,"Impact ionization temperature dependence for IIMOD = 1" )
+`MPRnb( TII ,0.0 ,"" ,"Impact ionization temperature dependence for IIMOD = 2" )
+`MPRnb( TGIDL ,-3.0e-3 ,"/K" ,"GIDL/GISL temperature dependence" )
+`MPRnb( IGT ,2.5 ,"" ,"Gate current temperature dependence" )
+`MPRnb( TCJ ,0.0 ,"/K" ,"Temperature coefficient for CJS/CJD" )
+`MPRnb( TCJSW ,0.0 ,"/K" ,"Temperature coefficient for CJSWS/CJSWD" )
+`MPRnb( TCJSWG ,0.0 ,"/K" ,"Temperature coefficient for CJSWGS/CJSWGD" )
+`MPRnb( TPB ,0.0 ,"/K" ,"Temperature coefficient for PBS/PBD" )
+`MPRnb( TPBSW ,0.0 ,"/K" ,"Temperature coefficient for PBSWS/PBSWD" )
+`MPRnb( TPBSWG ,0.0 ,"/K" ,"Temperature coefficient for PBSWGS/PBSWGD" )
+`MPRnb( XTIS ,3.0 ,"" ,"Source junction current temperature exponent" )
+`MPRnb( XTID ,XTIS ,"" ,"Drain junction current temperature exponent" )
+`MPRnb( XTSS ,2.0e-2 ,"" ,"Power dependence of JTSS on temperature" )
+`MPRnb( XTSD ,XTSS ,"" ,"Power dependence of JTSD on temperature" )
+`MPRnb( XTSSWS ,2.0e-2 ,"" ,"Power dependence of JTSSWS on temperature" )
+`MPRnb( XTSSWD ,XTSSWS ,"" ,"Power dependence of JTSSWD on temperature" )
+`MPRnb( XTSSWGS ,2.0e-2 ,"" ,"Power dependence of JTSSWGS on temperature" )
+`MPRnb( XTSSWGD ,XTSSWGS ,"" ,"Power dependence of JTSSWGD on temperature" )
+`MPRnb( TNJTS ,0.0 ,"" ,"Temperature coefficient for NJTS" )
+`MPRnb( TNJTSD ,TNJTS ,"" ,"Temperature coefficient for NJTSD" )
+`MPRnb( TNJTSSW ,0.0 ,"" ,"Temperature coefficient for NJTSSW" )
+`MPRnb( TNJTSSWD ,TNJTSSW ,"" ,"Temperature coefficient for NJTSSWD" )
+`MPRnb( TNJTSSWG ,0.0 ,"" ,"Temperature coefficient for NJTSSWG" )
+`MPRnb( TNJTSSWGD ,TNJTSSWG ,"" ,"Temperature coefficient for NJTSSWGD" )
+
+// Self Heating
+`MPRcz( RTH0 ,1.0e-2 ,"ohm*m*K/W" ,"Thermal resistance" )
+`MPRcz( CTH0 ,1.0e-5 ,"W*s/m/K" ,"Thermal capacitance" )
+`MPRcz( WTH0 ,0.0 ,"m" ,"Width dependence coefficient for Rth and Cth" )
+`MPRcz( ASHEXP ,1.0 ,"" ,"Exponent to tune RTH dependence of NFINTOTAL" )
+`MPRcz( BSHEXP ,1.0 ,"" ,"Exponent to tune RTH dependence of NF" )
+
+// Unified Model
+`MPRoz( ACH_UFCM ,1.0 ,"m^2" ,"Area of the channel for the unified Model" )
+`MPRoz( CINS_UFCM ,1.0 ,"F/m" ,"Insulator capacitance for the unified Model" )
+`MPRoz( W_UFCM ,1.0 ,"m" ,"Effective channel width for the unified Model" )
+`MPRcz( TFIN_TOP ,1.5e-8 ,"m" ,"Top body (fin) thickness for trapezoidal triple gate" )
+`MPRco( TFIN_BASE ,1.5e-8 ,"m" ,1.0e-9 ,inf ,"Base body (fin) thickness for trapezoidal triple gate" )
+`MPRcz( QMFACTORCV ,0.0 ,"" ,"Charge dependence taking QM effects into account" )
+`MPRcz( ALPHA_UFCM ,0.5556 ,"" ,"Mobile charge scaling term taking QM effects into account" )
+
+// Binning Parameters
+`include "bsimcmg_binning_parameters.include"
+
+// Output Variables
+`ifdef __OPINFO__
+ (* desc= "WEFF" *) real WEFF;
+ (* desc= "LEFF" *) real LEFF;
+ (* desc= "WEFFCV" *) real WEFFCV;
+ (* desc= "LEFFCV" *) real LEFFCV;
+ (* desc= "IDS" *) real IDS;
+ (* desc= "IDEFF" *) real IDEFF;
+ (* desc= "ISEFF" *) real ISEFF;
+ (* desc= "IGTOT" *) real IGTOT;
+ (* desc= "IDSGEN" *) real IDSGEN;
+ (* desc= "III" *) real III;
+ (* desc= "IGS" *) real IGS;
+ (* desc= "IGD" *) real IGD;
+ (* desc= "IGCS" *) real IGCS;
+ (* desc= "IGCD" *) real IGCD;
+ (* desc= "IGBS" *) real IGBS;
+ (* desc= "IGBD" *) real IGBD;
+ (* desc= "IGIDL" *) real IGIDL;
+ (* desc= "IGISL" *) real IGISL;
+ (* desc= "IJSB" *) real IJSB;
+ (* desc= "IJDB" *) real IJDB;
+ (* desc= "ISUB" *) real ISUB;
+ (* desc= "BETA" *) real BETA;
+ (* desc= "VTH" *) real VTH;
+ (* desc= "VDSSAT" *) real VDSSAT;
+ (* desc= "VFB" *) real VFB;
+ (* desc= "GM" *) real GM;
+ (* desc= "GDS" *) real GDS;
+ (* desc= "GMBS" *) real GMBS;
+ (* desc= "QGI" *) real QGI;
+ (* desc= "QDI" *) real QDI;
+ (* desc= "QSI" *) real QSI;
+ (* desc= "QBI" *) real QBI;
+ (* desc= "QG" *) real QG;
+ (* desc= "QD" *) real QD;
+ (* desc= "QS" *) real QS;
+ (* desc= "QB" *) real QB;
+ (* desc= "CGGI" *) real CGGI;
+ (* desc= "CGSI" *) real CGSI;
+ (* desc= "CGDI" *) real CGDI;
+ (* desc= "CGEI" *) real CGEI;
+ (* desc= "CDGI" *) real CDGI;
+ (* desc= "CDDI" *) real CDDI;
+ (* desc= "CDSI" *) real CDSI;
+ (* desc= "CDEI" *) real CDEI;
+ (* desc= "CSGI" *) real CSGI;
+ (* desc= "CSDI" *) real CSDI;
+ (* desc= "CSSI" *) real CSSI;
+ (* desc= "CSEI" *) real CSEI;
+ (* desc= "CEGI" *) real CEGI;
+ (* desc= "CEDI" *) real CEDI;
+ (* desc= "CESI" *) real CESI;
+ (* desc= "CEEI" *) real CEEI;
+ (* desc= "CGG" *) real CGG;
+ (* desc= "CGS" *) real CGS;
+ (* desc= "CGD" *) real CGD;
+ (* desc= "CGE" *) real CGE;
+ (* desc= "CDG" *) real CDG;
+ (* desc= "CDD" *) real CDD;
+ (* desc= "CDS" *) real CDS;
+ (* desc= "CDE" *) real CDE;
+ (* desc= "CSG" *) real CSG;
+ (* desc= "CSD" *) real CSD;
+ (* desc= "CSS" *) real CSS;
+ (* desc= "CSE" *) real CSE;
+ (* desc= "CEG" *) real CEG;
+ (* desc= "CED" *) real CED;
+ (* desc= "CES" *) real CES;
+ (* desc= "CEE" *) real CEE;
+ (* desc= "CGSEXT" *) real CGSEXT;
+ (* desc= "CGDEXT" *) real CGDEXT;
+ (* desc= "CGBOV" *) real CGBOV;
+ (* desc= "CJST" *) real CJST;
+ (* desc= "CJDT" *) real CJDT;
+ (* desc= "RSGEO" *) real RSGEO;
+ (* desc= "RDGEO" *) real RDGEO;
+ (* desc= "CFGEO" *) real CFGEO;
+ (* desc= "T_TOTAL_K" *) real T_TOTAL_K;
+ (* desc= "T_TOTAL_C" *) real T_TOTAL_C;
+ (* desc= "T_DELTA_SH" *) real T_DELTA_SH;
+
+ `ifdef __DEBUG__
+ (* desc= "IGBACC" *) real IGBACC;
+ (* desc= "IGBINV" *) real IGBINV;
+ (* desc= "DIDSDVG" *) real DIDSDVG;
+ (* desc= "DIDSDVS" *) real DIDSDVS;
+ (* desc= "DIDSDVD" *) real DIDSDVD;
+ (* desc= "DIGSDVG" *) real DIGSDVG;
+ (* desc= "DIGSDVS" *) real DIGSDVS;
+ (* desc= "DIGSDVD" *) real DIGSDVD;
+ (* desc= "DIGDDVG" *) real DIGDDVG;
+ (* desc= "DIGDDVS" *) real DIGDDVS;
+ (* desc= "DIGDDVD" *) real DIGDDVD;
+ (* desc= "DIIIDVG" *) real DIIIDVG;
+ (* desc= "DIIIDVS" *) real DIIIDVS;
+ (* desc= "DIIIDVD" *) real DIIIDVD;
+ (* desc= "DIGIDLDVG" *) real DIGIDLDVG;
+ (* desc= "DIGIDLDVS" *) real DIGIDLDVS;
+ (* desc= "DIGIDLDVD" *) real DIGIDLDVD;
+ (* desc= "DIGISLDVG" *) real DIGISLDVG;
+ (* desc= "DIGISLDVS" *) real DIGISLDVS;
+ (* desc= "DIGISLDVD" *) real DIGISLDVD;
+
+ `ifdef __SHMOD__
+ (* desc= "CGT" *) real CGT;
+ (* desc= "CST" *) real CST;
+ (* desc= "CDT" *) real CDT;
+ (* desc= "DIDSDVTH" *) real DIDSDVTH;
+ (* desc= "DIGSDVTH" *) real DIGSDVTH;
+ (* desc= "DIGDDVTH" *) real DIGDDVTH;
+ (* desc= "DIIIDVTH" *) real DIIIDVTH;
+ (* desc= "DIGIDLDVTH" *) real DIGIDLDVTH;
+ (* desc= "DIGISLDVTH" *) real DIGISLDVTH;
+ (* desc= "DITHDVTH" *) real DITHDVTH;
+ `endif
+
+ (* desc= "ITH" *) real ITH;
+ (* desc= "DITHDVG" *) real DITHDVG;
+ (* desc= "DITHDVS" *) real DITHDVS;
+ (* desc= "DITHDVD" *) real DITHDVD;
+ `endif
+`endif
+
+// Variables Inside the Model
+integer devsign;
+
+real NFINtotal;
+real DevTemp;
+real ids0, ids0_ov_dqi, ids, vgs, vds, vdsx, sigvds, vch, etaiv;
+real vgs_noswap, vds_noswap, vgd_noswap;
+real qd, qg, qs, qb;
+real ni, epssub, epssp, epsratio, Eg, Eg0, Nc;
+real Lg, deltaL, deltaL1, deltaLCV, Leff, Leff1, LeffCV, LeffCV_acc, Weff0, WeffCV0;
+real cox, cdsc, cbox;
+real nbody, phib, deltaPhi;
+real T0, T1, T2, T3, T4, T4a, T5, T6, T7, T8, T9;
+real Vtm, Vtm0, nVtm;
+real beta, beta0 ;
+real wf, wr;
+
+// Temperature Effects
+real Tnom, TRatio, dvth_temp, delTemp, ThetaSS;
+real K0_t, K0SI_t, K2SI_t, K1_t, K2SAT_t, A1_t, A2_t;
+real AIGBINV_t, AIGBACC_t, AIGC_t, AIGS_t, AIGD_t;
+real BETA0_t, SII0_t, BGISL_t, BGIDL_t, igtemp, PTWG_t, PTWGR_t;
+real ALPHA0_t, ALPHA1_t, ALPHAII0_t, ALPHAII1_t;
+real CJS_t, CJSWS_t, CJSWGD_t, CJD_t, CJSWD_t, CJSWGS_t;
+real PBS_t, PBSWS_t, PBSWGS_t, PBD_t, PBSWD_t, PBSWGD_t;
+real JSS_t, JSWS_t, JSWGS_t, JSD_t, JSWD_t, JSWGD_t;
+real JTSS_t, JTSD_t, JTSSWS_t, JTSSWD_t, JTSSWGS_t, JTSSWGD_t;
+real NJTS_t, NJTSD_t, NJTSSW_t, NJTSSWD_t, NJTSSWG_t, NJTSSWGD_t;
+real K2_t;
+real K0SISAT_t, K2SISAT_t;
+
+// Variables for analytical surface potential
+real q0;
+real T10, T11, T12;
+real e0, e1, e2;
+
+// Accumulation Model
+real vgsfb, vgsfbeff;
+
+// Short Channel Effect
+real ETA0_t, ETA0R_t;
+real scl, vbi, phist, dvth_vtroll, dvth_dibl, dvth_rsce, dvth_all;
+real tmp, Theta_SCE, Theta_SW, Theta_DIBL, Theta_RSCE, Theta_DITS;
+
+// Lateral Non-uniform Doping Effect
+real Mnud;
+
+// Body Effect for BULKMOD=1
+real ves, vesx, vesmax, veseff;
+real Mob;
+
+// Quantum mechanical correction [units are MKS]
+real coxeff, Tcen0, Tcen, dvch_qm, MTcen;
+real E0, E0prime, E1, E1prime, mx, mxprime, md, mdprime;
+real gprime, gfactor, gam0, gam1, kT;
+
+// Drain Saturation Voltage
+real Vdseff, qis, qid, qbs, Dmobs;
+
+// Midpoint Potential and Charge
+real qia, qia2, qba, dqi;
+real qb0;
+real eta_mu, eta_mu_cv, Eeffm, Eeffm_cv, Dmob, Dmob_cv, u0, ueff, u0_a, u0r;
+real UA_t, UAR_t, UC_t, UCR_t, UCS_t, UD_t, UDR_t, U0_t, U0R_t, ETAMOB_t, Eeffs, EeffFactor;
+
+real Dr, WeffWRFactor;
+real RSourceGeo, RDrainGeo;
+real RDSWMIN_i, RDWMIN_i, RSWMIN_i;
+real Rdrain, Rsource;
+
+real rdstemp, Rdsi, Rdss;
+real RSDR_t, RSDRR_t, RDDR_t, RDDRR_t;
+
+real DIBLfactor, PVAGfactor, diffVds, VaDIBL, Vgst2Vtm, Moc, Mclm;
+real MclmCV, inv_MclmCV;
+
+real Dvsat, Vdsat, inv_MEXP, DvsatCV, Nsat;
+real VSAT_t, VSAT1_t, VSAT1R_t, VSATCV_t, MEXP_t, MEXPR_t, Esat, EsatL, Esat1, Esat1L, EsatCV, EsatCVL;
+real WVCox, Ta, Tb, Tc;
+
+// Asymmetry Model
+real VSAT1_a, MEXP_a, PTWG_a, RSDR_a, RDDR_a, PDIBL1_a, VSAT_a;
+
+// Geometry dependent Source/Drain Resistance
+real mu_max, mu_rsd, rhorsd, afin, thetarsp;
+real Rsp, lt, arsd_total, prsd_total, alpha;
+real eta, RrsdTML, Rrsdside, Rrsd;
+real Rdsgeo, Arsd, Prsd;
+
+// Geometry dependent fringing capacitance
+real Hg, Wg, Trsd, Hrsd, Cgg_top, Cgg_side, Cfr_geo, Acorner, Ccorner;
+
+// Gate Electrode Resistance
+`ifdef __RGATEMOD__
+ real ggeltd, Rgeltd;
+`endif
+
+// Gate Current
+real Vaux_Igbinv, igbinv, igsd_mult, igsd_mult0, igbs, igbd;
+real Voxacc, Vaux_Igbacc, vfbzb, igbacc;
+real igcs, igcd, igc0, Vdseffx, T1_exp;
+real igisl, igidl, vfbsd, igs, igd, vgs_eff, vgd_eff;
+real Aechvb, Bechvb, Toxratio, Toxratioedge;
+
+// Impact Ionization current
+real Iii, Vdiff, Vdsatii, VgsStep, Ratio, ALPHAII;
+
+// Accumulation Capacitance
+real cox_acc;
+real qg_acc, qb_acc;
+real vge;
+
+// Parasitic Capacitance
+real qgs_ov, qgd_ov, qgs_fr, qgd_fr, qds_fr;
+real qgs_parasitic, qgd_parasitic, Qes, Qed, Qeg;
+real vgs_overlap, vgd_overlap, vge_overlap;
+real cgsp, cgdp, csbox, cdbox, cgbox, vfbsdcv;
+
+// Junction Current and Capacitance
+real Ies, Ied, ves_jct, ved_jct, vec;
+real Czbs, Czbssw, Czbsswg, Czbd, Czbdsw, Czbdswg;
+real pb2, arg, sarg, Qec;
+real Qesj, Qesj1, Qesj2, Qesj3, Qedj, Qedj1, Qedj2, Qedj3;
+real Isbs, Isbd, Nvtms, Nvtmd;
+real SslpRev, IVjsmRev, VjsmRev, SslpFwd, IVjsmFwd, VjsmFwd, XExpBVS;
+real DslpRev, IVjdmRev, VjdmRev, DslpFwd, IVjdmFwd, VjdmFwd, XExpBVD;
+real igentemp, idsgen, LINTIGEN_i;
+
+// NQS Gate Resistance
+`ifdef __NQSMOD1__
+ real gcrg, XRCRG1_i, XRCRG2_i;
+ real IdovVds;
+`endif
+
+// NQS Charge Deficit Model
+`ifdef __NQSMOD2__
+ real xdpart, gtau, gcrg, XRCRG1_i, XRCRG2_i;
+ real IdovVds;
+`endif
+
+// Flicker Noise
+real LINTNOI_i;
+real litl, Esatnoi, Leffnoi, Leffnoisq, DelClm;
+real N0, Nl, Nstar, Ssi, Swi, FNPowerAt1Hz;
+
+// Thermal Noise
+real NTNOI_i, qinv;
+real Gtnoi, sid;
+real gspr, gdpr;
+
+// Variables Controlled by Correlated Thermal Noise Switch
+`ifdef __TNOIMOD1__
+ real Abulk, etaa, gamma, delta, epsilon, gche;
+ real npart_beta, npart_theta, ctnoi, npart_c;
+ real noiGd0, GammaGd0, C0, sf;
+`endif
+
+// Self Heating
+`ifdef __SHMOD__
+ real gth, cth;
+`endif
+
+// Binning
+real Inv_L, Inv_NFIN, Inv_LNFIN;
+real NBODY_i, PHIG_i, CFD_i, CFS_i, COVS_i, COVD_i, CGSO_i, CGDO_i;
+real CGSL_i, CGDL_i, CGBL_i, CKAPPAS_i, CKAPPAD_i, CKAPPAB_i;
+real QMFACTOR_i, QMTCENCV_i, QMTCENCVA_i, KSATIV_i, KSATIVR_i, KSATIV_a;
+real CDSC_i, CDSCD_i, CDSCD_a, CDSCDR_i, CIT_i, DVT0_i, CITR_i, CIT_a;
+real DVT1_i, DVT1SS_i, PHIN_i, ETA0_i, ETA0_a, ETA0R_i, DSUB_i, VSAT_i, VSATR_i, VSATR_t;
+real DVTP0_i, DVTP1_i ;
+real K0_i, K01_i, K0SI_i, K0SI1_i, K2SI_i, K2SI1_i, PHIBE_i, K1_i, K11_i, K2SAT_i, K2SAT1_i;
+real DELTAVSAT_i, PSAT_i, DELTAVSATCV_i, PSATCV_i, VSAT1_i, VSAT1R_i, PTWG_i, PTWGR_i, VSATCV_i;
+real UP_i, U0_i, U0R_i, ETAMOB_i, NGATE_i, RDSW_i, UPR_i;
+real PRWGS_i, PRWGD_i, WR_i, PDIBL1_i, PDIBL1R_i, PDIBL2_i,PDIBL2R_i, PDIBL2_a ;
+real DROUT_i, PVAG_i;
+real AIGBINV_i, AIGBINV1_i, BIGBINV_i, CIGBINV_i, EIGBINV_i, NIGBINV_i;
+real AIGBACC_i, AIGBACC1_i, BIGBACC_i, CIGBACC_i, NIGBACC_i;
+real AIGC_i, AIGC1_i, BIGC_i, CIGC_i, PIGCD_i;
+real AIGS_i, AIGS1_i, BIGS_i, CIGS_i, NTOX_i, POXEDGE_i;
+real AIGD_i, AIGD1_i, BIGD_i, CIGD_i;
+real AGIDL_i, BGIDL_i, CGIDL_i, EGIDL_i, PGIDL_i;
+real AGISL_i, BGISL_i, CGISL_i, EGISL_i, PGISL_i;
+real ALPHA0_i, ALPHA1_i, ALPHAII0_i, ALPHAII1_i, BETA0_i;
+real BETAII0_i, BETAII1_i, BETAII2_i, ESATII_i;
+real LII_i, SII0_i, SII1_i, SII2_i, SIID_i, TII_i;
+real MEXP_i, MEXPR_i;
+real PCLM_i, PCLMG_i, PCLMCV_i, PCLM_a, PCLMR_i;
+real A1_i, A2_i, A11_i, A21_i;
+real K1RSCE_i, LPE0_i, DVTSHIFT_i, DVTSHIFT_a, DVTSHIFTR_i ;
+real UA_i, UC_i, EU_i, UD_i, UCS_i, UAR_i, EUR_i, UCR_i, UDR_i, UA_a, UD_a, UC_a, EU_a;
+real UA1_i, UA1R_i, UC1_i, UD1_i, UCSTE_i, UTE_i, UTL_i, EMOBT_i, UC1R_i, UD1R_i, UTER_i, UTLR_i;
+real PTWGT_i;
+real AT_i, ATCV_i, ATR_i;
+real RDW_i, RSW_i;
+real PRT_i, KT1_i, TSS_i, IIT_i, IGT_i, TGIDL_i;
+real NTGEN_i, AIGEN_i, BIGEN_i;
+real K0SISAT_i, K0SISAT1_i;
+real K2SISAT_i, K2SISAT1_i;
+real K2_i, K21_i;
+
+// Variables of Unified Finfet Compact Model
+real Cins, Ach, Weff_UFCM, qdep,rc, vth_fixed_factor_Sub, vth_fixed_factor_SI, qm, Qdep_ov_Cins, qi_acc_for_QM;
+real fieldnormalizationfactor, auxQMfact, QMFACTORCVfinal;
+real psipclamp, sqrtpsip, nq, F0;
+
+//===================================================
+// analog block begins
+//===================================================
+analog begin
+
+ // ************************************************
+ // * Geometry dependent calculations *
+ // ************************************************
+ begin : CMGBiasIndepCalc
+
+ // Variable Initialization to Prevent Hidden States
+ qid = 0.0;
+ qis = 0.0;
+ qba = 0.0;
+ T11 = 0.0;
+ T12 = 0.0;
+ ids = 0.0;
+ sigvds = 0.0;
+ Iii = 0.0;
+ qd = 0.0;
+ qg = 0.0;
+ qs = 0.0;
+ qb = 0.0;
+ Weff0 = 0.0;
+ WeffCV0 = 0.0;
+ CJS_t = 0.0;
+ CJSWS_t = 0.0;
+ CJSWGS_t = 0.0;
+ CJD_t = 0.0;
+ CJSWD_t = 0.0;
+ CJSWGD_t = 0.0;
+ PBS_t = 0.0;
+ PBSWS_t = 0.0;
+ PBSWGS_t = 0.0;
+ PBD_t = 0.0;
+ PBSWD_t = 0.0;
+ PBSWGD_t = 0.0;
+ JSS_t = 0.0;
+ JSWS_t = 0.0;
+ JSWGS_t = 0.0;
+ JSD_t = 0.0;
+ JSWD_t = 0.0;
+ JSWGD_t = 0.0;
+ JTSS_t = 0.0;
+ JTSSWS_t = 0.0;
+ JTSSWGS_t = 0.0;
+ JTSD_t = 0.0;
+ JTSSWD_t = 0.0;
+ JTSSWGD_t = 0.0;
+ NJTS_t = 0.0;
+ NJTSSW_t = 0.0;
+ NJTSSWG_t = 0.0;
+ NJTSD_t = 0.0;
+ NJTSSWD_t = 0.0;
+ NJTSSWGD_t = 0.0;
+ Ies = 0.0;
+ Ied = 0.0;
+ Czbs = 0.0;
+ Czbssw = 0.0;
+ Czbsswg = 0.0;
+ Czbd = 0.0;
+ Czbdsw = 0.0;
+ Czbdswg = 0.0;
+ Qes = 0.0;
+ Qed = 0.0;
+ Qeg = 0.0;
+ Isbs = 0.0;
+ Isbd = 0.0;
+ Nvtms = 0.0;
+ Nvtmd = 0.0;
+ SslpRev = 0.0;
+ IVjsmRev = 0.0;
+ VjsmRev = 0.0;
+ SslpFwd = 0.0;
+ IVjsmFwd = 0.0;
+ VjsmFwd = 0.0;
+ DslpRev = 0.0;
+ IVjdmRev = 0.0;
+ VjdmRev = 0.0;
+ DslpFwd = 0.0;
+ IVjdmFwd = 0.0;
+ VjdmFwd = 0.0;
+ XExpBVS = 0.0;
+ XExpBVD = 0.0;
+ idsgen = 0.0;
+ q0 = 0.0;
+ Tcen = 0.0;
+ MTcen = 0.0;
+ Rdrain = 0.0;
+ Rsource = 0.0;
+ Cfr_geo = 0.0;
+ igbinv = 0.0;
+ igbs = 0.0;
+ igbd = 0.0;
+ igbacc = 0.0;
+ igcs = 0.0;
+ igcd = 0.0;
+ igidl = 0.0;
+ igisl = 0.0;
+ igs = 0.0;
+ igd = 0.0;
+ cox_acc = 0.0;
+ CGSO_i = 0.0;
+ CGDO_i = 0.0;
+ qb_acc = 0.0;
+ qg_acc = 0.0;
+ qgs_fr = 0.0;
+ qgd_fr = 0.0;
+ qds_fr = 0.0;
+ qgs_parasitic = 0.0;
+ qgd_parasitic = 0.0;
+ FNPowerAt1Hz = 0.0;
+ Gtnoi = 0.0;
+ gspr = 0.0;
+ gdpr = 0.0;
+ Dr = 1.0;
+ CDSCDR_i = 0.0;
+ ETA0R_i = 0.0;
+ VSAT1R_i = 0.0;
+ VSAT1R_t = 0.0;
+ MEXPR_i = 0.0;
+ MEXPR_t = 0.0;
+ PTWGR_i = 0.0;
+ PTWGR_t = 0.0;
+ PDIBL1R_i = 0.0;
+ PDIBL2R_i = 0.0;
+ PHIBE_i = 0.0;
+ K1_i = 0.0;
+ K11_i = 0.0;
+ K2SAT_i = 0.0;
+ K2SAT1_i = 0.0;
+ KSATIVR_i = 0.0;
+ K2_i = 0.0;
+ K21_i = 0.0;
+ UC_i = 0.0;
+ UC1_i = 0.0;
+ UC_t = 0.0;
+ U0R_i = 0.0;
+ UPR_i = 0.0;
+ EUR_i = 0.0;
+ ATR_i = 0.0;
+ CITR_i = 0.0;
+ ETA0R_i = 0.0;
+ DVTP0_i = 0.0;
+ DVTP1_i = 0.0;
+ PDIBL2R_i = 0.0;
+ PCLMR_i = 0.0;
+ LeffCV_acc = 0.0;
+ RDDRR_t = 0.0;
+ RSDRR_t = 0.0;
+ Rdsi = 0.0;
+ T3 = 0.0;
+ Tcen0 = 0.0;
+ veseff = 0.0;
+ U0R_t = 0.0;
+ UAR_t = 0.0;
+ UCR_t = 0.0;
+ UDR_t = 0.0;
+ VSAT_a = 0.0;
+ DVTSHIFTR_i = 0.0;
+ UA1R_i = 0.0;
+ UAR_i = 0.0;
+ UC1R_i = 0.0;
+ UCR_i = 0.0;
+ UD1R_i = 0.0;
+ UDR_i = 0.0;
+ UTER_i = 0.0;
+ UTLR_i = 0.0;
+ VSATR_i = 0.0;
+ VSATR_t = 0.0;
+ u0r = 0.0;
+
+ // Thermal Noise
+ sid = 0.0;
+
+ `ifdef __TNOIMOD1__
+ ctnoi = 0.0;
+ sf = 0.0;
+ C0 = 0.0;
+ gamma = 0.0;
+ delta = 0.0;
+ `endif
+
+ `ifdef __RGATEMOD__
+ ggeltd = 0.0;
+ `endif
+
+ // Unified FinFET Model
+ qm = 1.0;
+ Cins = 1.0;
+ Ach = 1.0;
+ Weff_UFCM = 1.0;
+ qdep = -1.0;
+ rc = 1.0;
+ vth_fixed_factor_Sub = 1.0;
+ vth_fixed_factor_SI = 1.0;
+ qi_acc_for_QM = 0.0;
+ fieldnormalizationfactor = 0.0;
+ auxQMfact = 0.0;
+ QMFACTORCVfinal = 0.0;
+ psipclamp = 1.0;
+ sqrtpsip = 1.0;
+ nq = 1.0;
+ F0 = 0.0;
+ e0 = 0.0;
+ e1 = 0.0;
+ e2 = 0.0;
+ Qdep_ov_Cins = 0.0;
+
+ // Constants
+ if ( TYPE == `ntype ) begin
+ devsign = 1;
+ end else begin
+ devsign = -1;
+ end
+
+ epssub = EPSRSUB * `EPS0;
+ epssp = EPSRSP * `EPS0;
+ cbox = EPSROX * `EPS0 / EOTBOX;
+ epsratio = EPSRSUB / EPSROX;
+
+ if (1 /*$port_connected(t)*/ == 1) begin
+ `ifdef __SHMOD__
+ if (SHMOD == 0) begin
+ if (SH_WARN == 1) begin
+ $strobe("The optional 5th terminal is present but not active because SHMOD=0.");
+ end
+ end
+ `else
+ Temp(t) <+ 0.0;
+ if (SH_WARN == 1) begin
+ $strobe("The optional 5th terminal is present but not active because the model was not compiled with self-heating enabled (__SHMOD__ was not activated).");
+ end
+ `endif
+ end
+
+ // Constants for Quantum Mechanical Effects
+ mx = 0.916 * `MEL;
+ mxprime = 0.190 * `MEL;
+ md = 0.190 * `MEL;
+ mdprime = 0.417 * `MEL;
+ gprime = 4.0;
+ gfactor = 2.0;
+
+ // Effective Channel Length for I-V / C-V
+ Lg = L + XL;
+ deltaL = LINT + LL * pow(Lg, -LLN);
+ deltaL1 = LINT + LL * pow(Lg+DLBIN, -LLN);
+ deltaLCV = DLC + LLC * pow(Lg, -LLN);
+ Leff = Lg - 2.0 * deltaL;
+ Leff1 = Lg + DLBIN - 2.0 * deltaL1; //Used in the binning equations only
+ LeffCV = Lg - 2.0 * deltaLCV;
+ if (BULKMOD != 0) LeffCV_acc = LeffCV - DLCACC;
+
+ // Total Fins
+ NFINtotal = NFIN * NF;
+
+ // Range Checking on Leff and Leff1
+ if (Leff <= 0.0) begin
+ $strobe("Fatal: Leff = %e is not positive.", Leff);
+ $finish(0);
+ end else if (Leff <= 1.0e-9) begin
+ $strobe("Warning: Leff = %e <= 1.0e-9.", Leff);
+ end
+
+ if (Leff1 <= 0.0) begin
+ $strobe("Fatal: Leff1 = %e is not positive.", Leff1);
+ $finish(0);
+ end else if (Leff1 <= 1.0e-9) begin
+ $strobe("Warning: Leff1 = %e <= 1.0e-9.", Leff1);
+ end
+
+ // Binning
+ Inv_L = 1.0e-6 / (Leff1);
+ Inv_NFIN = 1.0 / NFIN;
+ Inv_LNFIN = 1.0e-6 / (Leff1 * NFIN);
+
+ // Nbody Binning Equation for UFCM Parameters
+ NBODY_i = NBODY + Inv_L * LNBODY + Inv_NFIN * NNBODY + Inv_LNFIN * PNBODY;
+
+ if (NBODYN1 != 0.0) begin
+ NBODY_i = NBODY_i * (1.0 + NBODYN1/NFIN * lln(1.0 + NFIN/NBODYN2));
+ end
+
+ // Model Parameters for Unified FinFET Compact Model by Juan Duarte 10/2013
+ case (GEOMOD)
+ 0: begin // Double Gate
+ if (!$param_given(TFIN_TOP) || !$param_given(TFIN_BASE)) begin
+ Weff_UFCM = 2.0 * HFIN;
+ Cins = Weff_UFCM * EPSROX * `EPS0 / EOT;
+ Ach = HFIN * TFIN;
+ rc = (2.0 * Cins / (Weff_UFCM * Weff_UFCM * epssub / Ach));
+ Qdep_ov_Cins = -`q * NBODY_i * Ach / Cins;
+ end else begin
+ Weff_UFCM = 2.0 * sqrt( HFIN * HFIN + (TFIN_TOP - TFIN_BASE) * (TFIN_TOP - TFIN_BASE) / 4.0);
+ Cins = Weff_UFCM * EPSROX * `EPS0 / EOT;
+ Ach = HFIN * (TFIN_TOP + TFIN_BASE) / 2.0;
+ rc = (2.0 * Cins / (Weff_UFCM * Weff_UFCM * epssub / Ach));
+ Qdep_ov_Cins = -`q * NBODY_i * Ach / Cins;
+ end
+ end
+ 1: begin // Triple Gate
+ if (!$param_given(TFIN_TOP) || !$param_given(TFIN_BASE)) begin
+ Weff_UFCM = 2.0 * HFIN + TFIN;
+ Cins = Weff_UFCM * EPSROX * `EPS0 / EOT;
+ Ach = HFIN * TFIN;
+ rc = (2.0 * Cins / (Weff_UFCM * Weff_UFCM * epssub / Ach));
+ Qdep_ov_Cins = -`q * NBODY_i * Ach / Cins;
+ end else begin
+ Weff_UFCM = 2.0 * sqrt(HFIN * HFIN + (TFIN_TOP - TFIN_BASE) * (TFIN_TOP - TFIN_BASE) / 4.0) + TFIN_TOP;
+ Cins = Weff_UFCM * EPSROX * `EPS0 / EOT;
+ Ach = HFIN * (TFIN_TOP + TFIN_BASE) / 2.0;
+ rc = (2.0 * Cins /(Weff_UFCM * Weff_UFCM * epssub / Ach));
+ Qdep_ov_Cins = -`q * NBODY_i * Ach / Cins;
+ end
+ end
+ 2: begin // Quadruple Gate
+ if (!$param_given(TFIN_TOP) || !$param_given(TFIN_BASE)) begin
+ Weff_UFCM = 2.0 * HFIN + 2.0 * TFIN;
+ Cins = Weff_UFCM * EPSROX * `EPS0 / EOT;
+ Ach = HFIN * TFIN;
+ rc = (2.0 * Cins / (Weff_UFCM * Weff_UFCM * epssub / Ach));
+ Qdep_ov_Cins = -`q * NBODY_i * Ach / Cins;
+ end else begin
+ Weff_UFCM = 2.0 * sqrt(HFIN * HFIN + (TFIN_TOP - TFIN_BASE) * (TFIN_TOP - TFIN_BASE) / 4.0) + TFIN_TOP + TFIN_BASE;
+ Cins = Weff_UFCM * EPSROX * `EPS0 / EOT;
+ Ach = HFIN * (TFIN_TOP + TFIN_BASE) / 2.0;
+ rc = (2.0 * Cins / (Weff_UFCM * Weff_UFCM * epssub / Ach));
+ Qdep_ov_Cins = -`q * NBODY_i * Ach / Cins;
+ end
+ end
+ 3: begin // Cylindrical Gate
+ Weff_UFCM = `M_PI * D;
+ Cins = 2.0 * `M_PI * EPSROX * `EPS0 / ln(1.0 + 2.0 * EOT / D);
+ Ach = `M_PI * D * D / 4.0;
+ rc = (2.0 * Cins / (Weff_UFCM * Weff_UFCM * epssub / Ach));
+ Qdep_ov_Cins = -`q * NBODY_i * Ach / Cins;
+ end
+ 4: begin // Unified Model
+ Weff_UFCM = W_UFCM;
+ Cins = CINS_UFCM;
+ Ach = ACH_UFCM;
+ rc = (2.0 * Cins / (Weff_UFCM * Weff_UFCM * epssub / Ach));
+ Qdep_ov_Cins = -`q * NBODY_i * Ach / Cins;
+ end
+ endcase
+
+ // Cox Definition
+ cox = Cins / Weff_UFCM;
+ if (BULKMOD != 0) begin
+ cox_acc = cox * EOT / EOTACC;
+ end
+
+ // Effective Width Calculation
+ Weff0 = Weff_UFCM - DELTAW;
+ WeffCV0 = Weff_UFCM - DELTAWCV;
+
+ // SCE Scaling Length
+ scl = sqrt((epssub * Ach / Cins) * (1.0 + Ach * Cins / (2.0 * epssub * Weff_UFCM * Weff_UFCM)));
+
+ // Binning Equations (Process Parameters)
+ PHIG_i = PHIG + Inv_L * LPHIG + Inv_NFIN * NPHIG + Inv_LNFIN * PPHIG;
+ NGATE_i = NGATE + Inv_L * LNGATE + Inv_NFIN * NNGATE + Inv_LNFIN * PNGATE;
+
+ // Binning Equations (Model Parameters)
+ CIT_i = CIT + Inv_L * LCIT + Inv_NFIN * NCIT + Inv_LNFIN * PCIT;
+ CDSC_i = CDSC + Inv_L * LCDSC + Inv_NFIN * NCDSC + Inv_LNFIN * PCDSC;
+ CDSCD_i = CDSCD + Inv_L * LCDSCD + Inv_NFIN * NCDSCD + Inv_LNFIN * PCDSCD;
+ DVT0_i = DVT0 + Inv_L * LDVT0 + Inv_NFIN * NDVT0 + Inv_LNFIN * PDVT0;
+ DVT1_i = DVT1 + Inv_L * LDVT1 + Inv_NFIN * NDVT1 + Inv_LNFIN * PDVT1;
+ DVT1SS_i = DVT1SS + Inv_L * LDVT1SS + Inv_NFIN * NDVT1SS + Inv_LNFIN * PDVT1SS;
+ PHIN_i = PHIN + Inv_L * LPHIN + Inv_NFIN * NPHIN + Inv_LNFIN * PPHIN;
+ ETA0_i = ETA0 + Inv_L * LETA0 + Inv_NFIN * NETA0 + Inv_LNFIN * PETA0;
+ DSUB_i = DSUB + Inv_L * LDSUB + Inv_NFIN * NDSUB + Inv_LNFIN * PDSUB;
+ K1RSCE_i = K1RSCE + Inv_L * LK1RSCE + Inv_NFIN * NK1RSCE + Inv_LNFIN * PK1RSCE;
+ LPE0_i = LPE0 + Inv_L * LLPE0 + Inv_NFIN * NLPE0 + Inv_LNFIN * PLPE0;
+ DVTSHIFT_i = DVTSHIFT + Inv_L * LDVTSHIFT + Inv_NFIN * NDVTSHIFT + Inv_LNFIN * PDVTSHIFT;
+ K0_i = K0 + Inv_L * LK0 + Inv_NFIN * NK0 + Inv_LNFIN * PK0;
+ K01_i = K01 + Inv_L * LK01 + Inv_NFIN * NK01 + Inv_LNFIN * PK01;
+ K0SI_i = K0SI + Inv_L * LK0SI + Inv_NFIN * NK0SI + Inv_LNFIN * PK0SI;
+ K0SI1_i = K0SI1 + Inv_L * LK0SI1 + Inv_NFIN * NK0SI1 + Inv_LNFIN * PK0SI1;
+ K2SI_i = K2SI + Inv_L * LK2SI + Inv_NFIN * NK2SI + Inv_LNFIN * PK2SI;
+ K2SI1_i = K2SI1 + Inv_L * LK2SI1 + Inv_NFIN * NK2SI1 + Inv_LNFIN * PK2SI1;
+ K0SISAT_i = K0SISAT + Inv_L * LK0SISAT + Inv_NFIN * NK0SISAT + Inv_LNFIN * PK0SISAT;
+ K0SISAT1_i = K0SISAT1 + Inv_L * LK0SISAT1 + Inv_NFIN * NK0SISAT1 + Inv_LNFIN * PK0SISAT1;
+ K2SISAT_i = K2SISAT + Inv_L * LK2SISAT + Inv_NFIN * NK2SISAT + Inv_LNFIN * PK2SISAT;
+ K2SISAT1_i = K2SISAT1 + Inv_L * LK2SISAT1 + Inv_NFIN * NK2SISAT1 + Inv_LNFIN * PK2SISAT1;
+
+ if (BULKMOD != 0) begin
+ if (BULKMOD == 2) begin
+ K2_i = K2 + Inv_L * LK2 + Inv_NFIN * NK2 + Inv_LNFIN * PK2;
+ K21_i = K21 + Inv_L * LK21 + Inv_NFIN * NK21 + Inv_LNFIN * PK21;
+ K2SAT_i = K2SAT + Inv_L * LK2SAT + Inv_NFIN * NK2SAT + Inv_LNFIN * PK2SAT;
+ K2SAT1_i = K2SAT1 + Inv_L * LK2SAT1 + Inv_NFIN * NK2SAT1 + Inv_LNFIN * PK2SAT1;
+ end
+ PHIBE_i = PHIBE + Inv_L * LPHIBE + Inv_NFIN * NPHIBE + Inv_LNFIN * PPHIBE;
+ K1_i = K1 + Inv_L * LK1 + Inv_NFIN * NK1 + Inv_LNFIN * PK1;
+ K11_i = K11 + Inv_L * LK11 + Inv_NFIN * NK11 + Inv_LNFIN * PK11;
+ end
+ QMFACTOR_i = QMFACTOR + Inv_L * LQMFACTOR + Inv_NFIN * NQMFACTOR + Inv_LNFIN * PQMFACTOR;
+ QMTCENCV_i = QMTCENCV + Inv_L * LQMTCENCV + Inv_NFIN * NQMTCENCV + Inv_LNFIN * PQMTCENCV;
+ QMTCENCVA_i = QMTCENCVA + Inv_L * LQMTCENCVA + Inv_NFIN * NQMTCENCVA + Inv_LNFIN * PQMTCENCVA;
+ VSAT_i = VSAT + Inv_L * LVSAT + Inv_NFIN * NVSAT + Inv_LNFIN * PVSAT;
+ VSAT1_i = VSAT1 + Inv_L * LVSAT1 + Inv_NFIN * NVSAT1 + Inv_LNFIN * PVSAT1;
+ VSATCV_i = VSATCV + Inv_L * LVSATCV + Inv_NFIN * NVSATCV + Inv_LNFIN * PVSATCV;
+ DELTAVSAT_i = DELTAVSAT + Inv_L * LDELTAVSAT + Inv_NFIN * NDELTAVSAT + Inv_LNFIN * PDELTAVSAT;
+ PSAT_i = PSAT + Inv_L * LPSAT + Inv_NFIN * NPSAT + Inv_LNFIN * PPSAT;
+ DELTAVSATCV_i = DELTAVSATCV + Inv_L * LDELTAVSATCV + Inv_NFIN * NDELTAVSATCV + Inv_LNFIN * PDELTAVSATCV;
+ PSATCV_i = PSATCV + Inv_L * LPSATCV + Inv_NFIN * NPSATCV + Inv_LNFIN * PPSATCV;
+ KSATIV_i = KSATIV + Inv_L * LKSATIV + Inv_NFIN * NKSATIV + Inv_LNFIN * PKSATIV;
+ MEXP_i = MEXP + Inv_L * LMEXP + Inv_NFIN * NMEXP + Inv_LNFIN * PMEXP;
+ PTWG_i = PTWG + Inv_L * LPTWG + Inv_NFIN * NPTWG + Inv_LNFIN * PPTWG;
+ U0_i = U0 + Inv_L * LU0 + Inv_NFIN * NU0 + Inv_LNFIN * PU0;
+ ETAMOB_i = ETAMOB + Inv_L * LETAMOB + Inv_NFIN * NETAMOB + Inv_LNFIN * PETAMOB;
+ UP_i = UP + Inv_L * LUP + Inv_NFIN * NUP + Inv_LNFIN * PUP;
+ UA_i = UA + Inv_L * LUA + Inv_NFIN * NUA + Inv_LNFIN * PUA;
+ if (BULKMOD != 0) begin
+ UC_i = UC + Inv_L * LUC + Inv_NFIN * NUC + Inv_LNFIN * PUC;
+ end
+ EU_i = EU + Inv_L * LEU + Inv_NFIN * NEU + Inv_LNFIN * PEU;
+ UD_i = UD + Inv_L * LUD + Inv_NFIN * NUD + Inv_LNFIN * PUD;
+ UCS_i = UCS + Inv_L * LUCS + Inv_NFIN * NUCS + Inv_LNFIN * PUCS;
+ PCLM_i = PCLM + Inv_L * LPCLM + Inv_NFIN * NPCLM + Inv_LNFIN * PPCLM;
+ PCLMG_i = PCLMG + Inv_L * LPCLMG + Inv_NFIN * NPCLMG + Inv_LNFIN * PPCLMG;
+ PCLMCV_i = PCLMCV + Inv_L * LPCLMCV + Inv_NFIN * NPCLMCV + Inv_LNFIN * PPCLMCV;
+ A1_i = A1 + Inv_L * LA1 + Inv_NFIN * NA1 + Inv_LNFIN * PA1;
+ A11_i = A11 + Inv_L * LA11 + Inv_NFIN * NA11 + Inv_LNFIN * PA11;
+ A2_i = A2 + Inv_L * LA2 + Inv_NFIN * NA2 + Inv_LNFIN * PA2;
+ A21_i = A21 + Inv_L * LA21 + Inv_NFIN * NA21 + Inv_LNFIN * PA21;
+ RDSW_i = RDSW + Inv_L * LRDSW + Inv_NFIN * NRDSW + Inv_LNFIN * PRDSW;
+ RSW_i = RSW + Inv_L * LRSW + Inv_NFIN * NRSW + Inv_LNFIN * PRSW;
+ RDW_i = RDW + Inv_L * LRDW + Inv_NFIN * NRDW + Inv_LNFIN * PRDW;
+ PRWGD_i = PRWGD + Inv_L * LPRWGD + Inv_NFIN * NPRWGD + Inv_LNFIN * PPRWGD;
+ PRWGS_i = PRWGS + Inv_L * LPRWGS + Inv_NFIN * NPRWGS + Inv_LNFIN * PPRWGS;
+ WR_i = WR + Inv_L * LWR + Inv_NFIN * NWR + Inv_LNFIN * PWR;
+ PDIBL1_i = PDIBL1 + Inv_L * LPDIBL1 + Inv_NFIN * NPDIBL1 + Inv_LNFIN * PPDIBL1;
+ PDIBL2_i = PDIBL2 + Inv_L * LPDIBL2 + Inv_NFIN * NPDIBL2 + Inv_LNFIN * PPDIBL2;
+ DROUT_i = DROUT + Inv_L * LDROUT + Inv_NFIN * NDROUT + Inv_LNFIN * PDROUT;
+ PVAG_i = PVAG + Inv_L * LPVAG + Inv_NFIN * NPVAG + Inv_LNFIN * PPVAG;
+ AIGBINV_i = AIGBINV + Inv_L * LAIGBINV + Inv_NFIN * NAIGBINV + Inv_LNFIN * PAIGBINV;
+ AIGBINV1_i = AIGBINV1 + Inv_L * LAIGBINV1 + Inv_NFIN * NAIGBINV1 + Inv_LNFIN * PAIGBINV1;
+ BIGBINV_i = BIGBINV + Inv_L * LBIGBINV + Inv_NFIN * NBIGBINV + Inv_LNFIN * PBIGBINV;
+ CIGBINV_i = CIGBINV + Inv_L * LCIGBINV + Inv_NFIN * NCIGBINV + Inv_LNFIN * PCIGBINV;
+ EIGBINV_i = EIGBINV + Inv_L * LEIGBINV + Inv_NFIN * NEIGBINV + Inv_LNFIN * PEIGBINV;
+ NIGBINV_i = NIGBINV + Inv_L * LNIGBINV + Inv_NFIN * NNIGBINV + Inv_LNFIN * PNIGBINV;
+ AIGBACC_i = AIGBACC + Inv_L * LAIGBACC + Inv_NFIN * NAIGBACC + Inv_LNFIN * PAIGBACC;
+ AIGBACC1_i = AIGBACC1 + Inv_L * LAIGBACC1 + Inv_NFIN * NAIGBACC1 + Inv_LNFIN * PAIGBACC1;
+ BIGBACC_i = BIGBACC + Inv_L * LBIGBACC + Inv_NFIN * NBIGBACC + Inv_LNFIN * PBIGBACC;
+ CIGBACC_i = CIGBACC + Inv_L * LCIGBACC + Inv_NFIN * NCIGBACC + Inv_LNFIN * PCIGBACC;
+ NIGBACC_i = NIGBACC + Inv_L * LNIGBACC + Inv_NFIN * NNIGBACC + Inv_LNFIN * PNIGBACC;
+ AIGC_i = AIGC + Inv_L * LAIGC + Inv_NFIN * NAIGC + Inv_LNFIN * PAIGC;
+ AIGC1_i = AIGC1 + Inv_L * LAIGC1 + Inv_NFIN * NAIGC1 + Inv_LNFIN * PAIGC1;
+ BIGC_i = BIGC + Inv_L * LBIGC + Inv_NFIN * NBIGC + Inv_LNFIN * PBIGC;
+ CIGC_i = CIGC + Inv_L * LCIGC + Inv_NFIN * NCIGC + Inv_LNFIN * PCIGC;
+ PIGCD_i = PIGCD + Inv_L * LPIGCD + Inv_NFIN * NPIGCD + Inv_LNFIN * PPIGCD;
+ AIGS_i = AIGS + Inv_L * LAIGS + Inv_NFIN * NAIGS + Inv_LNFIN * PAIGS;
+ AIGS1_i = AIGS1 + Inv_L * LAIGS1 + Inv_NFIN * NAIGS1 + Inv_LNFIN * PAIGS1;
+ BIGS_i = BIGS + Inv_L * LBIGS + Inv_NFIN * NBIGS + Inv_LNFIN * PBIGS;
+ CIGS_i = CIGS + Inv_L * LCIGS + Inv_NFIN * NCIGS + Inv_LNFIN * PCIGS;
+ AIGD_i = AIGD + Inv_L * LAIGD + Inv_NFIN * NAIGD + Inv_LNFIN * PAIGD;
+ AIGD1_i = AIGD1 + Inv_L * LAIGD1 + Inv_NFIN * NAIGD1 + Inv_LNFIN * PAIGD1;
+ BIGD_i = BIGD + Inv_L * LBIGD + Inv_NFIN * NBIGD + Inv_LNFIN * PBIGD;
+ CIGD_i = CIGD + Inv_L * LCIGD + Inv_NFIN * NCIGD + Inv_LNFIN * PCIGD;
+ NTOX_i = NTOX + Inv_L * LNTOX + Inv_NFIN * NNTOX + Inv_LNFIN * PNTOX;
+ POXEDGE_i = POXEDGE + Inv_L * LPOXEDGE + Inv_NFIN * NPOXEDGE + Inv_LNFIN * PPOXEDGE;
+ AGIDL_i = AGIDL + Inv_L * LAGIDL + Inv_NFIN * NAGIDL + Inv_LNFIN * PAGIDL;
+ BGIDL_i = BGIDL + Inv_L * LBGIDL + Inv_NFIN * NBGIDL + Inv_LNFIN * PBGIDL;
+ CGIDL_i = CGIDL + Inv_L * LCGIDL + Inv_NFIN * NCGIDL + Inv_LNFIN * PCGIDL;
+ EGIDL_i = EGIDL + Inv_L * LEGIDL + Inv_NFIN * NEGIDL + Inv_LNFIN * PEGIDL;
+ PGIDL_i = PGIDL + Inv_L * LPGIDL + Inv_NFIN * NPGIDL + Inv_LNFIN * PPGIDL;
+ AGISL_i = AGISL + Inv_L * LAGISL + Inv_NFIN * NAGISL + Inv_LNFIN * PAGISL;
+ BGISL_i = BGISL + Inv_L * LBGISL + Inv_NFIN * NBGISL + Inv_LNFIN * PBGISL;
+ CGISL_i = CGISL + Inv_L * LCGISL + Inv_NFIN * NCGISL + Inv_LNFIN * PCGISL;
+ EGISL_i = EGISL + Inv_L * LEGISL + Inv_NFIN * NEGISL + Inv_LNFIN * PEGISL;
+ PGISL_i = PGISL + Inv_L * LPGISL + Inv_NFIN * NPGISL + Inv_LNFIN * PPGISL;
+ ALPHA0_i = ALPHA0 + Inv_L * LALPHA0 + Inv_NFIN * NALPHA0 + Inv_LNFIN * PALPHA0;
+ ALPHA1_i = ALPHA1 + Inv_L * LALPHA1 + Inv_NFIN * NALPHA1 + Inv_LNFIN * PALPHA1;
+ ALPHAII0_i = ALPHAII0 + Inv_L * LALPHAII0 + Inv_NFIN * NALPHAII0 + Inv_LNFIN * PALPHAII0;
+ ALPHAII1_i = ALPHAII1 + Inv_L * LALPHAII1 + Inv_NFIN * NALPHAII1 + Inv_LNFIN * PALPHAII1;
+ BETA0_i = BETA0 + Inv_L * LBETA0 + Inv_NFIN * NBETA0 + Inv_LNFIN * PBETA0;
+ BETAII0_i = BETAII0 + Inv_L * LBETAII0 + Inv_NFIN * NBETAII0 + Inv_LNFIN * PBETAII0;
+ BETAII1_i = BETAII1 + Inv_L * LBETAII1 + Inv_NFIN * NBETAII1 + Inv_LNFIN * PBETAII1;
+ BETAII2_i = BETAII2 + Inv_L * LBETAII2 + Inv_NFIN * NBETAII2 + Inv_LNFIN * PBETAII2;
+ ESATII_i = ESATII + Inv_L * LESATII + Inv_NFIN * NESATII + Inv_LNFIN * PESATII;
+ LII_i = LII + Inv_L * LLII + Inv_NFIN * NLII + Inv_LNFIN * PLII;
+ SII0_i = SII0 + Inv_L * LSII0 + Inv_NFIN * NSII0 + Inv_LNFIN * PSII0;
+ SII1_i = SII1 + Inv_L * LSII1 + Inv_NFIN * NSII1 + Inv_LNFIN * PSII1;
+ SII2_i = SII2 + Inv_L * LSII2 + Inv_NFIN * NSII2 + Inv_LNFIN * PSII2;
+ SIID_i = SIID + Inv_L * LSIID + Inv_NFIN * NSIID + Inv_LNFIN * PSIID;
+ TII_i = TII + Inv_L * LTII + Inv_NFIN * NTII + Inv_LNFIN * PTII;
+ CFS_i = CFS + Inv_L * LCFS + Inv_NFIN * NCFS + Inv_LNFIN * PCFS;
+ CFD_i = CFD + Inv_L * LCFD + Inv_NFIN * NCFD + Inv_LNFIN * PCFD;
+ COVS_i = COVS + Inv_L * LCOVS + Inv_NFIN * NCOVS + Inv_LNFIN * PCOVS;
+ COVD_i = COVD + Inv_L * LCOVD + Inv_NFIN * NCOVD + Inv_LNFIN * PCOVD;
+ CGSL_i = CGSL + Inv_L * LCGSL + Inv_NFIN * NCGSL + Inv_LNFIN * PCGSL;
+ CGDL_i = CGDL + Inv_L * LCGDL + Inv_NFIN * NCGDL + Inv_LNFIN * PCGDL;
+ CGBL_i = CGBL + Inv_L * LCGBL + Inv_NFIN * NCGBL + Inv_LNFIN * PCGBL;
+ CKAPPAS_i = CKAPPAS + Inv_L * LCKAPPAS + Inv_NFIN * NCKAPPAS + Inv_LNFIN * PCKAPPAS;
+ CKAPPAD_i = CKAPPAD + Inv_L * LCKAPPAD + Inv_NFIN * NCKAPPAD + Inv_LNFIN * PCKAPPAD;
+ CKAPPAB_i = CKAPPAB + Inv_L * LCKAPPAB + Inv_NFIN * NCKAPPAB + Inv_LNFIN * PCKAPPAB;
+ NTGEN_i = NTGEN + Inv_L * LNTGEN + Inv_NFIN * NNTGEN + Inv_LNFIN * PNTGEN;
+ AIGEN_i = AIGEN + Inv_L * LAIGEN + Inv_NFIN * NAIGEN + Inv_LNFIN * PAIGEN;
+ BIGEN_i = BIGEN + Inv_L * LBIGEN + Inv_NFIN * NBIGEN + Inv_LNFIN * PBIGEN;
+
+ if (ASYMMOD != 0) begin
+ CDSCDR_i = CDSCDR + Inv_L * LCDSCDR + Inv_NFIN * NCDSCDR + Inv_LNFIN * PCDSCDR;
+ CITR_i = CITR + Inv_L * LCITR + Inv_NFIN * NCITR + Inv_LNFIN * PCITR;
+ ETA0R_i = ETA0R + Inv_L * LETA0R + Inv_NFIN * NETA0R + Inv_LNFIN * PETA0R;
+ VSAT1R_i = VSAT1R + Inv_L * LVSAT1R + Inv_NFIN * NVSAT1R + Inv_LNFIN * PVSAT1R;
+ MEXPR_i = MEXPR + Inv_L * LMEXPR + Inv_NFIN * NMEXPR + Inv_LNFIN * PMEXPR;
+ PTWGR_i = PTWGR + Inv_L * LPTWGR + Inv_NFIN * NPTWGR + Inv_LNFIN * PPTWGR;
+ PDIBL1R_i = PDIBL1R + Inv_L * LPDIBL1R + Inv_NFIN * NPDIBL1R + Inv_LNFIN * PPDIBL1R;
+ PDIBL2R_i = PDIBL2R + Inv_L * LPDIBL2R + Inv_NFIN * NPDIBL2R + Inv_LNFIN * PPDIBL2R;
+ PCLMR_i = PCLMR + Inv_L * LPCLMR + Inv_NFIN * NPCLMR + Inv_LNFIN * PPCLMR;
+ DVTSHIFTR_i = DVTSHIFTR + Inv_L * LDVTSHIFTR + Inv_NFIN * NDVTSHIFTR + Inv_LNFIN * PDVTSHIFTR;
+ VSATR_i = VSATR + Inv_L * LVSATR + Inv_NFIN * NVSATR + Inv_LNFIN * PVSATR;
+ KSATIVR_i = KSATIVR + Inv_L * LKSATIVR + Inv_NFIN * NKSATIVR + Inv_LNFIN * PKSATIVR;
+ U0R_i = U0R + Inv_L * LU0R + Inv_NFIN * NU0R + Inv_LNFIN * PU0R;
+ UAR_i = UAR + Inv_L * LUAR + Inv_NFIN * NUAR + Inv_LNFIN * PUAR;
+ UPR_i = UPR + Inv_L * LUPR + Inv_NFIN * NUPR + Inv_LNFIN * PUPR;
+ if (BULKMOD != 0) begin
+ UCR_i = UCR + Inv_L * LUCR + Inv_NFIN * NUCR + Inv_LNFIN * PUCR;
+ end
+ EUR_i = EUR + Inv_L * LEUR + Inv_NFIN * NEUR + Inv_LNFIN * PEUR;
+ UDR_i = UDR + Inv_L * LUDR + Inv_NFIN * NUDR + Inv_LNFIN * PUDR;
+ end
+
+ `ifdef __NQSMOD1__
+ if (NQSMOD == 1 && XRCRG1 != 0.0) begin
+ XRCRG1_i = XRCRG1 + Inv_L * LXRCRG1 + Inv_NFIN * NXRCRG1 + Inv_LNFIN * PXRCRG1;
+ XRCRG2_i = XRCRG2 + Inv_L * LXRCRG2 + Inv_NFIN * NXRCRG2 + Inv_LNFIN * PXRCRG2;
+ end else begin
+ XRCRG1_i = 0.0;
+ XRCRG2_i = 0.0;
+ end
+ `else
+ if (NQSMOD == 1) begin
+ $strobe(" Although the model selector NQSMOD is set to 1, the NQS gate resistance model is not activated in the Verilog-A code. Please uncomment \"`define __NQSMOD1__\" in bsimcmg.va to activate it.");
+ end
+ `endif
+
+ `ifdef __NQSMOD2__
+ if (NQSMOD == 2 && XRCRG1 != 0.0) begin
+ XRCRG1_i = XRCRG1 + Inv_L * LXRCRG1 + Inv_NFIN * NXRCRG1 + Inv_LNFIN * PXRCRG1;
+ XRCRG2_i = XRCRG2 + Inv_L * LXRCRG2 + Inv_NFIN * NXRCRG2 + Inv_LNFIN * PXRCRG2;
+ end else begin
+ XRCRG1_i = 0.0;
+ XRCRG2_i = 0.0;
+ end
+ `else
+ if (NQSMOD == 2) begin
+ $strobe(" Although the model selector NQSMOD is set to 2, the NQS gate resistance model is not activated in the Verilog-A code. Please uncomment \"`define __NQSMOD2__\" in bsimcmg.va to activate it.");
+ end
+ `endif
+
+ UTE_i = UTE + Inv_L * LUTE + Inv_NFIN * NUTE + Inv_LNFIN * PUTE;
+ UTL_i = UTL + Inv_L * LUTL + Inv_NFIN * NUTL + Inv_LNFIN * PUTL;
+ EMOBT_i = EMOBT + Inv_L * LEMOBT + Inv_NFIN * NEMOBT + Inv_LNFIN * PEMOBT;
+ UA1_i = UA1 + Inv_L * LUA1 + Inv_NFIN * NUA1 + Inv_LNFIN * PUA1;
+
+ if (BULKMOD != 0) begin
+ UC1_i = UC1 + Inv_L * LUC1 + Inv_NFIN * NUC1 + Inv_LNFIN * PUC1;
+ end
+ UD1_i = UD1 + Inv_L * LUD1 + Inv_NFIN * NUD1 + Inv_LNFIN * PUD1;
+ UCSTE_i = UCSTE + Inv_L * LUCSTE + Inv_NFIN * NUCSTE + Inv_LNFIN * PUCSTE;
+ PTWGT_i = PTWGT + Inv_L * LPTWGT + Inv_NFIN * NPTWGT + Inv_LNFIN * PPTWGT;
+ AT_i = AT + Inv_L * LAT + Inv_NFIN * NAT + Inv_LNFIN * PAT;
+ ATCV_i = ATCV + Inv_L * LATCV + Inv_NFIN * NATCV + Inv_LNFIN * PATCV;
+ PRT_i = PRT + Inv_L * LPRT + Inv_NFIN * NPRT + Inv_LNFIN * PPRT;
+ KT1_i = KT1 + Inv_L * LKT1 + Inv_NFIN * NKT1 + Inv_LNFIN * PKT1;
+ TSS_i = TSS + Inv_L * LTSS + Inv_NFIN * NTSS + Inv_LNFIN * PTSS;
+ IIT_i = IIT + Inv_L * LIIT + Inv_NFIN * NIIT + Inv_LNFIN * PIIT;
+ TGIDL_i = TGIDL + Inv_L * LTGIDL + Inv_NFIN * NTGIDL + Inv_LNFIN * PTGIDL;
+ IGT_i = IGT + Inv_L * LIGT + Inv_NFIN * NIGT + Inv_LNFIN * PIGT;
+
+ if (ASYMMOD != 0) begin
+ UTER_i = UTER + Inv_L * LUTER + Inv_NFIN * NUTER + Inv_LNFIN * PUTER;
+ UTLR_i = UTLR + Inv_L * LUTLR + Inv_NFIN * NUTLR + Inv_LNFIN * PUTLR;
+ UA1R_i = UA1R + Inv_L * LUA1R + Inv_NFIN * NUA1R + Inv_LNFIN * PUA1R;
+ UD1R_i = UD1R + Inv_L * LUD1R + Inv_NFIN * NUD1R + Inv_LNFIN * PUD1R;
+ ATR_i = ATR + Inv_L * LATR + Inv_NFIN * NATR + Inv_LNFIN * PATR;
+ if (BULKMOD != 0) begin
+ UC1R_i = UC1R + Inv_L * LUC1R + Inv_NFIN * NUC1R + Inv_LNFIN * PUC1R;
+ end
+ end
+
+ // Geometrical Scaling
+ // NFIN Scaling
+ if (PHIGN1 != 0.0) begin
+ PHIG_i = PHIG_i * (1.0 + PHIGN1 / NFIN * lln(1.0 + NFIN / PHIGN2));
+ end
+
+ if (ETA0N1 != 0.0) begin
+ ETA0_i = ETA0_i * (1.0 + ETA0N1 / NFIN * lln(1.0 + NFIN / ETA0N2));
+ end
+
+ if (CDSCN1 != 0.0) begin
+ CDSC_i = CDSC_i * (1.0 + CDSCN1 / NFIN * lln(1.0 + NFIN / CDSCN2));
+ end
+
+ if (CDSCDN1 != 0.0) begin
+ CDSCD_i = CDSCD_i * (1.0 + CDSCDN1 / NFIN * lln(1.0 + NFIN / CDSCDN2));
+ end
+
+ if (CDSCDRN1 != 0.0) begin
+ CDSCDR_i = CDSCDR_i * (1.0 + CDSCDRN1 / NFIN * lln(1.0 + NFIN / CDSCDRN2));
+ end
+
+ if (VSATN1 != 0.0) begin
+ VSAT_i = VSAT_i * (1.0 + VSATN1 / NFIN * lln(1.0 + NFIN / VSATN2));
+ end
+
+ if (VSAT1N1 != 0.0) begin
+ VSAT1_i = VSAT1_i * (1.0 + VSAT1N1 / NFIN * lln(1.0 + NFIN / VSAT1N2));
+ end
+
+ if (VSAT1RN1 != 0.0) begin
+ VSAT1R_i = VSAT1R_i * (1.0 + VSAT1RN1 / NFIN * lln(1.0 + NFIN / VSAT1RN2));
+ end
+
+ if (U0N1 != 0.0) begin
+ U0_i = U0_i * (1.0 + U0N1 / NFIN * lln(1.0 + NFIN / U0N2));
+ end
+
+ if ($param_given(NFINNOM)) begin
+ PHIG_i = PHIG_i * (1.0 + (NFIN - NFINNOM) * PHIGLT * Leff) ;
+ ETA0_i = ETA0_i * (1.0 + (NFIN - NFINNOM) * ETA0LT * Leff);
+ U0_i = U0_i * (1.0 + (NFIN - NFINNOM) * U0LT * Leff);
+ end
+
+ if (U0N1R != 0.0) begin
+ U0R_i = U0R_i * (1.0 + U0N1R / NFIN * lln(1.0 + NFIN / U0N2R));
+ end
+
+ // Length Scaling
+ PHIG_i = PHIG_i + PHIGL * Leff;
+ if (LPA > 0.0) begin
+ U0_i = U0_i * (1.0 - UP_i * pow(Leff, -LPA));
+ end else begin
+ U0_i = U0_i * (1.0 - UP_i);
+ end
+ UA_i = UA_i + AUA * lexp(-Leff / BUA);
+ UD_i = UD_i + AUD * lexp(-Leff / BUD);
+ EU_i = EU_i + AEU * lexp(-Leff / BEU);
+
+ if (ASYMMOD != 0) begin
+ if (LPAR > 0.0) begin
+ U0R_i = U0R_i * (1.0 - UPR_i * pow(Leff, -LPAR));
+ end else begin
+ U0R_i = U0R_i * (1.0 - UPR_i);
+ end
+ UAR_i = UAR_i + AUAR * lexp(-Leff / BUAR);
+ UDR_i = UDR_i + AUDR * lexp(-Leff / BUDR);
+ EUR_i = EUR_i + AEUR * lexp(-Leff / BEUR);
+ end
+
+ if (RDSMOD == 1) begin
+ RSW_i = RSW_i + ARSW * lexp(-Leff / BRSW);
+ RDW_i = RDW_i + ARDW * lexp(-Leff / BRDW);
+ end else begin
+ RDSW_i = RDSW_i + ARDSW * lexp(-Leff / BRDSW);
+ end
+
+ PCLM_i = PCLM_i + APCLM * lexp(-Leff / BPCLM);
+ if (ASYMMOD != 0) begin
+ PCLMR_i = PCLMR_i + APCLMR * pow(Leff, -BPCLMR);
+ end
+
+ MEXP_i = MEXP_i + AMEXP * pow(Leff, -BMEXP);
+ if (ASYMMOD != 0) begin
+ MEXPR_i = MEXPR_i + AMEXPR * pow(Leff, -BMEXPR);
+ end
+
+ PTWG_i = PTWG_i + APTWG * lexp(-Leff / BPTWG);
+ if (ASYMMOD != 0) begin
+ PTWGR_i = PTWGR_i + APTWG * lexp(-Leff / BPTWG);
+ end
+
+ VSAT_i = VSAT_i + AVSAT * lexp(-Leff / BVSAT);
+ VSAT1_i = VSAT1_i + AVSAT1 * lexp(-Leff / BVSAT1);
+ if (ASYMMOD != 0) begin
+ VSAT1R_i = VSAT1R_i + AVSAT1 * lexp(-Leff / BVSAT1);
+ end
+
+ PSAT_i = PSAT_i + APSAT * lexp(-Leff / BPSAT);
+ PSATCV_i = PSATCV_i + APSATCV * lexp(-Leff / BPSATCV);
+ VSATCV_i = VSATCV_i + AVSATCV * lexp(-LeffCV / BVSATCV);
+
+ // Scaling for DITS Parameters
+ DVTP0_i = DVTP0 + ADVTP0 * lexp(-Leff / BDVTP0);
+ DVTP1_i = DVTP1 + ADVTP1 * lexp(-Leff / BDVTP1);
+
+ // Geometrical Scaling for Toxeff / Charge Centroid Tcen
+ if (QMTCENCV_i > 0.0 || QMTCENCVA_i > 0.0) begin
+ MTcen = 1.0 + AQMTCEN * lexp(- (2.0 * Ach / Weff_UFCM) / BQMTCEN);
+ Tcen0 = (2.0 * Ach / Weff_UFCM ) * MTcen;
+ end
+
+ // **************************************
+ // * Parameter Checking *
+ // **************************************
+
+ if (LeffCV <= 1.0e-9) begin
+ $strobe("Warning: LeffCV = %e <= 1.0e-9.", LeffCV);
+ end
+
+ if (BULKMOD != 0) begin
+ if (LeffCV_acc <= 1.0e-9) begin
+ $strobe("Warning: LeffCV_acc = %e <= 1.0e-9.", LeffCV_acc);
+ end
+ end
+
+ if (Weff0 <= 1.0e-9) begin
+ $strobe("Warning: Weff0 = %e <= 1.0e-9.", Weff0);
+ end
+
+ if (WeffCV0 <= 1.0e-9) begin
+ $strobe("Warning: WeffCV0 = %e <= 1.0e-9.", WeffCV0);
+ end
+
+ if (NBODY_i <= 0.0) begin
+ $strobe("Fatal: NBODY_i = %e is not positive.", NBODY_i);
+ $finish(0);
+ end else if (NBODY_i <= 1.0e18) begin
+ $strobe("Warning: NBODY_i = %e m^-3 may be too small.", NBODY_i);
+ end
+
+ if (NGATE_i < 0.0) begin
+ $strobe("Fatal: NGATE_i = %e is negative.", NGATE_i);
+ $finish(0);
+ end else if (NGATE_i != 0.0 && NGATE_i <= 1.0e24) begin
+ $strobe("Warning: NGATE_i = %e may be too small.", NGATE_i);
+ end else if (NGATE_i > 1.0e31) begin
+ $strobe("Fatal: NGATE_i = %e is too high.", NGATE_i);
+ $finish(0);
+ end
+
+ if (DVT0_i < 0.0) begin
+ $strobe("Warning: DVT0_i = %e is negative.", DVT0_i);
+ end
+
+ if (PHIG_i <= 0.0) begin
+ $strobe("Fatal: PHIG_i = %e is not positive.", PHIG_i);
+ $finish(0);
+ end
+
+ if (VSAT_i <= 0.0) begin
+ $strobe("Fatal: VSAT_i = %e is not positive.", VSAT_i);
+ $finish(0);
+ end
+
+ if (VSAT1_i <= 0.0) begin
+ $strobe("Fatal: VSAT1_i = %e is not positive.", VSAT1_i);
+ $finish(0);
+ end
+
+ if (ASYMMOD != 0 && VSAT1R_i <= 0.0) begin
+ $strobe("Fatal: VSAT1R_i = %e is not positive.", VSAT1R_i);
+ $finish(0);
+ end
+
+ if (DVT1_i <= 0.0) begin
+ $strobe("Fatal: DVT1_i = %e is not positive.", DVT1_i);
+ $finish(0);
+ end
+
+ if (DVT1SS_i <= 0.0) begin
+ $strobe("Fatal: DVT1SS_i = %e is not positive.", DVT1SS_i);
+ $finish(0);
+ end
+
+ if (CDSC_i < 0.0) begin
+ $strobe("Warning: CDSC_i = %e is negative.", CDSC_i);
+ end
+
+ if (CDSCD_i < 0.0) begin
+ $strobe("Warning: CDSCD_i = %e is negative.", CDSCD_i);
+ end
+
+ if (ASYMMOD != 0 && CDSCDR_i < 0.0) begin
+ $strobe("Warning: CDSCDR_i = %e is negative.", CDSCDR_i);
+ end
+
+ if (DSUB_i <= 0.0) begin
+ $strobe("Fatal: DSUB_i = %e is not positive.", DSUB_i);
+ $finish(0);
+ end
+
+ if (ETA0_i < 0.0) begin
+ $strobe("Warning: ETA0_i = %e is negative, setting it to 0", ETA0_i);
+ ETA0_i = 0.0;
+ end
+
+ if (ETA0R_i < 0.0) begin
+ $strobe("Warning: ETA0R_i = %e is negative, setting it to 0", ETA0R_i);
+ ETA0R_i = 0.0;
+ end
+
+ if (LPE0_i < -Leff) begin
+ $strobe("Warning: LPE0_i = %e is less than -Leff. Clipping LPE0_i to 0", LPE0_i);
+ LPE0_i = 0.0;
+ end
+
+ if (K0SI_i <= 0.0) begin
+ $strobe("Warning: K0SI_i = %e is not positive, setting it to 0.", K0SI_i);
+ K0SI_i = 0.0;
+ end
+
+ if (K2SI_i <= 0.0) begin
+ $strobe("Warning: K2SI_i = %e is not positive, setting it to 0.", K2SI_i);
+ K2SI_i = 0.0;
+ end
+
+ if (PHIBE_i < 0.2 && BULKMOD != 0) begin
+ $strobe("Warning: PHIBE_i = %e is less than 0.2, setting it to 0.2.", PHIBE_i);
+ PHIBE_i = 0.2;
+ end
+
+ if (PHIBE_i > 1.2 && BULKMOD != 0) begin
+ $strobe("Warning: PHIBE_i = %e is larger than 1.2, setting it to 1.2.", PHIBE_i);
+ PHIBE_i = 1.2;
+ end
+
+ if (PSAT_i < 2.0) begin
+ $strobe("Warning: PSAT_i = %e is less than 2.0, setting it to 2.0.", PSAT_i);
+ PSAT_i = 2.0;
+ end
+
+ if (PSATCV_i < 2.0) begin
+ $strobe("Warning: PSATCV_i = %e is less than 2.0, setting it to 2.0.", PSATCV_i);
+ PSATCV_i = 2.0;
+ end
+
+ if (U0_i < 0.0) begin
+ $strobe("Warning: U0_i = %e is negative, setting it to the default value.", U0_i);
+ U0_i = 0.03;
+ end
+
+ if (UA_i < 0.0) begin
+ $strobe("Warning: UA_i = %e is negative, setting it to 0.", UA_i);
+ UA_i = 0.0;
+ end
+
+ if (EU_i < 0.0) begin
+ $strobe("Warning: EU_i = %e is negative, setting it to 0.", EU_i);
+ EU_i = 0.0;
+ end
+
+ if (UD_i < 0.0) begin
+ $strobe("Warning: UD_i = %e is negative, setting it to 0.", UD_i);
+ UD_i = 0.0;
+ end
+
+ if (UCS_i < 0.0) begin
+ $strobe("Warning: UCS_i = %e is negative, setting it to 0.", UCS_i);
+ UCS_i = 0.0;
+ end
+
+ if (ETAMOB_i < 0.0) begin
+ $strobe("Warning: ETAMOB_i = %e is negative, setting it to 0", ETAMOB_i);
+ ETAMOB_i = 0.0;
+ end
+
+ RDSWMIN_i = RDSWMIN;
+ if (RDSWMIN_i < 0.0) begin
+ $strobe("Warning: RDSWMIN = %e is negative. Set to zero", RDSWMIN_i);
+ RDSWMIN_i = 0.0;
+ end
+
+ if (RDSW_i < 0.0) begin
+ $strobe("Warning: RDSW_i = %e is negative. Set to zero", RDSW_i);
+ RDSW_i = 0.0;
+ end
+
+ RSWMIN_i = RSWMIN;
+ if (RSWMIN_i < 0.0) begin
+ $strobe("Warning: RSWMIN = %e is negative. Set to zero", RSWMIN_i);
+ RSWMIN_i = 0.0;
+ end
+
+ if (RSW_i < 0.0) begin
+ $strobe("Warning: RSW_i = %e is negative. Set to zero", RSW_i);
+ RSW_i = 0.0;
+ end
+
+ RDWMIN_i = RDWMIN;
+ if (RDWMIN_i < 0.0) begin
+ $strobe("Warning: RDWMIN = %e is negative. Set to zero", RDWMIN_i);
+ RDWMIN_i = 0.0;
+ end
+
+ if (RDW_i < 0) begin
+ $strobe("Warning: RDW_i = %e is negative. Set to zero", RDW_i);
+ RDW_i = 0.0;
+ end
+
+ if (PRWGD_i < 0.0) begin
+ $strobe("Warning: PRWGD_i = %e is negative. Set to zero", PRWGD_i);
+ PRWGD_i = 0.0;
+ end
+
+ if (PRWGS_i < 0.0) begin
+ $strobe("Warning: PRWGS_i = %e is negative. Set to zero", PRWGS_i);
+ PRWGS_i = 0.0;
+ end
+
+ if (PCLM_i < 0) begin
+ $strobe("Warning: PCLM_i = %e is negative.", PCLM_i);
+ end
+
+ if (PDIBL1_i < 0.0) begin
+ $strobe("Warning: PDIBL1_i = %e is negative.", PDIBL1_i);
+ end
+
+ if (ASYMMOD != 0) begin
+ if (PDIBL1R_i < 0.0) begin
+ $strobe("Warning: PDIBL1R_i = %e is negative.", PDIBL1R_i);
+ end
+ if (PDIBL2R_i < 0.0) begin
+ $strobe("Warning: PDIBL2R_i = %e is negative.", PDIBL2R_i);
+ end
+ if (U0R_i < 0) begin
+ $strobe("Warning: U0R_i = %e is negative, setting it to 0.", U0R_i);
+ U0R_i = 0.0;
+ end
+ if (UAR_i < 0.0) begin
+ $strobe("Warning: UAR_i = %e is negative, setting it to 0.", UAR_i);
+ UAR_i = 0.0;
+ end
+ if (EUR_i < 0.0) begin
+ $strobe("Warning: EUR_i = %e is negative, setting it to 0.", EUR_i);
+ EUR_i = 0.0;
+ end
+ if (UDR_i < 0.0) begin
+ $strobe("Warning: UDR_i = %e is negative, setting it to 0.", UDR_i);
+ UDR_i = 0.0;
+ end
+ end
+
+ if (PDIBL2_i < 0.0) begin
+ $strobe("Warning: PDIBL2_i = %e is negative.", PDIBL2_i);
+ end
+
+ if (DROUT_i <= 0.0) begin
+ $strobe("Fatal: DROUT_i = %e is non-positive.", DROUT_i);
+ $finish(0);
+ end
+
+ if (MEXP_i < 2.0) begin
+ $strobe("Warning: MEXP_i = %e < 2. Setting MEXP_i = 2.", MEXP_i);
+ MEXP_i = 2.0;
+ end
+
+ if (ASYMMOD != 0) begin
+ if (MEXPR_i < 2.0) begin
+ $strobe("Warning: MEXPR_i = %e < 2. Setting MEXPR_i = 2.", MEXPR_i);
+ MEXPR_i = 2.0;
+ end
+ end
+
+ if (PTWG_i < 0) begin
+ $strobe("Warning: PTWG_i = %e is negative, setting it to 0.", PTWG_i );
+ PTWG_i = 0.0;
+ end
+
+ if (QMTCENCV_i > 0.0) begin
+ if (QM0 <= 0.0) begin
+ $strobe("Fatal: QM0 = %e is non-positive.", QM0);
+ $finish(0);
+ end
+ end
+
+ if (BULKMOD != 0 && QMTCENCVA_i > 0.0) begin
+ if (QM0ACC <= 0.0) begin
+ $strobe("Fatal: QM0ACC = %e is non-positive.", QM0ACC);
+ $finish(0);
+ end
+ end
+
+ if (CGIDL_i < 0.0) begin
+ $strobe("Warning: CGIDL_i = %e < 0. Setting CGIDL_i = 0.", CGIDL_i);
+ CGIDL_i = 0.0;
+ end
+
+ if (CGISL_i < 0.0) begin
+ $strobe("Warning: CGISL_i = %e < 0. Setting CGISL_i = 0.", CGISL_i);
+ CGISL_i = 0.0;
+ end
+
+ if (IGBMOD != 0) begin
+ if (NIGBINV_i <= 0.0) begin
+ $strobe("Fatal: NIGBINV_i = %e is non-positive.", NIGBINV_i);
+ $finish(0);
+ end
+ if (NIGBACC_i <= 0.0) begin
+ $strobe("Fatal: NIGBACC_i = %e is non-positive.", NIGBACC_i);
+ $finish(0);
+ end
+ end
+
+ if (IGCMOD != 0) begin
+ if (POXEDGE_i <= 0.0) begin
+ $strobe("Fatal: POXEDGE_i = %e is non-positive.", POXEDGE_i);
+ $finish(0);
+ end
+ if (PIGCD_i <= 0.0) begin
+ $strobe("Fatal: PIGCD_i = %e is non-positive.", PIGCD_i);
+ $finish(0);
+ end
+ end
+
+ if (IGCMOD != 0 || IGBMOD != 0) begin
+ if (TOXREF <= 0) begin
+ $strobe("Fatal: TOXREF = %e is non-positive.", TOXREF);
+ $finish(0);
+ end
+ end
+
+ if (LINTIGEN >= (Leff / 2.0)) begin
+ $strobe("Warning: LINTIGEN = %e is too large - Leff for r/g current is negative. Re-setting LINTIGEN = 0.", LINTIGEN);
+ LINTIGEN_i = 0.0;
+ end else begin
+ LINTIGEN_i = LINTIGEN;
+ end
+
+ if (NTGEN_i <= 0.0) begin
+ $strobe("Fatal: NTGEN_i = %e is non-positive.", NTGEN_i);
+ $finish(0);
+ end
+
+ `ifdef __NQSMOD1__
+ if (NQSMOD == 1 && XRCRG1_i != 0.0 && XRCRG1_i < 1.0e-3) begin
+ $strobe("Warning: XRCRG1_i = %e. Gate resistance may be too large. Disabling NQS Gate Resistance.", XRCRG1_i);
+ XRCRG1_i = 0.0;
+ end
+ `endif
+
+ if (IIMOD == 2) begin
+ if (BETAII0_i < 0.0) begin
+ $strobe("Warning: BETAII0_i = %e is negative.",BETAII0_i);
+ end
+ if (BETAII1_i < 0.0) begin
+ $strobe("Warning: BETAII1_i = %e is negative.", BETAII1_i);
+ end
+ if (BETAII2_i < 0.0) begin
+ $strobe("Warning: BETAII2_i = %e is negative.", BETAII2_i);
+ end
+ if (ESATII_i < 0.0) begin
+ $strobe("Warning: ESATII_i = %e is negative.", ESATII_i);
+ end
+ if (LII_i < 0.0) begin
+ $strobe("Warning: LII_i = %e is negative.", LII_i);
+ end
+ if (SII1_i < 0.0) begin
+ $strobe("Warning: SII1_i = %e is negative.", SII1);
+ end
+ if (SII2_i < 0.0) begin
+ $strobe("Warning: SII2_i = %e is negative.", SII2_i);
+ end
+ if (SIID_i < 0.0) begin
+ $strobe("Warning: SIID_i = %e is negative.", SIID_i);
+ end
+ end
+
+ if (EF <= 0.0) begin
+ $strobe("Fatal: EF = %e is non-positive.", EF);
+ $finish(0);
+ end else if (EF > 2.0) begin
+ $strobe("Fatal: EF = %e > 2.0.", EF);
+ $finish(0);
+ end
+
+ if (LINTNOI >= (Leff / 2.0)) begin
+ $strobe("Warning: LINTNOI = %e is too large - Leff for noise is negative. Re-setting LINTNOI = 0.", LINTNOI);
+ LINTNOI_i = 0.0;
+ end else begin
+ LINTNOI_i = LINTNOI;
+ end
+
+ if (NTNOI < 0) begin
+ $strobe("Warning: NTNOI = %e is negative. Set to zero.", NTNOI);
+ NTNOI_i = 0.0;
+ end else begin
+ NTNOI_i = NTNOI;
+ end
+
+ // Self-Heating
+ `ifdef __SHMOD__
+ if (SHMOD != 0 && RTH0 > 0.0) begin
+ T1 = WTH0;
+ if (BSHEXP != 0.0) begin
+ T1 = WTH0 * pow(NF, BSHEXP);
+ end
+ T2 = FPITCH;
+ if (ASHEXP != 0.0) begin
+ T2 = FPITCH * pow(NFINtotal, ASHEXP);
+ end
+ gth = (T1 + T2)/ RTH0;
+ cth = CTH0 * (T1 + T2);
+ end else begin
+ gth = 1.0;
+ cth = 0.0;
+ end
+ `else
+ if (SHMOD != 0) begin
+ $strobe("Although the model selector SHMOD is set to 1, the self heating model is not activated in the Verilog-A code. Please uncomment \"`define __SHMOD__\" in bsimcmg.va to activate it.");
+ end
+ `endif
+
+ // Gate Electrode Resistance
+ `ifdef __RGATEMOD__
+ if (RGATEMOD != 0) begin
+ Rgeltd = (RGEXT / NGCON + (RGFIN * NFIN) / (NGCON == 2 ? 12.0 : 3.0)) / NF;
+ ggeltd = 1.0 / max(1.0e-3, Rgeltd);
+ end
+ `else
+ if (RGATEMOD != 0)
+ $strobe("Although the model selector RGATEMOD is set to 1, the gate electrode resistance model is not activated in the Verilog-A code. Please uncomment \"`define __RGATEMOD__\" in bsimcmg.va to activate it.");
+ `endif
+
+ // Geometry-Dependent Source/Drain Resistance
+ if (RGEOMOD == 0) begin
+ RSourceGeo = RSHS * NRS;
+ RDrainGeo = RSHD * NRD;
+ end else begin
+ // Area and perimeter calculation
+ if (HEPI > 0.0) begin
+ Arsd = FPITCH * HFIN + (TFIN + (FPITCH - TFIN) * CRATIO) * HEPI;
+ end else begin
+ Arsd = FPITCH * max(1.0e-9, HFIN + HEPI);
+ end
+ Prsd = FPITCH + DELTAPRSD;
+
+ // Resistivity Calculation
+ if ($param_given(RHORSD)) begin
+ rhorsd = RHORSD;
+ end else begin
+ mu_max = (TYPE == `ntype) ? 1417.0 : 470.5;
+ if (TYPE == `ntype) begin
+ mu_rsd = (52.2 + (mu_max - 52.2) / (1.0 + pow(NSD / 9.68e22, 0.680)) - 43.4 / (1.0 + pow(3.43e26 / NSD, 2.0))) * 1.0e-4;
+ end else begin
+ mu_rsd = (44.9 + (mu_max - 44.9) / (1.0 + pow(NSD / 2.23e22, 0.719)) - 29.0 / (1.0 + pow(6.10e26 / NSD, 2.0))) * 1.0e-4;
+ end
+ rhorsd = 1.0 / (`q * NSD * mu_rsd);
+ end
+
+ // Component: Spreading Resistance (extension -> hdd)
+ thetarsp = 55.0 * `M_PI / 180.0;
+ afin = min(Arsd, max(1.0e-18, TFIN * (HFIN + min(0.0, HEPI))));
+ T1 = `COT(thetarsp);
+ Rsp = rhorsd * T1 / (sqrt(`M_PI) * NFIN) * (1.0 / sqrt(afin) - 2.0 / sqrt(Arsd) + sqrt(afin / (Arsd*Arsd)));
+
+ // Component: Contact Resistance
+ arsd_total = Arsd * NFIN + ARSDEND;
+ prsd_total = Prsd * NFIN + PRSDEND;
+ lt = sqrt(RHOC * arsd_total / (rhorsd * prsd_total));
+ alpha = LRSD / lt;
+ T0 = lexp(alpha + alpha);
+
+ if (SDTERM == 1.0) begin
+ eta = rhorsd * lt / RHOC;
+ T1 = T0 * (1.0 + eta);
+ T2 = T1 + 1.0 - eta;
+ T3 = T1 - 1.0 + eta;
+ end else begin
+ T2 = T0 + 1.0;
+ T3 = T0 - 1.0;
+ end
+ RrsdTML = rhorsd * lt * T2 / (arsd_total * T3);
+
+ if (HEPI < -1.0e-10) begin
+ Rrsdside = RHOC / (-HEPI * TFIN * NFIN);
+ Rrsd = (RrsdTML + Rsp) * Rrsdside / ((RrsdTML + Rsp) + Rrsdside);
+ end else begin
+ Rrsd = RrsdTML + Rsp;
+ end
+
+ Rdsgeo = Rrsd / NF * max(0.0, RGEOA + RGEOB * TFIN + RGEOC * FPITCH + RGEOD * LRSD + RGEOE * HEPI);
+ RSourceGeo = Rdsgeo;
+ RDrainGeo = Rdsgeo;
+ end
+
+ // Clamping of Source/Drain Resistances
+ if (RSourceGeo <= 1.0e-3) begin
+ RSourceGeo = 1.0e-3;
+ end
+
+ if (RDrainGeo <= 1.0e-3) begin
+ RDrainGeo = 1.0e-3;
+ end
+
+ if (RDSMOD == 1) begin
+ if (RSWMIN_i <= 0.0) begin
+ RSWMIN_i = 0.0;
+ end
+ if (RDWMIN_i <= 0.0) begin
+ RDWMIN_i = 0.0;
+ end
+ if (RSW_i <= 0.0) begin
+ RSW_i = 0.0;
+ end
+ if (RDW_i <= 0.0) begin
+ RDW_i = 0.0;
+ end
+ end else begin
+ if (RDSWMIN_i <= 0.0) begin
+ RDSWMIN_i = 0.0;
+ end
+ if (RDSW_i <= 0.0) begin
+ RDSW_i = 0.0;
+ end
+ end // End of Clamping of Source/Drain Resistances
+
+ if (CGEOMOD != 1) begin
+ if ($param_given(CGSO)) begin
+ CGSO_i = CGSO;
+ end else begin
+ if ($param_given(DLC) && DLC > 0.0) begin
+ CGSO_i = max(0.0, DLC * cox - CGSL_i);
+ end else begin
+ CGSO_i = 0.3 * TFIN * cox;
+ end
+ end
+ if ($param_given(CGDO)) begin
+ CGDO_i = CGDO;
+ end else begin
+ if ($param_given(DLC) && DLC > 0.0) begin
+ CGDO_i = max(0.0, DLC * cox - CGDL_i);
+ end else begin
+ CGDO_i = 0.3 * TFIN * cox;
+ end
+ end
+ end
+
+ // Parasitic Source/Drain to Gate Fringe Capacitance Model
+ if (CGEOMOD == 2) begin
+ Hg = TGATE + TMASK;
+ Trsd = 0.5 * (FPITCH - TFIN);
+ Wg = max(0.0, Trsd - TOXP);
+ Hrsd = max(0.0, HEPI + TSILI);
+
+ // Top Component
+ if (TMASK > 0.0) begin
+ // Capacitance Model by Chung-Hsun Lin (IBM)
+ T0 = 3.467e-11 * lln(1.0e-7 * EPSRSP / (3.9 * LSP));
+ T1 = 0.942 * Hrsd * epssp / LSP;
+ Cgg_top = (T0 + T1) * (TFIN + (FPITCH - TFIN) * CRATIO);
+ end else begin
+ `Cfringe_2d(cfr_top_trigate, Hg, Hrsd, LSP, TFIN, LRSD, Lg, TOXP, 0.85, Cgg_top)
+ end
+
+ // Side Component
+ if (TMASK > 0) begin
+ `Cfringe_2d(cfr_side_dblgate, Wg, Trsd, LSP, HFIN, LRSD, Lg, TOXP, 0.70, Cgg_side)
+ end else begin
+ `Cfringe_2d(cfr_side_trigate, Wg, Trsd, LSP, HFIN, LRSD, Lg, TOXP, 0.85, Cgg_side)
+ end
+
+ // Corner Component
+ if (TMASK > 0.0) begin
+ Acorner = 0.0;
+ end else begin
+ if (HEPI > 0.0) begin
+ Acorner = (FPITCH - TFIN) * (HEPI * CRATIO + TSILI);
+ end else begin
+ Acorner = (FPITCH - TFIN) * Hrsd;
+ end
+ end
+ Ccorner = (NFIN * Acorner + ARSDEND + ASILIEND) * epssp / LSP;
+ Cfr_geo = (Ccorner + Cgg_top * NFIN + CGEOE * Cgg_side * NFIN * 2.0) * NF;
+ Cfr_geo = Cfr_geo * max(0.0, CGEOA + CGEOB * TFIN + CGEOC * FPITCH + CGEOD * LRSD);
+ end
+
+ // Source/Gate/Drain-to-Substrate Parasitic Capacitances
+ T0 = CSDESW * lln(1.0 + HFIN / EOTBOX);
+ csbox = cbox * ASEO + T0 * max(0.0, PSEO - FPITCH * NFINtotal);
+ cdbox = cbox * ADEO + T0 * max(0.0, PDEO - FPITCH * NFINtotal);
+ cgbox = (CGBO * NF * NGCON + CGBN * NFINtotal) * Lg;
+
+ // Mobility Degradation
+ EeffFactor = 1.0e-8 / (epsratio * (EOT));
+ WeffWRFactor = 1.0 / (pow((Weff0) * 1.0e6, WR_i) * NFINtotal);
+ litl = sqrt(epsratio * EOT * 0.5 * TFIN);
+
+ if (!$param_given(THETASCE)) begin
+ tmp = DVT1_i * Leff / scl + 1.0e-6;
+ if (tmp < 40.0) begin
+ Theta_SCE = 0.5 / (cosh(tmp) - 1.0);
+ end else begin
+ Theta_SCE = exp(-tmp);
+ end
+ end else begin
+ Theta_SCE = THETASCE;
+ end
+
+ if (!$param_given(THETASW)) begin
+ tmp = DVT1SS_i * Leff / scl + 1.0e-6;
+ if (tmp < 40.0) begin
+ Theta_SW = 0.5 / (cosh(tmp) - 1.0);
+ end else begin
+ Theta_SW = exp(-tmp);
+ end
+ end else begin
+ Theta_SW = THETASW;
+ end
+
+ if (!$param_given(THETADIBL)) begin
+ tmp = DSUB_i * Leff / scl + 1.0e-6;
+ if (tmp < 40.0) begin
+ Theta_DIBL = 0.5 / (cosh(tmp) - 1.0);
+ end else begin
+ Theta_DIBL = exp(-tmp);
+ end
+ end else begin
+ Theta_DIBL = THETADIBL;
+ end
+
+ Theta_RSCE = sqrt(1.0 + LPE0_i / Leff) - 1.0;
+
+ tmp = DSUB_i * Leff / scl + 1.0e-6;
+ if (tmp < 40.0) begin
+ T0 = 1.0 / max((1.0 + DVTP2 * (cosh(tmp) - 2.0)), 1.0e-6);
+ end else begin
+ T0 = exp(-tmp) / max((exp(-tmp) + DVTP2), 1.0e-6);
+ end
+
+ Theta_DITS = T0;
+ nbody = NBODY_i;
+ qbs = `q * nbody * Ach / Cins;
+
+ // Gate Current
+ if (TYPE == `ntype) begin
+ Aechvb = 4.97232e-7; // NMOS
+ Bechvb = 7.45669e11; // NMOS
+ end else begin
+ Aechvb = 3.42537e-7; // PMOS
+ Bechvb = 1.16645e12; // PMOS
+ end
+
+ T0 = TOXG * TOXG;
+ T1 = TOXG * POXEDGE_i;
+ T2 = T1 * T1;
+ Toxratio = lexp(NTOX_i * lln(TOXREF / TOXG)) / T0;
+ Toxratioedge = lexp(NTOX_i * lln(TOXREF / T1)) / T2;
+ igsd_mult0 = Weff0 * Aechvb * Toxratioedge;
+
+ if (TNOM < -`P_CELSIUS0) begin
+ $strobe("Warning: (TNOM=%e) < -`P_CELSIUS0. Set to 27 C.", TNOM);
+ Tnom = `REFTEMP;
+ end else begin
+ Tnom = TNOM + `CONSTCtoK;
+ end
+ end // initial_step
+
+ // ************************************************
+ // * Temperature Dependence Calculations *
+ // ************************************************
+ `ifdef __SHMOD__
+ if (SHMOD != 0 && RTH0 > 0.0) begin
+ DevTemp = $temperature + Temp(rth_branch) + DTEMP;
+ end else begin
+ `endif
+ DevTemp = $temperature + DTEMP;
+ `ifdef __SHMOD__
+ end
+ `endif
+
+ begin : CMGTempDepCalc
+ TRatio = DevTemp / Tnom;
+ delTemp = DevTemp - Tnom;
+ Vtm = `KboQ * DevTemp;
+ Vtm0 = `KboQ * Tnom;
+ Eg = BG0SUB - TBGASUB * DevTemp * DevTemp / (DevTemp + TBGBSUB);
+ Eg0 = BG0SUB - TBGASUB * Tnom * Tnom / (Tnom + TBGBSUB);
+ T1 = (DevTemp / 300.15) * sqrt(DevTemp / 300.15);
+ ni = NI0SUB * T1 * lexp(BG0SUB / (2.0 * `KboQ * 300.15) - Eg / (2.0 * Vtm));
+ Nc = NC0SUB * T1;
+ ThetaSS = hypsmooth(1.0 + TSS_i * delTemp - 1.0e-6, 1.0e-3);
+
+ // Quantum Mechanical Vth Correction (Ref: Trivedi et al., EDL 2005)
+ kT = Vtm * `q;
+ T0 = `HBAR * `M_PI / (2*Ach/Weff_UFCM );
+ E0 = T0 * T0 / (2.0 * mx);
+ E0prime = T0 * T0 / (2.0 * mxprime);
+ E1 = 4.0 * E0;
+ E1prime = 4.0 * E0prime;
+ T1 = gprime * mdprime / (gfactor * md);
+ gam0 = 1.0 + T1 * lexp((E0 - E0prime) / kT);
+ gam1 = gam0 + lexp((E0 - E1) / kT) + T1 * lexp((E0 - E1prime) / kT);
+ T2 = -Vtm * lln(gfactor * md / (`M_PI * `HBAR * `HBAR * Nc) * kT / (2.0 * Ach / Weff_UFCM) * gam1);
+ dvch_qm = QMFACTOR_i * (E0 / `q + T2);
+
+ // Temperature Dependence
+ ETA0_t = Tempdep(ETA0_i, TETA0, delTemp, TEMPMOD);
+ ETA0R_t = Tempdep(ETA0R_i, TETA0R, delTemp, TEMPMOD);
+ T1 = U0_i * pow(TRatio, UTE_i);
+ U0_t = T1 + hypmax(UTL_i * delTemp, -0.9 * T1, 1.0e-4);
+ u0 = U0_t;
+ if (ASYMMOD == 1) begin
+ T1 = U0R_i * pow(TRatio, UTER_i);
+ U0R_t = T1 + hypmax(UTLR_i * delTemp, -0.9 * T1, 1.0e-4);
+ u0r = U0R_t;
+ end
+
+ ETAMOB_t = Tempdep(ETAMOB_i, EMOBT_i, delTemp, TEMPMOD);
+ UA_t = UA_i + hypmax(UA1_i*delTemp, -UA_i, 1.0e-6);
+ if (ASYMMOD != 0) begin
+ UAR_t = UAR_i + hypmax(UA1R_i * delTemp, -UAR_i, 1.0e-6);
+ end
+
+ if (BULKMOD != 0) begin
+ if (TEMPMOD == 0) begin
+ UC_t = Tempdep(UC_i, UC1_i, delTemp, 0);
+ if (ASYMMOD != 0) begin
+ UCR_t = Tempdep(UCR_i, UC1R_i, delTemp, 0);
+ end
+ end else begin
+ UC_t = UC_i + UC1_i * delTemp;
+ if (ASYMMOD != 0) begin
+ UCR_t = UCR_i + UC1R_i * delTemp;
+ end
+ end
+ end
+
+ UD_t = UD_i * pow(TRatio, UD1_i);
+ if (ASYMMOD != 0) begin
+ UDR_t = UDR_i * pow(TRatio, UD1R_i);
+ end
+
+ UCS_t = UCS_i * pow(TRatio, UCSTE_i);
+
+ rdstemp = hypsmooth(1.0 + PRT_i * delTemp - 1.0e-6, 1.0e-3);
+ RSDR_t = Tempdep(RSDR, TRSDR, delTemp, TEMPMOD);
+ if (ASYMMOD != 0) begin
+ RSDRR_t = Tempdep(RSDRR, TRSDR, delTemp, TEMPMOD);
+ end
+
+ RDDR_t = Tempdep(RDDR, TRDDR, delTemp, TEMPMOD);
+ if (ASYMMOD != 0) begin
+ RDDRR_t = Tempdep(RDDRR, TRDDR, delTemp, TEMPMOD);
+ end
+
+ VSAT_t = Tempdep(VSAT_i, -AT_i, delTemp, TEMPMOD);
+ if (VSAT_t < 1000) begin
+ $strobe("Warning: VSAT(%f) = %e is less than 1K, setting it to 1K.", DevTemp, VSAT_t);
+ VSAT_t = 1000;
+ end
+
+ if (ASYMMOD != 0) begin
+ VSATR_t = Tempdep(VSATR_i, -ATR_i, delTemp, TEMPMOD);
+ if (VSATR_t < 1000) begin
+ $strobe("Warning: VSATR(%f) = %e is less than 1K, setting it to 1K.", DevTemp, VSATR_t);
+ VSATR_t = 1000;
+ end
+ end
+
+ VSAT1_t = Tempdep(VSAT1_i, -AT_i, delTemp, TEMPMOD);
+ if (VSAT1_t < 1000) begin
+ $strobe("Warning: VSAT1(%f) = %e is less than 1K, setting it to 1K.", DevTemp, VSAT1_t);
+ VSAT1_t = 1000;
+ end
+
+ if (ASYMMOD != 0) begin
+ VSAT1R_t = Tempdep(VSAT1R_i, -AT_i, delTemp, TEMPMOD);
+ if (VSAT1R_t < 1000) begin
+ $strobe("Warning: VSAT1R(%f) = %e is less than 1K, setting it to 1K.", DevTemp, VSAT1R_t);
+ VSAT1R_t = 1000;
+ end
+ end
+
+ VSATCV_t = Tempdep(VSATCV_i, -ATCV_i, delTemp, TEMPMOD);
+ if (VSATCV_t < 1000) begin
+ $strobe("Warning: VSATCV(%f) = %e is less than 1K, setting it to 1K.", DevTemp, VSATCV_t);
+ VSATCV_t = 1000;
+ end
+
+ MEXP_t = hypsmooth(MEXP_i * (1.0 + TMEXP * delTemp) - 2.0, 1.0e-3) + 2.0;
+ if (ASYMMOD != 0) begin
+ MEXPR_t = hypsmooth(MEXPR_i * (1.0 + TMEXPR * delTemp) - 2.0, 1.0e-3) + 2.0;
+ end
+
+ PTWG_t = Tempdep(PTWG_i, -PTWGT_i, delTemp, TEMPMOD);
+ if (ASYMMOD != 0) begin
+ PTWGR_t = Tempdep(PTWGR_i, -PTWGT_i, delTemp, TEMPMOD);
+ end
+
+ dvth_temp = (KT1_i + KT1L / Leff) * (TRatio - 1.0);
+ BETA0_t = BETA0_i * pow(TRatio, IIT_i);
+ SII0_t = SII0_i * (hypsmooth(1.0 + TII_i * (TRatio - 1.0) - 0.01, 1.0e-3) + 0.01);
+
+ K0_t = K0_i + K01_i * delTemp;
+ K0SI_t = K0SI_i + hypmax(K0SI1_i * delTemp, -K0SI_i, 1.0e-6);
+ K2SI_t = K2SI_i + hypmax(K2SI1_i * delTemp, -K2SI_i, 1.0e-6);
+ K1_t = K1_i + hypmax(K11_i * delTemp, -K1_i, 1.0e-6);
+ K2SAT_t = K2SAT_i + K2SAT1_i * delTemp;
+ A1_t = A1_i + A11_i * delTemp;
+ A2_t = A2_i + A21_i * delTemp;
+ K2_t = K2_i + hypmax(K21_i * delTemp, -K2_i, 1.0e-6);
+ K0SISAT_t = K0SISAT_i + K0SISAT1_i * delTemp;
+ K2SISAT_t = K2SISAT_i + K2SISAT1_i * delTemp;
+ AIGBINV_t = AIGBINV_i + hypmax(AIGBINV1_i * delTemp, -AIGBINV_i, 1.0e-6);
+ AIGBACC_t = AIGBACC_i + hypmax(AIGBACC1_i * delTemp, -AIGBACC_i, 1.0e-6);
+ AIGC_t = AIGC_i + hypmax(AIGC1_i * delTemp, -AIGC_i, 1.0e-6);
+ AIGS_t = AIGS_i + hypmax(AIGS1_i * delTemp, -AIGS_i, 1.0e-6);
+ AIGD_t = AIGD_i + hypmax(AIGD1_i * delTemp, -AIGD_i, 1.0e-6);
+ BGIDL_t = BGIDL_i * hypsmooth(1.0 + TGIDL_i * delTemp - 1.0e-6, 1.0e-3);
+ BGISL_t = BGISL_i * hypsmooth(1.0 + TGIDL_i * delTemp - 1.0e-6, 1.0e-3);
+ ALPHA0_t = ALPHA0_i + hypmax(ALPHA01 * delTemp, -ALPHA0_i, 1.0e-6);
+ ALPHA1_t = ALPHA1_i + hypmax(ALPHA11 * delTemp, -ALPHA1_i, 1.0e-6);
+ ALPHAII0_t = ALPHAII0_i + hypmax(ALPHAII01 * delTemp, -ALPHAII0_i, 1.0e-25);
+ ALPHAII1_t = ALPHAII1_i + hypmax(ALPHAII11 * delTemp, -ALPHAII1_i, 1.0e-20);
+ igtemp = lexp(IGT_i * lln(TRatio));
+ igsd_mult = igsd_mult0 * igtemp;
+
+ if (BULKMOD != 0) begin
+ CJS_t = Tempdep(CJS, TCJ, delTemp, TEMPMOD);
+ CJD_t = Tempdep(CJD, TCJ, delTemp, TEMPMOD);
+ CJSWS_t = Tempdep(CJSWS, TCJSW, delTemp, TEMPMOD);
+ CJSWD_t = Tempdep(CJSWD, TCJSW, delTemp, TEMPMOD);
+ CJSWGS_t = Tempdep(CJSWGS, TCJSWG, delTemp, TEMPMOD);
+ CJSWGD_t = Tempdep(CJSWGD, TCJSWG, delTemp, TEMPMOD);
+
+ PBS_t = hypsmooth(PBS - TPB * delTemp - 0.01, 1.0e-3) + 0.01;
+ PBD_t = hypsmooth(PBD - TPB * delTemp - 0.01, 1.0e-3) + 0.01;
+ PBSWS_t = hypsmooth(PBSWS - TPBSW * delTemp - 0.01, 1.0e-3) + 0.01;
+ PBSWD_t = hypsmooth(PBSWD - TPBSW * delTemp - 0.01, 1.0e-3) + 0.01;
+ PBSWGS_t = hypsmooth(PBSWGS - TPBSWG * delTemp - 0.01, 1.0e-3) + 0.01;
+ PBSWGD_t = hypsmooth(PBSWGD - TPBSWG * delTemp - 0.01, 1.0e-3) + 0.01;
+
+ T0 = Eg0 / Vtm0 - Eg / Vtm;
+ T1 = lln(TRatio);
+ T3 = lexp((T0 + XTIS * T1) / NJS);
+ JSS_t = JSS * T3;
+ JSWS_t = JSWS * T3;
+ JSWGS_t = JSWGS * T3;
+
+ T3 = lexp((T0 + XTID * T1) / NJD);
+ JSD_t = JSD * T3;
+ JSWD_t = JSWD * T3;
+ JSWGD_t = JSWGD * T3;
+
+ JTSS_t = JTSS * lexp(Eg0 * XTSS * (TRatio - 1.0) / Vtm);
+ JTSD_t = JTSD * lexp(Eg0 * XTSD * (TRatio - 1.0) / Vtm);
+ JTSSWS_t = JTSSWS * lexp(Eg0 * XTSSWS * (TRatio - 1.0) / Vtm);
+ JTSSWD_t = JTSSWD * lexp(Eg0 * XTSSWD * (TRatio - 1.0) / Vtm);
+ JTSSWGS_t = JTSSWGS * (sqrt(JTWEFF / Weff0) + 1.0) * lexp(Eg0 * XTSSWGS * (TRatio - 1.0) / Vtm);
+ JTSSWGD_t = JTSSWGD * (sqrt(JTWEFF / Weff0) + 1.0) * lexp(Eg0 * XTSSWGD * (TRatio - 1.0) / Vtm);
+
+ // All NJT's Smoothed to 0.01 to Prevent Divide-by-zero / Negative Values
+ NJTS_t = hypsmooth(NJTS * (1.0 + TNJTS * (TRatio-1.0)) - 0.01, 1.0e-3) + 0.01;
+ NJTSD_t = hypsmooth(NJTSD * (1.0 + TNJTSD * (TRatio-1.0)) - 0.01, 1.0e-3) + 0.01;
+ NJTSSW_t = hypsmooth(NJTSSW * (1.0 + TNJTSSW * (TRatio-1.0)) - 0.01, 1.0e-3) + 0.01;
+ NJTSSWD_t = hypsmooth(NJTSSWD * (1.0 + TNJTSSWD * (TRatio-1.0)) - 0.01, 1.0e-3) + 0.01;
+ NJTSSWG_t = hypsmooth(NJTSSWG * (1.0 + TNJTSSWG * (TRatio-1.0)) - 0.01, 1.0e-3) + 0.01;
+ NJTSSWGD_t = hypsmooth(NJTSSWGD * (1.0 + TNJTSSWGD * (TRatio-1.0)) - 0.01, 1.0e-3) + 0.01;
+ end
+
+ if (!$param_given(VFBSD)) begin
+ if (NGATE > 0.0) begin
+ vfbsd = devsign * (hypsmooth(0.5 * Eg - Vtm * lln(NGATE / ni), 1.0e-4) - (0.5 * Eg - devsign * (0.5 * Eg - hypsmooth(0.5 * Eg - Vtm * lln(NSD / ni), 1.0e-4))));
+ end else begin
+ vfbsd = devsign * (PHIG_i - (EASUB + 0.5 * Eg - devsign * (0.5 * Eg - hypsmooth(0.5 * Eg - Vtm * lln(NSD / ni), 1.0e-4))));
+ end
+ end else begin
+ vfbsd = VFBSD;
+ end
+
+ if (!$param_given(VFBSDCV)) begin
+ vfbsdcv = vfbsd;
+ end else begin
+ vfbsdcv = VFBSDCV;
+ end
+
+ `ifdef __SHMOD__
+ if (SHMOD != 0 && RTH0 > 0.0) begin
+ T0 = Vtm * lln(nbody / ni);
+ phib = sqrt(T0 * T0 + 1.0e-6);
+ end else begin
+ phib = Vtm * lln(nbody / ni);
+ end
+ `else
+ phib = Vtm * lln(nbody/ni);
+ `endif
+
+ `ifdef __SHMOD__
+ if (SHMOD != 0 && RTH0 > 0.0) begin
+ T0 = Vtm * lln(nbody * NSD / (ni * ni));
+ vbi = sqrt(T0 * T0 + 1.0e-6);
+ end else begin
+ vbi = Vtm * lln(nbody * NSD / (ni * ni));
+ end
+ `else
+ vbi = Vtm * lln(nbody * NSD / (ni * ni));
+ `endif
+
+ // deltaPhi definition and Polysilicon Depletion
+ // deltaPhi: workfunction difference between the gate and the n+ source.
+ deltaPhi = devsign*(PHIG_i - (EASUB + (TYPE == `ntype ? 0 : Eg)));
+
+ // Mobility Degradation
+ eta_mu = 0.5 * ETAMOB_t;
+ eta_mu_cv = 0.5;
+ if ( TYPE != `ntype ) begin
+ eta_mu = 1.0 / 3.0 * ETAMOB_t;
+ eta_mu_cv = 1.0 / 3.0;
+ end
+
+ // Junction Current and Capacitance
+ if (BULKMOD != 0) begin
+ // Source-Side Junction Current
+ Isbs = ASEJ * JSS_t + PSEJ * JSWS_t + TFIN * NFINtotal * JSWGS_t;
+ if (Isbs > 0.0) begin
+ Nvtms = Vtm * NJS;
+ XExpBVS = lexp(-BVS / Nvtms) * XJBVS;
+ T2 = max(IJTHSFWD / Isbs, 10.0);
+ Tb = 1.0 + T2 - XExpBVS;
+ VjsmFwd = Nvtms * lln(0.5 * (Tb + sqrt(Tb * Tb + 4.0 * XExpBVS)));
+ T0 = lexp(VjsmFwd / Nvtms);
+ IVjsmFwd = Isbs * (T0 - XExpBVS / T0 + XExpBVS - 1.0);
+ SslpFwd = Isbs * (T0 + XExpBVS / T0) / Nvtms;
+ T2 = hypsmooth(IJTHSREV / Isbs - 10.0, 1.0e-3) + 10.0;
+ VjsmRev = -BVS - Nvtms * lln((T2 - 1.0) / XJBVS);
+ T1 = XJBVS * lexp(-(BVS + VjsmRev) / Nvtms);
+ IVjsmRev = Isbs * (1.0 + T1);
+ SslpRev = -Isbs * T1 / Nvtms;
+ end
+
+ // Drain-Side Junction Current
+ Isbd = ADEJ * JSD_t + PDEJ * JSWD_t + TFIN * NFINtotal * JSWGD_t;
+ if (Isbd > 0.0) begin
+ Nvtmd = Vtm * NJD;
+ XExpBVD = lexp(-BVD / Nvtmd) * XJBVD;
+ T2 = max(IJTHDFWD / Isbd, 10.0);
+ Tb = 1.0 + T2 - XExpBVD;
+ VjdmFwd = Nvtmd * lln(0.5 * (Tb + sqrt(Tb * Tb + 4.0 * XExpBVD)));
+ T0 = lexp(VjdmFwd / Nvtmd);
+ IVjdmFwd = Isbd * (T0 - XExpBVD / T0 + XExpBVD - 1.0);
+ DslpFwd = Isbd * (T0 + XExpBVD / T0) / Nvtmd;
+ T2 = hypsmooth(IJTHDREV / Isbd - 10.0, 1.0e-3) + 10.0;
+ VjdmRev = -BVD - Nvtmd * lln((T2 - 1.0) / XJBVD);
+ T1 = XJBVD * lexp(-(BVD + VjdmRev) / Nvtmd);
+ IVjdmRev = Isbd * (1.0 + T1);
+ DslpRev = -Isbd * T1 / Nvtmd;
+ end
+
+ // Junction Capacitance
+ Czbs = CJS_t * ASEJ;
+ Czbssw = CJSWS_t * PSEJ;
+ Czbsswg = CJSWGS_t * Weff0 * NFINtotal;
+ Czbd = CJD_t * ADEJ;
+ Czbdsw = CJSWD_t * PDEJ;
+ Czbdswg = CJSWGD_t * Weff0 * NFINtotal;
+ end
+
+ // Generation-Recombination Current
+ T0 = Eg / Vtm * (TRatio - 1.0);
+ T1 = T0 / NTGEN_i;
+ igentemp = lexp(T1);
+
+ end // End of temperature dependent calculations
+
+ // ************************************************
+ // * Bias dependent calculations follow *
+ // ************************************************
+
+ // Load Terminal Voltages
+ vgs_noswap = devsign * V(`IntrinsicGate, si);
+ vds_noswap = devsign * V(di, si);
+ vgd_noswap = devsign * V(`IntrinsicGate, di);
+ ves_jct = devsign * V(e, si);
+ ved_jct = devsign * V(e, di);
+ vge = devsign * V(`IntrinsicGate, e);
+
+ // Source-Drain Interchange
+ sigvds = 1.0;
+ if (vds_noswap < 0.0) begin
+ sigvds = -1.0;
+ vgs = vgs_noswap - vds_noswap;
+ vds = -1.0 * vds_noswap;
+ ves = ved_jct;
+ end else begin
+ vgs = vgs_noswap;
+ vds = vds_noswap;
+ ves = ves_jct;
+ end
+ vgsfb = vgs - deltaPhi;
+
+ // Initialize Certain Variables to Zero to Prevent Unnecessary Update
+ etaiv = 0.0;
+ Qes = 0.0;
+ Qesj = 0.0;
+ Qeg = 0.0;
+ Qed = 0.0;
+ Qedj = 0.0;
+
+ // Vds Smoothing
+ vdsx = sqrt (vds * vds + 0.01) - 0.1;
+
+ // Ves Smoothing
+ if (BULKMOD != 0) begin
+ vesx = ves - 0.5 * (vds - vdsx);
+ vesmax = 0.95 * PHIBE_i;
+ T2 = vesmax - vesx - 1.0e-3;
+ veseff = vesmax - 0.5 * (T2 + sqrt(T2 * T2 + 0.004 * vesmax));
+ end
+
+ // Asymmetry Model
+ T0 = tanh(0.6 * vds_noswap / Vtm);
+ wf = 0.5 + 0.5 * T0;
+ wr = 1.0 - wf;
+ if (ASYMMOD != 0) begin
+ CDSCD_a = CDSCDR_i * wr + CDSCD_i * wf;
+ ETA0_a = ETA0R_t * wr + ETA0_t * wf;
+ PDIBL1_a = PDIBL1R_i * wr + PDIBL1_i * wf;
+ PDIBL2_a = PDIBL2R_i * wr + PDIBL2_i * wf;
+ MEXP_a = MEXPR_t * wr + MEXP_t * wf;
+ PTWG_a = PTWGR_t * wr + PTWG_t * wf;
+ VSAT1_a = VSAT1R_t * wr + VSAT1_t * wf;
+ RSDR_a = RSDRR_t * wr + RSDR_t * wf;
+ RDDR_a = RDDRR_t * wr + RDDR_t * wf;
+ PCLM_a = PCLMR_i * wr + PCLM_i * wf;
+ VSAT_a = VSATR_t * wr + VSAT_t * wf;
+ KSATIV_a = KSATIVR_i * wr + KSATIV_i * wf;
+ DVTSHIFT_a = DVTSHIFTR_i * wr + DVTSHIFT_i * wf;
+ CIT_a = CITR_i * wr + CIT_i * wf;
+ u0_a = u0r * wr + u0 * wf;
+ UA_a = UAR_t*wr + UA_t * wf;
+ UD_a = UDR_t * wr + UD_t * wf;
+ UC_a = UCR_t * wr + UC_t * wf;
+ EU_a = EUR_i * wr + EU_i * wf;
+ end else begin
+ CDSCD_a = CDSCD_i;
+ ETA0_a = ETA0_t;
+ PDIBL1_a = PDIBL1_i;
+ PDIBL2_a = PDIBL2_i;
+ MEXP_a = MEXP_t;
+ PTWG_a = PTWG_t;
+ VSAT1_a = VSAT1_t;
+ RSDR_a = RSDR_t;
+ RDDR_a = RDDR_t;
+ PCLM_a = PCLM_i;
+ VSAT_a = VSAT_t;
+ KSATIV_a = KSATIV_i;
+ DVTSHIFT_a = DVTSHIFT_i;
+ CIT_a = CIT_i;
+ u0_a = u0;
+ UA_a = UA_t;
+ UD_a = UD_t;
+ UC_a = UC_t;
+ EU_a = EU_i;
+ end
+
+ // Drain Saturation Voltage
+ inv_MEXP = 1.0 / MEXP_a;
+
+ // SCE, DIBL, SS Degradation Effects (Ref: BSIM4 Model)
+ phist = 0.4 + phib + PHIN_i;
+ T1 = 2.0 * (Cins / Weff_UFCM) / (rc + 2.0);
+ cdsc = Theta_SW * (CDSC_i + CDSCD_a * vdsx);
+
+ if (!$param_given(NVTM))
+ nVtm = Vtm * ThetaSS * (1.0 + (CIT_a + cdsc) / T1);
+ else nVtm = NVTM;
+
+ // temp deped UFCM
+ qdep = Qdep_ov_Cins / nVtm;
+ vth_fixed_factor_SI = ln(Cins * nVtm/(`q * Nc * 2.0 * Ach));
+ vth_fixed_factor_Sub = ln((qdep * rc) * (qdep * rc) / ((exp(qdep * rc) - qdep * rc - 1.0))) + vth_fixed_factor_SI;
+ q0 = 10.0 * nVtm / rc + 2.0 * qbs;
+
+ // New QM parameter calculation: fieldnormalizationfactor, auxQMfact, QMFACTORCVfinal
+ fieldnormalizationfactor = Vtm * Cins / (Weff_UFCM * epssub);
+ auxQMfact = pow(((3.0 / 4.0) * 3.0 * `HBAR * 2.0 * `M_PI * `q / (4.0 * sqrt(2.0 * mx))), 2.0 / 3.0);
+ QMFACTORCVfinal = QMFACTORCV * auxQMfact * pow(fieldnormalizationfactor, 2.0 / 3.0) * (1/(`q * Vtm));
+
+ dvth_vtroll = -DVT0_i * Theta_SCE * (vbi - phist);
+ dvth_dibl = -ETA0_a * Theta_DIBL * vdsx + (DVTP0_i * Theta_DITS * pow(vdsx, DVTP1_i));
+ dvth_rsce = K1RSCE_i * Theta_RSCE * sqrt(phist);
+ dvth_all = dvth_vtroll + dvth_dibl + dvth_rsce + dvth_temp + DVTSHIFT_a;
+ vgsfb = vgsfb - dvth_all;
+
+ // Vgs Clamping for Inversion Region Calculation in Accumulation
+ beta0 = u0_a * cox * Weff0 / Leff;
+ T0 = -(dvch_qm + nVtm * lln(2.0 * cox * Imin / (beta0 * nVtm * `q * Nc * TFIN)));
+ T1 = vgsfb + T0 + DELVTRAND;
+ vgsfbeff = hypsmooth(T1 , 1.0e-4) - T0;
+
+ // Core Model Calculation at Source Side
+ vch = 0.0 + dvch_qm;
+
+ if (BULKMOD != 0) begin
+ T1 = hypsmooth(2.0 * phib + vch - ves, 0.1);
+ T3 = (-K1_t / (2.0 * nVtm)) * (sqrt(T1) - sqrt(2.0 * phib));
+ T0 = -qdep - T3 + vth_fixed_factor_Sub + QMFACTORCVfinal * pow(-qdep, 2.0/3.0);
+ T1 = -qdep - T3 + vth_fixed_factor_SI;
+ end else begin
+ T0 = -qdep + vth_fixed_factor_Sub + QMFACTORCVfinal * pow(-qdep, 2.0/3.0);
+ T1 = -qdep + vth_fixed_factor_SI;
+ end
+ T2 = (vgsfbeff - vch) / nVtm;
+ F0 = -T2 + T1;
+ T3 = 0.5 * (T2 - T0);
+ qm = exp(T3);
+ if (qm > 1.0e-7) begin
+ T7 = ln(1.0 + qm);
+ qm = 2.0 * (1.0 - sqrt(1.0 + T7 * T7));
+ T8 = (qm * ALPHA_UFCM + qdep) * rc;
+ T4 = T8 / (exp(T8) - T8 - 1.0);
+ T5 = T8 * T4;
+ e0 = F0 - qm + ln(-qm) + ln(T5) + QMFACTORCVfinal * pow(-(qm + qdep), 2.0 / 3.0);
+ e1 = -1.0 + 1.0 / qm + (2.0 / T8 - T4 - 1.0) * rc - (2.0 / 3.0) * QMFACTORCVfinal * pow(-(qm + qdep), -1.0 / 3.0);
+ e2 = -1.0 / (qm * qm) - (2.0 / 9.0) * QMFACTORCVfinal * pow(-(qm + qdep), -4.0/3.0);
+ qm = qm - (e0 / e1) * (1.0 + (e0 * e2) / (2.0 * e1 * e1));
+ T8 = (qm * ALPHA_UFCM + qdep) * rc;
+ T4 = T8 / (exp(T8) - T8 - 1.0);
+ T5 = T8 * T4;
+ e0 = F0 - qm + ln(-qm) + ln(T5) + QMFACTORCVfinal * pow(-(qm + qdep), 2.0 / 3.0);
+ e1 = -1.0 + 1.0 / qm + (2.0 / T8 - T4 - 1.0) * rc - (2.0 / 3.0) * QMFACTORCVfinal * pow(-(qm + qdep), -1.0/3.0);
+ e2 = -1.0 / (qm * qm) - (2.0 / 9.0) * QMFACTORCVfinal * pow(-(qm + qdep), -4.0/3.0);
+ qm = qm - (e0 / e1) * (1.0 + (e0 * e2) / (2.0 * e1 * e1));
+ end else begin
+ qm = -qm * qm;
+ end
+ qis = -qm * nVtm;
+
+ // Drain Saturation Voltage
+ Eeffs = EeffFactor * (qbs + eta_mu * qis);
+ qb0 = 1.0e-2 / cox;
+ T2 = pow(0.5 * (1.0 + abs((qis) / qb0)), UCS_t);
+ if (BULKMOD != 0) begin
+ T3 = (UA_a + UC_a * veseff) * pow(abs(Eeffs), EU_a) + UD_a / T2;
+ end else begin
+ T3 = UA_a * pow(abs(Eeffs), EU_a) + UD_a / T2;
+ end
+ Dmobs = 1.0 + T3;
+ Dmobs = Dmobs / U0MULT;
+
+ if (RDSMOD == 1) begin
+ Rdss = 0.0;
+ end else if (RDSMOD == 0) begin
+ T4 = 1.0 + PRWGS_i * qis;
+ T1 = 1.0 / T4;
+ T0 = 0.5 * (T1 + sqrt(T1 * T1 + 0.01));
+ Rdss = (RDSWMIN_i + RDSW_i * T0) * WeffWRFactor * NFINtotal * rdstemp;
+ end else begin
+ T4 = 1.0 + PRWGS_i * qis;
+ T1 = 1.0 / T4;
+ T0 = 0.5 * (T1 + sqrt(T1 * T1 + 0.01));
+ Rdss = (RSourceGeo + RDrainGeo + RDSWMIN_i + RDSW_i * T0) * WeffWRFactor * NFINtotal * rdstemp;
+ end
+
+ Esat = 2.0 * VSAT_a / u0_a * Dmobs;
+ EsatL = Esat * Leff;
+ T6 = KSATIV_a * (qis + 2 * Vtm);
+
+ if (Rdss == 0.0) begin
+ Vdsat = EsatL * T6 / (EsatL + T6);
+ end else begin
+ WVCox = Weff0 * VSAT_a * cox;
+ T0 = WVCox * Rdss;
+ Ta = 2.0 * T0;
+ Tb = T6 + EsatL + 3.0 * T6 * T0;
+ Tc = T6 * (EsatL + 2.0 * T6 * T0);
+ Vdsat = (Tb - sqrt(Tb * Tb - 2.0 * Ta * Tc)) / Ta;
+ end
+ Vdsat = hypsmooth(Vdsat - 1.0e-3, 1.0e-5) + 1.0e-3;
+ T7 = pow(vds / Vdsat , MEXP_a);
+ T8 = pow(1.0 + T7, inv_MEXP);
+ Vdseff = vds / T8;
+
+ if (Vdseff > vds) begin
+ Vdseff = vds;
+ end
+
+ // Core Model Calculation at Drain Side
+ vch = Vdseff + dvch_qm;
+
+ if (BULKMOD != 0) begin
+ T1 = hypsmooth(2.0 * phib + vch - ves, 0.1);
+ T3 = (-K1_t / (2.0 * nVtm)) * (sqrt(T1) - sqrt(2.0 * phib));
+ T0 = -qdep - T3 + vth_fixed_factor_Sub + QMFACTORCVfinal * pow(-qdep, 2.0 / 3.0);
+ T1 = -qdep - T3 + vth_fixed_factor_SI;
+ end else begin
+ T0 = -qdep + vth_fixed_factor_Sub + QMFACTORCVfinal * pow(-qdep, 2.0 / 3.0);
+ T1 = -qdep + vth_fixed_factor_SI;
+ end
+ T2 = (vgsfbeff - vch) / nVtm;
+ F0 = -T2 + T1;
+ T3 = (T2 - T0) * 0.5;
+ qm = exp(T3);
+ if (qm > 1.0e-7) begin
+ T7 = ln(1.0 + qm);
+ qm = 2.0 * (1.0 - sqrt(1.0 + T7 * T7));
+ T8 = (qm * ALPHA_UFCM + qdep) * rc;
+ T4 = T8 / (exp(T8) - T8 - 1.0);
+ T5 = T8 * T4;
+ e0 = F0 - qm + ln(-qm) + ln(T5) + QMFACTORCVfinal * pow(-(qm + qdep), 2.0 / 3.0);
+ e1 = -1.0 + (1.0 / qm) + (2.0 / T8 - T4 - 1.0) * rc - (2.0 / 3.0) * QMFACTORCVfinal * pow(-(qm + qdep), -1.0 / 3.0);
+ e2 = -1.0 / (qm * qm) - (2.0 / 9.0) * QMFACTORCVfinal * pow(-(qm + qdep), -4.0 / 3.0);
+ qm = qm - (e0 / e1)*(1.0 + (e0 * e2) / (2.0 * e1 * e1));
+ T8 = (qm * ALPHA_UFCM + qdep) * rc;
+ T4 = T8 / (exp(T8) - T8 - 1.0);
+ T5 = T8 * T4;
+ e0 = F0 - qm + ln(-qm) + ln(T5) + QMFACTORCVfinal * pow(-(qm + qdep), 2.0/3.0);
+ e1 = -1.0 + (1.0 / qm) + (2.0 / T8 - T4 - 1.0) * rc - (2.0 / 3.0) * QMFACTORCVfinal * pow(-(qm + qdep), -1.0 / 3.0);
+ e2 = -1.0 / (qm * qm) - (2.0 / 9.0) * QMFACTORCVfinal * pow(-(qm + qdep), -4.0 / 3.0);
+ qm = qm - (e0 / e1) * (1.0 + (e0 * e2) / (2.0 * e1 * e1));
+ end else begin
+ qm = -qm * qm;
+ end
+ qid = -qm * nVtm;
+
+ if (BULKMOD != 0) begin
+ T9 = (K1_t / (2.0 * nVtm)) * sqrt(Vtm);
+ T0 = T9 / 2.0;
+ T2 = (vge - (deltaPhi - Eg - Vtm * ln(NBODY / Nc) + DELVFBACC)) / Vtm;
+ if ((T2 * Vtm) > phib + T9 * sqrt(phib * Vtm)) begin
+ T1 = sqrt(T2 - 1.0 + T0 * T0) - T0;
+ T10 = 1.0 + T1 * T1;
+ end else begin
+ T3 = T2 * 0.5 - 3.0 * (1.0 + T9 / sqrt(2.0));
+ T10 = T3 + sqrt(T3 * T3 + 6.0 * T2);
+ if (T2 < 0.0) begin
+ T4 = (T2 - T10) / T9;
+ T10 = -ln(1.0 - T10 + T4 * T4 );
+ end else begin
+ T11 = exp(-T10);
+ T4 = sqrt(T2 - 1.0 + T11 + T0 * T0) - T0;
+ T10 = 1.0 - T11 + T4 * T4;
+ end
+ end
+ T6 = exp(-T10) - 1.0;
+ T7 = sqrt(T6 + T10);
+ if (T10 > 1.0e-15) begin
+ e0 = -(T2 - T10) + T9 * T7;
+ e1 = 1.0 - T9 * 0.5 * T6 / T7;
+ T8 = T10 - (e0 / e1);
+ T11 = exp(-T8) - 1.0;
+ T12 = sqrt(T11 + T8);
+ qba = -T9 * T12 * Vtm;
+ end else begin
+ if (T10 < -1.0e-15) begin
+ e0 = -(T2 - T10) - T9 * T7;
+ e1 = 1.0 + T9 * 0.5 * T6 / T7;
+ T8 = T10 - e0 / e1;
+ T12 = T9 * sqrt(exp(-T8) + T8 - 1.0);
+ end else begin
+ T12 = 0.0;
+ T8 = 0.0;
+ end
+ qba = T12 * Vtm;
+ end
+ qi_acc_for_QM = T9 * exp(-T8 / 2.0) * Vtm;
+
+ psipclamp = 0.5 * (T8 + 1.0 + sqrt((T8 - 1.0) * (T8 - 1.0) + 0.25 * 2.0 * 2.0));
+ sqrtpsip = sqrt(psipclamp);
+ nq = 1.0 + T9 / sqrtpsip;
+ end
+
+ // Drain Side and Average Potential / Charge
+ qia = 0.5 * (qis + qid);
+ dqi = qis - qid;
+
+ T0 = pow(Vdseff, 2.0) / 6.25e-4; // pow(Vdseff,2.0) / pow(25e-3, 2.0)
+ if (CHARGEWF != 0.0)
+ qia2 = 0.5 * (qis + qid) + CHARGEWF * (1.0 - lexp(-T0)) * 0.5 * dqi;
+ else
+ qia2 = 0.5 * (qis + qid);
+
+ `ifdef __DEBUG__
+ if (qis < 0.0) $strobe("Warning: negative source-side inversion carrier density. Vgs=%f Vds=%f Vbs=%f qis=%e", V(g, s), V(d, s), V(e, s), qis);
+ if (qid < 0.0) $strobe("Warning: negative drain-side inversion carrier density. Vgs=%f Vds=%f Vbs=%f qid=%e", V(g, s), V(d, s), V(e, s), qid);
+ `endif
+
+ // Toxeff model for quantum mechanical effects
+ // Normal operation (Vgs > Vfb)
+ if (QMTCENCV_i > 0.0) begin
+ T4 = qia / QM0;
+ T5 = 1.0 + pow(T4, PQM);
+ Tcen = Tcen0 / T5;
+ coxeff = 1.0 / (1.0 / (cox * EOT / TOXP) + Tcen * QMTCENCV_i / epssub);
+ end else begin
+ coxeff = cox;
+ end
+
+ // Quantum Mechanical Effect Correction for Accumulation Side Cap (Vgs < Vfb)
+ if (BULKMOD != 0 && QMTCENCVA_i != 0.0) begin
+ T6 = 1.0 + pow(qi_acc_for_QM / QM0ACC, PQMACC);
+ Tcen = Tcen0 / T6;
+ cox_acc = 1.0 / (1.0 / cox_acc + Tcen * QMTCENCVA_i / epssub);
+ end
+
+ // Multiplication Factor for I-V
+ beta = u0_a * cox * Weff0 / Leff;
+
+ // Mobility Degradation
+ Eeffm = EeffFactor * (qba + eta_mu * qia2);
+ T2 = pow(0.5 * (1.0 + abs((qia2) / qb0)), UCS_t);
+ if (BULKMOD != 0) begin
+ T3 = (UA_a + UC_a * veseff) * pow(abs(Eeffm), EU_a) + UD_a / T2;
+ end else begin
+ T3 = UA_a * pow(abs(Eeffm), EU_a) + UD_a / T2;
+ end
+ Dmob = 1.0 + T3;
+ Dmob = Dmob / U0MULT;
+ ueff = u0_a / Dmob;
+
+ // Mobility Degradation for C-V
+ Eeffm_cv = EeffFactor * (qba + eta_mu_cv * qia2);
+ T3 = UA_a * pow(abs(Eeffm_cv), EU_a) + UD_a / T2;
+ Dmob_cv = 1.0 + T3;
+ Dmob_cv = Dmob_cv / U0MULT;
+
+ // Calculate current and capacitance enhancement factors due to CLM and DIBL
+ tmp = DROUT_i * Leff / scl + 1.0e-6;
+
+ if (tmp < 40.0) begin
+ DIBLfactor = 0.5 * PDIBL1_a / (cosh(tmp) - 1.0) + PDIBL2_a;
+ end else begin
+ DIBLfactor = PDIBL1_a * exp(-tmp) + PDIBL2_a;
+ end
+
+ if (PVAG_i > 0.0) begin
+ PVAGfactor = 1.0 + PVAG_i * qia / EsatL;
+ end else begin
+ PVAGfactor = 1.0 / (1.0 - PVAG_i * qia / EsatL);
+ end
+
+ if (Vdseff > vds) begin
+ Vdseff = vds;
+ end
+ diffVds = vds - Vdseff;
+ Vgst2Vtm = qia + 2.0 * Vtm;
+ if (DIBLfactor > 0) begin
+ T1 = Vgst2Vtm;
+ T3 = T1 / (Vdsat + T1);
+ VaDIBL = T1 / DIBLfactor * T3 * PVAGfactor;
+ Moc = 1.0 + diffVds / VaDIBL;
+ end else begin
+ Moc = 1.0;
+ end
+
+ if (PCLM_a > 0.0) begin
+ if (PCLMG_i < 0.0) begin
+ T1 = 1.0 / (1.0 / PCLM_a - PCLMG_i * qia);
+ end else begin
+ T1 = PCLM_a + PCLMG_i * qia;
+ end
+ Mclm = 1.0 + T1 * lln(1.0 + (vds - Vdseff) / T1 / (Vdsat + EsatL));
+ end else begin
+ Mclm = 1.0;
+ end
+
+ Moc = Moc * Mclm;
+
+ // Current Degradation Factor Due to Velocity Saturation
+ Esat1 = 2.0 * VSAT1_a / ueff;
+ Esat1L = Esat1 * Leff;
+ T0 = lexp(PSAT_i * lln(dqi / Esat1L));
+ Ta = (1.0 + lexp(1.0 / PSAT_i * lln(DELTAVSAT_i)));
+ Dvsat = (1.0 + lexp(1.0 / PSAT_i * lln(DELTAVSAT_i + T0))) / Ta;
+ Dvsat = Dvsat + 0.5 * PTWG_a * qia * dqi * dqi;
+
+ // Non-Saturation Effect
+ T0 = A1_t + A2_t / (qia + 2.0 * nVtm);
+ T1 = T0 * dqi * dqi;
+ T2 = T1 + 1.0 - 0.001;
+ T3 = -1.0 + 0.5 * (T2 + sqrt(T2 * T2 + 0.004)); // max(T1, -1.0)
+ Nsat = 0.5 * (1.0 + sqrt(1.0 + T3));
+ Dvsat = Dvsat * Nsat;
+
+ // Lateral Non-uniform doping effect (IV-CV Vth shift) factor
+ if (K0_t != 0) begin
+ T1 = K0_t / (max(0, K0SI_t + K0SISAT_t * dqi * dqi) * qia + 2.0 * nVtm);
+ Mnud = lexp(-T1);
+ end else begin
+ Mnud = 1.0;
+ end
+
+ // Body-Effect Factor for BULKMOD = 2
+ if (BULKMOD == 2) begin
+ T0 = hypsmooth((K2_t + K2SAT_t * vdsx), 1.0e-6);
+ T1 = T0 / (max(0, K2SI_t + K2SISAT_t * dqi * dqi) * qia + 2.0 * nVtm);
+ T3 = sqrt(PHIBE_i - veseff) - sqrt(PHIBE_i);
+ Mob = lexp(- T1 * T3);
+ end else
+ Mob = 1.0;
+
+ // Velocity Saturation Factor for C-V
+ EsatCV = 2.0 * VSATCV_t * Dmob_cv / u0_a;
+ EsatCVL = EsatCV * LeffCV;
+ T0 = lexp(PSATCV_i * lln(dqi / EsatCVL));
+ Ta = (1.0 + lexp(1.0 / PSATCV_i * lln(DELTAVSATCV_i)));
+ DvsatCV = (1.0 + lexp(1.0 / PSATCV_i * lln(DELTAVSATCV_i + T0))) / Ta;
+
+ // Channel Length Modulation factor for C-V
+ if (PCLMCV_i != 0) begin
+ MclmCV = 1.0 + PCLMCV_i * lln(1.0 + (vds - Vdseff) / PCLMCV_i / (Vdsat + EsatCVL));
+ end else begin
+ MclmCV = 1.0;
+ end
+
+ // Calculating fixed body charge qb with sign (Here to avoid multiple calculation in NQSMOD=3 case)
+ qb = -`q * nbody * Ach * LeffCV;
+
+ // ************************************************
+ // * Current and Charges Calculations *
+ // ************************************************
+ // Quasi Static I-V Model
+ T1 = qia;
+ etaiv = q0 / (q0 + qia);
+ T2 = (2.0 - etaiv) * nVtm;
+ ids0_ov_dqi = T1 + T2;
+ ids0 = ids0_ov_dqi * dqi;
+
+ // S/D Series Resistance
+ `include "bsimcmg_rdsmod.include"
+
+ ids = NFINtotal * beta * ids0 * Moc * Mnud * Mob / (Dmob * Dvsat * Dr);
+ ids = ids * IDS0MULT;
+
+ // Quasi Static C-V Model
+ `include "bsimcmg_quasi_static_cv.include"
+
+ // Parasitic Capacitances
+ // Bias-dependent overlap capacitances (CGEOMOD = 0 and 2)
+ qgs_ov = 0.0;
+ qgd_ov = 0.0;
+ if (CGEOMOD != 1) begin
+ T1 = NFINtotal * WeffCV0 * devsign;
+ T2 = devsign * V(`GateEdgeNode, si);
+ T0 = T2 - vfbsdcv + `DELTA_1;
+ vgs_overlap = 0.5 * (T0 - sqrt(T0 * T0 + 4.0 * `DELTA_1));
+ qgs_ov = T1 * (CGSL_i * (T2 - vfbsdcv - vgs_overlap - 0.5 * CKAPPAS_i * (sqrt(1.0 - 4.0 * vgs_overlap / CKAPPAS_i) - 1.0)) + CGSO_i * T2);
+ T2 = devsign * V(`GateEdgeNode, di);
+ T0 = T2 - vfbsdcv + `DELTA_1;
+ vgd_overlap = 0.5 * (T0 - sqrt(T0 * T0 + 4.0 * `DELTA_1));
+ qgd_ov = T1 * (CGDL_i * (T2 - vfbsdcv - vgd_overlap - 0.5 * CKAPPAD_i * (sqrt(1.0 - 4.0 * vgd_overlap / CKAPPAD_i) - 1.0)) + CGDO_i * T2);
+ end
+
+ if (CGEOMOD == 0) begin
+ T1 = NFINtotal * WeffCV0; // Fringe caps dont see QM effects
+ qgs_fr = T1 * CFS_i * V(`GateEdgeNode, si);
+ qgd_fr = T1 * CFD_i * V(`GateEdgeNode, di);
+ qgs_parasitic = qgs_ov + qgs_fr;
+ qgd_parasitic = qgd_ov + qgd_fr;
+ end else if (CGEOMOD == 1) begin // CGEO1SW=1 enables parameters to be in F per fin, per gate-finger, per unit channel width
+ if (CGEO1SW == 1) begin
+ T0 = NFINtotal * WeffCV0;
+ COVS_i = T0 * COVS_i;
+ COVD_i = T0 * COVD_i;
+ cgsp = T0 * CGSP;
+ cgdp = T0 * CGDP;
+ end else begin
+ cgsp = CGSP;
+ cgdp = CGDP;
+ end
+ qgs_ov = COVS_i * V(`GateEdgeNode, si);
+ qgd_ov = COVD_i * V(`GateEdgeNode, di);
+ qgs_parasitic = qgs_ov;
+ qgd_parasitic = qgd_ov;
+ qgs_fr = cgsp * V(`GateEdgeNode, s);
+ qgd_fr = cgdp * V(`GateEdgeNode, d);
+ end else begin
+ qgs_fr = Cfr_geo * V(`GateEdgeNode, si);
+ qgd_fr = Cfr_geo * V(`GateEdgeNode, di);
+ qgs_parasitic = qgs_ov + qgs_fr;
+ qgd_parasitic = qgd_ov + qgd_fr;
+ end
+
+ // Drain-to-Source Fringe Capacitance Available for all CGEOMOD
+ qds_fr = CDSP * V(d, s);
+
+ // Impact Ionization Current (Ref: IIMOD = 1 from BSIM4 Model, IIMOD = 2 from BSIMSOI Model)
+ Iii = 0.0;
+ if (IIMOD == 1) begin
+ T0 = (ALPHA0_t + ALPHA1_t * Leff) / Leff;
+ if ((T0 <= 0.0) || (BETA0_t <= 0.0))
+ Iii = 0.0;
+ else begin
+ T1 = -BETA0_t / (diffVds + 1.0e-30);
+ Iii = T0 * diffVds * ids * lexp(T1);
+ end
+ end else if (IIMOD == 2) begin //End of IIMOD=1
+ ALPHAII = (ALPHAII0_t + ALPHAII1_t * Leff) / Leff;
+ if (ALPHAII <= 0.0) begin
+ Iii = 0.0;
+ end else begin
+ T0 = ESATII_i * Leff;
+ T1 = SII0_t * T0 / (1.0 + T0);
+ T0 = 1.0 / (1.0 + hypsmooth(SII1_i * vgsfbeff, IIMOD2CLAMP1)); // T0 = 1 / (1 + SII1_i * vgsfbeff)
+ T3 = T0 + SII2_i;
+ T2 = hypsmooth(vgsfbeff * T3, IIMOD2CLAMP2); // T2 = vgsfbeff * T3
+ T3 = 1.0 / (1.0 + SIID_i * vds);
+ VgsStep = T1 * T2 * T3;
+ Vdsatii = VgsStep * (1.0 - LII_i / Leff);
+ Vdiff = vds - Vdsatii;
+ T0 = BETAII2_i + BETAII1_i * Vdiff + BETAII0_i * Vdiff * Vdiff;
+ T1 = sqrt(T0 * T0 + 1.0e-10);
+ Ratio = -hypmax( -ALPHAII * lexp(Vdiff / T1), -10.0, IIMOD2CLAMP3);
+ Iii = Ratio * ids;
+ end
+ end // End of IIMOD=2
+
+ // Gate Current (Ref: BSIM4 Model)
+ igbinv = 0.0;
+ igbacc = 0.0;
+ igcs = 0.0;
+ igcd = 0.0;
+ igs = 0.0;
+ igd = 0.0;
+
+ // Igb
+ if (IGBMOD != 0) begin
+ // Igbinv
+ T1 = (qia - EIGBINV_i) / NIGBINV_i / Vtm;
+ Vaux_Igbinv = NIGBINV_i * Vtm * lln(1.0 + lexp(T1));
+ T2 = AIGBINV_t - BIGBINV_i * qia;
+ T3 = 1.0 + CIGBINV_i * qia;
+ T4 = -9.82222e11 * TOXG * T2 * T3;
+ T5 = lexp(T4);
+ T6 = 3.75956e-7;
+ igbinv = Weff0 * Leff * T6 * Toxratio * vge * Vaux_Igbinv * T5;
+ igbinv = igbinv * igtemp;
+
+ // Igbacc
+ vfbzb = deltaPhi - (Eg / 2.0) - phib;
+ T0 = vfbzb - vge;
+ T1 = T0 / NIGBACC_i / Vtm;
+ Vaux_Igbacc = NIGBACC_i * Vtm * lln(1.0 + lexp(T1));
+ if (BULKMOD != 0) begin
+ Voxacc = qi_acc_for_QM;
+ end else begin
+ if (vfbzb <= 0)
+ Voxacc = 0.5 * (T0 - 0.02 + sqrt((T0 - 0.02) * (T0 - 0.02) - 0.08 * vfbzb));
+ else
+ Voxacc = 0.5 * (T0 - 0.02 + sqrt((T0 - 0.02) * (T0 - 0.02) + 0.08 * vfbzb));
+ end
+ T2 = AIGBACC_t - BIGBACC_i * Voxacc;
+ T3 = 1.0 + CIGBACC_i * Voxacc;
+ T4 = -7.45669e11 * TOXG * T2 * T3;
+ T5 = lexp(T4);
+ T6 = 4.97232e-7;
+ igbacc = Weff0 * Leff * T6 * Toxratio * vge * Vaux_Igbacc * T5;
+ igbacc = igbacc * igtemp;
+
+ end
+
+ if (IGCMOD != 0) begin
+ // Igcinv
+ T1 = AIGC_t - BIGC_i * qia;
+ T2 = 1.0 + CIGC_i * qia;
+ T3 = -Bechvb * TOXG * T1 * T2;
+ T4 = qia * lexp(T3);
+ T5 = (vge + 0.5 * vdsx + 0.5 * (ves_jct + ved_jct));
+ igc0 = Weff0 * Leff * Aechvb * Toxratio * T4 * T5 * igtemp;
+
+ // Gate-Current Partitioning
+ Vdseffx = sqrt(Vdseff * Vdseff + 0.01) - 0.1;
+ T1 = PIGCD_i * Vdseffx;
+ T1_exp = lexp(-T1);
+ T3 = T1 + T1_exp - 1.0 + 1.0e-4;
+ T4 = 1.0 - (T1 + 1.0) * T1_exp + 1.0e-4;
+ T5 = T1 * T1 + 2.0e-4;
+ igcd = igc0 * T4 / T5;
+ igcs = igc0 * T3 / T5;
+
+ // Igs
+ T0 = vgs_noswap - vfbsd;
+ vgs_eff = sqrt(T0 * T0 + 1.0e-4);
+ if (IGCLAMP == 1) begin
+ T1 = hypsmooth((AIGS_t - BIGS_i * vgs_eff), 1.0e-6);
+ if (CIGS_i < 0.01) begin
+ CIGS_i = 0.01;
+ end
+ end else begin
+ T1 = AIGS_t - BIGS_i * vgs_eff;
+ end
+ T2 = 1.0 + CIGS_i * vgs_eff;
+ T3 = -Bechvb * TOXG * POXEDGE_i * T1 * T2;
+ T4 = lexp(T3);
+ if (sigvds > 0.0) begin
+ igs = igsd_mult * DLCIGS * vgs_noswap * vgs_eff * T4;
+ end else begin
+ igd = igsd_mult * DLCIGS * vgs_noswap * vgs_eff * T4;
+ end
+
+ // Igd
+ T0 = vgd_noswap - vfbsd;
+ vgd_eff = sqrt(T0 * T0 + 1.0e-4);
+ if (IGCLAMP == 1) begin
+ T1 = hypsmooth((AIGD_t - BIGD_i * vgd_eff), 1.0e-6);
+ if (CIGD_i < 0.01) begin
+ CIGD_i = 0.01;
+ end
+ end else begin
+ T1 = AIGD_t - BIGD_i * vgd_eff;
+ end
+ T2 = 1.0 + CIGD_i * vgd_eff;
+ T3 = -Bechvb * TOXG * POXEDGE_i * T1 * T2;
+ T4 = lexp(T3);
+
+ if (sigvds > 0.0) begin
+ igd = igsd_mult * DLCIGD * vgd_noswap * vgd_eff * T4;
+ end else begin
+ igs = igsd_mult * DLCIGD * vgd_noswap * vgd_eff * T4;
+ end
+ end
+
+ // GIDL/GISL Current (Ref: BSIM4 Model)
+ igisl = 0.0;
+ igidl = 0.0;
+
+ if (GIDLMOD != 0) begin
+ T0 = epsratio * EOT;
+ // GIDL
+ if ((AGIDL_i <= 0.0) || (BGIDL_t <= 0.0)) begin
+ T6 = 0.0;
+ end else begin
+ T1 = (-vgd_noswap - EGIDL_i + vfbsd) / T0;
+ T1 = hypsmooth(T1, 1.0e-2);
+ T2 = BGIDL_t / (T1 + 1.0e-3);
+ T3 = lexp(PGIDL_i * lln(T1));
+ if (BULKMOD != 0) begin
+ T4 = -ved_jct*ved_jct*ved_jct;
+ T4a = CGIDL_i + abs(T4) + 1.0e-5;
+ T5 = hypsmooth(T4/T4a, 1.0e-6) - 1.0e-6;
+ T6 = AGIDL_i * Weff0 * T3 * lexp(-T2) * T5;
+ end else begin
+ T6 = AGIDL_i * Weff0 * T3 * lexp(-T2) * vds_noswap;
+ end
+ end
+
+ if (sigvds > 0.0) begin
+ igidl = T6;
+ end else begin
+ igisl = T6;
+ end
+
+ // GISL
+ if ((AGISL_i <= 0.0) || (BGISL_t <= 0.0)) begin
+ T6 = 0.0;
+ end else begin
+ T1 = (-vgs_noswap - EGISL_i + vfbsd) / T0;
+ T1 = hypsmooth(T1, 1.0e-2);
+ T2 = BGISL_t / (T1 + 1.0e-3);
+ T3 = lexp(PGISL_i * lln(T1));
+ if (BULKMOD != 0) begin
+ T4 = -ves_jct * ves_jct * ves_jct;
+ T4a = CGISL_i + abs(T4) + 1.0e-5;
+ T5 = hypsmooth(T4/T4a, 1.0e-6) - 1.0e-6;
+ T6 = AGISL_i * Weff0 * T3 * lexp(-T2) * T5;
+ end else
+ T6 = AGISL_i * Weff0 * T3 * lexp(-T2) * (-vds_noswap);
+ end
+
+ if (sigvds > 0.0) begin
+ igisl = T6;
+ end else begin
+ igidl = T6;
+ end
+
+ end // End of GIDLMOD
+
+ // Junction Current
+ if (BULKMOD != 0) begin
+ // Source-Side Junction Current
+ if (Isbs > 0.0) begin
+ if (ves_jct < VjsmRev) begin
+ T0 = ves_jct / Nvtms;
+ T1 = lexp(T0) - 1.0;
+ T2 = IVjsmRev + SslpRev * (ves_jct - VjsmRev);
+ Ies = T1 * T2;
+ end else if (ves_jct <= VjsmFwd) begin
+ T0 = ves_jct / Nvtms;
+ T1 = (BVS + ves_jct) / Nvtms;
+ T2 = lexp(-T1);
+ Ies = Isbs * (lexp(T0) + XExpBVS - 1.0 - XJBVS * T2);
+ end else begin
+ Ies = IVjsmFwd + SslpFwd * (ves_jct - VjsmFwd);
+ end
+ end else begin
+ Ies = 0.0;
+ end
+
+ // Source-Side Junction Tunneling Current
+ if (JTSS_t > 0.0) begin
+ if ((VTSS - ves_jct) < (VTSS * 1.0e-3)) begin
+ T0 = -ves_jct / Vtm0 / NJTS_t;
+ T1 = lexp(T0 * 1.0e3) - 1.0;
+ Ies = Ies - ASEJ * JTSS_t * T1;
+ end else begin
+ T0 = -ves_jct / Vtm0 / NJTS_t;
+ T1 = lexp(T0 * VTSS / (VTSS - ves_jct)) - 1.0;
+ Ies = Ies - ASEJ * JTSS_t * T1;
+ end
+ end
+
+ if (JTSSWS_t > 0.0) begin
+ if ((VTSSWS - ves_jct) < (VTSSWS * 1.0e-3)) begin
+ T0 = -ves_jct / Vtm0 / NJTSSW_t;
+ T1 = lexp(T0 * 1.0e3) - 1.0;
+ Ies = Ies - PSEJ * JTSSWS_t * T1;
+ end else begin
+ T0 = -ves_jct / Vtm0 / NJTSSW_t;
+ T1 = lexp(T0 * VTSSWS / (VTSSWS - ves_jct)) - 1.0;
+ Ies = Ies - PSEJ * JTSSWS_t * T1;
+ end
+ end
+
+ if (JTSSWGS_t > 0.0) begin
+ if ((VTSSWGS - ves_jct) < (VTSSWGS * 1.0e-3)) begin
+ T0 = -ves_jct / Vtm0 / NJTSSWG_t;
+ T1 = lexp(T0 * 1.0e3) - 1.0;
+ Ies = Ies - Weff0 * NFINtotal * JTSSWGS_t * T1;
+ end else begin
+ T0 = -ves_jct / Vtm0 / NJTSSWG_t;
+ T1 = lexp(T0 * VTSSWGS / (VTSSWGS - ves_jct)) - 1.0;
+ Ies = Ies - Weff0 * NFINtotal * JTSSWGS_t * T1;
+ end
+ end
+
+ // Drain-Side Junction Current
+ if (Isbd > 0.0) begin
+ if (ved_jct < VjdmRev) begin
+ T0 = ved_jct / Nvtmd;
+ T1 = lexp(T0) - 1.0;
+ T2 = IVjdmRev + DslpRev * (ved_jct - VjdmRev);
+ Ied = T1 * T2;
+ end else if (ved_jct <= VjdmFwd) begin
+ T0 = ved_jct / Nvtmd;
+ T1 = (BVD + ved_jct) / Nvtmd;
+ T2 = lexp(-T1);
+ Ied = Isbd * (lexp(T0) + XExpBVD - 1.0 - XJBVD * T2);
+ end else
+ Ied = IVjdmFwd + DslpFwd * (ved_jct - VjdmFwd);
+ end else
+ Ied = 0.0;
+
+ // Drain-Side Junction Tunneling Current
+ if (JTSD_t > 0.0) begin
+ if ((VTSD - ved_jct) < (VTSD * 1.0e-3)) begin
+ T0 = -ved_jct / Vtm0 / NJTSD_t;
+ T1 = lexp(T0 * 1.0e3) - 1.0;
+ Ied = Ied - ADEJ * JTSD_t * T1;
+ end else begin
+ T0 = -ved_jct / Vtm0 / NJTSD_t;
+ T1 = lexp(T0 * VTSD/ (VTSD - ved_jct)) - 1.0;
+ Ied = Ied - ADEJ * JTSD_t * T1;
+ end
+ end
+ if (JTSSWD_t > 0.0) begin
+ if ((VTSSWD - ved_jct) < (VTSSWD * 1.0e-3)) begin
+ T0 = -ved_jct / Vtm0 / NJTSSWD_t;
+ T1 = lexp(T0 * 1.0e3) - 1.0;
+ Ied = Ied - PDEJ * JTSSWD_t * T1;
+ end else begin
+ T0 = -ved_jct / Vtm0 / NJTSSWD_t;
+ T1 = lexp(T0 * VTSSWD / (VTSSWD - ved_jct)) - 1.0;
+ Ied = Ied - PDEJ * JTSSWD_t * T1;
+ end
+ end
+ if (JTSSWGD_t > 0.0) begin
+ if ((VTSSWGD - ved_jct) < (VTSSWGD * 1.0e-3)) begin
+ T0 = -ved_jct / Vtm0 / NJTSSWGD_t;
+ T1 = lexp(T0 * 1.0e3) - 1.0;
+ Ied = Ied - Weff0 * NFINtotal * JTSSWGD_t * T1;
+ end else begin
+ T0 = -ved_jct / Vtm0 / NJTSSWGD_t;
+ T1 = lexp(T0 * VTSSWGD / (VTSSWGD - ved_jct)) - 1.0;
+ Ied = Ied - Weff0 * NFINtotal * JTSSWGD_t * T1;
+ end
+ end
+
+ // Junction Capacitance (No Swapping)
+ // Source-Substrate Junction
+ `BSIM6JunctnCap(ves_jct, Czbs, PBS_t, SJS, MJS, MJS2, Qesj1)
+ `BSIM6JunctnCap(ves_jct, Czbssw, PBSWS_t, SJSWS, MJSWS, MJSWS2, Qesj2)
+ `BSIM6JunctnCap(ves_jct, Czbsswg, PBSWGS_t, SJSWGS, MJSWGS, MJSWGS2, Qesj3)
+ Qesj = Qesj1 + Qesj2 + Qesj3;
+
+ // Drain-Substrate Junction
+ `BSIM6JunctnCap(ved_jct, Czbd, PBD_t, SJD, MJD, MJD2, Qedj1)
+ `BSIM6JunctnCap(ved_jct, Czbdsw, PBSWD_t, SJSWD, MJSWD, MJSWD2, Qedj2)
+ `BSIM6JunctnCap(ved_jct, Czbdswg, PBSWGD_t, SJSWGD, MJSWGD, MJSWGD2, Qedj3)
+ Qedj = Qedj1 + Qedj2 + Qedj3;
+
+ end // BULKMOD=0
+
+ Qes = Qesj + csbox * ves_jct;
+ Qed = Qedj + cdbox * ved_jct;
+
+ // Gate-to-Substrate Parasitic Capacitance
+ // Bias Independent Component
+ Qeg = cgbox * devsign * V(e, `GateEdgeNode);
+ if (BULKMOD != 0) begin
+ // Bias Dependent Component
+ T2 = devsign * V(`GateEdgeNode, e);
+ T3 = T2 - deltaPhi + Eg / 2.0 + phib - DELVFBACC;
+ T0 = T3 + `DELTA_1;
+ vge_overlap = 0.5 * (T0 + sqrt(T0 * T0 + 4.0 * `DELTA_1));
+ Qeg = Qeg - NFINtotal * LeffCV * (CGBL_i * (T3 - vge_overlap + 0.5 * CKAPPAB_i * ( sqrt(1.0 + 4.0 * vge_overlap / CKAPPAB_i) - 1.0 )));
+ end
+
+ // Generation-Recombination Component
+ T0 = vds;
+ T1 = T0 * (AIGEN_i + BIGEN_i * T0 * T0);
+ idsgen = HFIN * TFIN * (Leff - 2.0 * LINTIGEN_i) * igentemp * T1;
+
+ // NQS Gate Resistance (Ref: BSIM4 Model)
+ T0 = ueff * coxeff * Weff0 / Leff;
+
+ `ifdef __NQSMOD1__
+ if (NQSMOD == 1 && XRCRG1_i != 0) begin
+ IdovVds = beta * ids0_ov_dqi * Moc / (Dmob * Dvsat * Dr);
+ gcrg = NFINtotal * XRCRG1_i * (IdovVds + XRCRG2_i * Vtm * T0);
+ end
+ `endif
+
+ `ifdef __NQSMOD2__
+ if (NQSMOD == 2) begin
+ IdovVds = beta * ids0_ov_dqi * Moc / (Dmob * Dvsat * Dr);
+ gcrg = NFINtotal * XRCRG1_i * (IdovVds + XRCRG2_i * Vtm * T0);
+ gtau = gcrg / (cox * Weff0 * Leff);
+ end
+ `endif
+
+ // *** Multiply all current and charge components by NFINtotal ***
+ // Note: Do not multiply ids, qg, qs, qd, qb, Ies, Ied, Qbs, Qbd with NFINtotal
+ // since it is already considered.
+
+ igidl = NFINtotal * igidl;
+ igisl = NFINtotal * igisl;
+ igcd = NFINtotal * igcd;
+ igcs = NFINtotal * igcs;
+ igs = NFINtotal * igs;
+ igd = NFINtotal * igd;
+ igbinv = NFINtotal * igbinv;
+ igbacc = NFINtotal * igbacc;
+ idsgen = NFINtotal * idsgen;
+
+ // Gate to Body Tunneling Current Empirical Partition for BULKMOD = 0
+ igbs = 0.0;
+ igbd = 0.0;
+ if (BULKMOD == 0) begin
+ igbs = (igbinv + igbacc) * wf;
+ igbd = (igbinv + igbacc) * wr;
+ end
+
+ // Noise Models
+ Esatnoi = 2.0 * VSAT_a / ueff; // Thermal noise and flicker noise
+
+ // Flicker Noise (Ref: BSIM4 Model from K. K. Hung et al. TED 1990)
+ if (NOIA > 0.0 || NOIB > 0.0 || NOIC > 0.0) begin
+ Leffnoi = Leff - 2.0 * LINTNOI_i;
+ Leffnoisq = Leffnoi * Leffnoi;
+ if (EM <= 0.0) begin
+ DelClm = 0.0;
+ end else begin
+ T0 = (diffVds / litl + EM) / Esatnoi;
+ DelClm = litl * lln(T0);
+ if (DelClm < 0.0) begin
+ DelClm = 0.0;
+ end
+ end
+ T1 = `q * `q * `q * Vtm * abs(ids) * ueff;
+ T2 = 1.0e10 * coxeff * Leffnoisq;
+ N0 = coxeff * qis / `q;
+ Nl = coxeff * qid / `q;
+ Nstar = Vtm / `q * (coxeff + CIT_a);
+ T3 = NOIA * lln((N0 + Nstar) / (Nl + Nstar));
+ T4 = NOIB * (N0 - Nl);
+ T5 = 0.5 * NOIC * (N0 * N0 - Nl * Nl);
+ T6 = `q * Vtm * ids * ids;
+ T7 = 1.0e10 * Leffnoisq * Weff0 * NFINtotal;
+ T8 = NOIA + NOIB * Nl + NOIC * Nl * Nl;
+ T9 = (Nl + Nstar) * (Nl + Nstar);
+ Ssi = T1 / T2 * (T3 + T4 + T5) + T6 / T7 * DelClm * T8 / T9;
+ T10 = NOIA * `q * Vtm;
+ T11 = Weff0 * NFINtotal * Leffnoi * 1.0e10 * Nstar * Nstar;
+ Swi = T10 / T11 * ids * ids;
+ T1 = Swi + Ssi;
+ if (T1 > 0.0) begin
+ FNPowerAt1Hz = (Ssi * Swi) / T1;
+ end else begin
+ FNPowerAt1Hz = 0.0;
+ end
+ end else begin
+ FNPowerAt1Hz = 0.0;
+ end
+
+ // Thermal Noise
+ case (TNOIMOD)
+ 0 : begin // Charge-based model (BSIM4 - TNOIMOD=0)
+ T0 = ueff * qinv;
+ T1 = T0 * Rdsi + Leff * Leff;
+ Gtnoi = (T0 / T1) * NTNOI_i;
+ sid = 4.0 * Vtm * `q * Gtnoi;
+ end
+ 1: begin // Correlated Thermal Noise by Navid, November 2013, Reference BSIMSOI4.5.0
+ `ifdef __TNOIMOD1__
+ Abulk = 1.0;
+ Vgst2Vtm = KSATIV_a * (qis + 2.0 * Vtm);
+ etaa = 1.0 - Vdseff * Abulk / Vgst2Vtm ;
+ T0 = 1.0 - etaa;
+ T1 = 1.0 + etaa;
+ T2 = T1 + 2.0 * Abulk * Vtm / (qia + 1.0e-10);
+ T3 = T2 * T2;
+ T4 = T0 * T0;
+ T5 = T3 * T3;
+ T6 = 1.0 / (1.0 + Vdseff / EsatL) ;
+ gamma = T6 * (0.5 * T1 + T0 * T0 / (6.0 * T2));
+ 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 = qia / EsatL;
+ T8 = T8 * T8;
+ npart_c = RNOIC * (1.0 + T8 * TNOIC * Leff);
+ T9 = gamma * delta ;
+ if (T9 > 0.0) begin
+ ctnoi = epsilon / sqrt( gamma * delta) * (2.5316 * npart_c);
+ end else begin
+ ctnoi = 1.0;
+ end
+ if (ctnoi > 1) begin
+ ctnoi = 1.0;
+ end
+ if (ctnoi < 0) begin
+ ctnoi = 0.0;
+ end
+ npart_beta = RNOIA * (1.0 + T8 * TNOIA * Leff);
+ npart_theta = RNOIB * (1.0 + T8 * TNOIB * Leff);
+ gamma = gamma * (3.0 * npart_beta * npart_beta);
+ delta = delta * (3.75 * npart_theta * npart_theta);
+ T9 = qia * 0.5 * T1;
+ gche = beta * T9 * T6;
+ noiGd0 = NFINtotal * beta * qia / (1.0 + gche * Rdsi);
+ GammaGd0 = gamma * noiGd0;
+ sid = 4.0 * Vtm * `q * GammaGd0;
+ C0 = NFINtotal * coxeff * WeffCV0 * LeffCV;
+ if (gamma > 0.0 && delta > 0.0) begin
+ sf = (noiGd0 + 1.0e-15) / sqrt(delta / gamma);
+ end else begin
+ sf = 0.0;
+ end
+ `else
+ $strobe("[Warning!] Although the model selector TNOIMOD is set to 1, the new correlated thermal noise model is not activated. Please uncomment \"`define __TNOIMOD1__\" in the bsimcmg.va.");
+ `endif
+ end
+ endcase
+
+ // Source and Drain Conductance for Thermal Noise Contribution
+ if (RDSMOD != 2) begin
+ gspr = 1.0 / Rsource; // Note: gspr considers all fins
+ gdpr = 1.0 / Rdrain; // Note: gdpr considers all fins
+ end
+
+ // Loading Ids, Gate and Drain charges
+ `ifdef __NQSMOD2__
+ if (sigvds > 0.0) begin
+ I(di, si) <+ devsign * ids;
+ end else begin
+ I(si, di) <+ devsign * ids;
+ end
+
+ if (NQSMOD == 2) begin
+ I(`IntrinsicGate, si) <+ devsign * gtau * -V(q);
+ I(di, si) <+ devsign * xdpart * gtau * V(q);
+ end else begin // Quasi-static Stamping (Normal case)
+ I(di, si) <+ devsign * ddt(qd);
+ I(`IntrinsicGate, si) <+ devsign * ddt(qg);
+ end
+ `else
+ if (sigvds > 0.0) begin
+ I(di, si) <+ devsign * ids;
+ end else begin
+ I(si, di) <+ devsign * ids;
+ end
+ I(di, si) <+ devsign * ddt(qd);
+ I(`IntrinsicGate, si) <+ devsign * ddt(qg);
+ `endif
+
+ // Loading Other Currents
+ if (sigvds > 0.0) begin
+ I(di, si) <+ devsign * idsgen;
+ I(`IntrinsicGate, si) <+ devsign * (igcs + igs);
+ I(`IntrinsicGate, di) <+ devsign * (igcd + igd);
+ if (BULKMOD != 0) begin
+ I(di, e) <+ devsign * (igidl + Iii);
+ I(si, e) <+ devsign * igisl;
+ I(`IntrinsicGate, e) <+ devsign * (igbinv + igbacc);
+ end else begin
+ I(di, si) <+ devsign * (igidl + Iii);
+ I(si, di) <+ devsign * igisl;
+ end
+ end else begin
+ I(si, di) <+ devsign * idsgen;
+ I(`IntrinsicGate, di) <+ devsign * (igcs + igs);
+ I(`IntrinsicGate, si) <+ devsign * (igcd + igd);
+ if (BULKMOD != 0) begin
+ I(si, e) <+ devsign * (igidl + Iii);
+ I(di, e) <+ devsign * igisl;
+ I(`IntrinsicGate, e) <+ devsign * (igbinv + igbacc);
+ end else begin
+ I(si, di) <+ devsign * (igidl + Iii);
+ I(di, si) <+ devsign * igisl;
+ end
+ end
+ if (BULKMOD == 0) begin
+ I(`IntrinsicGate, si) <+ devsign * igbs;
+ I(`IntrinsicGate, di) <+ devsign * igbd;
+ end
+
+ if (BULKMOD != 0) begin
+ I(e, si) <+ devsign * Ies;
+ I(e, di) <+ devsign * Ied;
+ end
+ I(e, si) <+ devsign * ddt(Qes);
+ I(e, di) <+ devsign * ddt(Qed);
+ I(e, `GateEdgeNode) <+ devsign * ddt(Qeg);
+
+ // Loading other charges
+ I(`GateEdgeNode, si) <+ ddt(qgs_parasitic);
+ I(`GateEdgeNode, di) <+ ddt(qgd_parasitic);
+ I(d, s) <+ ddt(qds_fr);
+ if (CGEOMOD == 1) begin
+ I(`GateEdgeNode, s) <+ ddt(qgs_fr);
+ I(`GateEdgeNode, d) <+ ddt(qgd_fr);
+ end
+
+ // Accumulation Charge for Bulk FET
+ if (BULKMOD != 0) begin
+ I(`IntrinsicGate, si) <+ devsign * ddt(qg_acc);
+ I(e, si) <+ devsign * ddt(qb_acc);
+ end
+
+ // External S/D Resistance
+ if (RDSMOD == 2) begin
+ V(d, di) <+ 0.0;
+ V(s, si) <+ 0.0;
+ end else begin
+ I(d, di) <+ V(d, di) / Rdrain;
+ I(s, si) <+ V(s, si) / Rsource;
+ end
+
+ // NQSMOD1 Gate Resistance Model
+ `ifdef __NQSMOD1__
+ if (NQSMOD == 1 && XRCRG1_i != 0)
+ I(`GateEdgeNode, gi) <+ V(`GateEdgeNode, gi) * gcrg;
+ else
+ V(`GateEdgeNode, gi) <+ 0.0;
+ `endif
+
+ // NQSMOD2 BSIM4 Charge Deficit Model
+ `ifdef __NQSMOD2__
+ if (NQSMOD ==2) begin
+ I(q) <+ ddt(qg - qb);
+ I(q) <+ V(q) * gtau;
+ I(q) <+ ddt(V(q));
+ end else
+ V(q) <+ 0.0;
+ `endif
+
+ // Gate Electrode Resistance
+ `ifdef __RGATEMOD__
+ if (RGATEMOD != 0)
+ I(g, ge) <+ V(g, ge) * ggeltd;
+ else
+ V(g, ge) <+ 0.0;
+ `endif
+
+ // Flicker Noise
+ I(di,si) <+ flicker_noise(FNPowerAt1Hz, EF, "flicker");
+
+ // Thermal noise for parasitics
+ if (RDSMOD != 2) begin
+ I(d, di) <+ white_noise(4.0 * Vtm * `q * gdpr, "thermal");
+ I(s, si) <+ white_noise(4.0 * Vtm * `q * gspr, "thermal");
+ end
+
+ `ifdef __RGATEMOD__
+ if (RGATEMOD != 0)
+ I(g, ge) <+ white_noise(4.0 * Vtm * `q * ggeltd, "thermal");
+ `endif
+
+ // Channel thermal noise and induced gate noise stamping
+ // Implementation of correlated noise follows C. C. McAndrew, WCM 2005
+ if (TNOIMOD == 0) begin
+ I(di, si) <+ white_noise(sid, "thermal");
+ `ifdef __TNOIMOD1__
+ V(N) <+ 0.0;
+ `endif
+ end else begin
+ `ifdef __TNOIMOD1__
+ I(di,si) <+ white_noise(sid * abs(1.0 - ctnoi * ctnoi), "thermal");
+ I(di,si) <+ ctnoi * V(N) * sf * SCALEN ;
+ if (gamma > 0 && delta > 0) begin
+ I(N) <+ V(N) * sf * SCALEN;
+ I(N) <+ white_noise(sid/(sf*sf*SCALEN*SCALEN));
+ end else begin
+ I(N) <+ V(N) ;
+ end
+ I(`IntrinsicGate,si) <+ ddt(0.5 * C0 * SCALEN * V(N));
+ I(`IntrinsicGate,di) <+ ddt(0.5 * C0 * SCALEN * V(N));
+ `else
+ $strobe("[Warning!] Although the model selector TNOIMOD is set to 1, the new correlated thermal noise model is not activated. Please uncomment \"`define __TNOIMOD1__\" in the bsimcmg.va.");
+ `endif
+ end
+
+ // Gate Current Shot Noise
+ if (IGCMOD != 0) begin
+ if (sigvds > 0) begin
+ I(`IntrinsicGate, si) <+ white_noise(2.0 * `q * abs(igcs + igs), "shot");
+ I(`IntrinsicGate, di) <+ white_noise(2.0 * `q * abs(igcd + igd), "shot");
+ end else begin
+ I(`IntrinsicGate, di) <+ white_noise(2.0 * `q * abs(igcs + igs), "shot");
+ I(`IntrinsicGate, si) <+ white_noise(2.0 * `q * abs(igcd + igd), "shot");
+ end
+ end
+
+ if (IGBMOD != 0) begin
+ if (BULKMOD != 0) begin
+ I(`IntrinsicGate, e) <+ white_noise(2.0 * `q * abs(igbinv + igbacc), "shot");
+ end else begin
+ I(`IntrinsicGate, si) <+ white_noise(2.0 * `q * abs(igbs), "shot");
+ I(`IntrinsicGate, di) <+ white_noise(2.0 * `q * abs(igbd), "shot");
+ end
+ end
+
+ // Self Heating
+ `ifdef __SHMOD__
+ if (SHMOD != 0 && RTH0 > 0) begin
+ if (RDSMOD != 2) begin
+ Pwr(ith_branch) <+ -(devsign * sigvds * V(di,si) * ids + V(d,di) * V(d,di) / Rdrain + V(s,si) * V(s,si) / Rsource);
+ end else begin
+ Pwr(ith_branch) <+ -(devsign * sigvds * V(di,si) * ids );
+ end
+ end
+ Pwr(rth_branch) <+ Temp(rth_branch) * gth;
+ Pwr(rth_branch) <+ ddt(Temp(rth_branch) * cth);
+ `endif
+
+ // Operating-Point information
+ `ifdef __OPINFO__
+ // W & L
+ WEFF = Weff0; // Effective width for IV
+ LEFF = Leff; // Effective length for IV
+ WEFFCV = WeffCV0; // Effective width for CV
+ LEFFCV = LeffCV; // Effective length for CV
+
+ // Currents
+ IDS = devsign * ids; // Intrinsic Drain Current (Electrical)
+ if (sigvds > 0) begin // Total Source/Drain Currents (Physical)
+ if (BULKMOD != 0) begin
+ IDEFF = IDS + devsign * idsgen - devsign * (igd + igcd) + devsign * (Iii + igidl) - devsign * Ied;
+ ISEFF = -IDS - devsign * idsgen - devsign * (igs + igcs) + devsign * (igisl) - devsign * Ies;
+ end else begin
+ IDEFF = IDS + devsign * idsgen - devsign * (igd + igcd + igbd) + devsign * (Iii + igidl - igisl);
+ ISEFF = -IDS - devsign * idsgen - devsign * (igs + igcs + igbs) + devsign* (igisl - igidl);
+ end
+ end else begin
+ if (BULKMOD != 0) begin
+ IDEFF = -IDS - devsign * idsgen - devsign * (igs + igcs) + devsign * (igisl) - devsign * Ied;
+ ISEFF = IDS + devsign * idsgen - devsign * (igd + igcd) + devsign * (Iii + igidl) - devsign * Ies;
+ end else begin
+ IDEFF = -IDS - devsign * idsgen - devsign * (igs + igcs + igbd) + devsign * (igisl - igidl);
+ ISEFF = IDS + devsign * idsgen - devsign * (igd + igcd + igbs) + devsign * (Iii + igidl - igisl);
+ end
+ end
+
+ if (BULKMOD == 0) begin // Total Gate Current
+ IGTOT = devsign * (igs + igd + igcs + igcd + igbs + igbd);
+ end else begin
+ IGTOT = devsign * (igs + igd + igcs + igcd + igbacc + igbinv);
+ end
+
+ IDSGEN = sigvds * devsign * idsgen; // Generation-Recombination Current (Physical)
+ III = devsign * Iii; // Impact Ionization Current
+ if (sigvds > 0) begin
+ IGIDL = devsign * igidl; // GIDL Current (Physical)
+ IGISL = devsign * igisl; // GISL Current (Physical)
+ end else begin
+ IGIDL = devsign * igisl; // GIDL Current (Physical)
+ IGISL = devsign * igidl; // GISL Current (Physical)
+ end
+
+ if (BULKMOD != 0) begin
+ IJSB = -devsign * Ies; // Source-Body Junction Current (Physical)
+ IJDB = -devsign * Ied; // Drain-Body Junction Current (Physical)
+ end else begin
+ IJSB = 0.0;
+ IJDB = 0.0;
+ end
+
+ if (BULKMOD != 0) begin
+ ISUB = -III - IGIDL - IGISL - IJSB - IJDB - devsign * (igbinv + igbacc); // Substrate Current
+ end else begin
+ ISUB = 0.0;
+ end
+
+ // Misc Variables
+ BETA = beta; // Drain Current prefactor per fin per finger
+ VDSSAT = Vdsat; // Drain-Source saturation Voltage
+ if (NGATE_i > 0) // Flatband Voltage
+ VFB = -devsign * (phib + Vtm * lln(NGATE_i / ni));
+ else
+ VFB = PHIG_i - (EASUB + 0.5 * Eg + devsign * phib);
+
+ // Threshold Voltage Calculation
+ q0 = 10.0 * Vtm / rc + 2.0 * qbs;
+ T1 = Vtm * (Vtm + q0);
+ T2 = cox * cox * T1;
+ T3 = 2.0 * `q * ni * epssub * Vtm;
+ VTH = VFB + devsign * (Vtm * lln(T2 / T3) + dvch_qm + phib + qbs + Vtm + dvth_all - DELVTRAND);
+
+ // Conductances
+ GM = ddx(IDS,V(`IntrinsicGate)); // Transconductance
+ GDS = ddx(IDS,V(di)); // Output Conductance
+ if (BULKMOD != 0)
+ GMBS = ddx(IDS,V(e)); // Body Transconductance
+ else
+ GMBS = 0.0;
+
+ // Intrinsic Charges (Physical) (Sriram: Not accurate for NQSMOD= 2 and 3)
+ QGI = devsign * qg + devsign * qg_acc;
+ QDI = devsign * qd;
+ QSI = devsign * qs;
+ QBI = devsign * (qb + qb_acc);
+
+ // Total Charges (Sriram: Not accurate for NQSMOD= 2 and 3)
+ QG = devsign * qg + qgs_parasitic + qgd_parasitic + (CGEOMOD == 1 ? qgs_fr + qgd_fr : 0) + devsign * qg_acc - devsign * Qeg;
+ QD = devsign * qd - qgd_parasitic - (CGEOMOD == 1 ? qgd_fr : 0) - devsign * Qed;
+ QS = devsign * qs - qgs_parasitic - (CGEOMOD == 1 ? qgs_fr : 0) - devsign * Qes;
+ QB = devsign * (qb + qb_acc) + devsign * (Qeg + Qes + Qed);
+
+ // Intrinsic Capacitances (Physical)
+ CGGI = ddx(QGI, V(`IntrinsicGate));
+ CGSI = -ddx(QGI, V(si));
+ CGDI = -ddx(QGI, V(di));
+ CGEI = -ddx(QGI, V(e));
+
+ CSGI = -ddx(QSI, V(`IntrinsicGate));
+ CSDI = -ddx(QSI, V(di));
+ CSSI = ddx(QSI, V(si));
+ CSEI = -ddx(QSI, V(e)); // Should be zero everywhere
+
+ CDGI = -ddx(QDI, V(`IntrinsicGate));
+ CDDI = ddx(QDI, V(di));
+ CDSI = -ddx(QDI, V(si));
+ CDEI = -ddx(QDI, V(e));
+
+ CEGI = -ddx(QBI, V(`IntrinsicGate));
+ CEDI = -ddx(QBI, V(di)); // Should be zero everywhere
+ CESI = -ddx(QBI, V(si)); // Should be zero everywhere
+ CEEI = ddx(QBI, V(e));
+
+ // Total Capacitances
+ CGG = ddx(QG, V(`IntrinsicGate));
+ CGS = -ddx(QG, V(si));
+ CGD = -ddx(QG, V(di));
+ CGE = -ddx(QG, V(e));
+
+ CSG = -ddx(QS, V(`IntrinsicGate));
+ CSD = -ddx(QS, V(di));
+ CSS = ddx(QS, V(si));
+ CSE = -ddx(QS, V(e));
+
+ CDG = -ddx(QD, V(`IntrinsicGate));
+ CDD = ddx(QD, V(di));
+ CDS = -ddx(QD, V(si));
+ CDE = -ddx(QD, V(e));
+
+ CEG = -ddx(QB, V(`IntrinsicGate));
+ CED = -ddx(QB, V(di));
+ CES = -ddx(QB, V(si));
+ CEE = ddx(QB, V(e));
+
+ // Total extrinsic capacitance
+ CGSEXT = -ddx(qgs_parasitic + (CGEOMOD == 1 ? qgs_fr : 0),V(si)); // Gate-Source Overlap + outer fringing
+ CGDEXT = -ddx(qgd_parasitic + (CGEOMOD == 1 ? qgd_fr : 0),V(di)); // Gate-Drain Overlap + outer fringing
+ CGBOV = -devsign * ddx(Qeg,V(e)); // Gate-Body Overlap
+
+ // Total of Junction Capacitance and Source/Drain-Body Overlap Capacitance
+ CJST = -devsign * ddx(Qes, V(si));
+ CJDT = -devsign * ddx(Qed, V(di));
+
+ RSGEO = RSourceGeo; // External bias independent Source Resistance
+ RDGEO = RDrainGeo; // External bias independent Drain Resistance
+ CFGEO = Cfr_geo; // Geometric Parasitic Cap for CGEOMOD=1
+
+ // Output for Self-Heating Temperature
+ T_TOTAL_K = DevTemp;
+ T_TOTAL_C = DevTemp - `P_CELSIUS0;
+ T_DELTA_SH = Temp(t);
+
+ `ifdef __DEBUG__
+ // Individual Gate Current Components
+ IGS = devsign * igs;
+ IGD = devsign * igd;
+ IGCS = devsign * igcs;
+ IGCD = devsign * igcd;
+ if (BULKMOD == 0) begin
+ IGBS = devsign * igbs;
+ IGBD = devsign * igbd;
+ end else begin
+ IGBINV = devsign * igbinv;
+ IGBACC = devsign * igbacc;
+ end
+
+ DIDSDVG = devsign * sigvds * ddx(ids, V(`IntrinsicGate));
+ DIDSDVS = devsign * sigvds * ddx(ids, V(si));
+ DIDSDVD = devsign * sigvds * ddx(ids, V(di));
+ `ifdef __SHMOD__
+ DIDSDVTH = devsign * sigvds * ddx(ids, Temp(t));
+ `endif
+ DIGSDVG = devsign * ddx(igs + igcs, V(`IntrinsicGate));
+ DIGSDVS = devsign * ddx(igs + igcs, V(si));
+ DIGSDVD = devsign * ddx(igs + igcs, V(di));
+ `ifdef __SHMOD__
+ DIGSDVTH = devsign * ddx(igs + igcs, Temp(t));
+ `endif
+ DIGDDVG = devsign * ddx(igd + igcd, V(`IntrinsicGate));
+ DIGDDVS = devsign * ddx(igd + igcd, V(si));
+ DIGDDVD = devsign * ddx(igd + igcd, V(di));
+ `ifdef __SHMOD__
+ DIGDDVTH = devsign * ddx(igd + igcd, Temp(t));
+ `endif
+ DIIIDVG = devsign * ddx(Iii, V(`IntrinsicGate));
+ DIIIDVS = devsign * ddx(Iii, V(si));
+ DIIIDVD = devsign * ddx(Iii, V(di));
+ `ifdef __SHMOD__
+ DIIIDVTH = devsign * ddx(Iii, Temp(t));
+ `endif
+ DIGIDLDVG = devsign * ddx(igidl, V(`IntrinsicGate));
+ DIGIDLDVS = devsign * ddx(igidl, V(si));
+ DIGIDLDVD = devsign * ddx(igidl, V(di));
+ `ifdef __SHMOD__
+ DIGIDLDVTH = devsign * ddx(igidl, Temp(t));
+ `endif
+ DIGISLDVG = devsign * ddx(igisl, V(`IntrinsicGate));
+ DIGISLDVS = devsign * ddx(igisl, V(si));
+ DIGISLDVD = devsign * ddx(igisl, V(di));
+ `ifdef __SHMOD__
+ DIGISLDVTH = devsign * ddx(igisl, Temp(t));
+ `endif
+
+ `ifdef __SHMOD__
+ CGT = ddx(QG, Temp(t));
+ CST = ddx(QS, Temp(t));
+ CDT = ddx(QD, Temp(t));
+ `endif
+ ITH = ids * vds;
+ `ifdef __SHMOD__
+ DITHDVTH = ddx(ITH, Temp(t));
+ `endif
+ DITHDVG = ddx(ITH, V(`IntrinsicGate));
+ DITHDVS = ddx(ITH, V(si));
+ DITHDVD = ddx(ITH, V(di));
+ `endif // __DEBUG__
+ `endif // __OPINFO__
+end // analog block ends
+//================================================
diff --git a/src/spicelib/devices/adms/bsimcmg/admsva/bsimcmg_cfringe.include b/src/spicelib/devices/adms/bsimcmg/admsva/bsimcmg_cfringe.include
new file mode 100644
index 000000000..ab31a2270
--- /dev/null
+++ b/src/spicelib/devices/adms/bsimcmg/admsva/bsimcmg_cfringe.include
@@ -0,0 +1,103 @@
+// ********************************************************
+// **** BSIM-CMG 110.0.0 released by Sourabh Khandelwal on 01/01/2016****/
+// * BSIM Common Multi-Gate Model Equations (Verilog-A)
+// ********************************************************
+//
+// ********************************************************
+// * Copyright 2016 Regents of the University of California.
+// * All rights reserved.
+// *
+// * Project Director: Prof. Chenming Hu.
+// * Authors: Sriramkumar V., Navid Paydavosi, Juan Duarte, Darsen Lu, Sourabh Khandelwal,
+// * Chung-Hsun Lin, Mohan Dunga, Shijing Yao,
+// * Ali Niknejad, Chenming Hu
+// ********************************************************
+// ********************************************************
+// * NONDISCLOSURE STATEMENT
+// 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 of California owns the copyright and grants users a perpetual,
+// irrevocable, worldwide, non-exclusive, royalty-free license with
+// respect to the software as set forth below.
+// 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 University of California 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
+// Agreed to on __Jan 01, 2016__________________
+// By: ___University of California, Berkeley____
+// ___Chenming Hu_____________________
+// ___Professor in Graduate School _______
+// ********************************************************
+
+// ********************************************************
+// Macro for the geometry-dependent fringing capacitance
+// model
+// ********************************************************
+`define Cfringe_2d(block_name, Hg, Hc, Lext, Wfin, Lc, Lg, Tox, Cf1, Cgg) \
+begin : block_name \
+ real Hr, Lr, Hgdelta, Lmax, y, x; \
+ real CcgSat, Cnon, TT1, Ccg1, r1cf, Rcf, Ccg2; \
+ real Ccg, C1, C2, C3, Cfglog, dcf, TT0; \
+ real TT2, Cfgsat, delta, Cfg; \
+ \
+ Hr = 2.3 + 0.2 * ((Hg) + (Tox)) / (Hc); \
+ Lr = 1.05; \
+ Hgdelta = abs((Hg) + (Tox) - (Hc)); \
+ Lmax = (Lext) * Lr; \
+ \
+ y = min((Hc), (Hg) + (Tox)); \
+ x = (Lext) / (Hr + 1.0); \
+ Cnon = 1.7e12; \
+ CcgSat = epssp * (y - x) / (Lext); \
+ TT1 = Cnon * CcgSat; \
+ if(TT1 > `EXPL_THRESHOLD) \
+ Ccg1 = CcgSat; \
+ else \
+ Ccg1 = 1.0 / Cnon * ln(1.0 + lexp(TT1)); \
+ \
+ r1cf = 0.5 * \
+ min((Hc) / ((Hg) + (Tox)), ((Hg) + (Tox)) / (Hc)); \
+ Rcf = Hgdelta * r1cf; \
+ Ccg2 = epssp * 2 / `M_PI * \
+ ln(((Lext) + 0.5 * `M_PI * Rcf) / (Lext)); \
+ \
+ Ccg = (Wfin) * (Ccg1 + Ccg2); \
+ \
+ x = Lmax / (Hg); \
+ C1 = 4.0 / (sqrt(2.0 * (x + 1)) * `M_PI); \
+ C2 = sqrt((Tox) * (Tox) + 2.0 * (Hg) * (Tox) + \
+ (Hg) * (Hg) * (x + 1)) * sqrt(x + 1) + (Tox) + \
+ (Hg) * x + (Hg); \
+ C3 = (Tox) * sqrt((x + 1) * (x + 4)) + Tox * (x + 2); \
+ Cfglog = epssp * (C1 * ln(C2 / C3) + 12.27); \
+ \
+ dcf = Hr * Lr; \
+ TT0 = sqrt(dcf * dcf + 1.0); \
+ TT1 = sqrt((dcf * dcf + 1) * ((dcf * (Tox)) * (dcf * (Tox)) + \
+ 2 * dcf * Lmax * (Tox) + (dcf * dcf + 1) * Lmax * Lmax)) \
+ + dcf * (Tox) + dcf * dcf * Lmax + Lmax; \
+ TT2 = (TT0 + 1.0) * (dcf * (Tox)); \
+ Cfgsat = 2.0 * epssp * sqrt(2) / `M_PI * (Cf1) * dcf \
+ / TT0 * ln(TT1 / TT2); \
+ \
+ delta = 1.2e-12; \
+ TT1 = Cfgsat - Cfglog - delta; \
+ Cfg = (Wfin) * (Cfgsat - 0.5 * (TT1 + \
+ sqrt(TT1 * TT1 + 4 * delta * Cfgsat))); \
+ Cgg = Ccg + Cfg; \
+end
+
+
+
+
diff --git a/src/spicelib/devices/adms/bsimcmg/admsva/bsimcmg_quasi_static_cv.include b/src/spicelib/devices/adms/bsimcmg/admsva/bsimcmg_quasi_static_cv.include
new file mode 100644
index 000000000..a0210a4f9
--- /dev/null
+++ b/src/spicelib/devices/adms/bsimcmg/admsva/bsimcmg_quasi_static_cv.include
@@ -0,0 +1,89 @@
+// ********************************************************
+// **** BSIM-CMG 110.0.0 released by Sourabh Khandelwal on 01/01/2016 ****/
+// * BSIM Common Multi-Gate Model Equations (Verilog-A)
+// ********************************************************
+//
+// ********************************************************
+// * Copyright 2016 Regents of the University of California.
+// * All rights reserved.
+// *
+// * Project Director: Prof. Chenming Hu.
+// * Authors: Sriramkumar V., Navid Paydavosi, Juan Duarte, Darsen Lu,
+// * Chung-Hsun Lin, Mohan Dunga, Shijing Yao,
+// * Ali Niknejad, Chenming Hu
+// ********************************************************
+// ********************************************************
+// * NONDISCLOSURE STATEMENT
+// 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 of California owns the copyright and grants users a perpetual,
+// irrevocable, worldwide, non-exclusive, royalty-free license with
+// respect to the software as set forth below.
+// 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 University of California 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
+// Agreed to on __Jan 01, 2016_________________
+// By: ___University of California, Berkeley____
+// ___Chenming Hu_____________________
+// ___Professor in Graduate School _______
+// ********************************************************
+// *** Quasi Static CV Model ***
+
+ T11 = (2.0*qia+nVtm)/DvsatCV;//G
+ qg = qia+dqi*dqi/(6.0*T11);//qc
+ qd = -0.5*(qia-(dqi/(6.0))*(1.0-(dqi/T11)*(1+dqi/(5.0*T11))));//qd
+ // Including CLM in qg and qd
+ inv_MclmCV = 1.0 / MclmCV;
+ qg = inv_MclmCV * qg + (MclmCV - 1.0) * qid;
+ qd = inv_MclmCV * inv_MclmCV * qd + 0.5 * (MclmCV - inv_MclmCV) * qid;
+
+//Calculating partition for NQSMOD2
+`ifdef __NQSMOD2__
+ if(NQSMOD == 2) xdpart = qd / qg;
+ else xdpart = 0;
+`endif
+
+ qs = -qg-qd; //from charge conservation qs = -qg-qd;
+ T6 = NFINtotal*WeffCV0 * LeffCV * coxeff;
+
+ qg = T6*qg;
+ qd = T6*qd;
+ qs = T6*qs;
+ qinv = qg ;
+ if(BULKMOD != 0) begin
+ T1 = NFINtotal * WeffCV0 * LeffCV_acc * cox_acc;
+ T7 = qi_acc_for_QM;//qbulk
+ T10 = T7 * T1;
+ qg_acc = - T10;
+ qb_acc = T10;
+ T1 = NFINtotal * WeffCV0 * LeffCV * cox;
+ T2 = qba - qi_acc_for_QM;
+ T10 = T1*T2;
+ qg_acc = qg_acc - T10;
+ qb_acc = qb_acc + T10;
+ T1 = NFINtotal * WeffCV0 * LeffCV * cox;
+ T2 = (nq-1.0)*0.5*(qia+(dqi*dqi/(6.0*T11)));
+ T10 = T1*T2;
+ qg_acc = qg_acc - T10;
+ qb_acc = qb_acc + T10;
+ end
+
+// if vds is negative, physical charge on qd is qs
+ if (sigvds < 0) begin
+ T1 = qd;
+ qd = qs;
+ qs = T1;
+ end
+
diff --git a/src/spicelib/devices/adms/bsimcmg/admsva/bsimcmg_rdsmod.include b/src/spicelib/devices/adms/bsimcmg/admsva/bsimcmg_rdsmod.include
new file mode 100644
index 000000000..892a126cc
--- /dev/null
+++ b/src/spicelib/devices/adms/bsimcmg/admsva/bsimcmg_rdsmod.include
@@ -0,0 +1,84 @@
+// *******************************************************
+// **** BSIM-CMG 110.0.0 released by Sourabh Khandelwal on 01/01/2016 ****/
+// * BSIM Common Multi-Gate Model Equations (Verilog-A)
+// ********************************************************
+//
+// ********************************************************
+// * Copyright 2016 Regents of the University of California.
+// * All rights reserved.
+// *
+// * Project Director: Prof. Chenming Hu.
+// * Authors: Sriramkumar V., Navid Paydavosi, Juan Duarte, Darsen Lu, Sourabh Khandelwal
+// * Chung-Hsun Lin, Mohan Dunga, Shijing Yao,
+// * Ali Niknejad, Chenming Hu
+// ********************************************************
+// ********************************************************
+// * NONDISCLOSURE STATEMENT
+// 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 of California owns the copyright and grants users a perpetual,
+// irrevocable, worldwide, non-exclusive, royalty-free license with
+// respect to the software as set forth below.
+// 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 University of California 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
+// Agreed to on __Jan 01, 2016_________________
+// By: ___University of California, Berkeley____
+// ___Chenming Hu_____________________
+// ___Professor in Graduate School _______
+// ********************************************************
+// Source-Drain Resistance Model
+case(RDSMOD)
+ 1: begin
+ Rdsi = 0.0;
+ Dr = 1.0;
+
+ T2 = vgs_noswap - vfbsd;
+ T3 = sqrt(T2 * T2 + 1.0e-1);
+ vgs_eff = 0.5 * (T2 + T3);
+ T4 = 1.0 + PRWGS_i * vgs_eff;
+ T1 = 1.0 / T4;
+ T0 = 0.5 * (T1 + sqrt(T1 * T1 + 0.01));
+ T5 = RSW_i * (1.0 + RSDR_a * lexp(0.5 * PRSDR * lln(V(si,s) * V(si,s) + 1.0E-6)));
+ Rsource = rdstemp * (RSourceGeo + (RSWMIN_i + T5 * T0) * WeffWRFactor);
+
+ T2 = vgd_noswap - vfbsd;
+ T3 = sqrt(T2 * T2 + 1.0e-1);
+ vgd_eff = 0.5 * (T2 + T3);
+ T4 = 1.0 + PRWGD_i * vgd_eff;
+ T1 = 1.0 / T4;
+ T0 = 0.5 * (T1 + sqrt(T1 * T1 + 0.01));
+ T5 = RDW_i * (1.0 + RDDR_a * lexp(0.5 * PRDDR * lln(V(di,d) * V(di,d) + 1.0E-6)));
+ Rdrain = rdstemp * (RDrainGeo + (RDWMIN_i + T5 * T0) * WeffWRFactor);
+ end
+ 0: begin
+ Rsource = RSourceGeo;
+ Rdrain = RDrainGeo;
+ T4 = 1.0 + PRWGS_i * qia;
+ T1 = 1.0 / T4;
+ T0 = 0.5 * (T1 + sqrt(T1 * T1 + 0.01));
+ Rdsi = rdstemp * (RDSWMIN_i + RDSW_i * T0) * WeffWRFactor;
+ Dr = 1.0 + (NFINtotal) * beta * ids0_ov_dqi / (Dmob * Dvsat) * Rdsi;
+ end
+ 2: begin
+ T4 = 1.0 + PRWGS_i * qia;
+ T1 = 1.0 / T4;
+ T0 = 0.5 * (T1 + sqrt(T1 * T1 + 0.01));
+ Rdsi = rdstemp * (RSourceGeo + RDrainGeo + RDSWMIN_i + RDSW_i * T0) * WeffWRFactor;
+ Dr = 1.0 + (NFINtotal) * beta * ids0_ov_dqi / (Dmob * Dvsat) * Rdsi;
+ Rsource = 0.0;
+ Rdrain = 0.0;
+ end
+endcase
diff --git a/src/spicelib/devices/adms/bsimcmg/admsva/common_defs.include b/src/spicelib/devices/adms/bsimcmg/admsva/common_defs.include
new file mode 100644
index 000000000..0d1ec67e5
--- /dev/null
+++ b/src/spicelib/devices/adms/bsimcmg/admsva/common_defs.include
@@ -0,0 +1,185 @@
+// ********************************************************
+// **** BSIM-CMG 110.0.0 released by Sourabh Khandelwal on 01/01/2016 ****/
+// * BSIM Common Multi-Gate Model Equations (Verilog-A)
+// ********************************************************
+//
+// ********************************************************
+// * Copyright 2016 Regents of the University of California.
+// * All rights reserved.
+// *
+// * Project Director: Prof. Chenming Hu.
+// * Authors: Sriramkumar V., Navid Paydavosi, Juan Duarte, Darsen Lu, Sourabh Khandelwal
+// * Chung-Hsun Lin, Mohan Dunga, Shijing Yao,
+// * Ali Niknejad, Chenming Hu
+// ********************************************************
+// ********************************************************
+// * NONDISCLOSURE STATEMENT
+// 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 of California owns the copyright and grants users a perpetual,
+// irrevocable, worldwide, non-exclusive, royalty-free license with
+// respect to the software as set forth below.
+// 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 University of California 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
+// Agreed to on __Jan 01, 2016__________________
+// By: ___University of California, Berkeley____
+// ___Chenming Hu_____________________
+// ___Professor in Graduate School _______
+// ********************************************************
+
+// Numerical Constants
+`define EXPL_THRESHOLD 80.0
+`define MAX_EXPL 5.540622384e34
+`define MIN_EXPL 1.804851387e-35
+`define N_MINLOG 1.0e-38
+`define MEXPQM 4
+`define DELTA_1 0.02
+`define DELTA_ASYMM 0.04
+`define CONSTCtoK (273.15)
+`define REFTEMP (300.15) /* 27 degrees C */
+
+
+// Model type definitions
+`define ntype 1
+`define ptype 0
+
+// Physical Constants
+`define q 1.60219e-19 // Coul
+`define EPS0 8.8542e-12 // F/m
+`define HBAR 1.05457e-34 // Joule-sec
+`define MEL 9.11e-31 // kg
+`define KboQ 8.617087e-5 // Joule / degree
+
+// Mathematical functions
+//`define SINH(x) (0.5 * (lexp(x) - lexp(-(x))))
+`define COSH(x) (0.5 * (lexp(x) + lexp(-(x))))
+//`define TANH(x) ((lexp(x) - lexp(-(x))) / (lexp(x) + lexp(-(x))))
+`define COT(x) ((x)>=`M_PI/2 ? 0 : ((x)<=-`M_PI/2 ? 0 : 1.0/tan(x)))
+
+// Junction capacitance
+//ex:(ves_jct, Czbs, PBS_t, SBS, MJS, MJS2, Qes1)
+`define BSIM6JunctnCap(vex, Cz, PB, SJ, MJ, MJ2, Qej) \
+ begin \
+ if (Cz > 0.0) begin \
+ T1 = vex / PB; \
+ if (T1 < 0.9) begin \
+ if (SJ > 0.0) begin /*second-step junction*/ \
+ vec = PB * (1.0 - lexp((1.0 / MJ) * lln(1.0/SJ))); /*Switch over voltage*/\
+ pb2 = PB * SJ * MJ2 / MJ / lexp(- (1.0 + MJ) * lln(1.0 - vec / PB)); /*PB for second doping region*/\
+ if (vex > vec) begin \
+ arg = 1.0 - T1; \
+ if (MJ == 0.5) sarg = 1.0 / sqrt(arg); \
+ else sarg = lexp(-MJ * lln(arg)); \
+ Qej = PB * Cz * (1.0 - arg * sarg) / (1.0 - MJ); \
+ end else begin /*vex < vec*/ \
+ arg = 1.0 - vec / PB; \
+ if (MJ == 0.5) sarg = 1.0 / sqrt(arg); \
+ else sarg = lexp(-MJ * lln(arg)); \
+ Qec = PB * Cz * (1.0 - arg * sarg) / (1.0 - MJ); \
+ arg = 1.0 - (vex - vec) / pb2; \
+ if (MJ2 == 0.5) sarg = 1.0 / sqrt(arg); \
+ else sarg = lexp(-MJ2 * lln(arg)); \
+ Qej = Qec + SJ * pb2 * Cz * (1.0 - arg * sarg) / (1.0 - MJ2); \
+ end \
+ end else begin /*single junction*/ \
+ arg = 1.0 - T1; \
+ if (MJ == 0.5) sarg = 1.0 / sqrt(arg); \
+ else sarg = lexp(-MJ * lln(arg)); \
+ Qej = PB * Cz * (1.0 - arg * sarg) / (1.0 - MJ); \
+ end \
+ end else begin /*vex/PB>=0.9*/ \
+ T2 = lexp(-MJ * lln(0.1)); \
+ T3 = 1.0 / (1.0-MJ); \
+ T4 = T2 * (T1 - 1.0) * (5.0 * MJ * (T1-1.0) + (1.0 + MJ) ); \
+ T5 = T3 * (1.0 - 0.05 * MJ * (1.0 + MJ) * T2 ); \
+ Qej = PB * Cz * (T4 + T5); /*Quadratic equation for Qej when vex/PB>=0.9*/\
+ end \
+ end else begin \
+ Qej = 0.0; \
+ end \
+ end
+
+//
+// Macros for the model/instance parameters
+//
+// MPRxx model parameter real
+// MPIxx model parameter integer
+// IPRxx instance parameter real
+// IPIxx instance parameter integer
+// ||
+// cc closed lower bound, closed upper bound
+// oo open lower bound, open upper bound
+// co closed lower bound, open upper bound
+// oc open lower bound, closed upper bound
+// cz closed lower bound=0, open upper bound=inf
+// oz open lower bound=0, open upper bound=inf
+// nb no bounds
+// ex no bounds with exclude
+// sw switch(integer only, values 0=false and 1=true)
+// ty switch(integer only, values -1=p-type and +1=n-type)
+//
+// IPM instance parameter mFactor(multiplicity, implicit for LRM2.2)
+// OPP operating point parameter, includes units and description for printing
+//
+`define ALIAS(alias,paramName) aliasparam alias = paramName ;
+`define OPP(nam,uni,des) (*units=uni, desc=des*) real nam ;
+
+`define MPRnb(nam,def,uni, des) (*units=uni, desc=des*) parameter real nam=def ;
+`define MPRex(nam,def,uni,exc, des) (*units=uni, desc=des*) parameter real nam=def exclude exc ;
+`define MPRcc(nam,def,uni,lwr,upr,des) (*units=uni, desc=des*) parameter real nam=def from[lwr:upr] ;
+`define MPRoo(nam,def,uni,lwr,upr,des) (*units=uni, desc=des*) parameter real nam=def from(lwr:upr) ;
+`define MPRco(nam,def,uni,lwr,upr,des) (*units=uni, desc=des*) parameter real nam=def from[lwr:upr) ;
+`define MPRoc(nam,def,uni,lwr,upr,des) (*units=uni, desc=des*) parameter real nam=def from(lwr:upr] ;
+`define MPRcz(nam,def,uni, des) (*units=uni, desc=des*) parameter real nam=def from[ 0:inf);
+`define MPRoz(nam,def,uni, des) (*units=uni, desc=des*) parameter real nam=def from( 0:inf);
+
+`define MPInb(nam,def,uni, des) (*units=uni, desc=des*) parameter integer nam=def ;
+`define MPIex(nam,def,uni,exc, des) (*units=uni, desc=des*) parameter integer nam=def exclude exc ;
+`define MPIcc(nam,def,uni,lwr,upr,des) (*units=uni, desc=des*) parameter integer nam=def from[lwr:upr] ;
+`define MPIoo(nam,def,uni,lwr,upr,des) (*units=uni, desc=des*) parameter integer nam=def from(lwr:upr) ;
+`define MPIco(nam,def,uni,lwr,upr,des) (*units=uni, desc=des*) parameter integer nam=def from[lwr:upr) ;
+`define MPIoc(nam,def,uni,lwr,upr,des) (*units=uni, desc=des*) parameter integer nam=def from(lwr:upr] ;
+`define MPIcz(nam,def,uni, des) (*units=uni, desc=des*) parameter integer nam=def from[ 0:inf);
+`define MPIoz(nam,def,uni, des) (*units=uni, desc=des*) parameter integer nam=def from( 0:inf);
+
+`define MPIsw(nam,def,uni, des) (*units=uni, desc=des*) parameter integer nam=def from[ 0: 1] ;
+`define MPIty(nam,def,uni, des) (*units=uni, desc=des*) parameter integer nam=def from[ -1: 1] exclude 0 ;
+
+`define IPRnb(nam,def,uni, des) (*units=uni, type="instance", desc=des*) parameter real nam=def ;
+`define IPRex(nam,def,uni,exc, des) (*units=uni, type="instance", desc=des*) parameter real nam=def exclude exc ;
+`define IPRcc(nam,def,uni,lwr,upr,des) (*units=uni, type="instance", desc=des*) parameter real nam=def from[lwr:upr] ;
+`define IPRoo(nam,def,uni,lwr,upr,des) (*units=uni, type="instance", desc=des*) parameter real nam=def from(lwr:upr) ;
+`define IPRco(nam,def,uni,lwr,upr,des) (*units=uni, type="instance", desc=des*) parameter real nam=def from[lwr:upr) ;
+`define IPRoc(nam,def,uni,lwr,upr,des) (*units=uni, type="instance", desc=des*) parameter real nam=def from(lwr:upr] ;
+`define IPRcz(nam,def,uni, des) (*units=uni, type="instance", desc=des*) parameter real nam=def from[ 0:inf);
+`define IPRoz(nam,def,uni, des) (*units=uni, type="instance", desc=des*) parameter real nam=def from( 0:inf);
+
+`define IPInb(nam,def,uni, des) (*units=uni, type="instance", desc=des*) parameter integer nam=def ;
+`define IPIex(nam,def,uni,exc, des) (*units=uni, type="instance", desc=des*) parameter integer nam=def exclude exc ;
+`define IPIcc(nam,def,uni,lwr,upr,des) (*units=uni, type="instance", desc=des*) parameter integer nam=def from[lwr:upr] ;
+`define IPIoo(nam,def,uni,lwr,upr,des) (*units=uni, type="instance", desc=des*) parameter integer nam=def from(lwr:upr) ;
+`define IPIco(nam,def,uni,lwr,upr,des) (*units=uni, type="instance", desc=des*) parameter integer nam=def from[lwr:upr) ;
+`define IPIoc(nam,def,uni,lwr,upr,des) (*units=uni, type="instance", desc=des*) parameter integer nam=def from(lwr:upr] ;
+`define IPIcz(nam,def,uni, des) (*units=uni, type="instance", desc=des*) parameter integer nam=def from[ 0:inf);
+`define IPIoz(nam,def,uni, des) (*units=uni, type="instance", desc=des*) parameter integer nam=def from( 0:inf);
+
+`ifdef EXPLICIT_MFACTOR
+ `define IPM (*units="" , type="instance", desc="multiplicity factor"*) parameter real m=1.0 from(0.0:inf) ;
+ `define MFACTOR_USE m
+`else //
+ `define IPM
+ `define MFACTOR_USE 1.0
+`endif
diff --git a/src/spicelib/devices/adms/bsimcmg/admsva/my.mak b/src/spicelib/devices/adms/bsimcmg/admsva/my.mak
new file mode 100644
index 000000000..995dc8841
--- /dev/null
+++ b/src/spicelib/devices/adms/bsimcmg/admsva/my.mak
@@ -0,0 +1,42 @@
+# -*- makefile -*-
+# (compile "make -i -f my.mak to")
+# (compile "make -i -f my.mak do 2>&1 > log")
+# (compile "make -i -f my.mak to 2>&1 > log")
+
+CFLAGS=-I ../../../../../include -I ../../../../../../../w32/src/include
+
+SRCS = \
+bsimcmgacld.c bsimcmg.analogfunction.c bsimcmgask.c bsimcmg.c bsimcmgdel.c bsimcmgdest.c bsimcmgguesstopology.c bsimcmginit.c bsimcmgload.c bsimcmgmask.c bsimcmgmdel.c bsimcmgmpar.c bsimcmgnoise.c bsimcmgpar.c bsimcmgpzld.c bsimcmgsetup.c bsimcmgtemp.c bsimcmgtrunc.c
+
+to : $(SRCS:%.c=%.o)
+
+scripts = \
+ -e ../../admst/ngspiceVersion.xml \
+ -e ../../admst/analogfunction.xml \
+ -e ../../admst/ngspiceMODULEitf.h.xml \
+ -e ../../admst/ngspiceMODULEinit.c.xml \
+ -e ../../admst/ngspiceMODULEinit.h.xml \
+ -e ../../admst/ngspiceMODULEext.h.xml \
+ -e ../../admst/ngspiceMODULEdefs.h.xml \
+ -e ../../admst/ngspiceMODULEask.c.xml \
+ -e ../../admst/ngspiceMODULEmask.c.xml \
+ -e ../../admst/ngspiceMODULEpar.c.xml \
+ -e ../../admst/ngspiceMODULEmpar.c.xml \
+ -e ../../admst/ngspiceMODULEload.c.xml \
+ -e ../../admst/ngspiceMODULEacld.c.xml \
+ -e ../../admst/ngspiceMODULEpzld.c.xml \
+ -e ../../admst/ngspiceMODULEtemp.c.xml \
+ -e ../../admst/ngspiceMODULEtrunc.c.xml \
+ -e ../../admst/ngspiceMODULEsetup.c.xml \
+ -e ../../admst/ngspiceMODULEdel.c.xml \
+ -e ../../admst/ngspiceMODULEmdel.c.xml \
+ -e ../../admst/ngspiceMODULEdest.c.xml \
+ -e ../../admst/ngspiceMODULEnoise.c.xml \
+ -e ../../admst/ngspiceMODULEguesstopology.c.xml \
+ -e ../../admst/ngspiceMODULE.hxx.xml \
+ -e ../../admst/ngspiceMODULE.c.xml
+
+$(SRCS) : do
+
+do : bsimcmg.va
+ ../../../../../../adms/ADMS/admsXml/admsXml $(scripts) $<