Added support fot bsim3soi dynamic depletion device (initial commit)

This commit is contained in:
pnenzi 2001-01-21 17:07:40 +00:00
parent d7e8cc99e5
commit 504ab3b0f9
24 changed files with 14301 additions and 0 deletions

View File

@ -0,0 +1,34 @@
## Process this file with automake to produce Makefile.in
pkglib_LTLIBRARIES = libbsim3soidd.la
libbsim3soidd_la_SOURCES = \
b3soidd.c \
b3soiddacld.c \
b3soiddask.c \
b3soiddcheck.c \
b3soiddcvtest.c \
b3soidddel.c \
b3soidddest.c \
b3soiddgetic.c \
b3soiddld.c \
b3soiddmask.c \
b3soiddmdel.c \
b3soiddmpar.c \
b3soiddnoi.c \
b3soiddpar.c \
b3soiddpzld.c \
b3soiddset.c \
b3soiddtemp.c \
b3soiddtrunc.c \
b3soidddef.h \
b3soiddext.h \
b3soiddinit.c \
b3soiddinit.h \
b3soidditf.h
INCLUDES = -I$(top_srcdir)/src/include
MAINTAINERCLEANFILES = Makefile.in

View File

@ -0,0 +1,479 @@
/**********
Copyright 1999 Regents of the University of California. All rights reserved.
Author: Weidong Liu and Pin Su Feb 1999
Author: 1998 Samuel Fung, Dennis Sinitsky and Stephen Tang
File: b3soidd.c 98/5/01
Modified by Wei Jin 99/9/27
**********/
#include "ngspice.h"
#include <stdio.h>
#include "devdefs.h"
#include "b3soidddef.h"
#include "suffix.h"
IFparm B3SOIDDpTable[] = { /* parameters */
IOP( "l", B3SOIDD_L, IF_REAL , "Length"),
IOP( "w", B3SOIDD_W, IF_REAL , "Width"),
IOP( "ad", B3SOIDD_AD, IF_REAL , "Drain area"),
IOP( "as", B3SOIDD_AS, IF_REAL , "Source area"),
IOP( "pd", B3SOIDD_PD, IF_REAL , "Drain perimeter"),
IOP( "ps", B3SOIDD_PS, IF_REAL , "Source perimeter"),
IOP( "nrd", B3SOIDD_NRD, IF_REAL , "Number of squares in drain"),
IOP( "nrs", B3SOIDD_NRS, IF_REAL , "Number of squares in source"),
IOP( "off", B3SOIDD_OFF, IF_FLAG , "Device is initially off"),
IP( "ic", B3SOIDD_IC, IF_REALVEC , "Vector of DS,GS,BS initial voltages"),
OP( "gmbs", B3SOIDD_GMBS, IF_REAL, "Gmb"),
OP( "gm", B3SOIDD_GM, IF_REAL, "Gm"),
OP( "gm/ids", B3SOIDD_GMID, IF_REAL, "Gm/Ids"),
OP( "gds", B3SOIDD_GDS, IF_REAL, "Gds"),
OP( "vdsat", B3SOIDD_VDSAT, IF_REAL, "Vdsat"),
OP( "vth", B3SOIDD_VON, IF_REAL, "Vth"),
OP( "ids", B3SOIDD_CD, IF_REAL, "Ids"),
OP( "vbs", B3SOIDD_VBS, IF_REAL, "Vbs"),
OP( "vgs", B3SOIDD_VGS, IF_REAL, "Vgs"),
OP( "vds", B3SOIDD_VDS, IF_REAL, "Vds"),
OP( "ves", B3SOIDD_VES, IF_REAL, "Ves"),
IOP( "bjtoff", B3SOIDD_BJTOFF, IF_INTEGER, "BJT on/off flag"),
IOP( "debug", B3SOIDD_DEBUG, IF_INTEGER, "BJT on/off flag"),
IOP( "rth0", B3SOIDD_RTH0, IF_REAL, "Instance Thermal Resistance"),
IOP( "cth0", B3SOIDD_CTH0, IF_REAL, "Instance Thermal Capacitance"),
IOP( "nrb", B3SOIDD_NRB, IF_REAL, "Number of squares in body"),
};
IFparm B3SOIDDmPTable[] = { /* model parameters */
IOP( "capmod", B3SOIDD_MOD_CAPMOD, IF_INTEGER, "Capacitance model selector"),
IOP( "mobmod", B3SOIDD_MOD_MOBMOD, IF_INTEGER, "Mobility model selector"),
IOP( "noimod", B3SOIDD_MOD_NOIMOD, IF_INTEGER, "Noise model selector"),
IOP( "paramchk", B3SOIDD_MOD_PARAMCHK, IF_INTEGER, "Model parameter checking selector"),
IOP( "binunit", B3SOIDD_MOD_BINUNIT, IF_INTEGER, "Bin unit selector"),
IOP( "version", B3SOIDD_MOD_VERSION, IF_REAL, " parameter for model version"),
IOP( "tox", B3SOIDD_MOD_TOX, IF_REAL, "Gate oxide thickness in meters"),
IOP( "cdsc", B3SOIDD_MOD_CDSC, IF_REAL, "Drain/Source and channel coupling capacitance"),
IOP( "cdscb", B3SOIDD_MOD_CDSCB, IF_REAL, "Body-bias dependence of cdsc"),
IOP( "cdscd", B3SOIDD_MOD_CDSCD, IF_REAL, "Drain-bias dependence of cdsc"),
IOP( "cit", B3SOIDD_MOD_CIT, IF_REAL, "Interface state capacitance"),
IOP( "nfactor", B3SOIDD_MOD_NFACTOR, IF_REAL, "Subthreshold swing Coefficient"),
IOP( "vsat", B3SOIDD_MOD_VSAT, IF_REAL, "Saturation velocity at tnom"),
IOP( "at", B3SOIDD_MOD_AT, IF_REAL, "Temperature coefficient of vsat"),
IOP( "a0", B3SOIDD_MOD_A0, IF_REAL, "Non-uniform depletion width effect coefficient."),
IOP( "ags", B3SOIDD_MOD_AGS, IF_REAL, "Gate bias coefficient of Abulk."),
IOP( "a1", B3SOIDD_MOD_A1, IF_REAL, "Non-saturation effect coefficient"),
IOP( "a2", B3SOIDD_MOD_A2, IF_REAL, "Non-saturation effect coefficient"),
IOP( "keta", B3SOIDD_MOD_KETA, IF_REAL, "Body-bias coefficient of non-uniform depletion width effect."),
IOP( "nsub", B3SOIDD_MOD_NSUB, IF_REAL, "Substrate doping concentration with polarity"),
IOP( "nch", B3SOIDD_MOD_NPEAK, IF_REAL, "Channel doping concentration"),
IOP( "ngate", B3SOIDD_MOD_NGATE, IF_REAL, "Poly-gate doping concentration"),
IOP( "gamma1", B3SOIDD_MOD_GAMMA1, IF_REAL, "Vth body coefficient"),
IOP( "gamma2", B3SOIDD_MOD_GAMMA2, IF_REAL, "Vth body coefficient"),
IOP( "vbx", B3SOIDD_MOD_VBX, IF_REAL, "Vth transition body Voltage"),
IOP( "vbm", B3SOIDD_MOD_VBM, IF_REAL, "Maximum body voltage"),
IOP( "xt", B3SOIDD_MOD_XT, IF_REAL, "Doping depth"),
IOP( "k1", B3SOIDD_MOD_K1, IF_REAL, "Bulk effect coefficient 1"),
IOP( "kt1", B3SOIDD_MOD_KT1, IF_REAL, "Temperature coefficient of Vth"),
IOP( "kt1l", B3SOIDD_MOD_KT1L, IF_REAL, "Temperature coefficient of Vth"),
IOP( "kt2", B3SOIDD_MOD_KT2, IF_REAL, "Body-coefficient of kt1"),
IOP( "k2", B3SOIDD_MOD_K2, IF_REAL, "Bulk effect coefficient 2"),
IOP( "k3", B3SOIDD_MOD_K3, IF_REAL, "Narrow width effect coefficient"),
IOP( "k3b", B3SOIDD_MOD_K3B, IF_REAL, "Body effect coefficient of k3"),
IOP( "w0", B3SOIDD_MOD_W0, IF_REAL, "Narrow width effect parameter"),
IOP( "nlx", B3SOIDD_MOD_NLX, IF_REAL, "Lateral non-uniform doping effect"),
IOP( "dvt0", B3SOIDD_MOD_DVT0, IF_REAL, "Short channel effect coeff. 0"),
IOP( "dvt1", B3SOIDD_MOD_DVT1, IF_REAL, "Short channel effect coeff. 1"),
IOP( "dvt2", B3SOIDD_MOD_DVT2, IF_REAL, "Short channel effect coeff. 2"),
IOP( "dvt0w", B3SOIDD_MOD_DVT0W, IF_REAL, "Narrow Width coeff. 0"),
IOP( "dvt1w", B3SOIDD_MOD_DVT1W, IF_REAL, "Narrow Width effect coeff. 1"),
IOP( "dvt2w", B3SOIDD_MOD_DVT2W, IF_REAL, "Narrow Width effect coeff. 2"),
IOP( "drout", B3SOIDD_MOD_DROUT, IF_REAL, "DIBL coefficient of output resistance"),
IOP( "dsub", B3SOIDD_MOD_DSUB, IF_REAL, "DIBL coefficient in the subthreshold region"),
IOP( "vth0", B3SOIDD_MOD_VTH0, IF_REAL,"Threshold voltage"),
IOP( "vtho", B3SOIDD_MOD_VTH0, IF_REAL,"Threshold voltage"),
IOP( "ua", B3SOIDD_MOD_UA, IF_REAL, "Linear gate dependence of mobility"),
IOP( "ua1", B3SOIDD_MOD_UA1, IF_REAL, "Temperature coefficient of ua"),
IOP( "ub", B3SOIDD_MOD_UB, IF_REAL, "Quadratic gate dependence of mobility"),
IOP( "ub1", B3SOIDD_MOD_UB1, IF_REAL, "Temperature coefficient of ub"),
IOP( "uc", B3SOIDD_MOD_UC, IF_REAL, "Body-bias dependence of mobility"),
IOP( "uc1", B3SOIDD_MOD_UC1, IF_REAL, "Temperature coefficient of uc"),
IOP( "u0", B3SOIDD_MOD_U0, IF_REAL, "Low-field mobility at Tnom"),
IOP( "ute", B3SOIDD_MOD_UTE, IF_REAL, "Temperature coefficient of mobility"),
IOP( "voff", B3SOIDD_MOD_VOFF, IF_REAL, "Threshold voltage offset"),
IOP( "tnom", B3SOIDD_MOD_TNOM, IF_REAL, "Parameter measurement temperature"),
IOP( "cgso", B3SOIDD_MOD_CGSO, IF_REAL, "Gate-source overlap capacitance per width"),
IOP( "cgdo", B3SOIDD_MOD_CGDO, IF_REAL, "Gate-drain overlap capacitance per width"),
IOP( "cgeo", B3SOIDD_MOD_CGEO, IF_REAL, "Gate-substrate overlap capacitance"),
IOP( "xpart", B3SOIDD_MOD_XPART, IF_REAL, "Channel charge partitioning"),
IOP( "delta", B3SOIDD_MOD_DELTA, IF_REAL, "Effective Vds parameter"),
IOP( "rsh", B3SOIDD_MOD_RSH, IF_REAL, "Source-drain sheet resistance"),
IOP( "rdsw", B3SOIDD_MOD_RDSW, IF_REAL, "Source-drain resistance per width"),
IOP( "prwg", B3SOIDD_MOD_PRWG, IF_REAL, "Gate-bias effect on parasitic resistance "),
IOP( "prwb", B3SOIDD_MOD_PRWB, IF_REAL, "Body-effect on parasitic resistance "),
IOP( "prt", B3SOIDD_MOD_PRT, IF_REAL, "Temperature coefficient of parasitic resistance "),
IOP( "eta0", B3SOIDD_MOD_ETA0, IF_REAL, "Subthreshold region DIBL coefficient"),
IOP( "etab", B3SOIDD_MOD_ETAB, IF_REAL, "Subthreshold region DIBL coefficient"),
IOP( "pclm", B3SOIDD_MOD_PCLM, IF_REAL, "Channel length modulation Coefficient"),
IOP( "pdiblc1", B3SOIDD_MOD_PDIBL1, IF_REAL, "Drain-induced barrier lowering coefficient"),
IOP( "pdiblc2", B3SOIDD_MOD_PDIBL2, IF_REAL, "Drain-induced barrier lowering coefficient"),
IOP( "pdiblcb", B3SOIDD_MOD_PDIBLB, IF_REAL, "Body-effect on drain-induced barrier lowering"),
IOP( "pvag", B3SOIDD_MOD_PVAG, IF_REAL, "Gate dependence of output resistance parameter"),
IOP( "shmod", B3SOIDD_MOD_SHMOD, IF_INTEGER, "Self heating mode selector"),
IOP( "tbox", B3SOIDD_MOD_TBOX, IF_REAL, "Back gate oxide thickness in meters"),
IOP( "tsi", B3SOIDD_MOD_TSI, IF_REAL, "Silicon-on-insulator thickness in meters"),
IOP( "xj", B3SOIDD_MOD_XJ, IF_REAL, "Junction Depth"),
IOP( "kb1", B3SOIDD_MOD_KB1, IF_REAL, "Backgate coupling coefficient at strong inversion"),
IOP( "kb3", B3SOIDD_MOD_KB3, IF_REAL, "Backgate coupling coefficient at subthreshold"),
IOP( "dvbd0", B3SOIDD_MOD_DVBD0, IF_REAL, "First coefficient of short-channel effect on Vbs0t"),
IOP( "dvbd1", B3SOIDD_MOD_DVBD1, IF_REAL, "Second coefficient of short-channel effect on Vbs0t"),
IOP( "vbsa", B3SOIDD_MOD_VBSA, IF_REAL, "Vbs0t offset voltage"),
IOP( "delp", B3SOIDD_MOD_DELP, IF_REAL, "Offset constant for limiting Vbseff to Phis"),
IOP( "rbody", B3SOIDD_MOD_RBODY, IF_REAL, "Intrinsic body contact sheet resistance"),
IOP( "rbsh", B3SOIDD_MOD_RBSH, IF_REAL, "Extrinsic body contact sheet resistance"),
IOP( "adice0", B3SOIDD_MOD_ADICE0, IF_REAL, "DICE constant for bulk charge effect"),
IOP( "abp", B3SOIDD_MOD_ABP, IF_REAL, "Gate bias coefficient for Xcsat calculation"),
IOP( "mxc", B3SOIDD_MOD_MXC, IF_REAL, "A smoothing parameter for Xcsat calculation"),
IOP( "rth0", B3SOIDD_MOD_RTH0, IF_REAL, "Self-heating thermal resistance"),
IOP( "cth0", B3SOIDD_MOD_CTH0, IF_REAL, "Self-heating thermal capacitance"),
IOP( "aii", B3SOIDD_MOD_AII, IF_REAL, "1st Vdsatii parameter"),
IOP( "bii", B3SOIDD_MOD_BII, IF_REAL, "2nd Vdsatii parameter"),
IOP( "cii", B3SOIDD_MOD_CII, IF_REAL, "3rd Vdsatii parameter"),
IOP( "dii", B3SOIDD_MOD_DII, IF_REAL, "4th Vdsatii parameter"),
IOP( "ngidl", B3SOIDD_MOD_NGIDL, IF_REAL, "GIDL first parameter"),
IOP( "agidl", B3SOIDD_MOD_AGIDL, IF_REAL, "GIDL second parameter"),
IOP( "bgidl", B3SOIDD_MOD_BGIDL, IF_REAL, "GIDL third parameter"),
IOP( "ndiode", B3SOIDD_MOD_NDIODE, IF_REAL, "Diode non-ideality factor"),
IOP( "ntun", B3SOIDD_MOD_NTUN, IF_REAL, "Reverse tunneling non-ideality factor"),
IOP( "isbjt", B3SOIDD_MOD_ISBJT, IF_REAL, "BJT emitter injection constant"),
IOP( "isdif", B3SOIDD_MOD_ISDIF, IF_REAL, "Body to S/D injection constant"),
IOP( "isrec", B3SOIDD_MOD_ISREC, IF_REAL, "Recombination in depletion constant"),
IOP( "istun", B3SOIDD_MOD_ISTUN, IF_REAL, "Tunneling diode constant"),
IOP( "xbjt", B3SOIDD_MOD_XBJT, IF_REAL, "Temperature coefficient for Isbjt"),
IOP( "xdif", B3SOIDD_MOD_XBJT, IF_REAL, "Temperature coefficient for Isdif"),
IOP( "xrec", B3SOIDD_MOD_XREC, IF_REAL, "Temperature coefficient for Isrec"),
IOP( "xtun", B3SOIDD_MOD_XTUN, IF_REAL, "Temperature coefficient for Istun"),
IOP( "edl", B3SOIDD_MOD_EDL, IF_REAL, "Electron diffusion length"),
IOP( "kbjt1", B3SOIDD_MOD_KBJT1, IF_REAL, "Vds dependency on BJT base width"),
IOP( "tt", B3SOIDD_MOD_TT, IF_REAL, "Diffusion capacitance transit time coefficient"),
IOP( "vsdth", B3SOIDD_MOD_VSDTH, IF_REAL, "Source/Drain diffusion threshold voltage"),
IOP( "vsdfb", B3SOIDD_MOD_VSDFB, IF_REAL, "Source/Drain diffusion flatband voltage"),
IOP( "csdmin", B3SOIDD_MOD_CSDMIN, IF_REAL, "Source/Drain diffusion bottom minimum capacitance"),
IOP( "asd", B3SOIDD_MOD_ASD, IF_REAL, "Source/Drain diffusion smoothing parameter"),
IOP( "pbswg", B3SOIDD_MOD_PBSWG, IF_REAL, "Source/drain (gate side) sidewall junction capacitance built in potential"),
IOP( "mjswg", B3SOIDD_MOD_MJSWG, IF_REAL, "Source/drain (gate side) sidewall junction capacitance grading coefficient"),
IOP( "cjswg", B3SOIDD_MOD_CJSWG, IF_REAL, "Source/drain (gate side) sidewall junction capacitance per unit width"),
IOP( "csdesw", B3SOIDD_MOD_CSDESW, IF_REAL, "Source/drain sidewall fringing constant"),
IOP( "lint", B3SOIDD_MOD_LINT, IF_REAL, "Length reduction parameter"),
IOP( "ll", B3SOIDD_MOD_LL, IF_REAL, "Length reduction parameter"),
IOP( "lln", B3SOIDD_MOD_LLN, IF_REAL, "Length reduction parameter"),
IOP( "lw", B3SOIDD_MOD_LW, IF_REAL, "Length reduction parameter"),
IOP( "lwn", B3SOIDD_MOD_LWN, IF_REAL, "Length reduction parameter"),
IOP( "lwl", B3SOIDD_MOD_LWL, IF_REAL, "Length reduction parameter"),
IOP( "wr", B3SOIDD_MOD_WR, IF_REAL, "Width dependence of rds"),
IOP( "wint", B3SOIDD_MOD_WINT, IF_REAL, "Width reduction parameter"),
IOP( "dwg", B3SOIDD_MOD_DWG, IF_REAL, "Width reduction parameter"),
IOP( "dwb", B3SOIDD_MOD_DWB, IF_REAL, "Width reduction parameter"),
IOP( "wl", B3SOIDD_MOD_WL, IF_REAL, "Width reduction parameter"),
IOP( "wln", B3SOIDD_MOD_WLN, IF_REAL, "Width reduction parameter"),
IOP( "ww", B3SOIDD_MOD_WW, IF_REAL, "Width reduction parameter"),
IOP( "wwn", B3SOIDD_MOD_WWN, IF_REAL, "Width reduction parameter"),
IOP( "wwl", B3SOIDD_MOD_WWL, IF_REAL, "Width reduction parameter"),
IOP( "b0", B3SOIDD_MOD_B0, IF_REAL, "Abulk narrow width parameter"),
IOP( "b1", B3SOIDD_MOD_B1, IF_REAL, "Abulk narrow width parameter"),
IOP( "cgsl", B3SOIDD_MOD_CGSL, IF_REAL, "New C-V model parameter"),
IOP( "cgdl", B3SOIDD_MOD_CGDL, IF_REAL, "New C-V model parameter"),
IOP( "ckappa", B3SOIDD_MOD_CKAPPA, IF_REAL, "New C-V model parameter"),
IOP( "cf", B3SOIDD_MOD_CF, IF_REAL, "Fringe capacitance parameter"),
IOP( "clc", B3SOIDD_MOD_CLC, IF_REAL, "Vdsat parameter for C-V model"),
IOP( "cle", B3SOIDD_MOD_CLE, IF_REAL, "Vdsat parameter for C-V model"),
IOP( "dwc", B3SOIDD_MOD_DWC, IF_REAL, "Delta W for C-V model"),
IOP( "dlc", B3SOIDD_MOD_DLC, IF_REAL, "Delta L for C-V model"),
IOP( "alpha0", B3SOIDD_MOD_ALPHA0, IF_REAL, "substrate current model parameter"),
IOP( "alpha1", B3SOIDD_MOD_ALPHA1, IF_REAL, "substrate current model parameter"),
IOP( "beta0", B3SOIDD_MOD_BETA0, IF_REAL, "substrate current model parameter"),
IOP( "noia", B3SOIDD_MOD_NOIA, IF_REAL, "Flicker noise parameter"),
IOP( "noib", B3SOIDD_MOD_NOIB, IF_REAL, "Flicker noise parameter"),
IOP( "noic", B3SOIDD_MOD_NOIC, IF_REAL, "Flicker noise parameter"),
IOP( "em", B3SOIDD_MOD_EM, IF_REAL, "Flicker noise parameter"),
IOP( "ef", B3SOIDD_MOD_EF, IF_REAL, "Flicker noise frequency exponent"),
IOP( "af", B3SOIDD_MOD_AF, IF_REAL, "Flicker noise exponent"),
IOP( "kf", B3SOIDD_MOD_KF, IF_REAL, "Flicker noise coefficient"),
IOP( "noif", B3SOIDD_MOD_NOIF, IF_REAL, "Floating body excess noise ideality factor"),
/* Added for binning - START */
/* Length Dependence */
IOP( "lnch", B3SOIDD_MOD_LNPEAK, IF_REAL, "Length dependence of nch"),
IOP( "lnsub", B3SOIDD_MOD_LNSUB, IF_REAL, "Length dependence of nsub"),
IOP( "lngate", B3SOIDD_MOD_LNGATE, IF_REAL, "Length dependence of ngate"),
IOP( "lvth0", B3SOIDD_MOD_LVTH0, IF_REAL,"Length dependence of vto"),
IOP( "lk1", B3SOIDD_MOD_LK1, IF_REAL, "Length dependence of k1"),
IOP( "lk2", B3SOIDD_MOD_LK2, IF_REAL, "Length dependence of k2"),
IOP( "lk3", B3SOIDD_MOD_LK3, IF_REAL, "Length dependence of k3"),
IOP( "lk3b", B3SOIDD_MOD_LK3B, IF_REAL, "Length dependence of k3b"),
IOP( "lvbsa", B3SOIDD_MOD_LVBSA, IF_REAL, "Length dependence of vbsa"),
IOP( "ldelp", B3SOIDD_MOD_LDELP, IF_REAL, "Length dependence of delp"),
IOP( "lkb1", B3SOIDD_MOD_LKB1, IF_REAL, "Length dependence of kb1"),
IOP( "lkb3", B3SOIDD_MOD_LKB3, IF_REAL, "Length dependence of kb3"),
IOP( "ldvbd0", B3SOIDD_MOD_LDVBD0, IF_REAL, "Length dependence of dvbd0"),
IOP( "ldvbd1", B3SOIDD_MOD_LDVBD1, IF_REAL, "Length dependence of dvbd1"),
IOP( "lw0", B3SOIDD_MOD_LW0, IF_REAL, "Length dependence of w0"),
IOP( "lnlx", B3SOIDD_MOD_LNLX, IF_REAL, "Length dependence of nlx"),
IOP( "ldvt0", B3SOIDD_MOD_LDVT0, IF_REAL, "Length dependence of dvt0"),
IOP( "ldvt1", B3SOIDD_MOD_LDVT1, IF_REAL, "Length dependence of dvt1"),
IOP( "ldvt2", B3SOIDD_MOD_LDVT2, IF_REAL, "Length dependence of dvt2"),
IOP( "ldvt0w", B3SOIDD_MOD_LDVT0W, IF_REAL, "Length dependence of dvt0w"),
IOP( "ldvt1w", B3SOIDD_MOD_LDVT1W, IF_REAL, "Length dependence of dvt1w"),
IOP( "ldvt2w", B3SOIDD_MOD_LDVT2W, IF_REAL, "Length dependence of dvt2w"),
IOP( "lu0", B3SOIDD_MOD_LU0, IF_REAL, "Length dependence of u0"),
IOP( "lua", B3SOIDD_MOD_LUA, IF_REAL, "Length dependence of ua"),
IOP( "lub", B3SOIDD_MOD_LUB, IF_REAL, "Length dependence of ub"),
IOP( "luc", B3SOIDD_MOD_LUC, IF_REAL, "Length dependence of uc"),
IOP( "lvsat", B3SOIDD_MOD_LVSAT, IF_REAL, "Length dependence of vsat"),
IOP( "la0", B3SOIDD_MOD_LA0, IF_REAL, "Length dependence of a0"),
IOP( "lags", B3SOIDD_MOD_LAGS, IF_REAL, "Length dependence of ags"),
IOP( "lb0", B3SOIDD_MOD_LB0, IF_REAL, "Length dependence of b0"),
IOP( "lb1", B3SOIDD_MOD_LB1, IF_REAL, "Length dependence of b1"),
IOP( "lketa", B3SOIDD_MOD_LKETA, IF_REAL, "Length dependence of keta"),
IOP( "labp", B3SOIDD_MOD_LABP, IF_REAL, "Length dependence of abp"),
IOP( "lmxc", B3SOIDD_MOD_LMXC, IF_REAL, "Length dependence of mxc"),
IOP( "ladice0", B3SOIDD_MOD_LADICE0, IF_REAL, "Length dependence of adice0"),
IOP( "la1", B3SOIDD_MOD_LA1, IF_REAL, "Length dependence of a1"),
IOP( "la2", B3SOIDD_MOD_LA2, IF_REAL, "Length dependence of a2"),
IOP( "lrdsw", B3SOIDD_MOD_LRDSW, IF_REAL, "Length dependence of rdsw "),
IOP( "lprwb", B3SOIDD_MOD_LPRWB, IF_REAL, "Length dependence of prwb "),
IOP( "lprwg", B3SOIDD_MOD_LPRWG, IF_REAL, "Length dependence of prwg "),
IOP( "lwr", B3SOIDD_MOD_LWR, IF_REAL, "Length dependence of wr"),
IOP( "lnfactor", B3SOIDD_MOD_LNFACTOR, IF_REAL, "Length dependence of nfactor"),
IOP( "ldwg", B3SOIDD_MOD_LDWG, IF_REAL, "Length dependence of dwg"),
IOP( "ldwb", B3SOIDD_MOD_LDWB, IF_REAL, "Length dependence of dwb"),
IOP( "lvoff", B3SOIDD_MOD_LVOFF, IF_REAL, "Length dependence of voff"),
IOP( "leta0", B3SOIDD_MOD_LETA0, IF_REAL, "Length dependence of eta0"),
IOP( "letab", B3SOIDD_MOD_LETAB, IF_REAL, "Length dependence of etab"),
IOP( "ldsub", B3SOIDD_MOD_LDSUB, IF_REAL, "Length dependence of dsub"),
IOP( "lcit", B3SOIDD_MOD_LCIT, IF_REAL, "Length dependence of cit"),
IOP( "lcdsc", B3SOIDD_MOD_LCDSC, IF_REAL, "Length dependence of cdsc"),
IOP( "lcdscb", B3SOIDD_MOD_LCDSCB, IF_REAL, "Length dependence of cdscb"),
IOP( "lcdscd", B3SOIDD_MOD_LCDSCD, IF_REAL, "Length dependence of cdscd"),
IOP( "lpclm", B3SOIDD_MOD_LPCLM, IF_REAL, "Length dependence of pclm"),
IOP( "lpdiblc1", B3SOIDD_MOD_LPDIBL1, IF_REAL, "Length dependence of pdiblc1"),
IOP( "lpdiblc2", B3SOIDD_MOD_LPDIBL2, IF_REAL, "Length dependence of pdiblc2"),
IOP( "lpdiblcb", B3SOIDD_MOD_LPDIBLB, IF_REAL, "Length dependence of pdiblcb"),
IOP( "ldrout", B3SOIDD_MOD_LDROUT, IF_REAL, "Length dependence of drout"),
IOP( "lpvag", B3SOIDD_MOD_LPVAG, IF_REAL, "Length dependence of pvag"),
IOP( "ldelta", B3SOIDD_MOD_LDELTA, IF_REAL, "Length dependence of delta"),
IOP( "laii", B3SOIDD_MOD_LAII, IF_REAL, "Length dependence of aii"),
IOP( "lbii", B3SOIDD_MOD_LBII, IF_REAL, "Length dependence of bii"),
IOP( "lcii", B3SOIDD_MOD_LCII, IF_REAL, "Length dependence of cii"),
IOP( "ldii", B3SOIDD_MOD_LDII, IF_REAL, "Length dependence of dii"),
IOP( "lalpha0", B3SOIDD_MOD_LALPHA0, IF_REAL, "Length dependence of alpha0"),
IOP( "lalpha1", B3SOIDD_MOD_LALPHA1, IF_REAL, "Length dependence of alpha1"),
IOP( "lbeta0", B3SOIDD_MOD_LBETA0, IF_REAL, "Length dependence of beta0"),
IOP( "lagidl", B3SOIDD_MOD_LAGIDL, IF_REAL, "Length dependence of agidl"),
IOP( "lbgidl", B3SOIDD_MOD_LBGIDL, IF_REAL, "Length dependence of bgidl"),
IOP( "lngidl", B3SOIDD_MOD_LNGIDL, IF_REAL, "Length dependence of ngidl"),
IOP( "lntun", B3SOIDD_MOD_LNTUN, IF_REAL, "Length dependence of ntun"),
IOP( "lndiode", B3SOIDD_MOD_LNDIODE, IF_REAL, "Length dependence of ndiode"),
IOP( "lisbjt", B3SOIDD_MOD_LISBJT, IF_REAL, "Length dependence of isbjt"),
IOP( "lisdif", B3SOIDD_MOD_LISDIF, IF_REAL, "Length dependence of isdif"),
IOP( "lisrec", B3SOIDD_MOD_LISREC, IF_REAL, "Length dependence of isrec"),
IOP( "listun", B3SOIDD_MOD_LISTUN, IF_REAL, "Length dependence of istun"),
IOP( "ledl", B3SOIDD_MOD_LEDL, IF_REAL, "Length dependence of edl"),
IOP( "lkbjt1", B3SOIDD_MOD_LKBJT1, IF_REAL, "Length dependence of kbjt1"),
IOP( "lvsdfb", B3SOIDD_MOD_LVSDFB, IF_REAL, "Length dependence of vsdfb"),
IOP( "lvsdth", B3SOIDD_MOD_LVSDTH, IF_REAL, "Length dependence of vsdth"),
/* Width Dependence */
IOP( "wnch", B3SOIDD_MOD_WNPEAK, IF_REAL, "Width dependence of nch"),
IOP( "wnsub", B3SOIDD_MOD_WNSUB, IF_REAL, "Width dependence of nsub"),
IOP( "wngate", B3SOIDD_MOD_WNGATE, IF_REAL, "Width dependence of ngate"),
IOP( "wvth0", B3SOIDD_MOD_WVTH0, IF_REAL,"Width dependence of vto"),
IOP( "wk1", B3SOIDD_MOD_WK1, IF_REAL, "Width dependence of k1"),
IOP( "wk2", B3SOIDD_MOD_WK2, IF_REAL, "Width dependence of k2"),
IOP( "wk3", B3SOIDD_MOD_WK3, IF_REAL, "Width dependence of k3"),
IOP( "wk3b", B3SOIDD_MOD_WK3B, IF_REAL, "Width dependence of k3b"),
IOP( "wvbsa", B3SOIDD_MOD_WVBSA, IF_REAL, "Width dependence of vbsa"),
IOP( "wdelp", B3SOIDD_MOD_WDELP, IF_REAL, "Width dependence of delp"),
IOP( "wkb1", B3SOIDD_MOD_WKB1, IF_REAL, "Width dependence of kb1"),
IOP( "wkb3", B3SOIDD_MOD_WKB3, IF_REAL, "Width dependence of kb3"),
IOP( "wdvbd0", B3SOIDD_MOD_WDVBD0, IF_REAL, "Width dependence of dvbd0"),
IOP( "wdvbd1", B3SOIDD_MOD_WDVBD1, IF_REAL, "Width dependence of dvbd1"),
IOP( "ww0", B3SOIDD_MOD_WW0, IF_REAL, "Width dependence of w0"),
IOP( "wnlx", B3SOIDD_MOD_WNLX, IF_REAL, "Width dependence of nlx"),
IOP( "wdvt0", B3SOIDD_MOD_WDVT0, IF_REAL, "Width dependence of dvt0"),
IOP( "wdvt1", B3SOIDD_MOD_WDVT1, IF_REAL, "Width dependence of dvt1"),
IOP( "wdvt2", B3SOIDD_MOD_WDVT2, IF_REAL, "Width dependence of dvt2"),
IOP( "wdvt0w", B3SOIDD_MOD_WDVT0W, IF_REAL, "Width dependence of dvt0w"),
IOP( "wdvt1w", B3SOIDD_MOD_WDVT1W, IF_REAL, "Width dependence of dvt1w"),
IOP( "wdvt2w", B3SOIDD_MOD_WDVT2W, IF_REAL, "Width dependence of dvt2w"),
IOP( "wu0", B3SOIDD_MOD_WU0, IF_REAL, "Width dependence of u0"),
IOP( "wua", B3SOIDD_MOD_WUA, IF_REAL, "Width dependence of ua"),
IOP( "wub", B3SOIDD_MOD_WUB, IF_REAL, "Width dependence of ub"),
IOP( "wuc", B3SOIDD_MOD_WUC, IF_REAL, "Width dependence of uc"),
IOP( "wvsat", B3SOIDD_MOD_WVSAT, IF_REAL, "Width dependence of vsat"),
IOP( "wa0", B3SOIDD_MOD_WA0, IF_REAL, "Width dependence of a0"),
IOP( "wags", B3SOIDD_MOD_WAGS, IF_REAL, "Width dependence of ags"),
IOP( "wb0", B3SOIDD_MOD_WB0, IF_REAL, "Width dependence of b0"),
IOP( "wb1", B3SOIDD_MOD_WB1, IF_REAL, "Width dependence of b1"),
IOP( "wketa", B3SOIDD_MOD_WKETA, IF_REAL, "Width dependence of keta"),
IOP( "wabp", B3SOIDD_MOD_WABP, IF_REAL, "Width dependence of abp"),
IOP( "wmxc", B3SOIDD_MOD_WMXC, IF_REAL, "Width dependence of mxc"),
IOP( "wadice0", B3SOIDD_MOD_WADICE0, IF_REAL, "Width dependence of adice0"),
IOP( "wa1", B3SOIDD_MOD_WA1, IF_REAL, "Width dependence of a1"),
IOP( "wa2", B3SOIDD_MOD_WA2, IF_REAL, "Width dependence of a2"),
IOP( "wrdsw", B3SOIDD_MOD_WRDSW, IF_REAL, "Width dependence of rdsw "),
IOP( "wprwb", B3SOIDD_MOD_WPRWB, IF_REAL, "Width dependence of prwb "),
IOP( "wprwg", B3SOIDD_MOD_WPRWG, IF_REAL, "Width dependence of prwg "),
IOP( "wwr", B3SOIDD_MOD_WWR, IF_REAL, "Width dependence of wr"),
IOP( "wnfactor", B3SOIDD_MOD_WNFACTOR, IF_REAL, "Width dependence of nfactor"),
IOP( "wdwg", B3SOIDD_MOD_WDWG, IF_REAL, "Width dependence of dwg"),
IOP( "wdwb", B3SOIDD_MOD_WDWB, IF_REAL, "Width dependence of dwb"),
IOP( "wvoff", B3SOIDD_MOD_WVOFF, IF_REAL, "Width dependence of voff"),
IOP( "weta0", B3SOIDD_MOD_WETA0, IF_REAL, "Width dependence of eta0"),
IOP( "wetab", B3SOIDD_MOD_WETAB, IF_REAL, "Width dependence of etab"),
IOP( "wdsub", B3SOIDD_MOD_WDSUB, IF_REAL, "Width dependence of dsub"),
IOP( "wcit", B3SOIDD_MOD_WCIT, IF_REAL, "Width dependence of cit"),
IOP( "wcdsc", B3SOIDD_MOD_WCDSC, IF_REAL, "Width dependence of cdsc"),
IOP( "wcdscb", B3SOIDD_MOD_WCDSCB, IF_REAL, "Width dependence of cdscb"),
IOP( "wcdscd", B3SOIDD_MOD_WCDSCD, IF_REAL, "Width dependence of cdscd"),
IOP( "wpclm", B3SOIDD_MOD_WPCLM, IF_REAL, "Width dependence of pclm"),
IOP( "wpdiblc1", B3SOIDD_MOD_WPDIBL1, IF_REAL, "Width dependence of pdiblc1"),
IOP( "wpdiblc2", B3SOIDD_MOD_WPDIBL2, IF_REAL, "Width dependence of pdiblc2"),
IOP( "wpdiblcb", B3SOIDD_MOD_WPDIBLB, IF_REAL, "Width dependence of pdiblcb"),
IOP( "wdrout", B3SOIDD_MOD_WDROUT, IF_REAL, "Width dependence of drout"),
IOP( "wpvag", B3SOIDD_MOD_WPVAG, IF_REAL, "Width dependence of pvag"),
IOP( "wdelta", B3SOIDD_MOD_WDELTA, IF_REAL, "Width dependence of delta"),
IOP( "waii", B3SOIDD_MOD_WAII, IF_REAL, "Width dependence of aii"),
IOP( "wbii", B3SOIDD_MOD_WBII, IF_REAL, "Width dependence of bii"),
IOP( "wcii", B3SOIDD_MOD_WCII, IF_REAL, "Width dependence of cii"),
IOP( "wdii", B3SOIDD_MOD_WDII, IF_REAL, "Width dependence of dii"),
IOP( "walpha0", B3SOIDD_MOD_WALPHA0, IF_REAL, "Width dependence of alpha0"),
IOP( "walpha1", B3SOIDD_MOD_WALPHA1, IF_REAL, "Width dependence of alpha1"),
IOP( "wbeta0", B3SOIDD_MOD_WBETA0, IF_REAL, "Width dependence of beta0"),
IOP( "wagidl", B3SOIDD_MOD_WAGIDL, IF_REAL, "Width dependence of agidl"),
IOP( "wbgidl", B3SOIDD_MOD_WBGIDL, IF_REAL, "Width dependence of bgidl"),
IOP( "wngidl", B3SOIDD_MOD_WNGIDL, IF_REAL, "Width dependence of ngidl"),
IOP( "wntun", B3SOIDD_MOD_WNTUN, IF_REAL, "Width dependence of ntun"),
IOP( "wndiode", B3SOIDD_MOD_WNDIODE, IF_REAL, "Width dependence of ndiode"),
IOP( "wisbjt", B3SOIDD_MOD_WISBJT, IF_REAL, "Width dependence of isbjt"),
IOP( "wisdif", B3SOIDD_MOD_WISDIF, IF_REAL, "Width dependence of isdif"),
IOP( "wisrec", B3SOIDD_MOD_WISREC, IF_REAL, "Width dependence of isrec"),
IOP( "wistun", B3SOIDD_MOD_WISTUN, IF_REAL, "Width dependence of istun"),
IOP( "wedl", B3SOIDD_MOD_WEDL, IF_REAL, "Width dependence of edl"),
IOP( "wkbjt1", B3SOIDD_MOD_WKBJT1, IF_REAL, "Width dependence of kbjt1"),
IOP( "wvsdfb", B3SOIDD_MOD_WVSDFB, IF_REAL, "Width dependence of vsdfb"),
IOP( "wvsdth", B3SOIDD_MOD_WVSDTH, IF_REAL, "Width dependence of vsdth"),
/* Cross-term Dependence */
IOP( "pnch", B3SOIDD_MOD_PNPEAK, IF_REAL, "Cross-term dependence of nch"),
IOP( "pnsub", B3SOIDD_MOD_PNSUB, IF_REAL, "Cross-term dependence of nsub"),
IOP( "pngate", B3SOIDD_MOD_PNGATE, IF_REAL, "Cross-term dependence of ngate"),
IOP( "pvth0", B3SOIDD_MOD_PVTH0, IF_REAL,"Cross-term dependence of vto"),
IOP( "pk1", B3SOIDD_MOD_PK1, IF_REAL, "Cross-term dependence of k1"),
IOP( "pk2", B3SOIDD_MOD_PK2, IF_REAL, "Cross-term dependence of k2"),
IOP( "pk3", B3SOIDD_MOD_PK3, IF_REAL, "Cross-term dependence of k3"),
IOP( "pk3b", B3SOIDD_MOD_PK3B, IF_REAL, "Cross-term dependence of k3b"),
IOP( "pvbsa", B3SOIDD_MOD_PVBSA, IF_REAL, "Cross-term dependence of vbsa"),
IOP( "pdelp", B3SOIDD_MOD_PDELP, IF_REAL, "Cross-term dependence of delp"),
IOP( "pkb1", B3SOIDD_MOD_PKB1, IF_REAL, "Cross-term dependence of kb1"),
IOP( "pkb3", B3SOIDD_MOD_PKB3, IF_REAL, "Cross-term dependence of kb3"),
IOP( "pdvbd0", B3SOIDD_MOD_PDVBD0, IF_REAL, "Cross-term dependence of dvbd0"),
IOP( "pdvbd1", B3SOIDD_MOD_PDVBD1, IF_REAL, "Cross-term dependence of dvbd1"),
IOP( "pw0", B3SOIDD_MOD_PW0, IF_REAL, "Cross-term dependence of w0"),
IOP( "pnlx", B3SOIDD_MOD_PNLX, IF_REAL, "Cross-term dependence of nlx"),
IOP( "pdvt0", B3SOIDD_MOD_PDVT0, IF_REAL, "Cross-term dependence of dvt0"),
IOP( "pdvt1", B3SOIDD_MOD_PDVT1, IF_REAL, "Cross-term dependence of dvt1"),
IOP( "pdvt2", B3SOIDD_MOD_PDVT2, IF_REAL, "Cross-term dependence of dvt2"),
IOP( "pdvt0w", B3SOIDD_MOD_PDVT0W, IF_REAL, "Cross-term dependence of dvt0w"),
IOP( "pdvt1w", B3SOIDD_MOD_PDVT1W, IF_REAL, "Cross-term dependence of dvt1w"),
IOP( "pdvt2w", B3SOIDD_MOD_PDVT2W, IF_REAL, "Cross-term dependence of dvt2w"),
IOP( "pu0", B3SOIDD_MOD_PU0, IF_REAL, "Cross-term dependence of u0"),
IOP( "pua", B3SOIDD_MOD_PUA, IF_REAL, "Cross-term dependence of ua"),
IOP( "pub", B3SOIDD_MOD_PUB, IF_REAL, "Cross-term dependence of ub"),
IOP( "puc", B3SOIDD_MOD_PUC, IF_REAL, "Cross-term dependence of uc"),
IOP( "pvsat", B3SOIDD_MOD_PVSAT, IF_REAL, "Cross-term dependence of vsat"),
IOP( "pa0", B3SOIDD_MOD_PA0, IF_REAL, "Cross-term dependence of a0"),
IOP( "pags", B3SOIDD_MOD_PAGS, IF_REAL, "Cross-term dependence of ags"),
IOP( "pb0", B3SOIDD_MOD_PB0, IF_REAL, "Cross-term dependence of b0"),
IOP( "pb1", B3SOIDD_MOD_PB1, IF_REAL, "Cross-term dependence of b1"),
IOP( "pketa", B3SOIDD_MOD_PKETA, IF_REAL, "Cross-term dependence of keta"),
IOP( "pabp", B3SOIDD_MOD_PABP, IF_REAL, "Cross-term dependence of abp"),
IOP( "pmxc", B3SOIDD_MOD_PMXC, IF_REAL, "Cross-term dependence of mxc"),
IOP( "padice0", B3SOIDD_MOD_PADICE0, IF_REAL, "Cross-term dependence of adice0"),
IOP( "pa1", B3SOIDD_MOD_PA1, IF_REAL, "Cross-term dependence of a1"),
IOP( "pa2", B3SOIDD_MOD_PA2, IF_REAL, "Cross-term dependence of a2"),
IOP( "prdsw", B3SOIDD_MOD_PRDSW, IF_REAL, "Cross-term dependence of rdsw "),
IOP( "pprwb", B3SOIDD_MOD_PPRWB, IF_REAL, "Cross-term dependence of prwb "),
IOP( "pprwg", B3SOIDD_MOD_PPRWG, IF_REAL, "Cross-term dependence of prwg "),
IOP( "pwr", B3SOIDD_MOD_PWR, IF_REAL, "Cross-term dependence of wr"),
IOP( "pnfactor", B3SOIDD_MOD_PNFACTOR, IF_REAL, "Cross-term dependence of nfactor"),
IOP( "pdwg", B3SOIDD_MOD_PDWG, IF_REAL, "Cross-term dependence of dwg"),
IOP( "pdwb", B3SOIDD_MOD_PDWB, IF_REAL, "Cross-term dependence of dwb"),
IOP( "pvoff", B3SOIDD_MOD_PVOFF, IF_REAL, "Cross-term dependence of voff"),
IOP( "peta0", B3SOIDD_MOD_PETA0, IF_REAL, "Cross-term dependence of eta0"),
IOP( "petab", B3SOIDD_MOD_PETAB, IF_REAL, "Cross-term dependence of etab"),
IOP( "pdsub", B3SOIDD_MOD_PDSUB, IF_REAL, "Cross-term dependence of dsub"),
IOP( "pcit", B3SOIDD_MOD_PCIT, IF_REAL, "Cross-term dependence of cit"),
IOP( "pcdsc", B3SOIDD_MOD_PCDSC, IF_REAL, "Cross-term dependence of cdsc"),
IOP( "pcdscb", B3SOIDD_MOD_PCDSCB, IF_REAL, "Cross-term dependence of cdscb"),
IOP( "pcdscd", B3SOIDD_MOD_PCDSCD, IF_REAL, "Cross-term dependence of cdscd"),
IOP( "ppclm", B3SOIDD_MOD_PPCLM, IF_REAL, "Cross-term dependence of pclm"),
IOP( "ppdiblc1", B3SOIDD_MOD_PPDIBL1, IF_REAL, "Cross-term dependence of pdiblc1"),
IOP( "ppdiblc2", B3SOIDD_MOD_PPDIBL2, IF_REAL, "Cross-term dependence of pdiblc2"),
IOP( "ppdiblcb", B3SOIDD_MOD_PPDIBLB, IF_REAL, "Cross-term dependence of pdiblcb"),
IOP( "pdrout", B3SOIDD_MOD_PDROUT, IF_REAL, "Cross-term dependence of drout"),
IOP( "ppvag", B3SOIDD_MOD_PPVAG, IF_REAL, "Cross-term dependence of pvag"),
IOP( "pdelta", B3SOIDD_MOD_PDELTA, IF_REAL, "Cross-term dependence of delta"),
IOP( "paii", B3SOIDD_MOD_PAII, IF_REAL, "Cross-term dependence of aii"),
IOP( "pbii", B3SOIDD_MOD_PBII, IF_REAL, "Cross-term dependence of bii"),
IOP( "pcii", B3SOIDD_MOD_PCII, IF_REAL, "Cross-term dependence of cii"),
IOP( "pdii", B3SOIDD_MOD_PDII, IF_REAL, "Cross-term dependence of dii"),
IOP( "palpha0", B3SOIDD_MOD_PALPHA0, IF_REAL, "Cross-term dependence of alpha0"),
IOP( "palpha1", B3SOIDD_MOD_PALPHA1, IF_REAL, "Cross-term dependence of alpha1"),
IOP( "pbeta0", B3SOIDD_MOD_PBETA0, IF_REAL, "Cross-term dependence of beta0"),
IOP( "pagidl", B3SOIDD_MOD_PAGIDL, IF_REAL, "Cross-term dependence of agidl"),
IOP( "pbgidl", B3SOIDD_MOD_PBGIDL, IF_REAL, "Cross-term dependence of bgidl"),
IOP( "pngidl", B3SOIDD_MOD_PNGIDL, IF_REAL, "Cross-term dependence of ngidl"),
IOP( "pntun", B3SOIDD_MOD_PNTUN, IF_REAL, "Cross-term dependence of ntun"),
IOP( "pndiode", B3SOIDD_MOD_PNDIODE, IF_REAL, "Cross-term dependence of ndiode"),
IOP( "pisbjt", B3SOIDD_MOD_PISBJT, IF_REAL, "Cross-term dependence of isbjt"),
IOP( "pisdif", B3SOIDD_MOD_PISDIF, IF_REAL, "Cross-term dependence of isdif"),
IOP( "pisrec", B3SOIDD_MOD_PISREC, IF_REAL, "Cross-term dependence of isrec"),
IOP( "pistun", B3SOIDD_MOD_PISTUN, IF_REAL, "Cross-term dependence of istun"),
IOP( "pedl", B3SOIDD_MOD_PEDL, IF_REAL, "Cross-term dependence of edl"),
IOP( "pkbjt1", B3SOIDD_MOD_PKBJT1, IF_REAL, "Cross-term dependence of kbjt1"),
IOP( "pvsdfb", B3SOIDD_MOD_PVSDFB, IF_REAL, "Cross-term dependence of vsdfb"),
IOP( "pvsdth", B3SOIDD_MOD_PVSDTH, IF_REAL, "Cross-term dependence of vsdth"),
/* Added for binning - END */
IP( "nmos", B3SOIDD_MOD_NMOS, IF_FLAG, "Flag to indicate NMOS"),
IP( "pmos", B3SOIDD_MOD_PMOS, IF_FLAG, "Flag to indicate PMOS"),
};
char *B3SOIDDnames[] = {
"Drain",
"Gate",
"Source",
"Backgate",
"",
"Body",
"Temp",
"Charge",
};
int B3SOIDDnSize = NUMELEMS(B3SOIDDnames);
int B3SOIDDpTSize = NUMELEMS(B3SOIDDpTable);
int B3SOIDDmPTSize = NUMELEMS(B3SOIDDmPTable);
int B3SOIDDiSize = sizeof(B3SOIDDinstance);
int B3SOIDDmSize = sizeof(B3SOIDDmodel);

