Added bsim3soi FD (Fully Depleted) model and added test files

This commit is contained in:
pnenzi 2000-12-09 18:18:43 +00:00
parent 97e77a523e
commit 5496e592ce
47 changed files with 26528 additions and 7 deletions

View File

@ -0,0 +1,29 @@
The terms under which the software is provided  are as the following.
Software is distributed as is, completely without warranty or service
support. The University of California and its employees are not liable
for the condition or performance of the software.
The University owns the copyright but shall not be liable for any
infringement of copyright or other proprietary rights brought by third
parties against the users of the software.
The University of California hereby disclaims all implied warranties.
The University of California grants the users the right to modify, copy,
and redistribute the software and documentation, both within the user's
organization and externally, subject to the following restrictions
1. The users agree not to charge for the University of California code
   itself but may charge for additions, extensions, or support.
2. In any product based on the software, the users agree to acknowledge
   the UC Berkeley BSIM Research Group that developed the software. This
   acknowledgment shall appear in the product documentation.
3. The users agree to obey all U.S. Government restrictions governing
   redistribution or export of the software.
4. The users agree to reproduce any copyright notice which appears on
   the software on any copy or modification of such made available
   to others.

View File

@ -0,0 +1,34 @@
## Process this file with automake to produce Makefile.in
pkglib_LTLIBRARIES = libbsim3soifd.la
libbsim3soifd_la_SOURCES = \
b3soifd.c \
b3soifdacld.c \
b3soifdask.c \
b3soifdcheck.c \
b3soifdcvtest.c \
b3soifddel.c \
b3soifddest.c \
b3soifdgetic.c \
b3soifdld.c \
b3soifdmask.c \
b3soifdmdel.c \
b3soifdmpar.c \
b3soifdnoi.c \
b3soifdpar.c \
b3soifdpzld.c \
b3soifdset.c \
b3soifdtemp.c \
b3soifdtrunc.c \
b3soifddef.h \
b3soifdext.h \
b3soifdinit.c \
b3soifdinit.h \
b3soifditf.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
Modified by Wei Jin 99/9/27
File: b3soifd.c 98/5/01
**********/
#include "ngspice.h"
#include <stdio.h>
#include "devdefs.h"
#include "b3soifddef.h"
#include "suffix.h"
IFparm B3SOIFDpTable[] = { /* parameters */
IOP( "l", B3SOIFD_L, IF_REAL , "Length"),
IOP( "w", B3SOIFD_W, IF_REAL , "Width"),
IOP( "ad", B3SOIFD_AD, IF_REAL , "Drain area"),
IOP( "as", B3SOIFD_AS, IF_REAL , "Source area"),
IOP( "pd", B3SOIFD_PD, IF_REAL , "Drain perimeter"),
IOP( "ps", B3SOIFD_PS, IF_REAL , "Source perimeter"),
IOP( "nrd", B3SOIFD_NRD, IF_REAL , "Number of squares in drain"),
IOP( "nrs", B3SOIFD_NRS, IF_REAL , "Number of squares in source"),
IOP( "off", B3SOIFD_OFF, IF_FLAG , "Device is initially off"),
IP( "ic", B3SOIFD_IC, IF_REALVEC , "Vector of DS,GS,BS initial voltages"),
OP( "gmbs", B3SOIFD_GMBS, IF_REAL, "Gmb"),
OP( "gm", B3SOIFD_GM, IF_REAL, "Gm"),
OP( "gm/ids", B3SOIFD_GMID, IF_REAL, "Gm/Ids"),
OP( "gds", B3SOIFD_GDS, IF_REAL, "Gds"),
OP( "vdsat", B3SOIFD_VDSAT, IF_REAL, "Vdsat"),
OP( "vth", B3SOIFD_VON, IF_REAL, "Vth"),
OP( "ids", B3SOIFD_CD, IF_REAL, "Ids"),
OP( "vbs", B3SOIFD_VBS, IF_REAL, "Vbs"),
OP( "vgs", B3SOIFD_VGS, IF_REAL, "Vgs"),
OP( "vds", B3SOIFD_VDS, IF_REAL, "Vds"),
OP( "ves", B3SOIFD_VES, IF_REAL, "Ves"),
IOP( "bjtoff", B3SOIFD_BJTOFF, IF_INTEGER, "BJT on/off flag"),
IOP( "debug", B3SOIFD_DEBUG, IF_INTEGER, "BJT on/off flag"),
IOP( "rth0", B3SOIFD_RTH0, IF_REAL, "Instance Thermal Resistance"),
IOP( "cth0", B3SOIFD_CTH0, IF_REAL, "Instance Thermal Capacitance"),
IOP( "nrb", B3SOIFD_NRB, IF_REAL, "Number of squares in body"),
};
IFparm B3SOIFDmPTable[] = { /* model parameters */
IOP( "capmod", B3SOIFD_MOD_CAPMOD, IF_INTEGER, "Capacitance model selector"),
IOP( "mobmod", B3SOIFD_MOD_MOBMOD, IF_INTEGER, "Mobility model selector"),
IOP( "noimod", B3SOIFD_MOD_NOIMOD, IF_INTEGER, "Noise model selector"),
IOP( "paramchk", B3SOIFD_MOD_PARAMCHK, IF_INTEGER, "Model parameter checking selector"),
IOP( "binunit", B3SOIFD_MOD_BINUNIT, IF_INTEGER, "Bin unit selector"),
IOP( "version", B3SOIFD_MOD_VERSION, IF_REAL, " parameter for model version"),
IOP( "tox", B3SOIFD_MOD_TOX, IF_REAL, "Gate oxide thickness in meters"),
IOP( "cdsc", B3SOIFD_MOD_CDSC, IF_REAL, "Drain/Source and channel coupling capacitance"),
IOP( "cdscb", B3SOIFD_MOD_CDSCB, IF_REAL, "Body-bias dependence of cdsc"),
IOP( "cdscd", B3SOIFD_MOD_CDSCD, IF_REAL, "Drain-bias dependence of cdsc"),
IOP( "cit", B3SOIFD_MOD_CIT, IF_REAL, "Interface state capacitance"),
IOP( "nfactor", B3SOIFD_MOD_NFACTOR, IF_REAL, "Subthreshold swing Coefficient"),
IOP( "vsat", B3SOIFD_MOD_VSAT, IF_REAL, "Saturation velocity at tnom"),
IOP( "at", B3SOIFD_MOD_AT, IF_REAL, "Temperature coefficient of vsat"),
IOP( "a0", B3SOIFD_MOD_A0, IF_REAL, "Non-uniform depletion width effect coefficient."),
IOP( "ags", B3SOIFD_MOD_AGS, IF_REAL, "Gate bias coefficient of Abulk."),
IOP( "a1", B3SOIFD_MOD_A1, IF_REAL, "Non-saturation effect coefficient"),
IOP( "a2", B3SOIFD_MOD_A2, IF_REAL, "Non-saturation effect coefficient"),
IOP( "keta", B3SOIFD_MOD_KETA, IF_REAL, "Body-bias coefficient of non-uniform depletion width effect."),
IOP( "nsub", B3SOIFD_MOD_NSUB, IF_REAL, "Substrate doping concentration with polarity"),
IOP( "nch", B3SOIFD_MOD_NPEAK, IF_REAL, "Channel doping concentration"),
IOP( "ngate", B3SOIFD_MOD_NGATE, IF_REAL, "Poly-gate doping concentration"),
IOP( "gamma1", B3SOIFD_MOD_GAMMA1, IF_REAL, "Vth body coefficient"),
IOP( "gamma2", B3SOIFD_MOD_GAMMA2, IF_REAL, "Vth body coefficient"),
IOP( "vbx", B3SOIFD_MOD_VBX, IF_REAL, "Vth transition body Voltage"),
IOP( "vbm", B3SOIFD_MOD_VBM, IF_REAL, "Maximum body voltage"),
IOP( "xt", B3SOIFD_MOD_XT, IF_REAL, "Doping depth"),
IOP( "k1", B3SOIFD_MOD_K1, IF_REAL, "Bulk effect coefficient 1"),
IOP( "kt1", B3SOIFD_MOD_KT1, IF_REAL, "Temperature coefficient of Vth"),
IOP( "kt1l", B3SOIFD_MOD_KT1L, IF_REAL, "Temperature coefficient of Vth"),
IOP( "kt2", B3SOIFD_MOD_KT2, IF_REAL, "Body-coefficient of kt1"),
IOP( "k2", B3SOIFD_MOD_K2, IF_REAL, "Bulk effect coefficient 2"),
IOP( "k3", B3SOIFD_MOD_K3, IF_REAL, "Narrow width effect coefficient"),
IOP( "k3b", B3SOIFD_MOD_K3B, IF_REAL, "Body effect coefficient of k3"),
IOP( "w0", B3SOIFD_MOD_W0, IF_REAL, "Narrow width effect parameter"),
IOP( "nlx", B3SOIFD_MOD_NLX, IF_REAL, "Lateral non-uniform doping effect"),
IOP( "dvt0", B3SOIFD_MOD_DVT0, IF_REAL, "Short channel effect coeff. 0"),
IOP( "dvt1", B3SOIFD_MOD_DVT1, IF_REAL, "Short channel effect coeff. 1"),
IOP( "dvt2", B3SOIFD_MOD_DVT2, IF_REAL, "Short channel effect coeff. 2"),
IOP( "dvt0w", B3SOIFD_MOD_DVT0W, IF_REAL, "Narrow Width coeff. 0"),
IOP( "dvt1w", B3SOIFD_MOD_DVT1W, IF_REAL, "Narrow Width effect coeff. 1"),
IOP( "dvt2w", B3SOIFD_MOD_DVT2W, IF_REAL, "Narrow Width effect coeff. 2"),
IOP( "drout", B3SOIFD_MOD_DROUT, IF_REAL, "DIBL coefficient of output resistance"),
IOP( "dsub", B3SOIFD_MOD_DSUB, IF_REAL, "DIBL coefficient in the subthreshold region"),
IOP( "vth0", B3SOIFD_MOD_VTH0, IF_REAL,"Threshold voltage"),
IOP( "vtho", B3SOIFD_MOD_VTH0, IF_REAL,"Threshold voltage"),
IOP( "ua", B3SOIFD_MOD_UA, IF_REAL, "Linear gate dependence of mobility"),
IOP( "ua1", B3SOIFD_MOD_UA1, IF_REAL, "Temperature coefficient of ua"),
IOP( "ub", B3SOIFD_MOD_UB, IF_REAL, "Quadratic gate dependence of mobility"),
IOP( "ub1", B3SOIFD_MOD_UB1, IF_REAL, "Temperature coefficient of ub"),
IOP( "uc", B3SOIFD_MOD_UC, IF_REAL, "Body-bias dependence of mobility"),
IOP( "uc1", B3SOIFD_MOD_UC1, IF_REAL, "Temperature coefficient of uc"),
IOP( "u0", B3SOIFD_MOD_U0, IF_REAL, "Low-field mobility at Tnom"),
IOP( "ute", B3SOIFD_MOD_UTE, IF_REAL, "Temperature coefficient of mobility"),
IOP( "voff", B3SOIFD_MOD_VOFF, IF_REAL, "Threshold voltage offset"),
IOP( "tnom", B3SOIFD_MOD_TNOM, IF_REAL, "Parameter measurement temperature"),
IOP( "cgso", B3SOIFD_MOD_CGSO, IF_REAL, "Gate-source overlap capacitance per width"),
IOP( "cgdo", B3SOIFD_MOD_CGDO, IF_REAL, "Gate-drain overlap capacitance per width"),
IOP( "cgeo", B3SOIFD_MOD_CGEO, IF_REAL, "Gate-substrate overlap capacitance"),
IOP( "xpart", B3SOIFD_MOD_XPART, IF_REAL, "Channel charge partitioning"),
IOP( "delta", B3SOIFD_MOD_DELTA, IF_REAL, "Effective Vds parameter"),
IOP( "rsh", B3SOIFD_MOD_RSH, IF_REAL, "Source-drain sheet resistance"),
IOP( "rdsw", B3SOIFD_MOD_RDSW, IF_REAL, "Source-drain resistance per width"),
IOP( "prwg", B3SOIFD_MOD_PRWG, IF_REAL, "Gate-bias effect on parasitic resistance "),
IOP( "prwb", B3SOIFD_MOD_PRWB, IF_REAL, "Body-effect on parasitic resistance "),
IOP( "prt", B3SOIFD_MOD_PRT, IF_REAL, "Temperature coefficient of parasitic resistance "),
IOP( "eta0", B3SOIFD_MOD_ETA0, IF_REAL, "Subthreshold region DIBL coefficient"),
IOP( "etab", B3SOIFD_MOD_ETAB, IF_REAL, "Subthreshold region DIBL coefficient"),
IOP( "pclm", B3SOIFD_MOD_PCLM, IF_REAL, "Channel length modulation Coefficient"),
IOP( "pdiblc1", B3SOIFD_MOD_PDIBL1, IF_REAL, "Drain-induced barrier lowering coefficient"),
IOP( "pdiblc2", B3SOIFD_MOD_PDIBL2, IF_REAL, "Drain-induced barrier lowering coefficient"),
IOP( "pdiblcb", B3SOIFD_MOD_PDIBLB, IF_REAL, "Body-effect on drain-induced barrier lowering"),
IOP( "pvag", B3SOIFD_MOD_PVAG, IF_REAL, "Gate dependence of output resistance parameter"),
IOP( "shmod", B3SOIFD_MOD_SHMOD, IF_INTEGER, "Self heating mode selector"),
IOP( "tbox", B3SOIFD_MOD_TBOX, IF_REAL, "Back gate oxide thickness in meters"),
IOP( "tsi", B3SOIFD_MOD_TSI, IF_REAL, "Silicon-on-insulator thickness in meters"),
IOP( "xj", B3SOIFD_MOD_XJ, IF_REAL, "Junction Depth"),
IOP( "kb1", B3SOIFD_MOD_KB1, IF_REAL, "Backgate coupling coefficient at strong inversion"),
IOP( "kb3", B3SOIFD_MOD_KB3, IF_REAL, "Backgate coupling coefficient at subthreshold"),
IOP( "dvbd0", B3SOIFD_MOD_DVBD0, IF_REAL, "First coefficient of short-channel effect on Vbs0t"),
IOP( "dvbd1", B3SOIFD_MOD_DVBD1, IF_REAL, "Second coefficient of short-channel effect on Vbs0t"),
IOP( "vbsa", B3SOIFD_MOD_VBSA, IF_REAL, "Vbs0t offset voltage"),
IOP( "delp", B3SOIFD_MOD_DELP, IF_REAL, "Offset constant for limiting Vbseff to Phis"),
IOP( "rbody", B3SOIFD_MOD_RBODY, IF_REAL, "Intrinsic body contact sheet resistance"),
IOP( "rbsh", B3SOIFD_MOD_RBSH, IF_REAL, "Extrinsic body contact sheet resistance"),
IOP( "adice0", B3SOIFD_MOD_ADICE0, IF_REAL, "DICE constant for bulk charge effect"),
IOP( "abp", B3SOIFD_MOD_ABP, IF_REAL, "Gate bias coefficient for Xcsat calculation"),
IOP( "mxc", B3SOIFD_MOD_MXC, IF_REAL, "A smoothing parameter for Xcsat calculation"),
IOP( "rth0", B3SOIFD_MOD_RTH0, IF_REAL, "Self-heating thermal resistance"),
IOP( "cth0", B3SOIFD_MOD_CTH0, IF_REAL, "Self-heating thermal capacitance"),
IOP( "aii", B3SOIFD_MOD_AII, IF_REAL, "1st Vdsatii parameter"),
IOP( "bii", B3SOIFD_MOD_BII, IF_REAL, "2nd Vdsatii parameter"),
IOP( "cii", B3SOIFD_MOD_CII, IF_REAL, "3rd Vdsatii parameter"),
IOP( "dii", B3SOIFD_MOD_DII, IF_REAL, "4th Vdsatii parameter"),
IOP( "ngidl", B3SOIFD_MOD_NGIDL, IF_REAL, "GIDL first parameter"),
IOP( "agidl", B3SOIFD_MOD_AGIDL, IF_REAL, "GIDL second parameter"),
IOP( "bgidl", B3SOIFD_MOD_BGIDL, IF_REAL, "GIDL third parameter"),
IOP( "ndiode", B3SOIFD_MOD_NDIODE, IF_REAL, "Diode non-ideality factor"),
IOP( "ntun", B3SOIFD_MOD_NTUN, IF_REAL, "Reverse tunneling non-ideality factor"),
IOP( "isbjt", B3SOIFD_MOD_ISBJT, IF_REAL, "BJT emitter injection constant"),
IOP( "isdif", B3SOIFD_MOD_ISDIF, IF_REAL, "Body to S/D injection constant"),
IOP( "isrec", B3SOIFD_MOD_ISREC, IF_REAL, "Recombination in depletion constant"),
IOP( "istun", B3SOIFD_MOD_ISTUN, IF_REAL, "Tunneling diode constant"),
IOP( "xbjt", B3SOIFD_MOD_XBJT, IF_REAL, "Temperature coefficient for Isbjt"),
IOP( "xdif", B3SOIFD_MOD_XBJT, IF_REAL, "Temperature coefficient for Isdif"),
IOP( "xrec", B3SOIFD_MOD_XREC, IF_REAL, "Temperature coefficient for Isrec"),
IOP( "xtun", B3SOIFD_MOD_XTUN, IF_REAL, "Temperature coefficient for Istun"),
IOP( "edl", B3SOIFD_MOD_EDL, IF_REAL, "Electron diffusion length"),
IOP( "kbjt1", B3SOIFD_MOD_KBJT1, IF_REAL, "Vds dependency on BJT base width"),
IOP( "tt", B3SOIFD_MOD_TT, IF_REAL, "Diffusion capacitance transit time coefficient"),
IOP( "vsdth", B3SOIFD_MOD_VSDTH, IF_REAL, "Source/Drain diffusion threshold voltage"),
IOP( "vsdfb", B3SOIFD_MOD_VSDFB, IF_REAL, "Source/Drain diffusion flatband voltage"),
IOP( "csdmin", B3SOIFD_MOD_CSDMIN, IF_REAL, "Source/Drain diffusion bottom minimum capacitance"),
IOP( "asd", B3SOIFD_MOD_ASD, IF_REAL, "Source/Drain diffusion smoothing parameter"),
IOP( "pbswg", B3SOIFD_MOD_PBSWG, IF_REAL, "Source/drain (gate side) sidewall junction capacitance built in potential"),
IOP( "mjswg", B3SOIFD_MOD_MJSWG, IF_REAL, "Source/drain (gate side) sidewall junction capacitance grading coefficient"),
IOP( "cjswg", B3SOIFD_MOD_CJSWG, IF_REAL, "Source/drain (gate side) sidewall junction capacitance per unit width"),
IOP( "csdesw", B3SOIFD_MOD_CSDESW, IF_REAL, "Source/drain sidewall fringing constant"),
IOP( "lint", B3SOIFD_MOD_LINT, IF_REAL, "Length reduction parameter"),
IOP( "ll", B3SOIFD_MOD_LL, IF_REAL, "Length reduction parameter"),
IOP( "lln", B3SOIFD_MOD_LLN, IF_REAL, "Length reduction parameter"),
IOP( "lw", B3SOIFD_MOD_LW, IF_REAL, "Length reduction parameter"),
IOP( "lwn", B3SOIFD_MOD_LWN, IF_REAL, "Length reduction parameter"),
IOP( "lwl", B3SOIFD_MOD_LWL, IF_REAL, "Length reduction parameter"),
IOP( "wr", B3SOIFD_MOD_WR, IF_REAL, "Width dependence of rds"),
IOP( "wint", B3SOIFD_MOD_WINT, IF_REAL, "Width reduction parameter"),
IOP( "dwg", B3SOIFD_MOD_DWG, IF_REAL, "Width reduction parameter"),
IOP( "dwb", B3SOIFD_MOD_DWB, IF_REAL, "Width reduction parameter"),
IOP( "wl", B3SOIFD_MOD_WL, IF_REAL, "Width reduction parameter"),
IOP( "wln", B3SOIFD_MOD_WLN, IF_REAL, "Width reduction parameter"),
IOP( "ww", B3SOIFD_MOD_WW, IF_REAL, "Width reduction parameter"),
IOP( "wwn", B3SOIFD_MOD_WWN, IF_REAL, "Width reduction parameter"),
IOP( "wwl", B3SOIFD_MOD_WWL, IF_REAL, "Width reduction parameter"),
IOP( "b0", B3SOIFD_MOD_B0, IF_REAL, "Abulk narrow width parameter"),
IOP( "b1", B3SOIFD_MOD_B1, IF_REAL, "Abulk narrow width parameter"),
IOP( "cgsl", B3SOIFD_MOD_CGSL, IF_REAL, "New C-V model parameter"),
IOP( "cgdl", B3SOIFD_MOD_CGDL, IF_REAL, "New C-V model parameter"),
IOP( "ckappa", B3SOIFD_MOD_CKAPPA, IF_REAL, "New C-V model parameter"),
IOP( "cf", B3SOIFD_MOD_CF, IF_REAL, "Fringe capacitance parameter"),
IOP( "clc", B3SOIFD_MOD_CLC, IF_REAL, "Vdsat parameter for C-V model"),
IOP( "cle", B3SOIFD_MOD_CLE, IF_REAL, "Vdsat parameter for C-V model"),
IOP( "dwc", B3SOIFD_MOD_DWC, IF_REAL, "Delta W for C-V model"),
IOP( "dlc", B3SOIFD_MOD_DLC, IF_REAL, "Delta L for C-V model"),
IOP( "alpha0", B3SOIFD_MOD_ALPHA0, IF_REAL, "substrate current model parameter"),
IOP( "alpha1", B3SOIFD_MOD_ALPHA1, IF_REAL, "substrate current model parameter"),
IOP( "beta0", B3SOIFD_MOD_BETA0, IF_REAL, "substrate current model parameter"),
IOP( "noia", B3SOIFD_MOD_NOIA, IF_REAL, "Flicker noise parameter"),
IOP( "noib", B3SOIFD_MOD_NOIB, IF_REAL, "Flicker noise parameter"),
IOP( "noic", B3SOIFD_MOD_NOIC, IF_REAL, "Flicker noise parameter"),
IOP( "em", B3SOIFD_MOD_EM, IF_REAL, "Flicker noise parameter"),
IOP( "ef", B3SOIFD_MOD_EF, IF_REAL, "Flicker noise frequency exponent"),
IOP( "af", B3SOIFD_MOD_AF, IF_REAL, "Flicker noise exponent"),
IOP( "kf", B3SOIFD_MOD_KF, IF_REAL, "Flicker noise coefficient"),
IOP( "noif", B3SOIFD_MOD_NOIF, IF_REAL, "Floating body excess noise ideality factor"),
/* Added for binning - START */
/* Length Dependence */
IOP( "lnch", B3SOIFD_MOD_LNPEAK, IF_REAL, "Length dependence of nch"),
IOP( "lnsub", B3SOIFD_MOD_LNSUB, IF_REAL, "Length dependence of nsub"),
IOP( "lngate", B3SOIFD_MOD_LNGATE, IF_REAL, "Length dependence of ngate"),
IOP( "lvth0", B3SOIFD_MOD_LVTH0, IF_REAL,"Length dependence of vto"),
IOP( "lk1", B3SOIFD_MOD_LK1, IF_REAL, "Length dependence of k1"),
IOP( "lk2", B3SOIFD_MOD_LK2, IF_REAL, "Length dependence of k2"),
IOP( "lk3", B3SOIFD_MOD_LK3, IF_REAL, "Length dependence of k3"),
IOP( "lk3b", B3SOIFD_MOD_LK3B, IF_REAL, "Length dependence of k3b"),
IOP( "lvbsa", B3SOIFD_MOD_LVBSA, IF_REAL, "Length dependence of vbsa"),
IOP( "ldelp", B3SOIFD_MOD_LDELP, IF_REAL, "Length dependence of delp"),
IOP( "lkb1", B3SOIFD_MOD_LKB1, IF_REAL, "Length dependence of kb1"),
IOP( "lkb3", B3SOIFD_MOD_LKB3, IF_REAL, "Length dependence of kb3"),
IOP( "ldvbd0", B3SOIFD_MOD_LDVBD0, IF_REAL, "Length dependence of dvbd0"),
IOP( "ldvbd1", B3SOIFD_MOD_LDVBD1, IF_REAL, "Length dependence of dvbd1"),
IOP( "lw0", B3SOIFD_MOD_LW0, IF_REAL, "Length dependence of w0"),
IOP( "lnlx", B3SOIFD_MOD_LNLX, IF_REAL, "Length dependence of nlx"),
IOP( "ldvt0", B3SOIFD_MOD_LDVT0, IF_REAL, "Length dependence of dvt0"),
IOP( "ldvt1", B3SOIFD_MOD_LDVT1, IF_REAL, "Length dependence of dvt1"),
IOP( "ldvt2", B3SOIFD_MOD_LDVT2, IF_REAL, "Length dependence of dvt2"),
IOP( "ldvt0w", B3SOIFD_MOD_LDVT0W, IF_REAL, "Length dependence of dvt0w"),
IOP( "ldvt1w", B3SOIFD_MOD_LDVT1W, IF_REAL, "Length dependence of dvt1w"),
IOP( "ldvt2w", B3SOIFD_MOD_LDVT2W, IF_REAL, "Length dependence of dvt2w"),
IOP( "lu0", B3SOIFD_MOD_LU0, IF_REAL, "Length dependence of u0"),
IOP( "lua", B3SOIFD_MOD_LUA, IF_REAL, "Length dependence of ua"),
IOP( "lub", B3SOIFD_MOD_LUB, IF_REAL, "Length dependence of ub"),
IOP( "luc", B3SOIFD_MOD_LUC, IF_REAL, "Length dependence of uc"),
IOP( "lvsat", B3SOIFD_MOD_LVSAT, IF_REAL, "Length dependence of vsat"),
IOP( "la0", B3SOIFD_MOD_LA0, IF_REAL, "Length dependence of a0"),
IOP( "lags", B3SOIFD_MOD_LAGS, IF_REAL, "Length dependence of ags"),
IOP( "lb0", B3SOIFD_MOD_LB0, IF_REAL, "Length dependence of b0"),
IOP( "lb1", B3SOIFD_MOD_LB1, IF_REAL, "Length dependence of b1"),
IOP( "lketa", B3SOIFD_MOD_LKETA, IF_REAL, "Length dependence of keta"),
IOP( "labp", B3SOIFD_MOD_LABP, IF_REAL, "Length dependence of abp"),
IOP( "lmxc", B3SOIFD_MOD_LMXC, IF_REAL, "Length dependence of mxc"),
IOP( "ladice0", B3SOIFD_MOD_LADICE0, IF_REAL, "Length dependence of adice0"),
IOP( "la1", B3SOIFD_MOD_LA1, IF_REAL, "Length dependence of a1"),
IOP( "la2", B3SOIFD_MOD_LA2, IF_REAL, "Length dependence of a2"),
IOP( "lrdsw", B3SOIFD_MOD_LRDSW, IF_REAL, "Length dependence of rdsw "),
IOP( "lprwb", B3SOIFD_MOD_LPRWB, IF_REAL, "Length dependence of prwb "),
IOP( "lprwg", B3SOIFD_MOD_LPRWG, IF_REAL, "Length dependence of prwg "),
IOP( "lwr", B3SOIFD_MOD_LWR, IF_REAL, "Length dependence of wr"),
IOP( "lnfactor", B3SOIFD_MOD_LNFACTOR, IF_REAL, "Length dependence of nfactor"),
IOP( "ldwg", B3SOIFD_MOD_LDWG, IF_REAL, "Length dependence of dwg"),
IOP( "ldwb", B3SOIFD_MOD_LDWB, IF_REAL, "Length dependence of dwb"),
IOP( "lvoff", B3SOIFD_MOD_LVOFF, IF_REAL, "Length dependence of voff"),
IOP( "leta0", B3SOIFD_MOD_LETA0, IF_REAL, "Length dependence of eta0"),
IOP( "letab", B3SOIFD_MOD_LETAB, IF_REAL, "Length dependence of etab"),
IOP( "ldsub", B3SOIFD_MOD_LDSUB, IF_REAL, "Length dependence of dsub"),
IOP( "lcit", B3SOIFD_MOD_LCIT, IF_REAL, "Length dependence of cit"),
IOP( "lcdsc", B3SOIFD_MOD_LCDSC, IF_REAL, "Length dependence of cdsc"),
IOP( "lcdscb", B3SOIFD_MOD_LCDSCB, IF_REAL, "Length dependence of cdscb"),
IOP( "lcdscd", B3SOIFD_MOD_LCDSCD, IF_REAL, "Length dependence of cdscd"),
IOP( "lpclm", B3SOIFD_MOD_LPCLM, IF_REAL, "Length dependence of pclm"),
IOP( "lpdiblc1", B3SOIFD_MOD_LPDIBL1, IF_REAL, "Length dependence of pdiblc1"),
IOP( "lpdiblc2", B3SOIFD_MOD_LPDIBL2, IF_REAL, "Length dependence of pdiblc2"),
IOP( "lpdiblcb", B3SOIFD_MOD_LPDIBLB, IF_REAL, "Length dependence of pdiblcb"),
IOP( "ldrout", B3SOIFD_MOD_LDROUT, IF_REAL, "Length dependence of drout"),
IOP( "lpvag", B3SOIFD_MOD_LPVAG, IF_REAL, "Length dependence of pvag"),
IOP( "ldelta", B3SOIFD_MOD_LDELTA, IF_REAL, "Length dependence of delta"),
IOP( "laii", B3SOIFD_MOD_LAII, IF_REAL, "Length dependence of aii"),
IOP( "lbii", B3SOIFD_MOD_LBII, IF_REAL, "Length dependence of bii"),
IOP( "lcii", B3SOIFD_MOD_LCII, IF_REAL, "Length dependence of cii"),
IOP( "ldii", B3SOIFD_MOD_LDII, IF_REAL, "Length dependence of dii"),
IOP( "lalpha0", B3SOIFD_MOD_LALPHA0, IF_REAL, "Length dependence of alpha0"),
IOP( "lalpha1", B3SOIFD_MOD_LALPHA1, IF_REAL, "Length dependence of alpha1"),
IOP( "lbeta0", B3SOIFD_MOD_LBETA0, IF_REAL, "Length dependence of beta0"),
IOP( "lagidl", B3SOIFD_MOD_LAGIDL, IF_REAL, "Length dependence of agidl"),
IOP( "lbgidl", B3SOIFD_MOD_LBGIDL, IF_REAL, "Length dependence of bgidl"),
IOP( "lngidl", B3SOIFD_MOD_LNGIDL, IF_REAL, "Length dependence of ngidl"),
IOP( "lntun", B3SOIFD_MOD_LNTUN, IF_REAL, "Length dependence of ntun"),
IOP( "lndiode", B3SOIFD_MOD_LNDIODE, IF_REAL, "Length dependence of ndiode"),
IOP( "lisbjt", B3SOIFD_MOD_LISBJT, IF_REAL, "Length dependence of isbjt"),
IOP( "lisdif", B3SOIFD_MOD_LISDIF, IF_REAL, "Length dependence of isdif"),
IOP( "lisrec", B3SOIFD_MOD_LISREC, IF_REAL, "Length dependence of isrec"),
IOP( "listun", B3SOIFD_MOD_LISTUN, IF_REAL, "Length dependence of istun"),
IOP( "ledl", B3SOIFD_MOD_LEDL, IF_REAL, "Length dependence of edl"),
IOP( "lkbjt1", B3SOIFD_MOD_LKBJT1, IF_REAL, "Length dependence of kbjt1"),
IOP( "lvsdfb", B3SOIFD_MOD_LVSDFB, IF_REAL, "Length dependence of vsdfb"),
IOP( "lvsdth", B3SOIFD_MOD_LVSDTH, IF_REAL, "Length dependence of vsdth"),
/* Width Dependence */
IOP( "wnch", B3SOIFD_MOD_WNPEAK, IF_REAL, "Width dependence of nch"),
IOP( "wnsub", B3SOIFD_MOD_WNSUB, IF_REAL, "Width dependence of nsub"),
IOP( "wngate", B3SOIFD_MOD_WNGATE, IF_REAL, "Width dependence of ngate"),
IOP( "wvth0", B3SOIFD_MOD_WVTH0, IF_REAL,"Width dependence of vto"),
IOP( "wk1", B3SOIFD_MOD_WK1, IF_REAL, "Width dependence of k1"),
IOP( "wk2", B3SOIFD_MOD_WK2, IF_REAL, "Width dependence of k2"),
IOP( "wk3", B3SOIFD_MOD_WK3, IF_REAL, "Width dependence of k3"),
IOP( "wk3b", B3SOIFD_MOD_WK3B, IF_REAL, "Width dependence of k3b"),
IOP( "wvbsa", B3SOIFD_MOD_WVBSA, IF_REAL, "Width dependence of vbsa"),
IOP( "wdelp", B3SOIFD_MOD_WDELP, IF_REAL, "Width dependence of delp"),
IOP( "wkb1", B3SOIFD_MOD_WKB1, IF_REAL, "Width dependence of kb1"),
IOP( "wkb3", B3SOIFD_MOD_WKB3, IF_REAL, "Width dependence of kb3"),
IOP( "wdvbd0", B3SOIFD_MOD_WDVBD0, IF_REAL, "Width dependence of dvbd0"),
IOP( "wdvbd1", B3SOIFD_MOD_WDVBD1, IF_REAL, "Width dependence of dvbd1"),
IOP( "ww0", B3SOIFD_MOD_WW0, IF_REAL, "Width dependence of w0"),
IOP( "wnlx", B3SOIFD_MOD_WNLX, IF_REAL, "Width dependence of nlx"),
IOP( "wdvt0", B3SOIFD_MOD_WDVT0, IF_REAL, "Width dependence of dvt0"),
IOP( "wdvt1", B3SOIFD_MOD_WDVT1, IF_REAL, "Width dependence of dvt1"),
IOP( "wdvt2", B3SOIFD_MOD_WDVT2, IF_REAL, "Width dependence of dvt2"),
IOP( "wdvt0w", B3SOIFD_MOD_WDVT0W, IF_REAL, "Width dependence of dvt0w"),
IOP( "wdvt1w", B3SOIFD_MOD_WDVT1W, IF_REAL, "Width dependence of dvt1w"),
IOP( "wdvt2w", B3SOIFD_MOD_WDVT2W, IF_REAL, "Width dependence of dvt2w"),
IOP( "wu0", B3SOIFD_MOD_WU0, IF_REAL, "Width dependence of u0"),
IOP( "wua", B3SOIFD_MOD_WUA, IF_REAL, "Width dependence of ua"),
IOP( "wub", B3SOIFD_MOD_WUB, IF_REAL, "Width dependence of ub"),
IOP( "wuc", B3SOIFD_MOD_WUC, IF_REAL, "Width dependence of uc"),
IOP( "wvsat", B3SOIFD_MOD_WVSAT, IF_REAL, "Width dependence of vsat"),
IOP( "wa0", B3SOIFD_MOD_WA0, IF_REAL, "Width dependence of a0"),
IOP( "wags", B3SOIFD_MOD_WAGS, IF_REAL, "Width dependence of ags"),
IOP( "wb0", B3SOIFD_MOD_WB0, IF_REAL, "Width dependence of b0"),
IOP( "wb1", B3SOIFD_MOD_WB1, IF_REAL, "Width dependence of b1"),
IOP( "wketa", B3SOIFD_MOD_WKETA, IF_REAL, "Width dependence of keta"),
IOP( "wabp", B3SOIFD_MOD_WABP, IF_REAL, "Width dependence of abp"),
IOP( "wmxc", B3SOIFD_MOD_WMXC, IF_REAL, "Width dependence of mxc"),
IOP( "wadice0", B3SOIFD_MOD_WADICE0, IF_REAL, "Width dependence of adice0"),
IOP( "wa1", B3SOIFD_MOD_WA1, IF_REAL, "Width dependence of a1"),
IOP( "wa2", B3SOIFD_MOD_WA2, IF_REAL, "Width dependence of a2"),
IOP( "wrdsw", B3SOIFD_MOD_WRDSW, IF_REAL, "Width dependence of rdsw "),
IOP( "wprwb", B3SOIFD_MOD_WPRWB, IF_REAL, "Width dependence of prwb "),
IOP( "wprwg", B3SOIFD_MOD_WPRWG, IF_REAL, "Width dependence of prwg "),
IOP( "wwr", B3SOIFD_MOD_WWR, IF_REAL, "Width dependence of wr"),
IOP( "wnfactor", B3SOIFD_MOD_WNFACTOR, IF_REAL, "Width dependence of nfactor"),
IOP( "wdwg", B3SOIFD_MOD_WDWG, IF_REAL, "Width dependence of dwg"),
IOP( "wdwb", B3SOIFD_MOD_WDWB, IF_REAL, "Width dependence of dwb"),
IOP( "wvoff", B3SOIFD_MOD_WVOFF, IF_REAL, "Width dependence of voff"),
IOP( "weta0", B3SOIFD_MOD_WETA0, IF_REAL, "Width dependence of eta0"),
IOP( "wetab", B3SOIFD_MOD_WETAB, IF_REAL, "Width dependence of etab"),
IOP( "wdsub", B3SOIFD_MOD_WDSUB, IF_REAL, "Width dependence of dsub"),
IOP( "wcit", B3SOIFD_MOD_WCIT, IF_REAL, "Width dependence of cit"),
IOP( "wcdsc", B3SOIFD_MOD_WCDSC, IF_REAL, "Width dependence of cdsc"),
IOP( "wcdscb", B3SOIFD_MOD_WCDSCB, IF_REAL, "Width dependence of cdscb"),
IOP( "wcdscd", B3SOIFD_MOD_WCDSCD, IF_REAL, "Width dependence of cdscd"),
IOP( "wpclm", B3SOIFD_MOD_WPCLM, IF_REAL, "Width dependence of pclm"),
IOP( "wpdiblc1", B3SOIFD_MOD_WPDIBL1, IF_REAL, "Width dependence of pdiblc1"),
IOP( "wpdiblc2", B3SOIFD_MOD_WPDIBL2, IF_REAL, "Width dependence of pdiblc2"),
IOP( "wpdiblcb", B3SOIFD_MOD_WPDIBLB, IF_REAL, "Width dependence of pdiblcb"),
IOP( "wdrout", B3SOIFD_MOD_WDROUT, IF_REAL, "Width dependence of drout"),
IOP( "wpvag", B3SOIFD_MOD_WPVAG, IF_REAL, "Width dependence of pvag"),
IOP( "wdelta", B3SOIFD_MOD_WDELTA, IF_REAL, "Width dependence of delta"),
IOP( "waii", B3SOIFD_MOD_WAII, IF_REAL, "Width dependence of aii"),
IOP( "wbii", B3SOIFD_MOD_WBII, IF_REAL, "Width dependence of bii"),
IOP( "wcii", B3SOIFD_MOD_WCII, IF_REAL, "Width dependence of cii"),
IOP( "wdii", B3SOIFD_MOD_WDII, IF_REAL, "Width dependence of dii"),
IOP( "walpha0", B3SOIFD_MOD_WALPHA0, IF_REAL, "Width dependence of alpha0"),
IOP( "walpha1", B3SOIFD_MOD_WALPHA1, IF_REAL, "Width dependence of alpha1"),
IOP( "wbeta0", B3SOIFD_MOD_WBETA0, IF_REAL, "Width dependence of beta0"),
IOP( "wagidl", B3SOIFD_MOD_WAGIDL, IF_REAL, "Width dependence of agidl"),
IOP( "wbgidl", B3SOIFD_MOD_WBGIDL, IF_REAL, "Width dependence of bgidl"),
IOP( "wngidl", B3SOIFD_MOD_WNGIDL, IF_REAL, "Width dependence of ngidl"),
IOP( "wntun", B3SOIFD_MOD_WNTUN, IF_REAL, "Width dependence of ntun"),
IOP( "wndiode", B3SOIFD_MOD_WNDIODE, IF_REAL, "Width dependence of ndiode"),
IOP( "wisbjt", B3SOIFD_MOD_WISBJT, IF_REAL, "Width dependence of isbjt"),
IOP( "wisdif", B3SOIFD_MOD_WISDIF, IF_REAL, "Width dependence of isdif"),
IOP( "wisrec", B3SOIFD_MOD_WISREC, IF_REAL, "Width dependence of isrec"),
IOP( "wistun", B3SOIFD_MOD_WISTUN, IF_REAL, "Width dependence of istun"),
IOP( "wedl", B3SOIFD_MOD_WEDL, IF_REAL, "Width dependence of edl"),
IOP( "wkbjt1", B3SOIFD_MOD_WKBJT1, IF_REAL, "Width dependence of kbjt1"),
IOP( "wvsdfb", B3SOIFD_MOD_WVSDFB, IF_REAL, "Width dependence of vsdfb"),
IOP( "wvsdth", B3SOIFD_MOD_WVSDTH, IF_REAL, "Width dependence of vsdth"),
/* Cross-term Dependence */
IOP( "pnch", B3SOIFD_MOD_PNPEAK, IF_REAL, "Cross-term dependence of nch"),
IOP( "pnsub", B3SOIFD_MOD_PNSUB, IF_REAL, "Cross-term dependence of nsub"),
IOP( "pngate", B3SOIFD_MOD_PNGATE, IF_REAL, "Cross-term dependence of ngate"),
IOP( "pvth0", B3SOIFD_MOD_PVTH0, IF_REAL,"Cross-term dependence of vto"),
IOP( "pk1", B3SOIFD_MOD_PK1, IF_REAL, "Cross-term dependence of k1"),
IOP( "pk2", B3SOIFD_MOD_PK2, IF_REAL, "Cross-term dependence of k2"),
IOP( "pk3", B3SOIFD_MOD_PK3, IF_REAL, "Cross-term dependence of k3"),
IOP( "pk3b", B3SOIFD_MOD_PK3B, IF_REAL, "Cross-term dependence of k3b"),
IOP( "pvbsa", B3SOIFD_MOD_PVBSA, IF_REAL, "Cross-term dependence of vbsa"),
IOP( "pdelp", B3SOIFD_MOD_PDELP, IF_REAL, "Cross-term dependence of delp"),
IOP( "pkb1", B3SOIFD_MOD_PKB1, IF_REAL, "Cross-term dependence of kb1"),
IOP( "pkb3", B3SOIFD_MOD_PKB3, IF_REAL, "Cross-term dependence of kb3"),
IOP( "pdvbd0", B3SOIFD_MOD_PDVBD0, IF_REAL, "Cross-term dependence of dvbd0"),
IOP( "pdvbd1", B3SOIFD_MOD_PDVBD1, IF_REAL, "Cross-term dependence of dvbd1"),
IOP( "pw0", B3SOIFD_MOD_PW0, IF_REAL, "Cross-term dependence of w0"),
IOP( "pnlx", B3SOIFD_MOD_PNLX, IF_REAL, "Cross-term dependence of nlx"),
IOP( "pdvt0", B3SOIFD_MOD_PDVT0, IF_REAL, "Cross-term dependence of dvt0"),
IOP( "pdvt1", B3SOIFD_MOD_PDVT1, IF_REAL, "Cross-term dependence of dvt1"),
IOP( "pdvt2", B3SOIFD_MOD_PDVT2, IF_REAL, "Cross-term dependence of dvt2"),
IOP( "pdvt0w", B3SOIFD_MOD_PDVT0W, IF_REAL, "Cross-term dependence of dvt0w"),
IOP( "pdvt1w", B3SOIFD_MOD_PDVT1W, IF_REAL, "Cross-term dependence of dvt1w"),
IOP( "pdvt2w", B3SOIFD_MOD_PDVT2W, IF_REAL, "Cross-term dependence of dvt2w"),
IOP( "pu0", B3SOIFD_MOD_PU0, IF_REAL, "Cross-term dependence of u0"),
IOP( "pua", B3SOIFD_MOD_PUA, IF_REAL, "Cross-term dependence of ua"),
IOP( "pub", B3SOIFD_MOD_PUB, IF_REAL, "Cross-term dependence of ub"),
IOP( "puc", B3SOIFD_MOD_PUC, IF_REAL, "Cross-term dependence of uc"),
IOP( "pvsat", B3SOIFD_MOD_PVSAT, IF_REAL, "Cross-term dependence of vsat"),
IOP( "pa0", B3SOIFD_MOD_PA0, IF_REAL, "Cross-term dependence of a0"),
IOP( "pags", B3SOIFD_MOD_PAGS, IF_REAL, "Cross-term dependence of ags"),
IOP( "pb0", B3SOIFD_MOD_PB0, IF_REAL, "Cross-term dependence of b0"),
IOP( "pb1", B3SOIFD_MOD_PB1, IF_REAL, "Cross-term dependence of b1"),
IOP( "pketa", B3SOIFD_MOD_PKETA, IF_REAL, "Cross-term dependence of keta"),
IOP( "pabp", B3SOIFD_MOD_PABP, IF_REAL, "Cross-term dependence of abp"),
IOP( "pmxc", B3SOIFD_MOD_PMXC, IF_REAL, "Cross-term dependence of mxc"),
IOP( "padice0", B3SOIFD_MOD_PADICE0, IF_REAL, "Cross-term dependence of adice0"),
IOP( "pa1", B3SOIFD_MOD_PA1, IF_REAL, "Cross-term dependence of a1"),
IOP( "pa2", B3SOIFD_MOD_PA2, IF_REAL, "Cross-term dependence of a2"),
IOP( "prdsw", B3SOIFD_MOD_PRDSW, IF_REAL, "Cross-term dependence of rdsw "),
IOP( "pprwb", B3SOIFD_MOD_PPRWB, IF_REAL, "Cross-term dependence of prwb "),
IOP( "pprwg", B3SOIFD_MOD_PPRWG, IF_REAL, "Cross-term dependence of prwg "),
IOP( "pwr", B3SOIFD_MOD_PWR, IF_REAL, "Cross-term dependence of wr"),
IOP( "pnfactor", B3SOIFD_MOD_PNFACTOR, IF_REAL, "Cross-term dependence of nfactor"),
IOP( "pdwg", B3SOIFD_MOD_PDWG, IF_REAL, "Cross-term dependence of dwg"),
IOP( "pdwb", B3SOIFD_MOD_PDWB, IF_REAL, "Cross-term dependence of dwb"),
IOP( "pvoff", B3SOIFD_MOD_PVOFF, IF_REAL, "Cross-term dependence of voff"),
IOP( "peta0", B3SOIFD_MOD_PETA0, IF_REAL, "Cross-term dependence of eta0"),
IOP( "petab", B3SOIFD_MOD_PETAB, IF_REAL, "Cross-term dependence of etab"),
IOP( "pdsub", B3SOIFD_MOD_PDSUB, IF_REAL, "Cross-term dependence of dsub"),
IOP( "pcit", B3SOIFD_MOD_PCIT, IF_REAL, "Cross-term dependence of cit"),
IOP( "pcdsc", B3SOIFD_MOD_PCDSC, IF_REAL, "Cross-term dependence of cdsc"),
IOP( "pcdscb", B3SOIFD_MOD_PCDSCB, IF_REAL, "Cross-term dependence of cdscb"),
IOP( "pcdscd", B3SOIFD_MOD_PCDSCD, IF_REAL, "Cross-term dependence of cdscd"),
IOP( "ppclm", B3SOIFD_MOD_PPCLM, IF_REAL, "Cross-term dependence of pclm"),
IOP( "ppdiblc1", B3SOIFD_MOD_PPDIBL1, IF_REAL, "Cross-term dependence of pdiblc1"),
IOP( "ppdiblc2", B3SOIFD_MOD_PPDIBL2, IF_REAL, "Cross-term dependence of pdiblc2"),
IOP( "ppdiblcb", B3SOIFD_MOD_PPDIBLB, IF_REAL, "Cross-term dependence of pdiblcb"),
IOP( "pdrout", B3SOIFD_MOD_PDROUT, IF_REAL, "Cross-term dependence of drout"),
IOP( "ppvag", B3SOIFD_MOD_PPVAG, IF_REAL, "Cross-term dependence of pvag"),
IOP( "pdelta", B3SOIFD_MOD_PDELTA, IF_REAL, "Cross-term dependence of delta"),
IOP( "paii", B3SOIFD_MOD_PAII, IF_REAL, "Cross-term dependence of aii"),
IOP( "pbii", B3SOIFD_MOD_PBII, IF_REAL, "Cross-term dependence of bii"),
IOP( "pcii", B3SOIFD_MOD_PCII, IF_REAL, "Cross-term dependence of cii"),
IOP( "pdii", B3SOIFD_MOD_PDII, IF_REAL, "Cross-term dependence of dii"),
IOP( "palpha0", B3SOIFD_MOD_PALPHA0, IF_REAL, "Cross-term dependence of alpha0"),
IOP( "palpha1", B3SOIFD_MOD_PALPHA1, IF_REAL, "Cross-term dependence of alpha1"),
IOP( "pbeta0", B3SOIFD_MOD_PBETA0, IF_REAL, "Cross-term dependence of beta0"),
IOP( "pagidl", B3SOIFD_MOD_PAGIDL, IF_REAL, "Cross-term dependence of agidl"),
IOP( "pbgidl", B3SOIFD_MOD_PBGIDL, IF_REAL, "Cross-term dependence of bgidl"),
IOP( "pngidl", B3SOIFD_MOD_PNGIDL, IF_REAL, "Cross-term dependence of ngidl"),
IOP( "pntun", B3SOIFD_MOD_PNTUN, IF_REAL, "Cross-term dependence of ntun"),
IOP( "pndiode", B3SOIFD_MOD_PNDIODE, IF_REAL, "Cross-term dependence of ndiode"),
IOP( "pisbjt", B3SOIFD_MOD_PISBJT, IF_REAL, "Cross-term dependence of isbjt"),
IOP( "pisdif", B3SOIFD_MOD_PISDIF, IF_REAL, "Cross-term dependence of isdif"),
IOP( "pisrec", B3SOIFD_MOD_PISREC, IF_REAL, "Cross-term dependence of isrec"),
IOP( "pistun", B3SOIFD_MOD_PISTUN, IF_REAL, "Cross-term dependence of istun"),
IOP( "pedl", B3SOIFD_MOD_PEDL, IF_REAL, "Cross-term dependence of edl"),
IOP( "pkbjt1", B3SOIFD_MOD_PKBJT1, IF_REAL, "Cross-term dependence of kbjt1"),
IOP( "pvsdfb", B3SOIFD_MOD_PVSDFB, IF_REAL, "Cross-term dependence of vsdfb"),
IOP( "pvsdth", B3SOIFD_MOD_PVSDTH, IF_REAL, "Cross-term dependence of vsdth"),
/* Added for binning - END */
IP( "nmos", B3SOIFD_MOD_NMOS, IF_FLAG, "Flag to indicate NMOS"),
IP( "pmos", B3SOIFD_MOD_PMOS, IF_FLAG, "Flag to indicate PMOS"),
};
char *B3SOIFDnames[] = {
"Drain",
"Gate",
"Source",
"Backgate",
"",
"Body",
"Temp",
"Charge",
};
int B3SOIFDnSize = NUMELEMS(B3SOIFDnames);
int B3SOIFDpTSize = NUMELEMS(B3SOIFDpTable);
int B3SOIFDmPTSize = NUMELEMS(B3SOIFDmPTable);
int B3SOIFDiSize = sizeof(B3SOIFDinstance);
int B3SOIFDmSize = sizeof(B3SOIFDmodel);

