Update to version 4.7.0
This commit is contained in:
parent
a1d0aca288
commit
0132e5430d
|
|
@ -8,10 +8,9 @@ SUBDIRS = \
|
|||
bsim3 \
|
||||
bsim3soi \
|
||||
bsim4 \
|
||||
bsim4v2 \
|
||||
bsim4v3 \
|
||||
bsim4v4 \
|
||||
bsim4v5 \
|
||||
bsim4v6 \
|
||||
bsim3v0 \
|
||||
bsim3v1 \
|
||||
bsim3v32 \
|
||||
|
|
@ -69,10 +68,9 @@ DIST_SUBDIRS = \
|
|||
bsim3 \
|
||||
bsim3soi \
|
||||
bsim4 \
|
||||
bsim4v2 \
|
||||
bsim4v3 \
|
||||
bsim4v4 \
|
||||
bsim4v5 \
|
||||
bsim4v6 \
|
||||
bsim3v0 \
|
||||
bsim3v1 \
|
||||
bsim3v32 \
|
||||
|
|
|
|||
|
|
@ -1,8 +1,8 @@
|
|||
/**** BSIM4.6.2 Released by Wenwei Yang 07/31/2008 ****/
|
||||
/**** BSIM4.7.0 Released by Darsen Lu 04/08/2011 ****/
|
||||
|
||||
/**********
|
||||
* Copyright 2006 Regents of the University of California. All rights reserved.
|
||||
* File: b4.c of BSIM4.6.2.
|
||||
* File: b4.c of BSIM4.7.0.
|
||||
* Author: 2000 Weidong Liu
|
||||
* Authors: 2001- Xuemei Xi, Mohan Dunga, Ali Niknejad, Chenming Hu.
|
||||
* Authors: 2006- Mohan Dunga, Ali Niknejad, Chenming Hu
|
||||
|
|
@ -18,6 +18,7 @@
|
|||
* Modified by Mohan Dunga, 12/13/2006.
|
||||
* Modified by Mohan Dunga, Wenwei Yang, 05/18/2007.
|
||||
* Modified by Wenwei Yang, 07/31/2008.
|
||||
* Modified by Tanvir Morshed, Darsen Lu 03/27/2011
|
||||
**********/
|
||||
|
||||
#include "ngspice.h"
|
||||
|
|
@ -126,9 +127,11 @@ IOP( "geomod", BSIM4_MOD_GEOMOD, IF_INTEGER, "Geometry dependent parasitics mode
|
|||
IOP( "fnoimod", BSIM4_MOD_FNOIMOD, IF_INTEGER, "Flicker noise model selector"),
|
||||
IOP( "tnoimod", BSIM4_MOD_TNOIMOD, IF_INTEGER, "Thermal noise model selector"),
|
||||
IOP( "mtrlmod", BSIM4_MOD_MTRLMOD, IF_INTEGER, "parameter for non-silicon substrate or metal gate selector"),
|
||||
IOP( "mtrlcompatmod", BSIM4_MOD_MTRLCOMPATMOD, IF_INTEGER, "New Material Mod backward compatibility selector"),
|
||||
IOP( "igcmod", BSIM4_MOD_IGCMOD, IF_INTEGER, "Gate-to-channel Ig model selector"),
|
||||
IOP( "igbmod", BSIM4_MOD_IGBMOD, IF_INTEGER, "Gate-to-body Ig model selector"),
|
||||
IOP( "tempmod", BSIM4_MOD_TEMPMOD, IF_INTEGER, "Temperature model selector"),
|
||||
IOP( "gidlmod", BSIM4_MOD_GIDLMOD, IF_INTEGER, "parameter for GIDL selector"), /* v4.7 New GIDL/GISL */
|
||||
IOP( "paramchk", BSIM4_MOD_PARAMCHK, IF_INTEGER, "Model parameter checking selector"),
|
||||
IOP( "binunit", BSIM4_MOD_BINUNIT, IF_INTEGER, "Bin unit selector"),
|
||||
IOP( "version", BSIM4_MOD_VERSION, IF_STRING, "parameter for model version"),
|
||||
|
|
@ -187,6 +190,10 @@ IOP( "k3b", BSIM4_MOD_K3B, IF_REAL, "Body effect coefficient of k3"),
|
|||
IOP( "w0", BSIM4_MOD_W0, IF_REAL, "Narrow width effect parameter"),
|
||||
IOP( "dvtp0", BSIM4_MOD_DVTP0, IF_REAL, "First parameter for Vth shift due to pocket"),
|
||||
IOP( "dvtp1", BSIM4_MOD_DVTP1, IF_REAL, "Second parameter for Vth shift due to pocket"),
|
||||
IOP( "dvtp2", BSIM4_MOD_DVTP2, IF_REAL, "3rd parameter for Vth shift due to pocket"),
|
||||
IOP( "dvtp3", BSIM4_MOD_DVTP3, IF_REAL, "4th parameter for Vth shift due to pocket"),
|
||||
IOP( "dvtp4", BSIM4_MOD_DVTP4, IF_REAL, "5th parameter for Vth shift due to pocket"),
|
||||
IOP( "dvtp5", BSIM4_MOD_DVTP5, IF_REAL, "6th parameter for Vth shift due to pocket"),
|
||||
IOP( "lpe0", BSIM4_MOD_LPE0, IF_REAL, "Equivalent length of pocket region at zero bias"),
|
||||
IOP( "lpeb", BSIM4_MOD_LPEB, IF_REAL, "Equivalent length of pocket region accounting for body bias"),
|
||||
IOP( "dvt0", BSIM4_MOD_DVT0, IF_REAL, "Short channel effect coeff. 0"),
|
||||
|
|
@ -310,6 +317,9 @@ IOP( "xn", BSIM4_MOD_XN, IF_REAL, " back scattering parameter"),
|
|||
IOP( "vfbsdoff", BSIM4_MOD_VFBSDOFF, IF_REAL, "S/D flatband voltage offset"),
|
||||
IOP( "tvfbsdoff", BSIM4_MOD_TVFBSDOFF, IF_REAL, "Temperature parameter for vfbsdoff"),
|
||||
IOP( "tvoff", BSIM4_MOD_TVOFF, IF_REAL, "Temperature parameter for voff"),
|
||||
IOP( "tnfactor", BSIM4_MOD_TNFACTOR, IF_REAL, "Temperature parameter for nfactor"), /* v4.7 Tanvir*/
|
||||
IOP( "teta0", BSIM4_MOD_TETA0, IF_REAL, "Temperature parameter for eta0"), /* v4.7 Tanvir*/
|
||||
IOP( "tvoffcv", BSIM4_MOD_TVOFFCV, IF_REAL, "Temperature parameter for tvoffcv"), /* v4.7 Tanvir*/
|
||||
|
||||
IOP( "lintnoi", BSIM4_MOD_LINTNOI, IF_REAL, "lint offset for noise calculation"),
|
||||
IOP( "lint", BSIM4_MOD_LINT, IF_REAL, "Length reduction parameter"),
|
||||
|
|
@ -365,10 +375,16 @@ IOP( "beta0", BSIM4_MOD_BETA0, IF_REAL, "substrate current model parameter"),
|
|||
IOP( "agidl", BSIM4_MOD_AGIDL, IF_REAL, "Pre-exponential constant for GIDL"),
|
||||
IOP( "bgidl", BSIM4_MOD_BGIDL, IF_REAL, "Exponential constant for GIDL"),
|
||||
IOP( "cgidl", BSIM4_MOD_CGIDL, IF_REAL, "Parameter for body-bias dependence of GIDL"),
|
||||
IOP( "rgidl", BSIM4_MOD_RGIDL, IF_REAL, "GIDL vg parameter"), /* v4.7 New GIDL/GISL */
|
||||
IOP( "kgidl", BSIM4_MOD_KGIDL, IF_REAL, "GIDL vb parameter"), /* v4.7 New GIDL/GISL */
|
||||
IOP( "fgidl", BSIM4_MOD_FGIDL, IF_REAL, "GIDL vb parameter"), /* v4.7 New GIDL/GISL */
|
||||
IOP( "egidl", BSIM4_MOD_EGIDL, IF_REAL, "Fitting parameter for Bandbending"),
|
||||
IOP( "agisl", BSIM4_MOD_AGISL, IF_REAL, "Pre-exponential constant for GISL"),
|
||||
IOP( "bgisl", BSIM4_MOD_BGISL, IF_REAL, "Exponential constant for GISL"),
|
||||
IOP( "cgisl", BSIM4_MOD_CGISL, IF_REAL, "Parameter for body-bias dependence of GISL"),
|
||||
IOP( "rgisl", BSIM4_MOD_RGISL, IF_REAL, "GISL vg parameter"), /* v4.7 New GIDL/GISL */
|
||||
IOP( "kgisl", BSIM4_MOD_KGISL, IF_REAL, "GISL vb parameter"), /* v4.7 New GIDL/GISL */
|
||||
IOP( "fgisl", BSIM4_MOD_FGISL, IF_REAL, "GISL vb parameter"), /* v4.7 New GIDL/GISL */
|
||||
IOP( "egisl", BSIM4_MOD_EGISL, IF_REAL, "Fitting parameter for Bandbending"),
|
||||
IOP( "aigc", BSIM4_MOD_AIGC, IF_REAL, "Parameter for Igc"),
|
||||
IOP( "bigc", BSIM4_MOD_BIGC, IF_REAL, "Parameter for Igc"),
|
||||
|
|
@ -508,6 +524,10 @@ IOP( "lk3b", BSIM4_MOD_LK3B, IF_REAL, "Length dependence of k3b"),
|
|||
IOP( "lw0", BSIM4_MOD_LW0, IF_REAL, "Length dependence of w0"),
|
||||
IOP( "ldvtp0", BSIM4_MOD_LDVTP0, IF_REAL, "Length dependence of dvtp0"),
|
||||
IOP( "ldvtp1", BSIM4_MOD_LDVTP1, IF_REAL, "Length dependence of dvtp1"),
|
||||
IOP( "ldvtp2", BSIM4_MOD_LDVTP2, IF_REAL, "Length dependence of dvtp2"),
|
||||
IOP( "ldvtp3", BSIM4_MOD_LDVTP3, IF_REAL, "Length dependence of dvtp3"),
|
||||
IOP( "ldvtp4", BSIM4_MOD_LDVTP4, IF_REAL, "Length dependence of dvtp4"),
|
||||
IOP( "ldvtp5", BSIM4_MOD_LDVTP5, IF_REAL, "Length dependence of dvtp5"),
|
||||
IOP( "llpe0", BSIM4_MOD_LLPE0, IF_REAL, "Length dependence of lpe0"),
|
||||
IOP( "llpeb", BSIM4_MOD_LLPEB, IF_REAL, "Length dependence of lpeb"),
|
||||
IOP( "ldvt0", BSIM4_MOD_LDVT0, IF_REAL, "Length dependence of dvt0"),
|
||||
|
|
@ -576,10 +596,16 @@ IOP( "lbeta0", BSIM4_MOD_LBETA0, IF_REAL, "Length dependence of beta0"),
|
|||
IOP( "lagidl", BSIM4_MOD_LAGIDL, IF_REAL, "Length dependence of agidl"),
|
||||
IOP( "lbgidl", BSIM4_MOD_LBGIDL, IF_REAL, "Length dependence of bgidl"),
|
||||
IOP( "lcgidl", BSIM4_MOD_LCGIDL, IF_REAL, "Length dependence of cgidl"),
|
||||
IOP( "lrgidl", BSIM4_MOD_LRGIDL, IF_REAL, "Length dependence of rgidl"), /* v4.7 New GIDL/GISL */
|
||||
IOP( "lkgidl", BSIM4_MOD_LKGIDL, IF_REAL, "Length dependence of kgidl"), /* v4.7 New GIDL/GISL */
|
||||
IOP( "lfgidl", BSIM4_MOD_LFGIDL, IF_REAL, "Length dependence of fgidl"), /* v4.7 New GIDL/GISL */
|
||||
IOP( "legidl", BSIM4_MOD_LEGIDL, IF_REAL, "Length dependence of egidl"),
|
||||
IOP( "lagisl", BSIM4_MOD_LAGISL, IF_REAL, "Length dependence of agisl"),
|
||||
IOP( "lbgisl", BSIM4_MOD_LBGISL, IF_REAL, "Length dependence of bgisl"),
|
||||
IOP( "lcgisl", BSIM4_MOD_LCGISL, IF_REAL, "Length dependence of cgisl"),
|
||||
IOP( "lrgisl", BSIM4_MOD_LRGISL, IF_REAL, "Length dependence of rgisl"), /* v4.7 New GIDL/GISL */
|
||||
IOP( "lkgisl", BSIM4_MOD_LKGISL, IF_REAL, "Length dependence of kgisl"), /* v4.7 New GIDL/GISL */
|
||||
IOP( "lfgisl", BSIM4_MOD_LFGISL, IF_REAL, "Length dependence of fgisl"), /* v4.7 New GIDL/GISL */
|
||||
IOP( "legisl", BSIM4_MOD_LEGISL, IF_REAL, "Length dependence of egisl"),
|
||||
IOP( "laigc", BSIM4_MOD_LAIGC, IF_REAL, "Length dependence of aigc"),
|
||||
IOP( "lbigc", BSIM4_MOD_LBIGC, IF_REAL, "Length dependence of bigc"),
|
||||
|
|
@ -623,6 +649,9 @@ IOP( "lucs", BSIM4_MOD_LUCS, IF_REAL, "Length dependence of lucs"),
|
|||
IOP( "lvfbsdoff", BSIM4_MOD_LVFBSDOFF, IF_REAL, "Length dependence of vfbsdoff"),
|
||||
IOP( "ltvfbsdoff", BSIM4_MOD_LTVFBSDOFF, IF_REAL, "Length dependence of tvfbsdoff"),
|
||||
IOP( "ltvoff", BSIM4_MOD_LTVOFF, IF_REAL, "Length dependence of tvoff"),
|
||||
IOP( "ltnfactor", BSIM4_MOD_LTNFACTOR, IF_REAL, "Length dependence of tnfactor"), /* v4.7 Tanvir*/
|
||||
IOP( "lteta0", BSIM4_MOD_LTETA0, IF_REAL, "Length dependence of teta0"), /* v4.7 Tanvir*/
|
||||
IOP( "ltvoffcv", BSIM4_MOD_LTVOFFCV, IF_REAL, "Length dependence of tvoffcv"), /* v4.7 Tanvir*/
|
||||
|
||||
IOP( "wcdsc", BSIM4_MOD_WCDSC, IF_REAL, "Width dependence of cdsc"),
|
||||
IOP( "wcdscb", BSIM4_MOD_WCDSCB, IF_REAL, "Width dependence of cdscb"),
|
||||
|
|
@ -657,6 +686,10 @@ IOP( "wk3b", BSIM4_MOD_WK3B, IF_REAL, "Width dependence of k3b"),
|
|||
IOP( "ww0", BSIM4_MOD_WW0, IF_REAL, "Width dependence of w0"),
|
||||
IOP( "wdvtp0", BSIM4_MOD_WDVTP0, IF_REAL, "Width dependence of dvtp0"),
|
||||
IOP( "wdvtp1", BSIM4_MOD_WDVTP1, IF_REAL, "Width dependence of dvtp1"),
|
||||
IOP( "wdvtp2", BSIM4_MOD_WDVTP2, IF_REAL, "Width dependence of dvtp2"),
|
||||
IOP( "wdvtp3", BSIM4_MOD_WDVTP3, IF_REAL, "Width dependence of dvtp3"),
|
||||
IOP( "wdvtp4", BSIM4_MOD_WDVTP4, IF_REAL, "Width dependence of dvtp4"),
|
||||
IOP( "wdvtp5", BSIM4_MOD_WDVTP5, IF_REAL, "Width dependence of dvtp5"),
|
||||
IOP( "wlpe0", BSIM4_MOD_WLPE0, IF_REAL, "Width dependence of lpe0"),
|
||||
IOP( "wlpeb", BSIM4_MOD_WLPEB, IF_REAL, "Width dependence of lpeb"),
|
||||
IOP( "wdvt0", BSIM4_MOD_WDVT0, IF_REAL, "Width dependence of dvt0"),
|
||||
|
|
@ -725,10 +758,16 @@ IOP( "wbeta0", BSIM4_MOD_WBETA0, IF_REAL, "Width dependence of beta0"),
|
|||
IOP( "wagidl", BSIM4_MOD_WAGIDL, IF_REAL, "Width dependence of agidl"),
|
||||
IOP( "wbgidl", BSIM4_MOD_WBGIDL, IF_REAL, "Width dependence of bgidl"),
|
||||
IOP( "wcgidl", BSIM4_MOD_WCGIDL, IF_REAL, "Width dependence of cgidl"),
|
||||
IOP( "wrgidl", BSIM4_MOD_WRGIDL, IF_REAL, "Width dependence of rgidl"), /* v4.7 New GIDL/GISL */
|
||||
IOP( "wkgidl", BSIM4_MOD_WKGIDL, IF_REAL, "Width dependence of kgidl"), /* v4.7 New GIDL/GISL */
|
||||
IOP( "wfgidl", BSIM4_MOD_WFGIDL, IF_REAL, "Width dependence of fgidl"), /* v4.7 New GIDL/GISL */
|
||||
IOP( "wegidl", BSIM4_MOD_WEGIDL, IF_REAL, "Width dependence of egidl"),
|
||||
IOP( "wagisl", BSIM4_MOD_WAGISL, IF_REAL, "Width dependence of agisl"),
|
||||
IOP( "wbgisl", BSIM4_MOD_WBGISL, IF_REAL, "Width dependence of bgisl"),
|
||||
IOP( "wcgisl", BSIM4_MOD_WCGISL, IF_REAL, "Width dependence of cgisl"),
|
||||
IOP( "wrgisl", BSIM4_MOD_WRGISL, IF_REAL, "Width dependence of rgisl"), /* v4.7 New GIDL/GISL */
|
||||
IOP( "wkgisl", BSIM4_MOD_WKGISL, IF_REAL, "Width dependence of kgisl"), /* v4.7 New GIDL/GISL */
|
||||
IOP( "wfgisl", BSIM4_MOD_WFGISL, IF_REAL, "Width dependence of fgisl"), /* v4.7 New GIDL/GISL */
|
||||
IOP( "wegisl", BSIM4_MOD_WEGISL, IF_REAL, "Width dependence of egisl"),
|
||||
IOP( "waigc", BSIM4_MOD_WAIGC, IF_REAL, "Width dependence of aigc"),
|
||||
IOP( "wbigc", BSIM4_MOD_WBIGC, IF_REAL, "Width dependence of bigc"),
|
||||
|
|
@ -771,6 +810,9 @@ IOP( "wucs", BSIM4_MOD_WUCS, IF_REAL, "Width dependence of ucs"),
|
|||
IOP( "wvfbsdoff", BSIM4_MOD_WVFBSDOFF, IF_REAL, "Width dependence of vfbsdoff"),
|
||||
IOP( "wtvfbsdoff", BSIM4_MOD_WTVFBSDOFF, IF_REAL, "Width dependence of tvfbsdoff"),
|
||||
IOP( "wtvoff", BSIM4_MOD_WTVOFF, IF_REAL, "Width dependence of tvoff"),
|
||||
IOP( "wtnfactor", BSIM4_MOD_WTNFACTOR, IF_REAL, "Width dependence of tnfactor"), /* v4.7 Tanvir*/
|
||||
IOP( "wteta0", BSIM4_MOD_WTETA0, IF_REAL, "Width dependence of teta0"), /* v4.7 Tanvir*/
|
||||
IOP( "wtvoffcv", BSIM4_MOD_WTVOFFCV, IF_REAL, "Width dependence of tvoffcv"), /* v4.7 Tanvir*/
|
||||
|
||||
IOP( "pcdsc", BSIM4_MOD_PCDSC, IF_REAL, "Cross-term dependence of cdsc"),
|
||||
IOP( "pcdscb", BSIM4_MOD_PCDSCB, IF_REAL, "Cross-term dependence of cdscb"),
|
||||
|
|
@ -805,6 +847,10 @@ IOP( "pk3b", BSIM4_MOD_PK3B, IF_REAL, "Cross-term dependence of k3b"),
|
|||
IOP( "pw0", BSIM4_MOD_PW0, IF_REAL, "Cross-term dependence of w0"),
|
||||
IOP( "pdvtp0", BSIM4_MOD_PDVTP0, IF_REAL, "Cross-term dependence of dvtp0"),
|
||||
IOP( "pdvtp1", BSIM4_MOD_PDVTP1, IF_REAL, "Cross-term dependence of dvtp1"),
|
||||
IOP( "pdvtp2", BSIM4_MOD_PDVTP2, IF_REAL, "Cross-term dependence of dvtp2"),
|
||||
IOP( "pdvtp3", BSIM4_MOD_PDVTP3, IF_REAL, "Cross-term dependence of dvtp3"),
|
||||
IOP( "pdvtp4", BSIM4_MOD_PDVTP4, IF_REAL, "Cross-term dependence of dvtp4"),
|
||||
IOP( "pdvtp5", BSIM4_MOD_PDVTP5, IF_REAL, "Cross-term dependence of dvtp5"),
|
||||
IOP( "plpe0", BSIM4_MOD_PLPE0, IF_REAL, "Cross-term dependence of lpe0"),
|
||||
IOP( "plpeb", BSIM4_MOD_PLPEB, IF_REAL, "Cross-term dependence of lpeb"),
|
||||
IOP( "pdvt0", BSIM4_MOD_PDVT0, IF_REAL, "Cross-term dependence of dvt0"),
|
||||
|
|
@ -873,11 +919,17 @@ IOP( "pbeta0", BSIM4_MOD_PBETA0, IF_REAL, "Cross-term dependence of beta0"),
|
|||
IOP( "pagidl", BSIM4_MOD_PAGIDL, IF_REAL, "Cross-term dependence of agidl"),
|
||||
IOP( "pbgidl", BSIM4_MOD_PBGIDL, IF_REAL, "Cross-term dependence of bgidl"),
|
||||
IOP( "pcgidl", BSIM4_MOD_PCGIDL, IF_REAL, "Cross-term dependence of cgidl"),
|
||||
IOP( "prgidl", BSIM4_MOD_PRGIDL, IF_REAL, "Cross-term dependence of rgidl"), /* v4.7 New GIDL/GISL */
|
||||
IOP( "pkgidl", BSIM4_MOD_PKGIDL, IF_REAL, "Cross-term dependence of kgidl"), /* v4.7 New GIDL/GISL */
|
||||
IOP( "pfgidl", BSIM4_MOD_PFGIDL, IF_REAL, "Cross-term dependence of fgidl"), /* v4.7 New GIDL/GISL */
|
||||
IOP( "pegidl", BSIM4_MOD_PEGIDL, IF_REAL, "Cross-term dependence of egidl"),
|
||||
IOP( "pagisl", BSIM4_MOD_PAGISL, IF_REAL, "Cross-term dependence of agisl"),
|
||||
IOP( "pbgisl", BSIM4_MOD_PBGISL, IF_REAL, "Cross-term dependence of bgisl"),
|
||||
IOP( "pcgisl", BSIM4_MOD_PCGISL, IF_REAL, "Cross-term dependence of cgisl"),
|
||||
IOP( "pegisl", BSIM4_MOD_PEGISL, IF_REAL, "Cross-term dependence of egisl"),
|
||||
IOP( "prgisl", BSIM4_MOD_PRGISL, IF_REAL, "Cross-term dependence of rgisl"), /* v4.7 New GIDL/GISL */
|
||||
IOP( "pkgisl", BSIM4_MOD_PKGISL, IF_REAL, "Cross-term dependence of kgisl"), /* v4.7 New GIDL/GISL */
|
||||
IOP( "pfgisl", BSIM4_MOD_PFGISL, IF_REAL, "Cross-term dependence of fgisl"), /* v4.7 New GIDL/GISL */
|
||||
IOP( "paigc", BSIM4_MOD_PAIGC, IF_REAL, "Cross-term dependence of aigc"),
|
||||
IOP( "pbigc", BSIM4_MOD_PBIGC, IF_REAL, "Cross-term dependence of bigc"),
|
||||
IOP( "pcigc", BSIM4_MOD_PCIGC, IF_REAL, "Cross-term dependence of cigc"),
|
||||
|
|
@ -919,6 +971,9 @@ IOP( "pucs", BSIM4_MOD_PUCS, IF_REAL, "Cross-term dependence of ucs"),
|
|||
IOP( "pvfbsdoff", BSIM4_MOD_PVFBSDOFF, IF_REAL, "Cross-term dependence of vfbsdoff"),
|
||||
IOP( "ptvfbsdoff", BSIM4_MOD_PTVFBSDOFF, IF_REAL, "Cross-term dependence of tvfbsdoff"),
|
||||
IOP( "ptvoff", BSIM4_MOD_PTVOFF, IF_REAL, "Cross-term dependence of tvoff"),
|
||||
IOP( "ptnfactor", BSIM4_MOD_PTNFACTOR, IF_REAL, "Cross-term dependence of tnfactor"), /* v4.7 Tanvir*/
|
||||
IOP( "pteta0", BSIM4_MOD_PTETA0, IF_REAL, "Cross-term dependence of teta0"), /* v4.7 Tanvir*/
|
||||
IOP( "ptvoffcv", BSIM4_MOD_PTVOFFCV, IF_REAL, "Cross-term dependence of tvoffcv"), /* v4.7 Tanvir*/
|
||||
|
||||
/* stress effect*/
|
||||
IOP( "saref", BSIM4_MOD_SAREF, IF_REAL, "Reference distance between OD edge to poly of one side"),
|
||||
|
|
@ -965,8 +1020,10 @@ IOP( "noib", BSIM4_MOD_NOIB, IF_REAL, "Flicker noise parameter"),
|
|||
IOP( "noic", BSIM4_MOD_NOIC, IF_REAL, "Flicker noise parameter"),
|
||||
IOP( "tnoia", BSIM4_MOD_TNOIA, IF_REAL, "Thermal noise parameter"),
|
||||
IOP( "tnoib", BSIM4_MOD_TNOIB, IF_REAL, "Thermal noise parameter"),
|
||||
IOP( "tnoic", BSIM4_MOD_TNOIC, IF_REAL, "Thermal noise parameter"),
|
||||
IOP( "rnoia", BSIM4_MOD_RNOIA, IF_REAL, "Thermal noise coefficient"),
|
||||
IOP( "rnoib", BSIM4_MOD_RNOIB, IF_REAL, "Thermal noise coefficient"),
|
||||
IOP( "rnoic", BSIM4_MOD_RNOIC, IF_REAL, "Thermal noise coefficient"),
|
||||
IOP( "ntnoi", BSIM4_MOD_NTNOI, IF_REAL, "Thermal noise parameter"),
|
||||
IOP( "em", BSIM4_MOD_EM, IF_REAL, "Flicker noise parameter"),
|
||||
IOP( "ef", BSIM4_MOD_EF, IF_REAL, "Flicker noise frequency exponent"),
|
||||
|
|
|
|||
|
|
@ -1,8 +1,8 @@
|
|||
/**** BSIM4.6.2 Released by Wenwei Yang 07/31/2008 ****/
|
||||
/**** BSIM4.7.0 Released by Darsen Lu 04/08/2011 ****/
|
||||
|
||||
/**********
|
||||
* Copyright 2006 Regents of the University of California. All rights reserved.
|
||||
* File: b4acld.c of BSIM4.6.2.
|
||||
* File: b4acld.c of BSIM4.7.0.
|
||||
* Author: 2000 Weidong Liu
|
||||
* Authors: 2001- Xuemei Xi, Mohan Dunga, Ali Niknejad, Chenming Hu.
|
||||
* Authors: 2006- Mohan Dunga, Ali Niknejad, Chenming Hu
|
||||
|
|
@ -91,7 +91,7 @@ double m;
|
|||
Cdsr = here->BSIM4cdsb * T2;
|
||||
Cdbr = -(Cddr + Cdgr + Cdsr);
|
||||
|
||||
/* WDLiu: Cxyi mulitplied by jomega below, and actually to be of conductance */
|
||||
/* WDLiu: Cxyi mulitplied by jomega below, and actually to be of conductance */
|
||||
Cddi = here->BSIM4cddb * T3 * omega;
|
||||
Cdgi = here->BSIM4cdgb * T3 * omega;
|
||||
Cdsi = here->BSIM4cdsb * T3 * omega;
|
||||
|
|
@ -107,15 +107,15 @@ double m;
|
|||
Cssi = Css * T3 * omega;
|
||||
Csbi = -(Csdi + Csgi + Cssi);
|
||||
|
||||
Cgdr = -(Cddr + Csdr + here->BSIM4cbdb);
|
||||
Cggr = -(Cdgr + Csgr + here->BSIM4cbgb);
|
||||
Cgsr = -(Cdsr + Cssr + here->BSIM4cbsb);
|
||||
Cgbr = -(Cgdr + Cggr + Cgsr);
|
||||
Cgdr = -(Cddr + Csdr + here->BSIM4cbdb);
|
||||
Cggr = -(Cdgr + Csgr + here->BSIM4cbgb);
|
||||
Cgsr = -(Cdsr + Cssr + here->BSIM4cbsb);
|
||||
Cgbr = -(Cgdr + Cggr + Cgsr);
|
||||
|
||||
Cgdi = -(Cddi + Csdi);
|
||||
Cggi = -(Cdgi + Csgi);
|
||||
Cgsi = -(Cdsi + Cssi);
|
||||
Cgbi = -(Cgdi + Cggi + Cgsi);
|
||||
Cgdi = -(Cddi + Csdi);
|
||||
Cggi = -(Cdgi + Csgi);
|
||||
Cgsi = -(Cdsi + Cssi);
|
||||
Cgbi = -(Cgdi + Cggi + Cgsi);
|
||||
}
|
||||
else /* QS */
|
||||
{ gmr = here->BSIM4gm;
|
||||
|
|
@ -144,11 +144,11 @@ double m;
|
|||
|
||||
|
||||
if (here->BSIM4mode >= 0)
|
||||
{ Gmr = gmr;
|
||||
{ Gmr = gmr;
|
||||
Gmbsr = gmbsr;
|
||||
FwdSumr = Gmr + Gmbsr;
|
||||
RevSumr = 0.0;
|
||||
Gmi = gmi;
|
||||
Gmi = gmi;
|
||||
Gmbsi = gmbsi;
|
||||
FwdSumi = Gmi + Gmbsi;
|
||||
RevSumi = 0.0;
|
||||
|
|
@ -263,7 +263,7 @@ double m;
|
|||
else
|
||||
{ xcdbbr = Cdbr * omega;
|
||||
xcsbbr = -(xcsgbr + xcsdbr + xcssbr + xcsgmb)
|
||||
+ here->BSIM4capbs * omega;
|
||||
+ here->BSIM4capbs * omega;
|
||||
|
||||
xcbdb = here->BSIM4cbdb * omega;
|
||||
xcbsb = here->BSIM4cbsb * omega;
|
||||
|
|
@ -476,7 +476,7 @@ double m;
|
|||
*(here->BSIM4GEgpPtr) -= m * geltd;
|
||||
|
||||
*(here->BSIM4GPgpPtr +1) += m * xcggbr;
|
||||
*(here->BSIM4GPgpPtr) += m * (geltd + xcggbi + gIgtotg);
|
||||
*(here->BSIM4GPgpPtr) += m * (geltd + xcggbi + gIgtotg);
|
||||
*(here->BSIM4GPdpPtr +1) += m * xcgdbr;
|
||||
*(here->BSIM4GPdpPtr) += m * (xcgdbi + gIgtotd);
|
||||
*(here->BSIM4GPspPtr +1) += m * xcgsbr;
|
||||
|
|
@ -493,13 +493,13 @@ double m;
|
|||
|
||||
*(here->BSIM4GPgePtr) -= m * gcrg;
|
||||
*(here->BSIM4GPgpPtr +1) += m * xcggbr;
|
||||
*(here->BSIM4GPgpPtr) -= m * (gcrgg - xcggbi - gIgtotg);
|
||||
*(here->BSIM4GPgpPtr) -= m * (gcrgg - xcggbi - gIgtotg);
|
||||
*(here->BSIM4GPdpPtr +1) += m * xcgdbr;
|
||||
*(here->BSIM4GPdpPtr) -= m * (gcrgd - xcgdbi - gIgtotd);
|
||||
*(here->BSIM4GPdpPtr) -= m * (gcrgd - xcgdbi - gIgtotd);
|
||||
*(here->BSIM4GPspPtr +1) += m * xcgsbr;
|
||||
*(here->BSIM4GPspPtr) -= m * (gcrgs - xcgsbi - gIgtots);
|
||||
*(here->BSIM4GPspPtr) -= m * (gcrgs - xcgsbi - gIgtots);
|
||||
*(here->BSIM4GPbpPtr +1) += m * xcgbbr;
|
||||
*(here->BSIM4GPbpPtr) -= m * (gcrgb - xcgbbi - gIgtotb);
|
||||
*(here->BSIM4GPbpPtr) -= m * (gcrgb - xcgbbi - gIgtotb);
|
||||
}
|
||||
else if (here->BSIM4rgateMod == 3)
|
||||
{ *(here->BSIM4GEgePtr) += m * geltd;
|
||||
|
|
@ -552,7 +552,7 @@ double m;
|
|||
|
||||
*(here->BSIM4DPdpPtr +1) += m * (xcddbr + gdsi + RevSumi);
|
||||
*(here->BSIM4DPdpPtr) += m * (gdpr + xcddbi + gdsr + here->BSIM4gbd
|
||||
- gdtotd + RevSumr + gbdpdp - gIdtotd);
|
||||
- gdtotd + RevSumr + gbdpdp - gIdtotd);
|
||||
*(here->BSIM4DPdPtr) -= m * (gdpr + gdtot);
|
||||
*(here->BSIM4DPgpPtr +1) += m * (xcdgbr + Gmi);
|
||||
*(here->BSIM4DPgpPtr) += m * (Gmr + xcdgbi - gdtotg + gbdpg - gIdtotg);
|
||||
|
|
@ -570,7 +570,7 @@ double m;
|
|||
*(here->BSIM4SPgpPtr) -= m * (Gmr - xcsgbi + gstotg - gbspg + gIstotg);
|
||||
*(here->BSIM4SPspPtr +1) += m * (xcssbr + gdsi + FwdSumi);
|
||||
*(here->BSIM4SPspPtr) += m * (gspr + xcssbi + gdsr + here->BSIM4gbs
|
||||
- gstots + FwdSumr + gbspsp - gIstots);
|
||||
- gstots + FwdSumr + gbspsp - gIstots);
|
||||
*(here->BSIM4SPsPtr) -= m * (gspr + gstot);
|
||||
*(here->BSIM4SPbpPtr +1) += m * (xcsbbr - Gmbsi);
|
||||
*(here->BSIM4SPbpPtr) -= m * (gjbs + gstotb - xcsbbi + Gmbsr - gbspb + gIstotb);
|
||||
|
|
@ -586,32 +586,32 @@ double m;
|
|||
*(here->BSIM4BPspPtr) -= m * (gjbs - gbbsp + gIbtots);
|
||||
*(here->BSIM4BPbpPtr +1) += m * xcbbb;
|
||||
*(here->BSIM4BPbpPtr) += m * (gjbd + gjbs - here->BSIM4gbbs
|
||||
- gIbtotb);
|
||||
ggidld = here->BSIM4ggidld;
|
||||
ggidlg = here->BSIM4ggidlg;
|
||||
ggidlb = here->BSIM4ggidlb;
|
||||
ggislg = here->BSIM4ggislg;
|
||||
ggisls = here->BSIM4ggisls;
|
||||
ggislb = here->BSIM4ggislb;
|
||||
- gIbtotb);
|
||||
ggidld = here->BSIM4ggidld;
|
||||
ggidlg = here->BSIM4ggidlg;
|
||||
ggidlb = here->BSIM4ggidlb;
|
||||
ggislg = here->BSIM4ggislg;
|
||||
ggisls = here->BSIM4ggisls;
|
||||
ggislb = here->BSIM4ggislb;
|
||||
|
||||
/* stamp gidl */
|
||||
(*(here->BSIM4DPdpPtr) += m * ggidld);
|
||||
(*(here->BSIM4DPgpPtr) += m * ggidlg);
|
||||
(*(here->BSIM4DPspPtr) -= m * ((ggidlg + ggidld) + ggidlb));
|
||||
(*(here->BSIM4DPbpPtr) += m * ggidlb);
|
||||
(*(here->BSIM4BPdpPtr) -= m * ggidld);
|
||||
(*(here->BSIM4BPgpPtr) -= m * ggidlg);
|
||||
(*(here->BSIM4BPspPtr) += m * ((ggidlg + ggidld) + ggidlb));
|
||||
(*(here->BSIM4BPbpPtr) -= m * ggidlb);
|
||||
/* stamp gisl */
|
||||
(*(here->BSIM4SPdpPtr) -= m * ((ggisls + ggislg) + ggislb));
|
||||
(*(here->BSIM4SPgpPtr) += m * ggislg);
|
||||
(*(here->BSIM4SPspPtr) += m * ggisls);
|
||||
(*(here->BSIM4SPbpPtr) += m * ggislb);
|
||||
(*(here->BSIM4BPdpPtr) += m * ((ggislg + ggisls) + ggislb));
|
||||
(*(here->BSIM4BPgpPtr) -= m * ggislg);
|
||||
(*(here->BSIM4BPspPtr) -= m * ggisls);
|
||||
(*(here->BSIM4BPbpPtr) -= m * ggislb);
|
||||
/* stamp gidl */
|
||||
(*(here->BSIM4DPdpPtr) += m * ggidld);
|
||||
(*(here->BSIM4DPgpPtr) += m * ggidlg);
|
||||
(*(here->BSIM4DPspPtr) -= m * ((ggidlg + ggidld) + ggidlb));
|
||||
(*(here->BSIM4DPbpPtr) += m * ggidlb);
|
||||
(*(here->BSIM4BPdpPtr) -= m * ggidld);
|
||||
(*(here->BSIM4BPgpPtr) -= m * ggidlg);
|
||||
(*(here->BSIM4BPspPtr) += m * ((ggidlg + ggidld) + ggidlb));
|
||||
(*(here->BSIM4BPbpPtr) -= m * ggidlb);
|
||||
/* stamp gisl */
|
||||
(*(here->BSIM4SPdpPtr) -= m * ((ggisls + ggislg) + ggislb));
|
||||
(*(here->BSIM4SPgpPtr) += m * ggislg);
|
||||
(*(here->BSIM4SPspPtr) += m * ggisls);
|
||||
(*(here->BSIM4SPbpPtr) += m * ggislb);
|
||||
(*(here->BSIM4BPdpPtr) += m * ((ggislg + ggisls) + ggislb));
|
||||
(*(here->BSIM4BPgpPtr) -= m * ggislg);
|
||||
(*(here->BSIM4BPspPtr) -= m * ggisls);
|
||||
(*(here->BSIM4BPbpPtr) -= m * ggislb);
|
||||
|
||||
if (here->BSIM4rbodyMod)
|
||||
{ (*(here->BSIM4DPdbPtr +1) += m * xcdbdb);
|
||||
|
|
@ -631,8 +631,8 @@ double m;
|
|||
(*(here->BSIM4BPbPtr) -= m * here->BSIM4grbpb);
|
||||
(*(here->BSIM4BPsbPtr) -= m * here->BSIM4grbps);
|
||||
(*(here->BSIM4BPbpPtr) += m * (here->BSIM4grbpd + here->BSIM4grbps
|
||||
+ here->BSIM4grbpb));
|
||||
/* WDLiu: (-here->BSIM4gbbs) already added to BPbpPtr */
|
||||
+ here->BSIM4grbpb));
|
||||
/* WDLiu: (-here->BSIM4gbbs) already added to BPbpPtr */
|
||||
|
||||
(*(here->BSIM4SBspPtr +1) += m * xcsbsb);
|
||||
(*(here->BSIM4SBspPtr) -= m * here->BSIM4gbs);
|
||||
|
|
@ -640,7 +640,7 @@ double m;
|
|||
(*(here->BSIM4SBbPtr) -= m * here->BSIM4grbsb);
|
||||
(*(here->BSIM4SBsbPtr +1) -= m * xcsbsb);
|
||||
(*(here->BSIM4SBsbPtr) += m * (here->BSIM4gbs
|
||||
+ here->BSIM4grbps + here->BSIM4grbsb));
|
||||
+ here->BSIM4grbps + here->BSIM4grbsb));
|
||||
|
||||
(*(here->BSIM4BdbPtr) -= m * here->BSIM4grbdb);
|
||||
(*(here->BSIM4BbpPtr) -= m * here->BSIM4grbpb);
|
||||
|
|
@ -650,12 +650,12 @@ double m;
|
|||
}
|
||||
|
||||
|
||||
/*
|
||||
* WDLiu: The internal charge node generated for transient NQS is not needed for
|
||||
* AC NQS. The following is not doing a real job, but we have to keep it;
|
||||
* otherwise a singular AC NQS matrix may occur if the transient NQS is on.
|
||||
* The charge node is isolated from the instance.
|
||||
*/
|
||||
/*
|
||||
* WDLiu: The internal charge node generated for transient NQS is not needed for
|
||||
* AC NQS. The following is not doing a real job, but we have to keep it;
|
||||
* otherwise a singular AC NQS matrix may occur if the transient NQS is on.
|
||||
* The charge node is isolated from the instance.
|
||||
*/
|
||||
if (here->BSIM4trnqsMod)
|
||||
{ (*(here->BSIM4QqPtr) += m * 1.0);
|
||||
(*(here->BSIM4QgpPtr) += 0.0);
|
||||
|
|
|
|||
|
|
@ -1,8 +1,8 @@
|
|||
/**** BSIM4.6.2 Released by Wenwei Yang 07/31/2008 ****/
|
||||
/**** BSIM4.7.0 Released by Darsen Lu 04/08/2011 ****/
|
||||
|
||||
/**********
|
||||
* Copyright 2006 Regents of the University of California. All rights reserved.
|
||||
* File: b4ask.c of BSIM4.6.2.
|
||||
* File: b4ask.c of BSIM4.7.0.
|
||||
* Author: 2000 Weidong Liu
|
||||
* Authors: 2001- Xuemei Xi, Mohan Dunga, Ali Niknejad, Chenming Hu.
|
||||
* Authors: 2006- Mohan Dunga, Ali Niknejad, Chenming Hu
|
||||
|
|
@ -80,16 +80,16 @@ BSIM4instance *here = (BSIM4instance*)inst;
|
|||
case BSIM4_SD:
|
||||
value->rValue = here->BSIM4sd ;
|
||||
return(OK);
|
||||
case BSIM4_SCA:
|
||||
case BSIM4_SCA:
|
||||
value->rValue = here->BSIM4sca ;
|
||||
return(OK);
|
||||
case BSIM4_SCB:
|
||||
case BSIM4_SCB:
|
||||
value->rValue = here->BSIM4scb ;
|
||||
return(OK);
|
||||
case BSIM4_SCC:
|
||||
case BSIM4_SCC:
|
||||
value->rValue = here->BSIM4scc ;
|
||||
return(OK);
|
||||
case BSIM4_SC:
|
||||
case BSIM4_SC:
|
||||
value->rValue = here->BSIM4sc ;
|
||||
return(OK);
|
||||
|
||||
|
|
@ -213,10 +213,6 @@ BSIM4instance *here = (BSIM4instance*)inst;
|
|||
value->rValue = here->BSIM4csub;
|
||||
value->rValue *= here->BSIM4m;
|
||||
return(OK);
|
||||
case BSIM4_QINV:
|
||||
value->rValue = here-> BSIM4qinv;
|
||||
value->rValue *= here->BSIM4m;
|
||||
return(OK);
|
||||
case BSIM4_IGIDL:
|
||||
value->rValue = here->BSIM4Igidl;
|
||||
value->rValue *= here->BSIM4m;
|
||||
|
|
@ -311,6 +307,7 @@ BSIM4instance *here = (BSIM4instance*)inst;
|
|||
return(OK);
|
||||
case BSIM4_GTAU:
|
||||
value->rValue = here->BSIM4gtau;
|
||||
value->rValue *= here->BSIM4m;
|
||||
return(OK);
|
||||
case BSIM4_CGGB:
|
||||
value->rValue = here->BSIM4cggb;
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load Diff
|
|
@ -1,8 +1,8 @@
|
|||
/**** BSIM4.6.2 Released by Wenwei Yang 04/05/2008 ****/
|
||||
/**** BSIM4.7.0 Released by Darsen Lu 04/08/2011 ****/
|
||||
|
||||
/**********
|
||||
* Copyright 2006 Regents of the University of California. All rights reserved.
|
||||
* File: b4cvtest.c of BSIM4.6.2.
|
||||
* File: b4cvtest.c of BSIM4.7.0.
|
||||
* Author: 2000 Weidong Liu
|
||||
* Authors: 2001- Xuemei Xi, Mohan Dunga, Ali Niknejad, Chenming Hu.
|
||||
* Authors: 2006- Mohan Dunga, Ali Niknejad, Chenming Hu
|
||||
|
|
@ -44,7 +44,7 @@ double tol0, tol1, tol2, tol3, tol4, tol5, tol6;
|
|||
for (; model != NULL; model = model->BSIM4nextModel)
|
||||
{ for (here = model->BSIM4instances; here != NULL ;
|
||||
here=here->BSIM4nextInstance)
|
||||
{ if (here->BSIM4owner != ARCHme) continue;
|
||||
{ if (here->BSIM4owner != ARCHme) continue;
|
||||
vds = model->BSIM4type
|
||||
* (*(ckt->CKTrhsOld + here->BSIM4dNodePrime)
|
||||
- *(ckt->CKTrhsOld + here->BSIM4sNodePrime));
|
||||
|
|
@ -93,7 +93,7 @@ double tol0, tol1, tol2, tol3, tol4, tol5, tol6;
|
|||
|
||||
if (here->BSIM4mode >= 0)
|
||||
{ Idtot = here->BSIM4cd + here->BSIM4csub - here->BSIM4cbd
|
||||
+ here->BSIM4Igidl;
|
||||
+ here->BSIM4Igidl;
|
||||
cdhat = Idtot - here->BSIM4gbd * delvbd_jct
|
||||
+ (here->BSIM4gmbs + here->BSIM4gbbs + here->BSIM4ggidlb) * delvbs
|
||||
+ (here->BSIM4gm + here->BSIM4gbgs + here->BSIM4ggidlg) * delvgs
|
||||
|
|
@ -146,8 +146,8 @@ double tol0, tol1, tol2, tol3, tol4, tol5, tol6;
|
|||
*/
|
||||
|
||||
if ((here->BSIM4off == 0) || (!(ckt->CKTmode & MODEINITFIX)))
|
||||
{ tol0 = ckt->CKTreltol * MAX(fabs(cdhat), fabs(Idtot))
|
||||
+ ckt->CKTabstol;
|
||||
{ tol0 = ckt->CKTreltol * MAX(fabs(cdhat), fabs(Idtot))
|
||||
+ ckt->CKTabstol;
|
||||
tol1 = ckt->CKTreltol * MAX(fabs(cseshat), fabs(Isestot))
|
||||
+ ckt->CKTabstol;
|
||||
tol2 = ckt->CKTreltol * MAX(fabs(cdedhat), fabs(Idedtot))
|
||||
|
|
@ -161,7 +161,7 @@ double tol0, tol1, tol2, tol3, tol4, tol5, tol6;
|
|||
|
||||
if ((fabs(cdhat - Idtot) >= tol0) || (fabs(cseshat - Isestot) >= tol1)
|
||||
|| (fabs(cdedhat - Idedtot) >= tol2))
|
||||
{ ckt->CKTnoncon++;
|
||||
{ ckt->CKTnoncon++;
|
||||
return(OK);
|
||||
}
|
||||
|
||||
|
|
@ -172,25 +172,25 @@ double tol0, tol1, tol2, tol3, tol4, tol5, tol6;
|
|||
}
|
||||
|
||||
Ibtot = here->BSIM4cbs + here->BSIM4cbd
|
||||
- here->BSIM4Igidl - here->BSIM4Igisl - here->BSIM4csub;
|
||||
- here->BSIM4Igidl - here->BSIM4Igisl - here->BSIM4csub;
|
||||
if (here->BSIM4mode >= 0)
|
||||
{ cbhat = Ibtot + here->BSIM4gbd * delvbd_jct
|
||||
+ here->BSIM4gbs * delvbs_jct - (here->BSIM4gbbs + here->BSIM4ggidlb)
|
||||
* delvbs - (here->BSIM4gbgs + here->BSIM4ggidlg) * delvgs
|
||||
- (here->BSIM4gbds + here->BSIM4ggidld) * delvds
|
||||
- here->BSIM4ggislg * delvgd - here->BSIM4ggislb* delvbd + here->BSIM4ggisls * delvds ;
|
||||
}
|
||||
else
|
||||
{ cbhat = Ibtot + here->BSIM4gbs * delvbs_jct + here->BSIM4gbd
|
||||
- here->BSIM4ggislg * delvgd - here->BSIM4ggislb* delvbd + here->BSIM4ggisls * delvds ;
|
||||
}
|
||||
else
|
||||
{ cbhat = Ibtot + here->BSIM4gbs * delvbs_jct + here->BSIM4gbd
|
||||
* delvbd_jct - (here->BSIM4gbbs + here->BSIM4ggislb) * delvbd
|
||||
- (here->BSIM4gbgs + here->BSIM4ggislg) * delvgd
|
||||
+ (here->BSIM4gbds + here->BSIM4ggisld - here->BSIM4ggidls) * delvds
|
||||
- here->BSIM4ggidlg * delvgs - here->BSIM4ggidlb * delvbs;
|
||||
}
|
||||
+ (here->BSIM4gbds + here->BSIM4ggisld - here->BSIM4ggidls) * delvds
|
||||
- here->BSIM4ggidlg * delvgs - here->BSIM4ggidlb * delvbs;
|
||||
}
|
||||
tol6 = ckt->CKTreltol * MAX(fabs(cbhat),
|
||||
fabs(Ibtot)) + ckt->CKTabstol;
|
||||
fabs(Ibtot)) + ckt->CKTabstol;
|
||||
if (fabs(cbhat - Ibtot) > tol6)
|
||||
{ ckt->CKTnoncon++;
|
||||
{ ckt->CKTnoncon++;
|
||||
return(OK);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,8 +1,8 @@
|
|||
/**** BSIM4.6.2 Released by Wenwei Yang 07/31/2008 ****/
|
||||
/**** BSIM4.7.0 Released by Darsen Lu 04/08/2011 ****/
|
||||
|
||||
/**********
|
||||
* Copyright 2006 Regents of the University of California. All rights reserved.
|
||||
* File: b4del.c of BSIM4.6.2.
|
||||
* File: b4del.c of BSIM4.7.0.
|
||||
* Author: 2000 Weidong Liu
|
||||
* Authors: 2001- Xuemei Xi, Mohan Dunga, Ali Niknejad, Chenming Hu.
|
||||
* Authors: 2006- Mohan Dunga, Ali Niknejad, Chenming Hu
|
||||
|
|
|
|||
|
|
@ -1,8 +1,8 @@
|
|||
/**** BSIM4.6.2 Released by Wenwei Yang 07/31/2008 ****/
|
||||
/**** BSIM4.7.0 Released by Darsen Lu 04/08/2011 ****/
|
||||
|
||||
/**********
|
||||
* Copyright 2006 Regents of the University of California. All rights reserved.
|
||||
* File: b4dest.c of BSIM4.6.2.
|
||||
* File: b4dest.c of BSIM4.7.0.
|
||||
* Author: 2000 Weidong Liu
|
||||
* Authors: 2001- Xuemei Xi, Mohan Dunga, Ali Niknejad, Chenming Hu.
|
||||
* Authors: 2006- Mohan Dunga, Ali Niknejad, Chenming Hu
|
||||
|
|
@ -27,7 +27,7 @@ BSIM4model *oldmod = NULL;
|
|||
for (; mod ; mod = mod->BSIM4nextModel)
|
||||
{ if(oldmod) FREE(oldmod);
|
||||
oldmod = mod;
|
||||
prev = NULL;
|
||||
prev = (BSIM4instance *)NULL;
|
||||
for (here = mod->BSIM4instances; here; here = here->BSIM4nextInstance)
|
||||
{ if(prev) FREE(prev);
|
||||
prev = here;
|
||||
|
|
|
|||
|
|
@ -1,8 +1,8 @@
|
|||
/**** BSIM4.6.2 Released by Wenwei Yang 07/31/2008 ****/
|
||||
/**** BSIM4.7.0 Released by Darsen Lu 04/08/2011 ****/
|
||||
|
||||
/**********
|
||||
* Copyright 2006 Regents of the University of California. All rights reserved.
|
||||
* File: b4geo.c of BSIM4.6.2.
|
||||
* File: b4geo.c of BSIM4.7.0.
|
||||
* Author: 2000 Weidong Liu
|
||||
* Authors: 2001- Xuemei Xi, Mohan Dunga, Ali Niknejad, Chenming Hu.
|
||||
* Authors: 2006- Mohan Dunga, Ali Niknejad, Chenming Hu
|
||||
|
|
@ -13,6 +13,7 @@
|
|||
#include "ngspice.h"
|
||||
#include "bsim4def.h"
|
||||
|
||||
|
||||
/*
|
||||
* WDLiu:
|
||||
* This subrutine is a special module to process the geometry dependent
|
||||
|
|
@ -21,12 +22,10 @@
|
|||
*/
|
||||
|
||||
int
|
||||
BSIM4RdsEndIso(double, double, double, double, double, double, int, int, double *);
|
||||
int
|
||||
BSIM4RdsEndSha(double, double, double, double, double, double, int, int, double *);
|
||||
|
||||
static int
|
||||
BSIM4NumFingerDiff(double nf, int minSD, double *nuIntD, double *nuEndD, double *nuIntS, double *nuEndS)
|
||||
BSIM4NumFingerDiff(
|
||||
double nf,
|
||||
int minSD,
|
||||
double *nuIntD, double *nuEndD, double *nuIntS, double *nuEndS)
|
||||
{
|
||||
int NF;
|
||||
NF = (int)nf;
|
||||
|
|
@ -53,7 +52,11 @@ return 0;
|
|||
|
||||
|
||||
int
|
||||
BSIM4PAeffGeo(double nf, int geo, int minSD, double Weffcj, double DMCG, double DMCI, double DMDG, double *Ps, double *Pd, double *As, double *Ad)
|
||||
BSIM4PAeffGeo(
|
||||
double nf,
|
||||
int geo, int minSD,
|
||||
double Weffcj, double DMCG, double DMCI, double DMDG,
|
||||
double *Ps, double *Pd, double *As, double *Ad)
|
||||
{
|
||||
double T0, T1, T2;
|
||||
double ADiso, ADsha, ADmer, ASiso, ASsha, ASmer;
|
||||
|
|
@ -150,9 +153,14 @@ return 0;
|
|||
|
||||
|
||||
int
|
||||
BSIM4RdseffGeo(double nf, int geo, int rgeo, int minSD, double Weffcj, double Rsh, double DMCG, double DMCI, double DMDG, int Type, double *Rtot)
|
||||
BSIM4RdseffGeo(
|
||||
double nf,
|
||||
int geo, int rgeo, int minSD,
|
||||
double Weffcj, double Rsh, double DMCG, double DMCI, double DMDG,
|
||||
int Type,
|
||||
double *Rtot)
|
||||
{
|
||||
double Rint = 0.0, Rend = 0.0;
|
||||
double Rint=0.0, Rend = 0.0;
|
||||
double nuIntD = 0.0, nuEndD = 0.0, nuIntS = 0.0, nuEndS = 0.0;
|
||||
|
||||
if (geo < 9) /* since geo = 9 and 10 only happen when nf = even */
|
||||
|
|
@ -265,9 +273,13 @@ return 0;
|
|||
|
||||
|
||||
int
|
||||
BSIM4RdsEndIso(double Weffcj, double Rsh, double DMCG, double DMCI, double DMDG, double nuEnd, int rgeo, int Type, double *Rend)
|
||||
BSIM4RdsEndIso(
|
||||
double Weffcj, double Rsh, double DMCG, double DMCI, double DMDG,
|
||||
double nuEnd,
|
||||
int rgeo, int Type,
|
||||
double *Rend)
|
||||
{
|
||||
NG_IGNORE(DMDG);
|
||||
NG_IGNORE(DMDG);
|
||||
|
||||
if (Type == 1)
|
||||
{ switch(rgeo)
|
||||
|
|
@ -322,7 +334,11 @@ return 0;
|
|||
|
||||
|
||||
int
|
||||
BSIM4RdsEndSha(double Weffcj, double Rsh, double DMCG, double DMCI, double DMDG, double nuEnd, int rgeo, int Type, double *Rend)
|
||||
BSIM4RdsEndSha(
|
||||
double Weffcj, double Rsh, double DMCG, double DMCI, double DMDG,
|
||||
double nuEnd,
|
||||
int rgeo, int Type,
|
||||
double *Rend)
|
||||
{
|
||||
NG_IGNORE(DMCI);
|
||||
NG_IGNORE(DMDG);
|
||||
|
|
|
|||
|
|
@ -1,8 +1,8 @@
|
|||
/**** BSIM4.6.2 Released by Wenwei Yang 07/31/2008****/
|
||||
/**** BSIM4.7.0 Released by Darsen Lu 04/08/2011 ****/
|
||||
|
||||
/**********
|
||||
* Copyright 2006 Regents of the University of California. All rights reserved.
|
||||
* File: b4getic.c of BSIM4.6.2.
|
||||
* File: b4getic.c of BSIM4.7.0.
|
||||
* Author: 2000 Weidong Liu
|
||||
* Authors: 2001- Xuemei Xi, Mohan Dunga, Ali Niknejad, Chenming Hu.
|
||||
* Authors: 2006- Mohan Dunga, Ali Niknejad, Chenming Hu
|
||||
|
|
@ -28,13 +28,13 @@ BSIM4instance *here;
|
|||
for (; model ; model = model->BSIM4nextModel)
|
||||
{ for (here = model->BSIM4instances; here; here = here->BSIM4nextInstance)
|
||||
{ if (here->BSIM4owner != ARCHme) continue;
|
||||
if (!here->BSIM4icVDSGiven)
|
||||
{ here->BSIM4icVDS = *(ckt->CKTrhs + here->BSIM4dNode)
|
||||
- *(ckt->CKTrhs + here->BSIM4sNode);
|
||||
if (!here->BSIM4icVDSGiven)
|
||||
{ here->BSIM4icVDS = *(ckt->CKTrhs + here->BSIM4dNode)
|
||||
- *(ckt->CKTrhs + here->BSIM4sNode);
|
||||
}
|
||||
if (!here->BSIM4icVGSGiven)
|
||||
{ here->BSIM4icVGS = *(ckt->CKTrhs + here->BSIM4gNodeExt)
|
||||
- *(ckt->CKTrhs + here->BSIM4sNode);
|
||||
{ here->BSIM4icVGS = *(ckt->CKTrhs + here->BSIM4gNodeExt)
|
||||
- *(ckt->CKTrhs + here->BSIM4sNode);
|
||||
}
|
||||
if(!here->BSIM4icVBSGiven)
|
||||
{ here->BSIM4icVBS = *(ckt->CKTrhs + here->BSIM4bNode)
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load Diff
|
|
@ -1,8 +1,8 @@
|
|||
/**** BSIM4.6.2 Released by Wenwei Yang 07/31/2008 ****/
|
||||
/**** BSIM4.7.0 Released by Darsen Lu 04/08/2011 ****/
|
||||
|
||||
/**********
|
||||
* Copyright 2006 Regents of the University of California. All rights reserved.
|
||||
* File: b4mask.c of BSIM4.6.2.
|
||||
* File: b4mask.c of BSIM4.7.0.
|
||||
* Author: 2000 Weidong Liu
|
||||
* Authors: 2001- Xuemei Xi, Mohan Dunga, Ali Niknejad, Chenming Hu.
|
||||
* Authors: 2006- Mohan Dunga, Ali Niknejad, Chenming Hu
|
||||
|
|
@ -15,6 +15,7 @@
|
|||
* Modified by Xuemei Xi, Mohan Dunga, 07/29/2005.
|
||||
* Modified by Mohan Dunga, 12/13/2006
|
||||
* Modified by Mohan Dunga, Wenwei Yang, 07/31/2008.
|
||||
* Modified by Tanvir Morshed, Darsen Lu 03/27/2011
|
||||
**********/
|
||||
|
||||
|
||||
|
|
@ -86,7 +87,12 @@ IFvalue *value)
|
|||
case BSIM4_MOD_MTRLMOD :
|
||||
value->iValue = model->BSIM4mtrlMod;
|
||||
return(OK);
|
||||
|
||||
case BSIM4_MOD_GIDLMOD : /* v4.7 New GIDL/GISL*/
|
||||
value->iValue = model->BSIM4gidlMod;
|
||||
return(OK);
|
||||
case BSIM4_MOD_MTRLCOMPATMOD :
|
||||
value->iValue = model->BSIM4mtrlCompatMod;
|
||||
return(OK);
|
||||
case BSIM4_MOD_IGCMOD :
|
||||
value->iValue = model->BSIM4igcMod;
|
||||
return(OK);
|
||||
|
|
@ -109,13 +115,13 @@ IFvalue *value)
|
|||
case BSIM4_MOD_VDDEOT :
|
||||
value->rValue = model->BSIM4vddeot;
|
||||
return(OK);
|
||||
case BSIM4_MOD_TEMPEOT :
|
||||
case BSIM4_MOD_TEMPEOT :
|
||||
value->rValue = model->BSIM4tempeot;
|
||||
return(OK);
|
||||
case BSIM4_MOD_LEFFEOT :
|
||||
case BSIM4_MOD_LEFFEOT :
|
||||
value->rValue = model->BSIM4leffeot;
|
||||
return(OK);
|
||||
case BSIM4_MOD_WEFFEOT :
|
||||
case BSIM4_MOD_WEFFEOT :
|
||||
value->rValue = model->BSIM4weffeot;
|
||||
return(OK);
|
||||
case BSIM4_MOD_ADOS :
|
||||
|
|
@ -281,6 +287,18 @@ IFvalue *value)
|
|||
case BSIM4_MOD_DVTP1:
|
||||
value->rValue = model->BSIM4dvtp1;
|
||||
return(OK);
|
||||
case BSIM4_MOD_DVTP2:
|
||||
value->rValue = model->BSIM4dvtp2; /* New DIBL/Rout */
|
||||
return(OK);
|
||||
case BSIM4_MOD_DVTP3:
|
||||
value->rValue = model->BSIM4dvtp3;
|
||||
return(OK);
|
||||
case BSIM4_MOD_DVTP4:
|
||||
value->rValue = model->BSIM4dvtp4;
|
||||
return(OK);
|
||||
case BSIM4_MOD_DVTP5:
|
||||
value->rValue = model->BSIM4dvtp5;
|
||||
return(OK);
|
||||
case BSIM4_MOD_DVT0 :
|
||||
value->rValue = model->BSIM4dvt0;
|
||||
return(OK);
|
||||
|
|
@ -311,7 +329,7 @@ IFvalue *value)
|
|||
case BSIM4_MOD_EU:
|
||||
value->rValue = model->BSIM4eu;
|
||||
return(OK);
|
||||
case BSIM4_MOD_UCS:
|
||||
case BSIM4_MOD_UCS:
|
||||
value->rValue = model->BSIM4ucs;
|
||||
return(OK);
|
||||
case BSIM4_MOD_UA:
|
||||
|
|
@ -350,7 +368,7 @@ IFvalue *value)
|
|||
case BSIM4_MOD_UTE:
|
||||
value->rValue = model->BSIM4ute;
|
||||
return(OK);
|
||||
case BSIM4_MOD_UCSTE:
|
||||
case BSIM4_MOD_UCSTE:
|
||||
value->rValue = model->BSIM4ucste;
|
||||
return(OK);
|
||||
case BSIM4_MOD_VOFF:
|
||||
|
|
@ -359,6 +377,15 @@ IFvalue *value)
|
|||
case BSIM4_MOD_TVOFF:
|
||||
value->rValue = model->BSIM4tvoff;
|
||||
return(OK);
|
||||
case BSIM4_MOD_TNFACTOR: /* v4.7 temp dep of leakage current */
|
||||
value->rValue = model->BSIM4tnfactor;
|
||||
return(OK);
|
||||
case BSIM4_MOD_TETA0: /* v4.7 temp dep of leakage current */
|
||||
value->rValue = model->BSIM4teta0;
|
||||
return(OK);
|
||||
case BSIM4_MOD_TVOFFCV: /* v4.7 temp dep of leakage current */
|
||||
value->rValue = model->BSIM4tvoffcv;
|
||||
return(OK);
|
||||
case BSIM4_MOD_VFBSDOFF:
|
||||
value->rValue = model->BSIM4vfbsdoff;
|
||||
return(OK);
|
||||
|
|
@ -482,6 +509,15 @@ IFvalue *value)
|
|||
case BSIM4_MOD_EGIDL:
|
||||
value->rValue = model->BSIM4egidl;
|
||||
return(OK);
|
||||
case BSIM4_MOD_FGIDL: /* v4.7 New GIDL/GISL*/
|
||||
value->rValue = model->BSIM4fgidl;
|
||||
return(OK);
|
||||
case BSIM4_MOD_KGIDL: /* v4.7 New GIDL/GISL*/
|
||||
value->rValue = model->BSIM4kgidl;
|
||||
return(OK);
|
||||
case BSIM4_MOD_RGIDL: /* v4.7 New GIDL/GISL*/
|
||||
value->rValue = model->BSIM4rgidl;
|
||||
return(OK);
|
||||
case BSIM4_MOD_AGISL:
|
||||
value->rValue = model->BSIM4agisl;
|
||||
return(OK);
|
||||
|
|
@ -494,6 +530,15 @@ IFvalue *value)
|
|||
case BSIM4_MOD_EGISL:
|
||||
value->rValue = model->BSIM4egisl;
|
||||
return(OK);
|
||||
case BSIM4_MOD_FGISL: /* v4.7 New GIDL/GISL*/
|
||||
value->rValue = model->BSIM4fgisl;
|
||||
return(OK);
|
||||
case BSIM4_MOD_KGISL: /* v4.7 New GIDL/GISL*/
|
||||
value->rValue = model->BSIM4kgisl;
|
||||
return(OK);
|
||||
case BSIM4_MOD_RGISL: /* v4.7 New GIDL/GISL*/
|
||||
value->rValue = model->BSIM4rgisl;
|
||||
return(OK);
|
||||
case BSIM4_MOD_AIGC:
|
||||
value->rValue = model->BSIM4aigc;
|
||||
return(OK);
|
||||
|
|
@ -584,12 +629,18 @@ IFvalue *value)
|
|||
case BSIM4_MOD_TNOIB:
|
||||
value->rValue = model->BSIM4tnoib;
|
||||
return(OK);
|
||||
case BSIM4_MOD_TNOIC:
|
||||
value->rValue = model->BSIM4tnoic;
|
||||
return(OK);
|
||||
case BSIM4_MOD_RNOIA:
|
||||
value->rValue = model->BSIM4rnoia;
|
||||
return(OK);
|
||||
case BSIM4_MOD_RNOIB:
|
||||
value->rValue = model->BSIM4rnoib;
|
||||
return(OK);
|
||||
case BSIM4_MOD_RNOIC:
|
||||
value->rValue = model->BSIM4rnoic;
|
||||
return(OK);
|
||||
case BSIM4_MOD_NTNOI:
|
||||
value->rValue = model->BSIM4ntnoi;
|
||||
return(OK);
|
||||
|
|
@ -639,9 +690,9 @@ IFvalue *value)
|
|||
case BSIM4_MOD_JTSSWGD:
|
||||
value->rValue = model->BSIM4jtsswgd;
|
||||
return(OK);
|
||||
case BSIM4_MOD_JTWEFF:
|
||||
value->rValue = model->BSIM4jtweff;
|
||||
return(OK);
|
||||
case BSIM4_MOD_JTWEFF:
|
||||
value->rValue = model->BSIM4jtweff;
|
||||
return(OK);
|
||||
case BSIM4_MOD_NJTS:
|
||||
value->rValue = model->BSIM4njts;
|
||||
return(OK);
|
||||
|
|
@ -1015,6 +1066,18 @@ IFvalue *value)
|
|||
case BSIM4_MOD_LDVTP1:
|
||||
value->rValue = model->BSIM4ldvtp1;
|
||||
return(OK);
|
||||
case BSIM4_MOD_LDVTP2:
|
||||
value->rValue = model->BSIM4ldvtp2; /* New DIBL/Rout */
|
||||
return(OK);
|
||||
case BSIM4_MOD_LDVTP3:
|
||||
value->rValue = model->BSIM4ldvtp3;
|
||||
return(OK);
|
||||
case BSIM4_MOD_LDVTP4:
|
||||
value->rValue = model->BSIM4ldvtp4;
|
||||
return(OK);
|
||||
case BSIM4_MOD_LDVTP5:
|
||||
value->rValue = model->BSIM4ldvtp5;
|
||||
return(OK);
|
||||
case BSIM4_MOD_LDVT0:
|
||||
value->rValue = model->BSIM4ldvt0;
|
||||
return(OK);
|
||||
|
|
@ -1078,7 +1141,7 @@ IFvalue *value)
|
|||
case BSIM4_MOD_LUTE:
|
||||
value->rValue = model->BSIM4lute;
|
||||
return(OK);
|
||||
case BSIM4_MOD_LUCSTE:
|
||||
case BSIM4_MOD_LUCSTE:
|
||||
value->rValue = model->BSIM4lucste;
|
||||
return(OK);
|
||||
case BSIM4_MOD_LVOFF:
|
||||
|
|
@ -1087,6 +1150,15 @@ IFvalue *value)
|
|||
case BSIM4_MOD_LTVOFF:
|
||||
value->rValue = model->BSIM4ltvoff;
|
||||
return(OK);
|
||||
case BSIM4_MOD_LTNFACTOR: /* v4.7 temp dep of leakage current */
|
||||
value->rValue = model->BSIM4ltnfactor;
|
||||
return(OK);
|
||||
case BSIM4_MOD_LTETA0: /* v4.7 temp dep of leakage current */
|
||||
value->rValue = model->BSIM4lteta0;
|
||||
return(OK);
|
||||
case BSIM4_MOD_LTVOFFCV: /* v4.7 temp dep of leakage current */
|
||||
value->rValue = model->BSIM4ltvoffcv;
|
||||
return(OK);
|
||||
case BSIM4_MOD_LMINV:
|
||||
value->rValue = model->BSIM4lminv;
|
||||
return(OK);
|
||||
|
|
@ -1183,9 +1255,18 @@ IFvalue *value)
|
|||
case BSIM4_MOD_LCGIDL:
|
||||
value->rValue = model->BSIM4lcgidl;
|
||||
return(OK);
|
||||
case BSIM4_MOD_LEGIDL:
|
||||
case BSIM4_MOD_LEGIDL:
|
||||
value->rValue = model->BSIM4legidl;
|
||||
return(OK);
|
||||
case BSIM4_MOD_LFGIDL: /* v4.7 New GIDL/GISL*/
|
||||
value->rValue = model->BSIM4lfgidl;
|
||||
return(OK);
|
||||
case BSIM4_MOD_LKGIDL: /* v4.7 New GIDL/GISL*/
|
||||
value->rValue = model->BSIM4lkgidl;
|
||||
return(OK);
|
||||
case BSIM4_MOD_LRGIDL: /* v4.7 New GIDL/GISL*/
|
||||
value->rValue = model->BSIM4lrgidl;
|
||||
return(OK);
|
||||
case BSIM4_MOD_LAGISL:
|
||||
value->rValue = model->BSIM4lagisl;
|
||||
return(OK);
|
||||
|
|
@ -1198,6 +1279,15 @@ IFvalue *value)
|
|||
case BSIM4_MOD_LEGISL:
|
||||
value->rValue = model->BSIM4legisl;
|
||||
return(OK);
|
||||
case BSIM4_MOD_LFGISL: /* v4.7 New GIDL/GISL*/
|
||||
value->rValue = model->BSIM4lfgisl;
|
||||
return(OK);
|
||||
case BSIM4_MOD_LKGISL: /* v4.7 New GIDL/GISL*/
|
||||
value->rValue = model->BSIM4lkgisl;
|
||||
return(OK);
|
||||
case BSIM4_MOD_LRGISL: /* v4.7 New GIDL/GISL*/
|
||||
value->rValue = model->BSIM4lrgisl;
|
||||
return(OK);
|
||||
case BSIM4_MOD_LAIGC:
|
||||
value->rValue = model->BSIM4laigc;
|
||||
return(OK);
|
||||
|
|
@ -1285,7 +1375,7 @@ IFvalue *value)
|
|||
case BSIM4_MOD_LEU:
|
||||
value->rValue = model->BSIM4leu;
|
||||
return(OK);
|
||||
case BSIM4_MOD_LUCS:
|
||||
case BSIM4_MOD_LUCS:
|
||||
value->rValue = model->BSIM4lucs;
|
||||
return(OK);
|
||||
case BSIM4_MOD_LVFB:
|
||||
|
|
@ -1435,6 +1525,18 @@ IFvalue *value)
|
|||
case BSIM4_MOD_WDVTP1:
|
||||
value->rValue = model->BSIM4wdvtp1;
|
||||
return(OK);
|
||||
case BSIM4_MOD_WDVTP2:
|
||||
value->rValue = model->BSIM4wdvtp2; /* New DIBL/Rout */
|
||||
return(OK);
|
||||
case BSIM4_MOD_WDVTP3:
|
||||
value->rValue = model->BSIM4wdvtp3;
|
||||
return(OK);
|
||||
case BSIM4_MOD_WDVTP4:
|
||||
value->rValue = model->BSIM4wdvtp4;
|
||||
return(OK);
|
||||
case BSIM4_MOD_WDVTP5:
|
||||
value->rValue = model->BSIM4wdvtp5;
|
||||
return(OK);
|
||||
case BSIM4_MOD_WLPEB:
|
||||
value->rValue = model->BSIM4wlpeb;
|
||||
return(OK);
|
||||
|
|
@ -1501,7 +1603,7 @@ IFvalue *value)
|
|||
case BSIM4_MOD_WUTE:
|
||||
value->rValue = model->BSIM4wute;
|
||||
return(OK);
|
||||
case BSIM4_MOD_WUCSTE:
|
||||
case BSIM4_MOD_WUCSTE:
|
||||
value->rValue = model->BSIM4wucste;
|
||||
return(OK);
|
||||
case BSIM4_MOD_WVOFF:
|
||||
|
|
@ -1510,6 +1612,15 @@ IFvalue *value)
|
|||
case BSIM4_MOD_WTVOFF:
|
||||
value->rValue = model->BSIM4wtvoff;
|
||||
return(OK);
|
||||
case BSIM4_MOD_WTNFACTOR: /* v4.7 temp dep of leakage current */
|
||||
value->rValue = model->BSIM4wtnfactor;
|
||||
return(OK);
|
||||
case BSIM4_MOD_WTETA0: /* v4.7 temp dep of leakage current */
|
||||
value->rValue = model->BSIM4wteta0;
|
||||
return(OK);
|
||||
case BSIM4_MOD_WTVOFFCV: /* v4.7 temp dep of leakage current */
|
||||
value->rValue = model->BSIM4wtvoffcv;
|
||||
return(OK);
|
||||
case BSIM4_MOD_WMINV:
|
||||
value->rValue = model->BSIM4wminv;
|
||||
return(OK);
|
||||
|
|
@ -1609,6 +1720,15 @@ IFvalue *value)
|
|||
case BSIM4_MOD_WEGIDL:
|
||||
value->rValue = model->BSIM4wegidl;
|
||||
return(OK);
|
||||
case BSIM4_MOD_WFGIDL: /* v4.7 New GIDL/GISL*/
|
||||
value->rValue = model->BSIM4wfgidl;
|
||||
return(OK);
|
||||
case BSIM4_MOD_WKGIDL: /* v4.7 New GIDL/GISL*/
|
||||
value->rValue = model->BSIM4wkgidl;
|
||||
return(OK);
|
||||
case BSIM4_MOD_WRGIDL: /* v4.7 New GIDL/GISL*/
|
||||
value->rValue = model->BSIM4wrgidl;
|
||||
return(OK);
|
||||
case BSIM4_MOD_WAGISL:
|
||||
value->rValue = model->BSIM4wagisl;
|
||||
return(OK);
|
||||
|
|
@ -1621,6 +1741,15 @@ IFvalue *value)
|
|||
case BSIM4_MOD_WEGISL:
|
||||
value->rValue = model->BSIM4wegisl;
|
||||
return(OK);
|
||||
case BSIM4_MOD_WFGISL: /* v4.7 New GIDL/GISL*/
|
||||
value->rValue = model->BSIM4wfgisl;
|
||||
return(OK);
|
||||
case BSIM4_MOD_WKGISL: /* v4.7 New GIDL/GISL*/
|
||||
value->rValue = model->BSIM4wkgisl;
|
||||
return(OK);
|
||||
case BSIM4_MOD_WRGISL: /* v4.7 New GIDL/GISL*/
|
||||
value->rValue = model->BSIM4wrgisl;
|
||||
return(OK);
|
||||
case BSIM4_MOD_WAIGC:
|
||||
value->rValue = model->BSIM4waigc;
|
||||
return(OK);
|
||||
|
|
@ -1708,7 +1837,7 @@ IFvalue *value)
|
|||
case BSIM4_MOD_WEU:
|
||||
value->rValue = model->BSIM4weu;
|
||||
return(OK);
|
||||
case BSIM4_MOD_WUCS:
|
||||
case BSIM4_MOD_WUCS:
|
||||
value->rValue = model->BSIM4wucs;
|
||||
return(OK);
|
||||
case BSIM4_MOD_WVFB:
|
||||
|
|
@ -1861,6 +1990,18 @@ IFvalue *value)
|
|||
case BSIM4_MOD_PDVTP1:
|
||||
value->rValue = model->BSIM4pdvtp1;
|
||||
return(OK);
|
||||
case BSIM4_MOD_PDVTP2:
|
||||
value->rValue = model->BSIM4pdvtp2; /* New DIBL/Rout */
|
||||
return(OK);
|
||||
case BSIM4_MOD_PDVTP3:
|
||||
value->rValue = model->BSIM4pdvtp3;
|
||||
return(OK);
|
||||
case BSIM4_MOD_PDVTP4:
|
||||
value->rValue = model->BSIM4pdvtp4;
|
||||
return(OK);
|
||||
case BSIM4_MOD_PDVTP5:
|
||||
value->rValue = model->BSIM4pdvtp5;
|
||||
return(OK);
|
||||
case BSIM4_MOD_PDVT0 :
|
||||
value->rValue = model->BSIM4pdvt0;
|
||||
return(OK);
|
||||
|
|
@ -1924,7 +2065,7 @@ IFvalue *value)
|
|||
case BSIM4_MOD_PUTE:
|
||||
value->rValue = model->BSIM4pute;
|
||||
return(OK);
|
||||
case BSIM4_MOD_PUCSTE:
|
||||
case BSIM4_MOD_PUCSTE:
|
||||
value->rValue = model->BSIM4pucste;
|
||||
return(OK);
|
||||
case BSIM4_MOD_PVOFF:
|
||||
|
|
@ -1933,6 +2074,15 @@ IFvalue *value)
|
|||
case BSIM4_MOD_PTVOFF:
|
||||
value->rValue = model->BSIM4ptvoff;
|
||||
return(OK);
|
||||
case BSIM4_MOD_PTNFACTOR: /* v4.7 temp dep of leakage current */
|
||||
value->rValue = model->BSIM4ptnfactor;
|
||||
return(OK);
|
||||
case BSIM4_MOD_PTETA0: /* v4.7 temp dep of leakage current */
|
||||
value->rValue = model->BSIM4pteta0;
|
||||
return(OK);
|
||||
case BSIM4_MOD_PTVOFFCV: /* v4.7 temp dep of leakage current */
|
||||
value->rValue = model->BSIM4ptvoffcv;
|
||||
return(OK);
|
||||
case BSIM4_MOD_PMINV:
|
||||
value->rValue = model->BSIM4pminv;
|
||||
return(OK);
|
||||
|
|
@ -2032,6 +2182,15 @@ IFvalue *value)
|
|||
case BSIM4_MOD_PEGIDL:
|
||||
value->rValue = model->BSIM4pegidl;
|
||||
return(OK);
|
||||
case BSIM4_MOD_PFGIDL: /* v4.7 New GIDL/GISL*/
|
||||
value->rValue = model->BSIM4pfgidl;
|
||||
return(OK);
|
||||
case BSIM4_MOD_PKGIDL: /* v4.7 New GIDL/GISL*/
|
||||
value->rValue = model->BSIM4pkgidl;
|
||||
return(OK);
|
||||
case BSIM4_MOD_PRGIDL: /* v4.7 New GIDL/GISL*/
|
||||
value->rValue = model->BSIM4prgidl;
|
||||
return(OK);
|
||||
case BSIM4_MOD_PAGISL:
|
||||
value->rValue = model->BSIM4pagisl;
|
||||
return(OK);
|
||||
|
|
@ -2044,6 +2203,15 @@ IFvalue *value)
|
|||
case BSIM4_MOD_PEGISL:
|
||||
value->rValue = model->BSIM4pegisl;
|
||||
return(OK);
|
||||
case BSIM4_MOD_PFGISL: /* v4.7 New GIDL/GISL*/
|
||||
value->rValue = model->BSIM4pfgisl;
|
||||
return(OK);
|
||||
case BSIM4_MOD_PKGISL: /* v4.7 New GIDL/GISL*/
|
||||
value->rValue = model->BSIM4pkgisl;
|
||||
return(OK);
|
||||
case BSIM4_MOD_PRGISL: /* v4.7 New GIDL/GISL*/
|
||||
value->rValue = model->BSIM4prgisl;
|
||||
return(OK);
|
||||
case BSIM4_MOD_PAIGC:
|
||||
value->rValue = model->BSIM4paigc;
|
||||
return(OK);
|
||||
|
|
@ -2131,7 +2299,7 @@ IFvalue *value)
|
|||
case BSIM4_MOD_PEU:
|
||||
value->rValue = model->BSIM4peu;
|
||||
return(OK);
|
||||
case BSIM4_MOD_PUCS:
|
||||
case BSIM4_MOD_PUCS:
|
||||
value->rValue = model->BSIM4pucs;
|
||||
return(OK);
|
||||
case BSIM4_MOD_PVFB:
|
||||
|
|
|
|||
|
|
@ -1,8 +1,8 @@
|
|||
/**** BSIM4.6.2 Released by Wenwei Yang 07/31/2008 ****/
|
||||
/**** BSIM4.7.0 Released by Darsen Lu 04/08/2011 ****/
|
||||
|
||||
/**********
|
||||
* Copyright 2006 Regents of the University of California. All rights reserved.
|
||||
* File: b4mdel.c of BSIM4.6.2.
|
||||
* File: b4mdel.c of BSIM4.7.0.
|
||||
* Author: 2000 Weidong Liu
|
||||
* Authors: 2001- Xuemei Xi, Mohan Dunga, Ali Niknejad, Chenming Hu.
|
||||
* Authors: 2006- Mohan Dunga, Ali Niknejad, Chenming Hu
|
||||
|
|
@ -18,7 +18,7 @@
|
|||
int
|
||||
BSIM4mDelete(
|
||||
GENmodel **inModel,
|
||||
IFuid modname,
|
||||
IFuid modname,
|
||||
GENmodel *kill)
|
||||
{
|
||||
BSIM4model **model = (BSIM4model**)inModel;
|
||||
|
|
|
|||
|
|
@ -1,8 +1,8 @@
|
|||
/**** BSIM4.6.2 Released by Wenwei Yang 07/31/2008 ****/
|
||||
/**** BSIM4.7.0 Released by Darsen Lu 04/08/2011 ****/
|
||||
|
||||
/**********
|
||||
* Copyright 2006 Regents of the University of California. All rights reserved.
|
||||
* File: b4mpar.c of BSIM4.6.1.
|
||||
* File: b4mpar.c of BSIM4.7.0.
|
||||
* Author: 2000 Weidong Liu
|
||||
* Authors: 2001- Xuemei Xi, Mohan Dunga, Ali Niknejad, Chenming Hu.
|
||||
* Authors: 2006- Mohan Dunga, Ali Niknejad, Chenming Hu
|
||||
|
|
@ -18,6 +18,7 @@
|
|||
* Modified by Mohan Dunga, 12/13/2006
|
||||
* Modified by Mohan Dunga, Wenwei Yang, 05/18/2007.
|
||||
* Modified by Wenwei Yang, 07/31/2008.
|
||||
* Modified by Tanvir Morshed, Darsen Lu 03/27/2011
|
||||
**********/
|
||||
|
||||
#include "ngspice.h"
|
||||
|
|
@ -99,6 +100,14 @@ GENmodel *inMod)
|
|||
mod->BSIM4mtrlMod = value->iValue;
|
||||
mod->BSIM4mtrlModGiven = TRUE;
|
||||
break;
|
||||
case BSIM4_MOD_MTRLCOMPATMOD :
|
||||
mod->BSIM4mtrlCompatMod = value->iValue;
|
||||
mod->BSIM4mtrlCompatModGiven = TRUE;
|
||||
break;
|
||||
case BSIM4_MOD_GIDLMOD : /* v4.7 New GIDL/GISL */
|
||||
mod->BSIM4gidlMod = value->iValue;
|
||||
mod->BSIM4gidlModGiven = TRUE;
|
||||
break;
|
||||
case BSIM4_MOD_IGCMOD :
|
||||
mod->BSIM4igcMod = value->iValue;
|
||||
mod->BSIM4igcModGiven = TRUE;
|
||||
|
|
@ -128,15 +137,15 @@ GENmodel *inMod)
|
|||
mod->BSIM4vddeot = value->rValue;
|
||||
mod->BSIM4vddeotGiven = TRUE;
|
||||
break;
|
||||
case BSIM4_MOD_TEMPEOT :
|
||||
case BSIM4_MOD_TEMPEOT :
|
||||
mod->BSIM4tempeot = value->rValue;
|
||||
mod->BSIM4tempeotGiven = TRUE;
|
||||
break;
|
||||
case BSIM4_MOD_LEFFEOT :
|
||||
case BSIM4_MOD_LEFFEOT :
|
||||
mod->BSIM4leffeot = value->rValue;
|
||||
mod->BSIM4leffeotGiven = TRUE;
|
||||
break;
|
||||
case BSIM4_MOD_WEFFEOT :
|
||||
case BSIM4_MOD_WEFFEOT :
|
||||
mod->BSIM4weffeot = value->rValue;
|
||||
mod->BSIM4weffeotGiven = TRUE;
|
||||
break;
|
||||
|
|
@ -230,13 +239,13 @@ GENmodel *inMod)
|
|||
mod->BSIM4nsubGiven = TRUE;
|
||||
break;
|
||||
case BSIM4_MOD_PHIG:
|
||||
mod->BSIM4phig = value->rValue;
|
||||
mod->BSIM4phigGiven = TRUE;
|
||||
break;
|
||||
mod->BSIM4phig = value->rValue;
|
||||
mod->BSIM4phigGiven = TRUE;
|
||||
break;
|
||||
case BSIM4_MOD_EPSRGATE:
|
||||
mod->BSIM4epsrgate = value->rValue;
|
||||
mod->BSIM4epsrgateGiven = TRUE;
|
||||
break;
|
||||
mod->BSIM4epsrgate = value->rValue;
|
||||
mod->BSIM4epsrgateGiven = TRUE;
|
||||
break;
|
||||
case BSIM4_MOD_EASUB:
|
||||
mod->BSIM4easub = value->rValue;
|
||||
mod->BSIM4easubGiven = TRUE;
|
||||
|
|
@ -264,8 +273,8 @@ GENmodel *inMod)
|
|||
case BSIM4_MOD_NDEP:
|
||||
mod->BSIM4ndep = value->rValue;
|
||||
mod->BSIM4ndepGiven = TRUE;
|
||||
if (mod->BSIM4ndep > 1.0e20)
|
||||
mod->BSIM4ndep *= 1.0e-6;
|
||||
if (mod->BSIM4ndep > 1.0e20)
|
||||
mod->BSIM4ndep *= 1.0e-6;
|
||||
break;
|
||||
case BSIM4_MOD_NSD:
|
||||
mod->BSIM4nsd = value->rValue;
|
||||
|
|
@ -276,8 +285,8 @@ GENmodel *inMod)
|
|||
case BSIM4_MOD_NGATE:
|
||||
mod->BSIM4ngate = value->rValue;
|
||||
mod->BSIM4ngateGiven = TRUE;
|
||||
if (mod->BSIM4ngate > 1.0e23)
|
||||
mod->BSIM4ngate *= 1.0e-6;
|
||||
if (mod->BSIM4ngate > 1.0e23)
|
||||
mod->BSIM4ngate *= 1.0e-6;
|
||||
break;
|
||||
case BSIM4_MOD_GAMMA1:
|
||||
mod->BSIM4gamma1 = value->rValue;
|
||||
|
|
@ -343,6 +352,22 @@ GENmodel *inMod)
|
|||
mod->BSIM4dvtp1 = value->rValue;
|
||||
mod->BSIM4dvtp1Given = TRUE;
|
||||
break;
|
||||
case BSIM4_MOD_DVTP2: /* New DIBL/Rout */
|
||||
mod->BSIM4dvtp2 = value->rValue;
|
||||
mod->BSIM4dvtp2Given = TRUE;
|
||||
break;
|
||||
case BSIM4_MOD_DVTP3:
|
||||
mod->BSIM4dvtp3 = value->rValue;
|
||||
mod->BSIM4dvtp3Given = TRUE;
|
||||
break;
|
||||
case BSIM4_MOD_DVTP4:
|
||||
mod->BSIM4dvtp4 = value->rValue;
|
||||
mod->BSIM4dvtp4Given = TRUE;
|
||||
break;
|
||||
case BSIM4_MOD_DVTP5:
|
||||
mod->BSIM4dvtp5 = value->rValue;
|
||||
mod->BSIM4dvtp5Given = TRUE;
|
||||
break;
|
||||
case BSIM4_MOD_W0:
|
||||
mod->BSIM4w0 = value->rValue;
|
||||
mod->BSIM4w0Given = TRUE;
|
||||
|
|
@ -387,7 +412,7 @@ GENmodel *inMod)
|
|||
mod->BSIM4eu = value->rValue;
|
||||
mod->BSIM4euGiven = TRUE;
|
||||
break;
|
||||
case BSIM4_MOD_UCS:
|
||||
case BSIM4_MOD_UCS:
|
||||
mod->BSIM4ucs = value->rValue;
|
||||
mod->BSIM4ucsGiven = TRUE;
|
||||
break;
|
||||
|
|
@ -501,6 +526,18 @@ GENmodel *inMod)
|
|||
mod->BSIM4tvoff = value->rValue;
|
||||
mod->BSIM4tvoffGiven = TRUE;
|
||||
break;
|
||||
case BSIM4_MOD_TNFACTOR: /* v4.7 temp dep of leakage current */
|
||||
mod->BSIM4tnfactor = value->rValue;
|
||||
mod->BSIM4tnfactorGiven = TRUE;
|
||||
break;
|
||||
case BSIM4_MOD_TETA0: /* v4.7 temp dep of leakage current */
|
||||
mod->BSIM4teta0 = value->rValue;
|
||||
mod->BSIM4teta0Given = TRUE;
|
||||
break;
|
||||
case BSIM4_MOD_TVOFFCV: /* v4.7 temp dep of leakage current */
|
||||
mod->BSIM4tvoffcv = value->rValue;
|
||||
mod->BSIM4tvoffcvGiven = TRUE;
|
||||
break;
|
||||
case BSIM4_MOD_VOFFL:
|
||||
mod->BSIM4voffl = value->rValue;
|
||||
mod->BSIM4vofflGiven = TRUE;
|
||||
|
|
@ -657,6 +694,18 @@ GENmodel *inMod)
|
|||
mod->BSIM4egidl = value->rValue;
|
||||
mod->BSIM4egidlGiven = TRUE;
|
||||
break;
|
||||
case BSIM4_MOD_FGIDL : /* v4.7 New GIDL/GISL */
|
||||
mod->BSIM4fgidl = value->rValue;
|
||||
mod->BSIM4fgidlGiven = TRUE;
|
||||
break;
|
||||
case BSIM4_MOD_KGIDL : /* v4.7 New GIDL/GISL */
|
||||
mod->BSIM4kgidl = value->rValue;
|
||||
mod->BSIM4kgidlGiven = TRUE;
|
||||
break;
|
||||
case BSIM4_MOD_RGIDL : /* v4.7 New GIDL/GISL */
|
||||
mod->BSIM4rgidl = value->rValue;
|
||||
mod->BSIM4rgidlGiven = TRUE;
|
||||
break;
|
||||
case BSIM4_MOD_AGISL :
|
||||
mod->BSIM4agisl = value->rValue;
|
||||
mod->BSIM4agislGiven = TRUE;
|
||||
|
|
@ -673,6 +722,18 @@ GENmodel *inMod)
|
|||
mod->BSIM4egisl = value->rValue;
|
||||
mod->BSIM4egislGiven = TRUE;
|
||||
break;
|
||||
case BSIM4_MOD_FGISL : /* v4.7 New GIDL/GISL */
|
||||
mod->BSIM4fgisl = value->rValue;
|
||||
mod->BSIM4fgislGiven = TRUE;
|
||||
break;
|
||||
case BSIM4_MOD_KGISL : /* v4.7 New GIDL/GISL */
|
||||
mod->BSIM4kgisl = value->rValue;
|
||||
mod->BSIM4kgislGiven = TRUE;
|
||||
break;
|
||||
case BSIM4_MOD_RGISL : /* v4.7 New GIDL/GISL */
|
||||
mod->BSIM4rgisl = value->rValue;
|
||||
mod->BSIM4rgislGiven = TRUE;
|
||||
break;
|
||||
case BSIM4_MOD_AIGC :
|
||||
mod->BSIM4aigc = value->rValue;
|
||||
mod->BSIM4aigcGiven = TRUE;
|
||||
|
|
@ -805,6 +866,10 @@ GENmodel *inMod)
|
|||
mod->BSIM4tnoib = value->rValue;
|
||||
mod->BSIM4tnoibGiven = TRUE;
|
||||
break;
|
||||
case BSIM4_MOD_TNOIC :
|
||||
mod->BSIM4tnoic = value->rValue;
|
||||
mod->BSIM4tnoicGiven = TRUE;
|
||||
break;
|
||||
case BSIM4_MOD_RNOIA :
|
||||
mod->BSIM4rnoia = value->rValue;
|
||||
mod->BSIM4rnoiaGiven = TRUE;
|
||||
|
|
@ -813,6 +878,10 @@ GENmodel *inMod)
|
|||
mod->BSIM4rnoib = value->rValue;
|
||||
mod->BSIM4rnoibGiven = TRUE;
|
||||
break;
|
||||
case BSIM4_MOD_RNOIC :
|
||||
mod->BSIM4rnoic = value->rValue;
|
||||
mod->BSIM4rnoicGiven = TRUE;
|
||||
break;
|
||||
case BSIM4_MOD_NTNOI :
|
||||
mod->BSIM4ntnoi = value->rValue;
|
||||
mod->BSIM4ntnoiGiven = TRUE;
|
||||
|
|
@ -920,7 +989,7 @@ GENmodel *inMod)
|
|||
mod->BSIM4web = value->rValue;
|
||||
mod->BSIM4webGiven = TRUE;
|
||||
break;
|
||||
case BSIM4_MOD_WEC :
|
||||
case BSIM4_MOD_WEC :
|
||||
mod->BSIM4wec = value->rValue;
|
||||
mod->BSIM4wecGiven = TRUE;
|
||||
break;
|
||||
|
|
@ -1043,9 +1112,9 @@ GENmodel *inMod)
|
|||
mod->BSIM4jtsswgd = value->rValue;
|
||||
mod->BSIM4jtsswgdGiven = TRUE;
|
||||
break;
|
||||
case BSIM4_MOD_JTWEFF :
|
||||
mod->BSIM4jtweff = value->rValue;
|
||||
mod->BSIM4jtweffGiven = TRUE;
|
||||
case BSIM4_MOD_JTWEFF :
|
||||
mod->BSIM4jtweff = value->rValue;
|
||||
mod->BSIM4jtweffGiven = TRUE;
|
||||
break;
|
||||
case BSIM4_MOD_NJTS :
|
||||
mod->BSIM4njts = value->rValue;
|
||||
|
|
@ -1416,7 +1485,7 @@ GENmodel *inMod)
|
|||
mod->BSIM4tpbswgGiven = TRUE;
|
||||
break;
|
||||
|
||||
/* Length dependence */
|
||||
/* Length dependence */
|
||||
case BSIM4_MOD_LCDSC :
|
||||
mod->BSIM4lcdsc = value->rValue;
|
||||
mod->BSIM4lcdscGiven = TRUE;
|
||||
|
|
@ -1480,8 +1549,8 @@ GENmodel *inMod)
|
|||
case BSIM4_MOD_LNDEP:
|
||||
mod->BSIM4lndep = value->rValue;
|
||||
mod->BSIM4lndepGiven = TRUE;
|
||||
if (mod->BSIM4lndep > 1.0e20)
|
||||
mod->BSIM4lndep *= 1.0e-6;
|
||||
if (mod->BSIM4lndep > 1.0e20)
|
||||
mod->BSIM4lndep *= 1.0e-6;
|
||||
break;
|
||||
case BSIM4_MOD_LNSD:
|
||||
mod->BSIM4lnsd = value->rValue;
|
||||
|
|
@ -1492,8 +1561,8 @@ GENmodel *inMod)
|
|||
case BSIM4_MOD_LNGATE:
|
||||
mod->BSIM4lngate = value->rValue;
|
||||
mod->BSIM4lngateGiven = TRUE;
|
||||
if (mod->BSIM4lngate > 1.0e23)
|
||||
mod->BSIM4lngate *= 1.0e-6;
|
||||
if (mod->BSIM4lngate > 1.0e23)
|
||||
mod->BSIM4lngate *= 1.0e-6;
|
||||
break;
|
||||
case BSIM4_MOD_LGAMMA1:
|
||||
mod->BSIM4lgamma1 = value->rValue;
|
||||
|
|
@ -1559,6 +1628,22 @@ GENmodel *inMod)
|
|||
mod->BSIM4ldvtp1 = value->rValue;
|
||||
mod->BSIM4ldvtp1Given = TRUE;
|
||||
break;
|
||||
case BSIM4_MOD_LDVTP2: /* New DIBL/Rout */
|
||||
mod->BSIM4ldvtp2 = value->rValue;
|
||||
mod->BSIM4ldvtp2Given = TRUE;
|
||||
break;
|
||||
case BSIM4_MOD_LDVTP3:
|
||||
mod->BSIM4ldvtp3 = value->rValue;
|
||||
mod->BSIM4ldvtp3Given = TRUE;
|
||||
break;
|
||||
case BSIM4_MOD_LDVTP4:
|
||||
mod->BSIM4ldvtp4 = value->rValue;
|
||||
mod->BSIM4ldvtp4Given = TRUE;
|
||||
break;
|
||||
case BSIM4_MOD_LDVTP5:
|
||||
mod->BSIM4ldvtp5 = value->rValue;
|
||||
mod->BSIM4ldvtp5Given = TRUE;
|
||||
break;
|
||||
case BSIM4_MOD_LW0:
|
||||
mod->BSIM4lw0 = value->rValue;
|
||||
mod->BSIM4lw0Given = TRUE;
|
||||
|
|
@ -1631,7 +1716,7 @@ GENmodel *inMod)
|
|||
mod->BSIM4lute = value->rValue;
|
||||
mod->BSIM4luteGiven = TRUE;
|
||||
break;
|
||||
case BSIM4_MOD_LUCSTE :
|
||||
case BSIM4_MOD_LUCSTE :
|
||||
mod->BSIM4lucste = value->rValue;
|
||||
mod->BSIM4lucsteGiven = TRUE;
|
||||
break;
|
||||
|
|
@ -1643,6 +1728,18 @@ GENmodel *inMod)
|
|||
mod->BSIM4ltvoff = value->rValue;
|
||||
mod->BSIM4ltvoffGiven = TRUE;
|
||||
break;
|
||||
case BSIM4_MOD_LTNFACTOR: /* v4.7 temp dep of leakage current */
|
||||
mod->BSIM4ltnfactor = value->rValue;
|
||||
mod->BSIM4ltnfactorGiven = TRUE;
|
||||
break;
|
||||
case BSIM4_MOD_LTETA0: /* v4.7 temp dep of leakage current */
|
||||
mod->BSIM4lteta0 = value->rValue;
|
||||
mod->BSIM4lteta0Given = TRUE;
|
||||
break;
|
||||
case BSIM4_MOD_LTVOFFCV: /* v4.7 temp dep of leakage current */
|
||||
mod->BSIM4ltvoffcv = value->rValue;
|
||||
mod->BSIM4ltvoffcvGiven = TRUE;
|
||||
break;
|
||||
case BSIM4_MOD_LMINV:
|
||||
mod->BSIM4lminv = value->rValue;
|
||||
mod->BSIM4lminvGiven = TRUE;
|
||||
|
|
@ -1779,6 +1876,18 @@ GENmodel *inMod)
|
|||
mod->BSIM4legidl = value->rValue;
|
||||
mod->BSIM4legidlGiven = TRUE;
|
||||
break;
|
||||
case BSIM4_MOD_LFGIDL : /* v4.7 New GIDL/GISL */
|
||||
mod->BSIM4lfgidl = value->rValue;
|
||||
mod->BSIM4lfgidlGiven = TRUE;
|
||||
break;
|
||||
case BSIM4_MOD_LKGIDL : /* v4.7 New GIDL/GISL */
|
||||
mod->BSIM4lkgidl = value->rValue;
|
||||
mod->BSIM4lkgidlGiven = TRUE;
|
||||
break;
|
||||
case BSIM4_MOD_LRGIDL : /* v4.7 New GIDL/GISL */
|
||||
mod->BSIM4lrgidl = value->rValue;
|
||||
mod->BSIM4lrgidlGiven = TRUE;
|
||||
break;
|
||||
case BSIM4_MOD_LAGISL :
|
||||
mod->BSIM4lagisl = value->rValue;
|
||||
mod->BSIM4lagislGiven = TRUE;
|
||||
|
|
@ -1795,6 +1904,18 @@ GENmodel *inMod)
|
|||
mod->BSIM4legisl = value->rValue;
|
||||
mod->BSIM4legislGiven = TRUE;
|
||||
break;
|
||||
case BSIM4_MOD_LFGISL : /* v4.7 New GIDL/GISL */
|
||||
mod->BSIM4lfgisl = value->rValue;
|
||||
mod->BSIM4lfgislGiven = TRUE;
|
||||
break;
|
||||
case BSIM4_MOD_LKGISL : /* v4.7 New GIDL/GISL */
|
||||
mod->BSIM4lkgisl = value->rValue;
|
||||
mod->BSIM4lkgislGiven = TRUE;
|
||||
break;
|
||||
case BSIM4_MOD_LRGISL : /* v4.7 New GIDL/GISL */
|
||||
mod->BSIM4lrgisl = value->rValue;
|
||||
mod->BSIM4lrgislGiven = TRUE;
|
||||
break;
|
||||
case BSIM4_MOD_LAIGC :
|
||||
mod->BSIM4laigc = value->rValue;
|
||||
mod->BSIM4laigcGiven = TRUE;
|
||||
|
|
@ -1927,7 +2048,7 @@ GENmodel *inMod)
|
|||
mod->BSIM4leu = value->rValue;
|
||||
mod->BSIM4leuGiven = TRUE;
|
||||
break;
|
||||
case BSIM4_MOD_LUCS :
|
||||
case BSIM4_MOD_LUCS :
|
||||
mod->BSIM4lucs = value->rValue;
|
||||
mod->BSIM4lucsGiven = TRUE;
|
||||
break;
|
||||
|
|
@ -1984,7 +2105,7 @@ GENmodel *inMod)
|
|||
mod->BSIM4lvoffcvGiven = TRUE;
|
||||
break;
|
||||
|
||||
/* Width dependence */
|
||||
/* Width dependence */
|
||||
case BSIM4_MOD_WCDSC :
|
||||
mod->BSIM4wcdsc = value->rValue;
|
||||
mod->BSIM4wcdscGiven = TRUE;
|
||||
|
|
@ -2048,8 +2169,8 @@ GENmodel *inMod)
|
|||
case BSIM4_MOD_WNDEP:
|
||||
mod->BSIM4wndep = value->rValue;
|
||||
mod->BSIM4wndepGiven = TRUE;
|
||||
if (mod->BSIM4wndep > 1.0e20)
|
||||
mod->BSIM4wndep *= 1.0e-6;
|
||||
if (mod->BSIM4wndep > 1.0e20)
|
||||
mod->BSIM4wndep *= 1.0e-6;
|
||||
break;
|
||||
case BSIM4_MOD_WNSD:
|
||||
mod->BSIM4wnsd = value->rValue;
|
||||
|
|
@ -2060,8 +2181,8 @@ GENmodel *inMod)
|
|||
case BSIM4_MOD_WNGATE:
|
||||
mod->BSIM4wngate = value->rValue;
|
||||
mod->BSIM4wngateGiven = TRUE;
|
||||
if (mod->BSIM4wngate > 1.0e23)
|
||||
mod->BSIM4wngate *= 1.0e-6;
|
||||
if (mod->BSIM4wngate > 1.0e23)
|
||||
mod->BSIM4wngate *= 1.0e-6;
|
||||
break;
|
||||
case BSIM4_MOD_WGAMMA1:
|
||||
mod->BSIM4wgamma1 = value->rValue;
|
||||
|
|
@ -2127,6 +2248,22 @@ GENmodel *inMod)
|
|||
mod->BSIM4wdvtp1 = value->rValue;
|
||||
mod->BSIM4wdvtp1Given = TRUE;
|
||||
break;
|
||||
case BSIM4_MOD_WDVTP2: /* New DIBL/Rout */
|
||||
mod->BSIM4wdvtp2 = value->rValue;
|
||||
mod->BSIM4wdvtp2Given = TRUE;
|
||||
break;
|
||||
case BSIM4_MOD_WDVTP3:
|
||||
mod->BSIM4wdvtp3 = value->rValue;
|
||||
mod->BSIM4wdvtp3Given = TRUE;
|
||||
break;
|
||||
case BSIM4_MOD_WDVTP4:
|
||||
mod->BSIM4wdvtp4 = value->rValue;
|
||||
mod->BSIM4wdvtp4Given = TRUE;
|
||||
break;
|
||||
case BSIM4_MOD_WDVTP5:
|
||||
mod->BSIM4wdvtp5 = value->rValue;
|
||||
mod->BSIM4wdvtp5Given = TRUE;
|
||||
break;
|
||||
case BSIM4_MOD_WW0:
|
||||
mod->BSIM4ww0 = value->rValue;
|
||||
mod->BSIM4ww0Given = TRUE;
|
||||
|
|
@ -2199,7 +2336,7 @@ GENmodel *inMod)
|
|||
mod->BSIM4wute = value->rValue;
|
||||
mod->BSIM4wuteGiven = TRUE;
|
||||
break;
|
||||
case BSIM4_MOD_WUCSTE :
|
||||
case BSIM4_MOD_WUCSTE :
|
||||
mod->BSIM4wucste = value->rValue;
|
||||
mod->BSIM4wucsteGiven = TRUE;
|
||||
break;
|
||||
|
|
@ -2211,6 +2348,18 @@ GENmodel *inMod)
|
|||
mod->BSIM4wtvoff = value->rValue;
|
||||
mod->BSIM4wtvoffGiven = TRUE;
|
||||
break;
|
||||
case BSIM4_MOD_WTNFACTOR: /* v4.7 temp dep of leakage current */
|
||||
mod->BSIM4wtnfactor = value->rValue;
|
||||
mod->BSIM4wtnfactorGiven = TRUE;
|
||||
break;
|
||||
case BSIM4_MOD_WTETA0: /* v4.7 temp dep of leakage current */
|
||||
mod->BSIM4wteta0 = value->rValue;
|
||||
mod->BSIM4wteta0Given = TRUE;
|
||||
break;
|
||||
case BSIM4_MOD_WTVOFFCV: /* v4.7 temp dep of leakage current */
|
||||
mod->BSIM4wtvoffcv = value->rValue;
|
||||
mod->BSIM4wtvoffcvGiven = TRUE;
|
||||
break;
|
||||
case BSIM4_MOD_WMINV:
|
||||
mod->BSIM4wminv = value->rValue;
|
||||
mod->BSIM4wminvGiven = TRUE;
|
||||
|
|
@ -2347,6 +2496,18 @@ GENmodel *inMod)
|
|||
mod->BSIM4wegidl = value->rValue;
|
||||
mod->BSIM4wegidlGiven = TRUE;
|
||||
break;
|
||||
case BSIM4_MOD_WFGIDL : /* v4.7 New GIDL/GISL */
|
||||
mod->BSIM4wfgidl = value->rValue;
|
||||
mod->BSIM4wfgidlGiven = TRUE;
|
||||
break;
|
||||
case BSIM4_MOD_WKGIDL : /* v4.7 New GIDL/GISL */
|
||||
mod->BSIM4wkgidl = value->rValue;
|
||||
mod->BSIM4wkgidlGiven = TRUE;
|
||||
break;
|
||||
case BSIM4_MOD_WRGIDL : /* v4.7 New GIDL/GISL */
|
||||
mod->BSIM4wrgidl = value->rValue;
|
||||
mod->BSIM4wrgidlGiven = TRUE;
|
||||
break;
|
||||
case BSIM4_MOD_WAGISL :
|
||||
mod->BSIM4wagisl = value->rValue;
|
||||
mod->BSIM4wagislGiven = TRUE;
|
||||
|
|
@ -2363,6 +2524,18 @@ GENmodel *inMod)
|
|||
mod->BSIM4wegisl = value->rValue;
|
||||
mod->BSIM4wegislGiven = TRUE;
|
||||
break;
|
||||
case BSIM4_MOD_WFGISL : /* v4.7 New GIDL/GISL */
|
||||
mod->BSIM4wfgisl = value->rValue;
|
||||
mod->BSIM4wfgislGiven = TRUE;
|
||||
break;
|
||||
case BSIM4_MOD_WKGISL : /* v4.7 New GIDL/GISL */
|
||||
mod->BSIM4wkgisl = value->rValue;
|
||||
mod->BSIM4wkgislGiven = TRUE;
|
||||
break;
|
||||
case BSIM4_MOD_WRGISL : /* v4.7 New GIDL/GISL */
|
||||
mod->BSIM4wrgisl = value->rValue;
|
||||
mod->BSIM4wrgislGiven = TRUE;
|
||||
break;
|
||||
case BSIM4_MOD_WAIGC :
|
||||
mod->BSIM4waigc = value->rValue;
|
||||
mod->BSIM4waigcGiven = TRUE;
|
||||
|
|
@ -2495,7 +2668,7 @@ GENmodel *inMod)
|
|||
mod->BSIM4weu = value->rValue;
|
||||
mod->BSIM4weuGiven = TRUE;
|
||||
break;
|
||||
case BSIM4_MOD_WUCS :
|
||||
case BSIM4_MOD_WUCS :
|
||||
mod->BSIM4wucs = value->rValue;
|
||||
mod->BSIM4wucsGiven = TRUE;
|
||||
break;
|
||||
|
|
@ -2552,7 +2725,7 @@ GENmodel *inMod)
|
|||
mod->BSIM4wvoffcvGiven = TRUE;
|
||||
break;
|
||||
|
||||
/* Cross-term dependence */
|
||||
/* Cross-term dependence */
|
||||
case BSIM4_MOD_PCDSC :
|
||||
mod->BSIM4pcdsc = value->rValue;
|
||||
mod->BSIM4pcdscGiven = TRUE;
|
||||
|
|
@ -2616,8 +2789,8 @@ GENmodel *inMod)
|
|||
case BSIM4_MOD_PNDEP:
|
||||
mod->BSIM4pndep = value->rValue;
|
||||
mod->BSIM4pndepGiven = TRUE;
|
||||
if (mod->BSIM4pndep > 1.0e20)
|
||||
mod->BSIM4pndep *= 1.0e-6;
|
||||
if (mod->BSIM4pndep > 1.0e20)
|
||||
mod->BSIM4pndep *= 1.0e-6;
|
||||
break;
|
||||
case BSIM4_MOD_PNSD:
|
||||
mod->BSIM4pnsd = value->rValue;
|
||||
|
|
@ -2628,8 +2801,8 @@ GENmodel *inMod)
|
|||
case BSIM4_MOD_PNGATE:
|
||||
mod->BSIM4pngate = value->rValue;
|
||||
mod->BSIM4pngateGiven = TRUE;
|
||||
if (mod->BSIM4pngate > 1.0e23)
|
||||
mod->BSIM4pngate *= 1.0e-6;
|
||||
if (mod->BSIM4pngate > 1.0e23)
|
||||
mod->BSIM4pngate *= 1.0e-6;
|
||||
break;
|
||||
case BSIM4_MOD_PGAMMA1:
|
||||
mod->BSIM4pgamma1 = value->rValue;
|
||||
|
|
@ -2695,6 +2868,22 @@ GENmodel *inMod)
|
|||
mod->BSIM4pdvtp1 = value->rValue;
|
||||
mod->BSIM4pdvtp1Given = TRUE;
|
||||
break;
|
||||
case BSIM4_MOD_PDVTP2: /* New DIBL/Rout */
|
||||
mod->BSIM4pdvtp2 = value->rValue;
|
||||
mod->BSIM4pdvtp2Given = TRUE;
|
||||
break;
|
||||
case BSIM4_MOD_PDVTP3:
|
||||
mod->BSIM4pdvtp3 = value->rValue;
|
||||
mod->BSIM4pdvtp3Given = TRUE;
|
||||
break;
|
||||
case BSIM4_MOD_PDVTP4:
|
||||
mod->BSIM4pdvtp4 = value->rValue;
|
||||
mod->BSIM4pdvtp4Given = TRUE;
|
||||
break;
|
||||
case BSIM4_MOD_PDVTP5:
|
||||
mod->BSIM4pdvtp5 = value->rValue;
|
||||
mod->BSIM4pdvtp5Given = TRUE;
|
||||
break;
|
||||
case BSIM4_MOD_PW0:
|
||||
mod->BSIM4pw0 = value->rValue;
|
||||
mod->BSIM4pw0Given = TRUE;
|
||||
|
|
@ -2767,7 +2956,7 @@ GENmodel *inMod)
|
|||
mod->BSIM4pute = value->rValue;
|
||||
mod->BSIM4puteGiven = TRUE;
|
||||
break;
|
||||
case BSIM4_MOD_PUCSTE :
|
||||
case BSIM4_MOD_PUCSTE :
|
||||
mod->BSIM4pucste = value->rValue;
|
||||
mod->BSIM4pucsteGiven = TRUE;
|
||||
break;
|
||||
|
|
@ -2779,6 +2968,18 @@ GENmodel *inMod)
|
|||
mod->BSIM4ptvoff = value->rValue;
|
||||
mod->BSIM4ptvoffGiven = TRUE;
|
||||
break;
|
||||
case BSIM4_MOD_PTNFACTOR: /* v4.7 temp dep of leakage current */
|
||||
mod->BSIM4ptnfactor = value->rValue;
|
||||
mod->BSIM4ptnfactorGiven = TRUE;
|
||||
break;
|
||||
case BSIM4_MOD_PTETA0: /* v4.7 temp dep of leakage current */
|
||||
mod->BSIM4pteta0 = value->rValue;
|
||||
mod->BSIM4pteta0Given = TRUE;
|
||||
break;
|
||||
case BSIM4_MOD_PTVOFFCV: /* v4.7 temp dep of leakage current */
|
||||
mod->BSIM4ptvoffcv = value->rValue;
|
||||
mod->BSIM4ptvoffcvGiven = TRUE;
|
||||
break;
|
||||
case BSIM4_MOD_PMINV:
|
||||
mod->BSIM4pminv = value->rValue;
|
||||
mod->BSIM4pminvGiven = TRUE;
|
||||
|
|
@ -2915,6 +3116,18 @@ GENmodel *inMod)
|
|||
mod->BSIM4pegidl = value->rValue;
|
||||
mod->BSIM4pegidlGiven = TRUE;
|
||||
break;
|
||||
case BSIM4_MOD_PFGIDL : /* v4.7 New GIDL/GISL */
|
||||
mod->BSIM4pfgidl = value->rValue;
|
||||
mod->BSIM4pfgidlGiven = TRUE;
|
||||
break;
|
||||
case BSIM4_MOD_PKGIDL : /* v4.7 New GIDL/GISL */
|
||||
mod->BSIM4pkgidl = value->rValue;
|
||||
mod->BSIM4pkgidlGiven = TRUE;
|
||||
break;
|
||||
case BSIM4_MOD_PRGIDL : /* v4.7 New GIDL/GISL */
|
||||
mod->BSIM4prgidl = value->rValue;
|
||||
mod->BSIM4prgidlGiven = TRUE;
|
||||
break;
|
||||
case BSIM4_MOD_PAGISL :
|
||||
mod->BSIM4pagisl = value->rValue;
|
||||
mod->BSIM4pagislGiven = TRUE;
|
||||
|
|
@ -2931,6 +3144,18 @@ GENmodel *inMod)
|
|||
mod->BSIM4pegisl = value->rValue;
|
||||
mod->BSIM4pegislGiven = TRUE;
|
||||
break;
|
||||
case BSIM4_MOD_PFGISL : /* v4.7 New GIDL/GISL */
|
||||
mod->BSIM4pfgisl = value->rValue;
|
||||
mod->BSIM4pfgislGiven = TRUE;
|
||||
break;
|
||||
case BSIM4_MOD_PKGISL : /* v4.7 New GIDL/GISL */
|
||||
mod->BSIM4pkgisl = value->rValue;
|
||||
mod->BSIM4pkgislGiven = TRUE;
|
||||
break;
|
||||
case BSIM4_MOD_PRGISL : /* v4.7 New GIDL/GISL */
|
||||
mod->BSIM4prgisl = value->rValue;
|
||||
mod->BSIM4prgislGiven = TRUE;
|
||||
break;
|
||||
case BSIM4_MOD_PAIGC :
|
||||
mod->BSIM4paigc = value->rValue;
|
||||
mod->BSIM4paigcGiven = TRUE;
|
||||
|
|
@ -3063,7 +3288,7 @@ GENmodel *inMod)
|
|||
mod->BSIM4peu = value->rValue;
|
||||
mod->BSIM4peuGiven = TRUE;
|
||||
break;
|
||||
case BSIM4_MOD_PUCS :
|
||||
case BSIM4_MOD_PUCS :
|
||||
mod->BSIM4pucs = value->rValue;
|
||||
mod->BSIM4pucsGiven = TRUE;
|
||||
break;
|
||||
|
|
|
|||
|
|
@ -1,13 +1,13 @@
|
|||
/**** BSIM4.6.2 Released by Wenwei Yang 07/31/2008 ****/
|
||||
/**** BSIM4.6.4 Update ngspice 08/22/2009 ****/
|
||||
/**** BSIM4.7.0 Released by Darsen Lu 04/08/2011 ****/
|
||||
|
||||
/**********
|
||||
* Copyright 2006 Regents of the University of California. All rights reserved.
|
||||
* File: b4noi.c of BSIM4.6.2.
|
||||
* File: b4noi.c of BSIM4.7.0.
|
||||
* Author: 2000 Weidong Liu
|
||||
* Authors: 2001- Xuemei Xi, Mohan Dunga, Ali Niknejad, Chenming Hu.
|
||||
* Authors: 2006- Mohan Dunga, Ali Niknejad, Chenming Hu
|
||||
* Authors: 2007- Mohan Dunga, Wenwei Yang, Ali Niknejad, Chenming Hu
|
||||
* Authors: 2008- Wenwei Yang, Ali Niknejad, Chenming Hu
|
||||
* Authors: 2008- Wenwei Yang, Ali Niknejad, Chenming Hu
|
||||
* Project Director: Prof. Chenming Hu.
|
||||
* Modified by Xuemei Xi, 04/06/2001.
|
||||
* Modified by Xuemei Xi, 10/05/2001.
|
||||
|
|
@ -15,7 +15,8 @@
|
|||
* Modified by Xuemei Xi, 03/04/2004.
|
||||
* Modified by Xuemei Xi, 07/29/2005.
|
||||
* Modified by Mohan Dunga, 12/13/2006
|
||||
* Modified by Wenwei Yang, 07/31/2008.
|
||||
* Modified by Wenwei Yang, 07/31/2008.
|
||||
* Modified by Tanvir Morshed, Darsen Lu 03/27/2011
|
||||
**********/
|
||||
|
||||
#include "ngspice.h"
|
||||
|
|
@ -27,18 +28,26 @@
|
|||
#include "const.h"
|
||||
|
||||
|
||||
extern void NevalSrc();
|
||||
extern void NevalSrc2(); /* for tnoiMod=2 (v4.7) */
|
||||
extern double Nintegrate();
|
||||
|
||||
/*
|
||||
* WDL: 1/f noise model has been smoothed out and enhanced with
|
||||
* bulk charge effect as well as physical N* equ. and necessary
|
||||
* conversion into the SI unit system.
|
||||
*/
|
||||
|
||||
static double
|
||||
Eval1ovFNoise(double Vds, BSIM4model *model, BSIM4instance *here, double freq, double temp)
|
||||
double
|
||||
Eval1ovFNoise(
|
||||
double Vds,
|
||||
BSIM4model *model,
|
||||
BSIM4instance *here,
|
||||
double freq, double temp)
|
||||
{
|
||||
struct bsim4SizeDependParam *pParam;
|
||||
double cd, esat, DelClm, EffFreq, N0, Nl, Leff, Leffsq;
|
||||
double T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, Ssi;
|
||||
double T0=0.0, T1, T2, T3, T4, T5, T6, T7, T8, T9, Ssi;
|
||||
|
||||
pParam = here->pParam;
|
||||
cd = fabs(here->BSIM4cd);
|
||||
|
|
@ -47,10 +56,10 @@ double T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, Ssi;
|
|||
esat = 2.0 * here->BSIM4vsattemp / here->BSIM4ueff;
|
||||
if(model->BSIM4em<=0.0) DelClm = 0.0; /* flicker noise modified -JX */
|
||||
else {
|
||||
T0 = ((((Vds - here->BSIM4Vdseff) / pParam->BSIM4litl)
|
||||
+ model->BSIM4em) / esat);
|
||||
DelClm = pParam->BSIM4litl * log (MAX(T0, N_MINLOG));
|
||||
if (DelClm < 0.0) DelClm = 0.0; /* bugfix */
|
||||
T0 = ((((Vds - here->BSIM4Vdseff) / pParam->BSIM4litl)
|
||||
+ model->BSIM4em) / esat);
|
||||
DelClm = pParam->BSIM4litl * log (MAX(T0, N_MINLOG));
|
||||
if (DelClm < 0.0) DelClm = 0.0; /* bugfix */
|
||||
}
|
||||
EffFreq = pow(freq, model->BSIM4ef);
|
||||
T1 = CHARGE * CHARGE * CONSTboltz * cd * temp * here->BSIM4ueff;
|
||||
|
|
@ -75,9 +84,8 @@ double T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, Ssi;
|
|||
|
||||
|
||||
int
|
||||
BSIM4noise(
|
||||
int mode,
|
||||
int operation,
|
||||
BSIM4noise (
|
||||
int mode, int operation,
|
||||
GENmodel *inModel,
|
||||
CKTcircuit *ckt,
|
||||
Ndata *data,
|
||||
|
|
@ -92,121 +100,135 @@ double tempInoise;
|
|||
double noizDens[BSIM4NSRCS];
|
||||
double lnNdens[BSIM4NSRCS];
|
||||
|
||||
double T0, T1, T2, T5, T10, T11;
|
||||
double T0, T1, T2, T3, T4, T5, T6, T7, T8, T10, T11;
|
||||
double Vds, Ssi, Swi;
|
||||
double tmp=0.0, gdpr, gspr, npart_theta=0.0, npart_beta=0.0, igsquare, bodymode;
|
||||
|
||||
double m;
|
||||
/* tnoiMod=2 (v4.7) */
|
||||
double eta, Leff, Lvsat, gamma, delta, epsilon, GammaGd0=0.0;
|
||||
double npart_c, sigrat=0.0, C0, omega, ctnoi=0.0;
|
||||
|
||||
int i;
|
||||
|
||||
double m;
|
||||
|
||||
/* define the names of the noise sources */
|
||||
static char *BSIM4nNames[BSIM4NSRCS] =
|
||||
{ /* Note that we have to keep the order */
|
||||
".rd", /* noise due to rd */
|
||||
".rs", /* noise due to rs */
|
||||
".rd", /* noise due to rd */
|
||||
".rs", /* noise due to rs */
|
||||
".rg", /* noise due to rgeltd */
|
||||
".rbps", /* noise due to rbps */
|
||||
".rbpd", /* noise due to rbpd */
|
||||
".rbpb", /* noise due to rbpb */
|
||||
".rbsb", /* noise due to rbsb */
|
||||
".rbdb", /* noise due to rbdb */
|
||||
".id", /* noise due to id */
|
||||
".1overf", /* flicker (1/f) noise */
|
||||
".id", /* noise due to id (for tnoiMod2: uncorrelated portion only) */
|
||||
".1overf", /* flicker (1/f) noise */
|
||||
".igs", /* shot noise due to IGS */
|
||||
".igd", /* shot noise due to IGD */
|
||||
".igb", /* shot noise due to IGB */
|
||||
"" /* total transistor noise */
|
||||
".corl", /* contribution of correlated drain and induced gate noise */
|
||||
"" /* total transistor noise */
|
||||
};
|
||||
|
||||
for (; model != NULL; model = model->BSIM4nextModel)
|
||||
{ for (here = model->BSIM4instances; here != NULL;
|
||||
here = here->BSIM4nextInstance)
|
||||
{ pParam = here->pParam;
|
||||
switch (operation)
|
||||
{ case N_OPEN:
|
||||
/* see if we have to to produce a summary report */
|
||||
/* if so, name all the noise generators */
|
||||
here = here->BSIM4nextInstance)
|
||||
{ pParam = here->pParam;
|
||||
switch (operation)
|
||||
{ case N_OPEN:
|
||||
/* see if we have to to produce a summary report */
|
||||
/* if so, name all the noise generators */
|
||||
|
||||
if (((NOISEAN*)ckt->CKTcurJob)->NStpsSm != 0)
|
||||
{ switch (mode)
|
||||
{ case N_DENS:
|
||||
for (i = 0; i < BSIM4NSRCS; i++)
|
||||
{ (void) sprintf(name, "onoise.%s%s",
|
||||
here->BSIM4name,
|
||||
BSIM4nNames[i]);
|
||||
data->namelist = TREALLOC(IFuid, data->namelist, data->numPlots + 1);
|
||||
if (((NOISEAN*)ckt->CKTcurJob)->NStpsSm != 0)
|
||||
{ switch (mode)
|
||||
{ case N_DENS:
|
||||
for (i = 0; i < BSIM4NSRCS; i++)
|
||||
{ (void) sprintf(name, "onoise.%s%s",
|
||||
here->BSIM4name,
|
||||
BSIM4nNames[i]);
|
||||
data->namelist = (IFuid *) trealloc(
|
||||
(char *) data->namelist,
|
||||
(data->numPlots + 1)
|
||||
* sizeof(IFuid));
|
||||
if (!data->namelist)
|
||||
return(E_NOMEM);
|
||||
SPfrontEnd->IFnewUid (ckt,
|
||||
&(data->namelist[data->numPlots++]),
|
||||
NULL, name, UID_OTHER,
|
||||
NULL);
|
||||
/* we've added one more plot */
|
||||
}
|
||||
break;
|
||||
case INT_NOIZ:
|
||||
for (i = 0; i < BSIM4NSRCS; i++)
|
||||
{ (void) sprintf(name, "onoise_total.%s%s",
|
||||
here->BSIM4name,
|
||||
BSIM4nNames[i]);
|
||||
data->namelist = TREALLOC(IFuid, data->namelist, data->numPlots + 1);
|
||||
return(E_NOMEM);
|
||||
(*(SPfrontEnd->IFnewUid)) (ckt,
|
||||
&(data->namelist[data->numPlots++]),
|
||||
(IFuid) NULL, name, UID_OTHER,
|
||||
NULL);
|
||||
/* we've added one more plot */
|
||||
}
|
||||
break;
|
||||
case INT_NOIZ:
|
||||
for (i = 0; i < BSIM4NSRCS; i++)
|
||||
{ (void) sprintf(name, "onoise_total.%s%s",
|
||||
here->BSIM4name,
|
||||
BSIM4nNames[i]);
|
||||
data->namelist = (IFuid *) trealloc(
|
||||
(char *) data->namelist,
|
||||
(data->numPlots + 1)
|
||||
* sizeof(IFuid));
|
||||
if (!data->namelist)
|
||||
return(E_NOMEM);
|
||||
SPfrontEnd->IFnewUid (ckt,
|
||||
&(data->namelist[data->numPlots++]),
|
||||
NULL, name, UID_OTHER,
|
||||
NULL);
|
||||
/* we've added one more plot */
|
||||
return(E_NOMEM);
|
||||
(*(SPfrontEnd->IFnewUid)) (ckt,
|
||||
&(data->namelist[data->numPlots++]),
|
||||
(IFuid) NULL, name, UID_OTHER,
|
||||
NULL);
|
||||
/* we've added one more plot */
|
||||
|
||||
(void) sprintf(name, "inoise_total.%s%s",
|
||||
here->BSIM4name,
|
||||
BSIM4nNames[i]);
|
||||
data->namelist = TREALLOC(IFuid, data->namelist, data->numPlots + 1);
|
||||
(void) sprintf(name, "inoise_total.%s%s",
|
||||
here->BSIM4name,
|
||||
BSIM4nNames[i]);
|
||||
data->namelist = (IFuid *) trealloc(
|
||||
(char *) data->namelist,
|
||||
(data->numPlots + 1)
|
||||
* sizeof(IFuid));
|
||||
if (!data->namelist)
|
||||
return(E_NOMEM);
|
||||
SPfrontEnd->IFnewUid (ckt,
|
||||
&(data->namelist[data->numPlots++]),
|
||||
NULL, name, UID_OTHER,
|
||||
NULL);
|
||||
/* we've added one more plot */
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case N_CALC:
|
||||
m = here->BSIM4m;
|
||||
switch (mode)
|
||||
{ case N_DENS:
|
||||
if (model->BSIM4tnoiMod == 0)
|
||||
{ if (model->BSIM4rdsMod == 0)
|
||||
{ gspr = here->BSIM4sourceConductance;
|
||||
return(E_NOMEM);
|
||||
(*(SPfrontEnd->IFnewUid)) (ckt,
|
||||
&(data->namelist[data->numPlots++]),
|
||||
(IFuid) NULL, name, UID_OTHER,
|
||||
NULL);
|
||||
/* we've added one more plot */
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case N_CALC:
|
||||
m = here->BSIM4m;
|
||||
switch (mode)
|
||||
{ case N_DENS:
|
||||
if (model->BSIM4tnoiMod == 0)
|
||||
{ if (model->BSIM4rdsMod == 0)
|
||||
{ gspr = here->BSIM4sourceConductance;
|
||||
gdpr = here->BSIM4drainConductance;
|
||||
if (here->BSIM4grdsw > 0.0)
|
||||
tmp = 1.0 / here->BSIM4grdsw; /* tmp used below */
|
||||
else
|
||||
tmp = 0.0;
|
||||
}
|
||||
else
|
||||
{ gspr = here->BSIM4gstot;
|
||||
if (here->BSIM4grdsw > 0.0)
|
||||
tmp = 1.0 / here->BSIM4grdsw; /* tmp used below */
|
||||
else
|
||||
tmp = 0.0;
|
||||
}
|
||||
else
|
||||
{ gspr = here->BSIM4gstot;
|
||||
gdpr = here->BSIM4gdtot;
|
||||
tmp = 0.0;
|
||||
}
|
||||
}
|
||||
else
|
||||
{ T5 = here->BSIM4Vgsteff / here->BSIM4EsatL;
|
||||
T5 *= T5;
|
||||
npart_beta = model->BSIM4rnoia * (1.0 + T5
|
||||
* model->BSIM4tnoia * pParam->BSIM4leff);
|
||||
npart_theta = model->BSIM4rnoib * (1.0 + T5
|
||||
}
|
||||
}
|
||||
else if(model->BSIM4tnoiMod == 1)
|
||||
{ T5 = here->BSIM4Vgsteff / here->BSIM4EsatL;
|
||||
T5 *= T5;
|
||||
npart_beta = model->BSIM4rnoia * (1.0 + T5
|
||||
* model->BSIM4tnoia * pParam->BSIM4leff);
|
||||
npart_theta = model->BSIM4rnoib * (1.0 + T5
|
||||
* model->BSIM4tnoib * pParam->BSIM4leff);
|
||||
if(npart_theta > 0.9)
|
||||
npart_theta = 0.9;
|
||||
if(npart_theta > 0.9 * npart_beta)
|
||||
npart_theta = 0.9 * npart_beta; //4.6.2
|
||||
if(npart_theta > 0.9)
|
||||
npart_theta = 0.9;
|
||||
if(npart_theta > 0.9 * npart_beta)
|
||||
npart_theta = 0.9 * npart_beta; //4.6.2
|
||||
|
||||
if (model->BSIM4rdsMod == 0)
|
||||
if (model->BSIM4rdsMod == 0)
|
||||
{ gspr = here->BSIM4sourceConductance;
|
||||
gdpr = here->BSIM4drainConductance;
|
||||
}
|
||||
|
|
@ -215,128 +237,141 @@ int i;
|
|||
gdpr = here->BSIM4gdtot;
|
||||
}
|
||||
|
||||
if ((*(ckt->CKTstates[0] + here->BSIM4vds)) >= 0.0)
|
||||
gspr = gspr * (1.0 + npart_theta * npart_theta * gspr
|
||||
/ here->BSIM4IdovVds); /* bugfix */
|
||||
else
|
||||
gdpr = gdpr * (1.0 + npart_theta * npart_theta * gdpr
|
||||
if ((*(ckt->CKTstates[0] + here->BSIM4vds)) >= 0.0)
|
||||
gspr = gspr * (1.0 + npart_theta * npart_theta * gspr
|
||||
/ here->BSIM4IdovVds);
|
||||
}
|
||||
else
|
||||
gdpr = gdpr * (1.0 + npart_theta * npart_theta * gdpr
|
||||
/ here->BSIM4IdovVds);
|
||||
}
|
||||
else
|
||||
{ /* tnoiMod=2 (v4.7) */
|
||||
|
||||
NevalSrc(&noizDens[BSIM4RDNOIZ],
|
||||
&lnNdens[BSIM4RDNOIZ], ckt, THERMNOISE,
|
||||
here->BSIM4dNodePrime, here->BSIM4dNode,
|
||||
gdpr * m);
|
||||
if (model->BSIM4rdsMod == 0)
|
||||
{ gspr = here->BSIM4sourceConductance;
|
||||
gdpr = here->BSIM4drainConductance;
|
||||
}
|
||||
else
|
||||
{ gspr = here->BSIM4gstot;
|
||||
gdpr = here->BSIM4gdtot;
|
||||
}
|
||||
|
||||
NevalSrc(&noizDens[BSIM4RSNOIZ],
|
||||
&lnNdens[BSIM4RSNOIZ], ckt, THERMNOISE,
|
||||
here->BSIM4sNodePrime, here->BSIM4sNode,
|
||||
gspr * m);
|
||||
}
|
||||
|
||||
NevalSrc(&noizDens[BSIM4RDNOIZ],
|
||||
&lnNdens[BSIM4RDNOIZ], ckt, THERMNOISE,
|
||||
here->BSIM4dNodePrime, here->BSIM4dNode,
|
||||
gdpr * m);
|
||||
|
||||
NevalSrc(&noizDens[BSIM4RSNOIZ],
|
||||
&lnNdens[BSIM4RSNOIZ], ckt, THERMNOISE,
|
||||
here->BSIM4sNodePrime, here->BSIM4sNode,
|
||||
gspr * m);
|
||||
|
||||
|
||||
if (here->BSIM4rgateMod == 1)
|
||||
{ NevalSrc(&noizDens[BSIM4RGNOIZ],
|
||||
if (here->BSIM4rgateMod == 1)
|
||||
{ NevalSrc(&noizDens[BSIM4RGNOIZ],
|
||||
&lnNdens[BSIM4RGNOIZ], ckt, THERMNOISE,
|
||||
here->BSIM4gNodePrime, here->BSIM4gNodeExt,
|
||||
here->BSIM4grgeltd * m);
|
||||
}
|
||||
else if (here->BSIM4rgateMod == 2)
|
||||
{
|
||||
T0 = 1.0 + here->BSIM4grgeltd/here->BSIM4gcrg;
|
||||
T1 = T0 * T0;
|
||||
NevalSrc(&noizDens[BSIM4RGNOIZ],
|
||||
}
|
||||
else if (here->BSIM4rgateMod == 2)
|
||||
{
|
||||
T0 = 1.0 + here->BSIM4grgeltd/here->BSIM4gcrg;
|
||||
T1 = T0 * T0;
|
||||
NevalSrc(&noizDens[BSIM4RGNOIZ],
|
||||
&lnNdens[BSIM4RGNOIZ], ckt, THERMNOISE,
|
||||
here->BSIM4gNodePrime, here->BSIM4gNodeExt,
|
||||
here->BSIM4grgeltd * m / T1);
|
||||
}
|
||||
else if (here->BSIM4rgateMod == 3)
|
||||
{ NevalSrc(&noizDens[BSIM4RGNOIZ],
|
||||
}
|
||||
else if (here->BSIM4rgateMod == 3)
|
||||
{ NevalSrc(&noizDens[BSIM4RGNOIZ],
|
||||
&lnNdens[BSIM4RGNOIZ], ckt, THERMNOISE,
|
||||
here->BSIM4gNodeMid, here->BSIM4gNodeExt,
|
||||
here->BSIM4grgeltd * m);
|
||||
}
|
||||
else
|
||||
{ noizDens[BSIM4RGNOIZ] = 0.0;
|
||||
lnNdens[BSIM4RGNOIZ] =
|
||||
log(MAX(noizDens[BSIM4RGNOIZ], N_MINLOG));
|
||||
}
|
||||
|
||||
bodymode = 5;
|
||||
if (here->BSIM4rbodyMod == 2)
|
||||
{ if( ( !model->BSIM4rbps0Given) ||
|
||||
( !model->BSIM4rbpd0Given) )
|
||||
bodymode = 1;
|
||||
else
|
||||
if( (!model->BSIM4rbsbx0Given && !model->BSIM4rbsby0Given) ||
|
||||
(!model->BSIM4rbdbx0Given && !model->BSIM4rbdby0Given) )
|
||||
bodymode = 3;
|
||||
}
|
||||
|
||||
if (here->BSIM4rbodyMod)
|
||||
{
|
||||
if(bodymode == 5)
|
||||
{
|
||||
NevalSrc(&noizDens[BSIM4RBPSNOIZ],
|
||||
&lnNdens[BSIM4RBPSNOIZ], ckt, THERMNOISE,
|
||||
here->BSIM4bNodePrime, here->BSIM4sbNode,
|
||||
here->BSIM4grbps * m);
|
||||
NevalSrc(&noizDens[BSIM4RBPDNOIZ],
|
||||
&lnNdens[BSIM4RBPDNOIZ], ckt, THERMNOISE,
|
||||
here->BSIM4bNodePrime, here->BSIM4dbNode,
|
||||
here->BSIM4grbpd * m);
|
||||
NevalSrc(&noizDens[BSIM4RBPBNOIZ],
|
||||
&lnNdens[BSIM4RBPBNOIZ], ckt, THERMNOISE,
|
||||
here->BSIM4bNodePrime, here->BSIM4bNode,
|
||||
here->BSIM4grbpb * m);
|
||||
NevalSrc(&noizDens[BSIM4RBSBNOIZ],
|
||||
&lnNdens[BSIM4RBSBNOIZ], ckt, THERMNOISE,
|
||||
here->BSIM4bNode, here->BSIM4sbNode,
|
||||
here->BSIM4grbsb * m);
|
||||
NevalSrc(&noizDens[BSIM4RBDBNOIZ],
|
||||
&lnNdens[BSIM4RBDBNOIZ], ckt, THERMNOISE,
|
||||
here->BSIM4bNode, here->BSIM4dbNode,
|
||||
here->BSIM4grbdb * m);
|
||||
}
|
||||
if(bodymode == 3)
|
||||
{
|
||||
NevalSrc(&noizDens[BSIM4RBPSNOIZ],
|
||||
&lnNdens[BSIM4RBPSNOIZ], ckt, THERMNOISE,
|
||||
here->BSIM4bNodePrime, here->BSIM4sbNode,
|
||||
here->BSIM4grbps * m);
|
||||
NevalSrc(&noizDens[BSIM4RBPDNOIZ],
|
||||
&lnNdens[BSIM4RBPDNOIZ], ckt, THERMNOISE,
|
||||
here->BSIM4bNodePrime, here->BSIM4dbNode,
|
||||
here->BSIM4grbpd * m);
|
||||
NevalSrc(&noizDens[BSIM4RBPBNOIZ],
|
||||
&lnNdens[BSIM4RBPBNOIZ], ckt, THERMNOISE,
|
||||
here->BSIM4bNodePrime, here->BSIM4bNode,
|
||||
here->BSIM4grbpb * m);
|
||||
noizDens[BSIM4RBSBNOIZ] = noizDens[BSIM4RBDBNOIZ] = 0.0;
|
||||
lnNdens[BSIM4RBSBNOIZ] =
|
||||
log(MAX(noizDens[BSIM4RBSBNOIZ], N_MINLOG));
|
||||
lnNdens[BSIM4RBDBNOIZ] =
|
||||
log(MAX(noizDens[BSIM4RBDBNOIZ], N_MINLOG));
|
||||
}
|
||||
if(bodymode == 1)
|
||||
{
|
||||
NevalSrc(&noizDens[BSIM4RBPBNOIZ],
|
||||
&lnNdens[BSIM4RBPBNOIZ], ckt, THERMNOISE,
|
||||
here->BSIM4bNodePrime, here->BSIM4bNode,
|
||||
here->BSIM4grbpb * m);
|
||||
noizDens[BSIM4RBPSNOIZ] = noizDens[BSIM4RBPDNOIZ] = 0.0;
|
||||
noizDens[BSIM4RBSBNOIZ] = noizDens[BSIM4RBDBNOIZ] = 0.0;
|
||||
lnNdens[BSIM4RBPSNOIZ] =
|
||||
log(MAX(noizDens[BSIM4RBPSNOIZ], N_MINLOG));
|
||||
lnNdens[BSIM4RBPDNOIZ] =
|
||||
log(MAX(noizDens[BSIM4RBPDNOIZ], N_MINLOG));
|
||||
lnNdens[BSIM4RBSBNOIZ] =
|
||||
log(MAX(noizDens[BSIM4RBSBNOIZ], N_MINLOG));
|
||||
lnNdens[BSIM4RBDBNOIZ] =
|
||||
log(MAX(noizDens[BSIM4RBDBNOIZ], N_MINLOG));
|
||||
}
|
||||
}
|
||||
else
|
||||
{ noizDens[BSIM4RBPSNOIZ] = noizDens[BSIM4RBPDNOIZ] = 0.0;
|
||||
{ noizDens[BSIM4RGNOIZ] = 0.0;
|
||||
lnNdens[BSIM4RGNOIZ] =
|
||||
log(MAX(noizDens[BSIM4RGNOIZ], N_MINLOG));
|
||||
}
|
||||
|
||||
bodymode = 5;
|
||||
if (here->BSIM4rbodyMod == 2)
|
||||
{ if( ( !model->BSIM4rbps0Given) ||
|
||||
( !model->BSIM4rbpd0Given) )
|
||||
bodymode = 1;
|
||||
else
|
||||
if( (!model->BSIM4rbsbx0Given && !model->BSIM4rbsby0Given) ||
|
||||
(!model->BSIM4rbdbx0Given && !model->BSIM4rbdby0Given) )
|
||||
bodymode = 3;
|
||||
}
|
||||
|
||||
if (here->BSIM4rbodyMod)
|
||||
{
|
||||
if(bodymode == 5)
|
||||
{
|
||||
NevalSrc(&noizDens[BSIM4RBPSNOIZ],
|
||||
&lnNdens[BSIM4RBPSNOIZ], ckt, THERMNOISE,
|
||||
here->BSIM4bNodePrime, here->BSIM4sbNode,
|
||||
here->BSIM4grbps * m);
|
||||
NevalSrc(&noizDens[BSIM4RBPDNOIZ],
|
||||
&lnNdens[BSIM4RBPDNOIZ], ckt, THERMNOISE,
|
||||
here->BSIM4bNodePrime, here->BSIM4dbNode,
|
||||
here->BSIM4grbpd * m);
|
||||
NevalSrc(&noizDens[BSIM4RBPBNOIZ],
|
||||
&lnNdens[BSIM4RBPBNOIZ], ckt, THERMNOISE,
|
||||
here->BSIM4bNodePrime, here->BSIM4bNode,
|
||||
here->BSIM4grbpb * m);
|
||||
NevalSrc(&noizDens[BSIM4RBSBNOIZ],
|
||||
&lnNdens[BSIM4RBSBNOIZ], ckt, THERMNOISE,
|
||||
here->BSIM4bNode, here->BSIM4sbNode,
|
||||
here->BSIM4grbsb * m);
|
||||
NevalSrc(&noizDens[BSIM4RBDBNOIZ],
|
||||
&lnNdens[BSIM4RBDBNOIZ], ckt, THERMNOISE,
|
||||
here->BSIM4bNode, here->BSIM4dbNode,
|
||||
here->BSIM4grbdb * m);
|
||||
}
|
||||
if(bodymode == 3)
|
||||
{
|
||||
NevalSrc(&noizDens[BSIM4RBPSNOIZ],
|
||||
&lnNdens[BSIM4RBPSNOIZ], ckt, THERMNOISE,
|
||||
here->BSIM4bNodePrime, here->BSIM4sbNode,
|
||||
here->BSIM4grbps * m);
|
||||
NevalSrc(&noizDens[BSIM4RBPDNOIZ],
|
||||
&lnNdens[BSIM4RBPDNOIZ], ckt, THERMNOISE,
|
||||
here->BSIM4bNodePrime, here->BSIM4dbNode,
|
||||
here->BSIM4grbpd * m);
|
||||
NevalSrc(&noizDens[BSIM4RBPBNOIZ],
|
||||
&lnNdens[BSIM4RBPBNOIZ], ckt, THERMNOISE,
|
||||
here->BSIM4bNodePrime, here->BSIM4bNode,
|
||||
here->BSIM4grbpb * m);
|
||||
noizDens[BSIM4RBSBNOIZ] = noizDens[BSIM4RBDBNOIZ] = 0.0;
|
||||
lnNdens[BSIM4RBSBNOIZ] =
|
||||
log(MAX(noizDens[BSIM4RBSBNOIZ], N_MINLOG));
|
||||
lnNdens[BSIM4RBDBNOIZ] =
|
||||
log(MAX(noizDens[BSIM4RBDBNOIZ], N_MINLOG));
|
||||
}
|
||||
if(bodymode == 1)
|
||||
{
|
||||
NevalSrc(&noizDens[BSIM4RBPBNOIZ],
|
||||
&lnNdens[BSIM4RBPBNOIZ], ckt, THERMNOISE,
|
||||
here->BSIM4bNodePrime, here->BSIM4bNode,
|
||||
here->BSIM4grbpb * m);
|
||||
noizDens[BSIM4RBPSNOIZ] = noizDens[BSIM4RBPDNOIZ] = 0.0;
|
||||
noizDens[BSIM4RBSBNOIZ] = noizDens[BSIM4RBDBNOIZ] = 0.0;
|
||||
lnNdens[BSIM4RBPSNOIZ] =
|
||||
log(MAX(noizDens[BSIM4RBPSNOIZ], N_MINLOG));
|
||||
lnNdens[BSIM4RBPDNOIZ] =
|
||||
log(MAX(noizDens[BSIM4RBPDNOIZ], N_MINLOG));
|
||||
lnNdens[BSIM4RBSBNOIZ] =
|
||||
log(MAX(noizDens[BSIM4RBSBNOIZ], N_MINLOG));
|
||||
lnNdens[BSIM4RBDBNOIZ] =
|
||||
log(MAX(noizDens[BSIM4RBDBNOIZ], N_MINLOG));
|
||||
}
|
||||
}
|
||||
else
|
||||
{ noizDens[BSIM4RBPSNOIZ] = noizDens[BSIM4RBPDNOIZ] = 0.0;
|
||||
noizDens[BSIM4RBPBNOIZ] = 0.0;
|
||||
noizDens[BSIM4RBSBNOIZ] = noizDens[BSIM4RBDBNOIZ] = 0.0;
|
||||
lnNdens[BSIM4RBPSNOIZ] =
|
||||
|
|
@ -351,51 +386,124 @@ int i;
|
|||
log(MAX(noizDens[BSIM4RBDBNOIZ], N_MINLOG));
|
||||
}
|
||||
|
||||
if(model->BSIM4tnoiMod == 2)
|
||||
{
|
||||
eta = 1.0 - here->BSIM4Vdseff * here->BSIM4AbovVgst2Vtm;
|
||||
T0 = 1.0 - eta;
|
||||
T1 = 1.0 + eta;
|
||||
T2 = T1 + 2.0 * here->BSIM4Abulk * model->BSIM4vtm / here->BSIM4Vgsteff;
|
||||
Leff = pParam->BSIM4leff;
|
||||
Lvsat = Leff * (1.0 + here->BSIM4Vdseff / here->BSIM4EsatL);
|
||||
T6 = Leff / Lvsat;
|
||||
|
||||
T5 = here->BSIM4Vgsteff / here->BSIM4EsatL;
|
||||
T5 = T5 * T5;
|
||||
gamma = T6 * (0.5 * T1 + T0 * T0 / (6.0 * T2));
|
||||
T3 = T2 * T2;
|
||||
T4 = T0 * T0;
|
||||
T5 = T3 * T3;
|
||||
delta = (T1 / T3 - (5.0 * T1 + T2) * T4 / (15.0 * T5) + T4 * T4 / (9.0 * T5 * T2)) / (6.0 * T6 * T6 * T6);
|
||||
T7 = T0 / T2;
|
||||
epsilon = (T7 - T7 * T7 * T7 / 3.0) / (6.0 * T6);
|
||||
|
||||
T8 = here->BSIM4Vgsteff / here->BSIM4EsatL;
|
||||
T8 *= T8;
|
||||
npart_c = model->BSIM4rnoic * (1.0 + T8
|
||||
* model->BSIM4tnoic * Leff);
|
||||
ctnoi = epsilon / sqrt(gamma * delta)
|
||||
* (2.5316 * npart_c);
|
||||
|
||||
npart_beta = model->BSIM4rnoia * (1.0 + T8
|
||||
* model->BSIM4tnoia * Leff);
|
||||
npart_theta = model->BSIM4rnoib * (1.0 + T8
|
||||
* model->BSIM4tnoib * Leff);
|
||||
gamma = gamma * (3.0 * npart_beta * npart_beta);
|
||||
delta = delta * (3.75 * npart_theta * npart_theta);
|
||||
|
||||
GammaGd0 = gamma * here->BSIM4noiGd0;
|
||||
C0 = here->BSIM4Coxeff * pParam->BSIM4weffCV * here->BSIM4nf * pParam->BSIM4leffCV;
|
||||
T0 = C0 / here->BSIM4noiGd0;
|
||||
sigrat = T0 * sqrt(delta / gamma);
|
||||
}
|
||||
switch(model->BSIM4tnoiMod)
|
||||
{ case 0:
|
||||
T0 = m * here->BSIM4ueff * fabs(here->BSIM4qinv);
|
||||
T1 = T0 * tmp + pParam->BSIM4leff
|
||||
{ case 0:
|
||||
T0 = m * here->BSIM4ueff * fabs(here->BSIM4qinv);
|
||||
T1 = T0 * tmp + pParam->BSIM4leff
|
||||
* pParam->BSIM4leff;
|
||||
NevalSrc(&noizDens[BSIM4IDNOIZ],
|
||||
&lnNdens[BSIM4IDNOIZ], ckt,
|
||||
THERMNOISE, here->BSIM4dNodePrime,
|
||||
NevalSrc(&noizDens[BSIM4IDNOIZ],
|
||||
&lnNdens[BSIM4IDNOIZ], ckt,
|
||||
THERMNOISE, here->BSIM4dNodePrime,
|
||||
here->BSIM4sNodePrime,
|
||||
(T0 / T1) * model->BSIM4ntnoi);
|
||||
break;
|
||||
case 1:
|
||||
T0 = m * here->BSIM4gm + here->BSIM4gmbs + here->BSIM4gds;
|
||||
T0 *= T0;
|
||||
igsquare = npart_theta * npart_theta * T0 / here->BSIM4IdovVds;
|
||||
T1 = npart_beta * (here->BSIM4gm
|
||||
+ here->BSIM4gmbs) + here->BSIM4gds;
|
||||
T2 = T1 * T1 / here->BSIM4IdovVds;
|
||||
(T0 / T1) * model->BSIM4ntnoi);
|
||||
break;
|
||||
case 1:
|
||||
T0 = m * (here->BSIM4gm + here->BSIM4gmbs + here->BSIM4gds);
|
||||
T0 *= T0;
|
||||
igsquare = npart_theta * npart_theta * T0 / here->BSIM4IdovVds;
|
||||
T1 = npart_beta * (here->BSIM4gm
|
||||
+ here->BSIM4gmbs) + here->BSIM4gds;
|
||||
T2 = T1 * T1 / here->BSIM4IdovVds;
|
||||
NevalSrc(&noizDens[BSIM4IDNOIZ],
|
||||
&lnNdens[BSIM4IDNOIZ], ckt,
|
||||
THERMNOISE, here->BSIM4dNodePrime,
|
||||
here->BSIM4sNodePrime, (T2 - igsquare));
|
||||
break;
|
||||
}
|
||||
case 2:
|
||||
T2 = GammaGd0;
|
||||
T3 = ctnoi * ctnoi;
|
||||
T4 = 1.0 - T3;
|
||||
NevalSrc(&noizDens[BSIM4IDNOIZ],
|
||||
&lnNdens[BSIM4IDNOIZ], ckt,
|
||||
THERMNOISE, here->BSIM4dNodePrime,
|
||||
here->BSIM4sNodePrime, T2 * T4);
|
||||
|
||||
NevalSrc(&noizDens[BSIM4FLNOIZ], NULL,
|
||||
ckt, N_GAIN, here->BSIM4dNodePrime,
|
||||
here->BSIM4sNodePrime, (double) 0.0);
|
||||
/* Evaluate output noise due to two correlated noise sources */
|
||||
omega = 2.0 * M_PI * data->freq;
|
||||
T5 = omega * sigrat;
|
||||
T6 = T5 * T5;
|
||||
T7 = T6 / (1.0 + T6);
|
||||
|
||||
if (here->BSIM4mode >= 0) {
|
||||
NevalSrc2(&noizDens[BSIM4CORLNOIZ],
|
||||
&lnNdens[BSIM4CORLNOIZ], ckt,
|
||||
THERMNOISE, here->BSIM4dNodePrime,
|
||||
here->BSIM4sNodePrime, T2 * T3,
|
||||
here->BSIM4gNodePrime,
|
||||
here->BSIM4sNodePrime,
|
||||
T2 * T7, 0.5 * M_PI);
|
||||
}
|
||||
else
|
||||
{
|
||||
NevalSrc2(&noizDens[BSIM4CORLNOIZ],
|
||||
&lnNdens[BSIM4CORLNOIZ], ckt,
|
||||
THERMNOISE, here->BSIM4sNodePrime,
|
||||
here->BSIM4dNodePrime, T2 * T3,
|
||||
here->BSIM4gNodePrime,
|
||||
here->BSIM4dNodePrime,
|
||||
T2 * T7, 0.5 * M_PI);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
NevalSrc(&noizDens[BSIM4FLNOIZ], (double*) NULL,
|
||||
ckt, N_GAIN, here->BSIM4dNodePrime,
|
||||
here->BSIM4sNodePrime, (double) 0.0);
|
||||
|
||||
switch(model->BSIM4fnoiMod)
|
||||
{ case 0:
|
||||
noizDens[BSIM4FLNOIZ] *= m * model->BSIM4kf
|
||||
* exp(model->BSIM4af
|
||||
* log(MAX(fabs(here->BSIM4cd),
|
||||
N_MINLOG)))
|
||||
/ (pow(data->freq, model->BSIM4ef)
|
||||
* pParam->BSIM4leff
|
||||
* pParam->BSIM4leff
|
||||
* model->BSIM4coxe);
|
||||
break;
|
||||
case 1:
|
||||
Vds = *(ckt->CKTstates[0] + here->BSIM4vds);
|
||||
if (Vds < 0.0)
|
||||
Vds = -Vds;
|
||||
{ case 0:
|
||||
noizDens[BSIM4FLNOIZ] *= m * model->BSIM4kf
|
||||
* exp(model->BSIM4af
|
||||
* log(MAX(fabs(here->BSIM4cd),
|
||||
N_MINLOG)))
|
||||
/ (pow(data->freq, model->BSIM4ef)
|
||||
* pParam->BSIM4leff
|
||||
* pParam->BSIM4leff
|
||||
* model->BSIM4coxe);
|
||||
break;
|
||||
case 1:
|
||||
Vds = *(ckt->CKTstates[0] + here->BSIM4vds);
|
||||
if (Vds < 0.0)
|
||||
Vds = -Vds;
|
||||
|
||||
Ssi = Eval1ovFNoise(Vds, model, here,
|
||||
data->freq, ckt->CKTtemp);
|
||||
|
|
@ -403,7 +511,7 @@ int i;
|
|||
* CONSTboltz * ckt->CKTtemp;
|
||||
T11 = pParam->BSIM4weff * here->BSIM4nf * pParam->BSIM4leff
|
||||
* pow(data->freq, model->BSIM4ef) * 1.0e10
|
||||
* here->BSIM4nstar * here->BSIM4nstar;
|
||||
* here->BSIM4nstar * here->BSIM4nstar;
|
||||
Swi = T10 / T11 * here->BSIM4cd
|
||||
* here->BSIM4cd;
|
||||
T1 = Swi + Ssi;
|
||||
|
|
@ -411,14 +519,14 @@ int i;
|
|||
noizDens[BSIM4FLNOIZ] *= m * (Ssi * Swi) / T1;
|
||||
else
|
||||
noizDens[BSIM4FLNOIZ] *= 0.0;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
lnNdens[BSIM4FLNOIZ] =
|
||||
log(MAX(noizDens[BSIM4FLNOIZ], N_MINLOG));
|
||||
lnNdens[BSIM4FLNOIZ] =
|
||||
log(MAX(noizDens[BSIM4FLNOIZ], N_MINLOG));
|
||||
|
||||
|
||||
if(here->BSIM4mode >= 0) { /* bugfix */
|
||||
if(here->BSIM4mode >= 0) { /* bugfix */
|
||||
NevalSrc(&noizDens[BSIM4IGSNOIZ],
|
||||
&lnNdens[BSIM4IGSNOIZ], ckt, SHOTNOISE,
|
||||
here->BSIM4gNodePrime, here->BSIM4sNodePrime,
|
||||
|
|
@ -427,7 +535,7 @@ int i;
|
|||
&lnNdens[BSIM4IGDNOIZ], ckt, SHOTNOISE,
|
||||
here->BSIM4gNodePrime, here->BSIM4dNodePrime,
|
||||
m * (here->BSIM4Igd + here->BSIM4Igcd));
|
||||
} else {
|
||||
} else {
|
||||
NevalSrc(&noizDens[BSIM4IGSNOIZ],
|
||||
&lnNdens[BSIM4IGSNOIZ], ckt, SHOTNOISE,
|
||||
here->BSIM4gNodePrime, here->BSIM4sNodePrime,
|
||||
|
|
@ -443,101 +551,101 @@ int i;
|
|||
m * here->BSIM4Igb);
|
||||
|
||||
|
||||
noizDens[BSIM4TOTNOIZ] = noizDens[BSIM4RDNOIZ]
|
||||
+ noizDens[BSIM4RSNOIZ] + noizDens[BSIM4RGNOIZ]
|
||||
+ noizDens[BSIM4RBPSNOIZ] + noizDens[BSIM4RBPDNOIZ]
|
||||
+ noizDens[BSIM4RBPBNOIZ]
|
||||
+ noizDens[BSIM4RBSBNOIZ] + noizDens[BSIM4RBDBNOIZ]
|
||||
+ noizDens[BSIM4IDNOIZ] + noizDens[BSIM4FLNOIZ]
|
||||
noizDens[BSIM4TOTNOIZ] = noizDens[BSIM4RDNOIZ]
|
||||
+ noizDens[BSIM4RSNOIZ] + noizDens[BSIM4RGNOIZ]
|
||||
+ noizDens[BSIM4RBPSNOIZ] + noizDens[BSIM4RBPDNOIZ]
|
||||
+ noizDens[BSIM4RBPBNOIZ]
|
||||
+ noizDens[BSIM4RBSBNOIZ] + noizDens[BSIM4RBDBNOIZ]
|
||||
+ noizDens[BSIM4IDNOIZ] + noizDens[BSIM4FLNOIZ]
|
||||
+ noizDens[BSIM4IGSNOIZ] + noizDens[BSIM4IGDNOIZ]
|
||||
+ noizDens[BSIM4IGBNOIZ];
|
||||
lnNdens[BSIM4TOTNOIZ] =
|
||||
log(MAX(noizDens[BSIM4TOTNOIZ], N_MINLOG));
|
||||
+ noizDens[BSIM4IGBNOIZ] + noizDens[BSIM4CORLNOIZ];
|
||||
lnNdens[BSIM4TOTNOIZ] =
|
||||
log(MAX(noizDens[BSIM4TOTNOIZ], N_MINLOG));
|
||||
|
||||
*OnDens += noizDens[BSIM4TOTNOIZ];
|
||||
*OnDens += noizDens[BSIM4TOTNOIZ];
|
||||
|
||||
if (data->delFreq == 0.0)
|
||||
{ /* if we haven't done any previous
|
||||
integration, we need to initialize our
|
||||
"history" variables.
|
||||
*/
|
||||
if (data->delFreq == 0.0)
|
||||
{ /* if we haven't done any previous
|
||||
integration, we need to initialize our
|
||||
"history" variables.
|
||||
*/
|
||||
|
||||
for (i = 0; i < BSIM4NSRCS; i++)
|
||||
{ here->BSIM4nVar[LNLSTDENS][i] =
|
||||
lnNdens[i];
|
||||
}
|
||||
for (i = 0; i < BSIM4NSRCS; i++)
|
||||
{ here->BSIM4nVar[LNLSTDENS][i] =
|
||||
lnNdens[i];
|
||||
}
|
||||
|
||||
/* clear out our integration variables
|
||||
if it's the first pass
|
||||
*/
|
||||
if (data->freq ==
|
||||
((NOISEAN*) ckt->CKTcurJob)->NstartFreq)
|
||||
{ for (i = 0; i < BSIM4NSRCS; i++)
|
||||
{ here->BSIM4nVar[OUTNOIZ][i] = 0.0;
|
||||
here->BSIM4nVar[INNOIZ][i] = 0.0;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{ /* data->delFreq != 0.0,
|
||||
we have to integrate.
|
||||
*/
|
||||
for (i = 0; i < BSIM4NSRCS; i++)
|
||||
{ if (i != BSIM4TOTNOIZ)
|
||||
{ tempOnoise = Nintegrate(noizDens[i],
|
||||
lnNdens[i],
|
||||
here->BSIM4nVar[LNLSTDENS][i],
|
||||
data);
|
||||
tempInoise = Nintegrate(noizDens[i]
|
||||
* data->GainSqInv, lnNdens[i]
|
||||
+ data->lnGainInv,
|
||||
here->BSIM4nVar[LNLSTDENS][i]
|
||||
+ data->lnGainInv, data);
|
||||
here->BSIM4nVar[LNLSTDENS][i] =
|
||||
lnNdens[i];
|
||||
data->outNoiz += tempOnoise;
|
||||
data->inNoise += tempInoise;
|
||||
if (((NOISEAN*)
|
||||
ckt->CKTcurJob)->NStpsSm != 0)
|
||||
{ here->BSIM4nVar[OUTNOIZ][i]
|
||||
+= tempOnoise;
|
||||
here->BSIM4nVar[OUTNOIZ][BSIM4TOTNOIZ]
|
||||
+= tempOnoise;
|
||||
here->BSIM4nVar[INNOIZ][i]
|
||||
+= tempInoise;
|
||||
here->BSIM4nVar[INNOIZ][BSIM4TOTNOIZ]
|
||||
+= tempInoise;
|
||||
/* clear out our integration variables
|
||||
if it's the first pass
|
||||
*/
|
||||
if (data->freq ==
|
||||
((NOISEAN*) ckt->CKTcurJob)->NstartFreq)
|
||||
{ for (i = 0; i < BSIM4NSRCS; i++)
|
||||
{ here->BSIM4nVar[OUTNOIZ][i] = 0.0;
|
||||
here->BSIM4nVar[INNOIZ][i] = 0.0;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{ /* data->delFreq != 0.0,
|
||||
we have to integrate.
|
||||
*/
|
||||
for (i = 0; i < BSIM4NSRCS; i++)
|
||||
{ if (i != BSIM4TOTNOIZ)
|
||||
{ tempOnoise = Nintegrate(noizDens[i],
|
||||
lnNdens[i],
|
||||
here->BSIM4nVar[LNLSTDENS][i],
|
||||
data);
|
||||
tempInoise = Nintegrate(noizDens[i]
|
||||
* data->GainSqInv, lnNdens[i]
|
||||
+ data->lnGainInv,
|
||||
here->BSIM4nVar[LNLSTDENS][i]
|
||||
+ data->lnGainInv, data);
|
||||
here->BSIM4nVar[LNLSTDENS][i] =
|
||||
lnNdens[i];
|
||||
data->outNoiz += tempOnoise;
|
||||
data->inNoise += tempInoise;
|
||||
if (((NOISEAN*)
|
||||
ckt->CKTcurJob)->NStpsSm != 0)
|
||||
{ here->BSIM4nVar[OUTNOIZ][i]
|
||||
+= tempOnoise;
|
||||
here->BSIM4nVar[OUTNOIZ][BSIM4TOTNOIZ]
|
||||
+= tempOnoise;
|
||||
here->BSIM4nVar[INNOIZ][i]
|
||||
+= tempInoise;
|
||||
here->BSIM4nVar[INNOIZ][BSIM4TOTNOIZ]
|
||||
+= tempInoise;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (data->prtSummary)
|
||||
{ for (i = 0; i < BSIM4NSRCS; i++)
|
||||
{ /* print a summary report */
|
||||
data->outpVector[data->outNumber++]
|
||||
= noizDens[i];
|
||||
}
|
||||
}
|
||||
break;
|
||||
case INT_NOIZ:
|
||||
/* already calculated, just output */
|
||||
if (((NOISEAN*)ckt->CKTcurJob)->NStpsSm != 0)
|
||||
{ for (i = 0; i < BSIM4NSRCS; i++)
|
||||
{ data->outpVector[data->outNumber++]
|
||||
= here->BSIM4nVar[OUTNOIZ][i];
|
||||
data->outpVector[data->outNumber++]
|
||||
= here->BSIM4nVar[INNOIZ][i];
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case N_CLOSE:
|
||||
/* do nothing, the main calling routine will close */
|
||||
return (OK);
|
||||
break; /* the plots */
|
||||
} /* switch (operation) */
|
||||
} /* for here */
|
||||
}
|
||||
}
|
||||
}
|
||||
if (data->prtSummary)
|
||||
{ for (i = 0; i < BSIM4NSRCS; i++)
|
||||
{ /* print a summary report */
|
||||
data->outpVector[data->outNumber++]
|
||||
= noizDens[i];
|
||||
}
|
||||
}
|
||||
break;
|
||||
case INT_NOIZ:
|
||||
/* already calculated, just output */
|
||||
if (((NOISEAN*)ckt->CKTcurJob)->NStpsSm != 0)
|
||||
{ for (i = 0; i < BSIM4NSRCS; i++)
|
||||
{ data->outpVector[data->outNumber++]
|
||||
= here->BSIM4nVar[OUTNOIZ][i];
|
||||
data->outpVector[data->outNumber++]
|
||||
= here->BSIM4nVar[INNOIZ][i];
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case N_CLOSE:
|
||||
/* do nothing, the main calling routine will close */
|
||||
return (OK);
|
||||
break; /* the plots */
|
||||
} /* switch (operation) */
|
||||
} /* for here */
|
||||
} /* for model */
|
||||
|
||||
return(OK);
|
||||
|
|
|
|||
|
|
@ -1,8 +1,8 @@
|
|||
/**** BSIM4.6.2 Released by Wenwei Yang 07/31/2008 ****/
|
||||
/**** BSIM4.7.0 Released by Darsen Lu 04/08/2011 ****/
|
||||
|
||||
/**********
|
||||
* Copyright 2006 Regents of the University of California. All rights reserved.
|
||||
* File: b4par.c of BSIM4.6.2.
|
||||
* File: b4par.c of BSIM4.7.0.
|
||||
* Author: 2000 Weidong Liu
|
||||
* Authors: 2001- Xuemei Xi, Mohan Dunga, Ali Niknejad, Chenming Hu.
|
||||
* Authors: 2006- Mohan Dunga, Ali Niknejad, Chenming Hu
|
||||
|
|
@ -19,7 +19,6 @@
|
|||
#include "bsim4def.h"
|
||||
#include "sperror.h"
|
||||
#include "suffix.h"
|
||||
#include "fteext.h"
|
||||
|
||||
int
|
||||
BSIM4param(
|
||||
|
|
@ -28,22 +27,17 @@ IFvalue *value,
|
|||
GENinstance *inst,
|
||||
IFvalue *select)
|
||||
{
|
||||
double scale;
|
||||
|
||||
BSIM4instance *here = (BSIM4instance*)inst;
|
||||
|
||||
NG_IGNORE(select);
|
||||
|
||||
if (!cp_getvar("scale", CP_REAL, &scale))
|
||||
scale = 1;
|
||||
|
||||
switch(param)
|
||||
{ case BSIM4_W:
|
||||
here->BSIM4w = value->rValue*scale;
|
||||
here->BSIM4w = value->rValue;
|
||||
here->BSIM4wGiven = TRUE;
|
||||
break;
|
||||
case BSIM4_L:
|
||||
here->BSIM4l = value->rValue*scale;
|
||||
here->BSIM4l = value->rValue;
|
||||
here->BSIM4lGiven = TRUE;
|
||||
break;
|
||||
case BSIM4_M:
|
||||
|
|
@ -59,19 +53,19 @@ IFvalue *select)
|
|||
here->BSIM4minGiven = TRUE;
|
||||
break;
|
||||
case BSIM4_AS:
|
||||
here->BSIM4sourceArea = value->rValue*scale*scale;
|
||||
here->BSIM4sourceArea = value->rValue;
|
||||
here->BSIM4sourceAreaGiven = TRUE;
|
||||
break;
|
||||
case BSIM4_AD:
|
||||
here->BSIM4drainArea = value->rValue*scale*scale;
|
||||
here->BSIM4drainArea = value->rValue;
|
||||
here->BSIM4drainAreaGiven = TRUE;
|
||||
break;
|
||||
case BSIM4_PS:
|
||||
here->BSIM4sourcePerimeter = value->rValue*scale;
|
||||
here->BSIM4sourcePerimeter = value->rValue;
|
||||
here->BSIM4sourcePerimeterGiven = TRUE;
|
||||
break;
|
||||
case BSIM4_PD:
|
||||
here->BSIM4drainPerimeter = value->rValue*scale;
|
||||
here->BSIM4drainPerimeter = value->rValue;
|
||||
here->BSIM4drainPerimeterGiven = TRUE;
|
||||
break;
|
||||
case BSIM4_NRS:
|
||||
|
|
|
|||
|
|
@ -1,8 +1,8 @@
|
|||
/**** BSIM4.6.2 Released by Wenwei Yang 07/31/2008 ****/
|
||||
/**** BSIM4.7.0 Released by Darsen Lu 04/08/2011 ****/
|
||||
|
||||
/**********
|
||||
* Copyright 2006 Regents of the University of California. All rights reserved.
|
||||
* File: b4pzld.c of BSIM4.6.2.
|
||||
* File: b4pzld.c of BSIM4.7.0.
|
||||
* Author: 2000 Weidong Liu
|
||||
* Authors: 2001- Xuemei Xi, Mohan Dunga, Ali Niknejad, Chenming Hu.
|
||||
* Authors: 2006- Mohan Dunga, Ali Niknejad, Chenming Hu
|
||||
|
|
@ -52,9 +52,9 @@ double ggidld, ggidlg, ggidlb, ggislg, ggislb, ggisls;
|
|||
|
||||
double m;
|
||||
|
||||
for (; model != NULL; model = model->BSIM4nextModel)
|
||||
for (; model != NULL; model = model->BSIM4nextModel)
|
||||
{ for (here = model->BSIM4instances; here!= NULL;
|
||||
here = here->BSIM4nextInstance)
|
||||
here = here->BSIM4nextInstance)
|
||||
{ if (here->BSIM4owner != ARCHme) continue;
|
||||
pParam = here->pParam;
|
||||
capbd = here->BSIM4capbd;
|
||||
|
|
@ -63,7 +63,7 @@ double m;
|
|||
cgdo = here->BSIM4cgdo;
|
||||
cgbo = pParam->BSIM4cgbo;
|
||||
|
||||
if (here->BSIM4mode >= 0)
|
||||
if (here->BSIM4mode >= 0)
|
||||
{ Gm = here->BSIM4gm;
|
||||
Gmbs = here->BSIM4gmbs;
|
||||
FwdSum = Gm + Gmbs;
|
||||
|
|
@ -196,12 +196,12 @@ double m;
|
|||
xcbbb = -(xcbdb + xcbgb + xcbsb + xcbgmb);
|
||||
|
||||
xgtg = xgtd = xgts = xgtb = 0.0;
|
||||
sxpart = 0.6;
|
||||
sxpart = 0.6;
|
||||
dxpart = 0.4;
|
||||
ddxpart_dVd = ddxpart_dVg = ddxpart_dVb
|
||||
= ddxpart_dVs = 0.0;
|
||||
dsxpart_dVd = dsxpart_dVg = dsxpart_dVb
|
||||
= dsxpart_dVs = 0.0;
|
||||
ddxpart_dVd = ddxpart_dVg = ddxpart_dVb
|
||||
= ddxpart_dVs = 0.0;
|
||||
dsxpart_dVd = dsxpart_dVg = dsxpart_dVb
|
||||
= dsxpart_dVs = 0.0;
|
||||
}
|
||||
else
|
||||
{ xcggb = xcgdb = xcgsb = xcgbb = 0.0;
|
||||
|
|
@ -209,7 +209,7 @@ double m;
|
|||
xcdgb = xcddb = xcdsb = xcdbb = 0.0;
|
||||
xcsgb = xcsdb = xcssb = xcsbb = 0.0;
|
||||
|
||||
xgtg = here->BSIM4gtg;
|
||||
xgtg = here->BSIM4gtg;
|
||||
xgtd = here->BSIM4gtd;
|
||||
xgts = here->BSIM4gts;
|
||||
xgtb = here->BSIM4gtb;
|
||||
|
|
@ -219,46 +219,46 @@ double m;
|
|||
xcqsb = here->BSIM4cqsb;
|
||||
xcqbb = here->BSIM4cqbb;
|
||||
|
||||
CoxWL = model->BSIM4coxe * here->pParam->BSIM4weffCV
|
||||
CoxWL = model->BSIM4coxe * here->pParam->BSIM4weffCV
|
||||
* here->BSIM4nf * here->pParam->BSIM4leffCV;
|
||||
qcheq = -(here->BSIM4qgate + here->BSIM4qbulk);
|
||||
if (fabs(qcheq) <= 1.0e-5 * CoxWL)
|
||||
{ if (model->BSIM4xpart < 0.5)
|
||||
{ dxpart = 0.4;
|
||||
}
|
||||
else if (model->BSIM4xpart > 0.5)
|
||||
{ dxpart = 0.0;
|
||||
}
|
||||
else
|
||||
{ dxpart = 0.5;
|
||||
}
|
||||
ddxpart_dVd = ddxpart_dVg = ddxpart_dVb
|
||||
= ddxpart_dVs = 0.0;
|
||||
}
|
||||
else
|
||||
{ dxpart = here->BSIM4qdrn / qcheq;
|
||||
Cdd = here->BSIM4cddb;
|
||||
Csd = -(here->BSIM4cgdb + here->BSIM4cddb
|
||||
+ here->BSIM4cbdb);
|
||||
ddxpart_dVd = (Cdd - dxpart * (Cdd + Csd)) / qcheq;
|
||||
Cdg = here->BSIM4cdgb;
|
||||
Csg = -(here->BSIM4cggb + here->BSIM4cdgb
|
||||
+ here->BSIM4cbgb);
|
||||
ddxpart_dVg = (Cdg - dxpart * (Cdg + Csg)) / qcheq;
|
||||
qcheq = -(here->BSIM4qgate + here->BSIM4qbulk);
|
||||
if (fabs(qcheq) <= 1.0e-5 * CoxWL)
|
||||
{ if (model->BSIM4xpart < 0.5)
|
||||
{ dxpart = 0.4;
|
||||
}
|
||||
else if (model->BSIM4xpart > 0.5)
|
||||
{ dxpart = 0.0;
|
||||
}
|
||||
else
|
||||
{ dxpart = 0.5;
|
||||
}
|
||||
ddxpart_dVd = ddxpart_dVg = ddxpart_dVb
|
||||
= ddxpart_dVs = 0.0;
|
||||
}
|
||||
else
|
||||
{ dxpart = here->BSIM4qdrn / qcheq;
|
||||
Cdd = here->BSIM4cddb;
|
||||
Csd = -(here->BSIM4cgdb + here->BSIM4cddb
|
||||
+ here->BSIM4cbdb);
|
||||
ddxpart_dVd = (Cdd - dxpart * (Cdd + Csd)) / qcheq;
|
||||
Cdg = here->BSIM4cdgb;
|
||||
Csg = -(here->BSIM4cggb + here->BSIM4cdgb
|
||||
+ here->BSIM4cbgb);
|
||||
ddxpart_dVg = (Cdg - dxpart * (Cdg + Csg)) / qcheq;
|
||||
|
||||
Cds = here->BSIM4cdsb;
|
||||
Css = -(here->BSIM4cgsb + here->BSIM4cdsb
|
||||
+ here->BSIM4cbsb);
|
||||
ddxpart_dVs = (Cds - dxpart * (Cds + Css)) / qcheq;
|
||||
Cds = here->BSIM4cdsb;
|
||||
Css = -(here->BSIM4cgsb + here->BSIM4cdsb
|
||||
+ here->BSIM4cbsb);
|
||||
ddxpart_dVs = (Cds - dxpart * (Cds + Css)) / qcheq;
|
||||
|
||||
ddxpart_dVb = -(ddxpart_dVd + ddxpart_dVg
|
||||
+ ddxpart_dVs);
|
||||
}
|
||||
sxpart = 1.0 - dxpart;
|
||||
dsxpart_dVd = -ddxpart_dVd;
|
||||
dsxpart_dVg = -ddxpart_dVg;
|
||||
dsxpart_dVs = -ddxpart_dVs;
|
||||
dsxpart_dVb = -(dsxpart_dVd + dsxpart_dVg + dsxpart_dVs);
|
||||
ddxpart_dVb = -(ddxpart_dVd + ddxpart_dVg
|
||||
+ ddxpart_dVs);
|
||||
}
|
||||
sxpart = 1.0 - dxpart;
|
||||
dsxpart_dVd = -ddxpart_dVd;
|
||||
dsxpart_dVg = -ddxpart_dVg;
|
||||
dsxpart_dVs = -ddxpart_dVs;
|
||||
dsxpart_dVb = -(dsxpart_dVd + dsxpart_dVg + dsxpart_dVs);
|
||||
}
|
||||
}
|
||||
else
|
||||
|
|
@ -337,7 +337,7 @@ double m;
|
|||
xcgmdb = -cgdo;
|
||||
xcgmsb = -cgso;
|
||||
xcgmbb = -pParam->BSIM4cgbo;
|
||||
|
||||
|
||||
xcdgmb = xcgmdb;
|
||||
xcsgmb = xcgmsb;
|
||||
xcbgmb = xcgmbb;
|
||||
|
|
@ -394,12 +394,12 @@ double m;
|
|||
xcbbb = -(xcbgb + xcbdb + xcbsb + xcbgmb);
|
||||
|
||||
xgtg = xgtd = xgts = xgtb = 0.0;
|
||||
sxpart = 0.4;
|
||||
sxpart = 0.4;
|
||||
dxpart = 0.6;
|
||||
ddxpart_dVd = ddxpart_dVg = ddxpart_dVb
|
||||
= ddxpart_dVs = 0.0;
|
||||
dsxpart_dVd = dsxpart_dVg = dsxpart_dVb
|
||||
= dsxpart_dVs = 0.0;
|
||||
ddxpart_dVd = ddxpart_dVg = ddxpart_dVb
|
||||
= ddxpart_dVs = 0.0;
|
||||
dsxpart_dVd = dsxpart_dVg = dsxpart_dVb
|
||||
= dsxpart_dVs = 0.0;
|
||||
}
|
||||
else
|
||||
{ xcggb = xcgdb = xcgsb = xcgbb = 0.0;
|
||||
|
|
@ -407,7 +407,7 @@ double m;
|
|||
xcdgb = xcddb = xcdsb = xcdbb = 0.0;
|
||||
xcsgb = xcsdb = xcssb = xcsbb = 0.0;
|
||||
|
||||
xgtg = here->BSIM4gtg;
|
||||
xgtg = here->BSIM4gtg;
|
||||
xgtd = here->BSIM4gts;
|
||||
xgts = here->BSIM4gtd;
|
||||
xgtb = here->BSIM4gtb;
|
||||
|
|
@ -417,46 +417,46 @@ double m;
|
|||
xcqsb = here->BSIM4cqdb;
|
||||
xcqbb = here->BSIM4cqbb;
|
||||
|
||||
CoxWL = model->BSIM4coxe * here->pParam->BSIM4weffCV
|
||||
CoxWL = model->BSIM4coxe * here->pParam->BSIM4weffCV
|
||||
* here->BSIM4nf * here->pParam->BSIM4leffCV;
|
||||
qcheq = -(here->BSIM4qgate + here->BSIM4qbulk);
|
||||
if (fabs(qcheq) <= 1.0e-5 * CoxWL)
|
||||
{ if (model->BSIM4xpart < 0.5)
|
||||
{ sxpart = 0.4;
|
||||
}
|
||||
else if (model->BSIM4xpart > 0.5)
|
||||
{ sxpart = 0.0;
|
||||
}
|
||||
else
|
||||
{ sxpart = 0.5;
|
||||
}
|
||||
dsxpart_dVd = dsxpart_dVg = dsxpart_dVb
|
||||
= dsxpart_dVs = 0.0;
|
||||
}
|
||||
else
|
||||
{ sxpart = here->BSIM4qdrn / qcheq;
|
||||
Css = here->BSIM4cddb;
|
||||
Cds = -(here->BSIM4cgdb + here->BSIM4cddb
|
||||
+ here->BSIM4cbdb);
|
||||
dsxpart_dVs = (Css - sxpart * (Css + Cds)) / qcheq;
|
||||
Csg = here->BSIM4cdgb;
|
||||
Cdg = -(here->BSIM4cggb + here->BSIM4cdgb
|
||||
+ here->BSIM4cbgb);
|
||||
dsxpart_dVg = (Csg - sxpart * (Csg + Cdg)) / qcheq;
|
||||
qcheq = -(here->BSIM4qgate + here->BSIM4qbulk);
|
||||
if (fabs(qcheq) <= 1.0e-5 * CoxWL)
|
||||
{ if (model->BSIM4xpart < 0.5)
|
||||
{ sxpart = 0.4;
|
||||
}
|
||||
else if (model->BSIM4xpart > 0.5)
|
||||
{ sxpart = 0.0;
|
||||
}
|
||||
else
|
||||
{ sxpart = 0.5;
|
||||
}
|
||||
dsxpart_dVd = dsxpart_dVg = dsxpart_dVb
|
||||
= dsxpart_dVs = 0.0;
|
||||
}
|
||||
else
|
||||
{ sxpart = here->BSIM4qdrn / qcheq;
|
||||
Css = here->BSIM4cddb;
|
||||
Cds = -(here->BSIM4cgdb + here->BSIM4cddb
|
||||
+ here->BSIM4cbdb);
|
||||
dsxpart_dVs = (Css - sxpart * (Css + Cds)) / qcheq;
|
||||
Csg = here->BSIM4cdgb;
|
||||
Cdg = -(here->BSIM4cggb + here->BSIM4cdgb
|
||||
+ here->BSIM4cbgb);
|
||||
dsxpart_dVg = (Csg - sxpart * (Csg + Cdg)) / qcheq;
|
||||
|
||||
Csd = here->BSIM4cdsb;
|
||||
Cdd = -(here->BSIM4cgsb + here->BSIM4cdsb
|
||||
+ here->BSIM4cbsb);
|
||||
dsxpart_dVd = (Csd - sxpart * (Csd + Cdd)) / qcheq;
|
||||
Csd = here->BSIM4cdsb;
|
||||
Cdd = -(here->BSIM4cgsb + here->BSIM4cdsb
|
||||
+ here->BSIM4cbsb);
|
||||
dsxpart_dVd = (Csd - sxpart * (Csd + Cdd)) / qcheq;
|
||||
|
||||
dsxpart_dVb = -(dsxpart_dVd + dsxpart_dVg
|
||||
+ dsxpart_dVs);
|
||||
}
|
||||
dxpart = 1.0 - sxpart;
|
||||
ddxpart_dVd = -dsxpart_dVd;
|
||||
ddxpart_dVg = -dsxpart_dVg;
|
||||
ddxpart_dVs = -dsxpart_dVs;
|
||||
ddxpart_dVb = -(ddxpart_dVd + ddxpart_dVg + ddxpart_dVs);
|
||||
dsxpart_dVb = -(dsxpart_dVd + dsxpart_dVg
|
||||
+ dsxpart_dVs);
|
||||
}
|
||||
dxpart = 1.0 - sxpart;
|
||||
ddxpart_dVd = -dsxpart_dVd;
|
||||
ddxpart_dVg = -dsxpart_dVg;
|
||||
ddxpart_dVs = -dsxpart_dVs;
|
||||
ddxpart_dVb = -(ddxpart_dVd + ddxpart_dVg + ddxpart_dVs);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -479,7 +479,7 @@ double m;
|
|||
}
|
||||
|
||||
|
||||
T1 = *(ckt->CKTstate0 + here->BSIM4qdef) * here->BSIM4gtau;
|
||||
T1 = *(ckt->CKTstate0 + here->BSIM4qdef) * here->BSIM4gtau;
|
||||
gds = here->BSIM4gds;
|
||||
|
||||
/*
|
||||
|
|
@ -513,13 +513,13 @@ double m;
|
|||
*(here->BSIM4GPgpPtr) += m * (geltd - xgtg + gIgtotg);
|
||||
*(here->BSIM4GPdpPtr ) += m * xcgdb * s->real;
|
||||
*(here->BSIM4GPdpPtr +1) += m * xcgdb * s->imag;
|
||||
*(here->BSIM4GPdpPtr) -= m * (xgtd - gIgtotd);
|
||||
*(here->BSIM4GPdpPtr) -= m * (xgtd - gIgtotd);
|
||||
*(here->BSIM4GPspPtr ) += m * xcgsb * s->real;
|
||||
*(here->BSIM4GPspPtr +1) += m * xcgsb * s->imag;
|
||||
*(here->BSIM4GPspPtr) -= m * (xgts - gIgtots);
|
||||
*(here->BSIM4GPbpPtr ) += m * xcgbb * s->real;
|
||||
*(here->BSIM4GPbpPtr +1) += m * xcgbb * s->imag;
|
||||
*(here->BSIM4GPbpPtr) -= m * (xgtb - gIgtotb);
|
||||
*(here->BSIM4GPbpPtr) -= m * (xgtb - gIgtotb);
|
||||
}
|
||||
else if (here->BSIM4rgateMod == 2)
|
||||
{ *(here->BSIM4GEgePtr) += m * gcrg;
|
||||
|
|
@ -585,16 +585,16 @@ double m;
|
|||
else
|
||||
{ *(here->BSIM4GPdpPtr ) += m * xcgdb * s->real;
|
||||
*(here->BSIM4GPdpPtr +1) += m * xcgdb * s->imag;
|
||||
*(here->BSIM4GPdpPtr) -= m * (xgtd - gIgtotd);
|
||||
*(here->BSIM4GPdpPtr) -= m * (xgtd - gIgtotd);
|
||||
*(here->BSIM4GPgpPtr ) += m * xcggb * s->real;
|
||||
*(here->BSIM4GPgpPtr +1) += m * xcggb * s->imag;
|
||||
*(here->BSIM4GPgpPtr) -= m * (xgtg - gIgtotg);
|
||||
*(here->BSIM4GPgpPtr) -= m * (xgtg - gIgtotg);
|
||||
*(here->BSIM4GPspPtr ) += m * xcgsb * s->real;
|
||||
*(here->BSIM4GPspPtr +1) += m * xcgsb * s->imag;
|
||||
*(here->BSIM4GPspPtr) -= m * (xgts - gIgtots);
|
||||
*(here->BSIM4GPbpPtr ) += m * xcgbb * s->real;
|
||||
*(here->BSIM4GPbpPtr +1) += m * xcgbb * s->imag;
|
||||
*(here->BSIM4GPbpPtr) -= m * (xgtb - gIgtotb);
|
||||
*(here->BSIM4GPbpPtr) -= m * (xgtb - gIgtotb);
|
||||
}
|
||||
|
||||
if (model->BSIM4rdsMod)
|
||||
|
|
@ -609,21 +609,21 @@ double m;
|
|||
*(here->BSIM4DPdpPtr ) += m * xcddb * s->real;
|
||||
*(here->BSIM4DPdpPtr +1) += m * xcddb * s->imag;
|
||||
*(here->BSIM4DPdpPtr) += m * (gdpr + gds + here->BSIM4gbd
|
||||
- gdtotd + RevSum + gbdpdp - gIdtotd
|
||||
+ dxpart * xgtd + T1 * ddxpart_dVd);
|
||||
- gdtotd + RevSum + gbdpdp - gIdtotd
|
||||
+ dxpart * xgtd + T1 * ddxpart_dVd);
|
||||
*(here->BSIM4DPdPtr) -= m * (gdpr + gdtot);
|
||||
*(here->BSIM4DPgpPtr ) += m * xcdgb * s->real;
|
||||
*(here->BSIM4DPgpPtr +1) += m * xcdgb * s->imag;
|
||||
*(here->BSIM4DPgpPtr) += m * (Gm - gdtotg + gbdpg - gIdtotg
|
||||
+ T1 * ddxpart_dVg + dxpart * xgtg);
|
||||
+ T1 * ddxpart_dVg + dxpart * xgtg);
|
||||
*(here->BSIM4DPspPtr ) += m * xcdsb * s->real;
|
||||
*(here->BSIM4DPspPtr +1) += m * xcdsb * s->imag;
|
||||
*(here->BSIM4DPspPtr) -= m * (gds + FwdSum + gdtots - gbdpsp + gIdtots
|
||||
- T1 * ddxpart_dVs - dxpart * xgts);
|
||||
- T1 * ddxpart_dVs - dxpart * xgts);
|
||||
*(here->BSIM4DPbpPtr ) += m * xcdbb * s->real;
|
||||
*(here->BSIM4DPbpPtr +1) += m * xcdbb * s->imag;
|
||||
*(here->BSIM4DPbpPtr) -= m * (gjbd + gdtotb - Gmbs - gbdpb + gIdtotb
|
||||
- T1 * ddxpart_dVb - dxpart * xgtb);
|
||||
- T1 * ddxpart_dVb - dxpart * xgtb);
|
||||
|
||||
*(here->BSIM4DdpPtr) -= m * (gdpr - gdtotd);
|
||||
*(here->BSIM4DdPtr) += m * (gdpr + gdtot);
|
||||
|
|
@ -631,21 +631,21 @@ double m;
|
|||
*(here->BSIM4SPdpPtr ) += m * xcsdb * s->real;
|
||||
*(here->BSIM4SPdpPtr +1) += m * xcsdb * s->imag;
|
||||
*(here->BSIM4SPdpPtr) -= m * (gds + gstotd + RevSum - gbspdp + gIstotd
|
||||
- T1 * dsxpart_dVd - sxpart * xgtd);
|
||||
- T1 * dsxpart_dVd - sxpart * xgtd);
|
||||
*(here->BSIM4SPgpPtr ) += m * xcsgb * s->real;
|
||||
*(here->BSIM4SPgpPtr +1) += m * xcsgb * s->imag;
|
||||
*(here->BSIM4SPgpPtr) -= m * (Gm + gstotg - gbspg + gIstotg
|
||||
- T1 * dsxpart_dVg - sxpart * xgtg);
|
||||
- T1 * dsxpart_dVg - sxpart * xgtg);
|
||||
*(here->BSIM4SPspPtr ) += m * xcssb * s->real;
|
||||
*(here->BSIM4SPspPtr +1) += m * xcssb * s->imag;
|
||||
*(here->BSIM4SPspPtr) += m * (gspr + gds + here->BSIM4gbs - gIstots
|
||||
- gstots + FwdSum + gbspsp
|
||||
+ sxpart * xgts + T1 * dsxpart_dVs);
|
||||
- gstots + FwdSum + gbspsp
|
||||
+ sxpart * xgts + T1 * dsxpart_dVs);
|
||||
*(here->BSIM4SPsPtr) -= m * (gspr + gstot);
|
||||
*(here->BSIM4SPbpPtr ) += m * xcsbb * s->real;
|
||||
*(here->BSIM4SPbpPtr +1) += m * xcsbb * s->imag;
|
||||
*(here->BSIM4SPbpPtr) -= m * (gjbs + gstotb + Gmbs - gbspb + gIstotb
|
||||
- T1 * dsxpart_dVb - sxpart * xgtb);
|
||||
- T1 * dsxpart_dVb - sxpart * xgtb);
|
||||
|
||||
*(here->BSIM4SspPtr) -= m * (gspr - gstots);
|
||||
*(here->BSIM4SsPtr) += m * (gspr + gstot);
|
||||
|
|
@ -662,32 +662,32 @@ double m;
|
|||
*(here->BSIM4BPbpPtr ) += m * xcbbb * s->real;
|
||||
*(here->BSIM4BPbpPtr +1) += m * xcbbb * s->imag;
|
||||
*(here->BSIM4BPbpPtr) += m * (gjbd + gjbs - here->BSIM4gbbs
|
||||
- gIbtotb);
|
||||
ggidld = here->BSIM4ggidld;
|
||||
ggidlg = here->BSIM4ggidlg;
|
||||
ggidlb = here->BSIM4ggidlb;
|
||||
ggislg = here->BSIM4ggislg;
|
||||
ggisls = here->BSIM4ggisls;
|
||||
ggislb = here->BSIM4ggislb;
|
||||
- gIbtotb);
|
||||
ggidld = here->BSIM4ggidld;
|
||||
ggidlg = here->BSIM4ggidlg;
|
||||
ggidlb = here->BSIM4ggidlb;
|
||||
ggislg = here->BSIM4ggislg;
|
||||
ggisls = here->BSIM4ggisls;
|
||||
ggislb = here->BSIM4ggislb;
|
||||
|
||||
/* stamp gidl */
|
||||
(*(here->BSIM4DPdpPtr) += m * ggidld);
|
||||
(*(here->BSIM4DPgpPtr) += m * ggidlg);
|
||||
(*(here->BSIM4DPspPtr) -= m * ((ggidlg + ggidld) + ggidlb));
|
||||
(*(here->BSIM4DPbpPtr) += m * ggidlb);
|
||||
(*(here->BSIM4BPdpPtr) -= m * ggidld);
|
||||
(*(here->BSIM4BPgpPtr) -= m * ggidlg);
|
||||
(*(here->BSIM4BPspPtr) += m * ((ggidlg + ggidld) + ggidlb));
|
||||
(*(here->BSIM4BPbpPtr) -= m * ggidlb);
|
||||
/* stamp gisl */
|
||||
(*(here->BSIM4SPdpPtr) -= m * ((ggisls + ggislg) + ggislb));
|
||||
(*(here->BSIM4SPgpPtr) += m * ggislg);
|
||||
(*(here->BSIM4SPspPtr) += m * ggisls);
|
||||
(*(here->BSIM4SPbpPtr) += m * ggislb);
|
||||
(*(here->BSIM4BPdpPtr) += m * ((ggislg + ggisls) + ggislb));
|
||||
(*(here->BSIM4BPgpPtr) -= m * ggislg);
|
||||
(*(here->BSIM4BPspPtr) -= m * ggisls);
|
||||
(*(here->BSIM4BPbpPtr) -= m * ggislb);
|
||||
/* stamp gidl */
|
||||
(*(here->BSIM4DPdpPtr) += m * ggidld);
|
||||
(*(here->BSIM4DPgpPtr) += m * ggidlg);
|
||||
(*(here->BSIM4DPspPtr) -= m * ((ggidlg + ggidld) + ggidlb));
|
||||
(*(here->BSIM4DPbpPtr) += m * ggidlb);
|
||||
(*(here->BSIM4BPdpPtr) -= m * ggidld);
|
||||
(*(here->BSIM4BPgpPtr) -= m * ggidlg);
|
||||
(*(here->BSIM4BPspPtr) += m * ((ggidlg + ggidld) + ggidlb));
|
||||
(*(here->BSIM4BPbpPtr) -= m * ggidlb);
|
||||
/* stamp gisl */
|
||||
(*(here->BSIM4SPdpPtr) -= m * ((ggisls + ggislg) + ggislb));
|
||||
(*(here->BSIM4SPgpPtr) += m * ggislg);
|
||||
(*(here->BSIM4SPspPtr) += m * ggisls);
|
||||
(*(here->BSIM4SPbpPtr) += m * ggislb);
|
||||
(*(here->BSIM4BPdpPtr) += m * ((ggislg + ggisls) + ggislb));
|
||||
(*(here->BSIM4BPgpPtr) -= m * ggislg);
|
||||
(*(here->BSIM4BPspPtr) -= m * ggisls);
|
||||
(*(here->BSIM4BPbpPtr) -= m * ggislb);
|
||||
|
||||
if (here->BSIM4rbodyMod)
|
||||
{ (*(here->BSIM4DPdbPtr ) += m * xcdbdb * s->real);
|
||||
|
|
@ -711,7 +711,7 @@ double m;
|
|||
(*(here->BSIM4BPbPtr) -= m * here->BSIM4grbpb);
|
||||
(*(here->BSIM4BPsbPtr) -= m * here->BSIM4grbps);
|
||||
(*(here->BSIM4BPbpPtr) += m * (here->BSIM4grbpd + here->BSIM4grbps
|
||||
+ here->BSIM4grbpb));
|
||||
+ here->BSIM4grbpb));
|
||||
/* WDL: (-here->BSIM4gbbs) already added to BPbpPtr */
|
||||
|
||||
(*(here->BSIM4SBspPtr ) += m * xcsbsb * s->real);
|
||||
|
|
@ -722,7 +722,7 @@ double m;
|
|||
(*(here->BSIM4SBsbPtr ) -= m * xcsbsb * s->real);
|
||||
(*(here->BSIM4SBsbPtr +1) -= m * xcsbsb * s->imag);
|
||||
(*(here->BSIM4SBsbPtr) += m * (here->BSIM4gbs
|
||||
+ here->BSIM4grbps + here->BSIM4grbsb));
|
||||
+ here->BSIM4grbps + here->BSIM4grbsb));
|
||||
|
||||
(*(here->BSIM4BdbPtr) -= m * here->BSIM4grbdb);
|
||||
(*(here->BSIM4BbpPtr) -= m * here->BSIM4grbpb);
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
|
@ -1,8 +1,8 @@
|
|||
/**** BSIM4.6.2 Released by Wenwei Yang 07/31/2008 ****/
|
||||
/**** BSIM4.7.0 Released by Darsen Lu 04/08/2011 ****/
|
||||
|
||||
/**********
|
||||
* Copyright 2006 Regents of the University of California. All rights reserved.
|
||||
* File: b4trunc.c of BSIM4.6.2.
|
||||
* File: b4trunc.c of BSIM4.7.0.
|
||||
* Author: 2000 Weidong Liu
|
||||
* Authors: 2001- Xuemei Xi, Mohan Dunga, Ali Niknejad, Chenming Hu.
|
||||
* Authors: 2006- Mohan Dunga, Ali Niknejad, Chenming Hu
|
||||
|
|
@ -33,8 +33,8 @@ BSIM4instance *here;
|
|||
for (; model != NULL; model = model->BSIM4nextModel)
|
||||
{ for (here = model->BSIM4instances; here != NULL;
|
||||
here = here->BSIM4nextInstance)
|
||||
{
|
||||
if (here->BSIM4owner != ARCHme) continue;
|
||||
{
|
||||
if (here->BSIM4owner != ARCHme) continue;
|
||||
#ifdef STEPDEBUG
|
||||
debugtemp = *timeStep;
|
||||
#endif /* STEPDEBUG */
|
||||
|
|
@ -46,12 +46,12 @@ BSIM4instance *here;
|
|||
if (here->BSIM4rbodyMod)
|
||||
{ CKTterr(here->BSIM4qbs,ckt,timeStep);
|
||||
CKTterr(here->BSIM4qbd,ckt,timeStep);
|
||||
}
|
||||
if (here->BSIM4rgateMod == 3)
|
||||
CKTterr(here->BSIM4qgmid,ckt,timeStep);
|
||||
}
|
||||
if (here->BSIM4rgateMod == 3)
|
||||
CKTterr(here->BSIM4qgmid,ckt,timeStep);
|
||||
#ifdef STEPDEBUG
|
||||
if(debugtemp != *timeStep)
|
||||
{ printf("device %s reduces step from %g to %g\n",
|
||||
{ printf("device %s reduces step from %g to %g\n",
|
||||
here->BSIM4name,debugtemp,*timeStep);
|
||||
}
|
||||
#endif /* STEPDEBUG */
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load Diff
|
|
@ -0,0 +1,6 @@
|
|||
Makefile.in
|
||||
Makefile
|
||||
.deps
|
||||
.libs
|
||||
*.lo
|
||||
*.la
|
||||
|
|
@ -0,0 +1,33 @@
|
|||
|
||||
The terms under which the software is provided are as the following.
|
||||
|
||||
Software is distributed as is, completely without warranty or service
|
||||
support. The University of California and its employees are not liable
|
||||
for the condition or performance of the software.
|
||||
|
||||
The University owns the copyright but shall not be liable for any
|
||||
infringement of copyright or other proprietary rights brought by third
|
||||
parties against the users of the software.
|
||||
|
||||
The University of California hereby disclaims all implied warranties.
|
||||
|
||||
The University of California grants the users the right to modify, copy,
|
||||
and redistribute the software and documentation, both within the user's
|
||||
organization and externally, subject to the following restrictions:
|
||||
|
||||
1. The users agree not to charge for the University of California code
|
||||
itself but may charge for additions, extensions, or support.
|
||||
|
||||
2. In any product based on the software, the users agree to acknowledge
|
||||
the UC Berkeley BSIM Research Group that developed the software. This
|
||||
acknowledgment shall appear in the product documentation.
|
||||
|
||||
3. The users agree to obey all U.S. Government restrictions governing
|
||||
redistribution or export of the software.
|
||||
|
||||
4. The users agree to reproduce any copyright notice which appears on
|
||||
the software on any copy or modification of such made available
|
||||
to others.
|
||||
|
||||
Chenming Hu, and Weidong Liu
|
||||
Mar. 2000
|
||||
|
|
@ -0,0 +1,37 @@
|
|||
## Process this file with automake to produce Makefile.in
|
||||
|
||||
noinst_LTLIBRARIES = libbsim4v6.la
|
||||
|
||||
libbsim4v6_la_SOURCES = \
|
||||
b4v6.c \
|
||||
b4v6acld.c \
|
||||
b4v6ask.c \
|
||||
b4v6check.c \
|
||||
b4v6cvtest.c \
|
||||
b4v6del.c \
|
||||
b4v6dest.c \
|
||||
b4v6geo.c \
|
||||
b4v6getic.c \
|
||||
b4v6ld.c \
|
||||
b4v6mask.c \
|
||||
b4v6mdel.c \
|
||||
b4v6mpar.c \
|
||||
b4v6noi.c \
|
||||
b4v6par.c \
|
||||
b4v6pzld.c \
|
||||
b4v6set.c \
|
||||
b4v6temp.c \
|
||||
b4v6trunc.c \
|
||||
bsim4v6def.h \
|
||||
bsim4v6ext.h \
|
||||
bsim4v6init.c \
|
||||
bsim4v6init.h \
|
||||
bsim4v6itf.h
|
||||
|
||||
|
||||
|
||||
AM_CPPFLAGS = -I$(top_srcdir)/src/include
|
||||
|
||||
MAINTAINERCLEANFILES = Makefile.in
|
||||
|
||||
EXTRA_DIST = B4TERMS_OF_USE
|
||||
|
|
@ -0,0 +1,992 @@
|
|||
/**** BSIM4.6.2 Released by Wenwei Yang 07/31/2008 ****/
|
||||
|
||||
/**********
|
||||
* Copyright 2006 Regents of the University of California. All rights reserved.
|
||||
* File: b4.c of BSIM4.6.2.
|
||||
* Author: 2000 Weidong Liu
|
||||
* Authors: 2001- Xuemei Xi, Mohan Dunga, Ali Niknejad, Chenming Hu.
|
||||
* Authors: 2006- Mohan Dunga, Ali Niknejad, Chenming Hu
|
||||
* Authors: 2007- Mohan Dunga, Wenwei Yang, Ali Niknejad, Chenming Hu
|
||||
* Authors: 2008- Wenwei Yang, Ali Niknejad, Chenming Hu
|
||||
* Project Director: Prof. Chenming Hu.
|
||||
* Modified by Xuemei Xi, 04/06/2001.
|
||||
* Modified by Xuemei Xi, 10/05/2001.
|
||||
* Modified by Xuemei Xi, 11/15/2002.
|
||||
* Modified by Xuemei Xi, 05/09/2003.
|
||||
* Modified by Xuemei Xi, 03/04/2004.
|
||||
* Modified by Xuemei Xi, Mohan Dunga, 07/29/2005.
|
||||
* Modified by Mohan Dunga, 12/13/2006.
|
||||
* Modified by Mohan Dunga, Wenwei Yang, 05/18/2007.
|
||||
* Modified by Wenwei Yang, 07/31/2008.
|
||||
**********/
|
||||
|
||||
#include "ngspice.h"
|
||||
#include "devdefs.h"
|
||||
#include "bsim4v6def.h"
|
||||
#include "suffix.h"
|
||||
|
||||
IFparm BSIM4v6pTable[] = { /* parameters */
|
||||
IOP( "l", BSIM4v6_L, IF_REAL , "Length"),
|
||||
IOP( "w", BSIM4v6_W, IF_REAL , "Width"),
|
||||
IOP( "m", BSIM4v6_M, IF_REAL , "Separate Parallel multiplier"),
|
||||
IOP( "nf", BSIM4v6_NF, IF_REAL , "Number of fingers"),
|
||||
IOP( "sa", BSIM4v6_SA, IF_REAL , "distance between OD edge to poly of one side "),
|
||||
IOP( "sb", BSIM4v6_SB, IF_REAL , "distance between OD edge to poly of the other side"),
|
||||
IOP( "sd", BSIM4v6_SD, IF_REAL , "distance between neighbour fingers"),
|
||||
IOP( "sca", BSIM4v6_SCA, IF_REAL , "Integral of the first distribution function for scattered well dopant"),
|
||||
IOP( "scb", BSIM4v6_SCB, IF_REAL , "Integral of the second distribution function for scattered well dopant"),
|
||||
IOP( "scc", BSIM4v6_SCC, IF_REAL , "Integral of the third distribution function for scattered well dopant"),
|
||||
IOP( "sc", BSIM4v6_SC, IF_REAL , "Distance to a single well edge "),
|
||||
IOP( "min", BSIM4v6_MIN, IF_INTEGER , "Minimize either D or S"),
|
||||
IOP( "ad", BSIM4v6_AD, IF_REAL , "Drain area"),
|
||||
IOP( "as", BSIM4v6_AS, IF_REAL , "Source area"),
|
||||
IOP( "pd", BSIM4v6_PD, IF_REAL , "Drain perimeter"),
|
||||
IOP( "ps", BSIM4v6_PS, IF_REAL , "Source perimeter"),
|
||||
IOP( "nrd", BSIM4v6_NRD, IF_REAL , "Number of squares in drain"),
|
||||
IOP( "nrs", BSIM4v6_NRS, IF_REAL , "Number of squares in source"),
|
||||
IOP( "off", BSIM4v6_OFF, IF_FLAG , "Device is initially off"),
|
||||
IOP( "rbdb", BSIM4v6_RBDB, IF_REAL , "Body resistance"),
|
||||
IOP( "rbsb", BSIM4v6_RBSB, IF_REAL , "Body resistance"),
|
||||
IOP( "rbpb", BSIM4v6_RBPB, IF_REAL , "Body resistance"),
|
||||
IOP( "rbps", BSIM4v6_RBPS, IF_REAL , "Body resistance"),
|
||||
IOP( "rbpd", BSIM4v6_RBPD, IF_REAL , "Body resistance"),
|
||||
IOP( "delvto", BSIM4v6_DELVTO, IF_REAL , "Zero bias threshold voltage variation"),
|
||||
IOP( "xgw", BSIM4v6_XGW, IF_REAL, "Distance from gate contact center to device edge"),
|
||||
IOP( "ngcon", BSIM4v6_NGCON, IF_REAL, "Number of gate contacts"),
|
||||
|
||||
|
||||
IOP( "trnqsmod", BSIM4v6_TRNQSMOD, IF_INTEGER, "Transient NQS model selector"),
|
||||
IOP( "acnqsmod", BSIM4v6_ACNQSMOD, IF_INTEGER, "AC NQS model selector"),
|
||||
IOP( "rbodymod", BSIM4v6_RBODYMOD, IF_INTEGER, "Distributed body R model selector"),
|
||||
IOP( "rgatemod", BSIM4v6_RGATEMOD, IF_INTEGER, "Gate resistance model selector"),
|
||||
IOP( "geomod", BSIM4v6_GEOMOD, IF_INTEGER, "Geometry dependent parasitics model selector"),
|
||||
IOP( "rgeomod", BSIM4v6_RGEOMOD, IF_INTEGER, "S/D resistance and contact model selector"),
|
||||
IP( "ic", BSIM4v6_IC, IF_REALVEC , "Vector of DS,GS,BS initial voltages"),
|
||||
OP( "gmbs", BSIM4v6_GMBS, IF_REAL, "Gmb"),
|
||||
OP( "gm", BSIM4v6_GM, IF_REAL, "Gm"),
|
||||
OP( "gds", BSIM4v6_GDS, IF_REAL, "Gds"),
|
||||
OP( "vdsat", BSIM4v6_VDSAT, IF_REAL, "Vdsat"),
|
||||
OP( "vth", BSIM4v6_VON, IF_REAL, "Vth"),
|
||||
OP( "id", BSIM4v6_CD, IF_REAL, "Ids"),
|
||||
OP( "ibd", BSIM4v6_CBD, IF_REAL, "Ibd"),
|
||||
OP( "ibs", BSIM4v6_CBS, IF_REAL, "Ibs"),
|
||||
OP( "gbd", BSIM4v6_GBD, IF_REAL, "gbd"),
|
||||
OP( "gbs", BSIM4v6_GBS, IF_REAL, "gbs"),
|
||||
OP( "isub", BSIM4v6_CSUB, IF_REAL, "Isub"),
|
||||
OP( "igidl", BSIM4v6_IGIDL, IF_REAL, "Igidl"),
|
||||
OP( "igisl", BSIM4v6_IGISL, IF_REAL, "Igisl"),
|
||||
OP( "igs", BSIM4v6_IGS, IF_REAL, "Igs"),
|
||||
OP( "igd", BSIM4v6_IGD, IF_REAL, "Igd"),
|
||||
OP( "igb", BSIM4v6_IGB, IF_REAL, "Igb"),
|
||||
OP( "igcs", BSIM4v6_IGCS, IF_REAL, "Igcs"),
|
||||
OP( "igcd", BSIM4v6_IGCD, IF_REAL, "Igcd"),
|
||||
OP( "vbs", BSIM4v6_VBS, IF_REAL, "Vbs"),
|
||||
OP( "vgs", BSIM4v6_VGS, IF_REAL, "Vgs"),
|
||||
OP( "vds", BSIM4v6_VDS, IF_REAL, "Vds"),
|
||||
OP( "cgg", BSIM4v6_CGGB, IF_REAL, "Cggb"),
|
||||
OP( "cgs", BSIM4v6_CGSB, IF_REAL, "Cgsb"),
|
||||
OP( "cgd", BSIM4v6_CGDB, IF_REAL, "Cgdb"),
|
||||
OP( "cbg", BSIM4v6_CBGB, IF_REAL, "Cbgb"),
|
||||
OP( "cbd", BSIM4v6_CBDB, IF_REAL, "Cbdb"),
|
||||
OP( "cbs", BSIM4v6_CBSB, IF_REAL, "Cbsb"),
|
||||
OP( "cdg", BSIM4v6_CDGB, IF_REAL, "Cdgb"),
|
||||
OP( "cdd", BSIM4v6_CDDB, IF_REAL, "Cddb"),
|
||||
OP( "cds", BSIM4v6_CDSB, IF_REAL, "Cdsb"),
|
||||
OP( "csg", BSIM4v6_CSGB, IF_REAL, "Csgb"),
|
||||
OP( "csd", BSIM4v6_CSDB, IF_REAL, "Csdb"),
|
||||
OP( "css", BSIM4v6_CSSB, IF_REAL, "Cssb"),
|
||||
OP( "cgb", BSIM4v6_CGBB, IF_REAL, "Cgbb"),
|
||||
OP( "cdb", BSIM4v6_CDBB, IF_REAL, "Cdbb"),
|
||||
OP( "csb", BSIM4v6_CSBB, IF_REAL, "Csbb"),
|
||||
OP( "cbb", BSIM4v6_CBBB, IF_REAL, "Cbbb"),
|
||||
OP( "capbd", BSIM4v6_CAPBD, IF_REAL, "Capbd"),
|
||||
OP( "capbs", BSIM4v6_CAPBS, IF_REAL, "Capbs"),
|
||||
OP( "qg", BSIM4v6_QG, IF_REAL, "Qgate"),
|
||||
OP( "qb", BSIM4v6_QB, IF_REAL, "Qbulk"),
|
||||
OP( "qd", BSIM4v6_QD, IF_REAL, "Qdrain"),
|
||||
OP( "qs", BSIM4v6_QS, IF_REAL, "Qsource"),
|
||||
OP( "qinv", BSIM4v6_QINV, IF_REAL, "Qinversion"),
|
||||
OP( "qdef", BSIM4v6_QDEF, IF_REAL, "Qdef"),
|
||||
OP( "gcrg", BSIM4v6_GCRG, IF_REAL, "Gcrg"),
|
||||
OP( "gtau", BSIM4v6_GTAU, IF_REAL, "Gtau"),
|
||||
};
|
||||
|
||||
IFparm BSIM4v6mPTable[] = { /* model parameters */
|
||||
IOP( "cvchargemod", BSIM4v6_MOD_CVCHARGEMOD, IF_INTEGER, "Capacitance Charge model selector"),
|
||||
IOP( "capmod", BSIM4v6_MOD_CAPMOD, IF_INTEGER, "Capacitance model selector"),
|
||||
IOP( "diomod", BSIM4v6_MOD_DIOMOD, IF_INTEGER, "Diode IV model selector"),
|
||||
IOP( "rdsmod", BSIM4v6_MOD_RDSMOD, IF_INTEGER, "Bias-dependent S/D resistance model selector"),
|
||||
IOP( "trnqsmod", BSIM4v6_MOD_TRNQSMOD, IF_INTEGER, "Transient NQS model selector"),
|
||||
IOP( "acnqsmod", BSIM4v6_MOD_ACNQSMOD, IF_INTEGER, "AC NQS model selector"),
|
||||
IOP( "mobmod", BSIM4v6_MOD_MOBMOD, IF_INTEGER, "Mobility model selector"),
|
||||
IOP( "rbodymod", BSIM4v6_MOD_RBODYMOD, IF_INTEGER, "Distributed body R model selector"),
|
||||
IOP( "rgatemod", BSIM4v6_MOD_RGATEMOD, IF_INTEGER, "Gate R model selector"),
|
||||
IOP( "permod", BSIM4v6_MOD_PERMOD, IF_INTEGER, "Pd and Ps model selector"),
|
||||
IOP( "geomod", BSIM4v6_MOD_GEOMOD, IF_INTEGER, "Geometry dependent parasitics model selector"),
|
||||
IOP( "fnoimod", BSIM4v6_MOD_FNOIMOD, IF_INTEGER, "Flicker noise model selector"),
|
||||
IOP( "tnoimod", BSIM4v6_MOD_TNOIMOD, IF_INTEGER, "Thermal noise model selector"),
|
||||
IOP( "mtrlmod", BSIM4v6_MOD_MTRLMOD, IF_INTEGER, "parameter for non-silicon substrate or metal gate selector"),
|
||||
IOP( "igcmod", BSIM4v6_MOD_IGCMOD, IF_INTEGER, "Gate-to-channel Ig model selector"),
|
||||
IOP( "igbmod", BSIM4v6_MOD_IGBMOD, IF_INTEGER, "Gate-to-body Ig model selector"),
|
||||
IOP( "tempmod", BSIM4v6_MOD_TEMPMOD, IF_INTEGER, "Temperature model selector"),
|
||||
IOP( "paramchk", BSIM4v6_MOD_PARAMCHK, IF_INTEGER, "Model parameter checking selector"),
|
||||
IOP( "binunit", BSIM4v6_MOD_BINUNIT, IF_INTEGER, "Bin unit selector"),
|
||||
IOP( "version", BSIM4v6_MOD_VERSION, IF_STRING, "parameter for model version"),
|
||||
IOP( "eot", BSIM4v6_MOD_EOT, IF_REAL, "Equivalent gate oxide thickness in meters"),
|
||||
IOP( "vddeot", BSIM4v6_MOD_VDDEOT, IF_REAL, "Voltage for extraction of Equivalent gate oxide thickness"),
|
||||
IOP( "tempeot", BSIM4v6_MOD_TEMPEOT, IF_REAL, " Temperature for extraction of EOT"),
|
||||
IOP( "leffeot", BSIM4v6_MOD_LEFFEOT, IF_REAL, " Effective length for extraction of EOT"),
|
||||
IOP( "weffeot", BSIM4v6_MOD_WEFFEOT, IF_REAL, "Effective width for extraction of EOT"),
|
||||
IOP( "ados", BSIM4v6_MOD_ADOS, IF_REAL, "Charge centroid parameter"),
|
||||
IOP( "bdos", BSIM4v6_MOD_BDOS, IF_REAL, "Charge centroid parameter"),
|
||||
IOP( "toxe", BSIM4v6_MOD_TOXE, IF_REAL, "Electrical gate oxide thickness in meters"),
|
||||
IOP( "toxp", BSIM4v6_MOD_TOXP, IF_REAL, "Physical gate oxide thickness in meters"),
|
||||
IOP( "toxm", BSIM4v6_MOD_TOXM, IF_REAL, "Gate oxide thickness at which parameters are extracted"),
|
||||
IOP( "toxref", BSIM4v6_MOD_TOXREF, IF_REAL, "Target tox value"),
|
||||
IOP( "dtox", BSIM4v6_MOD_DTOX, IF_REAL, "Defined as (toxe - toxp) "),
|
||||
IOP( "epsrox", BSIM4v6_MOD_EPSROX, IF_REAL, "Dielectric constant of the gate oxide relative to vacuum"),
|
||||
IOP( "cdsc", BSIM4v6_MOD_CDSC, IF_REAL, "Drain/Source and channel coupling capacitance"),
|
||||
IOP( "cdscb", BSIM4v6_MOD_CDSCB, IF_REAL, "Body-bias dependence of cdsc"),
|
||||
IOP( "cdscd", BSIM4v6_MOD_CDSCD, IF_REAL, "Drain-bias dependence of cdsc"),
|
||||
IOP( "cit", BSIM4v6_MOD_CIT, IF_REAL, "Interface state capacitance"),
|
||||
IOP( "nfactor", BSIM4v6_MOD_NFACTOR, IF_REAL, "Subthreshold swing Coefficient"),
|
||||
IOP( "xj", BSIM4v6_MOD_XJ, IF_REAL, "Junction depth in meters"),
|
||||
IOP( "vsat", BSIM4v6_MOD_VSAT, IF_REAL, "Saturation velocity at tnom"),
|
||||
IOP( "at", BSIM4v6_MOD_AT, IF_REAL, "Temperature coefficient of vsat"),
|
||||
IOP( "a0", BSIM4v6_MOD_A0, IF_REAL, "Non-uniform depletion width effect coefficient."),
|
||||
IOP( "ags", BSIM4v6_MOD_AGS, IF_REAL, "Gate bias coefficient of Abulk."),
|
||||
IOP( "a1", BSIM4v6_MOD_A1, IF_REAL, "Non-saturation effect coefficient"),
|
||||
IOP( "a2", BSIM4v6_MOD_A2, IF_REAL, "Non-saturation effect coefficient"),
|
||||
IOP( "keta", BSIM4v6_MOD_KETA, IF_REAL, "Body-bias coefficient of non-uniform depletion width effect."),
|
||||
IOP( "phig", BSIM4v6_MOD_PHIG, IF_REAL, "Work function of gate"),
|
||||
IOP( "epsrgate", BSIM4v6_MOD_EPSRGATE, IF_REAL, "Dielectric constant of gate relative to vacuum"),
|
||||
IOP( "easub",BSIM4v6_MOD_EASUB, IF_REAL, "Electron affinity of substrate"),
|
||||
IOP( "epsrsub", BSIM4v6_MOD_EPSRSUB, IF_REAL, "Dielectric constant of substrate relative to vacuum"),
|
||||
IOP( "ni0sub", BSIM4v6_MOD_NI0SUB, IF_REAL, "Intrinsic carrier concentration of substrate at 300.15K"),
|
||||
IOP( "bg0sub", BSIM4v6_MOD_BG0SUB, IF_REAL, "Band-gap of substrate at T=0K"),
|
||||
IOP( "tbgasub", BSIM4v6_MOD_TBGASUB, IF_REAL, "First parameter of band-gap change due to temperature"),
|
||||
IOP( "tbgbsub", BSIM4v6_MOD_TBGBSUB, IF_REAL, "Second parameter of band-gap change due to temperature"),
|
||||
IOP( "nsub", BSIM4v6_MOD_NSUB, IF_REAL, "Substrate doping concentration"),
|
||||
IOP( "ndep", BSIM4v6_MOD_NDEP, IF_REAL, "Channel doping concentration at the depletion edge"),
|
||||
IOP( "nsd", BSIM4v6_MOD_NSD, IF_REAL, "S/D doping concentration"),
|
||||
IOP( "phin", BSIM4v6_MOD_PHIN, IF_REAL, "Adjusting parameter for surface potential due to non-uniform vertical doping"),
|
||||
IOP( "ngate", BSIM4v6_MOD_NGATE, IF_REAL, "Poly-gate doping concentration"),
|
||||
IOP( "gamma1", BSIM4v6_MOD_GAMMA1, IF_REAL, "Vth body coefficient"),
|
||||
IOP( "gamma2", BSIM4v6_MOD_GAMMA2, IF_REAL, "Vth body coefficient"),
|
||||
IOP( "vbx", BSIM4v6_MOD_VBX, IF_REAL, "Vth transition body Voltage"),
|
||||
IOP( "vbm", BSIM4v6_MOD_VBM, IF_REAL, "Maximum body voltage"),
|
||||
|
||||
IOP( "xt", BSIM4v6_MOD_XT, IF_REAL, "Doping depth"),
|
||||
IOP( "k1", BSIM4v6_MOD_K1, IF_REAL, "Bulk effect coefficient 1"),
|
||||
IOP( "kt1", BSIM4v6_MOD_KT1, IF_REAL, "Temperature coefficient of Vth"),
|
||||
IOP( "kt1l", BSIM4v6_MOD_KT1L, IF_REAL, "Temperature coefficient of Vth"),
|
||||
IOP( "kt2", BSIM4v6_MOD_KT2, IF_REAL, "Body-coefficient of kt1"),
|
||||
IOP( "k2", BSIM4v6_MOD_K2, IF_REAL, "Bulk effect coefficient 2"),
|
||||
IOP( "k3", BSIM4v6_MOD_K3, IF_REAL, "Narrow width effect coefficient"),
|
||||
IOP( "k3b", BSIM4v6_MOD_K3B, IF_REAL, "Body effect coefficient of k3"),
|
||||
IOP( "w0", BSIM4v6_MOD_W0, IF_REAL, "Narrow width effect parameter"),
|
||||
IOP( "dvtp0", BSIM4v6_MOD_DVTP0, IF_REAL, "First parameter for Vth shift due to pocket"),
|
||||
IOP( "dvtp1", BSIM4v6_MOD_DVTP1, IF_REAL, "Second parameter for Vth shift due to pocket"),
|
||||
IOP( "lpe0", BSIM4v6_MOD_LPE0, IF_REAL, "Equivalent length of pocket region at zero bias"),
|
||||
IOP( "lpeb", BSIM4v6_MOD_LPEB, IF_REAL, "Equivalent length of pocket region accounting for body bias"),
|
||||
IOP( "dvt0", BSIM4v6_MOD_DVT0, IF_REAL, "Short channel effect coeff. 0"),
|
||||
IOP( "dvt1", BSIM4v6_MOD_DVT1, IF_REAL, "Short channel effect coeff. 1"),
|
||||
IOP( "dvt2", BSIM4v6_MOD_DVT2, IF_REAL, "Short channel effect coeff. 2"),
|
||||
IOP( "dvt0w", BSIM4v6_MOD_DVT0W, IF_REAL, "Narrow Width coeff. 0"),
|
||||
IOP( "dvt1w", BSIM4v6_MOD_DVT1W, IF_REAL, "Narrow Width effect coeff. 1"),
|
||||
IOP( "dvt2w", BSIM4v6_MOD_DVT2W, IF_REAL, "Narrow Width effect coeff. 2"),
|
||||
IOP( "drout", BSIM4v6_MOD_DROUT, IF_REAL, "DIBL coefficient of output resistance"),
|
||||
IOP( "dsub", BSIM4v6_MOD_DSUB, IF_REAL, "DIBL coefficient in the subthreshold region"),
|
||||
IOP( "vth0", BSIM4v6_MOD_VTH0, IF_REAL,"Threshold voltage"),
|
||||
IOP( "vtho", BSIM4v6_MOD_VTH0, IF_REAL,"Threshold voltage"),
|
||||
IOP( "ua", BSIM4v6_MOD_UA, IF_REAL, "Linear gate dependence of mobility"),
|
||||
IOP( "ua1", BSIM4v6_MOD_UA1, IF_REAL, "Temperature coefficient of ua"),
|
||||
IOP( "ub", BSIM4v6_MOD_UB, IF_REAL, "Quadratic gate dependence of mobility"),
|
||||
IOP( "ub1", BSIM4v6_MOD_UB1, IF_REAL, "Temperature coefficient of ub"),
|
||||
IOP( "uc", BSIM4v6_MOD_UC, IF_REAL, "Body-bias dependence of mobility"),
|
||||
IOP( "uc1", BSIM4v6_MOD_UC1, IF_REAL, "Temperature coefficient of uc"),
|
||||
IOP( "ud", BSIM4v6_MOD_UD, IF_REAL, "Coulomb scattering factor of mobility"),
|
||||
IOP( "ud1", BSIM4v6_MOD_UD1, IF_REAL, "Temperature coefficient of ud"),
|
||||
IOP( "up", BSIM4v6_MOD_UP, IF_REAL, "Channel length linear factor of mobility"),
|
||||
IOP( "lp", BSIM4v6_MOD_LP, IF_REAL, "Channel length exponential factor of mobility"),
|
||||
IOP( "u0", BSIM4v6_MOD_U0, IF_REAL, "Low-field mobility at Tnom"),
|
||||
IOP( "eu", BSIM4v6_MOD_EU, IF_REAL, "Mobility exponent"),
|
||||
IOP( "ucs", BSIM4v6_MOD_UCS, IF_REAL, "Colombic scattering exponent"),
|
||||
IOP( "ute", BSIM4v6_MOD_UTE, IF_REAL, "Temperature coefficient of mobility"),
|
||||
IOP( "ucste", BSIM4v6_MOD_UCSTE, IF_REAL,"Temperature coefficient of colombic mobility"),
|
||||
IOP( "voff", BSIM4v6_MOD_VOFF, IF_REAL, "Threshold voltage offset"),
|
||||
IOP( "minv", BSIM4v6_MOD_MINV, IF_REAL, "Fitting parameter for moderate inversion in Vgsteff"),
|
||||
IOP( "minvcv", BSIM4v6_MOD_MINVCV, IF_REAL, "Fitting parameter for moderate inversion in Vgsteffcv"),
|
||||
IOP( "voffl", BSIM4v6_MOD_VOFFL, IF_REAL, "Length dependence parameter for Vth offset"),
|
||||
IOP( "voffcvl", BSIM4v6_MOD_VOFFCVL, IF_REAL, "Length dependence parameter for Vth offset in CV"),
|
||||
IOP( "tnom", BSIM4v6_MOD_TNOM, IF_REAL, "Parameter measurement temperature"),
|
||||
IOP( "cgso", BSIM4v6_MOD_CGSO, IF_REAL, "Gate-source overlap capacitance per width"),
|
||||
IOP( "cgdo", BSIM4v6_MOD_CGDO, IF_REAL, "Gate-drain overlap capacitance per width"),
|
||||
IOP( "cgbo", BSIM4v6_MOD_CGBO, IF_REAL, "Gate-bulk overlap capacitance per length"),
|
||||
IOP( "xpart", BSIM4v6_MOD_XPART, IF_REAL, "Channel charge partitioning"),
|
||||
IOP( "delta", BSIM4v6_MOD_DELTA, IF_REAL, "Effective Vds parameter"),
|
||||
IOP( "rsh", BSIM4v6_MOD_RSH, IF_REAL, "Source-drain sheet resistance"),
|
||||
IOP( "rdsw", BSIM4v6_MOD_RDSW, IF_REAL, "Source-drain resistance per width"),
|
||||
IOP( "rdswmin", BSIM4v6_MOD_RDSWMIN, IF_REAL, "Source-drain resistance per width at high Vg"),
|
||||
IOP( "rsw", BSIM4v6_MOD_RSW, IF_REAL, "Source resistance per width"),
|
||||
IOP( "rdw", BSIM4v6_MOD_RDW, IF_REAL, "Drain resistance per width"),
|
||||
IOP( "rdwmin", BSIM4v6_MOD_RDWMIN, IF_REAL, "Drain resistance per width at high Vg"),
|
||||
IOP( "rswmin", BSIM4v6_MOD_RSWMIN, IF_REAL, "Source resistance per width at high Vg"),
|
||||
|
||||
IOP( "prwg", BSIM4v6_MOD_PRWG, IF_REAL, "Gate-bias effect on parasitic resistance "),
|
||||
IOP( "prwb", BSIM4v6_MOD_PRWB, IF_REAL, "Body-effect on parasitic resistance "),
|
||||
|
||||
IOP( "prt", BSIM4v6_MOD_PRT, IF_REAL, "Temperature coefficient of parasitic resistance "),
|
||||
IOP( "eta0", BSIM4v6_MOD_ETA0, IF_REAL, "Subthreshold region DIBL coefficient"),
|
||||
IOP( "etab", BSIM4v6_MOD_ETAB, IF_REAL, "Subthreshold region DIBL coefficient"),
|
||||
IOP( "pclm", BSIM4v6_MOD_PCLM, IF_REAL, "Channel length modulation Coefficient"),
|
||||
IOP( "pdiblc1", BSIM4v6_MOD_PDIBL1, IF_REAL, "Drain-induced barrier lowering coefficient"),
|
||||
IOP( "pdiblc2", BSIM4v6_MOD_PDIBL2, IF_REAL, "Drain-induced barrier lowering coefficient"),
|
||||
IOP( "pdiblcb", BSIM4v6_MOD_PDIBLB, IF_REAL, "Body-effect on drain-induced barrier lowering"),
|
||||
IOP( "fprout", BSIM4v6_MOD_FPROUT, IF_REAL, "Rout degradation coefficient for pocket devices"),
|
||||
IOP( "pdits", BSIM4v6_MOD_PDITS, IF_REAL, "Coefficient for drain-induced Vth shifts"),
|
||||
IOP( "pditsl", BSIM4v6_MOD_PDITSL, IF_REAL, "Length dependence of drain-induced Vth shifts"),
|
||||
IOP( "pditsd", BSIM4v6_MOD_PDITSD, IF_REAL, "Vds dependence of drain-induced Vth shifts"),
|
||||
IOP( "pscbe1", BSIM4v6_MOD_PSCBE1, IF_REAL, "Substrate current body-effect coefficient"),
|
||||
IOP( "pscbe2", BSIM4v6_MOD_PSCBE2, IF_REAL, "Substrate current body-effect coefficient"),
|
||||
IOP( "pvag", BSIM4v6_MOD_PVAG, IF_REAL, "Gate dependence of output resistance parameter"),
|
||||
|
||||
IOP( "jss", BSIM4v6_MOD_JSS, IF_REAL, "Bottom source junction reverse saturation current density"),
|
||||
IOP( "jsws", BSIM4v6_MOD_JSWS, IF_REAL, "Isolation edge sidewall source junction reverse saturation current density"),
|
||||
IOP( "jswgs", BSIM4v6_MOD_JSWGS, IF_REAL, "Gate edge source junction reverse saturation current density"),
|
||||
IOP( "pbs", BSIM4v6_MOD_PBS, IF_REAL, "Source junction built-in potential"),
|
||||
IOP( "njs", BSIM4v6_MOD_NJS, IF_REAL, "Source junction emission coefficient"),
|
||||
IOP( "xtis", BSIM4v6_MOD_XTIS, IF_REAL, "Source junction current temperature exponent"),
|
||||
IOP( "mjs", BSIM4v6_MOD_MJS, IF_REAL, "Source bottom junction capacitance grading coefficient"),
|
||||
IOP( "pbsws", BSIM4v6_MOD_PBSWS, IF_REAL, "Source sidewall junction capacitance built in potential"),
|
||||
IOP( "mjsws", BSIM4v6_MOD_MJSWS, IF_REAL, "Source sidewall junction capacitance grading coefficient"),
|
||||
IOP( "pbswgs", BSIM4v6_MOD_PBSWGS, IF_REAL, "Source (gate side) sidewall junction capacitance built in potential"),
|
||||
IOP( "mjswgs", BSIM4v6_MOD_MJSWGS, IF_REAL, "Source (gate side) sidewall junction capacitance grading coefficient"),
|
||||
IOP( "cjs", BSIM4v6_MOD_CJS, IF_REAL, "Source bottom junction capacitance per unit area"),
|
||||
IOP( "cjsws", BSIM4v6_MOD_CJSWS, IF_REAL, "Source sidewall junction capacitance per unit periphery"),
|
||||
IOP( "cjswgs", BSIM4v6_MOD_CJSWGS, IF_REAL, "Source (gate side) sidewall junction capacitance per unit width"),
|
||||
|
||||
IOP( "jsd", BSIM4v6_MOD_JSD, IF_REAL, "Bottom drain junction reverse saturation current density"),
|
||||
IOP( "jswd", BSIM4v6_MOD_JSWD, IF_REAL, "Isolation edge sidewall drain junction reverse saturation current density"),
|
||||
IOP( "jswgd", BSIM4v6_MOD_JSWGD, IF_REAL, "Gate edge drain junction reverse saturation current density"),
|
||||
IOP( "pbd", BSIM4v6_MOD_PBD, IF_REAL, "Drain junction built-in potential"),
|
||||
IOP( "njd", BSIM4v6_MOD_NJD, IF_REAL, "Drain junction emission coefficient"),
|
||||
IOP( "xtid", BSIM4v6_MOD_XTID, IF_REAL, "Drainjunction current temperature exponent"),
|
||||
IOP( "mjd", BSIM4v6_MOD_MJD, IF_REAL, "Drain bottom junction capacitance grading coefficient"),
|
||||
IOP( "pbswd", BSIM4v6_MOD_PBSWD, IF_REAL, "Drain sidewall junction capacitance built in potential"),
|
||||
IOP( "mjswd", BSIM4v6_MOD_MJSWD, IF_REAL, "Drain sidewall junction capacitance grading coefficient"),
|
||||
IOP( "pbswgd", BSIM4v6_MOD_PBSWGD, IF_REAL, "Drain (gate side) sidewall junction capacitance built in potential"),
|
||||
IOP( "mjswgd", BSIM4v6_MOD_MJSWGD, IF_REAL, "Drain (gate side) sidewall junction capacitance grading coefficient"),
|
||||
IOP( "cjd", BSIM4v6_MOD_CJD, IF_REAL, "Drain bottom junction capacitance per unit area"),
|
||||
IOP( "cjswd", BSIM4v6_MOD_CJSWD, IF_REAL, "Drain sidewall junction capacitance per unit periphery"),
|
||||
IOP( "cjswgd", BSIM4v6_MOD_CJSWGD, IF_REAL, "Drain (gate side) sidewall junction capacitance per unit width"),
|
||||
|
||||
IOP( "vfbcv", BSIM4v6_MOD_VFBCV, IF_REAL, "Flat Band Voltage parameter for capmod=0 only"),
|
||||
IOP( "vfb", BSIM4v6_MOD_VFB, IF_REAL, "Flat Band Voltage"),
|
||||
IOP( "tpb", BSIM4v6_MOD_TPB, IF_REAL, "Temperature coefficient of pb"),
|
||||
IOP( "tcj", BSIM4v6_MOD_TCJ, IF_REAL, "Temperature coefficient of cj"),
|
||||
IOP( "tpbsw", BSIM4v6_MOD_TPBSW, IF_REAL, "Temperature coefficient of pbsw"),
|
||||
IOP( "tcjsw", BSIM4v6_MOD_TCJSW, IF_REAL, "Temperature coefficient of cjsw"),
|
||||
IOP( "tpbswg", BSIM4v6_MOD_TPBSWG, IF_REAL, "Temperature coefficient of pbswg"),
|
||||
IOP( "tcjswg", BSIM4v6_MOD_TCJSWG, IF_REAL, "Temperature coefficient of cjswg"),
|
||||
IOP( "acde", BSIM4v6_MOD_ACDE, IF_REAL, "Exponential coefficient for finite charge thickness"),
|
||||
IOP( "moin", BSIM4v6_MOD_MOIN, IF_REAL, "Coefficient for gate-bias dependent surface potential"),
|
||||
IOP( "noff", BSIM4v6_MOD_NOFF, IF_REAL, "C-V turn-on/off parameter"),
|
||||
IOP( "voffcv", BSIM4v6_MOD_VOFFCV, IF_REAL, "C-V lateral-shift parameter"),
|
||||
IOP( "dmcg", BSIM4v6_MOD_DMCG, IF_REAL, "Distance of Mid-Contact to Gate edge"),
|
||||
IOP( "dmci", BSIM4v6_MOD_DMCI, IF_REAL, "Distance of Mid-Contact to Isolation"),
|
||||
IOP( "dmdg", BSIM4v6_MOD_DMDG, IF_REAL, "Distance of Mid-Diffusion to Gate edge"),
|
||||
IOP( "dmcgt", BSIM4v6_MOD_DMCGT, IF_REAL, "Distance of Mid-Contact to Gate edge in Test structures"),
|
||||
IOP( "xgw", BSIM4v6_MOD_XGW, IF_REAL, "Distance from gate contact center to device edge"),
|
||||
IOP( "xgl", BSIM4v6_MOD_XGL, IF_REAL, "Variation in Ldrawn"),
|
||||
IOP( "rshg", BSIM4v6_MOD_RSHG, IF_REAL, "Gate sheet resistance"),
|
||||
IOP( "ngcon", BSIM4v6_MOD_NGCON, IF_REAL, "Number of gate contacts"),
|
||||
IOP( "xrcrg1", BSIM4v6_MOD_XRCRG1, IF_REAL, "First fitting parameter the bias-dependent Rg"),
|
||||
IOP( "xrcrg2", BSIM4v6_MOD_XRCRG2, IF_REAL, "Second fitting parameter the bias-dependent Rg"),
|
||||
IOP( "lambda", BSIM4v6_MOD_LAMBDA, IF_REAL, " Velocity overshoot parameter"),
|
||||
IOP( "vtl", BSIM4v6_MOD_VTL, IF_REAL, " thermal velocity"),
|
||||
IOP( "lc", BSIM4v6_MOD_LC, IF_REAL, " back scattering parameter"),
|
||||
IOP( "xn", BSIM4v6_MOD_XN, IF_REAL, " back scattering parameter"),
|
||||
IOP( "vfbsdoff", BSIM4v6_MOD_VFBSDOFF, IF_REAL, "S/D flatband voltage offset"),
|
||||
IOP( "tvfbsdoff", BSIM4v6_MOD_TVFBSDOFF, IF_REAL, "Temperature parameter for vfbsdoff"),
|
||||
IOP( "tvoff", BSIM4v6_MOD_TVOFF, IF_REAL, "Temperature parameter for voff"),
|
||||
|
||||
IOP( "lintnoi", BSIM4v6_MOD_LINTNOI, IF_REAL, "lint offset for noise calculation"),
|
||||
IOP( "lint", BSIM4v6_MOD_LINT, IF_REAL, "Length reduction parameter"),
|
||||
IOP( "ll", BSIM4v6_MOD_LL, IF_REAL, "Length reduction parameter"),
|
||||
IOP( "llc", BSIM4v6_MOD_LLC, IF_REAL, "Length reduction parameter for CV"),
|
||||
IOP( "lln", BSIM4v6_MOD_LLN, IF_REAL, "Length reduction parameter"),
|
||||
IOP( "lw", BSIM4v6_MOD_LW, IF_REAL, "Length reduction parameter"),
|
||||
IOP( "lwc", BSIM4v6_MOD_LWC, IF_REAL, "Length reduction parameter for CV"),
|
||||
IOP( "lwn", BSIM4v6_MOD_LWN, IF_REAL, "Length reduction parameter"),
|
||||
IOP( "lwl", BSIM4v6_MOD_LWL, IF_REAL, "Length reduction parameter"),
|
||||
IOP( "lwlc", BSIM4v6_MOD_LWLC, IF_REAL, "Length reduction parameter for CV"),
|
||||
IOP( "lmin", BSIM4v6_MOD_LMIN, IF_REAL, "Minimum length for the model"),
|
||||
IOP( "lmax", BSIM4v6_MOD_LMAX, IF_REAL, "Maximum length for the model"),
|
||||
|
||||
IOP( "wr", BSIM4v6_MOD_WR, IF_REAL, "Width dependence of rds"),
|
||||
IOP( "wint", BSIM4v6_MOD_WINT, IF_REAL, "Width reduction parameter"),
|
||||
IOP( "dwg", BSIM4v6_MOD_DWG, IF_REAL, "Width reduction parameter"),
|
||||
IOP( "dwb", BSIM4v6_MOD_DWB, IF_REAL, "Width reduction parameter"),
|
||||
|
||||
IOP( "wl", BSIM4v6_MOD_WL, IF_REAL, "Width reduction parameter"),
|
||||
IOP( "wlc", BSIM4v6_MOD_WLC, IF_REAL, "Width reduction parameter for CV"),
|
||||
IOP( "wln", BSIM4v6_MOD_WLN, IF_REAL, "Width reduction parameter"),
|
||||
IOP( "ww", BSIM4v6_MOD_WW, IF_REAL, "Width reduction parameter"),
|
||||
IOP( "wwc", BSIM4v6_MOD_WWC, IF_REAL, "Width reduction parameter for CV"),
|
||||
IOP( "wwn", BSIM4v6_MOD_WWN, IF_REAL, "Width reduction parameter"),
|
||||
IOP( "wwl", BSIM4v6_MOD_WWL, IF_REAL, "Width reduction parameter"),
|
||||
IOP( "wwlc", BSIM4v6_MOD_WWLC, IF_REAL, "Width reduction parameter for CV"),
|
||||
IOP( "wmin", BSIM4v6_MOD_WMIN, IF_REAL, "Minimum width for the model"),
|
||||
IOP( "wmax", BSIM4v6_MOD_WMAX, IF_REAL, "Maximum width for the model"),
|
||||
|
||||
IOP( "b0", BSIM4v6_MOD_B0, IF_REAL, "Abulk narrow width parameter"),
|
||||
IOP( "b1", BSIM4v6_MOD_B1, IF_REAL, "Abulk narrow width parameter"),
|
||||
|
||||
IOP( "cgsl", BSIM4v6_MOD_CGSL, IF_REAL, "New C-V model parameter"),
|
||||
IOP( "cgdl", BSIM4v6_MOD_CGDL, IF_REAL, "New C-V model parameter"),
|
||||
IOP( "ckappas", BSIM4v6_MOD_CKAPPAS, IF_REAL, "S/G overlap C-V parameter "),
|
||||
IOP( "ckappad", BSIM4v6_MOD_CKAPPAD, IF_REAL, "D/G overlap C-V parameter"),
|
||||
IOP( "cf", BSIM4v6_MOD_CF, IF_REAL, "Fringe capacitance parameter"),
|
||||
IOP( "clc", BSIM4v6_MOD_CLC, IF_REAL, "Vdsat parameter for C-V model"),
|
||||
IOP( "cle", BSIM4v6_MOD_CLE, IF_REAL, "Vdsat parameter for C-V model"),
|
||||
IOP( "dwc", BSIM4v6_MOD_DWC, IF_REAL, "Delta W for C-V model"),
|
||||
IOP( "dlc", BSIM4v6_MOD_DLC, IF_REAL, "Delta L for C-V model"),
|
||||
IOP( "xw", BSIM4v6_MOD_XW, IF_REAL, "W offset for channel width due to mask/etch effect"),
|
||||
IOP( "xl", BSIM4v6_MOD_XL, IF_REAL, "L offset for channel length due to mask/etch effect"),
|
||||
IOP( "dlcig", BSIM4v6_MOD_DLCIG, IF_REAL, "Delta L for Ig model"),
|
||||
IOP( "dlcigd", BSIM4v6_MOD_DLCIGD, IF_REAL, "Delta L for Ig model drain side"),
|
||||
IOP( "dwj", BSIM4v6_MOD_DWJ, IF_REAL, "Delta W for S/D junctions"),
|
||||
|
||||
IOP( "alpha0", BSIM4v6_MOD_ALPHA0, IF_REAL, "substrate current model parameter"),
|
||||
IOP( "alpha1", BSIM4v6_MOD_ALPHA1, IF_REAL, "substrate current model parameter"),
|
||||
IOP( "beta0", BSIM4v6_MOD_BETA0, IF_REAL, "substrate current model parameter"),
|
||||
|
||||
IOP( "agidl", BSIM4v6_MOD_AGIDL, IF_REAL, "Pre-exponential constant for GIDL"),
|
||||
IOP( "bgidl", BSIM4v6_MOD_BGIDL, IF_REAL, "Exponential constant for GIDL"),
|
||||
IOP( "cgidl", BSIM4v6_MOD_CGIDL, IF_REAL, "Parameter for body-bias dependence of GIDL"),
|
||||
IOP( "egidl", BSIM4v6_MOD_EGIDL, IF_REAL, "Fitting parameter for Bandbending"),
|
||||
IOP( "agisl", BSIM4v6_MOD_AGISL, IF_REAL, "Pre-exponential constant for GISL"),
|
||||
IOP( "bgisl", BSIM4v6_MOD_BGISL, IF_REAL, "Exponential constant for GISL"),
|
||||
IOP( "cgisl", BSIM4v6_MOD_CGISL, IF_REAL, "Parameter for body-bias dependence of GISL"),
|
||||
IOP( "egisl", BSIM4v6_MOD_EGISL, IF_REAL, "Fitting parameter for Bandbending"),
|
||||
IOP( "aigc", BSIM4v6_MOD_AIGC, IF_REAL, "Parameter for Igc"),
|
||||
IOP( "bigc", BSIM4v6_MOD_BIGC, IF_REAL, "Parameter for Igc"),
|
||||
IOP( "cigc", BSIM4v6_MOD_CIGC, IF_REAL, "Parameter for Igc"),
|
||||
IOP( "aigsd", BSIM4v6_MOD_AIGSD, IF_REAL, "Parameter for Igs,d"),
|
||||
IOP( "bigsd", BSIM4v6_MOD_BIGSD, IF_REAL, "Parameter for Igs,d"),
|
||||
IOP( "cigsd", BSIM4v6_MOD_CIGSD, IF_REAL, "Parameter for Igs,d"),
|
||||
IOP( "aigs", BSIM4v6_MOD_AIGS, IF_REAL, "Parameter for Igs"),
|
||||
IOP( "bigs", BSIM4v6_MOD_BIGS, IF_REAL, "Parameter for Igs"),
|
||||
IOP( "cigs", BSIM4v6_MOD_CIGS, IF_REAL, "Parameter for Igs"),
|
||||
IOP( "aigd", BSIM4v6_MOD_AIGD, IF_REAL, "Parameter for Igd"),
|
||||
IOP( "bigd", BSIM4v6_MOD_BIGD, IF_REAL, "Parameter for Igd"),
|
||||
IOP( "cigd", BSIM4v6_MOD_CIGD, IF_REAL, "Parameter for Igd"),
|
||||
IOP( "aigbacc", BSIM4v6_MOD_AIGBACC, IF_REAL, "Parameter for Igb"),
|
||||
IOP( "bigbacc", BSIM4v6_MOD_BIGBACC, IF_REAL, "Parameter for Igb"),
|
||||
IOP( "cigbacc", BSIM4v6_MOD_CIGBACC, IF_REAL, "Parameter for Igb"),
|
||||
IOP( "aigbinv", BSIM4v6_MOD_AIGBINV, IF_REAL, "Parameter for Igb"),
|
||||
IOP( "bigbinv", BSIM4v6_MOD_BIGBINV, IF_REAL, "Parameter for Igb"),
|
||||
IOP( "cigbinv", BSIM4v6_MOD_CIGBINV, IF_REAL, "Parameter for Igb"),
|
||||
IOP( "nigc", BSIM4v6_MOD_NIGC, IF_REAL, "Parameter for Igc slope"),
|
||||
IOP( "nigbinv", BSIM4v6_MOD_NIGBINV, IF_REAL, "Parameter for Igbinv slope"),
|
||||
IOP( "nigbacc", BSIM4v6_MOD_NIGBACC, IF_REAL, "Parameter for Igbacc slope"),
|
||||
IOP( "ntox", BSIM4v6_MOD_NTOX, IF_REAL, "Exponent for Tox ratio"),
|
||||
IOP( "eigbinv", BSIM4v6_MOD_EIGBINV, IF_REAL, "Parameter for the Si bandgap for Igbinv"),
|
||||
IOP( "pigcd", BSIM4v6_MOD_PIGCD, IF_REAL, "Parameter for Igc partition"),
|
||||
IOP( "poxedge", BSIM4v6_MOD_POXEDGE, IF_REAL, "Factor for the gate edge Tox"),
|
||||
|
||||
IOP( "ijthdfwd", BSIM4v6_MOD_IJTHDFWD, IF_REAL, "Forward drain diode forward limiting current"),
|
||||
IOP( "ijthsfwd", BSIM4v6_MOD_IJTHSFWD, IF_REAL, "Forward source diode forward limiting current"),
|
||||
IOP( "ijthdrev", BSIM4v6_MOD_IJTHDREV, IF_REAL, "Reverse drain diode forward limiting current"),
|
||||
IOP( "ijthsrev", BSIM4v6_MOD_IJTHSREV, IF_REAL, "Reverse source diode forward limiting current"),
|
||||
IOP( "xjbvd", BSIM4v6_MOD_XJBVD, IF_REAL, "Fitting parameter for drain diode breakdown current"),
|
||||
IOP( "xjbvs", BSIM4v6_MOD_XJBVS, IF_REAL, "Fitting parameter for source diode breakdown current"),
|
||||
IOP( "bvd", BSIM4v6_MOD_BVD, IF_REAL, "Drain diode breakdown voltage"),
|
||||
IOP( "bvs", BSIM4v6_MOD_BVS, IF_REAL, "Source diode breakdown voltage"),
|
||||
|
||||
IOP( "jtss", BSIM4v6_MOD_JTSS, IF_REAL, "Source bottom trap-assisted saturation current density"),
|
||||
IOP( "jtsd", BSIM4v6_MOD_JTSD, IF_REAL, "Drain bottom trap-assisted saturation current density"),
|
||||
IOP( "jtssws", BSIM4v6_MOD_JTSSWS, IF_REAL, "Source STI sidewall trap-assisted saturation current density"),
|
||||
IOP( "jtsswd", BSIM4v6_MOD_JTSSWD, IF_REAL, "Drain STI sidewall trap-assisted saturation current density"),
|
||||
IOP( "jtsswgs", BSIM4v6_MOD_JTSSWGS, IF_REAL, "Source gate-edge sidewall trap-assisted saturation current density"),
|
||||
IOP( "jtsswgd", BSIM4v6_MOD_JTSSWGD, IF_REAL, "Drain gate-edge sidewall trap-assisted saturation current density"),
|
||||
IOP( "jtweff", BSIM4v6_MOD_JTWEFF, IF_REAL, "TAT current width dependance"),
|
||||
IOP( "njts", BSIM4v6_MOD_NJTS, IF_REAL, "Non-ideality factor for bottom junction"),
|
||||
IOP( "njtssw", BSIM4v6_MOD_NJTSSW, IF_REAL, "Non-ideality factor for STI sidewall junction"),
|
||||
IOP( "njtsswg", BSIM4v6_MOD_NJTSSWG, IF_REAL, "Non-ideality factor for gate-edge sidewall junction"),
|
||||
IOP( "njtsd", BSIM4v6_MOD_NJTSD, IF_REAL, "Non-ideality factor for bottom junction drain side"),
|
||||
IOP( "njtsswd", BSIM4v6_MOD_NJTSSWD, IF_REAL, "Non-ideality factor for STI sidewall junction drain side"),
|
||||
IOP( "njtsswgd", BSIM4v6_MOD_NJTSSWGD, IF_REAL, "Non-ideality factor for gate-edge sidewall junction drain side"),
|
||||
IOP( "xtss", BSIM4v6_MOD_XTSS, IF_REAL, "Power dependence of JTSS on temperature"),
|
||||
IOP( "xtsd", BSIM4v6_MOD_XTSD, IF_REAL, "Power dependence of JTSD on temperature"),
|
||||
IOP( "xtssws", BSIM4v6_MOD_XTSSWS, IF_REAL, "Power dependence of JTSSWS on temperature"),
|
||||
IOP( "xtsswd", BSIM4v6_MOD_XTSSWD, IF_REAL, "Power dependence of JTSSWD on temperature"),
|
||||
IOP( "xtsswgs", BSIM4v6_MOD_XTSSWGS, IF_REAL, "Power dependence of JTSSWGS on temperature"),
|
||||
IOP( "xtsswgd", BSIM4v6_MOD_XTSSWGD, IF_REAL, "Power dependence of JTSSWGD on temperature"),
|
||||
IOP( "tnjts", BSIM4v6_MOD_TNJTS, IF_REAL, "Temperature coefficient for NJTS"),
|
||||
IOP( "tnjtssw", BSIM4v6_MOD_TNJTSSW, IF_REAL, "Temperature coefficient for NJTSSW"),
|
||||
IOP( "tnjtsswg", BSIM4v6_MOD_TNJTSSWG, IF_REAL, "Temperature coefficient for NJTSSWG"),
|
||||
IOP( "tnjtsd", BSIM4v6_MOD_TNJTSD, IF_REAL, "Temperature coefficient for NJTSD"),
|
||||
IOP( "tnjtsswd", BSIM4v6_MOD_TNJTSSWD, IF_REAL, "Temperature coefficient for NJTSSWD"),
|
||||
IOP( "tnjtsswgd", BSIM4v6_MOD_TNJTSSWGD, IF_REAL, "Temperature coefficient for NJTSSWGD"),
|
||||
IOP( "vtss", BSIM4v6_MOD_VTSS, IF_REAL, "Source bottom trap-assisted voltage dependent parameter"),
|
||||
IOP( "vtsd", BSIM4v6_MOD_VTSD, IF_REAL, "Drain bottom trap-assisted voltage dependent parameter"),
|
||||
IOP( "vtssws", BSIM4v6_MOD_VTSSWS, IF_REAL, "Source STI sidewall trap-assisted voltage dependent parameter"),
|
||||
IOP( "vtsswd", BSIM4v6_MOD_VTSSWD, IF_REAL, "Drain STI sidewall trap-assisted voltage dependent parameter"),
|
||||
IOP( "vtsswgs", BSIM4v6_MOD_VTSSWGS, IF_REAL, "Source gate-edge sidewall trap-assisted voltage dependent parameter"),
|
||||
IOP( "vtsswgd", BSIM4v6_MOD_VTSSWGD, IF_REAL, "Drain gate-edge sidewall trap-assisted voltage dependent parameter"),
|
||||
|
||||
IOP( "gbmin", BSIM4v6_MOD_GBMIN, IF_REAL, "Minimum body conductance"),
|
||||
IOP( "rbdb", BSIM4v6_MOD_RBDB, IF_REAL, "Resistance between bNode and dbNode"),
|
||||
IOP( "rbpb", BSIM4v6_MOD_RBPB, IF_REAL, "Resistance between bNodePrime and bNode"),
|
||||
IOP( "rbsb", BSIM4v6_MOD_RBSB, IF_REAL, "Resistance between bNode and sbNode"),
|
||||
IOP( "rbps", BSIM4v6_MOD_RBPS, IF_REAL, "Resistance between bNodePrime and sbNode"),
|
||||
IOP( "rbpd", BSIM4v6_MOD_RBPD, IF_REAL, "Resistance between bNodePrime and bNode"),
|
||||
|
||||
IOP( "rbps0", BSIM4v6_MOD_RBPS0, IF_REAL , "Body resistance RBPS scaling"),
|
||||
IOP( "rbpsl", BSIM4v6_MOD_RBPSL, IF_REAL , "Body resistance RBPS L scaling"),
|
||||
IOP( "rbpsw", BSIM4v6_MOD_RBPSW, IF_REAL , "Body resistance RBPS W scaling"),
|
||||
IOP( "rbpsnf", BSIM4v6_MOD_RBPSNF, IF_REAL , "Body resistance RBPS NF scaling"),
|
||||
|
||||
IOP( "rbpd0", BSIM4v6_MOD_RBPD0, IF_REAL , "Body resistance RBPD scaling"),
|
||||
IOP( "rbpdl", BSIM4v6_MOD_RBPDL, IF_REAL , "Body resistance RBPD L scaling"),
|
||||
IOP( "rbpdw", BSIM4v6_MOD_RBPDW, IF_REAL , "Body resistance RBPD W scaling"),
|
||||
IOP( "rbpdnf", BSIM4v6_MOD_RBPDNF, IF_REAL , "Body resistance RBPD NF scaling"),
|
||||
|
||||
IOP( "rbpbx0", BSIM4v6_MOD_RBPBX0, IF_REAL , "Body resistance RBPBX scaling"),
|
||||
IOP( "rbpbxl", BSIM4v6_MOD_RBPBXL, IF_REAL , "Body resistance RBPBX L scaling"),
|
||||
IOP( "rbpbxw", BSIM4v6_MOD_RBPBXW, IF_REAL , "Body resistance RBPBX W scaling"),
|
||||
IOP( "rbpbxnf", BSIM4v6_MOD_RBPBXNF, IF_REAL , "Body resistance RBPBX NF scaling"),
|
||||
IOP( "rbpby0", BSIM4v6_MOD_RBPBY0, IF_REAL , "Body resistance RBPBY scaling"),
|
||||
IOP( "rbpbyl", BSIM4v6_MOD_RBPBYL, IF_REAL , "Body resistance RBPBY L scaling"),
|
||||
IOP( "rbpbyw", BSIM4v6_MOD_RBPBYW, IF_REAL , "Body resistance RBPBY W scaling"),
|
||||
IOP( "rbpbynf", BSIM4v6_MOD_RBPBYNF, IF_REAL , "Body resistance RBPBY NF scaling"),
|
||||
|
||||
IOP( "rbsbx0", BSIM4v6_MOD_RBSBX0, IF_REAL , "Body resistance RBSBX scaling"),
|
||||
IOP( "rbsby0", BSIM4v6_MOD_RBSBY0, IF_REAL , "Body resistance RBSBY scaling"),
|
||||
IOP( "rbdbx0", BSIM4v6_MOD_RBDBX0, IF_REAL , "Body resistance RBDBX scaling"),
|
||||
IOP( "rbdby0", BSIM4v6_MOD_RBDBY0, IF_REAL , "Body resistance RBDBY scaling"),
|
||||
|
||||
IOP( "rbsdbxl", BSIM4v6_MOD_RBSDBXL, IF_REAL , "Body resistance RBSDBX L scaling"),
|
||||
IOP( "rbsdbxw", BSIM4v6_MOD_RBSDBXW, IF_REAL , "Body resistance RBSDBX W scaling"),
|
||||
IOP( "rbsdbxnf", BSIM4v6_MOD_RBSDBXNF, IF_REAL , "Body resistance RBSDBX NF scaling"),
|
||||
IOP( "rbsdbyl", BSIM4v6_MOD_RBSDBYL, IF_REAL , "Body resistance RBSDBY L scaling"),
|
||||
IOP( "rbsdbyw", BSIM4v6_MOD_RBSDBYW, IF_REAL , "Body resistance RBSDBY W scaling"),
|
||||
IOP( "rbsdbynf", BSIM4v6_MOD_RBSDBYNF, IF_REAL , "Body resistance RBSDBY NF scaling"),
|
||||
|
||||
IOP( "lcdsc", BSIM4v6_MOD_LCDSC, IF_REAL, "Length dependence of cdsc"),
|
||||
IOP( "lcdscb", BSIM4v6_MOD_LCDSCB, IF_REAL, "Length dependence of cdscb"),
|
||||
IOP( "lcdscd", BSIM4v6_MOD_LCDSCD, IF_REAL, "Length dependence of cdscd"),
|
||||
IOP( "lcit", BSIM4v6_MOD_LCIT, IF_REAL, "Length dependence of cit"),
|
||||
IOP( "lnfactor", BSIM4v6_MOD_LNFACTOR, IF_REAL, "Length dependence of nfactor"),
|
||||
IOP( "lxj", BSIM4v6_MOD_LXJ, IF_REAL, "Length dependence of xj"),
|
||||
IOP( "lvsat", BSIM4v6_MOD_LVSAT, IF_REAL, "Length dependence of vsat"),
|
||||
IOP( "lat", BSIM4v6_MOD_LAT, IF_REAL, "Length dependence of at"),
|
||||
IOP( "la0", BSIM4v6_MOD_LA0, IF_REAL, "Length dependence of a0"),
|
||||
IOP( "lags", BSIM4v6_MOD_LAGS, IF_REAL, "Length dependence of ags"),
|
||||
IOP( "la1", BSIM4v6_MOD_LA1, IF_REAL, "Length dependence of a1"),
|
||||
IOP( "la2", BSIM4v6_MOD_LA2, IF_REAL, "Length dependence of a2"),
|
||||
IOP( "lketa", BSIM4v6_MOD_LKETA, IF_REAL, "Length dependence of keta"),
|
||||
IOP( "lnsub", BSIM4v6_MOD_LNSUB, IF_REAL, "Length dependence of nsub"),
|
||||
IOP( "lndep", BSIM4v6_MOD_LNDEP, IF_REAL, "Length dependence of ndep"),
|
||||
IOP( "lnsd", BSIM4v6_MOD_LNSD, IF_REAL, "Length dependence of nsd"),
|
||||
IOP( "lphin", BSIM4v6_MOD_LPHIN, IF_REAL, "Length dependence of phin"),
|
||||
IOP( "lngate", BSIM4v6_MOD_LNGATE, IF_REAL, "Length dependence of ngate"),
|
||||
IOP( "lgamma1", BSIM4v6_MOD_LGAMMA1, IF_REAL, "Length dependence of gamma1"),
|
||||
IOP( "lgamma2", BSIM4v6_MOD_LGAMMA2, IF_REAL, "Length dependence of gamma2"),
|
||||
IOP( "lvbx", BSIM4v6_MOD_LVBX, IF_REAL, "Length dependence of vbx"),
|
||||
IOP( "lvbm", BSIM4v6_MOD_LVBM, IF_REAL, "Length dependence of vbm"),
|
||||
IOP( "lxt", BSIM4v6_MOD_LXT, IF_REAL, "Length dependence of xt"),
|
||||
IOP( "lk1", BSIM4v6_MOD_LK1, IF_REAL, "Length dependence of k1"),
|
||||
IOP( "lkt1", BSIM4v6_MOD_LKT1, IF_REAL, "Length dependence of kt1"),
|
||||
IOP( "lkt1l", BSIM4v6_MOD_LKT1L, IF_REAL, "Length dependence of kt1l"),
|
||||
IOP( "lkt2", BSIM4v6_MOD_LKT2, IF_REAL, "Length dependence of kt2"),
|
||||
IOP( "lk2", BSIM4v6_MOD_LK2, IF_REAL, "Length dependence of k2"),
|
||||
IOP( "lk3", BSIM4v6_MOD_LK3, IF_REAL, "Length dependence of k3"),
|
||||
IOP( "lk3b", BSIM4v6_MOD_LK3B, IF_REAL, "Length dependence of k3b"),
|
||||
IOP( "lw0", BSIM4v6_MOD_LW0, IF_REAL, "Length dependence of w0"),
|
||||
IOP( "ldvtp0", BSIM4v6_MOD_LDVTP0, IF_REAL, "Length dependence of dvtp0"),
|
||||
IOP( "ldvtp1", BSIM4v6_MOD_LDVTP1, IF_REAL, "Length dependence of dvtp1"),
|
||||
IOP( "llpe0", BSIM4v6_MOD_LLPE0, IF_REAL, "Length dependence of lpe0"),
|
||||
IOP( "llpeb", BSIM4v6_MOD_LLPEB, IF_REAL, "Length dependence of lpeb"),
|
||||
IOP( "ldvt0", BSIM4v6_MOD_LDVT0, IF_REAL, "Length dependence of dvt0"),
|
||||
IOP( "ldvt1", BSIM4v6_MOD_LDVT1, IF_REAL, "Length dependence of dvt1"),
|
||||
IOP( "ldvt2", BSIM4v6_MOD_LDVT2, IF_REAL, "Length dependence of dvt2"),
|
||||
IOP( "ldvt0w", BSIM4v6_MOD_LDVT0W, IF_REAL, "Length dependence of dvt0w"),
|
||||
IOP( "ldvt1w", BSIM4v6_MOD_LDVT1W, IF_REAL, "Length dependence of dvt1w"),
|
||||
IOP( "ldvt2w", BSIM4v6_MOD_LDVT2W, IF_REAL, "Length dependence of dvt2w"),
|
||||
IOP( "ldrout", BSIM4v6_MOD_LDROUT, IF_REAL, "Length dependence of drout"),
|
||||
IOP( "ldsub", BSIM4v6_MOD_LDSUB, IF_REAL, "Length dependence of dsub"),
|
||||
IOP( "lvth0", BSIM4v6_MOD_LVTH0, IF_REAL,"Length dependence of vto"),
|
||||
IOP( "lvtho", BSIM4v6_MOD_LVTH0, IF_REAL,"Length dependence of vto"),
|
||||
IOP( "lua", BSIM4v6_MOD_LUA, IF_REAL, "Length dependence of ua"),
|
||||
IOP( "lua1", BSIM4v6_MOD_LUA1, IF_REAL, "Length dependence of ua1"),
|
||||
IOP( "lub", BSIM4v6_MOD_LUB, IF_REAL, "Length dependence of ub"),
|
||||
IOP( "lub1", BSIM4v6_MOD_LUB1, IF_REAL, "Length dependence of ub1"),
|
||||
IOP( "luc", BSIM4v6_MOD_LUC, IF_REAL, "Length dependence of uc"),
|
||||
IOP( "luc1", BSIM4v6_MOD_LUC1, IF_REAL, "Length dependence of uc1"),
|
||||
IOP( "lud", BSIM4v6_MOD_LUD, IF_REAL, "Length dependence of ud"),
|
||||
IOP( "lud1", BSIM4v6_MOD_LUD1, IF_REAL, "Length dependence of ud1"),
|
||||
IOP( "lup", BSIM4v6_MOD_LUP, IF_REAL, "Length dependence of up"),
|
||||
IOP( "llp", BSIM4v6_MOD_LLP, IF_REAL, "Length dependence of lp"),
|
||||
IOP( "lu0", BSIM4v6_MOD_LU0, IF_REAL, "Length dependence of u0"),
|
||||
IOP( "lute", BSIM4v6_MOD_LUTE, IF_REAL, "Length dependence of ute"),
|
||||
IOP( "lucste", BSIM4v6_MOD_LUCSTE, IF_REAL, "Length dependence of ucste"),
|
||||
IOP( "lvoff", BSIM4v6_MOD_LVOFF, IF_REAL, "Length dependence of voff"),
|
||||
IOP( "lminv", BSIM4v6_MOD_LMINV, IF_REAL, "Length dependence of minv"),
|
||||
IOP( "lminvcv", BSIM4v6_MOD_LMINVCV, IF_REAL, "Length dependence of minvcv"),
|
||||
IOP( "ldelta", BSIM4v6_MOD_LDELTA, IF_REAL, "Length dependence of delta"),
|
||||
IOP( "lrdsw", BSIM4v6_MOD_LRDSW, IF_REAL, "Length dependence of rdsw "),
|
||||
IOP( "lrsw", BSIM4v6_MOD_LRSW, IF_REAL, "Length dependence of rsw"),
|
||||
IOP( "lrdw", BSIM4v6_MOD_LRDW, IF_REAL, "Length dependence of rdw"),
|
||||
|
||||
IOP( "lprwg", BSIM4v6_MOD_LPRWG, IF_REAL, "Length dependence of prwg "),
|
||||
IOP( "lprwb", BSIM4v6_MOD_LPRWB, IF_REAL, "Length dependence of prwb "),
|
||||
|
||||
IOP( "lprt", BSIM4v6_MOD_LPRT, IF_REAL, "Length dependence of prt "),
|
||||
IOP( "leta0", BSIM4v6_MOD_LETA0, IF_REAL, "Length dependence of eta0"),
|
||||
IOP( "letab", BSIM4v6_MOD_LETAB, IF_REAL, "Length dependence of etab"),
|
||||
IOP( "lpclm", BSIM4v6_MOD_LPCLM, IF_REAL, "Length dependence of pclm"),
|
||||
IOP( "lpdiblc1", BSIM4v6_MOD_LPDIBL1, IF_REAL, "Length dependence of pdiblc1"),
|
||||
IOP( "lpdiblc2", BSIM4v6_MOD_LPDIBL2, IF_REAL, "Length dependence of pdiblc2"),
|
||||
IOP( "lpdiblcb", BSIM4v6_MOD_LPDIBLB, IF_REAL, "Length dependence of pdiblcb"),
|
||||
IOP( "lfprout", BSIM4v6_MOD_LFPROUT, IF_REAL, "Length dependence of pdiblcb"),
|
||||
IOP( "lpdits", BSIM4v6_MOD_LPDITS, IF_REAL, "Length dependence of pdits"),
|
||||
IOP( "lpditsd", BSIM4v6_MOD_LPDITSD, IF_REAL, "Length dependence of pditsd"),
|
||||
IOP( "lpscbe1", BSIM4v6_MOD_LPSCBE1, IF_REAL, "Length dependence of pscbe1"),
|
||||
IOP( "lpscbe2", BSIM4v6_MOD_LPSCBE2, IF_REAL, "Length dependence of pscbe2"),
|
||||
IOP( "lpvag", BSIM4v6_MOD_LPVAG, IF_REAL, "Length dependence of pvag"),
|
||||
IOP( "lwr", BSIM4v6_MOD_LWR, IF_REAL, "Length dependence of wr"),
|
||||
IOP( "ldwg", BSIM4v6_MOD_LDWG, IF_REAL, "Length dependence of dwg"),
|
||||
IOP( "ldwb", BSIM4v6_MOD_LDWB, IF_REAL, "Length dependence of dwb"),
|
||||
IOP( "lb0", BSIM4v6_MOD_LB0, IF_REAL, "Length dependence of b0"),
|
||||
IOP( "lb1", BSIM4v6_MOD_LB1, IF_REAL, "Length dependence of b1"),
|
||||
IOP( "lcgsl", BSIM4v6_MOD_LCGSL, IF_REAL, "Length dependence of cgsl"),
|
||||
IOP( "lcgdl", BSIM4v6_MOD_LCGDL, IF_REAL, "Length dependence of cgdl"),
|
||||
IOP( "lckappas", BSIM4v6_MOD_LCKAPPAS, IF_REAL, "Length dependence of ckappas"),
|
||||
IOP( "lckappad", BSIM4v6_MOD_LCKAPPAD, IF_REAL, "Length dependence of ckappad"),
|
||||
IOP( "lcf", BSIM4v6_MOD_LCF, IF_REAL, "Length dependence of cf"),
|
||||
IOP( "lclc", BSIM4v6_MOD_LCLC, IF_REAL, "Length dependence of clc"),
|
||||
IOP( "lcle", BSIM4v6_MOD_LCLE, IF_REAL, "Length dependence of cle"),
|
||||
IOP( "lalpha0", BSIM4v6_MOD_LALPHA0, IF_REAL, "Length dependence of alpha0"),
|
||||
IOP( "lalpha1", BSIM4v6_MOD_LALPHA1, IF_REAL, "Length dependence of alpha1"),
|
||||
IOP( "lbeta0", BSIM4v6_MOD_LBETA0, IF_REAL, "Length dependence of beta0"),
|
||||
|
||||
IOP( "lagidl", BSIM4v6_MOD_LAGIDL, IF_REAL, "Length dependence of agidl"),
|
||||
IOP( "lbgidl", BSIM4v6_MOD_LBGIDL, IF_REAL, "Length dependence of bgidl"),
|
||||
IOP( "lcgidl", BSIM4v6_MOD_LCGIDL, IF_REAL, "Length dependence of cgidl"),
|
||||
IOP( "legidl", BSIM4v6_MOD_LEGIDL, IF_REAL, "Length dependence of egidl"),
|
||||
IOP( "lagisl", BSIM4v6_MOD_LAGISL, IF_REAL, "Length dependence of agisl"),
|
||||
IOP( "lbgisl", BSIM4v6_MOD_LBGISL, IF_REAL, "Length dependence of bgisl"),
|
||||
IOP( "lcgisl", BSIM4v6_MOD_LCGISL, IF_REAL, "Length dependence of cgisl"),
|
||||
IOP( "legisl", BSIM4v6_MOD_LEGISL, IF_REAL, "Length dependence of egisl"),
|
||||
IOP( "laigc", BSIM4v6_MOD_LAIGC, IF_REAL, "Length dependence of aigc"),
|
||||
IOP( "lbigc", BSIM4v6_MOD_LBIGC, IF_REAL, "Length dependence of bigc"),
|
||||
IOP( "lcigc", BSIM4v6_MOD_LCIGC, IF_REAL, "Length dependence of cigc"),
|
||||
IOP( "laigsd", BSIM4v6_MOD_LAIGSD, IF_REAL, "Length dependence of aigsd"),
|
||||
IOP( "lbigsd", BSIM4v6_MOD_LBIGSD, IF_REAL, "Length dependence of bigsd"),
|
||||
IOP( "lcigsd", BSIM4v6_MOD_LCIGSD, IF_REAL, "Length dependence of cigsd"),
|
||||
IOP( "laigs", BSIM4v6_MOD_LAIGS, IF_REAL, "Length dependence of aigs"),
|
||||
IOP( "lbigs", BSIM4v6_MOD_LBIGS, IF_REAL, "Length dependence of bigs"),
|
||||
IOP( "lcigs", BSIM4v6_MOD_LCIGS, IF_REAL, "Length dependence of cigs"),
|
||||
IOP( "laigd", BSIM4v6_MOD_LAIGD, IF_REAL, "Length dependence of aigd"),
|
||||
IOP( "lbigd", BSIM4v6_MOD_LBIGD, IF_REAL, "Length dependence of bigd"),
|
||||
IOP( "lcigd", BSIM4v6_MOD_LCIGD, IF_REAL, "Length dependence of cigd"),
|
||||
IOP( "laigbacc", BSIM4v6_MOD_LAIGBACC, IF_REAL, "Length dependence of aigbacc"),
|
||||
IOP( "lbigbacc", BSIM4v6_MOD_LBIGBACC, IF_REAL, "Length dependence of bigbacc"),
|
||||
IOP( "lcigbacc", BSIM4v6_MOD_LCIGBACC, IF_REAL, "Length dependence of cigbacc"),
|
||||
IOP( "laigbinv", BSIM4v6_MOD_LAIGBINV, IF_REAL, "Length dependence of aigbinv"),
|
||||
IOP( "lbigbinv", BSIM4v6_MOD_LBIGBINV, IF_REAL, "Length dependence of bigbinv"),
|
||||
IOP( "lcigbinv", BSIM4v6_MOD_LCIGBINV, IF_REAL, "Length dependence of cigbinv"),
|
||||
IOP( "lnigc", BSIM4v6_MOD_LNIGC, IF_REAL, "Length dependence of nigc"),
|
||||
IOP( "lnigbinv", BSIM4v6_MOD_LNIGBINV, IF_REAL, "Length dependence of nigbinv"),
|
||||
IOP( "lnigbacc", BSIM4v6_MOD_LNIGBACC, IF_REAL, "Length dependence of nigbacc"),
|
||||
IOP( "lntox", BSIM4v6_MOD_LNTOX, IF_REAL, "Length dependence of ntox"),
|
||||
IOP( "leigbinv", BSIM4v6_MOD_LEIGBINV, IF_REAL, "Length dependence for eigbinv"),
|
||||
IOP( "lpigcd", BSIM4v6_MOD_LPIGCD, IF_REAL, "Length dependence for pigcd"),
|
||||
IOP( "lpoxedge", BSIM4v6_MOD_LPOXEDGE, IF_REAL, "Length dependence for poxedge"),
|
||||
|
||||
IOP( "lvfbcv", BSIM4v6_MOD_LVFBCV, IF_REAL, "Length dependence of vfbcv"),
|
||||
IOP( "lvfb", BSIM4v6_MOD_LVFB, IF_REAL, "Length dependence of vfb"),
|
||||
IOP( "lacde", BSIM4v6_MOD_LACDE, IF_REAL, "Length dependence of acde"),
|
||||
IOP( "lmoin", BSIM4v6_MOD_LMOIN, IF_REAL, "Length dependence of moin"),
|
||||
IOP( "lnoff", BSIM4v6_MOD_LNOFF, IF_REAL, "Length dependence of noff"),
|
||||
IOP( "lvoffcv", BSIM4v6_MOD_LVOFFCV, IF_REAL, "Length dependence of voffcv"),
|
||||
IOP( "lxrcrg1", BSIM4v6_MOD_LXRCRG1, IF_REAL, "Length dependence of xrcrg1"),
|
||||
IOP( "lxrcrg2", BSIM4v6_MOD_LXRCRG2, IF_REAL, "Length dependence of xrcrg2"),
|
||||
IOP( "llambda", BSIM4v6_MOD_LLAMBDA, IF_REAL, "Length dependence of lambda"),
|
||||
IOP( "lvtl", BSIM4v6_MOD_LVTL, IF_REAL, " Length dependence of vtl"),
|
||||
IOP( "lxn", BSIM4v6_MOD_LXN, IF_REAL, " Length dependence of xn"),
|
||||
IOP( "leu", BSIM4v6_MOD_LEU, IF_REAL, " Length dependence of eu"),
|
||||
IOP( "lucs", BSIM4v6_MOD_LUCS, IF_REAL, "Length dependence of lucs"),
|
||||
IOP( "lvfbsdoff", BSIM4v6_MOD_LVFBSDOFF, IF_REAL, "Length dependence of vfbsdoff"),
|
||||
IOP( "ltvfbsdoff", BSIM4v6_MOD_LTVFBSDOFF, IF_REAL, "Length dependence of tvfbsdoff"),
|
||||
IOP( "ltvoff", BSIM4v6_MOD_LTVOFF, IF_REAL, "Length dependence of tvoff"),
|
||||
|
||||
IOP( "wcdsc", BSIM4v6_MOD_WCDSC, IF_REAL, "Width dependence of cdsc"),
|
||||
IOP( "wcdscb", BSIM4v6_MOD_WCDSCB, IF_REAL, "Width dependence of cdscb"),
|
||||
IOP( "wcdscd", BSIM4v6_MOD_WCDSCD, IF_REAL, "Width dependence of cdscd"),
|
||||
IOP( "wcit", BSIM4v6_MOD_WCIT, IF_REAL, "Width dependence of cit"),
|
||||
IOP( "wnfactor", BSIM4v6_MOD_WNFACTOR, IF_REAL, "Width dependence of nfactor"),
|
||||
IOP( "wxj", BSIM4v6_MOD_WXJ, IF_REAL, "Width dependence of xj"),
|
||||
IOP( "wvsat", BSIM4v6_MOD_WVSAT, IF_REAL, "Width dependence of vsat"),
|
||||
IOP( "wat", BSIM4v6_MOD_WAT, IF_REAL, "Width dependence of at"),
|
||||
IOP( "wa0", BSIM4v6_MOD_WA0, IF_REAL, "Width dependence of a0"),
|
||||
IOP( "wags", BSIM4v6_MOD_WAGS, IF_REAL, "Width dependence of ags"),
|
||||
IOP( "wa1", BSIM4v6_MOD_WA1, IF_REAL, "Width dependence of a1"),
|
||||
IOP( "wa2", BSIM4v6_MOD_WA2, IF_REAL, "Width dependence of a2"),
|
||||
IOP( "wketa", BSIM4v6_MOD_WKETA, IF_REAL, "Width dependence of keta"),
|
||||
IOP( "wnsub", BSIM4v6_MOD_WNSUB, IF_REAL, "Width dependence of nsub"),
|
||||
IOP( "wndep", BSIM4v6_MOD_WNDEP, IF_REAL, "Width dependence of ndep"),
|
||||
IOP( "wnsd", BSIM4v6_MOD_WNSD, IF_REAL, "Width dependence of nsd"),
|
||||
IOP( "wphin", BSIM4v6_MOD_WPHIN, IF_REAL, "Width dependence of phin"),
|
||||
IOP( "wngate", BSIM4v6_MOD_WNGATE, IF_REAL, "Width dependence of ngate"),
|
||||
IOP( "wgamma1", BSIM4v6_MOD_WGAMMA1, IF_REAL, "Width dependence of gamma1"),
|
||||
IOP( "wgamma2", BSIM4v6_MOD_WGAMMA2, IF_REAL, "Width dependence of gamma2"),
|
||||
IOP( "wvbx", BSIM4v6_MOD_WVBX, IF_REAL, "Width dependence of vbx"),
|
||||
IOP( "wvbm", BSIM4v6_MOD_WVBM, IF_REAL, "Width dependence of vbm"),
|
||||
IOP( "wxt", BSIM4v6_MOD_WXT, IF_REAL, "Width dependence of xt"),
|
||||
IOP( "wk1", BSIM4v6_MOD_WK1, IF_REAL, "Width dependence of k1"),
|
||||
IOP( "wkt1", BSIM4v6_MOD_WKT1, IF_REAL, "Width dependence of kt1"),
|
||||
IOP( "wkt1l", BSIM4v6_MOD_WKT1L, IF_REAL, "Width dependence of kt1l"),
|
||||
IOP( "wkt2", BSIM4v6_MOD_WKT2, IF_REAL, "Width dependence of kt2"),
|
||||
IOP( "wk2", BSIM4v6_MOD_WK2, IF_REAL, "Width dependence of k2"),
|
||||
IOP( "wk3", BSIM4v6_MOD_WK3, IF_REAL, "Width dependence of k3"),
|
||||
IOP( "wk3b", BSIM4v6_MOD_WK3B, IF_REAL, "Width dependence of k3b"),
|
||||
IOP( "ww0", BSIM4v6_MOD_WW0, IF_REAL, "Width dependence of w0"),
|
||||
IOP( "wdvtp0", BSIM4v6_MOD_WDVTP0, IF_REAL, "Width dependence of dvtp0"),
|
||||
IOP( "wdvtp1", BSIM4v6_MOD_WDVTP1, IF_REAL, "Width dependence of dvtp1"),
|
||||
IOP( "wlpe0", BSIM4v6_MOD_WLPE0, IF_REAL, "Width dependence of lpe0"),
|
||||
IOP( "wlpeb", BSIM4v6_MOD_WLPEB, IF_REAL, "Width dependence of lpeb"),
|
||||
IOP( "wdvt0", BSIM4v6_MOD_WDVT0, IF_REAL, "Width dependence of dvt0"),
|
||||
IOP( "wdvt1", BSIM4v6_MOD_WDVT1, IF_REAL, "Width dependence of dvt1"),
|
||||
IOP( "wdvt2", BSIM4v6_MOD_WDVT2, IF_REAL, "Width dependence of dvt2"),
|
||||
IOP( "wdvt0w", BSIM4v6_MOD_WDVT0W, IF_REAL, "Width dependence of dvt0w"),
|
||||
IOP( "wdvt1w", BSIM4v6_MOD_WDVT1W, IF_REAL, "Width dependence of dvt1w"),
|
||||
IOP( "wdvt2w", BSIM4v6_MOD_WDVT2W, IF_REAL, "Width dependence of dvt2w"),
|
||||
IOP( "wdrout", BSIM4v6_MOD_WDROUT, IF_REAL, "Width dependence of drout"),
|
||||
IOP( "wdsub", BSIM4v6_MOD_WDSUB, IF_REAL, "Width dependence of dsub"),
|
||||
IOP( "wvth0", BSIM4v6_MOD_WVTH0, IF_REAL,"Width dependence of vto"),
|
||||
IOP( "wvtho", BSIM4v6_MOD_WVTH0, IF_REAL,"Width dependence of vto"),
|
||||
IOP( "wua", BSIM4v6_MOD_WUA, IF_REAL, "Width dependence of ua"),
|
||||
IOP( "wua1", BSIM4v6_MOD_WUA1, IF_REAL, "Width dependence of ua1"),
|
||||
IOP( "wub", BSIM4v6_MOD_WUB, IF_REAL, "Width dependence of ub"),
|
||||
IOP( "wub1", BSIM4v6_MOD_WUB1, IF_REAL, "Width dependence of ub1"),
|
||||
IOP( "wuc", BSIM4v6_MOD_WUC, IF_REAL, "Width dependence of uc"),
|
||||
IOP( "wuc1", BSIM4v6_MOD_WUC1, IF_REAL, "Width dependence of uc1"),
|
||||
IOP( "wud", BSIM4v6_MOD_WUD, IF_REAL, "Width dependence of ud"),
|
||||
IOP( "wud1", BSIM4v6_MOD_WUD1, IF_REAL, "Width dependence of ud1"),
|
||||
IOP( "wup", BSIM4v6_MOD_WUP, IF_REAL, "Width dependence of up"),
|
||||
IOP( "wlp", BSIM4v6_MOD_WLP, IF_REAL, "Width dependence of lp"),
|
||||
IOP( "wu0", BSIM4v6_MOD_WU0, IF_REAL, "Width dependence of u0"),
|
||||
IOP( "wute", BSIM4v6_MOD_WUTE, IF_REAL, "Width dependence of ute"),
|
||||
IOP( "wucste", BSIM4v6_MOD_WUCSTE, IF_REAL, "Width dependence of ucste"),
|
||||
IOP( "wvoff", BSIM4v6_MOD_WVOFF, IF_REAL, "Width dependence of voff"),
|
||||
IOP( "wminv", BSIM4v6_MOD_WMINV, IF_REAL, "Width dependence of minv"),
|
||||
IOP( "wminvcv", BSIM4v6_MOD_WMINVCV, IF_REAL, "Width dependence of minvcv"),
|
||||
IOP( "wdelta", BSIM4v6_MOD_WDELTA, IF_REAL, "Width dependence of delta"),
|
||||
IOP( "wrdsw", BSIM4v6_MOD_WRDSW, IF_REAL, "Width dependence of rdsw "),
|
||||
IOP( "wrsw", BSIM4v6_MOD_WRSW, IF_REAL, "Width dependence of rsw"),
|
||||
IOP( "wrdw", BSIM4v6_MOD_WRDW, IF_REAL, "Width dependence of rdw"),
|
||||
|
||||
IOP( "wprwg", BSIM4v6_MOD_WPRWG, IF_REAL, "Width dependence of prwg "),
|
||||
IOP( "wprwb", BSIM4v6_MOD_WPRWB, IF_REAL, "Width dependence of prwb "),
|
||||
|
||||
IOP( "wprt", BSIM4v6_MOD_WPRT, IF_REAL, "Width dependence of prt"),
|
||||
IOP( "weta0", BSIM4v6_MOD_WETA0, IF_REAL, "Width dependence of eta0"),
|
||||
IOP( "wetab", BSIM4v6_MOD_WETAB, IF_REAL, "Width dependence of etab"),
|
||||
IOP( "wpclm", BSIM4v6_MOD_WPCLM, IF_REAL, "Width dependence of pclm"),
|
||||
IOP( "wpdiblc1", BSIM4v6_MOD_WPDIBL1, IF_REAL, "Width dependence of pdiblc1"),
|
||||
IOP( "wpdiblc2", BSIM4v6_MOD_WPDIBL2, IF_REAL, "Width dependence of pdiblc2"),
|
||||
IOP( "wpdiblcb", BSIM4v6_MOD_WPDIBLB, IF_REAL, "Width dependence of pdiblcb"),
|
||||
IOP( "wfprout", BSIM4v6_MOD_WFPROUT, IF_REAL, "Width dependence of pdiblcb"),
|
||||
IOP( "wpdits", BSIM4v6_MOD_WPDITS, IF_REAL, "Width dependence of pdits"),
|
||||
IOP( "wpditsd", BSIM4v6_MOD_WPDITSD, IF_REAL, "Width dependence of pditsd"),
|
||||
IOP( "wpscbe1", BSIM4v6_MOD_WPSCBE1, IF_REAL, "Width dependence of pscbe1"),
|
||||
IOP( "wpscbe2", BSIM4v6_MOD_WPSCBE2, IF_REAL, "Width dependence of pscbe2"),
|
||||
IOP( "wpvag", BSIM4v6_MOD_WPVAG, IF_REAL, "Width dependence of pvag"),
|
||||
IOP( "wwr", BSIM4v6_MOD_WWR, IF_REAL, "Width dependence of wr"),
|
||||
IOP( "wdwg", BSIM4v6_MOD_WDWG, IF_REAL, "Width dependence of dwg"),
|
||||
IOP( "wdwb", BSIM4v6_MOD_WDWB, IF_REAL, "Width dependence of dwb"),
|
||||
IOP( "wb0", BSIM4v6_MOD_WB0, IF_REAL, "Width dependence of b0"),
|
||||
IOP( "wb1", BSIM4v6_MOD_WB1, IF_REAL, "Width dependence of b1"),
|
||||
IOP( "wcgsl", BSIM4v6_MOD_WCGSL, IF_REAL, "Width dependence of cgsl"),
|
||||
IOP( "wcgdl", BSIM4v6_MOD_WCGDL, IF_REAL, "Width dependence of cgdl"),
|
||||
IOP( "wckappas", BSIM4v6_MOD_WCKAPPAS, IF_REAL, "Width dependence of ckappas"),
|
||||
IOP( "wckappad", BSIM4v6_MOD_WCKAPPAD, IF_REAL, "Width dependence of ckappad"),
|
||||
IOP( "wcf", BSIM4v6_MOD_WCF, IF_REAL, "Width dependence of cf"),
|
||||
IOP( "wclc", BSIM4v6_MOD_WCLC, IF_REAL, "Width dependence of clc"),
|
||||
IOP( "wcle", BSIM4v6_MOD_WCLE, IF_REAL, "Width dependence of cle"),
|
||||
IOP( "walpha0", BSIM4v6_MOD_WALPHA0, IF_REAL, "Width dependence of alpha0"),
|
||||
IOP( "walpha1", BSIM4v6_MOD_WALPHA1, IF_REAL, "Width dependence of alpha1"),
|
||||
IOP( "wbeta0", BSIM4v6_MOD_WBETA0, IF_REAL, "Width dependence of beta0"),
|
||||
|
||||
IOP( "wagidl", BSIM4v6_MOD_WAGIDL, IF_REAL, "Width dependence of agidl"),
|
||||
IOP( "wbgidl", BSIM4v6_MOD_WBGIDL, IF_REAL, "Width dependence of bgidl"),
|
||||
IOP( "wcgidl", BSIM4v6_MOD_WCGIDL, IF_REAL, "Width dependence of cgidl"),
|
||||
IOP( "wegidl", BSIM4v6_MOD_WEGIDL, IF_REAL, "Width dependence of egidl"),
|
||||
IOP( "wagisl", BSIM4v6_MOD_WAGISL, IF_REAL, "Width dependence of agisl"),
|
||||
IOP( "wbgisl", BSIM4v6_MOD_WBGISL, IF_REAL, "Width dependence of bgisl"),
|
||||
IOP( "wcgisl", BSIM4v6_MOD_WCGISL, IF_REAL, "Width dependence of cgisl"),
|
||||
IOP( "wegisl", BSIM4v6_MOD_WEGISL, IF_REAL, "Width dependence of egisl"),
|
||||
IOP( "waigc", BSIM4v6_MOD_WAIGC, IF_REAL, "Width dependence of aigc"),
|
||||
IOP( "wbigc", BSIM4v6_MOD_WBIGC, IF_REAL, "Width dependence of bigc"),
|
||||
IOP( "wcigc", BSIM4v6_MOD_WCIGC, IF_REAL, "Width dependence of cigc"),
|
||||
IOP( "waigsd", BSIM4v6_MOD_WAIGSD, IF_REAL, "Width dependence of aigsd"),
|
||||
IOP( "wbigsd", BSIM4v6_MOD_WBIGSD, IF_REAL, "Width dependence of bigsd"),
|
||||
IOP( "wcigsd", BSIM4v6_MOD_WCIGSD, IF_REAL, "Width dependence of cigsd"),
|
||||
IOP( "waigs", BSIM4v6_MOD_WAIGS, IF_REAL, "Width dependence of aigs"),
|
||||
IOP( "wbigs", BSIM4v6_MOD_WBIGS, IF_REAL, "Width dependence of bigs"),
|
||||
IOP( "wcigs", BSIM4v6_MOD_WCIGS, IF_REAL, "Width dependence of cigs"),
|
||||
IOP( "waigd", BSIM4v6_MOD_WAIGD, IF_REAL, "Width dependence of aigd"),
|
||||
IOP( "wbigd", BSIM4v6_MOD_WBIGD, IF_REAL, "Width dependence of bigd"),
|
||||
IOP( "wcigd", BSIM4v6_MOD_WCIGD, IF_REAL, "Width dependence of cigd"),
|
||||
IOP( "waigbacc", BSIM4v6_MOD_WAIGBACC, IF_REAL, "Width dependence of aigbacc"),
|
||||
IOP( "wbigbacc", BSIM4v6_MOD_WBIGBACC, IF_REAL, "Width dependence of bigbacc"),
|
||||
IOP( "wcigbacc", BSIM4v6_MOD_WCIGBACC, IF_REAL, "Width dependence of cigbacc"),
|
||||
IOP( "waigbinv", BSIM4v6_MOD_WAIGBINV, IF_REAL, "Width dependence of aigbinv"),
|
||||
IOP( "wbigbinv", BSIM4v6_MOD_WBIGBINV, IF_REAL, "Width dependence of bigbinv"),
|
||||
IOP( "wcigbinv", BSIM4v6_MOD_WCIGBINV, IF_REAL, "Width dependence of cigbinv"),
|
||||
IOP( "wnigc", BSIM4v6_MOD_WNIGC, IF_REAL, "Width dependence of nigc"),
|
||||
IOP( "wnigbinv", BSIM4v6_MOD_WNIGBINV, IF_REAL, "Width dependence of nigbinv"),
|
||||
IOP( "wnigbacc", BSIM4v6_MOD_WNIGBACC, IF_REAL, "Width dependence of nigbacc"),
|
||||
IOP( "wntox", BSIM4v6_MOD_WNTOX, IF_REAL, "Width dependence of ntox"),
|
||||
IOP( "weigbinv", BSIM4v6_MOD_WEIGBINV, IF_REAL, "Width dependence for eigbinv"),
|
||||
IOP( "wpigcd", BSIM4v6_MOD_WPIGCD, IF_REAL, "Width dependence for pigcd"),
|
||||
IOP( "wpoxedge", BSIM4v6_MOD_WPOXEDGE, IF_REAL, "Width dependence for poxedge"),
|
||||
IOP( "wvfbcv", BSIM4v6_MOD_WVFBCV, IF_REAL, "Width dependence of vfbcv"),
|
||||
IOP( "wvfb", BSIM4v6_MOD_WVFB, IF_REAL, "Width dependence of vfb"),
|
||||
IOP( "wacde", BSIM4v6_MOD_WACDE, IF_REAL, "Width dependence of acde"),
|
||||
IOP( "wmoin", BSIM4v6_MOD_WMOIN, IF_REAL, "Width dependence of moin"),
|
||||
IOP( "wnoff", BSIM4v6_MOD_WNOFF, IF_REAL, "Width dependence of noff"),
|
||||
IOP( "wvoffcv", BSIM4v6_MOD_WVOFFCV, IF_REAL, "Width dependence of voffcv"),
|
||||
IOP( "wxrcrg1", BSIM4v6_MOD_WXRCRG1, IF_REAL, "Width dependence of xrcrg1"),
|
||||
IOP( "wxrcrg2", BSIM4v6_MOD_WXRCRG2, IF_REAL, "Width dependence of xrcrg2"),
|
||||
IOP( "wlambda", BSIM4v6_MOD_WLAMBDA, IF_REAL, "Width dependence of lambda"),
|
||||
IOP( "wvtl", BSIM4v6_MOD_WVTL, IF_REAL, "Width dependence of vtl"),
|
||||
IOP( "wxn", BSIM4v6_MOD_WXN, IF_REAL, "Width dependence of xn"),
|
||||
IOP( "weu", BSIM4v6_MOD_WEU, IF_REAL, "Width dependence of eu"),
|
||||
IOP( "wucs", BSIM4v6_MOD_WUCS, IF_REAL, "Width dependence of ucs"),
|
||||
IOP( "wvfbsdoff", BSIM4v6_MOD_WVFBSDOFF, IF_REAL, "Width dependence of vfbsdoff"),
|
||||
IOP( "wtvfbsdoff", BSIM4v6_MOD_WTVFBSDOFF, IF_REAL, "Width dependence of tvfbsdoff"),
|
||||
IOP( "wtvoff", BSIM4v6_MOD_WTVOFF, IF_REAL, "Width dependence of tvoff"),
|
||||
|
||||
IOP( "pcdsc", BSIM4v6_MOD_PCDSC, IF_REAL, "Cross-term dependence of cdsc"),
|
||||
IOP( "pcdscb", BSIM4v6_MOD_PCDSCB, IF_REAL, "Cross-term dependence of cdscb"),
|
||||
IOP( "pcdscd", BSIM4v6_MOD_PCDSCD, IF_REAL, "Cross-term dependence of cdscd"),
|
||||
IOP( "pcit", BSIM4v6_MOD_PCIT, IF_REAL, "Cross-term dependence of cit"),
|
||||
IOP( "pnfactor", BSIM4v6_MOD_PNFACTOR, IF_REAL, "Cross-term dependence of nfactor"),
|
||||
IOP( "pxj", BSIM4v6_MOD_PXJ, IF_REAL, "Cross-term dependence of xj"),
|
||||
IOP( "pvsat", BSIM4v6_MOD_PVSAT, IF_REAL, "Cross-term dependence of vsat"),
|
||||
IOP( "pat", BSIM4v6_MOD_PAT, IF_REAL, "Cross-term dependence of at"),
|
||||
IOP( "pa0", BSIM4v6_MOD_PA0, IF_REAL, "Cross-term dependence of a0"),
|
||||
IOP( "pags", BSIM4v6_MOD_PAGS, IF_REAL, "Cross-term dependence of ags"),
|
||||
IOP( "pa1", BSIM4v6_MOD_PA1, IF_REAL, "Cross-term dependence of a1"),
|
||||
IOP( "pa2", BSIM4v6_MOD_PA2, IF_REAL, "Cross-term dependence of a2"),
|
||||
IOP( "pketa", BSIM4v6_MOD_PKETA, IF_REAL, "Cross-term dependence of keta"),
|
||||
IOP( "pnsub", BSIM4v6_MOD_PNSUB, IF_REAL, "Cross-term dependence of nsub"),
|
||||
IOP( "pndep", BSIM4v6_MOD_PNDEP, IF_REAL, "Cross-term dependence of ndep"),
|
||||
IOP( "pnsd", BSIM4v6_MOD_PNSD, IF_REAL, "Cross-term dependence of nsd"),
|
||||
IOP( "pphin", BSIM4v6_MOD_PPHIN, IF_REAL, "Cross-term dependence of phin"),
|
||||
IOP( "pngate", BSIM4v6_MOD_PNGATE, IF_REAL, "Cross-term dependence of ngate"),
|
||||
IOP( "pgamma1", BSIM4v6_MOD_PGAMMA1, IF_REAL, "Cross-term dependence of gamma1"),
|
||||
IOP( "pgamma2", BSIM4v6_MOD_PGAMMA2, IF_REAL, "Cross-term dependence of gamma2"),
|
||||
IOP( "pvbx", BSIM4v6_MOD_PVBX, IF_REAL, "Cross-term dependence of vbx"),
|
||||
IOP( "pvbm", BSIM4v6_MOD_PVBM, IF_REAL, "Cross-term dependence of vbm"),
|
||||
IOP( "pxt", BSIM4v6_MOD_PXT, IF_REAL, "Cross-term dependence of xt"),
|
||||
IOP( "pk1", BSIM4v6_MOD_PK1, IF_REAL, "Cross-term dependence of k1"),
|
||||
IOP( "pkt1", BSIM4v6_MOD_PKT1, IF_REAL, "Cross-term dependence of kt1"),
|
||||
IOP( "pkt1l", BSIM4v6_MOD_PKT1L, IF_REAL, "Cross-term dependence of kt1l"),
|
||||
IOP( "pkt2", BSIM4v6_MOD_PKT2, IF_REAL, "Cross-term dependence of kt2"),
|
||||
IOP( "pk2", BSIM4v6_MOD_PK2, IF_REAL, "Cross-term dependence of k2"),
|
||||
IOP( "pk3", BSIM4v6_MOD_PK3, IF_REAL, "Cross-term dependence of k3"),
|
||||
IOP( "pk3b", BSIM4v6_MOD_PK3B, IF_REAL, "Cross-term dependence of k3b"),
|
||||
IOP( "pw0", BSIM4v6_MOD_PW0, IF_REAL, "Cross-term dependence of w0"),
|
||||
IOP( "pdvtp0", BSIM4v6_MOD_PDVTP0, IF_REAL, "Cross-term dependence of dvtp0"),
|
||||
IOP( "pdvtp1", BSIM4v6_MOD_PDVTP1, IF_REAL, "Cross-term dependence of dvtp1"),
|
||||
IOP( "plpe0", BSIM4v6_MOD_PLPE0, IF_REAL, "Cross-term dependence of lpe0"),
|
||||
IOP( "plpeb", BSIM4v6_MOD_PLPEB, IF_REAL, "Cross-term dependence of lpeb"),
|
||||
IOP( "pdvt0", BSIM4v6_MOD_PDVT0, IF_REAL, "Cross-term dependence of dvt0"),
|
||||
IOP( "pdvt1", BSIM4v6_MOD_PDVT1, IF_REAL, "Cross-term dependence of dvt1"),
|
||||
IOP( "pdvt2", BSIM4v6_MOD_PDVT2, IF_REAL, "Cross-term dependence of dvt2"),
|
||||
IOP( "pdvt0w", BSIM4v6_MOD_PDVT0W, IF_REAL, "Cross-term dependence of dvt0w"),
|
||||
IOP( "pdvt1w", BSIM4v6_MOD_PDVT1W, IF_REAL, "Cross-term dependence of dvt1w"),
|
||||
IOP( "pdvt2w", BSIM4v6_MOD_PDVT2W, IF_REAL, "Cross-term dependence of dvt2w"),
|
||||
IOP( "pdrout", BSIM4v6_MOD_PDROUT, IF_REAL, "Cross-term dependence of drout"),
|
||||
IOP( "pdsub", BSIM4v6_MOD_PDSUB, IF_REAL, "Cross-term dependence of dsub"),
|
||||
IOP( "pvth0", BSIM4v6_MOD_PVTH0, IF_REAL,"Cross-term dependence of vto"),
|
||||
IOP( "pvtho", BSIM4v6_MOD_PVTH0, IF_REAL,"Cross-term dependence of vto"),
|
||||
IOP( "pua", BSIM4v6_MOD_PUA, IF_REAL, "Cross-term dependence of ua"),
|
||||
IOP( "pua1", BSIM4v6_MOD_PUA1, IF_REAL, "Cross-term dependence of ua1"),
|
||||
IOP( "pub", BSIM4v6_MOD_PUB, IF_REAL, "Cross-term dependence of ub"),
|
||||
IOP( "pub1", BSIM4v6_MOD_PUB1, IF_REAL, "Cross-term dependence of ub1"),
|
||||
IOP( "puc", BSIM4v6_MOD_PUC, IF_REAL, "Cross-term dependence of uc"),
|
||||
IOP( "puc1", BSIM4v6_MOD_PUC1, IF_REAL, "Cross-term dependence of uc1"),
|
||||
IOP( "pud", BSIM4v6_MOD_PUD, IF_REAL, "Cross-term dependence of ud"),
|
||||
IOP( "pud1", BSIM4v6_MOD_PUD1, IF_REAL, "Cross-term dependence of ud1"),
|
||||
IOP( "pup", BSIM4v6_MOD_PUP, IF_REAL, "Cross-term dependence of up"),
|
||||
IOP( "plp", BSIM4v6_MOD_PLP, IF_REAL, "Cross-term dependence of lp"),
|
||||
IOP( "pu0", BSIM4v6_MOD_PU0, IF_REAL, "Cross-term dependence of u0"),
|
||||
IOP( "pute", BSIM4v6_MOD_PUTE, IF_REAL, "Cross-term dependence of ute"),
|
||||
IOP( "pucste", BSIM4v6_MOD_PUCSTE, IF_REAL, "Cross-term dependence of ucste"),
|
||||
IOP( "pvoff", BSIM4v6_MOD_PVOFF, IF_REAL, "Cross-term dependence of voff"),
|
||||
IOP( "pminv", BSIM4v6_MOD_PMINV, IF_REAL, "Cross-term dependence of minv"),
|
||||
IOP( "pminvcv", BSIM4v6_MOD_PMINVCV, IF_REAL, "Cross-term dependence of minvcv"),
|
||||
IOP( "pdelta", BSIM4v6_MOD_PDELTA, IF_REAL, "Cross-term dependence of delta"),
|
||||
IOP( "prdsw", BSIM4v6_MOD_PRDSW, IF_REAL, "Cross-term dependence of rdsw "),
|
||||
IOP( "prsw", BSIM4v6_MOD_PRSW, IF_REAL, "Cross-term dependence of rsw"),
|
||||
IOP( "prdw", BSIM4v6_MOD_PRDW, IF_REAL, "Cross-term dependence of rdw"),
|
||||
|
||||
IOP( "pprwg", BSIM4v6_MOD_PPRWG, IF_REAL, "Cross-term dependence of prwg "),
|
||||
IOP( "pprwb", BSIM4v6_MOD_PPRWB, IF_REAL, "Cross-term dependence of prwb "),
|
||||
|
||||
IOP( "pprt", BSIM4v6_MOD_PPRT, IF_REAL, "Cross-term dependence of prt "),
|
||||
IOP( "peta0", BSIM4v6_MOD_PETA0, IF_REAL, "Cross-term dependence of eta0"),
|
||||
IOP( "petab", BSIM4v6_MOD_PETAB, IF_REAL, "Cross-term dependence of etab"),
|
||||
IOP( "ppclm", BSIM4v6_MOD_PPCLM, IF_REAL, "Cross-term dependence of pclm"),
|
||||
IOP( "ppdiblc1", BSIM4v6_MOD_PPDIBL1, IF_REAL, "Cross-term dependence of pdiblc1"),
|
||||
IOP( "ppdiblc2", BSIM4v6_MOD_PPDIBL2, IF_REAL, "Cross-term dependence of pdiblc2"),
|
||||
IOP( "ppdiblcb", BSIM4v6_MOD_PPDIBLB, IF_REAL, "Cross-term dependence of pdiblcb"),
|
||||
IOP( "pfprout", BSIM4v6_MOD_PFPROUT, IF_REAL, "Cross-term dependence of pdiblcb"),
|
||||
IOP( "ppdits", BSIM4v6_MOD_PPDITS, IF_REAL, "Cross-term dependence of pdits"),
|
||||
IOP( "ppditsd", BSIM4v6_MOD_PPDITSD, IF_REAL, "Cross-term dependence of pditsd"),
|
||||
IOP( "ppscbe1", BSIM4v6_MOD_PPSCBE1, IF_REAL, "Cross-term dependence of pscbe1"),
|
||||
IOP( "ppscbe2", BSIM4v6_MOD_PPSCBE2, IF_REAL, "Cross-term dependence of pscbe2"),
|
||||
IOP( "ppvag", BSIM4v6_MOD_PPVAG, IF_REAL, "Cross-term dependence of pvag"),
|
||||
IOP( "pwr", BSIM4v6_MOD_PWR, IF_REAL, "Cross-term dependence of wr"),
|
||||
IOP( "pdwg", BSIM4v6_MOD_PDWG, IF_REAL, "Cross-term dependence of dwg"),
|
||||
IOP( "pdwb", BSIM4v6_MOD_PDWB, IF_REAL, "Cross-term dependence of dwb"),
|
||||
IOP( "pb0", BSIM4v6_MOD_PB0, IF_REAL, "Cross-term dependence of b0"),
|
||||
IOP( "pb1", BSIM4v6_MOD_PB1, IF_REAL, "Cross-term dependence of b1"),
|
||||
IOP( "pcgsl", BSIM4v6_MOD_PCGSL, IF_REAL, "Cross-term dependence of cgsl"),
|
||||
IOP( "pcgdl", BSIM4v6_MOD_PCGDL, IF_REAL, "Cross-term dependence of cgdl"),
|
||||
IOP( "pckappas", BSIM4v6_MOD_PCKAPPAS, IF_REAL, "Cross-term dependence of ckappas"),
|
||||
IOP( "pckappad", BSIM4v6_MOD_PCKAPPAD, IF_REAL, "Cross-term dependence of ckappad"),
|
||||
IOP( "pcf", BSIM4v6_MOD_PCF, IF_REAL, "Cross-term dependence of cf"),
|
||||
IOP( "pclc", BSIM4v6_MOD_PCLC, IF_REAL, "Cross-term dependence of clc"),
|
||||
IOP( "pcle", BSIM4v6_MOD_PCLE, IF_REAL, "Cross-term dependence of cle"),
|
||||
IOP( "palpha0", BSIM4v6_MOD_PALPHA0, IF_REAL, "Cross-term dependence of alpha0"),
|
||||
IOP( "palpha1", BSIM4v6_MOD_PALPHA1, IF_REAL, "Cross-term dependence of alpha1"),
|
||||
IOP( "pbeta0", BSIM4v6_MOD_PBETA0, IF_REAL, "Cross-term dependence of beta0"),
|
||||
|
||||
IOP( "pagidl", BSIM4v6_MOD_PAGIDL, IF_REAL, "Cross-term dependence of agidl"),
|
||||
IOP( "pbgidl", BSIM4v6_MOD_PBGIDL, IF_REAL, "Cross-term dependence of bgidl"),
|
||||
IOP( "pcgidl", BSIM4v6_MOD_PCGIDL, IF_REAL, "Cross-term dependence of cgidl"),
|
||||
IOP( "pegidl", BSIM4v6_MOD_PEGIDL, IF_REAL, "Cross-term dependence of egidl"),
|
||||
IOP( "pagisl", BSIM4v6_MOD_PAGISL, IF_REAL, "Cross-term dependence of agisl"),
|
||||
IOP( "pbgisl", BSIM4v6_MOD_PBGISL, IF_REAL, "Cross-term dependence of bgisl"),
|
||||
IOP( "pcgisl", BSIM4v6_MOD_PCGISL, IF_REAL, "Cross-term dependence of cgisl"),
|
||||
IOP( "pegisl", BSIM4v6_MOD_PEGISL, IF_REAL, "Cross-term dependence of egisl"),
|
||||
IOP( "paigc", BSIM4v6_MOD_PAIGC, IF_REAL, "Cross-term dependence of aigc"),
|
||||
IOP( "pbigc", BSIM4v6_MOD_PBIGC, IF_REAL, "Cross-term dependence of bigc"),
|
||||
IOP( "pcigc", BSIM4v6_MOD_PCIGC, IF_REAL, "Cross-term dependence of cigc"),
|
||||
IOP( "paigsd", BSIM4v6_MOD_PAIGSD, IF_REAL, "Cross-term dependence of aigsd"),
|
||||
IOP( "pbigsd", BSIM4v6_MOD_PBIGSD, IF_REAL, "Cross-term dependence of bigsd"),
|
||||
IOP( "pcigsd", BSIM4v6_MOD_PCIGSD, IF_REAL, "Cross-term dependence of cigsd"),
|
||||
IOP( "paigs", BSIM4v6_MOD_PAIGS, IF_REAL, "Cross-term dependence of aigs"),
|
||||
IOP( "pbigs", BSIM4v6_MOD_PBIGS, IF_REAL, "Cross-term dependence of bigs"),
|
||||
IOP( "pcigs", BSIM4v6_MOD_PCIGS, IF_REAL, "Cross-term dependence of cigs"),
|
||||
IOP( "paigd", BSIM4v6_MOD_PAIGD, IF_REAL, "Cross-term dependence of aigd"),
|
||||
IOP( "pbigd", BSIM4v6_MOD_PBIGD, IF_REAL, "Cross-term dependence of bigd"),
|
||||
IOP( "pcigd", BSIM4v6_MOD_PCIGD, IF_REAL, "Cross-term dependence of cigd"),
|
||||
IOP( "paigbacc", BSIM4v6_MOD_PAIGBACC, IF_REAL, "Cross-term dependence of aigbacc"),
|
||||
IOP( "pbigbacc", BSIM4v6_MOD_PBIGBACC, IF_REAL, "Cross-term dependence of bigbacc"),
|
||||
IOP( "pcigbacc", BSIM4v6_MOD_PCIGBACC, IF_REAL, "Cross-term dependence of cigbacc"),
|
||||
IOP( "paigbinv", BSIM4v6_MOD_PAIGBINV, IF_REAL, "Cross-term dependence of aigbinv"),
|
||||
IOP( "pbigbinv", BSIM4v6_MOD_PBIGBINV, IF_REAL, "Cross-term dependence of bigbinv"),
|
||||
IOP( "pcigbinv", BSIM4v6_MOD_PCIGBINV, IF_REAL, "Cross-term dependence of cigbinv"),
|
||||
IOP( "pnigc", BSIM4v6_MOD_PNIGC, IF_REAL, "Cross-term dependence of nigc"),
|
||||
IOP( "pnigbinv", BSIM4v6_MOD_PNIGBINV, IF_REAL, "Cross-term dependence of nigbinv"),
|
||||
IOP( "pnigbacc", BSIM4v6_MOD_PNIGBACC, IF_REAL, "Cross-term dependence of nigbacc"),
|
||||
IOP( "pntox", BSIM4v6_MOD_PNTOX, IF_REAL, "Cross-term dependence of ntox"),
|
||||
IOP( "peigbinv", BSIM4v6_MOD_PEIGBINV, IF_REAL, "Cross-term dependence for eigbinv"),
|
||||
IOP( "ppigcd", BSIM4v6_MOD_PPIGCD, IF_REAL, "Cross-term dependence for pigcd"),
|
||||
IOP( "ppoxedge", BSIM4v6_MOD_PPOXEDGE, IF_REAL, "Cross-term dependence for poxedge"),
|
||||
IOP( "pvfbcv", BSIM4v6_MOD_PVFBCV, IF_REAL, "Cross-term dependence of vfbcv"),
|
||||
IOP( "pvfb", BSIM4v6_MOD_PVFB, IF_REAL, "Cross-term dependence of vfb"),
|
||||
IOP( "pacde", BSIM4v6_MOD_PACDE, IF_REAL, "Cross-term dependence of acde"),
|
||||
IOP( "pmoin", BSIM4v6_MOD_PMOIN, IF_REAL, "Cross-term dependence of moin"),
|
||||
IOP( "pnoff", BSIM4v6_MOD_PNOFF, IF_REAL, "Cross-term dependence of noff"),
|
||||
IOP( "pvoffcv", BSIM4v6_MOD_PVOFFCV, IF_REAL, "Cross-term dependence of voffcv"),
|
||||
IOP( "pxrcrg1", BSIM4v6_MOD_PXRCRG1, IF_REAL, "Cross-term dependence of xrcrg1"),
|
||||
IOP( "pxrcrg2", BSIM4v6_MOD_PXRCRG2, IF_REAL, "Cross-term dependence of xrcrg2"),
|
||||
IOP( "plambda", BSIM4v6_MOD_PLAMBDA, IF_REAL, "Cross-term dependence of lambda"),
|
||||
IOP( "pvtl", BSIM4v6_MOD_PVTL, IF_REAL, "Cross-term dependence of vtl"),
|
||||
IOP( "pxn", BSIM4v6_MOD_PXN, IF_REAL, "Cross-term dependence of xn"),
|
||||
IOP( "peu", BSIM4v6_MOD_PEU, IF_REAL, "Cross-term dependence of eu"),
|
||||
IOP( "pucs", BSIM4v6_MOD_PUCS, IF_REAL, "Cross-term dependence of ucs"),
|
||||
IOP( "pvfbsdoff", BSIM4v6_MOD_PVFBSDOFF, IF_REAL, "Cross-term dependence of vfbsdoff"),
|
||||
IOP( "ptvfbsdoff", BSIM4v6_MOD_PTVFBSDOFF, IF_REAL, "Cross-term dependence of tvfbsdoff"),
|
||||
IOP( "ptvoff", BSIM4v6_MOD_PTVOFF, IF_REAL, "Cross-term dependence of tvoff"),
|
||||
|
||||
/* stress effect*/
|
||||
IOP( "saref", BSIM4v6_MOD_SAREF, IF_REAL, "Reference distance between OD edge to poly of one side"),
|
||||
IOP( "sbref", BSIM4v6_MOD_SBREF, IF_REAL, "Reference distance between OD edge to poly of the other side"),
|
||||
IOP( "wlod", BSIM4v6_MOD_WLOD, IF_REAL, "Width parameter for stress effect"),
|
||||
IOP( "ku0", BSIM4v6_MOD_KU0, IF_REAL, "Mobility degradation/enhancement coefficient for LOD"),
|
||||
IOP( "kvsat", BSIM4v6_MOD_KVSAT, IF_REAL, "Saturation velocity degradation/enhancement parameter for LOD"),
|
||||
IOP( "kvth0", BSIM4v6_MOD_KVTH0, IF_REAL, "Threshold degradation/enhancement parameter for LOD"),
|
||||
IOP( "tku0", BSIM4v6_MOD_TKU0, IF_REAL, "Temperature coefficient of KU0"),
|
||||
IOP( "llodku0", BSIM4v6_MOD_LLODKU0, IF_REAL, "Length parameter for u0 LOD effect"),
|
||||
IOP( "wlodku0", BSIM4v6_MOD_WLODKU0, IF_REAL, "Width parameter for u0 LOD effect"),
|
||||
IOP( "llodvth", BSIM4v6_MOD_LLODVTH, IF_REAL, "Length parameter for vth LOD effect"),
|
||||
IOP( "wlodvth", BSIM4v6_MOD_WLODVTH, IF_REAL, "Width parameter for vth LOD effect"),
|
||||
IOP( "lku0", BSIM4v6_MOD_LKU0, IF_REAL, "Length dependence of ku0"),
|
||||
IOP( "wku0", BSIM4v6_MOD_WKU0, IF_REAL, "Width dependence of ku0"),
|
||||
IOP( "pku0", BSIM4v6_MOD_PKU0, IF_REAL, "Cross-term dependence of ku0"),
|
||||
IOP( "lkvth0", BSIM4v6_MOD_LKVTH0, IF_REAL, "Length dependence of kvth0"),
|
||||
IOP( "wkvth0", BSIM4v6_MOD_WKVTH0, IF_REAL, "Width dependence of kvth0"),
|
||||
IOP( "pkvth0", BSIM4v6_MOD_PKVTH0, IF_REAL, "Cross-term dependence of kvth0"),
|
||||
IOP( "stk2", BSIM4v6_MOD_STK2, IF_REAL, "K2 shift factor related to stress effect on vth"),
|
||||
IOP( "lodk2", BSIM4v6_MOD_LODK2, IF_REAL, "K2 shift modification factor for stress effect"),
|
||||
IOP( "steta0", BSIM4v6_MOD_STETA0, IF_REAL, "eta0 shift factor related to stress effect on vth"),
|
||||
IOP( "lodeta0", BSIM4v6_MOD_LODETA0, IF_REAL, "eta0 shift modification factor for stress effect"),
|
||||
/* Well Proximity Effect */
|
||||
IOP( "web", BSIM4v6_MOD_WEB, IF_REAL, "Coefficient for SCB"),
|
||||
IOP( "wec", BSIM4v6_MOD_WEC, IF_REAL, "Coefficient for SCC"),
|
||||
IOP( "kvth0we", BSIM4v6_MOD_KVTH0WE, IF_REAL, "Threshold shift factor for well proximity effect"),
|
||||
IOP( "k2we", BSIM4v6_MOD_K2WE, IF_REAL, " K2 shift factor for well proximity effect "),
|
||||
IOP( "ku0we", BSIM4v6_MOD_KU0WE, IF_REAL, " Mobility degradation factor for well proximity effect "),
|
||||
IOP( "scref", BSIM4v6_MOD_SCREF, IF_REAL, " Reference distance to calculate SCA, SCB and SCC"),
|
||||
IOP( "wpemod", BSIM4v6_MOD_WPEMOD, IF_REAL, " Flag for WPE model (WPEMOD=1 to activate this model) "),
|
||||
IOP( "lkvth0we", BSIM4v6_MOD_LKVTH0WE, IF_REAL, "Length dependence of kvth0we"),
|
||||
IOP( "lk2we", BSIM4v6_MOD_LK2WE, IF_REAL, " Length dependence of k2we "),
|
||||
IOP( "lku0we", BSIM4v6_MOD_LKU0WE, IF_REAL, " Length dependence of ku0we "),
|
||||
IOP( "wkvth0we", BSIM4v6_MOD_WKVTH0WE, IF_REAL, "Width dependence of kvth0we"),
|
||||
IOP( "wk2we", BSIM4v6_MOD_WK2WE, IF_REAL, " Width dependence of k2we "),
|
||||
IOP( "wku0we", BSIM4v6_MOD_WKU0WE, IF_REAL, " Width dependence of ku0we "),
|
||||
IOP( "pkvth0we", BSIM4v6_MOD_PKVTH0WE, IF_REAL, "Cross-term dependence of kvth0we"),
|
||||
IOP( "pk2we", BSIM4v6_MOD_PK2WE, IF_REAL, " Cross-term dependence of k2we "),
|
||||
IOP( "pku0we", BSIM4v6_MOD_PKU0WE, IF_REAL, " Cross-term dependence of ku0we "),
|
||||
|
||||
IOP( "noia", BSIM4v6_MOD_NOIA, IF_REAL, "Flicker noise parameter"),
|
||||
IOP( "noib", BSIM4v6_MOD_NOIB, IF_REAL, "Flicker noise parameter"),
|
||||
IOP( "noic", BSIM4v6_MOD_NOIC, IF_REAL, "Flicker noise parameter"),
|
||||
IOP( "tnoia", BSIM4v6_MOD_TNOIA, IF_REAL, "Thermal noise parameter"),
|
||||
IOP( "tnoib", BSIM4v6_MOD_TNOIB, IF_REAL, "Thermal noise parameter"),
|
||||
IOP( "rnoia", BSIM4v6_MOD_RNOIA, IF_REAL, "Thermal noise coefficient"),
|
||||
IOP( "rnoib", BSIM4v6_MOD_RNOIB, IF_REAL, "Thermal noise coefficient"),
|
||||
IOP( "ntnoi", BSIM4v6_MOD_NTNOI, IF_REAL, "Thermal noise parameter"),
|
||||
IOP( "em", BSIM4v6_MOD_EM, IF_REAL, "Flicker noise parameter"),
|
||||
IOP( "ef", BSIM4v6_MOD_EF, IF_REAL, "Flicker noise frequency exponent"),
|
||||
IOP( "af", BSIM4v6_MOD_AF, IF_REAL, "Flicker noise exponent"),
|
||||
IOP( "kf", BSIM4v6_MOD_KF, IF_REAL, "Flicker noise coefficient"),
|
||||
|
||||
IP( "nmos", BSIM4v6_MOD_NMOS, IF_FLAG, "Flag to indicate NMOS"),
|
||||
IP( "pmos", BSIM4v6_MOD_PMOS, IF_FLAG, "Flag to indicate PMOS"),
|
||||
};
|
||||
|
||||
char *BSIM4v6names[] = {
|
||||
"Drain",
|
||||
"Gate",
|
||||
"Source",
|
||||
"Bulk",
|
||||
"Charge"
|
||||
};
|
||||
|
||||
int BSIM4v6nSize = NUMELEMS(BSIM4v6names);
|
||||
int BSIM4v6pTSize = NUMELEMS(BSIM4v6pTable);
|
||||
int BSIM4v6mPTSize = NUMELEMS(BSIM4v6mPTable);
|
||||
int BSIM4v6iSize = sizeof(BSIM4v6instance);
|
||||
int BSIM4v6mSize = sizeof(BSIM4v6model);
|
||||
|
|
@ -0,0 +1,673 @@
|
|||
/**** BSIM4.6.2 Released by Wenwei Yang 07/31/2008 ****/
|
||||
|
||||
/**********
|
||||
* Copyright 2006 Regents of the University of California. All rights reserved.
|
||||
* File: b4acld.c of BSIM4.6.2.
|
||||
* Author: 2000 Weidong Liu
|
||||
* Authors: 2001- Xuemei Xi, Mohan Dunga, Ali Niknejad, Chenming Hu.
|
||||
* Authors: 2006- Mohan Dunga, Ali Niknejad, Chenming Hu
|
||||
* Authors: 2007- Mohan Dunga, Wenwei Yang, Ali Niknejad, Chenming Hu
|
||||
* Project Director: Prof. Chenming Hu.
|
||||
* Modified by Xuemei Xi, 10/05/2001.
|
||||
**********/
|
||||
|
||||
#include "ngspice.h"
|
||||
#include "cktdefs.h"
|
||||
#include "bsim4v6def.h"
|
||||
#include "sperror.h"
|
||||
#include "suffix.h"
|
||||
|
||||
|
||||
int
|
||||
BSIM4v6acLoad(
|
||||
GENmodel *inModel,
|
||||
CKTcircuit *ckt)
|
||||
{
|
||||
BSIM4v6model *model = (BSIM4v6model*)inModel;
|
||||
BSIM4v6instance *here;
|
||||
|
||||
double gjbd, gjbs, geltd, gcrg, gcrgg, gcrgd, gcrgs, gcrgb;
|
||||
double xcbgb, xcbdb, xcbsb, xcbbb;
|
||||
double xcggbr, xcgdbr, xcgsbr, xcgbbr, xcggbi, xcgdbi, xcgsbi, xcgbbi;
|
||||
double Cggr, Cgdr, Cgsr, Cgbr, Cggi, Cgdi, Cgsi, Cgbi;
|
||||
double xcddbr, xcdgbr, xcdsbr, xcdbbr, xcsdbr, xcsgbr, xcssbr, xcsbbr;
|
||||
double xcddbi, xcdgbi, xcdsbi, xcdbbi, xcsdbi, xcsgbi, xcssbi, xcsbbi;
|
||||
double xcdbdb, xcsbsb=0.0, xcgmgmb=0.0, xcgmdb=0.0, xcgmsb=0.0, xcdgmb, xcsgmb;
|
||||
double xcgmbb=0.0, xcbgmb;
|
||||
double capbd, capbs, omega;
|
||||
double gstot, gstotd, gstotg, gstots, gstotb, gspr;
|
||||
double gdtot, gdtotd, gdtotg, gdtots, gdtotb, gdpr;
|
||||
double gIstotg, gIstotd, gIstots, gIstotb;
|
||||
double gIdtotg, gIdtotd, gIdtots, gIdtotb;
|
||||
double gIbtotg, gIbtotd, gIbtots, gIbtotb;
|
||||
double gIgtotg, gIgtotd, gIgtots, gIgtotb;
|
||||
double cgso, cgdo, cgbo;
|
||||
double gbspsp, gbbdp, gbbsp, gbspg, gbspb;
|
||||
double gbspdp, gbdpdp, gbdpg, gbdpb, gbdpsp;
|
||||
double T0=0.0, T1, T2, T3;
|
||||
double Csg, Csd, Css;
|
||||
double Cdgr, Cddr, Cdsr, Cdbr, Csgr, Csdr, Cssr, Csbr;
|
||||
double Cdgi, Cddi, Cdsi, Cdbi, Csgi, Csdi, Cssi, Csbi;
|
||||
double gmr, gmi, gmbsr, gmbsi, gdsr, gdsi;
|
||||
double FwdSumr, RevSumr, Gmr, Gmbsr;
|
||||
double FwdSumi, RevSumi, Gmi, Gmbsi;
|
||||
struct bsim4v6SizeDependParam *pParam;
|
||||
double ggidld, ggidlg, ggidlb, ggislg, ggislb, ggisls;
|
||||
|
||||
double m;
|
||||
|
||||
omega = ckt->CKTomega;
|
||||
for (; model != NULL; model = model->BSIM4v6nextModel)
|
||||
{ for (here = model->BSIM4v6instances; here!= NULL;
|
||||
here = here->BSIM4v6nextInstance)
|
||||
{ if (here->BSIM4v6owner != ARCHme) continue;
|
||||
pParam = here->pParam;
|
||||
capbd = here->BSIM4v6capbd;
|
||||
capbs = here->BSIM4v6capbs;
|
||||
cgso = here->BSIM4v6cgso;
|
||||
cgdo = here->BSIM4v6cgdo;
|
||||
cgbo = pParam->BSIM4v6cgbo;
|
||||
|
||||
Csd = -(here->BSIM4v6cddb + here->BSIM4v6cgdb + here->BSIM4v6cbdb);
|
||||
Csg = -(here->BSIM4v6cdgb + here->BSIM4v6cggb + here->BSIM4v6cbgb);
|
||||
Css = -(here->BSIM4v6cdsb + here->BSIM4v6cgsb + here->BSIM4v6cbsb);
|
||||
|
||||
if (here->BSIM4v6acnqsMod)
|
||||
{ T0 = omega * here->BSIM4v6taunet;
|
||||
T1 = T0 * T0;
|
||||
T2 = 1.0 / (1.0 + T1);
|
||||
T3 = T0 * T2;
|
||||
|
||||
gmr = here->BSIM4v6gm * T2;
|
||||
gmbsr = here->BSIM4v6gmbs * T2;
|
||||
gdsr = here->BSIM4v6gds * T2;
|
||||
|
||||
gmi = -here->BSIM4v6gm * T3;
|
||||
gmbsi = -here->BSIM4v6gmbs * T3;
|
||||
gdsi = -here->BSIM4v6gds * T3;
|
||||
|
||||
Cddr = here->BSIM4v6cddb * T2;
|
||||
Cdgr = here->BSIM4v6cdgb * T2;
|
||||
Cdsr = here->BSIM4v6cdsb * T2;
|
||||
Cdbr = -(Cddr + Cdgr + Cdsr);
|
||||
|
||||
/* WDLiu: Cxyi mulitplied by jomega below, and actually to be of conductance */
|
||||
Cddi = here->BSIM4v6cddb * T3 * omega;
|
||||
Cdgi = here->BSIM4v6cdgb * T3 * omega;
|
||||
Cdsi = here->BSIM4v6cdsb * T3 * omega;
|
||||
Cdbi = -(Cddi + Cdgi + Cdsi);
|
||||
|
||||
Csdr = Csd * T2;
|
||||
Csgr = Csg * T2;
|
||||
Cssr = Css * T2;
|
||||
Csbr = -(Csdr + Csgr + Cssr);
|
||||
|
||||
Csdi = Csd * T3 * omega;
|
||||
Csgi = Csg * T3 * omega;
|
||||
Cssi = Css * T3 * omega;
|
||||
Csbi = -(Csdi + Csgi + Cssi);
|
||||
|
||||
Cgdr = -(Cddr + Csdr + here->BSIM4v6cbdb);
|
||||
Cggr = -(Cdgr + Csgr + here->BSIM4v6cbgb);
|
||||
Cgsr = -(Cdsr + Cssr + here->BSIM4v6cbsb);
|
||||
Cgbr = -(Cgdr + Cggr + Cgsr);
|
||||
|
||||
Cgdi = -(Cddi + Csdi);
|
||||
Cggi = -(Cdgi + Csgi);
|
||||
Cgsi = -(Cdsi + Cssi);
|
||||
Cgbi = -(Cgdi + Cggi + Cgsi);
|
||||
}
|
||||
else /* QS */
|
||||
{ gmr = here->BSIM4v6gm;
|
||||
gmbsr = here->BSIM4v6gmbs;
|
||||
gdsr = here->BSIM4v6gds;
|
||||
gmi = gmbsi = gdsi = 0.0;
|
||||
|
||||
Cddr = here->BSIM4v6cddb;
|
||||
Cdgr = here->BSIM4v6cdgb;
|
||||
Cdsr = here->BSIM4v6cdsb;
|
||||
Cdbr = -(Cddr + Cdgr + Cdsr);
|
||||
Cddi = Cdgi = Cdsi = Cdbi = 0.0;
|
||||
|
||||
Csdr = Csd;
|
||||
Csgr = Csg;
|
||||
Cssr = Css;
|
||||
Csbr = -(Csdr + Csgr + Cssr);
|
||||
Csdi = Csgi = Cssi = Csbi = 0.0;
|
||||
|
||||
Cgdr = here->BSIM4v6cgdb;
|
||||
Cggr = here->BSIM4v6cggb;
|
||||
Cgsr = here->BSIM4v6cgsb;
|
||||
Cgbr = -(Cgdr + Cggr + Cgsr);
|
||||
Cgdi = Cggi = Cgsi = Cgbi = 0.0;
|
||||
}
|
||||
|
||||
|
||||
if (here->BSIM4v6mode >= 0)
|
||||
{ Gmr = gmr;
|
||||
Gmbsr = gmbsr;
|
||||
FwdSumr = Gmr + Gmbsr;
|
||||
RevSumr = 0.0;
|
||||
Gmi = gmi;
|
||||
Gmbsi = gmbsi;
|
||||
FwdSumi = Gmi + Gmbsi;
|
||||
RevSumi = 0.0;
|
||||
|
||||
gbbdp = -(here->BSIM4v6gbds);
|
||||
gbbsp = here->BSIM4v6gbds + here->BSIM4v6gbgs + here->BSIM4v6gbbs;
|
||||
gbdpg = here->BSIM4v6gbgs;
|
||||
gbdpdp = here->BSIM4v6gbds;
|
||||
gbdpb = here->BSIM4v6gbbs;
|
||||
gbdpsp = -(gbdpg + gbdpdp + gbdpb);
|
||||
|
||||
gbspdp = 0.0;
|
||||
gbspg = 0.0;
|
||||
gbspb = 0.0;
|
||||
gbspsp = 0.0;
|
||||
|
||||
if (model->BSIM4v6igcMod)
|
||||
{ gIstotg = here->BSIM4v6gIgsg + here->BSIM4v6gIgcsg;
|
||||
gIstotd = here->BSIM4v6gIgcsd;
|
||||
gIstots = here->BSIM4v6gIgss + here->BSIM4v6gIgcss;
|
||||
gIstotb = here->BSIM4v6gIgcsb;
|
||||
|
||||
gIdtotg = here->BSIM4v6gIgdg + here->BSIM4v6gIgcdg;
|
||||
gIdtotd = here->BSIM4v6gIgdd + here->BSIM4v6gIgcdd;
|
||||
gIdtots = here->BSIM4v6gIgcds;
|
||||
gIdtotb = here->BSIM4v6gIgcdb;
|
||||
}
|
||||
else
|
||||
{ gIstotg = gIstotd = gIstots = gIstotb = 0.0;
|
||||
gIdtotg = gIdtotd = gIdtots = gIdtotb = 0.0;
|
||||
}
|
||||
|
||||
if (model->BSIM4v6igbMod)
|
||||
{ gIbtotg = here->BSIM4v6gIgbg;
|
||||
gIbtotd = here->BSIM4v6gIgbd;
|
||||
gIbtots = here->BSIM4v6gIgbs;
|
||||
gIbtotb = here->BSIM4v6gIgbb;
|
||||
}
|
||||
else
|
||||
gIbtotg = gIbtotd = gIbtots = gIbtotb = 0.0;
|
||||
|
||||
if ((model->BSIM4v6igcMod != 0) || (model->BSIM4v6igbMod != 0))
|
||||
{ gIgtotg = gIstotg + gIdtotg + gIbtotg;
|
||||
gIgtotd = gIstotd + gIdtotd + gIbtotd ;
|
||||
gIgtots = gIstots + gIdtots + gIbtots;
|
||||
gIgtotb = gIstotb + gIdtotb + gIbtotb;
|
||||
}
|
||||
else
|
||||
gIgtotg = gIgtotd = gIgtots = gIgtotb = 0.0;
|
||||
|
||||
if (here->BSIM4v6rgateMod == 2)
|
||||
T0 = *(ckt->CKTstates[0] + here->BSIM4v6vges)
|
||||
- *(ckt->CKTstates[0] + here->BSIM4v6vgs);
|
||||
else if (here->BSIM4v6rgateMod == 3)
|
||||
T0 = *(ckt->CKTstates[0] + here->BSIM4v6vgms)
|
||||
- *(ckt->CKTstates[0] + here->BSIM4v6vgs);
|
||||
if (here->BSIM4v6rgateMod > 1)
|
||||
{ gcrgd = here->BSIM4v6gcrgd * T0;
|
||||
gcrgg = here->BSIM4v6gcrgg * T0;
|
||||
gcrgs = here->BSIM4v6gcrgs * T0;
|
||||
gcrgb = here->BSIM4v6gcrgb * T0;
|
||||
gcrgg -= here->BSIM4v6gcrg;
|
||||
gcrg = here->BSIM4v6gcrg;
|
||||
}
|
||||
else
|
||||
gcrg = gcrgd = gcrgg = gcrgs = gcrgb = 0.0;
|
||||
|
||||
if (here->BSIM4v6rgateMod == 3)
|
||||
{ xcgmgmb = (cgdo + cgso + pParam->BSIM4v6cgbo) * omega;
|
||||
xcgmdb = -cgdo * omega;
|
||||
xcgmsb = -cgso * omega;
|
||||
xcgmbb = -pParam->BSIM4v6cgbo * omega;
|
||||
|
||||
xcdgmb = xcgmdb;
|
||||
xcsgmb = xcgmsb;
|
||||
xcbgmb = xcgmbb;
|
||||
|
||||
xcggbr = Cggr * omega;
|
||||
xcgdbr = Cgdr * omega;
|
||||
xcgsbr = Cgsr * omega;
|
||||
xcgbbr = -(xcggbr + xcgdbr + xcgsbr);
|
||||
|
||||
xcdgbr = Cdgr * omega;
|
||||
xcsgbr = Csgr * omega;
|
||||
xcbgb = here->BSIM4v6cbgb * omega;
|
||||
}
|
||||
else
|
||||
{ xcggbr = (Cggr + cgdo + cgso + pParam->BSIM4v6cgbo ) * omega;
|
||||
xcgdbr = (Cgdr - cgdo) * omega;
|
||||
xcgsbr = (Cgsr - cgso) * omega;
|
||||
xcgbbr = -(xcggbr + xcgdbr + xcgsbr);
|
||||
|
||||
xcdgbr = (Cdgr - cgdo) * omega;
|
||||
xcsgbr = (Csgr - cgso) * omega;
|
||||
xcbgb = (here->BSIM4v6cbgb - pParam->BSIM4v6cgbo) * omega;
|
||||
|
||||
xcdgmb = xcsgmb = xcbgmb = 0.0;
|
||||
}
|
||||
xcddbr = (Cddr + here->BSIM4v6capbd + cgdo) * omega;
|
||||
xcdsbr = Cdsr * omega;
|
||||
xcsdbr = Csdr * omega;
|
||||
xcssbr = (here->BSIM4v6capbs + cgso + Cssr) * omega;
|
||||
|
||||
if (!here->BSIM4v6rbodyMod)
|
||||
{ xcdbbr = -(xcdgbr + xcddbr + xcdsbr + xcdgmb);
|
||||
xcsbbr = -(xcsgbr + xcsdbr + xcssbr + xcsgmb);
|
||||
|
||||
xcbdb = (here->BSIM4v6cbdb - here->BSIM4v6capbd) * omega;
|
||||
xcbsb = (here->BSIM4v6cbsb - here->BSIM4v6capbs) * omega;
|
||||
xcdbdb = 0.0;
|
||||
}
|
||||
else
|
||||
{ xcdbbr = Cdbr * omega;
|
||||
xcsbbr = -(xcsgbr + xcsdbr + xcssbr + xcsgmb)
|
||||
+ here->BSIM4v6capbs * omega;
|
||||
|
||||
xcbdb = here->BSIM4v6cbdb * omega;
|
||||
xcbsb = here->BSIM4v6cbsb * omega;
|
||||
|
||||
xcdbdb = -here->BSIM4v6capbd * omega;
|
||||
xcsbsb = -here->BSIM4v6capbs * omega;
|
||||
}
|
||||
xcbbb = -(xcbdb + xcbgb + xcbsb + xcbgmb);
|
||||
|
||||
xcdgbi = Cdgi;
|
||||
xcsgbi = Csgi;
|
||||
xcddbi = Cddi;
|
||||
xcdsbi = Cdsi;
|
||||
xcsdbi = Csdi;
|
||||
xcssbi = Cssi;
|
||||
xcdbbi = Cdbi;
|
||||
xcsbbi = Csbi;
|
||||
xcggbi = Cggi;
|
||||
xcgdbi = Cgdi;
|
||||
xcgsbi = Cgsi;
|
||||
xcgbbi = Cgbi;
|
||||
}
|
||||
else /* Reverse mode */
|
||||
{ Gmr = -gmr;
|
||||
Gmbsr = -gmbsr;
|
||||
FwdSumr = 0.0;
|
||||
RevSumr = -(Gmr + Gmbsr);
|
||||
Gmi = -gmi;
|
||||
Gmbsi = -gmbsi;
|
||||
FwdSumi = 0.0;
|
||||
RevSumi = -(Gmi + Gmbsi);
|
||||
|
||||
gbbsp = -(here->BSIM4v6gbds);
|
||||
gbbdp = here->BSIM4v6gbds + here->BSIM4v6gbgs + here->BSIM4v6gbbs;
|
||||
|
||||
gbdpg = 0.0;
|
||||
gbdpsp = 0.0;
|
||||
gbdpb = 0.0;
|
||||
gbdpdp = 0.0;
|
||||
|
||||
gbspg = here->BSIM4v6gbgs;
|
||||
gbspsp = here->BSIM4v6gbds;
|
||||
gbspb = here->BSIM4v6gbbs;
|
||||
gbspdp = -(gbspg + gbspsp + gbspb);
|
||||
|
||||
if (model->BSIM4v6igcMod)
|
||||
{ gIstotg = here->BSIM4v6gIgsg + here->BSIM4v6gIgcdg;
|
||||
gIstotd = here->BSIM4v6gIgcds;
|
||||
gIstots = here->BSIM4v6gIgss + here->BSIM4v6gIgcdd;
|
||||
gIstotb = here->BSIM4v6gIgcdb;
|
||||
|
||||
gIdtotg = here->BSIM4v6gIgdg + here->BSIM4v6gIgcsg;
|
||||
gIdtotd = here->BSIM4v6gIgdd + here->BSIM4v6gIgcss;
|
||||
gIdtots = here->BSIM4v6gIgcsd;
|
||||
gIdtotb = here->BSIM4v6gIgcsb;
|
||||
}
|
||||
else
|
||||
{ gIstotg = gIstotd = gIstots = gIstotb = 0.0;
|
||||
gIdtotg = gIdtotd = gIdtots = gIdtotb = 0.0;
|
||||
}
|
||||
|
||||
if (model->BSIM4v6igbMod)
|
||||
{ gIbtotg = here->BSIM4v6gIgbg;
|
||||
gIbtotd = here->BSIM4v6gIgbs;
|
||||
gIbtots = here->BSIM4v6gIgbd;
|
||||
gIbtotb = here->BSIM4v6gIgbb;
|
||||
}
|
||||
else
|
||||
gIbtotg = gIbtotd = gIbtots = gIbtotb = 0.0;
|
||||
|
||||
if ((model->BSIM4v6igcMod != 0) || (model->BSIM4v6igbMod != 0))
|
||||
{ gIgtotg = gIstotg + gIdtotg + gIbtotg;
|
||||
gIgtotd = gIstotd + gIdtotd + gIbtotd ;
|
||||
gIgtots = gIstots + gIdtots + gIbtots;
|
||||
gIgtotb = gIstotb + gIdtotb + gIbtotb;
|
||||
}
|
||||
else
|
||||
gIgtotg = gIgtotd = gIgtots = gIgtotb = 0.0;
|
||||
|
||||
if (here->BSIM4v6rgateMod == 2)
|
||||
T0 = *(ckt->CKTstates[0] + here->BSIM4v6vges)
|
||||
- *(ckt->CKTstates[0] + here->BSIM4v6vgs);
|
||||
else if (here->BSIM4v6rgateMod == 3)
|
||||
T0 = *(ckt->CKTstates[0] + here->BSIM4v6vgms)
|
||||
- *(ckt->CKTstates[0] + here->BSIM4v6vgs);
|
||||
if (here->BSIM4v6rgateMod > 1)
|
||||
{ gcrgd = here->BSIM4v6gcrgs * T0;
|
||||
gcrgg = here->BSIM4v6gcrgg * T0;
|
||||
gcrgs = here->BSIM4v6gcrgd * T0;
|
||||
gcrgb = here->BSIM4v6gcrgb * T0;
|
||||
gcrgg -= here->BSIM4v6gcrg;
|
||||
gcrg = here->BSIM4v6gcrg;
|
||||
}
|
||||
else
|
||||
gcrg = gcrgd = gcrgg = gcrgs = gcrgb = 0.0;
|
||||
|
||||
if (here->BSIM4v6rgateMod == 3)
|
||||
{ xcgmgmb = (cgdo + cgso + pParam->BSIM4v6cgbo) * omega;
|
||||
xcgmdb = -cgdo * omega;
|
||||
xcgmsb = -cgso * omega;
|
||||
xcgmbb = -pParam->BSIM4v6cgbo * omega;
|
||||
|
||||
xcdgmb = xcgmdb;
|
||||
xcsgmb = xcgmsb;
|
||||
xcbgmb = xcgmbb;
|
||||
|
||||
xcggbr = Cggr * omega;
|
||||
xcgdbr = Cgsr * omega;
|
||||
xcgsbr = Cgdr * omega;
|
||||
xcgbbr = -(xcggbr + xcgdbr + xcgsbr);
|
||||
|
||||
xcdgbr = Csgr * omega;
|
||||
xcsgbr = Cdgr * omega;
|
||||
xcbgb = here->BSIM4v6cbgb * omega;
|
||||
}
|
||||
else
|
||||
{ xcggbr = (Cggr + cgdo + cgso + pParam->BSIM4v6cgbo ) * omega;
|
||||
xcgdbr = (Cgsr - cgdo) * omega;
|
||||
xcgsbr = (Cgdr - cgso) * omega;
|
||||
xcgbbr = -(xcggbr + xcgdbr + xcgsbr);
|
||||
|
||||
xcdgbr = (Csgr - cgdo) * omega;
|
||||
xcsgbr = (Cdgr - cgso) * omega;
|
||||
xcbgb = (here->BSIM4v6cbgb - pParam->BSIM4v6cgbo) * omega;
|
||||
|
||||
xcdgmb = xcsgmb = xcbgmb = 0.0;
|
||||
}
|
||||
xcddbr = (here->BSIM4v6capbd + cgdo + Cssr) * omega;
|
||||
xcdsbr = Csdr * omega;
|
||||
xcsdbr = Cdsr * omega;
|
||||
xcssbr = (Cddr + here->BSIM4v6capbs + cgso) * omega;
|
||||
|
||||
if (!here->BSIM4v6rbodyMod)
|
||||
{ xcdbbr = -(xcdgbr + xcddbr + xcdsbr + xcdgmb);
|
||||
xcsbbr = -(xcsgbr + xcsdbr + xcssbr + xcsgmb);
|
||||
|
||||
xcbdb = (here->BSIM4v6cbsb - here->BSIM4v6capbd) * omega;
|
||||
xcbsb = (here->BSIM4v6cbdb - here->BSIM4v6capbs) * omega;
|
||||
xcdbdb = 0.0;
|
||||
}
|
||||
else
|
||||
{ xcdbbr = -(xcdgbr + xcddbr + xcdsbr + xcdgmb)
|
||||
+ here->BSIM4v6capbd * omega;
|
||||
xcsbbr = Cdbr * omega;
|
||||
|
||||
xcbdb = here->BSIM4v6cbsb * omega;
|
||||
xcbsb = here->BSIM4v6cbdb * omega;
|
||||
xcdbdb = -here->BSIM4v6capbd * omega;
|
||||
xcsbsb = -here->BSIM4v6capbs * omega;
|
||||
}
|
||||
xcbbb = -(xcbgb + xcbdb + xcbsb + xcbgmb);
|
||||
|
||||
xcdgbi = Csgi;
|
||||
xcsgbi = Cdgi;
|
||||
xcddbi = Cssi;
|
||||
xcdsbi = Csdi;
|
||||
xcsdbi = Cdsi;
|
||||
xcssbi = Cddi;
|
||||
xcdbbi = Csbi;
|
||||
xcsbbi = Cdbi;
|
||||
xcggbi = Cggi;
|
||||
xcgdbi = Cgsi;
|
||||
xcgsbi = Cgdi;
|
||||
xcgbbi = Cgbi;
|
||||
}
|
||||
|
||||
if (model->BSIM4v6rdsMod == 1)
|
||||
{ gstot = here->BSIM4v6gstot;
|
||||
gstotd = here->BSIM4v6gstotd;
|
||||
gstotg = here->BSIM4v6gstotg;
|
||||
gstots = here->BSIM4v6gstots - gstot;
|
||||
gstotb = here->BSIM4v6gstotb;
|
||||
|
||||
gdtot = here->BSIM4v6gdtot;
|
||||
gdtotd = here->BSIM4v6gdtotd - gdtot;
|
||||
gdtotg = here->BSIM4v6gdtotg;
|
||||
gdtots = here->BSIM4v6gdtots;
|
||||
gdtotb = here->BSIM4v6gdtotb;
|
||||
}
|
||||
else
|
||||
{ gstot = gstotd = gstotg = gstots = gstotb = 0.0;
|
||||
gdtot = gdtotd = gdtotg = gdtots = gdtotb = 0.0;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Loading AC matrix
|
||||
*/
|
||||
m = here->BSIM4v6m;
|
||||
|
||||
if (!model->BSIM4v6rdsMod)
|
||||
{ gdpr = here->BSIM4v6drainConductance;
|
||||
gspr = here->BSIM4v6sourceConductance;
|
||||
}
|
||||
else
|
||||
gdpr = gspr = 0.0;
|
||||
|
||||
if (!here->BSIM4v6rbodyMod)
|
||||
{ gjbd = here->BSIM4v6gbd;
|
||||
gjbs = here->BSIM4v6gbs;
|
||||
}
|
||||
else
|
||||
gjbd = gjbs = 0.0;
|
||||
|
||||
geltd = here->BSIM4v6grgeltd;
|
||||
|
||||
if (here->BSIM4v6rgateMod == 1)
|
||||
{ *(here->BSIM4v6GEgePtr) += m * geltd;
|
||||
*(here->BSIM4v6GPgePtr) -= m * geltd;
|
||||
*(here->BSIM4v6GEgpPtr) -= m * geltd;
|
||||
|
||||
*(here->BSIM4v6GPgpPtr +1) += m * xcggbr;
|
||||
*(here->BSIM4v6GPgpPtr) += m * (geltd + xcggbi + gIgtotg);
|
||||
*(here->BSIM4v6GPdpPtr +1) += m * xcgdbr;
|
||||
*(here->BSIM4v6GPdpPtr) += m * (xcgdbi + gIgtotd);
|
||||
*(here->BSIM4v6GPspPtr +1) += m * xcgsbr;
|
||||
*(here->BSIM4v6GPspPtr) += m * (xcgsbi + gIgtots);
|
||||
*(here->BSIM4v6GPbpPtr +1) += m * xcgbbr;
|
||||
*(here->BSIM4v6GPbpPtr) += m * (xcgbbi + gIgtotb);
|
||||
} /* WDLiu: gcrg already subtracted from all gcrgg below */
|
||||
else if (here->BSIM4v6rgateMod == 2)
|
||||
{ *(here->BSIM4v6GEgePtr) += m * gcrg;
|
||||
*(here->BSIM4v6GEgpPtr) += m * gcrgg;
|
||||
*(here->BSIM4v6GEdpPtr) += m * gcrgd;
|
||||
*(here->BSIM4v6GEspPtr) += m * gcrgs;
|
||||
*(here->BSIM4v6GEbpPtr) += m * gcrgb;
|
||||
|
||||
*(here->BSIM4v6GPgePtr) -= m * gcrg;
|
||||
*(here->BSIM4v6GPgpPtr +1) += m * xcggbr;
|
||||
*(here->BSIM4v6GPgpPtr) -= m * (gcrgg - xcggbi - gIgtotg);
|
||||
*(here->BSIM4v6GPdpPtr +1) += m * xcgdbr;
|
||||
*(here->BSIM4v6GPdpPtr) -= m * (gcrgd - xcgdbi - gIgtotd);
|
||||
*(here->BSIM4v6GPspPtr +1) += m * xcgsbr;
|
||||
*(here->BSIM4v6GPspPtr) -= m * (gcrgs - xcgsbi - gIgtots);
|
||||
*(here->BSIM4v6GPbpPtr +1) += m * xcgbbr;
|
||||
*(here->BSIM4v6GPbpPtr) -= m * (gcrgb - xcgbbi - gIgtotb);
|
||||
}
|
||||
else if (here->BSIM4v6rgateMod == 3)
|
||||
{ *(here->BSIM4v6GEgePtr) += m * geltd;
|
||||
*(here->BSIM4v6GEgmPtr) -= m * geltd;
|
||||
*(here->BSIM4v6GMgePtr) -= m * geltd;
|
||||
*(here->BSIM4v6GMgmPtr) += m * (geltd + gcrg);
|
||||
*(here->BSIM4v6GMgmPtr +1) += m * xcgmgmb;
|
||||
|
||||
*(here->BSIM4v6GMdpPtr) += m * gcrgd;
|
||||
*(here->BSIM4v6GMdpPtr +1) += m * xcgmdb;
|
||||
*(here->BSIM4v6GMgpPtr) += m * gcrgg;
|
||||
*(here->BSIM4v6GMspPtr) += m * gcrgs;
|
||||
*(here->BSIM4v6GMspPtr +1) += m * xcgmsb;
|
||||
*(here->BSIM4v6GMbpPtr) += m * gcrgb;
|
||||
*(here->BSIM4v6GMbpPtr +1) += m * xcgmbb;
|
||||
|
||||
*(here->BSIM4v6DPgmPtr +1) += m * xcdgmb;
|
||||
*(here->BSIM4v6GPgmPtr) -= m * gcrg;
|
||||
*(here->BSIM4v6SPgmPtr +1) += m * xcsgmb;
|
||||
*(here->BSIM4v6BPgmPtr +1) += m * xcbgmb;
|
||||
|
||||
*(here->BSIM4v6GPgpPtr) -= m * (gcrgg - xcggbi - gIgtotg);
|
||||
*(here->BSIM4v6GPgpPtr +1) += m * xcggbr;
|
||||
*(here->BSIM4v6GPdpPtr) -= m * (gcrgd - xcgdbi - gIgtotd);
|
||||
*(here->BSIM4v6GPdpPtr +1) += m * xcgdbr;
|
||||
*(here->BSIM4v6GPspPtr) -= m * (gcrgs - xcgsbi - gIgtots);
|
||||
*(here->BSIM4v6GPspPtr +1) += m * xcgsbr;
|
||||
*(here->BSIM4v6GPbpPtr) -= m * (gcrgb - xcgbbi - gIgtotb);
|
||||
*(here->BSIM4v6GPbpPtr +1) += m * xcgbbr;
|
||||
}
|
||||
else
|
||||
{ *(here->BSIM4v6GPgpPtr +1) += m * xcggbr;
|
||||
*(here->BSIM4v6GPgpPtr) += m * (xcggbi + gIgtotg);
|
||||
*(here->BSIM4v6GPdpPtr +1) += m * xcgdbr;
|
||||
*(here->BSIM4v6GPdpPtr) += m * (xcgdbi + gIgtotd);
|
||||
*(here->BSIM4v6GPspPtr +1) += m * xcgsbr;
|
||||
*(here->BSIM4v6GPspPtr) += m * (xcgsbi + gIgtots);
|
||||
*(here->BSIM4v6GPbpPtr +1) += m * xcgbbr;
|
||||
*(here->BSIM4v6GPbpPtr) += m * (xcgbbi + gIgtotb);
|
||||
}
|
||||
|
||||
if (model->BSIM4v6rdsMod)
|
||||
{ (*(here->BSIM4v6DgpPtr) += m * gdtotg);
|
||||
(*(here->BSIM4v6DspPtr) += m * gdtots);
|
||||
(*(here->BSIM4v6DbpPtr) += m * gdtotb);
|
||||
(*(here->BSIM4v6SdpPtr) += m * gstotd);
|
||||
(*(here->BSIM4v6SgpPtr) += m * gstotg);
|
||||
(*(here->BSIM4v6SbpPtr) += m * gstotb);
|
||||
}
|
||||
|
||||
*(here->BSIM4v6DPdpPtr +1) += m * (xcddbr + gdsi + RevSumi);
|
||||
*(here->BSIM4v6DPdpPtr) += m * (gdpr + xcddbi + gdsr + here->BSIM4v6gbd
|
||||
- gdtotd + RevSumr + gbdpdp - gIdtotd);
|
||||
*(here->BSIM4v6DPdPtr) -= m * (gdpr + gdtot);
|
||||
*(here->BSIM4v6DPgpPtr +1) += m * (xcdgbr + Gmi);
|
||||
*(here->BSIM4v6DPgpPtr) += m * (Gmr + xcdgbi - gdtotg + gbdpg - gIdtotg);
|
||||
*(here->BSIM4v6DPspPtr +1) += m * (xcdsbr - gdsi - FwdSumi);
|
||||
*(here->BSIM4v6DPspPtr) -= m * (gdsr - xcdsbi + FwdSumr + gdtots - gbdpsp + gIdtots);
|
||||
*(here->BSIM4v6DPbpPtr +1) += m * (xcdbbr + Gmbsi);
|
||||
*(here->BSIM4v6DPbpPtr) -= m * (gjbd + gdtotb - xcdbbi - Gmbsr - gbdpb + gIdtotb);
|
||||
|
||||
*(here->BSIM4v6DdpPtr) -= m * (gdpr - gdtotd);
|
||||
*(here->BSIM4v6DdPtr) += m * (gdpr + gdtot);
|
||||
|
||||
*(here->BSIM4v6SPdpPtr +1) += m * (xcsdbr - gdsi - RevSumi);
|
||||
*(here->BSIM4v6SPdpPtr) -= m * (gdsr - xcsdbi + gstotd + RevSumr - gbspdp + gIstotd);
|
||||
*(here->BSIM4v6SPgpPtr +1) += m * (xcsgbr - Gmi);
|
||||
*(here->BSIM4v6SPgpPtr) -= m * (Gmr - xcsgbi + gstotg - gbspg + gIstotg);
|
||||
*(here->BSIM4v6SPspPtr +1) += m * (xcssbr + gdsi + FwdSumi);
|
||||
*(here->BSIM4v6SPspPtr) += m * (gspr + xcssbi + gdsr + here->BSIM4v6gbs
|
||||
- gstots + FwdSumr + gbspsp - gIstots);
|
||||
*(here->BSIM4v6SPsPtr) -= m * (gspr + gstot);
|
||||
*(here->BSIM4v6SPbpPtr +1) += m * (xcsbbr - Gmbsi);
|
||||
*(here->BSIM4v6SPbpPtr) -= m * (gjbs + gstotb - xcsbbi + Gmbsr - gbspb + gIstotb);
|
||||
|
||||
*(here->BSIM4v6SspPtr) -= m * (gspr - gstots);
|
||||
*(here->BSIM4v6SsPtr) += m * (gspr + gstot);
|
||||
|
||||
*(here->BSIM4v6BPdpPtr +1) += m * xcbdb;
|
||||
*(here->BSIM4v6BPdpPtr) -= m * (gjbd - gbbdp + gIbtotd);
|
||||
*(here->BSIM4v6BPgpPtr +1) += m * xcbgb;
|
||||
*(here->BSIM4v6BPgpPtr) -= m * (here->BSIM4v6gbgs + gIbtotg);
|
||||
*(here->BSIM4v6BPspPtr +1) += m * xcbsb;
|
||||
*(here->BSIM4v6BPspPtr) -= m * (gjbs - gbbsp + gIbtots);
|
||||
*(here->BSIM4v6BPbpPtr +1) += m * xcbbb;
|
||||
*(here->BSIM4v6BPbpPtr) += m * (gjbd + gjbs - here->BSIM4v6gbbs
|
||||
- gIbtotb);
|
||||
ggidld = here->BSIM4v6ggidld;
|
||||
ggidlg = here->BSIM4v6ggidlg;
|
||||
ggidlb = here->BSIM4v6ggidlb;
|
||||
ggislg = here->BSIM4v6ggislg;
|
||||
ggisls = here->BSIM4v6ggisls;
|
||||
ggislb = here->BSIM4v6ggislb;
|
||||
|
||||
/* stamp gidl */
|
||||
(*(here->BSIM4v6DPdpPtr) += m * ggidld);
|
||||
(*(here->BSIM4v6DPgpPtr) += m * ggidlg);
|
||||
(*(here->BSIM4v6DPspPtr) -= m * ((ggidlg + ggidld) + ggidlb));
|
||||
(*(here->BSIM4v6DPbpPtr) += m * ggidlb);
|
||||
(*(here->BSIM4v6BPdpPtr) -= m * ggidld);
|
||||
(*(here->BSIM4v6BPgpPtr) -= m * ggidlg);
|
||||
(*(here->BSIM4v6BPspPtr) += m * ((ggidlg + ggidld) + ggidlb));
|
||||
(*(here->BSIM4v6BPbpPtr) -= m * ggidlb);
|
||||
/* stamp gisl */
|
||||
(*(here->BSIM4v6SPdpPtr) -= m * ((ggisls + ggislg) + ggislb));
|
||||
(*(here->BSIM4v6SPgpPtr) += m * ggislg);
|
||||
(*(here->BSIM4v6SPspPtr) += m * ggisls);
|
||||
(*(here->BSIM4v6SPbpPtr) += m * ggislb);
|
||||
(*(here->BSIM4v6BPdpPtr) += m * ((ggislg + ggisls) + ggislb));
|
||||
(*(here->BSIM4v6BPgpPtr) -= m * ggislg);
|
||||
(*(here->BSIM4v6BPspPtr) -= m * ggisls);
|
||||
(*(here->BSIM4v6BPbpPtr) -= m * ggislb);
|
||||
|
||||
if (here->BSIM4v6rbodyMod)
|
||||
{ (*(here->BSIM4v6DPdbPtr +1) += m * xcdbdb);
|
||||
(*(here->BSIM4v6DPdbPtr) -= m * here->BSIM4v6gbd);
|
||||
(*(here->BSIM4v6SPsbPtr +1) += m * xcsbsb);
|
||||
(*(here->BSIM4v6SPsbPtr) -= m * here->BSIM4v6gbs);
|
||||
|
||||
(*(here->BSIM4v6DBdpPtr +1) += m * xcdbdb);
|
||||
(*(here->BSIM4v6DBdpPtr) -= m * here->BSIM4v6gbd);
|
||||
(*(here->BSIM4v6DBdbPtr +1) -= m * xcdbdb);
|
||||
(*(here->BSIM4v6DBdbPtr) += m * (here->BSIM4v6gbd + here->BSIM4v6grbpd
|
||||
+ here->BSIM4v6grbdb));
|
||||
(*(here->BSIM4v6DBbpPtr) -= m * here->BSIM4v6grbpd);
|
||||
(*(here->BSIM4v6DBbPtr) -= m * here->BSIM4v6grbdb);
|
||||
|
||||
(*(here->BSIM4v6BPdbPtr) -= m * here->BSIM4v6grbpd);
|
||||
(*(here->BSIM4v6BPbPtr) -= m * here->BSIM4v6grbpb);
|
||||
(*(here->BSIM4v6BPsbPtr) -= m * here->BSIM4v6grbps);
|
||||
(*(here->BSIM4v6BPbpPtr) += m * (here->BSIM4v6grbpd + here->BSIM4v6grbps
|
||||
+ here->BSIM4v6grbpb));
|
||||
/* WDLiu: (-here->BSIM4v6gbbs) already added to BPbpPtr */
|
||||
|
||||
(*(here->BSIM4v6SBspPtr +1) += m * xcsbsb);
|
||||
(*(here->BSIM4v6SBspPtr) -= m * here->BSIM4v6gbs);
|
||||
(*(here->BSIM4v6SBbpPtr) -= m * here->BSIM4v6grbps);
|
||||
(*(here->BSIM4v6SBbPtr) -= m * here->BSIM4v6grbsb);
|
||||
(*(here->BSIM4v6SBsbPtr +1) -= m * xcsbsb);
|
||||
(*(here->BSIM4v6SBsbPtr) += m * (here->BSIM4v6gbs
|
||||
+ here->BSIM4v6grbps + here->BSIM4v6grbsb));
|
||||
|
||||
(*(here->BSIM4v6BdbPtr) -= m * here->BSIM4v6grbdb);
|
||||
(*(here->BSIM4v6BbpPtr) -= m * here->BSIM4v6grbpb);
|
||||
(*(here->BSIM4v6BsbPtr) -= m * here->BSIM4v6grbsb);
|
||||
(*(here->BSIM4v6BbPtr) += m * (here->BSIM4v6grbsb + here->BSIM4v6grbdb
|
||||
+ here->BSIM4v6grbpb));
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* WDLiu: The internal charge node generated for transient NQS is not needed for
|
||||
* AC NQS. The following is not doing a real job, but we have to keep it;
|
||||
* otherwise a singular AC NQS matrix may occur if the transient NQS is on.
|
||||
* The charge node is isolated from the instance.
|
||||
*/
|
||||
if (here->BSIM4v6trnqsMod)
|
||||
{ (*(here->BSIM4v6QqPtr) += m * 1.0);
|
||||
(*(here->BSIM4v6QgpPtr) += 0.0);
|
||||
(*(here->BSIM4v6QdpPtr) += 0.0);
|
||||
(*(here->BSIM4v6QspPtr) += 0.0);
|
||||
(*(here->BSIM4v6QbpPtr) += 0.0);
|
||||
|
||||
(*(here->BSIM4v6DPqPtr) += 0.0);
|
||||
(*(here->BSIM4v6SPqPtr) += 0.0);
|
||||
(*(here->BSIM4v6GPqPtr) += 0.0);
|
||||
}
|
||||
}
|
||||
}
|
||||
return(OK);
|
||||
}
|
||||
|
|
@ -0,0 +1,404 @@
|
|||
/**** BSIM4.6.2 Released by Wenwei Yang 07/31/2008 ****/
|
||||
|
||||
/**********
|
||||
* Copyright 2006 Regents of the University of California. All rights reserved.
|
||||
* File: b4ask.c of BSIM4.6.2.
|
||||
* Author: 2000 Weidong Liu
|
||||
* Authors: 2001- Xuemei Xi, Mohan Dunga, Ali Niknejad, Chenming Hu.
|
||||
* Authors: 2006- Mohan Dunga, Ali Niknejad, Chenming Hu
|
||||
* Authors: 2007- Mohan Dunga, Wenwei Yang, Ali Niknejad, Chenming Hu
|
||||
* Project Director: Prof. Chenming Hu.
|
||||
* Modified by Xuemei Xi, 04/06/2001.
|
||||
* Modified by Xuemei Xi, 10/05/2001.
|
||||
* Modified by Xuemei Xi, 05/09/2003.
|
||||
* Modified by Xuemei Xi, Mohan Dunga, 07/29/2005.
|
||||
**********/
|
||||
|
||||
#include "ngspice.h"
|
||||
#include "ifsim.h"
|
||||
#include "cktdefs.h"
|
||||
#include "devdefs.h"
|
||||
#include "bsim4v6def.h"
|
||||
#include "sperror.h"
|
||||
#include "suffix.h"
|
||||
|
||||
int
|
||||
BSIM4v6ask(
|
||||
CKTcircuit *ckt,
|
||||
GENinstance *inst,
|
||||
int which,
|
||||
IFvalue *value,
|
||||
IFvalue *select)
|
||||
{
|
||||
BSIM4v6instance *here = (BSIM4v6instance*)inst;
|
||||
|
||||
NG_IGNORE(select);
|
||||
|
||||
switch(which)
|
||||
{ case BSIM4v6_L:
|
||||
value->rValue = here->BSIM4v6l;
|
||||
return(OK);
|
||||
case BSIM4v6_W:
|
||||
value->rValue = here->BSIM4v6w;
|
||||
return(OK);
|
||||
case BSIM4v6_M:
|
||||
value->rValue = here->BSIM4v6m;
|
||||
return(OK);
|
||||
case BSIM4v6_NF:
|
||||
value->rValue = here->BSIM4v6nf;
|
||||
return(OK);
|
||||
case BSIM4v6_MIN:
|
||||
value->iValue = here->BSIM4v6min;
|
||||
return(OK);
|
||||
case BSIM4v6_AS:
|
||||
value->rValue = here->BSIM4v6sourceArea;
|
||||
return(OK);
|
||||
case BSIM4v6_AD:
|
||||
value->rValue = here->BSIM4v6drainArea;
|
||||
return(OK);
|
||||
case BSIM4v6_PS:
|
||||
value->rValue = here->BSIM4v6sourcePerimeter;
|
||||
return(OK);
|
||||
case BSIM4v6_PD:
|
||||
value->rValue = here->BSIM4v6drainPerimeter;
|
||||
return(OK);
|
||||
case BSIM4v6_NRS:
|
||||
value->rValue = here->BSIM4v6sourceSquares;
|
||||
return(OK);
|
||||
case BSIM4v6_NRD:
|
||||
value->rValue = here->BSIM4v6drainSquares;
|
||||
return(OK);
|
||||
case BSIM4v6_OFF:
|
||||
value->rValue = here->BSIM4v6off;
|
||||
return(OK);
|
||||
case BSIM4v6_SA:
|
||||
value->rValue = here->BSIM4v6sa ;
|
||||
return(OK);
|
||||
case BSIM4v6_SB:
|
||||
value->rValue = here->BSIM4v6sb ;
|
||||
return(OK);
|
||||
case BSIM4v6_SD:
|
||||
value->rValue = here->BSIM4v6sd ;
|
||||
return(OK);
|
||||
case BSIM4v6_SCA:
|
||||
value->rValue = here->BSIM4v6sca ;
|
||||
return(OK);
|
||||
case BSIM4v6_SCB:
|
||||
value->rValue = here->BSIM4v6scb ;
|
||||
return(OK);
|
||||
case BSIM4v6_SCC:
|
||||
value->rValue = here->BSIM4v6scc ;
|
||||
return(OK);
|
||||
case BSIM4v6_SC:
|
||||
value->rValue = here->BSIM4v6sc ;
|
||||
return(OK);
|
||||
|
||||
case BSIM4v6_RBSB:
|
||||
value->rValue = here->BSIM4v6rbsb;
|
||||
return(OK);
|
||||
case BSIM4v6_RBDB:
|
||||
value->rValue = here->BSIM4v6rbdb;
|
||||
return(OK);
|
||||
case BSIM4v6_RBPB:
|
||||
value->rValue = here->BSIM4v6rbpb;
|
||||
return(OK);
|
||||
case BSIM4v6_RBPS:
|
||||
value->rValue = here->BSIM4v6rbps;
|
||||
return(OK);
|
||||
case BSIM4v6_RBPD:
|
||||
value->rValue = here->BSIM4v6rbpd;
|
||||
return(OK);
|
||||
case BSIM4v6_DELVTO:
|
||||
value->rValue = here->BSIM4v6delvto;
|
||||
return(OK);
|
||||
case BSIM4v6_XGW:
|
||||
value->rValue = here->BSIM4v6xgw;
|
||||
return(OK);
|
||||
case BSIM4v6_NGCON:
|
||||
value->rValue = here->BSIM4v6ngcon;
|
||||
return(OK);
|
||||
case BSIM4v6_TRNQSMOD:
|
||||
value->iValue = here->BSIM4v6trnqsMod;
|
||||
return(OK);
|
||||
case BSIM4v6_ACNQSMOD:
|
||||
value->iValue = here->BSIM4v6acnqsMod;
|
||||
return(OK);
|
||||
case BSIM4v6_RBODYMOD:
|
||||
value->iValue = here->BSIM4v6rbodyMod;
|
||||
return(OK);
|
||||
case BSIM4v6_RGATEMOD:
|
||||
value->iValue = here->BSIM4v6rgateMod;
|
||||
return(OK);
|
||||
case BSIM4v6_GEOMOD:
|
||||
value->iValue = here->BSIM4v6geoMod;
|
||||
return(OK);
|
||||
case BSIM4v6_RGEOMOD:
|
||||
value->iValue = here->BSIM4v6rgeoMod;
|
||||
return(OK);
|
||||
case BSIM4v6_IC_VDS:
|
||||
value->rValue = here->BSIM4v6icVDS;
|
||||
return(OK);
|
||||
case BSIM4v6_IC_VGS:
|
||||
value->rValue = here->BSIM4v6icVGS;
|
||||
return(OK);
|
||||
case BSIM4v6_IC_VBS:
|
||||
value->rValue = here->BSIM4v6icVBS;
|
||||
return(OK);
|
||||
case BSIM4v6_DNODE:
|
||||
value->iValue = here->BSIM4v6dNode;
|
||||
return(OK);
|
||||
case BSIM4v6_GNODEEXT:
|
||||
value->iValue = here->BSIM4v6gNodeExt;
|
||||
return(OK);
|
||||
case BSIM4v6_SNODE:
|
||||
value->iValue = here->BSIM4v6sNode;
|
||||
return(OK);
|
||||
case BSIM4v6_BNODE:
|
||||
value->iValue = here->BSIM4v6bNode;
|
||||
return(OK);
|
||||
case BSIM4v6_DNODEPRIME:
|
||||
value->iValue = here->BSIM4v6dNodePrime;
|
||||
return(OK);
|
||||
case BSIM4v6_GNODEPRIME:
|
||||
value->iValue = here->BSIM4v6gNodePrime;
|
||||
return(OK);
|
||||
case BSIM4v6_GNODEMID:
|
||||
value->iValue = here->BSIM4v6gNodeMid;
|
||||
return(OK);
|
||||
case BSIM4v6_SNODEPRIME:
|
||||
value->iValue = here->BSIM4v6sNodePrime;
|
||||
return(OK);
|
||||
case BSIM4v6_DBNODE:
|
||||
value->iValue = here->BSIM4v6dbNode;
|
||||
return(OK);
|
||||
case BSIM4v6_BNODEPRIME:
|
||||
value->iValue = here->BSIM4v6bNodePrime;
|
||||
return(OK);
|
||||
case BSIM4v6_SBNODE:
|
||||
value->iValue = here->BSIM4v6sbNode;
|
||||
return(OK);
|
||||
case BSIM4v6_SOURCECONDUCT:
|
||||
value->rValue = here->BSIM4v6sourceConductance;
|
||||
value->rValue *= here->BSIM4v6m;
|
||||
return(OK);
|
||||
case BSIM4v6_DRAINCONDUCT:
|
||||
value->rValue = here->BSIM4v6drainConductance;
|
||||
value->rValue *= here->BSIM4v6m;
|
||||
return(OK);
|
||||
case BSIM4v6_VBD:
|
||||
value->rValue = *(ckt->CKTstate0 + here->BSIM4v6vbd);
|
||||
return(OK);
|
||||
case BSIM4v6_VBS:
|
||||
value->rValue = *(ckt->CKTstate0 + here->BSIM4v6vbs);
|
||||
return(OK);
|
||||
case BSIM4v6_VGS:
|
||||
value->rValue = *(ckt->CKTstate0 + here->BSIM4v6vgs);
|
||||
return(OK);
|
||||
case BSIM4v6_VDS:
|
||||
value->rValue = *(ckt->CKTstate0 + here->BSIM4v6vds);
|
||||
return(OK);
|
||||
case BSIM4v6_CD:
|
||||
value->rValue = here->BSIM4v6cd;
|
||||
value->rValue *= here->BSIM4v6m;
|
||||
return(OK);
|
||||
case BSIM4v6_CBS:
|
||||
value->rValue = here->BSIM4v6cbs;
|
||||
value->rValue *= here->BSIM4v6m;
|
||||
return(OK);
|
||||
case BSIM4v6_CBD:
|
||||
value->rValue = here->BSIM4v6cbd;
|
||||
value->rValue *= here->BSIM4v6m;
|
||||
return(OK);
|
||||
case BSIM4v6_CSUB:
|
||||
value->rValue = here->BSIM4v6csub;
|
||||
value->rValue *= here->BSIM4v6m;
|
||||
return(OK);
|
||||
case BSIM4v6_QINV:
|
||||
value->rValue = here-> BSIM4v6qinv;
|
||||
value->rValue *= here->BSIM4v6m;
|
||||
return(OK);
|
||||
case BSIM4v6_IGIDL:
|
||||
value->rValue = here->BSIM4v6Igidl;
|
||||
value->rValue *= here->BSIM4v6m;
|
||||
return(OK);
|
||||
case BSIM4v6_IGISL:
|
||||
value->rValue = here->BSIM4v6Igisl;
|
||||
value->rValue *= here->BSIM4v6m;
|
||||
return(OK);
|
||||
case BSIM4v6_IGS:
|
||||
value->rValue = here->BSIM4v6Igs;
|
||||
value->rValue *= here->BSIM4v6m;
|
||||
return(OK);
|
||||
case BSIM4v6_IGD:
|
||||
value->rValue = here->BSIM4v6Igd;
|
||||
value->rValue *= here->BSIM4v6m;
|
||||
return(OK);
|
||||
case BSIM4v6_IGB:
|
||||
value->rValue = here->BSIM4v6Igb;
|
||||
value->rValue *= here->BSIM4v6m;
|
||||
return(OK);
|
||||
case BSIM4v6_IGCS:
|
||||
value->rValue = here->BSIM4v6Igcs;
|
||||
value->rValue *= here->BSIM4v6m;
|
||||
return(OK);
|
||||
case BSIM4v6_IGCD:
|
||||
value->rValue = here->BSIM4v6Igcd;
|
||||
value->rValue *= here->BSIM4v6m;
|
||||
return(OK);
|
||||
case BSIM4v6_GM:
|
||||
value->rValue = here->BSIM4v6gm;
|
||||
value->rValue *= here->BSIM4v6m;
|
||||
return(OK);
|
||||
case BSIM4v6_GDS:
|
||||
value->rValue = here->BSIM4v6gds;
|
||||
value->rValue *= here->BSIM4v6m;
|
||||
return(OK);
|
||||
case BSIM4v6_GMBS:
|
||||
value->rValue = here->BSIM4v6gmbs;
|
||||
value->rValue *= here->BSIM4v6m;
|
||||
return(OK);
|
||||
case BSIM4v6_GBD:
|
||||
value->rValue = here->BSIM4v6gbd;
|
||||
value->rValue *= here->BSIM4v6m;
|
||||
return(OK);
|
||||
case BSIM4v6_GBS:
|
||||
value->rValue = here->BSIM4v6gbs;
|
||||
value->rValue *= here->BSIM4v6m;
|
||||
return(OK);
|
||||
/* case BSIM4v6_QB:
|
||||
value->rValue = *(ckt->CKTstate0 + here->BSIM4v6qb);
|
||||
return(OK); */
|
||||
case BSIM4v6_CQB:
|
||||
value->rValue = *(ckt->CKTstate0 + here->BSIM4v6cqb);
|
||||
return(OK);
|
||||
/* case BSIM4v6_QG:
|
||||
value->rValue = *(ckt->CKTstate0 + here->BSIM4v6qg);
|
||||
return(OK); */
|
||||
case BSIM4v6_CQG:
|
||||
value->rValue = *(ckt->CKTstate0 + here->BSIM4v6cqg);
|
||||
return(OK);
|
||||
/* case BSIM4v6_QD:
|
||||
value->rValue = *(ckt->CKTstate0 + here->BSIM4v6qd);
|
||||
return(OK); */
|
||||
case BSIM4v6_CQD:
|
||||
value->rValue = *(ckt->CKTstate0 + here->BSIM4v6cqd);
|
||||
return(OK);
|
||||
/* case BSIM4v6_QS:
|
||||
value->rValue = *(ckt->CKTstate0 + here->BSIM4v6qs);
|
||||
return(OK); */
|
||||
case BSIM4v6_QB:
|
||||
value->rValue = here->BSIM4v6qbulk;
|
||||
value->rValue *= here->BSIM4v6m;
|
||||
return(OK);
|
||||
case BSIM4v6_QG:
|
||||
value->rValue = here->BSIM4v6qgate;
|
||||
value->rValue *= here->BSIM4v6m;
|
||||
return(OK);
|
||||
case BSIM4v6_QS:
|
||||
value->rValue = here->BSIM4v6qsrc;
|
||||
value->rValue *= here->BSIM4v6m;
|
||||
return(OK);
|
||||
case BSIM4v6_QD:
|
||||
value->rValue = here->BSIM4v6qdrn;
|
||||
value->rValue *= here->BSIM4v6m;
|
||||
return(OK);
|
||||
case BSIM4v6_QDEF:
|
||||
value->rValue = *(ckt->CKTstate0 + here->BSIM4v6qdef);
|
||||
return(OK);
|
||||
case BSIM4v6_GCRG:
|
||||
value->rValue = here->BSIM4v6gcrg;
|
||||
value->rValue *= here->BSIM4v6m;
|
||||
return(OK);
|
||||
case BSIM4v6_GTAU:
|
||||
value->rValue = here->BSIM4v6gtau;
|
||||
return(OK);
|
||||
case BSIM4v6_CGGB:
|
||||
value->rValue = here->BSIM4v6cggb;
|
||||
value->rValue *= here->BSIM4v6m;
|
||||
return(OK);
|
||||
case BSIM4v6_CGDB:
|
||||
value->rValue = here->BSIM4v6cgdb;
|
||||
value->rValue *= here->BSIM4v6m;
|
||||
return(OK);
|
||||
case BSIM4v6_CGSB:
|
||||
value->rValue = here->BSIM4v6cgsb;
|
||||
value->rValue *= here->BSIM4v6m;
|
||||
return(OK);
|
||||
case BSIM4v6_CDGB:
|
||||
value->rValue = here->BSIM4v6cdgb;
|
||||
value->rValue *= here->BSIM4v6m;
|
||||
return(OK);
|
||||
case BSIM4v6_CDDB:
|
||||
value->rValue = here->BSIM4v6cddb;
|
||||
value->rValue *= here->BSIM4v6m;
|
||||
return(OK);
|
||||
case BSIM4v6_CDSB:
|
||||
value->rValue = here->BSIM4v6cdsb;
|
||||
value->rValue *= here->BSIM4v6m;
|
||||
return(OK);
|
||||
case BSIM4v6_CBGB:
|
||||
value->rValue = here->BSIM4v6cbgb;
|
||||
value->rValue *= here->BSIM4v6m;
|
||||
return(OK);
|
||||
case BSIM4v6_CBDB:
|
||||
value->rValue = here->BSIM4v6cbdb;
|
||||
value->rValue *= here->BSIM4v6m;
|
||||
return(OK);
|
||||
case BSIM4v6_CBSB:
|
||||
value->rValue = here->BSIM4v6cbsb;
|
||||
value->rValue *= here->BSIM4v6m;
|
||||
return(OK);
|
||||
case BSIM4v6_CSGB:
|
||||
value->rValue = here->BSIM4v6csgb;
|
||||
value->rValue *= here->BSIM4v6m;
|
||||
return(OK);
|
||||
case BSIM4v6_CSDB:
|
||||
value->rValue = here->BSIM4v6csdb;
|
||||
value->rValue *= here->BSIM4v6m;
|
||||
return(OK);
|
||||
case BSIM4v6_CSSB:
|
||||
value->rValue = here->BSIM4v6cssb;
|
||||
value->rValue *= here->BSIM4v6m;
|
||||
return(OK);
|
||||
case BSIM4v6_CGBB:
|
||||
value->rValue = here->BSIM4v6cgbb;
|
||||
value->rValue *= here->BSIM4v6m;
|
||||
return(OK);
|
||||
case BSIM4v6_CDBB:
|
||||
value->rValue = here->BSIM4v6cdbb;
|
||||
value->rValue *= here->BSIM4v6m;
|
||||
return(OK);
|
||||
case BSIM4v6_CSBB:
|
||||
value->rValue = here->BSIM4v6csbb;
|
||||
value->rValue *= here->BSIM4v6m;
|
||||
return(OK);
|
||||
case BSIM4v6_CBBB:
|
||||
value->rValue = here->BSIM4v6cbbb;
|
||||
value->rValue *= here->BSIM4v6m;
|
||||
return(OK);
|
||||
case BSIM4v6_CAPBD:
|
||||
value->rValue = here->BSIM4v6capbd;
|
||||
value->rValue *= here->BSIM4v6m;
|
||||
return(OK);
|
||||
case BSIM4v6_CAPBS:
|
||||
value->rValue = here->BSIM4v6capbs;
|
||||
value->rValue *= here->BSIM4v6m;
|
||||
return(OK);
|
||||
case BSIM4v6_VON:
|
||||
value->rValue = here->BSIM4v6von;
|
||||
return(OK);
|
||||
case BSIM4v6_VDSAT:
|
||||
value->rValue = here->BSIM4v6vdsat;
|
||||
return(OK);
|
||||
case BSIM4v6_QBS:
|
||||
value->rValue = *(ckt->CKTstate0 + here->BSIM4v6qbs);
|
||||
return(OK);
|
||||
case BSIM4v6_QBD:
|
||||
value->rValue = *(ckt->CKTstate0 + here->BSIM4v6qbd);
|
||||
return(OK);
|
||||
default:
|
||||
return(E_BADPARM);
|
||||
}
|
||||
/* NOTREACHED */
|
||||
}
|
||||
|
||||
|
|
@ -0,0 +1,876 @@
|
|||
/**** BSIM4.6.2 Released by Wenwei Yang 07/31/2008 ****/
|
||||
/**** BSIM4.6.5 Update ngspice 09/22/2009 ****/
|
||||
/**********
|
||||
* Copyright 2006 Regents of the University of California. All rights reserved.
|
||||
* File: b4check.c of BSIM4.6.1.
|
||||
* Author: 2000 Weidong Liu
|
||||
* Authors: 2001- Xuemei Xi, Mohan Dunga, Ali Niknejad, Chenming Hu.
|
||||
* Authors: 2006- Mohan Dunga, Ali Niknejad, Chenming Hu
|
||||
* Authors: 2007- Mohan Dunga, Wenwei Yang, Ali Niknejad, Chenming Hu
|
||||
* Project Director: Prof. Chenming Hu.
|
||||
* Modified by Xuemei Xi, 04/06/2001.
|
||||
* Modified by Xuemei Xi, 10/05/2001.
|
||||
* Modified by Xuemei Xi, 11/15/2002.
|
||||
* Modified by Xuemei Xi, 05/09/2003.
|
||||
* Modified by Xuemei Xi, 03/04/2004.
|
||||
* Modified by Xuemei Xi, 07/29/2005.
|
||||
* Modified by Mohan Dunga, 12/13/2006
|
||||
* Modified by Mohan Dunga, Wenwei Yang, 05/18/2007.
|
||||
* Modified by Wenwei Yang, 07/31/2008 .
|
||||
**********/
|
||||
|
||||
#include "ngspice.h"
|
||||
#include "cktdefs.h"
|
||||
#include "bsim4v6def.h"
|
||||
#include "trandefs.h"
|
||||
#include "const.h"
|
||||
#include "sperror.h"
|
||||
#include "devdefs.h"
|
||||
#include "suffix.h"
|
||||
|
||||
int
|
||||
BSIM4v6checkModel(
|
||||
BSIM4v6model *model,
|
||||
BSIM4v6instance *here,
|
||||
CKTcircuit *ckt)
|
||||
{
|
||||
struct bsim4v6SizeDependParam *pParam;
|
||||
int Fatal_Flag = 0;
|
||||
FILE *fplog;
|
||||
|
||||
if ((fplog = fopen("bsim4v6.out", "w")) != NULL)
|
||||
{ pParam = here->pParam;
|
||||
fprintf(fplog, "BSIM4v6: Berkeley Short Channel IGFET Model-4\n");
|
||||
fprintf(fplog, "Developed by Xuemei (Jane) Xi, Mohan Dunga, Prof. Ali Niknejad and Prof. Chenming Hu in 2003.\n");
|
||||
fprintf(fplog, "\n");
|
||||
fprintf(fplog, "++++++++++ BSIM4v6 PARAMETER CHECKING BELOW ++++++++++\n");
|
||||
|
||||
if (strcmp(model->BSIM4v6version, "4.6.5") != 0)
|
||||
{ fprintf(fplog, "Warning: This model is BSIM4.6.5; you specified a wrong version number.\n");
|
||||
printf("Warning: This model is BSIM4.6.5; you specified a wrong version number.\n");
|
||||
}
|
||||
fprintf(fplog, "Model = %s\n", model->BSIM4v6modName);
|
||||
|
||||
|
||||
if ((here->BSIM4v6rgateMod == 2) || (here->BSIM4v6rgateMod == 3))
|
||||
{ if ((here->BSIM4v6trnqsMod == 1) || (here->BSIM4v6acnqsMod == 1))
|
||||
{ fprintf(fplog, "Warning: You've selected both Rg and charge deficit NQS; select one only.\n");
|
||||
printf("Warning: You've selected both Rg and charge deficit NQS; select one only.\n");
|
||||
}
|
||||
}
|
||||
|
||||
if (model->BSIM4v6toxe <= 0.0)
|
||||
{ fprintf(fplog, "Fatal: Toxe = %g is not positive.\n",
|
||||
model->BSIM4v6toxe);
|
||||
printf("Fatal: Toxe = %g is not positive.\n", model->BSIM4v6toxe);
|
||||
Fatal_Flag = 1;
|
||||
}
|
||||
if (model->BSIM4v6toxp <= 0.0)
|
||||
{ fprintf(fplog, "Fatal: Toxp = %g is not positive.\n",
|
||||
model->BSIM4v6toxp);
|
||||
printf("Fatal: Toxp = %g is not positive.\n", model->BSIM4v6toxp);
|
||||
Fatal_Flag = 1;
|
||||
}
|
||||
if (model->BSIM4v6eot <= 0.0)
|
||||
{ fprintf(fplog, "Fatal: EOT = %g is not positive.\n",
|
||||
model->BSIM4v6eot);
|
||||
printf("Fatal: EOT = %g is not positive.\n", model->BSIM4v6eot);
|
||||
Fatal_Flag = 1;
|
||||
}
|
||||
if (model->BSIM4v6epsrgate < 0.0)
|
||||
{ fprintf(fplog, "Fatal: Epsrgate = %g is not positive.\n",
|
||||
model->BSIM4v6epsrgate);
|
||||
printf("Fatal: Epsrgate = %g is not positive.\n", model->BSIM4v6epsrgate);
|
||||
Fatal_Flag = 1;
|
||||
}
|
||||
if (model->BSIM4v6epsrsub < 0.0)
|
||||
{ fprintf(fplog, "Fatal: Epsrsub = %g is not positive.\n",
|
||||
model->BSIM4v6epsrsub);
|
||||
printf("Fatal: Epsrsub = %g is not positive.\n", model->BSIM4v6epsrsub);
|
||||
Fatal_Flag = 1;
|
||||
}
|
||||
if (model->BSIM4v6easub < 0.0)
|
||||
{ fprintf(fplog, "Fatal: Easub = %g is not positive.\n",
|
||||
model->BSIM4v6easub);
|
||||
printf("Fatal: Easub = %g is not positive.\n", model->BSIM4v6easub);
|
||||
Fatal_Flag = 1;
|
||||
}
|
||||
if (model->BSIM4v6ni0sub <= 0.0)
|
||||
{ fprintf(fplog, "Fatal: Ni0sub = %g is not positive.\n",
|
||||
model->BSIM4v6ni0sub);
|
||||
printf("Fatal: Easub = %g is not positive.\n", model->BSIM4v6ni0sub);
|
||||
Fatal_Flag = 1;
|
||||
}
|
||||
|
||||
if (model->BSIM4v6toxm <= 0.0)
|
||||
{ fprintf(fplog, "Fatal: Toxm = %g is not positive.\n",
|
||||
model->BSIM4v6toxm);
|
||||
printf("Fatal: Toxm = %g is not positive.\n", model->BSIM4v6toxm);
|
||||
Fatal_Flag = 1;
|
||||
}
|
||||
|
||||
if (model->BSIM4v6toxref <= 0.0)
|
||||
{ fprintf(fplog, "Fatal: Toxref = %g is not positive.\n",
|
||||
model->BSIM4v6toxref);
|
||||
printf("Fatal: Toxref = %g is not positive.\n", model->BSIM4v6toxref);
|
||||
Fatal_Flag = 1;
|
||||
}
|
||||
|
||||
if (pParam->BSIM4v6lpe0 < -pParam->BSIM4v6leff)
|
||||
{ fprintf(fplog, "Fatal: Lpe0 = %g is less than -Leff.\n",
|
||||
pParam->BSIM4v6lpe0);
|
||||
printf("Fatal: Lpe0 = %g is less than -Leff.\n",
|
||||
pParam->BSIM4v6lpe0);
|
||||
Fatal_Flag = 1;
|
||||
}
|
||||
if (model->BSIM4v6lintnoi > pParam->BSIM4v6leff/2)
|
||||
{ fprintf(fplog, "Fatal: Lintnoi = %g is too large - Leff for noise is negative.\n",
|
||||
model->BSIM4v6lintnoi);
|
||||
printf("Fatal: Lintnoi = %g is too large - Leff for noise is negative.\n",
|
||||
model->BSIM4v6lintnoi);
|
||||
Fatal_Flag = 1;
|
||||
}
|
||||
if (pParam->BSIM4v6lpeb < -pParam->BSIM4v6leff)
|
||||
{ fprintf(fplog, "Fatal: Lpeb = %g is less than -Leff.\n",
|
||||
pParam->BSIM4v6lpeb);
|
||||
printf("Fatal: Lpeb = %g is less than -Leff.\n",
|
||||
pParam->BSIM4v6lpeb);
|
||||
Fatal_Flag = 1;
|
||||
}
|
||||
if (pParam->BSIM4v6ndep <= 0.0)
|
||||
{ fprintf(fplog, "Fatal: Ndep = %g is not positive.\n",
|
||||
pParam->BSIM4v6ndep);
|
||||
printf("Fatal: Ndep = %g is not positive.\n",
|
||||
pParam->BSIM4v6ndep);
|
||||
Fatal_Flag = 1;
|
||||
}
|
||||
if (pParam->BSIM4v6phi <= 0.0)
|
||||
{ fprintf(fplog, "Fatal: Phi = %g is not positive. Please check Phin and Ndep\n",
|
||||
pParam->BSIM4v6phi);
|
||||
fprintf(fplog, " Phin = %g Ndep = %g \n",
|
||||
pParam->BSIM4v6phin, pParam->BSIM4v6ndep);
|
||||
printf("Fatal: Phi = %g is not positive. Please check Phin and Ndep\n",
|
||||
pParam->BSIM4v6phi);
|
||||
printf(" Phin = %g Ndep = %g \n",
|
||||
pParam->BSIM4v6phin, pParam->BSIM4v6ndep);
|
||||
Fatal_Flag = 1;
|
||||
}
|
||||
if (pParam->BSIM4v6nsub <= 0.0)
|
||||
{ fprintf(fplog, "Fatal: Nsub = %g is not positive.\n",
|
||||
pParam->BSIM4v6nsub);
|
||||
printf("Fatal: Nsub = %g is not positive.\n",
|
||||
pParam->BSIM4v6nsub);
|
||||
Fatal_Flag = 1;
|
||||
}
|
||||
if (pParam->BSIM4v6ngate < 0.0)
|
||||
{ fprintf(fplog, "Fatal: Ngate = %g is not positive.\n",
|
||||
pParam->BSIM4v6ngate);
|
||||
printf("Fatal: Ngate = %g Ngate is not positive.\n",
|
||||
pParam->BSIM4v6ngate);
|
||||
Fatal_Flag = 1;
|
||||
}
|
||||
if (pParam->BSIM4v6ngate > 1.e25)
|
||||
{ fprintf(fplog, "Fatal: Ngate = %g is too high.\n",
|
||||
pParam->BSIM4v6ngate);
|
||||
printf("Fatal: Ngate = %g Ngate is too high\n",
|
||||
pParam->BSIM4v6ngate);
|
||||
Fatal_Flag = 1;
|
||||
}
|
||||
if (pParam->BSIM4v6xj <= 0.0)
|
||||
{ fprintf(fplog, "Fatal: Xj = %g is not positive.\n",
|
||||
pParam->BSIM4v6xj);
|
||||
printf("Fatal: Xj = %g is not positive.\n", pParam->BSIM4v6xj);
|
||||
Fatal_Flag = 1;
|
||||
}
|
||||
|
||||
if (pParam->BSIM4v6dvt1 < 0.0)
|
||||
{ fprintf(fplog, "Fatal: Dvt1 = %g is negative.\n",
|
||||
pParam->BSIM4v6dvt1);
|
||||
printf("Fatal: Dvt1 = %g is negative.\n", pParam->BSIM4v6dvt1);
|
||||
Fatal_Flag = 1;
|
||||
}
|
||||
|
||||
if (pParam->BSIM4v6dvt1w < 0.0)
|
||||
{ fprintf(fplog, "Fatal: Dvt1w = %g is negative.\n",
|
||||
pParam->BSIM4v6dvt1w);
|
||||
printf("Fatal: Dvt1w = %g is negative.\n", pParam->BSIM4v6dvt1w);
|
||||
Fatal_Flag = 1;
|
||||
}
|
||||
|
||||
if (pParam->BSIM4v6w0 == -pParam->BSIM4v6weff)
|
||||
{ fprintf(fplog, "Fatal: (W0 + Weff) = 0 causing divided-by-zero.\n");
|
||||
printf("Fatal: (W0 + Weff) = 0 causing divided-by-zero.\n");
|
||||
Fatal_Flag = 1;
|
||||
}
|
||||
|
||||
if (pParam->BSIM4v6dsub < 0.0)
|
||||
{ fprintf(fplog, "Fatal: Dsub = %g is negative.\n", pParam->BSIM4v6dsub);
|
||||
printf("Fatal: Dsub = %g is negative.\n", pParam->BSIM4v6dsub);
|
||||
Fatal_Flag = 1;
|
||||
}
|
||||
if (pParam->BSIM4v6b1 == -pParam->BSIM4v6weff)
|
||||
{ fprintf(fplog, "Fatal: (B1 + Weff) = 0 causing divided-by-zero.\n");
|
||||
printf("Fatal: (B1 + Weff) = 0 causing divided-by-zero.\n");
|
||||
Fatal_Flag = 1;
|
||||
}
|
||||
if (here->BSIM4v6u0temp <= 0.0)
|
||||
{ fprintf(fplog, "Fatal: u0 at current temperature = %g is not positive.\n", here->BSIM4v6u0temp);
|
||||
printf("Fatal: u0 at current temperature = %g is not positive.\n",
|
||||
here->BSIM4v6u0temp);
|
||||
Fatal_Flag = 1;
|
||||
}
|
||||
|
||||
if (pParam->BSIM4v6delta < 0.0)
|
||||
{ fprintf(fplog, "Fatal: Delta = %g is less than zero.\n",
|
||||
pParam->BSIM4v6delta);
|
||||
printf("Fatal: Delta = %g is less than zero.\n", pParam->BSIM4v6delta);
|
||||
Fatal_Flag = 1;
|
||||
}
|
||||
|
||||
if (here->BSIM4v6vsattemp <= 0.0)
|
||||
{ fprintf(fplog, "Fatal: Vsat at current temperature = %g is not positive.\n", here->BSIM4v6vsattemp);
|
||||
printf("Fatal: Vsat at current temperature = %g is not positive.\n",
|
||||
here->BSIM4v6vsattemp);
|
||||
Fatal_Flag = 1;
|
||||
}
|
||||
|
||||
if (pParam->BSIM4v6pclm <= 0.0)
|
||||
{ fprintf(fplog, "Fatal: Pclm = %g is not positive.\n", pParam->BSIM4v6pclm);
|
||||
printf("Fatal: Pclm = %g is not positive.\n", pParam->BSIM4v6pclm);
|
||||
Fatal_Flag = 1;
|
||||
}
|
||||
|
||||
if (pParam->BSIM4v6drout < 0.0)
|
||||
{ fprintf(fplog, "Fatal: Drout = %g is negative.\n", pParam->BSIM4v6drout);
|
||||
printf("Fatal: Drout = %g is negative.\n", pParam->BSIM4v6drout);
|
||||
Fatal_Flag = 1;
|
||||
}
|
||||
|
||||
if (here->BSIM4v6m < 1.0)
|
||||
{ fprintf(fplog, "Fatal: Number of multiplier = %g is smaller than one.\n", here->BSIM4v6m);
|
||||
printf("Fatal: Number of multiplier = %g is smaller than one.\n", here->BSIM4v6m);
|
||||
Fatal_Flag = 1;
|
||||
}
|
||||
|
||||
if (here->BSIM4v6nf < 1.0)
|
||||
{ fprintf(fplog, "Fatal: Number of finger = %g is smaller than one.\n", here->BSIM4v6nf);
|
||||
printf("Fatal: Number of finger = %g is smaller than one.\n", here->BSIM4v6nf);
|
||||
Fatal_Flag = 1;
|
||||
}
|
||||
|
||||
if((here->BSIM4v6sa > 0.0) && (here->BSIM4v6sb > 0.0) &&
|
||||
((here->BSIM4v6nf == 1.0) || ((here->BSIM4v6nf > 1.0) && (here->BSIM4v6sd > 0.0))) )
|
||||
{ if (model->BSIM4v6saref <= 0.0)
|
||||
{ fprintf(fplog, "Fatal: SAref = %g is not positive.\n",model->BSIM4v6saref);
|
||||
printf("Fatal: SAref = %g is not positive.\n",model->BSIM4v6saref);
|
||||
Fatal_Flag = 1;
|
||||
}
|
||||
if (model->BSIM4v6sbref <= 0.0)
|
||||
{ fprintf(fplog, "Fatal: SBref = %g is not positive.\n",model->BSIM4v6sbref);
|
||||
printf("Fatal: SBref = %g is not positive.\n",model->BSIM4v6sbref);
|
||||
Fatal_Flag = 1;
|
||||
}
|
||||
}
|
||||
|
||||
if ((here->BSIM4v6l + model->BSIM4v6xl) <= model->BSIM4v6xgl)
|
||||
{ fprintf(fplog, "Fatal: The parameter xgl must be smaller than Ldrawn+XL.\n");
|
||||
printf("Fatal: The parameter xgl must be smaller than Ldrawn+XL.\n");
|
||||
Fatal_Flag = 1;
|
||||
}
|
||||
if (here->BSIM4v6ngcon < 1.0)
|
||||
{ fprintf(fplog, "Fatal: The parameter ngcon cannot be smaller than one.\n");
|
||||
printf("Fatal: The parameter ngcon cannot be smaller than one.\n");
|
||||
Fatal_Flag = 1;
|
||||
}
|
||||
if ((here->BSIM4v6ngcon != 1.0) && (here->BSIM4v6ngcon != 2.0))
|
||||
{ here->BSIM4v6ngcon = 1.0;
|
||||
fprintf(fplog, "Warning: Ngcon must be equal to one or two; reset to 1.0.\n");
|
||||
printf("Warning: Ngcon must be equal to one or two; reset to 1.0.\n");
|
||||
}
|
||||
|
||||
if (model->BSIM4v6gbmin < 1.0e-20)
|
||||
{ fprintf(fplog, "Warning: Gbmin = %g is too small.\n",
|
||||
model->BSIM4v6gbmin);
|
||||
printf("Warning: Gbmin = %g is too small.\n", model->BSIM4v6gbmin);
|
||||
}
|
||||
|
||||
/* Check saturation parameters */
|
||||
if (pParam->BSIM4v6fprout < 0.0)
|
||||
{ fprintf(fplog, "Fatal: fprout = %g is negative.\n",
|
||||
pParam->BSIM4v6fprout);
|
||||
printf("Fatal: fprout = %g is negative.\n", pParam->BSIM4v6fprout);
|
||||
Fatal_Flag = 1;
|
||||
}
|
||||
if (pParam->BSIM4v6pdits < 0.0)
|
||||
{ fprintf(fplog, "Fatal: pdits = %g is negative.\n",
|
||||
pParam->BSIM4v6pdits);
|
||||
printf("Fatal: pdits = %g is negative.\n", pParam->BSIM4v6pdits);
|
||||
Fatal_Flag = 1;
|
||||
}
|
||||
if (model->BSIM4v6pditsl < 0.0)
|
||||
{ fprintf(fplog, "Fatal: pditsl = %g is negative.\n",
|
||||
model->BSIM4v6pditsl);
|
||||
printf("Fatal: pditsl = %g is negative.\n", model->BSIM4v6pditsl);
|
||||
Fatal_Flag = 1;
|
||||
}
|
||||
|
||||
/* Check gate current parameters */
|
||||
if (model->BSIM4v6igbMod) {
|
||||
if (pParam->BSIM4v6nigbinv <= 0.0)
|
||||
{ fprintf(fplog, "Fatal: nigbinv = %g is non-positive.\n",
|
||||
pParam->BSIM4v6nigbinv);
|
||||
printf("Fatal: nigbinv = %g is non-positive.\n", pParam->BSIM4v6nigbinv);
|
||||
Fatal_Flag = 1;
|
||||
}
|
||||
if (pParam->BSIM4v6nigbacc <= 0.0)
|
||||
{ fprintf(fplog, "Fatal: nigbacc = %g is non-positive.\n",
|
||||
pParam->BSIM4v6nigbacc);
|
||||
printf("Fatal: nigbacc = %g is non-positive.\n", pParam->BSIM4v6nigbacc);
|
||||
Fatal_Flag = 1;
|
||||
}
|
||||
}
|
||||
if (model->BSIM4v6igcMod) {
|
||||
if (pParam->BSIM4v6nigc <= 0.0)
|
||||
{ fprintf(fplog, "Fatal: nigc = %g is non-positive.\n",
|
||||
pParam->BSIM4v6nigc);
|
||||
printf("Fatal: nigc = %g is non-positive.\n", pParam->BSIM4v6nigc);
|
||||
Fatal_Flag = 1;
|
||||
}
|
||||
if (pParam->BSIM4v6poxedge <= 0.0)
|
||||
{ fprintf(fplog, "Fatal: poxedge = %g is non-positive.\n",
|
||||
pParam->BSIM4v6poxedge);
|
||||
printf("Fatal: poxedge = %g is non-positive.\n", pParam->BSIM4v6poxedge);
|
||||
Fatal_Flag = 1;
|
||||
}
|
||||
if (pParam->BSIM4v6pigcd <= 0.0)
|
||||
{ fprintf(fplog, "Fatal: pigcd = %g is non-positive.\n",
|
||||
pParam->BSIM4v6pigcd);
|
||||
printf("Fatal: pigcd = %g is non-positive.\n", pParam->BSIM4v6pigcd);
|
||||
Fatal_Flag = 1;
|
||||
}
|
||||
}
|
||||
|
||||
/* Check capacitance parameters */
|
||||
if (pParam->BSIM4v6clc < 0.0)
|
||||
{ fprintf(fplog, "Fatal: Clc = %g is negative.\n", pParam->BSIM4v6clc);
|
||||
printf("Fatal: Clc = %g is negative.\n", pParam->BSIM4v6clc);
|
||||
Fatal_Flag = 1;
|
||||
}
|
||||
|
||||
/* Check overlap capacitance parameters */
|
||||
if (pParam->BSIM4v6ckappas < 0.02)
|
||||
{ fprintf(fplog, "Warning: ckappas = %g is too small. Set to 0.02\n",
|
||||
pParam->BSIM4v6ckappas);
|
||||
printf("Warning: ckappas = %g is too small.\n", pParam->BSIM4v6ckappas);
|
||||
pParam->BSIM4v6ckappas = 0.02;
|
||||
}
|
||||
if (pParam->BSIM4v6ckappad < 0.02)
|
||||
{ fprintf(fplog, "Warning: ckappad = %g is too small. Set to 0.02\n",
|
||||
pParam->BSIM4v6ckappad);
|
||||
printf("Warning: ckappad = %g is too small.\n", pParam->BSIM4v6ckappad);
|
||||
pParam->BSIM4v6ckappad = 0.02;
|
||||
}
|
||||
|
||||
if (model->BSIM4v6vtss < 0.0)
|
||||
{ fprintf(fplog, "Fatal: Vtss = %g is negative.\n",
|
||||
model->BSIM4v6vtss);
|
||||
printf("Fatal: Vtss = %g is negative.\n",
|
||||
model->BSIM4v6vtss);
|
||||
Fatal_Flag = 1;
|
||||
}
|
||||
if (model->BSIM4v6vtsd < 0.0)
|
||||
{ fprintf(fplog, "Fatal: Vtsd = %g is negative.\n",
|
||||
model->BSIM4v6vtsd);
|
||||
printf("Fatal: Vtsd = %g is negative.\n",
|
||||
model->BSIM4v6vtsd);
|
||||
Fatal_Flag = 1;
|
||||
}
|
||||
if (model->BSIM4v6vtssws < 0.0)
|
||||
{ fprintf(fplog, "Fatal: Vtssws = %g is negative.\n",
|
||||
model->BSIM4v6vtssws);
|
||||
printf("Fatal: Vtssws = %g is negative.\n",
|
||||
model->BSIM4v6vtssws);
|
||||
Fatal_Flag = 1;
|
||||
}
|
||||
if (model->BSIM4v6vtsswd < 0.0)
|
||||
{ fprintf(fplog, "Fatal: Vtsswd = %g is negative.\n",
|
||||
model->BSIM4v6vtsswd);
|
||||
printf("Fatal: Vtsswd = %g is negative.\n",
|
||||
model->BSIM4v6vtsswd);
|
||||
Fatal_Flag = 1;
|
||||
}
|
||||
if (model->BSIM4v6vtsswgs < 0.0)
|
||||
{ fprintf(fplog, "Fatal: Vtsswgs = %g is negative.\n",
|
||||
model->BSIM4v6vtsswgs);
|
||||
printf("Fatal: Vtsswgs = %g is negative.\n",
|
||||
model->BSIM4v6vtsswgs);
|
||||
Fatal_Flag = 1;
|
||||
}
|
||||
if (model->BSIM4v6vtsswgd < 0.0)
|
||||
{ fprintf(fplog, "Fatal: Vtsswgd = %g is negative.\n",
|
||||
model->BSIM4v6vtsswgd);
|
||||
printf("Fatal: Vtsswgd = %g is negative.\n",
|
||||
model->BSIM4v6vtsswgd);
|
||||
Fatal_Flag = 1;
|
||||
}
|
||||
|
||||
|
||||
if (model->BSIM4v6paramChk ==1)
|
||||
{
|
||||
/* Check L and W parameters */
|
||||
if (pParam->BSIM4v6leff <= 1.0e-9)
|
||||
{ fprintf(fplog, "Warning: Leff = %g <= 1.0e-9. Recommended Leff >= 1e-8 \n",
|
||||
pParam->BSIM4v6leff);
|
||||
printf("Warning: Leff = %g <= 1.0e-9. Recommended Leff >= 1e-8 \n",
|
||||
pParam->BSIM4v6leff);
|
||||
}
|
||||
|
||||
if (pParam->BSIM4v6leffCV <= 1.0e-9)
|
||||
{ fprintf(fplog, "Warning: Leff for CV = %g <= 1.0e-9. Recommended LeffCV >=1e-8 \n",
|
||||
pParam->BSIM4v6leffCV);
|
||||
printf("Warning: Leff for CV = %g <= 1.0e-9. Recommended LeffCV >=1e-8 \n",
|
||||
pParam->BSIM4v6leffCV);
|
||||
}
|
||||
|
||||
if (pParam->BSIM4v6weff <= 1.0e-9)
|
||||
{ fprintf(fplog, "Warning: Weff = %g <= 1.0e-9. Recommended Weff >=1e-7 \n",
|
||||
pParam->BSIM4v6weff);
|
||||
printf("Warning: Weff = %g <= 1.0e-9. Recommended Weff >=1e-7 \n",
|
||||
pParam->BSIM4v6weff);
|
||||
}
|
||||
|
||||
if (pParam->BSIM4v6weffCV <= 1.0e-9)
|
||||
{ fprintf(fplog, "Warning: Weff for CV = %g <= 1.0e-9. Recommended WeffCV >= 1e-7 \n",
|
||||
pParam->BSIM4v6weffCV);
|
||||
printf("Warning: Weff for CV = %g <= 1.0e-9. Recommended WeffCV >= 1e-7 \n",
|
||||
pParam->BSIM4v6weffCV);
|
||||
}
|
||||
|
||||
/* Check threshold voltage parameters */
|
||||
if (model->BSIM4v6toxe < 1.0e-10)
|
||||
{ fprintf(fplog, "Warning: Toxe = %g is less than 1A. Recommended Toxe >= 5A\n",
|
||||
model->BSIM4v6toxe);
|
||||
printf("Warning: Toxe = %g is less than 1A. Recommended Toxe >= 5A\n", model->BSIM4v6toxe);
|
||||
}
|
||||
if (model->BSIM4v6toxp < 1.0e-10)
|
||||
{ fprintf(fplog, "Warning: Toxp = %g is less than 1A. Recommended Toxp >= 5A\n",
|
||||
model->BSIM4v6toxp);
|
||||
printf("Warning: Toxp = %g is less than 1A. Recommended Toxp >= 5A\n", model->BSIM4v6toxp);
|
||||
}
|
||||
if (model->BSIM4v6toxm < 1.0e-10)
|
||||
{ fprintf(fplog, "Warning: Toxm = %g is less than 1A. Recommended Toxm >= 5A\n",
|
||||
model->BSIM4v6toxm);
|
||||
printf("Warning: Toxm = %g is less than 1A. Recommended Toxm >= 5A\n", model->BSIM4v6toxm);
|
||||
}
|
||||
|
||||
if (pParam->BSIM4v6ndep <= 1.0e12)
|
||||
{ fprintf(fplog, "Warning: Ndep = %g may be too small.\n",
|
||||
pParam->BSIM4v6ndep);
|
||||
printf("Warning: Ndep = %g may be too small.\n",
|
||||
pParam->BSIM4v6ndep);
|
||||
}
|
||||
else if (pParam->BSIM4v6ndep >= 1.0e21)
|
||||
{ fprintf(fplog, "Warning: Ndep = %g may be too large.\n",
|
||||
pParam->BSIM4v6ndep);
|
||||
printf("Warning: Ndep = %g may be too large.\n",
|
||||
pParam->BSIM4v6ndep);
|
||||
}
|
||||
|
||||
if (pParam->BSIM4v6nsub <= 1.0e14)
|
||||
{ fprintf(fplog, "Warning: Nsub = %g may be too small.\n",
|
||||
pParam->BSIM4v6nsub);
|
||||
printf("Warning: Nsub = %g may be too small.\n",
|
||||
pParam->BSIM4v6nsub);
|
||||
}
|
||||
else if (pParam->BSIM4v6nsub >= 1.0e21)
|
||||
{ fprintf(fplog, "Warning: Nsub = %g may be too large.\n",
|
||||
pParam->BSIM4v6nsub);
|
||||
printf("Warning: Nsub = %g may be too large.\n",
|
||||
pParam->BSIM4v6nsub);
|
||||
}
|
||||
|
||||
if ((pParam->BSIM4v6ngate > 0.0) &&
|
||||
(pParam->BSIM4v6ngate <= 1.e18))
|
||||
{ fprintf(fplog, "Warning: Ngate = %g is less than 1.E18cm^-3.\n",
|
||||
pParam->BSIM4v6ngate);
|
||||
printf("Warning: Ngate = %g is less than 1.E18cm^-3.\n",
|
||||
pParam->BSIM4v6ngate);
|
||||
}
|
||||
|
||||
if (pParam->BSIM4v6dvt0 < 0.0)
|
||||
{ fprintf(fplog, "Warning: Dvt0 = %g is negative.\n",
|
||||
pParam->BSIM4v6dvt0);
|
||||
printf("Warning: Dvt0 = %g is negative.\n", pParam->BSIM4v6dvt0);
|
||||
}
|
||||
|
||||
if (fabs(1.0e-8 / (pParam->BSIM4v6w0 + pParam->BSIM4v6weff)) > 10.0)
|
||||
{ fprintf(fplog, "Warning: (W0 + Weff) may be too small.\n");
|
||||
printf("Warning: (W0 + Weff) may be too small.\n");
|
||||
}
|
||||
|
||||
/* Check subthreshold parameters */
|
||||
if (pParam->BSIM4v6nfactor < 0.0)
|
||||
{ fprintf(fplog, "Warning: Nfactor = %g is negative.\n",
|
||||
pParam->BSIM4v6nfactor);
|
||||
printf("Warning: Nfactor = %g is negative.\n", pParam->BSIM4v6nfactor);
|
||||
}
|
||||
if (pParam->BSIM4v6cdsc < 0.0)
|
||||
{ fprintf(fplog, "Warning: Cdsc = %g is negative.\n",
|
||||
pParam->BSIM4v6cdsc);
|
||||
printf("Warning: Cdsc = %g is negative.\n", pParam->BSIM4v6cdsc);
|
||||
}
|
||||
if (pParam->BSIM4v6cdscd < 0.0)
|
||||
{ fprintf(fplog, "Warning: Cdscd = %g is negative.\n",
|
||||
pParam->BSIM4v6cdscd);
|
||||
printf("Warning: Cdscd = %g is negative.\n", pParam->BSIM4v6cdscd);
|
||||
}
|
||||
/* Check DIBL parameters */
|
||||
if (here->BSIM4v6eta0 < 0.0)
|
||||
{ fprintf(fplog, "Warning: Eta0 = %g is negative.\n",
|
||||
here->BSIM4v6eta0);
|
||||
printf("Warning: Eta0 = %g is negative.\n", here->BSIM4v6eta0);
|
||||
}
|
||||
|
||||
/* Check Abulk parameters */
|
||||
if (fabs(1.0e-8 / (pParam->BSIM4v6b1 + pParam->BSIM4v6weff)) > 10.0)
|
||||
{ fprintf(fplog, "Warning: (B1 + Weff) may be too small.\n");
|
||||
printf("Warning: (B1 + Weff) may be too small.\n");
|
||||
}
|
||||
|
||||
|
||||
/* Check Saturation parameters */
|
||||
if (pParam->BSIM4v6a2 < 0.01)
|
||||
{ fprintf(fplog, "Warning: A2 = %g is too small. Set to 0.01.\n", pParam->BSIM4v6a2);
|
||||
printf("Warning: A2 = %g is too small. Set to 0.01.\n",
|
||||
pParam->BSIM4v6a2);
|
||||
pParam->BSIM4v6a2 = 0.01;
|
||||
}
|
||||
else if (pParam->BSIM4v6a2 > 1.0)
|
||||
{ fprintf(fplog, "Warning: A2 = %g is larger than 1. A2 is set to 1 and A1 is set to 0.\n",
|
||||
pParam->BSIM4v6a2);
|
||||
printf("Warning: A2 = %g is larger than 1. A2 is set to 1 and A1 is set to 0.\n",
|
||||
pParam->BSIM4v6a2);
|
||||
pParam->BSIM4v6a2 = 1.0;
|
||||
pParam->BSIM4v6a1 = 0.0;
|
||||
}
|
||||
|
||||
if (pParam->BSIM4v6prwg < 0.0)
|
||||
{ fprintf(fplog, "Warning: Prwg = %g is negative. Set to zero.\n",
|
||||
pParam->BSIM4v6prwg);
|
||||
printf("Warning: Prwg = %g is negative. Set to zero.\n",
|
||||
pParam->BSIM4v6prwg);
|
||||
pParam->BSIM4v6prwg = 0.0;
|
||||
}
|
||||
|
||||
if (pParam->BSIM4v6rdsw < 0.0)
|
||||
{ fprintf(fplog, "Warning: Rdsw = %g is negative. Set to zero.\n",
|
||||
pParam->BSIM4v6rdsw);
|
||||
printf("Warning: Rdsw = %g is negative. Set to zero.\n",
|
||||
pParam->BSIM4v6rdsw);
|
||||
pParam->BSIM4v6rdsw = 0.0;
|
||||
pParam->BSIM4v6rds0 = 0.0;
|
||||
}
|
||||
|
||||
if (pParam->BSIM4v6rds0 < 0.0)
|
||||
{ fprintf(fplog, "Warning: Rds at current temperature = %g is negative. Set to zero.\n",
|
||||
pParam->BSIM4v6rds0);
|
||||
printf("Warning: Rds at current temperature = %g is negative. Set to zero.\n",
|
||||
pParam->BSIM4v6rds0);
|
||||
pParam->BSIM4v6rds0 = 0.0;
|
||||
}
|
||||
|
||||
if (pParam->BSIM4v6rdswmin < 0.0)
|
||||
{ fprintf(fplog, "Warning: Rdswmin at current temperature = %g is negative. Set to zero.\n",
|
||||
pParam->BSIM4v6rdswmin);
|
||||
printf("Warning: Rdswmin at current temperature = %g is negative. Set to zero.\n",
|
||||
pParam->BSIM4v6rdswmin);
|
||||
pParam->BSIM4v6rdswmin = 0.0;
|
||||
}
|
||||
|
||||
if (pParam->BSIM4v6pscbe2 <= 0.0)
|
||||
{ fprintf(fplog, "Warning: Pscbe2 = %g is not positive.\n",
|
||||
pParam->BSIM4v6pscbe2);
|
||||
printf("Warning: Pscbe2 = %g is not positive.\n", pParam->BSIM4v6pscbe2);
|
||||
}
|
||||
|
||||
if (pParam->BSIM4v6vsattemp < 1.0e3)
|
||||
{ fprintf(fplog, "Warning: Vsat at current temperature = %g may be too small.\n", pParam->BSIM4v6vsattemp);
|
||||
printf("Warning: Vsat at current temperature = %g may be too small.\n", pParam->BSIM4v6vsattemp);
|
||||
}
|
||||
|
||||
if((model->BSIM4v6lambdaGiven) && (pParam->BSIM4v6lambda > 0.0) )
|
||||
{
|
||||
if (pParam->BSIM4v6lambda > 1.0e-9)
|
||||
{ fprintf(fplog, "Warning: Lambda = %g may be too large.\n", pParam->BSIM4v6lambda);
|
||||
printf("Warning: Lambda = %g may be too large.\n", pParam->BSIM4v6lambda);
|
||||
}
|
||||
}
|
||||
|
||||
if((model->BSIM4v6vtlGiven) && (pParam->BSIM4v6vtl > 0.0) )
|
||||
{
|
||||
if (pParam->BSIM4v6vtl < 6.0e4)
|
||||
{ fprintf(fplog, "Warning: Thermal velocity vtl = %g may be too small.\n", pParam->BSIM4v6vtl);
|
||||
printf("Warning: Thermal velocity vtl = %g may be too small.\n", pParam->BSIM4v6vtl);
|
||||
}
|
||||
|
||||
if (pParam->BSIM4v6xn < 3.0)
|
||||
{ fprintf(fplog, "Warning: back scattering coeff xn = %g is too small.\n", pParam->BSIM4v6xn);
|
||||
printf("Warning: back scattering coeff xn = %g is too small. Reset to 3.0 \n", pParam->BSIM4v6xn);
|
||||
pParam->BSIM4v6xn = 3.0;
|
||||
}
|
||||
|
||||
if (model->BSIM4v6lc < 0.0)
|
||||
{ fprintf(fplog, "Warning: back scattering coeff lc = %g is too small.\n", model->BSIM4v6lc);
|
||||
printf("Warning: back scattering coeff lc = %g is too small. Reset to 0.0\n", model->BSIM4v6lc);
|
||||
pParam->BSIM4v6lc = 0.0;
|
||||
}
|
||||
}
|
||||
|
||||
if (pParam->BSIM4v6pdibl1 < 0.0)
|
||||
{ fprintf(fplog, "Warning: Pdibl1 = %g is negative.\n",
|
||||
pParam->BSIM4v6pdibl1);
|
||||
printf("Warning: Pdibl1 = %g is negative.\n", pParam->BSIM4v6pdibl1);
|
||||
}
|
||||
if (pParam->BSIM4v6pdibl2 < 0.0)
|
||||
{ fprintf(fplog, "Warning: Pdibl2 = %g is negative.\n",
|
||||
pParam->BSIM4v6pdibl2);
|
||||
printf("Warning: Pdibl2 = %g is negative.\n", pParam->BSIM4v6pdibl2);
|
||||
}
|
||||
|
||||
/* Check stress effect parameters */
|
||||
if((here->BSIM4v6sa > 0.0) && (here->BSIM4v6sb > 0.0) &&
|
||||
((here->BSIM4v6nf == 1.0) || ((here->BSIM4v6nf > 1.0) && (here->BSIM4v6sd > 0.0))) )
|
||||
{ if (model->BSIM4v6lodk2 <= 0.0)
|
||||
{ fprintf(fplog, "Warning: LODK2 = %g is not positive.\n",model->BSIM4v6lodk2);
|
||||
printf("Warning: LODK2 = %g is not positive.\n",model->BSIM4v6lodk2);
|
||||
}
|
||||
if (model->BSIM4v6lodeta0 <= 0.0)
|
||||
{ fprintf(fplog, "Warning: LODETA0 = %g is not positive.\n",model->BSIM4v6lodeta0);
|
||||
printf("Warning: LODETA0 = %g is not positive.\n",model->BSIM4v6lodeta0);
|
||||
}
|
||||
}
|
||||
|
||||
/* Check gate resistance parameters */
|
||||
if (here->BSIM4v6rgateMod == 1)
|
||||
{ if (model->BSIM4v6rshg <= 0.0)
|
||||
printf("Warning: rshg should be positive for rgateMod = 1.\n");
|
||||
}
|
||||
else if (here->BSIM4v6rgateMod == 2)
|
||||
{ if (model->BSIM4v6rshg <= 0.0)
|
||||
printf("Warning: rshg <= 0.0 for rgateMod = 2.\n");
|
||||
else if (pParam->BSIM4v6xrcrg1 <= 0.0)
|
||||
printf("Warning: xrcrg1 <= 0.0 for rgateMod = 2.\n");
|
||||
}
|
||||
if (here->BSIM4v6rgateMod == 3)
|
||||
{ if (model->BSIM4v6rshg <= 0.0)
|
||||
printf("Warning: rshg should be positive for rgateMod = 3.\n");
|
||||
else if (pParam->BSIM4v6xrcrg1 <= 0.0)
|
||||
printf("Warning: xrcrg1 should be positive for rgateMod = 3.\n");
|
||||
}
|
||||
|
||||
/* Check capacitance parameters */
|
||||
if (pParam->BSIM4v6noff < 0.1)
|
||||
{ fprintf(fplog, "Warning: Noff = %g is too small.\n",
|
||||
pParam->BSIM4v6noff);
|
||||
printf("Warning: Noff = %g is too small.\n", pParam->BSIM4v6noff);
|
||||
}
|
||||
|
||||
if (pParam->BSIM4v6voffcv < -0.5)
|
||||
{ fprintf(fplog, "Warning: Voffcv = %g is too small.\n",
|
||||
pParam->BSIM4v6voffcv);
|
||||
printf("Warning: Voffcv = %g is too small.\n", pParam->BSIM4v6voffcv);
|
||||
}
|
||||
if (pParam->BSIM4v6moin < 5.0)
|
||||
{ fprintf(fplog, "Warning: Moin = %g is too small.\n",
|
||||
pParam->BSIM4v6moin);
|
||||
printf("Warning: Moin = %g is too small.\n", pParam->BSIM4v6moin);
|
||||
}
|
||||
if (pParam->BSIM4v6moin > 25.0)
|
||||
{ fprintf(fplog, "Warning: Moin = %g is too large.\n",
|
||||
pParam->BSIM4v6moin);
|
||||
printf("Warning: Moin = %g is too large.\n", pParam->BSIM4v6moin);
|
||||
}
|
||||
if(model->BSIM4v6capMod ==2) {
|
||||
if (pParam->BSIM4v6acde < 0.1)
|
||||
{ fprintf(fplog, "Warning: Acde = %g is too small.\n",
|
||||
pParam->BSIM4v6acde);
|
||||
printf("Warning: Acde = %g is too small.\n", pParam->BSIM4v6acde);
|
||||
}
|
||||
if (pParam->BSIM4v6acde > 1.6)
|
||||
{ fprintf(fplog, "Warning: Acde = %g is too large.\n",
|
||||
pParam->BSIM4v6acde);
|
||||
printf("Warning: Acde = %g is too large.\n", pParam->BSIM4v6acde);
|
||||
}
|
||||
}
|
||||
|
||||
/* Check overlap capacitance parameters */
|
||||
if (model->BSIM4v6cgdo < 0.0)
|
||||
{ fprintf(fplog, "Warning: cgdo = %g is negative. Set to zero.\n", model->BSIM4v6cgdo);
|
||||
printf("Warning: cgdo = %g is negative. Set to zero.\n", model->BSIM4v6cgdo);
|
||||
model->BSIM4v6cgdo = 0.0;
|
||||
}
|
||||
if (model->BSIM4v6cgso < 0.0)
|
||||
{ fprintf(fplog, "Warning: cgso = %g is negative. Set to zero.\n", model->BSIM4v6cgso);
|
||||
printf("Warning: cgso = %g is negative. Set to zero.\n", model->BSIM4v6cgso);
|
||||
model->BSIM4v6cgso = 0.0;
|
||||
}
|
||||
if (model->BSIM4v6cgbo < 0.0)
|
||||
{ fprintf(fplog, "Warning: cgbo = %g is negative. Set to zero.\n", model->BSIM4v6cgbo);
|
||||
printf("Warning: cgbo = %g is negative. Set to zero.\n", model->BSIM4v6cgbo);
|
||||
model->BSIM4v6cgbo = 0.0;
|
||||
}
|
||||
if (model->BSIM4v6tnoiMod == 1) {
|
||||
if (model->BSIM4v6tnoia < 0.0)
|
||||
{ fprintf(fplog, "Warning: tnoia = %g is negative. Set to zero.\n", model->BSIM4v6tnoia);
|
||||
printf("Warning: tnoia = %g is negative. Set to zero.\n", model->BSIM4v6tnoia);
|
||||
model->BSIM4v6tnoia = 0.0;
|
||||
}
|
||||
if (model->BSIM4v6tnoib < 0.0)
|
||||
{ fprintf(fplog, "Warning: tnoib = %g is negative. Set to zero.\n", model->BSIM4v6tnoib);
|
||||
printf("Warning: tnoib = %g is negative. Set to zero.\n", model->BSIM4v6tnoib);
|
||||
model->BSIM4v6tnoib = 0.0;
|
||||
}
|
||||
|
||||
if (model->BSIM4v6rnoia < 0.0)
|
||||
{ fprintf(fplog, "Warning: rnoia = %g is negative. Set to zero.\n", model->BSIM4v6rnoia);
|
||||
printf("Warning: rnoia = %g is negative. Set to zero.\n", model->BSIM4v6rnoia);
|
||||
model->BSIM4v6rnoia = 0.0;
|
||||
}
|
||||
if (model->BSIM4v6rnoib < 0.0)
|
||||
{ fprintf(fplog, "Warning: rnoib = %g is negative. Set to zero.\n", model->BSIM4v6rnoib);
|
||||
printf("Warning: rnoib = %g is negative. Set to zero.\n", model->BSIM4v6rnoib);
|
||||
model->BSIM4v6rnoib = 0.0;
|
||||
}
|
||||
}
|
||||
|
||||
if (model->BSIM4v6SjctEmissionCoeff < 0.0)
|
||||
{ fprintf(fplog, "Warning: Njs = %g is negative.\n",
|
||||
model->BSIM4v6SjctEmissionCoeff);
|
||||
printf("Warning: Njs = %g is negative.\n",
|
||||
model->BSIM4v6SjctEmissionCoeff);
|
||||
}
|
||||
if (model->BSIM4v6DjctEmissionCoeff < 0.0)
|
||||
{ fprintf(fplog, "Warning: Njd = %g is negative.\n",
|
||||
model->BSIM4v6DjctEmissionCoeff);
|
||||
printf("Warning: Njd = %g is negative.\n",
|
||||
model->BSIM4v6DjctEmissionCoeff);
|
||||
}
|
||||
|
||||
if (model->BSIM4v6njtsstemp < 0.0)
|
||||
{ fprintf(fplog, "Warning: Njts = %g is negative at temperature = %g.\n",
|
||||
model->BSIM4v6njtsstemp, ckt->CKTtemp);
|
||||
printf("Warning: Njts = %g is negative at temperature = %g.\n",
|
||||
model->BSIM4v6njtsstemp, ckt->CKTtemp);
|
||||
}
|
||||
if (model->BSIM4v6njtsswstemp < 0.0)
|
||||
{ fprintf(fplog, "Warning: Njtssw = %g is negative at temperature = %g.\n",
|
||||
model->BSIM4v6njtsswstemp, ckt->CKTtemp);
|
||||
printf("Warning: Njtssw = %g is negative at temperature = %g.\n",
|
||||
model->BSIM4v6njtsswstemp, ckt->CKTtemp);
|
||||
}
|
||||
if (model->BSIM4v6njtsswgstemp < 0.0)
|
||||
{ fprintf(fplog, "Warning: Njtsswg = %g is negative at temperature = %g.\n",
|
||||
model->BSIM4v6njtsswgstemp, ckt->CKTtemp);
|
||||
printf("Warning: Njtsswg = %g is negative at temperature = %g.\n",
|
||||
model->BSIM4v6njtsswgstemp, ckt->CKTtemp);
|
||||
}
|
||||
|
||||
if (model->BSIM4v6njtsdGiven && model->BSIM4v6njtsdtemp < 0.0)
|
||||
{ fprintf(fplog, "Warning: Njtsd = %g is negative at temperature = %g.\n",
|
||||
model->BSIM4v6njtsdtemp, ckt->CKTtemp);
|
||||
printf("Warning: Njtsd = %g is negative at temperature = %g.\n",
|
||||
model->BSIM4v6njtsdtemp, ckt->CKTtemp);
|
||||
}
|
||||
if (model->BSIM4v6njtsswdGiven && model->BSIM4v6njtsswdtemp < 0.0)
|
||||
{ fprintf(fplog, "Warning: Njtsswd = %g is negative at temperature = %g.\n",
|
||||
model->BSIM4v6njtsswdtemp, ckt->CKTtemp);
|
||||
printf("Warning: Njtsswd = %g is negative at temperature = %g.\n",
|
||||
model->BSIM4v6njtsswdtemp, ckt->CKTtemp);
|
||||
}
|
||||
if (model->BSIM4v6njtsswgdGiven && model->BSIM4v6njtsswgdtemp < 0.0)
|
||||
{ fprintf(fplog, "Warning: Njtsswgd = %g is negative at temperature = %g.\n",
|
||||
model->BSIM4v6njtsswgdtemp, ckt->CKTtemp);
|
||||
printf("Warning: Njtsswgd = %g is negative at temperature = %g.\n",
|
||||
model->BSIM4v6njtsswgdtemp, ckt->CKTtemp);
|
||||
}
|
||||
|
||||
if (model->BSIM4v6ntnoi < 0.0)
|
||||
{ fprintf(fplog, "Warning: ntnoi = %g is negative. Set to zero.\n", model->BSIM4v6ntnoi);
|
||||
printf("Warning: ntnoi = %g is negative. Set to zero.\n", model->BSIM4v6ntnoi);
|
||||
model->BSIM4v6ntnoi = 0.0;
|
||||
}
|
||||
|
||||
/* diode model */
|
||||
if (model->BSIM4v6SbulkJctBotGradingCoeff >= 0.99)
|
||||
{ fprintf(fplog, "Warning: MJS = %g is too big. Set to 0.99.\n", model->BSIM4v6SbulkJctBotGradingCoeff);
|
||||
printf("Warning: MJS = %g is too big. Set to 0.99.\n", model->BSIM4v6SbulkJctBotGradingCoeff);
|
||||
model->BSIM4v6SbulkJctBotGradingCoeff = 0.99;
|
||||
}
|
||||
if (model->BSIM4v6SbulkJctSideGradingCoeff >= 0.99)
|
||||
{ fprintf(fplog, "Warning: MJSWS = %g is too big. Set to 0.99.\n", model->BSIM4v6SbulkJctSideGradingCoeff);
|
||||
printf("Warning: MJSWS = %g is too big. Set to 0.99.\n", model->BSIM4v6SbulkJctSideGradingCoeff);
|
||||
model->BSIM4v6SbulkJctSideGradingCoeff = 0.99;
|
||||
}
|
||||
if (model->BSIM4v6SbulkJctGateSideGradingCoeff >= 0.99)
|
||||
{ fprintf(fplog, "Warning: MJSWGS = %g is too big. Set to 0.99.\n", model->BSIM4v6SbulkJctGateSideGradingCoeff);
|
||||
printf("Warning: MJSWGS = %g is too big. Set to 0.99.\n", model->BSIM4v6SbulkJctGateSideGradingCoeff);
|
||||
model->BSIM4v6SbulkJctGateSideGradingCoeff = 0.99;
|
||||
}
|
||||
|
||||
if (model->BSIM4v6DbulkJctBotGradingCoeff >= 0.99)
|
||||
{ fprintf(fplog, "Warning: MJD = %g is too big. Set to 0.99.\n", model->BSIM4v6DbulkJctBotGradingCoeff);
|
||||
printf("Warning: MJD = %g is too big. Set to 0.99.\n", model->BSIM4v6DbulkJctBotGradingCoeff);
|
||||
model->BSIM4v6DbulkJctBotGradingCoeff = 0.99;
|
||||
}
|
||||
if (model->BSIM4v6DbulkJctSideGradingCoeff >= 0.99)
|
||||
{ fprintf(fplog, "Warning: MJSWD = %g is too big. Set to 0.99.\n", model->BSIM4v6DbulkJctSideGradingCoeff);
|
||||
printf("Warning: MJSWD = %g is too big. Set to 0.99.\n", model->BSIM4v6DbulkJctSideGradingCoeff);
|
||||
model->BSIM4v6DbulkJctSideGradingCoeff = 0.99;
|
||||
}
|
||||
if (model->BSIM4v6DbulkJctGateSideGradingCoeff >= 0.99)
|
||||
{ fprintf(fplog, "Warning: MJSWGD = %g is too big. Set to 0.99.\n", model->BSIM4v6DbulkJctGateSideGradingCoeff);
|
||||
printf("Warning: MJSWGD = %g is too big. Set to 0.99.\n", model->BSIM4v6DbulkJctGateSideGradingCoeff);
|
||||
model->BSIM4v6DbulkJctGateSideGradingCoeff = 0.99;
|
||||
}
|
||||
if (model->BSIM4v6wpemod == 1)
|
||||
{
|
||||
if (model->BSIM4v6scref <= 0.0)
|
||||
{ fprintf(fplog, "Warning: SCREF = %g is not positive. Set to 1e-6.\n", model->BSIM4v6scref);
|
||||
printf("Warning: SCREF = %g is not positive. Set to 1e-6.\n", model->BSIM4v6scref);
|
||||
model->BSIM4v6scref = 1e-6;
|
||||
}
|
||||
/*Move these checks to temp.c for sceff calculation*/
|
||||
/*
|
||||
if (here->BSIM4v6sca < 0.0)
|
||||
{ fprintf(fplog, "Warning: SCA = %g is negative. Set to 0.0.\n", here->BSIM4v6sca);
|
||||
printf("Warning: SCA = %g is negative. Set to 0.0.\n", here->BSIM4v6sca);
|
||||
here->BSIM4v6sca = 0.0;
|
||||
}
|
||||
if (here->BSIM4v6scb < 0.0)
|
||||
{ fprintf(fplog, "Warning: SCB = %g is negative. Set to 0.0.\n", here->BSIM4v6scb);
|
||||
printf("Warning: SCB = %g is negative. Set to 0.0.\n", here->BSIM4v6scb);
|
||||
here->BSIM4v6scb = 0.0;
|
||||
}
|
||||
if (here->BSIM4v6scc < 0.0)
|
||||
{ fprintf(fplog, "Warning: SCC = %g is negative. Set to 0.0.\n", here->BSIM4v6scc);
|
||||
printf("Warning: SCC = %g is negative. Set to 0.0.\n", here->BSIM4v6scc);
|
||||
here->BSIM4v6scc = 0.0;
|
||||
}
|
||||
if (here->BSIM4v6sc < 0.0)
|
||||
{ fprintf(fplog, "Warning: SC = %g is negative. Set to 0.0.\n", here->BSIM4v6sc);
|
||||
printf("Warning: SC = %g is negative. Set to 0.0.\n", here->BSIM4v6sc);
|
||||
here->BSIM4v6sc = 0.0;
|
||||
}
|
||||
*/
|
||||
|
||||
}
|
||||
}/* loop for the parameter check for warning messages */
|
||||
fclose(fplog);
|
||||
}
|
||||
else
|
||||
{ fprintf(stderr, "Warning: Can't open log file. Parameter checking skipped.\n");
|
||||
}
|
||||
|
||||
return(Fatal_Flag);
|
||||
}
|
||||
|
||||
|
|
@ -0,0 +1,200 @@
|
|||
/**** BSIM4.6.2 Released by Wenwei Yang 04/05/2008 ****/
|
||||
|
||||
/**********
|
||||
* Copyright 2006 Regents of the University of California. All rights reserved.
|
||||
* File: b4cvtest.c of BSIM4.6.2.
|
||||
* Author: 2000 Weidong Liu
|
||||
* Authors: 2001- Xuemei Xi, Mohan Dunga, Ali Niknejad, Chenming Hu.
|
||||
* Authors: 2006- Mohan Dunga, Ali Niknejad, Chenming Hu
|
||||
* Authors: 2007- Mohan Dunga, Wenwei Yang, Ali Niknejad, Chenming Hu
|
||||
* Project Director: Prof. Chenming Hu.
|
||||
* Modified by Xuemei Xi, 04/06/2001.
|
||||
* Modified by Xuemei Xi, 10/05/2001.
|
||||
* Modified by Xuemei Xi, 05/09/2003.
|
||||
**********/
|
||||
|
||||
#include "ngspice.h"
|
||||
#include "cktdefs.h"
|
||||
#include "bsim4v6def.h"
|
||||
#include "trandefs.h"
|
||||
#include "const.h"
|
||||
#include "devdefs.h"
|
||||
#include "sperror.h"
|
||||
#include "suffix.h"
|
||||
|
||||
|
||||
int
|
||||
BSIM4v6convTest(
|
||||
GENmodel *inModel,
|
||||
CKTcircuit *ckt)
|
||||
{
|
||||
BSIM4v6model *model = (BSIM4v6model*)inModel;
|
||||
BSIM4v6instance *here;
|
||||
double delvbd, delvbs, delvds, delvgd, delvgs;
|
||||
double delvdbd, delvsbs;
|
||||
double delvbd_jct, delvbs_jct;
|
||||
double vds, vgs, vgd, vgdo, vbs, vbd;
|
||||
double vdbd, vdbs, vsbs;
|
||||
double cbhat, cdhat, Idtot, Ibtot;
|
||||
double vses, vdes, vdedo, delvses, delvded, delvdes;
|
||||
double Isestot, cseshat, Idedtot, cdedhat;
|
||||
double Igstot, cgshat, Igdtot, cgdhat, Igbtot, cgbhat;
|
||||
double tol0, tol1, tol2, tol3, tol4, tol5, tol6;
|
||||
|
||||
for (; model != NULL; model = model->BSIM4v6nextModel)
|
||||
{ for (here = model->BSIM4v6instances; here != NULL ;
|
||||
here=here->BSIM4v6nextInstance)
|
||||
{ if (here->BSIM4v6owner != ARCHme) continue;
|
||||
vds = model->BSIM4v6type
|
||||
* (*(ckt->CKTrhsOld + here->BSIM4v6dNodePrime)
|
||||
- *(ckt->CKTrhsOld + here->BSIM4v6sNodePrime));
|
||||
vgs = model->BSIM4v6type
|
||||
* (*(ckt->CKTrhsOld + here->BSIM4v6gNodePrime)
|
||||
- *(ckt->CKTrhsOld + here->BSIM4v6sNodePrime));
|
||||
vbs = model->BSIM4v6type
|
||||
* (*(ckt->CKTrhsOld + here->BSIM4v6bNodePrime)
|
||||
- *(ckt->CKTrhsOld + here->BSIM4v6sNodePrime));
|
||||
vdbs = model->BSIM4v6type
|
||||
* (*(ckt->CKTrhsOld + here->BSIM4v6dbNode)
|
||||
- *(ckt->CKTrhsOld + here->BSIM4v6sNodePrime));
|
||||
vsbs = model->BSIM4v6type
|
||||
* (*(ckt->CKTrhsOld + here->BSIM4v6sbNode)
|
||||
- *(ckt->CKTrhsOld + here->BSIM4v6sNodePrime));
|
||||
vses = model->BSIM4v6type
|
||||
* (*(ckt->CKTrhsOld + here->BSIM4v6sNode)
|
||||
- *(ckt->CKTrhsOld + here->BSIM4v6sNodePrime));
|
||||
vdes = model->BSIM4v6type
|
||||
* (*(ckt->CKTrhsOld + here->BSIM4v6dNode)
|
||||
- *(ckt->CKTrhsOld + here->BSIM4v6sNodePrime));
|
||||
|
||||
vgdo = *(ckt->CKTstate0 + here->BSIM4v6vgs)
|
||||
- *(ckt->CKTstate0 + here->BSIM4v6vds);
|
||||
vbd = vbs - vds;
|
||||
vdbd = vdbs - vds;
|
||||
vgd = vgs - vds;
|
||||
|
||||
delvbd = vbd - *(ckt->CKTstate0 + here->BSIM4v6vbd);
|
||||
delvdbd = vdbd - *(ckt->CKTstate0 + here->BSIM4v6vdbd);
|
||||
delvgd = vgd - vgdo;
|
||||
|
||||
delvds = vds - *(ckt->CKTstate0 + here->BSIM4v6vds);
|
||||
delvgs = vgs - *(ckt->CKTstate0 + here->BSIM4v6vgs);
|
||||
delvbs = vbs - *(ckt->CKTstate0 + here->BSIM4v6vbs);
|
||||
delvsbs = vsbs - *(ckt->CKTstate0 + here->BSIM4v6vsbs);
|
||||
|
||||
delvses = vses - (*(ckt->CKTstate0 + here->BSIM4v6vses));
|
||||
vdedo = *(ckt->CKTstate0 + here->BSIM4v6vdes)
|
||||
- *(ckt->CKTstate0 + here->BSIM4v6vds);
|
||||
delvdes = vdes - *(ckt->CKTstate0 + here->BSIM4v6vdes);
|
||||
delvded = vdes - vds - vdedo;
|
||||
|
||||
delvbd_jct = (!here->BSIM4v6rbodyMod) ? delvbd : delvdbd;
|
||||
delvbs_jct = (!here->BSIM4v6rbodyMod) ? delvbs : delvsbs;
|
||||
|
||||
if (here->BSIM4v6mode >= 0)
|
||||
{ Idtot = here->BSIM4v6cd + here->BSIM4v6csub - here->BSIM4v6cbd
|
||||
+ here->BSIM4v6Igidl;
|
||||
cdhat = Idtot - here->BSIM4v6gbd * delvbd_jct
|
||||
+ (here->BSIM4v6gmbs + here->BSIM4v6gbbs + here->BSIM4v6ggidlb) * delvbs
|
||||
+ (here->BSIM4v6gm + here->BSIM4v6gbgs + here->BSIM4v6ggidlg) * delvgs
|
||||
+ (here->BSIM4v6gds + here->BSIM4v6gbds + here->BSIM4v6ggidld) * delvds;
|
||||
|
||||
Igstot = here->BSIM4v6Igs + here->BSIM4v6Igcs;
|
||||
cgshat = Igstot + (here->BSIM4v6gIgsg + here->BSIM4v6gIgcsg) * delvgs
|
||||
+ here->BSIM4v6gIgcsd * delvds + here->BSIM4v6gIgcsb * delvbs;
|
||||
|
||||
Igdtot = here->BSIM4v6Igd + here->BSIM4v6Igcd;
|
||||
cgdhat = Igdtot + here->BSIM4v6gIgdg * delvgd + here->BSIM4v6gIgcdg * delvgs
|
||||
+ here->BSIM4v6gIgcdd * delvds + here->BSIM4v6gIgcdb * delvbs;
|
||||
|
||||
Igbtot = here->BSIM4v6Igb;
|
||||
cgbhat = here->BSIM4v6Igb + here->BSIM4v6gIgbg * delvgs + here->BSIM4v6gIgbd
|
||||
* delvds + here->BSIM4v6gIgbb * delvbs;
|
||||
}
|
||||
else
|
||||
{ Idtot = here->BSIM4v6cd + here->BSIM4v6cbd - here->BSIM4v6Igidl; /* bugfix */
|
||||
cdhat = Idtot + here->BSIM4v6gbd * delvbd_jct + here->BSIM4v6gmbs
|
||||
* delvbd + here->BSIM4v6gm * delvgd
|
||||
- (here->BSIM4v6gds + here->BSIM4v6ggidls) * delvds
|
||||
- here->BSIM4v6ggidlg * delvgs - here->BSIM4v6ggidlb * delvbs;
|
||||
|
||||
Igstot = here->BSIM4v6Igs + here->BSIM4v6Igcd;
|
||||
cgshat = Igstot + here->BSIM4v6gIgsg * delvgs + here->BSIM4v6gIgcdg * delvgd
|
||||
- here->BSIM4v6gIgcdd * delvds + here->BSIM4v6gIgcdb * delvbd;
|
||||
|
||||
Igdtot = here->BSIM4v6Igd + here->BSIM4v6Igcs;
|
||||
cgdhat = Igdtot + (here->BSIM4v6gIgdg + here->BSIM4v6gIgcsg) * delvgd
|
||||
- here->BSIM4v6gIgcsd * delvds + here->BSIM4v6gIgcsb * delvbd;
|
||||
|
||||
Igbtot = here->BSIM4v6Igb;
|
||||
cgbhat = here->BSIM4v6Igb + here->BSIM4v6gIgbg * delvgd - here->BSIM4v6gIgbd
|
||||
* delvds + here->BSIM4v6gIgbb * delvbd;
|
||||
}
|
||||
|
||||
Isestot = here->BSIM4v6gstot * (*(ckt->CKTstate0 + here->BSIM4v6vses));
|
||||
cseshat = Isestot + here->BSIM4v6gstot * delvses
|
||||
+ here->BSIM4v6gstotd * delvds + here->BSIM4v6gstotg * delvgs
|
||||
+ here->BSIM4v6gstotb * delvbs;
|
||||
|
||||
Idedtot = here->BSIM4v6gdtot * vdedo;
|
||||
cdedhat = Idedtot + here->BSIM4v6gdtot * delvded
|
||||
+ here->BSIM4v6gdtotd * delvds + here->BSIM4v6gdtotg * delvgs
|
||||
+ here->BSIM4v6gdtotb * delvbs;
|
||||
|
||||
/*
|
||||
* Check convergence
|
||||
*/
|
||||
|
||||
if ((here->BSIM4v6off == 0) || (!(ckt->CKTmode & MODEINITFIX)))
|
||||
{ tol0 = ckt->CKTreltol * MAX(fabs(cdhat), fabs(Idtot))
|
||||
+ ckt->CKTabstol;
|
||||
tol1 = ckt->CKTreltol * MAX(fabs(cseshat), fabs(Isestot))
|
||||
+ ckt->CKTabstol;
|
||||
tol2 = ckt->CKTreltol * MAX(fabs(cdedhat), fabs(Idedtot))
|
||||
+ ckt->CKTabstol;
|
||||
tol3 = ckt->CKTreltol * MAX(fabs(cgshat), fabs(Igstot))
|
||||
+ ckt->CKTabstol;
|
||||
tol4 = ckt->CKTreltol * MAX(fabs(cgdhat), fabs(Igdtot))
|
||||
+ ckt->CKTabstol;
|
||||
tol5 = ckt->CKTreltol * MAX(fabs(cgbhat), fabs(Igbtot))
|
||||
+ ckt->CKTabstol;
|
||||
|
||||
if ((fabs(cdhat - Idtot) >= tol0) || (fabs(cseshat - Isestot) >= tol1)
|
||||
|| (fabs(cdedhat - Idedtot) >= tol2))
|
||||
{ ckt->CKTnoncon++;
|
||||
return(OK);
|
||||
}
|
||||
|
||||
if ((fabs(cgshat - Igstot) >= tol3) || (fabs(cgdhat - Igdtot) >= tol4)
|
||||
|| (fabs(cgbhat - Igbtot) >= tol5))
|
||||
{ ckt->CKTnoncon++;
|
||||
return(OK);
|
||||
}
|
||||
|
||||
Ibtot = here->BSIM4v6cbs + here->BSIM4v6cbd
|
||||
- here->BSIM4v6Igidl - here->BSIM4v6Igisl - here->BSIM4v6csub;
|
||||
if (here->BSIM4v6mode >= 0)
|
||||
{ cbhat = Ibtot + here->BSIM4v6gbd * delvbd_jct
|
||||
+ here->BSIM4v6gbs * delvbs_jct - (here->BSIM4v6gbbs + here->BSIM4v6ggidlb)
|
||||
* delvbs - (here->BSIM4v6gbgs + here->BSIM4v6ggidlg) * delvgs
|
||||
- (here->BSIM4v6gbds + here->BSIM4v6ggidld) * delvds
|
||||
- here->BSIM4v6ggislg * delvgd - here->BSIM4v6ggislb* delvbd + here->BSIM4v6ggisls * delvds ;
|
||||
}
|
||||
else
|
||||
{ cbhat = Ibtot + here->BSIM4v6gbs * delvbs_jct + here->BSIM4v6gbd
|
||||
* delvbd_jct - (here->BSIM4v6gbbs + here->BSIM4v6ggislb) * delvbd
|
||||
- (here->BSIM4v6gbgs + here->BSIM4v6ggislg) * delvgd
|
||||
+ (here->BSIM4v6gbds + here->BSIM4v6ggisld - here->BSIM4v6ggidls) * delvds
|
||||
- here->BSIM4v6ggidlg * delvgs - here->BSIM4v6ggidlb * delvbs;
|
||||
}
|
||||
tol6 = ckt->CKTreltol * MAX(fabs(cbhat),
|
||||
fabs(Ibtot)) + ckt->CKTabstol;
|
||||
if (fabs(cbhat - Ibtot) > tol6)
|
||||
{ ckt->CKTnoncon++;
|
||||
return(OK);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return(OK);
|
||||
}
|
||||
|
|
@ -0,0 +1,43 @@
|
|||
/**** BSIM4.6.2 Released by Wenwei Yang 07/31/2008 ****/
|
||||
|
||||
/**********
|
||||
* Copyright 2006 Regents of the University of California. All rights reserved.
|
||||
* File: b4del.c of BSIM4.6.2.
|
||||
* Author: 2000 Weidong Liu
|
||||
* Authors: 2001- Xuemei Xi, Mohan Dunga, Ali Niknejad, Chenming Hu.
|
||||
* Authors: 2006- Mohan Dunga, Ali Niknejad, Chenming Hu
|
||||
* Authors: 2007- Mohan Dunga, Wenwei Yang, Ali Niknejad, Chenming Hu
|
||||
* Project Director: Prof. Chenming Hu.
|
||||
**********/
|
||||
|
||||
#include "ngspice.h"
|
||||
#include "bsim4v6def.h"
|
||||
#include "sperror.h"
|
||||
#include "gendefs.h"
|
||||
#include "suffix.h"
|
||||
|
||||
|
||||
int
|
||||
BSIM4v6delete(
|
||||
GENmodel *inModel,
|
||||
IFuid name,
|
||||
GENinstance **inInst)
|
||||
{
|
||||
BSIM4v6instance **fast = (BSIM4v6instance**)inInst;
|
||||
BSIM4v6model *model = (BSIM4v6model*)inModel;
|
||||
BSIM4v6instance **prev = NULL;
|
||||
BSIM4v6instance *here;
|
||||
|
||||
for (; model ; model = model->BSIM4v6nextModel)
|
||||
{ prev = &(model->BSIM4v6instances);
|
||||
for (here = *prev; here ; here = *prev)
|
||||
{ if (here->BSIM4v6name == name || (fast && here==*fast))
|
||||
{ *prev= here->BSIM4v6nextInstance;
|
||||
FREE(here);
|
||||
return(OK);
|
||||
}
|
||||
prev = &(here->BSIM4v6nextInstance);
|
||||
}
|
||||
}
|
||||
return(E_NODEV);
|
||||
}
|
||||
|
|
@ -0,0 +1,40 @@
|
|||
/**** BSIM4.6.2 Released by Wenwei Yang 07/31/2008 ****/
|
||||
|
||||
/**********
|
||||
* Copyright 2006 Regents of the University of California. All rights reserved.
|
||||
* File: b4dest.c of BSIM4.6.2.
|
||||
* Author: 2000 Weidong Liu
|
||||
* Authors: 2001- Xuemei Xi, Mohan Dunga, Ali Niknejad, Chenming Hu.
|
||||
* Authors: 2006- Mohan Dunga, Ali Niknejad, Chenming Hu
|
||||
* Authors: 2007- Mohan Dunga, Wenwei Yang, Ali Niknejad, Chenming Hu
|
||||
* Project Director: Prof. Chenming Hu.
|
||||
**********/
|
||||
|
||||
#include "ngspice.h"
|
||||
#include "bsim4v6def.h"
|
||||
#include "suffix.h"
|
||||
|
||||
void
|
||||
BSIM4v6destroy(
|
||||
GENmodel **inModel)
|
||||
{
|
||||
BSIM4v6model **model = (BSIM4v6model**)inModel;
|
||||
BSIM4v6instance *here;
|
||||
BSIM4v6instance *prev = NULL;
|
||||
BSIM4v6model *mod = *model;
|
||||
BSIM4v6model *oldmod = NULL;
|
||||
|
||||
for (; mod ; mod = mod->BSIM4v6nextModel)
|
||||
{ if(oldmod) FREE(oldmod);
|
||||
oldmod = mod;
|
||||
prev = NULL;
|
||||
for (here = mod->BSIM4v6instances; here; here = here->BSIM4v6nextInstance)
|
||||
{ if(prev) FREE(prev);
|
||||
prev = here;
|
||||
}
|
||||
if(prev) FREE(prev);
|
||||
}
|
||||
if(oldmod) FREE(oldmod);
|
||||
*model = NULL;
|
||||
return;
|
||||
}
|
||||
|
|
@ -0,0 +1,379 @@
|
|||
/**** BSIM4.6.2 Released by Wenwei Yang 07/31/2008 ****/
|
||||
|
||||
/**********
|
||||
* Copyright 2006 Regents of the University of California. All rights reserved.
|
||||
* File: b4geo.c of BSIM4.6.2.
|
||||
* Author: 2000 Weidong Liu
|
||||
* Authors: 2001- Xuemei Xi, Mohan Dunga, Ali Niknejad, Chenming Hu.
|
||||
* Authors: 2006- Mohan Dunga, Ali Niknejad, Chenming Hu
|
||||
* Authors: 2007- Mohan Dunga, Wenwei Yang, Ali Niknejad, Chenming Hu
|
||||
* Project Director: Prof. Chenming Hu.
|
||||
**********/
|
||||
|
||||
#include "ngspice.h"
|
||||
#include "bsim4v6def.h"
|
||||
|
||||
/*
|
||||
* WDLiu:
|
||||
* This subrutine is a special module to process the geometry dependent
|
||||
* parasitics for BSIM4v6, which calculates Ps, Pd, As, Ad, and Rs and Rd
|
||||
* for multi-fingers and varous GEO and RGEO options.
|
||||
*/
|
||||
|
||||
int
|
||||
BSIM4v6RdsEndIso(double, double, double, double, double, double, int, int, double *);
|
||||
int
|
||||
BSIM4v6RdsEndSha(double, double, double, double, double, double, int, int, double *);
|
||||
|
||||
static int
|
||||
BSIM4v6NumFingerDiff(double nf, int minSD, double *nuIntD, double *nuEndD, double *nuIntS, double *nuEndS)
|
||||
{
|
||||
int NF;
|
||||
NF = (int)nf;
|
||||
if ((NF%2) != 0)
|
||||
{ *nuEndD = *nuEndS = 1.0;
|
||||
*nuIntD = *nuIntS = 2.0 * MAX((nf - 1.0) / 2.0, 0.0);
|
||||
}
|
||||
else
|
||||
{ if (minSD == 1) /* minimize # of source */
|
||||
{ *nuEndD = 2.0;
|
||||
*nuIntD = 2.0 * MAX((nf / 2.0 - 1.0), 0.0);
|
||||
*nuEndS = 0.0;
|
||||
*nuIntS = nf;
|
||||
}
|
||||
else
|
||||
{ *nuEndD = 0.0;
|
||||
*nuIntD = nf;
|
||||
*nuEndS = 2.0;
|
||||
*nuIntS = 2.0 * MAX((nf / 2.0 - 1.0), 0.0);
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
BSIM4v6PAeffGeo(double nf, int geo, int minSD, double Weffcj, double DMCG, double DMCI, double DMDG, double *Ps, double *Pd, double *As, double *Ad)
|
||||
{
|
||||
double T0, T1, T2;
|
||||
double ADiso, ADsha, ADmer, ASiso, ASsha, ASmer;
|
||||
double PDiso, PDsha, PDmer, PSiso, PSsha, PSmer;
|
||||
double nuIntD = 0.0, nuEndD = 0.0, nuIntS = 0.0, nuEndS = 0.0;
|
||||
|
||||
if (geo < 9) /* For geo = 9 and 10, the numbers of S/D diffusions already known */
|
||||
BSIM4v6NumFingerDiff(nf, minSD, &nuIntD, &nuEndD, &nuIntS, &nuEndS);
|
||||
|
||||
T0 = DMCG + DMCI;
|
||||
T1 = DMCG + DMCG;
|
||||
T2 = DMDG + DMDG;
|
||||
|
||||
PSiso = PDiso = T0 + T0 + Weffcj;
|
||||
PSsha = PDsha = T1;
|
||||
PSmer = PDmer = T2;
|
||||
|
||||
ASiso = ADiso = T0 * Weffcj;
|
||||
ASsha = ADsha = DMCG * Weffcj;
|
||||
ASmer = ADmer = DMDG * Weffcj;
|
||||
|
||||
switch(geo)
|
||||
{ case 0:
|
||||
*Ps = nuEndS * PSiso + nuIntS * PSsha;
|
||||
*Pd = nuEndD * PDiso + nuIntD * PDsha;
|
||||
*As = nuEndS * ASiso + nuIntS * ASsha;
|
||||
*Ad = nuEndD * ADiso + nuIntD * ADsha;
|
||||
break;
|
||||
case 1:
|
||||
*Ps = nuEndS * PSiso + nuIntS * PSsha;
|
||||
*Pd = (nuEndD + nuIntD) * PDsha;
|
||||
*As = nuEndS * ASiso + nuIntS * ASsha;
|
||||
*Ad = (nuEndD + nuIntD) * ADsha;
|
||||
break;
|
||||
case 2:
|
||||
*Ps = (nuEndS + nuIntS) * PSsha;
|
||||
*Pd = nuEndD * PDiso + nuIntD * PDsha;
|
||||
*As = (nuEndS + nuIntS) * ASsha;
|
||||
*Ad = nuEndD * ADiso + nuIntD * ADsha;
|
||||
break;
|
||||
case 3:
|
||||
*Ps = (nuEndS + nuIntS) * PSsha;
|
||||
*Pd = (nuEndD + nuIntD) * PDsha;
|
||||
*As = (nuEndS + nuIntS) * ASsha;
|
||||
*Ad = (nuEndD + nuIntD) * ADsha;
|
||||
break;
|
||||
case 4:
|
||||
*Ps = nuEndS * PSiso + nuIntS * PSsha;
|
||||
*Pd = nuEndD * PDmer + nuIntD * PDsha;
|
||||
*As = nuEndS * ASiso + nuIntS * ASsha;
|
||||
*Ad = nuEndD * ADmer + nuIntD * ADsha;
|
||||
break;
|
||||
case 5:
|
||||
*Ps = (nuEndS + nuIntS) * PSsha;
|
||||
*Pd = nuEndD * PDmer + nuIntD * PDsha;
|
||||
*As = (nuEndS + nuIntS) * ASsha;
|
||||
*Ad = nuEndD * ADmer + nuIntD * ADsha;
|
||||
break;
|
||||
case 6:
|
||||
*Ps = nuEndS * PSmer + nuIntS * PSsha;
|
||||
*Pd = nuEndD * PDiso + nuIntD * PDsha;
|
||||
*As = nuEndS * ASmer + nuIntS * ASsha;
|
||||
*Ad = nuEndD * ADiso + nuIntD * ADsha;
|
||||
break;
|
||||
case 7:
|
||||
*Ps = nuEndS * PSmer + nuIntS * PSsha;
|
||||
*Pd = (nuEndD + nuIntD) * PDsha;
|
||||
*As = nuEndS * ASmer + nuIntS * ASsha;
|
||||
*Ad = (nuEndD + nuIntD) * ADsha;
|
||||
break;
|
||||
case 8:
|
||||
*Ps = nuEndS * PSmer + nuIntS * PSsha;
|
||||
*Pd = nuEndD * PDmer + nuIntD * PDsha;
|
||||
*As = nuEndS * ASmer + nuIntS * ASsha;
|
||||
*Ad = nuEndD * ADmer + nuIntD * ADsha;
|
||||
break;
|
||||
case 9: /* geo = 9 and 10 happen only when nf = even */
|
||||
*Ps = PSiso + (nf - 1.0) * PSsha;
|
||||
*Pd = nf * PDsha;
|
||||
*As = ASiso + (nf - 1.0) * ASsha;
|
||||
*Ad = nf * ADsha;
|
||||
break;
|
||||
case 10:
|
||||
*Ps = nf * PSsha;
|
||||
*Pd = PDiso + (nf - 1.0) * PDsha;
|
||||
*As = nf * ASsha;
|
||||
*Ad = ADiso + (nf - 1.0) * ADsha;
|
||||
break;
|
||||
default:
|
||||
printf("Warning: Specified GEO = %d not matched\n", geo);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
BSIM4v6RdseffGeo(double nf, int geo, int rgeo, int minSD, double Weffcj, double Rsh, double DMCG, double DMCI, double DMDG, int Type, double *Rtot)
|
||||
{
|
||||
double Rint = 0.0, Rend = 0.0;
|
||||
double nuIntD = 0.0, nuEndD = 0.0, nuIntS = 0.0, nuEndS = 0.0;
|
||||
|
||||
if (geo < 9) /* since geo = 9 and 10 only happen when nf = even */
|
||||
{ BSIM4v6NumFingerDiff(nf, minSD, &nuIntD, &nuEndD, &nuIntS, &nuEndS);
|
||||
|
||||
/* Internal S/D resistance -- assume shared S or D and all wide contacts */
|
||||
if (Type == 1)
|
||||
{ if (nuIntS == 0.0)
|
||||
Rint = 0.0;
|
||||
else
|
||||
Rint = Rsh * DMCG / ( Weffcj * nuIntS);
|
||||
}
|
||||
else
|
||||
{ if (nuIntD == 0.0)
|
||||
Rint = 0.0;
|
||||
else
|
||||
Rint = Rsh * DMCG / ( Weffcj * nuIntD);
|
||||
}
|
||||
}
|
||||
|
||||
/* End S/D resistance -- geo dependent */
|
||||
switch(geo)
|
||||
{ case 0:
|
||||
if (Type == 1) BSIM4v6RdsEndIso(Weffcj, Rsh, DMCG, DMCI, DMDG,
|
||||
nuEndS, rgeo, 1, &Rend);
|
||||
else BSIM4v6RdsEndIso(Weffcj, Rsh, DMCG, DMCI, DMDG,
|
||||
nuEndD, rgeo, 0, &Rend);
|
||||
break;
|
||||
case 1:
|
||||
if (Type == 1) BSIM4v6RdsEndIso(Weffcj, Rsh, DMCG, DMCI, DMDG,
|
||||
nuEndS, rgeo, 1, &Rend);
|
||||
else BSIM4v6RdsEndSha(Weffcj, Rsh, DMCG, DMCI, DMDG,
|
||||
nuEndD, rgeo, 0, &Rend);
|
||||
break;
|
||||
case 2:
|
||||
if (Type == 1) BSIM4v6RdsEndSha(Weffcj, Rsh, DMCG, DMCI, DMDG,
|
||||
nuEndS, rgeo, 1, &Rend);
|
||||
else BSIM4v6RdsEndIso(Weffcj, Rsh, DMCG, DMCI, DMDG,
|
||||
nuEndD, rgeo, 0, &Rend);
|
||||
break;
|
||||
case 3:
|
||||
if (Type == 1) BSIM4v6RdsEndSha(Weffcj, Rsh, DMCG, DMCI, DMDG,
|
||||
nuEndS, rgeo, 1, &Rend);
|
||||
else BSIM4v6RdsEndSha(Weffcj, Rsh, DMCG, DMCI, DMDG,
|
||||
nuEndD, rgeo, 0, &Rend);
|
||||
break;
|
||||
case 4:
|
||||
if (Type == 1) BSIM4v6RdsEndIso(Weffcj, Rsh, DMCG, DMCI, DMDG,
|
||||
nuEndS, rgeo, 1, &Rend);
|
||||
else Rend = Rsh * DMDG / Weffcj;
|
||||
break;
|
||||
case 5:
|
||||
if (Type == 1) BSIM4v6RdsEndSha(Weffcj, Rsh, DMCG, DMCI, DMDG,
|
||||
nuEndS, rgeo, 1, &Rend);
|
||||
else Rend = Rsh * DMDG / (Weffcj * nuEndD);
|
||||
break;
|
||||
case 6:
|
||||
if (Type == 1) Rend = Rsh * DMDG / Weffcj;
|
||||
else BSIM4v6RdsEndIso(Weffcj, Rsh, DMCG, DMCI, DMDG,
|
||||
nuEndD, rgeo, 0, &Rend);
|
||||
break;
|
||||
case 7:
|
||||
if (Type == 1) Rend = Rsh * DMDG / (Weffcj * nuEndS);
|
||||
else BSIM4v6RdsEndSha(Weffcj, Rsh, DMCG, DMCI, DMDG,
|
||||
nuEndD, rgeo, 0, &Rend);
|
||||
break;
|
||||
case 8:
|
||||
Rend = Rsh * DMDG / Weffcj;
|
||||
break;
|
||||
case 9: /* all wide contacts assumed for geo = 9 and 10 */
|
||||
if (Type == 1)
|
||||
{ Rend = 0.5 * Rsh * DMCG / Weffcj;
|
||||
if (nf == 2.0)
|
||||
Rint = 0.0;
|
||||
else
|
||||
Rint = Rsh * DMCG / (Weffcj * (nf - 2.0));
|
||||
}
|
||||
else
|
||||
{ Rend = 0.0;
|
||||
Rint = Rsh * DMCG / (Weffcj * nf);
|
||||
}
|
||||
break;
|
||||
case 10:
|
||||
if (Type == 1)
|
||||
{ Rend = 0.0;
|
||||
Rint = Rsh * DMCG / (Weffcj * nf);
|
||||
}
|
||||
else
|
||||
{ Rend = 0.5 * Rsh * DMCG / Weffcj;;
|
||||
if (nf == 2.0)
|
||||
Rint = 0.0;
|
||||
else
|
||||
Rint = Rsh * DMCG / (Weffcj * (nf - 2.0));
|
||||
}
|
||||
break;
|
||||
default:
|
||||
printf("Warning: Specified GEO = %d not matched\n", geo);
|
||||
}
|
||||
|
||||
if (Rint <= 0.0)
|
||||
*Rtot = Rend;
|
||||
else if (Rend <= 0.0)
|
||||
*Rtot = Rint;
|
||||
else
|
||||
*Rtot = Rint * Rend / (Rint + Rend);
|
||||
if(*Rtot==0.0)
|
||||
printf("Warning: Zero resistance returned from RdseffGeo\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
BSIM4v6RdsEndIso(double Weffcj, double Rsh, double DMCG, double DMCI, double DMDG, double nuEnd, int rgeo, int Type, double *Rend)
|
||||
{
|
||||
NG_IGNORE(DMDG);
|
||||
|
||||
if (Type == 1)
|
||||
{ switch(rgeo)
|
||||
{ case 1:
|
||||
case 2:
|
||||
case 5:
|
||||
if (nuEnd == 0.0)
|
||||
*Rend = 0.0;
|
||||
else
|
||||
*Rend = Rsh * DMCG / (Weffcj * nuEnd);
|
||||
break;
|
||||
case 3:
|
||||
case 4:
|
||||
case 6:
|
||||
if ((DMCG + DMCI) == 0.0)
|
||||
printf("(DMCG + DMCI) can not be equal to zero\n");
|
||||
if ((nuEnd == 0.0)||((DMCG+DMCI)==0.0))
|
||||
*Rend = 0.0;
|
||||
else
|
||||
*Rend = Rsh * Weffcj / (3.0 * nuEnd * (DMCG + DMCI));
|
||||
break;
|
||||
default:
|
||||
printf("Warning: Specified RGEO = %d not matched\n", rgeo);
|
||||
}
|
||||
}
|
||||
else
|
||||
{ switch(rgeo)
|
||||
{ case 1:
|
||||
case 3:
|
||||
case 7:
|
||||
if (nuEnd == 0.0)
|
||||
*Rend = 0.0;
|
||||
else
|
||||
*Rend = Rsh * DMCG / (Weffcj * nuEnd);
|
||||
break;
|
||||
case 2:
|
||||
case 4:
|
||||
case 8:
|
||||
if ((DMCG + DMCI) == 0.0)
|
||||
printf("(DMCG + DMCI) can not be equal to zero\n");
|
||||
if ((nuEnd == 0.0)||((DMCG + DMCI)==0.0))
|
||||
*Rend = 0.0;
|
||||
else
|
||||
*Rend = Rsh * Weffcj / (3.0 * nuEnd * (DMCG + DMCI));
|
||||
break;
|
||||
default:
|
||||
printf("Warning: Specified RGEO = %d not matched\n", rgeo);
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
BSIM4v6RdsEndSha(double Weffcj, double Rsh, double DMCG, double DMCI, double DMDG, double nuEnd, int rgeo, int Type, double *Rend)
|
||||
{
|
||||
NG_IGNORE(DMCI);
|
||||
NG_IGNORE(DMDG);
|
||||
|
||||
if (Type == 1)
|
||||
{ switch(rgeo)
|
||||
{ case 1:
|
||||
case 2:
|
||||
case 5:
|
||||
if (nuEnd == 0.0)
|
||||
*Rend = 0.0;
|
||||
else
|
||||
*Rend = Rsh * DMCG / (Weffcj * nuEnd);
|
||||
break;
|
||||
case 3:
|
||||
case 4:
|
||||
case 6:
|
||||
if (DMCG == 0.0)
|
||||
printf("DMCG can not be equal to zero\n");
|
||||
if (nuEnd == 0.0)
|
||||
*Rend = 0.0;
|
||||
else
|
||||
*Rend = Rsh * Weffcj / (6.0 * nuEnd * DMCG);
|
||||
break;
|
||||
default:
|
||||
printf("Warning: Specified RGEO = %d not matched\n", rgeo);
|
||||
}
|
||||
}
|
||||
else
|
||||
{ switch(rgeo)
|
||||
{ case 1:
|
||||
case 3:
|
||||
case 7:
|
||||
if (nuEnd == 0.0)
|
||||
*Rend = 0.0;
|
||||
else
|
||||
*Rend = Rsh * DMCG / (Weffcj * nuEnd);
|
||||
break;
|
||||
case 2:
|
||||
case 4:
|
||||
case 8:
|
||||
if (DMCG == 0.0)
|
||||
printf("DMCG can not be equal to zero\n");
|
||||
if (nuEnd == 0.0)
|
||||
*Rend = 0.0;
|
||||
else
|
||||
*Rend = Rsh * Weffcj / (6.0 * nuEnd * DMCG);
|
||||
break;
|
||||
default:
|
||||
printf("Warning: Specified RGEO = %d not matched\n", rgeo);
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -0,0 +1,46 @@
|
|||
/**** BSIM4.6.2 Released by Wenwei Yang 07/31/2008****/
|
||||
|
||||
/**********
|
||||
* Copyright 2006 Regents of the University of California. All rights reserved.
|
||||
* File: b4getic.c of BSIM4.6.2.
|
||||
* Author: 2000 Weidong Liu
|
||||
* Authors: 2001- Xuemei Xi, Mohan Dunga, Ali Niknejad, Chenming Hu.
|
||||
* Authors: 2006- Mohan Dunga, Ali Niknejad, Chenming Hu
|
||||
* Authors: 2007- Mohan Dunga, Wenwei Yang, Ali Niknejad, Chenming Hu
|
||||
* Project Director: Prof. Chenming Hu.
|
||||
**********/
|
||||
|
||||
#include "ngspice.h"
|
||||
#include "cktdefs.h"
|
||||
#include "bsim4v6def.h"
|
||||
#include "sperror.h"
|
||||
#include "suffix.h"
|
||||
|
||||
|
||||
int
|
||||
BSIM4v6getic(
|
||||
GENmodel *inModel,
|
||||
CKTcircuit *ckt)
|
||||
{
|
||||
BSIM4v6model *model = (BSIM4v6model*)inModel;
|
||||
BSIM4v6instance *here;
|
||||
|
||||
for (; model ; model = model->BSIM4v6nextModel)
|
||||
{ for (here = model->BSIM4v6instances; here; here = here->BSIM4v6nextInstance)
|
||||
{ if (here->BSIM4v6owner != ARCHme) continue;
|
||||
if (!here->BSIM4v6icVDSGiven)
|
||||
{ here->BSIM4v6icVDS = *(ckt->CKTrhs + here->BSIM4v6dNode)
|
||||
- *(ckt->CKTrhs + here->BSIM4v6sNode);
|
||||
}
|
||||
if (!here->BSIM4v6icVGSGiven)
|
||||
{ here->BSIM4v6icVGS = *(ckt->CKTrhs + here->BSIM4v6gNodeExt)
|
||||
- *(ckt->CKTrhs + here->BSIM4v6sNode);
|
||||
}
|
||||
if(!here->BSIM4v6icVBSGiven)
|
||||
{ here->BSIM4v6icVBS = *(ckt->CKTrhs + here->BSIM4v6bNode)
|
||||
- *(ckt->CKTrhs + here->BSIM4v6sNode);
|
||||
}
|
||||
}
|
||||
}
|
||||
return(OK);
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
|
@ -0,0 +1,48 @@
|
|||
/**** BSIM4.6.2 Released by Wenwei Yang 07/31/2008 ****/
|
||||
|
||||
/**********
|
||||
* Copyright 2006 Regents of the University of California. All rights reserved.
|
||||
* File: b4mdel.c of BSIM4.6.2.
|
||||
* Author: 2000 Weidong Liu
|
||||
* Authors: 2001- Xuemei Xi, Mohan Dunga, Ali Niknejad, Chenming Hu.
|
||||
* Authors: 2006- Mohan Dunga, Ali Niknejad, Chenming Hu
|
||||
* Authors: 2007- Mohan Dunga, Wenwei Yang, Ali Niknejad, Chenming Hu
|
||||
* Project Director: Prof. Chenming Hu.
|
||||
**********/
|
||||
|
||||
#include "ngspice.h"
|
||||
#include "bsim4v6def.h"
|
||||
#include "sperror.h"
|
||||
#include "suffix.h"
|
||||
|
||||
int
|
||||
BSIM4v6mDelete(
|
||||
GENmodel **inModel,
|
||||
IFuid modname,
|
||||
GENmodel *kill)
|
||||
{
|
||||
BSIM4v6model **model = (BSIM4v6model**)inModel;
|
||||
BSIM4v6model *modfast = (BSIM4v6model*)kill;
|
||||
BSIM4v6instance *here;
|
||||
BSIM4v6instance *prev = NULL;
|
||||
BSIM4v6model **oldmod;
|
||||
|
||||
oldmod = model;
|
||||
for (; *model ; model = &((*model)->BSIM4v6nextModel))
|
||||
{ if ((*model)->BSIM4v6modName == modname ||
|
||||
(modfast && *model == modfast))
|
||||
goto delgot;
|
||||
oldmod = model;
|
||||
}
|
||||
return(E_NOMOD);
|
||||
|
||||
delgot:
|
||||
*oldmod = (*model)->BSIM4v6nextModel; /* cut deleted device out of list */
|
||||
for (here = (*model)->BSIM4v6instances; here; here = here->BSIM4v6nextInstance)
|
||||
{ if(prev) FREE(prev);
|
||||
prev = here;
|
||||
}
|
||||
if(prev) FREE(prev);
|
||||
FREE(*model);
|
||||
return(OK);
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
|
|
@ -0,0 +1,544 @@
|
|||
/**** BSIM4.6.2 Released by Wenwei Yang 07/31/2008 ****/
|
||||
/**** BSIM4.6.4 Update ngspice 08/22/2009 ****/
|
||||
/**********
|
||||
* Copyright 2006 Regents of the University of California. All rights reserved.
|
||||
* File: b4noi.c of BSIM4.6.2.
|
||||
* Author: 2000 Weidong Liu
|
||||
* Authors: 2001- Xuemei Xi, Mohan Dunga, Ali Niknejad, Chenming Hu.
|
||||
* Authors: 2006- Mohan Dunga, Ali Niknejad, Chenming Hu
|
||||
* Authors: 2007- Mohan Dunga, Wenwei Yang, Ali Niknejad, Chenming Hu
|
||||
* Authors: 2008- Wenwei Yang, Ali Niknejad, Chenming Hu
|
||||
* Project Director: Prof. Chenming Hu.
|
||||
* Modified by Xuemei Xi, 04/06/2001.
|
||||
* Modified by Xuemei Xi, 10/05/2001.
|
||||
* Modified by Xuemei Xi, 05/09/2003.
|
||||
* Modified by Xuemei Xi, 03/04/2004.
|
||||
* Modified by Xuemei Xi, 07/29/2005.
|
||||
* Modified by Mohan Dunga, 12/13/2006
|
||||
* Modified by Wenwei Yang, 07/31/2008.
|
||||
**********/
|
||||
|
||||
#include "ngspice.h"
|
||||
#include "bsim4v6def.h"
|
||||
#include "cktdefs.h"
|
||||
#include "iferrmsg.h"
|
||||
#include "noisedef.h"
|
||||
#include "suffix.h"
|
||||
#include "const.h"
|
||||
|
||||
|
||||
/*
|
||||
* WDL: 1/f noise model has been smoothed out and enhanced with
|
||||
* bulk charge effect as well as physical N* equ. and necessary
|
||||
* conversion into the SI unit system.
|
||||
*/
|
||||
|
||||
static double
|
||||
Eval1ovFNoise(double Vds, BSIM4v6model *model, BSIM4v6instance *here, double freq, double temp)
|
||||
{
|
||||
struct bsim4v6SizeDependParam *pParam;
|
||||
double cd, esat, DelClm, EffFreq, N0, Nl, Leff, Leffsq;
|
||||
double T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, Ssi;
|
||||
|
||||
pParam = here->pParam;
|
||||
cd = fabs(here->BSIM4v6cd);
|
||||
Leff = pParam->BSIM4v6leff - 2.0 * model->BSIM4v6lintnoi;
|
||||
Leffsq = Leff * Leff;
|
||||
esat = 2.0 * here->BSIM4v6vsattemp / here->BSIM4v6ueff;
|
||||
if(model->BSIM4v6em<=0.0) DelClm = 0.0; /* flicker noise modified -JX */
|
||||
else {
|
||||
T0 = ((((Vds - here->BSIM4v6Vdseff) / pParam->BSIM4v6litl)
|
||||
+ model->BSIM4v6em) / esat);
|
||||
DelClm = pParam->BSIM4v6litl * log (MAX(T0, N_MINLOG));
|
||||
if (DelClm < 0.0) DelClm = 0.0; /* bugfix */
|
||||
}
|
||||
EffFreq = pow(freq, model->BSIM4v6ef);
|
||||
T1 = CHARGE * CHARGE * CONSTboltz * cd * temp * here->BSIM4v6ueff;
|
||||
T2 = 1.0e10 * EffFreq * here->BSIM4v6Abulk * model->BSIM4v6coxe * Leffsq;
|
||||
N0 = model->BSIM4v6coxe * here->BSIM4v6Vgsteff / CHARGE;
|
||||
Nl = model->BSIM4v6coxe * here->BSIM4v6Vgsteff
|
||||
* (1.0 - here->BSIM4v6AbovVgst2Vtm * here->BSIM4v6Vdseff) / CHARGE;
|
||||
|
||||
T3 = model->BSIM4v6oxideTrapDensityA
|
||||
* log(MAX(((N0 + here->BSIM4v6nstar) / (Nl + here->BSIM4v6nstar)), N_MINLOG));
|
||||
T4 = model->BSIM4v6oxideTrapDensityB * (N0 - Nl);
|
||||
T5 = model->BSIM4v6oxideTrapDensityC * 0.5 * (N0 * N0 - Nl * Nl);
|
||||
|
||||
T6 = CONSTboltz * temp * cd * cd;
|
||||
T7 = 1.0e10 * EffFreq * Leffsq * pParam->BSIM4v6weff * here->BSIM4v6nf;
|
||||
T8 = model->BSIM4v6oxideTrapDensityA + model->BSIM4v6oxideTrapDensityB * Nl
|
||||
+ model->BSIM4v6oxideTrapDensityC * Nl * Nl;
|
||||
T9 = (Nl + here->BSIM4v6nstar) * (Nl + here->BSIM4v6nstar);
|
||||
Ssi = T1 / T2 * (T3 + T4 + T5) + T6 / T7 * DelClm * T8 / T9;
|
||||
return Ssi;
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
BSIM4v6noise(
|
||||
int mode,
|
||||
int operation,
|
||||
GENmodel *inModel,
|
||||
CKTcircuit *ckt,
|
||||
Ndata *data,
|
||||
double *OnDens)
|
||||
{
|
||||
BSIM4v6model *model = (BSIM4v6model *)inModel;
|
||||
BSIM4v6instance *here;
|
||||
struct bsim4v6SizeDependParam *pParam;
|
||||
char name[N_MXVLNTH];
|
||||
double tempOnoise;
|
||||
double tempInoise;
|
||||
double noizDens[BSIM4v6NSRCS];
|
||||
double lnNdens[BSIM4v6NSRCS];
|
||||
|
||||
double T0, T1, T2, T5, T10, T11;
|
||||
double Vds, Ssi, Swi;
|
||||
double tmp=0.0, gdpr, gspr, npart_theta=0.0, npart_beta=0.0, igsquare, bodymode;
|
||||
|
||||
double m;
|
||||
|
||||
int i;
|
||||
|
||||
/* define the names of the noise sources */
|
||||
static char *BSIM4v6nNames[BSIM4v6NSRCS] =
|
||||
{ /* Note that we have to keep the order */
|
||||
".rd", /* noise due to rd */
|
||||
".rs", /* noise due to rs */
|
||||
".rg", /* noise due to rgeltd */
|
||||
".rbps", /* noise due to rbps */
|
||||
".rbpd", /* noise due to rbpd */
|
||||
".rbpb", /* noise due to rbpb */
|
||||
".rbsb", /* noise due to rbsb */
|
||||
".rbdb", /* noise due to rbdb */
|
||||
".id", /* noise due to id */
|
||||
".1overf", /* flicker (1/f) noise */
|
||||
".igs", /* shot noise due to IGS */
|
||||
".igd", /* shot noise due to IGD */
|
||||
".igb", /* shot noise due to IGB */
|
||||
"" /* total transistor noise */
|
||||
};
|
||||
|
||||
for (; model != NULL; model = model->BSIM4v6nextModel)
|
||||
{ for (here = model->BSIM4v6instances; here != NULL;
|
||||
here = here->BSIM4v6nextInstance)
|
||||
{ pParam = here->pParam;
|
||||
switch (operation)
|
||||
{ case N_OPEN:
|
||||
/* see if we have to to produce a summary report */
|
||||
/* if so, name all the noise generators */
|
||||
|
||||
if (((NOISEAN*)ckt->CKTcurJob)->NStpsSm != 0)
|
||||
{ switch (mode)
|
||||
{ case N_DENS:
|
||||
for (i = 0; i < BSIM4v6NSRCS; i++)
|
||||
{ (void) sprintf(name, "onoise.%s%s",
|
||||
here->BSIM4v6name,
|
||||
BSIM4v6nNames[i]);
|
||||
data->namelist = TREALLOC(IFuid, data->namelist, data->numPlots + 1);
|
||||
if (!data->namelist)
|
||||
return(E_NOMEM);
|
||||
SPfrontEnd->IFnewUid (ckt,
|
||||
&(data->namelist[data->numPlots++]),
|
||||
NULL, name, UID_OTHER,
|
||||
NULL);
|
||||
/* we've added one more plot */
|
||||
}
|
||||
break;
|
||||
case INT_NOIZ:
|
||||
for (i = 0; i < BSIM4v6NSRCS; i++)
|
||||
{ (void) sprintf(name, "onoise_total.%s%s",
|
||||
here->BSIM4v6name,
|
||||
BSIM4v6nNames[i]);
|
||||
data->namelist = TREALLOC(IFuid, data->namelist, data->numPlots + 1);
|
||||
if (!data->namelist)
|
||||
return(E_NOMEM);
|
||||
SPfrontEnd->IFnewUid (ckt,
|
||||
&(data->namelist[data->numPlots++]),
|
||||
NULL, name, UID_OTHER,
|
||||
NULL);
|
||||
/* we've added one more plot */
|
||||
|
||||
(void) sprintf(name, "inoise_total.%s%s",
|
||||
here->BSIM4v6name,
|
||||
BSIM4v6nNames[i]);
|
||||
data->namelist = TREALLOC(IFuid, data->namelist, data->numPlots + 1);
|
||||
if (!data->namelist)
|
||||
return(E_NOMEM);
|
||||
SPfrontEnd->IFnewUid (ckt,
|
||||
&(data->namelist[data->numPlots++]),
|
||||
NULL, name, UID_OTHER,
|
||||
NULL);
|
||||
/* we've added one more plot */
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case N_CALC:
|
||||
m = here->BSIM4v6m;
|
||||
switch (mode)
|
||||
{ case N_DENS:
|
||||
if (model->BSIM4v6tnoiMod == 0)
|
||||
{ if (model->BSIM4v6rdsMod == 0)
|
||||
{ gspr = here->BSIM4v6sourceConductance;
|
||||
gdpr = here->BSIM4v6drainConductance;
|
||||
if (here->BSIM4v6grdsw > 0.0)
|
||||
tmp = 1.0 / here->BSIM4v6grdsw; /* tmp used below */
|
||||
else
|
||||
tmp = 0.0;
|
||||
}
|
||||
else
|
||||
{ gspr = here->BSIM4v6gstot;
|
||||
gdpr = here->BSIM4v6gdtot;
|
||||
tmp = 0.0;
|
||||
}
|
||||
}
|
||||
else
|
||||
{ T5 = here->BSIM4v6Vgsteff / here->BSIM4v6EsatL;
|
||||
T5 *= T5;
|
||||
npart_beta = model->BSIM4v6rnoia * (1.0 + T5
|
||||
* model->BSIM4v6tnoia * pParam->BSIM4v6leff);
|
||||
npart_theta = model->BSIM4v6rnoib * (1.0 + T5
|
||||
* model->BSIM4v6tnoib * pParam->BSIM4v6leff);
|
||||
if(npart_theta > 0.9)
|
||||
npart_theta = 0.9;
|
||||
if(npart_theta > 0.9 * npart_beta)
|
||||
npart_theta = 0.9 * npart_beta; //4.6.2
|
||||
|
||||
if (model->BSIM4v6rdsMod == 0)
|
||||
{ gspr = here->BSIM4v6sourceConductance;
|
||||
gdpr = here->BSIM4v6drainConductance;
|
||||
}
|
||||
else
|
||||
{ gspr = here->BSIM4v6gstot;
|
||||
gdpr = here->BSIM4v6gdtot;
|
||||
}
|
||||
|
||||
if ((*(ckt->CKTstates[0] + here->BSIM4v6vds)) >= 0.0)
|
||||
gspr = gspr * (1.0 + npart_theta * npart_theta * gspr
|
||||
/ here->BSIM4v6IdovVds); /* bugfix */
|
||||
else
|
||||
gdpr = gdpr * (1.0 + npart_theta * npart_theta * gdpr
|
||||
/ here->BSIM4v6IdovVds);
|
||||
}
|
||||
|
||||
NevalSrc(&noizDens[BSIM4v6RDNOIZ],
|
||||
&lnNdens[BSIM4v6RDNOIZ], ckt, THERMNOISE,
|
||||
here->BSIM4v6dNodePrime, here->BSIM4v6dNode,
|
||||
gdpr * m);
|
||||
|
||||
NevalSrc(&noizDens[BSIM4v6RSNOIZ],
|
||||
&lnNdens[BSIM4v6RSNOIZ], ckt, THERMNOISE,
|
||||
here->BSIM4v6sNodePrime, here->BSIM4v6sNode,
|
||||
gspr * m);
|
||||
|
||||
|
||||
if (here->BSIM4v6rgateMod == 1)
|
||||
{ NevalSrc(&noizDens[BSIM4v6RGNOIZ],
|
||||
&lnNdens[BSIM4v6RGNOIZ], ckt, THERMNOISE,
|
||||
here->BSIM4v6gNodePrime, here->BSIM4v6gNodeExt,
|
||||
here->BSIM4v6grgeltd * m);
|
||||
}
|
||||
else if (here->BSIM4v6rgateMod == 2)
|
||||
{
|
||||
T0 = 1.0 + here->BSIM4v6grgeltd/here->BSIM4v6gcrg;
|
||||
T1 = T0 * T0;
|
||||
NevalSrc(&noizDens[BSIM4v6RGNOIZ],
|
||||
&lnNdens[BSIM4v6RGNOIZ], ckt, THERMNOISE,
|
||||
here->BSIM4v6gNodePrime, here->BSIM4v6gNodeExt,
|
||||
here->BSIM4v6grgeltd * m / T1);
|
||||
}
|
||||
else if (here->BSIM4v6rgateMod == 3)
|
||||
{ NevalSrc(&noizDens[BSIM4v6RGNOIZ],
|
||||
&lnNdens[BSIM4v6RGNOIZ], ckt, THERMNOISE,
|
||||
here->BSIM4v6gNodeMid, here->BSIM4v6gNodeExt,
|
||||
here->BSIM4v6grgeltd * m);
|
||||
}
|
||||
else
|
||||
{ noizDens[BSIM4v6RGNOIZ] = 0.0;
|
||||
lnNdens[BSIM4v6RGNOIZ] =
|
||||
log(MAX(noizDens[BSIM4v6RGNOIZ], N_MINLOG));
|
||||
}
|
||||
|
||||
bodymode = 5;
|
||||
if (here->BSIM4v6rbodyMod == 2)
|
||||
{ if( ( !model->BSIM4v6rbps0Given) ||
|
||||
( !model->BSIM4v6rbpd0Given) )
|
||||
bodymode = 1;
|
||||
else
|
||||
if( (!model->BSIM4v6rbsbx0Given && !model->BSIM4v6rbsby0Given) ||
|
||||
(!model->BSIM4v6rbdbx0Given && !model->BSIM4v6rbdby0Given) )
|
||||
bodymode = 3;
|
||||
}
|
||||
|
||||
if (here->BSIM4v6rbodyMod)
|
||||
{
|
||||
if(bodymode == 5)
|
||||
{
|
||||
NevalSrc(&noizDens[BSIM4v6RBPSNOIZ],
|
||||
&lnNdens[BSIM4v6RBPSNOIZ], ckt, THERMNOISE,
|
||||
here->BSIM4v6bNodePrime, here->BSIM4v6sbNode,
|
||||
here->BSIM4v6grbps * m);
|
||||
NevalSrc(&noizDens[BSIM4v6RBPDNOIZ],
|
||||
&lnNdens[BSIM4v6RBPDNOIZ], ckt, THERMNOISE,
|
||||
here->BSIM4v6bNodePrime, here->BSIM4v6dbNode,
|
||||
here->BSIM4v6grbpd * m);
|
||||
NevalSrc(&noizDens[BSIM4v6RBPBNOIZ],
|
||||
&lnNdens[BSIM4v6RBPBNOIZ], ckt, THERMNOISE,
|
||||
here->BSIM4v6bNodePrime, here->BSIM4v6bNode,
|
||||
here->BSIM4v6grbpb * m);
|
||||
NevalSrc(&noizDens[BSIM4v6RBSBNOIZ],
|
||||
&lnNdens[BSIM4v6RBSBNOIZ], ckt, THERMNOISE,
|
||||
here->BSIM4v6bNode, here->BSIM4v6sbNode,
|
||||
here->BSIM4v6grbsb * m);
|
||||
NevalSrc(&noizDens[BSIM4v6RBDBNOIZ],
|
||||
&lnNdens[BSIM4v6RBDBNOIZ], ckt, THERMNOISE,
|
||||
here->BSIM4v6bNode, here->BSIM4v6dbNode,
|
||||
here->BSIM4v6grbdb * m);
|
||||
}
|
||||
if(bodymode == 3)
|
||||
{
|
||||
NevalSrc(&noizDens[BSIM4v6RBPSNOIZ],
|
||||
&lnNdens[BSIM4v6RBPSNOIZ], ckt, THERMNOISE,
|
||||
here->BSIM4v6bNodePrime, here->BSIM4v6sbNode,
|
||||
here->BSIM4v6grbps * m);
|
||||
NevalSrc(&noizDens[BSIM4v6RBPDNOIZ],
|
||||
&lnNdens[BSIM4v6RBPDNOIZ], ckt, THERMNOISE,
|
||||
here->BSIM4v6bNodePrime, here->BSIM4v6dbNode,
|
||||
here->BSIM4v6grbpd * m);
|
||||
NevalSrc(&noizDens[BSIM4v6RBPBNOIZ],
|
||||
&lnNdens[BSIM4v6RBPBNOIZ], ckt, THERMNOISE,
|
||||
here->BSIM4v6bNodePrime, here->BSIM4v6bNode,
|
||||
here->BSIM4v6grbpb * m);
|
||||
noizDens[BSIM4v6RBSBNOIZ] = noizDens[BSIM4v6RBDBNOIZ] = 0.0;
|
||||
lnNdens[BSIM4v6RBSBNOIZ] =
|
||||
log(MAX(noizDens[BSIM4v6RBSBNOIZ], N_MINLOG));
|
||||
lnNdens[BSIM4v6RBDBNOIZ] =
|
||||
log(MAX(noizDens[BSIM4v6RBDBNOIZ], N_MINLOG));
|
||||
}
|
||||
if(bodymode == 1)
|
||||
{
|
||||
NevalSrc(&noizDens[BSIM4v6RBPBNOIZ],
|
||||
&lnNdens[BSIM4v6RBPBNOIZ], ckt, THERMNOISE,
|
||||
here->BSIM4v6bNodePrime, here->BSIM4v6bNode,
|
||||
here->BSIM4v6grbpb * m);
|
||||
noizDens[BSIM4v6RBPSNOIZ] = noizDens[BSIM4v6RBPDNOIZ] = 0.0;
|
||||
noizDens[BSIM4v6RBSBNOIZ] = noizDens[BSIM4v6RBDBNOIZ] = 0.0;
|
||||
lnNdens[BSIM4v6RBPSNOIZ] =
|
||||
log(MAX(noizDens[BSIM4v6RBPSNOIZ], N_MINLOG));
|
||||
lnNdens[BSIM4v6RBPDNOIZ] =
|
||||
log(MAX(noizDens[BSIM4v6RBPDNOIZ], N_MINLOG));
|
||||
lnNdens[BSIM4v6RBSBNOIZ] =
|
||||
log(MAX(noizDens[BSIM4v6RBSBNOIZ], N_MINLOG));
|
||||
lnNdens[BSIM4v6RBDBNOIZ] =
|
||||
log(MAX(noizDens[BSIM4v6RBDBNOIZ], N_MINLOG));
|
||||
}
|
||||
}
|
||||
else
|
||||
{ noizDens[BSIM4v6RBPSNOIZ] = noizDens[BSIM4v6RBPDNOIZ] = 0.0;
|
||||
noizDens[BSIM4v6RBPBNOIZ] = 0.0;
|
||||
noizDens[BSIM4v6RBSBNOIZ] = noizDens[BSIM4v6RBDBNOIZ] = 0.0;
|
||||
lnNdens[BSIM4v6RBPSNOIZ] =
|
||||
log(MAX(noizDens[BSIM4v6RBPSNOIZ], N_MINLOG));
|
||||
lnNdens[BSIM4v6RBPDNOIZ] =
|
||||
log(MAX(noizDens[BSIM4v6RBPDNOIZ], N_MINLOG));
|
||||
lnNdens[BSIM4v6RBPBNOIZ] =
|
||||
log(MAX(noizDens[BSIM4v6RBPBNOIZ], N_MINLOG));
|
||||
lnNdens[BSIM4v6RBSBNOIZ] =
|
||||
log(MAX(noizDens[BSIM4v6RBSBNOIZ], N_MINLOG));
|
||||
lnNdens[BSIM4v6RBDBNOIZ] =
|
||||
log(MAX(noizDens[BSIM4v6RBDBNOIZ], N_MINLOG));
|
||||
}
|
||||
|
||||
|
||||
switch(model->BSIM4v6tnoiMod)
|
||||
{ case 0:
|
||||
T0 = m * here->BSIM4v6ueff * fabs(here->BSIM4v6qinv);
|
||||
T1 = T0 * tmp + pParam->BSIM4v6leff
|
||||
* pParam->BSIM4v6leff;
|
||||
NevalSrc(&noizDens[BSIM4v6IDNOIZ],
|
||||
&lnNdens[BSIM4v6IDNOIZ], ckt,
|
||||
THERMNOISE, here->BSIM4v6dNodePrime,
|
||||
here->BSIM4v6sNodePrime,
|
||||
(T0 / T1) * model->BSIM4v6ntnoi);
|
||||
break;
|
||||
case 1:
|
||||
T0 = m * (here->BSIM4v6gm + here->BSIM4v6gmbs + here->BSIM4v6gds);
|
||||
T0 *= T0;
|
||||
igsquare = npart_theta * npart_theta * T0 / here->BSIM4v6IdovVds;
|
||||
T1 = npart_beta * (here->BSIM4v6gm
|
||||
+ here->BSIM4v6gmbs) + here->BSIM4v6gds;
|
||||
T2 = T1 * T1 / here->BSIM4v6IdovVds;
|
||||
NevalSrc(&noizDens[BSIM4v6IDNOIZ],
|
||||
&lnNdens[BSIM4v6IDNOIZ], ckt,
|
||||
THERMNOISE, here->BSIM4v6dNodePrime,
|
||||
here->BSIM4v6sNodePrime, (T2 - igsquare));
|
||||
break;
|
||||
}
|
||||
|
||||
NevalSrc(&noizDens[BSIM4v6FLNOIZ], NULL,
|
||||
ckt, N_GAIN, here->BSIM4v6dNodePrime,
|
||||
here->BSIM4v6sNodePrime, (double) 0.0);
|
||||
|
||||
switch(model->BSIM4v6fnoiMod)
|
||||
{ case 0:
|
||||
noizDens[BSIM4v6FLNOIZ] *= m * model->BSIM4v6kf
|
||||
* exp(model->BSIM4v6af
|
||||
* log(MAX(fabs(here->BSIM4v6cd),
|
||||
N_MINLOG)))
|
||||
/ (pow(data->freq, model->BSIM4v6ef)
|
||||
* pParam->BSIM4v6leff
|
||||
* pParam->BSIM4v6leff
|
||||
* model->BSIM4v6coxe);
|
||||
break;
|
||||
case 1:
|
||||
Vds = *(ckt->CKTstates[0] + here->BSIM4v6vds);
|
||||
if (Vds < 0.0)
|
||||
Vds = -Vds;
|
||||
|
||||
Ssi = Eval1ovFNoise(Vds, model, here,
|
||||
data->freq, ckt->CKTtemp);
|
||||
T10 = model->BSIM4v6oxideTrapDensityA
|
||||
* CONSTboltz * ckt->CKTtemp;
|
||||
T11 = pParam->BSIM4v6weff * here->BSIM4v6nf * pParam->BSIM4v6leff
|
||||
* pow(data->freq, model->BSIM4v6ef) * 1.0e10
|
||||
* here->BSIM4v6nstar * here->BSIM4v6nstar;
|
||||
Swi = T10 / T11 * here->BSIM4v6cd
|
||||
* here->BSIM4v6cd;
|
||||
T1 = Swi + Ssi;
|
||||
if (T1 > 0.0)
|
||||
noizDens[BSIM4v6FLNOIZ] *= m * (Ssi * Swi) / T1;
|
||||
else
|
||||
noizDens[BSIM4v6FLNOIZ] *= 0.0;
|
||||
break;
|
||||
}
|
||||
|
||||
lnNdens[BSIM4v6FLNOIZ] =
|
||||
log(MAX(noizDens[BSIM4v6FLNOIZ], N_MINLOG));
|
||||
|
||||
|
||||
if(here->BSIM4v6mode >= 0) { /* bugfix */
|
||||
NevalSrc(&noizDens[BSIM4v6IGSNOIZ],
|
||||
&lnNdens[BSIM4v6IGSNOIZ], ckt, SHOTNOISE,
|
||||
here->BSIM4v6gNodePrime, here->BSIM4v6sNodePrime,
|
||||
m * (here->BSIM4v6Igs + here->BSIM4v6Igcs));
|
||||
NevalSrc(&noizDens[BSIM4v6IGDNOIZ],
|
||||
&lnNdens[BSIM4v6IGDNOIZ], ckt, SHOTNOISE,
|
||||
here->BSIM4v6gNodePrime, here->BSIM4v6dNodePrime,
|
||||
m * (here->BSIM4v6Igd + here->BSIM4v6Igcd));
|
||||
} else {
|
||||
NevalSrc(&noizDens[BSIM4v6IGSNOIZ],
|
||||
&lnNdens[BSIM4v6IGSNOIZ], ckt, SHOTNOISE,
|
||||
here->BSIM4v6gNodePrime, here->BSIM4v6sNodePrime,
|
||||
m * (here->BSIM4v6Igs + here->BSIM4v6Igcd));
|
||||
NevalSrc(&noizDens[BSIM4v6IGDNOIZ],
|
||||
&lnNdens[BSIM4v6IGDNOIZ], ckt, SHOTNOISE,
|
||||
here->BSIM4v6gNodePrime, here->BSIM4v6dNodePrime,
|
||||
m * (here->BSIM4v6Igd + here->BSIM4v6Igcs));
|
||||
}
|
||||
NevalSrc(&noizDens[BSIM4v6IGBNOIZ],
|
||||
&lnNdens[BSIM4v6IGBNOIZ], ckt, SHOTNOISE,
|
||||
here->BSIM4v6gNodePrime, here->BSIM4v6bNodePrime,
|
||||
m * here->BSIM4v6Igb);
|
||||
|
||||
|
||||
noizDens[BSIM4v6TOTNOIZ] = noizDens[BSIM4v6RDNOIZ]
|
||||
+ noizDens[BSIM4v6RSNOIZ] + noizDens[BSIM4v6RGNOIZ]
|
||||
+ noizDens[BSIM4v6RBPSNOIZ] + noizDens[BSIM4v6RBPDNOIZ]
|
||||
+ noizDens[BSIM4v6RBPBNOIZ]
|
||||
+ noizDens[BSIM4v6RBSBNOIZ] + noizDens[BSIM4v6RBDBNOIZ]
|
||||
+ noizDens[BSIM4v6IDNOIZ] + noizDens[BSIM4v6FLNOIZ]
|
||||
+ noizDens[BSIM4v6IGSNOIZ] + noizDens[BSIM4v6IGDNOIZ]
|
||||
+ noizDens[BSIM4v6IGBNOIZ];
|
||||
lnNdens[BSIM4v6TOTNOIZ] =
|
||||
log(MAX(noizDens[BSIM4v6TOTNOIZ], N_MINLOG));
|
||||
|
||||
*OnDens += noizDens[BSIM4v6TOTNOIZ];
|
||||
|
||||
if (data->delFreq == 0.0)
|
||||
{ /* if we haven't done any previous
|
||||
integration, we need to initialize our
|
||||
"history" variables.
|
||||
*/
|
||||
|
||||
for (i = 0; i < BSIM4v6NSRCS; i++)
|
||||
{ here->BSIM4v6nVar[LNLSTDENS][i] =
|
||||
lnNdens[i];
|
||||
}
|
||||
|
||||
/* clear out our integration variables
|
||||
if it's the first pass
|
||||
*/
|
||||
if (data->freq ==
|
||||
((NOISEAN*) ckt->CKTcurJob)->NstartFreq)
|
||||
{ for (i = 0; i < BSIM4v6NSRCS; i++)
|
||||
{ here->BSIM4v6nVar[OUTNOIZ][i] = 0.0;
|
||||
here->BSIM4v6nVar[INNOIZ][i] = 0.0;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{ /* data->delFreq != 0.0,
|
||||
we have to integrate.
|
||||
*/
|
||||
for (i = 0; i < BSIM4v6NSRCS; i++)
|
||||
{ if (i != BSIM4v6TOTNOIZ)
|
||||
{ tempOnoise = Nintegrate(noizDens[i],
|
||||
lnNdens[i],
|
||||
here->BSIM4v6nVar[LNLSTDENS][i],
|
||||
data);
|
||||
tempInoise = Nintegrate(noizDens[i]
|
||||
* data->GainSqInv, lnNdens[i]
|
||||
+ data->lnGainInv,
|
||||
here->BSIM4v6nVar[LNLSTDENS][i]
|
||||
+ data->lnGainInv, data);
|
||||
here->BSIM4v6nVar[LNLSTDENS][i] =
|
||||
lnNdens[i];
|
||||
data->outNoiz += tempOnoise;
|
||||
data->inNoise += tempInoise;
|
||||
if (((NOISEAN*)
|
||||
ckt->CKTcurJob)->NStpsSm != 0)
|
||||
{ here->BSIM4v6nVar[OUTNOIZ][i]
|
||||
+= tempOnoise;
|
||||
here->BSIM4v6nVar[OUTNOIZ][BSIM4v6TOTNOIZ]
|
||||
+= tempOnoise;
|
||||
here->BSIM4v6nVar[INNOIZ][i]
|
||||
+= tempInoise;
|
||||
here->BSIM4v6nVar[INNOIZ][BSIM4v6TOTNOIZ]
|
||||
+= tempInoise;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (data->prtSummary)
|
||||
{ for (i = 0; i < BSIM4v6NSRCS; i++)
|
||||
{ /* print a summary report */
|
||||
data->outpVector[data->outNumber++]
|
||||
= noizDens[i];
|
||||
}
|
||||
}
|
||||
break;
|
||||
case INT_NOIZ:
|
||||
/* already calculated, just output */
|
||||
if (((NOISEAN*)ckt->CKTcurJob)->NStpsSm != 0)
|
||||
{ for (i = 0; i < BSIM4v6NSRCS; i++)
|
||||
{ data->outpVector[data->outNumber++]
|
||||
= here->BSIM4v6nVar[OUTNOIZ][i];
|
||||
data->outpVector[data->outNumber++]
|
||||
= here->BSIM4v6nVar[INNOIZ][i];
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case N_CLOSE:
|
||||
/* do nothing, the main calling routine will close */
|
||||
return (OK);
|
||||
break; /* the plots */
|
||||
} /* switch (operation) */
|
||||
} /* for here */
|
||||
} /* for model */
|
||||
|
||||
return(OK);
|
||||
}
|
||||
|
|
@ -0,0 +1,204 @@
|
|||
/**** BSIM4.6.2 Released by Wenwei Yang 07/31/2008 ****/
|
||||
|
||||
/**********
|
||||
* Copyright 2006 Regents of the University of California. All rights reserved.
|
||||
* File: b4par.c of BSIM4.6.2.
|
||||
* Author: 2000 Weidong Liu
|
||||
* Authors: 2001- Xuemei Xi, Mohan Dunga, Ali Niknejad, Chenming Hu.
|
||||
* Authors: 2006- Mohan Dunga, Ali Niknejad, Chenming Hu
|
||||
* Authors: 2007- Mohan Dunga, Wenwei Yang, Ali Niknejad, Chenming Hu
|
||||
* Project Director: Prof. Chenming Hu.
|
||||
* Modified by Xuemei Xi, 04/06/2001.
|
||||
* Modified by Xuemei Xi, 11/15/2002.
|
||||
* Modified by Xuemei Xi, 05/09/2003.
|
||||
* Modified by Xuemei Xi, Mohan Dunga, 07/29/2005.
|
||||
**********/
|
||||
|
||||
#include "ngspice.h"
|
||||
#include "ifsim.h"
|
||||
#include "bsim4v6def.h"
|
||||
#include "sperror.h"
|
||||
#include "suffix.h"
|
||||
#include "fteext.h"
|
||||
|
||||
int
|
||||
BSIM4v6param(
|
||||
int param,
|
||||
IFvalue *value,
|
||||
GENinstance *inst,
|
||||
IFvalue *select)
|
||||
{
|
||||
double scale;
|
||||
|
||||
BSIM4v6instance *here = (BSIM4v6instance*)inst;
|
||||
|
||||
NG_IGNORE(select);
|
||||
|
||||
if (!cp_getvar("scale", CP_REAL, &scale))
|
||||
scale = 1;
|
||||
|
||||
switch(param)
|
||||
{ case BSIM4v6_W:
|
||||
here->BSIM4v6w = value->rValue*scale;
|
||||
here->BSIM4v6wGiven = TRUE;
|
||||
break;
|
||||
case BSIM4v6_L:
|
||||
here->BSIM4v6l = value->rValue*scale;
|
||||
here->BSIM4v6lGiven = TRUE;
|
||||
break;
|
||||
case BSIM4v6_M:
|
||||
here->BSIM4v6m = value->rValue;
|
||||
here->BSIM4v6mGiven = TRUE;
|
||||
break;
|
||||
case BSIM4v6_NF:
|
||||
here->BSIM4v6nf = value->rValue;
|
||||
here->BSIM4v6nfGiven = TRUE;
|
||||
break;
|
||||
case BSIM4v6_MIN:
|
||||
here->BSIM4v6min = value->iValue;
|
||||
here->BSIM4v6minGiven = TRUE;
|
||||
break;
|
||||
case BSIM4v6_AS:
|
||||
here->BSIM4v6sourceArea = value->rValue*scale*scale;
|
||||
here->BSIM4v6sourceAreaGiven = TRUE;
|
||||
break;
|
||||
case BSIM4v6_AD:
|
||||
here->BSIM4v6drainArea = value->rValue*scale*scale;
|
||||
here->BSIM4v6drainAreaGiven = TRUE;
|
||||
break;
|
||||
case BSIM4v6_PS:
|
||||
here->BSIM4v6sourcePerimeter = value->rValue*scale;
|
||||
here->BSIM4v6sourcePerimeterGiven = TRUE;
|
||||
break;
|
||||
case BSIM4v6_PD:
|
||||
here->BSIM4v6drainPerimeter = value->rValue*scale;
|
||||
here->BSIM4v6drainPerimeterGiven = TRUE;
|
||||
break;
|
||||
case BSIM4v6_NRS:
|
||||
here->BSIM4v6sourceSquares = value->rValue;
|
||||
here->BSIM4v6sourceSquaresGiven = TRUE;
|
||||
break;
|
||||
case BSIM4v6_NRD:
|
||||
here->BSIM4v6drainSquares = value->rValue;
|
||||
here->BSIM4v6drainSquaresGiven = TRUE;
|
||||
break;
|
||||
case BSIM4v6_OFF:
|
||||
here->BSIM4v6off = value->iValue;
|
||||
break;
|
||||
case BSIM4v6_SA:
|
||||
here->BSIM4v6sa = value->rValue;
|
||||
here->BSIM4v6saGiven = TRUE;
|
||||
break;
|
||||
case BSIM4v6_SB:
|
||||
here->BSIM4v6sb = value->rValue;
|
||||
here->BSIM4v6sbGiven = TRUE;
|
||||
break;
|
||||
case BSIM4v6_SD:
|
||||
here->BSIM4v6sd = value->rValue;
|
||||
here->BSIM4v6sdGiven = TRUE;
|
||||
break;
|
||||
case BSIM4v6_SCA:
|
||||
here->BSIM4v6sca = value->rValue;
|
||||
here->BSIM4v6scaGiven = TRUE;
|
||||
break;
|
||||
case BSIM4v6_SCB:
|
||||
here->BSIM4v6scb = value->rValue;
|
||||
here->BSIM4v6scbGiven = TRUE;
|
||||
break;
|
||||
case BSIM4v6_SCC:
|
||||
here->BSIM4v6scc = value->rValue;
|
||||
here->BSIM4v6sccGiven = TRUE;
|
||||
break;
|
||||
case BSIM4v6_SC:
|
||||
here->BSIM4v6sc = value->rValue;
|
||||
here->BSIM4v6scGiven = TRUE;
|
||||
break;
|
||||
case BSIM4v6_RBSB:
|
||||
here->BSIM4v6rbsb = value->rValue;
|
||||
here->BSIM4v6rbsbGiven = TRUE;
|
||||
break;
|
||||
case BSIM4v6_RBDB:
|
||||
here->BSIM4v6rbdb = value->rValue;
|
||||
here->BSIM4v6rbdbGiven = TRUE;
|
||||
break;
|
||||
case BSIM4v6_RBPB:
|
||||
here->BSIM4v6rbpb = value->rValue;
|
||||
here->BSIM4v6rbpbGiven = TRUE;
|
||||
break;
|
||||
case BSIM4v6_RBPS:
|
||||
here->BSIM4v6rbps = value->rValue;
|
||||
here->BSIM4v6rbpsGiven = TRUE;
|
||||
break;
|
||||
case BSIM4v6_RBPD:
|
||||
here->BSIM4v6rbpd = value->rValue;
|
||||
here->BSIM4v6rbpdGiven = TRUE;
|
||||
break;
|
||||
case BSIM4v6_DELVTO:
|
||||
here->BSIM4v6delvto = value->rValue;
|
||||
here->BSIM4v6delvtoGiven = TRUE;
|
||||
break;
|
||||
case BSIM4v6_XGW:
|
||||
here->BSIM4v6xgw = value->rValue;
|
||||
here->BSIM4v6xgwGiven = TRUE;
|
||||
break;
|
||||
case BSIM4v6_NGCON:
|
||||
here->BSIM4v6ngcon = value->rValue;
|
||||
here->BSIM4v6ngconGiven = TRUE;
|
||||
break;
|
||||
case BSIM4v6_TRNQSMOD:
|
||||
here->BSIM4v6trnqsMod = value->iValue;
|
||||
here->BSIM4v6trnqsModGiven = TRUE;
|
||||
break;
|
||||
case BSIM4v6_ACNQSMOD:
|
||||
here->BSIM4v6acnqsMod = value->iValue;
|
||||
here->BSIM4v6acnqsModGiven = TRUE;
|
||||
break;
|
||||
case BSIM4v6_RBODYMOD:
|
||||
here->BSIM4v6rbodyMod = value->iValue;
|
||||
here->BSIM4v6rbodyModGiven = TRUE;
|
||||
break;
|
||||
case BSIM4v6_RGATEMOD:
|
||||
here->BSIM4v6rgateMod = value->iValue;
|
||||
here->BSIM4v6rgateModGiven = TRUE;
|
||||
break;
|
||||
case BSIM4v6_GEOMOD:
|
||||
here->BSIM4v6geoMod = value->iValue;
|
||||
here->BSIM4v6geoModGiven = TRUE;
|
||||
break;
|
||||
case BSIM4v6_RGEOMOD:
|
||||
here->BSIM4v6rgeoMod = value->iValue;
|
||||
here->BSIM4v6rgeoModGiven = TRUE;
|
||||
break;
|
||||
case BSIM4v6_IC_VDS:
|
||||
here->BSIM4v6icVDS = value->rValue;
|
||||
here->BSIM4v6icVDSGiven = TRUE;
|
||||
break;
|
||||
case BSIM4v6_IC_VGS:
|
||||
here->BSIM4v6icVGS = value->rValue;
|
||||
here->BSIM4v6icVGSGiven = TRUE;
|
||||
break;
|
||||
case BSIM4v6_IC_VBS:
|
||||
here->BSIM4v6icVBS = value->rValue;
|
||||
here->BSIM4v6icVBSGiven = TRUE;
|
||||
break;
|
||||
case BSIM4v6_IC:
|
||||
switch(value->v.numValue)
|
||||
{ case 3:
|
||||
here->BSIM4v6icVBS = *(value->v.vec.rVec+2);
|
||||
here->BSIM4v6icVBSGiven = TRUE;
|
||||
case 2:
|
||||
here->BSIM4v6icVGS = *(value->v.vec.rVec+1);
|
||||
here->BSIM4v6icVGSGiven = TRUE;
|
||||
case 1:
|
||||
here->BSIM4v6icVDS = *(value->v.vec.rVec);
|
||||
here->BSIM4v6icVDSGiven = TRUE;
|
||||
break;
|
||||
default:
|
||||
return(E_BADPARM);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
return(E_BADPARM);
|
||||
}
|
||||
return(OK);
|
||||
}
|
||||
|
|
@ -0,0 +1,759 @@
|
|||
/**** BSIM4.6.2 Released by Wenwei Yang 07/31/2008 ****/
|
||||
|
||||
/**********
|
||||
* Copyright 2006 Regents of the University of California. All rights reserved.
|
||||
* File: b4pzld.c of BSIM4.6.2.
|
||||
* Author: 2000 Weidong Liu
|
||||
* Authors: 2001- Xuemei Xi, Mohan Dunga, Ali Niknejad, Chenming Hu.
|
||||
* Authors: 2006- Mohan Dunga, Ali Niknejad, Chenming Hu
|
||||
* Authors: 2007- Mohan Dunga, Wenwei Yang, Ali Niknejad, Chenming Hu
|
||||
* Project Director: Prof. Chenming Hu.
|
||||
* Modified by Xuemei Xi, 10/05/2001.
|
||||
**********/
|
||||
|
||||
#include "ngspice.h"
|
||||
#include "cktdefs.h"
|
||||
#include "complex.h"
|
||||
#include "sperror.h"
|
||||
#include "bsim4v6def.h"
|
||||
#include "suffix.h"
|
||||
|
||||
int
|
||||
BSIM4v6pzLoad(
|
||||
GENmodel *inModel,
|
||||
CKTcircuit *ckt,
|
||||
SPcomplex *s)
|
||||
{
|
||||
BSIM4v6model *model = (BSIM4v6model*)inModel;
|
||||
BSIM4v6instance *here;
|
||||
|
||||
double gjbd, gjbs, geltd, gcrg, gcrgg, gcrgd, gcrgs, gcrgb;
|
||||
double xcggb, xcgdb, xcgsb, xcgbb, xcbgb, xcbdb, xcbsb, xcbbb;
|
||||
double xcdgb, xcddb, xcdsb, xcdbb, xcsgb, xcsdb, xcssb, xcsbb;
|
||||
double gds, capbd, capbs, FwdSum, RevSum, Gm, Gmbs;
|
||||
double gstot, gstotd, gstotg, gstots, gstotb, gspr;
|
||||
double gdtot, gdtotd, gdtotg, gdtots, gdtotb, gdpr;
|
||||
double gIstotg, gIstotd, gIstots, gIstotb;
|
||||
double gIdtotg, gIdtotd, gIdtots, gIdtotb;
|
||||
double gIbtotg, gIbtotd, gIbtots, gIbtotb;
|
||||
double gIgtotg, gIgtotd, gIgtots, gIgtotb;
|
||||
double cgso, cgdo, cgbo;
|
||||
double xcdbdb=0.0, xcsbsb=0.0, xcgmgmb=0.0, xcgmdb=0.0, xcgmsb=0.0, xcdgmb=0.0, xcsgmb=0.0;
|
||||
double xcgmbb=0.0, xcbgmb=0.0;
|
||||
double dxpart, sxpart, xgtg, xgtd, xgts, xgtb, xcqgb=0.0, xcqdb=0.0, xcqsb=0.0, xcqbb=0.0;
|
||||
double gbspsp, gbbdp, gbbsp, gbspg, gbspb;
|
||||
double gbspdp, gbdpdp, gbdpg, gbdpb, gbdpsp;
|
||||
double ddxpart_dVd, ddxpart_dVg, ddxpart_dVb, ddxpart_dVs;
|
||||
double dsxpart_dVd, dsxpart_dVg, dsxpart_dVb, dsxpart_dVs;
|
||||
double T0=0.0, T1, CoxWL, qcheq, Cdg, Cdd, Cds, Csg, Csd, Css;
|
||||
double ScalingFactor = 1.0e-9;
|
||||
struct bsim4v6SizeDependParam *pParam;
|
||||
double ggidld, ggidlg, ggidlb, ggislg, ggislb, ggisls;
|
||||
|
||||
double m;
|
||||
|
||||
for (; model != NULL; model = model->BSIM4v6nextModel)
|
||||
{ for (here = model->BSIM4v6instances; here!= NULL;
|
||||
here = here->BSIM4v6nextInstance)
|
||||
{ if (here->BSIM4v6owner != ARCHme) continue;
|
||||
pParam = here->pParam;
|
||||
capbd = here->BSIM4v6capbd;
|
||||
capbs = here->BSIM4v6capbs;
|
||||
cgso = here->BSIM4v6cgso;
|
||||
cgdo = here->BSIM4v6cgdo;
|
||||
cgbo = pParam->BSIM4v6cgbo;
|
||||
|
||||
if (here->BSIM4v6mode >= 0)
|
||||
{ Gm = here->BSIM4v6gm;
|
||||
Gmbs = here->BSIM4v6gmbs;
|
||||
FwdSum = Gm + Gmbs;
|
||||
RevSum = 0.0;
|
||||
|
||||
gbbdp = -(here->BSIM4v6gbds);
|
||||
gbbsp = here->BSIM4v6gbds + here->BSIM4v6gbgs + here->BSIM4v6gbbs;
|
||||
gbdpg = here->BSIM4v6gbgs;
|
||||
gbdpdp = here->BSIM4v6gbds;
|
||||
gbdpb = here->BSIM4v6gbbs;
|
||||
gbdpsp = -(gbdpg + gbdpdp + gbdpb);
|
||||
|
||||
gbspdp = 0.0;
|
||||
gbspg = 0.0;
|
||||
gbspb = 0.0;
|
||||
gbspsp = 0.0;
|
||||
|
||||
if (model->BSIM4v6igcMod)
|
||||
{ gIstotg = here->BSIM4v6gIgsg + here->BSIM4v6gIgcsg;
|
||||
gIstotd = here->BSIM4v6gIgcsd;
|
||||
gIstots = here->BSIM4v6gIgss + here->BSIM4v6gIgcss;
|
||||
gIstotb = here->BSIM4v6gIgcsb;
|
||||
|
||||
gIdtotg = here->BSIM4v6gIgdg + here->BSIM4v6gIgcdg;
|
||||
gIdtotd = here->BSIM4v6gIgdd + here->BSIM4v6gIgcdd;
|
||||
gIdtots = here->BSIM4v6gIgcds;
|
||||
gIdtotb = here->BSIM4v6gIgcdb;
|
||||
}
|
||||
else
|
||||
{ gIstotg = gIstotd = gIstots = gIstotb = 0.0;
|
||||
gIdtotg = gIdtotd = gIdtots = gIdtotb = 0.0;
|
||||
}
|
||||
|
||||
if (model->BSIM4v6igbMod)
|
||||
{ gIbtotg = here->BSIM4v6gIgbg;
|
||||
gIbtotd = here->BSIM4v6gIgbd;
|
||||
gIbtots = here->BSIM4v6gIgbs;
|
||||
gIbtotb = here->BSIM4v6gIgbb;
|
||||
}
|
||||
else
|
||||
gIbtotg = gIbtotd = gIbtots = gIbtotb = 0.0;
|
||||
|
||||
if ((model->BSIM4v6igcMod != 0) || (model->BSIM4v6igbMod != 0))
|
||||
{ gIgtotg = gIstotg + gIdtotg + gIbtotg;
|
||||
gIgtotd = gIstotd + gIdtotd + gIbtotd ;
|
||||
gIgtots = gIstots + gIdtots + gIbtots;
|
||||
gIgtotb = gIstotb + gIdtotb + gIbtotb;
|
||||
}
|
||||
else
|
||||
gIgtotg = gIgtotd = gIgtots = gIgtotb = 0.0;
|
||||
|
||||
if (here->BSIM4v6rgateMod == 2)
|
||||
T0 = *(ckt->CKTstates[0] + here->BSIM4v6vges)
|
||||
- *(ckt->CKTstates[0] + here->BSIM4v6vgs);
|
||||
else if (here->BSIM4v6rgateMod == 3)
|
||||
T0 = *(ckt->CKTstates[0] + here->BSIM4v6vgms)
|
||||
- *(ckt->CKTstates[0] + here->BSIM4v6vgs);
|
||||
if (here->BSIM4v6rgateMod > 1)
|
||||
{ gcrgd = here->BSIM4v6gcrgd * T0;
|
||||
gcrgg = here->BSIM4v6gcrgg * T0;
|
||||
gcrgs = here->BSIM4v6gcrgs * T0;
|
||||
gcrgb = here->BSIM4v6gcrgb * T0;
|
||||
gcrgg -= here->BSIM4v6gcrg;
|
||||
gcrg = here->BSIM4v6gcrg;
|
||||
}
|
||||
else
|
||||
gcrg = gcrgd = gcrgg = gcrgs = gcrgb = 0.0;
|
||||
|
||||
if (here->BSIM4v6acnqsMod == 0)
|
||||
{ if (here->BSIM4v6rgateMod == 3)
|
||||
{ xcgmgmb = cgdo + cgso + pParam->BSIM4v6cgbo;
|
||||
xcgmdb = -cgdo;
|
||||
xcgmsb = -cgso;
|
||||
xcgmbb = -pParam->BSIM4v6cgbo;
|
||||
|
||||
xcdgmb = xcgmdb;
|
||||
xcsgmb = xcgmsb;
|
||||
xcbgmb = xcgmbb;
|
||||
|
||||
xcggb = here->BSIM4v6cggb;
|
||||
xcgdb = here->BSIM4v6cgdb;
|
||||
xcgsb = here->BSIM4v6cgsb;
|
||||
xcgbb = -(xcggb + xcgdb + xcgsb);
|
||||
|
||||
xcdgb = here->BSIM4v6cdgb;
|
||||
xcsgb = -(here->BSIM4v6cggb + here->BSIM4v6cbgb
|
||||
+ here->BSIM4v6cdgb);
|
||||
xcbgb = here->BSIM4v6cbgb;
|
||||
}
|
||||
else
|
||||
{ xcggb = here->BSIM4v6cggb + cgdo + cgso
|
||||
+ pParam->BSIM4v6cgbo;
|
||||
xcgdb = here->BSIM4v6cgdb - cgdo;
|
||||
xcgsb = here->BSIM4v6cgsb - cgso;
|
||||
xcgbb = -(xcggb + xcgdb + xcgsb);
|
||||
|
||||
xcdgb = here->BSIM4v6cdgb - cgdo;
|
||||
xcsgb = -(here->BSIM4v6cggb + here->BSIM4v6cbgb
|
||||
+ here->BSIM4v6cdgb + cgso);
|
||||
xcbgb = here->BSIM4v6cbgb - pParam->BSIM4v6cgbo;
|
||||
|
||||
xcdgmb = xcsgmb = xcbgmb = 0.0;
|
||||
}
|
||||
xcddb = here->BSIM4v6cddb + here->BSIM4v6capbd + cgdo;
|
||||
xcdsb = here->BSIM4v6cdsb;
|
||||
|
||||
xcsdb = -(here->BSIM4v6cgdb + here->BSIM4v6cbdb
|
||||
+ here->BSIM4v6cddb);
|
||||
xcssb = here->BSIM4v6capbs + cgso - (here->BSIM4v6cgsb
|
||||
+ here->BSIM4v6cbsb + here->BSIM4v6cdsb);
|
||||
|
||||
if (!here->BSIM4v6rbodyMod)
|
||||
{ xcdbb = -(xcdgb + xcddb + xcdsb + xcdgmb);
|
||||
xcsbb = -(xcsgb + xcsdb + xcssb + xcsgmb);
|
||||
xcbdb = here->BSIM4v6cbdb - here->BSIM4v6capbd;
|
||||
xcbsb = here->BSIM4v6cbsb - here->BSIM4v6capbs;
|
||||
xcdbdb = 0.0;
|
||||
}
|
||||
else
|
||||
{ xcdbb = -(here->BSIM4v6cddb + here->BSIM4v6cdgb
|
||||
+ here->BSIM4v6cdsb);
|
||||
xcsbb = -(xcsgb + xcsdb + xcssb + xcsgmb)
|
||||
+ here->BSIM4v6capbs;
|
||||
xcbdb = here->BSIM4v6cbdb;
|
||||
xcbsb = here->BSIM4v6cbsb;
|
||||
|
||||
xcdbdb = -here->BSIM4v6capbd;
|
||||
xcsbsb = -here->BSIM4v6capbs;
|
||||
}
|
||||
xcbbb = -(xcbdb + xcbgb + xcbsb + xcbgmb);
|
||||
|
||||
xgtg = xgtd = xgts = xgtb = 0.0;
|
||||
sxpart = 0.6;
|
||||
dxpart = 0.4;
|
||||
ddxpart_dVd = ddxpart_dVg = ddxpart_dVb
|
||||
= ddxpart_dVs = 0.0;
|
||||
dsxpart_dVd = dsxpart_dVg = dsxpart_dVb
|
||||
= dsxpart_dVs = 0.0;
|
||||
}
|
||||
else
|
||||
{ xcggb = xcgdb = xcgsb = xcgbb = 0.0;
|
||||
xcbgb = xcbdb = xcbsb = xcbbb = 0.0;
|
||||
xcdgb = xcddb = xcdsb = xcdbb = 0.0;
|
||||
xcsgb = xcsdb = xcssb = xcsbb = 0.0;
|
||||
|
||||
xgtg = here->BSIM4v6gtg;
|
||||
xgtd = here->BSIM4v6gtd;
|
||||
xgts = here->BSIM4v6gts;
|
||||
xgtb = here->BSIM4v6gtb;
|
||||
|
||||
xcqgb = here->BSIM4v6cqgb;
|
||||
xcqdb = here->BSIM4v6cqdb;
|
||||
xcqsb = here->BSIM4v6cqsb;
|
||||
xcqbb = here->BSIM4v6cqbb;
|
||||
|
||||
CoxWL = model->BSIM4v6coxe * here->pParam->BSIM4v6weffCV
|
||||
* here->BSIM4v6nf * here->pParam->BSIM4v6leffCV;
|
||||
qcheq = -(here->BSIM4v6qgate + here->BSIM4v6qbulk);
|
||||
if (fabs(qcheq) <= 1.0e-5 * CoxWL)
|
||||
{ if (model->BSIM4v6xpart < 0.5)
|
||||
{ dxpart = 0.4;
|
||||
}
|
||||
else if (model->BSIM4v6xpart > 0.5)
|
||||
{ dxpart = 0.0;
|
||||
}
|
||||
else
|
||||
{ dxpart = 0.5;
|
||||
}
|
||||
ddxpart_dVd = ddxpart_dVg = ddxpart_dVb
|
||||
= ddxpart_dVs = 0.0;
|
||||
}
|
||||
else
|
||||
{ dxpart = here->BSIM4v6qdrn / qcheq;
|
||||
Cdd = here->BSIM4v6cddb;
|
||||
Csd = -(here->BSIM4v6cgdb + here->BSIM4v6cddb
|
||||
+ here->BSIM4v6cbdb);
|
||||
ddxpart_dVd = (Cdd - dxpart * (Cdd + Csd)) / qcheq;
|
||||
Cdg = here->BSIM4v6cdgb;
|
||||
Csg = -(here->BSIM4v6cggb + here->BSIM4v6cdgb
|
||||
+ here->BSIM4v6cbgb);
|
||||
ddxpart_dVg = (Cdg - dxpart * (Cdg + Csg)) / qcheq;
|
||||
|
||||
Cds = here->BSIM4v6cdsb;
|
||||
Css = -(here->BSIM4v6cgsb + here->BSIM4v6cdsb
|
||||
+ here->BSIM4v6cbsb);
|
||||
ddxpart_dVs = (Cds - dxpart * (Cds + Css)) / qcheq;
|
||||
|
||||
ddxpart_dVb = -(ddxpart_dVd + ddxpart_dVg
|
||||
+ ddxpart_dVs);
|
||||
}
|
||||
sxpart = 1.0 - dxpart;
|
||||
dsxpart_dVd = -ddxpart_dVd;
|
||||
dsxpart_dVg = -ddxpart_dVg;
|
||||
dsxpart_dVs = -ddxpart_dVs;
|
||||
dsxpart_dVb = -(dsxpart_dVd + dsxpart_dVg + dsxpart_dVs);
|
||||
}
|
||||
}
|
||||
else
|
||||
{ Gm = -here->BSIM4v6gm;
|
||||
Gmbs = -here->BSIM4v6gmbs;
|
||||
FwdSum = 0.0;
|
||||
RevSum = -(Gm + Gmbs);
|
||||
|
||||
gbbsp = -(here->BSIM4v6gbds);
|
||||
gbbdp = here->BSIM4v6gbds + here->BSIM4v6gbgs + here->BSIM4v6gbbs;
|
||||
|
||||
gbdpg = 0.0;
|
||||
gbdpsp = 0.0;
|
||||
gbdpb = 0.0;
|
||||
gbdpdp = 0.0;
|
||||
|
||||
gbspg = here->BSIM4v6gbgs;
|
||||
gbspsp = here->BSIM4v6gbds;
|
||||
gbspb = here->BSIM4v6gbbs;
|
||||
gbspdp = -(gbspg + gbspsp + gbspb);
|
||||
|
||||
if (model->BSIM4v6igcMod)
|
||||
{ gIstotg = here->BSIM4v6gIgsg + here->BSIM4v6gIgcdg;
|
||||
gIstotd = here->BSIM4v6gIgcds;
|
||||
gIstots = here->BSIM4v6gIgss + here->BSIM4v6gIgcdd;
|
||||
gIstotb = here->BSIM4v6gIgcdb;
|
||||
|
||||
gIdtotg = here->BSIM4v6gIgdg + here->BSIM4v6gIgcsg;
|
||||
gIdtotd = here->BSIM4v6gIgdd + here->BSIM4v6gIgcss;
|
||||
gIdtots = here->BSIM4v6gIgcsd;
|
||||
gIdtotb = here->BSIM4v6gIgcsb;
|
||||
}
|
||||
else
|
||||
{ gIstotg = gIstotd = gIstots = gIstotb = 0.0;
|
||||
gIdtotg = gIdtotd = gIdtots = gIdtotb = 0.0;
|
||||
}
|
||||
|
||||
if (model->BSIM4v6igbMod)
|
||||
{ gIbtotg = here->BSIM4v6gIgbg;
|
||||
gIbtotd = here->BSIM4v6gIgbs;
|
||||
gIbtots = here->BSIM4v6gIgbd;
|
||||
gIbtotb = here->BSIM4v6gIgbb;
|
||||
}
|
||||
else
|
||||
gIbtotg = gIbtotd = gIbtots = gIbtotb = 0.0;
|
||||
|
||||
if ((model->BSIM4v6igcMod != 0) || (model->BSIM4v6igbMod != 0))
|
||||
{ gIgtotg = gIstotg + gIdtotg + gIbtotg;
|
||||
gIgtotd = gIstotd + gIdtotd + gIbtotd ;
|
||||
gIgtots = gIstots + gIdtots + gIbtots;
|
||||
gIgtotb = gIstotb + gIdtotb + gIbtotb;
|
||||
}
|
||||
else
|
||||
gIgtotg = gIgtotd = gIgtots = gIgtotb = 0.0;
|
||||
|
||||
if (here->BSIM4v6rgateMod == 2)
|
||||
T0 = *(ckt->CKTstates[0] + here->BSIM4v6vges)
|
||||
- *(ckt->CKTstates[0] + here->BSIM4v6vgs);
|
||||
else if (here->BSIM4v6rgateMod == 3)
|
||||
T0 = *(ckt->CKTstates[0] + here->BSIM4v6vgms)
|
||||
- *(ckt->CKTstates[0] + here->BSIM4v6vgs);
|
||||
if (here->BSIM4v6rgateMod > 1)
|
||||
{ gcrgd = here->BSIM4v6gcrgs * T0;
|
||||
gcrgg = here->BSIM4v6gcrgg * T0;
|
||||
gcrgs = here->BSIM4v6gcrgd * T0;
|
||||
gcrgb = here->BSIM4v6gcrgb * T0;
|
||||
gcrgg -= here->BSIM4v6gcrg;
|
||||
gcrg = here->BSIM4v6gcrg;
|
||||
}
|
||||
else
|
||||
gcrg = gcrgd = gcrgg = gcrgs = gcrgb = 0.0;
|
||||
|
||||
if (here->BSIM4v6acnqsMod == 0)
|
||||
{ if (here->BSIM4v6rgateMod == 3)
|
||||
{ xcgmgmb = cgdo + cgso + pParam->BSIM4v6cgbo;
|
||||
xcgmdb = -cgdo;
|
||||
xcgmsb = -cgso;
|
||||
xcgmbb = -pParam->BSIM4v6cgbo;
|
||||
|
||||
xcdgmb = xcgmdb;
|
||||
xcsgmb = xcgmsb;
|
||||
xcbgmb = xcgmbb;
|
||||
|
||||
xcggb = here->BSIM4v6cggb;
|
||||
xcgdb = here->BSIM4v6cgsb;
|
||||
xcgsb = here->BSIM4v6cgdb;
|
||||
xcgbb = -(xcggb + xcgdb + xcgsb);
|
||||
|
||||
xcdgb = -(here->BSIM4v6cggb + here->BSIM4v6cbgb
|
||||
+ here->BSIM4v6cdgb);
|
||||
xcsgb = here->BSIM4v6cdgb;
|
||||
xcbgb = here->BSIM4v6cbgb;
|
||||
}
|
||||
else
|
||||
{ xcggb = here->BSIM4v6cggb + cgdo + cgso
|
||||
+ pParam->BSIM4v6cgbo;
|
||||
xcgdb = here->BSIM4v6cgsb - cgdo;
|
||||
xcgsb = here->BSIM4v6cgdb - cgso;
|
||||
xcgbb = -(xcggb + xcgdb + xcgsb);
|
||||
|
||||
xcdgb = -(here->BSIM4v6cggb + here->BSIM4v6cbgb
|
||||
+ here->BSIM4v6cdgb + cgdo);
|
||||
xcsgb = here->BSIM4v6cdgb - cgso;
|
||||
xcbgb = here->BSIM4v6cbgb - pParam->BSIM4v6cgbo;
|
||||
|
||||
xcdgmb = xcsgmb = xcbgmb = 0.0;
|
||||
}
|
||||
xcddb = here->BSIM4v6capbd + cgdo - (here->BSIM4v6cgsb
|
||||
+ here->BSIM4v6cbsb + here->BSIM4v6cdsb);
|
||||
xcdsb = -(here->BSIM4v6cgdb + here->BSIM4v6cbdb
|
||||
+ here->BSIM4v6cddb);
|
||||
|
||||
xcsdb = here->BSIM4v6cdsb;
|
||||
xcssb = here->BSIM4v6cddb + here->BSIM4v6capbs + cgso;
|
||||
|
||||
if (!here->BSIM4v6rbodyMod)
|
||||
{ xcdbb = -(xcdgb + xcddb + xcdsb + xcdgmb);
|
||||
xcsbb = -(xcsgb + xcsdb + xcssb + xcsgmb);
|
||||
xcbdb = here->BSIM4v6cbsb - here->BSIM4v6capbd;
|
||||
xcbsb = here->BSIM4v6cbdb - here->BSIM4v6capbs;
|
||||
xcdbdb = 0.0;
|
||||
}
|
||||
else
|
||||
{ xcdbb = -(xcdgb + xcddb + xcdsb + xcdgmb)
|
||||
+ here->BSIM4v6capbd;
|
||||
xcsbb = -(here->BSIM4v6cddb + here->BSIM4v6cdgb
|
||||
+ here->BSIM4v6cdsb);
|
||||
xcbdb = here->BSIM4v6cbsb;
|
||||
xcbsb = here->BSIM4v6cbdb;
|
||||
xcdbdb = -here->BSIM4v6capbd;
|
||||
xcsbsb = -here->BSIM4v6capbs;
|
||||
}
|
||||
xcbbb = -(xcbgb + xcbdb + xcbsb + xcbgmb);
|
||||
|
||||
xgtg = xgtd = xgts = xgtb = 0.0;
|
||||
sxpart = 0.4;
|
||||
dxpart = 0.6;
|
||||
ddxpart_dVd = ddxpart_dVg = ddxpart_dVb
|
||||
= ddxpart_dVs = 0.0;
|
||||
dsxpart_dVd = dsxpart_dVg = dsxpart_dVb
|
||||
= dsxpart_dVs = 0.0;
|
||||
}
|
||||
else
|
||||
{ xcggb = xcgdb = xcgsb = xcgbb = 0.0;
|
||||
xcbgb = xcbdb = xcbsb = xcbbb = 0.0;
|
||||
xcdgb = xcddb = xcdsb = xcdbb = 0.0;
|
||||
xcsgb = xcsdb = xcssb = xcsbb = 0.0;
|
||||
|
||||
xgtg = here->BSIM4v6gtg;
|
||||
xgtd = here->BSIM4v6gts;
|
||||
xgts = here->BSIM4v6gtd;
|
||||
xgtb = here->BSIM4v6gtb;
|
||||
|
||||
xcqgb = here->BSIM4v6cqgb;
|
||||
xcqdb = here->BSIM4v6cqsb;
|
||||
xcqsb = here->BSIM4v6cqdb;
|
||||
xcqbb = here->BSIM4v6cqbb;
|
||||
|
||||
CoxWL = model->BSIM4v6coxe * here->pParam->BSIM4v6weffCV
|
||||
* here->BSIM4v6nf * here->pParam->BSIM4v6leffCV;
|
||||
qcheq = -(here->BSIM4v6qgate + here->BSIM4v6qbulk);
|
||||
if (fabs(qcheq) <= 1.0e-5 * CoxWL)
|
||||
{ if (model->BSIM4v6xpart < 0.5)
|
||||
{ sxpart = 0.4;
|
||||
}
|
||||
else if (model->BSIM4v6xpart > 0.5)
|
||||
{ sxpart = 0.0;
|
||||
}
|
||||
else
|
||||
{ sxpart = 0.5;
|
||||
}
|
||||
dsxpart_dVd = dsxpart_dVg = dsxpart_dVb
|
||||
= dsxpart_dVs = 0.0;
|
||||
}
|
||||
else
|
||||
{ sxpart = here->BSIM4v6qdrn / qcheq;
|
||||
Css = here->BSIM4v6cddb;
|
||||
Cds = -(here->BSIM4v6cgdb + here->BSIM4v6cddb
|
||||
+ here->BSIM4v6cbdb);
|
||||
dsxpart_dVs = (Css - sxpart * (Css + Cds)) / qcheq;
|
||||
Csg = here->BSIM4v6cdgb;
|
||||
Cdg = -(here->BSIM4v6cggb + here->BSIM4v6cdgb
|
||||
+ here->BSIM4v6cbgb);
|
||||
dsxpart_dVg = (Csg - sxpart * (Csg + Cdg)) / qcheq;
|
||||
|
||||
Csd = here->BSIM4v6cdsb;
|
||||
Cdd = -(here->BSIM4v6cgsb + here->BSIM4v6cdsb
|
||||
+ here->BSIM4v6cbsb);
|
||||
dsxpart_dVd = (Csd - sxpart * (Csd + Cdd)) / qcheq;
|
||||
|
||||
dsxpart_dVb = -(dsxpart_dVd + dsxpart_dVg
|
||||
+ dsxpart_dVs);
|
||||
}
|
||||
dxpart = 1.0 - sxpart;
|
||||
ddxpart_dVd = -dsxpart_dVd;
|
||||
ddxpart_dVg = -dsxpart_dVg;
|
||||
ddxpart_dVs = -dsxpart_dVs;
|
||||
ddxpart_dVb = -(ddxpart_dVd + ddxpart_dVg + ddxpart_dVs);
|
||||
}
|
||||
}
|
||||
|
||||
if (model->BSIM4v6rdsMod == 1)
|
||||
{ gstot = here->BSIM4v6gstot;
|
||||
gstotd = here->BSIM4v6gstotd;
|
||||
gstotg = here->BSIM4v6gstotg;
|
||||
gstots = here->BSIM4v6gstots - gstot;
|
||||
gstotb = here->BSIM4v6gstotb;
|
||||
|
||||
gdtot = here->BSIM4v6gdtot;
|
||||
gdtotd = here->BSIM4v6gdtotd - gdtot;
|
||||
gdtotg = here->BSIM4v6gdtotg;
|
||||
gdtots = here->BSIM4v6gdtots;
|
||||
gdtotb = here->BSIM4v6gdtotb;
|
||||
}
|
||||
else
|
||||
{ gstot = gstotd = gstotg = gstots = gstotb = 0.0;
|
||||
gdtot = gdtotd = gdtotg = gdtots = gdtotb = 0.0;
|
||||
}
|
||||
|
||||
|
||||
T1 = *(ckt->CKTstate0 + here->BSIM4v6qdef) * here->BSIM4v6gtau;
|
||||
gds = here->BSIM4v6gds;
|
||||
|
||||
/*
|
||||
* Loading PZ matrix
|
||||
*/
|
||||
m = here->BSIM4v6m;
|
||||
|
||||
if (!model->BSIM4v6rdsMod)
|
||||
{ gdpr = here->BSIM4v6drainConductance;
|
||||
gspr = here->BSIM4v6sourceConductance;
|
||||
}
|
||||
else
|
||||
gdpr = gspr = 0.0;
|
||||
|
||||
if (!here->BSIM4v6rbodyMod)
|
||||
{ gjbd = here->BSIM4v6gbd;
|
||||
gjbs = here->BSIM4v6gbs;
|
||||
}
|
||||
else
|
||||
gjbd = gjbs = 0.0;
|
||||
|
||||
geltd = here->BSIM4v6grgeltd;
|
||||
|
||||
if (here->BSIM4v6rgateMod == 1)
|
||||
{ *(here->BSIM4v6GEgePtr) += m * geltd;
|
||||
*(here->BSIM4v6GPgePtr) -= m * geltd;
|
||||
*(here->BSIM4v6GEgpPtr) -= m * geltd;
|
||||
|
||||
*(here->BSIM4v6GPgpPtr ) += m * xcggb * s->real;
|
||||
*(here->BSIM4v6GPgpPtr +1) += m * xcggb * s->imag;
|
||||
*(here->BSIM4v6GPgpPtr) += m * (geltd - xgtg + gIgtotg);
|
||||
*(here->BSIM4v6GPdpPtr ) += m * xcgdb * s->real;
|
||||
*(here->BSIM4v6GPdpPtr +1) += m * xcgdb * s->imag;
|
||||
*(here->BSIM4v6GPdpPtr) -= m * (xgtd - gIgtotd);
|
||||
*(here->BSIM4v6GPspPtr ) += m * xcgsb * s->real;
|
||||
*(here->BSIM4v6GPspPtr +1) += m * xcgsb * s->imag;
|
||||
*(here->BSIM4v6GPspPtr) -= m * (xgts - gIgtots);
|
||||
*(here->BSIM4v6GPbpPtr ) += m * xcgbb * s->real;
|
||||
*(here->BSIM4v6GPbpPtr +1) += m * xcgbb * s->imag;
|
||||
*(here->BSIM4v6GPbpPtr) -= m * (xgtb - gIgtotb);
|
||||
}
|
||||
else if (here->BSIM4v6rgateMod == 2)
|
||||
{ *(here->BSIM4v6GEgePtr) += m * gcrg;
|
||||
*(here->BSIM4v6GEgpPtr) += m * gcrgg;
|
||||
*(here->BSIM4v6GEdpPtr) += m * gcrgd;
|
||||
*(here->BSIM4v6GEspPtr) += m * gcrgs;
|
||||
*(here->BSIM4v6GEbpPtr) += m * gcrgb;
|
||||
|
||||
*(here->BSIM4v6GPgePtr) -= m * gcrg;
|
||||
*(here->BSIM4v6GPgpPtr ) += m * xcggb * s->real;
|
||||
*(here->BSIM4v6GPgpPtr +1) += m * xcggb * s->imag;
|
||||
*(here->BSIM4v6GPgpPtr) -= m * (gcrgg + xgtg - gIgtotg);
|
||||
*(here->BSIM4v6GPdpPtr ) += m * xcgdb * s->real;
|
||||
*(here->BSIM4v6GPdpPtr +1) += m * xcgdb * s->imag;
|
||||
*(here->BSIM4v6GPdpPtr) -= m * (gcrgd + xgtd - gIgtotd);
|
||||
*(here->BSIM4v6GPspPtr ) += m * xcgsb * s->real;
|
||||
*(here->BSIM4v6GPspPtr +1) += m * xcgsb * s->imag;
|
||||
*(here->BSIM4v6GPspPtr) -= m * (gcrgs + xgts - gIgtots);
|
||||
*(here->BSIM4v6GPbpPtr ) += m * xcgbb * s->real;
|
||||
*(here->BSIM4v6GPbpPtr +1) += m * xcgbb * s->imag;
|
||||
*(here->BSIM4v6GPbpPtr) -= m * (gcrgb + xgtb - gIgtotb);
|
||||
}
|
||||
else if (here->BSIM4v6rgateMod == 3)
|
||||
{ *(here->BSIM4v6GEgePtr) += m * geltd;
|
||||
*(here->BSIM4v6GEgmPtr) -= m * geltd;
|
||||
*(here->BSIM4v6GMgePtr) -= m * geltd;
|
||||
*(here->BSIM4v6GMgmPtr) += m * (geltd + gcrg);
|
||||
*(here->BSIM4v6GMgmPtr ) += m * xcgmgmb * s->real;
|
||||
*(here->BSIM4v6GMgmPtr +1) += m * xcgmgmb * s->imag;
|
||||
|
||||
*(here->BSIM4v6GMdpPtr) += m * gcrgd;
|
||||
*(here->BSIM4v6GMdpPtr ) += m * xcgmdb * s->real;
|
||||
*(here->BSIM4v6GMdpPtr +1) += m * xcgmdb * s->imag;
|
||||
*(here->BSIM4v6GMgpPtr) += m * gcrgg;
|
||||
*(here->BSIM4v6GMspPtr) += m * gcrgs;
|
||||
*(here->BSIM4v6GMspPtr ) += m * xcgmsb * s->real;
|
||||
*(here->BSIM4v6GMspPtr +1) += m * xcgmsb * s->imag;
|
||||
*(here->BSIM4v6GMbpPtr) += m * gcrgb;
|
||||
*(here->BSIM4v6GMbpPtr ) += m * xcgmbb * s->real;
|
||||
*(here->BSIM4v6GMbpPtr +1) += m * xcgmbb * s->imag;
|
||||
|
||||
*(here->BSIM4v6DPgmPtr ) += m * xcdgmb * s->real;
|
||||
*(here->BSIM4v6DPgmPtr +1) += m * xcdgmb * s->imag;
|
||||
*(here->BSIM4v6GPgmPtr) -= m * gcrg;
|
||||
*(here->BSIM4v6SPgmPtr ) += m * xcsgmb * s->real;
|
||||
*(here->BSIM4v6SPgmPtr +1) += m * xcsgmb * s->imag;
|
||||
*(here->BSIM4v6BPgmPtr ) += m * xcbgmb * s->real;
|
||||
*(here->BSIM4v6BPgmPtr +1) += m * xcbgmb * s->imag;
|
||||
|
||||
*(here->BSIM4v6GPgpPtr) -= m * (gcrgg + xgtg - gIgtotg);
|
||||
*(here->BSIM4v6GPgpPtr ) += m * xcggb * s->real;
|
||||
*(here->BSIM4v6GPgpPtr +1) += m * xcggb * s->imag;
|
||||
*(here->BSIM4v6GPdpPtr) -= m * (gcrgd + xgtd - gIgtotd);
|
||||
*(here->BSIM4v6GPdpPtr ) += m * xcgdb * s->real;
|
||||
*(here->BSIM4v6GPdpPtr +1) += m * xcgdb * s->imag;
|
||||
*(here->BSIM4v6GPspPtr) -= m * (gcrgs + xgts - gIgtots);
|
||||
*(here->BSIM4v6GPspPtr ) += m * xcgsb * s->real;
|
||||
*(here->BSIM4v6GPspPtr +1) += m * xcgsb * s->imag;
|
||||
*(here->BSIM4v6GPbpPtr) -= m * (gcrgb + xgtb - gIgtotb);
|
||||
*(here->BSIM4v6GPbpPtr ) += m * xcgbb * s->real;
|
||||
*(here->BSIM4v6GPbpPtr +1) += m * xcgbb * s->imag;
|
||||
}
|
||||
else
|
||||
{ *(here->BSIM4v6GPdpPtr ) += m * xcgdb * s->real;
|
||||
*(here->BSIM4v6GPdpPtr +1) += m * xcgdb * s->imag;
|
||||
*(here->BSIM4v6GPdpPtr) -= m * (xgtd - gIgtotd);
|
||||
*(here->BSIM4v6GPgpPtr ) += m * xcggb * s->real;
|
||||
*(here->BSIM4v6GPgpPtr +1) += m * xcggb * s->imag;
|
||||
*(here->BSIM4v6GPgpPtr) -= m * (xgtg - gIgtotg);
|
||||
*(here->BSIM4v6GPspPtr ) += m * xcgsb * s->real;
|
||||
*(here->BSIM4v6GPspPtr +1) += m * xcgsb * s->imag;
|
||||
*(here->BSIM4v6GPspPtr) -= m * (xgts - gIgtots);
|
||||
*(here->BSIM4v6GPbpPtr ) += m * xcgbb * s->real;
|
||||
*(here->BSIM4v6GPbpPtr +1) += m * xcgbb * s->imag;
|
||||
*(here->BSIM4v6GPbpPtr) -= m * (xgtb - gIgtotb);
|
||||
}
|
||||
|
||||
if (model->BSIM4v6rdsMod)
|
||||
{ (*(here->BSIM4v6DgpPtr) += m * gdtotg);
|
||||
(*(here->BSIM4v6DspPtr) += m * gdtots);
|
||||
(*(here->BSIM4v6DbpPtr) += m * gdtotb);
|
||||
(*(here->BSIM4v6SdpPtr) += m * gstotd);
|
||||
(*(here->BSIM4v6SgpPtr) += m * gstotg);
|
||||
(*(here->BSIM4v6SbpPtr) += m * gstotb);
|
||||
}
|
||||
|
||||
*(here->BSIM4v6DPdpPtr ) += m * xcddb * s->real;
|
||||
*(here->BSIM4v6DPdpPtr +1) += m * xcddb * s->imag;
|
||||
*(here->BSIM4v6DPdpPtr) += m * (gdpr + gds + here->BSIM4v6gbd
|
||||
- gdtotd + RevSum + gbdpdp - gIdtotd
|
||||
+ dxpart * xgtd + T1 * ddxpart_dVd);
|
||||
*(here->BSIM4v6DPdPtr) -= m * (gdpr + gdtot);
|
||||
*(here->BSIM4v6DPgpPtr ) += m * xcdgb * s->real;
|
||||
*(here->BSIM4v6DPgpPtr +1) += m * xcdgb * s->imag;
|
||||
*(here->BSIM4v6DPgpPtr) += m * (Gm - gdtotg + gbdpg - gIdtotg
|
||||
+ T1 * ddxpart_dVg + dxpart * xgtg);
|
||||
*(here->BSIM4v6DPspPtr ) += m * xcdsb * s->real;
|
||||
*(here->BSIM4v6DPspPtr +1) += m * xcdsb * s->imag;
|
||||
*(here->BSIM4v6DPspPtr) -= m * (gds + FwdSum + gdtots - gbdpsp + gIdtots
|
||||
- T1 * ddxpart_dVs - dxpart * xgts);
|
||||
*(here->BSIM4v6DPbpPtr ) += m * xcdbb * s->real;
|
||||
*(here->BSIM4v6DPbpPtr +1) += m * xcdbb * s->imag;
|
||||
*(here->BSIM4v6DPbpPtr) -= m * (gjbd + gdtotb - Gmbs - gbdpb + gIdtotb
|
||||
- T1 * ddxpart_dVb - dxpart * xgtb);
|
||||
|
||||
*(here->BSIM4v6DdpPtr) -= m * (gdpr - gdtotd);
|
||||
*(here->BSIM4v6DdPtr) += m * (gdpr + gdtot);
|
||||
|
||||
*(here->BSIM4v6SPdpPtr ) += m * xcsdb * s->real;
|
||||
*(here->BSIM4v6SPdpPtr +1) += m * xcsdb * s->imag;
|
||||
*(here->BSIM4v6SPdpPtr) -= m * (gds + gstotd + RevSum - gbspdp + gIstotd
|
||||
- T1 * dsxpart_dVd - sxpart * xgtd);
|
||||
*(here->BSIM4v6SPgpPtr ) += m * xcsgb * s->real;
|
||||
*(here->BSIM4v6SPgpPtr +1) += m * xcsgb * s->imag;
|
||||
*(here->BSIM4v6SPgpPtr) -= m * (Gm + gstotg - gbspg + gIstotg
|
||||
- T1 * dsxpart_dVg - sxpart * xgtg);
|
||||
*(here->BSIM4v6SPspPtr ) += m * xcssb * s->real;
|
||||
*(here->BSIM4v6SPspPtr +1) += m * xcssb * s->imag;
|
||||
*(here->BSIM4v6SPspPtr) += m * (gspr + gds + here->BSIM4v6gbs - gIstots
|
||||
- gstots + FwdSum + gbspsp
|
||||
+ sxpart * xgts + T1 * dsxpart_dVs);
|
||||
*(here->BSIM4v6SPsPtr) -= m * (gspr + gstot);
|
||||
*(here->BSIM4v6SPbpPtr ) += m * xcsbb * s->real;
|
||||
*(here->BSIM4v6SPbpPtr +1) += m * xcsbb * s->imag;
|
||||
*(here->BSIM4v6SPbpPtr) -= m * (gjbs + gstotb + Gmbs - gbspb + gIstotb
|
||||
- T1 * dsxpart_dVb - sxpart * xgtb);
|
||||
|
||||
*(here->BSIM4v6SspPtr) -= m * (gspr - gstots);
|
||||
*(here->BSIM4v6SsPtr) += m * (gspr + gstot);
|
||||
|
||||
*(here->BSIM4v6BPdpPtr ) += m * xcbdb * s->real;
|
||||
*(here->BSIM4v6BPdpPtr +1) += m * xcbdb * s->imag;
|
||||
*(here->BSIM4v6BPdpPtr) -= m * (gjbd - gbbdp + gIbtotd);
|
||||
*(here->BSIM4v6BPgpPtr ) += m * xcbgb * s->real;
|
||||
*(here->BSIM4v6BPgpPtr +1) += m * xcbgb * s->imag;
|
||||
*(here->BSIM4v6BPgpPtr) -= m * (here->BSIM4v6gbgs + gIbtotg);
|
||||
*(here->BSIM4v6BPspPtr ) += m * xcbsb * s->real;
|
||||
*(here->BSIM4v6BPspPtr +1) += m * xcbsb * s->imag;
|
||||
*(here->BSIM4v6BPspPtr) -= m * (gjbs - gbbsp + gIbtots);
|
||||
*(here->BSIM4v6BPbpPtr ) += m * xcbbb * s->real;
|
||||
*(here->BSIM4v6BPbpPtr +1) += m * xcbbb * s->imag;
|
||||
*(here->BSIM4v6BPbpPtr) += m * (gjbd + gjbs - here->BSIM4v6gbbs
|
||||
- gIbtotb);
|
||||
ggidld = here->BSIM4v6ggidld;
|
||||
ggidlg = here->BSIM4v6ggidlg;
|
||||
ggidlb = here->BSIM4v6ggidlb;
|
||||
ggislg = here->BSIM4v6ggislg;
|
||||
ggisls = here->BSIM4v6ggisls;
|
||||
ggislb = here->BSIM4v6ggislb;
|
||||
|
||||
/* stamp gidl */
|
||||
(*(here->BSIM4v6DPdpPtr) += m * ggidld);
|
||||
(*(here->BSIM4v6DPgpPtr) += m * ggidlg);
|
||||
(*(here->BSIM4v6DPspPtr) -= m * ((ggidlg + ggidld) + ggidlb));
|
||||
(*(here->BSIM4v6DPbpPtr) += m * ggidlb);
|
||||
(*(here->BSIM4v6BPdpPtr) -= m * ggidld);
|
||||
(*(here->BSIM4v6BPgpPtr) -= m * ggidlg);
|
||||
(*(here->BSIM4v6BPspPtr) += m * ((ggidlg + ggidld) + ggidlb));
|
||||
(*(here->BSIM4v6BPbpPtr) -= m * ggidlb);
|
||||
/* stamp gisl */
|
||||
(*(here->BSIM4v6SPdpPtr) -= m * ((ggisls + ggislg) + ggislb));
|
||||
(*(here->BSIM4v6SPgpPtr) += m * ggislg);
|
||||
(*(here->BSIM4v6SPspPtr) += m * ggisls);
|
||||
(*(here->BSIM4v6SPbpPtr) += m * ggislb);
|
||||
(*(here->BSIM4v6BPdpPtr) += m * ((ggislg + ggisls) + ggislb));
|
||||
(*(here->BSIM4v6BPgpPtr) -= m * ggislg);
|
||||
(*(here->BSIM4v6BPspPtr) -= m * ggisls);
|
||||
(*(here->BSIM4v6BPbpPtr) -= m * ggislb);
|
||||
|
||||
if (here->BSIM4v6rbodyMod)
|
||||
{ (*(here->BSIM4v6DPdbPtr ) += m * xcdbdb * s->real);
|
||||
(*(here->BSIM4v6DPdbPtr +1) += m * xcdbdb * s->imag);
|
||||
(*(here->BSIM4v6DPdbPtr) -= m * here->BSIM4v6gbd);
|
||||
(*(here->BSIM4v6SPsbPtr ) += m * xcsbsb * s->real);
|
||||
(*(here->BSIM4v6SPsbPtr +1) += m * xcsbsb * s->imag);
|
||||
(*(here->BSIM4v6SPsbPtr) -= m * here->BSIM4v6gbs);
|
||||
|
||||
(*(here->BSIM4v6DBdpPtr ) += m * xcdbdb * s->real);
|
||||
(*(here->BSIM4v6DBdpPtr +1) += m * xcdbdb * s->imag);
|
||||
(*(here->BSIM4v6DBdpPtr) -= m * here->BSIM4v6gbd);
|
||||
(*(here->BSIM4v6DBdbPtr ) -= m * xcdbdb * s->real);
|
||||
(*(here->BSIM4v6DBdbPtr +1) -= m * xcdbdb * s->imag);
|
||||
(*(here->BSIM4v6DBdbPtr) += m * (here->BSIM4v6gbd + here->BSIM4v6grbpd
|
||||
+ here->BSIM4v6grbdb));
|
||||
(*(here->BSIM4v6DBbpPtr) -= m * here->BSIM4v6grbpd);
|
||||
(*(here->BSIM4v6DBbPtr) -= m * here->BSIM4v6grbdb);
|
||||
|
||||
(*(here->BSIM4v6BPdbPtr) -= m * here->BSIM4v6grbpd);
|
||||
(*(here->BSIM4v6BPbPtr) -= m * here->BSIM4v6grbpb);
|
||||
(*(here->BSIM4v6BPsbPtr) -= m * here->BSIM4v6grbps);
|
||||
(*(here->BSIM4v6BPbpPtr) += m * (here->BSIM4v6grbpd + here->BSIM4v6grbps
|
||||
+ here->BSIM4v6grbpb));
|
||||
/* WDL: (-here->BSIM4v6gbbs) already added to BPbpPtr */
|
||||
|
||||
(*(here->BSIM4v6SBspPtr ) += m * xcsbsb * s->real);
|
||||
(*(here->BSIM4v6SBspPtr +1) += m * xcsbsb * s->imag);
|
||||
(*(here->BSIM4v6SBspPtr) -= m * here->BSIM4v6gbs);
|
||||
(*(here->BSIM4v6SBbpPtr) -= m * here->BSIM4v6grbps);
|
||||
(*(here->BSIM4v6SBbPtr) -= m * here->BSIM4v6grbsb);
|
||||
(*(here->BSIM4v6SBsbPtr ) -= m * xcsbsb * s->real);
|
||||
(*(here->BSIM4v6SBsbPtr +1) -= m * xcsbsb * s->imag);
|
||||
(*(here->BSIM4v6SBsbPtr) += m * (here->BSIM4v6gbs
|
||||
+ here->BSIM4v6grbps + here->BSIM4v6grbsb));
|
||||
|
||||
(*(here->BSIM4v6BdbPtr) -= m * here->BSIM4v6grbdb);
|
||||
(*(here->BSIM4v6BbpPtr) -= m * here->BSIM4v6grbpb);
|
||||
(*(here->BSIM4v6BsbPtr) -= m * here->BSIM4v6grbsb);
|
||||
(*(here->BSIM4v6BbPtr) += m * (here->BSIM4v6grbsb + here->BSIM4v6grbdb
|
||||
+ here->BSIM4v6grbpb));
|
||||
}
|
||||
|
||||
if (here->BSIM4v6acnqsMod)
|
||||
{ *(here->BSIM4v6QqPtr ) += m * s->real * ScalingFactor;
|
||||
*(here->BSIM4v6QqPtr +1) += m * s->imag * ScalingFactor;
|
||||
*(here->BSIM4v6QgpPtr ) -= m * xcqgb * s->real;
|
||||
*(here->BSIM4v6QgpPtr +1) -= m * xcqgb * s->imag;
|
||||
*(here->BSIM4v6QdpPtr ) -= m * xcqdb * s->real;
|
||||
*(here->BSIM4v6QdpPtr +1) -= m * xcqdb * s->imag;
|
||||
*(here->BSIM4v6QbpPtr ) -= m * xcqbb * s->real;
|
||||
*(here->BSIM4v6QbpPtr +1) -= m * xcqbb * s->imag;
|
||||
*(here->BSIM4v6QspPtr ) -= m * xcqsb * s->real;
|
||||
*(here->BSIM4v6QspPtr +1) -= m * xcqsb * s->imag;
|
||||
|
||||
*(here->BSIM4v6GPqPtr) -= m * here->BSIM4v6gtau;
|
||||
*(here->BSIM4v6DPqPtr) += m * dxpart * here->BSIM4v6gtau;
|
||||
*(here->BSIM4v6SPqPtr) += m * sxpart * here->BSIM4v6gtau;
|
||||
|
||||
*(here->BSIM4v6QqPtr) += m * here->BSIM4v6gtau;
|
||||
*(here->BSIM4v6QgpPtr) += m * xgtg;
|
||||
*(here->BSIM4v6QdpPtr) += m * xgtd;
|
||||
*(here->BSIM4v6QbpPtr) += m * xgtb;
|
||||
*(here->BSIM4v6QspPtr) += m * xgts;
|
||||
}
|
||||
}
|
||||
}
|
||||
return(OK);
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
|
@ -0,0 +1,61 @@
|
|||
/**** BSIM4.6.2 Released by Wenwei Yang 07/31/2008 ****/
|
||||
|
||||
/**********
|
||||
* Copyright 2006 Regents of the University of California. All rights reserved.
|
||||
* File: b4trunc.c of BSIM4.6.2.
|
||||
* Author: 2000 Weidong Liu
|
||||
* Authors: 2001- Xuemei Xi, Mohan Dunga, Ali Niknejad, Chenming Hu.
|
||||
* Authors: 2006- Mohan Dunga, Ali Niknejad, Chenming Hu
|
||||
* Authors: 2007- Mohan Dunga, Wenwei Yang, Ali Niknejad, Chenming Hu
|
||||
* Project Director: Prof. Chenming Hu.
|
||||
**********/
|
||||
|
||||
#include "ngspice.h"
|
||||
#include "cktdefs.h"
|
||||
#include "bsim4v6def.h"
|
||||
#include "sperror.h"
|
||||
#include "suffix.h"
|
||||
|
||||
|
||||
int
|
||||
BSIM4v6trunc(
|
||||
GENmodel *inModel,
|
||||
CKTcircuit *ckt,
|
||||
double *timeStep)
|
||||
{
|
||||
BSIM4v6model *model = (BSIM4v6model*)inModel;
|
||||
BSIM4v6instance *here;
|
||||
|
||||
#ifdef STEPDEBUG
|
||||
double debugtemp;
|
||||
#endif /* STEPDEBUG */
|
||||
|
||||
for (; model != NULL; model = model->BSIM4v6nextModel)
|
||||
{ for (here = model->BSIM4v6instances; here != NULL;
|
||||
here = here->BSIM4v6nextInstance)
|
||||
{
|
||||
if (here->BSIM4v6owner != ARCHme) continue;
|
||||
#ifdef STEPDEBUG
|
||||
debugtemp = *timeStep;
|
||||
#endif /* STEPDEBUG */
|
||||
CKTterr(here->BSIM4v6qb,ckt,timeStep);
|
||||
CKTterr(here->BSIM4v6qg,ckt,timeStep);
|
||||
CKTterr(here->BSIM4v6qd,ckt,timeStep);
|
||||
if (here->BSIM4v6trnqsMod)
|
||||
CKTterr(here->BSIM4v6qcdump,ckt,timeStep);
|
||||
if (here->BSIM4v6rbodyMod)
|
||||
{ CKTterr(here->BSIM4v6qbs,ckt,timeStep);
|
||||
CKTterr(here->BSIM4v6qbd,ckt,timeStep);
|
||||
}
|
||||
if (here->BSIM4v6rgateMod == 3)
|
||||
CKTterr(here->BSIM4v6qgmid,ckt,timeStep);
|
||||
#ifdef STEPDEBUG
|
||||
if(debugtemp != *timeStep)
|
||||
{ printf("device %s reduces step from %g to %g\n",
|
||||
here->BSIM4v6name,debugtemp,*timeStep);
|
||||
}
|
||||
#endif /* STEPDEBUG */
|
||||
}
|
||||
}
|
||||
return(OK);
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
|
|
@ -0,0 +1,30 @@
|
|||
/**********
|
||||
Copyright 2004 Regents of the University of California. All rights reserved.
|
||||
Author: 2000 Weidong Liu
|
||||
Author: 2001- Xuemei Xi
|
||||
File: bsim4v6ext.h
|
||||
**********/
|
||||
|
||||
extern int BSIM4v6acLoad(GENmodel *,CKTcircuit*);
|
||||
extern int BSIM4v6ask(CKTcircuit *,GENinstance*,int,IFvalue*,IFvalue*);
|
||||
extern int BSIM4v6convTest(GENmodel *,CKTcircuit*);
|
||||
extern int BSIM4v6delete(GENmodel*,IFuid,GENinstance**);
|
||||
extern void BSIM4v6destroy(GENmodel**);
|
||||
extern int BSIM4v6getic(GENmodel*,CKTcircuit*);
|
||||
extern int BSIM4v6load(GENmodel*,CKTcircuit*);
|
||||
extern int BSIM4v6mAsk(CKTcircuit*,GENmodel *,int, IFvalue*);
|
||||
extern int BSIM4v6mDelete(GENmodel**,IFuid,GENmodel*);
|
||||
extern int BSIM4v6mParam(int,IFvalue*,GENmodel*);
|
||||
extern void BSIM4v6mosCap(CKTcircuit*, double, double, double, double,
|
||||
double, double, double, double, double, double, double,
|
||||
double, double, double, double, double, double, double*,
|
||||
double*, double*, double*, double*, double*, double*, double*,
|
||||
double*, double*, double*, double*, double*, double*, double*,
|
||||
double*);
|
||||
extern int BSIM4v6param(int,IFvalue*,GENinstance*,IFvalue*);
|
||||
extern int BSIM4v6pzLoad(GENmodel*,CKTcircuit*,SPcomplex*);
|
||||
extern int BSIM4v6setup(SMPmatrix*,GENmodel*,CKTcircuit*,int*);
|
||||
extern int BSIM4v6temp(GENmodel*,CKTcircuit*);
|
||||
extern int BSIM4v6trunc(GENmodel*,CKTcircuit*,double*);
|
||||
extern int BSIM4v6noise(int,int,GENmodel*,CKTcircuit*,Ndata*,double*);
|
||||
extern int BSIM4v6unsetup(GENmodel*,CKTcircuit*);
|
||||
|
|
@ -0,0 +1,83 @@
|
|||
#include "config.h"
|
||||
|
||||
#include "devdefs.h"
|
||||
|
||||
#include "bsim4v6itf.h"
|
||||
#include "bsim4v6ext.h"
|
||||
#include "bsim4v6init.h"
|
||||
|
||||
|
||||
SPICEdev BSIM4v6info = {
|
||||
{
|
||||
"BSIM4v6",
|
||||
"Berkeley Short Channel IGFET Model-4",
|
||||
|
||||
&BSIM4v6nSize,
|
||||
&BSIM4v6nSize,
|
||||
BSIM4v6names,
|
||||
|
||||
&BSIM4v6pTSize,
|
||||
BSIM4v6pTable,
|
||||
|
||||
&BSIM4v6mPTSize,
|
||||
BSIM4v6mPTable,
|
||||
|
||||
#ifdef XSPICE
|
||||
/*---- Fixed by SDB 5.2.2003 to enable XSPICE/tclspice integration -----*/
|
||||
NULL, /* This is a SPICE device, it has no MIF info data */
|
||||
|
||||
0, /* This is a SPICE device, it has no MIF info data */
|
||||
NULL, /* This is a SPICE device, it has no MIF info data */
|
||||
|
||||
0, /* This is a SPICE device, it has no MIF info data */
|
||||
NULL, /* This is a SPICE device, it has no MIF info data */
|
||||
|
||||
0, /* This is a SPICE device, it has no MIF info data */
|
||||
NULL, /* This is a SPICE device, it has no MIF info data */
|
||||
/*--------------------------- End of SDB fix -------------------------*/
|
||||
#endif
|
||||
|
||||
DEV_DEFAULT
|
||||
},
|
||||
|
||||
BSIM4v6param, /* DEVparam */
|
||||
BSIM4v6mParam, /* DEVmodParam */
|
||||
BSIM4v6load, /* DEVload */
|
||||
BSIM4v6setup, /* DEVsetup */
|
||||
BSIM4v6unsetup, /* DEVunsetup */
|
||||
BSIM4v6setup, /* DEVpzSetup */
|
||||
BSIM4v6temp, /* DEVtemperature */
|
||||
BSIM4v6trunc, /* DEVtrunc */
|
||||
NULL, /* DEVfindBranch */
|
||||
BSIM4v6acLoad, /* DEVacLoad */
|
||||
NULL, /* DEVaccept */
|
||||
BSIM4v6destroy, /* DEVdestroy */
|
||||
BSIM4v6mDelete, /* DEVmodDelete */
|
||||
BSIM4v6delete, /* DEVdelete */
|
||||
BSIM4v6getic, /* DEVsetic */
|
||||
BSIM4v6ask, /* DEVask */
|
||||
BSIM4v6mAsk, /* DEVmodAsk */
|
||||
BSIM4v6pzLoad, /* DEVpzLoad */
|
||||
BSIM4v6convTest, /* DEVconvTest */
|
||||
NULL, /* DEVsenSetup */
|
||||
NULL, /* DEVsenLoad */
|
||||
NULL, /* DEVsenUpdate */
|
||||
NULL, /* DEVsenAcLoad */
|
||||
NULL, /* DEVsenPrint */
|
||||
NULL, /* DEVsenTrunc */
|
||||
NULL, /* DEVdisto */
|
||||
BSIM4v6noise, /* DEVnoise */
|
||||
#ifdef CIDER
|
||||
NULL, /* DEVdump */
|
||||
NULL, /* DEVacct */
|
||||
#endif
|
||||
&BSIM4v6iSize, /* DEVinstSize */
|
||||
&BSIM4v6mSize /* DEVmodSize */
|
||||
};
|
||||
|
||||
|
||||
SPICEdev *
|
||||
get_bsim4v6_info(void)
|
||||
{
|
||||
return &BSIM4v6info;
|
||||
}
|
||||
|
|
@ -0,0 +1,13 @@
|
|||
#ifndef _BSIM4v6INIT_H
|
||||
#define _BSIM4v6INIT_H
|
||||
|
||||
extern IFparm BSIM4v6pTable[ ];
|
||||
extern IFparm BSIM4v6mPTable[ ];
|
||||
extern char *BSIM4v6names[ ];
|
||||
extern int BSIM4v6pTSize;
|
||||
extern int BSIM4v6mPTSize;
|
||||
extern int BSIM4v6nSize;
|
||||
extern int BSIM4v6iSize;
|
||||
extern int BSIM4v6mSize;
|
||||
|
||||
#endif
|
||||
|
|
@ -0,0 +1,13 @@
|
|||
/**********
|
||||
Copyright 2004 Regents of the University of California. All rights reserved.
|
||||
Author: 2000 Weidong Liu.
|
||||
Author: 2001- Xuemei Xi
|
||||
File: bsim4v6itf.h
|
||||
**********/
|
||||
|
||||
#ifndef DEV_BSIM4v6
|
||||
#define DEV_BSIM4v6
|
||||
|
||||
SPICEdev *get_bsim4v6_info(void);
|
||||
|
||||
#endif
|
||||
|
|
@ -83,10 +83,9 @@ int add_udn(int,Evt_Udn_Info_t **);
|
|||
#include "bsim3v1/bsim3v1itf.h"
|
||||
#include "bsim3v32/bsim3v32itf.h"
|
||||
#include "bsim4/bsim4itf.h"
|
||||
#include "bsim4v2/bsim4v2itf.h"
|
||||
#include "bsim4v3/bsim4v3itf.h"
|
||||
#include "bsim4v4/bsim4v4itf.h"
|
||||
#include "bsim4v5/bsim4v5itf.h"
|
||||
#include "bsim4v6/bsim4v6itf.h"
|
||||
#include "bsim3soi/b4soiitf.h"
|
||||
#include "bsim3soi_pd/b3soipditf.h"
|
||||
#include "bsim3soi_fd/b3soifditf.h"
|
||||
|
|
@ -193,80 +192,79 @@ spice_init_devices(void)
|
|||
DEVices[ 8] = get_bsim3v32_info();
|
||||
DEVices[ 9] = get_b4soi_info();
|
||||
DEVices[10] = get_bsim4_info();
|
||||
DEVices[11] = get_bsim4v2_info();
|
||||
DEVices[12] = get_bsim4v3_info();
|
||||
DEVices[13] = get_bsim4v4_info();
|
||||
DEVices[14] = get_bsim4v5_info();
|
||||
DEVices[15] = get_b3soipd_info();
|
||||
DEVices[16] = get_b3soifd_info();
|
||||
DEVices[17] = get_b3soidd_info();
|
||||
DEVices[18] = get_cap_info();
|
||||
DEVices[19] = get_cccs_info();
|
||||
DEVices[20] = get_ccvs_info();
|
||||
DEVices[21] = get_cpl_info();
|
||||
DEVices[22] = get_csw_info();
|
||||
DEVices[23] = get_dio_info();
|
||||
DEVices[24] = get_hfeta_info();
|
||||
DEVices[25] = get_hfet2_info();
|
||||
DEVices[26] = get_hsm2_info();
|
||||
DEVices[27] = get_hsmhv_info();
|
||||
DEVices[28] = get_ind_info();
|
||||
DEVices[29] = get_mut_info();
|
||||
DEVices[30] = get_isrc_info();
|
||||
DEVices[31] = get_jfet_info();
|
||||
DEVices[32] = get_jfet2_info();
|
||||
DEVices[33] = get_ltra_info();
|
||||
DEVices[34] = get_mes_info();
|
||||
DEVices[35] = get_mesa_info();
|
||||
DEVices[36] = get_mos1_info();
|
||||
DEVices[37] = get_mos2_info();
|
||||
DEVices[38] = get_mos3_info();
|
||||
DEVices[39] = get_mos6_info();
|
||||
DEVices[40] = get_mos9_info();
|
||||
DEVices[41] = get_res_info();
|
||||
DEVices[42] = get_soi3_info();
|
||||
DEVices[43] = get_sw_info();
|
||||
DEVices[44] = get_tra_info();
|
||||
DEVices[45] = get_txl_info();
|
||||
DEVices[46] = get_vbic_info();
|
||||
DEVices[47] = get_vccs_info();
|
||||
DEVices[48] = get_vcvs_info();
|
||||
DEVices[49] = get_vsrc_info();
|
||||
DEVices[11] = get_bsim4v4_info();
|
||||
DEVices[12] = get_bsim4v5_info();
|
||||
DEVices[13] = get_bsim4v6_info();
|
||||
DEVices[14] = get_b3soipd_info();
|
||||
DEVices[15] = get_b3soifd_info();
|
||||
DEVices[16] = get_b3soidd_info();
|
||||
DEVices[17] = get_cap_info();
|
||||
DEVices[18] = get_cccs_info();
|
||||
DEVices[19] = get_ccvs_info();
|
||||
DEVices[20] = get_cpl_info();
|
||||
DEVices[21] = get_csw_info();
|
||||
DEVices[22] = get_dio_info();
|
||||
DEVices[23] = get_hfeta_info();
|
||||
DEVices[24] = get_hfet2_info();
|
||||
DEVices[25] = get_hsm2_info();
|
||||
DEVices[26] = get_hsmhv_info();
|
||||
DEVices[27] = get_ind_info();
|
||||
DEVices[28] = get_mut_info();
|
||||
DEVices[29] = get_isrc_info();
|
||||
DEVices[30] = get_jfet_info();
|
||||
DEVices[31] = get_jfet2_info();
|
||||
DEVices[32] = get_ltra_info();
|
||||
DEVices[33] = get_mes_info();
|
||||
DEVices[34] = get_mesa_info();
|
||||
DEVices[35] = get_mos1_info();
|
||||
DEVices[36] = get_mos2_info();
|
||||
DEVices[37] = get_mos3_info();
|
||||
DEVices[38] = get_mos6_info();
|
||||
DEVices[39] = get_mos9_info();
|
||||
DEVices[40] = get_res_info();
|
||||
DEVices[41] = get_soi3_info();
|
||||
DEVices[42] = get_sw_info();
|
||||
DEVices[43] = get_tra_info();
|
||||
DEVices[44] = get_txl_info();
|
||||
DEVices[45] = get_vbic_info();
|
||||
DEVices[46] = get_vccs_info();
|
||||
DEVices[47] = get_vcvs_info();
|
||||
DEVices[48] = get_vsrc_info();
|
||||
#ifdef CIDER
|
||||
DEVices[50] = get_nbjt_info();
|
||||
DEVices[51] = get_nbjt2_info();
|
||||
DEVices[52] = get_numd_info();
|
||||
DEVices[53] = get_numd2_info();
|
||||
DEVices[54] = get_numos_info();
|
||||
DEVices[49] = get_nbjt_info();
|
||||
DEVices[50] = get_nbjt2_info();
|
||||
DEVices[51] = get_numd_info();
|
||||
DEVices[52] = get_numd2_info();
|
||||
DEVices[53] = get_numos_info();
|
||||
#else
|
||||
DEVices[49] = NULL;
|
||||
DEVices[50] = NULL;
|
||||
DEVices[51] = NULL;
|
||||
DEVices[52] = NULL;
|
||||
DEVices[53] = NULL;
|
||||
DEVices[54] = NULL;
|
||||
DEVices[53] = NULL;
|
||||
#endif
|
||||
|
||||
#ifdef ADMS
|
||||
DEVices[55] = get_hicum0_info();
|
||||
DEVices[56] = get_hicum2_info();
|
||||
DEVices[57] = get_mextram_info();
|
||||
DEVices[58] = get_ekv_info();
|
||||
DEVices[59] = get_psp102_info();
|
||||
DEVices[54] = get_hicum0_info();
|
||||
DEVices[55] = get_hicum2_info();
|
||||
DEVices[56] = get_mextram_info();
|
||||
DEVices[57] = get_ekv_info();
|
||||
DEVices[58] = get_psp102_info();
|
||||
#else
|
||||
DEVices[54] = NULL;
|
||||
DEVices[55] = NULL;
|
||||
DEVices[56] = NULL;
|
||||
DEVices[57] = NULL;
|
||||
DEVices[58] = NULL;
|
||||
DEVices[59] = NULL;
|
||||
#endif
|
||||
|
||||
#ifdef NDEV /* NDEV */
|
||||
DEVices[60] = get_ndev_info();
|
||||
DEVices[59] = get_ndev_info();
|
||||
#else
|
||||
DEVices[60] = NULL;
|
||||
DEVices[59] = NULL;
|
||||
#endif
|
||||
DEVices[60] = NULL;
|
||||
DEVices[61] = NULL;
|
||||
DEVices[62] = NULL;
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
@ -290,12 +288,12 @@ SPICEdev ** devices(void)
|
|||
/*not yet usable*/
|
||||
|
||||
#ifdef ADMS
|
||||
#define DEVICES_USED {"asrc", "bjt", "vbic", "bsim1", "bsim2", "bsim3", "bsim3v32", "bsim3v2", "bsim3v1", "bsim4", "bsim4v2", "bsim4v3", "bsim4v4", "bsim4v5", \
|
||||
#define DEVICES_USED {"asrc", "bjt", "vbic", "bsim1", "bsim2", "bsim3", "bsim3v32", "bsim3v2", "bsim3v1", "bsim4", "bsim4v4", "bsim4v5", "bsim4v6", \
|
||||
"bsim4soi", "bsim3soipd", "bsim3soifd", "bsim3soidd", "hisim2", "hisimhv", \
|
||||
"cap", "cccs", "ccvs", "csw", "dio", "hfet", "hfet2", "ind", "isrc", "jfet", "ltra", "mes", "mesa" ,"mos1", "mos2", "mos3", \
|
||||
"mos6", "mos9", "res", "soi3", "sw", "tra", "urc", "vccs", "vcvs", "vsrc", "hicum0", "hicum2", "mextram", "ekv", "psp102"}
|
||||
#else
|
||||
#define DEVICES_USED {"asrc", "bjt", "vbic", "bsim1", "bsim2", "bsim3", "bsim3v32", "bsim3v2", "bsim3v1", "bsim4", "bsim4v4", "bsim4v2", "bsim4v3", "bsim4v4", "bsim4v5", \
|
||||
#define DEVICES_USED {"asrc", "bjt", "vbic", "bsim1", "bsim2", "bsim3", "bsim3v32", "bsim3v2", "bsim3v1", "bsim4", "bsim4v4", "bsim4v5", "bsim4v6", \
|
||||
"bsim4soi", "bsim3soipd", "bsim3soifd", "bsim3soidd", "hisim2", "hisimhv", \
|
||||
"cap", "cccs", "ccvs", "csw", "dio", "hfet", "hfet2", "ind", "isrc", "jfet", "ltra", "mes", "mesa" ,"mos1", "mos2", "mos3", \
|
||||
"mos6", "mos9", "res", "soi3", "sw", "tra", "urc", "vccs", "vcvs", "vsrc"}
|
||||
|
|
|
|||
Loading…
Reference in New Issue