View File

@ -0,0 +1,462 @@
/**********
Copyright 1999 Regents of the University of California. All rights reserved.
Author: Weidong Liu and Pin Su Feb 1999
Author: 1998 Samuel Fung, Dennis Sinitsky and Stephen Tang
File: b3soiddacld.c 98/5/01
**********/
#include "ngspice.h"
#include <stdio.h>
#include "cktdefs.h"
#include "b3soidddef.h"
#include "sperror.h"
#include "suffix.h"
int
B3SOIDDacLoad(inModel,ckt)
GENmodel *inModel;
register CKTcircuit *ckt;
{
register B3SOIDDmodel *model = (B3SOIDDmodel*)inModel;
register B3SOIDDinstance *here;
register int selfheat;
double xcggb, xcgdb, xcgsb, xcgeb, xcgT;
double xcdgb, xcddb, xcdsb, xcdeb, xcdT;
double xcsgb, xcsdb, xcssb, xcseb, xcsT;
double xcbgb, xcbdb, xcbsb, xcbeb, xcbT;
double xcegb, xcedb, xcesb, xceeb, xceT;
double gdpr, gspr, gds;
double cggb, cgdb, cgsb, cgeb, cgT;
double cdgb, cddb, cdsb, cdeb, cdT;
double cbgb, cbdb, cbsb, cbeb, cbT;
double cegb, cedb, cesb, ceeb, ceT;
double GSoverlapCap, GDoverlapCap, GEoverlapCap, FwdSum, RevSum, Gm, Gmbs, Gme, GmT;
double omega;
double dxpart, sxpart;
double gbbg, gbbdp, gbbb, gbbe, gbbp, gbbsp, gbbT;
double gddpg, gddpdp, gddpsp, gddpb, gddpe, gddpT;
double gsspg, gsspdp, gsspsp, gsspb, gsspe, gsspT;
double gppg, gppdp, gppb, gppe, gppp, gppsp, gppT;
double xcTt, cTt, gcTt, gTtt, gTtg, gTtb, gTte, gTtdp, gTtsp;
double Dum1, Dum2, Dum3, Dum4, Dum5;
FILE *fpdebug;
omega = ckt->CKTomega;
for (; model != NULL; model = model->B3SOIDDnextModel)
{
for (here = model->B3SOIDDinstances; here!= NULL;
here = here->B3SOIDDnextInstance)
{
selfheat = (model->B3SOIDDshMod == 1) && (here->B3SOIDDrth0 != 0.0);
if (here->B3SOIDDdebugMod > 2)
{
fpdebug = fopen("b3soiDDac.log", "a");
fprintf(fpdebug, ".......omega=%.5e\n", omega);
}
if (here->B3SOIDDmode >= 0)
{ Gm = here->B3SOIDDgm;
Gmbs = here->B3SOIDDgmbs;
Gme = here->B3SOIDDgme;
GmT = model->B3SOIDDtype * here->B3SOIDDgmT;
FwdSum = Gm + Gmbs + Gme;
RevSum = 0.0;
cbgb = here->B3SOIDDcbgb;
cbsb = here->B3SOIDDcbsb;
cbdb = here->B3SOIDDcbdb;
cbeb = here->B3SOIDDcbeb;
cbT = model->B3SOIDDtype * here->B3SOIDDcbT;
cegb = here->B3SOIDDcegb;
cesb = here->B3SOIDDcesb;
cedb = here->B3SOIDDcedb;
ceeb = here->B3SOIDDceeb;
ceT = model->B3SOIDDtype * here->B3SOIDDceT;
cggb = here->B3SOIDDcggb;
cgsb = here->B3SOIDDcgsb;
cgdb = here->B3SOIDDcgdb;
cgeb = here->B3SOIDDcgeb;
cgT = model->B3SOIDDtype * here->B3SOIDDcgT;
cdgb = here->B3SOIDDcdgb;
cdsb = here->B3SOIDDcdsb;
cddb = here->B3SOIDDcddb;
cdeb = here->B3SOIDDcdeb;
cdT = model->B3SOIDDtype * here->B3SOIDDcdT;
cTt = here->pParam->B3SOIDDcth;
gbbg = -here->B3SOIDDgbgs;
gbbdp = -here->B3SOIDDgbds;
gbbb = -here->B3SOIDDgbbs;
gbbe = -here->B3SOIDDgbes;
gbbp = -here->B3SOIDDgbps;
gbbT = -model->B3SOIDDtype * here->B3SOIDDgbT;
gbbsp = - ( gbbg + gbbdp + gbbb + gbbe + gbbp);
gddpg = -here->B3SOIDDgjdg;
gddpdp = -here->B3SOIDDgjdd;
gddpb = -here->B3SOIDDgjdb;
gddpe = -here->B3SOIDDgjde;
gddpT = -model->B3SOIDDtype * here->B3SOIDDgjdT;
gddpsp = - ( gddpg + gddpdp + gddpb + gddpe);
gsspg = -here->B3SOIDDgjsg;
gsspdp = -here->B3SOIDDgjsd;
gsspb = -here->B3SOIDDgjsb;
gsspe = 0.0;
gsspT = -model->B3SOIDDtype * here->B3SOIDDgjsT;
gsspsp = - (gsspg + gsspdp + gsspb + gsspe);
gppg = -here->B3SOIDDgbpgs;
gppdp = -here->B3SOIDDgbpds;
gppb = -here->B3SOIDDgbpbs;
gppe = -here->B3SOIDDgbpes;
gppp = -here->B3SOIDDgbpps;
gppT = -model->B3SOIDDtype * here->B3SOIDDgbpT;
gppsp = - (gppg + gppdp + gppb + gppe + gppp);
gTtg = here->B3SOIDDgtempg;
gTtb = here->B3SOIDDgtempb;
gTte = here->B3SOIDDgtempe;
gTtdp = here->B3SOIDDgtempd;
gTtt = here->B3SOIDDgtempT;
gTtsp = - (gTtg + gTtb + gTte + gTtdp);
sxpart = 0.6;
dxpart = 0.4;
}
else
{ Gm = -here->B3SOIDDgm;
Gmbs = -here->B3SOIDDgmbs;
Gme = -here->B3SOIDDgme;
GmT = -model->B3SOIDDtype * here->B3SOIDDgmT;
FwdSum = 0.0;
RevSum = -Gm - Gmbs - Gme;
cdgb = - (here->B3SOIDDcdgb + here->B3SOIDDcggb + here->B3SOIDDcbgb
+ here->B3SOIDDcegb);
cdsb = - (here->B3SOIDDcddb + here->B3SOIDDcgdb + here->B3SOIDDcbdb
+ here->B3SOIDDcedb);
cddb = - (here->B3SOIDDcdsb + here->B3SOIDDcgsb + here->B3SOIDDcbsb
+ here->B3SOIDDcesb);
cdeb = - (here->B3SOIDDcdeb + here->B3SOIDDcgeb + here->B3SOIDDcbeb
+ here->B3SOIDDceeb);
cdT = - model->B3SOIDDtype * (here->B3SOIDDcgT + here->B3SOIDDcbT
+ here->B3SOIDDcdT + here->B3SOIDDceT);
cegb = here->B3SOIDDcegb;
cesb = here->B3SOIDDcedb;
cedb = here->B3SOIDDcesb;
ceeb = here->B3SOIDDceeb;
ceT = model->B3SOIDDtype * here->B3SOIDDceT;
cggb = here->B3SOIDDcggb;
cgsb = here->B3SOIDDcgdb;
cgdb = here->B3SOIDDcgsb;
cgeb = here->B3SOIDDcgeb;
cgT = model->B3SOIDDtype * here->B3SOIDDcgT;
cbgb = here->B3SOIDDcbgb;
cbsb = here->B3SOIDDcbdb;
cbdb = here->B3SOIDDcbsb;
cbeb = here->B3SOIDDcbeb;
cbT = model->B3SOIDDtype * here->B3SOIDDcbT;
cTt = here->pParam->B3SOIDDcth;
gbbg = -here->B3SOIDDgbgs;
gbbb = -here->B3SOIDDgbbs;
gbbe = -here->B3SOIDDgbes;
gbbp = -here->B3SOIDDgbps;
gbbsp = -here->B3SOIDDgbds;
gbbT = -model->B3SOIDDtype * here->B3SOIDDgbT;
gbbdp = - ( gbbg + gbbsp + gbbb + gbbe + gbbp);
gddpg = -here->B3SOIDDgjsg;
gddpsp = -here->B3SOIDDgjsd;
gddpb = -here->B3SOIDDgjsb;
gddpe = 0.0;
gddpT = -model->B3SOIDDtype * here->B3SOIDDgjsT;
gddpdp = - (gddpg + gddpsp + gddpb + gddpe);
gsspg = -here->B3SOIDDgjdg;
gsspsp = -here->B3SOIDDgjdd;
gsspb = -here->B3SOIDDgjdb;
gsspe = -here->B3SOIDDgjde;
gsspT = -model->B3SOIDDtype * here->B3SOIDDgjdT;
gsspdp = - ( gsspg + gsspsp + gsspb + gsspe);
gppg = -here->B3SOIDDgbpgs;
gppsp = -here->B3SOIDDgbpds;
gppb = -here->B3SOIDDgbpbs;
gppe = -here->B3SOIDDgbpes;
gppp = -here->B3SOIDDgbpps;
gppT = -model->B3SOIDDtype * here->B3SOIDDgbpT;
gppdp = - (gppg + gppsp + gppb + gppe + gppp);
gTtt = here->B3SOIDDgtempT;
gTtg = here->B3SOIDDgtempg;
gTtb = here->B3SOIDDgtempb;
gTte = here->B3SOIDDgtempe;
gTtdp = here->B3SOIDDgtempd;
gTtsp = - (gTtt + gTtg + gTtb + gTte + gTtdp);
gTtg = here->B3SOIDDgtempg;
gTtb = here->B3SOIDDgtempb;
gTte = here->B3SOIDDgtempe;
gTtsp = here->B3SOIDDgtempd;
gTtt = here->B3SOIDDgtempT;
gTtdp = - (gTtg + gTtb + gTte + gTtsp);
sxpart = 0.6;
sxpart = 0.4;
dxpart = 0.6;
}
gdpr=here->B3SOIDDdrainConductance;
gspr=here->B3SOIDDsourceConductance;
gds= here->B3SOIDDgds;
GSoverlapCap = here->B3SOIDDcgso;
GDoverlapCap = here->B3SOIDDcgdo;
GEoverlapCap = here->pParam->B3SOIDDcgeo;
xcegb = (cegb - GEoverlapCap) * omega;
xcedb = cedb * omega;
xcesb = cesb * omega;
xceeb = (ceeb + GEoverlapCap) * omega;
xceT = ceT * omega;
xcggb = (cggb + GDoverlapCap + GSoverlapCap + GEoverlapCap)
* omega;
xcgdb = (cgdb - GDoverlapCap ) * omega;
xcgsb = (cgsb - GSoverlapCap) * omega;
xcgeb = (cgeb - GEoverlapCap) * omega;
xcgT = cgT * omega;
xcdgb = (cdgb - GDoverlapCap) * omega;
xcddb = (cddb + GDoverlapCap) * omega;
xcdsb = cdsb * omega;
xcdeb = cdeb * omega;
xcdT = cdT * omega;
xcsgb = -(cggb + cbgb + cdgb + cegb + GSoverlapCap) * omega;
xcsdb = -(cgdb + cbdb + cddb + cedb) * omega;
xcssb = (GSoverlapCap - (cgsb + cbsb + cdsb + cesb)) * omega;
xcseb = -(cgeb + cbeb + cdeb + ceeb) * omega;
xcsT = -(cgT + cbT + cdT + ceT) * omega;
xcbgb = cbgb * omega;
xcbdb = cbdb * omega;
xcbsb = cbsb * omega;
xcbeb = cbeb * omega;
xcbT = cbT * omega;
xcTt = cTt * omega;
*(here->B3SOIDDEgPtr +1) += xcegb;
*(here->B3SOIDDEdpPtr +1) += xcedb;
*(here->B3SOIDDEspPtr +1) += xcesb;
*(here->B3SOIDDGePtr +1) += xcgeb;
*(here->B3SOIDDDPePtr +1) += xcdeb;
*(here->B3SOIDDSPePtr +1) += xcseb;
*(here->B3SOIDDEePtr +1) += xceeb;
*(here->B3SOIDDGgPtr +1) += xcggb;
*(here->B3SOIDDGdpPtr +1) += xcgdb;
*(here->B3SOIDDGspPtr +1) += xcgsb;
*(here->B3SOIDDDPgPtr +1) += xcdgb;
*(here->B3SOIDDDPdpPtr +1) += xcddb;
*(here->B3SOIDDDPspPtr +1) += xcdsb;
*(here->B3SOIDDSPgPtr +1) += xcsgb;
*(here->B3SOIDDSPdpPtr +1) += xcsdb;
*(here->B3SOIDDSPspPtr +1) += xcssb;
*(here->B3SOIDDBePtr +1) += xcbeb;
*(here->B3SOIDDBgPtr +1) += xcbgb;
*(here->B3SOIDDBdpPtr +1) += xcbdb;
*(here->B3SOIDDBspPtr +1) += xcbsb;
*(here->B3SOIDDEbPtr +1) -= xcegb + xcedb + xcesb + xceeb;
*(here->B3SOIDDGbPtr +1) -= xcggb + xcgdb + xcgsb + xcgeb;
*(here->B3SOIDDDPbPtr +1) -= xcdgb + xcddb + xcdsb + xcdeb;
*(here->B3SOIDDSPbPtr +1) -= xcsgb + xcsdb + xcssb + xcseb;
*(here->B3SOIDDBbPtr +1) -= xcbgb + xcbdb + xcbsb + xcbeb;
if (selfheat)
{
*(here->B3SOIDDTemptempPtr + 1) += xcTt;
*(here->B3SOIDDDPtempPtr + 1) += xcdT;
*(here->B3SOIDDSPtempPtr + 1) += xcsT;
*(here->B3SOIDDBtempPtr + 1) += xcbT;
*(here->B3SOIDDEtempPtr + 1) += xceT;
*(here->B3SOIDDGtempPtr + 1) += xcgT;
}
if (here->B3SOIDDdebugMod > 3)
{
fprintf(fpdebug, "Cbg+Cbs+Cbe = %.5e; Cbd = %.5e;\n",
(xcbgb+xcbsb+xcbeb)/omega, xcbdb/omega);
fprintf(fpdebug, "gbs = %.5e; gbd = %.5e\n", gbbsp, gbbdp);
fprintf(fpdebug, "AC condunctance...\n");
fprintf(fpdebug, "Eg=%.5e; Edp=%.5e; Esp=%.5e;\nEb=%.5e; Ee=%.5e\n",
xcegb, xcedb, xcesb, -(xcegb+xcedb+xcesb+xceeb), xceeb);
fprintf(fpdebug, "Gg=%.5e; Gdp=%.5e; Gsp=%.5e;\nGb=%.5e; Ge=%.5e\n",
xcggb, xcgdb, xcgsb, -(xcggb+xcgdb+xcgsb+xcgeb), xcgeb);
fprintf(fpdebug, "Bg=%.5e; Bdp=%.5e; Bsp=%.5e;\nBb=%.5e; Be=%.5e\n",
xcbgb, xcbdb, xcbsb, -(xcbgb+xcbdb+xcbsb+xcbeb), xcbeb);
fprintf(fpdebug, "DPg=%.5e; DPdp=%.5e; DPsp=%.5e;\nDPb=%.5e; DPe=%.5e\n",
xcdgb, xcddb, xcdsb, -(xcdgb+xcddb+xcdsb+xcdeb), xcdeb);
fprintf(fpdebug, "SPg=%.5e; SPdp=%.5e; SPsp=%.5e;\nSPb=%.5e; SPe=%.5e\n",
xcsgb, xcsdb, xcssb, -(xcsgb+xcsdb+xcssb+xcseb), xcseb);
}
*(here->B3SOIDDEgPtr) += 0.0;
*(here->B3SOIDDEdpPtr) += 0.0;
*(here->B3SOIDDEspPtr) += 0.0;
*(here->B3SOIDDGePtr) -= 0.0;
*(here->B3SOIDDDPePtr) += Gme + gddpe;
*(here->B3SOIDDSPePtr) += gsspe - Gme;
*(here->B3SOIDDEePtr) += 0.0;
*(here->B3SOIDDDPgPtr) += Gm + gddpg;
*(here->B3SOIDDDPdpPtr) += gdpr + gds + gddpdp + RevSum ;
*(here->B3SOIDDDPspPtr) -= gds + FwdSum - gddpsp;
*(here->B3SOIDDDPdPtr) -= gdpr;
*(here->B3SOIDDSPgPtr) -= Gm - gsspg;
*(here->B3SOIDDSPdpPtr) -= gds + RevSum - gsspdp;
*(here->B3SOIDDSPspPtr) += gspr + gds + FwdSum + gsspsp;
*(here->B3SOIDDSPsPtr) -= gspr;
*(here->B3SOIDDBePtr) += gbbe;
*(here->B3SOIDDBgPtr) += gbbg;
*(here->B3SOIDDBdpPtr) += gbbdp;
*(here->B3SOIDDBspPtr) += gbbsp;
*(here->B3SOIDDBbPtr) += gbbb;
*(here->B3SOIDDEbPtr) += 0.0;
*(here->B3SOIDDSPbPtr) -= Gmbs - gsspb;
*(here->B3SOIDDDPbPtr) -= (-gddpb - Gmbs);
if (selfheat)
{
*(here->B3SOIDDDPtempPtr) += GmT + gddpT;
*(here->B3SOIDDSPtempPtr) += -GmT + gsspT;
*(here->B3SOIDDBtempPtr) += gbbT;
if (here->B3SOIDDbodyMod == 1) {
(*(here->B3SOIDDPtempPtr) += gppT);
}
*(here->B3SOIDDTemptempPtr) += gTtt + 1/here->pParam->B3SOIDDrth;
*(here->B3SOIDDTempgPtr) += gTtg;
*(here->B3SOIDDTempbPtr) += gTtb;
*(here->B3SOIDDTempePtr) += gTte;
*(here->B3SOIDDTempdpPtr) += gTtdp;
*(here->B3SOIDDTempspPtr) += gTtsp;
}
if (here->B3SOIDDdebugMod > 3)
{
fprintf(fpdebug, "Static condunctance...\n");
fprintf(fpdebug, "Gg=%.5e; Gdp=%.5e; Gsp=%.5e;\nGb=%.5e; Ge=%.5e\n",
*(here->B3SOIDDGgPtr), *(here->B3SOIDDGdpPtr),
*(here->B3SOIDDGspPtr), *(here->B3SOIDDGbPtr),
*(here->B3SOIDDGePtr));
fprintf(fpdebug, "DPg=%.5e; DPdp=%.5e; DPsp=%.5e;\nDPb=%.5e; DPe=%.5e\n",
*(here->B3SOIDDDPgPtr), *(here->B3SOIDDDPdpPtr),
*(here->B3SOIDDDPspPtr), *(here->B3SOIDDDPbPtr),
*(here->B3SOIDDDPePtr));
fprintf(fpdebug, "SPg=%.5e; SPdp=%.5e; SPsp=%.5e;\nSPb=%.5e; SPe=%.5e\n",
*(here->B3SOIDDSPgPtr), *(here->B3SOIDDSPdpPtr),
*(here->B3SOIDDSPspPtr), *(here->B3SOIDDSPbPtr),
*(here->B3SOIDDSPePtr));
fprintf(fpdebug, "Bg=%.5e; Bdp=%.5e; Bsp=%.5e;\nBb=%.5e; Be=%.5e\n",
gbbg, gbbdp, gbbsp, gbbb, gbbe);
}
*(here->B3SOIDDDdPtr) += gdpr;
*(here->B3SOIDDDdpPtr) -= gdpr;
*(here->B3SOIDDSsPtr) += gspr;
*(here->B3SOIDDSspPtr) -= gspr;
if (here->B3SOIDDbodyMod == 1) {
(*(here->B3SOIDDBpPtr) -= gppp);
(*(here->B3SOIDDPbPtr) += gppb);
(*(here->B3SOIDDPpPtr) += gppp);
(*(here->B3SOIDDPgPtr) += gppg);
(*(here->B3SOIDDPdpPtr) += gppdp);
(*(here->B3SOIDDPspPtr) += gppsp);
(*(here->B3SOIDDPePtr) += gppe);
}
if (here->B3SOIDDdebugMod > 1)
{
*(here->B3SOIDDVbsPtr) += 1;
*(here->B3SOIDDIdsPtr) += 1;
*(here->B3SOIDDIcPtr) += 1;
*(here->B3SOIDDIbsPtr) += 1;
*(here->B3SOIDDIbdPtr) += 1;
*(here->B3SOIDDIiiPtr) += 1;
*(here->B3SOIDDIgidlPtr) += 1;
*(here->B3SOIDDItunPtr) += 1;
*(here->B3SOIDDIbpPtr) += 1;
*(here->B3SOIDDAbeffPtr) += 1;
*(here->B3SOIDDVbs0effPtr) += 1;
*(here->B3SOIDDVbseffPtr) += 1;
*(here->B3SOIDDXcPtr) += 1;
*(here->B3SOIDDCbgPtr) += 1;
*(here->B3SOIDDCbbPtr) += 1;
*(here->B3SOIDDCbdPtr) += 1;
*(here->B3SOIDDqbPtr) += 1;
*(here->B3SOIDDQbfPtr) += 1;
*(here->B3SOIDDQjsPtr) += 1;
*(here->B3SOIDDQjdPtr) += 1;
/* clean up last */
*(here->B3SOIDDGmPtr) += 1;
*(here->B3SOIDDGmbsPtr) += 1;
*(here->B3SOIDDGdsPtr) += 1;
*(here->B3SOIDDGmePtr) += 1;
*(here->B3SOIDDVbs0teffPtr) += 1;
*(here->B3SOIDDVgsteffPtr) += 1;
*(here->B3SOIDDCbePtr) += 1;
*(here->B3SOIDDVthPtr) += 1;
*(here->B3SOIDDXcsatPtr) += 1;
*(here->B3SOIDDVdscvPtr) += 1;
*(here->B3SOIDDVcscvPtr) += 1;
*(here->B3SOIDDQaccPtr) += 1;
*(here->B3SOIDDQsub0Ptr) += 1;
*(here->B3SOIDDQsubs1Ptr) += 1;
*(here->B3SOIDDQsubs2Ptr) += 1;
*(here->B3SOIDDqgPtr) += 1;
*(here->B3SOIDDqdPtr) += 1;
*(here->B3SOIDDqePtr) += 1;
*(here->B3SOIDDDum1Ptr) += 1;
*(here->B3SOIDDDum2Ptr) += 1;
*(here->B3SOIDDDum3Ptr) += 1;
*(here->B3SOIDDDum4Ptr) += 1;
*(here->B3SOIDDDum5Ptr) += 1;
}
if (here->B3SOIDDdebugMod > 2)
fclose(fpdebug);
}
}
return(OK);
}

