Update to bsimsoi v4.1

This commit is contained in:
dwarning 2009-04-19 10:43:09 +00:00
parent b73a5feed2
commit 06ae02fbde
23 changed files with 4698 additions and 318 deletions

View File

@ -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 \

View File

@ -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 \

View File

@ -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",

View File

@ -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)

View File

@ -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);
}

View File

@ -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)

View File

@ -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));

File diff suppressed because it is too large Load Diff

View File

@ -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"

View File

@ -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"

View File

@ -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
**********/

View File

@ -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);

View File

@ -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
**********/

File diff suppressed because it is too large Load Diff

View File

@ -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);

View File

@ -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"

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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);

View File

@ -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;
}

View File

@ -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);

View File

@ -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"