Added support for BSIM3SOI_PD 2.2.1 and changed configuration scripts, makefiles and support routines.
This commit is contained in:
parent
ccfdf80c2e
commit
9606b353db
7
DEVICES
7
DEVICES
|
|
@ -168,4 +168,9 @@ BSIM3SOI_FD - SOI model (fully depleted devices)
|
|||
NOT YET IMPLEMENTED.
|
||||
|
||||
BSIM3SOI_PD - SOI model (partially depleted devices)
|
||||
NOT YET IMPLEMENTED.
|
||||
Initial Release Ver: 2.2.1. TO BE TESTED
|
||||
There is a bsim3soipd directory under the test
|
||||
hierarchy. The tests come from the bsim3soi
|
||||
web site at:
|
||||
http://www-device.eecs.berkeley.edu/~bsim3soi
|
||||
|
||||
|
|
|
|||
|
|
@ -173,7 +173,7 @@ else
|
|||
fi
|
||||
|
||||
AC_DEFINE_UNQUOTED(NGSPICEBINDIR, "`echo $dprefix/bin`" )
|
||||
AC_DEFINE_UNQUOTED(NGSPICEDATADIR, "`echo $dprefix/share/ng-spice-rework`" )
|
||||
AC_DEFINE_UNQUOTED(NGSPICEDATADIR, "`echo $dprefix/share/ng-spice`" )
|
||||
AC_DEFINE_UNQUOTED(NGSPICEBUILDDATE, "`date`" )
|
||||
|
||||
|
||||
|
|
@ -214,6 +214,7 @@ src/spicelib/devices/bsim3v1/Makefile \
|
|||
src/spicelib/devices/bsim3/Makefile \
|
||||
src/spicelib/devices/bsim4/Makefile \
|
||||
src/spicelib/devices/bsim3v2/Makefile \
|
||||
src/spicelib/devices/bsim3soi_pd/Makefile \
|
||||
src/spicelib/devices/cap/Makefile \
|
||||
src/spicelib/devices/cccs/Makefile \
|
||||
src/spicelib/devices/ccvs/Makefile \
|
||||
|
|
|
|||
|
|
@ -22,6 +22,7 @@ DYNAMIC_DEVICELIBS = \
|
|||
spicelib/devices/bsim3v2/libbsim3v2.la \
|
||||
spicelib/devices/bsim4/libbsim4.la \
|
||||
spicelib/devices/cap/libcap.la \
|
||||
spicelib/devices/bsim3soi_pd/libbsim3soipd.la \
|
||||
spicelib/devices/cccs/libcccs.la \
|
||||
spicelib/devices/ccvs/libccvs.la \
|
||||
spicelib/devices/ccvs/libccvs.la \
|
||||
|
|
|
|||
|
|
@ -24,6 +24,8 @@ typedef struct sGENinstance {
|
|||
int GENnode3; /* appropriate node numbers */
|
||||
int GENnode4; /* appropriate node numbers */
|
||||
int GENnode5; /* appropriate node numbers */
|
||||
int GENnode6; /* added to create body node 01/06/99 */
|
||||
int GENnode7; /* added to create temp node 2/03/99 */
|
||||
} GENinstance ;
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -9,6 +9,7 @@ SUBDIRS = \
|
|||
bsim4 \
|
||||
bsim3v1 \
|
||||
bsim3v2 \
|
||||
bsim3soi_pd \
|
||||
cap \
|
||||
cccs \
|
||||
ccvs \
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
@ -0,0 +1,4 @@
|
|||
2000-11-14 Paolo Nenzi <p.nenzi@ieee.org>
|
||||
|
||||
* Initial release
|
||||
|
||||
|
|
@ -0,0 +1,34 @@
|
|||
## Process this file with automake to produce Makefile.in
|
||||
|
||||
pkglib_LTLIBRARIES = libbsim3soipd.la
|
||||
|
||||
libbsim3soipd_la_SOURCES = \
|
||||
b3soipd.c \
|
||||
b3soipdacld.c \
|
||||
b3soipdask.c \
|
||||
b3soipdcheck.c \
|
||||
b3soipdcvtest.c \
|
||||
b3soipddel.c \
|
||||
b3soipddest.c \
|
||||
b3soipdgetic.c \
|
||||
b3soipdld.c \
|
||||
b3soipdmask.c \
|
||||
b3soipdmdel.c \
|
||||
b3soipdmpar.c \
|
||||
b3soipdnoi.c \
|
||||
b3soipdpar.c \
|
||||
b3soipdpzld.c \
|
||||
b3soipdset.c \
|
||||
b3soipdtemp.c \
|
||||
b3soipdtrunc.c \
|
||||
b3soipddef.h \
|
||||
b3soipdext.h \
|
||||
b3soipdinit.c \
|
||||
b3soipdinit.h \
|
||||
b3soipditf.h
|
||||
|
||||
|
||||
|
||||
INCLUDES = -I$(top_srcdir)/src/include
|
||||
|
||||
MAINTAINERCLEANFILES = Makefile.in
|
||||
|
|
@ -0,0 +1,730 @@
|
|||
/**********
|
||||
Copyright 1990 Regents of the University of California. All rights reserved.
|
||||
Author: 1998 Samuel Fung, Dennis Sinitsky and Stephen Tang
|
||||
File: b3soipd.c 98/5/01
|
||||
Modified by Pin Su and Jan Feng 99/2/15
|
||||
Modified by Pin Su 99/4/30
|
||||
Modified by Wei Jin 99/9/27
|
||||
Modified by Pin Su 00/3/1
|
||||
**********/
|
||||
|
||||
|
||||
#include "ngspice.h"
|
||||
#include <stdio.h>
|
||||
#include "devdefs.h"
|
||||
#include "b3soipddef.h"
|
||||
#include "suffix.h"
|
||||
|
||||
IFparm B3SOIPDpTable[] = { /* parameters */
|
||||
IOP ("l", B3SOIPD_L, IF_REAL, "Length"),
|
||||
IOP ("w", B3SOIPD_W, IF_REAL, "Width"),
|
||||
IOP ("ad", B3SOIPD_AD, IF_REAL, "Drain area"),
|
||||
IOP ("as", B3SOIPD_AS, IF_REAL, "Source area"),
|
||||
IOP ("pd", B3SOIPD_PD, IF_REAL, "Drain perimeter"),
|
||||
IOP ("ps", B3SOIPD_PS, IF_REAL, "Source perimeter"),
|
||||
IOP ("nrd", B3SOIPD_NRD, IF_REAL, "Number of squares in drain"),
|
||||
IOP ("nrs", B3SOIPD_NRS, IF_REAL, "Number of squares in source"),
|
||||
IOP ("off", B3SOIPD_OFF, IF_FLAG, "Device is initially off"),
|
||||
IP ("ic", B3SOIPD_IC, IF_REALVEC, "Vector of DS,GS,BS initial voltages"),
|
||||
OP ("gmbs", B3SOIPD_GMBS, IF_REAL, "Gmb"),
|
||||
OP ("gm", B3SOIPD_GM, IF_REAL, "Gm"),
|
||||
OP ("gm/ids", B3SOIPD_GMID, IF_REAL, "Gm/Ids"),
|
||||
OP ("gds", B3SOIPD_GDS, IF_REAL, "Gds"),
|
||||
OP ("vdsat", B3SOIPD_VDSAT, IF_REAL, "Vdsat"),
|
||||
OP ("vth", B3SOIPD_VON, IF_REAL, "Vth"),
|
||||
OP ("ids", B3SOIPD_CD, IF_REAL, "Ids"),
|
||||
OP ("vbs", B3SOIPD_VBS, IF_REAL, "Vbs"),
|
||||
OP ("vgs", B3SOIPD_VGS, IF_REAL, "Vgs"),
|
||||
OP ("vds", B3SOIPD_VDS, IF_REAL, "Vds"),
|
||||
OP ("ves", B3SOIPD_VES, IF_REAL, "Ves"),
|
||||
IOP ("bjtoff", B3SOIPD_BJTOFF, IF_INTEGER, "BJT on/off flag"),
|
||||
IOP ("debug", B3SOIPD_DEBUG, IF_INTEGER, "BJT on/off flag"),
|
||||
IOP ("rth0", B3SOIPD_RTH0, IF_REAL, "Instance Thermal Resistance"),
|
||||
IOP ("cth0", B3SOIPD_CTH0, IF_REAL, "Instance Thermal Capacitance"),
|
||||
IOP ("nrb", B3SOIPD_NRB, IF_REAL, "Number of squares in body"),
|
||||
|
||||
|
||||
/* v2.0 release */
|
||||
IOP ("nbc", B3SOIPD_NBC, IF_REAL, "Number of body contact isolation edge"),
|
||||
IOP ("nseg", B3SOIPD_NSEG, IF_REAL,
|
||||
"Number segments for width partitioning"),
|
||||
IOP ("pdbcp", B3SOIPD_PDBCP, IF_REAL,
|
||||
"Perimeter length for bc parasitics at drain side"),
|
||||
IOP ("psbcp", B3SOIPD_PSBCP, IF_REAL,
|
||||
"Perimeter length for bc parasitics at source side"),
|
||||
IOP ("agbcp", B3SOIPD_AGBCP, IF_REAL,
|
||||
"Gate to body overlap area for bc parasitics"),
|
||||
IOP ("aebcp", B3SOIPD_AEBCP, IF_REAL,
|
||||
"Substrate to body overlap area for bc prasitics"),
|
||||
IOP ("vbsusr", B3SOIPD_VBSUSR, IF_REAL, "Vbs specified by user"),
|
||||
IOP ("tnodeout", B3SOIPD_TNODEOUT, IF_FLAG,
|
||||
"Flag indicating external temp node")
|
||||
};
|
||||
|
||||
IFparm B3SOIPDmPTable[] = { /* model parameters */
|
||||
IOP ("capmod", B3SOIPD_MOD_CAPMOD, IF_INTEGER,
|
||||
"Capacitance model selector"),
|
||||
IOP ("mobmod", B3SOIPD_MOD_MOBMOD, IF_INTEGER, "Mobility model selector"),
|
||||
IOP ("noimod", B3SOIPD_MOD_NOIMOD, IF_INTEGER, "Noise model selector"),
|
||||
IOP ("paramchk", B3SOIPD_MOD_PARAMCHK, IF_INTEGER,
|
||||
"Model parameter checking selector"),
|
||||
IOP ("binunit", B3SOIPD_MOD_BINUNIT, IF_INTEGER, "Bin unit selector"),
|
||||
IOP ("version", B3SOIPD_MOD_VERSION, IF_REAL,
|
||||
" parameter for model version"),
|
||||
IOP ("tox", B3SOIPD_MOD_TOX, IF_REAL, "Gate oxide thickness in meters"),
|
||||
|
||||
IOP ("cdsc", B3SOIPD_MOD_CDSC, IF_REAL,
|
||||
"Drain/Source and channel coupling capacitance"),
|
||||
IOP ("cdscb", B3SOIPD_MOD_CDSCB, IF_REAL, "Body-bias dependence of cdsc"),
|
||||
IOP ("cdscd", B3SOIPD_MOD_CDSCD, IF_REAL, "Drain-bias dependence of cdsc"),
|
||||
IOP ("cit", B3SOIPD_MOD_CIT, IF_REAL, "Interface state capacitance"),
|
||||
IOP ("nfactor", B3SOIPD_MOD_NFACTOR, IF_REAL,
|
||||
"Subthreshold swing Coefficient"),
|
||||
IOP ("vsat", B3SOIPD_MOD_VSAT, IF_REAL, "Saturation velocity at tnom"),
|
||||
IOP ("at", B3SOIPD_MOD_AT, IF_REAL, "Temperature coefficient of vsat"),
|
||||
IOP ("a0", B3SOIPD_MOD_A0, IF_REAL,
|
||||
"Non-uniform depletion width effect coefficient."),
|
||||
IOP ("ags", B3SOIPD_MOD_AGS, IF_REAL, "Gate bias coefficient of Abulk."),
|
||||
IOP ("a1", B3SOIPD_MOD_A1, IF_REAL, "Non-saturation effect coefficient"),
|
||||
IOP ("a2", B3SOIPD_MOD_A2, IF_REAL, "Non-saturation effect coefficient"),
|
||||
IOP ("keta", B3SOIPD_MOD_KETA, IF_REAL,
|
||||
"Body-bias coefficient of non-uniform depletion width effect."),
|
||||
IOP ("nsub", B3SOIPD_MOD_NSUB, IF_REAL,
|
||||
"Substrate doping concentration with polarity"),
|
||||
IOP ("nch", B3SOIPD_MOD_NPEAK, IF_REAL, "Channel doping concentration"),
|
||||
IOP ("ngate", B3SOIPD_MOD_NGATE, IF_REAL, "Poly-gate doping concentration"),
|
||||
IOP ("gamma1", B3SOIPD_MOD_GAMMA1, IF_REAL, "Vth body coefficient"),
|
||||
IOP ("gamma2", B3SOIPD_MOD_GAMMA2, IF_REAL, "Vth body coefficient"),
|
||||
IOP ("vbx", B3SOIPD_MOD_VBX, IF_REAL, "Vth transition body Voltage"),
|
||||
IOP ("vbm", B3SOIPD_MOD_VBM, IF_REAL, "Maximum body voltage"),
|
||||
|
||||
IOP ("xt", B3SOIPD_MOD_XT, IF_REAL, "Doping depth"),
|
||||
IOP ("k1", B3SOIPD_MOD_K1, IF_REAL, "Bulk effect coefficient 1"),
|
||||
IOP ("kt1", B3SOIPD_MOD_KT1, IF_REAL, "Temperature coefficient of Vth"),
|
||||
IOP ("kt1l", B3SOIPD_MOD_KT1L, IF_REAL, "Temperature coefficient of Vth"),
|
||||
IOP ("kt2", B3SOIPD_MOD_KT2, IF_REAL, "Body-coefficient of kt1"),
|
||||
IOP ("k2", B3SOIPD_MOD_K2, IF_REAL, "Bulk effect coefficient 2"),
|
||||
IOP ("k3", B3SOIPD_MOD_K3, IF_REAL, "Narrow width effect coefficient"),
|
||||
IOP ("k3b", B3SOIPD_MOD_K3B, IF_REAL, "Body effect coefficient of k3"),
|
||||
IOP ("w0", B3SOIPD_MOD_W0, IF_REAL, "Narrow width effect parameter"),
|
||||
IOP ("nlx", B3SOIPD_MOD_NLX, IF_REAL, "Lateral non-uniform doping effect"),
|
||||
IOP ("dvt0", B3SOIPD_MOD_DVT0, IF_REAL, "Short channel effect coeff. 0"),
|
||||
IOP ("dvt1", B3SOIPD_MOD_DVT1, IF_REAL, "Short channel effect coeff. 1"),
|
||||
IOP ("dvt2", B3SOIPD_MOD_DVT2, IF_REAL, "Short channel effect coeff. 2"),
|
||||
IOP ("dvt0w", B3SOIPD_MOD_DVT0W, IF_REAL, "Narrow Width coeff. 0"),
|
||||
IOP ("dvt1w", B3SOIPD_MOD_DVT1W, IF_REAL, "Narrow Width effect coeff. 1"),
|
||||
IOP ("dvt2w", B3SOIPD_MOD_DVT2W, IF_REAL, "Narrow Width effect coeff. 2"),
|
||||
IOP ("drout", B3SOIPD_MOD_DROUT, IF_REAL,
|
||||
"DIBL coefficient of output resistance"),
|
||||
IOP ("dsub", B3SOIPD_MOD_DSUB, IF_REAL,
|
||||
"DIBL coefficient in the subthreshold region"),
|
||||
IOP ("vth0", B3SOIPD_MOD_VTH0, IF_REAL, "Threshold voltage"),
|
||||
IOP ("vtho", B3SOIPD_MOD_VTH0, IF_REAL, "Threshold voltage"),
|
||||
IOP ("ua", B3SOIPD_MOD_UA, IF_REAL, "Linear gate dependence of mobility"),
|
||||
IOP ("ua1", B3SOIPD_MOD_UA1, IF_REAL, "Temperature coefficient of ua"),
|
||||
IOP ("ub", B3SOIPD_MOD_UB, IF_REAL,
|
||||
"Quadratic gate dependence of mobility"),
|
||||
IOP ("ub1", B3SOIPD_MOD_UB1, IF_REAL, "Temperature coefficient of ub"),
|
||||
IOP ("uc", B3SOIPD_MOD_UC, IF_REAL, "Body-bias dependence of mobility"),
|
||||
IOP ("uc1", B3SOIPD_MOD_UC1, IF_REAL, "Temperature coefficient of uc"),
|
||||
IOP ("u0", B3SOIPD_MOD_U0, IF_REAL, "Low-field mobility at Tnom"),
|
||||
IOP ("ute", B3SOIPD_MOD_UTE, IF_REAL,
|
||||
"Temperature coefficient of mobility"),
|
||||
IOP ("voff", B3SOIPD_MOD_VOFF, IF_REAL, "Threshold voltage offset"),
|
||||
IOP ("tnom", B3SOIPD_MOD_TNOM, IF_REAL,
|
||||
"Parameter measurement temperature"),
|
||||
IOP ("cgso", B3SOIPD_MOD_CGSO, IF_REAL,
|
||||
"Gate-source overlap capacitance per width"),
|
||||
IOP ("cgdo", B3SOIPD_MOD_CGDO, IF_REAL,
|
||||
"Gate-drain overlap capacitance per width"),
|
||||
IOP ("xpart", B3SOIPD_MOD_XPART, IF_REAL, "Channel charge partitioning"),
|
||||
IOP ("delta", B3SOIPD_MOD_DELTA, IF_REAL, "Effective Vds parameter"),
|
||||
IOP ("rsh", B3SOIPD_MOD_RSH, IF_REAL, "Source-drain sheet resistance"),
|
||||
IOP ("rdsw", B3SOIPD_MOD_RDSW, IF_REAL,
|
||||
"Source-drain resistance per width"),
|
||||
|
||||
IOP ("prwg", B3SOIPD_MOD_PRWG, IF_REAL,
|
||||
"Gate-bias effect on parasitic resistance "),
|
||||
IOP ("prwb", B3SOIPD_MOD_PRWB, IF_REAL,
|
||||
"Body-effect on parasitic resistance "),
|
||||
|
||||
IOP ("prt", B3SOIPD_MOD_PRT, IF_REAL,
|
||||
"Temperature coefficient of parasitic resistance "),
|
||||
IOP ("eta0", B3SOIPD_MOD_ETA0, IF_REAL,
|
||||
"Subthreshold region DIBL coefficient"),
|
||||
IOP ("etab", B3SOIPD_MOD_ETAB, IF_REAL,
|
||||
"Subthreshold region DIBL coefficient"),
|
||||
IOP ("pclm", B3SOIPD_MOD_PCLM, IF_REAL,
|
||||
"Channel length modulation Coefficient"),
|
||||
IOP ("pdiblc1", B3SOIPD_MOD_PDIBL1, IF_REAL,
|
||||
"Drain-induced barrier lowering coefficient"),
|
||||
IOP ("pdiblc2", B3SOIPD_MOD_PDIBL2, IF_REAL,
|
||||
"Drain-induced barrier lowering coefficient"),
|
||||
IOP ("pdiblcb", B3SOIPD_MOD_PDIBLB, IF_REAL,
|
||||
"Body-effect on drain-induced barrier lowering"),
|
||||
|
||||
IOP ("pvag", B3SOIPD_MOD_PVAG, IF_REAL,
|
||||
"Gate dependence of output resistance parameter"),
|
||||
|
||||
IOP ("shmod", B3SOIPD_MOD_SHMOD, IF_INTEGER, "Self heating mode selector"),
|
||||
IOP ("ddmod", B3SOIPD_MOD_DDMOD, IF_INTEGER,
|
||||
"Dynamic depletion mode selector"),
|
||||
IOP ("tbox", B3SOIPD_MOD_TBOX, IF_REAL,
|
||||
"Back gate oxide thickness in meters"),
|
||||
IOP ("tsi", B3SOIPD_MOD_TSI, IF_REAL,
|
||||
"Silicon-on-insulator thickness in meters"),
|
||||
IOP ("xj", B3SOIPD_MOD_XJ, IF_REAL, "Junction Depth"),
|
||||
IOP ("rth0", B3SOIPD_MOD_RTH0, IF_REAL, "Self-heating thermal resistance"),
|
||||
IOP ("cth0", B3SOIPD_MOD_CTH0, IF_REAL, "Self-heating thermal capacitance"),
|
||||
IOP ("ngidl", B3SOIPD_MOD_NGIDL, IF_REAL, "GIDL first parameter"),
|
||||
IOP ("agidl", B3SOIPD_MOD_AGIDL, IF_REAL, "GIDL second parameter"),
|
||||
IOP ("bgidl", B3SOIPD_MOD_BGIDL, IF_REAL, "GIDL third parameter"),
|
||||
IOP ("ndiode", B3SOIPD_MOD_NDIODE, IF_REAL, "Diode non-ideality factor"),
|
||||
IOP ("xbjt", B3SOIPD_MOD_XBJT, IF_REAL,
|
||||
"Temperature coefficient for Isbjt"),
|
||||
|
||||
IOP ("xdif", B3SOIPD_MOD_XDIF, IF_REAL,
|
||||
"Temperature coefficient for Isdif"),
|
||||
|
||||
IOP ("xrec", B3SOIPD_MOD_XREC, IF_REAL,
|
||||
"Temperature coefficient for Isrec"),
|
||||
IOP ("xtun", B3SOIPD_MOD_XTUN, IF_REAL,
|
||||
"Temperature coefficient for Istun"),
|
||||
|
||||
IOP ("pbswg", B3SOIPD_MOD_PBSWG, IF_REAL,
|
||||
"Source/drain (gate side) sidewall junction capacitance built in potential"),
|
||||
IOP ("mjswg", B3SOIPD_MOD_MJSWG, IF_REAL,
|
||||
"Source/drain (gate side) sidewall junction capacitance grading coefficient"),
|
||||
|
||||
IOP ("cjswg", B3SOIPD_MOD_CJSWG, IF_REAL,
|
||||
"Source/drain (gate side) sidewall junction capacitance per unit width"),
|
||||
IOP ("lint", B3SOIPD_MOD_LINT, IF_REAL, "Length reduction parameter"),
|
||||
IOP ("ll", B3SOIPD_MOD_LL, IF_REAL, "Length reduction parameter"),
|
||||
IOP ("lln", B3SOIPD_MOD_LLN, IF_REAL, "Length reduction parameter"),
|
||||
IOP ("lw", B3SOIPD_MOD_LW, IF_REAL, "Length reduction parameter"),
|
||||
IOP ("lwn", B3SOIPD_MOD_LWN, IF_REAL, "Length reduction parameter"),
|
||||
IOP ("lwl", B3SOIPD_MOD_LWL, IF_REAL, "Length reduction parameter"),
|
||||
|
||||
IOP ("wr", B3SOIPD_MOD_WR, IF_REAL, "Width dependence of rds"),
|
||||
IOP ("wint", B3SOIPD_MOD_WINT, IF_REAL, "Width reduction parameter"),
|
||||
IOP ("dwg", B3SOIPD_MOD_DWG, IF_REAL, "Width reduction parameter"),
|
||||
IOP ("dwb", B3SOIPD_MOD_DWB, IF_REAL, "Width reduction parameter"),
|
||||
|
||||
IOP ("wl", B3SOIPD_MOD_WL, IF_REAL, "Width reduction parameter"),
|
||||
IOP ("wln", B3SOIPD_MOD_WLN, IF_REAL, "Width reduction parameter"),
|
||||
IOP ("ww", B3SOIPD_MOD_WW, IF_REAL, "Width reduction parameter"),
|
||||
IOP ("wwn", B3SOIPD_MOD_WWN, IF_REAL, "Width reduction parameter"),
|
||||
IOP ("wwl", B3SOIPD_MOD_WWL, IF_REAL, "Width reduction parameter"),
|
||||
|
||||
IOP ("b0", B3SOIPD_MOD_B0, IF_REAL, "Abulk narrow width parameter"),
|
||||
IOP ("b1", B3SOIPD_MOD_B1, IF_REAL, "Abulk narrow width parameter"),
|
||||
|
||||
IOP ("cgsl", B3SOIPD_MOD_CGSL, IF_REAL, "New C-V model parameter"),
|
||||
IOP ("cgdl", B3SOIPD_MOD_CGDL, IF_REAL, "New C-V model parameter"),
|
||||
IOP ("ckappa", B3SOIPD_MOD_CKAPPA, IF_REAL, "New C-V model parameter"),
|
||||
IOP ("cf", B3SOIPD_MOD_CF, IF_REAL, "Fringe capacitance parameter"),
|
||||
IOP ("clc", B3SOIPD_MOD_CLC, IF_REAL, "Vdsat parameter for C-V model"),
|
||||
IOP ("cle", B3SOIPD_MOD_CLE, IF_REAL, "Vdsat parameter for C-V model"),
|
||||
IOP ("dwc", B3SOIPD_MOD_DWC, IF_REAL, "Delta W for C-V model"),
|
||||
IOP ("dlc", B3SOIPD_MOD_DLC, IF_REAL, "Delta L for C-V model"),
|
||||
|
||||
IOP ("alpha0", B3SOIPD_MOD_ALPHA0, IF_REAL,
|
||||
"substrate current model parameter"),
|
||||
|
||||
IOP ("noia", B3SOIPD_MOD_NOIA, IF_REAL, "Flicker noise parameter"),
|
||||
IOP ("noib", B3SOIPD_MOD_NOIB, IF_REAL, "Flicker noise parameter"),
|
||||
IOP ("noic", B3SOIPD_MOD_NOIC, IF_REAL, "Flicker noise parameter"),
|
||||
IOP ("em", B3SOIPD_MOD_EM, IF_REAL, "Flicker noise parameter"),
|
||||
IOP ("ef", B3SOIPD_MOD_EF, IF_REAL, "Flicker noise frequency exponent"),
|
||||
IOP ("af", B3SOIPD_MOD_AF, IF_REAL, "Flicker noise exponent"),
|
||||
IOP ("kf", B3SOIPD_MOD_KF, IF_REAL, "Flicker noise coefficient"),
|
||||
IOP ("noif", B3SOIPD_MOD_NOIF, IF_REAL,
|
||||
"Floating body excess noise ideality factor"),
|
||||
|
||||
|
||||
/* v2.0 release */
|
||||
IOP ("k1w1", B3SOIPD_MOD_K1W1, IF_REAL,
|
||||
"First Body effect width dependent parameter"),
|
||||
IOP ("k1w2", B3SOIPD_MOD_K1W2, IF_REAL,
|
||||
"Second Boby effect width dependent parameter"),
|
||||
IOP ("ketas", B3SOIPD_MOD_KETAS, IF_REAL,
|
||||
"Surface potential adjustment for bulk charge effect"),
|
||||
IOP ("dwbc", B3SOIPD_MOD_DWBC, IF_REAL,
|
||||
"Width offset for body contact isolation edge"),
|
||||
IOP ("beta0", B3SOIPD_MOD_BETA0, IF_REAL,
|
||||
"First Vds dependent parameter of impact ionizition current"),
|
||||
IOP ("beta1", B3SOIPD_MOD_BETA1, IF_REAL,
|
||||
"Second Vds dependent parameter of impact ionizition current"),
|
||||
IOP ("beta2", B3SOIPD_MOD_BETA2, IF_REAL,
|
||||
"Third Vds dependent parameter of impact ionizition current"),
|
||||
IOP ("vdsatii0", B3SOIPD_MOD_VDSATII0, IF_REAL,
|
||||
"Nominal drain saturation voltage at threshold for impact ionizition current"),
|
||||
IOP ("tii", B3SOIPD_MOD_TII, IF_REAL,
|
||||
"Temperature dependent parameter for impact ionizition"),
|
||||
IOP ("lii", B3SOIPD_MOD_LII, IF_REAL,
|
||||
"Channel length dependent parameter at threshold for impact ionizition current"),
|
||||
IOP ("sii0", B3SOIPD_MOD_SII0, IF_REAL,
|
||||
"First Vgs dependent parameter for impact ionizition current"),
|
||||
IOP ("sii1", B3SOIPD_MOD_SII1, IF_REAL,
|
||||
"Second Vgs dependent parameter for impact ionizition current"),
|
||||
IOP ("sii2", B3SOIPD_MOD_SII2, IF_REAL,
|
||||
"Third Vgs dependent parameter for impact ionizition current"),
|
||||
IOP ("siid", B3SOIPD_MOD_SIID, IF_REAL,
|
||||
"Vds dependent parameter of drain saturation voltage for impact ionizition current"),
|
||||
IOP ("fbjtii", B3SOIPD_MOD_FBJTII, IF_REAL,
|
||||
"Fraction of bipolar current affecting the impact ionization"),
|
||||
IOP ("esatii", B3SOIPD_MOD_ESATII, IF_REAL,
|
||||
"Saturation electric field for impact ionization"),
|
||||
IOP ("ntun", B3SOIPD_MOD_NTUN, IF_REAL,
|
||||
"Reverse tunneling non-ideality factor"),
|
||||
IOP ("nrecf0", B3SOIPD_MOD_NRECF0, IF_REAL,
|
||||
"Recombination non-ideality factor at forward bias"),
|
||||
IOP ("nrecr0", B3SOIPD_MOD_NRECR0, IF_REAL,
|
||||
"Recombination non-ideality factor at reversed bias"),
|
||||
IOP ("isbjt", B3SOIPD_MOD_ISBJT, IF_REAL,
|
||||
"BJT injection saturation current"),
|
||||
IOP ("isdif", B3SOIPD_MOD_ISDIF, IF_REAL,
|
||||
"Body to source/drain injection saturation current"),
|
||||
IOP ("isrec", B3SOIPD_MOD_ISREC, IF_REAL,
|
||||
"Recombination in depletion saturation current"),
|
||||
IOP ("istun", B3SOIPD_MOD_ISTUN, IF_REAL,
|
||||
"Reverse tunneling saturation current"),
|
||||
IOP ("ln", B3SOIPD_MOD_LN, IF_REAL, "Electron/hole diffusion length"),
|
||||
IOP ("vrec0", B3SOIPD_MOD_VREC0, IF_REAL,
|
||||
"Voltage dependent parameter for recombination current"),
|
||||
IOP ("vtun0", B3SOIPD_MOD_VTUN0, IF_REAL,
|
||||
"Voltage dependent parameter for tunneling current"),
|
||||
IOP ("nbjt", B3SOIPD_MOD_NBJT, IF_REAL,
|
||||
"Power coefficient of channel length dependency for bipolar current"),
|
||||
IOP ("lbjt0", B3SOIPD_MOD_LBJT0, IF_REAL,
|
||||
"Refferenc channel length for bipolar cuurent"),
|
||||
IOP ("ldif0", B3SOIPD_MOD_LDIF0, IF_REAL,
|
||||
"Channel-length dependency coefficient of diffusion cap"),
|
||||
IOP ("vabjt", B3SOIPD_MOD_VABJT, IF_REAL,
|
||||
"Early voltage for bipolar current"),
|
||||
IOP ("aely", B3SOIPD_MOD_AELY, IF_REAL,
|
||||
"Channel length dependency of early voltage for bipolar cuurent"),
|
||||
IOP ("ahli", B3SOIPD_MOD_AHLI, IF_REAL,
|
||||
"High level injection parameter for bipolar current"),
|
||||
IOP ("rbody", B3SOIPD_MOD_RBODY, IF_REAL,
|
||||
"Intrinsic body contact sheet resistance"),
|
||||
IOP ("rbsh", B3SOIPD_MOD_RBSH, IF_REAL,
|
||||
"Extrinsic body contact sheet resistance"),
|
||||
IOP ("cgeo", B3SOIPD_MOD_CGEO, IF_REAL,
|
||||
"Gate substrate overlap capacitance per unit channel length"),
|
||||
IOP ("tt", B3SOIPD_MOD_TT, IF_REAL,
|
||||
"Diffusion capacitance transit time coefficient"),
|
||||
IOP ("ndif", B3SOIPD_MOD_NDIF, IF_REAL,
|
||||
"Power coefficient of channel length dependency for diffusion capacitance"),
|
||||
IOP ("vsdfb", B3SOIPD_MOD_VSDFB, IF_REAL,
|
||||
"Source/drain bottom diffusion capacitance flatband voltage"),
|
||||
IOP ("vsdth", B3SOIPD_MOD_VSDTH, IF_REAL,
|
||||
"Source/drain bottom diffusion capacitance threshold voltage"),
|
||||
IOP ("csdmin", B3SOIPD_MOD_CSDMIN, IF_REAL,
|
||||
"Source/drain bottom diffusion minimum capacitance"),
|
||||
IOP ("asd", B3SOIPD_MOD_ASD, IF_REAL,
|
||||
"Source/drain bottom diffusion smoothing parameter"),
|
||||
IOP ("csdesw", B3SOIPD_MOD_CSDESW, IF_REAL,
|
||||
"Source/drain sidewall fringing capacitance per unit length"),
|
||||
IOP ("ntrecf", B3SOIPD_MOD_NTRECF, IF_REAL,
|
||||
"Temperature coefficient for Nrecf"),
|
||||
IOP ("ntrecr", B3SOIPD_MOD_NTRECR, IF_REAL,
|
||||
"Temperature coefficient for Nrecr"),
|
||||
IOP ("dlcb", B3SOIPD_MOD_DLCB, IF_REAL,
|
||||
"Length offset fitting parameter for body charge"),
|
||||
IOP ("fbody", B3SOIPD_MOD_FBODY, IF_REAL, "Scaling factor for body charge"),
|
||||
IOP ("tcjswg", B3SOIPD_MOD_TCJSWG, IF_REAL,
|
||||
"Temperature coefficient of Cjswg"),
|
||||
IOP ("tpbswg", B3SOIPD_MOD_TPBSWG, IF_REAL,
|
||||
"Temperature coefficient of Pbswg"),
|
||||
IOP ("acde", B3SOIPD_MOD_ACDE, IF_REAL,
|
||||
"Exponential coefficient for charge thickness in capMod=3 for accumulation and depletion regions"),
|
||||
IOP ("moin", B3SOIPD_MOD_MOIN, IF_REAL,
|
||||
"Coefficient for the gate-bias dependent surface potential"),
|
||||
IOP ("delvt", B3SOIPD_MOD_DELVT, IF_REAL,
|
||||
"Threshold voltage adjust for CV"),
|
||||
IOP ("kb1", B3SOIPD_MOD_KB1, IF_REAL,
|
||||
"Coefficient of Vbs0 dependency on Ves"),
|
||||
IOP ("dlbg", B3SOIPD_MOD_DLBG, IF_REAL,
|
||||
"Length offset fitting parameter for backgate charge"),
|
||||
|
||||
|
||||
/* v2.2 release */
|
||||
IOP ("igmod", B3SOIPD_MOD_IGMOD, IF_INTEGER, "gate current model selector"),
|
||||
IOP ("toxqm", B3SOIPD_MOD_TOXQM, IF_REAL,
|
||||
"effective oxide thickness considering quantum effect"),
|
||||
IOP ("wth0", B3SOIPD_MOD_WTH0, IF_REAL,
|
||||
"Minimum width for thermal resistance calculation"),
|
||||
IOP ("rhalo", B3SOIPD_MOD_RHALO, IF_REAL, "body halo sheet resistance"),
|
||||
IOP ("ntox", B3SOIPD_MOD_NTOX, IF_REAL, "power term of gate current"),
|
||||
IOP ("toxref", B3SOIPD_MOD_TOXREF, IF_REAL, "target oxide thickness"),
|
||||
IOP ("ebg", B3SOIPD_MOD_EBG, IF_REAL,
|
||||
"effective bandgap in gate current calcula."),
|
||||
IOP ("nevb", B3SOIPD_MOD_NEVB, IF_REAL,
|
||||
"valence-band electron non-ideality factor"),
|
||||
IOP ("alphagb1", B3SOIPD_MOD_ALPHAGB1, IF_REAL,
|
||||
"First Vox dependent parameter for gate curent in inversion"),
|
||||
IOP ("betagb1", B3SOIPD_MOD_BETAGB1, IF_REAL,
|
||||
"Second Vox dependent parameter for gate currnt in inversion"),
|
||||
IOP ("vgb1", B3SOIPD_MOD_VGB1, IF_REAL,
|
||||
"Third Vox dependent parameter for gate current in inversion"),
|
||||
IOP ("necb", B3SOIPD_MOD_NECB, IF_REAL,
|
||||
"conduction-band electron non-ideality factor"),
|
||||
IOP ("alphagb2", B3SOIPD_MOD_ALPHAGB2, IF_REAL,
|
||||
"First Vox dependent parameter for gate current in accumulation"),
|
||||
IOP ("betagb2", B3SOIPD_MOD_BETAGB2, IF_REAL,
|
||||
"Second Vox dependent parameter for gate current in accumulation"),
|
||||
IOP ("vgb2", B3SOIPD_MOD_VGB2, IF_REAL,
|
||||
"Third Vox dependent parameter for gate current in accumulation"),
|
||||
IOP ("voxh", B3SOIPD_MOD_VOXH, IF_REAL,
|
||||
"the limit of Vox in gate current calculation"),
|
||||
IOP ("deltavox", B3SOIPD_MOD_DELTAVOX, IF_REAL,
|
||||
"the smoothing parameter in the Vox smoothing function"),
|
||||
|
||||
|
||||
/* Added for binning - START */
|
||||
/* Length Dependence */
|
||||
IOP ("lnch", B3SOIPD_MOD_LNPEAK, IF_REAL, "Length dependence of nch"),
|
||||
IOP ("lnsub", B3SOIPD_MOD_LNSUB, IF_REAL, "Length dependence of nsub"),
|
||||
IOP ("lngate", B3SOIPD_MOD_LNGATE, IF_REAL, "Length dependence of ngate"),
|
||||
IOP ("lvth0", B3SOIPD_MOD_LVTH0, IF_REAL, "Length dependence of vto"),
|
||||
IOP ("lk1", B3SOIPD_MOD_LK1, IF_REAL, "Length dependence of k1"),
|
||||
IOP ("lk1w1", B3SOIPD_MOD_LK1W1, IF_REAL, "Length dependence of k1w1"),
|
||||
IOP ("lk1w2", B3SOIPD_MOD_LK1W2, IF_REAL, "Length dependence of k1w2"),
|
||||
IOP ("lk2", B3SOIPD_MOD_LK2, IF_REAL, "Length dependence of k2"),
|
||||
IOP ("lk3", B3SOIPD_MOD_LK3, IF_REAL, "Length dependence of k3"),
|
||||
IOP ("lk3b", B3SOIPD_MOD_LK3B, IF_REAL, "Length dependence of k3b"),
|
||||
IOP ("lkb1", B3SOIPD_MOD_LKB1, IF_REAL, "Length dependence of kb1"),
|
||||
IOP ("lw0", B3SOIPD_MOD_LW0, IF_REAL, "Length dependence of w0"),
|
||||
IOP ("lnlx", B3SOIPD_MOD_LNLX, IF_REAL, "Length dependence of nlx"),
|
||||
IOP ("ldvt0", B3SOIPD_MOD_LDVT0, IF_REAL, "Length dependence of dvt0"),
|
||||
IOP ("ldvt1", B3SOIPD_MOD_LDVT1, IF_REAL, "Length dependence of dvt1"),
|
||||
IOP ("ldvt2", B3SOIPD_MOD_LDVT2, IF_REAL, "Length dependence of dvt2"),
|
||||
IOP ("ldvt0w", B3SOIPD_MOD_LDVT0W, IF_REAL, "Length dependence of dvt0w"),
|
||||
IOP ("ldvt1w", B3SOIPD_MOD_LDVT1W, IF_REAL, "Length dependence of dvt1w"),
|
||||
IOP ("ldvt2w", B3SOIPD_MOD_LDVT2W, IF_REAL, "Length dependence of dvt2w"),
|
||||
IOP ("lu0", B3SOIPD_MOD_LU0, IF_REAL, "Length dependence of u0"),
|
||||
IOP ("lua", B3SOIPD_MOD_LUA, IF_REAL, "Length dependence of ua"),
|
||||
IOP ("lub", B3SOIPD_MOD_LUB, IF_REAL, "Length dependence of ub"),
|
||||
IOP ("luc", B3SOIPD_MOD_LUC, IF_REAL, "Length dependence of uc"),
|
||||
IOP ("lvsat", B3SOIPD_MOD_LVSAT, IF_REAL, "Length dependence of vsat"),
|
||||
IOP ("la0", B3SOIPD_MOD_LA0, IF_REAL, "Length dependence of a0"),
|
||||
IOP ("lags", B3SOIPD_MOD_LAGS, IF_REAL, "Length dependence of ags"),
|
||||
IOP ("lb0", B3SOIPD_MOD_LB0, IF_REAL, "Length dependence of b0"),
|
||||
IOP ("lb1", B3SOIPD_MOD_LB1, IF_REAL, "Length dependence of b1"),
|
||||
IOP ("lketa", B3SOIPD_MOD_LKETA, IF_REAL, "Length dependence of keta"),
|
||||
IOP ("lketas", B3SOIPD_MOD_LKETAS, IF_REAL, "Length dependence of ketas"),
|
||||
IOP ("la1", B3SOIPD_MOD_LA1, IF_REAL, "Length dependence of a1"),
|
||||
IOP ("la2", B3SOIPD_MOD_LA2, IF_REAL, "Length dependence of a2"),
|
||||
IOP ("lrdsw", B3SOIPD_MOD_LRDSW, IF_REAL, "Length dependence of rdsw "),
|
||||
IOP ("lprwb", B3SOIPD_MOD_LPRWB, IF_REAL, "Length dependence of prwb "),
|
||||
IOP ("lprwg", B3SOIPD_MOD_LPRWG, IF_REAL, "Length dependence of prwg "),
|
||||
IOP ("lwr", B3SOIPD_MOD_LWR, IF_REAL, "Length dependence of wr"),
|
||||
IOP ("lnfactor", B3SOIPD_MOD_LNFACTOR, IF_REAL,
|
||||
"Length dependence of nfactor"),
|
||||
IOP ("ldwg", B3SOIPD_MOD_LDWG, IF_REAL, "Length dependence of dwg"),
|
||||
IOP ("ldwb", B3SOIPD_MOD_LDWB, IF_REAL, "Length dependence of dwb"),
|
||||
IOP ("lvoff", B3SOIPD_MOD_LVOFF, IF_REAL, "Length dependence of voff"),
|
||||
IOP ("leta0", B3SOIPD_MOD_LETA0, IF_REAL, "Length dependence of eta0"),
|
||||
IOP ("letab", B3SOIPD_MOD_LETAB, IF_REAL, "Length dependence of etab"),
|
||||
IOP ("ldsub", B3SOIPD_MOD_LDSUB, IF_REAL, "Length dependence of dsub"),
|
||||
IOP ("lcit", B3SOIPD_MOD_LCIT, IF_REAL, "Length dependence of cit"),
|
||||
IOP ("lcdsc", B3SOIPD_MOD_LCDSC, IF_REAL, "Length dependence of cdsc"),
|
||||
IOP ("lcdscb", B3SOIPD_MOD_LCDSCB, IF_REAL, "Length dependence of cdscb"),
|
||||
IOP ("lcdscd", B3SOIPD_MOD_LCDSCD, IF_REAL, "Length dependence of cdscd"),
|
||||
IOP ("lpclm", B3SOIPD_MOD_LPCLM, IF_REAL, "Length dependence of pclm"),
|
||||
IOP ("lpdiblc1", B3SOIPD_MOD_LPDIBL1, IF_REAL,
|
||||
"Length dependence of pdiblc1"),
|
||||
IOP ("lpdiblc2", B3SOIPD_MOD_LPDIBL2, IF_REAL,
|
||||
"Length dependence of pdiblc2"),
|
||||
IOP ("lpdiblcb", B3SOIPD_MOD_LPDIBLB, IF_REAL,
|
||||
"Length dependence of pdiblcb"),
|
||||
IOP ("ldrout", B3SOIPD_MOD_LDROUT, IF_REAL, "Length dependence of drout"),
|
||||
IOP ("lpvag", B3SOIPD_MOD_LPVAG, IF_REAL, "Length dependence of pvag"),
|
||||
IOP ("ldelta", B3SOIPD_MOD_LDELTA, IF_REAL, "Length dependence of delta"),
|
||||
IOP ("lalpha0", B3SOIPD_MOD_LALPHA0, IF_REAL,
|
||||
"Length dependence of alpha0"),
|
||||
IOP ("lfbjtii", B3SOIPD_MOD_LFBJTII, IF_REAL,
|
||||
"Length dependence of fbjtii"),
|
||||
IOP ("lbeta0", B3SOIPD_MOD_LBETA0, IF_REAL, "Length dependence of beta0"),
|
||||
IOP ("lbeta1", B3SOIPD_MOD_LBETA1, IF_REAL, "Length dependence of beta1"),
|
||||
IOP ("lbeta2", B3SOIPD_MOD_LBETA2, IF_REAL, "Length dependence of beta2"),
|
||||
IOP ("lvdsatii0", B3SOIPD_MOD_LVDSATII0, IF_REAL,
|
||||
"Length dependence of vdsatii0"),
|
||||
IOP ("llii", B3SOIPD_MOD_LLII, IF_REAL, "Length dependence of lii"),
|
||||
IOP ("lesatii", B3SOIPD_MOD_LESATII, IF_REAL,
|
||||
"Length dependence of esatii"),
|
||||
IOP ("lsii0", B3SOIPD_MOD_LSII0, IF_REAL, "Length dependence of sii0"),
|
||||
IOP ("lsii1", B3SOIPD_MOD_LSII1, IF_REAL, "Length dependence of sii1"),
|
||||
IOP ("lsii2", B3SOIPD_MOD_LSII2, IF_REAL, "Length dependence of sii2"),
|
||||
IOP ("lsiid", B3SOIPD_MOD_LSIID, IF_REAL, "Length dependence of siid"),
|
||||
IOP ("lagidl", B3SOIPD_MOD_LAGIDL, IF_REAL, "Length dependence of agidl"),
|
||||
IOP ("lbgidl", B3SOIPD_MOD_LBGIDL, IF_REAL, "Length dependence of bgidl"),
|
||||
IOP ("lngidl", B3SOIPD_MOD_LNGIDL, IF_REAL, "Length dependence of ngidl"),
|
||||
IOP ("lntun", B3SOIPD_MOD_LNTUN, IF_REAL, "Length dependence of ntun"),
|
||||
IOP ("lndiode", B3SOIPD_MOD_LNDIODE, IF_REAL,
|
||||
"Length dependence of ndiode"),
|
||||
IOP ("lnrecf0", B3SOIPD_MOD_LNRECF0, IF_REAL,
|
||||
"Length dependence of nrecf0"),
|
||||
IOP ("lnrecr0", B3SOIPD_MOD_LNRECR0, IF_REAL,
|
||||
"Length dependence of nrecr0"),
|
||||
IOP ("lisbjt", B3SOIPD_MOD_LISBJT, IF_REAL, "Length dependence of isbjt"),
|
||||
IOP ("lisdif", B3SOIPD_MOD_LISDIF, IF_REAL, "Length dependence of isdif"),
|
||||
IOP ("lisrec", B3SOIPD_MOD_LISREC, IF_REAL, "Length dependence of isrec"),
|
||||
IOP ("listun", B3SOIPD_MOD_LISTUN, IF_REAL, "Length dependence of istun"),
|
||||
IOP ("lvrec0", B3SOIPD_MOD_LVREC0, IF_REAL, "Length dependence of vrec0"),
|
||||
IOP ("lvtun0", B3SOIPD_MOD_LVTUN0, IF_REAL, "Length dependence of vtun0"),
|
||||
IOP ("lnbjt", B3SOIPD_MOD_LNBJT, IF_REAL, "Length dependence of nbjt"),
|
||||
IOP ("llbjt0", B3SOIPD_MOD_LLBJT0, IF_REAL, "Length dependence of lbjt0"),
|
||||
IOP ("lvabjt", B3SOIPD_MOD_LVABJT, IF_REAL, "Length dependence of vabjt"),
|
||||
IOP ("laely", B3SOIPD_MOD_LAELY, IF_REAL, "Length dependence of aely"),
|
||||
IOP ("lahli", B3SOIPD_MOD_LAHLI, IF_REAL, "Length dependence of ahli"),
|
||||
IOP ("lvsdfb", B3SOIPD_MOD_LVSDFB, IF_REAL, "Length dependence of vsdfb"),
|
||||
IOP ("lvsdth", B3SOIPD_MOD_LVSDTH, IF_REAL, "Length dependence of vsdth"),
|
||||
IOP ("ldelvt", B3SOIPD_MOD_LDELVT, IF_REAL, "Length dependence of delvt"),
|
||||
IOP ("lacde", B3SOIPD_MOD_LACDE, IF_REAL, "Length dependence of acde"),
|
||||
IOP ("lmoin", B3SOIPD_MOD_LMOIN, IF_REAL, "Length dependence of amoin"),
|
||||
/* Width Dependence */
|
||||
IOP ("wnch", B3SOIPD_MOD_WNPEAK, IF_REAL, "Width dependence of nch"),
|
||||
IOP ("wnsub", B3SOIPD_MOD_WNSUB, IF_REAL, "Width dependence of nsub"),
|
||||
IOP ("wngate", B3SOIPD_MOD_WNGATE, IF_REAL, "Width dependence of ngate"),
|
||||
IOP ("wvth0", B3SOIPD_MOD_WVTH0, IF_REAL, "Width dependence of vto"),
|
||||
IOP ("wk1", B3SOIPD_MOD_WK1, IF_REAL, "Width dependence of k1"),
|
||||
IOP ("wk1w1", B3SOIPD_MOD_WK1W1, IF_REAL, "Width dependence of k1w1"),
|
||||
IOP ("wk1w2", B3SOIPD_MOD_WK1W2, IF_REAL, "Width dependence of k1w2"),
|
||||
IOP ("wk2", B3SOIPD_MOD_WK2, IF_REAL, "Width dependence of k2"),
|
||||
IOP ("wk3", B3SOIPD_MOD_WK3, IF_REAL, "Width dependence of k3"),
|
||||
IOP ("wk3b", B3SOIPD_MOD_WK3B, IF_REAL, "Width dependence of k3b"),
|
||||
IOP ("wkb1", B3SOIPD_MOD_WKB1, IF_REAL, "Width dependence of kb1"),
|
||||
IOP ("ww0", B3SOIPD_MOD_WW0, IF_REAL, "Width dependence of w0"),
|
||||
IOP ("wnlx", B3SOIPD_MOD_WNLX, IF_REAL, "Width dependence of nlx"),
|
||||
IOP ("wdvt0", B3SOIPD_MOD_WDVT0, IF_REAL, "Width dependence of dvt0"),
|
||||
IOP ("wdvt1", B3SOIPD_MOD_WDVT1, IF_REAL, "Width dependence of dvt1"),
|
||||
IOP ("wdvt2", B3SOIPD_MOD_WDVT2, IF_REAL, "Width dependence of dvt2"),
|
||||
IOP ("wdvt0w", B3SOIPD_MOD_WDVT0W, IF_REAL, "Width dependence of dvt0w"),
|
||||
IOP ("wdvt1w", B3SOIPD_MOD_WDVT1W, IF_REAL, "Width dependence of dvt1w"),
|
||||
IOP ("wdvt2w", B3SOIPD_MOD_WDVT2W, IF_REAL, "Width dependence of dvt2w"),
|
||||
IOP ("wu0", B3SOIPD_MOD_WU0, IF_REAL, "Width dependence of u0"),
|
||||
IOP ("wua", B3SOIPD_MOD_WUA, IF_REAL, "Width dependence of ua"),
|
||||
IOP ("wub", B3SOIPD_MOD_WUB, IF_REAL, "Width dependence of ub"),
|
||||
IOP ("wuc", B3SOIPD_MOD_WUC, IF_REAL, "Width dependence of uc"),
|
||||
IOP ("wvsat", B3SOIPD_MOD_WVSAT, IF_REAL, "Width dependence of vsat"),
|
||||
IOP ("wa0", B3SOIPD_MOD_WA0, IF_REAL, "Width dependence of a0"),
|
||||
IOP ("wags", B3SOIPD_MOD_WAGS, IF_REAL, "Width dependence of ags"),
|
||||
IOP ("wb0", B3SOIPD_MOD_WB0, IF_REAL, "Width dependence of b0"),
|
||||
IOP ("wb1", B3SOIPD_MOD_WB1, IF_REAL, "Width dependence of b1"),
|
||||
IOP ("wketa", B3SOIPD_MOD_WKETA, IF_REAL, "Width dependence of keta"),
|
||||
IOP ("wketas", B3SOIPD_MOD_WKETAS, IF_REAL, "Width dependence of ketas"),
|
||||
IOP ("wa1", B3SOIPD_MOD_WA1, IF_REAL, "Width dependence of a1"),
|
||||
IOP ("wa2", B3SOIPD_MOD_WA2, IF_REAL, "Width dependence of a2"),
|
||||
IOP ("wrdsw", B3SOIPD_MOD_WRDSW, IF_REAL, "Width dependence of rdsw "),
|
||||
IOP ("wprwb", B3SOIPD_MOD_WPRWB, IF_REAL, "Width dependence of prwb "),
|
||||
IOP ("wprwg", B3SOIPD_MOD_WPRWG, IF_REAL, "Width dependence of prwg "),
|
||||
IOP ("wwr", B3SOIPD_MOD_WWR, IF_REAL, "Width dependence of wr"),
|
||||
IOP ("wnfactor", B3SOIPD_MOD_WNFACTOR, IF_REAL,
|
||||
"Width dependence of nfactor"),
|
||||
IOP ("wdwg", B3SOIPD_MOD_WDWG, IF_REAL, "Width dependence of dwg"),
|
||||
IOP ("wdwb", B3SOIPD_MOD_WDWB, IF_REAL, "Width dependence of dwb"),
|
||||
IOP ("wvoff", B3SOIPD_MOD_WVOFF, IF_REAL, "Width dependence of voff"),
|
||||
IOP ("weta0", B3SOIPD_MOD_WETA0, IF_REAL, "Width dependence of eta0"),
|
||||
IOP ("wetab", B3SOIPD_MOD_WETAB, IF_REAL, "Width dependence of etab"),
|
||||
IOP ("wdsub", B3SOIPD_MOD_WDSUB, IF_REAL, "Width dependence of dsub"),
|
||||
IOP ("wcit", B3SOIPD_MOD_WCIT, IF_REAL, "Width dependence of cit"),
|
||||
IOP ("wcdsc", B3SOIPD_MOD_WCDSC, IF_REAL, "Width dependence of cdsc"),
|
||||
IOP ("wcdscb", B3SOIPD_MOD_WCDSCB, IF_REAL, "Width dependence of cdscb"),
|
||||
IOP ("wcdscd", B3SOIPD_MOD_WCDSCD, IF_REAL, "Width dependence of cdscd"),
|
||||
IOP ("wpclm", B3SOIPD_MOD_WPCLM, IF_REAL, "Width dependence of pclm"),
|
||||
IOP ("wpdiblc1", B3SOIPD_MOD_WPDIBL1, IF_REAL,
|
||||
"Width dependence of pdiblc1"),
|
||||
IOP ("wpdiblc2", B3SOIPD_MOD_WPDIBL2, IF_REAL,
|
||||
"Width dependence of pdiblc2"),
|
||||
IOP ("wpdiblcb", B3SOIPD_MOD_WPDIBLB, IF_REAL,
|
||||
"Width dependence of pdiblcb"),
|
||||
IOP ("wdrout", B3SOIPD_MOD_WDROUT, IF_REAL, "Width dependence of drout"),
|
||||
IOP ("wpvag", B3SOIPD_MOD_WPVAG, IF_REAL, "Width dependence of pvag"),
|
||||
IOP ("wdelta", B3SOIPD_MOD_WDELTA, IF_REAL, "Width dependence of delta"),
|
||||
IOP ("walpha0", B3SOIPD_MOD_WALPHA0, IF_REAL, "Width dependence of alpha0"),
|
||||
IOP ("wfbjtii", B3SOIPD_MOD_WFBJTII, IF_REAL, "Width dependence of fbjtii"),
|
||||
IOP ("wbeta0", B3SOIPD_MOD_WBETA0, IF_REAL, "Width dependence of beta0"),
|
||||
IOP ("wbeta1", B3SOIPD_MOD_WBETA1, IF_REAL, "Width dependence of beta1"),
|
||||
IOP ("wbeta2", B3SOIPD_MOD_WBETA2, IF_REAL, "Width dependence of beta2"),
|
||||
IOP ("wvdsatii0", B3SOIPD_MOD_WVDSATII0, IF_REAL,
|
||||
"Width dependence of vdsatii0"),
|
||||
IOP ("wlii", B3SOIPD_MOD_WLII, IF_REAL, "Width dependence of lii"),
|
||||
IOP ("wesatii", B3SOIPD_MOD_WESATII, IF_REAL, "Width dependence of esatii"),
|
||||
IOP ("wsii0", B3SOIPD_MOD_WSII0, IF_REAL, "Width dependence of sii0"),
|
||||
IOP ("wsii1", B3SOIPD_MOD_WSII1, IF_REAL, "Width dependence of sii1"),
|
||||
IOP ("wsii2", B3SOIPD_MOD_WSII2, IF_REAL, "Width dependence of sii2"),
|
||||
IOP ("wsiid", B3SOIPD_MOD_WSIID, IF_REAL, "Width dependence of siid"),
|
||||
IOP ("wagidl", B3SOIPD_MOD_WAGIDL, IF_REAL, "Width dependence of agidl"),
|
||||
IOP ("wbgidl", B3SOIPD_MOD_WBGIDL, IF_REAL, "Width dependence of bgidl"),
|
||||
IOP ("wngidl", B3SOIPD_MOD_WNGIDL, IF_REAL, "Width dependence of ngidl"),
|
||||
IOP ("wntun", B3SOIPD_MOD_WNTUN, IF_REAL, "Width dependence of ntun"),
|
||||
IOP ("wndiode", B3SOIPD_MOD_WNDIODE, IF_REAL, "Width dependence of ndiode"),
|
||||
IOP ("wnrecf0", B3SOIPD_MOD_WNRECF0, IF_REAL, "Width dependence of nrecf0"),
|
||||
IOP ("wnrecr0", B3SOIPD_MOD_WNRECR0, IF_REAL, "Width dependence of nrecr0"),
|
||||
IOP ("wisbjt", B3SOIPD_MOD_WISBJT, IF_REAL, "Width dependence of isbjt"),
|
||||
IOP ("wisdif", B3SOIPD_MOD_WISDIF, IF_REAL, "Width dependence of isdif"),
|
||||
IOP ("wisrec", B3SOIPD_MOD_WISREC, IF_REAL, "Width dependence of isrec"),
|
||||
IOP ("wistun", B3SOIPD_MOD_WISTUN, IF_REAL, "Width dependence of istun"),
|
||||
IOP ("wvrec0", B3SOIPD_MOD_WVREC0, IF_REAL, "Width dependence of vrec0"),
|
||||
IOP ("wvtun0", B3SOIPD_MOD_WVTUN0, IF_REAL, "Width dependence of vtun0"),
|
||||
IOP ("wnbjt", B3SOIPD_MOD_WNBJT, IF_REAL, "Width dependence of nbjt"),
|
||||
IOP ("wlbjt0", B3SOIPD_MOD_WLBJT0, IF_REAL, "Width dependence of lbjt0"),
|
||||
IOP ("wvabjt", B3SOIPD_MOD_WVABJT, IF_REAL, "Width dependence of vabjt"),
|
||||
IOP ("waely", B3SOIPD_MOD_WAELY, IF_REAL, "Width dependence of aely"),
|
||||
IOP ("wahli", B3SOIPD_MOD_WAHLI, IF_REAL, "Width dependence of ahli"),
|
||||
IOP ("wvsdfb", B3SOIPD_MOD_WVSDFB, IF_REAL, "Width dependence of vsdfb"),
|
||||
IOP ("wvsdth", B3SOIPD_MOD_WVSDTH, IF_REAL, "Width dependence of vsdth"),
|
||||
IOP ("wdelvt", B3SOIPD_MOD_WDELVT, IF_REAL, "Width dependence of delvt"),
|
||||
IOP ("wacde", B3SOIPD_MOD_WACDE, IF_REAL, "Width dependence of acde"),
|
||||
IOP ("wmoin", B3SOIPD_MOD_WMOIN, IF_REAL, "Width dependence of amoin"),
|
||||
/* Cross-term Dependence */
|
||||
IOP ("pnch", B3SOIPD_MOD_PNPEAK, IF_REAL, "Cross-term dependence of nch"),
|
||||
IOP ("pnsub", B3SOIPD_MOD_PNSUB, IF_REAL, "Cross-term dependence of nsub"),
|
||||
IOP ("pngate", B3SOIPD_MOD_PNGATE, IF_REAL,
|
||||
"Cross-term dependence of ngate"),
|
||||
IOP ("pvth0", B3SOIPD_MOD_PVTH0, IF_REAL, "Cross-term dependence of vto"),
|
||||
IOP ("pk1", B3SOIPD_MOD_PK1, IF_REAL, "Cross-term dependence of k1"),
|
||||
IOP ("pk1w1", B3SOIPD_MOD_PK1W1, IF_REAL, "Cross-term dependence of k1w1"),
|
||||
IOP ("pk1w2", B3SOIPD_MOD_PK1W2, IF_REAL, "Cross-term dependence of k1w2"),
|
||||
IOP ("pk2", B3SOIPD_MOD_PK2, IF_REAL, "Cross-term dependence of k2"),
|
||||
IOP ("pk3", B3SOIPD_MOD_PK3, IF_REAL, "Cross-term dependence of k3"),
|
||||
IOP ("pk3b", B3SOIPD_MOD_PK3B, IF_REAL, "Cross-term dependence of k3b"),
|
||||
IOP ("pkb1", B3SOIPD_MOD_PKB1, IF_REAL, "Cross-term dependence of kb1"),
|
||||
IOP ("pw0", B3SOIPD_MOD_PW0, IF_REAL, "Cross-term dependence of w0"),
|
||||
IOP ("pnlx", B3SOIPD_MOD_PNLX, IF_REAL, "Cross-term dependence of nlx"),
|
||||
IOP ("pdvt0", B3SOIPD_MOD_PDVT0, IF_REAL, "Cross-term dependence of dvt0"),
|
||||
IOP ("pdvt1", B3SOIPD_MOD_PDVT1, IF_REAL, "Cross-term dependence of dvt1"),
|
||||
IOP ("pdvt2", B3SOIPD_MOD_PDVT2, IF_REAL, "Cross-term dependence of dvt2"),
|
||||
IOP ("pdvt0w", B3SOIPD_MOD_PDVT0W, IF_REAL,
|
||||
"Cross-term dependence of dvt0w"),
|
||||
IOP ("pdvt1w", B3SOIPD_MOD_PDVT1W, IF_REAL,
|
||||
"Cross-term dependence of dvt1w"),
|
||||
IOP ("pdvt2w", B3SOIPD_MOD_PDVT2W, IF_REAL,
|
||||
"Cross-term dependence of dvt2w"),
|
||||
IOP ("pu0", B3SOIPD_MOD_PU0, IF_REAL, "Cross-term dependence of u0"),
|
||||
IOP ("pua", B3SOIPD_MOD_PUA, IF_REAL, "Cross-term dependence of ua"),
|
||||
IOP ("pub", B3SOIPD_MOD_PUB, IF_REAL, "Cross-term dependence of ub"),
|
||||
IOP ("puc", B3SOIPD_MOD_PUC, IF_REAL, "Cross-term dependence of uc"),
|
||||
IOP ("pvsat", B3SOIPD_MOD_PVSAT, IF_REAL, "Cross-term dependence of vsat"),
|
||||
IOP ("pa0", B3SOIPD_MOD_PA0, IF_REAL, "Cross-term dependence of a0"),
|
||||
IOP ("pags", B3SOIPD_MOD_PAGS, IF_REAL, "Cross-term dependence of ags"),
|
||||
IOP ("pb0", B3SOIPD_MOD_PB0, IF_REAL, "Cross-term dependence of b0"),
|
||||
IOP ("pb1", B3SOIPD_MOD_PB1, IF_REAL, "Cross-term dependence of b1"),
|
||||
IOP ("pketa", B3SOIPD_MOD_PKETA, IF_REAL, "Cross-term dependence of keta"),
|
||||
IOP ("pketas", B3SOIPD_MOD_PKETAS, IF_REAL,
|
||||
"Cross-term dependence of ketas"),
|
||||
IOP ("pa1", B3SOIPD_MOD_PA1, IF_REAL, "Cross-term dependence of a1"),
|
||||
IOP ("pa2", B3SOIPD_MOD_PA2, IF_REAL, "Cross-term dependence of a2"),
|
||||
IOP ("prdsw", B3SOIPD_MOD_PRDSW, IF_REAL, "Cross-term dependence of rdsw "),
|
||||
IOP ("pprwb", B3SOIPD_MOD_PPRWB, IF_REAL, "Cross-term dependence of prwb "),
|
||||
IOP ("pprwg", B3SOIPD_MOD_PPRWG, IF_REAL, "Cross-term dependence of prwg "),
|
||||
IOP ("pwr", B3SOIPD_MOD_PWR, IF_REAL, "Cross-term dependence of wr"),
|
||||
IOP ("pnfactor", B3SOIPD_MOD_PNFACTOR, IF_REAL,
|
||||
"Cross-term dependence of nfactor"),
|
||||
IOP ("pdwg", B3SOIPD_MOD_PDWG, IF_REAL, "Cross-term dependence of dwg"),
|
||||
IOP ("pdwb", B3SOIPD_MOD_PDWB, IF_REAL, "Cross-term dependence of dwb"),
|
||||
IOP ("pvoff", B3SOIPD_MOD_PVOFF, IF_REAL, "Cross-term dependence of voff"),
|
||||
IOP ("peta0", B3SOIPD_MOD_PETA0, IF_REAL, "Cross-term dependence of eta0"),
|
||||
IOP ("petab", B3SOIPD_MOD_PETAB, IF_REAL, "Cross-term dependence of etab"),
|
||||
IOP ("pdsub", B3SOIPD_MOD_PDSUB, IF_REAL, "Cross-term dependence of dsub"),
|
||||
IOP ("pcit", B3SOIPD_MOD_PCIT, IF_REAL, "Cross-term dependence of cit"),
|
||||
IOP ("pcdsc", B3SOIPD_MOD_PCDSC, IF_REAL, "Cross-term dependence of cdsc"),
|
||||
IOP ("pcdscb", B3SOIPD_MOD_PCDSCB, IF_REAL,
|
||||
"Cross-term dependence of cdscb"),
|
||||
IOP ("pcdscd", B3SOIPD_MOD_PCDSCD, IF_REAL,
|
||||
"Cross-term dependence of cdscd"),
|
||||
IOP ("ppclm", B3SOIPD_MOD_PPCLM, IF_REAL, "Cross-term dependence of pclm"),
|
||||
IOP ("ppdiblc1", B3SOIPD_MOD_PPDIBL1, IF_REAL,
|
||||
"Cross-term dependence of pdiblc1"),
|
||||
IOP ("ppdiblc2", B3SOIPD_MOD_PPDIBL2, IF_REAL,
|
||||
"Cross-term dependence of pdiblc2"),
|
||||
IOP ("ppdiblcb", B3SOIPD_MOD_PPDIBLB, IF_REAL,
|
||||
"Cross-term dependence of pdiblcb"),
|
||||
IOP ("pdrout", B3SOIPD_MOD_PDROUT, IF_REAL,
|
||||
"Cross-term dependence of drout"),
|
||||
IOP ("ppvag", B3SOIPD_MOD_PPVAG, IF_REAL, "Cross-term dependence of pvag"),
|
||||
IOP ("pdelta", B3SOIPD_MOD_PDELTA, IF_REAL,
|
||||
"Cross-term dependence of delta"),
|
||||
IOP ("palpha0", B3SOIPD_MOD_PALPHA0, IF_REAL,
|
||||
"Cross-term dependence of alpha0"),
|
||||
IOP ("pfbjtii", B3SOIPD_MOD_PFBJTII, IF_REAL,
|
||||
"Cross-term dependence of fbjtii"),
|
||||
IOP ("pbeta0", B3SOIPD_MOD_PBETA0, IF_REAL,
|
||||
"Cross-term dependence of beta0"),
|
||||
IOP ("pbeta1", B3SOIPD_MOD_PBETA1, IF_REAL,
|
||||
"Cross-term dependence of beta1"),
|
||||
IOP ("pbeta2", B3SOIPD_MOD_PBETA2, IF_REAL,
|
||||
"Cross-term dependence of beta2"),
|
||||
IOP ("pvdsatii0", B3SOIPD_MOD_PVDSATII0, IF_REAL,
|
||||
"Cross-term dependence of vdsatii0"),
|
||||
IOP ("plii", B3SOIPD_MOD_PLII, IF_REAL, "Cross-term dependence of lii"),
|
||||
IOP ("pesatii", B3SOIPD_MOD_PESATII, IF_REAL,
|
||||
"Cross-term dependence of esatii"),
|
||||
IOP ("psii0", B3SOIPD_MOD_PSII0, IF_REAL, "Cross-term dependence of sii0"),
|
||||
IOP ("psii1", B3SOIPD_MOD_PSII1, IF_REAL, "Cross-term dependence of sii1"),
|
||||
IOP ("psii2", B3SOIPD_MOD_PSII2, IF_REAL, "Cross-term dependence of sii2"),
|
||||
IOP ("psiid", B3SOIPD_MOD_PSIID, IF_REAL, "Cross-term dependence of siid"),
|
||||
IOP ("pagidl", B3SOIPD_MOD_PAGIDL, IF_REAL,
|
||||
"Cross-term dependence of agidl"),
|
||||
IOP ("pbgidl", B3SOIPD_MOD_PBGIDL, IF_REAL,
|
||||
"Cross-term dependence of bgidl"),
|
||||
IOP ("pngidl", B3SOIPD_MOD_PNGIDL, IF_REAL,
|
||||
"Cross-term dependence of ngidl"),
|
||||
IOP ("pntun", B3SOIPD_MOD_PNTUN, IF_REAL, "Cross-term dependence of ntun"),
|
||||
IOP ("pndiode", B3SOIPD_MOD_PNDIODE, IF_REAL,
|
||||
"Cross-term dependence of ndiode"),
|
||||
IOP ("pnrecf0", B3SOIPD_MOD_PNRECF0, IF_REAL,
|
||||
"Cross-term dependence of nrecf0"),
|
||||
IOP ("pnrecr0", B3SOIPD_MOD_PNRECR0, IF_REAL,
|
||||
"Cross-term dependence of nrecr0"),
|
||||
IOP ("pisbjt", B3SOIPD_MOD_PISBJT, IF_REAL,
|
||||
"Cross-term dependence of isbjt"),
|
||||
IOP ("pisdif", B3SOIPD_MOD_PISDIF, IF_REAL,
|
||||
"Cross-term dependence of isdif"),
|
||||
IOP ("pisrec", B3SOIPD_MOD_PISREC, IF_REAL,
|
||||
"Cross-term dependence of isrec"),
|
||||
IOP ("pistun", B3SOIPD_MOD_PISTUN, IF_REAL,
|
||||
"Cross-term dependence of istun"),
|
||||
IOP ("pvrec0", B3SOIPD_MOD_PVREC0, IF_REAL,
|
||||
"Cross-term dependence of vrec0"),
|
||||
IOP ("pvtun0", B3SOIPD_MOD_PVTUN0, IF_REAL,
|
||||
"Cross-term dependence of vtun0"),
|
||||
IOP ("pnbjt", B3SOIPD_MOD_PNBJT, IF_REAL, "Cross-term dependence of nbjt"),
|
||||
IOP ("plbjt0", B3SOIPD_MOD_PLBJT0, IF_REAL,
|
||||
"Cross-term dependence of lbjt0"),
|
||||
IOP ("pvabjt", B3SOIPD_MOD_PVABJT, IF_REAL,
|
||||
"Cross-term dependence of vabjt"),
|
||||
IOP ("paely", B3SOIPD_MOD_PAELY, IF_REAL, "Cross-term dependence of aely"),
|
||||
IOP ("pahli", B3SOIPD_MOD_PAHLI, IF_REAL, "Cross-term dependence of ahli"),
|
||||
IOP ("pvsdfb", B3SOIPD_MOD_PVSDFB, IF_REAL,
|
||||
"Cross-term dependence of vsdfb"),
|
||||
IOP ("pvsdth", B3SOIPD_MOD_PVSDTH, IF_REAL,
|
||||
"Cross-term dependence of vsdth"),
|
||||
IOP ("pdelvt", B3SOIPD_MOD_PDELVT, IF_REAL,
|
||||
"Cross-term dependence of delvt"),
|
||||
IOP ("pacde", B3SOIPD_MOD_PACDE, IF_REAL, "Cross-term dependence of acde"),
|
||||
IOP ("pmoin", B3SOIPD_MOD_PMOIN, IF_REAL, "Cross-term dependence of amoin"),
|
||||
/* Added for binning - END */
|
||||
|
||||
IP ("nmos", B3SOIPD_MOD_NMOS, IF_FLAG, "Flag to indicate NMOS"),
|
||||
IP ("pmos", B3SOIPD_MOD_PMOS, IF_FLAG, "Flag to indicate PMOS"),
|
||||
};
|
||||
|
||||
char *B3SOIPDnames[] = {
|
||||
"Drain",
|
||||
"Gate",
|
||||
"Source",
|
||||
"Backgate",
|
||||
"",
|
||||
"Body",
|
||||
"Temp",
|
||||
"Charge",
|
||||
};
|
||||
|
||||
int B3SOIPDnSize = NUMELEMS (B3SOIPDnames);
|
||||
int B3SOIPDpTSize = NUMELEMS (B3SOIPDpTable);
|
||||
int B3SOIPDmPTSize = NUMELEMS (B3SOIPDmPTable);
|
||||
int B3SOIPDiSize = sizeof (B3SOIPDinstance);
|
||||
int B3SOIPDmSize = sizeof (B3SOIPDmodel);
|
||||
|
|
@ -0,0 +1,358 @@
|
|||
/**********
|
||||
Copyright 1990 Regents of the University of California. All rights reserved.
|
||||
Author: 1998 Samuel Fung, Dennis Sinitsky and Stephen Tang
|
||||
File: b3soipdacld.c 98/5/01
|
||||
Modified by Pin Su 99/4/30
|
||||
Modified by Pin Su 99/9/27
|
||||
**********/
|
||||
|
||||
#include "ngspice.h"
|
||||
#include <stdio.h>
|
||||
#include "cktdefs.h"
|
||||
#include "b3soipddef.h"
|
||||
#include "sperror.h"
|
||||
#include "suffix.h"
|
||||
|
||||
|
||||
int
|
||||
B3SOIPDacLoad (inModel, ckt)
|
||||
GENmodel *inModel;
|
||||
register CKTcircuit *ckt;
|
||||
{
|
||||
register B3SOIPDmodel *model = (B3SOIPDmodel *) inModel;
|
||||
register B3SOIPDinstance *here;
|
||||
register int selfheat;
|
||||
double xcggb, xcgdb, xcgsb, xcgeb, xcgT;
|
||||
double xcdgb, xcddb, xcdsb, xcdeb, xcdT;
|
||||
double xcsgb, xcsdb, xcssb, xcseb, xcsT;
|
||||
double xcbgb, xcbdb, xcbsb, xcbeb, xcbT;
|
||||
double xcegb, xceeb, xceT;
|
||||
double gdpr, gspr, gds;
|
||||
double cggb, cgdb, cgsb, cgT;
|
||||
double cdgb, cddb, cdsb, cdeb, cdT;
|
||||
double cbgb, cbdb, cbsb, cbeb, cbT;
|
||||
double ceeb, ceT;
|
||||
double GSoverlapCap, GDoverlapCap, GEoverlapCap, FwdSum, RevSum, Gm, Gmbs,
|
||||
GmT;
|
||||
double omega;
|
||||
double dxpart, sxpart;
|
||||
double gbbg, gbbdp, gbbb, gbbp, gbbsp, gbbT;
|
||||
double gddpg, gddpdp, gddpsp, gddpb, gddpT;
|
||||
double gsspg, gsspdp, gsspsp, gsspb, gsspT;
|
||||
double gppdp, gppb, gppp, gppT;
|
||||
double xcTt, cTt, gcTt, gTtt, gTtg, gTtb, gTtdp, gTtsp;
|
||||
double EDextrinsicCap, ESextrinsicCap;
|
||||
double xcedb, xcesb;
|
||||
|
||||
|
||||
omega = ckt->CKTomega;
|
||||
for (; model != NULL; model = model->B3SOIPDnextModel)
|
||||
{
|
||||
|
||||
for (here = model->B3SOIPDinstances; here != NULL;
|
||||
here = here->B3SOIPDnextInstance)
|
||||
{
|
||||
selfheat = (model->B3SOIPDshMod == 1) && (here->B3SOIPDrth0 != 0.0);
|
||||
if (here->B3SOIPDmode >= 0)
|
||||
{
|
||||
Gm = here->B3SOIPDgm;
|
||||
Gmbs = here->B3SOIPDgmbs;
|
||||
GmT = model->B3SOIPDtype * here->B3SOIPDgmT;
|
||||
FwdSum = Gm + Gmbs;
|
||||
RevSum = 0.0;
|
||||
|
||||
cbgb = here->B3SOIPDcbgb;
|
||||
cbsb = here->B3SOIPDcbsb;
|
||||
cbdb = here->B3SOIPDcbdb;
|
||||
cbeb = here->B3SOIPDcbeb;
|
||||
cbT = model->B3SOIPDtype * here->B3SOIPDcbT;
|
||||
|
||||
ceeb = here->B3SOIPDceeb;
|
||||
ceT = model->B3SOIPDtype * here->B3SOIPDceT;
|
||||
|
||||
cggb = here->B3SOIPDcggb;
|
||||
cgsb = here->B3SOIPDcgsb;
|
||||
cgdb = here->B3SOIPDcgdb;
|
||||
cgT = model->B3SOIPDtype * here->B3SOIPDcgT;
|
||||
|
||||
cdgb = here->B3SOIPDcdgb;
|
||||
cdsb = here->B3SOIPDcdsb;
|
||||
cddb = here->B3SOIPDcddb;
|
||||
cdeb = here->B3SOIPDcdeb;
|
||||
cdT = model->B3SOIPDtype * here->B3SOIPDcdT;
|
||||
|
||||
cTt = here->pParam->B3SOIPDcth;
|
||||
|
||||
gbbg = -here->B3SOIPDgbgs;
|
||||
gbbdp = -here->B3SOIPDgbds;
|
||||
gbbb = -here->B3SOIPDgbbs;
|
||||
gbbp = -here->B3SOIPDgbps;
|
||||
gbbT = -model->B3SOIPDtype * here->B3SOIPDgbT;
|
||||
gbbsp = -(gbbg + gbbdp + gbbb + gbbp);
|
||||
|
||||
gddpg = -here->B3SOIPDgjdg;
|
||||
gddpdp = -here->B3SOIPDgjdd;
|
||||
gddpb = -here->B3SOIPDgjdb;
|
||||
gddpT = -model->B3SOIPDtype * here->B3SOIPDgjdT;
|
||||
gddpsp = -(gddpg + gddpdp + gddpb);
|
||||
|
||||
gsspg = -here->B3SOIPDgjsg;
|
||||
gsspdp = -here->B3SOIPDgjsd;
|
||||
gsspb = -here->B3SOIPDgjsb;
|
||||
gsspT = -model->B3SOIPDtype * here->B3SOIPDgjsT;
|
||||
gsspsp = -(gsspg + gsspdp + gsspb);
|
||||
|
||||
gppdp = 0;
|
||||
gppb = -here->B3SOIPDgbpbs;
|
||||
gppp = -here->B3SOIPDgbpps;
|
||||
gppT = -model->B3SOIPDtype * here->B3SOIPDgbpT;
|
||||
|
||||
gTtg = here->B3SOIPDgtempg;
|
||||
gTtb = here->B3SOIPDgtempb;
|
||||
gTtdp = here->B3SOIPDgtempd;
|
||||
gTtt = here->B3SOIPDgtempT;
|
||||
gTtsp = -(gTtg + gTtb + gTtdp);
|
||||
|
||||
sxpart = 0.6;
|
||||
dxpart = 0.4;
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
Gm = -here->B3SOIPDgm;
|
||||
Gmbs = -here->B3SOIPDgmbs;
|
||||
GmT = -model->B3SOIPDtype * here->B3SOIPDgmT;
|
||||
FwdSum = 0.0;
|
||||
RevSum = -Gm - Gmbs;
|
||||
|
||||
cdgb =
|
||||
-(here->B3SOIPDcdgb + here->B3SOIPDcggb + here->B3SOIPDcbgb);
|
||||
cdsb =
|
||||
-(here->B3SOIPDcddb + here->B3SOIPDcgdb + here->B3SOIPDcbdb);
|
||||
cddb =
|
||||
-(here->B3SOIPDcdsb + here->B3SOIPDcgsb + here->B3SOIPDcbsb);
|
||||
cdeb =
|
||||
-(here->B3SOIPDcdeb + here->B3SOIPDcbeb + here->B3SOIPDceeb);
|
||||
cdT =
|
||||
-model->B3SOIPDtype * (here->B3SOIPDcgT + here->B3SOIPDcbT +
|
||||
here->B3SOIPDcdT + here->B3SOIPDceT);
|
||||
|
||||
ceeb = here->B3SOIPDceeb;
|
||||
ceT = model->B3SOIPDtype * here->B3SOIPDceT;
|
||||
|
||||
cggb = here->B3SOIPDcggb;
|
||||
cgsb = here->B3SOIPDcgdb;
|
||||
cgdb = here->B3SOIPDcgsb;
|
||||
cgT = model->B3SOIPDtype * here->B3SOIPDcgT;
|
||||
|
||||
cbgb = here->B3SOIPDcbgb;
|
||||
cbsb = here->B3SOIPDcbdb;
|
||||
cbdb = here->B3SOIPDcbsb;
|
||||
cbeb = here->B3SOIPDcbeb;
|
||||
cbT = model->B3SOIPDtype * here->B3SOIPDcbT;
|
||||
|
||||
cTt = here->pParam->B3SOIPDcth;
|
||||
|
||||
gbbg = -here->B3SOIPDgbgs;
|
||||
gbbb = -here->B3SOIPDgbbs;
|
||||
gbbp = -here->B3SOIPDgbps;
|
||||
gbbsp = -here->B3SOIPDgbds;
|
||||
gbbT = -model->B3SOIPDtype * here->B3SOIPDgbT;
|
||||
gbbdp = -(gbbg + gbbsp + gbbb + gbbp);
|
||||
|
||||
gddpg = -here->B3SOIPDgjsg;
|
||||
gddpsp = -here->B3SOIPDgjsd;
|
||||
gddpb = -here->B3SOIPDgjsb;
|
||||
gddpT = -model->B3SOIPDtype * here->B3SOIPDgjsT;
|
||||
gddpdp = -(gddpg + gddpsp + gddpb);
|
||||
|
||||
gsspg = -here->B3SOIPDgjdg;
|
||||
gsspsp = -here->B3SOIPDgjdd;
|
||||
gsspb = -here->B3SOIPDgjdb;
|
||||
gsspT = -model->B3SOIPDtype * here->B3SOIPDgjdT;
|
||||
gsspdp = -(gsspg + gsspsp + gsspb);
|
||||
|
||||
gppb = -here->B3SOIPDgbpbs;
|
||||
gppp = -here->B3SOIPDgbpps;
|
||||
gppT = -model->B3SOIPDtype * here->B3SOIPDgbpT;
|
||||
gppdp = -(gppb + gppp);
|
||||
|
||||
gTtt = here->B3SOIPDgtempT;
|
||||
gTtg = here->B3SOIPDgtempg;
|
||||
gTtb = here->B3SOIPDgtempb;
|
||||
gTtdp = here->B3SOIPDgtempd;
|
||||
gTtsp = -(gTtt + gTtg + gTtb + gTtdp);
|
||||
|
||||
gTtg = here->B3SOIPDgtempg;
|
||||
gTtb = here->B3SOIPDgtempb;
|
||||
gTtsp = here->B3SOIPDgtempd;
|
||||
gTtt = here->B3SOIPDgtempT;
|
||||
gTtdp = -(gTtg + gTtb + gTtsp);
|
||||
|
||||
sxpart = 0.6;
|
||||
sxpart = 0.4;
|
||||
dxpart = 0.6;
|
||||
}
|
||||
|
||||
gdpr = here->B3SOIPDdrainConductance;
|
||||
gspr = here->B3SOIPDsourceConductance;
|
||||
gds = here->B3SOIPDgds;
|
||||
|
||||
GSoverlapCap = here->B3SOIPDcgso;
|
||||
GDoverlapCap = here->B3SOIPDcgdo;
|
||||
GEoverlapCap = here->pParam->B3SOIPDcgeo;
|
||||
|
||||
EDextrinsicCap = here->B3SOIPDgcde;
|
||||
ESextrinsicCap = here->B3SOIPDgcse;
|
||||
xcedb = -EDextrinsicCap * omega;
|
||||
xcdeb = (cdeb - EDextrinsicCap) * omega;
|
||||
xcddb = (cddb + GDoverlapCap + EDextrinsicCap) * omega;
|
||||
xceeb =
|
||||
(ceeb + GEoverlapCap + EDextrinsicCap + ESextrinsicCap) * omega;
|
||||
xcesb = -ESextrinsicCap * omega;
|
||||
xcssb =
|
||||
(GSoverlapCap + ESextrinsicCap - (cgsb + cbsb + cdsb)) * omega;
|
||||
|
||||
xcseb = -(cbeb + cdeb + ceeb + ESextrinsicCap) * omega;
|
||||
|
||||
xcegb = (-GEoverlapCap) * omega;
|
||||
xceT = ceT * omega;
|
||||
xcggb = (cggb + GDoverlapCap + GSoverlapCap + GEoverlapCap) * omega;
|
||||
xcgdb = (cgdb - GDoverlapCap) * omega;
|
||||
xcgsb = (cgsb - GSoverlapCap) * omega;
|
||||
xcgeb = (-GEoverlapCap) * omega;
|
||||
xcgT = cgT * omega;
|
||||
|
||||
xcdgb = (cdgb - GDoverlapCap) * omega;
|
||||
xcdsb = cdsb * omega;
|
||||
xcdT = cdT * omega;
|
||||
|
||||
xcsgb = -(cggb + cbgb + cdgb + GSoverlapCap) * omega;
|
||||
xcsdb = -(cgdb + cbdb + cddb) * 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->B3SOIPDEdpPtr + 1) += xcedb;
|
||||
*(here->B3SOIPDEspPtr + 1) += xcesb;
|
||||
*(here->B3SOIPDDPePtr + 1) += xcdeb;
|
||||
*(here->B3SOIPDSPePtr + 1) += xcseb;
|
||||
*(here->B3SOIPDEgPtr + 1) += xcegb;
|
||||
*(here->B3SOIPDGePtr + 1) += xcgeb;
|
||||
|
||||
*(here->B3SOIPDEePtr + 1) += xceeb;
|
||||
|
||||
*(here->B3SOIPDGgPtr + 1) += xcggb;
|
||||
*(here->B3SOIPDGdpPtr + 1) += xcgdb;
|
||||
*(here->B3SOIPDGspPtr + 1) += xcgsb;
|
||||
|
||||
*(here->B3SOIPDDPgPtr + 1) += xcdgb;
|
||||
*(here->B3SOIPDDPdpPtr + 1) += xcddb;
|
||||
*(here->B3SOIPDDPspPtr + 1) += xcdsb;
|
||||
|
||||
*(here->B3SOIPDSPgPtr + 1) += xcsgb;
|
||||
*(here->B3SOIPDSPdpPtr + 1) += xcsdb;
|
||||
*(here->B3SOIPDSPspPtr + 1) += xcssb;
|
||||
|
||||
*(here->B3SOIPDBePtr + 1) += xcbeb;
|
||||
*(here->B3SOIPDBgPtr + 1) += xcbgb;
|
||||
*(here->B3SOIPDBdpPtr + 1) += xcbdb;
|
||||
*(here->B3SOIPDBspPtr + 1) += xcbsb;
|
||||
|
||||
*(here->B3SOIPDEbPtr + 1) -= xcegb + xceeb + xcedb + xcesb;
|
||||
|
||||
*(here->B3SOIPDGbPtr + 1) -= xcggb + xcgdb + xcgsb + xcgeb;
|
||||
*(here->B3SOIPDDPbPtr + 1) -= xcdgb + xcddb + xcdsb + xcdeb;
|
||||
*(here->B3SOIPDSPbPtr + 1) -= xcsgb + xcsdb + xcssb + xcseb;
|
||||
*(here->B3SOIPDBbPtr + 1) -= xcbgb + xcbdb + xcbsb + xcbeb;
|
||||
|
||||
if (selfheat)
|
||||
{
|
||||
*(here->B3SOIPDTemptempPtr + 1) += xcTt;
|
||||
*(here->B3SOIPDDPtempPtr + 1) += xcdT;
|
||||
*(here->B3SOIPDSPtempPtr + 1) += xcsT;
|
||||
*(here->B3SOIPDBtempPtr + 1) += xcbT;
|
||||
*(here->B3SOIPDEtempPtr + 1) += xceT;
|
||||
*(here->B3SOIPDGtempPtr + 1) += xcgT;
|
||||
}
|
||||
|
||||
|
||||
|
||||
*(here->B3SOIPDEePtr) += 0.0;
|
||||
|
||||
*(here->B3SOIPDDPgPtr) += Gm + gddpg;
|
||||
*(here->B3SOIPDDPdpPtr) += gdpr + gds + gddpdp + RevSum;
|
||||
*(here->B3SOIPDDPspPtr) -= gds + FwdSum - gddpsp;
|
||||
*(here->B3SOIPDDPdPtr) -= gdpr;
|
||||
|
||||
*(here->B3SOIPDSPgPtr) -= Gm - gsspg;
|
||||
*(here->B3SOIPDSPdpPtr) -= gds + RevSum - gsspdp;
|
||||
*(here->B3SOIPDSPspPtr) += gspr + gds + FwdSum + gsspsp;
|
||||
*(here->B3SOIPDSPsPtr) -= gspr;
|
||||
|
||||
*(here->B3SOIPDBePtr) += 0;
|
||||
*(here->B3SOIPDBgPtr) += gbbg;
|
||||
*(here->B3SOIPDBdpPtr) += gbbdp;
|
||||
*(here->B3SOIPDBspPtr) += gbbsp;
|
||||
*(here->B3SOIPDBbPtr) += gbbb;
|
||||
*(here->B3SOIPDEbPtr) += 0.0;
|
||||
*(here->B3SOIPDSPbPtr) -= Gmbs - gsspb;
|
||||
*(here->B3SOIPDDPbPtr) -= (-gddpb - Gmbs);
|
||||
|
||||
if (selfheat)
|
||||
{
|
||||
*(here->B3SOIPDDPtempPtr) += GmT + gddpT;
|
||||
*(here->B3SOIPDSPtempPtr) += -GmT + gsspT;
|
||||
*(here->B3SOIPDBtempPtr) += gbbT;
|
||||
|
||||
*(here->B3SOIPDTemptempPtr) +=
|
||||
gTtt + 1 / here->pParam->B3SOIPDrth;
|
||||
*(here->B3SOIPDTempgPtr) += gTtg;
|
||||
*(here->B3SOIPDTempbPtr) += gTtb;
|
||||
*(here->B3SOIPDTempdpPtr) += gTtdp;
|
||||
*(here->B3SOIPDTempspPtr) += gTtsp;
|
||||
}
|
||||
|
||||
|
||||
*(here->B3SOIPDDdPtr) += gdpr;
|
||||
*(here->B3SOIPDDdpPtr) -= gdpr;
|
||||
*(here->B3SOIPDSsPtr) += gspr;
|
||||
*(here->B3SOIPDSspPtr) -= gspr;
|
||||
|
||||
|
||||
if (here->B3SOIPDbodyMod == 1)
|
||||
{
|
||||
(*(here->B3SOIPDBpPtr) -= gppp);
|
||||
(*(here->B3SOIPDPbPtr) += gppb);
|
||||
(*(here->B3SOIPDPpPtr) += gppp);
|
||||
}
|
||||
if (here->B3SOIPDdebugMod != 0)
|
||||
{
|
||||
*(here->B3SOIPDVbsPtr) += 1;
|
||||
*(here->B3SOIPDIdsPtr) += 1;
|
||||
*(here->B3SOIPDIcPtr) += 1;
|
||||
*(here->B3SOIPDIbsPtr) += 1;
|
||||
*(here->B3SOIPDIbdPtr) += 1;
|
||||
*(here->B3SOIPDIiiPtr) += 1;
|
||||
*(here->B3SOIPDIgidlPtr) += 1;
|
||||
*(here->B3SOIPDItunPtr) += 1;
|
||||
*(here->B3SOIPDIbpPtr) += 1;
|
||||
*(here->B3SOIPDCbgPtr) += 1;
|
||||
*(here->B3SOIPDCbbPtr) += 1;
|
||||
*(here->B3SOIPDCbdPtr) += 1;
|
||||
*(here->B3SOIPDQbfPtr) += 1;
|
||||
*(here->B3SOIPDQjsPtr) += 1;
|
||||
*(here->B3SOIPDQjdPtr) += 1;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
return (OK);
|
||||
}
|
||||
|
|
@ -0,0 +1,244 @@
|
|||
/**********
|
||||
Copyright 1990 Regents of the University of California. All rights reserved.
|
||||
Author: 1998 Samuel Fung, Dennis Sinitsky and Stephen Tang
|
||||
File: b3soipdask.c 98/5/01
|
||||
Modified by Pin Su 99/4/30
|
||||
**********/
|
||||
|
||||
|
||||
#include "ngspice.h"
|
||||
#include <stdio.h>
|
||||
#include <math.h>
|
||||
#include "ifsim.h"
|
||||
#include "cktdefs.h"
|
||||
#include "devdefs.h"
|
||||
#include "b3soipddef.h"
|
||||
#include "sperror.h"
|
||||
#include "suffix.h"
|
||||
|
||||
int
|
||||
B3SOIPDask (ckt, inst, which, value, select)
|
||||
CKTcircuit *ckt;
|
||||
GENinstance *inst;
|
||||
int which;
|
||||
IFvalue *value;
|
||||
IFvalue *select;
|
||||
{
|
||||
B3SOIPDinstance *here = (B3SOIPDinstance *) inst;
|
||||
|
||||
switch (which)
|
||||
{
|
||||
case B3SOIPD_L:
|
||||
value->rValue = here->B3SOIPDl;
|
||||
return (OK);
|
||||
case B3SOIPD_W:
|
||||
value->rValue = here->B3SOIPDw;
|
||||
return (OK);
|
||||
case B3SOIPD_AS:
|
||||
value->rValue = here->B3SOIPDsourceArea;
|
||||
return (OK);
|
||||
case B3SOIPD_AD:
|
||||
value->rValue = here->B3SOIPDdrainArea;
|
||||
return (OK);
|
||||
case B3SOIPD_PS:
|
||||
value->rValue = here->B3SOIPDsourcePerimeter;
|
||||
return (OK);
|
||||
case B3SOIPD_PD:
|
||||
value->rValue = here->B3SOIPDdrainPerimeter;
|
||||
return (OK);
|
||||
case B3SOIPD_NRS:
|
||||
value->rValue = here->B3SOIPDsourceSquares;
|
||||
return (OK);
|
||||
case B3SOIPD_NRD:
|
||||
value->rValue = here->B3SOIPDdrainSquares;
|
||||
return (OK);
|
||||
case B3SOIPD_OFF:
|
||||
value->iValue = here->B3SOIPDoff;
|
||||
return (OK);
|
||||
case B3SOIPD_BJTOFF:
|
||||
value->iValue = here->B3SOIPDbjtoff;
|
||||
return (OK);
|
||||
case B3SOIPD_RTH0:
|
||||
value->rValue = here->B3SOIPDrth0;
|
||||
return (OK);
|
||||
case B3SOIPD_CTH0:
|
||||
value->rValue = here->B3SOIPDcth0;
|
||||
return (OK);
|
||||
case B3SOIPD_NRB:
|
||||
value->rValue = here->B3SOIPDbodySquares;
|
||||
return (OK);
|
||||
|
||||
|
||||
/* v2.0 release */
|
||||
case B3SOIPD_NBC:
|
||||
value->rValue = here->B3SOIPDnbc;
|
||||
return (OK);
|
||||
case B3SOIPD_NSEG:
|
||||
value->rValue = here->B3SOIPDnseg;
|
||||
return (OK);
|
||||
case B3SOIPD_PDBCP:
|
||||
value->rValue = here->B3SOIPDpdbcp;
|
||||
return (OK);
|
||||
case B3SOIPD_PSBCP:
|
||||
value->rValue = here->B3SOIPDpsbcp;
|
||||
return (OK);
|
||||
case B3SOIPD_AGBCP:
|
||||
value->rValue = here->B3SOIPDagbcp;
|
||||
return (OK);
|
||||
case B3SOIPD_AEBCP:
|
||||
value->rValue = here->B3SOIPDaebcp;
|
||||
return (OK);
|
||||
case B3SOIPD_VBSUSR:
|
||||
value->rValue = here->B3SOIPDvbsusr;
|
||||
return (OK);
|
||||
case B3SOIPD_TNODEOUT:
|
||||
value->iValue = here->B3SOIPDtnodeout;
|
||||
return (OK);
|
||||
|
||||
|
||||
case B3SOIPD_IC_VBS:
|
||||
value->rValue = here->B3SOIPDicVBS;
|
||||
return (OK);
|
||||
case B3SOIPD_IC_VDS:
|
||||
value->rValue = here->B3SOIPDicVDS;
|
||||
return (OK);
|
||||
case B3SOIPD_IC_VGS:
|
||||
value->rValue = here->B3SOIPDicVGS;
|
||||
return (OK);
|
||||
case B3SOIPD_IC_VES:
|
||||
value->rValue = here->B3SOIPDicVES;
|
||||
return (OK);
|
||||
case B3SOIPD_IC_VPS:
|
||||
value->rValue = here->B3SOIPDicVPS;
|
||||
return (OK);
|
||||
case B3SOIPD_DNODE:
|
||||
value->iValue = here->B3SOIPDdNode;
|
||||
return (OK);
|
||||
case B3SOIPD_GNODE:
|
||||
value->iValue = here->B3SOIPDgNode;
|
||||
return (OK);
|
||||
case B3SOIPD_SNODE:
|
||||
value->iValue = here->B3SOIPDsNode;
|
||||
return (OK);
|
||||
case B3SOIPD_BNODE:
|
||||
value->iValue = here->B3SOIPDbNode;
|
||||
return (OK);
|
||||
case B3SOIPD_ENODE:
|
||||
value->iValue = here->B3SOIPDeNode;
|
||||
return (OK);
|
||||
case B3SOIPD_DNODEPRIME:
|
||||
value->iValue = here->B3SOIPDdNodePrime;
|
||||
return (OK);
|
||||
case B3SOIPD_SNODEPRIME:
|
||||
value->iValue = here->B3SOIPDsNodePrime;
|
||||
return (OK);
|
||||
case B3SOIPD_SOURCECONDUCT:
|
||||
value->rValue = here->B3SOIPDsourceConductance;
|
||||
return (OK);
|
||||
case B3SOIPD_DRAINCONDUCT:
|
||||
value->rValue = here->B3SOIPDdrainConductance;
|
||||
return (OK);
|
||||
case B3SOIPD_VBD:
|
||||
value->rValue = *(ckt->CKTstate0 + here->B3SOIPDvbd);
|
||||
return (OK);
|
||||
case B3SOIPD_VBS:
|
||||
value->rValue = *(ckt->CKTstate0 + here->B3SOIPDvbs);
|
||||
return (OK);
|
||||
case B3SOIPD_VGS:
|
||||
value->rValue = *(ckt->CKTstate0 + here->B3SOIPDvgs);
|
||||
return (OK);
|
||||
case B3SOIPD_VES:
|
||||
value->rValue = *(ckt->CKTstate0 + here->B3SOIPDves);
|
||||
return (OK);
|
||||
case B3SOIPD_VDS:
|
||||
value->rValue = *(ckt->CKTstate0 + here->B3SOIPDvds);
|
||||
return (OK);
|
||||
case B3SOIPD_CD:
|
||||
value->rValue = here->B3SOIPDcd;
|
||||
return (OK);
|
||||
case B3SOIPD_CBS:
|
||||
value->rValue = here->B3SOIPDcjs;
|
||||
return (OK);
|
||||
case B3SOIPD_CBD:
|
||||
value->rValue = here->B3SOIPDcjd;
|
||||
return (OK);
|
||||
case B3SOIPD_GM:
|
||||
value->rValue = here->B3SOIPDgm;
|
||||
return (OK);
|
||||
case B3SOIPD_GMID:
|
||||
value->rValue = here->B3SOIPDgm / here->B3SOIPDcd;
|
||||
return (OK);
|
||||
case B3SOIPD_GDS:
|
||||
value->rValue = here->B3SOIPDgds;
|
||||
return (OK);
|
||||
case B3SOIPD_GMBS:
|
||||
value->rValue = here->B3SOIPDgmbs;
|
||||
return (OK);
|
||||
case B3SOIPD_GBD:
|
||||
value->rValue = here->B3SOIPDgjdb;
|
||||
return (OK);
|
||||
case B3SOIPD_GBS:
|
||||
value->rValue = here->B3SOIPDgjsb;
|
||||
return (OK);
|
||||
case B3SOIPD_QB:
|
||||
value->rValue = *(ckt->CKTstate0 + here->B3SOIPDqb);
|
||||
return (OK);
|
||||
case B3SOIPD_CQB:
|
||||
value->rValue = *(ckt->CKTstate0 + here->B3SOIPDcqb);
|
||||
return (OK);
|
||||
case B3SOIPD_QG:
|
||||
value->rValue = *(ckt->CKTstate0 + here->B3SOIPDqg);
|
||||
return (OK);
|
||||
case B3SOIPD_CQG:
|
||||
value->rValue = *(ckt->CKTstate0 + here->B3SOIPDcqg);
|
||||
return (OK);
|
||||
case B3SOIPD_QD:
|
||||
value->rValue = *(ckt->CKTstate0 + here->B3SOIPDqd);
|
||||
return (OK);
|
||||
case B3SOIPD_CQD:
|
||||
value->rValue = *(ckt->CKTstate0 + here->B3SOIPDcqd);
|
||||
return (OK);
|
||||
case B3SOIPD_CGG:
|
||||
value->rValue = here->B3SOIPDcggb;
|
||||
return (OK);
|
||||
case B3SOIPD_CGD:
|
||||
value->rValue = here->B3SOIPDcgdb;
|
||||
return (OK);
|
||||
case B3SOIPD_CGS:
|
||||
value->rValue = here->B3SOIPDcgsb;
|
||||
return (OK);
|
||||
case B3SOIPD_CDG:
|
||||
value->rValue = here->B3SOIPDcdgb;
|
||||
return (OK);
|
||||
case B3SOIPD_CDD:
|
||||
value->rValue = here->B3SOIPDcddb;
|
||||
return (OK);
|
||||
case B3SOIPD_CDS:
|
||||
value->rValue = here->B3SOIPDcdsb;
|
||||
return (OK);
|
||||
case B3SOIPD_CBG:
|
||||
value->rValue = here->B3SOIPDcbgb;
|
||||
return (OK);
|
||||
case B3SOIPD_CBDB:
|
||||
value->rValue = here->B3SOIPDcbdb;
|
||||
return (OK);
|
||||
case B3SOIPD_CBSB:
|
||||
value->rValue = here->B3SOIPDcbsb;
|
||||
return (OK);
|
||||
case B3SOIPD_VON:
|
||||
value->rValue = here->B3SOIPDvon;
|
||||
return (OK);
|
||||
case B3SOIPD_VDSAT:
|
||||
value->rValue = here->B3SOIPDvdsat;
|
||||
return (OK);
|
||||
case B3SOIPD_QBS:
|
||||
value->rValue = *(ckt->CKTstate0 + here->B3SOIPDqbs);
|
||||
return (OK);
|
||||
case B3SOIPD_QBD:
|
||||
value->rValue = *(ckt->CKTstate0 + here->B3SOIPDqbd);
|
||||
return (OK);
|
||||
default:
|
||||
return (E_BADPARM);
|
||||
}
|
||||
/* NOTREACHED */
|
||||
}
|
||||
|
|
@ -0,0 +1,913 @@
|
|||
/**********
|
||||
Copyright 1990 Regents of the University of California. All rights reserved.
|
||||
Author: 1998 Samuel Fung, Dennis Sinitsky and Stephen Tang
|
||||
File: b3soipdcheck.c 98/5/01
|
||||
Modified by Pin Su and Jan Feng 99/2/15
|
||||
Modified by Pin Su 99/4/30
|
||||
Modified by Pin Su 00/3/1
|
||||
**********/
|
||||
|
||||
|
||||
#include "ngspice.h"
|
||||
#include <stdio.h>
|
||||
#include <math.h>
|
||||
#include "cktdefs.h"
|
||||
#include "b3soipddef.h"
|
||||
#include "trandefs.h"
|
||||
#include "const.h"
|
||||
#include "sperror.h"
|
||||
#include "devdefs.h"
|
||||
#include "suffix.h"
|
||||
|
||||
int
|
||||
B3SOIPDcheckModel (model, here, ckt)
|
||||
register B3SOIPDmodel *model;
|
||||
register B3SOIPDinstance *here;
|
||||
CKTcircuit *ckt;
|
||||
{
|
||||
struct b3soipdSizeDependParam *pParam;
|
||||
int Fatal_Flag = 0;
|
||||
FILE *fplog;
|
||||
|
||||
if ((fplog = fopen ("b3soipdv1check.log", "w")) != NULL)
|
||||
{
|
||||
pParam = here->pParam;
|
||||
fprintf (fplog, "B3SOIPDV3 Parameter Check\n");
|
||||
fprintf (fplog, "Model = %s\n", model->B3SOIPDmodName);
|
||||
fprintf (fplog, "W = %g, L = %g\n", here->B3SOIPDw, here->B3SOIPDl);
|
||||
|
||||
|
||||
if (pParam->B3SOIPDnlx < -pParam->B3SOIPDleff)
|
||||
{
|
||||
fprintf (fplog, "Fatal: Nlx = %g is less than -Leff.\n",
|
||||
pParam->B3SOIPDnlx);
|
||||
printf ("Fatal: Nlx = %g is less than -Leff.\n",
|
||||
pParam->B3SOIPDnlx);
|
||||
Fatal_Flag = 1;
|
||||
}
|
||||
|
||||
if (model->B3SOIPDtox <= 0.0)
|
||||
{
|
||||
fprintf (fplog, "Fatal: Tox = %g is not positive.\n",
|
||||
model->B3SOIPDtox);
|
||||
printf ("Fatal: Tox = %g is not positive.\n", model->B3SOIPDtox);
|
||||
Fatal_Flag = 1;
|
||||
}
|
||||
|
||||
if (model->B3SOIPDtbox <= 0.0)
|
||||
{
|
||||
fprintf (fplog, "Fatal: Tbox = %g is not positive.\n",
|
||||
model->B3SOIPDtbox);
|
||||
printf ("Fatal: Tbox = %g is not positive.\n", model->B3SOIPDtbox);
|
||||
Fatal_Flag = 1;
|
||||
}
|
||||
|
||||
if (pParam->B3SOIPDnpeak <= 0.0)
|
||||
{
|
||||
fprintf (fplog, "Fatal: Nch = %g is not positive.\n",
|
||||
pParam->B3SOIPDnpeak);
|
||||
printf ("Fatal: Nch = %g is not positive.\n", pParam->B3SOIPDnpeak);
|
||||
Fatal_Flag = 1;
|
||||
}
|
||||
if (pParam->B3SOIPDngate < 0.0)
|
||||
{
|
||||
fprintf (fplog, "Fatal: Ngate = %g is not positive.\n",
|
||||
pParam->B3SOIPDngate);
|
||||
printf ("Fatal: Ngate = %g Ngate is not positive.\n",
|
||||
pParam->B3SOIPDngate);
|
||||
Fatal_Flag = 1;
|
||||
}
|
||||
if (pParam->B3SOIPDngate > 1.e25)
|
||||
{
|
||||
fprintf (fplog, "Fatal: Ngate = %g is too high.\n",
|
||||
pParam->B3SOIPDngate);
|
||||
printf ("Fatal: Ngate = %g Ngate is too high\n",
|
||||
pParam->B3SOIPDngate);
|
||||
Fatal_Flag = 1;
|
||||
}
|
||||
|
||||
if (pParam->B3SOIPDdvt1 < 0.0)
|
||||
{
|
||||
fprintf (fplog, "Fatal: Dvt1 = %g is negative.\n",
|
||||
pParam->B3SOIPDdvt1);
|
||||
printf ("Fatal: Dvt1 = %g is negative.\n", pParam->B3SOIPDdvt1);
|
||||
Fatal_Flag = 1;
|
||||
}
|
||||
|
||||
if (pParam->B3SOIPDdvt1w < 0.0)
|
||||
{
|
||||
fprintf (fplog, "Fatal: Dvt1w = %g is negative.\n",
|
||||
pParam->B3SOIPDdvt1w);
|
||||
printf ("Fatal: Dvt1w = %g is negative.\n", pParam->B3SOIPDdvt1w);
|
||||
Fatal_Flag = 1;
|
||||
}
|
||||
|
||||
if (pParam->B3SOIPDw0 == -pParam->B3SOIPDweff)
|
||||
{
|
||||
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->B3SOIPDdsub < 0.0)
|
||||
{
|
||||
fprintf (fplog, "Fatal: Dsub = %g is negative.\n",
|
||||
pParam->B3SOIPDdsub);
|
||||
printf ("Fatal: Dsub = %g is negative.\n", pParam->B3SOIPDdsub);
|
||||
Fatal_Flag = 1;
|
||||
}
|
||||
if (pParam->B3SOIPDb1 == -pParam->B3SOIPDweff)
|
||||
{
|
||||
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->B3SOIPDu0temp <= 0.0)
|
||||
{
|
||||
fprintf (fplog,
|
||||
"Fatal: u0 at current temperature = %g is not positive.\n",
|
||||
pParam->B3SOIPDu0temp);
|
||||
printf ("Fatal: u0 at current temperature = %g is not positive.\n",
|
||||
pParam->B3SOIPDu0temp);
|
||||
Fatal_Flag = 1;
|
||||
}
|
||||
|
||||
/* Check delta parameter */
|
||||
if (pParam->B3SOIPDdelta < 0.0)
|
||||
{
|
||||
fprintf (fplog, "Fatal: Delta = %g is less than zero.\n",
|
||||
pParam->B3SOIPDdelta);
|
||||
printf ("Fatal: Delta = %g is less than zero.\n",
|
||||
pParam->B3SOIPDdelta);
|
||||
Fatal_Flag = 1;
|
||||
}
|
||||
|
||||
if (pParam->B3SOIPDvsattemp <= 0.0)
|
||||
{
|
||||
fprintf (fplog,
|
||||
"Fatal: Vsat at current temperature = %g is not positive.\n",
|
||||
pParam->B3SOIPDvsattemp);
|
||||
printf
|
||||
("Fatal: Vsat at current temperature = %g is not positive.\n",
|
||||
pParam->B3SOIPDvsattemp);
|
||||
Fatal_Flag = 1;
|
||||
}
|
||||
/* Check Rout parameters */
|
||||
if (pParam->B3SOIPDpclm <= 0.0)
|
||||
{
|
||||
fprintf (fplog, "Fatal: Pclm = %g is not positive.\n",
|
||||
pParam->B3SOIPDpclm);
|
||||
printf ("Fatal: Pclm = %g is not positive.\n", pParam->B3SOIPDpclm);
|
||||
Fatal_Flag = 1;
|
||||
}
|
||||
|
||||
if (pParam->B3SOIPDdrout < 0.0)
|
||||
{
|
||||
fprintf (fplog, "Fatal: Drout = %g is negative.\n",
|
||||
pParam->B3SOIPDdrout);
|
||||
printf ("Fatal: Drout = %g is negative.\n", pParam->B3SOIPDdrout);
|
||||
Fatal_Flag = 1;
|
||||
}
|
||||
if (model->B3SOIPDunitLengthGateSidewallJctCap > 0.0)
|
||||
{
|
||||
if (here->B3SOIPDdrainPerimeter < pParam->B3SOIPDweff)
|
||||
{
|
||||
fprintf (fplog, "Warning: Pd = %g is less than W.\n",
|
||||
here->B3SOIPDdrainPerimeter);
|
||||
printf ("Warning: Pd = %g is less than W.\n",
|
||||
here->B3SOIPDdrainPerimeter);
|
||||
here->B3SOIPDdrainPerimeter = pParam->B3SOIPDweff;
|
||||
}
|
||||
if (here->B3SOIPDsourcePerimeter < pParam->B3SOIPDweff)
|
||||
{
|
||||
fprintf (fplog, "Warning: Ps = %g is less than W.\n",
|
||||
here->B3SOIPDsourcePerimeter);
|
||||
printf ("Warning: Ps = %g is less than W.\n",
|
||||
here->B3SOIPDsourcePerimeter);
|
||||
here->B3SOIPDsourcePerimeter = pParam->B3SOIPDweff;
|
||||
}
|
||||
}
|
||||
/* Check capacitance parameters */
|
||||
if (pParam->B3SOIPDclc < 0.0)
|
||||
{
|
||||
fprintf (fplog, "Fatal: Clc = %g is negative.\n",
|
||||
pParam->B3SOIPDclc);
|
||||
printf ("Fatal: Clc = %g is negative.\n", pParam->B3SOIPDclc);
|
||||
Fatal_Flag = 1;
|
||||
}
|
||||
if (model->B3SOIPDparamChk == 1)
|
||||
{
|
||||
/* Check L and W parameters */
|
||||
if (pParam->B3SOIPDleff <= 5.0e-8)
|
||||
{
|
||||
fprintf (fplog, "Warning: Leff = %g may be too small.\n",
|
||||
pParam->B3SOIPDleff);
|
||||
printf ("Warning: Leff = %g may be too small.\n",
|
||||
pParam->B3SOIPDleff);
|
||||
}
|
||||
|
||||
if (pParam->B3SOIPDleffCV <= 5.0e-8)
|
||||
{
|
||||
fprintf (fplog, "Warning: Leff for CV = %g may be too small.\n",
|
||||
pParam->B3SOIPDleffCV);
|
||||
printf ("Warning: Leff for CV = %g may be too small.\n",
|
||||
pParam->B3SOIPDleffCV);
|
||||
}
|
||||
|
||||
if (pParam->B3SOIPDweff <= 1.0e-7)
|
||||
{
|
||||
fprintf (fplog, "Warning: Weff = %g may be too small.\n",
|
||||
pParam->B3SOIPDweff);
|
||||
printf ("Warning: Weff = %g may be too small.\n",
|
||||
pParam->B3SOIPDweff);
|
||||
}
|
||||
|
||||
if (pParam->B3SOIPDweffCV <= 1.0e-7)
|
||||
{
|
||||
fprintf (fplog, "Warning: Weff for CV = %g may be too small.\n",
|
||||
pParam->B3SOIPDweffCV);
|
||||
printf ("Warning: Weff for CV = %g may be too small.\n",
|
||||
pParam->B3SOIPDweffCV);
|
||||
}
|
||||
|
||||
/* Check threshold voltage parameters */
|
||||
if (pParam->B3SOIPDnlx < 0.0)
|
||||
{
|
||||
fprintf (fplog, "Warning: Nlx = %g is negative.\n",
|
||||
pParam->B3SOIPDnlx);
|
||||
printf ("Warning: Nlx = %g is negative.\n", pParam->B3SOIPDnlx);
|
||||
}
|
||||
if (model->B3SOIPDtox < 1.0e-9)
|
||||
{
|
||||
fprintf (fplog, "Warning: Tox = %g is less than 10A.\n",
|
||||
model->B3SOIPDtox);
|
||||
printf ("Warning: Tox = %g is less than 10A.\n",
|
||||
model->B3SOIPDtox);
|
||||
}
|
||||
|
||||
if (pParam->B3SOIPDnpeak <= 1.0e15)
|
||||
{
|
||||
fprintf (fplog, "Warning: Nch = %g may be too small.\n",
|
||||
pParam->B3SOIPDnpeak);
|
||||
printf ("Warning: Nch = %g may be too small.\n",
|
||||
pParam->B3SOIPDnpeak);
|
||||
}
|
||||
else if (pParam->B3SOIPDnpeak >= 1.0e21)
|
||||
{
|
||||
fprintf (fplog, "Warning: Nch = %g may be too large.\n",
|
||||
pParam->B3SOIPDnpeak);
|
||||
printf ("Warning: Nch = %g may be too large.\n",
|
||||
pParam->B3SOIPDnpeak);
|
||||
}
|
||||
|
||||
if (fabs (pParam->B3SOIPDnsub) >= 1.0e21)
|
||||
{
|
||||
fprintf (fplog, "Warning: Nsub = %g may be too large.\n",
|
||||
pParam->B3SOIPDnsub);
|
||||
printf ("Warning: Nsub = %g may be too large.\n",
|
||||
pParam->B3SOIPDnsub);
|
||||
}
|
||||
|
||||
if ((pParam->B3SOIPDngate > 0.0) && (pParam->B3SOIPDngate <= 1.e18))
|
||||
{
|
||||
fprintf (fplog,
|
||||
"Warning: Ngate = %g is less than 1.E18cm^-3.\n",
|
||||
pParam->B3SOIPDngate);
|
||||
printf ("Warning: Ngate = %g is less than 1.E18cm^-3.\n",
|
||||
pParam->B3SOIPDngate);
|
||||
}
|
||||
|
||||
if (pParam->B3SOIPDdvt0 < 0.0)
|
||||
{
|
||||
fprintf (fplog, "Warning: Dvt0 = %g is negative.\n",
|
||||
pParam->B3SOIPDdvt0);
|
||||
printf ("Warning: Dvt0 = %g is negative.\n",
|
||||
pParam->B3SOIPDdvt0);
|
||||
}
|
||||
|
||||
if (fabs (1.0e-6 / (pParam->B3SOIPDw0 + pParam->B3SOIPDweff)) >
|
||||
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->B3SOIPDnfactor < 0.0)
|
||||
{
|
||||
fprintf (fplog, "Warning: Nfactor = %g is negative.\n",
|
||||
pParam->B3SOIPDnfactor);
|
||||
printf ("Warning: Nfactor = %g is negative.\n",
|
||||
pParam->B3SOIPDnfactor);
|
||||
}
|
||||
if (pParam->B3SOIPDcdsc < 0.0)
|
||||
{
|
||||
fprintf (fplog, "Warning: Cdsc = %g is negative.\n",
|
||||
pParam->B3SOIPDcdsc);
|
||||
printf ("Warning: Cdsc = %g is negative.\n",
|
||||
pParam->B3SOIPDcdsc);
|
||||
}
|
||||
if (pParam->B3SOIPDcdscd < 0.0)
|
||||
{
|
||||
fprintf (fplog, "Warning: Cdscd = %g is negative.\n",
|
||||
pParam->B3SOIPDcdscd);
|
||||
printf ("Warning: Cdscd = %g is negative.\n",
|
||||
pParam->B3SOIPDcdscd);
|
||||
}
|
||||
/* Check DIBL parameters */
|
||||
if (pParam->B3SOIPDeta0 < 0.0)
|
||||
{
|
||||
fprintf (fplog, "Warning: Eta0 = %g is negative.\n",
|
||||
pParam->B3SOIPDeta0);
|
||||
printf ("Warning: Eta0 = %g is negative.\n",
|
||||
pParam->B3SOIPDeta0);
|
||||
}
|
||||
|
||||
/* Check Abulk parameters */
|
||||
if (fabs (1.0e-6 / (pParam->B3SOIPDb1 + pParam->B3SOIPDweff)) >
|
||||
10.0)
|
||||
{
|
||||
fprintf (fplog, "Warning: (B1 + Weff) may be too small.\n");
|
||||
printf ("Warning: (B1 + Weff) may be too small.\n");
|
||||
}
|
||||
|
||||
/* Check Saturation parameters */
|
||||
if (pParam->B3SOIPDa2 < 0.01)
|
||||
{
|
||||
fprintf (fplog, "Warning: A2 = %g is too small. Set to 0.01.\n",
|
||||
pParam->B3SOIPDa2);
|
||||
printf ("Warning: A2 = %g is too small. Set to 0.01.\n",
|
||||
pParam->B3SOIPDa2);
|
||||
pParam->B3SOIPDa2 = 0.01;
|
||||
}
|
||||
else if (pParam->B3SOIPDa2 > 1.0)
|
||||
{
|
||||
fprintf (fplog,
|
||||
"Warning: A2 = %g is larger than 1. A2 is set to 1 and A1 is set to 0.\n",
|
||||
pParam->B3SOIPDa2);
|
||||
printf
|
||||
("Warning: A2 = %g is larger than 1. A2 is set to 1 and A1 is set to 0.\n",
|
||||
pParam->B3SOIPDa2);
|
||||
pParam->B3SOIPDa2 = 1.0;
|
||||
pParam->B3SOIPDa1 = 0.0;
|
||||
|
||||
}
|
||||
|
||||
if (pParam->B3SOIPDrdsw < 0.0)
|
||||
{
|
||||
fprintf (fplog,
|
||||
"Warning: Rdsw = %g is negative. Set to zero.\n",
|
||||
pParam->B3SOIPDrdsw);
|
||||
printf ("Warning: Rdsw = %g is negative. Set to zero.\n",
|
||||
pParam->B3SOIPDrdsw);
|
||||
pParam->B3SOIPDrdsw = 0.0;
|
||||
pParam->B3SOIPDrds0 = 0.0;
|
||||
}
|
||||
else if ((pParam->B3SOIPDrds0 > 0.0)
|
||||
&& (pParam->B3SOIPDrds0 < 0.001))
|
||||
{
|
||||
fprintf (fplog,
|
||||
"Warning: Rds at current temperature = %g is less than 0.001 ohm. Set to zero.\n",
|
||||
pParam->B3SOIPDrds0);
|
||||
printf
|
||||
("Warning: Rds at current temperature = %g is less than 0.001 ohm. Set to zero.\n",
|
||||
pParam->B3SOIPDrds0);
|
||||
pParam->B3SOIPDrds0 = 0.0;
|
||||
}
|
||||
if (pParam->B3SOIPDvsattemp < 1.0e3)
|
||||
{
|
||||
fprintf (fplog,
|
||||
"Warning: Vsat at current temperature = %g may be too small.\n",
|
||||
pParam->B3SOIPDvsattemp);
|
||||
printf
|
||||
("Warning: Vsat at current temperature = %g may be too small.\n",
|
||||
pParam->B3SOIPDvsattemp);
|
||||
}
|
||||
|
||||
if (pParam->B3SOIPDpdibl1 < 0.0)
|
||||
{
|
||||
fprintf (fplog, "Warning: Pdibl1 = %g is negative.\n",
|
||||
pParam->B3SOIPDpdibl1);
|
||||
printf ("Warning: Pdibl1 = %g is negative.\n",
|
||||
pParam->B3SOIPDpdibl1);
|
||||
}
|
||||
if (pParam->B3SOIPDpdibl2 < 0.0)
|
||||
{
|
||||
fprintf (fplog, "Warning: Pdibl2 = %g is negative.\n",
|
||||
pParam->B3SOIPDpdibl2);
|
||||
printf ("Warning: Pdibl2 = %g is negative.\n",
|
||||
pParam->B3SOIPDpdibl2);
|
||||
}
|
||||
/* Check overlap capacitance parameters */
|
||||
if (model->B3SOIPDcgdo < 0.0)
|
||||
{
|
||||
fprintf (fplog,
|
||||
"Warning: cgdo = %g is negative. Set to zero.\n",
|
||||
model->B3SOIPDcgdo);
|
||||
printf ("Warning: cgdo = %g is negative. Set to zero.\n",
|
||||
model->B3SOIPDcgdo);
|
||||
model->B3SOIPDcgdo = 0.0;
|
||||
}
|
||||
if (model->B3SOIPDcgso < 0.0)
|
||||
{
|
||||
fprintf (fplog,
|
||||
"Warning: cgso = %g is negative. Set to zero.\n",
|
||||
model->B3SOIPDcgso);
|
||||
printf ("Warning: cgso = %g is negative. Set to zero.\n",
|
||||
model->B3SOIPDcgso);
|
||||
model->B3SOIPDcgso = 0.0;
|
||||
}
|
||||
if (model->B3SOIPDcgeo < 0.0)
|
||||
{
|
||||
fprintf (fplog,
|
||||
"Warning: cgeo = %g is negative. Set to zero.\n",
|
||||
model->B3SOIPDcgeo);
|
||||
printf ("Warning: cgeo = %g is negative. Set to zero.\n",
|
||||
model->B3SOIPDcgeo);
|
||||
model->B3SOIPDcgeo = 0.0;
|
||||
}
|
||||
|
||||
if (model->B3SOIPDntun < 0.0)
|
||||
{
|
||||
fprintf (fplog, "Warning: Ntun = %g is negative.\n",
|
||||
model->B3SOIPDntun);
|
||||
printf ("Warning: Ntun = %g is negative.\n",
|
||||
model->B3SOIPDntun);
|
||||
}
|
||||
|
||||
if (model->B3SOIPDndiode < 0.0)
|
||||
{
|
||||
fprintf (fplog, "Warning: Ndiode = %g is negative.\n",
|
||||
model->B3SOIPDndiode);
|
||||
printf ("Warning: Ndiode = %g is negative.\n",
|
||||
model->B3SOIPDndiode);
|
||||
}
|
||||
|
||||
if (model->B3SOIPDisbjt < 0.0)
|
||||
{
|
||||
fprintf (fplog, "Warning: Isbjt = %g is negative.\n",
|
||||
model->B3SOIPDisbjt);
|
||||
printf ("Warning: Isbjt = %g is negative.\n",
|
||||
model->B3SOIPDisbjt);
|
||||
}
|
||||
|
||||
if (model->B3SOIPDisdif < 0.0)
|
||||
{
|
||||
fprintf (fplog, "Warning: Isdif = %g is negative.\n",
|
||||
model->B3SOIPDisdif);
|
||||
printf ("Warning: Isdif = %g is negative.\n",
|
||||
model->B3SOIPDisdif);
|
||||
}
|
||||
|
||||
if (model->B3SOIPDisrec < 0.0)
|
||||
{
|
||||
fprintf (fplog, "Warning: Isrec = %g is negative.\n",
|
||||
model->B3SOIPDisrec);
|
||||
printf ("Warning: Isrec = %g is negative.\n",
|
||||
model->B3SOIPDisrec);
|
||||
}
|
||||
|
||||
if (model->B3SOIPDistun < 0.0)
|
||||
{
|
||||
fprintf (fplog, "Warning: Istun = %g is negative.\n",
|
||||
model->B3SOIPDistun);
|
||||
printf ("Warning: Istun = %g is negative.\n",
|
||||
model->B3SOIPDistun);
|
||||
}
|
||||
|
||||
if (model->B3SOIPDtt < 0.0)
|
||||
{
|
||||
fprintf (fplog, "Warning: Tt = %g is negative.\n",
|
||||
model->B3SOIPDtt);
|
||||
printf ("Warning: Tt = %g is negative.\n", model->B3SOIPDtt);
|
||||
}
|
||||
|
||||
if (model->B3SOIPDcsdmin < 0.0)
|
||||
{
|
||||
fprintf (fplog, "Warning: Csdmin = %g is negative.\n",
|
||||
model->B3SOIPDcsdmin);
|
||||
printf ("Warning: Csdmin = %g is negative.\n",
|
||||
model->B3SOIPDcsdmin);
|
||||
}
|
||||
|
||||
if (model->B3SOIPDcsdesw < 0.0)
|
||||
{
|
||||
fprintf (fplog, "Warning: Csdesw = %g is negative.\n",
|
||||
model->B3SOIPDcsdesw);
|
||||
printf ("Warning: Csdesw = %g is negative.\n",
|
||||
model->B3SOIPDcsdesw);
|
||||
}
|
||||
|
||||
if (model->B3SOIPDasd < 0.0)
|
||||
{
|
||||
fprintf (fplog, "Warning: Asd = %g should be within (0, 1).\n",
|
||||
model->B3SOIPDasd);
|
||||
printf ("Warning: Asd = %g should be within (0, 1).\n",
|
||||
model->B3SOIPDasd);
|
||||
}
|
||||
|
||||
if (model->B3SOIPDrth0 < 0.0)
|
||||
{
|
||||
fprintf (fplog, "Warning: Rth0 = %g is negative.\n",
|
||||
model->B3SOIPDrth0);
|
||||
printf ("Warning: Rth0 = %g is negative.\n",
|
||||
model->B3SOIPDrth0);
|
||||
}
|
||||
|
||||
if (model->B3SOIPDcth0 < 0.0)
|
||||
{
|
||||
fprintf (fplog, "Warning: Cth0 = %g is negative.\n",
|
||||
model->B3SOIPDcth0);
|
||||
printf ("Warning: Cth0 = %g is negative.\n",
|
||||
model->B3SOIPDcth0);
|
||||
}
|
||||
|
||||
if (model->B3SOIPDrbody < 0.0)
|
||||
{
|
||||
fprintf (fplog, "Warning: Rbody = %g is negative.\n",
|
||||
model->B3SOIPDrbody);
|
||||
printf ("Warning: Rbody = %g is negative.\n",
|
||||
model->B3SOIPDrbody);
|
||||
}
|
||||
|
||||
if (model->B3SOIPDrbsh < 0.0)
|
||||
{
|
||||
fprintf (fplog, "Warning: Rbsh = %g is negative.\n",
|
||||
model->B3SOIPDrbsh);
|
||||
printf ("Warning: Rbsh = %g is negative.\n",
|
||||
model->B3SOIPDrbsh);
|
||||
}
|
||||
|
||||
|
||||
/* v2.2 release */
|
||||
if (model->B3SOIPDwth0 < 0.0)
|
||||
{
|
||||
fprintf (fplog, "Warning: WTH0 = %g is negative.\n",
|
||||
model->B3SOIPDwth0);
|
||||
printf ("Warning: Wth0 = %g is negative.\n",
|
||||
model->B3SOIPDwth0);
|
||||
}
|
||||
if (model->B3SOIPDrhalo < 0.0)
|
||||
{
|
||||
fprintf (fplog, "Warning: RHALO = %g is negative.\n",
|
||||
model->B3SOIPDrhalo);
|
||||
printf ("Warning: Rhalo = %g is negative.\n",
|
||||
model->B3SOIPDrhalo);
|
||||
}
|
||||
if (model->B3SOIPDntox < 0.0)
|
||||
{
|
||||
fprintf (fplog, "Warning: NTOX = %g is negative.\n",
|
||||
model->B3SOIPDntox);
|
||||
printf ("Warning: Ntox = %g is negative.\n",
|
||||
model->B3SOIPDntox);
|
||||
}
|
||||
if (model->B3SOIPDtoxref < 0.0)
|
||||
{
|
||||
fprintf (fplog, "Warning: TOXREF = %g is negative.\n",
|
||||
model->B3SOIPDtoxref);
|
||||
printf ("Warning: Toxref = %g is negative.\n",
|
||||
model->B3SOIPDtoxref);
|
||||
Fatal_Flag = 1;
|
||||
}
|
||||
if (model->B3SOIPDebg < 0.0)
|
||||
{
|
||||
fprintf (fplog, "Warning: EBG = %g is negative.\n",
|
||||
model->B3SOIPDebg);
|
||||
printf ("Warning: Ebg = %g is negative.\n", model->B3SOIPDebg);
|
||||
}
|
||||
if (model->B3SOIPDnevb < 0.0)
|
||||
{
|
||||
fprintf (fplog, "Warning: NEVB = %g is negative.\n",
|
||||
model->B3SOIPDnevb);
|
||||
printf ("Warning: Nevb = %g is negative.\n",
|
||||
model->B3SOIPDnevb);
|
||||
}
|
||||
if (model->B3SOIPDalphaGB1 < 0.0)
|
||||
{
|
||||
fprintf (fplog, "Warning: ALPHAGB1 = %g is negative.\n",
|
||||
model->B3SOIPDalphaGB1);
|
||||
printf ("Warning: AlphaGB1 = %g is negative.\n",
|
||||
model->B3SOIPDalphaGB1);
|
||||
}
|
||||
if (model->B3SOIPDbetaGB1 < 0.0)
|
||||
{
|
||||
fprintf (fplog, "Warning: BETAGB1 = %g is negative.\n",
|
||||
model->B3SOIPDbetaGB1);
|
||||
printf ("Warning: BetaGB1 = %g is negative.\n",
|
||||
model->B3SOIPDbetaGB1);
|
||||
}
|
||||
if (model->B3SOIPDvgb1 < 0.0)
|
||||
{
|
||||
fprintf (fplog, "Warning: VGB1 = %g is negative.\n",
|
||||
model->B3SOIPDvgb1);
|
||||
printf ("Warning: Vgb1 = %g is negative.\n",
|
||||
model->B3SOIPDvgb1);
|
||||
}
|
||||
if (model->B3SOIPDnecb < 0.0)
|
||||
{
|
||||
fprintf (fplog, "Warning: NECB = %g is negative.\n",
|
||||
model->B3SOIPDnecb);
|
||||
printf ("Warning: Necb = %g is negative.\n",
|
||||
model->B3SOIPDnecb);
|
||||
}
|
||||
if (model->B3SOIPDalphaGB2 < 0.0)
|
||||
{
|
||||
fprintf (fplog, "Warning: ALPHAGB2 = %g is negative.\n",
|
||||
model->B3SOIPDalphaGB2);
|
||||
printf ("Warning: AlphaGB2 = %g is negative.\n",
|
||||
model->B3SOIPDalphaGB2);
|
||||
}
|
||||
if (model->B3SOIPDbetaGB2 < 0.0)
|
||||
{
|
||||
fprintf (fplog, "Warning: BETAGB2 = %g is negative.\n",
|
||||
model->B3SOIPDbetaGB2);
|
||||
printf ("Warning: BetaGB2 = %g is negative.\n",
|
||||
model->B3SOIPDbetaGB2);
|
||||
}
|
||||
if (model->B3SOIPDvgb2 < 0.0)
|
||||
{
|
||||
fprintf (fplog, "Warning: VGB2 = %g is negative.\n",
|
||||
model->B3SOIPDvgb2);
|
||||
printf ("Warning: Vgb2 = %g is negative.\n",
|
||||
model->B3SOIPDvgb2);
|
||||
}
|
||||
if (model->B3SOIPDtoxqm <= 0.0)
|
||||
{
|
||||
fprintf (fplog, "Fatal: Toxqm = %g is not positive.\n",
|
||||
model->B3SOIPDtoxqm);
|
||||
printf ("Fatal: Toxqm = %g is not positive.\n",
|
||||
model->B3SOIPDtoxqm);
|
||||
Fatal_Flag = 1;
|
||||
}
|
||||
if (model->B3SOIPDvoxh < 0.0)
|
||||
{
|
||||
fprintf (fplog, "Warning: Voxh = %g is negative.\n",
|
||||
model->B3SOIPDvoxh);
|
||||
printf ("Warning: Voxh = %g is negative.\n",
|
||||
model->B3SOIPDvoxh);
|
||||
}
|
||||
if (model->B3SOIPDdeltavox <= 0.0)
|
||||
{
|
||||
fprintf (fplog, "Fatal: Deltavox = %g is not positive.\n",
|
||||
model->B3SOIPDdeltavox);
|
||||
printf ("Fatal: Deltavox = %g is not positive.\n",
|
||||
model->B3SOIPDdeltavox);
|
||||
}
|
||||
|
||||
|
||||
/* v2.0 release */
|
||||
if (model->B3SOIPDk1w1 < 0.0)
|
||||
{
|
||||
fprintf (fplog, "Warning: K1W1 = %g is negative.\n",
|
||||
model->B3SOIPDk1w1);
|
||||
printf ("Warning: K1w1 = %g is negative.\n",
|
||||
model->B3SOIPDk1w1);
|
||||
}
|
||||
if (model->B3SOIPDk1w2 < 0.0)
|
||||
{
|
||||
fprintf (fplog, "Warning: K1W2 = %g is negative.\n",
|
||||
model->B3SOIPDk1w2);
|
||||
printf ("Warning: K1w2 = %g is negative.\n",
|
||||
model->B3SOIPDk1w2);
|
||||
}
|
||||
if (model->B3SOIPDketas < 0.0)
|
||||
{
|
||||
fprintf (fplog, "Warning: KETAS = %g is negative.\n",
|
||||
model->B3SOIPDketas);
|
||||
printf ("Warning: Ketas = %g is negative.\n",
|
||||
model->B3SOIPDketas);
|
||||
}
|
||||
if (model->B3SOIPDdwbc < 0.0)
|
||||
{
|
||||
fprintf (fplog, "Warning: DWBC = %g is negative.\n",
|
||||
model->B3SOIPDdwbc);
|
||||
printf ("Warning: Dwbc = %g is negative.\n",
|
||||
model->B3SOIPDdwbc);
|
||||
}
|
||||
if (model->B3SOIPDbeta0 < 0.0)
|
||||
{
|
||||
fprintf (fplog, "Warning: BETA0 = %g is negative.\n",
|
||||
model->B3SOIPDbeta0);
|
||||
printf ("Warning: Beta0 = %g is negative.\n",
|
||||
model->B3SOIPDbeta0);
|
||||
}
|
||||
if (model->B3SOIPDbeta1 < 0.0)
|
||||
{
|
||||
fprintf (fplog, "Warning: BETA1 = %g is negative.\n",
|
||||
model->B3SOIPDbeta1);
|
||||
printf ("Warning: Beta1 = %g is negative.\n",
|
||||
model->B3SOIPDbeta1);
|
||||
}
|
||||
if (model->B3SOIPDbeta2 < 0.0)
|
||||
{
|
||||
fprintf (fplog, "Warning: BETA2 = %g is negative.\n",
|
||||
model->B3SOIPDbeta2);
|
||||
printf ("Warning: Beta2 = %g is negative.\n",
|
||||
model->B3SOIPDbeta2);
|
||||
}
|
||||
if (model->B3SOIPDtii < 0.0)
|
||||
{
|
||||
fprintf (fplog, "Warning: TII = %g is negative.\n",
|
||||
model->B3SOIPDtii);
|
||||
printf ("Warning: Tii = %g is negative.\n", model->B3SOIPDtii);
|
||||
}
|
||||
if (model->B3SOIPDlii < 0.0)
|
||||
{
|
||||
fprintf (fplog, "Warning: LII = %g is negative.\n",
|
||||
model->B3SOIPDlii);
|
||||
printf ("Warning: Lii = %g is negative.\n", model->B3SOIPDlii);
|
||||
}
|
||||
if (model->B3SOIPDsii1 < 0.0)
|
||||
{
|
||||
fprintf (fplog, "Warning: SII1 = %g is negative.\n",
|
||||
model->B3SOIPDsii1);
|
||||
printf ("Warning: Sii1 = %g is negative.\n",
|
||||
model->B3SOIPDsii1);
|
||||
}
|
||||
if (model->B3SOIPDsii2 < 0.0)
|
||||
{
|
||||
fprintf (fplog, "Warning: SII2 = %g is negative.\n",
|
||||
model->B3SOIPDsii2);
|
||||
printf ("Warning: Sii2 = %g is negative.\n",
|
||||
model->B3SOIPDsii1);
|
||||
}
|
||||
if (model->B3SOIPDsiid < 0.0)
|
||||
{
|
||||
fprintf (fplog, "Warning: SIID = %g is negative.\n",
|
||||
model->B3SOIPDsiid);
|
||||
printf ("Warning: Siid = %g is negative.\n",
|
||||
model->B3SOIPDsiid);
|
||||
}
|
||||
if (model->B3SOIPDfbjtii < 0.0)
|
||||
{
|
||||
fprintf (fplog, "Warning: FBJTII = %g is negative.\n",
|
||||
model->B3SOIPDfbjtii);
|
||||
printf ("Warning: fbjtii = %g is negative.\n",
|
||||
model->B3SOIPDfbjtii);
|
||||
}
|
||||
if (model->B3SOIPDvrec0 < 0.0)
|
||||
{
|
||||
fprintf (fplog, "Warning: VREC0 = %g is negative.\n",
|
||||
model->B3SOIPDvrec0);
|
||||
printf ("Warning: Vrec0 = %g is negative.\n",
|
||||
model->B3SOIPDvrec0);
|
||||
}
|
||||
if (model->B3SOIPDvtun0 < 0.0)
|
||||
{
|
||||
fprintf (fplog, "Warning: VTUN0 = %g is negative.\n",
|
||||
model->B3SOIPDvtun0);
|
||||
printf ("Warning: Vtun0 = %g is negative.\n",
|
||||
model->B3SOIPDvtun0);
|
||||
}
|
||||
if (model->B3SOIPDnbjt < 0.0)
|
||||
{
|
||||
fprintf (fplog, "Warning: NBJT = %g is negative.\n",
|
||||
model->B3SOIPDnbjt);
|
||||
printf ("Warning: Nbjt = %g is negative.\n",
|
||||
model->B3SOIPDnbjt);
|
||||
}
|
||||
if (model->B3SOIPDaely < 0.0)
|
||||
{
|
||||
fprintf (fplog, "Warning: AELY = %g is negative.\n",
|
||||
model->B3SOIPDaely);
|
||||
printf ("Warning: Aely = %g is negative.\n",
|
||||
model->B3SOIPDaely);
|
||||
}
|
||||
if (model->B3SOIPDahli < 0.0)
|
||||
{
|
||||
fprintf (fplog, "Warning: AHLI = %g is negative.\n",
|
||||
model->B3SOIPDahli);
|
||||
printf ("Warning: Ahli = %g is negative.\n",
|
||||
model->B3SOIPDahli);
|
||||
}
|
||||
if (model->B3SOIPDrbody < 0.0)
|
||||
{
|
||||
fprintf (fplog, "Warning: RBODY = %g is negative.\n",
|
||||
model->B3SOIPDrbody);
|
||||
printf ("Warning: Rbody = %g is negative.\n",
|
||||
model->B3SOIPDrbody);
|
||||
}
|
||||
if (model->B3SOIPDrbsh < 0.0)
|
||||
{
|
||||
fprintf (fplog, "Warning: RBSH = %g is negative.\n",
|
||||
model->B3SOIPDrbsh);
|
||||
printf ("Warning: Rbsh = %g is negative.\n",
|
||||
model->B3SOIPDrbsh);
|
||||
}
|
||||
if (model->B3SOIPDntrecf < 0.0)
|
||||
{
|
||||
fprintf (fplog, "Warning: NTRECF = %g is negative.\n",
|
||||
model->B3SOIPDntrecf);
|
||||
printf ("Warning: Ntrecf = %g is negative.\n",
|
||||
model->B3SOIPDntrecf);
|
||||
}
|
||||
if (model->B3SOIPDntrecr < 0.0)
|
||||
{
|
||||
fprintf (fplog, "Warning: NTRECR = %g is negative.\n",
|
||||
model->B3SOIPDntrecr);
|
||||
printf ("Warning: Ntrecr = %g is negative.\n",
|
||||
model->B3SOIPDntrecr);
|
||||
}
|
||||
if (model->B3SOIPDndif < 0.0)
|
||||
{
|
||||
fprintf (fplog, "Warning: NDIF = %g is negative.\n",
|
||||
model->B3SOIPDndif);
|
||||
printf ("Warning: Ndif = %g is negative.\n",
|
||||
model->B3SOIPDndif);
|
||||
}
|
||||
if (model->B3SOIPDtcjswg < 0.0)
|
||||
{
|
||||
fprintf (fplog, "Warning: TCJSWG = %g is negative.\n",
|
||||
model->B3SOIPDtcjswg);
|
||||
printf ("Warning: Tcjswg = %g is negative.\n",
|
||||
model->B3SOIPDtcjswg);
|
||||
}
|
||||
if (model->B3SOIPDtpbswg < 0.0)
|
||||
{
|
||||
fprintf (fplog, "Warning: TPBSWG = %g is negative.\n",
|
||||
model->B3SOIPDtpbswg);
|
||||
printf ("Warning: Tpbswg = %g is negative.\n",
|
||||
model->B3SOIPDtpbswg);
|
||||
}
|
||||
if ((model->B3SOIPDacde < 0.4) || (model->B3SOIPDacde > 1.6))
|
||||
{
|
||||
fprintf (fplog, "Warning: ACDE = %g is out of range.\n",
|
||||
model->B3SOIPDacde);
|
||||
printf ("Warning: Acde = %g is out of range.\n",
|
||||
model->B3SOIPDacde);
|
||||
}
|
||||
if ((model->B3SOIPDmoin < 5.0) || (model->B3SOIPDmoin > 25.0))
|
||||
{
|
||||
fprintf (fplog, "Warning: MOIN = %g is out of range.\n",
|
||||
model->B3SOIPDmoin);
|
||||
printf ("Warning: Moin = %g is out of range.\n",
|
||||
model->B3SOIPDmoin);
|
||||
}
|
||||
if (model->B3SOIPDdlbg < 0.0)
|
||||
{
|
||||
fprintf (fplog, "Warning: DLBG = %g is negative.\n",
|
||||
model->B3SOIPDdlbg);
|
||||
printf ("Warning: dlbg = %g is negative.\n",
|
||||
model->B3SOIPDdlbg);
|
||||
}
|
||||
|
||||
|
||||
if (model->B3SOIPDagidl < 0.0)
|
||||
{
|
||||
fprintf (fplog, "Warning: AGIDL = %g is negative.\n",
|
||||
model->B3SOIPDagidl);
|
||||
printf ("Warning: Agidl = %g is negative.\n",
|
||||
model->B3SOIPDagidl);
|
||||
}
|
||||
if (model->B3SOIPDbgidl < 0.0)
|
||||
{
|
||||
fprintf (fplog, "Warning: BGIDL = %g is negative.\n",
|
||||
model->B3SOIPDbgidl);
|
||||
printf ("Warning: Bgidl = %g is negative.\n",
|
||||
model->B3SOIPDbgidl);
|
||||
}
|
||||
if (model->B3SOIPDngidl < 0.0)
|
||||
{
|
||||
fprintf (fplog, "Warning: NGIDL = %g is negative.\n",
|
||||
model->B3SOIPDngidl);
|
||||
printf ("Warning: Ngidl = %g is negative.\n",
|
||||
model->B3SOIPDngidl);
|
||||
}
|
||||
if (model->B3SOIPDesatii < 0.0)
|
||||
{
|
||||
fprintf (fplog,
|
||||
"Warning: Esatii = %g should be within positive.\n",
|
||||
model->B3SOIPDesatii);
|
||||
printf ("Warning: Esatii = %g should be within (0, 1).\n",
|
||||
model->B3SOIPDesatii);
|
||||
}
|
||||
|
||||
|
||||
if (model->B3SOIPDxj > model->B3SOIPDtsi)
|
||||
{
|
||||
fprintf (fplog, "Warning: Xj = %g is thicker than Tsi = %g.\n",
|
||||
model->B3SOIPDxj, model->B3SOIPDtsi);
|
||||
printf ("Warning: Xj = %g is thicker than Tsi = %g.\n",
|
||||
model->B3SOIPDxj, model->B3SOIPDtsi);
|
||||
}
|
||||
|
||||
if (model->B3SOIPDcapMod < 2)
|
||||
{
|
||||
fprintf (fplog,
|
||||
"Warning: capMod < 2 is not supported by BSIM3SOI.\n");
|
||||
printf
|
||||
("Warning: Warning: capMod < 2 is not supported by BSIM3SOI.\n");
|
||||
}
|
||||
|
||||
} /* 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);
|
||||
}
|
||||
|
|
@ -0,0 +1,95 @@
|
|||
/**********
|
||||
Copyright 1990 Regents of the University of California. All rights reserved.
|
||||
Author: 1998 Samuel Fung, Dennis Sinitsky and Stephen Tang
|
||||
File: b3soipdcvtest.c 98/5/01
|
||||
**********/
|
||||
|
||||
|
||||
#include "ngspice.h"
|
||||
#include <stdio.h>
|
||||
#include <math.h>
|
||||
#include "cktdefs.h"
|
||||
#include "b3soipddef.h"
|
||||
#include "trandefs.h"
|
||||
#include "const.h"
|
||||
#include "devdefs.h"
|
||||
#include "sperror.h"
|
||||
#include "suffix.h"
|
||||
|
||||
|
||||
int
|
||||
B3SOIPDconvTest (inModel, ckt)
|
||||
GENmodel *inModel;
|
||||
register CKTcircuit *ckt;
|
||||
{
|
||||
register B3SOIPDmodel *model = (B3SOIPDmodel *) inModel;
|
||||
register B3SOIPDinstance *here;
|
||||
double delvbd, delvbs, delvds, delvgd, delvgs, vbd, vbs, vds;
|
||||
double cbd, cbhat, cbs, cd, cdhat, tol, vgd, vgdo, vgs;
|
||||
|
||||
/* loop through all the B3SOIPD device models */
|
||||
for (; model != NULL; model = model->B3SOIPDnextModel)
|
||||
{ /* loop through all the instances of the model */
|
||||
for (here = model->B3SOIPDinstances; here != NULL;
|
||||
here = here->B3SOIPDnextInstance)
|
||||
{
|
||||
vbs = model->B3SOIPDtype
|
||||
* (*(ckt->CKTrhsOld + here->B3SOIPDbNode)
|
||||
- *(ckt->CKTrhsOld + here->B3SOIPDsNodePrime));
|
||||
vgs = model->B3SOIPDtype
|
||||
* (*(ckt->CKTrhsOld + here->B3SOIPDgNode)
|
||||
- *(ckt->CKTrhsOld + here->B3SOIPDsNodePrime));
|
||||
vds = model->B3SOIPDtype
|
||||
* (*(ckt->CKTrhsOld + here->B3SOIPDdNodePrime)
|
||||
- *(ckt->CKTrhsOld + here->B3SOIPDsNodePrime));
|
||||
vbd = vbs - vds;
|
||||
vgd = vgs - vds;
|
||||
vgdo = *(ckt->CKTstate0 + here->B3SOIPDvgs)
|
||||
- *(ckt->CKTstate0 + here->B3SOIPDvds);
|
||||
delvbs = vbs - *(ckt->CKTstate0 + here->B3SOIPDvbs);
|
||||
delvbd = vbd - *(ckt->CKTstate0 + here->B3SOIPDvbd);
|
||||
delvgs = vgs - *(ckt->CKTstate0 + here->B3SOIPDvgs);
|
||||
delvds = vds - *(ckt->CKTstate0 + here->B3SOIPDvds);
|
||||
delvgd = vgd - vgdo;
|
||||
|
||||
cd = here->B3SOIPDcd;
|
||||
if (here->B3SOIPDmode >= 0)
|
||||
{
|
||||
cdhat = cd - here->B3SOIPDgjdb * delvbd
|
||||
+ here->B3SOIPDgmbs * delvbs + here->B3SOIPDgm * delvgs
|
||||
+ here->B3SOIPDgds * delvds;
|
||||
}
|
||||
else
|
||||
{
|
||||
cdhat = cd - (here->B3SOIPDgjdb - here->B3SOIPDgmbs) * delvbd
|
||||
- here->B3SOIPDgm * delvgd + here->B3SOIPDgds * delvds;
|
||||
}
|
||||
|
||||
/*
|
||||
* check convergence
|
||||
*/
|
||||
if ((here->B3SOIPDoff == 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->B3SOIPDcjs;
|
||||
cbd = here->B3SOIPDcjd;
|
||||
cbhat = cbs + cbd + here->B3SOIPDgjdb * delvbd
|
||||
+ here->B3SOIPDgjsb * 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
|
|
@ -0,0 +1,42 @@
|
|||
/**********
|
||||
Copyright 1990 Regents of the University of California. All rights reserved.
|
||||
Author: 1998 Samuel Fung, Dennis Sinitsky and Stephen Tang
|
||||
File: b3soipddel.c 98/5/01
|
||||
**********/
|
||||
|
||||
|
||||
#include "ngspice.h"
|
||||
#include <stdio.h>
|
||||
#include "b3soipddef.h"
|
||||
#include "sperror.h"
|
||||
#include "gendefs.h"
|
||||
#include "suffix.h"
|
||||
|
||||
|
||||
int
|
||||
B3SOIPDdelete (inModel, name, inInst)
|
||||
GENmodel *inModel;
|
||||
IFuid name;
|
||||
GENinstance **inInst;
|
||||
{
|
||||
B3SOIPDinstance **fast = (B3SOIPDinstance **) inInst;
|
||||
B3SOIPDmodel *model = (B3SOIPDmodel *) inModel;
|
||||
B3SOIPDinstance **prev = NULL;
|
||||
B3SOIPDinstance *here;
|
||||
|
||||
for (; model; model = model->B3SOIPDnextModel)
|
||||
{
|
||||
prev = &(model->B3SOIPDinstances);
|
||||
for (here = *prev; here; here = *prev)
|
||||
{
|
||||
if (here->B3SOIPDname == name || (fast && here == *fast))
|
||||
{
|
||||
*prev = here->B3SOIPDnextInstance;
|
||||
FREE (here);
|
||||
return (OK);
|
||||
}
|
||||
prev = &(here->B3SOIPDnextInstance);
|
||||
}
|
||||
}
|
||||
return (E_NODEV);
|
||||
}
|
||||
|
|
@ -0,0 +1,43 @@
|
|||
/**********
|
||||
Copyright 1990 Regents of the University of California. All rights reserved.
|
||||
Author: 1998 Samuel Fung, Dennis Sinitsky and Stephen Tang
|
||||
File: b3soipddest.c 98/5/01
|
||||
**********/
|
||||
|
||||
|
||||
#include "ngspice.h"
|
||||
#include <stdio.h>
|
||||
#include "b3soipddef.h"
|
||||
#include "suffix.h"
|
||||
|
||||
void
|
||||
B3SOIPDdestroy (inModel)
|
||||
GENmodel **inModel;
|
||||
{
|
||||
B3SOIPDmodel **model = (B3SOIPDmodel **) inModel;
|
||||
B3SOIPDinstance *here;
|
||||
B3SOIPDinstance *prev = NULL;
|
||||
B3SOIPDmodel *mod = *model;
|
||||
B3SOIPDmodel *oldmod = NULL;
|
||||
|
||||
for (; mod; mod = mod->B3SOIPDnextModel)
|
||||
{
|
||||
if (oldmod)
|
||||
FREE (oldmod);
|
||||
oldmod = mod;
|
||||
prev = (B3SOIPDinstance *) NULL;
|
||||
for (here = mod->B3SOIPDinstances; here;
|
||||
here = here->B3SOIPDnextInstance)
|
||||
{
|
||||
if (prev)
|
||||
FREE (prev);
|
||||
prev = here;
|
||||
}
|
||||
if (prev)
|
||||
FREE (prev);
|
||||
}
|
||||
if (oldmod)
|
||||
FREE (oldmod);
|
||||
*model = NULL;
|
||||
return;
|
||||
}
|
||||
|
|
@ -0,0 +1,55 @@
|
|||
/**********
|
||||
Copyright 1990 Regents of the University of California. All rights reserved.
|
||||
Author: 1998 Samuel Fung
|
||||
File: b3soipdext.h
|
||||
**********/
|
||||
|
||||
#ifdef __STDC__
|
||||
extern int B3SOIPDacLoad (GENmodel *, CKTcircuit *);
|
||||
extern int B3SOIPDask (CKTcircuit *, GENinstance *, int, IFvalue *,
|
||||
IFvalue *);
|
||||
extern int B3SOIPDconvTest (GENmodel *, CKTcircuit *);
|
||||
extern int B3SOIPDdelete (GENmodel *, IFuid, GENinstance **);
|
||||
extern void B3SOIPDdestroy (GENmodel **);
|
||||
extern int B3SOIPDgetic (GENmodel *, CKTcircuit *);
|
||||
extern int B3SOIPDload (GENmodel *, CKTcircuit *);
|
||||
extern int B3SOIPDmAsk (CKTcircuit *, GENmodel *, int, IFvalue *);
|
||||
extern int B3SOIPDmDelete (GENmodel **, IFuid, GENmodel *);
|
||||
extern int B3SOIPDmParam (int, IFvalue *, GENmodel *);
|
||||
extern void B3SOIPDmosCap (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 B3SOIPDparam (int, IFvalue *, GENinstance *, IFvalue *);
|
||||
extern int B3SOIPDpzLoad (GENmodel *, CKTcircuit *, SPcomplex *);
|
||||
extern int B3SOIPDsetup (SMPmatrix *, GENmodel *, CKTcircuit *, int *);
|
||||
extern int B3SOIPDtemp (GENmodel *, CKTcircuit *);
|
||||
extern int B3SOIPDtrunc (GENmodel *, CKTcircuit *, double *);
|
||||
extern int B3SOIPDnoise (int, int, GENmodel *, CKTcircuit *, Ndata *,
|
||||
double *);
|
||||
extern int B3SOIPDunsetup (GENmodel *, CKTcircuit *);
|
||||
|
||||
#else /* stdc */
|
||||
extern int B3SOIPDacLoad ();
|
||||
extern int B3SOIPDdelete ();
|
||||
extern void B3SOIPDdestroy ();
|
||||
extern int B3SOIPDgetic ();
|
||||
extern int B3SOIPDload ();
|
||||
extern int B3SOIPDmDelete ();
|
||||
extern int B3SOIPDask ();
|
||||
extern int B3SOIPDmAsk ();
|
||||
extern int B3SOIPDconvTest ();
|
||||
extern int B3SOIPDtemp ();
|
||||
extern int B3SOIPDmParam ();
|
||||
extern void B3SOIPDmosCap ();
|
||||
extern int B3SOIPDparam ();
|
||||
extern int B3SOIPDpzLoad ();
|
||||
extern int B3SOIPDsetup ();
|
||||
extern int B3SOIPDtrunc ();
|
||||
extern int B3SOIPDnoise ();
|
||||
extern int B3SOIPDunsetup ();
|
||||
|
||||
#endif /* stdc */
|
||||
|
|
@ -0,0 +1,57 @@
|
|||
/**********
|
||||
Copyright 1990 Regents of the University of California. All rights reserved.
|
||||
Author: 1998 Samuel Fung, Dennis Sinitsky and Stephen Tang
|
||||
File: b3soipdgetic.c 98/5/01
|
||||
**********/
|
||||
|
||||
|
||||
#include "ngspice.h"
|
||||
#include <stdio.h>
|
||||
#include "cktdefs.h"
|
||||
#include "b3soipddef.h"
|
||||
#include "sperror.h"
|
||||
#include "suffix.h"
|
||||
|
||||
|
||||
int
|
||||
B3SOIPDgetic (inModel, ckt)
|
||||
GENmodel *inModel;
|
||||
CKTcircuit *ckt;
|
||||
{
|
||||
B3SOIPDmodel *model = (B3SOIPDmodel *) inModel;
|
||||
B3SOIPDinstance *here;
|
||||
|
||||
for (; model; model = model->B3SOIPDnextModel)
|
||||
{
|
||||
for (here = model->B3SOIPDinstances; here;
|
||||
here = here->B3SOIPDnextInstance)
|
||||
{
|
||||
if (!here->B3SOIPDicVBSGiven)
|
||||
{
|
||||
here->B3SOIPDicVBS = *(ckt->CKTrhs + here->B3SOIPDbNode)
|
||||
- *(ckt->CKTrhs + here->B3SOIPDsNode);
|
||||
}
|
||||
if (!here->B3SOIPDicVDSGiven)
|
||||
{
|
||||
here->B3SOIPDicVDS = *(ckt->CKTrhs + here->B3SOIPDdNode)
|
||||
- *(ckt->CKTrhs + here->B3SOIPDsNode);
|
||||
}
|
||||
if (!here->B3SOIPDicVGSGiven)
|
||||
{
|
||||
here->B3SOIPDicVGS = *(ckt->CKTrhs + here->B3SOIPDgNode)
|
||||
- *(ckt->CKTrhs + here->B3SOIPDsNode);
|
||||
}
|
||||
if (!here->B3SOIPDicVESGiven)
|
||||
{
|
||||
here->B3SOIPDicVES = *(ckt->CKTrhs + here->B3SOIPDeNode)
|
||||
- *(ckt->CKTrhs + here->B3SOIPDsNode);
|
||||
}
|
||||
if (!here->B3SOIPDicVPSGiven)
|
||||
{
|
||||
here->B3SOIPDicVPS = *(ckt->CKTrhs + here->B3SOIPDpNode)
|
||||
- *(ckt->CKTrhs + here->B3SOIPDsNode);
|
||||
}
|
||||
}
|
||||
}
|
||||
return (OK);
|
||||
}
|
||||
|
|
@ -0,0 +1,62 @@
|
|||
#include <config.h>
|
||||
|
||||
#include <devdefs.h>
|
||||
|
||||
#include "b3soipditf.h"
|
||||
#include "b3soipdext.h"
|
||||
#include "b3soipdinit.h"
|
||||
|
||||
|
||||
SPICEdev B3SOIPDinfo = {
|
||||
{"B3SOIPD",
|
||||
"Berkeley SOI (PD) MOSFET model version 2.0",
|
||||
|
||||
&B3SOIPDnSize,
|
||||
&B3SOIPDnSize,
|
||||
B3SOIPDnames,
|
||||
|
||||
&B3SOIPDpTSize,
|
||||
B3SOIPDpTable,
|
||||
|
||||
&B3SOIPDmPTSize,
|
||||
B3SOIPDmPTable,
|
||||
DEV_DEFAULT}
|
||||
,
|
||||
|
||||
DEVparam:B3SOIPDparam,
|
||||
DEVmodParam:B3SOIPDmParam,
|
||||
DEVload:B3SOIPDload,
|
||||
DEVsetup:B3SOIPDsetup,
|
||||
DEVunsetup:B3SOIPDunsetup,
|
||||
DEVpzSetup:B3SOIPDsetup,
|
||||
DEVtemperature:B3SOIPDtemp,
|
||||
DEVtrunc:B3SOIPDtrunc,
|
||||
DEVfindBranch:NULL,
|
||||
DEVacLoad:B3SOIPDacLoad,
|
||||
DEVaccept:NULL,
|
||||
DEVdestroy:B3SOIPDdestroy,
|
||||
DEVmodDelete:B3SOIPDmDelete,
|
||||
DEVdelete:B3SOIPDdelete,
|
||||
DEVsetic:B3SOIPDgetic,
|
||||
DEVask:B3SOIPDask,
|
||||
DEVmodAsk:B3SOIPDmAsk,
|
||||
DEVpzLoad:B3SOIPDpzLoad,
|
||||
DEVconvTest:B3SOIPDconvTest,
|
||||
DEVsenSetup:NULL,
|
||||
DEVsenLoad:NULL,
|
||||
DEVsenUpdate:NULL,
|
||||
DEVsenAcLoad:NULL,
|
||||
DEVsenPrint:NULL,
|
||||
DEVsenTrunc:NULL,
|
||||
DEVdisto:NULL,
|
||||
DEVnoise:B3SOIPDnoise,
|
||||
|
||||
DEVinstSize:&B3SOIPDiSize,
|
||||
DEVmodSize:&B3SOIPDmSize
|
||||
};
|
||||
|
||||
SPICEdev *
|
||||
get_b3soipd_info (void)
|
||||
{
|
||||
return &B3SOIPDinfo;
|
||||
}
|
||||
|
|
@ -0,0 +1,13 @@
|
|||
#ifndef _B3SOIPDINIT_H
|
||||
#define _B3SOIPDINIT_H
|
||||
|
||||
extern IFparm B3SOIPDpTable[];
|
||||
extern IFparm B3SOIPDmPTable[];
|
||||
extern char *B3SOIPDnames[];
|
||||
extern int B3SOIPDpTSize;
|
||||
extern int B3SOIPDmPTSize;
|
||||
extern int B3SOIPDnSize;
|
||||
extern int B3SOIPDiSize;
|
||||
extern int B3SOIPDmSize;
|
||||
|
||||
#endif
|
||||
|
|
@ -0,0 +1,13 @@
|
|||
/**********
|
||||
Copyright 1990 Regents of the University of California. All rights reserved.
|
||||
Author: 1998 Samuel Fung
|
||||
File: b3soipditf.h
|
||||
**********/
|
||||
#ifndef DEV_B3SOIPD
|
||||
#define DEV_B3SOIPD
|
||||
|
||||
#include "b3soipdext.h"
|
||||
|
||||
SPICEdev *get_b3soipd_info (void);
|
||||
|
||||
#endif
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
|
@ -0,0 +1,49 @@
|
|||
/**********
|
||||
Copyright 1990 Regents of the University of California. All rights reserved.
|
||||
Author: 1998 Samuel Fung, Dennis Sinitsky and Stephen Tang
|
||||
File: b3soipdmdel.c 98/5/01
|
||||
**********/
|
||||
|
||||
|
||||
#include "ngspice.h"
|
||||
#include <stdio.h>
|
||||
#include "b3soipddef.h"
|
||||
#include "sperror.h"
|
||||
#include "suffix.h"
|
||||
|
||||
int
|
||||
B3SOIPDmDelete (inModel, modname, kill)
|
||||
GENmodel **inModel;
|
||||
IFuid modname;
|
||||
GENmodel *kill;
|
||||
{
|
||||
B3SOIPDmodel **model = (B3SOIPDmodel **) inModel;
|
||||
B3SOIPDmodel *modfast = (B3SOIPDmodel *) kill;
|
||||
B3SOIPDinstance *here;
|
||||
B3SOIPDinstance *prev = NULL;
|
||||
B3SOIPDmodel **oldmod;
|
||||
|
||||
oldmod = model;
|
||||
for (; *model; model = &((*model)->B3SOIPDnextModel))
|
||||
{
|
||||
if ((*model)->B3SOIPDmodName == modname ||
|
||||
(modfast && *model == modfast))
|
||||
goto delgot;
|
||||
oldmod = model;
|
||||
}
|
||||
return (E_NOMOD);
|
||||
|
||||
delgot:
|
||||
*oldmod = (*model)->B3SOIPDnextModel; /* cut deleted device out of list */
|
||||
for (here = (*model)->B3SOIPDinstances; here;
|
||||
here = here->B3SOIPDnextInstance)
|
||||
{
|
||||
if (prev)
|
||||
FREE (prev);
|
||||
prev = here;
|
||||
}
|
||||
if (prev)
|
||||
FREE (prev);
|
||||
FREE (*model);
|
||||
return (OK);
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
|
|
@ -0,0 +1,432 @@
|
|||
/**********
|
||||
Copyright 1990 Regents of the University of California. All rights reserved.
|
||||
Author: 1998 Samuel Fung, Dennis Sinitsky and Stephen Tang
|
||||
File: b3soipdnoi.c 98/5/01
|
||||
**********/
|
||||
|
||||
#include "ngspice.h"
|
||||
#include <stdio.h>
|
||||
#include <math.h>
|
||||
#include "b3soipddef.h"
|
||||
#include "cktdefs.h"
|
||||
#include "iferrmsg.h"
|
||||
#include "noisedef.h"
|
||||
#include "suffix.h"
|
||||
#include "const.h" /* jwan */
|
||||
|
||||
/*
|
||||
* B3SOIPDnoise (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->B3SOIPDnoiMod.
|
||||
If model->B3SOIPDnoiMod = 1,
|
||||
Channel thermal noise = SPICE2 model
|
||||
Flicker noise = SPICE2 model
|
||||
If model->B3SOIPDnoiMod = 2,
|
||||
Channel thermal noise = B3SOIPD model
|
||||
Flicker noise = B3SOIPD model
|
||||
If model->B3SOIPDnoiMod = 3,
|
||||
Channel thermal noise = SPICE2 model
|
||||
Flicker noise = B3SOIPD model
|
||||
If model->B3SOIPDnoiMod = 4,
|
||||
Channel thermal noise = B3SOIPD model
|
||||
Flicker noise = SPICE2 model
|
||||
*/
|
||||
|
||||
extern void NevalSrc ();
|
||||
extern double Nintegrate ();
|
||||
|
||||
double
|
||||
B3SOIPDStrongInversionNoiseEval (vgs, vds, model, here, freq, temp)
|
||||
double vgs, vds, freq, temp;
|
||||
B3SOIPDmodel *model;
|
||||
B3SOIPDinstance *here;
|
||||
{
|
||||
struct b3soipdSizeDependParam *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->B3SOIPDcd);
|
||||
if (vds > here->B3SOIPDvdsat)
|
||||
{
|
||||
esat = 2.0 * pParam->B3SOIPDvsattemp / here->B3SOIPDueff;
|
||||
T0 =
|
||||
((((vds
|
||||
- here->B3SOIPDvdsat) / pParam->B3SOIPDlitl) +
|
||||
model->B3SOIPDem) / esat);
|
||||
DelClm = pParam->B3SOIPDlitl * log (MAX (T0, N_MINLOG));
|
||||
}
|
||||
else
|
||||
DelClm = 0.0;
|
||||
EffFreq = pow (freq, model->B3SOIPDef);
|
||||
T1 = CHARGE * CHARGE * 8.62e-5 * cd * temp * here->B3SOIPDueff;
|
||||
T2 = 1.0e8 * EffFreq * model->B3SOIPDcox
|
||||
* pParam->B3SOIPDleff * pParam->B3SOIPDleff;
|
||||
Vgst = vgs - here->B3SOIPDvon;
|
||||
N0 = model->B3SOIPDcox * Vgst / CHARGE;
|
||||
if (N0 < 0.0)
|
||||
N0 = 0.0;
|
||||
Nl = model->B3SOIPDcox * (Vgst - MIN (vds, here->B3SOIPDvdsat)) / CHARGE;
|
||||
if (Nl < 0.0)
|
||||
Nl = 0.0;
|
||||
|
||||
T3 = model->B3SOIPDoxideTrapDensityA
|
||||
* log (MAX (((N0 + 2.0e14) / (Nl + 2.0e14)), N_MINLOG));
|
||||
T4 = model->B3SOIPDoxideTrapDensityB * (N0 - Nl);
|
||||
T5 = model->B3SOIPDoxideTrapDensityC * 0.5 * (N0 * N0 - Nl * Nl);
|
||||
|
||||
T6 = 8.62e-5 * temp * cd * cd;
|
||||
T7 = 1.0e8 * EffFreq * pParam->B3SOIPDleff
|
||||
* pParam->B3SOIPDleff * pParam->B3SOIPDweff;
|
||||
T8 = model->B3SOIPDoxideTrapDensityA + model->B3SOIPDoxideTrapDensityB * Nl
|
||||
+ model->B3SOIPDoxideTrapDensityC * Nl * Nl;
|
||||
T9 = (Nl + 2.0e14) * (Nl + 2.0e14);
|
||||
|
||||
Ssi = T1 / T2 * (T3 + T4 + T5) + T6 / T7 * DelClm * T8 / T9;
|
||||
|
||||
return Ssi;
|
||||
}
|
||||
|
||||
int
|
||||
B3SOIPDnoise (mode, operation, inModel, ckt, data, OnDens)
|
||||
int mode, operation;
|
||||
GENmodel *inModel;
|
||||
CKTcircuit *ckt;
|
||||
register Ndata *data;
|
||||
double *OnDens;
|
||||
{
|
||||
register B3SOIPDmodel *model = (B3SOIPDmodel *) inModel;
|
||||
register B3SOIPDinstance *here;
|
||||
struct b3soipdSizeDependParam *pParam;
|
||||
char name[N_MXVLNTH];
|
||||
double tempOnoise;
|
||||
double tempInoise;
|
||||
double noizDens[B3SOIPDNSRCS];
|
||||
double lnNdens[B3SOIPDNSRCS];
|
||||
|
||||
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 *B3SOIPDnNames[B3SOIPDNSRCS] = { /* Note that we have to keep the order */
|
||||
".rd", /* noise due to rd */
|
||||
/* consistent with the index definitions */
|
||||
".rs", /* noise due to rs */
|
||||
/* in B3SOIPDdefs.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->B3SOIPDnextModel)
|
||||
{
|
||||
for (here = model->B3SOIPDinstances; here != NULL;
|
||||
here = here->B3SOIPDnextInstance)
|
||||
{
|
||||
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 < B3SOIPDNSRCS; i++)
|
||||
{
|
||||
(void) sprintf (name, "onoise.%s%s",
|
||||
here->B3SOIPDname,
|
||||
B3SOIPDnNames[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 < B3SOIPDNSRCS; i++)
|
||||
{
|
||||
(void) sprintf (name, "onoise_total.%s%s",
|
||||
here->B3SOIPDname,
|
||||
B3SOIPDnNames[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->B3SOIPDname,
|
||||
B3SOIPDnNames[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[B3SOIPDRDNOIZ],
|
||||
&lnNdens[B3SOIPDRDNOIZ], ckt, THERMNOISE,
|
||||
here->B3SOIPDdNodePrime, here->B3SOIPDdNode,
|
||||
here->B3SOIPDdrainConductance);
|
||||
|
||||
NevalSrc (&noizDens[B3SOIPDRSNOIZ],
|
||||
&lnNdens[B3SOIPDRSNOIZ], ckt, THERMNOISE,
|
||||
here->B3SOIPDsNodePrime, here->B3SOIPDsNode,
|
||||
here->B3SOIPDsourceConductance);
|
||||
|
||||
switch (model->B3SOIPDnoiMod)
|
||||
{
|
||||
case 1:
|
||||
case 3:
|
||||
NevalSrc (&noizDens[B3SOIPDIDNOIZ],
|
||||
&lnNdens[B3SOIPDIDNOIZ], ckt,
|
||||
THERMNOISE, here->B3SOIPDdNodePrime,
|
||||
here->B3SOIPDsNodePrime,
|
||||
(2.0 / 3.0 * fabs (here->B3SOIPDgm
|
||||
+ here->B3SOIPDgds
|
||||
+ here->B3SOIPDgmbs)));
|
||||
break;
|
||||
case 2:
|
||||
case 4:
|
||||
NevalSrc (&noizDens[B3SOIPDIDNOIZ],
|
||||
&lnNdens[B3SOIPDIDNOIZ], ckt,
|
||||
THERMNOISE, here->B3SOIPDdNodePrime,
|
||||
here->B3SOIPDsNodePrime,
|
||||
(here->B3SOIPDueff
|
||||
* fabs (here->B3SOIPDqinv
|
||||
/ (pParam->B3SOIPDleff
|
||||
* pParam->B3SOIPDleff))));
|
||||
break;
|
||||
}
|
||||
NevalSrc (&noizDens[B3SOIPDFLNOIZ], (double *) NULL,
|
||||
ckt, N_GAIN, here->B3SOIPDdNodePrime,
|
||||
here->B3SOIPDsNodePrime, (double) 0.0);
|
||||
|
||||
switch (model->B3SOIPDnoiMod)
|
||||
{
|
||||
case 1:
|
||||
case 4:
|
||||
noizDens[B3SOIPDFLNOIZ] *= model->B3SOIPDkf
|
||||
* exp (model->B3SOIPDaf
|
||||
* log (MAX (fabs (here->B3SOIPDcd),
|
||||
N_MINLOG)))
|
||||
/ (pow (data->freq, model->B3SOIPDef)
|
||||
* pParam->B3SOIPDleff
|
||||
* pParam->B3SOIPDleff * model->B3SOIPDcox);
|
||||
break;
|
||||
case 2:
|
||||
case 3:
|
||||
vgs = *(ckt->CKTstates[0] + here->B3SOIPDvgs);
|
||||
vds = *(ckt->CKTstates[0] + here->B3SOIPDvds);
|
||||
if (vds < 0.0)
|
||||
{
|
||||
vds = -vds;
|
||||
vgs = vgs + vds;
|
||||
}
|
||||
if (vgs >= here->B3SOIPDvon + 0.1)
|
||||
{
|
||||
Ssi = B3SOIPDStrongInversionNoiseEval (vgs,
|
||||
vds, model,
|
||||
here,
|
||||
data->freq,
|
||||
ckt->
|
||||
CKTtemp);
|
||||
noizDens[B3SOIPDFLNOIZ] *= Ssi;
|
||||
}
|
||||
else
|
||||
{
|
||||
pParam = here->pParam;
|
||||
T10 = model->B3SOIPDoxideTrapDensityA
|
||||
* 8.62e-5 * ckt->CKTtemp;
|
||||
T11 = pParam->B3SOIPDweff
|
||||
* pParam->B3SOIPDleff
|
||||
* pow (data->freq, model->B3SOIPDef) * 4.0e36;
|
||||
Swi = T10 / T11 * here->B3SOIPDcd * here->B3SOIPDcd;
|
||||
Slimit =
|
||||
B3SOIPDStrongInversionNoiseEval (here->
|
||||
B3SOIPDvon + 0.1,
|
||||
vds, model, here,
|
||||
data->freq,
|
||||
ckt->CKTtemp);
|
||||
T1 = Swi + Slimit;
|
||||
if (T1 > 0.0)
|
||||
noizDens[B3SOIPDFLNOIZ] *= (Slimit * Swi) / T1;
|
||||
else
|
||||
noizDens[B3SOIPDFLNOIZ] *= 0.0;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
lnNdens[B3SOIPDFLNOIZ] =
|
||||
log (MAX (noizDens[B3SOIPDFLNOIZ], N_MINLOG));
|
||||
|
||||
/* Low frequency excess noise due to FBE */
|
||||
NevalSrc (&noizDens[B3SOIPDFBNOIZ], &lnNdens[B3SOIPDFBNOIZ],
|
||||
ckt, SHOTNOISE, here->B3SOIPDsNodePrime,
|
||||
here->B3SOIPDbNode,
|
||||
2.0 * model->B3SOIPDnoif * here->B3SOIPDibs);
|
||||
|
||||
noizDens[B3SOIPDTOTNOIZ] = noizDens[B3SOIPDRDNOIZ]
|
||||
+ noizDens[B3SOIPDRSNOIZ]
|
||||
+ noizDens[B3SOIPDIDNOIZ]
|
||||
+ noizDens[B3SOIPDFLNOIZ] + noizDens[B3SOIPDFBNOIZ];
|
||||
lnNdens[B3SOIPDTOTNOIZ] =
|
||||
log (MAX (noizDens[B3SOIPDTOTNOIZ], N_MINLOG));
|
||||
|
||||
*OnDens += noizDens[B3SOIPDTOTNOIZ];
|
||||
|
||||
if (data->delFreq == 0.0)
|
||||
{ /* if we haven't done any previous
|
||||
integration, we need to initialize our
|
||||
"history" variables.
|
||||
*/
|
||||
|
||||
for (i = 0; i < B3SOIPDNSRCS; i++)
|
||||
{
|
||||
here->B3SOIPDnVar[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 < B3SOIPDNSRCS; i++)
|
||||
{
|
||||
here->B3SOIPDnVar[OUTNOIZ][i] = 0.0;
|
||||
here->B3SOIPDnVar[INNOIZ][i] = 0.0;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{ /* data->delFreq != 0.0,
|
||||
we have to integrate.
|
||||
*/
|
||||
for (i = 0; i < B3SOIPDNSRCS; i++)
|
||||
{
|
||||
if (i != B3SOIPDTOTNOIZ)
|
||||
{
|
||||
tempOnoise = Nintegrate (noizDens[i],
|
||||
lnNdens[i],
|
||||
here->
|
||||
B3SOIPDnVar[LNLSTDENS]
|
||||
[i], data);
|
||||
tempInoise =
|
||||
Nintegrate (noizDens[i] * data->GainSqInv,
|
||||
lnNdens[i] + data->lnGainInv,
|
||||
here->B3SOIPDnVar[LNLSTDENS][i] +
|
||||
data->lnGainInv, data);
|
||||
here->B3SOIPDnVar[LNLSTDENS][i] = lnNdens[i];
|
||||
data->outNoiz += tempOnoise;
|
||||
data->inNoise += tempInoise;
|
||||
if (((NOISEAN *) ckt->CKTcurJob)->NStpsSm != 0)
|
||||
{
|
||||
here->B3SOIPDnVar[OUTNOIZ][i] += tempOnoise;
|
||||
here->B3SOIPDnVar[OUTNOIZ][B3SOIPDTOTNOIZ]
|
||||
+= tempOnoise;
|
||||
here->B3SOIPDnVar[INNOIZ][i] += tempInoise;
|
||||
here->B3SOIPDnVar[INNOIZ][B3SOIPDTOTNOIZ]
|
||||
+= tempInoise;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (data->prtSummary)
|
||||
{
|
||||
for (i = 0; i < B3SOIPDNSRCS; 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 < B3SOIPDNSRCS; i++)
|
||||
{
|
||||
data->outpVector[data->outNumber++]
|
||||
= here->B3SOIPDnVar[OUTNOIZ][i];
|
||||
data->outpVector[data->outNumber++]
|
||||
= here->B3SOIPDnVar[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);
|
||||
}
|
||||
|
|
@ -0,0 +1,166 @@
|
|||
/**********
|
||||
Copyright 1990 Regents of the University of California. All rights reserved.
|
||||
Author: 1998 Samuel Fung, Dennis Sinitsky and Stephen Tang
|
||||
File: b3soipdpar.c 98/5/01
|
||||
Modified by Pin Su 99/2/15
|
||||
**********/
|
||||
|
||||
|
||||
#include "ngspice.h"
|
||||
#include <stdio.h>
|
||||
#include "ifsim.h"
|
||||
#include "b3soipddef.h"
|
||||
#include "sperror.h"
|
||||
#include "suffix.h"
|
||||
|
||||
int
|
||||
B3SOIPDparam (param, value, inst, select)
|
||||
int param;
|
||||
IFvalue *value;
|
||||
GENinstance *inst;
|
||||
IFvalue *select;
|
||||
{
|
||||
B3SOIPDinstance *here = (B3SOIPDinstance *) inst;
|
||||
switch (param)
|
||||
{
|
||||
case B3SOIPD_W:
|
||||
here->B3SOIPDw = value->rValue;
|
||||
here->B3SOIPDwGiven = TRUE;
|
||||
break;
|
||||
case B3SOIPD_L:
|
||||
here->B3SOIPDl = value->rValue;
|
||||
here->B3SOIPDlGiven = TRUE;
|
||||
break;
|
||||
case B3SOIPD_AS:
|
||||
here->B3SOIPDsourceArea = value->rValue;
|
||||
here->B3SOIPDsourceAreaGiven = TRUE;
|
||||
break;
|
||||
case B3SOIPD_AD:
|
||||
here->B3SOIPDdrainArea = value->rValue;
|
||||
here->B3SOIPDdrainAreaGiven = TRUE;
|
||||
break;
|
||||
case B3SOIPD_PS:
|
||||
here->B3SOIPDsourcePerimeter = value->rValue;
|
||||
here->B3SOIPDsourcePerimeterGiven = TRUE;
|
||||
break;
|
||||
case B3SOIPD_PD:
|
||||
here->B3SOIPDdrainPerimeter = value->rValue;
|
||||
here->B3SOIPDdrainPerimeterGiven = TRUE;
|
||||
break;
|
||||
case B3SOIPD_NRS:
|
||||
here->B3SOIPDsourceSquares = value->rValue;
|
||||
here->B3SOIPDsourceSquaresGiven = TRUE;
|
||||
break;
|
||||
case B3SOIPD_NRD:
|
||||
here->B3SOIPDdrainSquares = value->rValue;
|
||||
here->B3SOIPDdrainSquaresGiven = TRUE;
|
||||
break;
|
||||
case B3SOIPD_OFF:
|
||||
here->B3SOIPDoff = value->iValue;
|
||||
here->B3SOIPDoffGiven = TRUE;
|
||||
break;
|
||||
case B3SOIPD_IC_VBS:
|
||||
here->B3SOIPDicVBS = value->rValue;
|
||||
here->B3SOIPDicVBSGiven = TRUE;
|
||||
break;
|
||||
case B3SOIPD_IC_VDS:
|
||||
here->B3SOIPDicVDS = value->rValue;
|
||||
here->B3SOIPDicVDSGiven = TRUE;
|
||||
break;
|
||||
case B3SOIPD_IC_VGS:
|
||||
here->B3SOIPDicVGS = value->rValue;
|
||||
here->B3SOIPDicVGSGiven = TRUE;
|
||||
break;
|
||||
case B3SOIPD_IC_VES:
|
||||
here->B3SOIPDicVES = value->rValue;
|
||||
here->B3SOIPDicVESGiven = TRUE;
|
||||
break;
|
||||
case B3SOIPD_IC_VPS:
|
||||
here->B3SOIPDicVPS = value->rValue;
|
||||
here->B3SOIPDicVPSGiven = TRUE;
|
||||
break;
|
||||
case B3SOIPD_BJTOFF:
|
||||
here->B3SOIPDbjtoff = value->iValue;
|
||||
here->B3SOIPDbjtoffGiven = TRUE;
|
||||
break;
|
||||
case B3SOIPD_DEBUG:
|
||||
here->B3SOIPDdebugMod = value->iValue;
|
||||
here->B3SOIPDdebugModGiven = TRUE;
|
||||
break;
|
||||
case B3SOIPD_RTH0:
|
||||
here->B3SOIPDrth0 = value->rValue;
|
||||
here->B3SOIPDrth0Given = TRUE;
|
||||
break;
|
||||
case B3SOIPD_CTH0:
|
||||
here->B3SOIPDcth0 = value->rValue;
|
||||
here->B3SOIPDcth0Given = TRUE;
|
||||
break;
|
||||
case B3SOIPD_NRB:
|
||||
here->B3SOIPDbodySquares = value->rValue;
|
||||
here->B3SOIPDbodySquaresGiven = TRUE;
|
||||
break;
|
||||
|
||||
|
||||
/* v2.0 release */
|
||||
case B3SOIPD_NBC:
|
||||
here->B3SOIPDnbc = value->rValue;
|
||||
here->B3SOIPDnbcGiven = TRUE;
|
||||
break;
|
||||
case B3SOIPD_NSEG:
|
||||
here->B3SOIPDnseg = value->rValue;
|
||||
here->B3SOIPDnsegGiven = TRUE;
|
||||
break;
|
||||
case B3SOIPD_PDBCP:
|
||||
here->B3SOIPDpdbcp = value->rValue;
|
||||
here->B3SOIPDpdbcpGiven = TRUE;
|
||||
break;
|
||||
case B3SOIPD_PSBCP:
|
||||
here->B3SOIPDpsbcp = value->rValue;
|
||||
here->B3SOIPDpsbcpGiven = TRUE;
|
||||
break;
|
||||
case B3SOIPD_AGBCP:
|
||||
here->B3SOIPDagbcp = value->rValue;
|
||||
here->B3SOIPDagbcpGiven = TRUE;
|
||||
break;
|
||||
case B3SOIPD_AEBCP:
|
||||
here->B3SOIPDaebcp = value->rValue;
|
||||
here->B3SOIPDaebcpGiven = TRUE;
|
||||
break;
|
||||
case B3SOIPD_VBSUSR:
|
||||
here->B3SOIPDvbsusr = value->rValue;
|
||||
here->B3SOIPDvbsusrGiven = TRUE;
|
||||
break;
|
||||
case B3SOIPD_TNODEOUT:
|
||||
here->B3SOIPDtnodeout = value->iValue;
|
||||
here->B3SOIPDtnodeoutGiven = TRUE;
|
||||
break;
|
||||
|
||||
|
||||
case B3SOIPD_IC:
|
||||
switch (value->v.numValue)
|
||||
{
|
||||
case 5:
|
||||
here->B3SOIPDicVPS = *(value->v.vec.rVec + 4);
|
||||
here->B3SOIPDicVPSGiven = TRUE;
|
||||
case 4:
|
||||
here->B3SOIPDicVES = *(value->v.vec.rVec + 3);
|
||||
here->B3SOIPDicVESGiven = TRUE;
|
||||
case 3:
|
||||
here->B3SOIPDicVBS = *(value->v.vec.rVec + 2);
|
||||
here->B3SOIPDicVBSGiven = TRUE;
|
||||
case 2:
|
||||
here->B3SOIPDicVGS = *(value->v.vec.rVec + 1);
|
||||
here->B3SOIPDicVGSGiven = TRUE;
|
||||
case 1:
|
||||
here->B3SOIPDicVDS = *(value->v.vec.rVec);
|
||||
here->B3SOIPDicVDSGiven = TRUE;
|
||||
break;
|
||||
default:
|
||||
return (E_BADPARM);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
return (E_BADPARM);
|
||||
}
|
||||
return (OK);
|
||||
}
|
||||
|
|
@ -0,0 +1,153 @@
|
|||
/**********
|
||||
Copyright 1990 Regents of the University of California. All rights reserved.
|
||||
Author: 1998 Samuel Fung, Dennis Sinitsky and Stephen Tang
|
||||
File: b3soipzld.c 98/5/01
|
||||
**********/
|
||||
|
||||
|
||||
#include "ngspice.h"
|
||||
#include <stdio.h>
|
||||
#include "cktdefs.h"
|
||||
#include "complex.h"
|
||||
#include "sperror.h"
|
||||
#include "b3soipddef.h"
|
||||
#include "suffix.h"
|
||||
|
||||
int
|
||||
B3SOIPDpzLoad (inModel, ckt, s)
|
||||
GENmodel *inModel;
|
||||
register CKTcircuit *ckt;
|
||||
register SPcomplex *s;
|
||||
{
|
||||
register B3SOIPDmodel *model = (B3SOIPDmodel *) inModel;
|
||||
register B3SOIPDinstance *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->B3SOIPDnextModel)
|
||||
{
|
||||
for (here = model->B3SOIPDinstances; here != NULL;
|
||||
here = here->B3SOIPDnextInstance)
|
||||
{
|
||||
if (here->B3SOIPDmode >= 0)
|
||||
{
|
||||
Gm = here->B3SOIPDgm;
|
||||
Gmbs = here->B3SOIPDgmbs;
|
||||
FwdSum = Gm + Gmbs;
|
||||
RevSum = 0.0;
|
||||
cggb = here->B3SOIPDcggb;
|
||||
cgsb = here->B3SOIPDcgsb;
|
||||
cgdb = here->B3SOIPDcgdb;
|
||||
|
||||
cbgb = here->B3SOIPDcbgb;
|
||||
cbsb = here->B3SOIPDcbsb;
|
||||
cbdb = here->B3SOIPDcbdb;
|
||||
|
||||
cdgb = here->B3SOIPDcdgb;
|
||||
cdsb = here->B3SOIPDcdsb;
|
||||
cddb = here->B3SOIPDcddb;
|
||||
}
|
||||
else
|
||||
{
|
||||
Gm = -here->B3SOIPDgm;
|
||||
Gmbs = -here->B3SOIPDgmbs;
|
||||
FwdSum = 0.0;
|
||||
RevSum = -Gm - Gmbs;
|
||||
cggb = here->B3SOIPDcggb;
|
||||
cgsb = here->B3SOIPDcgdb;
|
||||
cgdb = here->B3SOIPDcgsb;
|
||||
|
||||
cbgb = here->B3SOIPDcbgb;
|
||||
cbsb = here->B3SOIPDcbdb;
|
||||
cbdb = here->B3SOIPDcbsb;
|
||||
|
||||
cdgb = -(here->B3SOIPDcdgb + cggb + cbgb);
|
||||
cdsb = -(here->B3SOIPDcddb + cgsb + cbsb);
|
||||
cddb = -(here->B3SOIPDcdsb + cgdb + cbdb);
|
||||
}
|
||||
gdpr = here->B3SOIPDdrainConductance;
|
||||
gspr = here->B3SOIPDsourceConductance;
|
||||
gds = here->B3SOIPDgds;
|
||||
gbd = here->B3SOIPDgjdb;
|
||||
gbs = here->B3SOIPDgjsb;
|
||||
#ifdef BULKCODE
|
||||
capbd = here->B3SOIPDcapbd;
|
||||
capbs = here->B3SOIPDcapbs;
|
||||
#endif
|
||||
GSoverlapCap = here->B3SOIPDcgso;
|
||||
GDoverlapCap = here->B3SOIPDcgdo;
|
||||
#ifdef BULKCODE
|
||||
GBoverlapCap = here->pParam->B3SOIPDcgbo;
|
||||
#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->B3SOIPDGgPtr) += xcggb * s->real;
|
||||
*(here->B3SOIPDGgPtr + 1) += xcggb * s->imag;
|
||||
*(here->B3SOIPDBbPtr) += (-xcbgb - xcbdb - xcbsb) * s->real;
|
||||
*(here->B3SOIPDBbPtr + 1) += (-xcbgb - xcbdb - xcbsb) * s->imag;
|
||||
*(here->B3SOIPDDPdpPtr) += xcddb * s->real;
|
||||
*(here->B3SOIPDDPdpPtr + 1) += xcddb * s->imag;
|
||||
*(here->B3SOIPDSPspPtr) += xcssb * s->real;
|
||||
*(here->B3SOIPDSPspPtr + 1) += xcssb * s->imag;
|
||||
*(here->B3SOIPDGbPtr) += (-xcggb - xcgdb - xcgsb) * s->real;
|
||||
*(here->B3SOIPDGbPtr + 1) += (-xcggb - xcgdb - xcgsb) * s->imag;
|
||||
*(here->B3SOIPDGdpPtr) += xcgdb * s->real;
|
||||
*(here->B3SOIPDGdpPtr + 1) += xcgdb * s->imag;
|
||||
*(here->B3SOIPDGspPtr) += xcgsb * s->real;
|
||||
*(here->B3SOIPDGspPtr + 1) += xcgsb * s->imag;
|
||||
*(here->B3SOIPDBgPtr) += xcbgb * s->real;
|
||||
*(here->B3SOIPDBgPtr + 1) += xcbgb * s->imag;
|
||||
*(here->B3SOIPDBdpPtr) += xcbdb * s->real;
|
||||
*(here->B3SOIPDBdpPtr + 1) += xcbdb * s->imag;
|
||||
*(here->B3SOIPDBspPtr) += xcbsb * s->real;
|
||||
*(here->B3SOIPDBspPtr + 1) += xcbsb * s->imag;
|
||||
*(here->B3SOIPDDPgPtr) += xcdgb * s->real;
|
||||
*(here->B3SOIPDDPgPtr + 1) += xcdgb * s->imag;
|
||||
*(here->B3SOIPDDPbPtr) += (-xcdgb - xcddb - xcdsb) * s->real;
|
||||
*(here->B3SOIPDDPbPtr + 1) += (-xcdgb - xcddb - xcdsb) * s->imag;
|
||||
*(here->B3SOIPDDPspPtr) += xcdsb * s->real;
|
||||
*(here->B3SOIPDDPspPtr + 1) += xcdsb * s->imag;
|
||||
*(here->B3SOIPDSPgPtr) += xcsgb * s->real;
|
||||
*(here->B3SOIPDSPgPtr + 1) += xcsgb * s->imag;
|
||||
*(here->B3SOIPDSPbPtr) += (-xcsgb - xcsdb - xcssb) * s->real;
|
||||
*(here->B3SOIPDSPbPtr + 1) += (-xcsgb - xcsdb - xcssb) * s->imag;
|
||||
*(here->B3SOIPDSPdpPtr) += xcsdb * s->real;
|
||||
*(here->B3SOIPDSPdpPtr + 1) += xcsdb * s->imag;
|
||||
*(here->B3SOIPDDdPtr) += gdpr;
|
||||
*(here->B3SOIPDSsPtr) += gspr;
|
||||
*(here->B3SOIPDBbPtr) += gbd + gbs;
|
||||
*(here->B3SOIPDDPdpPtr) += gdpr + gds + gbd + RevSum;
|
||||
*(here->B3SOIPDSPspPtr) += gspr + gds + gbs + FwdSum;
|
||||
*(here->B3SOIPDDdpPtr) -= gdpr;
|
||||
*(here->B3SOIPDSspPtr) -= gspr;
|
||||
*(here->B3SOIPDBdpPtr) -= gbd;
|
||||
*(here->B3SOIPDBspPtr) -= gbs;
|
||||
*(here->B3SOIPDDPdPtr) -= gdpr;
|
||||
*(here->B3SOIPDDPgPtr) += Gm;
|
||||
*(here->B3SOIPDDPbPtr) -= gbd - Gmbs;
|
||||
*(here->B3SOIPDDPspPtr) -= gds + FwdSum;
|
||||
*(here->B3SOIPDSPgPtr) -= Gm;
|
||||
*(here->B3SOIPDSPsPtr) -= gspr;
|
||||
*(here->B3SOIPDSPbPtr) -= gbs + Gmbs;
|
||||
*(here->B3SOIPDSPdpPtr) -= gds + RevSum;
|
||||
|
||||
}
|
||||
}
|
||||
return (OK);
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
|
@ -0,0 +1,51 @@
|
|||
/**********
|
||||
Copyright 1990 Regents of the University of California. All rights reserved.
|
||||
Author: 1998 Samuel Fung, Dennis Sinitsky and Stephen Tang
|
||||
File: b3soipdtrunc.c 98/5/01
|
||||
**********/
|
||||
|
||||
|
||||
#include "ngspice.h"
|
||||
#include <stdio.h>
|
||||
#include <math.h>
|
||||
#include "cktdefs.h"
|
||||
#include "b3soipddef.h"
|
||||
#include "sperror.h"
|
||||
#include "suffix.h"
|
||||
|
||||
|
||||
int
|
||||
B3SOIPDtrunc (inModel, ckt, timeStep)
|
||||
GENmodel *inModel;
|
||||
register CKTcircuit *ckt;
|
||||
double *timeStep;
|
||||
{
|
||||
register B3SOIPDmodel *model = (B3SOIPDmodel *) inModel;
|
||||
register B3SOIPDinstance *here;
|
||||
|
||||
#ifdef STEPDEBUG
|
||||
double debugtemp;
|
||||
#endif /* STEPDEBUG */
|
||||
|
||||
for (; model != NULL; model = model->B3SOIPDnextModel)
|
||||
{
|
||||
for (here = model->B3SOIPDinstances; here != NULL;
|
||||
here = here->B3SOIPDnextInstance)
|
||||
{
|
||||
#ifdef STEPDEBUG
|
||||
debugtemp = *timeStep;
|
||||
#endif /* STEPDEBUG */
|
||||
CKTterr (here->B3SOIPDqb, ckt, timeStep);
|
||||
CKTterr (here->B3SOIPDqg, ckt, timeStep);
|
||||
CKTterr (here->B3SOIPDqd, ckt, timeStep);
|
||||
#ifdef STEPDEBUG
|
||||
if (debugtemp != *timeStep)
|
||||
{
|
||||
printf ("device %s reduces step from %g to %g\n",
|
||||
here->B3SOIPDname, debugtemp, *timeStep);
|
||||
}
|
||||
#endif /* STEPDEBUG */
|
||||
}
|
||||
}
|
||||
return (OK);
|
||||
}
|
||||
|
|
@ -45,6 +45,12 @@ CKTbindNode(void *ckt, void *fast, int term, void *node)
|
|||
case 5:
|
||||
instance->GENnode5 = mappednode;
|
||||
break;
|
||||
case 6:/* added to consider the body node 01/06/99 */
|
||||
instance->GENnode6 = mappednode;
|
||||
break;
|
||||
case 7:/* added to consider the temp node 02/03/99 */
|
||||
instance->GENnode7 = mappednode;
|
||||
break;
|
||||
}
|
||||
return OK;
|
||||
} else {
|
||||
|
|
|
|||
|
|
@ -35,7 +35,7 @@
|
|||
|
||||
#include "dev.h"
|
||||
|
||||
#define DEVICES_USED "asrc bjt bsim1 bsim2 bsim3 bsim3v2 bsim3v1 cap cccs ccvs csw dio ind isrc jfet ltra mes mos1 mos2 mos3 mos6 res sw tra urc vccs vcvs vsrc"
|
||||
#define DEVICES_USED "asrc bjt bsim1 bsim2 bsim3 bsim3v2 bsim3v1 bsim4 bsim3soipd cap cccs ccvs csw dio ind isrc jfet ltra mes mos1 mos2 mos3 mos6 res sw tra urc vccs vcvs vsrc"
|
||||
|
||||
/*
|
||||
* Analyses
|
||||
|
|
@ -61,6 +61,7 @@
|
|||
#include "bsim3v1/bsim3v1itf.h"
|
||||
#include "bsim3v2/bsim3v2itf.h"
|
||||
#include "bsim4/bsim4itf.h"
|
||||
#include "bsim3soi_pd/b3soipditf.h"
|
||||
#include "cap/capitf.h"
|
||||
#include "cccs/cccsitf.h"
|
||||
#include "ccvs/ccvsitf.h"
|
||||
|
|
@ -85,7 +86,7 @@
|
|||
#include "vsrc/vsrcitf.h"
|
||||
|
||||
|
||||
#define DEVNUM 31
|
||||
#define DEVNUM 32
|
||||
|
||||
SPICEdev *DEVices[DEVNUM];
|
||||
|
||||
|
|
@ -103,29 +104,30 @@ spice_init_devices(void)
|
|||
DEVices[ 6] = get_bsim3v1_info();
|
||||
DEVices[ 7] = get_bsim3v2_info();
|
||||
DEVices[ 8] = get_bsim4_info();
|
||||
DEVices[ 9] = get_cap_info();
|
||||
DEVices[10] = get_cccs_info();
|
||||
DEVices[11] = get_ccvs_info();
|
||||
DEVices[12] = get_csw_info();
|
||||
DEVices[13] = get_dio_info();
|
||||
DEVices[14] = get_ind_info();
|
||||
DEVices[15] = get_mut_info();
|
||||
DEVices[16] = get_isrc_info();
|
||||
DEVices[17] = get_jfet_info();
|
||||
DEVices[18] = get_jfet2_info();
|
||||
DEVices[19] = get_ltra_info();
|
||||
DEVices[20] = get_mes_info();
|
||||
DEVices[21] = get_mos1_info();
|
||||
DEVices[22] = get_mos2_info();
|
||||
DEVices[23] = get_mos3_info();
|
||||
DEVices[24] = get_mos6_info();
|
||||
DEVices[25] = get_res_info();
|
||||
DEVices[26] = get_sw_info();
|
||||
DEVices[27] = get_tra_info();
|
||||
DEVices[28] = get_vccs_info();
|
||||
DEVices[29] = get_vcvs_info();
|
||||
DEVices[30] = get_vsrc_info();
|
||||
assert(31 == DEVNUM);
|
||||
DEVices[ 9] = get_b3soipd_info();
|
||||
DEVices[10] = get_cap_info();
|
||||
DEVices[11] = get_cccs_info();
|
||||
DEVices[12] = get_ccvs_info();
|
||||
DEVices[13] = get_csw_info();
|
||||
DEVices[14] = get_dio_info();
|
||||
DEVices[15] = get_ind_info();
|
||||
DEVices[16] = get_mut_info();
|
||||
DEVices[17] = get_isrc_info();
|
||||
DEVices[18] = get_jfet_info();
|
||||
DEVices[19] = get_jfet2_info();
|
||||
DEVices[20] = get_ltra_info();
|
||||
DEVices[21] = get_mes_info();
|
||||
DEVices[22] = get_mos1_info();
|
||||
DEVices[23] = get_mos2_info();
|
||||
DEVices[24] = get_mos3_info();
|
||||
DEVices[25] = get_mos6_info();
|
||||
DEVices[26] = get_res_info();
|
||||
DEVices[27] = get_sw_info();
|
||||
DEVices[28] = get_tra_info();
|
||||
DEVices[29] = get_vccs_info();
|
||||
DEVices[30] = get_vcvs_info();
|
||||
DEVices[31] = get_vsrc_info();
|
||||
assert(32 == DEVNUM);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -11,90 +11,208 @@ Author: 1988 Thomas L. Quarles
|
|||
#include "fteext.h"
|
||||
#include "inp.h"
|
||||
|
||||
void INP2M(void *ckt, INPtables * tab, card * current)
|
||||
void
|
||||
INP2M (void *ckt, INPtables * tab, card * current)
|
||||
{
|
||||
|
||||
/* Mname <node> <node> <node> <node> <model> [L=<val>]
|
||||
* [W=<val>] [AD=<val>] [AS=<val>] [PD=<val>]
|
||||
* [PS=<val>] [NRD=<val>] [NRS=<val>] [OFF]
|
||||
* [IC=<val>,<val>,<val>]
|
||||
*/
|
||||
/* Mname <node> <node> <node> <node> <model> [L=<val>]
|
||||
* [W=<val>] [AD=<val>] [AS=<val>] [PD=<val>]
|
||||
* [PS=<val>] [NRD=<val>] [NRS=<val>] [OFF]
|
||||
* [IC=<val>,<val>,<val>]
|
||||
*/
|
||||
|
||||
int type; /* the type the model says it is */
|
||||
char *line; /* the part of the current line left to parse */
|
||||
char *name; /* the resistor's name */
|
||||
char *nname1; /* the first node's name */
|
||||
char *nname2; /* the second node's name */
|
||||
char *nname3; /* the third node's name */
|
||||
char *nname4; /* the fourth node's name */
|
||||
void *node1; /* the first node's node pointer */
|
||||
void *node2; /* the second node's node pointer */
|
||||
void *node3; /* the third node's node pointer */
|
||||
void *node4; /* the fourth node's node pointer */
|
||||
int error; /* error code temporary */
|
||||
void *fast; /* pointer to the actual instance */
|
||||
int waslead; /* flag to indicate that funny unlabeled number was found */
|
||||
double leadval; /* actual value of unlabeled number */
|
||||
char *model; /* the name of the model */
|
||||
INPmodel *thismodel; /* pointer to model description for user's model */
|
||||
void *mdfast; /* pointer to the actual model */
|
||||
IFuid uid; /* uid for default model */
|
||||
int type; /* the type the model says it is */
|
||||
char *line; /* the part of the current line left to parse */
|
||||
char *name; /* the resistor's name */
|
||||
char *nname1; /* the first node's name */
|
||||
char *nname2; /* the second node's name */
|
||||
char *nname3; /* the third node's name */
|
||||
char *nname4; /* the fourth node's name */
|
||||
char *nname5; /* the fifth node's name */
|
||||
char *nname6; /* the sixt node's name */
|
||||
char *nname7; /* the seventh node's name */
|
||||
void *node1; /* the first node's node pointer */
|
||||
void *node2; /* the second node's node pointer */
|
||||
void *node3; /* the third node's node pointer */
|
||||
void *node4; /* the fourth node's node pointer */
|
||||
void *node5; /* the fifth node's node pointer */
|
||||
void *node6; /* the sixth node's node pointer */
|
||||
void *node7; /* the seventh node's node pointer */
|
||||
int error; /* error code temporary */
|
||||
int nodeflag; /* flag indicating 4 or 5 (or 6 or 7) nodes */
|
||||
void *fast; /* pointer to the actual instance */
|
||||
int waslead; /* flag to indicate that funny unlabeled number was found */
|
||||
double leadval; /* actual value of unlabeled number */
|
||||
char *model; /* the name of the model */
|
||||
INPmodel *thismodel; /* pointer to model description for user's model */
|
||||
void *mdfast; /* pointer to the actual model */
|
||||
IFuid uid; /* uid for default model */
|
||||
|
||||
line = current->line;
|
||||
INPgetTok(&line, &name, 1);
|
||||
INPinsert(&name, tab);
|
||||
INPgetTok(&line, &nname1, 1);
|
||||
INPtermInsert(ckt, &nname1, tab, &node1);
|
||||
INPgetTok(&line, &nname2, 1);
|
||||
INPtermInsert(ckt, &nname2, tab, &node2);
|
||||
INPgetTok(&line, &nname3, 1);
|
||||
INPtermInsert(ckt, &nname3, tab, &node3);
|
||||
INPgetTok(&line, &nname4, 1);
|
||||
INPtermInsert(ckt, &nname4, tab, &node4);
|
||||
INPgetTok(&line, &model, 1);
|
||||
INPinsert(&model, tab);
|
||||
thismodel = (INPmodel *) NULL;
|
||||
current->error = INPgetMod(ckt, model, &thismodel, tab);
|
||||
if (thismodel != NULL) {
|
||||
if (thismodel->INPmodType != INPtypelook("Mos1")
|
||||
&& thismodel->INPmodType != INPtypelook("Mos2")
|
||||
&& thismodel->INPmodType != INPtypelook("Mos3")
|
||||
&& thismodel->INPmodType != INPtypelook("Mos5")
|
||||
&& thismodel->INPmodType != INPtypelook("Mos6")
|
||||
&& thismodel->INPmodType != INPtypelook("Mos8")
|
||||
&& thismodel->INPmodType != INPtypelook("BSIM1")
|
||||
&& thismodel->INPmodType != INPtypelook("BSIM2")
|
||||
&& thismodel->INPmodType != INPtypelook("BSIM3")
|
||||
&& thismodel->INPmodType != INPtypelook("BSIM4")
|
||||
&& thismodel->INPmodType != INPtypelook("BSIM3V1")
|
||||
&& thismodel->INPmodType != INPtypelook("BSIM3V2")
|
||||
) {
|
||||
LITERR("incorrect model type");
|
||||
return;
|
||||
nodeflag = 0; /* initially specify a 4 terminal device */
|
||||
line = current->line;
|
||||
INPgetTok (&line, &name, 1);
|
||||
INPinsert (&name, tab);
|
||||
INPgetTok (&line, &nname1, 1);
|
||||
INPtermInsert (ckt, &nname1, tab, &node1);
|
||||
INPgetTok (&line, &nname2, 1);
|
||||
INPtermInsert (ckt, &nname2, tab, &node2);
|
||||
INPgetTok (&line, &nname3, 1);
|
||||
INPtermInsert (ckt, &nname3, tab, &node3);
|
||||
INPgetTok (&line, &nname4, 1);
|
||||
INPtermInsert (ckt, &nname4, tab, &node4);
|
||||
|
||||
/* See if 5th token after device specification is a model name */
|
||||
|
||||
INPgetTok (&line, &nname5, 1); /* get 5th token */
|
||||
thismodel = (INPmodel *) NULL;
|
||||
INPgetMod (ckt, nname5, &thismodel, tab);
|
||||
printf("Model=%x",thismodel);
|
||||
if (thismodel == NULL)
|
||||
{ /* 5th token is not a model in the table */
|
||||
nodeflag = 1; /* now specify a 5 node device */
|
||||
INPgetTok (&line, &nname6, 1); /* get next token */
|
||||
thismodel = (INPmodel *) NULL;
|
||||
INPgetMod (ckt, nname6, &thismodel, tab);
|
||||
if (thismodel == NULL)
|
||||
{ /* 6th token is not a model in the table */
|
||||
nodeflag = 2; /* now specify a 6 node device */
|
||||
INPgetTok (&line, &nname7, 1); /* get next token */
|
||||
thismodel = (INPmodel *) NULL;
|
||||
INPgetMod (ckt, nname7, &thismodel, tab);
|
||||
if (thismodel == NULL)
|
||||
{ /* 7th token is not a model in the table */
|
||||
nodeflag = 3; /* now specify a 7 node device */
|
||||
INPgetTok (&line, &model, 1); /* get model name */
|
||||
INPgetMod (ckt, model, &thismodel, tab); /* get pointer to the model */
|
||||
if (thismodel != NULL)
|
||||
{
|
||||
if (thismodel->INPmodType != INPtypelook ("B3SOIPD"))
|
||||
{
|
||||
/* if model is not variable node B3SOIPD model, error! */
|
||||
LITERR ("only level 9 B3SOIPD can have 7 nodes") return;
|
||||
}
|
||||
else
|
||||
{ /* if looking at B3SOIPD model, allocate the 7th node */
|
||||
INPtermInsert (ckt, &nname5, tab, &node5);
|
||||
INPtermInsert (ckt, &nname6, tab, &node6);
|
||||
INPtermInsert (ckt, &nname7, tab, &node7);
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{ /* 7th token is a model - only have 6 terminal device */
|
||||
if (thismodel->INPmodType != INPtypelook ("B3SOIPD"))
|
||||
{
|
||||
/* if model is not variable node B3SOIPD model, error! */
|
||||
LITERR ("only level 9 B3SOIPD can have 6 nodes") return;
|
||||
}
|
||||
else
|
||||
{ /* if looking at B3SOIPD model, allocate the 6th node */
|
||||
INPtermInsert (ckt, &nname5, tab, &node5);
|
||||
INPtermInsert (ckt, &nname6, tab, &node6);
|
||||
model = nname7;
|
||||
}
|
||||
}
|
||||
}
|
||||
type = thismodel->INPmodType;
|
||||
mdfast = (thismodel->INPmodfast);
|
||||
} else {
|
||||
type = INPtypelook("Mos1");
|
||||
if (type < 0) {
|
||||
LITERR("Device type MOS1 not supported by this binary\n");
|
||||
return;
|
||||
else
|
||||
{ /* 6th token is a model - only have 5 terminal device */
|
||||
if (thismodel->INPmodType != INPtypelook ("B3SOIPD"))
|
||||
{
|
||||
/* if model is not variable node B3SOIPD model, error! */
|
||||
LITERR ("only level 9 B3SOIPD can have 5 nodes") return;
|
||||
}
|
||||
else
|
||||
{ /* if looking at B3SOIPD model, allocate the 5th node */
|
||||
INPtermInsert (ckt, &nname5, tab, &node5);
|
||||
model = nname6; /* make model point to the correct token */
|
||||
}
|
||||
}
|
||||
if (!tab->defMmod) {
|
||||
/* create default M model */
|
||||
IFnewUid(ckt, &uid, (IFuid) NULL, "M", UID_MODEL,
|
||||
(void **) NULL);
|
||||
IFC(newModel, (ckt, type, &(tab->defMmod), uid));
|
||||
}
|
||||
mdfast = tab->defMmod;
|
||||
}
|
||||
IFC(newInstance, (ckt, mdfast, &fast, name));
|
||||
IFC(bindNode, (ckt, fast, 1, node1));
|
||||
IFC(bindNode, (ckt, fast, 2, node2));
|
||||
IFC(bindNode, (ckt, fast, 3, node3));
|
||||
IFC(bindNode, (ckt, fast, 4, node4));
|
||||
PARSECALL((&line, ckt, type, fast, &leadval, &waslead, tab));
|
||||
if (waslead) {
|
||||
LITERR(" error: no unlabeled parameter permitted on mosfet\n");
|
||||
|
||||
else
|
||||
{ /* 5th token is a model - only have 4 terminal device */
|
||||
model = nname5; /* make model point to the correct token */
|
||||
}
|
||||
|
||||
|
||||
|
||||
INPinsert (&model, tab);
|
||||
thismodel = (INPmodel *) NULL;
|
||||
current->error = INPgetMod (ckt, model, &thismodel, tab);
|
||||
if (thismodel != NULL)
|
||||
{
|
||||
if (thismodel->INPmodType != INPtypelook ("Mos1")
|
||||
&& thismodel->INPmodType != INPtypelook ("Mos2")
|
||||
&& thismodel->INPmodType != INPtypelook ("Mos3")
|
||||
&& thismodel->INPmodType != INPtypelook ("Mos5")
|
||||
&& thismodel->INPmodType != INPtypelook ("Mos6")
|
||||
&& thismodel->INPmodType != INPtypelook ("Mos8")
|
||||
&& thismodel->INPmodType != INPtypelook ("BSIM1")
|
||||
&& thismodel->INPmodType != INPtypelook ("BSIM2")
|
||||
&& thismodel->INPmodType != INPtypelook ("BSIM3")
|
||||
&& thismodel->INPmodType != INPtypelook ("B3SOIPD")
|
||||
&& thismodel->INPmodType != INPtypelook ("BSIM4")
|
||||
&& thismodel->INPmodType != INPtypelook ("BSIM3V1")
|
||||
&& thismodel->INPmodType != INPtypelook ("BSIM3V2"))
|
||||
{
|
||||
LITERR ("incorrect model type");
|
||||
return;
|
||||
}
|
||||
type = thismodel->INPmodType;
|
||||
mdfast = (thismodel->INPmodfast);
|
||||
}
|
||||
else
|
||||
{
|
||||
type = INPtypelook ("Mos1");
|
||||
if (type < 0)
|
||||
{
|
||||
LITERR ("Device type MOS1 not supported by this binary\n");
|
||||
return;
|
||||
}
|
||||
if (!tab->defMmod)
|
||||
{
|
||||
/* create default M model */
|
||||
IFnewUid (ckt, &uid, (IFuid) NULL, "M", UID_MODEL, (void **) NULL);
|
||||
IFC (newModel, (ckt, type, &(tab->defMmod), uid));
|
||||
}
|
||||
mdfast = tab->defMmod;
|
||||
}
|
||||
IFC (newInstance, (ckt, mdfast, &fast, name));
|
||||
IFC (bindNode, (ckt, fast, 1, node1));
|
||||
IFC (bindNode, (ckt, fast, 2, node2));
|
||||
IFC (bindNode, (ckt, fast, 3, node3));
|
||||
IFC (bindNode, (ckt, fast, 4, node4));
|
||||
if (thismodel->INPmodType == INPtypelook ("B3SOIPD"))
|
||||
{
|
||||
switch (nodeflag)
|
||||
{
|
||||
case 0:
|
||||
((GENinstance *) fast)->GENnode5 = -1;
|
||||
((GENinstance *) fast)->GENnode6 = -1;
|
||||
((GENinstance *) fast)->GENnode7 = -1;
|
||||
break;
|
||||
case 1:
|
||||
IFC (bindNode, (ckt, fast, 5, node5))
|
||||
((GENinstance *) fast)->GENnode6 = -1;
|
||||
((GENinstance *) fast)->GENnode7 = -1;
|
||||
break;
|
||||
case 2:
|
||||
IFC (bindNode, (ckt, fast, 5, node5))
|
||||
IFC (bindNode, (ckt, fast, 6, node6))
|
||||
((GENinstance *) fast)->GENnode7 = -1;
|
||||
break;
|
||||
case 3:
|
||||
IFC (bindNode, (ckt, fast, 5, node5))
|
||||
IFC (bindNode, (ckt, fast, 6, node6))
|
||||
IFC (bindNode, (ckt, fast, 7, node7)) break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
PARSECALL ((&line, ckt, type, fast, &leadval, &waslead, tab));
|
||||
if (waslead)
|
||||
{
|
||||
LITERR (" error: no unlabeled parameter permitted on mosfet\n");
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -156,11 +156,11 @@ char *INPdomodel(void *ckt, card * image, INPtables * tab)
|
|||
}
|
||||
break;
|
||||
case 9:
|
||||
type = INPtypelook("BSIMsoi");
|
||||
type = INPtypelook("B3SOIPD");
|
||||
if (type < 0) {
|
||||
err =
|
||||
INPmkTemp
|
||||
("Device type BSIMsoi not available in this binary\n");
|
||||
("Device type B3SOIPD not available in this binary\n");
|
||||
}
|
||||
break;
|
||||
case 14:
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
@ -0,0 +1,40 @@
|
|||
*Model Card for BSIMPD2.0
|
||||
* Lmin= .2 Lmax= .8 Wmin= 2.8 Wmax= 2.8
|
||||
.Model N1 NMOS Level= 9
|
||||
+TNOM = 27 TOX = 4.5E-09 TSI = .0000001 TBOX = 8E-08
|
||||
+MOBMOD = 0 CAPMOD = 2 SHMOD =0
|
||||
+PARAMCHK=0 WINT = 0 LINT = -2E-08
|
||||
+VTH0 = .42 K1 = .49 K2 = .1 K3 = 0
|
||||
+K3B = 2.2 NLX = 2E-7
|
||||
+DVT0 = 10 DVT1 = .55 DVT2 = -1.4
|
||||
+DVT0W = 0 DVT1W = 0 DVT2W = 0
|
||||
+NCH = 4.7E+17 NSUB = -1E+15 NGATE = 1E+20
|
||||
+AGIDL=1e-15 BGIDL=1e9 NGIDL=1.1
|
||||
+NDIODE = 1.13 NTUN = 14.0 NRECF0=2.5 NRECR0=4
|
||||
+VREC0=1.2 NTRECF=.1 NTRECR=.2
|
||||
+ISBJT = 1e-4 ISDIF = 1e-5 ISTUN = 2e-5 ISREC = 4e-2
|
||||
+XBJT = .9 XDIF = .9 XREC = .9 XTUN = 0.01
|
||||
+AHLI=1e-9 LBJT0=0.2e-6 LN=2e-6
|
||||
+NBJT=.8 NDIF=-1 AELY=1e8 VABJT=0
|
||||
+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 = 0 PRWG = 0 PRWB = -.2 WR = 1
|
||||
+RBODY = 1e0 RBSH = 0.0
|
||||
+A0 = 1.4 KETA = 0.1 KETAS = 0.2 VSAT = 135000
|
||||
+DWG = 0 DWB = 0
|
||||
+ALPHA0 = 1e-8 BETA0 = 0 BETA1 = 0.05 BETA2 = 0.07
|
||||
+VDSATII0 = .8 ESATII = 1e7
|
||||
+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 = .05 ETAB = 0
|
||||
+DSUB = .2 RTH0 = .005
|
||||
+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 = 1e-12 TT=3e-10
|
||||
+ASD = 0.3 CSDESW = 1e-12
|
||||
+TCJSWG=1e-4 MJSWG=.5 PBSWG=1
|
||||
|
|
@ -0,0 +1,40 @@
|
|||
*Model Card for BSIMPD2.0
|
||||
* Lmin= .2 Lmax= .8 Wmin= 2.8 Wmax= 2.8
|
||||
.Model P1 PMOS Level= 9
|
||||
+TNOM = 27 TOX = 4.5E-09 TSI = .0000001 TBOX = 8E-08
|
||||
+MOBMOD = 2 CAPMOD = 2 SHMOD = 0
|
||||
+WINT = 0 LINT = -2E-08
|
||||
+VTH0 = -.42 K1 = .49 K2 = .1 K3 = 0
|
||||
+K3B = 2.2 NLX = 2E-07
|
||||
+DVT0 = 10 DVT1 = .55 DVT2 = -1.4
|
||||
+DVT0W = 0 DVT1W = 0 DVT2W = 0
|
||||
+NCH = 4.7E+17 NSUB = -1E+15 NGATE = 1E+20
|
||||
+AGIDL=1e-16 BGIDL=1e9 NGIDL=1.1
|
||||
+NDIODE = 1.13 NTUN = 14.0 NRECF0=2.5 NRECR0=4
|
||||
+VREC0=1.2 NTRECF=.1 NTRECR=.2
|
||||
+ISBJT = 1e-4 ISDIF = 1e-5 ISTUN = 2e-5 ISREC = 4e-2
|
||||
+XBJT = .9 XDIF = .9 XREC = .9 XTUN = 0.01
|
||||
+AHLI=1e-9 LBJT0=0.2e-6 LN=2e-6
|
||||
+NBJT=.8 NDIF=-1 AELY=1e8 VABJT=0
|
||||
+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 = 350 PRWG = 0 PRWB = -.2 WR = 1
|
||||
+RBODY = 1e0 RBSH = 0.0
|
||||
+A0 = 1.4 KETA = 0.1 KETAS = 0.2 VSAT = 75000
|
||||
+DWG = 0 DWB = 0
|
||||
+ALPHA0 = 1e-8 BETA0 = 0 BETA1 = 0.05 BETA2 = 0.07
|
||||
+VDSATII0 = 1.6 ESATII = 1e7
|
||||
+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 = .05 ETAB = 0
|
||||
+DSUB = .2 RTH0 = .005
|
||||
+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 = 1e-12 TT=3e-10
|
||||
+ASD = 0.3 CSDESW = 1e-12
|
||||
+TCJSWG=1e-4 MJSWG=.5 PBSWG=1
|
||||
|
|
@ -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 nmospd.mod
|
||||
.include pmospd.mod
|
||||
.include lib.h
|
||||
.end
|
||||
|
|
@ -0,0 +1,18 @@
|
|||
*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 nmospd.mod
|
||||
|
||||
* For PD, the command '.include nmosfd.mod ' should
|
||||
* be replaced with '.include nmospd.mod'.
|
||||
Loading…
Reference in New Issue