View File

@ -0,0 +1,215 @@
/**********
Copyright 1999 Regents of the University of California. All rights reserved.
Author: Weidong Liu and Pin Su Feb 1999
Author: 1998 Samuel Fung, Dennis Sinitsky and Stephen Tang
File: b3soiask.c 98/5/01
**********/
#include "ngspice.h"
#include <stdio.h>
#include <math.h>
#include "ifsim.h"
#include "cktdefs.h"
#include "devdefs.h"
#include "b3soidddef.h"
#include "sperror.h"
#include "suffix.h"
int
B3SOIDDask(ckt,inst,which,value,select)
CKTcircuit *ckt;
GENinstance *inst;
int which;
IFvalue *value;
IFvalue *select;
{
B3SOIDDinstance *here = (B3SOIDDinstance*)inst;
switch(which)
{ case B3SOIDD_L:
value->rValue = here->B3SOIDDl;
return(OK);
case B3SOIDD_W:
value->rValue = here->B3SOIDDw;
return(OK);
case B3SOIDD_AS:
value->rValue = here->B3SOIDDsourceArea;
return(OK);
case B3SOIDD_AD:
value->rValue = here->B3SOIDDdrainArea;
return(OK);
case B3SOIDD_PS:
value->rValue = here->B3SOIDDsourcePerimeter;
return(OK);
case B3SOIDD_PD:
value->rValue = here->B3SOIDDdrainPerimeter;
return(OK);
case B3SOIDD_NRS:
value->rValue = here->B3SOIDDsourceSquares;
return(OK);
case B3SOIDD_NRD:
value->rValue = here->B3SOIDDdrainSquares;
return(OK);
case B3SOIDD_OFF:
value->rValue = here->B3SOIDDoff;
return(OK);
case B3SOIDD_BJTOFF:
value->iValue = here->B3SOIDDbjtoff;
return(OK);
case B3SOIDD_RTH0:
value->rValue = here->B3SOIDDrth0;
return(OK);
case B3SOIDD_CTH0:
value->rValue = here->B3SOIDDcth0;
return(OK);
case B3SOIDD_NRB:
value->rValue = here->B3SOIDDbodySquares;
return(OK);
case B3SOIDD_IC_VBS:
value->rValue = here->B3SOIDDicVBS;
return(OK);
case B3SOIDD_IC_VDS:
value->rValue = here->B3SOIDDicVDS;
return(OK);
case B3SOIDD_IC_VGS:
value->rValue = here->B3SOIDDicVGS;
return(OK);
case B3SOIDD_IC_VES:
value->rValue = here->B3SOIDDicVES;
return(OK);
case B3SOIDD_IC_VPS:
value->rValue = here->B3SOIDDicVPS;
return(OK);
case B3SOIDD_DNODE:
value->iValue = here->B3SOIDDdNode;
return(OK);
case B3SOIDD_GNODE:
value->iValue = here->B3SOIDDgNode;
return(OK);
case B3SOIDD_SNODE:
value->iValue = here->B3SOIDDsNode;
return(OK);
case B3SOIDD_BNODE:
value->iValue = here->B3SOIDDbNode;
return(OK);
case B3SOIDD_ENODE:
value->iValue = here->B3SOIDDeNode;
return(OK);
case B3SOIDD_DNODEPRIME:
value->iValue = here->B3SOIDDdNodePrime;
return(OK);
case B3SOIDD_SNODEPRIME:
value->iValue = here->B3SOIDDsNodePrime;
return(OK);
case B3SOIDD_SOURCECONDUCT:
value->rValue = here->B3SOIDDsourceConductance;
return(OK);
case B3SOIDD_DRAINCONDUCT:
value->rValue = here->B3SOIDDdrainConductance;
return(OK);
case B3SOIDD_VBD:
value->rValue = *(ckt->CKTstate0 + here->B3SOIDDvbd);
return(OK);
case B3SOIDD_VBS:
value->rValue = *(ckt->CKTstate0 + here->B3SOIDDvbs);
return(OK);
case B3SOIDD_VGS:
value->rValue = *(ckt->CKTstate0 + here->B3SOIDDvgs);
return(OK);
case B3SOIDD_VES:
value->rValue = *(ckt->CKTstate0 + here->B3SOIDDves);
return(OK);
case B3SOIDD_VDS:
value->rValue = *(ckt->CKTstate0 + here->B3SOIDDvds);
return(OK);
case B3SOIDD_CD:
value->rValue = here->B3SOIDDcd;
return(OK);
case B3SOIDD_CBS:
value->rValue = here->B3SOIDDcjs;
return(OK);
case B3SOIDD_CBD:
value->rValue = here->B3SOIDDcjd;
return(OK);
case B3SOIDD_GM:
value->rValue = here->B3SOIDDgm;
return(OK);
case B3SOIDD_GMID:
value->rValue = here->B3SOIDDgm/here->B3SOIDDcd;
return(OK);
case B3SOIDD_GDS:
value->rValue = here->B3SOIDDgds;
return(OK);
case B3SOIDD_GMBS:
value->rValue = here->B3SOIDDgmbs;
return(OK);
case B3SOIDD_GBD:
value->rValue = here->B3SOIDDgjdb;
return(OK);
case B3SOIDD_GBS:
value->rValue = here->B3SOIDDgjsb;
return(OK);
case B3SOIDD_QB:
value->rValue = *(ckt->CKTstate0 + here->B3SOIDDqb);
return(OK);
case B3SOIDD_CQB:
value->rValue = *(ckt->CKTstate0 + here->B3SOIDDcqb);
return(OK);
case B3SOIDD_QG:
value->rValue = *(ckt->CKTstate0 + here->B3SOIDDqg);
return(OK);
case B3SOIDD_CQG:
value->rValue = *(ckt->CKTstate0 + here->B3SOIDDcqg);
return(OK);
case B3SOIDD_QD:
value->rValue = *(ckt->CKTstate0 + here->B3SOIDDqd);
return(OK);
case B3SOIDD_CQD:
value->rValue = *(ckt->CKTstate0 + here->B3SOIDDcqd);
return(OK);
case B3SOIDD_CGG:
value->rValue = here->B3SOIDDcggb;
return(OK);
case B3SOIDD_CGD:
value->rValue = here->B3SOIDDcgdb;
return(OK);
case B3SOIDD_CGS:
value->rValue = here->B3SOIDDcgsb;
return(OK);
case B3SOIDD_CDG:
value->rValue = here->B3SOIDDcdgb;
return(OK);
case B3SOIDD_CDD:
value->rValue = here->B3SOIDDcddb;
return(OK);
case B3SOIDD_CDS:
value->rValue = here->B3SOIDDcdsb;
return(OK);
case B3SOIDD_CBG:
value->rValue = here->B3SOIDDcbgb;
return(OK);
case B3SOIDD_CBDB:
value->rValue = here->B3SOIDDcbdb;
return(OK);
case B3SOIDD_CBSB:
value->rValue = here->B3SOIDDcbsb;
return(OK);
case B3SOIDD_VON:
value->rValue = here->B3SOIDDvon;
return(OK);
case B3SOIDD_VDSAT:
value->rValue = here->B3SOIDDvdsat;
return(OK);
case B3SOIDD_QBS:
value->rValue = *(ckt->CKTstate0 + here->B3SOIDDqbs);
return(OK);
case B3SOIDD_QBD:
value->rValue = *(ckt->CKTstate0 + here->B3SOIDDqbd);
return(OK);
default:
return(E_BADPARM);
}
/* NOTREACHED */
}

