From b5c7486d34a1a15a30314a7b681a87e796274873 Mon Sep 17 00:00:00 2001 From: pnenzi Date: Thu, 25 Sep 2003 09:08:55 +0000 Subject: [PATCH] Added dietmar's bsim3v3.2 enhanced model. --- src/spicelib/devices/bsim3/b3.c | 905 ++-- src/spicelib/devices/bsim3/b3acld.c | 777 ++-- src/spicelib/devices/bsim3/b3ask.c | 419 +- src/spicelib/devices/bsim3/b3check.c | 966 ++--- src/spicelib/devices/bsim3/b3cvtest.c | 194 +- src/spicelib/devices/bsim3/b3del.c | 51 +- src/spicelib/devices/bsim3/b3dest.c | 58 +- src/spicelib/devices/bsim3/b3getic.c | 73 +- src/spicelib/devices/bsim3/b3ld.c | 5366 +++++++++++------------- src/spicelib/devices/bsim3/b3mask.c | 2452 +++++------ src/spicelib/devices/bsim3/b3mdel.c | 71 +- src/spicelib/devices/bsim3/b3mpar.c | 62 +- src/spicelib/devices/bsim3/b3noi.c | 851 ++-- src/spicelib/devices/bsim3/b3par.c | 174 +- src/spicelib/devices/bsim3/b3pzld.c | 811 ++-- src/spicelib/devices/bsim3/b3set.c | 2046 +++++---- src/spicelib/devices/bsim3/b3temp.c | 2136 +++++----- src/spicelib/devices/bsim3/b3trunc.c | 56 +- src/spicelib/devices/bsim3/bsim3def.h | 55 +- src/spicelib/devices/bsim3/bsim3ext.h | 3 - src/spicelib/devices/bsim3/bsim3init.c | 10 +- 21 files changed, 8226 insertions(+), 9310 deletions(-) diff --git a/src/spicelib/devices/bsim3/b3.c b/src/spicelib/devices/bsim3/b3.c index 2cb56be5d..ac3a20508 100644 --- a/src/spicelib/devices/bsim3/b3.c +++ b/src/spicelib/devices/bsim3/b3.c @@ -1,488 +1,493 @@ +/**** BSIM3v3.2.4, Released by Xuemei Xi 12/14/2001 ****/ + /********** * Copyright 2001 Regents of the University of California. All rights reserved. * File: b3.c of BSIM3v3.2.4 * Author: 1995 Min-Chie Jeng and Mansun Chan * Author: 1997-1999 Weidong Liu. * Author: 2001 Xuemei Xi - * Modified by Paolo Nenzi 2002 + * Modified by Paolo Nenzi 2002 and Dietmar Warning 2003 **********/ -/* - * Release Notes: - * BSIM3v3.2.4, Released by Xuemei Xi 12/14/2001 - * BSIM3v3.2.3, Released by Xuemei Xi 10/05/2001 - * BSIM3v3.2.2, Released by Weidong Liu 04/20/1999 - * BSIM3v3.2, Released by Weidong Liu 06/16/1998 - */ - - -/*************************************/ - #include "ngspice.h" #include "devdefs.h" #include "bsim3def.h" #include "suffix.h" -IFparm BSIM3pTable[] = { /* parameters */ - IOP ("l", BSIM3_L, IF_REAL, "Length"), - IOP ("w", BSIM3_W, IF_REAL, "Width"), - IOP ("m", BSIM3_M, IF_REAL, "Parallel multiplier"), - IOP ("ad", BSIM3_AD, IF_REAL, "Drain area"), - IOP ("as", BSIM3_AS, IF_REAL, "Source area"), - IOP ("pd", BSIM3_PD, IF_REAL, "Drain perimeter"), - IOP ("ps", BSIM3_PS, IF_REAL, "Source perimeter"), - IOP ("nrd", BSIM3_NRD, IF_REAL, "Number of squares in drain"), - IOP ("nrs", BSIM3_NRS, IF_REAL, "Number of squares in source"), - IOP ("off", BSIM3_OFF, IF_FLAG, "Device is initially off"), - IOP ("nqsmod", BSIM3_NQSMOD, IF_INTEGER, - "Non-quasi-static model selector"), - IP ("ic", BSIM3_IC, IF_REALVEC, - "Vector of DS,GS,BS initial voltages"), - OP ("gmbs", BSIM3_GMBS, IF_REAL, "Gmb"), - OP ("gm", BSIM3_GM, IF_REAL, "Gm"), - OP ("gds", BSIM3_GDS, IF_REAL, "Gds"), - OP ("vdsat", BSIM3_VDSAT, IF_REAL, "Vdsat"), - OP ("vth", BSIM3_VON, IF_REAL, "Vth"), - OP ("id", BSIM3_CD, IF_REAL, "Ids"), - OP ("vbs", BSIM3_VBS, IF_REAL, "Vbs"), - OP ("vgs", BSIM3_VGS, IF_REAL, "Vgs"), - OP ("vds", BSIM3_VDS, IF_REAL, "Vds"), +IFparm BSIM3pTable[] = { /* parameters */ +IOP( "l", BSIM3_L, IF_REAL , "Length"), +IOP( "w", BSIM3_W, IF_REAL , "Width"), +IOP( "m", BSIM3_M, IF_REAL , "Parallel multiplier"), +IOP( "ad", BSIM3_AD, IF_REAL , "Drain area"), +IOP( "as", BSIM3_AS, IF_REAL , "Source area"), +IOP( "pd", BSIM3_PD, IF_REAL , "Drain perimeter"), +IOP( "ps", BSIM3_PS, IF_REAL , "Source perimeter"), +IOP( "nrd", BSIM3_NRD, IF_REAL , "Number of squares in drain"), +IOP( "nrs", BSIM3_NRS, IF_REAL , "Number of squares in source"), +IOP( "off", BSIM3_OFF, IF_FLAG , "Device is initially off"), +IOP( "nqsmod", BSIM3_NQSMOD, IF_INTEGER, "Non-quasi-static model selector"), +IP( "ic", BSIM3_IC, IF_REALVEC , "Vector of DS,GS,BS initial voltages"), +OP( "gmbs", BSIM3_GMBS, IF_REAL, "Gmb"), +OP( "gm", BSIM3_GM, IF_REAL, "Gm"), +OP( "gds", BSIM3_GDS, IF_REAL, "Gds"), +OP( "vdsat", BSIM3_VDSAT, IF_REAL, "Vdsat"), +OP( "vth", BSIM3_VON, IF_REAL, "Vth"), +OP( "id", BSIM3_CD, IF_REAL, "Ids"), +OP( "vbs", BSIM3_VBS, IF_REAL, "Vbs"), +OP( "vgs", BSIM3_VGS, IF_REAL, "Vgs"), +OP( "vds", BSIM3_VDS, IF_REAL, "Vds"), }; -IFparm BSIM3mPTable[] = { /* model parameters */ - IOP ("capmod", BSIM3_MOD_CAPMOD, IF_INTEGER,"Capacitance model selector"), - IOP ("mobmod", BSIM3_MOD_MOBMOD, IF_INTEGER,"Mobility model selector"), - IOP ("noimod", BSIM3_MOD_NOIMOD, IF_INTEGER, "Noise model selector"), - IOP ("paramchk", BSIM3_MOD_PARAMCHK, IF_INTEGER,"Model parameter checking selector"), - IOP ("binunit", BSIM3_MOD_BINUNIT, IF_INTEGER, "Bin unit selector"), - IOP ("version", BSIM3_MOD_VERSION, IF_STRING," parameter for model version"), - IOP ("tox", BSIM3_MOD_TOX, IF_REAL, "Gate oxide thickness in meters"), - IOP ("toxm", BSIM3_MOD_TOXM, IF_REAL,"Gate oxide thickness used in extraction"), - IOP ("cdsc", BSIM3_MOD_CDSC, IF_REAL,"Drain/Source and channel coupling capacitance"), - IOP ("cdscb", BSIM3_MOD_CDSCB, IF_REAL,"Body-bias dependence of cdsc"), - IOP ("cdscd", BSIM3_MOD_CDSCD, IF_REAL,"Drain-bias dependence of cdsc"), - IOP ("cit", BSIM3_MOD_CIT, IF_REAL, "Interface state capacitance"), - IOP ("nfactor", BSIM3_MOD_NFACTOR, IF_REAL,"Subthreshold swing Coefficient"), - IOP ("xj", BSIM3_MOD_XJ, IF_REAL, "Junction depth in meters"), - IOP ("vsat", BSIM3_MOD_VSAT, IF_REAL, "Saturation velocity at tnom"), - IOP ("at", BSIM3_MOD_AT, IF_REAL, "Temperature coefficient of vsat"), - IOP ("a0", BSIM3_MOD_A0, IF_REAL,"Non-uniform depletion width effect coefficient."), - IOP ("ags", BSIM3_MOD_AGS, IF_REAL,"Gate bias coefficient of Abulk."), - IOP ("a1", BSIM3_MOD_A1, IF_REAL,"Non-saturation effect coefficient"), - IOP ("a2", BSIM3_MOD_A2, IF_REAL,"Non-saturation effect coefficient"), - IOP ("keta", BSIM3_MOD_KETA, IF_REAL,"Body-bias coefficient of non-uniform depletion width effect."), - IOP ("nsub", BSIM3_MOD_NSUB, IF_REAL,"Substrate doping concentration"), - IOP ("nch", BSIM3_MOD_NPEAK, IF_REAL, "Channel doping concentration"), - IOP ("ngate", BSIM3_MOD_NGATE, IF_REAL,"Poly-gate doping concentration"), - IOP ("gamma1", BSIM3_MOD_GAMMA1, IF_REAL, "Vth body coefficient"), - IOP ("gamma2", BSIM3_MOD_GAMMA2, IF_REAL, "Vth body coefficient"), - IOP ("vbx", BSIM3_MOD_VBX, IF_REAL, "Vth transition body Voltage"), - IOP ("vbm", BSIM3_MOD_VBM, IF_REAL, "Maximum body voltage"), +IFparm BSIM3mPTable[] = { /* model parameters */ +IOP( "capmod", BSIM3_MOD_CAPMOD, IF_INTEGER, "Capacitance model selector"), +IOP( "mobmod", BSIM3_MOD_MOBMOD, IF_INTEGER, "Mobility model selector"), +IOP( "noimod", BSIM3_MOD_NOIMOD, IF_INTEGER, "Noise model selector"), +IOP( "acm", BSIM3_MOD_ACMMOD, IF_INTEGER, "Area calculation method selector"), +IOP( "paramchk", BSIM3_MOD_PARAMCHK, IF_INTEGER, "Model parameter checking selector"), +IOP( "binunit", BSIM3_MOD_BINUNIT, IF_INTEGER, "Bin unit selector"), +IOP( "version", BSIM3_MOD_VERSION, IF_STRING, " parameter for model version"), +IOP( "tox", BSIM3_MOD_TOX, IF_REAL, "Gate oxide thickness in meters"), + +IOP( "toxm", BSIM3_MOD_TOXM, IF_REAL, "Gate oxide thickness used in extraction"), +IOP( "cdsc", BSIM3_MOD_CDSC, IF_REAL, "Drain/Source and channel coupling capacitance"), +IOP( "cdscb", BSIM3_MOD_CDSCB, IF_REAL, "Body-bias dependence of cdsc"), +IOP( "cdscd", BSIM3_MOD_CDSCD, IF_REAL, "Drain-bias dependence of cdsc"), +IOP( "cit", BSIM3_MOD_CIT, IF_REAL, "Interface state capacitance"), +IOP( "nfactor", BSIM3_MOD_NFACTOR, IF_REAL, "Subthreshold swing Coefficient"), +IOP( "xj", BSIM3_MOD_XJ, IF_REAL, "Junction depth in meters"), +IOP( "vsat", BSIM3_MOD_VSAT, IF_REAL, "Saturation velocity at tnom"), +IOP( "at", BSIM3_MOD_AT, IF_REAL, "Temperature coefficient of vsat"), +IOP( "a0", BSIM3_MOD_A0, IF_REAL, "Non-uniform depletion width effect coefficient."), +IOP( "ags", BSIM3_MOD_AGS, IF_REAL, "Gate bias coefficient of Abulk."), +IOP( "a1", BSIM3_MOD_A1, IF_REAL, "Non-saturation effect coefficient"), +IOP( "a2", BSIM3_MOD_A2, IF_REAL, "Non-saturation effect coefficient"), +IOP( "keta", BSIM3_MOD_KETA, IF_REAL, "Body-bias coefficient of non-uniform depletion width effect."), +IOP( "nsub", BSIM3_MOD_NSUB, IF_REAL, "Substrate doping concentration"), +IOP( "nch", BSIM3_MOD_NPEAK, IF_REAL, "Channel doping concentration"), +IOP( "ngate", BSIM3_MOD_NGATE, IF_REAL, "Poly-gate doping concentration"), +IOP( "gamma1", BSIM3_MOD_GAMMA1, IF_REAL, "Vth body coefficient"), +IOP( "gamma2", BSIM3_MOD_GAMMA2, IF_REAL, "Vth body coefficient"), +IOP( "vbx", BSIM3_MOD_VBX, IF_REAL, "Vth transition body Voltage"), +IOP( "vbm", BSIM3_MOD_VBM, IF_REAL, "Maximum body voltage"), - IOP ("xt", BSIM3_MOD_XT, IF_REAL, "Doping depth"), - IOP ("k1", BSIM3_MOD_K1, IF_REAL, "Bulk effect coefficient 1"), - IOP ("kt1", BSIM3_MOD_KT1, IF_REAL, "Temperature coefficient of Vth"), - IOP ("kt1l", BSIM3_MOD_KT1L, IF_REAL,"Temperature coefficient of Vth"), - IOP ("kt2", BSIM3_MOD_KT2, IF_REAL, "Body-coefficient of kt1"), - IOP ("k2", BSIM3_MOD_K2, IF_REAL, "Bulk effect coefficient 2"), - IOP ("k3", BSIM3_MOD_K3, IF_REAL, "Narrow width effect coefficient"), - IOP ("k3b", BSIM3_MOD_K3B, IF_REAL, "Body effect coefficient of k3"), - IOP ("w0", BSIM3_MOD_W0, IF_REAL, "Narrow width effect parameter"), - IOP ("nlx", BSIM3_MOD_NLX, IF_REAL,"Lateral non-uniform doping effect"), - IOP ("dvt0", BSIM3_MOD_DVT0, IF_REAL, "Short channel effect coeff. 0"), - IOP ("dvt1", BSIM3_MOD_DVT1, IF_REAL, "Short channel effect coeff. 1"), - IOP ("dvt2", BSIM3_MOD_DVT2, IF_REAL, "Short channel effect coeff. 2"), - IOP ("dvt0w", BSIM3_MOD_DVT0W, IF_REAL, "Narrow Width coeff. 0"), - IOP ("dvt1w", BSIM3_MOD_DVT1W, IF_REAL, "Narrow Width effect coeff. 1"), - IOP ("dvt2w", BSIM3_MOD_DVT2W, IF_REAL, "Narrow Width effect coeff. 2"), - IOP ("drout", BSIM3_MOD_DROUT, IF_REAL, "DIBL coefficient of output resistance"), - IOP ("dsub", BSIM3_MOD_DSUB, IF_REAL,"DIBL coefficient in the subthreshold region"), - IOP ("vth0", BSIM3_MOD_VTH0, IF_REAL, "Threshold voltage"), - IOP ("vtho", BSIM3_MOD_VTH0, IF_REAL, "Threshold voltage"), - IOP ("ua", BSIM3_MOD_UA, IF_REAL, "Linear gate dependence of mobility"), - IOP ("ua1", BSIM3_MOD_UA1, IF_REAL, "Temperature coefficient of ua"), - IOP ("ub", BSIM3_MOD_UB, IF_REAL, "Quadratic gate dependence of mobility"), - IOP ("ub1", BSIM3_MOD_UB1, IF_REAL, "Temperature coefficient of ub"), - IOP ("uc", BSIM3_MOD_UC, IF_REAL, "Body-bias dependence of mobility"), - IOP ("uc1", BSIM3_MOD_UC1, IF_REAL, "Temperature coefficient of uc"), - IOP ("u0", BSIM3_MOD_U0, IF_REAL, "Low-field mobility at Tnom"), - IOP ("ute", BSIM3_MOD_UTE, IF_REAL, "Temperature coefficient of mobility"), - IOP ("voff", BSIM3_MOD_VOFF, IF_REAL, "Threshold voltage offset"), - IOP ("tnom", BSIM3_MOD_TNOM, IF_REAL, "Parameter measurement temperature"), - IOP ("cgso", BSIM3_MOD_CGSO, IF_REAL, "Gate-source overlap capacitance per width"), - IOP ("cgdo", BSIM3_MOD_CGDO, IF_REAL, "Gate-drain overlap capacitance per width"), - IOP ("cgbo", BSIM3_MOD_CGBO, IF_REAL, "Gate-bulk overlap capacitance per length"), - IOP ("xpart", BSIM3_MOD_XPART, IF_REAL, "Channel charge partitioning"), - IOP ("elm", BSIM3_MOD_ELM, IF_REAL, "Non-quasi-static Elmore Constant Parameter"), - IOP ("delta", BSIM3_MOD_DELTA, IF_REAL, "Effective Vds parameter"), - IOP ("rsh", BSIM3_MOD_RSH, IF_REAL, "Source-drain sheet resistance"), - IOP ("rdsw", BSIM3_MOD_RDSW, IF_REAL, "Source-drain resistance per width"), +IOP( "xt", BSIM3_MOD_XT, IF_REAL, "Doping depth"), +IOP( "k1", BSIM3_MOD_K1, IF_REAL, "Bulk effect coefficient 1"), +IOP( "kt1", BSIM3_MOD_KT1, IF_REAL, "Temperature coefficient of Vth"), +IOP( "kt1l", BSIM3_MOD_KT1L, IF_REAL, "Temperature coefficient of Vth"), +IOP( "kt2", BSIM3_MOD_KT2, IF_REAL, "Body-coefficient of kt1"), +IOP( "k2", BSIM3_MOD_K2, IF_REAL, "Bulk effect coefficient 2"), +IOP( "k3", BSIM3_MOD_K3, IF_REAL, "Narrow width effect coefficient"), +IOP( "k3b", BSIM3_MOD_K3B, IF_REAL, "Body effect coefficient of k3"), +IOP( "w0", BSIM3_MOD_W0, IF_REAL, "Narrow width effect parameter"), +IOP( "nlx", BSIM3_MOD_NLX, IF_REAL, "Lateral non-uniform doping effect"), +IOP( "dvt0", BSIM3_MOD_DVT0, IF_REAL, "Short channel effect coeff. 0"), +IOP( "dvt1", BSIM3_MOD_DVT1, IF_REAL, "Short channel effect coeff. 1"), +IOP( "dvt2", BSIM3_MOD_DVT2, IF_REAL, "Short channel effect coeff. 2"), +IOP( "dvt0w", BSIM3_MOD_DVT0W, IF_REAL, "Narrow Width coeff. 0"), +IOP( "dvt1w", BSIM3_MOD_DVT1W, IF_REAL, "Narrow Width effect coeff. 1"), +IOP( "dvt2w", BSIM3_MOD_DVT2W, IF_REAL, "Narrow Width effect coeff. 2"), +IOP( "drout", BSIM3_MOD_DROUT, IF_REAL, "DIBL coefficient of output resistance"), +IOP( "dsub", BSIM3_MOD_DSUB, IF_REAL, "DIBL coefficient in the subthreshold region"), +IOP( "vth0", BSIM3_MOD_VTH0, IF_REAL,"Threshold voltage"), +IOP( "vtho", BSIM3_MOD_VTH0, IF_REAL,"Threshold voltage"), +IOP( "ua", BSIM3_MOD_UA, IF_REAL, "Linear gate dependence of mobility"), +IOP( "ua1", BSIM3_MOD_UA1, IF_REAL, "Temperature coefficient of ua"), +IOP( "ub", BSIM3_MOD_UB, IF_REAL, "Quadratic gate dependence of mobility"), +IOP( "ub1", BSIM3_MOD_UB1, IF_REAL, "Temperature coefficient of ub"), +IOP( "uc", BSIM3_MOD_UC, IF_REAL, "Body-bias dependence of mobility"), +IOP( "uc1", BSIM3_MOD_UC1, IF_REAL, "Temperature coefficient of uc"), +IOP( "u0", BSIM3_MOD_U0, IF_REAL, "Low-field mobility at Tnom"), +IOP( "ute", BSIM3_MOD_UTE, IF_REAL, "Temperature coefficient of mobility"), +IOP( "voff", BSIM3_MOD_VOFF, IF_REAL, "Threshold voltage offset"), +IOP( "tnom", BSIM3_MOD_TNOM, IF_REAL, "Parameter measurement temperature"), +IOP( "cgso", BSIM3_MOD_CGSO, IF_REAL, "Gate-source overlap capacitance per width"), +IOP( "cgdo", BSIM3_MOD_CGDO, IF_REAL, "Gate-drain overlap capacitance per width"), +IOP( "cgbo", BSIM3_MOD_CGBO, IF_REAL, "Gate-bulk overlap capacitance per length"), +IOP( "xpart", BSIM3_MOD_XPART, IF_REAL, "Channel charge partitioning"), +IOP( "elm", BSIM3_MOD_ELM, IF_REAL, "Non-quasi-static Elmore Constant Parameter"), +IOP( "delta", BSIM3_MOD_DELTA, IF_REAL, "Effective Vds parameter"), +IOP( "rsh", BSIM3_MOD_RSH, IF_REAL, "Source-drain sheet resistance"), +IOP( "rdsw", BSIM3_MOD_RDSW, IF_REAL, "Source-drain resistance per width"), - IOP ("prwg", BSIM3_MOD_PRWG, IF_REAL, "Gate-bias effect on parasitic resistance "), - IOP ("prwb", BSIM3_MOD_PRWB, IF_REAL, "Body-effect on parasitic resistance "), +IOP( "prwg", BSIM3_MOD_PRWG, IF_REAL, "Gate-bias effect on parasitic resistance "), +IOP( "prwb", BSIM3_MOD_PRWB, IF_REAL, "Body-effect on parasitic resistance "), - IOP ("prt", BSIM3_MOD_PRT, IF_REAL, "Temperature coefficient of parasitic resistance "), - IOP ("eta0", BSIM3_MOD_ETA0, IF_REAL, "Subthreshold region DIBL coefficient"), - IOP ("etab", BSIM3_MOD_ETAB, IF_REAL, "Subthreshold region DIBL coefficient"), - IOP ("pclm", BSIM3_MOD_PCLM, IF_REAL, "Channel length modulation Coefficient"), - IOP ("pdiblc1", BSIM3_MOD_PDIBL1, IF_REAL, "Drain-induced barrier lowering coefficient"), - IOP ("pdiblc2", BSIM3_MOD_PDIBL2, IF_REAL, "Drain-induced barrier lowering coefficient"), - IOP ("pdiblcb", BSIM3_MOD_PDIBLB, IF_REAL, "Body-effect on drain-induced barrier lowering"), - IOP ("pscbe1", BSIM3_MOD_PSCBE1, IF_REAL, "Substrate current body-effect coefficient"), - IOP ("pscbe2", BSIM3_MOD_PSCBE2, IF_REAL, "Substrate current body-effect coefficient"), - IOP ("pvag", BSIM3_MOD_PVAG, IF_REAL, "Gate dependence of output resistance parameter"), - IOP ("js", BSIM3_MOD_JS, IF_REAL, "Source/drain junction reverse saturation current density"), - IOP ("jsw", BSIM3_MOD_JSW, IF_REAL, "Sidewall junction reverse saturation current density"), - IOP ("pb", BSIM3_MOD_PB, IF_REAL, "Source/drain junction built-in potential"), - IOP ("nj", BSIM3_MOD_NJ, IF_REAL, "Source/drain junction emission coefficient"), - IOP ("xti", BSIM3_MOD_XTI, IF_REAL, "Junction current temperature exponent"), - IOP ("mj", BSIM3_MOD_MJ, IF_REAL, "Source/drain bottom junction capacitance grading coefficient"), - IOP ("pbsw", BSIM3_MOD_PBSW, IF_REAL, "Source/drain sidewall junction capacitance built in potential"), - IOP ("mjsw", BSIM3_MOD_MJSW, IF_REAL, "Source/drain sidewall junction capacitance grading coefficient"), - IOP ("pbswg", BSIM3_MOD_PBSWG, IF_REAL, "Source/drain (gate side) sidewall junction capacitance built in potential"), - IOP ("mjswg", BSIM3_MOD_MJSWG, IF_REAL, "Source/drain (gate side) sidewall junction capacitance grading coefficient"), - IOP ("cj", BSIM3_MOD_CJ, IF_REAL, "Source/drain bottom junction capacitance per unit area"), - IOP ("vfbcv", BSIM3_MOD_VFBCV, IF_REAL, "Flat Band Voltage parameter for capmod=0 only"), - IOP ("vfb", BSIM3_MOD_VFB, IF_REAL, "Flat Band Voltage"), - IOP ("cjsw", BSIM3_MOD_CJSW, IF_REAL, "Source/drain sidewall junction capacitance per unit periphery"), - IOP ("cjswg", BSIM3_MOD_CJSWG, IF_REAL, "Source/drain (gate side) sidewall junction capacitance per unit width"), - IOP ("tpb", BSIM3_MOD_TPB, IF_REAL, "Temperature coefficient of pb"), - IOP ("tcj", BSIM3_MOD_TCJ, IF_REAL, "Temperature coefficient of cj"), - IOP ("tpbsw", BSIM3_MOD_TPBSW, IF_REAL, "Temperature coefficient of pbsw"), - IOP ("tcjsw", BSIM3_MOD_TCJSW, IF_REAL, "Temperature coefficient of cjsw"), - IOP ("tpbswg", BSIM3_MOD_TPBSWG, IF_REAL, "Temperature coefficient of pbswg"), - IOP ("tcjswg", BSIM3_MOD_TCJSWG, IF_REAL, "Temperature coefficient of cjswg"), - IOP ("acde", BSIM3_MOD_ACDE, IF_REAL, "Exponential coefficient for finite charge thickness"), - IOP ("moin", BSIM3_MOD_MOIN, IF_REAL, "Coefficient for gate-bias dependent surface potential"), - IOP ("noff", BSIM3_MOD_NOFF, IF_REAL, "C-V turn-on/off parameter"), - IOP ("voffcv", BSIM3_MOD_VOFFCV, IF_REAL, "C-V lateral-shift parameter"), - IOP ("lint", BSIM3_MOD_LINT, IF_REAL, "Length reduction parameter"), - IOP ("ll", BSIM3_MOD_LL, IF_REAL, "Length reduction parameter"), - IOP ("llc", BSIM3_MOD_LLC, IF_REAL, "Length reduction parameter for CV"), - IOP ("lln", BSIM3_MOD_LLN, IF_REAL, "Length reduction parameter"), - IOP ("lw", BSIM3_MOD_LW, IF_REAL, "Length reduction parameter"), - IOP ("lwc", BSIM3_MOD_LWC, IF_REAL, "Length reduction parameter for CV"), - IOP ("lwn", BSIM3_MOD_LWN, IF_REAL, "Length reduction parameter"), - IOP ("lwl", BSIM3_MOD_LWL, IF_REAL, "Length reduction parameter"), - IOP ("lwlc", BSIM3_MOD_LWLC, IF_REAL, "Length reduction parameter for CV"), - IOP ("lmin", BSIM3_MOD_LMIN, IF_REAL, "Minimum length for the model"), - IOP ("lmax", BSIM3_MOD_LMAX, IF_REAL, "Maximum length for the model"), +IOP( "prt", BSIM3_MOD_PRT, IF_REAL, "Temperature coefficient of parasitic resistance "), +IOP( "eta0", BSIM3_MOD_ETA0, IF_REAL, "Subthreshold region DIBL coefficient"), +IOP( "etab", BSIM3_MOD_ETAB, IF_REAL, "Subthreshold region DIBL coefficient"), +IOP( "pclm", BSIM3_MOD_PCLM, IF_REAL, "Channel length modulation Coefficient"), +IOP( "pdiblc1", BSIM3_MOD_PDIBL1, IF_REAL, "Drain-induced barrier lowering coefficient"), +IOP( "pdiblc2", BSIM3_MOD_PDIBL2, IF_REAL, "Drain-induced barrier lowering coefficient"), +IOP( "pdiblcb", BSIM3_MOD_PDIBLB, IF_REAL, "Body-effect on drain-induced barrier lowering"), +IOP( "pscbe1", BSIM3_MOD_PSCBE1, IF_REAL, "Substrate current body-effect coefficient"), +IOP( "pscbe2", BSIM3_MOD_PSCBE2, IF_REAL, "Substrate current body-effect coefficient"), +IOP( "pvag", BSIM3_MOD_PVAG, IF_REAL, "Gate dependence of output resistance parameter"), +IOP( "js", BSIM3_MOD_JS, IF_REAL, "Source/drain junction reverse saturation current density"), +IOP( "jsw", BSIM3_MOD_JSW, IF_REAL, "Sidewall junction reverse saturation current density"), +IOP( "pb", BSIM3_MOD_PB, IF_REAL, "Source/drain junction built-in potential"), +IOP( "nj", BSIM3_MOD_NJ, IF_REAL, "Source/drain junction emission coefficient"), +IOP( "xti", BSIM3_MOD_XTI, IF_REAL, "Junction current temperature exponent"), +IOP( "mj", BSIM3_MOD_MJ, IF_REAL, "Source/drain bottom junction capacitance grading coefficient"), +IOP( "pbsw", BSIM3_MOD_PBSW, IF_REAL, "Source/drain sidewall junction capacitance built in potential"), +IOP( "mjsw", BSIM3_MOD_MJSW, IF_REAL, "Source/drain sidewall junction capacitance grading coefficient"), +IOP( "pbswg", BSIM3_MOD_PBSWG, IF_REAL, "Source/drain (gate side) sidewall junction capacitance built in potential"), +IOP( "mjswg", BSIM3_MOD_MJSWG, IF_REAL, "Source/drain (gate side) sidewall junction capacitance grading coefficient"), +IOP( "cj", BSIM3_MOD_CJ, IF_REAL, "Source/drain bottom junction capacitance per unit area"), +IOP( "vfbcv", BSIM3_MOD_VFBCV, IF_REAL, "Flat Band Voltage parameter for capmod=0 only"), +IOP( "vfb", BSIM3_MOD_VFB, IF_REAL, "Flat Band Voltage"), +IOP( "cjsw", BSIM3_MOD_CJSW, IF_REAL, "Source/drain sidewall junction capacitance per unit periphery"), +IOP( "cjswg", BSIM3_MOD_CJSWG, IF_REAL, "Source/drain (gate side) sidewall junction capacitance per unit width"), +IOP( "tpb", BSIM3_MOD_TPB, IF_REAL, "Temperature coefficient of pb"), +IOP( "tcj", BSIM3_MOD_TCJ, IF_REAL, "Temperature coefficient of cj"), +IOP( "tpbsw", BSIM3_MOD_TPBSW, IF_REAL, "Temperature coefficient of pbsw"), +IOP( "tcjsw", BSIM3_MOD_TCJSW, IF_REAL, "Temperature coefficient of cjsw"), +IOP( "tpbswg", BSIM3_MOD_TPBSWG, IF_REAL, "Temperature coefficient of pbswg"), +IOP( "tcjswg", BSIM3_MOD_TCJSWG, IF_REAL, "Temperature coefficient of cjswg"), +IOP( "acde", BSIM3_MOD_ACDE, IF_REAL, "Exponential coefficient for finite charge thickness"), +IOP( "moin", BSIM3_MOD_MOIN, IF_REAL, "Coefficient for gate-bias dependent surface potential"), +IOP( "noff", BSIM3_MOD_NOFF, IF_REAL, "C-V turn-on/off parameter"), +IOP( "voffcv", BSIM3_MOD_VOFFCV, IF_REAL, "C-V lateral-shift parameter"), +IOP( "lint", BSIM3_MOD_LINT, IF_REAL, "Length reduction parameter"), +IOP( "ll", BSIM3_MOD_LL, IF_REAL, "Length reduction parameter"), +IOP( "llc", BSIM3_MOD_LLC, IF_REAL, "Length reduction parameter for CV"), +IOP( "lln", BSIM3_MOD_LLN, IF_REAL, "Length reduction parameter"), +IOP( "lw", BSIM3_MOD_LW, IF_REAL, "Length reduction parameter"), +IOP( "lwc", BSIM3_MOD_LWC, IF_REAL, "Length reduction parameter for CV"), +IOP( "lwn", BSIM3_MOD_LWN, IF_REAL, "Length reduction parameter"), +IOP( "lwl", BSIM3_MOD_LWL, IF_REAL, "Length reduction parameter"), +IOP( "lwlc", BSIM3_MOD_LWLC, IF_REAL, "Length reduction parameter for CV"), +IOP( "lmin", BSIM3_MOD_LMIN, IF_REAL, "Minimum length for the model"), +IOP( "lmax", BSIM3_MOD_LMAX, IF_REAL, "Maximum length for the model"), - IOP ("wr", BSIM3_MOD_WR, IF_REAL, "Width dependence of rds"), - IOP ("wint", BSIM3_MOD_WINT, IF_REAL, "Width reduction parameter"), - IOP ("dwg", BSIM3_MOD_DWG, IF_REAL, "Width reduction parameter"), - IOP ("dwb", BSIM3_MOD_DWB, IF_REAL, "Width reduction parameter"), +IOP( "xl", BSIM3_MOD_XL, IF_REAL, "Length correction parameter"), +IOP( "xw", BSIM3_MOD_XW, IF_REAL, "Width correction parameter"), - IOP ("wl", BSIM3_MOD_WL, IF_REAL, "Width reduction parameter"), - IOP ("wlc", BSIM3_MOD_WLC, IF_REAL, "Width reduction parameter for CV"), - IOP ("wln", BSIM3_MOD_WLN, IF_REAL, "Width reduction parameter"), - IOP ("ww", BSIM3_MOD_WW, IF_REAL, "Width reduction parameter"), - IOP ("wwc", BSIM3_MOD_WWC, IF_REAL, "Width reduction parameter for CV"), - IOP ("wwn", BSIM3_MOD_WWN, IF_REAL, "Width reduction parameter"), - IOP ("wwl", BSIM3_MOD_WWL, IF_REAL, "Width reduction parameter"), - IOP ("wwlc", BSIM3_MOD_WWLC, IF_REAL, "Width reduction parameter for CV"), - IOP ("wmin", BSIM3_MOD_WMIN, IF_REAL, "Minimum width for the model"), - IOP ("wmax", BSIM3_MOD_WMAX, IF_REAL, "Maximum width for the model"), +IOP( "wr", BSIM3_MOD_WR, IF_REAL, "Width dependence of rds"), +IOP( "wint", BSIM3_MOD_WINT, IF_REAL, "Width reduction parameter"), +IOP( "dwg", BSIM3_MOD_DWG, IF_REAL, "Width reduction parameter"), +IOP( "dwb", BSIM3_MOD_DWB, IF_REAL, "Width reduction parameter"), - IOP ("b0", BSIM3_MOD_B0, IF_REAL, "Abulk narrow width parameter"), - IOP ("b1", BSIM3_MOD_B1, IF_REAL, "Abulk narrow width parameter"), +IOP( "wl", BSIM3_MOD_WL, IF_REAL, "Width reduction parameter"), +IOP( "wlc", BSIM3_MOD_WLC, IF_REAL, "Width reduction parameter for CV"), +IOP( "wln", BSIM3_MOD_WLN, IF_REAL, "Width reduction parameter"), +IOP( "ww", BSIM3_MOD_WW, IF_REAL, "Width reduction parameter"), +IOP( "wwc", BSIM3_MOD_WWC, IF_REAL, "Width reduction parameter for CV"), +IOP( "wwn", BSIM3_MOD_WWN, IF_REAL, "Width reduction parameter"), +IOP( "wwl", BSIM3_MOD_WWL, IF_REAL, "Width reduction parameter"), +IOP( "wwlc", BSIM3_MOD_WWLC, IF_REAL, "Width reduction parameter for CV"), +IOP( "wmin", BSIM3_MOD_WMIN, IF_REAL, "Minimum width for the model"), +IOP( "wmax", BSIM3_MOD_WMAX, IF_REAL, "Maximum width for the model"), - IOP ("cgsl", BSIM3_MOD_CGSL, IF_REAL, "New C-V model parameter"), - IOP ("cgdl", BSIM3_MOD_CGDL, IF_REAL, "New C-V model parameter"), - IOP ("ckappa", BSIM3_MOD_CKAPPA, IF_REAL, "New C-V model parameter"), - IOP ("cf", BSIM3_MOD_CF, IF_REAL, "Fringe capacitance parameter"), - IOP ("clc", BSIM3_MOD_CLC, IF_REAL, "Vdsat parameter for C-V model"), - IOP ("cle", BSIM3_MOD_CLE, IF_REAL, "Vdsat parameter for C-V model"), - IOP ("dwc", BSIM3_MOD_DWC, IF_REAL, "Delta W for C-V model"), - IOP ("dlc", BSIM3_MOD_DLC, IF_REAL, "Delta L for C-V model"), +IOP( "b0", BSIM3_MOD_B0, IF_REAL, "Abulk narrow width parameter"), +IOP( "b1", BSIM3_MOD_B1, IF_REAL, "Abulk narrow width parameter"), - IOP ("alpha0", BSIM3_MOD_ALPHA0, IF_REAL, "substrate current model parameter"), - IOP ("alpha1", BSIM3_MOD_ALPHA1, IF_REAL, "substrate current model parameter"), - IOP ("beta0", BSIM3_MOD_BETA0, IF_REAL, "substrate current model parameter"), - IOP ("ijth", BSIM3_MOD_IJTH, IF_REAL, "Diode limiting current"), +IOP( "cgsl", BSIM3_MOD_CGSL, IF_REAL, "New C-V model parameter"), +IOP( "cgdl", BSIM3_MOD_CGDL, IF_REAL, "New C-V model parameter"), +IOP( "ckappa", BSIM3_MOD_CKAPPA, IF_REAL, "New C-V model parameter"), +IOP( "cf", BSIM3_MOD_CF, IF_REAL, "Fringe capacitance parameter"), +IOP( "clc", BSIM3_MOD_CLC, IF_REAL, "Vdsat parameter for C-V model"), +IOP( "cle", BSIM3_MOD_CLE, IF_REAL, "Vdsat parameter for C-V model"), +IOP( "dwc", BSIM3_MOD_DWC, IF_REAL, "Delta W for C-V model"), +IOP( "dlc", BSIM3_MOD_DLC, IF_REAL, "Delta L for C-V model"), - IOP ("lcdsc", BSIM3_MOD_LCDSC, IF_REAL, "Length dependence of cdsc"), - IOP ("lcdscb", BSIM3_MOD_LCDSCB, IF_REAL, "Length dependence of cdscb"), - IOP ("lcdscd", BSIM3_MOD_LCDSCD, IF_REAL, "Length dependence of cdscd"), - IOP ("lcit", BSIM3_MOD_LCIT, IF_REAL, "Length dependence of cit"), - IOP ("lnfactor", BSIM3_MOD_LNFACTOR, IF_REAL, "Length dependence of nfactor"), - IOP ("lxj", BSIM3_MOD_LXJ, IF_REAL, "Length dependence of xj"), - IOP ("lvsat", BSIM3_MOD_LVSAT, IF_REAL, "Length dependence of vsat"), - IOP ("lat", BSIM3_MOD_LAT, IF_REAL, "Length dependence of at"), - IOP ("la0", BSIM3_MOD_LA0, IF_REAL, "Length dependence of a0"), - IOP ("lags", BSIM3_MOD_LAGS, IF_REAL, "Length dependence of ags"), - IOP ("la1", BSIM3_MOD_LA1, IF_REAL, "Length dependence of a1"), - IOP ("la2", BSIM3_MOD_LA2, IF_REAL, "Length dependence of a2"), - IOP ("lketa", BSIM3_MOD_LKETA, IF_REAL, "Length dependence of keta"), - IOP ("lnsub", BSIM3_MOD_LNSUB, IF_REAL, "Length dependence of nsub"), - IOP ("lnch", BSIM3_MOD_LNPEAK, IF_REAL, "Length dependence of nch"), - IOP ("lngate", BSIM3_MOD_LNGATE, IF_REAL, "Length dependence of ngate"), - IOP ("lgamma1", BSIM3_MOD_LGAMMA1, IF_REAL, "Length dependence of gamma1"), - IOP ("lgamma2", BSIM3_MOD_LGAMMA2, IF_REAL, "Length dependence of gamma2"), - IOP ("lvbx", BSIM3_MOD_LVBX, IF_REAL, "Length dependence of vbx"), - IOP ("lvbm", BSIM3_MOD_LVBM, IF_REAL, "Length dependence of vbm"), - IOP ("lxt", BSIM3_MOD_LXT, IF_REAL, "Length dependence of xt"), - IOP ("lk1", BSIM3_MOD_LK1, IF_REAL, "Length dependence of k1"), - IOP ("lkt1", BSIM3_MOD_LKT1, IF_REAL, "Length dependence of kt1"), - IOP ("lkt1l", BSIM3_MOD_LKT1L, IF_REAL, "Length dependence of kt1l"), - IOP ("lkt2", BSIM3_MOD_LKT2, IF_REAL, "Length dependence of kt2"), - IOP ("lk2", BSIM3_MOD_LK2, IF_REAL, "Length dependence of k2"), - IOP ("lk3", BSIM3_MOD_LK3, IF_REAL, "Length dependence of k3"), - IOP ("lk3b", BSIM3_MOD_LK3B, IF_REAL, "Length dependence of k3b"), - IOP ("lw0", BSIM3_MOD_LW0, IF_REAL, "Length dependence of w0"), - IOP ("lnlx", BSIM3_MOD_LNLX, IF_REAL, "Length dependence of nlx"), - IOP ("ldvt0", BSIM3_MOD_LDVT0, IF_REAL, "Length dependence of dvt0"), - IOP ("ldvt1", BSIM3_MOD_LDVT1, IF_REAL, "Length dependence of dvt1"), - IOP ("ldvt2", BSIM3_MOD_LDVT2, IF_REAL, "Length dependence of dvt2"), - IOP ("ldvt0w", BSIM3_MOD_LDVT0W, IF_REAL, "Length dependence of dvt0w"), - IOP ("ldvt1w", BSIM3_MOD_LDVT1W, IF_REAL, "Length dependence of dvt1w"), - IOP ("ldvt2w", BSIM3_MOD_LDVT2W, IF_REAL, "Length dependence of dvt2w"), - IOP ("ldrout", BSIM3_MOD_LDROUT, IF_REAL, "Length dependence of drout"), - IOP ("ldsub", BSIM3_MOD_LDSUB, IF_REAL, "Length dependence of dsub"), - IOP ("lvth0", BSIM3_MOD_LVTH0, IF_REAL, "Length dependence of vto"), - IOP ("lvtho", BSIM3_MOD_LVTH0, IF_REAL, "Length dependence of vto"), - IOP ("lua", BSIM3_MOD_LUA, IF_REAL, "Length dependence of ua"), - IOP ("lua1", BSIM3_MOD_LUA1, IF_REAL, "Length dependence of ua1"), - IOP ("lub", BSIM3_MOD_LUB, IF_REAL, "Length dependence of ub"), - IOP ("lub1", BSIM3_MOD_LUB1, IF_REAL, "Length dependence of ub1"), - IOP ("luc", BSIM3_MOD_LUC, IF_REAL, "Length dependence of uc"), - IOP ("luc1", BSIM3_MOD_LUC1, IF_REAL, "Length dependence of uc1"), - IOP ("lu0", BSIM3_MOD_LU0, IF_REAL, "Length dependence of u0"), - IOP ("lute", BSIM3_MOD_LUTE, IF_REAL, "Length dependence of ute"), - IOP ("lvoff", BSIM3_MOD_LVOFF, IF_REAL, "Length dependence of voff"), - IOP ("lelm", BSIM3_MOD_LELM, IF_REAL, "Length dependence of elm"), - IOP ("ldelta", BSIM3_MOD_LDELTA, IF_REAL, "Length dependence of delta"), - IOP ("lrdsw", BSIM3_MOD_LRDSW, IF_REAL, "Length dependence of rdsw "), +IOP( "hdif", BSIM3_MOD_HDIF, IF_REAL, "ACM Parameter: Distance Gate - contact"), +IOP( "ldif", BSIM3_MOD_LDIF, IF_REAL, "ACM Parameter: Length of LDD Gate-Source/Drain"), +IOP( "ld", BSIM3_MOD_LD, IF_REAL, "ACM Parameter: Length of LDD under Gate"), +IOP( "rd", BSIM3_MOD_RD, IF_REAL, "ACM Parameter: Resistance of LDD drain side"), +IOP( "rs", BSIM3_MOD_RS, IF_REAL, "ACM Parameter: Resistance of LDD source side"), +IOP( "rdc", BSIM3_MOD_RS, IF_REAL, "ACM Parameter: Resistance contact drain side"), +IOP( "rsc", BSIM3_MOD_RS, IF_REAL, "ACM Parameter: Resistance contact source side"), - IOP ("lprwg", BSIM3_MOD_LPRWG, IF_REAL, "Length dependence of prwg "), - IOP ("lprwb", BSIM3_MOD_LPRWB, IF_REAL, "Length dependence of prwb "), +IOP( "alpha0", BSIM3_MOD_ALPHA0, IF_REAL, "substrate current model parameter"), +IOP( "alpha1", BSIM3_MOD_ALPHA1, IF_REAL, "substrate current model parameter"), +IOP( "beta0", BSIM3_MOD_BETA0, IF_REAL, "substrate current model parameter"), +IOP( "ijth", BSIM3_MOD_IJTH, IF_REAL, "Diode limiting current"), - IOP ("lprt", BSIM3_MOD_LPRT, IF_REAL, "Length dependence of prt "), - IOP ("leta0", BSIM3_MOD_LETA0, IF_REAL, "Length dependence of eta0"), - IOP ("letab", BSIM3_MOD_LETAB, IF_REAL, "Length dependence of etab"), - IOP ("lpclm", BSIM3_MOD_LPCLM, IF_REAL, "Length dependence of pclm"), - IOP ("lpdiblc1", BSIM3_MOD_LPDIBL1, IF_REAL, "Length dependence of pdiblc1"), - IOP ("lpdiblc2", BSIM3_MOD_LPDIBL2, IF_REAL, "Length dependence of pdiblc2"), - IOP ("lpdiblcb", BSIM3_MOD_LPDIBLB, IF_REAL, "Length dependence of pdiblcb"), - IOP ("lpscbe1", BSIM3_MOD_LPSCBE1, IF_REAL, "Length dependence of pscbe1"), - IOP ("lpscbe2", BSIM3_MOD_LPSCBE2, IF_REAL, "Length dependence of pscbe2"), - IOP ("lpvag", BSIM3_MOD_LPVAG, IF_REAL, "Length dependence of pvag"), - IOP ("lwr", BSIM3_MOD_LWR, IF_REAL, "Length dependence of wr"), - IOP ("ldwg", BSIM3_MOD_LDWG, IF_REAL, "Length dependence of dwg"), - IOP ("ldwb", BSIM3_MOD_LDWB, IF_REAL, "Length dependence of dwb"), - IOP ("lb0", BSIM3_MOD_LB0, IF_REAL, "Length dependence of b0"), - IOP ("lb1", BSIM3_MOD_LB1, IF_REAL, "Length dependence of b1"), - IOP ("lcgsl", BSIM3_MOD_LCGSL, IF_REAL, "Length dependence of cgsl"), - IOP ("lcgdl", BSIM3_MOD_LCGDL, IF_REAL, "Length dependence of cgdl"), - IOP ("lckappa", BSIM3_MOD_LCKAPPA, IF_REAL, "Length dependence of ckappa"), - IOP ("lcf", BSIM3_MOD_LCF, IF_REAL, "Length dependence of cf"), - IOP ("lclc", BSIM3_MOD_LCLC, IF_REAL, "Length dependence of clc"), - IOP ("lcle", BSIM3_MOD_LCLE, IF_REAL, "Length dependence of cle"), - IOP ("lalpha0", BSIM3_MOD_LALPHA0, IF_REAL, "Length dependence of alpha0"), - IOP ("lalpha1", BSIM3_MOD_LALPHA1, IF_REAL, "Length dependence of alpha1"), - IOP ("lbeta0", BSIM3_MOD_LBETA0, IF_REAL, "Length dependence of beta0"), - IOP ("lvfbcv", BSIM3_MOD_LVFBCV, IF_REAL, "Length dependence of vfbcv"), - IOP ("lvfb", BSIM3_MOD_LVFB, IF_REAL, "Length dependence of vfb"), - IOP ("lacde", BSIM3_MOD_LACDE, IF_REAL, "Length dependence of acde"), - IOP ("lmoin", BSIM3_MOD_LMOIN, IF_REAL, "Length dependence of moin"), - IOP ("lnoff", BSIM3_MOD_LNOFF, IF_REAL, "Length dependence of noff"), - IOP ("lvoffcv", BSIM3_MOD_LVOFFCV, IF_REAL, "Length dependence of voffcv"), - IOP ("wcdsc", BSIM3_MOD_WCDSC, IF_REAL, "Width dependence of cdsc"), - IOP ("wcdscb", BSIM3_MOD_WCDSCB, IF_REAL, "Width dependence of cdscb"), - IOP ("wcdscd", BSIM3_MOD_WCDSCD, IF_REAL, "Width dependence of cdscd"), - IOP ("wcit", BSIM3_MOD_WCIT, IF_REAL, "Width dependence of cit"), - IOP ("wnfactor", BSIM3_MOD_WNFACTOR, IF_REAL, "Width dependence of nfactor"), - IOP ("wxj", BSIM3_MOD_WXJ, IF_REAL, "Width dependence of xj"), - IOP ("wvsat", BSIM3_MOD_WVSAT, IF_REAL, "Width dependence of vsat"), - IOP ("wat", BSIM3_MOD_WAT, IF_REAL, "Width dependence of at"), - IOP ("wa0", BSIM3_MOD_WA0, IF_REAL, "Width dependence of a0"), - IOP ("wags", BSIM3_MOD_WAGS, IF_REAL, "Width dependence of ags"), - IOP ("wa1", BSIM3_MOD_WA1, IF_REAL, "Width dependence of a1"), - IOP ("wa2", BSIM3_MOD_WA2, IF_REAL, "Width dependence of a2"), - IOP ("wketa", BSIM3_MOD_WKETA, IF_REAL, "Width dependence of keta"), - IOP ("wnsub", BSIM3_MOD_WNSUB, IF_REAL, "Width dependence of nsub"), - IOP ("wnch", BSIM3_MOD_WNPEAK, IF_REAL, "Width dependence of nch"), - IOP ("wngate", BSIM3_MOD_WNGATE, IF_REAL, "Width dependence of ngate"), - IOP ("wgamma1", BSIM3_MOD_WGAMMA1, IF_REAL, "Width dependence of gamma1"), - IOP ("wgamma2", BSIM3_MOD_WGAMMA2, IF_REAL, "Width dependence of gamma2"), - IOP ("wvbx", BSIM3_MOD_WVBX, IF_REAL, "Width dependence of vbx"), - IOP ("wvbm", BSIM3_MOD_WVBM, IF_REAL, "Width dependence of vbm"), - IOP ("wxt", BSIM3_MOD_WXT, IF_REAL, "Width dependence of xt"), - IOP ("wk1", BSIM3_MOD_WK1, IF_REAL, "Width dependence of k1"), - IOP ("wkt1", BSIM3_MOD_WKT1, IF_REAL, "Width dependence of kt1"), - IOP ("wkt1l", BSIM3_MOD_WKT1L, IF_REAL, "Width dependence of kt1l"), - IOP ("wkt2", BSIM3_MOD_WKT2, IF_REAL, "Width dependence of kt2"), - IOP ("wk2", BSIM3_MOD_WK2, IF_REAL, "Width dependence of k2"), - IOP ("wk3", BSIM3_MOD_WK3, IF_REAL, "Width dependence of k3"), - IOP ("wk3b", BSIM3_MOD_WK3B, IF_REAL, "Width dependence of k3b"), - IOP ("ww0", BSIM3_MOD_WW0, IF_REAL, "Width dependence of w0"), - IOP ("wnlx", BSIM3_MOD_WNLX, IF_REAL, "Width dependence of nlx"), - IOP ("wdvt0", BSIM3_MOD_WDVT0, IF_REAL, "Width dependence of dvt0"), - IOP ("wdvt1", BSIM3_MOD_WDVT1, IF_REAL, "Width dependence of dvt1"), - IOP ("wdvt2", BSIM3_MOD_WDVT2, IF_REAL, "Width dependence of dvt2"), - IOP ("wdvt0w", BSIM3_MOD_WDVT0W, IF_REAL, "Width dependence of dvt0w"), - IOP ("wdvt1w", BSIM3_MOD_WDVT1W, IF_REAL, "Width dependence of dvt1w"), - IOP ("wdvt2w", BSIM3_MOD_WDVT2W, IF_REAL, "Width dependence of dvt2w"), - IOP ("wdrout", BSIM3_MOD_WDROUT, IF_REAL, "Width dependence of drout"), - IOP ("wdsub", BSIM3_MOD_WDSUB, IF_REAL, "Width dependence of dsub"), - IOP ("wvth0", BSIM3_MOD_WVTH0, IF_REAL, "Width dependence of vto"), - IOP ("wvtho", BSIM3_MOD_WVTH0, IF_REAL, "Width dependence of vto"), - IOP ("wua", BSIM3_MOD_WUA, IF_REAL, "Width dependence of ua"), - IOP ("wua1", BSIM3_MOD_WUA1, IF_REAL, "Width dependence of ua1"), - IOP ("wub", BSIM3_MOD_WUB, IF_REAL, "Width dependence of ub"), - IOP ("wub1", BSIM3_MOD_WUB1, IF_REAL, "Width dependence of ub1"), - IOP ("wuc", BSIM3_MOD_WUC, IF_REAL, "Width dependence of uc"), - IOP ("wuc1", BSIM3_MOD_WUC1, IF_REAL, "Width dependence of uc1"), - IOP ("wu0", BSIM3_MOD_WU0, IF_REAL, "Width dependence of u0"), - IOP ("wute", BSIM3_MOD_WUTE, IF_REAL, "Width dependence of ute"), - IOP ("wvoff", BSIM3_MOD_WVOFF, IF_REAL, "Width dependence of voff"), - IOP ("welm", BSIM3_MOD_WELM, IF_REAL, "Width dependence of elm"), - IOP ("wdelta", BSIM3_MOD_WDELTA, IF_REAL, "Width dependence of delta"), - IOP ("wrdsw", BSIM3_MOD_WRDSW, IF_REAL, "Width dependence of rdsw "), +IOP( "lcdsc", BSIM3_MOD_LCDSC, IF_REAL, "Length dependence of cdsc"), +IOP( "lcdscb", BSIM3_MOD_LCDSCB, IF_REAL, "Length dependence of cdscb"), +IOP( "lcdscd", BSIM3_MOD_LCDSCD, IF_REAL, "Length dependence of cdscd"), +IOP( "lcit", BSIM3_MOD_LCIT, IF_REAL, "Length dependence of cit"), +IOP( "lnfactor", BSIM3_MOD_LNFACTOR, IF_REAL, "Length dependence of nfactor"), +IOP( "lxj", BSIM3_MOD_LXJ, IF_REAL, "Length dependence of xj"), +IOP( "lvsat", BSIM3_MOD_LVSAT, IF_REAL, "Length dependence of vsat"), +IOP( "lat", BSIM3_MOD_LAT, IF_REAL, "Length dependence of at"), +IOP( "la0", BSIM3_MOD_LA0, IF_REAL, "Length dependence of a0"), +IOP( "lags", BSIM3_MOD_LAGS, IF_REAL, "Length dependence of ags"), +IOP( "la1", BSIM3_MOD_LA1, IF_REAL, "Length dependence of a1"), +IOP( "la2", BSIM3_MOD_LA2, IF_REAL, "Length dependence of a2"), +IOP( "lketa", BSIM3_MOD_LKETA, IF_REAL, "Length dependence of keta"), +IOP( "lnsub", BSIM3_MOD_LNSUB, IF_REAL, "Length dependence of nsub"), +IOP( "lnch", BSIM3_MOD_LNPEAK, IF_REAL, "Length dependence of nch"), +IOP( "lngate", BSIM3_MOD_LNGATE, IF_REAL, "Length dependence of ngate"), +IOP( "lgamma1", BSIM3_MOD_LGAMMA1, IF_REAL, "Length dependence of gamma1"), +IOP( "lgamma2", BSIM3_MOD_LGAMMA2, IF_REAL, "Length dependence of gamma2"), +IOP( "lvbx", BSIM3_MOD_LVBX, IF_REAL, "Length dependence of vbx"), +IOP( "lvbm", BSIM3_MOD_LVBM, IF_REAL, "Length dependence of vbm"), +IOP( "lxt", BSIM3_MOD_LXT, IF_REAL, "Length dependence of xt"), +IOP( "lk1", BSIM3_MOD_LK1, IF_REAL, "Length dependence of k1"), +IOP( "lkt1", BSIM3_MOD_LKT1, IF_REAL, "Length dependence of kt1"), +IOP( "lkt1l", BSIM3_MOD_LKT1L, IF_REAL, "Length dependence of kt1l"), +IOP( "lkt2", BSIM3_MOD_LKT2, IF_REAL, "Length dependence of kt2"), +IOP( "lk2", BSIM3_MOD_LK2, IF_REAL, "Length dependence of k2"), +IOP( "lk3", BSIM3_MOD_LK3, IF_REAL, "Length dependence of k3"), +IOP( "lk3b", BSIM3_MOD_LK3B, IF_REAL, "Length dependence of k3b"), +IOP( "lw0", BSIM3_MOD_LW0, IF_REAL, "Length dependence of w0"), +IOP( "lnlx", BSIM3_MOD_LNLX, IF_REAL, "Length dependence of nlx"), +IOP( "ldvt0", BSIM3_MOD_LDVT0, IF_REAL, "Length dependence of dvt0"), +IOP( "ldvt1", BSIM3_MOD_LDVT1, IF_REAL, "Length dependence of dvt1"), +IOP( "ldvt2", BSIM3_MOD_LDVT2, IF_REAL, "Length dependence of dvt2"), +IOP( "ldvt0w", BSIM3_MOD_LDVT0W, IF_REAL, "Length dependence of dvt0w"), +IOP( "ldvt1w", BSIM3_MOD_LDVT1W, IF_REAL, "Length dependence of dvt1w"), +IOP( "ldvt2w", BSIM3_MOD_LDVT2W, IF_REAL, "Length dependence of dvt2w"), +IOP( "ldrout", BSIM3_MOD_LDROUT, IF_REAL, "Length dependence of drout"), +IOP( "ldsub", BSIM3_MOD_LDSUB, IF_REAL, "Length dependence of dsub"), +IOP( "lvth0", BSIM3_MOD_LVTH0, IF_REAL,"Length dependence of vto"), +IOP( "lvtho", BSIM3_MOD_LVTH0, IF_REAL,"Length dependence of vto"), +IOP( "lua", BSIM3_MOD_LUA, IF_REAL, "Length dependence of ua"), +IOP( "lua1", BSIM3_MOD_LUA1, IF_REAL, "Length dependence of ua1"), +IOP( "lub", BSIM3_MOD_LUB, IF_REAL, "Length dependence of ub"), +IOP( "lub1", BSIM3_MOD_LUB1, IF_REAL, "Length dependence of ub1"), +IOP( "luc", BSIM3_MOD_LUC, IF_REAL, "Length dependence of uc"), +IOP( "luc1", BSIM3_MOD_LUC1, IF_REAL, "Length dependence of uc1"), +IOP( "lu0", BSIM3_MOD_LU0, IF_REAL, "Length dependence of u0"), +IOP( "lute", BSIM3_MOD_LUTE, IF_REAL, "Length dependence of ute"), +IOP( "lvoff", BSIM3_MOD_LVOFF, IF_REAL, "Length dependence of voff"), +IOP( "lelm", BSIM3_MOD_LELM, IF_REAL, "Length dependence of elm"), +IOP( "ldelta", BSIM3_MOD_LDELTA, IF_REAL, "Length dependence of delta"), +IOP( "lrdsw", BSIM3_MOD_LRDSW, IF_REAL, "Length dependence of rdsw "), - IOP ("wprwg", BSIM3_MOD_WPRWG, IF_REAL, "Width dependence of prwg "), - IOP ("wprwb", BSIM3_MOD_WPRWB, IF_REAL, "Width dependence of prwb "), +IOP( "lprwg", BSIM3_MOD_LPRWG, IF_REAL, "Length dependence of prwg "), +IOP( "lprwb", BSIM3_MOD_LPRWB, IF_REAL, "Length dependence of prwb "), - IOP ("wprt", BSIM3_MOD_WPRT, IF_REAL, "Width dependence of prt"), - IOP ("weta0", BSIM3_MOD_WETA0, IF_REAL, "Width dependence of eta0"), - IOP ("wetab", BSIM3_MOD_WETAB, IF_REAL, "Width dependence of etab"), - IOP ("wpclm", BSIM3_MOD_WPCLM, IF_REAL, "Width dependence of pclm"), - IOP ("wpdiblc1", BSIM3_MOD_WPDIBL1, IF_REAL, "Width dependence of pdiblc1"), - IOP ("wpdiblc2", BSIM3_MOD_WPDIBL2, IF_REAL, "Width dependence of pdiblc2"), - IOP ("wpdiblcb", BSIM3_MOD_WPDIBLB, IF_REAL, "Width dependence of pdiblcb"), - IOP ("wpscbe1", BSIM3_MOD_WPSCBE1, IF_REAL, "Width dependence of pscbe1"), - IOP ("wpscbe2", BSIM3_MOD_WPSCBE2, IF_REAL, "Width dependence of pscbe2"), - IOP ("wpvag", BSIM3_MOD_WPVAG, IF_REAL, "Width dependence of pvag"), - IOP ("wwr", BSIM3_MOD_WWR, IF_REAL, "Width dependence of wr"), - IOP ("wdwg", BSIM3_MOD_WDWG, IF_REAL, "Width dependence of dwg"), - IOP ("wdwb", BSIM3_MOD_WDWB, IF_REAL, "Width dependence of dwb"), - IOP ("wb0", BSIM3_MOD_WB0, IF_REAL, "Width dependence of b0"), - IOP ("wb1", BSIM3_MOD_WB1, IF_REAL, "Width dependence of b1"), - IOP ("wcgsl", BSIM3_MOD_WCGSL, IF_REAL, "Width dependence of cgsl"), - IOP ("wcgdl", BSIM3_MOD_WCGDL, IF_REAL, "Width dependence of cgdl"), - IOP ("wckappa", BSIM3_MOD_WCKAPPA, IF_REAL, "Width dependence of ckappa"), - IOP ("wcf", BSIM3_MOD_WCF, IF_REAL, "Width dependence of cf"), - IOP ("wclc", BSIM3_MOD_WCLC, IF_REAL, "Width dependence of clc"), - IOP ("wcle", BSIM3_MOD_WCLE, IF_REAL, "Width dependence of cle"), - IOP ("walpha0", BSIM3_MOD_WALPHA0, IF_REAL, "Width dependence of alpha0"), - IOP ("walpha1", BSIM3_MOD_WALPHA1, IF_REAL, "Width dependence of alpha1"), - IOP ("wbeta0", BSIM3_MOD_WBETA0, IF_REAL, "Width dependence of beta0"), - IOP ("wvfbcv", BSIM3_MOD_WVFBCV, IF_REAL, "Width dependence of vfbcv"), - IOP ("wvfb", BSIM3_MOD_WVFB, IF_REAL, "Width dependence of vfb"), - IOP ("wacde", BSIM3_MOD_WACDE, IF_REAL, "Width dependence of acde"), - IOP ("wmoin", BSIM3_MOD_WMOIN, IF_REAL, "Width dependence of moin"), - IOP ("wnoff", BSIM3_MOD_WNOFF, IF_REAL, "Width dependence of noff"), - IOP ("wvoffcv", BSIM3_MOD_WVOFFCV, IF_REAL, "Width dependence of voffcv"), +IOP( "lprt", BSIM3_MOD_LPRT, IF_REAL, "Length dependence of prt "), +IOP( "leta0", BSIM3_MOD_LETA0, IF_REAL, "Length dependence of eta0"), +IOP( "letab", BSIM3_MOD_LETAB, IF_REAL, "Length dependence of etab"), +IOP( "lpclm", BSIM3_MOD_LPCLM, IF_REAL, "Length dependence of pclm"), +IOP( "lpdiblc1", BSIM3_MOD_LPDIBL1, IF_REAL, "Length dependence of pdiblc1"), +IOP( "lpdiblc2", BSIM3_MOD_LPDIBL2, IF_REAL, "Length dependence of pdiblc2"), +IOP( "lpdiblcb", BSIM3_MOD_LPDIBLB, IF_REAL, "Length dependence of pdiblcb"), +IOP( "lpscbe1", BSIM3_MOD_LPSCBE1, IF_REAL, "Length dependence of pscbe1"), +IOP( "lpscbe2", BSIM3_MOD_LPSCBE2, IF_REAL, "Length dependence of pscbe2"), +IOP( "lpvag", BSIM3_MOD_LPVAG, IF_REAL, "Length dependence of pvag"), +IOP( "lwr", BSIM3_MOD_LWR, IF_REAL, "Length dependence of wr"), +IOP( "ldwg", BSIM3_MOD_LDWG, IF_REAL, "Length dependence of dwg"), +IOP( "ldwb", BSIM3_MOD_LDWB, IF_REAL, "Length dependence of dwb"), +IOP( "lb0", BSIM3_MOD_LB0, IF_REAL, "Length dependence of b0"), +IOP( "lb1", BSIM3_MOD_LB1, IF_REAL, "Length dependence of b1"), +IOP( "lcgsl", BSIM3_MOD_LCGSL, IF_REAL, "Length dependence of cgsl"), +IOP( "lcgdl", BSIM3_MOD_LCGDL, IF_REAL, "Length dependence of cgdl"), +IOP( "lckappa", BSIM3_MOD_LCKAPPA, IF_REAL, "Length dependence of ckappa"), +IOP( "lcf", BSIM3_MOD_LCF, IF_REAL, "Length dependence of cf"), +IOP( "lclc", BSIM3_MOD_LCLC, IF_REAL, "Length dependence of clc"), +IOP( "lcle", BSIM3_MOD_LCLE, IF_REAL, "Length dependence of cle"), +IOP( "lalpha0", BSIM3_MOD_LALPHA0, IF_REAL, "Length dependence of alpha0"), +IOP( "lalpha1", BSIM3_MOD_LALPHA1, IF_REAL, "Length dependence of alpha1"), +IOP( "lbeta0", BSIM3_MOD_LBETA0, IF_REAL, "Length dependence of beta0"), +IOP( "lvfbcv", BSIM3_MOD_LVFBCV, IF_REAL, "Length dependence of vfbcv"), +IOP( "lvfb", BSIM3_MOD_LVFB, IF_REAL, "Length dependence of vfb"), +IOP( "lacde", BSIM3_MOD_LACDE, IF_REAL, "Length dependence of acde"), +IOP( "lmoin", BSIM3_MOD_LMOIN, IF_REAL, "Length dependence of moin"), +IOP( "lnoff", BSIM3_MOD_LNOFF, IF_REAL, "Length dependence of noff"), +IOP( "lvoffcv", BSIM3_MOD_LVOFFCV, IF_REAL, "Length dependence of voffcv"), +IOP( "wcdsc", BSIM3_MOD_WCDSC, IF_REAL, "Width dependence of cdsc"), +IOP( "wcdscb", BSIM3_MOD_WCDSCB, IF_REAL, "Width dependence of cdscb"), +IOP( "wcdscd", BSIM3_MOD_WCDSCD, IF_REAL, "Width dependence of cdscd"), +IOP( "wcit", BSIM3_MOD_WCIT, IF_REAL, "Width dependence of cit"), +IOP( "wnfactor", BSIM3_MOD_WNFACTOR, IF_REAL, "Width dependence of nfactor"), +IOP( "wxj", BSIM3_MOD_WXJ, IF_REAL, "Width dependence of xj"), +IOP( "wvsat", BSIM3_MOD_WVSAT, IF_REAL, "Width dependence of vsat"), +IOP( "wat", BSIM3_MOD_WAT, IF_REAL, "Width dependence of at"), +IOP( "wa0", BSIM3_MOD_WA0, IF_REAL, "Width dependence of a0"), +IOP( "wags", BSIM3_MOD_WAGS, IF_REAL, "Width dependence of ags"), +IOP( "wa1", BSIM3_MOD_WA1, IF_REAL, "Width dependence of a1"), +IOP( "wa2", BSIM3_MOD_WA2, IF_REAL, "Width dependence of a2"), +IOP( "wketa", BSIM3_MOD_WKETA, IF_REAL, "Width dependence of keta"), +IOP( "wnsub", BSIM3_MOD_WNSUB, IF_REAL, "Width dependence of nsub"), +IOP( "wnch", BSIM3_MOD_WNPEAK, IF_REAL, "Width dependence of nch"), +IOP( "wngate", BSIM3_MOD_WNGATE, IF_REAL, "Width dependence of ngate"), +IOP( "wgamma1", BSIM3_MOD_WGAMMA1, IF_REAL, "Width dependence of gamma1"), +IOP( "wgamma2", BSIM3_MOD_WGAMMA2, IF_REAL, "Width dependence of gamma2"), +IOP( "wvbx", BSIM3_MOD_WVBX, IF_REAL, "Width dependence of vbx"), +IOP( "wvbm", BSIM3_MOD_WVBM, IF_REAL, "Width dependence of vbm"), +IOP( "wxt", BSIM3_MOD_WXT, IF_REAL, "Width dependence of xt"), +IOP( "wk1", BSIM3_MOD_WK1, IF_REAL, "Width dependence of k1"), +IOP( "wkt1", BSIM3_MOD_WKT1, IF_REAL, "Width dependence of kt1"), +IOP( "wkt1l", BSIM3_MOD_WKT1L, IF_REAL, "Width dependence of kt1l"), +IOP( "wkt2", BSIM3_MOD_WKT2, IF_REAL, "Width dependence of kt2"), +IOP( "wk2", BSIM3_MOD_WK2, IF_REAL, "Width dependence of k2"), +IOP( "wk3", BSIM3_MOD_WK3, IF_REAL, "Width dependence of k3"), +IOP( "wk3b", BSIM3_MOD_WK3B, IF_REAL, "Width dependence of k3b"), +IOP( "ww0", BSIM3_MOD_WW0, IF_REAL, "Width dependence of w0"), +IOP( "wnlx", BSIM3_MOD_WNLX, IF_REAL, "Width dependence of nlx"), +IOP( "wdvt0", BSIM3_MOD_WDVT0, IF_REAL, "Width dependence of dvt0"), +IOP( "wdvt1", BSIM3_MOD_WDVT1, IF_REAL, "Width dependence of dvt1"), +IOP( "wdvt2", BSIM3_MOD_WDVT2, IF_REAL, "Width dependence of dvt2"), +IOP( "wdvt0w", BSIM3_MOD_WDVT0W, IF_REAL, "Width dependence of dvt0w"), +IOP( "wdvt1w", BSIM3_MOD_WDVT1W, IF_REAL, "Width dependence of dvt1w"), +IOP( "wdvt2w", BSIM3_MOD_WDVT2W, IF_REAL, "Width dependence of dvt2w"), +IOP( "wdrout", BSIM3_MOD_WDROUT, IF_REAL, "Width dependence of drout"), +IOP( "wdsub", BSIM3_MOD_WDSUB, IF_REAL, "Width dependence of dsub"), +IOP( "wvth0", BSIM3_MOD_WVTH0, IF_REAL,"Width dependence of vto"), +IOP( "wvtho", BSIM3_MOD_WVTH0, IF_REAL,"Width dependence of vto"), +IOP( "wua", BSIM3_MOD_WUA, IF_REAL, "Width dependence of ua"), +IOP( "wua1", BSIM3_MOD_WUA1, IF_REAL, "Width dependence of ua1"), +IOP( "wub", BSIM3_MOD_WUB, IF_REAL, "Width dependence of ub"), +IOP( "wub1", BSIM3_MOD_WUB1, IF_REAL, "Width dependence of ub1"), +IOP( "wuc", BSIM3_MOD_WUC, IF_REAL, "Width dependence of uc"), +IOP( "wuc1", BSIM3_MOD_WUC1, IF_REAL, "Width dependence of uc1"), +IOP( "wu0", BSIM3_MOD_WU0, IF_REAL, "Width dependence of u0"), +IOP( "wute", BSIM3_MOD_WUTE, IF_REAL, "Width dependence of ute"), +IOP( "wvoff", BSIM3_MOD_WVOFF, IF_REAL, "Width dependence of voff"), +IOP( "welm", BSIM3_MOD_WELM, IF_REAL, "Width dependence of elm"), +IOP( "wdelta", BSIM3_MOD_WDELTA, IF_REAL, "Width dependence of delta"), +IOP( "wrdsw", BSIM3_MOD_WRDSW, IF_REAL, "Width dependence of rdsw "), - IOP ("pcdsc", BSIM3_MOD_PCDSC, IF_REAL, "Cross-term dependence of cdsc"), - IOP ("pcdscb", BSIM3_MOD_PCDSCB, IF_REAL, "Cross-term dependence of cdscb"), - IOP ("pcdscd", BSIM3_MOD_PCDSCD, IF_REAL, "Cross-term dependence of cdscd"), - IOP ("pcit", BSIM3_MOD_PCIT, IF_REAL, "Cross-term dependence of cit"), - IOP ("pnfactor", BSIM3_MOD_PNFACTOR, IF_REAL, "Cross-term dependence of nfactor"), - IOP ("pxj", BSIM3_MOD_PXJ, IF_REAL, "Cross-term dependence of xj"), - IOP ("pvsat", BSIM3_MOD_PVSAT, IF_REAL, "Cross-term dependence of vsat"), - IOP ("pat", BSIM3_MOD_PAT, IF_REAL, "Cross-term dependence of at"), - IOP ("pa0", BSIM3_MOD_PA0, IF_REAL, "Cross-term dependence of a0"), - IOP ("pags", BSIM3_MOD_PAGS, IF_REAL, "Cross-term dependence of ags"), - IOP ("pa1", BSIM3_MOD_PA1, IF_REAL, "Cross-term dependence of a1"), - IOP ("pa2", BSIM3_MOD_PA2, IF_REAL, "Cross-term dependence of a2"), - IOP ("pketa", BSIM3_MOD_PKETA, IF_REAL, "Cross-term dependence of keta"), - IOP ("pnsub", BSIM3_MOD_PNSUB, IF_REAL, "Cross-term dependence of nsub"), - IOP ("pnch", BSIM3_MOD_PNPEAK, IF_REAL, "Cross-term dependence of nch"), - IOP ("pngate", BSIM3_MOD_PNGATE, IF_REAL, "Cross-term dependence of ngate"), - IOP ("pgamma1", BSIM3_MOD_PGAMMA1, IF_REAL, "Cross-term dependence of gamma1"), - IOP ("pgamma2", BSIM3_MOD_PGAMMA2, IF_REAL, "Cross-term dependence of gamma2"), - IOP ("pvbx", BSIM3_MOD_PVBX, IF_REAL, "Cross-term dependence of vbx"), - IOP ("pvbm", BSIM3_MOD_PVBM, IF_REAL, "Cross-term dependence of vbm"), - IOP ("pxt", BSIM3_MOD_PXT, IF_REAL, "Cross-term dependence of xt"), - IOP ("pk1", BSIM3_MOD_PK1, IF_REAL, "Cross-term dependence of k1"), - IOP ("pkt1", BSIM3_MOD_PKT1, IF_REAL, "Cross-term dependence of kt1"), - IOP ("pkt1l", BSIM3_MOD_PKT1L, IF_REAL, "Cross-term dependence of kt1l"), - IOP ("pkt2", BSIM3_MOD_PKT2, IF_REAL, "Cross-term dependence of kt2"), - IOP ("pk2", BSIM3_MOD_PK2, IF_REAL, "Cross-term dependence of k2"), - IOP ("pk3", BSIM3_MOD_PK3, IF_REAL, "Cross-term dependence of k3"), - IOP ("pk3b", BSIM3_MOD_PK3B, IF_REAL, "Cross-term dependence of k3b"), - IOP ("pw0", BSIM3_MOD_PW0, IF_REAL, "Cross-term dependence of w0"), - IOP ("pnlx", BSIM3_MOD_PNLX, IF_REAL, "Cross-term dependence of nlx"), - IOP ("pdvt0", BSIM3_MOD_PDVT0, IF_REAL, "Cross-term dependence of dvt0"), - IOP ("pdvt1", BSIM3_MOD_PDVT1, IF_REAL, "Cross-term dependence of dvt1"), - IOP ("pdvt2", BSIM3_MOD_PDVT2, IF_REAL, "Cross-term dependence of dvt2"), - IOP ("pdvt0w", BSIM3_MOD_PDVT0W, IF_REAL, "Cross-term dependence of dvt0w"), - IOP ("pdvt1w", BSIM3_MOD_PDVT1W, IF_REAL, "Cross-term dependence of dvt1w"), - IOP ("pdvt2w", BSIM3_MOD_PDVT2W, IF_REAL, "Cross-term dependence of dvt2w"), - IOP ("pdrout", BSIM3_MOD_PDROUT, IF_REAL, "Cross-term dependence of drout"), - IOP ("pdsub", BSIM3_MOD_PDSUB, IF_REAL, "Cross-term dependence of dsub"), - IOP ("pvth0", BSIM3_MOD_PVTH0, IF_REAL, "Cross-term dependence of vto"), - IOP ("pvtho", BSIM3_MOD_PVTH0, IF_REAL, "Cross-term dependence of vto"), - IOP ("pua", BSIM3_MOD_PUA, IF_REAL, "Cross-term dependence of ua"), - IOP ("pua1", BSIM3_MOD_PUA1, IF_REAL, "Cross-term dependence of ua1"), - IOP ("pub", BSIM3_MOD_PUB, IF_REAL, "Cross-term dependence of ub"), - IOP ("pub1", BSIM3_MOD_PUB1, IF_REAL, "Cross-term dependence of ub1"), - IOP ("puc", BSIM3_MOD_PUC, IF_REAL, "Cross-term dependence of uc"), - IOP ("puc1", BSIM3_MOD_PUC1, IF_REAL, "Cross-term dependence of uc1"), - IOP ("pu0", BSIM3_MOD_PU0, IF_REAL, "Cross-term dependence of u0"), - IOP ("pute", BSIM3_MOD_PUTE, IF_REAL, "Cross-term dependence of ute"), - IOP ("pvoff", BSIM3_MOD_PVOFF, IF_REAL, "Cross-term dependence of voff"), - IOP ("pelm", BSIM3_MOD_PELM, IF_REAL, "Cross-term dependence of elm"), - IOP ("pdelta", BSIM3_MOD_PDELTA, IF_REAL, "Cross-term dependence of delta"), - IOP ("prdsw", BSIM3_MOD_PRDSW, IF_REAL, "Cross-term dependence of rdsw "), +IOP( "wprwg", BSIM3_MOD_WPRWG, IF_REAL, "Width dependence of prwg "), +IOP( "wprwb", BSIM3_MOD_WPRWB, IF_REAL, "Width dependence of prwb "), - IOP ("pprwg", BSIM3_MOD_PPRWG, IF_REAL, "Cross-term dependence of prwg "), - IOP ("pprwb", BSIM3_MOD_PPRWB, IF_REAL, "Cross-term dependence of prwb "), +IOP( "wprt", BSIM3_MOD_WPRT, IF_REAL, "Width dependence of prt"), +IOP( "weta0", BSIM3_MOD_WETA0, IF_REAL, "Width dependence of eta0"), +IOP( "wetab", BSIM3_MOD_WETAB, IF_REAL, "Width dependence of etab"), +IOP( "wpclm", BSIM3_MOD_WPCLM, IF_REAL, "Width dependence of pclm"), +IOP( "wpdiblc1", BSIM3_MOD_WPDIBL1, IF_REAL, "Width dependence of pdiblc1"), +IOP( "wpdiblc2", BSIM3_MOD_WPDIBL2, IF_REAL, "Width dependence of pdiblc2"), +IOP( "wpdiblcb", BSIM3_MOD_WPDIBLB, IF_REAL, "Width dependence of pdiblcb"), +IOP( "wpscbe1", BSIM3_MOD_WPSCBE1, IF_REAL, "Width dependence of pscbe1"), +IOP( "wpscbe2", BSIM3_MOD_WPSCBE2, IF_REAL, "Width dependence of pscbe2"), +IOP( "wpvag", BSIM3_MOD_WPVAG, IF_REAL, "Width dependence of pvag"), +IOP( "wwr", BSIM3_MOD_WWR, IF_REAL, "Width dependence of wr"), +IOP( "wdwg", BSIM3_MOD_WDWG, IF_REAL, "Width dependence of dwg"), +IOP( "wdwb", BSIM3_MOD_WDWB, IF_REAL, "Width dependence of dwb"), +IOP( "wb0", BSIM3_MOD_WB0, IF_REAL, "Width dependence of b0"), +IOP( "wb1", BSIM3_MOD_WB1, IF_REAL, "Width dependence of b1"), +IOP( "wcgsl", BSIM3_MOD_WCGSL, IF_REAL, "Width dependence of cgsl"), +IOP( "wcgdl", BSIM3_MOD_WCGDL, IF_REAL, "Width dependence of cgdl"), +IOP( "wckappa", BSIM3_MOD_WCKAPPA, IF_REAL, "Width dependence of ckappa"), +IOP( "wcf", BSIM3_MOD_WCF, IF_REAL, "Width dependence of cf"), +IOP( "wclc", BSIM3_MOD_WCLC, IF_REAL, "Width dependence of clc"), +IOP( "wcle", BSIM3_MOD_WCLE, IF_REAL, "Width dependence of cle"), +IOP( "walpha0", BSIM3_MOD_WALPHA0, IF_REAL, "Width dependence of alpha0"), +IOP( "walpha1", BSIM3_MOD_WALPHA1, IF_REAL, "Width dependence of alpha1"), +IOP( "wbeta0", BSIM3_MOD_WBETA0, IF_REAL, "Width dependence of beta0"), +IOP( "wvfbcv", BSIM3_MOD_WVFBCV, IF_REAL, "Width dependence of vfbcv"), +IOP( "wvfb", BSIM3_MOD_WVFB, IF_REAL, "Width dependence of vfb"), +IOP( "wacde", BSIM3_MOD_WACDE, IF_REAL, "Width dependence of acde"), +IOP( "wmoin", BSIM3_MOD_WMOIN, IF_REAL, "Width dependence of moin"), +IOP( "wnoff", BSIM3_MOD_WNOFF, IF_REAL, "Width dependence of noff"), +IOP( "wvoffcv", BSIM3_MOD_WVOFFCV, IF_REAL, "Width dependence of voffcv"), - IOP ("pprt", BSIM3_MOD_PPRT, IF_REAL, "Cross-term dependence of prt "), - IOP ("peta0", BSIM3_MOD_PETA0, IF_REAL, "Cross-term dependence of eta0"), - IOP ("petab", BSIM3_MOD_PETAB, IF_REAL, "Cross-term dependence of etab"), - IOP ("ppclm", BSIM3_MOD_PPCLM, IF_REAL, "Cross-term dependence of pclm"), - IOP ("ppdiblc1", BSIM3_MOD_PPDIBL1, IF_REAL, "Cross-term dependence of pdiblc1"), - IOP ("ppdiblc2", BSIM3_MOD_PPDIBL2, IF_REAL, "Cross-term dependence of pdiblc2"), - IOP ("ppdiblcb", BSIM3_MOD_PPDIBLB, IF_REAL, "Cross-term dependence of pdiblcb"), - IOP ("ppscbe1", BSIM3_MOD_PPSCBE1, IF_REAL, "Cross-term dependence of pscbe1"), - IOP ("ppscbe2", BSIM3_MOD_PPSCBE2, IF_REAL, "Cross-term dependence of pscbe2"), - IOP ("ppvag", BSIM3_MOD_PPVAG, IF_REAL, "Cross-term dependence of pvag"), - IOP ("pwr", BSIM3_MOD_PWR, IF_REAL, "Cross-term dependence of wr"), - IOP ("pdwg", BSIM3_MOD_PDWG, IF_REAL, "Cross-term dependence of dwg"), - IOP ("pdwb", BSIM3_MOD_PDWB, IF_REAL, "Cross-term dependence of dwb"), - IOP ("pb0", BSIM3_MOD_PB0, IF_REAL, "Cross-term dependence of b0"), - IOP ("pb1", BSIM3_MOD_PB1, IF_REAL, "Cross-term dependence of b1"), - IOP ("pcgsl", BSIM3_MOD_PCGSL, IF_REAL, "Cross-term dependence of cgsl"), - IOP ("pcgdl", BSIM3_MOD_PCGDL, IF_REAL, "Cross-term dependence of cgdl"), - IOP ("pckappa", BSIM3_MOD_PCKAPPA, IF_REAL, "Cross-term dependence of ckappa"), - IOP ("pcf", BSIM3_MOD_PCF, IF_REAL, "Cross-term dependence of cf"), - IOP ("pclc", BSIM3_MOD_PCLC, IF_REAL, "Cross-term dependence of clc"), - IOP ("pcle", BSIM3_MOD_PCLE, IF_REAL, "Cross-term dependence of cle"), - IOP ("palpha0", BSIM3_MOD_PALPHA0, IF_REAL, "Cross-term dependence of alpha0"), - IOP ("palpha1", BSIM3_MOD_PALPHA1, IF_REAL, "Cross-term dependence of alpha1"), - IOP ("pbeta0", BSIM3_MOD_PBETA0, IF_REAL, "Cross-term dependence of beta0"), - IOP ("pvfbcv", BSIM3_MOD_PVFBCV, IF_REAL, "Cross-term dependence of vfbcv"), - IOP ("pvfb", BSIM3_MOD_PVFB, IF_REAL, "Cross-term dependence of vfb"), - IOP ("pacde", BSIM3_MOD_PACDE, IF_REAL, "Cross-term dependence of acde"), - IOP ("pmoin", BSIM3_MOD_PMOIN, IF_REAL, "Cross-term dependence of moin"), - IOP ("pnoff", BSIM3_MOD_PNOFF, IF_REAL, "Cross-term dependence of noff"), - IOP ("pvoffcv", BSIM3_MOD_PVOFFCV, IF_REAL, "Cross-term dependence of voffcv"), +IOP( "pcdsc", BSIM3_MOD_PCDSC, IF_REAL, "Cross-term dependence of cdsc"), +IOP( "pcdscb", BSIM3_MOD_PCDSCB, IF_REAL, "Cross-term dependence of cdscb"), +IOP( "pcdscd", BSIM3_MOD_PCDSCD, IF_REAL, "Cross-term dependence of cdscd"), +IOP( "pcit", BSIM3_MOD_PCIT, IF_REAL, "Cross-term dependence of cit"), +IOP( "pnfactor", BSIM3_MOD_PNFACTOR, IF_REAL, "Cross-term dependence of nfactor"), +IOP( "pxj", BSIM3_MOD_PXJ, IF_REAL, "Cross-term dependence of xj"), +IOP( "pvsat", BSIM3_MOD_PVSAT, IF_REAL, "Cross-term dependence of vsat"), +IOP( "pat", BSIM3_MOD_PAT, IF_REAL, "Cross-term dependence of at"), +IOP( "pa0", BSIM3_MOD_PA0, IF_REAL, "Cross-term dependence of a0"), +IOP( "pags", BSIM3_MOD_PAGS, IF_REAL, "Cross-term dependence of ags"), +IOP( "pa1", BSIM3_MOD_PA1, IF_REAL, "Cross-term dependence of a1"), +IOP( "pa2", BSIM3_MOD_PA2, IF_REAL, "Cross-term dependence of a2"), +IOP( "pketa", BSIM3_MOD_PKETA, IF_REAL, "Cross-term dependence of keta"), +IOP( "pnsub", BSIM3_MOD_PNSUB, IF_REAL, "Cross-term dependence of nsub"), +IOP( "pnch", BSIM3_MOD_PNPEAK, IF_REAL, "Cross-term dependence of nch"), +IOP( "pngate", BSIM3_MOD_PNGATE, IF_REAL, "Cross-term dependence of ngate"), +IOP( "pgamma1", BSIM3_MOD_PGAMMA1, IF_REAL, "Cross-term dependence of gamma1"), +IOP( "pgamma2", BSIM3_MOD_PGAMMA2, IF_REAL, "Cross-term dependence of gamma2"), +IOP( "pvbx", BSIM3_MOD_PVBX, IF_REAL, "Cross-term dependence of vbx"), +IOP( "pvbm", BSIM3_MOD_PVBM, IF_REAL, "Cross-term dependence of vbm"), +IOP( "pxt", BSIM3_MOD_PXT, IF_REAL, "Cross-term dependence of xt"), +IOP( "pk1", BSIM3_MOD_PK1, IF_REAL, "Cross-term dependence of k1"), +IOP( "pkt1", BSIM3_MOD_PKT1, IF_REAL, "Cross-term dependence of kt1"), +IOP( "pkt1l", BSIM3_MOD_PKT1L, IF_REAL, "Cross-term dependence of kt1l"), +IOP( "pkt2", BSIM3_MOD_PKT2, IF_REAL, "Cross-term dependence of kt2"), +IOP( "pk2", BSIM3_MOD_PK2, IF_REAL, "Cross-term dependence of k2"), +IOP( "pk3", BSIM3_MOD_PK3, IF_REAL, "Cross-term dependence of k3"), +IOP( "pk3b", BSIM3_MOD_PK3B, IF_REAL, "Cross-term dependence of k3b"), +IOP( "pw0", BSIM3_MOD_PW0, IF_REAL, "Cross-term dependence of w0"), +IOP( "pnlx", BSIM3_MOD_PNLX, IF_REAL, "Cross-term dependence of nlx"), +IOP( "pdvt0", BSIM3_MOD_PDVT0, IF_REAL, "Cross-term dependence of dvt0"), +IOP( "pdvt1", BSIM3_MOD_PDVT1, IF_REAL, "Cross-term dependence of dvt1"), +IOP( "pdvt2", BSIM3_MOD_PDVT2, IF_REAL, "Cross-term dependence of dvt2"), +IOP( "pdvt0w", BSIM3_MOD_PDVT0W, IF_REAL, "Cross-term dependence of dvt0w"), +IOP( "pdvt1w", BSIM3_MOD_PDVT1W, IF_REAL, "Cross-term dependence of dvt1w"), +IOP( "pdvt2w", BSIM3_MOD_PDVT2W, IF_REAL, "Cross-term dependence of dvt2w"), +IOP( "pdrout", BSIM3_MOD_PDROUT, IF_REAL, "Cross-term dependence of drout"), +IOP( "pdsub", BSIM3_MOD_PDSUB, IF_REAL, "Cross-term dependence of dsub"), +IOP( "pvth0", BSIM3_MOD_PVTH0, IF_REAL,"Cross-term dependence of vto"), +IOP( "pvtho", BSIM3_MOD_PVTH0, IF_REAL,"Cross-term dependence of vto"), +IOP( "pua", BSIM3_MOD_PUA, IF_REAL, "Cross-term dependence of ua"), +IOP( "pua1", BSIM3_MOD_PUA1, IF_REAL, "Cross-term dependence of ua1"), +IOP( "pub", BSIM3_MOD_PUB, IF_REAL, "Cross-term dependence of ub"), +IOP( "pub1", BSIM3_MOD_PUB1, IF_REAL, "Cross-term dependence of ub1"), +IOP( "puc", BSIM3_MOD_PUC, IF_REAL, "Cross-term dependence of uc"), +IOP( "puc1", BSIM3_MOD_PUC1, IF_REAL, "Cross-term dependence of uc1"), +IOP( "pu0", BSIM3_MOD_PU0, IF_REAL, "Cross-term dependence of u0"), +IOP( "pute", BSIM3_MOD_PUTE, IF_REAL, "Cross-term dependence of ute"), +IOP( "pvoff", BSIM3_MOD_PVOFF, IF_REAL, "Cross-term dependence of voff"), +IOP( "pelm", BSIM3_MOD_PELM, IF_REAL, "Cross-term dependence of elm"), +IOP( "pdelta", BSIM3_MOD_PDELTA, IF_REAL, "Cross-term dependence of delta"), +IOP( "prdsw", BSIM3_MOD_PRDSW, IF_REAL, "Cross-term dependence of rdsw "), - IOP ("noia", BSIM3_MOD_NOIA, IF_REAL, "Flicker noise parameter"), - IOP ("noib", BSIM3_MOD_NOIB, IF_REAL, "Flicker noise parameter"), - IOP ("noic", BSIM3_MOD_NOIC, IF_REAL, "Flicker noise parameter"), - IOP ("em", BSIM3_MOD_EM, IF_REAL, "Flicker noise parameter"), - IOP ("ef", BSIM3_MOD_EF, IF_REAL, "Flicker noise frequency exponent"), - IOP ("af", BSIM3_MOD_AF, IF_REAL, "Flicker noise exponent"), - IOP ("kf", BSIM3_MOD_KF, IF_REAL, "Flicker noise coefficient"), +IOP( "pprwg", BSIM3_MOD_PPRWG, IF_REAL, "Cross-term dependence of prwg "), +IOP( "pprwb", BSIM3_MOD_PPRWB, IF_REAL, "Cross-term dependence of prwb "), - IP ("nmos", BSIM3_MOD_NMOS, IF_FLAG, "Flag to indicate NMOS"), - IP ("pmos", BSIM3_MOD_PMOS, IF_FLAG, "Flag to indicate PMOS"), +IOP( "pprt", BSIM3_MOD_PPRT, IF_REAL, "Cross-term dependence of prt "), +IOP( "peta0", BSIM3_MOD_PETA0, IF_REAL, "Cross-term dependence of eta0"), +IOP( "petab", BSIM3_MOD_PETAB, IF_REAL, "Cross-term dependence of etab"), +IOP( "ppclm", BSIM3_MOD_PPCLM, IF_REAL, "Cross-term dependence of pclm"), +IOP( "ppdiblc1", BSIM3_MOD_PPDIBL1, IF_REAL, "Cross-term dependence of pdiblc1"), +IOP( "ppdiblc2", BSIM3_MOD_PPDIBL2, IF_REAL, "Cross-term dependence of pdiblc2"), +IOP( "ppdiblcb", BSIM3_MOD_PPDIBLB, IF_REAL, "Cross-term dependence of pdiblcb"), +IOP( "ppscbe1", BSIM3_MOD_PPSCBE1, IF_REAL, "Cross-term dependence of pscbe1"), +IOP( "ppscbe2", BSIM3_MOD_PPSCBE2, IF_REAL, "Cross-term dependence of pscbe2"), +IOP( "ppvag", BSIM3_MOD_PPVAG, IF_REAL, "Cross-term dependence of pvag"), +IOP( "pwr", BSIM3_MOD_PWR, IF_REAL, "Cross-term dependence of wr"), +IOP( "pdwg", BSIM3_MOD_PDWG, IF_REAL, "Cross-term dependence of dwg"), +IOP( "pdwb", BSIM3_MOD_PDWB, IF_REAL, "Cross-term dependence of dwb"), +IOP( "pb0", BSIM3_MOD_PB0, IF_REAL, "Cross-term dependence of b0"), +IOP( "pb1", BSIM3_MOD_PB1, IF_REAL, "Cross-term dependence of b1"), +IOP( "pcgsl", BSIM3_MOD_PCGSL, IF_REAL, "Cross-term dependence of cgsl"), +IOP( "pcgdl", BSIM3_MOD_PCGDL, IF_REAL, "Cross-term dependence of cgdl"), +IOP( "pckappa", BSIM3_MOD_PCKAPPA, IF_REAL, "Cross-term dependence of ckappa"), +IOP( "pcf", BSIM3_MOD_PCF, IF_REAL, "Cross-term dependence of cf"), +IOP( "pclc", BSIM3_MOD_PCLC, IF_REAL, "Cross-term dependence of clc"), +IOP( "pcle", BSIM3_MOD_PCLE, IF_REAL, "Cross-term dependence of cle"), +IOP( "palpha0", BSIM3_MOD_PALPHA0, IF_REAL, "Cross-term dependence of alpha0"), +IOP( "palpha1", BSIM3_MOD_PALPHA1, IF_REAL, "Cross-term dependence of alpha1"), +IOP( "pbeta0", BSIM3_MOD_PBETA0, IF_REAL, "Cross-term dependence of beta0"), +IOP( "pvfbcv", BSIM3_MOD_PVFBCV, IF_REAL, "Cross-term dependence of vfbcv"), +IOP( "pvfb", BSIM3_MOD_PVFB, IF_REAL, "Cross-term dependence of vfb"), +IOP( "pacde", BSIM3_MOD_PACDE, IF_REAL, "Cross-term dependence of acde"), +IOP( "pmoin", BSIM3_MOD_PMOIN, IF_REAL, "Cross-term dependence of moin"), +IOP( "pnoff", BSIM3_MOD_PNOFF, IF_REAL, "Cross-term dependence of noff"), +IOP( "pvoffcv", BSIM3_MOD_PVOFFCV, IF_REAL, "Cross-term dependence of voffcv"), + +IOP( "noia", BSIM3_MOD_NOIA, IF_REAL, "Flicker noise parameter"), +IOP( "noib", BSIM3_MOD_NOIB, IF_REAL, "Flicker noise parameter"), +IOP( "noic", BSIM3_MOD_NOIC, IF_REAL, "Flicker noise parameter"), +IOP( "em", BSIM3_MOD_EM, IF_REAL, "Flicker noise parameter"), +IOP( "ef", BSIM3_MOD_EF, IF_REAL, "Flicker noise frequency exponent"), +IOP( "af", BSIM3_MOD_AF, IF_REAL, "Flicker noise exponent"), +IOP( "kf", BSIM3_MOD_KF, IF_REAL, "Flicker noise coefficient"), + +IP( "nmos", BSIM3_MOD_NMOS, IF_FLAG, "Flag to indicate NMOS"), +IP( "pmos", BSIM3_MOD_PMOS, IF_FLAG, "Flag to indicate PMOS"), }; char *BSIM3names[] = { - "Drain", - "Gate", - "Source", - "Bulk", - "Charge" + "Drain", + "Gate", + "Source", + "Bulk", + "Charge" }; -int BSIM3nSize = NUMELEMS (BSIM3names); -int BSIM3pTSize = NUMELEMS (BSIM3pTable); -int BSIM3mPTSize = NUMELEMS (BSIM3mPTable); -int BSIM3iSize = sizeof (BSIM3instance); -int BSIM3mSize = sizeof (BSIM3model); +int BSIM3nSize = NUMELEMS(BSIM3names); +int BSIM3pTSize = NUMELEMS(BSIM3pTable); +int BSIM3mPTSize = NUMELEMS(BSIM3mPTable); +int BSIM3iSize = sizeof(BSIM3instance); +int BSIM3mSize = sizeof(BSIM3model); + + + diff --git a/src/spicelib/devices/bsim3/b3acld.c b/src/spicelib/devices/bsim3/b3acld.c index 0672c3ff4..055fc2d74 100644 --- a/src/spicelib/devices/bsim3/b3acld.c +++ b/src/spicelib/devices/bsim3/b3acld.c @@ -1,22 +1,14 @@ +/**** BSIM3v3.2.4, Released by Xuemei Xi 12/14/2001 ****/ + /********** * Copyright 2001 Regents of the University of California. All rights reserved. * File: b3acld.c of BSIM3v3.2.4 * Author: 1995 Min-Chie Jeng and Mansun Chan * Author: 1997-1999 Weidong Liu. * Author: 2001 Xuemei Xi - * Modified by Paolo Nenzi 2002 + * Modified by Paolo Nenzi 2002 and Dietmar Warning 2003 **********/ -/* - * Release Notes: - * BSIM3v3.2.4, Released by Xuemei Xi 12/14/2001 - * BSIM3v3.2.3, Released by Xuemei Xi 10/05/2001 - * BSIM3v3.2.2, Released by Weidong Liu 04/20/1999 - * BSIM3v3.2, Released by Weidong Liu 06/16/1998 - */ - -/*************************************/ - #include "ngspice.h" #include "cktdefs.h" #include "bsim3def.h" @@ -25,426 +17,347 @@ int -BSIM3acLoad (GENmodel * inModel, CKTcircuit * ckt) +BSIM3acLoad (GENmodel *inModel, CKTcircuit *ckt) { - BSIM3model *model = (BSIM3model *) inModel; - BSIM3instance *here; - double xcggb, xcgdb, xcgsb, xcbgb, xcbdb, xcbsb, xcddb, xcssb, xcdgb; - double gdpr, gspr, gds, gbd, gbs, capbd, capbs, xcsgb, xcdsb, xcsdb; - double cggb, cgdb, cgsb, cbgb, cbdb, cbsb, cddb, cdgb, cdsb, omega; - double GSoverlapCap, GDoverlapCap, GBoverlapCap, FwdSum, RevSum, Gm, - Gmbs; - double dxpart, sxpart, xgtg, xgtd, xgts, xgtb, xcqgb, xcqdb, xcqsb, - xcqbb; - double gbspsp, gbbdp, gbbsp, gbspg, gbspb; - double gbspdp, gbdpdp, gbdpg, gbdpb, gbdpsp; - double ddxpart_dVd, ddxpart_dVg, ddxpart_dVb, ddxpart_dVs; - double dsxpart_dVd, dsxpart_dVg, dsxpart_dVb, dsxpart_dVs; - double T1, CoxWL, qcheq, Cdg, Cdd, Cds, Cdb, Csg, Csd, Css, Csb; - double ScalingFactor = 1.0e-9; - double m; - - omega = ckt->CKTomega; - for (; model != NULL; model = model->BSIM3nextModel) - { - for (here = model->BSIM3instances; here != NULL; - here = here->BSIM3nextInstance) - { - - if (here->BSIM3owner != ARCHme) - continue; - - if (here->BSIM3mode >= 0) - { - Gm = here->BSIM3gm; - Gmbs = here->BSIM3gmbs; - FwdSum = Gm + Gmbs; - RevSum = 0.0; - - gbbdp = -here->BSIM3gbds; - gbbsp = here->BSIM3gbds + here->BSIM3gbgs + - here->BSIM3gbbs; - - gbdpg = here->BSIM3gbgs; - gbdpb = here->BSIM3gbbs; - gbdpdp = here->BSIM3gbds; - gbdpsp = -(gbdpg + gbdpb + gbdpdp); - - gbspdp = 0.0; - gbspg = 0.0; - gbspb = 0.0; - gbspsp = 0.0; - - if (here->BSIM3nqsMod == 0) - { - cggb = here->BSIM3cggb; - cgsb = here->BSIM3cgsb; - cgdb = here->BSIM3cgdb; - - cbgb = here->BSIM3cbgb; - cbsb = here->BSIM3cbsb; - cbdb = here->BSIM3cbdb; - - cdgb = here->BSIM3cdgb; - cdsb = here->BSIM3cdsb; - cddb = here->BSIM3cddb; - - xgtg = xgtd = xgts = xgtb = 0.0; - sxpart = 0.6; - dxpart = 0.4; - ddxpart_dVd = ddxpart_dVg = - ddxpart_dVb = ddxpart_dVs = - 0.0; - dsxpart_dVd = dsxpart_dVg = - dsxpart_dVb = dsxpart_dVs = - 0.0; - } - else - { - cggb = cgdb = cgsb = 0.0; - cbgb = cbdb = cbsb = 0.0; - cdgb = cddb = cdsb = 0.0; - - xgtg = here->BSIM3gtg; - xgtd = here->BSIM3gtd; - xgts = here->BSIM3gts; - xgtb = here->BSIM3gtb; - - xcqgb = here->BSIM3cqgb * omega; - xcqdb = here->BSIM3cqdb * omega; - xcqsb = here->BSIM3cqsb * omega; - xcqbb = here->BSIM3cqbb * omega; - - CoxWL = model->BSIM3cox * - here->pParam->BSIM3weffCV * - here->pParam->BSIM3leffCV; - qcheq = -(here->BSIM3qgate + - here->BSIM3qbulk); - if (fabs (qcheq) <= 1.0e-5 * CoxWL) - { - if (model->BSIM3xpart < 0.5) - { - dxpart = 0.4; - } - else if (model->BSIM3xpart > - 0.5) - { - dxpart = 0.0; - } - else - { - dxpart = 0.5; - } - ddxpart_dVd = ddxpart_dVg = - ddxpart_dVb = - ddxpart_dVs = 0.0; - } - else - { - dxpart = here->BSIM3qdrn / - qcheq; - Cdd = here->BSIM3cddb; - Csd = -(here->BSIM3cgdb + - here->BSIM3cddb + - here->BSIM3cbdb); - ddxpart_dVd = - (Cdd - - dxpart * (Cdd + - Csd)) / - qcheq; - Cdg = here->BSIM3cdgb; - Csg = -(here->BSIM3cggb + - here->BSIM3cdgb + - here->BSIM3cbgb); - ddxpart_dVg = - (Cdg - - dxpart * (Cdg + - Csg)) / - qcheq; - - Cds = here->BSIM3cdsb; - Css = -(here->BSIM3cgsb + - here->BSIM3cdsb + - here->BSIM3cbsb); - ddxpart_dVs = - (Cds - - dxpart * (Cds + - Css)) / - qcheq; - - ddxpart_dVb = - -(ddxpart_dVd + - ddxpart_dVg + - ddxpart_dVs); - } - sxpart = 1.0 - dxpart; - dsxpart_dVd = -ddxpart_dVd; - dsxpart_dVg = -ddxpart_dVg; - dsxpart_dVs = -ddxpart_dVs; - dsxpart_dVb = - -(dsxpart_dVd + dsxpart_dVg + - dsxpart_dVs); - } - } - else - { - Gm = -here->BSIM3gm; - Gmbs = -here->BSIM3gmbs; - FwdSum = 0.0; - RevSum = -(Gm + Gmbs); - - gbbsp = -here->BSIM3gbds; - gbbdp = here->BSIM3gbds + here->BSIM3gbgs + - here->BSIM3gbbs; - - gbdpg = 0.0; - gbdpsp = 0.0; - gbdpb = 0.0; - gbdpdp = 0.0; - - gbspg = here->BSIM3gbgs; - gbspsp = here->BSIM3gbds; - gbspb = here->BSIM3gbbs; - gbspdp = -(gbspg + gbspsp + gbspb); - - if (here->BSIM3nqsMod == 0) - { - cggb = here->BSIM3cggb; - cgsb = here->BSIM3cgdb; - cgdb = here->BSIM3cgsb; - - cbgb = here->BSIM3cbgb; - cbsb = here->BSIM3cbdb; - cbdb = here->BSIM3cbsb; - - cdgb = -(here->BSIM3cdgb + cggb + - cbgb); - cdsb = -(here->BSIM3cddb + cgsb + - cbsb); - cddb = -(here->BSIM3cdsb + cgdb + - cbdb); - - xgtg = xgtd = xgts = xgtb = 0.0; - sxpart = 0.4; - dxpart = 0.6; - ddxpart_dVd = ddxpart_dVg = - ddxpart_dVb = ddxpart_dVs = - 0.0; - dsxpart_dVd = dsxpart_dVg = - dsxpart_dVb = dsxpart_dVs = - 0.0; - } - else - { - cggb = cgdb = cgsb = 0.0; - cbgb = cbdb = cbsb = 0.0; - cdgb = cddb = cdsb = 0.0; - - xgtg = here->BSIM3gtg; - xgtd = here->BSIM3gts; - xgts = here->BSIM3gtd; - xgtb = here->BSIM3gtb; - - xcqgb = here->BSIM3cqgb * omega; - xcqdb = here->BSIM3cqsb * omega; - xcqsb = here->BSIM3cqdb * omega; - xcqbb = here->BSIM3cqbb * omega; - - CoxWL = model->BSIM3cox * - here->pParam->BSIM3weffCV * - here->pParam->BSIM3leffCV; - qcheq = -(here->BSIM3qgate + - here->BSIM3qbulk); - if (fabs (qcheq) <= 1.0e-5 * CoxWL) - { - if (model->BSIM3xpart < 0.5) - { - sxpart = 0.4; - } - else if (model->BSIM3xpart > - 0.5) - { - sxpart = 0.0; - } - else - { - sxpart = 0.5; - } - dsxpart_dVd = dsxpart_dVg = - dsxpart_dVb = - dsxpart_dVs = 0.0; - } - else - { - sxpart = here->BSIM3qdrn / - qcheq; - Css = here->BSIM3cddb; - Cds = -(here->BSIM3cgdb + - here->BSIM3cddb + - here->BSIM3cbdb); - dsxpart_dVs = - (Css - - sxpart * (Css + - Cds)) / - qcheq; - Csg = here->BSIM3cdgb; - Cdg = -(here->BSIM3cggb + - here->BSIM3cdgb + - here->BSIM3cbgb); - dsxpart_dVg = - (Csg - - sxpart * (Csg + - Cdg)) / - qcheq; - - Csd = here->BSIM3cdsb; - Cdd = -(here->BSIM3cgsb + - here->BSIM3cdsb + - here->BSIM3cbsb); - dsxpart_dVd = - (Csd - - sxpart * (Csd + - Cdd)) / - qcheq; - - dsxpart_dVb = - -(dsxpart_dVd + - dsxpart_dVg + - dsxpart_dVs); - } - dxpart = 1.0 - sxpart; - ddxpart_dVd = -dsxpart_dVd; - ddxpart_dVg = -dsxpart_dVg; - ddxpart_dVs = -dsxpart_dVs; - ddxpart_dVb = - -(ddxpart_dVd + ddxpart_dVg + - ddxpart_dVs); - } - } - - T1 = *(ckt->CKTstate0 + - here->BSIM3qdef) * here->BSIM3gtau; - gdpr = here->BSIM3drainConductance; - gspr = here->BSIM3sourceConductance; - gds = here->BSIM3gds; - gbd = here->BSIM3gbd; - gbs = here->BSIM3gbs; - capbd = here->BSIM3capbd; - capbs = here->BSIM3capbs; - - GSoverlapCap = here->BSIM3cgso; - GDoverlapCap = here->BSIM3cgdo; - GBoverlapCap = here->pParam->BSIM3cgbo; - - xcdgb = (cdgb - GDoverlapCap) * omega; - xcddb = (cddb + capbd + GDoverlapCap) * omega; - xcdsb = cdsb * omega; - xcsgb = -(cggb + cbgb + cdgb + GSoverlapCap) * omega; - xcsdb = -(cgdb + cbdb + cddb) * omega; - xcssb = (capbs + GSoverlapCap - - (cgsb + cbsb + cdsb)) * omega; - xcggb = (cggb + GDoverlapCap + GSoverlapCap + - GBoverlapCap) * omega; - xcgdb = (cgdb - GDoverlapCap) * omega; - xcgsb = (cgsb - GSoverlapCap) * omega; - xcbgb = (cbgb - GBoverlapCap) * omega; - xcbdb = (cbdb - capbd) * omega; - xcbsb = (cbsb - capbs) * omega; - - - m = here->BSIM3m; - - *(here->BSIM3GgPtr + 1) += m * xcggb; - *(here->BSIM3BbPtr + 1) -= - m * (xcbgb + xcbdb + xcbsb); - *(here->BSIM3DPdpPtr + 1) += m * xcddb; - *(here->BSIM3SPspPtr + 1) += m * xcssb; - *(here->BSIM3GbPtr + 1) -= - m * (xcggb + xcgdb + xcgsb); - *(here->BSIM3GdpPtr + 1) += m * xcgdb; - *(here->BSIM3GspPtr + 1) += m * xcgsb; - *(here->BSIM3BgPtr + 1) += m * xcbgb; - *(here->BSIM3BdpPtr + 1) += m * xcbdb; - *(here->BSIM3BspPtr + 1) += m * xcbsb; - *(here->BSIM3DPgPtr + 1) += m * xcdgb; - *(here->BSIM3DPbPtr + 1) -= - m * (xcdgb + xcddb + xcdsb); - *(here->BSIM3DPspPtr + 1) += m * xcdsb; - *(here->BSIM3SPgPtr + 1) += m * xcsgb; - *(here->BSIM3SPbPtr + 1) -= - m * (xcsgb + xcsdb + xcssb); - *(here->BSIM3SPdpPtr + 1) += m * xcsdb; - - *(here->BSIM3DdPtr) += m * gdpr; - *(here->BSIM3SsPtr) += m * gspr; - *(here->BSIM3BbPtr) += - m * (gbd + gbs - here->BSIM3gbbs); - *(here->BSIM3DPdpPtr) += - m * (gdpr + gds + gbd + RevSum + - dxpart * xgtd + T1 * ddxpart_dVd + - gbdpdp); - *(here->BSIM3SPspPtr) += - m * (gspr + gds + gbs + FwdSum + - sxpart * xgts + T1 * dsxpart_dVs + - gbspsp); - - *(here->BSIM3DdpPtr) -= m * gdpr; - *(here->BSIM3SspPtr) -= m * gspr; - - *(here->BSIM3BgPtr) -= m * here->BSIM3gbgs; - *(here->BSIM3BdpPtr) -= m * (gbd - gbbdp); - *(here->BSIM3BspPtr) -= m * (gbs - gbbsp); - - *(here->BSIM3DPdPtr) -= m * gdpr; - *(here->BSIM3DPgPtr) += - m * (Gm + dxpart * xgtg + T1 * ddxpart_dVg + - gbdpg); - *(here->BSIM3DPbPtr) -= - m * (gbd - Gmbs - dxpart * xgtb - - T1 * ddxpart_dVb - gbdpb); - *(here->BSIM3DPspPtr) -= - m * (gds + FwdSum - dxpart * xgts - - T1 * ddxpart_dVs - gbdpsp); - - *(here->BSIM3SPgPtr) -= - m * (Gm - sxpart * xgtg - T1 * dsxpart_dVg - - gbspg); - *(here->BSIM3SPsPtr) -= m * gspr; - *(here->BSIM3SPbPtr) -= - m * (gbs + Gmbs - sxpart * xgtb - - T1 * dsxpart_dVb - gbspb); - *(here->BSIM3SPdpPtr) -= - m * (gds + RevSum - sxpart * xgtd - - T1 * dsxpart_dVd - gbspdp); - - *(here->BSIM3GgPtr) -= m * xgtg; - *(here->BSIM3GbPtr) -= m * xgtb; - *(here->BSIM3GdpPtr) -= m * xgtd; - *(here->BSIM3GspPtr) -= m * xgts; - - if (here->BSIM3nqsMod) - { - *(here->BSIM3QqPtr + 1) += - m * omega * ScalingFactor; - *(here->BSIM3QgPtr + 1) -= m * xcqgb; - *(here->BSIM3QdpPtr + 1) -= m * xcqdb; - *(here->BSIM3QspPtr + 1) -= m * xcqsb; - *(here->BSIM3QbPtr + 1) -= m * xcqbb; - - *(here->BSIM3QqPtr) += m * here->BSIM3gtau; - - *(here->BSIM3DPqPtr) += - m * (dxpart * here->BSIM3gtau); - *(here->BSIM3SPqPtr) += - m * (sxpart * here->BSIM3gtau); - *(here->BSIM3GqPtr) -= m * here->BSIM3gtau; - - *(here->BSIM3QgPtr) += m * xgtg; - *(here->BSIM3QdpPtr) += m * xgtd; - *(here->BSIM3QspPtr) += m * xgts; - *(here->BSIM3QbPtr) += m * xgtb; - } - } - } - return (OK); +BSIM3model *model = (BSIM3model*)inModel; +BSIM3instance *here; +double xcggb, xcgdb, xcgsb, xcbgb, xcbdb, xcbsb, xcddb, xcssb, xcdgb; +double gdpr, gspr, gds, gbd, gbs, capbd, capbs, xcsgb, xcdsb, xcsdb; +double cggb, cgdb, cgsb, cbgb, cbdb, cbsb, cddb, cdgb, cdsb, omega; +double GSoverlapCap, GDoverlapCap, GBoverlapCap, FwdSum, RevSum, Gm, Gmbs; +double dxpart, sxpart, xgtg, xgtd, xgts, xgtb, xcqgb, xcqdb, xcqsb, xcqbb; +double gbspsp, gbbdp, gbbsp, gbspg, gbspb; +double gbspdp, gbdpdp, gbdpg, gbdpb, gbdpsp; +double ddxpart_dVd, ddxpart_dVg, ddxpart_dVb, ddxpart_dVs; +double dsxpart_dVd, dsxpart_dVg, dsxpart_dVb, dsxpart_dVs; +double T1, CoxWL, qcheq, Cdg, Cdd, Cds, Csg, Csd, Css; +double ScalingFactor = 1.0e-9; +double m; + + omega = ckt->CKTomega; + for (; model != NULL; model = model->BSIM3nextModel) + { for (here = model->BSIM3instances; here!= NULL; + here = here->BSIM3nextInstance) + { + if (here->BSIM3owner != ARCHme) + continue; + + if (here->BSIM3mode >= 0) + { Gm = here->BSIM3gm; + Gmbs = here->BSIM3gmbs; + FwdSum = Gm + Gmbs; + RevSum = 0.0; + + gbbdp = -here->BSIM3gbds; + gbbsp = here->BSIM3gbds + here->BSIM3gbgs + here->BSIM3gbbs; + + gbdpg = here->BSIM3gbgs; + gbdpb = here->BSIM3gbbs; + gbdpdp = here->BSIM3gbds; + gbdpsp = -(gbdpg + gbdpb + gbdpdp); + + gbspdp = 0.0; + gbspg = 0.0; + gbspb = 0.0; + gbspsp = 0.0; + + if (here->BSIM3nqsMod == 0) + { cggb = here->BSIM3cggb; + cgsb = here->BSIM3cgsb; + cgdb = here->BSIM3cgdb; + + cbgb = here->BSIM3cbgb; + cbsb = here->BSIM3cbsb; + cbdb = here->BSIM3cbdb; + + cdgb = here->BSIM3cdgb; + cdsb = here->BSIM3cdsb; + cddb = here->BSIM3cddb; + + xgtg = xgtd = xgts = xgtb = 0.0; + sxpart = 0.6; + dxpart = 0.4; + ddxpart_dVd = ddxpart_dVg = ddxpart_dVb + = ddxpart_dVs = 0.0; + dsxpart_dVd = dsxpart_dVg = dsxpart_dVb + = dsxpart_dVs = 0.0; + } + else + { cggb = cgdb = cgsb = 0.0; + cbgb = cbdb = cbsb = 0.0; + cdgb = cddb = cdsb = 0.0; + + xgtg = here->BSIM3gtg; + xgtd = here->BSIM3gtd; + xgts = here->BSIM3gts; + xgtb = here->BSIM3gtb; + + xcqgb = here->BSIM3cqgb * omega; + xcqdb = here->BSIM3cqdb * omega; + xcqsb = here->BSIM3cqsb * omega; + xcqbb = here->BSIM3cqbb * omega; + + CoxWL = model->BSIM3cox * here->pParam->BSIM3weffCV + * here->pParam->BSIM3leffCV; + qcheq = -(here->BSIM3qgate + here->BSIM3qbulk); + if (fabs(qcheq) <= 1.0e-5 * CoxWL) + { if (model->BSIM3xpart < 0.5) + { dxpart = 0.4; + } + else if (model->BSIM3xpart > 0.5) + { dxpart = 0.0; + } + else + { dxpart = 0.5; + } + ddxpart_dVd = ddxpart_dVg = ddxpart_dVb + = ddxpart_dVs = 0.0; + } + else + { dxpart = here->BSIM3qdrn / qcheq; + Cdd = here->BSIM3cddb; + Csd = -(here->BSIM3cgdb + here->BSIM3cddb + + here->BSIM3cbdb); + ddxpart_dVd = (Cdd - dxpart * (Cdd + Csd)) / qcheq; + Cdg = here->BSIM3cdgb; + Csg = -(here->BSIM3cggb + here->BSIM3cdgb + + here->BSIM3cbgb); + ddxpart_dVg = (Cdg - dxpart * (Cdg + Csg)) / qcheq; + + Cds = here->BSIM3cdsb; + Css = -(here->BSIM3cgsb + here->BSIM3cdsb + + here->BSIM3cbsb); + ddxpart_dVs = (Cds - dxpart * (Cds + Css)) / qcheq; + + ddxpart_dVb = -(ddxpart_dVd + ddxpart_dVg + + ddxpart_dVs); + } + sxpart = 1.0 - dxpart; + dsxpart_dVd = -ddxpart_dVd; + dsxpart_dVg = -ddxpart_dVg; + dsxpart_dVs = -ddxpart_dVs; + dsxpart_dVb = -(dsxpart_dVd + dsxpart_dVg + dsxpart_dVs); + } + } + else + { Gm = -here->BSIM3gm; + Gmbs = -here->BSIM3gmbs; + FwdSum = 0.0; + RevSum = -(Gm + Gmbs); + + gbbsp = -here->BSIM3gbds; + gbbdp = here->BSIM3gbds + here->BSIM3gbgs + here->BSIM3gbbs; + + gbdpg = 0.0; + gbdpsp = 0.0; + gbdpb = 0.0; + gbdpdp = 0.0; + + gbspg = here->BSIM3gbgs; + gbspsp = here->BSIM3gbds; + gbspb = here->BSIM3gbbs; + gbspdp = -(gbspg + gbspsp + gbspb); + + if (here->BSIM3nqsMod == 0) + { cggb = here->BSIM3cggb; + cgsb = here->BSIM3cgdb; + cgdb = here->BSIM3cgsb; + + cbgb = here->BSIM3cbgb; + cbsb = here->BSIM3cbdb; + cbdb = here->BSIM3cbsb; + + cdgb = -(here->BSIM3cdgb + cggb + cbgb); + cdsb = -(here->BSIM3cddb + cgsb + cbsb); + cddb = -(here->BSIM3cdsb + cgdb + cbdb); + + xgtg = xgtd = xgts = xgtb = 0.0; + sxpart = 0.4; + dxpart = 0.6; + ddxpart_dVd = ddxpart_dVg = ddxpart_dVb + = ddxpart_dVs = 0.0; + dsxpart_dVd = dsxpart_dVg = dsxpart_dVb + = dsxpart_dVs = 0.0; + } + else + { cggb = cgdb = cgsb = 0.0; + cbgb = cbdb = cbsb = 0.0; + cdgb = cddb = cdsb = 0.0; + + xgtg = here->BSIM3gtg; + xgtd = here->BSIM3gts; + xgts = here->BSIM3gtd; + xgtb = here->BSIM3gtb; + + xcqgb = here->BSIM3cqgb * omega; + xcqdb = here->BSIM3cqsb * omega; + xcqsb = here->BSIM3cqdb * omega; + xcqbb = here->BSIM3cqbb * omega; + + CoxWL = model->BSIM3cox * here->pParam->BSIM3weffCV + * here->pParam->BSIM3leffCV; + qcheq = -(here->BSIM3qgate + here->BSIM3qbulk); + if (fabs(qcheq) <= 1.0e-5 * CoxWL) + { if (model->BSIM3xpart < 0.5) + { sxpart = 0.4; + } + else if (model->BSIM3xpart > 0.5) + { sxpart = 0.0; + } + else + { sxpart = 0.5; + } + dsxpart_dVd = dsxpart_dVg = dsxpart_dVb + = dsxpart_dVs = 0.0; + } + else + { sxpart = here->BSIM3qdrn / qcheq; + Css = here->BSIM3cddb; + Cds = -(here->BSIM3cgdb + here->BSIM3cddb + + here->BSIM3cbdb); + dsxpart_dVs = (Css - sxpart * (Css + Cds)) / qcheq; + Csg = here->BSIM3cdgb; + Cdg = -(here->BSIM3cggb + here->BSIM3cdgb + + here->BSIM3cbgb); + dsxpart_dVg = (Csg - sxpart * (Csg + Cdg)) / qcheq; + + Csd = here->BSIM3cdsb; + Cdd = -(here->BSIM3cgsb + here->BSIM3cdsb + + here->BSIM3cbsb); + dsxpart_dVd = (Csd - sxpart * (Csd + Cdd)) / qcheq; + + dsxpart_dVb = -(dsxpart_dVd + dsxpart_dVg + + dsxpart_dVs); + } + dxpart = 1.0 - sxpart; + ddxpart_dVd = -dsxpart_dVd; + ddxpart_dVg = -dsxpart_dVg; + ddxpart_dVs = -dsxpart_dVs; + ddxpart_dVb = -(ddxpart_dVd + ddxpart_dVg + ddxpart_dVs); + } + } + + T1 = *(ckt->CKTstate0 + here->BSIM3qdef) * here->BSIM3gtau; + gdpr = here->BSIM3drainConductance; + gspr = here->BSIM3sourceConductance; + gds = here->BSIM3gds; + gbd = here->BSIM3gbd; + gbs = here->BSIM3gbs; + capbd = here->BSIM3capbd; + capbs = here->BSIM3capbs; + + GSoverlapCap = here->BSIM3cgso; + GDoverlapCap = here->BSIM3cgdo; + GBoverlapCap = here->pParam->BSIM3cgbo; + + xcdgb = (cdgb - GDoverlapCap) * omega; + xcddb = (cddb + capbd + GDoverlapCap) * omega; + xcdsb = cdsb * omega; + xcsgb = -(cggb + cbgb + cdgb + GSoverlapCap) * omega; + xcsdb = -(cgdb + cbdb + cddb) * omega; + xcssb = (capbs + GSoverlapCap - (cgsb + cbsb + cdsb)) * omega; + xcggb = (cggb + GDoverlapCap + GSoverlapCap + GBoverlapCap) + * omega; + xcgdb = (cgdb - GDoverlapCap ) * omega; + xcgsb = (cgsb - GSoverlapCap) * omega; + xcbgb = (cbgb - GBoverlapCap) * omega; + xcbdb = (cbdb - capbd ) * omega; + xcbsb = (cbsb - capbs ) * omega; + + m = here->BSIM3m; + + *(here->BSIM3GgPtr + 1) += m * xcggb; + *(here->BSIM3BbPtr + 1) -= + m * (xcbgb + xcbdb + xcbsb); + *(here->BSIM3DPdpPtr + 1) += m * xcddb; + *(here->BSIM3SPspPtr + 1) += m * xcssb; + *(here->BSIM3GbPtr + 1) -= + m * (xcggb + xcgdb + xcgsb); + *(here->BSIM3GdpPtr + 1) += m * xcgdb; + *(here->BSIM3GspPtr + 1) += m * xcgsb; + *(here->BSIM3BgPtr + 1) += m * xcbgb; + *(here->BSIM3BdpPtr + 1) += m * xcbdb; + *(here->BSIM3BspPtr + 1) += m * xcbsb; + *(here->BSIM3DPgPtr + 1) += m * xcdgb; + *(here->BSIM3DPbPtr + 1) -= + m * (xcdgb + xcddb + xcdsb); + *(here->BSIM3DPspPtr + 1) += m * xcdsb; + *(here->BSIM3SPgPtr + 1) += m * xcsgb; + *(here->BSIM3SPbPtr + 1) -= + m * (xcsgb + xcsdb + xcssb); + *(here->BSIM3SPdpPtr + 1) += m * xcsdb; + + *(here->BSIM3DdPtr) += m * gdpr; + *(here->BSIM3SsPtr) += m * gspr; + *(here->BSIM3BbPtr) += + m * (gbd + gbs - here->BSIM3gbbs); + *(here->BSIM3DPdpPtr) += + m * (gdpr + gds + gbd + RevSum + + dxpart * xgtd + T1 * ddxpart_dVd + + gbdpdp); + *(here->BSIM3SPspPtr) += + m * (gspr + gds + gbs + FwdSum + + sxpart * xgts + T1 * dsxpart_dVs + + gbspsp); + + *(here->BSIM3DdpPtr) -= m * gdpr; + *(here->BSIM3SspPtr) -= m * gspr; + + *(here->BSIM3BgPtr) -= m * here->BSIM3gbgs; + *(here->BSIM3BdpPtr) -= m * (gbd - gbbdp); + *(here->BSIM3BspPtr) -= m * (gbs - gbbsp); + + *(here->BSIM3DPdPtr) -= m * gdpr; + *(here->BSIM3DPgPtr) += + m * (Gm + dxpart * xgtg + T1 * ddxpart_dVg + + gbdpg); + *(here->BSIM3DPbPtr) -= + m * (gbd - Gmbs - dxpart * xgtb - + T1 * ddxpart_dVb - gbdpb); + *(here->BSIM3DPspPtr) -= + m * (gds + FwdSum - dxpart * xgts - + T1 * ddxpart_dVs - gbdpsp); + + *(here->BSIM3SPgPtr) -= + m * (Gm - sxpart * xgtg - T1 * dsxpart_dVg - + gbspg); + *(here->BSIM3SPsPtr) -= m * gspr; + *(here->BSIM3SPbPtr) -= + m * (gbs + Gmbs - sxpart * xgtb - + T1 * dsxpart_dVb - gbspb); + *(here->BSIM3SPdpPtr) -= + m * (gds + RevSum - sxpart * xgtd - + T1 * dsxpart_dVd - gbspdp); + + *(here->BSIM3GgPtr) -= m * xgtg; + *(here->BSIM3GbPtr) -= m * xgtb; + *(here->BSIM3GdpPtr) -= m * xgtd; + *(here->BSIM3GspPtr) -= m * xgts; + + if (here->BSIM3nqsMod) + { + *(here->BSIM3QqPtr + 1) += + m * omega * ScalingFactor; + *(here->BSIM3QgPtr + 1) -= m * xcqgb; + *(here->BSIM3QdpPtr + 1) -= m * xcqdb; + *(here->BSIM3QspPtr + 1) -= m * xcqsb; + *(here->BSIM3QbPtr + 1) -= m * xcqbb; + + *(here->BSIM3QqPtr) += m * here->BSIM3gtau; + + *(here->BSIM3DPqPtr) += + m * (dxpart * here->BSIM3gtau); + *(here->BSIM3SPqPtr) += + m * (sxpart * here->BSIM3gtau); + *(here->BSIM3GqPtr) -= m * here->BSIM3gtau; + + *(here->BSIM3QgPtr) += m * xgtg; + *(here->BSIM3QdpPtr) += m * xgtd; + *(here->BSIM3QspPtr) += m * xgts; + *(here->BSIM3QbPtr) += m * xgtb; + } + } + } + return(OK); } + diff --git a/src/spicelib/devices/bsim3/b3ask.c b/src/spicelib/devices/bsim3/b3ask.c index 51765869b..1470a33e5 100644 --- a/src/spicelib/devices/bsim3/b3ask.c +++ b/src/spicelib/devices/bsim3/b3ask.c @@ -1,23 +1,14 @@ +/**** BSIM3v3.2.4, Released by Xuemei Xi 12/14/2001 ****/ + /********** * Copyright 2001 Regents of the University of California. All rights reserved. * File: b3ask.c of BSIM3v3.2.4 * Author: 1995 Min-Chie Jeng and Mansun Chan * Author: 1997-1999 Weidong Liu. * Author: 2001 Xuemei Xi - * Modified bt Paolo Nenzi 2002 + * Modified bt Paolo Nenzi 2002 and Dietmar Warning 2003 **********/ -/* - * Release Notes: - * BSIM3v3.2.4, Released by Xuemei Xi 12/14/2001 - * BSIM3v3.2.3, Released by Xuemei Xi 10/05/2001 - * BSIM3v3.2.2, Released by Weidong Liu 04/20/1999 - * BSIM3v3.2, Released by Weidong Liu 06/16/1998 - */ - - -/*************************************/ - #include "ngspice.h" #include "ifsim.h" #include "cktdefs.h" @@ -27,209 +18,209 @@ #include "suffix.h" int -BSIM3ask (CKTcircuit * ckt, GENinstance * inst, int which, IFvalue * value, - IFvalue * select) +BSIM3ask (CKTcircuit *ckt, GENinstance *inst, int which, IFvalue *value, + IFvalue *select) { - BSIM3instance *here = (BSIM3instance *) inst; +BSIM3instance *here = (BSIM3instance*)inst; - switch (which) - { - case BSIM3_L: - value->rValue = here->BSIM3l; - return (OK); - case BSIM3_W: - value->rValue = here->BSIM3w; - return (OK); + switch(which) + { case BSIM3_L: + value->rValue = here->BSIM3l; + return(OK); + case BSIM3_W: + value->rValue = here->BSIM3w; + return(OK); case BSIM3_M: - value->rValue = here->BSIM3m; - return (OK); - case BSIM3_AS: - value->rValue = here->BSIM3sourceArea; - return (OK); - case BSIM3_AD: - value->rValue = here->BSIM3drainArea; - return (OK); - case BSIM3_PS: - value->rValue = here->BSIM3sourcePerimeter; - return (OK); - case BSIM3_PD: - value->rValue = here->BSIM3drainPerimeter; - return (OK); - case BSIM3_NRS: - value->rValue = here->BSIM3sourceSquares; - return (OK); - case BSIM3_NRD: - value->rValue = here->BSIM3drainSquares; - return (OK); - case BSIM3_OFF: - value->rValue = here->BSIM3off; - return (OK); - case BSIM3_NQSMOD: - value->iValue = here->BSIM3nqsMod; - return (OK); - case BSIM3_IC_VBS: - value->rValue = here->BSIM3icVBS; - return (OK); - case BSIM3_IC_VDS: - value->rValue = here->BSIM3icVDS; - return (OK); - case BSIM3_IC_VGS: - value->rValue = here->BSIM3icVGS; - return (OK); - case BSIM3_DNODE: - value->iValue = here->BSIM3dNode; - return (OK); - case BSIM3_GNODE: - value->iValue = here->BSIM3gNode; - return (OK); - case BSIM3_SNODE: - value->iValue = here->BSIM3sNode; - return (OK); - case BSIM3_BNODE: - value->iValue = here->BSIM3bNode; - return (OK); - case BSIM3_DNODEPRIME: - value->iValue = here->BSIM3dNodePrime; - return (OK); - case BSIM3_SNODEPRIME: - value->iValue = here->BSIM3sNodePrime; - return (OK); - case BSIM3_SOURCECONDUCT: - value->rValue = here->BSIM3sourceConductance; - value->rValue *= here->BSIM3m; - return (OK); - case BSIM3_DRAINCONDUCT: - value->rValue = here->BSIM3drainConductance; - value->rValue *= here->BSIM3m; - return (OK); - case BSIM3_VBD: - value->rValue = *(ckt->CKTstate0 + here->BSIM3vbd); - return (OK); - case BSIM3_VBS: - value->rValue = *(ckt->CKTstate0 + here->BSIM3vbs); - return (OK); - case BSIM3_VGS: - value->rValue = *(ckt->CKTstate0 + here->BSIM3vgs); - return (OK); - case BSIM3_VDS: - value->rValue = *(ckt->CKTstate0 + here->BSIM3vds); - return (OK); - case BSIM3_CD: - value->rValue = here->BSIM3cd; - value->rValue *= here->BSIM3m; - return (OK); - case BSIM3_CBS: - value->rValue = here->BSIM3cbs; - value->rValue *= here->BSIM3m; - return (OK); - case BSIM3_CBD: - value->rValue = here->BSIM3cbd; - value->rValue *= here->BSIM3m; - return (OK); - case BSIM3_GM: - value->rValue = here->BSIM3gm; - value->rValue *= here->BSIM3m; - return (OK); - case BSIM3_GDS: - value->rValue = here->BSIM3gds; - value->rValue *= here->BSIM3m; - return (OK); - case BSIM3_GMBS: - value->rValue = here->BSIM3gmbs; - value->rValue *= here->BSIM3m; - return (OK); - case BSIM3_GBD: - value->rValue = here->BSIM3gbd; - value->rValue *= here->BSIM3m; - return (OK); - case BSIM3_GBS: - value->rValue = here->BSIM3gbs; - value->rValue *= here->BSIM3m; - return (OK); - case BSIM3_QB: - value->rValue = *(ckt->CKTstate0 + here->BSIM3qb); - value->rValue *= here->BSIM3m; - return (OK); - case BSIM3_CQB: - value->rValue = *(ckt->CKTstate0 + here->BSIM3cqb); - value->rValue *= here->BSIM3m; - return (OK); - case BSIM3_QG: - value->rValue = *(ckt->CKTstate0 + here->BSIM3qg); - value->rValue *= here->BSIM3m; - return (OK); - case BSIM3_CQG: - value->rValue = *(ckt->CKTstate0 + here->BSIM3cqg); - value->rValue *= here->BSIM3m; - return (OK); - case BSIM3_QD: - value->rValue = *(ckt->CKTstate0 + here->BSIM3qd); - value->rValue *= here->BSIM3m; - return (OK); - case BSIM3_CQD: - value->rValue = *(ckt->CKTstate0 + here->BSIM3cqd); - value->rValue *= here->BSIM3m; - return (OK); - case BSIM3_CGG: - value->rValue = here->BSIM3cggb; - value->rValue *= here->BSIM3m; - return (OK); - case BSIM3_CGD: - value->rValue = here->BSIM3cgdb; - value->rValue *= here->BSIM3m; - return (OK); - case BSIM3_CGS: - value->rValue = here->BSIM3cgsb; - value->rValue *= here->BSIM3m; - return (OK); - case BSIM3_CDG: - value->rValue = here->BSIM3cdgb; - value->rValue *= here->BSIM3m; - return (OK); - case BSIM3_CDD: - value->rValue = here->BSIM3cddb; - value->rValue *= here->BSIM3m; - return (OK); - case BSIM3_CDS: - value->rValue = here->BSIM3cdsb; - value->rValue *= here->BSIM3m; - return (OK); - case BSIM3_CBG: - value->rValue = here->BSIM3cbgb; - value->rValue *= here->BSIM3m; - return (OK); - case BSIM3_CBDB: - value->rValue = here->BSIM3cbdb; - value->rValue *= here->BSIM3m; - return (OK); - case BSIM3_CBSB: - value->rValue = here->BSIM3cbsb; - value->rValue *= here->BSIM3m; - return (OK); - case BSIM3_CAPBD: - value->rValue = here->BSIM3capbd; - value->rValue *= here->BSIM3m; - return (OK); - case BSIM3_CAPBS: - value->rValue = here->BSIM3capbs; - value->rValue *= here->BSIM3m; - return (OK); - case BSIM3_VON: - value->rValue = here->BSIM3von; - return (OK); - case BSIM3_VDSAT: - value->rValue = here->BSIM3vdsat; - return (OK); - case BSIM3_QBS: - value->rValue = *(ckt->CKTstate0 + here->BSIM3qbs); - value->rValue *= here->BSIM3m; - return (OK); - case BSIM3_QBD: - value->rValue = *(ckt->CKTstate0 + here->BSIM3qbd); - value->rValue *= here->BSIM3m; - return (OK); - default: - return (E_BADPARM); - } - /* NOTREACHED */ + value->rValue = here->BSIM3m; + return (OK); + case BSIM3_AS: + value->rValue = here->BSIM3sourceArea; + return(OK); + case BSIM3_AD: + value->rValue = here->BSIM3drainArea; + return(OK); + case BSIM3_PS: + value->rValue = here->BSIM3sourcePerimeter; + return(OK); + case BSIM3_PD: + value->rValue = here->BSIM3drainPerimeter; + return(OK); + case BSIM3_NRS: + value->rValue = here->BSIM3sourceSquares; + return(OK); + case BSIM3_NRD: + value->rValue = here->BSIM3drainSquares; + return(OK); + case BSIM3_OFF: + value->rValue = here->BSIM3off; + return(OK); + case BSIM3_NQSMOD: + value->iValue = here->BSIM3nqsMod; + return(OK); + case BSIM3_IC_VBS: + value->rValue = here->BSIM3icVBS; + return(OK); + case BSIM3_IC_VDS: + value->rValue = here->BSIM3icVDS; + return(OK); + case BSIM3_IC_VGS: + value->rValue = here->BSIM3icVGS; + return(OK); + case BSIM3_DNODE: + value->iValue = here->BSIM3dNode; + return(OK); + case BSIM3_GNODE: + value->iValue = here->BSIM3gNode; + return(OK); + case BSIM3_SNODE: + value->iValue = here->BSIM3sNode; + return(OK); + case BSIM3_BNODE: + value->iValue = here->BSIM3bNode; + return(OK); + case BSIM3_DNODEPRIME: + value->iValue = here->BSIM3dNodePrime; + return(OK); + case BSIM3_SNODEPRIME: + value->iValue = here->BSIM3sNodePrime; + return(OK); + case BSIM3_SOURCECONDUCT: + value->rValue = here->BSIM3sourceConductance; + value->rValue *= here->BSIM3m; + return(OK); + case BSIM3_DRAINCONDUCT: + value->rValue = here->BSIM3drainConductance; + value->rValue *= here->BSIM3m; + return(OK); + case BSIM3_VBD: + value->rValue = *(ckt->CKTstate0 + here->BSIM3vbd); + return(OK); + case BSIM3_VBS: + value->rValue = *(ckt->CKTstate0 + here->BSIM3vbs); + return(OK); + case BSIM3_VGS: + value->rValue = *(ckt->CKTstate0 + here->BSIM3vgs); + return(OK); + case BSIM3_VDS: + value->rValue = *(ckt->CKTstate0 + here->BSIM3vds); + return(OK); + case BSIM3_CD: + value->rValue = here->BSIM3cd; + value->rValue *= here->BSIM3m; + return(OK); + case BSIM3_CBS: + value->rValue = here->BSIM3cbs; + value->rValue *= here->BSIM3m; + return(OK); + case BSIM3_CBD: + value->rValue = here->BSIM3cbd; + value->rValue *= here->BSIM3m; + return(OK); + case BSIM3_GM: + value->rValue = here->BSIM3gm; + value->rValue *= here->BSIM3m; + return(OK); + case BSIM3_GDS: + value->rValue = here->BSIM3gds; + value->rValue *= here->BSIM3m; + return(OK); + case BSIM3_GMBS: + value->rValue = here->BSIM3gmbs; + value->rValue *= here->BSIM3m; + return(OK); + case BSIM3_GBD: + value->rValue = here->BSIM3gbd; + value->rValue *= here->BSIM3m; + return(OK); + case BSIM3_GBS: + value->rValue = here->BSIM3gbs; + value->rValue *= here->BSIM3m; + return(OK); + case BSIM3_QB: + value->rValue = *(ckt->CKTstate0 + here->BSIM3qb); + value->rValue *= here->BSIM3m; + return(OK); + case BSIM3_CQB: + value->rValue = *(ckt->CKTstate0 + here->BSIM3cqb); + value->rValue *= here->BSIM3m; + return(OK); + case BSIM3_QG: + value->rValue = *(ckt->CKTstate0 + here->BSIM3qg); + value->rValue *= here->BSIM3m; + return(OK); + case BSIM3_CQG: + value->rValue = *(ckt->CKTstate0 + here->BSIM3cqg); + value->rValue *= here->BSIM3m; + return(OK); + case BSIM3_QD: + value->rValue = *(ckt->CKTstate0 + here->BSIM3qd); + value->rValue *= here->BSIM3m; + return(OK); + case BSIM3_CQD: + value->rValue = *(ckt->CKTstate0 + here->BSIM3cqd); + value->rValue *= here->BSIM3m; + return(OK); + case BSIM3_CGG: + value->rValue = here->BSIM3cggb; + value->rValue *= here->BSIM3m; + return(OK); + case BSIM3_CGD: + value->rValue = here->BSIM3cgdb; + value->rValue *= here->BSIM3m; + return(OK); + case BSIM3_CGS: + value->rValue = here->BSIM3cgsb; + value->rValue *= here->BSIM3m; + return(OK); + case BSIM3_CDG: + value->rValue = here->BSIM3cdgb; + value->rValue *= here->BSIM3m; + return(OK); + case BSIM3_CDD: + value->rValue = here->BSIM3cddb; + value->rValue *= here->BSIM3m; + return(OK); + case BSIM3_CDS: + value->rValue = here->BSIM3cdsb; + value->rValue *= here->BSIM3m; + return(OK); + case BSIM3_CBG: + value->rValue = here->BSIM3cbgb; + value->rValue *= here->BSIM3m; + return(OK); + case BSIM3_CBDB: + value->rValue = here->BSIM3cbdb; + value->rValue *= here->BSIM3m; + return(OK); + case BSIM3_CBSB: + value->rValue = here->BSIM3cbsb; + value->rValue *= here->BSIM3m; + return(OK); + case BSIM3_CAPBD: + value->rValue = here->BSIM3capbd; + value->rValue *= here->BSIM3m; + return(OK); + case BSIM3_CAPBS: + value->rValue = here->BSIM3capbs; + value->rValue *= here->BSIM3m; + return(OK); + case BSIM3_VON: + value->rValue = here->BSIM3von; + return(OK); + case BSIM3_VDSAT: + value->rValue = here->BSIM3vdsat; + return(OK); + case BSIM3_QBS: + value->rValue = *(ckt->CKTstate0 + here->BSIM3qbs); + value->rValue *= here->BSIM3m; + return(OK); + case BSIM3_QBD: + value->rValue = *(ckt->CKTstate0 + here->BSIM3qbd); + value->rValue *= here->BSIM3m; + return(OK); + default: + return(E_BADPARM); + } + /* NOTREACHED */ } + diff --git a/src/spicelib/devices/bsim3/b3check.c b/src/spicelib/devices/bsim3/b3check.c index 894668adf..3d424c110 100644 --- a/src/spicelib/devices/bsim3/b3check.c +++ b/src/spicelib/devices/bsim3/b3check.c @@ -1,3 +1,5 @@ +/**** BSIM3v3.2.4, Released by Xuemei Xi 12/14/2001 ****/ + /********** * Copyright 2001 Regents of the University of California. All rights reserved. * File: b3check.c of BSIM3v3.2.4 @@ -5,20 +7,9 @@ * Author: 1997-1999 Weidong Liu. * Author: 2001 Xuemei Xi * Modified by Xuemei Xi, 10/05, 12/14, 2001. - * Modified by Paolo Nenzi 2002 + * Modified by Paolo Nenzi 2002 and Dietmar Warning 2003 **********/ -/* - * Release Notes: - * BSIM3v3.2.4, Released by Xuemei Xi 12/14/2001 - * BSIM3v3.2.3, Released by Xuemei Xi 10/05/2001 - * BSIM3v3.2.2, Released by Weidong Liu 04/20/1999 - * BSIM3v3.2, Released by Weidong Liu 06/16/1998 - */ - - -/*************************************/ - #include "ngspice.h" #include "cktdefs.h" #include "bsim3def.h" @@ -29,561 +20,430 @@ #include "suffix.h" int -BSIM3checkModel (BSIM3model * model, BSIM3instance * here, CKTcircuit * ckt) +BSIM3checkModel (BSIM3model *model, BSIM3instance *here, CKTcircuit *ckt) { - struct bsim3SizeDependParam *pParam; - int Fatal_Flag = 0; - FILE *fplog; - - if ((fplog = fopen ("b3v3check.log", "w")) != NULL) +struct bsim3SizeDependParam *pParam; +int Fatal_Flag = 0; +FILE *fplog; + + if ((fplog = fopen("b3v3check.log", "w")) != NULL) + { pParam = here->pParam; + + fprintf (fplog, + "BSIM3v3.2 Model (Supports: v3.2 and v3.2.{2,3,4}).\n"); + fprintf (fplog, "Parameter Checking.\n"); + fprintf (fplog, "Model = %s\n", model->BSIM3modName); + fprintf (fplog, "W = %g, L = %g, M = %g\n", here->BSIM3w, + here->BSIM3l, here->BSIM3m); + + if ((strcmp (model->BSIM3version, "3.2.4")) + && (strcmp (model->BSIM3version, "3.2.3")) + && (strcmp (model->BSIM3version, "3.2.2")) + && (strcmp (model->BSIM3version, "3.2"))) { - pParam = here->pParam; - fprintf (fplog, - "BSIM3v3.2 Model (Supports: v3.2 and v3.2.{2,3,4}.\n"); - fprintf (fplog, "Parameter Checking.\n"); - fprintf (fplog, "Model = %s\n", model->BSIM3modName); - fprintf (fplog, "W = %g, L = %g, M = %g\n", here->BSIM3w, - here->BSIM3l, here->BSIM3m); - - if ((strcmp (model->BSIM3version, "3.2.4")) - && (strcmp (model->BSIM3version, "3.2.3")) - && (strcmp (model->BSIM3version, "3.2.2")) - && (strcmp (model->BSIM3version, "3.2"))) - { - fprintf (fplog, - "Warning: This model supports BSIM3v3.2 and BSIM3v3.{2,3,4}\n"); - fprintf (fplog, - "You specified a wrong version number.\n."); - printf ("Warning: This model supports BSIM3v3.2 and BSIM3v3.{2,3,4}\n"); - printf ("You specified a wrong version number.\n."); - } - - if (pParam->BSIM3nlx < -pParam->BSIM3leff) - { - fprintf (fplog, - "Fatal: Nlx = %g is less than -Leff.\n", - pParam->BSIM3nlx); - printf ("Fatal: Nlx = %g is less than -Leff.\n", - pParam->BSIM3nlx); - Fatal_Flag = 1; - } - - if (model->BSIM3tox <= 0.0) - { - fprintf (fplog, "Fatal: Tox = %g is not positive.\n", - model->BSIM3tox); - printf ("Fatal: Tox = %g is not positive.\n", - model->BSIM3tox); - Fatal_Flag = 1; - } - - if (model->BSIM3toxm <= 0.0) - { - fprintf (fplog, "Fatal: Toxm = %g is not positive.\n", - model->BSIM3toxm); - printf ("Fatal: Toxm = %g is not positive.\n", - model->BSIM3toxm); - Fatal_Flag = 1; - } - - if (pParam->BSIM3npeak <= 0.0) - { - fprintf (fplog, "Fatal: Nch = %g is not positive.\n", - pParam->BSIM3npeak); - printf ("Fatal: Nch = %g is not positive.\n", - pParam->BSIM3npeak); - Fatal_Flag = 1; - } - if (pParam->BSIM3nsub <= 0.0) - { - fprintf (fplog, "Fatal: Nsub = %g is not positive.\n", - pParam->BSIM3nsub); - printf ("Fatal: Nsub = %g is not positive.\n", - pParam->BSIM3nsub); - Fatal_Flag = 1; - } - if (pParam->BSIM3ngate < 0.0) - { - fprintf (fplog, - "Fatal: Ngate = %g is not positive.\n", - pParam->BSIM3ngate); - printf ("Fatal: Ngate = %g Ngate is not positive.\n", - pParam->BSIM3ngate); - Fatal_Flag = 1; - } - if (pParam->BSIM3ngate > 1.e25) - { - fprintf (fplog, "Fatal: Ngate = %g is too high.\n", - pParam->BSIM3ngate); - printf ("Fatal: Ngate = %g Ngate is too high\n", - pParam->BSIM3ngate); - Fatal_Flag = 1; - } - if (pParam->BSIM3xj <= 0.0) - { - fprintf (fplog, "Fatal: Xj = %g is not positive.\n", - pParam->BSIM3xj); - printf ("Fatal: Xj = %g is not positive.\n", - pParam->BSIM3xj); - Fatal_Flag = 1; - } - - if (pParam->BSIM3dvt1 < 0.0) - { - fprintf (fplog, "Fatal: Dvt1 = %g is negative.\n", - pParam->BSIM3dvt1); - printf ("Fatal: Dvt1 = %g is negative.\n", - pParam->BSIM3dvt1); - Fatal_Flag = 1; - } - - if (pParam->BSIM3dvt1w < 0.0) - { - fprintf (fplog, "Fatal: Dvt1w = %g is negative.\n", - pParam->BSIM3dvt1w); - printf ("Fatal: Dvt1w = %g is negative.\n", - pParam->BSIM3dvt1w); - Fatal_Flag = 1; - } - - if (pParam->BSIM3w0 == -pParam->BSIM3weff) - { - fprintf (fplog, - "Fatal: (W0 + Weff) = 0 causing divided-by-zero.\n"); - printf ("Fatal: (W0 + Weff) = 0 causing divided-by-zero.\n"); - Fatal_Flag = 1; - } - - if (pParam->BSIM3dsub < 0.0) - { - fprintf (fplog, "Fatal: Dsub = %g is negative.\n", - pParam->BSIM3dsub); - printf ("Fatal: Dsub = %g is negative.\n", - pParam->BSIM3dsub); - Fatal_Flag = 1; - } - if (pParam->BSIM3b1 == -pParam->BSIM3weff) - { - fprintf (fplog, - "Fatal: (B1 + Weff) = 0 causing divided-by-zero.\n"); - printf ("Fatal: (B1 + Weff) = 0 causing divided-by-zero.\n"); - Fatal_Flag = 1; - } - if (pParam->BSIM3u0temp <= 0.0) - { - fprintf (fplog, - "Fatal: u0 at current temperature = %g is not positive.\n", - pParam->BSIM3u0temp); - printf ("Fatal: u0 at current temperature = %g is not positive.\n", pParam->BSIM3u0temp); - Fatal_Flag = 1; - } - -/* Check delta parameter */ - if (pParam->BSIM3delta < 0.0) - { - fprintf (fplog, - "Fatal: Delta = %g is less than zero.\n", - pParam->BSIM3delta); - printf ("Fatal: Delta = %g is less than zero.\n", - pParam->BSIM3delta); - Fatal_Flag = 1; - } - - if (pParam->BSIM3vsattemp <= 0.0) - { - fprintf (fplog, - "Fatal: Vsat at current temperature = %g is not positive.\n", - pParam->BSIM3vsattemp); - printf ("Fatal: Vsat at current temperature = %g is not positive.\n", pParam->BSIM3vsattemp); - Fatal_Flag = 1; - } + "Warning: This model supports BSIM3v3.2 and BSIM3v3.2.{2,3,4}\n"); + fprintf (fplog, + "You specified a wrong version number.\n"); + printf ("Warning: This model supports BSIM3v3.2 and BSIM3v3.2.{2,3,4}\n"); + printf ("You specified a wrong version number.\n"); + } + + if (pParam->BSIM3nlx < -pParam->BSIM3leff) + { fprintf(fplog, "Fatal: Nlx = %g is less than -Leff.\n", + pParam->BSIM3nlx); + printf("Fatal: Nlx = %g is less than -Leff.\n", + pParam->BSIM3nlx); + Fatal_Flag = 1; + } + + if (model->BSIM3tox <= 0.0) + { fprintf(fplog, "Fatal: Tox = %g is not positive.\n", + model->BSIM3tox); + printf("Fatal: Tox = %g is not positive.\n", model->BSIM3tox); + Fatal_Flag = 1; + } + + if (model->BSIM3toxm <= 0.0) + { fprintf(fplog, "Fatal: Toxm = %g is not positive.\n", + model->BSIM3toxm); + printf("Fatal: Toxm = %g is not positive.\n", model->BSIM3toxm); + Fatal_Flag = 1; + } + + if (pParam->BSIM3npeak <= 0.0) + { fprintf(fplog, "Fatal: Nch = %g is not positive.\n", + pParam->BSIM3npeak); + printf("Fatal: Nch = %g is not positive.\n", + pParam->BSIM3npeak); + Fatal_Flag = 1; + } + if (pParam->BSIM3nsub <= 0.0) + { fprintf(fplog, "Fatal: Nsub = %g is not positive.\n", + pParam->BSIM3nsub); + printf("Fatal: Nsub = %g is not positive.\n", + pParam->BSIM3nsub); + Fatal_Flag = 1; + } + if (pParam->BSIM3ngate < 0.0) + { fprintf(fplog, "Fatal: Ngate = %g is not positive.\n", + pParam->BSIM3ngate); + printf("Fatal: Ngate = %g Ngate is not positive.\n", + pParam->BSIM3ngate); + Fatal_Flag = 1; + } + if (pParam->BSIM3ngate > 1.e25) + { fprintf(fplog, "Fatal: Ngate = %g is too high.\n", + pParam->BSIM3ngate); + printf("Fatal: Ngate = %g Ngate is too high\n", + pParam->BSIM3ngate); + Fatal_Flag = 1; + } + if (pParam->BSIM3xj <= 0.0) + { fprintf(fplog, "Fatal: Xj = %g is not positive.\n", + pParam->BSIM3xj); + printf("Fatal: Xj = %g is not positive.\n", pParam->BSIM3xj); + Fatal_Flag = 1; + } + + if (pParam->BSIM3dvt1 < 0.0) + { fprintf(fplog, "Fatal: Dvt1 = %g is negative.\n", + pParam->BSIM3dvt1); + printf("Fatal: Dvt1 = %g is negative.\n", pParam->BSIM3dvt1); + Fatal_Flag = 1; + } + + if (pParam->BSIM3dvt1w < 0.0) + { fprintf(fplog, "Fatal: Dvt1w = %g is negative.\n", + pParam->BSIM3dvt1w); + printf("Fatal: Dvt1w = %g is negative.\n", pParam->BSIM3dvt1w); + Fatal_Flag = 1; + } + + if (pParam->BSIM3w0 == -pParam->BSIM3weff) + { fprintf(fplog, "Fatal: (W0 + Weff) = 0 causing divided-by-zero.\n"); + printf("Fatal: (W0 + Weff) = 0 causing divided-by-zero.\n"); + Fatal_Flag = 1; + } + + if (pParam->BSIM3dsub < 0.0) + { fprintf(fplog, "Fatal: Dsub = %g is negative.\n", pParam->BSIM3dsub); + printf("Fatal: Dsub = %g is negative.\n", pParam->BSIM3dsub); + Fatal_Flag = 1; + } + if (pParam->BSIM3b1 == -pParam->BSIM3weff) + { fprintf(fplog, "Fatal: (B1 + Weff) = 0 causing divided-by-zero.\n"); + printf("Fatal: (B1 + Weff) = 0 causing divided-by-zero.\n"); + Fatal_Flag = 1; + } + if (pParam->BSIM3u0temp <= 0.0) + { fprintf(fplog, "Fatal: u0 at current temperature = %g is not positive.\n", pParam->BSIM3u0temp); + printf("Fatal: u0 at current temperature = %g is not positive.\n", + pParam->BSIM3u0temp); + Fatal_Flag = 1; + } + +/* Check delta parameter */ + if (pParam->BSIM3delta < 0.0) + { fprintf(fplog, "Fatal: Delta = %g is less than zero.\n", + pParam->BSIM3delta); + printf("Fatal: Delta = %g is less than zero.\n", pParam->BSIM3delta); + Fatal_Flag = 1; + } + + if (pParam->BSIM3vsattemp <= 0.0) + { fprintf(fplog, "Fatal: Vsat at current temperature = %g is not positive.\n", pParam->BSIM3vsattemp); + printf("Fatal: Vsat at current temperature = %g is not positive.\n", + pParam->BSIM3vsattemp); + Fatal_Flag = 1; + } /* Check Rout parameters */ - if (pParam->BSIM3pclm <= 0.0) - { - fprintf (fplog, "Fatal: Pclm = %g is not positive.\n", - pParam->BSIM3pclm); - printf ("Fatal: Pclm = %g is not positive.\n", - pParam->BSIM3pclm); - Fatal_Flag = 1; - } - - if (pParam->BSIM3drout < 0.0) - { - fprintf (fplog, "Fatal: Drout = %g is negative.\n", - pParam->BSIM3drout); - printf ("Fatal: Drout = %g is negative.\n", - pParam->BSIM3drout); - Fatal_Flag = 1; - } - - if (pParam->BSIM3pscbe2 <= 0.0) - { - fprintf (fplog, - "Warning: Pscbe2 = %g is not positive.\n", - pParam->BSIM3pscbe2); - printf ("Warning: Pscbe2 = %g is not positive.\n", - pParam->BSIM3pscbe2); - } - - if (model->BSIM3unitLengthSidewallJctCap > 0.0 || - model->BSIM3unitLengthGateSidewallJctCap > 0.0) - { - if (here->BSIM3drainPerimeter < pParam->BSIM3weff) - { - fprintf (fplog, - "Warning: Pd = %g is less than W.\n", - here->BSIM3drainPerimeter); - printf ("Warning: Pd = %g is less than W.\n", - here->BSIM3drainPerimeter); - } - if (here->BSIM3sourcePerimeter < pParam->BSIM3weff) - { - fprintf (fplog, - "Warning: Ps = %g is less than W.\n", - here->BSIM3sourcePerimeter); - printf ("Warning: Ps = %g is less than W.\n", - here->BSIM3sourcePerimeter); - } - } - - if (pParam->BSIM3noff < 0.1) - { - fprintf (fplog, "Warning: Noff = %g is too small.\n", - pParam->BSIM3noff); - printf ("Warning: Noff = %g is too small.\n", - pParam->BSIM3noff); - } - if (pParam->BSIM3noff > 4.0) - { - fprintf (fplog, "Warning: Noff = %g is too large.\n", - pParam->BSIM3noff); - printf ("Warning: Noff = %g is too large.\n", - pParam->BSIM3noff); - } - - if (pParam->BSIM3voffcv < -0.5) - { - fprintf (fplog, - "Warning: Voffcv = %g is too small.\n", - pParam->BSIM3voffcv); - printf ("Warning: Voffcv = %g is too small.\n", - pParam->BSIM3voffcv); - } - if (pParam->BSIM3voffcv > 0.5) - { - fprintf (fplog, - "Warning: Voffcv = %g is too large.\n", - pParam->BSIM3voffcv); - printf ("Warning: Voffcv = %g is too large.\n", - pParam->BSIM3voffcv); - } - - if (model->BSIM3ijth < 0.0) - { - fprintf (fplog, - "Fatal: Ijth = %g cannot be negative.\n", - model->BSIM3ijth); - printf ("Fatal: Ijth = %g cannot be negative.\n", - model->BSIM3ijth); - Fatal_Flag = 1; - } + if (pParam->BSIM3pclm <= 0.0) + { fprintf(fplog, "Fatal: Pclm = %g is not positive.\n", pParam->BSIM3pclm); + printf("Fatal: Pclm = %g is not positive.\n", pParam->BSIM3pclm); + Fatal_Flag = 1; + } + + if (pParam->BSIM3drout < 0.0) + { fprintf(fplog, "Fatal: Drout = %g is negative.\n", pParam->BSIM3drout); + printf("Fatal: Drout = %g is negative.\n", pParam->BSIM3drout); + Fatal_Flag = 1; + } + + if (pParam->BSIM3pscbe2 <= 0.0) + { fprintf(fplog, "Warning: Pscbe2 = %g is not positive.\n", + pParam->BSIM3pscbe2); + printf("Warning: Pscbe2 = %g is not positive.\n", pParam->BSIM3pscbe2); + } + + /* acm model */ + if (model->BSIM3acmMod == 0) { + if (model->BSIM3unitLengthSidewallJctCap > 0.0 || + model->BSIM3unitLengthGateSidewallJctCap > 0.0) + { + if (here->BSIM3drainPerimeter < pParam->BSIM3weff) + { fprintf(fplog, "Warning: Pd = %g is less than W.\n", + here->BSIM3drainPerimeter); + printf("Warning: Pd = %g is less than W.\n", + here->BSIM3drainPerimeter); + } + if (here->BSIM3sourcePerimeter < pParam->BSIM3weff) + { fprintf(fplog, "Warning: Ps = %g is less than W.\n", + here->BSIM3sourcePerimeter); + printf("Warning: Ps = %g is less than W.\n", + here->BSIM3sourcePerimeter); + } + } + } + + if (pParam->BSIM3noff < 0.1) + { fprintf(fplog, "Warning: Noff = %g is too small.\n", + pParam->BSIM3noff); + printf("Warning: Noff = %g is too small.\n", pParam->BSIM3noff); + } + if (pParam->BSIM3noff > 4.0) + { fprintf(fplog, "Warning: Noff = %g is too large.\n", + pParam->BSIM3noff); + printf("Warning: Noff = %g is too large.\n", pParam->BSIM3noff); + } + + if (pParam->BSIM3voffcv < -0.5) + { fprintf(fplog, "Warning: Voffcv = %g is too small.\n", + pParam->BSIM3voffcv); + printf("Warning: Voffcv = %g is too small.\n", pParam->BSIM3voffcv); + } + if (pParam->BSIM3voffcv > 0.5) + { fprintf(fplog, "Warning: Voffcv = %g is too large.\n", + pParam->BSIM3voffcv); + printf("Warning: Voffcv = %g is too large.\n", pParam->BSIM3voffcv); + } + + if (model->BSIM3ijth < 0.0) + { fprintf(fplog, "Fatal: Ijth = %g cannot be negative.\n", + model->BSIM3ijth); + printf("Fatal: Ijth = %g cannot be negative.\n", model->BSIM3ijth); + Fatal_Flag = 1; + } /* Check capacitance parameters */ - if (pParam->BSIM3clc < 0.0) - { - fprintf (fplog, "Fatal: Clc = %g is negative.\n", - pParam->BSIM3clc); - printf ("Fatal: Clc = %g is negative.\n", - pParam->BSIM3clc); - Fatal_Flag = 1; - } - - if (pParam->BSIM3moin < 5.0) - { - fprintf (fplog, "Warning: Moin = %g is too small.\n", - pParam->BSIM3moin); - printf ("Warning: Moin = %g is too small.\n", - pParam->BSIM3moin); - } - if (pParam->BSIM3moin > 25.0) - { - fprintf (fplog, "Warning: Moin = %g is too large.\n", - pParam->BSIM3moin); - printf ("Warning: Moin = %g is too large.\n", - pParam->BSIM3moin); - } - - if (model->BSIM3capMod == 3) - { - if (pParam->BSIM3acde < 0.4) - { - fprintf (fplog, - "Warning: Acde = %g is too small.\n", - pParam->BSIM3acde); - printf ("Warning: Acde = %g is too small.\n", - pParam->BSIM3acde); - } - if (pParam->BSIM3acde > 1.6) - { - fprintf (fplog, - "Warning: Acde = %g is too large.\n", - pParam->BSIM3acde); - printf ("Warning: Acde = %g is too large.\n", - pParam->BSIM3acde); - } - } - - if (model->BSIM3paramChk == 1) - { -/* Check L and W parameters */ - if (pParam->BSIM3leff <= 5.0e-8) - { - fprintf (fplog, - "Warning: Leff = %g may be too small.\n", - pParam->BSIM3leff); - printf ("Warning: Leff = %g may be too small.\n", pParam->BSIM3leff); - } - - if (pParam->BSIM3leffCV <= 5.0e-8) - { - fprintf (fplog, - "Warning: Leff for CV = %g may be too small.\n", - pParam->BSIM3leffCV); - printf ("Warning: Leff for CV = %g may be too small.\n", pParam->BSIM3leffCV); - } - - if (pParam->BSIM3weff <= 1.0e-7) - { - fprintf (fplog, - "Warning: Weff = %g may be too small.\n", - pParam->BSIM3weff); - printf ("Warning: Weff = %g may be too small.\n", pParam->BSIM3weff); - } - - if (pParam->BSIM3weffCV <= 1.0e-7) - { - fprintf (fplog, - "Warning: Weff for CV = %g may be too small.\n", - pParam->BSIM3weffCV); - printf ("Warning: Weff for CV = %g may be too small.\n", pParam->BSIM3weffCV); - } + if (pParam->BSIM3clc < 0.0) + { fprintf(fplog, "Fatal: Clc = %g is negative.\n", pParam->BSIM3clc); + printf("Fatal: Clc = %g is negative.\n", pParam->BSIM3clc); + Fatal_Flag = 1; + } + + if (pParam->BSIM3moin < 5.0) + { fprintf(fplog, "Warning: Moin = %g is too small.\n", + pParam->BSIM3moin); + printf("Warning: Moin = %g is too small.\n", pParam->BSIM3moin); + } + if (pParam->BSIM3moin > 25.0) + { fprintf(fplog, "Warning: Moin = %g is too large.\n", + pParam->BSIM3moin); + printf("Warning: Moin = %g is too large.\n", pParam->BSIM3moin); + } + + if(model->BSIM3capMod ==3) { + if (pParam->BSIM3acde < 0.4) + { fprintf(fplog, "Warning: Acde = %g is too small.\n", + pParam->BSIM3acde); + printf("Warning: Acde = %g is too small.\n", pParam->BSIM3acde); + } + if (pParam->BSIM3acde > 1.6) + { fprintf(fplog, "Warning: Acde = %g is too large.\n", + pParam->BSIM3acde); + printf("Warning: Acde = %g is too large.\n", pParam->BSIM3acde); + } + } + if (model->BSIM3paramChk ==1) + { +/* Check L and W parameters */ + if (pParam->BSIM3leff <= 5.0e-8) + { fprintf(fplog, "Warning: Leff = %g may be too small.\n", + pParam->BSIM3leff); + printf("Warning: Leff = %g may be too small.\n", + pParam->BSIM3leff); + } + + if (pParam->BSIM3leffCV <= 5.0e-8) + { fprintf(fplog, "Warning: Leff for CV = %g may be too small.\n", + pParam->BSIM3leffCV); + printf("Warning: Leff for CV = %g may be too small.\n", + pParam->BSIM3leffCV); + } + + if (pParam->BSIM3weff <= 1.0e-7) + { fprintf(fplog, "Warning: Weff = %g may be too small.\n", + pParam->BSIM3weff); + printf("Warning: Weff = %g may be too small.\n", + pParam->BSIM3weff); + } + + if (pParam->BSIM3weffCV <= 1.0e-7) + { fprintf(fplog, "Warning: Weff for CV = %g may be too small.\n", + pParam->BSIM3weffCV); + printf("Warning: Weff for CV = %g may be too small.\n", + pParam->BSIM3weffCV); + } + /* Check threshold voltage parameters */ - if (pParam->BSIM3nlx < 0.0) - { - fprintf (fplog, - "Warning: Nlx = %g is negative.\n", - pParam->BSIM3nlx); - printf ("Warning: Nlx = %g is negative.\n", - pParam->BSIM3nlx); - } - if (model->BSIM3tox < 1.0e-9) - { - fprintf (fplog, - "Warning: Tox = %g is less than 10A.\n", - model->BSIM3tox); - printf ("Warning: Tox = %g is less than 10A.\n", model->BSIM3tox); - } - - if (pParam->BSIM3npeak <= 1.0e15) - { - fprintf (fplog, - "Warning: Nch = %g may be too small.\n", - pParam->BSIM3npeak); - printf ("Warning: Nch = %g may be too small.\n", pParam->BSIM3npeak); - } - else if (pParam->BSIM3npeak >= 1.0e21) - { - fprintf (fplog, - "Warning: Nch = %g may be too large.\n", - pParam->BSIM3npeak); - printf ("Warning: Nch = %g may be too large.\n", pParam->BSIM3npeak); - } - - if (pParam->BSIM3nsub <= 1.0e14) - { - fprintf (fplog, - "Warning: Nsub = %g may be too small.\n", - pParam->BSIM3nsub); - printf ("Warning: Nsub = %g may be too small.\n", pParam->BSIM3nsub); - } - else if (pParam->BSIM3nsub >= 1.0e21) - { - fprintf (fplog, - "Warning: Nsub = %g may be too large.\n", - pParam->BSIM3nsub); - printf ("Warning: Nsub = %g may be too large.\n", pParam->BSIM3nsub); - } - - if ((pParam->BSIM3ngate > 0.0) && - (pParam->BSIM3ngate <= 1.e18)) - { - fprintf (fplog, - "Warning: Ngate = %g is less than 1.E18cm^-3.\n", - pParam->BSIM3ngate); - printf ("Warning: Ngate = %g is less than 1.E18cm^-3.\n", pParam->BSIM3ngate); - } - - if (pParam->BSIM3dvt0 < 0.0) - { - fprintf (fplog, - "Warning: Dvt0 = %g is negative.\n", - pParam->BSIM3dvt0); - printf ("Warning: Dvt0 = %g is negative.\n", - pParam->BSIM3dvt0); - } - - if (fabs - (1.0e-6 / (pParam->BSIM3w0 + pParam->BSIM3weff)) > - 10.0) - { - fprintf (fplog, - "Warning: (W0 + Weff) may be too small.\n"); - printf ("Warning: (W0 + Weff) may be too small.\n"); - } + if (pParam->BSIM3nlx < 0.0) + { fprintf(fplog, "Warning: Nlx = %g is negative.\n", pParam->BSIM3nlx); + printf("Warning: Nlx = %g is negative.\n", pParam->BSIM3nlx); + } + if (model->BSIM3tox < 1.0e-9) + { fprintf(fplog, "Warning: Tox = %g is less than 10A.\n", + model->BSIM3tox); + printf("Warning: Tox = %g is less than 10A.\n", model->BSIM3tox); + } + + if (pParam->BSIM3npeak <= 1.0e15) + { fprintf(fplog, "Warning: Nch = %g may be too small.\n", + pParam->BSIM3npeak); + printf("Warning: Nch = %g may be too small.\n", + pParam->BSIM3npeak); + } + else if (pParam->BSIM3npeak >= 1.0e21) + { fprintf(fplog, "Warning: Nch = %g may be too large.\n", + pParam->BSIM3npeak); + printf("Warning: Nch = %g may be too large.\n", + pParam->BSIM3npeak); + } + + if (pParam->BSIM3nsub <= 1.0e14) + { fprintf(fplog, "Warning: Nsub = %g may be too small.\n", + pParam->BSIM3nsub); + printf("Warning: Nsub = %g may be too small.\n", + pParam->BSIM3nsub); + } + else if (pParam->BSIM3nsub >= 1.0e21) + { fprintf(fplog, "Warning: Nsub = %g may be too large.\n", + pParam->BSIM3nsub); + printf("Warning: Nsub = %g may be too large.\n", + pParam->BSIM3nsub); + } + + if ((pParam->BSIM3ngate > 0.0) && + (pParam->BSIM3ngate <= 1.e18)) + { fprintf(fplog, "Warning: Ngate = %g is less than 1.E18cm^-3.\n", + pParam->BSIM3ngate); + printf("Warning: Ngate = %g is less than 1.E18cm^-3.\n", + pParam->BSIM3ngate); + } + + if (pParam->BSIM3dvt0 < 0.0) + { fprintf(fplog, "Warning: Dvt0 = %g is negative.\n", + pParam->BSIM3dvt0); + printf("Warning: Dvt0 = %g is negative.\n", pParam->BSIM3dvt0); + } + + if (fabs(1.0e-6 / (pParam->BSIM3w0 + pParam->BSIM3weff)) > 10.0) + { fprintf(fplog, "Warning: (W0 + Weff) may be too small.\n"); + printf("Warning: (W0 + Weff) may be too small.\n"); + } /* Check subthreshold parameters */ - if (pParam->BSIM3nfactor < 0.0) - { - fprintf (fplog, - "Warning: Nfactor = %g is negative.\n", - pParam->BSIM3nfactor); - printf ("Warning: Nfactor = %g is negative.\n", pParam->BSIM3nfactor); - } - if (pParam->BSIM3cdsc < 0.0) - { - fprintf (fplog, - "Warning: Cdsc = %g is negative.\n", - pParam->BSIM3cdsc); - printf ("Warning: Cdsc = %g is negative.\n", - pParam->BSIM3cdsc); - } - if (pParam->BSIM3cdscd < 0.0) - { - fprintf (fplog, - "Warning: Cdscd = %g is negative.\n", - pParam->BSIM3cdscd); - printf ("Warning: Cdscd = %g is negative.\n", - pParam->BSIM3cdscd); - } + if (pParam->BSIM3nfactor < 0.0) + { fprintf(fplog, "Warning: Nfactor = %g is negative.\n", + pParam->BSIM3nfactor); + printf("Warning: Nfactor = %g is negative.\n", pParam->BSIM3nfactor); + } + if (pParam->BSIM3cdsc < 0.0) + { fprintf(fplog, "Warning: Cdsc = %g is negative.\n", + pParam->BSIM3cdsc); + printf("Warning: Cdsc = %g is negative.\n", pParam->BSIM3cdsc); + } + if (pParam->BSIM3cdscd < 0.0) + { fprintf(fplog, "Warning: Cdscd = %g is negative.\n", + pParam->BSIM3cdscd); + printf("Warning: Cdscd = %g is negative.\n", pParam->BSIM3cdscd); + } /* Check DIBL parameters */ - if (pParam->BSIM3eta0 < 0.0) - { - fprintf (fplog, - "Warning: Eta0 = %g is negative.\n", - pParam->BSIM3eta0); - printf ("Warning: Eta0 = %g is negative.\n", - pParam->BSIM3eta0); - } - -/* Check Abulk parameters */ - if (fabs - (1.0e-6 / (pParam->BSIM3b1 + pParam->BSIM3weff)) > - 10.0) - { - fprintf (fplog, - "Warning: (B1 + Weff) may be too small.\n"); - printf ("Warning: (B1 + Weff) may be too small.\n"); - } - + if (pParam->BSIM3eta0 < 0.0) + { fprintf(fplog, "Warning: Eta0 = %g is negative.\n", + pParam->BSIM3eta0); + printf("Warning: Eta0 = %g is negative.\n", pParam->BSIM3eta0); + } + +/* Check Abulk parameters */ + if (fabs(1.0e-6 / (pParam->BSIM3b1 + pParam->BSIM3weff)) > 10.0) + { fprintf(fplog, "Warning: (B1 + Weff) may be too small.\n"); + printf("Warning: (B1 + Weff) may be too small.\n"); + } + /* Check Saturation parameters */ - if (pParam->BSIM3a2 < 0.01) - { - fprintf (fplog, - "Warning: A2 = %g is too small. Set to 0.01.\n", - pParam->BSIM3a2); - printf ("Warning: A2 = %g is too small. Set to 0.01.\n", pParam->BSIM3a2); - pParam->BSIM3a2 = 0.01; - } - else if (pParam->BSIM3a2 > 1.0) - { - fprintf (fplog, - "Warning: A2 = %g is larger than 1. A2 is set to 1 and A1 is set to 0.\n", - pParam->BSIM3a2); - printf ("Warning: A2 = %g is larger than 1. A2 is set to 1 and A1 is set to 0.\n", pParam->BSIM3a2); - pParam->BSIM3a2 = 1.0; - pParam->BSIM3a1 = 0.0; - - } - - if (pParam->BSIM3rdsw < 0.0) - { - fprintf (fplog, - "Warning: Rdsw = %g is negative. Set to zero.\n", - pParam->BSIM3rdsw); - printf ("Warning: Rdsw = %g is negative. Set to zero.\n", pParam->BSIM3rdsw); - pParam->BSIM3rdsw = 0.0; - pParam->BSIM3rds0 = 0.0; - } - else if ((pParam->BSIM3rds0 > 0.0) - && (pParam->BSIM3rds0 < 0.001)) - { - fprintf (fplog, - "Warning: Rds at current temperature = %g is less than 0.001 ohm. Set to zero.\n", - pParam->BSIM3rds0); - printf ("Warning: Rds at current temperature = %g is less than 0.001 ohm. Set to zero.\n", pParam->BSIM3rds0); - pParam->BSIM3rds0 = 0.0; - } - if (pParam->BSIM3vsattemp < 1.0e3) - { - fprintf (fplog, - "Warning: Vsat at current temperature = %g may be too small.\n", - pParam->BSIM3vsattemp); - printf ("Warning: Vsat at current temperature = %g may be too small.\n", pParam->BSIM3vsattemp); - } - - if (pParam->BSIM3pdibl1 < 0.0) - { - fprintf (fplog, - "Warning: Pdibl1 = %g is negative.\n", - pParam->BSIM3pdibl1); - printf ("Warning: Pdibl1 = %g is negative.\n", - pParam->BSIM3pdibl1); - } - if (pParam->BSIM3pdibl2 < 0.0) - { - fprintf (fplog, - "Warning: Pdibl2 = %g is negative.\n", - pParam->BSIM3pdibl2); - printf ("Warning: Pdibl2 = %g is negative.\n", - pParam->BSIM3pdibl2); - } -/* Check overlap capacitance parameters */ - if (model->BSIM3cgdo < 0.0) - { - fprintf (fplog, - "Warning: cgdo = %g is negative. Set to zero.\n", - model->BSIM3cgdo); - printf ("Warning: cgdo = %g is negative. Set to zero.\n", model->BSIM3cgdo); - model->BSIM3cgdo = 0.0; - } - if (model->BSIM3cgso < 0.0) - { - fprintf (fplog, - "Warning: cgso = %g is negative. Set to zero.\n", - model->BSIM3cgso); - printf ("Warning: cgso = %g is negative. Set to zero.\n", model->BSIM3cgso); - model->BSIM3cgso = 0.0; - } - if (model->BSIM3cgbo < 0.0) - { - fprintf (fplog, - "Warning: cgbo = %g is negative. Set to zero.\n", - model->BSIM3cgbo); - printf ("Warning: cgbo = %g is negative. Set to zero.\n", model->BSIM3cgbo); - model->BSIM3cgbo = 0.0; - } - - } /* loop for the parameter check for warning messages */ - fclose (fplog); + if (pParam->BSIM3a2 < 0.01) + { fprintf(fplog, "Warning: A2 = %g is too small. Set to 0.01.\n", pParam->BSIM3a2); + printf("Warning: A2 = %g is too small. Set to 0.01.\n", + pParam->BSIM3a2); + pParam->BSIM3a2 = 0.01; } - else - { - fprintf (stderr, - "Warning: Can't open log file. Parameter checking skipped.\n"); + else if (pParam->BSIM3a2 > 1.0) + { fprintf(fplog, "Warning: A2 = %g is larger than 1. A2 is set to 1 and A1 is set to 0.\n", + pParam->BSIM3a2); + printf("Warning: A2 = %g is larger than 1. A2 is set to 1 and A1 is set to 0.\n", + pParam->BSIM3a2); + pParam->BSIM3a2 = 1.0; + pParam->BSIM3a1 = 0.0; + + } + + if (pParam->BSIM3rdsw < 0.0) + { fprintf(fplog, "Warning: Rdsw = %g is negative. Set to zero.\n", + pParam->BSIM3rdsw); + printf("Warning: Rdsw = %g is negative. Set to zero.\n", + pParam->BSIM3rdsw); + pParam->BSIM3rdsw = 0.0; + pParam->BSIM3rds0 = 0.0; + } + else if ((pParam->BSIM3rds0 > 0.0) && (pParam->BSIM3rds0 < 0.001)) + { fprintf(fplog, "Warning: Rds at current temperature = %g is less than 0.001 ohm. Set to zero.\n", + pParam->BSIM3rds0); + printf("Warning: Rds at current temperature = %g is less than 0.001 ohm. Set to zero.\n", + pParam->BSIM3rds0); + pParam->BSIM3rds0 = 0.0; + } + if (pParam->BSIM3vsattemp < 1.0e3) + { fprintf(fplog, "Warning: Vsat at current temperature = %g may be too small.\n", pParam->BSIM3vsattemp); + printf("Warning: Vsat at current temperature = %g may be too small.\n", pParam->BSIM3vsattemp); } - return (Fatal_Flag); + if (pParam->BSIM3pdibl1 < 0.0) + { fprintf(fplog, "Warning: Pdibl1 = %g is negative.\n", + pParam->BSIM3pdibl1); + printf("Warning: Pdibl1 = %g is negative.\n", pParam->BSIM3pdibl1); + } + if (pParam->BSIM3pdibl2 < 0.0) + { fprintf(fplog, "Warning: Pdibl2 = %g is negative.\n", + pParam->BSIM3pdibl2); + printf("Warning: Pdibl2 = %g is negative.\n", pParam->BSIM3pdibl2); + } +/* Check overlap capacitance parameters */ + if (model->BSIM3cgdo < 0.0) + { fprintf(fplog, "Warning: cgdo = %g is negative. Set to zero.\n", model->BSIM3cgdo); + printf("Warning: cgdo = %g is negative. Set to zero.\n", model->BSIM3cgdo); + model->BSIM3cgdo = 0.0; + } + if (model->BSIM3cgso < 0.0) + { fprintf(fplog, "Warning: cgso = %g is negative. Set to zero.\n", model->BSIM3cgso); + printf("Warning: cgso = %g is negative. Set to zero.\n", model->BSIM3cgso); + model->BSIM3cgso = 0.0; + } + if (model->BSIM3cgbo < 0.0) + { fprintf(fplog, "Warning: cgbo = %g is negative. Set to zero.\n", model->BSIM3cgbo); + printf("Warning: cgbo = %g is negative. Set to zero.\n", model->BSIM3cgbo); + model->BSIM3cgbo = 0.0; + } + + }/* loop for the parameter check for warning messages */ + fclose(fplog); + } + else + { fprintf(stderr, "Warning: Can't open log file. Parameter checking skipped.\n"); + } + + return(Fatal_Flag); } + diff --git a/src/spicelib/devices/bsim3/b3cvtest.c b/src/spicelib/devices/bsim3/b3cvtest.c index 9608e3038..db2b7542c 100644 --- a/src/spicelib/devices/bsim3/b3cvtest.c +++ b/src/spicelib/devices/bsim3/b3cvtest.c @@ -1,3 +1,5 @@ +/**** BSIM3v3.2.4, Released by Xuemei Xi 12/14/2001 ****/ + /********** * Copyright 2001 Regents of the University of California. All rights reserved. * File: b3cvtest.c of BSIM3v3.2.4 @@ -7,16 +9,6 @@ * Modified by Paolo Nenzi 2002 **********/ -/* - * Release Notes: - * BSIM3v3.2.4, Released by Xuemei Xi 12/14/2001 - * BSIM3v3.2.3, Released by Xuemei Xi 10/05/2001 - * BSIM3v3.2.2, Released by Weidong Liu 04/20/1999 - * BSIM3v3.2, Released by Weidong Liu 06/16/1998 - */ - -/*************************************/ - #include "ngspice.h" #include "cktdefs.h" #include "bsim3def.h" @@ -28,111 +20,91 @@ int -BSIM3convTest (GENmodel * inModel, CKTcircuit * ckt) +BSIM3convTest (GENmodel *inModel, CKTcircuit *ckt) { - BSIM3model *model = (BSIM3model *) inModel; - BSIM3instance *here; - double delvbd, delvbs, delvds, delvgd, delvgs, vbd, vbs, vds; - double cbd, cbhat, cbs, cd, cdhat, tol, vgd, vgdo, vgs; +BSIM3model *model = (BSIM3model*)inModel; +BSIM3instance *here; +double delvbd, delvbs, delvds, delvgd, delvgs, vbd, vbs, vds; +double cbd, cbhat, cbs, cd, cdhat, tol, vgd, vgdo, vgs; - /* loop through all the BSIM3 device models */ - for (; model != NULL; model = model->BSIM3nextModel) - { /* loop through all the instances of the model */ - for (here = model->BSIM3instances; here != NULL; - here = here->BSIM3nextInstance) - { + /* loop through all the BSIM3 device models */ + for (; model != NULL; model = model->BSIM3nextModel) + { /* loop through all the instances of the model */ + for (here = model->BSIM3instances; here != NULL ; + here=here->BSIM3nextInstance) + { - if (here->BSIM3owner != ARCHme) - continue; + if (here->BSIM3owner != ARCHme) + continue; - vbs = model->BSIM3type - * (*(ckt->CKTrhsOld + here->BSIM3bNode) - - *(ckt->CKTrhsOld + - here->BSIM3sNodePrime)); - vgs = model->BSIM3type * - (*(ckt->CKTrhsOld + here->BSIM3gNode) - - *(ckt->CKTrhsOld + here->BSIM3sNodePrime)); - vds = model->BSIM3type * - (*(ckt->CKTrhsOld + here->BSIM3dNodePrime) - - *(ckt->CKTrhsOld + here->BSIM3sNodePrime)); - vbd = vbs - vds; - vgd = vgs - vds; - vgdo = *(ckt->CKTstate0 + here->BSIM3vgs) - - *(ckt->CKTstate0 + here->BSIM3vds); - delvbs = vbs - *(ckt->CKTstate0 + here->BSIM3vbs); - delvbd = vbd - *(ckt->CKTstate0 + here->BSIM3vbd); - delvgs = vgs - *(ckt->CKTstate0 + here->BSIM3vgs); - delvds = vds - *(ckt->CKTstate0 + here->BSIM3vds); - delvgd = vgd - vgdo; + vbs = model->BSIM3type + * (*(ckt->CKTrhsOld+here->BSIM3bNode) + - *(ckt->CKTrhsOld+here->BSIM3sNodePrime)); + vgs = model->BSIM3type + * (*(ckt->CKTrhsOld+here->BSIM3gNode) + - *(ckt->CKTrhsOld+here->BSIM3sNodePrime)); + vds = model->BSIM3type + * (*(ckt->CKTrhsOld+here->BSIM3dNodePrime) + - *(ckt->CKTrhsOld+here->BSIM3sNodePrime)); + vbd = vbs - vds; + vgd = vgs - vds; + vgdo = *(ckt->CKTstate0 + here->BSIM3vgs) + - *(ckt->CKTstate0 + here->BSIM3vds); + delvbs = vbs - *(ckt->CKTstate0 + here->BSIM3vbs); + delvbd = vbd - *(ckt->CKTstate0 + here->BSIM3vbd); + delvgs = vgs - *(ckt->CKTstate0 + here->BSIM3vgs); + delvds = vds - *(ckt->CKTstate0 + here->BSIM3vds); + delvgd = vgd-vgdo; - cd = here->BSIM3cd - here->BSIM3cbd; - if (here->BSIM3mode >= 0) - { - cd += here->BSIM3csub; - cdhat = cd - here->BSIM3gbd * delvbd - + (here->BSIM3gmbs + - here->BSIM3gbbs) * delvbs + - (here->BSIM3gm + - here->BSIM3gbgs) * delvgs + - (here->BSIM3gds + - here->BSIM3gbds) * delvds; - } - else - { - cdhat = cd + (here->BSIM3gmbs - - here->BSIM3gbd) * delvbd + - here->BSIM3gm * delvgd - - here->BSIM3gds * delvds; - } + cd = here->BSIM3cd - here->BSIM3cbd; + if (here->BSIM3mode >= 0) + { cd += here->BSIM3csub; + cdhat = cd - here->BSIM3gbd * delvbd + + (here->BSIM3gmbs + here->BSIM3gbbs) * delvbs + + (here->BSIM3gm + here->BSIM3gbgs) * delvgs + + (here->BSIM3gds + here->BSIM3gbds) * delvds; + } + else + { cdhat = cd + (here->BSIM3gmbs - here->BSIM3gbd) * delvbd + + here->BSIM3gm * delvgd - here->BSIM3gds * delvds; + } - /* - * check convergence - */ - if ((here->BSIM3off == 0) - || (!(ckt->CKTmode & MODEINITFIX))) - { - tol = ckt->CKTreltol * MAX (fabs (cdhat), - fabs (cd)) + - ckt->CKTabstol; - if (fabs (cdhat - cd) >= tol) - { - ckt->CKTnoncon++; - return (OK); - } - cbs = here->BSIM3cbs; - cbd = here->BSIM3cbd; - if (here->BSIM3mode >= 0) - { - cbhat = cbs + cbd - here->BSIM3csub - + here->BSIM3gbd * delvbd - + (here->BSIM3gbs - - here->BSIM3gbbs) * delvbs - - here->BSIM3gbgs * delvgs - - here->BSIM3gbds * delvds; - } - else - { - cbhat = cbs + cbd - here->BSIM3csub - + here->BSIM3gbs * delvbs - + (here->BSIM3gbd - - here->BSIM3gbbs) * delvbd - - here->BSIM3gbgs * delvgd + - here->BSIM3gbds * delvds; - } - tol = ckt->CKTreltol * MAX (fabs (cbhat), - fabs (cbs + cbd - - here-> - BSIM3csub)) - + ckt->CKTabstol; - if (fabs - (cbhat - (cbs + cbd - here->BSIM3csub)) > - tol) - { - ckt->CKTnoncon++; - return (OK); - } - } - } - } - return (OK); + /* + * check convergence + */ + if ((here->BSIM3off == 0) || (!(ckt->CKTmode & MODEINITFIX))) + { tol = ckt->CKTreltol * MAX(fabs(cdhat), fabs(cd)) + + ckt->CKTabstol; + if (fabs(cdhat - cd) >= tol) + { ckt->CKTnoncon++; + return(OK); + } + cbs = here->BSIM3cbs; + cbd = here->BSIM3cbd; + if (here->BSIM3mode >= 0) + { cbhat = cbs + cbd - here->BSIM3csub + + here->BSIM3gbd * delvbd + + (here->BSIM3gbs - here->BSIM3gbbs) * delvbs + - here->BSIM3gbgs * delvgs + - here->BSIM3gbds * delvds; + } + else + { cbhat = cbs + cbd - here->BSIM3csub + + here->BSIM3gbs * delvbs + + (here->BSIM3gbd - here->BSIM3gbbs) * delvbd + - here->BSIM3gbgs * delvgd + + here->BSIM3gbds * delvds; + } + tol = ckt->CKTreltol * MAX(fabs(cbhat), + fabs(cbs + cbd - here->BSIM3csub)) + ckt->CKTabstol; + if (fabs(cbhat - (cbs + cbd - here->BSIM3csub)) > tol) + { ckt->CKTnoncon++; + return(OK); + } + } + } + } + return(OK); } + + diff --git a/src/spicelib/devices/bsim3/b3del.c b/src/spicelib/devices/bsim3/b3del.c index 14d8ec78b..3881752d6 100644 --- a/src/spicelib/devices/bsim3/b3del.c +++ b/src/spicelib/devices/bsim3/b3del.c @@ -1,3 +1,5 @@ +/**** BSIM3v3.2.4, Released by Xuemei Xi 12/14/2001 ****/ + /********** * Copyright 2001 Regents of the University of California. All rights reserved. * File: b3del.c of BSIM3v3.2.4 @@ -8,17 +10,6 @@ * Modified by Paolo Nenzi 2002 **********/ -/* - * Release Notes: - * BSIM3v3.2.4, Released by Xuemei Xi 12/14/2001 - * BSIM3v3.2.3, Released by Xuemei Xi 10/05/2001 - * BSIM3v3.2.2, Released by Weidong Liu 04/20/1999 - * BSIM3v3.2, Released by Weidong Liu 06/16/1998 - */ - - -/*************************************/ - #include "ngspice.h" #include "bsim3def.h" #include "sperror.h" @@ -27,27 +18,23 @@ int -BSIM3delete (GENmodel * inModel, IFuid name, GENinstance ** inInst) +BSIM3delete (GENmodel *inModel, IFuid name, GENinstance **inInst) { - BSIM3instance **fast = (BSIM3instance **) inInst; - BSIM3model *model = (BSIM3model *) inModel; - BSIM3instance **prev = NULL; - BSIM3instance *here; +BSIM3instance **fast = (BSIM3instance**)inInst; +BSIM3model *model = (BSIM3model*)inModel; +BSIM3instance **prev = NULL; +BSIM3instance *here; - for (; model; model = model->BSIM3nextModel) - { - prev = &(model->BSIM3instances); - for (here = *prev; here; here = *prev) - { - if (here->BSIM3name == name - || (fast && here == *fast)) - { - *prev = here->BSIM3nextInstance; - FREE (here); - return (OK); - } - prev = &(here->BSIM3nextInstance); - } - } - return (E_NODEV); + for (; model ; model = model->BSIM3nextModel) + { prev = &(model->BSIM3instances); + for (here = *prev; here ; here = *prev) + { if (here->BSIM3name == name || (fast && here==*fast)) + { *prev= here->BSIM3nextInstance; + FREE(here); + return(OK); + } + prev = &(here->BSIM3nextInstance); + } + } + return(E_NODEV); } diff --git a/src/spicelib/devices/bsim3/b3dest.c b/src/spicelib/devices/bsim3/b3dest.c index beaa097f9..9a9079a81 100644 --- a/src/spicelib/devices/bsim3/b3dest.c +++ b/src/spicelib/devices/bsim3/b3dest.c @@ -1,3 +1,5 @@ +/**** BSIM3v3.2.4, Released by Xuemei Xi 12/14/2001 ****/ + /********** * Copyright 2001 Regents of the University of California. All rights reserved. * File: b3dest.c of BSIM3v3.2.4 @@ -7,48 +9,30 @@ * Modified by Paolo Nenzi 2002 **********/ -/* - * Release Notes: - * BSIM3v3.2.4, Released by Xuemei Xi 12/14/2001 - * BSIM3v3.2.3, Released by Xuemei Xi 10/05/2001 - * BSIM3v3.2.2, Released by Weidong Liu 04/20/1999 - * BSIM3v3.2, Released by Weidong Liu 06/16/1998 - */ - - -/*************************************/ - #include "ngspice.h" #include "bsim3def.h" #include "suffix.h" void -BSIM3destroy (GENmodel ** inModel) +BSIM3destroy (GENmodel **inModel) { - BSIM3model **model = (BSIM3model **) inModel; - BSIM3instance *here; - BSIM3instance *prev = NULL; - BSIM3model *mod = *model; - BSIM3model *oldmod = NULL; +BSIM3model **model = (BSIM3model**)inModel; +BSIM3instance *here; +BSIM3instance *prev = NULL; +BSIM3model *mod = *model; +BSIM3model *oldmod = NULL; - for (; mod; mod = mod->BSIM3nextModel) - { - if (oldmod) - FREE (oldmod); - oldmod = mod; - prev = (BSIM3instance *) NULL; - for (here = mod->BSIM3instances; here; - here = here->BSIM3nextInstance) - { - if (prev) - FREE (prev); - prev = here; - } - if (prev) - FREE (prev); - } - if (oldmod) - FREE (oldmod); - *model = NULL; - return; + for (; mod ; mod = mod->BSIM3nextModel) + { if(oldmod) FREE(oldmod); + oldmod = mod; + prev = (BSIM3instance *)NULL; + for (here = mod->BSIM3instances; here; here = here->BSIM3nextInstance) + { if(prev) FREE(prev); + prev = here; + } + if(prev) FREE(prev); + } + if(oldmod) FREE(oldmod); + *model = NULL; + return; } diff --git a/src/spicelib/devices/bsim3/b3getic.c b/src/spicelib/devices/bsim3/b3getic.c index e64ab802b..a3a2715dc 100644 --- a/src/spicelib/devices/bsim3/b3getic.c +++ b/src/spicelib/devices/bsim3/b3getic.c @@ -1,23 +1,13 @@ +/**** BSIM3v3.2.4, Released by Xuemei Xi 12/14/2001 ****/ + /********** * Copyright 2001 Regents of the University of California. All rights reserved. * File: b3getic.c of BSIM3v3.2.4 * Author: 1995 Min-Chie Jeng and Mansun Chan. * Author: 1997-1999 Weidong Liu. * Author: 2001 Xuemei Xi - * Modified by Paolo Nenzi 2002 **********/ -/* - * Release Notes: - * BSIM3v3.2.4, Released by Xuemei Xi 12/14/2001 - * BSIM3v3.2.3, Released by Xuemei Xi 10/05/2001 - * BSIM3v3.2.2, Released by Weidong Liu 04/20/1999 - * BSIM3v3.2, Released by Weidong Liu 06/16/1998 - */ - - -/*************************************/ - #include "ngspice.h" #include "cktdefs.h" #include "bsim3def.h" @@ -26,39 +16,32 @@ int -BSIM3getic (GENmodel * inModel, CKTcircuit * ckt) +BSIM3getic (GENmodel *inModel, CKTcircuit *ckt) { - BSIM3model *model = (BSIM3model *) inModel; - BSIM3instance *here; - - for (; model; model = model->BSIM3nextModel) - { - for (here = model->BSIM3instances; here; - here = here->BSIM3nextInstance) - { +BSIM3model *model = (BSIM3model*)inModel; +BSIM3instance *here; + + for (; model ; model = model->BSIM3nextModel) + { for (here = model->BSIM3instances; here; here = here->BSIM3nextInstance) + { + if (here->BSIM3owner != ARCHme) + continue; + + if (!here->BSIM3icVBSGiven) + { here->BSIM3icVBS = *(ckt->CKTrhs + here->BSIM3bNode) + - *(ckt->CKTrhs + here->BSIM3sNode); + } + if (!here->BSIM3icVDSGiven) + { here->BSIM3icVDS = *(ckt->CKTrhs + here->BSIM3dNode) + - *(ckt->CKTrhs + here->BSIM3sNode); + } + if (!here->BSIM3icVGSGiven) + { here->BSIM3icVGS = *(ckt->CKTrhs + here->BSIM3gNode) + - *(ckt->CKTrhs + here->BSIM3sNode); + } + } + } + return(OK); +} - if (here->BSIM3owner != ARCHme) - continue; - if (!here->BSIM3icVBSGiven) - { - here->BSIM3icVBS = - *(ckt->CKTrhs + here->BSIM3bNode) - - *(ckt->CKTrhs + here->BSIM3sNode); - } - if (!here->BSIM3icVDSGiven) - { - here->BSIM3icVDS = - *(ckt->CKTrhs + here->BSIM3dNode) - - *(ckt->CKTrhs + here->BSIM3sNode); - } - if (!here->BSIM3icVGSGiven) - { - here->BSIM3icVGS = - *(ckt->CKTrhs + here->BSIM3gNode) - - *(ckt->CKTrhs + here->BSIM3sNode); - } - } - } - return (OK); -} diff --git a/src/spicelib/devices/bsim3/b3ld.c b/src/spicelib/devices/bsim3/b3ld.c index b0ab9801e..e2d58c4a1 100644 --- a/src/spicelib/devices/bsim3/b3ld.c +++ b/src/spicelib/devices/bsim3/b3ld.c @@ -1,3 +1,5 @@ +/**** BSIM3v3.2.4, Released by Xuemei Xi 12/21/2001 ****/ + /********** * Copyright 2001 Regents of the University of California. All rights reserved. * File: b3ld.c of BSIM3v3.2.4 @@ -6,20 +8,9 @@ * Author: 1997-1999 Weidong Liu. * Author: 2001 Xuemei Xi * Modified by Xuemei Xi, 10/05, 12/21, 2001. - * Modified by Paolo Nenzi 2002 + * Modified by Paolo Nenzi 2002 and Dietmar Warning 2003 **********/ -/* - * Release Notes: - * BSIM3v3.2.4, Released by Xuemei Xi 12/21/2001 - * BSIM3v3.2.3, Released by Xuemei Xi 10/05/2001 - * BSIM3v3.2.2, Released by Weidong Liu 04/20/1999 - * BSIM3v3.2, Released by Weidong Liu 06/16/1998 - */ - - -/*************************************/ - #include "ngspice.h" #include "cktdefs.h" #include "bsim3def.h" @@ -42,886 +33,768 @@ int -BSIM3load (GENmodel * inModel, CKTcircuit * ckt) +BSIM3load (GENmodel *inModel, CKTcircuit *ckt) { - BSIM3model *model = (BSIM3model *) inModel; - BSIM3instance *here; - double SourceSatCurrent, DrainSatCurrent; - double ag0, qgd, qgs, qgb, von, cbhat, VgstNVt, ExpVgst; - double cdrain, cdhat, cdreq, ceqbd, ceqbs, ceqqb, ceqqd, ceqqg, ceq, geq; - double czbd, czbdsw, czbdswg, czbs, czbssw, czbsswg, evbd, evbs, arg, sarg; - double delvbd, delvbs, delvds, delvgd, delvgs; - double Vfbeff, dVfbeff_dVg, dVfbeff_dVd, dVfbeff_dVb, V3, V4; - double gcbdb, gcbgb, gcbsb, gcddb, gcdgb, gcdsb, gcgdb, gcggb, gcgsb, gcsdb; - double gcsgb, gcssb, tol, MJ, MJSW, MJSWG; - double vbd, vbs, vds, vgb, vgd, vgs, vgdo, xfact; - double qgate, qbulk, qdrn, qsrc, qinoi, cqgate, cqbulk, cqdrn; - double Vds, Vgs, Vbs, Gmbs, FwdSum, RevSum; - double Vgs_eff, Vfb, dVfb_dVb, dVfb_dVd, dVbs_dVb; - double Phis, dPhis_dVb, sqrtPhis, dsqrtPhis_dVb, Vth, dVth_dVb, dVth_dVd; - double Vgst, dVgst_dVg, dVgst_dVb, dVgs_eff_dVg, Nvtm; - double Vgdt, Vgsaddvth, Vgsaddvth2, Vgsaddvth1o3, Vtm; - double n, dn_dVb, dn_dVd, voffcv, noff, dnoff_dVd, dnoff_dVb; - double ExpArg, ExpArg1, V0, CoxWLcen, QovCox, LINK; - double DeltaPhi, dDeltaPhi_dVg, dDeltaPhi_dVd, dDeltaPhi_dVb; - double Cox, Tox, Tcen, dTcen_dVg, dTcen_dVd, dTcen_dVb; - double Ccen, Coxeff, dCoxeff_dVg, dCoxeff_dVd, dCoxeff_dVb; - double Denomi, dDenomi_dVg, dDenomi_dVd, dDenomi_dVb; - double ueff, dueff_dVg, dueff_dVd, dueff_dVb; - double Esat, dEsat_dVg, dEsat_dVd, dEsat_dVb, Vdsat, Vdsat0; - double EsatL, dEsatL_dVg, dEsatL_dVd, dEsatL_dVb; - double Ilimit, Iexp, dIexp_dVg, dIexp_dVd, dIexp_dVb; - double dVdsat_dVg, dVdsat_dVb, dVdsat_dVd, Vasat, dAlphaz_dVg, dAlphaz_dVb; - double dVasat_dVg, dVasat_dVb, dVasat_dVd, Va, Va2, dVa_dVd, dVa_dVg, - dVa_dVb; - double Vbseff, dVbseff_dVb, VbseffCV, dVbseffCV_dVb; - double Arg1, Arg2, One_Third_CoxWL, Two_Third_CoxWL, Alphaz, CoxWL; - double dqbulk_dVb, dVgdt_dVg, dVgdt_dVd, dVgdt_dVb; - double T0, dT0_dVg, dT0_dVd, dT0_dVb; - double T1, dT1_dVg, dT1_dVd, dT1_dVb; - double T2, dT2_dVg, dT2_dVd, dT2_dVb; - double T3, dT3_dVg, dT3_dVd, dT3_dVb; - double T4, dT4_dVg, dT4_dVd, dT4_dVb; - double T5, dT5_dVg, dT5_dVd, dT5_dVb; - double T6, dT6_dVg, dT6_dVd, dT6_dVb; - double T7, dT7_dVg, dT7_dVd, dT7_dVb; - double T8, dT8_dVg, dT8_dVd, dT8_dVb; - double T9, dT9_dVg, dT9_dVd, dT9_dVb; - double T10, dT10_dVg, dT10_dVb, dT10_dVd; - double T11, T12; - double tmp, Abulk, dAbulk_dVb, Abulk0, dAbulk0_dVb; - double T100, T101; - double VACLM, dVACLM_dVg, dVACLM_dVd, dVACLM_dVb; - double VADIBL, dVADIBL_dVg, dVADIBL_dVd, dVADIBL_dVb; - double VAHCE, dVAHCE_dVg, dVAHCE_dVd, dVAHCE_dVb; - double Xdep, dXdep_dVb, lt1, dlt1_dVb, ltw, dltw_dVb, Delt_vth, - dDelt_vth_dVb; - double Theta0, dTheta0_dVb, Theta1, dTheta1_dVb; - double Thetarout, dThetarout_dVb, TempRatio, tmp1, tmp2, tmp3, tmp4; - double DIBL_Sft, dDIBL_Sft_dVd, DIBL_fact, Lambda, dLambda_dVg; - double Rout_Vgs_factor, dRout_Vgs_factor_dVg, dRout_Vgs_factor_dVb; - double dRout_Vgs_factor_dVd, Idtot, Ibtot; - double tempv, a1, ScalingFactor; - - double Vgsteff, dVgsteff_dVg, dVgsteff_dVd, dVgsteff_dVb; - double Vdseff, dVdseff_dVg, dVdseff_dVd, dVdseff_dVb; - double VdseffCV, dVdseffCV_dVg, dVdseffCV_dVd, dVdseffCV_dVb; - double diffVds, diffVdsCV, dAbulk_dVg; - double beta, dbeta_dVg, dbeta_dVd, dbeta_dVb; - double gche, dgche_dVg, dgche_dVd, dgche_dVb; - double fgche1, dfgche1_dVg, dfgche1_dVd, dfgche1_dVb; - double fgche2, dfgche2_dVg, dfgche2_dVd, dfgche2_dVb; - double Idl, dIdl_dVg, dIdl_dVd, dIdl_dVb; - double Idsa, dIdsa_dVg, dIdsa_dVd, dIdsa_dVb; - double Ids, Gm, Gds, Gmb; - double Isub, Isubd, Isubs, Gbd, Gbg, Gbb; - double VASCBE, dVASCBE_dVg, dVASCBE_dVd, dVASCBE_dVb; - double CoxWovL; - double Rds, dRds_dVg, dRds_dVb, WVCox, WVCoxRds; - double Vgst2Vtm, VdsatCV, dVdsatCV_dVd, dVdsatCV_dVg, dVdsatCV_dVb; - double Leff, Weff, dWeff_dVg, dWeff_dVb; - double AbulkCV, dAbulkCV_dVb; - double qgdo, qgso, cgdo, cgso; - - double qcheq, qdef, gqdef, cqdef, cqcheq, gtau_diff, gtau_drift, csreq; - double gcqdb, gcqsb, gcqgb, gcqbb, vss; - double dxpart, sxpart, ggtg, ggtd, ggts, ggtb; - double ddxpart_dVd, ddxpart_dVg, ddxpart_dVb, ddxpart_dVs; - double dsxpart_dVd, dsxpart_dVg, dsxpart_dVb, dsxpart_dVs; - - double gbspsp, gbbdp, gbbsp, gbspg, gbspb, gbspdp; - double gbdpdp, gbdpg, gbdpb, gbdpsp; - double Cgg, Cgd, Cgs, Cgb, Cdg, Cdd, Cds, Cdb, Qg, Qd; - double Csg, Csd, Css, Csb, Cbg, Cbd, Cbs, Cbb, Qs, Qb; - double Cgg1, Cgb1, Cgd1, Cbg1, Cbb1, Cbd1, Csg1, Csd1, Csb1, Qac0, Qsub0; - double dQac0_dVg, dQac0_dVd, dQac0_dVb, dQsub0_dVg, dQsub0_dVd, dQsub0_dVb; - - double m; - - struct bsim3SizeDependParam *pParam; - int ByPass, Check, ChargeComputationNeeded, J, error, I; - double junk[50]; - - ScalingFactor = 1.0e-9; - ChargeComputationNeeded = - ((ckt->CKTmode & (MODEAC | MODETRAN | MODEINITSMSIG)) || - ((ckt->CKTmode & MODETRANOP) && (ckt->CKTmode & MODEUIC))) ? 1 : 0; - - for (; model != NULL; model = model->BSIM3nextModel) - { - for (here = model->BSIM3instances; here != NULL; - here = here->BSIM3nextInstance) - { - +BSIM3model *model = (BSIM3model*)inModel; +BSIM3instance *here; +double SourceSatCurrent, DrainSatCurrent; +double ag0, qgd, qgs, qgb, von, cbhat, VgstNVt, ExpVgst; +double cdrain, cdhat, cdreq, ceqbd, ceqbs, ceqqb, ceqqd, ceqqg, ceq, geq; +double czbd, czbdsw, czbdswg, czbs, czbssw, czbsswg, evbd, evbs, arg, sarg; +double delvbd, delvbs, delvds, delvgd, delvgs; +double Vfbeff, dVfbeff_dVg, dVfbeff_dVd, dVfbeff_dVb, V3, V4; +double gcbdb, gcbgb, gcbsb, gcddb, gcdgb, gcdsb, gcgdb, gcggb, gcgsb, gcsdb; +double gcsgb, gcssb, MJ, MJSW, MJSWG; +double vbd, vbs, vds, vgb, vgd, vgs, vgdo, xfact; +double qgate, qbulk, qdrn, qsrc, qinoi, cqgate, cqbulk, cqdrn; +double Vds, Vgs, Vbs, Gmbs, FwdSum, RevSum; +double Vgs_eff, Vfb, dVfb_dVb, dVfb_dVd; +double Phis, dPhis_dVb, sqrtPhis, dsqrtPhis_dVb, Vth, dVth_dVb, dVth_dVd; +double Vgst, dVgst_dVg, dVgst_dVb, dVgs_eff_dVg, Nvtm; +double Vtm; +double n, dn_dVb, dn_dVd, voffcv, noff, dnoff_dVd, dnoff_dVb; +double ExpArg, V0, CoxWLcen, QovCox, LINK; +double DeltaPhi, dDeltaPhi_dVg, dDeltaPhi_dVd, dDeltaPhi_dVb; +double Cox, Tox, Tcen, dTcen_dVg, dTcen_dVd, dTcen_dVb; +double Ccen, Coxeff, dCoxeff_dVg, dCoxeff_dVd, dCoxeff_dVb; +double Denomi, dDenomi_dVg, dDenomi_dVd, dDenomi_dVb; +double ueff, dueff_dVg, dueff_dVd, dueff_dVb; +double Esat, Vdsat; +double EsatL, dEsatL_dVg, dEsatL_dVd, dEsatL_dVb; +double dVdsat_dVg, dVdsat_dVb, dVdsat_dVd, Vasat, dAlphaz_dVg, dAlphaz_dVb; +double dVasat_dVg, dVasat_dVb, dVasat_dVd, Va, dVa_dVd, dVa_dVg, dVa_dVb; +double Vbseff, dVbseff_dVb, VbseffCV, dVbseffCV_dVb; +double Arg1, One_Third_CoxWL, Two_Third_CoxWL, Alphaz, CoxWL; +double T0, dT0_dVg, dT0_dVd, dT0_dVb; +double T1, dT1_dVg, dT1_dVd, dT1_dVb; +double T2, dT2_dVg, dT2_dVd, dT2_dVb; +double T3, dT3_dVg, dT3_dVd, dT3_dVb; +double T4; +double T5; +double T6; +double T7; +double T8; +double T9; +double T10; +double T11, T12; +double tmp, Abulk, dAbulk_dVb, Abulk0, dAbulk0_dVb; +double VACLM, dVACLM_dVg, dVACLM_dVd, dVACLM_dVb; +double VADIBL, dVADIBL_dVg, dVADIBL_dVd, dVADIBL_dVb; +double Xdep, dXdep_dVb, lt1, dlt1_dVb, ltw, dltw_dVb, Delt_vth, dDelt_vth_dVb; +double Theta0, dTheta0_dVb; +double TempRatio, tmp1, tmp2, tmp3, tmp4; +double DIBL_Sft, dDIBL_Sft_dVd, Lambda, dLambda_dVg; +double Idtot, Ibtot; +double tempv, a1, ScalingFactor; + +double Vgsteff, dVgsteff_dVg, dVgsteff_dVd, dVgsteff_dVb; +double Vdseff, dVdseff_dVg, dVdseff_dVd, dVdseff_dVb; +double VdseffCV, dVdseffCV_dVg, dVdseffCV_dVd, dVdseffCV_dVb; +double diffVds, dAbulk_dVg; +double beta, dbeta_dVg, dbeta_dVd, dbeta_dVb; +double gche, dgche_dVg, dgche_dVd, dgche_dVb; +double fgche1, dfgche1_dVg, dfgche1_dVd, dfgche1_dVb; +double fgche2, dfgche2_dVg, dfgche2_dVd, dfgche2_dVb; +double Idl, dIdl_dVg, dIdl_dVd, dIdl_dVb; +double Idsa, dIdsa_dVg, dIdsa_dVd, dIdsa_dVb; +double Ids, Gm, Gds, Gmb; +double Isub, Gbd, Gbg, Gbb; +double VASCBE, dVASCBE_dVg, dVASCBE_dVd, dVASCBE_dVb; +double CoxWovL; +double Rds, dRds_dVg, dRds_dVb, WVCox, WVCoxRds; +double Vgst2Vtm, VdsatCV, dVdsatCV_dVg, dVdsatCV_dVb; +double Leff, Weff, dWeff_dVg, dWeff_dVb; +double AbulkCV, dAbulkCV_dVb; +double qgdo, qgso, cgdo, cgso; + +double qcheq, qdef, gqdef, cqdef, cqcheq, gtau_diff, gtau_drift; +double gcqdb,gcqsb,gcqgb,gcqbb; +double dxpart, sxpart, ggtg, ggtd, ggts, ggtb; +double ddxpart_dVd, ddxpart_dVg, ddxpart_dVb, ddxpart_dVs; +double dsxpart_dVd, dsxpart_dVg, dsxpart_dVb, dsxpart_dVs; + +double gbspsp, gbbdp, gbbsp, gbspg, gbspb, gbspdp; +double gbdpdp, gbdpg, gbdpb, gbdpsp; +double Cgg, Cgd, Cgb, Cdg, Cdd, Cds; +double Csg, Csd, Css, Csb, Cbg, Cbd, Cbb; +double Cgg1, Cgb1, Cgd1, Cbg1, Cbb1, Cbd1, Qac0, Qsub0; +double dQac0_dVg, dQac0_dVd, dQac0_dVb, dQsub0_dVg, dQsub0_dVd, dQsub0_dVb; + +double m; + +struct bsim3SizeDependParam *pParam; +int ByPass, Check, ChargeComputationNeeded, error; + +ScalingFactor = 1.0e-9; +ChargeComputationNeeded = + ((ckt->CKTmode & (MODEAC | MODETRAN | MODEINITSMSIG)) || + ((ckt->CKTmode & MODETRANOP) && (ckt->CKTmode & MODEUIC))) + ? 1 : 0; +for (; model != NULL; model = model->BSIM3nextModel) +{ for (here = model->BSIM3instances; here != NULL; + here = here->BSIM3nextInstance) + { if (here->BSIM3owner != ARCHme) continue; - - Check = 1; - ByPass = 0; + Check = 1; + ByPass = 0; pParam = here->pParam; - if ((ckt->CKTmode & MODEINITSMSIG)) - { - vbs = *(ckt->CKTstate0 + here->BSIM3vbs); - vgs = *(ckt->CKTstate0 + here->BSIM3vgs); - vds = *(ckt->CKTstate0 + here->BSIM3vds); - qdef = *(ckt->CKTstate0 + here->BSIM3qdef); - } + if ((ckt->CKTmode & MODEINITSMSIG)) + { vbs = *(ckt->CKTstate0 + here->BSIM3vbs); + vgs = *(ckt->CKTstate0 + here->BSIM3vgs); + vds = *(ckt->CKTstate0 + here->BSIM3vds); + qdef = *(ckt->CKTstate0 + here->BSIM3qdef); + } else if ((ckt->CKTmode & MODEINITTRAN)) - { - vbs = *(ckt->CKTstate1 + here->BSIM3vbs); - vgs = *(ckt->CKTstate1 + here->BSIM3vgs); - vds = *(ckt->CKTstate1 + here->BSIM3vds); - qdef = *(ckt->CKTstate1 + here->BSIM3qdef); - } + { vbs = *(ckt->CKTstate1 + here->BSIM3vbs); + vgs = *(ckt->CKTstate1 + here->BSIM3vgs); + vds = *(ckt->CKTstate1 + here->BSIM3vds); + qdef = *(ckt->CKTstate1 + here->BSIM3qdef); + } else if ((ckt->CKTmode & MODEINITJCT) && !here->BSIM3off) - { - vds = model->BSIM3type * here->BSIM3icVDS; - vgs = model->BSIM3type * here->BSIM3icVGS; - vbs = model->BSIM3type * here->BSIM3icVBS; - qdef = 0.0; - - if ((vds == 0.0) && (vgs == 0.0) - && (vbs == 0.0) - && - ((ckt-> - CKTmode & (MODETRAN | MODEAC | MODEDCOP | - MODEDCTRANCURVE)) - || (!(ckt->CKTmode & MODEUIC)))) - { - vbs = 0.0; - vgs = model->BSIM3type * pParam->BSIM3vth0 + 0.1; - vds = 0.1; - } - } - else if ((ckt->CKTmode & (MODEINITJCT | MODEINITFIX)) - && (here->BSIM3off)) - { - qdef = vbs = vgs = vds = 0.0; - } - else - { + { vds = model->BSIM3type * here->BSIM3icVDS; + vgs = model->BSIM3type * here->BSIM3icVGS; + vbs = model->BSIM3type * here->BSIM3icVBS; + qdef = 0.0; + + if ((vds == 0.0) && (vgs == 0.0) && (vbs == 0.0) && + ((ckt->CKTmode & (MODETRAN | MODEAC|MODEDCOP | + MODEDCTRANCURVE)) || (!(ckt->CKTmode & MODEUIC)))) + { vbs = 0.0; + vgs = model->BSIM3type * pParam->BSIM3vth0 + 0.1; + vds = 0.1; + } + } + else if ((ckt->CKTmode & (MODEINITJCT | MODEINITFIX)) && + (here->BSIM3off)) + { qdef = vbs = vgs = vds = 0.0; + } + else + { #ifndef PREDICTOR - if ((ckt->CKTmode & MODEINITPRED)) - { - xfact = ckt->CKTdelta / ckt->CKTdeltaOld[1]; - *(ckt->CKTstate0 + here->BSIM3vbs) = - *(ckt->CKTstate1 + here->BSIM3vbs); - vbs = (1.0 + - xfact) * (*(ckt->CKTstate1 + - here->BSIM3vbs)) - - (xfact * (*(ckt->CKTstate2 + here->BSIM3vbs))); - *(ckt->CKTstate0 + here->BSIM3vgs) = - *(ckt->CKTstate1 + here->BSIM3vgs); - vgs = (1.0 + - xfact) * (*(ckt->CKTstate1 + - here->BSIM3vgs)) - - (xfact * (*(ckt->CKTstate2 + here->BSIM3vgs))); - *(ckt->CKTstate0 + here->BSIM3vds) = - *(ckt->CKTstate1 + here->BSIM3vds); - vds = (1.0 + - xfact) * (*(ckt->CKTstate1 + - here->BSIM3vds)) - - (xfact * (*(ckt->CKTstate2 + here->BSIM3vds))); - *(ckt->CKTstate0 + here->BSIM3vbd) = - *(ckt->CKTstate0 + - here->BSIM3vbs) - *(ckt->CKTstate0 + here->BSIM3vds); - *(ckt->CKTstate0 + here->BSIM3qdef) = - *(ckt->CKTstate1 + here->BSIM3qdef); - qdef = (1.0 + - xfact) * (*(ckt->CKTstate1 + - here-> - BSIM3qdef)) - - (xfact * (*(ckt->CKTstate2 + here->BSIM3qdef))); - } - else - { + if ((ckt->CKTmode & MODEINITPRED)) + { xfact = ckt->CKTdelta / ckt->CKTdeltaOld[1]; + *(ckt->CKTstate0 + here->BSIM3vbs) = + *(ckt->CKTstate1 + here->BSIM3vbs); + vbs = (1.0 + xfact)* (*(ckt->CKTstate1 + here->BSIM3vbs)) + - (xfact * (*(ckt->CKTstate2 + here->BSIM3vbs))); + *(ckt->CKTstate0 + here->BSIM3vgs) = + *(ckt->CKTstate1 + here->BSIM3vgs); + vgs = (1.0 + xfact)* (*(ckt->CKTstate1 + here->BSIM3vgs)) + - (xfact * (*(ckt->CKTstate2 + here->BSIM3vgs))); + *(ckt->CKTstate0 + here->BSIM3vds) = + *(ckt->CKTstate1 + here->BSIM3vds); + vds = (1.0 + xfact)* (*(ckt->CKTstate1 + here->BSIM3vds)) + - (xfact * (*(ckt->CKTstate2 + here->BSIM3vds))); + *(ckt->CKTstate0 + here->BSIM3vbd) = + *(ckt->CKTstate0 + here->BSIM3vbs) + - *(ckt->CKTstate0 + here->BSIM3vds); + *(ckt->CKTstate0 + here->BSIM3qdef) = + *(ckt->CKTstate1 + here->BSIM3qdef); + qdef = (1.0 + xfact)* (*(ckt->CKTstate1 + here->BSIM3qdef)) + -(xfact * (*(ckt->CKTstate2 + here->BSIM3qdef))); + } + else + { #endif /* PREDICTOR */ - vbs = model->BSIM3type - * - (* - (ckt->CKTrhsOld + - here->BSIM3bNode) - - *(ckt->CKTrhsOld + here->BSIM3sNodePrime)); - vgs = model->BSIM3type * - (* - (ckt->CKTrhsOld + - here->BSIM3gNode) - - *(ckt->CKTrhsOld + here->BSIM3sNodePrime)); - vds = model->BSIM3type * - (* - (ckt->CKTrhsOld + - here->BSIM3dNodePrime) - - *(ckt->CKTrhsOld + here->BSIM3sNodePrime)); - qdef = model->BSIM3type * - (*(ckt->CKTrhsOld + here->BSIM3qNode)); + vbs = model->BSIM3type + * (*(ckt->CKTrhsOld + here->BSIM3bNode) + - *(ckt->CKTrhsOld + here->BSIM3sNodePrime)); + vgs = model->BSIM3type + * (*(ckt->CKTrhsOld + here->BSIM3gNode) + - *(ckt->CKTrhsOld + here->BSIM3sNodePrime)); + vds = model->BSIM3type + * (*(ckt->CKTrhsOld + here->BSIM3dNodePrime) + - *(ckt->CKTrhsOld + here->BSIM3sNodePrime)); + qdef = model->BSIM3type + * (*(ckt->CKTrhsOld + here->BSIM3qNode)); #ifndef PREDICTOR - } + } #endif /* PREDICTOR */ - vbd = vbs - vds; - vgd = vgs - vds; - vgdo = *(ckt->CKTstate0 + here->BSIM3vgs) - - *(ckt->CKTstate0 + here->BSIM3vds); - delvbs = vbs - *(ckt->CKTstate0 + here->BSIM3vbs); - delvbd = vbd - *(ckt->CKTstate0 + here->BSIM3vbd); - delvgs = vgs - *(ckt->CKTstate0 + here->BSIM3vgs); - delvds = vds - *(ckt->CKTstate0 + here->BSIM3vds); - delvgd = vgd - vgdo; - - if (here->BSIM3mode >= 0) - { - Idtot = here->BSIM3cd + here->BSIM3csub - here->BSIM3cbd; - cdhat = Idtot - - here->BSIM3gbd * delvbd + - (here->BSIM3gmbs + - here->BSIM3gbbs) * delvbs + - (here->BSIM3gm + - here->BSIM3gbgs) * delvgs + - (here->BSIM3gds + here->BSIM3gbds) * delvds; - Ibtot = here->BSIM3cbs + here->BSIM3cbd - here->BSIM3csub; - cbhat = Ibtot + - here->BSIM3gbd * delvbd + - (here->BSIM3gbs - - here->BSIM3gbbs) * delvbs - - here->BSIM3gbgs * delvgs - here->BSIM3gbds * delvds; - } - else - { - Idtot = here->BSIM3cd - here->BSIM3cbd; - cdhat = Idtot - (here->BSIM3gbd - - here->BSIM3gmbs) * - delvbd + here->BSIM3gm * delvgd - here->BSIM3gds * delvds; - Ibtot = here->BSIM3cbs + here->BSIM3cbd - here->BSIM3csub; - cbhat = Ibtot + - here->BSIM3gbs * delvbs + - (here->BSIM3gbd - - here->BSIM3gbbs) * delvbd - - here->BSIM3gbgs * delvgd + here->BSIM3gbds * delvds; - } + vbd = vbs - vds; + vgd = vgs - vds; + vgdo = *(ckt->CKTstate0 + here->BSIM3vgs) + - *(ckt->CKTstate0 + here->BSIM3vds); + delvbs = vbs - *(ckt->CKTstate0 + here->BSIM3vbs); + delvbd = vbd - *(ckt->CKTstate0 + here->BSIM3vbd); + delvgs = vgs - *(ckt->CKTstate0 + here->BSIM3vgs); + delvds = vds - *(ckt->CKTstate0 + here->BSIM3vds); + delvgd = vgd - vgdo; + + if (here->BSIM3mode >= 0) + { Idtot = here->BSIM3cd + here->BSIM3csub - here->BSIM3cbd; + cdhat = Idtot - here->BSIM3gbd * delvbd + + (here->BSIM3gmbs + here->BSIM3gbbs) * delvbs + + (here->BSIM3gm + here->BSIM3gbgs) * delvgs + + (here->BSIM3gds + here->BSIM3gbds) * delvds; + Ibtot = here->BSIM3cbs + here->BSIM3cbd - here->BSIM3csub; + cbhat = Ibtot + here->BSIM3gbd * delvbd + + (here->BSIM3gbs - here->BSIM3gbbs) * delvbs + - here->BSIM3gbgs * delvgs + - here->BSIM3gbds * delvds; + } + else + { Idtot = here->BSIM3cd - here->BSIM3cbd; + cdhat = Idtot - (here->BSIM3gbd - here->BSIM3gmbs) * delvbd + + here->BSIM3gm * delvgd + - here->BSIM3gds * delvds; + Ibtot = here->BSIM3cbs + here->BSIM3cbd - here->BSIM3csub; + cbhat = Ibtot + here->BSIM3gbs * delvbs + + (here->BSIM3gbd - here->BSIM3gbbs) * delvbd + - here->BSIM3gbgs * delvgd + + here->BSIM3gbds * delvds; + } #ifndef NOBYPASS - /* following should be one big if connected by && all over - * the place, but some C compilers can't handle that, so - * we split it up here to let them digest it in stages - */ - - if ((!(ckt->CKTmode & MODEINITPRED)) && (ckt->CKTbypass)) - if ((fabs (delvbs) < - (ckt->CKTreltol * - MAX (fabs (vbs), - fabs (*(ckt->CKTstate0 + here->BSIM3vbs))) + - ckt->CKTvoltTol))) - if ((fabs (delvbd) < - (ckt->CKTreltol * - MAX (fabs (vbd), - fabs (*(ckt->CKTstate0 + here->BSIM3vbd))) + - ckt->CKTvoltTol))) - if ((fabs (delvgs) < - (ckt->CKTreltol * - MAX (fabs (vgs), - fabs (*(ckt->CKTstate0 + here->BSIM3vgs))) + - ckt->CKTvoltTol))) - if ((fabs (delvds) < - (ckt->CKTreltol * - MAX (fabs (vds), - fabs (*(ckt->CKTstate0 + here->BSIM3vds))) + - ckt->CKTvoltTol))) - if ((fabs (cdhat - Idtot) < - ckt->CKTreltol * MAX (fabs (cdhat), - fabs (Idtot)) + - ckt->CKTabstol)) - { - tempv = - MAX (fabs (cbhat), - fabs (Ibtot)) + ckt->CKTabstol; - if ((fabs (cbhat - Ibtot)) < - ckt->CKTreltol * tempv) - { /* bypass code */ - vbs = *(ckt->CKTstate0 + here->BSIM3vbs); - vbd = *(ckt->CKTstate0 + here->BSIM3vbd); - vgs = *(ckt->CKTstate0 + here->BSIM3vgs); - vds = *(ckt->CKTstate0 + here->BSIM3vds); - qdef = *(ckt->CKTstate0 + here->BSIM3qdef); - - vgd = vgs - vds; - vgb = vgs - vbs; - - cdrain = here->BSIM3cd; - if ((ckt->CKTmode & (MODETRAN | MODEAC)) - || ((ckt->CKTmode & MODETRANOP) - && (ckt->CKTmode & MODEUIC))) - { - ByPass = 1; - qgate = here->BSIM3qgate; - qbulk = here->BSIM3qbulk; - qdrn = here->BSIM3qdrn; - goto line755; - } - else - { - goto line850; - } - } - } - -#endif /*NOBYPASS*/ - von = here->BSIM3von; - if (*(ckt->CKTstate0 + here->BSIM3vds) >= 0.0) - { - vgs = DEVfetlim (vgs, - *(ckt->CKTstate0 + here->BSIM3vgs), von); - vds = vgs - vgd; - vds = DEVlimvds (vds, *(ckt->CKTstate0 + here->BSIM3vds)); - vgd = vgs - vds; - - } - else - { - vgd = DEVfetlim (vgd, vgdo, von); - vds = vgs - vgd; - vds = -DEVlimvds (-vds, - -(*(ckt->CKTstate0 + here->BSIM3vds))); - vgs = vgd + vds; - } - - if (vds >= 0.0) - { - vbs = DEVpnjlim (vbs, - *(ckt->CKTstate0 + - here->BSIM3vbs), - CONSTvt0, model->BSIM3vcrit, &Check); - vbd = vbs - vds; - - } - else - { - vbd = DEVpnjlim (vbd, - *(ckt->CKTstate0 + - here->BSIM3vbd), - CONSTvt0, model->BSIM3vcrit, &Check); - vbs = vbd + vds; - } - } - - /* determine DC current and derivatives */ - vbd = vbs - vds; - vgd = vgs - vds; - vgb = vgs - vbs; - - m = here->BSIM3m; - - /* Source/drain junction diode DC model begins */ - Nvtm = model->BSIM3vtm * model->BSIM3jctEmissionCoeff; - if ((here->BSIM3sourceArea <= 0.0) - && (here->BSIM3sourcePerimeter <= 0.0)) - { - SourceSatCurrent = 1.0e-14; - } - else - { - SourceSatCurrent = here->BSIM3sourceArea - * model->BSIM3jctTempSatCurDensity - + here->BSIM3sourcePerimeter - * model->BSIM3jctSidewallTempSatCurDensity; - } + /* following should be one big if connected by && all over + * the place, but some C compilers can't handle that, so + * we split it up here to let them digest it in stages + */ + + if ((!(ckt->CKTmode & MODEINITPRED)) && (ckt->CKTbypass)) + if ((fabs(delvbs) < (ckt->CKTreltol * MAX(fabs(vbs), + fabs(*(ckt->CKTstate0+here->BSIM3vbs))) + ckt->CKTvoltTol))) + if ((fabs(delvbd) < (ckt->CKTreltol * MAX(fabs(vbd), + fabs(*(ckt->CKTstate0+here->BSIM3vbd))) + ckt->CKTvoltTol))) + if ((fabs(delvgs) < (ckt->CKTreltol * MAX(fabs(vgs), + fabs(*(ckt->CKTstate0+here->BSIM3vgs))) + ckt->CKTvoltTol))) + if ((fabs(delvds) < (ckt->CKTreltol * MAX(fabs(vds), + fabs(*(ckt->CKTstate0+here->BSIM3vds))) + ckt->CKTvoltTol))) + if ((fabs(cdhat - Idtot) < ckt->CKTreltol + * MAX(fabs(cdhat),fabs(Idtot)) + ckt->CKTabstol)) + { tempv = MAX(fabs(cbhat),fabs(Ibtot)) + ckt->CKTabstol; + if ((fabs(cbhat - Ibtot)) < ckt->CKTreltol * tempv) + { /* bypass code */ + vbs = *(ckt->CKTstate0 + here->BSIM3vbs); + vbd = *(ckt->CKTstate0 + here->BSIM3vbd); + vgs = *(ckt->CKTstate0 + here->BSIM3vgs); + vds = *(ckt->CKTstate0 + here->BSIM3vds); + qdef = *(ckt->CKTstate0 + here->BSIM3qdef); + + vgd = vgs - vds; + vgb = vgs - vbs; + + cdrain = here->BSIM3cd; + if ((ckt->CKTmode & (MODETRAN | MODEAC)) || + ((ckt->CKTmode & MODETRANOP) && + (ckt->CKTmode & MODEUIC))) + { ByPass = 1; + qgate = here->BSIM3qgate; + qbulk = here->BSIM3qbulk; + qdrn = here->BSIM3qdrn; + goto line755; + } + else + { goto line850; + } + } + } + +#endif /*NOBYPASS*/ + von = here->BSIM3von; + if (*(ckt->CKTstate0 + here->BSIM3vds) >= 0.0) + { vgs = DEVfetlim(vgs, *(ckt->CKTstate0+here->BSIM3vgs), von); + vds = vgs - vgd; + vds = DEVlimvds(vds, *(ckt->CKTstate0 + here->BSIM3vds)); + vgd = vgs - vds; + + } + else + { vgd = DEVfetlim(vgd, vgdo, von); + vds = vgs - vgd; + vds = -DEVlimvds(-vds, -(*(ckt->CKTstate0+here->BSIM3vds))); + vgs = vgd + vds; + } + + if (vds >= 0.0) + { vbs = DEVpnjlim(vbs, *(ckt->CKTstate0 + here->BSIM3vbs), + CONSTvt0, model->BSIM3vcrit, &Check); + vbd = vbs - vds; + + } + else + { vbd = DEVpnjlim(vbd, *(ckt->CKTstate0 + here->BSIM3vbd), + CONSTvt0, model->BSIM3vcrit, &Check); + vbs = vbd + vds; + } + } + + /* determine DC current and derivatives */ + vbd = vbs - vds; + vgd = vgs - vds; + vgb = vgs - vbs; + + /* Source/drain junction diode DC model begins */ + Nvtm = model->BSIM3vtm * model->BSIM3jctEmissionCoeff; + /* acm model */ + if (model->BSIM3acmMod == 0) + { + if ((here->BSIM3sourceArea <= 0.0) + && (here->BSIM3sourcePerimeter <= 0.0)) + { + SourceSatCurrent = 1.0e-14; + } + else + { + SourceSatCurrent = here->BSIM3sourceArea + * model->BSIM3jctTempSatCurDensity + + here->BSIM3sourcePerimeter + * model->BSIM3jctSidewallTempSatCurDensity; + } + } + else + { + SourceSatCurrent = 0.0; + if (!here->BSIM3sourceAreaGiven) + { + here->BSIM3sourceArea = 2.0 * model->BSIM3hdif * pParam->BSIM3weff; + } + SourceSatCurrent = here->BSIM3sourceArea * model->BSIM3jctTempSatCurDensity; + if (!here->BSIM3sourcePerimeterGiven) + { + here->BSIM3sourcePerimeter = 4.0 * model->BSIM3hdif + 2.0 * pParam->BSIM3weff; + } + SourceSatCurrent = SourceSatCurrent + here->BSIM3sourcePerimeter * model->BSIM3jctSidewallTempSatCurDensity; + if (SourceSatCurrent <= 0.0) SourceSatCurrent = 1.0e-14; + } if (SourceSatCurrent <= 0.0) - { - here->BSIM3gbs = ckt->CKTgmin; - - here->BSIM3cbs = here->BSIM3gbs * vbs; - } - else - { - if (model->BSIM3ijth == 0.0) - { - evbs = exp (vbs / Nvtm); - here->BSIM3gbs = - SourceSatCurrent * evbs / Nvtm + (ckt->CKTgmin); - here->BSIM3cbs = - SourceSatCurrent * (evbs - - 1.0) + (ckt->CKTgmin) * vbs; - - } - else - { - if (vbs < here->BSIM3vjsm) - { - evbs = exp (vbs / Nvtm); - here->BSIM3gbs = - SourceSatCurrent * evbs / Nvtm + (ckt->CKTgmin); - - here->BSIM3cbs = - SourceSatCurrent * - (evbs - 1.0) + (ckt->CKTgmin) * vbs; - } - else - { - + { here->BSIM3gbs = ckt->CKTgmin; + here->BSIM3cbs = here->BSIM3gbs * vbs; + } + else + { if (model->BSIM3ijth == 0.0) + { evbs = exp(vbs / Nvtm); + here->BSIM3gbs = SourceSatCurrent * evbs / Nvtm + ckt->CKTgmin; + here->BSIM3cbs = SourceSatCurrent * (evbs - 1.0) + + ckt->CKTgmin * vbs; + } + else + { if (vbs < here->BSIM3vjsm) + { evbs = exp(vbs / Nvtm); + here->BSIM3gbs = SourceSatCurrent * evbs / Nvtm + ckt->CKTgmin; + here->BSIM3cbs = SourceSatCurrent * (evbs - 1.0) + + ckt->CKTgmin * vbs; + } + else + { /* Added revision dependent code */ - switch (model->BSIM3intVersion) - { + switch (model->BSIM3intVersion) { case BSIM3V324: case BSIM3V323: case BSIM3V322: T0 = here->BSIM3IsEvjsm / Nvtm; here->BSIM3gbs = T0 + (ckt->CKTgmin); - here->BSIM3cbs = - here-> - BSIM3IsEvjsm - - SourceSatCurrent - + T0 * (vbs - - here-> - BSIM3vjsm) + (ckt->CKTgmin) * vbs; - + here->BSIM3cbs = here->BSIM3IsEvjsm - SourceSatCurrent + + T0 * (vbs - here->BSIM3vjsm) + (ckt->CKTgmin) * vbs; break; case BSIM3V32: default: T0 = (SourceSatCurrent + model->BSIM3ijth) / Nvtm; here->BSIM3gbs = T0 + (ckt->CKTgmin); - here->BSIM3cbs = - model-> - BSIM3ijth + - (ckt->CKTgmin) * vbs + T0 * (vbs - - here->BSIM3vjsm); - } - - } - } - } - - if ((here->BSIM3drainArea <= 0.0) - && (here->BSIM3drainPerimeter <= 0.0)) - { - DrainSatCurrent = 1.0e-14; - } - else - { - DrainSatCurrent = here->BSIM3drainArea - * model->BSIM3jctTempSatCurDensity - + here->BSIM3drainPerimeter - * model->BSIM3jctSidewallTempSatCurDensity; - } + here->BSIM3cbs = model->BSIM3ijth + (ckt->CKTgmin) * vbs + + T0 * (vbs - here->BSIM3vjsm); + } + } + } + } + + /* acm model */ + if (model->BSIM3acmMod == 0) + { + if ((here->BSIM3drainArea <= 0.0) && (here->BSIM3drainPerimeter <= 0.0)) + { DrainSatCurrent = 1.0e-14; + } + else + { DrainSatCurrent = here->BSIM3drainArea + * model->BSIM3jctTempSatCurDensity + + here->BSIM3drainPerimeter + * model->BSIM3jctSidewallTempSatCurDensity; + } + } + else + { + DrainSatCurrent = 0.0; + if (!here->BSIM3drainAreaGiven) + { + here->BSIM3drainArea = 2.0 * model->BSIM3hdif * pParam->BSIM3weff; + } + DrainSatCurrent = here->BSIM3drainArea * model->BSIM3jctTempSatCurDensity; + if (!here->BSIM3drainPerimeterGiven) + { + here->BSIM3drainPerimeter = 4.0 * model->BSIM3hdif + 2.0 * pParam->BSIM3weff; + } + DrainSatCurrent = DrainSatCurrent + here->BSIM3drainPerimeter * model->BSIM3jctSidewallTempSatCurDensity; + if (DrainSatCurrent <= 0.0) DrainSatCurrent = 1.0e-14; + } if (DrainSatCurrent <= 0.0) - { - here->BSIM3gbd = ckt->CKTgmin; - here->BSIM3cbd = here->BSIM3gbd * vbd; - } - else - { - if (model->BSIM3ijth == 0.0) - { - evbd = exp (vbd / Nvtm); - here->BSIM3gbd = - DrainSatCurrent * evbd / Nvtm + (ckt->CKTgmin); - here->BSIM3cbd = - DrainSatCurrent * (evbd - 1.0) + (ckt->CKTgmin) * vbd; - } - else - { - if (vbd < here->BSIM3vjdm) - { - evbd = exp (vbd / Nvtm); - here->BSIM3gbd = - DrainSatCurrent * evbd / Nvtm + (ckt->CKTgmin); - here->BSIM3cbd = - DrainSatCurrent * - (evbd - 1.0) + (ckt->CKTgmin) * vbd; - - } - else - { + { here->BSIM3gbd = ckt->CKTgmin; + here->BSIM3cbd = here->BSIM3gbd * vbd; + } + else + { if (model->BSIM3ijth == 0.0) + { evbd = exp(vbd / Nvtm); + here->BSIM3gbd = DrainSatCurrent * evbd / Nvtm + ckt->CKTgmin; + here->BSIM3cbd = DrainSatCurrent * (evbd - 1.0) + + ckt->CKTgmin * vbd; + } + else + { if (vbd < here->BSIM3vjdm) + { evbd = exp(vbd / Nvtm); + here->BSIM3gbd = DrainSatCurrent * evbd / Nvtm + ckt->CKTgmin; + here->BSIM3cbd = DrainSatCurrent * (evbd - 1.0) + + ckt->CKTgmin * vbd; + } + else + { /* Added revision dependent code */ - switch (model->BSIM3intVersion) - { + switch (model->BSIM3intVersion) { case BSIM3V324: case BSIM3V323: case BSIM3V322: T0 = here->BSIM3IsEvjdm / Nvtm; here->BSIM3gbd = T0 + (ckt->CKTgmin); - here->BSIM3cbd = - here-> - BSIM3IsEvjdm - - DrainSatCurrent - + T0 * (vbd - - here-> - BSIM3vjdm) + (ckt->CKTgmin) * vbd; - + here->BSIM3cbd = here->BSIM3IsEvjdm - DrainSatCurrent + + T0 * (vbd - here->BSIM3vjdm) + (ckt->CKTgmin) * vbd; + break; case BSIM3V32: default: T0 = (DrainSatCurrent + model->BSIM3ijth) / Nvtm; here->BSIM3gbd = T0 + (ckt->CKTgmin); - here->BSIM3cbd = - model->BSIM3ijth + (ckt->CKTgmin) * vbd + - T0 * (vbd - here->BSIM3vjdm); - } - - } - } - } - /* End of diode DC model */ - - if (vds >= 0.0) - { /* normal mode */ - here->BSIM3mode = 1; - Vds = vds; - Vgs = vgs; - Vbs = vbs; - } + here->BSIM3cbd = model->BSIM3ijth + (ckt->CKTgmin) * vbd + + T0 * (vbd - here->BSIM3vjdm); + } + } + } + } + /* End of diode DC model */ + + if (vds >= 0.0) + { /* normal mode */ + here->BSIM3mode = 1; + Vds = vds; + Vgs = vgs; + Vbs = vbs; + } else - { /* inverse mode */ - here->BSIM3mode = -1; - Vds = -vds; - Vgs = vgd; - Vbs = vbd; - } + { /* inverse mode */ + here->BSIM3mode = -1; + Vds = -vds; + Vgs = vgd; + Vbs = vbd; + } T0 = Vbs - pParam->BSIM3vbsc - 0.001; - T1 = sqrt (T0 * T0 - 0.004 * pParam->BSIM3vbsc); + T1 = sqrt(T0 * T0 - 0.004 * pParam->BSIM3vbsc); Vbseff = pParam->BSIM3vbsc + 0.5 * (T0 + T1); dVbseff_dVb = 0.5 * (1.0 + T0 / T1); - if (Vbseff < Vbs) - { - Vbseff = Vbs; - } /* Added to avoid the possible numerical problems due to computer accuracy. See comments for diffVds */ - - if (Vbseff > 0.0) - { - T0 = pParam->BSIM3phi / (pParam->BSIM3phi + Vbseff); - Phis = pParam->BSIM3phi * T0; - dPhis_dVb = -T0 * T0; - sqrtPhis = - pParam->BSIM3phis3 / (pParam->BSIM3phi + 0.5 * Vbseff); - dsqrtPhis_dVb = -0.5 * sqrtPhis * sqrtPhis / pParam->BSIM3phis3; - } + if (Vbseff < Vbs) + { Vbseff = Vbs; + } + + if (Vbseff > 0.0) + { T0 = pParam->BSIM3phi / (pParam->BSIM3phi + Vbseff); + Phis = pParam->BSIM3phi * T0; + dPhis_dVb = -T0 * T0; + sqrtPhis = pParam->BSIM3phis3 / (pParam->BSIM3phi + 0.5 * Vbseff); + dsqrtPhis_dVb = -0.5 * sqrtPhis * sqrtPhis / pParam->BSIM3phis3; + } else - { - Phis = pParam->BSIM3phi - Vbseff; - dPhis_dVb = -1.0; - sqrtPhis = sqrt (Phis); - dsqrtPhis_dVb = -0.5 / sqrtPhis; - } - Xdep = pParam->BSIM3Xdep0 * sqrtPhis / pParam->BSIM3sqrtPhi; - dXdep_dVb = - (pParam->BSIM3Xdep0 / pParam->BSIM3sqrtPhi) * dsqrtPhis_dVb; - - Leff = pParam->BSIM3leff; - Vtm = model->BSIM3vtm; + { Phis = pParam->BSIM3phi - Vbseff; + dPhis_dVb = -1.0; + sqrtPhis = sqrt(Phis); + dsqrtPhis_dVb = -0.5 / sqrtPhis; + } + Xdep = pParam->BSIM3Xdep0 * sqrtPhis / pParam->BSIM3sqrtPhi; + dXdep_dVb = (pParam->BSIM3Xdep0 / pParam->BSIM3sqrtPhi) + * dsqrtPhis_dVb; + + Leff = pParam->BSIM3leff; + Vtm = model->BSIM3vtm; /* Vth Calculation */ - T3 = sqrt (Xdep); - V0 = pParam->BSIM3vbi - pParam->BSIM3phi; + T3 = sqrt(Xdep); + V0 = pParam->BSIM3vbi - pParam->BSIM3phi; - T0 = pParam->BSIM3dvt2 * Vbseff; - if (T0 >= -0.5) - { - T1 = 1.0 + T0; + T0 = pParam->BSIM3dvt2 * Vbseff; + if (T0 >= - 0.5) + { T1 = 1.0 + T0; T2 = pParam->BSIM3dvt2; - } - else /* Added to avoid any discontinuity problems caused by dvt2 */ - { - T4 = 1.0 / (3.0 + 8.0 * T0); - T1 = (1.0 + 3.0 * T0) * T4; + } + else /* Added to avoid any discontinuity problems caused by dvt2 */ + { T4 = 1.0 / (3.0 + 8.0 * T0); + T1 = (1.0 + 3.0 * T0) * T4; T2 = pParam->BSIM3dvt2 * T4 * T4; - } - lt1 = model->BSIM3factor1 * T3 * T1; - dlt1_dVb = - model->BSIM3factor1 * (0.5 / T3 * T1 * dXdep_dVb + T3 * T2); + } + lt1 = model->BSIM3factor1 * T3 * T1; + dlt1_dVb = model->BSIM3factor1 * (0.5 / T3 * T1 * dXdep_dVb + T3 * T2); - T0 = pParam->BSIM3dvt2w * Vbseff; - if (T0 >= -0.5) - { - T1 = 1.0 + T0; + T0 = pParam->BSIM3dvt2w * Vbseff; + if (T0 >= - 0.5) + { T1 = 1.0 + T0; T2 = pParam->BSIM3dvt2w; - } - else /* Added to avoid any discontinuity problems caused by dvt2w */ - { - T4 = 1.0 / (3.0 + 8.0 * T0); - T1 = (1.0 + 3.0 * T0) * T4; + } + else /* Added to avoid any discontinuity problems caused by dvt2w */ + { T4 = 1.0 / (3.0 + 8.0 * T0); + T1 = (1.0 + 3.0 * T0) * T4; T2 = pParam->BSIM3dvt2w * T4 * T4; - } - ltw = model->BSIM3factor1 * T3 * T1; - dltw_dVb = - model->BSIM3factor1 * (0.5 / T3 * T1 * dXdep_dVb + T3 * T2); - - T0 = -0.5 * pParam->BSIM3dvt1 * Leff / lt1; - if (T0 > -EXP_THRESHOLD) - { - T1 = exp (T0); - Theta0 = T1 * (1.0 + 2.0 * T1); - dT1_dVb = -T0 / lt1 * T1 * dlt1_dVb; - dTheta0_dVb = (1.0 + 4.0 * T1) * dT1_dVb; - } - else - { - T1 = MIN_EXP; - Theta0 = T1 * (1.0 + 2.0 * T1); - dTheta0_dVb = 0.0; - } - - here->BSIM3thetavth = pParam->BSIM3dvt0 * Theta0; - Delt_vth = here->BSIM3thetavth * V0; - dDelt_vth_dVb = pParam->BSIM3dvt0 * dTheta0_dVb * V0; - - T0 = -0.5 * pParam->BSIM3dvt1w * pParam->BSIM3weff * Leff / ltw; - if (T0 > -EXP_THRESHOLD) - { - T1 = exp (T0); - T2 = T1 * (1.0 + 2.0 * T1); - dT1_dVb = -T0 / ltw * T1 * dltw_dVb; - dT2_dVb = (1.0 + 4.0 * T1) * dT1_dVb; - } - else - { - T1 = MIN_EXP; - T2 = T1 * (1.0 + 2.0 * T1); - dT2_dVb = 0.0; - } - - T0 = pParam->BSIM3dvt0w * T2; - T2 = T0 * V0; - dT2_dVb = pParam->BSIM3dvt0w * dT2_dVb * V0; - - TempRatio = ckt->CKTtemp / model->BSIM3tnom - 1.0; - T0 = sqrt (1.0 + pParam->BSIM3nlx / Leff); - T1 = pParam->BSIM3k1ox * (T0 - - 1.0) * - pParam->BSIM3sqrtPhi + (pParam->BSIM3kt1 + - pParam->BSIM3kt1l / - Leff + - pParam->BSIM3kt2 * Vbseff) * TempRatio; - tmp2 = model->BSIM3tox * pParam->BSIM3phi / - (pParam->BSIM3weff + pParam->BSIM3w0); + } + ltw = model->BSIM3factor1 * T3 * T1; + dltw_dVb = model->BSIM3factor1 * (0.5 / T3 * T1 * dXdep_dVb + T3 * T2); + + T0 = -0.5 * pParam->BSIM3dvt1 * Leff / lt1; + if (T0 > -EXP_THRESHOLD) + { T1 = exp(T0); + Theta0 = T1 * (1.0 + 2.0 * T1); + dT1_dVb = -T0 / lt1 * T1 * dlt1_dVb; + dTheta0_dVb = (1.0 + 4.0 * T1) * dT1_dVb; + } + else + { T1 = MIN_EXP; + Theta0 = T1 * (1.0 + 2.0 * T1); + dTheta0_dVb = 0.0; + } + + here->BSIM3thetavth = pParam->BSIM3dvt0 * Theta0; + Delt_vth = here->BSIM3thetavth * V0; + dDelt_vth_dVb = pParam->BSIM3dvt0 * dTheta0_dVb * V0; + + T0 = -0.5 * pParam->BSIM3dvt1w * pParam->BSIM3weff * Leff / ltw; + if (T0 > -EXP_THRESHOLD) + { T1 = exp(T0); + T2 = T1 * (1.0 + 2.0 * T1); + dT1_dVb = -T0 / ltw * T1 * dltw_dVb; + dT2_dVb = (1.0 + 4.0 * T1) * dT1_dVb; + } + else + { T1 = MIN_EXP; + T2 = T1 * (1.0 + 2.0 * T1); + dT2_dVb = 0.0; + } + + T0 = pParam->BSIM3dvt0w * T2; + T2 = T0 * V0; + dT2_dVb = pParam->BSIM3dvt0w * dT2_dVb * V0; + + TempRatio = ckt->CKTtemp / model->BSIM3tnom - 1.0; + T0 = sqrt(1.0 + pParam->BSIM3nlx / Leff); + T1 = pParam->BSIM3k1ox * (T0 - 1.0) * pParam->BSIM3sqrtPhi + + (pParam->BSIM3kt1 + pParam->BSIM3kt1l / Leff + + pParam->BSIM3kt2 * Vbseff) * TempRatio; + tmp2 = model->BSIM3tox * pParam->BSIM3phi + / (pParam->BSIM3weff + pParam->BSIM3w0); T3 = pParam->BSIM3eta0 + pParam->BSIM3etab * Vbseff; - if (T3 < 1.0e-4) /* avoid discontinuity problems caused by etab */ - { - T9 = 1.0 / (3.0 - 2.0e4 * T3); + if (T3 < 1.0e-4) /* avoid discontinuity problems caused by etab */ + { T9 = 1.0 / (3.0 - 2.0e4 * T3); T3 = (2.0e-4 - T3) * T9; T4 = T9 * T9; - } + } else - { - T4 = 1.0; - } + { T4 = 1.0; + } dDIBL_Sft_dVd = T3 * pParam->BSIM3theta0vb0; - DIBL_Sft = dDIBL_Sft_dVd * Vds; + DIBL_Sft = dDIBL_Sft_dVd * Vds; - Vth = model->BSIM3type * pParam->BSIM3vth0 - - pParam->BSIM3k1 * pParam->BSIM3sqrtPhi + - pParam->BSIM3k1ox * sqrtPhis - - pParam->BSIM3k2ox * Vbseff - Delt_vth - T2 + - (pParam->BSIM3k3 + - pParam->BSIM3k3b * Vbseff) * tmp2 + T1 - DIBL_Sft; + Vth = model->BSIM3type * pParam->BSIM3vth0 - pParam->BSIM3k1 + * pParam->BSIM3sqrtPhi + pParam->BSIM3k1ox * sqrtPhis + - pParam->BSIM3k2ox * Vbseff - Delt_vth - T2 + (pParam->BSIM3k3 + + pParam->BSIM3k3b * Vbseff) * tmp2 + T1 - DIBL_Sft; - here->BSIM3von = Vth; + here->BSIM3von = Vth; - dVth_dVb = - pParam->BSIM3k1ox * dsqrtPhis_dVb - - pParam->BSIM3k2ox - dDelt_vth_dVb - dT2_dVb + - pParam->BSIM3k3b * tmp2 - - pParam->BSIM3etab * Vds * - pParam->BSIM3theta0vb0 * T4 + pParam->BSIM3kt2 * TempRatio; - dVth_dVd = -dDIBL_Sft_dVd; + dVth_dVb = pParam->BSIM3k1ox * dsqrtPhis_dVb - pParam->BSIM3k2ox + - dDelt_vth_dVb - dT2_dVb + pParam->BSIM3k3b * tmp2 + - pParam->BSIM3etab * Vds * pParam->BSIM3theta0vb0 * T4 + + pParam->BSIM3kt2 * TempRatio; + dVth_dVd = -dDIBL_Sft_dVd; /* Calculate n */ - tmp2 = pParam->BSIM3nfactor * EPSSI / Xdep; - tmp3 = pParam->BSIM3cdsc + pParam->BSIM3cdscb * Vbseff - + pParam->BSIM3cdscd * Vds; + tmp2 = pParam->BSIM3nfactor * EPSSI / Xdep; + tmp3 = pParam->BSIM3cdsc + pParam->BSIM3cdscb * Vbseff + + pParam->BSIM3cdscd * Vds; tmp4 = (tmp2 + tmp3 * Theta0 + pParam->BSIM3cit) / model->BSIM3cox; if (tmp4 >= -0.5) - { - n = 1.0 + tmp4; - dn_dVb = (-tmp2 / Xdep * dXdep_dVb + - tmp3 * dTheta0_dVb + - pParam->BSIM3cdscb * Theta0) / model->BSIM3cox; - dn_dVd = pParam->BSIM3cdscd * Theta0 / model->BSIM3cox; - } + { n = 1.0 + tmp4; + dn_dVb = (-tmp2 / Xdep * dXdep_dVb + tmp3 * dTheta0_dVb + + pParam->BSIM3cdscb * Theta0) / model->BSIM3cox; + dn_dVd = pParam->BSIM3cdscd * Theta0 / model->BSIM3cox; + } else - /* avoid discontinuity problems caused by tmp4 */ - { - T0 = 1.0 / (3.0 + 8.0 * tmp4); + /* avoid discontinuity problems caused by tmp4 */ + { T0 = 1.0 / (3.0 + 8.0 * tmp4); n = (1.0 + 3.0 * tmp4) * T0; T0 *= T0; - dn_dVb = (-tmp2 / Xdep * dXdep_dVb + - tmp3 * dTheta0_dVb + - pParam->BSIM3cdscb * Theta0) / model->BSIM3cox * T0; - dn_dVd = pParam->BSIM3cdscd * Theta0 / model->BSIM3cox * T0; - } + dn_dVb = (-tmp2 / Xdep * dXdep_dVb + tmp3 * dTheta0_dVb + + pParam->BSIM3cdscb * Theta0) / model->BSIM3cox * T0; + dn_dVd = pParam->BSIM3cdscd * Theta0 / model->BSIM3cox * T0; + } /* Poly Gate Si Depletion Effect */ T0 = pParam->BSIM3vfb + pParam->BSIM3phi; - if ((pParam->BSIM3ngate > 1.e18) - && (pParam->BSIM3ngate < 1.e25) && (Vgs > T0)) - /* added to avoid the problem caused by ngate */ - { - T1 = 1.0e6 * Charge_q * EPSSI * - pParam->BSIM3ngate / (model->BSIM3cox * model->BSIM3cox); - T4 = sqrt (1.0 + 2.0 * (Vgs - T0) / T1); - T2 = T1 * (T4 - 1.0); - T3 = 0.5 * T2 * T2 / T1; /* T3 = Vpoly */ - T7 = 1.12 - T3 - 0.05; - T6 = sqrt (T7 * T7 + 0.224); - T5 = 1.12 - 0.5 * (T7 + T6); - Vgs_eff = Vgs - T5; - dVgs_eff_dVg = 1.0 - (0.5 - 0.5 / T4) * (1.0 + T7 / T6); - } + if ((pParam->BSIM3ngate > 1.e18) && (pParam->BSIM3ngate < 1.e25) + && (Vgs > T0)) + /* added to avoid the problem caused by ngate */ + { T1 = 1.0e6 * Charge_q * EPSSI * pParam->BSIM3ngate + / (model->BSIM3cox * model->BSIM3cox); + T4 = sqrt(1.0 + 2.0 * (Vgs - T0) / T1); + T2 = T1 * (T4 - 1.0); + T3 = 0.5 * T2 * T2 / T1; /* T3 = Vpoly */ + T7 = 1.12 - T3 - 0.05; + T6 = sqrt(T7 * T7 + 0.224); + T5 = 1.12 - 0.5 * (T7 + T6); + Vgs_eff = Vgs - T5; + dVgs_eff_dVg = 1.0 - (0.5 - 0.5 / T4) * (1.0 + T7 / T6); + } else - { - Vgs_eff = Vgs; - dVgs_eff_dVg = 1.0; - } - Vgst = Vgs_eff - Vth; + { Vgs_eff = Vgs; + dVgs_eff_dVg = 1.0; + } + Vgst = Vgs_eff - Vth; /* Effective Vgst (Vgsteff) Calculation */ - T10 = 2.0 * n * Vtm; - VgstNVt = Vgst / T10; - ExpArg = (2.0 * pParam->BSIM3voff - Vgst) / T10; + T10 = 2.0 * n * Vtm; + VgstNVt = Vgst / T10; + ExpArg = (2.0 * pParam->BSIM3voff - Vgst) / T10; /* MCJ: Very small Vgst */ - if (VgstNVt > EXP_THRESHOLD) - { - Vgsteff = Vgst; - dVgsteff_dVg = dVgs_eff_dVg; - dVgsteff_dVd = -dVth_dVd; - dVgsteff_dVb = -dVth_dVb; - } + if (VgstNVt > EXP_THRESHOLD) + { Vgsteff = Vgst; + dVgsteff_dVg = dVgs_eff_dVg; + dVgsteff_dVd = -dVth_dVd; + dVgsteff_dVb = -dVth_dVb; + } else if (ExpArg > EXP_THRESHOLD) - { - T0 = (Vgst - pParam->BSIM3voff) / (n * Vtm); - ExpVgst = exp (T0); + { T0 = (Vgst - pParam->BSIM3voff) / (n * Vtm); + ExpVgst = exp(T0); Vgsteff = Vtm * pParam->BSIM3cdep0 / model->BSIM3cox * ExpVgst; - dVgsteff_dVg = Vgsteff / (n * Vtm); - dVgsteff_dVd = -dVgsteff_dVg * (dVth_dVd + T0 * Vtm * dn_dVd); - dVgsteff_dVb = -dVgsteff_dVg * (dVth_dVb + T0 * Vtm * dn_dVb); + dVgsteff_dVg = Vgsteff / (n * Vtm); + dVgsteff_dVd = -dVgsteff_dVg * (dVth_dVd + T0 * Vtm * dn_dVd); + dVgsteff_dVb = -dVgsteff_dVg * (dVth_dVb + T0 * Vtm * dn_dVb); dVgsteff_dVg *= dVgs_eff_dVg; - } + } else - { - ExpVgst = exp (VgstNVt); - T1 = T10 * log (1.0 + ExpVgst); - dT1_dVg = ExpVgst / (1.0 + ExpVgst); - dT1_dVb = - -dT1_dVg * (dVth_dVb + Vgst / n * dn_dVb) + T1 / n * dn_dVb; - dT1_dVd = - -dT1_dVg * (dVth_dVd + Vgst / n * dn_dVd) + T1 / n * dn_dVd; - - dT2_dVg = - -model->BSIM3cox / (Vtm * pParam->BSIM3cdep0) * exp (ExpArg); - T2 = 1.0 - T10 * dT2_dVg; - dT2_dVd = - -dT2_dVg * (dVth_dVd - - 2.0 * Vtm * ExpArg * - dn_dVd) + (T2 - 1.0) / n * dn_dVd; - dT2_dVb = - -dT2_dVg * (dVth_dVb - - 2.0 * Vtm * ExpArg * - dn_dVb) + (T2 - 1.0) / n * dn_dVb; - - Vgsteff = T1 / T2; + { ExpVgst = exp(VgstNVt); + T1 = T10 * log(1.0 + ExpVgst); + dT1_dVg = ExpVgst / (1.0 + ExpVgst); + dT1_dVb = -dT1_dVg * (dVth_dVb + Vgst / n * dn_dVb) + + T1 / n * dn_dVb; + dT1_dVd = -dT1_dVg * (dVth_dVd + Vgst / n * dn_dVd) + + T1 / n * dn_dVd; + + dT2_dVg = -model->BSIM3cox / (Vtm * pParam->BSIM3cdep0) + * exp(ExpArg); + T2 = 1.0 - T10 * dT2_dVg; + dT2_dVd = -dT2_dVg * (dVth_dVd - 2.0 * Vtm * ExpArg * dn_dVd) + + (T2 - 1.0) / n * dn_dVd; + dT2_dVb = -dT2_dVg * (dVth_dVb - 2.0 * Vtm * ExpArg * dn_dVb) + + (T2 - 1.0) / n * dn_dVb; + + Vgsteff = T1 / T2; T3 = T2 * T2; - dVgsteff_dVg = - (T2 * dT1_dVg - T1 * dT2_dVg) / T3 * dVgs_eff_dVg; - dVgsteff_dVd = (T2 * dT1_dVd - T1 * dT2_dVd) / T3; - dVgsteff_dVb = (T2 * dT1_dVb - T1 * dT2_dVb) / T3; - } - - here->BSIM3Vgsteff = Vgsteff; + dVgsteff_dVg = (T2 * dT1_dVg - T1 * dT2_dVg) / T3 * dVgs_eff_dVg; + dVgsteff_dVd = (T2 * dT1_dVd - T1 * dT2_dVd) / T3; + dVgsteff_dVb = (T2 * dT1_dVb - T1 * dT2_dVb) / T3; + } + /* Added revision dependent code */ + if (model->BSIM3intVersion > BSIM3V323) { + here->BSIM3Vgsteff = Vgsteff; + } /* Calculate Effective Channel Geometry */ - T9 = sqrtPhis - pParam->BSIM3sqrtPhi; - Weff = pParam->BSIM3weff - - 2.0 * (pParam->BSIM3dwg * Vgsteff + pParam->BSIM3dwb * T9); - dWeff_dVg = -2.0 * pParam->BSIM3dwg; - dWeff_dVb = -2.0 * pParam->BSIM3dwb * dsqrtPhis_dVb; - - if (Weff < 2.0e-8) /* to avoid the discontinuity problem due to Weff */ - { - T0 = 1.0 / (6.0e-8 - 2.0 * Weff); + T9 = sqrtPhis - pParam->BSIM3sqrtPhi; + Weff = pParam->BSIM3weff - 2.0 * (pParam->BSIM3dwg * Vgsteff + + pParam->BSIM3dwb * T9); + dWeff_dVg = -2.0 * pParam->BSIM3dwg; + dWeff_dVb = -2.0 * pParam->BSIM3dwb * dsqrtPhis_dVb; + + if (Weff < 2.0e-8) /* to avoid the discontinuity problem due to Weff*/ + { T0 = 1.0 / (6.0e-8 - 2.0 * Weff); Weff = 2.0e-8 * (4.0e-8 - Weff) * T0; T0 *= T0 * 4.0e-16; - dWeff_dVg *= T0; + dWeff_dVg *= T0; dWeff_dVb *= T0; - } + } - T0 = pParam->BSIM3prwg * Vgsteff + pParam->BSIM3prwb * T9; + T0 = pParam->BSIM3prwg * Vgsteff + pParam->BSIM3prwb * T9; if (T0 >= -0.9) - { - Rds = pParam->BSIM3rds0 * (1.0 + T0); + { Rds = pParam->BSIM3rds0 * (1.0 + T0); dRds_dVg = pParam->BSIM3rds0 * pParam->BSIM3prwg; - dRds_dVb = - pParam->BSIM3rds0 * pParam->BSIM3prwb * dsqrtPhis_dVb; - } + dRds_dVb = pParam->BSIM3rds0 * pParam->BSIM3prwb * dsqrtPhis_dVb; + } else - /* to avoid the discontinuity problem due to prwg and prwb */ - { - T1 = 1.0 / (17.0 + 20.0 * T0); + /* to avoid the discontinuity problem due to prwg and prwb*/ + { T1 = 1.0 / (17.0 + 20.0 * T0); Rds = pParam->BSIM3rds0 * (0.8 + T0) * T1; T1 *= T1; dRds_dVg = pParam->BSIM3rds0 * pParam->BSIM3prwg * T1; - dRds_dVb = - pParam->BSIM3rds0 * pParam->BSIM3prwb * dsqrtPhis_dVb * T1; - } - - - here->BSIM3rds = Rds; /* Noise Bugfix */ - + dRds_dVb = pParam->BSIM3rds0 * pParam->BSIM3prwb * dsqrtPhis_dVb + * T1; + } + /* Added revision dependent code */ + if (model->BSIM3intVersion > BSIM3V323) { + here->BSIM3rds = Rds; /* Noise Bugfix */ + } + /* Calculate Abulk */ - T1 = 0.5 * pParam->BSIM3k1ox / sqrtPhis; - dT1_dVb = -T1 / sqrtPhis * dsqrtPhis_dVb; - - T9 = sqrt (pParam->BSIM3xj * Xdep); - tmp1 = Leff + 2.0 * T9; - T5 = Leff / tmp1; - tmp2 = pParam->BSIM3a0 * T5; - tmp3 = pParam->BSIM3weff + pParam->BSIM3b1; - tmp4 = pParam->BSIM3b0 / tmp3; - T2 = tmp2 + tmp4; - dT2_dVb = -T9 / tmp1 / Xdep * dXdep_dVb; - T6 = T5 * T5; - T7 = T5 * T6; - - Abulk0 = 1.0 + T1 * T2; - dAbulk0_dVb = T1 * tmp2 * dT2_dVb + T2 * dT1_dVb; - - T8 = pParam->BSIM3ags * pParam->BSIM3a0 * T7; - dAbulk_dVg = -T1 * T8; - Abulk = Abulk0 + dAbulk_dVg * Vgsteff; - dAbulk_dVb = dAbulk0_dVb - T8 * Vgsteff * (dT1_dVb - + 3.0 * T1 * dT2_dVb); - - if (Abulk0 < 0.1) /* added to avoid the problems caused by Abulk0 */ - { - T9 = 1.0 / (3.0 - 20.0 * Abulk0); + T1 = 0.5 * pParam->BSIM3k1ox / sqrtPhis; + dT1_dVb = -T1 / sqrtPhis * dsqrtPhis_dVb; + + T9 = sqrt(pParam->BSIM3xj * Xdep); + tmp1 = Leff + 2.0 * T9; + T5 = Leff / tmp1; + tmp2 = pParam->BSIM3a0 * T5; + tmp3 = pParam->BSIM3weff + pParam->BSIM3b1; + tmp4 = pParam->BSIM3b0 / tmp3; + T2 = tmp2 + tmp4; + dT2_dVb = -T9 / tmp1 / Xdep * dXdep_dVb; + T6 = T5 * T5; + T7 = T5 * T6; + + Abulk0 = 1.0 + T1 * T2; + dAbulk0_dVb = T1 * tmp2 * dT2_dVb + T2 * dT1_dVb; + + T8 = pParam->BSIM3ags * pParam->BSIM3a0 * T7; + dAbulk_dVg = -T1 * T8; + Abulk = Abulk0 + dAbulk_dVg * Vgsteff; + dAbulk_dVb = dAbulk0_dVb - T8 * Vgsteff * (dT1_dVb + + 3.0 * T1 * dT2_dVb); + + if (Abulk0 < 0.1) /* added to avoid the problems caused by Abulk0 */ + { T9 = 1.0 / (3.0 - 20.0 * Abulk0); Abulk0 = (0.2 - Abulk0) * T9; dAbulk0_dVb *= T9 * T9; - } + } - if (Abulk < 0.1) - /* added to avoid the problems caused by Abulk */ - { - T9 = 1.0 / (3.0 - 20.0 * Abulk); + if (Abulk < 0.1) + /* added to avoid the problems caused by Abulk */ + { T9 = 1.0 / (3.0 - 20.0 * Abulk); Abulk = (0.2 - Abulk) * T9; - T10 = T9 * T9; - dAbulk_dVb *= T10; - dAbulk_dVg *= T10; - - } - - here->BSIM3Abulk = Abulk; + /* Added revision dependent code */ + if (model->BSIM3intVersion > BSIM3V32) { + T10 = T9 * T9; + dAbulk_dVb *= T10; + dAbulk_dVg *= T10; + } else { + dAbulk_dVb *= T9 * T9; + } + } + /* Added revision dependent code */ + if (model->BSIM3intVersion > BSIM3V323) { + here->BSIM3Abulk = Abulk; + } - T2 = pParam->BSIM3keta * Vbseff; + T2 = pParam->BSIM3keta * Vbseff; if (T2 >= -0.9) - { - T0 = 1.0 / (1.0 + T2); - dT0_dVb = -pParam->BSIM3keta * T0 * T0; - } + { T0 = 1.0 / (1.0 + T2); + dT0_dVb = -pParam->BSIM3keta * T0 * T0; + } else - /* added to avoid the problems caused by Keta */ - { - T1 = 1.0 / (0.8 + T2); + /* added to avoid the problems caused by Keta */ + { T1 = 1.0 / (0.8 + T2); T0 = (17.0 + 20.0 * T2) * T1; - dT0_dVb = -pParam->BSIM3keta * T1 * T1; - } + dT0_dVb = -pParam->BSIM3keta * T1 * T1; + } dAbulk_dVg *= T0; dAbulk_dVb = dAbulk_dVb * T0 + Abulk * dT0_dVb; dAbulk0_dVb = dAbulk0_dVb * T0 + Abulk0 * dT0_dVb; @@ -930,213 +803,183 @@ BSIM3load (GENmodel * inModel, CKTcircuit * ckt) /* Mobility calculation */ - if (model->BSIM3mobMod == 1) - { - T0 = Vgsteff + Vth + Vth; - T2 = pParam->BSIM3ua + pParam->BSIM3uc * Vbseff; - T3 = T0 / model->BSIM3tox; - T5 = T3 * (T2 + pParam->BSIM3ub * T3); - dDenomi_dVg = - (T2 + 2.0 * pParam->BSIM3ub * T3) / model->BSIM3tox; - dDenomi_dVd = dDenomi_dVg * 2.0 * dVth_dVd; - dDenomi_dVb = - dDenomi_dVg * 2.0 * dVth_dVb + pParam->BSIM3uc * T3; - } + if (model->BSIM3mobMod == 1) + { T0 = Vgsteff + Vth + Vth; + T2 = pParam->BSIM3ua + pParam->BSIM3uc * Vbseff; + T3 = T0 / model->BSIM3tox; + T5 = T3 * (T2 + pParam->BSIM3ub * T3); + dDenomi_dVg = (T2 + 2.0 * pParam->BSIM3ub * T3) / model->BSIM3tox; + dDenomi_dVd = dDenomi_dVg * 2.0 * dVth_dVd; + dDenomi_dVb = dDenomi_dVg * 2.0 * dVth_dVb + pParam->BSIM3uc * T3; + } else if (model->BSIM3mobMod == 2) - { - T5 = Vgsteff / model->BSIM3tox * - (pParam->BSIM3ua + - pParam->BSIM3uc * Vbseff + - pParam->BSIM3ub * Vgsteff / model->BSIM3tox); - dDenomi_dVg = - (pParam->BSIM3ua + - pParam->BSIM3uc * Vbseff + - 2.0 * pParam->BSIM3ub * Vgsteff / - model->BSIM3tox) / model->BSIM3tox; - dDenomi_dVd = 0.0; - dDenomi_dVb = Vgsteff * pParam->BSIM3uc / model->BSIM3tox; - } + { T5 = Vgsteff / model->BSIM3tox * (pParam->BSIM3ua + + pParam->BSIM3uc * Vbseff + pParam->BSIM3ub * Vgsteff + / model->BSIM3tox); + dDenomi_dVg = (pParam->BSIM3ua + pParam->BSIM3uc * Vbseff + + 2.0 * pParam->BSIM3ub * Vgsteff / model->BSIM3tox) + / model->BSIM3tox; + dDenomi_dVd = 0.0; + dDenomi_dVb = Vgsteff * pParam->BSIM3uc / model->BSIM3tox; + } else - { - T0 = Vgsteff + Vth + Vth; - T2 = 1.0 + pParam->BSIM3uc * Vbseff; - T3 = T0 / model->BSIM3tox; - T4 = T3 * (pParam->BSIM3ua + pParam->BSIM3ub * T3); + { T0 = Vgsteff + Vth + Vth; + T2 = 1.0 + pParam->BSIM3uc * Vbseff; + T3 = T0 / model->BSIM3tox; + T4 = T3 * (pParam->BSIM3ua + pParam->BSIM3ub * T3); T5 = T4 * T2; - dDenomi_dVg = - (pParam->BSIM3ua + - 2.0 * pParam->BSIM3ub * T3) * T2 / model->BSIM3tox; - dDenomi_dVd = dDenomi_dVg * 2.0 * dVth_dVd; - dDenomi_dVb = - dDenomi_dVg * 2.0 * dVth_dVb + pParam->BSIM3uc * T4; - } + dDenomi_dVg = (pParam->BSIM3ua + 2.0 * pParam->BSIM3ub * T3) * T2 + / model->BSIM3tox; + dDenomi_dVd = dDenomi_dVg * 2.0 * dVth_dVd; + dDenomi_dVb = dDenomi_dVg * 2.0 * dVth_dVb + pParam->BSIM3uc * T4; + } if (T5 >= -0.8) - { - Denomi = 1.0 + T5; - } - else /* Added to avoid the discontinuity problem caused by ua and ub */ - { - T9 = 1.0 / (7.0 + 10.0 * T5); + { Denomi = 1.0 + T5; + } + else /* Added to avoid the discontinuity problem caused by ua and ub*/ + { T9 = 1.0 / (7.0 + 10.0 * T5); Denomi = (0.6 + T5) * T9; T9 *= T9; - dDenomi_dVg *= T9; - dDenomi_dVd *= T9; - dDenomi_dVb *= T9; - } + dDenomi_dVg *= T9; + dDenomi_dVd *= T9; + dDenomi_dVb *= T9; + } - here->BSIM3ueff = ueff = pParam->BSIM3u0temp / Denomi; + here->BSIM3ueff = ueff = pParam->BSIM3u0temp / Denomi; T9 = -ueff / Denomi; - dueff_dVg = T9 * dDenomi_dVg; - dueff_dVd = T9 * dDenomi_dVd; - dueff_dVb = T9 * dDenomi_dVb; + dueff_dVg = T9 * dDenomi_dVg; + dueff_dVd = T9 * dDenomi_dVd; + dueff_dVb = T9 * dDenomi_dVb; /* Saturation Drain Voltage Vdsat */ - WVCox = Weff * pParam->BSIM3vsattemp * model->BSIM3cox; - WVCoxRds = WVCox * Rds; - - Esat = 2.0 * pParam->BSIM3vsattemp / ueff; - EsatL = Esat * Leff; - T0 = -EsatL / ueff; - dEsatL_dVg = T0 * dueff_dVg; - dEsatL_dVd = T0 * dueff_dVd; - dEsatL_dVb = T0 * dueff_dVb; - + WVCox = Weff * pParam->BSIM3vsattemp * model->BSIM3cox; + WVCoxRds = WVCox * Rds; + + Esat = 2.0 * pParam->BSIM3vsattemp / ueff; + EsatL = Esat * Leff; + T0 = -EsatL /ueff; + dEsatL_dVg = T0 * dueff_dVg; + dEsatL_dVd = T0 * dueff_dVd; + dEsatL_dVb = T0 * dueff_dVb; + /* Sqrt() */ - a1 = pParam->BSIM3a1; + a1 = pParam->BSIM3a1; if (a1 == 0.0) - { - Lambda = pParam->BSIM3a2; + { Lambda = pParam->BSIM3a2; dLambda_dVg = 0.0; - } + } else if (a1 > 0.0) /* Added to avoid the discontinuity problem caused by a1 and a2 (Lambda) */ - { - T0 = 1.0 - pParam->BSIM3a2; + { T0 = 1.0 - pParam->BSIM3a2; T1 = T0 - pParam->BSIM3a1 * Vgsteff - 0.0001; - T2 = sqrt (T1 * T1 + 0.0004 * T0); + T2 = sqrt(T1 * T1 + 0.0004 * T0); Lambda = pParam->BSIM3a2 + T0 - 0.5 * (T1 + T2); dLambda_dVg = 0.5 * pParam->BSIM3a1 * (1.0 + T1 / T2); - } + } else - { - T1 = pParam->BSIM3a2 + pParam->BSIM3a1 * Vgsteff - 0.0001; - T2 = sqrt (T1 * T1 + 0.0004 * pParam->BSIM3a2); + { T1 = pParam->BSIM3a2 + pParam->BSIM3a1 * Vgsteff - 0.0001; + T2 = sqrt(T1 * T1 + 0.0004 * pParam->BSIM3a2); Lambda = 0.5 * (T1 + T2); dLambda_dVg = 0.5 * pParam->BSIM3a1 * (1.0 + T1 / T2); - } - - Vgst2Vtm = Vgsteff + 2.0 * Vtm; + } - here->BSIM3AbovVgst2Vtm = Abulk / Vgst2Vtm; - - if (Rds > 0) - { - tmp2 = dRds_dVg / Rds + dWeff_dVg / Weff; - tmp3 = dRds_dVb / Rds + dWeff_dVb / Weff; - } - else - { - tmp2 = dWeff_dVg / Weff; - tmp3 = dWeff_dVb / Weff; - } - if ((Rds == 0.0) && (Lambda == 1.0)) - { - T0 = 1.0 / (Abulk * EsatL + Vgst2Vtm); - tmp1 = 0.0; + Vgst2Vtm = Vgsteff + 2.0 * Vtm; + /* Added revision dependent code */ + if (model->BSIM3intVersion > BSIM3V323) { + here->BSIM3AbovVgst2Vtm = Abulk / Vgst2Vtm; + } + + if (Rds > 0) + { tmp2 = dRds_dVg / Rds + dWeff_dVg / Weff; + tmp3 = dRds_dVb / Rds + dWeff_dVb / Weff; + } + else + { tmp2 = dWeff_dVg / Weff; + tmp3 = dWeff_dVb / Weff; + } + if ((Rds == 0.0) && (Lambda == 1.0)) + { T0 = 1.0 / (Abulk * EsatL + Vgst2Vtm); + tmp1 = 0.0; T1 = T0 * T0; T2 = Vgst2Vtm * T0; - T3 = EsatL * Vgst2Vtm; - Vdsat = T3 * T0; - - dT0_dVg = -(Abulk * dEsatL_dVg + EsatL * dAbulk_dVg + 1.0) * T1; - dT0_dVd = -(Abulk * dEsatL_dVd) * T1; - dT0_dVb = -(Abulk * dEsatL_dVb + dAbulk_dVb * EsatL) * T1; - - dVdsat_dVg = T3 * dT0_dVg + T2 * dEsatL_dVg + EsatL * T0; - dVdsat_dVd = T3 * dT0_dVd + T2 * dEsatL_dVd; - dVdsat_dVb = T3 * dT0_dVb + T2 * dEsatL_dVb; - } - else - { - tmp1 = dLambda_dVg / (Lambda * Lambda); - T9 = Abulk * WVCoxRds; + T3 = EsatL * Vgst2Vtm; + Vdsat = T3 * T0; + + dT0_dVg = -(Abulk * dEsatL_dVg + EsatL * dAbulk_dVg + 1.0) * T1; + dT0_dVd = -(Abulk * dEsatL_dVd) * T1; + dT0_dVb = -(Abulk * dEsatL_dVb + dAbulk_dVb * EsatL) * T1; + + dVdsat_dVg = T3 * dT0_dVg + T2 * dEsatL_dVg + EsatL * T0; + dVdsat_dVd = T3 * dT0_dVd + T2 * dEsatL_dVd; + dVdsat_dVb = T3 * dT0_dVb + T2 * dEsatL_dVb; + } + else + { tmp1 = dLambda_dVg / (Lambda * Lambda); + T9 = Abulk * WVCoxRds; T8 = Abulk * T9; T7 = Vgst2Vtm * T9; - T6 = Vgst2Vtm * WVCoxRds; - T0 = 2.0 * Abulk * (T9 - 1.0 + 1.0 / Lambda); - dT0_dVg = 2.0 * (T8 * tmp2 - Abulk * tmp1 - + (2.0 * T9 + 1.0 / Lambda - - 1.0) * dAbulk_dVg); - - dT0_dVb = - 2.0 * (T8 * - (2.0 / Abulk * dAbulk_dVb + - tmp3) + (1.0 / Lambda - 1.0) * dAbulk_dVb); - dT0_dVd = 0.0; - T1 = Vgst2Vtm * (2.0 / Lambda - 1.0) + Abulk * EsatL + 3.0 * T7; - - dT1_dVg = - (2.0 / Lambda - 1.0) - - 2.0 * Vgst2Vtm * tmp1 + - Abulk * dEsatL_dVg + - EsatL * dAbulk_dVg + 3.0 * (T9 + T7 * tmp2 + T6 * dAbulk_dVg); - dT1_dVb = - Abulk * dEsatL_dVb + - EsatL * dAbulk_dVb + 3.0 * (T6 * dAbulk_dVb + T7 * tmp3); - dT1_dVd = Abulk * dEsatL_dVd; - - T2 = Vgst2Vtm * (EsatL + 2.0 * T6); - dT2_dVg = EsatL + Vgst2Vtm * dEsatL_dVg - + T6 * (4.0 + 2.0 * Vgst2Vtm * tmp2); - dT2_dVb = Vgst2Vtm * (dEsatL_dVb + 2.0 * T6 * tmp3); - dT2_dVd = Vgst2Vtm * dEsatL_dVd; - - T3 = sqrt (T1 * T1 - 2.0 * T0 * T2); - Vdsat = (T1 - T3) / T0; - - dT3_dVg = - (T1 * dT1_dVg - 2.0 * (T0 * dT2_dVg + T2 * dT0_dVg)) / T3; - dT3_dVd = - (T1 * dT1_dVd - 2.0 * (T0 * dT2_dVd + T2 * dT0_dVd)) / T3; - dT3_dVb = - (T1 * dT1_dVb - 2.0 * (T0 * dT2_dVb + T2 * dT0_dVb)) / T3; - - dVdsat_dVg = - (dT1_dVg - - (T1 * dT1_dVg - dT0_dVg * T2 - - T0 * dT2_dVg) / T3 - Vdsat * dT0_dVg) / T0; - dVdsat_dVb = - (dT1_dVb - - (T1 * dT1_dVb - dT0_dVb * T2 - - T0 * dT2_dVb) / T3 - Vdsat * dT0_dVb) / T0; - dVdsat_dVd = - (dT1_dVd - (T1 * dT1_dVd - T0 * dT2_dVd) / T3) / T0; - } - here->BSIM3vdsat = Vdsat; + T6 = Vgst2Vtm * WVCoxRds; + T0 = 2.0 * Abulk * (T9 - 1.0 + 1.0 / Lambda); + dT0_dVg = 2.0 * (T8 * tmp2 - Abulk * tmp1 + + (2.0 * T9 + 1.0 / Lambda - 1.0) * dAbulk_dVg); + + dT0_dVb = 2.0 * (T8 * (2.0 / Abulk * dAbulk_dVb + tmp3) + + (1.0 / Lambda - 1.0) * dAbulk_dVb); + dT0_dVd = 0.0; + T1 = Vgst2Vtm * (2.0 / Lambda - 1.0) + Abulk * EsatL + 3.0 * T7; + + dT1_dVg = (2.0 / Lambda - 1.0) - 2.0 * Vgst2Vtm * tmp1 + + Abulk * dEsatL_dVg + EsatL * dAbulk_dVg + 3.0 * (T9 + + T7 * tmp2 + T6 * dAbulk_dVg); + dT1_dVb = Abulk * dEsatL_dVb + EsatL * dAbulk_dVb + + 3.0 * (T6 * dAbulk_dVb + T7 * tmp3); + dT1_dVd = Abulk * dEsatL_dVd; + + T2 = Vgst2Vtm * (EsatL + 2.0 * T6); + dT2_dVg = EsatL + Vgst2Vtm * dEsatL_dVg + + T6 * (4.0 + 2.0 * Vgst2Vtm * tmp2); + dT2_dVb = Vgst2Vtm * (dEsatL_dVb + 2.0 * T6 * tmp3); + dT2_dVd = Vgst2Vtm * dEsatL_dVd; + + T3 = sqrt(T1 * T1 - 2.0 * T0 * T2); + Vdsat = (T1 - T3) / T0; + + dT3_dVg = (T1 * dT1_dVg - 2.0 * (T0 * dT2_dVg + T2 * dT0_dVg)) + / T3; + dT3_dVd = (T1 * dT1_dVd - 2.0 * (T0 * dT2_dVd + T2 * dT0_dVd)) + / T3; + dT3_dVb = (T1 * dT1_dVb - 2.0 * (T0 * dT2_dVb + T2 * dT0_dVb)) + / T3; + + dVdsat_dVg = (dT1_dVg - (T1 * dT1_dVg - dT0_dVg * T2 + - T0 * dT2_dVg) / T3 - Vdsat * dT0_dVg) / T0; + dVdsat_dVb = (dT1_dVb - (T1 * dT1_dVb - dT0_dVb * T2 + - T0 * dT2_dVb) / T3 - Vdsat * dT0_dVb) / T0; + dVdsat_dVd = (dT1_dVd - (T1 * dT1_dVd - T0 * dT2_dVd) / T3) / T0; + } + here->BSIM3vdsat = Vdsat; /* Effective Vds (Vdseff) Calculation */ - T1 = Vdsat - Vds - pParam->BSIM3delta; - dT1_dVg = dVdsat_dVg; - dT1_dVd = dVdsat_dVd - 1.0; - dT1_dVb = dVdsat_dVb; + T1 = Vdsat - Vds - pParam->BSIM3delta; + dT1_dVg = dVdsat_dVg; + dT1_dVd = dVdsat_dVd - 1.0; + dT1_dVb = dVdsat_dVb; - T2 = sqrt (T1 * T1 + 4.0 * pParam->BSIM3delta * Vdsat); + T2 = sqrt(T1 * T1 + 4.0 * pParam->BSIM3delta * Vdsat); T0 = T1 / T2; T3 = 2.0 * pParam->BSIM3delta / T2; - dT2_dVg = T0 * dT1_dVg + T3 * dVdsat_dVg; - dT2_dVd = T0 * dT1_dVd + T3 * dVdsat_dVd; - dT2_dVb = T0 * dT1_dVb + T3 * dVdsat_dVb; - - Vdseff = Vdsat - 0.5 * (T1 + T2); - dVdseff_dVg = dVdsat_dVg - 0.5 * (dT1_dVg + dT2_dVg); - dVdseff_dVd = dVdsat_dVd - 0.5 * (dT1_dVd + dT2_dVd); - dVdseff_dVb = dVdsat_dVb - 0.5 * (dT1_dVb + dT2_dVb); - + dT2_dVg = T0 * dT1_dVg + T3 * dVdsat_dVg; + dT2_dVd = T0 * dT1_dVd + T3 * dVdsat_dVd; + dT2_dVb = T0 * dT1_dVb + T3 * dVdsat_dVb; + + Vdseff = Vdsat - 0.5 * (T1 + T2); + dVdseff_dVg = dVdsat_dVg - 0.5 * (dT1_dVg + dT2_dVg); + dVdseff_dVd = dVdsat_dVd - 0.5 * (dT1_dVd + dT2_dVd); + dVdseff_dVb = dVdsat_dVb - 0.5 * (dT1_dVb + dT2_dVb); /* Added revision dependent code */ - switch (model->BSIM3intVersion) - { + switch (model->BSIM3intVersion) { case BSIM3V324: case BSIM3V323: case BSIM3V322: @@ -1148,834 +991,741 @@ BSIM3load (GENmodel * inModel, CKTcircuit * ckt) dVdseff_dVb = 0.0; } break; - case BSIM3V32: default: /* Do nothing */ - } + break; + } /* Calculate VAsat */ - tmp4 = 1.0 - 0.5 * Abulk * Vdsat / Vgst2Vtm; - T9 = WVCoxRds * Vgsteff; + tmp4 = 1.0 - 0.5 * Abulk * Vdsat / Vgst2Vtm; + T9 = WVCoxRds * Vgsteff; T8 = T9 / Vgst2Vtm; - T0 = EsatL + Vdsat + 2.0 * T9 * tmp4; - - T7 = 2.0 * WVCoxRds * tmp4; - dT0_dVg = - dEsatL_dVg + dVdsat_dVg + T7 * (1.0 + - tmp2 * - Vgsteff) - - T8 * (Abulk * dVdsat_dVg - - Abulk * Vdsat / Vgst2Vtm + Vdsat * dAbulk_dVg); - - dT0_dVb = - dEsatL_dVb + dVdsat_dVb + - T7 * tmp3 * Vgsteff - - T8 * (dAbulk_dVb * Vdsat + Abulk * dVdsat_dVb); - dT0_dVd = dEsatL_dVd + dVdsat_dVd - T8 * Abulk * dVdsat_dVd; - - T9 = WVCoxRds * Abulk; - T1 = 2.0 / Lambda - 1.0 + T9; - dT1_dVg = -2.0 * tmp1 + WVCoxRds * (Abulk * tmp2 + dAbulk_dVg); - dT1_dVb = dAbulk_dVb * WVCoxRds + T9 * tmp3; - - Vasat = T0 / T1; - dVasat_dVg = (dT0_dVg - Vasat * dT1_dVg) / T1; - dVasat_dVb = (dT0_dVb - Vasat * dT1_dVb) / T1; - dVasat_dVd = dT0_dVd / T1; - - 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; - - here->BSIM3Vdseff = Vdseff; + T0 = EsatL + Vdsat + 2.0 * T9 * tmp4; + + T7 = 2.0 * WVCoxRds * tmp4; + dT0_dVg = dEsatL_dVg + dVdsat_dVg + T7 * (1.0 + tmp2 * Vgsteff) + - T8 * (Abulk * dVdsat_dVg - Abulk * Vdsat / Vgst2Vtm + + Vdsat * dAbulk_dVg); + + dT0_dVb = dEsatL_dVb + dVdsat_dVb + T7 * tmp3 * Vgsteff + - T8 * (dAbulk_dVb * Vdsat + Abulk * dVdsat_dVb); + dT0_dVd = dEsatL_dVd + dVdsat_dVd - T8 * Abulk * dVdsat_dVd; + + T9 = WVCoxRds * Abulk; + T1 = 2.0 / Lambda - 1.0 + T9; + dT1_dVg = -2.0 * tmp1 + WVCoxRds * (Abulk * tmp2 + dAbulk_dVg); + dT1_dVb = dAbulk_dVb * WVCoxRds + T9 * tmp3; + + Vasat = T0 / T1; + dVasat_dVg = (dT0_dVg - Vasat * dT1_dVg) / T1; + dVasat_dVb = (dT0_dVb - Vasat * dT1_dVb) / T1; + dVasat_dVd = dT0_dVd / T1; + + if (Vdseff > Vds) + Vdseff = Vds; + diffVds = Vds - Vdseff; + /* Added revision dependent code */ + if (model->BSIM3intVersion > BSIM3V323) { + here->BSIM3Vdseff = Vdseff; + } /* Calculate VACLM */ - if ((pParam->BSIM3pclm > 0.0) && (diffVds > 1.0e-10)) - { - T0 = 1.0 / (pParam->BSIM3pclm * Abulk * pParam->BSIM3litl); - dT0_dVb = -T0 / Abulk * dAbulk_dVb; - dT0_dVg = -T0 / Abulk * dAbulk_dVg; - + if ((pParam->BSIM3pclm > 0.0) && (diffVds > 1.0e-10)) + { T0 = 1.0 / (pParam->BSIM3pclm * Abulk * pParam->BSIM3litl); + dT0_dVb = -T0 / Abulk * dAbulk_dVb; + dT0_dVg = -T0 / Abulk * dAbulk_dVg; + T2 = Vgsteff / EsatL; - T1 = Leff * (Abulk + T2); - dT1_dVg = Leff * ((1.0 - T2 * dEsatL_dVg) / EsatL + dAbulk_dVg); - dT1_dVb = Leff * (dAbulk_dVb - T2 * dEsatL_dVb / EsatL); - dT1_dVd = -T2 * dEsatL_dVd / Esat; + T1 = Leff * (Abulk + T2); + dT1_dVg = Leff * ((1.0 - T2 * dEsatL_dVg) / EsatL + dAbulk_dVg); + dT1_dVb = Leff * (dAbulk_dVb - T2 * dEsatL_dVb / EsatL); + dT1_dVd = -T2 * dEsatL_dVd / Esat; T9 = T0 * T1; - VACLM = T9 * diffVds; - dVACLM_dVg = - T0 * dT1_dVg * diffVds - - T9 * dVdseff_dVg + T1 * diffVds * dT0_dVg; - dVACLM_dVb = - (dT0_dVb * T1 + T0 * dT1_dVb) * diffVds - T9 * dVdseff_dVb; - dVACLM_dVd = T0 * dT1_dVd * diffVds + T9 * (1.0 - dVdseff_dVd); - } + VACLM = T9 * diffVds; + dVACLM_dVg = T0 * dT1_dVg * diffVds - T9 * dVdseff_dVg + + T1 * diffVds * dT0_dVg; + dVACLM_dVb = (dT0_dVb * T1 + T0 * dT1_dVb) * diffVds + - T9 * dVdseff_dVb; + dVACLM_dVd = T0 * dT1_dVd * diffVds + T9 * (1.0 - dVdseff_dVd); + } else - { - VACLM = MAX_EXP; - dVACLM_dVd = dVACLM_dVg = dVACLM_dVb = 0.0; - } + { VACLM = MAX_EXP; + dVACLM_dVd = dVACLM_dVg = dVACLM_dVb = 0.0; + } /* Calculate VADIBL */ - if (pParam->BSIM3thetaRout > 0.0) - { - T8 = Abulk * Vdsat; + if (pParam->BSIM3thetaRout > 0.0) + { T8 = Abulk * Vdsat; T0 = Vgst2Vtm * T8; - dT0_dVg = Vgst2Vtm * Abulk * dVdsat_dVg + T8 - + Vgst2Vtm * Vdsat * dAbulk_dVg; - dT0_dVb = Vgst2Vtm * (dAbulk_dVb * Vdsat + Abulk * dVdsat_dVb); - dT0_dVd = Vgst2Vtm * Abulk * dVdsat_dVd; + dT0_dVg = Vgst2Vtm * Abulk * dVdsat_dVg + T8 + + Vgst2Vtm * Vdsat * dAbulk_dVg; + dT0_dVb = Vgst2Vtm * (dAbulk_dVb * Vdsat + Abulk * dVdsat_dVb); + dT0_dVd = Vgst2Vtm * Abulk * dVdsat_dVd; - T1 = Vgst2Vtm + T8; - dT1_dVg = 1.0 + Abulk * dVdsat_dVg + Vdsat * dAbulk_dVg; - dT1_dVb = Abulk * dVdsat_dVb + dAbulk_dVb * Vdsat; - dT1_dVd = Abulk * dVdsat_dVd; + T1 = Vgst2Vtm + T8; + dT1_dVg = 1.0 + Abulk * dVdsat_dVg + Vdsat * dAbulk_dVg; + dT1_dVb = Abulk * dVdsat_dVb + dAbulk_dVb * Vdsat; + dT1_dVd = Abulk * dVdsat_dVd; T9 = T1 * T1; T2 = pParam->BSIM3thetaRout; - VADIBL = (Vgst2Vtm - T0 / T1) / T2; - dVADIBL_dVg = (1.0 - dT0_dVg / T1 + T0 * dT1_dVg / T9) / T2; - dVADIBL_dVb = (-dT0_dVb / T1 + T0 * dT1_dVb / T9) / T2; - dVADIBL_dVd = (-dT0_dVd / T1 + T0 * dT1_dVd / T9) / T2; + VADIBL = (Vgst2Vtm - T0 / T1) / T2; + dVADIBL_dVg = (1.0 - dT0_dVg / T1 + T0 * dT1_dVg / T9) / T2; + dVADIBL_dVb = (-dT0_dVb / T1 + T0 * dT1_dVb / T9) / T2; + dVADIBL_dVd = (-dT0_dVd / T1 + T0 * dT1_dVd / T9) / T2; T7 = pParam->BSIM3pdiblb * Vbseff; if (T7 >= -0.9) - { - T3 = 1.0 / (1.0 + T7); - VADIBL *= T3; - dVADIBL_dVg *= T3; - dVADIBL_dVb = - (dVADIBL_dVb - VADIBL * pParam->BSIM3pdiblb) * T3; - dVADIBL_dVd *= T3; - } + { T3 = 1.0 / (1.0 + T7); + VADIBL *= T3; + dVADIBL_dVg *= T3; + dVADIBL_dVb = (dVADIBL_dVb - VADIBL * pParam->BSIM3pdiblb) + * T3; + dVADIBL_dVd *= T3; + } else /* Added to avoid the discontinuity problem caused by pdiblcb */ - { - T4 = 1.0 / (0.8 + T7); + { T4 = 1.0 / (0.8 + T7); T3 = (17.0 + 20.0 * T7) * T4; - dVADIBL_dVg *= T3; - dVADIBL_dVb = dVADIBL_dVb * T3 - - VADIBL * pParam->BSIM3pdiblb * T4 * T4; - dVADIBL_dVd *= T3; - VADIBL *= T3; - } - } + dVADIBL_dVg *= T3; + dVADIBL_dVb = dVADIBL_dVb * T3 + - VADIBL * pParam->BSIM3pdiblb * T4 * T4; + dVADIBL_dVd *= T3; + VADIBL *= T3; + } + } else - { - VADIBL = MAX_EXP; - dVADIBL_dVd = dVADIBL_dVg = dVADIBL_dVb = 0.0; - } + { VADIBL = MAX_EXP; + dVADIBL_dVd = dVADIBL_dVg = dVADIBL_dVb = 0.0; + } /* Calculate VA */ - + T8 = pParam->BSIM3pvag / EsatL; T9 = T8 * Vgsteff; if (T9 > -0.9) - { - T0 = 1.0 + T9; - dT0_dVg = T8 * (1.0 - Vgsteff * dEsatL_dVg / EsatL); - dT0_dVb = -T9 * dEsatL_dVb / EsatL; - dT0_dVd = -T9 * dEsatL_dVd / EsatL; - } - else /* Added to avoid the discontinuity problems caused by pvag */ - { - T1 = 1.0 / (17.0 + 20.0 * T9); + { T0 = 1.0 + T9; + dT0_dVg = T8 * (1.0 - Vgsteff * dEsatL_dVg / EsatL); + dT0_dVb = -T9 * dEsatL_dVb / EsatL; + dT0_dVd = -T9 * dEsatL_dVd / EsatL; + } + else /* Added to avoid the discontinuity problems caused by pvag */ + { T1 = 1.0 / (17.0 + 20.0 * T9); T0 = (0.8 + T9) * T1; T1 *= T1; - dT0_dVg = T8 * (1.0 - Vgsteff * dEsatL_dVg / EsatL) * T1; - - T9 *= T1 / EsatL; - dT0_dVb = -T9 * dEsatL_dVb; - dT0_dVd = -T9 * dEsatL_dVd; - } - - tmp1 = VACLM * VACLM; - tmp2 = VADIBL * VADIBL; - tmp3 = VACLM + VADIBL; - - T1 = VACLM * VADIBL / tmp3; - tmp3 *= tmp3; - dT1_dVg = (tmp1 * dVADIBL_dVg + tmp2 * dVACLM_dVg) / tmp3; - dT1_dVd = (tmp1 * dVADIBL_dVd + tmp2 * dVACLM_dVd) / tmp3; - dT1_dVb = (tmp1 * dVADIBL_dVb + tmp2 * dVACLM_dVb) / tmp3; - - Va = Vasat + T0 * T1; - dVa_dVg = dVasat_dVg + T1 * dT0_dVg + T0 * dT1_dVg; - dVa_dVd = dVasat_dVd + T1 * dT0_dVd + T0 * dT1_dVd; - dVa_dVb = dVasat_dVb + T1 * dT0_dVb + T0 * dT1_dVb; + dT0_dVg = T8 * (1.0 - Vgsteff * dEsatL_dVg / EsatL) * T1; + + T9 *= T1 / EsatL; + dT0_dVb = -T9 * dEsatL_dVb; + dT0_dVd = -T9 * dEsatL_dVd; + } + + tmp1 = VACLM * VACLM; + tmp2 = VADIBL * VADIBL; + tmp3 = VACLM + VADIBL; + + T1 = VACLM * VADIBL / tmp3; + tmp3 *= tmp3; + dT1_dVg = (tmp1 * dVADIBL_dVg + tmp2 * dVACLM_dVg) / tmp3; + dT1_dVd = (tmp1 * dVADIBL_dVd + tmp2 * dVACLM_dVd) / tmp3; + dT1_dVb = (tmp1 * dVADIBL_dVb + tmp2 * dVACLM_dVb) / tmp3; + + Va = Vasat + T0 * T1; + dVa_dVg = dVasat_dVg + T1 * dT0_dVg + T0 * dT1_dVg; + dVa_dVd = dVasat_dVd + T1 * dT0_dVd + T0 * dT1_dVd; + dVa_dVb = dVasat_dVb + T1 * dT0_dVb + T0 * dT1_dVb; /* Calculate VASCBE */ if (pParam->BSIM3pscbe2 > 0.0) - { - if (diffVds > - pParam->BSIM3pscbe1 * pParam->BSIM3litl / EXP_THRESHOLD) - { - T0 = pParam->BSIM3pscbe1 * pParam->BSIM3litl / diffVds; - VASCBE = Leff * exp (T0) / pParam->BSIM3pscbe2; - T1 = T0 * VASCBE / diffVds; - dVASCBE_dVg = T1 * dVdseff_dVg; - dVASCBE_dVd = -T1 * (1.0 - dVdseff_dVd); - dVASCBE_dVb = T1 * dVdseff_dVb; - } + { if (diffVds > pParam->BSIM3pscbe1 * pParam->BSIM3litl + / EXP_THRESHOLD) + { T0 = pParam->BSIM3pscbe1 * pParam->BSIM3litl / diffVds; + VASCBE = Leff * exp(T0) / pParam->BSIM3pscbe2; + T1 = T0 * VASCBE / diffVds; + dVASCBE_dVg = T1 * dVdseff_dVg; + dVASCBE_dVd = -T1 * (1.0 - dVdseff_dVd); + dVASCBE_dVb = T1 * dVdseff_dVb; + } else - { - VASCBE = MAX_EXP * Leff / pParam->BSIM3pscbe2; - dVASCBE_dVg = dVASCBE_dVd = dVASCBE_dVb = 0.0; - } - } + { VASCBE = MAX_EXP * Leff/pParam->BSIM3pscbe2; + dVASCBE_dVg = dVASCBE_dVd = dVASCBE_dVb = 0.0; + } + } else - { - VASCBE = MAX_EXP; - dVASCBE_dVg = dVASCBE_dVd = dVASCBE_dVb = 0.0; - } + { VASCBE = MAX_EXP; + dVASCBE_dVg = dVASCBE_dVd = dVASCBE_dVb = 0.0; + } /* Calculate Ids */ - CoxWovL = model->BSIM3cox * Weff / Leff; - beta = ueff * CoxWovL; - dbeta_dVg = CoxWovL * dueff_dVg + beta * dWeff_dVg / Weff; - dbeta_dVd = CoxWovL * dueff_dVd; - dbeta_dVb = CoxWovL * dueff_dVb + beta * dWeff_dVb / Weff; - - T0 = 1.0 - 0.5 * Abulk * Vdseff / Vgst2Vtm; - dT0_dVg = -0.5 * (Abulk * dVdseff_dVg - - Abulk * Vdseff / Vgst2Vtm + - Vdseff * dAbulk_dVg) / Vgst2Vtm; - dT0_dVd = -0.5 * Abulk * dVdseff_dVd / Vgst2Vtm; - dT0_dVb = - -0.5 * (Abulk * dVdseff_dVb + dAbulk_dVb * Vdseff) / Vgst2Vtm; - - fgche1 = Vgsteff * T0; - dfgche1_dVg = Vgsteff * dT0_dVg + T0; - dfgche1_dVd = Vgsteff * dT0_dVd; - dfgche1_dVb = Vgsteff * dT0_dVb; - - T9 = Vdseff / EsatL; - fgche2 = 1.0 + T9; - dfgche2_dVg = (dVdseff_dVg - T9 * dEsatL_dVg) / EsatL; - dfgche2_dVd = (dVdseff_dVd - T9 * dEsatL_dVd) / EsatL; - dfgche2_dVb = (dVdseff_dVb - T9 * dEsatL_dVb) / EsatL; - - gche = beta * fgche1 / fgche2; - dgche_dVg = (beta * dfgche1_dVg + fgche1 * dbeta_dVg - - gche * dfgche2_dVg) / fgche2; - dgche_dVd = (beta * dfgche1_dVd + fgche1 * dbeta_dVd - - gche * dfgche2_dVd) / fgche2; - dgche_dVb = (beta * dfgche1_dVb + fgche1 * dbeta_dVb - - gche * dfgche2_dVb) / fgche2; - - T0 = 1.0 + gche * Rds; - T9 = Vdseff / T0; - Idl = gche * T9; - - dIdl_dVg = (gche * dVdseff_dVg + T9 * dgche_dVg) / T0 - - Idl * gche / T0 * dRds_dVg; - - dIdl_dVd = (gche * dVdseff_dVd + T9 * dgche_dVd) / T0; - dIdl_dVb = (gche * dVdseff_dVb + T9 * dgche_dVb - - Idl * dRds_dVb * gche) / T0; - - T9 = diffVds / Va; - T0 = 1.0 + T9; - Idsa = Idl * T0; - dIdsa_dVg = T0 * dIdl_dVg - Idl * (dVdseff_dVg + T9 * dVa_dVg) / Va; - dIdsa_dVd = - T0 * dIdl_dVd + Idl * (1.0 - dVdseff_dVd - T9 * dVa_dVd) / Va; - dIdsa_dVb = T0 * dIdl_dVb - Idl * (dVdseff_dVb + T9 * dVa_dVb) / Va; - - T9 = diffVds / VASCBE; - T0 = 1.0 + T9; - Ids = Idsa * T0; - - Gm = T0 * dIdsa_dVg - Idsa * (dVdseff_dVg + - T9 * dVASCBE_dVg) / VASCBE; - Gds = T0 * dIdsa_dVd + Idsa * (1.0 - dVdseff_dVd - - T9 * dVASCBE_dVd) / VASCBE; - Gmb = T0 * dIdsa_dVb - Idsa * (dVdseff_dVb + - T9 * dVASCBE_dVb) / VASCBE; - - Gds += Gm * dVgsteff_dVd; + CoxWovL = model->BSIM3cox * Weff / Leff; + beta = ueff * CoxWovL; + dbeta_dVg = CoxWovL * dueff_dVg + beta * dWeff_dVg / Weff; + dbeta_dVd = CoxWovL * dueff_dVd; + dbeta_dVb = CoxWovL * dueff_dVb + beta * dWeff_dVb / Weff; + + T0 = 1.0 - 0.5 * Abulk * Vdseff / Vgst2Vtm; + dT0_dVg = -0.5 * (Abulk * dVdseff_dVg + - Abulk * Vdseff / Vgst2Vtm + Vdseff * dAbulk_dVg) / Vgst2Vtm; + dT0_dVd = -0.5 * Abulk * dVdseff_dVd / Vgst2Vtm; + dT0_dVb = -0.5 * (Abulk * dVdseff_dVb + dAbulk_dVb * Vdseff) + / Vgst2Vtm; + + fgche1 = Vgsteff * T0; + dfgche1_dVg = Vgsteff * dT0_dVg + T0; + dfgche1_dVd = Vgsteff * dT0_dVd; + dfgche1_dVb = Vgsteff * dT0_dVb; + + T9 = Vdseff / EsatL; + fgche2 = 1.0 + T9; + dfgche2_dVg = (dVdseff_dVg - T9 * dEsatL_dVg) / EsatL; + dfgche2_dVd = (dVdseff_dVd - T9 * dEsatL_dVd) / EsatL; + dfgche2_dVb = (dVdseff_dVb - T9 * dEsatL_dVb) / EsatL; + + gche = beta * fgche1 / fgche2; + dgche_dVg = (beta * dfgche1_dVg + fgche1 * dbeta_dVg + - gche * dfgche2_dVg) / fgche2; + dgche_dVd = (beta * dfgche1_dVd + fgche1 * dbeta_dVd + - gche * dfgche2_dVd) / fgche2; + dgche_dVb = (beta * dfgche1_dVb + fgche1 * dbeta_dVb + - gche * dfgche2_dVb) / fgche2; + + T0 = 1.0 + gche * Rds; + T9 = Vdseff / T0; + Idl = gche * T9; + + dIdl_dVg = (gche * dVdseff_dVg + T9 * dgche_dVg) / T0 + - Idl * gche / T0 * dRds_dVg ; + + dIdl_dVd = (gche * dVdseff_dVd + T9 * dgche_dVd) / T0; + dIdl_dVb = (gche * dVdseff_dVb + T9 * dgche_dVb + - Idl * dRds_dVb * gche) / T0; + + T9 = diffVds / Va; + T0 = 1.0 + T9; + Idsa = Idl * T0; + dIdsa_dVg = T0 * dIdl_dVg - Idl * (dVdseff_dVg + T9 * dVa_dVg) / Va; + dIdsa_dVd = T0 * dIdl_dVd + Idl * (1.0 - dVdseff_dVd + - T9 * dVa_dVd) / Va; + dIdsa_dVb = T0 * dIdl_dVb - Idl * (dVdseff_dVb + T9 * dVa_dVb) / Va; + + T9 = diffVds / VASCBE; + T0 = 1.0 + T9; + Ids = Idsa * T0; + + Gm = T0 * dIdsa_dVg - Idsa * (dVdseff_dVg + T9 * dVASCBE_dVg) / VASCBE; + Gds = T0 * dIdsa_dVd + Idsa * (1.0 - dVdseff_dVd + - T9 * dVASCBE_dVd) / VASCBE; + Gmb = T0 * dIdsa_dVb - Idsa * (dVdseff_dVb + + T9 * dVASCBE_dVb) / VASCBE; + + Gds += Gm * dVgsteff_dVd; Gmb += Gm * dVgsteff_dVb; Gm *= dVgsteff_dVg; Gmb *= dVbseff_dVb; - /* Substrate current begins */ - tmp = pParam->BSIM3alpha0 + pParam->BSIM3alpha1 * Leff; - if ((tmp <= 0.0) || (pParam->BSIM3beta0 <= 0.0)) - { - Isub = Gbd = Gbb = Gbg = 0.0; - } + /* Substrate current begins */ + tmp = pParam->BSIM3alpha0 + pParam->BSIM3alpha1 * Leff; + if ((tmp <= 0.0) || (pParam->BSIM3beta0 <= 0.0)) + { Isub = Gbd = Gbb = Gbg = 0.0; + } else - { - T2 = tmp / Leff; + { T2 = tmp / Leff; if (diffVds > pParam->BSIM3beta0 / EXP_THRESHOLD) - { - T0 = -pParam->BSIM3beta0 / diffVds; - T1 = T2 * diffVds * exp (T0); + { T0 = -pParam->BSIM3beta0 / diffVds; + T1 = T2 * diffVds * exp(T0); T3 = T1 / diffVds * (T0 - 1.0); - dT1_dVg = T3 * dVdseff_dVg; - dT1_dVd = T3 * (dVdseff_dVd - 1.0); - dT1_dVb = T3 * dVdseff_dVb; - } + dT1_dVg = T3 * dVdseff_dVg; + dT1_dVd = T3 * (dVdseff_dVd - 1.0); + dT1_dVb = T3 * dVdseff_dVb; + } else - { - T3 = T2 * MIN_EXP; + { T3 = T2 * MIN_EXP; T1 = T3 * diffVds; - dT1_dVg = -T3 * dVdseff_dVg; - dT1_dVd = T3 * (1.0 - dVdseff_dVd); - dT1_dVb = -T3 * dVdseff_dVb; - } - Isub = T1 * Idsa; - Gbg = T1 * dIdsa_dVg + Idsa * dT1_dVg; - Gbd = T1 * dIdsa_dVd + Idsa * dT1_dVd; - Gbb = T1 * dIdsa_dVb + Idsa * dT1_dVb; - - Gbd += Gbg * dVgsteff_dVd; + dT1_dVg = -T3 * dVdseff_dVg; + dT1_dVd = T3 * (1.0 - dVdseff_dVd); + dT1_dVb = -T3 * dVdseff_dVb; + } + Isub = T1 * Idsa; + Gbg = T1 * dIdsa_dVg + Idsa * dT1_dVg; + Gbd = T1 * dIdsa_dVd + Idsa * dT1_dVd; + Gbb = T1 * dIdsa_dVb + Idsa * dT1_dVb; + + Gbd += Gbg * dVgsteff_dVd; Gbb += Gbg * dVgsteff_dVb; Gbg *= dVgsteff_dVg; - Gbb *= dVbseff_dVb; /* bug fixing */ - } - - cdrain = Ids; - here->BSIM3gds = Gds; - here->BSIM3gm = Gm; - here->BSIM3gmbs = Gmb; - - here->BSIM3gbbs = Gbb; - here->BSIM3gbgs = Gbg; - here->BSIM3gbds = Gbd; - - here->BSIM3csub = Isub; - - /* BSIM3 thermal noise Qinv calculated from all capMod - * 0, 1, 2 & 3 stored in here->BSIM3qinv 1/1998 */ - - if ((model->BSIM3xpart < 0) || (!ChargeComputationNeeded)) - { - qgate = qdrn = qsrc = qbulk = 0.0; - here->BSIM3cggb = here->BSIM3cgsb = here->BSIM3cgdb = 0.0; - here->BSIM3cdgb = here->BSIM3cdsb = here->BSIM3cddb = 0.0; - here->BSIM3cbgb = here->BSIM3cbsb = here->BSIM3cbdb = 0.0; - here->BSIM3cqdb = here->BSIM3cqsb = - here->BSIM3cqgb = here->BSIM3cqbb = 0.0; - here->BSIM3gtau = 0.0; - goto finished; - } + Gbb *= dVbseff_dVb; /* bug fixing */ + } + + cdrain = Ids; + here->BSIM3gds = Gds; + here->BSIM3gm = Gm; + here->BSIM3gmbs = Gmb; + + here->BSIM3gbbs = Gbb; + here->BSIM3gbgs = Gbg; + here->BSIM3gbds = Gbd; + + here->BSIM3csub = Isub; + + /* BSIM3 thermal noise Qinv calculated from all capMod + * 0, 1, 2 & 3 stored in here->BSIM3qinv 1/1998 */ + + if ((model->BSIM3xpart < 0) || (!ChargeComputationNeeded)) + { qgate = qdrn = qsrc = qbulk = 0.0; + here->BSIM3cggb = here->BSIM3cgsb = here->BSIM3cgdb = 0.0; + here->BSIM3cdgb = here->BSIM3cdsb = here->BSIM3cddb = 0.0; + here->BSIM3cbgb = here->BSIM3cbsb = here->BSIM3cbdb = 0.0; + here->BSIM3cqdb = here->BSIM3cqsb = here->BSIM3cqgb + = here->BSIM3cqbb = 0.0; + here->BSIM3gtau = 0.0; + goto finished; + } else if (model->BSIM3capMod == 0) - { - if (Vbseff < 0.0) - { - Vbseff = Vbs; - dVbseff_dVb = 1.0; - } + { + if (Vbseff < 0.0) + { Vbseff = Vbs; + dVbseff_dVb = 1.0; + } else - { - Vbseff = pParam->BSIM3phi - Phis; - dVbseff_dVb = -dPhis_dVb; - } - - Vfb = pParam->BSIM3vfbcv; - Vth = Vfb + pParam->BSIM3phi + pParam->BSIM3k1ox * sqrtPhis; - Vgst = Vgs_eff - Vth; - dVth_dVb = pParam->BSIM3k1ox * dsqrtPhis_dVb; - dVgst_dVb = -dVth_dVb; - dVgst_dVg = dVgs_eff_dVg; - - CoxWL = model->BSIM3cox * pParam->BSIM3weffCV - * pParam->BSIM3leffCV; - Arg1 = Vgs_eff - Vbseff - Vfb; - - if (Arg1 <= 0.0) - { - qgate = CoxWL * Arg1; - qbulk = -qgate; - qdrn = 0.0; - - here->BSIM3cggb = CoxWL * dVgs_eff_dVg; - here->BSIM3cgdb = 0.0; - here->BSIM3cgsb = CoxWL * (dVbseff_dVb - dVgs_eff_dVg); - - here->BSIM3cdgb = 0.0; - here->BSIM3cddb = 0.0; - here->BSIM3cdsb = 0.0; - - here->BSIM3cbgb = -CoxWL * dVgs_eff_dVg; - here->BSIM3cbdb = 0.0; - here->BSIM3cbsb = -here->BSIM3cgsb; - here->BSIM3qinv = 0.0; - } + { Vbseff = pParam->BSIM3phi - Phis; + dVbseff_dVb = -dPhis_dVb; + } + + Vfb = pParam->BSIM3vfbcv; + Vth = Vfb + pParam->BSIM3phi + pParam->BSIM3k1ox * sqrtPhis; + Vgst = Vgs_eff - Vth; + dVth_dVb = pParam->BSIM3k1ox * dsqrtPhis_dVb; + dVgst_dVb = -dVth_dVb; + dVgst_dVg = dVgs_eff_dVg; + + CoxWL = model->BSIM3cox * pParam->BSIM3weffCV + * pParam->BSIM3leffCV; + Arg1 = Vgs_eff - Vbseff - Vfb; + + if (Arg1 <= 0.0) + { qgate = CoxWL * Arg1; + qbulk = -qgate; + qdrn = 0.0; + + here->BSIM3cggb = CoxWL * dVgs_eff_dVg; + here->BSIM3cgdb = 0.0; + here->BSIM3cgsb = CoxWL * (dVbseff_dVb - dVgs_eff_dVg); + + here->BSIM3cdgb = 0.0; + here->BSIM3cddb = 0.0; + here->BSIM3cdsb = 0.0; + + here->BSIM3cbgb = -CoxWL * dVgs_eff_dVg; + here->BSIM3cbdb = 0.0; + here->BSIM3cbsb = -here->BSIM3cgsb; + here->BSIM3qinv = 0.0; + } else if (Vgst <= 0.0) - { - T1 = 0.5 * pParam->BSIM3k1ox; - T2 = sqrt (T1 * T1 + Arg1); - qgate = CoxWL * pParam->BSIM3k1ox * (T2 - T1); - qbulk = -qgate; - qdrn = 0.0; - - T0 = CoxWL * T1 / T2; - here->BSIM3cggb = T0 * dVgs_eff_dVg; - here->BSIM3cgdb = 0.0; - here->BSIM3cgsb = T0 * (dVbseff_dVb - dVgs_eff_dVg); - - here->BSIM3cdgb = 0.0; - here->BSIM3cddb = 0.0; - here->BSIM3cdsb = 0.0; - - here->BSIM3cbgb = -here->BSIM3cggb; - here->BSIM3cbdb = 0.0; - here->BSIM3cbsb = -here->BSIM3cgsb; - here->BSIM3qinv = 0.0; - } + { T1 = 0.5 * pParam->BSIM3k1ox; + T2 = sqrt(T1 * T1 + Arg1); + qgate = CoxWL * pParam->BSIM3k1ox * (T2 - T1); + qbulk = -qgate; + qdrn = 0.0; + + T0 = CoxWL * T1 / T2; + here->BSIM3cggb = T0 * dVgs_eff_dVg; + here->BSIM3cgdb = 0.0; + here->BSIM3cgsb = T0 * (dVbseff_dVb - dVgs_eff_dVg); + + here->BSIM3cdgb = 0.0; + here->BSIM3cddb = 0.0; + here->BSIM3cdsb = 0.0; + + here->BSIM3cbgb = -here->BSIM3cggb; + here->BSIM3cbdb = 0.0; + here->BSIM3cbsb = -here->BSIM3cgsb; + here->BSIM3qinv = 0.0; + } else - { - One_Third_CoxWL = CoxWL / 3.0; - Two_Third_CoxWL = 2.0 * One_Third_CoxWL; + { One_Third_CoxWL = CoxWL / 3.0; + Two_Third_CoxWL = 2.0 * One_Third_CoxWL; - AbulkCV = Abulk0 * pParam->BSIM3abulkCVfactor; - dAbulkCV_dVb = pParam->BSIM3abulkCVfactor * dAbulk0_dVb; - Vdsat = Vgst / AbulkCV; - dVdsat_dVg = dVgs_eff_dVg / AbulkCV; - dVdsat_dVb = -(Vdsat * dAbulkCV_dVb + dVth_dVb) / AbulkCV; + AbulkCV = Abulk0 * pParam->BSIM3abulkCVfactor; + dAbulkCV_dVb = pParam->BSIM3abulkCVfactor * dAbulk0_dVb; + Vdsat = Vgst / AbulkCV; + dVdsat_dVg = dVgs_eff_dVg / AbulkCV; + dVdsat_dVb = - (Vdsat * dAbulkCV_dVb + dVth_dVb)/ AbulkCV; - if (model->BSIM3xpart > 0.5) - { /* 0/100 Charge partition model */ + if (model->BSIM3xpart > 0.5) + { /* 0/100 Charge partition model */ if (Vdsat <= Vds) - { /* saturation region */ - T1 = Vdsat / 3.0; - qgate = CoxWL * - (Vgs_eff - Vfb - pParam->BSIM3phi - T1); - T2 = -Two_Third_CoxWL * Vgst; - qbulk = -(qgate + T2); - qdrn = 0.0; - - here->BSIM3cggb = - One_Third_CoxWL - * (3.0 - dVdsat_dVg) * dVgs_eff_dVg; - T2 = -One_Third_CoxWL * dVdsat_dVb; - here->BSIM3cgsb = -(here->BSIM3cggb + T2); - here->BSIM3cgdb = 0.0; - - here->BSIM3cdgb = 0.0; - here->BSIM3cddb = 0.0; - here->BSIM3cdsb = 0.0; - - here->BSIM3cbgb = - -(here-> - BSIM3cggb - Two_Third_CoxWL * dVgs_eff_dVg); - T3 = -(T2 + Two_Third_CoxWL * dVth_dVb); - here->BSIM3cbsb = -(here->BSIM3cbgb + T3); - here->BSIM3cbdb = 0.0; - here->BSIM3qinv = -(qgate + qbulk); - } + { /* saturation region */ + T1 = Vdsat / 3.0; + qgate = CoxWL * (Vgs_eff - Vfb + - pParam->BSIM3phi - T1); + T2 = -Two_Third_CoxWL * Vgst; + qbulk = -(qgate + T2); + qdrn = 0.0; + + here->BSIM3cggb = One_Third_CoxWL * (3.0 + - dVdsat_dVg) * dVgs_eff_dVg; + T2 = -One_Third_CoxWL * dVdsat_dVb; + here->BSIM3cgsb = -(here->BSIM3cggb + T2); + here->BSIM3cgdb = 0.0; + + here->BSIM3cdgb = 0.0; + here->BSIM3cddb = 0.0; + here->BSIM3cdsb = 0.0; + + here->BSIM3cbgb = -(here->BSIM3cggb + - Two_Third_CoxWL * dVgs_eff_dVg); + T3 = -(T2 + Two_Third_CoxWL * dVth_dVb); + here->BSIM3cbsb = -(here->BSIM3cbgb + T3); + here->BSIM3cbdb = 0.0; + here->BSIM3qinv = -(qgate + qbulk); + } else - { /* linear region */ + { /* linear region */ Alphaz = Vgst / Vdsat; - T1 = 2.0 * Vdsat - Vds; - T2 = Vds / (3.0 * T1); - T3 = T2 * Vds; - T9 = 0.25 * CoxWL; - T4 = T9 * Alphaz; - T7 = 2.0 * Vds - T1 - 3.0 * T3; - T8 = T3 - T1 - 2.0 * Vds; - qgate = CoxWL * - (Vgs_eff - - Vfb - pParam->BSIM3phi - 0.5 * (Vds - T3)); - T10 = T4 * T8; - qdrn = T4 * T7; - qbulk = -(qgate + qdrn + T10); - - T5 = T3 / T1; - here->BSIM3cggb = - CoxWL * (1.0 - T5 * dVdsat_dVg) * dVgs_eff_dVg; - T11 = -CoxWL * T5 * dVdsat_dVb; - here->BSIM3cgdb = CoxWL * (T2 - 0.5 + 0.5 * T5); - here->BSIM3cgsb = - -(here->BSIM3cggb + T11 + here->BSIM3cgdb); - T6 = 1.0 / Vdsat; - dAlphaz_dVg = T6 * (1.0 - Alphaz * dVdsat_dVg); - dAlphaz_dVb = - -T6 * (dVth_dVb + Alphaz * dVdsat_dVb); - T7 = T9 * T7; - T8 = T9 * T8; - T9 = 2.0 * T4 * (1.0 - 3.0 * T5); - here->BSIM3cdgb = - (T7 * - dAlphaz_dVg - T9 * dVdsat_dVg) * dVgs_eff_dVg; - T12 = T7 * dAlphaz_dVb - T9 * dVdsat_dVb; - here->BSIM3cddb = T4 * (3.0 - 6.0 * T2 - 3.0 * T5); - here->BSIM3cdsb = - -(here->BSIM3cdgb + T12 + here->BSIM3cddb); - - T9 = 2.0 * T4 * (1.0 + T5); - T10 = (T8 * - dAlphaz_dVg - - T9 * dVdsat_dVg) * dVgs_eff_dVg; - T11 = T8 * dAlphaz_dVb - T9 * dVdsat_dVb; - T12 = T4 * (2.0 * T2 + T5 - 1.0); - T0 = -(T10 + T11 + T12); - - here->BSIM3cbgb = - -(here->BSIM3cggb + here->BSIM3cdgb + T10); - here->BSIM3cbdb = - -(here->BSIM3cgdb + here->BSIM3cddb + T12); - here->BSIM3cbsb = - -(here->BSIM3cgsb + here->BSIM3cdsb + T0); - here->BSIM3qinv = -(qgate + qbulk); - } - } + T1 = 2.0 * Vdsat - Vds; + T2 = Vds / (3.0 * T1); + T3 = T2 * Vds; + T9 = 0.25 * CoxWL; + T4 = T9 * Alphaz; + T7 = 2.0 * Vds - T1 - 3.0 * T3; + T8 = T3 - T1 - 2.0 * Vds; + qgate = CoxWL * (Vgs_eff - Vfb + - pParam->BSIM3phi - 0.5 * (Vds - T3)); + T10 = T4 * T8; + qdrn = T4 * T7; + qbulk = -(qgate + qdrn + T10); + + T5 = T3 / T1; + here->BSIM3cggb = CoxWL * (1.0 - T5 * dVdsat_dVg) + * dVgs_eff_dVg; + T11 = -CoxWL * T5 * dVdsat_dVb; + here->BSIM3cgdb = CoxWL * (T2 - 0.5 + 0.5 * T5); + here->BSIM3cgsb = -(here->BSIM3cggb + T11 + + here->BSIM3cgdb); + T6 = 1.0 / Vdsat; + dAlphaz_dVg = T6 * (1.0 - Alphaz * dVdsat_dVg); + dAlphaz_dVb = -T6 * (dVth_dVb + Alphaz * dVdsat_dVb); + T7 = T9 * T7; + T8 = T9 * T8; + T9 = 2.0 * T4 * (1.0 - 3.0 * T5); + here->BSIM3cdgb = (T7 * dAlphaz_dVg - T9 + * dVdsat_dVg) * dVgs_eff_dVg; + T12 = T7 * dAlphaz_dVb - T9 * dVdsat_dVb; + here->BSIM3cddb = T4 * (3.0 - 6.0 * T2 - 3.0 * T5); + here->BSIM3cdsb = -(here->BSIM3cdgb + T12 + + here->BSIM3cddb); + + T9 = 2.0 * T4 * (1.0 + T5); + T10 = (T8 * dAlphaz_dVg - T9 * dVdsat_dVg) + * dVgs_eff_dVg; + T11 = T8 * dAlphaz_dVb - T9 * dVdsat_dVb; + T12 = T4 * (2.0 * T2 + T5 - 1.0); + T0 = -(T10 + T11 + T12); + + here->BSIM3cbgb = -(here->BSIM3cggb + + here->BSIM3cdgb + T10); + here->BSIM3cbdb = -(here->BSIM3cgdb + + here->BSIM3cddb + T12); + here->BSIM3cbsb = -(here->BSIM3cgsb + + here->BSIM3cdsb + T0); + here->BSIM3qinv = -(qgate + qbulk); + } + } else if (model->BSIM3xpart < 0.5) - { /* 40/60 Charge partition model */ + { /* 40/60 Charge partition model */ if (Vds >= Vdsat) - { /* saturation region */ - T1 = Vdsat / 3.0; - qgate = CoxWL * - (Vgs_eff - Vfb - pParam->BSIM3phi - T1); - T2 = -Two_Third_CoxWL * Vgst; - qbulk = -(qgate + T2); - qdrn = 0.4 * T2; - - here->BSIM3cggb = - One_Third_CoxWL - * (3.0 - dVdsat_dVg) * dVgs_eff_dVg; - T2 = -One_Third_CoxWL * dVdsat_dVb; - here->BSIM3cgsb = -(here->BSIM3cggb + T2); - here->BSIM3cgdb = 0.0; - + { /* saturation region */ + T1 = Vdsat / 3.0; + qgate = CoxWL * (Vgs_eff - Vfb + - pParam->BSIM3phi - T1); + T2 = -Two_Third_CoxWL * Vgst; + qbulk = -(qgate + T2); + qdrn = 0.4 * T2; + + here->BSIM3cggb = One_Third_CoxWL * (3.0 + - dVdsat_dVg) * dVgs_eff_dVg; + T2 = -One_Third_CoxWL * dVdsat_dVb; + here->BSIM3cgsb = -(here->BSIM3cggb + T2); + here->BSIM3cgdb = 0.0; + T3 = 0.4 * Two_Third_CoxWL; - here->BSIM3cdgb = -T3 * dVgs_eff_dVg; - here->BSIM3cddb = 0.0; + here->BSIM3cdgb = -T3 * dVgs_eff_dVg; + here->BSIM3cddb = 0.0; T4 = T3 * dVth_dVb; - here->BSIM3cdsb = -(T4 + here->BSIM3cdgb); - - here->BSIM3cbgb = - -(here-> - BSIM3cggb - Two_Third_CoxWL * dVgs_eff_dVg); - T3 = -(T2 + Two_Third_CoxWL * dVth_dVb); - here->BSIM3cbsb = -(here->BSIM3cbgb + T3); - here->BSIM3cbdb = 0.0; - here->BSIM3qinv = -(qgate + qbulk); - } + here->BSIM3cdsb = -(T4 + here->BSIM3cdgb); + + here->BSIM3cbgb = -(here->BSIM3cggb + - Two_Third_CoxWL * dVgs_eff_dVg); + T3 = -(T2 + Two_Third_CoxWL * dVth_dVb); + here->BSIM3cbsb = -(here->BSIM3cbgb + T3); + here->BSIM3cbdb = 0.0; + here->BSIM3qinv = -(qgate + qbulk); + } else - { /* linear region */ + { /* linear region */ Alphaz = Vgst / Vdsat; T1 = 2.0 * Vdsat - Vds; T2 = Vds / (3.0 * T1); T3 = T2 * Vds; T9 = 0.25 * CoxWL; T4 = T9 * Alphaz; - qgate = CoxWL * - (Vgs_eff - - Vfb - pParam->BSIM3phi - 0.5 * (Vds - T3)); + qgate = CoxWL * (Vgs_eff - Vfb - pParam->BSIM3phi + - 0.5 * (Vds - T3)); T5 = T3 / T1; - here->BSIM3cggb = - CoxWL * (1.0 - T5 * dVdsat_dVg) * dVgs_eff_dVg; - tmp = -CoxWL * T5 * dVdsat_dVb; - here->BSIM3cgdb = CoxWL * (T2 - 0.5 + 0.5 * T5); - here->BSIM3cgsb = - -(here->BSIM3cggb + here->BSIM3cgdb + tmp); + here->BSIM3cggb = CoxWL * (1.0 - T5 * dVdsat_dVg) + * dVgs_eff_dVg; + tmp = -CoxWL * T5 * dVdsat_dVb; + here->BSIM3cgdb = CoxWL * (T2 - 0.5 + 0.5 * T5); + here->BSIM3cgsb = -(here->BSIM3cggb + + here->BSIM3cgdb + tmp); T6 = 1.0 / Vdsat; - dAlphaz_dVg = T6 * (1.0 - Alphaz * dVdsat_dVg); - dAlphaz_dVb = - -T6 * (dVth_dVb + Alphaz * dVdsat_dVb); + dAlphaz_dVg = T6 * (1.0 - Alphaz * dVdsat_dVg); + dAlphaz_dVb = -T6 * (dVth_dVb + Alphaz * dVdsat_dVb); - T6 = 8.0 * Vdsat * - Vdsat - 6.0 * Vdsat * Vds + 1.2 * Vds * Vds; + T6 = 8.0 * Vdsat * Vdsat - 6.0 * Vdsat * Vds + + 1.2 * Vds * Vds; T8 = T2 / T1; T7 = Vds - T1 - T8 * T6; qdrn = T4 * T7; T7 *= T9; tmp = T8 / T1; - tmp1 = T4 * (2.0 - - 4.0 * - tmp * - T6 + T8 * (16.0 * Vdsat - 6.0 * Vds)); - - here->BSIM3cdgb = - (T7 * - dAlphaz_dVg - tmp1 * dVdsat_dVg) * dVgs_eff_dVg; - T10 = T7 * dAlphaz_dVb - tmp1 * dVdsat_dVb; - here->BSIM3cddb = - T4 * (2.0 - - (1.0 / - (3.0 * - T1 * - T1) + - 2.0 * - tmp) * - T6 + T8 * (6.0 * Vdsat - 2.4 * Vds)); - here->BSIM3cdsb = - -(here->BSIM3cdgb + T10 + here->BSIM3cddb); + tmp1 = T4 * (2.0 - 4.0 * tmp * T6 + + T8 * (16.0 * Vdsat - 6.0 * Vds)); + + here->BSIM3cdgb = (T7 * dAlphaz_dVg - tmp1 + * dVdsat_dVg) * dVgs_eff_dVg; + T10 = T7 * dAlphaz_dVb - tmp1 * dVdsat_dVb; + here->BSIM3cddb = T4 * (2.0 - (1.0 / (3.0 * T1 + * T1) + 2.0 * tmp) * T6 + T8 + * (6.0 * Vdsat - 2.4 * Vds)); + here->BSIM3cdsb = -(here->BSIM3cdgb + + T10 + here->BSIM3cddb); T7 = 2.0 * (T1 + T3); qbulk = -(qgate - T4 * T7); T7 *= T9; T0 = 4.0 * T4 * (1.0 - T5); - T12 = (-T7 * - dAlphaz_dVg - - here-> - BSIM3cdgb - T0 * dVdsat_dVg) * dVgs_eff_dVg; + T12 = (-T7 * dAlphaz_dVg - here->BSIM3cdgb + - T0 * dVdsat_dVg) * dVgs_eff_dVg; T11 = -T7 * dAlphaz_dVb - T10 - T0 * dVdsat_dVb; - T10 = -4.0 * T4 * - (T2 - 0.5 + 0.5 * T5) - here->BSIM3cddb; - tmp = -(T10 + T11 + T12); - - here->BSIM3cbgb = - -(here->BSIM3cggb + here->BSIM3cdgb + T12); - - here->BSIM3cbdb = -(here->BSIM3cgdb + here->BSIM3cddb + T10); /* bug fix */ - - here->BSIM3cbsb = - -(here->BSIM3cgsb + here->BSIM3cdsb + tmp); - here->BSIM3qinv = -(qgate + qbulk); - } - } + T10 = -4.0 * T4 * (T2 - 0.5 + 0.5 * T5) + - here->BSIM3cddb; + tmp = -(T10 + T11 + T12); + + here->BSIM3cbgb = -(here->BSIM3cggb + + here->BSIM3cdgb + T12); + here->BSIM3cbdb = -(here->BSIM3cgdb + + here->BSIM3cddb + T10); /* bug fix */ + here->BSIM3cbsb = -(here->BSIM3cgsb + + here->BSIM3cdsb + tmp); + here->BSIM3qinv = -(qgate + qbulk); + } + } else - { /* 50/50 partitioning */ + { /* 50/50 partitioning */ if (Vds >= Vdsat) - { /* saturation region */ - T1 = Vdsat / 3.0; - qgate = CoxWL * - (Vgs_eff - Vfb - pParam->BSIM3phi - T1); - T2 = -Two_Third_CoxWL * Vgst; - qbulk = -(qgate + T2); - qdrn = 0.5 * T2; - - here->BSIM3cggb = - One_Third_CoxWL - * (3.0 - dVdsat_dVg) * dVgs_eff_dVg; - T2 = -One_Third_CoxWL * dVdsat_dVb; - here->BSIM3cgsb = -(here->BSIM3cggb + T2); - here->BSIM3cgdb = 0.0; - - here->BSIM3cdgb = -One_Third_CoxWL * dVgs_eff_dVg; - here->BSIM3cddb = 0.0; + { /* saturation region */ + T1 = Vdsat / 3.0; + qgate = CoxWL * (Vgs_eff - Vfb + - pParam->BSIM3phi - T1); + T2 = -Two_Third_CoxWL * Vgst; + qbulk = -(qgate + T2); + qdrn = 0.5 * T2; + + here->BSIM3cggb = One_Third_CoxWL * (3.0 + - dVdsat_dVg) * dVgs_eff_dVg; + T2 = -One_Third_CoxWL * dVdsat_dVb; + here->BSIM3cgsb = -(here->BSIM3cggb + T2); + here->BSIM3cgdb = 0.0; + + here->BSIM3cdgb = -One_Third_CoxWL * dVgs_eff_dVg; + here->BSIM3cddb = 0.0; T4 = One_Third_CoxWL * dVth_dVb; - here->BSIM3cdsb = -(T4 + here->BSIM3cdgb); - - here->BSIM3cbgb = - -(here-> - BSIM3cggb - Two_Third_CoxWL * dVgs_eff_dVg); - T3 = -(T2 + Two_Third_CoxWL * dVth_dVb); - here->BSIM3cbsb = -(here->BSIM3cbgb + T3); - here->BSIM3cbdb = 0.0; - here->BSIM3qinv = -(qgate + qbulk); - } + here->BSIM3cdsb = -(T4 + here->BSIM3cdgb); + + here->BSIM3cbgb = -(here->BSIM3cggb + - Two_Third_CoxWL * dVgs_eff_dVg); + T3 = -(T2 + Two_Third_CoxWL * dVth_dVb); + here->BSIM3cbsb = -(here->BSIM3cbgb + T3); + here->BSIM3cbdb = 0.0; + here->BSIM3qinv = -(qgate + qbulk); + } else - { /* linear region */ + { /* linear region */ Alphaz = Vgst / Vdsat; T1 = 2.0 * Vdsat - Vds; T2 = Vds / (3.0 * T1); T3 = T2 * Vds; T9 = 0.25 * CoxWL; T4 = T9 * Alphaz; - qgate = CoxWL * - (Vgs_eff - - Vfb - pParam->BSIM3phi - 0.5 * (Vds - T3)); + qgate = CoxWL * (Vgs_eff - Vfb - pParam->BSIM3phi + - 0.5 * (Vds - T3)); T5 = T3 / T1; - here->BSIM3cggb = - CoxWL * (1.0 - T5 * dVdsat_dVg) * dVgs_eff_dVg; - tmp = -CoxWL * T5 * dVdsat_dVb; - here->BSIM3cgdb = CoxWL * (T2 - 0.5 + 0.5 * T5); - here->BSIM3cgsb = - -(here->BSIM3cggb + here->BSIM3cgdb + tmp); + here->BSIM3cggb = CoxWL * (1.0 - T5 * dVdsat_dVg) + * dVgs_eff_dVg; + tmp = -CoxWL * T5 * dVdsat_dVb; + here->BSIM3cgdb = CoxWL * (T2 - 0.5 + 0.5 * T5); + here->BSIM3cgsb = -(here->BSIM3cggb + + here->BSIM3cgdb + tmp); T6 = 1.0 / Vdsat; - dAlphaz_dVg = T6 * (1.0 - Alphaz * dVdsat_dVg); - dAlphaz_dVb = - -T6 * (dVth_dVb + Alphaz * dVdsat_dVb); + dAlphaz_dVg = T6 * (1.0 - Alphaz * dVdsat_dVg); + dAlphaz_dVb = -T6 * (dVth_dVb + Alphaz * dVdsat_dVb); T7 = T1 + T3; qdrn = -T4 * T7; - qbulk = -(qgate + qdrn + qdrn); + qbulk = - (qgate + qdrn + qdrn); T7 *= T9; T0 = T4 * (2.0 * T5 - 2.0); - here->BSIM3cdgb = - (T0 * - dVdsat_dVg - T7 * dAlphaz_dVg) * dVgs_eff_dVg; + here->BSIM3cdgb = (T0 * dVdsat_dVg - T7 + * dAlphaz_dVg) * dVgs_eff_dVg; T12 = T0 * dVdsat_dVb - T7 * dAlphaz_dVb; - here->BSIM3cddb = T4 * (1.0 - 2.0 * T2 - T5); - here->BSIM3cdsb = - -(here->BSIM3cdgb + T12 + here->BSIM3cddb); - - here->BSIM3cbgb = - -(here->BSIM3cggb + 2.0 * here->BSIM3cdgb); - here->BSIM3cbdb = - -(here->BSIM3cgdb + 2.0 * here->BSIM3cddb); - here->BSIM3cbsb = - -(here->BSIM3cgsb + 2.0 * here->BSIM3cdsb); - here->BSIM3qinv = -(qgate + qbulk); - } - } - } - } + here->BSIM3cddb = T4 * (1.0 - 2.0 * T2 - T5); + here->BSIM3cdsb = -(here->BSIM3cdgb + T12 + + here->BSIM3cddb); + + here->BSIM3cbgb = -(here->BSIM3cggb + + 2.0 * here->BSIM3cdgb); + here->BSIM3cbdb = -(here->BSIM3cgdb + + 2.0 * here->BSIM3cddb); + here->BSIM3cbsb = -(here->BSIM3cgsb + + 2.0 * here->BSIM3cdsb); + here->BSIM3qinv = -(qgate + qbulk); + } + } + } + } else - { - if (Vbseff < 0.0) - { - VbseffCV = Vbseff; - dVbseffCV_dVb = 1.0; - } - else - { - VbseffCV = pParam->BSIM3phi - Phis; - dVbseffCV_dVb = -dPhis_dVb; - } - - CoxWL = model->BSIM3cox * pParam->BSIM3weffCV - * pParam->BSIM3leffCV; - - /* Seperate VgsteffCV with noff and voffcv */ - noff = n * pParam->BSIM3noff; - dnoff_dVd = pParam->BSIM3noff * dn_dVd; - dnoff_dVb = pParam->BSIM3noff * dn_dVb; - T0 = Vtm * noff; - voffcv = pParam->BSIM3voffcv; - VgstNVt = (Vgst - voffcv) / T0; - - if (VgstNVt > EXP_THRESHOLD) - { - Vgsteff = Vgst - voffcv; - dVgsteff_dVg = dVgs_eff_dVg; - dVgsteff_dVd = -dVth_dVd; - dVgsteff_dVb = -dVth_dVb; - } - else if (VgstNVt < -EXP_THRESHOLD) - { - Vgsteff = T0 * log (1.0 + MIN_EXP); - dVgsteff_dVg = 0.0; - dVgsteff_dVd = Vgsteff / noff; - dVgsteff_dVb = dVgsteff_dVd * dnoff_dVb; - dVgsteff_dVd *= dnoff_dVd; - } + { if (Vbseff < 0.0) + { VbseffCV = Vbseff; + dVbseffCV_dVb = 1.0; + } else - { - ExpVgst = exp (VgstNVt); - Vgsteff = T0 * log (1.0 + ExpVgst); - dVgsteff_dVg = ExpVgst / (1.0 + ExpVgst); - dVgsteff_dVd = - -dVgsteff_dVg * (dVth_dVd + - (Vgst - - voffcv) / - noff * - dnoff_dVd) + Vgsteff / noff * dnoff_dVd; - dVgsteff_dVb = - -dVgsteff_dVg * (dVth_dVb + - (Vgst - - voffcv) / - noff * - dnoff_dVb) + Vgsteff / noff * dnoff_dVb; - dVgsteff_dVg *= dVgs_eff_dVg; - } /* End of VgsteffCV */ + { VbseffCV = pParam->BSIM3phi - Phis; + dVbseffCV_dVb = -dPhis_dVb; + } + + CoxWL = model->BSIM3cox * pParam->BSIM3weffCV + * pParam->BSIM3leffCV; + + /* Seperate VgsteffCV with noff and voffcv */ + noff = n * pParam->BSIM3noff; + dnoff_dVd = pParam->BSIM3noff * dn_dVd; + dnoff_dVb = pParam->BSIM3noff * dn_dVb; + T0 = Vtm * noff; + voffcv = pParam->BSIM3voffcv; + VgstNVt = (Vgst - voffcv) / T0; + + if (VgstNVt > EXP_THRESHOLD) + { Vgsteff = Vgst - voffcv; + dVgsteff_dVg = dVgs_eff_dVg; + dVgsteff_dVd = -dVth_dVd; + dVgsteff_dVb = -dVth_dVb; + } + else if (VgstNVt < -EXP_THRESHOLD) + { Vgsteff = T0 * log(1.0 + MIN_EXP); + dVgsteff_dVg = 0.0; + dVgsteff_dVd = Vgsteff / noff; + dVgsteff_dVb = dVgsteff_dVd * dnoff_dVb; + dVgsteff_dVd *= dnoff_dVd; + } + else + { ExpVgst = exp(VgstNVt); + Vgsteff = T0 * log(1.0 + ExpVgst); + dVgsteff_dVg = ExpVgst / (1.0 + ExpVgst); + dVgsteff_dVd = -dVgsteff_dVg * (dVth_dVd + (Vgst - voffcv) + / noff * dnoff_dVd) + Vgsteff / noff * dnoff_dVd; + dVgsteff_dVb = -dVgsteff_dVg * (dVth_dVb + (Vgst - voffcv) + / noff * dnoff_dVb) + Vgsteff / noff * dnoff_dVb; + dVgsteff_dVg *= dVgs_eff_dVg; + } /* End of VgsteffCV */ if (model->BSIM3capMod == 1) - { - + { /* Added revision dependent code */ - switch (model->BSIM3intVersion) - { + switch (model->BSIM3intVersion) { case BSIM3V324: case BSIM3V323: case BSIM3V322: Vfb = pParam->BSIM3vfbzb; break; - case BSIM3V32: Vfb = pParam->BSIM3vfbzb; dVfb_dVb = dVfb_dVd = 0.0; break; - default: - Vfb = Vth - pParam->BSIM3phi - - pParam->BSIM3k1ox * sqrtPhis; + Vfb = Vth - pParam->BSIM3phi - pParam->BSIM3k1ox * sqrtPhis; dVfb_dVb = dVth_dVb - pParam->BSIM3k1ox * dsqrtPhis_dVb; dVfb_dVd = dVth_dVd; - } + } - Arg1 = Vgs_eff - VbseffCV - Vfb - Vgsteff; - - if (Arg1 <= 0.0) - { - qgate = CoxWL * Arg1; - Cgg = CoxWL * (dVgs_eff_dVg - dVgsteff_dVg); + Arg1 = Vgs_eff - VbseffCV - Vfb - Vgsteff; + if (Arg1 <= 0.0) + { qgate = CoxWL * Arg1; + Cgg = CoxWL * (dVgs_eff_dVg - dVgsteff_dVg); /* Added revision dependent code */ - switch (model->BSIM3intVersion) - { + switch (model->BSIM3intVersion) { case BSIM3V324: case BSIM3V323: case BSIM3V322: - Cgd = -CoxWL * dVgsteff_dVd; Cgb = -CoxWL * (dVbseffCV_dVb + dVgsteff_dVb); break; - case BSIM3V32: default: - Cgd = -CoxWL * (dVfb_dVd + dVgsteff_dVd); - Cgb = -CoxWL * - (dVfb_dVb + dVbseffCV_dVb + dVgsteff_dVb); - } - - } - else - { - T0 = 0.5 * pParam->BSIM3k1ox; - T1 = sqrt (T0 * T0 + Arg1); - T2 = CoxWL * T0 / T1; - - qgate = CoxWL * pParam->BSIM3k1ox * (T1 - T0); - - Cgg = T2 * (dVgs_eff_dVg - dVgsteff_dVg); - + Cgb = -CoxWL * (dVfb_dVb + dVbseffCV_dVb + dVgsteff_dVb); + } + } + else + { T0 = 0.5 * pParam->BSIM3k1ox; + T1 = sqrt(T0 * T0 + Arg1); + T2 = CoxWL * T0 / T1; + + qgate = CoxWL * pParam->BSIM3k1ox * (T1 - T0); + + Cgg = T2 * (dVgs_eff_dVg - dVgsteff_dVg); /* Added revision dependent code */ - switch (model->BSIM3intVersion) - { + switch (model->BSIM3intVersion) { case BSIM3V324: case BSIM3V323: case BSIM3V322: - Cgd = -T2 * dVgsteff_dVd; Cgb = -T2 * (dVbseffCV_dVb + dVgsteff_dVb); break; - case BSIM3V32: default: - Cgd = -T2 * (dVfb_dVd + dVgsteff_dVd); - Cgb = -T2 * - (dVfb_dVb + dVbseffCV_dVb + dVgsteff_dVb); - } - - } - qbulk = -qgate; - Cbg = -Cgg; - Cbd = -Cgd; - Cbb = -Cgb; - - One_Third_CoxWL = CoxWL / 3.0; - Two_Third_CoxWL = 2.0 * One_Third_CoxWL; - AbulkCV = Abulk0 * pParam->BSIM3abulkCVfactor; - dAbulkCV_dVb = pParam->BSIM3abulkCVfactor * dAbulk0_dVb; - VdsatCV = Vgsteff / AbulkCV; - if (VdsatCV < Vds) - { - dVdsatCV_dVg = 1.0 / AbulkCV; - dVdsatCV_dVb = -VdsatCV * dAbulkCV_dVb / AbulkCV; + Cgb = -T2 * (dVfb_dVb + dVbseffCV_dVb + dVgsteff_dVb); + } + } + qbulk = -qgate; + Cbg = -Cgg; + Cbd = -Cgd; + Cbb = -Cgb; + + One_Third_CoxWL = CoxWL / 3.0; + Two_Third_CoxWL = 2.0 * One_Third_CoxWL; + AbulkCV = Abulk0 * pParam->BSIM3abulkCVfactor; + dAbulkCV_dVb = pParam->BSIM3abulkCVfactor * dAbulk0_dVb; + VdsatCV = Vgsteff / AbulkCV; + if (VdsatCV < Vds) + { dVdsatCV_dVg = 1.0 / AbulkCV; + dVdsatCV_dVb = -VdsatCV * dAbulkCV_dVb / AbulkCV; T0 = Vgsteff - VdsatCV / 3.0; - dT0_dVg = 1.0 - dVdsatCV_dVg / 3.0; - dT0_dVb = -dVdsatCV_dVb / 3.0; - qgate += CoxWL * T0; - Cgg1 = CoxWL * dT0_dVg; - Cgb1 = CoxWL * dT0_dVb + Cgg1 * dVgsteff_dVb; - Cgd1 = Cgg1 * dVgsteff_dVd; + dT0_dVg = 1.0 - dVdsatCV_dVg / 3.0; + dT0_dVb = -dVdsatCV_dVb / 3.0; + qgate += CoxWL * T0; + Cgg1 = CoxWL * dT0_dVg; + Cgb1 = CoxWL * dT0_dVb + Cgg1 * dVgsteff_dVb; + Cgd1 = Cgg1 * dVgsteff_dVd; Cgg1 *= dVgsteff_dVg; Cgg += Cgg1; Cgb += Cgb1; @@ -1984,249 +1734,188 @@ BSIM3load (GENmodel * inModel, CKTcircuit * ckt) T0 = VdsatCV - Vgsteff; dT0_dVg = dVdsatCV_dVg - 1.0; dT0_dVb = dVdsatCV_dVb; - qbulk += One_Third_CoxWL * T0; - Cbg1 = One_Third_CoxWL * dT0_dVg; + qbulk += One_Third_CoxWL * T0; + Cbg1 = One_Third_CoxWL * dT0_dVg; Cbb1 = One_Third_CoxWL * dT0_dVb + Cbg1 * dVgsteff_dVb; Cbd1 = Cbg1 * dVgsteff_dVd; Cbg1 *= dVgsteff_dVg; Cbg += Cbg1; Cbb += Cbb1; - Cbd += Cbd1; - - if (model->BSIM3xpart > 0.5) - T0 = -Two_Third_CoxWL; - else if (model->BSIM3xpart < 0.5) - T0 = -0.4 * CoxWL; - else - T0 = -One_Third_CoxWL; - - qsrc = T0 * Vgsteff; - Csg = T0 * dVgsteff_dVg; - Csb = T0 * dVgsteff_dVb; - Csd = T0 * dVgsteff_dVd; + Cbd += Cbd1; + + if (model->BSIM3xpart > 0.5) + T0 = -Two_Third_CoxWL; + else if (model->BSIM3xpart < 0.5) + T0 = -0.4 * CoxWL; + else + T0 = -One_Third_CoxWL; + + qsrc = T0 * Vgsteff; + Csg = T0 * dVgsteff_dVg; + Csb = T0 * dVgsteff_dVb; + Csd = T0 * dVgsteff_dVd; Cgb *= dVbseff_dVb; Cbb *= dVbseff_dVb; Csb *= dVbseff_dVb; - } - else - { - T0 = AbulkCV * Vds; - T1 = 12.0 * (Vgsteff - 0.5 * T0 + 1.e-20); + } + else + { T0 = AbulkCV * Vds; + T1 = 12.0 * (Vgsteff - 0.5 * T0 + 1.e-20); T2 = Vds / T1; T3 = T0 * T2; - dT3_dVg = -12.0 * T2 * T2 * AbulkCV; - dT3_dVd = - 6.0 * T0 * (4.0 * Vgsteff - T0) / T1 / T1 - 0.5; - dT3_dVb = 12.0 * T2 * T2 * dAbulkCV_dVb * Vgsteff; - - qgate += CoxWL * (Vgsteff - 0.5 * Vds + T3); - Cgg1 = CoxWL * (1.0 + dT3_dVg); - Cgb1 = CoxWL * dT3_dVb + Cgg1 * dVgsteff_dVb; - Cgd1 = CoxWL * dT3_dVd + Cgg1 * dVgsteff_dVd; + dT3_dVg = -12.0 * T2 * T2 * AbulkCV; + dT3_dVd = 6.0 * T0 * (4.0 * Vgsteff - T0) / T1 / T1 - 0.5; + dT3_dVb = 12.0 * T2 * T2 * dAbulkCV_dVb * Vgsteff; + + qgate += CoxWL * (Vgsteff - 0.5 * Vds + T3); + Cgg1 = CoxWL * (1.0 + dT3_dVg); + Cgb1 = CoxWL * dT3_dVb + Cgg1 * dVgsteff_dVb; + Cgd1 = CoxWL * dT3_dVd + Cgg1 * dVgsteff_dVd; Cgg1 *= dVgsteff_dVg; Cgg += Cgg1; Cgb += Cgb1; Cgd += Cgd1; - qbulk += CoxWL * (1.0 - AbulkCV) * (0.5 * Vds - T3); + qbulk += CoxWL * (1.0 - AbulkCV) * (0.5 * Vds - T3); Cbg1 = -CoxWL * ((1.0 - AbulkCV) * dT3_dVg); - Cbb1 = -CoxWL * - ((1.0 - - AbulkCV) * dT3_dVb + - (0.5 * Vds - - T3) * dAbulkCV_dVb) + Cbg1 * dVgsteff_dVb; - Cbd1 = -CoxWL * (1.0 - - AbulkCV) * - dT3_dVd + Cbg1 * dVgsteff_dVd; + Cbb1 = -CoxWL * ((1.0 - AbulkCV) * dT3_dVb + + (0.5 * Vds - T3) * dAbulkCV_dVb) + + Cbg1 * dVgsteff_dVb; + Cbd1 = -CoxWL * (1.0 - AbulkCV) * dT3_dVd + + Cbg1 * dVgsteff_dVd; Cbg1 *= dVgsteff_dVg; Cbg += Cbg1; Cbb += Cbb1; Cbd += Cbd1; - if (model->BSIM3xpart > 0.5) - { /* 0/100 Charge petition model */ - T1 = T1 + T1; - qsrc = -CoxWL * (0.5 * - Vgsteff - + 0.25 * T0 - T0 * T0 / T1); - Csg = -CoxWL * (0.5 + - 24.0 * - T0 * Vds / T1 / T1 * AbulkCV); - Csb = -CoxWL * (0.25 * - Vds * - dAbulkCV_dVb - - - 12.0 * - T0 * - Vds / - T1 / - T1 * - (4.0 * - Vgsteff - - - T0) * - dAbulkCV_dVb) + Csg * dVgsteff_dVb; - Csd = -CoxWL * (0.25 * - AbulkCV - - - 12.0 * - AbulkCV - * T0 / - T1 / - T1 * - (4.0 * - Vgsteff - - T0)) + Csg * dVgsteff_dVd; - Csg *= dVgsteff_dVg; - } + if (model->BSIM3xpart > 0.5) + { /* 0/100 Charge petition model */ + T1 = T1 + T1; + qsrc = -CoxWL * (0.5 * Vgsteff + 0.25 * T0 + - T0 * T0 / T1); + Csg = -CoxWL * (0.5 + 24.0 * T0 * Vds / T1 / T1 + * AbulkCV); + Csb = -CoxWL * (0.25 * Vds * dAbulkCV_dVb + - 12.0 * T0 * Vds / T1 / T1 * (4.0 * Vgsteff - T0) + * dAbulkCV_dVb) + Csg * dVgsteff_dVb; + Csd = -CoxWL * (0.25 * AbulkCV - 12.0 * AbulkCV * T0 + / T1 / T1 * (4.0 * Vgsteff - T0)) + + Csg * dVgsteff_dVd; + Csg *= dVgsteff_dVg; + } else if (model->BSIM3xpart < 0.5) - { /* 40/60 Charge petition model */ - T1 = T1 / 12.0; - T2 = 0.5 * CoxWL / (T1 * T1); - T3 = Vgsteff * (2.0 * - T0 * - T0 / - 3.0 + - Vgsteff - * - (Vgsteff - - - 4.0 * - T0 / - 3.0)) - 2.0 * T0 * T0 * T0 / 15.0; - qsrc = -T2 * T3; - T4 = 4.0 / 3.0 * - Vgsteff * (Vgsteff - T0) + 0.4 * T0 * T0; - Csg = -2.0 * qsrc / - T1 - - T2 * - (Vgsteff * - (3.0 * - Vgsteff - - 8.0 * T0 / 3.0) + 2.0 * T0 * T0 / 3.0); - Csb = (qsrc / T1 * - Vds + - T2 * T4 * - Vds) * dAbulkCV_dVb + Csg * dVgsteff_dVb; - Csd = (qsrc / T1 + - T2 * T4) * AbulkCV + Csg * dVgsteff_dVd; - Csg *= dVgsteff_dVg; - } + { /* 40/60 Charge petition model */ + T1 = T1 / 12.0; + T2 = 0.5 * CoxWL / (T1 * T1); + T3 = Vgsteff * (2.0 * T0 * T0 / 3.0 + Vgsteff + * (Vgsteff - 4.0 * T0 / 3.0)) + - 2.0 * T0 * T0 * T0 / 15.0; + qsrc = -T2 * T3; + T4 = 4.0 / 3.0 * Vgsteff * (Vgsteff - T0) + + 0.4 * T0 * T0; + Csg = -2.0 * qsrc / T1 - T2 * (Vgsteff * (3.0 + * Vgsteff - 8.0 * T0 / 3.0) + + 2.0 * T0 * T0 / 3.0); + Csb = (qsrc / T1 * Vds + T2 * T4 * Vds) * dAbulkCV_dVb + + Csg * dVgsteff_dVb; + Csd = (qsrc / T1 + T2 * T4) * AbulkCV + + Csg * dVgsteff_dVd; + Csg *= dVgsteff_dVg; + } else - { /* 50/50 Charge petition model */ - qsrc = -0.5 * (qgate + qbulk); - Csg = -0.5 * (Cgg1 + Cbg1); - Csb = -0.5 * (Cgb1 + Cbb1); - Csd = -0.5 * (Cgd1 + Cbd1); - } + { /* 50/50 Charge petition model */ + qsrc = -0.5 * (qgate + qbulk); + Csg = -0.5 * (Cgg1 + Cbg1); + Csb = -0.5 * (Cgb1 + Cbb1); + Csd = -0.5 * (Cgd1 + Cbd1); + } Cgb *= dVbseff_dVb; Cbb *= dVbseff_dVb; Csb *= dVbseff_dVb; - } - qdrn = -(qgate + qbulk + qsrc); - here->BSIM3cggb = Cgg; - here->BSIM3cgsb = -(Cgg + Cgd + Cgb); - here->BSIM3cgdb = Cgd; - here->BSIM3cdgb = -(Cgg + Cbg + Csg); - here->BSIM3cdsb = - (Cgg + Cgd + Cgb + Cbg + Cbd + Cbb + Csg + Csd + Csb); - here->BSIM3cddb = -(Cgd + Cbd + Csd); - here->BSIM3cbgb = Cbg; - here->BSIM3cbsb = -(Cbg + Cbd + Cbb); - here->BSIM3cbdb = Cbd; - here->BSIM3qinv = -(qgate + qbulk); - } + } + qdrn = -(qgate + qbulk + qsrc); + here->BSIM3cggb = Cgg; + here->BSIM3cgsb = -(Cgg + Cgd + Cgb); + here->BSIM3cgdb = Cgd; + here->BSIM3cdgb = -(Cgg + Cbg + Csg); + here->BSIM3cdsb = (Cgg + Cgd + Cgb + Cbg + Cbd + Cbb + + Csg + Csd + Csb); + here->BSIM3cddb = -(Cgd + Cbd + Csd); + here->BSIM3cbgb = Cbg; + here->BSIM3cbsb = -(Cbg + Cbd + Cbb); + here->BSIM3cbdb = Cbd; + here->BSIM3qinv = -(qgate + qbulk); + } else if (model->BSIM3capMod == 2) - { + { /* Added revision dependent code */ - switch (model->BSIM3intVersion) - { + switch (model->BSIM3intVersion) { case BSIM3V324: case BSIM3V323: case BSIM3V322: - Vfb = pParam->BSIM3vfbzb; break; - case BSIM3V32: Vfb = pParam->BSIM3vfbzb; dVfb_dVb = dVfb_dVd = 0.0; break; - default: /* old code prior to v3.2 */ - Vfb = Vth - pParam->BSIM3phi - - pParam->BSIM3k1ox * sqrtPhis; + Vfb = Vth - pParam->BSIM3phi - pParam->BSIM3k1ox * sqrtPhis; dVfb_dVb = dVth_dVb - pParam->BSIM3k1ox * dsqrtPhis_dVb; dVfb_dVd = dVth_dVd; - } + } - V3 = Vfb - Vgs_eff + VbseffCV - DELTA_3; + V3 = Vfb - Vgs_eff + VbseffCV - DELTA_3; if (Vfb <= 0.0) - { - T0 = sqrt (V3 * V3 - 4.0 * DELTA_3 * Vfb); + { T0 = sqrt(V3 * V3 - 4.0 * DELTA_3 * Vfb); T2 = -DELTA_3 / T0; - } + } else - { - T0 = sqrt (V3 * V3 + 4.0 * DELTA_3 * Vfb); + { T0 = sqrt(V3 * V3 + 4.0 * DELTA_3 * Vfb); T2 = DELTA_3 / T0; - } + } T1 = 0.5 * (1.0 + V3 / T0); Vfbeff = Vfb - 0.5 * (V3 + T0); - /* Added revision dependent code */ - switch (model->BSIM3intVersion) - { + switch (model->BSIM3intVersion) { case BSIM3V324: case BSIM3V323: case BSIM3V322: /* Do nothing */ break; - case BSIM3V32: default: dVfbeff_dVd = (1.0 - T1 - T2) * dVfb_dVd; - } - + } dVfbeff_dVg = T1 * dVgs_eff_dVg; - /* Added revision dependent code */ - switch (model->BSIM3intVersion) - { + switch (model->BSIM3intVersion) { case BSIM3V324: case BSIM3V323: case BSIM3V322: dVfbeff_dVb = -T1 * dVbseffCV_dVb; break; - case BSIM3V32: default: - dVfbeff_dVb = - (1.0 - T1 - T2) * dVfb_dVb - T1 * dVbseffCV_dVb; - } - + dVfbeff_dVb = (1.0 - T1 - T2) * dVfb_dVb - T1 * dVbseffCV_dVb; + } Qac0 = CoxWL * (Vfbeff - Vfb); dQac0_dVg = CoxWL * dVfbeff_dVg; - /* Added revision dependent code */ - switch (model->BSIM3intVersion) - { + switch (model->BSIM3intVersion) { case BSIM3V324: case BSIM3V323: case BSIM3V322: /* Do nothing */ break; - case BSIM3V32: default: dQac0_dVd = CoxWL * (dVfbeff_dVd - dVfb_dVd); - } - + } /* Added revision dependent code */ - switch (model->BSIM3intVersion) - { + switch (model->BSIM3intVersion) { case BSIM3V324: case BSIM3V323: case BSIM3V322: @@ -2235,55 +1924,46 @@ BSIM3load (GENmodel * inModel, CKTcircuit * ckt) case BSIM3V32: default: dQac0_dVb = CoxWL * (dVfbeff_dVb - dVfb_dVb); - } + } - T0 = 0.5 * pParam->BSIM3k1ox; + T0 = 0.5 * pParam->BSIM3k1ox; T3 = Vgs_eff - Vfbeff - VbseffCV - Vgsteff; - if (pParam->BSIM3k1ox == 0.0) - { - T1 = 0.0; - T2 = 0.0; - } + if (pParam->BSIM3k1ox == 0.0) + { T1 = 0.0; + T2 = 0.0; + } else if (T3 < 0.0) - { - T1 = T0 + T3 / pParam->BSIM3k1ox; - T2 = CoxWL; - } + { T1 = T0 + T3 / pParam->BSIM3k1ox; + T2 = CoxWL; + } else - { - T1 = sqrt (T0 * T0 + T3); - T2 = CoxWL * T0 / T1; - } + { T1 = sqrt(T0 * T0 + T3); + T2 = CoxWL * T0 / T1; + } Qsub0 = CoxWL * pParam->BSIM3k1ox * (T1 - T0); - dQsub0_dVg = - T2 * (dVgs_eff_dVg - dVfbeff_dVg - dVgsteff_dVg); - + dQsub0_dVg = T2 * (dVgs_eff_dVg - dVfbeff_dVg - dVgsteff_dVg); /* Added revision dependent code */ - switch (model->BSIM3intVersion) - { + switch (model->BSIM3intVersion) { case BSIM3V324: case BSIM3V323: case BSIM3V322: - dQsub0_dVd = -T2 * dVgsteff_dVd; break; - case BSIM3V32: default: dQsub0_dVd = -T2 * (dVfbeff_dVd + dVgsteff_dVd); - } - - dQsub0_dVb = - -T2 * (dVfbeff_dVb + dVbseffCV_dVb + dVgsteff_dVb); + } + dQsub0_dVb = -T2 * (dVfbeff_dVb + dVbseffCV_dVb + + dVgsteff_dVb); - AbulkCV = Abulk0 * pParam->BSIM3abulkCVfactor; - dAbulkCV_dVb = pParam->BSIM3abulkCVfactor * dAbulk0_dVb; - VdsatCV = Vgsteff / AbulkCV; + AbulkCV = Abulk0 * pParam->BSIM3abulkCVfactor; + dAbulkCV_dVb = pParam->BSIM3abulkCVfactor * dAbulk0_dVb; + VdsatCV = Vgsteff / AbulkCV; V4 = VdsatCV - Vds - DELTA_4; - T0 = sqrt (V4 * V4 + 4.0 * DELTA_4 * VdsatCV); + T0 = sqrt(V4 * V4 + 4.0 * DELTA_4 * VdsatCV); VdseffCV = VdsatCV - 0.5 * (V4 + T0); T1 = 0.5 * (1.0 + V4 / T0); T2 = DELTA_4 / T0; @@ -2291,10 +1971,8 @@ BSIM3load (GENmodel * inModel, CKTcircuit * ckt) dVdseffCV_dVg = T3; dVdseffCV_dVd = T1; dVdseffCV_dVb = -T3 * VdsatCV * dAbulkCV_dVb; - /* Added revision dependent code */ - switch (model->BSIM3intVersion) - { + switch (model->BSIM3intVersion) { case BSIM3V324: case BSIM3V323: case BSIM3V322: @@ -2306,338 +1984,291 @@ BSIM3load (GENmodel * inModel, CKTcircuit * ckt) dVdseffCV_dVb = 0.0; } break; - case BSIM3V32: default: /* Do nothing */ - } + break; + } - T0 = AbulkCV * VdseffCV; - T1 = 12.0 * (Vgsteff - 0.5 * T0 + 1e-20); + T0 = AbulkCV * VdseffCV; + T1 = 12.0 * (Vgsteff - 0.5 * T0 + 1e-20); T2 = VdseffCV / T1; T3 = T0 * T2; - T4 = (1.0 - 12.0 * T2 * T2 * AbulkCV); - T5 = (6.0 * T0 * (4.0 * Vgsteff - T0) / (T1 * T1) - 0.5); - T6 = 12.0 * T2 * T2 * Vgsteff; + T4 = (1.0 - 12.0 * T2 * T2 * AbulkCV); + T5 = (6.0 * T0 * (4.0 * Vgsteff - T0) / (T1 * T1) - 0.5); + T6 = 12.0 * T2 * T2 * Vgsteff; - qinoi = -CoxWL * (Vgsteff - 0.5 * T0 + AbulkCV * T3); - qgate = CoxWL * (Vgsteff - 0.5 * VdseffCV + T3); - Cgg1 = CoxWL * (T4 + T5 * dVdseffCV_dVg); - Cgd1 = CoxWL * T5 * dVdseffCV_dVd + Cgg1 * dVgsteff_dVd; - Cgb1 = CoxWL * (T5 * dVdseffCV_dVb + - T6 * dAbulkCV_dVb) + Cgg1 * dVgsteff_dVb; + qinoi = -CoxWL * (Vgsteff - 0.5 * T0 + AbulkCV * T3); + qgate = CoxWL * (Vgsteff - 0.5 * VdseffCV + T3); + Cgg1 = CoxWL * (T4 + T5 * dVdseffCV_dVg); + Cgd1 = CoxWL * T5 * dVdseffCV_dVd + Cgg1 * dVgsteff_dVd; + Cgb1 = CoxWL * (T5 * dVdseffCV_dVb + T6 * dAbulkCV_dVb) + + Cgg1 * dVgsteff_dVb; Cgg1 *= dVgsteff_dVg; T7 = 1.0 - AbulkCV; - qbulk = CoxWL * T7 * (0.5 * VdseffCV - T3); + qbulk = CoxWL * T7 * (0.5 * VdseffCV - T3); T4 = -T7 * (T4 - 1.0); T5 = -T7 * T5; T6 = -(T7 * T6 + (0.5 * VdseffCV - T3)); - Cbg1 = CoxWL * (T4 + T5 * dVdseffCV_dVg); - Cbd1 = CoxWL * T5 * dVdseffCV_dVd + Cbg1 * dVgsteff_dVd; - Cbb1 = CoxWL * (T5 * dVdseffCV_dVb + - T6 * dAbulkCV_dVb) + Cbg1 * dVgsteff_dVb; + Cbg1 = CoxWL * (T4 + T5 * dVdseffCV_dVg); + Cbd1 = CoxWL * T5 * dVdseffCV_dVd + Cbg1 * dVgsteff_dVd; + Cbb1 = CoxWL * (T5 * dVdseffCV_dVb + T6 * dAbulkCV_dVb) + + Cbg1 * dVgsteff_dVb; Cbg1 *= dVgsteff_dVg; - if (model->BSIM3xpart > 0.5) - { /* 0/100 Charge petition model */ + if (model->BSIM3xpart > 0.5) + { /* 0/100 Charge petition model */ T1 = T1 + T1; - qsrc = -CoxWL * (0.5 * - Vgsteff + 0.25 * T0 - T0 * T0 / T1); + qsrc = -CoxWL * (0.5 * Vgsteff + 0.25 * T0 + - T0 * T0 / T1); T7 = (4.0 * Vgsteff - T0) / (T1 * T1); T4 = -(0.5 + 24.0 * T0 * T0 / (T1 * T1)); T5 = -(0.25 * AbulkCV - 12.0 * AbulkCV * T0 * T7); - T6 = -(0.25 * VdseffCV - 12.0 * T0 * VdseffCV * T7); - Csg = CoxWL * (T4 + T5 * dVdseffCV_dVg); - Csd = CoxWL * T5 * dVdseffCV_dVd + Csg * dVgsteff_dVd; - Csb = CoxWL * (T5 * - dVdseffCV_dVb + - T6 * dAbulkCV_dVb) + Csg * dVgsteff_dVb; + T6 = -(0.25 * VdseffCV - 12.0 * T0 * VdseffCV * T7); + Csg = CoxWL * (T4 + T5 * dVdseffCV_dVg); + Csd = CoxWL * T5 * dVdseffCV_dVd + Csg * dVgsteff_dVd; + Csb = CoxWL * (T5 * dVdseffCV_dVb + T6 * dAbulkCV_dVb) + + Csg * dVgsteff_dVb; Csg *= dVgsteff_dVg; - } + } else if (model->BSIM3xpart < 0.5) - { /* 40/60 Charge petition model */ + { /* 40/60 Charge petition model */ T1 = T1 / 12.0; T2 = 0.5 * CoxWL / (T1 * T1); - T3 = Vgsteff * (2.0 * T0 * - T0 / 3.0 + - Vgsteff * - (Vgsteff - - 4.0 * T0 / - 3.0)) - 2.0 * T0 * T0 * T0 / 15.0; + T3 = Vgsteff * (2.0 * T0 * T0 / 3.0 + Vgsteff + * (Vgsteff - 4.0 * T0 / 3.0)) + - 2.0 * T0 * T0 * T0 / 15.0; qsrc = -T2 * T3; - T7 = 4.0 / 3.0 * Vgsteff * - (Vgsteff - T0) + 0.4 * T0 * T0; - T4 = -2.0 * qsrc / T1 - - T2 * (Vgsteff * - (3.0 * Vgsteff - - 8.0 * T0 / 3.0) + 2.0 * T0 * T0 / 3.0); + T7 = 4.0 / 3.0 * Vgsteff * (Vgsteff - T0) + + 0.4 * T0 * T0; + T4 = -2.0 * qsrc / T1 - T2 * (Vgsteff * (3.0 + * Vgsteff - 8.0 * T0 / 3.0) + + 2.0 * T0 * T0 / 3.0); T5 = (qsrc / T1 + T2 * T7) * AbulkCV; T6 = (qsrc / T1 * VdseffCV + T2 * T7 * VdseffCV); - Csg = (T4 + T5 * dVdseffCV_dVg); - Csd = T5 * dVdseffCV_dVd + Csg * dVgsteff_dVd; - Csb = (T5 * dVdseffCV_dVb + - T6 * dAbulkCV_dVb) + Csg * dVgsteff_dVb; + Csg = (T4 + T5 * dVdseffCV_dVg); + Csd = T5 * dVdseffCV_dVd + Csg * dVgsteff_dVd; + Csb = (T5 * dVdseffCV_dVb + T6 * dAbulkCV_dVb) + + Csg * dVgsteff_dVb; Csg *= dVgsteff_dVg; - } + } else - { /* 50/50 Charge petition model */ - qsrc = -0.5 * (qgate + qbulk); - Csg = -0.5 * (Cgg1 + Cbg1); - Csb = -0.5 * (Cgb1 + Cbb1); - Csd = -0.5 * (Cgd1 + Cbd1); - } + { /* 50/50 Charge petition model */ + qsrc = -0.5 * (qgate + qbulk); + Csg = -0.5 * (Cgg1 + Cbg1); + Csb = -0.5 * (Cgb1 + Cbb1); + Csd = -0.5 * (Cgd1 + Cbd1); + } qgate += Qac0 + Qsub0; qbulk -= (Qac0 + Qsub0); - qdrn = -(qgate + qbulk + qsrc); + qdrn = -(qgate + qbulk + qsrc); Cgg = dQac0_dVg + dQsub0_dVg + Cgg1; - /* Added revision dependent code */ - switch (model->BSIM3intVersion) - { + switch (model->BSIM3intVersion) { case BSIM3V324: case BSIM3V323: case BSIM3V322: Cgd = dQsub0_dVd + Cgd1; break; - case BSIM3V32: default: Cgd = dQac0_dVd + dQsub0_dVd + Cgd1; - } - + } Cgb = dQac0_dVb + dQsub0_dVb + Cgb1; Cbg = Cbg1 - dQac0_dVg - dQsub0_dVg; - /* Added revision dependent code */ - switch (model->BSIM3intVersion) - { + switch (model->BSIM3intVersion) { case BSIM3V324: case BSIM3V323: case BSIM3V322: Cbd = Cbd1 - dQsub0_dVd; break; - case BSIM3V32: default: Cbd = Cbd1 - dQac0_dVd - dQsub0_dVd; - } - + } Cbb = Cbb1 - dQac0_dVb - dQsub0_dVb; Cgb *= dVbseff_dVb; Cbb *= dVbseff_dVb; Csb *= dVbseff_dVb; - here->BSIM3cggb = Cgg; - here->BSIM3cgsb = -(Cgg + Cgd + Cgb); - here->BSIM3cgdb = Cgd; - here->BSIM3cdgb = -(Cgg + Cbg + Csg); - here->BSIM3cdsb = - (Cgg + Cgd + Cgb + Cbg + Cbd + Cbb + Csg + Csd + Csb); - here->BSIM3cddb = -(Cgd + Cbd + Csd); - here->BSIM3cbgb = Cbg; - here->BSIM3cbsb = -(Cbg + Cbd + Cbb); - here->BSIM3cbdb = Cbd; - here->BSIM3qinv = qinoi; - } - - /* New Charge-Thickness capMod (CTM) begins */ + here->BSIM3cggb = Cgg; + here->BSIM3cgsb = -(Cgg + Cgd + Cgb); + here->BSIM3cgdb = Cgd; + here->BSIM3cdgb = -(Cgg + Cbg + Csg); + here->BSIM3cdsb = (Cgg + Cgd + Cgb + Cbg + Cbd + Cbb + + Csg + Csd + Csb); + here->BSIM3cddb = -(Cgd + Cbd + Csd); + here->BSIM3cbgb = Cbg; + here->BSIM3cbsb = -(Cbg + Cbd + Cbb); + here->BSIM3cbdb = Cbd; + here->BSIM3qinv = qinoi; + } + + /* New Charge-Thickness capMod (CTM) begins */ else if (model->BSIM3capMod == 3) - { - V3 = pParam->BSIM3vfbzb - Vgs_eff + VbseffCV - DELTA_3; + { V3 = pParam->BSIM3vfbzb - Vgs_eff + VbseffCV - DELTA_3; if (pParam->BSIM3vfbzb <= 0.0) - { - T0 = sqrt (V3 * V3 - - 4.0 * DELTA_3 * pParam->BSIM3vfbzb); + { T0 = sqrt(V3 * V3 - 4.0 * DELTA_3 * pParam->BSIM3vfbzb); T2 = -DELTA_3 / T0; - } + } else - { - T0 = sqrt (V3 * V3 + - 4.0 * DELTA_3 * pParam->BSIM3vfbzb); + { T0 = sqrt(V3 * V3 + 4.0 * DELTA_3 * pParam->BSIM3vfbzb); T2 = DELTA_3 / T0; - } + } T1 = 0.5 * (1.0 + V3 / T0); Vfbeff = pParam->BSIM3vfbzb - 0.5 * (V3 + T0); dVfbeff_dVg = T1 * dVgs_eff_dVg; - dVfbeff_dVb = -T1 * dVbseffCV_dVb; - - Cox = model->BSIM3cox; - Tox = 1.0e8 * model->BSIM3tox; - T0 = (Vgs_eff - VbseffCV - pParam->BSIM3vfbzb) / Tox; - dT0_dVg = dVgs_eff_dVg / Tox; - dT0_dVb = -dVbseffCV_dVb / Tox; - - tmp = T0 * pParam->BSIM3acde; - if ((-EXP_THRESHOLD < tmp) && (tmp < EXP_THRESHOLD)) - { - Tcen = pParam->BSIM3ldeb * exp (tmp); - dTcen_dVg = pParam->BSIM3acde * Tcen; - dTcen_dVb = dTcen_dVg * dT0_dVb; - dTcen_dVg *= dT0_dVg; - } - else if (tmp <= -EXP_THRESHOLD) - { - Tcen = pParam->BSIM3ldeb * MIN_EXP; - dTcen_dVg = dTcen_dVb = 0.0; - } - else - { - Tcen = pParam->BSIM3ldeb * MAX_EXP; - dTcen_dVg = dTcen_dVb = 0.0; - } - - LINK = 1.0e-3 * model->BSIM3tox; - V3 = pParam->BSIM3ldeb - Tcen - LINK; - V4 = sqrt (V3 * V3 + 4.0 * LINK * pParam->BSIM3ldeb); - Tcen = pParam->BSIM3ldeb - 0.5 * (V3 + V4); - T1 = 0.5 * (1.0 + V3 / V4); - dTcen_dVg *= T1; - dTcen_dVb *= T1; - - Ccen = EPSSI / Tcen; - T2 = Cox / (Cox + Ccen); - Coxeff = T2 * Ccen; - T3 = -Ccen / Tcen; - dCoxeff_dVg = T2 * T2 * T3; - dCoxeff_dVb = dCoxeff_dVg * dTcen_dVb; - dCoxeff_dVg *= dTcen_dVg; - CoxWLcen = CoxWL * Coxeff / Cox; - - Qac0 = CoxWLcen * (Vfbeff - pParam->BSIM3vfbzb); - QovCox = Qac0 / Coxeff; - dQac0_dVg = CoxWLcen * dVfbeff_dVg + QovCox * dCoxeff_dVg; - dQac0_dVb = CoxWLcen * dVfbeff_dVb + QovCox * dCoxeff_dVb; - - T0 = 0.5 * pParam->BSIM3k1ox; - T3 = Vgs_eff - Vfbeff - VbseffCV - Vgsteff; - if (pParam->BSIM3k1ox == 0.0) - { - T1 = 0.0; - T2 = 0.0; - } - else if (T3 < 0.0) - { - T1 = T0 + T3 / pParam->BSIM3k1ox; - T2 = CoxWLcen; - } - else - { - T1 = sqrt (T0 * T0 + T3); - T2 = CoxWLcen * T0 / T1; - } + dVfbeff_dVb = -T1 * dVbseffCV_dVb; - Qsub0 = CoxWLcen * pParam->BSIM3k1ox * (T1 - T0); - QovCox = Qsub0 / Coxeff; - dQsub0_dVg = - T2 * (dVgs_eff_dVg - - dVfbeff_dVg - dVgsteff_dVg) + QovCox * dCoxeff_dVg; - dQsub0_dVd = -T2 * dVgsteff_dVd; - dQsub0_dVb = - -T2 * (dVfbeff_dVb + - dVbseffCV_dVb + - dVgsteff_dVb) + QovCox * dCoxeff_dVb; + Cox = model->BSIM3cox; + Tox = 1.0e8 * model->BSIM3tox; + T0 = (Vgs_eff - VbseffCV - pParam->BSIM3vfbzb) / Tox; + dT0_dVg = dVgs_eff_dVg / Tox; + dT0_dVb = -dVbseffCV_dVb / Tox; + + tmp = T0 * pParam->BSIM3acde; + if ((-EXP_THRESHOLD < tmp) && (tmp < EXP_THRESHOLD)) + { Tcen = pParam->BSIM3ldeb * exp(tmp); + dTcen_dVg = pParam->BSIM3acde * Tcen; + dTcen_dVb = dTcen_dVg * dT0_dVb; + dTcen_dVg *= dT0_dVg; + } + else if (tmp <= -EXP_THRESHOLD) + { Tcen = pParam->BSIM3ldeb * MIN_EXP; + dTcen_dVg = dTcen_dVb = 0.0; + } + else + { Tcen = pParam->BSIM3ldeb * MAX_EXP; + dTcen_dVg = dTcen_dVb = 0.0; + } + + LINK = 1.0e-3 * model->BSIM3tox; + V3 = pParam->BSIM3ldeb - Tcen - LINK; + V4 = sqrt(V3 * V3 + 4.0 * LINK * pParam->BSIM3ldeb); + Tcen = pParam->BSIM3ldeb - 0.5 * (V3 + V4); + T1 = 0.5 * (1.0 + V3 / V4); + dTcen_dVg *= T1; + dTcen_dVb *= T1; + + Ccen = EPSSI / Tcen; + T2 = Cox / (Cox + Ccen); + Coxeff = T2 * Ccen; + T3 = -Ccen / Tcen; + dCoxeff_dVg = T2 * T2 * T3; + dCoxeff_dVb = dCoxeff_dVg * dTcen_dVb; + dCoxeff_dVg *= dTcen_dVg; + CoxWLcen = CoxWL * Coxeff / Cox; + + Qac0 = CoxWLcen * (Vfbeff - pParam->BSIM3vfbzb); + QovCox = Qac0 / Coxeff; + dQac0_dVg = CoxWLcen * dVfbeff_dVg + + QovCox * dCoxeff_dVg; + dQac0_dVb = CoxWLcen * dVfbeff_dVb + + QovCox * dCoxeff_dVb; + + T0 = 0.5 * pParam->BSIM3k1ox; + T3 = Vgs_eff - Vfbeff - VbseffCV - Vgsteff; + if (pParam->BSIM3k1ox == 0.0) + { T1 = 0.0; + T2 = 0.0; + } + else if (T3 < 0.0) + { T1 = T0 + T3 / pParam->BSIM3k1ox; + T2 = CoxWLcen; + } + else + { T1 = sqrt(T0 * T0 + T3); + T2 = CoxWLcen * T0 / T1; + } + + Qsub0 = CoxWLcen * pParam->BSIM3k1ox * (T1 - T0); + QovCox = Qsub0 / Coxeff; + dQsub0_dVg = T2 * (dVgs_eff_dVg - dVfbeff_dVg - dVgsteff_dVg) + + QovCox * dCoxeff_dVg; + dQsub0_dVd = -T2 * dVgsteff_dVd; + dQsub0_dVb = -T2 * (dVfbeff_dVb + dVbseffCV_dVb + dVgsteff_dVb) + + QovCox * dCoxeff_dVb; /* Gate-bias dependent delta Phis begins */ if (pParam->BSIM3k1ox <= 0.0) - { - Denomi = 0.25 * pParam->BSIM3moin * Vtm; - T0 = 0.5 * pParam->BSIM3sqrtPhi; - } + { Denomi = 0.25 * pParam->BSIM3moin * Vtm; + T0 = 0.5 * pParam->BSIM3sqrtPhi; + } else - { - Denomi = pParam->BSIM3moin * - Vtm * pParam->BSIM3k1ox * pParam->BSIM3k1ox; - T0 = pParam->BSIM3k1ox * pParam->BSIM3sqrtPhi; - } - T1 = 2.0 * T0 + Vgsteff; - - DeltaPhi = Vtm * log (1.0 + T1 * Vgsteff / Denomi); - dDeltaPhi_dVg = - 2.0 * Vtm * (T1 - T0) / (Denomi + T1 * Vgsteff); + { Denomi = pParam->BSIM3moin * Vtm + * pParam->BSIM3k1ox * pParam->BSIM3k1ox; + T0 = pParam->BSIM3k1ox * pParam->BSIM3sqrtPhi; + } + T1 = 2.0 * T0 + Vgsteff; + + DeltaPhi = Vtm * log(1.0 + T1 * Vgsteff / Denomi); + dDeltaPhi_dVg = 2.0 * Vtm * (T1 -T0) / (Denomi + T1 * Vgsteff); dDeltaPhi_dVd = dDeltaPhi_dVg * dVgsteff_dVd; dDeltaPhi_dVb = dDeltaPhi_dVg * dVgsteff_dVb; /* End of delta Phis */ - T3 = 4.0 * (Vth - pParam->BSIM3vfbzb - pParam->BSIM3phi); - Tox += Tox; - if (T3 >= 0.0) - { - + T3 = 4.0 * (Vth - pParam->BSIM3vfbzb - pParam->BSIM3phi); + Tox += Tox; + if (T3 >= 0.0) + { /* Added revision dependent code */ - switch (model->BSIM3intVersion) - { + switch (model->BSIM3intVersion) { case BSIM3V324: case BSIM3V323: case BSIM3V322: - T0 = (Vgsteff + T3) / Tox; dT0_dVd = (dVgsteff_dVd + 4.0 * dVth_dVd) / Tox; dT0_dVb = (dVgsteff_dVb + 4.0 * dVth_dVb) / Tox; break; - case BSIM3V32: default: - T0 = (Vgsteff + T3) / Tox; - - } - - } - else - { - + } + } + else + { /* Added revision dependent code */ - switch (model->BSIM3intVersion) - { + switch (model->BSIM3intVersion) { case BSIM3V324: case BSIM3V323: case BSIM3V322: - T0 = (Vgsteff + 1.0e-20) / Tox; dT0_dVd = dVgsteff_dVd / Tox; dT0_dVb = dVgsteff_dVb / Tox; break; - case BSIM3V32: default: T0 = (Vgsteff + 1.0e-20) / Tox; - } - } - - tmp = exp (0.7 * log (T0)); - T1 = 1.0 + tmp; - T2 = 0.7 * tmp / (T0 * Tox); - Tcen = 1.9e-9 / T1; - dTcen_dVg = -1.9e-9 * T2 / T1 / T1; - + } + } + tmp = exp(0.7 * log(T0)); + T1 = 1.0 + tmp; + T2 = 0.7 * tmp / (T0 * Tox); + Tcen = 1.9e-9 / T1; + dTcen_dVg = -1.9e-9 * T2 / T1 /T1; /* Added revision dependent code */ - switch (model->BSIM3intVersion) - { + switch (model->BSIM3intVersion) { case BSIM3V324: case BSIM3V323: case BSIM3V322: - dTcen_dVd = Tox * dTcen_dVg; dTcen_dVb = dTcen_dVd * dT0_dVb; dTcen_dVd *= dT0_dVd; break; - case BSIM3V32: default: - dTcen_dVd = dTcen_dVg * (4.0 * dVth_dVd + dVgsteff_dVd); dTcen_dVb = dTcen_dVg * (4.0 * dVth_dVb + dVgsteff_dVb); - - } - - dTcen_dVg *= dVgsteff_dVg; + } + dTcen_dVg *= dVgsteff_dVg; Ccen = EPSSI / Tcen; T0 = Cox / (Cox + Ccen); @@ -2653,19 +2284,17 @@ BSIM3load (GENmodel * inModel, CKTcircuit * ckt) dAbulkCV_dVb = pParam->BSIM3abulkCVfactor * dAbulk0_dVb; VdsatCV = (Vgsteff - DeltaPhi) / AbulkCV; V4 = VdsatCV - Vds - DELTA_4; - T0 = sqrt (V4 * V4 + 4.0 * DELTA_4 * VdsatCV); + T0 = sqrt(V4 * V4 + 4.0 * DELTA_4 * VdsatCV); VdseffCV = VdsatCV - 0.5 * (V4 + T0); T1 = 0.5 * (1.0 + V4 / T0); T2 = DELTA_4 / T0; T3 = (1.0 - T1 - T2) / AbulkCV; - T4 = T3 * (1.0 - dDeltaPhi_dVg); + T4 = T3 * ( 1.0 - dDeltaPhi_dVg); dVdseffCV_dVg = T4; dVdseffCV_dVd = T1; dVdseffCV_dVb = -T3 * VdsatCV * dAbulkCV_dVb; - /* Added revision dependent code */ - switch (model->BSIM3intVersion) - { + switch (model->BSIM3intVersion) { case BSIM3V324: case BSIM3V323: case BSIM3V322: @@ -2680,506 +2309,403 @@ BSIM3load (GENmodel * inModel, CKTcircuit * ckt) case BSIM3V32: default: /* Do nothing */ - } + break; + } - T0 = AbulkCV * VdseffCV; + T0 = AbulkCV * VdseffCV; T1 = Vgsteff - DeltaPhi; - T2 = 12.0 * (T1 - 0.5 * T0 + 1.0e-20); - T3 = T0 / T2; - T4 = 1.0 - 12.0 * T3 * T3; - T5 = AbulkCV * (6.0 * T0 * - (4.0 * T1 - T0) / (T2 * T2) - 0.5); + T2 = 12.0 * (T1 - 0.5 * T0 + 1.0e-20); + T3 = T0 / T2; + T4 = 1.0 - 12.0 * T3 * T3; + T5 = AbulkCV * (6.0 * T0 * (4.0 * T1 - T0) / (T2 * T2) - 0.5); T6 = T5 * VdseffCV / AbulkCV; - qgate = qinoi = CoxWLcen * (T1 - T0 * (0.5 - T3)); + qgate = qinoi = CoxWLcen * (T1 - T0 * (0.5 - T3)); QovCox = qgate / Coxeff; - Cgg1 = CoxWLcen * (T4 * - (1.0 - - dDeltaPhi_dVg) + T5 * dVdseffCV_dVg); - Cgd1 = CoxWLcen * T5 * dVdseffCV_dVd + - Cgg1 * dVgsteff_dVd + QovCox * dCoxeff_dVd; - Cgb1 = CoxWLcen * (T5 * - dVdseffCV_dVb + - T6 * - dAbulkCV_dVb) + - Cgg1 * dVgsteff_dVb + QovCox * dCoxeff_dVb; + Cgg1 = CoxWLcen * (T4 * (1.0 - dDeltaPhi_dVg) + + T5 * dVdseffCV_dVg); + Cgd1 = CoxWLcen * T5 * dVdseffCV_dVd + Cgg1 + * dVgsteff_dVd + QovCox * dCoxeff_dVd; + Cgb1 = CoxWLcen * (T5 * dVdseffCV_dVb + T6 * dAbulkCV_dVb) + + Cgg1 * dVgsteff_dVb + QovCox * dCoxeff_dVb; Cgg1 = Cgg1 * dVgsteff_dVg + QovCox * dCoxeff_dVg; - T7 = 1.0 - AbulkCV; - T8 = T2 * T2; - T9 = 12.0 * T7 * T0 * T0 / (T8 * AbulkCV); - T10 = T9 * (1.0 - dDeltaPhi_dVg); - T11 = -T7 * T5 / AbulkCV; - T12 = -(T9 * T1 / AbulkCV + VdseffCV * (0.5 - T0 / T2)); - - qbulk = CoxWLcen * T7 * (0.5 * - VdseffCV - T0 * VdseffCV / T2); + T7 = 1.0 - AbulkCV; + T8 = T2 * T2; + T9 = 12.0 * T7 * T0 * T0 / (T8 * AbulkCV); + T10 = T9 * (1.0 - dDeltaPhi_dVg); + T11 = -T7 * T5 / AbulkCV; + T12 = -(T9 * T1 / AbulkCV + VdseffCV * (0.5 - T0 / T2)); + + qbulk = CoxWLcen * T7 * (0.5 * VdseffCV - T0 * VdseffCV / T2); QovCox = qbulk / Coxeff; Cbg1 = CoxWLcen * (T10 + T11 * dVdseffCV_dVg); - Cbd1 = CoxWLcen * T11 * - dVdseffCV_dVd + - Cbg1 * dVgsteff_dVd + QovCox * dCoxeff_dVd; - Cbb1 = CoxWLcen * (T11 * - dVdseffCV_dVb + - T12 * - dAbulkCV_dVb) + - Cbg1 * dVgsteff_dVb + QovCox * dCoxeff_dVb; + Cbd1 = CoxWLcen * T11 * dVdseffCV_dVd + Cbg1 + * dVgsteff_dVd + QovCox * dCoxeff_dVd; + Cbb1 = CoxWLcen * (T11 * dVdseffCV_dVb + T12 * dAbulkCV_dVb) + + Cbg1 * dVgsteff_dVb + QovCox * dCoxeff_dVb; Cbg1 = Cbg1 * dVgsteff_dVg + QovCox * dCoxeff_dVg; - if (model->BSIM3xpart > 0.5) - { /* 0/100 partition */ - qsrc = -CoxWLcen * (T1 / 2.0 + - T0 / 4.0 - 0.5 * T0 * T0 / T2); + if (model->BSIM3xpart > 0.5) + { /* 0/100 partition */ + qsrc = -CoxWLcen * (T1 / 2.0 + T0 / 4.0 + - 0.5 * T0 * T0 / T2); QovCox = qsrc / Coxeff; T2 += T2; T3 = T2 * T2; T7 = -(0.25 - 12.0 * T0 * (4.0 * T1 - T0) / T3); - T4 = -(0.5 + - 24.0 * T0 * T0 / T3) * (1.0 - dDeltaPhi_dVg); + T4 = -(0.5 + 24.0 * T0 * T0 / T3) * (1.0 - dDeltaPhi_dVg); T5 = T7 * AbulkCV; T6 = T7 * VdseffCV; Csg = CoxWLcen * (T4 + T5 * dVdseffCV_dVg); - Csd = CoxWLcen * T5 * - dVdseffCV_dVd + - Csg * dVgsteff_dVd + QovCox * dCoxeff_dVd; - Csb = CoxWLcen * (T5 * - dVdseffCV_dVb - + - T6 * - dAbulkCV_dVb) - + Csg * dVgsteff_dVb + QovCox * dCoxeff_dVb; + Csd = CoxWLcen * T5 * dVdseffCV_dVd + Csg * dVgsteff_dVd + + QovCox * dCoxeff_dVd; + Csb = CoxWLcen * (T5 * dVdseffCV_dVb + T6 * dAbulkCV_dVb) + + Csg * dVgsteff_dVb + QovCox * dCoxeff_dVb; Csg = Csg * dVgsteff_dVg + QovCox * dCoxeff_dVg; - } + } else if (model->BSIM3xpart < 0.5) - { /* 40/60 partition */ + { /* 40/60 partition */ T2 = T2 / 12.0; T3 = 0.5 * CoxWLcen / (T2 * T2); - T4 = T1 * (2.0 * T0 * T0 / - 3.0 + T1 * (T1 - - 4.0 * - T0 / - 3.0)) - - 2.0 * T0 * T0 * T0 / 15.0; + T4 = T1 * (2.0 * T0 * T0 / 3.0 + T1 * (T1 - 4.0 + * T0 / 3.0)) - 2.0 * T0 * T0 * T0 / 15.0; qsrc = -T3 * T4; QovCox = qsrc / Coxeff; T8 = 4.0 / 3.0 * T1 * (T1 - T0) + 0.4 * T0 * T0; - T5 = -2.0 * qsrc / T2 - - T3 * (T1 * - (3.0 * T1 - - 8.0 * T0 / 3.0) + 2.0 * T0 * T0 / 3.0); + T5 = -2.0 * qsrc / T2 - T3 * (T1 * (3.0 * T1 - 8.0 + * T0 / 3.0) + 2.0 * T0 * T0 / 3.0); T6 = AbulkCV * (qsrc / T2 + T3 * T8); - T7 = T6 * VdseffCV / AbulkCV; - - Csg = T5 * (1.0 - dDeltaPhi_dVg) + T6 * dVdseffCV_dVg; - Csd = Csg * dVgsteff_dVd + - T6 * dVdseffCV_dVd + QovCox * dCoxeff_dVd; - Csb = Csg * dVgsteff_dVb + - T6 * dVdseffCV_dVb + - T7 * dAbulkCV_dVb + QovCox * dCoxeff_dVb; + T7 = T6 * VdseffCV / AbulkCV; + + Csg = T5 * (1.0 - dDeltaPhi_dVg) + T6 * dVdseffCV_dVg; + Csd = Csg * dVgsteff_dVd + T6 * dVdseffCV_dVd + + QovCox * dCoxeff_dVd; + Csb = Csg * dVgsteff_dVb + T6 * dVdseffCV_dVb + + T7 * dAbulkCV_dVb + QovCox * dCoxeff_dVb; Csg = Csg * dVgsteff_dVg + QovCox * dCoxeff_dVg; - } + } else - { /* 50/50 partition */ - qsrc = -0.5 * qgate; - Csg = -0.5 * Cgg1; - Csd = -0.5 * Cgd1; - Csb = -0.5 * Cgb1; - } + { /* 50/50 partition */ + qsrc = -0.5 * qgate; + Csg = -0.5 * Cgg1; + Csd = -0.5 * Cgd1; + Csb = -0.5 * Cgb1; + } qgate += Qac0 + Qsub0 - qbulk; qbulk -= (Qac0 + Qsub0); - qdrn = -(qgate + qbulk + qsrc); + qdrn = -(qgate + qbulk + qsrc); Cbg = Cbg1 - dQac0_dVg - dQsub0_dVg; Cbd = Cbd1 - dQsub0_dVd; Cbb = Cbb1 - dQac0_dVb - dQsub0_dVb; - Cgg = Cgg1 - Cbg; - Cgd = Cgd1 - Cbd; - Cgb = Cgb1 - Cbb; + Cgg = Cgg1 - Cbg; + Cgd = Cgd1 - Cbd; + Cgb = Cgb1 - Cbb; Cgb *= dVbseff_dVb; Cbb *= dVbseff_dVb; Csb *= dVbseff_dVb; - here->BSIM3cggb = Cgg; - here->BSIM3cgsb = -(Cgg + Cgd + Cgb); - here->BSIM3cgdb = Cgd; - here->BSIM3cdgb = -(Cgg + Cbg + Csg); - here->BSIM3cdsb = - (Cgg + Cgd + Cgb + Cbg + Cbd + Cbb + Csg + Csd + Csb); - here->BSIM3cddb = -(Cgd + Cbd + Csd); - here->BSIM3cbgb = Cbg; - here->BSIM3cbsb = -(Cbg + Cbd + Cbb); - here->BSIM3cbdb = Cbd; - here->BSIM3qinv = -qinoi; - } /* End of CTM */ - } - - finished: + here->BSIM3cggb = Cgg; + here->BSIM3cgsb = -(Cgg + Cgd + Cgb); + here->BSIM3cgdb = Cgd; + here->BSIM3cdgb = -(Cgg + Cbg + Csg); + here->BSIM3cdsb = (Cgg + Cgd + Cgb + Cbg + Cbd + Cbb + + Csg + Csd + Csb); + here->BSIM3cddb = -(Cgd + Cbd + Csd); + here->BSIM3cbgb = Cbg; + here->BSIM3cbsb = -(Cbg + Cbd + Cbb); + here->BSIM3cbdb = Cbd; + here->BSIM3qinv = -qinoi; + } /* End of CTM */ + } + +finished: /* Returning Values to Calling Routine */ - /* - * COMPUTE EQUIVALENT DRAIN CURRENT SOURCE - */ - - here->BSIM3qgate = qgate; - here->BSIM3qbulk = qbulk; - here->BSIM3qdrn = qdrn; - here->BSIM3cd = cdrain; - - if (ChargeComputationNeeded) - { /* 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 - */ + /* + * COMPUTE EQUIVALENT DRAIN CURRENT SOURCE + */ + + here->BSIM3qgate = qgate; + here->BSIM3qbulk = qbulk; + here->BSIM3qdrn = qdrn; + here->BSIM3cd = cdrain; + + if (ChargeComputationNeeded) + { /* 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 + */ /* Added revision dependent code */ - switch (model->BSIM3intVersion) - { + switch (model->BSIM3intVersion) { case BSIM3V324: case BSIM3V323: - czbd = model->BSIM3unitAreaTempJctCap * here->BSIM3drainArea; /*bug fix */ - czbs = model-> - BSIM3unitAreaTempJctCap * here->BSIM3sourceArea; + czbs = model->BSIM3unitAreaTempJctCap * here->BSIM3sourceArea; break; - case BSIM3V322: case BSIM3V32: default: - czbd = model->BSIM3unitAreaJctCap * here->BSIM3drainArea; czbs = model->BSIM3unitAreaJctCap * here->BSIM3sourceArea; + } - } - - if (here->BSIM3drainPerimeter < pParam->BSIM3weff) - { - + if (here->BSIM3drainPerimeter < pParam->BSIM3weff) + { /* Added revision dependent code */ - switch (model->BSIM3intVersion) - { + switch (model->BSIM3intVersion) { case BSIM3V324: case BSIM3V323: - - czbdswg = - model-> - BSIM3unitLengthGateSidewallTempJctCap + czbdswg = model->BSIM3unitLengthGateSidewallTempJctCap * here->BSIM3drainPerimeter; break; case BSIM3V322: case BSIM3V32: default: - - czbdswg = - model-> - BSIM3unitLengthGateSidewallJctCap + czbdswg = model->BSIM3unitLengthGateSidewallJctCap * here->BSIM3drainPerimeter; - } - - czbdsw = 0.0; - } - else - { - - switch (model->BSIM3intVersion) - { - case BSIM3V324: - case BSIM3V323: - - czbdsw = model-> - BSIM3unitLengthSidewallTempJctCap - * (here->BSIM3drainPerimeter - pParam->BSIM3weff); - czbdswg = - model-> - BSIM3unitLengthGateSidewallTempJctCap - * pParam->BSIM3weff; - break; - - case BSIM3V322: - case BSIM3V32: - default: - - czbdsw = model-> - BSIM3unitLengthSidewallJctCap - * (here->BSIM3drainPerimeter - pParam->BSIM3weff); - czbdswg = - model-> - BSIM3unitLengthGateSidewallJctCap * pParam->BSIM3weff; - } - - } - if (here->BSIM3sourcePerimeter < pParam->BSIM3weff) - { - czbssw = 0.0; - + } + czbdsw = 0.0; + } + else + { + czbdsw = model->BSIM3unitLengthSidewallTempJctCap + * (here->BSIM3drainPerimeter - pParam->BSIM3weff); + czbdswg = model->BSIM3unitLengthGateSidewallTempJctCap + * pParam->BSIM3weff; + } + if (here->BSIM3sourcePerimeter < pParam->BSIM3weff) + { + czbssw = 0.0; /* Added revision dependent code */ - switch (model->BSIM3intVersion) - { + switch (model->BSIM3intVersion) { case BSIM3V324: case BSIM3V323: - - czbsswg = - model-> - BSIM3unitLengthGateSidewallTempJctCap + czbsswg = model->BSIM3unitLengthGateSidewallTempJctCap * here->BSIM3sourcePerimeter; break; case BSIM3V322: case BSIM3V32: default: - czbsswg = - model-> - BSIM3unitLengthGateSidewallJctCap + czbsswg = model->BSIM3unitLengthGateSidewallJctCap * here->BSIM3sourcePerimeter; - } - - } - else - { - + } + } + else + { /* Added revision dependent code */ - switch (model->BSIM3intVersion) - { + switch (model->BSIM3intVersion) { case BSIM3V324: case BSIM3V323: - - czbssw = model-> - BSIM3unitLengthSidewallTempJctCap + czbssw = model->BSIM3unitLengthSidewallTempJctCap * (here->BSIM3sourcePerimeter - pParam->BSIM3weff); - czbsswg = - model-> - BSIM3unitLengthGateSidewallTempJctCap + czbsswg = model->BSIM3unitLengthGateSidewallTempJctCap * pParam->BSIM3weff; break; - case BSIM3V322: case BSIM3V32: default: - - czbssw = model-> - BSIM3unitLengthSidewallJctCap + czbssw = model->BSIM3unitLengthSidewallJctCap * (here->BSIM3sourcePerimeter - pParam->BSIM3weff); - czbsswg = - model-> - BSIM3unitLengthGateSidewallJctCap * pParam->BSIM3weff; - } - - } + czbsswg = model->BSIM3unitLengthGateSidewallJctCap + * pParam->BSIM3weff; + } + } - MJ = model->BSIM3bulkJctBotGradingCoeff; - MJSW = model->BSIM3bulkJctSideGradingCoeff; + MJ = model->BSIM3bulkJctBotGradingCoeff; + MJSW = model->BSIM3bulkJctSideGradingCoeff; MJSWG = model->BSIM3bulkJctGateSideGradingCoeff; - /* Source Bulk Junction */ + /* Source Bulk Junction */ if (vbs == 0.0) - { - *(ckt->CKTstate0 + here->BSIM3qbs) = 0.0; - here->BSIM3capbs = czbs + czbssw + czbsswg; - } + { *(ckt->CKTstate0 + here->BSIM3qbs) = 0.0; + here->BSIM3capbs = czbs + czbssw + czbsswg; + } else if (vbs < 0.0) - { - if (czbs > 0.0) - { - arg = 1.0 - vbs / model->BSIM3PhiB; + { if (czbs > 0.0) + { arg = 1.0 - vbs / model->BSIM3PhiB; if (MJ == 0.5) - sarg = 1.0 / sqrt (arg); + sarg = 1.0 / sqrt(arg); else - sarg = exp (-MJ * log (arg)); - *(ckt->CKTstate0 + - here->BSIM3qbs) = - model->BSIM3PhiB * czbs * (1.0 - - arg * sarg) / (1.0 - MJ); + sarg = exp(-MJ * log(arg)); + *(ckt->CKTstate0 + here->BSIM3qbs) = model->BSIM3PhiB * czbs + * (1.0 - arg * sarg) / (1.0 - MJ); here->BSIM3capbs = czbs * sarg; - } + } else - { - *(ckt->CKTstate0 + here->BSIM3qbs) = 0.0; + { *(ckt->CKTstate0 + here->BSIM3qbs) = 0.0; here->BSIM3capbs = 0.0; - } + } if (czbssw > 0.0) - { - arg = 1.0 - vbs / model->BSIM3PhiBSW; + { arg = 1.0 - vbs / model->BSIM3PhiBSW; if (MJSW == 0.5) - sarg = 1.0 / sqrt (arg); + sarg = 1.0 / sqrt(arg); else - sarg = exp (-MJSW * log (arg)); - *(ckt->CKTstate0 + - here->BSIM3qbs) += - model->BSIM3PhiBSW * czbssw * (1.0 - - arg * - sarg) / (1.0 - MJSW); - here->BSIM3capbs += czbssw * sarg; - } + sarg = exp(-MJSW * log(arg)); + *(ckt->CKTstate0 + here->BSIM3qbs) += model->BSIM3PhiBSW * czbssw + * (1.0 - arg * sarg) / (1.0 - MJSW); + here->BSIM3capbs += czbssw * sarg; + } if (czbsswg > 0.0) - { - arg = 1.0 - vbs / model->BSIM3PhiBSWG; + { arg = 1.0 - vbs / model->BSIM3PhiBSWG; if (MJSWG == 0.5) - sarg = 1.0 / sqrt (arg); + sarg = 1.0 / sqrt(arg); else - sarg = exp (-MJSWG * log (arg)); - *(ckt->CKTstate0 + - here->BSIM3qbs) += - model->BSIM3PhiBSWG * czbsswg * (1.0 - - arg * - sarg) - / (1.0 - MJSWG); - here->BSIM3capbs += czbsswg * sarg; - } + sarg = exp(-MJSWG * log(arg)); + *(ckt->CKTstate0 + here->BSIM3qbs) += model->BSIM3PhiBSWG * czbsswg + * (1.0 - arg * sarg) / (1.0 - MJSWG); + here->BSIM3capbs += czbsswg * sarg; + } - } + } else - { - T0 = czbs + czbssw + czbsswg; - T1 = vbs * (czbs * MJ / - model->BSIM3PhiB + - czbssw * MJSW / - model->BSIM3PhiBSW + - czbsswg * MJSWG / model->BSIM3PhiBSWG); - *(ckt->CKTstate0 + here->BSIM3qbs) = vbs * (T0 + 0.5 * T1); - here->BSIM3capbs = T0 + T1; - } - - /* Drain Bulk Junction */ + { T0 = czbs + czbssw + czbsswg; + T1 = vbs * (czbs * MJ / model->BSIM3PhiB + czbssw * MJSW + / model->BSIM3PhiBSW + czbsswg * MJSWG / model->BSIM3PhiBSWG); + *(ckt->CKTstate0 + here->BSIM3qbs) = vbs * (T0 + 0.5 * T1); + here->BSIM3capbs = T0 + T1; + } + + /* Drain Bulk Junction */ if (vbd == 0.0) - { - *(ckt->CKTstate0 + here->BSIM3qbd) = 0.0; - here->BSIM3capbd = czbd + czbdsw + czbdswg; - } + { *(ckt->CKTstate0 + here->BSIM3qbd) = 0.0; + here->BSIM3capbd = czbd + czbdsw + czbdswg; + } else if (vbd < 0.0) - { - if (czbd > 0.0) - { - arg = 1.0 - vbd / model->BSIM3PhiB; + { if (czbd > 0.0) + { arg = 1.0 - vbd / model->BSIM3PhiB; if (MJ == 0.5) - sarg = 1.0 / sqrt (arg); + sarg = 1.0 / sqrt(arg); else - sarg = exp (-MJ * log (arg)); - *(ckt->CKTstate0 + - here->BSIM3qbd) = - model->BSIM3PhiB * czbd * (1.0 - - arg * sarg) / (1.0 - MJ); - here->BSIM3capbd = czbd * sarg; - } + sarg = exp(-MJ * log(arg)); + *(ckt->CKTstate0 + here->BSIM3qbd) = model->BSIM3PhiB * czbd + * (1.0 - arg * sarg) / (1.0 - MJ); + here->BSIM3capbd = czbd * sarg; + } else - { - *(ckt->CKTstate0 + here->BSIM3qbd) = 0.0; - here->BSIM3capbd = 0.0; - } + { *(ckt->CKTstate0 + here->BSIM3qbd) = 0.0; + here->BSIM3capbd = 0.0; + } if (czbdsw > 0.0) - { - arg = 1.0 - vbd / model->BSIM3PhiBSW; + { arg = 1.0 - vbd / model->BSIM3PhiBSW; if (MJSW == 0.5) - sarg = 1.0 / sqrt (arg); + sarg = 1.0 / sqrt(arg); else - sarg = exp (-MJSW * log (arg)); - *(ckt->CKTstate0 + - here->BSIM3qbd) += - model->BSIM3PhiBSW * czbdsw * (1.0 - - arg * - sarg) / (1.0 - MJSW); - here->BSIM3capbd += czbdsw * sarg; - } + sarg = exp(-MJSW * log(arg)); + *(ckt->CKTstate0 + here->BSIM3qbd) += model->BSIM3PhiBSW * czbdsw + * (1.0 - arg * sarg) / (1.0 - MJSW); + here->BSIM3capbd += czbdsw * sarg; + } if (czbdswg > 0.0) - { - arg = 1.0 - vbd / model->BSIM3PhiBSWG; + { arg = 1.0 - vbd / model->BSIM3PhiBSWG; if (MJSWG == 0.5) - sarg = 1.0 / sqrt (arg); + sarg = 1.0 / sqrt(arg); else - sarg = exp (-MJSWG * log (arg)); - *(ckt->CKTstate0 + - here->BSIM3qbd) += - model->BSIM3PhiBSWG * czbdswg * (1.0 - - arg * - sarg) - / (1.0 - MJSWG); - here->BSIM3capbd += czbdswg * sarg; - } - } + sarg = exp(-MJSWG * log(arg)); + *(ckt->CKTstate0 + here->BSIM3qbd) += model->BSIM3PhiBSWG * czbdswg + * (1.0 - arg * sarg) / (1.0 - MJSWG); + here->BSIM3capbd += czbdswg * sarg; + } + } else - { - T0 = czbd + czbdsw + czbdswg; - T1 = vbd * (czbd * MJ / - model->BSIM3PhiB + - czbdsw * MJSW / - model->BSIM3PhiBSW + - czbdswg * MJSWG / model->BSIM3PhiBSWG); - *(ckt->CKTstate0 + here->BSIM3qbd) = vbd * (T0 + 0.5 * T1); - here->BSIM3capbd = T0 + T1; - } - } - - /* - * check convergence - */ - if ((here->BSIM3off == 0) || (!(ckt->CKTmode & MODEINITFIX))) - { - if (Check == 1) - { - ckt->CKTnoncon++; - } - } - *(ckt->CKTstate0 + here->BSIM3vbs) = vbs; - *(ckt->CKTstate0 + here->BSIM3vbd) = vbd; - *(ckt->CKTstate0 + here->BSIM3vgs) = vgs; - *(ckt->CKTstate0 + here->BSIM3vds) = vds; - *(ckt->CKTstate0 + here->BSIM3qdef) = qdef; - - /* bulk and channel charge plus overlaps */ - - if (!ChargeComputationNeeded) - goto line850; - - line755: - /* NQS begins */ - if (here->BSIM3nqsMod) - { - qcheq = -(qbulk + qgate); - - here->BSIM3cqgb = -(here->BSIM3cggb + here->BSIM3cbgb); - here->BSIM3cqdb = -(here->BSIM3cgdb + here->BSIM3cbdb); - here->BSIM3cqsb = -(here->BSIM3cgsb + here->BSIM3cbsb); - here->BSIM3cqbb = - -(here->BSIM3cqgb + here->BSIM3cqdb + here->BSIM3cqsb); - - gtau_drift = fabs (pParam->BSIM3tconst * qcheq) * ScalingFactor; - T0 = pParam->BSIM3leffCV * pParam->BSIM3leffCV; - gtau_diff = - 16.0 * pParam->BSIM3u0temp * - model->BSIM3vtm / T0 * ScalingFactor; - here->BSIM3gtau = gtau_drift + gtau_diff; - } + { T0 = czbd + czbdsw + czbdswg; + T1 = vbd * (czbd * MJ / model->BSIM3PhiB + czbdsw * MJSW + / model->BSIM3PhiBSW + czbdswg * MJSWG / model->BSIM3PhiBSWG); + *(ckt->CKTstate0 + here->BSIM3qbd) = vbd * (T0 + 0.5 * T1); + here->BSIM3capbd = T0 + T1; + } + } + + /* + * check convergence + */ + if ((here->BSIM3off == 0) || (!(ckt->CKTmode & MODEINITFIX))) + { if (Check == 1) + { ckt->CKTnoncon++; +//#ifndef NEWCONV +// } +// else +// { if (here->BSIM3mode >= 0) +// { Idtot = here->BSIM3cd + here->BSIM3csub - here->BSIM3cbd; +// } +// else +// { Idtot = here->BSIM3cd - here->BSIM3cbd; +// } +// tol = ckt->CKTreltol * MAX(fabs(cdhat), fabs(Idtot)) +// + ckt->CKTabstol; +// if (fabs(cdhat - Idtot) >= tol) +// { ckt->CKTnoncon++; +// } +// else +// { Ibtot = here->BSIM3cbs + here->BSIM3cbd - here->BSIM3csub; +// tol = ckt->CKTreltol * MAX(fabs(cbhat), fabs(Ibtot)) +// + ckt->CKTabstol; +// if (fabs(cbhat - Ibtot) > tol) +// { ckt->CKTnoncon++; +// } +// } +//#endif /* NEWCONV */ + } + } + *(ckt->CKTstate0 + here->BSIM3vbs) = vbs; + *(ckt->CKTstate0 + here->BSIM3vbd) = vbd; + *(ckt->CKTstate0 + here->BSIM3vgs) = vgs; + *(ckt->CKTstate0 + here->BSIM3vds) = vds; + *(ckt->CKTstate0 + here->BSIM3qdef) = qdef; + + /* bulk and channel charge plus overlaps */ + + if (!ChargeComputationNeeded) + goto line850; + +line755: + /* NQS begins */ + if (here->BSIM3nqsMod) + { qcheq = -(qbulk + qgate); + + here->BSIM3cqgb = -(here->BSIM3cggb + here->BSIM3cbgb); + here->BSIM3cqdb = -(here->BSIM3cgdb + here->BSIM3cbdb); + here->BSIM3cqsb = -(here->BSIM3cgsb + here->BSIM3cbsb); + here->BSIM3cqbb = -(here->BSIM3cqgb + here->BSIM3cqdb + + here->BSIM3cqsb); + + gtau_drift = fabs(pParam->BSIM3tconst * qcheq) * ScalingFactor; + T0 = pParam->BSIM3leffCV * pParam->BSIM3leffCV; + gtau_diff = 16.0 * pParam->BSIM3u0temp * model->BSIM3vtm / T0 + * ScalingFactor; + here->BSIM3gtau = gtau_drift + gtau_diff; + } if (model->BSIM3capMod == 0) - { - + { /* Added revision dependent code */ - switch (model->BSIM3intVersion) - { + switch (model->BSIM3intVersion) { case BSIM3V324: case BSIM3V323: - /* code merge -JX */ cgdo = pParam->BSIM3cgdo; qgdo = pParam->BSIM3cgdo * vgd; cgso = pParam->BSIM3cgso; qgso = pParam->BSIM3cgso * vgs; break; - case BSIM3V322: case BSIM3V32: default: - if (vgd < 0.0) { cgdo = pParam->BSIM3cgdo; @@ -3201,564 +2727,503 @@ BSIM3load (GENmodel * inModel, CKTcircuit * ckt) cgso = pParam->BSIM3cgso; qgso = pParam->BSIM3cgso * vgs; } - } - - } + } + } else if (model->BSIM3capMod == 1) - { - if (vgd < 0.0) - { - T1 = sqrt (1.0 - 4.0 * vgd / pParam->BSIM3ckappa); - cgdo = pParam->BSIM3cgdo + - pParam->BSIM3weffCV * pParam->BSIM3cgdl / T1; - qgdo = pParam->BSIM3cgdo * vgd - - pParam->BSIM3weffCV * 0.5 * - pParam->BSIM3cgdl * pParam->BSIM3ckappa * (T1 - 1.0); - } + { if (vgd < 0.0) + { T1 = sqrt(1.0 - 4.0 * vgd / pParam->BSIM3ckappa); + cgdo = pParam->BSIM3cgdo + pParam->BSIM3weffCV + * pParam->BSIM3cgdl / T1; + qgdo = pParam->BSIM3cgdo * vgd - pParam->BSIM3weffCV * 0.5 + * pParam->BSIM3cgdl * pParam->BSIM3ckappa * (T1 - 1.0); + } else - { - cgdo = pParam->BSIM3cgdo + - pParam->BSIM3weffCV * pParam->BSIM3cgdl; - qgdo = (pParam->BSIM3weffCV * - pParam->BSIM3cgdl + pParam->BSIM3cgdo) * vgd; - } + { cgdo = pParam->BSIM3cgdo + pParam->BSIM3weffCV + * pParam->BSIM3cgdl; + qgdo = (pParam->BSIM3weffCV * pParam->BSIM3cgdl + + pParam->BSIM3cgdo) * vgd; + } if (vgs < 0.0) - { - T1 = sqrt (1.0 - 4.0 * vgs / pParam->BSIM3ckappa); - cgso = pParam->BSIM3cgso + - pParam->BSIM3weffCV * pParam->BSIM3cgsl / T1; - qgso = pParam->BSIM3cgso * vgs - - pParam->BSIM3weffCV * 0.5 * - pParam->BSIM3cgsl * pParam->BSIM3ckappa * (T1 - 1.0); - } + { T1 = sqrt(1.0 - 4.0 * vgs / pParam->BSIM3ckappa); + cgso = pParam->BSIM3cgso + pParam->BSIM3weffCV + * pParam->BSIM3cgsl / T1; + qgso = pParam->BSIM3cgso * vgs - pParam->BSIM3weffCV * 0.5 + * pParam->BSIM3cgsl * pParam->BSIM3ckappa * (T1 - 1.0); + } else - { - cgso = pParam->BSIM3cgso + - pParam->BSIM3weffCV * pParam->BSIM3cgsl; - qgso = (pParam->BSIM3weffCV * - pParam->BSIM3cgsl + pParam->BSIM3cgso) * vgs; - } - } + { cgso = pParam->BSIM3cgso + pParam->BSIM3weffCV + * pParam->BSIM3cgsl; + qgso = (pParam->BSIM3weffCV * pParam->BSIM3cgsl + + pParam->BSIM3cgso) * vgs; + } + } else - { - T0 = vgd + DELTA_1; - T1 = sqrt (T0 * T0 + 4.0 * DELTA_1); + { T0 = vgd + DELTA_1; + T1 = sqrt(T0 * T0 + 4.0 * DELTA_1); T2 = 0.5 * (T0 - T1); T3 = pParam->BSIM3weffCV * pParam->BSIM3cgdl; - T4 = sqrt (1.0 - 4.0 * T2 / pParam->BSIM3ckappa); - cgdo = pParam->BSIM3cgdo + T3 - T3 * (1.0 - - 1.0 / - T4) * - (0.5 - 0.5 * T0 / T1); - qgdo = (pParam->BSIM3cgdo + T3) * vgd - - T3 * (T2 + 0.5 * pParam->BSIM3ckappa * (T4 - 1.0)); + T4 = sqrt(1.0 - 4.0 * T2 / pParam->BSIM3ckappa); + cgdo = pParam->BSIM3cgdo + T3 - T3 * (1.0 - 1.0 / T4) + * (0.5 - 0.5 * T0 / T1); + qgdo = (pParam->BSIM3cgdo + T3) * vgd - T3 * (T2 + + 0.5 * pParam->BSIM3ckappa * (T4 - 1.0)); T0 = vgs + DELTA_1; - T1 = sqrt (T0 * T0 + 4.0 * DELTA_1); + T1 = sqrt(T0 * T0 + 4.0 * DELTA_1); T2 = 0.5 * (T0 - T1); T3 = pParam->BSIM3weffCV * pParam->BSIM3cgsl; - T4 = sqrt (1.0 - 4.0 * T2 / pParam->BSIM3ckappa); - cgso = pParam->BSIM3cgso + T3 - T3 * (1.0 - - 1.0 / - T4) * - (0.5 - 0.5 * T0 / T1); - qgso = (pParam->BSIM3cgso + T3) * vgs - - T3 * (T2 + 0.5 * pParam->BSIM3ckappa * (T4 - 1.0)); - } - - here->BSIM3cgdo = cgdo; - here->BSIM3cgso = cgso; - - ag0 = ckt->CKTag[0]; - if (here->BSIM3mode > 0) - { - if (here->BSIM3nqsMod == 0) - { - gcggb = (here->BSIM3cggb + cgdo + cgso - + pParam->BSIM3cgbo) * ag0; - gcgdb = (here->BSIM3cgdb - cgdo) * ag0; - gcgsb = (here->BSIM3cgsb - cgso) * ag0; - - gcdgb = (here->BSIM3cdgb - cgdo) * ag0; - gcddb = (here->BSIM3cddb + here->BSIM3capbd + cgdo) * ag0; - gcdsb = here->BSIM3cdsb * ag0; - - gcsgb = -(here->BSIM3cggb + - here->BSIM3cbgb + here->BSIM3cdgb + cgso) * ag0; - gcsdb = -(here->BSIM3cgdb + - here->BSIM3cbdb + here->BSIM3cddb) * ag0; - gcssb = (here->BSIM3capbs + cgso - - (here->BSIM3cgsb + - here->BSIM3cbsb + here->BSIM3cdsb)) * ag0; - - gcbgb = (here->BSIM3cbgb - pParam->BSIM3cgbo) * ag0; - gcbdb = (here->BSIM3cbdb - here->BSIM3capbd) * ag0; - gcbsb = (here->BSIM3cbsb - here->BSIM3capbs) * ag0; - - qgd = qgdo; - qgs = qgso; - qgb = pParam->BSIM3cgbo * vgb; - qgate += qgd + qgs + qgb; - qbulk -= qgb; - qdrn -= qgd; - qsrc = -(qgate + qbulk + qdrn); - - ggtg = ggtd = ggtb = ggts = 0.0; + T4 = sqrt(1.0 - 4.0 * T2 / pParam->BSIM3ckappa); + cgso = pParam->BSIM3cgso + T3 - T3 * (1.0 - 1.0 / T4) + * (0.5 - 0.5 * T0 / T1); + qgso = (pParam->BSIM3cgso + T3) * vgs - T3 * (T2 + + 0.5 * pParam->BSIM3ckappa * (T4 - 1.0)); + } + + here->BSIM3cgdo = cgdo; + here->BSIM3cgso = cgso; + + ag0 = ckt->CKTag[0]; + if (here->BSIM3mode > 0) + { if (here->BSIM3nqsMod == 0) + { gcggb = (here->BSIM3cggb + cgdo + cgso + + pParam->BSIM3cgbo ) * ag0; + gcgdb = (here->BSIM3cgdb - cgdo) * ag0; + gcgsb = (here->BSIM3cgsb - cgso) * ag0; + + gcdgb = (here->BSIM3cdgb - cgdo) * ag0; + gcddb = (here->BSIM3cddb + here->BSIM3capbd + cgdo) * ag0; + gcdsb = here->BSIM3cdsb * ag0; + + gcsgb = -(here->BSIM3cggb + here->BSIM3cbgb + + here->BSIM3cdgb + cgso) * ag0; + gcsdb = -(here->BSIM3cgdb + here->BSIM3cbdb + + here->BSIM3cddb) * ag0; + gcssb = (here->BSIM3capbs + cgso - (here->BSIM3cgsb + + here->BSIM3cbsb + here->BSIM3cdsb)) * ag0; + + gcbgb = (here->BSIM3cbgb - pParam->BSIM3cgbo) * ag0; + gcbdb = (here->BSIM3cbdb - here->BSIM3capbd) * ag0; + gcbsb = (here->BSIM3cbsb - here->BSIM3capbs) * ag0; + + qgd = qgdo; + qgs = qgso; + qgb = pParam->BSIM3cgbo * vgb; + qgate += qgd + qgs + qgb; + qbulk -= qgb; + qdrn -= qgd; + qsrc = -(qgate + qbulk + qdrn); + + ggtg = ggtd = ggtb = ggts = 0.0; sxpart = 0.6; - dxpart = 0.4; + dxpart = 0.4; ddxpart_dVd = ddxpart_dVg = ddxpart_dVb = ddxpart_dVs = 0.0; dsxpart_dVd = dsxpart_dVg = dsxpart_dVb = dsxpart_dVs = 0.0; - } - else - { - if (qcheq > 0.0) - T0 = pParam->BSIM3tconst * qdef * ScalingFactor; - else - T0 = -pParam->BSIM3tconst * qdef * ScalingFactor; - ggtg = here->BSIM3gtg = T0 * here->BSIM3cqgb; - ggtd = here->BSIM3gtd = T0 * here->BSIM3cqdb; - ggts = here->BSIM3gts = T0 * here->BSIM3cqsb; - ggtb = here->BSIM3gtb = T0 * here->BSIM3cqbb; + } + else + { if (qcheq > 0.0) + T0 = pParam->BSIM3tconst * qdef * ScalingFactor; + else + T0 = -pParam->BSIM3tconst * qdef * ScalingFactor; + ggtg = here->BSIM3gtg = T0 * here->BSIM3cqgb; + ggtd = here->BSIM3gtd = T0 * here->BSIM3cqdb; + ggts = here->BSIM3gts = T0 * here->BSIM3cqsb; + ggtb = here->BSIM3gtb = T0 * here->BSIM3cqbb; gqdef = ScalingFactor * ag0; - gcqgb = here->BSIM3cqgb * ag0; - gcqdb = here->BSIM3cqdb * ag0; - gcqsb = here->BSIM3cqsb * ag0; - gcqbb = here->BSIM3cqbb * ag0; - - gcggb = (cgdo + cgso + pParam->BSIM3cgbo) * ag0; - gcgdb = -cgdo * ag0; - gcgsb = -cgso * ag0; - - gcdgb = -cgdo * ag0; - gcddb = (here->BSIM3capbd + cgdo) * ag0; - gcdsb = 0.0; - - gcsgb = -cgso * ag0; - gcsdb = 0.0; - gcssb = (here->BSIM3capbs + cgso) * ag0; - - gcbgb = -pParam->BSIM3cgbo * ag0; - gcbdb = -here->BSIM3capbd * ag0; - gcbsb = -here->BSIM3capbs * ag0; - - CoxWL = model->BSIM3cox * - pParam->BSIM3weffCV * pParam->BSIM3leffCV; - if (fabs (qcheq) <= 1.0e-5 * CoxWL) - { - if (model->BSIM3xpart < 0.5) - { - dxpart = 0.4; - } + gcqgb = here->BSIM3cqgb * ag0; + gcqdb = here->BSIM3cqdb * ag0; + gcqsb = here->BSIM3cqsb * ag0; + gcqbb = here->BSIM3cqbb * ag0; + + gcggb = (cgdo + cgso + pParam->BSIM3cgbo ) * ag0; + gcgdb = -cgdo * ag0; + gcgsb = -cgso * ag0; + + gcdgb = -cgdo * ag0; + gcddb = (here->BSIM3capbd + cgdo) * ag0; + gcdsb = 0.0; + + gcsgb = -cgso * ag0; + gcsdb = 0.0; + gcssb = (here->BSIM3capbs + cgso) * ag0; + + gcbgb = -pParam->BSIM3cgbo * ag0; + gcbdb = -here->BSIM3capbd * ag0; + gcbsb = -here->BSIM3capbs * ag0; + + CoxWL = model->BSIM3cox * pParam->BSIM3weffCV + * pParam->BSIM3leffCV; + if (fabs(qcheq) <= 1.0e-5 * CoxWL) + { if (model->BSIM3xpart < 0.5) + { dxpart = 0.4; + } else if (model->BSIM3xpart > 0.5) - { - dxpart = 0.0; - } + { dxpart = 0.0; + } else - { - dxpart = 0.5; - } - ddxpart_dVd = ddxpart_dVg = - ddxpart_dVb = ddxpart_dVs = 0.0; - } + { dxpart = 0.5; + } + ddxpart_dVd = ddxpart_dVg = ddxpart_dVb + = ddxpart_dVs = 0.0; + } else - { - dxpart = qdrn / qcheq; + { dxpart = qdrn / qcheq; Cdd = here->BSIM3cddb; - Csd = -(here->BSIM3cgdb + - here->BSIM3cddb + here->BSIM3cbdb); + Csd = -(here->BSIM3cgdb + here->BSIM3cddb + + here->BSIM3cbdb); ddxpart_dVd = (Cdd - dxpart * (Cdd + Csd)) / qcheq; Cdg = here->BSIM3cdgb; - Csg = -(here->BSIM3cggb + - here->BSIM3cdgb + here->BSIM3cbgb); + Csg = -(here->BSIM3cggb + here->BSIM3cdgb + + here->BSIM3cbgb); ddxpart_dVg = (Cdg - dxpart * (Cdg + Csg)) / qcheq; Cds = here->BSIM3cdsb; - Css = -(here->BSIM3cgsb + - here->BSIM3cdsb + here->BSIM3cbsb); + Css = -(here->BSIM3cgsb + here->BSIM3cdsb + + here->BSIM3cbsb); ddxpart_dVs = (Cds - dxpart * (Cds + Css)) / qcheq; - ddxpart_dVb = - -(ddxpart_dVd + ddxpart_dVg + ddxpart_dVs); - } + ddxpart_dVb = -(ddxpart_dVd + ddxpart_dVg + ddxpart_dVs); + } sxpart = 1.0 - dxpart; dsxpart_dVd = -ddxpart_dVd; dsxpart_dVg = -ddxpart_dVg; dsxpart_dVs = -ddxpart_dVs; dsxpart_dVb = -(dsxpart_dVd + dsxpart_dVg + dsxpart_dVs); - qgd = qgdo; - qgs = qgso; - qgb = pParam->BSIM3cgbo * vgb; - qgate = qgd + qgs + qgb; - qbulk = -qgb; - qdrn = -qgd; - qsrc = -(qgate + qbulk + qdrn); - } - } - else - { - if (here->BSIM3nqsMod == 0) - { - gcggb = (here->BSIM3cggb + cgdo + cgso - + pParam->BSIM3cgbo) * ag0; - gcgdb = (here->BSIM3cgsb - cgdo) * ag0; - gcgsb = (here->BSIM3cgdb - cgso) * ag0; - - gcdgb = -(here->BSIM3cggb + - here->BSIM3cbgb + here->BSIM3cdgb + cgdo) * ag0; - gcddb = (here->BSIM3capbd + cgdo - - (here->BSIM3cgsb + - here->BSIM3cbsb + here->BSIM3cdsb)) * ag0; - gcdsb = -(here->BSIM3cgdb + - here->BSIM3cbdb + here->BSIM3cddb) * ag0; - - gcsgb = (here->BSIM3cdgb - cgso) * ag0; - gcsdb = here->BSIM3cdsb * ag0; - gcssb = (here->BSIM3cddb + here->BSIM3capbs + cgso) * ag0; - - gcbgb = (here->BSIM3cbgb - pParam->BSIM3cgbo) * ag0; - gcbdb = (here->BSIM3cbsb - here->BSIM3capbd) * ag0; - gcbsb = (here->BSIM3cbdb - here->BSIM3capbs) * ag0; - - qgd = qgdo; - qgs = qgso; - qgb = pParam->BSIM3cgbo * vgb; - qgate += qgd + qgs + qgb; - qbulk -= qgb; - qsrc = qdrn - qgs; - qdrn = -(qgate + qbulk + qsrc); - - ggtg = ggtd = ggtb = ggts = 0.0; + qgd = qgdo; + qgs = qgso; + qgb = pParam->BSIM3cgbo * vgb; + qgate = qgd + qgs + qgb; + qbulk = -qgb; + qdrn = -qgd; + qsrc = -(qgate + qbulk + qdrn); + } + } + else + { if (here->BSIM3nqsMod == 0) + { gcggb = (here->BSIM3cggb + cgdo + cgso + + pParam->BSIM3cgbo ) * ag0; + gcgdb = (here->BSIM3cgsb - cgdo) * ag0; + gcgsb = (here->BSIM3cgdb - cgso) * ag0; + + gcdgb = -(here->BSIM3cggb + here->BSIM3cbgb + + here->BSIM3cdgb + cgdo) * ag0; + gcddb = (here->BSIM3capbd + cgdo - (here->BSIM3cgsb + + here->BSIM3cbsb + here->BSIM3cdsb)) * ag0; + gcdsb = -(here->BSIM3cgdb + here->BSIM3cbdb + + here->BSIM3cddb) * ag0; + + gcsgb = (here->BSIM3cdgb - cgso) * ag0; + gcsdb = here->BSIM3cdsb * ag0; + gcssb = (here->BSIM3cddb + here->BSIM3capbs + cgso) * ag0; + + gcbgb = (here->BSIM3cbgb - pParam->BSIM3cgbo) * ag0; + gcbdb = (here->BSIM3cbsb - here->BSIM3capbd) * ag0; + gcbsb = (here->BSIM3cbdb - here->BSIM3capbs) * ag0; + + qgd = qgdo; + qgs = qgso; + qgb = pParam->BSIM3cgbo * vgb; + qgate += qgd + qgs + qgb; + qbulk -= qgb; + qsrc = qdrn - qgs; + qdrn = -(qgate + qbulk + qsrc); + + ggtg = ggtd = ggtb = ggts = 0.0; sxpart = 0.4; - dxpart = 0.6; + dxpart = 0.6; ddxpart_dVd = ddxpart_dVg = ddxpart_dVb = ddxpart_dVs = 0.0; dsxpart_dVd = dsxpart_dVg = dsxpart_dVb = dsxpart_dVs = 0.0; - } - else - { - if (qcheq > 0.0) - T0 = pParam->BSIM3tconst * qdef * ScalingFactor; - else - T0 = -pParam->BSIM3tconst * qdef * ScalingFactor; - ggtg = here->BSIM3gtg = T0 * here->BSIM3cqgb; - ggts = here->BSIM3gtd = T0 * here->BSIM3cqdb; - ggtd = here->BSIM3gts = T0 * here->BSIM3cqsb; - ggtb = here->BSIM3gtb = T0 * here->BSIM3cqbb; + } + else + { if (qcheq > 0.0) + T0 = pParam->BSIM3tconst * qdef * ScalingFactor; + else + T0 = -pParam->BSIM3tconst * qdef * ScalingFactor; + ggtg = here->BSIM3gtg = T0 * here->BSIM3cqgb; + ggts = here->BSIM3gtd = T0 * here->BSIM3cqdb; + ggtd = here->BSIM3gts = T0 * here->BSIM3cqsb; + ggtb = here->BSIM3gtb = T0 * here->BSIM3cqbb; gqdef = ScalingFactor * ag0; - gcqgb = here->BSIM3cqgb * ag0; - gcqdb = here->BSIM3cqsb * ag0; - gcqsb = here->BSIM3cqdb * ag0; - gcqbb = here->BSIM3cqbb * ag0; - - gcggb = (cgdo + cgso + pParam->BSIM3cgbo) * ag0; - gcgdb = -cgdo * ag0; - gcgsb = -cgso * ag0; - - gcdgb = -cgdo * ag0; - gcddb = (here->BSIM3capbd + cgdo) * ag0; - gcdsb = 0.0; - - gcsgb = -cgso * ag0; - gcsdb = 0.0; - gcssb = (here->BSIM3capbs + cgso) * ag0; - - gcbgb = -pParam->BSIM3cgbo * ag0; - gcbdb = -here->BSIM3capbd * ag0; - gcbsb = -here->BSIM3capbs * ag0; - - CoxWL = model->BSIM3cox * - pParam->BSIM3weffCV * pParam->BSIM3leffCV; - if (fabs (qcheq) <= 1.0e-5 * CoxWL) - { - if (model->BSIM3xpart < 0.5) - { - sxpart = 0.4; - } + gcqgb = here->BSIM3cqgb * ag0; + gcqdb = here->BSIM3cqsb * ag0; + gcqsb = here->BSIM3cqdb * ag0; + gcqbb = here->BSIM3cqbb * ag0; + + gcggb = (cgdo + cgso + pParam->BSIM3cgbo) * ag0; + gcgdb = -cgdo * ag0; + gcgsb = -cgso * ag0; + + gcdgb = -cgdo * ag0; + gcddb = (here->BSIM3capbd + cgdo) * ag0; + gcdsb = 0.0; + + gcsgb = -cgso * ag0; + gcsdb = 0.0; + gcssb = (here->BSIM3capbs + cgso) * ag0; + + gcbgb = -pParam->BSIM3cgbo * ag0; + gcbdb = -here->BSIM3capbd * ag0; + gcbsb = -here->BSIM3capbs * ag0; + + CoxWL = model->BSIM3cox * pParam->BSIM3weffCV + * pParam->BSIM3leffCV; + if (fabs(qcheq) <= 1.0e-5 * CoxWL) + { if (model->BSIM3xpart < 0.5) + { sxpart = 0.4; + } else if (model->BSIM3xpart > 0.5) - { - sxpart = 0.0; - } + { sxpart = 0.0; + } else - { - sxpart = 0.5; - } - dsxpart_dVd = dsxpart_dVg = - dsxpart_dVb = dsxpart_dVs = 0.0; - } + { sxpart = 0.5; + } + dsxpart_dVd = dsxpart_dVg = dsxpart_dVb + = dsxpart_dVs = 0.0; + } else - { - sxpart = qdrn / qcheq; + { sxpart = qdrn / qcheq; Css = here->BSIM3cddb; - Cds = -(here->BSIM3cgdb + - here->BSIM3cddb + here->BSIM3cbdb); + Cds = -(here->BSIM3cgdb + here->BSIM3cddb + + here->BSIM3cbdb); dsxpart_dVs = (Css - sxpart * (Css + Cds)) / qcheq; Csg = here->BSIM3cdgb; - Cdg = -(here->BSIM3cggb + - here->BSIM3cdgb + here->BSIM3cbgb); + Cdg = -(here->BSIM3cggb + here->BSIM3cdgb + + here->BSIM3cbgb); dsxpart_dVg = (Csg - sxpart * (Csg + Cdg)) / qcheq; Csd = here->BSIM3cdsb; - Cdd = -(here->BSIM3cgsb + - here->BSIM3cdsb + here->BSIM3cbsb); + Cdd = -(here->BSIM3cgsb + here->BSIM3cdsb + + here->BSIM3cbsb); dsxpart_dVd = (Csd - sxpart * (Csd + Cdd)) / qcheq; - dsxpart_dVb = - -(dsxpart_dVd + dsxpart_dVg + dsxpart_dVs); - } + dsxpart_dVb = -(dsxpart_dVd + dsxpart_dVg + dsxpart_dVs); + } dxpart = 1.0 - sxpart; ddxpart_dVd = -dsxpart_dVd; ddxpart_dVg = -dsxpart_dVg; ddxpart_dVs = -dsxpart_dVs; ddxpart_dVb = -(ddxpart_dVd + ddxpart_dVg + ddxpart_dVs); - qgd = qgdo; - qgs = qgso; - qgb = pParam->BSIM3cgbo * vgb; - qgate = qgd + qgs + qgb; - qbulk = -qgb; - qsrc = -qgs; - qdrn = -(qgate + qbulk + qsrc); - } - } + qgd = qgdo; + qgs = qgso; + qgb = pParam->BSIM3cgbo * vgb; + qgate = qgd + qgs + qgb; + qbulk = -qgb; + qsrc = -qgs; + qdrn = -(qgate + qbulk + qsrc); + } + } cqdef = cqcheq = 0.0; - if (ByPass) - goto line860; - - *(ckt->CKTstate0 + here->BSIM3qg) = qgate; - *(ckt->CKTstate0 + here->BSIM3qd) = qdrn - - *(ckt->CKTstate0 + here->BSIM3qbd); - *(ckt->CKTstate0 + here->BSIM3qb) = qbulk - + *(ckt->CKTstate0 + here->BSIM3qbd) - + *(ckt->CKTstate0 + here->BSIM3qbs); - - if (here->BSIM3nqsMod) - { - *(ckt->CKTstate0 + here->BSIM3qcdump) = qdef * ScalingFactor; - *(ckt->CKTstate0 + here->BSIM3qcheq) = qcheq; - } - - /* store small signal parameters */ - if (ckt->CKTmode & MODEINITSMSIG) - { - goto line1000; - } - if (!ChargeComputationNeeded) - goto line850; - - if (ckt->CKTmode & MODEINITTRAN) - { - *(ckt->CKTstate1 + here->BSIM3qb) = - *(ckt->CKTstate0 + here->BSIM3qb); - *(ckt->CKTstate1 + here->BSIM3qg) = - *(ckt->CKTstate0 + here->BSIM3qg); - *(ckt->CKTstate1 + here->BSIM3qd) = - *(ckt->CKTstate0 + here->BSIM3qd); - if (here->BSIM3nqsMod) - { - *(ckt->CKTstate1 + here->BSIM3qcheq) = - *(ckt->CKTstate0 + here->BSIM3qcheq); - *(ckt->CKTstate1 + - here->BSIM3qcdump) = - *(ckt->CKTstate0 + here->BSIM3qcdump); - } - } - - error = NIintegrate (ckt, &geq, &ceq, 0.0, here->BSIM3qb); - if (error) - return (error); - error = NIintegrate (ckt, &geq, &ceq, 0.0, here->BSIM3qg); - if (error) - return (error); - error = NIintegrate (ckt, &geq, &ceq, 0.0, here->BSIM3qd); - if (error) - return (error); - if (here->BSIM3nqsMod) - { - error = NIintegrate (ckt, &geq, &ceq, 0.0, here->BSIM3qcdump); - if (error) - return (error); - error = NIintegrate (ckt, &geq, &ceq, 0.0, here->BSIM3qcheq); - if (error) - return (error); - } - - goto line860; - - line850: - /* initialize to zero charge conductance and current */ - ceqqg = ceqqb = ceqqd = 0.0; - cqcheq = cqdef = 0.0; - - gcdgb = gcddb = gcdsb = 0.0; - gcsgb = gcsdb = gcssb = 0.0; - gcggb = gcgdb = gcgsb = 0.0; - gcbgb = gcbdb = gcbsb = 0.0; + if (ByPass) goto line860; + + *(ckt->CKTstate0 + here->BSIM3qg) = qgate; + *(ckt->CKTstate0 + here->BSIM3qd) = qdrn + - *(ckt->CKTstate0 + here->BSIM3qbd); + *(ckt->CKTstate0 + here->BSIM3qb) = qbulk + + *(ckt->CKTstate0 + here->BSIM3qbd) + + *(ckt->CKTstate0 + here->BSIM3qbs); + + if (here->BSIM3nqsMod) + { *(ckt->CKTstate0 + here->BSIM3qcdump) = qdef * ScalingFactor; + *(ckt->CKTstate0 + here->BSIM3qcheq) = qcheq; + } + + /* store small signal parameters */ + if (ckt->CKTmode & MODEINITSMSIG) + { goto line1000; + } + if (!ChargeComputationNeeded) + goto line850; + + if (ckt->CKTmode & MODEINITTRAN) + { *(ckt->CKTstate1 + here->BSIM3qb) = + *(ckt->CKTstate0 + here->BSIM3qb); + *(ckt->CKTstate1 + here->BSIM3qg) = + *(ckt->CKTstate0 + here->BSIM3qg); + *(ckt->CKTstate1 + here->BSIM3qd) = + *(ckt->CKTstate0 + here->BSIM3qd); + if (here->BSIM3nqsMod) + { *(ckt->CKTstate1 + here->BSIM3qcheq) = + *(ckt->CKTstate0 + here->BSIM3qcheq); + *(ckt->CKTstate1 + here->BSIM3qcdump) = + *(ckt->CKTstate0 + here->BSIM3qcdump); + } + } + + error = NIintegrate(ckt, &geq, &ceq, 0.0, here->BSIM3qb); + if (error) + return(error); + error = NIintegrate(ckt, &geq, &ceq, 0.0, here->BSIM3qg); + if (error) + return(error); + error = NIintegrate(ckt, &geq, &ceq, 0.0, here->BSIM3qd); + if (error) + return(error); + if (here->BSIM3nqsMod) + { error = NIintegrate(ckt, &geq, &ceq, 0.0, here->BSIM3qcdump); + if (error) + return(error); + error = NIintegrate(ckt, &geq, &ceq, 0.0, here->BSIM3qcheq); + if (error) + return(error); + } + + goto line860; + +line850: + /* initialize to zero charge conductance and current */ + ceqqg = ceqqb = ceqqd = 0.0; + cqcheq = cqdef = 0.0; + + gcdgb = gcddb = gcdsb = 0.0; + gcsgb = gcsdb = gcssb = 0.0; + gcggb = gcgdb = gcgsb = 0.0; + gcbgb = gcbdb = gcbsb = 0.0; gqdef = gcqgb = gcqdb = gcqsb = gcqbb = 0.0; - ggtg = ggtd = ggtb = ggts = 0.0; - sxpart = (1.0 - (dxpart = (here->BSIM3mode > 0) ? 0.4 : 0.6)); + ggtg = ggtd = ggtb = ggts = 0.0; + sxpart = (1.0 - (dxpart = (here->BSIM3mode > 0) ? 0.4 : 0.6)); ddxpart_dVd = ddxpart_dVg = ddxpart_dVb = ddxpart_dVs = 0.0; dsxpart_dVd = dsxpart_dVg = dsxpart_dVb = dsxpart_dVs = 0.0; - if (here->BSIM3nqsMod) - here->BSIM3gtau = - 16.0 * pParam->BSIM3u0temp * - model->BSIM3vtm / - pParam->BSIM3leffCV / pParam->BSIM3leffCV * ScalingFactor; + if (here->BSIM3nqsMod) + here->BSIM3gtau = 16.0 * pParam->BSIM3u0temp * model->BSIM3vtm + / pParam->BSIM3leffCV / pParam->BSIM3leffCV + * ScalingFactor; else - here->BSIM3gtau = 0.0; + here->BSIM3gtau = 0.0; - goto line900; + goto line900; + +line860: + /* evaluate equivalent charge current */ - line860: - /* evaluate equivalent charge current */ + cqgate = *(ckt->CKTstate0 + here->BSIM3cqg); + cqbulk = *(ckt->CKTstate0 + here->BSIM3cqb); + cqdrn = *(ckt->CKTstate0 + here->BSIM3cqd); - cqgate = *(ckt->CKTstate0 + here->BSIM3cqg); - cqbulk = *(ckt->CKTstate0 + here->BSIM3cqb); - cqdrn = *(ckt->CKTstate0 + here->BSIM3cqd); + ceqqg = cqgate - gcggb * vgb + gcgdb * vbd + gcgsb * vbs; + ceqqb = cqbulk - gcbgb * vgb + gcbdb * vbd + gcbsb * vbs; + ceqqd = cqdrn - gcdgb * vgb + gcddb * vbd + gcdsb * vbs; - ceqqg = cqgate - gcggb * vgb + gcgdb * vbd + gcgsb * vbs; - ceqqb = cqbulk - gcbgb * vgb + gcbdb * vbd + gcbsb * vbs; - ceqqd = cqdrn - gcdgb * vgb + gcddb * vbd + gcdsb * vbs; - - if (here->BSIM3nqsMod) - { - T0 = ggtg * vgb - ggtd * vbd - ggts * vbs; - ceqqg += T0; + if (here->BSIM3nqsMod) + { T0 = ggtg * vgb - ggtd * vbd - ggts * vbs; + ceqqg += T0; T1 = qdef * here->BSIM3gtau; - ceqqd -= dxpart * T0 + - T1 * (ddxpart_dVg * vgb - - ddxpart_dVd * vbd - ddxpart_dVs * vbs); - cqdef = *(ckt->CKTstate0 + here->BSIM3cqcdump) - gqdef * qdef; - cqcheq = *(ckt->CKTstate0 + - here->BSIM3cqcheq) - (gcqgb * vgb - - gcqdb * vbd - - gcqsb * vbs) + T0; - } - - if (ckt->CKTmode & MODEINITTRAN) - { - *(ckt->CKTstate1 + here->BSIM3cqb) = - *(ckt->CKTstate0 + here->BSIM3cqb); - *(ckt->CKTstate1 + here->BSIM3cqg) = - *(ckt->CKTstate0 + here->BSIM3cqg); - *(ckt->CKTstate1 + here->BSIM3cqd) = - *(ckt->CKTstate0 + here->BSIM3cqd); - - if (here->BSIM3nqsMod) - { - *(ckt->CKTstate1 + - here->BSIM3cqcheq) = - *(ckt->CKTstate0 + here->BSIM3cqcheq); - *(ckt->CKTstate1 + - here->BSIM3cqcdump) = - *(ckt->CKTstate0 + here->BSIM3cqcdump); - } - } - - /* - * load current vector - */ - line900: - - if (here->BSIM3mode >= 0) - { - Gm = here->BSIM3gm; - Gmbs = here->BSIM3gmbs; - FwdSum = Gm + Gmbs; - RevSum = 0.0; - cdreq = model->BSIM3type * (cdrain - - here->BSIM3gds * - vds - Gm * vgs - Gmbs * vbs); - - ceqbd = -model->BSIM3type * (here->BSIM3csub - - - here->BSIM3gbds * - vds - - here->BSIM3gbgs * - vgs - here->BSIM3gbbs * vbs); - ceqbs = 0.0; - - gbbdp = -here->BSIM3gbds; - gbbsp = (here->BSIM3gbds + here->BSIM3gbgs + here->BSIM3gbbs); - - gbdpg = here->BSIM3gbgs; - gbdpdp = here->BSIM3gbds; - gbdpb = here->BSIM3gbbs; - gbdpsp = -(gbdpg + gbdpdp + gbdpb); - - gbspg = 0.0; - gbspdp = 0.0; - gbspb = 0.0; - gbspsp = 0.0; - } + ceqqd -= dxpart * T0 + T1 * (ddxpart_dVg * vgb - ddxpart_dVd + * vbd - ddxpart_dVs * vbs); + cqdef = *(ckt->CKTstate0 + here->BSIM3cqcdump) - gqdef * qdef; + cqcheq = *(ckt->CKTstate0 + here->BSIM3cqcheq) + - (gcqgb * vgb - gcqdb * vbd - gcqsb * vbs) + T0; + } + + if (ckt->CKTmode & MODEINITTRAN) + { *(ckt->CKTstate1 + here->BSIM3cqb) = + *(ckt->CKTstate0 + here->BSIM3cqb); + *(ckt->CKTstate1 + here->BSIM3cqg) = + *(ckt->CKTstate0 + here->BSIM3cqg); + *(ckt->CKTstate1 + here->BSIM3cqd) = + *(ckt->CKTstate0 + here->BSIM3cqd); + + if (here->BSIM3nqsMod) + { *(ckt->CKTstate1 + here->BSIM3cqcheq) = + *(ckt->CKTstate0 + here->BSIM3cqcheq); + *(ckt->CKTstate1 + here->BSIM3cqcdump) = + *(ckt->CKTstate0 + here->BSIM3cqcdump); + } + } + + /* + * load current vector + */ +line900: + + if (here->BSIM3mode >= 0) + { Gm = here->BSIM3gm; + Gmbs = here->BSIM3gmbs; + FwdSum = Gm + Gmbs; + RevSum = 0.0; + cdreq = model->BSIM3type * (cdrain - here->BSIM3gds * vds + - Gm * vgs - Gmbs * vbs); + + ceqbd = -model->BSIM3type * (here->BSIM3csub + - here->BSIM3gbds * vds - here->BSIM3gbgs * vgs + - here->BSIM3gbbs * vbs); + ceqbs = 0.0; + + gbbdp = -here->BSIM3gbds; + gbbsp = (here->BSIM3gbds + here->BSIM3gbgs + here->BSIM3gbbs); + + gbdpg = here->BSIM3gbgs; + gbdpdp = here->BSIM3gbds; + gbdpb = here->BSIM3gbbs; + gbdpsp = -(gbdpg + gbdpdp + gbdpb); + + gbspg = 0.0; + gbspdp = 0.0; + gbspb = 0.0; + gbspsp = 0.0; + } else - { - Gm = -here->BSIM3gm; - Gmbs = -here->BSIM3gmbs; - FwdSum = 0.0; - RevSum = -(Gm + Gmbs); - cdreq = -model->BSIM3type * (cdrain + - here->BSIM3gds * - vds + Gm * vgd + Gmbs * vbd); - - ceqbs = -model->BSIM3type * (here->BSIM3csub - + - here->BSIM3gbds * - vds - - here->BSIM3gbgs * - vgd - here->BSIM3gbbs * vbd); - ceqbd = 0.0; - - gbbsp = -here->BSIM3gbds; - gbbdp = (here->BSIM3gbds + here->BSIM3gbgs + here->BSIM3gbbs); - - gbdpg = 0.0; - gbdpsp = 0.0; - gbdpb = 0.0; - gbdpdp = 0.0; - - gbspg = here->BSIM3gbgs; - gbspsp = here->BSIM3gbds; - gbspb = here->BSIM3gbbs; - gbspdp = -(gbspg + gbspsp + gbspb); - } - - if (model->BSIM3type > 0) - { - ceqbs += (here->BSIM3cbs - here->BSIM3gbs * vbs); - ceqbd += (here->BSIM3cbd - here->BSIM3gbd * vbd); - /* - * ceqqg = ceqqg; - * ceqqb = ceqqb; - * ceqqd = ceqqd; - * cqdef = cqdef; - * cqcheq = cqcheq; + { Gm = -here->BSIM3gm; + Gmbs = -here->BSIM3gmbs; + FwdSum = 0.0; + RevSum = -(Gm + Gmbs); + cdreq = -model->BSIM3type * (cdrain + here->BSIM3gds * vds + + Gm * vgd + Gmbs * vbd); + + ceqbs = -model->BSIM3type * (here->BSIM3csub + + here->BSIM3gbds * vds - here->BSIM3gbgs * vgd + - here->BSIM3gbbs * vbd); + ceqbd = 0.0; + + gbbsp = -here->BSIM3gbds; + gbbdp = (here->BSIM3gbds + here->BSIM3gbgs + here->BSIM3gbbs); + + gbdpg = 0.0; + gbdpsp = 0.0; + gbdpb = 0.0; + gbdpdp = 0.0; + + gbspg = here->BSIM3gbgs; + gbspsp = here->BSIM3gbds; + gbspb = here->BSIM3gbbs; + gbspdp = -(gbspg + gbspsp + gbspb); + } + + if (model->BSIM3type > 0) + { ceqbs += (here->BSIM3cbs - here->BSIM3gbs * vbs); + ceqbd += (here->BSIM3cbd - here->BSIM3gbd * vbd); + /* + ceqqg = ceqqg; + ceqqb = ceqqb; + ceqqd = ceqqd; + cqdef = cqdef; + cqcheq = cqcheq; */ - } - else - { - ceqbs -= (here->BSIM3cbs - here->BSIM3gbs * vbs); - ceqbd -= (here->BSIM3cbd - here->BSIM3gbd * vbd); - ceqqg = -ceqqg; - ceqqb = -ceqqb; - ceqqd = -ceqqd; - cqdef = -cqdef; - cqcheq = -cqcheq; - } + } + else + { ceqbs -= (here->BSIM3cbs - here->BSIM3gbs * vbs); + ceqbd -= (here->BSIM3cbd - here->BSIM3gbd * vbd); + ceqqg = -ceqqg; + ceqqb = -ceqqb; + ceqqd = -ceqqd; + cqdef = -cqdef; + cqcheq = -cqcheq; + } + m = here->BSIM3m; (*(ckt->CKTrhs + here->BSIM3gNode) -= m * ceqqg); (*(ckt->CKTrhs + here->BSIM3bNode) -= m * (ceqbs + ceqbd + ceqqb)); - (*(ckt->CKTrhs + here->BSIM3dNodePrime) += - m * (ceqbd - cdreq - ceqqd)); - (*(ckt->CKTrhs + here->BSIM3sNodePrime) += - m * (cdreq + ceqbs + ceqqg + ceqqb + ceqqd)); + (*(ckt->CKTrhs + here->BSIM3dNodePrime) += m * (ceqbd - cdreq - ceqqd)); + (*(ckt->CKTrhs + here->BSIM3sNodePrime) += m * (cdreq + ceqbs + ceqqg + + ceqqb + ceqqd)); if (here->BSIM3nqsMod) *(ckt->CKTrhs + here->BSIM3qNode) += m * (cqcheq - cqdef); @@ -3770,17 +3235,16 @@ BSIM3load (GENmodel * inModel, CKTcircuit * ckt) (*(here->BSIM3DdPtr) += m * here->BSIM3drainConductance); (*(here->BSIM3GgPtr) += m * (gcggb - ggtg)); (*(here->BSIM3SsPtr) += m * here->BSIM3sourceConductance); - (*(here->BSIM3BbPtr) += - m * (here->BSIM3gbd + here->BSIM3gbs - gcbgb - - gcbdb - gcbsb - here->BSIM3gbbs)); - (*(here->BSIM3DPdpPtr) += - m * (here->BSIM3drainConductance + here->BSIM3gds + - here->BSIM3gbd + RevSum + gcddb + - dxpart * ggtd + T1 * ddxpart_dVd + gbdpdp)); - (*(here->BSIM3SPspPtr) += - m * (here->BSIM3sourceConductance + here->BSIM3gds + - here->BSIM3gbs + FwdSum + gcssb + - sxpart * ggts + T1 * dsxpart_dVs + gbspsp)); + (*(here->BSIM3BbPtr) += m * (here->BSIM3gbd + here->BSIM3gbs + - gcbgb - gcbdb - gcbsb - here->BSIM3gbbs)); + (*(here->BSIM3DPdpPtr) += m * (here->BSIM3drainConductance + + here->BSIM3gds + here->BSIM3gbd + + RevSum + gcddb + dxpart * ggtd + + T1 * ddxpart_dVd + gbdpdp)); + (*(here->BSIM3SPspPtr) += m * (here->BSIM3sourceConductance + + here->BSIM3gds + here->BSIM3gbs + + FwdSum + gcssb + sxpart * ggts + + T1 * dsxpart_dVs + gbspsp)); (*(here->BSIM3DdpPtr) -= m * here->BSIM3drainConductance); (*(here->BSIM3GbPtr) -= m * (gcggb + gcgdb + gcgsb + ggtb)); (*(here->BSIM3GdpPtr) += m * (gcgdb - ggtd)); @@ -3790,23 +3254,21 @@ BSIM3load (GENmodel * inModel, CKTcircuit * ckt) (*(here->BSIM3BdpPtr) += m * (gcbdb - here->BSIM3gbd + gbbdp)); (*(here->BSIM3BspPtr) += m * (gcbsb - here->BSIM3gbs + gbbsp)); (*(here->BSIM3DPdPtr) -= m * here->BSIM3drainConductance); - (*(here->BSIM3DPgPtr) += - m * (Gm + gcdgb + dxpart * ggtg + T1 * ddxpart_dVg + gbdpg)); - (*(here->BSIM3DPbPtr) -= - m * (here->BSIM3gbd - Gmbs + gcdgb + gcddb + gcdsb - - dxpart * ggtb - T1 * ddxpart_dVb - gbdpb)); - (*(here->BSIM3DPspPtr) -= - m * (here->BSIM3gds + FwdSum - gcdsb - - dxpart * ggts - T1 * ddxpart_dVs - gbdpsp)); - (*(here->BSIM3SPgPtr) += - m * (gcsgb - Gm + sxpart * ggtg + T1 * dsxpart_dVg + gbspg)); + (*(here->BSIM3DPgPtr) += m * (Gm + gcdgb + dxpart * ggtg + + T1 * ddxpart_dVg + gbdpg)); + (*(here->BSIM3DPbPtr) -= m * (here->BSIM3gbd - Gmbs + gcdgb + gcddb + + gcdsb - dxpart * ggtb + - T1 * ddxpart_dVb - gbdpb)); + (*(here->BSIM3DPspPtr) -= m * (here->BSIM3gds + FwdSum - gcdsb + - dxpart * ggts - T1 * ddxpart_dVs - gbdpsp)); + (*(here->BSIM3SPgPtr) += m * (gcsgb - Gm + sxpart * ggtg + + T1 * dsxpart_dVg + gbspg)); (*(here->BSIM3SPsPtr) -= m * here->BSIM3sourceConductance); - (*(here->BSIM3SPbPtr) -= - m * (here->BSIM3gbs + Gmbs + gcsgb + gcsdb + gcssb - - sxpart * ggtb - T1 * dsxpart_dVb - gbspb)); - (*(here->BSIM3SPdpPtr) -= - m * (here->BSIM3gds + RevSum - gcsdb - - sxpart * ggtd - T1 * dsxpart_dVd - gbspdp)); + (*(here->BSIM3SPbPtr) -= m * (here->BSIM3gbs + Gmbs + gcsgb + gcsdb + + gcssb - sxpart * ggtb + - T1 * dsxpart_dVb - gbspb)); + (*(here->BSIM3SPdpPtr) -= m * (here->BSIM3gds + RevSum - gcsdb + - sxpart * ggtd - T1 * dsxpart_dVd - gbspdp)); if (here->BSIM3nqsMod) { @@ -3822,11 +3284,11 @@ BSIM3load (GENmodel * inModel, CKTcircuit * ckt) *(here->BSIM3QbPtr) += m * (ggtb - gcqbb); } +line1000: ; - line1000:; + } /* End of Mosfet Instance */ +} /* End of Model Instance */ - } /* End of Mosfet Instance */ - } /* End of Model Instance */ - - return (OK); +return(OK); } + diff --git a/src/spicelib/devices/bsim3/b3mask.c b/src/spicelib/devices/bsim3/b3mask.c index 530d53846..1d0f0c23e 100644 --- a/src/spicelib/devices/bsim3/b3mask.c +++ b/src/spicelib/devices/bsim3/b3mask.c @@ -1,23 +1,14 @@ +/**** BSIM3v3.2.4, Released by Xuemei Xi 12/21/2001 ****/ + /********** * Copyright 2001 Regents of the University of California. All rights reserved. * File: b3mask.c of BSIM3v3.2.4 * Author: 1995 Min-Chie Jeng and Mansun Chan. * Author: 1997-1999 Weidong Liu. * Author: 2001 Xuemei Xi - * Modified by Paolo Nenzi 2002 + * Modified by Paolo Nenzi 2002 and Dietmar Warning 2003 **********/ -/* - * Release Notes: - * BSIM3v3.2.4, Released by Xuemei Xi 12/21/2001 - * BSIM3v3.2.3, Released by Xuemei Xi 10/05/2001 - * BSIM3v3.2.2, Released by Weidong Liu 04/20/1999 - * BSIM3v3.2, Released by Weidong Liu 06/16/1998 - */ - - -/*************************************/ - #include "ngspice.h" #include "ifsim.h" #include "cktdefs.h" @@ -27,1219 +18,1252 @@ #include "suffix.h" int -BSIM3mAsk (CKTcircuit * ckt, GENmodel * inst, int which, IFvalue * value) +BSIM3mAsk (CKTcircuit *ckt, GENmodel *inst, int which, IFvalue *value) { - BSIM3model *model = (BSIM3model *) inst; - switch (which) - { - case BSIM3_MOD_MOBMOD: - value->iValue = model->BSIM3mobMod; - return (OK); - case BSIM3_MOD_PARAMCHK: - value->iValue = model->BSIM3paramChk; - return (OK); - case BSIM3_MOD_BINUNIT: - value->iValue = model->BSIM3binUnit; - return (OK); - case BSIM3_MOD_CAPMOD: - value->iValue = model->BSIM3capMod; - return (OK); - case BSIM3_MOD_NOIMOD: - value->iValue = model->BSIM3noiMod; - return (OK); - case BSIM3_MOD_VERSION: - value->sValue = model->BSIM3version; - return (OK); - case BSIM3_MOD_TOX: - value->rValue = model->BSIM3tox; - return (OK); - case BSIM3_MOD_TOXM: - value->rValue = model->BSIM3toxm; - return (OK); - case BSIM3_MOD_CDSC: - value->rValue = model->BSIM3cdsc; - return (OK); - case BSIM3_MOD_CDSCB: - value->rValue = model->BSIM3cdscb; - return (OK); + BSIM3model *model = (BSIM3model *)inst; + switch(which) + { case BSIM3_MOD_MOBMOD: + value->iValue = model->BSIM3mobMod; + return(OK); + case BSIM3_MOD_PARAMCHK: + value->iValue = model->BSIM3paramChk; + return(OK); + case BSIM3_MOD_BINUNIT: + value->iValue = model->BSIM3binUnit; + return(OK); + case BSIM3_MOD_CAPMOD: + value->iValue = model->BSIM3capMod; + return(OK); + case BSIM3_MOD_NOIMOD: + value->iValue = model->BSIM3noiMod; + return(OK); + case BSIM3_MOD_ACMMOD: + value->iValue = model->BSIM3acmMod; + return(OK); + case BSIM3_MOD_VERSION : + value->sValue = model->BSIM3version; + return(OK); + case BSIM3_MOD_TOX : + value->rValue = model->BSIM3tox; + return(OK); + case BSIM3_MOD_TOXM : + value->rValue = model->BSIM3toxm; + return(OK); + case BSIM3_MOD_CDSC : + value->rValue = model->BSIM3cdsc; + return(OK); + case BSIM3_MOD_CDSCB : + value->rValue = model->BSIM3cdscb; + return(OK); + + case BSIM3_MOD_CDSCD : + value->rValue = model->BSIM3cdscd; + return(OK); + + case BSIM3_MOD_CIT : + value->rValue = model->BSIM3cit; + return(OK); + case BSIM3_MOD_NFACTOR : + value->rValue = model->BSIM3nfactor; + return(OK); + case BSIM3_MOD_XJ: + value->rValue = model->BSIM3xj; + return(OK); + case BSIM3_MOD_VSAT: + value->rValue = model->BSIM3vsat; + return(OK); + case BSIM3_MOD_AT: + value->rValue = model->BSIM3at; + return(OK); + case BSIM3_MOD_A0: + value->rValue = model->BSIM3a0; + return(OK); + + case BSIM3_MOD_AGS: + value->rValue = model->BSIM3ags; + return(OK); - case BSIM3_MOD_CDSCD: - value->rValue = model->BSIM3cdscd; - return (OK); + case BSIM3_MOD_A1: + value->rValue = model->BSIM3a1; + return(OK); + case BSIM3_MOD_A2: + value->rValue = model->BSIM3a2; + return(OK); + case BSIM3_MOD_KETA: + value->rValue = model->BSIM3keta; + return(OK); + case BSIM3_MOD_NSUB: + value->rValue = model->BSIM3nsub; + return(OK); + case BSIM3_MOD_NPEAK: + value->rValue = model->BSIM3npeak; + return(OK); + case BSIM3_MOD_NGATE: + value->rValue = model->BSIM3ngate; + return(OK); + case BSIM3_MOD_GAMMA1: + value->rValue = model->BSIM3gamma1; + return(OK); + case BSIM3_MOD_GAMMA2: + value->rValue = model->BSIM3gamma2; + return(OK); + case BSIM3_MOD_VBX: + value->rValue = model->BSIM3vbx; + return(OK); + case BSIM3_MOD_VBM: + value->rValue = model->BSIM3vbm; + return(OK); + case BSIM3_MOD_XT: + value->rValue = model->BSIM3xt; + return(OK); + case BSIM3_MOD_K1: + value->rValue = model->BSIM3k1; + return(OK); + case BSIM3_MOD_KT1: + value->rValue = model->BSIM3kt1; + return(OK); + case BSIM3_MOD_KT1L: + value->rValue = model->BSIM3kt1l; + return(OK); + case BSIM3_MOD_KT2 : + value->rValue = model->BSIM3kt2; + return(OK); + case BSIM3_MOD_K2 : + value->rValue = model->BSIM3k2; + return(OK); + case BSIM3_MOD_K3: + value->rValue = model->BSIM3k3; + return(OK); + case BSIM3_MOD_K3B: + value->rValue = model->BSIM3k3b; + return(OK); + case BSIM3_MOD_W0: + value->rValue = model->BSIM3w0; + return(OK); + case BSIM3_MOD_NLX: + value->rValue = model->BSIM3nlx; + return(OK); + case BSIM3_MOD_DVT0 : + value->rValue = model->BSIM3dvt0; + return(OK); + case BSIM3_MOD_DVT1 : + value->rValue = model->BSIM3dvt1; + return(OK); + case BSIM3_MOD_DVT2 : + value->rValue = model->BSIM3dvt2; + return(OK); + case BSIM3_MOD_DVT0W : + value->rValue = model->BSIM3dvt0w; + return(OK); + case BSIM3_MOD_DVT1W : + value->rValue = model->BSIM3dvt1w; + return(OK); + case BSIM3_MOD_DVT2W : + value->rValue = model->BSIM3dvt2w; + return(OK); + case BSIM3_MOD_DROUT : + value->rValue = model->BSIM3drout; + return(OK); + case BSIM3_MOD_DSUB : + value->rValue = model->BSIM3dsub; + return(OK); + case BSIM3_MOD_VTH0: + value->rValue = model->BSIM3vth0; + return(OK); + case BSIM3_MOD_UA: + value->rValue = model->BSIM3ua; + return(OK); + case BSIM3_MOD_UA1: + value->rValue = model->BSIM3ua1; + return(OK); + case BSIM3_MOD_UB: + value->rValue = model->BSIM3ub; + return(OK); + case BSIM3_MOD_UB1: + value->rValue = model->BSIM3ub1; + return(OK); + case BSIM3_MOD_UC: + value->rValue = model->BSIM3uc; + return(OK); + case BSIM3_MOD_UC1: + value->rValue = model->BSIM3uc1; + return(OK); + case BSIM3_MOD_U0: + value->rValue = model->BSIM3u0; + return(OK); + case BSIM3_MOD_UTE: + value->rValue = model->BSIM3ute; + return(OK); + case BSIM3_MOD_VOFF: + value->rValue = model->BSIM3voff; + return(OK); + case BSIM3_MOD_DELTA: + value->rValue = model->BSIM3delta; + return(OK); + case BSIM3_MOD_RDSW: + value->rValue = model->BSIM3rdsw; + return(OK); + case BSIM3_MOD_PRWG: + value->rValue = model->BSIM3prwg; + return(OK); + case BSIM3_MOD_PRWB: + value->rValue = model->BSIM3prwb; + return(OK); + case BSIM3_MOD_PRT: + value->rValue = model->BSIM3prt; + return(OK); + case BSIM3_MOD_ETA0: + value->rValue = model->BSIM3eta0; + return(OK); + case BSIM3_MOD_ETAB: + value->rValue = model->BSIM3etab; + return(OK); + case BSIM3_MOD_PCLM: + value->rValue = model->BSIM3pclm; + return(OK); + case BSIM3_MOD_PDIBL1: + value->rValue = model->BSIM3pdibl1; + return(OK); + case BSIM3_MOD_PDIBL2: + value->rValue = model->BSIM3pdibl2; + return(OK); + case BSIM3_MOD_PDIBLB: + value->rValue = model->BSIM3pdiblb; + return(OK); + case BSIM3_MOD_PSCBE1: + value->rValue = model->BSIM3pscbe1; + return(OK); + case BSIM3_MOD_PSCBE2: + value->rValue = model->BSIM3pscbe2; + return(OK); + case BSIM3_MOD_PVAG: + value->rValue = model->BSIM3pvag; + return(OK); + case BSIM3_MOD_WR: + value->rValue = model->BSIM3wr; + return(OK); + case BSIM3_MOD_DWG: + value->rValue = model->BSIM3dwg; + return(OK); + case BSIM3_MOD_DWB: + value->rValue = model->BSIM3dwb; + return(OK); + case BSIM3_MOD_B0: + value->rValue = model->BSIM3b0; + return(OK); + case BSIM3_MOD_B1: + value->rValue = model->BSIM3b1; + return(OK); + case BSIM3_MOD_ALPHA0: + value->rValue = model->BSIM3alpha0; + return(OK); + case BSIM3_MOD_ALPHA1: + value->rValue = model->BSIM3alpha1; + return(OK); + case BSIM3_MOD_BETA0: + value->rValue = model->BSIM3beta0; + return(OK); + case BSIM3_MOD_IJTH: + value->rValue = model->BSIM3ijth; + return(OK); + case BSIM3_MOD_VFB: + value->rValue = model->BSIM3vfb; + return(OK); - case BSIM3_MOD_CIT: - value->rValue = model->BSIM3cit; - return (OK); - case BSIM3_MOD_NFACTOR: - value->rValue = model->BSIM3nfactor; - return (OK); - case BSIM3_MOD_XJ: - value->rValue = model->BSIM3xj; - return (OK); - case BSIM3_MOD_VSAT: - value->rValue = model->BSIM3vsat; - return (OK); - case BSIM3_MOD_AT: - value->rValue = model->BSIM3at; - return (OK); - case BSIM3_MOD_A0: - value->rValue = model->BSIM3a0; - return (OK); + case BSIM3_MOD_ELM: + value->rValue = model->BSIM3elm; + return(OK); + case BSIM3_MOD_CGSL: + value->rValue = model->BSIM3cgsl; + return(OK); + case BSIM3_MOD_CGDL: + value->rValue = model->BSIM3cgdl; + return(OK); + case BSIM3_MOD_CKAPPA: + value->rValue = model->BSIM3ckappa; + return(OK); + case BSIM3_MOD_CF: + value->rValue = model->BSIM3cf; + return(OK); + case BSIM3_MOD_CLC: + value->rValue = model->BSIM3clc; + return(OK); + case BSIM3_MOD_CLE: + value->rValue = model->BSIM3cle; + return(OK); + case BSIM3_MOD_DWC: + value->rValue = model->BSIM3dwc; + return(OK); + case BSIM3_MOD_DLC: + value->rValue = model->BSIM3dlc; + return(OK); + case BSIM3_MOD_VFBCV: + value->rValue = model->BSIM3vfbcv; + return(OK); + case BSIM3_MOD_ACDE: + value->rValue = model->BSIM3acde; + return(OK); + case BSIM3_MOD_MOIN: + value->rValue = model->BSIM3moin; + return(OK); + case BSIM3_MOD_NOFF: + value->rValue = model->BSIM3noff; + return(OK); + case BSIM3_MOD_VOFFCV: + value->rValue = model->BSIM3voffcv; + return(OK); + case BSIM3_MOD_TCJ: + value->rValue = model->BSIM3tcj; + return(OK); + case BSIM3_MOD_TPB: + value->rValue = model->BSIM3tpb; + return(OK); + case BSIM3_MOD_TCJSW: + value->rValue = model->BSIM3tcjsw; + return(OK); + case BSIM3_MOD_TPBSW: + value->rValue = model->BSIM3tpbsw; + return(OK); + case BSIM3_MOD_TCJSWG: + value->rValue = model->BSIM3tcjswg; + return(OK); + case BSIM3_MOD_TPBSWG: + value->rValue = model->BSIM3tpbswg; + return(OK); - case BSIM3_MOD_AGS: - value->rValue = model->BSIM3ags; - return (OK); + /* acm model */ + case BSIM3_MOD_HDIF: + value->rValue = model->BSIM3hdif; + return(OK); + case BSIM3_MOD_LDIF: + value->rValue = model->BSIM3ldif; + return(OK); + case BSIM3_MOD_LD: + value->rValue = model->BSIM3ld; + return(OK); + case BSIM3_MOD_RD: + value->rValue = model->BSIM3rd; + return(OK); + case BSIM3_MOD_RS: + value->rValue = model->BSIM3rs; + return(OK); + case BSIM3_MOD_RDC: + value->rValue = model->BSIM3rdc; + return(OK); + case BSIM3_MOD_RSC: + value->rValue = model->BSIM3rsc; + return(OK); - case BSIM3_MOD_A1: - value->rValue = model->BSIM3a1; - return (OK); - case BSIM3_MOD_A2: - value->rValue = model->BSIM3a2; - return (OK); - case BSIM3_MOD_KETA: - value->rValue = model->BSIM3keta; - return (OK); - case BSIM3_MOD_NSUB: - value->rValue = model->BSIM3nsub; - return (OK); - case BSIM3_MOD_NPEAK: - value->rValue = model->BSIM3npeak; - return (OK); - case BSIM3_MOD_NGATE: - value->rValue = model->BSIM3ngate; - return (OK); - case BSIM3_MOD_GAMMA1: - value->rValue = model->BSIM3gamma1; - return (OK); - case BSIM3_MOD_GAMMA2: - value->rValue = model->BSIM3gamma2; - return (OK); - case BSIM3_MOD_VBX: - value->rValue = model->BSIM3vbx; - return (OK); - case BSIM3_MOD_VBM: - value->rValue = model->BSIM3vbm; - return (OK); - case BSIM3_MOD_XT: - value->rValue = model->BSIM3xt; - return (OK); - case BSIM3_MOD_K1: - value->rValue = model->BSIM3k1; - return (OK); - case BSIM3_MOD_KT1: - value->rValue = model->BSIM3kt1; - return (OK); - case BSIM3_MOD_KT1L: - value->rValue = model->BSIM3kt1l; - return (OK); - case BSIM3_MOD_KT2: - value->rValue = model->BSIM3kt2; - return (OK); - case BSIM3_MOD_K2: - value->rValue = model->BSIM3k2; - return (OK); - case BSIM3_MOD_K3: - value->rValue = model->BSIM3k3; - return (OK); - case BSIM3_MOD_K3B: - value->rValue = model->BSIM3k3b; - return (OK); - case BSIM3_MOD_W0: - value->rValue = model->BSIM3w0; - return (OK); - case BSIM3_MOD_NLX: - value->rValue = model->BSIM3nlx; - return (OK); - case BSIM3_MOD_DVT0: - value->rValue = model->BSIM3dvt0; - return (OK); - case BSIM3_MOD_DVT1: - value->rValue = model->BSIM3dvt1; - return (OK); - case BSIM3_MOD_DVT2: - value->rValue = model->BSIM3dvt2; - return (OK); - case BSIM3_MOD_DVT0W: - value->rValue = model->BSIM3dvt0w; - return (OK); - case BSIM3_MOD_DVT1W: - value->rValue = model->BSIM3dvt1w; - return (OK); - case BSIM3_MOD_DVT2W: - value->rValue = model->BSIM3dvt2w; - return (OK); - case BSIM3_MOD_DROUT: - value->rValue = model->BSIM3drout; - return (OK); - case BSIM3_MOD_DSUB: - value->rValue = model->BSIM3dsub; - return (OK); - case BSIM3_MOD_VTH0: - value->rValue = model->BSIM3vth0; - return (OK); - case BSIM3_MOD_UA: - value->rValue = model->BSIM3ua; - return (OK); - case BSIM3_MOD_UA1: - value->rValue = model->BSIM3ua1; - return (OK); - case BSIM3_MOD_UB: - value->rValue = model->BSIM3ub; - return (OK); - case BSIM3_MOD_UB1: - value->rValue = model->BSIM3ub1; - return (OK); - case BSIM3_MOD_UC: - value->rValue = model->BSIM3uc; - return (OK); - case BSIM3_MOD_UC1: - value->rValue = model->BSIM3uc1; - return (OK); - case BSIM3_MOD_U0: - value->rValue = model->BSIM3u0; - return (OK); - case BSIM3_MOD_UTE: - value->rValue = model->BSIM3ute; - return (OK); - case BSIM3_MOD_VOFF: - value->rValue = model->BSIM3voff; - return (OK); - case BSIM3_MOD_DELTA: - value->rValue = model->BSIM3delta; - return (OK); - case BSIM3_MOD_RDSW: - value->rValue = model->BSIM3rdsw; - return (OK); - case BSIM3_MOD_PRWG: - value->rValue = model->BSIM3prwg; - return (OK); - case BSIM3_MOD_PRWB: - value->rValue = model->BSIM3prwb; - return (OK); - case BSIM3_MOD_PRT: - value->rValue = model->BSIM3prt; - return (OK); - case BSIM3_MOD_ETA0: - value->rValue = model->BSIM3eta0; - return (OK); - case BSIM3_MOD_ETAB: - value->rValue = model->BSIM3etab; - return (OK); - case BSIM3_MOD_PCLM: - value->rValue = model->BSIM3pclm; - return (OK); - case BSIM3_MOD_PDIBL1: - value->rValue = model->BSIM3pdibl1; - return (OK); - case BSIM3_MOD_PDIBL2: - value->rValue = model->BSIM3pdibl2; - return (OK); - case BSIM3_MOD_PDIBLB: - value->rValue = model->BSIM3pdiblb; - return (OK); - case BSIM3_MOD_PSCBE1: - value->rValue = model->BSIM3pscbe1; - return (OK); - case BSIM3_MOD_PSCBE2: - value->rValue = model->BSIM3pscbe2; - return (OK); - case BSIM3_MOD_PVAG: - value->rValue = model->BSIM3pvag; - return (OK); - case BSIM3_MOD_WR: - value->rValue = model->BSIM3wr; - return (OK); - case BSIM3_MOD_DWG: - value->rValue = model->BSIM3dwg; - return (OK); - case BSIM3_MOD_DWB: - value->rValue = model->BSIM3dwb; - return (OK); - case BSIM3_MOD_B0: - value->rValue = model->BSIM3b0; - return (OK); - case BSIM3_MOD_B1: - value->rValue = model->BSIM3b1; - return (OK); - case BSIM3_MOD_ALPHA0: - value->rValue = model->BSIM3alpha0; - return (OK); - case BSIM3_MOD_ALPHA1: - value->rValue = model->BSIM3alpha1; - return (OK); - case BSIM3_MOD_BETA0: - value->rValue = model->BSIM3beta0; - return (OK); - case BSIM3_MOD_IJTH: - value->rValue = model->BSIM3ijth; - return (OK); - case BSIM3_MOD_VFB: - value->rValue = model->BSIM3vfb; - return (OK); + /* Length dependence */ + case BSIM3_MOD_LCDSC : + value->rValue = model->BSIM3lcdsc; + return(OK); + case BSIM3_MOD_LCDSCB : + value->rValue = model->BSIM3lcdscb; + return(OK); + case BSIM3_MOD_LCDSCD : + value->rValue = model->BSIM3lcdscd; + return(OK); + case BSIM3_MOD_LCIT : + value->rValue = model->BSIM3lcit; + return(OK); + case BSIM3_MOD_LNFACTOR : + value->rValue = model->BSIM3lnfactor; + return(OK); + case BSIM3_MOD_LXJ: + value->rValue = model->BSIM3lxj; + return(OK); + case BSIM3_MOD_LVSAT: + value->rValue = model->BSIM3lvsat; + return(OK); + case BSIM3_MOD_LAT: + value->rValue = model->BSIM3lat; + return(OK); + case BSIM3_MOD_LA0: + value->rValue = model->BSIM3la0; + return(OK); + case BSIM3_MOD_LAGS: + value->rValue = model->BSIM3lags; + return(OK); + case BSIM3_MOD_LA1: + value->rValue = model->BSIM3la1; + return(OK); + case BSIM3_MOD_LA2: + value->rValue = model->BSIM3la2; + return(OK); + case BSIM3_MOD_LKETA: + value->rValue = model->BSIM3lketa; + return(OK); + case BSIM3_MOD_LNSUB: + value->rValue = model->BSIM3lnsub; + return(OK); + case BSIM3_MOD_LNPEAK: + value->rValue = model->BSIM3lnpeak; + return(OK); + case BSIM3_MOD_LNGATE: + value->rValue = model->BSIM3lngate; + return(OK); + case BSIM3_MOD_LGAMMA1: + value->rValue = model->BSIM3lgamma1; + return(OK); + case BSIM3_MOD_LGAMMA2: + value->rValue = model->BSIM3lgamma2; + return(OK); + case BSIM3_MOD_LVBX: + value->rValue = model->BSIM3lvbx; + return(OK); + case BSIM3_MOD_LVBM: + value->rValue = model->BSIM3lvbm; + return(OK); + case BSIM3_MOD_LXT: + value->rValue = model->BSIM3lxt; + return(OK); + case BSIM3_MOD_LK1: + value->rValue = model->BSIM3lk1; + return(OK); + case BSIM3_MOD_LKT1: + value->rValue = model->BSIM3lkt1; + return(OK); + case BSIM3_MOD_LKT1L: + value->rValue = model->BSIM3lkt1l; + return(OK); + case BSIM3_MOD_LKT2 : + value->rValue = model->BSIM3lkt2; + return(OK); + case BSIM3_MOD_LK2 : + value->rValue = model->BSIM3lk2; + return(OK); + case BSIM3_MOD_LK3: + value->rValue = model->BSIM3lk3; + return(OK); + case BSIM3_MOD_LK3B: + value->rValue = model->BSIM3lk3b; + return(OK); + case BSIM3_MOD_LW0: + value->rValue = model->BSIM3lw0; + return(OK); + case BSIM3_MOD_LNLX: + value->rValue = model->BSIM3lnlx; + return(OK); + case BSIM3_MOD_LDVT0: + value->rValue = model->BSIM3ldvt0; + return(OK); + case BSIM3_MOD_LDVT1 : + value->rValue = model->BSIM3ldvt1; + return(OK); + case BSIM3_MOD_LDVT2 : + value->rValue = model->BSIM3ldvt2; + return(OK); + case BSIM3_MOD_LDVT0W : + value->rValue = model->BSIM3ldvt0w; + return(OK); + case BSIM3_MOD_LDVT1W : + value->rValue = model->BSIM3ldvt1w; + return(OK); + case BSIM3_MOD_LDVT2W : + value->rValue = model->BSIM3ldvt2w; + return(OK); + case BSIM3_MOD_LDROUT : + value->rValue = model->BSIM3ldrout; + return(OK); + case BSIM3_MOD_LDSUB : + value->rValue = model->BSIM3ldsub; + return(OK); + case BSIM3_MOD_LVTH0: + value->rValue = model->BSIM3lvth0; + return(OK); + case BSIM3_MOD_LUA: + value->rValue = model->BSIM3lua; + return(OK); + case BSIM3_MOD_LUA1: + value->rValue = model->BSIM3lua1; + return(OK); + case BSIM3_MOD_LUB: + value->rValue = model->BSIM3lub; + return(OK); + case BSIM3_MOD_LUB1: + value->rValue = model->BSIM3lub1; + return(OK); + case BSIM3_MOD_LUC: + value->rValue = model->BSIM3luc; + return(OK); + case BSIM3_MOD_LUC1: + value->rValue = model->BSIM3luc1; + return(OK); + case BSIM3_MOD_LU0: + value->rValue = model->BSIM3lu0; + return(OK); + case BSIM3_MOD_LUTE: + value->rValue = model->BSIM3lute; + return(OK); + case BSIM3_MOD_LVOFF: + value->rValue = model->BSIM3lvoff; + return(OK); + case BSIM3_MOD_LDELTA: + value->rValue = model->BSIM3ldelta; + return(OK); + case BSIM3_MOD_LRDSW: + value->rValue = model->BSIM3lrdsw; + return(OK); + case BSIM3_MOD_LPRWB: + value->rValue = model->BSIM3lprwb; + return(OK); + case BSIM3_MOD_LPRWG: + value->rValue = model->BSIM3lprwg; + return(OK); + case BSIM3_MOD_LPRT: + value->rValue = model->BSIM3lprt; + return(OK); + case BSIM3_MOD_LETA0: + value->rValue = model->BSIM3leta0; + return(OK); + case BSIM3_MOD_LETAB: + value->rValue = model->BSIM3letab; + return(OK); + case BSIM3_MOD_LPCLM: + value->rValue = model->BSIM3lpclm; + return(OK); + case BSIM3_MOD_LPDIBL1: + value->rValue = model->BSIM3lpdibl1; + return(OK); + case BSIM3_MOD_LPDIBL2: + value->rValue = model->BSIM3lpdibl2; + return(OK); + case BSIM3_MOD_LPDIBLB: + value->rValue = model->BSIM3lpdiblb; + return(OK); + case BSIM3_MOD_LPSCBE1: + value->rValue = model->BSIM3lpscbe1; + return(OK); + case BSIM3_MOD_LPSCBE2: + value->rValue = model->BSIM3lpscbe2; + return(OK); + case BSIM3_MOD_LPVAG: + value->rValue = model->BSIM3lpvag; + return(OK); + case BSIM3_MOD_LWR: + value->rValue = model->BSIM3lwr; + return(OK); + case BSIM3_MOD_LDWG: + value->rValue = model->BSIM3ldwg; + return(OK); + case BSIM3_MOD_LDWB: + value->rValue = model->BSIM3ldwb; + return(OK); + case BSIM3_MOD_LB0: + value->rValue = model->BSIM3lb0; + return(OK); + case BSIM3_MOD_LB1: + value->rValue = model->BSIM3lb1; + return(OK); + case BSIM3_MOD_LALPHA0: + value->rValue = model->BSIM3lalpha0; + return(OK); + case BSIM3_MOD_LALPHA1: + value->rValue = model->BSIM3lalpha1; + return(OK); + case BSIM3_MOD_LBETA0: + value->rValue = model->BSIM3lbeta0; + return(OK); + case BSIM3_MOD_LVFB: + value->rValue = model->BSIM3lvfb; + return(OK); - case BSIM3_MOD_ELM: - value->rValue = model->BSIM3elm; - return (OK); - case BSIM3_MOD_CGSL: - value->rValue = model->BSIM3cgsl; - return (OK); - case BSIM3_MOD_CGDL: - value->rValue = model->BSIM3cgdl; - return (OK); - case BSIM3_MOD_CKAPPA: - value->rValue = model->BSIM3ckappa; - return (OK); - case BSIM3_MOD_CF: - value->rValue = model->BSIM3cf; - return (OK); - case BSIM3_MOD_CLC: - value->rValue = model->BSIM3clc; - return (OK); - case BSIM3_MOD_CLE: - value->rValue = model->BSIM3cle; - return (OK); - case BSIM3_MOD_DWC: - value->rValue = model->BSIM3dwc; - return (OK); - case BSIM3_MOD_DLC: - value->rValue = model->BSIM3dlc; - return (OK); - case BSIM3_MOD_VFBCV: - value->rValue = model->BSIM3vfbcv; - return (OK); - case BSIM3_MOD_ACDE: - value->rValue = model->BSIM3acde; - return (OK); - case BSIM3_MOD_MOIN: - value->rValue = model->BSIM3moin; - return (OK); - case BSIM3_MOD_NOFF: - value->rValue = model->BSIM3noff; - return (OK); - case BSIM3_MOD_VOFFCV: - value->rValue = model->BSIM3voffcv; - return (OK); - case BSIM3_MOD_TCJ: - value->rValue = model->BSIM3tcj; - return (OK); - case BSIM3_MOD_TPB: - value->rValue = model->BSIM3tpb; - return (OK); - case BSIM3_MOD_TCJSW: - value->rValue = model->BSIM3tcjsw; - return (OK); - case BSIM3_MOD_TPBSW: - value->rValue = model->BSIM3tpbsw; - return (OK); - case BSIM3_MOD_TCJSWG: - value->rValue = model->BSIM3tcjswg; - return (OK); - case BSIM3_MOD_TPBSWG: - value->rValue = model->BSIM3tpbswg; - return (OK); + case BSIM3_MOD_LELM: + value->rValue = model->BSIM3lelm; + return(OK); + case BSIM3_MOD_LCGSL: + value->rValue = model->BSIM3lcgsl; + return(OK); + case BSIM3_MOD_LCGDL: + value->rValue = model->BSIM3lcgdl; + return(OK); + case BSIM3_MOD_LCKAPPA: + value->rValue = model->BSIM3lckappa; + return(OK); + case BSIM3_MOD_LCF: + value->rValue = model->BSIM3lcf; + return(OK); + case BSIM3_MOD_LCLC: + value->rValue = model->BSIM3lclc; + return(OK); + case BSIM3_MOD_LCLE: + value->rValue = model->BSIM3lcle; + return(OK); + case BSIM3_MOD_LVFBCV: + value->rValue = model->BSIM3lvfbcv; + return(OK); + case BSIM3_MOD_LACDE: + value->rValue = model->BSIM3lacde; + return(OK); + case BSIM3_MOD_LMOIN: + value->rValue = model->BSIM3lmoin; + return(OK); + case BSIM3_MOD_LNOFF: + value->rValue = model->BSIM3lnoff; + return(OK); + case BSIM3_MOD_LVOFFCV: + value->rValue = model->BSIM3lvoffcv; + return(OK); - /* Length dependence */ - case BSIM3_MOD_LCDSC: - value->rValue = model->BSIM3lcdsc; - return (OK); - case BSIM3_MOD_LCDSCB: - value->rValue = model->BSIM3lcdscb; - return (OK); - case BSIM3_MOD_LCDSCD: - value->rValue = model->BSIM3lcdscd; - return (OK); - case BSIM3_MOD_LCIT: - value->rValue = model->BSIM3lcit; - return (OK); - case BSIM3_MOD_LNFACTOR: - value->rValue = model->BSIM3lnfactor; - return (OK); - case BSIM3_MOD_LXJ: - value->rValue = model->BSIM3lxj; - return (OK); - case BSIM3_MOD_LVSAT: - value->rValue = model->BSIM3lvsat; - return (OK); - case BSIM3_MOD_LAT: - value->rValue = model->BSIM3lat; - return (OK); - case BSIM3_MOD_LA0: - value->rValue = model->BSIM3la0; - return (OK); - case BSIM3_MOD_LAGS: - value->rValue = model->BSIM3lags; - return (OK); - case BSIM3_MOD_LA1: - value->rValue = model->BSIM3la1; - return (OK); - case BSIM3_MOD_LA2: - value->rValue = model->BSIM3la2; - return (OK); - case BSIM3_MOD_LKETA: - value->rValue = model->BSIM3lketa; - return (OK); - case BSIM3_MOD_LNSUB: - value->rValue = model->BSIM3lnsub; - return (OK); - case BSIM3_MOD_LNPEAK: - value->rValue = model->BSIM3lnpeak; - return (OK); - case BSIM3_MOD_LNGATE: - value->rValue = model->BSIM3lngate; - return (OK); - case BSIM3_MOD_LGAMMA1: - value->rValue = model->BSIM3lgamma1; - return (OK); - case BSIM3_MOD_LGAMMA2: - value->rValue = model->BSIM3lgamma2; - return (OK); - case BSIM3_MOD_LVBX: - value->rValue = model->BSIM3lvbx; - return (OK); - case BSIM3_MOD_LVBM: - value->rValue = model->BSIM3lvbm; - return (OK); - case BSIM3_MOD_LXT: - value->rValue = model->BSIM3lxt; - return (OK); - case BSIM3_MOD_LK1: - value->rValue = model->BSIM3lk1; - return (OK); - case BSIM3_MOD_LKT1: - value->rValue = model->BSIM3lkt1; - return (OK); - case BSIM3_MOD_LKT1L: - value->rValue = model->BSIM3lkt1l; - return (OK); - case BSIM3_MOD_LKT2: - value->rValue = model->BSIM3lkt2; - return (OK); - case BSIM3_MOD_LK2: - value->rValue = model->BSIM3lk2; - return (OK); - case BSIM3_MOD_LK3: - value->rValue = model->BSIM3lk3; - return (OK); - case BSIM3_MOD_LK3B: - value->rValue = model->BSIM3lk3b; - return (OK); - case BSIM3_MOD_LW0: - value->rValue = model->BSIM3lw0; - return (OK); - case BSIM3_MOD_LNLX: - value->rValue = model->BSIM3lnlx; - return (OK); - case BSIM3_MOD_LDVT0: - value->rValue = model->BSIM3ldvt0; - return (OK); - case BSIM3_MOD_LDVT1: - value->rValue = model->BSIM3ldvt1; - return (OK); - case BSIM3_MOD_LDVT2: - value->rValue = model->BSIM3ldvt2; - return (OK); - case BSIM3_MOD_LDVT0W: - value->rValue = model->BSIM3ldvt0w; - return (OK); - case BSIM3_MOD_LDVT1W: - value->rValue = model->BSIM3ldvt1w; - return (OK); - case BSIM3_MOD_LDVT2W: - value->rValue = model->BSIM3ldvt2w; - return (OK); - case BSIM3_MOD_LDROUT: - value->rValue = model->BSIM3ldrout; - return (OK); - case BSIM3_MOD_LDSUB: - value->rValue = model->BSIM3ldsub; - return (OK); - case BSIM3_MOD_LVTH0: - value->rValue = model->BSIM3lvth0; - return (OK); - case BSIM3_MOD_LUA: - value->rValue = model->BSIM3lua; - return (OK); - case BSIM3_MOD_LUA1: - value->rValue = model->BSIM3lua1; - return (OK); - case BSIM3_MOD_LUB: - value->rValue = model->BSIM3lub; - return (OK); - case BSIM3_MOD_LUB1: - value->rValue = model->BSIM3lub1; - return (OK); - case BSIM3_MOD_LUC: - value->rValue = model->BSIM3luc; - return (OK); - case BSIM3_MOD_LUC1: - value->rValue = model->BSIM3luc1; - return (OK); - case BSIM3_MOD_LU0: - value->rValue = model->BSIM3lu0; - return (OK); - case BSIM3_MOD_LUTE: - value->rValue = model->BSIM3lute; - return (OK); - case BSIM3_MOD_LVOFF: - value->rValue = model->BSIM3lvoff; - return (OK); - case BSIM3_MOD_LDELTA: - value->rValue = model->BSIM3ldelta; - return (OK); - case BSIM3_MOD_LRDSW: - value->rValue = model->BSIM3lrdsw; - return (OK); - case BSIM3_MOD_LPRWB: - value->rValue = model->BSIM3lprwb; - return (OK); - case BSIM3_MOD_LPRWG: - value->rValue = model->BSIM3lprwg; - return (OK); - case BSIM3_MOD_LPRT: - value->rValue = model->BSIM3lprt; - return (OK); - case BSIM3_MOD_LETA0: - value->rValue = model->BSIM3leta0; - return (OK); - case BSIM3_MOD_LETAB: - value->rValue = model->BSIM3letab; - return (OK); - case BSIM3_MOD_LPCLM: - value->rValue = model->BSIM3lpclm; - return (OK); - case BSIM3_MOD_LPDIBL1: - value->rValue = model->BSIM3lpdibl1; - return (OK); - case BSIM3_MOD_LPDIBL2: - value->rValue = model->BSIM3lpdibl2; - return (OK); - case BSIM3_MOD_LPDIBLB: - value->rValue = model->BSIM3lpdiblb; - return (OK); - case BSIM3_MOD_LPSCBE1: - value->rValue = model->BSIM3lpscbe1; - return (OK); - case BSIM3_MOD_LPSCBE2: - value->rValue = model->BSIM3lpscbe2; - return (OK); - case BSIM3_MOD_LPVAG: - value->rValue = model->BSIM3lpvag; - return (OK); - case BSIM3_MOD_LWR: - value->rValue = model->BSIM3lwr; - return (OK); - case BSIM3_MOD_LDWG: - value->rValue = model->BSIM3ldwg; - return (OK); - case BSIM3_MOD_LDWB: - value->rValue = model->BSIM3ldwb; - return (OK); - case BSIM3_MOD_LB0: - value->rValue = model->BSIM3lb0; - return (OK); - case BSIM3_MOD_LB1: - value->rValue = model->BSIM3lb1; - return (OK); - case BSIM3_MOD_LALPHA0: - value->rValue = model->BSIM3lalpha0; - return (OK); - case BSIM3_MOD_LALPHA1: - value->rValue = model->BSIM3lalpha1; - return (OK); - case BSIM3_MOD_LBETA0: - value->rValue = model->BSIM3lbeta0; - return (OK); - case BSIM3_MOD_LVFB: - value->rValue = model->BSIM3lvfb; - return (OK); + /* Width dependence */ + case BSIM3_MOD_WCDSC : + value->rValue = model->BSIM3wcdsc; + return(OK); + case BSIM3_MOD_WCDSCB : + value->rValue = model->BSIM3wcdscb; + return(OK); + case BSIM3_MOD_WCDSCD : + value->rValue = model->BSIM3wcdscd; + return(OK); + case BSIM3_MOD_WCIT : + value->rValue = model->BSIM3wcit; + return(OK); + case BSIM3_MOD_WNFACTOR : + value->rValue = model->BSIM3wnfactor; + return(OK); + case BSIM3_MOD_WXJ: + value->rValue = model->BSIM3wxj; + return(OK); + case BSIM3_MOD_WVSAT: + value->rValue = model->BSIM3wvsat; + return(OK); + case BSIM3_MOD_WAT: + value->rValue = model->BSIM3wat; + return(OK); + case BSIM3_MOD_WA0: + value->rValue = model->BSIM3wa0; + return(OK); + case BSIM3_MOD_WAGS: + value->rValue = model->BSIM3wags; + return(OK); + case BSIM3_MOD_WA1: + value->rValue = model->BSIM3wa1; + return(OK); + case BSIM3_MOD_WA2: + value->rValue = model->BSIM3wa2; + return(OK); + case BSIM3_MOD_WKETA: + value->rValue = model->BSIM3wketa; + return(OK); + case BSIM3_MOD_WNSUB: + value->rValue = model->BSIM3wnsub; + return(OK); + case BSIM3_MOD_WNPEAK: + value->rValue = model->BSIM3wnpeak; + return(OK); + case BSIM3_MOD_WNGATE: + value->rValue = model->BSIM3wngate; + return(OK); + case BSIM3_MOD_WGAMMA1: + value->rValue = model->BSIM3wgamma1; + return(OK); + case BSIM3_MOD_WGAMMA2: + value->rValue = model->BSIM3wgamma2; + return(OK); + case BSIM3_MOD_WVBX: + value->rValue = model->BSIM3wvbx; + return(OK); + case BSIM3_MOD_WVBM: + value->rValue = model->BSIM3wvbm; + return(OK); + case BSIM3_MOD_WXT: + value->rValue = model->BSIM3wxt; + return(OK); + case BSIM3_MOD_WK1: + value->rValue = model->BSIM3wk1; + return(OK); + case BSIM3_MOD_WKT1: + value->rValue = model->BSIM3wkt1; + return(OK); + case BSIM3_MOD_WKT1L: + value->rValue = model->BSIM3wkt1l; + return(OK); + case BSIM3_MOD_WKT2 : + value->rValue = model->BSIM3wkt2; + return(OK); + case BSIM3_MOD_WK2 : + value->rValue = model->BSIM3wk2; + return(OK); + case BSIM3_MOD_WK3: + value->rValue = model->BSIM3wk3; + return(OK); + case BSIM3_MOD_WK3B: + value->rValue = model->BSIM3wk3b; + return(OK); + case BSIM3_MOD_WW0: + value->rValue = model->BSIM3ww0; + return(OK); + case BSIM3_MOD_WNLX: + value->rValue = model->BSIM3wnlx; + return(OK); + case BSIM3_MOD_WDVT0: + value->rValue = model->BSIM3wdvt0; + return(OK); + case BSIM3_MOD_WDVT1 : + value->rValue = model->BSIM3wdvt1; + return(OK); + case BSIM3_MOD_WDVT2 : + value->rValue = model->BSIM3wdvt2; + return(OK); + case BSIM3_MOD_WDVT0W : + value->rValue = model->BSIM3wdvt0w; + return(OK); + case BSIM3_MOD_WDVT1W : + value->rValue = model->BSIM3wdvt1w; + return(OK); + case BSIM3_MOD_WDVT2W : + value->rValue = model->BSIM3wdvt2w; + return(OK); + case BSIM3_MOD_WDROUT : + value->rValue = model->BSIM3wdrout; + return(OK); + case BSIM3_MOD_WDSUB : + value->rValue = model->BSIM3wdsub; + return(OK); + case BSIM3_MOD_WVTH0: + value->rValue = model->BSIM3wvth0; + return(OK); + case BSIM3_MOD_WUA: + value->rValue = model->BSIM3wua; + return(OK); + case BSIM3_MOD_WUA1: + value->rValue = model->BSIM3wua1; + return(OK); + case BSIM3_MOD_WUB: + value->rValue = model->BSIM3wub; + return(OK); + case BSIM3_MOD_WUB1: + value->rValue = model->BSIM3wub1; + return(OK); + case BSIM3_MOD_WUC: + value->rValue = model->BSIM3wuc; + return(OK); + case BSIM3_MOD_WUC1: + value->rValue = model->BSIM3wuc1; + return(OK); + case BSIM3_MOD_WU0: + value->rValue = model->BSIM3wu0; + return(OK); + case BSIM3_MOD_WUTE: + value->rValue = model->BSIM3wute; + return(OK); + case BSIM3_MOD_WVOFF: + value->rValue = model->BSIM3wvoff; + return(OK); + case BSIM3_MOD_WDELTA: + value->rValue = model->BSIM3wdelta; + return(OK); + case BSIM3_MOD_WRDSW: + value->rValue = model->BSIM3wrdsw; + return(OK); + case BSIM3_MOD_WPRWB: + value->rValue = model->BSIM3wprwb; + return(OK); + case BSIM3_MOD_WPRWG: + value->rValue = model->BSIM3wprwg; + return(OK); + case BSIM3_MOD_WPRT: + value->rValue = model->BSIM3wprt; + return(OK); + case BSIM3_MOD_WETA0: + value->rValue = model->BSIM3weta0; + return(OK); + case BSIM3_MOD_WETAB: + value->rValue = model->BSIM3wetab; + return(OK); + case BSIM3_MOD_WPCLM: + value->rValue = model->BSIM3wpclm; + return(OK); + case BSIM3_MOD_WPDIBL1: + value->rValue = model->BSIM3wpdibl1; + return(OK); + case BSIM3_MOD_WPDIBL2: + value->rValue = model->BSIM3wpdibl2; + return(OK); + case BSIM3_MOD_WPDIBLB: + value->rValue = model->BSIM3wpdiblb; + return(OK); + case BSIM3_MOD_WPSCBE1: + value->rValue = model->BSIM3wpscbe1; + return(OK); + case BSIM3_MOD_WPSCBE2: + value->rValue = model->BSIM3wpscbe2; + return(OK); + case BSIM3_MOD_WPVAG: + value->rValue = model->BSIM3wpvag; + return(OK); + case BSIM3_MOD_WWR: + value->rValue = model->BSIM3wwr; + return(OK); + case BSIM3_MOD_WDWG: + value->rValue = model->BSIM3wdwg; + return(OK); + case BSIM3_MOD_WDWB: + value->rValue = model->BSIM3wdwb; + return(OK); + case BSIM3_MOD_WB0: + value->rValue = model->BSIM3wb0; + return(OK); + case BSIM3_MOD_WB1: + value->rValue = model->BSIM3wb1; + return(OK); + case BSIM3_MOD_WALPHA0: + value->rValue = model->BSIM3walpha0; + return(OK); + case BSIM3_MOD_WALPHA1: + value->rValue = model->BSIM3walpha1; + return(OK); + case BSIM3_MOD_WBETA0: + value->rValue = model->BSIM3wbeta0; + return(OK); + case BSIM3_MOD_WVFB: + value->rValue = model->BSIM3wvfb; + return(OK); - case BSIM3_MOD_LELM: - value->rValue = model->BSIM3lelm; - return (OK); - case BSIM3_MOD_LCGSL: - value->rValue = model->BSIM3lcgsl; - return (OK); - case BSIM3_MOD_LCGDL: - value->rValue = model->BSIM3lcgdl; - return (OK); - case BSIM3_MOD_LCKAPPA: - value->rValue = model->BSIM3lckappa; - return (OK); - case BSIM3_MOD_LCF: - value->rValue = model->BSIM3lcf; - return (OK); - case BSIM3_MOD_LCLC: - value->rValue = model->BSIM3lclc; - return (OK); - case BSIM3_MOD_LCLE: - value->rValue = model->BSIM3lcle; - return (OK); - case BSIM3_MOD_LVFBCV: - value->rValue = model->BSIM3lvfbcv; - return (OK); - case BSIM3_MOD_LACDE: - value->rValue = model->BSIM3lacde; - return (OK); - case BSIM3_MOD_LMOIN: - value->rValue = model->BSIM3lmoin; - return (OK); - case BSIM3_MOD_LNOFF: - value->rValue = model->BSIM3lnoff; - return (OK); - case BSIM3_MOD_LVOFFCV: - value->rValue = model->BSIM3lvoffcv; - return (OK); + case BSIM3_MOD_WELM: + value->rValue = model->BSIM3welm; + return(OK); + case BSIM3_MOD_WCGSL: + value->rValue = model->BSIM3wcgsl; + return(OK); + case BSIM3_MOD_WCGDL: + value->rValue = model->BSIM3wcgdl; + return(OK); + case BSIM3_MOD_WCKAPPA: + value->rValue = model->BSIM3wckappa; + return(OK); + case BSIM3_MOD_WCF: + value->rValue = model->BSIM3wcf; + return(OK); + case BSIM3_MOD_WCLC: + value->rValue = model->BSIM3wclc; + return(OK); + case BSIM3_MOD_WCLE: + value->rValue = model->BSIM3wcle; + return(OK); + case BSIM3_MOD_WVFBCV: + value->rValue = model->BSIM3wvfbcv; + return(OK); + case BSIM3_MOD_WACDE: + value->rValue = model->BSIM3wacde; + return(OK); + case BSIM3_MOD_WMOIN: + value->rValue = model->BSIM3wmoin; + return(OK); + case BSIM3_MOD_WNOFF: + value->rValue = model->BSIM3wnoff; + return(OK); + case BSIM3_MOD_WVOFFCV: + value->rValue = model->BSIM3wvoffcv; + return(OK); - /* Width dependence */ - case BSIM3_MOD_WCDSC: - value->rValue = model->BSIM3wcdsc; - return (OK); - case BSIM3_MOD_WCDSCB: - value->rValue = model->BSIM3wcdscb; - return (OK); - case BSIM3_MOD_WCDSCD: - value->rValue = model->BSIM3wcdscd; - return (OK); - case BSIM3_MOD_WCIT: - value->rValue = model->BSIM3wcit; - return (OK); - case BSIM3_MOD_WNFACTOR: - value->rValue = model->BSIM3wnfactor; - return (OK); - case BSIM3_MOD_WXJ: - value->rValue = model->BSIM3wxj; - return (OK); - case BSIM3_MOD_WVSAT: - value->rValue = model->BSIM3wvsat; - return (OK); - case BSIM3_MOD_WAT: - value->rValue = model->BSIM3wat; - return (OK); - case BSIM3_MOD_WA0: - value->rValue = model->BSIM3wa0; - return (OK); - case BSIM3_MOD_WAGS: - value->rValue = model->BSIM3wags; - return (OK); - case BSIM3_MOD_WA1: - value->rValue = model->BSIM3wa1; - return (OK); - case BSIM3_MOD_WA2: - value->rValue = model->BSIM3wa2; - return (OK); - case BSIM3_MOD_WKETA: - value->rValue = model->BSIM3wketa; - return (OK); - case BSIM3_MOD_WNSUB: - value->rValue = model->BSIM3wnsub; - return (OK); - case BSIM3_MOD_WNPEAK: - value->rValue = model->BSIM3wnpeak; - return (OK); - case BSIM3_MOD_WNGATE: - value->rValue = model->BSIM3wngate; - return (OK); - case BSIM3_MOD_WGAMMA1: - value->rValue = model->BSIM3wgamma1; - return (OK); - case BSIM3_MOD_WGAMMA2: - value->rValue = model->BSIM3wgamma2; - return (OK); - case BSIM3_MOD_WVBX: - value->rValue = model->BSIM3wvbx; - return (OK); - case BSIM3_MOD_WVBM: - value->rValue = model->BSIM3wvbm; - return (OK); - case BSIM3_MOD_WXT: - value->rValue = model->BSIM3wxt; - return (OK); - case BSIM3_MOD_WK1: - value->rValue = model->BSIM3wk1; - return (OK); - case BSIM3_MOD_WKT1: - value->rValue = model->BSIM3wkt1; - return (OK); - case BSIM3_MOD_WKT1L: - value->rValue = model->BSIM3wkt1l; - return (OK); - case BSIM3_MOD_WKT2: - value->rValue = model->BSIM3wkt2; - return (OK); - case BSIM3_MOD_WK2: - value->rValue = model->BSIM3wk2; - return (OK); - case BSIM3_MOD_WK3: - value->rValue = model->BSIM3wk3; - return (OK); - case BSIM3_MOD_WK3B: - value->rValue = model->BSIM3wk3b; - return (OK); - case BSIM3_MOD_WW0: - value->rValue = model->BSIM3ww0; - return (OK); - case BSIM3_MOD_WNLX: - value->rValue = model->BSIM3wnlx; - return (OK); - case BSIM3_MOD_WDVT0: - value->rValue = model->BSIM3wdvt0; - return (OK); - case BSIM3_MOD_WDVT1: - value->rValue = model->BSIM3wdvt1; - return (OK); - case BSIM3_MOD_WDVT2: - value->rValue = model->BSIM3wdvt2; - return (OK); - case BSIM3_MOD_WDVT0W: - value->rValue = model->BSIM3wdvt0w; - return (OK); - case BSIM3_MOD_WDVT1W: - value->rValue = model->BSIM3wdvt1w; - return (OK); - case BSIM3_MOD_WDVT2W: - value->rValue = model->BSIM3wdvt2w; - return (OK); - case BSIM3_MOD_WDROUT: - value->rValue = model->BSIM3wdrout; - return (OK); - case BSIM3_MOD_WDSUB: - value->rValue = model->BSIM3wdsub; - return (OK); - case BSIM3_MOD_WVTH0: - value->rValue = model->BSIM3wvth0; - return (OK); - case BSIM3_MOD_WUA: - value->rValue = model->BSIM3wua; - return (OK); - case BSIM3_MOD_WUA1: - value->rValue = model->BSIM3wua1; - return (OK); - case BSIM3_MOD_WUB: - value->rValue = model->BSIM3wub; - return (OK); - case BSIM3_MOD_WUB1: - value->rValue = model->BSIM3wub1; - return (OK); - case BSIM3_MOD_WUC: - value->rValue = model->BSIM3wuc; - return (OK); - case BSIM3_MOD_WUC1: - value->rValue = model->BSIM3wuc1; - return (OK); - case BSIM3_MOD_WU0: - value->rValue = model->BSIM3wu0; - return (OK); - case BSIM3_MOD_WUTE: - value->rValue = model->BSIM3wute; - return (OK); - case BSIM3_MOD_WVOFF: - value->rValue = model->BSIM3wvoff; - return (OK); - case BSIM3_MOD_WDELTA: - value->rValue = model->BSIM3wdelta; - return (OK); - case BSIM3_MOD_WRDSW: - value->rValue = model->BSIM3wrdsw; - return (OK); - case BSIM3_MOD_WPRWB: - value->rValue = model->BSIM3wprwb; - return (OK); - case BSIM3_MOD_WPRWG: - value->rValue = model->BSIM3wprwg; - return (OK); - case BSIM3_MOD_WPRT: - value->rValue = model->BSIM3wprt; - return (OK); - case BSIM3_MOD_WETA0: - value->rValue = model->BSIM3weta0; - return (OK); - case BSIM3_MOD_WETAB: - value->rValue = model->BSIM3wetab; - return (OK); - case BSIM3_MOD_WPCLM: - value->rValue = model->BSIM3wpclm; - return (OK); - case BSIM3_MOD_WPDIBL1: - value->rValue = model->BSIM3wpdibl1; - return (OK); - case BSIM3_MOD_WPDIBL2: - value->rValue = model->BSIM3wpdibl2; - return (OK); - case BSIM3_MOD_WPDIBLB: - value->rValue = model->BSIM3wpdiblb; - return (OK); - case BSIM3_MOD_WPSCBE1: - value->rValue = model->BSIM3wpscbe1; - return (OK); - case BSIM3_MOD_WPSCBE2: - value->rValue = model->BSIM3wpscbe2; - return (OK); - case BSIM3_MOD_WPVAG: - value->rValue = model->BSIM3wpvag; - return (OK); - case BSIM3_MOD_WWR: - value->rValue = model->BSIM3wwr; - return (OK); - case BSIM3_MOD_WDWG: - value->rValue = model->BSIM3wdwg; - return (OK); - case BSIM3_MOD_WDWB: - value->rValue = model->BSIM3wdwb; - return (OK); - case BSIM3_MOD_WB0: - value->rValue = model->BSIM3wb0; - return (OK); - case BSIM3_MOD_WB1: - value->rValue = model->BSIM3wb1; - return (OK); - case BSIM3_MOD_WALPHA0: - value->rValue = model->BSIM3walpha0; - return (OK); - case BSIM3_MOD_WALPHA1: - value->rValue = model->BSIM3walpha1; - return (OK); - case BSIM3_MOD_WBETA0: - value->rValue = model->BSIM3wbeta0; - return (OK); - case BSIM3_MOD_WVFB: - value->rValue = model->BSIM3wvfb; - return (OK); + /* Cross-term dependence */ + case BSIM3_MOD_PCDSC : + value->rValue = model->BSIM3pcdsc; + return(OK); + case BSIM3_MOD_PCDSCB : + value->rValue = model->BSIM3pcdscb; + return(OK); + case BSIM3_MOD_PCDSCD : + value->rValue = model->BSIM3pcdscd; + return(OK); + case BSIM3_MOD_PCIT : + value->rValue = model->BSIM3pcit; + return(OK); + case BSIM3_MOD_PNFACTOR : + value->rValue = model->BSIM3pnfactor; + return(OK); + case BSIM3_MOD_PXJ: + value->rValue = model->BSIM3pxj; + return(OK); + case BSIM3_MOD_PVSAT: + value->rValue = model->BSIM3pvsat; + return(OK); + case BSIM3_MOD_PAT: + value->rValue = model->BSIM3pat; + return(OK); + case BSIM3_MOD_PA0: + value->rValue = model->BSIM3pa0; + return(OK); + case BSIM3_MOD_PAGS: + value->rValue = model->BSIM3pags; + return(OK); + case BSIM3_MOD_PA1: + value->rValue = model->BSIM3pa1; + return(OK); + case BSIM3_MOD_PA2: + value->rValue = model->BSIM3pa2; + return(OK); + case BSIM3_MOD_PKETA: + value->rValue = model->BSIM3pketa; + return(OK); + case BSIM3_MOD_PNSUB: + value->rValue = model->BSIM3pnsub; + return(OK); + case BSIM3_MOD_PNPEAK: + value->rValue = model->BSIM3pnpeak; + return(OK); + case BSIM3_MOD_PNGATE: + value->rValue = model->BSIM3pngate; + return(OK); + case BSIM3_MOD_PGAMMA1: + value->rValue = model->BSIM3pgamma1; + return(OK); + case BSIM3_MOD_PGAMMA2: + value->rValue = model->BSIM3pgamma2; + return(OK); + case BSIM3_MOD_PVBX: + value->rValue = model->BSIM3pvbx; + return(OK); + case BSIM3_MOD_PVBM: + value->rValue = model->BSIM3pvbm; + return(OK); + case BSIM3_MOD_PXT: + value->rValue = model->BSIM3pxt; + return(OK); + case BSIM3_MOD_PK1: + value->rValue = model->BSIM3pk1; + return(OK); + case BSIM3_MOD_PKT1: + value->rValue = model->BSIM3pkt1; + return(OK); + case BSIM3_MOD_PKT1L: + value->rValue = model->BSIM3pkt1l; + return(OK); + case BSIM3_MOD_PKT2 : + value->rValue = model->BSIM3pkt2; + return(OK); + case BSIM3_MOD_PK2 : + value->rValue = model->BSIM3pk2; + return(OK); + case BSIM3_MOD_PK3: + value->rValue = model->BSIM3pk3; + return(OK); + case BSIM3_MOD_PK3B: + value->rValue = model->BSIM3pk3b; + return(OK); + case BSIM3_MOD_PW0: + value->rValue = model->BSIM3pw0; + return(OK); + case BSIM3_MOD_PNLX: + value->rValue = model->BSIM3pnlx; + return(OK); + case BSIM3_MOD_PDVT0 : + value->rValue = model->BSIM3pdvt0; + return(OK); + case BSIM3_MOD_PDVT1 : + value->rValue = model->BSIM3pdvt1; + return(OK); + case BSIM3_MOD_PDVT2 : + value->rValue = model->BSIM3pdvt2; + return(OK); + case BSIM3_MOD_PDVT0W : + value->rValue = model->BSIM3pdvt0w; + return(OK); + case BSIM3_MOD_PDVT1W : + value->rValue = model->BSIM3pdvt1w; + return(OK); + case BSIM3_MOD_PDVT2W : + value->rValue = model->BSIM3pdvt2w; + return(OK); + case BSIM3_MOD_PDROUT : + value->rValue = model->BSIM3pdrout; + return(OK); + case BSIM3_MOD_PDSUB : + value->rValue = model->BSIM3pdsub; + return(OK); + case BSIM3_MOD_PVTH0: + value->rValue = model->BSIM3pvth0; + return(OK); + case BSIM3_MOD_PUA: + value->rValue = model->BSIM3pua; + return(OK); + case BSIM3_MOD_PUA1: + value->rValue = model->BSIM3pua1; + return(OK); + case BSIM3_MOD_PUB: + value->rValue = model->BSIM3pub; + return(OK); + case BSIM3_MOD_PUB1: + value->rValue = model->BSIM3pub1; + return(OK); + case BSIM3_MOD_PUC: + value->rValue = model->BSIM3puc; + return(OK); + case BSIM3_MOD_PUC1: + value->rValue = model->BSIM3puc1; + return(OK); + case BSIM3_MOD_PU0: + value->rValue = model->BSIM3pu0; + return(OK); + case BSIM3_MOD_PUTE: + value->rValue = model->BSIM3pute; + return(OK); + case BSIM3_MOD_PVOFF: + value->rValue = model->BSIM3pvoff; + return(OK); + case BSIM3_MOD_PDELTA: + value->rValue = model->BSIM3pdelta; + return(OK); + case BSIM3_MOD_PRDSW: + value->rValue = model->BSIM3prdsw; + return(OK); + case BSIM3_MOD_PPRWB: + value->rValue = model->BSIM3pprwb; + return(OK); + case BSIM3_MOD_PPRWG: + value->rValue = model->BSIM3pprwg; + return(OK); + case BSIM3_MOD_PPRT: + value->rValue = model->BSIM3pprt; + return(OK); + case BSIM3_MOD_PETA0: + value->rValue = model->BSIM3peta0; + return(OK); + case BSIM3_MOD_PETAB: + value->rValue = model->BSIM3petab; + return(OK); + case BSIM3_MOD_PPCLM: + value->rValue = model->BSIM3ppclm; + return(OK); + case BSIM3_MOD_PPDIBL1: + value->rValue = model->BSIM3ppdibl1; + return(OK); + case BSIM3_MOD_PPDIBL2: + value->rValue = model->BSIM3ppdibl2; + return(OK); + case BSIM3_MOD_PPDIBLB: + value->rValue = model->BSIM3ppdiblb; + return(OK); + case BSIM3_MOD_PPSCBE1: + value->rValue = model->BSIM3ppscbe1; + return(OK); + case BSIM3_MOD_PPSCBE2: + value->rValue = model->BSIM3ppscbe2; + return(OK); + case BSIM3_MOD_PPVAG: + value->rValue = model->BSIM3ppvag; + return(OK); + case BSIM3_MOD_PWR: + value->rValue = model->BSIM3pwr; + return(OK); + case BSIM3_MOD_PDWG: + value->rValue = model->BSIM3pdwg; + return(OK); + case BSIM3_MOD_PDWB: + value->rValue = model->BSIM3pdwb; + return(OK); + case BSIM3_MOD_PB0: + value->rValue = model->BSIM3pb0; + return(OK); + case BSIM3_MOD_PB1: + value->rValue = model->BSIM3pb1; + return(OK); + case BSIM3_MOD_PALPHA0: + value->rValue = model->BSIM3palpha0; + return(OK); + case BSIM3_MOD_PALPHA1: + value->rValue = model->BSIM3palpha1; + return(OK); + case BSIM3_MOD_PBETA0: + value->rValue = model->BSIM3pbeta0; + return(OK); + case BSIM3_MOD_PVFB: + value->rValue = model->BSIM3pvfb; + return(OK); - case BSIM3_MOD_WELM: - value->rValue = model->BSIM3welm; - return (OK); - case BSIM3_MOD_WCGSL: - value->rValue = model->BSIM3wcgsl; - return (OK); - case BSIM3_MOD_WCGDL: - value->rValue = model->BSIM3wcgdl; - return (OK); - case BSIM3_MOD_WCKAPPA: - value->rValue = model->BSIM3wckappa; - return (OK); - case BSIM3_MOD_WCF: - value->rValue = model->BSIM3wcf; - return (OK); - case BSIM3_MOD_WCLC: - value->rValue = model->BSIM3wclc; - return (OK); - case BSIM3_MOD_WCLE: - value->rValue = model->BSIM3wcle; - return (OK); - case BSIM3_MOD_WVFBCV: - value->rValue = model->BSIM3wvfbcv; - return (OK); - case BSIM3_MOD_WACDE: - value->rValue = model->BSIM3wacde; - return (OK); - case BSIM3_MOD_WMOIN: - value->rValue = model->BSIM3wmoin; - return (OK); - case BSIM3_MOD_WNOFF: - value->rValue = model->BSIM3wnoff; - return (OK); - case BSIM3_MOD_WVOFFCV: - value->rValue = model->BSIM3wvoffcv; - return (OK); + case BSIM3_MOD_PELM: + value->rValue = model->BSIM3pelm; + return(OK); + case BSIM3_MOD_PCGSL: + value->rValue = model->BSIM3pcgsl; + return(OK); + case BSIM3_MOD_PCGDL: + value->rValue = model->BSIM3pcgdl; + return(OK); + case BSIM3_MOD_PCKAPPA: + value->rValue = model->BSIM3pckappa; + return(OK); + case BSIM3_MOD_PCF: + value->rValue = model->BSIM3pcf; + return(OK); + case BSIM3_MOD_PCLC: + value->rValue = model->BSIM3pclc; + return(OK); + case BSIM3_MOD_PCLE: + value->rValue = model->BSIM3pcle; + return(OK); + case BSIM3_MOD_PVFBCV: + value->rValue = model->BSIM3pvfbcv; + return(OK); + case BSIM3_MOD_PACDE: + value->rValue = model->BSIM3pacde; + return(OK); + case BSIM3_MOD_PMOIN: + value->rValue = model->BSIM3pmoin; + return(OK); + case BSIM3_MOD_PNOFF: + value->rValue = model->BSIM3pnoff; + return(OK); + case BSIM3_MOD_PVOFFCV: + value->rValue = model->BSIM3pvoffcv; + return(OK); - /* Cross-term dependence */ - case BSIM3_MOD_PCDSC: - value->rValue = model->BSIM3pcdsc; - return (OK); - case BSIM3_MOD_PCDSCB: - value->rValue = model->BSIM3pcdscb; - return (OK); - case BSIM3_MOD_PCDSCD: - value->rValue = model->BSIM3pcdscd; - return (OK); - case BSIM3_MOD_PCIT: - value->rValue = model->BSIM3pcit; - return (OK); - case BSIM3_MOD_PNFACTOR: - value->rValue = model->BSIM3pnfactor; - return (OK); - case BSIM3_MOD_PXJ: - value->rValue = model->BSIM3pxj; - return (OK); - case BSIM3_MOD_PVSAT: - value->rValue = model->BSIM3pvsat; - return (OK); - case BSIM3_MOD_PAT: - value->rValue = model->BSIM3pat; - return (OK); - case BSIM3_MOD_PA0: - value->rValue = model->BSIM3pa0; - return (OK); - case BSIM3_MOD_PAGS: - value->rValue = model->BSIM3pags; - return (OK); - case BSIM3_MOD_PA1: - value->rValue = model->BSIM3pa1; - return (OK); - case BSIM3_MOD_PA2: - value->rValue = model->BSIM3pa2; - return (OK); - case BSIM3_MOD_PKETA: - value->rValue = model->BSIM3pketa; - return (OK); - case BSIM3_MOD_PNSUB: - value->rValue = model->BSIM3pnsub; - return (OK); - case BSIM3_MOD_PNPEAK: - value->rValue = model->BSIM3pnpeak; - return (OK); - case BSIM3_MOD_PNGATE: - value->rValue = model->BSIM3pngate; - return (OK); - case BSIM3_MOD_PGAMMA1: - value->rValue = model->BSIM3pgamma1; - return (OK); - case BSIM3_MOD_PGAMMA2: - value->rValue = model->BSIM3pgamma2; - return (OK); - case BSIM3_MOD_PVBX: - value->rValue = model->BSIM3pvbx; - return (OK); - case BSIM3_MOD_PVBM: - value->rValue = model->BSIM3pvbm; - return (OK); - case BSIM3_MOD_PXT: - value->rValue = model->BSIM3pxt; - return (OK); - case BSIM3_MOD_PK1: - value->rValue = model->BSIM3pk1; - return (OK); - case BSIM3_MOD_PKT1: - value->rValue = model->BSIM3pkt1; - return (OK); - case BSIM3_MOD_PKT1L: - value->rValue = model->BSIM3pkt1l; - return (OK); - case BSIM3_MOD_PKT2: - value->rValue = model->BSIM3pkt2; - return (OK); - case BSIM3_MOD_PK2: - value->rValue = model->BSIM3pk2; - return (OK); - case BSIM3_MOD_PK3: - value->rValue = model->BSIM3pk3; - return (OK); - case BSIM3_MOD_PK3B: - value->rValue = model->BSIM3pk3b; - return (OK); - case BSIM3_MOD_PW0: - value->rValue = model->BSIM3pw0; - return (OK); - case BSIM3_MOD_PNLX: - value->rValue = model->BSIM3pnlx; - return (OK); - case BSIM3_MOD_PDVT0: - value->rValue = model->BSIM3pdvt0; - return (OK); - case BSIM3_MOD_PDVT1: - value->rValue = model->BSIM3pdvt1; - return (OK); - case BSIM3_MOD_PDVT2: - value->rValue = model->BSIM3pdvt2; - return (OK); - case BSIM3_MOD_PDVT0W: - value->rValue = model->BSIM3pdvt0w; - return (OK); - case BSIM3_MOD_PDVT1W: - value->rValue = model->BSIM3pdvt1w; - return (OK); - case BSIM3_MOD_PDVT2W: - value->rValue = model->BSIM3pdvt2w; - return (OK); - case BSIM3_MOD_PDROUT: - value->rValue = model->BSIM3pdrout; - return (OK); - case BSIM3_MOD_PDSUB: - value->rValue = model->BSIM3pdsub; - return (OK); - case BSIM3_MOD_PVTH0: - value->rValue = model->BSIM3pvth0; - return (OK); - case BSIM3_MOD_PUA: - value->rValue = model->BSIM3pua; - return (OK); - case BSIM3_MOD_PUA1: - value->rValue = model->BSIM3pua1; - return (OK); - case BSIM3_MOD_PUB: - value->rValue = model->BSIM3pub; - return (OK); - case BSIM3_MOD_PUB1: - value->rValue = model->BSIM3pub1; - return (OK); - case BSIM3_MOD_PUC: - value->rValue = model->BSIM3puc; - return (OK); - case BSIM3_MOD_PUC1: - value->rValue = model->BSIM3puc1; - return (OK); - case BSIM3_MOD_PU0: - value->rValue = model->BSIM3pu0; - return (OK); - case BSIM3_MOD_PUTE: - value->rValue = model->BSIM3pute; - return (OK); - case BSIM3_MOD_PVOFF: - value->rValue = model->BSIM3pvoff; - return (OK); - case BSIM3_MOD_PDELTA: - value->rValue = model->BSIM3pdelta; - return (OK); - case BSIM3_MOD_PRDSW: - value->rValue = model->BSIM3prdsw; - return (OK); - case BSIM3_MOD_PPRWB: - value->rValue = model->BSIM3pprwb; - return (OK); - case BSIM3_MOD_PPRWG: - value->rValue = model->BSIM3pprwg; - return (OK); - case BSIM3_MOD_PPRT: - value->rValue = model->BSIM3pprt; - return (OK); - case BSIM3_MOD_PETA0: - value->rValue = model->BSIM3peta0; - return (OK); - case BSIM3_MOD_PETAB: - value->rValue = model->BSIM3petab; - return (OK); - case BSIM3_MOD_PPCLM: - value->rValue = model->BSIM3ppclm; - return (OK); - case BSIM3_MOD_PPDIBL1: - value->rValue = model->BSIM3ppdibl1; - return (OK); - case BSIM3_MOD_PPDIBL2: - value->rValue = model->BSIM3ppdibl2; - return (OK); - case BSIM3_MOD_PPDIBLB: - value->rValue = model->BSIM3ppdiblb; - return (OK); - case BSIM3_MOD_PPSCBE1: - value->rValue = model->BSIM3ppscbe1; - return (OK); - case BSIM3_MOD_PPSCBE2: - value->rValue = model->BSIM3ppscbe2; - return (OK); - case BSIM3_MOD_PPVAG: - value->rValue = model->BSIM3ppvag; - return (OK); - case BSIM3_MOD_PWR: - value->rValue = model->BSIM3pwr; - return (OK); - case BSIM3_MOD_PDWG: - value->rValue = model->BSIM3pdwg; - return (OK); - case BSIM3_MOD_PDWB: - value->rValue = model->BSIM3pdwb; - return (OK); - case BSIM3_MOD_PB0: - value->rValue = model->BSIM3pb0; - return (OK); - case BSIM3_MOD_PB1: - value->rValue = model->BSIM3pb1; - return (OK); - case BSIM3_MOD_PALPHA0: - value->rValue = model->BSIM3palpha0; - return (OK); - case BSIM3_MOD_PALPHA1: - value->rValue = model->BSIM3palpha1; - return (OK); - case BSIM3_MOD_PBETA0: - value->rValue = model->BSIM3pbeta0; - return (OK); - case BSIM3_MOD_PVFB: - value->rValue = model->BSIM3pvfb; - return (OK); + case BSIM3_MOD_TNOM : + value->rValue = model->BSIM3tnom; + return(OK); + case BSIM3_MOD_CGSO: + value->rValue = model->BSIM3cgso; + return(OK); + case BSIM3_MOD_CGDO: + value->rValue = model->BSIM3cgdo; + return(OK); + case BSIM3_MOD_CGBO: + value->rValue = model->BSIM3cgbo; + return(OK); + case BSIM3_MOD_XPART: + value->rValue = model->BSIM3xpart; + return(OK); + case BSIM3_MOD_RSH: + value->rValue = model->BSIM3sheetResistance; + return(OK); + case BSIM3_MOD_JS: + value->rValue = model->BSIM3jctSatCurDensity; + return(OK); + case BSIM3_MOD_JSW: + value->rValue = model->BSIM3jctSidewallSatCurDensity; + return(OK); + case BSIM3_MOD_PB: + value->rValue = model->BSIM3bulkJctPotential; + return(OK); + case BSIM3_MOD_MJ: + value->rValue = model->BSIM3bulkJctBotGradingCoeff; + return(OK); + case BSIM3_MOD_PBSW: + value->rValue = model->BSIM3sidewallJctPotential; + return(OK); + case BSIM3_MOD_MJSW: + value->rValue = model->BSIM3bulkJctSideGradingCoeff; + return(OK); + case BSIM3_MOD_CJ: + value->rValue = model->BSIM3unitAreaJctCap; + return(OK); + case BSIM3_MOD_CJSW: + value->rValue = model->BSIM3unitLengthSidewallJctCap; + return(OK); + case BSIM3_MOD_PBSWG: + value->rValue = model->BSIM3GatesidewallJctPotential; + return(OK); + case BSIM3_MOD_MJSWG: + value->rValue = model->BSIM3bulkJctGateSideGradingCoeff; + return(OK); + case BSIM3_MOD_CJSWG: + value->rValue = model->BSIM3unitLengthGateSidewallJctCap; + return(OK); + case BSIM3_MOD_NJ: + value->rValue = model->BSIM3jctEmissionCoeff; + return(OK); + case BSIM3_MOD_XTI: + value->rValue = model->BSIM3jctTempExponent; + return(OK); + case BSIM3_MOD_LINT: + value->rValue = model->BSIM3Lint; + return(OK); + case BSIM3_MOD_LL: + value->rValue = model->BSIM3Ll; + return(OK); + case BSIM3_MOD_LLC: + value->rValue = model->BSIM3Llc; + return(OK); + case BSIM3_MOD_LLN: + value->rValue = model->BSIM3Lln; + return(OK); + case BSIM3_MOD_LW: + value->rValue = model->BSIM3Lw; + return(OK); + case BSIM3_MOD_LWC: + value->rValue = model->BSIM3Lwc; + return(OK); + case BSIM3_MOD_LWN: + value->rValue = model->BSIM3Lwn; + return(OK); + case BSIM3_MOD_LWL: + value->rValue = model->BSIM3Lwl; + return(OK); + case BSIM3_MOD_LWLC: + value->rValue = model->BSIM3Lwlc; + return(OK); + case BSIM3_MOD_LMIN: + value->rValue = model->BSIM3Lmin; + return(OK); + case BSIM3_MOD_LMAX: + value->rValue = model->BSIM3Lmax; + return(OK); + case BSIM3_MOD_WINT: + value->rValue = model->BSIM3Wint; + return(OK); + case BSIM3_MOD_WL: + value->rValue = model->BSIM3Wl; + return(OK); + case BSIM3_MOD_WLC: + value->rValue = model->BSIM3Wlc; + return(OK); + case BSIM3_MOD_WLN: + value->rValue = model->BSIM3Wln; + return(OK); + case BSIM3_MOD_WW: + value->rValue = model->BSIM3Ww; + return(OK); + case BSIM3_MOD_WWC: + value->rValue = model->BSIM3Wwc; + return(OK); + case BSIM3_MOD_WWN: + value->rValue = model->BSIM3Wwn; + return(OK); + case BSIM3_MOD_WWL: + value->rValue = model->BSIM3Wwl; + return(OK); + case BSIM3_MOD_WWLC: + value->rValue = model->BSIM3Wwlc; + return(OK); + case BSIM3_MOD_WMIN: + value->rValue = model->BSIM3Wmin; + return(OK); + case BSIM3_MOD_WMAX: + value->rValue = model->BSIM3Wmax; + return(OK); - case BSIM3_MOD_PELM: - value->rValue = model->BSIM3pelm; - return (OK); - case BSIM3_MOD_PCGSL: - value->rValue = model->BSIM3pcgsl; - return (OK); - case BSIM3_MOD_PCGDL: - value->rValue = model->BSIM3pcgdl; - return (OK); - case BSIM3_MOD_PCKAPPA: - value->rValue = model->BSIM3pckappa; - return (OK); - case BSIM3_MOD_PCF: - value->rValue = model->BSIM3pcf; - return (OK); - case BSIM3_MOD_PCLC: - value->rValue = model->BSIM3pclc; - return (OK); - case BSIM3_MOD_PCLE: - value->rValue = model->BSIM3pcle; - return (OK); - case BSIM3_MOD_PVFBCV: - value->rValue = model->BSIM3pvfbcv; - return (OK); - case BSIM3_MOD_PACDE: - value->rValue = model->BSIM3pacde; - return (OK); - case BSIM3_MOD_PMOIN: - value->rValue = model->BSIM3pmoin; - return (OK); - case BSIM3_MOD_PNOFF: - value->rValue = model->BSIM3pnoff; - return (OK); - case BSIM3_MOD_PVOFFCV: - value->rValue = model->BSIM3pvoffcv; - return (OK); + case BSIM3_MOD_XL: + value->rValue = model->BSIM3xl; + return(OK); + case BSIM3_MOD_XW: + value->rValue = model->BSIM3xw; + return(OK); - case BSIM3_MOD_TNOM: - value->rValue = model->BSIM3tnom; - return (OK); - case BSIM3_MOD_CGSO: - value->rValue = model->BSIM3cgso; - return (OK); - case BSIM3_MOD_CGDO: - value->rValue = model->BSIM3cgdo; - return (OK); - case BSIM3_MOD_CGBO: - value->rValue = model->BSIM3cgbo; - return (OK); - case BSIM3_MOD_XPART: - value->rValue = model->BSIM3xpart; - return (OK); - case BSIM3_MOD_RSH: - value->rValue = model->BSIM3sheetResistance; - return (OK); - case BSIM3_MOD_JS: - value->rValue = model->BSIM3jctSatCurDensity; - return (OK); - case BSIM3_MOD_JSW: - value->rValue = model->BSIM3jctSidewallSatCurDensity; - return (OK); - case BSIM3_MOD_PB: - value->rValue = model->BSIM3bulkJctPotential; - return (OK); - case BSIM3_MOD_MJ: - value->rValue = model->BSIM3bulkJctBotGradingCoeff; - return (OK); - case BSIM3_MOD_PBSW: - value->rValue = model->BSIM3sidewallJctPotential; - return (OK); - case BSIM3_MOD_MJSW: - value->rValue = model->BSIM3bulkJctSideGradingCoeff; - return (OK); - case BSIM3_MOD_CJ: - value->rValue = model->BSIM3unitAreaJctCap; - return (OK); - case BSIM3_MOD_CJSW: - value->rValue = model->BSIM3unitLengthSidewallJctCap; - return (OK); - case BSIM3_MOD_PBSWG: - value->rValue = model->BSIM3GatesidewallJctPotential; - return (OK); - case BSIM3_MOD_MJSWG: - value->rValue = model->BSIM3bulkJctGateSideGradingCoeff; - return (OK); - case BSIM3_MOD_CJSWG: - value->rValue = model->BSIM3unitLengthGateSidewallJctCap; - return (OK); - case BSIM3_MOD_NJ: - value->rValue = model->BSIM3jctEmissionCoeff; - return (OK); - case BSIM3_MOD_XTI: - value->rValue = model->BSIM3jctTempExponent; - return (OK); - case BSIM3_MOD_LINT: - value->rValue = model->BSIM3Lint; - return (OK); - case BSIM3_MOD_LL: - value->rValue = model->BSIM3Ll; - return (OK); - case BSIM3_MOD_LLC: - value->rValue = model->BSIM3Llc; - return (OK); - case BSIM3_MOD_LLN: - value->rValue = model->BSIM3Lln; - return (OK); - case BSIM3_MOD_LW: - value->rValue = model->BSIM3Lw; - return (OK); - case BSIM3_MOD_LWC: - value->rValue = model->BSIM3Lwc; - return (OK); - case BSIM3_MOD_LWN: - value->rValue = model->BSIM3Lwn; - return (OK); - case BSIM3_MOD_LWL: - value->rValue = model->BSIM3Lwl; - return (OK); - case BSIM3_MOD_LWLC: - value->rValue = model->BSIM3Lwlc; - return (OK); - case BSIM3_MOD_LMIN: - value->rValue = model->BSIM3Lmin; - return (OK); - case BSIM3_MOD_LMAX: - value->rValue = model->BSIM3Lmax; - return (OK); - case BSIM3_MOD_WINT: - value->rValue = model->BSIM3Wint; - return (OK); - case BSIM3_MOD_WL: - value->rValue = model->BSIM3Wl; - return (OK); - case BSIM3_MOD_WLC: - value->rValue = model->BSIM3Wlc; - return (OK); - case BSIM3_MOD_WLN: - value->rValue = model->BSIM3Wln; - return (OK); - case BSIM3_MOD_WW: - value->rValue = model->BSIM3Ww; - return (OK); - case BSIM3_MOD_WWC: - value->rValue = model->BSIM3Wwc; - return (OK); - case BSIM3_MOD_WWN: - value->rValue = model->BSIM3Wwn; - return (OK); - case BSIM3_MOD_WWL: - value->rValue = model->BSIM3Wwl; - return (OK); - case BSIM3_MOD_WWLC: - value->rValue = model->BSIM3Wwlc; - return (OK); - case BSIM3_MOD_WMIN: - value->rValue = model->BSIM3Wmin; - return (OK); - case BSIM3_MOD_WMAX: - value->rValue = model->BSIM3Wmax; - return (OK); - case BSIM3_MOD_NOIA: - value->rValue = model->BSIM3oxideTrapDensityA; - return (OK); - case BSIM3_MOD_NOIB: - value->rValue = model->BSIM3oxideTrapDensityB; - return (OK); - case BSIM3_MOD_NOIC: - value->rValue = model->BSIM3oxideTrapDensityC; - return (OK); - case BSIM3_MOD_EM: - value->rValue = model->BSIM3em; - return (OK); - case BSIM3_MOD_EF: - value->rValue = model->BSIM3ef; - return (OK); - case BSIM3_MOD_AF: - value->rValue = model->BSIM3af; - return (OK); - case BSIM3_MOD_KF: - value->rValue = model->BSIM3kf; - return (OK); - default: - return (E_BADPARM); - } - /* NOTREACHED */ + case BSIM3_MOD_NOIA: + value->rValue = model->BSIM3oxideTrapDensityA; + return(OK); + case BSIM3_MOD_NOIB: + value->rValue = model->BSIM3oxideTrapDensityB; + return(OK); + case BSIM3_MOD_NOIC: + value->rValue = model->BSIM3oxideTrapDensityC; + return(OK); + case BSIM3_MOD_EM: + value->rValue = model->BSIM3em; + return(OK); + case BSIM3_MOD_EF: + value->rValue = model->BSIM3ef; + return(OK); + case BSIM3_MOD_AF: + value->rValue = model->BSIM3af; + return(OK); + case BSIM3_MOD_KF: + value->rValue = model->BSIM3kf; + return(OK); + default: + return(E_BADPARM); + } + /* NOTREACHED */ } diff --git a/src/spicelib/devices/bsim3/b3mdel.c b/src/spicelib/devices/bsim3/b3mdel.c index 190a3533d..51dcd0229 100644 --- a/src/spicelib/devices/bsim3/b3mdel.c +++ b/src/spicelib/devices/bsim3/b3mdel.c @@ -1,3 +1,5 @@ +/**** BSIM3v3.2.4, Released by Xuemei Xi 12/21/2001 ****/ + /********** * Copyright 2001 Regents of the University of California. All rights reserved. * File: b3mdel.c of BSIM3v3.2.4 @@ -7,52 +9,39 @@ * Modified by Paolo Nenzi 2002 **********/ -/* - * Release Notes: - * BSIM3v3.2.4, Released by Xuemei Xi 12/21/2001 - * BSIM3v3.2.3, Released by Xuemei Xi 10/05/2001 - * BSIM3v3.2.2, Released by Weidong Liu 04/20/1999 - * BSIM3v3.2, Released by Weidong Liu 06/16/1998 - */ - - -/*************************************/ - #include "ngspice.h" #include "bsim3def.h" #include "sperror.h" #include "suffix.h" int -BSIM3mDelete (GENmodel ** inModel, IFuid modname, GENmodel * kill) +BSIM3mDelete (GENmodel **inModel, IFuid modname, GENmodel *kill) { - BSIM3model **model = (BSIM3model **) inModel; - BSIM3model *modfast = (BSIM3model *) kill; - BSIM3instance *here; - BSIM3instance *prev = NULL; - BSIM3model **oldmod; - - oldmod = model; - for (; *model; model = &((*model)->BSIM3nextModel)) - { - if ((*model)->BSIM3modName == modname || - (modfast && *model == modfast)) - goto delgot; - oldmod = model; - } - return (E_NOMOD); - - delgot: - *oldmod = (*model)->BSIM3nextModel; /* cut deleted device out of list */ - for (here = (*model)->BSIM3instances; here; - here = here->BSIM3nextInstance) - { - if (prev) - FREE (prev); - prev = here; - } - if (prev) - FREE (prev); - FREE (*model); - return (OK); +BSIM3model **model = (BSIM3model**)inModel; +BSIM3model *modfast = (BSIM3model*)kill; +BSIM3instance *here; +BSIM3instance *prev = NULL; +BSIM3model **oldmod; + + oldmod = model; + for (; *model ; model = &((*model)->BSIM3nextModel)) + { if ((*model)->BSIM3modName == modname || + (modfast && *model == modfast)) + goto delgot; + oldmod = model; + } + return(E_NOMOD); + +delgot: + *oldmod = (*model)->BSIM3nextModel; /* cut deleted device out of list */ + for (here = (*model)->BSIM3instances; here; here = here->BSIM3nextInstance) + { if(prev) FREE(prev); + prev = here; + } + if(prev) FREE(prev); + FREE(*model); + return(OK); } + + + diff --git a/src/spicelib/devices/bsim3/b3mpar.c b/src/spicelib/devices/bsim3/b3mpar.c index caf5fb77a..c4af0117d 100644 --- a/src/spicelib/devices/bsim3/b3mpar.c +++ b/src/spicelib/devices/bsim3/b3mpar.c @@ -1,23 +1,14 @@ +/**** BSIM3v3.2.4, Released by Xuemei Xi 12/21/2001 ****/ + /********** * Copyright 2001 Regents of the University of California. All rights reserved. * File: b3mpar.c of BSIM3v3.2.4 * Author: 1995 Min-Chie Jeng and Mansun Chan. * Author: 1997-1999 Weidong Liu. * Author: 2001 Xuemei Xi - * Modified by Paolo Nenzi 2002 + * Modified by Paolo Nenzi 2002 and Dietmar Warning 2003 **********/ -/* - * Release Notes: - * BSIM3v3.2.4, Released by Xuemei Xi 12/21/2001 - * BSIM3v3.2.3, Released by Xuemei Xi 10/05/2001 - * BSIM3v3.2.2, Released by Weidong Liu 04/20/1999 - * BSIM3v3.2, Released by Weidong Liu 06/16/1998 - */ - - -/*************************************/ - #include "ngspice.h" #include "bsim3def.h" #include "ifsim.h" @@ -46,12 +37,16 @@ BSIM3mParam(int param, IFvalue *value, GENmodel *inMod) mod->BSIM3capMod = value->iValue; mod->BSIM3capModGiven = TRUE; break; + case BSIM3_MOD_ACMMOD: + mod->BSIM3acmMod = value->iValue; + mod->BSIM3acmModGiven = TRUE; + break; case BSIM3_MOD_NOIMOD : mod->BSIM3noiMod = value->iValue; mod->BSIM3noiModGiven = TRUE; break; case BSIM3_MOD_VERSION : - mod->BSIM3version = value->sValue; + mod->BSIM3version = value->sValue; mod->BSIM3versionGiven = TRUE; break; case BSIM3_MOD_TOX : @@ -441,6 +436,36 @@ BSIM3mParam(int param, IFvalue *value, GENmodel *inMod) mod->BSIM3tpbswgGiven = TRUE; break; + /* acm model */ + case BSIM3_MOD_HDIF: + mod->BSIM3hdif = value->rValue; + mod->BSIM3hdifGiven = TRUE; + break; + case BSIM3_MOD_LDIF: + mod->BSIM3ldif = value->rValue; + mod->BSIM3ldifGiven = TRUE; + break; + case BSIM3_MOD_LD: + mod->BSIM3ld = value->rValue; + mod->BSIM3ldGiven = TRUE; + break; + case BSIM3_MOD_RD: + mod->BSIM3rd = value->rValue; + mod->BSIM3rdGiven = TRUE; + break; + case BSIM3_MOD_RS: + mod->BSIM3rs = value->rValue; + mod->BSIM3rsGiven = TRUE; + break; + case BSIM3_MOD_RDC: + mod->BSIM3rdc = value->rValue; + mod->BSIM3rdcGiven = TRUE; + break; + case BSIM3_MOD_RSC: + mod->BSIM3rsc = value->rValue; + mod->BSIM3rscGiven = TRUE; + break; + /* Length dependence */ case BSIM3_MOD_LCDSC : mod->BSIM3lcdsc = value->rValue; @@ -1471,7 +1496,7 @@ BSIM3mParam(int param, IFvalue *value, GENmodel *inMod) break; case BSIM3_MOD_TNOM : - mod->BSIM3tnom = value->rValue + 273.15; + mod->BSIM3tnom = value->rValue; mod->BSIM3tnomGiven = TRUE; break; case BSIM3_MOD_CGSO : @@ -1635,6 +1660,15 @@ BSIM3mParam(int param, IFvalue *value, GENmodel *inMod) mod->BSIM3WmaxGiven = TRUE; break; + case BSIM3_MOD_XL: + mod->BSIM3xl = value->rValue; + mod->BSIM3xlGiven = TRUE; + break; + case BSIM3_MOD_XW: + mod->BSIM3xw = value->rValue; + mod->BSIM3xwGiven = TRUE; + break; + case BSIM3_MOD_NOIA : mod->BSIM3oxideTrapDensityA = value->rValue; mod->BSIM3oxideTrapDensityAGiven = TRUE; diff --git a/src/spicelib/devices/bsim3/b3noi.c b/src/spicelib/devices/bsim3/b3noi.c index 7263c79f7..12e3afc6a 100644 --- a/src/spicelib/devices/bsim3/b3noi.c +++ b/src/spicelib/devices/bsim3/b3noi.c @@ -1,3 +1,5 @@ +/**** BSIM3v3.2.4, Released by Xuemei Xi 12/21/2001 ****/ + /********** * Copyright 2001 Regents of the University of California. All rights reserved. * File: b3noi.c of BSIM3v3.2.4 @@ -5,26 +7,16 @@ * Author: 1997-1999 Weidong Liu. * Author: 2001 Xuemei Xi * Modified by Xuemei Xi, 10/05, 12/21, 2001. + * Modified bt Paolo Nenzi 2002 and Dietmar Warning 2003 **********/ -/* - * Release Notes: - * BSIM3v3.2.4, Released by Xuemei Xi 12/21/2001 - * BSIM3v3.2.3, Released by Xuemei Xi 10/05/2001 - * BSIM3v3.2.2, Released by Weidong Liu 04/20/1999 - * BSIM3v3.2, Released by Weidong Liu 06/16/1998 - */ - - -/*************************************/ - #include "ngspice.h" #include "bsim3def.h" #include "cktdefs.h" #include "iferrmsg.h" #include "noisedef.h" #include "suffix.h" -#include "const.h" /* jwan */ +#include "const.h" /* jwan */ /* * BSIM3noise (mode, operation, firstModel, ckt, data, OnDens) @@ -52,9 +44,8 @@ Flicker noise = SPICE2 model */ -extern void NevalSrc (); -extern double Nintegrate (); - +extern void NevalSrc(); +extern double Nintegrate(); /* * The StrongInversionNoiseEval function has been modified in @@ -68,106 +59,115 @@ extern double Nintegrate (); * 2002 Paolo Nenzi */ - - /* * JX: 1/f noise model is smoothed out 12/18/01. */ + double -StrongInversionNoiseEvalNew (double Vds, BSIM3model * model, - BSIM3instance * here, double freq, double temp) +StrongInversionNoiseEvalNew(double Vds, BSIM3model *model, + BSIM3instance *here, double freq, double temp) { - struct bsim3SizeDependParam *pParam; - double cd, esat, DelClm, EffFreq, N0, Nl, Vgst; - double T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, Ssi; - - pParam = here->pParam; - cd = fabs (here->BSIM3cd) * here->BSIM3m; - esat = 2.0 * pParam->BSIM3vsattemp / here->BSIM3ueff; - if (model->BSIM3em <= 0.0) - DelClm = 0.0; - else - { - T0 = ((((Vds - here->BSIM3Vdseff) / pParam->BSIM3litl) - + model->BSIM3em) / esat); - DelClm = pParam->BSIM3litl * log (MAX (T0, N_MINLOG)); +struct bsim3SizeDependParam *pParam; +double cd, esat, DelClm, EffFreq, N0, Nl; +double T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, Ssi; + + pParam = here->pParam; + cd = fabs(here->BSIM3cd); + esat = 2.0 * pParam->BSIM3vsattemp / here->BSIM3ueff; + if(model->BSIM3em<=0.0) DelClm = 0.0; + else { + T0 = ((((Vds - here->BSIM3Vdseff) / pParam->BSIM3litl) + + model->BSIM3em) / esat); + DelClm = pParam->BSIM3litl * log (MAX(T0, N_MINLOG)); } - EffFreq = pow (freq, model->BSIM3ef); - T1 = CHARGE * CHARGE * 8.62e-5 * cd * temp * here->BSIM3ueff; - T2 = 1.0e8 * EffFreq * here->BSIM3Abulk * model->BSIM3cox - * pParam->BSIM3leff * pParam->BSIM3leff; - N0 = model->BSIM3cox * here->BSIM3Vgsteff / CHARGE; - Nl = model->BSIM3cox * here->BSIM3Vgsteff - * (1.0 - here->BSIM3AbovVgst2Vtm * here->BSIM3Vdseff) / CHARGE; - - T3 = model->BSIM3oxideTrapDensityA - * log (MAX (((N0 + 2.0e14) / (Nl + 2.0e14)), N_MINLOG)); - T4 = model->BSIM3oxideTrapDensityB * (N0 - Nl); - T5 = model->BSIM3oxideTrapDensityC * 0.5 * (N0 * N0 - Nl * Nl); - - T6 = 8.62e-5 * temp * cd * cd; - T7 = 1.0e8 * EffFreq * pParam->BSIM3leff - * pParam->BSIM3leff * pParam->BSIM3weff * here->BSIM3m; - T8 = model->BSIM3oxideTrapDensityA + - model->BSIM3oxideTrapDensityB * Nl + - model->BSIM3oxideTrapDensityC * Nl * Nl; - T9 = (Nl + 2.0e14) * (Nl + 2.0e14); - - Ssi = T1 / T2 * (T3 + T4 + T5) + T6 / T7 * DelClm * T8 / T9; - return Ssi; + EffFreq = pow(freq, model->BSIM3ef); + T1 = CHARGE * CHARGE * 8.62e-5 * cd * temp * here->BSIM3ueff; + T2 = 1.0e8 * EffFreq * here->BSIM3Abulk * model->BSIM3cox + * pParam->BSIM3leff * pParam->BSIM3leff; + N0 = model->BSIM3cox * here->BSIM3Vgsteff / CHARGE; + Nl = model->BSIM3cox * here->BSIM3Vgsteff + * (1.0 - here->BSIM3AbovVgst2Vtm * here->BSIM3Vdseff) / CHARGE; + + T3 = model->BSIM3oxideTrapDensityA + * log(MAX(((N0 + 2.0e14) / (Nl + 2.0e14)), N_MINLOG)); + T4 = model->BSIM3oxideTrapDensityB * (N0 - Nl); + T5 = model->BSIM3oxideTrapDensityC * 0.5 * (N0 * N0 - Nl * Nl); + + T6 = 8.62e-5 * temp * cd * cd; + T7 = 1.0e8 * EffFreq * pParam->BSIM3leff + * pParam->BSIM3leff * pParam->BSIM3weff; + T8 = model->BSIM3oxideTrapDensityA + model->BSIM3oxideTrapDensityB * Nl + + model->BSIM3oxideTrapDensityC * Nl * Nl; + T9 = (Nl + 2.0e14) * (Nl + 2.0e14); + + Ssi = T1 / T2 * (T3 + T4 + T5) + T6 / T7 * DelClm * T8 / T9; + return Ssi; } - - /* * The code for releases: BSIM3V32, BSIM3V322, BSIM3V323 * follows */ double -StrongInversionNoiseEvalOld (double vgs, double vds, BSIM3model * model, - BSIM3instance * here, double freq, double temp) +StrongInversionNoiseEvalOld(double vgs, double vds, BSIM3model *model, + BSIM3instance *here, double freq, double temp) { struct bsim3SizeDependParam *pParam; double cd, esat, DelClm, EffFreq, N0, Nl, Vgst; - double T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, Ssi; + double T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, Ssi; pParam = here->pParam; - cd = fabs (here->BSIM3cd) * here->BSIM3m; - if (model->BSIM3em <= 0.0) /* flicker noise modified -JX */ - DelClm = 0.0; - else if (vds > here->BSIM3vdsat) + cd = fabs (here->BSIM3cd); + /* Added revision dependent code */ + if (model->BSIM3intVersion < BSIM3V323) + { + if (vds > here->BSIM3vdsat) { esat = 2.0 * pParam->BSIM3vsattemp / here->BSIM3ueff; T0 = ((((vds - here->BSIM3vdsat) / pParam->BSIM3litl) + - model->BSIM3em) / esat); + model->BSIM3em) / esat); DelClm = pParam->BSIM3litl * log (MAX (T0, N_MINLOG)); } + else + DelClm = 0.0; + } else - DelClm = 0.0; + { + if (model->BSIM3em <= 0.0) /* flicker noise modified -JX */ + DelClm = 0.0; + else if (vds > here->BSIM3vdsat) + { + esat = 2.0 * pParam->BSIM3vsattemp / here->BSIM3ueff; + T0 = ((((vds - here->BSIM3vdsat) / pParam->BSIM3litl) + + model->BSIM3em) / esat); + DelClm = pParam->BSIM3litl * log (MAX (T0, N_MINLOG)); + } + else + DelClm = 0.0; + } EffFreq = pow (freq, model->BSIM3ef); T1 = CHARGE * CHARGE * 8.62e-5 * cd * temp * here->BSIM3ueff; T2 = 1.0e8 * EffFreq * model->BSIM3cox - * pParam->BSIM3leff * pParam->BSIM3leff; + * pParam->BSIM3leff * pParam->BSIM3leff; Vgst = vgs - here->BSIM3von; N0 = model->BSIM3cox * Vgst / CHARGE; if (N0 < 0.0) - N0 = 0.0; + N0 = 0.0; Nl = model->BSIM3cox * (Vgst - MIN (vds, here->BSIM3vdsat)) / CHARGE; if (Nl < 0.0) - Nl = 0.0; + Nl = 0.0; T3 = model->BSIM3oxideTrapDensityA - * log (MAX (((N0 + 2.0e14) / (Nl + 2.0e14)), N_MINLOG)); + * log (MAX (((N0 + 2.0e14) / (Nl + 2.0e14)), N_MINLOG)); T4 = model->BSIM3oxideTrapDensityB * (N0 - Nl); T5 = model->BSIM3oxideTrapDensityC * 0.5 * (N0 * N0 - Nl * Nl); T6 = 8.62e-5 * temp * cd * cd; T7 = 1.0e8 * EffFreq * pParam->BSIM3leff - * pParam->BSIM3leff * pParam->BSIM3weff * here->BSIM3m; - T8 = model->BSIM3oxideTrapDensityA + - model->BSIM3oxideTrapDensityB * Nl + - model->BSIM3oxideTrapDensityC * Nl * Nl; + * pParam->BSIM3leff * pParam->BSIM3weff; + T8 = model->BSIM3oxideTrapDensityA + model->BSIM3oxideTrapDensityB * Nl + + model->BSIM3oxideTrapDensityC * Nl * Nl; T9 = (Nl + 2.0e14) * (Nl + 2.0e14); Ssi = T1 / T2 * (T3 + T4 + T5) + T6 / T7 * DelClm * T8 / T9; @@ -177,388 +177,329 @@ StrongInversionNoiseEvalOld (double vgs, double vds, BSIM3model * model, int -BSIM3noise (int mode, int operation, GENmodel * inModel, CKTcircuit * ckt, - Ndata * data, double *OnDens) +BSIM3noise (int mode, int operation, GENmodel *inModel, CKTcircuit *ckt, + Ndata *data, double *OnDens) { - BSIM3model *model = (BSIM3model *) inModel; - BSIM3instance *here; - struct bsim3SizeDependParam *pParam; - char name[N_MXVLNTH]; - double tempOnoise; - double tempInoise; - double noizDens[BSIM3NSRCS]; - double lnNdens[BSIM3NSRCS]; - - double vgs, vds, Slimit; - double N0, Nl; - double T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13; - double n, ExpArg, Ssi, Swi; - - int error, i; - - /* define the names of the noise sources */ - static char *BSIM3nNames[BSIM3NSRCS] = { /* Note that we have to keep the order */ - ".rd", /* noise due to rd */ - /* consistent with the index definitions */ - ".rs", /* noise due to rs */ - /* in BSIM3defs.h */ - ".id", /* noise due to id */ - ".1overf", /* flicker (1/f) noise */ - "" /* total transistor noise */ - }; - - for (; model != NULL; model = model->BSIM3nextModel) - { - for (here = model->BSIM3instances; here != NULL; - here = here->BSIM3nextInstance) - { - if (here->BSIM3owner != ARCHme) - continue; - pParam = here->pParam; - switch (operation) - { - case N_OPEN: - /* see if we have to to produce a summary report */ - /* if so, name all the noise generators */ - - if (((NOISEAN *) ckt->CKTcurJob)->NStpsSm != 0) - { - switch (mode) - { - case N_DENS: - for (i = 0; i < BSIM3NSRCS; i++) - { - (void) sprintf (name, - "onoise.%s%s", - here->BSIM3name, BSIM3nNames[i]); - data->namelist = - (IFuid *) - trealloc ((char *) data->namelist, - (data->numPlots + 1) * sizeof (IFuid)); - if (!data->namelist) - return (E_NOMEM); - (* - (SPfrontEnd-> - IFnewUid)) (ckt, - &(data-> - namelist - [data-> - numPlots++]), - (IFuid) - NULL, - name, UID_OTHER, (void **) NULL); - /* we've added one more plot */ - } - break; - case INT_NOIZ: - for (i = 0; i < BSIM3NSRCS; i++) - { - (void) sprintf (name, - "onoise_total.%s%s", - here->BSIM3name, BSIM3nNames[i]); - data->namelist = - (IFuid *) - trealloc ((char *) data->namelist, - (data->numPlots + 1) * sizeof (IFuid)); - if (!data->namelist) - return (E_NOMEM); - (* - (SPfrontEnd-> - IFnewUid)) (ckt, - &(data-> - namelist - [data-> - numPlots++]), - (IFuid) - NULL, - name, UID_OTHER, (void **) NULL); - /* we've added one more plot */ - - (void) sprintf (name, - "inoise_total.%s%s", - here->BSIM3name, BSIM3nNames[i]); - data->namelist = - (IFuid *) - trealloc ((char *) data->namelist, - (data->numPlots + 1) * sizeof (IFuid)); - if (!data->namelist) - return (E_NOMEM); - (* - (SPfrontEnd-> - IFnewUid)) (ckt, - &(data-> - namelist - [data-> - numPlots++]), - (IFuid) - NULL, - name, UID_OTHER, (void **) NULL); - /* we've added one more plot */ - } - break; - } - } - break; - case N_CALC: - switch (mode) - { - case N_DENS: - NevalSrc (&noizDens[BSIM3RDNOIZ], - &lnNdens[BSIM3RDNOIZ], ckt, - THERMNOISE, - here->BSIM3dNodePrime, - here->BSIM3dNode, - here->BSIM3drainConductance * here->BSIM3m); - NevalSrc (&noizDens[BSIM3RSNOIZ], - &lnNdens[BSIM3RSNOIZ], ckt, - THERMNOISE, - here->BSIM3sNodePrime, - here->BSIM3sNode, - here->BSIM3sourceConductance * here->BSIM3m); - - switch (model->BSIM3noiMod) - { - case 1: - case 3: - NevalSrc (&noizDens - [BSIM3IDNOIZ], - &lnNdens - [BSIM3IDNOIZ], ckt, - THERMNOISE, - here-> - BSIM3dNodePrime, - here-> - BSIM3sNodePrime, - (2.0 / 3.0 * - fabs (here-> - BSIM3gm + - here-> - BSIM3gds + - here->BSIM3gmbs)) * here->BSIM3m); - +BSIM3model *model = (BSIM3model *)inModel; +BSIM3instance *here; +struct bsim3SizeDependParam *pParam; +char name[N_MXVLNTH]; +double tempOnoise; +double tempInoise; +double noizDens[BSIM3NSRCS]; +double lnNdens[BSIM3NSRCS]; + +double vgs, vds, Slimit; +double T1, T10, T11; +double Ssi, Swi; + +double m; + +int i; + + /* define the names of the noise sources */ + static char *BSIM3nNames[BSIM3NSRCS] = + { /* Note that we have to keep the order */ + ".rd", /* noise due to rd */ + /* consistent with the index definitions */ + ".rs", /* noise due to rs */ + /* in BSIM3defs.h */ + ".id", /* noise due to id */ + ".1overf", /* flicker (1/f) noise */ + "" /* total transistor noise */ + }; + + for (; model != NULL; model = model->BSIM3nextModel) + { for (here = model->BSIM3instances; here != NULL; + here = here->BSIM3nextInstance) + { pParam = here->pParam; + switch (operation) + { case N_OPEN: + /* see if we have to to produce a summary report */ + /* if so, name all the noise generators */ + + if (((NOISEAN*)ckt->CKTcurJob)->NStpsSm != 0) + { switch (mode) + { case N_DENS: + for (i = 0; i < BSIM3NSRCS; i++) + { (void) sprintf(name, "onoise.%s%s", + here->BSIM3name, + BSIM3nNames[i]); + data->namelist = (IFuid *) trealloc( + (char *) data->namelist, + (data->numPlots + 1) + * sizeof(IFuid)); + if (!data->namelist) + return(E_NOMEM); + (*(SPfrontEnd->IFnewUid)) (ckt, + &(data->namelist[data->numPlots++]), + (IFuid) NULL, name, UID_OTHER, + (void **) NULL); + /* we've added one more plot */ + } + break; + case INT_NOIZ: + for (i = 0; i < BSIM3NSRCS; i++) + { (void) sprintf(name, "onoise_total.%s%s", + here->BSIM3name, + BSIM3nNames[i]); + data->namelist = (IFuid *) trealloc( + (char *) data->namelist, + (data->numPlots + 1) + * sizeof(IFuid)); + if (!data->namelist) + return(E_NOMEM); + (*(SPfrontEnd->IFnewUid)) (ckt, + &(data->namelist[data->numPlots++]), + (IFuid) NULL, name, UID_OTHER, + (void **) NULL); + /* we've added one more plot */ + + (void) sprintf(name, "inoise_total.%s%s", + here->BSIM3name, + BSIM3nNames[i]); + data->namelist = (IFuid *) trealloc( + (char *) data->namelist, + (data->numPlots + 1) + * sizeof(IFuid)); + if (!data->namelist) + return(E_NOMEM); + (*(SPfrontEnd->IFnewUid)) (ckt, + &(data->namelist[data->numPlots++]), + (IFuid) NULL, name, UID_OTHER, + (void **)NULL); + /* we've added one more plot */ + } + break; + } + } break; - case 2: - case 4: - NevalSrc (&noizDens[BSIM3IDNOIZ], &lnNdens[BSIM3IDNOIZ], ckt, - THERMNOISE, here->BSIM3dNodePrime, here->BSIM3sNodePrime, - (here->BSIM3ueff * fabs (here->BSIM3qinv) * here->BSIM3m / - (pParam->BSIM3leff * pParam->BSIM3leff + here->BSIM3ueff * - fabs (here->BSIM3qinv) * here->BSIM3m * - (here->BSIM3rds / here->BSIM3m)))); /* bugfix */ - - - break; - } - NevalSrc (&noizDens[BSIM3FLNOIZ], - (double *) NULL, ckt, - N_GAIN, - here->BSIM3dNodePrime, - here->BSIM3sNodePrime, (double) 0.0); - - - - switch (model->BSIM3noiMod) - { - case 1: - case 4: - noizDens[BSIM3FLNOIZ] *= - model->BSIM3kf * - exp (model->BSIM3af * - log (MAX - (fabs - (here-> - BSIM3cd * - here-> - BSIM3m), - N_MINLOG))) - / - (pow - (data->freq, - model->BSIM3ef) * - pParam->BSIM3leff * - pParam->BSIM3leff * model->BSIM3cox); - - - break; - case 2: - case 3: - vgs = *(ckt->CKTstates[0] + here->BSIM3vgs); - vds = *(ckt->CKTstates[0] + here->BSIM3vds); - if (vds < 0.0) - { - vds = -vds; - vgs = vgs + vds; - } - /* Added revision dependent code */ - if (model->BSIM3intVersion == BSIM3V324) - { - Ssi = - StrongInversionNoiseEvalNew (vds, model, here, - data->freq, - ckt->CKTtemp); - T10 = - model->BSIM3oxideTrapDensityA * 8.62e-5 * - ckt->CKTtemp; - T11 = - pParam->BSIM3weff * here->BSIM3m * - pParam->BSIM3leff * pow (data->freq, - model->BSIM3ef) * 4.0e36; - Swi = - T10 / T11 * here->BSIM3cd * here->BSIM3m * - here->BSIM3cd * here->BSIM3m; - T1 = Swi + Ssi; - if (T1 > 0.0) - noizDens[BSIM3FLNOIZ] *= (Ssi * Swi) / T1; - else - noizDens[BSIM3FLNOIZ] *= 0.0; - } - else - { /*BSIM3V32 || BSIM3V322 || BSIM3V323 */ - if (vgs >= here->BSIM3von + 0.1) - { - Ssi = - StrongInversionNoiseEvalOld (vgs, vds, model, - here, data->freq, - ckt->CKTtemp); - noizDens[BSIM3FLNOIZ] *= Ssi; - } - else - { - pParam = here->pParam; - T10 = model-> - BSIM3oxideTrapDensityA - * 8.62e-5 * ckt->CKTtemp; - T11 = pParam->BSIM3weff * - here->BSIM3m * pParam-> BSIM3leff * - pow (data->freq, model->BSIM3ef) * 4.0e36; - Swi = T10 / T11 * (here->BSIM3cd * here->BSIM3m) * (here->BSIM3cd * here->BSIM3m); - - Slimit = - StrongInversionNoiseEvalOld (here->BSIM3von + - 0.1, vds, model, - here, data->freq, - ckt->CKTtemp); - T1 = Swi + Slimit; - if (T1 > 0.0) - noizDens[BSIM3FLNOIZ] *= (Slimit * Swi) / T1; + case N_CALC: + m = here->BSIM3m; + switch (mode) + { case N_DENS: + NevalSrc(&noizDens[BSIM3RDNOIZ], + &lnNdens[BSIM3RDNOIZ], ckt, THERMNOISE, + here->BSIM3dNodePrime, here->BSIM3dNode, + here->BSIM3drainConductance * m); + + NevalSrc(&noizDens[BSIM3RSNOIZ], + &lnNdens[BSIM3RSNOIZ], ckt, THERMNOISE, + here->BSIM3sNodePrime, here->BSIM3sNode, + here->BSIM3sourceConductance * m); + + switch( model->BSIM3noiMod ) + { case 1: + case 3: + NevalSrc(&noizDens[BSIM3IDNOIZ], + &lnNdens[BSIM3IDNOIZ], ckt, + THERMNOISE, here->BSIM3dNodePrime, + here->BSIM3sNodePrime, + (2.0 / 3.0 * fabs(here->BSIM3gm + + here->BSIM3gds + + here->BSIM3gmbs)) * m); + break; + case 2: + case 4: + /* Added revision dependent code */ + if (model->BSIM3intVersion == BSIM3V324) + { + NevalSrc(&noizDens[BSIM3IDNOIZ], + &lnNdens[BSIM3IDNOIZ], ckt, + THERMNOISE, here->BSIM3dNodePrime, + here->BSIM3sNodePrime, + (m * here->BSIM3ueff + * fabs(here->BSIM3qinv) + / (pParam->BSIM3leff * pParam->BSIM3leff + + here->BSIM3ueff * fabs(here->BSIM3qinv) + * here->BSIM3rds))); /* bugfix */ + } + else + { /* for all versions lower then 3.2.4 */ + NevalSrc(&noizDens[BSIM3IDNOIZ], + &lnNdens[BSIM3IDNOIZ], ckt, + THERMNOISE, here->BSIM3dNodePrime, + here->BSIM3sNodePrime, + (m * here->BSIM3ueff + * fabs(here->BSIM3qinv + / (pParam->BSIM3leff + * pParam->BSIM3leff)))); + } + break; + } + NevalSrc(&noizDens[BSIM3FLNOIZ], (double*) NULL, + ckt, N_GAIN, here->BSIM3dNodePrime, + here->BSIM3sNodePrime, (double) 0.0); + + switch( model->BSIM3noiMod ) + { case 1: + case 4: + noizDens[BSIM3FLNOIZ] *= m * model->BSIM3kf + * exp(model->BSIM3af + * log(MAX(fabs(here->BSIM3cd), + N_MINLOG))) + / (pow(data->freq, model->BSIM3ef) + * pParam->BSIM3leff + * pParam->BSIM3leff + * model->BSIM3cox); + break; + case 2: + case 3: + vgs = *(ckt->CKTstates[0] + here->BSIM3vgs); + vds = *(ckt->CKTstates[0] + here->BSIM3vds); + if (vds < 0.0) + { vds = -vds; + vgs = vgs + vds; + } + /* Added revision dependent code */ + if (model->BSIM3intVersion == BSIM3V324) + { + Ssi = StrongInversionNoiseEvalNew(vds, model, + here, data->freq, ckt->CKTtemp); + T10 = model->BSIM3oxideTrapDensityA + * 8.62e-5 * ckt->CKTtemp; + T11 = pParam->BSIM3weff + * pParam->BSIM3leff + * pow(data->freq, model->BSIM3ef) + * 4.0e36; + Swi = T10 / T11 * here->BSIM3cd + * here->BSIM3cd; + T1 = Swi + Ssi; + if (T1 > 0.0) + noizDens[BSIM3FLNOIZ] *= m * (Ssi * Swi) / T1; + else + noizDens[BSIM3FLNOIZ] *= 0.0; + } + else + { /* for all versions lower then 3.2.4 */ + if (vgs >= here->BSIM3von + 0.1) + { + Ssi = StrongInversionNoiseEvalOld(vgs, vds, model, + here, data->freq, ckt->CKTtemp); + noizDens[BSIM3FLNOIZ] *= m * Ssi; + } + else + { + pParam = here->pParam; + T10 = model->BSIM3oxideTrapDensityA + * 8.62e-5 * ckt->CKTtemp; + T11 = pParam->BSIM3weff + * pParam-> BSIM3leff + * pow (data->freq, model->BSIM3ef) + * 4.0e36; + Swi = T10 / T11 * here->BSIM3cd * here->BSIM3cd; + + Slimit = StrongInversionNoiseEvalOld( + here->BSIM3von + 0.1, vds, model, + here, data->freq, ckt->CKTtemp); + T1 = Swi + Slimit; + if (T1 > 0.0) + noizDens[BSIM3FLNOIZ] *= m * (Slimit * Swi) / T1; + else + noizDens[BSIM3FLNOIZ] *= 0.0; + } + } + break; + } + + lnNdens[BSIM3FLNOIZ] = + log(MAX(noizDens[BSIM3FLNOIZ], N_MINLOG)); + + noizDens[BSIM3TOTNOIZ] = noizDens[BSIM3RDNOIZ] + + noizDens[BSIM3RSNOIZ] + + noizDens[BSIM3IDNOIZ] + + noizDens[BSIM3FLNOIZ]; + lnNdens[BSIM3TOTNOIZ] = + log(MAX(noizDens[BSIM3TOTNOIZ], N_MINLOG)); + + *OnDens += noizDens[BSIM3TOTNOIZ]; + + if (data->delFreq == 0.0) + { /* if we haven't done any previous + integration, we need to initialize our + "history" variables. + */ + + for (i = 0; i < BSIM3NSRCS; i++) + { here->BSIM3nVar[LNLSTDENS][i] = + lnNdens[i]; + } + + /* clear out our integration variables + if it's the first pass + */ + if (data->freq == + ((NOISEAN*) ckt->CKTcurJob)->NstartFreq) + { for (i = 0; i < BSIM3NSRCS; i++) + { here->BSIM3nVar[OUTNOIZ][i] = 0.0; + here->BSIM3nVar[INNOIZ][i] = 0.0; + } + } + } else - noizDens[BSIM3FLNOIZ] *= 0.0; - } - } + { /* data->delFreq != 0.0, + we have to integrate. + */ + for (i = 0; i < BSIM3NSRCS; i++) + { if (i != BSIM3TOTNOIZ) + { tempOnoise = Nintegrate(noizDens[i], + lnNdens[i], + here->BSIM3nVar[LNLSTDENS][i], + data); + tempInoise = Nintegrate(noizDens[i] + * data->GainSqInv, lnNdens[i] + + data->lnGainInv, + here->BSIM3nVar[LNLSTDENS][i] + + data->lnGainInv, data); + here->BSIM3nVar[LNLSTDENS][i] = + lnNdens[i]; + data->outNoiz += tempOnoise; + data->inNoise += tempInoise; + if (((NOISEAN*) + ckt->CKTcurJob)->NStpsSm != 0) + { here->BSIM3nVar[OUTNOIZ][i] + += tempOnoise; + here->BSIM3nVar[OUTNOIZ][BSIM3TOTNOIZ] + += tempOnoise; + here->BSIM3nVar[INNOIZ][i] + += tempInoise; + here->BSIM3nVar[INNOIZ][BSIM3TOTNOIZ] + += tempInoise; + } + } + } + } + if (data->prtSummary) + { for (i = 0; i < BSIM3NSRCS; i++) + { /* print a summary report */ + data->outpVector[data->outNumber++] + = noizDens[i]; + } + } + break; + case INT_NOIZ: + /* already calculated, just output */ + if (((NOISEAN*)ckt->CKTcurJob)->NStpsSm != 0) + { for (i = 0; i < BSIM3NSRCS; i++) + { data->outpVector[data->outNumber++] + = here->BSIM3nVar[OUTNOIZ][i]; + data->outpVector[data->outNumber++] + = here->BSIM3nVar[INNOIZ][i]; + } + } + break; + } break; - } - - - lnNdens[BSIM3FLNOIZ] = - log (MAX (noizDens[BSIM3FLNOIZ], N_MINLOG)); - - noizDens[BSIM3TOTNOIZ] = - noizDens[BSIM3RDNOIZ] + - noizDens[BSIM3RSNOIZ] + - noizDens[BSIM3IDNOIZ] + noizDens[BSIM3FLNOIZ]; - - - lnNdens[BSIM3TOTNOIZ] = - log (MAX (noizDens[BSIM3TOTNOIZ], N_MINLOG)); - - *OnDens += noizDens[BSIM3TOTNOIZ]; - - if (data->delFreq == 0.0) - { /* if we haven't done any previous - * integration, we need to initialize our - * "history" variables. - */ - - for (i = 0; i < BSIM3NSRCS; i++) - { - here->BSIM3nVar[LNLSTDENS][i] = lnNdens[i]; - } - - /* clear out our integration variables - * if it's the first pass - */ - if (data->freq == - ((NOISEAN *) ckt->CKTcurJob)->NstartFreq) - { - for (i = 0; i < BSIM3NSRCS; i++) - { - here->BSIM3nVar[OUTNOIZ][i] = 0.0; - here->BSIM3nVar[INNOIZ][i] = 0.0; - } - } - } - else - { /* data->delFreq != 0.0, - * we have to integrate. - */ - for (i = 0; i < BSIM3NSRCS; i++) - { - if (i != BSIM3TOTNOIZ) - { - tempOnoise = - Nintegrate - (noizDens - [i], - lnNdens - [i], here->BSIM3nVar[LNLSTDENS][i], data); - tempInoise = - Nintegrate - (noizDens - [i] * - data-> - GainSqInv, - lnNdens - [i] + - data-> - lnGainInv, - here-> - BSIM3nVar - [LNLSTDENS][i] + data->lnGainInv, data); - here->BSIM3nVar[LNLSTDENS][i] = lnNdens[i]; - data->outNoiz += tempOnoise; - data->inNoise += tempInoise; - if (((NOISEAN *) ckt->CKTcurJob)->NStpsSm != 0) - { - here->BSIM3nVar[OUTNOIZ][i] += tempOnoise; - here->BSIM3nVar[OUTNOIZ][BSIM3TOTNOIZ] += - tempOnoise; - here->BSIM3nVar[INNOIZ][i] += tempInoise; - here->BSIM3nVar[INNOIZ][BSIM3TOTNOIZ] += - tempInoise; - } - } - } - } - if (data->prtSummary) - { - for (i = 0; i < BSIM3NSRCS; i++) - { /* print a summary report */ - data->outpVector[data->outNumber++] = noizDens[i]; - } - } - break; - case INT_NOIZ: - /* already calculated, just output */ - if (((NOISEAN *) ckt->CKTcurJob)->NStpsSm != 0) - { - for (i = 0; i < BSIM3NSRCS; i++) - { - data->outpVector - [data->outNumber++] = here->BSIM3nVar[OUTNOIZ][i]; - data->outpVector - [data->outNumber++] = here->BSIM3nVar[INNOIZ][i]; - } - } - break; - } - break; - case N_CLOSE: - /* do nothing, the main calling routine will close */ - return (OK); - break; /* the plots */ - } /* switch (operation) */ - } /* for here */ - } /* for model */ - - return (OK); + case N_CLOSE: + /* do nothing, the main calling routine will close */ + return (OK); + break; /* the plots */ + } /* switch (operation) */ + } /* for here */ + } /* for model */ + + return(OK); } + + + diff --git a/src/spicelib/devices/bsim3/b3par.c b/src/spicelib/devices/bsim3/b3par.c index bc2b3fe1b..3a4e542b2 100644 --- a/src/spicelib/devices/bsim3/b3par.c +++ b/src/spicelib/devices/bsim3/b3par.c @@ -1,23 +1,14 @@ +/**** BSIM3v3.2.4, Released by Xuemei Xi 12/21/2001 ****/ + /********** * Copyright 2001 Regents of the University of California. All rights reserved. * File: b3par.c of BSIM3v3.2.4 * Author: 1995 Min-Chie Jeng and Mansun Chan * Author: 1997-1999 Weidong Liu. * Author: 2001 Xuemei Xi - * Modified by Paolo Nenzi 2002 + * Modified by Paolo Nenzi 2002 and Dietmar Warning 2003 **********/ -/* - * Release Notes: - * BSIM3v3.2.4, Released by Xuemei Xi 12/21/2001 - * BSIM3v3.2.3, Released by Xuemei Xi 10/05/2001 - * BSIM3v3.2.2, Released by Weidong Liu 04/20/1999 - * BSIM3v3.2, Released by Weidong Liu 06/16/1998 - */ - - -/*************************************/ - #include "ngspice.h" #include "ifsim.h" #include "bsim3def.h" @@ -25,85 +16,86 @@ #include "suffix.h" int -BSIM3param (int param, IFvalue * value, GENinstance * inst, IFvalue * select) +BSIM3param (int param, IFvalue *value, GENinstance *inst, IFvalue *select) { - BSIM3instance *here = (BSIM3instance *) inst; - switch (param) - { - case BSIM3_W: - here->BSIM3w = value->rValue; - here->BSIM3wGiven = TRUE; - break; - case BSIM3_L: - here->BSIM3l = value->rValue; - here->BSIM3lGiven = TRUE; - break; + BSIM3instance *here = (BSIM3instance*)inst; + switch(param) + { case BSIM3_W: + here->BSIM3w = value->rValue; + here->BSIM3wGiven = TRUE; + break; + case BSIM3_L: + here->BSIM3l = value->rValue; + here->BSIM3lGiven = TRUE; + break; case BSIM3_M: - here->BSIM3m = value->rValue; - here->BSIM3mGiven = TRUE; - break; - case BSIM3_AS: - here->BSIM3sourceArea = value->rValue; - here->BSIM3sourceAreaGiven = TRUE; - break; - case BSIM3_AD: - here->BSIM3drainArea = value->rValue; - here->BSIM3drainAreaGiven = TRUE; - break; - case BSIM3_PS: - here->BSIM3sourcePerimeter = value->rValue; - here->BSIM3sourcePerimeterGiven = TRUE; - break; - case BSIM3_PD: - here->BSIM3drainPerimeter = value->rValue; - here->BSIM3drainPerimeterGiven = TRUE; - break; - case BSIM3_NRS: - here->BSIM3sourceSquares = value->rValue; - here->BSIM3sourceSquaresGiven = TRUE; - break; - case BSIM3_NRD: - here->BSIM3drainSquares = value->rValue; - here->BSIM3drainSquaresGiven = TRUE; - break; - case BSIM3_OFF: - here->BSIM3off = value->iValue; - break; - case BSIM3_IC_VBS: - here->BSIM3icVBS = value->rValue; - here->BSIM3icVBSGiven = TRUE; - break; - case BSIM3_IC_VDS: - here->BSIM3icVDS = value->rValue; - here->BSIM3icVDSGiven = TRUE; - break; - case BSIM3_IC_VGS: - here->BSIM3icVGS = value->rValue; - here->BSIM3icVGSGiven = TRUE; - break; - case BSIM3_NQSMOD: - here->BSIM3nqsMod = value->iValue; - here->BSIM3nqsModGiven = TRUE; - break; - case BSIM3_IC: - switch (value->v.numValue) - { - case 3: - here->BSIM3icVBS = *(value->v.vec.rVec + 2); - here->BSIM3icVBSGiven = TRUE; - case 2: - here->BSIM3icVGS = *(value->v.vec.rVec + 1); - here->BSIM3icVGSGiven = TRUE; - case 1: - here->BSIM3icVDS = *(value->v.vec.rVec); - here->BSIM3icVDSGiven = TRUE; - break; - default: - return (E_BADPARM); - } - break; - default: - return (E_BADPARM); - } - return (OK); + here->BSIM3m = value->rValue; + here->BSIM3mGiven = TRUE; + break; + case BSIM3_AS: + here->BSIM3sourceArea = value->rValue; + here->BSIM3sourceAreaGiven = TRUE; + break; + case BSIM3_AD: + here->BSIM3drainArea = value->rValue; + here->BSIM3drainAreaGiven = TRUE; + break; + case BSIM3_PS: + here->BSIM3sourcePerimeter = value->rValue; + here->BSIM3sourcePerimeterGiven = TRUE; + break; + case BSIM3_PD: + here->BSIM3drainPerimeter = value->rValue; + here->BSIM3drainPerimeterGiven = TRUE; + break; + case BSIM3_NRS: + here->BSIM3sourceSquares = value->rValue; + here->BSIM3sourceSquaresGiven = TRUE; + break; + case BSIM3_NRD: + here->BSIM3drainSquares = value->rValue; + here->BSIM3drainSquaresGiven = TRUE; + break; + case BSIM3_OFF: + here->BSIM3off = value->iValue; + break; + case BSIM3_IC_VBS: + here->BSIM3icVBS = value->rValue; + here->BSIM3icVBSGiven = TRUE; + break; + case BSIM3_IC_VDS: + here->BSIM3icVDS = value->rValue; + here->BSIM3icVDSGiven = TRUE; + break; + case BSIM3_IC_VGS: + here->BSIM3icVGS = value->rValue; + here->BSIM3icVGSGiven = TRUE; + break; + case BSIM3_NQSMOD: + here->BSIM3nqsMod = value->iValue; + here->BSIM3nqsModGiven = TRUE; + break; + case BSIM3_IC: + switch(value->v.numValue){ + case 3: + here->BSIM3icVBS = *(value->v.vec.rVec+2); + here->BSIM3icVBSGiven = TRUE; + case 2: + here->BSIM3icVGS = *(value->v.vec.rVec+1); + here->BSIM3icVGSGiven = TRUE; + case 1: + here->BSIM3icVDS = *(value->v.vec.rVec); + here->BSIM3icVDSGiven = TRUE; + break; + default: + return(E_BADPARM); + } + break; + default: + return(E_BADPARM); + } + return(OK); } + + + diff --git a/src/spicelib/devices/bsim3/b3pzld.c b/src/spicelib/devices/bsim3/b3pzld.c index a6d54de4c..8dffbd7d3 100644 --- a/src/spicelib/devices/bsim3/b3pzld.c +++ b/src/spicelib/devices/bsim3/b3pzld.c @@ -1,3 +1,5 @@ +/**** BSIM3v3.2.4, Released by Xuemei Xi 12/21/2001 ****/ + /********** * Copyright 2001 Regents of the University of California. All rights reserved. * File: b3pzld.c of BSIM3v3.2.4 @@ -7,17 +9,6 @@ * Modified by Paolo Nenzi 2002 **********/ -/* - * Release Notes: - * BSIM3v3.2.4, Released by Xuemei Xi 12/21/2001 - * BSIM3v3.2.3, Released by Xuemei Xi 10/05/2001 - * BSIM3v3.2.2, Released by Weidong Liu 04/20/1999 - * BSIM3v3.2, Released by Weidong Liu 06/16/1998 - */ - - -/*************************************/ - #include "ngspice.h" #include "cktdefs.h" #include "complex.h" @@ -26,453 +17,355 @@ #include "suffix.h" int -BSIM3pzLoad (GENmodel * inModel, CKTcircuit * ckt, SPcomplex * s) +BSIM3pzLoad (GENmodel *inModel, CKTcircuit *ckt, SPcomplex *s) { - BSIM3model *model = (BSIM3model *) inModel; - BSIM3instance *here; - double xcggb, xcgdb, xcgsb, xcgbb, xcbgb, xcbdb, xcbsb, xcbbb; - double xcdgb, xcddb, xcdsb, xcdbb, xcsgb, xcsdb, xcssb, xcsbb; - double gdpr, gspr, gds, gbd, gbs, capbd, capbs, FwdSum, RevSum, Gm, - Gmbs; - double cggb, cgdb, cgsb, cbgb, cbdb, cbsb, cddb, cdgb, cdsb; - double GSoverlapCap, GDoverlapCap, GBoverlapCap; - double dxpart, sxpart, xgtg, xgtd, xgts, xgtb, xcqgb, xcqdb, xcqsb, - xcqbb; - double gbspsp, gbbdp, gbbsp, gbspg, gbspb; - double gbspdp, gbdpdp, gbdpg, gbdpb, gbdpsp; - double ddxpart_dVd, ddxpart_dVg, ddxpart_dVb, ddxpart_dVs; - double dsxpart_dVd, dsxpart_dVg, dsxpart_dVb, dsxpart_dVs; - double T1, CoxWL, qcheq, Cdg, Cdd, Cds, Cdb, Csg, Csd, Css, Csb; - double ScalingFactor = 1.0e-9; - double m; - - for (; model != NULL; model = model->BSIM3nextModel) - { - for (here = model->BSIM3instances; here != NULL; - here = here->BSIM3nextInstance) - { - if (here->BSIM3owner != ARCHme) - continue; - if (here->BSIM3mode >= 0) - { - Gm = here->BSIM3gm; - Gmbs = here->BSIM3gmbs; - FwdSum = Gm + Gmbs; - RevSum = 0.0; - - gbbdp = -here->BSIM3gbds; - gbbsp = here->BSIM3gbds + here->BSIM3gbgs + - here->BSIM3gbbs; - - gbdpg = here->BSIM3gbgs; - gbdpdp = here->BSIM3gbds; - gbdpb = here->BSIM3gbbs; - gbdpsp = -(gbdpg + gbdpdp + gbdpb); - - gbspg = 0.0; - gbspdp = 0.0; - gbspb = 0.0; - gbspsp = 0.0; - - if (here->BSIM3nqsMod == 0) - { - cggb = here->BSIM3cggb; - cgsb = here->BSIM3cgsb; - cgdb = here->BSIM3cgdb; - - cbgb = here->BSIM3cbgb; - cbsb = here->BSIM3cbsb; - cbdb = here->BSIM3cbdb; - - cdgb = here->BSIM3cdgb; - cdsb = here->BSIM3cdsb; - cddb = here->BSIM3cddb; - - xgtg = xgtd = xgts = xgtb = 0.0; - sxpart = 0.6; - dxpart = 0.4; - ddxpart_dVd = ddxpart_dVg = - ddxpart_dVb = ddxpart_dVs = - 0.0; - dsxpart_dVd = dsxpart_dVg = - dsxpart_dVb = dsxpart_dVs = - 0.0; - } - else - { - cggb = cgdb = cgsb = 0.0; - cbgb = cbdb = cbsb = 0.0; - cdgb = cddb = cdsb = 0.0; - - xgtg = here->BSIM3gtg; - xgtd = here->BSIM3gtd; - xgts = here->BSIM3gts; - xgtb = here->BSIM3gtb; - - xcqgb = here->BSIM3cqgb; - xcqdb = here->BSIM3cqdb; - xcqsb = here->BSIM3cqsb; - xcqbb = here->BSIM3cqbb; - - CoxWL = model->BSIM3cox * - here->pParam->BSIM3weffCV * - here->pParam->BSIM3leffCV; - qcheq = -(here->BSIM3qgate + - here->BSIM3qbulk); - if (fabs (qcheq) <= 1.0e-5 * CoxWL) - { - if (model->BSIM3xpart < 0.5) - { - dxpart = 0.4; - } - else if (model->BSIM3xpart > - 0.5) - { - dxpart = 0.0; - } - else - { - dxpart = 0.5; - } - ddxpart_dVd = ddxpart_dVg = - ddxpart_dVb = - ddxpart_dVs = 0.0; - } - else - { - dxpart = here->BSIM3qdrn / - qcheq; - Cdd = here->BSIM3cddb; - Csd = -(here->BSIM3cgdb + - here->BSIM3cddb + - here->BSIM3cbdb); - ddxpart_dVd = - (Cdd - - dxpart * (Cdd + - Csd)) / - qcheq; - Cdg = here->BSIM3cdgb; - Csg = -(here->BSIM3cggb + - here->BSIM3cdgb + - here->BSIM3cbgb); - ddxpart_dVg = - (Cdg - - dxpart * (Cdg + - Csg)) / - qcheq; - - Cds = here->BSIM3cdsb; - Css = -(here->BSIM3cgsb + - here->BSIM3cdsb + - here->BSIM3cbsb); - ddxpart_dVs = - (Cds - - dxpart * (Cds + - Css)) / - qcheq; - - ddxpart_dVb = - -(ddxpart_dVd + - ddxpart_dVg + - ddxpart_dVs); - } - sxpart = 1.0 - dxpart; - dsxpart_dVd = -ddxpart_dVd; - dsxpart_dVg = -ddxpart_dVg; - dsxpart_dVs = -ddxpart_dVs; - dsxpart_dVb = - -(dsxpart_dVd + dsxpart_dVg + - dsxpart_dVs); - } - } - else - { - Gm = -here->BSIM3gm; - Gmbs = -here->BSIM3gmbs; - FwdSum = 0.0; - RevSum = -(Gm + Gmbs); - - gbbsp = -here->BSIM3gbds; - gbbdp = here->BSIM3gbds + here->BSIM3gbgs + - here->BSIM3gbbs; - - gbdpg = 0.0; - gbdpsp = 0.0; - gbdpb = 0.0; - gbdpdp = 0.0; - - gbspg = here->BSIM3gbgs; - gbspsp = here->BSIM3gbds; - gbspb = here->BSIM3gbbs; - gbspdp = -(gbspg + gbspsp + gbspb); - - if (here->BSIM3nqsMod == 0) - { - cggb = here->BSIM3cggb; - cgsb = here->BSIM3cgdb; - cgdb = here->BSIM3cgsb; - - cbgb = here->BSIM3cbgb; - cbsb = here->BSIM3cbdb; - cbdb = here->BSIM3cbsb; - - cdgb = -(here->BSIM3cdgb + cggb + - cbgb); - cdsb = -(here->BSIM3cddb + cgsb + - cbsb); - cddb = -(here->BSIM3cdsb + cgdb + - cbdb); - - xgtg = xgtd = xgts = xgtb = 0.0; - sxpart = 0.4; - dxpart = 0.6; - ddxpart_dVd = ddxpart_dVg = - ddxpart_dVb = ddxpart_dVs = - 0.0; - dsxpart_dVd = dsxpart_dVg = - dsxpart_dVb = dsxpart_dVs = - 0.0; - } - else - { - cggb = cgdb = cgsb = 0.0; - cbgb = cbdb = cbsb = 0.0; - cdgb = cddb = cdsb = 0.0; - - xgtg = here->BSIM3gtg; - xgtd = here->BSIM3gts; - xgts = here->BSIM3gtd; - xgtb = here->BSIM3gtb; - - xcqgb = here->BSIM3cqgb; - xcqdb = here->BSIM3cqsb; - xcqsb = here->BSIM3cqdb; - xcqbb = here->BSIM3cqbb; - - CoxWL = model->BSIM3cox * - here->pParam->BSIM3weffCV * - here->pParam->BSIM3leffCV; - qcheq = -(here->BSIM3qgate + - here->BSIM3qbulk); - if (fabs (qcheq) <= 1.0e-5 * CoxWL) - { - if (model->BSIM3xpart < 0.5) - { - sxpart = 0.4; - } - else if (model->BSIM3xpart > - 0.5) - { - sxpart = 0.0; - } - else - { - sxpart = 0.5; - } - dsxpart_dVd = dsxpart_dVg = - dsxpart_dVb = - dsxpart_dVs = 0.0; - } - else - { - sxpart = here->BSIM3qdrn / - qcheq; - Css = here->BSIM3cddb; - Cds = -(here->BSIM3cgdb + - here->BSIM3cddb + - here->BSIM3cbdb); - dsxpart_dVs = - (Css - - sxpart * (Css + - Cds)) / - qcheq; - Csg = here->BSIM3cdgb; - Cdg = -(here->BSIM3cggb + - here->BSIM3cdgb + - here->BSIM3cbgb); - dsxpart_dVg = - (Csg - - sxpart * (Csg + - Cdg)) / - qcheq; - - Csd = here->BSIM3cdsb; - Cdd = -(here->BSIM3cgsb + - here->BSIM3cdsb + - here->BSIM3cbsb); - dsxpart_dVd = - (Csd - - sxpart * (Csd + - Cdd)) / - qcheq; - - dsxpart_dVb = - -(dsxpart_dVd + - dsxpart_dVg + - dsxpart_dVs); - } - dxpart = 1.0 - sxpart; - ddxpart_dVd = -dsxpart_dVd; - ddxpart_dVg = -dsxpart_dVg; - ddxpart_dVs = -dsxpart_dVs; - ddxpart_dVb = - -(ddxpart_dVd + ddxpart_dVg + - ddxpart_dVs); - } - } - - - T1 = *(ckt->CKTstate0 + - here->BSIM3qdef) * here->BSIM3gtau; - gdpr = here->BSIM3drainConductance; - gspr = here->BSIM3sourceConductance; - gds = here->BSIM3gds; - gbd = here->BSIM3gbd; - gbs = here->BSIM3gbs; - capbd = here->BSIM3capbd; - capbs = here->BSIM3capbs; - - GSoverlapCap = here->BSIM3cgso; - GDoverlapCap = here->BSIM3cgdo; - GBoverlapCap = here->pParam->BSIM3cgbo; - - xcdgb = (cdgb - GDoverlapCap); - xcddb = (cddb + capbd + GDoverlapCap); - xcdsb = cdsb; - xcdbb = -(xcdgb + xcddb + xcdsb); - xcsgb = -(cggb + cbgb + cdgb + GSoverlapCap); - xcsdb = -(cgdb + cbdb + cddb); - xcssb = (capbs + GSoverlapCap - (cgsb + cbsb + cdsb)); - xcsbb = -(xcsgb + xcsdb + xcssb); - xcggb = (cggb + GDoverlapCap + GSoverlapCap + - GBoverlapCap); - xcgdb = (cgdb - GDoverlapCap); - xcgsb = (cgsb - GSoverlapCap); - xcgbb = -(xcggb + xcgdb + xcgsb); - xcbgb = (cbgb - GBoverlapCap); - xcbdb = (cbdb - capbd); - xcbsb = (cbsb - capbs); - xcbbb = -(xcbgb + xcbdb + xcbsb); - - - m = here->BSIM3m; - - *(here->BSIM3GgPtr) += m * (xcggb * s->real); - *(here->BSIM3GgPtr + 1) += m * (xcggb * s->imag); - *(here->BSIM3BbPtr) += m * (xcbbb * s->real); - *(here->BSIM3BbPtr + 1) += m * (xcbbb * s->imag); - *(here->BSIM3DPdpPtr) += m * (xcddb * s->real); - *(here->BSIM3DPdpPtr + 1) += m * (xcddb * s->imag); - *(here->BSIM3SPspPtr) += m * (xcssb * s->real); - *(here->BSIM3SPspPtr + 1) += m * (xcssb * s->imag); - - *(here->BSIM3GbPtr) += m * (xcgbb * s->real); - *(here->BSIM3GbPtr + 1) += m * (xcgbb * s->imag); - *(here->BSIM3GdpPtr) += m * (xcgdb * s->real); - *(here->BSIM3GdpPtr + 1) += m * (xcgdb * s->imag); - *(here->BSIM3GspPtr) += m * (xcgsb * s->real); - *(here->BSIM3GspPtr + 1) += m * (xcgsb * s->imag); - - *(here->BSIM3BgPtr) += m * (xcbgb * s->real); - *(here->BSIM3BgPtr + 1) += m * (xcbgb * s->imag); - *(here->BSIM3BdpPtr) += m * (xcbdb * s->real); - *(here->BSIM3BdpPtr + 1) += m * (xcbdb * s->imag); - *(here->BSIM3BspPtr) += m * (xcbsb * s->real); - *(here->BSIM3BspPtr + 1) += m * (xcbsb * s->imag); - - *(here->BSIM3DPgPtr) += m * (xcdgb * s->real); - *(here->BSIM3DPgPtr + 1) += m * (xcdgb * s->imag); - *(here->BSIM3DPbPtr) += m * (xcdbb * s->real); - *(here->BSIM3DPbPtr + 1) += m * (xcdbb * s->imag); - *(here->BSIM3DPspPtr) += m * (xcdsb * s->real); - *(here->BSIM3DPspPtr + 1) += m * (xcdsb * s->imag); - - *(here->BSIM3SPgPtr) += m * (xcsgb * s->real); - *(here->BSIM3SPgPtr + 1) += m * (xcsgb * s->imag); - *(here->BSIM3SPbPtr) += m * (xcsbb * s->real); - *(here->BSIM3SPbPtr + 1) += m * (xcsbb * s->imag); - *(here->BSIM3SPdpPtr) += m * (xcsdb * s->real); - *(here->BSIM3SPdpPtr + 1) += m * (xcsdb * s->imag); - - *(here->BSIM3DdPtr) += m * gdpr; - *(here->BSIM3DdpPtr) -= m * gdpr; - *(here->BSIM3DPdPtr) -= m * gdpr; - - *(here->BSIM3SsPtr) += m * gspr; - *(here->BSIM3SspPtr) -= m * gspr; - *(here->BSIM3SPsPtr) -= m * gspr; - - *(here->BSIM3BgPtr) -= m * here->BSIM3gbgs; - *(here->BSIM3BbPtr) += - m * (gbd + gbs - here->BSIM3gbbs); - *(here->BSIM3BdpPtr) -= m * (gbd - gbbdp); - *(here->BSIM3BspPtr) -= m * (gbs - gbbsp); - - *(here->BSIM3DPgPtr) += m * (Gm + dxpart * xgtg - + T1 * ddxpart_dVg + - gbdpg); - *(here->BSIM3DPdpPtr) += - m * (gdpr + gds + gbd + RevSum + - dxpart * xgtd + T1 * ddxpart_dVd + - gbdpdp); - *(here->BSIM3DPspPtr) -= - m * (gds + FwdSum - dxpart * xgts - - T1 * ddxpart_dVs - gbdpsp); - *(here->BSIM3DPbPtr) -= - m * (gbd - Gmbs - dxpart * xgtb - - T1 * ddxpart_dVb - gbdpb); - - *(here->BSIM3SPgPtr) -= m * (Gm - sxpart * xgtg - - T1 * dsxpart_dVg - - gbspg); - *(here->BSIM3SPspPtr) += - m * (gspr + gds + gbs + FwdSum + - sxpart * xgts + T1 * dsxpart_dVs + - gbspsp); - *(here->BSIM3SPbPtr) -= - m * (gbs + Gmbs - sxpart * xgtb - - T1 * dsxpart_dVb - gbspb); - *(here->BSIM3SPdpPtr) -= - m * (gds + RevSum - sxpart * xgtd - - T1 * dsxpart_dVd - gbspdp); - - *(here->BSIM3GgPtr) -= m * xgtg; - *(here->BSIM3GbPtr) -= m * xgtb; - *(here->BSIM3GdpPtr) -= m * xgtd; - *(here->BSIM3GspPtr) -= m * xgts; - - if (here->BSIM3nqsMod) - { - *(here->BSIM3QqPtr) += - m * (s->real * ScalingFactor); - *(here->BSIM3QqPtr + 1) += - m * (s->imag * ScalingFactor); - *(here->BSIM3QgPtr) -= m * (xcqgb * s->real); - *(here->BSIM3QgPtr + 1) -= - m * (xcqgb * s->imag); - *(here->BSIM3QdpPtr) -= m * (xcqdb * s->real); - *(here->BSIM3QdpPtr + 1) -= - m * (xcqdb * s->imag); - *(here->BSIM3QbPtr) -= m * (xcqbb * s->real); - *(here->BSIM3QbPtr + 1) -= - m * (xcqbb * s->imag); - *(here->BSIM3QspPtr) -= m * (xcqsb * s->real); - *(here->BSIM3QspPtr + 1) -= - m * (xcqsb * s->imag); - - *(here->BSIM3GqPtr) -= m * here->BSIM3gtau; - *(here->BSIM3DPqPtr) += - m * (dxpart * here->BSIM3gtau); - *(here->BSIM3SPqPtr) += - m * (sxpart * here->BSIM3gtau); - - *(here->BSIM3QqPtr) += m * (here->BSIM3gtau); - *(here->BSIM3QgPtr) += m * xgtg; - *(here->BSIM3QdpPtr) += m * xgtd; - *(here->BSIM3QbPtr) += m * xgtb; - *(here->BSIM3QspPtr) += m * xgts; - } - } - } - return (OK); +BSIM3model *model = (BSIM3model*)inModel; +BSIM3instance *here; +double xcggb, xcgdb, xcgsb, xcgbb, xcbgb, xcbdb, xcbsb, xcbbb; +double xcdgb, xcddb, xcdsb, xcdbb, xcsgb, xcsdb, xcssb, xcsbb; +double gdpr, gspr, gds, gbd, gbs, capbd, capbs, FwdSum, RevSum, Gm, Gmbs; +double cggb, cgdb, cgsb, cbgb, cbdb, cbsb, cddb, cdgb, cdsb; +double GSoverlapCap, GDoverlapCap, GBoverlapCap; +double dxpart, sxpart, xgtg, xgtd, xgts, xgtb, xcqgb, xcqdb, xcqsb, xcqbb; +double gbspsp, gbbdp, gbbsp, gbspg, gbspb; +double gbspdp, gbdpdp, gbdpg, gbdpb, gbdpsp; +double ddxpart_dVd, ddxpart_dVg, ddxpart_dVb, ddxpart_dVs; +double dsxpart_dVd, dsxpart_dVg, dsxpart_dVb, dsxpart_dVs; +double T1, CoxWL, qcheq, Cdg, Cdd, Cds, Csg, Csd, Css; +double ScalingFactor = 1.0e-9; +double m; + + for (; model != NULL; model = model->BSIM3nextModel) + { for (here = model->BSIM3instances; here!= NULL; + here = here->BSIM3nextInstance) + { + if (here->BSIM3owner != ARCHme) + continue; + if (here->BSIM3mode >= 0) + { Gm = here->BSIM3gm; + Gmbs = here->BSIM3gmbs; + FwdSum = Gm + Gmbs; + RevSum = 0.0; + + gbbdp = -here->BSIM3gbds; + gbbsp = here->BSIM3gbds + here->BSIM3gbgs + here->BSIM3gbbs; + + gbdpg = here->BSIM3gbgs; + gbdpdp = here->BSIM3gbds; + gbdpb = here->BSIM3gbbs; + gbdpsp = -(gbdpg + gbdpdp + gbdpb); + + gbspg = 0.0; + gbspdp = 0.0; + gbspb = 0.0; + gbspsp = 0.0; + + if (here->BSIM3nqsMod == 0) + { cggb = here->BSIM3cggb; + cgsb = here->BSIM3cgsb; + cgdb = here->BSIM3cgdb; + + cbgb = here->BSIM3cbgb; + cbsb = here->BSIM3cbsb; + cbdb = here->BSIM3cbdb; + + cdgb = here->BSIM3cdgb; + cdsb = here->BSIM3cdsb; + cddb = here->BSIM3cddb; + + xgtg = xgtd = xgts = xgtb = 0.0; + sxpart = 0.6; + dxpart = 0.4; + ddxpart_dVd = ddxpart_dVg = ddxpart_dVb + = ddxpart_dVs = 0.0; + dsxpart_dVd = dsxpart_dVg = dsxpart_dVb + = dsxpart_dVs = 0.0; + } + else + { cggb = cgdb = cgsb = 0.0; + cbgb = cbdb = cbsb = 0.0; + cdgb = cddb = cdsb = 0.0; + + xgtg = here->BSIM3gtg; + xgtd = here->BSIM3gtd; + xgts = here->BSIM3gts; + xgtb = here->BSIM3gtb; + + xcqgb = here->BSIM3cqgb; + xcqdb = here->BSIM3cqdb; + xcqsb = here->BSIM3cqsb; + xcqbb = here->BSIM3cqbb; + + CoxWL = model->BSIM3cox * here->pParam->BSIM3weffCV + * here->pParam->BSIM3leffCV; + qcheq = -(here->BSIM3qgate + here->BSIM3qbulk); + if (fabs(qcheq) <= 1.0e-5 * CoxWL) + { if (model->BSIM3xpart < 0.5) + { dxpart = 0.4; + } + else if (model->BSIM3xpart > 0.5) + { dxpart = 0.0; + } + else + { dxpart = 0.5; + } + ddxpart_dVd = ddxpart_dVg = ddxpart_dVb + = ddxpart_dVs = 0.0; + } + else + { dxpart = here->BSIM3qdrn / qcheq; + Cdd = here->BSIM3cddb; + Csd = -(here->BSIM3cgdb + here->BSIM3cddb + + here->BSIM3cbdb); + ddxpart_dVd = (Cdd - dxpart * (Cdd + Csd)) / qcheq; + Cdg = here->BSIM3cdgb; + Csg = -(here->BSIM3cggb + here->BSIM3cdgb + + here->BSIM3cbgb); + ddxpart_dVg = (Cdg - dxpart * (Cdg + Csg)) / qcheq; + + Cds = here->BSIM3cdsb; + Css = -(here->BSIM3cgsb + here->BSIM3cdsb + + here->BSIM3cbsb); + ddxpart_dVs = (Cds - dxpart * (Cds + Css)) / qcheq; + + ddxpart_dVb = -(ddxpart_dVd + ddxpart_dVg + + ddxpart_dVs); + } + sxpart = 1.0 - dxpart; + dsxpart_dVd = -ddxpart_dVd; + dsxpart_dVg = -ddxpart_dVg; + dsxpart_dVs = -ddxpart_dVs; + dsxpart_dVb = -(dsxpart_dVd + dsxpart_dVg + dsxpart_dVs); + } + } + else + { Gm = -here->BSIM3gm; + Gmbs = -here->BSIM3gmbs; + FwdSum = 0.0; + RevSum = -(Gm + Gmbs); + + gbbsp = -here->BSIM3gbds; + gbbdp = here->BSIM3gbds + here->BSIM3gbgs + here->BSIM3gbbs; + + gbdpg = 0.0; + gbdpsp = 0.0; + gbdpb = 0.0; + gbdpdp = 0.0; + + gbspg = here->BSIM3gbgs; + gbspsp = here->BSIM3gbds; + gbspb = here->BSIM3gbbs; + gbspdp = -(gbspg + gbspsp + gbspb); + + if (here->BSIM3nqsMod == 0) + { cggb = here->BSIM3cggb; + cgsb = here->BSIM3cgdb; + cgdb = here->BSIM3cgsb; + + cbgb = here->BSIM3cbgb; + cbsb = here->BSIM3cbdb; + cbdb = here->BSIM3cbsb; + + cdgb = -(here->BSIM3cdgb + cggb + cbgb); + cdsb = -(here->BSIM3cddb + cgsb + cbsb); + cddb = -(here->BSIM3cdsb + cgdb + cbdb); + + xgtg = xgtd = xgts = xgtb = 0.0; + sxpart = 0.4; + dxpart = 0.6; + ddxpart_dVd = ddxpart_dVg = ddxpart_dVb + = ddxpart_dVs = 0.0; + dsxpart_dVd = dsxpart_dVg = dsxpart_dVb + = dsxpart_dVs = 0.0; + } + else + { cggb = cgdb = cgsb = 0.0; + cbgb = cbdb = cbsb = 0.0; + cdgb = cddb = cdsb = 0.0; + + xgtg = here->BSIM3gtg; + xgtd = here->BSIM3gts; + xgts = here->BSIM3gtd; + xgtb = here->BSIM3gtb; + + xcqgb = here->BSIM3cqgb; + xcqdb = here->BSIM3cqsb; + xcqsb = here->BSIM3cqdb; + xcqbb = here->BSIM3cqbb; + + CoxWL = model->BSIM3cox * here->pParam->BSIM3weffCV + * here->pParam->BSIM3leffCV; + qcheq = -(here->BSIM3qgate + here->BSIM3qbulk); + if (fabs(qcheq) <= 1.0e-5 * CoxWL) + { if (model->BSIM3xpart < 0.5) + { sxpart = 0.4; + } + else if (model->BSIM3xpart > 0.5) + { sxpart = 0.0; + } + else + { sxpart = 0.5; + } + dsxpart_dVd = dsxpart_dVg = dsxpart_dVb + = dsxpart_dVs = 0.0; + } + else + { sxpart = here->BSIM3qdrn / qcheq; + Css = here->BSIM3cddb; + Cds = -(here->BSIM3cgdb + here->BSIM3cddb + + here->BSIM3cbdb); + dsxpart_dVs = (Css - sxpart * (Css + Cds)) / qcheq; + Csg = here->BSIM3cdgb; + Cdg = -(here->BSIM3cggb + here->BSIM3cdgb + + here->BSIM3cbgb); + dsxpart_dVg = (Csg - sxpart * (Csg + Cdg)) / qcheq; + + Csd = here->BSIM3cdsb; + Cdd = -(here->BSIM3cgsb + here->BSIM3cdsb + + here->BSIM3cbsb); + dsxpart_dVd = (Csd - sxpart * (Csd + Cdd)) / qcheq; + + dsxpart_dVb = -(dsxpart_dVd + dsxpart_dVg + + dsxpart_dVs); + } + dxpart = 1.0 - sxpart; + ddxpart_dVd = -dsxpart_dVd; + ddxpart_dVg = -dsxpart_dVg; + ddxpart_dVs = -dsxpart_dVs; + ddxpart_dVb = -(ddxpart_dVd + ddxpart_dVg + ddxpart_dVs); + } + } + + + T1 = *(ckt->CKTstate0 + here->BSIM3qdef) * here->BSIM3gtau; + gdpr = here->BSIM3drainConductance; + gspr = here->BSIM3sourceConductance; + gds = here->BSIM3gds; + gbd = here->BSIM3gbd; + gbs = here->BSIM3gbs; + capbd = here->BSIM3capbd; + capbs = here->BSIM3capbs; + + GSoverlapCap = here->BSIM3cgso; + GDoverlapCap = here->BSIM3cgdo; + GBoverlapCap = here->pParam->BSIM3cgbo; + + xcdgb = (cdgb - GDoverlapCap); + xcddb = (cddb + capbd + GDoverlapCap); + xcdsb = cdsb; + xcdbb = -(xcdgb + xcddb + xcdsb); + xcsgb = -(cggb + cbgb + cdgb + GSoverlapCap); + xcsdb = -(cgdb + cbdb + cddb); + xcssb = (capbs + GSoverlapCap - (cgsb + cbsb + cdsb)); + xcsbb = -(xcsgb + xcsdb + xcssb); + xcggb = (cggb + GDoverlapCap + GSoverlapCap + GBoverlapCap); + xcgdb = (cgdb - GDoverlapCap); + xcgsb = (cgsb - GSoverlapCap); + xcgbb = -(xcggb + xcgdb + xcgsb); + xcbgb = (cbgb - GBoverlapCap); + xcbdb = (cbdb - capbd); + xcbsb = (cbsb - capbs); + xcbbb = -(xcbgb + xcbdb + xcbsb); + + m = here->BSIM3m; + + *(here->BSIM3GgPtr ) += m * (xcggb * s->real); + *(here->BSIM3GgPtr +1) += m * (xcggb * s->imag); + *(here->BSIM3BbPtr ) += m * (xcbbb * s->real); + *(here->BSIM3BbPtr +1) += m * (xcbbb * s->imag); + *(here->BSIM3DPdpPtr ) += m * (xcddb * s->real); + *(here->BSIM3DPdpPtr +1) += m * (xcddb * s->imag); + *(here->BSIM3SPspPtr ) += m * (xcssb * s->real); + *(here->BSIM3SPspPtr +1) += m * (xcssb * s->imag); + + *(here->BSIM3GbPtr ) += m * (xcgbb * s->real); + *(here->BSIM3GbPtr +1) += m * (xcgbb * s->imag); + *(here->BSIM3GdpPtr ) += m * (xcgdb * s->real); + *(here->BSIM3GdpPtr +1) += m * (xcgdb * s->imag); + *(here->BSIM3GspPtr ) += m * (xcgsb * s->real); + *(here->BSIM3GspPtr +1) += m * (xcgsb * s->imag); + + *(here->BSIM3BgPtr ) += m * (xcbgb * s->real); + *(here->BSIM3BgPtr +1) += m * (xcbgb * s->imag); + *(here->BSIM3BdpPtr ) += m * (xcbdb * s->real); + *(here->BSIM3BdpPtr +1) += m * (xcbdb * s->imag); + *(here->BSIM3BspPtr ) += m * (xcbsb * s->real); + *(here->BSIM3BspPtr +1) += m * (xcbsb * s->imag); + + *(here->BSIM3DPgPtr ) += m * (xcdgb * s->real); + *(here->BSIM3DPgPtr +1) += m * (xcdgb * s->imag); + *(here->BSIM3DPbPtr ) += m * (xcdbb * s->real); + *(here->BSIM3DPbPtr +1) += m * (xcdbb * s->imag); + *(here->BSIM3DPspPtr ) += m * (xcdsb * s->real); + *(here->BSIM3DPspPtr +1) += m * (xcdsb * s->imag); + + *(here->BSIM3SPgPtr ) += m * (xcsgb * s->real); + *(here->BSIM3SPgPtr +1) += m * (xcsgb * s->imag); + *(here->BSIM3SPbPtr ) += m * (xcsbb * s->real); + *(here->BSIM3SPbPtr +1) += m * (xcsbb * s->imag); + *(here->BSIM3SPdpPtr ) += m * (xcsdb * s->real); + *(here->BSIM3SPdpPtr +1) += m * (xcsdb * s->imag); + + *(here->BSIM3DdPtr) += m * gdpr; + *(here->BSIM3DdpPtr) -= m * gdpr; + *(here->BSIM3DPdPtr) -= m * gdpr; + + *(here->BSIM3SsPtr) += m * gspr; + *(here->BSIM3SspPtr) -= m * gspr; + *(here->BSIM3SPsPtr) -= m * gspr; + + *(here->BSIM3BgPtr) -= m * here->BSIM3gbgs; + *(here->BSIM3BbPtr) += m * (gbd + gbs - here->BSIM3gbbs); + *(here->BSIM3BdpPtr) -= m * (gbd - gbbdp); + *(here->BSIM3BspPtr) -= m * (gbs - gbbsp); + + *(here->BSIM3DPgPtr) += Gm + dxpart * xgtg + + T1 * ddxpart_dVg + gbdpg; + *(here->BSIM3DPdpPtr) += gdpr + gds + gbd + RevSum + + dxpart * xgtd + T1 * ddxpart_dVd + gbdpdp; + *(here->BSIM3DPspPtr) -= gds + FwdSum - dxpart * xgts + - T1 * ddxpart_dVs - gbdpsp; + *(here->BSIM3DPbPtr) -= gbd - Gmbs - dxpart * xgtb + - T1 * ddxpart_dVb - gbdpb; + + *(here->BSIM3SPgPtr) -= Gm - sxpart * xgtg + - T1 * dsxpart_dVg - gbspg; + *(here->BSIM3SPspPtr) += gspr + gds + gbs + FwdSum + + sxpart * xgts + T1 * dsxpart_dVs + gbspsp; + *(here->BSIM3SPbPtr) -= gbs + Gmbs - sxpart * xgtb + - T1 * dsxpart_dVb - gbspb; + *(here->BSIM3SPdpPtr) -= gds + RevSum - sxpart * xgtd + - T1 * dsxpart_dVd - gbspdp; + + *(here->BSIM3GgPtr) -= xgtg; + *(here->BSIM3GbPtr) -= xgtb; + *(here->BSIM3GdpPtr) -= xgtd; + *(here->BSIM3GspPtr) -= xgts; + + if (here->BSIM3nqsMod) + { *(here->BSIM3QqPtr ) += m * (s->real * ScalingFactor); + *(here->BSIM3QqPtr +1) += m * (s->imag * ScalingFactor); + *(here->BSIM3QgPtr ) -= m * (xcqgb * s->real); + *(here->BSIM3QgPtr +1) -= m * (xcqgb * s->imag); + *(here->BSIM3QdpPtr ) -= m * (xcqdb * s->real); + *(here->BSIM3QdpPtr +1) -= m * (xcqdb * s->imag); + *(here->BSIM3QbPtr ) -= m * (xcqbb * s->real); + *(here->BSIM3QbPtr +1) -= m * (xcqbb * s->imag); + *(here->BSIM3QspPtr ) -= m * (xcqsb * s->real); + *(here->BSIM3QspPtr +1) -= xcqsb * s->imag; + + *(here->BSIM3GqPtr) -= m * (here->BSIM3gtau); + *(here->BSIM3DPqPtr) += m * (dxpart * here->BSIM3gtau); + *(here->BSIM3SPqPtr) += m * (sxpart * here->BSIM3gtau); + + *(here->BSIM3QqPtr) += m * (here->BSIM3gtau); + *(here->BSIM3QgPtr) += m * xgtg; + *(here->BSIM3QdpPtr) += m * xgtd; + *(here->BSIM3QbPtr) += m * xgtb; + *(here->BSIM3QspPtr) += m * xgts; + } + } + } + return(OK); } + diff --git a/src/spicelib/devices/bsim3/b3set.c b/src/spicelib/devices/bsim3/b3set.c index cf1085927..879351250 100644 --- a/src/spicelib/devices/bsim3/b3set.c +++ b/src/spicelib/devices/bsim3/b3set.c @@ -1,23 +1,13 @@ +/**** BSIM3v3.2.4, Released by Xuemei Xi 12/21/2001 ****/ + /********** * Copyright 2001 Regents of the University of California. All rights reserved. * File: b3set.c of BSIM3v3.2.4 * Author: 1995 Min-Chie Jeng and Mansun Chan. * Author: 1997-1999 Weidong Liu. * Author: 2001 Xuemei Xi - * Modified by Paolo Nenzi 2002 **********/ -/* - * Release Notes: - * BSIM3v3.2.4, Released by Xuemei Xi 12/21/2001 - * BSIM3v3.2.3, Released by Xuemei Xi 10/05/2001 - * BSIM3v3.2.2, Released by Weidong Liu 04/20/1999 - * BSIM3v3.2, Released by Weidong Liu 06/16/1998 - */ - - -/*************************************/ - #include "ngspice.h" #include "smpdefs.h" #include "cktdefs.h" @@ -37,990 +27,982 @@ #define Meter2Micron 1.0e6 int -BSIM3setup (SMPmatrix * matrix, GENmodel * inModel, CKTcircuit * ckt, +BSIM3setup (SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt, int *states) { - BSIM3model *model = (BSIM3model *) inModel; - BSIM3instance *here; - int error; - CKTnode *tmp; - - /* NodesetFix */ - CKTnode *tmpNode; - IFuid tmpName; - - double tmp1, tmp2; +BSIM3model *model = (BSIM3model*)inModel; +BSIM3instance *here; +int error; +CKTnode *tmp; + +CKTnode *tmpNode; +IFuid tmpName; - /* loop through all the BSIM3 device models */ - for (; model != NULL; model = model->BSIM3nextModel) - { + /* loop through all the BSIM3 device models */ + for( ; model != NULL; model = model->BSIM3nextModel ) + { /* Default value Processing for BSIM3 MOSFET Models */ - if (!model->BSIM3typeGiven) - model->BSIM3type = NMOS; - if (!model->BSIM3mobModGiven) - model->BSIM3mobMod = 1; - if (!model->BSIM3binUnitGiven) - model->BSIM3binUnit = 1; - if (!model->BSIM3paramChkGiven) - model->BSIM3paramChk = 0; - if (!model->BSIM3capModGiven) - model->BSIM3capMod = 3; - if (!model->BSIM3noiModGiven) - model->BSIM3noiMod = 1; - - /* If the user does not provide the model revision, - * we always choose the most recent. - */ - if (!model->BSIM3versionGiven) - model->BSIM3version = "3.2.4"; + if (!model->BSIM3typeGiven) + model->BSIM3type = NMOS; + if (!model->BSIM3mobModGiven) + model->BSIM3mobMod = 1; + if (!model->BSIM3binUnitGiven) + model->BSIM3binUnit = 1; + if (!model->BSIM3paramChkGiven) + model->BSIM3paramChk = 0; + if (!model->BSIM3capModGiven) + model->BSIM3capMod = 3; + if (!model->BSIM3acmModGiven) + model->BSIM3acmMod = 0; + if (!model->BSIM3noiModGiven) + model->BSIM3noiMod = 1; - /* I have added below the code that translate model string - * into an integer. This trick is meant to speed up the - * revision testing instruction, since comparing integer - * is faster than comparing strings. - * Paolo Nenzi 2002 - */ - if (!strcmp (model->BSIM3version, "3.2.4")) - model->BSIM3intVersion = BSIM3V324; - else if (!strcmp (model->BSIM3version, "3.2.3")) - model->BSIM3intVersion = BSIM3V323; - else if (!strcmp (model->BSIM3version, "3.2.2")) - model->BSIM3intVersion = BSIM3V322; - else if (!strcmp (model->BSIM3version, "3.2")) - model->BSIM3intVersion = BSIM3V32; - else - model->BSIM3intVersion = BSIM3V3OLD; - /* BSIM3V3OLD is a placeholder for pre 3.2 revision - * This model should not be used for pre 3.2 models. - */ + /* If the user does not provide the model revision, + * we always choose the most recent. + */ + if (!model->BSIM3versionGiven) + model->BSIM3version = "3.2.4"; + /* I have added below the code that translate model string + * into an integer. This trick is meant to speed up the + * revision testing instruction, since comparing integer + * is faster than comparing strings. + * Paolo Nenzi 2002 + */ + if (!strcmp (model->BSIM3version, "3.2.4")) + model->BSIM3intVersion = BSIM3V324; + else if (!strcmp (model->BSIM3version, "3.2.3")) + model->BSIM3intVersion = BSIM3V323; + else if (!strcmp (model->BSIM3version, "3.2.2")) + model->BSIM3intVersion = BSIM3V322; + else if (!strcmp (model->BSIM3version, "3.2")) + model->BSIM3intVersion = BSIM3V32; + else + model->BSIM3intVersion = BSIM3V3OLD; + /* BSIM3V3OLD is a placeholder for pre 3.2 revision + * This model should not be used for pre 3.2 models. + */ + if (!model->BSIM3toxGiven) + model->BSIM3tox = 150.0e-10; + model->BSIM3cox = 3.453133e-11 / model->BSIM3tox; + if (!model->BSIM3toxmGiven) + model->BSIM3toxm = model->BSIM3tox; - if (!model->BSIM3toxGiven) - model->BSIM3tox = 150.0e-10; - model->BSIM3cox = 3.453133e-11 / model->BSIM3tox; - if (!model->BSIM3toxmGiven) - model->BSIM3toxm = model->BSIM3tox; + if (!model->BSIM3cdscGiven) + model->BSIM3cdsc = 2.4e-4; /* unit Q/V/m^2 */ + if (!model->BSIM3cdscbGiven) + model->BSIM3cdscb = 0.0; /* unit Q/V/m^2 */ + if (!model->BSIM3cdscdGiven) + model->BSIM3cdscd = 0.0; /* unit Q/V/m^2 */ + if (!model->BSIM3citGiven) + model->BSIM3cit = 0.0; /* unit Q/V/m^2 */ + if (!model->BSIM3nfactorGiven) + model->BSIM3nfactor = 1; + if (!model->BSIM3xjGiven) + model->BSIM3xj = .15e-6; + if (!model->BSIM3vsatGiven) + model->BSIM3vsat = 8.0e4; /* unit m/s */ + if (!model->BSIM3atGiven) + model->BSIM3at = 3.3e4; /* unit m/s */ + if (!model->BSIM3a0Given) + model->BSIM3a0 = 1.0; + if (!model->BSIM3agsGiven) + model->BSIM3ags = 0.0; + if (!model->BSIM3a1Given) + model->BSIM3a1 = 0.0; + if (!model->BSIM3a2Given) + model->BSIM3a2 = 1.0; + if (!model->BSIM3ketaGiven) + model->BSIM3keta = -0.047; /* unit / V */ + if (!model->BSIM3nsubGiven) + model->BSIM3nsub = 6.0e16; /* unit 1/cm3 */ + if (!model->BSIM3npeakGiven) + model->BSIM3npeak = 1.7e17; /* unit 1/cm3 */ + if (!model->BSIM3ngateGiven) + model->BSIM3ngate = 0; /* unit 1/cm3 */ + if (!model->BSIM3vbmGiven) + model->BSIM3vbm = -3.0; + if (!model->BSIM3xtGiven) + model->BSIM3xt = 1.55e-7; + if (!model->BSIM3kt1Given) + model->BSIM3kt1 = -0.11; /* unit V */ + if (!model->BSIM3kt1lGiven) + model->BSIM3kt1l = 0.0; /* unit V*m */ + if (!model->BSIM3kt2Given) + model->BSIM3kt2 = 0.022; /* No unit */ + if (!model->BSIM3k3Given) + model->BSIM3k3 = 80.0; + if (!model->BSIM3k3bGiven) + model->BSIM3k3b = 0.0; + if (!model->BSIM3w0Given) + model->BSIM3w0 = 2.5e-6; + if (!model->BSIM3nlxGiven) + model->BSIM3nlx = 1.74e-7; + if (!model->BSIM3dvt0Given) + model->BSIM3dvt0 = 2.2; + if (!model->BSIM3dvt1Given) + model->BSIM3dvt1 = 0.53; + if (!model->BSIM3dvt2Given) + model->BSIM3dvt2 = -0.032; /* unit 1 / V */ - if (!model->BSIM3cdscGiven) - model->BSIM3cdsc = 2.4e-4; /* unit Q/V/m^2 */ - if (!model->BSIM3cdscbGiven) - model->BSIM3cdscb = 0.0; /* unit Q/V/m^2 */ - if (!model->BSIM3cdscdGiven) - model->BSIM3cdscd = 0.0; /* unit Q/V/m^2 */ - if (!model->BSIM3citGiven) - model->BSIM3cit = 0.0; /* unit Q/V/m^2 */ - if (!model->BSIM3nfactorGiven) - model->BSIM3nfactor = 1; - if (!model->BSIM3xjGiven) - model->BSIM3xj = .15e-6; - if (!model->BSIM3vsatGiven) - model->BSIM3vsat = 8.0e4; /* unit m/s */ - if (!model->BSIM3atGiven) - model->BSIM3at = 3.3e4; /* unit m/s */ - if (!model->BSIM3a0Given) - model->BSIM3a0 = 1.0; - if (!model->BSIM3agsGiven) - model->BSIM3ags = 0.0; - if (!model->BSIM3a1Given) - model->BSIM3a1 = 0.0; - if (!model->BSIM3a2Given) - model->BSIM3a2 = 1.0; - if (!model->BSIM3ketaGiven) - model->BSIM3keta = -0.047; /* unit / V */ - if (!model->BSIM3nsubGiven) - model->BSIM3nsub = 6.0e16; /* unit 1/cm3 */ - if (!model->BSIM3npeakGiven) - model->BSIM3npeak = 1.7e17; /* unit 1/cm3 */ - if (!model->BSIM3ngateGiven) - model->BSIM3ngate = 0; /* unit 1/cm3 */ - if (!model->BSIM3vbmGiven) - model->BSIM3vbm = -3.0; - if (!model->BSIM3xtGiven) - model->BSIM3xt = 1.55e-7; - if (!model->BSIM3kt1Given) - model->BSIM3kt1 = -0.11; /* unit V */ - if (!model->BSIM3kt1lGiven) - model->BSIM3kt1l = 0.0; /* unit V*m */ - if (!model->BSIM3kt2Given) - model->BSIM3kt2 = 0.022; /* No unit */ - if (!model->BSIM3k3Given) - model->BSIM3k3 = 80.0; - if (!model->BSIM3k3bGiven) - model->BSIM3k3b = 0.0; - if (!model->BSIM3w0Given) - model->BSIM3w0 = 2.5e-6; - if (!model->BSIM3nlxGiven) - model->BSIM3nlx = 1.74e-7; - if (!model->BSIM3dvt0Given) - model->BSIM3dvt0 = 2.2; - if (!model->BSIM3dvt1Given) - model->BSIM3dvt1 = 0.53; - if (!model->BSIM3dvt2Given) - model->BSIM3dvt2 = -0.032; /* unit 1 / V */ + if (!model->BSIM3dvt0wGiven) + model->BSIM3dvt0w = 0.0; + if (!model->BSIM3dvt1wGiven) + model->BSIM3dvt1w = 5.3e6; + if (!model->BSIM3dvt2wGiven) + model->BSIM3dvt2w = -0.032; - if (!model->BSIM3dvt0wGiven) - model->BSIM3dvt0w = 0.0; - if (!model->BSIM3dvt1wGiven) - model->BSIM3dvt1w = 5.3e6; - if (!model->BSIM3dvt2wGiven) - model->BSIM3dvt2w = -0.032; + if (!model->BSIM3droutGiven) + model->BSIM3drout = 0.56; + if (!model->BSIM3dsubGiven) + model->BSIM3dsub = model->BSIM3drout; + if (!model->BSIM3vth0Given) + model->BSIM3vth0 = (model->BSIM3type == NMOS) ? 0.7 : -0.7; + if (!model->BSIM3uaGiven) + model->BSIM3ua = 2.25e-9; /* unit m/V */ + if (!model->BSIM3ua1Given) + model->BSIM3ua1 = 4.31e-9; /* unit m/V */ + if (!model->BSIM3ubGiven) + model->BSIM3ub = 5.87e-19; /* unit (m/V)**2 */ + if (!model->BSIM3ub1Given) + model->BSIM3ub1 = -7.61e-18; /* unit (m/V)**2 */ + if (!model->BSIM3ucGiven) + model->BSIM3uc = (model->BSIM3mobMod == 3) ? -0.0465 : -0.0465e-9; + if (!model->BSIM3uc1Given) + model->BSIM3uc1 = (model->BSIM3mobMod == 3) ? -0.056 : -0.056e-9; + if (!model->BSIM3u0Given) + model->BSIM3u0 = (model->BSIM3type == NMOS) ? 0.067 : 0.025; + if (!model->BSIM3uteGiven) + model->BSIM3ute = -1.5; + if (!model->BSIM3voffGiven) + model->BSIM3voff = -0.08; + if (!model->BSIM3deltaGiven) + model->BSIM3delta = 0.01; + if (!model->BSIM3rdswGiven) + model->BSIM3rdsw = 0; + if (!model->BSIM3prwgGiven) + model->BSIM3prwg = 0.0; /* unit 1/V */ + if (!model->BSIM3prwbGiven) + model->BSIM3prwb = 0.0; + if (!model->BSIM3prtGiven) + if (!model->BSIM3prtGiven) + model->BSIM3prt = 0.0; + if (!model->BSIM3eta0Given) + model->BSIM3eta0 = 0.08; /* no unit */ + if (!model->BSIM3etabGiven) + model->BSIM3etab = -0.07; /* unit 1/V */ + if (!model->BSIM3pclmGiven) + model->BSIM3pclm = 1.3; /* no unit */ + if (!model->BSIM3pdibl1Given) + model->BSIM3pdibl1 = .39; /* no unit */ + if (!model->BSIM3pdibl2Given) + model->BSIM3pdibl2 = 0.0086; /* no unit */ + if (!model->BSIM3pdiblbGiven) + model->BSIM3pdiblb = 0.0; /* 1/V */ + if (!model->BSIM3pscbe1Given) + model->BSIM3pscbe1 = 4.24e8; + if (!model->BSIM3pscbe2Given) + model->BSIM3pscbe2 = 1.0e-5; + if (!model->BSIM3pvagGiven) + model->BSIM3pvag = 0.0; + if (!model->BSIM3wrGiven) + model->BSIM3wr = 1.0; + if (!model->BSIM3dwgGiven) + model->BSIM3dwg = 0.0; + if (!model->BSIM3dwbGiven) + model->BSIM3dwb = 0.0; + if (!model->BSIM3b0Given) + model->BSIM3b0 = 0.0; + if (!model->BSIM3b1Given) + model->BSIM3b1 = 0.0; + if (!model->BSIM3alpha0Given) + model->BSIM3alpha0 = 0.0; + if (!model->BSIM3alpha1Given) + model->BSIM3alpha1 = 0.0; + if (!model->BSIM3beta0Given) + model->BSIM3beta0 = 30.0; + if (!model->BSIM3ijthGiven) + model->BSIM3ijth = 0.1; /* unit A */ - if (!model->BSIM3droutGiven) - model->BSIM3drout = 0.56; - if (!model->BSIM3dsubGiven) - model->BSIM3dsub = model->BSIM3drout; - if (!model->BSIM3vth0Given) - model->BSIM3vth0 = - (model->BSIM3type == NMOS) ? 0.7 : -0.7; - if (!model->BSIM3uaGiven) - model->BSIM3ua = 2.25e-9; /* unit m/V */ - if (!model->BSIM3ua1Given) - model->BSIM3ua1 = 4.31e-9; /* unit m/V */ - if (!model->BSIM3ubGiven) - model->BSIM3ub = 5.87e-19; /* unit (m/V)**2 */ - if (!model->BSIM3ub1Given) - model->BSIM3ub1 = -7.61e-18; /* unit (m/V)**2 */ - if (!model->BSIM3ucGiven) - model->BSIM3uc = - (model->BSIM3mobMod == - 3) ? -0.0465 : -0.0465e-9; - if (!model->BSIM3uc1Given) - model->BSIM3uc1 = - (model->BSIM3mobMod == - 3) ? -0.056 : -0.056e-9; - if (!model->BSIM3u0Given) - model->BSIM3u0 = - (model->BSIM3type == NMOS) ? 0.067 : 0.025; - if (!model->BSIM3uteGiven) - model->BSIM3ute = -1.5; - if (!model->BSIM3voffGiven) - model->BSIM3voff = -0.08; - if (!model->BSIM3deltaGiven) - model->BSIM3delta = 0.01; - if (!model->BSIM3rdswGiven) - model->BSIM3rdsw = 0; - if (!model->BSIM3prwgGiven) - model->BSIM3prwg = 0.0; /* unit 1/V */ - if (!model->BSIM3prwbGiven) - model->BSIM3prwb = 0.0; - if (!model->BSIM3prtGiven) - if (!model->BSIM3prtGiven) - model->BSIM3prt = 0.0; - if (!model->BSIM3eta0Given) - model->BSIM3eta0 = 0.08; /* no unit */ - if (!model->BSIM3etabGiven) - model->BSIM3etab = -0.07; /* unit 1/V */ - if (!model->BSIM3pclmGiven) - model->BSIM3pclm = 1.3; /* no unit */ - if (!model->BSIM3pdibl1Given) - model->BSIM3pdibl1 = .39; /* no unit */ - if (!model->BSIM3pdibl2Given) - model->BSIM3pdibl2 = 0.0086; /* no unit */ - if (!model->BSIM3pdiblbGiven) - model->BSIM3pdiblb = 0.0; /* 1/V */ - if (!model->BSIM3pscbe1Given) - model->BSIM3pscbe1 = 4.24e8; - if (!model->BSIM3pscbe2Given) - model->BSIM3pscbe2 = 1.0e-5; - if (!model->BSIM3pvagGiven) - model->BSIM3pvag = 0.0; - if (!model->BSIM3wrGiven) - model->BSIM3wr = 1.0; - if (!model->BSIM3dwgGiven) - model->BSIM3dwg = 0.0; - if (!model->BSIM3dwbGiven) - model->BSIM3dwb = 0.0; - if (!model->BSIM3b0Given) - model->BSIM3b0 = 0.0; - if (!model->BSIM3b1Given) - model->BSIM3b1 = 0.0; - if (!model->BSIM3alpha0Given) - model->BSIM3alpha0 = 0.0; - if (!model->BSIM3alpha1Given) - model->BSIM3alpha1 = 0.0; - if (!model->BSIM3beta0Given) - model->BSIM3beta0 = 30.0; - if (!model->BSIM3ijthGiven) - model->BSIM3ijth = 0.1; /* unit A */ + if (!model->BSIM3elmGiven) + model->BSIM3elm = 5.0; + if (!model->BSIM3cgslGiven) + model->BSIM3cgsl = 0.0; + if (!model->BSIM3cgdlGiven) + model->BSIM3cgdl = 0.0; + if (!model->BSIM3ckappaGiven) + model->BSIM3ckappa = 0.6; + if (!model->BSIM3clcGiven) + model->BSIM3clc = 0.1e-6; + if (!model->BSIM3cleGiven) + model->BSIM3cle = 0.6; + if (!model->BSIM3vfbcvGiven) + model->BSIM3vfbcv = -1.0; + if (!model->BSIM3acdeGiven) + model->BSIM3acde = 1.0; + if (!model->BSIM3moinGiven) + model->BSIM3moin = 15.0; + if (!model->BSIM3noffGiven) + model->BSIM3noff = 1.0; + if (!model->BSIM3voffcvGiven) + model->BSIM3voffcv = 0.0; + if (!model->BSIM3tcjGiven) + model->BSIM3tcj = 0.0; + if (!model->BSIM3tpbGiven) + model->BSIM3tpb = 0.0; + if (!model->BSIM3tcjswGiven) + model->BSIM3tcjsw = 0.0; + if (!model->BSIM3tpbswGiven) + model->BSIM3tpbsw = 0.0; + if (!model->BSIM3tcjswgGiven) + model->BSIM3tcjswg = 0.0; + if (!model->BSIM3tpbswgGiven) + model->BSIM3tpbswg = 0.0; - if (!model->BSIM3elmGiven) - model->BSIM3elm = 5.0; - if (!model->BSIM3cgslGiven) - model->BSIM3cgsl = 0.0; - if (!model->BSIM3cgdlGiven) - model->BSIM3cgdl = 0.0; - if (!model->BSIM3ckappaGiven) - model->BSIM3ckappa = 0.6; - if (!model->BSIM3clcGiven) - model->BSIM3clc = 0.1e-6; - if (!model->BSIM3cleGiven) - model->BSIM3cle = 0.6; - if (!model->BSIM3vfbcvGiven) - model->BSIM3vfbcv = -1.0; - if (!model->BSIM3acdeGiven) - model->BSIM3acde = 1.0; - if (!model->BSIM3moinGiven) - model->BSIM3moin = 15.0; - if (!model->BSIM3noffGiven) - model->BSIM3noff = 1.0; - if (!model->BSIM3voffcvGiven) - model->BSIM3voffcv = 0.0; - if (!model->BSIM3tcjGiven) - model->BSIM3tcj = 0.0; - if (!model->BSIM3tpbGiven) - model->BSIM3tpb = 0.0; - if (!model->BSIM3tcjswGiven) - model->BSIM3tcjsw = 0.0; - if (!model->BSIM3tpbswGiven) - model->BSIM3tpbsw = 0.0; - if (!model->BSIM3tcjswgGiven) - model->BSIM3tcjswg = 0.0; - if (!model->BSIM3tpbswgGiven) - model->BSIM3tpbswg = 0.0; + /* acm model */ + if (!model->BSIM3hdifGiven) + model->BSIM3hdif = 0.0; + if (!model->BSIM3ldifGiven) + model->BSIM3ldif = 0.0; + if (!model->BSIM3ldGiven) + model->BSIM3ld = 0.0; + if (!model->BSIM3rdGiven) + model->BSIM3rd = 0.0; + if (!model->BSIM3rsGiven) + model->BSIM3rs = 0.0; + if (!model->BSIM3rdcGiven) + model->BSIM3rdc = 0.0; + if (!model->BSIM3rscGiven) + model->BSIM3rsc = 0.0; - /* Length dependence */ - if (!model->BSIM3lcdscGiven) - model->BSIM3lcdsc = 0.0; - if (!model->BSIM3lcdscbGiven) - model->BSIM3lcdscb = 0.0; - if (!model->BSIM3lcdscdGiven) - model->BSIM3lcdscd = 0.0; - if (!model->BSIM3lcitGiven) - model->BSIM3lcit = 0.0; - if (!model->BSIM3lnfactorGiven) - model->BSIM3lnfactor = 0.0; - if (!model->BSIM3lxjGiven) - model->BSIM3lxj = 0.0; - if (!model->BSIM3lvsatGiven) - model->BSIM3lvsat = 0.0; - if (!model->BSIM3latGiven) - model->BSIM3lat = 0.0; - if (!model->BSIM3la0Given) - model->BSIM3la0 = 0.0; - if (!model->BSIM3lagsGiven) - model->BSIM3lags = 0.0; - if (!model->BSIM3la1Given) - model->BSIM3la1 = 0.0; - if (!model->BSIM3la2Given) - model->BSIM3la2 = 0.0; - if (!model->BSIM3lketaGiven) - model->BSIM3lketa = 0.0; - if (!model->BSIM3lnsubGiven) - model->BSIM3lnsub = 0.0; - if (!model->BSIM3lnpeakGiven) - model->BSIM3lnpeak = 0.0; - if (!model->BSIM3lngateGiven) - model->BSIM3lngate = 0.0; - if (!model->BSIM3lvbmGiven) - model->BSIM3lvbm = 0.0; - if (!model->BSIM3lxtGiven) - model->BSIM3lxt = 0.0; - if (!model->BSIM3lkt1Given) - model->BSIM3lkt1 = 0.0; - if (!model->BSIM3lkt1lGiven) - model->BSIM3lkt1l = 0.0; - if (!model->BSIM3lkt2Given) - model->BSIM3lkt2 = 0.0; - if (!model->BSIM3lk3Given) - model->BSIM3lk3 = 0.0; - if (!model->BSIM3lk3bGiven) - model->BSIM3lk3b = 0.0; - if (!model->BSIM3lw0Given) - model->BSIM3lw0 = 0.0; - if (!model->BSIM3lnlxGiven) - model->BSIM3lnlx = 0.0; - if (!model->BSIM3ldvt0Given) - model->BSIM3ldvt0 = 0.0; - if (!model->BSIM3ldvt1Given) - model->BSIM3ldvt1 = 0.0; - if (!model->BSIM3ldvt2Given) - model->BSIM3ldvt2 = 0.0; - if (!model->BSIM3ldvt0wGiven) - model->BSIM3ldvt0w = 0.0; - if (!model->BSIM3ldvt1wGiven) - model->BSIM3ldvt1w = 0.0; - if (!model->BSIM3ldvt2wGiven) - model->BSIM3ldvt2w = 0.0; - if (!model->BSIM3ldroutGiven) - model->BSIM3ldrout = 0.0; - if (!model->BSIM3ldsubGiven) - model->BSIM3ldsub = 0.0; - if (!model->BSIM3lvth0Given) - model->BSIM3lvth0 = 0.0; - if (!model->BSIM3luaGiven) - model->BSIM3lua = 0.0; - if (!model->BSIM3lua1Given) - model->BSIM3lua1 = 0.0; - if (!model->BSIM3lubGiven) - model->BSIM3lub = 0.0; - if (!model->BSIM3lub1Given) - model->BSIM3lub1 = 0.0; - if (!model->BSIM3lucGiven) - model->BSIM3luc = 0.0; - if (!model->BSIM3luc1Given) - model->BSIM3luc1 = 0.0; - if (!model->BSIM3lu0Given) - model->BSIM3lu0 = 0.0; - if (!model->BSIM3luteGiven) - model->BSIM3lute = 0.0; - if (!model->BSIM3lvoffGiven) - model->BSIM3lvoff = 0.0; - if (!model->BSIM3ldeltaGiven) - model->BSIM3ldelta = 0.0; - if (!model->BSIM3lrdswGiven) - model->BSIM3lrdsw = 0.0; - if (!model->BSIM3lprwbGiven) - model->BSIM3lprwb = 0.0; - if (!model->BSIM3lprwgGiven) - model->BSIM3lprwg = 0.0; - if (!model->BSIM3lprtGiven) - model->BSIM3lprt = 0.0; - if (!model->BSIM3leta0Given) - model->BSIM3leta0 = 0.0; - if (!model->BSIM3letabGiven) - model->BSIM3letab = -0.0; - if (!model->BSIM3lpclmGiven) - model->BSIM3lpclm = 0.0; - if (!model->BSIM3lpdibl1Given) - model->BSIM3lpdibl1 = 0.0; - if (!model->BSIM3lpdibl2Given) - model->BSIM3lpdibl2 = 0.0; - if (!model->BSIM3lpdiblbGiven) - model->BSIM3lpdiblb = 0.0; - if (!model->BSIM3lpscbe1Given) - model->BSIM3lpscbe1 = 0.0; - if (!model->BSIM3lpscbe2Given) - model->BSIM3lpscbe2 = 0.0; - if (!model->BSIM3lpvagGiven) - model->BSIM3lpvag = 0.0; - if (!model->BSIM3lwrGiven) - model->BSIM3lwr = 0.0; - if (!model->BSIM3ldwgGiven) - model->BSIM3ldwg = 0.0; - if (!model->BSIM3ldwbGiven) - model->BSIM3ldwb = 0.0; - if (!model->BSIM3lb0Given) - model->BSIM3lb0 = 0.0; - if (!model->BSIM3lb1Given) - model->BSIM3lb1 = 0.0; - if (!model->BSIM3lalpha0Given) - model->BSIM3lalpha0 = 0.0; - if (!model->BSIM3lalpha1Given) - model->BSIM3lalpha1 = 0.0; - if (!model->BSIM3lbeta0Given) - model->BSIM3lbeta0 = 0.0; - if (!model->BSIM3lvfbGiven) - model->BSIM3lvfb = 0.0; + /* Length dependence */ + if (!model->BSIM3lcdscGiven) + model->BSIM3lcdsc = 0.0; + if (!model->BSIM3lcdscbGiven) + model->BSIM3lcdscb = 0.0; + if (!model->BSIM3lcdscdGiven) + model->BSIM3lcdscd = 0.0; + if (!model->BSIM3lcitGiven) + model->BSIM3lcit = 0.0; + if (!model->BSIM3lnfactorGiven) + model->BSIM3lnfactor = 0.0; + if (!model->BSIM3lxjGiven) + model->BSIM3lxj = 0.0; + if (!model->BSIM3lvsatGiven) + model->BSIM3lvsat = 0.0; + if (!model->BSIM3latGiven) + model->BSIM3lat = 0.0; + if (!model->BSIM3la0Given) + model->BSIM3la0 = 0.0; + if (!model->BSIM3lagsGiven) + model->BSIM3lags = 0.0; + if (!model->BSIM3la1Given) + model->BSIM3la1 = 0.0; + if (!model->BSIM3la2Given) + model->BSIM3la2 = 0.0; + if (!model->BSIM3lketaGiven) + model->BSIM3lketa = 0.0; + if (!model->BSIM3lnsubGiven) + model->BSIM3lnsub = 0.0; + if (!model->BSIM3lnpeakGiven) + model->BSIM3lnpeak = 0.0; + if (!model->BSIM3lngateGiven) + model->BSIM3lngate = 0.0; + if (!model->BSIM3lvbmGiven) + model->BSIM3lvbm = 0.0; + if (!model->BSIM3lxtGiven) + model->BSIM3lxt = 0.0; + if (!model->BSIM3lkt1Given) + model->BSIM3lkt1 = 0.0; + if (!model->BSIM3lkt1lGiven) + model->BSIM3lkt1l = 0.0; + if (!model->BSIM3lkt2Given) + model->BSIM3lkt2 = 0.0; + if (!model->BSIM3lk3Given) + model->BSIM3lk3 = 0.0; + if (!model->BSIM3lk3bGiven) + model->BSIM3lk3b = 0.0; + if (!model->BSIM3lw0Given) + model->BSIM3lw0 = 0.0; + if (!model->BSIM3lnlxGiven) + model->BSIM3lnlx = 0.0; + if (!model->BSIM3ldvt0Given) + model->BSIM3ldvt0 = 0.0; + if (!model->BSIM3ldvt1Given) + model->BSIM3ldvt1 = 0.0; + if (!model->BSIM3ldvt2Given) + model->BSIM3ldvt2 = 0.0; + if (!model->BSIM3ldvt0wGiven) + model->BSIM3ldvt0w = 0.0; + if (!model->BSIM3ldvt1wGiven) + model->BSIM3ldvt1w = 0.0; + if (!model->BSIM3ldvt2wGiven) + model->BSIM3ldvt2w = 0.0; + if (!model->BSIM3ldroutGiven) + model->BSIM3ldrout = 0.0; + if (!model->BSIM3ldsubGiven) + model->BSIM3ldsub = 0.0; + if (!model->BSIM3lvth0Given) + model->BSIM3lvth0 = 0.0; + if (!model->BSIM3luaGiven) + model->BSIM3lua = 0.0; + if (!model->BSIM3lua1Given) + model->BSIM3lua1 = 0.0; + if (!model->BSIM3lubGiven) + model->BSIM3lub = 0.0; + if (!model->BSIM3lub1Given) + model->BSIM3lub1 = 0.0; + if (!model->BSIM3lucGiven) + model->BSIM3luc = 0.0; + if (!model->BSIM3luc1Given) + model->BSIM3luc1 = 0.0; + if (!model->BSIM3lu0Given) + model->BSIM3lu0 = 0.0; + if (!model->BSIM3luteGiven) + model->BSIM3lute = 0.0; + if (!model->BSIM3lvoffGiven) + model->BSIM3lvoff = 0.0; + if (!model->BSIM3ldeltaGiven) + model->BSIM3ldelta = 0.0; + if (!model->BSIM3lrdswGiven) + model->BSIM3lrdsw = 0.0; + if (!model->BSIM3lprwbGiven) + model->BSIM3lprwb = 0.0; + if (!model->BSIM3lprwgGiven) + model->BSIM3lprwg = 0.0; + if (!model->BSIM3lprtGiven) + model->BSIM3lprt = 0.0; + if (!model->BSIM3leta0Given) + model->BSIM3leta0 = 0.0; + if (!model->BSIM3letabGiven) + model->BSIM3letab = -0.0; + if (!model->BSIM3lpclmGiven) + model->BSIM3lpclm = 0.0; + if (!model->BSIM3lpdibl1Given) + model->BSIM3lpdibl1 = 0.0; + if (!model->BSIM3lpdibl2Given) + model->BSIM3lpdibl2 = 0.0; + if (!model->BSIM3lpdiblbGiven) + model->BSIM3lpdiblb = 0.0; + if (!model->BSIM3lpscbe1Given) + model->BSIM3lpscbe1 = 0.0; + if (!model->BSIM3lpscbe2Given) + model->BSIM3lpscbe2 = 0.0; + if (!model->BSIM3lpvagGiven) + model->BSIM3lpvag = 0.0; + if (!model->BSIM3lwrGiven) + model->BSIM3lwr = 0.0; + if (!model->BSIM3ldwgGiven) + model->BSIM3ldwg = 0.0; + if (!model->BSIM3ldwbGiven) + model->BSIM3ldwb = 0.0; + if (!model->BSIM3lb0Given) + model->BSIM3lb0 = 0.0; + if (!model->BSIM3lb1Given) + model->BSIM3lb1 = 0.0; + if (!model->BSIM3lalpha0Given) + model->BSIM3lalpha0 = 0.0; + if (!model->BSIM3lalpha1Given) + model->BSIM3lalpha1 = 0.0; + if (!model->BSIM3lbeta0Given) + model->BSIM3lbeta0 = 0.0; + if (!model->BSIM3lvfbGiven) + model->BSIM3lvfb = 0.0; - if (!model->BSIM3lelmGiven) - model->BSIM3lelm = 0.0; - if (!model->BSIM3lcgslGiven) - model->BSIM3lcgsl = 0.0; - if (!model->BSIM3lcgdlGiven) - model->BSIM3lcgdl = 0.0; - if (!model->BSIM3lckappaGiven) - model->BSIM3lckappa = 0.0; - if (!model->BSIM3lclcGiven) - model->BSIM3lclc = 0.0; - if (!model->BSIM3lcleGiven) - model->BSIM3lcle = 0.0; - if (!model->BSIM3lcfGiven) - model->BSIM3lcf = 0.0; - if (!model->BSIM3lvfbcvGiven) - model->BSIM3lvfbcv = 0.0; - if (!model->BSIM3lacdeGiven) - model->BSIM3lacde = 0.0; - if (!model->BSIM3lmoinGiven) - model->BSIM3lmoin = 0.0; - if (!model->BSIM3lnoffGiven) - model->BSIM3lnoff = 0.0; - if (!model->BSIM3lvoffcvGiven) - model->BSIM3lvoffcv = 0.0; + if (!model->BSIM3lelmGiven) + model->BSIM3lelm = 0.0; + if (!model->BSIM3lcgslGiven) + model->BSIM3lcgsl = 0.0; + if (!model->BSIM3lcgdlGiven) + model->BSIM3lcgdl = 0.0; + if (!model->BSIM3lckappaGiven) + model->BSIM3lckappa = 0.0; + if (!model->BSIM3lclcGiven) + model->BSIM3lclc = 0.0; + if (!model->BSIM3lcleGiven) + model->BSIM3lcle = 0.0; + if (!model->BSIM3lcfGiven) + model->BSIM3lcf = 0.0; + if (!model->BSIM3lvfbcvGiven) + model->BSIM3lvfbcv = 0.0; + if (!model->BSIM3lacdeGiven) + model->BSIM3lacde = 0.0; + if (!model->BSIM3lmoinGiven) + model->BSIM3lmoin = 0.0; + if (!model->BSIM3lnoffGiven) + model->BSIM3lnoff = 0.0; + if (!model->BSIM3lvoffcvGiven) + model->BSIM3lvoffcv = 0.0; - /* Width dependence */ - if (!model->BSIM3wcdscGiven) - model->BSIM3wcdsc = 0.0; - if (!model->BSIM3wcdscbGiven) - model->BSIM3wcdscb = 0.0; - if (!model->BSIM3wcdscdGiven) - model->BSIM3wcdscd = 0.0; - if (!model->BSIM3wcitGiven) - model->BSIM3wcit = 0.0; - if (!model->BSIM3wnfactorGiven) - model->BSIM3wnfactor = 0.0; - if (!model->BSIM3wxjGiven) - model->BSIM3wxj = 0.0; - if (!model->BSIM3wvsatGiven) - model->BSIM3wvsat = 0.0; - if (!model->BSIM3watGiven) - model->BSIM3wat = 0.0; - if (!model->BSIM3wa0Given) - model->BSIM3wa0 = 0.0; - if (!model->BSIM3wagsGiven) - model->BSIM3wags = 0.0; - if (!model->BSIM3wa1Given) - model->BSIM3wa1 = 0.0; - if (!model->BSIM3wa2Given) - model->BSIM3wa2 = 0.0; - if (!model->BSIM3wketaGiven) - model->BSIM3wketa = 0.0; - if (!model->BSIM3wnsubGiven) - model->BSIM3wnsub = 0.0; - if (!model->BSIM3wnpeakGiven) - model->BSIM3wnpeak = 0.0; - if (!model->BSIM3wngateGiven) - model->BSIM3wngate = 0.0; - if (!model->BSIM3wvbmGiven) - model->BSIM3wvbm = 0.0; - if (!model->BSIM3wxtGiven) - model->BSIM3wxt = 0.0; - if (!model->BSIM3wkt1Given) - model->BSIM3wkt1 = 0.0; - if (!model->BSIM3wkt1lGiven) - model->BSIM3wkt1l = 0.0; - if (!model->BSIM3wkt2Given) - model->BSIM3wkt2 = 0.0; - if (!model->BSIM3wk3Given) - model->BSIM3wk3 = 0.0; - if (!model->BSIM3wk3bGiven) - model->BSIM3wk3b = 0.0; - if (!model->BSIM3ww0Given) - model->BSIM3ww0 = 0.0; - if (!model->BSIM3wnlxGiven) - model->BSIM3wnlx = 0.0; - if (!model->BSIM3wdvt0Given) - model->BSIM3wdvt0 = 0.0; - if (!model->BSIM3wdvt1Given) - model->BSIM3wdvt1 = 0.0; - if (!model->BSIM3wdvt2Given) - model->BSIM3wdvt2 = 0.0; - if (!model->BSIM3wdvt0wGiven) - model->BSIM3wdvt0w = 0.0; - if (!model->BSIM3wdvt1wGiven) - model->BSIM3wdvt1w = 0.0; - if (!model->BSIM3wdvt2wGiven) - model->BSIM3wdvt2w = 0.0; - if (!model->BSIM3wdroutGiven) - model->BSIM3wdrout = 0.0; - if (!model->BSIM3wdsubGiven) - model->BSIM3wdsub = 0.0; - if (!model->BSIM3wvth0Given) - model->BSIM3wvth0 = 0.0; - if (!model->BSIM3wuaGiven) - model->BSIM3wua = 0.0; - if (!model->BSIM3wua1Given) - model->BSIM3wua1 = 0.0; - if (!model->BSIM3wubGiven) - model->BSIM3wub = 0.0; - if (!model->BSIM3wub1Given) - model->BSIM3wub1 = 0.0; - if (!model->BSIM3wucGiven) - model->BSIM3wuc = 0.0; - if (!model->BSIM3wuc1Given) - model->BSIM3wuc1 = 0.0; - if (!model->BSIM3wu0Given) - model->BSIM3wu0 = 0.0; - if (!model->BSIM3wuteGiven) - model->BSIM3wute = 0.0; - if (!model->BSIM3wvoffGiven) - model->BSIM3wvoff = 0.0; - if (!model->BSIM3wdeltaGiven) - model->BSIM3wdelta = 0.0; - if (!model->BSIM3wrdswGiven) - model->BSIM3wrdsw = 0.0; - if (!model->BSIM3wprwbGiven) - model->BSIM3wprwb = 0.0; - if (!model->BSIM3wprwgGiven) - model->BSIM3wprwg = 0.0; - if (!model->BSIM3wprtGiven) - model->BSIM3wprt = 0.0; - if (!model->BSIM3weta0Given) - model->BSIM3weta0 = 0.0; - if (!model->BSIM3wetabGiven) - model->BSIM3wetab = 0.0; - if (!model->BSIM3wpclmGiven) - model->BSIM3wpclm = 0.0; - if (!model->BSIM3wpdibl1Given) - model->BSIM3wpdibl1 = 0.0; - if (!model->BSIM3wpdibl2Given) - model->BSIM3wpdibl2 = 0.0; - if (!model->BSIM3wpdiblbGiven) - model->BSIM3wpdiblb = 0.0; - if (!model->BSIM3wpscbe1Given) - model->BSIM3wpscbe1 = 0.0; - if (!model->BSIM3wpscbe2Given) - model->BSIM3wpscbe2 = 0.0; - if (!model->BSIM3wpvagGiven) - model->BSIM3wpvag = 0.0; - if (!model->BSIM3wwrGiven) - model->BSIM3wwr = 0.0; - if (!model->BSIM3wdwgGiven) - model->BSIM3wdwg = 0.0; - if (!model->BSIM3wdwbGiven) - model->BSIM3wdwb = 0.0; - if (!model->BSIM3wb0Given) - model->BSIM3wb0 = 0.0; - if (!model->BSIM3wb1Given) - model->BSIM3wb1 = 0.0; - if (!model->BSIM3walpha0Given) - model->BSIM3walpha0 = 0.0; - if (!model->BSIM3walpha1Given) - model->BSIM3walpha1 = 0.0; - if (!model->BSIM3wbeta0Given) - model->BSIM3wbeta0 = 0.0; - if (!model->BSIM3wvfbGiven) - model->BSIM3wvfb = 0.0; + /* Width dependence */ + if (!model->BSIM3wcdscGiven) + model->BSIM3wcdsc = 0.0; + if (!model->BSIM3wcdscbGiven) + model->BSIM3wcdscb = 0.0; + if (!model->BSIM3wcdscdGiven) + model->BSIM3wcdscd = 0.0; + if (!model->BSIM3wcitGiven) + model->BSIM3wcit = 0.0; + if (!model->BSIM3wnfactorGiven) + model->BSIM3wnfactor = 0.0; + if (!model->BSIM3wxjGiven) + model->BSIM3wxj = 0.0; + if (!model->BSIM3wvsatGiven) + model->BSIM3wvsat = 0.0; + if (!model->BSIM3watGiven) + model->BSIM3wat = 0.0; + if (!model->BSIM3wa0Given) + model->BSIM3wa0 = 0.0; + if (!model->BSIM3wagsGiven) + model->BSIM3wags = 0.0; + if (!model->BSIM3wa1Given) + model->BSIM3wa1 = 0.0; + if (!model->BSIM3wa2Given) + model->BSIM3wa2 = 0.0; + if (!model->BSIM3wketaGiven) + model->BSIM3wketa = 0.0; + if (!model->BSIM3wnsubGiven) + model->BSIM3wnsub = 0.0; + if (!model->BSIM3wnpeakGiven) + model->BSIM3wnpeak = 0.0; + if (!model->BSIM3wngateGiven) + model->BSIM3wngate = 0.0; + if (!model->BSIM3wvbmGiven) + model->BSIM3wvbm = 0.0; + if (!model->BSIM3wxtGiven) + model->BSIM3wxt = 0.0; + if (!model->BSIM3wkt1Given) + model->BSIM3wkt1 = 0.0; + if (!model->BSIM3wkt1lGiven) + model->BSIM3wkt1l = 0.0; + if (!model->BSIM3wkt2Given) + model->BSIM3wkt2 = 0.0; + if (!model->BSIM3wk3Given) + model->BSIM3wk3 = 0.0; + if (!model->BSIM3wk3bGiven) + model->BSIM3wk3b = 0.0; + if (!model->BSIM3ww0Given) + model->BSIM3ww0 = 0.0; + if (!model->BSIM3wnlxGiven) + model->BSIM3wnlx = 0.0; + if (!model->BSIM3wdvt0Given) + model->BSIM3wdvt0 = 0.0; + if (!model->BSIM3wdvt1Given) + model->BSIM3wdvt1 = 0.0; + if (!model->BSIM3wdvt2Given) + model->BSIM3wdvt2 = 0.0; + if (!model->BSIM3wdvt0wGiven) + model->BSIM3wdvt0w = 0.0; + if (!model->BSIM3wdvt1wGiven) + model->BSIM3wdvt1w = 0.0; + if (!model->BSIM3wdvt2wGiven) + model->BSIM3wdvt2w = 0.0; + if (!model->BSIM3wdroutGiven) + model->BSIM3wdrout = 0.0; + if (!model->BSIM3wdsubGiven) + model->BSIM3wdsub = 0.0; + if (!model->BSIM3wvth0Given) + model->BSIM3wvth0 = 0.0; + if (!model->BSIM3wuaGiven) + model->BSIM3wua = 0.0; + if (!model->BSIM3wua1Given) + model->BSIM3wua1 = 0.0; + if (!model->BSIM3wubGiven) + model->BSIM3wub = 0.0; + if (!model->BSIM3wub1Given) + model->BSIM3wub1 = 0.0; + if (!model->BSIM3wucGiven) + model->BSIM3wuc = 0.0; + if (!model->BSIM3wuc1Given) + model->BSIM3wuc1 = 0.0; + if (!model->BSIM3wu0Given) + model->BSIM3wu0 = 0.0; + if (!model->BSIM3wuteGiven) + model->BSIM3wute = 0.0; + if (!model->BSIM3wvoffGiven) + model->BSIM3wvoff = 0.0; + if (!model->BSIM3wdeltaGiven) + model->BSIM3wdelta = 0.0; + if (!model->BSIM3wrdswGiven) + model->BSIM3wrdsw = 0.0; + if (!model->BSIM3wprwbGiven) + model->BSIM3wprwb = 0.0; + if (!model->BSIM3wprwgGiven) + model->BSIM3wprwg = 0.0; + if (!model->BSIM3wprtGiven) + model->BSIM3wprt = 0.0; + if (!model->BSIM3weta0Given) + model->BSIM3weta0 = 0.0; + if (!model->BSIM3wetabGiven) + model->BSIM3wetab = 0.0; + if (!model->BSIM3wpclmGiven) + model->BSIM3wpclm = 0.0; + if (!model->BSIM3wpdibl1Given) + model->BSIM3wpdibl1 = 0.0; + if (!model->BSIM3wpdibl2Given) + model->BSIM3wpdibl2 = 0.0; + if (!model->BSIM3wpdiblbGiven) + model->BSIM3wpdiblb = 0.0; + if (!model->BSIM3wpscbe1Given) + model->BSIM3wpscbe1 = 0.0; + if (!model->BSIM3wpscbe2Given) + model->BSIM3wpscbe2 = 0.0; + if (!model->BSIM3wpvagGiven) + model->BSIM3wpvag = 0.0; + if (!model->BSIM3wwrGiven) + model->BSIM3wwr = 0.0; + if (!model->BSIM3wdwgGiven) + model->BSIM3wdwg = 0.0; + if (!model->BSIM3wdwbGiven) + model->BSIM3wdwb = 0.0; + if (!model->BSIM3wb0Given) + model->BSIM3wb0 = 0.0; + if (!model->BSIM3wb1Given) + model->BSIM3wb1 = 0.0; + if (!model->BSIM3walpha0Given) + model->BSIM3walpha0 = 0.0; + if (!model->BSIM3walpha1Given) + model->BSIM3walpha1 = 0.0; + if (!model->BSIM3wbeta0Given) + model->BSIM3wbeta0 = 0.0; + if (!model->BSIM3wvfbGiven) + model->BSIM3wvfb = 0.0; - if (!model->BSIM3welmGiven) - model->BSIM3welm = 0.0; - if (!model->BSIM3wcgslGiven) - model->BSIM3wcgsl = 0.0; - if (!model->BSIM3wcgdlGiven) - model->BSIM3wcgdl = 0.0; - if (!model->BSIM3wckappaGiven) - model->BSIM3wckappa = 0.0; - if (!model->BSIM3wcfGiven) - model->BSIM3wcf = 0.0; - if (!model->BSIM3wclcGiven) - model->BSIM3wclc = 0.0; - if (!model->BSIM3wcleGiven) - model->BSIM3wcle = 0.0; - if (!model->BSIM3wvfbcvGiven) - model->BSIM3wvfbcv = 0.0; - if (!model->BSIM3wacdeGiven) - model->BSIM3wacde = 0.0; - if (!model->BSIM3wmoinGiven) - model->BSIM3wmoin = 0.0; - if (!model->BSIM3wnoffGiven) - model->BSIM3wnoff = 0.0; - if (!model->BSIM3wvoffcvGiven) - model->BSIM3wvoffcv = 0.0; + if (!model->BSIM3welmGiven) + model->BSIM3welm = 0.0; + if (!model->BSIM3wcgslGiven) + model->BSIM3wcgsl = 0.0; + if (!model->BSIM3wcgdlGiven) + model->BSIM3wcgdl = 0.0; + if (!model->BSIM3wckappaGiven) + model->BSIM3wckappa = 0.0; + if (!model->BSIM3wcfGiven) + model->BSIM3wcf = 0.0; + if (!model->BSIM3wclcGiven) + model->BSIM3wclc = 0.0; + if (!model->BSIM3wcleGiven) + model->BSIM3wcle = 0.0; + if (!model->BSIM3wvfbcvGiven) + model->BSIM3wvfbcv = 0.0; + if (!model->BSIM3wacdeGiven) + model->BSIM3wacde = 0.0; + if (!model->BSIM3wmoinGiven) + model->BSIM3wmoin = 0.0; + if (!model->BSIM3wnoffGiven) + model->BSIM3wnoff = 0.0; + if (!model->BSIM3wvoffcvGiven) + model->BSIM3wvoffcv = 0.0; - /* Cross-term dependence */ - if (!model->BSIM3pcdscGiven) - model->BSIM3pcdsc = 0.0; - if (!model->BSIM3pcdscbGiven) - model->BSIM3pcdscb = 0.0; - if (!model->BSIM3pcdscdGiven) - model->BSIM3pcdscd = 0.0; - if (!model->BSIM3pcitGiven) - model->BSIM3pcit = 0.0; - if (!model->BSIM3pnfactorGiven) - model->BSIM3pnfactor = 0.0; - if (!model->BSIM3pxjGiven) - model->BSIM3pxj = 0.0; - if (!model->BSIM3pvsatGiven) - model->BSIM3pvsat = 0.0; - if (!model->BSIM3patGiven) - model->BSIM3pat = 0.0; - if (!model->BSIM3pa0Given) - model->BSIM3pa0 = 0.0; + /* Cross-term dependence */ + if (!model->BSIM3pcdscGiven) + model->BSIM3pcdsc = 0.0; + if (!model->BSIM3pcdscbGiven) + model->BSIM3pcdscb = 0.0; + if (!model->BSIM3pcdscdGiven) + model->BSIM3pcdscd = 0.0; + if (!model->BSIM3pcitGiven) + model->BSIM3pcit = 0.0; + if (!model->BSIM3pnfactorGiven) + model->BSIM3pnfactor = 0.0; + if (!model->BSIM3pxjGiven) + model->BSIM3pxj = 0.0; + if (!model->BSIM3pvsatGiven) + model->BSIM3pvsat = 0.0; + if (!model->BSIM3patGiven) + model->BSIM3pat = 0.0; + if (!model->BSIM3pa0Given) + model->BSIM3pa0 = 0.0; + + if (!model->BSIM3pagsGiven) + model->BSIM3pags = 0.0; + if (!model->BSIM3pa1Given) + model->BSIM3pa1 = 0.0; + if (!model->BSIM3pa2Given) + model->BSIM3pa2 = 0.0; + if (!model->BSIM3pketaGiven) + model->BSIM3pketa = 0.0; + if (!model->BSIM3pnsubGiven) + model->BSIM3pnsub = 0.0; + if (!model->BSIM3pnpeakGiven) + model->BSIM3pnpeak = 0.0; + if (!model->BSIM3pngateGiven) + model->BSIM3pngate = 0.0; + if (!model->BSIM3pvbmGiven) + model->BSIM3pvbm = 0.0; + if (!model->BSIM3pxtGiven) + model->BSIM3pxt = 0.0; + if (!model->BSIM3pkt1Given) + model->BSIM3pkt1 = 0.0; + if (!model->BSIM3pkt1lGiven) + model->BSIM3pkt1l = 0.0; + if (!model->BSIM3pkt2Given) + model->BSIM3pkt2 = 0.0; + if (!model->BSIM3pk3Given) + model->BSIM3pk3 = 0.0; + if (!model->BSIM3pk3bGiven) + model->BSIM3pk3b = 0.0; + if (!model->BSIM3pw0Given) + model->BSIM3pw0 = 0.0; + if (!model->BSIM3pnlxGiven) + model->BSIM3pnlx = 0.0; + if (!model->BSIM3pdvt0Given) + model->BSIM3pdvt0 = 0.0; + if (!model->BSIM3pdvt1Given) + model->BSIM3pdvt1 = 0.0; + if (!model->BSIM3pdvt2Given) + model->BSIM3pdvt2 = 0.0; + if (!model->BSIM3pdvt0wGiven) + model->BSIM3pdvt0w = 0.0; + if (!model->BSIM3pdvt1wGiven) + model->BSIM3pdvt1w = 0.0; + if (!model->BSIM3pdvt2wGiven) + model->BSIM3pdvt2w = 0.0; + if (!model->BSIM3pdroutGiven) + model->BSIM3pdrout = 0.0; + if (!model->BSIM3pdsubGiven) + model->BSIM3pdsub = 0.0; + if (!model->BSIM3pvth0Given) + model->BSIM3pvth0 = 0.0; + if (!model->BSIM3puaGiven) + model->BSIM3pua = 0.0; + if (!model->BSIM3pua1Given) + model->BSIM3pua1 = 0.0; + if (!model->BSIM3pubGiven) + model->BSIM3pub = 0.0; + if (!model->BSIM3pub1Given) + model->BSIM3pub1 = 0.0; + if (!model->BSIM3pucGiven) + model->BSIM3puc = 0.0; + if (!model->BSIM3puc1Given) + model->BSIM3puc1 = 0.0; + if (!model->BSIM3pu0Given) + model->BSIM3pu0 = 0.0; + if (!model->BSIM3puteGiven) + model->BSIM3pute = 0.0; + if (!model->BSIM3pvoffGiven) + model->BSIM3pvoff = 0.0; + if (!model->BSIM3pdeltaGiven) + model->BSIM3pdelta = 0.0; + if (!model->BSIM3prdswGiven) + model->BSIM3prdsw = 0.0; + if (!model->BSIM3pprwbGiven) + model->BSIM3pprwb = 0.0; + if (!model->BSIM3pprwgGiven) + model->BSIM3pprwg = 0.0; + if (!model->BSIM3pprtGiven) + model->BSIM3pprt = 0.0; + if (!model->BSIM3peta0Given) + model->BSIM3peta0 = 0.0; + if (!model->BSIM3petabGiven) + model->BSIM3petab = 0.0; + if (!model->BSIM3ppclmGiven) + model->BSIM3ppclm = 0.0; + if (!model->BSIM3ppdibl1Given) + model->BSIM3ppdibl1 = 0.0; + if (!model->BSIM3ppdibl2Given) + model->BSIM3ppdibl2 = 0.0; + if (!model->BSIM3ppdiblbGiven) + model->BSIM3ppdiblb = 0.0; + if (!model->BSIM3ppscbe1Given) + model->BSIM3ppscbe1 = 0.0; + if (!model->BSIM3ppscbe2Given) + model->BSIM3ppscbe2 = 0.0; + if (!model->BSIM3ppvagGiven) + model->BSIM3ppvag = 0.0; + if (!model->BSIM3pwrGiven) + model->BSIM3pwr = 0.0; + if (!model->BSIM3pdwgGiven) + model->BSIM3pdwg = 0.0; + if (!model->BSIM3pdwbGiven) + model->BSIM3pdwb = 0.0; + if (!model->BSIM3pb0Given) + model->BSIM3pb0 = 0.0; + if (!model->BSIM3pb1Given) + model->BSIM3pb1 = 0.0; + if (!model->BSIM3palpha0Given) + model->BSIM3palpha0 = 0.0; + if (!model->BSIM3palpha1Given) + model->BSIM3palpha1 = 0.0; + if (!model->BSIM3pbeta0Given) + model->BSIM3pbeta0 = 0.0; + if (!model->BSIM3pvfbGiven) + model->BSIM3pvfb = 0.0; - if (!model->BSIM3pagsGiven) - model->BSIM3pags = 0.0; - if (!model->BSIM3pa1Given) - model->BSIM3pa1 = 0.0; - if (!model->BSIM3pa2Given) - model->BSIM3pa2 = 0.0; - if (!model->BSIM3pketaGiven) - model->BSIM3pketa = 0.0; - if (!model->BSIM3pnsubGiven) - model->BSIM3pnsub = 0.0; - if (!model->BSIM3pnpeakGiven) - model->BSIM3pnpeak = 0.0; - if (!model->BSIM3pngateGiven) - model->BSIM3pngate = 0.0; - if (!model->BSIM3pvbmGiven) - model->BSIM3pvbm = 0.0; - if (!model->BSIM3pxtGiven) - model->BSIM3pxt = 0.0; - if (!model->BSIM3pkt1Given) - model->BSIM3pkt1 = 0.0; - if (!model->BSIM3pkt1lGiven) - model->BSIM3pkt1l = 0.0; - if (!model->BSIM3pkt2Given) - model->BSIM3pkt2 = 0.0; - if (!model->BSIM3pk3Given) - model->BSIM3pk3 = 0.0; - if (!model->BSIM3pk3bGiven) - model->BSIM3pk3b = 0.0; - if (!model->BSIM3pw0Given) - model->BSIM3pw0 = 0.0; - if (!model->BSIM3pnlxGiven) - model->BSIM3pnlx = 0.0; - if (!model->BSIM3pdvt0Given) - model->BSIM3pdvt0 = 0.0; - if (!model->BSIM3pdvt1Given) - model->BSIM3pdvt1 = 0.0; - if (!model->BSIM3pdvt2Given) - model->BSIM3pdvt2 = 0.0; - if (!model->BSIM3pdvt0wGiven) - model->BSIM3pdvt0w = 0.0; - if (!model->BSIM3pdvt1wGiven) - model->BSIM3pdvt1w = 0.0; - if (!model->BSIM3pdvt2wGiven) - model->BSIM3pdvt2w = 0.0; - if (!model->BSIM3pdroutGiven) - model->BSIM3pdrout = 0.0; - if (!model->BSIM3pdsubGiven) - model->BSIM3pdsub = 0.0; - if (!model->BSIM3pvth0Given) - model->BSIM3pvth0 = 0.0; - if (!model->BSIM3puaGiven) - model->BSIM3pua = 0.0; - if (!model->BSIM3pua1Given) - model->BSIM3pua1 = 0.0; - if (!model->BSIM3pubGiven) - model->BSIM3pub = 0.0; - if (!model->BSIM3pub1Given) - model->BSIM3pub1 = 0.0; - if (!model->BSIM3pucGiven) - model->BSIM3puc = 0.0; - if (!model->BSIM3puc1Given) - model->BSIM3puc1 = 0.0; - if (!model->BSIM3pu0Given) - model->BSIM3pu0 = 0.0; - if (!model->BSIM3puteGiven) - model->BSIM3pute = 0.0; - if (!model->BSIM3pvoffGiven) - model->BSIM3pvoff = 0.0; - if (!model->BSIM3pdeltaGiven) - model->BSIM3pdelta = 0.0; - if (!model->BSIM3prdswGiven) - model->BSIM3prdsw = 0.0; - if (!model->BSIM3pprwbGiven) - model->BSIM3pprwb = 0.0; - if (!model->BSIM3pprwgGiven) - model->BSIM3pprwg = 0.0; - if (!model->BSIM3pprtGiven) - model->BSIM3pprt = 0.0; - if (!model->BSIM3peta0Given) - model->BSIM3peta0 = 0.0; - if (!model->BSIM3petabGiven) - model->BSIM3petab = 0.0; - if (!model->BSIM3ppclmGiven) - model->BSIM3ppclm = 0.0; - if (!model->BSIM3ppdibl1Given) - model->BSIM3ppdibl1 = 0.0; - if (!model->BSIM3ppdibl2Given) - model->BSIM3ppdibl2 = 0.0; - if (!model->BSIM3ppdiblbGiven) - model->BSIM3ppdiblb = 0.0; - if (!model->BSIM3ppscbe1Given) - model->BSIM3ppscbe1 = 0.0; - if (!model->BSIM3ppscbe2Given) - model->BSIM3ppscbe2 = 0.0; - if (!model->BSIM3ppvagGiven) - model->BSIM3ppvag = 0.0; - if (!model->BSIM3pwrGiven) - model->BSIM3pwr = 0.0; - if (!model->BSIM3pdwgGiven) - model->BSIM3pdwg = 0.0; - if (!model->BSIM3pdwbGiven) - model->BSIM3pdwb = 0.0; - if (!model->BSIM3pb0Given) - model->BSIM3pb0 = 0.0; - if (!model->BSIM3pb1Given) - model->BSIM3pb1 = 0.0; - if (!model->BSIM3palpha0Given) - model->BSIM3palpha0 = 0.0; - if (!model->BSIM3palpha1Given) - model->BSIM3palpha1 = 0.0; - if (!model->BSIM3pbeta0Given) - model->BSIM3pbeta0 = 0.0; - if (!model->BSIM3pvfbGiven) - model->BSIM3pvfb = 0.0; + if (!model->BSIM3pelmGiven) + model->BSIM3pelm = 0.0; + if (!model->BSIM3pcgslGiven) + model->BSIM3pcgsl = 0.0; + if (!model->BSIM3pcgdlGiven) + model->BSIM3pcgdl = 0.0; + if (!model->BSIM3pckappaGiven) + model->BSIM3pckappa = 0.0; + if (!model->BSIM3pcfGiven) + model->BSIM3pcf = 0.0; + if (!model->BSIM3pclcGiven) + model->BSIM3pclc = 0.0; + if (!model->BSIM3pcleGiven) + model->BSIM3pcle = 0.0; + if (!model->BSIM3pvfbcvGiven) + model->BSIM3pvfbcv = 0.0; + if (!model->BSIM3pacdeGiven) + model->BSIM3pacde = 0.0; + if (!model->BSIM3pmoinGiven) + model->BSIM3pmoin = 0.0; + if (!model->BSIM3pnoffGiven) + model->BSIM3pnoff = 0.0; + if (!model->BSIM3pvoffcvGiven) + model->BSIM3pvoffcv = 0.0; - if (!model->BSIM3pelmGiven) - model->BSIM3pelm = 0.0; - if (!model->BSIM3pcgslGiven) - model->BSIM3pcgsl = 0.0; - if (!model->BSIM3pcgdlGiven) - model->BSIM3pcgdl = 0.0; - if (!model->BSIM3pckappaGiven) - model->BSIM3pckappa = 0.0; - if (!model->BSIM3pcfGiven) - model->BSIM3pcf = 0.0; - if (!model->BSIM3pclcGiven) - model->BSIM3pclc = 0.0; - if (!model->BSIM3pcleGiven) - model->BSIM3pcle = 0.0; - if (!model->BSIM3pvfbcvGiven) - model->BSIM3pvfbcv = 0.0; - if (!model->BSIM3pacdeGiven) - model->BSIM3pacde = 0.0; - if (!model->BSIM3pmoinGiven) - model->BSIM3pmoin = 0.0; - if (!model->BSIM3pnoffGiven) - model->BSIM3pnoff = 0.0; - if (!model->BSIM3pvoffcvGiven) - model->BSIM3pvoffcv = 0.0; + /* unit degree celcius */ + if (!model->BSIM3tnomGiven) + model->BSIM3tnom = ckt->CKTnomTemp; + else + model->BSIM3tnom = model->BSIM3tnom + 273.15; + if (!model->BSIM3LintGiven) + model->BSIM3Lint = 0.0; + if (!model->BSIM3LlGiven) + model->BSIM3Ll = 0.0; + if (!model->BSIM3LlcGiven) + model->BSIM3Llc = model->BSIM3Ll; + if (!model->BSIM3LlnGiven) + model->BSIM3Lln = 1.0; + if (!model->BSIM3LwGiven) + model->BSIM3Lw = 0.0; + if (!model->BSIM3LwcGiven) + model->BSIM3Lwc = model->BSIM3Lw; + if (!model->BSIM3LwnGiven) + model->BSIM3Lwn = 1.0; + if (!model->BSIM3LwlGiven) + model->BSIM3Lwl = 0.0; + if (!model->BSIM3LwlcGiven) + model->BSIM3Lwlc = model->BSIM3Lwl; + if (!model->BSIM3LminGiven) + model->BSIM3Lmin = 0.0; + if (!model->BSIM3LmaxGiven) + model->BSIM3Lmax = 1.0; + if (!model->BSIM3WintGiven) + model->BSIM3Wint = 0.0; + if (!model->BSIM3WlGiven) + model->BSIM3Wl = 0.0; + if (!model->BSIM3WlcGiven) + model->BSIM3Wlc = model->BSIM3Wl; + if (!model->BSIM3WlnGiven) + model->BSIM3Wln = 1.0; + if (!model->BSIM3WwGiven) + model->BSIM3Ww = 0.0; + if (!model->BSIM3WwcGiven) + model->BSIM3Wwc = model->BSIM3Ww; + if (!model->BSIM3WwnGiven) + model->BSIM3Wwn = 1.0; + if (!model->BSIM3WwlGiven) + model->BSIM3Wwl = 0.0; + if (!model->BSIM3WwlcGiven) + model->BSIM3Wwlc = model->BSIM3Wwl; + if (!model->BSIM3WminGiven) + model->BSIM3Wmin = 0.0; + if (!model->BSIM3WmaxGiven) + model->BSIM3Wmax = 1.0; + if (!model->BSIM3dwcGiven) + model->BSIM3dwc = model->BSIM3Wint; + if (!model->BSIM3dlcGiven) + model->BSIM3dlc = model->BSIM3Lint; - /* unit degree celcius */ - if (!model->BSIM3tnomGiven) - model->BSIM3tnom = ckt->CKTnomTemp; - if (!model->BSIM3LintGiven) - model->BSIM3Lint = 0.0; - if (!model->BSIM3LlGiven) - model->BSIM3Ll = 0.0; - if (!model->BSIM3LlcGiven) - model->BSIM3Llc = model->BSIM3Ll; - if (!model->BSIM3LlnGiven) - model->BSIM3Lln = 1.0; - if (!model->BSIM3LwGiven) - model->BSIM3Lw = 0.0; - if (!model->BSIM3LwcGiven) - model->BSIM3Lwc = model->BSIM3Lw; - if (!model->BSIM3LwnGiven) - model->BSIM3Lwn = 1.0; - if (!model->BSIM3LwlGiven) - model->BSIM3Lwl = 0.0; - if (!model->BSIM3LwlcGiven) - model->BSIM3Lwlc = model->BSIM3Lwl; - if (!model->BSIM3LminGiven) - model->BSIM3Lmin = 0.0; - if (!model->BSIM3LmaxGiven) - model->BSIM3Lmax = 1.0; - if (!model->BSIM3WintGiven) - model->BSIM3Wint = 0.0; - if (!model->BSIM3WlGiven) - model->BSIM3Wl = 0.0; - if (!model->BSIM3WlcGiven) - model->BSIM3Wlc = model->BSIM3Wl; - if (!model->BSIM3WlnGiven) - model->BSIM3Wln = 1.0; - if (!model->BSIM3WwGiven) - model->BSIM3Ww = 0.0; - if (!model->BSIM3WwcGiven) - model->BSIM3Wwc = model->BSIM3Ww; - if (!model->BSIM3WwnGiven) - model->BSIM3Wwn = 1.0; - if (!model->BSIM3WwlGiven) - model->BSIM3Wwl = 0.0; - if (!model->BSIM3WwlcGiven) - model->BSIM3Wwlc = model->BSIM3Wwl; - if (!model->BSIM3WminGiven) - model->BSIM3Wmin = 0.0; - if (!model->BSIM3WmaxGiven) - model->BSIM3Wmax = 1.0; - if (!model->BSIM3dwcGiven) - model->BSIM3dwc = model->BSIM3Wint; - if (!model->BSIM3dlcGiven) - model->BSIM3dlc = model->BSIM3Lint; - if (!model->BSIM3cfGiven) - model->BSIM3cf = 2.0 * EPSOX / PI - * log (1.0 + 0.4e-6 / model->BSIM3tox); - if (!model->BSIM3cgdoGiven) - { - if (model->BSIM3dlcGiven && (model->BSIM3dlc > 0.0)) - { - model->BSIM3cgdo = - model->BSIM3dlc * model->BSIM3cox - - model->BSIM3cgdl; - } - else - model->BSIM3cgdo = - 0.6 * model->BSIM3xj * - model->BSIM3cox; - } - if (!model->BSIM3cgsoGiven) - { - if (model->BSIM3dlcGiven && (model->BSIM3dlc > 0.0)) - { - model->BSIM3cgso = - model->BSIM3dlc * model->BSIM3cox - - model->BSIM3cgsl; - } - else - model->BSIM3cgso = - 0.6 * model->BSIM3xj * - model->BSIM3cox; - } + if (!model->BSIM3xlGiven) + model->BSIM3xl = 0.0; + if (!model->BSIM3xwGiven) + model->BSIM3xw = 0.0; - if (!model->BSIM3cgboGiven) - { - model->BSIM3cgbo = - 2.0 * model->BSIM3dwc * model->BSIM3cox; - } - if (!model->BSIM3xpartGiven) - model->BSIM3xpart = 0.0; - if (!model->BSIM3sheetResistanceGiven) - model->BSIM3sheetResistance = 0.0; - if (!model->BSIM3unitAreaJctCapGiven) - model->BSIM3unitAreaJctCap = 5.0E-4; - if (!model->BSIM3unitLengthSidewallJctCapGiven) - model->BSIM3unitLengthSidewallJctCap = 5.0E-10; - if (!model->BSIM3unitLengthGateSidewallJctCapGiven) - model->BSIM3unitLengthGateSidewallJctCap = - model->BSIM3unitLengthSidewallJctCap; - if (!model->BSIM3jctSatCurDensityGiven) - model->BSIM3jctSatCurDensity = 1.0E-4; - if (!model->BSIM3jctSidewallSatCurDensityGiven) - model->BSIM3jctSidewallSatCurDensity = 0.0; - if (!model->BSIM3bulkJctPotentialGiven) - model->BSIM3bulkJctPotential = 1.0; - if (!model->BSIM3sidewallJctPotentialGiven) - model->BSIM3sidewallJctPotential = 1.0; - if (!model->BSIM3GatesidewallJctPotentialGiven) - model->BSIM3GatesidewallJctPotential = - model->BSIM3sidewallJctPotential; - if (!model->BSIM3bulkJctBotGradingCoeffGiven) - model->BSIM3bulkJctBotGradingCoeff = 0.5; - if (!model->BSIM3bulkJctSideGradingCoeffGiven) - model->BSIM3bulkJctSideGradingCoeff = 0.33; - if (!model->BSIM3bulkJctGateSideGradingCoeffGiven) - model->BSIM3bulkJctGateSideGradingCoeff = - model->BSIM3bulkJctSideGradingCoeff; - if (!model->BSIM3jctEmissionCoeffGiven) - model->BSIM3jctEmissionCoeff = 1.0; - if (!model->BSIM3jctTempExponentGiven) - model->BSIM3jctTempExponent = 3.0; - if (!model->BSIM3oxideTrapDensityAGiven) - { - if (model->BSIM3type == NMOS) - model->BSIM3oxideTrapDensityA = 1e20; - else - model->BSIM3oxideTrapDensityA = 9.9e18; - } - if (!model->BSIM3oxideTrapDensityBGiven) - { - if (model->BSIM3type == NMOS) - model->BSIM3oxideTrapDensityB = 5e4; - else - model->BSIM3oxideTrapDensityB = 2.4e3; - } - if (!model->BSIM3oxideTrapDensityCGiven) - { - if (model->BSIM3type == NMOS) - model->BSIM3oxideTrapDensityC = -1.4e-12; - else - model->BSIM3oxideTrapDensityC = 1.4e-12; - - } - if (!model->BSIM3emGiven) - model->BSIM3em = 4.1e7; /* V/m */ - if (!model->BSIM3efGiven) - model->BSIM3ef = 1.0; - if (!model->BSIM3afGiven) - model->BSIM3af = 1.0; - if (!model->BSIM3kfGiven) - model->BSIM3kf = 0.0; - /* loop through all the instances of the model */ - for (here = model->BSIM3instances; here != NULL; - here = here->BSIM3nextInstance) - { - - if (here->BSIM3owner == ARCHme) - { - /* allocate a chunk of the state vector */ - - here->BSIM3states = *states; - *states += BSIM3numStates; - } + if (!model->BSIM3cfGiven) + model->BSIM3cf = 2.0 * EPSOX / PI + * log(1.0 + 0.4e-6 / model->BSIM3tox); + if (!model->BSIM3cgdoGiven) + { if (model->BSIM3dlcGiven && (model->BSIM3dlc > 0.0)) + { model->BSIM3cgdo = model->BSIM3dlc * model->BSIM3cox + - model->BSIM3cgdl ; + } + else + model->BSIM3cgdo = 0.6 * model->BSIM3xj * model->BSIM3cox; + } + if (!model->BSIM3cgsoGiven) + { if (model->BSIM3dlcGiven && (model->BSIM3dlc > 0.0)) + { model->BSIM3cgso = model->BSIM3dlc * model->BSIM3cox + - model->BSIM3cgsl ; + } + else + model->BSIM3cgso = 0.6 * model->BSIM3xj * model->BSIM3cox; + } - /* perform the parameter defaulting */ - if (!here->BSIM3drainAreaGiven) - here->BSIM3drainArea = 0.0; - if (!here->BSIM3drainPerimeterGiven) - here->BSIM3drainPerimeter = 0.0; - if (!here->BSIM3drainSquaresGiven) - here->BSIM3drainSquares = 1.0; - if (!here->BSIM3icVBSGiven) - here->BSIM3icVBS = 0.0; - if (!here->BSIM3icVDSGiven) - here->BSIM3icVDS = 0.0; - if (!here->BSIM3icVGSGiven) - here->BSIM3icVGS = 0.0; - if (!here->BSIM3lGiven) - here->BSIM3l = 5.0e-6; - if (!here->BSIM3sourceAreaGiven) - here->BSIM3sourceArea = 0.0; - if (!here->BSIM3sourcePerimeterGiven) - here->BSIM3sourcePerimeter = 0.0; - if (!here->BSIM3sourceSquaresGiven) - here->BSIM3sourceSquares = 1.0; - if (!here->BSIM3wGiven) - here->BSIM3w = 5.0e-6; + if (!model->BSIM3cgboGiven) + { model->BSIM3cgbo = 2.0 * model->BSIM3dwc * model->BSIM3cox; + } + if (!model->BSIM3xpartGiven) + model->BSIM3xpart = 0.0; + if (!model->BSIM3sheetResistanceGiven) + model->BSIM3sheetResistance = 0.0; + if (!model->BSIM3unitAreaJctCapGiven) + model->BSIM3unitAreaJctCap = 5.0E-4; + if (!model->BSIM3unitLengthSidewallJctCapGiven) + model->BSIM3unitLengthSidewallJctCap = 5.0E-10; + if (!model->BSIM3unitLengthGateSidewallJctCapGiven) + model->BSIM3unitLengthGateSidewallJctCap = model->BSIM3unitLengthSidewallJctCap ; + if (!model->BSIM3jctSatCurDensityGiven) + model->BSIM3jctSatCurDensity = 1.0E-4; + if (!model->BSIM3jctSidewallSatCurDensityGiven) + model->BSIM3jctSidewallSatCurDensity = 0.0; + if (!model->BSIM3bulkJctPotentialGiven) + model->BSIM3bulkJctPotential = 1.0; + if (!model->BSIM3sidewallJctPotentialGiven) + model->BSIM3sidewallJctPotential = 1.0; + if (!model->BSIM3GatesidewallJctPotentialGiven) + model->BSIM3GatesidewallJctPotential = model->BSIM3sidewallJctPotential; + if (!model->BSIM3bulkJctBotGradingCoeffGiven) + model->BSIM3bulkJctBotGradingCoeff = 0.5; + if (!model->BSIM3bulkJctSideGradingCoeffGiven) + model->BSIM3bulkJctSideGradingCoeff = 0.33; + if (!model->BSIM3bulkJctGateSideGradingCoeffGiven) + model->BSIM3bulkJctGateSideGradingCoeff = model->BSIM3bulkJctSideGradingCoeff; + if (!model->BSIM3jctEmissionCoeffGiven) + model->BSIM3jctEmissionCoeff = 1.0; + if (!model->BSIM3jctTempExponentGiven) + model->BSIM3jctTempExponent = 3.0; + if (!model->BSIM3oxideTrapDensityAGiven) + { if (model->BSIM3type == NMOS) + model->BSIM3oxideTrapDensityA = 1e20; + else + model->BSIM3oxideTrapDensityA=9.9e18; + } + if (!model->BSIM3oxideTrapDensityBGiven) + { if (model->BSIM3type == NMOS) + model->BSIM3oxideTrapDensityB = 5e4; + else + model->BSIM3oxideTrapDensityB = 2.4e3; + } + if (!model->BSIM3oxideTrapDensityCGiven) + { if (model->BSIM3type == NMOS) + model->BSIM3oxideTrapDensityC = -1.4e-12; + else + model->BSIM3oxideTrapDensityC = 1.4e-12; - if (!here->BSIM3mGiven) - here->BSIM3m = 1; + } + if (!model->BSIM3emGiven) + model->BSIM3em = 4.1e7; /* V/m */ + if (!model->BSIM3efGiven) + model->BSIM3ef = 1.0; + if (!model->BSIM3afGiven) + model->BSIM3af = 1.0; + if (!model->BSIM3kfGiven) + model->BSIM3kf = 0.0; + /* loop through all the instances of the model */ + for (here = model->BSIM3instances; here != NULL ; + here=here->BSIM3nextInstance) + { + if (here->BSIM3owner == ARCHme) + { + /* allocate a chunk of the state vector */ + here->BSIM3states = *states; + *states += BSIM3numStates; + } - if (!here->BSIM3nqsModGiven) - here->BSIM3nqsMod = 0; + /* perform the parameter defaulting */ + if (!here->BSIM3drainAreaGiven) + here->BSIM3drainArea = 0.0; + if (!here->BSIM3drainPerimeterGiven) + here->BSIM3drainPerimeter = 0.0; + if (!here->BSIM3drainSquaresGiven) + here->BSIM3drainSquares = 1.0; + if (!here->BSIM3icVBSGiven) + here->BSIM3icVBS = 0.0; + if (!here->BSIM3icVDSGiven) + here->BSIM3icVDS = 0.0; + if (!here->BSIM3icVGSGiven) + here->BSIM3icVGS = 0.0; + if (!here->BSIM3lGiven) + here->BSIM3l = 5.0e-6; + if (!here->BSIM3sourceAreaGiven) + here->BSIM3sourceArea = 0.0; + if (!here->BSIM3sourcePerimeterGiven) + here->BSIM3sourcePerimeter = 0.0; + if (!here->BSIM3sourceSquaresGiven) + here->BSIM3sourceSquares = 1.0; + if (!here->BSIM3wGiven) + here->BSIM3w = 5.0e-6; + if (!here->BSIM3nqsModGiven) + here->BSIM3nqsMod = 0; - /* process drain series resistance */ - if ((model->BSIM3sheetResistance > 0.0) && - (here->BSIM3drainSquares > 0.0) && - (here->BSIM3dNodePrime == 0)) - { - error = CKTmkVolt (ckt, &tmp, here->BSIM3name, - "drain"); - if (error) - return (error); - here->BSIM3dNodePrime = tmp->number; - if (ckt->CKTcopyNodesets) - { - if (CKTinst2Node(ckt, here, 1, &tmpNode, &tmpName) == OK) - { - if (tmpNode->nsGiven) - { - tmp->nodeset = tmpNode->nodeset; - tmp->nsGiven = tmpNode->nsGiven; - } - } - } - } - else - { - here->BSIM3dNodePrime = here->BSIM3dNode; - } + if (!here->BSIM3mGiven) + here->BSIM3m = 1; - /* process source series resistance */ - if ((model->BSIM3sheetResistance > 0.0) && - (here->BSIM3sourceSquares > 0.0) && - (here->BSIM3sNodePrime == 0)) - { - error = CKTmkVolt (ckt, &tmp, here->BSIM3name, - "source"); - if (error) - return (error); - here->BSIM3sNodePrime = tmp->number; - if (ckt->CKTcopyNodesets) - { - if (CKTinst2Node - (ckt, here, 3, &tmpNode, - &tmpName) == OK) - { - if (tmpNode->nsGiven) - { - tmp->nodeset = tmpNode->nodeset; - tmp->nsGiven = tmpNode->nsGiven; - } - } - } - } - else - { - here->BSIM3sNodePrime = here->BSIM3sNode; - } + /* process drain series resistance */ + if ( ((model->BSIM3sheetResistance > 0.0) && + (here->BSIM3drainSquares > 0.0) && (here->BSIM3dNodePrime == 0)) + ||((model->BSIM3sheetResistance > 0.0) && + (model->BSIM3hdif > 0.0) && (here->BSIM3dNodePrime == 0)) + ||((model->BSIM3rd > 0.0) && + (model->BSIM3ldif > 0.0) && (here->BSIM3dNodePrime == 0)) + ||((model->BSIM3rd > 0.0) && + (model->BSIM3ld > 0.0) && (here->BSIM3dNodePrime == 0)) + ||((model->BSIM3rsc > 0.0) && (here->BSIM3dNodePrime == 0)) + ) + { error = CKTmkVolt(ckt,&tmp,here->BSIM3name,"drain"); + if(error) return(error); + here->BSIM3dNodePrime = tmp->number; + + if (ckt->CKTcopyNodesets) { + if (CKTinst2Node(ckt,here,1,&tmpNode,&tmpName)==OK) { + if (tmpNode->nsGiven) { + tmp->nodeset=tmpNode->nodeset; + tmp->nsGiven=tmpNode->nsGiven; + } + } + } + + } + else + { here->BSIM3dNodePrime = here->BSIM3dNode; + } + + /* process source series resistance */ + if ( ((model->BSIM3sheetResistance > 0.0) && + (here->BSIM3sourceSquares > 0.0) && (here->BSIM3sNodePrime == 0)) + ||((model->BSIM3sheetResistance > 0.0) && + (model->BSIM3hdif > 0.0) && (here->BSIM3sNodePrime == 0)) + ||((model->BSIM3rs > 0.0) && + (model->BSIM3ldif > 0.0) && (here->BSIM3sNodePrime == 0)) + ||((model->BSIM3rs > 0.0) && + (model->BSIM3ld > 0.0) && (here->BSIM3sNodePrime == 0)) + ||((model->BSIM3rsc > 0.0) && (here->BSIM3sNodePrime == 0)) + ) + { error = CKTmkVolt(ckt,&tmp,here->BSIM3name,"source"); + if(error) return(error); + here->BSIM3sNodePrime = tmp->number; + + if (ckt->CKTcopyNodesets) { + if (CKTinst2Node(ckt,here,3,&tmpNode,&tmpName)==OK) { + if (tmpNode->nsGiven) { + tmp->nodeset=tmpNode->nodeset; + tmp->nsGiven=tmpNode->nsGiven; + } + } + } - /* internal charge node */ + } + else + { here->BSIM3sNodePrime = here->BSIM3sNode; + } - if ((here->BSIM3nqsMod) && (here->BSIM3qNode == 0)) - { - error = CKTmkVolt (ckt, &tmp, here->BSIM3name, - "charge"); - if (error) - return (error); - here->BSIM3qNode = tmp->number; - } - else - { - here->BSIM3qNode = 0; - } + /* internal charge node */ + + if ((here->BSIM3nqsMod) && (here->BSIM3qNode == 0)) + { error = CKTmkVolt(ckt,&tmp,here->BSIM3name,"charge"); + if(error) return(error); + here->BSIM3qNode = tmp->number; + } + else + { here->BSIM3qNode = 0; + } - /* set Sparse Matrix Pointers */ + /* set Sparse Matrix Pointers */ /* macro to make elements with built in test for out of memory */ #define TSTALLOC(ptr,first,second) \ @@ -1028,70 +1010,78 @@ if((here->ptr = SMPmakeElt(matrix,here->first,here->second))==(double *)NULL){\ return(E_NOMEM);\ } - TSTALLOC (BSIM3DdPtr, BSIM3dNode, BSIM3dNode) - TSTALLOC (BSIM3GgPtr, BSIM3gNode, BSIM3gNode) - TSTALLOC (BSIM3SsPtr, BSIM3sNode, BSIM3sNode) - TSTALLOC (BSIM3BbPtr, BSIM3bNode, BSIM3bNode) - TSTALLOC (BSIM3DPdpPtr, BSIM3dNodePrime, BSIM3dNodePrime) - TSTALLOC (BSIM3SPspPtr, BSIM3sNodePrime, BSIM3sNodePrime) - TSTALLOC (BSIM3DdpPtr, BSIM3dNode, BSIM3dNodePrime) - TSTALLOC (BSIM3GbPtr, BSIM3gNode, BSIM3bNode) - TSTALLOC (BSIM3GdpPtr, BSIM3gNode, BSIM3dNodePrime) - TSTALLOC (BSIM3GspPtr, BSIM3gNode, BSIM3sNodePrime) - TSTALLOC (BSIM3SspPtr, BSIM3sNode, BSIM3sNodePrime) - TSTALLOC (BSIM3BdpPtr, BSIM3bNode, BSIM3dNodePrime) - TSTALLOC (BSIM3BspPtr, BSIM3bNode, BSIM3sNodePrime) - TSTALLOC (BSIM3DPspPtr, BSIM3dNodePrime, BSIM3sNodePrime) - TSTALLOC (BSIM3DPdPtr, BSIM3dNodePrime, BSIM3dNode) - TSTALLOC (BSIM3BgPtr, BSIM3bNode, BSIM3gNode) - TSTALLOC (BSIM3DPgPtr, BSIM3dNodePrime, BSIM3gNode) - TSTALLOC (BSIM3SPgPtr, BSIM3sNodePrime, BSIM3gNode) - TSTALLOC (BSIM3SPsPtr, BSIM3sNodePrime, BSIM3sNode) - TSTALLOC (BSIM3DPbPtr, BSIM3dNodePrime, BSIM3bNode) - TSTALLOC (BSIM3SPbPtr, BSIM3sNodePrime, BSIM3bNode) - TSTALLOC (BSIM3SPdpPtr, BSIM3sNodePrime, BSIM3dNodePrime) - TSTALLOC (BSIM3QqPtr, BSIM3qNode, BSIM3qNode) - TSTALLOC (BSIM3QdpPtr, BSIM3qNode, BSIM3dNodePrime) - TSTALLOC (BSIM3QspPtr, BSIM3qNode, BSIM3sNodePrime) - TSTALLOC (BSIM3QgPtr, BSIM3qNode, BSIM3gNode) - TSTALLOC (BSIM3QbPtr, BSIM3qNode, BSIM3bNode) - TSTALLOC (BSIM3DPqPtr, BSIM3dNodePrime, BSIM3qNode) - TSTALLOC (BSIM3SPqPtr, BSIM3sNodePrime, BSIM3qNode) - TSTALLOC (BSIM3GqPtr, BSIM3gNode, BSIM3qNode) - TSTALLOC (BSIM3BqPtr, BSIM3bNode, BSIM3qNode) - } - } - return (OK); -} + TSTALLOC(BSIM3DdPtr, BSIM3dNode, BSIM3dNode) + TSTALLOC(BSIM3GgPtr, BSIM3gNode, BSIM3gNode) + TSTALLOC(BSIM3SsPtr, BSIM3sNode, BSIM3sNode) + TSTALLOC(BSIM3BbPtr, BSIM3bNode, BSIM3bNode) + TSTALLOC(BSIM3DPdpPtr, BSIM3dNodePrime, BSIM3dNodePrime) + TSTALLOC(BSIM3SPspPtr, BSIM3sNodePrime, BSIM3sNodePrime) + TSTALLOC(BSIM3DdpPtr, BSIM3dNode, BSIM3dNodePrime) + TSTALLOC(BSIM3GbPtr, BSIM3gNode, BSIM3bNode) + TSTALLOC(BSIM3GdpPtr, BSIM3gNode, BSIM3dNodePrime) + TSTALLOC(BSIM3GspPtr, BSIM3gNode, BSIM3sNodePrime) + TSTALLOC(BSIM3SspPtr, BSIM3sNode, BSIM3sNodePrime) + TSTALLOC(BSIM3BdpPtr, BSIM3bNode, BSIM3dNodePrime) + TSTALLOC(BSIM3BspPtr, BSIM3bNode, BSIM3sNodePrime) + TSTALLOC(BSIM3DPspPtr, BSIM3dNodePrime, BSIM3sNodePrime) + TSTALLOC(BSIM3DPdPtr, BSIM3dNodePrime, BSIM3dNode) + TSTALLOC(BSIM3BgPtr, BSIM3bNode, BSIM3gNode) + TSTALLOC(BSIM3DPgPtr, BSIM3dNodePrime, BSIM3gNode) + TSTALLOC(BSIM3SPgPtr, BSIM3sNodePrime, BSIM3gNode) + TSTALLOC(BSIM3SPsPtr, BSIM3sNodePrime, BSIM3sNode) + TSTALLOC(BSIM3DPbPtr, BSIM3dNodePrime, BSIM3bNode) + TSTALLOC(BSIM3SPbPtr, BSIM3sNodePrime, BSIM3bNode) + TSTALLOC(BSIM3SPdpPtr, BSIM3sNodePrime, BSIM3dNodePrime) + + TSTALLOC(BSIM3QqPtr, BSIM3qNode, BSIM3qNode) + + TSTALLOC(BSIM3QdpPtr, BSIM3qNode, BSIM3dNodePrime) + TSTALLOC(BSIM3QspPtr, BSIM3qNode, BSIM3sNodePrime) + TSTALLOC(BSIM3QgPtr, BSIM3qNode, BSIM3gNode) + TSTALLOC(BSIM3QbPtr, BSIM3qNode, BSIM3bNode) + TSTALLOC(BSIM3DPqPtr, BSIM3dNodePrime, BSIM3qNode) + TSTALLOC(BSIM3SPqPtr, BSIM3sNodePrime, BSIM3qNode) + TSTALLOC(BSIM3GqPtr, BSIM3gNode, BSIM3qNode) + TSTALLOC(BSIM3BqPtr, BSIM3bNode, BSIM3qNode) + } + } + return(OK); +} int -BSIM3unsetup (inModel, ckt) - GENmodel *inModel; - CKTcircuit *ckt; +BSIM3unsetup(inModel,ckt) + GENmodel *inModel; + CKTcircuit *ckt; { - BSIM3model *model; - BSIM3instance *here; + BSIM3model *model; + BSIM3instance *here; - for (model = (BSIM3model *) inModel; model != NULL; - model = model->BSIM3nextModel) - { - for (here = model->BSIM3instances; here != NULL; - here = here->BSIM3nextInstance) - { - if (here->BSIM3dNodePrime - && here->BSIM3dNodePrime != here->BSIM3dNode) - { - CKTdltNNum (ckt, here->BSIM3dNodePrime); - here->BSIM3dNodePrime = 0; - } - if (here->BSIM3sNodePrime - && here->BSIM3sNodePrime != here->BSIM3sNode) - { - CKTdltNNum (ckt, here->BSIM3sNodePrime); - here->BSIM3sNodePrime = 0; - } - } - } - return OK; + for (model = (BSIM3model *)inModel; model != NULL; + model = model->BSIM3nextModel) + { + for (here = model->BSIM3instances; here != NULL; + here=here->BSIM3nextInstance) + { + if (here->BSIM3dNodePrime + && here->BSIM3dNodePrime != here->BSIM3dNode) + { + CKTdltNNum(ckt, here->BSIM3dNodePrime); + here->BSIM3dNodePrime = 0; + } + if (here->BSIM3sNodePrime + && here->BSIM3sNodePrime != here->BSIM3sNode) + { + CKTdltNNum(ckt, here->BSIM3sNodePrime); + here->BSIM3sNodePrime = 0; + } + } + } + return OK; } + + + + + + diff --git a/src/spicelib/devices/bsim3/b3temp.c b/src/spicelib/devices/bsim3/b3temp.c index 94b8c9132..776952edd 100644 --- a/src/spicelib/devices/bsim3/b3temp.c +++ b/src/spicelib/devices/bsim3/b3temp.c @@ -1,24 +1,14 @@ +/**** BSIM3v3.2.4, Released by Xuemei Xi 12/21/2001 ****/ + /********** * Copyright 2001 Regents of the University of California. All rights reserved. * File: b3temp.c of BSIM3v3.2.4 * Author: 1995 Min-Chie Jeng and Mansun Chan. * Author: 1997-1999 Weidong Liu. * Author: 2001 Xuemei Xi - * Modified by Paolo Nenzi 2002 + * Modified by Paolo Nenzi 2002 and Dietmar Warning 2003 **********/ -/* - * Release Notes: - * BSIM3v3.2.4, Released by Xuemei Xi 12/21/2001 - * BSIM3v3.2.3, Released by Xuemei Xi 10/05/2001 - * BSIM3v3.2.2, Released by Weidong Liu 04/20/1999 - * BSIM3v3.2, Released by Weidong Liu 06/16/1998 - */ - -/*************************************/ - -/* Lmin, Lmax, Wmin, Wmax */ - #include "ngspice.h" #include "smpdefs.h" #include "cktdefs.h" @@ -28,7 +18,7 @@ #include "suffix.h" #define Kb 1.3806226e-23 -#define KboQ 8.617087e-5 /* Kb / q where q = 1.60219e-19 */ +#define KboQ 8.617087e-5 /* Kb / q where q = 1.60219e-19 */ #define EPSOX 3.453133e-11 #define EPSSI 1.03594e-10 #define PI 3.141592654 @@ -40,1130 +30,1014 @@ /* ARGSUSED */ int -BSIM3temp (GENmodel * inModel, CKTcircuit * ckt) +BSIM3temp (GENmodel *inModel, CKTcircuit *ckt) { - BSIM3model *model = (BSIM3model *) inModel; - BSIM3instance *here; - struct bsim3SizeDependParam *pSizeDependParamKnot, *pLastKnot, - *pParam; - double tmp, tmp1, tmp2, tmp3, Eg, Eg0, ni, T0, T1, T2, T3, T4, T5, - Ldrn, Wdrn; - double delTemp, Temp, TRatio, Inv_L, Inv_W, Inv_LW, Dw, Dl, Vtm0, - Tnom; - double Nvtm, SourceSatCurrent, DrainSatCurrent; - int Size_Not_Found; - - /* loop through all the BSIM3 device models */ - for (; model != NULL; model = model->BSIM3nextModel) - { - Temp = ckt->CKTtemp; - if (model->BSIM3bulkJctPotential < 0.1) - { - model->BSIM3bulkJctPotential = 0.1; - fprintf (stderr, - "Given pb is less than 0.1. Pb is set to 0.1.\n"); - } - if (model->BSIM3sidewallJctPotential < 0.1) - { - model->BSIM3sidewallJctPotential = 0.1; - fprintf (stderr, - "Given pbsw is less than 0.1. Pbsw is set to 0.1.\n"); - } - if (model->BSIM3GatesidewallJctPotential < 0.1) - { - model->BSIM3GatesidewallJctPotential = 0.1; - fprintf (stderr, - "Given pbswg is less than 0.1. Pbswg is set to 0.1.\n"); - } - model->pSizeDependParamKnot = NULL; - pLastKnot = NULL; - - Tnom = model->BSIM3tnom; - TRatio = Temp / Tnom; - - model->BSIM3vcrit = - CONSTvt0 * log (CONSTvt0 / (CONSTroot2 * 1.0e-14)); - model->BSIM3factor1 = sqrt (EPSSI / EPSOX * model->BSIM3tox); - - 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)); - - model->BSIM3vtm = KboQ * Temp; - Eg = 1.16 - 7.02e-4 * Temp * Temp / (Temp + 1108.0); - if (Temp != Tnom) - { - T0 = Eg0 / Vtm0 - Eg / model->BSIM3vtm + - model->BSIM3jctTempExponent * log (Temp / - Tnom); - T1 = exp (T0 / model->BSIM3jctEmissionCoeff); - model->BSIM3jctTempSatCurDensity = - model->BSIM3jctSatCurDensity * T1; - model->BSIM3jctSidewallTempSatCurDensity = - model->BSIM3jctSidewallSatCurDensity * T1; - } - else - { - model->BSIM3jctTempSatCurDensity = - model->BSIM3jctSatCurDensity; - model->BSIM3jctSidewallTempSatCurDensity = - model->BSIM3jctSidewallSatCurDensity; - } - - if (model->BSIM3jctTempSatCurDensity < 0.0) - model->BSIM3jctTempSatCurDensity = 0.0; - if (model->BSIM3jctSidewallTempSatCurDensity < 0.0) - model->BSIM3jctSidewallTempSatCurDensity = 0.0; - - /* Temperature dependence of D/B and S/B diode capacitance begins */ - delTemp = ckt->CKTtemp - model->BSIM3tnom; - T0 = model->BSIM3tcj * delTemp; - if (T0 >= -1.0) - { - - /* Added revision dependent code */ - switch (model->BSIM3intVersion) - { - case BSIM3V324: - case BSIM3V323: - model->BSIM3unitAreaTempJctCap = - model->BSIM3unitAreaJctCap * (1.0 + - T0); - break; - case BSIM3V322: - case BSIM3V32: - default: - model->BSIM3unitAreaJctCap *= 1.0 + T0; - } - - } - else if (model->BSIM3unitAreaJctCap > 0.0) - { - - /* Added revision dependent code */ - switch (model->BSIM3intVersion) - { - case BSIM3V324: - case BSIM3V323: - model->BSIM3unitAreaTempJctCap = 0.0; - break; - case BSIM3V322: - case BSIM3V32: - default: - model->BSIM3unitAreaJctCap = 0.0; - } - - fprintf (stderr, - "Temperature effect has caused cj to be negative. Cj is clamped to zero.\n"); - } - T0 = model->BSIM3tcjsw * delTemp; - if (T0 >= -1.0) - { - - /* Added revision dependent code */ - switch (model->BSIM3intVersion) - { - case BSIM3V324: - case BSIM3V323: - model->BSIM3unitLengthSidewallTempJctCap = - model->BSIM3unitLengthSidewallJctCap * - (1.0 + T0); - break; - case BSIM3V322: - case BSIM3V32: - default: - model->BSIM3unitLengthSidewallJctCap *= - 1.0 + T0; - } - +BSIM3model *model = (BSIM3model*) inModel; +BSIM3instance *here; +struct bsim3SizeDependParam *pSizeDependParamKnot, *pLastKnot, *pParam; +double tmp, tmp1, tmp2, tmp3, Eg, Eg0, ni, T0, T1, T2, T3, T4, T5, Ldrn, Wdrn; +double delTemp, Temp, TRatio, Inv_L, Inv_W, Inv_LW, Vtm0, Tnom; +double Nvtm, SourceSatCurrent, DrainSatCurrent; +int Size_Not_Found; + + /* loop through all the BSIM3 device models */ + for (; model != NULL; model = model->BSIM3nextModel) + { Temp = ckt->CKTtemp; + if (model->BSIM3bulkJctPotential < 0.1) + { model->BSIM3bulkJctPotential = 0.1; + fprintf(stderr, "Given pb is less than 0.1. Pb is set to 0.1.\n"); + } + if (model->BSIM3sidewallJctPotential < 0.1) + { model->BSIM3sidewallJctPotential = 0.1; + fprintf(stderr, "Given pbsw is less than 0.1. Pbsw is set to 0.1.\n"); + } + if (model->BSIM3GatesidewallJctPotential < 0.1) + { model->BSIM3GatesidewallJctPotential = 0.1; + fprintf(stderr, "Given pbswg is less than 0.1. Pbswg is set to 0.1.\n"); + } + /* va: was memory leakage - free old node, (or better use again?) */ + FREE(model->pSizeDependParamKnot); + model->pSizeDependParamKnot = NULL; + pLastKnot = NULL; + + Tnom = model->BSIM3tnom; + TRatio = Temp / Tnom; + + model->BSIM3vcrit = CONSTvt0 * log(CONSTvt0 / (CONSTroot2 * 1.0e-14)); + model->BSIM3factor1 = sqrt(EPSSI / EPSOX * model->BSIM3tox); + + 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)); + + model->BSIM3vtm = KboQ * Temp; + Eg = 1.16 - 7.02e-4 * Temp * Temp / (Temp + 1108.0); + if (Temp != Tnom) + { T0 = Eg0 / Vtm0 - Eg / model->BSIM3vtm + model->BSIM3jctTempExponent + * log(Temp / Tnom); + T1 = exp(T0 / model->BSIM3jctEmissionCoeff); + model->BSIM3jctTempSatCurDensity = model->BSIM3jctSatCurDensity + * T1; + model->BSIM3jctSidewallTempSatCurDensity + = model->BSIM3jctSidewallSatCurDensity * T1; + } + else + { model->BSIM3jctTempSatCurDensity = model->BSIM3jctSatCurDensity; + model->BSIM3jctSidewallTempSatCurDensity + = model->BSIM3jctSidewallSatCurDensity; + } + + if (model->BSIM3jctTempSatCurDensity < 0.0) + model->BSIM3jctTempSatCurDensity = 0.0; + if (model->BSIM3jctSidewallTempSatCurDensity < 0.0) + model->BSIM3jctSidewallTempSatCurDensity = 0.0; + + /* Temperature dependence of D/B and S/B diode capacitance begins */ + delTemp = ckt->CKTtemp - model->BSIM3tnom; + T0 = model->BSIM3tcj * delTemp; + if (T0 >= -1.0) + { + /* Added revision dependent code */ + switch (model->BSIM3intVersion) { + case BSIM3V324: + case BSIM3V323: + model->BSIM3unitAreaTempJctCap = + model->BSIM3unitAreaJctCap * (1.0 + T0); + break; + case BSIM3V322: + case BSIM3V32: + default: + model->BSIM3unitAreaJctCap *= 1.0 + T0; } - else if (model->BSIM3unitLengthSidewallJctCap > 0.0) - { - - /* Added revision dependent code */ - switch (model->BSIM3intVersion) - { - case BSIM3V324: - case BSIM3V323: - model->BSIM3unitLengthSidewallTempJctCap = - 0.0; - break; - case BSIM3V322: - case BSIM3V32: - default: - model->BSIM3unitLengthSidewallJctCap = 0.0; - } - - fprintf (stderr, - "Temperature effect has caused cjsw to be negative. Cjsw is clamped to zero.\n"); + } + else if (model->BSIM3unitAreaJctCap > 0.0) + { + /* Added revision dependent code */ + switch (model->BSIM3intVersion) { + case BSIM3V324: + case BSIM3V323: + model->BSIM3unitAreaTempJctCap = 0.0; + break; + case BSIM3V322: + case BSIM3V32: + default: + model->BSIM3unitAreaJctCap = 0.0; } - T0 = model->BSIM3tcjswg * delTemp; - if (T0 >= -1.0) - { - - /* Added revision dependent code */ - switch (model->BSIM3intVersion) - { - case BSIM3V324: - case BSIM3V323: - - model->BSIM3unitLengthGateSidewallTempJctCap = - model-> - BSIM3unitLengthGateSidewallJctCap * - (1.0 + T0); - break; - - case BSIM3V322: - case BSIM3V32: - default: - model->BSIM3unitLengthGateSidewallJctCap *= - 1.0 + T0; - } - + fprintf(stderr, "Temperature effect has caused cj to be negative. Cj is clamped to zero.\n"); + } + T0 = model->BSIM3tcjsw * delTemp; + if (T0 >= -1.0) + { + /* Added revision dependent code */ + switch (model->BSIM3intVersion) { + case BSIM3V324: + case BSIM3V323: + model->BSIM3unitLengthSidewallTempJctCap = + model->BSIM3unitLengthSidewallJctCap * (1.0 + T0); + break; + case BSIM3V322: + case BSIM3V32: + default: + model->BSIM3unitLengthSidewallJctCap *= 1.0 + T0; } - else if (model->BSIM3unitLengthGateSidewallJctCap > 0.0) - { - - /* Added revision dependent code */ - switch (model->BSIM3intVersion) - { - case BSIM3V324: - case BSIM3V323: - - model->BSIM3unitLengthGateSidewallTempJctCap = - 0.0; - break; - - case BSIM3V322: - case BSIM3V32: - default: - - model->BSIM3unitLengthGateSidewallJctCap = - 0.0; - } - - fprintf (stderr, - "Temperature effect has caused cjswg to be negative. Cjswg is clamped to zero.\n"); + } + else if (model->BSIM3unitLengthSidewallJctCap > 0.0) + { + /* Added revision dependent code */ + switch (model->BSIM3intVersion) { + case BSIM3V324: + case BSIM3V323: + model->BSIM3unitLengthSidewallTempJctCap = 0.0; + break; + case BSIM3V322: + case BSIM3V32: + default: + model->BSIM3unitLengthSidewallJctCap = 0.0; } - - model->BSIM3PhiB = model->BSIM3bulkJctPotential - - model->BSIM3tpb * delTemp; - if (model->BSIM3PhiB < 0.01) - { - model->BSIM3PhiB = 0.01; - fprintf (stderr, - "Temperature effect has caused pb to be less than 0.01. Pb is clamped to 0.01.\n"); - } - model->BSIM3PhiBSW = model->BSIM3sidewallJctPotential - - model->BSIM3tpbsw * delTemp; - if (model->BSIM3PhiBSW <= 0.01) - { - model->BSIM3PhiBSW = 0.01; - fprintf (stderr, - "Temperature effect has caused pbsw to be less than 0.01. Pbsw is clamped to 0.01.\n"); + fprintf(stderr, "Temperature effect has caused cjsw to be negative. Cjsw is clamped to zero.\n"); + } + T0 = model->BSIM3tcjswg * delTemp; + if (T0 >= -1.0) + { + /* Added revision dependent code */ + switch (model->BSIM3intVersion) { + case BSIM3V324: + case BSIM3V323: + model->BSIM3unitLengthGateSidewallTempJctCap = + model->BSIM3unitLengthGateSidewallJctCap * (1.0 + T0); + break; + case BSIM3V322: + case BSIM3V32: + default: + model->BSIM3unitLengthGateSidewallJctCap *= 1.0 + T0; } - model->BSIM3PhiBSWG = model->BSIM3GatesidewallJctPotential - - model->BSIM3tpbswg * delTemp; - if (model->BSIM3PhiBSWG <= 0.01) - { - model->BSIM3PhiBSWG = 0.01; - fprintf (stderr, - "Temperature effect has caused pbswg to be less than 0.01. Pbswg is clamped to 0.01.\n"); + } + else if (model->BSIM3unitLengthGateSidewallJctCap > 0.0) + { + /* Added revision dependent code */ + switch (model->BSIM3intVersion) { + case BSIM3V324: + case BSIM3V323: + model->BSIM3unitLengthGateSidewallTempJctCap = 0.0; + break; + case BSIM3V322: + case BSIM3V32: + default: + model->BSIM3unitLengthGateSidewallJctCap = 0.0; } - /* End of junction capacitance */ - - /* loop through all the instances of the model */ - /* MCJ: Length and Width not initialized */ - for (here = model->BSIM3instances; here != NULL; - here = here->BSIM3nextInstance) - { - if (here->BSIM3owner != ARCHme) - continue; - - pSizeDependParamKnot = model->pSizeDependParamKnot; - Size_Not_Found = 1; - while ((pSizeDependParamKnot != NULL) - && Size_Not_Found) - { - if ((here->BSIM3l == - pSizeDependParamKnot->Length) - && (here->BSIM3w == - pSizeDependParamKnot->Width)) - { - Size_Not_Found = 0; - here->pParam = pSizeDependParamKnot; - pParam = here->pParam; /*bug-fix */ - } - else - { - pLastKnot = pSizeDependParamKnot; - pSizeDependParamKnot = - pSizeDependParamKnot->pNext; - } - } - - if (Size_Not_Found) - { - pParam = (struct bsim3SizeDependParam *) - tmalloc (sizeof - (struct - bsim3SizeDependParam)); - if (pLastKnot == NULL) - model->pSizeDependParamKnot = pParam; - else - pLastKnot->pNext = pParam; - pParam->pNext = NULL; - here->pParam = pParam; - - Ldrn = here->BSIM3l; - Wdrn = here->BSIM3w; - pParam->Length = Ldrn; - pParam->Width = Wdrn; - - T0 = pow (Ldrn, model->BSIM3Lln); - T1 = pow (Wdrn, model->BSIM3Lwn); - tmp1 = model->BSIM3Ll / T0 + - model->BSIM3Lw / T1 + - model->BSIM3Lwl / (T0 * T1); - pParam->BSIM3dl = model->BSIM3Lint + tmp1; - tmp2 = model->BSIM3Llc / T0 + - model->BSIM3Lwc / T1 + - model->BSIM3Lwlc / (T0 * T1); - pParam->BSIM3dlc = model->BSIM3dlc + tmp2; - - T2 = pow (Ldrn, model->BSIM3Wln); - T3 = pow (Wdrn, model->BSIM3Wwn); - tmp1 = model->BSIM3Wl / T2 + - model->BSIM3Ww / T3 + - model->BSIM3Wwl / (T2 * T3); - pParam->BSIM3dw = model->BSIM3Wint + tmp1; - tmp2 = model->BSIM3Wlc / T2 + - model->BSIM3Wwc / T3 + - model->BSIM3Wwlc / (T2 * T3); - pParam->BSIM3dwc = model->BSIM3dwc + tmp2; - - pParam->BSIM3leff = - here->BSIM3l - 2.0 * pParam->BSIM3dl; - if (pParam->BSIM3leff <= 0.0) - { - IFuid namarray[2]; - namarray[0] = model->BSIM3modName; - namarray[1] = here->BSIM3name; - (*(SPfrontEnd->IFerror)) (ERR_FATAL, - "BSIM3: mosfet %s, model %s: Effective channel length <= 0", - namarray); - return (E_BADPARM); - } - - pParam->BSIM3weff = - here->BSIM3w - 2.0 * pParam->BSIM3dw; - if (pParam->BSIM3weff <= 0.0) - { - IFuid namarray[2]; - namarray[0] = model->BSIM3modName; - namarray[1] = here->BSIM3name; - (*(SPfrontEnd->IFerror)) (ERR_FATAL, - "BSIM3: mosfet %s, model %s: Effective channel width <= 0", - namarray); - return (E_BADPARM); - } - - pParam->BSIM3leffCV = - here->BSIM3l - 2.0 * pParam->BSIM3dlc; - if (pParam->BSIM3leffCV <= 0.0) - { - IFuid namarray[2]; - namarray[0] = model->BSIM3modName; - namarray[1] = here->BSIM3name; - (*(SPfrontEnd->IFerror)) (ERR_FATAL, - "BSIM3: mosfet %s, model %s: Effective channel length for C-V <= 0", - namarray); - return (E_BADPARM); - } - - pParam->BSIM3weffCV = - here->BSIM3w - 2.0 * pParam->BSIM3dwc; - if (pParam->BSIM3weffCV <= 0.0) - { - IFuid namarray[2]; - namarray[0] = model->BSIM3modName; - namarray[1] = here->BSIM3name; - (*(SPfrontEnd->IFerror)) (ERR_FATAL, - "BSIM3: mosfet %s, model %s: Effective channel width for C-V <= 0", - namarray); - return (E_BADPARM); - } - - - if (model->BSIM3binUnit == 1) - { - Inv_L = 1.0e-6 / pParam->BSIM3leff; - Inv_W = 1.0e-6 / pParam->BSIM3weff; - Inv_LW = 1.0e-12 / (pParam->BSIM3leff - * - pParam-> - BSIM3weff); - } - else - { - Inv_L = 1.0 / pParam->BSIM3leff; - Inv_W = 1.0 / pParam->BSIM3weff; - Inv_LW = 1.0 / (pParam->BSIM3leff - * pParam->BSIM3weff); - } - pParam->BSIM3cdsc = model->BSIM3cdsc - + model->BSIM3lcdsc * Inv_L - + model->BSIM3wcdsc * Inv_W - + model->BSIM3pcdsc * Inv_LW; - pParam->BSIM3cdscb = model->BSIM3cdscb - + model->BSIM3lcdscb * Inv_L - + model->BSIM3wcdscb * Inv_W - + model->BSIM3pcdscb * Inv_LW; - - pParam->BSIM3cdscd = model->BSIM3cdscd - + model->BSIM3lcdscd * Inv_L - + model->BSIM3wcdscd * Inv_W - + model->BSIM3pcdscd * Inv_LW; - - pParam->BSIM3cit = model->BSIM3cit - + model->BSIM3lcit * Inv_L - + model->BSIM3wcit * Inv_W - + model->BSIM3pcit * Inv_LW; - pParam->BSIM3nfactor = model->BSIM3nfactor - + model->BSIM3lnfactor * Inv_L - + model->BSIM3wnfactor * Inv_W - + model->BSIM3pnfactor * Inv_LW; - pParam->BSIM3xj = model->BSIM3xj - + model->BSIM3lxj * Inv_L - + model->BSIM3wxj * Inv_W - + model->BSIM3pxj * Inv_LW; - pParam->BSIM3vsat = model->BSIM3vsat - + model->BSIM3lvsat * Inv_L - + model->BSIM3wvsat * Inv_W - + model->BSIM3pvsat * Inv_LW; - pParam->BSIM3at = model->BSIM3at - + model->BSIM3lat * Inv_L - + model->BSIM3wat * Inv_W - + model->BSIM3pat * Inv_LW; - pParam->BSIM3a0 = model->BSIM3a0 - + model->BSIM3la0 * Inv_L - + model->BSIM3wa0 * Inv_W - + model->BSIM3pa0 * Inv_LW; - - pParam->BSIM3ags = model->BSIM3ags - + model->BSIM3lags * Inv_L - + model->BSIM3wags * Inv_W - + model->BSIM3pags * Inv_LW; - - pParam->BSIM3a1 = model->BSIM3a1 - + model->BSIM3la1 * Inv_L - + model->BSIM3wa1 * Inv_W - + model->BSIM3pa1 * Inv_LW; - pParam->BSIM3a2 = model->BSIM3a2 - + model->BSIM3la2 * Inv_L - + model->BSIM3wa2 * Inv_W - + model->BSIM3pa2 * Inv_LW; - pParam->BSIM3keta = model->BSIM3keta - + model->BSIM3lketa * Inv_L - + model->BSIM3wketa * Inv_W - + model->BSIM3pketa * Inv_LW; - pParam->BSIM3nsub = model->BSIM3nsub - + model->BSIM3lnsub * Inv_L - + model->BSIM3wnsub * Inv_W - + model->BSIM3pnsub * Inv_LW; - pParam->BSIM3npeak = model->BSIM3npeak - + model->BSIM3lnpeak * Inv_L - + model->BSIM3wnpeak * Inv_W - + model->BSIM3pnpeak * Inv_LW; - pParam->BSIM3ngate = model->BSIM3ngate - + model->BSIM3lngate * Inv_L - + model->BSIM3wngate * Inv_W - + model->BSIM3pngate * Inv_LW; - pParam->BSIM3gamma1 = model->BSIM3gamma1 - + model->BSIM3lgamma1 * Inv_L - + model->BSIM3wgamma1 * Inv_W - + model->BSIM3pgamma1 * Inv_LW; - pParam->BSIM3gamma2 = model->BSIM3gamma2 - + model->BSIM3lgamma2 * Inv_L - + model->BSIM3wgamma2 * Inv_W - + model->BSIM3pgamma2 * Inv_LW; - pParam->BSIM3vbx = model->BSIM3vbx - + model->BSIM3lvbx * Inv_L - + model->BSIM3wvbx * Inv_W - + model->BSIM3pvbx * Inv_LW; - pParam->BSIM3vbm = model->BSIM3vbm - + model->BSIM3lvbm * Inv_L - + model->BSIM3wvbm * Inv_W - + model->BSIM3pvbm * Inv_LW; - pParam->BSIM3xt = model->BSIM3xt - + model->BSIM3lxt * Inv_L - + model->BSIM3wxt * Inv_W - + model->BSIM3pxt * Inv_LW; - pParam->BSIM3vfb = model->BSIM3vfb - + model->BSIM3lvfb * Inv_L - + model->BSIM3wvfb * Inv_W - + model->BSIM3pvfb * Inv_LW; - pParam->BSIM3k1 = model->BSIM3k1 - + model->BSIM3lk1 * Inv_L - + model->BSIM3wk1 * Inv_W - + model->BSIM3pk1 * Inv_LW; - pParam->BSIM3kt1 = model->BSIM3kt1 - + model->BSIM3lkt1 * Inv_L - + model->BSIM3wkt1 * Inv_W - + model->BSIM3pkt1 * Inv_LW; - pParam->BSIM3kt1l = model->BSIM3kt1l - + model->BSIM3lkt1l * Inv_L - + model->BSIM3wkt1l * Inv_W - + model->BSIM3pkt1l * Inv_LW; - pParam->BSIM3k2 = model->BSIM3k2 - + model->BSIM3lk2 * Inv_L - + model->BSIM3wk2 * Inv_W - + model->BSIM3pk2 * Inv_LW; - pParam->BSIM3kt2 = model->BSIM3kt2 - + model->BSIM3lkt2 * Inv_L - + model->BSIM3wkt2 * Inv_W - + model->BSIM3pkt2 * Inv_LW; - pParam->BSIM3k3 = model->BSIM3k3 - + model->BSIM3lk3 * Inv_L - + model->BSIM3wk3 * Inv_W - + model->BSIM3pk3 * Inv_LW; - pParam->BSIM3k3b = model->BSIM3k3b - + model->BSIM3lk3b * Inv_L - + model->BSIM3wk3b * Inv_W - + model->BSIM3pk3b * Inv_LW; - pParam->BSIM3w0 = model->BSIM3w0 - + model->BSIM3lw0 * Inv_L - + model->BSIM3ww0 * Inv_W - + model->BSIM3pw0 * Inv_LW; - pParam->BSIM3nlx = model->BSIM3nlx - + model->BSIM3lnlx * Inv_L - + model->BSIM3wnlx * Inv_W - + model->BSIM3pnlx * Inv_LW; - pParam->BSIM3dvt0 = model->BSIM3dvt0 - + model->BSIM3ldvt0 * Inv_L - + model->BSIM3wdvt0 * Inv_W - + model->BSIM3pdvt0 * Inv_LW; - pParam->BSIM3dvt1 = model->BSIM3dvt1 - + model->BSIM3ldvt1 * Inv_L - + model->BSIM3wdvt1 * Inv_W - + model->BSIM3pdvt1 * Inv_LW; - pParam->BSIM3dvt2 = model->BSIM3dvt2 - + model->BSIM3ldvt2 * Inv_L - + model->BSIM3wdvt2 * Inv_W - + model->BSIM3pdvt2 * Inv_LW; - pParam->BSIM3dvt0w = model->BSIM3dvt0w - + model->BSIM3ldvt0w * Inv_L - + model->BSIM3wdvt0w * Inv_W - + model->BSIM3pdvt0w * Inv_LW; - pParam->BSIM3dvt1w = model->BSIM3dvt1w - + model->BSIM3ldvt1w * Inv_L - + model->BSIM3wdvt1w * Inv_W - + model->BSIM3pdvt1w * Inv_LW; - pParam->BSIM3dvt2w = model->BSIM3dvt2w - + model->BSIM3ldvt2w * Inv_L - + model->BSIM3wdvt2w * Inv_W - + model->BSIM3pdvt2w * Inv_LW; - pParam->BSIM3drout = model->BSIM3drout - + model->BSIM3ldrout * Inv_L - + model->BSIM3wdrout * Inv_W - + model->BSIM3pdrout * Inv_LW; - pParam->BSIM3dsub = model->BSIM3dsub - + model->BSIM3ldsub * Inv_L - + model->BSIM3wdsub * Inv_W - + model->BSIM3pdsub * Inv_LW; - pParam->BSIM3vth0 = model->BSIM3vth0 - + model->BSIM3lvth0 * Inv_L - + model->BSIM3wvth0 * Inv_W - + model->BSIM3pvth0 * Inv_LW; - pParam->BSIM3ua = model->BSIM3ua - + model->BSIM3lua * Inv_L - + model->BSIM3wua * Inv_W - + model->BSIM3pua * Inv_LW; - pParam->BSIM3ua1 = model->BSIM3ua1 - + model->BSIM3lua1 * Inv_L - + model->BSIM3wua1 * Inv_W - + model->BSIM3pua1 * Inv_LW; - pParam->BSIM3ub = model->BSIM3ub - + model->BSIM3lub * Inv_L - + model->BSIM3wub * Inv_W - + model->BSIM3pub * Inv_LW; - pParam->BSIM3ub1 = model->BSIM3ub1 - + model->BSIM3lub1 * Inv_L - + model->BSIM3wub1 * Inv_W - + model->BSIM3pub1 * Inv_LW; - pParam->BSIM3uc = model->BSIM3uc - + model->BSIM3luc * Inv_L - + model->BSIM3wuc * Inv_W - + model->BSIM3puc * Inv_LW; - pParam->BSIM3uc1 = model->BSIM3uc1 - + model->BSIM3luc1 * Inv_L - + model->BSIM3wuc1 * Inv_W - + model->BSIM3puc1 * Inv_LW; - pParam->BSIM3u0 = model->BSIM3u0 - + model->BSIM3lu0 * Inv_L - + model->BSIM3wu0 * Inv_W - + model->BSIM3pu0 * Inv_LW; - pParam->BSIM3ute = model->BSIM3ute - + model->BSIM3lute * Inv_L - + model->BSIM3wute * Inv_W - + model->BSIM3pute * Inv_LW; - pParam->BSIM3voff = model->BSIM3voff - + model->BSIM3lvoff * Inv_L - + model->BSIM3wvoff * Inv_W - + model->BSIM3pvoff * Inv_LW; - pParam->BSIM3delta = model->BSIM3delta - + model->BSIM3ldelta * Inv_L - + model->BSIM3wdelta * Inv_W - + model->BSIM3pdelta * Inv_LW; - pParam->BSIM3rdsw = model->BSIM3rdsw - + model->BSIM3lrdsw * Inv_L - + model->BSIM3wrdsw * Inv_W - + model->BSIM3prdsw * Inv_LW; - pParam->BSIM3prwg = model->BSIM3prwg - + model->BSIM3lprwg * Inv_L - + model->BSIM3wprwg * Inv_W - + model->BSIM3pprwg * Inv_LW; - pParam->BSIM3prwb = model->BSIM3prwb - + model->BSIM3lprwb * Inv_L - + model->BSIM3wprwb * Inv_W - + model->BSIM3pprwb * Inv_LW; - pParam->BSIM3prt = model->BSIM3prt - + model->BSIM3lprt * Inv_L - + model->BSIM3wprt * Inv_W - + model->BSIM3pprt * Inv_LW; - pParam->BSIM3eta0 = model->BSIM3eta0 - + model->BSIM3leta0 * Inv_L - + model->BSIM3weta0 * Inv_W - + model->BSIM3peta0 * Inv_LW; - pParam->BSIM3etab = model->BSIM3etab - + model->BSIM3letab * Inv_L - + model->BSIM3wetab * Inv_W - + model->BSIM3petab * Inv_LW; - pParam->BSIM3pclm = model->BSIM3pclm - + model->BSIM3lpclm * Inv_L - + model->BSIM3wpclm * Inv_W - + model->BSIM3ppclm * Inv_LW; - pParam->BSIM3pdibl1 = model->BSIM3pdibl1 - + model->BSIM3lpdibl1 * Inv_L - + model->BSIM3wpdibl1 * Inv_W - + model->BSIM3ppdibl1 * Inv_LW; - pParam->BSIM3pdibl2 = model->BSIM3pdibl2 - + model->BSIM3lpdibl2 * Inv_L - + model->BSIM3wpdibl2 * Inv_W - + model->BSIM3ppdibl2 * Inv_LW; - pParam->BSIM3pdiblb = model->BSIM3pdiblb - + model->BSIM3lpdiblb * Inv_L - + model->BSIM3wpdiblb * Inv_W - + model->BSIM3ppdiblb * Inv_LW; - pParam->BSIM3pscbe1 = model->BSIM3pscbe1 - + model->BSIM3lpscbe1 * Inv_L - + model->BSIM3wpscbe1 * Inv_W - + model->BSIM3ppscbe1 * Inv_LW; - pParam->BSIM3pscbe2 = model->BSIM3pscbe2 - + model->BSIM3lpscbe2 * Inv_L - + model->BSIM3wpscbe2 * Inv_W - + model->BSIM3ppscbe2 * Inv_LW; - pParam->BSIM3pvag = model->BSIM3pvag - + model->BSIM3lpvag * Inv_L - + model->BSIM3wpvag * Inv_W - + model->BSIM3ppvag * Inv_LW; - pParam->BSIM3wr = model->BSIM3wr - + model->BSIM3lwr * Inv_L - + model->BSIM3wwr * Inv_W - + model->BSIM3pwr * Inv_LW; - pParam->BSIM3dwg = model->BSIM3dwg - + model->BSIM3ldwg * Inv_L - + model->BSIM3wdwg * Inv_W - + model->BSIM3pdwg * Inv_LW; - pParam->BSIM3dwb = model->BSIM3dwb - + model->BSIM3ldwb * Inv_L - + model->BSIM3wdwb * Inv_W - + model->BSIM3pdwb * Inv_LW; - pParam->BSIM3b0 = model->BSIM3b0 - + model->BSIM3lb0 * Inv_L - + model->BSIM3wb0 * Inv_W - + model->BSIM3pb0 * Inv_LW; - pParam->BSIM3b1 = model->BSIM3b1 - + model->BSIM3lb1 * Inv_L - + model->BSIM3wb1 * Inv_W - + model->BSIM3pb1 * Inv_LW; - pParam->BSIM3alpha0 = model->BSIM3alpha0 - + model->BSIM3lalpha0 * Inv_L - + model->BSIM3walpha0 * Inv_W - + model->BSIM3palpha0 * Inv_LW; - pParam->BSIM3alpha1 = model->BSIM3alpha1 - + model->BSIM3lalpha1 * Inv_L - + model->BSIM3walpha1 * Inv_W - + model->BSIM3palpha1 * Inv_LW; - pParam->BSIM3beta0 = model->BSIM3beta0 - + model->BSIM3lbeta0 * Inv_L - + model->BSIM3wbeta0 * Inv_W - + model->BSIM3pbeta0 * Inv_LW; - /* CV model */ - pParam->BSIM3elm = model->BSIM3elm - + model->BSIM3lelm * Inv_L - + model->BSIM3welm * Inv_W - + model->BSIM3pelm * Inv_LW; - pParam->BSIM3cgsl = model->BSIM3cgsl - + model->BSIM3lcgsl * Inv_L - + model->BSIM3wcgsl * Inv_W - + model->BSIM3pcgsl * Inv_LW; - pParam->BSIM3cgdl = model->BSIM3cgdl - + model->BSIM3lcgdl * Inv_L - + model->BSIM3wcgdl * Inv_W - + model->BSIM3pcgdl * Inv_LW; - pParam->BSIM3ckappa = model->BSIM3ckappa - + model->BSIM3lckappa * Inv_L - + model->BSIM3wckappa * Inv_W - + model->BSIM3pckappa * Inv_LW; - pParam->BSIM3cf = model->BSIM3cf - + model->BSIM3lcf * Inv_L - + model->BSIM3wcf * Inv_W - + model->BSIM3pcf * Inv_LW; - pParam->BSIM3clc = model->BSIM3clc - + model->BSIM3lclc * Inv_L - + model->BSIM3wclc * Inv_W - + model->BSIM3pclc * Inv_LW; - pParam->BSIM3cle = model->BSIM3cle - + model->BSIM3lcle * Inv_L - + model->BSIM3wcle * Inv_W - + model->BSIM3pcle * Inv_LW; - pParam->BSIM3vfbcv = model->BSIM3vfbcv - + model->BSIM3lvfbcv * Inv_L - + model->BSIM3wvfbcv * Inv_W - + model->BSIM3pvfbcv * Inv_LW; - pParam->BSIM3acde = model->BSIM3acde - + model->BSIM3lacde * Inv_L - + model->BSIM3wacde * Inv_W - + model->BSIM3pacde * Inv_LW; - pParam->BSIM3moin = model->BSIM3moin - + model->BSIM3lmoin * Inv_L - + model->BSIM3wmoin * Inv_W - + model->BSIM3pmoin * Inv_LW; - pParam->BSIM3noff = model->BSIM3noff - + model->BSIM3lnoff * Inv_L - + model->BSIM3wnoff * Inv_W - + model->BSIM3pnoff * Inv_LW; - pParam->BSIM3voffcv = model->BSIM3voffcv - + model->BSIM3lvoffcv * Inv_L - + model->BSIM3wvoffcv * Inv_W - + model->BSIM3pvoffcv * Inv_LW; - - pParam->BSIM3abulkCVfactor = - 1.0 + - pow ((pParam->BSIM3clc / - pParam->BSIM3leffCV), + fprintf(stderr, "Temperature effect has caused cjswg to be negative. Cjswg is clamped to zero.\n"); + } + + model->BSIM3PhiB = model->BSIM3bulkJctPotential + - model->BSIM3tpb * delTemp; + if (model->BSIM3PhiB < 0.01) + { model->BSIM3PhiB = 0.01; + fprintf(stderr, "Temperature effect has caused pb to be less than 0.01. Pb is clamped to 0.01.\n"); + } + model->BSIM3PhiBSW = model->BSIM3sidewallJctPotential + - model->BSIM3tpbsw * delTemp; + if (model->BSIM3PhiBSW <= 0.01) + { model->BSIM3PhiBSW = 0.01; + fprintf(stderr, "Temperature effect has caused pbsw to be less than 0.01. Pbsw is clamped to 0.01.\n"); + } + model->BSIM3PhiBSWG = model->BSIM3GatesidewallJctPotential + - model->BSIM3tpbswg * delTemp; + if (model->BSIM3PhiBSWG <= 0.01) + { model->BSIM3PhiBSWG = 0.01; + fprintf(stderr, "Temperature effect has caused pbswg to be less than 0.01. Pbswg is clamped to 0.01.\n"); + } + /* End of junction capacitance */ + + /* loop through all the instances of the model */ + /* MCJ: Length and Width not initialized */ + for (here = model->BSIM3instances; here != NULL; + here = here->BSIM3nextInstance) + { + if (here->BSIM3owner != ARCHme) continue; + pSizeDependParamKnot = model->pSizeDependParamKnot; + Size_Not_Found = 1; + while ((pSizeDependParamKnot != NULL) && Size_Not_Found) + { if ((here->BSIM3l == pSizeDependParamKnot->Length) + && (here->BSIM3w == pSizeDependParamKnot->Width)) + { Size_Not_Found = 0; + here->pParam = pSizeDependParamKnot; + if (model->BSIM3intVersion > BSIM3V322) + { + pParam = here->pParam; /*bug-fix */ + } + } + else + { pLastKnot = pSizeDependParamKnot; + pSizeDependParamKnot = pSizeDependParamKnot->pNext; + } + } + + if (Size_Not_Found) + { pParam = (struct bsim3SizeDependParam *)malloc( + sizeof(struct bsim3SizeDependParam)); + if (pLastKnot == NULL) + model->pSizeDependParamKnot = pParam; + else + pLastKnot->pNext = pParam; + pParam->pNext = NULL; + here->pParam = pParam; + + Ldrn = here->BSIM3l; + Wdrn = here->BSIM3w; + pParam->Length = Ldrn; + pParam->Width = Wdrn; + + T0 = pow(Ldrn, model->BSIM3Lln); + T1 = pow(Wdrn, model->BSIM3Lwn); + tmp1 = model->BSIM3Ll / T0 + model->BSIM3Lw / T1 + + model->BSIM3Lwl / (T0 * T1); + pParam->BSIM3dl = model->BSIM3Lint + tmp1; + tmp2 = model->BSIM3Llc / T0 + model->BSIM3Lwc / T1 + + model->BSIM3Lwlc / (T0 * T1); + pParam->BSIM3dlc = model->BSIM3dlc + tmp2; + + T2 = pow(Ldrn, model->BSIM3Wln); + T3 = pow(Wdrn, model->BSIM3Wwn); + tmp1 = model->BSIM3Wl / T2 + model->BSIM3Ww / T3 + + model->BSIM3Wwl / (T2 * T3); + pParam->BSIM3dw = model->BSIM3Wint + tmp1; + tmp2 = model->BSIM3Wlc / T2 + model->BSIM3Wwc / T3 + + model->BSIM3Wwlc / (T2 * T3); + pParam->BSIM3dwc = model->BSIM3dwc + tmp2; + + pParam->BSIM3leff = here->BSIM3l + model->BSIM3xl - 2.0 * pParam->BSIM3dl; + if (pParam->BSIM3leff <= 0.0) + { IFuid namarray[2]; + namarray[0] = model->BSIM3modName; + namarray[1] = here->BSIM3name; + (*(SPfrontEnd->IFerror))(ERR_FATAL, + "BSIM3: mosfet %s, model %s: Effective channel length <= 0", + namarray); + return(E_BADPARM); + } + + pParam->BSIM3weff = here->BSIM3w + model->BSIM3xw - 2.0 * pParam->BSIM3dw; + if (pParam->BSIM3weff <= 0.0) + { IFuid namarray[2]; + namarray[0] = model->BSIM3modName; + namarray[1] = here->BSIM3name; + (*(SPfrontEnd->IFerror))(ERR_FATAL, + "BSIM3: mosfet %s, model %s: Effective channel width <= 0", + namarray); + return(E_BADPARM); + } + + pParam->BSIM3leffCV = here->BSIM3l + model->BSIM3xl - 2.0 * pParam->BSIM3dlc; + if (pParam->BSIM3leffCV <= 0.0) + { IFuid namarray[2]; + namarray[0] = model->BSIM3modName; + namarray[1] = here->BSIM3name; + (*(SPfrontEnd->IFerror))(ERR_FATAL, + "BSIM3: mosfet %s, model %s: Effective channel length for C-V <= 0", + namarray); + return(E_BADPARM); + } + + pParam->BSIM3weffCV = here->BSIM3w + model->BSIM3xw - 2.0 * pParam->BSIM3dwc; + if (pParam->BSIM3weffCV <= 0.0) + { IFuid namarray[2]; + namarray[0] = model->BSIM3modName; + namarray[1] = here->BSIM3name; + (*(SPfrontEnd->IFerror))(ERR_FATAL, + "BSIM3: mosfet %s, model %s: Effective channel width for C-V <= 0", + namarray); + return(E_BADPARM); + } + + + if (model->BSIM3binUnit == 1) + { Inv_L = 1.0e-6 / pParam->BSIM3leff; + Inv_W = 1.0e-6 / pParam->BSIM3weff; + Inv_LW = 1.0e-12 / (pParam->BSIM3leff + * pParam->BSIM3weff); + } + else + { Inv_L = 1.0 / pParam->BSIM3leff; + Inv_W = 1.0 / pParam->BSIM3weff; + Inv_LW = 1.0 / (pParam->BSIM3leff + * pParam->BSIM3weff); + } + pParam->BSIM3cdsc = model->BSIM3cdsc + + model->BSIM3lcdsc * Inv_L + + model->BSIM3wcdsc * Inv_W + + model->BSIM3pcdsc * Inv_LW; + pParam->BSIM3cdscb = model->BSIM3cdscb + + model->BSIM3lcdscb * Inv_L + + model->BSIM3wcdscb * Inv_W + + model->BSIM3pcdscb * Inv_LW; + + pParam->BSIM3cdscd = model->BSIM3cdscd + + model->BSIM3lcdscd * Inv_L + + model->BSIM3wcdscd * Inv_W + + model->BSIM3pcdscd * Inv_LW; + + pParam->BSIM3cit = model->BSIM3cit + + model->BSIM3lcit * Inv_L + + model->BSIM3wcit * Inv_W + + model->BSIM3pcit * Inv_LW; + pParam->BSIM3nfactor = model->BSIM3nfactor + + model->BSIM3lnfactor * Inv_L + + model->BSIM3wnfactor * Inv_W + + model->BSIM3pnfactor * Inv_LW; + pParam->BSIM3xj = model->BSIM3xj + + model->BSIM3lxj * Inv_L + + model->BSIM3wxj * Inv_W + + model->BSIM3pxj * Inv_LW; + pParam->BSIM3vsat = model->BSIM3vsat + + model->BSIM3lvsat * Inv_L + + model->BSIM3wvsat * Inv_W + + model->BSIM3pvsat * Inv_LW; + pParam->BSIM3at = model->BSIM3at + + model->BSIM3lat * Inv_L + + model->BSIM3wat * Inv_W + + model->BSIM3pat * Inv_LW; + pParam->BSIM3a0 = model->BSIM3a0 + + model->BSIM3la0 * Inv_L + + model->BSIM3wa0 * Inv_W + + model->BSIM3pa0 * Inv_LW; + + pParam->BSIM3ags = model->BSIM3ags + + model->BSIM3lags * Inv_L + + model->BSIM3wags * Inv_W + + model->BSIM3pags * Inv_LW; + + pParam->BSIM3a1 = model->BSIM3a1 + + model->BSIM3la1 * Inv_L + + model->BSIM3wa1 * Inv_W + + model->BSIM3pa1 * Inv_LW; + pParam->BSIM3a2 = model->BSIM3a2 + + model->BSIM3la2 * Inv_L + + model->BSIM3wa2 * Inv_W + + model->BSIM3pa2 * Inv_LW; + pParam->BSIM3keta = model->BSIM3keta + + model->BSIM3lketa * Inv_L + + model->BSIM3wketa * Inv_W + + model->BSIM3pketa * Inv_LW; + pParam->BSIM3nsub = model->BSIM3nsub + + model->BSIM3lnsub * Inv_L + + model->BSIM3wnsub * Inv_W + + model->BSIM3pnsub * Inv_LW; + pParam->BSIM3npeak = model->BSIM3npeak + + model->BSIM3lnpeak * Inv_L + + model->BSIM3wnpeak * Inv_W + + model->BSIM3pnpeak * Inv_LW; + pParam->BSIM3ngate = model->BSIM3ngate + + model->BSIM3lngate * Inv_L + + model->BSIM3wngate * Inv_W + + model->BSIM3pngate * Inv_LW; + pParam->BSIM3gamma1 = model->BSIM3gamma1 + + model->BSIM3lgamma1 * Inv_L + + model->BSIM3wgamma1 * Inv_W + + model->BSIM3pgamma1 * Inv_LW; + pParam->BSIM3gamma2 = model->BSIM3gamma2 + + model->BSIM3lgamma2 * Inv_L + + model->BSIM3wgamma2 * Inv_W + + model->BSIM3pgamma2 * Inv_LW; + pParam->BSIM3vbx = model->BSIM3vbx + + model->BSIM3lvbx * Inv_L + + model->BSIM3wvbx * Inv_W + + model->BSIM3pvbx * Inv_LW; + pParam->BSIM3vbm = model->BSIM3vbm + + model->BSIM3lvbm * Inv_L + + model->BSIM3wvbm * Inv_W + + model->BSIM3pvbm * Inv_LW; + pParam->BSIM3xt = model->BSIM3xt + + model->BSIM3lxt * Inv_L + + model->BSIM3wxt * Inv_W + + model->BSIM3pxt * Inv_LW; + pParam->BSIM3vfb = model->BSIM3vfb + + model->BSIM3lvfb * Inv_L + + model->BSIM3wvfb * Inv_W + + model->BSIM3pvfb * Inv_LW; + pParam->BSIM3k1 = model->BSIM3k1 + + model->BSIM3lk1 * Inv_L + + model->BSIM3wk1 * Inv_W + + model->BSIM3pk1 * Inv_LW; + pParam->BSIM3kt1 = model->BSIM3kt1 + + model->BSIM3lkt1 * Inv_L + + model->BSIM3wkt1 * Inv_W + + model->BSIM3pkt1 * Inv_LW; + pParam->BSIM3kt1l = model->BSIM3kt1l + + model->BSIM3lkt1l * Inv_L + + model->BSIM3wkt1l * Inv_W + + model->BSIM3pkt1l * Inv_LW; + pParam->BSIM3k2 = model->BSIM3k2 + + model->BSIM3lk2 * Inv_L + + model->BSIM3wk2 * Inv_W + + model->BSIM3pk2 * Inv_LW; + pParam->BSIM3kt2 = model->BSIM3kt2 + + model->BSIM3lkt2 * Inv_L + + model->BSIM3wkt2 * Inv_W + + model->BSIM3pkt2 * Inv_LW; + pParam->BSIM3k3 = model->BSIM3k3 + + model->BSIM3lk3 * Inv_L + + model->BSIM3wk3 * Inv_W + + model->BSIM3pk3 * Inv_LW; + pParam->BSIM3k3b = model->BSIM3k3b + + model->BSIM3lk3b * Inv_L + + model->BSIM3wk3b * Inv_W + + model->BSIM3pk3b * Inv_LW; + pParam->BSIM3w0 = model->BSIM3w0 + + model->BSIM3lw0 * Inv_L + + model->BSIM3ww0 * Inv_W + + model->BSIM3pw0 * Inv_LW; + pParam->BSIM3nlx = model->BSIM3nlx + + model->BSIM3lnlx * Inv_L + + model->BSIM3wnlx * Inv_W + + model->BSIM3pnlx * Inv_LW; + pParam->BSIM3dvt0 = model->BSIM3dvt0 + + model->BSIM3ldvt0 * Inv_L + + model->BSIM3wdvt0 * Inv_W + + model->BSIM3pdvt0 * Inv_LW; + pParam->BSIM3dvt1 = model->BSIM3dvt1 + + model->BSIM3ldvt1 * Inv_L + + model->BSIM3wdvt1 * Inv_W + + model->BSIM3pdvt1 * Inv_LW; + pParam->BSIM3dvt2 = model->BSIM3dvt2 + + model->BSIM3ldvt2 * Inv_L + + model->BSIM3wdvt2 * Inv_W + + model->BSIM3pdvt2 * Inv_LW; + pParam->BSIM3dvt0w = model->BSIM3dvt0w + + model->BSIM3ldvt0w * Inv_L + + model->BSIM3wdvt0w * Inv_W + + model->BSIM3pdvt0w * Inv_LW; + pParam->BSIM3dvt1w = model->BSIM3dvt1w + + model->BSIM3ldvt1w * Inv_L + + model->BSIM3wdvt1w * Inv_W + + model->BSIM3pdvt1w * Inv_LW; + pParam->BSIM3dvt2w = model->BSIM3dvt2w + + model->BSIM3ldvt2w * Inv_L + + model->BSIM3wdvt2w * Inv_W + + model->BSIM3pdvt2w * Inv_LW; + pParam->BSIM3drout = model->BSIM3drout + + model->BSIM3ldrout * Inv_L + + model->BSIM3wdrout * Inv_W + + model->BSIM3pdrout * Inv_LW; + pParam->BSIM3dsub = model->BSIM3dsub + + model->BSIM3ldsub * Inv_L + + model->BSIM3wdsub * Inv_W + + model->BSIM3pdsub * Inv_LW; + pParam->BSIM3vth0 = model->BSIM3vth0 + + model->BSIM3lvth0 * Inv_L + + model->BSIM3wvth0 * Inv_W + + model->BSIM3pvth0 * Inv_LW; + pParam->BSIM3ua = model->BSIM3ua + + model->BSIM3lua * Inv_L + + model->BSIM3wua * Inv_W + + model->BSIM3pua * Inv_LW; + pParam->BSIM3ua1 = model->BSIM3ua1 + + model->BSIM3lua1 * Inv_L + + model->BSIM3wua1 * Inv_W + + model->BSIM3pua1 * Inv_LW; + pParam->BSIM3ub = model->BSIM3ub + + model->BSIM3lub * Inv_L + + model->BSIM3wub * Inv_W + + model->BSIM3pub * Inv_LW; + pParam->BSIM3ub1 = model->BSIM3ub1 + + model->BSIM3lub1 * Inv_L + + model->BSIM3wub1 * Inv_W + + model->BSIM3pub1 * Inv_LW; + pParam->BSIM3uc = model->BSIM3uc + + model->BSIM3luc * Inv_L + + model->BSIM3wuc * Inv_W + + model->BSIM3puc * Inv_LW; + pParam->BSIM3uc1 = model->BSIM3uc1 + + model->BSIM3luc1 * Inv_L + + model->BSIM3wuc1 * Inv_W + + model->BSIM3puc1 * Inv_LW; + pParam->BSIM3u0 = model->BSIM3u0 + + model->BSIM3lu0 * Inv_L + + model->BSIM3wu0 * Inv_W + + model->BSIM3pu0 * Inv_LW; + pParam->BSIM3ute = model->BSIM3ute + + model->BSIM3lute * Inv_L + + model->BSIM3wute * Inv_W + + model->BSIM3pute * Inv_LW; + pParam->BSIM3voff = model->BSIM3voff + + model->BSIM3lvoff * Inv_L + + model->BSIM3wvoff * Inv_W + + model->BSIM3pvoff * Inv_LW; + pParam->BSIM3delta = model->BSIM3delta + + model->BSIM3ldelta * Inv_L + + model->BSIM3wdelta * Inv_W + + model->BSIM3pdelta * Inv_LW; + pParam->BSIM3rdsw = model->BSIM3rdsw + + model->BSIM3lrdsw * Inv_L + + model->BSIM3wrdsw * Inv_W + + model->BSIM3prdsw * Inv_LW; + pParam->BSIM3prwg = model->BSIM3prwg + + model->BSIM3lprwg * Inv_L + + model->BSIM3wprwg * Inv_W + + model->BSIM3pprwg * Inv_LW; + pParam->BSIM3prwb = model->BSIM3prwb + + model->BSIM3lprwb * Inv_L + + model->BSIM3wprwb * Inv_W + + model->BSIM3pprwb * Inv_LW; + pParam->BSIM3prt = model->BSIM3prt + + model->BSIM3lprt * Inv_L + + model->BSIM3wprt * Inv_W + + model->BSIM3pprt * Inv_LW; + pParam->BSIM3eta0 = model->BSIM3eta0 + + model->BSIM3leta0 * Inv_L + + model->BSIM3weta0 * Inv_W + + model->BSIM3peta0 * Inv_LW; + pParam->BSIM3etab = model->BSIM3etab + + model->BSIM3letab * Inv_L + + model->BSIM3wetab * Inv_W + + model->BSIM3petab * Inv_LW; + pParam->BSIM3pclm = model->BSIM3pclm + + model->BSIM3lpclm * Inv_L + + model->BSIM3wpclm * Inv_W + + model->BSIM3ppclm * Inv_LW; + pParam->BSIM3pdibl1 = model->BSIM3pdibl1 + + model->BSIM3lpdibl1 * Inv_L + + model->BSIM3wpdibl1 * Inv_W + + model->BSIM3ppdibl1 * Inv_LW; + pParam->BSIM3pdibl2 = model->BSIM3pdibl2 + + model->BSIM3lpdibl2 * Inv_L + + model->BSIM3wpdibl2 * Inv_W + + model->BSIM3ppdibl2 * Inv_LW; + pParam->BSIM3pdiblb = model->BSIM3pdiblb + + model->BSIM3lpdiblb * Inv_L + + model->BSIM3wpdiblb * Inv_W + + model->BSIM3ppdiblb * Inv_LW; + pParam->BSIM3pscbe1 = model->BSIM3pscbe1 + + model->BSIM3lpscbe1 * Inv_L + + model->BSIM3wpscbe1 * Inv_W + + model->BSIM3ppscbe1 * Inv_LW; + pParam->BSIM3pscbe2 = model->BSIM3pscbe2 + + model->BSIM3lpscbe2 * Inv_L + + model->BSIM3wpscbe2 * Inv_W + + model->BSIM3ppscbe2 * Inv_LW; + pParam->BSIM3pvag = model->BSIM3pvag + + model->BSIM3lpvag * Inv_L + + model->BSIM3wpvag * Inv_W + + model->BSIM3ppvag * Inv_LW; + pParam->BSIM3wr = model->BSIM3wr + + model->BSIM3lwr * Inv_L + + model->BSIM3wwr * Inv_W + + model->BSIM3pwr * Inv_LW; + pParam->BSIM3dwg = model->BSIM3dwg + + model->BSIM3ldwg * Inv_L + + model->BSIM3wdwg * Inv_W + + model->BSIM3pdwg * Inv_LW; + pParam->BSIM3dwb = model->BSIM3dwb + + model->BSIM3ldwb * Inv_L + + model->BSIM3wdwb * Inv_W + + model->BSIM3pdwb * Inv_LW; + pParam->BSIM3b0 = model->BSIM3b0 + + model->BSIM3lb0 * Inv_L + + model->BSIM3wb0 * Inv_W + + model->BSIM3pb0 * Inv_LW; + pParam->BSIM3b1 = model->BSIM3b1 + + model->BSIM3lb1 * Inv_L + + model->BSIM3wb1 * Inv_W + + model->BSIM3pb1 * Inv_LW; + pParam->BSIM3alpha0 = model->BSIM3alpha0 + + model->BSIM3lalpha0 * Inv_L + + model->BSIM3walpha0 * Inv_W + + model->BSIM3palpha0 * Inv_LW; + pParam->BSIM3alpha1 = model->BSIM3alpha1 + + model->BSIM3lalpha1 * Inv_L + + model->BSIM3walpha1 * Inv_W + + model->BSIM3palpha1 * Inv_LW; + pParam->BSIM3beta0 = model->BSIM3beta0 + + model->BSIM3lbeta0 * Inv_L + + model->BSIM3wbeta0 * Inv_W + + model->BSIM3pbeta0 * Inv_LW; + /* CV model */ + pParam->BSIM3elm = model->BSIM3elm + + model->BSIM3lelm * Inv_L + + model->BSIM3welm * Inv_W + + model->BSIM3pelm * Inv_LW; + pParam->BSIM3cgsl = model->BSIM3cgsl + + model->BSIM3lcgsl * Inv_L + + model->BSIM3wcgsl * Inv_W + + model->BSIM3pcgsl * Inv_LW; + pParam->BSIM3cgdl = model->BSIM3cgdl + + model->BSIM3lcgdl * Inv_L + + model->BSIM3wcgdl * Inv_W + + model->BSIM3pcgdl * Inv_LW; + pParam->BSIM3ckappa = model->BSIM3ckappa + + model->BSIM3lckappa * Inv_L + + model->BSIM3wckappa * Inv_W + + model->BSIM3pckappa * Inv_LW; + pParam->BSIM3cf = model->BSIM3cf + + model->BSIM3lcf * Inv_L + + model->BSIM3wcf * Inv_W + + model->BSIM3pcf * Inv_LW; + pParam->BSIM3clc = model->BSIM3clc + + model->BSIM3lclc * Inv_L + + model->BSIM3wclc * Inv_W + + model->BSIM3pclc * Inv_LW; + pParam->BSIM3cle = model->BSIM3cle + + model->BSIM3lcle * Inv_L + + model->BSIM3wcle * Inv_W + + model->BSIM3pcle * Inv_LW; + pParam->BSIM3vfbcv = model->BSIM3vfbcv + + model->BSIM3lvfbcv * Inv_L + + model->BSIM3wvfbcv * Inv_W + + model->BSIM3pvfbcv * Inv_LW; + pParam->BSIM3acde = model->BSIM3acde + + model->BSIM3lacde * Inv_L + + model->BSIM3wacde * Inv_W + + model->BSIM3pacde * Inv_LW; + pParam->BSIM3moin = model->BSIM3moin + + model->BSIM3lmoin * Inv_L + + model->BSIM3wmoin * Inv_W + + model->BSIM3pmoin * Inv_LW; + pParam->BSIM3noff = model->BSIM3noff + + model->BSIM3lnoff * Inv_L + + model->BSIM3wnoff * Inv_W + + model->BSIM3pnoff * Inv_LW; + pParam->BSIM3voffcv = model->BSIM3voffcv + + model->BSIM3lvoffcv * Inv_L + + model->BSIM3wvoffcv * Inv_W + + model->BSIM3pvoffcv * Inv_LW; + + pParam->BSIM3abulkCVfactor = 1.0 + pow((pParam->BSIM3clc + / pParam->BSIM3leffCV), pParam->BSIM3cle); - T0 = (TRatio - 1.0); - pParam->BSIM3ua = - pParam->BSIM3ua + - pParam->BSIM3ua1 * T0; - pParam->BSIM3ub = - pParam->BSIM3ub + - pParam->BSIM3ub1 * T0; - pParam->BSIM3uc = - pParam->BSIM3uc + - pParam->BSIM3uc1 * T0; - if (pParam->BSIM3u0 > 1.0) - pParam->BSIM3u0 = - pParam->BSIM3u0 / 1.0e4; - - pParam->BSIM3u0temp = pParam->BSIM3u0 - * pow (TRatio, pParam->BSIM3ute); - pParam->BSIM3vsattemp = - pParam->BSIM3vsat - - pParam->BSIM3at * T0; - pParam->BSIM3rds0 = - (pParam->BSIM3rdsw + - pParam->BSIM3prt * T0) / - pow (pParam->BSIM3weff * 1E6, - pParam->BSIM3wr); - - if (BSIM3checkModel (model, here, ckt)) - { - IFuid namarray[2]; - namarray[0] = model->BSIM3modName; - namarray[1] = here->BSIM3name; - (*(SPfrontEnd->IFerror)) (ERR_FATAL, - "Fatal error(s) detected during BSIM3V3.2 parameter checking for %s in model %s", - namarray); - return (E_BADPARM); - } - - pParam->BSIM3cgdo = - (model->BSIM3cgdo + - pParam->BSIM3cf) * - pParam->BSIM3weffCV; - pParam->BSIM3cgso = - (model->BSIM3cgso + - pParam->BSIM3cf) * - pParam->BSIM3weffCV; - pParam->BSIM3cgbo = - model->BSIM3cgbo * - pParam->BSIM3leffCV; - - T0 = pParam->BSIM3leffCV * - pParam->BSIM3leffCV; - pParam->BSIM3tconst = - pParam->BSIM3u0temp * - pParam->BSIM3elm / (model->BSIM3cox * - pParam-> - BSIM3weffCV * - pParam-> - BSIM3leffCV * T0); - - if (!model->BSIM3npeakGiven - && model->BSIM3gamma1Given) - { - T0 = pParam->BSIM3gamma1 * - model->BSIM3cox; - pParam->BSIM3npeak = - 3.021E22 * T0 * T0; - } - - pParam->BSIM3phi = 2.0 * Vtm0 - * log (pParam->BSIM3npeak / ni); - - pParam->BSIM3sqrtPhi = - sqrt (pParam->BSIM3phi); - pParam->BSIM3phis3 = - pParam->BSIM3sqrtPhi * - pParam->BSIM3phi; - - pParam->BSIM3Xdep0 = - sqrt (2.0 * EPSSI / - (Charge_q * pParam->BSIM3npeak * - 1.0e6)) * pParam->BSIM3sqrtPhi; - pParam->BSIM3sqrtXdep0 = - sqrt (pParam->BSIM3Xdep0); - pParam->BSIM3litl = - sqrt (3.0 * pParam->BSIM3xj * - model->BSIM3tox); - pParam->BSIM3vbi = - Vtm0 * log (1.0e20 * - pParam->BSIM3npeak / (ni * - ni)); - pParam->BSIM3cdep0 = - sqrt (Charge_q * EPSSI * - pParam->BSIM3npeak * 1.0e6 / - 2.0 / pParam->BSIM3phi); - - pParam->BSIM3ldeb = - sqrt (EPSSI * Vtm0 / - (Charge_q * pParam->BSIM3npeak * - 1.0e6)) / 3.0; - pParam->BSIM3acde *= - pow ((pParam->BSIM3npeak / 2.0e16), - -0.25); - - - if (model->BSIM3k1Given - || model->BSIM3k2Given) - { - if (!model->BSIM3k1Given) - { - fprintf (stdout, - "Warning: k1 should be specified with k2.\n"); - pParam->BSIM3k1 = 0.53; - } - if (!model->BSIM3k2Given) - { - fprintf (stdout, - "Warning: k2 should be specified with k1.\n"); - pParam->BSIM3k2 = -0.0186; - } - if (model->BSIM3nsubGiven) - fprintf (stdout, - "Warning: nsub is ignored because k1 or k2 is given.\n"); - if (model->BSIM3xtGiven) - fprintf (stdout, - "Warning: xt is ignored because k1 or k2 is given.\n"); - if (model->BSIM3vbxGiven) - fprintf (stdout, - "Warning: vbx is ignored because k1 or k2 is given.\n"); - if (model->BSIM3gamma1Given) - fprintf (stdout, - "Warning: gamma1 is ignored because k1 or k2 is given.\n"); - if (model->BSIM3gamma2Given) - fprintf (stdout, - "Warning: gamma2 is ignored because k1 or k2 is given.\n"); - } - else - { - if (!model->BSIM3vbxGiven) - pParam->BSIM3vbx = - pParam->BSIM3phi - - 7.7348e-4 * - pParam->BSIM3npeak * - pParam->BSIM3xt * - pParam->BSIM3xt; - if (pParam->BSIM3vbx > 0.0) - pParam->BSIM3vbx = - -pParam->BSIM3vbx; - if (pParam->BSIM3vbm > 0.0) - pParam->BSIM3vbm = - -pParam->BSIM3vbm; - - if (!model->BSIM3gamma1Given) - pParam->BSIM3gamma1 = - 5.753e-12 * - sqrt (pParam-> - BSIM3npeak) / - model->BSIM3cox; - if (!model->BSIM3gamma2Given) - pParam->BSIM3gamma2 = - 5.753e-12 * - sqrt (pParam-> - BSIM3nsub) / - model->BSIM3cox; - - T0 = pParam->BSIM3gamma1 - - pParam->BSIM3gamma2; - T1 = sqrt (pParam->BSIM3phi - - pParam->BSIM3vbx) - - pParam->BSIM3sqrtPhi; - T2 = sqrt (pParam->BSIM3phi * - (pParam->BSIM3phi - - pParam->BSIM3vbm)) - - pParam->BSIM3phi; - pParam->BSIM3k2 = - T0 * T1 / (2.0 * T2 + - pParam->BSIM3vbm); - pParam->BSIM3k1 = - pParam->BSIM3gamma2 - - 2.0 * pParam->BSIM3k2 * - sqrt (pParam->BSIM3phi - - pParam->BSIM3vbm); - } - - if (pParam->BSIM3k2 < 0.0) - { - T0 = 0.5 * pParam->BSIM3k1 / - pParam->BSIM3k2; - pParam->BSIM3vbsc = - 0.9 * (pParam->BSIM3phi - - T0 * T0); - if (pParam->BSIM3vbsc > -3.0) - pParam->BSIM3vbsc = -3.0; - else if (pParam->BSIM3vbsc < -30.0) - pParam->BSIM3vbsc = -30.0; - } - else - { - pParam->BSIM3vbsc = -30.0; - } - if (pParam->BSIM3vbsc > pParam->BSIM3vbm) - pParam->BSIM3vbsc = pParam->BSIM3vbm; - - if (!model->BSIM3vfbGiven) - { - if (model->BSIM3vth0Given) - { - pParam->BSIM3vfb = - model->BSIM3type * - pParam->BSIM3vth0 - - pParam->BSIM3phi - - pParam->BSIM3k1 * - pParam->BSIM3sqrtPhi; - } - else - { - pParam->BSIM3vfb = -1.0; - } - } - if (!model->BSIM3vth0Given) - { - pParam->BSIM3vth0 = - model->BSIM3type * - (pParam->BSIM3vfb + - pParam->BSIM3phi + - pParam->BSIM3k1 * - pParam->BSIM3sqrtPhi); - } - - pParam->BSIM3k1ox = - pParam->BSIM3k1 * model->BSIM3tox / - model->BSIM3toxm; - pParam->BSIM3k2ox = - pParam->BSIM3k2 * model->BSIM3tox / - model->BSIM3toxm; - - T1 = sqrt (EPSSI / EPSOX * model->BSIM3tox - * pParam->BSIM3Xdep0); - T0 = exp (-0.5 * pParam->BSIM3dsub * - pParam->BSIM3leff / T1); - pParam->BSIM3theta0vb0 = (T0 + 2.0 * T0 * T0); - - T0 = exp (-0.5 * pParam->BSIM3drout * - pParam->BSIM3leff / T1); - T2 = (T0 + 2.0 * T0 * T0); - pParam->BSIM3thetaRout = - pParam->BSIM3pdibl1 * T2 + - pParam->BSIM3pdibl2; - - /* vfbzb for capMod 1, 2 & 3 - Weidong 4/1997 */ - tmp = sqrt (pParam->BSIM3Xdep0); - tmp1 = pParam->BSIM3vbi - pParam->BSIM3phi; - tmp2 = model->BSIM3factor1 * tmp; - - T0 = -0.5 * pParam->BSIM3dvt1w * - pParam->BSIM3weff * - pParam->BSIM3leff / tmp2; - if (T0 > -EXP_THRESHOLD) - { - T1 = exp (T0); - T2 = T1 * (1.0 + 2.0 * T1); - } - else - { - T1 = MIN_EXP; - T2 = T1 * (1.0 + 2.0 * T1); - } - T0 = pParam->BSIM3dvt0w * T2; - T2 = T0 * tmp1; - - T0 = -0.5 * pParam->BSIM3dvt1 * - pParam->BSIM3leff / tmp2; - if (T0 > -EXP_THRESHOLD) - { - T1 = exp (T0); - T3 = T1 * (1.0 + 2.0 * T1); - } - else - { - T1 = MIN_EXP; - T3 = T1 * (1.0 + 2.0 * T1); - } - T3 = pParam->BSIM3dvt0 * T3 * tmp1; - - T4 = model->BSIM3tox * pParam->BSIM3phi - / (pParam->BSIM3weff + - pParam->BSIM3w0); - - T0 = sqrt (1.0 + - pParam->BSIM3nlx / - pParam->BSIM3leff); - T5 = pParam->BSIM3k1ox * (T0 - - 1.0) * - pParam->BSIM3sqrtPhi + - (pParam->BSIM3kt1 + - pParam->BSIM3kt1l / - pParam->BSIM3leff) * (TRatio - 1.0); - - tmp3 = model->BSIM3type * pParam->BSIM3vth0 - - T2 - T3 + pParam->BSIM3k3 * T4 + T5; - pParam->BSIM3vfbzb = - tmp3 - pParam->BSIM3phi - - pParam->BSIM3k1 * - pParam->BSIM3sqrtPhi; - /* End of vfbzb */ - } - - /* process source/drain series resistance */ - here->BSIM3drainConductance = - model->BSIM3sheetResistance * - here->BSIM3drainSquares; - if (here->BSIM3drainConductance > 0.0) - here->BSIM3drainConductance = 1.0 - / here->BSIM3drainConductance; - else - here->BSIM3drainConductance = 0.0; - - here->BSIM3sourceConductance = - model->BSIM3sheetResistance * - here->BSIM3sourceSquares; - if (here->BSIM3sourceConductance > 0.0) - here->BSIM3sourceConductance = 1.0 - / here->BSIM3sourceConductance; - else - here->BSIM3sourceConductance = 0.0; - here->BSIM3cgso = pParam->BSIM3cgso; - here->BSIM3cgdo = pParam->BSIM3cgdo; - - Nvtm = model->BSIM3vtm * model->BSIM3jctEmissionCoeff; - if ((here->BSIM3sourceArea <= 0.0) && - (here->BSIM3sourcePerimeter <= 0.0)) - { - SourceSatCurrent = 1.0e-14; - } - else - { - SourceSatCurrent = here->BSIM3sourceArea - * model->BSIM3jctTempSatCurDensity - + here->BSIM3sourcePerimeter - * - model-> - BSIM3jctSidewallTempSatCurDensity; - } - if ((SourceSatCurrent > 0.0) - && (model->BSIM3ijth > 0.0)) - { - here->BSIM3vjsm = Nvtm * log (model->BSIM3ijth - / - SourceSatCurrent - + 1.0); - - /* Added revision dependent code */ - switch (model->BSIM3intVersion) - { - case BSIM3V324: - case BSIM3V323: - case BSIM3V322: - here->BSIM3IsEvjsm = - SourceSatCurrent * - exp (here->BSIM3vjsm / Nvtm); - break; - case BSIM3V32: - default: - /* Do nothing */ - } - - } - - if ((here->BSIM3drainArea <= 0.0) && - (here->BSIM3drainPerimeter <= 0.0)) - { - DrainSatCurrent = 1.0e-14; - } - else - { - DrainSatCurrent = here->BSIM3drainArea - * model->BSIM3jctTempSatCurDensity - + here->BSIM3drainPerimeter - * - model-> - BSIM3jctSidewallTempSatCurDensity; - } - if ((DrainSatCurrent > 0.0) - && (model->BSIM3ijth > 0.0)) - { - here->BSIM3vjdm = Nvtm * log (model->BSIM3ijth - / - DrainSatCurrent - + 1.0); - - /* Added revision dependent code */ - switch (model->BSIM3intVersion) - { - case BSIM3V324: - case BSIM3V323: - case BSIM3V322: - - here->BSIM3IsEvjdm = - DrainSatCurrent * - exp (here->BSIM3vjdm / Nvtm); - break; - - case BSIM3V32: - default: - /* Do nothing */ - - } - - } - } - } - return (OK); + T0 = (TRatio - 1.0); + pParam->BSIM3ua = pParam->BSIM3ua + pParam->BSIM3ua1 * T0; + pParam->BSIM3ub = pParam->BSIM3ub + pParam->BSIM3ub1 * T0; + pParam->BSIM3uc = pParam->BSIM3uc + pParam->BSIM3uc1 * T0; + if (pParam->BSIM3u0 > 1.0) + pParam->BSIM3u0 = pParam->BSIM3u0 / 1.0e4; + + pParam->BSIM3u0temp = pParam->BSIM3u0 + * pow(TRatio, pParam->BSIM3ute); + pParam->BSIM3vsattemp = pParam->BSIM3vsat - pParam->BSIM3at + * T0; + pParam->BSIM3rds0 = (pParam->BSIM3rdsw + pParam->BSIM3prt * T0) + / pow(pParam->BSIM3weff * 1E6, pParam->BSIM3wr); + + if (BSIM3checkModel(model, here, ckt)) + { IFuid namarray[2]; + namarray[0] = model->BSIM3modName; + namarray[1] = here->BSIM3name; + (*(SPfrontEnd->IFerror)) (ERR_FATAL, "Fatal error(s) detected during BSIM3V3.2 parameter checking for %s in model %s", namarray); + return(E_BADPARM); + } + + pParam->BSIM3cgdo = (model->BSIM3cgdo + pParam->BSIM3cf) + * pParam->BSIM3weffCV; + pParam->BSIM3cgso = (model->BSIM3cgso + pParam->BSIM3cf) + * pParam->BSIM3weffCV; + pParam->BSIM3cgbo = model->BSIM3cgbo * pParam->BSIM3leffCV; + + T0 = pParam->BSIM3leffCV * pParam->BSIM3leffCV; + pParam->BSIM3tconst = pParam->BSIM3u0temp * pParam->BSIM3elm / (model->BSIM3cox + * pParam->BSIM3weffCV * pParam->BSIM3leffCV * T0); + + if (!model->BSIM3npeakGiven && model->BSIM3gamma1Given) + { T0 = pParam->BSIM3gamma1 * model->BSIM3cox; + pParam->BSIM3npeak = 3.021E22 * T0 * T0; + } + + pParam->BSIM3phi = 2.0 * Vtm0 + * log(pParam->BSIM3npeak / ni); + + pParam->BSIM3sqrtPhi = sqrt(pParam->BSIM3phi); + pParam->BSIM3phis3 = pParam->BSIM3sqrtPhi * pParam->BSIM3phi; + + pParam->BSIM3Xdep0 = sqrt(2.0 * EPSSI / (Charge_q + * pParam->BSIM3npeak * 1.0e6)) + * pParam->BSIM3sqrtPhi; + pParam->BSIM3sqrtXdep0 = sqrt(pParam->BSIM3Xdep0); + pParam->BSIM3litl = sqrt(3.0 * pParam->BSIM3xj + * model->BSIM3tox); + pParam->BSIM3vbi = Vtm0 * log(1.0e20 + * pParam->BSIM3npeak / (ni * ni)); + pParam->BSIM3cdep0 = sqrt(Charge_q * EPSSI + * pParam->BSIM3npeak * 1.0e6 / 2.0 + / pParam->BSIM3phi); + + pParam->BSIM3ldeb = sqrt(EPSSI * Vtm0 / (Charge_q + * pParam->BSIM3npeak * 1.0e6)) / 3.0; + pParam->BSIM3acde *= pow((pParam->BSIM3npeak / 2.0e16), -0.25); + + + if (model->BSIM3k1Given || model->BSIM3k2Given) + { if (!model->BSIM3k1Given) + { fprintf(stdout, "Warning: k1 should be specified with k2.\n"); + pParam->BSIM3k1 = 0.53; + } + if (!model->BSIM3k2Given) + { fprintf(stdout, "Warning: k2 should be specified with k1.\n"); + pParam->BSIM3k2 = -0.0186; + } + if (model->BSIM3nsubGiven) + fprintf(stdout, "Warning: nsub is ignored because k1 or k2 is given.\n"); + if (model->BSIM3xtGiven) + fprintf(stdout, "Warning: xt is ignored because k1 or k2 is given.\n"); + if (model->BSIM3vbxGiven) + fprintf(stdout, "Warning: vbx is ignored because k1 or k2 is given.\n"); + if (model->BSIM3gamma1Given) + fprintf(stdout, "Warning: gamma1 is ignored because k1 or k2 is given.\n"); + if (model->BSIM3gamma2Given) + fprintf(stdout, "Warning: gamma2 is ignored because k1 or k2 is given.\n"); + } + else + { if (!model->BSIM3vbxGiven) + pParam->BSIM3vbx = pParam->BSIM3phi - 7.7348e-4 + * pParam->BSIM3npeak + * pParam->BSIM3xt * pParam->BSIM3xt; + if (pParam->BSIM3vbx > 0.0) + pParam->BSIM3vbx = -pParam->BSIM3vbx; + if (pParam->BSIM3vbm > 0.0) + pParam->BSIM3vbm = -pParam->BSIM3vbm; + + if (!model->BSIM3gamma1Given) + pParam->BSIM3gamma1 = 5.753e-12 + * sqrt(pParam->BSIM3npeak) + / model->BSIM3cox; + if (!model->BSIM3gamma2Given) + pParam->BSIM3gamma2 = 5.753e-12 + * sqrt(pParam->BSIM3nsub) + / model->BSIM3cox; + + T0 = pParam->BSIM3gamma1 - pParam->BSIM3gamma2; + T1 = sqrt(pParam->BSIM3phi - pParam->BSIM3vbx) + - pParam->BSIM3sqrtPhi; + T2 = sqrt(pParam->BSIM3phi * (pParam->BSIM3phi + - pParam->BSIM3vbm)) - pParam->BSIM3phi; + pParam->BSIM3k2 = T0 * T1 / (2.0 * T2 + pParam->BSIM3vbm); + pParam->BSIM3k1 = pParam->BSIM3gamma2 - 2.0 + * pParam->BSIM3k2 * sqrt(pParam->BSIM3phi + - pParam->BSIM3vbm); + } + + if (pParam->BSIM3k2 < 0.0) + { T0 = 0.5 * pParam->BSIM3k1 / pParam->BSIM3k2; + pParam->BSIM3vbsc = 0.9 * (pParam->BSIM3phi - T0 * T0); + if (pParam->BSIM3vbsc > -3.0) + pParam->BSIM3vbsc = -3.0; + else if (pParam->BSIM3vbsc < -30.0) + pParam->BSIM3vbsc = -30.0; + } + else + { pParam->BSIM3vbsc = -30.0; + } + if (pParam->BSIM3vbsc > pParam->BSIM3vbm) + pParam->BSIM3vbsc = pParam->BSIM3vbm; + + if (!model->BSIM3vfbGiven) + { if (model->BSIM3vth0Given) + { pParam->BSIM3vfb = model->BSIM3type * pParam->BSIM3vth0 + - pParam->BSIM3phi - pParam->BSIM3k1 + * pParam->BSIM3sqrtPhi; + } + else + { pParam->BSIM3vfb = -1.0; + } + } + if (!model->BSIM3vth0Given) + { pParam->BSIM3vth0 = model->BSIM3type * (pParam->BSIM3vfb + + pParam->BSIM3phi + pParam->BSIM3k1 + * pParam->BSIM3sqrtPhi); + } + + pParam->BSIM3k1ox = pParam->BSIM3k1 * model->BSIM3tox + / model->BSIM3toxm; + pParam->BSIM3k2ox = pParam->BSIM3k2 * model->BSIM3tox + / model->BSIM3toxm; + + T1 = sqrt(EPSSI / EPSOX * model->BSIM3tox + * pParam->BSIM3Xdep0); + T0 = exp(-0.5 * pParam->BSIM3dsub * pParam->BSIM3leff / T1); + pParam->BSIM3theta0vb0 = (T0 + 2.0 * T0 * T0); + + T0 = exp(-0.5 * pParam->BSIM3drout * pParam->BSIM3leff / T1); + T2 = (T0 + 2.0 * T0 * T0); + pParam->BSIM3thetaRout = pParam->BSIM3pdibl1 * T2 + + pParam->BSIM3pdibl2; + + tmp = sqrt(pParam->BSIM3Xdep0); + tmp1 = pParam->BSIM3vbi - pParam->BSIM3phi; + tmp2 = model->BSIM3factor1 * tmp; + + T0 = -0.5 * pParam->BSIM3dvt1w * pParam->BSIM3weff + * pParam->BSIM3leff / tmp2; + if (T0 > -EXP_THRESHOLD) + { T1 = exp(T0); + T2 = T1 * (1.0 + 2.0 * T1); + } + else + { T1 = MIN_EXP; + T2 = T1 * (1.0 + 2.0 * T1); + } + T0 = pParam->BSIM3dvt0w * T2; + T2 = T0 * tmp1; + + T0 = -0.5 * pParam->BSIM3dvt1 * pParam->BSIM3leff / tmp2; + if (T0 > -EXP_THRESHOLD) + { T1 = exp(T0); + T3 = T1 * (1.0 + 2.0 * T1); + } + else + { T1 = MIN_EXP; + T3 = T1 * (1.0 + 2.0 * T1); + } + T3 = pParam->BSIM3dvt0 * T3 * tmp1; + + T4 = model->BSIM3tox * pParam->BSIM3phi + / (pParam->BSIM3weff + pParam->BSIM3w0); + + T0 = sqrt(1.0 + pParam->BSIM3nlx / pParam->BSIM3leff); + T5 = pParam->BSIM3k1ox * (T0 - 1.0) * pParam->BSIM3sqrtPhi + + (pParam->BSIM3kt1 + pParam->BSIM3kt1l / pParam->BSIM3leff) + * (TRatio - 1.0); + + tmp3 = model->BSIM3type * pParam->BSIM3vth0 + - T2 - T3 + pParam->BSIM3k3 * T4 + T5; + pParam->BSIM3vfbzb = tmp3 - pParam->BSIM3phi - pParam->BSIM3k1 + * pParam->BSIM3sqrtPhi; + /* End of vfbzb */ + } + else /* !Size_Not_Found */ + { + /* va: pParam might be uninitialized, if !Size_Not_Found */ + pParam = here->pParam; + } + + /* process source/drain series resistance */ + /* acm model */ + if (model->BSIM3acmMod == 0) + { + here->BSIM3drainConductance = model->BSIM3sheetResistance + * here->BSIM3drainSquares; + here->BSIM3sourceConductance = model->BSIM3sheetResistance + * here->BSIM3sourceSquares; + } + else + { + if (here->BSIM3drainSquaresGiven) + { + here->BSIM3drainConductance = (model->BSIM3ld + model->BSIM3ldif)/(here->BSIM3w + model->BSIM3xw)*model->BSIM3rd + + model->BSIM3sheetResistance * here->BSIM3drainSquares + model->BSIM3rdc; + } + else + { + here->BSIM3drainConductance = ((model->BSIM3ld + model->BSIM3ldif)*model->BSIM3rd + + model->BSIM3hdif*model->BSIM3sheetResistance)/(here->BSIM3w + model->BSIM3xw) + model->BSIM3rdc; + } + if (here->BSIM3sourceSquaresGiven) + { + here->BSIM3sourceConductance = (model->BSIM3ld + model->BSIM3ldif)/(here->BSIM3w + model->BSIM3xw)*model->BSIM3rs + + model->BSIM3sheetResistance * here->BSIM3sourceSquares + model->BSIM3rsc; + } + else + { + here->BSIM3sourceConductance = ((model->BSIM3ld + model->BSIM3ldif)*model->BSIM3rs + + model->BSIM3hdif*model->BSIM3sheetResistance)/(here->BSIM3w + model->BSIM3xw) + model->BSIM3rsc; + } + } + if (here->BSIM3drainConductance > 0.0) + here->BSIM3drainConductance = 1.0 + / here->BSIM3drainConductance; + else + here->BSIM3drainConductance = 0.0; + + if (here->BSIM3sourceConductance > 0.0) + here->BSIM3sourceConductance = 1.0 + / here->BSIM3sourceConductance; + else + here->BSIM3sourceConductance = 0.0; + + here->BSIM3cgso = pParam->BSIM3cgso; + here->BSIM3cgdo = pParam->BSIM3cgdo; + + Nvtm = model->BSIM3vtm * model->BSIM3jctEmissionCoeff; + if (model->BSIM3acmMod == 0) + { + if ((here->BSIM3sourceArea <= 0.0) && + (here->BSIM3sourcePerimeter <= 0.0)) + { SourceSatCurrent = 1.0e-14; + } + else + { SourceSatCurrent = here->BSIM3sourceArea + * model->BSIM3jctTempSatCurDensity + + here->BSIM3sourcePerimeter + * model->BSIM3jctSidewallTempSatCurDensity; + } + if ((SourceSatCurrent > 0.0) && (model->BSIM3ijth > 0.0)) + { here->BSIM3vjsm = Nvtm * log(model->BSIM3ijth + / SourceSatCurrent + 1.0); + /* Added revision dependent code */ + switch (model->BSIM3intVersion) { + case BSIM3V324: + case BSIM3V323: + case BSIM3V322: + here->BSIM3IsEvjsm = + SourceSatCurrent * exp(here->BSIM3vjsm / Nvtm); + break; + case BSIM3V32: + default: + /* Do nothing */ + break; + } + } + + if ((here->BSIM3drainArea <= 0.0) && + (here->BSIM3drainPerimeter <= 0.0)) + { DrainSatCurrent = 1.0e-14; + } + else + { DrainSatCurrent = here->BSIM3drainArea + * model->BSIM3jctTempSatCurDensity + + here->BSIM3drainPerimeter + * model->BSIM3jctSidewallTempSatCurDensity; + } + if ((DrainSatCurrent > 0.0) && (model->BSIM3ijth > 0.0)) + { here->BSIM3vjdm = Nvtm * log(model->BSIM3ijth + / DrainSatCurrent + 1.0); + /* Added revision dependent code */ + switch (model->BSIM3intVersion) { + case BSIM3V324: + case BSIM3V323: + case BSIM3V322: + here->BSIM3IsEvjdm = + DrainSatCurrent * exp(here->BSIM3vjdm / Nvtm); + break; + case BSIM3V32: + default: + /* Do nothing */ + break; + } + } + } + else + { + SourceSatCurrent = 0.0; + if (!here->BSIM3sourceAreaGiven) + { + here->BSIM3sourceArea = 2.0 * model->BSIM3hdif * pParam->BSIM3weff; + } + SourceSatCurrent = here->BSIM3sourceArea * model->BSIM3jctTempSatCurDensity; + if (!here->BSIM3sourcePerimeterGiven) + { + here->BSIM3sourcePerimeter = 4.0 * model->BSIM3hdif + 2.0 * pParam->BSIM3weff; + } + SourceSatCurrent = SourceSatCurrent + here->BSIM3sourcePerimeter * model->BSIM3jctSidewallTempSatCurDensity; + if (SourceSatCurrent <= 0.0) SourceSatCurrent = 1.0e-14; + if ((SourceSatCurrent > 0.0) && (model->BSIM3ijth > 0.0)) + { here->BSIM3vjsm = Nvtm * log(model->BSIM3ijth + / SourceSatCurrent + 1.0); + /* Added revision dependent code */ + switch (model->BSIM3intVersion) { + case BSIM3V324: + case BSIM3V323: + case BSIM3V322: + here->BSIM3IsEvjsm = + SourceSatCurrent * exp(here->BSIM3vjsm / Nvtm); + break; + case BSIM3V32: + default: + /* Do nothing */ + break; + } + } + + DrainSatCurrent = 0.0; + if (!here->BSIM3drainAreaGiven) + { + here->BSIM3drainArea = 2.0 * model->BSIM3hdif * pParam->BSIM3weff; + } + DrainSatCurrent = here->BSIM3drainArea * model->BSIM3jctTempSatCurDensity; + if (!here->BSIM3drainPerimeterGiven) + { + here->BSIM3drainPerimeter = 4.0 * model->BSIM3hdif + 2.0 * pParam->BSIM3weff; + } + DrainSatCurrent = DrainSatCurrent + here->BSIM3drainPerimeter * model->BSIM3jctSidewallTempSatCurDensity; + if (DrainSatCurrent <= 0.0) DrainSatCurrent = 1.0e-14; + if ((DrainSatCurrent > 0.0) && (model->BSIM3ijth > 0.0)) + { here->BSIM3vjdm = Nvtm * log(model->BSIM3ijth + / DrainSatCurrent + 1.0); + /* Added revision dependent code */ + switch (model->BSIM3intVersion) { + case BSIM3V324: + case BSIM3V323: + case BSIM3V322: + here->BSIM3IsEvjdm = + DrainSatCurrent * exp(here->BSIM3vjdm / Nvtm); + break; + case BSIM3V32: + default: + /* Do nothing */ + break; + } + } + } + } + } + return(OK); } + diff --git a/src/spicelib/devices/bsim3/b3trunc.c b/src/spicelib/devices/bsim3/b3trunc.c index b9fbd5db3..6ec71d0f2 100644 --- a/src/spicelib/devices/bsim3/b3trunc.c +++ b/src/spicelib/devices/bsim3/b3trunc.c @@ -1,3 +1,5 @@ +/**** BSIM3v3.2.4, Released by Xuemei Xi 12/21/2001 ****/ + /********** * Copyright 2001 Regents of the University of California. All rights reserved. * File: b3trunc.c of BSIM3v3.2.4 @@ -7,17 +9,6 @@ * Modified by Poalo Nenzi 2002 **********/ -/* - * Release Notes: - * BSIM3v3.2.4, Released by Xuemei Xi 12/21/2001 - * BSIM3v3.2.3, Released by Xuemei Xi 10/05/2001 - * BSIM3v3.2.2, Released by Weidong Liu 04/20/1999 - * BSIM3v3.2, Released by Weidong Liu 06/16/1998 - */ - - -/*************************************/ - #include "ngspice.h" #include "cktdefs.h" #include "bsim3def.h" @@ -26,35 +17,34 @@ int -BSIM3trunc (GENmodel * inModel, CKTcircuit * ckt, double *timeStep) +BSIM3trunc (GENmodel *inModel, CKTcircuit *ckt, double *timeStep) { - BSIM3model *model = (BSIM3model *) inModel; - BSIM3instance *here; +BSIM3model *model = (BSIM3model*)inModel; +BSIM3instance *here; #ifdef STEPDEBUG - double debugtemp; + double debugtemp; #endif /* STEPDEBUG */ - for (; model != NULL; model = model->BSIM3nextModel) - { - for (here = model->BSIM3instances; here != NULL; - here = here->BSIM3nextInstance) - { - if (here->BSIM3owner != ARCHme) - continue; + for (; model != NULL; model = model->BSIM3nextModel) + { for (here = model->BSIM3instances; here != NULL; + here = here->BSIM3nextInstance) + { + if (here->BSIM3owner != ARCHme) + continue; #ifdef STEPDEBUG - debugtemp = *timeStep; + debugtemp = *timeStep; #endif /* STEPDEBUG */ - CKTterr (here->BSIM3qb, ckt, timeStep); - CKTterr (here->BSIM3qg, ckt, timeStep); - CKTterr (here->BSIM3qd, ckt, timeStep); + CKTterr(here->BSIM3qb,ckt,timeStep); + CKTterr(here->BSIM3qg,ckt,timeStep); + CKTterr(here->BSIM3qd,ckt,timeStep); #ifdef STEPDEBUG - if (debugtemp != *timeStep) - { - printf ("device %s reduces step from %g to %g\n", here->BSIM3name, debugtemp, *timeStep); - } + if(debugtemp != *timeStep) + { printf("device %s reduces step from %g to %g\n", + here->BSIM3name,debugtemp,*timeStep); + } #endif /* STEPDEBUG */ - } - } - return (OK); + } + } + return(OK); } diff --git a/src/spicelib/devices/bsim3/bsim3def.h b/src/spicelib/devices/bsim3/bsim3def.h index 4dedb56be..6a14a9985 100644 --- a/src/spicelib/devices/bsim3/bsim3def.h +++ b/src/spicelib/devices/bsim3/bsim3def.h @@ -3,7 +3,7 @@ Copyright 2001 Regents of the University of California. All rights reserved. Author: 1995 Min-Chie Jeng and Mansun Chan. Author: 1997-1999 Weidong Liu. Author: 2001 Xuemei Xi -Modified by Paolo Nenzi 2002 +Modified by Paolo Nenzi 2002 and Dietmar Warning 2003 File: bsim3def.h **********/ @@ -21,7 +21,7 @@ typedef struct sBSIM3instance struct sBSIM3model *BSIM3modPtr; struct sBSIM3instance *BSIM3nextInstance; IFuid BSIM3name; - int BSIM3owner; /* number of owner process */ + int BSIM3owner; /* number of owner process */ int BSIM3states; /* index into state table for this device */ int BSIM3dNode; int BSIM3gNode; @@ -39,9 +39,9 @@ typedef struct sBSIM3instance double BSIM3cgdo; double BSIM3cgso; double BSIM3vjsm; - double BSIM3IsEvjsm; + double BSIM3IsEvjsm; double BSIM3vjdm; - double BSIM3IsEvjdm; + double BSIM3IsEvjdm; double BSIM3l; double BSIM3w; @@ -108,7 +108,7 @@ typedef struct sBSIM3instance double BSIM3Vgsteff; double BSIM3Vdseff; double BSIM3Abulk; - double BSIM3AbovVgst2Vtm; + double BSIM3AbovVgst2Vtm; struct bsim3SizeDependParam *pParam; @@ -161,7 +161,6 @@ typedef struct sBSIM3instance double *BSIM3SPqPtr; double *BSIM3BqPtr; - #define BSIM3vbd BSIM3states+ 0 #define BSIM3vbs BSIM3states+ 1 #define BSIM3vgs BSIM3states+ 2 @@ -353,11 +352,11 @@ typedef struct sBSIM3model int BSIM3mobMod; int BSIM3capMod; + int BSIM3acmMod; int BSIM3noiMod; int BSIM3binUnit; int BSIM3paramChk; - char *BSIM3version; - + char *BSIM3version; /* The following field is an integer coding * of BSIM3version. */ @@ -464,6 +463,15 @@ typedef struct sBSIM3model double BSIM3tpbsw; double BSIM3tpbswg; + /* acm model */ + double BSIM3hdif; + double BSIM3ldif; + double BSIM3ld; + double BSIM3rd; + double BSIM3rs; + double BSIM3rdc; + double BSIM3rsc; + /* Length Dependence */ double BSIM3lcdsc; double BSIM3lcdscb; @@ -772,6 +780,9 @@ typedef struct sBSIM3model double BSIM3Wmin; double BSIM3Wmax; + /* acm model */ + double BSIM3xl; + double BSIM3xw; /* Pre-calculated constants */ /* MCJ: move to size-dependent param. */ @@ -806,6 +817,7 @@ typedef struct sBSIM3model unsigned BSIM3mobModGiven :1; unsigned BSIM3binUnitGiven :1; unsigned BSIM3capModGiven :1; + unsigned BSIM3acmModGiven :1; unsigned BSIM3paramChkGiven :1; unsigned BSIM3noiModGiven :1; unsigned BSIM3typeGiven :1; @@ -907,6 +919,14 @@ typedef struct sBSIM3model unsigned BSIM3tpbswGiven :1; unsigned BSIM3tpbswgGiven :1; + /* acm model */ + unsigned BSIM3hdifGiven :1; + unsigned BSIM3ldifGiven :1; + unsigned BSIM3ldGiven :1; + unsigned BSIM3rdGiven :1; + unsigned BSIM3rsGiven :1; + unsigned BSIM3rdcGiven :1; + unsigned BSIM3rscGiven :1; /* Length dependence */ unsigned BSIM3lcdscGiven :1; @@ -1223,6 +1243,10 @@ typedef struct sBSIM3model unsigned BSIM3WminGiven :1; unsigned BSIM3WmaxGiven :1; + /* acm model */ + unsigned BSIM3xlGiven :1; + unsigned BSIM3xwGiven :1; + } BSIM3model; @@ -1251,6 +1275,7 @@ typedef struct sBSIM3model /* model parameters */ #define BSIM3_MOD_CAPMOD 101 +#define BSIM3_MOD_ACMMOD 102 #define BSIM3_MOD_MOBMOD 103 #define BSIM3_MOD_NOIMOD 104 @@ -1715,6 +1740,18 @@ typedef struct sBSIM3model #define BSIM3_MOD_WWC 701 #define BSIM3_MOD_WWLC 702 +/* acm parameters */ +#define BSIM3_MOD_XL 703 +#define BSIM3_MOD_XW 704 + +#define BSIM3_MOD_HDIF 711 +#define BSIM3_MOD_LDIF 712 +#define BSIM3_MOD_LD 713 +#define BSIM3_MOD_RD 714 +#define BSIM3_MOD_RS 715 +#define BSIM3_MOD_RDC 716 +#define BSIM3_MOD_RSC 717 + /* device questions */ #define BSIM3_DNODE 751 #define BSIM3_GNODE 752 @@ -1770,6 +1807,4 @@ extern void BSIM3evaluate(double,double,double,BSIM3instance*,BSIM3model*, extern int BSIM3debug(BSIM3model*, BSIM3instance*, CKTcircuit*, int); extern int BSIM3checkModel(BSIM3model*, BSIM3instance*, CKTcircuit*); - #endif /*BSIM3*/ - diff --git a/src/spicelib/devices/bsim3/bsim3ext.h b/src/spicelib/devices/bsim3/bsim3ext.h index 27b6730c0..276129b44 100644 --- a/src/spicelib/devices/bsim3/bsim3ext.h +++ b/src/spicelib/devices/bsim3/bsim3ext.h @@ -29,6 +29,3 @@ extern int BSIM3temp(GENmodel*,CKTcircuit*); extern int BSIM3trunc(GENmodel*,CKTcircuit*,double*); extern int BSIM3noise(int,int,GENmodel*,CKTcircuit*,Ndata*,double*); extern int BSIM3unsetup(GENmodel*,CKTcircuit*); - - - diff --git a/src/spicelib/devices/bsim3/bsim3init.c b/src/spicelib/devices/bsim3/bsim3init.c index 8a82bebb3..92a940e05 100644 --- a/src/spicelib/devices/bsim3/bsim3init.c +++ b/src/spicelib/devices/bsim3/bsim3init.c @@ -1,13 +1,13 @@ -#include +#include "config.h" -#include +#include "devdefs.h" #include "bsim3itf.h" #include "bsim3ext.h" #include "bsim3init.h" -SPICEdev B3info = { +SPICEdev BSIM3info = { { "BSIM3", "Berkeley Short Channel IGFET Model Version-3", @@ -69,7 +69,7 @@ SPICEdev B3info = { #ifdef CIDER DEVdump : NULL, DEVacct : NULL, -#endif +#endif DEVinstSize : &BSIM3iSize, DEVmodSize : &BSIM3mSize @@ -79,5 +79,5 @@ SPICEdev B3info = { SPICEdev * get_bsim3_info(void) { - return &B3info; + return &BSIM3info; }