diff --git a/configure.ac b/configure.ac
index 9936d5c5d..265a92aef 100644
--- a/configure.ac
+++ b/configure.ac
@@ -956,7 +956,6 @@ if test "x$enable_adms" = xyes ; then
AC_DEFINE([ADMS], [1], [Support for Verilog-A models])
VLADEVDIR=" adms/bsimbulk \
- adms/bsimcmg \
adms/ekv \
adms/hicum0 \
adms/hicum2 \
@@ -965,7 +964,6 @@ if test "x$enable_adms" = xyes ; then
# The makefiles for adms (to be added to AC_CONFIG_FILES by ./autogen.sh --adms)
#VLAMKF src/spicelib/devices/adms/bsimbulk/Makefile
-#VLAMKF src/spicelib/devices/adms/bsimcmg/Makefile
#VLAMKF src/spicelib/devices/adms/ekv/Makefile
#VLAMKF src/spicelib/devices/adms/hicum0/Makefile
#VLAMKF src/spicelib/devices/adms/hicum2/Makefile
@@ -975,7 +973,6 @@ if test "x$enable_adms" = xyes ; then
NOTVLADEVDIR=""
VLADEV=" spicelib/devices/adms/bsimbulk/libbsimbulk.la \
- spicelib/devices/adms/bsimcmg/libbsimcmg.la \
spicelib/devices/adms/ekv/libekv.la \
spicelib/devices/adms/hicum0/libhicum0.la \
spicelib/devices/adms/hicum2/libhicum2.la \
diff --git a/examples/adms/bsimcmg/ac.sp b/examples/adms/bsimcmg/ac.sp
deleted file mode 100644
index 775d3b290..000000000
--- a/examples/adms/bsimcmg/ac.sp
+++ /dev/null
@@ -1,44 +0,0 @@
-*Sample netlist for BSIM-MG
-* (exec-spice "ngspice %s" t)
-*AC Response
-
-.option abstol=1e-6 reltol=1e-6 post ingold
-
-*.hdl "bsimcmg.va"
-.include "modelcard.nmos"
-
-.param myvdd=1.0
-
-* --- Voltage Sources ---
-vdd supply 0 dc=myvdd
-vsig gate 0 dc=0.5 ac=1
-vbs bulk 0 dc=0
-
-* --- Transistor ---
-m1 vout gate 0 bulk 0 nmos1 TFIN=15n L=30n NFIN=10 NRS=1 NRD=1
-+ FPITCH = 4.00E-08
-
-* --- Load ---
-rl supply vout r=2k
-cl supply vout c=10f
-
-* --- AC Analysis ---
-.ac dec 10 1k 1T
-
-* For Bias Point Testing
-* .dc vsig -1 1.5 0.01
-
-.print ac vm(vout) vp(vout)
-
-*.alter
-*.param myvdd=2.0
-
-.control
-run
-plot vdb(vout)
-plot cph(vout)
-.endc
-
-
-.end
-
diff --git a/examples/adms/bsimcmg/cfrgeo.sp b/examples/adms/bsimcmg/cfrgeo.sp
deleted file mode 100644
index af1c61140..000000000
--- a/examples/adms/bsimcmg/cfrgeo.sp
+++ /dev/null
@@ -1,65 +0,0 @@
-*Sample netlist for BSIM-MG
-* (exec-spice "ngspice %s" t)
-* Geometry-dependent Cfr
-*
-.option abstol=1e-6 reltol=1e-6 post ingold
-.temp 27
-
-*.hdl "bsimcmg.va"
-
-.param hfin=30n
-
-.model nmos2 NMOS level=17
-+ DEVTYPE=1
-+ CGEOMOD=2
-+ HEPI=10n
-+ LSP=5n
-+ EPSRSP=7.5
-+ TGATE=40n
-+ TMASK=10n
-+ TSILI=0n
-+ CRATIO=1.0
-+ EOT=1.0n
-+ TOXP=1.2n
-+ HFIN=hfin
-
-* --- Voltage Sources ---
-vds supply 0 dc=0
-vgs gate 0 dc=0
-vbs bulk 0 dc=0
-
-* --- Transistor ---
-M1 supply gate 0 bulk 0 nmos2 TFIN=10n L=30n NFIN=1 FPITCH=20n LRSD=40n
-M2 supply gate 0 bulk 0 nmos2 TFIN=10n L=30n NFIN=1 FPITCH=40n LRSD=40n
-M3 supply gate 0 bulk 0 nmos2 TFIN=10n L=30n NFIN=1 FPITCH=60n LRSD=40n
-M4 supply gate 0 bulk 0 nmos2 TFIN=10n L=30n NFIN=1 FPITCH=80n LRSD=40n
-
-* --- DC Analysis ---
-.dc vgs 0.0 1.0 0.1
-*.print dc par'hfin' M1:CFGEO M2:CFGEO M3:CFGEO M4:CFGEO
-
-.control
-save @m1[CFGEO] @m2[CFGEO] @m3[CFGEO] @m4[CFGEO]
-
-showmod #nmos2 : HFIN
-run
-plot @m1[CFGEO] @m2[CFGEO] @m3[CFGEO] @m4[CFGEO]
-
-altermod nmos2 hfin = 40n
-showmod #nmos2 : HFIN
-run
-plot @m1[CFGEO] @m2[CFGEO] @m3[CFGEO] @m4[CFGEO]
-
-altermod nmos2 hfin = 50n
-showmod #nmos2 : HFIN
-run
-plot @m1[CFGEO] @m2[CFGEO] @m3[CFGEO] @m4[CFGEO]
-
-altermod nmos2 hfin = 60n
-showmod #nmos2 : HFIN
-run
-plot @m1[CFGEO] @m2[CFGEO] @m3[CFGEO] @m4[CFGEO]
-
-.endc
-
-.end
diff --git a/examples/adms/bsimcmg/gummel_n.sp b/examples/adms/bsimcmg/gummel_n.sp
deleted file mode 100644
index 239294e5d..000000000
--- a/examples/adms/bsimcmg/gummel_n.sp
+++ /dev/null
@@ -1,48 +0,0 @@
-*Sample netlist for BSIM-MG
-* (exec-spice "ngspice %s" t)
-*Drain current symmetry for nmos
-
-.option abstol=1e-6 reltol=1e-6 post ingold
-
-.include "modelcard.nmos"
-
-* --- Voltage Sources ---
-vdrain drain 0 dc=0
-esource source 0 drain 0 -1
-vgate gate 0 dc=1.0
-vbulk bulk 0 dc=0.0
-
-
-* --- Transistor ---
-m1 drain gate source bulk 0 nmos1 TFIN=15n L=30n NFIN=10 NRS=1 NRD=1
-+ FPITCH = 4.00E-08
-
-* --- DC Analysis ---
-.dc vdrain -0.1 0.1 0.001 vgate 0.0 1.0 0.2
-.probe dc ids=par'-i(vdrain)'
-.probe dc gx=deriv(ids)
-.probe dc gx2=deriv(gx)
-.probe dc gx3=deriv(gx2)
-.probe dc gx4=deriv(gx3)
-.print dc par'ids' par'gx' par'gx2' par'gx3' par 'gx4'
-
-.control
-save @m1[VDSSAT]
-save @m1[GDS]
-run
-show all
-let ids = -i(vdrain)
-let gx = deriv(ids)
-let gx2 = deriv(gx)
-let gx3 = deriv(gx2)
-let gx4 = deriv(gx3)
-plot ids
-plot @m1[VDSSAT]
-plot @m1[GDS]
-plot gx
-plot gx2
-plot gx3
-plot gx4
-.endc
-
-.end
diff --git a/examples/adms/bsimcmg/gummel_p.sp b/examples/adms/bsimcmg/gummel_p.sp
deleted file mode 100644
index 262d5b6f4..000000000
--- a/examples/adms/bsimcmg/gummel_p.sp
+++ /dev/null
@@ -1,45 +0,0 @@
-*Sample netlist for BSIM-MG
-* (exec-spice "ngspice %s" t)
-*Drain current symmetry
-
-.option abstol=1e-6 reltol=1e-6 post ingold
-
-*.hdl "bsimcmg.va"
-.include "modelcard.pmos"
-
-* --- Voltage Sources ---
-vdrain drain 0 dc=0
-esource source 0 drain 0 -1
-vgate gate 0 dc=-1.0
-vbulk bulk 0 dc=0
-
-
-* --- Transistor ---
-m1 drain gate source bulk 0 pmos1 TFIN=15n L=30n NFIN=10 NRS=1 NRD=1
-+ FPITCH = 4.00E-08
-
-* --- DC Analysis ---
-.dc vdrain -0.1 0.1 0.001 vgate 0.0 -1.0 -0.2
-.probe dc ids=par'-i(vdrain)'
-.probe dc gx=deriv(ids)
-.probe dc gx2=deriv(gx)
-.probe dc gx3=deriv(gx2)
-.probe dc gx4=deriv(gx3)
-.print dc par'ids' par'gx' par'gx2' par'gx3' par 'gx4'
-
-.control
-run
-let ids = -i(vdrain)
-let gx = deriv(ids)
-let gx2 = deriv(gx)
-let gx3 = deriv(gx2)
-let gx4 = deriv(gx3)
-plot ids
-plot gx
-plot gx2
-plot gx3
-plot gx4
-
-.endc
-
-.end
diff --git a/examples/adms/bsimcmg/idvdnmos.sp b/examples/adms/bsimcmg/idvdnmos.sp
deleted file mode 100644
index 2f9227c23..000000000
--- a/examples/adms/bsimcmg/idvdnmos.sp
+++ /dev/null
@@ -1,55 +0,0 @@
-*Sample netlist for BSIM-MG
-* (exec-spice "ngspice %s" t)
-*Id-Vd Characteristics for NMOS (T = 27 C)
-
-.option abstol=1e-6 reltol=1e-6 post ingold
-
-*.hdl "bsimcmg.va"
-.include "modelcard.nmos.1"
-
-* --- Voltage Sources ---
-vds drain 0 dc=0
-vgs gate 0 dc=1.0
-vbs bulk 0 dc=0.2
-
-* --- Transistor ---
-m1 drain gate 0 bulk 0 nmos1 TFIN=15n L=40n NFIN=10 NRS=1 NRD=1 D=40n
-
-* --- DC Analysis ---
-.dc vds 0 1 0.01 vgs 0 1.0 0.1
-.probe dc ids=par`-i(vds)`
-.probe dc gds=deriv(ids)
-.print dc par'ids' par'gds'
-
-.control
-save @m1[gds]
-set temp = -55
-run
-let ids = -i(vds)
-let xgds = deriv(ids)
-plot ids
-plot xgds
-plot @m1[gds]
-
-save @m1[gds]
-set temp = 27
-run
-let ids = -i(vds)
-let xgds = deriv(ids)
-plot ids
-plot xgds
-plot @m1[gds]
-
-set temp = 100
-run
-let ids = -i(vds)
-let xgds = deriv(ids)
-plot ids
-plot xgds
-plot @m1[gds]
-
-*show all
-
-.endc
-
-.end
diff --git a/examples/adms/bsimcmg/idvdpmos.sp b/examples/adms/bsimcmg/idvdpmos.sp
deleted file mode 100644
index d7370020b..000000000
--- a/examples/adms/bsimcmg/idvdpmos.sp
+++ /dev/null
@@ -1,55 +0,0 @@
-*Sample netlist for BSIM-MG
-* (exec-spice "ngspice %s" t)
-*Id-Vd Characteristics for PMOS (T = 27 C)
-
-.option abstol=1e-6 reltol=1e-6 post ingold
-
-*.hdl "bsimcmg.va"
-.include "modelcard.pmos.1"
-
-* --- Voltage Sources ---
-vds drain 0 dc=0
-vgs gate 0 dc=-1
-vbs bulk 0 dc=0
-
-* --- Transistor ---
-m1 drain gate 0 bulk 0 pmos1 TFIN=15n L=40n NFIN=10 NRS=1 NRD=1
-+ D = 40n
-
-* --- DC Analysis ---
-.dc vds 0 -1 -0.01 vgs 0 -1.0 -0.1
-.probe dc ids=par`i(vds)`
-.probe dc gds=deriv(ids)
-.print dc par'ids' par'-gds'
-
-.control
-
-save @m1[gds]
-
-set temp = 27
-run
-let ids = i(vds)
-let xgds = deriv(ids)
-plot ids
-plot xgds
-plot @m1[gds]
-
-set temp = -55
-run
-let ids = i(vds)
-let xgds = deriv(ids)
-plot ids
-plot xgds
-plot @m1[gds]
-
-set temp = 100
-run
-let ids = i(vds)
-let xgds = deriv(ids)
-plot ids
-plot xgds
-plot @m1[gds]
-
-.endc
-
-.end
diff --git a/examples/adms/bsimcmg/idvgnmos.sp b/examples/adms/bsimcmg/idvgnmos.sp
deleted file mode 100644
index 60a53bacf..000000000
--- a/examples/adms/bsimcmg/idvgnmos.sp
+++ /dev/null
@@ -1,43 +0,0 @@
-*Sample netlist for BSIM-MG
-* (exec-spice "ngspice %s" t)
-*Id-Vg Characteristics for NMOS (T = 27 C)
-
-.option abstol=1e-6 reltol=1e-6 post ingold
-
-*.hdl "bsimcmg.va"
-.include "modelcard.nmos.1"
-
-* --- Voltage Sources ---
-vds supply 0 dc=0.05
-vgs gate 0 dc=1
-vbs bulk 0 dc=0
-vt t 0 dc= 0
-
-* --- Transistor ---
-m1 supply gate 0 bulk t nmos1 TFIN=15n L=30n NFIN=10 NRS=1 NRD=1 D=40n
-
-* --- DC Analysis ---
-.dc vgs -0.5 1.0 0.01 vds 0.05 1 0.95
-.probe dc par'-i(vds)'
-.probe dc par'-i(vbs)'
-.print dc i(X1.d)
-
-.control
-set temp = 27
-run
-plot -i(vds)
-plot -i(vbs)
-
-set temp = -55
-run
-plot -i(vds)
-plot -i(vbs)
-
-set temp = 100
-run
-plot -i(vds)
-plot -i(vbs)
-
-.endc
-
-.end
diff --git a/examples/adms/bsimcmg/idvgpmos.sp b/examples/adms/bsimcmg/idvgpmos.sp
deleted file mode 100644
index 72c180c47..000000000
--- a/examples/adms/bsimcmg/idvgpmos.sp
+++ /dev/null
@@ -1,55 +0,0 @@
-*Sample netlist for BSIM-MG
-* (exec-spice "ngspice %s" t)
-*Id-Vg Characteristics for PMOS (T = 27 C)
-
-.option abstol=1e-6 reltol=1e-6 post ingold
-
-*.hdl "bsimcmg.va"
-.include "modelcard.pmos.1"
-
-* --- Voltage Sources ---
-vds supply 0 dc=-1
-vgs gate 0 dc=-1
-vbs bulk 0 dc=0
-
-* --- Transistor ---
-m1 supply gate 0 bulk 0 pmos1 TFIN=15n L=30n NFIN=10 NRS=1 NRD=1
-+ D = 40n
-
-* --- DC Analysis ---
-.dc vgs 0.5 -1.0 -0.01
-.probe dc ids=par`i(vds)`
-.probe dc gds=deriv(ids)
-.print dc par'ids' par'-gds'
-
-.control
-
-save @m1[gm]
-
-set temp = 27
-run
-let ids = i(vds)
-let xgds = deriv(ids)
-plot ids
-plot xgds
-plot @m1[gm]
-
-set temp = -55
-run
-let ids = i(vds)
-let xgds = deriv(ids)
-plot ids
-plot xgds
-plot @m1[gm]
-
-set temp = 100
-run
-let ids = i(vds)
-let xgds = deriv(ids)
-plot ids
-plot xgds
-plot @m1[gm]
-
-.endc
-
-.end
diff --git a/examples/adms/bsimcmg/invdc.sp b/examples/adms/bsimcmg/invdc.sp
deleted file mode 100644
index 083809c5e..000000000
--- a/examples/adms/bsimcmg/invdc.sp
+++ /dev/null
@@ -1,37 +0,0 @@
-*Sample netlist for BSIM-MG
-* (exec-spice "ngspice %s" t)
-*Inverter Transient
-
-.option abstol=1e-6 reltol=1e-6 post ingold
-
-*.hdl "bsimcmg.va"
-.include "modelcard.nmos"
-.include "modelcard.pmos"
-
-* --- Voltage Sources ---
-vdd supply 0 dc=1.0
-vin vi 0 dc=0.5
-
-* --- Inverter Subcircuit ---
-.subckt mg_inv vin vout vdd gnd
- mp1 vout vin vdd gnd 0 pmos1 TFIN=15n L=30n NFIN=10 NRS=1 NRD=1
-+ FPITCH = 4.00E-08
- mn1 vout vin gnd gnd 0 nmos1 TFIN=15n L=30n NFIN=10 NRS=1 NRD=1
-+ FPITCH = 4.00E-08
-
-.ends
-
-* --- Inverter ---
-Xinv1 vi vo supply 0 mg_inv
-
-* --- Transient Analysis ---
-.dc vin 0 1 0.01
-
-.print dc v(vi) v(vo)
-
-.control
-run
-plot v(vi) v(vo)
-.endc
-
-.end
diff --git a/examples/adms/bsimcmg/inverter_transient.sp b/examples/adms/bsimcmg/inverter_transient.sp
deleted file mode 100644
index 76d61c134..000000000
--- a/examples/adms/bsimcmg/inverter_transient.sp
+++ /dev/null
@@ -1,41 +0,0 @@
-*Sample netlist for BSIM-MG
-* (exec-spice "ngspice %s" t)
-*Inverter Transient
-
-.option abstol=1e-6 reltol=1e-6 post ingold
-
-*.hdl "bsimcmg.va"
-.include "modelcard.nmos"
-.include "modelcard.pmos"
-
-* --- Voltage Sources ---
-vdd supply 0 dc=1.0
-vsig vi 0 dc=0.5 sin (0.5 0.5 1MEG)
-
-* --- Inverter Subcircuit ---
-.subckt mg_inv vin vout vdd gnd
- mp1 vout vin vdd gnd 0 pmos1 TFIN=15n L=30n NFIN=10 ASEO=1.5e-14 ADEO=1.5e-14 NRS=1 NRD=1
-+ FPITCH = 4.00E-08
- mn1 vout vin gnd gnd 0 nmos1 TFIN=15n L=30n NFIN=10 ASEO=1.5e-14 ADEO=1.5e-14 NRS=1 NRD=1
-+ FPITCH = 4.00E-08
-
-.ends
-
-* --- Inverter ---
-Xinv1 vi 1 supply 0 mg_inv
-Xinv2 1 2 supply 0 mg_inv
-Xinv3 2 3 supply 0 mg_inv
-Xinv4 3 4 supply 0 mg_inv
-Xinv5 4 vo supply 0 mg_inv
-
-* --- Transient Analysis ---
-.tran 20n 5u
-
-.print tran v(vi) v(vo)
-
-.control
-run
-plot v(vi) v(vo)
-.endc
-
-.end
diff --git a/examples/adms/bsimcmg/modelcard.nmos b/examples/adms/bsimcmg/modelcard.nmos
deleted file mode 100644
index de345b383..000000000
--- a/examples/adms/bsimcmg/modelcard.nmos
+++ /dev/null
@@ -1,137 +0,0 @@
-******** BSIM-MG 105 Sample Modelcard for NMOS ********
-
-** The BSIM-MG sample modelcard below was not extracted/obtained
-** from/based on any real technologies. It should not be used for any
-** other purposes except for benchmarking the implementation of BSIM-MG
-** against BSIM Team's standard results
-
-.model nmos1 NMOS level=17
-+ BULKMOD = 1
-+ CGEOMOD = 0
-+ TYPE = 1
-+ GEOMOD = 0
-+ GIDLMOD = 1
-+ IGBMOD = 0
-+ IGCMOD = 1
-+ IIMOD = 0
-+ NGATE = 0
-+ NQSMOD = 0
-+ RDSMOD = 0
-+ RGATEMOD = 0
-+ RGEOMOD = 0
-+ NSEG = 5
-+ SDTERM = 0
-+ SHMOD = 0
-+ AGIDL = 1.00E-12
-+ AGISL = 1.00E-12
-+ AIGC = 0.014
-+ AIGD = 0.0115
-+ AIGS = 0.0115
-+ AT = 0.001
-+ BG0SUB = 1.17
-+ BGIDL = 1.00E+07
-+ BGISL = 1.00E+07
-+ BIGC = 0.005
-+ BIGD = 0.00332
-+ BIGS = 0.00332
-+ CDSC = 0.01
-+ CDSCD = 0.01
-+ CFD = 0.20E-10
-+ CFS = 0.20E-10
-+ CGBL = 0
-+ CGBO = 0
-+ CGDL = 0
-+ CGDO = 1e-10
-+ CGSL = 0
-+ CGSO = 1e-10
-+ CIGC = 0.25
-+ CIGD = 0.35
-+ CIGS = 0.35
-+ CIT = 0
-+ CKAPPAD = 0.6
-+ CKAPPAS = 0.6
-+ CTH0 = 0.000001243
-+ DELTAVSAT = 0.5
-+ DELTAW = 0
-+ DELTAWCV = 0
-+ DLBIN = 0
-+ DLC = 0
-+ DLCIGD = 1.00E-09
-+ DLCIGS = 1.00E-09
-+ DROUT = 1
-+ DSUB = 0.5
-+ DVT0 = 0.05
-+ DVT1 = 0.5
-+ DVTSHIFT = 0
-+ EASUB = 4.05
-+ EGIDL = 0.35
-+ EGISL = 0.35
-+ EOT = 1.50E-09
-+ EOTACC = 1.00E-10
-+ EOTBOX = 1.40E-07
-+ EPSROX = 3.9
-+ EPSRSP = 3.9
-+ EPSRSUB = 11.9
-+ ETA0 = 0.05
-+ ETAMOB = 2
-+ ETAQM = 0.54
-+ EU = 1.2
-+ HFIN = 3.00E-08
-+ IGT = 2.5
-+ K1RSCE = 0
-+ KSATIV = 2
-+ KT1 = 0
-+ KT1L = 0
-+ LINT = -2.00E-09
-+ LPE0 = 0
-+ LCDSCD = 5.00E-05
-+ LCDSCDR = 5.00E-05
-+ LRDSW = 0.2
-+ LVSAT = 0
-+ MEXP = 4
-+ NBODY = 1.00E+22
-+ NC0SUB = 2.86E+25
-+ NI0SUB = 1.10E+16
-+ NSD = 2.00E+26
-+ PCLM = 0.05
-+ PCLMCV = 0.013
-+ PCLMG = 0
-+ PDIBL1 = 0
-+ PDIBL2 = 0.002
-+ PHIG = 4.39
-+ PHIN = 0.05
-+ POXEDGE = 1.1
-+ PQM = 0.66
-+ PRT = 0
-+ PTWG = 0
-+ PTWGT = 0.004
-+ PVAG = 0
-+ QM0 = 0.001
-+ QMFACTOR = 2.5
-+ RDSW = 200
-+ RDSWMIN = 0
-+ RDWMIN = 0
-+ RSHD = 0
-+ RSHS = 0
-+ RSWMIN = 0
-+ RTH0 = 0.225
-+ TBGASUB = 0.000473
-+ TBGBSUB = 636
-+ TGIDL = -0.007
-+ TMEXP = 0
-+ TNOM = 25
-+ TOXP = 2.10E-09
-+ U0 = 0.025
-+ UA = 0.55
-+ UA1 = 0.001032
-+ UCS = 1
-+ UCSTE = -0.004775
-+ UD = 0
-+ UD1 = 0
-+ UP = 0
-+ UTE = -0.7
-+ UTL = 0
-+ VSAT = 80000
-+ WR = 1
-+ WTH0 = 2.60E-07
-+ XL = 0
diff --git a/examples/adms/bsimcmg/modelcard.nmos.1 b/examples/adms/bsimcmg/modelcard.nmos.1
deleted file mode 100644
index 6baf0c025..000000000
--- a/examples/adms/bsimcmg/modelcard.nmos.1
+++ /dev/null
@@ -1,110 +0,0 @@
-******** BSIM-MG 105 Sample Modelcard for NMOS ********
-
-** The BSIM-MG sample modelcard below was not extracted/obtained
-** from/based on any real technologies. It should not be used for any
-** other purposes except for benchmarking the implementation of BSIM-MG
-** against BSIM Team's standard results
-
-.model nmos1 NMOS level=17
-+ AGIDL = 50.00f
-+ AGISL = 50.00f
-+ AIGBINV = 11.10m
-+ AIGC = 13.60m
-+ AT = 0.007
-+ BG0SUB = 1.120
-+ BGIDL = 400.0E6
-+ BGISL = 400.0E6
-+ BIGBINV =-1.000m
-+ BIGC = 1.710m
-+ BULKMOD = 1
-+ CDSC = 5.000m
-+ CDSCD = 5.000m
-+ CFS = 1.0e-10
-+ CFD = 1.0e-10
-+ CGEOMOD = 0
-+ CGSL = 1.0e-10
-+ CGDL = 1.0e-10
-+ CIGBINV = 6.000m
-+ CIGC = 75.00m
-+ CIT = 0.000
-+ CTH0 = 2.0e-5
-+ DELTAW = 0.000
-+ DELTAWCV = 0.000
-+ TYPE = 1.000
-+ DLC = 0.000
-+ DROUT = 0.530
-+ DSUB = 0.530
-+ DVT0 = 0.000
-+ DVT1 = 300.0m
-+ EASUB = 4.050
-+ EGIDL = 0.000
-+ EGISL = 0.000
-+ EIGBINV = 1.100
-+ EOT = 1.0n
-+ EPSROX = 3.900
-+ EPSRSUB = 11.90
-+ ETA0 = 70.0m
-+ ETAMOB = 2.500
-+ EU = 0.9
-+ FECH = 2.000
-+ FECHCV = 1.000
-+ GEOMOD = 1.000
-+ GIDLMOD = 1.000
-+ HFIN = 30n
-+ IGCMOD = 1.000
-+ IGBMOD = 1.000
-+ K1RSCE = 0.000
-+ KSATIV = 1.000
-+ KT1 = 0.0
-+ LINT = 0.000
-+ LL = 0.000
-+ LLC = 0.000
-+ LLN = 1.000
-+ LPA = 0.000
-+ LPE0 = 5.000n
-+ MEXP = 3
-+ NBODY = 1E+24
-+ NC0SUB = 2.86000E+25
-+ NGATE = 0.0
-+ NI0SUB = 1.10000E+16
-+ NIGBINV = 3.000
-+ NSD = 2.00000E+26
-+ PCLM = 0.000
-+ PDIBL1 = 0.300
-+ PDIBL2 = 0.000
-+ PHIG = 4.610
-+ PHIN = 50.00m
-+ PRWGS = 0.000
-+ PVAG = 0.000
-+ QMFACTOR = 0.000
-+ RDSW = 100.0
-+ RDSWMIN = 0.000
-+ RSHS = 2.0
-+ RTH0 = 0.05
-+ U0 = 40m
-+ UA = 0.100
-+ UA1 = 1.032m
-+ UCS = 1.0
-+ UD = 1.0
-+ UP = 0.000
-+ UTE = 0.000
-+ UTL =-1.497m
-+ VSAT = 150K
-+ WR = 1.000
-+ XL = -5.00n
-+ IIMOD =0.0
-+ BETAII0 = 0
-+ BETAII1 = .028
-+ BETAII2 = .067
-+ TII = -0.7
-+ SII0 = 3.4
-+ SII1 = .8
-+ SII2 = .08
-+ SIID = 0.08
-+ ESATII = 1.7e6
-+ LII = 3e-9
-+ RGATEMOD = 0
-+ RGFIN = 100
-+ NQSMOD = 0
-+ RDSMOD = 0
-+ SHMOD = 0
diff --git a/examples/adms/bsimcmg/modelcard.pmos b/examples/adms/bsimcmg/modelcard.pmos
deleted file mode 100644
index 2e4f9e34b..000000000
--- a/examples/adms/bsimcmg/modelcard.pmos
+++ /dev/null
@@ -1,137 +0,0 @@
-******** BSIM-MG 105 Sample Modelcard for PMOS ********
-
-** The BSIM-MG sample modelcard below was not extracted/obtained
-** from/based on any real technologies. It should not be used for any
-** other purposes except for benchmarking the implementation of BSIM-MG
-** against BSIM Team's standard results
-
-.model pmos1 PMOS level=17
-+ BULKMOD = 1
-+ CGEOMOD = 0
-+ TYPE = 0
-+ GEOMOD = 0
-+ GIDLMOD = 1
-+ IGBMOD = 0
-+ IGCMOD = 1
-+ IIMOD = 0
-+ NGATE = 0
-+ NQSMOD = 0
-+ RDSMOD = 0
-+ RGATEMOD = 0
-+ RGEOMOD = 0
-+ NSEG = 5
-+ SDTERM = 0
-+ SHMOD = 0
-+ AGIDL = 2E-12
-+ AGISL = 2E-12
-+ AIGC = 0.007
-+ AIGD = 0.006
-+ AIGS = 0.006
-+ AT = 0.0008234
-+ BG0SUB = 1.17
-+ BGIDL = 1.50E+08
-+ BGISL = 1.50E+08
-+ BIGC = 0.0015
-+ BIGD = 0.001944
-+ BIGS = 0.001944
-+ CDSC = 0.003469
-+ CDSCD = 0.001486
-+ CFD = 0.2e-10
-+ CFS = 0.2e-10
-+ CGBL = 0
-+ CGBO = 0
-+ CGDL = 0
-+ CGDO = 1E-10
-+ CGSL = 0
-+ CGSO = 1E-10
-+ CIGC = 1
-+ CIGD = 1
-+ CIGS = 1
-+ CIT = 0
-+ CKAPPAD = 0.6
-+ CKAPPAS = 0.6
-+ CTH0 = 1.243E-06
-+ DELTAVSAT = 11.56
-+ DELTAW = 0
-+ DELTAWCV = -1.00E-08
-+ DLBIN = 0
-+ DLC = -9.2E-09
-+ DLCIGD = 5.00E-09
-+ DLCIGS = 5.00E-09
-+ DROUT = 4.97
-+ DSUB = 0.5
-+ DVT0 = 0.05006
-+ DVT1 = 0.4
-+ DVTSHIFT = 0
-+ EASUB = 4.05
-+ EGIDL = 1.142
-+ EGISL = 1.142
-+ EOT = 2.10E-09
-+ EOTACC = 3.00E-10
-+ EOTBOX = 1.40E-07
-+ EPSROX = 3.9
-+ EPSRSP = 3.9
-+ EPSRSUB = 11.9
-+ ETA0 = 0.03952
-+ ETAMOB = 4
-+ ETAQM = 0.54
-+ EU = 0.05
-+ HFIN = 3.00E-08
-+ IGT = 3.5
-+ K1RSCE = 0
-+ KSATIV = 1.592
-+ KT1 = 0.08387
-+ KT1L = 0
-+ LINT = -2.5E-09
-+ LPE0 = 0
-+ LCDSCD = 0
-+ LCDSCDR = 0
-+ LRDSW = 1.3
-+ LVSAT = 1441
-+ MEXP = 2.491
-+ NBODY = 1E+22
-+ NC0SUB = 2.86E+25
-+ NI0SUB = 1.1E+16
-+ NSD = 2E+26
-+ PCLM = 0.01
-+ PCLMCV = 0.013
-+ PCLMG = 1
-+ PDIBL1 = 800
-+ PDIBL2 = 0.005704
-+ PHIG = 4.678
-+ PHIN = 0.05
-+ POXEDGE = 1.152
-+ PQM = 0.66
-+ PRT = 0.002477
-+ PTWG = 6.322
-+ PTWGT = 0.0015
-+ PVAG = 200
-+ QM0 = 2.183E-12
-+ QMFACTOR = 0
-+ RDSW = 190.6
-+ RDSWMIN = 0
-+ RDWMIN = 0
-+ RSHD = 0
-+ RSHS = 0
-+ RSWMIN = 0
-+ RTH0 = 0.15
-+ TBGASUB = 0.000473
-+ TBGBSUB = 636
-+ TGIDL = -0.01
-+ TMEXP = 0
-+ TNOM = 25
-+ TOXP = 2.1E-09
-+ U0 = 0.02935
-+ UA = 1.133
-+ UA1 = 0.00134
-+ UCS = 0.2672
-+ UCSTE = 0
-+ UD = 0.0105
-+ UD1 = 0
-+ UP = 0
-+ UTE = 0
-+ UTL = 0.001
-+ VSAT = 48390
-+ WR = 1
-+ WTH0 = 2.60E-07
-+ XL = 0
diff --git a/examples/adms/bsimcmg/modelcard.pmos.1 b/examples/adms/bsimcmg/modelcard.pmos.1
deleted file mode 100644
index 77be8de45..000000000
--- a/examples/adms/bsimcmg/modelcard.pmos.1
+++ /dev/null
@@ -1,110 +0,0 @@
-******** BSIM-MG 105 Sample Modelcard for PMOS ********
-
-** The BSIM-MG sample modelcard below was not extracted/obtained
-** from/based on any real technologies. It should not be used for any
-** other purposes except for benchmarking the implementation of BSIM-MG
-** against BSIM Team's standard results
-
-.model pmos1 PMOS level=17
-+ AGIDL =3.000p
-+ AGISL =3.000p
-+ AIGBINV =11.10m
-+ AIGC =13.60m
-+ AT = 0.007
-+ BG0SUB =1.120
-+ BGIDL =350.0E6
-+ BGISL =350.0E6
-+ BIGBINV =-1.000m
-+ BIGC =1.710m
-+ BULKMOD = 1
-+ CDSC =13.00m
-+ CDSCD =10.00m
-+ CFS = 1.0e-10
-+ CFD = 1.0e-10
-+ CGEOMOD = 0
-+ CGSL = 1.0e-10
-+ CGDL = 1.0e-10
-+ CIGBINV =6.000m
-+ CIGC =75.00m
-+ CIT =0.000
-+ CTH0 = 2.0e-5
-+ DELTAW =0.000
-+ DELTAWCV =0.000
-+ TYPE = 0.000
-+ DLC =0.000
-+ DROUT =0.530
-+ DSUB =0.530
-+ DVT0 =0.000
-+ DVT1 =600.0m
-+ EASUB =4.050
-+ EGIDL =0.000
-+ EGISL =0.000
-+ EIGBINV =1.100
-+ EOT = 1.0n
-+ EPSROX =3.900
-+ EPSRSUB =11.90
-+ ETA0 =50.0m
-+ ETAMOB =2.000
-+ EU = 0.5
-+ FECH =0.500
-+ FECHCV =1.000
-+ GEOMOD =1.000
-+ GIDLMOD =1.000
-+ HFIN = 30n
-+ IGBMOD =1.000
-+ IGCMOD =1.000
-+ K1RSCE =0.000
-+ KSATIV =1.000
-+ KT1 = 0.0
-+ LINT =0.000
-+ LL =0.000
-+ LLC =0.000
-+ LLN =1.000
-+ LPA =0.000
-+ LPE0 =5.000n
-+ MEXP = 3
-+ NBODY = 1E+24
-+ NC0SUB =2.86000E+25
-+ NGATE = 0.0
-+ NI0SUB =1.10000E+16
-+ NIGBINV =3.000
-+ NSD =2.00000E+26
-+ PCLM =5.000m
-+ PDIBL1 = 0.300
-+ PDIBL2 = 0.000
-+ PHIN =50.00m
-+ PHIG = 4.610
-+ PRWGS = 0.000
-+ PVAG = 0.000
-+ QMFACTOR = 0.000
-+ RDSW = 100.0
-+ RDSWMIN = 0.0
-+ RSHS = 2.0
-+ RTH0 = 0.05
-+ U0 =20.00m
-+ UA = 1.000
-+ UA1 = 1.032m
-+ UCS = 1.0
-+ UD = 1.0
-+ UP =0.000
-+ UTE = 0.000
-+ UTL =-1.497m
-+ VSAT =150.0K
-+ WR =1.000
-+ XL =-5n
-+ IIMOD =0.0
-+ BETAII0 = 0
-+ BETAII1 = .028
-+ BETAII2 = .067
-+ TII = -0.7
-+ SII0 = 3.4
-+ SII1 = .8
-+ SII2 = .08
-+ SIID = 0.08
-+ ESATII = 1.7e6
-+ LII = 3e-9
-+ RGATEMOD = 0
-+ RGFIN = 100
-+ NQSMOD = 0
-+ RDSMOD = 0
-+ SHMOD = 0
diff --git a/examples/adms/bsimcmg/noise.sp b/examples/adms/bsimcmg/noise.sp
deleted file mode 100644
index 10d12322c..000000000
--- a/examples/adms/bsimcmg/noise.sp
+++ /dev/null
@@ -1,46 +0,0 @@
-*Samle netlist for BSIM-MG
-* (exec-spice "ngspice %s" t)
-* Drain Noise Simulation
-
-.option abstol=1e-6 reltol=1e-6 post ingold
-.temp 27
-
-*.hdl "bsimcmg.va"
-.include "modelcard.nmos"
-
-* --- Voltage Sources ---
-vds 1 0 dc=1v
-vgs gate 0 dc=0.5v ac=1
-vbs bulk 0 dc=0v
-
-* --- Circuit ---
-lbias 1 drain 1m
-cload drain 2 1m
-rload 2 0 R=1 noise=0
-M1 drain gate 0 bulk 0 nmos1 TFIN=15n L=30n NFIN=10 NRS=1 NRD=1
-+ FPITCH = 4.00E-08
-
-* --- Analysis ---
-*.op
-**.dc vgs -0.5 1.5 0.01
-**.print dc i(lbias)
-*.ac dec 11 1k 100g
-*.noise v(drain) vgs 1
-**.print ac i(cload)
-*.print ac v(drain)
-*.print noise inoise onoise
-
-.control
-op
-
-ac dec 11 1k 100g
-plot vdb(drain)
-
-noise v(drain) vgs dec 11 1k 100g
-print all
-echo "silence in the studio, no noise today"
-
-.endc
-
-.end
-
diff --git a/examples/adms/bsimcmg/rdsgeo.sp b/examples/adms/bsimcmg/rdsgeo.sp
deleted file mode 100644
index e650a5d99..000000000
--- a/examples/adms/bsimcmg/rdsgeo.sp
+++ /dev/null
@@ -1,77 +0,0 @@
-*Sample netlist for BSIM-MG
-* (exec-spice "ngspice %s" t)
-* Geometry-dependent Rds
-
-.option abstol=1e-6 reltol=1e-6 post ingold
-.temp 27
-
-*.hdl "bsimcmg.va"
-
-.model nmos2 NMOS level=17
-+ DEVTYPE=1
-+ RGEOMOD=1
-+ HEPI=15n
-+ CRATIO=0.5
-+ DELTAPRSD=12.42n
-+ RHOC=1.0p
-+ LSP=15n
-+ HFIN=30n
-+ NSD=2.0e+26
-+ LINT = 0
-
-.model pmos2 PMOS level=17
-+ DEVTYPE=0
-+ RGEOMOD=1
-+ HEPI=15n
-+ CRATIO=0.5
-+ DELTAPRSD=12.42n
-+ RHOC=1.0p
-+ LSP=15n
-+ HFIN=30n
-+ NSD=2.0e+26
-+ LINT = 0
-
-.param fp = 45n
-
-* --- Voltage Sources ---
-vds supply 0 dc=0
-vgs gate 0 dc=0
-vbs bulk 0 dc=0
-
-* --- Transistor ---
-Mn1 supply gate 0 bulk 0 nmos2 TFIN=15n L=30n NFIN=10 FPITCH=fp LRSD=20n
-Mn2 supply gate 0 bulk 0 nmos2 TFIN=15n L=30n NFIN=10 FPITCH=fp LRSD=40n
-Mn3 supply gate 0 bulk 0 nmos2 TFIN=15n L=30n NFIN=10 FPITCH=fp LRSD=60n
-Mn4 supply gate 0 bulk 0 nmos2 TFIN=15n L=30n NFIN=10 FPITCH=fp LRSD=80n
-Mp1 supply gate 0 bulk 0 pmos2 TFIN=15n L=30n NFIN=10 FPITCH=fp LRSD=20n
-Mp2 supply gate 0 bulk 0 pmos2 TFIN=15n L=30n NFIN=10 FPITCH=fp LRSD=40n
-Mp3 supply gate 0 bulk 0 pmos2 TFIN=15n L=30n NFIN=10 FPITCH=fp LRSD=60n
-Mp4 supply gate 0 bulk 0 pmos2 TFIN=15n L=30n NFIN=10 FPITCH=fp LRSD=80n
-
-* --- DC Analysis ---
-.dc vgs 0.0 1.0 0.1
-.print dc Xn1:RSGEO Xn2:RSGEO Xn3:RSGEO Xn4:RSGEO
-.print dc Xp1:RSGEO Xp2:RSGEO Xp3:RSGEO Xp4:RSGEO
-
-.control
-save @Mn1[RSGEO] @Mn2[RSGEO] @Mn3[RSGEO] @Mn4[RSGEO]
-save @Mp1[RSGEO] @Mp2[RSGEO] @Mp3[RSGEO] @Mp4[RSGEO]
-run
-plot @Mn1[RSGEO] @Mn2[RSGEO] @Mn3[RSGEO] @Mn4[RSGEO]
-plot @Mp1[RSGEO] @Mp2[RSGEO] @Mp3[RSGEO] @Mp4[RSGEO]
-
-alter @mn1[FPITCH] = 90n
-alter @mn2[FPITCH] = 90n
-alter @mn3[FPITCH] = 90n
-alter @mn4[FPITCH] = 90n
-alter @mp1[FPITCH] = 90n
-alter @mp2[FPITCH] = 90n
-alter @mp3[FPITCH] = 90n
-alter @mp4[FPITCH] = 90n
-run
-plot @Mn1[RSGEO] @Mn2[RSGEO] @Mn3[RSGEO] @Mn4[RSGEO]
-plot @Mp1[RSGEO] @Mp2[RSGEO] @Mp3[RSGEO] @Mp4[RSGEO]
-
-.endc
-
-.end
diff --git a/examples/adms/bsimcmg/ringosc_17stg.sp b/examples/adms/bsimcmg/ringosc_17stg.sp
deleted file mode 100644
index f7204e9e0..000000000
--- a/examples/adms/bsimcmg/ringosc_17stg.sp
+++ /dev/null
@@ -1,60 +0,0 @@
-*Sample netlist for BSIM-MG
-* (exec-spice "ngspice %s" t)
-*17-stage ring oscillator
-
-*.options abstol=1e-6 reltol=1e-6 post ingold
-.options abstol=1e-6 reltol=1e-6 post ingold dcon=1
-
-*.hdl "bsimcmg.va"
-.include "modelcard.nmos"
-.include "modelcard.pmos"
-
-* --- Voltage Sources ---
-vdd supply 0 dc=1.0
-
-* --- Inverter Subcircuit ---
-.subckt mg_inv vin vout vdd gnd
- mp1 vout vin vdd gnd 0 pmos1 TFIN=15n L=30n NFIN=10 ASEO=1.5e-14 ADEO=1.5e-14 NRS=1 NRD=1
-+ FPITCH = 4.00E-08
- mn1 vout vin gnd gnd 0 nmos1 TFIN=15n L=30n NFIN=10 ASEO=1.5e-14 ADEO=1.5e-14 NRS=1 NRD=1
-+ FPITCH = 4.00E-08
-
-.ends
-
-* --- 17 Stage Ring oscillator ---
-Xinv1 1 2 supply 0 mg_inv
-Xinv2 2 3 supply 0 mg_inv
-Xinv3 3 4 supply 0 mg_inv
-Xinv4 4 5 supply 0 mg_inv
-Xinv5 5 6 supply 0 mg_inv
-Xinv6 6 7 supply 0 mg_inv
-Xinv7 7 8 supply 0 mg_inv
-Xinv8 8 9 supply 0 mg_inv
-Xinv9 9 10 supply 0 mg_inv
-Xinv10 10 11 supply 0 mg_inv
-Xinv11 11 12 supply 0 mg_inv
-Xinv12 12 13 supply 0 mg_inv
-Xinv13 13 14 supply 0 mg_inv
-Xinv14 14 15 supply 0 mg_inv
-Xinv15 15 16 supply 0 mg_inv
-Xinv16 16 17 supply 0 mg_inv
-Xinv17 17 1 supply 0 mg_inv
-
-* --- Initial Condition ---
-.ic v(1)=1
-
-.tran 1p 1n
-
-.print tran v(1)
-
-.measure tran t1 when v(1)=0.5 cross=1
-.measure tran t2 when v(1)=0.5 cross=7
-.measure tran period param'(t2-t1)/3'
-.measure tran delay_per_stage param'period/34'
-
-.control
-run
-plot v(1)
-.endc
-
-.end
diff --git a/src/spicelib/devices/adms/admst/ngspiceVersion.xml b/src/spicelib/devices/adms/admst/ngspiceVersion.xml
index 26001c2b2..640be851f 100644
--- a/src/spicelib/devices/adms/admst/ngspiceVersion.xml
+++ b/src/spicelib/devices/adms/admst/ngspiceVersion.xml
@@ -2187,53 +2187,6 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/spicelib/devices/adms/bsimcmg/admsva/bsimcmg.va b/src/spicelib/devices/adms/bsimcmg/admsva/bsimcmg.va
deleted file mode 100644
index 5f15f3875..000000000
--- a/src/spicelib/devices/adms/bsimcmg/admsva/bsimcmg.va
+++ /dev/null
@@ -1,117 +0,0 @@
-// ********************************************************
-// **** 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
deleted file mode 100644
index f55c5d9ed..000000000
--- a/src/spicelib/devices/adms/bsimcmg/admsva/bsimcmg_binning_parameters.include
+++ /dev/null
@@ -1,756 +0,0 @@
-// ********************************************************
-// **** 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
deleted file mode 100644
index 6d47e3a5a..000000000
--- a/src/spicelib/devices/adms/bsimcmg/admsva/bsimcmg_body.include
+++ /dev/null
@@ -1,4145 +0,0 @@
-// ********************************************************
-// ********************************************************
-// *** 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 ,-1 ,"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, T0y, T1, T1y, T2, T2y, T3, T3y, 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;
-
-real LSP_i;
-
-`Cfringe_2d_vars();
-
-//===================================================
-// 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;
- T3y = 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 ($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
- T1y = WTH0;
- if (BSHEXP != 0.0) begin
- T1y = WTH0 * pow(NF, BSHEXP);
- end
- T2y = FPITCH;
- if (ASHEXP != 0.0) begin
- T2y = FPITCH * pow(NFINtotal, ASHEXP);
- end
- gth = (T1y + T2y)/ RTH0;
- cth = CTH0 * (T1y + T2y);
- 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))));
- T1y = `COT(thetarsp);
- Rsp = rhorsd * T1y / (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;
- T0y = lexp(alpha + alpha);
-
- if (SDTERM == 1.0) begin
- eta = rhorsd * lt / RHOC;
- T1y = T0y * (1.0 + eta);
- T2y = T1y + 1.0 - eta;
- T3y = T1y - 1.0 + eta;
- end else begin
- T2y = T0y + 1.0;
- T3y = T0y - 1.0;
- end
- RrsdTML = rhorsd * lt * T2y / (arsd_total * T3y);
-
- 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
- if ($param_given(LSP))
- LSP_i = LSP;
- else
- LSP_i = 0.2*(L + XL);
- 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)
- T0y = 3.467e-11 * lln(1.0e-7 * EPSRSP / (3.9 * LSP_i));
- T1y = 0.942 * Hrsd * epssp / LSP_i;
- Cgg_top = (T0y + T1y) * (TFIN + (FPITCH - TFIN) * CRATIO);
- end else begin
- `Cfringe_2d(cfr_top_trigate, Hg, Hrsd, LSP_i, TFIN, LRSD, Lg, TOXP, 0.85, Cgg_top)
- end
-
- // Side Component
- if (TMASK > 0) begin
- `Cfringe_2d(cfr_side_dblgate, Wg, Trsd, LSP_i, HFIN, LRSD, Lg, TOXP, 0.70, Cgg_side)
- end else begin
- `Cfringe_2d(cfr_side_trigate, Wg, Trsd, LSP_i, 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_i;
- 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
- T0y = CSDESW * lln(1.0 + HFIN / EOTBOX);
- csbox = cbox * ASEO + T0y * max(0.0, PSEO - FPITCH * NFINtotal);
- cdbox = cbox * ADEO + T0y * 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
- T0y = 1.0 / max((1.0 + DVTP2 * (cosh(tmp) - 2.0)), 1.0e-6);
- end else begin
- T0y = exp(-tmp) / max((exp(-tmp) + DVTP2), 1.0e-6);
- end
-
- Theta_DITS = T0y;
- 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
-
- T0y = TOXG * TOXG;
- T1y = TOXG * POXEDGE_i;
- T2y = T1y * T1y;
- Toxratio = lexp(NTOX_i * lln(TOXREF / TOXG)) / T0y;
- Toxratioedge = lexp(NTOX_i * lln(TOXREF / T1y)) / T2y;
- 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;
- T0y = `HBAR * `M_PI / (2*Ach/Weff_UFCM );
- E0 = T0y * T0y / (2.0 * mx);
- E0prime = T0y * T0y / (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(devsign * ids,V(`IntrinsicGate)); // Transconductance
- GDS = ddx(devsign * ids,V(di)); // Output Conductance
- if (BULKMOD != 0)
- GMBS = ddx(devsign * 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 = ddx(Qeg,V(e)); // Gate-Body Overlap
- CGBOV = -devsign * CGBOV;
-
- // Total of Junction Capacitance and Source/Drain-Body Overlap Capacitance
- CJST = ddx(Qes, V(si));
- CJST = -devsign * CJST;
- CJDT = ddx(Qed, V(di));
- CJDT = -devsign * CJDT;
-
- 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 = ddx(ids, V(`IntrinsicGate));
- DIDSDVG = devsign * sigvds * DIDSDVG;
- DIDSDVS = ddx(ids, V(si));
- DIDSDVS = devsign * sigvds * DIDSDVS;
- DIDSDVD = ddx(ids, V(di));
- DIDSDVD = devsign * sigvds * DIDSDVD;
- `ifdef __SHMOD__
- DIDSDVTH = ddx(ids, Temp(t));
- DIDSDVTH = devsign * sigvds * DIDSDVTH;
- `endif
- DIGSDVG = ddx(igs + igcs, V(`IntrinsicGate));
- DIGSDVG = devsign * DIGSDVG;
- DIGSDVS = ddx(igs + igcs, V(si));
- DIGSDVS = devsign * DIGSDVS;
- DIGSDVD = ddx(igs + igcs, V(di));
- DIGSDVD = devsign * DIGSDVD;
- `ifdef __SHMOD__
- DIGSDVTH = ddx(igs + igcs, Temp(t));
- DIGSDVTH = devsign * DIGSDVTH;
- `endif
- DIGDDVG = ddx(igd + igcd, V(`IntrinsicGate));
- DIGDDVG = devsign * DIGDDVG;
- DIGDDVS = ddx(igd + igcd, V(si));
- DIGDDVS = devsign * DIGDDVS;
- DIGDDVD = ddx(igd + igcd, V(di));
- DIGDDVD = devsign * DIGDDVD;
- `ifdef __SHMOD__
- DIGDDVTH = ddx(igd + igcd, Temp(t));
- DIGDDVTH = devsign * DIGDDVTH;
- `endif
- DIIIDVG = ddx(Iii, V(`IntrinsicGate));
- DIIIDVG = devsign * DIIIDVG;
- DIIIDVS = ddx(Iii, V(si));
- DIIIDVS = devsign * DIIIDVS;
- DIIIDVD = ddx(Iii, V(di));
- DIIIDVD = devsign * DIIIDVD;
- `ifdef __SHMOD__
- DIIIDVTH = ddx(Iii, Temp(t));
- DIIIDVTH = devsign * DIIIDVTH;
- `endif
- DIGIDLDVG = ddx(igidl, V(`IntrinsicGate));
- DIGIDLDVG = devsign * DIGIDLDVG;
- DIGIDLDVS = ddx(igidl, V(si));
- DIGIDLDVS = devsign * DIGIDLDVS;
- DIGIDLDVD = ddx(igidl, V(di));
- DIGIDLDVD = devsign * DIGIDLDVD;
- `ifdef __SHMOD__
- DIGIDLDVTH = ddx(igidl, Temp(t));
- DIGIDLDVTH = devsign * DIGIDLDVTH;
- `endif
- DIGISLDVG = ddx(igisl, V(`IntrinsicGate));
- DIGISLDVG = devsign * DIGISLDVG;
- DIGISLDVS = ddx(igisl, V(si));
- DIGISLDVS = devsign * DIGISLDVS;
- DIGISLDVD = ddx(igisl, V(di));
- DIGISLDVD = devsign * DIGISLDVD;
- `ifdef __SHMOD__
- DIGISLDVTH = ddx(igisl, Temp(t));
- DIGISLDVTH = devsign * DIGISLDVTH;
- `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
deleted file mode 100644
index f4e211f77..000000000
--- a/src/spicelib/devices/adms/bsimcmg/admsva/bsimcmg_cfringe.include
+++ /dev/null
@@ -1,117 +0,0 @@
-// ********************************************************
-// **** 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
-// ********************************************************
-
-/*
- (while (re-search-forward
- (rx bow
- (or "Hr" "Lr" "Hgdelta" "Lmax" "y" "x"
- "CcgSat" "Cnon" "TT1" "Ccg1" "r1cf" "Rcf" "Ccg2"
- "Ccg" "C1" "C2" "C3" "Cfglog" "dcf" "TT0"
- "TT2" "Cfgsat" "delta" "xCfg")
- eow)
- nil t)
- (replace-match "x42_\\&" t))
-*/
-
-`define Cfringe_2d_vars() \
- real x42_Hr, x42_Lr, x42_Hgdelta, x42_Lmax, x42_y, x42_x; \
- real x42_CcgSat, x42_Cnon, x42_TT1, x42_Ccg1, x42_r1cf, x42_Rcf, x42_Ccg2; \
- real x42_Ccg, x42_C1, x42_C2, x42_C3, x42_Cfglog, x42_dcf, x42_TT0; \
- real x42_TT2, x42_Cfgsat, x42_delta, Cfg;
-
-`define Cfringe_2d(block_name, Hg, Hc, Lext, Wfin, Lc, Lg, Tox, Cf1, Cgg) \
-begin : block_name \
- x42_Hr = 2.3 + 0.2 * ((Hg) + (Tox)) / (Hc); \
- x42_Lr = 1.05; \
- x42_Hgdelta = abs((Hg) + (Tox) - (Hc)); \
- x42_Lmax = (Lext) * x42_Lr; \
- \
- x42_y = min((Hc), (Hg) + (Tox)); \
- x42_x = (Lext) / (x42_Hr + 1.0); \
- x42_Cnon = 1.7e12; \
- x42_CcgSat = epssp * (x42_y - x42_x) / (Lext); \
- x42_TT1 = x42_Cnon * x42_CcgSat; \
- if(x42_TT1 > `EXPL_THRESHOLD) \
- x42_Ccg1 = x42_CcgSat; \
- else \
- x42_Ccg1 = 1.0 / x42_Cnon * ln(1.0 + lexp(x42_TT1)); \
- \
- x42_r1cf = 0.5 * \
- min((Hc) / ((Hg) + (Tox)), ((Hg) + (Tox)) / (Hc)); \
- x42_Rcf = x42_Hgdelta * x42_r1cf; \
- x42_Ccg2 = epssp * 2 / `M_PI * \
- ln(((Lext) + 0.5 * `M_PI * x42_Rcf) / (Lext)); \
- \
- x42_Ccg = (Wfin) * (x42_Ccg1 + x42_Ccg2); \
- \
- x42_x = x42_Lmax / (Hg); \
- x42_C1 = 4.0 / (sqrt(2.0 * (x42_x + 1)) * `M_PI); \
- x42_C2 = sqrt((Tox) * (Tox) + 2.0 * (Hg) * (Tox) + \
- (Hg) * (Hg) * (x42_x + 1)) * sqrt(x42_x + 1) + (Tox) + \
- (Hg) * x42_x + (Hg); \
- x42_C3 = (Tox) * sqrt((x42_x + 1) * (x42_x + 4)) + Tox * (x42_x + 2); \
- x42_Cfglog = epssp * (x42_C1 * ln(x42_C2 / x42_C3) + 12.27); \
- \
- x42_dcf = x42_Hr * x42_Lr; \
- x42_TT0 = sqrt(x42_dcf * x42_dcf + 1.0); \
- x42_TT1 = sqrt((x42_dcf * x42_dcf + 1) * ((x42_dcf * (Tox)) * (x42_dcf * (Tox)) + \
- 2 * x42_dcf * x42_Lmax * (Tox) + (x42_dcf * x42_dcf + 1) * x42_Lmax * x42_Lmax)) \
- + x42_dcf * (Tox) + x42_dcf * x42_dcf * x42_Lmax + x42_Lmax; \
- x42_TT2 = (x42_TT0 + 1.0) * (x42_dcf * (Tox)); \
- x42_Cfgsat = 2.0 * epssp * sqrt(2) / `M_PI * (Cf1) * x42_dcf \
- / x42_TT0 * ln(x42_TT1 / x42_TT2); \
- \
- x42_delta = 1.2e-12; \
- x42_TT1 = x42_Cfgsat - x42_Cfglog - x42_delta; \
- Cfg = (Wfin) * (x42_Cfgsat - 0.5 * (x42_TT1 + \
- sqrt(x42_TT1 * x42_TT1 + 4 * x42_delta * x42_Cfgsat))); \
- Cgg = x42_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
deleted file mode 100644
index a0210a4f9..000000000
--- a/src/spicelib/devices/adms/bsimcmg/admsva/bsimcmg_quasi_static_cv.include
+++ /dev/null
@@ -1,89 +0,0 @@
-// ********************************************************
-// **** 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
deleted file mode 100644
index 892a126cc..000000000
--- a/src/spicelib/devices/adms/bsimcmg/admsva/bsimcmg_rdsmod.include
+++ /dev/null
@@ -1,84 +0,0 @@
-// *******************************************************
-// **** 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
deleted file mode 100644
index 0d1ec67e5..000000000
--- a/src/spicelib/devices/adms/bsimcmg/admsva/common_defs.include
+++ /dev/null
@@ -1,185 +0,0 @@
-// ********************************************************
-// **** 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/dev.c b/src/spicelib/devices/dev.c
index 168268c2a..c17aec6c3 100644
--- a/src/spicelib/devices/dev.c
+++ b/src/spicelib/devices/dev.c
@@ -126,7 +126,6 @@ int add_udn(int,Evt_Udn_Info_t **);
#include "adms/ekv/ekvitf.h"
#include "adms/psp102/psp102itf.h"
#include "adms/bsimbulk/bsimbulkitf.h"
-#include "adms/bsimcmg/bsimcmgitf.h"
#endif
#ifdef CIDER
/* Numerical devices (Cider integration) */
@@ -208,7 +207,6 @@ static SPICEdev *(*static_devices[])(void) = {
(SPICEdev *(*)(void)) get_ekv_info,
(SPICEdev *(*)(void)) get_psp102_info,
(SPICEdev *(*)(void)) get_bsimbulk_info,
- (SPICEdev *(*)(void)) get_bsimcmg_info,
#endif
#ifdef NDEV
@@ -293,7 +291,7 @@ SPICEdev ** devices(void)
#define DEVICES_USED {"asrc", "bjt", "vbic", "bsim1", "bsim2", "bsim3", "bsim3v32", "bsim3v2", "bsim3v1", "bsim4", "bsim4v5", "bsim4v6", "bsim4v7", \
"bsim4soi", "bsim3soipd", "bsim3soifd", "bsim3soidd", "hisim2", "hisimhv1", "hisimhv2", \
"cap", "cccs", "ccvs", "csw", "dio", "hfet", "hfet2", "ind", "isrc", "jfet", "ltra", "mes", "mesa" ,"mos1", "mos2", "mos3", \
- "mos6", "mos9", "res", "soi3", "sw", "tra", "urc", "vccs", "vcvs", "vsrc", "hicum0", "hicum2", "bjt504t", "ekv", "psp102", "bsimbulk", "bsimcmg"}
+ "mos6", "mos9", "res", "soi3", "sw", "tra", "urc", "vccs", "vcvs", "vsrc", "hicum0", "hicum2", "bjt504t", "ekv", "psp102", "bsimbulk"}
#else
#define DEVICES_USED {"asrc", "bjt", "vbic", "bsim1", "bsim2", "bsim3", "bsim3v32", "bsim3v2", "bsim3v1", "bsim4", "bsim4v5", "bsim4v6", "bsim4v7", \
"bsim4soi", "bsim3soipd", "bsim3soifd", "bsim3soidd", "hisim2", "hisimhv1", "hisimhv2", \
diff --git a/src/spicelib/parser/inp2m.c b/src/spicelib/parser/inp2m.c
index a89d2652d..e902237d3 100644
--- a/src/spicelib/parser/inp2m.c
+++ b/src/spicelib/parser/inp2m.c
@@ -32,8 +32,7 @@ model_numnodes(int type)
}
#ifdef ADMS
- if (type == INPtypelook("BSIMBULK") || /* bsimbulk.va */
- type == INPtypelook("BSIMCMG")) /* bsimcmg.va */
+ if (type == INPtypelook("BSIMBULK")) /* bsimbulk.va */
{
return 5;
}
@@ -134,7 +133,6 @@ INP2M(CKTcircuit *ckt, INPtables *tab, card *current)
thismodel->INPmodType != INPtypelook("ekv") &&
thismodel->INPmodType != INPtypelook("psp102") &&
thismodel->INPmodType != INPtypelook("bsimbulk") &&
- thismodel->INPmodType != INPtypelook("bsimcmg") &&
#endif
thismodel->INPmodType != INPtypelook("HiSIM2") &&
thismodel->INPmodType != INPtypelook("HiSIMHV1") &&
diff --git a/src/spicelib/parser/inpdomod.c b/src/spicelib/parser/inpdomod.c
index cdfd9bf78..41e94f124 100644
--- a/src/spicelib/parser/inpdomod.c
+++ b/src/spicelib/parser/inpdomod.c
@@ -337,14 +337,6 @@ char *INPdomodel(CKTcircuit *ckt, card * image, INPtables * tab)
INPmkTemp
("Device type BSIMBULK not available in this binary\n");}
break;
- case 17:
- case 72:
- type = INPtypelook("BSIMCMG");
- if (type < 0) {
- err =
- INPmkTemp
- ("Device type BSIMCMG not available in this binary\n");}
- break;
case 44:
type = INPtypelook("ekv");
if (type < 0) {