View File

@ -0,0 +1,504 @@
/**********
Copyright 1999 Regents of the University of California. All rights reserved.
Author: 1998 Samuel Fung, Dennis Sinitsky and Stephen Tang
File: b3soiddcheck.c 98/5/01
**********/
#include "ngspice.h"
#include <stdio.h>
#include <math.h>
#include "cktdefs.h"
#include "b3soidddef.h"
#include "trandefs.h"
#include "const.h"
#include "sperror.h"
#include "devdefs.h"
#include "suffix.h"
int
B3SOIDDcheckModel(model, here, ckt)
register B3SOIDDmodel *model;
register B3SOIDDinstance *here;
CKTcircuit *ckt;
{
struct b3soiddSizeDependParam *pParam;
int Fatal_Flag = 0;
FILE *fplog;
if ((fplog = fopen("b3soiddv1check.log", "w")) != NULL)
{ pParam = here->pParam;
fprintf(fplog, "B3SOIDDV3 Parameter Check\n");
fprintf(fplog, "Model = %s\n", model->B3SOIDDmodName);
fprintf(fplog, "W = %g, L = %g\n", here->B3SOIDDw, here->B3SOIDDl);
if (pParam->B3SOIDDnlx < -pParam->B3SOIDDleff)
{ fprintf(fplog, "Fatal: Nlx = %g is less than -Leff.\n",
pParam->B3SOIDDnlx);
printf("Fatal: Nlx = %g is less than -Leff.\n",
pParam->B3SOIDDnlx);
Fatal_Flag = 1;
}
if (model->B3SOIDDtox <= 0.0)
{ fprintf(fplog, "Fatal: Tox = %g is not positive.\n",
model->B3SOIDDtox);
printf("Fatal: Tox = %g is not positive.\n", model->B3SOIDDtox);
Fatal_Flag = 1;
}
if (model->B3SOIDDtbox <= 0.0)
{ fprintf(fplog, "Fatal: Tbox = %g is not positive.\n",
model->B3SOIDDtbox);
printf("Fatal: Tbox = %g is not positive.\n", model->B3SOIDDtbox);
Fatal_Flag = 1;
}
if (pParam->B3SOIDDnpeak <= 0.0)
{ fprintf(fplog, "Fatal: Nch = %g is not positive.\n",
pParam->B3SOIDDnpeak);
printf("Fatal: Nch = %g is not positive.\n",
pParam->B3SOIDDnpeak);
Fatal_Flag = 1;
}
if (pParam->B3SOIDDngate < 0.0)
{ fprintf(fplog, "Fatal: Ngate = %g is not positive.\n",
pParam->B3SOIDDngate);
printf("Fatal: Ngate = %g Ngate is not positive.\n",
pParam->B3SOIDDngate);
Fatal_Flag = 1;
}
if (pParam->B3SOIDDngate > 1.e25)
{ fprintf(fplog, "Fatal: Ngate = %g is too high.\n",
pParam->B3SOIDDngate);
printf("Fatal: Ngate = %g Ngate is too high\n",
pParam->B3SOIDDngate);
Fatal_Flag = 1;
}
if (model->B3SOIDDdvbd1 < 0.0)
{ fprintf(fplog, "Fatal: Dvbd1 = %g is negative.\n",
model->B3SOIDDdvbd1);
printf("Fatal: Dvbd1 = %g is negative.\n", model->B3SOIDDdvbd1);
Fatal_Flag = 1;
}
if (pParam->B3SOIDDdvt1 < 0.0)
{ fprintf(fplog, "Fatal: Dvt1 = %g is negative.\n",
pParam->B3SOIDDdvt1);
printf("Fatal: Dvt1 = %g is negative.\n", pParam->B3SOIDDdvt1);
Fatal_Flag = 1;
}
if (pParam->B3SOIDDdvt1w < 0.0)
{ fprintf(fplog, "Fatal: Dvt1w = %g is negative.\n",
pParam->B3SOIDDdvt1w);
printf("Fatal: Dvt1w = %g is negative.\n", pParam->B3SOIDDdvt1w);
Fatal_Flag = 1;
}
if (pParam->B3SOIDDw0 == -pParam->B3SOIDDweff)
{ fprintf(fplog, "Fatal: (W0 + Weff) = 0 cauing divided-by-zero.\n");
printf("Fatal: (W0 + Weff) = 0 cauing divided-by-zero.\n");
Fatal_Flag = 1;
}
if (pParam->B3SOIDDdsub < 0.0)
{ fprintf(fplog, "Fatal: Dsub = %g is negative.\n", pParam->B3SOIDDdsub);
printf("Fatal: Dsub = %g is negative.\n", pParam->B3SOIDDdsub);
Fatal_Flag = 1;
}
if (pParam->B3SOIDDb1 == -pParam->B3SOIDDweff)
{ fprintf(fplog, "Fatal: (B1 + Weff) = 0 causing divided-by-zero.\n");
printf("Fatal: (B1 + Weff) = 0 causing divided-by-zero.\n");
Fatal_Flag = 1;
}
if (pParam->B3SOIDDu0temp <= 0.0)
{ fprintf(fplog, "Fatal: u0 at current temperature = %g is not positive.\n", pParam->B3SOIDDu0temp);
printf("Fatal: u0 at current temperature = %g is not positive.\n",
pParam->B3SOIDDu0temp);
Fatal_Flag = 1;
}
/* Check delta parameter */
if (pParam->B3SOIDDdelta < 0.0)
{ fprintf(fplog, "Fatal: Delta = %g is less than zero.\n",
pParam->B3SOIDDdelta);
printf("Fatal: Delta = %g is less than zero.\n", pParam->B3SOIDDdelta);
Fatal_Flag = 1;
}
if (pParam->B3SOIDDvsattemp <= 0.0)
{ fprintf(fplog, "Fatal: Vsat at current temperature = %g is not positive.\n", pParam->B3SOIDDvsattemp);
printf("Fatal: Vsat at current temperature = %g is not positive.\n",
pParam->B3SOIDDvsattemp);
Fatal_Flag = 1;
}
/* Check Rout parameters */
if (pParam->B3SOIDDpclm <= 0.0)
{ fprintf(fplog, "Fatal: Pclm = %g is not positive.\n", pParam->B3SOIDDpclm);
printf("Fatal: Pclm = %g is not positive.\n", pParam->B3SOIDDpclm);
Fatal_Flag = 1;
}
if (pParam->B3SOIDDdrout < 0.0)
{ fprintf(fplog, "Fatal: Drout = %g is negative.\n", pParam->B3SOIDDdrout);
printf("Fatal: Drout = %g is negative.\n", pParam->B3SOIDDdrout);
Fatal_Flag = 1;
}
if ( model->B3SOIDDunitLengthGateSidewallJctCap > 0.0)
{
if (here->B3SOIDDdrainPerimeter < pParam->B3SOIDDweff)
{ fprintf(fplog, "Warning: Pd = %g is less than W.\n",
here->B3SOIDDdrainPerimeter);
printf("Warning: Pd = %g is less than W.\n",
here->B3SOIDDdrainPerimeter);
here->B3SOIDDdrainPerimeter =pParam->B3SOIDDweff;
}
if (here->B3SOIDDsourcePerimeter < pParam->B3SOIDDweff)
{ fprintf(fplog, "Warning: Ps = %g is less than W.\n",
here->B3SOIDDsourcePerimeter);
printf("Warning: Ps = %g is less than W.\n",
here->B3SOIDDsourcePerimeter);
here->B3SOIDDsourcePerimeter =pParam->B3SOIDDweff;
}
}
/* Check capacitance parameters */
if (pParam->B3SOIDDclc < 0.0)
{ fprintf(fplog, "Fatal: Clc = %g is negative.\n", pParam->B3SOIDDclc);
printf("Fatal: Clc = %g is negative.\n", pParam->B3SOIDDclc);
Fatal_Flag = 1;
}
if (model->B3SOIDDparamChk ==1)
{
/* Check L and W parameters */
if (pParam->B3SOIDDleff <= 5.0e-8)
{ fprintf(fplog, "Warning: Leff = %g may be too small.\n",
pParam->B3SOIDDleff);
printf("Warning: Leff = %g may be too small.\n",
pParam->B3SOIDDleff);
}
if (pParam->B3SOIDDleffCV <= 5.0e-8)
{ fprintf(fplog, "Warning: Leff for CV = %g may be too small.\n",
pParam->B3SOIDDleffCV);
printf("Warning: Leff for CV = %g may be too small.\n",
pParam->B3SOIDDleffCV);
}
if (pParam->B3SOIDDweff <= 1.0e-7)
{ fprintf(fplog, "Warning: Weff = %g may be too small.\n",
pParam->B3SOIDDweff);
printf("Warning: Weff = %g may be too small.\n",
pParam->B3SOIDDweff);
}
if (pParam->B3SOIDDweffCV <= 1.0e-7)
{ fprintf(fplog, "Warning: Weff for CV = %g may be too small.\n",
pParam->B3SOIDDweffCV);
printf("Warning: Weff for CV = %g may be too small.\n",
pParam->B3SOIDDweffCV);
}
/* Check threshold voltage parameters */
if (pParam->B3SOIDDnlx < 0.0)
{ fprintf(fplog, "Warning: Nlx = %g is negative.\n", pParam->B3SOIDDnlx);
printf("Warning: Nlx = %g is negative.\n", pParam->B3SOIDDnlx);
}
if (model->B3SOIDDtox < 1.0e-9)
{ fprintf(fplog, "Warning: Tox = %g is less than 10A.\n",
model->B3SOIDDtox);
printf("Warning: Tox = %g is less than 10A.\n", model->B3SOIDDtox);
}
if (pParam->B3SOIDDnpeak <= 1.0e15)
{ fprintf(fplog, "Warning: Nch = %g may be too small.\n",
pParam->B3SOIDDnpeak);
printf("Warning: Nch = %g may be too small.\n",
pParam->B3SOIDDnpeak);
}
else if (pParam->B3SOIDDnpeak >= 1.0e21)
{ fprintf(fplog, "Warning: Nch = %g may be too large.\n",
pParam->B3SOIDDnpeak);
printf("Warning: Nch = %g may be too large.\n",
pParam->B3SOIDDnpeak);
}
if (fabs(pParam->B3SOIDDnsub) >= 1.0e21)
{ fprintf(fplog, "Warning: Nsub = %g may be too large.\n",
pParam->B3SOIDDnsub);
printf("Warning: Nsub = %g may be too large.\n",
pParam->B3SOIDDnsub);
}
if ((pParam->B3SOIDDngate > 0.0) &&
(pParam->B3SOIDDngate <= 1.e18))
{ fprintf(fplog, "Warning: Ngate = %g is less than 1.E18cm^-3.\n",
pParam->B3SOIDDngate);
printf("Warning: Ngate = %g is less than 1.E18cm^-3.\n",
pParam->B3SOIDDngate);
}
if (model->B3SOIDDdvbd0 < 0.0)
{ fprintf(fplog, "Warning: Dvbd0 = %g is negative.\n",
model->B3SOIDDdvbd0);
printf("Warning: Dvbd0 = %g is negative.\n", model->B3SOIDDdvbd0);
}
if (pParam->B3SOIDDdvt0 < 0.0)
{ fprintf(fplog, "Warning: Dvt0 = %g is negative.\n",
pParam->B3SOIDDdvt0);
printf("Warning: Dvt0 = %g is negative.\n", pParam->B3SOIDDdvt0);
}
if (fabs(1.0e-6 / (pParam->B3SOIDDw0 + pParam->B3SOIDDweff)) > 10.0)
{ fprintf(fplog, "Warning: (W0 + Weff) may be too small.\n");
printf("Warning: (W0 + Weff) may be too small.\n");
}
/* Check subthreshold parameters */
if (pParam->B3SOIDDnfactor < 0.0)
{ fprintf(fplog, "Warning: Nfactor = %g is negative.\n",
pParam->B3SOIDDnfactor);
printf("Warning: Nfactor = %g is negative.\n", pParam->B3SOIDDnfactor);
}
if (model->B3SOIDDkb3 < 0.0)
{ fprintf(fplog, "Warning: Kb3 = %g is negative.\n",
model->B3SOIDDkb3);
printf("Warning: Kb3 = %g is negative.\n", model->B3SOIDDkb3);
}
if (pParam->B3SOIDDcdsc < 0.0)
{ fprintf(fplog, "Warning: Cdsc = %g is negative.\n",
pParam->B3SOIDDcdsc);
printf("Warning: Cdsc = %g is negative.\n", pParam->B3SOIDDcdsc);
}
if (pParam->B3SOIDDcdscd < 0.0)
{ fprintf(fplog, "Warning: Cdscd = %g is negative.\n",
pParam->B3SOIDDcdscd);
printf("Warning: Cdscd = %g is negative.\n", pParam->B3SOIDDcdscd);
}
/* Check DIBL parameters */
if (pParam->B3SOIDDeta0 < 0.0)
{ fprintf(fplog, "Warning: Eta0 = %g is negative.\n",
pParam->B3SOIDDeta0);
printf("Warning: Eta0 = %g is negative.\n", pParam->B3SOIDDeta0);
}
/* Check Abulk parameters */
if (fabs(1.0e-6 / (pParam->B3SOIDDb1 + pParam->B3SOIDDweff)) > 10.0)
{ fprintf(fplog, "Warning: (B1 + Weff) may be too small.\n");
printf("Warning: (B1 + Weff) may be too small.\n");
}
if (model->B3SOIDDadice0 > 1.0)
{ fprintf(fplog, "Warning: Adice0 = %g should be smaller than 1.\n",
model->B3SOIDDadice0);
printf("Warning: Adice0 = %g should be smaller than 1.\n", model->B3SOIDDadice0);
}
if (model->B3SOIDDabp < 0.2)
{ fprintf(fplog, "Warning: Abp = %g is too small.\n",
model->B3SOIDDabp);
printf("Warning: Abp = %g is too small.\n", model->B3SOIDDabp);
}
if ((model->B3SOIDDmxc < -1.0) || (model->B3SOIDDmxc > 1.0))
{ fprintf(fplog, "Warning: Mxc = %g should be within (-1, 1).\n",
model->B3SOIDDmxc);
printf("Warning: Mxc = %g should be within (-1, 1).\n", model->B3SOIDDmxc);
}
/* Check Saturation parameters */
if (pParam->B3SOIDDa2 < 0.01)
{ fprintf(fplog, "Warning: A2 = %g is too small. Set to 0.01.\n", pParam->B3SOIDDa2);
printf("Warning: A2 = %g is too small. Set to 0.01.\n",
pParam->B3SOIDDa2);
pParam->B3SOIDDa2 = 0.01;
}
else if (pParam->B3SOIDDa2 > 1.0)
{ fprintf(fplog, "Warning: A2 = %g is larger than 1. A2 is set to 1 and A1 is set to 0.\n",
pParam->B3SOIDDa2);
printf("Warning: A2 = %g is larger than 1. A2 is set to 1 and A1 is set to 0.\n",
pParam->B3SOIDDa2);
pParam->B3SOIDDa2 = 1.0;
pParam->B3SOIDDa1 = 0.0;
}
if (pParam->B3SOIDDrdsw < 0.0)
{ fprintf(fplog, "Warning: Rdsw = %g is negative. Set to zero.\n",
pParam->B3SOIDDrdsw);
printf("Warning: Rdsw = %g is negative. Set to zero.\n",
pParam->B3SOIDDrdsw);
pParam->B3SOIDDrdsw = 0.0;
pParam->B3SOIDDrds0 = 0.0;
}
else if ((pParam->B3SOIDDrds0 > 0.0) && (pParam->B3SOIDDrds0 < 0.001))
{ fprintf(fplog, "Warning: Rds at current temperature = %g is less than 0.001 ohm. Set to zero.\n",
pParam->B3SOIDDrds0);
printf("Warning: Rds at current temperature = %g is less than 0.001 ohm. Set to zero.\n",
pParam->B3SOIDDrds0);
pParam->B3SOIDDrds0 = 0.0;
}
if (pParam->B3SOIDDvsattemp < 1.0e3)
{ fprintf(fplog, "Warning: Vsat at current temperature = %g may be too small.\n", pParam->B3SOIDDvsattemp);
printf("Warning: Vsat at current temperature = %g may be too small.\n", pParam->B3SOIDDvsattemp);
}
if (pParam->B3SOIDDpdibl1 < 0.0)
{ fprintf(fplog, "Warning: Pdibl1 = %g is negative.\n",
pParam->B3SOIDDpdibl1);
printf("Warning: Pdibl1 = %g is negative.\n", pParam->B3SOIDDpdibl1);
}
if (pParam->B3SOIDDpdibl2 < 0.0)
{ fprintf(fplog, "Warning: Pdibl2 = %g is negative.\n",
pParam->B3SOIDDpdibl2);
printf("Warning: Pdibl2 = %g is negative.\n", pParam->B3SOIDDpdibl2);
}
/* Check overlap capacitance parameters */
if (model->B3SOIDDcgdo < 0.0)
{ fprintf(fplog, "Warning: cgdo = %g is negative. Set to zero.\n", model->B3SOIDDcgdo);
printf("Warning: cgdo = %g is negative. Set to zero.\n", model->B3SOIDDcgdo);
model->B3SOIDDcgdo = 0.0;
}
if (model->B3SOIDDcgso < 0.0)
{ fprintf(fplog, "Warning: cgso = %g is negative. Set to zero.\n", model->B3SOIDDcgso);
printf("Warning: cgso = %g is negative. Set to zero.\n", model->B3SOIDDcgso);
model->B3SOIDDcgso = 0.0;
}
if (model->B3SOIDDcgeo < 0.0)
{ fprintf(fplog, "Warning: cgeo = %g is negative. Set to zero.\n", model->B3SOIDDcgeo);
printf("Warning: cgeo = %g is negative. Set to zero.\n", model->B3SOIDDcgeo);
model->B3SOIDDcgeo = 0.0;
}
if (model->B3SOIDDntun < 0.0)
{ fprintf(fplog, "Warning: Ntun = %g is negative.\n",
model->B3SOIDDntun);
printf("Warning: Ntun = %g is negative.\n", model->B3SOIDDntun);
}
if (model->B3SOIDDndiode < 0.0)
{ fprintf(fplog, "Warning: Ndiode = %g is negative.\n",
model->B3SOIDDndiode);
printf("Warning: Ndiode = %g is negative.\n", model->B3SOIDDndiode);
}
if (model->B3SOIDDisbjt < 0.0)
{ fprintf(fplog, "Warning: Isbjt = %g is negative.\n",
model->B3SOIDDisbjt);
printf("Warning: Isbjt = %g is negative.\n", model->B3SOIDDisbjt);
}
if (model->B3SOIDDisdif < 0.0)
{ fprintf(fplog, "Warning: Isdif = %g is negative.\n",
model->B3SOIDDisdif);
printf("Warning: Isdif = %g is negative.\n", model->B3SOIDDisdif);
}
if (model->B3SOIDDisrec < 0.0)
{ fprintf(fplog, "Warning: Isrec = %g is negative.\n",
model->B3SOIDDisrec);
printf("Warning: Isrec = %g is negative.\n", model->B3SOIDDisrec);
}
if (model->B3SOIDDistun < 0.0)
{ fprintf(fplog, "Warning: Istun = %g is negative.\n",
model->B3SOIDDistun);
printf("Warning: Istun = %g is negative.\n", model->B3SOIDDistun);
}
if (model->B3SOIDDedl < 0.0)
{ fprintf(fplog, "Warning: Edl = %g is negative.\n",
model->B3SOIDDedl);
printf("Warning: Edl = %g is negative.\n", model->B3SOIDDedl);
}
if (model->B3SOIDDkbjt1 < 0.0)
{ fprintf(fplog, "Warning: Kbjt1 = %g is negative.\n",
model->B3SOIDDkbjt1);
printf("Warning: kbjt1 = %g is negative.\n", model->B3SOIDDkbjt1);
}
if (model->B3SOIDDtt < 0.0)
{ fprintf(fplog, "Warning: Tt = %g is negative.\n",
model->B3SOIDDtt);
printf("Warning: Tt = %g is negative.\n", model->B3SOIDDtt);
}
if (model->B3SOIDDcsdmin < 0.0)
{ fprintf(fplog, "Warning: Csdmin = %g is negative.\n",
model->B3SOIDDcsdmin);
printf("Warning: Csdmin = %g is negative.\n", model->B3SOIDDcsdmin);
}
if (model->B3SOIDDcsdesw < 0.0)
{ fprintf(fplog, "Warning: Csdesw = %g is negative.\n",
model->B3SOIDDcsdesw);
printf("Warning: Csdesw = %g is negative.\n", model->B3SOIDDcsdesw);
}
if ((model->B3SOIDDasd < 0.0) || (model->B3SOIDDmxc > 1.0))
{ fprintf(fplog, "Warning: Asd = %g should be within (0, 1).\n",
model->B3SOIDDasd);
printf("Warning: Asd = %g should be within (0, 1).\n", model->B3SOIDDasd);
}
if (model->B3SOIDDrth0 < 0.0)
{ fprintf(fplog, "Warning: Rth0 = %g is negative.\n",
model->B3SOIDDrth0);
printf("Warning: Rth0 = %g is negative.\n", model->B3SOIDDrth0);
}
if (model->B3SOIDDcth0 < 0.0)
{ fprintf(fplog, "Warning: Cth0 = %g is negative.\n",
model->B3SOIDDcth0);
printf("Warning: Cth0 = %g is negative.\n", model->B3SOIDDcth0);
}
if (model->B3SOIDDrbody < 0.0)
{ fprintf(fplog, "Warning: Rbody = %g is negative.\n",
model->B3SOIDDrbody);
printf("Warning: Rbody = %g is negative.\n", model->B3SOIDDrbody);
}
if (model->B3SOIDDrbsh < 0.0)
{ fprintf(fplog, "Warning: Rbsh = %g is negative.\n",
model->B3SOIDDrbsh);
printf("Warning: Rbsh = %g is negative.\n", model->B3SOIDDrbsh);
}
if (model->B3SOIDDxj > model->B3SOIDDtsi)
{ fprintf(fplog, "Warning: Xj = %g is thicker than Tsi = %g.\n",
model->B3SOIDDxj, model->B3SOIDDtsi);
printf("Warning: Xj = %g is thicker than Tsi = %g.\n",
model->B3SOIDDxj, model->B3SOIDDtsi);
}
if (model->B3SOIDDcapMod < 2)
{ fprintf(fplog, "Warning: capMod < 2 is not supported by BSIM3SOI.\n");
printf("Warning: Warning: capMod < 2 is not supported by BSIM3SOI.\n");
}
if (model->B3SOIDDcii > 2.0)
{ fprintf(fplog, "Warning: Cii = %g is larger than 2.0.\n", model->B3SOIDDcii);
printf("Warning: Cii = %g is larger than 2.0.\n", model->B3SOIDDcii);
}
if (model->B3SOIDDdii > 1.5)
{ fprintf(fplog, "Warning: Dii = %g is larger than 1.5.\n", model->B3SOIDDcii);
printf("Warning: Dii = %g is too larger than 1.5.\n", model->B3SOIDDcii);
}
}/* loop for the parameter check for warning messages */
fclose(fplog);
}
else
{ fprintf(stderr, "Warning: Can't open log file. Parameter checking skipped.\n");
}
return(Fatal_Flag);
}