View File

@ -0,0 +1,443 @@
/**********
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 99/9/27
File: b3soifdacld.c 98/5/01
**********/
#include "ngspice.h"
#include <stdio.h>
#include "cktdefs.h"
#include "b3soifddef.h"
#include "sperror.h"
#include "suffix.h"
int
B3SOIFDacLoad(inModel,ckt)
GENmodel *inModel;
CKTcircuit *ckt;
{
B3SOIFDmodel *model = (B3SOIFDmodel*)inModel;
B3SOIFDinstance *here;
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->B3SOIFDnextModel)
{
for (here = model->B3SOIFDinstances; here!= NULL;
here = here->B3SOIFDnextInstance)
{
selfheat = (model->B3SOIFDshMod == 1) && (here->B3SOIFDrth0 != 0.0);
if (here->B3SOIFDdebugMod > 2)
{
fpdebug = fopen("b3soifdac.log", "a");
fprintf(fpdebug, ".......omega=%.5e\n", omega);
}
if (here->B3SOIFDmode >= 0)
{ Gm = here->B3SOIFDgm;
Gmbs = here->B3SOIFDgmbs;
Gme = here->B3SOIFDgme;
GmT = model->B3SOIFDtype * here->B3SOIFDgmT;
FwdSum = Gm + Gmbs + Gme;
RevSum = 0.0;
cbgb = here->B3SOIFDcbgb;
cbsb = here->B3SOIFDcbsb;
cbdb = here->B3SOIFDcbdb;
cbeb = here->B3SOIFDcbeb;
cbT = model->B3SOIFDtype * here->B3SOIFDcbT;
cegb = here->B3SOIFDcegb;
cesb = here->B3SOIFDcesb;
cedb = here->B3SOIFDcedb;
ceeb = here->B3SOIFDceeb;
ceT = model->B3SOIFDtype * here->B3SOIFDceT;
cggb = here->B3SOIFDcggb;
cgsb = here->B3SOIFDcgsb;
cgdb = here->B3SOIFDcgdb;
cgeb = here->B3SOIFDcgeb;
cgT = model->B3SOIFDtype * here->B3SOIFDcgT;
cdgb = here->B3SOIFDcdgb;
cdsb = here->B3SOIFDcdsb;
cddb = here->B3SOIFDcddb;
cdeb = here->B3SOIFDcdeb;
cdT = model->B3SOIFDtype * here->B3SOIFDcdT;
cTt = here->pParam->B3SOIFDcth;
gbbg = -here->B3SOIFDgbgs;
gbbdp = -here->B3SOIFDgbds;
gbbb = -here->B3SOIFDgbbs;
gbbe = -here->B3SOIFDgbes;
gbbp = -here->B3SOIFDgbps;
gbbT = -model->B3SOIFDtype * here->B3SOIFDgbT;
gbbsp = - ( gbbg + gbbdp + gbbb + gbbe + gbbp);
gddpg = -here->B3SOIFDgjdg;
gddpdp = -here->B3SOIFDgjdd;
gddpb = -here->B3SOIFDgjdb;
gddpe = -here->B3SOIFDgjde;
gddpT = -model->B3SOIFDtype * here->B3SOIFDgjdT;
gddpsp = - ( gddpg + gddpdp + gddpb + gddpe);
gsspg = -here->B3SOIFDgjsg;
gsspdp = -here->B3SOIFDgjsd;
gsspb = -here->B3SOIFDgjsb;
gsspe = 0.0;
gsspT = -model->B3SOIFDtype * here->B3SOIFDgjsT;
gsspsp = - (gsspg + gsspdp + gsspb + gsspe);
gppg = -here->B3SOIFDgbpgs;
gppdp = -here->B3SOIFDgbpds;
gppb = -here->B3SOIFDgbpbs;
gppe = -here->B3SOIFDgbpes;
gppp = -here->B3SOIFDgbpps;
gppT = -model->B3SOIFDtype * here->B3SOIFDgbpT;
gppsp = - (gppg + gppdp + gppb + gppe + gppp);
gTtg = here->B3SOIFDgtempg;
gTtb = here->B3SOIFDgtempb;
gTte = here->B3SOIFDgtempe;
gTtdp = here->B3SOIFDgtempd;
gTtt = here->B3SOIFDgtempT;
gTtsp = - (gTtg + gTtb + gTte + gTtdp);
sxpart = 0.6;
dxpart = 0.4;
}
else
{ Gm = -here->B3SOIFDgm;
Gmbs = -here->B3SOIFDgmbs;
Gme = -here->B3SOIFDgme;
GmT = -model->B3SOIFDtype * here->B3SOIFDgmT;
FwdSum = 0.0;
RevSum = -Gm - Gmbs - Gme;
cdgb = - (here->B3SOIFDcdgb + here->B3SOIFDcggb + here->B3SOIFDcbgb
+ here->B3SOIFDcegb);
cdsb = - (here->B3SOIFDcddb + here->B3SOIFDcgdb + here->B3SOIFDcbdb
+ here->B3SOIFDcedb);
cddb = - (here->B3SOIFDcdsb + here->B3SOIFDcgsb + here->B3SOIFDcbsb
+ here->B3SOIFDcesb);
cdeb = - (here->B3SOIFDcdeb + here->B3SOIFDcgeb + here->B3SOIFDcbeb
+ here->B3SOIFDceeb);
cdT = - model->B3SOIFDtype * (here->B3SOIFDcgT + here->B3SOIFDcbT
+ here->B3SOIFDcdT + here->B3SOIFDceT);
cegb = here->B3SOIFDcegb;
cesb = here->B3SOIFDcedb;
cedb = here->B3SOIFDcesb;
ceeb = here->B3SOIFDceeb;
ceT = model->B3SOIFDtype * here->B3SOIFDceT;
cggb = here->B3SOIFDcggb;
cgsb = here->B3SOIFDcgdb;
cgdb = here->B3SOIFDcgsb;
cgeb = here->B3SOIFDcgeb;
cgT = model->B3SOIFDtype * here->B3SOIFDcgT;
cbgb = here->B3SOIFDcbgb;
cbsb = here->B3SOIFDcbdb;
cbdb = here->B3SOIFDcbsb;
cbeb = here->B3SOIFDcbeb;
cbT = model->B3SOIFDtype * here->B3SOIFDcbT;
cTt = here->pParam->B3SOIFDcth;
gbbg = -here->B3SOIFDgbgs;
gbbb = -here->B3SOIFDgbbs;
gbbe = -here->B3SOIFDgbes;
gbbp = -here->B3SOIFDgbps;
gbbsp = -here->B3SOIFDgbds;
gbbT = -model->B3SOIFDtype * here->B3SOIFDgbT;
gbbdp = - ( gbbg + gbbsp + gbbb + gbbe + gbbp);
gddpg = -here->B3SOIFDgjsg;
gddpsp = -here->B3SOIFDgjsd;
gddpb = -here->B3SOIFDgjsb;
gddpe = 0.0;
gddpT = -model->B3SOIFDtype * here->B3SOIFDgjsT;
gddpdp = - (gddpg + gddpsp + gddpb + gddpe);
gsspg = -here->B3SOIFDgjdg;
gsspsp = -here->B3SOIFDgjdd;
gsspb = -here->B3SOIFDgjdb;
gsspe = -here->B3SOIFDgjde;
gsspT = -model->B3SOIFDtype * here->B3SOIFDgjdT;
gsspdp = - ( gsspg + gsspsp + gsspb + gsspe);
gppg = -here->B3SOIFDgbpgs;
gppsp = -here->B3SOIFDgbpds;
gppb = -here->B3SOIFDgbpbs;
gppe = -here->B3SOIFDgbpes;
gppp = -here->B3SOIFDgbpps;
gppT = -model->B3SOIFDtype * here->B3SOIFDgbpT;
gppdp = - (gppg + gppsp + gppb + gppe + gppp);
gTtt = here->B3SOIFDgtempT;
gTtg = here->B3SOIFDgtempg;
gTtb = here->B3SOIFDgtempb;
gTte = here->B3SOIFDgtempe;
gTtdp = here->B3SOIFDgtempd;
gTtsp = - (gTtt + gTtg + gTtb + gTte + gTtdp);
gTtg = here->B3SOIFDgtempg;
gTtb = here->B3SOIFDgtempb;
gTte = here->B3SOIFDgtempe;
gTtsp = here->B3SOIFDgtempd;
gTtt = here->B3SOIFDgtempT;
gTtdp = - (gTtg + gTtb + gTte + gTtsp);
sxpart = 0.6;
sxpart = 0.4;
dxpart = 0.6;
}
gdpr=here->B3SOIFDdrainConductance;
gspr=here->B3SOIFDsourceConductance;
gds= here->B3SOIFDgds;
GSoverlapCap = here->B3SOIFDcgso;
GDoverlapCap = here->B3SOIFDcgdo;
GEoverlapCap = here->pParam->B3SOIFDcgeo;
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->B3SOIFDEgPtr +1) += xcegb;
*(here->B3SOIFDEdpPtr +1) += xcedb;
*(here->B3SOIFDEspPtr +1) += xcesb;
*(here->B3SOIFDGePtr +1) += xcgeb;
*(here->B3SOIFDDPePtr +1) += xcdeb;
*(here->B3SOIFDSPePtr +1) += xcseb;
*(here->B3SOIFDEePtr +1) += xceeb;
*(here->B3SOIFDGgPtr +1) += xcggb;
*(here->B3SOIFDGdpPtr +1) += xcgdb;
*(here->B3SOIFDGspPtr +1) += xcgsb;
*(here->B3SOIFDDPgPtr +1) += xcdgb;
*(here->B3SOIFDDPdpPtr +1) += xcddb;
*(here->B3SOIFDDPspPtr +1) += xcdsb;
*(here->B3SOIFDSPgPtr +1) += xcsgb;
*(here->B3SOIFDSPdpPtr +1) += xcsdb;
*(here->B3SOIFDSPspPtr +1) += xcssb;
if (selfheat)
{
*(here->B3SOIFDTemptempPtr + 1) += xcTt;
*(here->B3SOIFDDPtempPtr + 1) += xcdT;
*(here->B3SOIFDSPtempPtr + 1) += xcsT;
*(here->B3SOIFDBtempPtr + 1) += xcbT;
*(here->B3SOIFDEtempPtr + 1) += xceT;
*(here->B3SOIFDGtempPtr + 1) += xcgT;
}
if (here->B3SOIFDdebugMod > 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->B3SOIFDEgPtr) += 0.0;
*(here->B3SOIFDEdpPtr) += 0.0;
*(here->B3SOIFDEspPtr) += 0.0;
*(here->B3SOIFDGePtr) -= 0.0;
*(here->B3SOIFDDPePtr) += Gme + gddpe;
*(here->B3SOIFDSPePtr) += gsspe - Gme;
*(here->B3SOIFDEePtr) += 0.0;
*(here->B3SOIFDDPgPtr) += Gm + gddpg;
*(here->B3SOIFDDPdpPtr) += gdpr + gds + gddpdp + RevSum ;
*(here->B3SOIFDDPspPtr) -= gds + FwdSum - gddpsp;
*(here->B3SOIFDDPdPtr) -= gdpr;
*(here->B3SOIFDSPgPtr) -= Gm - gsspg;
*(here->B3SOIFDSPdpPtr) -= gds + RevSum - gsspdp;
*(here->B3SOIFDSPspPtr) += gspr + gds + FwdSum + gsspsp;
*(here->B3SOIFDSPsPtr) -= gspr;
if (selfheat)
{
*(here->B3SOIFDDPtempPtr) += GmT + gddpT;
*(here->B3SOIFDSPtempPtr) += -GmT + gsspT;
*(here->B3SOIFDBtempPtr) += gbbT;
if (here->B3SOIFDbodyMod == 1) {
(*(here->B3SOIFDPtempPtr) += gppT);
}
*(here->B3SOIFDTemptempPtr) += gTtt + 1/here->pParam->B3SOIFDrth;
*(here->B3SOIFDTempgPtr) += gTtg;
*(here->B3SOIFDTempbPtr) += gTtb;
*(here->B3SOIFDTempePtr) += gTte;
*(here->B3SOIFDTempdpPtr) += gTtdp;
*(here->B3SOIFDTempspPtr) += gTtsp;
}
if (here->B3SOIFDdebugMod > 3)
{
fprintf(fpdebug, "Static condunctance...\n");
fprintf(fpdebug, "Gg=%.5e; Gdp=%.5e; Gsp=%.5e;\nGb=%.5e; Ge=%.5e\n",
*(here->B3SOIFDGgPtr), *(here->B3SOIFDGdpPtr),
*(here->B3SOIFDGspPtr), *(here->B3SOIFDGbPtr),
*(here->B3SOIFDGePtr));
fprintf(fpdebug, "DPg=%.5e; DPdp=%.5e; DPsp=%.5e;\nDPb=%.5e; DPe=%.5e\n",
*(here->B3SOIFDDPgPtr), *(here->B3SOIFDDPdpPtr),
*(here->B3SOIFDDPspPtr), *(here->B3SOIFDDPbPtr),
*(here->B3SOIFDDPePtr));
fprintf(fpdebug, "SPg=%.5e; SPdp=%.5e; SPsp=%.5e;\nSPb=%.5e; SPe=%.5e\n",
*(here->B3SOIFDSPgPtr), *(here->B3SOIFDSPdpPtr),
*(here->B3SOIFDSPspPtr), *(here->B3SOIFDSPbPtr),
*(here->B3SOIFDSPePtr));
fprintf(fpdebug, "Bg=%.5e; Bdp=%.5e; Bsp=%.5e;\nBb=%.5e; Be=%.5e\n",
gbbg, gbbdp, gbbsp, gbbb, gbbe);
}
*(here->B3SOIFDDdPtr) += gdpr;
*(here->B3SOIFDDdpPtr) -= gdpr;
*(here->B3SOIFDSsPtr) += gspr;
*(here->B3SOIFDSspPtr) -= gspr;
if (here->B3SOIFDbodyMod == 1) {
(*(here->B3SOIFDBpPtr) -= gppp);
(*(here->B3SOIFDPbPtr) += gppb);
(*(here->B3SOIFDPpPtr) += gppp);
(*(here->B3SOIFDPgPtr) += gppg);
(*(here->B3SOIFDPdpPtr) += gppdp);
(*(here->B3SOIFDPspPtr) += gppsp);
(*(here->B3SOIFDPePtr) += gppe);
}
if (here->B3SOIFDdebugMod > 1)
{
*(here->B3SOIFDVbsPtr) += 1;
*(here->B3SOIFDIdsPtr) += 1;
*(here->B3SOIFDIcPtr) += 1;
*(here->B3SOIFDIbsPtr) += 1;
*(here->B3SOIFDIbdPtr) += 1;
*(here->B3SOIFDIiiPtr) += 1;
*(here->B3SOIFDIgidlPtr) += 1;
*(here->B3SOIFDItunPtr) += 1;
*(here->B3SOIFDIbpPtr) += 1;
*(here->B3SOIFDAbeffPtr) += 1;
*(here->B3SOIFDVbs0effPtr) += 1;
*(here->B3SOIFDVbseffPtr) += 1;
*(here->B3SOIFDXcPtr) += 1;
*(here->B3SOIFDCbgPtr) += 1;
*(here->B3SOIFDCbbPtr) += 1;
*(here->B3SOIFDCbdPtr) += 1;
*(here->B3SOIFDqbPtr) += 1;
*(here->B3SOIFDQbfPtr) += 1;
*(here->B3SOIFDQjsPtr) += 1;
*(here->B3SOIFDQjdPtr) += 1;
/* clean up last */
*(here->B3SOIFDGmPtr) += 1;
*(here->B3SOIFDGmbsPtr) += 1;
*(here->B3SOIFDGdsPtr) += 1;
*(here->B3SOIFDGmePtr) += 1;
*(here->B3SOIFDVbs0teffPtr) += 1;
*(here->B3SOIFDVgsteffPtr) += 1;
*(here->B3SOIFDCbePtr) += 1;
*(here->B3SOIFDVthPtr) += 1;
*(here->B3SOIFDXcsatPtr) += 1;
*(here->B3SOIFDVdscvPtr) += 1;
*(here->B3SOIFDVcscvPtr) += 1;
*(here->B3SOIFDQaccPtr) += 1;
*(here->B3SOIFDQsub0Ptr) += 1;
*(here->B3SOIFDQsubs1Ptr) += 1;
*(here->B3SOIFDQsubs2Ptr) += 1;
*(here->B3SOIFDqgPtr) += 1;
*(here->B3SOIFDqdPtr) += 1;
*(here->B3SOIFDqePtr) += 1;
*(here->B3SOIFDDum1Ptr) += 1;
*(here->B3SOIFDDum2Ptr) += 1;
*(here->B3SOIFDDum3Ptr) += 1;
*(here->B3SOIFDDum4Ptr) += 1;
*(here->B3SOIFDDum5Ptr) += 1;
}
if (here->B3SOIFDdebugMod > 2)
fclose(fpdebug);
}
}
return(OK);
}

