/*****************************************************************/ /* Berkeley BSIM3v3.2.0 & BSIM3v3.2.4 (default) Verilog-A model */ /*****************************************************************/ `define VOLTAGE_MAXDELTA 0.3 `include"discipline.h" // Following line must be uncomment for using NQS charge model (NQSMOD=1) //`define NQSMOD //****** Physical constants ******// `define EPSOX 3.453133e-11 `define KboQ 8.617087e-5 `define EPSSI 1.03594e-10 `define Charge_q 1.60219e-19 `define CONSTvt0 0.02586419 `define CONSTroot2 1.41421356 //****** Mathematical constants and constants of limitation ******// `define PI 3.141592654 `define EXP_THRESHOLD 34.0 `define MIN_EXP 1.713908431e-15 `define MAX_EXP 5.834617425e14 // //****** Constants for the model ******// `define DELTA_1 0.02 `define DELTA_3 0.02 `define DELTA_4 0.02 `ifdef insideADMS `define UNDEF(val) val `else `define UNDEF(val) -99.0 `endif `ifdef VERSION `else `define VERSION"unknown" `endif (* version=`VERSION spice:prefix="m" spice:ntype="nmos" spice:ptype="pmos" spice:level="100"*) (* company="Silvaco" desc="bsim3 mosfet model from Silvaco (level 100)"*) (* license="see http://www.silvaco.com/downloads/verilogADownloads.html"*) module mybsim3 (drain, gate, source, bulk); inout drain, gate, source, bulk; (*desc="drain node" spice:name="d"*) electrical drain; (*desc="gate node" spice:name="g"*) electrical gate; (*desc="source node" spice:name="s"*) electrical source; (*desc="bulk node" spice:name="b"*) electrical bulk; (*desc="internal node"*) electrical drainp, sourcep; `ifdef NQSMOD electrical q; // NQS charge model node `endif //****** Device Parameters ******// (*desc="length" spice:name="l" type="instance"*) parameter real L = 5.0e-6; (*desc="width" spice:name="w" type="instance"*) parameter real W = 5.0e-6; (*desc="source perimeter" spice:name="ps" type="instance"*) parameter real PS = 0.0; (*desc="drain perimeter" spice:name="pd" type="instance"*) parameter real PD = 0.0; (*desc="source area" spice:name="as" type="instance"*) parameter real AS = 0.0; (*desc="drain area" spice:name="ad" type="instance"*) parameter real AD = 0.0; (*desc="Number of source diffusion squares" spice:name="nrs" type="instance"*) parameter real NRS = 1.0; (*desc="Number of drain diffusion squares" spice:name="nrd" type="instance"*) parameter real NRD = 1.0; (*desc="Non-quasi-static model selector" spice:name="nqsmod"*) parameter real NQSMOD = 0; (*spice:name="gmin"*) parameter real GMIN = 1e-12; (*spice:name="type"*) parameter real TYPE = 1.0; // Versions can be 3.20 or 3.24 // (BSIM3v3.2.0 or BSIM3v3.2.4) (*spice:name="version"*) parameter real VERSION = 3.24; (*spice:name="paramchk"*) parameter real PARAMCHK = 1; //****** Model Selectors/Controllers ******// (*desc="Mobility model selector" spice:name="mobmod"*) parameter real MOBMOD = 1; (*desc="Capacitance model selector" spice:name="capmod"*) parameter real CAPMOD = 3; parameter real NOIMOD = 1; (*desc="Bin unit selector" spice:name="binunit"*) parameter real BINUNIT = 1; (*desc="Gate oxide thickness in meters" spice:name="tox"*) parameter real TOX = 150.0e-10; (*desc="Gate oxide thickness used in extraction" spice:name="toxm"*) parameter real TOXM = 150.0e-10; (*desc="Drain/Source and channel coupling capacitance" spice:name="cdsc"*) parameter real CDSC = 2.4e-4; (*desc="Body-bias dependence of cdsc" spice:name="cdscb"*) parameter real CDSCB = 0.0; (*desc="Drain-bias dependence of cdsc" spice:name="cdscd"*) parameter real CDSCD = 0.0; (*desc="Interface state capacitance" spice:name="cit"*) parameter real CIT = 0.0; (*desc="Subthreshold swing Coefficient" spice:name="nfactor"*) parameter real NFACTOR = 1; (*desc="Junction depth in meters" spice:name="xj"*) parameter real XJ = 0.15e-6; (*desc="Saturation velocity at tnom" spice:name="vsat"*) parameter real VSAT = 8.0e4; (*desc="Temperature coefficient of vsat" spice:name="at"*) parameter real AT = 3.3e4; (*desc="Non-uniform depletion width effect coefficient." spice:name="a0"*) parameter real A0 = 1.0; (*desc="Gate bias coefficient of Abulk." spice:name="ags"*) parameter real AGS = 0.0; (*desc="Non-saturation effect coefficient" spice:name="a1"*) parameter real A1 = 0.0; (*desc="Non-saturation effect coefficient" spice:name="a2"*) parameter real A2 = 1.0; (*desc="Body-bias coefficient of non-uniform depletion width effect." spice:name="keta"*) parameter real KETA = -0.047; (*desc="Substrate doping concentration" spice:name="nsub"*) parameter real NSUB = `UNDEF(6E+16); (*desc="Channel doping concentration" spice:name="nch"*) parameter real NCH = `UNDEF(1.7E+17); (*desc="Poly-gate doping concentration" spice:name="ngate"*) parameter real NGATE = 0; (*desc="Vth body coefficient" spice:name="gamma1"*) parameter real GAMMA1 = `UNDEF(0.0); (*desc="Vth body coefficient" spice:name="gamma2"*) parameter real GAMMA2 = `UNDEF(0.0); (*desc="Vth transition body Voltage" spice:name="vbx"*) parameter real VBX = `UNDEF(0.0); (*desc="Maximum body voltage" spice:name="vbm"*) parameter real VBM = -3.0; (*desc="Doping depth" spice:name="xt"*) parameter real XT = `UNDEF(1.55E-07); (*desc="Bulk effect coefficient 1" spice:name="k1"*) parameter real K1 = `UNDEF(0.0); (*desc="Temperature coefficient of Vth" spice:name="kt1"*) parameter real KT1 = -0.11; (*desc="Temperature coefficient of Vth" spice:name="kt1l"*) parameter real KT1L = 0.0; (*desc="Body-coefficient of kt1" spice:name="kt2"*) parameter real KT2 = 0.022; (*desc="Bulk effect coefficient 2" spice:name="k2"*) parameter real K2 = `UNDEF(0.0); (*desc="Narrow width effect coefficient" spice:name="k3"*) parameter real K3 = 80.0; (*desc="Body effect coefficient of k3" spice:name="k3b"*) parameter real K3B = 0.0; (*desc="Narrow width effect parameter" spice:name="w0"*) parameter real W0 = 2.5e-6; (*desc="Lateral non-uniform doping effect" spice:name="nlx"*) parameter real NLX = 1.74e-7; (*desc="Short channel effect coeff. 0" spice:name="dvt0"*) parameter real DVT0 = 2.2; (*desc="Short channel effect coeff. 1" spice:name="dvt1"*) parameter real DVT1 = 0.53; (*desc="Short channel effect coeff. 2" spice:name="dvt2"*) parameter real DVT2 = -0.032; (*desc="Narrow Width coeff. 0" spice:name="dvt0w"*) parameter real DVT0W = 0.0; (*desc="Narrow Width effect coeff. 1" spice:name="dvt1w"*) parameter real DVT1W = 5.3e6; (*desc="Narrow Width effect coeff. 2" spice:name="dvt2w"*) parameter real DVT2W = -0.032; (*desc="DIBL coefficient of output resistance" spice:name="drout"*) parameter real DROUT = 0.56; (*desc="DIBL coefficient in the subthreshold region" spice:name="dsub"*) parameter real DSUB = 0.56; (*desc="Threshold voltage" spice:name="vtho"*) parameter real VTHO = `UNDEF(0.7); (*desc="Threshold voltage" spice:name="vth0"*) parameter real VTH0 = `UNDEF(0.7); (*desc="Linear gate dependence of mobility" spice:name="ua"*) parameter real UA = 2.25e-9; (*desc="Temperature coefficient of ua" spice:name="ua1"*) parameter real UA1 = 4.31e-9; (*desc="Quadratic gate dependence of mobility" spice:name="ub"*) parameter real UB = 5.87e-19; (*desc="Temperature coefficient of ub" spice:name="ub1"*) parameter real UB1 = -7.61e-18; (*desc="Body-bias dependence of mobility" spice:name="uc"*) parameter real UC = `UNDEF(-4.65E-11); (*desc="Temperature coefficient of uc" spice:name="uc1"*) parameter real UC1 = `UNDEF(-5.6E-11); (*desc="Low-field mobility at Tnom" spice:name="u0"*) parameter real U0 = `UNDEF(0.067); (*desc="Temperature coefficient of mobility" spice:name="ute"*) parameter real UTE = -1.5; (*desc="Threshold voltage offset" spice:name="voff"*) parameter real VOFF = -0.08; (*desc="Parameter measurement temperature in C degree" spice:name="tnom"*) parameter real myTNOM = `UNDEF(27.0); (*desc="Gate-source overlap capacitance per width" spice:name="cgso"*) parameter real CGSO = `UNDEF(2.07188E-10); (*desc="Gate-drain overlap capacitance per width" spice:name="cgdo"*) parameter real CGDO = `UNDEF(2.07188E-10); (*desc="Gate-bulk overlap capacitance per length" spice:name="cgbo"*) parameter real CGBO = `UNDEF(2.07188E-10); (*desc="Channel charge partitioning" spice:name="xpart"*) parameter real XPART = 0.0; (*desc="Non-quasi-static Elmore Constant Parameter" spice:name="elm"*) parameter real ELM = 5.0; (*desc="Effective Vds parameter" spice:name="delta"*) parameter real DELTA = 0.01; (*desc="Source-drain sheet resistance" spice:name="rsh"*) parameter real RSH = 0.0; (*desc="Source-drain resistance per width" spice:name="rdsw"*) parameter real RDSW = 0; (*desc="Gate-bias effect on parasitic resistance" spice:name="prwg"*) parameter real PRWG = 0.0; (*desc="Body-effect on parasitic resistance" spice:name="prwb"*) parameter real PRWB = 0.0; (*desc="Temperature coefficient of parasitic resistance" spice:name="prt"*) parameter real PRT = 0.0; (*desc="Subthreshold region DIBL coefficient" spice:name="eta0"*) parameter real ETA0 = 0.08; (*desc="Subthreshold region DIBL coefficient" spice:name="etab"*) parameter real ETAB = -0.07; (*desc="Channel length modulation Coefficient" spice:name="pclm"*) parameter real PCLM = 1.3; (*desc="Drain-induced barrier lowering coefficient" spice:name="pdiblc1"*) parameter real PDIBLC1 = 0.39; (*desc="Drain-induced barrier lowering coefficient" spice:name="pdiblc2"*) parameter real PDIBLC2 = 0.0086; (*desc="Body-effect on drain-induced barrier lowering" spice:name="pdiblcb"*) parameter real PDIBLCB = 0.0; (*desc="Substrate current body-effect coefficient" spice:name="pscbe1"*) parameter real PSCBE1 = 4.24e8; (*desc="Substrate current body-effect coefficient" spice:name="pscbe2"*) parameter real PSCBE2 = 1.0e-5; (*desc="Gate dependence of output resistance parameter" spice:name="pvag"*) parameter real PVAG = 0.0; (*desc="Source/drain junction reverse saturation current density" spice:name="js"*) parameter real JS = 1.0E-4; (*desc="Sidewall junction reverse saturation current density" spice:name="jsw"*) parameter real JSW = 0.0; (*desc="Source/drain junction built-in potential" spice:name="pb"*) parameter real PB = 1.0; (*desc="Source/drain junction emission coefficient" spice:name="nj"*) parameter real NJ = 1.0; (*desc="Junction current temperature exponent" spice:name="xti"*) parameter real XTI = 3.0; (*desc="Source/drain bottom junction capacitance grading coefficient" spice:name="mj"*) parameter real MJ = 0.5; (*desc="Source/drain sidewall junction capacitance built in potential" spice:name="pbsw"*) parameter real PBSW = 1.0; (*desc="Source/drain sidewall junction capacitance grading coefficient" spice:name="mjsw"*) parameter real MJSW = 0.33; (*desc="Source/drain (gate side) sidewall junction capacitance built in potential" spice:name="pbswg"*) parameter real PBSWG = 1.0; (*desc="Source/drain (gate side) sidewall junction capacitance grading coefficient" spice:name="mjswg"*) parameter real MJSWG = 0.33; (*desc="Source/drain bottom junction capacitance per unit area" spice:name="cj"*) parameter real CJ = 5.0E-4; (*desc="Flat Band Voltage parameter for capmod=0 only" spice:name="vfbcv"*) parameter real VFBCV = -1.0; (*desc="Flat Band Voltage" spice:name="vfb"*) parameter real VFB = `UNDEF(-1.0); (*desc="Source/drain sidewall junction capacitance per unit periphery" spice:name="cjsw"*) parameter real CJSW = 5.0E-10; (*desc="Source/drain (gate side) sidewall junction capacitance per unit width" spice:name="cjswg"*) parameter real CJSWG = 5.0E-10; (*desc="Temperature coefficient of pb" spice:name="tpb"*) parameter real TPB = 0.0; (*desc="Temperature coefficient of cj" spice:name="tcj"*) parameter real TCJ = 0.0; (*desc="Temperature coefficient of pbsw" spice:name="tpbsw"*) parameter real TPBSW = 0.0; (*desc="Temperature coefficient of cjsw" spice:name="tcjsw"*) parameter real TCJSW = 0.0; (*desc="Temperature coefficient of pbswg" spice:name="tpbswg"*) parameter real TPBSWG = 0.0; (*desc="Temperature coefficient of cjswg" spice:name="tcjswg"*) parameter real TCJSWG = 0.0; (*desc="Exponential coefficient for finite charge thickness" spice:name="acde"*) parameter real ACDE = 1.0; (*desc="Coefficient for gate-bias dependent surface potential" spice:name="moin"*) parameter real MOIN = 15.0; (*desc="C-V turn-on/off parameter" spice:name="noff"*) parameter real NOFF = 1.0; (*desc="C-V lateral-shift parameter" spice:name="voffcv"*) parameter real VOFFCV = 0.0; (*desc="Length reduction parameter" spice:name="lint"*) parameter real LINT = 0.0; (*desc="Length reduction parameter" spice:name="ll"*) parameter real LL = 0.0; (*desc="Length reduction parameter for CV" spice:name="llc"*) parameter real LLC = 0.0; (*desc="Length reduction parameter" spice:name="lln"*) parameter real LLN = 1.0; (*desc="Length reduction parameter" spice:name="lw"*) parameter real LW = 0.0; (*desc="Length reduction parameter for CV" spice:name="lwc"*) parameter real LWC = 0.0; (*desc="Length reduction parameter" spice:name="lwn"*) parameter real LWN = 1.0; (*desc="Length reduction parameter" spice:name="lwl"*) parameter real LWL = 0.0; (*desc="Length reduction parameter for CV" spice:name="lwlc"*) parameter real LWLC = 0.0; (*desc="Minimum length for the model" spice:name="lmin"*) parameter real LMIN = 0.0; (*desc="Maximum length for the model" spice:name="lmax"*) parameter real LMAX = 1.0; (*desc="Width dependence of rds" spice:name="wr"*) parameter real WR = 1.0; (*desc="Width reduction parameter" spice:name="wint"*) parameter real WINT = 0.0; (*desc="Width reduction parameter" spice:name="dwg"*) parameter real DWG = 0.0; (*desc="Width reduction parameter" spice:name="dwb"*) parameter real DWB = 0.0; (*desc="Width reduction parameter" spice:name="wl"*) parameter real WL = 0.0; (*desc="Width reduction parameter for CV" spice:name="wlc"*) parameter real WLC = 0.0; (*desc="Width reduction parameter" spice:name="wln"*) parameter real WLN = 1.0; (*desc="Width reduction parameter" spice:name="ww"*) parameter real WW = 0.0; (*desc="Width reduction parameter for CV" spice:name="wwc"*) parameter real WWC = 0.0; (*desc="Width reduction parameter" spice:name="wwn"*) parameter real WWN = 1.0; (*desc="Width reduction parameter" spice:name="wwl"*) parameter real WWL = 0.0; (*desc="Width reduction parameter for CV" spice:name="wwlc"*) parameter real WWLC = 0.0; (*desc="Minimum width for the model" spice:name="wmin"*) parameter real WMIN = 0.0; (*desc="Maximum width for the model" spice:name="wmax"*) parameter real WMAX = 1.0; (*desc="Abulk narrow width parameter" spice:name="b0"*) parameter real B0 = 0.0; (*desc="Abulk narrow width parameter" spice:name="b1"*) parameter real B1 = 0.0; (*desc="New C-V model parameter" spice:name="cgsl"*) parameter real CGSL = 0.0; (*desc="New C-V model parameter" spice:name="cgdl"*) parameter real CGDL = 0.0; (*desc="New C-V model parameter" spice:name="ckappa"*) parameter real CKAPPA = 0.6; (*desc="Fringe capacitance parameter" spice:name="cf"*) parameter real CF = `UNDEF(-99.0); (*desc="Vdsat parameter for C-V model" spice:name="clc"*) parameter real CLC = 0.1e-6; (*desc="Vdsat parameter for C-V model" spice:name="cle"*) parameter real CLE = 0.6; (*desc="Delta W for C-V model" spice:name="dwc"*) parameter real DWC = 0.0; (*desc="Delta L for C-V model" spice:name="dlc"*) parameter real DLC = `UNDEF(-99.0); (*desc="substrate current model parameter" spice:name="alpha0"*) parameter real ALPHA0 = 0.0; (*desc="substrate current model parameter" spice:name="alpha1"*) parameter real ALPHA1 = 0.0; (*desc="substrate current model parameter" spice:name="beta0"*) parameter real BETA0 = 30.0; (*desc="Diode limiting current" spice:name="ijth"*) parameter real IJTH = 0.1; /*** Length dependance model parameters ***/ (*desc="Length dependence of cdsc" spice:name="lcdsc"*) parameter real LCDSC = 0.0; (*desc="Length dependence of cdscb" spice:name="lcdscb"*) parameter real LCDSCB = 0.0; (*desc="Length dependence of cdscd" spice:name="lcdscd"*) parameter real LCDSCD = 0.0; (*desc="Length dependence of cit" spice:name="lcit"*) parameter real LCIT = 0.0; (*desc="Length dependence of nfactor" spice:name="lnfactor"*) parameter real LNFACTOR = 0.0; (*desc="Length dependence of xj" spice:name="lxj"*) parameter real LXJ = 0.0; (*desc="Length dependence of vsat" spice:name="lvsat"*) parameter real LVSAT = 0.0; (*desc="Length dependence of at" spice:name="lat"*) parameter real LAT = 0.0; (*desc="Length dependence of a0" spice:name="la0"*) parameter real LA0 = 0.0; (*desc="Length dependence of ags" spice:name="lags"*) parameter real LAGS = 0.0; (*desc="Length dependence of a1" spice:name="la1"*) parameter real LA1 = 0.0; (*desc="Length dependence of a2" spice:name="la2"*) parameter real LA2 = 0.0; (*desc="Length dependence of keta" spice:name="lketa"*) parameter real LKETA = 0.0; (*desc="Length dependence of nsub" spice:name="lnsub"*) parameter real LNSUB = 0.0; (*desc="Length dependence of nch" spice:name="lnch"*) parameter real LNCH = 0.0; (*desc="Length dependence of ngate" spice:name="lngate"*) parameter real LNGATE = 0.0; (*desc="Length dependence of gamma1" spice:name="lgamma1"*) parameter real LGAMMA1 = `UNDEF(0.0); (*desc="Length dependence of gamma2" spice:name="lgamma2"*) parameter real LGAMMA2 = `UNDEF(0.0); (*desc="Length dependence of vbx" spice:name="lvbx"*) parameter real LVBX = `UNDEF(0.0); (*desc="Length dependence of vbm" spice:name="lvbm"*) parameter real LVBM = 0.0; (*desc="Length dependence of xt" spice:name="lxt"*) parameter real LXT = 0.0; (*desc="Length dependence of k1" spice:name="lk1"*) parameter real LK1 = `UNDEF(0.0); (*desc="Length dependence of kt1" spice:name="lkt1"*) parameter real LKT1 = 0.0; (*desc="Length dependence of kt1l" spice:name="lkt1l"*) parameter real LKT1L = 0.0; (*desc="Length dependence of kt2" spice:name="lkt2"*) parameter real LKT2 = 0.0; (*desc="Length dependence of k2" spice:name="lk2"*) parameter real LK2 = `UNDEF(0.0); (*desc="Length dependence of k3" spice:name="lk3"*) parameter real LK3 = 0.0; (*desc="Length dependence of k3b" spice:name="lk3b"*) parameter real LK3B = 0.0; (*desc="Length dependence of w0" spice:name="lw0"*) parameter real LW0 = 0.0; (*desc="Length dependence of nlx" spice:name="lnlx"*) parameter real LNLX = 0.0; (*desc="Length dependence of dvt0" spice:name="ldvt0"*) parameter real LDVT0 = 0.0; (*desc="Length dependence of dvt1" spice:name="ldvt1"*) parameter real LDVT1 = 0.0; (*desc="Length dependence of dvt2" spice:name="ldvt2"*) parameter real LDVT2 = 0.0; (*desc="Length dependence of dvt0w" spice:name="ldvt0w"*) parameter real LDVT0W = 0.0; (*desc="Length dependence of dvt1w" spice:name="ldvt1w"*) parameter real LDVT1W = 0.0; (*desc="Length dependence of dvt2w" spice:name="ldvt2w"*) parameter real LDVT2W = 0.0; (*desc="Length dependence of drout" spice:name="ldrout"*) parameter real LDROUT = 0.0; (*desc="Length dependence of dsub" spice:name="ldsub"*) parameter real LDSUB = 0.0; (*desc="Length dependence of vto" spice:name="lvth0"*) parameter real LVTH0 = 0.0; (*desc="Length dependence of vto" spice:name="lvtho"*) parameter real LVTHO = 0.0; (*desc="Length dependence of ua" spice:name="lua"*) parameter real LUA = 0.0; (*desc="Length dependence of ua1" spice:name="lua1"*) parameter real LUA1 = 0.0; (*desc="Length dependence of ub" spice:name="lub"*) parameter real LUB = 0.0; (*desc="Length dependence of ub1" spice:name="lub1"*) parameter real LUB1 = 0.0; (*desc="Length dependence of uc" spice:name="luc"*) parameter real LUC = 0.0; (*desc="Length dependence of uc1" spice:name="luc1"*) parameter real LUC1 = 0.0; (*desc="Length dependence of u0" spice:name="lu0"*) parameter real LU0 = 0.0; (*desc="Length dependence of ute" spice:name="lute"*) parameter real LUTE = 0.0; (*desc="Length dependence of voff" spice:name="lvoff"*) parameter real LVOFF = 0.0; (*desc="Length dependence of elm" spice:name="lelm"*) parameter real LELM = 0.0; (*desc="Length dependence of delta" spice:name="ldelta"*) parameter real LDELTA = 0.0; (*desc="Length dependence of rdsw" spice:name="lrdsw"*) parameter real LRDSW = 0.0; (*desc="Length dependence of prwg" spice:name="lprwg"*) parameter real LPRWG = 0.0; (*desc="Length dependence of prwb" spice:name="lprwb"*) parameter real LPRWB = 0.0; (*desc="Length dependence of prt" spice:name="lprt"*) parameter real LPRT = 0.0; (*desc="Length dependence of eta0" spice:name="leta0"*) parameter real LETA0 = 0.0; (*desc="Length dependence of etab" spice:name="letab"*) parameter real LETAB = 0.0; (*desc="Length dependence of pclm" spice:name="lpclm"*) parameter real LPCLM = 0.0; (*desc="Length dependence of pdiblc1" spice:name="lpdiblc1"*) parameter real LPDIBLC1 = 0.0; (*desc="Length dependence of pdiblc2" spice:name="lpdiblc2"*) parameter real LPDIBLC2 = 0.0; (*desc="Length dependence of pdiblcb" spice:name="lpdiblcb"*) parameter real LPDIBLCB = 0.0; (*desc="Length dependence of pscbe1" spice:name="lpscbe1"*) parameter real LPSCBE1 = 0.0; (*desc="Length dependence of pscbe2" spice:name="lpscbe2"*) parameter real LPSCBE2 = 0.0; (*desc="Length dependence of pvag" spice:name="lpvag"*) parameter real LPVAG = 0.0; (*desc="Length dependence of wr" spice:name="lwr"*) parameter real LWR = 0.0; (*desc="Length dependence of dwg" spice:name="ldwg"*) parameter real LDWG = 0.0; (*desc="Length dependence of dwb" spice:name="ldwb"*) parameter real LDWB = 0.0; (*desc="Length dependence of b0" spice:name="lb0"*) parameter real LB0 = 0.0; (*desc="Length dependence of b1" spice:name="lb1"*) parameter real LB1 = 0.0; (*desc="Length dependence of cgsl" spice:name="lcgsl"*) parameter real LCGSL = 0.0; (*desc="Length dependence of cgdl" spice:name="lcgdl"*) parameter real LCGDL = 0.0; (*desc="Length dependence of ckappa" spice:name="lckappa"*) parameter real LCKAPPA = 0.0; (*desc="Length dependence of cf" spice:name="lcf"*) parameter real LCF = 0.0; (*desc="Length dependence of clc" spice:name="lclc"*) parameter real LCLC = 0.0; (*desc="Length dependence of cle" spice:name="lcle"*) parameter real LCLE = 0.0; (*desc="Length dependence of alpha0" spice:name="lalpha0"*) parameter real LALPHA0 = 0.0; (*desc="Length dependence of alpha1" spice:name="lalpha1"*) parameter real LALPHA1 = 0.0; (*desc="Length dependence of beta0" spice:name="lbeta0"*) parameter real LBETA0 = 0.0; (*desc="Length dependence of vfbcv" spice:name="lvfbcv"*) parameter real LVFBCV = 0.0; (*desc="Length dependence of vfb" spice:name="lvfb"*) parameter real LVFB = 0.0; (*desc="Length dependence of acde" spice:name="lacde"*) parameter real LACDE = 0.0; (*desc="Length dependence of moin" spice:name="lmoin"*) parameter real LMOIN = 0.0; (*desc="Length dependence of noff" spice:name="lnoff"*) parameter real LNOFF = 0.0; (*desc="Length dependence of voffcv" spice:name="lvoffcv"*) parameter real LVOFFCV = 0.0; (*desc="Width dependence of cdsc" spice:name="wcdsc"*) parameter real WCDSC = 0.0; (*desc="Width dependence of cdscb" spice:name="wcdscb"*) parameter real WCDSCB = 0.0; (*desc="Width dependence of cdscd" spice:name="wcdscd"*) parameter real WCDSCD = 0.0; (*desc="Width dependence of cit" spice:name="wcit"*) parameter real WCIT = 0.0; (*desc="Width dependence of nfactor" spice:name="wnfactor"*) parameter real WNFACTOR = 0.0; (*desc="Width dependence of xj" spice:name="wxj"*) parameter real WXJ = 0.0; (*desc="Width dependence of vsat" spice:name="wvsat"*) parameter real WVSAT = 0.0; (*desc="Width dependence of at" spice:name="wat"*) parameter real WAT = 0.0; (*desc="Width dependence of a0" spice:name="wa0"*) parameter real WA0 = 0.0; (*desc="Width dependence of ags" spice:name="wags"*) parameter real WAGS = 0.0; (*desc="Width dependence of a1" spice:name="wa1"*) parameter real WA1 = 0.0; (*desc="Width dependence of a2" spice:name="wa2"*) parameter real WA2 = 0.0; (*desc="Width dependence of keta" spice:name="wketa"*) parameter real WKETA = 0.0; (*desc="Width dependence of nsub" spice:name="wnsub"*) parameter real WNSUB = 0.0; (*desc="Width dependence of nch" spice:name="wnch"*) parameter real WNCH = 0.0; (*desc="Width dependence of ngate" spice:name="wngate"*) parameter real WNGATE = 0.0; (*desc="Width dependence of gamma1" spice:name="wgamma1"*) parameter real WGAMMA1 = `UNDEF(0.0); (*desc="Width dependence of gamma2" spice:name="wgamma2"*) parameter real WGAMMA2 = `UNDEF(0.0); (*desc="Width dependence of vbx" spice:name="wvbx"*) parameter real WVBX = `UNDEF(0.0); (*desc="Width dependence of vbm" spice:name="wvbm"*) parameter real WVBM = 0.0; (*desc="Width dependence of xt" spice:name="wxt"*) parameter real WXT = 0.0; (*desc="Width dependence of k1" spice:name="wk1"*) parameter real WK1 = `UNDEF(0.0); (*desc="Width dependence of kt1" spice:name="wkt1"*) parameter real WKT1 = 0.0; (*desc="Width dependence of kt1l" spice:name="wkt1l"*) parameter real WKT1L = 0.0; (*desc="Width dependence of kt2" spice:name="wkt2"*) parameter real WKT2 = 0.0; (*desc="Width dependence of k2" spice:name="wk2"*) parameter real WK2 = `UNDEF(0.0); (*desc="Width dependence of k3" spice:name="wk3"*) parameter real WK3 = 0.0; (*desc="Width dependence of k3b" spice:name="wk3b"*) parameter real WK3B = 0.0; (*desc="Width dependence of w0" spice:name="ww0"*) parameter real WW0 = 0.0; (*desc="Width dependence of nlx" spice:name="wnlx"*) parameter real WNLX = 0.0; (*desc="Width dependence of dvt0" spice:name="wdvt0"*) parameter real WDVT0 = 0.0; (*desc="Width dependence of dvt1" spice:name="wdvt1"*) parameter real WDVT1 = 0.0; (*desc="Width dependence of dvt2" spice:name="wdvt2"*) parameter real WDVT2 = 0.0; (*desc="Width dependence of dvt0w" spice:name="wdvt0w"*) parameter real WDVT0W = 0.0; (*desc="Width dependence of dvt1w" spice:name="wdvt1w"*) parameter real WDVT1W = 0.0; (*desc="Width dependence of dvt2w" spice:name="wdvt2w"*) parameter real WDVT2W = 0.0; (*desc="Width dependence of drout" spice:name="wdrout"*) parameter real WDROUT = 0.0; (*desc="Width dependence of dsub" spice:name="wdsub"*) parameter real WDSUB = 0.0; (*desc="Width dependence of vto" spice:name="wvth0"*) parameter real WVTH0 = 0.0; (*desc="Width dependence of vto" spice:name="wvtho"*) parameter real WVTHO = 0.0; (*desc="Width dependence of ua" spice:name="wua"*) parameter real WUA = 0.0; (*desc="Width dependence of ua1" spice:name="wua1"*) parameter real WUA1 = 0.0; (*desc="Width dependence of ub" spice:name="wub"*) parameter real WUB = 0.0; (*desc="Width dependence of ub1" spice:name="wub1"*) parameter real WUB1 = 0.0; (*desc="Width dependence of uc" spice:name="wuc"*) parameter real WUC = 0.0; (*desc="Width dependence of uc1" spice:name="wuc1"*) parameter real WUC1 = 0.0; (*desc="Width dependence of u0" spice:name="wu0"*) parameter real WU0 = 0.0; (*desc="Width dependence of ute" spice:name="wute"*) parameter real WUTE = 0.0; (*desc="Width dependence of voff" spice:name="wvoff"*) parameter real WVOFF = 0.0; (*desc="Width dependence of elm" spice:name="welm"*) parameter real WELM = 0.0; (*desc="Width dependence of delta" spice:name="wdelta"*) parameter real WDELTA = 0.0; (*desc="Width dependence of rdsw" spice:name="wrdsw"*) parameter real WRDSW = 0.0; (*desc="Width dependence of prwg" spice:name="wprwg"*) parameter real WPRWG = 0.0; (*desc="Width dependence of prwb" spice:name="wprwb"*) parameter real WPRWB = 0.0; (*desc="Width dependence of prt" spice:name="wprt"*) parameter real WPRT = 0.0; (*desc="Width dependence of eta0" spice:name="weta0"*) parameter real WETA0 = 0.0; (*desc="Width dependence of etab" spice:name="wetab"*) parameter real WETAB = 0.0; (*desc="Width dependence of pclm" spice:name="wpclm"*) parameter real WPCLM = 0.0; (*desc="Width dependence of pdiblc1" spice:name="wpdiblc1"*) parameter real WPDIBLC1 = 0.0; (*desc="Width dependence of pdiblc2" spice:name="wpdiblc2"*) parameter real WPDIBLC2 = 0.0; (*desc="Width dependence of pdiblcb" spice:name="wpdiblcb"*) parameter real WPDIBLCB = 0.0; (*desc="Width dependence of pscbe1" spice:name="wpscbe1"*) parameter real WPSCBE1 = 0.0; (*desc="Width dependence of pscbe2" spice:name="wpscbe2"*) parameter real WPSCBE2 = 0.0; (*desc="Width dependence of pvag" spice:name="wpvag"*) parameter real WPVAG = 0.0; (*desc="Width dependence of wr" spice:name="wwr"*) parameter real WWR = 0.0; (*desc="Width dependence of dwg" spice:name="wdwg"*) parameter real WDWG = 0.0; (*desc="Width dependence of dwb" spice:name="wdwb"*) parameter real WDWB = 0.0; (*desc="Width dependence of b0" spice:name="wb0"*) parameter real WB0 = 0.0; (*desc="Width dependence of b1" spice:name="wb1"*) parameter real WB1 = 0.0; (*desc="Width dependence of cgsl" spice:name="wcgsl"*) parameter real WCGSL = 0.0; (*desc="Width dependence of cgdl" spice:name="wcgdl"*) parameter real WCGDL = 0.0; (*desc="Width dependence of ckappa" spice:name="wckappa"*) parameter real WCKAPPA = 0.0; (*desc="Width dependence of cf" spice:name="wcf"*) parameter real WCF = 0.0; (*desc="Width dependence of clc" spice:name="wclc"*) parameter real WCLC = 0.0; (*desc="Width dependence of cle" spice:name="wcle"*) parameter real WCLE = 0.0; (*desc="Width dependence of alpha0" spice:name="walpha0"*) parameter real WALPHA0 = 0.0; (*desc="Width dependence of alpha1" spice:name="walpha1"*) parameter real WALPHA1 = 0.0; (*desc="Width dependence of beta0" spice:name="wbeta0"*) parameter real WBETA0 = 0.0; (*desc="Width dependence of vfbcv" spice:name="wvfbcv"*) parameter real WVFBCV = 0.0; (*desc="Width dependence of vfb" spice:name="wvfb"*) parameter real WVFB = 0.0; (*desc="Width dependence of acde" spice:name="wacde"*) parameter real WACDE = 0.0; (*desc="Width dependence of moin" spice:name="wmoin"*) parameter real WMOIN = 0.0; (*desc="Width dependence of noff" spice:name="wnoff"*) parameter real WNOFF = 0.0; (*desc="Width dependence of voffcv" spice:name="wvoffcv"*) parameter real WVOFFCV = 0.0; (*desc="Cross-term dependence of cdsc" spice:name="pcdsc"*) parameter real PCDSC = 0.0; (*desc="Cross-term dependence of cdscb" spice:name="pcdscb"*) parameter real PCDSCB = 0.0; (*desc="Cross-term dependence of cdscd" spice:name="pcdscd"*) parameter real PCDSCD = 0.0; (*desc="Cross-term dependence of cit" spice:name="pcit"*) parameter real PCIT = 0.0; (*desc="Cross-term dependence of nfactor" spice:name="pnfactor"*) parameter real PNFACTOR = 0.0; (*desc="Cross-term dependence of xj" spice:name="pxj"*) parameter real PXJ = 0.0; (*desc="Cross-term dependence of vsat" spice:name="pvsat"*) parameter real PVSAT = 0.0; (*desc="Cross-term dependence of at" spice:name="pat"*) parameter real PAT = 0.0; (*desc="Cross-term dependence of a0" spice:name="pa0"*) parameter real PA0 = 0.0; (*desc="Cross-term dependence of ags" spice:name="pags"*) parameter real PAGS = 0.0; (*desc="Cross-term dependence of a1" spice:name="pa1"*) parameter real PA1 = 0.0; (*desc="Cross-term dependence of a2" spice:name="pa2"*) parameter real PA2 = 0.0; (*desc="Cross-term dependence of keta" spice:name="pketa"*) parameter real PKETA = 0.0; (*desc="Cross-term dependence of nsub" spice:name="pnsub"*) parameter real PNSUB = 0.0; (*desc="Cross-term dependence of nch" spice:name="pnch"*) parameter real PNCH = 0.0; (*desc="Cross-term dependence of ngate" spice:name="pngate"*) parameter real PNGATE = 0.0; (*desc="Cross-term dependence of gamma1" spice:name="pgamma1"*) parameter real PGAMMA1 = `UNDEF(0.0); (*desc="Cross-term dependence of gamma2" spice:name="pgamma2"*) parameter real PGAMMA2 = `UNDEF(0.0); (*desc="Cross-term dependence of vbx" spice:name="pvbx"*) parameter real PVBX = `UNDEF(0.0); (*desc="Cross-term dependence of vbm" spice:name="pvbm"*) parameter real PVBM = 0.0; (*desc="Cross-term dependence of xt" spice:name="pxt"*) parameter real PXT = 0.0; (*desc="Cross-term dependence of k1" spice:name="pk1"*) parameter real PK1 = `UNDEF(0.0); (*desc="Cross-term dependence of kt1" spice:name="pkt1"*) parameter real PKT1 = 0.0; (*desc="Cross-term dependence of kt1l" spice:name="pkt1l"*) parameter real PKT1L = 0.0; (*desc="Cross-term dependence of kt2" spice:name="pkt2"*) parameter real PKT2 = 0.0; (*desc="Cross-term dependence of k2" spice:name="pk2"*) parameter real PK2 = `UNDEF(0.0); (*desc="Cross-term dependence of k3" spice:name="pk3"*) parameter real PK3 = 0.0; (*desc="Cross-term dependence of k3b" spice:name="pk3b"*) parameter real PK3B = 0.0; (*desc="Cross-term dependence of w0" spice:name="pw0"*) parameter real PW0 = 0.0; (*desc="Cross-term dependence of nlx" spice:name="pnlx"*) parameter real PNLX = 0.0; (*desc="Cross-term dependence of dvt0" spice:name="pdvt0"*) parameter real PDVT0 = 0.0; (*desc="Cross-term dependence of dvt1" spice:name="pdvt1"*) parameter real PDVT1 = 0.0; (*desc="Cross-term dependence of dvt2" spice:name="pdvt2"*) parameter real PDVT2 = 0.0; (*desc="Cross-term dependence of dvt0w" spice:name="pdvt0w"*) parameter real PDVT0W = 0.0; (*desc="Cross-term dependence of dvt1w" spice:name="pdvt1w"*) parameter real PDVT1W = 0.0; (*desc="Cross-term dependence of dvt2w" spice:name="pdvt2w"*) parameter real PDVT2W = 0.0; (*desc="Cross-term dependence of drout" spice:name="pdrout"*) parameter real PDROUT = 0.0; (*desc="Cross-term dependence of dsub" spice:name="pdsub"*) parameter real PDSUB = 0.0; (*desc="Cross-term dependence of vto" spice:name="pvth0"*) parameter real PVTH0 = 0.0; (*desc="Cross-term dependence of vto" spice:name="pvtho"*) parameter real PVTHO = 0.0; (*desc="Cross-term dependence of ua" spice:name="pua"*) parameter real PUA = 0.0; (*desc="Cross-term dependence of ua1" spice:name="pua1"*) parameter real PUA1 = 0.0; (*desc="Cross-term dependence of ub" spice:name="pub"*) parameter real PUB = 0.0; (*desc="Cross-term dependence of ub1" spice:name="pub1"*) parameter real PUB1 = 0.0; (*desc="Cross-term dependence of uc" spice:name="puc"*) parameter real PUC = 0.0; (*desc="Cross-term dependence of uc1" spice:name="puc1"*) parameter real PUC1 = 0.0; (*desc="Cross-term dependence of u0" spice:name="pu0"*) parameter real PU0 = 0.0; (*desc="Cross-term dependence of ute" spice:name="pute"*) parameter real PUTE = 0.0; (*desc="Cross-term dependence of voff" spice:name="pvoff"*) parameter real PVOFF = 0.0; (*desc="Cross-term dependence of elm" spice:name="pelm"*) parameter real PELM = 0.0; (*desc="Cross-term dependence of delta" spice:name="pdelta"*) parameter real PDELTA = 0.0; (*desc="Cross-term dependence of rdsw" spice:name="prdsw"*) parameter real PRDSW = 0.0; (*desc="Cross-term dependence of prwg" spice:name="pprwg"*) parameter real PPRWG = 0.0; (*desc="Cross-term dependence of prwb" spice:name="pprwb"*) parameter real PPRWB = 0.0; (*desc="Cross-term dependence of prt" spice:name="pprt"*) parameter real PPRT = 0.0; (*desc="Cross-term dependence of eta0" spice:name="peta0"*) parameter real PETA0 = 0.0; (*desc="Cross-term dependence of etab" spice:name="petab"*) parameter real PETAB = 0.0; (*desc="Cross-term dependence of pclm" spice:name="ppclm"*) parameter real PPCLM = 0.0; (*desc="Cross-term dependence of pdiblc1" spice:name="ppdiblc1"*) parameter real PPDIBLC1 = 0.0; (*desc="Cross-term dependence of pdiblc2" spice:name="ppdiblc2"*) parameter real PPDIBLC2 = 0.0; (*desc="Cross-term dependence of pdiblcb" spice:name="ppdiblcb"*) parameter real PPDIBLCB = 0.0; (*desc="Cross-term dependence of pscbe1" spice:name="ppscbe1"*) parameter real PPSCBE1 = 0.0; (*desc="Cross-term dependence of pscbe2" spice:name="ppscbe2"*) parameter real PPSCBE2 = 0.0; (*desc="Cross-term dependence of pvag" spice:name="ppvag"*) parameter real PPVAG = 0.0; (*desc="Cross-term dependence of wr" spice:name="pwr"*) parameter real PWR = 0.0; (*desc="Cross-term dependence of dwg" spice:name="pdwg"*) parameter real PDWG = 0.0; (*desc="Cross-term dependence of dwb" spice:name="pdwb"*) parameter real PDWB = 0.0; (*desc="Cross-term dependence of b0" spice:name="pb0"*) parameter real PB0 = 0.0; (*desc="Cross-term dependence of b1" spice:name="pb1"*) parameter real PB1 = 0.0; (*desc="Cross-term dependence of cgsl" spice:name="pcgsl"*) parameter real PCGSL = 0.0; (*desc="Cross-term dependence of cgdl" spice:name="pcgdl"*) parameter real PCGDL = 0.0; (*desc="Cross-term dependence of ckappa" spice:name="pckappa"*) parameter real PCKAPPA = 0.0; (*desc="Cross-term dependence of cf" spice:name="pcf"*) parameter real PCF = 0.0; (*desc="Cross-term dependence of clc" spice:name="pclc"*) parameter real PCLC = 0.0; (*desc="Cross-term dependence of cle" spice:name="pcle"*) parameter real PCLE = 0.0; (*desc="Cross-term dependence of alpha0" spice:name="palpha0"*) parameter real PALPHA0 = 0.0; (*desc="Cross-term dependence of alpha1" spice:name="palpha1"*) parameter real PALPHA1 = 0.0; (*desc="Cross-term dependence of beta0" spice:name="pbeta0"*) parameter real PBETA0 = 0.0; (*desc="Cross-term dependence of vfbcv" spice:name="pvfbcv"*) parameter real PVFBCV = 0.0; (*desc="Cross-term dependence of vfb" spice:name="pvfb"*) parameter real PVFB = 0.0; (*desc="Cross-term dependence of acde" spice:name="pacde"*) parameter real PACDE = 0.0; (*desc="Cross-term dependence of moin" spice:name="pmoin"*) parameter real PMOIN = 0.0; (*desc="Cross-term dependence of noff" spice:name="pnoff"*) parameter real PNOFF = 0.0; (*desc="Cross-term dependence of voffcv" spice:name="pvoffcv"*) parameter real PVOFFCV = 0.0; integer Fatal_Flag `P(ask="yes"); real tox , cox , vth00, vth0 , nch , ngate , uc , uc1 , u0 , tnom ; real dlcGiven , cgso , cgdo , cgbo ; real pdibl1 , pdibl2 , pdiblb ; real jctSatCurDensity ; real jctSidewallSatCurDensity ; real bulkJctPotential ; real jctEmissionCoeff ; real jctTempExponent ; real bulkJctBotGradingCoeff ; real sidewallJctPotential ; real bulkJctSideGradingCoeff ; real GatesidewallJctPotential ; real bulkJctGateSideGradingCoeff ; real unitAreaJctCap ; real unitAreaTempJctCap ; real unitLengthSidewallJctCap ; real unitLengthSidewallTempJctCap ; real unitLengthGateSidewallJctCap ; real unitLengthGateSidewallTempJctCap ; real cf ; real lnpeak , lngate , lvth0 ; real lpdibl1 , lpdibl2 , lpdiblb ; real wnpeak , wngate , wvth0 ; real wpdibl1 , wpdibl2 , wpdiblb ; real pnpeak , pngate , pvth0 ; real ppdibl1 , ppdibl2 , ppdiblb ; real myTemp , Tnom , TRatio , delTemp ; real vcrit , factor1 , Vtm0 , Eg0 , ni , vtm , Eg ; real T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 ; real evalT0 ; real evalT1 ; real evalT2 ; real evalT3 ; real evalT4 ; real evalT5 ; real evaltmp ; real evaltmp1 ; real evaltmp2 ; real evaltmp3 ; real jctTempSatCurDensity , jctSidewallTempSatCurDensity ; real PhiB , PhiBSW , PhiBSWG ; real Ldrn , Wdrn ; real tmp , tmp1 , tmp2 , tmp3 , tmp4 ; real dl , dlc , dw , dwc , leff , weff ; real leffCV , weffCV ; real Inv_L , Inv_W , Inv_LW ; real cdsc , cdscb , cdscd , cit , nfactor , xj ; real vsat , at , a0 , ags , a1 , a2 , keta , nsub ; real npeak ; real gamma1 , lgamma1 , wgamma1 , pgamma1 ; real gamma1Given , lgamma1Given , wgamma1Given , pgamma1Given ; real gamma2 , lgamma2 , wgamma2 , pgamma2 ; real gamma2Given , lgamma2Given , wgamma2Given , pgamma2Given ; real vbx , lvbx , wvbx , pvbx ; real vbxGiven , lvbxGiven , wvbxGiven , pvbxGiven ; real vfb , vfbGiven ; real k1 , lk1 , wk1 , pk1 ; real k1Given , lk1Given , wk1Given , pk1Given ; real k2 , lk2 , wk2 , pk2 ; real k2Given , lk2Given , wk2Given , pk2Given ; real vbm , xt , kt1 , kt1l , kt2 , k3 ; real k3b , w0 , nlx , dvt0 , dvt1 , dvt2 , dvt0w , dvt1w , dvt2w , drout ; real dsub , ua , ua1 , ub , ub1 , ute ; real voff , delta , rdsw , prwg , prwb , prt , eta0 , etab , pclm ; real pscbe1 , pscbe2 , pvag , wr , dwg , dwb , b0 , b1 ; real alpha0 , alpha1 , beta0 ; real elm , cgsl , cgdl , ckappa , clc , cle , vfbcv , acde , moin , noff_param , Noff2 , voffcv_param ; real abulkCVfactor , u0temp , vsattemp , rds0 , tconst ; real phi , sqrtPhi , phis3 , Xdep0 , sqrtXdep0 , litl , vbi , cdep0 , ldeb ; real nsubGiven , xtGiven , npeakGiven , vth0Given ; real vbsc , k1ox , k2ox , theta0vb0 , thetaRout , vfbzb ; real sheetResistance ; real sourceArea , drainArea ; real sourceSquares , drainSquares ; real sourcePerimeter , drainPerimeter ; real SourceSatCurrent , DrainSatCurrent ; real sourceConductance , drainConductance ; real Nvtm , vjsm , vjdm , IsEvjsm , IsEvjdm ; real vbs , vgs , vds , qdef ; real vbd , vgd , vgb ; // diode equations variables real gbs , cbs , evbs ; real gbd , cbd , evbd ; real mode , Vds , Vgs , Vbs ; real Vbseff , Phis , sqrtPhis , Xdep , V0 , lt1 , ltw ; real Leff , Vtm , Theta0 , thetavth , Delt_vth ; real temp , TempRatio , dDIBL_Sft_dVd , DIBL_Sft , Vth ; real n , Vgs_eff , Vgst , VgstNVt , ExpArg ; real Vgsteff , ExpVgst ; real Weff , Rds , Abulk0 , Abulk , Denomi , ueff , AbovVgst2Vtm ; real WVCox , WVCoxRds , Esat , EsatL , Lambda , Vgst2Vtm , Vdsat , vdsat ; real Vdseff , Vasat , diffVds , VACLM , VADIBL , Va , VASCBE ; real CoxWovL , beta , fgche1 , fgche2 , gche , Idl ; real Idsa , Ids , Isub , cdrain , csub ; real Irsource , Irdrain ; // Depletion capacitance related variables real czbd , czbs ; real czbdswg , czbdsw ; real czbsswg , czbssw ; real mj , mjsw , mjswg ; real qbs , capbs ; real qbd , capbd ; real arg , sarg ; // Charge model related variables real qgate , qdrn , qsrc , qbulk ; real Qgate , Qdrn , Qsrc , Qbulk ; real Vfb , CoxWL , Arg1 , qinv , Qac0 , Vfbeff ; real One_Third_CoxWL , Two_Third_CoxWL , AbulkCV ; real VdsatCV , Alphaz , VbseffCV , Qsub0 , qinoi , VdseffCV ; real Cox , V3 , Tox , Tox2 , LINK , V4 , Coxeff , CoxWLcen , Tcen , Ccen ; real QovCox , DeltaPhi ; // extrinsic capacitance related variables real cgso_param , cgdo_param , cgbo_param ; real qgso , qgdo ; real qgs , qgd , qgb ; // NQS model real sxpart, dxpart; real qcheq, qcdump , gtau_drift, gtau_diff, ScalingFactor, gtau; real cqcheq , cqdef ; real cqgate , cqdrn , cqbulk , cqsource ; analog begin `ifdef insideADMS @(initial_model) `else @(initial_step) `endif begin tox = TOX; cox = 3.453133e-11 / tox; ScalingFactor = 1.0e-9; if (!$given(NSUB)) begin nsub = 6.0e16; nsubGiven = 0; end else begin nsub = NSUB; nsubGiven = 1; end if (!$given(XT)) begin xt = 1.55e-7; xtGiven = 0; end else begin xt = XT; xtGiven = 1; end if (!$given(NCH)) begin npeak = 1.7e17; npeakGiven = 0; end else begin npeak = NCH; npeakGiven = 1; end if (!$given(GAMMA1)) begin gamma1 = 0.0; gamma1Given = 0; end else begin gamma1 = GAMMA1; gamma1Given = 1; end if (!$given(LGAMMA1)) begin lgamma1 = 0.0; lgamma1Given = 0; end else begin lgamma1 = LGAMMA1; lgamma1Given = 1; end if (!$given(WGAMMA1)) begin wgamma1 = 0.0; wgamma1Given = 0; end else begin wgamma1 = WGAMMA1; wgamma1Given = 1; end if (!$given(PGAMMA1)) begin pgamma1 = 0.0; pgamma1Given = 0; end else begin pgamma1 = PGAMMA1; pgamma1Given = 1; end if (!$given(GAMMA2)) begin gamma2 = 0.0; gamma2Given = 0; end else begin gamma2 = GAMMA2; gamma2Given = 1; end if (!$given(LGAMMA2)) begin lgamma2 = 0.0; lgamma2Given = 0; end else begin lgamma2 = LGAMMA2; lgamma2Given = 1; end if (!$given(WGAMMA2)) begin wgamma2 = 0.0; wgamma2Given = 0; end else begin wgamma2 = WGAMMA2; wgamma2Given = 1; end if (!$given(PGAMMA2)) begin pgamma2 = 0.0; pgamma2Given = 0; end else begin pgamma2 = PGAMMA2; pgamma2Given = 1; end if (!$given(VBX)) begin vbx = 0.0; vbxGiven = 0.0; end else begin vbx = VBX; vbxGiven = 1; end if (!$given(LVBX)) begin lvbx = 0.0; lvbxGiven = 0.0; end else begin lvbx = LVBX; lvbxGiven = 1; end if (!$given(WVBX)) begin wvbx = 0.0; wvbxGiven = 0.0; end else begin wvbx = WVBX; wvbxGiven = 1; end if (!$given(PVBX)) begin pvbx = 0.0; pvbxGiven = 0.0; end else begin pvbx = PVBX; pvbxGiven = 1; end if (!$given(VFB)) begin vfb = 0.0; vfbGiven = 0.0; end else begin vfb = VFB; vfbGiven = 1.0; end if (!$given(K1)) begin k1 = 0.0; k1Given = 0.0; end else begin k1 = K1; k1Given = 1.0; end if (!$given(LK1)) begin lk1 = 0.0; lk1Given = 0.0; end else begin lk1 = LK1; lk1Given = 1.0; end if (!$given(WK1)) begin wk1 = 0.0; wk1Given = 0.0; end else begin wk1 = WK1; wk1Given = 1.0; end if (!$given(PK1)) begin pk1 = 0.0; pk1Given = 0.0; end else begin pk1 = PK1; pk1Given = 1.0; end if (!$given(K2)) begin k2 = 0.0; k2Given = 0.0; end else begin k2 = K2; k2Given = 1.0; end if (!$given(LK2)) begin lk2 = 0.0; lk2Given = 0.0; end else begin lk2 = LK2; lk2Given = 1.0; end if (!$given(WK2)) begin wk2 = 0.0; wk2Given = 0.0; end else begin wk2 = WK2; wk2Given = 1.0; end if (!$given(PK2)) begin wk2 = 0.0; wk2Given = 0.0; end else begin wk2 = WK2; wk2Given = 1.0; end if (NCH > 1.0e20) npeak = npeak * 1.0e-6; else npeak = npeak; if (NGATE > 1.0e23) ngate = NGATE * 1.0e-6; else ngate = NGATE; // calculating ungiven parameters if ( (!$given(VTHO)) && (!$given(VTH0)) ) begin vth00 = (TYPE > 0.0) ? 0.7 : -0.7; vth0Given = 0; end else begin vth0Given = 1; if (VTH0 == -99) vth00 = VTHO; if (VTHO == -99) vth00 = VTH0; end if (!$given(UC) ) uc = (MOBMOD == 3) ? -0.0465 : -0.0465e-9; else uc = UC; if (!$given(UC1)) uc1 = (MOBMOD == 3) ? -0.056 : -0.056e-9; else uc1 = UC1; if (!$given(U0)) u0 = (TYPE == 1) ? 0.067 : 0.025; else u0 = U0; if (!$given(myTNOM)) tnom = 300.15; else tnom = myTNOM + 273.15; if (!$given(DLC)) begin dlcGiven = 0; dlc = LINT; end else begin dlcGiven = 1; dlc = DLC; end if (!$given(CGSO)) if ( dlcGiven && (dlc > 0.0) ) cgso_param = dlc * cox - CGSL; else cgso_param = 0.6 * XJ * cox; else cgso_param = CGSO; if (!$given(CGDO)) if ( dlcGiven && (dlc > 0.0) ) cgdo_param = dlc * cox - CGDL; else cgdo_param = 0.6 * XJ * cox; else cgdo_param = CGDO; if (!$given(CGBO)) cgbo_param = 2.0 * DWC * cox; else cgbo_param = CGBO; //LL pdibl1 = PDIBLC1; //LL pdibl2 = PDIBLC2; //LL pdiblb = PDIBLCB; jctSatCurDensity = JS; jctSidewallSatCurDensity = JSW; bulkJctPotential = PB; jctEmissionCoeff = NJ; jctTempExponent = XTI; bulkJctBotGradingCoeff = MJ; sidewallJctPotential = PBSW; bulkJctSideGradingCoeff = MJSW; GatesidewallJctPotential = PBSWG; bulkJctGateSideGradingCoeff = MJSWG; unitAreaJctCap = CJ; unitLengthSidewallJctCap = CJSW; unitLengthGateSidewallJctCap = CJSWG; sheetResistance = RSH; end //@(initial_model) `ifdef insideADMS @(initial_instance) `else @(initial_step) `endif begin drainSquares = NRD; sourceSquares = NRS; drainArea = AD; sourceArea = AS; drainPerimeter = PD; sourcePerimeter = PS; if (!$given(CF)) cf = 2.0 * `EPSOX / `PI * ln(1.0 + 0.4e-6 / tox); else cf = CF; // Channel length dependance parameters if (LNCH > 1.0e20) lnpeak = LNCH * 1.0e-6; else lnpeak = LNCH; if (LNGATE > 1.0e23) lngate = LNGATE * 1.0e-6; else lngate = LNGATE; if (LVTH0 != 0.0) lvth0 = LVTH0; if (LVTHO != 0.0) lvth0 = LVTHO; lpdibl1 = LPDIBLC1; lpdibl2 = LPDIBLC2; lpdiblb = LPDIBLCB; // Channel width dependance parameters if (WNCH > 1.0e20) wnpeak = WNCH * 1.0e-6; else wnpeak = WNCH; if (WNGATE > 1.0e23) wngate = WNGATE * 1.0e-6; else wngate = WNGATE; if (WVTH0 != 0.0) wvth0 = WVTH0; if (WVTHO != 0.0) wvth0 = WVTHO; wpdibl1 = WPDIBLC1; wpdibl2 = WPDIBLC2; wpdiblb = WPDIBLCB; // Cross-term dependence parameters if (PNCH > 1.0e20) pnpeak = PNCH * 1.0e-6; else pnpeak = PNCH; if (PNGATE > 1.0e20) pngate = PNGATE * 1.0e-6; else pngate = PNGATE; if (PVTH0 != 0.0) pvth0 = PVTH0; if (PVTHO != 0.0) pvth0 = PVTHO; //LL ppdibl1 = PPDIBLC1; //LL ppdibl2 = PPDIBLC2; //LL ppdiblb = PPDIBLCB; if (bulkJctPotential < 0.1) begin bulkJctPotential = 0.1; $strobe ("Given pb is less than 0.1. Pb is set to 0.1."); end if (sidewallJctPotential < 0.1) begin sidewallJctPotential = 0.1; $strobe ("Given pbsw is less than 0.1. Pbsw is set to 0.1."); end if (GatesidewallJctPotential < 0.1) begin GatesidewallJctPotential = 0.1; $strobe ("Given pbswg is less than 0.1. Pbswg is set to 0.1."); end myTemp = $temperature; Tnom = tnom; TRatio = myTemp / Tnom; vcrit = `CONSTvt0 * ln(`CONSTvt0 / (`CONSTroot2 * 1.0e-14)); factor1 = sqrt(`EPSSI / `EPSOX * tox); Vtm0 = `KboQ * Tnom; Eg0 = 1.16 - 7.02e-4 * Tnom * Tnom / (Tnom + 1108.0); ni = 1.45e10 * (Tnom / 300.15) * sqrt(Tnom / 300.15) * exp(21.5565981 - Eg0 / (2.0 * Vtm0)); vtm = `KboQ * myTemp; Eg = 1.16 - 7.02e-4 * myTemp * myTemp / (myTemp + 1108.0); if (myTemp != Tnom) begin T0 = Eg0 / Vtm0 - Eg / vtm + jctTempExponent * ln(myTemp / Tnom); T1 = exp(T0 / jctEmissionCoeff); jctTempSatCurDensity = jctSatCurDensity * T1; jctSidewallTempSatCurDensity = jctSidewallSatCurDensity * T1; end else begin jctTempSatCurDensity = jctSatCurDensity; jctSidewallTempSatCurDensity = jctSidewallSatCurDensity; end if (jctTempSatCurDensity < 0.0) jctTempSatCurDensity = 0.0; if (jctSidewallTempSatCurDensity < 0.0) jctSidewallTempSatCurDensity = 0.0; /* Temperature dependence of D/B and S/B diode capacitance */ delTemp = $temperature - tnom; T0 = TCJ * delTemp; if (T0 >= -1.0) begin if (VERSION == 3.24) unitAreaTempJctCap = unitAreaJctCap * (1.0 + T0); else unitAreaJctCap = unitAreaJctCap * (1.0 + T0); end else if (unitAreaJctCap > 0.0) begin if (VERSION == 3.24) unitAreaTempJctCap = 0.0; else unitAreaJctCap = 0.0; $strobe ("Temperature effect has caused cj to be negative. Cj is clamped to zero."); end T0 = TCJSW * delTemp; if (T0 >= -1.0) begin if (VERSION == 3.24) unitLengthSidewallTempJctCap = unitLengthSidewallJctCap * (1.0 + T0); else unitLengthSidewallJctCap = unitLengthSidewallJctCap * (1.0 + T0); end else if (unitLengthSidewallJctCap > 0.0) begin if (VERSION == 3.24) unitLengthSidewallTempJctCap = 0.0; else unitLengthSidewallJctCap = 0.0; $strobe ("Temperature effect has caused cjsw to be negative. Cjsw is clamped to zero."); end T0 = TCJSWG * delTemp; if (T0 >= -1.0) begin if (VERSION == 3.24) unitLengthGateSidewallTempJctCap = unitLengthGateSidewallJctCap * (1.0 + T0); else unitLengthGateSidewallJctCap = unitLengthGateSidewallJctCap * (1.0 + T0); end else if (unitLengthGateSidewallJctCap > 0.0) begin if (VERSION == 3.24) unitLengthGateSidewallTempJctCap = 0.0; else unitLengthGateSidewallJctCap = 0.0; $strobe ("Temperature effect has caused cjswg to be negative. Cjswg is clamped to zero."); end PhiB = bulkJctPotential - TPB * delTemp; if (PhiB < 0.01) begin PhiB = 0.01; $strobe ("Temperature effect has caused pb to be less than 0.01. Pb is clamped to 0.01."); end PhiBSW = sidewallJctPotential - TPBSW * delTemp; if (PhiBSW <= 0.01) begin PhiBSW = 0.01; $strobe ("Temperature effect has caused pbsw to be less than 0.01. Pbsw is clamped to 0.01."); end PhiBSWG = GatesidewallJctPotential - TPBSWG * delTemp; if (PhiBSWG <= 0.01) begin PhiBSWG = 0.01; $strobe ("Temperature effect has caused pbswg to be less than 0.01. Pbswg is clamped to 0.01."); end /* End of junction capacitance */ /*** Effective channel length and width calculation ***/ Ldrn = L; Wdrn = W; T0 = pow(Ldrn, LLN); T1 = pow(Wdrn, LWN); tmp1 = LL / T0 + LW / T1 + LWL / (T0 * T1); dl = LINT + tmp1; tmp2 = LLC / T0 + LWC / T1 + LWLC / (T0 * T1); dlc = dlc + tmp2; T2 = pow(Ldrn, WLN); T3 = pow(Wdrn, WWN); tmp1 = WL / T2 + WW / T3 + WWL / (T2 * T3); dw = WINT + tmp1; tmp2 = WLC / T2 + WWC / T3 + WWLC / (T2 * T3); dwc = DWC + tmp2; leff = L - 2.0 * dl; if (leff <= 0.0) begin $strobe ("BSIM3: device %m: Effective channel length <= 0"); $finish(1); end weff = W - 2.0 * dw; if (leff <= 0.0) begin $strobe ("BSIM3: device %m: Effective channel width <= 0"); $finish(1); end leffCV = L - 2.0 * dlc; if (leffCV <= 0.0) begin $strobe ("BSIM3: device %m: Effective channel length for C-V <= 0"); $finish(1); end weffCV = W - 2.0 * dwc; if (weffCV <= 0.0) begin $strobe ("BSIM3: device %m: Effective channel width for C-V <= 0"); $finish(1); end if (BINUNIT == 1) begin Inv_L = 1.0e-6 / leff; Inv_W = 1.0e-6 / weff; Inv_LW = 1.0e-12 / (leff * weff); end else begin Inv_L = 1.0 / leff; Inv_W = 1.0 / weff; Inv_LW = 1.0 / (leff * weff); end cdsc = CDSC + LCDSC * Inv_L + WCDSC * Inv_W + PCDSC * Inv_LW; cdscb = CDSCB + LCDSCB * Inv_L + WCDSCB * Inv_W + PCDSCB * Inv_LW; cdscd = CDSCD + LCDSCD * Inv_L + WCDSCD * Inv_W + PCDSCD * Inv_LW; cit = CIT + LCIT * Inv_L + WCIT * Inv_W + PCIT * Inv_LW; nfactor = NFACTOR + LNFACTOR * Inv_L + WNFACTOR * Inv_W + PNFACTOR * Inv_LW; xj = XJ + LXJ * Inv_L + WXJ * Inv_W + PXJ * Inv_LW; vsat = VSAT + LVSAT * Inv_L + WVSAT * Inv_W + PVSAT * Inv_LW; at = AT + LAT * Inv_L + WAT * Inv_W + PAT * Inv_LW; a0 = A0 + LA0 * Inv_L + WA0 * Inv_W + PA0 * Inv_LW; ags = AGS + LAGS * Inv_L + WAGS * Inv_W + PAGS * Inv_LW; a1 = A1 + LA1 * Inv_L + WA1 * Inv_W + PA1 * Inv_LW; a2 = A2 + LA2 * Inv_L + WA2 * Inv_W + PA2 * Inv_LW; keta = KETA + LKETA * Inv_L + WKETA * Inv_W + PKETA * Inv_LW; nsub = nsub + LNSUB * Inv_L + WNSUB * Inv_W + PNSUB * Inv_LW; npeak = npeak + lnpeak * Inv_L + wnpeak * Inv_W + pnpeak * Inv_LW; ngate = ngate + lngate * Inv_L + wngate * Inv_W + pngate * Inv_LW; gamma1 = gamma1 + lgamma1 * Inv_L + wgamma1 * Inv_W + pgamma1 * Inv_LW; gamma2 = gamma2 + lgamma2 * Inv_L + wgamma2 * Inv_W + pgamma2 * Inv_LW; vbx = vbx + lvbx * Inv_L + wvbx * Inv_W + pvbx * Inv_LW; vbm = VBM + LVBM * Inv_L + WVBM * Inv_W + PVBM * Inv_LW; xt = xt + LXT * Inv_L + WXT * Inv_W + PXT * Inv_LW; vfb = vfb + LVFB * Inv_L + WVFB * Inv_W + PVFB * Inv_LW; k1 = k1 + lk1 * Inv_L + wk1 * Inv_W + pk1 * Inv_LW; kt1 = KT1 + LKT1 * Inv_L + WKT1 * Inv_W + PKT1 * Inv_LW; kt1l = KT1L + LKT1L * Inv_L + WKT1L * Inv_W + PKT1L * Inv_LW; k2 = k2 + lk2 * Inv_L + wk2 * Inv_W + pk2 * Inv_LW; kt2 = KT2 + LKT2 * Inv_L + WKT2 * Inv_W + PKT2 * Inv_LW; k3 = K3 + LK3 * Inv_L + WK3 * Inv_W + PK3 * Inv_LW; k3b = K3B + LK3B * Inv_L + WK3B * Inv_W + PK3B * Inv_LW; w0 = W0 + LW0 * Inv_L + WW0 * Inv_W + PW0 * Inv_LW; nlx = NLX + LNLX * Inv_L + WNLX * Inv_W + PNLX * Inv_LW; dvt0 = DVT0 + LDVT0 * Inv_L + WDVT0 * Inv_W + PDVT0 * Inv_LW; dvt1 = DVT1 + LDVT1 * Inv_L + WDVT1 * Inv_W + PDVT1 * Inv_LW; dvt2 = DVT2 + LDVT2 * Inv_L + WDVT2 * Inv_W + PDVT2 * Inv_LW; dvt0w = DVT0W + LDVT0W * Inv_L + WDVT0W * Inv_W + PDVT0W * Inv_LW; dvt1w = DVT1W + LDVT1W * Inv_L + WDVT1W * Inv_W + PDVT1W * Inv_LW; dvt2w = DVT2W + LDVT2W * Inv_L + WDVT2W * Inv_W + PDVT2W * Inv_LW; drout = DROUT + LDROUT * Inv_L + WDROUT * Inv_W + PDROUT * Inv_LW; dsub = DSUB + LDSUB * Inv_L + WDSUB * Inv_W + PDSUB * Inv_LW; vth0 = vth00 + lvth0 * Inv_L + wvth0 * Inv_W + pvth0 * Inv_LW; ua = UA + LUA * Inv_L + WUA * Inv_W + PUA * Inv_LW; ua1 = UA1 + LUA1 * Inv_L + WUA1 * Inv_W + PUA1 * Inv_LW; ub = UB + LUB * Inv_L + WUB * Inv_W + PUB * Inv_LW; ub1 = UB1 + LUB1 * Inv_L + WUB1 * Inv_W + PUB1 * Inv_LW; uc = uc + LUC * Inv_L + WUC * Inv_W + PUC * Inv_LW; uc1 = uc1 + LUC1 * Inv_L + WUC1 * Inv_W + PUC1 * Inv_LW; u0 = u0 + LU0 * Inv_L + WU0 * Inv_W + PU0 * Inv_LW; ute = UTE + LUTE * Inv_L + WUTE * Inv_W + PUTE * Inv_LW; voff = VOFF + LVOFF * Inv_L + WVOFF * Inv_W + PVOFF * Inv_LW; delta = DELTA + LDELTA * Inv_L + WDELTA * Inv_W + PDELTA * Inv_LW; rdsw = RDSW + LRDSW * Inv_L + WRDSW * Inv_W + PRDSW * Inv_LW; prwg = PRWG + LPRWG * Inv_L + WPRWG * Inv_W + PPRWG * Inv_LW; prwb = PRWB + LPRWB * Inv_L + WPRWB * Inv_W + PPRWB * Inv_LW; prt = PRT + LPRT * Inv_L + WPRT * Inv_W + PPRT * Inv_LW; eta0 = ETA0 + LETA0 * Inv_L + WETA0 * Inv_W + PETA0 * Inv_LW; etab = ETAB + LETAB * Inv_L + WETAB * Inv_W + PETAB * Inv_LW; pclm = PCLM + LPCLM * Inv_L + WPCLM * Inv_W + PPCLM * Inv_LW; pdibl1 = PDIBLC1 + lpdibl1 * Inv_L + wpdibl1 * Inv_W + ppdibl1 * Inv_LW; pdibl2 = PDIBLC2 + lpdibl2 * Inv_L + wpdibl2 * Inv_W + ppdibl2 * Inv_LW; pdiblb = PDIBLCB + lpdiblb * Inv_L + wpdiblb * Inv_W + ppdiblb * Inv_LW; pscbe1 = PSCBE1 + LPSCBE1 * Inv_L + WPSCBE1 * Inv_W + PPSCBE1 * Inv_LW; pscbe2 = PSCBE2 + LPSCBE2 * Inv_L + WPSCBE2 * Inv_W + PPSCBE2 * Inv_LW; pvag = PVAG + LPVAG * Inv_L + WPVAG * Inv_W + PPVAG * Inv_LW; wr = WR + LWR * Inv_L + WWR * Inv_W + PWR * Inv_LW; dwg = DWG + LDWG * Inv_L + WDWG * Inv_W + PDWG * Inv_LW; dwb = DWB + LDWB * Inv_L + WDWB * Inv_W + PDWB * Inv_LW; b0 = B0 + LB0 * Inv_L + WB0 * Inv_W + PB0 * Inv_LW; b1 = B1 + LB1 * Inv_L + WB1 * Inv_W + PB1 * Inv_LW; alpha0 = ALPHA0 + LALPHA0 * Inv_L + WALPHA0 * Inv_W + PALPHA0 * Inv_LW; alpha1 = ALPHA1 + LALPHA1 * Inv_L + WALPHA1 * Inv_W + PALPHA1 * Inv_LW; beta0 = BETA0 + LBETA0 * Inv_L + WBETA0 * Inv_W + PBETA0 * Inv_LW; /* CV model */ elm = ELM + LELM * Inv_L + WELM * Inv_W + PELM * Inv_LW; cgsl = CGSL + LCGSL * Inv_L + WCGSL * Inv_W + PCGSL * Inv_LW; cgdl = CGDL + LCGDL * Inv_L + WCGDL * Inv_W + PCGDL * Inv_LW; ckappa = CKAPPA + LCKAPPA * Inv_L + WCKAPPA * Inv_W + PCKAPPA * Inv_LW; cf = cf + LCF * Inv_L + WCF * Inv_W + PCF * Inv_LW; clc = CLC + LCLC * Inv_L + WCLC * Inv_W + PCLC * Inv_LW; cle = CLE + LCLE * Inv_L + WCLE * Inv_W + PCLE * Inv_LW; vfbcv = VFBCV + LVFBCV * Inv_L + WVFBCV * Inv_W + PVFBCV * Inv_LW; acde = ACDE + LACDE * Inv_L + WACDE * Inv_W + PACDE * Inv_LW; moin = MOIN + LMOIN * Inv_L + WMOIN * Inv_W + PMOIN * Inv_LW; noff_param = NOFF + LNOFF * Inv_L + WNOFF * Inv_W + PNOFF * Inv_LW; voffcv_param = VOFFCV + LVOFFCV * Inv_L + WVOFFCV * Inv_W + PVOFFCV * Inv_LW; abulkCVfactor = 1.0 + pow((clc / leffCV), cle); T0 = (TRatio - 1.0); ua = ua + ua1 * T0; ub = ub + ub1 * T0; uc = uc + uc1 * T0; if (u0 > 1.0) u0 = u0 / 1.0e4; u0temp = u0 * pow(TRatio, ute); vsattemp = vsat - at * T0; rds0 = (rdsw + prt * T0) / pow(weff * 1E6, wr); // *** check model and instance parameters *** Fatal_Flag = 0; if (nlx < -leff) begin $strobe ("Fatal: Nlx = %g is less than -Leff.", nlx); Fatal_Flag = 1; end if (tox <= 0.0) begin $strobe ("Fatal: Tox = %g is not positive.", tox); Fatal_Flag = 1; end if (TOXM <= 0.0) begin $strobe ("Fatal: Toxm = %g is not positive.", TOXM); Fatal_Flag = 1; end if (npeak <= 0.0) begin $strobe ("Fatal: Nch = %g is not positive.", npeak); Fatal_Flag = 1; end if (nsub <= 0.0) begin $strobe ("Fatal: Nsub = %g is not positive.", nsub); Fatal_Flag = 1; end if (ngate < 0.0) begin $strobe ("Fatal: Ngate = %g Ngate is not positive.", ngate); Fatal_Flag = 1; end if (ngate > 1.0e25) begin $strobe ("Fatal: Ngate = %g Ngate is too high", ngate); Fatal_Flag = 1; end if (xj <= 0.0) begin $strobe ("Fatal: Xj = %g is not positive.", xj); Fatal_Flag = 1; end if (dvt1 < 0.0) begin $strobe ("Fatal: Dvt1 = %g is negative.", dvt1); Fatal_Flag = 1; end if (dvt1w < 0.0) begin $strobe ("Fatal: Dvt1w = %g is negative.", dvt1w); Fatal_Flag = 1; end if (w0 == -weff) begin $strobe ("Fatal: (W0 + Weff) = 0 causing divided-by-zero."); Fatal_Flag = 1; end if (dsub < 0.0) begin $strobe ("Fatal: Dsub = %g is negative.", dsub); Fatal_Flag = 1; end if (b1 == -weff) begin $strobe ("Fatal: (B1 + Weff) = 0 causing divided-by-zero."); Fatal_Flag = 1; end if (u0temp <= 0.0) begin $strobe ("Fatal: u0 at current temperature = %g is not positive.", u0temp); Fatal_Flag = 1; end /* Check delta parameter */ if (delta < 0.0) begin $strobe ("Fatal: Delta = %g is less than zero.", delta); Fatal_Flag = 1; end if (vsattemp <= 0.0) begin $strobe ("Fatal: Vsat at current temperature = %g is not positive.", vsattemp); Fatal_Flag = 1; end /* Check Rout parameters */ if (pclm <= 0.0) begin $strobe ("Fatal: Pclm = %g is not positive.", pclm); Fatal_Flag = 1; end if (drout < 0.0) begin $strobe ("Fatal: Drout = %g is negative.", drout); Fatal_Flag = 1; end if (pscbe2 <= 0.0) begin $strobe ("Warning: Pscbe2 = %g is not positive.", pscbe2); end if (unitLengthSidewallJctCap > 0.0 || unitLengthGateSidewallJctCap > 0.0) begin if (drainPerimeter < weff) begin $strobe ("Warning: Pd = %g is less than W.", drainPerimeter); end if (sourcePerimeter < weff) begin $strobe ("Warning: Ps = %g is less than W.", sourcePerimeter); end end if (noff_param < 0.1) $strobe ("Warning: Noff = %g is too small.", noff_param); if (noff_param > 4.0) $strobe ("Warning: Noff = %g is too large.", noff_param); if (voffcv_param < -0.5) $strobe ("Warning: Voffcv = %g is too small.", voffcv_param); if (voffcv_param > 0.5) $strobe ("Warning: Voffcv = %g is too large.", voffcv_param); if (IJTH < 0.0) begin $strobe ("Fatal: Ijth = %g cannot be negative.", IJTH); Fatal_Flag = 1; end /* Check capacitance parameters */ if (clc < 0.0) begin $strobe ("Fatal: Clc = %g is negative.", clc); Fatal_Flag = 1; end if (moin < 5.0) $strobe ("Warning: Moin = %g is too small.", moin); if (moin > 25.0) $strobe ("Warning: Moin = %g is too large.", moin); if (((acde < 0.4) && !(VERSION == 3.24)) || ((acde < 0.4) && (VERSION == 3.24) && (CAPMOD == 3.0))) $strobe ("Warning: Acde = %g is too small.", acde); if (((acde > 1.6) && !(VERSION == 3.24)) || ((acde > 1.6) && (VERSION == 3.24) && (CAPMOD == 3.0))) $strobe ("Warning: Acde = %g is too large.", acde); // *** end of parameters checking *** if (PARAMCHK ==1) begin /* Check L and W parameters */ if (leff <= 5.0e-8) $strobe ("Warning: Leff = %g may be too small.", leff); if (leffCV <= 5.0e-8) $strobe ("Warning: Leff for CV = %g may be too small.", leffCV); if (weff <= 1.0e-7) $strobe ("Warning: Weff = %g may be too small.", weff); if (weffCV <= 1.0e-7) $strobe ("Warning: Weff for CV = %g may be too small.", weffCV); /* Check threshold voltage parameters */ if (nlx < 0.0) $strobe ("Warning: Nlx = %g is negative.", nlx); if (tox < 1.0e-9) $strobe ("Warning: Tox = %g is less than 10A.", tox); if (npeak <= 1.0e15) $strobe ("Warning: Nch = %g may be too small.", npeak); else if (npeak >= 1.0e21) $strobe ("Warning: Nch = %g may be too large.", npeak); if (nsub <= 1.0e14) $strobe ("Warning: Nsub = %g may be too small.", nsub); else if (nsub >= 1.0e21) $strobe ("Warning: Nsub = %g may be too large.", nsub); if ((ngate > 0.0) && (ngate <= 1.0e18)) $strobe ("Warning: Ngate = %g is less than 1.E18cm^-3.", ngate); if (dvt0 < 0.0) $strobe ("Warning: Dvt0 = %g is negative.", dvt0); if (abs(1.0e-6 / (w0 + weff)) > 10.0) $strobe ("Warning: (W0 + Weff) may be too small."); /* Check subthreshold parameters */ if (nfactor < 0.0) $strobe ("Warning: Nfactor = %g is negative.", nfactor); if (cdsc < 0.0) $strobe ("Warning: Cdsc = %g is negative.", cdsc); if (cdscd < 0.0) $strobe ("Warning: Cdscd = %g is negative.", cdscd); /* Check DIBL parameters */ if (eta0 < 0.0) $strobe ("Warning: Eta0 = %g is negative.", eta0); /* Check Abulk parameters */ if (abs(1.0e-6 / (b1 + weff)) > 10.0) $strobe ("Warning: (B1 + Weff) may be too small."); /* Check Saturation parameters */ if (a2 < 0.01) begin $strobe ("Warning: A2 = %g is too small. Set to 0.01.", a2); a2 = 0.01; end else if (a2 > 1.0) begin $strobe ("Warning: A2 = %g is larger than 1. A2 is set to 1 and A1 is set to 0.", a2); a2 = 1.0; a1 = 0.0; end if (rdsw < 0.0) begin $strobe ("Warning: Rdsw = %g is negative. Set to zero.", rdsw); rdsw = 0.0; rds0 = 0.0; end else if ((rds0 > 0.0) && (rds0 < 0.001)) begin $strobe ("Warning: Rds at current temperature = %g is less than 0.001 ohm. Set to zero.", rds0); rds0 = 0.0; end if (vsattemp < 1.0e3) $strobe ("Warning: Vsat at current temperature = %g may be too small.", vsattemp); if (pdibl1 < 0.0) $strobe ("Warning: Pdibl1 = %g is negative.", pdibl1); if (pdibl2 < 0.0) $strobe ("Warning: Pdibl2 = %g is negative.", pdibl2); /* Check overlap capacitance parameters */ if (cgdo_param < 0.0) begin $strobe ("Warning: cgdo = %g is negative. Set to zero.", cgdo_param); cgdo_param = 0.0; end if (cgso_param < 0.0) begin $strobe ("Warning: cgso = %g is negative. Set to zero.", cgso_param); cgso_param = 0.0; end if (cgbo_param < 0.0) begin $strobe ("Warning: cgbo = %g is negative. Set to zero.", cgbo_param); cgbo_param = 0.0; end end/* loop for the parameter check for warning messages */ if (Fatal_Flag) $finish(1); cgdo_param = (cgdo_param + cf) * weffCV; cgso_param = (cgso_param + cf) * weffCV; cgbo_param = cgbo_param * leffCV; T0 = leffCV * leffCV; tconst = u0temp * elm / (cox * weffCV * leffCV * T0); if ( !npeakGiven && gamma1Given ) begin T0 = gamma1 * cox; npeak = 3.021E22 * T0 * T0; end phi = 2.0 * Vtm0 * ln(npeak / ni); sqrtPhi = sqrt(phi); phis3 = sqrtPhi * phi; Xdep0 = sqrt(2.0 * `EPSSI / (`Charge_q * npeak * 1.0e6)) * sqrtPhi; sqrtXdep0 = sqrt(Xdep0); litl = sqrt(3.0 * xj * tox); vbi = Vtm0 * ln(1.0e20 * npeak / (ni * ni)); cdep0 = sqrt(`Charge_q * `EPSSI * npeak * 1.0e6 / 2.0 / phi); ldeb = sqrt(`EPSSI * Vtm0 / (`Charge_q * npeak * 1.0e6)) / 3.0; acde = acde * pow((npeak / 2.0e16), -0.25); if ( k1Given || k2Given ) begin if (!k1Given) begin $strobe ("Warning: k1 should be specified with k2."); k1 = 0.53; end if (!k2Given) begin $strobe ("Warning: k2 should be specified with k1."); k2 = -0.0186; end if (nsubGiven) $strobe ("Warning: nsub is ignored because k1 or k2 is given."); if (xtGiven) $strobe ("Warning: xt is ignored because k1 or k2 is given."); if (vbxGiven) $strobe ("Warning: vbx is ignored because k1 or k2 is given."); if (gamma1Given) $strobe ("Warning: gamma1 is ignored because k1 or k2 is given."); if (gamma2Given) $strobe ("Warning: gamma2 is ignored because k1 or k2 is given."); end else begin if (!vbxGiven) vbx = phi - 7.7348e-4 * npeak * xt * xt; if (vbx > 0.0) vbx = -vbx; if (vbm > 0.0) vbm = -vbm; if (!gamma1Given) gamma1 = 5.753e-12 * sqrt(npeak) / cox; if (!gamma2Given) gamma2 = 5.753e-12 * sqrt(nsub) / cox; T0 = gamma1 - gamma2; T1 = sqrt(phi - vbx) - sqrtPhi; T2 = sqrt(phi * (phi - vbm)) - phi; k2 = T0 * T1 / (2.0 * T2 + vbm); k1 = gamma2 - 2.0 * k2 * sqrt(phi - vbm); end if (k2 < 0.0) begin T0 = 0.5 * k1 / k2; vbsc = 0.9 * (phi - T0 * T0); if (vbsc > -3.0) vbsc = -3.0; else if (vbsc < -30.0) vbsc = -30.0; end else vbsc = -30.0; if (vbsc > vbm) vbsc = vbm; if (!vfbGiven) begin if (vth0Given) vfb = TYPE * vth0 - phi - k1 * sqrtPhi; else vfb = -1.0; end if (!vth0Given) vth0 = TYPE * (vfb + phi + k1 * sqrtPhi); k1ox = k1 * tox / TOXM; k2ox = k2 * tox / TOXM; T1 = sqrt(`EPSSI / `EPSOX * tox * Xdep0); T0 = exp(-0.5 * dsub * leff / T1); theta0vb0 = (T0 + 2.0 * T0 * T0); T0 = exp(-0.5 * drout * leff / T1); T2 = (T0 + 2.0 * T0 * T0); thetaRout = pdibl1 * T2 + pdibl2; /* vfbzb for capMod 1, 2 & 3 */ tmp = sqrt(Xdep0); tmp1 = vbi - phi; tmp2 = factor1 * tmp; T0 = -0.5 * dvt1w * weff * leff / tmp2; if (T0 > -`EXP_THRESHOLD) begin T1 = exp(T0); T2 = T1 * (1.0 + 2.0 * T1); end else begin T1 = `MIN_EXP; T2 = T1 * (1.0 + 2.0 * T1); end T0 = dvt0w * T2; T2 = T0 * tmp1; T0 = -0.5 * dvt1 * leff / tmp2; if (T0 > -`EXP_THRESHOLD) begin T1 = exp(T0); T3 = T1 * (1.0 + 2.0 * T1); end else begin T1 = `MIN_EXP; T3 = T1 * (1.0 + 2.0 * T1); end T3 = dvt0 * T3 * tmp1; T4 = tox * phi / (weff + w0); T0 = sqrt(1.0 + nlx / leff); T5 = k1ox * (T0 - 1.0) * sqrtPhi + (kt1 + kt1l / leff) * (TRatio - 1.0); tmp3 = TYPE * vth0 - T2 - T3 + k3 * T4 + T5; vfbzb = tmp3 - phi - k1 * sqrtPhi; // End of vfbzb calculation // process source/drain series resistance drainConductance = sheetResistance * drainSquares; if (drainConductance > 0.0) drainConductance = 1.0 / drainConductance; else drainConductance = 0.0; sourceConductance = sheetResistance * sourceSquares; if (sourceConductance > 0.0) sourceConductance = 1.0 / sourceConductance; else sourceConductance = 0.0; Nvtm = vtm * jctEmissionCoeff; if ((sourceArea <= 0.0) && (sourcePerimeter <= 0.0)) SourceSatCurrent = 1.0e-14; else SourceSatCurrent = sourceArea * jctTempSatCurDensity + sourcePerimeter * jctSidewallTempSatCurDensity; if ((SourceSatCurrent > 0.0) && (IJTH > 0.0)) begin vjsm = Nvtm * ln(IJTH / SourceSatCurrent + 1.0); if (VERSION == 3.24) IsEvjsm = SourceSatCurrent * exp(vjsm / Nvtm); end if ((drainArea <= 0.0) && (drainPerimeter <= 0.0)) DrainSatCurrent = 1.0e-14; else DrainSatCurrent = drainArea * jctTempSatCurDensity + drainPerimeter * jctSidewallTempSatCurDensity; if ((DrainSatCurrent > 0.0) && (IJTH > 0.0)) begin vjdm = Nvtm * ln(IJTH / DrainSatCurrent + 1.0); if (VERSION == 3.24) IsEvjdm = DrainSatCurrent * exp(vjdm / Nvtm); end end //@(initial_instance) //*********************************// //****** End of initial_step ******// //*********************************// vbs = TYPE * V(bulk, sourcep); vgs = TYPE * V(gate, sourcep); vds = TYPE * V(drainp, sourcep); `ifdef NQSMOD qdef = TYPE * V(q); `endif vbd = vbs - vds; vgd = vgs - vds; vgb = vgs - vbs; temp = $temperature; // Source/drain junction diode DC model begins if (SourceSatCurrent <= 0.0) begin gbs = GMIN; cbs = gbs * vbs; end else begin if (IJTH == 0.0) begin evbs = exp(vbs / Nvtm); gbs = SourceSatCurrent * evbs / Nvtm + GMIN; cbs = SourceSatCurrent * (evbs - 1.0) + GMIN * vbs; end else begin if (vbs < vjsm) begin evbs = exp(vbs / Nvtm); gbs = SourceSatCurrent * evbs / Nvtm + GMIN; cbs = SourceSatCurrent * (evbs - 1.0) + GMIN * vbs; end else begin if (VERSION == 3.24) begin evalT0 = IsEvjsm / Nvtm; cbs = IsEvjsm - SourceSatCurrent + GMIN * vbs + evalT0 * (vbs - vjsm); end else begin evalT0 = (SourceSatCurrent + IJTH) / Nvtm; cbs = IJTH + GMIN * vbs + evalT0 * (vbs - vjsm); end gbs = evalT0 + GMIN; end end end if (DrainSatCurrent <= 0.0) begin gbd = GMIN; cbd = gbd * vbd; end else begin if (IJTH == 0.0) begin evbd = exp(vbd / Nvtm); gbd = DrainSatCurrent * evbd / Nvtm + GMIN; cbd = DrainSatCurrent * (evbd - 1.0) + GMIN * vbd; end else begin if (vbd < vjdm) begin evbd = exp(vbd / Nvtm); gbd = DrainSatCurrent * evbd / Nvtm + GMIN; cbd = DrainSatCurrent * (evbd - 1.0) + GMIN * vbd; end else begin if (VERSION == 3.24) begin evalT0 = IsEvjdm / Nvtm; cbd = IsEvjdm - DrainSatCurrent + GMIN * vbd + evalT0 * (vbd - vjdm); end else begin evalT0 = (DrainSatCurrent + IJTH) / Nvtm; cbd = IJTH + GMIN * vbd + evalT0 * (vbd - vjdm); end gbd = evalT0 + GMIN; end end end // End of diode DC model if (vds >= 0.0) begin /* normal mode */ mode = 1; Vds = vds; Vgs = vgs; Vbs = vbs; end else begin /* inverse mode */ mode = -1; Vds = -vds; Vgs = vgd; Vbs = vbd; end evalT0 = Vbs - vbsc - 0.001; evalT1 = sqrt(evalT0 * evalT0 - 0.004 * vbsc); Vbseff = vbsc + 0.5 * (evalT0 + evalT1); // Added to avoid the possible numerical problems due to computer accuracy. // (See comments for diffVds) if (Vbseff < Vbs) Vbseff = Vbs; if (Vbseff > 0.0) begin evalT0 = phi / (phi + Vbseff); Phis = phi * evalT0; sqrtPhis = phis3 / (phi + 0.5 * Vbseff); end else begin Phis = phi - Vbseff; sqrtPhis = sqrt(Phis); end Xdep = Xdep0 * sqrtPhis / sqrtPhi; Leff = leff; Vtm = vtm; /*** Vth Calculation ***/ evalT3 = sqrt(Xdep); V0 = vbi - phi; evalT0 = dvt2 * Vbseff; if (evalT0 >= - 0.5) begin evalT1 = 1.0 + evalT0; evalT2 = dvt2; end else /* Added to avoid any discontinuity problems caused by dvt2 */ begin evalT4 = 1.0 / (3.0 + 8.0 * evalT0); evalT1 = (1.0 + 3.0 * evalT0) * evalT4; evalT2 = dvt2 * evalT4 * evalT4; end lt1 = factor1 * evalT3 * evalT1; evalT0 = dvt2w * Vbseff; if (evalT0 >= - 0.5) begin evalT1 = 1.0 + evalT0; evalT2 = dvt2w; end else /* Added to avoid any discontinuity problems caused by dvt2w */ begin evalT4 = 1.0 / (3.0 + 8.0 * evalT0); evalT1 = (1.0 + 3.0 * evalT0) * evalT4; evalT2 = dvt2w * evalT4 * evalT4; end ltw = factor1 * evalT3 * evalT1; evalT0 = -0.5 * dvt1 * Leff / lt1; if (evalT0 > -`EXP_THRESHOLD) begin evalT1 = exp(evalT0); Theta0 = evalT1 * (1.0 + 2.0 * evalT1); end else begin evalT1 = `MIN_EXP; Theta0 = evalT1 * (1.0 + 2.0 * evalT1); end thetavth = dvt0 * Theta0; Delt_vth = thetavth * V0; evalT0 = -0.5 * dvt1w * weff * Leff / ltw; if (evalT0 > -`EXP_THRESHOLD) begin evalT1 = exp(evalT0); evalT2 = evalT1 * (1.0 + 2.0 * evalT1); end else begin evalT1 = `MIN_EXP; evalT2 = evalT1 * (1.0 + 2.0 * evalT1); end evalT0 = dvt0w * evalT2; evalT2 = evalT0 * V0; TempRatio = temp / tnom - 1.0; evalT0 = sqrt(1.0 + nlx / Leff); evalT1 = k1ox * (evalT0 - 1.0) * sqrtPhi + (kt1 + kt1l / Leff + kt2 * Vbseff) * TempRatio; evaltmp2 = tox *phi / (weff + w0); evalT3 = eta0 + etab * Vbseff; if (evalT3 < 1.0e-4) /* avoid discontinuity problems caused by etab */ begin T9 = 1.0 / (3.0 - 2.0e4 * evalT3); evalT3 = (2.0e-4 - evalT3) * T9; evalT4 = T9 * T9; end else evalT4 = 1.0; dDIBL_Sft_dVd = evalT3 * theta0vb0; DIBL_Sft = dDIBL_Sft_dVd * Vds; Vth = TYPE * vth0 - k1 * sqrtPhi + k1ox * sqrtPhis - k2ox * Vbseff - Delt_vth - T2 + (k3 + k3b * Vbseff) * evaltmp2 + evalT1 - DIBL_Sft; /*** end of Vth calculation ***/ /* Calculate n */ evaltmp2 = nfactor * `EPSSI / Xdep; evaltmp3 = cdsc + cdscb * Vbseff + cdscd * Vds; tmp4 = (evaltmp2 + evaltmp3 * Theta0 + cit) / cox; if (tmp4 >= -0.5) n = 1.0 + tmp4; else begin /* avoid discontinuity problems caused by tmp4 */ evalT0 = 1.0 / (3.0 + 8.0 * tmp4); n = (1.0 + 3.0 * tmp4) * evalT0; end /* Poly Gate Si Depletion Effect */ evalT0 = vfb + phi; if ((ngate > 1.0e18) && (ngate < 1.0e25) && (Vgs > evalT0)) begin /* added to avoid the problem caused by ngate */ evalT1 = 1.0e6 * `Charge_q * `EPSSI * ngate / (cox * cox); evalT4 = sqrt(1.0 + 2.0 * (Vgs - evalT0) / evalT1); evalT2 = evalT1 * (evalT4 - 1.0); evalT3 = 0.5 * evalT2 * evalT2 / evalT1; /* evalT3 = Vpoly */ T7 = 1.12 - evalT3 - 0.05; T6 = sqrt(T7 * T7 + 0.224); evalT5 = 1.12 - 0.5 * (T7 + T6); Vgs_eff = Vgs - evalT5; end else Vgs_eff = Vgs; Vgst = Vgs_eff - Vth; /* Effective Vgst (Vgsteff) Calculation */ T10 = 2.0 * n * Vtm; VgstNVt = Vgst / T10; ExpArg = (2.0 * voff - Vgst) / T10; /* MCJ: Very small Vgst */ if (VgstNVt > `EXP_THRESHOLD) begin Vgsteff = Vgst; end else if (ExpArg > `EXP_THRESHOLD) begin evalT0 = (Vgst - voff) / (n * Vtm); ExpVgst = exp(evalT0); Vgsteff = Vtm * cdep0 / cox * ExpVgst; end else begin ExpVgst = exp(VgstNVt); evalT1 = T10 * ln(1.0 + ExpVgst); evalT2 = 1.0 - T10 * (-cox / (Vtm * cdep0) * exp(ExpArg)); Vgsteff = evalT1 / evalT2; end /* Calculate Effective Channel Geometry */ T9 = sqrtPhis - sqrtPhi; Weff = weff - 2.0 * (dwg * Vgsteff + dwb * T9); if (Weff < 2.0e-8) /* to avoid the discontinuity problem due to Weff*/ begin evalT0 = 1.0 / (6.0e-8 - 2.0 * Weff); Weff = 2.0e-8 * (4.0e-8 - Weff) * evalT0; end evalT0 = prwg * Vgsteff + prwb * T9; if (evalT0 >= -0.9) Rds = rds0 * (1.0 + evalT0); else /* to avoid the discontinuity problem due to prwg and prwb*/ begin evalT1 = 1.0 / (17.0 + 20.0 * evalT0); Rds = rds0 * (0.8 + evalT0) * evalT1; end /* Calculate Abulk */ evalT1 = 0.5 * k1ox / sqrtPhis; T9 = sqrt(xj * Xdep); evaltmp1 = Leff + 2.0 * T9; evalT5 = Leff / evaltmp1; evaltmp2 = a0 * evalT5; evaltmp3 = weff + b1; tmp4 = b0 / evaltmp3; evalT2 = evaltmp2 + tmp4; T6 = evalT5 * evalT5; T7 = evalT5 * T6; Abulk0 = 1.0 + evalT1 * evalT2; T8 = ags * a0 * T7; Abulk = Abulk0 + (-evalT1 * T8) * Vgsteff; if (Abulk0 < 0.1) /* added to avoid the problems caused by Abulk0 */ begin T9 = 1.0 / (3.0 - 20.0 * Abulk0); Abulk0 = (0.2 - Abulk0) * T9; end if (Abulk < 0.1) /* added to avoid the problems caused by Abulk */ begin T9 = 1.0 / (3.0 - 20.0 * Abulk); Abulk = (0.2 - Abulk) * T9; end evalT2 = keta * Vbseff; if (evalT2 >= -0.9) evalT0 = 1.0 / (1.0 + evalT2); else /* added to avoid the problems caused by Keta */ begin evalT1 = 1.0 / (0.8 + evalT2); evalT0 = (17.0 + 20.0 * evalT2) * evalT1; end Abulk = evalT0 * Abulk; Abulk0 = evalT0 * Abulk0; /* Mobility calculation */ if (MOBMOD == 1) begin evalT0 = Vgsteff + Vth + Vth; evalT2 = ua + uc * Vbseff; evalT3 = evalT0 / tox; evalT5 = evalT3 * (evalT2 + ub * evalT3); end else if (MOBMOD == 2) evalT5 = Vgsteff / tox * (ua + uc * Vbseff + ub * Vgsteff / tox); else begin evalT0 = Vgsteff + Vth + Vth; evalT2 = 1.0 + uc * Vbseff; evalT3 = evalT0 / tox; evalT4 = evalT3 * (ua + ub * evalT3); evalT5 = evalT4 * evalT2; end if (evalT5 >= -0.8) Denomi = 1.0 + evalT5; else /* Added to avoid the discontinuity problem caused by ua and ub*/ Denomi = (0.6 + evalT5) * (1.0 / (7.0 + 10.0 * evalT5)); ueff = u0temp / Denomi; /* Saturation Drain Voltage Vdsat */ WVCox = Weff * vsattemp * cox; WVCoxRds = WVCox * Rds; Esat = 2.0 * vsattemp / ueff; EsatL = Esat * Leff; /* Sqrt() */ if (a1 == 0.0) Lambda = a2; else if (a1 > 0.0) /* Added to avoid the discontinuity problem caused by a1 and a2 (Lambda) */ begin evalT0 = 1.0 - a2; evalT1 = evalT0 - a1 * Vgsteff - 0.0001; evalT2 = sqrt(evalT1 * evalT1 + 0.0004 * evalT0); Lambda = a2 + evalT0 - 0.5 * (evalT1 + evalT2); end else begin evalT1 = a2 + a1 * Vgsteff - 0.0001; evalT2 = sqrt(evalT1 * evalT1 + 0.0004 * a2); Lambda = 0.5 * (evalT1 + evalT2); end Vgst2Vtm = Vgsteff + 2.0 * Vtm; if (VERSION == 3.24) AbovVgst2Vtm = Abulk / Vgst2Vtm; if ((Rds == 0.0) && (Lambda == 1.0)) begin evalT0 = 1.0 / (Abulk * EsatL + Vgst2Vtm); evaltmp1 = 0.0; evalT1 = evalT0 * evalT0; evalT2 = Vgst2Vtm * evalT0; evalT3 = EsatL * Vgst2Vtm; Vdsat = evalT3 * evalT0; end else begin T9 = Abulk * WVCoxRds; T7 = Vgst2Vtm * T9; T6 = Vgst2Vtm * WVCoxRds; evalT0 = 2.0 * Abulk * (T9 - 1.0 + 1.0 / Lambda); evalT1 = Vgst2Vtm * (2.0 / Lambda - 1.0) + Abulk * EsatL + 3.0 * T7; evalT2 = Vgst2Vtm * (EsatL + 2.0 * T6); evalT3 = sqrt(evalT1 * evalT1 - 2.0 * evalT0 * evalT2); Vdsat = (evalT1 - evalT3) / evalT0; end vdsat = Vdsat; /* Effective Vds (Vdseff) Calculation */ evalT1 = Vdsat - Vds - delta; evalT2 = sqrt(evalT1 * evalT1 + 4.0 * delta * Vdsat); Vdseff = Vdsat - 0.5 * (evalT1 + evalT2); if ((Vds == 0.0) && (VERSION == 3.24)) Vdseff = 0.0; /* Calculate VAsat */ tmp4 = 1.0 - 0.5 * Abulk * Vdsat / Vgst2Vtm; T9 = WVCoxRds * Vgsteff; evalT0 = EsatL + Vdsat + 2.0 * T9 * tmp4; T9 = WVCoxRds * Abulk; evalT1 = 2.0 / Lambda - 1.0 + T9; Vasat = evalT0 / evalT1; if (Vdseff > Vds) Vdseff = Vds; /* This code is added to fixed the problem caused by computer precision when Vds is very close to Vdseff. */ diffVds = Vds - Vdseff; /* Calculate VACLM */ if ((pclm > 0.0) && (diffVds > 1.0e-10)) begin evalT0 = 1.0 / (pclm * Abulk * litl); evalT2 = Vgsteff / EsatL; evalT1 = Leff * (Abulk + evalT2); T9 = evalT0 * evalT1; VACLM = T9 * diffVds; end else VACLM = `MAX_EXP; /* Calculate VADIBL */ if (thetaRout > 0.0) begin evalT0 = Vgst2Vtm * Abulk * Vdsat; evalT1 = Vgst2Vtm + (Abulk * Vdsat); VADIBL = (Vgst2Vtm - evalT0 / evalT1) / thetaRout; T7 = pdiblb * Vbseff; if (T7 >= -0.9) begin evalT3 = 1.0 / (1.0 + T7); VADIBL = evalT3 * VADIBL; end else /* Added to avoid the discontinuity problem caused by pdiblcb */ begin evalT4 = 1.0 / (0.8 + T7); evalT3 = (17.0 + 20.0 * T7) * evalT4; VADIBL = evalT3 * VADIBL; end end else VADIBL = `MAX_EXP; /* Calculate VA */ T9 = pvag / EsatL * Vgsteff; if (T9 > -0.9) evalT0 = 1.0 + T9; else /* Added to avoid the discontinuity problems caused by pvag */ evalT0 = (0.8 + T9) * 1.0 / (17.0 + 20.0 * T9); evalT1 = VACLM * VADIBL / (VACLM + VADIBL); Va = Vasat + evalT0 * evalT1; /* Calculate VASCBE */ if (pscbe2 > 0.0) begin if ( diffVds > (pscbe1 * litl / `EXP_THRESHOLD) ) VASCBE = Leff * exp(pscbe1 * litl / diffVds) / pscbe2; else VASCBE = `MAX_EXP * Leff / pscbe2; end else VASCBE = `MAX_EXP; /* Calculate Ids */ CoxWovL = cox * Weff / Leff; beta = ueff * CoxWovL; fgche1 = Vgsteff * (1.0 - 0.5 * Abulk * Vdseff / Vgst2Vtm); fgche2 = 1.0 + (Vdseff / EsatL); gche = beta * fgche1 / fgche2; Idl = gche * Vdseff / (1.0 + gche * Rds); Idsa = Idl * (1.0 + (diffVds / Va)); Ids = Idsa * (1.0 + (diffVds / VASCBE)); /* Substrate current begins */ evaltmp = alpha0 + alpha1 * Leff; if ((evaltmp <= 0.0) || (beta0 <= 0.0)) Isub = 0.0; else begin evalT2 = evaltmp / Leff; if (diffVds > beta0 / `EXP_THRESHOLD) evalT1 = evalT2 * diffVds * exp(-beta0 / diffVds); else evalT1 = evalT2 * `MIN_EXP * diffVds; Isub = evalT1 * Idsa; end cdrain = Ids; csub = Isub; // End of I-V model `define COMPUTE_CHARGE `ifdef COMPUTE_CHARGE // C-V model // *** Depletion capacitance calculation *** /* charge storage elements * bulk-drain and bulk-source depletion capacitances * czbd : zero bias drain junction capacitance * czbs : zero bias source junction capacitance * czbdsw: zero bias drain junction sidewall capacitance along field oxide * czbssw: zero bias source junction sidewall capacitance along field oxide * czbdswg: zero bias drain junction sidewall capacitance along gate side * czbsswg: zero bias source junction sidewall capacitance along gate side */ if (VERSION == 3.24) begin czbd = unitAreaTempJctCap * drainArea; czbs = unitAreaTempJctCap * sourceArea; end else begin czbd = unitAreaJctCap * drainArea; czbs = unitAreaJctCap * sourceArea; end if (drainPerimeter < weff) begin if (VERSION == 3.24) czbdswg = unitLengthGateSidewallTempJctCap * drainPerimeter; else czbdswg = unitLengthGateSidewallJctCap * drainPerimeter; czbdsw = 0.0; end else begin if (VERSION == 3.24) begin czbdsw = unitLengthSidewallTempJctCap * (drainPerimeter - weff); czbdswg = unitLengthGateSidewallTempJctCap * weff; end else begin czbdsw = unitLengthSidewallJctCap * (drainPerimeter - weff); czbdswg = unitLengthGateSidewallJctCap * weff; end end if (sourcePerimeter < weff) begin czbssw = 0.0; if (VERSION == 3.24) czbsswg = unitLengthGateSidewallTempJctCap * sourcePerimeter; else czbsswg = unitLengthGateSidewallJctCap * sourcePerimeter; end else begin if (VERSION == 3.24) begin czbssw = unitLengthSidewallTempJctCap * (sourcePerimeter - weff); czbsswg = unitLengthGateSidewallTempJctCap * weff; end else begin czbssw = unitLengthSidewallJctCap * (sourcePerimeter - weff); czbsswg = unitLengthGateSidewallJctCap * weff; end end mj = bulkJctBotGradingCoeff; mjsw = bulkJctSideGradingCoeff; mjswg = bulkJctGateSideGradingCoeff; qbs = 0.0; qbd = 0.0; /* Source Bulk Junction */ if (vbs == 0.0) begin qbs = 0.0; capbs = czbs + czbssw + czbsswg; end else if (vbs < 0.0) begin if (czbs > 0.0) begin arg = 1.0 - vbs / PhiB; if (mj == 0.5) sarg = 1.0 / sqrt(arg); else sarg = exp(-mj * ln(arg)); qbs = PhiB * czbs * (1.0 - arg * sarg) / (1.0 - mj); capbs = czbs * sarg; end else begin qbs = 0.0; capbs = 0.0; end // else: !if(czbs > 0.0) if (czbssw > 0.0) begin arg = 1.0 - vbs / PhiBSW; if (mjsw == 0.5) sarg = 1.0 / sqrt(arg); else sarg = exp(-mjsw * ln(arg)); qbs = qbs + PhiBSW * czbssw * (1.0 - arg * sarg) / (1.0 - mjsw); capbs = capbs + czbssw * sarg; end // if (czbssw > 0.0) if (czbsswg > 0.0) begin arg = 1.0 - vbs / PhiBSWG; if (mjswg == 0.5) sarg = 1.0 / sqrt(arg); else sarg = exp(-mjswg * ln(arg)); qbs = qbs + PhiBSWG * czbsswg * (1.0 - arg * sarg) / (1.0 - mjswg); capbs = capbs + czbsswg * sarg; end end else begin evalT0 = czbs + czbssw + czbsswg; evalT1 = vbs * (czbs * mj / PhiB + czbssw * mjsw / PhiBSW + czbsswg * mjswg / PhiBSWG); qbs = vbs * (evalT0 + 0.5 * evalT1); capbs = evalT0 + evalT1; end /* Drain Bulk Junction */ if (vbd == 0.0) begin qbd = 0.0; capbd = czbd + czbdsw + czbdswg; end else if (vbd < 0.0) begin if (czbd > 0.0) begin arg = 1.0 - vbd / PhiB; if (mj == 0.5) sarg = 1.0 / sqrt(arg); else sarg = exp(-mj * ln(arg)); qbd = PhiB * czbd * (1.0 - arg * sarg) / (1.0 - mj); capbd = czbd * sarg; end else begin qbd = 0.0; capbd = 0.0; end // else: !if(czbd > 0.0) if (czbdsw > 0.0) begin arg = 1.0 - vbd / PhiBSW; if (mjsw == 0.5) sarg = 1.0 / sqrt(arg); else sarg = exp(-mjsw * ln(arg)); qbd = qbd + PhiBSW * czbdsw * (1.0 - arg * sarg) / (1.0 - mjsw); capbd = capbd + czbdsw * sarg; end // if (czbdsw > 0.0) if (czbdswg > 0.0) begin arg = 1.0 - vbd / PhiBSWG; if (mjswg == 0.5) sarg = 1.0 / sqrt(arg); else sarg = exp(-mjswg * ln(arg)); qbd = qbd + PhiBSWG * czbdswg * (1.0 - arg * sarg) / (1.0 - mjswg); capbd = capbd + czbdswg * sarg; end end else begin evalT0 = czbd + czbdsw + czbdswg; evalT1 = vbd * (czbd * mj / PhiB + czbdsw * mjsw / PhiBSW + czbdswg * mjswg / PhiBSWG); qbd = vbd * (evalT0 + 0.5 * evalT1); capbd = evalT0 + evalT1; end // *** Intrinsic charge calculation *** // qdrn, qgate, qsrc, qbulk qgate = 0.0; qdrn = 0.0; qsrc = 0.0; qbulk = 0.0; if (XPART < 0) begin qgate = 0.0; qdrn = 0.0; qsrc = 0.0; qbulk = 0.0; gtau = 0.0; end else if (CAPMOD == 0) begin if (Vbseff < 0.0) Vbseff = Vbs; else Vbseff = phi - Phis; Vfb = vfbcv; Vth = Vfb + phi + k1ox * sqrtPhis; Vgst = Vgs_eff - Vth; CoxWL = cox * weffCV * leffCV; Arg1 = Vgs_eff - Vbseff - Vfb; if (Arg1 <= 0.0) begin qgate = CoxWL * Arg1; qbulk = -qgate; qdrn = 0.0; qinv = 0.0; end else if (Vgst <= 0.0) begin evalT1 = 0.5 * k1ox; evalT2 = sqrt(evalT1 * evalT1 + Arg1); qgate = CoxWL * k1ox * (evalT2 - evalT1); qbulk = -qgate; qdrn = 0.0; qinv = 0.0; end else begin One_Third_CoxWL = CoxWL / 3.0; Two_Third_CoxWL = 2.0 * One_Third_CoxWL; AbulkCV = Abulk0 * abulkCVfactor; Vdsat = Vgst / AbulkCV; if (XPART > 0.5) begin /* 0/100 Charge partition model */ if (Vdsat <= Vds) begin /* saturation region */ evalT1 = Vdsat / 3.0; qgate = CoxWL * (Vgs_eff - Vfb - phi - evalT1); evalT2 = -Two_Third_CoxWL * Vgst; qbulk = -(qgate + evalT2); qdrn = 0.0; qinv = -(qgate + qbulk); end else begin /* linear region */ Alphaz = Vgst / Vdsat; evalT1 = 2.0 * Vdsat - Vds; evalT2 = Vds / (3.0 * evalT1); evalT3 = evalT2 * Vds; T9 = 0.25 * CoxWL; evalT4 = T9 * Alphaz; T7 = 2.0 * Vds - evalT1 - 3.0 * evalT3; T8 = evalT3 - evalT1 - 2.0 * Vds; qgate = CoxWL * (Vgs_eff - Vfb - phi - 0.5 * (Vds - evalT3)); T10 = evalT4 * T8; qdrn = evalT4 * T7; qbulk = -(qgate + qdrn + T10); qinv = -(qgate + qbulk); end end // if (XPART > 0.5) else if (XPART < 0.5) begin /* 40/60 Charge partition model */ if (Vds >= Vdsat) begin /* saturation region */ evalT1 = Vdsat / 3.0; qgate = CoxWL * (Vgs_eff - Vfb - phi - evalT1); evalT2 = -Two_Third_CoxWL * Vgst; qbulk = -(qgate + evalT2); qdrn = 0.4 * evalT2; qinv = -(qgate + qbulk); end else begin /* linear region */ Alphaz = Vgst / Vdsat; evalT1 = 2.0 * Vdsat - Vds; evalT2 = Vds / (3.0 * evalT1); evalT3 = evalT2 * Vds; T9 = 0.25 * CoxWL; evalT4 = T9 * Alphaz; qgate = CoxWL * (Vgs_eff - Vfb - phi - 0.5 * (Vds - evalT3)); T6 = 8.0 * Vdsat * Vdsat - 6.0 * Vdsat * Vds + 1.2 * Vds * Vds; T8 = evalT2 / evalT1; T7 = Vds - evalT1 - T8 * T6; qdrn = evalT4 * T7; T7 = 2.0 * (evalT1 + evalT3); qbulk = -(qgate - evalT4 * T7); qinv = -(qgate + qbulk); end // else: !if(Vds >= Vdsat) end // if (XPART < 0.5) else begin /* 50/50 partitioning */ if (Vds >= Vdsat) begin /* saturation region */ evalT1 = Vdsat / 3.0; qgate = CoxWL * (Vgs_eff - Vfb - phi - evalT1); evalT2 = -Two_Third_CoxWL * Vgst; qbulk = -(qgate + evalT2); qdrn = 0.5 * evalT2; qinv = -(qgate + qbulk); end else begin /* linear region */ Alphaz = Vgst / Vdsat; evalT1 = 2.0 * Vdsat - Vds; evalT2 = Vds / (3.0 * evalT1); evalT3 = evalT2 * Vds; T9 = 0.25 * CoxWL; evalT4 = T9 * Alphaz; qgate = CoxWL * (Vgs_eff - Vfb - phi - 0.5 * (Vds - evalT3)); T7 = evalT1 + evalT3; qdrn = -evalT4 * T7; qbulk = - (qgate + qdrn + qdrn); qinv = -(qgate + qbulk); end end end end else begin if (Vbseff < 0.0) VbseffCV = Vbseff; else VbseffCV = phi - Phis; CoxWL = cox * weffCV * leffCV; /* Seperate VgsteffCV with noff and voffcv */ Noff2 = n * noff_param; evalT0 = Vtm * Noff2; VgstNVt = (Vgst - voffcv_param) / evalT0; if (VgstNVt > `EXP_THRESHOLD) Vgsteff = Vgst - voffcv_param; else if (VgstNVt < -`EXP_THRESHOLD) Vgsteff = evalT0 * ln(1.0 + `MIN_EXP); else begin ExpVgst = exp(VgstNVt); Vgsteff = evalT0 * ln(1.0 + ExpVgst); end /* End of VgsteffCV - Weidong 5/1998 */ if (CAPMOD == 1) begin if (VERSION < 3.2) Vfb = Vth - phi - k1ox * sqrtPhis; else Vfb = vfbzb; Arg1 = Vgs_eff - VbseffCV - Vfb - Vgsteff; if (Arg1 <= 0.0) qgate = CoxWL * Arg1; else begin evalT0 = 0.5 * k1ox; evalT1 = sqrt(evalT0 * evalT0 + Arg1); qgate = CoxWL * k1ox * (evalT1 - evalT0); end qbulk = -qgate; One_Third_CoxWL = CoxWL / 3.0; Two_Third_CoxWL = 2.0 * One_Third_CoxWL; AbulkCV = Abulk0 * abulkCVfactor; VdsatCV = Vgsteff / AbulkCV; if (VdsatCV < Vds) begin evalT0 = Vgsteff - VdsatCV / 3.0; qgate = qgate + CoxWL * evalT0; evalT0 = VdsatCV - Vgsteff; qbulk = qbulk + One_Third_CoxWL * evalT0; if (XPART > 0.5) evalT0 = -Two_Third_CoxWL; else if (XPART < 0.5) evalT0 = -0.4 * CoxWL; else evalT0 = -One_Third_CoxWL; qsrc = evalT0 * Vgsteff; end else begin evalT0 = AbulkCV * Vds; evalT1 = 12.0 * (Vgsteff - 0.5 * evalT0 + 1.0e-20); evalT2 = Vds / evalT1; evalT3 = evalT0 * evalT2; qgate = qgate + CoxWL * (Vgsteff - 0.5 * Vds + evalT3); qbulk = qbulk + CoxWL * (1.0 - AbulkCV) * (0.5 * Vds - evalT3); if (XPART > 0.5) begin /* 0/100 Charge petition model */ qsrc = -CoxWL * (0.5 * Vgsteff + 0.25 * evalT0 - evalT0 * evalT0 / (evalT1 + evalT1)); end else if (XPART < 0.5) begin /* 40/60 Charge petition model */ evalT2 = 0.5 * CoxWL / (evalT1 / 12.0 * evalT1 / 12.0); evalT3 = Vgsteff * (2.0 * evalT0 * evalT0 / 3.0 + Vgsteff * (Vgsteff - 4.0 * evalT0 / 3.0)) - 2.0 * evalT0 * evalT0 * evalT0 / 15.0; qsrc = -evalT2 * evalT3; end else begin /* 50/50 Charge petition model */ qsrc = -0.5 * (qgate + qbulk); end end qdrn = -(qgate + qbulk + qsrc); qinv = -(qgate + qbulk); end // if (CAPMOD == 1) else if (CAPMOD == 2) begin if (VERSION < 3.2) Vfb = Vth - phi - k1ox * sqrtPhis; else Vfb = vfbzb; V3 = Vfb - Vgs_eff + VbseffCV - `DELTA_3; if (Vfb <= 0.0) begin evalT0 = sqrt(V3 * V3 - 4.0 * `DELTA_3 * Vfb); evalT2 = -`DELTA_3 / evalT0; end else begin evalT0 = sqrt(V3 * V3 + 4.0 * `DELTA_3 * Vfb); evalT2 = `DELTA_3 / evalT0; end evalT1 = 0.5 * (1.0 + V3 / evalT0); Vfbeff = Vfb - 0.5 * (V3 + evalT0); Qac0 = CoxWL * (Vfbeff - Vfb); evalT0 = 0.5 * k1ox; evalT3 = Vgs_eff - Vfbeff - VbseffCV - Vgsteff; if (k1ox == 0.0) begin evalT1 = 0.0; evalT2 = 0.0; end else if (evalT3 < 0.0) begin evalT1 = evalT0 + evalT3 / k1ox; evalT2 = CoxWL; end else begin evalT1 = sqrt(evalT0 * evalT0 + evalT3); evalT2 = CoxWL * evalT0 / evalT1; end Qsub0 = CoxWL * k1ox * (evalT1 - evalT0); AbulkCV = Abulk0 * abulkCVfactor; VdsatCV = Vgsteff / AbulkCV; V4 = VdsatCV - Vds - `DELTA_4; evalT0 = sqrt(V4 * V4 + 4.0 * `DELTA_4 * VdsatCV); VdseffCV = VdsatCV - 0.5 * (V4 + evalT0); /* Added to eliminate non-zero VdseffCV at Vds=0.0 */ if ((Vds == 0.0) && (VERSION == 3.24)) VdseffCV = 0.0; evalT0 = AbulkCV * VdseffCV; evalT1 = 12.0 * (Vgsteff - 0.5 * evalT0 + 1e-20); evalT2 = VdseffCV / evalT1; evalT3 = evalT0 * evalT2; evalT4 = (1.0 - 12.0 * evalT2 * evalT2 * AbulkCV); evalT5 = (6.0 * evalT0 * (4.0 * Vgsteff - evalT0) / (evalT1 * evalT1) - 0.5); T6 = 12.0 * evalT2 * evalT2 * Vgsteff; qinoi = -CoxWL * (Vgsteff - 0.5 * evalT0 + AbulkCV * evalT3); qgate = CoxWL * (Vgsteff - 0.5 * VdseffCV + evalT3); T7 = 1.0 - AbulkCV; qbulk = CoxWL * T7 * (0.5 * VdseffCV - evalT3); if (XPART > 0.5) begin /* 0/100 Charge petition model */ qsrc = -CoxWL * (0.5 * Vgsteff + 0.25 * evalT0 - evalT0 * evalT0 / (evalT1 + evalT1)); end else if (XPART < 0.5) begin /* 40/60 Charge petition model */ evalT2 = 0.5 * CoxWL / (evalT1 / 12.0 * evalT1 / 12.0); evalT3 = Vgsteff * (2.0 * evalT0 * evalT0 / 3.0 + Vgsteff * (Vgsteff - 4.0 * evalT0 / 3.0)) - 2.0 * evalT0 * evalT0 * evalT0 / 15.0; qsrc = -evalT2 * evalT3; end else begin /* 50/50 Charge petition model */ qsrc = -0.5 * (qgate + qbulk); end qgate = qgate + Qac0 + Qsub0; qbulk = qbulk - (Qac0 + Qsub0); qdrn = -(qgate + qbulk + qsrc); qinv = qinoi; end /* New Charge-Thickness capMod (CTM) begins - Weidong 7/1997 */ else if (CAPMOD == 3) begin V3 = vfbzb - Vgs_eff + VbseffCV - `DELTA_3; if (vfbzb <= 0.0) begin evalT0 = sqrt(V3 * V3 - 4.0 * `DELTA_3 * vfbzb); evalT2 = -`DELTA_3 / evalT0; end else begin evalT0 = sqrt(V3 * V3 + 4.0 * `DELTA_3 * vfbzb); evalT2 = `DELTA_3 / evalT0; end evalT1 = 0.5 * (1.0 + V3 / evalT0); Vfbeff = vfbzb - 0.5 * (V3 + evalT0); Cox = cox; Tox = 1.0e8 * tox; evalT0 = (Vgs_eff - VbseffCV - vfbzb) / Tox; evaltmp = evalT0 * acde; if ((-`EXP_THRESHOLD < evaltmp) && (evaltmp < `EXP_THRESHOLD)) Tcen = ldeb * exp(evaltmp); else if (evaltmp <= -`EXP_THRESHOLD) Tcen = ldeb * `MIN_EXP; else Tcen = ldeb * `MAX_EXP; LINK = 1.0e-3 * tox; V3 = ldeb - Tcen - LINK; V4 = sqrt(V3 * V3 + 4.0 * LINK * ldeb); Tcen = ldeb - 0.5 * (V3 + V4); evalT1 = 0.5 * (1.0 + V3 / V4); Ccen = `EPSSI / Tcen; evalT2 = Cox / (Cox + Ccen); Coxeff = evalT2 * Ccen; evalT3 = -Ccen / Tcen; CoxWLcen = CoxWL * Coxeff / Cox; Qac0 = CoxWLcen * (Vfbeff - vfbzb); QovCox = Qac0 / Coxeff; evalT0 = 0.5 * k1ox; evalT3 = Vgs_eff - Vfbeff - VbseffCV - Vgsteff; if (k1ox == 0.0) begin evalT1 = 0.0; evalT2 = 0.0; end else if (evalT3 < 0.0) begin evalT1 = evalT0 + evalT3 / k1ox; evalT2 = CoxWLcen; end else begin evalT1 = sqrt(evalT0 * evalT0 + evalT3); evalT2 = CoxWLcen * evalT0 / evalT1; end Qsub0 = CoxWLcen * k1ox * (evalT1 - evalT0); QovCox = Qsub0 / Coxeff; /* Gate-bias dependent delta Phis begins */ if (k1ox <= 0.0) begin Denomi = 0.25 * moin * Vtm; evalT0 = 0.5 * sqrtPhi; end else begin Denomi = moin * Vtm * k1ox * k1ox; evalT0 = k1ox * sqrtPhi; end evalT1 = 2.0 * evalT0 + Vgsteff; DeltaPhi = Vtm * ln(1.0 + evalT1 * Vgsteff / Denomi); /* End of delta Phis */ evalT3 = 4.0 * (Vth - vfbzb - phi); Tox2 = Tox + Tox; if (evalT3 >= 0.0) evalT0 = (Vgsteff + evalT3) / Tox2; else evalT0 = (Vgsteff + 1.0e-20) / Tox2; evaltmp = exp(0.7 * ln(evalT0)); evalT1 = 1.0 + evaltmp; evalT2 = 0.7 * evaltmp / (evalT0 * Tox2); Tcen = 1.9e-9 / evalT1; Ccen = `EPSSI / Tcen; evalT0 = Cox / (Cox + Ccen); Coxeff = evalT0 * Ccen; evalT1 = -Ccen / Tcen; CoxWLcen = CoxWL * Coxeff / Cox; AbulkCV = Abulk0 * abulkCVfactor; VdsatCV = (Vgsteff - DeltaPhi) / AbulkCV; V4 = VdsatCV - Vds - `DELTA_4; evalT0 = sqrt(V4 * V4 + 4.0 * `DELTA_4 * VdsatCV); VdseffCV = VdsatCV - 0.5 * (V4 + evalT0); evalT1 = 0.5 * (1.0 + V4 / evalT0); evalT2 = `DELTA_4 / evalT0; evalT3 = (1.0 - evalT1 - evalT2) / AbulkCV; if ((Vds == 0.0) && (VERSION == 3.24)) VdseffCV = 0.0; evalT0 = AbulkCV * VdseffCV; evalT1 = Vgsteff - DeltaPhi; evalT2 = 12.0 * (evalT1 - 0.5 * evalT0 + 1.0e-20); evalT3 = evalT0 / evalT2; evalT4 = 1.0 - 12.0 * evalT3 * evalT3; evalT5 = AbulkCV * (6.0 * evalT0 * (4.0 * evalT1 - evalT0) / (evalT2 * evalT2) - 0.5); T6 = evalT5 * VdseffCV / AbulkCV; qinoi = CoxWLcen * (evalT1 - evalT0 * (0.5 - evalT3)); qgate = qinoi; QovCox = qgate / Coxeff; T7 = 1.0 - AbulkCV; qbulk = CoxWLcen * T7 * (0.5 * VdseffCV - evalT0 * VdseffCV / evalT2); QovCox = qbulk / Coxeff; if (XPART > 0.5) begin /* 0/100 partition */ qsrc = -CoxWLcen * (evalT1 / 2.0 + evalT0 / 4.0 - 0.5 * evalT0 * evalT0 / evalT2); QovCox = qsrc / Coxeff; end else if (XPART < 0.5) begin /* 40/60 partition */ evalT2 = evalT2 / 12.0; evalT3 = 0.5 * CoxWLcen / (evalT2 * evalT2); evalT4 = evalT1 * (2.0 * evalT0 * evalT0 / 3.0 + evalT1 * (evalT1 - 4.0 * evalT0 / 3.0)) - 2.0 * evalT0 * evalT0 * evalT0 / 15.0; qsrc = -evalT3 * evalT4; QovCox = qsrc / Coxeff; end else begin /* 50/50 partition */ qsrc = -0.5 * qgate; end qgate = qgate + Qac0 + Qsub0 - qbulk; qbulk = qbulk - (Qac0 + Qsub0); qdrn = -(qgate + qbulk + qsrc); qinv = -qinoi; end /* End of CTM */ end // *** end of intrinsic charge calculation *** qcheq = 0.0; /* NQS (Mansun 11/1993) modified by Weidong & Min-Chie 1997-1998 */ if (NQSMOD) begin qcheq = -(qbulk + qgate); gtau_drift = abs(tconst * qcheq) * ScalingFactor; gtau_diff = 16.0 * u0temp * vtm / (leffCV * leffCV) * ScalingFactor; gtau = gtau_drift + gtau_diff; end qgdo = 0.0; qgso = 0.0; // *** overlap capacitance charge calculation *** if (CAPMOD == 0.0) begin qgdo = cgdo_param * vgd; qgso = cgso_param * vgs; end else if (CAPMOD == 1.0) begin if (vgd < 0.0) begin evalT1 = sqrt(1.0 - 4.0 * vgd / ckappa); qgdo = cgdo_param * vgd - weffCV * 0.5 * cgdl * ckappa * (evalT1 - 1.0); end else begin qgdo = (weffCV * cgdl + cgdo_param) * vgd; end if (vgs < 0.0) begin evalT1 = sqrt(1.0 - 4.0 * vgs / ckappa); qgso = cgso_param * vgs - weffCV * 0.5 * cgsl * ckappa * (evalT1 - 1.0); end else begin qgso = (weffCV * cgsl + cgso_param) * vgs; end end else begin evalT0 = vgd + `DELTA_1; evalT1 = sqrt(evalT0 * evalT0 + 4.0 * `DELTA_1); evalT2 = 0.5 * (evalT0 - evalT1); evalT3 = weffCV * cgdl; evalT4 = sqrt(1.0 - 4.0 * evalT2 / ckappa); qgdo = (cgdo_param + evalT3) * vgd - evalT3 * (evalT2 + 0.5 * ckappa * (evalT4 - 1.0)); evalT0 = vgs + `DELTA_1; evalT1 = sqrt(evalT0 * evalT0 + 4.0 * `DELTA_1); evalT2 = 0.5 * (evalT0 - evalT1); evalT3 = weffCV * cgsl; evalT4 = sqrt(1.0 - 4.0 * evalT2 / ckappa); qgso = (cgso_param + evalT3) * vgs - evalT3 * (evalT2 + 0.5 * ckappa * (evalT4 - 1.0)); end // Add Overlap capacitance charges contribution to total node charge // according to mode and NQS model if (mode > 0) begin if (NQSMOD == 0) begin qgd = qgdo; qgs = qgso; qgb = cgbo_param * vgb; qgate = qgate + qgd + qgs + qgb; qbulk = qbulk - qgb; qdrn = qdrn - qgd; qsrc = -(qgate + qbulk + qdrn); sxpart = 0.6; dxpart = 0.4; end // if (NQSMOD == 0) else begin CoxWL = cox * weffCV * leffCV; if ( abs(qcheq) <= 1.0e-5 * CoxWL ) begin if (XPART < 0.5) dxpart = 0.4; else if (XPART > 0.5) dxpart = 0.0; else dxpart = 0.5; end else dxpart = qdrn / qcheq; sxpart = 1.0 - dxpart; qgd = qgdo; qgs = qgso; qgb = cgbo_param * vgb; qgate = qgd + qgs + qgb; qbulk = -qgb; qdrn = -qgd; qsrc = -(qgate + qbulk + qdrn); end end // if (mode > 0) else begin if (NQSMOD == 0) begin qgd = qgdo; qgs = qgso; qgb = cgbo_param * vgb; qgate = qgate + qgd + qgs + qgb; qbulk = qbulk - qgb; qsrc = qdrn - qgs; qdrn = -(qgate + qbulk + qsrc); sxpart = 0.4; dxpart = 0.6; end // if (NQSMOD == 0) else begin CoxWL = cox * weffCV * leffCV; if ( abs(qcheq) <= 1.0e-5 * CoxWL ) begin if (XPART < 0.5) sxpart = 0.4; else if (XPART > 0.5) sxpart = 0.0; else sxpart = 0.5; end else sxpart = qdrn / qcheq; dxpart = 1.0 - sxpart; qgd = qgdo; qgs = qgso; qgb = cgbo_param * vgb; qgate = qgd + qgs + qgb; qbulk = -qgb; qsrc = -qgs; qdrn = -(qgate + qbulk + qsrc); end end `ifdef NQSMOD if (NQSMOD) begin qcdump = qdef * ScalingFactor; cqdef = ddt(qcdump); cqcheq = ddt(qcheq); end `endif //if (analysis("static")) begin dxpart = (mode > 0) ? 0.4 : 0.6; sxpart = 1.0 - dxpart; if (NQSMOD) gtau = 16.0 * u0temp * vtm / leffCV / leffCV * ScalingFactor; else gtau = 0.0; end // Add depletion capacitance charge contribution Qdrn = qdrn - qbd; Qsrc = qsrc - qbs; Qbulk = qbulk + qbd + qbs; Qgate = qgate; `endif /*COMPUTE_CHARGE*/ if (mode > 0) begin cdrain = TYPE * cdrain; I(drainp, sourcep) <+ cdrain; cbd = TYPE * (cbd - csub); I(bulk, drainp) <+ cbd; cbs = TYPE * cbs; I(bulk, sourcep) <+ cbs; end else begin cdrain = TYPE * (-cdrain); I(drainp, sourcep) <+ cdrain; cbd = TYPE * cbd; I(bulk, drainp) <+ cbd; cbs = TYPE * (cbs - csub); I(bulk, sourcep) <+ cbs; end // Process drain/source resistance if ( drainConductance > 0.0 ) begin Irdrain = drainConductance * V(drain, drainp); I(drain, drainp) <+ Irdrain; end //else // V(drain, drainp) <+ 0.0; if ( sourceConductance > 0.0 ) begin Irsource = sourceConductance * V(source, sourcep); I(source, sourcep) <+ Irsource; end //else // V(source, sourcep) <+ 0.0; `ifdef COMPUTE_CHARGE // Charge current including overlap and depletion capacitance contribution cqgate = TYPE * (Qgate); cqdrn = TYPE * (Qdrn); cqbulk = TYPE * (Qbulk); cqsource = -(cqgate + cqdrn + cqbulk); I(gate) <+ ddt(cqgate); I(drainp) <+ ddt(cqdrn); I(bulk) <+ ddt(cqbulk); I(sourcep) <+ ddt(cqsource); `ifdef NQSMOD if (NQSMOD) begin I(gate) <+ TYPE * (-1) * qdef * gtau; I(drainp) <+ TYPE * dxpart * qdef * gtau; I(sourcep) <+ TYPE * sxpart * qdef * gtau; I(q) <+ -TYPE * ( cqdef - cqcheq ); I(q) <+ -V(q) * gtau; end else begin I(q) <+ GMIN * qdef; end `endif `endif /*COMPUTE_CHARGE*/ end // analog begin endmodule