View File

@ -0,0 +1,90 @@
/**********
Copyright 1999 Regents of the University of California. All rights reserved.
Author: 1998 Samuel Fung, Dennis Sinitsky and Stephen Tang
File: b3soiddcvtest.c 98/5/01
**********/
#include "ngspice.h"
#include <stdio.h>
#include <math.h>
#include "cktdefs.h"
#include "b3soidddef.h"
#include "trandefs.h"
#include "const.h"
#include "devdefs.h"
#include "sperror.h"
#include "suffix.h"
int
B3SOIDDconvTest(inModel,ckt)
GENmodel *inModel;
register CKTcircuit *ckt;
{
register B3SOIDDmodel *model = (B3SOIDDmodel*)inModel;
register B3SOIDDinstance *here;
double delvbd, delvbs, delvds, delvgd, delvgs, vbd, vbs, vds;
double cbd, cbhat, cbs, cd, cdhat, tol, vgd, vgdo, vgs;
/* loop through all the B3SOIDD device models */
for (; model != NULL; model = model->B3SOIDDnextModel)
{ /* loop through all the instances of the model */
for (here = model->B3SOIDDinstances; here != NULL ;
here=here->B3SOIDDnextInstance)
{ vbs = model->B3SOIDDtype
* (*(ckt->CKTrhsOld+here->B3SOIDDbNode)
- *(ckt->CKTrhsOld+here->B3SOIDDsNodePrime));
vgs = model->B3SOIDDtype
* (*(ckt->CKTrhsOld+here->B3SOIDDgNode)
- *(ckt->CKTrhsOld+here->B3SOIDDsNodePrime));
vds = model->B3SOIDDtype
* (*(ckt->CKTrhsOld+here->B3SOIDDdNodePrime)
- *(ckt->CKTrhsOld+here->B3SOIDDsNodePrime));
vbd = vbs - vds;
vgd = vgs - vds;
vgdo = *(ckt->CKTstate0 + here->B3SOIDDvgs)
- *(ckt->CKTstate0 + here->B3SOIDDvds);
delvbs = vbs - *(ckt->CKTstate0 + here->B3SOIDDvbs);
delvbd = vbd - *(ckt->CKTstate0 + here->B3SOIDDvbd);
delvgs = vgs - *(ckt->CKTstate0 + here->B3SOIDDvgs);
delvds = vds - *(ckt->CKTstate0 + here->B3SOIDDvds);
delvgd = vgd-vgdo;
cd = here->B3SOIDDcd;
if (here->B3SOIDDmode >= 0)
{ cdhat = cd - here->B3SOIDDgjdb * delvbd
+ here->B3SOIDDgmbs * delvbs + here->B3SOIDDgm * delvgs
+ here->B3SOIDDgds * delvds;
}
else
{ cdhat = cd - (here->B3SOIDDgjdb - here->B3SOIDDgmbs) * delvbd
- here->B3SOIDDgm * delvgd + here->B3SOIDDgds * delvds;
}
/*
* check convergence
*/
if ((here->B3SOIDDoff == 0) || (!(ckt->CKTmode & MODEINITFIX)))
{ tol = ckt->CKTreltol * MAX(fabs(cdhat), fabs(cd))
+ ckt->CKTabstol;
if (fabs(cdhat - cd) >= tol)
{ ckt->CKTnoncon++;
return(OK);
}
cbs = here->B3SOIDDcjs;
cbd = here->B3SOIDDcjd;
cbhat = cbs + cbd + here->B3SOIDDgjdb * delvbd
+ here->B3SOIDDgjsb * delvbs;
tol = ckt->CKTreltol * MAX(fabs(cbhat), fabs(cbs + cbd))
+ ckt->CKTabstol;
if (fabs(cbhat - (cbs + cbd)) > tol)
{ ckt->CKTnoncon++;
return(OK);
}
}
}
}
return(OK);
}

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,41 @@
/**********
Copyright 1999 Regents of the University of California. All rights reserved.
Author: 1998 Samuel Fung, Dennis Sinitsky and Stephen Tang
File: b3soidddel.c 98/5/01
**********/
#include "ngspice.h"
#include <stdio.h>
#include "b3soidddef.h"
#include "sperror.h"
#include "gendefs.h"
#include "suffix.h"
int
B3SOIDDdelete(inModel,name,inInst)
GENmodel *inModel;
IFuid name;
GENinstance **inInst;
{
B3SOIDDinstance **fast = (B3SOIDDinstance**)inInst;
B3SOIDDmodel *model = (B3SOIDDmodel*)inModel;
B3SOIDDinstance **prev = NULL;
B3SOIDDinstance *here;
for (; model ; model = model->B3SOIDDnextModel)
{ prev = &(model->B3SOIDDinstances);
for (here = *prev; here ; here = *prev)
{ if (here->B3SOIDDname == name || (fast && here==*fast))
{ *prev= here->B3SOIDDnextInstance;
FREE(here);
return(OK);
}
prev = &(here->B3SOIDDnextInstance);
}
}
return(E_NODEV);
}

View File

@ -0,0 +1,39 @@
/**********
Copyright 1999 Regents of the University of California. All rights reserved.
Author: 1998 Samuel Fung, Dennis Sinitsky and Stephen Tang
File: b3soidddest.c 98/5/01
**********/
#include "ngspice.h"
#include <stdio.h>
#include "b3soidddef.h"
#include "suffix.h"
void
B3SOIDDdestroy(inModel)
GENmodel **inModel;
{
B3SOIDDmodel **model = (B3SOIDDmodel**)inModel;
B3SOIDDinstance *here;
B3SOIDDinstance *prev = NULL;
B3SOIDDmodel *mod = *model;
B3SOIDDmodel *oldmod = NULL;
for (; mod ; mod = mod->B3SOIDDnextModel)
{ if(oldmod) FREE(oldmod);
oldmod = mod;
prev = (B3SOIDDinstance *)NULL;
for (here = mod->B3SOIDDinstances; here; here = here->B3SOIDDnextInstance)
{ if(prev) FREE(prev);
prev = here;
}
if(prev) FREE(prev);
}
if(oldmod) FREE(oldmod);
*model = NULL;
return;
}

View File

@ -0,0 +1,54 @@
/**********
Copyright 1999 Regents of the University of California. All rights reserved.
Author: 1998 Samuel Fung
File: b3soiddext.h
**********/
#ifdef __STDC__
extern int B3SOIDDacLoad(GENmodel *,CKTcircuit*);
extern int B3SOIDDask(CKTcircuit *,GENinstance*,int,IFvalue*,IFvalue*);
extern int B3SOIDDconvTest(GENmodel *,CKTcircuit*);
extern int B3SOIDDdelete(GENmodel*,IFuid,GENinstance**);
extern void B3SOIDDdestroy(GENmodel**);
extern int B3SOIDDgetic(GENmodel*,CKTcircuit*);
extern int B3SOIDDload(GENmodel*,CKTcircuit*);
extern int B3SOIDDmAsk(CKTcircuit*,GENmodel *,int, IFvalue*);
extern int B3SOIDDmDelete(GENmodel**,IFuid,GENmodel*);
extern int B3SOIDDmParam(int,IFvalue*,GENmodel*);
extern void B3SOIDDmosCap(CKTcircuit*, double, double, double, double,
double, double, double, double, double, double, double,
double, double, double, double, double, double, double*,
double*, double*, double*, double*, double*, double*, double*,
double*, double*, double*, double*, double*, double*, double*,
double*);
extern int B3SOIDDparam(int,IFvalue*,GENinstance*,IFvalue*);
extern int B3SOIDDpzLoad(GENmodel*,CKTcircuit*,SPcomplex*);
extern int B3SOIDDsetup(SMPmatrix*,GENmodel*,CKTcircuit*,int*);
extern int B3SOIDDtemp(GENmodel*,CKTcircuit*);
extern int B3SOIDDtrunc(GENmodel*,CKTcircuit*,double*);
extern int B3SOIDDnoise(int,int,GENmodel*,CKTcircuit*,Ndata*,double*);
extern int B3SOIDDunsetup(GENmodel*,CKTcircuit*);
#else /* stdc */
extern int B3SOIDDacLoad();
extern int B3SOIDDdelete();
extern void B3SOIDDdestroy();
extern int B3SOIDDgetic();
extern int B3SOIDDload();
extern int B3SOIDDmDelete();
extern int B3SOIDDask();
extern int B3SOIDDmAsk();
extern int B3SOIDDconvTest();
extern int B3SOIDDtemp();
extern int B3SOIDDmParam();
extern void B3SOIDDmosCap();
extern int B3SOIDDparam();
extern int B3SOIDDpzLoad();
extern int B3SOIDDsetup();
extern int B3SOIDDtrunc();
extern int B3SOIDDnoise();
extern int B3SOIDDunsetup();
#endif /* stdc */

View File

@ -0,0 +1,51 @@
/**********
Copyright 1999 Regents of the University of California. All rights reserved.
Author: 1998 Samuel Fung, Dennis Sinitsky and Stephen Tang
File: b3soiddgetic.c 98/5/01
**********/
#include "ngspice.h"
#include <stdio.h>
#include "cktdefs.h"
#include "b3soidddef.h"
#include "sperror.h"
#include "suffix.h"
int
B3SOIDDgetic(inModel,ckt)
GENmodel *inModel;
CKTcircuit *ckt;
{
B3SOIDDmodel *model = (B3SOIDDmodel*)inModel;
B3SOIDDinstance *here;
for (; model ; model = model->B3SOIDDnextModel)
{ for (here = model->B3SOIDDinstances; here; here = here->B3SOIDDnextInstance)
{ if(!here->B3SOIDDicVBSGiven)
{ here->B3SOIDDicVBS = *(ckt->CKTrhs + here->B3SOIDDbNode)
- *(ckt->CKTrhs + here->B3SOIDDsNode);
}
if (!here->B3SOIDDicVDSGiven)
{ here->B3SOIDDicVDS = *(ckt->CKTrhs + here->B3SOIDDdNode)
- *(ckt->CKTrhs + here->B3SOIDDsNode);
}
if (!here->B3SOIDDicVGSGiven)
{ here->B3SOIDDicVGS = *(ckt->CKTrhs + here->B3SOIDDgNode)
- *(ckt->CKTrhs + here->B3SOIDDsNode);
}
if (!here->B3SOIDDicVESGiven)
{ here->B3SOIDDicVES = *(ckt->CKTrhs + here->B3SOIDDeNode)
- *(ckt->CKTrhs + here->B3SOIDDsNode);
}
if (!here->B3SOIDDicVPSGiven)
{ here->B3SOIDDicVPS = *(ckt->CKTrhs + here->B3SOIDDpNode)
- *(ckt->CKTrhs + here->B3SOIDDsNode);
}
}
}
return(OK);
}

View File

@ -0,0 +1,62 @@
#include <config.h>
#include <devdefs.h>
#include "b3soidditf.h"
#include "b3soiddext.h"
#include "b3soiddinit.h"
SPICEdev B3SOIDDinfo = {
{ "B3SOIDD",
"Berkeley SOI MOSFET (DD) model version 1.0",
&B3SOIDDnSize,
&B3SOIDDnSize,
B3SOIDDnames,
&B3SOIDDpTSize,
B3SOIDDpTable,
&B3SOIDDmPTSize,
B3SOIDDmPTable,
DEV_DEFAULT}
,
DEVparam: B3SOIDDparam,
DEVmodParam: B3SOIDDmParam,
DEVload: B3SOIDDload,
DEVsetup: B3SOIDDsetup,
DEVunsetup: B3SOIDDunsetup,
DEVpzSetup: B3SOIDDsetup,
DEVtemperature:B3SOIDDtemp,
DEVtrunc: B3SOIDDtrunc,
DEVfindBranch: NULL,
DEVacLoad: B3SOIDDacLoad,
DEVaccept: NULL,
DEVdestroy: B3SOIDDdestroy,
DEVmodDelete: B3SOIDDmDelete,
DEVdelete: B3SOIDDdelete,
DEVsetic: B3SOIDDgetic,
DEVask: B3SOIDDask,
DEVmodAsk: B3SOIDDmAsk,
DEVpzLoad: B3SOIDDpzLoad,
DEVconvTest: B3SOIDDconvTest,
DEVsenSetup: NULL,
DEVsenLoad: NULL,
DEVsenUpdate: NULL,
DEVsenAcLoad: NULL,
DEVsenPrint: NULL,
DEVsenTrunc: NULL,
DEVdisto: NULL,
DEVnoise: B3SOIDDnoise,
DEVinstSize: &B3SOIDDiSize,
DEVmodSize: &B3SOIDDmSize
};
SPICEdev *
get_b3soidd_info (void)
{
return &B3SOIDDinfo;
}

View File

@ -0,0 +1,13 @@
#ifndef _B3SOIDDINIT_H
#define _B3SOIDDINIT_H
extern IFparm B3SOIDDpTable[];
extern IFparm B3SOIDDmPTable[];
extern char *B3SOIDDnames[];
extern int B3SOIDDpTSize;
extern int B3SOIDDmPTSize;
extern int B3SOIDDnSize;
extern int B3SOIDDiSize;
extern int B3SOIDDmSize;
#endif

View File