View File

@ -0,0 +1,214 @@
/**********
Copyright 1999 Regents of the University of California. All rights reserved.
Author: 1998 Samuel Fung, Dennis Sinitsky and Stephen Tang
File: b3soifdask.c 98/5/01
**********/
#include "ngspice.h"
#include <stdio.h>
#include <math.h>
#include "ifsim.h"
#include "cktdefs.h"
#include "devdefs.h"
#include "b3soifddef.h"
#include "sperror.h"
#include "suffix.h"
int
B3SOIFDask(ckt,inst,which,value,select)
CKTcircuit *ckt;
GENinstance *inst;
int which;
IFvalue *value;
IFvalue *select;
{
B3SOIFDinstance *here = (B3SOIFDinstance*)inst;
switch(which)
{ case B3SOIFD_L:
value->rValue = here->B3SOIFDl;
return(OK);
case B3SOIFD_W:
value->rValue = here->B3SOIFDw;
return(OK);
case B3SOIFD_AS:
value->rValue = here->B3SOIFDsourceArea;
return(OK);
case B3SOIFD_AD:
value->rValue = here->B3SOIFDdrainArea;
return(OK);
case B3SOIFD_PS:
value->rValue = here->B3SOIFDsourcePerimeter;
return(OK);
case B3SOIFD_PD:
value->rValue = here->B3SOIFDdrainPerimeter;
return(OK);
case B3SOIFD_NRS:
value->rValue = here->B3SOIFDsourceSquares;
return(OK);
case B3SOIFD_NRD:
value->rValue = here->B3SOIFDdrainSquares;
return(OK);
case B3SOIFD_OFF:
value->rValue = here->B3SOIFDoff;
return(OK);
case B3SOIFD_BJTOFF:
value->iValue = here->B3SOIFDbjtoff;
return(OK);
case B3SOIFD_RTH0:
value->rValue = here->B3SOIFDrth0;
return(OK);
case B3SOIFD_CTH0:
value->rValue = here->B3SOIFDcth0;
return(OK);
case B3SOIFD_NRB:
value->rValue = here->B3SOIFDbodySquares;
return(OK);
case B3SOIFD_IC_VBS:
value->rValue = here->B3SOIFDicVBS;
return(OK);
case B3SOIFD_IC_VDS:
value->rValue = here->B3SOIFDicVDS;
return(OK);
case B3SOIFD_IC_VGS:
value->rValue = here->B3SOIFDicVGS;
return(OK);
case B3SOIFD_IC_VES:
value->rValue = here->B3SOIFDicVES;
return(OK);
case B3SOIFD_IC_VPS:
value->rValue = here->B3SOIFDicVPS;
return(OK);
case B3SOIFD_DNODE:
value->iValue = here->B3SOIFDdNode;
return(OK);
case B3SOIFD_GNODE:
value->iValue = here->B3SOIFDgNode;
return(OK);
case B3SOIFD_SNODE:
value->iValue = here->B3SOIFDsNode;
return(OK);
case B3SOIFD_BNODE:
value->iValue = here->B3SOIFDbNode;
return(OK);
case B3SOIFD_ENODE:
value->iValue = here->B3SOIFDeNode;
return(OK);
case B3SOIFD_DNODEPRIME:
value->iValue = here->B3SOIFDdNodePrime;
return(OK);
case B3SOIFD_SNODEPRIME:
value->iValue = here->B3SOIFDsNodePrime;
return(OK);
case B3SOIFD_SOURCECONDUCT:
value->rValue = here->B3SOIFDsourceConductance;
return(OK);
case B3SOIFD_DRAINCONDUCT:
value->rValue = here->B3SOIFDdrainConductance;
return(OK);
case B3SOIFD_VBD:
value->rValue = *(ckt->CKTstate0 + here->B3SOIFDvbd);
return(OK);
case B3SOIFD_VBS:
value->rValue = *(ckt->CKTstate0 + here->B3SOIFDvbs);
return(OK);
case B3SOIFD_VGS:
value->rValue = *(ckt->CKTstate0 + here->B3SOIFDvgs);
return(OK);
case B3SOIFD_VES:
value->rValue = *(ckt->CKTstate0 + here->B3SOIFDves);
return(OK);
case B3SOIFD_VDS:
value->rValue = *(ckt->CKTstate0 + here->B3SOIFDvds);
return(OK);
case B3SOIFD_CD:
value->rValue = here->B3SOIFDcd;
return(OK);
case B3SOIFD_CBS:
value->rValue = here->B3SOIFDcjs;
return(OK);
case B3SOIFD_CBD:
value->rValue = here->B3SOIFDcjd;
return(OK);
case B3SOIFD_GM:
value->rValue = here->B3SOIFDgm;
return(OK);
case B3SOIFD_GMID:
value->rValue = here->B3SOIFDgm/here->B3SOIFDcd;
return(OK);
case B3SOIFD_GDS:
value->rValue = here->B3SOIFDgds;
return(OK);
case B3SOIFD_GMBS:
value->rValue = here->B3SOIFDgmbs;
return(OK);
case B3SOIFD_GBD:
value->rValue = here->B3SOIFDgjdb;
return(OK);
case B3SOIFD_GBS:
value->rValue = here->B3SOIFDgjsb;
return(OK);
case B3SOIFD_QB:
value->rValue = *(ckt->CKTstate0 + here->B3SOIFDqb);
return(OK);
case B3SOIFD_CQB:
value->rValue = *(ckt->CKTstate0 + here->B3SOIFDcqb);
return(OK);
case B3SOIFD_QG:
value->rValue = *(ckt->CKTstate0 + here->B3SOIFDqg);
return(OK);
case B3SOIFD_CQG:
value->rValue = *(ckt->CKTstate0 + here->B3SOIFDcqg);
return(OK);
case B3SOIFD_QD:
value->rValue = *(ckt->CKTstate0 + here->B3SOIFDqd);
return(OK);
case B3SOIFD_CQD:
value->rValue = *(ckt->CKTstate0 + here->B3SOIFDcqd);
return(OK);
case B3SOIFD_CGG:
value->rValue = here->B3SOIFDcggb;
return(OK);
case B3SOIFD_CGD:
value->rValue = here->B3SOIFDcgdb;
return(OK);
case B3SOIFD_CGS:
value->rValue = here->B3SOIFDcgsb;
return(OK);
case B3SOIFD_CDG:
value->rValue = here->B3SOIFDcdgb;
return(OK);
case B3SOIFD_CDD:
value->rValue = here->B3SOIFDcddb;
return(OK);
case B3SOIFD_CDS:
value->rValue = here->B3SOIFDcdsb;
return(OK);
case B3SOIFD_CBG:
value->rValue = here->B3SOIFDcbgb;
return(OK);
case B3SOIFD_CBDB:
value->rValue = here->B3SOIFDcbdb;
return(OK);
case B3SOIFD_CBSB:
value->rValue = here->B3SOIFDcbsb;
return(OK);
case B3SOIFD_VON:
value->rValue = here->B3SOIFDvon;
return(OK);
case B3SOIFD_VDSAT:
value->rValue = here->B3SOIFDvdsat;
return(OK);
case B3SOIFD_QBS:
value->rValue = *(ckt->CKTstate0 + here->B3SOIFDqbs);
return(OK);
case B3SOIFD_QBD:
value->rValue = *(ckt->CKTstate0 + here->B3SOIFDqbd);
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: b3soifdcheck.c 98/5/01
**********/
#include "ngspice.h"
#include <stdio.h>
#include <math.h>
#include "cktdefs.h"
#include "b3soifddef.h"
#include "trandefs.h"
#include "const.h"
#include "sperror.h"
#include "devdefs.h"
#include "suffix.h"
int
B3SOIFDcheckModel(model, here, ckt)
B3SOIFDmodel *model;
B3SOIFDinstance *here;
CKTcircuit *ckt;
{
struct b3soifdSizeDependParam *pParam;
int Fatal_Flag = 0;
FILE *fplog;
if ((fplog = fopen("b3soifdv1check.log", "w")) != NULL)
{ pParam = here->pParam;
fprintf(fplog, "B3SOIFDV3 Parameter Check\n");
fprintf(fplog, "Model = %s\n", model->B3SOIFDmodName);
fprintf(fplog, "W = %g, L = %g\n", here->B3SOIFDw, here->B3SOIFDl);
if (pParam->B3SOIFDnlx < -pParam->B3SOIFDleff)
{ fprintf(fplog, "Fatal: Nlx = %g is less than -Leff.\n",
pParam->B3SOIFDnlx);
printf("Fatal: Nlx = %g is less than -Leff.\n",
pParam->B3SOIFDnlx);
Fatal_Flag = 1;
}
if (model->B3SOIFDtox <= 0.0)
{ fprintf(fplog, "Fatal: Tox = %g is not positive.\n",
model->B3SOIFDtox);
printf("Fatal: Tox = %g is not positive.\n", model->B3SOIFDtox);
Fatal_Flag = 1;
}
if (model->B3SOIFDtbox <= 0.0)
{ fprintf(fplog, "Fatal: Tbox = %g is not positive.\n",
model->B3SOIFDtbox);
printf("Fatal: Tbox = %g is not positive.\n", model->B3SOIFDtbox);
Fatal_Flag = 1;
}
if (pParam->B3SOIFDnpeak <= 0.0)
{ fprintf(fplog, "Fatal: Nch = %g is not positive.\n",
pParam->B3SOIFDnpeak);
printf("Fatal: Nch = %g is not positive.\n",
pParam->B3SOIFDnpeak);
Fatal_Flag = 1;
}
if (pParam->B3SOIFDngate < 0.0)
{ fprintf(fplog, "Fatal: Ngate = %g is not positive.\n",
pParam->B3SOIFDngate);
printf("Fatal: Ngate = %g Ngate is not positive.\n",
pParam->B3SOIFDngate);
Fatal_Flag = 1;
}
if (pParam->B3SOIFDngate > 1.e25)
{ fprintf(fplog, "Fatal: Ngate = %g is too high.\n",
pParam->B3SOIFDngate);
printf("Fatal: Ngate = %g Ngate is too high\n",
pParam->B3SOIFDngate);
Fatal_Flag = 1;
}
if (model->B3SOIFDdvbd1 < 0.0)
{ fprintf(fplog, "Fatal: Dvbd1 = %g is negative.\n",
model->B3SOIFDdvbd1);
printf("Fatal: Dvbd1 = %g is negative.\n", model->B3SOIFDdvbd1);
Fatal_Flag = 1;
}
if (pParam->B3SOIFDdvt1 < 0.0)
{ fprintf(fplog, "Fatal: Dvt1 = %g is negative.\n",
pParam->B3SOIFDdvt1);
printf("Fatal: Dvt1 = %g is negative.\n", pParam->B3SOIFDdvt1);
Fatal_Flag = 1;
}
if (pParam->B3SOIFDdvt1w < 0.0)
{ fprintf(fplog, "Fatal: Dvt1w = %g is negative.\n",
pParam->B3SOIFDdvt1w);
printf("Fatal: Dvt1w = %g is negative.\n", pParam->B3SOIFDdvt1w);
Fatal_Flag = 1;
}
if (pParam->B3SOIFDw0 == -pParam->B3SOIFDweff)
{ 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->B3SOIFDdsub < 0.0)
{ fprintf(fplog, "Fatal: Dsub = %g is negative.\n", pParam->B3SOIFDdsub);
printf("Fatal: Dsub = %g is negative.\n", pParam->B3SOIFDdsub);
Fatal_Flag = 1;
}
if (pParam->B3SOIFDb1 == -pParam->B3SOIFDweff)
{ 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->B3SOIFDu0temp <= 0.0)
{ fprintf(fplog, "Fatal: u0 at current temperature = %g is not positive.\n", pParam->B3SOIFDu0temp);
printf("Fatal: u0 at current temperature = %g is not positive.\n",
pParam->B3SOIFDu0temp);
Fatal_Flag = 1;
}
/* Check delta parameter */
if (pParam->B3SOIFDdelta < 0.0)
{ fprintf(fplog, "Fatal: Delta = %g is less than zero.\n",
pParam->B3SOIFDdelta);
printf("Fatal: Delta = %g is less than zero.\n", pParam->B3SOIFDdelta);
Fatal_Flag = 1;
}
if (pParam->B3SOIFDvsattemp <= 0.0)
{ fprintf(fplog, "Fatal: Vsat at current temperature = %g is not positive.\n", pParam->B3SOIFDvsattemp);
printf("Fatal: Vsat at current temperature = %g is not positive.\n",
pParam->B3SOIFDvsattemp);
Fatal_Flag = 1;
}
/* Check Rout parameters */
if (pParam->B3SOIFDpclm <= 0.0)
{ fprintf(fplog, "Fatal: Pclm = %g is not positive.\n", pParam->B3SOIFDpclm);
printf("Fatal: Pclm = %g is not positive.\n", pParam->B3SOIFDpclm);
Fatal_Flag = 1;
}
if (pParam->B3SOIFDdrout < 0.0)
{ fprintf(fplog, "Fatal: Drout = %g is negative.\n", pParam->B3SOIFDdrout);
printf("Fatal: Drout = %g is negative.\n", pParam->B3SOIFDdrout);
Fatal_Flag = 1;
}
if ( model->B3SOIFDunitLengthGateSidewallJctCap > 0.0)
{
if (here->B3SOIFDdrainPerimeter < pParam->B3SOIFDweff)
{ fprintf(fplog, "Warning: Pd = %g is less than W.\n",
here->B3SOIFDdrainPerimeter);
printf("Warning: Pd = %g is less than W.\n",
here->B3SOIFDdrainPerimeter);
here->B3SOIFDdrainPerimeter =pParam->B3SOIFDweff;
}
if (here->B3SOIFDsourcePerimeter < pParam->B3SOIFDweff)
{ fprintf(fplog, "Warning: Ps = %g is less than W.\n",
here->B3SOIFDsourcePerimeter);
printf("Warning: Ps = %g is less than W.\n",
here->B3SOIFDsourcePerimeter);
here->B3SOIFDsourcePerimeter =pParam->B3SOIFDweff;
}
}
/* Check capacitance parameters */
if (pParam->B3SOIFDclc < 0.0)
{ fprintf(fplog, "Fatal: Clc = %g is negative.\n", pParam->B3SOIFDclc);
printf("Fatal: Clc = %g is negative.\n", pParam->B3SOIFDclc);
Fatal_Flag = 1;
}
if (model->B3SOIFDparamChk ==1)
{
/* Check L and W parameters */
if (pParam->B3SOIFDleff <= 5.0e-8)
{ fprintf(fplog, "Warning: Leff = %g may be too small.\n",
pParam->B3SOIFDleff);
printf("Warning: Leff = %g may be too small.\n",
pParam->B3SOIFDleff);
}
if (pParam->B3SOIFDleffCV <= 5.0e-8)
{ fprintf(fplog, "Warning: Leff for CV = %g may be too small.\n",
pParam->B3SOIFDleffCV);
printf("Warning: Leff for CV = %g may be too small.\n",
pParam->B3SOIFDleffCV);
}
if (pParam->B3SOIFDweff <= 1.0e-7)
{ fprintf(fplog, "Warning: Weff = %g may be too small.\n",
pParam->B3SOIFDweff);
printf("Warning: Weff = %g may be too small.\n",
pParam->B3SOIFDweff);
}
if (pParam->B3SOIFDweffCV <= 1.0e-7)
{ fprintf(fplog, "Warning: Weff for CV = %g may be too small.\n",
pParam->B3SOIFDweffCV);
printf("Warning: Weff for CV = %g may be too small.\n",
pParam->B3SOIFDweffCV);
}
/* Check threshold voltage parameters */
if (pParam->B3SOIFDnlx < 0.0)
{ fprintf(fplog, "Warning: Nlx = %g is negative.\n", pParam->B3SOIFDnlx);
printf("Warning: Nlx = %g is negative.\n", pParam->B3SOIFDnlx);
}
if (model->B3SOIFDtox < 1.0e-9)
{ fprintf(fplog, "Warning: Tox = %g is less than 10A.\n",
model->B3SOIFDtox);
printf("Warning: Tox = %g is less than 10A.\n", model->B3SOIFDtox);
}
if (pParam->B3SOIFDnpeak <= 1.0e15)
{ fprintf(fplog, "Warning: Nch = %g may be too small.\n",
pParam->B3SOIFDnpeak);
printf("Warning: Nch = %g may be too small.\n",
pParam->B3SOIFDnpeak);
}
else if (pParam->B3SOIFDnpeak >= 1.0e21)
{ fprintf(fplog, "Warning: Nch = %g may be too large.\n",
pParam->B3SOIFDnpeak);
printf("Warning: Nch = %g may be too large.\n",
pParam->B3SOIFDnpeak);
}
if (fabs(pParam->B3SOIFDnsub) >= 1.0e21)
{ fprintf(fplog, "Warning: Nsub = %g may be too large.\n",
pParam->B3SOIFDnsub);
printf("Warning: Nsub = %g may be too large.\n",
pParam->B3SOIFDnsub);
}
if ((pParam->B3SOIFDngate > 0.0) &&
(pParam->B3SOIFDngate <= 1.e18))
{ fprintf(fplog, "Warning: Ngate = %g is less than 1.E18cm^-3.\n",
pParam->B3SOIFDngate);
printf("Warning: Ngate = %g is less than 1.E18cm^-3.\n",
pParam->B3SOIFDngate);
}
if (model->B3SOIFDdvbd0 < 0.0)
{ fprintf(fplog, "Warning: Dvbd0 = %g is negative.\n",
model->B3SOIFDdvbd0);
printf("Warning: Dvbd0 = %g is negative.\n", model->B3SOIFDdvbd0);
}
if (pParam->B3SOIFDdvt0 < 0.0)
{ fprintf(fplog, "Warning: Dvt0 = %g is negative.\n",
pParam->B3SOIFDdvt0);
printf("Warning: Dvt0 = %g is negative.\n", pParam->B3SOIFDdvt0);
}
if (fabs(1.0e-6 / (pParam->B3SOIFDw0 + pParam->B3SOIFDweff)) > 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->B3SOIFDnfactor < 0.0)
{ fprintf(fplog, "Warning: Nfactor = %g is negative.\n",
pParam->B3SOIFDnfactor);
printf("Warning: Nfactor = %g is negative.\n", pParam->B3SOIFDnfactor);
}
if (model->B3SOIFDkb3 < 0.0)
{ fprintf(fplog, "Warning: Kb3 = %g is negative.\n",
model->B3SOIFDkb3);
printf("Warning: Kb3 = %g is negative.\n", model->B3SOIFDkb3);
}
if (pParam->B3SOIFDcdsc < 0.0)
{ fprintf(fplog, "Warning: Cdsc = %g is negative.\n",
pParam->B3SOIFDcdsc);
printf("Warning: Cdsc = %g is negative.\n", pParam->B3SOIFDcdsc);
}
if (pParam->B3SOIFDcdscd < 0.0)
{ fprintf(fplog, "Warning: Cdscd = %g is negative.\n",
pParam->B3SOIFDcdscd);
printf("Warning: Cdscd = %g is negative.\n", pParam->B3SOIFDcdscd);
}
/* Check DIBL parameters */
if (pParam->B3SOIFDeta0 < 0.0)
{ fprintf(fplog, "Warning: Eta0 = %g is negative.\n",
pParam->B3SOIFDeta0);
printf("Warning: Eta0 = %g is negative.\n", pParam->B3SOIFDeta0);
}
/* Check Abulk parameters */
if (fabs(1.0e-6 / (pParam->B3SOIFDb1 + pParam->B3SOIFDweff)) > 10.0)
{ fprintf(fplog, "Warning: (B1 + Weff) may be too small.\n");
printf("Warning: (B1 + Weff) may be too small.\n");
}
if (model->B3SOIFDadice0 > 1.0)
{ fprintf(fplog, "Warning: Adice0 = %g should be smaller than 1.\n",
model->B3SOIFDadice0);
printf("Warning: Adice0 = %g should be smaller than 1.\n", model->B3SOIFDadice0);
}
if (model->B3SOIFDabp < 0.2)
{ fprintf(fplog, "Warning: Abp = %g is too small.\n",
model->B3SOIFDabp);
printf("Warning: Abp = %g is too small.\n", model->B3SOIFDabp);
}
if ((model->B3SOIFDmxc < -1.0) || (model->B3SOIFDmxc > 1.0))
{ fprintf(fplog, "Warning: Mxc = %g should be within (-1, 1).\n",
model->B3SOIFDmxc);
printf("Warning: Mxc = %g should be within (-1, 1).\n", model->B3SOIFDmxc);
}
/* Check Saturation parameters */
if (pParam->B3SOIFDa2 < 0.01)
{ fprintf(fplog, "Warning: A2 = %g is too small. Set to 0.01.\n", pParam->B3SOIFDa2);
printf("Warning: A2 = %g is too small. Set to 0.01.\n",
pParam->B3SOIFDa2);
pParam->B3SOIFDa2 = 0.01;
}
else if (pParam->B3SOIFDa2 > 1.0)
{ fprintf(fplog, "Warning: A2 = %g is larger than 1. A2 is set to 1 and A1 is set to 0.\n",
pParam->B3SOIFDa2);
printf("Warning: A2 = %g is larger than 1. A2 is set to 1 and A1 is set to 0.\n",
pParam->B3SOIFDa2);
pParam->B3SOIFDa2 = 1.0;
pParam->B3SOIFDa1 = 0.0;
}
if (pParam->B3SOIFDrdsw < 0.0)
{ fprintf(fplog, "Warning: Rdsw = %g is negative. Set to zero.\n",
pParam->B3SOIFDrdsw);
printf("Warning: Rdsw = %g is negative. Set to zero.\n",
pParam->B3SOIFDrdsw);
pParam->B3SOIFDrdsw = 0.0;
pParam->B3SOIFDrds0 = 0.0;
}
else if ((pParam->B3SOIFDrds0 > 0.0) && (pParam->B3SOIFDrds0 < 0.001))
{ fprintf(fplog, "Warning: Rds at current temperature = %g is less than 0.001 ohm. Set to zero.\n",
pParam->B3SOIFDrds0);
printf("Warning: Rds at current temperature = %g is less than 0.001 ohm. Set to zero.\n",
pParam->B3SOIFDrds0);
pParam->B3SOIFDrds0 = 0.0;
}
if (pParam->B3SOIFDvsattemp < 1.0e3)
{ fprintf(fplog, "Warning: Vsat at current temperature = %g may be too small.\n", pParam->B3SOIFDvsattemp);
printf("Warning: Vsat at current temperature = %g may be too small.\n", pParam->B3SOIFDvsattemp);
}
if (pParam->B3SOIFDpdibl1 < 0.0)
{ fprintf(fplog, "Warning: Pdibl1 = %g is negative.\n",
pParam->B3SOIFDpdibl1);
printf("Warning: Pdibl1 = %g is negative.\n", pParam->B3SOIFDpdibl1);
}
if (pParam->B3SOIFDpdibl2 < 0.0)
{ fprintf(fplog, "Warning: Pdibl2 = %g is negative.\n",
pParam->B3SOIFDpdibl2);
printf("Warning: Pdibl2 = %g is negative.\n", pParam->B3SOIFDpdibl2);
}
/* Check overlap capacitance parameters */
if (model->B3SOIFDcgdo < 0.0)
{ fprintf(fplog, "Warning: cgdo = %g is negative. Set to zero.\n", model->B3SOIFDcgdo);
printf("Warning: cgdo = %g is negative. Set to zero.\n", model->B3SOIFDcgdo);
model->B3SOIFDcgdo = 0.0;
}
if (model->B3SOIFDcgso < 0.0)
{ fprintf(fplog, "Warning: cgso = %g is negative. Set to zero.\n", model->B3SOIFDcgso);
printf("Warning: cgso = %g is negative. Set to zero.\n", model->B3SOIFDcgso);
model->B3SOIFDcgso = 0.0;
}
if (model->B3SOIFDcgeo < 0.0)
{ fprintf(fplog, "Warning: cgeo = %g is negative. Set to zero.\n", model->B3SOIFDcgeo);
printf("Warning: cgeo = %g is negative. Set to zero.\n", model->B3SOIFDcgeo);
model->B3SOIFDcgeo = 0.0;
}
if (model->B3SOIFDntun < 0.0)
{ fprintf(fplog, "Warning: Ntun = %g is negative.\n",
model->B3SOIFDntun);
printf("Warning: Ntun = %g is negative.\n", model->B3SOIFDntun);
}
if (model->B3SOIFDndiode < 0.0)
{ fprintf(fplog, "Warning: Ndiode = %g is negative.\n",
model->B3SOIFDndiode);
printf("Warning: Ndiode = %g is negative.\n", model->B3SOIFDndiode);
}
if (model->B3SOIFDisbjt < 0.0)
{ fprintf(fplog, "Warning: Isbjt = %g is negative.\n",
model->B3SOIFDisbjt);
printf("Warning: Isbjt = %g is negative.\n", model->B3SOIFDisbjt);
}
if (model->B3SOIFDisdif < 0.0)
{ fprintf(fplog, "Warning: Isdif = %g is negative.\n",
model->B3SOIFDisdif);
printf("Warning: Isdif = %g is negative.\n", model->B3SOIFDisdif);
}
if (model->B3SOIFDisrec < 0.0)
{ fprintf(fplog, "Warning: Isrec = %g is negative.\n",
model->B3SOIFDisrec);
printf("Warning: Isrec = %g is negative.\n", model->B3SOIFDisrec);
}
if (model->B3SOIFDistun < 0.0)
{ fprintf(fplog, "Warning: Istun = %g is negative.\n",
model->B3SOIFDistun);
printf("Warning: Istun = %g is negative.\n", model->B3SOIFDistun);
}
if (model->B3SOIFDedl < 0.0)
{ fprintf(fplog, "Warning: Edl = %g is negative.\n",
model->B3SOIFDedl);
printf("Warning: Edl = %g is negative.\n", model->B3SOIFDedl);
}
if (model->B3SOIFDkbjt1 < 0.0)
{ fprintf(fplog, "Warning: Kbjt1 = %g is negative.\n",
model->B3SOIFDkbjt1);
printf("Warning: kbjt1 = %g is negative.\n", model->B3SOIFDkbjt1);
}
if (model->B3SOIFDtt < 0.0)
{ fprintf(fplog, "Warning: Tt = %g is negative.\n",
model->B3SOIFDtt);
printf("Warning: Tt = %g is negative.\n", model->B3SOIFDtt);
}
if (model->B3SOIFDcsdmin < 0.0)
{ fprintf(fplog, "Warning: Csdmin = %g is negative.\n",
model->B3SOIFDcsdmin);
printf("Warning: Csdmin = %g is negative.\n", model->B3SOIFDcsdmin);
}
if (model->B3SOIFDcsdesw < 0.0)
{ fprintf(fplog, "Warning: Csdesw = %g is negative.\n",
model->B3SOIFDcsdesw);
printf("Warning: Csdesw = %g is negative.\n", model->B3SOIFDcsdesw);
}
if ((model->B3SOIFDasd < 0.0) || (model->B3SOIFDmxc > 1.0))
{ fprintf(fplog, "Warning: Asd = %g should be within (0, 1).\n",
model->B3SOIFDasd);
printf("Warning: Asd = %g should be within (0, 1).\n", model->B3SOIFDasd);
}
if (model->B3SOIFDrth0 < 0.0)
{ fprintf(fplog, "Warning: Rth0 = %g is negative.\n",
model->B3SOIFDrth0);
printf("Warning: Rth0 = %g is negative.\n", model->B3SOIFDrth0);
}
if (model->B3SOIFDcth0 < 0.0)
{ fprintf(fplog, "Warning: Cth0 = %g is negative.\n",
model->B3SOIFDcth0);
printf("Warning: Cth0 = %g is negative.\n", model->B3SOIFDcth0);
}
if (model->B3SOIFDrbody < 0.0)
{ fprintf(fplog, "Warning: Rbody = %g is negative.\n",
model->B3SOIFDrbody);
printf("Warning: Rbody = %g is negative.\n", model->B3SOIFDrbody);
}
if (model->B3SOIFDrbsh < 0.0)
{ fprintf(fplog, "Warning: Rbsh = %g is negative.\n",
model->B3SOIFDrbsh);
printf("Warning: Rbsh = %g is negative.\n", model->B3SOIFDrbsh);
}
if (model->B3SOIFDxj > model->B3SOIFDtsi)
{ fprintf(fplog, "Warning: Xj = %g is thicker than Tsi = %g.\n",
model->B3SOIFDxj, model->B3SOIFDtsi);
printf("Warning: Xj = %g is thicker than Tsi = %g.\n",
model->B3SOIFDxj, model->B3SOIFDtsi);
}
if (model->B3SOIFDcapMod < 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->B3SOIFDcii > 2.0)
{ fprintf(fplog, "Warning: Cii = %g is larger than 2.0.\n", model->B3SOIFDcii);
printf("Warning: Cii = %g is larger than 2.0.\n", model->B3SOIFDcii);
}
if (model->B3SOIFDdii > 1.5)
{ fprintf(fplog, "Warning: Dii = %g is larger than 1.5.\n", model->B3SOIFDcii);
printf("Warning: Dii = %g is too larger than 1.5.\n", model->B3SOIFDcii);
}
}/* 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: b3soifdcvtest.c 98/5/01
**********/
#include "ngspice.h"
#include <stdio.h>
#include <math.h>
#include "cktdefs.h"
#include "b3soifddef.h"
#include "trandefs.h"
#include "const.h"
#include "devdefs.h"
#include "sperror.h"
#include "suffix.h"
int
B3SOIFDconvTest(inModel,ckt)
GENmodel *inModel;
CKTcircuit *ckt;
{
B3SOIFDmodel *model = (B3SOIFDmodel*)inModel;
B3SOIFDinstance *here;
double delvbd, delvbs, delvds, delvgd, delvgs, vbd, vbs, vds;
double cbd, cbhat, cbs, cd, cdhat, tol, vgd, vgdo, vgs;
/* loop through all the B3SOIFD device models */
for (; model != NULL; model = model->B3SOIFDnextModel)
{ /* loop through all the instances of the model */
for (here = model->B3SOIFDinstances; here != NULL ;
here=here->B3SOIFDnextInstance)
{ vbs = model->B3SOIFDtype
* (*(ckt->CKTrhsOld+here->B3SOIFDbNode)
- *(ckt->CKTrhsOld+here->B3SOIFDsNodePrime));
vgs = model->B3SOIFDtype
* (*(ckt->CKTrhsOld+here->B3SOIFDgNode)
- *(ckt->CKTrhsOld+here->B3SOIFDsNodePrime));
vds = model->B3SOIFDtype
* (*(ckt->CKTrhsOld+here->B3SOIFDdNodePrime)
- *(ckt->CKTrhsOld+here->B3SOIFDsNodePrime));
vbd = vbs - vds;
vgd = vgs - vds;
vgdo = *(ckt->CKTstate0 + here->B3SOIFDvgs)
- *(ckt->CKTstate0 + here->B3SOIFDvds);
delvbs = vbs - *(ckt->CKTstate0 + here->B3SOIFDvbs);
delvbd = vbd - *(ckt->CKTstate0 + here->B3SOIFDvbd);
delvgs = vgs - *(ckt->CKTstate0 + here->B3SOIFDvgs);
delvds = vds - *(ckt->CKTstate0 + here->B3SOIFDvds);
delvgd = vgd-vgdo;
cd = here->B3SOIFDcd;
if (here->B3SOIFDmode >= 0)
{ cdhat = cd - here->B3SOIFDgjdb * delvbd
+ here->B3SOIFDgmbs * delvbs + here->B3SOIFDgm * delvgs
+ here->B3SOIFDgds * delvds;
}
else
{ cdhat = cd - (here->B3SOIFDgjdb - here->B3SOIFDgmbs) * delvbd
- here->B3SOIFDgm * delvgd + here->B3SOIFDgds * delvds;
}
/*
* check convergence
*/
if ((here->B3SOIFDoff == 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->B3SOIFDcjs;
cbd = here->B3SOIFDcjd;
cbhat = cbs + cbd + here->B3SOIFDgjdb * delvbd
+ here->B3SOIFDgjsb * 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: b3soifddel.c 98/5/01
**********/
#include "ngspice.h"
#include <stdio.h>
#include "b3soifddef.h"
#include "sperror.h"
#include "gendefs.h"
#include "suffix.h"
int
B3SOIFDdelete(inModel,name,inInst)
GENmodel *inModel;
IFuid name;
GENinstance **inInst;
{
B3SOIFDinstance **fast = (B3SOIFDinstance**)inInst;
B3SOIFDmodel *model = (B3SOIFDmodel*)inModel;
B3SOIFDinstance **prev = NULL;
B3SOIFDinstance *here;
for (; model ; model = model->B3SOIFDnextModel)
{ prev = &(model->B3SOIFDinstances);
for (here = *prev; here ; here = *prev)
{ if (here->B3SOIFDname == name || (fast && here==*fast))
{ *prev= here->B3SOIFDnextInstance;
FREE(here);
return(OK);
}
prev = &(here->B3SOIFDnextInstance);
}
}
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: b3soifddest.c 98/5/01
**********/
#include "ngspice.h"
#include <stdio.h>
#include "b3soifddef.h"
#include "suffix.h"
void
B3SOIFDdestroy(inModel)
GENmodel **inModel;
{
B3SOIFDmodel **model = (B3SOIFDmodel**)inModel;
B3SOIFDinstance *here;
B3SOIFDinstance *prev = NULL;
B3SOIFDmodel *mod = *model;
B3SOIFDmodel *oldmod = NULL;
for (; mod ; mod = mod->B3SOIFDnextModel)
{ if(oldmod) FREE(oldmod);
oldmod = mod;
prev = (B3SOIFDinstance *)NULL;
for (here = mod->B3SOIFDinstances; here; here = here->B3SOIFDnextInstance)
{ if(prev) FREE(prev);
prev = here;
}
if(prev) FREE(prev);
}
if(oldmod) FREE(oldmod);
*model = NULL;
return;
}

View File

@ -0,0 +1,53 @@
/**********
Copyright 1999 Regents of the University of California. All rights reserved.
Author: 1998 Samuel Fung
File: b3soifdext.h
**********/
#ifdef __STDC__
extern int B3SOIFDacLoad(GENmodel *,CKTcircuit*);
extern int B3SOIFDask(CKTcircuit *,GENinstance*,int,IFvalue*,IFvalue*);
extern int B3SOIFDconvTest(GENmodel *,CKTcircuit*);
extern int B3SOIFDdelete(GENmodel*,IFuid,GENinstance**);
extern void B3SOIFDdestroy(GENmodel**);
extern int B3SOIFDgetic(GENmodel*,CKTcircuit*);
extern int B3SOIFDload(GENmodel*,CKTcircuit*);
extern int B3SOIFDmAsk(CKTcircuit*,GENmodel *,int, IFvalue*);
extern int B3SOIFDmDelete(GENmodel**,IFuid,GENmodel*);
extern int B3SOIFDmParam(int,IFvalue*,GENmodel*);
extern void B3SOIFDmosCap(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 B3SOIFDparam(int,IFvalue*,GENinstance*,IFvalue*);
extern int B3SOIFDpzLoad(GENmodel*,CKTcircuit*,SPcomplex*);
extern int B3SOIFDsetup(SMPmatrix*,GENmodel*,CKTcircuit*,int*);
extern int B3SOIFDtemp(GENmodel*,CKTcircuit*);
extern int B3SOIFDtrunc(GENmodel*,CKTcircuit*,double*);
extern int B3SOIFDnoise(int,int,GENmodel*,CKTcircuit*,Ndata*,double*);
extern int B3SOIFDunsetup(GENmodel*,CKTcircuit*);
#else /* stdc */
extern int B3SOIFDacLoad();
extern int B3SOIFDdelete();
extern void B3SOIFDdestroy();
extern int B3SOIFDgetic();
extern int B3SOIFDload();
extern int B3SOIFDmDelete();
extern int B3SOIFDask();
extern int B3SOIFDmAsk();
extern int B3SOIFDconvTest();
extern int B3SOIFDtemp();
extern int B3SOIFDmParam();
extern void B3SOIFDmosCap();
extern int B3SOIFDparam();
extern int B3SOIFDpzLoad();
extern int B3SOIFDsetup();
extern int B3SOIFDtrunc();
extern int B3SOIFDnoise();
extern int B3SOIFDunsetup();
#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: b3soifdgetic.c 98/5/01
**********/
#include "ngspice.h"
#include <stdio.h>
#include "cktdefs.h"
#include "b3soifddef.h"
#include "sperror.h"
#include "suffix.h"
int
B3SOIFDgetic(inModel,ckt)
GENmodel *inModel;
CKTcircuit *ckt;
{
B3SOIFDmodel *model = (B3SOIFDmodel*)inModel;
B3SOIFDinstance *here;
for (; model ; model = model->B3SOIFDnextModel)
{ for (here = model->B3SOIFDinstances; here; here = here->B3SOIFDnextInstance)
{ if(!here->B3SOIFDicVBSGiven)
{ here->B3SOIFDicVBS = *(ckt->CKTrhs + here->B3SOIFDbNode)
- *(ckt->CKTrhs + here->B3SOIFDsNode);
}
if (!here->B3SOIFDicVDSGiven)
{ here->B3SOIFDicVDS = *(ckt->CKTrhs + here->B3SOIFDdNode)
- *(ckt->CKTrhs + here->B3SOIFDsNode);
}
if (!here->B3SOIFDicVGSGiven)
{ here->B3SOIFDicVGS = *(ckt->CKTrhs + here->B3SOIFDgNode)
- *(ckt->CKTrhs + here->B3SOIFDsNode);
}
if (!here->B3SOIFDicVESGiven)
{ here->B3SOIFDicVES = *(ckt->CKTrhs + here->B3SOIFDeNode)
- *(ckt->CKTrhs + here->B3SOIFDsNode);
}
if (!here->B3SOIFDicVPSGiven)
{ here->B3SOIFDicVPS = *(ckt->CKTrhs + here->B3SOIFDpNode)
- *(ckt->CKTrhs + here->B3SOIFDsNode);
}
}
}
return(OK);
}

View File

@ -0,0 +1,65 @@
#include <config.h>
#include <devdefs.h>
#include "b3soifditf.h"
#include "b3soifdext.h"
#include "b3soifdinit.h"
SPICEdev B3SOIFDinfo = {
{ "B3SOIFD",
"Berkeley SOI MOSFET (FD) model version 1.0",
&B3SOIFDnSize,
&B3SOIFDnSize,
B3SOIFDnames,
&B3SOIFDpTSize,
B3SOIFDpTable,
&B3SOIFDmPTSize,
B3SOIFDmPTable,
DEV_DEFAULT}
,
DEVparam: B3SOIFDparam,
DEVmodParam: B3SOIFDmParam,
DEVload: B3SOIFDload,
DEVsetup: B3SOIFDsetup,
DEVunsetup: B3SOIFDunsetup,
DEVpzSetup: B3SOIFDsetup,
DEVtemperature:B3SOIFDtemp,
DEVtrunc: B3SOIFDtrunc,
DEVfindBranch: NULL,
DEVacLoad: B3SOIFDacLoad,
DEVaccept: NULL,
DEVdestroy: B3SOIFDdestroy,
DEVmodDelete: B3SOIFDmDelete,
DEVdelete: B3SOIFDdelete,
DEVsetic: B3SOIFDgetic,
DEVask: B3SOIFDask,
DEVmodAsk: B3SOIFDmAsk,
DEVpzLoad: B3SOIFDpzLoad,
DEVconvTest: B3SOIFDconvTest,
DEVsenSetup: NULL,
DEVsenLoad: NULL,
DEVsenUpdate: NULL,
DEVsenAcLoad: NULL,
DEVsenPrint: NULL,
DEVsenTrunc: NULL,
DEVdisto: NULL,
DEVnoise: B3SOIFDnoise,
DEVinstSize: &B3SOIFDiSize,
DEVmodSize: &B3SOIFDmSize
};
SPICEdev *
get_b3soifd_info (void)
{
return &B3SOIFDinfo;
}

View File

@ -0,0 +1,13 @@
#ifndef _B3SOIFDINIT_H
#define _B3SOIFDINIT_H
extern IFparm B3SOIFDpTable[];
extern IFparm B3SOIFDmPTable[];
extern char *B3SOIFDnames[];
extern int B3SOIFDpTSize;
extern int B3SOIFDmPTSize;
extern int B3SOIFDnSize;
extern int B3SOIFDiSize;
extern int B3SOIFDmSize;
#endif

View File

@ -0,0 +1,14 @@
/**********
Copyright 1999 Regents of the University of California. All rights reserved.
Author: 1998 Samuel Fung
File: b3soifditf.h
**********/
#ifndef DEV_B3SOIFD
#define DEV_B3SOIFD
#include "b3soifdext.h"
SPICEdev *get_b3soifd_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,47 @@
/**********
Copyright 1999 Regents of the University of California. All rights reserved.
Author: 1998 Samuel Fung, Dennis Sinitsky and Stephen Tang
File: b3soifdmdel.c 98/5/01
**********/
#include "ngspice.h"
#include <stdio.h>
#include "b3soifddef.h"
#include "sperror.h"
#include "suffix.h"
int
B3SOIFDmDelete(inModel,modname,kill)
GENmodel **inModel;
IFuid modname;
GENmodel *kill;
{
B3SOIFDmodel **model = (B3SOIFDmodel**)inModel;
B3SOIFDmodel *modfast = (B3SOIFDmodel*)kill;
B3SOIFDinstance *here;
B3SOIFDinstance *prev = NULL;
B3SOIFDmodel **oldmod;
oldmod = model;
for (; *model ; model = &((*model)->B3SOIFDnextModel))
{ if ((*model)->B3SOIFDmodName == modname ||
(modfast && *model == modfast))
goto delgot;
oldmod = model;
}
return(E_NOMOD);
delgot:
*oldmod = (*model)->B3SOIFDnextModel; /* cut deleted device out of list */
for (here = (*model)->B3SOIFDinstances; here; here = here->B3SOIFDnextInstance)
{ 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,392 @@
/**********
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: b3soifdnoi.c 98/5/01
**********/
#include "ngspice.h"
#include <stdio.h>
#include <math.h>
#include "b3soifddef.h"
#include "cktdefs.h"
#include "iferrmsg.h"
#include "noisedef.h"
#include "suffix.h"
#include "const.h" /* jwan */
/*
* B3SOIFDnoise (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->B3SOIFDnoiMod.
If model->B3SOIFDnoiMod = 1,
Channel thermal noise = SPICE2 model
Flicker noise = SPICE2 model
If model->B3SOIFDnoiMod = 2,
Channel thermal noise = B3SOIFD model
Flicker noise = B3SOIFD model
If model->B3SOIFDnoiMod = 3,
Channel thermal noise = SPICE2 model
Flicker noise = B3SOIFD model
If model->B3SOIFDnoiMod = 4,
Channel thermal noise = B3SOIFD model
Flicker noise = SPICE2 model
*/
extern void NevalSrc();
extern double Nintegrate();
double
B3SOIFDStrongInversionNoiseEval(vgs, vds, model, here, freq, temp)
double vgs, vds, freq, temp;
B3SOIFDmodel *model;
B3SOIFDinstance *here;
{
struct b3soifdSizeDependParam *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->B3SOIFDcd);
if (vds > here->B3SOIFDvdsat)
{ esat = 2.0 * pParam->B3SOIFDvsattemp / here->B3SOIFDueff;
T0 = ((((vds - here->B3SOIFDvdsat) / pParam->B3SOIFDlitl) + model->B3SOIFDem)
/ esat);
DelClm = pParam->B3SOIFDlitl * log (MAX(T0, N_MINLOG));
}
else
DelClm = 0.0;
EffFreq = pow(freq, model->B3SOIFDef);
T1 = CHARGE * CHARGE * 8.62e-5 * cd * temp * here->B3SOIFDueff;
T2 = 1.0e8 * EffFreq * model->B3SOIFDcox
* pParam->B3SOIFDleff * pParam->B3SOIFDleff;
Vgst = vgs - here->B3SOIFDvon;
N0 = model->B3SOIFDcox * Vgst / CHARGE;
if (N0 < 0.0)
N0 = 0.0;
Nl = model->B3SOIFDcox * (Vgst - MIN(vds, here->B3SOIFDvdsat)) / CHARGE;
if (Nl < 0.0)
Nl = 0.0;
T3 = model->B3SOIFDoxideTrapDensityA
* log(MAX(((N0 + 2.0e14) / (Nl + 2.0e14)), N_MINLOG));
T4 = model->B3SOIFDoxideTrapDensityB * (N0 - Nl);
T5 = model->B3SOIFDoxideTrapDensityC * 0.5 * (N0 * N0 - Nl * Nl);
T6 = 8.62e-5 * temp * cd * cd;
T7 = 1.0e8 * EffFreq * pParam->B3SOIFDleff
* pParam->B3SOIFDleff * pParam->B3SOIFDweff;
T8 = model->B3SOIFDoxideTrapDensityA + model->B3SOIFDoxideTrapDensityB * Nl
+ model->B3SOIFDoxideTrapDensityC * Nl * Nl;
T9 = (Nl + 2.0e14) * (Nl + 2.0e14);
Ssi = T1 / T2 * (T3 + T4 + T5) + T6 / T7 * DelClm * T8 / T9;
return Ssi;
}
int
B3SOIFDnoise (mode, operation, inModel, ckt, data, OnDens)
int mode, operation;
GENmodel *inModel;
CKTcircuit *ckt;
Ndata *data;
double *OnDens;
{
B3SOIFDmodel *model = (B3SOIFDmodel *)inModel;
B3SOIFDinstance *here;
struct b3soifdSizeDependParam *pParam;
char name[N_MXVLNTH];
double tempOnoise;
double tempInoise;
double noizDens[B3SOIFDNSRCS];
double lnNdens[B3SOIFDNSRCS];
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 *B3SOIFDnNames[B3SOIFDNSRCS] =
{ /* Note that we have to keep the order */
".rd", /* noise due to rd */
/* consistent with the index definitions */
".rs", /* noise due to rs */
/* in B3SOIFDdefs.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->B3SOIFDnextModel)
{ for (here = model->B3SOIFDinstances; here != NULL;
here = here->B3SOIFDnextInstance)
{ 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 < B3SOIFDNSRCS; i++)
{ (void) sprintf(name, "onoise.%s%s",
here->B3SOIFDname,
B3SOIFDnNames[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 < B3SOIFDNSRCS; i++)
{ (void) sprintf(name, "onoise_total.%s%s",
here->B3SOIFDname,
B3SOIFDnNames[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->B3SOIFDname,
B3SOIFDnNames[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[B3SOIFDRDNOIZ],
&lnNdens[B3SOIFDRDNOIZ], ckt, THERMNOISE,
here->B3SOIFDdNodePrime, here->B3SOIFDdNode,
here->B3SOIFDdrainConductance);
NevalSrc(&noizDens[B3SOIFDRSNOIZ],
&lnNdens[B3SOIFDRSNOIZ], ckt, THERMNOISE,
here->B3SOIFDsNodePrime, here->B3SOIFDsNode,
here->B3SOIFDsourceConductance);
switch( model->B3SOIFDnoiMod )
{ case 1:
case 3:
NevalSrc(&noizDens[B3SOIFDIDNOIZ],
&lnNdens[B3SOIFDIDNOIZ], ckt,
THERMNOISE, here->B3SOIFDdNodePrime,
here->B3SOIFDsNodePrime,
(2.0 / 3.0 * fabs(here->B3SOIFDgm
+ here->B3SOIFDgds
+ here->B3SOIFDgmbs)));
break;
case 2:
case 4:
NevalSrc(&noizDens[B3SOIFDIDNOIZ],
&lnNdens[B3SOIFDIDNOIZ], ckt,
THERMNOISE, here->B3SOIFDdNodePrime,
here->B3SOIFDsNodePrime,
(here->B3SOIFDueff
* fabs(here->B3SOIFDqinv
/ (pParam->B3SOIFDleff
* pParam->B3SOIFDleff))));
break;
}
NevalSrc(&noizDens[B3SOIFDFLNOIZ], (double*) NULL,
ckt, N_GAIN, here->B3SOIFDdNodePrime,
here->B3SOIFDsNodePrime, (double) 0.0);
switch( model->B3SOIFDnoiMod )
{ case 1:
case 4:
noizDens[B3SOIFDFLNOIZ] *= model->B3SOIFDkf
* exp(model->B3SOIFDaf
* log(MAX(fabs(here->B3SOIFDcd),
N_MINLOG)))
/ (pow(data->freq, model->B3SOIFDef)
* pParam->B3SOIFDleff
* pParam->B3SOIFDleff
* model->B3SOIFDcox);
break;
case 2:
case 3:
vgs = *(ckt->CKTstates[0] + here->B3SOIFDvgs);
vds = *(ckt->CKTstates[0] + here->B3SOIFDvds);
if (vds < 0.0)
{ vds = -vds;
vgs = vgs + vds;
}
if (vgs >= here->B3SOIFDvon + 0.1)
{ Ssi = B3SOIFDStrongInversionNoiseEval(vgs,
vds, model, here, data->freq,
ckt->CKTtemp);
noizDens[B3SOIFDFLNOIZ] *= Ssi;
}
else
{ pParam = here->pParam;
T10 = model->B3SOIFDoxideTrapDensityA
* 8.62e-5 * ckt->CKTtemp;
T11 = pParam->B3SOIFDweff
* pParam->B3SOIFDleff
* pow(data->freq, model->B3SOIFDef)
* 4.0e36;
Swi = T10 / T11 * here->B3SOIFDcd
* here->B3SOIFDcd;
Slimit = B3SOIFDStrongInversionNoiseEval(
here->B3SOIFDvon + 0.1, vds, model,
here, data->freq, ckt->CKTtemp);
T1 = Swi + Slimit;
if (T1 > 0.0)
noizDens[B3SOIFDFLNOIZ] *= (Slimit
* Swi) / T1;
else
noizDens[B3SOIFDFLNOIZ] *= 0.0;
}
break;
}
lnNdens[B3SOIFDFLNOIZ] =
log(MAX(noizDens[B3SOIFDFLNOIZ], N_MINLOG));
/* Low frequency excess noise due to FBE */
noizDens[B3SOIFDFBNOIZ] = 0.0;
noizDens[B3SOIFDTOTNOIZ] = noizDens[B3SOIFDRDNOIZ]
+ noizDens[B3SOIFDRSNOIZ]
+ noizDens[B3SOIFDIDNOIZ]
+ noizDens[B3SOIFDFLNOIZ]
+ noizDens[B3SOIFDFBNOIZ];
lnNdens[B3SOIFDTOTNOIZ] =
log(MAX(noizDens[B3SOIFDTOTNOIZ], N_MINLOG));
*OnDens += noizDens[B3SOIFDTOTNOIZ];
if (data->delFreq == 0.0)
{ /* if we haven't done any previous
integration, we need to initialize our
"history" variables.
*/
for (i = 0; i < B3SOIFDNSRCS; i++)
{ here->B3SOIFDnVar[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 < B3SOIFDNSRCS; i++)
{ here->B3SOIFDnVar[OUTNOIZ][i] = 0.0;
here->B3SOIFDnVar[INNOIZ][i] = 0.0;
}
}
}
else
{ /* data->delFreq != 0.0,
we have to integrate.
*/
for (i = 0; i < B3SOIFDNSRCS; i++)
{ if (i != B3SOIFDTOTNOIZ)
{ tempOnoise = Nintegrate(noizDens[i],
lnNdens[i],
here->B3SOIFDnVar[LNLSTDENS][i],
data);
tempInoise = Nintegrate(noizDens[i]
* data->GainSqInv, lnNdens[i]
+ data->lnGainInv,
here->B3SOIFDnVar[LNLSTDENS][i]
+ data->lnGainInv, data);
here->B3SOIFDnVar[LNLSTDENS][i] =
lnNdens[i];
data->outNoiz += tempOnoise;
data->inNoise += tempInoise;
if (((NOISEAN*)
ckt->CKTcurJob)->NStpsSm != 0)
{ here->B3SOIFDnVar[OUTNOIZ][i]
+= tempOnoise;
here->B3SOIFDnVar[OUTNOIZ][B3SOIFDTOTNOIZ]
+= tempOnoise;
here->B3SOIFDnVar[INNOIZ][i]
+= tempInoise;
here->B3SOIFDnVar[INNOIZ][B3SOIFDTOTNOIZ]
+= tempInoise;
}
}
}
}
if (data->prtSummary)
{ for (i = 0; i < B3SOIFDNSRCS; 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 < B3SOIFDNSRCS; i++)
{ data->outpVector[data->outNumber++]
= here->B3SOIFDnVar[OUTNOIZ][i];
data->outpVector[data->outNumber++]
= here->B3SOIFDnVar[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: b3soifdpar.c 98/5/01
**********/
#include "ngspice.h"
#include <stdio.h>
#include "ifsim.h"
#include "b3soifddef.h"
#include "sperror.h"
#include "suffix.h"
int
B3SOIFDparam(param,value,inst,select)
int param;
IFvalue *value;
GENinstance *inst;
IFvalue *select;
{
B3SOIFDinstance *here = (B3SOIFDinstance*)inst;
switch(param)
{ case B3SOIFD_W:
here->B3SOIFDw = value->rValue;
here->B3SOIFDwGiven = TRUE;
break;
case B3SOIFD_L:
here->B3SOIFDl = value->rValue;
here->B3SOIFDlGiven = TRUE;
break;
case B3SOIFD_AS:
here->B3SOIFDsourceArea = value->rValue;
here->B3SOIFDsourceAreaGiven = TRUE;
break;
case B3SOIFD_AD:
here->B3SOIFDdrainArea = value->rValue;
here->B3SOIFDdrainAreaGiven = TRUE;
break;
case B3SOIFD_PS:
here->B3SOIFDsourcePerimeter = value->rValue;
here->B3SOIFDsourcePerimeterGiven = TRUE;
break;
case B3SOIFD_PD:
here->B3SOIFDdrainPerimeter = value->rValue;
here->B3SOIFDdrainPerimeterGiven = TRUE;
break;
case B3SOIFD_NRS:
here->B3SOIFDsourceSquares = value->rValue;
here->B3SOIFDsourceSquaresGiven = TRUE;
break;
case B3SOIFD_NRD:
here->B3SOIFDdrainSquares = value->rValue;
here->B3SOIFDdrainSquaresGiven = TRUE;
break;
case B3SOIFD_OFF:
here->B3SOIFDoff = value->iValue;
break;
case B3SOIFD_IC_VBS:
here->B3SOIFDicVBS = value->rValue;
here->B3SOIFDicVBSGiven = TRUE;
break;
case B3SOIFD_IC_VDS:
here->B3SOIFDicVDS = value->rValue;
here->B3SOIFDicVDSGiven = TRUE;
break;
case B3SOIFD_IC_VGS:
here->B3SOIFDicVGS = value->rValue;
here->B3SOIFDicVGSGiven = TRUE;
break;
case B3SOIFD_IC_VES:
here->B3SOIFDicVES = value->rValue;
here->B3SOIFDicVESGiven = TRUE;
break;
case B3SOIFD_IC_VPS:
here->B3SOIFDicVPS = value->rValue;
here->B3SOIFDicVPSGiven = TRUE;
break;
case B3SOIFD_BJTOFF:
here->B3SOIFDbjtoff = value->iValue;
here->B3SOIFDbjtoffGiven= TRUE;
break;
case B3SOIFD_DEBUG:
here->B3SOIFDdebugMod = value->iValue;
here->B3SOIFDdebugModGiven= TRUE;
break;
case B3SOIFD_RTH0:
here->B3SOIFDrth0= value->rValue;
here->B3SOIFDrth0Given = TRUE;
break;
case B3SOIFD_CTH0:
here->B3SOIFDcth0= value->rValue;
here->B3SOIFDcth0Given = TRUE;
break;
case B3SOIFD_NRB:
here->B3SOIFDbodySquares = value->rValue;
here->B3SOIFDbodySquaresGiven = TRUE;
break;
case B3SOIFD_IC:
switch(value->v.numValue){
case 5:
here->B3SOIFDicVPS = *(value->v.vec.rVec+4);
here->B3SOIFDicVPSGiven = TRUE;
case 4:
here->B3SOIFDicVES = *(value->v.vec.rVec+3);
here->B3SOIFDicVESGiven = TRUE;
case 3:
here->B3SOIFDicVBS = *(value->v.vec.rVec+2);
here->B3SOIFDicVBSGiven = TRUE;
case 2:
here->B3SOIFDicVGS = *(value->v.vec.rVec+1);
here->B3SOIFDicVGSGiven = TRUE;
case 1:
here->B3SOIFDicVDS = *(value->v.vec.rVec);
here->B3SOIFDicVDSGiven = TRUE;
break;
default:
return(E_BADPARM);
}
break;
default:
return(E_BADPARM);
}
return(OK);
}

View File

@ -0,0 +1,152 @@
/**********
Copyright 1999 Regents of the University of California. All rights reserved.
Author: 1998 Samuel Fung, Dennis Sinitsky and Stephen Tang
File: b3soifdpzld.c 98/5/01
**********/
#include "ngspice.h"
#include <stdio.h>
#include "cktdefs.h"
#include "complex.h"
#include "sperror.h"
#include "b3soifddef.h"
#include "suffix.h"
int
B3SOIFDpzLoad(inModel,ckt,s)
GENmodel *inModel;
CKTcircuit *ckt;
SPcomplex *s;
{
B3SOIFDmodel *model = (B3SOIFDmodel*)inModel;
B3SOIFDinstance *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->B3SOIFDnextModel)
{ for (here = model->B3SOIFDinstances; here!= NULL;
here = here->B3SOIFDnextInstance)
{
if (here->B3SOIFDmode >= 0)
{ Gm = here->B3SOIFDgm;
Gmbs = here->B3SOIFDgmbs;
FwdSum = Gm + Gmbs;
RevSum = 0.0;
cggb = here->B3SOIFDcggb;
cgsb = here->B3SOIFDcgsb;
cgdb = here->B3SOIFDcgdb;
cbgb = here->B3SOIFDcbgb;
cbsb = here->B3SOIFDcbsb;
cbdb = here->B3SOIFDcbdb;
cdgb = here->B3SOIFDcdgb;
cdsb = here->B3SOIFDcdsb;
cddb = here->B3SOIFDcddb;
}
else
{ Gm = -here->B3SOIFDgm;
Gmbs = -here->B3SOIFDgmbs;
FwdSum = 0.0;
RevSum = -Gm - Gmbs;
cggb = here->B3SOIFDcggb;
cgsb = here->B3SOIFDcgdb;
cgdb = here->B3SOIFDcgsb;
cbgb = here->B3SOIFDcbgb;
cbsb = here->B3SOIFDcbdb;
cbdb = here->B3SOIFDcbsb;
cdgb = -(here->B3SOIFDcdgb + cggb + cbgb);
cdsb = -(here->B3SOIFDcddb + cgsb + cbsb);
cddb = -(here->B3SOIFDcdsb + cgdb + cbdb);
}
gdpr=here->B3SOIFDdrainConductance;
gspr=here->B3SOIFDsourceConductance;
gds= here->B3SOIFDgds;
gbd= here->B3SOIFDgjdb;
gbs= here->B3SOIFDgjsb;
#ifdef BULKCODE
capbd= here->B3SOIFDcapbd;
capbs= here->B3SOIFDcapbs;
#endif
GSoverlapCap = here->B3SOIFDcgso;
GDoverlapCap = here->B3SOIFDcgdo;
#ifdef BULKCODE
GBoverlapCap = here->pParam->B3SOIFDcgbo;
#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->B3SOIFDGgPtr ) += xcggb * s->real;
*(here->B3SOIFDGgPtr +1) += xcggb * s->imag;
*(here->B3SOIFDBbPtr ) += (-xcbgb-xcbdb-xcbsb) * s->real;
*(here->B3SOIFDBbPtr +1) += (-xcbgb-xcbdb-xcbsb) * s->imag;
*(here->B3SOIFDDPdpPtr ) += xcddb * s->real;
*(here->B3SOIFDDPdpPtr +1) += xcddb * s->imag;
*(here->B3SOIFDSPspPtr ) += xcssb * s->real;
*(here->B3SOIFDSPspPtr +1) += xcssb * s->imag;
*(here->B3SOIFDGbPtr ) += (-xcggb-xcgdb-xcgsb) * s->real;
*(here->B3SOIFDGbPtr +1) += (-xcggb-xcgdb-xcgsb) * s->imag;
*(here->B3SOIFDGdpPtr ) += xcgdb * s->real;
*(here->B3SOIFDGdpPtr +1) += xcgdb * s->imag;
*(here->B3SOIFDGspPtr ) += xcgsb * s->real;
*(here->B3SOIFDGspPtr +1) += xcgsb * s->imag;
*(here->B3SOIFDBgPtr ) += xcbgb * s->real;
*(here->B3SOIFDBgPtr +1) += xcbgb * s->imag;
*(here->B3SOIFDBdpPtr ) += xcbdb * s->real;
*(here->B3SOIFDBdpPtr +1) += xcbdb * s->imag;
*(here->B3SOIFDBspPtr ) += xcbsb * s->real;
*(here->B3SOIFDBspPtr +1) += xcbsb * s->imag;
*(here->B3SOIFDDPgPtr ) += xcdgb * s->real;
*(here->B3SOIFDDPgPtr +1) += xcdgb * s->imag;
*(here->B3SOIFDDPbPtr ) += (-xcdgb-xcddb-xcdsb) * s->real;
*(here->B3SOIFDDPbPtr +1) += (-xcdgb-xcddb-xcdsb) * s->imag;
*(here->B3SOIFDDPspPtr ) += xcdsb * s->real;
*(here->B3SOIFDDPspPtr +1) += xcdsb * s->imag;
*(here->B3SOIFDSPgPtr ) += xcsgb * s->real;
*(here->B3SOIFDSPgPtr +1) += xcsgb * s->imag;
*(here->B3SOIFDSPbPtr ) += (-xcsgb-xcsdb-xcssb) * s->real;
*(here->B3SOIFDSPbPtr +1) += (-xcsgb-xcsdb-xcssb) * s->imag;
*(here->B3SOIFDSPdpPtr ) += xcsdb * s->real;
*(here->B3SOIFDSPdpPtr +1) += xcsdb * s->imag;
*(here->B3SOIFDDdPtr) += gdpr;
*(here->B3SOIFDSsPtr) += gspr;
*(here->B3SOIFDBbPtr) += gbd+gbs;
*(here->B3SOIFDDPdpPtr) += gdpr+gds+gbd+RevSum;
*(here->B3SOIFDSPspPtr) += gspr+gds+gbs+FwdSum;
*(here->B3SOIFDDdpPtr) -= gdpr;
*(here->B3SOIFDSspPtr) -= gspr;
*(here->B3SOIFDBdpPtr) -= gbd;
*(here->B3SOIFDBspPtr) -= gbs;
*(here->B3SOIFDDPdPtr) -= gdpr;
*(here->B3SOIFDDPgPtr) += Gm;
*(here->B3SOIFDDPbPtr) -= gbd - Gmbs;
*(here->B3SOIFDDPspPtr) -= gds + FwdSum;
*(here->B3SOIFDSPgPtr) -= Gm;
*(here->B3SOIFDSPsPtr) -= gspr;
*(here->B3SOIFDSPbPtr) -= gbs + Gmbs;
*(here->B3SOIFDSPdpPtr) -= gds + RevSum;
}
}
return(OK);
}

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,815 @@
/**********
Copyright 1999 Regents of the University of California. All rights reserved.
Author: 1998 Samuel Fung, Dennis Sinitsky and Stephen Tang
File: b3soifdtemp.c 98/5/01
Modified by Pin Su, Wei Jin 99/9/27
**********/
/* Lmin, Lmax, Wmin, Wmax */
#include "ngspice.h"
#include <stdio.h>
#include <math.h>
#include "smpdefs.h"
#include "cktdefs.h"
#include "b3soifddef.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
B3SOIFDtemp(inModel,ckt)
GENmodel *inModel;
CKTcircuit *ckt;
{
B3SOIFDmodel *model = (B3SOIFDmodel*) inModel;
B3SOIFDinstance *here;
struct b3soifdSizeDependParam *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 B3SOIFD device models */
for (; model != NULL; model = model->B3SOIFDnextModel)
{ Temp = ckt->CKTtemp;
if (model->B3SOIFDGatesidewallJctPotential < 0.1)
model->B3SOIFDGatesidewallJctPotential = 0.1;
model->pSizeDependParamKnot = NULL;
pLastKnot = NULL;
Tnom = model->B3SOIFDtnom;
TRatio = Temp / Tnom;
model->B3SOIFDvcrit = CONSTvt0 * log(CONSTvt0 / (CONSTroot2 * 1.0e-14));
model->B3SOIFDfactor1 = sqrt(EPSSI / EPSOX * model->B3SOIFDtox);
Vtm0 = KboQ * Tnom;
Eg0 = 1.16 - 7.02e-4 * Tnom * Tnom / (Tnom + 1108.0);
model->B3SOIFDeg0 = Eg0;
model->B3SOIFDvtm = 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->B3SOIFDvtm));
/* loop through all the instances of the model */
/* MCJ: Length and Width not initialized */
for (here = model->B3SOIFDinstances; here != NULL;
here = here->B3SOIFDnextInstance)
{
here->B3SOIFDrbodyext = here->B3SOIFDbodySquares *
model->B3SOIFDrbsh;
pSizeDependParamKnot = model->pSizeDependParamKnot;
Size_Not_Found = 1;
while ((pSizeDependParamKnot != NULL) && Size_Not_Found)
{ if ((here->B3SOIFDl == pSizeDependParamKnot->Length)
&& (here->B3SOIFDw == pSizeDependParamKnot->Width)
&& (here->B3SOIFDrth0 == pSizeDependParamKnot->Rth0)
&& (here->B3SOIFDcth0 == pSizeDependParamKnot->Cth0))
{ Size_Not_Found = 0;
here->pParam = pSizeDependParamKnot;
}
else
{ pLastKnot = pSizeDependParamKnot;
pSizeDependParamKnot = pSizeDependParamKnot->pNext;
}
}
if (Size_Not_Found)
{ pParam = (struct b3soifdSizeDependParam *)malloc(
sizeof(struct b3soifdSizeDependParam));
if (pLastKnot == NULL)
model->pSizeDependParamKnot = pParam;
else
pLastKnot->pNext = pParam;
pParam->pNext = NULL;
here->pParam = pParam;
Ldrn = here->B3SOIFDl;
Wdrn = here->B3SOIFDw;
pParam->Length = Ldrn;
pParam->Width = Wdrn;
pParam->Rth0 = here->B3SOIFDrth0;
pParam->Cth0 = here->B3SOIFDcth0;
T0 = pow(Ldrn, model->B3SOIFDLln);
T1 = pow(Wdrn, model->B3SOIFDLwn);
tmp1 = model->B3SOIFDLl / T0 + model->B3SOIFDLw / T1
+ model->B3SOIFDLwl / (T0 * T1);
pParam->B3SOIFDdl = model->B3SOIFDLint + tmp1;
pParam->B3SOIFDdlc = model->B3SOIFDdlc + tmp1;
T2 = pow(Ldrn, model->B3SOIFDWln);
T3 = pow(Wdrn, model->B3SOIFDWwn);
tmp2 = model->B3SOIFDWl / T2 + model->B3SOIFDWw / T3
+ model->B3SOIFDWwl / (T2 * T3);
pParam->B3SOIFDdw = model->B3SOIFDWint + tmp2;
pParam->B3SOIFDdwc = model->B3SOIFDdwc + tmp2;
pParam->B3SOIFDleff = here->B3SOIFDl - 2.0 * pParam->B3SOIFDdl;
if (pParam->B3SOIFDleff <= 0.0)
{ IFuid namarray[2];
namarray[0] = model->B3SOIFDmodName;
namarray[1] = here->B3SOIFDname;
(*(SPfrontEnd->IFerror))(ERR_FATAL,
"B3SOIFD: mosfet %s, model %s: Effective channel length <= 0",
namarray);
return(E_BADPARM);
}
pParam->B3SOIFDweff = here->B3SOIFDw - 2.0 * pParam->B3SOIFDdw;
if (pParam->B3SOIFDweff <= 0.0)
{ IFuid namarray[2];
namarray[0] = model->B3SOIFDmodName;
namarray[1] = here->B3SOIFDname;
(*(SPfrontEnd->IFerror))(ERR_FATAL,
"B3SOIFD: mosfet %s, model %s: Effective channel width <= 0",
namarray);
return(E_BADPARM);
}
pParam->B3SOIFDleffCV = here->B3SOIFDl - 2.0 * pParam->B3SOIFDdlc;
if (pParam->B3SOIFDleffCV <= 0.0)
{ IFuid namarray[2];
namarray[0] = model->B3SOIFDmodName;
namarray[1] = here->B3SOIFDname;
(*(SPfrontEnd->IFerror))(ERR_FATAL,
"B3SOIFD: mosfet %s, model %s: Effective channel length for C-V <= 0",
namarray);
return(E_BADPARM);
}
pParam->B3SOIFDweffCV = here->B3SOIFDw - 2.0 * pParam->B3SOIFDdwc;
if (pParam->B3SOIFDweffCV <= 0.0)
{ IFuid namarray[2];
namarray[0] = model->B3SOIFDmodName;
namarray[1] = here->B3SOIFDname;
(*(SPfrontEnd->IFerror))(ERR_FATAL,
"B3SOIFD: mosfet %s, model %s: Effective channel width for C-V <= 0",
namarray);
return(E_BADPARM);
}
/* Not binned - START */
pParam->B3SOIFDat = model->B3SOIFDat;
pParam->B3SOIFDgamma1 = model->B3SOIFDgamma1;
pParam->B3SOIFDgamma2 = model->B3SOIFDgamma2;
pParam->B3SOIFDvbx = model->B3SOIFDvbx;
pParam->B3SOIFDvbm = model->B3SOIFDvbm;
pParam->B3SOIFDxt = model->B3SOIFDxt;
pParam->B3SOIFDkt1 = model->B3SOIFDkt1;
pParam->B3SOIFDkt1l = model->B3SOIFDkt1l;
pParam->B3SOIFDkt2 = model->B3SOIFDkt2;
pParam->B3SOIFDua1 = model->B3SOIFDua1;
pParam->B3SOIFDub1 = model->B3SOIFDub1;
pParam->B3SOIFDuc1 = model->B3SOIFDuc1;
pParam->B3SOIFDute = model->B3SOIFDute;
pParam->B3SOIFDprt = model->B3SOIFDprt;
/* Not binned - END */
/* CV model */
pParam->B3SOIFDcgsl = model->B3SOIFDcgsl;
pParam->B3SOIFDcgdl = model->B3SOIFDcgdl;
pParam->B3SOIFDckappa = model->B3SOIFDckappa;
pParam->B3SOIFDcf = model->B3SOIFDcf;
pParam->B3SOIFDclc = model->B3SOIFDclc;
pParam->B3SOIFDcle = model->B3SOIFDcle;
pParam->B3SOIFDabulkCVfactor = pow(1.0+(pParam->B3SOIFDclc
/ pParam->B3SOIFDleff),
pParam->B3SOIFDcle);
/* Added for binning - START */
if (model->B3SOIFDbinUnit == 1)
{ Inv_L = 1.0e-6 / pParam->B3SOIFDleff;
Inv_W = 1.0e-6 / pParam->B3SOIFDweff;
Inv_LW = 1.0e-12 / (pParam->B3SOIFDleff
* pParam->B3SOIFDweff);
}
else
{ Inv_L = 1.0 / pParam->B3SOIFDleff;
Inv_W = 1.0 / pParam->B3SOIFDweff;
Inv_LW = 1.0 / (pParam->B3SOIFDleff
* pParam->B3SOIFDweff);
}
pParam->B3SOIFDnpeak = model->B3SOIFDnpeak
+ model->B3SOIFDlnpeak * Inv_L
+ model->B3SOIFDwnpeak * Inv_W
+ model->B3SOIFDpnpeak * Inv_LW;
pParam->B3SOIFDnsub = model->B3SOIFDnsub
+ model->B3SOIFDlnsub * Inv_L
+ model->B3SOIFDwnsub * Inv_W
+ model->B3SOIFDpnsub * Inv_LW;
pParam->B3SOIFDngate = model->B3SOIFDngate
+ model->B3SOIFDlngate * Inv_L
+ model->B3SOIFDwngate * Inv_W
+ model->B3SOIFDpngate * Inv_LW;
pParam->B3SOIFDvth0 = model->B3SOIFDvth0
+ model->B3SOIFDlvth0 * Inv_L
+ model->B3SOIFDwvth0 * Inv_W
+ model->B3SOIFDpvth0 * Inv_LW;
pParam->B3SOIFDk1 = model->B3SOIFDk1
+ model->B3SOIFDlk1 * Inv_L
+ model->B3SOIFDwk1 * Inv_W
+ model->B3SOIFDpk1 * Inv_LW;
pParam->B3SOIFDk2 = model->B3SOIFDk2
+ model->B3SOIFDlk2 * Inv_L
+ model->B3SOIFDwk2 * Inv_W
+ model->B3SOIFDpk2 * Inv_LW;
pParam->B3SOIFDk3 = model->B3SOIFDk3
+ model->B3SOIFDlk3 * Inv_L
+ model->B3SOIFDwk3 * Inv_W
+ model->B3SOIFDpk3 * Inv_LW;
pParam->B3SOIFDk3b = model->B3SOIFDk3b
+ model->B3SOIFDlk3b * Inv_L
+ model->B3SOIFDwk3b * Inv_W
+ model->B3SOIFDpk3b * Inv_LW;
pParam->B3SOIFDvbsa = model->B3SOIFDvbsa
+ model->B3SOIFDlvbsa * Inv_L
+ model->B3SOIFDwvbsa * Inv_W
+ model->B3SOIFDpvbsa * Inv_LW;
pParam->B3SOIFDdelp = model->B3SOIFDdelp
+ model->B3SOIFDldelp * Inv_L
+ model->B3SOIFDwdelp * Inv_W
+ model->B3SOIFDpdelp * Inv_LW;
pParam->B3SOIFDkb1 = model->B3SOIFDkb1
+ model->B3SOIFDlkb1 * Inv_L
+ model->B3SOIFDwkb1 * Inv_W
+ model->B3SOIFDpkb1 * Inv_LW;
pParam->B3SOIFDkb3 = model->B3SOIFDkb3
+ model->B3SOIFDlkb3 * Inv_L
+ model->B3SOIFDwkb3 * Inv_W
+ model->B3SOIFDpkb3 * Inv_LW;
pParam->B3SOIFDdvbd0 = model->B3SOIFDdvbd0
+ model->B3SOIFDldvbd0 * Inv_L
+ model->B3SOIFDwdvbd0 * Inv_W
+ model->B3SOIFDpdvbd0 * Inv_LW;
pParam->B3SOIFDdvbd1 = model->B3SOIFDdvbd1
+ model->B3SOIFDldvbd1 * Inv_L
+ model->B3SOIFDwdvbd1 * Inv_W
+ model->B3SOIFDpdvbd1 * Inv_LW;
pParam->B3SOIFDw0 = model->B3SOIFDw0
+ model->B3SOIFDlw0 * Inv_L
+ model->B3SOIFDww0 * Inv_W
+ model->B3SOIFDpw0 * Inv_LW;
pParam->B3SOIFDnlx = model->B3SOIFDnlx
+ model->B3SOIFDlnlx * Inv_L
+ model->B3SOIFDwnlx * Inv_W
+ model->B3SOIFDpnlx * Inv_LW;
pParam->B3SOIFDdvt0 = model->B3SOIFDdvt0
+ model->B3SOIFDldvt0 * Inv_L
+ model->B3SOIFDwdvt0 * Inv_W
+ model->B3SOIFDpdvt0 * Inv_LW;
pParam->B3SOIFDdvt1 = model->B3SOIFDdvt1
+ model->B3SOIFDldvt1 * Inv_L
+ model->B3SOIFDwdvt1 * Inv_W
+ model->B3SOIFDpdvt1 * Inv_LW;
pParam->B3SOIFDdvt2 = model->B3SOIFDdvt2
+ model->B3SOIFDldvt2 * Inv_L
+ model->B3SOIFDwdvt2 * Inv_W
+ model->B3SOIFDpdvt2 * Inv_LW;
pParam->B3SOIFDdvt0w = model->B3SOIFDdvt0w
+ model->B3SOIFDldvt0w * Inv_L
+ model->B3SOIFDwdvt0w * Inv_W
+ model->B3SOIFDpdvt0w * Inv_LW;
pParam->B3SOIFDdvt1w = model->B3SOIFDdvt1w
+ model->B3SOIFDldvt1w * Inv_L
+ model->B3SOIFDwdvt1w * Inv_W
+ model->B3SOIFDpdvt1w * Inv_LW;
pParam->B3SOIFDdvt2w = model->B3SOIFDdvt2w
+ model->B3SOIFDldvt2w * Inv_L
+ model->B3SOIFDwdvt2w * Inv_W
+ model->B3SOIFDpdvt2w * Inv_LW;
pParam->B3SOIFDu0 = model->B3SOIFDu0
+ model->B3SOIFDlu0 * Inv_L
+ model->B3SOIFDwu0 * Inv_W
+ model->B3SOIFDpu0 * Inv_LW;
pParam->B3SOIFDua = model->B3SOIFDua
+ model->B3SOIFDlua * Inv_L
+ model->B3SOIFDwua * Inv_W
+ model->B3SOIFDpua * Inv_LW;
pParam->B3SOIFDub = model->B3SOIFDub
+ model->B3SOIFDlub * Inv_L
+ model->B3SOIFDwub * Inv_W
+ model->B3SOIFDpub * Inv_LW;
pParam->B3SOIFDuc = model->B3SOIFDuc
+ model->B3SOIFDluc * Inv_L
+ model->B3SOIFDwuc * Inv_W
+ model->B3SOIFDpuc * Inv_LW;
pParam->B3SOIFDvsat = model->B3SOIFDvsat
+ model->B3SOIFDlvsat * Inv_L
+ model->B3SOIFDwvsat * Inv_W
+ model->B3SOIFDpvsat * Inv_LW;
pParam->B3SOIFDa0 = model->B3SOIFDa0
+ model->B3SOIFDla0 * Inv_L
+ model->B3SOIFDwa0 * Inv_W
+ model->B3SOIFDpa0 * Inv_LW;
pParam->B3SOIFDags = model->B3SOIFDags
+ model->B3SOIFDlags * Inv_L
+ model->B3SOIFDwags * Inv_W
+ model->B3SOIFDpags * Inv_LW;
pParam->B3SOIFDb0 = model->B3SOIFDb0
+ model->B3SOIFDlb0 * Inv_L
+ model->B3SOIFDwb0 * Inv_W
+ model->B3SOIFDpb0 * Inv_LW;
pParam->B3SOIFDb1 = model->B3SOIFDb1
+ model->B3SOIFDlb1 * Inv_L
+ model->B3SOIFDwb1 * Inv_W
+ model->B3SOIFDpb1 * Inv_LW;
pParam->B3SOIFDketa = model->B3SOIFDketa
+ model->B3SOIFDlketa * Inv_L
+ model->B3SOIFDwketa * Inv_W
+ model->B3SOIFDpketa * Inv_LW;
pParam->B3SOIFDabp = model->B3SOIFDabp
+ model->B3SOIFDlabp * Inv_L
+ model->B3SOIFDwabp * Inv_W
+ model->B3SOIFDpabp * Inv_LW;
pParam->B3SOIFDmxc = model->B3SOIFDmxc
+ model->B3SOIFDlmxc * Inv_L
+ model->B3SOIFDwmxc * Inv_W
+ model->B3SOIFDpmxc * Inv_LW;
pParam->B3SOIFDadice0 = model->B3SOIFDadice0
+ model->B3SOIFDladice0 * Inv_L
+ model->B3SOIFDwadice0 * Inv_W
+ model->B3SOIFDpadice0 * Inv_LW;
pParam->B3SOIFDa1 = model->B3SOIFDa1
+ model->B3SOIFDla1 * Inv_L
+ model->B3SOIFDwa1 * Inv_W
+ model->B3SOIFDpa1 * Inv_LW;
pParam->B3SOIFDa2 = model->B3SOIFDa2
+ model->B3SOIFDla2 * Inv_L
+ model->B3SOIFDwa2 * Inv_W
+ model->B3SOIFDpa2 * Inv_LW;
pParam->B3SOIFDrdsw = model->B3SOIFDrdsw
+ model->B3SOIFDlrdsw * Inv_L
+ model->B3SOIFDwrdsw * Inv_W
+ model->B3SOIFDprdsw * Inv_LW;
pParam->B3SOIFDprwb = model->B3SOIFDprwb
+ model->B3SOIFDlprwb * Inv_L
+ model->B3SOIFDwprwb * Inv_W
+ model->B3SOIFDpprwb * Inv_LW;
pParam->B3SOIFDprwg = model->B3SOIFDprwg
+ model->B3SOIFDlprwg * Inv_L
+ model->B3SOIFDwprwg * Inv_W
+ model->B3SOIFDpprwg * Inv_LW;
pParam->B3SOIFDwr = model->B3SOIFDwr
+ model->B3SOIFDlwr * Inv_L
+ model->B3SOIFDwwr * Inv_W
+ model->B3SOIFDpwr * Inv_LW;
pParam->B3SOIFDnfactor = model->B3SOIFDnfactor
+ model->B3SOIFDlnfactor * Inv_L
+ model->B3SOIFDwnfactor * Inv_W
+ model->B3SOIFDpnfactor * Inv_LW;
pParam->B3SOIFDdwg = model->B3SOIFDdwg
+ model->B3SOIFDldwg * Inv_L
+ model->B3SOIFDwdwg * Inv_W
+ model->B3SOIFDpdwg * Inv_LW;
pParam->B3SOIFDdwb = model->B3SOIFDdwb
+ model->B3SOIFDldwb * Inv_L
+ model->B3SOIFDwdwb * Inv_W
+ model->B3SOIFDpdwb * Inv_LW;
pParam->B3SOIFDvoff = model->B3SOIFDvoff
+ model->B3SOIFDlvoff * Inv_L
+ model->B3SOIFDwvoff * Inv_W
+ model->B3SOIFDpvoff * Inv_LW;
pParam->B3SOIFDeta0 = model->B3SOIFDeta0
+ model->B3SOIFDleta0 * Inv_L
+ model->B3SOIFDweta0 * Inv_W
+ model->B3SOIFDpeta0 * Inv_LW;
pParam->B3SOIFDetab = model->B3SOIFDetab
+ model->B3SOIFDletab * Inv_L
+ model->B3SOIFDwetab * Inv_W
+ model->B3SOIFDpetab * Inv_LW;
pParam->B3SOIFDdsub = model->B3SOIFDdsub
+ model->B3SOIFDldsub * Inv_L
+ model->B3SOIFDwdsub * Inv_W
+ model->B3SOIFDpdsub * Inv_LW;
pParam->B3SOIFDcit = model->B3SOIFDcit
+ model->B3SOIFDlcit * Inv_L
+ model->B3SOIFDwcit * Inv_W
+ model->B3SOIFDpcit * Inv_LW;
pParam->B3SOIFDcdsc = model->B3SOIFDcdsc
+ model->B3SOIFDlcdsc * Inv_L
+ model->B3SOIFDwcdsc * Inv_W
+ model->B3SOIFDpcdsc * Inv_LW;
pParam->B3SOIFDcdscb = model->B3SOIFDcdscb
+ model->B3SOIFDlcdscb * Inv_L
+ model->B3SOIFDwcdscb * Inv_W
+ model->B3SOIFDpcdscb * Inv_LW;
pParam->B3SOIFDcdscd = model->B3SOIFDcdscd
+ model->B3SOIFDlcdscd * Inv_L
+ model->B3SOIFDwcdscd * Inv_W
+ model->B3SOIFDpcdscd * Inv_LW;
pParam->B3SOIFDpclm = model->B3SOIFDpclm
+ model->B3SOIFDlpclm * Inv_L
+ model->B3SOIFDwpclm * Inv_W
+ model->B3SOIFDppclm * Inv_LW;
pParam->B3SOIFDpdibl1 = model->B3SOIFDpdibl1
+ model->B3SOIFDlpdibl1 * Inv_L
+ model->B3SOIFDwpdibl1 * Inv_W
+ model->B3SOIFDppdibl1 * Inv_LW;
pParam->B3SOIFDpdibl2 = model->B3SOIFDpdibl2
+ model->B3SOIFDlpdibl2 * Inv_L
+ model->B3SOIFDwpdibl2 * Inv_W
+ model->B3SOIFDppdibl2 * Inv_LW;
pParam->B3SOIFDpdiblb = model->B3SOIFDpdiblb
+ model->B3SOIFDlpdiblb * Inv_L
+ model->B3SOIFDwpdiblb * Inv_W
+ model->B3SOIFDppdiblb * Inv_LW;
pParam->B3SOIFDdrout = model->B3SOIFDdrout
+ model->B3SOIFDldrout * Inv_L
+ model->B3SOIFDwdrout * Inv_W
+ model->B3SOIFDpdrout * Inv_LW;
pParam->B3SOIFDpvag = model->B3SOIFDpvag
+ model->B3SOIFDlpvag * Inv_L
+ model->B3SOIFDwpvag * Inv_W
+ model->B3SOIFDppvag * Inv_LW;
pParam->B3SOIFDdelta = model->B3SOIFDdelta
+ model->B3SOIFDldelta * Inv_L
+ model->B3SOIFDwdelta * Inv_W
+ model->B3SOIFDpdelta * Inv_LW;
pParam->B3SOIFDaii = model->B3SOIFDaii
+ model->B3SOIFDlaii * Inv_L
+ model->B3SOIFDwaii * Inv_W
+ model->B3SOIFDpaii * Inv_LW;
pParam->B3SOIFDbii = model->B3SOIFDbii
+ model->B3SOIFDlbii * Inv_L
+ model->B3SOIFDwbii * Inv_W
+ model->B3SOIFDpbii * Inv_LW;
pParam->B3SOIFDcii = model->B3SOIFDcii
+ model->B3SOIFDlcii * Inv_L
+ model->B3SOIFDwcii * Inv_W
+ model->B3SOIFDpcii * Inv_LW;
pParam->B3SOIFDdii = model->B3SOIFDdii
+ model->B3SOIFDldii * Inv_L
+ model->B3SOIFDwdii * Inv_W
+ model->B3SOIFDpdii * Inv_LW;
pParam->B3SOIFDalpha0 = model->B3SOIFDalpha0
+ model->B3SOIFDlalpha0 * Inv_L
+ model->B3SOIFDwalpha0 * Inv_W
+ model->B3SOIFDpalpha0 * Inv_LW;
pParam->B3SOIFDalpha1 = model->B3SOIFDalpha1
+ model->B3SOIFDlalpha1 * Inv_L
+ model->B3SOIFDwalpha1 * Inv_W
+ model->B3SOIFDpalpha1 * Inv_LW;
pParam->B3SOIFDbeta0 = model->B3SOIFDbeta0
+ model->B3SOIFDlbeta0 * Inv_L
+ model->B3SOIFDwbeta0 * Inv_W
+ model->B3SOIFDpbeta0 * Inv_LW;
pParam->B3SOIFDagidl = model->B3SOIFDagidl
+ model->B3SOIFDlagidl * Inv_L
+ model->B3SOIFDwagidl * Inv_W
+ model->B3SOIFDpagidl * Inv_LW;
pParam->B3SOIFDbgidl = model->B3SOIFDbgidl
+ model->B3SOIFDlbgidl * Inv_L
+ model->B3SOIFDwbgidl * Inv_W
+ model->B3SOIFDpbgidl * Inv_LW;
pParam->B3SOIFDngidl = model->B3SOIFDngidl
+ model->B3SOIFDlngidl * Inv_L
+ model->B3SOIFDwngidl * Inv_W
+ model->B3SOIFDpngidl * Inv_LW;
pParam->B3SOIFDntun = model->B3SOIFDntun
+ model->B3SOIFDlntun * Inv_L
+ model->B3SOIFDwntun * Inv_W
+ model->B3SOIFDpntun * Inv_LW;
pParam->B3SOIFDndiode = model->B3SOIFDndiode
+ model->B3SOIFDlndiode * Inv_L
+ model->B3SOIFDwndiode * Inv_W
+ model->B3SOIFDpndiode * Inv_LW;
pParam->B3SOIFDisbjt = model->B3SOIFDisbjt
+ model->B3SOIFDlisbjt * Inv_L
+ model->B3SOIFDwisbjt * Inv_W
+ model->B3SOIFDpisbjt * Inv_LW;
pParam->B3SOIFDisdif = model->B3SOIFDisdif
+ model->B3SOIFDlisdif * Inv_L
+ model->B3SOIFDwisdif * Inv_W
+ model->B3SOIFDpisdif * Inv_LW;
pParam->B3SOIFDisrec = model->B3SOIFDisrec
+ model->B3SOIFDlisrec * Inv_L
+ model->B3SOIFDwisrec * Inv_W
+ model->B3SOIFDpisrec * Inv_LW;
pParam->B3SOIFDistun = model->B3SOIFDistun
+ model->B3SOIFDlistun * Inv_L
+ model->B3SOIFDwistun * Inv_W
+ model->B3SOIFDpistun * Inv_LW;
pParam->B3SOIFDedl = model->B3SOIFDedl
+ model->B3SOIFDledl * Inv_L
+ model->B3SOIFDwedl * Inv_W
+ model->B3SOIFDpedl * Inv_LW;
pParam->B3SOIFDkbjt1 = model->B3SOIFDkbjt1
+ model->B3SOIFDlkbjt1 * Inv_L
+ model->B3SOIFDwkbjt1 * Inv_W
+ model->B3SOIFDpkbjt1 * Inv_LW;
/* CV model */
pParam->B3SOIFDvsdfb = model->B3SOIFDvsdfb
+ model->B3SOIFDlvsdfb * Inv_L
+ model->B3SOIFDwvsdfb * Inv_W
+ model->B3SOIFDpvsdfb * Inv_LW;
pParam->B3SOIFDvsdth = model->B3SOIFDvsdth
+ model->B3SOIFDlvsdth * Inv_L
+ model->B3SOIFDwvsdth * Inv_W
+ model->B3SOIFDpvsdth * Inv_LW;
/* Added for binning - END */
T0 = (TRatio - 1.0);
pParam->B3SOIFDuatemp = pParam->B3SOIFDua; /* save ua, ub, and uc for b3soifdld.c */
pParam->B3SOIFDubtemp = pParam->B3SOIFDub;
pParam->B3SOIFDuctemp = pParam->B3SOIFDuc;
pParam->B3SOIFDrds0denom = pow(pParam->B3SOIFDweff * 1E6, pParam->B3SOIFDwr);
pParam->B3SOIFDrth = here->B3SOIFDrth0 * sqrt(model->B3SOIFDtbox
/ model->B3SOIFDtsi) / pParam->B3SOIFDweff;
pParam->B3SOIFDcth = here->B3SOIFDcth0 * model->B3SOIFDtsi;
pParam->B3SOIFDrbody = model->B3SOIFDrbody *
pParam->B3SOIFDweff / pParam->B3SOIFDleff;
pParam->B3SOIFDua = pParam->B3SOIFDua + pParam->B3SOIFDua1 * T0;
pParam->B3SOIFDub = pParam->B3SOIFDub + pParam->B3SOIFDub1 * T0;
pParam->B3SOIFDuc = pParam->B3SOIFDuc + pParam->B3SOIFDuc1 * T0;
if (pParam->B3SOIFDu0 > 1.0)
pParam->B3SOIFDu0 = pParam->B3SOIFDu0 / 1.0e4;
pParam->B3SOIFDu0temp = pParam->B3SOIFDu0
* pow(TRatio, pParam->B3SOIFDute);
pParam->B3SOIFDvsattemp = pParam->B3SOIFDvsat - pParam->B3SOIFDat
* T0;
pParam->B3SOIFDrds0 = (pParam->B3SOIFDrdsw + pParam->B3SOIFDprt * T0)
/ pow(pParam->B3SOIFDweff * 1E6, pParam->B3SOIFDwr);
if (B3SOIFDcheckModel(model, here, ckt))
{ IFuid namarray[2];
namarray[0] = model->B3SOIFDmodName;
namarray[1] = here->B3SOIFDname;
(*(SPfrontEnd->IFerror)) (ERR_FATAL, "Fatal error(s) detected during B3SOIFDV3 parameter checking for %s in model %s", namarray);
return(E_BADPARM);
}
pParam->B3SOIFDcgdo = (model->B3SOIFDcgdo + pParam->B3SOIFDcf)
* pParam->B3SOIFDweffCV;
pParam->B3SOIFDcgso = (model->B3SOIFDcgso + pParam->B3SOIFDcf)
* pParam->B3SOIFDweffCV;
pParam->B3SOIFDcgeo = model->B3SOIFDcgeo * pParam->B3SOIFDleffCV;
if (!model->B3SOIFDnpeakGiven && model->B3SOIFDgamma1Given)
{ T0 = pParam->B3SOIFDgamma1 * model->B3SOIFDcox;
pParam->B3SOIFDnpeak = 3.021E22 * T0 * T0;
}
T0 = pow(TRatio, model->B3SOIFDxbjt / pParam->B3SOIFDndiode);
T1 = pow(TRatio, model->B3SOIFDxdif / pParam->B3SOIFDndiode);
T2 = pow(TRatio, model->B3SOIFDxrec / pParam->B3SOIFDndiode / 2);
T4 = -Eg0 / pParam->B3SOIFDndiode / model->B3SOIFDvtm * (1 - TRatio);
T5 = exp(T4);
T6 = sqrt(T5);
pParam->B3SOIFDjbjt = pParam->B3SOIFDisbjt * T0 * T5;
pParam->B3SOIFDjdif = pParam->B3SOIFDisdif * T1 * T5;
pParam->B3SOIFDjrec = pParam->B3SOIFDisrec * T2 * T6;
T0 = pow(TRatio, model->B3SOIFDxtun / pParam->B3SOIFDntun);
pParam->B3SOIFDjtun = pParam->B3SOIFDistun * T0 ;
if (pParam->B3SOIFDnsub > 0)
pParam->B3SOIFDvfbb = -model->B3SOIFDtype * model->B3SOIFDvtm *
log(pParam->B3SOIFDnpeak/ pParam->B3SOIFDnsub);
else
pParam->B3SOIFDvfbb = -model->B3SOIFDtype * model->B3SOIFDvtm *
log(-pParam->B3SOIFDnpeak* pParam->B3SOIFDnsub/ni/ni);
if (!model->B3SOIFDvsdfbGiven)
{
if (pParam->B3SOIFDnsub > 0)
pParam->B3SOIFDvsdfb = -model->B3SOIFDtype * (model->B3SOIFDvtm*log(1e20 *
pParam->B3SOIFDnsub / ni /ni) - 0.3);
else if (pParam->B3SOIFDnsub < 0)
pParam->B3SOIFDvsdfb = -model->B3SOIFDtype * (model->B3SOIFDvtm*log(-1e20 /
pParam->B3SOIFDnsub) + 0.3);
}
/* Phi & Gamma */
SDphi = 2.0*model->B3SOIFDvtm*log(fabs(pParam->B3SOIFDnsub) / ni);
SDgamma = 5.753e-12 * sqrt(fabs(pParam->B3SOIFDnsub)) / model->B3SOIFDcbox;
if (!model->B3SOIFDvsdthGiven)
{
if ( ((pParam->B3SOIFDnsub > 0) && (model->B3SOIFDtype > 0)) ||
((pParam->B3SOIFDnsub < 0) && (model->B3SOIFDtype < 0)) )
pParam->B3SOIFDvsdth = pParam->B3SOIFDvsdfb + SDphi +
SDgamma * sqrt(SDphi);
else
pParam->B3SOIFDvsdth = pParam->B3SOIFDvsdfb - SDphi -
SDgamma * sqrt(SDphi);
}
if (!model->B3SOIFDcsdminGiven)
{
/* Cdmin */
tmp = sqrt(2.0 * EPSSI * SDphi / (Charge_q *
fabs(pParam->B3SOIFDnsub) * 1.0e6));
tmp1 = EPSSI / tmp;
model->B3SOIFDcsdmin = tmp1 * model->B3SOIFDcbox /
(tmp1 + model->B3SOIFDcbox);
}
T0 = model->B3SOIFDcsdesw * log(1 + model->B3SOIFDtsi /
model->B3SOIFDtbox);
T1 = here->B3SOIFDsourcePerimeter - pParam->B3SOIFDweff;
if (T1 > 0.0)
pParam->B3SOIFDcsesw = T0 * T1;
else
pParam->B3SOIFDcsesw = 0.0;
T1 = here->B3SOIFDdrainPerimeter - pParam->B3SOIFDweff;
if (T1 > 0.0)
pParam->B3SOIFDcdesw = T0 * T1;
else
pParam->B3SOIFDcdesw = 0.0;
pParam->B3SOIFDphi = 2.0 * model->B3SOIFDvtm
* log(pParam->B3SOIFDnpeak / ni);
pParam->B3SOIFDsqrtPhi = sqrt(pParam->B3SOIFDphi);
pParam->B3SOIFDphis3 = pParam->B3SOIFDsqrtPhi * pParam->B3SOIFDphi;
pParam->B3SOIFDXdep0 = sqrt(2.0 * EPSSI / (Charge_q
* pParam->B3SOIFDnpeak * 1.0e6))
* pParam->B3SOIFDsqrtPhi;
pParam->B3SOIFDsqrtXdep0 = sqrt(pParam->B3SOIFDXdep0);
pParam->B3SOIFDlitl = sqrt(3.0 * model->B3SOIFDxj
* model->B3SOIFDtox);
pParam->B3SOIFDvbi = model->B3SOIFDvtm * log(1.0e20
* pParam->B3SOIFDnpeak / (ni * ni));
pParam->B3SOIFDcdep0 = sqrt(Charge_q * EPSSI
* pParam->B3SOIFDnpeak * 1.0e6 / 2.0
/ pParam->B3SOIFDphi);
if (model->B3SOIFDk1Given || model->B3SOIFDk2Given)
{ if (!model->B3SOIFDk1Given)
{ fprintf(stdout, "Warning: k1 should be specified with k2.\n");
pParam->B3SOIFDk1 = 0.53;
}
if (!model->B3SOIFDk2Given)
{ fprintf(stdout, "Warning: k2 should be specified with k1.\n");
pParam->B3SOIFDk2 = -0.0186;
}
if (model->B3SOIFDxtGiven)
fprintf(stdout, "Warning: xt is ignored because k1 or k2 is given.\n");
if (model->B3SOIFDvbxGiven)
fprintf(stdout, "Warning: vbx is ignored because k1 or k2 is given.\n");
if (model->B3SOIFDvbmGiven)
fprintf(stdout, "Warning: vbm is ignored because k1 or k2 is given.\n");
if (model->B3SOIFDgamma1Given)
fprintf(stdout, "Warning: gamma1 is ignored because k1 or k2 is given.\n");
if (model->B3SOIFDgamma2Given)
fprintf(stdout, "Warning: gamma2 is ignored because k1 or k2 is given.\n");
}
else
{ if (!model->B3SOIFDvbxGiven)
pParam->B3SOIFDvbx = pParam->B3SOIFDphi - 7.7348e-4
* pParam->B3SOIFDnpeak
* pParam->B3SOIFDxt * pParam->B3SOIFDxt;
if (pParam->B3SOIFDvbx > 0.0)
pParam->B3SOIFDvbx = -pParam->B3SOIFDvbx;
if (pParam->B3SOIFDvbm > 0.0)
pParam->B3SOIFDvbm = -pParam->B3SOIFDvbm;
if (!model->B3SOIFDgamma1Given)
pParam->B3SOIFDgamma1 = 5.753e-12
* sqrt(pParam->B3SOIFDnpeak)
/ model->B3SOIFDcox;
if (!model->B3SOIFDgamma2Given)
pParam->B3SOIFDgamma2 = 5.753e-12
* sqrt(pParam->B3SOIFDnsub)
/ model->B3SOIFDcox;
T0 = pParam->B3SOIFDgamma1 - pParam->B3SOIFDgamma2;
T1 = sqrt(pParam->B3SOIFDphi - pParam->B3SOIFDvbx)
- pParam->B3SOIFDsqrtPhi;
T2 = sqrt(pParam->B3SOIFDphi * (pParam->B3SOIFDphi
- pParam->B3SOIFDvbm)) - pParam->B3SOIFDphi;
pParam->B3SOIFDk2 = T0 * T1 / (2.0 * T2 + pParam->B3SOIFDvbm);
pParam->B3SOIFDk1 = pParam->B3SOIFDgamma2 - 2.0
* pParam->B3SOIFDk2 * sqrt(pParam->B3SOIFDphi
- pParam->B3SOIFDvbm);
}
if (pParam->B3SOIFDk2 < 0.0)
{ T0 = 0.5 * pParam->B3SOIFDk1 / pParam->B3SOIFDk2;
pParam->B3SOIFDvbsc = 0.9 * (pParam->B3SOIFDphi - T0 * T0);
if (pParam->B3SOIFDvbsc > -3.0)
pParam->B3SOIFDvbsc = -3.0;
else if (pParam->B3SOIFDvbsc < -30.0)
pParam->B3SOIFDvbsc = -30.0;
}
else
{ pParam->B3SOIFDvbsc = -30.0;
}
if (pParam->B3SOIFDvbsc > pParam->B3SOIFDvbm)
pParam->B3SOIFDvbsc = pParam->B3SOIFDvbm;
if (model->B3SOIFDvth0Given)
{ pParam->B3SOIFDvfb = model->B3SOIFDtype * pParam->B3SOIFDvth0
- pParam->B3SOIFDphi - pParam->B3SOIFDk1
* pParam->B3SOIFDsqrtPhi;
}
else
{ pParam->B3SOIFDvfb = -1.0;
pParam->B3SOIFDvth0 = model->B3SOIFDtype * (pParam->B3SOIFDvfb
+ pParam->B3SOIFDphi + pParam->B3SOIFDk1
* pParam->B3SOIFDsqrtPhi);
}
T1 = sqrt(EPSSI / EPSOX * model->B3SOIFDtox
* pParam->B3SOIFDXdep0);
T0 = exp(-0.5 * pParam->B3SOIFDdsub * pParam->B3SOIFDleff / T1);
pParam->B3SOIFDtheta0vb0 = (T0 + 2.0 * T0 * T0);
T0 = exp(-0.5 * pParam->B3SOIFDdrout * pParam->B3SOIFDleff / T1);
T2 = (T0 + 2.0 * T0 * T0);
pParam->B3SOIFDthetaRout = pParam->B3SOIFDpdibl1 * T2
+ pParam->B3SOIFDpdibl2;
here->B3SOIFDminIsub = 5.0e-2 * pParam->B3SOIFDweff * model->B3SOIFDtsi
* MAX(pParam->B3SOIFDisdif, pParam->B3SOIFDisrec);
}
here->B3SOIFDcsbox = model->B3SOIFDcbox*here->B3SOIFDsourceArea;
here->B3SOIFDcsmin = model->B3SOIFDcsdmin*here->B3SOIFDsourceArea;
here->B3SOIFDcdbox = model->B3SOIFDcbox*here->B3SOIFDdrainArea;
here->B3SOIFDcdmin = model->B3SOIFDcsdmin*here->B3SOIFDdrainArea;
if ( ((pParam->B3SOIFDnsub > 0) && (model->B3SOIFDtype > 0)) ||
((pParam->B3SOIFDnsub < 0) && (model->B3SOIFDtype < 0)) )
{
T0 = pParam->B3SOIFDvsdth - pParam->B3SOIFDvsdfb;
pParam->B3SOIFDsdt1 = pParam->B3SOIFDvsdfb + model->B3SOIFDasd * T0;
T1 = here->B3SOIFDcsbox - here->B3SOIFDcsmin;
T2 = T1 / T0 / T0;
pParam->B3SOIFDst2 = T2 / model->B3SOIFDasd;
pParam->B3SOIFDst3 = T2 /( 1 - model->B3SOIFDasd);
here->B3SOIFDst4 = T0 * T1 * (1 + model->B3SOIFDasd) / 3
- here->B3SOIFDcsmin * pParam->B3SOIFDvsdfb;
T1 = here->B3SOIFDcdbox - here->B3SOIFDcdmin;
T2 = T1 / T0 / T0;
pParam->B3SOIFDdt2 = T2 / model->B3SOIFDasd;
pParam->B3SOIFDdt3 = T2 /( 1 - model->B3SOIFDasd);
here->B3SOIFDdt4 = T0 * T1 * (1 + model->B3SOIFDasd) / 3
- here->B3SOIFDcdmin * pParam->B3SOIFDvsdfb;
} else
{
T0 = pParam->B3SOIFDvsdfb - pParam->B3SOIFDvsdth;
pParam->B3SOIFDsdt1 = pParam->B3SOIFDvsdth + model->B3SOIFDasd * T0;
T1 = here->B3SOIFDcsmin - here->B3SOIFDcsbox;
T2 = T1 / T0 / T0;
pParam->B3SOIFDst2 = T2 / model->B3SOIFDasd;
pParam->B3SOIFDst3 = T2 /( 1 - model->B3SOIFDasd);
here->B3SOIFDst4 = T0 * T1 * (1 + model->B3SOIFDasd) / 3
- here->B3SOIFDcsbox * pParam->B3SOIFDvsdth;
T1 = here->B3SOIFDcdmin - here->B3SOIFDcdbox;
T2 = T1 / T0 / T0;
pParam->B3SOIFDdt2 = T2 / model->B3SOIFDasd;
pParam->B3SOIFDdt3 = T2 /( 1 - model->B3SOIFDasd);
here->B3SOIFDdt4 = T0 * T1 * (1 + model->B3SOIFDasd) / 3
- here->B3SOIFDcdbox * pParam->B3SOIFDvsdth;
}
here->B3SOIFDphi = pParam->B3SOIFDphi;
/* process source/drain series resistance */
here->B3SOIFDdrainConductance = model->B3SOIFDsheetResistance
* here->B3SOIFDdrainSquares;
if (here->B3SOIFDdrainConductance > 0.0)
here->B3SOIFDdrainConductance = 1.0
/ here->B3SOIFDdrainConductance;
else
here->B3SOIFDdrainConductance = 0.0;
here->B3SOIFDsourceConductance = model->B3SOIFDsheetResistance
* here->B3SOIFDsourceSquares;
if (here->B3SOIFDsourceConductance > 0.0)
here->B3SOIFDsourceConductance = 1.0
/ here->B3SOIFDsourceConductance;
else
here->B3SOIFDsourceConductance = 0.0;
here->B3SOIFDcgso = pParam->B3SOIFDcgso;
here->B3SOIFDcgdo = pParam->B3SOIFDcgdo;
}
}
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: b3soifdtrunc.c 98/5/01
**********/
#include "ngspice.h"
#include <stdio.h>
#include <math.h>
#include "cktdefs.h"
#include "b3soifddef.h"
#include "sperror.h"
#include "suffix.h"
int
B3SOIFDtrunc(inModel,ckt,timeStep)
GENmodel *inModel;
CKTcircuit *ckt;
double *timeStep;
{
B3SOIFDmodel *model = (B3SOIFDmodel*)inModel;
B3SOIFDinstance *here;
#ifdef STEPDEBUG
double debugtemp;
#endif /* STEPDEBUG */
for (; model != NULL; model = model->B3SOIFDnextModel)
{ for (here = model->B3SOIFDinstances; here != NULL;
here = here->B3SOIFDnextInstance)
{
#ifdef STEPDEBUG
debugtemp = *timeStep;
#endif /* STEPDEBUG */
CKTterr(here->B3SOIFDqb,ckt,timeStep);
CKTterr(here->B3SOIFDqg,ckt,timeStep);
CKTterr(here->B3SOIFDqd,ckt,timeStep);
#ifdef STEPDEBUG
if(debugtemp != *timeStep)
{ printf("device %s reduces step from %g to %g\n",
here->B3SOIFDname,debugtemp,*timeStep);
}
#endif /* STEPDEBUG */
}
}
return(OK);
}

View File

@ -85,10 +85,12 @@ INP2M (void *ckt, INPtables * tab, card * current)
INPgetMod (ckt, model, &thismodel, tab); /* get pointer to the model */
if (thismodel != NULL)
{
if (thismodel->INPmodType != INPtypelook ("B3SOIPD"))
if ((thismodel->INPmodType != INPtypelook ("B3SOIPD")) &&
(thismodel->INPmodType != INPtypelook ("B3SOIFD"))
)
{
/* if model is not variable node B3SOIPD model, error! */
LITERR ("only level 9 B3SOIPD can have 7 nodes") return;
LITERR ("only level 9-10 B3SOI(PD | FD) can have 7 nodes") return;
}
else
{ /* if looking at B3SOIPD model, allocate the 7th node */
@ -100,10 +102,12 @@ INP2M (void *ckt, INPtables * tab, card * current)
}
else
{ /* 7th token is a model - only have 6 terminal device */
if (thismodel->INPmodType != INPtypelook ("B3SOIPD"))
if ((thismodel->INPmodType != INPtypelook ("B3SOIPD")) &&
(thismodel->INPmodType != INPtypelook ("B3SOIFD"))
)
{
/* if model is not variable node B3SOIPD model, error! */
LITERR ("only level 9 B3SOIPD can have 6 nodes") return;
LITERR ("only level 9-10 B3SOI(PD | FD) can have 6 nodes") return;
}
else
{ /* if looking at B3SOIPD model, allocate the 6th node */
@ -115,10 +119,12 @@ INP2M (void *ckt, INPtables * tab, card * current)
}
else
{ /* 6th token is a model - only have 5 terminal device */
if (thismodel->INPmodType != INPtypelook ("B3SOIPD"))
if ((thismodel->INPmodType != INPtypelook ("B3SOIPD")) &&
(thismodel->INPmodType != INPtypelook ("B3SOIFD"))
)
{
/* if model is not variable node B3SOIPD model, error! */
LITERR ("only level 9 B3SOIPD can have 5 nodes") return;
LITERR ("only level 9-10 B3SOI(PD | FD) can have 5 nodes") return;
}
else
{ /* if looking at B3SOIPD model, allocate the 5th node */
@ -150,6 +156,7 @@ INP2M (void *ckt, INPtables * tab, card * current)
&& thismodel->INPmodType != INPtypelook ("BSIM2")
&& thismodel->INPmodType != INPtypelook ("BSIM3")
&& thismodel->INPmodType != INPtypelook ("B3SOIPD")
&& thismodel->INPmodType != INPtypelook ("B3SOIFD")
&& thismodel->INPmodType != INPtypelook ("BSIM4")
&& thismodel->INPmodType != INPtypelook ("BSIM3V1")
&& thismodel->INPmodType != INPtypelook ("BSIM3V2"))
@ -181,7 +188,9 @@ INP2M (void *ckt, INPtables * tab, card * current)
IFC (bindNode, (ckt, fast, 2, node2));
IFC (bindNode, (ckt, fast, 3, node3));
IFC (bindNode, (ckt, fast, 4, node4));
if (thismodel->INPmodType == INPtypelook ("B3SOIPD"))
if ((thismodel->INPmodType == INPtypelook ("B3SOIPD")) ||
(thismodel->INPmodType == INPtypelook ("B3SOIFD"))
)
{
switch (nodeflag)
{

View File

@ -0,0 +1,16 @@
## Process this file with automake to produce Makefile.in
TESTS = \
t3.cir \
t4.cir \
t5.cir \
inv2.cir \
RampVg2.cir
TESTS_ENVIRONMENT = $(SHELL) $(srcdir)/../check.sh $(top_builddir)/src/ngspice
EXTRA_DIST = \
$(TESTS) \
$(TESTS:.cir=.out)
MAINTAINERCLEANFILES = Makefile.in

View File

@ -0,0 +1,19 @@
* BSIMSOI example
*
* SOI, Ramp Vg
Vd d 0 1.5
Vg g 0 0.0 PULSE 0V 2V .02n .1n .1n .2n .6n
Ve e 0 0.0
Vs s 0 0.0
Vb b 0 0.0
m1 d g s e n1 w=10u l=0.25u debug=-1
.option gmin=1e-20 itl1=200 itl2=200 abstol=1e-9
.tran 1p 1.0ns
.print m1#Vbs, V(g)/10
.include nmosfd.mod
.end

View File

@ -0,0 +1,13 @@
Error: no data saved for Transient analysis; analysis not run
doAnalyses: not found
run simulation(s) aborted
Error: .print: no m1#vbs analysis found.
Circuit: * BSIMSOI example
Warning: Pd = 0 is less than W.
Warning: Ps = 0 is less than W.

17
tests/bsim3soifd/inv2.cir Normal file
View File

@ -0,0 +1,17 @@
* model = BSIMSOI (FD)
*
*
* SOI Inverter - floating body
vin in 0 dc 2.5
vdd dd 0 dc 2.5
vss ss 0 dc 0
ve e 0 dc 1.25
m1 out in dd e p1 w=20u l=0.25u
m2 out in ss e n1 w=10u l=0.25u
.option itl1=500 gmin=1e-25
.dc vin 0 2.5 0.01
.print v(in), v(out)
.include nmosfd.mod
.include pmosfd.mod

15
tests/bsim3soifd/inv2.out Normal file
View File

@ -0,0 +1,15 @@
Error: no data saved for D.C. Transfer curve analysis; analysis not run
doAnalyses: not found
run simulation(s) aborted
Error: .print: no v(in) analysis found.
Circuit: * model = BSIMSOI (FD)
Warning: Pd = 0 is less than W.
Warning: Ps = 0 is less than W.
Warning: Pd = 0 is less than W.
Warning: Ps = 0 is less than W.

110
tests/bsim3soifd/lib.h Normal file
View File

@ -0,0 +1,110 @@
.subckt dum ss
mn1 ss ss ss ss ss n1 w=4u l=0.15u debug=1 AS=6p AD=6p PS=7u PD=7u
.ends dum
* XOR2
.subckt xnor2 dd ss sub A B out
mn1 T1 A C1 sub n1 w=4u l=0.15u AS=6p AD=6p PS=7u PD=7u
mn2 C1 B ss sub n1 w=4u l=0.15u AS=6p AD=6p PS=7u PD=7u
mn3 out A C2 sub n1 w=4u l=0.15u AS=6p AD=6p PS=7u PD=7u
mn4 out B C2 sub n1 w=4u l=0.15u AS=6p AD=6p PS=7u PD=7u
mn5 C2 T1 ss sub n1 w=4u l=0.15u AS=6p AD=6p PS=7u PD=7u
mp1 T1 A dd sub p1 w=10u l=0.15u AS=15p AD=15p PS=13u PD=13u
mp2 T1 B dd sub p1 w=10u l=0.15u AS=15p AD=15p PS=13u PD=13u
mp3 out A C3 sub p1 w=10u l=0.15u AS=15p AD=15p PS=13u PD=13u
mp4 C3 B dd sub p1 w=10u l=0.15u AS=15p AD=15p PS=13u PD=13u
mp5 out T1 dd sub p1 w=10u l=0.15u AS=15p AD=15p PS=13u PD=13u
.ends xnor2
.subckt nor2 dd ss sub A B out
mn1 out A ss sub n1 w=4u l=0.15u AS=6p AD=6p PS=7u PD=7u
mn2 out B ss sub n1 w=4u l=0.15u AS=6p AD=6p PS=7u PD=7u
mp1 out A C1 sub p1 w=10u l=0.15u AS=15p AD=15p PS=13u PD=13u
mp2 C1 B dd sub p1 w=10u l=0.15u AS=15p AD=15p PS=13u PD=13u
.ends nor2
.subckt nand2 dd ss sub A B out
mn1 out A C1 sub n1 w=4u l=0.15u AS=6p AD=6p PS=7u PD=7u
mn2 C1 B ss sub n1 w=4u l=0.15u AS=6p AD=6p PS=7u PD=7u
mp1 out A dd sub p1 w=10u l=0.15u AS=15p AD=15p PS=13u PD=13u
mp2 out B dd sub p1 w=10u l=0.15u AS=15p AD=15p PS=13u PD=13u
.ends nand2
.subckt nor3 dd ss sub A B C out
mn1 out A ss sub n1 w=4u l=0.15u AS=6p AD=6p PS=7u PD=7u
mn2 out B ss sub n1 w=4u l=0.15u AS=6p AD=6p PS=7u PD=7u
mn3 out C ss sub n1 w=4u l=0.15u AS=6p AD=6p PS=7u PD=7u
mp1 out A C1 sub p1 w=10u l=0.15u AS=15p AD=15p PS=13u PD=13u
mp2 C1 B C2 sub p1 w=10u l=0.15u AS=15p AD=15p PS=13u PD=13u
mp3 C2 C dd sub p1 w=10u l=0.15u AS=15p AD=15p PS=13u PD=13u
.ends nor3
.subckt nand3 dd ss sub A B C out
mn1 out A C1 sub n1 w=4u l=0.15u AS=6p AD=6p PS=7u PD=7u
mn2 C1 B C2 sub n1 w=4u l=0.15u AS=6p AD=6p PS=7u PD=7u
mn3 C2 C ss sub n1 w=4u l=0.15u AS=6p AD=6p PS=7u PD=7u
mp1 out A dd sub p1 w=10u l=0.15u AS=15p AD=15p PS=13u PD=13u
mp2 out B dd sub p1 w=10u l=0.15u AS=15p AD=15p PS=13u PD=13u
mp3 out C dd sub p1 w=10u l=0.15u AS=15p AD=15p PS=13u PD=13u
.ends nand3
.subckt nor4 dd ss sub A B C D out
mn1 out A ss sub n1 w=4u l=0.15u AS=6p AD=6p PS=7u PD=7u
mn2 out B ss sub n1 w=4u l=0.15u AS=6p AD=6p PS=7u PD=7u
mn3 out C ss sub n1 w=4u l=0.15u AS=6p AD=6p PS=7u PD=7u
mn4 out C ss sub n1 w=4u l=0.15u AS=6p AD=6p PS=7u PD=7u
mp1 out A C1 sub p1 w=10u l=0.15u AS=15p AD=15p PS=13u PD=13u
mp2 C1 B C2 sub p1 w=10u l=0.15u AS=15p AD=15p PS=13u PD=13u
mp3 C2 C C3 sub p1 w=10u l=0.15u AS=15p AD=15p PS=13u PD=13u
mp4 C3 C dd sub p1 w=10u l=0.15u AS=15p AD=15p PS=13u PD=13u
.ends nor4
.subckt nand4 dd ss sub A B C D out
mn1 out A C1 sub n1 w=4u l=0.15u AS=6p AD=6p PS=7u PD=7u
mn2 C1 B C2 sub n1 w=4u l=0.15u AS=6p AD=6p PS=7u PD=7u
mn3 C2 C C3 sub n1 w=4u l=0.15u AS=6p AD=6p PS=7u PD=7u
mn4 C3 C ss sub n1 w=4u l=0.15u AS=6p AD=6p PS=7u PD=7u
mp1 out A dd sub p1 w=10u l=0.15u AS=15p AD=15p PS=13u PD=13u
mp2 out B dd sub p1 w=10u l=0.15u AS=15p AD=15p PS=13u PD=13u
mp3 out C dd sub p1 w=10u l=0.15u AS=15p AD=15p PS=13u PD=13u
mp4 out C dd sub p1 w=10u l=0.15u AS=15p AD=15p PS=13u PD=13u
.ends nand4
.subckt inv1 dd ss sub in out
mn1 out in ss sub n1 w=4u l=0.15u AS=6p AD=6p PS=7u PD=7u
mp1 out in dd sub p1 w=10u l=0.15u AS=15p AD=15p PS=13u PD=13u
.ends inv1
.subckt inv5 dd ss sub in out
xinv1 dd ss sub in 1 inv1
xinv2 dd ss sub 1 2 inv1
xinv3 dd ss sub 2 3 inv1
xinv4 dd ss sub 3 4 inv1
xinv5 dd ss sub 4 out inv1
.ends inv5
.subckt inv25 dd ss sub in out
xinv1 dd ss sub in 1 inv5
xinv2 dd ss sub 1 2 inv5
xinv3 dd ss sub 2 3 inv5
xinv4 dd ss sub 3 4 inv5
xinv5 dd ss sub 4 out inv5
.ends inv25
.subckt inv125 dd ss sub in out
xinv1 dd ss sub in 1 inv25
xinv2 dd ss sub 1 2 inv25
xinv3 dd ss sub 2 3 inv25
xinv4 dd ss sub 3 4 inv25
xinv5 dd ss sub 4 out inv25
.ends inv125
.subckt inv625 dd ss sub in out
xinv1 dd ss sub in 1 inv125
xinv2 dd ss sub 1 2 inv125
xinv3 dd ss sub 2 3 inv125
xinv4 dd ss sub 3 4 inv125
xinv5 dd ss sub 4 out inv125
.ends inv625

View File

@ -0,0 +1,39 @@
*Model Card for BSIMFD2.0, floating body FD SOI NMOS
*Released on 2/15/99
.Model N1 NMOS Level= 10
+TNOM = 27 TOX = 4.5E-09 TSI = 5e-8 TBOX = 8E-08
+MOBMOD = 0 CAPMOD = 3 SHMOD = 0
+PARAMCHK=0 WINT = 0 LINT = -2E-08
+VTH0 = .52 K1 = .39 K2 = .1 K3 = 0
+KB1 = .95 K3B = 2.2 NLX = 7.2E-08
+DVT0 = .55 DVT1 = .28 DVT2 = -1.4
+DVT0W = 0 DVT1W = 0 DVT2W = 0
+NCH = 3.3E+17 NSUB = 1E+15 NGATE = 1E+20
+DVBD0 = 60.0 DVBD1 = 1.1 VBSA = 0.0
+KB3 = 2.2 DELP = 0.02
+ABP = 0.9 MXC = 0.9 ADICE0 = 0.93
+KBJT1 = 1.0E-08 EDL = .0000005
+NDIODE = 1.13 NTUN = 14.0
+ISBJT = 2e-6 ISDIF = 1e-6 ISTUN = 0.0 ISREC = 1e-5
+XBJT = 0.01 XDIF = 0.01 XREC = 0.01 XTUN = 0.001
+U0 = 352 UA = 1.3E-11 UB = 1.7E-18 UC = -4E-10
+W0 = 1.16E-06 AGS = .25 A1 = 0 A2 = 1
+B0 = .01 B1 = 10
+RDSW = 700 PRWG = 0 PRWB = -.2 WR = 1
+RBODY = 0.0 RBSH = 0.0
+A0 = 1.4 KETA = -.67 VSAT = 135000
+DWG = 0 DWB = 0
+ALPHA0 = 0.0 ALPHA1 = 1.5 BETA0 = 20.5
+AII = 1.2 BII = 0.1e-7 CII = 0.8 DII = 0.6
+VOFF = -.14 NFACTOR = .7 CDSC = .00002 CDSCB = 0
+CDSCD = 0 CIT = 0
+PCLM = 2.9 PVAG = 12 PDIBLC1 = .18 PDIBLC2 = .004
+PDIBLCB = -.234 DROUT = .2
+DELTA = .01 ETA0 = .01 ETAB = 0
+DSUB = .3 RTH0 = .006
+CLC = .0000001 CLE = .6 CF = 1E-20 CKAPPA = .6
+CGDL = 1E-20 CGSL = 1E-20 KT1 = -.3 KT1L = 0
+KT2 = .022 UTE = -1.5 UA1 = 4.31E-09 UB1 = -7.61E-18
+UC1 = -5.6E-11 PRT = 760 AT = 22400
+CGSO = 1e-10 CGDO = 1e-10 CJSWG = 5e-10 TT=3e-10
+ASD = 0.3 CSDESW = 1e-12

View File

@ -0,0 +1,39 @@
*Model Card for BSIMFD2.0, floating body FD SOI PMOS
*Released on 2/15/99
.Model P1 PMOS Level= 10
+TNOM = 27 TOX = 4.5E-09 TSI = 5e-8 TBOX = 8E-08
+MOBMOD = 2 CAPMOD = 3 SHMOD = 0
+WINT = 0 LINT = -2E-08
+VTH0 = -.52 K1 = .39 K2 = .1 K3 = 0
+KB1 = .95 K3B = 2.2 NLX = 7.2E-08
+DVT0 = .55 DVT1 = .28 DVT2 = -1.4
+DVT0W = 0 DVT1W = 0 DVT2W = 0
+NCH = 3.0E+17 NSUB = 1E+15 NGATE = 1E+20
+DVBD0 = 60.0 DVBD1 = 1.1 VBSA = -0.2
+KB3 = 2.2 DELP = 0.02
+ABP = 0.9 MXC = 0.9 ADICE0 = 0.93
+KBJT1 = 1.0E-08 EDL = .0000005
+NDIODE = 1.13 NTUN = 14.0
+ISBJT = 0.0 ISDIF = 1e-6 ISTUN = 0.0 ISREC = 0.0
+XBJT = 0.01 XDIF = 0.01 XREC = 0.01 XTUN = 0.001
+U0 = 145 UA = 1.3E-11 UB = 1.7E-18 UC = -4E-10
+W0 = 1.16E-06 AGS = .25 A1 = 0 A2 = 1
+B0 = .01 B1 = 10
+RDSW = 700 PRWG = 0 PRWB = -.2 WR = 1
+RBODY = 0.0 RBSH = 0.0
+A0 = 1.4 KETA = -.67 VSAT = 75000
+DWG = 0 DWB = 0
+ALPHA0 = 0.0 ALPHA1 = 1e-4 BETA0 = 19
+AII = 1.25 BII = 0.1e-7 CII = 0.8 DII = 0.6
+VOFF = -.14 NFACTOR = .7 CDSC = .00002 CDSCB = 0
+CDSCD = 0 CIT = 0
+PCLM = 2.9 PVAG = 12 PDIBLC1 = .18 PDIBLC2 = .004
+PDIBLCB = -.234 DROUT = .2
+DELTA = .01 ETA0 = .01 ETAB = 0
+DSUB = .3 RTH0 = .006
+CLC = .0000001 CLE = .6 CF = 1E-20 CKAPPA = .6
+CGDL = 1E-20 CGSL = 1E-20 KT1 = -.3 KT1L = 0
+KT2 = .022 UTE = -1.5 UA1 = 4.31E-09 UB1 = -7.61E-18
+UC1 = -5.6E-11 PRT = 760 AT = 22400
+CGSO = 1e-10 CGDO = 1e-10 CJSWG = 5e-10 TT=3e-10
+ASD = 0.3 CSDESW = 1e-12

View File

@ -0,0 +1,23 @@
* 51 stage Ring-Osc.
vin in out 2 pulse 2 0 0.1n 5n 1 1 1
vdd dd 0 dc 0 pulse 0 2 0 1n 1 1 1
vss ss 0 dc 0
ve sub 0 dc 0
xinv1 dd ss sub in out25 inv25
xinv2 dd ss sub out25 out50 inv25
xinv5 dd ss sub out50 out inv1
xinv11 dd ss sub out buf inv1
cout buf ss 1pF
xdum ss dum
.option itl1=500 gmin=1e-15 itl4=10
*.dc vdd 0 2 0.01
.tran 0.2n 50n
.include nmosfd.mod
.include pmosfd.mod
.include lib.h
.end

18
tests/bsim3soifd/t3.cir Normal file
View File

@ -0,0 +1,18 @@
*model = BSIMSOI
*Berkeley Spice Compatibility
*
* SOI NMOSFET, floating body simulation
vd d 0 dc 1.5
vs s 0 dc 0
ve e 0 dc 0
vg g 0 dc 3
m1 d g s e n1 w=10u l=0.25u
.option gmin=1e-25 itl1=500
.dc vd 0 3 0.01 vg 0.5 3 0.5
.print v(g), i(vs)
.include nmosfd.mod

13
tests/bsim3soifd/t3.out Normal file
View File

@ -0,0 +1,13 @@
Error: no data saved for D.C. Transfer curve analysis; analysis not run
doAnalyses: not found
run simulation(s) aborted
Error: .print: no v(g) analysis found.
Circuit: *model = BSIMSOI
Warning: Pd = 0 is less than W.
Warning: Ps = 0 is less than W.

16
tests/bsim3soifd/t4.cir Normal file
View File

@ -0,0 +1,16 @@
*model = BSIMSOI
*Berkeley Spice Compatibility
*
* SOI NMOSFET, tied body simulation
vd d 0 dc 0.05
vs s 0 dc 0
ve e 0 dc 0
vg g 0 dc 3
vb b 0 dc 0
m1 d g s e b n1 w=10u l=0.25u
.option gmin=1e-25 itl1=500
.dc vg 0 1.5 0.01 vb -0.3 0.5 0.1
.include nmosfd.mod

4
tests/bsim3soifd/t4.out Normal file
View File

@ -0,0 +1,4 @@
Warning: premature EOF
Circuit: *model = BSIMSOI

15
tests/bsim3soifd/t5.cir Normal file
View File

@ -0,0 +1,15 @@
*model = BSIMSOI
*Berkeley Spice Compatibility
*
* SOI NMOSFET, floating body simulation
vd d 0 dc 0.05
vs s 0 dc 0
ve e 0 dc 0
vg g 0 dc 3
m1 d g s e n1 w=10u l=0.25u
.option gmin=1e-25 itl1=500
.dc vg 0 1.5 0.01 ve -4 4 1
.include nmosfd.mod

4
tests/bsim3soifd/t5.out Normal file
View File

@ -0,0 +1,4 @@
Warning: premature EOF
Circuit: *model = BSIMSOI

View File

@ -0,0 +1,172 @@
Circuit: * BSIMSOI (PD) example
Warning: Pd = 0 is less than W.
Warning: Ps = 0 is less than W.
Initial Transient Solution
--------------------------
Node Voltage
---- -------
d 1.5
g 0
e 0
s 0
b 0
vb#branch 0
vs#branch 1.17881e-09
ve#branch 0
vg#branch 1.5e-20
vd#branch -1.17881e-09
* BSIMSOI (PD) example
--------------------------------------------------------------------------------
Index time v(g)/10
--------------------------------------------------------------------------------
0 0.000000e+00 0.000000e+00
1 1.000000e-14 0.000000e+00
2 2.000000e-14 0.000000e+00
3 4.000000e-14 0.000000e+00
4 8.000000e-14 0.000000e+00
5 1.600000e-13 0.000000e+00
6 3.200000e-13 0.000000e+00
7 6.400000e-13 0.000000e+00
8 1.280000e-12 0.000000e+00
9 2.560000e-12 0.000000e+00
10 5.120000e-12 0.000000e+00
11 1.024000e-11 0.000000e+00
12 2.000000e-11 0.000000e+00
13 2.100000e-11 2.000000e-03
14 2.300000e-11 6.000000e-03
15 2.700000e-11 1.400000e-02
16 2.800000e-11 1.600000e-02
17 3.000000e-11 2.000000e-02
18 3.400000e-11 2.800000e-02
19 4.200000e-11 4.400000e-02
20 5.200000e-11 6.400000e-02
21 6.200000e-11 8.400000e-02
22 7.200000e-11 1.040000e-01
23 8.200000e-11 1.240000e-01
24 9.200000e-11 1.440000e-01
25 1.020000e-10 1.640000e-01
26 1.120000e-10 1.840000e-01
27 1.200000e-10 2.000000e-01
28 1.210000e-10 2.000000e-01
29 1.230000e-10 2.000000e-01
30 1.270000e-10 2.000000e-01
31 1.350000e-10 2.000000e-01
32 1.450000e-10 2.000000e-01
33 1.550000e-10 2.000000e-01
34 1.650000e-10 2.000000e-01
35 1.750000e-10 2.000000e-01
36 1.850000e-10 2.000000e-01
37 1.950000e-10 2.000000e-01
38 2.050000e-10 2.000000e-01
39 2.150000e-10 2.000000e-01
40 2.250000e-10 2.000000e-01
41 2.350000e-10 2.000000e-01
42 2.450000e-10 2.000000e-01
43 2.550000e-10 2.000000e-01
44 2.650000e-10 2.000000e-01
45 2.750000e-10 2.000000e-01
46 2.850000e-10 2.000000e-01
47 2.950000e-10 2.000000e-01
48 3.050000e-10 2.000000e-01
49 3.150000e-10 2.000000e-01
50 3.200000e-10 2.000000e-01
51 3.210000e-10 1.980000e-01
52 3.230000e-10 1.940000e-01
53 3.270000e-10 1.860000e-01
54 3.350000e-10 1.700000e-01
Index time v(g)/10
--------------------------------------------------------------------------------
55 3.450000e-10 1.500000e-01
56 3.550000e-10 1.300000e-01
57 3.650000e-10 1.100000e-01
58 3.750000e-10 9.000000e-02
59 3.850000e-10 7.000000e-02
60 3.950000e-10 5.000000e-02
61 4.050000e-10 3.000000e-02
62 4.150000e-10 1.000000e-02
63 4.200000e-10 0.000000e+00
64 4.210000e-10 0.000000e+00
65 4.230000e-10 0.000000e+00
66 4.270000e-10 0.000000e+00
67 4.350000e-10 0.000000e+00
68 4.450000e-10 0.000000e+00
69 4.550000e-10 0.000000e+00
70 4.650000e-10 0.000000e+00
71 4.750000e-10 0.000000e+00
72 4.850000e-10 0.000000e+00
73 4.950000e-10 0.000000e+00
74 5.050000e-10 0.000000e+00
75 5.150000e-10 0.000000e+00
76 5.250000e-10 0.000000e+00
77 5.350000e-10 0.000000e+00
78 5.450000e-10 0.000000e+00
79 5.550000e-10 0.000000e+00
80 5.650000e-10 0.000000e+00
81 5.750000e-10 0.000000e+00
82 5.850000e-10 0.000000e+00
83 5.950000e-10 0.000000e+00
84 6.050000e-10 0.000000e+00
85 6.150000e-10 0.000000e+00
86 6.200000e-10 4.523644e-17
87 6.210000e-10 2.000000e-03
88 6.230000e-10 6.000000e-03
89 6.270000e-10 1.400000e-02
90 6.280000e-10 1.600000e-02
91 6.300000e-10 2.000000e-02
92 6.340000e-10 2.800000e-02
93 6.420000e-10 4.400000e-02
94 6.520000e-10 6.400000e-02
95 6.620000e-10 8.400000e-02
96 6.720000e-10 1.040000e-01
97 6.820000e-10 1.240000e-01
98 6.920000e-10 1.440000e-01
99 7.020000e-10 1.640000e-01
100 7.120000e-10 1.840000e-01
101 7.200000e-10 2.000000e-01
102 7.210000e-10 2.000000e-01
103 7.230000e-10 2.000000e-01
104 7.270000e-10 2.000000e-01
105 7.350000e-10 2.000000e-01
106 7.450000e-10 2.000000e-01
107 7.550000e-10 2.000000e-01
108 7.650000e-10 2.000000e-01
109 7.750000e-10 2.000000e-01
110 7.850000e-10 2.000000e-01
111 7.950000e-10 2.000000e-01
112 8.050000e-10 2.000000e-01
Index time v(g)/10
--------------------------------------------------------------------------------
113 8.150000e-10 2.000000e-01
114 8.250000e-10 2.000000e-01
115 8.350000e-10 2.000000e-01
116 8.450000e-10 2.000000e-01
117 8.550000e-10 2.000000e-01
118 8.650000e-10 2.000000e-01
119 8.750000e-10 2.000000e-01
120 8.850000e-10 2.000000e-01
121 8.950000e-10 2.000000e-01
122 9.050000e-10 2.000000e-01
123 9.150000e-10 2.000000e-01
124 9.200000e-10 2.000000e-01
125 9.210000e-10 1.980000e-01
126 9.230000e-10 1.940000e-01
127 9.270000e-10 1.860000e-01
128 9.350000e-10 1.700000e-01
129 9.450000e-10 1.500000e-01
130 9.550000e-10 1.300000e-01
131 9.650000e-10 1.100000e-01
132 9.750000e-10 9.000000e-02
133 9.850000e-10 7.000000e-02
134 9.950000e-10 5.000000e-02
135 1.000000e-09 4.000000e-02

279
tests/bsim3soipd/inv2.out Normal file
View File

@ -0,0 +1,279 @@
Circuit: * model = BSIMSOI (PD)
Warning: Pd = 0 is less than W.
Warning: Ps = 0 is less than W.
Warning: Pd = 0 is less than W.
Warning: Ps = 0 is less than W.
* model = BSIMSOI (PD)
DC transfer characteristic Sat Dec 9 18:04:21 2000
--------------------------------------------------------------------------------
Index v-sweep v(in) v(out)
--------------------------------------------------------------------------------
0 0.000000e+00 0.000000e+00 2.499999e+00
1 1.000000e-02 1.000000e-02 2.499998e+00
2 2.000000e-02 2.000000e-02 2.499998e+00
3 3.000000e-02 3.000000e-02 2.499997e+00
4 4.000000e-02 4.000000e-02 2.499996e+00
5 5.000000e-02 5.000000e-02 2.499994e+00
6 6.000000e-02 6.000000e-02 2.499991e+00
7 7.000000e-02 7.000000e-02 2.499986e+00
8 8.000000e-02 8.000000e-02 2.499980e+00
9 9.000000e-02 9.000000e-02 2.499970e+00
10 1.000000e-01 1.000000e-01 2.499955e+00
11 1.100000e-01 1.100000e-01 2.499934e+00
12 1.200000e-01 1.200000e-01 2.499903e+00
13 1.300000e-01 1.300000e-01 2.499859e+00
14 1.400000e-01 1.400000e-01 2.499799e+00
15 1.500000e-01 1.500000e-01 2.499717e+00
16 1.600000e-01 1.600000e-01 2.499607e+00
17 1.700000e-01 1.700000e-01 2.499461e+00
18 1.800000e-01 1.800000e-01 2.499270e+00
19 1.900000e-01 1.900000e-01 2.499024e+00
20 2.000000e-01 2.000000e-01 2.498710e+00
21 2.100000e-01 2.100000e-01 2.498318e+00
22 2.200000e-01 2.200000e-01 2.497836e+00
23 2.300000e-01 2.300000e-01 2.497253e+00
24 2.400000e-01 2.400000e-01 2.496562e+00
25 2.500000e-01 2.500000e-01 2.495756e+00
26 2.600000e-01 2.600000e-01 2.494834e+00
27 2.700000e-01 2.700000e-01 2.493792e+00
28 2.800000e-01 2.800000e-01 2.492633e+00
29 2.900000e-01 2.900000e-01 2.491358e+00
30 3.000000e-01 3.000000e-01 2.489971e+00
31 3.100000e-01 3.100000e-01 2.488475e+00
32 3.200000e-01 3.200000e-01 2.486875e+00
33 3.300000e-01 3.300000e-01 2.485175e+00
34 3.400000e-01 3.400000e-01 2.483378e+00
35 3.500000e-01 3.500000e-01 2.481488e+00
36 3.600000e-01 3.600000e-01 2.479508e+00
37 3.700000e-01 3.700000e-01 2.477441e+00
38 3.800000e-01 3.800000e-01 2.475290e+00
39 3.900000e-01 3.900000e-01 2.473056e+00
40 4.000000e-01 4.000000e-01 2.470741e+00
41 4.100000e-01 4.100000e-01 2.468347e+00
42 4.200000e-01 4.200000e-01 2.465873e+00
43 4.300000e-01 4.300000e-01 2.463322e+00
44 4.400000e-01 4.400000e-01 2.460692e+00
45 4.500000e-01 4.500000e-01 2.457984e+00
46 4.600000e-01 4.600000e-01 2.455198e+00
47 4.700000e-01 4.700000e-01 2.452333e+00
48 4.800000e-01 4.800000e-01 2.449390e+00
49 4.900000e-01 4.900000e-01 2.446366e+00
50 5.000000e-01 5.000000e-01 2.443261e+00
51 5.100000e-01 5.100000e-01 2.440073e+00
52 5.200000e-01 5.200000e-01 2.436803e+00
53 5.300000e-01 5.300000e-01 2.433447e+00
54 5.400000e-01 5.400000e-01 2.430005e+00
Index v-sweep v(in) v(out)
--------------------------------------------------------------------------------
55 5.500000e-01 5.500000e-01 2.426475e+00
56 5.600000e-01 5.600000e-01 2.422854e+00
57 5.700000e-01 5.700000e-01 2.419142e+00
58 5.800000e-01 5.800000e-01 2.415335e+00
59 5.900000e-01 5.900000e-01 2.411431e+00
60 6.000000e-01 6.000000e-01 2.407429e+00
61 6.100000e-01 6.100000e-01 2.403324e+00
62 6.200000e-01 6.200000e-01 2.399115e+00
63 6.300000e-01 6.300000e-01 2.394799e+00
64 6.400000e-01 6.400000e-01 2.390372e+00
65 6.500000e-01 6.500000e-01 2.385830e+00
66 6.600000e-01 6.600000e-01 2.381171e+00
67 6.700000e-01 6.700000e-01 2.376391e+00
68 6.800000e-01 6.800000e-01 2.371484e+00
69 6.900000e-01 6.900000e-01 2.366448e+00
70 7.000000e-01 7.000000e-01 2.361277e+00
71 7.100000e-01 7.100000e-01 2.355966e+00
72 7.200000e-01 7.200000e-01 2.350511e+00
73 7.300000e-01 7.300000e-01 2.344905e+00
74 7.400000e-01 7.400000e-01 2.339142e+00
75 7.500000e-01 7.500000e-01 2.333216e+00
76 7.600000e-01 7.600000e-01 2.327120e+00
77 7.700000e-01 7.700000e-01 2.320847e+00
78 7.800000e-01 7.800000e-01 2.314387e+00
79 7.900000e-01 7.900000e-01 2.307733e+00
80 8.000000e-01 8.000000e-01 2.300875e+00
81 8.100000e-01 8.100000e-01 2.293803e+00
82 8.200000e-01 8.200000e-01 2.286504e+00
83 8.300000e-01 8.300000e-01 2.278969e+00
84 8.400000e-01 8.400000e-01 2.271182e+00
85 8.500000e-01 8.500000e-01 2.263129e+00
86 8.600000e-01 8.600000e-01 2.254795e+00
87 8.700000e-01 8.700000e-01 2.246161e+00
88 8.800000e-01 8.800000e-01 2.237209e+00
89 8.900000e-01 8.900000e-01 2.227915e+00
90 9.000000e-01 9.000000e-01 2.218257e+00
91 9.100000e-01 9.100000e-01 2.208207e+00
92 9.200000e-01 9.200000e-01 2.197734e+00
93 9.300000e-01 9.300000e-01 2.186804e+00
94 9.400000e-01 9.400000e-01 2.175378e+00
95 9.500000e-01 9.500000e-01 2.163410e+00
96 9.600000e-01 9.600000e-01 2.150849e+00
97 9.700000e-01 9.700000e-01 2.137634e+00
98 9.800000e-01 9.800000e-01 2.123693e+00
99 9.900000e-01 9.900000e-01 2.108943e+00
100 1.000000e+00 1.000000e+00 2.093281e+00
101 1.010000e+00 1.010000e+00 2.076586e+00
102 1.020000e+00 1.020000e+00 2.058704e+00
103 1.030000e+00 1.030000e+00 2.039444e+00
104 1.040000e+00 1.040000e+00 2.018561e+00
105 1.050000e+00 1.050000e+00 1.995734e+00
106 1.060000e+00 1.060000e+00 1.970535e+00
107 1.070000e+00 1.070000e+00 1.942381e+00
108 1.080000e+00 1.080000e+00 1.910487e+00
109 1.090000e+00 1.090000e+00 1.873861e+00
110 1.100000e+00 1.100000e+00 1.831526e+00
111 1.110000e+00 1.110000e+00 1.783131e+00
112 1.120000e+00 1.120000e+00 1.729465e+00
Index v-sweep v(in) v(out)
--------------------------------------------------------------------------------
113 1.130000e+00 1.130000e+00 1.672104e+00
114 1.140000e+00 1.140000e+00 1.612635e+00
115 1.150000e+00 1.150000e+00 1.552288e+00
116 1.160000e+00 1.160000e+00 1.491955e+00
117 1.170000e+00 1.170000e+00 1.432304e+00
118 1.180000e+00 1.180000e+00 1.373879e+00
119 1.190000e+00 1.190000e+00 1.317159e+00
120 1.200000e+00 1.200000e+00 1.262589e+00
121 1.210000e+00 1.210000e+00 1.210557e+00
122 1.220000e+00 1.220000e+00 1.161309e+00
123 1.230000e+00 1.230000e+00 1.114785e+00
124 1.240000e+00 1.240000e+00 1.070348e+00
125 1.250000e+00 1.250000e+00 1.026313e+00
126 1.260000e+00 1.260000e+00 9.804248e-01
127 1.270000e+00 1.270000e+00 9.294193e-01
128 1.280000e+00 1.280000e+00 8.694365e-01
129 1.290000e+00 1.290000e+00 8.002731e-01
130 1.300000e+00 1.300000e+00 7.294810e-01
131 1.310000e+00 1.310000e+00 6.657313e-01
132 1.320000e+00 1.320000e+00 6.123845e-01
133 1.330000e+00 1.330000e+00 5.687190e-01
134 1.340000e+00 1.340000e+00 5.326058e-01
135 1.350000e+00 1.350000e+00 5.020053e-01
136 1.360000e+00 1.360000e+00 4.754247e-01
137 1.370000e+00 1.370000e+00 4.518624e-01
138 1.380000e+00 1.380000e+00 4.306482e-01
139 1.390000e+00 1.390000e+00 4.113201e-01
140 1.400000e+00 1.400000e+00 3.935479e-01
141 1.410000e+00 1.410000e+00 3.770868e-01
142 1.420000e+00 1.420000e+00 3.617495e-01
143 1.430000e+00 1.430000e+00 3.473891e-01
144 1.440000e+00 1.440000e+00 3.338880e-01
145 1.450000e+00 1.450000e+00 3.211499e-01
146 1.460000e+00 1.460000e+00 3.090947e-01
147 1.470000e+00 1.470000e+00 2.976554e-01
148 1.480000e+00 1.480000e+00 2.867748e-01
149 1.490000e+00 1.490000e+00 2.764038e-01
150 1.500000e+00 1.500000e+00 2.664999e-01
151 1.510000e+00 1.510000e+00 2.570258e-01
152 1.520000e+00 1.520000e+00 2.479490e-01
153 1.530000e+00 1.530000e+00 2.392405e-01
154 1.540000e+00 1.540000e+00 2.308747e-01
155 1.550000e+00 1.550000e+00 2.228285e-01
156 1.560000e+00 1.560000e+00 2.150815e-01
157 1.570000e+00 1.570000e+00 2.076149e-01
158 1.580000e+00 1.580000e+00 2.004121e-01
159 1.590000e+00 1.590000e+00 1.934577e-01
160 1.600000e+00 1.600000e+00 1.867378e-01
161 1.610000e+00 1.610000e+00 1.802398e-01
162 1.620000e+00 1.620000e+00 1.739520e-01
163 1.630000e+00 1.630000e+00 1.678637e-01
164 1.640000e+00 1.640000e+00 1.619651e-01
165 1.650000e+00 1.650000e+00 1.562472e-01
166 1.660000e+00 1.660000e+00 1.507015e-01
167 1.670000e+00 1.670000e+00 1.453203e-01
168 1.680000e+00 1.680000e+00 1.400964e-01
169 1.690000e+00 1.690000e+00 1.350231e-01
170 1.700000e+00 1.700000e+00 1.300941e-01
Index v-sweep v(in) v(out)
--------------------------------------------------------------------------------
171 1.710000e+00 1.710000e+00 1.253037e-01
172 1.720000e+00 1.720000e+00 1.206465e-01
173 1.730000e+00 1.730000e+00 1.161173e-01
174 1.740000e+00 1.740000e+00 1.117114e-01
175 1.750000e+00 1.750000e+00 1.074244e-01
176 1.760000e+00 1.760000e+00 1.032521e-01
177 1.770000e+00 1.770000e+00 9.919058e-02
178 1.780000e+00 1.780000e+00 9.523620e-02
179 1.790000e+00 1.790000e+00 9.138549e-02
180 1.800000e+00 1.800000e+00 8.763521e-02
181 1.810000e+00 1.810000e+00 8.398230e-02
182 1.820000e+00 1.820000e+00 8.042391e-02
183 1.830000e+00 1.830000e+00 7.695733e-02
184 1.840000e+00 1.840000e+00 7.358002e-02
185 1.850000e+00 1.850000e+00 7.028961e-02
186 1.860000e+00 1.860000e+00 6.708387e-02
187 1.870000e+00 1.870000e+00 6.396070e-02
188 1.880000e+00 1.880000e+00 6.091816e-02
189 1.890000e+00 1.890000e+00 5.795442e-02
190 1.900000e+00 1.900000e+00 5.506780e-02
191 1.910000e+00 1.910000e+00 5.225674e-02
192 1.920000e+00 1.920000e+00 4.951983e-02
193 1.930000e+00 1.930000e+00 4.685577e-02
194 1.940000e+00 1.940000e+00 4.426340e-02
195 1.950000e+00 1.950000e+00 4.174171e-02
196 1.960000e+00 1.960000e+00 3.928983e-02
197 1.970000e+00 1.970000e+00 3.690704e-02
198 1.980000e+00 1.980000e+00 3.459279e-02
199 1.990000e+00 1.990000e+00 3.234669e-02
200 2.000000e+00 2.000000e+00 3.016853e-02
201 2.010000e+00 2.010000e+00 2.805831e-02
202 2.020000e+00 2.020000e+00 2.601623e-02
203 2.030000e+00 2.030000e+00 2.404272e-02
204 2.040000e+00 2.040000e+00 2.213847e-02
205 2.050000e+00 2.050000e+00 2.030439e-02
206 2.060000e+00 2.060000e+00 1.854169e-02
207 2.070000e+00 2.070000e+00 1.685185e-02
208 2.080000e+00 2.080000e+00 1.523663e-02
209 2.090000e+00 2.090000e+00 1.369807e-02
210 2.100000e+00 2.100000e+00 1.223844e-02
211 2.110000e+00 2.110000e+00 1.086023e-02
212 2.120000e+00 2.120000e+00 9.566064e-03
213 2.130000e+00 2.130000e+00 8.358590e-03
214 2.140000e+00 2.140000e+00 7.240340e-03
215 2.150000e+00 2.150000e+00 6.213542e-03
216 2.160000e+00 2.160000e+00 5.279884e-03
217 2.170000e+00 2.170000e+00 4.440246e-03
218 2.180000e+00 2.180000e+00 3.694423e-03
219 2.190000e+00 2.190000e+00 3.040853e-03
220 2.200000e+00 2.200000e+00 2.476425e-03
221 2.210000e+00 2.210000e+00 1.996391e-03
222 2.220000e+00 2.220000e+00 1.594448e-03
223 2.230000e+00 2.230000e+00 1.262999e-03
224 2.240000e+00 2.240000e+00 9.935716e-04
225 2.250000e+00 2.250000e+00 7.773425e-04
226 2.260000e+00 2.260000e+00 6.056627e-04
227 2.270000e+00 2.270000e+00 4.705014e-04
228 2.280000e+00 2.280000e+00 3.647455e-04
Index v-sweep v(in) v(out)
--------------------------------------------------------------------------------
229 2.290000e+00 2.290000e+00 2.823398e-04
230 2.300000e+00 2.300000e+00 2.182915e-04
231 2.310000e+00 2.310000e+00 1.685819e-04
232 2.320000e+00 2.320000e+00 1.300315e-04
233 2.330000e+00 2.330000e+00 1.001518e-04
234 2.340000e+00 2.340000e+00 7.700730e-05
235 2.350000e+00 2.350000e+00 5.909602e-05
236 2.360000e+00 2.360000e+00 4.525240e-05
237 2.370000e+00 2.370000e+00 3.457075e-05
238 2.380000e+00 2.380000e+00 2.634594e-05
239 2.390000e+00 2.390000e+00 2.002815e-05
240 2.400000e+00 2.400000e+00 1.518814e-05
241 2.410000e+00 2.410000e+00 1.149079e-05
242 2.420000e+00 2.420000e+00 8.674634e-06
243 2.430000e+00 2.430000e+00 6.536017e-06
244 2.440000e+00 2.440000e+00 4.916669e-06
245 2.450000e+00 2.450000e+00 3.693987e-06
246 2.460000e+00 2.460000e+00 2.773298e-06
247 2.470000e+00 2.470000e+00 2.081773e-06
248 2.480000e+00 2.480000e+00 1.563599e-06
249 2.490000e+00 2.490000e+00 1.176165e-06
250 2.500000e+00 2.500000e+00 8.870574e-07

7492
tests/bsim3soipd/ring51.out Normal file

File diff suppressed because it is too large Load Diff

1913
tests/bsim3soipd/t3.out Normal file

File diff suppressed because it is too large Load Diff

1442
tests/bsim3soipd/t4.out Normal file

File diff suppressed because it is too large Load Diff

1442
tests/bsim3soipd/t5.out Normal file

File diff suppressed because it is too large Load Diff