diff --git a/src/Makefile.am b/src/Makefile.am index 9ee301012..a3d590e81 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -47,7 +47,7 @@ DYNAMIC_DEVICELIBS = \ spicelib/devices/bsim4v4/libbsim4v4.la \ spicelib/devices/bsim4v5/libbsim4v5.la \ spicelib/devices/cap/libcap.la \ - spicelib/devices/bsim3soi/libbsim3soi.la \ + spicelib/devices/bsim3soi/libbsim4soi.la \ spicelib/devices/bsim3soi_pd/libbsim3soipd.la \ spicelib/devices/bsim3soi_fd/libbsim3soifd.la \ spicelib/devices/bsim3soi_dd/libbsim3soidd.la \ diff --git a/src/spicelib/devices/bsim3soi/Makefile.am b/src/spicelib/devices/bsim3soi/Makefile.am index 33db175ce..9d61301b8 100644 --- a/src/spicelib/devices/bsim3soi/Makefile.am +++ b/src/spicelib/devices/bsim3soi/Makefile.am @@ -1,8 +1,8 @@ ## Process this file with automake to produce Makefile.in -noinst_LTLIBRARIES = libbsim3soi.la +noinst_LTLIBRARIES = libbsim4soi.la -libbsim3soi_la_SOURCES = \ +libbsim4soi_la_SOURCES = \ b4soi.c \ b4soiacld.c \ b4soiask.c \ diff --git a/src/spicelib/devices/bsim3soi/b4soi.c b/src/spicelib/devices/bsim3soi/b4soi.c index 3cfad384b..6d2d321c1 100644 --- a/src/spicelib/devices/bsim3soi/b4soi.c +++ b/src/spicelib/devices/bsim3soi/b4soi.c @@ -1,12 +1,14 @@ -/*** B4SOI 11/30/2005 Xuemei (Jane) Xi Release ***/ +/*** B4SOI 03/06/2009 Wenwei Yang Release ***/ /********** - * Copyright 2005 Regents of the University of California. All rights reserved. + * Copyright 2009 Regents of the University of California. All rights reserved. * Authors: 1998 Samuel Fung, Dennis Sinitsky and Stephen Tang * Authors: 1999-2004 Pin Su, Hui Wan, Wei Jin, b3soi.c * Authors: 2005- Hui Wan, Xuemei Xi, Ali Niknejad, Chenming Hu. + * Authors: 2009- Wenwei Yang, Chung-Hsun Lin, Ali Niknejad, Chenming Hu. * File: b4soi.c * Modified by Hui Wan, Xuemei Xi 11/30/2005 + * Modified by Wenwei Yang, Chung-Hsun Lin, Darsen Lu 03/06/2009 **********/ @@ -46,6 +48,7 @@ OP( "ibd", B4SOI_IBD, IF_REAL, "Ibd"), OP( "ibs", B4SOI_IBS, IF_REAL, "Ibs"), OP( "isub", B4SOI_ISUB, IF_REAL, "Isub"), OP( "igidl", B4SOI_IGIDL, IF_REAL, "Igidl"), +OP( "igisl", B4SOI_IGISL, IF_REAL, "Igisl"), OP( "igs", B4SOI_IGS, IF_REAL, "Igs"), OP( "igd", B4SOI_IGD, IF_REAL, "Igd"), OP( "igb", B4SOI_IGB, IF_REAL, "Igb"), @@ -66,6 +69,11 @@ OP( "qg", B4SOI_QG, IF_REAL, "Qgate"), OP( "qb", B4SOI_QB, IF_REAL, "Qbulk"), OP( "qd", B4SOI_QD, IF_REAL, "Qdrain"), OP( "qs", B4SOI_QS, IF_REAL, "Qsource"), +#ifdef B4SOI_DEBUG_OUT +OP( "debug1", B4SOI_DEBUG1, IF_REAL, "DebugOut1"), +OP( "debug2", B4SOI_DEBUG2, IF_REAL, "DebugOut2"), +OP( "debug3", B4SOI_DEBUG3, IF_REAL, "DebugOut3"), +#endif IOP( "bjtoff", B4SOI_BJTOFF, IF_INTEGER, "BJT on/off flag"), IOP( "debug", B4SOI_DEBUG, IF_INTEGER, "BJT on/off flag"), @@ -89,6 +97,7 @@ IOP( "nseg", B4SOI_NSEG, IF_REAL, "Number segments for width partitionin IOP( "pdbcp", B4SOI_PDBCP, IF_REAL, "Perimeter length for bc parasitics at drain side"), IOP( "psbcp", B4SOI_PSBCP, IF_REAL, "Perimeter length for bc parasitics at source side"), IOP( "agbcp", B4SOI_AGBCP, IF_REAL, "Gate to body overlap area for bc parasitics"), +IOP( "agbcp2", B4SOI_AGBCP2, IF_REAL, "Parasitic Gate to body overlap area for bc parasitics"), /* v4.1 improvement on BC */ IOP( "agbcpd", B4SOI_AGBCPD, IF_REAL, "Gate to body overlap area for bc parasitics in DC"), IOP( "aebcp", B4SOI_AEBCP, IF_REAL, "Substrate to body overlap area for bc prasitics"), IOP( "vbsusr", B4SOI_VBSUSR, IF_REAL, "Vbs specified by user"), @@ -101,6 +110,28 @@ IOP( "rbodymod", B4SOI_RBODYMOD, IF_INTEGER, "Body R model selector"),/* v4.0 */ }; IFparm B4SOImPTable[] = { /* model parameters */ +/*4.1*/ +IOP( "mtrlmod", B4SOI_MOD_MTRLMOD, IF_INTEGER, "parameter for non-silicon substrate or metal gate selector"), +IOP( "vgstcvmod", B4SOI_MOD_VGSTCVMOD, IF_INTEGER, "Improved VgsteffCV selector"), +IOP( "gidlmod", B4SOI_MOD_GIDLMOD, IF_INTEGER, "parameter for GIDL selector"), +IOP( "iiimod", B4SOI_MOD_IIIMOD, IF_INTEGER, "parameter for III selector"), +IOP( "eot", B4SOI_MOD_EOT, IF_REAL, "Effective SiO2 thickness"), +IOP( "epsrox", B4SOI_MOD_EPSROX, IF_REAL, "Dielectric constant of the gate oxide relative to vacuum"), +IOP( "epsrsub", B4SOI_MOD_EPSRSUB, IF_REAL, "Dielectric constant of substrate relative to vacuum"), +IOP( "ni0sub", B4SOI_MOD_NI0SUB, IF_REAL, "Intrinsic carrier concentration of substrate at Tnom"), +IOP( "bg0sub", B4SOI_MOD_BG0SUB, IF_REAL, "Band-gap of substrate at T=0K"), +IOP( "tbgasub", B4SOI_MOD_TBGASUB, IF_REAL, "First parameter of band-gap change due to temperature"), +IOP( "tbgbsub", B4SOI_MOD_TBGBSUB, IF_REAL, "Second parameter of band-gap change due to temperature"), +IOP( "phig", B4SOI_MOD_PHIG, IF_REAL, "Work function of gate"), +IOP( "easub",B4SOI_MOD_EASUB, IF_REAL, "Electron affinity of substrate"), + +IOP( "leffeot", B4SOI_MOD_LEFFEOT, IF_REAL, "Effective length for extraction of EOT"), +IOP( "weffeot", B4SOI_MOD_WEFFEOT, IF_REAL, "Effective width for extraction of EOT"), +IOP( "vddeot", B4SOI_MOD_VDDEOT, IF_REAL, "Voltage for extraction of EOT"), +IOP( "tempeot", B4SOI_MOD_TEMPEOT, IF_REAL, " Temperature for extraction of EOT"), +IOP( "ados", B4SOI_MOD_ADOS, IF_REAL, "Charge centroid parameter"), +IOP( "bdos", B4SOI_MOD_BDOS, IF_REAL, "Charge centroid parameter"), +IOP( "epsrgate", B4SOI_MOD_EPSRGATE, IF_REAL, "Dielectric constant of gate relative to vacuum"), IOP( "capmod", B4SOI_MOD_CAPMOD, IF_INTEGER, "Capacitance model selector"), IOP( "mobmod", B4SOI_MOD_MOBMOD, IF_INTEGER, "Mobility model selector"), /*IOP( "noimod", B4SOI_MOD_NOIMOD, IF_INTEGER, "Noise model selector"), v3.2 */ @@ -108,6 +139,7 @@ IOP( "paramchk", B4SOI_MOD_PARAMCHK, IF_INTEGER, "Model parameter checking selec IOP( "binunit", B4SOI_MOD_BINUNIT, IF_INTEGER, "Bin unit selector"), IOP( "version", B4SOI_MOD_VERSION, IF_REAL, " parameter for model version"), IOP( "tox", B4SOI_MOD_TOX, IF_REAL, "Gate oxide thickness in meters"), +IOP( "toxp", B4SOI_MOD_TOXP, IF_REAL, " Physical gate oxide thickness"), IOP( "toxm", B4SOI_MOD_TOXM, IF_REAL, "Gate oxide thickness used in extraction"), /* v3.2 */ IOP( "dtoxcv", B4SOI_MOD_DTOXCV, IF_REAL, "Delta oxide thickness in meters in CapMod3"), /* v2.2.3 */ @@ -126,6 +158,7 @@ IOP( "keta", B4SOI_MOD_KETA, IF_REAL, "Body-bias coefficient of non-uniform depl IOP( "nsub", B4SOI_MOD_NSUB, IF_REAL, "Substrate doping concentration with polarity"), IOP( "nch", B4SOI_MOD_NPEAK, IF_REAL, "Channel doping concentration"), IOP( "ngate", B4SOI_MOD_NGATE, IF_REAL, "Poly-gate doping concentration"), +IOP( "nsd", B4SOI_MOD_NSD, IF_REAL, "S/D doping concentration"), IOP( "gamma1", B4SOI_MOD_GAMMA1, IF_REAL, "Vth body coefficient"), IOP( "gamma2", B4SOI_MOD_GAMMA2, IF_REAL, "Vth body coefficient"), IOP( "vbx", B4SOI_MOD_VBX, IF_REAL, "Vth transition body Voltage"), @@ -152,6 +185,7 @@ IOP( "drout", B4SOI_MOD_DROUT, IF_REAL, "DIBL coefficient of output resistance") IOP( "dsub", B4SOI_MOD_DSUB, IF_REAL, "DIBL coefficient in the subthreshold region"), IOP( "vth0", B4SOI_MOD_VTH0, IF_REAL,"Threshold voltage"), IOP( "vtho", B4SOI_MOD_VTH0, IF_REAL,"Threshold voltage"), +IOP( "vfb", B4SOI_MOD_VFB, IF_REAL, "Flat Band Voltage"), /* v4.1 */ IOP( "ua", B4SOI_MOD_UA, IF_REAL, "Linear gate dependence of mobility"), IOP( "ua1", B4SOI_MOD_UA1, IF_REAL, "Temperature coefficient of ua"), IOP( "ub", B4SOI_MOD_UB, IF_REAL, "Quadratic gate dependence of mobility"), @@ -159,7 +193,12 @@ IOP( "ub1", B4SOI_MOD_UB1, IF_REAL, "Temperature coefficient of ub"), IOP( "uc", B4SOI_MOD_UC, IF_REAL, "Body-bias dependence of mobility"), IOP( "uc1", B4SOI_MOD_UC1, IF_REAL, "Temperature coefficient of uc"), IOP( "u0", B4SOI_MOD_U0, IF_REAL, "Low-field mobility at Tnom"), +IOP( "eu", B4SOI_MOD_EU, IF_REAL, "Mobility exponent"), IOP( "ute", B4SOI_MOD_UTE, IF_REAL, "Temperature coefficient of mobility"), +IOP( "ucs", B4SOI_MOD_UCS, IF_REAL, "Mobility exponent"), +IOP( "ucste", B4SOI_MOD_UCSTE, IF_REAL, " Temperature coefficient of UCS"), +IOP( "ud", B4SOI_MOD_UD, IF_REAL, "Coulomb scattering factor of mobility"), +IOP( "ud1", B4SOI_MOD_UD1, IF_REAL, "Temperature coefficient of ud"), IOP( "voff", B4SOI_MOD_VOFF, IF_REAL, "Threshold voltage offset"), IOP( "tnom", B4SOI_MOD_TNOM, IF_REAL, "Parameter measurement temperature"), IOP( "cgso", B4SOI_MOD_CGSO, IF_REAL, "Gate-source overlap capacitance per width"), @@ -189,14 +228,27 @@ IOP( "pvag", B4SOI_MOD_PVAG, IF_REAL, "Gate dependence of output resistance para IOP( "shmod", B4SOI_MOD_SHMOD, IF_INTEGER, "Self heating mode selector"), IOP( "ddmod", B4SOI_MOD_DDMOD, IF_INTEGER, "Dynamic depletion mode selector"), IOP( "tbox", B4SOI_MOD_TBOX, IF_REAL, "Back gate oxide thickness in meters"), -IOP( "tsi", B4SOI_MOD_TSI, IF_REAL, "Silicon-on-insulator thickness in meters"), +IOP( "tsi", B4SOI_MOD_TSI, IF_REAL, "Silicon-on-insulator thickness in meters"), +IOP( "etsi", B4SOI_MOD_ETSI, IF_REAL, "Effective Silicon-on-insulator thickness in meters"), IOP( "xj", B4SOI_MOD_XJ, IF_REAL, "Junction Depth"), IOP( "rth0", B4SOI_MOD_RTH0, IF_REAL, "Self-heating thermal resistance"), IOP( "cth0", B4SOI_MOD_CTH0, IF_REAL, "Self-heating thermal capacitance"), IOP( "egidl", B4SOI_MOD_EGIDL, IF_REAL, "GIDL first parameter"), IOP( "agidl", B4SOI_MOD_AGIDL, IF_REAL, "GIDL second parameter"), IOP( "bgidl", B4SOI_MOD_BGIDL, IF_REAL, "GIDL third parameter"), -IOP( "cgidl", B4SOI_MOD_CGIDL, IF_REAL, "GIDL vb parameter"), +IOP( "cgidl", B4SOI_MOD_CGIDL, IF_REAL, "GIDL vb parameter"), +IOP( "rgidl", B4SOI_MOD_RGIDL, IF_REAL, "GIDL vg parameter"), +IOP( "kgidl", B4SOI_MOD_KGIDL, IF_REAL, "GIDL vb parameter"), +IOP( "fgidl", B4SOI_MOD_FGIDL, IF_REAL, "GIDL vb parameter"), + +IOP( "egisl", B4SOI_MOD_EGISL, IF_REAL, "GISL first parameter"), +IOP( "agisl", B4SOI_MOD_AGISL, IF_REAL, "GISL second parameter"), +IOP( "bgisl", B4SOI_MOD_BGISL, IF_REAL, "GISL third parameter"), +IOP( "cgisl", B4SOI_MOD_CGISL, IF_REAL, "GISL vb parameter"), +IOP( "rgisl", B4SOI_MOD_RGISL, IF_REAL, "GISL vg parameter"), +IOP( "kgisl", B4SOI_MOD_KGISL, IF_REAL, "GISL vb parameter"), +IOP( "fgisl", B4SOI_MOD_FGISL, IF_REAL, "GISL vb parameter"), + IOP( "ndiode", B4SOI_MOD_NDIODES, IF_REAL,"Diode non-ideality factor"),/*v4.0*/ IOP( "ndioded", B4SOI_MOD_NDIODED, IF_REAL,"Diode non-ideality factor"),/*v4.0*/ IOP( "xbjt", B4SOI_MOD_XBJT, IF_REAL, "Temperature coefficient for Isbjt"), @@ -305,6 +357,18 @@ IOP( "dvtp1", B4SOI_MOD_DVTP1, IF_REAL, "Second parameter for Vth shift due to IOP( "ldvtp1", B4SOI_MOD_LDVTP1, IF_REAL, "Length dependence of dvtp1"), IOP( "wdvtp1", B4SOI_MOD_WDVTP1, IF_REAL, "Width dependence of dvtp1"), IOP( "pdvtp1", B4SOI_MOD_PDVTP1, IF_REAL, "Cross-term dependence of dvtp1"), +IOP( "dvtp2", B4SOI_MOD_DVTP2, IF_REAL, "Third parameter for Vth shift due to pocket"), +IOP( "ldvtp2", B4SOI_MOD_LDVTP2, IF_REAL, "Length dependence of dvtp2"), +IOP( "wdvtp2", B4SOI_MOD_WDVTP2, IF_REAL, "Width dependence of dvtp2"), +IOP( "pdvtp2", B4SOI_MOD_PDVTP2, IF_REAL, "Cross-term dependence of dvtp2"), +IOP( "dvtp3", B4SOI_MOD_DVTP3, IF_REAL, "Third parameter for Vth shift due to pocket"), +IOP( "ldvtp3", B4SOI_MOD_LDVTP3, IF_REAL, "Length dependence of dvtp3"), +IOP( "wdvtp3", B4SOI_MOD_WDVTP3, IF_REAL, "Width dependence of dvtp3"), +IOP( "pdvtp3", B4SOI_MOD_PDVTP3, IF_REAL, "Cross-term dependence of dvtp3"), +IOP( "dvtp4", B4SOI_MOD_DVTP4, IF_REAL, "Forth parameter for Vth shift due to pocket"), +IOP( "ldvtp4", B4SOI_MOD_LDVTP4, IF_REAL, "Length dependence of dvtp4"), +IOP( "wdvtp4", B4SOI_MOD_WDVTP4, IF_REAL, "Width dependence of dvtp4"), +IOP( "pdvtp4", B4SOI_MOD_PDVTP4, IF_REAL, "Cross-term dependence of dvtp4"), IOP( "minv", B4SOI_MOD_MINV, IF_REAL, "For moderate invversion in Vgsteff"), IOP( "lminv", B4SOI_MOD_LMINV, IF_REAL, "Length dependence of minv"), IOP( "wminv", B4SOI_MOD_WMINV, IF_REAL, "width dependence of minv"), @@ -347,6 +411,13 @@ IOP( "sii1", B4SOI_MOD_SII1, IF_REAL, "Second Vgs dependent parameter for impact IOP( "sii2", B4SOI_MOD_SII2, IF_REAL, "Third Vgs dependent parameter for impact ionizition current"), IOP( "siid", B4SOI_MOD_SIID, IF_REAL, "Vds dependent parameter of drain saturation voltage for impact ionizition current"), IOP( "fbjtii", B4SOI_MOD_FBJTII, IF_REAL, "Fraction of bipolar current affecting the impact ionization"), +/*4.1*/ +IOP( "ebjtii", B4SOI_MOD_EBJTII, IF_REAL, "Impact ionization parameter for BJT part"), +IOP( "cbjtii", B4SOI_MOD_CBJTII, IF_REAL, "Length scaling parameter for II BJT part"), +IOP( "vbci", B4SOI_MOD_VBCI, IF_REAL, "Internal B-C built-in potential"), +IOP( "abjtii", B4SOI_MOD_ABJTII, IF_REAL, "Exponent factor for avalanche current"), +IOP( "mbjtii", B4SOI_MOD_MBJTII, IF_REAL, "Internal B-C grading coefficient"), +IOP( "tvbci", B4SOI_MOD_TVBCI, IF_REAL, "Temperature coefficient for VBCI"), IOP( "esatii", B4SOI_MOD_ESATII, IF_REAL, "Saturation electric field for impact ionization"), IOP( "ntun", B4SOI_MOD_NTUNS, IF_REAL,"Reverse tunneling non-ideality factor"), IOP( "ntund", B4SOI_MOD_NTUND, IF_REAL,"Reverse tunneling non-ideality factor"), @@ -418,6 +489,9 @@ IOP( "vecb", B4SOI_MOD_VECB, IF_REAL, "Vaux parameter for conduction-band electr IOP( "alphagb2", B4SOI_MOD_ALPHAGB2, IF_REAL, "First Vox dependent parameter for gate current in accumulation"), IOP( "betagb2", B4SOI_MOD_BETAGB2, IF_REAL, "Second Vox dependent parameter for gate current in accumulation"), IOP( "vgb2", B4SOI_MOD_VGB2, IF_REAL, "Third Vox dependent parameter for gate current in accumulation"), +IOP( "aigbcp2", B4SOI_MOD_AIGBCP2, IF_REAL, "First Vgp dependent parameter for gate current in accumulation in AGBCP2 region"), +IOP( "bigbcp2", B4SOI_MOD_BIGBCP2, IF_REAL, "Second Vgp dependent parameter for gate current in accumulation in AGBCP2 region"), +IOP( "cigbcp2", B4SOI_MOD_CIGBCP2, IF_REAL, "Third Vgp dependent parameter for gate current in accumulation in AGBCP2 region"), IOP( "voxh", B4SOI_MOD_VOXH, IF_REAL, "the limit of Vox in gate current calculation"), IOP( "deltavox", B4SOI_MOD_DELTAVOX, IF_REAL, "the smoothing parameter in the Vox smoothing function"), @@ -464,6 +538,18 @@ IOP( "rbodymod", B4SOI_MOD_RBODYMOD, IF_INTEGER, "Body R model selector"), /* 4.0 */ IOP( "rdsmod", B4SOI_MOD_RDSMOD, IF_INTEGER, "Bias-dependent S/D resistance model selector"), /* v4.0 */ +/* v4.1 */ +IOP( "fdmod", B4SOI_MOD_FDMOD, IF_INTEGER, "Improved dVbi model selector"), +IOP( "vsce", B4SOI_MOD_VSCE, IF_REAL, "SCE parameter for improved dVbi model"), +IOP( "cdsbs", B4SOI_MOD_CDSBS, IF_REAL, "coupling from Vd to Vbs for improved dVbi model"), +IOP( "minvcv", B4SOI_MOD_MINVCV, IF_REAL, "For moderate invversion in VgsteffCV"), +IOP( "lminvcv", B4SOI_MOD_LMINVCV, IF_REAL, "Length dependence of minvcv"), +IOP( "wminvcv", B4SOI_MOD_WMINVCV, IF_REAL, "width dependence of minvcv"), +IOP( "pminvcv", B4SOI_MOD_PMINVCV, IF_REAL, "Cross-term dependence of minvcv"), +IOP( "voffcv", B4SOI_MOD_VOFFCV, IF_REAL, "CV Threshold voltage offset"), +IOP( "lvoffcv", B4SOI_MOD_LVOFFCV, IF_REAL, "Length dependence of voffcv"), +IOP( "wvoffcv", B4SOI_MOD_WVOFFCV, IF_REAL, "Width dependence of voffcv"), +IOP( "pvoffcv", B4SOI_MOD_PVOFFCV, IF_REAL, "Cross-term dependence of voffcv"), /* Added for binning - START */ /* Length Dependence */ /* v3.1 */ @@ -472,6 +558,9 @@ IOP( "lalphagb1", B4SOI_MOD_LALPHAGB1, IF_REAL, "Length dependence of alphagb1") IOP( "lbetagb1", B4SOI_MOD_LBETAGB1, IF_REAL, "Length dependence of betagb1"), IOP( "lalphagb2", B4SOI_MOD_LALPHAGB2, IF_REAL, "Length dependence of alphagb2"), IOP( "lbetagb2", B4SOI_MOD_LBETAGB2, IF_REAL, "Length dependence of betagb2"), +IOP( "laigbcp2", B4SOI_MOD_LAIGBCP2, IF_REAL, "Length dependence of aigbcp2"), +IOP( "lbigbcp2", B4SOI_MOD_LBIGBCP2, IF_REAL, "Length dependence of bigbcp2"), +IOP( "lcigbcp2", B4SOI_MOD_LCIGBCP2, IF_REAL, "Length dependence of cigbcp2"), IOP( "lcgsl", B4SOI_MOD_LCGSL, IF_REAL, "Length dependence of cgsl"), IOP( "lcgdl", B4SOI_MOD_LCGDL, IF_REAL, "Length dependence of cgdl"), IOP( "lckappa", B4SOI_MOD_LCKAPPA, IF_REAL, "Length dependence of ckappa"), @@ -509,7 +598,9 @@ IOP( "lpoxedge", B4SOI_MOD_LPOXEDGE, IF_REAL, "Length dependence for poxedge"), IOP( "lnch", B4SOI_MOD_LNPEAK, IF_REAL, "Length dependence of nch"), IOP( "lnsub", B4SOI_MOD_LNSUB, IF_REAL, "Length dependence of nsub"), IOP( "lngate", B4SOI_MOD_LNGATE, IF_REAL, "Length dependence of ngate"), +IOP( "lnsd", B4SOI_MOD_LNSD, IF_REAL, "Length dependence of nsd"), IOP( "lvth0", B4SOI_MOD_LVTH0, IF_REAL,"Length dependence of vto"), +IOP( "lvfb", B4SOI_MOD_LVFB, IF_REAL, "Length dependence of vfb"), /* v4.1 */ IOP( "lk1", B4SOI_MOD_LK1, IF_REAL, "Length dependence of k1"), IOP( "lk1w1", B4SOI_MOD_LK1W1, IF_REAL, "Length dependence of k1w1"), IOP( "lk1w2", B4SOI_MOD_LK1W2, IF_REAL, "Length dependence of k1w2"), @@ -527,9 +618,12 @@ IOP( "ldvt0w", B4SOI_MOD_LDVT0W, IF_REAL, "Length dependence of dvt0w"), IOP( "ldvt1w", B4SOI_MOD_LDVT1W, IF_REAL, "Length dependence of dvt1w"), IOP( "ldvt2w", B4SOI_MOD_LDVT2W, IF_REAL, "Length dependence of dvt2w"), IOP( "lu0", B4SOI_MOD_LU0, IF_REAL, "Length dependence of u0"), +IOP( "leu", B4SOI_MOD_LEU, IF_REAL, " Length dependence of eu"), IOP( "lua", B4SOI_MOD_LUA, IF_REAL, "Length dependence of ua"), IOP( "lub", B4SOI_MOD_LUB, IF_REAL, "Length dependence of ub"), IOP( "luc", B4SOI_MOD_LUC, IF_REAL, "Length dependence of uc"), +IOP( "lucste", B4SOI_MOD_LUCSTE, IF_REAL, "Length dependence of ucste"), +IOP( "lucs", B4SOI_MOD_LUCS, IF_REAL, "Length dependence of lucs"), IOP( "lvsat", B4SOI_MOD_LVSAT, IF_REAL, "Length dependence of vsat"), IOP( "la0", B4SOI_MOD_LA0, IF_REAL, "Length dependence of a0"), IOP( "lags", B4SOI_MOD_LAGS, IF_REAL, "Length dependence of ags"), @@ -579,6 +673,16 @@ IOP( "lagidl", B4SOI_MOD_LAGIDL, IF_REAL, "Length dependence of agidl"), IOP( "lbgidl", B4SOI_MOD_LBGIDL, IF_REAL, "Length dependence of bgidl"), IOP( "lcgidl", B4SOI_MOD_LCGIDL, IF_REAL, "Length dependence of cgidl"), IOP( "legidl", B4SOI_MOD_LEGIDL, IF_REAL, "Length dependence of egidl"), +IOP( "lrgidl", B4SOI_MOD_LRGIDL, IF_REAL, "Length dependence of rgidl"), +IOP( "lkgidl", B4SOI_MOD_LKGIDL, IF_REAL, "Length dependence of kgidl"), +IOP( "lfgidl", B4SOI_MOD_LFGIDL, IF_REAL, "Length dependence of fgidl"), +IOP( "lagisl", B4SOI_MOD_LAGISL, IF_REAL, "Length dependence of agisl"), +IOP( "lbgisl", B4SOI_MOD_LBGISL, IF_REAL, "Length dependence of bgisl"), +IOP( "lcgisl", B4SOI_MOD_LCGISL, IF_REAL, "Length dependence of cgisl"), +IOP( "legisl", B4SOI_MOD_LEGISL, IF_REAL, "Length dependence of egisl"), +IOP( "lrgisl", B4SOI_MOD_LRGISL, IF_REAL, "Length dependence of rgisl"), +IOP( "lkgisl", B4SOI_MOD_LKGISL, IF_REAL, "Length dependence of kgisl"), +IOP( "lfgisl", B4SOI_MOD_LFGISL, IF_REAL, "Length dependence of fgisl"), IOP( "lntun", B4SOI_MOD_LNTUNS, IF_REAL, "Length dependence of ntun"), IOP( "lntund", B4SOI_MOD_LNTUND, IF_REAL, "Length dependence of ntund"), IOP( "lndiode", B4SOI_MOD_LNDIODES, IF_REAL, "Length dependence of ndiode"), @@ -624,6 +728,9 @@ IOP( "walphagb1", B4SOI_MOD_WALPHAGB1, IF_REAL, "Width dependence of alphagb1"), IOP( "wbetagb1", B4SOI_MOD_WBETAGB1, IF_REAL, "Width dependence of betagb1"), IOP( "walphagb2", B4SOI_MOD_WALPHAGB2, IF_REAL, "Width dependence of alphagb2"), IOP( "wbetagb2", B4SOI_MOD_WBETAGB2, IF_REAL, "Width dependence of betagb2"), +IOP( "waigbcp2", B4SOI_MOD_WAIGBCP2, IF_REAL, "Width dependence of aigbcp2"), +IOP( "wbigbcp2", B4SOI_MOD_WBIGBCP2, IF_REAL, "Width dependence of bigbcp2"), +IOP( "wcigbcp2", B4SOI_MOD_WCIGBCP2, IF_REAL, "Width dependence of cigbcp2"), IOP( "wcgsl", B4SOI_MOD_WCGSL, IF_REAL, "Width dependence of cgsl"), IOP( "wcgdl", B4SOI_MOD_WCGDL, IF_REAL, "Width dependence of cgdl"), IOP( "wckappa", B4SOI_MOD_WCKAPPA, IF_REAL, "Width dependence of ckappa"), @@ -661,7 +768,9 @@ IOP( "wpoxedge", B4SOI_MOD_WPOXEDGE, IF_REAL, "Width dependence for poxedge"), IOP( "wnch", B4SOI_MOD_WNPEAK, IF_REAL, "Width dependence of nch"), IOP( "wnsub", B4SOI_MOD_WNSUB, IF_REAL, "Width dependence of nsub"), IOP( "wngate", B4SOI_MOD_WNGATE, IF_REAL, "Width dependence of ngate"), +IOP( "wnsd", B4SOI_MOD_WNSD, IF_REAL, "Width dependence of nsd"), IOP( "wvth0", B4SOI_MOD_WVTH0, IF_REAL,"Width dependence of vto"), +IOP( "wvfb", B4SOI_MOD_WVFB, IF_REAL, "Width dependence of vfb"), /* v4.1 */ IOP( "wk1", B4SOI_MOD_WK1, IF_REAL, "Width dependence of k1"), IOP( "wk1w1", B4SOI_MOD_WK1W1, IF_REAL, "Width dependence of k1w1"), IOP( "wk1w2", B4SOI_MOD_WK1W2, IF_REAL, "Width dependence of k1w2"), @@ -679,9 +788,12 @@ IOP( "wdvt0w", B4SOI_MOD_WDVT0W, IF_REAL, "Width dependence of dvt0w"), IOP( "wdvt1w", B4SOI_MOD_WDVT1W, IF_REAL, "Width dependence of dvt1w"), IOP( "wdvt2w", B4SOI_MOD_WDVT2W, IF_REAL, "Width dependence of dvt2w"), IOP( "wu0", B4SOI_MOD_WU0, IF_REAL, "Width dependence of u0"), +IOP( "weu", B4SOI_MOD_WEU, IF_REAL, "Width dependence of eu"), IOP( "wua", B4SOI_MOD_WUA, IF_REAL, "Width dependence of ua"), IOP( "wub", B4SOI_MOD_WUB, IF_REAL, "Width dependence of ub"), IOP( "wuc", B4SOI_MOD_WUC, IF_REAL, "Width dependence of uc"), +IOP( "wucste", B4SOI_MOD_WUCSTE, IF_REAL, "Width dependence of ucste"), +IOP( "wucs", B4SOI_MOD_WUCS, IF_REAL, "Width dependence of ucs"), IOP( "wvsat", B4SOI_MOD_WVSAT, IF_REAL, "Width dependence of vsat"), IOP( "wa0", B4SOI_MOD_WA0, IF_REAL, "Width dependence of a0"), IOP( "wags", B4SOI_MOD_WAGS, IF_REAL, "Width dependence of ags"), @@ -731,6 +843,16 @@ IOP( "wagidl", B4SOI_MOD_WAGIDL, IF_REAL, "Width dependence of agidl"), IOP( "wbgidl", B4SOI_MOD_WBGIDL, IF_REAL, "Width dependence of bgidl"), IOP( "wcgidl", B4SOI_MOD_WCGIDL, IF_REAL, "Width dependence of cgidl"), IOP( "wegidl", B4SOI_MOD_WEGIDL, IF_REAL, "Width dependence of egidl"), +IOP( "wrgidl", B4SOI_MOD_WRGIDL, IF_REAL, "Width dependence of rgidl"), +IOP( "wkgidl", B4SOI_MOD_WKGIDL, IF_REAL, "Width dependence of kgidl"), +IOP( "wfgidl", B4SOI_MOD_WFGIDL, IF_REAL, "Width dependence of fgidl"), +IOP( "wagisl", B4SOI_MOD_WAGISL, IF_REAL, "Width dependence of agisl"), +IOP( "wbgisl", B4SOI_MOD_WBGISL, IF_REAL, "Width dependence of bgisl"), +IOP( "wcgisl", B4SOI_MOD_WCGISL, IF_REAL, "Width dependence of cgisl"), +IOP( "wegisl", B4SOI_MOD_WEGISL, IF_REAL, "Width dependence of egisl"), +IOP( "wrgisl", B4SOI_MOD_WRGISL, IF_REAL, "Width dependence of rgisl"), +IOP( "wkgisl", B4SOI_MOD_WKGISL, IF_REAL, "Width dependence of kgisl"), +IOP( "wfgisl", B4SOI_MOD_WFGISL, IF_REAL, "Width dependence of fgisl"), IOP( "wntun", B4SOI_MOD_WNTUNS, IF_REAL, "Width dependence of ntun"), IOP( "wntund", B4SOI_MOD_WNTUND, IF_REAL, "Width dependence of ntund"), IOP( "wndiode", B4SOI_MOD_WNDIODES, IF_REAL, "Width dependence of ndiode"), @@ -777,6 +899,9 @@ IOP( "palphagb1", B4SOI_MOD_PALPHAGB1, IF_REAL, "Cross-term dependence of alphag IOP( "pbetagb1", B4SOI_MOD_PBETAGB1, IF_REAL, "Cross-term dependence of betagb1"), IOP( "palphagb2", B4SOI_MOD_PALPHAGB2, IF_REAL, "Cross-term dependence of alphagb2"), IOP( "pbetagb2", B4SOI_MOD_PBETAGB2, IF_REAL, "Cross-term dependence of betagb2"), +IOP( "paigbcp2", B4SOI_MOD_PAIGBCP2, IF_REAL, "Cross-term dependence of aigbcp2"), +IOP( "pbigbcp2", B4SOI_MOD_PBIGBCP2, IF_REAL, "Cross-term dependence of bigbcp2"), +IOP( "pcigbcp2", B4SOI_MOD_PCIGBCP2, IF_REAL, "Cross-term dependence of cigbcp2"), IOP( "pcgsl", B4SOI_MOD_PCGSL, IF_REAL, "Cross-term dependence of cgsl"), IOP( "pcgdl", B4SOI_MOD_PCGDL, IF_REAL, "Cross-term dependence of cgdl"), IOP( "pckappa", B4SOI_MOD_PCKAPPA, IF_REAL, "Cross-term dependence of ckappa"), @@ -813,8 +938,10 @@ IOP( "ppoxedge", B4SOI_MOD_PPOXEDGE, IF_REAL, "Cross-term dependence for poxedge IOP( "pnch", B4SOI_MOD_PNPEAK, IF_REAL, "Cross-term dependence of nch"), IOP( "pnsub", B4SOI_MOD_PNSUB, IF_REAL, "Cross-term dependence of nsub"), +IOP( "pnsd", B4SOI_MOD_PNSD, IF_REAL, "Cross-term dependence of nsd"), IOP( "pngate", B4SOI_MOD_PNGATE, IF_REAL, "Cross-term dependence of ngate"), IOP( "pvth0", B4SOI_MOD_PVTH0, IF_REAL,"Cross-term dependence of vto"), +IOP( "pvfb", B4SOI_MOD_PVFB, IF_REAL, "Cross-term dependence of vfb"), /* v4.1 */ IOP( "pk1", B4SOI_MOD_PK1, IF_REAL, "Cross-term dependence of k1"), IOP( "pk1w1", B4SOI_MOD_PK1W1, IF_REAL, "Cross-term dependence of k1w1"), IOP( "pk1w2", B4SOI_MOD_PK1W2, IF_REAL, "Cross-term dependence of k1w2"), @@ -832,9 +959,12 @@ IOP( "pdvt0w", B4SOI_MOD_PDVT0W, IF_REAL, "Cross-term dependence of dvt0w"), IOP( "pdvt1w", B4SOI_MOD_PDVT1W, IF_REAL, "Cross-term dependence of dvt1w"), IOP( "pdvt2w", B4SOI_MOD_PDVT2W, IF_REAL, "Cross-term dependence of dvt2w"), IOP( "pu0", B4SOI_MOD_PU0, IF_REAL, "Cross-term dependence of u0"), +IOP( "peu", B4SOI_MOD_PEU, IF_REAL, "Cross-term dependence of eu"), IOP( "pua", B4SOI_MOD_PUA, IF_REAL, "Cross-term dependence of ua"), IOP( "pub", B4SOI_MOD_PUB, IF_REAL, "Cross-term dependence of ub"), IOP( "puc", B4SOI_MOD_PUC, IF_REAL, "Cross-term dependence of uc"), +IOP( "pucste", B4SOI_MOD_PUCSTE, IF_REAL, "Cross-term dependence of ucste"), +IOP( "pucs", B4SOI_MOD_PUCS, IF_REAL, "Cross-term dependence of ucs"), IOP( "pvsat", B4SOI_MOD_PVSAT, IF_REAL, "Cross-term dependence of vsat"), IOP( "pa0", B4SOI_MOD_PA0, IF_REAL, "Cross-term dependence of a0"), IOP( "pags", B4SOI_MOD_PAGS, IF_REAL, "Cross-term dependence of ags"), @@ -884,6 +1014,16 @@ IOP( "pagidl", B4SOI_MOD_PAGIDL, IF_REAL, "Cross-term dependence of agidl"), IOP( "pbgidl", B4SOI_MOD_PBGIDL, IF_REAL, "Cross-term dependence of bgidl"), IOP( "pcgidl", B4SOI_MOD_PCGIDL, IF_REAL, "Cross-term dependence of cgidl"), IOP( "pegidl", B4SOI_MOD_PEGIDL, IF_REAL, "Cross-term dependence of egidl"), +IOP( "prgidl", B4SOI_MOD_PRGIDL, IF_REAL, "Cross-term dependence of rgidl"), +IOP( "pkgidl", B4SOI_MOD_PKGIDL, IF_REAL, "Cross-term dependence of kgidl"), +IOP( "pfgidl", B4SOI_MOD_PFGIDL, IF_REAL, "Cross-term dependence of fgidl"), +IOP( "pagisl", B4SOI_MOD_PAGISL, IF_REAL, "Cross-term dependence of agisl"), +IOP( "pbgisl", B4SOI_MOD_PBGISL, IF_REAL, "Cross-term dependence of bgisl"), +IOP( "pcgisl", B4SOI_MOD_PCGISL, IF_REAL, "Cross-term dependence of cgisl"), +IOP( "pegisl", B4SOI_MOD_PEGISL, IF_REAL, "Cross-term dependence of egisl"), +IOP( "prgisl", B4SOI_MOD_PRGISL, IF_REAL, "Cross-term dependence of rgisl"), +IOP( "pkgisl", B4SOI_MOD_PKGISL, IF_REAL, "Cross-term dependence of kgisl"), +IOP( "pfgisl", B4SOI_MOD_PFGISL, IF_REAL, "Cross-term dependence of fgisl"), IOP( "pntun", B4SOI_MOD_PNTUNS, IF_REAL, "Cross-term dependence of ntun"), IOP( "pntund", B4SOI_MOD_PNTUND, IF_REAL, "Cross-term dependence of ntund"), IOP( "pndiode", B4SOI_MOD_PNDIODES, IF_REAL,"Cross-term dependence of ndiode"), @@ -943,7 +1083,7 @@ char *B4SOInames[] = { "Gate", "Source", "Backgate", - "", + "Body_ext", "Body", "Temp", "Charge", diff --git a/src/spicelib/devices/bsim3soi/b4soiacld.c b/src/spicelib/devices/bsim3soi/b4soiacld.c index 3f66d2321..974c9f7a4 100644 --- a/src/spicelib/devices/bsim3soi/b4soiacld.c +++ b/src/spicelib/devices/bsim3soi/b4soiacld.c @@ -1,12 +1,14 @@ -/*** B4SOI 11/30/2005 Xuemei (Jane) Xi Release ***/ +/*** B4SOI 03/06/2009 Wenwei Yang Release ***/ /********** - * Copyright 2005 Regents of the University of California. All rights reserved. + * Copyright 2009 Regents of the University of California. All rights reserved. * Authors: 1998 Samuel Fung, Dennis Sinitsky and Stephen Tang * Authors: 1999-2004 Pin Su, Hui Wan, Wei Jin, b3soiacld.c * Authors: 2005- Hui Wan, Xuemei Xi, Ali Niknejad, Chenming Hu. + * Authors: 2009- Wenwei Yang, Chung-Hsun Lin, Ali Niknejad, Chenming Hu. * File: b4soiacld.c * Modified by Hui Wan, Xuemei Xi 11/30/2005 + * Modified by Wenwei Yang, Chung-Hsun Lin, Darsen Lu 03/06/2009 **********/ #include "ngspice.h" @@ -52,6 +54,7 @@ double gcrgd, gcrgg, gcrgs, gcrgb, gcrg; double xcgmgmb, xcgmdb, xcgmsb, xcgmeb, xcdgmb, xcsgmb, xcegmb; double geltd; double gigg, gigd, gigs, gigb, gige, gigT; +double gigpg=0.0, gigpp=0.0; /* v3.1.1 bug fix */ double gIstotg, gIstotd, gIstotb, gIstots; @@ -118,6 +121,10 @@ double m; gigd = here->B4SOIgigd; gigT = model->B4SOItype * here->B4SOIgigT; + /* v4.1 */ + gigpg = here->B4SOIgigpg; + gigpp = here->B4SOIgigpp; + gbbg = -here->B4SOIgbgs; gbbdp = -here->B4SOIgbds; gbbb = -here->B4SOIgbbs; @@ -753,6 +760,20 @@ double m; (*(here->B4SOIPpPtr) += m * gppp); } + /* v4.1 Ig_agbcp2 stamping */ + (*(here->B4SOIGgPtr) += gigpg); + if (here->B4SOIbodyMod == 1) { + (*(here->B4SOIPpPtr) -= m * gigpp); + (*(here->B4SOIPgPtr) -= m * gigpg); + (*(here->B4SOIGpPtr) += m * gigpp); + } + else if(here->B4SOIbodyMod == 2) + { + (*(here->B4SOIBbPtr) -= m * gigpp); + (*(here->B4SOIBgPtr) -= m * gigpg); + (*(here->B4SOIGbPtr) += m * gigpp); + } + /* v4.0 */ if (here->B4SOIrbodyMod) diff --git a/src/spicelib/devices/bsim3soi/b4soiask.c b/src/spicelib/devices/bsim3soi/b4soiask.c index d3fdcafe2..593d50944 100644 --- a/src/spicelib/devices/bsim3soi/b4soiask.c +++ b/src/spicelib/devices/bsim3soi/b4soiask.c @@ -1,12 +1,14 @@ -/*** B4SOI 11/30/2005 Xuemei (Jane) Xi Release ***/ +/*** B4SOI 03/06/2009 Wenwei Yang Release ***/ /********** - * Copyright 2005 Regents of the University of California. All rights reserved. + * Copyright 2009 Regents of the University of California. All rights reserved. * Authors: 1998 Samuel Fung, Dennis Sinitsky and Stephen Tang * Authors: 1999-2004 Pin Su, Hui Wan, Wei Jin, b3soiask.c * Authors: 2005- Hui Wan, Xuemei Xi, Ali Niknejad, Chenming Hu. + * Authors: 2009- Wenwei Yang, Chung-Hsun Lin, Ali Niknejad, Chenming Hu. * File: b4soiask.c * Modified by Hui Wan, Xuemei Xi 11/30/2005 + * Modified by Wenwei Yang, Chung-Hsun Lin, Darsen Lu 03/06/2009 **********/ #include "ngspice.h" @@ -18,8 +20,7 @@ #include "suffix.h" int -B4SOIask(CKTcircuit *ckt, GENinstance *inst, int which, IFvalue *value, - IFvalue *select) +B4SOIask(CKTcircuit *ckt, GENinstance *inst, int which, IFvalue *value, IFvalue *select) { B4SOIinstance *here = (B4SOIinstance*)inst; @@ -30,7 +31,9 @@ B4SOIinstance *here = (B4SOIinstance*)inst; case B4SOI_W: value->rValue = here->B4SOIw; return(OK); - + case B4SOI_M: + value->rValue = here->B4SOIm; + return(OK); case B4SOI_AS: value->rValue = here->B4SOIsourceArea; return(OK); @@ -172,6 +175,9 @@ B4SOIinstance *here = (B4SOIinstance*)inst; case B4SOI_AGBCP: value->rValue = here->B4SOIagbcp; return(OK); + case B4SOI_AGBCP2: + value->rValue = here->B4SOIagbcp2; + return(OK); /* v4.1 for BC improvement */ case B4SOI_AGBCPD: /* v4.0 */ value->rValue = here->B4SOIagbcpd; return(OK); @@ -269,6 +275,9 @@ B4SOIinstance *here = (B4SOIinstance*)inst; case B4SOI_IGIDL: value->rValue = here->B4SOIigidl; return(OK); + case B4SOI_IGISL: + value->rValue = here->B4SOIigisl; + return(OK); case B4SOI_IGS: value->rValue = here->B4SOIIgs; return(OK); @@ -329,6 +338,17 @@ B4SOIinstance *here = (B4SOIinstance*)inst; case B4SOI_QBD: value->rValue = *(ckt->CKTstate0 + here->B4SOIqbd); return(OK); +#ifdef B4SOI_DEBUG_OUT + case B4SOI_DEBUG1: + value->rValue = here->B4SOIdebug1; + return(OK); + case B4SOI_DEBUG2: + value->rValue = here->B4SOIdebug2; + return(OK); + case B4SOI_DEBUG3: + value->rValue = here->B4SOIdebug3; + return(OK); +#endif default: return(E_BADPARM); } diff --git a/src/spicelib/devices/bsim3soi/b4soicheck.c b/src/spicelib/devices/bsim3soi/b4soicheck.c index 3e09e2b47..ee08c87fe 100644 --- a/src/spicelib/devices/bsim3soi/b4soicheck.c +++ b/src/spicelib/devices/bsim3soi/b4soicheck.c @@ -1,12 +1,14 @@ -/*** B4SOI 11/30/2005 Xuemei (Jane) Xi Release ***/ +/*** B4SOI 03/06/2009 Wenwei Yang Release ***/ /********** - * Copyright 2005 Regents of the University of California. All rights reserved. + * Copyright 2009 Regents of the University of California. All rights reserved. * Authors: 1998 Samuel Fung, Dennis Sinitsky and Stephen Tang * Authors: 1999-2004 Pin Su, Hui Wan, Wei Jin, b3soicheck.c * Authors: 2005- Hui Wan, Xuemei Xi, Ali Niknejad, Chenming Hu. + * Authors: 2009- Wenwei Yang, Chung-Hsun Lin, Ali Niknejad, Chenming Hu. * File: b4soicheck.c * Modified by Hui Wan, Xuemei Xi 11/30/2005 + * Modified by Wenwei Yang, Chung-Hsun Lin, Darsen Lu 03/06/2009 **********/ #include "ngspice.h" @@ -91,7 +93,30 @@ FILE *fplog; printf("Fatal: Tox = %g is not positive.\n", model->B4SOItox); Fatal_Flag = 1; } - + if (model->B4SOIleffeot <= 0.0) + { fprintf(fplog, "Fatal: leffeot = %g is not positive.\n", + model->B4SOIleffeot); + printf("Fatal: Leffeot = %g is not positive.\n", model->B4SOIleffeot); + Fatal_Flag = 1; + } + if (model->B4SOIweffeot <= 0.0) + { fprintf(fplog, "Fatal: weffeot = %g is not positive.\n", + model->B4SOIweffeot); + printf("Fatal: Weffeot = %g is not positive.\n", model->B4SOIweffeot); + Fatal_Flag = 1; + } + if (model->B4SOItoxp <= 0.0) + { fprintf(fplog, "Fatal: Toxp = %g is not positive.\n", + model->B4SOItoxp); + printf("Fatal: Toxp = %g is not positive.\n", model->B4SOItoxp); + Fatal_Flag = 1; + } + if (model->B4SOIepsrgate < 0.0) + { fprintf(fplog, "Fatal: Epsrgate = %g is not positive.\n", + model->B4SOIepsrgate); + printf("Fatal: Epsrgate = %g is not positive.\n", model->B4SOIepsrgate); + Fatal_Flag = 1; + } if (model->B4SOItoxm <= 0.0) { fprintf(fplog, "Fatal: Toxm = %g is not positive.\n", @@ -893,11 +918,35 @@ FILE *fplog; model->B4SOIegidl); printf("Warning: Egidl = %g is negative.\n", model->B4SOIegidl); } + + if (model->B4SOIagisl < 0.0) + { fprintf(fplog, "Warning: AGISL = %g is negative.\n", + model->B4SOIagisl); + printf("Warning: Agidl = %g is negative.\n", model->B4SOIagidl); + } + if (model->B4SOIbgisl < 0.0) + { fprintf(fplog, "Warning: BGISL = %g is negative.\n", + model->B4SOIbgisl); + printf("Warning: Bgisl = %g is negative.\n", model->B4SOIbgisl); + } + if (fabs(model->B4SOIcgisl) < 1e-9) + { fprintf(fplog, "Warning: CGISL = %g is smaller than 1e-9.\n", + model->B4SOIcgisl); + printf("Warning: Cgisl = %g is smaller than 1e-9.\n", + model->B4SOIcgisl); + } + if (model->B4SOIegisl < 0.0) + { fprintf(fplog, "Warning: EGISL = %g is negative.\n", + model->B4SOIegisl); + printf("Warning: Egisl = %g is negative.\n", model->B4SOIegisl); + } + if (model->B4SOIesatii < 0.0) { fprintf(fplog, "Warning: Esatii = %g should be within positive.\n", model->B4SOIesatii); printf("Warning: Esatii = %g should be within (0, 1).\n", model->B4SOIesatii); } + if (pParam->B4SOIxj > model->B4SOItsi) diff --git a/src/spicelib/devices/bsim3soi/b4soicvtest.c b/src/spicelib/devices/bsim3soi/b4soicvtest.c index 11a1cd877..da01f5222 100644 --- a/src/spicelib/devices/bsim3soi/b4soicvtest.c +++ b/src/spicelib/devices/bsim3soi/b4soicvtest.c @@ -1,12 +1,14 @@ -/*** B4SOI 11/30/2005 Xuemei (Jane) Xi Release ***/ +/*** B4SOI 03/06/2009 Wenwei Yang Release ***/ /********** - * Copyright 2005 Regents of the University of California. All rights reserved. + * Copyright 2009 Regents of the University of California. All rights reserved. * Authors: 1998 Samuel Fung, Dennis Sinitsky and Stephen Tang * Authors: 1999-2004 Pin Su, Hui Wan, Wei Jin, b3soicvtest.c * Authors: 2005- Hui Wan, Xuemei Xi, Ali Niknejad, Chenming Hu. + * Authors: 2009- Wenwei Yang, Chung-Hsun Lin, Ali Niknejad, Chenming Hu. * File: b4soicvtest.c * Modified by Hui Wan, Xuemei Xi 11/30/2005 + * Modified by Wenwei Yang, Chung-Hsun Lin, Darsen Lu 03/06/2009 **********/ #include "ngspice.h" @@ -33,10 +35,8 @@ double cbd, cbhat, cbs, cd, cdhat, tol, vgd, vgdo, vgs; for (here = model->B4SOIinstances; here != NULL ; here=here->B4SOInextInstance) { - if (here->B4SOIowner != ARCHme) continue; - vbs = model->B4SOItype * (*(ckt->CKTrhsOld+here->B4SOIbNode) - *(ckt->CKTrhsOld+here->B4SOIsNodePrime)); diff --git a/src/spicelib/devices/bsim3soi/b4soidef.h b/src/spicelib/devices/bsim3soi/b4soidef.h index c252b9c3b..0626f4b55 100644 --- a/src/spicelib/devices/bsim3soi/b4soidef.h +++ b/src/spicelib/devices/bsim3soi/b4soidef.h @@ -1,8 +1,9 @@ /********** -Copyright 2005 Regents of the University of California. All rights reserved. +Copyright 2009 Regents of the University of California. All rights reserved. Author: 1998 Samuel Fung authors:1999-2004 Pin Su, Hui Wan b3soidef.h Authors:2005- Hui Wan, Jane Xi +Authors: 2009- Wenwei Yang, Chung-Hsun Lin, Ali Niknejad, Chenming Hu. File: b4soidef.h **********/ @@ -10,7 +11,10 @@ File: b4soidef.h #define B4SOI #define SOICODE -/* #define BULKCODE */ + +/* Uncomment the following line to activate debugging variable output */ +/* debug1, debug2, debug3, ... */ +/* #define B4SOI_DEBUG_OUT */ #include "ifsim.h" #include "gendefs.h" @@ -115,7 +119,12 @@ typedef struct sB4SOIinstance double B4SOIgdtots; /* v4.0 for rdsmod */ double B4SOIgdtotb; /* v4.0 for rdsmod */ + double B4SOIigp; /* v4.1 for Igb in the AGBCP2 region */ + double B4SOIgigpg; /* v4.1 for Igb in the AGBCP2 region */ + double B4SOIgigpp; /* v4.1 for Igb in the AGBCP2 region */ + double B4SOIigidl; + double B4SOIigisl; double B4SOIitun; double B4SOIibp; double B4SOIabeff; @@ -158,7 +167,14 @@ typedef struct sB4SOIinstance double B4SOIk2ox; double B4SOIeta0; /* end of v4.0 stress effect instance param */ + /*4.1 mobmod=4*/ + double B4SOIvtfbphi1; + double B4SOIvgsteffvth; + + + + double B4SOIicVBS; double B4SOIicVDS; double B4SOIicVGS; @@ -180,6 +196,7 @@ typedef struct sB4SOIinstance double B4SOIpdbcp; double B4SOIpsbcp; double B4SOIagbcp; + double B4SOIagbcp2; /* v4.1 improvement on BC */ double B4SOIagbcpd; /* v4.0 */ double B4SOIaebcp; double B4SOIvbsusr; @@ -242,6 +259,12 @@ typedef struct sB4SOIinstance double B4SOIgmbs; double B4SOIgmT; +#ifdef B4SOI_DEBUG_OUT + double B4SOIdebug1; + double B4SOIdebug2; + double B4SOIdebug3; +#endif + double B4SOIgbbs; double B4SOIgbgs; double B4SOIgbds; @@ -339,6 +362,7 @@ typedef struct sB4SOIinstance unsigned B4SOIlGiven :1; unsigned B4SOIwGiven :1; unsigned B4SOImGiven :1; + unsigned B4SOIdrainAreaGiven :1; unsigned B4SOIsourceAreaGiven :1; unsigned B4SOIdrainSquaresGiven :1; @@ -371,6 +395,7 @@ typedef struct sB4SOIinstance unsigned B4SOIpdbcpGiven :1; unsigned B4SOIpsbcpGiven :1; unsigned B4SOIagbcpGiven :1; + unsigned B4SOIagbcp2Given :1; /* v4.1 improvement on BC */ unsigned B4SOIagbcpdGiven :1; /* v4.0 */ unsigned B4SOIaebcpGiven :1; unsigned B4SOIvbsusrGiven :1; @@ -408,6 +433,9 @@ typedef struct sB4SOIinstance double *B4SOISbPtr; /* v4.0 for rdsMod =1 */ /* v4.0 end */ + double *B4SOIPgPtr; /* v4.1 for Ig_agbcp2 */ + double *B4SOIGpPtr; /* v4.1 for Ig_agbcp2 */ + /* v3.1 added for RF */ double *B4SOIGgmPtr; double *B4SOIGgePtr; @@ -602,7 +630,8 @@ struct b4soiSizeDependParam double B4SOIketa; double B4SOInpeak; double B4SOInsub; - double B4SOIngate; + double B4SOIngate; + double B4SOInsd; double B4SOIgamma1; double B4SOIgamma2; double B4SOIvbx; @@ -638,6 +667,15 @@ struct b4soiSizeDependParam double B4SOIuc1; double B4SOIu0; double B4SOIute; + /*4.1 high k mobility*/ + double B4SOIud; + double B4SOIud1; + double B4SOIeu; + double B4SOIucs; + double B4SOIucste; + + + double B4SOIvoff; double B4SOIvfb; double B4SOIuatemp; @@ -733,6 +771,9 @@ struct b4soiSizeDependParam double B4SOIbetaGB1; double B4SOIalphaGB2; double B4SOIbetaGB2; + double B4SOIaigbcp2; /* 4.1 */ + double B4SOIbigbcp2; /* 4.1 */ + double B4SOIcigbcp2; /* 4.1 */ double B4SOIndif; double B4SOIntrecf; double B4SOIntrecr; @@ -749,6 +790,13 @@ struct b4soiSizeDependParam double B4SOIk1w2; double B4SOIketas; double B4SOIfbjtii; + /*4.1 Iii model*/ + double B4SOIebjtii; + double B4SOIcbjtii; + double B4SOIvbci; + double B4SOIabjtii; + double B4SOImbjtii; + double B4SOIbeta1; double B4SOIbeta2; double B4SOIvdsatii0; @@ -762,6 +810,18 @@ struct b4soiSizeDependParam double B4SOIbgidl; double B4SOIcgidl; /* v4.0 */ double B4SOIegidl; + double B4SOIrgidl; + double B4SOIkgidl; + double B4SOIfgidl; + double B4SOIagisl; + double B4SOIbgisl; + double B4SOIcgisl; /* v4.0 */ + double B4SOIegisl; + double B4SOIrgisl; + double B4SOIkgisl; + double B4SOIfgisl; + + double B4SOIntun; /* v4.0 */ double B4SOIntund; /* v4.0 */ double B4SOIndiode; /* v4.0 */ @@ -866,12 +926,21 @@ struct b4soiSizeDependParam double B4SOIlpeb; /* v4.0 for Vth */ double B4SOIdvtp0; /* v4.0 for Vth */ double B4SOIdvtp1; /* v4.0 for Vth */ + double B4SOIdvtp2; /* v4.1 for Vth */ + double B4SOIdvtp3; /* v4.1 for Vth */ + double B4SOIdvtp4; /* v4.1 for Vth */ double B4SOIminv; /* v4.0 for Vgsteff */ double B4SOImstar; /* v4.0 for Vgsteff */ double B4SOIfprout; /* v4.0 for DITS in Id */ double B4SOIpdits; /* v4.0 for DITS in Id */ double B4SOIpditsd; /* v4.0 for DITS in Id */ + /*4.1*/ + double B4SOImstarcv; + double B4SOIminvcv; + double B4SOIvoffcv; + double B4SOIdvtp2factor; + struct b4soiSizeDependParam *pNext; }; @@ -891,7 +960,32 @@ typedef struct sB4SOImodel int B4SOIshMod; int B4SOIbinUnit; int B4SOIparamChk; - double B4SOIversion; + int B4SOImtrlMod; /*4.1*/ + int B4SOIvgstcvMod; + int B4SOIgidlMod; + int B4SOIiiiMod; + + double B4SOIversion; + + double B4SOIeot; /*4.1*/ + double B4SOIepsrox; + double B4SOIepsrsub; + double B4SOItoxp; + double B4SOIleffeot; + double B4SOIweffeot; + double B4SOIvddeot; + double B4SOItempeot; + double B4SOIados; + double B4SOIbdos; + double B4SOIepsrgate; + double B4SOIni0sub; + double B4SOIbg0sub; + double B4SOItbgasub; + double B4SOItbgbsub; + double B4SOIphig; + double B4SOIeasub; + double B4SOItvbci; + double B4SOItox; double B4SOItoxm; /* v3.2 */ double B4SOIdtoxcv; /* v2.2.3 */ @@ -909,7 +1003,11 @@ typedef struct sB4SOImodel double B4SOIketa; double B4SOInsub; double B4SOInpeak; - double B4SOIngate; + double B4SOIngate; + double B4SOInsd; + double B4SOIlnsd; + double B4SOIwnsd; + double B4SOIpnsd; double B4SOIgamma1; double B4SOIgamma2; double B4SOIvbx; @@ -941,6 +1039,32 @@ typedef struct sB4SOImodel double B4SOIuc1; double B4SOIu0; double B4SOIute; + /*4.1 high k mobility*/ + double B4SOIud; + double B4SOIlud; + double B4SOIwud; + double B4SOIpud; + + double B4SOIud1; + double B4SOIlud1; + double B4SOIwud1; + double B4SOIpud1; + + double B4SOIeu; + double B4SOIleu; + double B4SOIweu; + double B4SOIpeu; + + double B4SOIucs; + double B4SOIlucs; + double B4SOIwucs; + double B4SOIpucs; + + double B4SOIucste; + double B4SOIlucste; + double B4SOIwucste; + double B4SOIpucste; + double B4SOIvoff; double B4SOIdelta; double B4SOIrdsw; @@ -966,6 +1090,7 @@ typedef struct sB4SOImodel double B4SOIalpha0; double B4SOItbox; double B4SOItsi; + double B4SOIetsi; double B4SOIxj; double B4SOIkb1; double B4SOIrth0; @@ -974,6 +1099,16 @@ typedef struct sB4SOImodel double B4SOIagidl; double B4SOIbgidl; double B4SOIcgidl; /* v4.0 */ + double B4SOIrgidl; + double B4SOIkgidl; + double B4SOIfgidl; + double B4SOIegisl; + double B4SOIagisl; + double B4SOIbgisl; + double B4SOIcgisl; + double B4SOIrgisl; + double B4SOIkgisl; + double B4SOIfgisl; double B4SOIndiode; /* v4.0 */ double B4SOIndioded; /* v4.0 */ double B4SOIistun; @@ -1043,9 +1178,21 @@ typedef struct sB4SOImodel int B4SOIrdsMod; /* v4.0 */ /* v4.0 end */ - - /* vfb added */ + /* v4.1 */ + int B4SOIfdMod; double B4SOIvfb; + double B4SOIvsce; + double B4SOIcdsbs; + double B4SOIminvcv; + double B4SOIlminvcv; + double B4SOIwminvcv; + double B4SOIpminvcv; + double B4SOIvoffcv; + double B4SOIlvoffcv; + double B4SOIwvoffcv; + double B4SOIpvoffcv; + + /* added end */ /* v2.2 release */ @@ -1062,6 +1209,9 @@ typedef struct sB4SOImodel double B4SOIalphaGB2; double B4SOIbetaGB2; double B4SOIvgb2; + double B4SOIaigbcp2; /* 4.1 */ + double B4SOIbigbcp2; /* 4.1 */ + double B4SOIcigbcp2; /* 4.1 */ double B4SOItoxqm; double B4SOIvoxh; double B4SOIdeltavox; @@ -1083,6 +1233,13 @@ typedef struct sB4SOImodel double B4SOIsii2; double B4SOIsiid; double B4SOIfbjtii; + /*4.1 Iii model*/ + double B4SOIebjtii; + double B4SOIcbjtii; + double B4SOIvbci; + double B4SOIabjtii; + double B4SOImbjtii; + double B4SOIesatii; double B4SOIntun; /* v4.0 */ double B4SOIntund; /* v4.0 */ @@ -1191,6 +1348,9 @@ typedef struct sB4SOImodel double B4SOIlbetaGB1; double B4SOIlalphaGB2; double B4SOIlbetaGB2; + double B4SOIlaigbcp2; /* 4.1 */ + double B4SOIlbigbcp2; /* 4.1 */ + double B4SOIlcigbcp2; /* 4.1 */ double B4SOIlndif; double B4SOIlntrecf; double B4SOIlntrecr; @@ -1229,6 +1389,7 @@ typedef struct sB4SOImodel double B4SOIlnsub; double B4SOIlngate; double B4SOIlvth0; + double B4SOIlvfb; /* v4.1 */ double B4SOIlk1; double B4SOIlk1w1; double B4SOIlk1w2; @@ -1283,6 +1444,13 @@ typedef struct sB4SOImodel double B4SOIldelta; double B4SOIlalpha0; double B4SOIlfbjtii; + /*4.1 Iii model*/ + double B4SOIlebjtii; + double B4SOIlcbjtii; + double B4SOIlvbci; + double B4SOIlabjtii; + double B4SOIlmbjtii; + double B4SOIlbeta0; double B4SOIlbeta1; double B4SOIlbeta2; @@ -1297,6 +1465,16 @@ typedef struct sB4SOImodel double B4SOIlbgidl; double B4SOIlcgidl; double B4SOIlegidl; + double B4SOIlrgidl; + double B4SOIlkgidl; + double B4SOIlfgidl; + double B4SOIlagisl; + double B4SOIlbgisl; + double B4SOIlcgisl; + double B4SOIlegisl; + double B4SOIlrgisl; + double B4SOIlkgisl; + double B4SOIlfgisl; double B4SOIlntun; /* v4.0 */ double B4SOIlntund; /* v4.0 */ double B4SOIlndiode; /* v4.0 */ @@ -1344,6 +1522,9 @@ typedef struct sB4SOImodel double B4SOIwbetaGB1; double B4SOIwalphaGB2; double B4SOIwbetaGB2; + double B4SOIwaigbcp2; /* 4.1 */ + double B4SOIwbigbcp2; /* 4.1 */ + double B4SOIwcigbcp2; /* 4.1 */ double B4SOIwndif; double B4SOIwntrecf; double B4SOIwntrecr; @@ -1382,6 +1563,7 @@ typedef struct sB4SOImodel double B4SOIwnsub; double B4SOIwngate; double B4SOIwvth0; + double B4SOIwvfb; /* v4.1 */ double B4SOIwk1; double B4SOIwk1w1; double B4SOIwk1w2; @@ -1436,6 +1618,13 @@ typedef struct sB4SOImodel double B4SOIwdelta; double B4SOIwalpha0; double B4SOIwfbjtii; + /*4.1 Iii model*/ + double B4SOIwebjtii; + double B4SOIwcbjtii; + double B4SOIwvbci; + double B4SOIwabjtii; + double B4SOIwmbjtii; + double B4SOIwbeta0; double B4SOIwbeta1; double B4SOIwbeta2; @@ -1450,6 +1639,16 @@ typedef struct sB4SOImodel double B4SOIwbgidl; double B4SOIwcgidl; double B4SOIwegidl; + double B4SOIwrgidl; + double B4SOIwkgidl; + double B4SOIwfgidl; + double B4SOIwagisl; + double B4SOIwbgisl; + double B4SOIwcgisl; + double B4SOIwegisl; + double B4SOIwrgisl; + double B4SOIwkgisl; + double B4SOIwfgisl; double B4SOIwntun; /* v4.0 */ double B4SOIwntund; /* v4.0 */ double B4SOIwndiode; /* v4.0 */ @@ -1497,6 +1696,9 @@ typedef struct sB4SOImodel double B4SOIpbetaGB1; double B4SOIpalphaGB2; double B4SOIpbetaGB2; + double B4SOIpaigbcp2; /* 4.1 */ + double B4SOIpbigbcp2; /* 4.1 */ + double B4SOIpcigbcp2; /* 4.1 */ double B4SOIpndif; double B4SOIpntrecf; double B4SOIpntrecr; @@ -1535,6 +1737,7 @@ typedef struct sB4SOImodel double B4SOIpnsub; double B4SOIpngate; double B4SOIpvth0; + double B4SOIpvfb; /* v4.1 */ double B4SOIpk1; double B4SOIpk1w1; double B4SOIpk1w2; @@ -1589,6 +1792,13 @@ typedef struct sB4SOImodel double B4SOIpdelta; double B4SOIpalpha0; double B4SOIpfbjtii; + /*4.1 Iii model*/ + double B4SOIpebjtii; + double B4SOIpcbjtii; + double B4SOIpvbci; + double B4SOIpabjtii; + double B4SOIpmbjtii; + double B4SOIpbeta0; double B4SOIpbeta1; double B4SOIpbeta2; @@ -1603,6 +1813,16 @@ typedef struct sB4SOImodel double B4SOIpbgidl; double B4SOIpcgidl; double B4SOIpegidl; + double B4SOIprgidl; + double B4SOIpkgidl; + double B4SOIpfgidl; + double B4SOIpagisl; + double B4SOIpbgisl; + double B4SOIpcgisl; + double B4SOIpegisl; + double B4SOIprgisl; + double B4SOIpkgisl; + double B4SOIpfgisl; double B4SOIpntun; /* v4.0 */ double B4SOIpntund; /* v4.0 */ double B4SOIpndiode; /* v4.0 */ @@ -1651,6 +1871,7 @@ typedef struct sB4SOImodel double B4SOInfb; double B4SOIadice; double B4SOIeg0; + /* v4.0 added for stress effect */ double B4SOIsaref; @@ -1708,6 +1929,18 @@ typedef struct sB4SOImodel double B4SOIldvtp1; /* v4.0 for Vth */ double B4SOIwdvtp1; /* v4.0 for Vth */ double B4SOIpdvtp1; /* v4.0 for Vth */ + double B4SOIdvtp2; /* v4.1 for Vth */ + double B4SOIldvtp2; /* v4.1 for Vth */ + double B4SOIwdvtp2; /* v4.1 for Vth */ + double B4SOIpdvtp2; /* v4.1 for Vth */ + double B4SOIdvtp3; /* v4.1 for Vth */ + double B4SOIldvtp3; /* v4.1 for Vth */ + double B4SOIwdvtp3; /* v4.1 for Vth */ + double B4SOIpdvtp3; /* v4.1 for Vth */ + double B4SOIdvtp4; /* v4.1 for Vth */ + double B4SOIldvtp4; /* v4.1 for Vth */ + double B4SOIwdvtp4; /* v4.1 for Vth */ + double B4SOIpdvtp4; /* v4.1 for Vth */ double B4SOIminv; /* v4.0 for Vgsteff */ double B4SOIlminv; /* v4.0 for Vgsteff */ double B4SOIwminv; /* v4.0 for Vgsteff */ @@ -1746,7 +1979,19 @@ typedef struct sB4SOImodel struct b4soiSizeDependParam *pSizeDependParamKnot; /* Flags */ - + unsigned B4SOIepsrgateGiven:1; + unsigned B4SOIadosGiven :1; + unsigned B4SOIbdosGiven :1; + unsigned B4SOIleffeotGiven :1; + unsigned B4SOIweffeotGiven :1; + unsigned B4SOIvddeotGiven :1; + unsigned B4SOItempeotGiven :1; + + unsigned B4SOItoxpGiven :1; + unsigned B4SOImtrlModGiven :1; /*4.1*/ + unsigned B4SOIvgstcvModGiven :1; + unsigned B4SOIgidlModGiven :1; + unsigned B4SOIiiiModGiven :1; unsigned B4SOIrdsModGiven :1; /* v4.0 */ unsigned B4SOIrbodyModGiven :1; /* v4.0 */ unsigned B4SOIrgateModGiven :1; /* v3.1 */ @@ -1764,10 +2009,11 @@ typedef struct sB4SOImodel unsigned B4SOIdvbd0Given: 1; unsigned B4SOIdvbd1Given: 1; unsigned B4SOImoinFDGiven: 1; - + unsigned B4SOItboxGiven:1; unsigned B4SOItsiGiven :1; + unsigned B4SOIetsiGiven :1; unsigned B4SOIxjGiven :1; unsigned B4SOIkb1Given :1; unsigned B4SOIrth0Given :1; @@ -1776,6 +2022,16 @@ typedef struct sB4SOImodel unsigned B4SOIagidlGiven :1; unsigned B4SOIbgidlGiven :1; unsigned B4SOIcgidlGiven :1; + unsigned B4SOIrgidlGiven :1; + unsigned B4SOIkgidlGiven :1; + unsigned B4SOIfgidlGiven :1; + unsigned B4SOIegislGiven :1; + unsigned B4SOIagislGiven :1; + unsigned B4SOIbgislGiven :1; + unsigned B4SOIcgislGiven :1; + unsigned B4SOIrgislGiven :1; + unsigned B4SOIkgislGiven :1; + unsigned B4SOIfgislGiven :1; unsigned B4SOIndiodeGiven :1; /* v4.0 */ unsigned B4SOIndiodedGiven :1; /* v4.0 */ unsigned B4SOIxbjtGiven :1; @@ -1818,6 +2074,7 @@ typedef struct sB4SOImodel unsigned B4SOInsubGiven :1; unsigned B4SOInpeakGiven :1; unsigned B4SOIngateGiven :1; + unsigned B4SOInsdGiven :1; unsigned B4SOIgamma1Given :1; unsigned B4SOIgamma2Given :1; unsigned B4SOIvbxGiven :1; @@ -1849,6 +2106,32 @@ typedef struct sB4SOImodel unsigned B4SOIuc1Given :1; unsigned B4SOIu0Given :1; unsigned B4SOIuteGiven :1; + /*4.1 mobmod=4*/ + unsigned B4SOIudGiven :1; + unsigned B4SOIludGiven :1; + unsigned B4SOIwudGiven :1; + unsigned B4SOIpudGiven :1; + + unsigned B4SOIud1Given :1; + unsigned B4SOIlud1Given :1; + unsigned B4SOIwud1Given :1; + unsigned B4SOIpud1Given :1; + + unsigned B4SOIeuGiven :1; + unsigned B4SOIleuGiven :1; + unsigned B4SOIweuGiven :1; + unsigned B4SOIpeuGiven :1; + + unsigned B4SOIucsGiven :1; + unsigned B4SOIlucsGiven :1; + unsigned B4SOIwucsGiven :1; + unsigned B4SOIpucsGiven :1; + + unsigned B4SOIucsteGiven :1; + unsigned B4SOIlucsteGiven:1; + unsigned B4SOIwucsteGiven:1; + unsigned B4SOIpucsteGiven:1; + unsigned B4SOIvoffGiven :1; unsigned B4SOIrdswGiven :1; unsigned B4SOIrdwGiven :1; /* v4.0 for rdsMod = 1 */ @@ -1872,7 +2155,18 @@ typedef struct sB4SOImodel unsigned B4SOIb0Given :1; unsigned B4SOIb1Given :1; unsigned B4SOIalpha0Given :1; - + + + /*4.1*/ + unsigned B4SOIepsroxGiven :1; + unsigned B4SOIeotGiven :1; + unsigned B4SOIepsrsubGiven :1; + unsigned B4SOIni0subGiven :1; + unsigned B4SOIbg0subGiven :1; + unsigned B4SOItbgasubGiven:1; + unsigned B4SOItbgbsubGiven:1; + unsigned B4SOIphigGiven :1; + unsigned B4SOIeasubGiven :1; /* v3.1 added for RF */ unsigned B4SOIxrcrg1Given :1; @@ -1899,8 +2193,18 @@ typedef struct sB4SOImodel unsigned B4SOIrbdbGiven :1; unsigned B4SOIrbsbGiven :1; /* v4.0 end */ - - + /* v4.1 */ + unsigned B4SOIfdModGiven :1; + unsigned B4SOIvsceGiven :1; + unsigned B4SOIcdsbsGiven :1; + unsigned B4SOIminvcvGiven :1; + unsigned B4SOIlminvcvGiven :1; + unsigned B4SOIwminvcvGiven :1; + unsigned B4SOIpminvcvGiven :1; + unsigned B4SOIvoffcvGiven :1; + unsigned B4SOIlvoffcvGiven :1; + unsigned B4SOIwvoffcvGiven :1; + unsigned B4SOIpvoffcvGiven :1; /* v2.2 release */ unsigned B4SOIwth0Given :1; unsigned B4SOIrhaloGiven :1; @@ -1915,6 +2219,9 @@ typedef struct sB4SOImodel unsigned B4SOIalphaGB2Given :1; unsigned B4SOIbetaGB2Given :1; unsigned B4SOIvgb2Given :1; + unsigned B4SOIaigbcp2Given :1; /* 4.1 */ + unsigned B4SOIbigbcp2Given :1; /* 4.1 */ + unsigned B4SOIcigbcp2Given :1; /* 4.1 */ unsigned B4SOItoxqmGiven :1; unsigned B4SOIigbModGiven :1; /* v3.0 */ unsigned B4SOIvoxhGiven :1; @@ -1943,12 +2250,20 @@ typedef struct sB4SOImodel unsigned B4SOIbeta2Given :1; unsigned B4SOIvdsatii0Given :1; unsigned B4SOItiiGiven :1; + unsigned B4SOItvbciGiven :1; unsigned B4SOIliiGiven :1; unsigned B4SOIsii0Given :1; unsigned B4SOIsii1Given :1; unsigned B4SOIsii2Given :1; unsigned B4SOIsiidGiven :1; unsigned B4SOIfbjtiiGiven :1; + /*4.1 Iii model*/ + unsigned B4SOIebjtiiGiven :1; + unsigned B4SOIcbjtiiGiven :1; + unsigned B4SOIvbciGiven :1; + unsigned B4SOIabjtiiGiven :1; + unsigned B4SOImbjtiiGiven :1; + unsigned B4SOIesatiiGiven :1; unsigned B4SOIntunGiven :1; /* v4.0 */ unsigned B4SOIntundGiven :1; /* v4.0 */ @@ -2012,6 +2327,9 @@ typedef struct sB4SOImodel unsigned B4SOIlbetaGB1Given :1; unsigned B4SOIlalphaGB2Given :1; unsigned B4SOIlbetaGB2Given :1; + unsigned B4SOIlaigbcp2Given :1; /* 4.1 */ + unsigned B4SOIlbigbcp2Given :1; /* 4.1 */ + unsigned B4SOIlcigbcp2Given :1; /* 4.1 */ unsigned B4SOIlndifGiven :1; unsigned B4SOIlntrecfGiven :1; unsigned B4SOIlntrecrGiven :1; @@ -2048,8 +2366,10 @@ typedef struct sB4SOImodel unsigned B4SOIlnpeakGiven :1; unsigned B4SOIlnsubGiven :1; - unsigned B4SOIlngateGiven :1; + unsigned B4SOIlngateGiven :1; + unsigned B4SOIlnsdGiven :1; unsigned B4SOIlvth0Given :1; + unsigned B4SOIlvfbGiven :1; /* v4.1 */ unsigned B4SOIlk1Given :1; unsigned B4SOIlk1w1Given :1; unsigned B4SOIlk1w2Given :1; @@ -2104,6 +2424,13 @@ typedef struct sB4SOImodel unsigned B4SOIldeltaGiven :1; unsigned B4SOIlalpha0Given :1; unsigned B4SOIlfbjtiiGiven :1; + /*4.1 Iii model*/ + unsigned B4SOIlebjtiiGiven :1; + unsigned B4SOIlcbjtiiGiven :1; + unsigned B4SOIlvbciGiven :1; + unsigned B4SOIlabjtiiGiven :1; + unsigned B4SOIlmbjtiiGiven :1; + unsigned B4SOIlbeta0Given :1; unsigned B4SOIlbeta1Given :1; unsigned B4SOIlbeta2Given :1; @@ -2118,6 +2445,16 @@ typedef struct sB4SOImodel unsigned B4SOIlbgidlGiven :1; unsigned B4SOIlcgidlGiven :1; unsigned B4SOIlegidlGiven :1; + unsigned B4SOIlrgidlGiven :1; + unsigned B4SOIlkgidlGiven :1; + unsigned B4SOIlfgidlGiven :1; + unsigned B4SOIlagislGiven :1; + unsigned B4SOIlbgislGiven :1; + unsigned B4SOIlcgislGiven :1; + unsigned B4SOIlegislGiven :1; + unsigned B4SOIlrgislGiven :1; + unsigned B4SOIlkgislGiven :1; + unsigned B4SOIlfgislGiven :1; unsigned B4SOIlntunGiven :1; /* v4.0 */ unsigned B4SOIlntundGiven :1; /* v4.0 */ unsigned B4SOIlndiodeGiven :1; /* v4.0 */ @@ -2164,6 +2501,9 @@ typedef struct sB4SOImodel unsigned B4SOIwbetaGB1Given :1; unsigned B4SOIwalphaGB2Given :1; unsigned B4SOIwbetaGB2Given :1; + unsigned B4SOIwaigbcp2Given :1; /* 4.1 */ + unsigned B4SOIwbigbcp2Given :1; /* 4.1 */ + unsigned B4SOIwcigbcp2Given :1; /* 4.1 */ unsigned B4SOIwndifGiven :1; unsigned B4SOIwntrecfGiven :1; unsigned B4SOIwntrecrGiven :1; @@ -2200,8 +2540,10 @@ typedef struct sB4SOImodel unsigned B4SOIwnpeakGiven :1; unsigned B4SOIwnsubGiven :1; - unsigned B4SOIwngateGiven :1; + unsigned B4SOIwngateGiven :1; + unsigned B4SOIwnsdGiven :1; unsigned B4SOIwvth0Given :1; + unsigned B4SOIwvfbGiven :1; /* v4.1 */ unsigned B4SOIwk1Given :1; unsigned B4SOIwk1w1Given :1; unsigned B4SOIwk1w2Given :1; @@ -2256,6 +2598,13 @@ typedef struct sB4SOImodel unsigned B4SOIwdeltaGiven :1; unsigned B4SOIwalpha0Given :1; unsigned B4SOIwfbjtiiGiven :1; + /*4.1 Iii model*/ + unsigned B4SOIwebjtiiGiven :1; + unsigned B4SOIwcbjtiiGiven :1; + unsigned B4SOIwvbciGiven :1; + unsigned B4SOIwabjtiiGiven :1; + unsigned B4SOIwmbjtiiGiven :1; + unsigned B4SOIwbeta0Given :1; unsigned B4SOIwbeta1Given :1; unsigned B4SOIwbeta2Given :1; @@ -2270,6 +2619,16 @@ typedef struct sB4SOImodel unsigned B4SOIwbgidlGiven :1; unsigned B4SOIwcgidlGiven :1; unsigned B4SOIwegidlGiven :1; + unsigned B4SOIwrgidlGiven :1; + unsigned B4SOIwkgidlGiven :1; + unsigned B4SOIwfgidlGiven :1; + unsigned B4SOIwagislGiven :1; + unsigned B4SOIwbgislGiven :1; + unsigned B4SOIwcgislGiven :1; + unsigned B4SOIwegislGiven :1; + unsigned B4SOIwrgislGiven :1; + unsigned B4SOIwkgislGiven :1; + unsigned B4SOIwfgislGiven :1; unsigned B4SOIwntunGiven :1; /* v4.0 */ unsigned B4SOIwntundGiven :1; /* v4.0 */ unsigned B4SOIwndiodeGiven :1; /* v4.0 */ @@ -2316,6 +2675,9 @@ typedef struct sB4SOImodel unsigned B4SOIpbetaGB1Given :1; unsigned B4SOIpalphaGB2Given :1; unsigned B4SOIpbetaGB2Given :1; + unsigned B4SOIpaigbcp2Given :1; /* 4.1 */ + unsigned B4SOIpbigbcp2Given :1; /* 4.1 */ + unsigned B4SOIpcigbcp2Given :1; /* 4.1 */ unsigned B4SOIpndifGiven :1; unsigned B4SOIpntrecfGiven :1; unsigned B4SOIpntrecrGiven :1; @@ -2352,8 +2714,10 @@ typedef struct sB4SOImodel unsigned B4SOIpnpeakGiven :1; unsigned B4SOIpnsubGiven :1; - unsigned B4SOIpngateGiven :1; + unsigned B4SOIpngateGiven :1; + unsigned B4SOIpnsdGiven :1; unsigned B4SOIpvth0Given :1; + unsigned B4SOIpvfbGiven :1; /* v4.1 */ unsigned B4SOIpk1Given :1; unsigned B4SOIpk1w1Given :1; unsigned B4SOIpk1w2Given :1; @@ -2408,6 +2772,13 @@ typedef struct sB4SOImodel unsigned B4SOIpdeltaGiven :1; unsigned B4SOIpalpha0Given :1; unsigned B4SOIpfbjtiiGiven :1; + /*4.1 Iii model*/ + unsigned B4SOIpebjtiiGiven :1; + unsigned B4SOIpcbjtiiGiven :1; + unsigned B4SOIpvbciGiven :1; + unsigned B4SOIpabjtiiGiven :1; + unsigned B4SOIpmbjtiiGiven :1; + unsigned B4SOIpbeta0Given :1; unsigned B4SOIpbeta1Given :1; unsigned B4SOIpbeta2Given :1; @@ -2422,6 +2793,16 @@ typedef struct sB4SOImodel unsigned B4SOIpbgidlGiven :1; unsigned B4SOIpcgidlGiven :1; unsigned B4SOIpegidlGiven :1; + unsigned B4SOIprgidlGiven :1; + unsigned B4SOIpkgidlGiven :1; + unsigned B4SOIpfgidlGiven :1; + unsigned B4SOIpagislGiven :1; + unsigned B4SOIpbgislGiven :1; + unsigned B4SOIpcgislGiven :1; + unsigned B4SOIpegislGiven :1; + unsigned B4SOIprgislGiven :1; + unsigned B4SOIpkgislGiven :1; + unsigned B4SOIpfgislGiven :1; unsigned B4SOIpntunGiven :1; /* v4.0 */ unsigned B4SOIpntundGiven :1; /* v4.0 */ unsigned B4SOIpndiodeGiven :1; /* v4.0 */ @@ -2551,6 +2932,18 @@ typedef struct sB4SOImodel unsigned B4SOIldvtp1Given :1; /* v4.0 for vth */ unsigned B4SOIwdvtp1Given :1; /* v4.0 for vth */ unsigned B4SOIpdvtp1Given :1; /* v4.0 for vth */ + unsigned B4SOIdvtp2Given :1; /* v4.1 for vth */ + unsigned B4SOIldvtp2Given :1; /* v4.1 for vth */ + unsigned B4SOIwdvtp2Given :1; /* v4.1 for vth */ + unsigned B4SOIpdvtp2Given :1; /* v4.1 for vth */ + unsigned B4SOIdvtp3Given :1; /* v4.1 for vth */ + unsigned B4SOIldvtp3Given :1; /* v4.1 for vth */ + unsigned B4SOIwdvtp3Given :1; /* v4.1 for vth */ + unsigned B4SOIpdvtp3Given :1; /* v4.1 for vth */ + unsigned B4SOIdvtp4Given :1; /* v4.1 for vth */ + unsigned B4SOIldvtp4Given :1; /* v4.1 for vth */ + unsigned B4SOIwdvtp4Given :1; /* v4.1 for vth */ + unsigned B4SOIpdvtp4Given :1; /* v4.1 for vth */ unsigned B4SOIminvGiven :1; /* v4.0 for Vgsteff */ unsigned B4SOIlminvGiven :1; /* v4.0 for Vgsteff */ unsigned B4SOIwminvGiven :1; /* v4.0 for Vgsteff */ @@ -2581,7 +2974,7 @@ typedef struct sB4SOImodel /* device parameters */ #define B4SOI_W 1 #define B4SOI_L 2 -#define B4SOI_M 46 +#define B4SOI_M 47 #define B4SOI_AS 3 #define B4SOI_AD 4 #define B4SOI_PS 5 @@ -2625,9 +3018,48 @@ typedef struct sB4SOImodel #define B4SOI_SD 43 /* v4.0 */ #define B4SOI_DELVTO 44 /* v4.0 */ #define B4SOI_AGBCPD 45 /* v4.0 */ +#define B4SOI_AGBCP2 46 /* v4.1 improvement on BC */ /* model parameters */ + + +#define B4SOI_MOD_PFGIDL 65 +#define B4SOI_MOD_WFGIDL 66 +#define B4SOI_MOD_LFGIDL 67 +#define B4SOI_MOD_FGIDL 68 +#define B4SOI_MOD_PKGIDL 69 +#define B4SOI_MOD_WKGIDL 70 +#define B4SOI_MOD_LKGIDL 71 +#define B4SOI_MOD_KGIDL 72 +#define B4SOI_MOD_PRGIDL 73 +#define B4SOI_MOD_WRGIDL 74 +#define B4SOI_MOD_LRGIDL 75 +#define B4SOI_MOD_RGIDL 76 +#define B4SOI_MOD_GIDLMOD 77 +#define B4SOI_MOD_PNSD 78 +#define B4SOI_MOD_WNSD 79 +#define B4SOI_MOD_LNSD 80 +#define B4SOI_MOD_NSD 81 +#define B4SOI_MOD_PHIG 82 +#define B4SOI_MOD_EASUB 83 +#define B4SOI_MOD_TBGBSUB 84 +#define B4SOI_MOD_TBGASUB 85 +#define B4SOI_MOD_BG0SUB 86 +#define B4SOI_MOD_NI0SUB 87 +#define B4SOI_MOD_EPSRGATE 88 +#define B4SOI_MOD_ADOS 89 +#define B4SOI_MOD_BDOS 90 +#define B4SOI_MOD_LEFFEOT 91 +#define B4SOI_MOD_WEFFEOT 92 +#define B4SOI_MOD_VDDEOT 93 +#define B4SOI_MOD_TEMPEOT 94 +#define B4SOI_MOD_TOXP 95 +#define B4SOI_MOD_ETSI 96 +#define B4SOI_MOD_EOT 97 +#define B4SOI_MOD_EPSROX 98 +#define B4SOI_MOD_EPSRSUB 99 +#define B4SOI_MOD_MTRLMOD 100 /*4.1*/ #define B4SOI_MOD_CAPMOD 101 #define B4SOI_MOD_NQSMOD 102 #define B4SOI_MOD_MOBMOD 103 @@ -3024,6 +3456,7 @@ typedef struct sB4SOImodel /* v3.1 added for RF end */ /* Cross-term dependence */ + #define B4SOI_MOD_PNPEAK 501 #define B4SOI_MOD_PNSUB 502 #define B4SOI_MOD_PNGATE 503 @@ -3210,6 +3643,31 @@ typedef struct sB4SOImodel #define B4SOI_MOD_LAHLID 684 /* v4.0 */ #define B4SOI_MOD_WAHLID 685 /* v4.0 */ #define B4SOI_MOD_PAHLID 686 /* v4.0 */ +#define B4SOI_MOD_DVTP2 687 /* v4.1 for Vth */ +#define B4SOI_MOD_LDVTP2 688 /* v4.1 for Vth */ +#define B4SOI_MOD_WDVTP2 689 /* v4.1 for Vth */ +#define B4SOI_MOD_PDVTP2 690 /* v4.1 for Vth */ +#define B4SOI_MOD_DVTP3 691 /* v4.1 for Vth */ +#define B4SOI_MOD_LDVTP3 692 /* v4.1 for Vth */ +#define B4SOI_MOD_WDVTP3 693 /* v4.1 for Vth */ +#define B4SOI_MOD_PDVTP3 694 /* v4.1 for Vth */ +#define B4SOI_MOD_DVTP4 695 /* v4.1 for Vth */ +#define B4SOI_MOD_LDVTP4 696 /* v4.1 for Vth */ +#define B4SOI_MOD_WDVTP4 697 /* v4.1 for Vth */ +#define B4SOI_MOD_PDVTP4 698 /* v4.1 for Vth */ +#define B4SOI_MOD_AIGBCP2 10001 /* v4.1 for Ig in AGBCP2 Region */ +#define B4SOI_MOD_LAIGBCP2 10002 /* v4.1 for Ig in AGBCP2 Region */ +#define B4SOI_MOD_WAIGBCP2 10003 /* v4.1 for Ig in AGBCP2 Region */ +#define B4SOI_MOD_PAIGBCP2 10004 /* v4.1 for Ig in AGBCP2 Region */ +#define B4SOI_MOD_BIGBCP2 10005 /* v4.1 for Ig in AGBCP2 Region */ +#define B4SOI_MOD_LBIGBCP2 10006 /* v4.1 for Ig in AGBCP2 Region */ +#define B4SOI_MOD_WBIGBCP2 10007 /* v4.1 for Ig in AGBCP2 Region */ +#define B4SOI_MOD_PBIGBCP2 10008 /* v4.1 for Ig in AGBCP2 Region */ +#define B4SOI_MOD_CIGBCP2 10009 /* v4.1 for Ig in AGBCP2 Region */ +#define B4SOI_MOD_LCIGBCP2 10010 /* v4.1 for Ig in AGBCP2 Region */ +#define B4SOI_MOD_WCIGBCP2 10011 /* v4.1 for Ig in AGBCP2 Region */ +#define B4SOI_MOD_PCIGBCP2 10012 /* v4.1 for Ig in AGBCP2 Region */ + /* Added for binning - END3 */ @@ -3339,6 +3797,12 @@ typedef struct sB4SOImodel #define B4SOI_GMID 946 #define B4SOI_QS 955 +/* For debugging only */ +#define B4SOI_DEBUG1 956 +#define B4SOI_DEBUG2 957 +#define B4SOI_DEBUG3 958 +/* End debugging */ + /* v3.1 added for RF */ #define B4SOI_GNODEEXT 947 #define B4SOI_GNODEMID 948 @@ -3348,6 +3812,92 @@ typedef struct sB4SOImodel #define B4SOI_DBNODE 949 #define B4SOI_SBNODE 950 /* v4.0 end */ + +/*4.1 mobmod=4*/ +/*#define B4SOI_VGSTEFFVTH 3300*/ +/*#define B4SOI_VTFBPHI1 3301*/ +/*#define B4SOI_EG 3350*/ + +#define B4SOI_MOD_UD 3400 +#define B4SOI_MOD_LUD 3401 +#define B4SOI_MOD_WUD 3402 +#define B4SOI_MOD_PUD 3403 +#define B4SOI_MOD_UD1 3404 +#define B4SOI_MOD_LUD1 3405 +#define B4SOI_MOD_WUD1 3406 +#define B4SOI_MOD_PUD1 3407 +#define B4SOI_MOD_EU 3500 +#define B4SOI_MOD_LEU 3501 +#define B4SOI_MOD_WEU 3502 +#define B4SOI_MOD_PEU 3503 +#define B4SOI_MOD_UCS 3504 +#define B4SOI_MOD_LUCS 3505 +#define B4SOI_MOD_WUCS 3506 +#define B4SOI_MOD_PUCS 3507 +#define B4SOI_MOD_UCSTE 3508 +#define B4SOI_MOD_LUCSTE 3509 +#define B4SOI_MOD_WUCSTE 3510 +#define B4SOI_MOD_PUCSTE 3511 + + + + +/*4.1 Iii model*/ +#define B4SOI_MOD_IIIMOD 4000 +#define B4SOI_MOD_TVBCI 4001 +#define B4SOI_MOD_EBJTII 4002 +#define B4SOI_MOD_CBJTII 4003 +#define B4SOI_MOD_VBCI 4004 +#define B4SOI_MOD_ABJTII 4005 +#define B4SOI_MOD_MBJTII 4006 +#define B4SOI_MOD_LEBJTII 4007 +#define B4SOI_MOD_LCBJTII 4008 +#define B4SOI_MOD_LVBCI 4009 +#define B4SOI_MOD_LABJTII 4010 +#define B4SOI_MOD_LMBJTII 4011 +#define B4SOI_MOD_WEBJTII 4012 +#define B4SOI_MOD_WCBJTII 4013 +#define B4SOI_MOD_WVBCI 4014 +#define B4SOI_MOD_WABJTII 4015 +#define B4SOI_MOD_WMBJTII 4016 +#define B4SOI_MOD_PEBJTII 4017 +#define B4SOI_MOD_PCBJTII 4018 +#define B4SOI_MOD_PVBCI 4019 +#define B4SOI_MOD_PABJTII 4020 +#define B4SOI_MOD_PMBJTII 4021 + + +#define B4SOI_MOD_EGISL 2500 +#define B4SOI_MOD_AGISL 2501 +#define B4SOI_MOD_BGISL 2502 +#define B4SOI_MOD_CGISL 2503 +#define B4SOI_MOD_RGISL 2504 +#define B4SOI_MOD_KGISL 2505 +#define B4SOI_MOD_FGISL 2506 +#define B4SOI_MOD_LEGISL 2507 +#define B4SOI_MOD_WEGISL 2508 +#define B4SOI_MOD_PEGISL 2509 +#define B4SOI_MOD_LAGISL 2510 +#define B4SOI_MOD_WAGISL 2511 +#define B4SOI_MOD_PAGISL 2512 +#define B4SOI_MOD_LBGISL 2513 +#define B4SOI_MOD_WBGISL 2514 +#define B4SOI_MOD_PBGISL 2515 +#define B4SOI_MOD_LCGISL 2516 +#define B4SOI_MOD_WCGISL 2517 +#define B4SOI_MOD_PCGISL 2518 +#define B4SOI_MOD_LRGISL 2519 +#define B4SOI_MOD_WRGISL 2520 +#define B4SOI_MOD_PRGISL 2521 +#define B4SOI_MOD_LKGISL 2522 +#define B4SOI_MOD_WKGISL 2523 +#define B4SOI_MOD_PKGISL 2524 +#define B4SOI_MOD_LFGISL 2525 +#define B4SOI_MOD_WFGISL 2526 +#define B4SOI_MOD_PFGISL 2527 + +#define B4SOI_IGISL 3001 + #define B4SOI_IBS 3002 #define B4SOI_IBD 3003 #define B4SOI_ISUB 3004 @@ -3404,8 +3954,25 @@ typedef struct sB4SOImodel #define B4SOI_MOD_MJSWGD 989 /* v4.0 */ #define B4SOI_MOD_CJSWGD 990 /* v4.0 */ #define B4SOI_MOD_PBSWGD 991 /* v4.0 */ +/*4.1*/ +#define B4SOI_MOD_VFB 1201 /* v4.1 */ +#define B4SOI_MOD_LVFB 1202 /* v4.1 */ +#define B4SOI_MOD_WVFB 1203 /* v4.1 */ +#define B4SOI_MOD_PVFB 1204 /* v4.1 */ +#define B4SOI_MOD_FDMOD 1221 +#define B4SOI_MOD_VSCE 1222 +#define B4SOI_MOD_CDSBS 1223 +#define B4SOI_MOD_VGSTCVMOD 1224 +#define B4SOI_MOD_MINVCV 1225 +#define B4SOI_MOD_LMINVCV 1226 +#define B4SOI_MOD_WMINVCV 1227 +#define B4SOI_MOD_PMINVCV 1228 +#define B4SOI_MOD_VOFFCV 1229 +#define B4SOI_MOD_LVOFFCV 1230 +#define B4SOI_MOD_WVOFFCV 1231 +#define B4SOI_MOD_PVOFFCV 1232 /* v3.0 */ #define B4SOI_MOD_SOIMOD 1001 #define B4SOI_MOD_VBSA 1002 diff --git a/src/spicelib/devices/bsim3soi/b4soidel.c b/src/spicelib/devices/bsim3soi/b4soidel.c index 961f76a69..3aada4228 100644 --- a/src/spicelib/devices/bsim3soi/b4soidel.c +++ b/src/spicelib/devices/bsim3soi/b4soidel.c @@ -1,12 +1,14 @@ -/*** B4SOI 11/30/2005 Xuemei (Jane) Xi Release ***/ +/*** B4SOI 03/06/2009 Wenwei Yang Release ***/ /********** - * Copyright 2005 Regents of the University of California. All rights reserved. + * Copyright 2009 Regents of the University of California. All rights reserved. * Authors: 1998 Samuel Fung, Dennis Sinitsky and Stephen Tang * Authors: 1999-2004 Pin Su, Hui Wan, Wei Jin, b3soidel.c * Authors: 2005- Hui Wan, Xuemei Xi, Ali Niknejad, Chenming Hu. + * Authors: 2009- Wenwei Yang, Chung-Hsun Lin, Ali Niknejad, Chenming Hu. * File: b4soidel.c * Modified by Hui Wan, Xuemei Xi 11/30/2005 + * Modified by Wenwei Yang, Chung-Hsun Lin, Darsen Lu 03/06/2009 **********/ #include "ngspice.h" diff --git a/src/spicelib/devices/bsim3soi/b4soidest.c b/src/spicelib/devices/bsim3soi/b4soidest.c index 5769afaa2..71608622e 100644 --- a/src/spicelib/devices/bsim3soi/b4soidest.c +++ b/src/spicelib/devices/bsim3soi/b4soidest.c @@ -1,12 +1,14 @@ -/*** B4SOI 11/30/2005 Xuemei (Jane) Xi Release ***/ +/*** B4SOI 03/06/2009 Wenwei Yang Release ***/ /********** - * Copyright 2005 Regents of the University of California. All rights reserved. + * Copyright 2009 Regents of the University of California. All rights reserved. * Authors: 1998 Samuel Fung, Dennis Sinitsky and Stephen Tang * Authors: 1999-2004 Pin Su, Hui Wan, Wei Jin, b3soidest.c * Authors: 2005- Hui Wan, Xuemei Xi, Ali Niknejad, Chenming Hu. + * Authors: 2009- Wenwei Yang, Chung-Hsun Lin, Ali Niknejad, Chenming Hu. * File: b4soidest.c * Modified by Hui Wan, Xuemei Xi 11/30/2005 + * Modified by Wenwei Yang, Chung-Hsun Lin, Darsen Lu 03/06/2009 **********/ #include "ngspice.h" diff --git a/src/spicelib/devices/bsim3soi/b4soiext.h b/src/spicelib/devices/bsim3soi/b4soiext.h index dcdb8bcf1..b15049062 100644 --- a/src/spicelib/devices/bsim3soi/b4soiext.h +++ b/src/spicelib/devices/bsim3soi/b4soiext.h @@ -1,6 +1,7 @@ /********** -Copyright 2005 Regents of the University of California. All rights reserved. +Copyright 2009 Regents of the University of California. All rights reserved. Author: 2005 Hui Wan (based on Samuel Fung's b3soiext.h) +Authors: 2009- Wenwei Yang, Chung-Hsun Lin, Ali Niknejad, Chenming Hu. File: b4soiext.h **********/ diff --git a/src/spicelib/devices/bsim3soi/b4soigetic.c b/src/spicelib/devices/bsim3soi/b4soigetic.c index 2bd5b322c..d5473f8f9 100644 --- a/src/spicelib/devices/bsim3soi/b4soigetic.c +++ b/src/spicelib/devices/bsim3soi/b4soigetic.c @@ -1,12 +1,14 @@ -/*** B4SOI 11/30/2005 Xuemei (Jane) Xi Release ***/ +/*** B4SOI 03/06/2009 Wenwei Yang Release ***/ /********** - * Copyright 2005 Regents of the University of California. All rights reserved. + * Copyright 2009 Regents of the University of California. All rights reserved. * Authors: 1998 Samuel Fung, Dennis Sinitsky and Stephen Tang * Authors: 1999-2004 Pin Su, Hui Wan, Wei Jin, b3soigetic.c * Authors: 2005- Hui Wan, Xuemei Xi, Ali Niknejad, Chenming Hu. + * Authors: 2009- Wenwei Yang, Chung-Hsun Lin, Ali Niknejad, Chenming Hu. * File: b4soigetic.c * Modified by Hui Wan, Xuemei Xi 11/30/2005 + * Modified by Wenwei Yang, Chung-Hsun Lin, Darsen Lu 03/06/2009 **********/ #include "ngspice.h" @@ -25,10 +27,8 @@ B4SOIinstance *here; for (; model ; model = model->B4SOInextModel) { for (here = model->B4SOIinstances; here; here = here->B4SOInextInstance) { - if (here->B4SOIowner != ARCHme) continue; - if(!here->B4SOIicVBSGiven) { here->B4SOIicVBS = *(ckt->CKTrhs + here->B4SOIbNode) - *(ckt->CKTrhs + here->B4SOIsNode); diff --git a/src/spicelib/devices/bsim3soi/b4soiitf.h b/src/spicelib/devices/bsim3soi/b4soiitf.h index 35908da4f..f0897e99f 100644 --- a/src/spicelib/devices/bsim3soi/b4soiitf.h +++ b/src/spicelib/devices/bsim3soi/b4soiitf.h @@ -1,6 +1,7 @@ /********** -Copyright 2005 Regents of the University of California. All rights reserved. +Copyright 2009 Regents of the University of California. All rights reserved. Author: 2005 Hui Wan (based on Samuel Fung's b3soiitf.h) +Authors: 2009- Wenwei Yang, Chung-Hsun Lin, Ali Niknejad, Chenming Hu. File: b4soiitf.h **********/ diff --git a/src/spicelib/devices/bsim3soi/b4soild.c b/src/spicelib/devices/bsim3soi/b4soild.c index 8f41aa642..c8d0a8a58 100644 --- a/src/spicelib/devices/bsim3soi/b4soild.c +++ b/src/spicelib/devices/bsim3soi/b4soild.c @@ -1,12 +1,14 @@ -/*** B4SOI 11/30/2005 Xuemei (Jane) Xi Release ***/ +/*** B4SOI 03/06/2009 Wenwei Yang Release ***/ /********** - * Copyright 2005 Regents of the University of California. All rights reserved. + * Copyright 2009 Regents of the University of California. All rights reserved. * Authors: 1998 Samuel Fung, Dennis Sinitsky and Stephen Tang * Authors: 1999-2004 Pin Su, Hui Wan, Wei Jin, b3soild.c * Authors: 2005- Hui Wan, Xuemei Xi, Ali Niknejad, Chenming Hu. + * Authors: 2009- Wenwei Yang, Chung-Hsun Lin, Ali Niknejad, Chenming Hu. * File: b4soild.c * Modified by Hui Wan, Xuemei Xi 11/30/2005 + * Modified by Wenwei Yang, Chung-Hsun Lin, Darsen Lu 03/06/2009 **********/ #include "ngspice.h" @@ -18,6 +20,7 @@ #include "devdefs.h" #include "suffix.h" +#define EPS0 8.85418e-12 /*4.1*/ #define EPSOX 3.453133e-11 #define EPSSI 1.03594e-10 #define Charge_q 1.60219e-19 @@ -97,9 +100,6 @@ double cdhat, cdreq, ceqbd, ceqbs, ceqqb, ceqqd, ceqqg, ceq, geq; double arg; double delvbd, delvbs, delvds, delvgd, delvgs; double Vfbeff, dVfbeff_dVg, dVfbeff_dVd, dVfbeff_dVb, V3, V4; -#ifndef NEWCONV -double tol; -#endif double PhiBSWG, MJSWG; double gcgdb, gcggb, gcgsb, gcgeb, gcgT; double gcsdb, gcsgb, gcssb, gcseb, gcsT; @@ -121,20 +121,20 @@ double EsatL, dEsatL_dVg, dEsatL_dVd, dEsatL_dVb, dEsatL_dT; double dVdsat_dVg, dVdsat_dVb, dVdsat_dVd, dVdsat_dT, Vasat; double dVasat_dVg, dVasat_dVb, dVasat_dVd, dVasat_dT; double Va, dVa_dVd, dVa_dVg, dVa_dVb, dVa_dT; -double Vbseff=0.0, dVbseff_dVb; +double Vbseff, dVbseff_dVb; double CoxWL; double T0=0.0, dT0_dVg, dT0_dVd, dT0_dVb, dT0_dT; double T1, dT1_dVg, dT1_dVd, dT1_dVb, dT1_dT; -double T2, dT2_dVg, dT2_dVd, dT2_dVb, dT2_dT; +double T2, dT2_dVg, dT2_dVd, dT2_dVb, dT2_dT, dT2_dVp; double T3, dT3_dVg, dT3_dVd, dT3_dVb, dT3_dT=0.0; double T4, dT4_dVd, dT4_dVb, dT4_dT; double T5, dT5_dVg, dT5_dVd, dT5_dVb, dT5_dT=0.0; -double T6, dT6_dVg, dT6_dVd, dT6_dVb, dT6_dT=0.0; +double T6, dT6_dVg, dT6_dVd, dT6_dVb, dT6_dT=0.0, dT6_dVp; double T7; double T8, dT8_dVd; double T9, dT9_dVd; double T10, dT10_dVb, dT10_dVd; -double T11, T12; +double T11, T12=0.0; double tmp, Abulk, dAbulk_dVb, Abulk0, dAbulk0_dVb; double VACLM, dVACLM_dVg, dVACLM_dVd, dVACLM_dVb, dVACLM_dT; double VADIBL, dVADIBL_dVg, dVADIBL_dVd, dVADIBL_dVb, dVADIBL_dT; @@ -180,6 +180,7 @@ double DeltVthw, dDeltVthw_dVb, dDeltVthw_dT; double Gm0, Gds0, Gmb0, GmT0, Gmc, GmT; double dDIBL_Sft_dVb; double Igidl, Ggidld=0.0, Ggidlg, Ggidlb=0.0; +double Igisl=0.0, Ggisls=0.0, Ggislg=0.0, Ggislb=0.0; double Gjsd, Gjsb=0.0, GjsT, Gjdd, Gjdb=0.0, GjdT; double Ibp, Iii, Giid=0.0, Giig, Giib=0.0, GiiT, Gcd, Gcb, GcT, ceqbody, ceqbodcon; double gppb, gppp; @@ -205,14 +206,14 @@ double Ibs4 ,dIbs4_dVb ,dIbs4_dT; double Ibd1 ,dIbd1_dVb ,dIbd1_dVd ,dIbd1_dT; double Ibd2 ,dIbd2_dVb ,dIbd2_dVd ,dIbd2_dT; double Ibd3 ,dIbd3_dVb ,dIbd3_dVd ,dIbd3_dT; -double Ibd4 ,dIbd4_dVb ,dIbd4_dVd ,dIbd4_dT; +double Ibd4 ,dIbd4_dVb ,dIbd4_dVd ,dIbd4_dT=0.0; double WTsi, NVtm1, NVtm2; -double Ic ,dIc_dVb ,dIc_dVd; +double Ic ,dIc_dVb ,dIc_dVd; double Ibs; double Ibd; double Denomi ,dDenomi_dVg ,dDenomi_dVd ,dDenomi_dVb ,dDenomi_dT; -double Qsub0=0.0 ,dQsub0_dVg ,dQsub0_dVb ,dQsub0_dVd ; -double Qac0=0.0, dQac0_dVb, dQac0_dVd; +double Qsub0=0.0 ,dQsub0_dVg ,dQsub0_dVb ,dQsub0_dVd ; +double Qac0=0.0 ,dQac0_dVb ,dQac0_dVd; double Qe1 , dQe1_dVb, dQe1_dVe, dQe1_dT; double Ce1b ,Ce1e, Ce1T; double dQac0_dVrg, dQsub0_dVrg; @@ -238,7 +239,7 @@ double T13, T14; double dT11_dVb, dT13_dVb, dT14_dVb; double dVgst_dVd; double Vdsatii0, dVdsatii0_dT; -double VgsStep, dVgsStep_dT, Ratio, dRatio_dVg, dRatio_dVb, dRatio_dVd, dRatio_dT, dTempRatio_dT; +double VgsStep, dVgsStep_dT, Ratio=0.0, dRatio_dVg=0.0, dRatio_dVb=0.0, dRatio_dVd=0.0, dRatio_dT=0.0, dTempRatio_dT; double Vdiff, dVdiff_dVg, dVdiff_dVb, dVdiff_dVd, dVdiff_dT; double dNVtm1_dT; double NVtmf, NVtmr, dNVtmf_dT, dNVtmr_dT; @@ -270,7 +271,7 @@ double T3zb, lt1zb, ltwzb, Theta0zb; double Delt_vthzb, dDelt_vthzb_dT; double DeltVthwzb, dDeltVthwzb_dT; double DeltVthtempzb, dDeltVthtempzb_dT; -double Vthzb=0.0, dVthzb_dT=0.0, Vfbzb=0.0, dVfbzb_dT; +double Vthzb=0.0, dVthzb_dT=0.0, Vfbzb=0.0, dVfbzb_dT=0.0; /* v3.2 */ double noff, dnoff_dVd, dnoff_dVb; @@ -297,7 +298,7 @@ double gIgtotg, gIgtotd, gIgtotb, gIgtots, Igtoteq; /* v3.0 */ double Vbsitf, dVbsitf_dVg, dVbsitf_dVd, dVbsitf_dVb, dVbsitf_dVe, dVbsitf_dT; -double dIgb1_dVe, gige, Giie, dT0_dVe, dRatio_dVe, dVdiff_dVe; +double dIgb1_dVe, gige, Giie, dT0_dVe, dRatio_dVe=0.0, dVdiff_dVe; double dT1_dVe, dT5_dVe, dIgb_dVe, dVox_dVe, dVoxdepinv_dVe=0.0, dVaux_dVe; double Gme, gTte, gbbe, gddpe, gsspe; double Vbs0, dVbs0_dVg, dVbs0_dVd, dVbs0_dVe, dVbs0_dT; @@ -324,8 +325,8 @@ double Voxacc=0.0, dVoxacc_dVg=0.0, dVoxacc_dVd=0.0, dVoxacc_dVb=0.0; double Voxdepinv=0.0, dVoxdepinv_dVg=0.0, dVoxdepinv_dVb=0.0, dVoxdepinv_dVd=0.0, dVoxdepinv_dT=0.0; double Igb1, dIgb1_dVg, dIgb1_dVd, dIgb1_dVb, dIgb1_dT; double Igb2, dIgb2_dVg, dIgb2_dVd, dIgb2_dVb, dIgb2_dT; -double gigs, gigd, gigb, gigg; -double gigT; +double gigs, gigd, gigb, gigg, gigT; +double gigpg, gigpp; /* v4.0 */ double IdlovVdseff, dIdlovVdseff_dVg, dIdlovVdseff_dVd, dIdlovVdseff_dVb; @@ -333,31 +334,75 @@ double IdovVds; double vdbs, vsbs, vdbd=0.0, vsbd, vsbdo, vbs_jct, vbd_jct; double Vsbs, Vdbd, Vdbs; double delvdbd, delvsbs, delvdbs, delvbd_jct, delvbs_jct; -double gcdbdb, gcsbsb, gcsbb=0.0, gcdbb=0.0; +double gcdbdb, gcsbsb, gcsbb, gcdbb; double ceqqjd=0.0, ceqqjs=0.0; double Lpe_Vb; /* v4.0 for Vth */ -double DITS_Sft, dDITS_Sft_dVb, dDITS_Sft_dVd, dDITS_Sft_dT; +double DITS_Sft, DITS_Sft2, dDITS_Sft_dVb, dDITS_Sft_dVd, dDITS_Sft2_dVd, dDITS_Sft_dT; double FP, dFP_dT, dFP_dVg; double VADITS, dVADITS_dVg, dVADITS_dVd, dVADITS_dT; /* for DITS */ double Iii_Igidl, Giigidl_b, Giigidl_d, Giigidl_g, Giigidl_e, Giigidl_T; double gjsdb; double Idbdp=0.0, Isbsp=0.0, cdbdp, csbsp, gcjdbdp, gcjsbsp, GGjdb, GGjsb; double vdes, vses, vdedo, delvdes, delvses, delvded, Isestot, cseshat, Idedtot, cdedhat; -double PowWeffWr, rd0, rs0=0.0, rdwmin, rswmin=0.0, drs0_dT, drd0_dT, drswmin_dT, - drdwmin_dT, Rd, dRd_dVg, dRd_dVb, dRd_dT, Rs, dRs_dVg, dRs_dVb, dRs_dT; +double PowWeffWr, rd0, rs0=0.0, rdwmin, rswmin=0.0, drs0_dT=0.0, drd0_dT=0.0, drswmin_dT=0.0, + drdwmin_dT=0.0, Rd, dRd_dVg, dRd_dVb, dRd_dT, Rs, dRs_dVg, dRs_dVb, dRs_dT; double dgstot_dvd, dgstot_dvg, dgstot_dvs, dgstot_dvb, dgstot_dve, dgstot_dT; double dgdtot_dvd, dgdtot_dvg, dgdtot_dvs, dgdtot_dvb, dgdtot_dve, dgdtot_dT; double gstot, gstotd, gstotg, gstots, gstotb, ceqgstot; double gdtot, gdtotd, gdtotg, gdtots, gdtotb, ceqgdtot; double gdpr, gspr; +/*4.1*/ +double toxe, epsrox, epssub, epsgate; +double Tnom, Eg0, Vtm0; +double Vbci, Idsmosfet, Iiibjt; +double dVbci_dT, dIiibjt_dVd, dIiibjt_dVb, dIiibjt_dT; +double VgsteffVth, dT11_dVg; +/* v4.1 */ +double Vgd; +double dVbs0mos_dVd; +double Ig_agbcp2, dIg_agbcp2_dVg, dIg_agbcp2_dVp; +double vgp_eff, vgp=0.0, dvgp_eff_dvg, dvgp_eff_dvp; + +/* improved body contact charge model */ +double CoxWL2, CoxWLb2; +double ExpVgst2, Vgsteff2=0.0, VgstNVt2, ExpArg2; +double dVgsteff2_dVd=0.0, dVgsteff2_dVg=0.0, dVgsteff2_dVb=0.0, dVgsteff2_dVe, dVgsteff2_dT=0.0; +double T02=0.0; +double Qac02, dQac02_dVrg=0.0, dQac02_dVd=0.0, dQac02_dVg=0.0, dQac02_dVb=0.0, dQac02_dT=0.0; +double Vgs_eff2=0.0, dVgs_eff2_dVg=0.0; +double Vthzb2; +double Vfbzb2=0.0, dVfbzb2_dT=0.0; +double Vfb2, dVfb2_dVd, dVfb2_dVb, dVfb2_dT; +double Vfbeff2=0.0, dVfbeff2_dVd=0.0, dVfbeff2_dVrg=0.0, dVfbeff2_dVg=0.0, dVfbeff2_dVb=0.0, dVfbeff2_dT=0.0; +double Qsub02, dQsub02_dVg=0.0, dQsub02_dVrg=0.0, dQsub02_dVd=0.0, dQsub02_dVb=0.0, dQsub02_dT=0.0; +double VdsatCV2, dVdsatCV2_dVg, dVdsatCV2_dVb; +double VdseffCV2=0.0, dVdseffCV2_dVg=0.0, dVdseffCV2_dVd=0.0, dVdseffCV2_dVb=0.0; +double Cbg12=0.0, Cbd12=0.0, Cbb12=0.0; +double Cgg12=0.0, Cgd12=0.0, Cgb12=0.0; +double Csg12=0.0, Csd12=0.0, Csb12=0.0; +double Tcen2=0.0, dTcen2_dVg=0.0, dTcen2_dVd=0.0, dTcen2_dVb=0.0, dTcen2_dT=0.0; +double Ccen2; +double Coxeff2=0.0, dCoxeff2_dVg=0.0, dCoxeff2_dVd=0.0, dCoxeff2_dVb=0.0, dCoxeff2_dT=0.0; +double CoxWLcenb2=0.0, dCoxWLcenb2_dT=0.0; +double QovCox2; +double DeltaPhi2=0.0, dDeltaPhi2_dVg=0.0, dDeltaPhi2_dVd, dDeltaPhi2_dVb; +double CoxWLcen2=0.0; +double T22=0.0, T52=0.0; +double qsrc2, qbulk2; +double Csg2=0.0, Csd2, Csb2; +double DELTA_3_SOI2; +double dphi_dT,dsqrtPhi_dT,dXdep0_dT,cdep0,dcep0_dT,theta0vb0,dtheta0vb0_dT; +double thetaRout,dthetaRout_dT,dcdep0_dT; +double dPhis_dT,dsqrtPhis_dT,dXdep_dT,dlt1_dT,dltw_dT; +double agidl, bgidl, cgidl, egidl, rgidl, kgidl, fgidl; +double agisl, bgisl, cgisl, egisl, rgisl, kgisl, fgisl; double m; for (; model != NULL; model = model->B4SOInextModel) { for (here = model->B4SOIinstances; here != NULL; here = here->B4SOInextInstance) - { - + { if (here->B4SOIowner != ARCHme) continue; @@ -913,18 +958,36 @@ for (; model != NULL; model = model->B4SOInextModel) *(ckt->CKTstate0 + here->B4SOIdeltemp),5.0,&Check); } - + if(model->B4SOImtrlMod) + { + epsrox = 3.9; + toxe = model->B4SOIeot; + epssub = EPS0 * model->B4SOIepsrsub; + + } + else + { + epsrox = model->B4SOIepsrox; + toxe = model->B4SOItox; + epssub = EPSSI; + + } + + /* Calculate temperature dependent values for self-heating effect */ Temp = delTemp + ckt->CKTtemp; dTempRatio_dT = 1 / model->B4SOItnom; TempRatio = Temp * dTempRatio_dT; if (selfheat) { + if(model->B4SOImtrlMod==0) + { Vtm = KboQ * Temp; - T0 = 1108.0 + Temp; + T0 = 1108.0 + Temp; T5 = Temp * Temp; Eg = 1.16 - 7.02e-4 * T5 / T0; + T1 = ((7.02e-4 * T5) - T0 * (14.04e-4 * Temp)) / T0 / T0; /* T1 = dEg / dT */ @@ -939,7 +1002,36 @@ for (; model != NULL; model = model->B4SOInextModel) T0 = log(1.0e20 * pParam->B4SOInpeak / (ni * ni)); vbi = Vtm * T0; dvbi_dT = KboQ * T0 + Vtm * (-2.0 * dni_dT / ni); + } + else + { + Tnom = model->B4SOItnom; + Vtm = KboQ * Temp; + Vtm0= KboQ * Tnom; + + Eg0 = model->B4SOIeg0; + T0 = model->B4SOItbgbsub + Temp; + T5 = Temp * Temp; + Eg = model->B4SOIbg0sub - model->B4SOItbgasub * Temp * Temp + / (Temp + model->B4SOItbgbsub); + + T1 = ((model->B4SOItbgasub * T5) - T0 * (2.0*model->B4SOItbgasub * Temp)) / T0 / T0; + /* T1 = dEg / dT */ + T2 = 1/sqrt(Tnom*Tnom*Tnom); + T5 = sqrt(Temp); + T3 = model->B4SOIni0sub * Temp * T5 * T2; + T4 = exp(Eg0/(2.0*Vtm0) - Eg / (2.0 * Vtm)); + ni = T3 * T4; + dni_dT=1.5*model->B4SOIni0sub*T5*T2*T4+ + T3*T4*(-Vtm * T1 + Eg * KboQ) / (2.0 * Vtm * Vtm); + + T0 = log(1.0e20 * pParam->B4SOInpeak / (ni * ni)); + vbi = Vtm * T0; + dvbi_dT = KboQ * T0 + Vtm * (-2.0 * dni_dT / ni); + + + } if (pParam->B4SOInsub > 0) { T0 = log(pParam->B4SOInpeak / pParam->B4SOInsub); vfbb = -model->B4SOItype * Vtm * T0; @@ -956,9 +1048,32 @@ for (; model != NULL; model = model->B4SOInextModel) phi = 2.0 * Vtm * log(pParam->B4SOInpeak / ni); /* phi = here->B4SOIphi; */ sqrtPhi = sqrt(phi); - Xdep0 = sqrt(2.0 * EPSSI / (Charge_q + Xdep0 = sqrt(2.0 * epssub / (Charge_q * pParam->B4SOInpeak * 1.0e6)) * sqrtPhi; + /* v4.1 SH bug fix */ + dphi_dT = phi / Vtm * KboQ; + dsqrtPhi_dT = 0.5 / sqrtPhi * dphi_dT; + dXdep0_dT = Xdep0 / sqrtPhi * dsqrtPhi_dT; + + cdep0 = sqrt(Charge_q * EPSSI + * pParam->B4SOInpeak * 1.0e6 / 2.0) / sqrtPhi; + dcep0_dT = cdep0 * sqrtPhi * (-1.0) / phi * dsqrtPhi_dT; + + T1 = sqrt(EPSSI / (model->B4SOIepsrox * EPSOX / 3.9) + * model->B4SOItox * Xdep0); + dT1_dT = 0.5 * T1 / Xdep0 * dXdep0_dT; + T0 = exp(-0.5 * pParam->B4SOIdsub * pParam->B4SOIleff / T1); + dT0_dT = T0 * 0.5 * pParam->B4SOIdsub * pParam->B4SOIleff + / T1 / T1 * dT1_dT; + theta0vb0 = (T0 + 2.0 * T0 * T0); + dtheta0vb0_dT = (1.0 + 4.0 * T0) * dT0_dT; + T0 = exp(-0.5 * pParam->B4SOIdrout * pParam->B4SOIleff / T1); + dT0_dT = T0 * 0.5 * pParam->B4SOIdrout * pParam->B4SOIleff + / T1 / T1 * dT1_dT; + T2 = (T0 + 2.0 * T0 * T0); + thetaRout = pParam->B4SOIpdibl1 * T2 + pParam->B4SOIpdibl2; + dthetaRout_dT = pParam->B4SOIpdibl1 * (1.0 + 4.0 * T0) * dT0_dT; /* Save the values below for phi calculation in B4SOIaccept() */ here->B4SOIvtm = Vtm; here->B4SOIni = ni; @@ -1122,6 +1237,12 @@ for (; model != NULL; model = model->B4SOInextModel) phi = pParam->B4SOIphi; sqrtPhi = pParam->B4SOIsqrtPhi; Xdep0 = pParam->B4SOIXdep0; + Eg = model->B4SOIeg0; + /* v4.1 */ + cdep0 = pParam->B4SOIcdep0; + theta0vb0 = pParam->B4SOItheta0vb0; + thetaRout = pParam->B4SOIthetaRout; + jbjts = pParam->B4SOIjbjts; /* v4.0 */ jbjtd = pParam->B4SOIjbjtd; jdifs = pParam->B4SOIjdifs; @@ -1145,7 +1266,10 @@ for (; model != NULL; model = model->B4SOInextModel) djbjtd_dT = djdifd_dT = djrecd_dT = djtund_dT = 0.0; du0temp_dT = dvsattemp_dT = 0.0; dua_dT = dub_dT = duc_dT = 0.0; - + /* v4.1 */ + dphi_dT = dsqrtPhi_dT = dXdep0_dT = 0.0; + dcdep0_dT = dtheta0vb0_dT = dthetaRout_dT = 0.0; + if (!model->B4SOIrdsMod) { rds0 = pParam->B4SOIrds0; drds0_dT = 0.0; @@ -1176,6 +1300,7 @@ for (; model != NULL; model = model->B4SOInextModel) veb = ves - vbs; vge = vgs - ves; vpd = vps - vds; + vgp = vgs - vps; /* v3.1 added for RF */ vged = vges - vds; @@ -1187,6 +1312,22 @@ for (; model != NULL; model = model->B4SOInextModel) /* v3.1 bug fix */ wdiosCV_NoSwap = pParam->B4SOIwdiosCV; wdiodCV_NoSwap = pParam->B4SOIwdiodCV; + + agidl = pParam->B4SOIagidl; + bgidl = pParam->B4SOIbgidl; + cgidl = pParam->B4SOIcgidl; + egidl = pParam->B4SOIegidl; + rgidl = pParam->B4SOIrgidl; + kgidl = pParam->B4SOIkgidl; + fgidl = pParam->B4SOIfgidl; + + agisl = pParam->B4SOIagisl; + bgisl = pParam->B4SOIbgisl; + cgisl = pParam->B4SOIcgisl; + egisl = pParam->B4SOIegisl; + rgisl = pParam->B4SOIrgisl; + kgisl = pParam->B4SOIkgisl; + fgisl = pParam->B4SOIfgisl; if (vds >= 0.0) @@ -1201,6 +1342,7 @@ for (; model != NULL; model = model->B4SOInextModel) Vsbs = vsbs; /* v4.0 */ Vdbs = vdbs; /* v4.0 */ Vdbd = Vdbs - Vds; /* v4.0 */ + Vgd = vgd; /* v4.1 */ wdios = pParam->B4SOIwdios; wdiod = pParam->B4SOIwdiod; @@ -1220,13 +1362,74 @@ for (; model != NULL; model = model->B4SOInextModel) Vsbs = vdbd; /* v4.0 */ Vdbd = vsbs; /* v4.0 */ Vdbs = Vdbd + Vds; /* v4.0 */ - + Vgd = vgs; /* v4.1 */ wdios = pParam->B4SOIwdiod; wdiod = pParam->B4SOIwdios; wdiosCV = pParam->B4SOIwdiodCV; wdiodCV = pParam->B4SOIwdiosCV; } + +if( vds < 0.0) +{/*Diode current*/ + T0 = jbjts; + T1 = djbjts_dT; + jbjts = jbjtd; + djbjts_dT = djbjtd_dT; + jbjtd = T0; + djbjtd_dT = T1; + + T0 = jdifs; + T1 = djdifs_dT; + jdifs = jdifd; + djdifs_dT = djdifd_dT; + jdifd = T0; + djdifd_dT = T1; + + T0 = jrecs; + T1 = djrecs_dT; + jrecs = jrecd; + djrecs_dT = djrecd_dT; + jrecd = T0; + djrecd_dT = T1; + + T0 = jtuns; + T1 = djtuns_dT; + jtuns = jtund; + djtuns_dT = djtund_dT; + jtund = T0; + djtund_dT = T1; + + /*GISL/GIDL*/ + T0 = agidl; + agidl = agisl; + agisl = T0; + + T0 = bgidl; + bgidl = bgisl; + bgisl = T0; + + T0 = cgidl; + cgidl = cgisl; + cgisl = T0; + + T0 = egidl; + egidl = egisl; + egisl = T0; + + T0 = rgidl; + rgidl = rgisl; + rgisl = T0; + + T0 = kgidl; + kgidl = kgisl; + kgisl = T0; + + T0 = fgidl; + fgidl = fgisl; + fgisl = T0; + +} vbs_jct = (!here->B4SOIrbodyMod) ? Vbs : Vsbs; /* v4.0 */ vbd_jct = (!here->B4SOIrbodyMod) ? Vbd : Vdbd; /* v4.0 */ @@ -1242,15 +1445,24 @@ for (; model != NULL; model = model->B4SOInextModel) if (here->B4SOIdebugMod <0) ChargeComputationNeeded = 1; - - +#ifdef B4SOI_DEBUG_OUT + ChargeComputationNeeded = 1; + here->B4SOIdebug1 = 0.0; + here->B4SOIdebug2 = 0.0; + here->B4SOIdebug3 = 0.0; +#endif /* Poly Gate Si Depletion Effect */ T0 = here->B4SOIvfb + phi; + if (model->B4SOImtrlMod==0) + epsgate = epssub; + else + epsgate = model->B4SOIepsrgate * EPS0; + if ((pParam->B4SOIngate > 1.e18) && (pParam->B4SOIngate < 1.e25) - && (Vgs > T0)) + && (Vgs > T0)&& (epsgate!=0)) /* added to avoid the problem caused by ngate */ - { T1 = 1.0e6 * Charge_q * EPSSI * pParam->B4SOIngate + { T1 = 1.0e6 * Charge_q * epsgate * pParam->B4SOIngate / (model->B4SOIcox * model->B4SOIcox); T4 = sqrt(1.0 + 2.0 * (Vgs - T0) / T1); T2 = T1 * (T4 - 1.0); @@ -1266,7 +1478,14 @@ for (; model != NULL; model = model->B4SOInextModel) dVgs_eff_dVg = 1.0; } +/* v4.1 for improved BT charge model, no poly depletion */ + if (here->B4SOIagbcp2 > 0) + { Vgs_eff2 = Vgs; + dVgs_eff2_dVg = 1.0; + } + +/* end v4.1 for improved BT charge model */ Leff = pParam->B4SOIleff; if (selfheat) { @@ -1299,11 +1518,15 @@ for (; model != NULL; model = model->B4SOInextModel) else /* soiMod = 1 or 2: adding FD module on top of BSIMPD */ { /* prepare Vbs0 & Vbs0mos for VthFD calculation */ + if (model->B4SOIfdMod == 0) /* v4.0 */ + { T0 = -model->B4SOIdvbd1 * pParam->B4SOIleff / pParam->B4SOIlitl; T1 = model->B4SOIdvbd0 * (exp(0.5*T0) + 2*exp(T0)); T2 = T1 * (vbi - phi); T3 = 0.5 * pParam->B4SOIqsi / model->B4SOIcsi; /* v3.2 */ Vbs0t = phi - T3 + model->B4SOIvbsa + T2; + dVbs0t_dVd = 0.0; + dVbs0_dVd = 0.0; if (selfheat) dVbs0t_dT = T1 * dvbi_dT; else @@ -1321,7 +1544,33 @@ for (; model != NULL; model = model->B4SOInextModel) dVbs0_dT = T4 * dVbs0t_dT - T1 * dvfbb_dT; else dVbs0_dT = 0.0; + } + else + { + T0 = 1.0/(model->B4SOIcsi + Cbox + model->B4SOIcdsbs); + T1 = -model->B4SOIdvbd1 * pParam->B4SOIleff / pParam->B4SOIlitl; + T2 = model->B4SOIdvbd0 * (exp(0.5*T1) + 2*exp(T1)); + T3 = T2 * (Vds + model->B4SOIvsce); + T4 = 0.5 * pParam->B4SOIqsi / model->B4SOIcsi; + T5 = model->B4SOIcsi * T0 * (phi - T4 + model->B4SOIvbsa); + T6 = model->B4SOIcdsbs * T0 * T3; + Vbs0t = T5 + T6; + dVbs0t_dVd = model->B4SOIcdsbs * T0 * T2; + if (selfheat) + dVbs0t_dT = 0.0; + else + dVbs0t_dT = 0.0; + T7 = Cbox * T0 * Vesfb; + Vbs0 = Vbs0t + T7; + dVbs0_dVe = Cbox * T0; + dVbs0_dVd = dVbs0t_dVd; + if (selfheat) + dVbs0_dT = dVbs0t_dT - Cbox * T0 * dvfbb_dT; + else + dVbs0_dT = 0.0; + + } /* zero field body potential cal. */ T1 = Vbs0t - Vbs0 - 0.005; @@ -1331,6 +1580,7 @@ for (; model != NULL; model = model->B4SOInextModel) Vbs0mos = Vbs0 - 0.5 * T3 * T4; T5 = 0.5 * T4 * (1 + T1 / T2); dVbs0mos_dVe = dVbs0_dVe * (1 + T5); + dVbs0mos_dVd = dVbs0_dVd + T5 * (dVbs0t_dVd - dVbs0_dVd); /* v4.1 */ if (selfheat) dVbs0mos_dT = dVbs0_dT * (1 + T5) - T5 * dVbs0t_dT; else @@ -1344,8 +1594,10 @@ for (; model != NULL; model = model->B4SOInextModel) Vbs0mos = T1 - 0.5 * (T2 + T3); T4 = 0.5 * (1 + T2 / T3); dVbs0mos_dVe = T4 * dVbs0mos_dVe; + dVbs0mos_dVd = T4 * dVbs0mos_dVd; /* v4.1 */ if (selfheat) - dVbs0mos_dT = T4 * dVbs0mos_dT; + /* dVbs0mos_dT = T4 * dVbs0mos_dT; */ + dVbs0mos_dT = dphi_dT - T4 * (dphi_dT - dVbs0mos_dT); /* v4.1 */ else dVbs0mos_dT = 0.0; @@ -1397,11 +1649,14 @@ for (; model != NULL; model = model->B4SOInextModel) dTheta0_dVb = 0.0; } - T2 = pParam->B4SOInfactor * EPSSI / Xdep; + T2 = pParam->B4SOInfactor * epssub / Xdep; dT2_dVb = - T2 / Xdep * dXdep_dVb; - T3 = pParam->B4SOIcdsc + pParam->B4SOIcdscb * Vbseff - + pParam->B4SOIcdscd * Vds; + /* T3 = pParam->B4SOIcdsc + pParam->B4SOIcdscb * Vbseff + + pParam->B4SOIcdscd * Vds;*/ + /* v4.1 */ + T3 = pParam->B4SOIcdsc + pParam->B4SOIcdscb * Vbs0mos + + pParam->B4SOIcdscd * Vds; dT3_dVb = pParam->B4SOIcdscb; dT3_dVd = pParam->B4SOIcdscd; T4 = (T2 + T3 * Theta0 + pParam->B4SOIcit) @@ -1455,7 +1710,9 @@ for (; model != NULL; model = model->B4SOInextModel) here->B4SOIthetavth = pParam->B4SOIdvt0 * Theta0; Delt_vth = here->B4SOIthetavth * V0; dDelt_vth_dVb = pParam->B4SOIdvt0 * dTheta0_dVb * V0; - if (selfheat) dDelt_vth_dT = here->B4SOIthetavth * dvbi_dT; + if (selfheat) + /*dDelt_vth_dT = here->B4SOIthetavth * dvbi_dT;*/ + dDelt_vth_dT = here->B4SOIthetavth * (dvbi_dT - dphi_dT); /* v4.1 */ else dDelt_vth_dT = 0.0; T0 = -0.5 * pParam->B4SOIdvt1w * pParam->B4SOIweff * Leff / ltw; @@ -1474,7 +1731,9 @@ for (; model != NULL; model = model->B4SOInextModel) T0 = pParam->B4SOIdvt0w * T2; DeltVthw = T0 * V0; dDeltVthw_dVb = pParam->B4SOIdvt0w * dT2_dVb * V0; - if (selfheat) dDeltVthw_dT = T0 * dvbi_dT; + if (selfheat) + /* dDeltVthw_dT = T0 * dvbi_dT; */ + dDeltVthw_dT = T0 * (dvbi_dT - dphi_dT); /* v4.1 */ else dDeltVthw_dT = 0.0; T0 = sqrt(1.0 + pParam->B4SOIlpe0 / Leff); @@ -1488,11 +1747,13 @@ for (; model != NULL; model = model->B4SOInextModel) /* v4.0 end */ if (selfheat) - dDeltVthtemp_dT = T1 / model->B4SOItnom; + /* dDeltVthtemp_dT = T1 / model->B4SOItnom; */ + dDeltVthtemp_dT = pParam->B4SOIk1ox * (T0 - 1.0) * dsqrtPhi_dT + + T1 / model->B4SOItnom; /* v4.1 */ else dDeltVthtemp_dT = 0.0; - tmp2 = model->B4SOItox * phi + tmp2 = toxe * phi / (pParam->B4SOIweff + pParam->B4SOIw0); T3 = here->B4SOIeta0 + pParam->B4SOIetab * Vbs0mos;/*v4.0*/ @@ -1512,12 +1773,18 @@ for (; model != NULL; model = model->B4SOInextModel) Lpe_Vb = sqrt(1.0 + pParam->B4SOIlpeb / Leff); + /* 4.1 */ + T0 = exp(2.0 * pParam->B4SOIdvtp4 * Vds); + DITS_Sft2 = pParam->B4SOIdvtp2factor * (T0-1) / (T0+1); + dDITS_Sft2_dVd = pParam->B4SOIdvtp2factor * pParam->B4SOIdvtp4 * 4.0 * T0 / ((T0+1) * (T0+1)); + VthFD = model->B4SOItype * here->B4SOIvth0 + (pParam->B4SOIk1ox * sqrtPhis - pParam->B4SOIk1eff * sqrtPhi) * Lpe_Vb - here->B4SOIk2ox * Vbs0mos- Delt_vth - DeltVthw + (pParam->B4SOIk3 + pParam->B4SOIk3b * Vbs0mos) - * tmp2 + DeltVthtemp - DIBL_Sft - DITS_Sft; + * tmp2 + DeltVthtemp - DIBL_Sft - DITS_Sft - DITS_Sft2; + T6 = pParam->B4SOIk3b * tmp2 - here->B4SOIk2ox + pParam->B4SOIkt2 * TempRatioMinus1; @@ -1527,11 +1794,19 @@ for (; model != NULL; model = model->B4SOInextModel) /* this is actually dVth_dVbs0mos */ dVthFD_dVe = dVthFD_dVb * dVbs0mos_dVe; - dVthFD_dVd = -dDIBL_Sft_dVd -dDITS_Sft_dVd; /*v4.0 */ - if (selfheat) - dVthFD_dT = dDeltVthtemp_dT - dDelt_vth_dT + /* dVthFD_dVd = -dDIBL_Sft_dVd -dDITS_Sft_dVd; */ /* v4.0 */ + dVthFD_dVd = dVthFD_dVb * dVbs0mos_dVd - dDIBL_Sft_dVd - dDITS_Sft_dVd - dDITS_Sft2_dVd; /* v4.1 */ + + if (selfheat) + /* dVthFD_dT = dDeltVthtemp_dT - dDelt_vth_dT - dDeltVthw_dT + dVthFD_dVb * dVbs0mos_dT - - dDITS_Sft_dT ; + - dDITS_Sft_dT ; */ + dVthFD_dT = dDeltVthtemp_dT - dDelt_vth_dT + - dDeltVthw_dT + dVthFD_dVb * dVbs0mos_dT + - dDITS_Sft_dT + + Lpe_Vb * ( pParam->B4SOIk1ox * 0.5 / sqrtPhis * dphi_dT + - pParam->B4SOIk1eff * dsqrtPhi_dT); /* v4.1 */ + else dVthFD_dT = 0.0; @@ -1574,7 +1849,8 @@ for (; model != NULL; model = model->B4SOInextModel) dT2_dVg = dVgsteffFD_dVg; dT2_dVd = dVgsteffFD_dVd; dT2_dVe = dVgsteffFD_dVe; - if (selfheat) dT2_dT = dVgsteffFD_dT; + /* if (selfheat) dT2_dT = dVgsteffFD_dT; */ + if (selfheat) dT2_dT = dVgsteffFD_dT + 2*pParam->B4SOIk1eff*dsqrtPhi_dT; /* v4.1 */ else dT2_dT = 0.0; T0 = 1+ VgsteffFD * T2 / T1; @@ -1591,7 +1867,7 @@ for (; model != NULL; model = model->B4SOInextModel) dPhiON_dVd = Vtm* dT0_dVd/T0 ; dPhiON_dVe = Vtm* dT0_dVe/T0 ; if (selfheat) - dPhiON_dT = Vtm* dT0_dT/T0 + (PhiON-phi)/Temp ; + dPhiON_dT = dphi_dT + Vtm* dT0_dT/T0 + (PhiON-phi)/Temp ; /* v4.1 */ else dPhiON_dT = 0.0; @@ -1607,6 +1883,8 @@ for (; model != NULL; model = model->B4SOInextModel) /* built-in potential lowering: Vbs0 */ + if (model->B4SOIfdMod == 0) /* v4.0 */ + { T0 = -model->B4SOIdvbd1 * pParam->B4SOIleff / pParam->B4SOIlitl; T1 = model->B4SOIdvbd0 * (exp(0.5*T0) + 2*exp(T0)); T2 = T1 * (vbi - phi); @@ -1615,9 +1893,9 @@ for (; model != NULL; model = model->B4SOInextModel) dVbs0t_dVg = dPhiFD_dVg; dVbs0t_dVd = dPhiFD_dVd; dVbs0t_dVe = dPhiFD_dVe; - if (selfheat) - dVbs0t_dT = dPhiFD_dT + T1 * dvbi_dT; - else dVbs0t_dT = 0; + if (selfheat) + dVbs0t_dT = dPhiFD_dT + T1 * (dvbi_dT - dphi_dT); /* v4.1 */ + else dVbs0t_dT = 0; T0 = 1 + model->B4SOIcsi / Cbox; @@ -1634,7 +1912,37 @@ for (; model != NULL; model = model->B4SOInextModel) dVbs0_dT = T0 * dVbs0t_dT - T1 * dvfbb_dT; else dVbs0_dT = 0.0; - + } + else /* v4.1 */ + { + T0 = 1.0/(model->B4SOIcsi + Cbox + model->B4SOIcdsbs); + T1 = -model->B4SOIdvbd1 * pParam->B4SOIleff / pParam->B4SOIlitl; + T2 = model->B4SOIdvbd0 * (exp(0.5*T1) + 2*exp(T1)); + T3 = T2 * (Vds + model->B4SOIvsce); + T4 = 0.5 * pParam->B4SOIqsi / model->B4SOIcsi; + T5 = model->B4SOIcsi * T0 * (PhiFD - T4 + model->B4SOIvbsa); + T6 = model->B4SOIcdsbs * T0 * T3; + Vbs0t = T5 + T6; + T8 = model->B4SOIcsi * T0; + dVbs0t_dVg = T8 * dPhiFD_dVg; + dVbs0t_dVd = T8 * dPhiFD_dVd + model->B4SOIcdsbs * T0 * T2; + dVbs0t_dVe = T8 * dPhiFD_dVe; + if (selfheat) + dVbs0t_dT = T8 * dPhiFD_dT; + else + dVbs0t_dT = 0.0; + + T7 = Cbox * T0 * Vesfb; + Vbs0 = Vbs0t + T7; + dVbs0_dVg = dVbs0t_dVg; + dVbs0_dVe = dVbs0t_dVe + Cbox * T0; + dVbs0_dVd = dVbs0t_dVd; + if (selfheat) + dVbs0_dT = dVbs0t_dT - Cbox * T0 * dvfbb_dT; + else + dVbs0_dT = 0.0; + + } /* set lowerbound of Vbs (from SPICE) to Vbs0: Vbsitf (Vbs at back interface) */ if (here->B4SOIsoiMod == 2) /* v3.2 */ /* v3.1 ideal FD: Vbsitf is pinned at Vbs0 */ @@ -1719,7 +2027,13 @@ for (; model != NULL; model = model->B4SOInextModel) dVbseff_dVg = 0.5 * (1.0 + T1 / T2) * dVbsh_dVg; dVbseff_dVd = 0.5 * (1.0 + T1 / T2) * dVbsh_dVd; dVbseff_dVe = 0.5 * (1.0 + T1 / T2) * dVbsh_dVe; - if (selfheat) dVbseff_dT = 0.5 * (1.0 + T1 / T2) * dVbsh_dT; + /* if (selfheat) dVbseff_dT = 0.5 * (1.0 + T1 / T2) * dVbsh_dT; */ + if (selfheat) { + dT0_dT = 0.95 * dphi_dT; + dT1_dT = dT0_dT - dVbsh_dT; + dVbseff_dT = dT0_dT - 0.5 * (1.0 + T1 / T2) * dT1_dT + - 0.002 * dT0_dT / T2; + } /* v4.1 */ else dVbseff_dT = 0.0; here->B4SOIvbseff = Vbseff; /* SPICE sol. */ /* end of v3.0 modification */ @@ -1740,10 +2054,22 @@ for (; model != NULL; model = model->B4SOInextModel) Xdep = Xdep0 * sqrtPhis / sqrtPhi; dXdep_dVb = (Xdep0 / sqrtPhi) * dsqrtPhis_dVb; + /* v4.1 */ + if (selfheat) { + dPhis_dT = dphi_dT - dVbseff_dT; + dsqrtPhis_dT = 0.5 / sqrtPhis * dPhis_dT; + dXdep_dT = dXdep0_dT * sqrtPhis / sqrtPhi + + (dsqrtPhis_dT * sqrtPhi - sqrtPhis * dsqrtPhi_dT) / phi; + } + else { + dPhis_dT = 0.0; + dsqrtPhis_dT = 0.0; + dXdep_dT = 0.0; + } /* end v4.1 */ /* Calculate nstar v3.2 */ here->B4SOInstar = model->B4SOIvtm / Charge_q * - (model->B4SOIcox + EPSSI / Xdep + pParam->B4SOIcit); + (model->B4SOIcox + epssub / Xdep + pParam->B4SOIcit); /* Vth Calculation */ T3 = sqrt(Xdep); @@ -1760,7 +2086,9 @@ for (; model != NULL; model = model->B4SOInextModel) } lt1 = model->B4SOIfactor1 * T3 * T1; dlt1_dVb =model->B4SOIfactor1 * (0.5 / T3 * T1 * dXdep_dVb + T3 * T2); - + if (selfheat) dlt1_dT = model->B4SOIfactor1 * T1 * 0.5 / T3 * dXdep_dT; + else dlt1_dT = 0.0; /* v4.1 */ + T0 = pParam->B4SOIdvt2w * Vbseff; if (T0 >= - 0.5) { T1 = 1.0 + T0; @@ -1773,7 +2101,8 @@ for (; model != NULL; model = model->B4SOInextModel) } ltw= model->B4SOIfactor1 * T3 * T1; dltw_dVb=model->B4SOIfactor1*(0.5 / T3 * T1 * dXdep_dVb + T3 * T2); - + if (selfheat) dltw_dT = model->B4SOIfactor1 * T1 * 0.5 / T3 * dXdep_dT; + else dltw_dT = 0.0; /* v4.1 */ T0 = -0.5 * pParam->B4SOIdvt1 * Leff / lt1; if (T0 > -EXPL_THRESHOLD) { T1 = exp(T0); @@ -1788,7 +2117,7 @@ for (; model != NULL; model = model->B4SOInextModel) } /* Calculate n */ - T2 = pParam->B4SOInfactor * EPSSI / Xdep; + T2 = pParam->B4SOInfactor * epssub / Xdep; dT2_dVb = - T2 / Xdep * dXdep_dVb; T3 = pParam->B4SOIcdsc + pParam->B4SOIcdscb * Vbseff @@ -1881,7 +2210,7 @@ for (; model != NULL; model = model->B4SOInextModel) else dDeltVthtemp_dT = 0.0; - tmp2 = model->B4SOItox * phi + tmp2 = toxe * phi / (pParam->B4SOIweff + pParam->B4SOIw0); T3 = here->B4SOIeta0 + pParam->B4SOIetab * Vbseff; @@ -1905,12 +2234,17 @@ for (; model != NULL; model = model->B4SOInextModel) sqrtPhisExt = sqrtPhis - T9 * (Vbsh - Vbseff); dsqrtPhisExt_dVb = dsqrtPhis_dVb - T9 * (dVbsh_dVb - 1); + /* 4.1 */ + T0 = exp(2.0 * pParam->B4SOIdvtp4 * Vds); + DITS_Sft2 = pParam->B4SOIdvtp2factor * (T0-1) / (T0+1); + dDITS_Sft2_dVd = pParam->B4SOIdvtp2factor * pParam->B4SOIdvtp4 * 4.0 * T0 / ((T0+1) * (T0+1)); + Vth = model->B4SOItype * here->B4SOIvth0 + (pParam->B4SOIk1ox * sqrtPhisExt - pParam->B4SOIk1eff * sqrtPhi) * Lpe_Vb - here->B4SOIk2ox * Vbseff- Delt_vth - DeltVthw +(pParam->B4SOIk3 + pParam->B4SOIk3b * Vbseff) * tmp2 - + DeltVthtemp - DIBL_Sft -DITS_Sft; + + DeltVthtemp - DIBL_Sft - DITS_Sft - DITS_Sft2; here->B4SOIvon = Vth; @@ -1921,7 +2255,7 @@ for (; model != NULL; model = model->B4SOInextModel) + T6 - dDIBL_Sft_dVb - dDITS_Sft_dVb; /* this is actually dVth_dVbseff */ - dVth_dVd = -dDIBL_Sft_dVd - dDITS_Sft_dVd; + dVth_dVd = -dDIBL_Sft_dVd - dDITS_Sft_dVd - dDITS_Sft2_dVd; if (selfheat) dVth_dT = dDeltVthtemp_dT - dDelt_vth_dT - dDeltVthw_dT - dDITS_Sft_dT; @@ -1968,6 +2302,7 @@ for (; model != NULL; model = model->B4SOInextModel) - Delt_vthzb - DeltVthwzb + pParam->B4SOIk3 * tmp2 + DeltVthtempzb; dVthzb_dT = dDeltVthtempzb_dT - dDelt_vthzb_dT - dDeltVthwzb_dT; + Vthzb2 = Vthzb + 1.12; /* v4.1 */ } /* Effective Vgst (Vgsteff) Calculation */ @@ -2214,12 +2549,17 @@ for (; model != NULL; model = model->B4SOInextModel) here->B4SOIAbulk = Abulk; /*v3.2 for noise */ /* Mobility calculation */ + if (model->B4SOImtrlMod) + T14 = 2.0 * model->B4SOItype *(model->B4SOIphig - model->B4SOIeasub - 0.5 * Eg + 0.45); + else + T14 = 0.0; + if (model->B4SOImobMod == 1) - { T0 = Vgsteff + Vth + Vth; + { T0 = Vgsteff + Vth + Vth - T14; T2 = ua + uc * Vbseff; - T3 = T0 / model->B4SOItox; + T3 = T0 / toxe; T5 = T3 * (T2 + ub * T3); - dDenomi_dVg = (T2 + 2.0 * ub * T3) / model->B4SOItox; + dDenomi_dVg = (T2 + 2.0 * ub * T3) / toxe; dDenomi_dVd = dDenomi_dVg * 2 * dVth_dVd; dDenomi_dVb = dDenomi_dVg * 2 * dVth_dVb + uc * T3 ; if (selfheat) @@ -2230,29 +2570,29 @@ for (; model != NULL; model = model->B4SOInextModel) dDenomi_dT = 0.0; } else if (model->B4SOImobMod == 2) - { T5 = Vgsteff / model->B4SOItox * (ua - + uc * Vbseff + ub * Vgsteff + { T5 = (Vgsteff -T14)/ model->B4SOItox * (ua + + uc * Vbseff + ub * (Vgsteff -T14) / model->B4SOItox); dDenomi_dVg = (ua + uc * Vbseff - + 2.0 * ub * Vgsteff / model->B4SOItox) - / model->B4SOItox; + + 2.0 * ub * (Vgsteff -T14) / toxe) + / toxe; dDenomi_dVd = 0.0; - dDenomi_dVb = Vgsteff * uc / model->B4SOItox ; + dDenomi_dVb = (Vgsteff -T14) * uc / toxe ; if (selfheat) - dDenomi_dT = Vgsteff / model->B4SOItox + dDenomi_dT = (Vgsteff -T14) / toxe * (dua_dT + Vbseff * duc_dT + dub_dT - * Vgsteff / model->B4SOItox); + * (Vgsteff -T14) / toxe); else dDenomi_dT = 0.0; } - else /* mobMod == 3 */ - { T0 = Vgsteff + Vth + Vth; + else if (model->B4SOImobMod == 3) /* mobMod == 3 */ + { T0 = Vgsteff + Vth + Vth - T14; T2 = 1.0 + uc * Vbseff; T3 = T0 / model->B4SOItox; T4 = T3 * (ua + ub * T3); T5 = T4 * T2; dDenomi_dVg = (ua + 2.0 * ub * T3) * T2 - / model->B4SOItox; + / toxe; dDenomi_dVd = dDenomi_dVg * 2.0 * dVth_dVd; dDenomi_dVb = dDenomi_dVg * 2.0 * dVth_dVb + uc * T4 ; @@ -2263,7 +2603,42 @@ for (; model != NULL; model = model->B4SOInextModel) else dDenomi_dT = 0.0; } + else /* mobMod == 4 */ + { + /*univsersal mobility*/ + T0 = (Vgsteff + here->B4SOIvtfbphi1)* 1.0e-8 / toxe/6.0; + T1 = exp(pParam->B4SOIeu * log(T0)); + + dT1_dVg = T1 * pParam->B4SOIeu * 1.0e-8/ T0 / toxe/6.0; + + T2 = pParam->B4SOIua + pParam->B4SOIuc * Vbseff; + + /*Coulombic*/ + pParam->B4SOIucs = pParam->B4SOIucs * pow(TempRatio, pParam->B4SOIucste); + pParam->B4SOIud = pParam->B4SOIud * pow(TempRatio, pParam->B4SOIud1) ; + VgsteffVth = here->B4SOIvgsteffvth; + + /*T10 = exp(pParam->B4SOIucs * log(0.5 + 0.5 * Vgsteff/VgsteffVth));*/ + T10 = exp(pParam->B4SOIucs * log(1.0 + Vgsteff/VgsteffVth)); + T11 = pParam->B4SOIud/T10; + /*dT11_dVg = - 0.5 * pParam->B4SOIucs * T11 /(0.5 + 0.5*Vgsteff/VgsteffVth)/VgsteffVth;*/ + dT11_dVg = (pParam->B4SOIucs - 1.0)*pParam->B4SOIud/(VgsteffVth* exp((pParam->B4SOIucs-1.0) * log(1.0 + Vgsteff/VgsteffVth))); + + dDenomi_dVg = T2 * dT1_dVg + dT11_dVg; + dDenomi_dVd = 0.0; + dDenomi_dVb = T1 * pParam->B4SOIuc; + + T5 = T1 * T2 + T11; + if (selfheat) + dDenomi_dT = dDenomi_dVg * pParam->B4SOIeu * dVth_dT + + (dua_dT + dub_dT * T3) * T3 * T2 + + T4 * Vbseff * duc_dT; + else + dDenomi_dT = 0.0; + + + } if (T5 >= -0.8) { Denomi = 1.0 + T5; } @@ -2790,38 +3165,94 @@ for (; model != NULL; model = model->B4SOInextModel) /* v3.1 */ if (here->B4SOIsoiMod != 2) /* v3.2 */ { - /* calculate GIDL current */ - T0 = 3 * model->B4SOItox; - /* For drain side */ - T1 = (Vds - Vgs_eff - pParam->B4SOIegidl) / T0; - if ((pParam->B4SOIagidl <= 0.0) || - (pParam->B4SOIbgidl <= 0.0) || (T1 <= 0.0) || - (pParam->B4SOIcgidl < 0.0) || (Vbd > 0.0) ) + /* calculate GISL/GIDL current */ + /*4.1*/ + if(model->B4SOImtrlMod == 0) + T0 = 3.0 * 3.9 / epsrox * toxe; + else + T0 = model->B4SOIepsrsub * toxe / epsrox; + + + if (model->B4SOIgidlMod==0) + { + if (model->B4SOImtrlMod==0) + T1 = (- Vds - Vgs_eff - egisl) / T0; + else + T1 = (- Vds - Vgs_eff - egisl+pParam->B4SOIvfbsd) / T0; + + /* GISL */ + if ((agisl <= 0.0) || + (bgisl <= 0.0) || (T1 <= 0.0) || + (cgisl < 0.0) || (Vbd > 0.0) ) + Igisl = Ggisls = Ggislg = Ggislb = 0.0; + + else { + dT1_dVd = 1 / T0; + dT1_dVg = - dT1_dVd * dVgs_eff_dVg; + T2 = bgisl / T1; + if (T2 < EXPL_THRESHOLD) + { + Igisl = wdios * agisl * T1 * exp(-T2); + T3 = Igisl / T1 * (T2 + 1); + Ggisls = T3 * dT1_dVd; + Ggisls = T3 * dT1_dVg; + } else + { + T3 = wdios * agisl * MIN_EXPL; + Igisl = T3 * T1 ; + Ggisls = T3 * dT1_dVd; + Ggislg = T3 * dT1_dVg; + } + if(cgisl >= MIN_EXPL) { + T4 = Vbs * Vbs; + T5 = -Vbs * T4; + T6 = cgisl + T5; + T7 = T5 / T6; + T8 = 3.0 * cgisl * T4 / T6 / T6; + Ggisls = Ggisls * T7 + Igisl * T8; + Ggislg = Ggislg * T7; + Ggislb = -Igisl * T8; + Igisl *= T7; + } else + Ggislb = 0.0; + } + here->B4SOIigisl = Igisl; + /* End of GISL */ + + if (model->B4SOImtrlMod==0) + T1 = (Vds - Vgs_eff - egidl) / T0; + else + T1 = (Vds - Vgs_eff - egidl+pParam->B4SOIvfbsd) / T0; + + /* GIDL */ + if ((agidl <= 0.0) || + (bgidl <= 0.0) || (T1 <= 0.0) || + (cgidl < 0.0) || (Vbd > 0.0) ) Igidl = Ggidld = Ggidlg = Ggidlb = 0.0; else { dT1_dVd = 1 / T0; dT1_dVg = - dT1_dVd * dVgs_eff_dVg; - T2 = pParam->B4SOIbgidl / T1; + T2 = bgidl / T1; if (T2 < EXPL_THRESHOLD) { - Igidl = wdiod * pParam->B4SOIagidl * T1 * exp(-T2); + Igidl = wdiod * agidl * T1 * exp(-T2); T3 = Igidl / T1 * (T2 + 1); Ggidld = T3 * dT1_dVd; Ggidlg = T3 * dT1_dVg; } else { - T3 = wdiod * pParam->B4SOIagidl * MIN_EXPL; + T3 = wdiod * agidl * MIN_EXPL; Igidl = T3 * T1 ; Ggidld = T3 * dT1_dVd; Ggidlg = T3 * dT1_dVg; } - if(pParam->B4SOIcgidl >= MIN_EXPL) { + if(cgidl >= MIN_EXPL) { T4 = Vbd * Vbd; T5 = -Vbd * T4; - T6 = pParam->B4SOIcgidl + T5; + T6 = cgidl + T5; T7 = T5 / T6; - T8 = 3.0 * pParam->B4SOIcgidl * T4 / T6 / T6; + T8 = 3.0 * cgidl * T4 / T6 / T6; Ggidld = Ggidld * T7 + Igidl * T8; Ggidlg = Ggidlg * T7; Ggidlb = -Igidl * T8; @@ -2829,7 +3260,108 @@ for (; model != NULL; model = model->B4SOInextModel) } else Ggidlb = 0.0; } - here->B4SOIigidl = Igidl; + here->B4SOIigidl = Igidl; + /* End of GIDL*/ + } + else + { + if (model->B4SOImtrlMod==0) + T1 = (-Vds - rgisl*Vgs_eff - pParam->B4SOIegisl) / T0; + else + T1 = (-Vds - rgisl*Vgs_eff - pParam->B4SOIegisl+pParam->B4SOIvfbsd) / T0; + + /* GISL */ + + if ((agisl <= 0.0) || + (bgisl <= 0.0) || (T1 <= 0.0) || + (cgisl < 0.0) ) + Igisl = Ggisls = Ggislg = Ggislb = 0.0; + else + { + dT1_dVd = 1 / T0; + dT1_dVg = - rgisl*dT1_dVd * dVgs_eff_dVg; + T2 = bgisl / T1; + if (T2 < EXPL_THRESHOLD) + { + Igisl = wdios * agisl * T1 * exp(-T2); + T3 = Igisl / T1 * (T2 + 1); + Ggisls = T3 * dT1_dVd; + Ggislg = T3 * dT1_dVg; + } else + { + T3 = wdios * agisl * MIN_EXPL; + Igisl = T3 * T1 ; + Ggisls = T3 * dT1_dVd; + Ggislg = T3 * dT1_dVg; + } + T4 = Vbs - fgisl; + if (T4==0) + T5 =1; + else + T5 = kgisl/T4; + T6 = exp(T5); + if (T6B4SOIigisl = Igisl; + /* End of GISL */ + if (model->B4SOImtrlMod==0) + T1 = (Vds - rgidl*Vgs_eff - pParam->B4SOIegidl) / T0; + else + T1 = (Vds - rgidl*Vgs_eff - pParam->B4SOIegidl+pParam->B4SOIvfbsd) / T0; + /* GIDL */ + if ((agidl <= 0.0) || + (bgidl <= 0.0) || (T1 <= 0.0) || + (cgidl < 0.0) ) + Igidl = Ggidld = Ggidlg = Ggidlb = 0.0; + else + { + dT1_dVd = 1 / T0; + dT1_dVg = - rgidl*dT1_dVd * dVgs_eff_dVg; + T2 = bgidl / T1; + if (T2 < EXPL_THRESHOLD) + { + Igidl = wdiod * agidl * T1 * exp(-T2); + T3 = Igidl / T1 * (T2 + 1); + Ggidld = T3 * dT1_dVd; + Ggidlg = T3 * dT1_dVg; + } else + { + T3 = wdiod * agidl * MIN_EXPL; + Igidl = T3 * T1 ; + Ggidld = T3 * dT1_dVd; + Ggidlg = T3 * dT1_dVg; + } + T4 = Vbd - fgidl; + if (T4==0) + T5 =1; + else + T5 = kgidl/T4; + T6 = exp(T5); + if (T6B4SOIigidl = Igidl; + /* End of GIDL */ + + } + + + + /* calculate diode and BJT current */ WsTsi = wdios * model->B4SOItsi; @@ -3266,8 +3798,14 @@ for (; model != NULL; model = model->B4SOInextModel) T1 = exp(T0); T3 = WsTsi * jtuns; Ibs4 = T3 * (1- T1); - - dIbs4_dVb = dIbs4_dT = 0; + + /*dIbs4_dVb = dIbs4_dT = 0; */ + dIbs4_dVb = 0.0; + if (selfheat) + dIbs4_dT = (1 - T1) * WsTsi * djtuns_dT; + else + dIbs4_dT = 0; + } else { T1 = 1 / (pParam->B4SOIvtun0 - vbs_jct); @@ -3292,9 +3830,13 @@ for (; model != NULL; model = model->B4SOInextModel) T1 = exp(T0); T3 = WdTsi * jtund; Ibd4 = T3 * (1- T1); - - dIbd4_dVb = dIbd4_dT = 0; + + /*dIbd4_dVb = dIbd4_dT = 0;*/ + dIbd4_dVb = 0; dIbd4_dVd = 0; + if (selfheat) + dIbs4_dT = (1 - T1) * WsTsi * djtuns_dT; + else dIbs4_dT = 0; } else { @@ -3385,6 +3927,7 @@ for (; model != NULL; model = model->B4SOInextModel) if (Voxacc < 0.0) Voxacc = dVoxacc_dVg = dVoxacc_dVb = 0.0; + T0 = Vgs_eff - Vgsteff - Vfbeff - Vbseff; dT0_dVg = dVgs_eff_dVg - dVgsteff_dVg - dVfbeff_dVg - dVbseff_dVg; /* v3.0 */ dT0_dVd = -dVgsteff_dVd - dVbseff_dVd; /* v3.0 */ @@ -3564,7 +4107,6 @@ for (; model != NULL; model = model->B4SOInextModel) dIgs_dVg = T11 * (T2 * dT6_dVg + T6 * dT2_dVg); dIgs_dVs = -dIgs_dVg; - T0 = vgd - pParam->B4SOIvfbsd; vgd_eff = sqrt(T0 * T0 + 1.0e-4); dvgd_eff_dvg = T0 / vgd_eff; @@ -3798,7 +4340,6 @@ for (; model != NULL; model = model->B4SOInextModel) dIgb_dVe = 0.0; /* v3.0 */ dIgb_dT = 0.0; } - here->B4SOIig = Igb; here->B4SOIgigg = dIgb_dVg; here->B4SOIgigd = dIgb_dVd; @@ -3806,14 +4347,79 @@ for (; model != NULL; model = model->B4SOInextModel) here->B4SOIgige = dIgb_dVe; /* v3.0 */ here->B4SOIgigs = -(dIgb_dVg + dIgb_dVd + dIgb_dVb + dIgb_dVe); /* v3.0 */ here->B4SOIgigT = dIgb_dT; + + /* v4.1 */ + /* gate tunneling component in the AGBCP2 region */ + Vfb2 = Vfb + 1.12; + + if ((model->B4SOIigbMod!= 0) && (here->B4SOIsoiMod != 2) && + (here->B4SOIbodyMod != 0) && (here->B4SOIagbcp2 > 0) && + (vgp < Vfb2)) + /* v4.1: the Igb2_agbcp2 calculation is skipped for the ideal FD mode or if there is no "p" node */ + { + /* Vfb, Vfb2 are taken as constants in derivative calculation for simplicity */ + T0 = vgp - Vfb2; + + T1 = sqrt(T0 * T0 + 1.0e-4); + vgp_eff = 0.5 * (-T0 + T1 - 1.0e-2); + dvgp_eff_dvg = 0.5 * (-1.0 + T0 / T1); + dvgp_eff_dvp = -dvgp_eff_dvg; + + /* T11=A* T12=B* */ + T11 = (model->B4SOItype == NMOS) ? 3.42537e-7 : 4.97232e-7; + T12 = (model->B4SOItype == NMOS) ? 1.16645e12 : 7.45669e11; + + T2 = vgp * vgp_eff; + dT2_dVg = vgp * dvgp_eff_dvg + vgp_eff; + dT2_dVp = vgp * dvgp_eff_dvp - vgp_eff; + + T3 = pParam->B4SOIaigbcp2 * pParam->B4SOIcigbcp2 + - pParam->B4SOIbigbcp2; + T4 = pParam->B4SOIbigbcp2 * pParam->B4SOIcigbcp2; + T5 = (-T12) * model->B4SOItoxqm * (pParam->B4SOIaigbcp2 + + T3 * vgp_eff - T4 * vgp_eff * vgp_eff); + if (T5 > EXPL_THRESHOLD) + { + T6 = MAX_EXPL; + dT6_dVg = 0.0; + dT6_dVp = 0.0; + } + else if (T5 < -EXPL_THRESHOLD) + { + T6 = MIN_EXPL; + dT6_dVg = 0.0; + dT6_dVp = 0.0; + } + else + { + T6 = exp(T5); + T7 = T6 * (-T12) * model->B4SOItoxqm * + (T3 - 2.0 * T4 * vgp_eff); + dT6_dVg = T7 * dvgp_eff_dvg; + dT6_dVp = T7 * dvgp_eff_dvg; + } + T11 = T11 * here->B4SOIagbcp2 * pParam->B4SOIoxideRatio; + Ig_agbcp2 = T11 * T2 * T6; + dIg_agbcp2_dVg = T11 * (T2 * dT6_dVg + T6 * dT2_dVg); + dIg_agbcp2_dVp = -dIg_agbcp2_dVg; + } + else { + Ig_agbcp2 = 0.0; + dIg_agbcp2_dVg = 0.0; + dIg_agbcp2_dVp = 0.0; + } + here->B4SOIigp = Ig_agbcp2; + here->B4SOIgigpg = dIg_agbcp2_dVg; + here->B4SOIgigpp = dIg_agbcp2_dVp; + /* end of gate-body tunneling */ /* end of v3.0 gate-tunneling */ - - /* v3.1 */ if (here->B4SOIsoiMod != 2) /* v3.2 */ { + if (model->B4SOIiiiMod == 0 ) + { /* calculate substrate current Iii */ if (pParam->B4SOIalpha0 <= 0.0) { Giig = Giib = Giid = GiiT = 0.0; @@ -3936,7 +4542,247 @@ for (; model != NULL; model = model->B4SOInextModel) GiiT = 0.0; } + } + else /*new Iii model*/ + { + /*Idsmosfet part*/ + if (pParam->B4SOIalpha0 <= 0.0) { + Giig = Giib = Giid = GiiT = 0.0; + Giie = 0; /* v3.0 */ + here->B4SOIiii = Iii = 0.0; + Idsmosfet = 0.0; + dIiibjt_dVb = 0.0; + dIiibjt_dVd = 0.0; + dIiibjt_dT = 0.0; + + } + else { + Vdsatii0 = pParam->B4SOIvdsatii0 * (1 + model->B4SOItii * (TempRatio-1.0)) + - pParam->B4SOIlii / Leff; + if (selfheat) + dVdsatii0_dT = pParam->B4SOIvdsatii0 * model->B4SOItii * dTempRatio_dT; + else + dVdsatii0_dT = 0; + /* Calculate VgsStep */ + T0 = pParam->B4SOIesatii * Leff; /* v3.0 bug fix: T0 is dimentionless (i.e., scaled by 1V) */ + T1 = pParam->B4SOIsii0 * T0 / (1.0 + T0); + + T0 = 1 / (1 + pParam->B4SOIsii1 * Vgsteff); + if (selfheat) + dT0_dT = - pParam->B4SOIsii1 * T0 * T0 *dVgsteff_dT; + else + dT0_dT = 0; + T3 = T0 + pParam->B4SOIsii2; + T4 = Vgst * pParam->B4SOIsii1 * T0 * T0; + T2 = Vgst * T3; + dT2_dVg = T3 * (dVgst_dVg - dVth_dVb * dVbseff_dVg) - T4 * dVgsteff_dVg; /* v3.0 */ + dT2_dVb = T3 * dVgst_dVb * dVbseff_dVb - T4 * dVgsteff_dVb; + dT2_dVe = T3 * dVgst_dVb * dVbseff_dVe - T4 * dVgsteff_dVe; /* v3.0 */ + dT2_dVd = T3 * (dVgst_dVd - dVth_dVb * dVbseff_dVd) - T4 * dVgsteff_dVd; /* v3.0 */ + if (selfheat) + dT2_dT = -(dVth_dT + dVth_dVb * dVbseff_dT) * T3 + Vgst * dT0_dT; /* v3.0 */ + else dT2_dT = 0; + + + T3 = 1 / (1 + pParam->B4SOIsiid * Vds); + dT3_dVd = - pParam->B4SOIsiid * T3 * T3; + + VgsStep = T1 * T2 * T3; + if (selfheat) + dVgsStep_dT = T1 * T3 * dT2_dT; + else dVgsStep_dT = 0; + Vdsatii = Vdsatii0 + VgsStep; + Vdiff = Vds - Vdsatii; + dVdiff_dVg = - T1 * T3 * dT2_dVg; + dVdiff_dVb = - T1 * T3 * dT2_dVb; + dVdiff_dVe = - T1 * T3 * dT2_dVe; /* v3.0 */ + dVdiff_dVd = 1.0 - T1 * (T3 * dT2_dVd + T2 * dT3_dVd); + if (selfheat) + dVdiff_dT = -(dVdsatii0_dT + dVgsStep_dT); + else dVdiff_dT = 0; + + T0 = pParam->B4SOIbeta2 + pParam->B4SOIbeta1 * Vdiff + + pParam->B4SOIbeta0 * Vdiff * Vdiff; + if (T0 < 1e-5) + { + T0 = 1e-5; + dT0_dVg = dT0_dVd = dT0_dVb = dT0_dT = 0.0; + dT0_dVe = 0; /* v3.0 */ + } + else + { + T1 = pParam->B4SOIbeta1 + 2 * pParam->B4SOIbeta0 * Vdiff; + dT0_dVg = T1 * dVdiff_dVg; + dT0_dVb = T1 * dVdiff_dVb; + dT0_dVd = T1 * dVdiff_dVd; + dT0_dVe = T1 * dVdiff_dVe; /* v3.0 */ + if (selfheat) + dT0_dT = T1 * dVdiff_dT; + else + dT0_dT = 0; + } + + if ((T0 < Vdiff / EXPL_THRESHOLD) && (Vdiff > 0.0)) { + Ratio = pParam->B4SOIalpha0 * MAX_EXPL; + dRatio_dVg = dRatio_dVb = dRatio_dVd = dRatio_dT = 0.0; + dRatio_dVe = 0; /* v3.0 */ + } + else if ((T0 < -Vdiff / EXPL_THRESHOLD) && (Vdiff < 0.0)) { + Ratio = pParam->B4SOIalpha0 * MIN_EXPL; + dRatio_dVg = dRatio_dVb = dRatio_dVd = dRatio_dT = 0.0; + dRatio_dVe = 0; /* v3.0 */ + } + else { + Ratio = pParam->B4SOIalpha0 * exp(Vdiff / T0); + T1 = Ratio / T0 / T0; + dRatio_dVg = T1 * (T0 * dVdiff_dVg - Vdiff * dT0_dVg); + dRatio_dVb = T1 * (T0 * dVdiff_dVb - Vdiff * dT0_dVb); + dRatio_dVd = T1 * (T0 * dVdiff_dVd - Vdiff * dT0_dVd); + /* v3.0 */ + dRatio_dVe = T1 * (T0 * dVdiff_dVe - Vdiff * dT0_dVe); + + if (selfheat) + dRatio_dT = T1 * (T0 * dVdiff_dT - Vdiff * dT0_dT); + else + dRatio_dT = 0; + } + + /* Avoid too high ratio */ + if (Ratio > 10.0) { + Ratio = 10.0; + dRatio_dVg = dRatio_dVb = dRatio_dVd = dRatio_dT = 0.0; + dRatio_dVe = 0; /* v3.0 */ + } + + T0 = Ids; + Idsmosfet = Ratio * T0; + } + /*New BJT part*/ + + T0 = (pParam->B4SOIcbjtii + pParam->B4SOIebjtii * Leff)/Leff; + + Vbci= pParam->B4SOIvbci*(1.0+model->B4SOItvbci*(TempRatio-1.0)); + T1 = Vbci - (Vbs - Vds); + + + T2 = pParam->B4SOImbjtii -1.0; + + /* + if(T1 == 0.0) + T3 =1.0; + else + T3 = -pParam->B4SOIabjtii * pow(T1,T2); + */ + + if(T1<=0.0) + T3 = 0.0; + else + T3 = -pParam->B4SOIabjtii * pow(T1,T2); + + + + + + if (T3> EXPL_THRESHOLD) + T4 = MAX_EXPL; + else if (T3 < -EXPL_THRESHOLD) + T4 = MIN_EXPL; + else + T4 = exp(T3); + + + if (T1==0.0) + {if(T3> EXPL_THRESHOLD) + { + dT4_dVd = 0.0; + dT4_dVb = 0.0; + } + else if (T3 < -EXPL_THRESHOLD) + { + dT4_dVd = 0.0; + dT4_dVb = 0.0; + } + else + { + dT4_dVd = - T4 * pParam->B4SOIabjtii* T2 ; + dT4_dVb = T4 * pParam->B4SOIabjtii* T2 ; + } + } + else + { + if(T3> EXPL_THRESHOLD) + { + dT4_dVd = 0.0; + dT4_dVb = 0.0; + } + else if (T3 < -EXPL_THRESHOLD) + { + dT4_dVd = 0.0; + dT4_dVb = 0.0; + } + else + {T5 = T2-1.0; + if (T1<=0.0) + {dT4_dVd = 0.0; + dT4_dVd = 0.0; + + } + else + { + dT4_dVd = - T4 * pParam->B4SOIabjtii* T2 * pow(T1,T5); + dT4_dVb = T4 * pParam->B4SOIabjtii* T2 * pow(T1,T5); + } + } + + } + + Iiibjt = T0 * Ic * T1 * T4; + + if (selfheat) + {T5= T2-1.0; + dVbci_dT = pParam->B4SOIvbci * model->B4SOItvbci *model->B4SOItnom; + if(T1<=0.0) + dT4_dT = 0.0; + else + dT4_dT = -T4 * pParam->B4SOIabjtii* T2 * pow(T1,T5)*dVbci_dT; + + dIiibjt_dT = T0 * Ic * T4 * dVbci_dT + + T0 *Ic *T1 * dT4_dT; + + } + else + { + dVbci_dT = 0.0; + dT4_dT =0.0; + dIiibjt_dT = 0.0; + } + + + dIiibjt_dVd = T0 * Ic *T4 + + T0 *Ic *T1*dT4_dVd; + dIiibjt_dVb = -T0 * Ic *T4 + T0*Ic*T1*dT4_dVb; + + + + + /*Total Iii*/ + T0 = Ids; + here->B4SOIiii = Iii = Idsmosfet + Iiibjt; + + + Giig = Ratio * Gm + T0 * dRatio_dVg; + Giib = Ratio * Gmb + T0 * dRatio_dVb + dIiibjt_dVb; + Giid = Ratio * Gds + T0 * dRatio_dVd + dIiibjt_dVd; + Giie = Ratio * Gme + T0 * dRatio_dVe; + + if (selfheat) + GiiT = Ratio * GmT + T0 * dRatio_dT + + dIiibjt_dT ; + else + GiiT = 0.0; + + } /* Current through body resistor */ /* Current going out is +ve */ @@ -3989,12 +4835,13 @@ for (; model != NULL; model = model->B4SOInextModel) here->B4SOIcdrain = Ids + Ic; here->B4SOIcd = Ids + Ic - Ibd + Iii + Igidl; - here->B4SOIcb = Ibs + Ibd + Ibp - Iii - Igidl - Igb; + here->B4SOIcb = Ibs + Ibd + Ibp - Iii - Igidl - Igisl - Igb; here->B4SOIgds = Gds + Gcd; here->B4SOIgm = Gm; here->B4SOIgmbs = Gmb + Gcb; /* v3.0 */ here->B4SOIgme = Gme; + /* v3.1 for RF */ /* Calculate Rg */ @@ -4181,9 +5028,9 @@ for (; model != NULL; model = model->B4SOInextModel) /* Body current which flows into drainprime node from the drain of device */ - here->B4SOIgjdb = Gjdb - Giib -Ggidlb; /* v4.0 */ + here->B4SOIgjdb = Gjdb - Giib -Ggidlb - Ggislb; /* v4.0 */ here->B4SOIgjdd = Gjdd - (Giid + Ggidld); - here->B4SOIgjdg = - (Giig + Ggidlg); + here->B4SOIgjdg = - (Giig + Ggidlg + Ggislg); here->B4SOIgjde = - Giie; if (selfheat) here->B4SOIgjdT = GjdT - GiiT; else here->B4SOIgjdT = 0.0; @@ -4201,11 +5048,11 @@ for (; model != NULL; model = model->B4SOInextModel) } else { - here->B4SOIgiigidlb = Giib + Ggidlb; + here->B4SOIgiigidlb = Giib + Ggidlb + Ggislb; here->B4SOIgiigidld = Giid + Ggidld; - Giigidl_b = - Giib -Ggidlb; + Giigidl_b = - Giib -Ggidlb - Ggislb; Giigidl_d = - Giid -Ggidld; - Giigidl_g = - Giig -Ggidlg; + Giigidl_g = - Giig -Ggidlg - Ggislg; Giigidl_e = - Giie; if (selfheat) Giigidl_T = -GiiT; else GiiT = Giigidl_T = 0.0; @@ -4226,7 +5073,7 @@ for (; model != NULL; model = model->B4SOInextModel) here->B4SOIgjsb = Gjsb; /* v4.0 */ if (selfheat) here->B4SOIgjsT = GjsT; else here->B4SOIgjsT = 0.0; - here->B4SOIcjs = Ibs + here->B4SOIcjs = Ibs - Igisl -( here->B4SOIgjsb * Vbs + here->B4SOIgjsd * Vds + here->B4SOIgjsg * Vgs @@ -4240,8 +5087,8 @@ for (; model != NULL; model = model->B4SOInextModel) /* Current flowing into body node */ here->B4SOIgbbs = Giib - Gjsb - Gjdb - Gbpbs; - here->B4SOIgbgs = Giig + Ggidlg ; - here->B4SOIgbds = Giid + Ggidld - Gjsd - Gjdd; + here->B4SOIgbgs = Giig + Ggidlg + Ggislg; + here->B4SOIgbds = Giid + Ggidld + Ggisls - Gjsd - Gjdd; here->B4SOIgbes = Giie; here->B4SOIgbps = - Gbpps; if (selfheat) here->B4SOIgbT = GiiT - GjsT - GjdT; @@ -4249,7 +5096,7 @@ for (; model != NULL; model = model->B4SOInextModel) if (!here->B4SOIrbodyMod) { - here->B4SOIcbody = Iii + Igidl - Ibs - Ibd + here->B4SOIcbody = Iii + Igidl + Igisl - Ibs - Ibd - Ibp + Igb - ( (here->B4SOIgbbs + dIgb_dVb) * Vbs + (here->B4SOIgbgs + dIgb_dVg) * Vgs @@ -4262,10 +5109,10 @@ for (; model != NULL; model = model->B4SOInextModel) if (here->B4SOIrbodyMod) { here->B4SOIgbgiigbpb = Giib - Gbpbs; - here->B4SOIcbody = Iii + Igidl - Ibp + Igb + here->B4SOIcbody = Iii + Igidl + Igisl - Ibp + Igb - ( (Giib - Gbpbs + dIgb_dVb) * Vbs + (here->B4SOIgbgs + dIgb_dVg) * Vgs - + (Giid + Ggidld + dIgb_dVd) * Vds + + (Giid + Ggidld + + Ggisls + dIgb_dVd) * Vds + here->B4SOIgbps * Vps + (here->B4SOIgbes + dIgb_dVe) * Ves + (GiiT + dIgb_dT) * delTemp ); @@ -4329,7 +5176,7 @@ for (; model != NULL; model = model->B4SOInextModel) here->B4SOIgbT *= here->B4SOInf; here->B4SOIigidl *= here->B4SOInf; - + here->B4SOIigisl *= here->B4SOInf; } here->B4SOIgigs = -(here->B4SOIgigg + here->B4SOIgigd + here->B4SOIgigb + here->B4SOIgige); @@ -4338,7 +5185,6 @@ for (; model != NULL; model = model->B4SOInextModel) here->B4SOIgIgcds = -(here->B4SOIgIgcdg + here->B4SOIgIgcdd + here->B4SOIgIgcdb); - /* Begin CV (charge) model */ if ((model->B4SOIxpart < 0) || (!ChargeComputationNeeded)) @@ -4357,31 +5203,276 @@ for (; model != NULL; model = model->B4SOInextModel) * (pParam->B4SOIweffCV / here->B4SOInseg * here->B4SOInf /* v4.0 */ * pParam->B4SOIleffCVb + here->B4SOIagbcp); +/* v4.1 for improved BT charge model */ + + CoxWL2 = model->B4SOIcox * here->B4SOIagbcp2; + CoxWLb2 = model->B4SOIfbody * model->B4SOIcox * here->B4SOIagbcp2; +/* end v4.1 */ /* v3.2 Seperate VgsteffCV with noff */ - noff = n * pParam->B4SOInoff; +noff = n * pParam->B4SOInoff; dnoff_dVd = pParam->B4SOInoff * dn_dVd; dnoff_dVb = pParam->B4SOInoff * dn_dVb; + if (model->B4SOIvgstcvMod == 0) + { + if ((VgstNVt > -EXPL_THRESHOLD) && (VgstNVt < EXPL_THRESHOLD)) + { + ExpVgst *= ExpVgst; + ExpVgst *= exp( -(pParam->B4SOIdelvt / (noff * Vtm))); + Vgsteff = noff * Vtm * log(1.0 + ExpVgst); + + T0 = ExpVgst / (1.0 + ExpVgst); + T1 = -T0 * (dVth_dVb + (Vgst-pParam->B4SOIdelvt) / noff * dnoff_dVb) + + Vgsteff / noff * dnoff_dVb; + dVgsteff_dVd = -T0 * (dVth_dVd + dVth_dVb*dVbseff_dVd + Vgst / noff * dnoff_dVd) + + Vgsteff / noff * dnoff_dVd; + dVgsteff_dVg = T0 * (dVgs_eff_dVg - dVth_dVb*dVbseff_dVg); + dVgsteff_dVb = T1 * dVbseff_dVb; + dVgsteff_dVe = T1 * dVbseff_dVe; + if (selfheat) + dVgsteff_dT = -T0 * (dVth_dT+dVth_dVb*dVbseff_dT + + (Vgst - pParam->B4SOIdelvt) / Temp) + + Vgsteff / Temp; + else dVgsteff_dT = 0.0; +/* v4.1 */ + if (here->B4SOIagbcp2 > 0) { + ExpVgst2 = ExpVgst * exp(-1.12 / noff / Vtm); + Vgsteff2 = noff * Vtm * log(1.0 + ExpVgst2); + T02 = ExpVgst2 / (1.0 + ExpVgst2); + T12 = -T02 * (dVth_dVb + (Vgst-Eg-pParam->B4SOIdelvt) / noff * dnoff_dVb) + + Vgsteff2 / noff * dnoff_dVb; + dVgsteff2_dVd = -T02 * (dVth_dVd + dVth_dVb*dVbseff_dVd + (Vgst - 1.12) / noff * dnoff_dVd) + + Vgsteff2 / noff * dnoff_dVd; + dVgsteff2_dVg = T02 * (dVgs_eff_dVg - dVth_dVb*dVbseff_dVg); + dVgsteff2_dVb = T12 * dVbseff_dVb; + dVgsteff2_dVe = T12 * dVbseff_dVe; + if (selfheat) + dVgsteff2_dT = -T02 * (dVth_dT+dVth_dVb*dVbseff_dT + + (Vgst - 1.12 - pParam->B4SOIdelvt) / Temp) + + Vgsteff2 / Temp; + else dVgsteff2_dT = 0.0; + } + } + } + else if (model->B4SOIvgstcvMod == 1) + {ExpVgst = exp(VgstNVt/(pParam->B4SOImstar * pParam->B4SOInoff)); + ExpVgst *= exp( -(pParam->B4SOIdelvt / (noff * Vtm))); + Vgsteff = noff * Vtm * log(1.0 + ExpVgst); + + T0 = ExpVgst / (1.0 + ExpVgst); + T1 = -T0 * (dVth_dVb + (Vgst-pParam->B4SOIdelvt) / noff * dnoff_dVb) + + Vgsteff / noff * dnoff_dVb; + dVgsteff_dVd = -T0 * (dVth_dVd + dVth_dVb*dVbseff_dVd + Vgst / noff * dnoff_dVd) + + Vgsteff / noff * dnoff_dVd; + dVgsteff_dVg = T0 * (dVgs_eff_dVg - dVth_dVb*dVbseff_dVg); + + dVgsteff_dVb = T1 * dVbseff_dVb; + dVgsteff_dVe = T1 * dVbseff_dVe; + if (selfheat) + dVgsteff_dT = -T0 * (dVth_dT+dVth_dVb*dVbseff_dT + + (Vgst - pParam->B4SOIdelvt) / Temp) + + Vgsteff / Temp; + else dVgsteff_dT = 0.0; +/* v4.1 */ + if (here->B4SOIagbcp2 > 0) { + ExpVgst2 = ExpVgst * exp(-1.12 / noff / Vtm); + Vgsteff2 = noff * Vtm * log(1.0 + ExpVgst2); + T02 = ExpVgst2 / (1.0 + ExpVgst2); + T12 = -T02 * (dVth_dVb + (Vgst-Eg-pParam->B4SOIdelvt) / noff * dnoff_dVb) + + Vgsteff2 / noff * dnoff_dVb; + dVgsteff2_dVd = -T02 * (dVth_dVd + dVth_dVb*dVbseff_dVd + (Vgst - 1.12) / noff * dnoff_dVd) + + Vgsteff2 / noff * dnoff_dVd; + dVgsteff2_dVg = T02 * (dVgs_eff_dVg - dVth_dVb*dVbseff_dVg); + dVgsteff2_dVb = T12 * dVbseff_dVb; + dVgsteff2_dVe = T12 * dVbseff_dVe; + if (selfheat) + dVgsteff2_dT = -T02 * (dVth_dT+dVth_dVb*dVbseff_dT + + (Vgst - 1.12 - pParam->B4SOIdelvt) / Temp) + + Vgsteff2 / Temp; + else dVgsteff2_dT = 0.0; + } - if ((VgstNVt > -EXPL_THRESHOLD) && (VgstNVt < EXPL_THRESHOLD)) - { ExpVgst *= ExpVgst; - ExpVgst *= exp( -(pParam->B4SOIdelvt / (noff * Vtm))); - Vgsteff = noff * Vtm * log(1.0 + ExpVgst); - T0 = ExpVgst / (1.0 + ExpVgst); - T1 = -T0 * (dVth_dVb + (Vgst-pParam->B4SOIdelvt) / noff * dnoff_dVb) - + Vgsteff / noff * dnoff_dVb; - dVgsteff_dVd = -T0 * (dVth_dVd + dVth_dVb*dVbseff_dVd + Vgst / noff * dnoff_dVd) - + Vgsteff / noff * dnoff_dVd; - dVgsteff_dVg = T0 * (dVgs_eff_dVg - dVth_dVb*dVbseff_dVg); - dVgsteff_dVb = T1 * dVbseff_dVb; - dVgsteff_dVe = T1 * dVbseff_dVe; - if (selfheat) - dVgsteff_dT = -T0 * (dVth_dT+dVth_dVb*dVbseff_dT - + (Vgst - pParam->B4SOIdelvt) / Temp) - + Vgsteff / Temp; - else dVgsteff_dT = 0.0; - } + + } + else + { + T10 = noff * Vtm; + VgstNVt = pParam->B4SOImstarcv * (Vgst - pParam->B4SOIdelvt) / T10; + ExpArg = (pParam->B4SOIvoffcv - + (1- pParam->B4SOImstarcv) * (Vgst - pParam->B4SOIdelvt))/ T10; + + /* MCJ: Very small Vgst */ + if (VgstNVt > EXPL_THRESHOLD) + { Vgsteff = Vgst - pParam->B4SOIdelvt; + /* T0 is dVgsteff_dVbseff */ + T0 = -dVth_dVb; + dVgsteff_dVg = dVgs_eff_dVg + T0 * dVbseff_dVg; + dVgsteff_dVd = -dVth_dVd + T0 * dVbseff_dVd; + dVgsteff_dVb = T0 * dVbseff_dVb; + dVgsteff_dVe = T0 * dVbseff_dVe; + if (selfheat) + dVgsteff_dT = -dVth_dT + T0 * dVbseff_dT; + else + dVgsteff_dT = 0.0; + } + else if (ExpArg > EXPL_THRESHOLD) + { T0 = (Vgst - pParam->B4SOIdelvt - pParam->B4SOIvoffcv) / (noff * Vtm); + ExpVgst = exp(T0); + Vgsteff = Vtm * pParam->B4SOIcdep0 / model->B4SOIcox * ExpVgst; + T3 = Vgsteff / (noff * Vtm) ; + /* T1 is dVgsteff_dVbseff */ + T1 = -T3 * (dVth_dVb + T0 * Vtm * dnoff_dVb); + dVgsteff_dVg = T3 * dVgs_eff_dVg+ T1 * dVbseff_dVg; + dVgsteff_dVd = -T3 * (dVth_dVd + T0 * Vtm * dnoff_dVd)+ T1 * dVbseff_dVd; + dVgsteff_dVe = T1 * dVbseff_dVe; + dVgsteff_dVb = T1 * dVbseff_dVb; + if (selfheat) + dVgsteff_dT = -T3 * (dVth_dT + T0 * dVtm_dT * noff) + + Vgsteff / Temp+ T1 * dVbseff_dT; + else + dVgsteff_dT = 0.0; + } + else + { + ExpVgst = exp(VgstNVt); + T1 = T10 * log(1.0 + ExpVgst); + dT1_dVg = ExpVgst / (1.0 + ExpVgst) * pParam->B4SOImstarcv; + dT1_dVb = -dT1_dVg * (dVth_dVb + Vgst / noff * dnoff_dVb) + + T1 / noff * dnoff_dVb; + dT1_dVd = -dT1_dVg * (dVth_dVd + Vgst / noff * dnoff_dVd) + + T1 / noff * dnoff_dVd; + T3 = (1.0 / Temp); + if (selfheat) + dT1_dT = -dT1_dVg * (dVth_dT + Vgst * T3) + T1 * T3; + else + dT1_dT = 0.0; + + dT2_dVg = -model->B4SOIcox / (Vtm * pParam->B4SOIcdep0) + * exp(ExpArg) * (1 - pParam->B4SOImstarcv); + T2 = pParam->B4SOImstarcv - T10 * dT2_dVg + / (1.0 - pParam->B4SOImstarcv); + dT2_dVd = -dT2_dVg * (dVth_dVd - Vtm * ExpArg * dnoff_dVd + / (1.0 - pParam->B4SOImstarcv)) + + (T2 - pParam->B4SOImstarcv) / noff * dnoff_dVd; + dT2_dVb = -dT2_dVg * (dVth_dVb - Vtm * ExpArg * dnoff_dVb + / (1.0 - pParam->B4SOImstarcv)) + + (T2 - pParam->B4SOImstarcv) / noff * dnoff_dVb; + if (selfheat) + dT2_dT = -dT2_dVg * ( dVth_dT - ExpArg * T10 * T3 + / (1.0 - pParam->B4SOImstarcv) ); + else + dT2_dT = 0.0; + + Vgsteff = T1 / T2; + + T3 = T2 * T2; + /* T4 is dVgsteff_dVbseff */ + T4 = (T2 * dT1_dVb - T1 * dT2_dVb) / T3; + dVgsteff_dVb = T4 * dVbseff_dVb; + dVgsteff_dVe = T4 * dVbseff_dVe; + dVgsteff_dVg = (T2 * dT1_dVg - T1 * dT2_dVg) + / T3 * dVgs_eff_dVg + + T4 * dVbseff_dVg; + + dVgsteff_dVd = (T2 * dT1_dVd - T1 * dT2_dVd) + / T3+ T4 * dVbseff_dVd; + if (selfheat) + dVgsteff_dT = (T2 * dT1_dT - T1 * dT2_dT) + / T3+ T4 * dVbseff_dT; + else + dVgsteff_dT = 0.0; + } + + + + if (here->B4SOIagbcp2 > 0) + { + VgstNVt2 = pParam->B4SOImstarcv * (Vgst - pParam->B4SOIdelvt - 1.12) / T10; + ExpArg2 = (pParam->B4SOIvoffcv - + (1- pParam->B4SOImstarcv) * (Vgst - pParam->B4SOIdelvt - 1.12))/ T10; + + /* MCJ: Very small Vgst */ + if (VgstNVt2 > EXPL_THRESHOLD) + { Vgsteff2 = Vgst - pParam->B4SOIdelvt - 1.12; + /* T0 is dVgsteff2_dVbseff */ + T0 = -dVth_dVb; + dVgsteff2_dVg = dVgs_eff_dVg + T0 * dVbseff_dVg; + dVgsteff2_dVd = -dVth_dVd + T0 * dVbseff_dVd; + dVgsteff2_dVb = T0 * dVbseff_dVb; + dVgsteff2_dVe = T0 * dVbseff_dVe; + if (selfheat) + dVgsteff2_dT = -dVth_dT + T0 * dVbseff_dT; + else + dVgsteff2_dT = 0.0; + } + else if (ExpArg2 > EXPL_THRESHOLD) + { T0 = (Vgst - pParam->B4SOIdelvt - pParam->B4SOIvoffcv - 1.12) / (noff * Vtm); + ExpVgst2 = exp(T0); + Vgsteff2 = Vtm * pParam->B4SOIcdep0 / model->B4SOIcox * ExpVgst; + T3 = Vgsteff2 / (noff * Vtm) ; + /* T1 is dVgsteff2_dVbseff */ + T1 = -T3 * (dVth_dVb + T0 * Vtm * dnoff_dVb); + dVgsteff2_dVg = T3 * dVgs_eff_dVg+ T1 * dVbseff_dVg; + dVgsteff2_dVd = -T3 * (dVth_dVd + T0 * Vtm * dnoff_dVd)+ T1 * dVbseff_dVd; + dVgsteff2_dVe = T1 * dVbseff_dVe; + dVgsteff2_dVb = T1 * dVbseff_dVb; + if (selfheat) + dVgsteff2_dT = -T3 * (dVth_dT + T0 * dVtm_dT * noff) + + Vgsteff2 / Temp+ T1 * dVbseff_dT; + else + dVgsteff2_dT = 0.0; + } + else + { ExpVgst2 = exp(VgstNVt2); + T1 = T10 * log(1.0 + ExpVgst2); + dT1_dVg = ExpVgst2 / (1.0 + ExpVgst2) * pParam->B4SOImstarcv; + dT1_dVb = -dT1_dVg * (dVth_dVb + Vgst / noff * dnoff_dVb) + + T1 / noff * dnoff_dVb; + dT1_dVd = -dT1_dVg * (dVth_dVd + Vgst / noff * dnoff_dVd) + + T1 / noff * dnoff_dVd; + T3 = (1.0 / Temp); + if (selfheat) + dT1_dT = -dT1_dVg * (dVth_dT + Vgst * T3) + T1 * T3; + else + dT1_dT = 0.0; + + dT2_dVg = -model->B4SOIcox / (Vtm * pParam->B4SOIcdep0) + * exp(ExpArg2) * (1 - pParam->B4SOImstarcv); + T2 = pParam->B4SOImstarcv - T10 * dT2_dVg + / (1.0 - pParam->B4SOImstarcv); + dT2_dVd = -dT2_dVg * (dVth_dVd - Vtm * ExpArg2 * dnoff_dVd + / (1.0 - pParam->B4SOImstarcv)) + + (T2 - pParam->B4SOImstarcv) / noff * dnoff_dVd; + dT2_dVb = -dT2_dVg * (dVth_dVb - Vtm * ExpArg2 * dnoff_dVb + / (1.0 - pParam->B4SOImstarcv)) + + (T2 - pParam->B4SOImstarcv) / noff * dnoff_dVb; + if (selfheat) + dT2_dT = -dT2_dVg * ( dVth_dT - ExpArg2 * T10 * T3 + / (1.0 - pParam->B4SOImstarcv) ); + else + dT2_dT = 0.0; + + Vgsteff2 = T1 / T2; + T3 = T2 * T2; + /* T4 is dVgsteff2_dVbseff */ + T4 = (T2 * dT1_dVb - T1 * dT2_dVb) / T3; + dVgsteff2_dVb = T4 * dVbseff_dVb; + dVgsteff2_dVe = T4 * dVbseff_dVe; + dVgsteff2_dVg = (T2 * dT1_dVg - T1 * dT2_dVg) + / T3 * dVgs_eff_dVg + + T4 * dVbseff_dVg; + dVgsteff2_dVd = (T2 * dT1_dVd - T1 * dT2_dVd) + / T3+ T4 * dVbseff_dVd; + if (selfheat) + dVgsteff2_dT = (T2 * dT1_dT - T1 * dT2_dT) + / T3+ T4 * dVbseff_dT; + else + dVgsteff2_dT = 0.0; + } + } + } +/* v3.2 */ /* v3.2 */ @@ -4392,7 +5483,9 @@ for (; model != NULL; model = model->B4SOInextModel) if (here->B4SOIsoiMod == 2) /* v3.2 */ /* ideal FD */ { Qac0 = dQac0_dVrg = dQac0_dVd = dQac0_dVb = dQac0_dT = 0.0; + dQac02_dVrg = dQac02_dVd = dQac02_dVb = dQac02_dT = 0.0; Qsub0 = dQsub0_dVrg = dQsub0_dVg = dQsub0_dVd = dQsub0_dVb = dQsub0_dT = 0.0; + dQsub02_dVrg = dQsub02_dVg = dQsub02_dVd = dQsub02_dVb = dQsub02_dT = 0.0; } else /* soiMod = 0 or 1 */ { @@ -4425,8 +5518,41 @@ for (; model != NULL; model = model->B4SOInextModel) dQac0_dVb = CoxWLb * (dVfbeff_dVb - dVfb_dVb); if (selfheat) dQac0_dT = CoxWLb * (dVfbeff_dT - dVfb_dT); else dQac0_dT = 0.0; - - T0 = 0.5 * pParam->B4SOIk1ox; +/* v4.1 */ + if (here->B4SOIagbcp2 > 0) + { + Vfb2 = Vfb + 1.12; + dVfb2_dVb = dVfb_dVb; + dVfb2_dVd = dVfb_dVd; + dVfb2_dT = dVfb_dT; + DELTA_3_SOI2 = DELTA_3_SOI; + V3 = Vfb2 - Vgs_eff2 + Vbseff - DELTA_3_SOI2; + if (Vfb2 <= 0.0) + { T0 = sqrt(V3 * V3 - 100.0 * DELTA_3_SOI2 * Vfb2); + T2 = -DELTA_3_SOI2 / T0; + } + else + { T0 = sqrt(V3 * V3 + 100.0 * DELTA_3_SOI2 * Vfb2); + T2 = DELTA_3_SOI2 / T0; + } + T1 = 0.5 * (1.0 + V3 / T0); + Vfbeff2 = Vfb2 - 0.5 * (V3 + T0); + dVfbeff2_dVd = (1.0 - T1 - 25.0 * T2) * dVfb2_dVd; + dVfbeff2_dVb = (1.0 - T1 - 25.0 * T2) * dVfb2_dVb - T1; + dVfbeff2_dVrg = T1 * dVgs_eff2_dVg; + if (selfheat) dVfbeff2_dT = (1.0 - T1 - T2) * dVfb2_dT; + else dVfbeff2_dT = 0.0; + + Qac0 += CoxWLb2 * (Vfbeff2 - Vfb2); + dQac02_dVrg = CoxWLb2 * dVfbeff2_dVrg; + dQac02_dVd = CoxWLb2 * (dVfbeff2_dVd - dVfb2_dVd); + dQac02_dVb = CoxWLb2 * (dVfbeff2_dVb - dVfb2_dVb); + if (selfheat) + dQac02_dT = CoxWLb2 * (dVfbeff2_dT - dVfb2_dT); + else dQac02_dT = 0.0; + } +/* end v4.1 */ + T0 = 0.5 * pParam->B4SOIk1ox; T3 = Vgs_eff - Vfbeff - Vbseff - Vgsteff; if (pParam->B4SOIk1ox == 0.0) { T1 = 0.0; @@ -4441,13 +5567,32 @@ for (; model != NULL; model = model->B4SOInextModel) T2 = CoxWLb * T0 / T1; } - Qsub0 = CoxWLb * K1 * (T1 - T0); + Qsub0 = CoxWLb * pParam->B4SOIk1ox * (T1 - T0); /* 4.1 bug fix */ dQsub0_dVrg = T2 * (dVgs_eff_dVg - dVfbeff_dVrg); dQsub0_dVg = -T2; dQsub0_dVd = -T2 * dVfbeff_dVd; dQsub0_dVb = -T2 * (dVfbeff_dVb + 1); if (selfheat) dQsub0_dT = -T2 * dVfbeff_dT; else dQsub0_dT = 0.0; +/* v4.1 */ + if (here->B4SOIagbcp2 > 0) + { T3 = Vgs_eff2- Vfbeff2 - Vbseff - Vgsteff2; + if (T3 < 0.0) + { T1 = T0 + T3 / pParam->B4SOIk1ox; + T2 = CoxWLb2; + } + else + { T1 = sqrt(T0 * T0 + T3); + T2 = CoxWLb2 * T0 / T1; + } + Qsub0 += CoxWLb2 * pParam->B4SOIk1ox * (T1 - T0); + dQsub02_dVrg = T2 * (dVgs_eff2_dVg - dVfbeff2_dVrg); + dQsub02_dVg = -T2; + dQsub02_dVd = -T2 * dVfbeff2_dVd; + dQsub02_dVb = -T2 * (dVfbeff2_dVb + 1); + if (selfheat) dQsub02_dT = -T2 * dVfbeff2_dT; + else dQsub02_dT = 0.0; + } } /* v3.1 */ @@ -4470,12 +5615,28 @@ for (; model != NULL; model = model->B4SOInextModel) dVdseffCV_dVd = T1; dVdseffCV_dVb = -T3 * VdsatCV * dAbulkCV_dVb; - +/* v4.1 */ + if (here->B4SOIagbcp2 > 0) + { VdsatCV2 = Vgsteff2 / AbulkCV; + dVdsatCV2_dVg = 1.0 / AbulkCV; + dVdsatCV2_dVb = -VdsatCV2 * dAbulkCV_dVb / AbulkCV; + V4 = VdsatCV2 - Vds - DELTA_4; + T0 = sqrt(V4 * V4 + 4.0 * DELTA_4 * VdsatCV2); + VdseffCV2 = VdsatCV2 - 0.5 * (V4 + T0); + T1 = 0.5 * (1.0 + V4 / T0); + T2 = DELTA_4 / T0; + T3 = (1.0 - T1 - T2) / AbulkCV; + dVdseffCV2_dVg = T3; + dVdseffCV2_dVd = T1; + dVdseffCV2_dVb = -T3 * VdsatCV2 * dAbulkCV_dVb; + } +/* end v4.1 */ /* v3.1 */ if (here->B4SOIsoiMod == 2) /* v3.2 */ /* ideal FD */ { qbulk = Cbg1 = Cbd1 = Cbb1 = 0; + Cbg12 = Cbd12 = Cbb12 = 0; /* v4.1 */ } else { @@ -4496,6 +5657,25 @@ for (; model != NULL; model = model->B4SOInextModel) Cbg1 = CoxWLb * (T4 + T5 * dVdseffCV_dVg); Cbd1 = CoxWLb * T5 * dVdseffCV_dVd ; Cbb1 = CoxWLb * (T5 * dVdseffCV_dVb + T6 * dAbulkCV_dVb); + /* v4.1 */ + if (here->B4SOIagbcp2 > 0) + { T0 = AbulkCV * VdseffCV2; + T1 = 12.0 * (Vgsteff2 - 0.5 * T0 + 1e-20); + T2 = VdseffCV2 / T1; + T3 = T0 * T2; + T4 = (1.0 - 12.0 * T2 * T2 * AbulkCV); + T5 = (6.0 * T0 * (4.0 * Vgsteff2 - T0) / (T1 * T1) - 0.5); + T6 = 12.0 * T2 * T2 * Vgsteff2; + T7 = 1.0 - AbulkCV; + qbulk += CoxWLb2 * T7 * (0.5 * VdseffCV2 - T3); + T4 = -T7 * (T4 - 1.0); + T5 = -T7 * T5; + T6 = -(T7 * T6 + (0.5 * VdseffCV2 - T3)); + Cbg12 = CoxWLb2 * (T4 + T5 * dVdseffCV2_dVg); + Cbd12 = CoxWLb2 * T5 * dVdseffCV2_dVd ; + Cbb12 = CoxWLb2 * (T5 * dVdseffCV2_dVb + T6 * dAbulkCV_dVb); + } +/* end v4.1 */ } /* v3.1 */ @@ -4528,7 +5708,27 @@ for (; model != NULL; model = model->B4SOInextModel) Cgg1 = CoxWL * (T4 + T5 * dVdseffCV_dVg); Cgd1 = CoxWL * T5 * dVdseffCV_dVd; Cgb1 = CoxWL * (T5 * dVdseffCV_dVb + T6 * dAbulkCV_dVb); - +/* v4.1 */ + if (here->B4SOIagbcp2 > 0) + { + T02 = AbulkCV * VdseffCV2; + T12 = 12.0 * (Vgsteff2 - 0.5 * T02 + 1e-20); + T2 = T02 / T12; + T3 = T02 * T2; + T4 = (1.0 - 12.0 * T2 * T2); + T7 = T2 * (2.0 + 6.0 * T2) - 0.5; + + T5 = T7 * AbulkCV; + T6 = T7 * VdseffCV2; + + qinv += CoxWL2 * (Vgsteff2 - 0.5 * T02 + T3); + here->B4SOIqinv = -qinv; + + Cgg12 = CoxWL2 * (T4 + T5 * dVdseffCV2_dVg); + Cgd12 = CoxWL2 * T5 * dVdseffCV2_dVd; + Cgb12 = CoxWL2 * (T5 * dVdseffCV2_dVb + T6 * dAbulkCV_dVb); + } +/* end v4.1 */ /* Inversion charge partitioning into S / D */ if (model->B4SOIxpart > 0.5) { /* 0/100 Charge partition model */ @@ -4543,6 +5743,22 @@ for (; model != NULL; model = model->B4SOInextModel) Csd1 = CoxWL * T5 * dVdseffCV_dVd; Csb1 = CoxWL * (T5 * dVdseffCV_dVb + T6 * dAbulkCV_dVb); +/* v4.1 */ + if (here->B4SOIagbcp2 > 0) + { + T12 = T12 + T12; + qsrc += -CoxWL2 * (0.5 * Vgsteff2 + 0.25 * T02 + - T02 * T02 / T12); + T7 = (4.0 * Vgsteff2 - T02) / (T12 * T12); + T4 = -(0.5 + 24.0 * T02 * T02 / (T12 * T12)); + T5 = -(0.25 * AbulkCV - 12.0 * AbulkCV * T02 * T7); + T6 = -(0.25 * VdseffCV2 - 12.0 * T02 * VdseffCV2 * T7); + Csg12 = CoxWL2 * (T4 + T5 * dVdseffCV2_dVg); + Csd12 = CoxWL2 * T5 * dVdseffCV2_dVd; + Csb12 = CoxWL2 * (T5 * dVdseffCV2_dVb + T6 * dAbulkCV_dVb); + } +/* end v4.1 */ + } else if (model->B4SOIxpart < 0.5) { /* 40/60 Charge partition model */ @@ -4562,6 +5778,30 @@ for (; model != NULL; model = model->B4SOInextModel) Csg1 = T4 + T5 * dVdseffCV_dVg; Csd1 = T5 * dVdseffCV_dVd; Csb1 = T5 * dVdseffCV_dVb + T6 * dAbulkCV_dVb; +/* v4.1 */ + if (here->B4SOIagbcp2 >0) + { + T12 = T12 /12.0; + T2 = 0.5 * CoxWL2 / (T12 * T12); + T3 = Vgsteff2 * (2.0 * T02 * T02 / 3.0 + Vgsteff2 + * (Vgsteff2 - 4.0 * T02 / 3.0)) + - 2.0 * T02 * T02 * T02 / 15.0; + qsrc2 = -T2 * T3; + + T7 = 4.0 / 3.0 * Vgsteff2 * (Vgsteff2 - T02) + + 0.4 * T02 * T02; + T4 = -2.0 * qsrc2 / T12 - T2 * (Vgsteff2 * (3.0 + * Vgsteff2 - 8.0 * T02 / 3.0) + + 2.0 * T02 * T02 / 3.0); + T5 = (qsrc2 / T12 + T2 * T7) * AbulkCV; + T6 = (qsrc2 / T12 * VdseffCV2 + T2 * T7 * VdseffCV2); + Csg12 = T4 + T5 * dVdseffCV2_dVg; + Csd12 = T5 * dVdseffCV2_dVd; + Csb12 = T5 * dVdseffCV2_dVb + T6 * dAbulkCV_dVb; + qsrc += qsrc2; + } + +/* end v4.1 */ } else { /* 50/50 Charge partition model */ @@ -4569,6 +5809,14 @@ for (; model != NULL; model = model->B4SOInextModel) Csg1 = - 0.5 * (Cgg1 + Cbg1); Csb1 = - 0.5 * (Cgb1 + Cbb1); Csd1 = - 0.5 * (Cgd1 + Cbd1); +/* v4.1 */ + if (here->B4SOIagbcp2 >0) + { + Csg12 = -0.5 * (Cgg12 + Cbg12); + Csb12 = -0.5 * (Cgb12 + Cbb12); + Csd12 = -0.5 * (Cgd12 + Cbd12); + } +/* end v4.1 */ } @@ -4630,7 +5878,34 @@ for (; model != NULL; model = model->B4SOInextModel) CbT = (Cbg1 - dQsub0_dVg) * dVgsteff_dT - dQac0_dT - dQsub0_dT - dQe1_dT; else CbT = 0.0; +/* v4.1 */ + if (here->B4SOIagbcp2 >0) { + Csg += Csg12 * dVgsteff2_dVg; + Csd += Csd12 + Csg12 * dVgsteff2_dVd; + Csb += Csg12 * dVgsteff2_dVb + Csb12 * dVbseff_dVb; + if (selfheat) CsT += Csg12 * dVgsteff2_dT; + Cgg += (Cgg12 + dQsub02_dVg) * dVgsteff2_dVg + + dQac02_dVrg + dQsub02_dVrg; + Cgd += (Cgg12 + dQsub02_dVg) * dVgsteff2_dVd + Cgd12 + + dQac02_dVd + dQsub02_dVd; + Cgb += (Cgg12 + dQsub02_dVg) * dVgsteff2_dVb + + (Cgb12 + dQsub02_dVb + dQac02_dVb) * dVbseff_dVb; + if (selfheat) + CgT += (Cgg12 + dQsub02_dVg) * dVgsteff2_dT + + dQac02_dT + dQsub02_dT; + + Cbg += (Cbg12 - dQsub02_dVg) * dVgsteff2_dVg + - dQac02_dVrg - dQsub02_dVrg; + Cbd += (Cbg12 - dQsub02_dVg) * dVgsteff2_dVd + Cbd12 + - dQac02_dVd - dQsub02_dVd; + Cbb += (Cbg12 - dQsub02_dVg) * dVgsteff2_dVb + + (Cbb12 - dQsub02_dVb - dQac02_dVb) * dVbseff_dVb; + if (selfheat) + CbT += (Cbg12 - dQsub02_dVg) * dVgsteff2_dT + - dQac02_dT - dQsub02_dT; + } +/* end v4.1 */ here->B4SOIcggb = Cgg ; here->B4SOIcgsb = - (Cgg + Cgd + Cgb); @@ -4660,17 +5935,32 @@ for (; model != NULL; model = model->B4SOInextModel) { dVgsteff_dVb /= dVbseff_dVb; - Cox = 3.453133e-11 / (model->B4SOItox - model->B4SOIdtoxcv); /* v2.2.3 */ - CoxWL *= model->B4SOItox/ (model->B4SOItox - model->B4SOIdtoxcv); - CoxWLb *= model->B4SOItox/ (model->B4SOItox - model->B4SOIdtoxcv); - Tox = 1.0e8 * (model->B4SOItox - model->B4SOIdtoxcv); - + if(model->B4SOImtrlMod == 0) + Cox = 3.453133e-11 / model->B4SOItoxp; + else + Cox = epsrox * EPS0 / model->B4SOItoxp; + CoxWL *= toxe/ model->B4SOItoxp; + CoxWLb *= model->B4SOItox/ model->B4SOItoxp; + Tox=1.0e8*model->B4SOItoxp; + + + /* v4.1 */ + if (here->B4SOIagbcp2 > 0) { + dVgsteff2_dVb /= dVbseff_dVb; + CoxWL2 *= model->B4SOItox / + model->B4SOItoxp; + CoxWLb2 *= model->B4SOItox/ + model->B4SOItoxp; + } +/* end v4.1 */ /* v3.1 */ if (here->B4SOIsoiMod == 2) /* v3.2 */ /* ideal FD */ { Qac0 = dQac0_dVg = dQac0_dVb = dQac0_dT = 0.0; + dQac02_dVg = dQac02_dVb = dQac02_dT = 0.0; Qsub0 = dQsub0_dVg = dQsub0_dVd = dQsub0_dVb = dQsub0_dT = 0.0; + dQsub02_dVg = dQsub02_dVd = dQsub02_dVb = dQsub02_dT = 0.0; } else /* soiMod = 0 or 1 */ { @@ -4700,7 +5990,28 @@ for (; model != NULL; model = model->B4SOInextModel) dVfbeff_dVb = -T1; if (selfheat) dVfbeff_dT = (1.0 - T1 - T2) * dVfbzb_dT; else dVfbeff_dT = 0.0; - +/* v4.1 */ + if (here->B4SOIagbcp2 >0) { + Vfbzb2 = Vfbzb + 1.12; + if (selfheat) dVfbzb2_dT = dVfbzb_dT; + else dVfbzb2_dT = 0; + V3 = Vfbzb2 - Vgs_eff2 + Vbseff - DELTA_3; + if (Vfbzb <= 0.0) + { T0 = sqrt(V3 * V3 - 100.0 * DELTA_3 * Vfbzb2); + T2 = -DELTA_3 / T0; + } + else + { T0 = sqrt(V3 * V3 + 100.0 * DELTA_3 * Vfbzb2); + T2 = DELTA_3 / T0; + } + T1 = 0.5 * (1.0 + V3 / T0); + Vfbeff2 = Vfbzb2 - 0.5 * (V3 + T0); + dVfbeff2_dVg = T1 * dVgs_eff2_dVg; + dVfbeff2_dVb = -T1; + if (selfheat) dVfbeff2_dT = (1.0 - T1 - T2) * dVfbzb2_dT; + else dVfbeff2_dT = 0.0; + } +/* end v4.1 */ T0 = (Vgs_eff - Vbseff - Vfbzb) / Tox; dT0_dVg = dVgs_eff_dVg / Tox; @@ -4725,18 +6036,66 @@ for (; model != NULL; model = model->B4SOInextModel) dTcen_dVg = dTcen_dVb = dTcen_dT = 0.0; } - LINK = 1.0e-3 * (model->B4SOItox - model->B4SOIdtoxcv); /* v2.2.3 */ + /*LINK = 1.0e-3 * (toxe - model->B4SOIdtoxcv); v2.2.3 */ + LINK = 1.0e-3 * model->B4SOItoxp; V3 = pParam->B4SOIldeb - Tcen - LINK; V4 = sqrt(V3 * V3 + 4.0 * LINK * pParam->B4SOIldeb); Tcen = pParam->B4SOIldeb - 0.5 * (V3 + V4); T1 = 0.5 * (1.0 + V3 / V4); + /* v4.1 small Tcen can introduce numerical issue */ + if (Tcen < 1e-15) + { Tcen = 1e-15; + T1 = 0; + } /* end */ + dTcen_dVg *= T1; dTcen_dVb *= T1; if (selfheat) dTcen_dT *= T1; else dTcen_dT = 0; +/* v4.1 */ + if (here->B4SOIagbcp2 > 0) { + T0 = (Vgs_eff2 - Vbseff - Vfbzb2) / Tox; + dT0_dVg = dVgs_eff2_dVg / Tox; + dT0_dVb = -1.0 / Tox; - Ccen = EPSSI / Tcen; + tmp = T0 * pParam->B4SOIacde; + if ((-EXPL_THRESHOLD < tmp) && (tmp < EXPL_THRESHOLD)) + { Tcen2 = pParam->B4SOIldeb * exp(tmp); + dTcen2_dVg = pParam->B4SOIacde * Tcen2; + dTcen2_dVb = dTcen2_dVg * dT0_dVb; + dTcen2_dVg *= dT0_dVg; + if (selfheat) + dTcen2_dT = -Tcen2 * pParam->B4SOIacde * dVfbzb2_dT / Tox; + else dTcen2_dT = 0; + } + else if (tmp <= -EXPL_THRESHOLD) + { Tcen2 = pParam->B4SOIldeb * MIN_EXPL; + dTcen2_dVg = dTcen2_dVb = dTcen2_dT = 0.0; + } + else + { Tcen2 = pParam->B4SOIldeb * MAX_EXPL; + dTcen2_dVg = dTcen2_dVb = dTcen2_dT = 0.0; + } + + V3 = pParam->B4SOIldeb - Tcen2 - LINK; + V4 = sqrt(V3 * V3 + 4.0 * LINK * pParam->B4SOIldeb); + Tcen2 = pParam->B4SOIldeb - 0.5 * (V3 + V4); + T1 = 0.5 * (1.0 + V3 / V4); + + if (Tcen2 < 1e-15) + { Tcen2 = 1e-15; + T1 = 0; + } + dTcen2_dVg *= T1; + dTcen2_dVb *= T1; + if (selfheat) + dTcen2_dT *= T1; + else dTcen2_dT = 0; + } +/* end v4.1 */ + + Ccen = epssub / Tcen; T2 = Cox / (Cox + Ccen); Coxeff = T2 * Ccen; T3 = -Ccen / Tcen; @@ -4746,11 +6105,32 @@ for (; model != NULL; model = model->B4SOInextModel) if (selfheat) dCoxeff_dT = T3 * dTcen_dT * (T2 - Coxeff / (Cox + Ccen)); else dCoxeff_dT = 0; +/* v4.1 */ + if (here->B4SOIagbcp2 > 0) { + Ccen2 = EPSSI / Tcen2; + T2 = Cox / (Cox + Ccen2); + Coxeff2 = T2 * Ccen2; + T3 = -Ccen2 / Tcen2; + dCoxeff2_dVg = T2 * T2 * T3; + dCoxeff2_dVb = dCoxeff2_dVg * dTcen2_dVb; + dCoxeff2_dVg *= dTcen2_dVg; + if (selfheat) + dCoxeff2_dT = T3 * dTcen2_dT * (T2 - Coxeff2 / (Cox + Ccen2)); + else dCoxeff2_dT = 0; + } +/* end v4.1 */ CoxWLcenb = CoxWLb * Coxeff / Cox; if (selfheat) dCoxWLcenb_dT = CoxWLb * dCoxeff_dT / Cox; else dCoxWLcenb_dT = 0; - +/* v4.1 */ + if (here->B4SOIagbcp2 > 0) { + CoxWLcenb2 = CoxWLb2 * Coxeff2 / Cox; + if (selfheat) + dCoxWLcenb2_dT = CoxWLb2 * dCoxeff2_dT / Cox; + else dCoxWLcenb2_dT = 0; + } +/* end v4.1 */ Qac0 = CoxWLcenb * (Vfbeff - Vfbzb); QovCox = Qac0 / Coxeff; dQac0_dVg = CoxWLcenb * dVfbeff_dVg @@ -4760,7 +6140,22 @@ for (; model != NULL; model = model->B4SOInextModel) if (selfheat) dQac0_dT = CoxWLcenb * (dVfbeff_dT - dVfbzb_dT) + dCoxWLcenb_dT * (Vfbeff - Vfbzb); else dQac0_dT = 0.0; - +/* v4.1 */ + if (here->B4SOIagbcp2 > 0) { + Qac02 = CoxWLcenb2 * (Vfbeff2 - Vfbzb2); + QovCox2 = Qac02 / Coxeff2; + dQac02_dVg = CoxWLcenb2 * dVfbeff2_dVg + + QovCox2 * dCoxeff2_dVg; + dQac02_dVb = CoxWLcenb2 * dVfbeff2_dVb + + QovCox2 * dCoxeff2_dVb; + if (selfheat) dQac02_dT = CoxWLcenb2 * (dVfbeff2_dT - dVfbzb2_dT) + + dCoxWLcenb2_dT * (Vfbeff2 - Vfbzb2); + else dQac02_dT = 0.0; + + Qac0 += Qac02; + } +/* end v4.1 */ + T0 = 0.5 * pParam->B4SOIk1ox; T3 = Vgs_eff - Vfbeff - Vbseff - Vgsteff; if (pParam->B4SOIk1ox == 0.0) @@ -4787,6 +6182,39 @@ for (; model != NULL; model = model->B4SOInextModel) dQsub0_dT = -T2 * (dVfbeff_dT + dVgsteff_dT) + dCoxWLcenb_dT * pParam->B4SOIk1ox * (T1 - T0); else dQsub0_dT = 0.0; + +/* v4.1 */ + if (here->B4SOIagbcp2 > 0) { + T3 = Vgs_eff2 - Vfbeff2 - Vbseff - Vgsteff2; + if (pParam->B4SOIk1ox == 0.0) + { T1 = 0.0; + T2 = 0.0; + } + else if (T3 < 0.0) + { T1 = T0 + T3 / pParam->B4SOIk1ox; + T2 = CoxWLcenb2; + } + else + { T1 = sqrt(T0 * T0 + T3); + T2 = CoxWLcenb2 * T0 / T1; + } + + Qsub02 = CoxWLcenb2 * pParam->B4SOIk1ox * (T1 - T0); + QovCox2 = Qsub02 / Coxeff2; + dQsub02_dVg = T2 * (dVgs_eff2_dVg - dVfbeff2_dVg - dVgsteff2_dVg) + + QovCox2 * dCoxeff2_dVg; + dQsub02_dVd = -T2 * dVgsteff2_dVd; + dQsub02_dVb = -T2 * (dVfbeff2_dVb + 1 + dVgsteff2_dVb) + + QovCox2 * dCoxeff2_dVb; + if (selfheat) + dQsub02_dT = -T2 * (dVfbeff2_dT + dVgsteff2_dT) + + dCoxWLcenb2_dT * pParam->B4SOIk1ox * (T1 - T0); + else dQsub02_dT = 0.0; + + Qsub0 += Qsub02; + } +/* end v4.1 */ + } /* v3.1 */ @@ -4807,6 +6235,16 @@ for (; model != NULL; model = model->B4SOInextModel) dDeltaPhi_dVg = 2.0 * Vtm * (T1 -T0) / (Denomi + T1 * Vgsteff); dDeltaPhi_dVd = dDeltaPhi_dVg * dVgsteff_dVd; dDeltaPhi_dVb = dDeltaPhi_dVg * dVgsteff_dVb; + +/* v4.1 */ + if (here->B4SOIagbcp2 > 0) { + T1 = 2.0 * T0 + Vgsteff2; + DeltaPhi2 = Vtm * log(1.0 + T1 * Vgsteff2 / Denomi); + dDeltaPhi2_dVg = 2.0 * Vtm * (T1 -T0) / (Denomi + T1 * Vgsteff2); + dDeltaPhi2_dVd = dDeltaPhi2_dVg * dVgsteff2_dVd; + dDeltaPhi2_dVb = dDeltaPhi2_dVg * dVgsteff2_dVb; + } +/* end v4.1 */ /* End of delta Phis */ @@ -4832,7 +6270,7 @@ for (; model != NULL; model = model->B4SOInextModel) else dTcen_dT = 0; - Ccen = EPSSI / Tcen; + Ccen = epssub / Tcen; T0 = Cox / (Cox + Ccen); Coxeff = T0 * Ccen; T1 = -Ccen / Tcen; @@ -4845,7 +6283,42 @@ for (; model != NULL; model = model->B4SOInextModel) else dCoxeff_dT = 0; CoxWLcen = CoxWL * Coxeff / Cox; CoxWLcenb = CoxWLb * Coxeff / Cox; - +/* v4.1 */ + if (here->B4SOIagbcp2 > 0) { + T3 = 4.0 * (Vth + 1.12 - Vfbzb2 - phi); + T2 = sqrt(T3*T3 + 0.0001); + T5 = 0.5 * (1 + T3/T2); + T4 = 0.5 * (T3 + T2); + /* Tox += Tox; */ + T0 = (Vgsteff2 + T4) / Tox; + tmp = exp(0.7 * log(T0)); + T1 = 1.0 + tmp; + T2 = 0.7 * tmp / (T0 * Tox); + Tcen2 = 1.9e-9 / T1; + dTcen2_dVg = -Tcen2 * T2 / T1; + dTcen2_dVd = dTcen2_dVg * (T5 * 4.0 * dVth_dVd + dVgsteff2_dVd); + dTcen2_dVb = dTcen2_dVg * (T5 * 4.0 * dVth_dVb + dVgsteff2_dVb); + dTcen2_dVg *= dVgsteff2_dVg; + if (selfheat) + dTcen2_dT = -Tcen2 * T2 / T1 + * (T5 * 4.0 * (dVth_dT - dVfbzb2_dT) + dVgsteff2_dT); + else dTcen2_dT = 0; + Ccen2 = EPSSI / Tcen2; + T0 = Cox / (Cox + Ccen2); + Coxeff2 = T0 * Ccen2; + T1 = -Ccen2 / Tcen2; + dCoxeff2_dVg = T0 * T0 * T1; + dCoxeff2_dVd = dCoxeff2_dVg * dTcen2_dVd; + dCoxeff2_dVb = dCoxeff2_dVg * dTcen2_dVb; + dCoxeff2_dVg *= dTcen2_dVg; + if (selfheat) + dCoxeff2_dT = T1 * dTcen2_dT * (T0 - Coxeff2 / (Cox + Ccen2)); + else dCoxeff2_dT = 0; + CoxWLcen2 = CoxWL2 * Coxeff2 / Cox; + CoxWLcenb2 = CoxWLb2 * Coxeff2 / Cox; + } +/* end v4.1 */ + AbulkCV = Abulk0 * pParam->B4SOIabulkCVfactor; dAbulkCV_dVb = pParam->B4SOIabulkCVfactor * dAbulk0_dVb; VdsatCV = (Vgsteff - DeltaPhi) / AbulkCV; @@ -4878,11 +6351,47 @@ for (; model != NULL; model = model->B4SOInextModel) + Cgg1 * dVgsteff_dVb + QovCox * dCoxeff_dVb; Cgg1 = Cgg1 * dVgsteff_dVg + QovCox * dCoxeff_dVg; - +/* v4.1 */ + if (here->B4SOIagbcp2 > 0) { + VdsatCV2 = (Vgsteff2 - DeltaPhi2) / AbulkCV; + V4 = VdsatCV2 - Vds - DELTA_4; + T02 = sqrt(V4 * V4 + 4.0 * DELTA_4 * VdsatCV2); + VdseffCV2 = VdsatCV2 - 0.5 * (V4 + T02); + T12 = 0.5 * (1.0 + V4 / T02); + T22 = DELTA_4 / T02; + T3 = (1.0 - T12 - T22) / AbulkCV; + T4 = T3 * ( 1.0 - dDeltaPhi2_dVg); + dVdseffCV2_dVg = T4; + dVdseffCV2_dVd = T12; + dVdseffCV2_dVb = -T3 * VdsatCV2 * dAbulkCV_dVb; + + T02 = AbulkCV * VdseffCV2; + T12 = Vgsteff2 - DeltaPhi2; + T22 = 12.0 * (T12 - 0.5 * T02 + 1.0e-20); + T3 = T02 / T22; + T4 = 1.0 - 12.0 * T3 * T3; + T52 = AbulkCV * (6.0 * T02 * (4.0 * T12 - T02) / (T22 * T22) - 0.5); + T6 = T52 * VdseffCV2 / AbulkCV; + T7 = CoxWLcen2 * (T12 - T02 * (0.5 - T3)); + qinv += T7; + qgate = qinoi = qinv; + QovCox2 = T7 / Coxeff2; + Cgg12 = CoxWLcen2 * (T4 * (1.0 - dDeltaPhi2_dVg) + + T52 * dVdseffCV2_dVg); + Cgd12 = CoxWLcen2 * T52 * dVdseffCV2_dVd + Cgg12 + * dVgsteff2_dVd + QovCox2 * dCoxeff2_dVd; + Cgb12 = CoxWLcen2 * (T52 * dVdseffCV2_dVb + T6 * dAbulkCV_dVb) + + Cgg12 * dVgsteff2_dVb + QovCox2 * dCoxeff2_dVb; + Cgg12 = Cgg12 * dVgsteff2_dVg + QovCox2 * dCoxeff2_dVg; + } + +/* end v4.1 */ + + /* v3.1 */ if (here->B4SOIsoiMod == 2) /* v3.2 */ /* ideal FD */ { - qbulk = Cbg1 = Cbd1 = Cbb1 = 0; + qbulk = Cbg1 = Cbd1 = Cbb1 = Cbg1 = Cbg12 = Cbb12 = Cbd12 = 0; } else /* soiMod = 0 or 1 */ { @@ -4901,6 +6410,27 @@ for (; model != NULL; model = model->B4SOInextModel) Cbb1 = CoxWLcenb * (T11 * dVdseffCV_dVb + T12 * dAbulkCV_dVb) + Cbg1 * dVgsteff_dVb + QovCox * dCoxeff_dVb; Cbg1 = Cbg1 * dVgsteff_dVg + QovCox * dCoxeff_dVg; +/* v4.1 */ + if (here->B4SOIagbcp2 > 0) { + T8 = T22 * T22; + T9 = 12.0 * T7 * T02 * T02 / (T8 * AbulkCV); + T10 = T9 * (1.0 - dDeltaPhi2_dVg); + T11 = -T7 * T52 / AbulkCV; + T12 = -(T9 * (Vgsteff2 - DeltaPhi2) / AbulkCV + VdseffCV2 * (0.5 - T02 / T22)); + + qbulk2 = CoxWLcenb2 * T7 * (0.5 * VdseffCV2 - T02 * VdseffCV2 / T22); + QovCox2 = qbulk2 / Coxeff2; + Cbg12 = CoxWLcenb2 * (T10 + T11 * dVdseffCV2_dVg); + Cbd12 = CoxWLcenb2 * T11 * dVdseffCV2_dVd + Cbg12 + * dVgsteff2_dVd + QovCox2 * dCoxeff2_dVd; + Cbb12 = CoxWLcenb2 * (T11 * dVdseffCV2_dVb + T12 * dAbulkCV_dVb) + + Cbg12 * dVgsteff2_dVb + QovCox2 * dCoxeff2_dVb; + Cbg12 = Cbg12 * dVgsteff2_dVg + QovCox2 * dCoxeff2_dVg; + qbulk += qbulk2; + } + +/* end v4.1 */ + } /* v3.1 */ @@ -4923,6 +6453,27 @@ for (; model != NULL; model = model->B4SOInextModel) Csb = CoxWLcen * (T5 * dVdseffCV_dVb + T6 * dAbulkCV_dVb) + Csg * dVgsteff_dVb + QovCox * dCoxeff_dVb; Csg = Csg * dVgsteff_dVg + QovCox * dCoxeff_dVg; + /* v4.1 */ + if (here->B4SOIagbcp2 > 0) { + qsrc2 = -CoxWLcen2 * ( (Vgsteff2 - DeltaPhi2) / 2.0 + T02 / 4.0 + - 0.5 * T02 * T02 / T2); + QovCox2 = qsrc2 / Coxeff2; + T22 += T22; + T3 = T22 * T22; + T7 = -(0.25 - 12.0 * T02 * (4.0 * T12 - T02) / T3); + T4 = -(0.5 + 24.0 * T02 * T02 / T3) * (1.0 - dDeltaPhi2_dVg); + T5 = T7 * AbulkCV; + T6 = T7 * VdseffCV2; + Csg2 = CoxWLcen2 * (T4 + T5 * dVdseffCV2_dVg); + Csd2 = CoxWLcen2 * T5 * dVdseffCV2_dVd + Csg2 * dVgsteff2_dVd + + QovCox2 * dCoxeff2_dVd; + Csb2 = CoxWLcen2 * (T5 * dVdseffCV2_dVb + T6 * dAbulkCV_dVb) + + Csg2 * dVgsteff2_dVb + QovCox2 * dCoxeff2_dVb; + Csg2 = Csg2 * dVgsteff2_dVg + QovCox2 * dCoxeff2_dVg; + qsrc += qsrc2; + } +/* end v4.1 */ + } else if (model->B4SOIxpart < 0.5) { /* 40/60 partition */ @@ -4944,6 +6495,29 @@ for (; model != NULL; model = model->B4SOInextModel) Csb = Csg * dVgsteff_dVb + T6 * dVdseffCV_dVb + T7 * dAbulkCV_dVb + QovCox * dCoxeff_dVb; Csg = Csg * dVgsteff_dVg + QovCox * dCoxeff_dVg; +/* v4.1 */ + if (here->B4SOIagbcp2 > 0) { + T22 = T22 / 12.0; + T3 = 0.5 * CoxWLcen2 / (T22 * T22); + T4 = T12 * (2.0 * T02 * T02 / 3.0 + T12 * (T12 - 4.0 + * T02 / 3.0)) - 2.0 * T02 * T02 * T02 / 15.0; + qsrc2 = -T3 * T4; + QovCox2 = qsrc2 / Coxeff2; + T8 = 4.0 / 3.0 * T12 * (T12 - T02) + 0.4 * T02 * T02; + T5 = -2.0 * qsrc2 / T22 - T3 * (T12 * (3.0 * T12 - 8.0 + * T02 / 3.0) + 2.0 * T02 * T02 / 3.0); + T6 = AbulkCV * (qsrc2 / T22 + T3 * T8); + T7 = T6 * VdseffCV2 / AbulkCV; + + Csg2 = T5 * (1.0 - dDeltaPhi2_dVg) + T6 * dVdseffCV2_dVg; + Csd2 = Csg2 * dVgsteff2_dVd + T6 * dVdseffCV2_dVd + + QovCox2 * dCoxeff2_dVd; + Csb2 = Csg2 * dVgsteff2_dVb + T6 * dVdseffCV2_dVb + + T7 * dAbulkCV_dVb + QovCox2 * dCoxeff2_dVb; + Csg2 = Csg2 * dVgsteff2_dVg + QovCox2 * dCoxeff2_dVg; + qsrc += qsrc2; + } +/* end v4.1 */ } else { /* 50/50 partition */ @@ -4951,6 +6525,13 @@ for (; model != NULL; model = model->B4SOInextModel) Csg = -0.5 * Cgg1; Csd = -0.5 * Cgd1; Csb = -0.5 * Cgb1; +/* v4.1 */ + if (here->B4SOIagbcp2 > 0) { + Csg2 = -0.5 * Cgg12; + Csd -= 0.5 * Cgd12; + Csb -= 0.5 * Cgb12; + } +/* end v4.1 */ } @@ -5000,7 +6581,31 @@ for (; model != NULL; model = model->B4SOInextModel) Csb *= dVbseff_dVb; if (selfheat) CsT = Csg * dVgsteff_dT; else CsT = 0.0; - + /* v4.1 */ + if (here->B4SOIagbcp2 > 0) { + Cbg += Cbg12 - dQac02_dVg - dQsub02_dVg; + Cbd += Cbd12 - dQsub02_dVd; + Cbb += Cbb12 - dQac02_dVb - dQsub02_dVb; + if (selfheat) + CbT += Cbg12 * dVgsteff2_dT - dQac02_dT + - dQsub02_dT; + else CbT = 0.0; + Cgg = Cgg1 + Cgg12 - Cbg; + Cgd = Cgd1 + Cgd12 - Cbd; + Cgb = Cgb1 + Cgb12 - Cbb - Ce1b / dVbseff_dVb; + if (selfheat) + CgT += Cgg12 * dVgsteff2_dT + dQac02_dT + + dQsub02_dT; + else CgT = 0.0; + + Cgb *= dVbseff_dVb; + Cbb *= dVbseff_dVb; + if (selfheat) CsT += Csg2 * dVgsteff2_dT; + else CsT = 0.0; + Csg += Csg2; + } + +/* end v4.1 */ here->B4SOIcggb = Cgg; here->B4SOIcgsb = -(Cgg + Cgd + Cgb); here->B4SOIcgdb = Cgd; @@ -5807,7 +7412,7 @@ for (; model != NULL; model = model->B4SOInextModel) /* v3.1 added for RF */ gcgmgmb = gcgmdb = gcgmsb = gcgmeb = 0.0; gcdgmb = gcsgmb = gcegmb = ceqqgmid = 0.0; - gcgbb = 0.0; + gcgbb = gcsbb = gcdbb = 0.0; /* v3.1 added for RF end */ gcdbdb = gcsbsb = gcjdbdp = gcjsbsp = 0.0; /* v4.0 */ @@ -5913,7 +7518,6 @@ for (; model != NULL; model = model->B4SOInextModel) /* Current going in is +ve */ ceqbody = -here->B4SOIcbody; - ceqgate = here->B4SOIcgate; gigg = here->B4SOIgigg; gigb = here->B4SOIgigb; @@ -5925,6 +7529,15 @@ for (; model != NULL; model = model->B4SOInextModel) ceqth = here->B4SOIcth; ceqbodcon = here->B4SOIcbodcon; + /* v4.1 */ + gigpg = here->B4SOIgigpg; + gigpp = here->B4SOIgigpp; + ceqgate += (here->B4SOIigp - gigpg * vgp); + if(here->B4SOIbodyMod == 1) + ceqbodcon += (here->B4SOIigp - gigpg * vgp); + else if(here->B4SOIbodyMod == 2) + ceqbody -= (here->B4SOIigp - gigpg * vgp); + gbbg = -here->B4SOIgbgs; gbbdp = -here->B4SOIgbds; gbbb = -here->B4SOIgbbs; @@ -5934,7 +7547,7 @@ for (; model != NULL; model = model->B4SOInextModel) gbbe = -here->B4SOIgbes; if (here->B4SOIrbodyMod) { /* v4.0 */ - gbbdp = -Giid - Ggidld; + gbbdp = -Giid - Ggidld - Ggisls; gbbb = -Giib + Gbpbs; gjsdb = Gjsb + Gjdb; } @@ -5946,7 +7559,7 @@ for (; model != NULL; model = model->B4SOInextModel) if (!here->B4SOIrbodyMod) /* v4.0 */ gddpb = -here->B4SOIgjdb; else - gddpb = Giib + Ggidlb; + gddpb = Giib + Ggidlb + Ggislb; gddpT = -model->B4SOItype * here->B4SOIgjdT; /* v3.0 */ gddpe = -here->B4SOIgjde; @@ -6028,7 +7641,7 @@ for (; model != NULL; model = model->B4SOInextModel) ceqgcrg = gcrg = gcrgd = gcrgg = gcrgs = gcrgb = 0.0; /* v3.1 added for RF end */ - } /* end of soimod>=0 */ + } /* end of soimode>=0 */ else { Gm = -here->B4SOIgm; @@ -6067,6 +7680,15 @@ for (; model != NULL; model = model->B4SOInextModel) ceqth = here->B4SOIcth; ceqbodcon = here->B4SOIcbodcon; + /* v4.1 */ + gigpg = here->B4SOIgigpg; + gigpp = here->B4SOIgigpp; + ceqgate += (here->B4SOIigp - gigpg * vgp); + if(here->B4SOIbodyMod == 1) + ceqbodcon += (here->B4SOIigp - gigpg * vgp); + else if(here->B4SOIbodyMod == 2) + ceqbody -= (here->B4SOIigp - gigpg * vgp); + gbbg = -here->B4SOIgbgs; gbbb = -here->B4SOIgbbs; gbbp = -here->B4SOIgbps; @@ -6076,7 +7698,7 @@ for (; model != NULL; model = model->B4SOInextModel) gbbe = -here->B4SOIgbes; if (here->B4SOIrbodyMod) { /* v4.0 */ - gbbsp = -Giid - Ggidld; + gbbsp = -Giid - Ggidld - Ggisls; gbbb = -Giib + Gbpbs; gjsdb = Gjsb + Gjdb; } @@ -6098,7 +7720,7 @@ for (; model != NULL; model = model->B4SOInextModel) if (!here->B4SOIrbodyMod) gsspb = -here->B4SOIgjdb; else - gsspb = Giib + Ggidlb; + gsspb = Giib + Ggidlb + Ggislb; gsspT = -model->B4SOItype * here->B4SOIgjdT; /* v3.0 */ gsspe = -here->B4SOIgjde; @@ -6230,7 +7852,7 @@ for (; model != NULL; model = model->B4SOInextModel) } - m = here->B4SOIm; + m = here->B4SOIm; /* v3.1 */ @@ -6519,6 +8141,20 @@ for (; model != NULL; model = model->B4SOInextModel) (*(here->B4SOIPpPtr) += m * gppp); } + /* v4.1 Ig_agbcp2 stamping */ + (*(here->B4SOIGgPtr) += gigpg); + if (here->B4SOIbodyMod == 1) { + (*(here->B4SOIPpPtr) -= m * gigpp); + (*(here->B4SOIPgPtr) -= m * gigpg); + (*(here->B4SOIGpPtr) += m * gigpp); + } + else if(here->B4SOIbodyMod == 2) + { + (*(here->B4SOIBbPtr) -= m * gigpp); + (*(here->B4SOIBgPtr) -= m * gigpg); + (*(here->B4SOIGbPtr) += m * gigpp); + } + if (selfheat) { @@ -6562,7 +8198,7 @@ for (; model != NULL; model = model->B4SOInextModel) *(here->B4SOIQjdPtr) += 1; } - line1000: ; + line1000: ; } /* End of Mosfet Instance */ diff --git a/src/spicelib/devices/bsim3soi/b4soimask.c b/src/spicelib/devices/bsim3soi/b4soimask.c index 4ccf3a07d..87ec2ea19 100644 --- a/src/spicelib/devices/bsim3soi/b4soimask.c +++ b/src/spicelib/devices/bsim3soi/b4soimask.c @@ -1,12 +1,14 @@ -/*** B4SOI 11/30/2005 Xuemei (Jane) Xi Release ***/ +/*** B4SOI 03/06/2009 Wenwei Yang Release ***/ /********** - * Copyright 2005 Regents of the University of California. All rights reserved. + * Copyright 2009 Regents of the University of California. All rights reserved. * Authors: 1998 Samuel Fung, Dennis Sinitsky and Stephen Tang * Authors: 1999-2004 Pin Su, Hui Wan, Wei Jin, b3soimask.c * Authors: 2005- Hui Wan, Xuemei Xi, Ali Niknejad, Chenming Hu. + * Authors: 2009- Wenwei Yang, Chung-Hsun Lin, Ali Niknejad, Chenming Hu. * File: b4soimask.c * Modified by Hui Wan, Xuemei Xi 11/30/2005 + * Modified by Wenwei Yang, Chung-Hsun Lin, Darsen Lu 03/06/2009 **********/ #include "ngspice.h" @@ -48,11 +50,63 @@ B4SOImAsk(CKTcircuit *ckt, GENmodel *inst, int which, IFvalue *value) case B4SOI_MOD_TOX : value->rValue = model->B4SOItox; return(OK); - + case B4SOI_MOD_TOXP : + value->rValue = model->B4SOItoxp; + return(OK); + case B4SOI_MOD_LEFFEOT : + value->rValue = model->B4SOIleffeot; + return(OK); + case B4SOI_MOD_WEFFEOT : + value->rValue = model->B4SOIweffeot; + return(OK); + case B4SOI_MOD_VDDEOT : + value->rValue = model->B4SOIvddeot; + return(OK); + case B4SOI_MOD_TEMPEOT : + value->rValue = model->B4SOItempeot; + return(OK); + case B4SOI_MOD_ADOS : + value->rValue = model->B4SOIados; + return(OK); + case B4SOI_MOD_BDOS : + value->rValue = model->B4SOIbdos; + return(OK); + case B4SOI_MOD_EPSRGATE: + value->rValue = model->B4SOIepsrgate; + return(OK); + case B4SOI_MOD_PHIG: + value->rValue = model->B4SOIphig; + return(OK); + case B4SOI_MOD_EASUB: + value->rValue = model->B4SOIeasub; + return(OK); + case B4SOI_MOD_TOXM : value->rValue = model->B4SOItoxm; return(OK); /* v3.2 */ - + + /*4.1*/ + case B4SOI_MOD_EOT : + value->rValue = model->B4SOIeot; + return(OK); + case B4SOI_MOD_EPSROX : + value->rValue = model->B4SOIepsrox; + return(OK); + case B4SOI_MOD_EPSRSUB: + value->rValue = model->B4SOIepsrsub; + return(OK); + case B4SOI_MOD_NI0SUB: + value->rValue = model->B4SOIni0sub; + return(OK); + case B4SOI_MOD_BG0SUB: + value->rValue = model->B4SOIbg0sub; + return(OK); + case B4SOI_MOD_TBGASUB: + value->rValue = model->B4SOItbgasub; + return(OK); + case B4SOI_MOD_TBGBSUB: + value->rValue = model->B4SOItbgbsub; + return(OK); /* v2.2.3 */ case B4SOI_MOD_DTOXCV : value->rValue = model->B4SOIdtoxcv; @@ -107,6 +161,9 @@ B4SOImAsk(CKTcircuit *ckt, GENmodel *inst, int which, IFvalue *value) case B4SOI_MOD_NGATE: value->rValue = model->B4SOIngate; return(OK); + case B4SOI_MOD_NSD: + value->rValue = model->B4SOInsd; + return(OK); case B4SOI_MOD_GAMMA1: value->rValue = model->B4SOIgamma1; return(OK); @@ -179,6 +236,9 @@ B4SOImAsk(CKTcircuit *ckt, GENmodel *inst, int which, IFvalue *value) case B4SOI_MOD_VTH0: value->rValue = model->B4SOIvth0; return(OK); + case B4SOI_MOD_VFB: + value->rValue = model->B4SOIvfb; + return(OK); /* v4.1 */ case B4SOI_MOD_UA: value->rValue = model->B4SOIua; return(OK); @@ -203,6 +263,69 @@ B4SOImAsk(CKTcircuit *ckt, GENmodel *inst, int which, IFvalue *value) case B4SOI_MOD_UTE: value->rValue = model->B4SOIute; return(OK); + + /*4.1 mobmod=4*/ + case B4SOI_MOD_UD: + value->rValue = model->B4SOIud; + return(OK); + case B4SOI_MOD_LUD: + value->rValue = model->B4SOIlud; + return(OK); + case B4SOI_MOD_WUD: + value->rValue = model->B4SOIwud; + return(OK); + case B4SOI_MOD_PUD: + value->rValue = model->B4SOIpud; + return(OK); + case B4SOI_MOD_UD1: + value->rValue = model->B4SOIud1; + return(OK); + case B4SOI_MOD_LUD1: + value->rValue = model->B4SOIlud1; + return(OK); + case B4SOI_MOD_WUD1: + value->rValue = model->B4SOIwud1; + return(OK); + case B4SOI_MOD_PUD1: + value->rValue = model->B4SOIpud1; + return(OK); + case B4SOI_MOD_EU: + value->rValue = model->B4SOIeu; + return(OK); + case B4SOI_MOD_LEU: + value->rValue = model->B4SOIleu; + return(OK); + case B4SOI_MOD_WEU: + value->rValue = model->B4SOIweu; + return(OK); + case B4SOI_MOD_PEU: + value->rValue = model->B4SOIpeu; + return(OK); + case B4SOI_MOD_UCS: + value->rValue = model->B4SOIucs; + return(OK); + case B4SOI_MOD_LUCS: + value->rValue = model->B4SOIlucs; + return(OK); + case B4SOI_MOD_WUCS: + value->rValue = model->B4SOIwucs; + return(OK); + case B4SOI_MOD_PUCS: + value->rValue = model->B4SOIpucs; + return(OK); + case B4SOI_MOD_UCSTE: + value->rValue = model->B4SOIucste; + return(OK); + case B4SOI_MOD_LUCSTE: + value->rValue = model->B4SOIlucste; + return(OK); + case B4SOI_MOD_WUCSTE: + value->rValue = model->B4SOIwucste; + return(OK); + case B4SOI_MOD_PUCSTE: + value->rValue = model->B4SOIpucste; + return(OK); + case B4SOI_MOD_VOFF: value->rValue = model->B4SOIvoff; return(OK); @@ -304,6 +427,9 @@ B4SOImAsk(CKTcircuit *ckt, GENmodel *inst, int which, IFvalue *value) return(OK); case B4SOI_MOD_TSI: value->rValue = model->B4SOItsi; + return(OK); + case B4SOI_MOD_ETSI: + value->rValue = model->B4SOIetsi; return(OK); case B4SOI_MOD_RTH0: value->rValue = model->B4SOIrth0; @@ -591,6 +717,10 @@ B4SOImAsk(CKTcircuit *ckt, GENmodel *inst, int which, IFvalue *value) case B4SOI_MOD_TII: value->rValue = model->B4SOItii; return(OK); + /*4.1 Iii model*/ + case B4SOI_MOD_TVBCI: + value->rValue = model->B4SOItvbci; + return(OK); case B4SOI_MOD_LII: value->rValue = model->B4SOIlii; return(OK); @@ -609,6 +739,22 @@ B4SOImAsk(CKTcircuit *ckt, GENmodel *inst, int which, IFvalue *value) case B4SOI_MOD_FBJTII: value->rValue = model->B4SOIfbjtii; return(OK); + /*4.1 Iii model*/ + case B4SOI_MOD_EBJTII: + value->rValue = model->B4SOIebjtii; + return(OK); + case B4SOI_MOD_CBJTII: + value->rValue = model->B4SOIcbjtii; + return(OK); + case B4SOI_MOD_VBCI: + value->rValue = model->B4SOIvbci; + return(OK); + case B4SOI_MOD_ABJTII: + value->rValue = model->B4SOIabjtii; + return(OK); + case B4SOI_MOD_MBJTII: + value->rValue = model->B4SOImbjtii; + return(OK); case B4SOI_MOD_ESATII: value->rValue = model->B4SOIesatii; return(OK); @@ -754,7 +900,72 @@ B4SOImAsk(CKTcircuit *ckt, GENmodel *inst, int which, IFvalue *value) case B4SOI_MOD_CGIDL: value->rValue = model->B4SOIcgidl; return(OK); + case B4SOI_MOD_RGIDL: + value->rValue = model->B4SOIrgidl; + return(OK); + case B4SOI_MOD_KGIDL: + value->rValue = model->B4SOIkgidl; + return(OK); + case B4SOI_MOD_FGIDL: + value->rValue = model->B4SOIfgidl; + return(OK); + + case B4SOI_MOD_EGISL: + value->rValue = model->B4SOIegisl; + return(OK); + case B4SOI_MOD_AGISL: + value->rValue = model->B4SOIagisl; + return(OK); + case B4SOI_MOD_BGISL: + value->rValue = model->B4SOIbgisl; + return(OK); + case B4SOI_MOD_CGISL: + value->rValue = model->B4SOIcgisl; + return(OK); + case B4SOI_MOD_RGISL: + value->rValue = model->B4SOIrgisl; + return(OK); + case B4SOI_MOD_KGISL: + value->rValue = model->B4SOIkgisl; + return(OK); + case B4SOI_MOD_FGISL: + value->rValue = model->B4SOIfgisl; + return(OK); + + case B4SOI_MOD_FDMOD: + value->rValue = model->B4SOIfdMod; + return(OK); + case B4SOI_MOD_VSCE: + value->rValue = model->B4SOIvsce; + return(OK); + case B4SOI_MOD_CDSBS: + value->rValue = model->B4SOIcdsbs; + return(OK); + case B4SOI_MOD_MINVCV: + value->rValue = model->B4SOIminvcv; + return(OK); + case B4SOI_MOD_LMINVCV: + value->rValue = model->B4SOIlminvcv; + return(OK); + case B4SOI_MOD_WMINVCV: + value->rValue = model->B4SOIwminvcv; + return(OK); + case B4SOI_MOD_PMINVCV: + value->rValue = model->B4SOIpminvcv; + return(OK); + case B4SOI_MOD_VOFFCV: + value->rValue = model->B4SOIvoffcv; + return(OK); + case B4SOI_MOD_LVOFFCV: + value->rValue = model->B4SOIlvoffcv; + return(OK); + case B4SOI_MOD_WVOFFCV: + value->rValue = model->B4SOIwvoffcv; + return(OK); + case B4SOI_MOD_PVOFFCV: + value->rValue = model->B4SOIpvoffcv; + return(OK); /* v3.0 */ case B4SOI_MOD_SOIMOD: value->iValue = model->B4SOIsoiMod; @@ -835,6 +1046,15 @@ B4SOImAsk(CKTcircuit *ckt, GENmodel *inst, int which, IFvalue *value) case B4SOI_MOD_VGB2: value->rValue = model->B4SOIvgb2; return(OK); + case B4SOI_MOD_AIGBCP2: + value->rValue = model->B4SOIaigbcp2; + return(OK); + case B4SOI_MOD_BIGBCP2: + value->rValue = model->B4SOIbigbcp2; + return(OK); + case B4SOI_MOD_CIGBCP2: + value->rValue = model->B4SOIcigbcp2; + return(OK); case B4SOI_MOD_TOXQM: value->rValue = model->B4SOItoxqm; return(OK); @@ -869,24 +1089,60 @@ B4SOImAsk(CKTcircuit *ckt, GENmodel *inst, int which, IFvalue *value) case B4SOI_MOD_DVTP1: value->rValue = model->B4SOIdvtp1; return(OK); + case B4SOI_MOD_DVTP2: + value->rValue = model->B4SOIdvtp2; + return(OK); + case B4SOI_MOD_DVTP3: + value->rValue = model->B4SOIdvtp3; + return(OK); + case B4SOI_MOD_DVTP4: + value->rValue = model->B4SOIdvtp4; + return(OK); case B4SOI_MOD_LDVTP0: value->rValue = model->B4SOIldvtp0; return(OK); case B4SOI_MOD_LDVTP1: value->rValue = model->B4SOIldvtp1; return(OK); + case B4SOI_MOD_LDVTP2: + value->rValue = model->B4SOIldvtp2; + return(OK); + case B4SOI_MOD_LDVTP3: + value->rValue = model->B4SOIldvtp3; + return(OK); + case B4SOI_MOD_LDVTP4: + value->rValue = model->B4SOIldvtp4; + return(OK); case B4SOI_MOD_WDVTP0: value->rValue = model->B4SOIwdvtp0; return(OK); case B4SOI_MOD_WDVTP1: value->rValue = model->B4SOIwdvtp1; return(OK); + case B4SOI_MOD_WDVTP2: + value->rValue = model->B4SOIwdvtp2; + return(OK); + case B4SOI_MOD_WDVTP3: + value->rValue = model->B4SOIwdvtp3; + return(OK); + case B4SOI_MOD_WDVTP4: + value->rValue = model->B4SOIwdvtp4; + return(OK); case B4SOI_MOD_PDVTP0: value->rValue = model->B4SOIpdvtp0; return(OK); case B4SOI_MOD_PDVTP1: value->rValue = model->B4SOIpdvtp1; return(OK); + case B4SOI_MOD_PDVTP2: + value->rValue = model->B4SOIpdvtp2; + return(OK); + case B4SOI_MOD_PDVTP3: + value->rValue = model->B4SOIpdvtp3; + return(OK); + case B4SOI_MOD_PDVTP4: + value->rValue = model->B4SOIpdvtp4; + return(OK); case B4SOI_MOD_MINV: value->rValue = model->B4SOIminv; return(OK); @@ -987,7 +1243,20 @@ B4SOImAsk(CKTcircuit *ckt, GENmodel *inst, int which, IFvalue *value) value->rValue = model->B4SOIxgl; return(OK); /* v3.1 added for RF end */ +/*4.1*/ + case B4SOI_MOD_MTRLMOD : + value->iValue = model->B4SOImtrlMod; + return(OK); + case B4SOI_MOD_VGSTCVMOD: + value->iValue = model->B4SOIvgstcvMod; + return(OK); + case B4SOI_MOD_GIDLMOD : + value->iValue = model->B4SOIgidlMod; + return(OK); + case B4SOI_MOD_IIIMOD : + value->iValue = model->B4SOIiiiMod; + return(OK); /* v3.0 */ case B4SOI_MOD_IGBMOD: value->iValue = model->B4SOIigbMod; @@ -1046,6 +1315,15 @@ B4SOImAsk(CKTcircuit *ckt, GENmodel *inst, int which, IFvalue *value) case B4SOI_MOD_LBETAGB2: value->rValue = model->B4SOIlbetaGB2; return(OK); + case B4SOI_MOD_LAIGBCP2: + value->rValue = model->B4SOIlaigbcp2; + return(OK); + case B4SOI_MOD_LBIGBCP2: + value->rValue = model->B4SOIlbigbcp2; + return(OK); + case B4SOI_MOD_LCIGBCP2: + value->rValue = model->B4SOIlcigbcp2; + return(OK); case B4SOI_MOD_LNDIF: value->rValue = model->B4SOIlndif; return(OK); @@ -1152,9 +1430,15 @@ B4SOImAsk(CKTcircuit *ckt, GENmodel *inst, int which, IFvalue *value) case B4SOI_MOD_LNGATE: value->rValue = model->B4SOIlngate; return(OK); + case B4SOI_MOD_LNSD: + value->rValue = model->B4SOIlnsd; + return(OK); case B4SOI_MOD_LVTH0: value->rValue = model->B4SOIlvth0; return(OK); + case B4SOI_MOD_LVFB: + value->rValue = model->B4SOIlvfb; + return(OK); /* v4.1 */ case B4SOI_MOD_LK1: value->rValue = model->B4SOIlk1; return(OK); @@ -1319,6 +1603,22 @@ B4SOImAsk(CKTcircuit *ckt, GENmodel *inst, int which, IFvalue *value) return(OK); case B4SOI_MOD_LFBJTII: value->rValue = model->B4SOIlfbjtii; + return(OK); + /*4.1 Iii model*/ + case B4SOI_MOD_LEBJTII: + value->rValue = model->B4SOIlebjtii; + return(OK); + case B4SOI_MOD_LCBJTII: + value->rValue = model->B4SOIlcbjtii; + return(OK); + case B4SOI_MOD_LVBCI: + value->rValue = model->B4SOIlvbci; + return(OK); + case B4SOI_MOD_LABJTII: + value->rValue = model->B4SOIlabjtii; + return(OK); + case B4SOI_MOD_LMBJTII: + value->rValue = model->B4SOIlmbjtii; return(OK); case B4SOI_MOD_LBETA0: value->rValue = model->B4SOIlbeta0; @@ -1362,6 +1662,37 @@ B4SOImAsk(CKTcircuit *ckt, GENmodel *inst, int which, IFvalue *value) case B4SOI_MOD_LEGIDL: value->rValue = model->B4SOIlegidl; return(OK); + case B4SOI_MOD_LRGIDL: + value->rValue = model->B4SOIlrgidl; + return(OK); + case B4SOI_MOD_LKGIDL: + value->rValue = model->B4SOIlkgidl; + return(OK); + case B4SOI_MOD_LFGIDL: + value->rValue = model->B4SOIlfgidl; + return(OK); + + case B4SOI_MOD_LAGISL: + value->rValue = model->B4SOIlagisl; + return(OK); + case B4SOI_MOD_LBGISL: + value->rValue = model->B4SOIlbgisl; + return(OK); + case B4SOI_MOD_LCGISL: + value->rValue = model->B4SOIlcgisl; + return(OK); + case B4SOI_MOD_LEGISL: + value->rValue = model->B4SOIlegisl; + return(OK); + case B4SOI_MOD_LRGISL: + value->rValue = model->B4SOIlrgisl; + return(OK); + case B4SOI_MOD_LKGISL: + value->rValue = model->B4SOIlkgisl; + return(OK); + case B4SOI_MOD_LFGISL: + value->rValue = model->B4SOIlfgisl; + return(OK); case B4SOI_MOD_LNTUNS: /* v4.0 */ value->rValue = model->B4SOIlntun; return(OK); @@ -1477,6 +1808,15 @@ B4SOImAsk(CKTcircuit *ckt, GENmodel *inst, int which, IFvalue *value) case B4SOI_MOD_WBETAGB2: value->rValue = model->B4SOIwbetaGB2; return(OK); + case B4SOI_MOD_WAIGBCP2: + value->rValue = model->B4SOIwaigbcp2; + return(OK); + case B4SOI_MOD_WBIGBCP2: + value->rValue = model->B4SOIwbigbcp2; + return(OK); + case B4SOI_MOD_WCIGBCP2: + value->rValue = model->B4SOIwcigbcp2; + return(OK); case B4SOI_MOD_WNDIF: value->rValue = model->B4SOIwndif; return(OK); @@ -1582,9 +1922,15 @@ B4SOImAsk(CKTcircuit *ckt, GENmodel *inst, int which, IFvalue *value) case B4SOI_MOD_WNGATE: value->rValue = model->B4SOIwngate; return(OK); + case B4SOI_MOD_WNSD: + value->rValue = model->B4SOIwnsd; + return(OK); case B4SOI_MOD_WVTH0: value->rValue = model->B4SOIwvth0; return(OK); + case B4SOI_MOD_WVFB: + value->rValue = model->B4SOIwvfb; + return(OK); /* v4.1 */ case B4SOI_MOD_WK1: value->rValue = model->B4SOIwk1; return(OK); @@ -1750,6 +2096,22 @@ B4SOImAsk(CKTcircuit *ckt, GENmodel *inst, int which, IFvalue *value) case B4SOI_MOD_WFBJTII: value->rValue = model->B4SOIwfbjtii; return(OK); + /*4.1 Iii model*/ + case B4SOI_MOD_WEBJTII: + value->rValue = model->B4SOIwebjtii; + return(OK); + case B4SOI_MOD_WCBJTII: + value->rValue = model->B4SOIwcbjtii; + return(OK); + case B4SOI_MOD_WVBCI: + value->rValue = model->B4SOIwvbci; + return(OK); + case B4SOI_MOD_WABJTII: + value->rValue = model->B4SOIwabjtii; + return(OK); + case B4SOI_MOD_WMBJTII: + value->rValue = model->B4SOIwmbjtii; + return(OK); case B4SOI_MOD_WBETA0: value->rValue = model->B4SOIwbeta0; return(OK); @@ -1792,6 +2154,45 @@ B4SOImAsk(CKTcircuit *ckt, GENmodel *inst, int which, IFvalue *value) case B4SOI_MOD_WEGIDL: value->rValue = model->B4SOIwegidl; return(OK); + case B4SOI_MOD_WRGIDL: + value->rValue = model->B4SOIwrgidl; + return(OK); + case B4SOI_MOD_WKGIDL: + value->rValue = model->B4SOIwkgidl; + return(OK); + case B4SOI_MOD_WFGIDL: + value->rValue = model->B4SOIwfgidl; + return(OK); + + case B4SOI_MOD_WAGISL: + value->rValue = model->B4SOIwagisl; + return(OK); + + case B4SOI_MOD_WBGISL: + value->rValue = model->B4SOIwbgisl; + return(OK); + + case B4SOI_MOD_WCGISL: + value->rValue = model->B4SOIwcgisl; + return(OK); + + case B4SOI_MOD_WEGISL: + value->rValue = model->B4SOIwegisl; + return(OK); + + case B4SOI_MOD_WRGISL: + value->rValue = model->B4SOIwrgisl; + return(OK); + + case B4SOI_MOD_WKGISL: + value->rValue = model->B4SOIwkgisl; + return(OK); + + case B4SOI_MOD_WFGISL: + value->rValue = model->B4SOIwfgisl; + return(OK); + + case B4SOI_MOD_WNTUNS: /* v4.0 */ value->rValue = model->B4SOIwntun; return(OK); @@ -1907,6 +2308,15 @@ B4SOImAsk(CKTcircuit *ckt, GENmodel *inst, int which, IFvalue *value) case B4SOI_MOD_PBETAGB2: value->rValue = model->B4SOIpbetaGB2; return(OK); + case B4SOI_MOD_PAIGBCP2: + value->rValue = model->B4SOIpaigbcp2; + return(OK); + case B4SOI_MOD_PBIGBCP2: + value->rValue = model->B4SOIpbigbcp2; + return(OK); + case B4SOI_MOD_PCIGBCP2: + value->rValue = model->B4SOIpcigbcp2; + return(OK); case B4SOI_MOD_PNDIF: value->rValue = model->B4SOIpndif; return(OK); @@ -2013,9 +2423,15 @@ B4SOImAsk(CKTcircuit *ckt, GENmodel *inst, int which, IFvalue *value) case B4SOI_MOD_PNGATE: value->rValue = model->B4SOIpngate; return(OK); + case B4SOI_MOD_PNSD: + value->rValue = model->B4SOIpnsd; + return(OK); case B4SOI_MOD_PVTH0: value->rValue = model->B4SOIpvth0; return(OK); + case B4SOI_MOD_PVFB: + value->rValue = model->B4SOIpvfb; + return(OK); /* v4.1 */ case B4SOI_MOD_PK1: value->rValue = model->B4SOIpk1; return(OK); @@ -2181,6 +2597,23 @@ B4SOImAsk(CKTcircuit *ckt, GENmodel *inst, int which, IFvalue *value) case B4SOI_MOD_PFBJTII: value->rValue = model->B4SOIpfbjtii; return(OK); + /*4.1 Iii model*/ + case B4SOI_MOD_PEBJTII: + value->rValue = model->B4SOIpebjtii; + return(OK); + case B4SOI_MOD_PCBJTII: + value->rValue = model->B4SOIpcbjtii; + return(OK); + case B4SOI_MOD_PVBCI: + value->rValue = model->B4SOIpvbci; + return(OK); + case B4SOI_MOD_PABJTII: + value->rValue = model->B4SOIpabjtii; + return(OK); + case B4SOI_MOD_PMBJTII: + value->rValue = model->B4SOIpmbjtii; + return(OK); + case B4SOI_MOD_PBETA0: value->rValue = model->B4SOIpbeta0; return(OK); @@ -2223,6 +2656,38 @@ B4SOImAsk(CKTcircuit *ckt, GENmodel *inst, int which, IFvalue *value) case B4SOI_MOD_PEGIDL: value->rValue = model->B4SOIpegidl; return(OK); + case B4SOI_MOD_PRGIDL: + value->rValue = model->B4SOIprgidl; + return(OK); + case B4SOI_MOD_PKGIDL: + value->rValue = model->B4SOIpkgidl; + return(OK); + case B4SOI_MOD_PFGIDL: + value->rValue = model->B4SOIpfgidl; + return(OK); + + case B4SOI_MOD_PAGISL: + value->rValue = model->B4SOIpagisl; + return(OK); + case B4SOI_MOD_PBGISL: + value->rValue = model->B4SOIpbgisl; + return(OK); + case B4SOI_MOD_PCGISL: + value->rValue = model->B4SOIpcgisl; + return(OK); + case B4SOI_MOD_PEGISL: + value->rValue = model->B4SOIpegisl; + return(OK); + case B4SOI_MOD_PRGISL: + value->rValue = model->B4SOIprgisl; + return(OK); + case B4SOI_MOD_PKGISL: + value->rValue = model->B4SOIpkgisl; + return(OK); + case B4SOI_MOD_PFGISL: + value->rValue = model->B4SOIpfgisl; + return(OK); + case B4SOI_MOD_PNTUNS: /* v4.0 */ value->rValue = model->B4SOIpntun; return(OK); diff --git a/src/spicelib/devices/bsim3soi/b4soimdel.c b/src/spicelib/devices/bsim3soi/b4soimdel.c index 499961c08..b480744e2 100644 --- a/src/spicelib/devices/bsim3soi/b4soimdel.c +++ b/src/spicelib/devices/bsim3soi/b4soimdel.c @@ -1,12 +1,14 @@ -/*** B4SOI 11/30/2005 Xuemei (Jane) Xi Release ***/ +/*** B4SOI 03/06/2009 Wenwei Yang Release ***/ /********** - * Copyright 2005 Regents of the University of California. All rights reserved. + * Copyright 2009 Regents of the University of California. All rights reserved. * Authors: 1998 Samuel Fung, Dennis Sinitsky and Stephen Tang * Authors: 1999-2004 Pin Su, Hui Wan, Wei Jin, b3soimdel.c * Authors: 2005- Hui Wan, Xuemei Xi, Ali Niknejad, Chenming Hu. + * Authors: 2009- Wenwei Yang, Chung-Hsun Lin, Ali Niknejad, Chenming Hu. * File: b4soimdel.c * Modified by Hui Wan, Xuemei Xi 11/30/2005 + * Modified by Wenwei Yang, Chung-Hsun Lin, Darsen Lu 03/06/2009 **********/ #include "ngspice.h" diff --git a/src/spicelib/devices/bsim3soi/b4soimpar.c b/src/spicelib/devices/bsim3soi/b4soimpar.c index a135e15ee..618a60ab8 100644 --- a/src/spicelib/devices/bsim3soi/b4soimpar.c +++ b/src/spicelib/devices/bsim3soi/b4soimpar.c @@ -1,12 +1,14 @@ -/*** B4SOI 11/30/2005 Xuemei (Jane) Xi Release ***/ +/*** B4SOI 03/06/2009 Wenwei Yang Release ***/ /********** - * Copyright 2005 Regents of the University of California. All rights reserved. + * Copyright 2009 Regents of the University of California. All rights reserved. * Authors: 1998 Samuel Fung, Dennis Sinitsky and Stephen Tang * Authors: 1999-2004 Pin Su, Hui Wan, Wei Jin, b3soimpar.c * Authors: 2005- Hui Wan, Xuemei Xi, Ali Niknejad, Chenming Hu. + * Authors: 2009- Wenwei Yang, Chung-Hsun Lin, Ali Niknejad, Chenming Hu. * File: b4soimpar.c * Modified by Hui Wan, Xuemei Xi 11/30/2005 + * Modified by Wenwei Yang, Chung-Hsun Lin, Darsen Lu 03/06/2009 **********/ #include "ngspice.h" @@ -52,17 +54,101 @@ B4SOImParam(int param, IFvalue *value, GENmodel *inMod) case B4SOI_MOD_VERSION : mod->B4SOIversion = value->rValue; mod->B4SOIversionGiven = TRUE; + break; + case B4SOI_MOD_MTRLMOD : + mod->B4SOImtrlMod = value->iValue; + mod->B4SOImtrlModGiven = TRUE; + break; + case B4SOI_MOD_VGSTCVMOD : + mod->B4SOIvgstcvMod = value->iValue; + mod->B4SOIvgstcvModGiven = TRUE; + break; + case B4SOI_MOD_GIDLMOD : + mod->B4SOIgidlMod = value->iValue; + mod->B4SOIgidlModGiven = TRUE; + break; + case B4SOI_MOD_IIIMOD : + mod->B4SOIiiiMod = value->iValue; + mod->B4SOIiiiModGiven = TRUE; break; case B4SOI_MOD_TOX : mod->B4SOItox = value->rValue; mod->B4SOItoxGiven = TRUE; break; - + case B4SOI_MOD_TOXP : + mod->B4SOItoxp = value->rValue; + mod->B4SOItoxpGiven = TRUE; + break; + case B4SOI_MOD_LEFFEOT : + mod->B4SOIleffeot = value->rValue; + mod->B4SOIleffeotGiven = TRUE; + break; + case B4SOI_MOD_WEFFEOT : + mod->B4SOIweffeot = value->rValue; + mod->B4SOIweffeotGiven = TRUE; + break; + case B4SOI_MOD_VDDEOT : + mod->B4SOIvddeot = value->rValue; + mod->B4SOIvddeotGiven = TRUE; + break; + case B4SOI_MOD_TEMPEOT : + mod->B4SOItempeot = value->rValue; + mod->B4SOItempeotGiven = TRUE; + break; + case B4SOI_MOD_ADOS : + mod->B4SOIados = value->rValue; + mod->B4SOIadosGiven = TRUE; + break; + case B4SOI_MOD_BDOS : + mod->B4SOIbdos = value->rValue; + mod->B4SOIbdosGiven = TRUE; + break; + case B4SOI_MOD_EPSRGATE: + mod->B4SOIepsrgate = value->rValue; + mod->B4SOIepsrgateGiven = TRUE; + break; + case B4SOI_MOD_PHIG: + mod->B4SOIphig = value->rValue; + mod->B4SOIphigGiven = TRUE; + break; + case B4SOI_MOD_EASUB: + mod->B4SOIeasub = value->rValue; + mod->B4SOIeasubGiven = TRUE; + break; + case B4SOI_MOD_TOXM : mod->B4SOItoxm = value->rValue; mod->B4SOItoxmGiven = TRUE; break; /* v3.2 */ - + /*4.1 */ + case B4SOI_MOD_EOT : + mod->B4SOIeot = value->rValue; + mod->B4SOIeotGiven = TRUE; + break; + case B4SOI_MOD_EPSROX : + mod->B4SOIepsrox = value->rValue; + mod->B4SOIepsroxGiven = TRUE; + break; + case B4SOI_MOD_EPSRSUB: + mod->B4SOIepsrsub = value->rValue; + mod->B4SOIepsrsubGiven = TRUE; + break; + case B4SOI_MOD_NI0SUB: + mod->B4SOIni0sub = value->rValue; + mod->B4SOIni0subGiven = TRUE; + break; + case B4SOI_MOD_BG0SUB: + mod->B4SOIbg0sub = value->rValue; + mod->B4SOIbg0subGiven = TRUE; + break; + case B4SOI_MOD_TBGASUB: + mod->B4SOItbgasub = value->rValue; + mod->B4SOItbgasubGiven = TRUE; + break; + case B4SOI_MOD_TBGBSUB: + mod->B4SOItbgbsub = value->rValue; + mod->B4SOItbgbsubGiven = TRUE; + break; /* v2.2.3 */ case B4SOI_MOD_DTOXCV : mod->B4SOIdtoxcv = value->rValue; @@ -131,6 +217,12 @@ B4SOImParam(int param, IFvalue *value, GENmodel *inMod) if (mod->B4SOInpeak > 1.0e20) mod->B4SOInpeak *= 1.0e-6; break; + case B4SOI_MOD_NSD: + mod->B4SOInsd = value->rValue; + mod->B4SOInsdGiven = TRUE; + if (mod->B4SOInsd > 1.0e23) + mod->B4SOInsd *= 1.0e-6; + break; case B4SOI_MOD_NGATE: mod->B4SOIngate = value->rValue; mod->B4SOIngateGiven = TRUE; @@ -233,6 +325,10 @@ B4SOImParam(int param, IFvalue *value, GENmodel *inMod) mod->B4SOIvth0 = value->rValue; mod->B4SOIvth0Given = TRUE; break; + case B4SOI_MOD_VFB: + mod->B4SOIvfb = value->rValue; + mod->B4SOIvfbGiven = TRUE; + break; /* v4.1 */ case B4SOI_MOD_UA: mod->B4SOIua = value->rValue; mod->B4SOIuaGiven = TRUE; @@ -265,6 +361,86 @@ B4SOImParam(int param, IFvalue *value, GENmodel *inMod) mod->B4SOIute = value->rValue; mod->B4SOIuteGiven = TRUE; break; +/*4.1 mobmod=4*/ +case B4SOI_MOD_UD: + mod->B4SOIud = value->rValue; + mod->B4SOIudGiven = TRUE; + break; + case B4SOI_MOD_LUD: + mod->B4SOIlud = value->rValue; + mod->B4SOIludGiven = TRUE; + break; + case B4SOI_MOD_WUD: + mod->B4SOIwud = value->rValue; + mod->B4SOIwudGiven = TRUE; + break; + case B4SOI_MOD_PUD: + mod->B4SOIpud = value->rValue; + mod->B4SOIpudGiven = TRUE; + break; + case B4SOI_MOD_UD1: + mod->B4SOIud1 = value->rValue; + mod->B4SOIud1Given = TRUE; + break; + case B4SOI_MOD_LUD1: + mod->B4SOIlud1 = value->rValue; + mod->B4SOIlud1Given = TRUE; + break; + case B4SOI_MOD_WUD1: + mod->B4SOIwud1 = value->rValue; + mod->B4SOIwud1Given = TRUE; + break; + case B4SOI_MOD_PUD1: + mod->B4SOIpud1 = value->rValue; + mod->B4SOIpud1Given = TRUE; + break; + case B4SOI_MOD_EU: + mod->B4SOIeu = value->rValue; + mod->B4SOIeuGiven = TRUE; + break; + case B4SOI_MOD_LEU: + mod->B4SOIleu = value->rValue; + mod->B4SOIleuGiven = TRUE; + break; + case B4SOI_MOD_WEU: + mod->B4SOIweu = value->rValue; + mod->B4SOIweuGiven = TRUE; + break; + case B4SOI_MOD_PEU: + mod->B4SOIpeu = value->rValue; + mod->B4SOIpeuGiven = TRUE; + break; + case B4SOI_MOD_UCS: + mod->B4SOIucs = value->rValue; + mod->B4SOIucsGiven = TRUE; + break; + case B4SOI_MOD_LUCS: + mod->B4SOIlucs = value->rValue; + mod->B4SOIlucsGiven = TRUE; + break; + case B4SOI_MOD_WUCS: + mod->B4SOIwucs = value->rValue; + mod->B4SOIwucsGiven = TRUE; + break; + case B4SOI_MOD_PUCS: + mod->B4SOIpucs = value->rValue; + mod->B4SOIpucsGiven = TRUE; + case B4SOI_MOD_UCSTE: + mod->B4SOIucste = value->rValue; + mod->B4SOIucsteGiven = TRUE; + break; + case B4SOI_MOD_LUCSTE: + mod->B4SOIlucste = value->rValue; + mod->B4SOIlucsteGiven = TRUE; + break; + case B4SOI_MOD_WUCSTE: + mod->B4SOIwucste = value->rValue; + mod->B4SOIwucsteGiven = TRUE; + break; + case B4SOI_MOD_PUCSTE: + mod->B4SOIpucste = value->rValue; + mod->B4SOIpucsteGiven = TRUE; + break; case B4SOI_MOD_VOFF: mod->B4SOIvoff = value->rValue; mod->B4SOIvoffGiven = TRUE; @@ -397,6 +573,10 @@ B4SOImParam(int param, IFvalue *value, GENmodel *inMod) case B4SOI_MOD_TSI : mod->B4SOItsi = value->rValue; mod->B4SOItsiGiven = TRUE; + break; + case B4SOI_MOD_ETSI : + mod->B4SOIetsi = value->rValue; + mod->B4SOIetsiGiven = TRUE; break; case B4SOI_MOD_XJ : mod->B4SOIxj = value->rValue; @@ -434,6 +614,92 @@ B4SOImParam(int param, IFvalue *value, GENmodel *inMod) mod->B4SOIcgidl = value->rValue; mod->B4SOIcgidlGiven = TRUE; break; + case B4SOI_MOD_RGIDL : + mod->B4SOIrgidl = value->rValue; + mod->B4SOIrgidlGiven = TRUE; + break; + case B4SOI_MOD_KGIDL : + mod->B4SOIkgidl = value->rValue; + mod->B4SOIkgidlGiven = TRUE; + break; + case B4SOI_MOD_FGIDL : + mod->B4SOIfgidl = value->rValue; + mod->B4SOIfgidlGiven = TRUE; + break; + + case B4SOI_MOD_EGISL : + mod->B4SOIegisl = value->rValue; + mod->B4SOIegislGiven = TRUE; + break; + case B4SOI_MOD_AGISL : + mod->B4SOIagisl = value->rValue; + mod->B4SOIagislGiven = TRUE; + break; + case B4SOI_MOD_BGISL : + mod->B4SOIbgisl = value->rValue; + mod->B4SOIbgislGiven = TRUE; + break; + case B4SOI_MOD_CGISL : + mod->B4SOIcgisl = value->rValue; + mod->B4SOIcgislGiven = TRUE; + break; + case B4SOI_MOD_RGISL : + mod->B4SOIrgisl = value->rValue; + mod->B4SOIrgislGiven = TRUE; + break; + case B4SOI_MOD_KGISL : + mod->B4SOIkgisl = value->rValue; + mod->B4SOIkgislGiven = TRUE; + break; + case B4SOI_MOD_FGISL : + mod->B4SOIfgisl = value->rValue; + mod->B4SOIfgislGiven = TRUE; + break; + case B4SOI_MOD_FDMOD : + mod->B4SOIfdMod = value->rValue; + mod->B4SOIfdModGiven = TRUE; + break; + case B4SOI_MOD_VSCE : + mod->B4SOIvsce = value->rValue; + mod->B4SOIvsceGiven = TRUE; + break; + case B4SOI_MOD_CDSBS : + mod->B4SOIcdsbs = value->rValue; + mod->B4SOIcdsbsGiven = TRUE; + break; + case B4SOI_MOD_MINVCV: + mod->B4SOIminvcv = value->rValue; + mod->B4SOIminvcvGiven = TRUE; + break; + case B4SOI_MOD_LMINVCV: + mod->B4SOIlminvcv = value->rValue; + mod->B4SOIlminvcvGiven = TRUE; + break; + case B4SOI_MOD_WMINVCV: + mod->B4SOIwminvcv = value->rValue; + mod->B4SOIwminvcvGiven = TRUE; + break; + case B4SOI_MOD_PMINVCV: + mod->B4SOIpminvcv = value->rValue; + mod->B4SOIpminvcvGiven = TRUE; + break; + case B4SOI_MOD_VOFFCV: + mod->B4SOIvoffcv = value->rValue; + mod->B4SOIvoffcvGiven = TRUE; + break; + case B4SOI_MOD_LVOFFCV: + mod->B4SOIlvoffcv = value->rValue; + mod->B4SOIlvoffcvGiven = TRUE; + break; + case B4SOI_MOD_WVOFFCV: + mod->B4SOIwvoffcv = value->rValue; + mod->B4SOIwvoffcvGiven = TRUE; + break; + case B4SOI_MOD_PVOFFCV: + mod->B4SOIpvoffcv = value->rValue; + mod->B4SOIpvoffcvGiven = TRUE; + break; + case B4SOI_MOD_NDIODES : /* v4.0 */ mod->B4SOIndiode = value->rValue; mod->B4SOIndiodeGiven = TRUE; @@ -776,6 +1042,18 @@ B4SOImParam(int param, IFvalue *value, GENmodel *inMod) mod->B4SOIvgb2 = value->rValue; mod->B4SOIvgb2Given = TRUE; break; + case B4SOI_MOD_AIGBCP2 : + mod->B4SOIaigbcp2 = value->rValue; + mod->B4SOIaigbcp2Given = TRUE; + break; + case B4SOI_MOD_BIGBCP2 : + mod->B4SOIbigbcp2 = value->rValue; + mod->B4SOIbigbcp2Given = TRUE; + break; + case B4SOI_MOD_CIGBCP2 : + mod->B4SOIcigbcp2 = value->rValue; + mod->B4SOIcigbcp2Given = TRUE; + break; case B4SOI_MOD_TOXQM : mod->B4SOItoxqm = value->rValue; mod->B4SOItoxqmGiven = TRUE; @@ -902,6 +1180,18 @@ B4SOImParam(int param, IFvalue *value, GENmodel *inMod) mod->B4SOIdvtp1 = value->rValue; mod->B4SOIdvtp1Given = TRUE; break; + case B4SOI_MOD_DVTP2: + mod->B4SOIdvtp2 = value->rValue; + mod->B4SOIdvtp2Given = TRUE; + break; + case B4SOI_MOD_DVTP3: + mod->B4SOIdvtp3 = value->rValue; + mod->B4SOIdvtp3Given = TRUE; + break; + case B4SOI_MOD_DVTP4: + mod->B4SOIdvtp4 = value->rValue; + mod->B4SOIdvtp4Given = TRUE; + break; case B4SOI_MOD_LDVTP0: mod->B4SOIldvtp0 = value->rValue; mod->B4SOIldvtp0Given = TRUE; @@ -910,6 +1200,18 @@ B4SOImParam(int param, IFvalue *value, GENmodel *inMod) mod->B4SOIldvtp1 = value->rValue; mod->B4SOIldvtp1Given = TRUE; break; + case B4SOI_MOD_LDVTP2: + mod->B4SOIldvtp2 = value->rValue; + mod->B4SOIldvtp2Given = TRUE; + break; + case B4SOI_MOD_LDVTP3: + mod->B4SOIldvtp3 = value->rValue; + mod->B4SOIldvtp3Given = TRUE; + break; + case B4SOI_MOD_LDVTP4: + mod->B4SOIldvtp4 = value->rValue; + mod->B4SOIldvtp4Given = TRUE; + break; case B4SOI_MOD_WDVTP0: mod->B4SOIwdvtp0 = value->rValue; mod->B4SOIwdvtp0Given = TRUE; @@ -918,6 +1220,18 @@ B4SOImParam(int param, IFvalue *value, GENmodel *inMod) mod->B4SOIwdvtp1 = value->rValue; mod->B4SOIwdvtp1Given = TRUE; break; + case B4SOI_MOD_WDVTP2: + mod->B4SOIwdvtp2 = value->rValue; + mod->B4SOIwdvtp2Given = TRUE; + break; + case B4SOI_MOD_WDVTP3: + mod->B4SOIwdvtp3 = value->rValue; + mod->B4SOIwdvtp3Given = TRUE; + break; + case B4SOI_MOD_WDVTP4: + mod->B4SOIwdvtp4 = value->rValue; + mod->B4SOIwdvtp4Given = TRUE; + break; case B4SOI_MOD_PDVTP0: mod->B4SOIpdvtp0 = value->rValue; mod->B4SOIpdvtp0Given = TRUE; @@ -926,6 +1240,18 @@ B4SOImParam(int param, IFvalue *value, GENmodel *inMod) mod->B4SOIpdvtp1 = value->rValue; mod->B4SOIpdvtp1Given = TRUE; break; + case B4SOI_MOD_PDVTP2: + mod->B4SOIpdvtp2 = value->rValue; + mod->B4SOIpdvtp2Given = TRUE; + break; + case B4SOI_MOD_PDVTP3: + mod->B4SOIpdvtp3 = value->rValue; + mod->B4SOIpdvtp3Given = TRUE; + break; + case B4SOI_MOD_PDVTP4: + mod->B4SOIpdvtp4 = value->rValue; + mod->B4SOIpdvtp4Given = TRUE; + break; case B4SOI_MOD_MINV: mod->B4SOIminv = value->rValue; mod->B4SOIminvGiven = TRUE; @@ -1152,6 +1478,10 @@ B4SOImParam(int param, IFvalue *value, GENmodel *inMod) case B4SOI_MOD_TII : mod->B4SOItii = value->rValue; mod->B4SOItiiGiven = TRUE; + break; + case B4SOI_MOD_TVBCI : + mod->B4SOItvbci = value->rValue; + mod->B4SOItvbciGiven = TRUE; break; case B4SOI_MOD_LII : mod->B4SOIlii = value->rValue; @@ -1177,6 +1507,27 @@ B4SOImParam(int param, IFvalue *value, GENmodel *inMod) mod->B4SOIfbjtii = value->rValue; mod->B4SOIfbjtiiGiven = TRUE; break; + /*4.1 Iii model*/ + case B4SOI_MOD_EBJTII : + mod->B4SOIebjtii = value->rValue; + mod->B4SOIebjtiiGiven = TRUE; + break; + case B4SOI_MOD_CBJTII : + mod->B4SOIcbjtii = value->rValue; + mod->B4SOIcbjtiiGiven = TRUE; + break; + case B4SOI_MOD_VBCI : + mod->B4SOIvbci = value->rValue; + mod->B4SOIvbciGiven = TRUE; + break; + case B4SOI_MOD_ABJTII : + mod->B4SOIabjtii = value->rValue; + mod->B4SOIabjtiiGiven = TRUE; + break; + case B4SOI_MOD_MBJTII : + mod->B4SOImbjtii = value->rValue; + mod->B4SOImbjtiiGiven = TRUE; + break; case B4SOI_MOD_ESATII : mod->B4SOIesatii = value->rValue; mod->B4SOIesatiiGiven = TRUE; @@ -1371,6 +1722,18 @@ B4SOImParam(int param, IFvalue *value, GENmodel *inMod) mod->B4SOIlbetaGB2 = value->rValue; mod->B4SOIlbetaGB2Given = TRUE; break; + case B4SOI_MOD_LAIGBCP2 : + mod->B4SOIlaigbcp2 = value->rValue; + mod->B4SOIlaigbcp2Given = TRUE; + break; + case B4SOI_MOD_LBIGBCP2 : + mod->B4SOIlbigbcp2 = value->rValue; + mod->B4SOIlbigbcp2Given = TRUE; + break; + case B4SOI_MOD_LCIGBCP2 : + mod->B4SOIlcigbcp2 = value->rValue; + mod->B4SOIlcigbcp2Given = TRUE; + break; case B4SOI_MOD_LNDIF : mod->B4SOIlndif = value->rValue; mod->B4SOIlndifGiven = TRUE; @@ -1511,10 +1874,18 @@ B4SOImParam(int param, IFvalue *value, GENmodel *inMod) mod->B4SOIlngate = value->rValue; mod->B4SOIlngateGiven = TRUE; break; + case B4SOI_MOD_LNSD: + mod->B4SOIlnsd = value->rValue; + mod->B4SOIlnsdGiven = TRUE; + break; case B4SOI_MOD_LVTH0: mod->B4SOIlvth0 = value->rValue; mod->B4SOIlvth0Given = TRUE; break; + case B4SOI_MOD_LVFB: + mod->B4SOIlvfb = value->rValue; + mod->B4SOIlvfbGiven = TRUE; + break; /* v4.1 */ case B4SOI_MOD_LK1: mod->B4SOIlk1 = value->rValue; mod->B4SOIlk1Given = TRUE; @@ -1735,6 +2106,28 @@ B4SOImParam(int param, IFvalue *value, GENmodel *inMod) mod->B4SOIlfbjtii = value->rValue; mod->B4SOIlfbjtiiGiven = TRUE; break; + /*4.1 Iii model*/ + case B4SOI_MOD_LEBJTII : + mod->B4SOIlebjtii = value->rValue; + mod->B4SOIlebjtiiGiven = TRUE; + break; + case B4SOI_MOD_LCBJTII : + mod->B4SOIlcbjtii = value->rValue; + mod->B4SOIlcbjtiiGiven = TRUE; + break; + case B4SOI_MOD_LVBCI : + mod->B4SOIlvbci = value->rValue; + mod->B4SOIlvbciGiven = TRUE; + break; + case B4SOI_MOD_LABJTII : + mod->B4SOIlabjtii = value->rValue; + mod->B4SOIlabjtiiGiven = TRUE; + break; + case B4SOI_MOD_LMBJTII : + mod->B4SOIlmbjtii = value->rValue; + mod->B4SOIlmbjtiiGiven = TRUE; + break; + case B4SOI_MOD_LBETA0 : mod->B4SOIlbeta0 = value->rValue; mod->B4SOIlbeta0Given = TRUE; @@ -1791,6 +2184,47 @@ B4SOImParam(int param, IFvalue *value, GENmodel *inMod) mod->B4SOIlegidl = value->rValue; mod->B4SOIlegidlGiven = TRUE; break; + case B4SOI_MOD_LRGIDL : + mod->B4SOIlrgidl = value->rValue; + mod->B4SOIlrgidlGiven = TRUE; + break; + case B4SOI_MOD_LKGIDL : + mod->B4SOIlkgidl = value->rValue; + mod->B4SOIlkgidlGiven = TRUE; + break; + case B4SOI_MOD_LFGIDL : + mod->B4SOIlfgidl = value->rValue; + mod->B4SOIlfgidlGiven = TRUE; + break; + + case B4SOI_MOD_LAGISL : + mod->B4SOIlagisl = value->rValue; + mod->B4SOIlagislGiven = TRUE; + break; + case B4SOI_MOD_LBGISL : + mod->B4SOIlbgisl = value->rValue; + mod->B4SOIlbgislGiven = TRUE; + break; + case B4SOI_MOD_LCGISL : + mod->B4SOIlcgisl = value->rValue; + mod->B4SOIlcgislGiven = TRUE; + break; + case B4SOI_MOD_LEGISL : + mod->B4SOIlegisl = value->rValue; + mod->B4SOIlegislGiven = TRUE; + break; + case B4SOI_MOD_LRGISL : + mod->B4SOIlrgisl = value->rValue; + mod->B4SOIlrgislGiven = TRUE; + break; + case B4SOI_MOD_LKGISL : + mod->B4SOIlkgisl = value->rValue; + mod->B4SOIlkgislGiven = TRUE; + break; + case B4SOI_MOD_LFGISL : + mod->B4SOIlfgisl = value->rValue; + mod->B4SOIlfgislGiven = TRUE; + break; case B4SOI_MOD_LNTUNS : /* v4.0 */ mod->B4SOIlntun = value->rValue; mod->B4SOIlntunGiven = TRUE; @@ -1955,6 +2389,18 @@ B4SOImParam(int param, IFvalue *value, GENmodel *inMod) mod->B4SOIwbetaGB2 = value->rValue; mod->B4SOIwbetaGB2Given = TRUE; break; + case B4SOI_MOD_WAIGBCP2 : + mod->B4SOIwaigbcp2 = value->rValue; + mod->B4SOIwaigbcp2Given = TRUE; + break; + case B4SOI_MOD_WBIGBCP2 : + mod->B4SOIwbigbcp2 = value->rValue; + mod->B4SOIwbigbcp2Given = TRUE; + break; + case B4SOI_MOD_WCIGBCP2 : + mod->B4SOIwcigbcp2 = value->rValue; + mod->B4SOIwcigbcp2Given = TRUE; + break; case B4SOI_MOD_WNDIF : mod->B4SOIwndif = value->rValue; mod->B4SOIwndifGiven = TRUE; @@ -2094,10 +2540,18 @@ B4SOImParam(int param, IFvalue *value, GENmodel *inMod) mod->B4SOIwngate = value->rValue; mod->B4SOIwngateGiven = TRUE; break; + case B4SOI_MOD_WNSD: + mod->B4SOIwnsd = value->rValue; + mod->B4SOIwnsdGiven = TRUE; + break; case B4SOI_MOD_WVTH0: mod->B4SOIwvth0 = value->rValue; mod->B4SOIwvth0Given = TRUE; break; + case B4SOI_MOD_WVFB: + mod->B4SOIwvfb = value->rValue; + mod->B4SOIwvfbGiven = TRUE; + break; /* v4.1 */ case B4SOI_MOD_WK1: mod->B4SOIwk1 = value->rValue; mod->B4SOIwk1Given = TRUE; @@ -2318,6 +2772,28 @@ B4SOImParam(int param, IFvalue *value, GENmodel *inMod) mod->B4SOIwfbjtii = value->rValue; mod->B4SOIwfbjtiiGiven = TRUE; break; + /*4.1 Iii model*/ + case B4SOI_MOD_WEBJTII : + mod->B4SOIwebjtii = value->rValue; + mod->B4SOIwebjtiiGiven = TRUE; + break; + case B4SOI_MOD_WCBJTII : + mod->B4SOIwcbjtii = value->rValue; + mod->B4SOIwcbjtiiGiven = TRUE; + break; + case B4SOI_MOD_WVBCI : + mod->B4SOIwvbci = value->rValue; + mod->B4SOIwvbciGiven = TRUE; + break; + case B4SOI_MOD_WABJTII : + mod->B4SOIwabjtii = value->rValue; + mod->B4SOIwabjtiiGiven = TRUE; + break; + case B4SOI_MOD_WMBJTII : + mod->B4SOIwmbjtii = value->rValue; + mod->B4SOIwmbjtiiGiven = TRUE; + break; + case B4SOI_MOD_WBETA0 : mod->B4SOIwbeta0 = value->rValue; mod->B4SOIwbeta0Given = TRUE; @@ -2374,6 +2850,56 @@ B4SOImParam(int param, IFvalue *value, GENmodel *inMod) mod->B4SOIwegidl = value->rValue; mod->B4SOIwegidlGiven = TRUE; break; + case B4SOI_MOD_WRGIDL : + mod->B4SOIwrgidl = value->rValue; + mod->B4SOIwrgidlGiven = TRUE; + break; + case B4SOI_MOD_WKGIDL : + mod->B4SOIwkgidl = value->rValue; + mod->B4SOIwkgidlGiven = TRUE; + break; + case B4SOI_MOD_WFGIDL : + mod->B4SOIwfgidl = value->rValue; + mod->B4SOIwfgidlGiven = TRUE; + break; + + + case B4SOI_MOD_WAGISL : + mod->B4SOIwagisl = value->rValue; + mod->B4SOIwagislGiven = TRUE; + break; + + case B4SOI_MOD_WBGISL : + mod->B4SOIwbgisl = value->rValue; + mod->B4SOIwbgislGiven = TRUE; + break; + + case B4SOI_MOD_WCGISL : + mod->B4SOIwcgisl = value->rValue; + mod->B4SOIwcgislGiven = TRUE; + break; + + case B4SOI_MOD_WEGISL : + mod->B4SOIwegisl = value->rValue; + mod->B4SOIwegislGiven = TRUE; + break; + + case B4SOI_MOD_WRGISL : + mod->B4SOIwrgisl = value->rValue; + mod->B4SOIwrgislGiven = TRUE; + break; + + case B4SOI_MOD_WKGISL : + mod->B4SOIwkgisl = value->rValue; + mod->B4SOIwkgislGiven = TRUE; + break; + + case B4SOI_MOD_WFGISL : + mod->B4SOIwfgisl = value->rValue; + mod->B4SOIwfgislGiven = TRUE; + break; + + case B4SOI_MOD_WNTUNS : /* v4.0 */ mod->B4SOIwntun = value->rValue; mod->B4SOIwntunGiven = TRUE; @@ -2538,6 +3064,18 @@ B4SOImParam(int param, IFvalue *value, GENmodel *inMod) mod->B4SOIpbetaGB2 = value->rValue; mod->B4SOIpbetaGB2Given = TRUE; break; + case B4SOI_MOD_PAIGBCP2 : + mod->B4SOIpaigbcp2 = value->rValue; + mod->B4SOIpaigbcp2Given = TRUE; + break; + case B4SOI_MOD_PBIGBCP2 : + mod->B4SOIpbigbcp2 = value->rValue; + mod->B4SOIpbigbcp2Given = TRUE; + break; + case B4SOI_MOD_PCIGBCP2 : + mod->B4SOIpcigbcp2 = value->rValue; + mod->B4SOIpcigbcp2Given = TRUE; + break; case B4SOI_MOD_PNDIF : mod->B4SOIpndif = value->rValue; mod->B4SOIpndifGiven = TRUE; @@ -2677,10 +3215,18 @@ B4SOImParam(int param, IFvalue *value, GENmodel *inMod) mod->B4SOIpngate = value->rValue; mod->B4SOIpngateGiven = TRUE; break; + case B4SOI_MOD_PNSD: + mod->B4SOIpnsd = value->rValue; + mod->B4SOIpnsdGiven = TRUE; + break; case B4SOI_MOD_PVTH0: mod->B4SOIpvth0 = value->rValue; mod->B4SOIpvth0Given = TRUE; break; + case B4SOI_MOD_PVFB: + mod->B4SOIpvfb = value->rValue; + mod->B4SOIpvfbGiven = TRUE; + break; /* v4.1 */ case B4SOI_MOD_PK1: mod->B4SOIpk1 = value->rValue; mod->B4SOIpk1Given = TRUE; @@ -2900,6 +3446,27 @@ B4SOImParam(int param, IFvalue *value, GENmodel *inMod) case B4SOI_MOD_PFBJTII : mod->B4SOIpfbjtii = value->rValue; mod->B4SOIpfbjtiiGiven = TRUE; + break; + /*4.1 Iii model*/ + case B4SOI_MOD_PEBJTII : + mod->B4SOIpebjtii = value->rValue; + mod->B4SOIpebjtiiGiven = TRUE; + break; + case B4SOI_MOD_PCBJTII : + mod->B4SOIpcbjtii = value->rValue; + mod->B4SOIpcbjtiiGiven = TRUE; + break; + case B4SOI_MOD_PVBCI : + mod->B4SOIpvbci = value->rValue; + mod->B4SOIpvbciGiven = TRUE; + break; + case B4SOI_MOD_PABJTII : + mod->B4SOIpabjtii = value->rValue; + mod->B4SOIpabjtiiGiven = TRUE; + break; + case B4SOI_MOD_PMBJTII : + mod->B4SOIpmbjtii = value->rValue; + mod->B4SOIpmbjtiiGiven = TRUE; break; case B4SOI_MOD_PBETA0 : mod->B4SOIpbeta0 = value->rValue; @@ -2957,6 +3524,47 @@ B4SOImParam(int param, IFvalue *value, GENmodel *inMod) mod->B4SOIpegidl = value->rValue; mod->B4SOIpegidlGiven = TRUE; break; + case B4SOI_MOD_PRGIDL : + mod->B4SOIprgidl = value->rValue; + mod->B4SOIprgidlGiven = TRUE; + break; + case B4SOI_MOD_PKGIDL : + mod->B4SOIpkgidl = value->rValue; + mod->B4SOIpkgidlGiven = TRUE; + break; + case B4SOI_MOD_PFGIDL : + mod->B4SOIpfgidl = value->rValue; + mod->B4SOIpfgidlGiven = TRUE; + break; + + case B4SOI_MOD_PAGISL : + mod->B4SOIpagisl = value->rValue; + mod->B4SOIpagislGiven = TRUE; + break; + case B4SOI_MOD_PBGISL : + mod->B4SOIpbgisl = value->rValue; + mod->B4SOIpbgislGiven = TRUE; + break; + case B4SOI_MOD_PCGISL : + mod->B4SOIpcgisl = value->rValue; + mod->B4SOIpcgislGiven = TRUE; + break; + case B4SOI_MOD_PEGISL : + mod->B4SOIpegisl = value->rValue; + mod->B4SOIpegislGiven = TRUE; + break; + case B4SOI_MOD_PRGISL : + mod->B4SOIprgisl = value->rValue; + mod->B4SOIprgislGiven = TRUE; + break; + case B4SOI_MOD_PKGISL : + mod->B4SOIpkgisl = value->rValue; + mod->B4SOIpkgislGiven = TRUE; + break; + case B4SOI_MOD_PFGISL : + mod->B4SOIpfgisl = value->rValue; + mod->B4SOIpfgislGiven = TRUE; + break; case B4SOI_MOD_PNTUNS : /* v4.0 */ mod->B4SOIpntun = value->rValue; mod->B4SOIpntunGiven = TRUE; diff --git a/src/spicelib/devices/bsim3soi/b4soinoi.c b/src/spicelib/devices/bsim3soi/b4soinoi.c index 081d4193f..f7b26371b 100644 --- a/src/spicelib/devices/bsim3soi/b4soinoi.c +++ b/src/spicelib/devices/bsim3soi/b4soinoi.c @@ -1,12 +1,14 @@ -/*** B4SOI 11/30/2005 Xuemei (Jane) Xi Release ***/ +/*** B4SOI 03/06/2009 Wenwei Yang Release ***/ /********** - * Copyright 2005 Regents of the University of California. All rights reserved. + * Copyright 2009 Regents of the University of California. All rights reserved. * Authors: 1998 Samuel Fung, Dennis Sinitsky and Stephen Tang * Authors: 1999-2004 Pin Su, Hui Wan, Wei Jin, b3soinoi.c * Authors: 2005- Hui Wan, Xuemei Xi, Ali Niknejad, Chenming Hu. + * Authors: 2009- Wenwei Yang, Chung-Hsun Lin, Ali Niknejad, Chenming Hu. * File: b4soinoi.c * Modified by Hui Wan, Xuemei Xi 11/30/2005 + * Modified by Wenwei Yang, Chung-Hsun Lin, Darsen Lu 03/06/2009 **********/ #include "ngspice.h" @@ -108,7 +110,7 @@ double T0, T1, T2, T5, T10, T11; double Ssi, Swi; /* v3.2 */ -double npart_theta, npart_beta, igsquare, esat=0.0; +double npart_theta, npart_beta, igsquare, esat; /* v3.2 end */ double gspr, gdpr; @@ -139,11 +141,10 @@ int i; for (; model != NULL; model = model->B4SOInextModel) { for (here = model->B4SOIinstances; here != NULL; here = here->B4SOInextInstance) - { + { if (here->B4SOIowner != ARCHme) continue; - - pParam = here->pParam; + pParam = here->pParam; switch (operation) { case N_OPEN: /* see if we have to to produce a summary report */ @@ -219,7 +220,9 @@ int i; } } else - { T5 = here->B4SOIVgsteff / esat + { + esat = 2.0 * pParam->B4SOIvsattemp / here->B4SOIueff; + T5 = here->B4SOIVgsteff / esat / pParam->B4SOIleff; T5 *= T5; npart_beta = model->B4SOIrnoia * (1.0 + @@ -239,11 +242,11 @@ int i; } if ( (*(ckt->CKTstates[0] + here->B4SOIvds)) >= 0.0 ) - gspr = gspr / (1.0 + npart_theta + gspr = gspr * (1.0 + npart_theta * npart_theta * gspr / here->B4SOIidovVds); else - gdpr = gdpr / (1.0 + npart_theta + gdpr = gdpr * (1.0 + npart_theta * npart_theta * gdpr / here->B4SOIidovVds); } @@ -305,8 +308,8 @@ int i; NevalSrc(&noizDens[B4SOIRBODYNOIZ], &lnNdens[B4SOIRBODYNOIZ], ckt, THERMNOISE, here->B4SOIbNode, here->B4SOIpNode, - 1/ here->B4SOIrbodyext + - 1/ pParam->B4SOIrbody); + 1/ (here->B4SOIrbodyext + + pParam->B4SOIrbody)); } else { noizDens[B4SOIRBODYNOIZ] = 0.0; diff --git a/src/spicelib/devices/bsim3soi/b4soipar.c b/src/spicelib/devices/bsim3soi/b4soipar.c index e89a67705..16c46540f 100644 --- a/src/spicelib/devices/bsim3soi/b4soipar.c +++ b/src/spicelib/devices/bsim3soi/b4soipar.c @@ -1,12 +1,14 @@ -/*** B4SOI 11/30/2005 Xuemei (Jane) Xi Release ***/ +/*** B4SOI 03/06/2009 Wenwei Yang Release ***/ /********** - * Copyright 2005 Regents of the University of California. All rights reserved. + * Copyright 2009 Regents of the University of California. All rights reserved. * Authors: 1998 Samuel Fung, Dennis Sinitsky and Stephen Tang * Authors: 1999-2004 Pin Su, Hui Wan, Wei Jin, b3soipar.c * Authors: 2005- Hui Wan, Xuemei Xi, Ali Niknejad, Chenming Hu. + * Authors: 2009- Wenwei Yang, Chung-Hsun Lin, Ali Niknejad, Chenming Hu. * File: b4soipar.c * Modified by Hui Wan, Xuemei Xi 11/30/2005 + * Modified by Wenwei Yang, Chung-Hsun Lin, Darsen Lu 03/06/2009 **********/ #include "ngspice.h" @@ -175,6 +177,10 @@ B4SOIparam(int param, IFvalue *value, GENinstance *inst, IFvalue *select) here->B4SOIagbcp = value->rValue; here->B4SOIagbcpGiven = TRUE; break; + case B4SOI_AGBCP2: + here->B4SOIagbcp2 = value->rValue; + here->B4SOIagbcp2Given = TRUE; + break; /* v4.1 */ case B4SOI_AGBCPD: here->B4SOIagbcpd = value->rValue; here->B4SOIagbcpdGiven = TRUE; diff --git a/src/spicelib/devices/bsim3soi/b4soipzld.c b/src/spicelib/devices/bsim3soi/b4soipzld.c index b70664fdc..b1848ac3a 100644 --- a/src/spicelib/devices/bsim3soi/b4soipzld.c +++ b/src/spicelib/devices/bsim3soi/b4soipzld.c @@ -1,12 +1,14 @@ -/*** B4SOI 11/30/2005 Xuemei (Jane) Xi Release ***/ +/*** B4SOI 03/06/2009 Wenwei Yang Release ***/ /********** - * Copyright 2005 Regents of the University of California. All rights reserved. + * Copyright 2009 Regents of the University of California. All rights reserved. * Authors: 1998 Samuel Fung, Dennis Sinitsky and Stephen Tang * Authors: 1999-2004 Pin Su, Hui Wan, Wei Jin, b3soipzld.c * Authors: 2005- Hui Wan, Xuemei Xi, Ali Niknejad, Chenming Hu. + * Authors: 2009- Wenwei Yang, Chung-Hsun Lin, Ali Niknejad, Chenming Hu. * File: b4soipzld.c * Modified by Hui Wan, Xuemei Xi 11/30/2005 + * Modified by Wenwei Yang, Chung-Hsun Lin, Darsen Lu 03/06/2009 **********/ #include "ngspice.h" @@ -22,9 +24,9 @@ B4SOIpzLoad(GENmodel *inModel, CKTcircuit *ckt, SPcomplex *s) register B4SOImodel *model = (B4SOImodel*)inModel; register B4SOIinstance *here; double xcggb, xcgdb, xcgsb, xcbgb, xcbdb, xcbsb, xcddb, xcssb, xcdgb; -double gdpr, gspr, gds, gbd, gbs, capbd = 0.0, capbs = 0.0, xcsgb, xcdsb, xcsdb; +double gdpr, gspr, gds, gbd, gbs, capbd=0.0, capbs=0.0, xcsgb, xcdsb, xcsdb; double cggb, cgdb, cgsb, cbgb, cbdb, cbsb, cddb, cdgb, cdsb; -double GSoverlapCap, GDoverlapCap, GBoverlapCap = 0.0; +double GSoverlapCap, GDoverlapCap, GBoverlapCap=0.0; double FwdSum, RevSum, Gm, Gmbs; double m; @@ -32,15 +34,17 @@ double m; for (; model != NULL; model = model->B4SOInextModel) { for (here = model->B4SOIinstances; here!= NULL; here = here->B4SOInextInstance) - { - if (here->B4SOIowner != ARCHme) + { + if (here->B4SOImode >= 0) + { + + if (here->B4SOIowner != ARCHme) continue; - if (here->B4SOImode >= 0) - { Gm = here->B4SOIgm; - Gmbs = here->B4SOIgmbs; - FwdSum = Gm + Gmbs; - RevSum = 0.0; + Gm = here->B4SOIgm; + Gmbs = here->B4SOIgmbs; + FwdSum = Gm + Gmbs; + RevSum = 0.0; cggb = here->B4SOIcggb; cgsb = here->B4SOIcgsb; cgdb = here->B4SOIcgdb; @@ -53,11 +57,11 @@ double m; cdsb = here->B4SOIcdsb; cddb = here->B4SOIcddb; } - else - { Gm = -here->B4SOIgm; - Gmbs = -here->B4SOIgmbs; - FwdSum = 0.0; - RevSum = -Gm - Gmbs; + else + { Gm = -here->B4SOIgm; + Gmbs = -here->B4SOIgmbs; + FwdSum = 0.0; + RevSum = -Gm - Gmbs; cggb = here->B4SOIcggb; cgsb = here->B4SOIcgdb; cgdb = here->B4SOIcgsb; @@ -79,10 +83,10 @@ double m; capbd= here->B4SOIcapbd; capbs= here->B4SOIcapbs; #endif - GSoverlapCap = here->B4SOIcgso; - GDoverlapCap = here->B4SOIcgdo; + GSoverlapCap = here->B4SOIcgso; + GDoverlapCap = here->B4SOIcgdo; #ifdef BULKCODE - GBoverlapCap = here->pParam->B4SOIcgbo; + GBoverlapCap = here->pParam->B4SOIcgbo; #endif xcdgb = (cdgb - GDoverlapCap); diff --git a/src/spicelib/devices/bsim3soi/b4soiset.c b/src/spicelib/devices/bsim3soi/b4soiset.c index 1190e9f41..2cfd15ac2 100644 --- a/src/spicelib/devices/bsim3soi/b4soiset.c +++ b/src/spicelib/devices/bsim3soi/b4soiset.c @@ -1,12 +1,14 @@ -/*** B4SOI 11/30/2005 Xuemei (Jane) Xi Release ***/ +/*** B4SOI 03/06/2009 Wenwei Yang Release ***/ /********** - * Copyright 2005 Regents of the University of California. All rights reserved. + * Copyright 2009 Regents of the University of California. All rights reserved. * Authors: 1998 Samuel Fung, Dennis Sinitsky and Stephen Tang * Authors: 1999-2004 Pin Su, Hui Wan, Wei Jin, b3soiset.c * Authors: 2005- Hui Wan, Xuemei Xi, Ali Niknejad, Chenming Hu. + * Authors: 2009- Wenwei Yang, Chung-Hsun Lin, Ali Niknejad, Chenming Hu. * File: b4soiset.c * Modified by Hui Wan, Xuemei Xi 11/30/2005 + * Modified by Wenwei Yang, Chung-Hsun Lin, Darsen Lu 03/06/2009 **********/ #include "ngspice.h" @@ -23,6 +25,9 @@ #define PI 3.141592654 #define Charge_q 1.60219e-19 #define Meter2Micron 1.0e6 +#define EPS0 8.85418e-12 + +double epsrox, toxe, epssub; int B4SOIsetup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt, int *states) @@ -37,10 +42,6 @@ double Cboxt; /* v3.2 */ double Vbs0t, Qsi; -/* Alan's Nodeset Fix */ -CKTnode *tmpNode; -IFuid tmpName; - /* loop through all the B4SOI device models */ for( ; model != NULL; model = model->B4SOInextModel ) { @@ -56,6 +57,46 @@ IFuid tmpName; model->B4SOIparamChk = 0; if (!model->B4SOIcapModGiven) model->B4SOIcapMod = 2; + + if (!model->B4SOImtrlModGiven) + model->B4SOImtrlMod = 0; /*4.1*/ + if (!model->B4SOIvgstcvModGiven) + model->B4SOIvgstcvMod = 0; + if (!model->B4SOIgidlModGiven) + model->B4SOIgidlMod = 0; + if (!model->B4SOIeotGiven) + model->B4SOIeot = 100.0e-10; + if (!model->B4SOIepsroxGiven) + model->B4SOIepsrox = 3.9; + if (!model->B4SOIepsrsubGiven) + model->B4SOIepsrsub = 11.7; + if (!model->B4SOIni0subGiven) + model->B4SOIni0sub = 1.45e10; /* unit 1/cm3 */ + if (!model->B4SOIbg0subGiven) + model->B4SOIbg0sub = 1.16; /* unit eV */ + if (!model->B4SOItbgasubGiven) + model->B4SOItbgasub = 7.02e-4; + if (!model->B4SOItbgbsubGiven) + model->B4SOItbgbsub = 1108.0; + if (!model->B4SOIleffeotGiven) + model->B4SOIleffeot = 1.0; + if (!model->B4SOIweffeotGiven) + model->B4SOIweffeot = 10.0; + if (!model->B4SOIvddeotGiven) + model->B4SOIvddeot = (model->B4SOItype == NMOS) ? 1.5 : -1.5; + if (!model->B4SOItempeotGiven) + model->B4SOItempeot = 300.15; + if (!model->B4SOIadosGiven) + model->B4SOIados = 1.0; + if (!model->B4SOIbdosGiven) + model->B4SOIbdos = 1.0; + if (!model->B4SOIepsrgateGiven) + model->B4SOIepsrgate = 11.7; + if (!model->B4SOIphigGiven) + model->B4SOIphig = 4.05; + if (!model->B4SOIeasubGiven) + model->B4SOIeasub = 4.05; + /* if (!model->B4SOInoiModGiven) model->B4SOInoiMod = 1; v3.2 */ if (!model->B4SOIshModGiven) @@ -64,8 +105,30 @@ IFuid tmpName; model->B4SOIversion = 4.00; if (!model->B4SOItoxGiven) model->B4SOItox = 100.0e-10; - model->B4SOIcox = 3.453133e-11 / model->B4SOItox; + /*model->B4SOIcox = 3.453133e-11 / model->B4SOItox;*/ + if(model->B4SOImtrlMod) + { + epsrox = 3.9; + toxe = model->B4SOIeot; + epssub = EPS0 * model->B4SOIepsrsub; + //model->B4SOIcox = 3.453133e-11 / model->B4SOItox; + model->B4SOIcox = epsrox * EPS0 / toxe; + } + else + { + epsrox = model->B4SOIepsrox; + toxe = model->B4SOItox; + epssub = EPSSI; + //model->B4SOIcox = epsrox * EPS0 / toxe; + model->B4SOIcox = 3.453133e-11 / model->B4SOItox; + } + + + if (!model->B4SOItoxpGiven) + model->B4SOItoxp = model->B4SOItox; + + if (!model->B4SOItoxmGiven) model->B4SOItoxm = model->B4SOItox; /* v3.2 */ @@ -98,7 +161,7 @@ IFuid tmpName; if (!model->B4SOItnoiModGiven) model->B4SOItnoiMod = 0; - else if ((model->B4SOItnoiMod != 0) && (model->B4SOItnoiMod != 1)) + else if ((model->B4SOItnoiMod != 0) && (model->B4SOItnoiMod != 1)&& (model->B4SOItnoiMod != 2)) { model->B4SOItnoiMod = 0; printf("Waring: tnoiMod has been set to default value:0.\n"); } @@ -173,6 +236,8 @@ IFuid tmpName; model->B4SOInpeak = 1.7e17; /* unit 1/cm3 */ if (!model->B4SOIngateGiven) model->B4SOIngate = 0; /* unit 1/cm3 */ + if (!model->B4SOInsdGiven) + model->B4SOInsd = 1.0e20; if (!model->B4SOIvbmGiven) model->B4SOIvbm = -3.0; if (!model->B4SOIxtGiven) @@ -211,6 +276,8 @@ IFuid tmpName; model->B4SOIdsub = model->B4SOIdrout; if (!model->B4SOIvth0Given) model->B4SOIvth0 = (model->B4SOItype == NMOS) ? 0.7 : -0.7; + if (!model->B4SOIvfbGiven) + model->B4SOIvfb = -1.0; /* v4.1 */ if (!model->B4SOIuaGiven) model->B4SOIua = 2.25e-9; /* unit m/V */ if (!model->B4SOIua1Given) @@ -227,6 +294,49 @@ IFuid tmpName; model->B4SOIu0 = (model->B4SOItype == NMOS) ? 0.067 : 0.025; if (!model->B4SOIuteGiven) model->B4SOIute = -1.5; + + /*4.1 mobmod =4 */ + if (!model->B4SOIudGiven) + model->B4SOIud = 0.0; + if (!model->B4SOIludGiven) + model->B4SOIlud = 0.0; + if (!model->B4SOIwudGiven) + model->B4SOIwud = 0.0; + if (!model->B4SOIpudGiven) + model->B4SOIpud1 = 0.0; + if (!model->B4SOIud1Given) + model->B4SOIud1 = 0.0; + if (!model->B4SOIlud1Given) + model->B4SOIlud1 = 0.0; + if (!model->B4SOIwud1Given) + model->B4SOIwud1 = 0.0; + if (!model->B4SOIpud1Given) + model->B4SOIpud1 = 0.0; + if (!model->B4SOIeuGiven) + model->B4SOIeu = (model->B4SOItype == NMOS) ? 1.67 : 1.0; + if (!model->B4SOIleuGiven) + model->B4SOIleu = 0.0; + if (!model->B4SOIweuGiven) + model->B4SOIweu = 0.0; + if (!model->B4SOIpeuGiven) + model->B4SOIpeu = 0.0; + if (!model->B4SOIucsGiven) + model->B4SOIucs = (model->B4SOItype == NMOS) ? 1.67 : 1.0; + if (!model->B4SOIlucsGiven) + model->B4SOIlucs =0.0; + if (!model->B4SOIwucsGiven) + model->B4SOIwucs =0.0; + if (!model->B4SOIpucsGiven) + model->B4SOIpucs =0.0; + if (!model->B4SOIucsteGiven) + model->B4SOIucste = -4.775e-3; + if (!model->B4SOIlucsteGiven) + model->B4SOIlucste = 0.0; + if (!model->B4SOIwucsteGiven) + model->B4SOIwucste = 0.0; + if (!model->B4SOIpucsteGiven) + model->B4SOIpucste = 0.0; + if (!model->B4SOIvoffGiven) model->B4SOIvoff = -0.08; if (!model->B4SOIdeltaGiven) @@ -288,6 +398,8 @@ IFuid tmpName; model->B4SOItbox = 3e-7; if (!model->B4SOItsiGiven) model->B4SOItsi = 1e-7; + if (!model->B4SOIetsiGiven) + model->B4SOIetsi = 1e-7; if (!model->B4SOIxjGiven) model->B4SOIxj = model->B4SOItsi; if (!model->B4SOIrbodyGiven) @@ -307,6 +419,25 @@ IFuid tmpName; model->B4SOIbgidl = 2.3e9; /* v4.0 */ if (!model->B4SOIcgidlGiven) /* v4.0 */ model->B4SOIcgidl = 0.0; + if (!model->B4SOIrgidlGiven) /* v4.1 */ + model->B4SOIrgidl = 1.0; + if (!model->B4SOIkgidlGiven) /* v4.1 */ + model->B4SOIkgidl = 0.0; + if (!model->B4SOIfgidlGiven) /* v4.1 */ + model->B4SOIfgidl = 0.0; + if (!model->B4SOIagislGiven) + model->B4SOIagisl = model->B4SOIagidl; + if (!model->B4SOIbgislGiven) + model->B4SOIbgisl = model->B4SOIbgidl; /* v4.0 */ + if (!model->B4SOIcgislGiven) /* v4.0 */ + model->B4SOIcgisl = model->B4SOIcgidl; + if (!model->B4SOIrgislGiven) /* v4.1 */ + model->B4SOIrgisl = model->B4SOIrgidl; + if (!model->B4SOIkgislGiven) /* v4.1 */ + model->B4SOIkgisl = model->B4SOIkgidl; + if (!model->B4SOIfgislGiven) /* v4.1 */ + model->B4SOIfgisl = model->B4SOIfgidl; + if (!model->B4SOIndiodeGiven) /* v4.0 */ model->B4SOIndiode = 1.0; if (!model->B4SOIndiodedGiven) /* v4.0 */ @@ -400,6 +531,7 @@ IFuid tmpName; else model->B4SOIegidl = model->B4SOIngidl; } + if(model->B4SOIegidlGiven && model->B4SOIngidlGiven) printf("Warning: both egidl and ngidl are given. Egidl value is taken \n"); if (!model->B4SOIlegidlGiven) { @@ -427,6 +559,18 @@ IFuid tmpName; if(model->B4SOIpegidlGiven && model->B4SOIpngidlGiven) printf("Warning: both pegidl and pngidl are given. Pegidl value is taken \n"); + if (!model->B4SOIegislGiven) { + model->B4SOIegisl = model->B4SOIegidl; + } + if (!model->B4SOIlegislGiven) { + model->B4SOIlegisl = model->B4SOIlegidl; + } + if (!model->B4SOIwegislGiven) { + model->B4SOIwegisl = model->B4SOIwegidl; + } + if (!model->B4SOIpegislGiven) { + model->B4SOIpegisl = model->B4SOIpegidl; + } /* unit degree celcius */ if (!model->B4SOItnomGiven) model->B4SOItnom = ckt->CKTnomTemp; @@ -548,6 +692,12 @@ IFuid tmpName; model->B4SOIvecb = 0.026; if (!model->B4SOIvgb2Given) model->B4SOIvgb2 = 17; + if (!model->B4SOIaigbcp2Given) + model->B4SOIaigbcp2 = 0.043; + if (!model->B4SOIbigbcp2Given) + model->B4SOIbigbcp2 = 0.0054; + if (!model->B4SOIcigbcp2Given) + model->B4SOIcigbcp2 = 0.0075; if (!model->B4SOItoxqmGiven) model->B4SOItoxqm = model->B4SOItox; if (!model->B4SOIvoxhGiven) @@ -612,6 +762,20 @@ IFuid tmpName; model->B4SOIsiid = 0.0; if (!model->B4SOIfbjtiiGiven) model->B4SOIfbjtii = 0.0; + /*4.1 Iii model*/ + if (!model->B4SOIebjtiiGiven) + model->B4SOIebjtii = 0.0; + if (!model->B4SOIcbjtiiGiven) + model->B4SOIcbjtii = 0.0; + if (!model->B4SOIvbciGiven) + model->B4SOIvbci = 0.0; + if (!model->B4SOItvbciGiven) + model->B4SOItvbci = 0.0; + if (!model->B4SOIabjtiiGiven) + model->B4SOIabjtii = 0.0; + if (!model->B4SOImbjtiiGiven) + model->B4SOImbjtii = 0.4; + if (!model->B4SOIesatiiGiven) model->B4SOIesatii = 1e7; if (!model->B4SOIlnGiven) @@ -686,6 +850,12 @@ IFuid tmpName; model->B4SOIlbetaGB1 = 0.0; if (!model->B4SOIlbetaGB2Given) model->B4SOIlbetaGB2 = 0.0; + if (!model->B4SOIlaigbcp2Given) + model->B4SOIlaigbcp2 = 0.0; + if (!model->B4SOIlbigbcp2Given) + model->B4SOIlbigbcp2 = 0.0; + if (!model->B4SOIlcigbcp2Given) + model->B4SOIlcigbcp2 = 0.0; if (!model->B4SOIlndifGiven) model->B4SOIlndif = 0.0; if (!model->B4SOIlntrecfGiven) @@ -757,8 +927,12 @@ IFuid tmpName; model->B4SOIlnsub = 0.0; if (!model->B4SOIlngateGiven) model->B4SOIlngate = 0.0; + if (!model->B4SOIlnsdGiven) + model->B4SOIlnsd = 0.0; if (!model->B4SOIlvth0Given) model->B4SOIlvth0 = 0.0; + if (!model->B4SOIlvfbGiven) + model->B4SOIlvfb = 0.0; /* v4.1 */ if (!model->B4SOIlk1Given) model->B4SOIlk1 = 0.0; if (!model->B4SOIlk1w1Given) @@ -867,6 +1041,18 @@ IFuid tmpName; model->B4SOIlalpha0 = 0.0; if (!model->B4SOIlfbjtiiGiven) model->B4SOIlfbjtii = 0.0; + /*4.1 Iii model*/ + if (!model->B4SOIlebjtiiGiven) + model->B4SOIlebjtii = 0.0; + if (!model->B4SOIlcbjtiiGiven) + model->B4SOIlcbjtii = 0.0; + if (!model->B4SOIlvbciGiven) + model->B4SOIlvbci = 0.0; + if (!model->B4SOIlabjtiiGiven) + model->B4SOIlabjtii = 0.0; + if (!model->B4SOIlmbjtiiGiven) + model->B4SOIlmbjtii = 0.0; + if (!model->B4SOIlbeta0Given) model->B4SOIlbeta0 = 0.0; if (!model->B4SOIlbeta1Given) @@ -893,6 +1079,25 @@ IFuid tmpName; model->B4SOIlbgidl = 0.0; if (!model->B4SOIlcgidlGiven) model->B4SOIlcgidl = 0.0; + if (!model->B4SOIlrgidlGiven) + model->B4SOIlrgidl = 0.0; + if (!model->B4SOIlkgidlGiven) + model->B4SOIlkgidl = 0.0; + if (!model->B4SOIlfgidlGiven) + model->B4SOIlfgidl = 0.0; + + if (!model->B4SOIlagislGiven) + model->B4SOIlagisl = 0.0; + if (!model->B4SOIlbgislGiven) + model->B4SOIlbgisl = 0.0; + if (!model->B4SOIlcgislGiven) + model->B4SOIlcgisl = 0.0; + if (!model->B4SOIlrgislGiven) + model->B4SOIlrgisl = 0.0; + if (!model->B4SOIlkgislGiven) + model->B4SOIlkgisl = 0.0; + if (!model->B4SOIlfgislGiven) + model->B4SOIlfgisl = 0.0; if (!model->B4SOIlntunGiven) /* v4.0 */ model->B4SOIlntun = 0.0; if (!model->B4SOIlntundGiven) /* v4.0 */ @@ -978,6 +1183,12 @@ IFuid tmpName; model->B4SOIwbetaGB1 = 0.0; if (!model->B4SOIwbetaGB2Given) model->B4SOIwbetaGB2 = 0.0; + if (!model->B4SOIwaigbcp2Given) + model->B4SOIwaigbcp2 = 0.0; + if (!model->B4SOIwbigbcp2Given) + model->B4SOIwbigbcp2 = 0.0; + if (!model->B4SOIwcigbcp2Given) + model->B4SOIwcigbcp2 = 0.0; if (!model->B4SOIwndifGiven) model->B4SOIwndif = 0.0; if (!model->B4SOIwntrecfGiven) @@ -1050,8 +1261,12 @@ IFuid tmpName; model->B4SOIwnsub = 0.0; if (!model->B4SOIwngateGiven) model->B4SOIwngate = 0.0; + if (!model->B4SOIwnsdGiven) + model->B4SOIwnsd = 0.0; if (!model->B4SOIwvth0Given) model->B4SOIwvth0 = 0.0; + if (!model->B4SOIwvfbGiven) + model->B4SOIwvfb = 0.0; /* v4.1 */ if (!model->B4SOIwk1Given) model->B4SOIwk1 = 0.0; if (!model->B4SOIwk1w1Given) @@ -1160,6 +1375,17 @@ IFuid tmpName; model->B4SOIwalpha0 = 0.0; if (!model->B4SOIwfbjtiiGiven) model->B4SOIwfbjtii = 0.0; + /*4.1 Iii model*/ + if (!model->B4SOIwebjtiiGiven) + model->B4SOIwebjtii = 0.0; + if (!model->B4SOIwcbjtiiGiven) + model->B4SOIwcbjtii = 0.0; + if (!model->B4SOIwvbciGiven) + model->B4SOIwvbci = 0.0; + if (!model->B4SOIwabjtiiGiven) + model->B4SOIwabjtii = 0.0; + if (!model->B4SOIwmbjtiiGiven) + model->B4SOIwmbjtii = 0.0; if (!model->B4SOIwbeta0Given) model->B4SOIwbeta0 = 0.0; if (!model->B4SOIwbeta1Given) @@ -1186,6 +1412,25 @@ IFuid tmpName; model->B4SOIwbgidl = 0.0; if (!model->B4SOIwcgidlGiven) model->B4SOIwcgidl = 0.0; + if (!model->B4SOIwrgidlGiven) + model->B4SOIwrgidl = 0.0; + if (!model->B4SOIwkgidlGiven) + model->B4SOIwkgidl = 0.0; + if (!model->B4SOIwfgidlGiven) + model->B4SOIwfgidl = 0.0; + + if (!model->B4SOIwagislGiven) + model->B4SOIwagisl = 0.0; + if (!model->B4SOIwbgislGiven) + model->B4SOIwbgisl = 0.0; + if (!model->B4SOIwcgislGiven) + model->B4SOIwcgisl = 0.0; + if (!model->B4SOIwrgislGiven) + model->B4SOIwrgisl = 0.0; + if (!model->B4SOIwkgislGiven) + model->B4SOIwkgisl = 0.0; + if (!model->B4SOIwfgislGiven) + model->B4SOIwfgisl = 0.0; if (!model->B4SOIwntunGiven) /* v4.0 */ model->B4SOIwntun = 0.0; if (!model->B4SOIwntundGiven) /* v4.0 */ @@ -1272,6 +1517,12 @@ IFuid tmpName; model->B4SOIpbetaGB1 = 0.0; if (!model->B4SOIpbetaGB2Given) model->B4SOIpbetaGB2 = 0.0; + if (!model->B4SOIpaigbcp2Given) + model->B4SOIpaigbcp2 = 0.0; + if (!model->B4SOIpbigbcp2Given) + model->B4SOIpbigbcp2 = 0.0; + if (!model->B4SOIpcigbcp2Given) + model->B4SOIpcigbcp2 = 0.0; if (!model->B4SOIpndifGiven) model->B4SOIpndif = 0.0; if (!model->B4SOIpntrecfGiven) @@ -1344,8 +1595,12 @@ IFuid tmpName; model->B4SOIpnsub = 0.0; if (!model->B4SOIpngateGiven) model->B4SOIpngate = 0.0; + if (!model->B4SOIpnsdGiven) + model->B4SOIpnsd = 0.0; if (!model->B4SOIpvth0Given) model->B4SOIpvth0 = 0.0; + if (!model->B4SOIpvfbGiven) + model->B4SOIpvfb = 0.0; /* v4.1 */ if (!model->B4SOIpk1Given) model->B4SOIpk1 = 0.0; if (!model->B4SOIpk1w1Given) @@ -1454,6 +1709,17 @@ IFuid tmpName; model->B4SOIpalpha0 = 0.0; if (!model->B4SOIpfbjtiiGiven) model->B4SOIpfbjtii = 0.0; + /*4.1 Iii model*/ + if (!model->B4SOIpebjtiiGiven) + model->B4SOIpebjtii = 0.0; + if (!model->B4SOIpcbjtiiGiven) + model->B4SOIpcbjtii = 0.0; + if (!model->B4SOIpvbciGiven) + model->B4SOIpvbci = 0.0; + if (!model->B4SOIpabjtiiGiven) + model->B4SOIpabjtii = 0.0; + if (!model->B4SOIpmbjtiiGiven) + model->B4SOIpmbjtii = 0.0; if (!model->B4SOIpbeta0Given) model->B4SOIpbeta0 = 0.0; if (!model->B4SOIpbeta1Given) @@ -1480,6 +1746,25 @@ IFuid tmpName; model->B4SOIpbgidl = 0.0; if (!model->B4SOIpcgidlGiven) model->B4SOIpcgidl = 0.0; + if (!model->B4SOIprgidlGiven) + model->B4SOIprgidl = 0.0; + if (!model->B4SOIpkgidlGiven) + model->B4SOIpkgidl = 0.0; + if (!model->B4SOIpfgidlGiven) + model->B4SOIpfgidl = 0.0; + + if (!model->B4SOIpagislGiven) + model->B4SOIpagisl = 0.0; + if (!model->B4SOIpbgislGiven) + model->B4SOIpbgisl = 0.0; + if (!model->B4SOIpcgislGiven) + model->B4SOIpcgisl = 0.0; + if (!model->B4SOIprgislGiven) + model->B4SOIprgisl = 0.0; + if (!model->B4SOIpkgislGiven) + model->B4SOIpkgisl = 0.0; + if (!model->B4SOIpfgislGiven) + model->B4SOIpfgisl = 0.0; if (!model->B4SOIpntunGiven) /* v4.0 */ model->B4SOIpntun = 0.0; if (!model->B4SOIpntundGiven) /* v4.0 */ @@ -1631,18 +1916,42 @@ IFuid tmpName; model->B4SOIdvtp0 = 0.0; if (!model->B4SOIdvtp1Given) /* v4.0 for Vth */ model->B4SOIdvtp1 = 0.0; + if (!model->B4SOIdvtp2Given) /* v4.1 for Vth */ + model->B4SOIdvtp2 = 0.0; + if (!model->B4SOIdvtp3Given) /* v4.1 for Vth */ + model->B4SOIdvtp3 = 0.0; + if (!model->B4SOIdvtp4Given) /* v4.1 for Vth */ + model->B4SOIdvtp4 = 0.0; if (!model->B4SOIldvtp0Given) /* v4.0 for Vth */ model->B4SOIldvtp0 = 0.0; if (!model->B4SOIldvtp1Given) /* v4.0 for Vth */ model->B4SOIldvtp1 = 0.0; + if (!model->B4SOIldvtp2Given) /* v4.1 for Vth */ + model->B4SOIldvtp2 = 0.0; + if (!model->B4SOIldvtp3Given) /* v4.1 for Vth */ + model->B4SOIldvtp3 = 0.0; + if (!model->B4SOIldvtp4Given) /* v4.1 for Vth */ + model->B4SOIldvtp4 = 0.0; if (!model->B4SOIwdvtp0Given) /* v4.0 for Vth */ model->B4SOIwdvtp0 = 0.0; if (!model->B4SOIwdvtp1Given) /* v4.0 for Vth */ model->B4SOIwdvtp1 = 0.0; + if (!model->B4SOIwdvtp2Given) /* v4.1 for Vth */ + model->B4SOIwdvtp2 = 0.0; + if (!model->B4SOIwdvtp3Given) /* v4.1 for Vth */ + model->B4SOIwdvtp3 = 0.0; + if (!model->B4SOIwdvtp4Given) /* v4.1 for Vth */ + model->B4SOIwdvtp4 = 0.0; if (!model->B4SOIpdvtp0Given) /* v4.0 for Vth */ model->B4SOIpdvtp0 = 0.0; if (!model->B4SOIpdvtp1Given) /* v4.0 for Vth */ model->B4SOIpdvtp1 = 0.0; + if (!model->B4SOIpdvtp2Given) /* v4.1 for Vth */ + model->B4SOIpdvtp2 = 0.0; + if (!model->B4SOIpdvtp3Given) /* v4.1 for Vth */ + model->B4SOIpdvtp3 = 0.0; + if (!model->B4SOIpdvtp4Given) /* v4.1 for Vth */ + model->B4SOIpdvtp4 = 0.0; if (!model->B4SOIminvGiven) /* v4.0 for Vgsteff */ model->B4SOIminv = 0.0; if (!model->B4SOIlminvGiven) /* v4.0 for Vgsteff */ @@ -1722,17 +2031,35 @@ IFuid tmpName; if (!model->B4SOIlodeta0Given) model->B4SOIlodeta0 = 1.0; /* stress effect end */ - + if (!model->B4SOIfdModGiven) + model->B4SOIfdMod = 0; + if (!model->B4SOIvsceGiven) + model->B4SOIvsce = 0.0; + if (!model->B4SOIcdsbsGiven) + model->B4SOIcdsbs = 0.0; + + if (!model->B4SOIminvcvGiven) /* v4.1 for Vgsteffcv */ + model->B4SOIminvcv = 0.0; + if (!model->B4SOIlminvcvGiven) /* v4.1 for Vgsteffcv */ + model->B4SOIlminvcv = 0.0; + if (!model->B4SOIwminvcvGiven) /* v4.1 for Vgsteffcv */ + model->B4SOIwminvcv = 0.0; + if (!model->B4SOIpminvcvGiven) /* v4.1 for Vgsteffcv */ + model->B4SOIpminvcv = 0.0; + if (!model->B4SOIvoffcvGiven) + model->B4SOIvoffcv = -0.08; + if (!model->B4SOIlvoffcvGiven) + model->B4SOIlvoffcv = 0.0; + if (!model->B4SOIwvoffcvGiven) + model->B4SOIwvoffcv = 0.0; + if (!model->B4SOIpvoffcvGiven) + model->B4SOIpvoffcv = 0.0; /* loop through all the instances of the model */ for (here = model->B4SOIinstances; here != NULL ; here=here->B4SOInextInstance) - { - if (here->B4SOIowner == ARCHme) - { - /* allocate a chunk of the state vector */ - here->B4SOIstates = *states; - *states += B4SOInumStates; - } + { /* allocate a chunk of the state vector */ + here->B4SOIstates = *states; + *states += B4SOInumStates; /* perform the parameter defaulting */ if (!here->B4SOIdrainAreaGiven) here->B4SOIdrainArea = 0.0; @@ -1772,8 +2099,9 @@ IFuid tmpName; here->B4SOIsourceSquares = 1; if (!here->B4SOIwGiven) here->B4SOIw = 5e-6; + if (!here->B4SOImGiven) - here->B4SOIm = 1; + here->B4SOIm = 1; /* v2.0 release */ if (!here->B4SOInbcGiven) @@ -1786,6 +2114,8 @@ IFuid tmpName; here->B4SOIpsbcp = 0; if (!here->B4SOIagbcpGiven) here->B4SOIagbcp = 0; + if (!here->B4SOIagbcp2Given) + here->B4SOIagbcp2 = 0; /* v4.1 */ if (!here->B4SOIagbcpdGiven) here->B4SOIagbcpd = here->B4SOIagbcp; if (!here->B4SOIaebcpGiven) @@ -1795,20 +2125,13 @@ IFuid tmpName; here->B4SOIoff = 0; /* process drain series resistance */ + if ( ((model->B4SOIsheetResistance > 0.0) && (here->B4SOIdrainSquares > 0.0 ) && (here->B4SOIdNodePrime == 0)) ) { error = CKTmkVolt(ckt,&tmp,here->B4SOIname,"drain"); if(error) return(error); here->B4SOIdNodePrime = 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->B4SOIdNodePrime = here->B4SOIdNode; @@ -1821,14 +2144,6 @@ IFuid tmpName; { error = CKTmkVolt(ckt,&tmp,here->B4SOIname,"source"); if(error) return(error); here->B4SOIsNodePrime = 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->B4SOIsNodePrime = here->B4SOIsNode; @@ -1836,13 +2151,28 @@ IFuid tmpName; /* process effective silicon film thickness */ model->B4SOIcbox = 3.453133e-11 / model->B4SOItbox; - model->B4SOIcsi = 1.03594e-10 / model->B4SOItsi; + if(model->B4SOImtrlMod) + { + model->B4SOIcsi = 1.03594e-10 / model->B4SOIetsi; + } + else + { + model->B4SOIcsi = 1.03594e-10 / model->B4SOItsi; + } Cboxt = model->B4SOIcbox * model->B4SOIcsi / (model->B4SOIcbox + model->B4SOIcsi); /* v3.2 */ + if(model->B4SOImtrlMod) + { Qsi = Charge_q * model->B4SOInpeak + * (1.0 + model->B4SOIlpe0 / here->B4SOIl) * 1e6 * model->B4SOIetsi; + } + else + { + Qsi = Charge_q * model->B4SOInpeak * (1.0 + model->B4SOIlpe0 / here->B4SOIl) * 1e6 * model->B4SOItsi; + } Vbs0t = 0.8 - 0.5 * Qsi / model->B4SOIcsi + model->B4SOIvbsa; if (!here->B4SOIsoiModGiven) @@ -2179,8 +2509,13 @@ if((here->ptr = SMPmakeElt(matrix,here->first,here->second))==(double *)NULL){\ TSTALLOC(B4SOIBpPtr, B4SOIbNode, B4SOIpNode) TSTALLOC(B4SOIPbPtr, B4SOIpNode, B4SOIbNode) TSTALLOC(B4SOIPpPtr, B4SOIpNode, B4SOIpNode) + + /* 4.1 for Igb2_agbcp2 */ + TSTALLOC(B4SOIPgPtr , B4SOIpNode, B4SOIgNode) + TSTALLOC(B4SOIGpPtr , B4SOIgNode, B4SOIpNode) } + /* v3.1 added for RF */ if (here->B4SOIrgateMod != 0) { TSTALLOC(B4SOIGEgePtr, B4SOIgNodeExt, B4SOIgNodeExt) @@ -2347,4 +2682,3 @@ B4SOIunsetup(GENmodel *inModel, CKTcircuit *ckt) #endif return OK; } - diff --git a/src/spicelib/devices/bsim3soi/b4soitemp.c b/src/spicelib/devices/bsim3soi/b4soitemp.c index d76909173..6f071e922 100644 --- a/src/spicelib/devices/bsim3soi/b4soitemp.c +++ b/src/spicelib/devices/bsim3soi/b4soitemp.c @@ -1,12 +1,14 @@ -/*** B4SOI 11/30/2005 Xuemei (Jane) Xi Release ***/ +/*** B4SOI 03/06/2009 Wenwei Yang Release ***/ /********** - * Copyright 2005 Regents of the University of California. All rights reserved. + * Copyright 2009 Regents of the University of California. All rights reserved. * Authors: 1998 Samuel Fung, Dennis Sinitsky and Stephen Tang * Authors: 1999-2004 Pin Su, Hui Wan, Wei Jin, b3soitemp.c * Authors: 2005- Hui Wan, Xuemei Xi, Ali Niknejad, Chenming Hu. + * Authors: 2009- Wenwei Yang, Chung-Hsun Lin, Ali Niknejad, Chenming Hu. * File: b4soitemp.c * Modified by Hui Wan, Xuemei Xi 11/30/2005 + * Modified by Wenwei Yang, Chung-Hsun Lin, Darsen Lu 03/06/2009 **********/ /* Lmin, Lmax, Wmin, Wmax */ @@ -23,6 +25,7 @@ #define KboQ 8.617087e-5 /* Kb / q where q = 1.60219e-19 */ #define EPSOX 3.453133e-11 #define EPSSI 1.03594e-10 +#define EPS0 8.85418e-12 #define PI 3.141592654 #define Charge_q 1.60219e-19 #define Eg300 1.115 /* energy gap at 300K */ @@ -48,20 +51,30 @@ B4SOItemp(GENmodel *inModel, CKTcircuit *ckt) register B4SOImodel *model = (B4SOImodel*) inModel; register B4SOIinstance *here; struct b4soiSizeDependParam *pSizeDependParamKnot, *pLastKnot, *pParam=NULL; -double tmp, tmp1, tmp2, Eg, Eg0, ni, T0, T1, T2, T3, T4, T5; +double tmp, tmp1, tmp2, Eg, Eg0, ni, T0, T1, T2, T3, T4, T5, T6; double Ldrn=0.0, Wdrn; -double Temp, TempRatio, Inv_L, Inv_W, Inv_LW, Vtm0, Tnom, TRatio; +double Temp, TempRatio, Inv_L, Inv_W, Inv_LW, Vtm0, Tnom; double SDphi, SDgamma; double Inv_saref, Inv_sbref, Inv_sa, Inv_sb, rho, dvth0_lod; -double W_tmp, Inv_ODeff, OD_offset, dk2_lod, deta0_lod, kvsat=0.0; +double W_tmp, Inv_ODeff, OD_offset, dk2_lod, deta0_lod, kvsat; int Size_Not_Found, i; double PowWeffWr, T10; /*v4.0 */ +double Vtm0eot, Vtmeot,vbieot,phieot,sqrtphieot,vddeot; +double Vgs_eff,Vgsteff, V0, Vth,Vgst; +double lt1,ltw; +double TempRatioMinus1; +double n, VgstNVt, ExpArg, sqrtPhisExt,ExpVgst,Vgst2Vtm,vtfbphi2eot; +double DIBL_Sft,Lpe_Vb,DITS_Sft,DeltVthtemp, DITS_Sft2; +double Theta0,Delt_vth,DeltVthw; +double niter,toxpf,toxpi, Tcen; +double n0; /* v2.0 release */ double tmp3, T7; - +/*4.1*/ +double epsrox, toxe, epssub; /* loop through all the B4SOI device models */ for (; model != NULL; model = model->B4SOInextModel) @@ -75,29 +88,64 @@ double tmp3, T7; Tnom = model->B4SOItnom; TempRatio = Temp / Tnom; - + + if(model->B4SOImtrlMod) + { + epsrox = 3.9; + toxe = model->B4SOIeot; + epssub = EPS0 * model->B4SOIepsrsub; + + } + else + { + epsrox = model->B4SOIepsrox; + toxe = model->B4SOItox; + epssub = EPSSI; + + } + + + /*model->B4SOIcox = epsrox * EPS0 / toxe;*/ + model->B4SOIvcrit = CONSTvt0 * log(CONSTvt0 / (CONSTroot2 * 1.0e-14)); - model->B4SOIfactor1 = sqrt(EPSSI / EPSOX * model->B4SOItox); + if(model->B4SOImtrlMod == 0) + model->B4SOIfactor1 = sqrt(EPSSI / EPSOX * model->B4SOItox); + else + model->B4SOIfactor1 = sqrt(epssub / (epsrox*EPS0) * toxe);/*4.1*/ + if (model->B4SOImtrlMod==0) + { Vtm0 = KboQ * Tnom; Eg0 = 1.16 - 7.02e-4 * Tnom * Tnom / (Tnom + 1108.0); model->B4SOIeg0 = Eg0; model->B4SOIvtm = KboQ * Temp; Eg = 1.16 - 7.02e-4 * Temp * Temp / (Temp + 1108.0); + /* ni is in cm^-3 */ ni = 1.45e10 * (Temp / 300.15) * sqrt(Temp / 300.15) * exp(21.5565981 - Eg / (2.0 * model->B4SOIvtm)); - + } + else + { Vtm0 = KboQ * Tnom; + Eg0 = model->B4SOIbg0sub - model->B4SOItbgasub * Tnom * Tnom + / (Tnom + model->B4SOItbgbsub); + model->B4SOIeg0 = Eg0; + model->B4SOIvtm = KboQ * Temp; + Eg = model->B4SOIbg0sub - model->B4SOItbgasub * Temp * Temp + / (Temp + model->B4SOItbgbsub); + + ni = model->B4SOIni0sub * (Temp / Tnom) * sqrt(Temp / Tnom) + * exp(Eg0/(2.0*Vtm0) - Eg / (2.0 * model->B4SOIvtm)); + + + } /* loop through all the instances of the model */ /* MCJ: Length and Width not initialized */ for (here = model->B4SOIinstances; here != NULL; here = here->B4SOInextInstance) { - if (here->B4SOIowner != ARCHme) - continue; - here->B4SOIrbodyext = here->B4SOIbodySquares * model->B4SOIrbsh; pSizeDependParamKnot = model->pSizeDependParamKnot; @@ -119,7 +167,7 @@ double tmp3, T7; } if (Size_Not_Found) - { pParam = (struct b4soiSizeDependParam *)tmalloc( + { pParam = (struct b4soiSizeDependParam *)malloc( sizeof(struct b4soiSizeDependParam)); if (pLastKnot == NULL) model->pSizeDependParamKnot = pParam; @@ -289,10 +337,22 @@ double tmp3, T7; + model->B4SOIlngate * Inv_L + model->B4SOIwngate * Inv_W + model->B4SOIpngate * Inv_LW; +/*4.1*/ + pParam->B4SOInsd = model->B4SOInsd + + model->B4SOIlnsd * Inv_L + + model->B4SOIwnsd * Inv_W + + model->B4SOIpnsd * Inv_LW; + + + pParam->B4SOIvth0 = model->B4SOIvth0 + model->B4SOIlvth0 * Inv_L + model->B4SOIwvth0 * Inv_W + model->B4SOIpvth0 * Inv_LW; + pParam->B4SOIvfb = model->B4SOIvfb + + model->B4SOIlvfb * Inv_L + + model->B4SOIwvfb * Inv_W + + model->B4SOIpvfb * Inv_LW; /* v4.1 */ pParam->B4SOIk1 = model->B4SOIk1 + model->B4SOIlk1 * Inv_L + model->B4SOIwk1 * Inv_W @@ -513,6 +573,29 @@ double tmp3, T7; + model->B4SOIlfbjtii * Inv_L + model->B4SOIwfbjtii * Inv_W + model->B4SOIpfbjtii * Inv_LW; + /*4.1 Iii model*/ + pParam->B4SOIebjtii = model->B4SOIebjtii + + model->B4SOIlebjtii * Inv_L + + model->B4SOIwebjtii * Inv_W + + model->B4SOIpebjtii * Inv_LW; + pParam->B4SOIcbjtii = model->B4SOIcbjtii + + model->B4SOIlcbjtii * Inv_L + + model->B4SOIwcbjtii * Inv_W + + model->B4SOIpcbjtii * Inv_LW; + pParam->B4SOIvbci = model->B4SOIvbci + + model->B4SOIlvbci * Inv_L + + model->B4SOIwvbci * Inv_W + + model->B4SOIpvbci * Inv_LW; + + pParam->B4SOIabjtii = model->B4SOIabjtii + + model->B4SOIlabjtii * Inv_L + + model->B4SOIwabjtii * Inv_W + + model->B4SOIpabjtii * Inv_LW; + pParam->B4SOImbjtii = model->B4SOImbjtii + + model->B4SOIlmbjtii * Inv_L + + model->B4SOIwmbjtii * Inv_W + + model->B4SOIpmbjtii * Inv_LW; + pParam->B4SOIbeta0 = model->B4SOIbeta0 + model->B4SOIlbeta0 * Inv_L + model->B4SOIwbeta0 * Inv_W @@ -569,6 +652,47 @@ double tmp3, T7; + model->B4SOIlegidl * Inv_L + model->B4SOIwegidl * Inv_W + model->B4SOIpegidl * Inv_LW; + pParam->B4SOIrgidl = model->B4SOIrgidl + + model->B4SOIlrgidl * Inv_L + + model->B4SOIwrgidl * Inv_W + + model->B4SOIprgidl * Inv_LW; + pParam->B4SOIkgidl = model->B4SOIkgidl + + model->B4SOIlkgidl * Inv_L + + model->B4SOIwkgidl * Inv_W + + model->B4SOIpkgidl * Inv_LW; + pParam->B4SOIfgidl = model->B4SOIfgidl + + model->B4SOIlfgidl * Inv_L + + model->B4SOIwfgidl * Inv_W + + model->B4SOIpfgidl * Inv_LW; + pParam->B4SOIagisl = model->B4SOIagisl + + model->B4SOIlagisl * Inv_L + + model->B4SOIwagisl * Inv_W + + model->B4SOIpagisl * Inv_LW; + pParam->B4SOIbgisl = model->B4SOIbgisl + + model->B4SOIlbgisl * Inv_L + + model->B4SOIwbgisl * Inv_W + + model->B4SOIpbgisl * Inv_LW; + pParam->B4SOIcgisl = model->B4SOIcgisl + + model->B4SOIlcgisl * Inv_L + + model->B4SOIwcgisl * Inv_W + + model->B4SOIpcgisl * Inv_LW; + pParam->B4SOIegisl = model->B4SOIegisl + + model->B4SOIlegisl * Inv_L + + model->B4SOIwegisl * Inv_W + + model->B4SOIpegisl * Inv_LW; + pParam->B4SOIrgisl = model->B4SOIrgisl + + model->B4SOIlrgisl * Inv_L + + model->B4SOIwrgisl * Inv_W + + model->B4SOIprgisl * Inv_LW; + pParam->B4SOIkgisl = model->B4SOIkgisl + + model->B4SOIlkgisl * Inv_L + + model->B4SOIwkgisl * Inv_W + + model->B4SOIpkgisl * Inv_LW; + pParam->B4SOIfgisl = model->B4SOIfgisl + + model->B4SOIlfgisl * Inv_L + + model->B4SOIwfgisl * Inv_W + + model->B4SOIpfgisl * Inv_LW; + pParam->B4SOIntun = model->B4SOIntun /* v4.0 */ + model->B4SOIlntun * Inv_L + model->B4SOIwntun * Inv_W @@ -752,6 +876,29 @@ double tmp3, T7; + model->B4SOIlute * Inv_L + model->B4SOIwute * Inv_W + model->B4SOIpute * Inv_LW; + + /*4.1 mobmod=4*/ + pParam->B4SOIud = model->B4SOIud + + model->B4SOIud * Inv_L + + model->B4SOIwud * Inv_W + + model->B4SOIpud * Inv_LW; + pParam->B4SOIud1 = model->B4SOIud1 + + model->B4SOIlud1 * Inv_L + + model->B4SOIwud1 * Inv_W + + model->B4SOIpud1 * Inv_LW; + pParam->B4SOIeu = model->B4SOIeu + + model->B4SOIleu * Inv_L + + model->B4SOIweu * Inv_W + + model->B4SOIpeu * Inv_LW; + pParam->B4SOIucs = model->B4SOIucs + + model->B4SOIlucs * Inv_L + + model->B4SOIwucs * Inv_W + + model->B4SOIpucs * Inv_LW; + pParam->B4SOIucste = model->B4SOIucste + + model->B4SOIlucste * Inv_L + + model->B4SOIwucste * Inv_W + + model->B4SOIpucste * Inv_LW; + pParam->B4SOIkt1 = model->B4SOIkt1 + model->B4SOIlkt1 * Inv_L + model->B4SOIwkt1 * Inv_W @@ -875,10 +1022,26 @@ double tmp3, T7; + model->B4SOIldvtp1 * Inv_L + model->B4SOIwdvtp1 * Inv_W + model->B4SOIpdvtp1 * Inv_LW; /* v4.0 */ + pParam->B4SOIdvtp2 = model->B4SOIdvtp2 + + model->B4SOIldvtp2 * Inv_L + + model->B4SOIwdvtp2 * Inv_W + + model->B4SOIpdvtp2 * Inv_LW; /* v4.1 */ + pParam->B4SOIdvtp3 = model->B4SOIdvtp3 + + model->B4SOIldvtp3 * Inv_L + + model->B4SOIwdvtp3 * Inv_W + + model->B4SOIpdvtp3 * Inv_LW; /* v4.1 */ + pParam->B4SOIdvtp4 = model->B4SOIdvtp4 + + model->B4SOIldvtp4 * Inv_L + + model->B4SOIwdvtp4 * Inv_W + + model->B4SOIpdvtp4 * Inv_LW; /* v4.1 */ pParam->B4SOIminv = model->B4SOIminv + model->B4SOIlminv * Inv_L + model->B4SOIwminv * Inv_W + model->B4SOIpminv * Inv_LW; /* v4.0 */ + pParam->B4SOIminvcv = model->B4SOIminvcv + + model->B4SOIlminvcv * Inv_L + + model->B4SOIwminvcv * Inv_W + + model->B4SOIpminvcv * Inv_LW; /* v4.1 */ pParam->B4SOIfprout = model->B4SOIfprout + model->B4SOIlfprout * Inv_L + model->B4SOIwfprout * Inv_W @@ -891,11 +1054,27 @@ double tmp3, T7; + model->B4SOIlpditsd * Inv_L + model->B4SOIwpditsd * Inv_W + model->B4SOIppditsd * Inv_LW; /* v4.0 */ + pParam->B4SOIaigbcp2 = model->B4SOIaigbcp2 + + model->B4SOIlaigbcp2 * Inv_L + + model->B4SOIwaigbcp2 * Inv_W + + model->B4SOIpaigbcp2 * Inv_LW; /* v4.0 */ + pParam->B4SOIbigbcp2 = model->B4SOIbigbcp2 + + model->B4SOIlbigbcp2 * Inv_L + + model->B4SOIwbigbcp2 * Inv_W + + model->B4SOIpbigbcp2 * Inv_LW; /* v4.0 */ + pParam->B4SOIcigbcp2 = model->B4SOIcigbcp2 + + model->B4SOIlcigbcp2 * Inv_L + + model->B4SOIwcigbcp2 * Inv_W + + model->B4SOIpcigbcp2 * Inv_LW; /* v4.0 */ /* Added for binning - END */ /* v4.0 add mstar for Vgsteff */ pParam->B4SOImstar = 0.5 + atan(pParam->B4SOIminv) / PI; + if (model->B4SOIvgstcvMod == 0) + printf("vgstcvMod = 0, users are suggested to use vgstcvMod = 1 or 2.\n"); + /* v4.1 add mstarcv for Vgsteffcv */ + pParam->B4SOImstarcv = 0.5 + atan(pParam->B4SOIminvcv) / PI; T0 = (TempRatio - 1.0); @@ -1032,7 +1211,7 @@ double tmp3, T7; pParam->B4SOIjrecd = pParam->B4SOIidrec * T2; T7 = pParam->B4SOIxtund * (TempRatio - 1); DEXP(T7, T0); - pParam->B4SOIjtund = pParam->B4SOIistun * T0; + pParam->B4SOIjtund = pParam->B4SOIidtun * T0; if (pParam->B4SOInsub > 0) pParam->B4SOIvfbb = -model->B4SOItype * model->B4SOIvtm * @@ -1071,9 +1250,9 @@ double tmp3, T7; if (!model->B4SOIcsdminGiven) { /* Cdmin */ - tmp = sqrt(2.0 * EPSSI * SDphi / (Charge_q * + tmp = sqrt(2.0 * epssub * SDphi / (Charge_q * fabs(pParam->B4SOInsub) * 1.0e6)); - tmp1 = EPSSI / tmp; + tmp1 = epssub / tmp; model->B4SOIcsdmin = tmp1 * model->B4SOIcbox / (tmp1 + model->B4SOIcbox); } @@ -1085,26 +1264,44 @@ double tmp3, T7; pParam->B4SOIsqrtPhi = sqrt(pParam->B4SOIphi); pParam->B4SOIphis3 = pParam->B4SOIsqrtPhi * pParam->B4SOIphi; - pParam->B4SOIXdep0 = sqrt(2.0 * EPSSI / (Charge_q + pParam->B4SOIXdep0 = sqrt(2.0 * epssub / (Charge_q * pParam->B4SOInpeak * 1.0e6)) * pParam->B4SOIsqrtPhi; pParam->B4SOIsqrtXdep0 = sqrt(pParam->B4SOIXdep0); - pParam->B4SOIlitl = sqrt(3.0 * pParam->B4SOIxj + /*4.1*/ + if (model->B4SOImtrlMod==0) + pParam->B4SOIlitl = sqrt(3.0 *3.9/epsrox* pParam->B4SOIxj * model->B4SOItox); + else + pParam->B4SOIlitl = sqrt(epssub * pParam->B4SOIxj * model->B4SOItox/(epsrox*EPS0)); pParam->B4SOIvbi = model->B4SOIvtm * log(1.0e20 * pParam->B4SOInpeak / (ni * ni)); - pParam->B4SOIcdep0 = sqrt(Charge_q * EPSSI + pParam->B4SOIcdep0 = sqrt(Charge_q * epssub * pParam->B4SOInpeak * 1.0e6 / 2.0 / pParam->B4SOIphi); /* v3.0 */ +/*4.1 */ + if (model->B4SOImtrlMod ==0) + { if (pParam->B4SOIngate > 0.0) { pParam->B4SOIvfbsd = Vtm0 * log(pParam->B4SOIngate / 1.0e20); } else pParam->B4SOIvfbsd = 0.0; - + } + else + { + T0 = Vtm0 * log(pParam->B4SOInsd/ni); + T1 = 0.5 * Eg0; + if(T0 > T1) + T0 = T1; + T2 = model->B4SOIeasub + T1 - model->B4SOItype * T0; + pParam->B4SOIvfbsd = model->B4SOIphig - T2; + + + } pParam->B4SOIToxRatio = exp(model->B4SOIntox * log(model->B4SOItoxref /model->B4SOItoxqm)) /model->B4SOItoxqm /model->B4SOItoxqm; @@ -1195,7 +1392,7 @@ double tmp3, T7; if ((T0 = pParam->B4SOIweff + pParam->B4SOIk1w2) < 1e-8) T0 = 1e-8; pParam->B4SOIk1eff = pParam->B4SOIk1 * (1 + pParam->B4SOIk1w1/T0); - +/*4.0 if (model->B4SOIvth0Given) { pParam->B4SOIvfb = model->B4SOItype * pParam->B4SOIvth0 - pParam->B4SOIphi - pParam->B4SOIk1eff @@ -1207,12 +1404,31 @@ double tmp3, T7; + pParam->B4SOIphi + pParam->B4SOIk1eff * pParam->B4SOIsqrtPhi); } - +*/ +/* v4.1 */ + if (!model->B4SOIvfbGiven) + { if (model->B4SOIvth0Given) + { pParam->B4SOIvfb = model->B4SOItype * pParam->B4SOIvth0 + - pParam->B4SOIphi - pParam->B4SOIk1eff + * pParam->B4SOIsqrtPhi; + } + else + { pParam->B4SOIvfb = -1.0; + } + } + if (!model->B4SOIvth0Given) + { pParam->B4SOIvth0 = model->B4SOItype * (pParam->B4SOIvfb + + pParam->B4SOIphi + pParam->B4SOIk1eff + * pParam->B4SOIsqrtPhi); + } /* v4.0 */ pParam->B4SOIk1ox = pParam->B4SOIk1eff * model->B4SOItox / model->B4SOItoxm; - + if(model->B4SOImtrlMod == 0) T1 = sqrt(EPSSI / EPSOX * model->B4SOItox + * pParam->B4SOIXdep0); + else + T1 = sqrt(epssub / (epsrox*EPS0) * model->B4SOItox * pParam->B4SOIXdep0); T0 = exp(-0.5 * pParam->B4SOIdsub * pParam->B4SOIleff / T1); pParam->B4SOItheta0vb0 = (T0 + 2.0 * T0 * T0); @@ -1222,6 +1438,9 @@ double tmp3, T7; pParam->B4SOIthetaRout = pParam->B4SOIpdibl1 * T2 + pParam->B4SOIpdibl2; + /* New DITS term (added in 4.1) */ + pParam->B4SOIdvtp2factor = pParam->B4SOIdvtp2 / exp(pParam->B4SOIdvtp3 * log(pParam->B4SOIleff)); + /* stress effect */ T0 = pow(Ldrn, model->B4SOIllodku0); W_tmp = Wdrn + model->B4SOIwlod; @@ -1238,9 +1457,8 @@ double tmp3, T7; pParam->B4SOIkvth0 = sqrt( pParam->B4SOIkvth0 * pParam->B4SOIkvth0 + DELTA); -/*dw init of TRatio is missing */ -TRatio = TempRatio; - T0 = (TRatio - 1.0); + /*T0 = (TRatio - 1.0);*/ + T0 = (TempRatio - 1.0); /* bug fix v4.1 */ pParam->B4SOIku0temp = pParam->B4SOIku0 * (1.0 + model->B4SOItku0 * T0) + DELTA; @@ -1343,6 +1561,235 @@ TRatio = TempRatio; if ((pParam->B4SOIvearly = pParam->B4SOIvabjt + pParam->B4SOIaely * pParam->B4SOIleff) < 1) pParam->B4SOIvearly = 1; + +/*4.1 toxp calculation*/ + if(model->B4SOImtrlMod==0) + { + model->B4SOItoxp = model->B4SOItox - model->B4SOIdtoxcv; + } + else + { + /* Calculate TOXP from EOT */ + /* Calculate Vgs_eff @ Vgs = VDD with Poly Depletion Effect */ + Vtm0eot = KboQ * model->B4SOItempeot; + Vtmeot = Vtm0eot; + vbieot = Vtm0eot * log(1.0e20 + * pParam->B4SOInpeak / (ni * ni)); + phieot = 2.0 * Vtm0eot + * log(pParam->B4SOInpeak / ni); + sqrtphieot = sqrt(phieot); + tmp2 = here->B4SOIvfb + phieot; + vddeot = model->B4SOItype * model->B4SOIvddeot; + + T0 = model->B4SOIepsrgate * EPS0; + if ((pParam->B4SOIngate > 1.0e18) && (pParam->B4SOIngate < 1.0e25) + && (vddeot > tmp2) && (T0!=0)) + { T1 = 1.0e6 * Charge_q * epssub * pParam->B4SOIngate + / (model->B4SOIcox * model->B4SOIcox); + T4 = sqrt(1.0 + 2.0 * (vddeot - 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 = vddeot - T5; + + } + else + { Vgs_eff = vddeot; + + } + + + + /* Calculate Vth @ Vds=Vbs=0 */ + + V0 = vbieot - phieot; + + T3 = sqrt(pParam->B4SOIXdep0); + + + + + lt1 = model->B4SOIfactor1 * T3; + + + + ltw= model->B4SOIfactor1 * T3 ; + + + T0 = -0.5 * pParam->B4SOIdvt1 * model->B4SOIleffeot / lt1; + if (T0 > -EXPL_THRESHOLD) + { T1 = exp(T0); + Theta0 = T1 * (1.0 + 2.0 * T1); + + } + else + { T1 = MIN_EXPL; + Theta0 = T1 * (1.0 + 2.0 * T1); + + } + + /* Calculate n */ + T2 = pParam->B4SOInfactor * epssub / pParam->B4SOIXdep0; + T3 = pParam->B4SOIcdsc ; + T4 = (T2 + T3 * Theta0 + pParam->B4SOIcit) / model->B4SOIcox; + + + if (T4 >= -0.5) + { n = 1.0 + T4; + + } + else + /* avoid discontinuity problems caused by T4 */ + { T0 = 1.0 / (3.0 + 8.0 * T4); + n = (1.0 + 3.0 * T4) * T0; + + } + + /* v4.0 DITS */ + if (pParam->B4SOIdvtp0 > 0.0) { + T0 = 0.0; + if (T0 < -EXPL_THRESHOLD) { + T2 = MIN_EXPL; + + } + else { + T2 = exp(T0); + + } + + T3 = model->B4SOIleffeot + pParam->B4SOIdvtp0 * (1.0 + T2); + + T4 = Vtmeot * log(model->B4SOIleffeot / T3); + + DITS_Sft = n * T4; + + + } + else { + DITS_Sft=0.0; + + } + + here->B4SOIthetavth = pParam->B4SOIdvt0 * Theta0; + Delt_vth = here->B4SOIthetavth * V0; + + T0 = -0.5 * pParam->B4SOIdvt1w * model->B4SOIweffeot + * model->B4SOIleffeot / ltw; + if (T0 > -EXPL_THRESHOLD) + { T1 = exp(T0); + T2 = T1 * (1.0 + 2.0 * T1); + + } + else + { T1 = MIN_EXPL; + T2 = T1 * (1.0 + 2.0 * T1); + + } + + T0 = pParam->B4SOIdvt0w * T2; + DeltVthw = T0 * V0; + + TempRatioMinus1 = model->B4SOItempeot / model->B4SOItnom - 1.0; + + T0 = sqrt(1.0 + pParam->B4SOIlpe0 / model->B4SOIleffeot); + T1 = (pParam->B4SOIkt1 + pParam->B4SOIkt1l / model->B4SOIleffeot); + DeltVthtemp = pParam->B4SOIk1ox * (T0 - 1.0) * sqrtphieot + + T1 * TempRatioMinus1; /* v4.0 */ + + + tmp2 = toxe * phieot + / (model->B4SOIweffeot + pParam->B4SOIw0); + + + DIBL_Sft = 0.0; + DITS_Sft2 = 0.0; + + + Lpe_Vb = sqrt(1.0 + pParam->B4SOIlpeb / model->B4SOIleffeot); + + + sqrtPhisExt = sqrtphieot; + + + Vth = model->B4SOItype * here->B4SOIvth0 + + (pParam->B4SOIk1ox * sqrtPhisExt + - pParam->B4SOIk1eff * sqrtphieot) * Lpe_Vb + - Delt_vth - DeltVthw + +pParam->B4SOIk3 * tmp2 + + DeltVthtemp - DIBL_Sft -DITS_Sft - DITS_Sft2; + + + Vgst = Vgs_eff - Vth; + + + T10 = n * Vtmeot; /* v4.0 */ + VgstNVt = pParam->B4SOImstar * Vgst / T10; /* v4.0 */ + ExpArg = (pParam->B4SOIvoff - (1- pParam->B4SOImstar) * Vgst) + / T10; /* v4.0 */ + + /* MCJ: Very small Vgst */ + if (VgstNVt > EXPL_THRESHOLD) + { Vgsteff = Vgst; + /* T0 is dVgsteff_dVbseff */ + + } + else if (ExpArg > EXPL_THRESHOLD) + { T0 = (Vgst - pParam->B4SOIvoff) / (n * Vtmeot); + ExpVgst = exp(T0); + Vgsteff = Vtmeot * pParam->B4SOIcdep0 / model->B4SOIcox * ExpVgst; + + + } + else + { ExpVgst = exp(VgstNVt); + T1 = T10 * log(1.0 + ExpVgst); + + T3 = (1.0 / model->B4SOItempeot); + + + T4 = -model->B4SOIcox / (Vtm0eot * pParam->B4SOIcdep0) + * exp(ExpArg) * (1 - pParam->B4SOImstar); + T2 = pParam->B4SOImstar - T10 * T4 + / (1.0 - pParam->B4SOImstar); + + Vgsteff = T1 / T2; + + } + Vgst2Vtm = Vgsteff + 2.0 * Vtmeot; + + + + + + /* calculating Toxp */ + T3 = model->B4SOItype * here->B4SOIvth0 + - here->B4SOIvfb - phieot; + + + vtfbphi2eot = 4.0 * T3; + if (vtfbphi2eot < 0.0) + vtfbphi2eot = 0.0; + + + niter = 0; + toxpf = toxe; + do + { + toxpi = toxpf; + tmp2 = 2.0e8 * toxpf; + T0 = (Vgsteff + vtfbphi2eot) / tmp2; + T1 = 1.0 + exp(model->B4SOIbdos * 0.7 * log(T0)); + Tcen = model->B4SOIados * 1.9e-9 / T1; + toxpf = toxe - epsrox/model->B4SOIepsrsub * Tcen; + niter++; + } while ((niter<=4)&&(ABS(toxpf-toxpi)>1e-12)); + model->B4SOItoxp = toxpf; + /*model->B4SOIcoxp = epsrox * EPS0 / model->B4SOItoxp;*/ + + + }/*End of Toxp*/ /* vfbzb calculation for capMod 3 */ tmp = sqrt(pParam->B4SOIXdep0); @@ -1374,9 +1821,12 @@ TRatio = TempRatio; T3 = pParam->B4SOIdvt0 * T3 * tmp1; /* v2.2.3 */ - T4 = (model->B4SOItox - model->B4SOIdtoxcv) * pParam->B4SOIphi + /*4.1*/ + /* T4 = (model->B4SOItox - model->B4SOIdtoxcv) * pParam->B4SOIphi + / (pParam->B4SOIweff + pParam->B4SOIw0); +*/ + T4 = model->B4SOItoxp * pParam->B4SOIphi / (pParam->B4SOIweff + pParam->B4SOIw0); - T0 = sqrt(1.0 + pParam->B4SOIlpe0 / pParam->B4SOIleff); /*v4.0*/ T5 = pParam->B4SOIk1ox * (T0 - 1.0) * pParam->B4SOIsqrtPhi + (pParam->B4SOIkt1 + pParam->B4SOIkt1l / pParam->B4SOIleff) @@ -1424,8 +1874,7 @@ TRatio = TempRatio; + 1.0 / here->B4SOIrbsb; } /* v4.0 rbodyMod end */ - - /* v4.0 stress effect */ + /* v4.0 stress effect */ if( (here->B4SOIsa > 0.0) && (here->B4SOIsb > 0.0) && ( (here->B4SOInf == 1.0) || ((here->B4SOInf > 1.0) && (here->B4SOIsd > 0.0)) @@ -1439,7 +1888,7 @@ TRatio = TempRatio; model->B4SOIwlod = 0.0; } - if (model->B4SOIkvsat < -1.0 ) + if (model->B4SOIkvsat < -1.0 ) { fprintf(stderr, "Warning: KVSAT = %g is too small; Reset to -1.0.\n",model->B4SOIkvsat); here->B4SOIkvsat = kvsat = -1.0; } @@ -1464,7 +1913,7 @@ TRatio = TempRatio; T0 = (1.0 + rho)/(1.0 + pParam->B4SOIrho_ref); here->B4SOIu0temp = pParam->B4SOIu0temp * T0; - T1 = (1.0 + kvsat * rho)/(1.0 + kvsat * pParam->B4SOIrho_ref); + T1 = (1.0 + here->B4SOIkvsat * rho)/(1.0 + here->B4SOIkvsat * pParam->B4SOIrho_ref);/*self-heating bug fix*/ here->B4SOIvsattemp = pParam->B4SOIvsattemp * T1; OD_offset = Inv_ODeff - pParam->B4SOIinv_od_ref; @@ -1488,8 +1937,13 @@ TRatio = TempRatio; here->B4SOIvsattemp = pParam->B4SOIvsattemp; here->B4SOIk2 = pParam->B4SOIk2; here->B4SOIeta0 = pParam->B4SOIeta0; - here->B4SOIInv_ODeff = 0; + here->B4SOIInv_ODeff = 0; + pParam->B4SOIinv_od_ref = 0; /*Stress bug fix*/ + here->B4SOIkvsat = 0; /*Stress bug fix*/ } /* v4.0 stress effect end */ + + + here->B4SOIk2ox = here->B4SOIk2 * model->B4SOItox / model->B4SOItoxm; /* v4.0 */ @@ -1497,8 +1951,71 @@ TRatio = TempRatio; here->B4SOIvfb = pParam->B4SOIvfb + model->B4SOItype * here->B4SOIdelvto; here->B4SOIvfbzb = pParam->B4SOIvfbzb + model->B4SOItype * here->B4SOIdelvto; - pParam->B4SOIldeb = sqrt(EPSSI * Vtm0 / + pParam->B4SOIldeb = sqrt(epssub * Vtm0 / (Charge_q * pParam->B4SOInpeak * 1.0e6)) / 3.0; + + /*For high k mobility*/ + T1 = model->B4SOItype * here->B4SOIvth0 + - here->B4SOIvfb - pParam->B4SOIphi; + T2 = T1 + T1; + T3 = 2.5 * T1; + here->B4SOIvtfbphi1 = (model->B4SOItype == NMOS) ? T2 : T3; + if (here->B4SOIvtfbphi1 < 0.0) + here->B4SOIvtfbphi1 = 0.0; + /*Calculate VgsteffVth for mobMod=4*/ + if(model->B4SOImobMod == 4) + { + /*Calculate n @ Vbs=Vds=0*/ + V0 = pParam->B4SOIvbi - pParam->B4SOIphi; + lt1 = model->B4SOIfactor1* pParam->B4SOIsqrtXdep0; + ltw = lt1; + T0 = pParam->B4SOIdvt1 * pParam->B4SOIleff / lt1; + if (T0 < EXPL_THRESHOLD) + { + T1 = exp(T0); + T2 = T1 - 1.0; + T3 = T2 * T2; + T4 = T3 + 2.0 * T1 * MIN_EXPL; + Theta0 = T1 / T4; + } + else + Theta0 = 1.0 / (MAX_EXPL - 2.0); + + tmp1 = epssub / pParam->B4SOIXdep0; + here->B4SOInstar = model->B4SOIvtm / Charge_q * + (model->B4SOIcox + tmp1 + pParam->B4SOIcit); + tmp2 = pParam->B4SOInfactor * tmp1; + tmp3 = (tmp2 + pParam->B4SOIcdsc * Theta0 + pParam->B4SOIcit) / model->B4SOIcox; + if (tmp3 >= -0.5) + n0 = 1.0 + tmp3; + else + { + T0 = 1.0 / (3.0 + 8.0 * tmp3); + n0 = (1.0 + 3.0 * tmp3) * T0; + } + + T0 = n0 * Vtm0; + T1 = pParam->B4SOIvoff; + T2 = T1/T0; + if (T2 < -EXPL_THRESHOLD) + { T3 = model->B4SOIcox * MIN_EXPL / pParam->B4SOIcdep0; + T4 = pParam->B4SOImstar + T3 * n0; + } + else if (T2 > EXPL_THRESHOLD) + { T3 = model->B4SOIcox * MAX_EXPL / pParam->B4SOIcdep0; + T4 = pParam->B4SOImstar + T3 * n0; + } + else + { T3 = exp(T2)* model->B4SOIcox / pParam->B4SOIcdep0; + T4 = pParam->B4SOImstar + T3 * n0; + + } + + here->B4SOIvgsteffvth = T0 * log(2.0)/T4; + + } + + } } return(OK); diff --git a/src/spicelib/devices/bsim3soi/b4soitrunc.c b/src/spicelib/devices/bsim3soi/b4soitrunc.c index a9a2d96ed..6ec4b7d3d 100644 --- a/src/spicelib/devices/bsim3soi/b4soitrunc.c +++ b/src/spicelib/devices/bsim3soi/b4soitrunc.c @@ -1,12 +1,14 @@ -/*** B4SOI 11/30/2005 Xuemei (Jane) Xi Release ***/ +/*** B4SOI 03/06/2009 Wenwei Yang Release ***/ /********** - * Copyright 2005 Regents of the University of California. All rights reserved. + * Copyright 2009 Regents of the University of California. All rights reserved. * Authors: 1998 Samuel Fung, Dennis Sinitsky and Stephen Tang * Authors: 1999-2004 Pin Su, Hui Wan, Wei Jin, b3soitrunc.c * Authors: 2005- Hui Wan, Xuemei Xi, Ali Niknejad, Chenming Hu. + * Authors: 2009- Wenwei Yang, Chung-Hsun Lin, Ali Niknejad, Chenming Hu. * File: b4soitrunc.c * Modified by Hui Wan, Xuemei Xi 11/30/2005 + * Modified by Wenwei Yang, Chung-Hsun Lin, Darsen Lu 03/06/2009 **********/ #include "ngspice.h"