@ -0,0 +1,14 @@
/**********
Copyright 1999 Regents of the University of California. All rights reserved.
Author: 1998 Samuel Fung
File: b3soidditf.h
**********/
#ifndef DEV_B3SOIDD
#define DEV_B3SOIDD
#include "b3soiddext.h"
SPICEdev *get_b3soidd_info (void);
#endif

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,48 @@
/**********
Copyright 1999 Regents of the University of California. All rights reserved.
Author: Weidong Liu and Pin Su Feb 1999
Author: 1998 Samuel Fung, Dennis Sinitsky and Stephen Tang
File: b3soiddmdel.c 98/5/01
**********/
#include "ngspice.h"
#include <stdio.h>
#include "b3soidddef.h"
#include "sperror.h"
#include "suffix.h"
int
B3SOIDDmDelete(inModel,modname,kill)
GENmodel **inModel;
IFuid modname;
GENmodel *kill;
{
B3SOIDDmodel **model = (B3SOIDDmodel**)inModel;
B3SOIDDmodel *modfast = (B3SOIDDmodel*)kill;
B3SOIDDinstance *here;
B3SOIDDinstance *prev = NULL;
B3SOIDDmodel **oldmod;
oldmod = model;
for (; *model ; model = &((*model)->B3SOIDDnextModel))
{ if ((*model)->B3SOIDDmodName == modname ||
(modfast && *model == modfast))
goto delgot;
oldmod = model;
}
return(E_NOMOD);
delgot:
*oldmod = (*model)->B3SOIDDnextModel; /* cut deleted device out of list */
for (here = (*model)->B3SOIDDinstances; here; here = here->B3SOIDDnextInstance)
{ if(prev) FREE(prev);
prev = here;
}
if(prev) FREE(prev);
FREE(*model);
return(OK);
}

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,395 @@
/**********
Copyright 1999 Regents of the University of California. All rights reserved.
Author: Weidong Liu and Pin Su Feb 1999
Author: 1998 Samuel Fung, Dennis Sinitsky and Stephen Tang
File: b3soiddnoi.c 98/5/01
**********/
#include "ngspice.h"
#include <stdio.h>
#include <math.h>
#include "b3soidddef.h"
#include "cktdefs.h"
#include "iferrmsg.h"
#include "noisedef.h"
#include "suffix.h"
#include "const.h" /* jwan */
/*
* B3SOIDDnoise (mode, operation, firstModel, ckt, data, OnDens)
* This routine names and evaluates all of the noise sources
* associated with MOSFET's. It starts with the model *firstModel and
* traverses all of its insts. It then proceeds to any other models
* on the linked list. The total output noise density generated by
* all of the MOSFET's is summed with the variable "OnDens".
*/
/*
Channel thermal and flicker noises are calculated based on the value
of model->B3SOIDDnoiMod.
If model->B3SOIDDnoiMod = 1,
Channel thermal noise = SPICE2 model
Flicker noise = SPICE2 model
If model->B3SOIDDnoiMod = 2,
Channel thermal noise = B3SOIDD model
Flicker noise = B3SOIDD model
If model->B3SOIDDnoiMod = 3,
Channel thermal noise = SPICE2 model
Flicker noise = B3SOIDD model
If model->B3SOIDDnoiMod = 4,
Channel thermal noise = B3SOIDD model
Flicker noise = SPICE2 model
*/
extern void NevalSrc();
extern double Nintegrate();
double
B3SOIDDStrongInversionNoiseEval(vgs, vds, model, here, freq, temp)
double vgs, vds, freq, temp;
B3SOIDDmodel *model;
B3SOIDDinstance *here;
{
struct b3soiddSizeDependParam *pParam;
double cd, esat, DelClm, EffFreq, N0, Nl, Vgst;
double T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, Ssi;
double req, ceq;
pParam = here->pParam;
cd = fabs(here->B3SOIDDcd);
if (vds > here->B3SOIDDvdsat)
{ esat = 2.0 * pParam->B3SOIDDvsattemp / here->B3SOIDDueff;
T0 = ((((vds - here->B3SOIDDvdsat) / pParam->B3SOIDDlitl) + model->B3SOIDDem)
/ esat);
DelClm = pParam->B3SOIDDlitl * log (MAX(T0, N_MINLOG));
}
else
DelClm = 0.0;
EffFreq = pow(freq, model->B3SOIDDef);
T1 = CHARGE * CHARGE * 8.62e-5 * cd * temp * here->B3SOIDDueff;
T2 = 1.0e8 * EffFreq * model->B3SOIDDcox
* pParam->B3SOIDDleff * pParam->B3SOIDDleff;
Vgst = vgs - here->B3SOIDDvon;
N0 = model->B3SOIDDcox * Vgst / CHARGE;
if (N0 < 0.0)
N0 = 0.0;
Nl = model->B3SOIDDcox * (Vgst - MIN(vds, here->B3SOIDDvdsat)) / CHARGE;
if (Nl < 0.0)
Nl = 0.0;
T3 = model->B3SOIDDoxideTrapDensityA
* log(MAX(((N0 + 2.0e14) / (Nl + 2.0e14)), N_MINLOG));
T4 = model->B3SOIDDoxideTrapDensityB * (N0 - Nl);
T5 = model->B3SOIDDoxideTrapDensityC * 0.5 * (N0 * N0 - Nl * Nl);
T6 = 8.62e-5 * temp * cd * cd;
T7 = 1.0e8 * EffFreq * pParam->B3SOIDDleff
* pParam->B3SOIDDleff * pParam->B3SOIDDweff;
T8 = model->B3SOIDDoxideTrapDensityA + model->B3SOIDDoxideTrapDensityB * Nl
+ model->B3SOIDDoxideTrapDensityC * Nl * Nl;
T9 = (Nl + 2.0e14) * (Nl + 2.0e14);
Ssi = T1 / T2 * (T3 + T4 + T5) + T6 / T7 * DelClm * T8 / T9;
return Ssi;
}
int
B3SOIDDnoise (mode, operation, inModel, ckt, data, OnDens)
int mode, operation;
GENmodel *inModel;
CKTcircuit *ckt;
register Ndata *data;
double *OnDens;
{
register B3SOIDDmodel *model = (B3SOIDDmodel *)inModel;
register B3SOIDDinstance *here;
struct b3soiddSizeDependParam *pParam;
char name[N_MXVLNTH];
double tempOnoise;
double tempInoise;
double noizDens[B3SOIDDNSRCS];
double lnNdens[B3SOIDDNSRCS];
double vgs, vds, Slimit;
double N0, Nl;
double T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13;
double n, ExpArg, Ssi, Swi;
int error, i;
/* define the names of the noise sources */
static char *B3SOIDDnNames[B3SOIDDNSRCS] =
{ /* Note that we have to keep the order */
".rd", /* noise due to rd */
/* consistent with the index definitions */
".rs", /* noise due to rs */
/* in B3SOIDDdefs.h */
".id", /* noise due to id */
".1overf", /* flicker (1/f) noise */
".fb", /* noise due to floating body */
"" /* total transistor noise */
};
for (; model != NULL; model = model->B3SOIDDnextModel)
{ for (here = model->B3SOIDDinstances; here != NULL;
here = here->B3SOIDDnextInstance)
{ pParam = here->pParam;
switch (operation)
{ case N_OPEN:
/* see if we have to to produce a summary report */
/* if so, name all the noise generators */
if (((NOISEAN*)ckt->CKTcurJob)->NStpsSm != 0)
{ switch (mode)
{ case N_DENS:
for (i = 0; i < B3SOIDDNSRCS; i++)
{ (void) sprintf(name, "onoise.%s%s",
here->B3SOIDDname,
B3SOIDDnNames[i]);
data->namelist = (IFuid *) trealloc(
(char *) data->namelist,
(data->numPlots + 1)
* sizeof(IFuid));
if (!data->namelist)
return(E_NOMEM);
(*(SPfrontEnd->IFnewUid)) (ckt,
&(data->namelist[data->numPlots++]),
(IFuid) NULL, name, UID_OTHER,
(void **) NULL);
/* we've added one more plot */
}
break;
case INT_NOIZ:
for (i = 0; i < B3SOIDDNSRCS; i++)
{ (void) sprintf(name, "onoise_total.%s%s",
here->B3SOIDDname,
B3SOIDDnNames[i]);
data->namelist = (IFuid *) trealloc(
(char *) data->namelist,
(data->numPlots + 1)
* sizeof(IFuid));
if (!data->namelist)
return(E_NOMEM);
(*(SPfrontEnd->IFnewUid)) (ckt,
&(data->namelist[data->numPlots++]),
(IFuid) NULL, name, UID_OTHER,
(void **) NULL);
/* we've added one more plot */
(void) sprintf(name, "inoise_total.%s%s",
here->B3SOIDDname,
B3SOIDDnNames[i]);
data->namelist = (IFuid *) trealloc(
(char *) data->namelist,
(data->numPlots + 1)
* sizeof(IFuid));
if (!data->namelist)
return(E_NOMEM);
(*(SPfrontEnd->IFnewUid)) (ckt,
&(data->namelist[data->numPlots++]),
(IFuid) NULL, name, UID_OTHER,
(void **)NULL);
/* we've added one more plot */
}
break;
}
}
break;
case N_CALC:
switch (mode)
{ case N_DENS:
NevalSrc(&noizDens[B3SOIDDRDNOIZ],
&lnNdens[B3SOIDDRDNOIZ], ckt, THERMNOISE,
here->B3SOIDDdNodePrime, here->B3SOIDDdNode,
here->B3SOIDDdrainConductance);
NevalSrc(&noizDens[B3SOIDDRSNOIZ],
&lnNdens[B3SOIDDRSNOIZ], ckt, THERMNOISE,
here->B3SOIDDsNodePrime, here->B3SOIDDsNode,
here->B3SOIDDsourceConductance);
switch( model->B3SOIDDnoiMod )
{ case 1:
case 3:
NevalSrc(&noizDens[B3SOIDDIDNOIZ],
&lnNdens[B3SOIDDIDNOIZ], ckt,
THERMNOISE, here->B3SOIDDdNodePrime,
here->B3SOIDDsNodePrime,
(2.0 / 3.0 * fabs(here->B3SOIDDgm
+ here->B3SOIDDgds
+ here->B3SOIDDgmbs)));
break;
case 2:
case 4:
NevalSrc(&noizDens[B3SOIDDIDNOIZ],
&lnNdens[B3SOIDDIDNOIZ], ckt,
THERMNOISE, here->B3SOIDDdNodePrime,
here->B3SOIDDsNodePrime,
(here->B3SOIDDueff
* fabs(here->B3SOIDDqinv
/ (pParam->B3SOIDDleff
* pParam->B3SOIDDleff))));
break;
}
NevalSrc(&noizDens[B3SOIDDFLNOIZ], (double*) NULL,
ckt, N_GAIN, here->B3SOIDDdNodePrime,
here->B3SOIDDsNodePrime, (double) 0.0);
switch( model->B3SOIDDnoiMod )
{ case 1:
case 4:
noizDens[B3SOIDDFLNOIZ] *= model->B3SOIDDkf
* exp(model->B3SOIDDaf
* log(MAX(fabs(here->B3SOIDDcd),
N_MINLOG)))
/ (pow(data->freq, model->B3SOIDDef)
* pParam->B3SOIDDleff
* pParam->B3SOIDDleff
* model->B3SOIDDcox);
break;
case 2:
case 3:
vgs = *(ckt->CKTstates[0] + here->B3SOIDDvgs);
vds = *(ckt->CKTstates[0] + here->B3SOIDDvds);
if (vds < 0.0)
{ vds = -vds;
vgs = vgs + vds;
}
if (vgs >= here->B3SOIDDvon + 0.1)
{ Ssi = B3SOIDDStrongInversionNoiseEval(vgs,
vds, model, here, data->freq,
ckt->CKTtemp);
noizDens[B3SOIDDFLNOIZ] *= Ssi;
}
else
{ pParam = here->pParam;
T10 = model->B3SOIDDoxideTrapDensityA
* 8.62e-5 * ckt->CKTtemp;
T11 = pParam->B3SOIDDweff
* pParam->B3SOIDDleff
* pow(data->freq, model->B3SOIDDef)
* 4.0e36;
Swi = T10 / T11 * here->B3SOIDDcd
* here->B3SOIDDcd;
Slimit = B3SOIDDStrongInversionNoiseEval(
here->B3SOIDDvon + 0.1, vds, model,
here, data->freq, ckt->CKTtemp);
T1 = Swi + Slimit;
if (T1 > 0.0)
noizDens[B3SOIDDFLNOIZ] *= (Slimit
* Swi) / T1;
else
noizDens[B3SOIDDFLNOIZ] *= 0.0;
}
break;
}
lnNdens[B3SOIDDFLNOIZ] =
log(MAX(noizDens[B3SOIDDFLNOIZ], N_MINLOG));
/* Low frequency excess noise due to FBE */
NevalSrc(&noizDens[B3SOIDDFBNOIZ], &lnNdens[B3SOIDDFBNOIZ],
ckt, SHOTNOISE, here->B3SOIDDsNodePrime,
here->B3SOIDDbNode,
2.0 * model->B3SOIDDnoif * here->B3SOIDDibs);
noizDens[B3SOIDDTOTNOIZ] = noizDens[B3SOIDDRDNOIZ]
+ noizDens[B3SOIDDRSNOIZ]
+ noizDens[B3SOIDDIDNOIZ]
+ noizDens[B3SOIDDFLNOIZ]
+ noizDens[B3SOIDDFBNOIZ];
lnNdens[B3SOIDDTOTNOIZ] =
log(MAX(noizDens[B3SOIDDTOTNOIZ], N_MINLOG));
*OnDens += noizDens[B3SOIDDTOTNOIZ];
if (data->delFreq == 0.0)
{ /* if we haven't done any previous
integration, we need to initialize our
"history" variables.
*/
for (i = 0; i < B3SOIDDNSRCS; i++)
{ here->B3SOIDDnVar[LNLSTDENS][i] =
lnNdens[i];
}
/* clear out our integration variables
if it's the first pass
*/
if (data->freq ==
((NOISEAN*) ckt->CKTcurJob)->NstartFreq)
{ for (i = 0; i < B3SOIDDNSRCS; i++)
{ here->B3SOIDDnVar[OUTNOIZ][i] = 0.0;
here->B3SOIDDnVar[INNOIZ][i] = 0.0;
}
}
}
else
{ /* data->delFreq != 0.0,
we have to integrate.
*/
for (i = 0; i < B3SOIDDNSRCS; i++)
{ if (i != B3SOIDDTOTNOIZ)
{ tempOnoise = Nintegrate(noizDens[i],
lnNdens[i],
here->B3SOIDDnVar[LNLSTDENS][i],
data);
tempInoise = Nintegrate(noizDens[i]
* data->GainSqInv, lnNdens[i]
+ data->lnGainInv,
here->B3SOIDDnVar[LNLSTDENS][i]
+ data->lnGainInv, data);
here->B3SOIDDnVar[LNLSTDENS][i] =
lnNdens[i];
data->outNoiz += tempOnoise;
data->inNoise += tempInoise;
if (((NOISEAN*)
ckt->CKTcurJob)->NStpsSm != 0)
{ here->B3SOIDDnVar[OUTNOIZ][i]
+= tempOnoise;
here->B3SOIDDnVar[OUTNOIZ][B3SOIDDTOTNOIZ]
+= tempOnoise;
here->B3SOIDDnVar[INNOIZ][i]
+= tempInoise;
here->B3SOIDDnVar[INNOIZ][B3SOIDDTOTNOIZ]
+= tempInoise;
}
}
}
}
if (data->prtSummary)
{ for (i = 0; i < B3SOIDDNSRCS; i++)
{ /* print a summary report */
data->outpVector[data->outNumber++]
= noizDens[i];
}
}
break;
case INT_NOIZ:
/* already calculated, just output */
if (((NOISEAN*)ckt->CKTcurJob)->NStpsSm != 0)
{ for (i = 0; i < B3SOIDDNSRCS; i++)
{ data->outpVector[data->outNumber++]
= here->B3SOIDDnVar[OUTNOIZ][i];
data->outpVector[data->outNumber++]
= here->B3SOIDDnVar[INNOIZ][i];
}
}
break;
}
break;
case N_CLOSE:
/* do nothing, the main calling routine will close */
return (OK);
break; /* the plots */
} /* switch (operation) */
} /* for here */
} /* for model */
return(OK);
}

View File

@ -0,0 +1,128 @@
/**********
Copyright 1999 Regents of the University of California. All rights reserved.
Author: 1998 Samuel Fung, Dennis Sinitsky and Stephen Tang
File: b3soiddpar.c 98/5/01
**********/
#include "ngspice.h"
#include <stdio.h>
#include "ifsim.h"
#include "b3soidddef.h"
#include "sperror.h"
#include "suffix.h"
int
B3SOIDDparam(param,value,inst,select)
int param;
IFvalue *value;
GENinstance *inst;
IFvalue *select;
{
B3SOIDDinstance *here = (B3SOIDDinstance*)inst;
switch(param)
{ case B3SOIDD_W:
here->B3SOIDDw = value->rValue;
here->B3SOIDDwGiven = TRUE;
break;
case B3SOIDD_L:
here->B3SOIDDl = value->rValue;
here->B3SOIDDlGiven = TRUE;
break;
case B3SOIDD_AS:
here->B3SOIDDsourceArea = value->rValue;
here->B3SOIDDsourceAreaGiven = TRUE;
break;
case B3SOIDD_AD:
here->B3SOIDDdrainArea = value->rValue;
here->B3SOIDDdrainAreaGiven = TRUE;
break;
case B3SOIDD_PS:
here->B3SOIDDsourcePerimeter = value->rValue;
here->B3SOIDDsourcePerimeterGiven = TRUE;
break;
case B3SOIDD_PD:
here->B3SOIDDdrainPerimeter = value->rValue;
here->B3SOIDDdrainPerimeterGiven = TRUE;
break;
case B3SOIDD_NRS:
here->B3SOIDDsourceSquares = value->rValue;
here->B3SOIDDsourceSquaresGiven = TRUE;
break;
case B3SOIDD_NRD:
here->B3SOIDDdrainSquares = value->rValue;
here->B3SOIDDdrainSquaresGiven = TRUE;
break;
case B3SOIDD_OFF:
here->B3SOIDDoff = value->iValue;
break;
case B3SOIDD_IC_VBS:
here->B3SOIDDicVBS = value->rValue;
here->B3SOIDDicVBSGiven = TRUE;
break;
case B3SOIDD_IC_VDS:
here->B3SOIDDicVDS = value->rValue;
here->B3SOIDDicVDSGiven = TRUE;
break;
case B3SOIDD_IC_VGS:
here->B3SOIDDicVGS = value->rValue;
here->B3SOIDDicVGSGiven = TRUE;
break;
case B3SOIDD_IC_VES:
here->B3SOIDDicVES = value->rValue;
here->B3SOIDDicVESGiven = TRUE;
break;
case B3SOIDD_IC_VPS:
here->B3SOIDDicVPS = value->rValue;
here->B3SOIDDicVPSGiven = TRUE;
break;
case B3SOIDD_BJTOFF:
here->B3SOIDDbjtoff = value->iValue;
here->B3SOIDDbjtoffGiven= TRUE;
break;
case B3SOIDD_DEBUG:
here->B3SOIDDdebugMod = value->iValue;
here->B3SOIDDdebugModGiven= TRUE;
break;
case B3SOIDD_RTH0:
here->B3SOIDDrth0= value->rValue;
here->B3SOIDDrth0Given = TRUE;
break;
case B3SOIDD_CTH0:
here->B3SOIDDcth0= value->rValue;
here->B3SOIDDcth0Given = TRUE;
break;
case B3SOIDD_NRB:
here->B3SOIDDbodySquares = value->rValue;
here->B3SOIDDbodySquaresGiven = TRUE;
break;
case B3SOIDD_IC:
switch(value->v.numValue){
case 5:
here->B3SOIDDicVPS = *(value->v.vec.rVec+4);
here->B3SOIDDicVPSGiven = TRUE;
case 4:
here->B3SOIDDicVES = *(value->v.vec.rVec+3);
here->B3SOIDDicVESGiven = TRUE;
case 3:
here->B3SOIDDicVBS = *(value->v.vec.rVec+2);
here->B3SOIDDicVBSGiven = TRUE;
case 2:
here->B3SOIDDicVGS = *(value->v.vec.rVec+1);
here->B3SOIDDicVGSGiven = TRUE;
case 1:
here->B3SOIDDicVDS = *(value->v.vec.rVec);
here->B3SOIDDicVDSGiven = TRUE;
break;
default:
return(E_BADPARM);
}
break;
default:
return(E_BADPARM);
}
return(OK);
}

View File

@ -0,0 +1,153 @@
/**********
Copyright 1999 Regents of the University of California. All rights reserved.
Author: Weidong Liu and Pin Su Feb 1999
Author: 1998 Samuel Fung, Dennis Sinitsky and Stephen Tang
File: b3soiddpzld.c 98/5/01
**********/
#include "ngspice.h"
#include <stdio.h>
#include "cktdefs.h"
#include "complex.h"
#include "sperror.h"
#include "b3soidddef.h"
#include "suffix.h"
int
B3SOIDDpzLoad(inModel,ckt,s)
GENmodel *inModel;
register CKTcircuit *ckt;
register SPcomplex *s;
{
register B3SOIDDmodel *model = (B3SOIDDmodel*)inModel;
register B3SOIDDinstance *here;
double xcggb, xcgdb, xcgsb, xcbgb, xcbdb, xcbsb, xcddb, xcssb, xcdgb;
double gdpr, gspr, gds, gbd, gbs, capbd, capbs, xcsgb, xcdsb, xcsdb;
double cggb, cgdb, cgsb, cbgb, cbdb, cbsb, cddb, cdgb, cdsb;
double GSoverlapCap, GDoverlapCap, GBoverlapCap;
double FwdSum, RevSum, Gm, Gmbs;
for (; model != NULL; model = model->B3SOIDDnextModel)
{ for (here = model->B3SOIDDinstances; here!= NULL;
here = here->B3SOIDDnextInstance)
{
if (here->B3SOIDDmode >= 0)
{ Gm = here->B3SOIDDgm;
Gmbs = here->B3SOIDDgmbs;
FwdSum = Gm + Gmbs;
RevSum = 0.0;
cggb = here->B3SOIDDcggb;
cgsb = here->B3SOIDDcgsb;
cgdb = here->B3SOIDDcgdb;
cbgb = here->B3SOIDDcbgb;
cbsb = here->B3SOIDDcbsb;
cbdb = here->B3SOIDDcbdb;
cdgb = here->B3SOIDDcdgb;
cdsb = here->B3SOIDDcdsb;
cddb = here->B3SOIDDcddb;
}
else
{ Gm = -here->B3SOIDDgm;
Gmbs = -here->B3SOIDDgmbs;
FwdSum = 0.0;
RevSum = -Gm - Gmbs;
cggb = here->B3SOIDDcggb;
cgsb = here->B3SOIDDcgdb;
cgdb = here->B3SOIDDcgsb;
cbgb = here->B3SOIDDcbgb;
cbsb = here->B3SOIDDcbdb;
cbdb = here->B3SOIDDcbsb;
cdgb = -(here->B3SOIDDcdgb + cggb + cbgb);
cdsb = -(here->B3SOIDDcddb + cgsb + cbsb);
cddb = -(here->B3SOIDDcdsb + cgdb + cbdb);
}
gdpr=here->B3SOIDDdrainConductance;
gspr=here->B3SOIDDsourceConductance;
gds= here->B3SOIDDgds;
gbd= here->B3SOIDDgjdb;
gbs= here->B3SOIDDgjsb;
#ifdef BULKCODE
capbd= here->B3SOIDDcapbd;
capbs= here->B3SOIDDcapbs;
#endif
GSoverlapCap = here->B3SOIDDcgso;
GDoverlapCap = here->B3SOIDDcgdo;
#ifdef BULKCODE
GBoverlapCap = here->pParam->B3SOIDDcgbo;
#endif
xcdgb = (cdgb - GDoverlapCap);
xcddb = (cddb + capbd + GDoverlapCap);
xcdsb = cdsb;
xcsgb = -(cggb + cbgb + cdgb + GSoverlapCap);
xcsdb = -(cgdb + cbdb + cddb);
xcssb = (capbs + GSoverlapCap - (cgsb+cbsb+cdsb));
xcggb = (cggb + GDoverlapCap + GSoverlapCap + GBoverlapCap);
xcgdb = (cgdb - GDoverlapCap);
xcgsb = (cgsb - GSoverlapCap);
xcbgb = (cbgb - GBoverlapCap);
xcbdb = (cbdb - capbd);
xcbsb = (cbsb - capbs);
*(here->B3SOIDDGgPtr ) += xcggb * s->real;
*(here->B3SOIDDGgPtr +1) += xcggb * s->imag;
*(here->B3SOIDDBbPtr ) += (-xcbgb-xcbdb-xcbsb) * s->real;
*(here->B3SOIDDBbPtr +1) += (-xcbgb-xcbdb-xcbsb) * s->imag;
*(here->B3SOIDDDPdpPtr ) += xcddb * s->real;
*(here->B3SOIDDDPdpPtr +1) += xcddb * s->imag;
*(here->B3SOIDDSPspPtr ) += xcssb * s->real;
*(here->B3SOIDDSPspPtr +1) += xcssb * s->imag;
*(here->B3SOIDDGbPtr ) += (-xcggb-xcgdb-xcgsb) * s->real;
*(here->B3SOIDDGbPtr +1) += (-xcggb-xcgdb-xcgsb) * s->imag;
*(here->B3SOIDDGdpPtr ) += xcgdb * s->real;
*(here->B3SOIDDGdpPtr +1) += xcgdb * s->imag;
*(here->B3SOIDDGspPtr ) += xcgsb * s->real;
*(here->B3SOIDDGspPtr +1) += xcgsb * s->imag;
*(here->B3SOIDDBgPtr ) += xcbgb * s->real;
*(here->B3SOIDDBgPtr +1) += xcbgb * s->imag;
*(here->B3SOIDDBdpPtr ) += xcbdb * s->real;
*(here->B3SOIDDBdpPtr +1) += xcbdb * s->imag;
*(here->B3SOIDDBspPtr ) += xcbsb * s->real;
*(here->B3SOIDDBspPtr +1) += xcbsb * s->imag;
*(here->B3SOIDDDPgPtr ) += xcdgb * s->real;
*(here->B3SOIDDDPgPtr +1) += xcdgb * s->imag;
*(here->B3SOIDDDPbPtr ) += (-xcdgb-xcddb-xcdsb) * s->real;
*(here->B3SOIDDDPbPtr +1) += (-xcdgb-xcddb-xcdsb) * s->imag;
*(here->B3SOIDDDPspPtr ) += xcdsb * s->real;
*(here->B3SOIDDDPspPtr +1) += xcdsb * s->imag;
*(here->B3SOIDDSPgPtr ) += xcsgb * s->real;
*(here->B3SOIDDSPgPtr +1) += xcsgb * s->imag;
*(here->B3SOIDDSPbPtr ) += (-xcsgb-xcsdb-xcssb) * s->real;
*(here->B3SOIDDSPbPtr +1) += (-xcsgb-xcsdb-xcssb) * s->imag;
*(here->B3SOIDDSPdpPtr ) += xcsdb * s->real;
*(here->B3SOIDDSPdpPtr +1) += xcsdb * s->imag;
*(here->B3SOIDDDdPtr) += gdpr;
*(here->B3SOIDDSsPtr) += gspr;
*(here->B3SOIDDBbPtr) += gbd+gbs;
*(here->B3SOIDDDPdpPtr) += gdpr+gds+gbd+RevSum;
*(here->B3SOIDDSPspPtr) += gspr+gds+gbs+FwdSum;
*(here->B3SOIDDDdpPtr) -= gdpr;
*(here->B3SOIDDSspPtr) -= gspr;
*(here->B3SOIDDBdpPtr) -= gbd;
*(here->B3SOIDDBspPtr) -= gbs;
*(here->B3SOIDDDPdPtr) -= gdpr;
*(here->B3SOIDDDPgPtr) += Gm;
*(here->B3SOIDDDPbPtr) -= gbd - Gmbs;
*(here->B3SOIDDDPspPtr) -= gds + FwdSum;
*(here->B3SOIDDSPgPtr) -= Gm;
*(here->B3SOIDDSPsPtr) -= gspr;
*(here->B3SOIDDSPbPtr) -= gbs + Gmbs;
*(here->B3SOIDDSPdpPtr) -= gds + RevSum;
}
}
return(OK);
}

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,816 @@
/**********
Copyright 1999 Regents of the University of California. All rights reserved.
Author: Weidong Liu and Pin Su Feb 1999
Author: 1998 Samuel Fung, Dennis Sinitsky and Stephen Tang
Modified by Pin Su, Wei Jin 99/9/27
File: b3soiddtemp.c 98/5/01
**********/
/* Lmin, Lmax, Wmin, Wmax */
#include "ngspice.h"
#include <stdio.h>
#include <math.h>
#include "smpdefs.h"
#include "cktdefs.h"
#include "b3soidddef.h"
#include "const.h"
#include "sperror.h"
#include "suffix.h"
#define Kb 1.3806226e-23
#define KboQ 8.617087e-5 /* Kb / q where q = 1.60219e-19 */
#define EPSOX 3.453133e-11
#define EPSSI 1.03594e-10
#define PI 3.141592654
#define MAX_EXP 5.834617425e14
#define MIN_EXP 1.713908431e-15
#define EXP_THRESHOLD 34.0
#define Charge_q 1.60219e-19
/* ARGSUSED */
int
B3SOIDDtemp(inModel,ckt)
GENmodel *inModel;
CKTcircuit *ckt;
{
register B3SOIDDmodel *model = (B3SOIDDmodel*) inModel;
register B3SOIDDinstance *here;
struct b3soiddSizeDependParam *pSizeDependParamKnot, *pLastKnot, *pParam;
double tmp, tmp1, tmp2, Eg, Eg0, ni, T0, T1, T2, T3, T4, T5, T6, Ldrn, Wdrn;
double Temp, TRatio, Inv_L, Inv_W, Inv_LW, Dw, Dl, Vtm0, Tnom;
double SDphi, SDgamma;
int Size_Not_Found;
/* loop through all the B3SOIDD device models */
for (; model != NULL; model = model->B3SOIDDnextModel)
{ Temp = ckt->CKTtemp;
if (model->B3SOIDDGatesidewallJctPotential < 0.1)
model->B3SOIDDGatesidewallJctPotential = 0.1;
model->pSizeDependParamKnot = NULL;
pLastKnot = NULL;
Tnom = model->B3SOIDDtnom;
TRatio = Temp / Tnom;
model->B3SOIDDvcrit = CONSTvt0 * log(CONSTvt0 / (CONSTroot2 * 1.0e-14));
model->B3SOIDDfactor1 = sqrt(EPSSI / EPSOX * model->B3SOIDDtox);
Vtm0 = KboQ * Tnom;
Eg0 = 1.16 - 7.02e-4 * Tnom * Tnom / (Tnom + 1108.0);
model->B3SOIDDeg0 = Eg0;
model->B3SOIDDvtm = 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->B3SOIDDvtm));
/* loop through all the instances of the model */
/* MCJ: Length and Width not initialized */
for (here = model->B3SOIDDinstances; here != NULL;
here = here->B3SOIDDnextInstance)
{
here->B3SOIDDrbodyext = here->B3SOIDDbodySquares *
model->B3SOIDDrbsh;
pSizeDependParamKnot = model->pSizeDependParamKnot;
Size_Not_Found = 1;
while ((pSizeDependParamKnot != NULL) && Size_Not_Found)
{ if ((here->B3SOIDDl == pSizeDependParamKnot->Length)
&& (here->B3SOIDDw == pSizeDependParamKnot->Width)
&& (here->B3SOIDDrth0 == pSizeDependParamKnot->Rth0)
&& (here->B3SOIDDcth0 == pSizeDependParamKnot->Cth0))
{ Size_Not_Found = 0;
here->pParam = pSizeDependParamKnot;
}
else
{ pLastKnot = pSizeDependParamKnot;
pSizeDependParamKnot = pSizeDependParamKnot->pNext;
}
}
if (Size_Not_Found)
{ pParam = (struct b3soiddSizeDependParam *)malloc(
sizeof(struct b3soiddSizeDependParam));
if (pLastKnot == NULL)
model->pSizeDependParamKnot = pParam;
else
pLastKnot->pNext = pParam;
pParam->pNext = NULL;
here->pParam = pParam;
Ldrn = here->B3SOIDDl;
Wdrn = here->B3SOIDDw;
pParam->Length = Ldrn;
pParam->Width = Wdrn;
pParam->Rth0 = here->B3SOIDDrth0;
pParam->Cth0 = here->B3SOIDDcth0;
T0 = pow(Ldrn, model->B3SOIDDLln);
T1 = pow(Wdrn, model->B3SOIDDLwn);
tmp1 = model->B3SOIDDLl / T0 + model->B3SOIDDLw / T1
+ model->B3SOIDDLwl / (T0 * T1);
pParam->B3SOIDDdl = model->B3SOIDDLint + tmp1;
pParam->B3SOIDDdlc = model->B3SOIDDdlc + tmp1;
T2 = pow(Ldrn, model->B3SOIDDWln);
T3 = pow(Wdrn, model->B3SOIDDWwn);
tmp2 = model->B3SOIDDWl / T2 + model->B3SOIDDWw / T3
+ model->B3SOIDDWwl / (T2 * T3);
pParam->B3SOIDDdw = model->B3SOIDDWint + tmp2;
pParam->B3SOIDDdwc = model->B3SOIDDdwc + tmp2;
pParam->B3SOIDDleff = here->B3SOIDDl - 2.0 * pParam->B3SOIDDdl;
if (pParam->B3SOIDDleff <= 0.0)
{ IFuid namarray[2];
namarray[0] = model->B3SOIDDmodName;
namarray[1] = here->B3SOIDDname;
(*(SPfrontEnd->IFerror))(ERR_FATAL,
"B3SOIDD: mosfet %s, model %s: Effective channel length <= 0",
namarray);
return(E_BADPARM);
}
pParam->B3SOIDDweff = here->B3SOIDDw - 2.0 * pParam->B3SOIDDdw;
if (pParam->B3SOIDDweff <= 0.0)
{ IFuid namarray[2];
namarray[0] = model->B3SOIDDmodName;
namarray[1] = here->B3SOIDDname;
(*(SPfrontEnd->IFerror))(ERR_FATAL,
"B3SOIDD: mosfet %s, model %s: Effective channel width <= 0",
namarray);
return(E_BADPARM);
}
pParam->B3SOIDDleffCV = here->B3SOIDDl - 2.0 * pParam->B3SOIDDdlc;
if (pParam->B3SOIDDleffCV <= 0.0)
{ IFuid namarray[2];
namarray[0] = model->B3SOIDDmodName;
namarray[1] = here->B3SOIDDname;
(*(SPfrontEnd->IFerror))(ERR_FATAL,
"B3SOIDD: mosfet %s, model %s: Effective channel length for C-V <= 0",
namarray);
return(E_BADPARM);
}
pParam->B3SOIDDweffCV = here->B3SOIDDw - 2.0 * pParam->B3SOIDDdwc;
if (pParam->B3SOIDDweffCV <= 0.0)
{ IFuid namarray[2];
namarray[0] = model->B3SOIDDmodName;
namarray[1] = here->B3SOIDDname;
(*(SPfrontEnd->IFerror))(ERR_FATAL,
"B3SOIDD: mosfet %s, model %s: Effective channel width for C-V <= 0",
namarray);
return(E_BADPARM);
}
/* Not binned - START */
pParam->B3SOIDDat = model->B3SOIDDat;
pParam->B3SOIDDgamma1 = model->B3SOIDDgamma1;
pParam->B3SOIDDgamma2 = model->B3SOIDDgamma2;
pParam->B3SOIDDvbx = model->B3SOIDDvbx;
pParam->B3SOIDDvbm = model->B3SOIDDvbm;
pParam->B3SOIDDxt = model->B3SOIDDxt;
pParam->B3SOIDDkt1 = model->B3SOIDDkt1;
pParam->B3SOIDDkt1l = model->B3SOIDDkt1l;
pParam->B3SOIDDkt2 = model->B3SOIDDkt2;
pParam->B3SOIDDua1 = model->B3SOIDDua1;
pParam->B3SOIDDub1 = model->B3SOIDDub1;
pParam->B3SOIDDuc1 = model->B3SOIDDuc1;
pParam->B3SOIDDute = model->B3SOIDDute;
pParam->B3SOIDDprt = model->B3SOIDDprt;
/* Not binned - END */
/* CV model */
pParam->B3SOIDDcgsl = model->B3SOIDDcgsl;
pParam->B3SOIDDcgdl = model->B3SOIDDcgdl;
pParam->B3SOIDDckappa = model->B3SOIDDckappa;
pParam->B3SOIDDcf = model->B3SOIDDcf;
pParam->B3SOIDDclc = model->B3SOIDDclc;
pParam->B3SOIDDcle = model->B3SOIDDcle;
pParam->B3SOIDDabulkCVfactor = pow(1.0+(pParam->B3SOIDDclc
/ pParam->B3SOIDDleff),
pParam->B3SOIDDcle);
/* Added for binning - START */
if (model->B3SOIDDbinUnit == 1)
{ Inv_L = 1.0e-6 / pParam->B3SOIDDleff;
Inv_W = 1.0e-6 / pParam->B3SOIDDweff;
Inv_LW = 1.0e-12 / (pParam->B3SOIDDleff
* pParam->B3SOIDDweff);
}
else
{ Inv_L = 1.0 / pParam->B3SOIDDleff;
Inv_W = 1.0 / pParam->B3SOIDDweff;
Inv_LW = 1.0 / (pParam->B3SOIDDleff
* pParam->B3SOIDDweff);
}
pParam->B3SOIDDnpeak = model->B3SOIDDnpeak
+ model->B3SOIDDlnpeak * Inv_L
+ model->B3SOIDDwnpeak * Inv_W
+ model->B3SOIDDpnpeak * Inv_LW;
pParam->B3SOIDDnsub = model->B3SOIDDnsub
+ model->B3SOIDDlnsub * Inv_L
+ model->B3SOIDDwnsub * Inv_W
+ model->B3SOIDDpnsub * Inv_LW;
pParam->B3SOIDDngate = model->B3SOIDDngate
+ model->B3SOIDDlngate * Inv_L
+ model->B3SOIDDwngate * Inv_W
+ model->B3SOIDDpngate * Inv_LW;
pParam->B3SOIDDvth0 = model->B3SOIDDvth0
+ model->B3SOIDDlvth0 * Inv_L
+ model->B3SOIDDwvth0 * Inv_W
+ model->B3SOIDDpvth0 * Inv_LW;
pParam->B3SOIDDk1 = model->B3SOIDDk1
+ model->B3SOIDDlk1 * Inv_L
+ model->B3SOIDDwk1 * Inv_W
+ model->B3SOIDDpk1 * Inv_LW;
pParam->B3SOIDDk2 = model->B3SOIDDk2
+ model->B3SOIDDlk2 * Inv_L
+ model->B3SOIDDwk2 * Inv_W
+ model->B3SOIDDpk2 * Inv_LW;
pParam->B3SOIDDk3 = model->B3SOIDDk3
+ model->B3SOIDDlk3 * Inv_L
+ model->B3SOIDDwk3 * Inv_W
+ model->B3SOIDDpk3 * Inv_LW;
pParam->B3SOIDDk3b = model->B3SOIDDk3b
+ model->B3SOIDDlk3b * Inv_L
+ model->B3SOIDDwk3b * Inv_W
+ model->B3SOIDDpk3b * Inv_LW;
pParam->B3SOIDDvbsa = model->B3SOIDDvbsa
+ model->B3SOIDDlvbsa * Inv_L
+ model->B3SOIDDwvbsa * Inv_W
+ model->B3SOIDDpvbsa * Inv_LW;
pParam->B3SOIDDdelp = model->B3SOIDDdelp
+ model->B3SOIDDldelp * Inv_L
+ model->B3SOIDDwdelp * Inv_W
+ model->B3SOIDDpdelp * Inv_LW;
pParam->B3SOIDDkb1 = model->B3SOIDDkb1
+ model->B3SOIDDlkb1 * Inv_L
+ model->B3SOIDDwkb1 * Inv_W
+ model->B3SOIDDpkb1 * Inv_LW;
pParam->B3SOIDDkb3 = model->B3SOIDDkb3
+ model->B3SOIDDlkb3 * Inv_L
+ model->B3SOIDDwkb3 * Inv_W
+ model->B3SOIDDpkb3 * Inv_LW;
pParam->B3SOIDDdvbd0 = model->B3SOIDDdvbd0
+ model->B3SOIDDldvbd0 * Inv_L
+ model->B3SOIDDwdvbd0 * Inv_W
+ model->B3SOIDDpdvbd0 * Inv_LW;
pParam->B3SOIDDdvbd1 = model->B3SOIDDdvbd1
+ model->B3SOIDDldvbd1 * Inv_L
+ model->B3SOIDDwdvbd1 * Inv_W
+ model->B3SOIDDpdvbd1 * Inv_LW;
pParam->B3SOIDDw0 = model->B3SOIDDw0
+ model->B3SOIDDlw0 * Inv_L
+ model->B3SOIDDww0 * Inv_W
+ model->B3SOIDDpw0 * Inv_LW;
pParam->B3SOIDDnlx = model->B3SOIDDnlx
+ model->B3SOIDDlnlx * Inv_L
+ model->B3SOIDDwnlx * Inv_W
+ model->B3SOIDDpnlx * Inv_LW;
pParam->B3SOIDDdvt0 = model->B3SOIDDdvt0
+ model->B3SOIDDldvt0 * Inv_L
+ model->B3SOIDDwdvt0 * Inv_W
+ model->B3SOIDDpdvt0 * Inv_LW;
pParam->B3SOIDDdvt1 = model->B3SOIDDdvt1
+ model->B3SOIDDldvt1 * Inv_L
+ model->B3SOIDDwdvt1 * Inv_W
+ model->B3SOIDDpdvt1 * Inv_LW;
pParam->B3SOIDDdvt2 = model->B3SOIDDdvt2
+ model->B3SOIDDldvt2 * Inv_L
+ model->B3SOIDDwdvt2 * Inv_W
+ model->B3SOIDDpdvt2 * Inv_LW;
pParam->B3SOIDDdvt0w = model->B3SOIDDdvt0w
+ model->B3SOIDDldvt0w * Inv_L
+ model->B3SOIDDwdvt0w * Inv_W
+ model->B3SOIDDpdvt0w * Inv_LW;
pParam->B3SOIDDdvt1w = model->B3SOIDDdvt1w
+ model->B3SOIDDldvt1w * Inv_L
+ model->B3SOIDDwdvt1w * Inv_W
+ model->B3SOIDDpdvt1w * Inv_LW;
pParam->B3SOIDDdvt2w = model->B3SOIDDdvt2w
+ model->B3SOIDDldvt2w * Inv_L
+ model->B3SOIDDwdvt2w * Inv_W
+ model->B3SOIDDpdvt2w * Inv_LW;
pParam->B3SOIDDu0 = model->B3SOIDDu0
+ model->B3SOIDDlu0 * Inv_L
+ model->B3SOIDDwu0 * Inv_W
+ model->B3SOIDDpu0 * Inv_LW;
pParam->B3SOIDDua = model->B3SOIDDua
+ model->B3SOIDDlua * Inv_L
+ model->B3SOIDDwua * Inv_W
+ model->B3SOIDDpua * Inv_LW;
pParam->B3SOIDDub = model->B3SOIDDub
+ model->B3SOIDDlub * Inv_L
+ model->B3SOIDDwub * Inv_W
+ model->B3SOIDDpub * Inv_LW;
pParam->B3SOIDDuc = model->B3SOIDDuc
+ model->B3SOIDDluc * Inv_L
+ model->B3SOIDDwuc * Inv_W
+ model->B3SOIDDpuc * Inv_LW;
pParam->B3SOIDDvsat = model->B3SOIDDvsat
+ model->B3SOIDDlvsat * Inv_L
+ model->B3SOIDDwvsat * Inv_W
+ model->B3SOIDDpvsat * Inv_LW;
pParam->B3SOIDDa0 = model->B3SOIDDa0
+ model->B3SOIDDla0 * Inv_L
+ model->B3SOIDDwa0 * Inv_W
+ model->B3SOIDDpa0 * Inv_LW;
pParam->B3SOIDDags = model->B3SOIDDags
+ model->B3SOIDDlags * Inv_L
+ model->B3SOIDDwags * Inv_W
+ model->B3SOIDDpags * Inv_LW;
pParam->B3SOIDDb0 = model->B3SOIDDb0
+ model->B3SOIDDlb0 * Inv_L
+ model->B3SOIDDwb0 * Inv_W
+ model->B3SOIDDpb0 * Inv_LW;
pParam->B3SOIDDb1 = model->B3SOIDDb1
+ model->B3SOIDDlb1 * Inv_L
+ model->B3SOIDDwb1 * Inv_W
+ model->B3SOIDDpb1 * Inv_LW;
pParam->B3SOIDDketa = model->B3SOIDDketa
+ model->B3SOIDDlketa * Inv_L
+ model->B3SOIDDwketa * Inv_W
+ model->B3SOIDDpketa * Inv_LW;
pParam->B3SOIDDabp = model->B3SOIDDabp
+ model->B3SOIDDlabp * Inv_L
+ model->B3SOIDDwabp * Inv_W
+ model->B3SOIDDpabp * Inv_LW;
pParam->B3SOIDDmxc = model->B3SOIDDmxc
+ model->B3SOIDDlmxc * Inv_L
+ model->B3SOIDDwmxc * Inv_W
+ model->B3SOIDDpmxc * Inv_LW;
pParam->B3SOIDDadice0 = model->B3SOIDDadice0
+ model->B3SOIDDladice0 * Inv_L
+ model->B3SOIDDwadice0 * Inv_W
+ model->B3SOIDDpadice0 * Inv_LW;
pParam->B3SOIDDa1 = model->B3SOIDDa1
+ model->B3SOIDDla1 * Inv_L
+ model->B3SOIDDwa1 * Inv_W
+ model->B3SOIDDpa1 * Inv_LW;
pParam->B3SOIDDa2 = model->B3SOIDDa2
+ model->B3SOIDDla2 * Inv_L
+ model->B3SOIDDwa2 * Inv_W
+ model->B3SOIDDpa2 * Inv_LW;
pParam->B3SOIDDrdsw = model->B3SOIDDrdsw
+ model->B3SOIDDlrdsw * Inv_L
+ model->B3SOIDDwrdsw * Inv_W
+ model->B3SOIDDprdsw * Inv_LW;
pParam->B3SOIDDprwb = model->B3SOIDDprwb
+ model->B3SOIDDlprwb * Inv_L
+ model->B3SOIDDwprwb * Inv_W
+ model->B3SOIDDpprwb * Inv_LW;
pParam->B3SOIDDprwg = model->B3SOIDDprwg
+ model->B3SOIDDlprwg * Inv_L
+ model->B3SOIDDwprwg * Inv_W
+ model->B3SOIDDpprwg * Inv_LW;
pParam->B3SOIDDwr = model->B3SOIDDwr
+ model->B3SOIDDlwr * Inv_L
+ model->B3SOIDDwwr * Inv_W
+ model->B3SOIDDpwr * Inv_LW;
pParam->B3SOIDDnfactor = model->B3SOIDDnfactor
+ model->B3SOIDDlnfactor * Inv_L
+ model->B3SOIDDwnfactor * Inv_W
+ model->B3SOIDDpnfactor * Inv_LW;
pParam->B3SOIDDdwg = model->B3SOIDDdwg
+ model->B3SOIDDldwg * Inv_L
+ model->B3SOIDDwdwg * Inv_W
+ model->B3SOIDDpdwg * Inv_LW;
pParam->B3SOIDDdwb = model->B3SOIDDdwb
+ model->B3SOIDDldwb * Inv_L
+ model->B3SOIDDwdwb * Inv_W
+ model->B3SOIDDpdwb * Inv_LW;
pParam->B3SOIDDvoff = model->B3SOIDDvoff
+ model->B3SOIDDlvoff * Inv_L
+ model->B3SOIDDwvoff * Inv_W
+ model->B3SOIDDpvoff * Inv_LW;
pParam->B3SOIDDeta0 = model->B3SOIDDeta0
+ model->B3SOIDDleta0 * Inv_L
+ model->B3SOIDDweta0 * Inv_W
+ model->B3SOIDDpeta0 * Inv_LW;
pParam->B3SOIDDetab = model->B3SOIDDetab
+ model->B3SOIDDletab * Inv_L
+ model->B3SOIDDwetab * Inv_W
+ model->B3SOIDDpetab * Inv_LW;
pParam->B3SOIDDdsub = model->B3SOIDDdsub
+ model->B3SOIDDldsub * Inv_L
+ model->B3SOIDDwdsub * Inv_W
+ model->B3SOIDDpdsub * Inv_LW;
pParam->B3SOIDDcit = model->B3SOIDDcit
+ model->B3SOIDDlcit * Inv_L
+ model->B3SOIDDwcit * Inv_W
+ model->B3SOIDDpcit * Inv_LW;
pParam->B3SOIDDcdsc = model->B3SOIDDcdsc
+ model->B3SOIDDlcdsc * Inv_L
+ model->B3SOIDDwcdsc * Inv_W
+ model->B3SOIDDpcdsc * Inv_LW;
pParam->B3SOIDDcdscb = model->B3SOIDDcdscb
+ model->B3SOIDDlcdscb * Inv_L
+ model->B3SOIDDwcdscb * Inv_W
+ model->B3SOIDDpcdscb * Inv_LW;
pParam->B3SOIDDcdscd = model->B3SOIDDcdscd
+ model->B3SOIDDlcdscd * Inv_L
+ model->B3SOIDDwcdscd * Inv_W
+ model->B3SOIDDpcdscd * Inv_LW;
pParam->B3SOIDDpclm = model->B3SOIDDpclm
+ model->B3SOIDDlpclm * Inv_L
+ model->B3SOIDDwpclm * Inv_W
+ model->B3SOIDDppclm * Inv_LW;
pParam->B3SOIDDpdibl1 = model->B3SOIDDpdibl1
+ model->B3SOIDDlpdibl1 * Inv_L
+ model->B3SOIDDwpdibl1 * Inv_W
+ model->B3SOIDDppdibl1 * Inv_LW;
pParam->B3SOIDDpdibl2 = model->B3SOIDDpdibl2
+ model->B3SOIDDlpdibl2 * Inv_L
+ model->B3SOIDDwpdibl2 * Inv_W
+ model->B3SOIDDppdibl2 * Inv_LW;
pParam->B3SOIDDpdiblb = model->B3SOIDDpdiblb
+ model->B3SOIDDlpdiblb * Inv_L
+ model->B3SOIDDwpdiblb * Inv_W
+ model->B3SOIDDppdiblb * Inv_LW;
pParam->B3SOIDDdrout = model->B3SOIDDdrout
+ model->B3SOIDDldrout * Inv_L
+ model->B3SOIDDwdrout * Inv_W
+ model->B3SOIDDpdrout * Inv_LW;
pParam->B3SOIDDpvag = model->B3SOIDDpvag
+ model->B3SOIDDlpvag * Inv_L
+ model->B3SOIDDwpvag * Inv_W
+ model->B3SOIDDppvag * Inv_LW;
pParam->B3SOIDDdelta = model->B3SOIDDdelta
+ model->B3SOIDDldelta * Inv_L
+ model->B3SOIDDwdelta * Inv_W
+ model->B3SOIDDpdelta * Inv_LW;
pParam->B3SOIDDaii = model->B3SOIDDaii
+ model->B3SOIDDlaii * Inv_L
+ model->B3SOIDDwaii * Inv_W
+ model->B3SOIDDpaii * Inv_LW;
pParam->B3SOIDDbii = model->B3SOIDDbii
+ model->B3SOIDDlbii * Inv_L
+ model->B3SOIDDwbii * Inv_W
+ model->B3SOIDDpbii * Inv_LW;
pParam->B3SOIDDcii = model->B3SOIDDcii
+ model->B3SOIDDlcii * Inv_L
+ model->B3SOIDDwcii * Inv_W
+ model->B3SOIDDpcii * Inv_LW;
pParam->B3SOIDDdii = model->B3SOIDDdii
+ model->B3SOIDDldii * Inv_L
+ model->B3SOIDDwdii * Inv_W
+ model->B3SOIDDpdii * Inv_LW;
pParam->B3SOIDDalpha0 = model->B3SOIDDalpha0
+ model->B3SOIDDlalpha0 * Inv_L
+ model->B3SOIDDwalpha0 * Inv_W
+ model->B3SOIDDpalpha0 * Inv_LW;
pParam->B3SOIDDalpha1 = model->B3SOIDDalpha1
+ model->B3SOIDDlalpha1 * Inv_L
+ model->B3SOIDDwalpha1 * Inv_W
+ model->B3SOIDDpalpha1 * Inv_LW;
pParam->B3SOIDDbeta0 = model->B3SOIDDbeta0
+ model->B3SOIDDlbeta0 * Inv_L
+ model->B3SOIDDwbeta0 * Inv_W
+ model->B3SOIDDpbeta0 * Inv_LW;
pParam->B3SOIDDagidl = model->B3SOIDDagidl
+ model->B3SOIDDlagidl * Inv_L
+ model->B3SOIDDwagidl * Inv_W
+ model->B3SOIDDpagidl * Inv_LW;
pParam->B3SOIDDbgidl = model->B3SOIDDbgidl
+ model->B3SOIDDlbgidl * Inv_L
+ model->B3SOIDDwbgidl * Inv_W
+ model->B3SOIDDpbgidl * Inv_LW;
pParam->B3SOIDDngidl = model->B3SOIDDngidl
+ model->B3SOIDDlngidl * Inv_L
+ model->B3SOIDDwngidl * Inv_W
+ model->B3SOIDDpngidl * Inv_LW;
pParam->B3SOIDDntun = model->B3SOIDDntun
+ model->B3SOIDDlntun * Inv_L
+ model->B3SOIDDwntun * Inv_W
+ model->B3SOIDDpntun * Inv_LW;
pParam->B3SOIDDndiode = model->B3SOIDDndiode
+ model->B3SOIDDlndiode * Inv_L
+ model->B3SOIDDwndiode * Inv_W
+ model->B3SOIDDpndiode * Inv_LW;
pParam->B3SOIDDisbjt = model->B3SOIDDisbjt
+ model->B3SOIDDlisbjt * Inv_L
+ model->B3SOIDDwisbjt * Inv_W
+ model->B3SOIDDpisbjt * Inv_LW;
pParam->B3SOIDDisdif = model->B3SOIDDisdif
+ model->B3SOIDDlisdif * Inv_L
+ model->B3SOIDDwisdif * Inv_W
+ model->B3SOIDDpisdif * Inv_LW;
pParam->B3SOIDDisrec = model->B3SOIDDisrec
+ model->B3SOIDDlisrec * Inv_L
+ model->B3SOIDDwisrec * Inv_W
+ model->B3SOIDDpisrec * Inv_LW;
pParam->B3SOIDDistun = model->B3SOIDDistun
+ model->B3SOIDDlistun * Inv_L
+ model->B3SOIDDwistun * Inv_W
+ model->B3SOIDDpistun * Inv_LW;
pParam->B3SOIDDedl = model->B3SOIDDedl
+ model->B3SOIDDledl * Inv_L
+ model->B3SOIDDwedl * Inv_W
+ model->B3SOIDDpedl * Inv_LW;
pParam->B3SOIDDkbjt1 = model->B3SOIDDkbjt1
+ model->B3SOIDDlkbjt1 * Inv_L
+ model->B3SOIDDwkbjt1 * Inv_W
+ model->B3SOIDDpkbjt1 * Inv_LW;
/* CV model */
pParam->B3SOIDDvsdfb = model->B3SOIDDvsdfb
+ model->B3SOIDDlvsdfb * Inv_L
+ model->B3SOIDDwvsdfb * Inv_W
+ model->B3SOIDDpvsdfb * Inv_LW;
pParam->B3SOIDDvsdth = model->B3SOIDDvsdth
+ model->B3SOIDDlvsdth * Inv_L
+ model->B3SOIDDwvsdth * Inv_W
+ model->B3SOIDDpvsdth * Inv_LW;
/* Added for binning - END */
T0 = (TRatio - 1.0);
pParam->B3SOIDDuatemp = pParam->B3SOIDDua; /* save ua, ub, and uc for b3soild.c */
pParam->B3SOIDDubtemp = pParam->B3SOIDDub;
pParam->B3SOIDDuctemp = pParam->B3SOIDDuc;
pParam->B3SOIDDrds0denom = pow(pParam->B3SOIDDweff * 1E6, pParam->B3SOIDDwr);
pParam->B3SOIDDrth = here->B3SOIDDrth0 * sqrt(model->B3SOIDDtbox
/ model->B3SOIDDtsi) / pParam->B3SOIDDweff;
pParam->B3SOIDDcth = here->B3SOIDDcth0 * model->B3SOIDDtsi;
pParam->B3SOIDDrbody = model->B3SOIDDrbody *
pParam->B3SOIDDweff / pParam->B3SOIDDleff;
pParam->B3SOIDDua = pParam->B3SOIDDua + pParam->B3SOIDDua1 * T0;
pParam->B3SOIDDub = pParam->B3SOIDDub + pParam->B3SOIDDub1 * T0;
pParam->B3SOIDDuc = pParam->B3SOIDDuc + pParam->B3SOIDDuc1 * T0;
if (pParam->B3SOIDDu0 > 1.0)
pParam->B3SOIDDu0 = pParam->B3SOIDDu0 / 1.0e4;
pParam->B3SOIDDu0temp = pParam->B3SOIDDu0
* pow(TRatio, pParam->B3SOIDDute);
pParam->B3SOIDDvsattemp = pParam->B3SOIDDvsat - pParam->B3SOIDDat
* T0;
pParam->B3SOIDDrds0 = (pParam->B3SOIDDrdsw + pParam->B3SOIDDprt * T0)
/ pow(pParam->B3SOIDDweff * 1E6, pParam->B3SOIDDwr);
if (B3SOIDDcheckModel(model, here, ckt))
{ IFuid namarray[2];
namarray[0] = model->B3SOIDDmodName;
namarray[1] = here->B3SOIDDname;
(*(SPfrontEnd->IFerror)) (ERR_FATAL, "Fatal error(s) detected during B3SOIDDV3 parameter checking for %s in model %s", namarray);
return(E_BADPARM);
}
pParam->B3SOIDDcgdo = (model->B3SOIDDcgdo + pParam->B3SOIDDcf)
* pParam->B3SOIDDweffCV;
pParam->B3SOIDDcgso = (model->B3SOIDDcgso + pParam->B3SOIDDcf)
* pParam->B3SOIDDweffCV;
pParam->B3SOIDDcgeo = model->B3SOIDDcgeo
* pParam->B3SOIDDleffCV;
if (!model->B3SOIDDnpeakGiven && model->B3SOIDDgamma1Given)
{ T0 = pParam->B3SOIDDgamma1 * model->B3SOIDDcox;
pParam->B3SOIDDnpeak = 3.021E22 * T0 * T0;
}
T0 = pow(TRatio, model->B3SOIDDxbjt / pParam->B3SOIDDndiode);
T1 = pow(TRatio, model->B3SOIDDxdif / pParam->B3SOIDDndiode);
T2 = pow(TRatio, model->B3SOIDDxrec / pParam->B3SOIDDndiode / 2);
T4 = -Eg0 / pParam->B3SOIDDndiode / model->B3SOIDDvtm * (1 - TRatio);
T5 = exp(T4);
T6 = sqrt(T5);
pParam->B3SOIDDjbjt = pParam->B3SOIDDisbjt * T0 * T5;
pParam->B3SOIDDjdif = pParam->B3SOIDDisdif * T1 * T5;
pParam->B3SOIDDjrec = pParam->B3SOIDDisrec * T2 * T6;
T0 = pow(TRatio, model->B3SOIDDxtun / pParam->B3SOIDDntun);
pParam->B3SOIDDjtun = pParam->B3SOIDDistun * T0 ;
if (pParam->B3SOIDDnsub > 0)
pParam->B3SOIDDvfbb = -model->B3SOIDDtype * model->B3SOIDDvtm *
log(pParam->B3SOIDDnpeak/ pParam->B3SOIDDnsub);
else
pParam->B3SOIDDvfbb = -model->B3SOIDDtype * model->B3SOIDDvtm *
log(-pParam->B3SOIDDnpeak* pParam->B3SOIDDnsub/ni/ni);
if (!model->B3SOIDDvsdfbGiven)
{
if (pParam->B3SOIDDnsub > 0)
pParam->B3SOIDDvsdfb = -model->B3SOIDDtype * (model->B3SOIDDvtm*log(1e20 *
pParam->B3SOIDDnsub / ni /ni) - 0.3);
else if (pParam->B3SOIDDnsub < 0)
pParam->B3SOIDDvsdfb = -model->B3SOIDDtype * (model->B3SOIDDvtm*log(-1e20 /
pParam->B3SOIDDnsub) + 0.3);
}
/* Phi & Gamma */
SDphi = 2.0*model->B3SOIDDvtm*log(fabs(pParam->B3SOIDDnsub) / ni);
SDgamma = 5.753e-12 * sqrt(fabs(pParam->B3SOIDDnsub)) / model->B3SOIDDcbox;
if (!model->B3SOIDDvsdthGiven)
{
if ( ((pParam->B3SOIDDnsub > 0) && (model->B3SOIDDtype > 0)) ||
((pParam->B3SOIDDnsub < 0) && (model->B3SOIDDtype < 0)) )
pParam->B3SOIDDvsdth = pParam->B3SOIDDvsdfb + SDphi +
SDgamma * sqrt(SDphi);
else
pParam->B3SOIDDvsdth = pParam->B3SOIDDvsdfb - SDphi -
SDgamma * sqrt(SDphi);
}
if (!model->B3SOIDDcsdminGiven)
{
/* Cdmin */
tmp = sqrt(2.0 * EPSSI * SDphi / (Charge_q *
fabs(pParam->B3SOIDDnsub) * 1.0e6));
tmp1 = EPSSI / tmp;
model->B3SOIDDcsdmin = tmp1 * model->B3SOIDDcbox /
(tmp1 + model->B3SOIDDcbox);
}
T0 = model->B3SOIDDcsdesw * log(1 + model->B3SOIDDtsi /
model->B3SOIDDtbox);
T1 = here->B3SOIDDsourcePerimeter - pParam->B3SOIDDweff;
if (T1 > 0.0)
pParam->B3SOIDDcsesw = T0 * T1;
else
pParam->B3SOIDDcsesw = 0.0;
T1 = here->B3SOIDDdrainPerimeter - pParam->B3SOIDDweff;
if (T1 > 0.0)
pParam->B3SOIDDcdesw = T0 * T1;
else
pParam->B3SOIDDcdesw = 0.0;
pParam->B3SOIDDphi = 2.0 * model->B3SOIDDvtm
* log(pParam->B3SOIDDnpeak / ni);
pParam->B3SOIDDsqrtPhi = sqrt(pParam->B3SOIDDphi);
pParam->B3SOIDDphis3 = pParam->B3SOIDDsqrtPhi * pParam->B3SOIDDphi;
pParam->B3SOIDDXdep0 = sqrt(2.0 * EPSSI / (Charge_q
* pParam->B3SOIDDnpeak * 1.0e6))
* pParam->B3SOIDDsqrtPhi;
pParam->B3SOIDDsqrtXdep0 = sqrt(pParam->B3SOIDDXdep0);
pParam->B3SOIDDlitl = sqrt(3.0 * model->B3SOIDDxj
* model->B3SOIDDtox);
pParam->B3SOIDDvbi = model->B3SOIDDvtm * log(1.0e20
* pParam->B3SOIDDnpeak / (ni * ni));
pParam->B3SOIDDcdep0 = sqrt(Charge_q * EPSSI
* pParam->B3SOIDDnpeak * 1.0e6 / 2.0
/ pParam->B3SOIDDphi);
if (model->B3SOIDDk1Given || model->B3SOIDDk2Given)
{ if (!model->B3SOIDDk1Given)
{ fprintf(stdout, "Warning: k1 should be specified with k2.\n");
pParam->B3SOIDDk1 = 0.53;
}
if (!model->B3SOIDDk2Given)
{ fprintf(stdout, "Warning: k2 should be specified with k1.\n");
pParam->B3SOIDDk2 = -0.0186;
}
if (model->B3SOIDDxtGiven)
fprintf(stdout, "Warning: xt is ignored because k1 or k2 is given.\n");
if (model->B3SOIDDvbxGiven)
fprintf(stdout, "Warning: vbx is ignored because k1 or k2 is given.\n");
if (model->B3SOIDDvbmGiven)
fprintf(stdout, "Warning: vbm is ignored because k1 or k2 is given.\n");
if (model->B3SOIDDgamma1Given)
fprintf(stdout, "Warning: gamma1 is ignored because k1 or k2 is given.\n");
if (model->B3SOIDDgamma2Given)
fprintf(stdout, "Warning: gamma2 is ignored because k1 or k2 is given.\n");
}
else
{ if (!model->B3SOIDDvbxGiven)
pParam->B3SOIDDvbx = pParam->B3SOIDDphi - 7.7348e-4
* pParam->B3SOIDDnpeak
* pParam->B3SOIDDxt * pParam->B3SOIDDxt;
if (pParam->B3SOIDDvbx > 0.0)
pParam->B3SOIDDvbx = -pParam->B3SOIDDvbx;
if (pParam->B3SOIDDvbm > 0.0)
pParam->B3SOIDDvbm = -pParam->B3SOIDDvbm;
if (!model->B3SOIDDgamma1Given)
pParam->B3SOIDDgamma1 = 5.753e-12
* sqrt(pParam->B3SOIDDnpeak)
/ model->B3SOIDDcox;
if (!model->B3SOIDDgamma2Given)
pParam->B3SOIDDgamma2 = 5.753e-12
* sqrt(pParam->B3SOIDDnsub)
/ model->B3SOIDDcox;
T0 = pParam->B3SOIDDgamma1 - pParam->B3SOIDDgamma2;
T1 = sqrt(pParam->B3SOIDDphi - pParam->B3SOIDDvbx)
- pParam->B3SOIDDsqrtPhi;
T2 = sqrt(pParam->B3SOIDDphi * (pParam->B3SOIDDphi
- pParam->B3SOIDDvbm)) - pParam->B3SOIDDphi;
pParam->B3SOIDDk2 = T0 * T1 / (2.0 * T2 + pParam->B3SOIDDvbm);
pParam->B3SOIDDk1 = pParam->B3SOIDDgamma2 - 2.0
* pParam->B3SOIDDk2 * sqrt(pParam->B3SOIDDphi
- pParam->B3SOIDDvbm);
}
if (pParam->B3SOIDDk2 < 0.0)
{ T0 = 0.5 * pParam->B3SOIDDk1 / pParam->B3SOIDDk2;
pParam->B3SOIDDvbsc = 0.9 * (pParam->B3SOIDDphi - T0 * T0);
if (pParam->B3SOIDDvbsc > -3.0)
pParam->B3SOIDDvbsc = -3.0;
else if (pParam->B3SOIDDvbsc < -30.0)
pParam->B3SOIDDvbsc = -30.0;
}
else
{ pParam->B3SOIDDvbsc = -30.0;
}
if (pParam->B3SOIDDvbsc > pParam->B3SOIDDvbm)
pParam->B3SOIDDvbsc = pParam->B3SOIDDvbm;
if (model->B3SOIDDvth0Given)
{ pParam->B3SOIDDvfb = model->B3SOIDDtype * pParam->B3SOIDDvth0
- pParam->B3SOIDDphi - pParam->B3SOIDDk1
* pParam->B3SOIDDsqrtPhi;
}
else
{ pParam->B3SOIDDvfb = -1.0;
pParam->B3SOIDDvth0 = model->B3SOIDDtype * (pParam->B3SOIDDvfb
+ pParam->B3SOIDDphi + pParam->B3SOIDDk1
* pParam->B3SOIDDsqrtPhi);
}
T1 = sqrt(EPSSI / EPSOX * model->B3SOIDDtox
* pParam->B3SOIDDXdep0);
T0 = exp(-0.5 * pParam->B3SOIDDdsub * pParam->B3SOIDDleff / T1);
pParam->B3SOIDDtheta0vb0 = (T0 + 2.0 * T0 * T0);
T0 = exp(-0.5 * pParam->B3SOIDDdrout * pParam->B3SOIDDleff / T1);
T2 = (T0 + 2.0 * T0 * T0);
pParam->B3SOIDDthetaRout = pParam->B3SOIDDpdibl1 * T2
+ pParam->B3SOIDDpdibl2;
here->B3SOIDDminIsub = 5.0e-2 * pParam->B3SOIDDweff * model->B3SOIDDtsi
* MAX(pParam->B3SOIDDisdif, pParam->B3SOIDDisrec);
}
here->B3SOIDDcsbox = model->B3SOIDDcbox*here->B3SOIDDsourceArea;
here->B3SOIDDcsmin = model->B3SOIDDcsdmin*here->B3SOIDDsourceArea;
here->B3SOIDDcdbox = model->B3SOIDDcbox*here->B3SOIDDdrainArea;
here->B3SOIDDcdmin = model->B3SOIDDcsdmin*here->B3SOIDDdrainArea;
if ( ((pParam->B3SOIDDnsub > 0) && (model->B3SOIDDtype > 0)) ||
((pParam->B3SOIDDnsub < 0) && (model->B3SOIDDtype < 0)) )
{
T0 = pParam->B3SOIDDvsdth - pParam->B3SOIDDvsdfb;
pParam->B3SOIDDsdt1 = pParam->B3SOIDDvsdfb + model->B3SOIDDasd * T0;
T1 = here->B3SOIDDcsbox - here->B3SOIDDcsmin;
T2 = T1 / T0 / T0;
pParam->B3SOIDDst2 = T2 / model->B3SOIDDasd;
pParam->B3SOIDDst3 = T2 /( 1 - model->B3SOIDDasd);
here->B3SOIDDst4 = T0 * T1 * (1 + model->B3SOIDDasd) / 3
- here->B3SOIDDcsmin * pParam->B3SOIDDvsdfb;
T1 = here->B3SOIDDcdbox - here->B3SOIDDcdmin;
T2 = T1 / T0 / T0;
pParam->B3SOIDDdt2 = T2 / model->B3SOIDDasd;
pParam->B3SOIDDdt3 = T2 /( 1 - model->B3SOIDDasd);
here->B3SOIDDdt4 = T0 * T1 * (1 + model->B3SOIDDasd) / 3
- here->B3SOIDDcdmin * pParam->B3SOIDDvsdfb;
} else
{
T0 = pParam->B3SOIDDvsdfb - pParam->B3SOIDDvsdth;
pParam->B3SOIDDsdt1 = pParam->B3SOIDDvsdth + model->B3SOIDDasd * T0;
T1 = here->B3SOIDDcsmin - here->B3SOIDDcsbox;
T2 = T1 / T0 / T0;
pParam->B3SOIDDst2 = T2 / model->B3SOIDDasd;
pParam->B3SOIDDst3 = T2 /( 1 - model->B3SOIDDasd);
here->B3SOIDDst4 = T0 * T1 * (1 + model->B3SOIDDasd) / 3
- here->B3SOIDDcsbox * pParam->B3SOIDDvsdth;
T1 = here->B3SOIDDcdmin - here->B3SOIDDcdbox;
T2 = T1 / T0 / T0;
pParam->B3SOIDDdt2 = T2 / model->B3SOIDDasd;
pParam->B3SOIDDdt3 = T2 /( 1 - model->B3SOIDDasd);
here->B3SOIDDdt4 = T0 * T1 * (1 + model->B3SOIDDasd) / 3
- here->B3SOIDDcdbox * pParam->B3SOIDDvsdth;
}
here->B3SOIDDphi = pParam->B3SOIDDphi;
/* process source/drain series resistance */
here->B3SOIDDdrainConductance = model->B3SOIDDsheetResistance
* here->B3SOIDDdrainSquares;
if (here->B3SOIDDdrainConductance > 0.0)
here->B3SOIDDdrainConductance = 1.0
/ here->B3SOIDDdrainConductance;
else
here->B3SOIDDdrainConductance = 0.0;
here->B3SOIDDsourceConductance = model->B3SOIDDsheetResistance
* here->B3SOIDDsourceSquares;
if (here->B3SOIDDsourceConductance > 0.0)
here->B3SOIDDsourceConductance = 1.0
/ here->B3SOIDDsourceConductance;
else
here->B3SOIDDsourceConductance = 0.0;
here->B3SOIDDcgso = pParam->B3SOIDDcgso;
here->B3SOIDDcgdo = pParam->B3SOIDDcgdo;
}
}
return(OK);
}

View File

@ -0,0 +1,52 @@
/**********
Copyright 1999 Regents of the University of California. All rights reserved.
Author: 1998 Samuel Fung, Dennis Sinitsky and Stephen Tang
File: b3soiddtrunc.c 98/5/01
**********/
#include "ngspice.h"
#include <stdio.h>
#include <math.h>
#include "cktdefs.h"
#include "b3soidddef.h"
#include "sperror.h"
#include "suffix.h"
int
B3SOIDDtrunc(inModel,ckt,timeStep)
GENmodel *inModel;
register CKTcircuit *ckt;
double *timeStep;
{
register B3SOIDDmodel *model = (B3SOIDDmodel*)inModel;
register B3SOIDDinstance *here;
#ifdef STEPDEBUG
double debugtemp;
#endif /* STEPDEBUG */
for (; model != NULL; model = model->B3SOIDDnextModel)
{ for (here = model->B3SOIDDinstances; here != NULL;
here = here->B3SOIDDnextInstance)
{
#ifdef STEPDEBUG
debugtemp = *timeStep;
#endif /* STEPDEBUG */
CKTterr(here->B3SOIDDqb,ckt,timeStep);
CKTterr(here->B3SOIDDqg,ckt,timeStep);
CKTterr(here->B3SOIDDqd,ckt,timeStep);
#ifdef STEPDEBUG
if(debugtemp != *timeStep)
{ printf("device %s reduces step from %g to %g\n",
here->B3SOIDDname,debugtemp,*timeStep);
}
#endif /* STEPDEBUG */
}
}
return(OK);
}