Merge remote branch 'origin/new_kirchhoff-3' into KLU-kirchhoff
Conflicts: configure.ac src/include/ngspice/devdefs.h src/include/ngspice/smpdefs.h src/maths/sparse/spsmp.c src/spicelib/devices/asrc/asrcinit.c src/spicelib/devices/bjt/Makefile.am src/spicelib/devices/bjt/bjtinit.c src/spicelib/devices/bsim1/Makefile.am src/spicelib/devices/bsim1/bsim1ext.h src/spicelib/devices/bsim1/bsim1init.c src/spicelib/devices/bsim2/Makefile.am src/spicelib/devices/bsim2/bsim2ext.h src/spicelib/devices/bsim2/bsim2init.c src/spicelib/devices/bsim3/Makefile.am src/spicelib/devices/bsim3/bsim3ext.h src/spicelib/devices/bsim3/bsim3init.c src/spicelib/devices/bsim3soi_dd/Makefile.am src/spicelib/devices/bsim3soi_dd/b3soiddext.h src/spicelib/devices/bsim3soi_dd/b3soiddinit.c src/spicelib/devices/bsim3soi_fd/Makefile.am src/spicelib/devices/bsim3soi_fd/b3soifdext.h src/spicelib/devices/bsim3soi_fd/b3soifdinit.c src/spicelib/devices/bsim3soi_pd/Makefile.am src/spicelib/devices/bsim3soi_pd/b3soipdext.h src/spicelib/devices/bsim3soi_pd/b3soipdinit.c src/spicelib/devices/bsim3v0/Makefile.am src/spicelib/devices/bsim3v0/bsim3v0ext.h src/spicelib/devices/bsim3v0/bsim3v0init.c src/spicelib/devices/bsim3v1/Makefile.am src/spicelib/devices/bsim3v1/bsim3v1ext.h src/spicelib/devices/bsim3v1/bsim3v1init.c src/spicelib/devices/bsim3v32/Makefile.am src/spicelib/devices/bsim3v32/bsim3v32ext.h src/spicelib/devices/bsim3v32/bsim3v32init.c src/spicelib/devices/bsim4/Makefile.am src/spicelib/devices/bsim4/bsim4def.h src/spicelib/devices/bsim4/bsim4ext.h src/spicelib/devices/bsim4/bsim4init.c src/spicelib/devices/bsim4v4/Makefile.am src/spicelib/devices/bsim4v4/bsim4v4ext.h src/spicelib/devices/bsim4v4/bsim4v4init.c src/spicelib/devices/bsim4v5/Makefile.am src/spicelib/devices/bsim4v5/bsim4v5ext.h src/spicelib/devices/bsim4v5/bsim4v5init.c src/spicelib/devices/bsim4v6/Makefile.am src/spicelib/devices/bsim4v6/bsim4v6ext.h src/spicelib/devices/bsim4v6/bsim4v6init.c src/spicelib/devices/bsimsoi/Makefile.am src/spicelib/devices/bsimsoi/b4soiext.h src/spicelib/devices/bsimsoi/b4soiinit.c src/spicelib/devices/cap/Makefile.am src/spicelib/devices/cap/capdefs.h src/spicelib/devices/cap/capext.h src/spicelib/devices/cap/capinit.c src/spicelib/devices/cccs/cccsinit.c src/spicelib/devices/ccvs/ccvsinit.c src/spicelib/devices/cpl/cplinit.c src/spicelib/devices/csw/cswinit.c src/spicelib/devices/dio/Makefile.am src/spicelib/devices/dio/diodefs.h src/spicelib/devices/dio/dioext.h src/spicelib/devices/dio/dioinit.c src/spicelib/devices/hfet1/Makefile.am src/spicelib/devices/hfet1/hfetext.h src/spicelib/devices/hfet1/hfetinit.c src/spicelib/devices/hfet2/Makefile.am src/spicelib/devices/hfet2/hfet2ext.h src/spicelib/devices/hfet2/hfet2init.c src/spicelib/devices/hisim2/Makefile.am src/spicelib/devices/hisim2/hsm2ext.h src/spicelib/devices/hisim2/hsm2init.c src/spicelib/devices/hisimhv1/hsmhvext.h src/spicelib/devices/hisimhv1/hsmhvinit.c src/spicelib/devices/ind/Makefile.am src/spicelib/devices/ind/inddefs.h src/spicelib/devices/ind/indinit.c src/spicelib/devices/isrc/isrcinit.c src/spicelib/devices/jfet/Makefile.am src/spicelib/devices/jfet/jfetext.h src/spicelib/devices/jfet/jfetinit.c src/spicelib/devices/jfet2/Makefile.am src/spicelib/devices/jfet2/jfet2ext.h src/spicelib/devices/jfet2/jfet2init.c src/spicelib/devices/ltra/ltrainit.c src/spicelib/devices/mes/Makefile.am src/spicelib/devices/mes/mesext.h src/spicelib/devices/mes/mesinit.c src/spicelib/devices/mesa/Makefile.am src/spicelib/devices/mesa/mesaext.h src/spicelib/devices/mesa/mesainit.c src/spicelib/devices/mos1/Makefile.am src/spicelib/devices/mos1/mos1ext.h src/spicelib/devices/mos1/mos1init.c src/spicelib/devices/mos2/Makefile.am src/spicelib/devices/mos2/mos2ext.h src/spicelib/devices/mos2/mos2init.c src/spicelib/devices/mos3/Makefile.am src/spicelib/devices/mos3/mos3ext.h src/spicelib/devices/mos3/mos3init.c src/spicelib/devices/mos6/Makefile.am src/spicelib/devices/mos6/mos6ext.h src/spicelib/devices/mos6/mos6init.c src/spicelib/devices/mos9/Makefile.am src/spicelib/devices/mos9/mos9ext.h src/spicelib/devices/mos9/mos9init.c src/spicelib/devices/res/Makefile.am src/spicelib/devices/res/resdefs.h src/spicelib/devices/res/resext.h src/spicelib/devices/res/resinit.c src/spicelib/devices/soi3/Makefile.am src/spicelib/devices/soi3/soi3ext.h src/spicelib/devices/soi3/soi3init.c src/spicelib/devices/sw/swinit.c src/spicelib/devices/tra/trainit.c src/spicelib/devices/txl/txlinit.c src/spicelib/devices/urc/urcinit.c src/spicelib/devices/vbic/Makefile.am src/spicelib/devices/vbic/vbicinit.c src/spicelib/devices/vccs/vccsinit.c src/spicelib/devices/vcvs/vcvsinit.c src/spicelib/devices/vsrc/Makefile.am src/spicelib/devices/vsrc/vsrcdefs.h src/spicelib/devices/vsrc/vsrcext.h src/spicelib/devices/vsrc/vsrcinit.c
This commit is contained in:
commit
85e3b90d26
10
INSTALL
10
INSTALL
|
|
@ -250,6 +250,14 @@ Most of the options now following are not well maintained, are not tested or eve
|
|||
"tclspice" is compiled and installed instead of
|
||||
plain ngspice.
|
||||
|
||||
--with-ngshared
|
||||
This option let you compile ngspice as a shared
|
||||
library or dll, allowing an application controlling
|
||||
ngspice. This option excludes using --with-x or
|
||||
--with-wingui. Useful additional options are
|
||||
--enable-xspice --enable-cider --enable-openmp.
|
||||
No graphics inetrface is provided, this has to be
|
||||
handled by the controlling application.
|
||||
|
||||
1.4.3 Options Useful for Debugging Ngspice
|
||||
|
||||
|
|
@ -538,7 +546,7 @@ Most of the options now following are not well maintained, are not tested or eve
|
|||
|
||||
9.2 make ngspice with MS Visual Studio 2008
|
||||
|
||||
ngspice may be compiled with MS Visual Studio 2008.
|
||||
ngspice may be compiled with MS Visual Studio 2008 or 2010.
|
||||
|
||||
CIDER and XSPICE are included, but the code models for XSPICE
|
||||
(*.cm) are not (yet) made. You may however use the code models
|
||||
|
|
|
|||
14
README.adms
14
README.adms
|
|
@ -22,6 +22,20 @@
|
|||
* 02110-1301 USA *
|
||||
***************************************************************************
|
||||
|
||||
WARNING!
|
||||
|
||||
The text in this document has been prepared in 2006 and is outdated. It is
|
||||
provided here only for reference and may provide some (historical)
|
||||
information.
|
||||
|
||||
Please refer to the ngspice adms web page at
|
||||
http://ngspice.sourceforge.net/admshowto.html
|
||||
for actual information on how to integrate Verilog A device models into
|
||||
ngspice.
|
||||
|
||||
Holger Vogt, May 2013
|
||||
|
||||
|
||||
|
||||
INTRODUCTION
|
||||
|
||||
|
|
|
|||
16
configure.ac
16
configure.ac
|
|
@ -182,6 +182,10 @@ AC_ARG_WITH([tcl],
|
|||
AC_ARG_WITH([ngshared],
|
||||
[AS_HELP_STRING([--with-ngshared], [Compiles ngspice as shared library (dll)])])
|
||||
|
||||
# --enable-kirchhoff: enable KCL
|
||||
AC_ARG_ENABLE([kirchhoff],
|
||||
[AS_HELP_STRING([--enable-kirchhoff], [Enables the Kirchhoff Current Law Verification])])
|
||||
|
||||
# readline and editline cannot both be enabled
|
||||
if test "x$with_editline" = xyes; then
|
||||
if test "x$with_readline" = xyes; then
|
||||
|
|
@ -801,6 +805,7 @@ AC_MSG_RESULT([Settings which were chosen:])
|
|||
if test "x$enable_sense2" = xyes; then
|
||||
AC_DEFINE([WANT_SENSE2], [], [Define if we want spice2 sensitivity analysis])
|
||||
AC_MSG_RESULT([Spice2 sensitivity analysis enabled])
|
||||
AC_MSG_WARN([This feature is UNSUPPORTED])
|
||||
fi
|
||||
if test "x$enable_nobypass" = xyes; then
|
||||
AC_DEFINE([NOBYPASS], [], [Define if we want NOBYPASS])
|
||||
|
|
@ -856,7 +861,7 @@ if test "x$enable_pzdebug" = xyes; then
|
|||
fi
|
||||
if test "x$enable_pss" = xyes; then
|
||||
AC_DEFINE([WITH_PSS], [], [Define if you want PSS analysis])
|
||||
AC_MSG_RESULT(WARNING: PSS analysis enabled)
|
||||
AC_MSG_RESULT([WARNING: PSS analysis enabled])
|
||||
fi
|
||||
if test "x$enable_blktmsdebug" = xyes; then
|
||||
AC_DEFINE([D_DBG_BLOCKTIMES], [], [Define if we want debug distortion analysis (BLOCKTIMES)])
|
||||
|
|
@ -879,6 +884,12 @@ fi
|
|||
AC_SUBST([XGRAPHDIR])
|
||||
AC_SUBST([NOTXGRAPH])
|
||||
|
||||
if test "x$enable_kirchhoff" = xyes; then
|
||||
AC_DEFINE([KIRCHHOFF], [], [Define if we want to enable the Kirchhoff Current Law Verification])
|
||||
AC_MSG_RESULT([WARNING: Kirchhoff Current Law Verification Enabled (experimental)])
|
||||
fi
|
||||
AM_CONDITIONAL([KIRCHHOFF_WANTED], [test "x$enable_kirchhoff" = xyes])
|
||||
|
||||
AC_CHECK_PROGS([YACC], ['bison -y' byacc yacc])
|
||||
|
||||
################# XSPICE ##################################################
|
||||
|
|
@ -945,6 +956,8 @@ AM_CONDITIONAL([NUMDEV_WANTED], [test "x$enable_cider" = xyes])
|
|||
|
||||
AM_CONDITIONAL([PSS_WANTED], [test "x$enable_pss" = xyes])
|
||||
|
||||
AM_CONDITIONAL([SENSE2_WANTED], [test "x$enable_sense2" = xyes])
|
||||
|
||||
# adms option
|
||||
if test "x$enable_adms" = xyes ; then
|
||||
AC_MSG_RESULT([**********************************
|
||||
|
|
@ -1216,6 +1229,7 @@ AC_CONFIG_FILES([Makefile
|
|||
src/xspice/enh/Makefile
|
||||
src/xspice/ipc/Makefile
|
||||
src/xspice/idn/Makefile
|
||||
src/unsupported/Makefile
|
||||
tests/Makefile
|
||||
tests/bsim1/Makefile
|
||||
tests/bsim2/Makefile
|
||||
|
|
|
|||
|
|
@ -0,0 +1,22 @@
|
|||
DBj_gidl_n
|
||||
|
||||
.INCLUDE 45nm_MGK_car2_gidlgisl.pm
|
||||
.OPTIONS GMIN=1e-18 abstol=1e-19
|
||||
|
||||
*Definizione dei parametri
|
||||
.PARAM Lmin=45n
|
||||
.PARAM Wmin=45n
|
||||
.PARAM Ldiff=90n
|
||||
|
||||
*Descrizione della cella
|
||||
Mp drain gate source body nmos W={Wmin} L={Lmin} AS={Wmin*Ldiff} AD={Wmin*Ldiff} PS={2*(Ldiff+Wmin)} PD={2*(Ldiff+Wmin)}
|
||||
Vd drain alim 0V
|
||||
Vg gate 0 0V
|
||||
Vs source alim 0V
|
||||
Vb body 0 0V
|
||||
Vdd alim 0 0.05V
|
||||
|
||||
*Definizione del tipo di analisi
|
||||
.dc Vdd 0.0 1.2 0.1
|
||||
.print all
|
||||
.END
|
||||
|
|
@ -0,0 +1,22 @@
|
|||
DBj_gidl_p
|
||||
|
||||
.INCLUDE 45nm_MGK_car2_gidlgisl.pm
|
||||
.OPTIONS GMIN=1e-18 abstol=1e-24 vntol=1e-24
|
||||
|
||||
*Definizione dei parametri
|
||||
.PARAM Lmin=45n
|
||||
.PARAM Wmin=45n
|
||||
.PARAM Ldiff=90n
|
||||
|
||||
*Descrizione della cella
|
||||
Mp drain gate source body pmos W={Wmin} L={Lmin} AS={Wmin*Ldiff} AD={Wmin*Ldiff} PS={2*(Ldiff+Wmin)} PD={2*(Ldiff+Wmin)}
|
||||
Vd drain 0 0V
|
||||
Vg gate alim 0V
|
||||
Vs source 0 0V
|
||||
Vb body alim 0V
|
||||
Vdd alim 0 0.05V
|
||||
|
||||
*Definizione del tipo di analisi
|
||||
.dc Vdd 0.0 1.2 0.1
|
||||
.print all
|
||||
.END
|
||||
|
|
@ -0,0 +1,22 @@
|
|||
DBj_gidl_p
|
||||
|
||||
.INCLUDE 45nm_MGK_car2_gidlgisl.pm
|
||||
.OPTIONS GMIN=1e-18 abstol=1e-19
|
||||
|
||||
*Definizione dei parametri
|
||||
.PARAM Lmin=45n
|
||||
.PARAM Wmin=45n
|
||||
.PARAM Ldiff=90n
|
||||
|
||||
*Descrizione della cella
|
||||
Mp drain gate source body pmos W={Wmin} L={Lmin} AS={Wmin*Ldiff} AD={Wmin*Ldiff} PS={2*(Ldiff+Wmin)} PD={2*(Ldiff+Wmin)}
|
||||
Vd drain 0 -1V
|
||||
Vg gate alim 0V
|
||||
Vs source 0 -1V
|
||||
Vb body alim 0V
|
||||
Vdd alim 0 -1.05V
|
||||
|
||||
*Definizione del tipo di analisi
|
||||
.dc Vdd 0.0 1.2 0.1
|
||||
.print all
|
||||
.END
|
||||
|
|
@ -0,0 +1,120 @@
|
|||
.model nmos nmos level=54
|
||||
+version = 4.7.0 binunit = 1 paramchk= 1 mobmod = 0
|
||||
+capmod = 2 igcmod = 0 igbmod = 0 geomod = 1
|
||||
+diomod = 1 rdsmod = 0 rbodymod= 1 rgatemod= 1
|
||||
+permod = 1 acnqsmod= 0 trnqsmod= 0
|
||||
+tnom = 27 toxe = 9e-010 toxp = 6.5e-010 toxm = 9e-010
|
||||
+dtox = 2.5e-010 epsrox = 3.9 wint = 5e-009 lint = 2.7e-009
|
||||
+ll = 0 wl = 0 lln = 1 wln = 1
|
||||
+lw = 0 ww = 0 lwn = 1 wwn = 1
|
||||
+lwl = 0 wwl = 0 xpart = 0 toxref = 9e-010 xl = -20e-9
|
||||
+dlcig = 2.7e-009
|
||||
+vth0 = 0.3423 k1 = 0.2 k2 = 0 k3 = 0
|
||||
+k3b = 0 w0 = 2.5e-006 dvt0 = 1 dvt1 = 2
|
||||
+dvt2 = 0 dvt0w = 0 dvt1w = 0 dvt2w = 0
|
||||
+dsub = 0.078 minv = 0.05 voffl = 0 dvtp0 = 1e-010
|
||||
+dvtp1 = 0.1 lpe0 = 0 lpeb = 0 xj = 1.4e-008
|
||||
+ngate = 1e+023 ndep = 6.5e+018 nsd = 2e+020 phin = 0
|
||||
+cdsc = 0 cdscb = 0 cdscd = 0 cit = 0
|
||||
+voff = -0.13 nfactor = 1.9 eta0 = 0.0055 etab = 0
|
||||
+vfb = -1.058 u0 = 0.02947 ua = -5e-010 ub = 1.7e-018
|
||||
+uc = 0 vsat = 159550 a0 = 1 ags = 0
|
||||
+a1 = 0 a2 = 1 b0 = 0 b1 = 0
|
||||
+keta = 0.04 dwg = 0 dwb = 0 pclm = 0.06
|
||||
+pdiblc1 = 0.001 pdiblc2 = 0.001 pdiblcb = -0.005 drout = 0.5
|
||||
+pvag = 1e-020 delta = 0.01 pscbe1 = 2.0e+009 pscbe2 = 1e-007
|
||||
+fprout = 0.2 pdits = 0.01 pditsd = 0.23 pditsl = 2300000
|
||||
+rsh = 5 rdsw = 105 rsw = 52.5 rdw = 52.5
|
||||
+rdswmin = 0 rdwmin = 0 rswmin = 0 prwg = 0
|
||||
+prwb = 0 wr = 1 alpha0 = 0.0 alpha1 = 0.00
|
||||
+beta0 = 30 agidl = 0.0002 bgidl = 2.1e+009 cgidl = 0.0002
|
||||
+egidl = 0.8 aigbacc = 0.012 bigbacc = 0.0028 cigbacc = 0.002
|
||||
+nigbacc = 1 aigbinv = 0.014 bigbinv = 0.004 cigbinv = 0.004
|
||||
+eigbinv = 1.1 nigbinv = 3 aigc = 0.018029 bigc = 0.0029
|
||||
+cigc = 0.002 aigsd = 0.018029 bigsd = 0.0029 cigsd = 0.002
|
||||
+nigc = 1 poxedge = 1 pigcd = 1 ntox = 1
|
||||
+xrcrg1 = 12 xrcrg2 = 5
|
||||
+cgso = 1e-010 cgdo = 1e-010 cgbo = 0 cgdl = 7.5e-013
|
||||
+cgsl = 7.5e-013 clc = 1e-007 cle = 0.6 cf = 1.1e-010
|
||||
+ckappas = 0.6 ckappad = 0.6 vfbcv = -1 acde = 1
|
||||
+moin = 15 noff = 1 voffcv = 0
|
||||
+kt1 = -0.154 kt1l = 0 kt2 = 0.022 ute = -1.1
|
||||
+ua1 = 1e-009 ub1 = -1e-018 uc1 = -5.6e-011 prt = 0
|
||||
+at = 33000
|
||||
+fnoimod = 1 tnoimod = 0 noia = 6.25e+041 noib = 3.125e+026
|
||||
+noic = 8.75e+009 em = 41000000 af = 1 ef = 1
|
||||
+kf = 0 tnoia = 1.5 tnoib = 3.5 ntnoi = 1
|
||||
+jss = 0.0 jsws = 0.0 jswgs = 0.0 njs = 1
|
||||
+ijthsfwd= 0.1 ijthsrev= 0.1 bvs = 10 xjbvs = 1
|
||||
+jsd = 0.0 jswd = 0.0 jswgd = 0.0 xjbvd = 1
|
||||
+pbs = 1 cjs = 0.0018 mjs = 0.5 pbsws = 1
|
||||
+cjsws = 1.2e-010 mjsws = 0.33 cjswgs = 2.1e-010 cjd = 0.0018
|
||||
+cjswd = 1.2e-010 mjswd = 0.33 pbswgd = 1 cjswgd = 2.1e-010
|
||||
+mjswgd = 0.33 tpb = 0 tcj = 0 tpbsw = 0
|
||||
+tcjsw = 0 tpbswg = 0 tcjswg = 0 xtis = 3
|
||||
+dmcg = 0 dmci = 0 dmdg = 0 dmcgt = 0
|
||||
+dwj = 0 xgw = 0 xgl = 0
|
||||
+rshg = 0.4 gbmin = 1e-010 rbpb = 5 rbpd = 15
|
||||
+rbps = 15 rbdb = 15 rbsb = 15 ngcon = 1
|
||||
|
||||
|
||||
|
||||
.model pmos pmos level = 54
|
||||
+version = 4.7.0 binunit = 1 paramchk= 1 mobmod = 0
|
||||
+capmod = 2 igcmod = 0 igbmod = 0 geomod = 1
|
||||
+diomod = 1 rdsmod = 0 rbodymod= 1 rgatemod= 1
|
||||
+permod = 1 acnqsmod= 0 trnqsmod= 0
|
||||
+tnom = 27 toxe = 9.2e-010 toxp = 6.5e-010 toxm = 9.2e-010
|
||||
+dtox = 2.7e-010 epsrox = 3.9 wint = 5e-009 lint = 2.7e-009
|
||||
+ll = 0 wl = 0 lln = 1 wln = 1
|
||||
+lw = 0 ww = 0 lwn = 1 wwn = 1
|
||||
+lwl = 0 wwl = 0 xpart = 0 toxref = 9.2e-010 xl = -20e-9
|
||||
+dlcig = 2.7e-009
|
||||
+vth0 = -0.23122 k1 = 0.2 k2 = -0.01 k3 = 0
|
||||
+k3b = 0 w0 = 2.5e-006 dvt0 = 1 dvt1 = 2
|
||||
+dvt2 = -0.032 dvt0w = 0 dvt1w = 0 dvt2w = 0
|
||||
+dsub = 0.1 minv = 0.05 voffl = 0 dvtp0 = 1e-011
|
||||
+dvtp1 = 0.05 lpe0 = 0 lpeb = 0 xj = 1.4e-008
|
||||
+ngate = 1e+023 ndep = 2.8e+018 nsd = 2e+020 phin = 0
|
||||
+cdsc = 0 cdscb = 0 cdscd = 0 cit = 0
|
||||
+voff = -0.13 nfactor = 1.9 eta0 = 0.0049 etab = 0
|
||||
+vfb = -1.058 u0 = 0.00391 ua = -5e-010 ub = 1.6e-018
|
||||
+uc = 0 vsat = 78000 a0 = 1 ags = 1e-020
|
||||
+a1 = 0 a2 = 1 b0 = 0 b1 = 0
|
||||
+keta = -0.047 dwg = 0 dwb = 0 pclm = 0.1
|
||||
+pdiblc1 = 0.001 pdiblc2 = 0.001 pdiblcb = 3.4e-008 drout = 0.6
|
||||
+pvag = 1e-020 delta = 0.01 pscbe1 = 2e+009 pscbe2 = 9.58e-007
|
||||
+fprout = 0.2 pdits = 0.08 pditsd = 0.23 pditsl = 2300000
|
||||
+rsh = 5 rdsw = 105 rsw = 52.5 rdw = 52.5
|
||||
+rdswmin = 0 rdwmin = 0 rswmin = 0 prwg = 0
|
||||
+prwb = 0 wr = 1 alpha0 = 0.0 alpha1 = 0.00
|
||||
+beta0 = 30 agidl = 0.0002 bgidl = 2.1e+009 cgidl = 0.0002
|
||||
+egidl = 0.8 aigbacc = 0.012 bigbacc = 0.0028 cigbacc = 0.002
|
||||
+nigbacc = 1 aigbinv = 0.014 bigbinv = 0.004 cigbinv = 0.004
|
||||
+eigbinv = 1.1 nigbinv = 3 aigc = 0.010687 bigc = 0.0012607
|
||||
+cigc = 0.0008 aigsd = 0.010687 bigsd = 0.0012607 cigsd = 0.0008
|
||||
+nigc = 1 poxedge = 1 pigcd = 1 ntox = 1
|
||||
+xrcrg1 = 12 xrcrg2 = 5
|
||||
+cgso = 1e-010 cgdo = 1e-010 cgbo = 0 cgdl = 3e-011
|
||||
+cgsl = 3e-011 clc = 1e-007 cle = 0.6 cf = 1.1e-010
|
||||
+ckappas = 0.6 ckappad = 0.6 vfbcv = -1 acde = 1
|
||||
+moin = 15 noff = 1 voffcv = 0
|
||||
+kt1 = -0.14 kt1l = 0 kt2 = 0.022 ute = -1.1
|
||||
+ua1 = 1e-009 ub1 = -1e-018 uc1 = -5.6e-011 prt = 0
|
||||
+at = 33000
|
||||
+fnoimod = 1 tnoimod = 0 noia = 6.25e+041 noib = 3.125e+026
|
||||
+noic = 8.75e+009 em = 41000000 af = 1 ef = 1
|
||||
+kf = 0 tnoia = 1.5 tnoib = 3.5 ntnoi = 1
|
||||
+jss = 0.0 jsws = 0.0 jswgs = 0.0 njs = 1
|
||||
+ijthsfwd= 0.1 ijthsrev= 0.1 bvs = 10 xjbvs = 1
|
||||
+jsd = 0.0 jswd = 0.0 jswgd = 0.0 xjbvd = 1
|
||||
+pbs = 1 cjs = 0.0015 mjs = 0.5 pbsws = 1
|
||||
+cjsws = 9.4e-011 mjsws = 0.33 cjswgs = 2e-010 cjd = 0.0015
|
||||
+cjswd = 9.4e-011 mjswd = 0.33 pbswgd = 1 cjswgd = 2e-010
|
||||
+mjswgd = 0.33 tpb = 0 tcj = 0 tpbsw = 0
|
||||
+tcjsw = 0 tpbswg = 0 tcjswg = 0 xtis = 3
|
||||
+dmcg = 0 dmdg = 0 dmcgt = 0 xgw = 0
|
||||
+xgl = 0
|
||||
+rshg = 0.1 gbmin = 1e-012 rbpb = 50 rbpd = 50
|
||||
+rbps = 50 rbdb = 50 rbsb = 50 ngcon = 1
|
||||
|
||||
|
|
@ -1,7 +1,7 @@
|
|||
## Process this file with automake to produce Makefile.in
|
||||
|
||||
SUBDIRS = misc maths frontend spicelib include/ngspice
|
||||
DIST_SUBDIRS = misc maths frontend spicelib include/ngspice xspice ciderlib
|
||||
DIST_SUBDIRS = misc maths frontend spicelib include/ngspice xspice ciderlib unsupported
|
||||
|
||||
if XSPICE_WANTED
|
||||
SUBDIRS += xspice
|
||||
|
|
@ -11,6 +11,10 @@ if CIDER_WANTED
|
|||
SUBDIRS += ciderlib
|
||||
endif
|
||||
|
||||
if SENSE2_WANTED
|
||||
SUBDIRS += unsupported
|
||||
endif
|
||||
|
||||
if !TCL_MODULE
|
||||
if !SHARED_MODULE
|
||||
bin_PROGRAMS = ngspice ngnutmeg
|
||||
|
|
@ -27,7 +31,7 @@ endif !SHARED_MODULE
|
|||
endif !TCL_MODULE
|
||||
|
||||
EXTRA_DIST = ngspice.txt setplot spectrum \
|
||||
devload devaxis ciderinit winmain.c winmain.h unsupported \
|
||||
devload devaxis ciderinit winmain.c winmain.h \
|
||||
tclspice.c tclspice.map pkgIndex.tcl.in spinit.in tclspinit.in \
|
||||
main.c sharedspice.c
|
||||
|
||||
|
|
@ -137,6 +141,10 @@ ngspice_LDADD += \
|
|||
spicelib/analysis/libckt.la \
|
||||
spicelib/devices/libdev.la
|
||||
|
||||
if SENSE2_WANTED
|
||||
ngspice_LDADD += unsupported/libunsupported.la
|
||||
endif
|
||||
|
||||
if XSPICE_WANTED
|
||||
ngspice_LDADD += \
|
||||
xspice/cm/libcmxsp.la \
|
||||
|
|
|
|||
|
|
@ -52,7 +52,7 @@ static struct line *com_options = NULL;
|
|||
static void cktislinear(CKTcircuit *ckt, struct line *deck);
|
||||
|
||||
void line_free_x(struct line *deck, bool recurse);
|
||||
|
||||
void create_circbyline(char *line);
|
||||
|
||||
|
||||
/*
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load Diff
|
|
@ -239,6 +239,14 @@ do_measure(
|
|||
return (measures_passed);
|
||||
}
|
||||
|
||||
/* don't allow autostop if no .meas commands are given in the input file */
|
||||
if ((cp_getvar("autostop", CP_BOOL, NULL)) && (ft_curckt->ci_meas == NULL)) {
|
||||
fprintf(cp_err, "\nWarning: No .meas commands found!\n");
|
||||
fprintf(cp_err, " Option autostop is not available, ignored!\n\n");
|
||||
cp_remvar("autostop");
|
||||
return (FALSE);
|
||||
}
|
||||
|
||||
/* Evaluating the linked list of .meas cards, assembled from the input deck
|
||||
by fcn inp_spsource() in inp.c:575.
|
||||
A typical .meas card will contain:
|
||||
|
|
|
|||
|
|
@ -16,7 +16,7 @@ typedef enum {Nodekey = '#'} _nNodekey; /* Introduces node symbol */
|
|||
typedef enum {Intro = '&'} _nIntro; /* Introduces preprocessor tokens */
|
||||
typedef enum {Comment = '*'} _nComment; /* Spice Comment lines */
|
||||
typedef enum {Psp = '{'} _nPsp; /* Ps expression */
|
||||
typedef enum {Defd = 15} _nDefd; /* serial numb. of 'defined' keyword.
|
||||
typedef enum {Defd = 6} _nDefd; /* serial numb. of 'defined' keyword.
|
||||
The others are not used (yet) */
|
||||
|
||||
typedef char *auxtable; /* dummy */
|
||||
|
|
|
|||
|
|
@ -88,8 +88,7 @@ initkeys(void)
|
|||
{
|
||||
spice_dstring_init(&keyS);
|
||||
scopy_up(&keyS,
|
||||
"and or not div mod if else end while macro funct defined"
|
||||
" include for to downto is var");
|
||||
"and or not div mod defined");
|
||||
scopy_up(&fmathS,
|
||||
"sqr sqrt sin cos exp ln arctan abs pow pwr max min int log sinh cosh"
|
||||
" tanh ternary_fcn v agauss sgn gauss unif aunif limit ceil floor");
|
||||
|
|
@ -935,7 +934,7 @@ opfunctkey(tdico *dico,
|
|||
/*if kw operator keyword, c=token*/
|
||||
switch (kw)
|
||||
{
|
||||
/* & | ~ DIV MOD Defined */
|
||||
/* & | ~ DIV MOD Defined */
|
||||
case 1:
|
||||
c = '&';
|
||||
state = 2;
|
||||
|
|
|
|||
|
|
@ -1815,6 +1815,7 @@ devmodtranslate(struct line *deck, char *subname, wordlist * const submod)
|
|||
|
||||
case 'r':
|
||||
case 'c':
|
||||
case 'l':
|
||||
name = gettok(&t); /* get refdes */
|
||||
(void) sprintf(buffer, "%s ", name);
|
||||
tfree(name);
|
||||
|
|
|
|||
|
|
@ -56,6 +56,12 @@ struct CKTnode {
|
|||
#define PARM_IC 2
|
||||
#define PARM_NODETYPE 3
|
||||
|
||||
#ifdef KIRCHHOFF
|
||||
typedef struct sCKTmkCurKCLnode {
|
||||
double KCLcurrent ;
|
||||
struct sCKTmkCurKCLnode *next ;
|
||||
} CKTmkCurKCLnode ;
|
||||
#endif
|
||||
|
||||
struct CKTcircuit {
|
||||
|
||||
|
|
@ -110,6 +116,14 @@ struct CKTcircuit {
|
|||
double *CKTrhs; /* current rhs value - being loaded */
|
||||
double *CKTrhsOld; /* previous rhs value for convergence
|
||||
testing */
|
||||
|
||||
#ifdef KIRCHHOFF
|
||||
double *CKTfvk ; /* KCL Verification array */
|
||||
int *CKTnodeIsLinear ; /* Flag to indicate if a node is linear or non-linear */
|
||||
int *CKTvoltCurNode ; /* Flag to indicate if a node contains some direct unknown currents */
|
||||
CKTmkCurKCLnode **CKTmkCurKCLarray ; /* Array of KCL Currents */
|
||||
#endif
|
||||
|
||||
double *CKTrhsSpare; /* spare rhs value for reordering */
|
||||
double *CKTirhs; /* current rhs value - being loaded
|
||||
(imag) */
|
||||
|
|
@ -289,7 +303,11 @@ struct CKTcircuit {
|
|||
};
|
||||
|
||||
|
||||
/* Now function prottypes */
|
||||
/* Now function prototypes */
|
||||
|
||||
#ifdef KIRCHHOFF
|
||||
extern int CKTmkCurKCL (CKTcircuit *, int, double **) ;
|
||||
#endif
|
||||
|
||||
extern int ACan(CKTcircuit *, int);
|
||||
extern int ACaskQuest(CKTcircuit *, JOB *, int , IFvalue *);
|
||||
|
|
@ -387,10 +405,14 @@ extern int PZinit(CKTcircuit *);
|
|||
extern int PZpost(CKTcircuit *);
|
||||
extern int PZaskQuest(CKTcircuit *, JOB *, int , IFvalue *);
|
||||
extern int PZsetParm(CKTcircuit *, JOB *, int , IFvalue *);
|
||||
|
||||
#ifdef WANT_SENSE2
|
||||
extern int SENaskQuest(CKTcircuit *, JOB *, int , IFvalue *);
|
||||
extern void SENdestroy(SENstruct *);
|
||||
extern int SENsetParm(CKTcircuit *, JOB *, int , IFvalue *);
|
||||
extern int SENstartup(CKTcircuit *);
|
||||
extern int SENstartup(CKTcircuit *, int);
|
||||
#endif
|
||||
|
||||
extern int SPIinit(IFfrontEnd *, IFsimulator **);
|
||||
extern int TFanal(CKTcircuit *, int);
|
||||
extern int TFaskQuest(CKTcircuit *, JOB *, int , IFvalue *);
|
||||
|
|
|
|||
|
|
@ -74,7 +74,7 @@
|
|||
/* Alternate initialisation file name */
|
||||
#define ALT_INITSTR "spice.rc"
|
||||
|
||||
#if defined(__MINGW32__) || defined(_MSC_VER)
|
||||
#if defined(__MINGW32__) || defined(_MSC_VER) || defined (HAS_WINGUI)
|
||||
#define DIR_PATHSEP "\\"
|
||||
#define DIR_TERM '\\'
|
||||
#define DIR_PATHSEP_LINUX "/"
|
||||
|
|
|
|||
|
|
@ -29,9 +29,20 @@ double limitVbe( double, double, int * );
|
|||
double limitVce( double, double, int * );
|
||||
double limitVgb( double, double, int * );
|
||||
|
||||
|
||||
|
||||
|
||||
/* Area Calculation Method (ACM) for MOS models (devsup.c) */
|
||||
int
|
||||
ACM_SourceDrainResistances(int, double, double, double, double, double,
|
||||
double, double, int, double, double, double,
|
||||
int, double, double, double, double *, double *);
|
||||
int
|
||||
ACM_saturationCurrents(int, int, int, double, double, double, double, double,
|
||||
double, int, double, int, double, int, double, int,
|
||||
double, double *, double *);
|
||||
int
|
||||
ACM_junctionCapacitances(int, int, int, double, double, double, double, int,
|
||||
double, int, double, int, double, int, double,
|
||||
double, double, double, double *, double *,
|
||||
double *, double *, double *, double *);
|
||||
|
||||
typedef struct SPICEdev {
|
||||
IFdevice DEVpublic;
|
||||
|
|
@ -110,6 +121,12 @@ typedef struct SPICEdev {
|
|||
/* routine to convert Complex CSC array to Real CSC array */
|
||||
#endif
|
||||
|
||||
#ifdef KIRCHHOFF
|
||||
/* Francesco Lannutti */
|
||||
int (*DEVnodeIsNonLinear)(GENmodel *, CKTcircuit *) ;
|
||||
/* Routine to declare a node as NonLinear */
|
||||
#endif
|
||||
|
||||
} SPICEdev; /* instance of structure for each possible type of device */
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -112,7 +112,9 @@ struct ngcomplex {
|
|||
typedef struct ngcomplex ngcomplex_t;
|
||||
#endif
|
||||
|
||||
/* vector info obtained from any vector in ngspice.dll */
|
||||
/* vector info obtained from any vector in ngspice.dll.
|
||||
Allows direct access to the ngspice internal vector structure,
|
||||
as defined in include/ngspice/devc.h .*/
|
||||
typedef struct vector_info {
|
||||
char *v_name; /* Same as so_vname. */
|
||||
int v_type; /* Same as so_vtype. */
|
||||
|
|
@ -123,16 +125,17 @@ typedef struct vector_info {
|
|||
} vector_info, *pvector_info;
|
||||
|
||||
typedef struct vecvalues {
|
||||
char* name;
|
||||
double creal;
|
||||
double cimag;
|
||||
bool is_scale;
|
||||
bool is_complex;
|
||||
char* name; /* name of a specific vector */
|
||||
double creal; /* actual data value */
|
||||
double cimag; /* actual data value */
|
||||
bool is_scale;/* if 'name' is the scale vector */
|
||||
bool is_complex;/* if the data are complex numbers */
|
||||
} vecvalues, *pvecvalues;
|
||||
|
||||
typedef struct vecvaluesall {
|
||||
int veccount;
|
||||
pvecvalues *vecsa;
|
||||
int veccount; /* number of vectors in plot */
|
||||
int vecindex; /* index of actual set of vectors. i.e. the number of accepted data points */
|
||||
pvecvalues *vecsa; /* values of actual set of vectors, indexed from 0 to veccount - 1 */
|
||||
} vecvaluesall, *pvecvaluesall;
|
||||
|
||||
/* info for a specific vector */
|
||||
|
|
|
|||
|
|
@ -122,8 +122,8 @@ void SMPgetError( SMPmatrix *, int *, int *);
|
|||
int SMPcProdDiag( SMPmatrix *, SPcomplex *, int *);
|
||||
int SMPcDProd(SMPmatrix *Matrix, SPcomplex *pMantissa, int *pExponent);
|
||||
SMPelement * SMPfindElt( SMPmatrix *, int , int , int );
|
||||
int SMPcZeroCol(SMPmatrix *eMatrix, int Col);
|
||||
int SMPcAddCol(SMPmatrix *eMatrix, int Accum_Col, int Addend_Col);
|
||||
int SMPzeroRow(SMPmatrix *eMatrix, int Row);
|
||||
int SMPcZeroCol(SMPmatrix *Matrix, int Col);
|
||||
int SMPcAddCol(SMPmatrix *Matrix, int Accum_Col, int Addend_Col);
|
||||
int SMPzeroRow(SMPmatrix *Matrix, int Row);
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -263,7 +263,7 @@ extern int spFileMatrix( MatrixPtr, char *, char *, int, int, int );
|
|||
extern int spFileStats( MatrixPtr, char *, char * );
|
||||
extern int spFillinCount( MatrixPtr );
|
||||
extern int spGetAdmittance( MatrixPtr, int, int, struct spTemplate* );
|
||||
extern spREAL *spFindElement(MatrixPtr eMatrix, int Row, int Col );
|
||||
extern spREAL *spFindElement(MatrixPtr Matrix, int Row, int Col );
|
||||
extern spREAL *spGetElement(MatrixPtr, int, int );
|
||||
extern void *spGetInitInfo( spREAL* );
|
||||
extern int spGetOnes( MatrixPtr, int, int, int, struct spTemplate* );
|
||||
|
|
|
|||
|
|
@ -15,6 +15,7 @@ Author: 1985 Thomas L. Quarles
|
|||
#include "ngspice/smpdefs.h"
|
||||
|
||||
|
||||
|
||||
int
|
||||
NIconvTest(CKTcircuit *ckt)
|
||||
{
|
||||
|
|
@ -25,8 +26,19 @@ NIconvTest(CKTcircuit *ckt)
|
|||
double new;
|
||||
double tol;
|
||||
|
||||
node = ckt->CKTnodes;
|
||||
#ifdef KIRCHHOFF
|
||||
#ifdef STEPDEBUG
|
||||
int j ;
|
||||
#endif
|
||||
|
||||
double maximum ;
|
||||
CKTmkCurKCLnode *ptr ;
|
||||
|
||||
#endif
|
||||
|
||||
size = SMPmatSize(ckt->CKTmatrix);
|
||||
node = ckt->CKTnodes;
|
||||
|
||||
#ifdef STEPDEBUG
|
||||
for (i=1;i<=size;i++) {
|
||||
new = ckt->CKTrhs [i] ;
|
||||
|
|
@ -34,6 +46,7 @@ NIconvTest(CKTcircuit *ckt)
|
|||
printf("chk for convergence: %s new: %g old: %g\n",CKTnodName(ckt,i),new,old);
|
||||
}
|
||||
#endif /* STEPDEBUG */
|
||||
|
||||
for (i=1;i<=size;i++) {
|
||||
node = node->next;
|
||||
new = ckt->CKTrhs [i] ;
|
||||
|
|
@ -42,26 +55,66 @@ NIconvTest(CKTcircuit *ckt)
|
|||
tol = ckt->CKTreltol * (MAX(fabs(old),fabs(new))) +
|
||||
ckt->CKTvoltTol;
|
||||
if (fabs(new-old) >tol ) {
|
||||
|
||||
#ifdef STEPDEBUG
|
||||
printf(" non-convergence at node (type=3) %s (fabs(new-old)>tol --> fabs(%g-%g)>%g)\n",CKTnodName(ckt,i),new,old,tol);
|
||||
printf(" reltol: %g voltTol: %g (tol=reltol*(MAX(fabs(old),fabs(new))) + voltTol)\n",ckt->CKTreltol,ckt->CKTvoltTol);
|
||||
#endif /* STEPDEBUG */
|
||||
|
||||
ckt->CKTtroubleNode = i;
|
||||
ckt->CKTtroubleElt = NULL;
|
||||
return(1);
|
||||
}
|
||||
|
||||
#ifndef KIRCHHOFF
|
||||
} else {
|
||||
tol = ckt->CKTreltol * (MAX(fabs(old),fabs(new))) +
|
||||
ckt->CKTabstol;
|
||||
if (fabs(new-old) >tol ) {
|
||||
|
||||
#ifdef STEPDEBUG
|
||||
printf(" non-convergence at node (type=%d) %s (fabs(new-old)>tol --> fabs(%g-%g)>%g)\n",node->type,CKTnodName(ckt,i),new,old,tol);
|
||||
printf(" reltol: %g abstol: %g (tol=reltol*(MAX(fabs(old),fabs(new))) + abstol)\n",ckt->CKTreltol,ckt->CKTabstol);
|
||||
#endif /* STEPDEBUG */
|
||||
|
||||
ckt->CKTtroubleNode = i;
|
||||
ckt->CKTtroubleElt = NULL;
|
||||
return(1);
|
||||
}
|
||||
#else
|
||||
/* KCL Verification */
|
||||
}
|
||||
if ((node->type == SP_VOLTAGE) && (!ckt->CKTnodeIsLinear [i]) && (ckt->CKTvoltCurNode [i]))
|
||||
{
|
||||
maximum = 0 ;
|
||||
ptr = ckt->CKTmkCurKCLarray [i] ;
|
||||
|
||||
#ifdef STEPDEBUG
|
||||
j = 0 ;
|
||||
#endif
|
||||
|
||||
while (ptr != NULL)
|
||||
{
|
||||
if (maximum < fabs (ptr->KCLcurrent))
|
||||
maximum = fabs (ptr->KCLcurrent) ;
|
||||
|
||||
#ifdef STEPDEBUG
|
||||
fprintf (stderr, "Index KCL Array: %d\tValue: %-.9g\tMaximum: %-.9g\n", j, fabs (ptr->KCLcurrent), maximum) ;
|
||||
j++ ;
|
||||
#endif
|
||||
|
||||
ptr = ptr->next ;
|
||||
}
|
||||
|
||||
#ifdef STEPDEBUG
|
||||
fprintf (stderr, "Index: %d\tValue: %-.9g\tThreshold: %-.9g\tMaximum: %-.9g\n", i, fabs (ckt->CKTfvk [i]),
|
||||
ckt->CKTreltol * maximum + ckt->CKTabstol, maximum) ;
|
||||
#endif
|
||||
|
||||
if (fabs (ckt->CKTfvk [i]) > (ckt->CKTreltol * maximum + ckt->CKTabstol))
|
||||
return 1 ;
|
||||
#endif
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -22,7 +22,8 @@ int
|
|||
NIreinit( CKTcircuit *ckt)
|
||||
{
|
||||
int size;
|
||||
#ifdef PREDICTOR
|
||||
|
||||
#if defined(PREDICTOR) || defined(KIRCHHOFF)
|
||||
int i;
|
||||
#endif
|
||||
|
||||
|
|
@ -33,6 +34,20 @@ NIreinit( CKTcircuit *ckt)
|
|||
CKALLOC(CKTirhs,size+1,double);
|
||||
CKALLOC(CKTirhsOld,size+1,double);
|
||||
CKALLOC(CKTirhsSpare,size+1,double);
|
||||
|
||||
#ifdef KIRCHHOFF
|
||||
CKALLOC(CKTfvk,size+1,double);
|
||||
CKALLOC(CKTnodeIsLinear,size+1,int);
|
||||
for (i = 0 ; i <= size ; i++)
|
||||
ckt->CKTnodeIsLinear [i] = 1 ;
|
||||
CKALLOC(CKTvoltCurNode,size+1,int);
|
||||
for (i = 0 ; i <= size ; i++)
|
||||
ckt->CKTvoltCurNode [i] = 0 ;
|
||||
CKALLOC(CKTmkCurKCLarray,size+1,CKTmkCurKCLnode*);
|
||||
for (i = 0 ; i <= size ; i++)
|
||||
ckt->CKTmkCurKCLarray [i] = NULL ;
|
||||
#endif
|
||||
|
||||
#ifdef PREDICTOR
|
||||
CKALLOC(CKTpred,size+1,double);
|
||||
for( i=0;i<8;i++) {
|
||||
|
|
|
|||
|
|
@ -190,7 +190,7 @@ spCreate(int Size, int Complex, int *pError)
|
|||
Matrix->ElementsRemaining = 0;
|
||||
Matrix->FillinsRemaining = 0;
|
||||
|
||||
RecordAllocation( Matrix, (void *)Matrix );
|
||||
RecordAllocation( Matrix, Matrix );
|
||||
if (Matrix->Error == spNO_MEMORY) goto MemoryError;
|
||||
|
||||
/* Take out the trash. */
|
||||
|
|
@ -311,7 +311,7 @@ spcGetElement(MatrixPtr Matrix)
|
|||
/* Allocate block of MatrixElements if necessary. */
|
||||
if (Matrix->ElementsRemaining == 0) {
|
||||
pElements = SP_MALLOC(struct MatrixElement, ELEMENTS_PER_ALLOCATION);
|
||||
RecordAllocation( Matrix, (void *)pElements );
|
||||
RecordAllocation( Matrix, pElements );
|
||||
if (Matrix->Error == spNO_MEMORY) return NULL;
|
||||
Matrix->ElementsRemaining = ELEMENTS_PER_ALLOCATION;
|
||||
Matrix->NextAvailElement = pElements;
|
||||
|
|
@ -331,14 +331,14 @@ spcGetElement(MatrixPtr Matrix)
|
|||
} else {
|
||||
/* Allocate block of elements. */
|
||||
pElements = SP_MALLOC(struct MatrixElement, ELEMENTS_PER_ALLOCATION);
|
||||
RecordAllocation( Matrix, (void *)pElements );
|
||||
RecordAllocation( Matrix, pElements );
|
||||
if (Matrix->Error == spNO_MEMORY) return NULL;
|
||||
Matrix->ElementsRemaining = ELEMENTS_PER_ALLOCATION;
|
||||
Matrix->NextAvailElement = pElements;
|
||||
|
||||
/* Allocate an element list structure. */
|
||||
pListNode->Next = SP_MALLOC(struct ElementListNodeStruct,1);
|
||||
RecordAllocation( Matrix, (void *)pListNode->Next );
|
||||
RecordAllocation( Matrix, pListNode->Next );
|
||||
if (Matrix->Error == spNO_MEMORY)
|
||||
return NULL;
|
||||
Matrix->LastElementListNode = pListNode = pListNode->Next;
|
||||
|
|
@ -402,14 +402,14 @@ InitializeElementBlocks(MatrixPtr Matrix, int InitialNumberOfElements,
|
|||
|
||||
/* Allocate block of MatrixElements for elements. */
|
||||
pElement = SP_MALLOC(struct MatrixElement, InitialNumberOfElements);
|
||||
RecordAllocation( Matrix, (void *)pElement );
|
||||
RecordAllocation( Matrix, pElement );
|
||||
if (Matrix->Error == spNO_MEMORY) return;
|
||||
Matrix->ElementsRemaining = InitialNumberOfElements;
|
||||
Matrix->NextAvailElement = pElement;
|
||||
|
||||
/* Allocate an element list structure. */
|
||||
Matrix->FirstElementListNode = SP_MALLOC(struct ElementListNodeStruct,1);
|
||||
RecordAllocation( Matrix, (void *)Matrix->FirstElementListNode );
|
||||
RecordAllocation( Matrix, Matrix->FirstElementListNode );
|
||||
if (Matrix->Error == spNO_MEMORY) return;
|
||||
Matrix->LastElementListNode = Matrix->FirstElementListNode;
|
||||
|
||||
|
|
@ -420,14 +420,14 @@ InitializeElementBlocks(MatrixPtr Matrix, int InitialNumberOfElements,
|
|||
|
||||
/* Allocate block of MatrixElements for fill-ins. */
|
||||
pElement = SP_MALLOC(struct MatrixElement, NumberOfFillinsExpected);
|
||||
RecordAllocation( Matrix, (void *)pElement );
|
||||
RecordAllocation( Matrix, pElement );
|
||||
if (Matrix->Error == spNO_MEMORY) return;
|
||||
Matrix->FillinsRemaining = NumberOfFillinsExpected;
|
||||
Matrix->NextAvailFillin = pElement;
|
||||
|
||||
/* Allocate a fill-in list structure. */
|
||||
Matrix->FirstFillinListNode = SP_MALLOC(struct FillinListNodeStruct,1);
|
||||
RecordAllocation( Matrix, (void *)Matrix->FirstFillinListNode );
|
||||
RecordAllocation( Matrix, Matrix->FirstFillinListNode );
|
||||
if (Matrix->Error == spNO_MEMORY) return;
|
||||
Matrix->LastFillinListNode = Matrix->FirstFillinListNode;
|
||||
|
||||
|
|
@ -487,14 +487,14 @@ spcGetFillin(MatrixPtr Matrix)
|
|||
} else {
|
||||
/* Allocate block of fill-ins. */
|
||||
pFillins = SP_MALLOC(struct MatrixElement, ELEMENTS_PER_ALLOCATION);
|
||||
RecordAllocation( Matrix, (void *)pFillins );
|
||||
RecordAllocation( Matrix, pFillins );
|
||||
if (Matrix->Error == spNO_MEMORY) return NULL;
|
||||
Matrix->FillinsRemaining = ELEMENTS_PER_ALLOCATION;
|
||||
Matrix->NextAvailFillin = pFillins;
|
||||
|
||||
/* Allocate a fill-in list structure. */
|
||||
pListNode->Next = SP_MALLOC(struct FillinListNodeStruct,1);
|
||||
RecordAllocation( Matrix, (void *)pListNode->Next );
|
||||
RecordAllocation( Matrix, pListNode->Next );
|
||||
if (Matrix->Error == spNO_MEMORY) return NULL;
|
||||
Matrix->LastFillinListNode = pListNode = pListNode->Next;
|
||||
|
||||
|
|
@ -646,9 +646,8 @@ AllocateBlockOfAllocationList(MatrixPtr Matrix)
|
|||
*/
|
||||
|
||||
void
|
||||
spDestroy(MatrixPtr eMatrix)
|
||||
spDestroy(MatrixPtr Matrix)
|
||||
{
|
||||
MatrixPtr Matrix = eMatrix;
|
||||
AllocationListPtr ListPtr, NextListPtr;
|
||||
|
||||
|
||||
|
|
@ -701,16 +700,16 @@ spDestroy(MatrixPtr eMatrix)
|
|||
* The error status of the given matrix.
|
||||
*
|
||||
* >>> Arguments:
|
||||
* eMatrix <input> (void *)
|
||||
* Matrix <input> (void *)
|
||||
* The matrix for which the error status is desired. */
|
||||
int
|
||||
spError(MatrixPtr eMatrix )
|
||||
spError(MatrixPtr Matrix )
|
||||
{
|
||||
/* Begin `spError'. */
|
||||
|
||||
if (eMatrix != NULL) {
|
||||
assert(eMatrix->ID == SPARSE_ID);
|
||||
return eMatrix->Error;
|
||||
if (Matrix != NULL) {
|
||||
assert(Matrix->ID == SPARSE_ID);
|
||||
return Matrix->Error;
|
||||
} else {
|
||||
/* This error may actually be spPANIC, no way to tell. */
|
||||
return spNO_MEMORY;
|
||||
|
|
@ -732,7 +731,7 @@ spError(MatrixPtr eMatrix )
|
|||
* detected as singular or where a zero was detected on the diagonal.
|
||||
*
|
||||
* >>> Arguments:
|
||||
* eMatrix <input> (void *)
|
||||
* Matrix <input> (void *)
|
||||
* The matrix for which the error status is desired.
|
||||
* pRow <output> (int *)
|
||||
* The row number.
|
||||
|
|
@ -741,10 +740,8 @@ spError(MatrixPtr eMatrix )
|
|||
*/
|
||||
|
||||
void
|
||||
spWhereSingular(MatrixPtr eMatrix, int *pRow, int *pCol)
|
||||
spWhereSingular(MatrixPtr Matrix, int *pRow, int *pCol)
|
||||
{
|
||||
MatrixPtr Matrix = eMatrix;
|
||||
|
||||
/* Begin `spWhereSingular'. */
|
||||
assert( IS_SPARSE( Matrix ) );
|
||||
|
||||
|
|
@ -769,7 +766,7 @@ spWhereSingular(MatrixPtr eMatrix, int *pRow, int *pCol)
|
|||
* the matrix is returned.
|
||||
*
|
||||
* >>> Arguments:
|
||||
* eMatrix <input> (void *)
|
||||
* Matrix <input> (void *)
|
||||
* Pointer to matrix.
|
||||
* External <input> (int)
|
||||
* If External is set TRUE, the external size , i.e., the value of the
|
||||
|
|
@ -779,10 +776,8 @@ spWhereSingular(MatrixPtr eMatrix, int *pRow, int *pCol)
|
|||
*/
|
||||
|
||||
int
|
||||
spGetSize(MatrixPtr eMatrix, int External)
|
||||
spGetSize(MatrixPtr Matrix, int External)
|
||||
{
|
||||
MatrixPtr Matrix = eMatrix;
|
||||
|
||||
/* Begin `spGetSize'. */
|
||||
assert( IS_SPARSE( Matrix ) );
|
||||
|
||||
|
|
@ -809,28 +804,28 @@ spGetSize(MatrixPtr eMatrix, int External)
|
|||
* Forces matrix to be either real or complex.
|
||||
*
|
||||
* >>> Arguments:
|
||||
* eMatrix <input> (void *)
|
||||
* Matrix <input> (void *)
|
||||
* Pointer to matrix.
|
||||
*/
|
||||
|
||||
void
|
||||
spSetReal(MatrixPtr eMatrix)
|
||||
spSetReal(MatrixPtr Matrix)
|
||||
{
|
||||
/* Begin `spSetReal'. */
|
||||
|
||||
assert( IS_SPARSE( eMatrix ));
|
||||
eMatrix->Complex = NO;
|
||||
assert( IS_SPARSE( Matrix ));
|
||||
Matrix->Complex = NO;
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
spSetComplex(MatrixPtr eMatrix)
|
||||
spSetComplex(MatrixPtr Matrix)
|
||||
{
|
||||
/* Begin `spSetComplex'. */
|
||||
|
||||
assert( IS_SPARSE( eMatrix ));
|
||||
eMatrix->Complex = YES;
|
||||
assert( IS_SPARSE( Matrix ));
|
||||
Matrix->Complex = YES;
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
@ -850,34 +845,34 @@ spSetComplex(MatrixPtr eMatrix)
|
|||
* of original elements can be returned.
|
||||
*
|
||||
* >>> Arguments:
|
||||
* eMatrix <input> (void *)
|
||||
* Matrix <input> (void *)
|
||||
* Pointer to matrix.
|
||||
*/
|
||||
|
||||
int
|
||||
spFillinCount(MatrixPtr eMatrix)
|
||||
spFillinCount(MatrixPtr Matrix)
|
||||
{
|
||||
/* Begin `spFillinCount'. */
|
||||
|
||||
assert( IS_SPARSE( eMatrix ) );
|
||||
return eMatrix->Fillins;
|
||||
assert( IS_SPARSE( Matrix ) );
|
||||
return Matrix->Fillins;
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
spElementCount(MatrixPtr eMatrix)
|
||||
spElementCount(MatrixPtr Matrix)
|
||||
{
|
||||
/* Begin `spElementCount'. */
|
||||
|
||||
assert( IS_SPARSE( eMatrix ) );
|
||||
return eMatrix->Elements;
|
||||
assert( IS_SPARSE( Matrix ) );
|
||||
return Matrix->Elements;
|
||||
}
|
||||
|
||||
int
|
||||
spOriginalCount(MatrixPtr eMatrix)
|
||||
spOriginalCount(MatrixPtr Matrix)
|
||||
{
|
||||
/* Begin `spOriginalCount'. */
|
||||
|
||||
assert( IS_SPARSE( eMatrix ) );
|
||||
return eMatrix->Originals;
|
||||
assert( IS_SPARSE( Matrix ) );
|
||||
return Matrix->Originals;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -93,9 +93,8 @@ static void ExpandTranslationArrays( MatrixPtr, int );
|
|||
*/
|
||||
|
||||
void
|
||||
spClear(MatrixPtr eMatrix)
|
||||
spClear(MatrixPtr Matrix)
|
||||
{
|
||||
MatrixPtr Matrix = eMatrix;
|
||||
ElementPtr pElement;
|
||||
int I;
|
||||
|
||||
|
|
@ -180,10 +179,9 @@ spClear(MatrixPtr eMatrix)
|
|||
*/
|
||||
|
||||
RealNumber *
|
||||
spFindElement(MatrixPtr eMatrix, int Row, int Col)
|
||||
spFindElement(MatrixPtr Matrix, int Row, int Col)
|
||||
{
|
||||
MatrixPtr Matrix = eMatrix;
|
||||
RealNumber *pElement;
|
||||
ElementPtr pElement;
|
||||
|
||||
/* Begin `spFindElement'. */
|
||||
assert( IS_SPARSE( Matrix ) && Row >= 0 && Col >= 0 );
|
||||
|
|
@ -210,7 +208,7 @@ RealNumber *pElement;
|
|||
* is the first record in the MatrixElement structure.
|
||||
*/
|
||||
|
||||
if ((Row != Col) || ((pElement = (RealNumber *)Matrix->Diag[Row]) == NULL))
|
||||
if ((Row != Col) || ((pElement = Matrix->Diag[Row]) == NULL))
|
||||
{
|
||||
/*
|
||||
* Element does not exist or does not reside along diagonal. Search
|
||||
|
|
@ -218,11 +216,11 @@ RealNumber *pElement;
|
|||
* element which is returned by spcFindElementInCol is cast into a
|
||||
* pointer to Real, a RealNumber.
|
||||
*/
|
||||
pElement = (RealNumber*)spcFindElementInCol( Matrix,
|
||||
pElement = spcFindElementInCol( Matrix,
|
||||
&(Matrix->FirstInCol[Col]),
|
||||
Row, Col, NO );
|
||||
}
|
||||
return pElement;
|
||||
return & pElement->Real;
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -263,10 +261,9 @@ RealNumber *pElement;
|
|||
*/
|
||||
|
||||
RealNumber *
|
||||
spGetElement(MatrixPtr eMatrix, int Row, int Col)
|
||||
spGetElement(MatrixPtr Matrix, int Row, int Col)
|
||||
{
|
||||
MatrixPtr Matrix = eMatrix;
|
||||
RealNumber *pElement;
|
||||
ElementPtr pElement;
|
||||
|
||||
/* Begin `spGetElement'. */
|
||||
assert( IS_SPARSE( Matrix ) && Row >= 0 && Col >= 0 );
|
||||
|
|
@ -305,18 +302,18 @@ spGetElement(MatrixPtr eMatrix, int Row, int Col)
|
|||
* statement depends on the fact that Real is the first record in
|
||||
* the MatrixElement structure. */
|
||||
|
||||
if ((Row != Col) || ((pElement = (RealNumber *)Matrix->Diag[Row]) == NULL))
|
||||
if ((Row != Col) || ((pElement = Matrix->Diag[Row]) == NULL))
|
||||
{
|
||||
/* Element does not exist or does not reside along diagonal.
|
||||
* Search column for element. As in the if statement above,
|
||||
* the pointer to the element which is returned by
|
||||
* spcFindElementInCol is cast into a pointer to Real, a
|
||||
* RealNumber. */
|
||||
pElement = (RealNumber*)spcFindElementInCol( Matrix,
|
||||
pElement = spcFindElementInCol( Matrix,
|
||||
&(Matrix->FirstInCol[Col]),
|
||||
Row, Col, YES );
|
||||
}
|
||||
return pElement;
|
||||
return & pElement->Real;
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -644,7 +641,7 @@ spGetQuad(MatrixPtr Matrix, int Row1, int Row2, int Col1, int Col2,
|
|||
(Template->Element4Negated == NULL))
|
||||
return spNO_MEMORY;
|
||||
|
||||
if (Template->Element1 == &((MatrixPtr)Matrix)->TrashCan.Real)
|
||||
if (Template->Element1 == & Matrix->TrashCan.Real)
|
||||
SWAP( RealNumber *, Template->Element1, Template->Element2 );
|
||||
|
||||
return spOKAY;
|
||||
|
|
@ -1145,9 +1142,8 @@ spGetInitInfo(RealNumber *pElement)
|
|||
|
||||
|
||||
int
|
||||
spInitialize(MatrixPtr eMatrix, int (*pInit)(RealNumber*, void *InitInfo, int , int Col))
|
||||
spInitialize(MatrixPtr Matrix, int (*pInit)(RealNumber*, void *InitInfo, int , int Col))
|
||||
{
|
||||
MatrixPtr Matrix = eMatrix;
|
||||
ElementPtr pElement;
|
||||
int J, Error, Col;
|
||||
|
||||
|
|
@ -1182,7 +1178,7 @@ spInitialize(MatrixPtr eMatrix, int (*pInit)(RealNumber*, void *InitInfo, int ,
|
|||
}
|
||||
else
|
||||
{
|
||||
Error = pInit ((RealNumber *)pElement, pElement->pInitInfo,
|
||||
Error = pInit (& pElement->Real, pElement->pInitInfo,
|
||||
Matrix->IntToExtRowMap[pElement->Row], Col);
|
||||
if (Error)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -189,10 +189,9 @@ static int ZeroPivot( MatrixPtr, int );
|
|||
*/
|
||||
|
||||
int
|
||||
spOrderAndFactor(MatrixPtr eMatrix, RealNumber RHS[], RealNumber RelThreshold,
|
||||
spOrderAndFactor(MatrixPtr Matrix, RealNumber RHS[], RealNumber RelThreshold,
|
||||
RealNumber AbsThreshold, int DiagPivoting)
|
||||
{
|
||||
MatrixPtr Matrix = eMatrix;
|
||||
ElementPtr pPivot;
|
||||
int Step, Size, ReorderingRequired;
|
||||
RealNumber LargestInCol;
|
||||
|
|
@ -321,9 +320,8 @@ Done:
|
|||
* Error is cleared in this function. */
|
||||
|
||||
int
|
||||
spFactor(MatrixPtr eMatrix)
|
||||
spFactor(MatrixPtr Matrix)
|
||||
{
|
||||
MatrixPtr Matrix = eMatrix;
|
||||
ElementPtr pElement;
|
||||
ElementPtr pColumn;
|
||||
int Step, Size;
|
||||
|
|
@ -333,10 +331,10 @@ spFactor(MatrixPtr eMatrix)
|
|||
assert( IS_VALID(Matrix) && !Matrix->Factored);
|
||||
|
||||
if (Matrix->NeedsOrdering) {
|
||||
return spOrderAndFactor( eMatrix, NULL,
|
||||
return spOrderAndFactor( Matrix, NULL,
|
||||
0.0, 0.0, DIAG_PIVOTING_AS_DEFAULT );
|
||||
}
|
||||
if (!Matrix->Partitioned) spPartition( eMatrix, spDEFAULT_PARTITION );
|
||||
if (!Matrix->Partitioned) spPartition( Matrix, spDEFAULT_PARTITION );
|
||||
if (Matrix->Complex)
|
||||
return FactorComplexMatrix( Matrix );
|
||||
|
||||
|
|
@ -569,9 +567,8 @@ FactorComplexMatrix( MatrixPtr Matrix )
|
|||
* spINDIRECT_PARTITION, or spAUTO_PARTITION. */
|
||||
|
||||
void
|
||||
spPartition(MatrixPtr eMatrix, int Mode)
|
||||
spPartition(MatrixPtr Matrix, int Mode)
|
||||
{
|
||||
MatrixPtr Matrix = eMatrix;
|
||||
ElementPtr pElement, pColumn;
|
||||
int Step, Size;
|
||||
int *Nc, *No, *Nm;
|
||||
|
|
@ -603,8 +600,8 @@ spPartition(MatrixPtr eMatrix, int Mode)
|
|||
assert( Mode == spAUTO_PARTITION );
|
||||
|
||||
/* Otherwise, count all operations needed in when factoring matrix. */
|
||||
Nc = (int *)Matrix->MarkowitzRow;
|
||||
No = (int *)Matrix->MarkowitzCol;
|
||||
Nc = Matrix->MarkowitzRow;
|
||||
No = Matrix->MarkowitzCol;
|
||||
Nm = (int *)Matrix->MarkowitzProd;
|
||||
|
||||
/* Start mock-factorization. */
|
||||
|
|
|
|||
|
|
@ -133,9 +133,8 @@ int Printer_Width = PRINTER_WIDTH;
|
|||
*/
|
||||
|
||||
void
|
||||
spPrint(MatrixPtr eMatrix, int PrintReordered, int Data, int Header)
|
||||
spPrint(MatrixPtr Matrix, int PrintReordered, int Data, int Header)
|
||||
{
|
||||
MatrixPtr Matrix = eMatrix;
|
||||
int J = 0;
|
||||
int I, Row, Col, Size, Top;
|
||||
int StartCol = 1, StopCol, Columns, ElementCount = 0;
|
||||
|
|
@ -295,7 +294,7 @@ spPrint(MatrixPtr eMatrix, int PrintReordered, int Data, int Header)
|
|||
{
|
||||
/* Case where element exists */
|
||||
if (Data)
|
||||
printf(" %9.3g", (double)pElement->Real);
|
||||
printf(" %9.3g", pElement->Real);
|
||||
else
|
||||
putchar('x');
|
||||
|
||||
|
|
@ -326,7 +325,7 @@ spPrint(MatrixPtr eMatrix, int PrintReordered, int Data, int Header)
|
|||
if (pImagElements[J - StartCol] != NULL)
|
||||
{
|
||||
printf(" %8.2gj",
|
||||
(double)pImagElements[J-StartCol]->Imag);
|
||||
pImagElements[J-StartCol]->Imag);
|
||||
}
|
||||
else printf(" ");
|
||||
}
|
||||
|
|
@ -436,10 +435,9 @@ spPrint(MatrixPtr eMatrix, int PrintReordered, int Data, int Header)
|
|||
*/
|
||||
|
||||
int
|
||||
spFileMatrix(MatrixPtr eMatrix, char *File, char *Label, int Reordered,
|
||||
spFileMatrix(MatrixPtr Matrix, char *File, char *Label, int Reordered,
|
||||
int Data, int Header)
|
||||
{
|
||||
MatrixPtr Matrix = eMatrix;
|
||||
int I, Size;
|
||||
ElementPtr pElement;
|
||||
int Row, Col, Err;
|
||||
|
|
@ -518,7 +516,7 @@ spFileMatrix(MatrixPtr eMatrix, char *File, char *Label, int Reordered,
|
|||
}
|
||||
Err = fprintf
|
||||
( pMatrixFile,"%d\t%d\t%-.15g\t%-.15g\n",
|
||||
Row, Col, (double)pElement->Real, (double)pElement->Imag
|
||||
Row, Col, pElement->Real, pElement->Imag
|
||||
);
|
||||
if (Err < 0) return 0;
|
||||
pElement = pElement->NextInCol;
|
||||
|
|
@ -541,7 +539,7 @@ spFileMatrix(MatrixPtr eMatrix, char *File, char *Label, int Reordered,
|
|||
Col = Matrix->IntToExtColMap[I];
|
||||
Err = fprintf
|
||||
( pMatrixFile,"%d\t%d\t%-.15g\n",
|
||||
Row, Col, (double)pElement->Real
|
||||
Row, Col, pElement->Real
|
||||
);
|
||||
if (Err < 0) return 0;
|
||||
pElement = pElement->NextInCol;
|
||||
|
|
@ -595,9 +593,8 @@ spFileMatrix(MatrixPtr eMatrix, char *File, char *Label, int Reordered,
|
|||
*/
|
||||
|
||||
int
|
||||
spFileVector(MatrixPtr eMatrix, char *File, RealVector RHS, RealVector iRHS)
|
||||
spFileVector(MatrixPtr Matrix, char *File, RealVector RHS, RealVector iRHS)
|
||||
{
|
||||
MatrixPtr Matrix = eMatrix;
|
||||
int I, Size, Err;
|
||||
FILE *pMatrixFile;
|
||||
|
||||
|
|
@ -621,7 +618,7 @@ spFileVector(MatrixPtr eMatrix, char *File, RealVector RHS, RealVector iRHS)
|
|||
{
|
||||
Err = fprintf
|
||||
( pMatrixFile, "%-.15g\t%-.15g\n",
|
||||
(double)RHS[I], (double)iRHS[I]
|
||||
RHS[I], iRHS[I]
|
||||
);
|
||||
if (Err < 0) return 0;
|
||||
}
|
||||
|
|
@ -630,7 +627,7 @@ spFileVector(MatrixPtr eMatrix, char *File, RealVector RHS, RealVector iRHS)
|
|||
{
|
||||
for (I = 1; I <= Size; I++)
|
||||
{
|
||||
if (fprintf(pMatrixFile, "%-.15g\n", (double)RHS[I]) < 0)
|
||||
if (fprintf(pMatrixFile, "%-.15g\n", RHS[I]) < 0)
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
|
@ -686,9 +683,8 @@ spFileVector(MatrixPtr eMatrix, char *File, RealVector RHS, RealVector iRHS)
|
|||
*/
|
||||
|
||||
int
|
||||
spFileStats(MatrixPtr eMatrix, char *File, char *Label)
|
||||
spFileStats(MatrixPtr Matrix, char *File, char *Label)
|
||||
{
|
||||
MatrixPtr Matrix = eMatrix;
|
||||
int Size, I;
|
||||
ElementPtr pElement;
|
||||
int NumberOfElements;
|
||||
|
|
|
|||
|
|
@ -106,7 +106,7 @@ extern double scalbn(double, int);
|
|||
extern double logb(double);
|
||||
#endif
|
||||
|
||||
static void LoadGmin(SMPmatrix *eMatrix, double Gmin);
|
||||
static void LoadGmin(SMPmatrix *Matrix, double Gmin);
|
||||
|
||||
/*
|
||||
* SMPaddElt()
|
||||
|
|
@ -183,7 +183,7 @@ SMPcReorder(SMPmatrix *Matrix, double PivTol, double PivRel,
|
|||
*NumSwaps = 1;
|
||||
spSetComplex( Matrix->SPmatrix );
|
||||
return spOrderAndFactor( Matrix->SPmatrix, NULL,
|
||||
(spREAL)PivRel, (spREAL)PivTol, YES );
|
||||
PivRel, PivTol, YES );
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
@ -195,7 +195,7 @@ SMPreorder(SMPmatrix *Matrix, double PivTol, double PivRel, double Gmin)
|
|||
spSetReal( Matrix->SPmatrix );
|
||||
LoadGmin( Matrix, Gmin );
|
||||
return spOrderAndFactor( Matrix->SPmatrix, NULL,
|
||||
(spREAL)PivRel, (spREAL)PivTol, YES );
|
||||
PivRel, PivTol, YES );
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
|||
|
|
@ -124,10 +124,9 @@ static void SolveComplexTransposedMatrix( MatrixPtr,
|
|||
/*VARARGS3*/
|
||||
|
||||
void
|
||||
spSolve(MatrixPtr eMatrix, RealVector RHS, RealVector Solution,
|
||||
spSolve(MatrixPtr Matrix, RealVector RHS, RealVector Solution,
|
||||
RealVector iRHS, RealVector iSolution)
|
||||
{
|
||||
MatrixPtr Matrix = eMatrix;
|
||||
ElementPtr pElement;
|
||||
RealVector Intermediate;
|
||||
RealNumber Temp;
|
||||
|
|
@ -400,10 +399,9 @@ SolveComplexMatrix( MatrixPtr Matrix, RealVector RHS, RealVector Solution , Real
|
|||
/*VARARGS3*/
|
||||
|
||||
void
|
||||
spSolveTransposed(MatrixPtr eMatrix, RealVector RHS, RealVector Solution,
|
||||
spSolveTransposed(MatrixPtr Matrix, RealVector RHS, RealVector Solution,
|
||||
RealVector iRHS, RealVector iSolution)
|
||||
{
|
||||
MatrixPtr Matrix = eMatrix;
|
||||
ElementPtr pElement;
|
||||
RealVector Intermediate;
|
||||
int I, *pExtOrder, Size;
|
||||
|
|
|
|||
|
|
@ -151,7 +151,7 @@ static void ComplexTransposedMatrixMultiply( MatrixPtr, RealVector, RealVector,
|
|||
* Tom Quarles.
|
||||
*
|
||||
* >>> Arguments:
|
||||
* eMatrix <input> (char *)
|
||||
* Matrix <input> (char *)
|
||||
* Pointer to the matrix to be preordered.
|
||||
*
|
||||
* >>> Local variables;
|
||||
|
|
@ -174,9 +174,8 @@ static void ComplexTransposedMatrixMultiply( MatrixPtr, RealVector, RealVector,
|
|||
*/
|
||||
|
||||
void
|
||||
spMNA_Preorder(MatrixPtr eMatrix)
|
||||
spMNA_Preorder(MatrixPtr Matrix)
|
||||
{
|
||||
MatrixPtr Matrix = eMatrix;
|
||||
int J, Size;
|
||||
ElementPtr pTwin1, pTwin2;
|
||||
int Twins, StartAt = 1;
|
||||
|
|
@ -346,7 +345,7 @@ SwapCols( MatrixPtr Matrix, ElementPtr pTwin1, ElementPtr pTwin2 )
|
|||
* should not be executed before the function spMNA_Preorder.
|
||||
*
|
||||
* >>> Arguments:
|
||||
* eMatrix <input> (char *)
|
||||
* Matrix <input> (char *)
|
||||
* Pointer to the matrix to be scaled.
|
||||
* SolutionScaleFactors <input> (RealVector)
|
||||
* The array of Solution scale factors. These factors scale the columns.
|
||||
|
|
@ -368,9 +367,8 @@ SwapCols( MatrixPtr Matrix, ElementPtr pTwin1, ElementPtr pTwin2 )
|
|||
*/
|
||||
|
||||
void
|
||||
spScale(MatrixPtr eMatrix, RealVector RHS_ScaleFactors, RealVector SolutionScaleFactors)
|
||||
spScale(MatrixPtr Matrix, RealVector RHS_ScaleFactors, RealVector SolutionScaleFactors)
|
||||
{
|
||||
MatrixPtr Matrix = eMatrix;
|
||||
ElementPtr pElement;
|
||||
int I, lSize, *pExtOrder;
|
||||
RealNumber ScaleFactor;
|
||||
|
|
@ -556,7 +554,7 @@ MatrixPtr Matrix;
|
|||
* before spMNA_Preorder().
|
||||
*
|
||||
* >>> Arguments:
|
||||
* eMatrix <input> (char *)
|
||||
* Matrix <input> (char *)
|
||||
* Pointer to the matrix.
|
||||
* RHS <output> (RealVector)
|
||||
* RHS is the right hand side. This is what is being solved for.
|
||||
|
|
@ -571,14 +569,13 @@ MatrixPtr Matrix;
|
|||
*/
|
||||
|
||||
void
|
||||
spMultiply(MatrixPtr eMatrix, RealVector RHS, RealVector Solution,
|
||||
spMultiply(MatrixPtr Matrix, RealVector RHS, RealVector Solution,
|
||||
RealVector iRHS, RealVector iSolution)
|
||||
{
|
||||
ElementPtr pElement;
|
||||
RealVector Vector;
|
||||
RealNumber Sum;
|
||||
int I, *pExtOrder;
|
||||
MatrixPtr Matrix = eMatrix;
|
||||
|
||||
/* Begin `spMultiply'. */
|
||||
assert( IS_SPARSE( Matrix ) && !Matrix->Factored );
|
||||
|
|
@ -702,7 +699,7 @@ ComplexMatrixMultiply( MatrixPtr Matrix, RealVector RHS, RealVector Solution , R
|
|||
* before spMNA_Preorder().
|
||||
*
|
||||
* >>> Arguments:
|
||||
* eMatrix <input> (char *)
|
||||
* Matrix <input> (char *)
|
||||
* Pointer to the matrix.
|
||||
* RHS <output> (RealVector)
|
||||
* RHS is the right hand side. This is what is being solved for.
|
||||
|
|
@ -717,14 +714,13 @@ ComplexMatrixMultiply( MatrixPtr Matrix, RealVector RHS, RealVector Solution , R
|
|||
*/
|
||||
|
||||
void
|
||||
spMultTransposed(MatrixPtr eMatrix, RealVector RHS, RealVector Solution,
|
||||
spMultTransposed(MatrixPtr Matrix, RealVector RHS, RealVector Solution,
|
||||
RealVector iRHS, RealVector iSolution)
|
||||
{
|
||||
ElementPtr pElement;
|
||||
RealVector Vector;
|
||||
RealNumber Sum;
|
||||
int I, *pExtOrder;
|
||||
MatrixPtr Matrix = eMatrix;
|
||||
|
||||
/* Begin `spMultTransposed'. */
|
||||
assert( IS_SPARSE( Matrix ) && !Matrix->Factored );
|
||||
|
|
@ -854,7 +850,7 @@ ComplexTransposedMatrixMultiply( MatrixPtr Matrix, RealVector RHS, RealVector So
|
|||
* reasonable value and the logarithm of the scale factor is returned.
|
||||
*
|
||||
* >>> Arguments:
|
||||
* eMatrix <input> (char *)
|
||||
* Matrix <input> (char *)
|
||||
* A pointer to the matrix for which the determinant is desired.
|
||||
* pExponent <output> (int *)
|
||||
* The logarithm base 10 of the scale factor for the determinant. To find
|
||||
|
|
@ -878,10 +874,9 @@ ComplexTransposedMatrixMultiply( MatrixPtr Matrix, RealVector RHS, RealVector So
|
|||
*/
|
||||
|
||||
void
|
||||
spDeterminant(MatrixPtr eMatrix, int *pExponent, RealNumber *pDeterminant,
|
||||
spDeterminant(MatrixPtr Matrix, int *pExponent, RealNumber *pDeterminant,
|
||||
RealNumber *piDeterminant)
|
||||
{
|
||||
MatrixPtr Matrix = eMatrix;
|
||||
int I, Size;
|
||||
RealNumber Norm, nr, ni;
|
||||
ComplexNumber Pivot, cDeterminant;
|
||||
|
|
@ -1037,9 +1032,8 @@ spDeterminant(MatrixPtr eMatrix, int *pExponent, RealNumber *pDeterminant,
|
|||
*/
|
||||
|
||||
void
|
||||
spStripFills(MatrixPtr eMatrix)
|
||||
spStripFills(MatrixPtr Matrix)
|
||||
{
|
||||
MatrixPtr Matrix = eMatrix;
|
||||
struct FillinListNodeStruct *pListNode;
|
||||
|
||||
/* Begin `spStripFills'. */
|
||||
|
|
@ -1109,10 +1103,8 @@ spStripFills(MatrixPtr eMatrix)
|
|||
* frame. This assumes that the matrix will be replaced with one of
|
||||
* the same size. */
|
||||
void
|
||||
spStripMatrix(MatrixPtr eMatrix)
|
||||
spStripMatrix(MatrixPtr Matrix)
|
||||
{
|
||||
MatrixPtr Matrix = eMatrix;
|
||||
|
||||
/* Begin `spStripMatrix'. */
|
||||
assert( IS_SPARSE( Matrix ) );
|
||||
if (Matrix->Elements == 0) return;
|
||||
|
|
@ -1124,7 +1116,6 @@ spStripMatrix(MatrixPtr eMatrix)
|
|||
|
||||
/* Reset the element lists. */
|
||||
{
|
||||
ElementPtr pElement;
|
||||
struct ElementListNodeStruct *pListNode;
|
||||
|
||||
pListNode = Matrix->LastElementListNode = Matrix->FirstElementListNode;
|
||||
|
|
@ -1134,7 +1125,6 @@ spStripMatrix(MatrixPtr eMatrix)
|
|||
|
||||
/* Reset the fill-in lists. */
|
||||
{
|
||||
ElementPtr pFillin;
|
||||
struct FillinListNodeStruct *pListNode;
|
||||
|
||||
pListNode = Matrix->LastFillinListNode = Matrix->FirstFillinListNode;
|
||||
|
|
@ -1171,7 +1161,7 @@ spStripMatrix(MatrixPtr eMatrix)
|
|||
* doesn't exist.
|
||||
*
|
||||
* >>> Arguments:
|
||||
* eMatrix <input> (char *)
|
||||
* Matrix <input> (char *)
|
||||
* Pointer to the matrix in which the row and column are to be deleted.
|
||||
* Row <input> (int)
|
||||
* Row to be deleted.
|
||||
|
|
@ -1197,9 +1187,8 @@ spStripMatrix(MatrixPtr eMatrix)
|
|||
*/
|
||||
|
||||
void
|
||||
spDeleteRowAndCol(MatrixPtr eMatrix, int Row, int Col)
|
||||
spDeleteRowAndCol(MatrixPtr Matrix, int Row, int Col)
|
||||
{
|
||||
MatrixPtr Matrix = eMatrix;
|
||||
ElementPtr pElement, *ppElement, pLastElement;
|
||||
int Size, ExtRow, ExtCol;
|
||||
ElementPtr spcFindElementInCol();
|
||||
|
|
@ -1306,13 +1295,12 @@ spDeleteRowAndCol(MatrixPtr eMatrix, int Row, int Col)
|
|||
* previous factorization. If the matrix was singular, zero is returned.
|
||||
*
|
||||
* >>> Arguments:
|
||||
* eMatrix <input> (char *)
|
||||
* Matrix <input> (char *)
|
||||
* Pointer to the matrix. */
|
||||
|
||||
RealNumber
|
||||
spPseudoCondition(MatrixPtr eMatrix)
|
||||
spPseudoCondition(MatrixPtr Matrix)
|
||||
{
|
||||
MatrixPtr Matrix = eMatrix;
|
||||
int I;
|
||||
ArrayOfElementPtrs Diag;
|
||||
RealNumber MaxPivot, MinPivot, Mag;
|
||||
|
|
@ -1388,7 +1376,7 @@ spPseudoCondition(MatrixPtr eMatrix)
|
|||
* zero is returned.
|
||||
*
|
||||
* >>> Arguments:
|
||||
* eMatrix <input> (char *)
|
||||
* Matrix <input> (char *)
|
||||
* Pointer to the matrix.
|
||||
* NormOfMatrix <input> (RealNumber)
|
||||
* The L-infinity norm of the unfactored matrix as computed by
|
||||
|
|
@ -1401,9 +1389,8 @@ spPseudoCondition(MatrixPtr eMatrix)
|
|||
* spNO_MEMORY */
|
||||
|
||||
RealNumber
|
||||
spCondition(MatrixPtr eMatrix, RealNumber NormOfMatrix, int *pError)
|
||||
spCondition(MatrixPtr Matrix, RealNumber NormOfMatrix, int *pError)
|
||||
{
|
||||
MatrixPtr Matrix = eMatrix;
|
||||
ElementPtr pElement;
|
||||
RealVector T, Tm;
|
||||
int I, K, Row;
|
||||
|
|
@ -1824,14 +1811,13 @@ int *pError;
|
|||
* The largest absolute row sum of matrix.
|
||||
*
|
||||
* >>> Arguments:
|
||||
* eMatrix <input> (char *)
|
||||
* Matrix <input> (char *)
|
||||
* Pointer to the matrix.
|
||||
*/
|
||||
|
||||
RealNumber
|
||||
spNorm(MatrixPtr eMatrix)
|
||||
spNorm(MatrixPtr Matrix)
|
||||
{
|
||||
MatrixPtr Matrix = eMatrix;
|
||||
ElementPtr pElement;
|
||||
int I;
|
||||
RealNumber Max = 0.0, AbsRowSum;
|
||||
|
|
@ -1942,14 +1928,13 @@ spNorm(MatrixPtr eMatrix)
|
|||
* largest element in any of the reduced submatrices is returned.
|
||||
*
|
||||
* >>> Arguments:
|
||||
* eMatrix <input> (char *)
|
||||
* Matrix <input> (char *)
|
||||
* Pointer to the matrix.
|
||||
*/
|
||||
|
||||
RealNumber
|
||||
spLargestElement(MatrixPtr eMatrix)
|
||||
spLargestElement(MatrixPtr Matrix)
|
||||
{
|
||||
MatrixPtr Matrix = eMatrix;
|
||||
int I;
|
||||
RealNumber Mag, AbsColSum, Max = 0.0, MaxRow = 0.0, MaxCol = 0.0;
|
||||
RealNumber Pivot;
|
||||
|
|
@ -2066,7 +2051,7 @@ spLargestElement(MatrixPtr eMatrix)
|
|||
* Returns a bound on the magnitude of the largest element in E = A - LU.
|
||||
*
|
||||
* >>> Arguments:
|
||||
* eMatrix <input> (char *)
|
||||
* Matrix <input> (char *)
|
||||
* Pointer to the matrix.
|
||||
* Rho <input> (RealNumber)
|
||||
* The bound on the magnitude of the largest element in any of the
|
||||
|
|
@ -2076,9 +2061,8 @@ spLargestElement(MatrixPtr eMatrix)
|
|||
*/
|
||||
|
||||
RealNumber
|
||||
spRoundoff(MatrixPtr eMatrix, RealNumber Rho)
|
||||
spRoundoff(MatrixPtr Matrix, RealNumber Rho)
|
||||
{
|
||||
MatrixPtr Matrix = eMatrix;
|
||||
ElementPtr pElement;
|
||||
int Count, I, MaxCount = 0;
|
||||
RealNumber Reid, Gear;
|
||||
|
|
@ -2087,7 +2071,7 @@ spRoundoff(MatrixPtr eMatrix, RealNumber Rho)
|
|||
assert( IS_SPARSE(Matrix) && IS_FACTORED(Matrix) );
|
||||
|
||||
/* Compute Barlow's bound if it is not given. */
|
||||
if (Rho < 0.0) Rho = spLargestElement( eMatrix );
|
||||
if (Rho < 0.0) Rho = spLargestElement( Matrix );
|
||||
|
||||
/* Find the maximum number of off-diagonals in L if not previously computed. */
|
||||
if (Matrix->MaxRowCountInLowerTri < 0)
|
||||
|
|
@ -2133,7 +2117,7 @@ spRoundoff(MatrixPtr eMatrix, RealNumber Rho)
|
|||
* error state of sparse. No message is produced if there is no error.
|
||||
*
|
||||
* >>> Arguments:
|
||||
* eMatrix <input> (char *)
|
||||
* Matrix <input> (char *)
|
||||
* Matrix for which the error message is to be printed.
|
||||
* Stream <input> (FILE *)
|
||||
* Stream to which the error message is to be printed.
|
||||
|
|
@ -2143,17 +2127,17 @@ spRoundoff(MatrixPtr eMatrix, RealNumber Rho)
|
|||
*/
|
||||
|
||||
void
|
||||
spErrorMessage(MatrixPtr eMatrix, FILE *Stream, char *Originator)
|
||||
spErrorMessage(MatrixPtr Matrix, FILE *Stream, char *Originator)
|
||||
{
|
||||
int Row, Col, Error;
|
||||
|
||||
/* Begin `spErrorMessage'. */
|
||||
if (eMatrix == NULL)
|
||||
if (Matrix == NULL)
|
||||
Error = spNO_MEMORY;
|
||||
else
|
||||
{
|
||||
assert(eMatrix->ID == SPARSE_ID);
|
||||
Error = eMatrix->Error;
|
||||
assert(Matrix->ID == SPARSE_ID);
|
||||
Error = Matrix->Error;
|
||||
}
|
||||
|
||||
if (Error == spOKAY) return;
|
||||
|
|
@ -2172,13 +2156,13 @@ spErrorMessage(MatrixPtr eMatrix, FILE *Stream, char *Originator)
|
|||
fprintf( Stream, "insufficient memory available.\n");
|
||||
else if (Error == spSINGULAR)
|
||||
{
|
||||
spWhereSingular( eMatrix, &Row, &Col );
|
||||
spWhereSingular( Matrix, &Row, &Col );
|
||||
fprintf( Stream, "singular matrix detected at row %d and column %d.\n",
|
||||
Row, Col);
|
||||
}
|
||||
else if (Error == spZERO_DIAG)
|
||||
{
|
||||
spWhereSingular( eMatrix, &Row, &Col );
|
||||
spWhereSingular( Matrix, &Row, &Col );
|
||||
fprintf( Stream, "zero diagonal detected at row %d and column %d.\n",
|
||||
Row, Col);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -16,7 +16,12 @@
|
|||
#define STDERR_FILENO 2
|
||||
#endif
|
||||
|
||||
//#define low_latency
|
||||
|
||||
/* If a calling function has high latency times during printing,
|
||||
causing memory access errors, you may undef the following line.
|
||||
Printing messages are assembled in a wordlist, and sent to the caller
|
||||
via a new thread. Delays may occur. */
|
||||
#define low_latency
|
||||
|
||||
/**********************************************************************/
|
||||
/* Header files for C functions */
|
||||
|
|
@ -244,7 +249,6 @@ mutexType fputsMutex;
|
|||
static bool is_initialized = FALSE;
|
||||
static char* no_init = "Error: ngspice is not initialized!\n Run ngSpice_Init first";
|
||||
|
||||
static bool printstopp = FALSE;
|
||||
|
||||
/*helper function*//*
|
||||
static struct plot *
|
||||
|
|
@ -293,12 +297,16 @@ static threadId_t tid, printtid, bgtid = (threadId_t) 0;
|
|||
static bool fl_running = FALSE;
|
||||
static bool fl_exited = TRUE;
|
||||
|
||||
static bool printstopp = FALSE;
|
||||
static bool ps_exited = TRUE;
|
||||
|
||||
#if defined(__MINGW32__) || defined(_MSC_VER)
|
||||
#define EXPORT_FLAVOR WINAPI
|
||||
#else
|
||||
#define EXPORT_FLAVOR
|
||||
#endif
|
||||
|
||||
/* starts a background thread, e.g. from command bg_run */
|
||||
static void * EXPORT_FLAVOR
|
||||
_thread_run(void *string)
|
||||
{
|
||||
|
|
@ -324,7 +332,7 @@ _thread_run(void *string)
|
|||
}
|
||||
|
||||
|
||||
/*Stops a running thread, hopefully */
|
||||
/*Stops a running background thread, hopefully */
|
||||
static int EXPORT_FLAVOR
|
||||
_thread_stop(void)
|
||||
{
|
||||
|
|
@ -374,13 +382,16 @@ sighandler_sharedspice(int num)
|
|||
|
||||
#endif /*THREADS*/
|
||||
|
||||
|
||||
/* run a ngspice command */
|
||||
static int
|
||||
runc(char* command)
|
||||
{
|
||||
char buf[1024] = "";
|
||||
sighandler oldHandler;
|
||||
#ifdef THREADS
|
||||
#ifndef low_latency
|
||||
int timeout = 0;
|
||||
#endif
|
||||
char *string;
|
||||
bool fl_bg = FALSE;
|
||||
command_id = threadid_self();
|
||||
|
|
@ -392,12 +403,24 @@ runc(char* command)
|
|||
#ifndef low_latency
|
||||
/* stop the printf thread 'printsend()' */
|
||||
else if (cieq("bg_pstop", command)) {
|
||||
printstopp = TRUE;
|
||||
while (!ps_exited && timeout < 100) {
|
||||
printstopp = TRUE;
|
||||
|
||||
#if defined(__MINGW32__) || defined(_MSC_VER)
|
||||
Sleep(100); // va: windows native
|
||||
Sleep(100); // va: windows native
|
||||
#else
|
||||
usleep(10000);
|
||||
usleep(10000);
|
||||
#endif
|
||||
timeout++;
|
||||
}
|
||||
if (!ps_exited) {
|
||||
fprintf(stderr, "Error: Couldn't stop printsend thread\n");
|
||||
return EXIT_BAD;
|
||||
}
|
||||
else
|
||||
fprintf(stdout, "Printsend thread stopped with timeout = %d\n", timeout);
|
||||
|
||||
printstopp = FALSE;
|
||||
return 2;
|
||||
}
|
||||
#endif
|
||||
|
|
@ -408,7 +431,7 @@ runc(char* command)
|
|||
#endif
|
||||
|
||||
/* Catch Ctrl-C to break simulations */
|
||||
#if !defined(_MSC_VER) /*&& !defined(__MINGW32__) */
|
||||
#if 1 //!defined(_MSC_VER) /*&& !defined(__MINGW32__) */
|
||||
oldHandler = signal(SIGINT, (SIGNAL_FUNCTION) ft_sigintr);
|
||||
if (SETJMP(jbuf, 1) != 0) {
|
||||
signal(SIGINT, oldHandler);
|
||||
|
|
@ -469,7 +492,7 @@ runc(char* command)
|
|||
|
||||
#ifdef THREADS
|
||||
|
||||
/* Checks if spice is running in the background */
|
||||
/* Checks if ngspice is running in the background */
|
||||
IMPEXP
|
||||
bool
|
||||
ngSpice_running (void)
|
||||
|
|
@ -479,7 +502,7 @@ ngSpice_running (void)
|
|||
#endif
|
||||
|
||||
|
||||
/* Initialise spice and setup native methods */
|
||||
/* Initialise ngspice and setup native methods */
|
||||
IMPEXP
|
||||
int
|
||||
ngSpice_Init(SendChar* printfcn, SendStat* statusfcn, ControlledExit* ngspiceexit,
|
||||
|
|
@ -578,12 +601,9 @@ ngSpice_Init(SendChar* printfcn, SendStat* statusfcn, ControlledExit* ngspiceexi
|
|||
struct passwd *pw;
|
||||
pw = getpwuid(getuid());
|
||||
|
||||
#ifdef HAVE_ASPRINTF
|
||||
asprintf(&s, "%s%s", pw->pw_dir, INITSTR);
|
||||
#else
|
||||
s = TMALLOC(char, 1 + strlen(pw->pw_dir) + strlen(INITSTR));
|
||||
sprintf(s, "%s%s", pw->pw_dir, INITSTR);
|
||||
#endif
|
||||
|
||||
if (access(s, 0) == 0)
|
||||
inp_source(s);
|
||||
}
|
||||
|
|
@ -627,7 +647,14 @@ bot:
|
|||
}
|
||||
#endif
|
||||
|
||||
com_version(NULL);
|
||||
// com_version(NULL);
|
||||
fprintf(cp_out,
|
||||
"******\n"
|
||||
"** %s-%s shared library\n",
|
||||
ft_sim->simulator, ft_sim->version);
|
||||
if (Spice_Build_Date != NULL && *Spice_Build_Date != 0)
|
||||
fprintf(cp_out, "** Creation Date: %s\n", Spice_Build_Date);
|
||||
fprintf(cp_out, "******\n");
|
||||
|
||||
is_initialized = TRUE;
|
||||
|
||||
|
|
@ -638,7 +665,7 @@ bot:
|
|||
/* If caller has sent valid address for pfcn */
|
||||
if (!noprintfwanted)
|
||||
#ifdef HAVE_LIBPTHREAD
|
||||
pthread_create(&tid, NULL, (void * (*)(void *))printsend, (void *)NULL);
|
||||
pthread_create(&printtid, NULL, (void * (*)(void *))printsend, (void *)NULL);
|
||||
#elif defined _MSC_VER || defined __MINGW32__
|
||||
printtid = (HANDLE)_beginthreadex(NULL, 0, (unsigned int (__stdcall *)(void *))printsend,
|
||||
(void*) NULL, 0, NULL);
|
||||
|
|
@ -659,7 +686,6 @@ IMPEXP
|
|||
int ngSpice_Command(char* comexec)
|
||||
{
|
||||
if ( ! setjmp(errbufc) ) {
|
||||
// HANDLE tid2;
|
||||
|
||||
immediate = FALSE;
|
||||
intermj = 1;
|
||||
|
|
@ -668,12 +694,9 @@ int ngSpice_Command(char* comexec)
|
|||
fprintf(stderr, no_init);
|
||||
return 1;
|
||||
}
|
||||
// tid2 = (HANDLE)_beginthreadex(NULL, 0, (PTHREAD_START_ROUTINE)runc, (void*)comexec,
|
||||
// 0, NULL);
|
||||
|
||||
runc(comexec);
|
||||
/* main thread prepares immediate detaching of dll,
|
||||
in case of controlled_exit from tid2 thread, caller is asked
|
||||
to detach dll via fcn ngexit() */
|
||||
/* main thread prepares immediate detaching of dll */
|
||||
immediate = TRUE;
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -722,6 +745,7 @@ int ngSpice_Circ(char** circa){
|
|||
|
||||
if ( ! setjmp(errbufm) ) {
|
||||
intermj = 0;
|
||||
immediate = FALSE;
|
||||
/* count the entries */
|
||||
while (circa[entries]) {
|
||||
entries++;
|
||||
|
|
@ -747,7 +771,7 @@ char* ngSpice_CurPlot(void)
|
|||
}
|
||||
|
||||
/* return to the caller a pointer to an array of all plots created
|
||||
by ngspice.dll */
|
||||
by ngspice. Last entry in the array is NULL. */
|
||||
IMPEXP
|
||||
char** ngSpice_AllPlots(void)
|
||||
{
|
||||
|
|
@ -771,7 +795,7 @@ char** ngSpice_AllPlots(void)
|
|||
}
|
||||
|
||||
/* return to the caller a pointer to an array of vector names in the plot
|
||||
named by plotname */
|
||||
named by plotname. Last entry in the array is NULL. */
|
||||
IMPEXP
|
||||
char** ngSpice_AllVecs(char* plotname)
|
||||
{
|
||||
|
|
@ -809,8 +833,8 @@ char** ngSpice_AllVecs(char* plotname)
|
|||
/* Redefine the vfprintf() functions for callback */
|
||||
/*------------------------------------------------------*/
|
||||
|
||||
/* handling of escape characters (extra \ added) is removed, may be added by
|
||||
un-commenting some lines */
|
||||
/* handling of escape characters (extra \ added) only, if
|
||||
'set addescape' is given in .spiceinit */
|
||||
|
||||
int
|
||||
sh_vfprintf(FILE *f, const char *fmt, va_list args)
|
||||
|
|
@ -889,7 +913,7 @@ sh_vfprintf(FILE *f, const char *fmt, va_list args)
|
|||
}
|
||||
}
|
||||
|
||||
/* use sharedspice implementation of fputs (sh_fputs)
|
||||
/* use sharedspice.c implementation of fputs (sh_fputs)
|
||||
to assess callback function derived from address printfcn received via
|
||||
Spice_Init() from caller of ngspice.dll */
|
||||
|
||||
|
|
@ -903,9 +927,10 @@ sh_vfprintf(FILE *f, const char *fmt, va_list args)
|
|||
}
|
||||
|
||||
|
||||
/*----------------------------------------------------------------------*/
|
||||
/* Reimplement fprintf() as a call to callback function pfcn */
|
||||
/*----------------------------------------------------------------------*/
|
||||
/*----------------------------------------------------------------------
|
||||
Reimplement fprintf() as a call to callback function pfcn
|
||||
via sh_vfprintf, sh_fputs, and sh_fputsll
|
||||
----------------------------------------------------------------------*/
|
||||
|
||||
int
|
||||
sh_fprintf(FILE *f, const char *format, ...)
|
||||
|
|
@ -921,9 +946,10 @@ sh_fprintf(FILE *f, const char *format, ...)
|
|||
}
|
||||
|
||||
|
||||
/*----------------------------------------------------------------------*/
|
||||
/* Reimplement printf() as a call to callback function pfcn */
|
||||
/*----------------------------------------------------------------------*/
|
||||
/*----------------------------------------------------------------------
|
||||
Reimplement printf() as a call to callback function pfcn
|
||||
via sh_vfprintf, sh_fputs, and sh_fputsll
|
||||
----------------------------------------------------------------------*/
|
||||
|
||||
int
|
||||
sh_printf(const char *format, ...)
|
||||
|
|
@ -975,9 +1001,9 @@ sh_fputc(const char inp, FILE* f)
|
|||
static char* outstringerr = NULL;
|
||||
static char* outstringout = NULL;
|
||||
|
||||
#ifdef low_latency
|
||||
/* using the strings by the caller sent directly to the caller
|
||||
has to fast enough (low latency) */
|
||||
#if defined (low_latency) || !defined(THREADS)
|
||||
/* The strings issued by printf etc. are sent directly to the caller.
|
||||
The callback has to be fast enough (low latency). */
|
||||
int
|
||||
sh_fputsll(const char *input, FILE* outf)
|
||||
{
|
||||
|
|
@ -1065,7 +1091,8 @@ sh_fputsll(const char *input, FILE* outf)
|
|||
return 0;
|
||||
}
|
||||
|
||||
/* provide a lock around printing function */
|
||||
/* provide a lock around printing function.
|
||||
May become critical if latency of callback is too high.*/
|
||||
int
|
||||
sh_fputs(const char *input, FILE* outf)
|
||||
{
|
||||
|
|
@ -1187,6 +1214,8 @@ static char *outsend = NULL;
|
|||
static void
|
||||
printsend(void)
|
||||
{
|
||||
ps_exited = FALSE;
|
||||
printstopp = FALSE;
|
||||
for (;;) {
|
||||
#if defined(__MINGW32__) || defined(_MSC_VER)
|
||||
Sleep(50); // loop delay
|
||||
|
|
@ -1198,6 +1227,7 @@ printsend(void)
|
|||
mutex_lock(&fputsMutex);
|
||||
outsend = outstorage(NULL, FALSE);
|
||||
mutex_unlock(&fputsMutex);
|
||||
|
||||
break;
|
||||
}
|
||||
mutex_lock(&fputsMutex);
|
||||
|
|
@ -1210,6 +1240,7 @@ printsend(void)
|
|||
tfree(outsend);
|
||||
}
|
||||
}
|
||||
ps_exited = TRUE;
|
||||
}
|
||||
|
||||
/* remove the first entry of a wordlist, but keep wl->wl_word */
|
||||
|
|
@ -1251,7 +1282,7 @@ char* outstorage(char* wordin, bool write)
|
|||
|
||||
|
||||
/* New progress report to statfcn().
|
||||
Update only every DELTATIME milliseconds */
|
||||
An update occurs only every DELTATIME milliseconds. */
|
||||
#define DELTATIME 150
|
||||
void SetAnalyse(
|
||||
char * Analyse, /*in: analysis type */
|
||||
|
|
@ -1323,8 +1354,8 @@ void SetAnalyse(
|
|||
tfree(s);
|
||||
}
|
||||
|
||||
/* a dll or shared library should never exit, but ask for graceful shutdown
|
||||
(e.g. being detached) via a callback function*/
|
||||
/* a dll or shared library should never exit, if loaded dynamically,
|
||||
but ask for graceful shutdown (e.g. being detached) via a callback function*/
|
||||
void shared_exit(int status)
|
||||
{
|
||||
/* alert caller to detach dll (if we are in the main thread),
|
||||
|
|
@ -1448,7 +1479,7 @@ int sh_ExecutePerLoop(void)
|
|||
{
|
||||
struct dvec *d;
|
||||
int i, veclen;
|
||||
double testval;
|
||||
// double testval;
|
||||
struct plot *pl = plot_cur;
|
||||
/* return immediately if callback not wanted */
|
||||
if (nodatawanted)
|
||||
|
|
@ -1456,11 +1487,12 @@ int sh_ExecutePerLoop(void)
|
|||
|
||||
/* get the data of the last entry to the plot vector */
|
||||
veclen = pl->pl_dvecs->v_length - 1;
|
||||
curvecvalsall->vecindex = veclen;
|
||||
for (d = pl->pl_dvecs, i = 0; d; d = d->v_next, i++) {
|
||||
/* test if real */
|
||||
if (d->v_flags & VF_REAL) {
|
||||
curvecvalsall->vecsa[i]->is_complex = FALSE;
|
||||
testval = d->v_realdata[veclen];
|
||||
// testval = d->v_realdata[veclen];
|
||||
curvecvalsall->vecsa[i]->creal = d->v_realdata[veclen];
|
||||
curvecvalsall->vecsa[i]->cimag = 0.;
|
||||
}
|
||||
|
|
@ -1478,7 +1510,7 @@ int sh_ExecutePerLoop(void)
|
|||
|
||||
|
||||
/* called once for a new plot from beginPlot() in outitf.c,
|
||||
after the vectors in ngspice have been set.
|
||||
after the vectors in ngspice for this plot have been set.
|
||||
Transfers vector information to the caller via callback datinitfcn()
|
||||
and sets transfer structure for use in sh_ExecutePerLoop() */
|
||||
int sh_vecinit(runDesc *run)
|
||||
|
|
@ -1536,14 +1568,13 @@ int sh_vecinit(runDesc *run)
|
|||
data will be sent from sh_ExecutePerLoop() via datfcn() */
|
||||
if (!curvecvalsall) {
|
||||
curvecvalsall = TMALLOC(vecvaluesall, 1);
|
||||
curvecvalsall->veccount = veccount;
|
||||
}
|
||||
else {
|
||||
for (i = 0; i < curvecvalsall->veccount; i++)
|
||||
tfree(curvecvalsall->vecsa[i]);
|
||||
tfree(curvecvalsall->vecsa);
|
||||
}
|
||||
|
||||
curvecvalsall->veccount = veccount;
|
||||
curvecvalsall->vecsa = TMALLOC(pvecvalues, veccount);
|
||||
|
||||
for (i = 0, d = cur_run->runPlot->pl_dvecs; i < veccount; i++, d = d->v_next) {
|
||||
|
|
|
|||
|
|
@ -107,6 +107,10 @@ libckt_la_SOURCES += \
|
|||
endif
|
||||
|
||||
|
||||
if KIRCHHOFF_WANTED
|
||||
libckt_la_SOURCES += cktmkcurKCL.c
|
||||
endif
|
||||
|
||||
AM_CPPFLAGS = @AM_CPPFLAGS@ -I$(top_srcdir)/src/include -I$(top_srcdir)/src/spicelib/devices
|
||||
AM_CFLAGS = $(STATIC)
|
||||
MAINTAINERCLEANFILES = Makefile.in
|
||||
|
|
|
|||
|
|
@ -20,6 +20,10 @@ extern SPICEanalysis SENSinfo;
|
|||
extern SPICEanalysis PSSinfo;
|
||||
#endif
|
||||
|
||||
#ifdef WANT_SENSE2
|
||||
extern SPICEanalysis SEN2info;
|
||||
#endif
|
||||
|
||||
SPICEanalysis *analInfo[] = {
|
||||
&OPTinfo,
|
||||
&ACinfo,
|
||||
|
|
@ -34,6 +38,9 @@ SPICEanalysis *analInfo[] = {
|
|||
#ifdef WITH_PSS
|
||||
&PSSinfo,
|
||||
#endif
|
||||
#ifdef WANT_SENSE2
|
||||
&SEN2info,
|
||||
#endif
|
||||
};
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -52,6 +52,11 @@ CKTload(CKTcircuit *ckt)
|
|||
size = SMPmatSize(ckt->CKTmatrix);
|
||||
for (i = 0; i <= size; i++) {
|
||||
ckt->CKTrhs[i] = 0;
|
||||
|
||||
#ifdef KIRCHHOFF
|
||||
ckt->CKTfvk[i] = 0;
|
||||
#endif
|
||||
|
||||
}
|
||||
SMPclear(ckt->CKTmatrix);
|
||||
#ifdef STEPDEBUG
|
||||
|
|
|
|||
|
|
@ -0,0 +1,21 @@
|
|||
/**********
|
||||
Author: 2013 Francesco Lannutti
|
||||
**********/
|
||||
|
||||
#include "ngspice/ngspice.h"
|
||||
#include "ngspice/sperror.h"
|
||||
#include "ngspice/cktdefs.h"
|
||||
|
||||
int
|
||||
CKTmkCurKCL (CKTcircuit *ckt, int i, double **node)
|
||||
{
|
||||
CKTmkCurKCLnode *tempNode ;
|
||||
|
||||
tempNode = TMALLOC (CKTmkCurKCLnode, 1) ;
|
||||
tempNode->KCLcurrent = 0.0 ;
|
||||
tempNode->next = ckt->CKTmkCurKCLarray [i] ;
|
||||
ckt->CKTmkCurKCLarray [i] = tempNode ;
|
||||
*node = &(tempNode->KCLcurrent) ;
|
||||
|
||||
return (OK) ;
|
||||
}
|
||||
|
|
@ -61,7 +61,9 @@ CKTsetup(CKTcircuit *ckt)
|
|||
|
||||
#ifdef WANT_SENSE2
|
||||
if(ckt->CKTsenInfo){
|
||||
if (error = CKTsenSetup(ckt)) return(error);
|
||||
error = CKTsenSetup(ckt);
|
||||
if (error)
|
||||
return(error);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
|
@ -269,6 +271,22 @@ CKTsetup(CKTcircuit *ckt)
|
|||
|
||||
/* gtri - end - Setup for adding rshunt option resistors */
|
||||
#endif
|
||||
|
||||
#ifdef KIRCHHOFF
|
||||
/** Marking node as Non-Linear when needed
|
||||
* By default every node is Linear
|
||||
*/
|
||||
for (i = 0 ; i < DEVmaxnum ; i++)
|
||||
{
|
||||
if (DEVices[i] && DEVices[i]->DEVnodeIsNonLinear && ckt->CKThead[i])
|
||||
{
|
||||
error = DEVices[i]->DEVnodeIsNonLinear (ckt->CKThead[i], ckt) ;
|
||||
if (error)
|
||||
return (error) ;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
return(OK);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -21,6 +21,11 @@ Modified: 2000 AlansFixes
|
|||
int
|
||||
DCop(CKTcircuit *ckt, int notused)
|
||||
{
|
||||
#ifdef WANT_SENSE2
|
||||
int i, senmode, size;
|
||||
long save;
|
||||
#endif
|
||||
|
||||
int converged;
|
||||
int error;
|
||||
IFuid *nameList; /* va: tmalloc'ed list */
|
||||
|
|
@ -133,7 +138,10 @@ DCop(CKTcircuit *ckt, int notused)
|
|||
for(i = 1; i<=size ; i++){
|
||||
ckt->CKTrhsOp[i] = ckt->CKTrhsOld[i];
|
||||
}
|
||||
if(error = CKTsenDCtran(ckt)) return(error);
|
||||
error = CKTsenDCtran(ckt);
|
||||
if (error)
|
||||
return(error);
|
||||
|
||||
ckt->CKTmode = save;
|
||||
ckt->CKTsenInfo->SENmode = senmode;
|
||||
|
||||
|
|
|
|||
|
|
@ -78,9 +78,8 @@ DCtran(CKTcircuit *ckt,
|
|||
int firsttime;
|
||||
int error;
|
||||
#ifdef WANT_SENSE2
|
||||
#ifdef SENSDEBUG
|
||||
FILE *outsen;
|
||||
#endif /* SENSDEBUG */
|
||||
int save, save2, size;
|
||||
long save1;
|
||||
#endif
|
||||
int save_order;
|
||||
long save_mode;
|
||||
|
|
@ -316,7 +315,10 @@ DCtran(CKTcircuit *ckt,
|
|||
save2 = ckt->CKTorder;
|
||||
ckt->CKTmode = save_mode;
|
||||
ckt->CKTorder = save_order;
|
||||
if(error = CKTsenDCtran(ckt)) return(error);
|
||||
error = CKTsenDCtran(ckt);
|
||||
if (error)
|
||||
return(error);
|
||||
|
||||
ckt->CKTmode = save1;
|
||||
ckt->CKTorder = save2;
|
||||
}
|
||||
|
|
@ -479,9 +481,6 @@ DCtran(CKTcircuit *ckt,
|
|||
#ifdef WANT_SENSE2
|
||||
if(ckt->CKTsenInfo && (ckt->CKTsenInfo->SENmode & TRANSEN)){
|
||||
ckt->CKTsenInfo->SENmode = save;
|
||||
#ifdef SENSDEBUG
|
||||
fclose(outsen);
|
||||
#endif /* SENSDEBUG */
|
||||
}
|
||||
#endif
|
||||
return(OK);
|
||||
|
|
@ -508,7 +507,7 @@ resume:
|
|||
if (ckt->CKTtime == 0.)
|
||||
SetAnalyse( "tran init", 0);
|
||||
else
|
||||
SetAnalyse( "tran", (int)((ckt->CKTtime * 1000.) / ckt->CKTfinalTime) + 0.5);
|
||||
SetAnalyse( "tran", (int)((ckt->CKTtime * 1000.) / ckt->CKTfinalTime + 0.5));
|
||||
#endif
|
||||
ckt->CKTdelta =
|
||||
MIN(ckt->CKTdelta,ckt->CKTmaxStep);
|
||||
|
|
@ -546,6 +545,10 @@ resume:
|
|||
ckt->CKTbreaks[1] - ckt->CKTbreaks[0]));
|
||||
|
||||
if(firsttime) {
|
||||
/* set a breakpoint to reduce ringing of current in devices */
|
||||
if (ckt->CKTmode&MODEUIC)
|
||||
CKTsetBreak(ckt,ckt->CKTstep);
|
||||
|
||||
ckt->CKTdelta /= 10;
|
||||
#ifdef STEPDEBUG
|
||||
(void)printf("delta cut for initial timepoint\n");
|
||||
|
|
@ -792,7 +795,10 @@ resume:
|
|||
save2 = ckt->CKTorder;
|
||||
ckt->CKTmode = save_mode;
|
||||
ckt->CKTorder = save_order;
|
||||
if(error = CKTsenDCtran(ckt)) return(error);
|
||||
error = CKTsenDCtran (ckt);
|
||||
if (error)
|
||||
return(error);
|
||||
|
||||
ckt->CKTmode = save1;
|
||||
ckt->CKTorder = save2;
|
||||
}
|
||||
|
|
@ -852,7 +858,10 @@ resume:
|
|||
save2 = ckt->CKTorder;
|
||||
ckt->CKTmode = save_mode;
|
||||
ckt->CKTorder = save_order;
|
||||
if(error = CKTsenDCtran(ckt)) return(error);
|
||||
error = CKTsenDCtran(ckt);
|
||||
if (error)
|
||||
return (error);
|
||||
|
||||
ckt->CKTmode = save1;
|
||||
ckt->CKTorder = save2;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -50,6 +50,7 @@ DCtrCurv(CKTcircuit *ckt, int restart)
|
|||
static runDesc *plot = NULL;
|
||||
|
||||
#ifdef WANT_SENSE2
|
||||
long save;
|
||||
#ifdef SENSDEBUG
|
||||
if(ckt->CKTsenInfo && (ckt->CKTsenInfo->SENmode&DCSEN) ){
|
||||
printf("\nDC Sensitivity Results\n\n");
|
||||
|
|
@ -450,7 +451,7 @@ resume:
|
|||
}
|
||||
if (job->TRCVvType[i] == TEMP_CODE) { /* Temperature */
|
||||
printf("Current Circuit Temperature : %.5e C\n",
|
||||
ckt-CKTtemp - CONSTCtoK);
|
||||
ckt->CKTtemp - CONSTCtoK);
|
||||
}
|
||||
|
||||
#endif /* SENSDEBUG */
|
||||
|
|
@ -458,7 +459,10 @@ resume:
|
|||
senmode = ckt->CKTsenInfo->SENmode;
|
||||
save = ckt->CKTmode;
|
||||
ckt->CKTsenInfo->SENmode = DCSEN;
|
||||
if(error = CKTsenDCtran(ckt)) return (error);
|
||||
error = CKTsenDCtran(ckt);
|
||||
if (error)
|
||||
return(error);
|
||||
|
||||
ckt->CKTmode = save;
|
||||
ckt->CKTsenInfo->SENmode = senmode;
|
||||
|
||||
|
|
|
|||
|
|
@ -22,23 +22,14 @@ int TRANinit(CKTcircuit *ckt, JOB *anal)
|
|||
ckt->CKTinitTime = job->TRANinitTime;
|
||||
ckt->CKTmaxStep = job->TRANmaxStep;
|
||||
|
||||
|
||||
|
||||
/* The following code has been taken from macspice 3f4 (A. Wilson)
|
||||
in the file traninit.new.c - Seems interesting */
|
||||
if(ckt->CKTmaxStep == 0)
|
||||
{
|
||||
if (ckt->CKTstep < ( ckt->CKTfinalTime - ckt->CKTinitTime )/50.0)
|
||||
{
|
||||
ckt->CKTmaxStep = ckt->CKTstep;
|
||||
}
|
||||
else
|
||||
{
|
||||
ckt->CKTmaxStep = ( ckt->CKTfinalTime - ckt->CKTinitTime )/50.0;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* The following code has been taken from macspice 3f4 (A. Wilson)
|
||||
in the file traninit.new.c - Seems interesting */
|
||||
if(ckt->CKTmaxStep == 0) {
|
||||
if (ckt->CKTstep < ( ckt->CKTfinalTime - ckt->CKTinitTime )/50.0)
|
||||
ckt->CKTmaxStep = ckt->CKTstep;
|
||||
else
|
||||
ckt->CKTmaxStep = ( ckt->CKTfinalTime - ckt->CKTinitTime )/50.0;
|
||||
}
|
||||
|
||||
ckt->CKTdelmin = 1e-11*ckt->CKTmaxStep; /* XXX */
|
||||
ckt->CKTmode = job->TRANmode;
|
||||
|
|
|
|||
|
|
@ -19,10 +19,14 @@ libasrc_la_SOURCES = \
|
|||
asrcmdel.c \
|
||||
asrcpar.c \
|
||||
asrcpzld.c \
|
||||
asrcset.c \
|
||||
asrcset.c \
|
||||
asrctemp.c
|
||||
|
||||
|
||||
if KIRCHHOFF_WANTED
|
||||
libasrc_la_SOURCES += asrcnode.c
|
||||
endif
|
||||
|
||||
AM_CPPFLAGS = @AM_CPPFLAGS@ -I$(top_srcdir)/src/include
|
||||
AM_CFLAGS = $(STATIC)
|
||||
MAINTAINERCLEANFILES = Makefile.in
|
||||
|
|
|
|||
|
|
@ -16,3 +16,4 @@ extern int ASRCacLoad(GENmodel*,CKTcircuit*);
|
|||
extern int ASRCsetup(SMPmatrix*,GENmodel*,CKTcircuit*,int*);
|
||||
extern int ASRCunsetup(GENmodel*,CKTcircuit*);
|
||||
extern int ASRCtemp(GENmodel*,CKTcircuit*);
|
||||
extern int ASRCnodeIsNonLinear (GENmodel *, CKTcircuit *) ;
|
||||
|
|
|
|||
|
|
@ -74,12 +74,17 @@ SPICEdev ASRCinfo = {
|
|||
#endif
|
||||
/* DEVinstSize */ &ASRCiSize,
|
||||
/* DEVmodSize */ &ASRCmSize,
|
||||
|
||||
#if defined(KLU) || defined(SuperLU) || defined(UMFPACK)
|
||||
/* DEVbindCSC */ NULL,
|
||||
/* DEVbindCSCComplex */ NULL,
|
||||
/* DEVbindCSCComplexToReal */ NULL,
|
||||
#endif
|
||||
|
||||
#ifdef KIRCHHOFF
|
||||
/* DEVnodeIsNonLinear */ ASRCnodeIsNonLinear
|
||||
#endif
|
||||
|
||||
};
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -0,0 +1,28 @@
|
|||
/**********
|
||||
Author: 2013 Francesco Lannutti
|
||||
**********/
|
||||
|
||||
#include "ngspice/ngspice.h"
|
||||
#include "ngspice/cktdefs.h"
|
||||
#include "asrcdefs.h"
|
||||
#include "ngspice/sperror.h"
|
||||
|
||||
int
|
||||
ASRCnodeIsNonLinear (GENmodel *inModel, CKTcircuit *ckt)
|
||||
{
|
||||
ASRCmodel *model = (ASRCmodel *)inModel ;
|
||||
ASRCinstance *here ;
|
||||
|
||||
/* loop through all the ASRC models */
|
||||
for ( ; model != NULL ; model = model->ASRCnextModel)
|
||||
{
|
||||
/* loop through all the instances of the model */
|
||||
for (here = model->ASRCinstances ; here != NULL ; here = here->ASRCnextInstance)
|
||||
{
|
||||
ckt->CKTnodeIsLinear [here->ASRCposNode] = 0 ;
|
||||
ckt->CKTnodeIsLinear [here->ASRCnegNode] = 0 ;
|
||||
}
|
||||
}
|
||||
|
||||
return (OK) ;
|
||||
}
|
||||
|
|
@ -47,6 +47,10 @@ if UMFPACK_WANTED
|
|||
libbjt_la_SOURCES += bjtbindCSC.c
|
||||
endif
|
||||
|
||||
if KIRCHHOFF_WANTED
|
||||
libbjt_la_SOURCES += bjtnode.c
|
||||
endif
|
||||
|
||||
AM_CPPFLAGS = @AM_CPPFLAGS@ -I$(top_srcdir)/src/include
|
||||
AM_CFLAGS = $(STATIC)
|
||||
|
||||
|
|
|
|||
|
|
@ -31,6 +31,7 @@ extern int BJTtrunc(GENmodel*,CKTcircuit*,double*);
|
|||
extern int BJTdisto(int,GENmodel*,CKTcircuit*);
|
||||
extern int BJTnoise(int,int,GENmodel*,CKTcircuit*,Ndata*,double*);
|
||||
extern int BJTdSetup(GENmodel*, register CKTcircuit*);
|
||||
extern int BJTnodeIsNonLinear (GENmodel *, CKTcircuit *) ;
|
||||
|
||||
#endif
|
||||
|
||||
|
|
|
|||
|
|
@ -73,12 +73,17 @@ SPICEdev BJTinfo = { /* description from struct IFdevice */
|
|||
#endif
|
||||
/* DEVinstSize */ &BJTiSize,
|
||||
/* DEVmodSize */ &BJTmSize,
|
||||
|
||||
#if defined(KLU) || defined(SuperLU) || defined(UMFPACK)
|
||||
/* DEVbindCSC */ BJTbindCSC,
|
||||
/* DEVbindCSCComplex */ BJTbindCSCComplex,
|
||||
/* DEVbindCSCComplexToReal */ BJTbindCSCComplexToReal,
|
||||
#endif
|
||||
|
||||
#ifdef KIRCHHOFF
|
||||
/* DEVnodeIsNonLinear */ BJTnodeIsNonLinear
|
||||
#endif
|
||||
|
||||
};
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -0,0 +1,31 @@
|
|||
/**********
|
||||
Author: 2013 Francesco Lannutti
|
||||
**********/
|
||||
|
||||
#include "ngspice/ngspice.h"
|
||||
#include "ngspice/cktdefs.h"
|
||||
#include "bjtdefs.h"
|
||||
#include "ngspice/sperror.h"
|
||||
|
||||
int
|
||||
BJTnodeIsNonLinear (GENmodel *inModel, CKTcircuit *ckt)
|
||||
{
|
||||
BJTmodel *model = (BJTmodel *)inModel ;
|
||||
BJTinstance *here ;
|
||||
|
||||
/* loop through all the BJT models */
|
||||
for ( ; model != NULL ; model = model->BJTnextModel)
|
||||
{
|
||||
/* loop through all the instances of the model */
|
||||
for (here = model->BJTinstances ; here != NULL ; here = here->BJTnextInstance)
|
||||
{
|
||||
ckt->CKTnodeIsLinear [here->BJTcolPrimeNode] = 0 ;
|
||||
ckt->CKTnodeIsLinear [here->BJTbasePrimeNode] = 0 ;
|
||||
ckt->CKTnodeIsLinear [here->BJTemitPrimeNode] = 0 ;
|
||||
ckt->CKTnodeIsLinear [here->BJTsubstNode] = 0 ;
|
||||
ckt->CKTnodeIsLinear [here->BJTsubstConNode] = 0 ;
|
||||
}
|
||||
}
|
||||
|
||||
return (OK) ;
|
||||
}
|
||||
|
|
@ -540,11 +540,11 @@ load:
|
|||
,cbe,icbe,cce,icce);
|
||||
|
||||
printf("cc = %.7e + j%.7e , ce = %.7e + j%.7e,",
|
||||
,cc,icc,ce,ice);
|
||||
cc,icc,ce,ice);
|
||||
printf("ccprm = %.7e + j%.7e , ceprm = %.7e + j%.7e",
|
||||
ccprm,iccprm,ceprm,iceprm);
|
||||
printf("cb = %.7e + j%.7e , cbprm = %.7e + j%.7e , ",
|
||||
cb,icb,cbprm,icbprm)
|
||||
cb,icb,cbprm,icbprm);
|
||||
printf("cs = %.7e + j%.7e\n",
|
||||
cs,ics);
|
||||
#endif /* SENSDEBUG */
|
||||
|
|
|
|||
|
|
@ -55,9 +55,8 @@ BJTsUpdate(GENmodel *inModel, CKTcircuit *ckt)
|
|||
sxpbx = 0;
|
||||
#ifdef SENSDEBUG
|
||||
printf("senupdate Instance name: %s\n",here->BJTname);
|
||||
printf("iparmno = %d,CKTag[0] = %.2e,CKTag[1] = %.2e\n",
|
||||
iparmno,ckt->CKTag[0],ckt->CKTag[1]);
|
||||
|
||||
printf("CKTag[0] = %.2e,CKTag[1] = %.2e\n",
|
||||
ckt->CKTag[0],ckt->CKTag[1]);
|
||||
printf("capbe = %.7e\n",here->BJTcapbe);
|
||||
printf("capbc = %.7e\n",here->BJTcapbc);
|
||||
printf("capsub = %.7e\n",here->BJTcapsub);
|
||||
|
|
|
|||
|
|
@ -43,6 +43,10 @@ if UMFPACK_WANTED
|
|||
libbsim1_la_SOURCES += b1bindCSC.c
|
||||
endif
|
||||
|
||||
if KIRCHHOFF_WANTED
|
||||
libbsim1_la_SOURCES += b1node.c
|
||||
endif
|
||||
|
||||
AM_CPPFLAGS = @AM_CPPFLAGS@ -I$(top_srcdir)/src/include
|
||||
AM_CFLAGS = $(STATIC)
|
||||
|
||||
|
|
|
|||
|
|
@ -0,0 +1,30 @@
|
|||
/**********
|
||||
Author: 2013 Francesco Lannutti
|
||||
**********/
|
||||
|
||||
#include "ngspice/ngspice.h"
|
||||
#include "ngspice/cktdefs.h"
|
||||
#include "bsim1def.h"
|
||||
#include "ngspice/sperror.h"
|
||||
|
||||
int
|
||||
B1nodeIsNonLinear (GENmodel *inModel, CKTcircuit *ckt)
|
||||
{
|
||||
B1model *model = (B1model *)inModel ;
|
||||
B1instance *here ;
|
||||
|
||||
/* loop through all the BSIM1 models */
|
||||
for ( ; model != NULL ; model = model->B1nextModel)
|
||||
{
|
||||
/* loop through all the instances of the model */
|
||||
for (here = model->B1instances ; here != NULL ; here = here->B1nextInstance)
|
||||
{
|
||||
ckt->CKTnodeIsLinear [here->B1dNodePrime] = 0 ;
|
||||
ckt->CKTnodeIsLinear [here->B1sNodePrime] = 0 ;
|
||||
ckt->CKTnodeIsLinear [here->B1gNode] = 0 ;
|
||||
ckt->CKTnodeIsLinear [here->B1bNode] = 0 ;
|
||||
}
|
||||
}
|
||||
|
||||
return (OK) ;
|
||||
}
|
||||
|
|
@ -35,3 +35,7 @@ extern int B1bindCSC (GENmodel*, CKTcircuit*) ;
|
|||
extern int B1bindCSCComplex (GENmodel*, CKTcircuit*) ;
|
||||
extern int B1bindCSCComplexToReal (GENmodel*, CKTcircuit*) ;
|
||||
#endif
|
||||
|
||||
#ifdef KIRCHHOFF
|
||||
extern int B1nodeIsNonLinear (GENmodel *, CKTcircuit *) ;
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -73,12 +73,17 @@ SPICEdev B1info = {
|
|||
#endif
|
||||
/* DEVinstSize */ &B1iSize,
|
||||
/* DEVmodSize */ &B1mSize,
|
||||
|
||||
#if defined(KLU) || defined(SuperLU) || defined(UMFPACK)
|
||||
/* DEVbindCSC */ B1bindCSC,
|
||||
/* DEVbindCSCComplex */ B1bindCSCComplex,
|
||||
/* DEVbindCSCComplexToReal */ B1bindCSCComplexToReal,
|
||||
#endif
|
||||
|
||||
#ifdef KIRCHHOFF
|
||||
/* DEVnodeIsNonLinear */ B1nodeIsNonLinear
|
||||
#endif
|
||||
|
||||
};
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -41,6 +41,10 @@ if UMFPACK_WANTED
|
|||
libbsim2_la_SOURCES += b2bindCSC.c
|
||||
endif
|
||||
|
||||
if KIRCHHOFF_WANTED
|
||||
libbsim2_la_SOURCES += b2node.c
|
||||
endif
|
||||
|
||||
AM_CPPFLAGS = @AM_CPPFLAGS@ -I$(top_srcdir)/src/include
|
||||
AM_CFLAGS = $(STATIC)
|
||||
|
||||
|
|
|
|||
|
|
@ -40,13 +40,13 @@ B2load(GENmodel *inModel, CKTcircuit *ckt)
|
|||
double cd;
|
||||
double cdrain;
|
||||
double cdhat;
|
||||
double cdreq;
|
||||
double cdreq, cdreq_fvk ;
|
||||
double ceq;
|
||||
double ceqbd;
|
||||
double ceqbs;
|
||||
double ceqqb;
|
||||
double ceqqd;
|
||||
double ceqqg;
|
||||
double ceqbd, ceqbd_fvk ;
|
||||
double ceqbs, ceqbs_fvk ;
|
||||
double ceqqb, ceqqb_fvk ;
|
||||
double ceqqd, ceqqd_fvk ;
|
||||
double ceqqg, ceqqg_fvk ;
|
||||
double czbd;
|
||||
double czbdsw;
|
||||
double czbs;
|
||||
|
|
@ -628,7 +628,7 @@ line755:
|
|||
|
||||
line850:
|
||||
/* initialize to zero charge conductance and current */
|
||||
ceqqg = ceqqb = ceqqd = 0.0;
|
||||
ceqqg = ceqqg_fvk = ceqqb = ceqqb_fvk = ceqqd = ceqqd_fvk = 0.0;
|
||||
gcdgb = gcddb = gcdsb = 0.0;
|
||||
gcsgb = gcsdb = gcssb = 0.0;
|
||||
gcggb = gcgdb = gcgsb = 0.0;
|
||||
|
|
@ -641,8 +641,11 @@ line860:
|
|||
cqbulk = *(ckt->CKTstate0 + here->B2iqb);
|
||||
cqdrn = *(ckt->CKTstate0 + here->B2iqd);
|
||||
ceqqg = cqgate - gcggb * vgb + gcgdb * vbd + gcgsb * vbs;
|
||||
ceqqg_fvk = cqgate ;
|
||||
ceqqb = cqbulk - gcbgb * vgb + gcbdb * vbd + gcbsb * vbs;
|
||||
ceqqb_fvk = cqbulk ;
|
||||
ceqqd = cqdrn - gcdgb * vgb + gcddb * vbd + gcdsb * vbs;
|
||||
ceqqd_fvk = cqdrn ;
|
||||
|
||||
if(ckt->CKTmode & MODEINITTRAN ) {
|
||||
*(ckt->CKTstate1 + here->B2iqb) =
|
||||
|
|
@ -661,19 +664,25 @@ line900:
|
|||
m = here->B2m;
|
||||
|
||||
ceqbs = model->B2type * (cbs-(gbs-ckt->CKTgmin)*vbs);
|
||||
ceqbs_fvk = model->B2type * (cbs + ckt->CKTgmin * vbs) ;
|
||||
ceqbd = model->B2type * (cbd-(gbd-ckt->CKTgmin)*vbd);
|
||||
|
||||
ceqbd_fvk = model->B2type * (cbd + ckt->CKTgmin * vbd) ;
|
||||
ceqqg = model->B2type * ceqqg;
|
||||
ceqqg_fvk = model->B2type * ceqqg_fvk ;
|
||||
ceqqb = model->B2type * ceqqb;
|
||||
ceqqb_fvk = model->B2type * ceqqb_fvk ;
|
||||
ceqqd = model->B2type * ceqqd;
|
||||
ceqqd_fvk = model->B2type * ceqqd_fvk ;
|
||||
if (here->B2mode >= 0) {
|
||||
xnrm=1;
|
||||
xrev=0;
|
||||
cdreq=model->B2type*(cdrain-gds*vds-gm*vgs-gmbs*vbs);
|
||||
cdreq_fvk = model->B2type * cdrain ;
|
||||
} else {
|
||||
xnrm=0;
|
||||
xrev=1;
|
||||
cdreq = -(model->B2type)*(cdrain+gds*vds-gm*vgd-gmbs*vbd);
|
||||
cdreq_fvk = - (model->B2type * cdrain) ;
|
||||
}
|
||||
|
||||
*(ckt->CKTrhs + here->B2gNode) -= m * (ceqqg);
|
||||
|
|
@ -712,6 +721,24 @@ line900:
|
|||
*(here->B2SPbPtr) += m * (-gbs-(xnrm-xrev)*gmbs-gcsgb-gcsdb-gcssb);
|
||||
*(here->B2SPdpPtr) += m * (-gds-xrev*(gm+gmbs)+gcsdb);
|
||||
|
||||
#ifdef KIRCHHOFF
|
||||
/* KCL verification - Dynamic Part */
|
||||
*(ckt->CKTfvk + here->B2gNode) += m * ceqqg_fvk ;
|
||||
*(ckt->CKTfvk + here->B2bNode) += m * (ceqbs_fvk + ceqbd_fvk + ceqqb_fvk) ;
|
||||
*(ckt->CKTfvk + here->B2dNodePrime) -= m * (ceqbd_fvk - cdreq_fvk - ceqqd_fvk) ;
|
||||
*(ckt->CKTfvk + here->B2sNodePrime) -= m * (cdreq_fvk + ceqbs_fvk + ceqqg_fvk + ceqqb_fvk + ceqqd_fvk) ;
|
||||
|
||||
|
||||
/* KCL verification - Linear and Static Part */
|
||||
*(ckt->CKTfvk + here->B2dNode) += m * (here->B2drainConductance) * *(ckt->CKTrhsOld + here->B2dNode) ;
|
||||
*(ckt->CKTfvk + here->B2sNode) += m * (here->B2sourceConductance) * *(ckt->CKTrhsOld + here->B2sNode) ;
|
||||
*(ckt->CKTfvk + here->B2dNodePrime) += m * (here->B2drainConductance) * *(ckt->CKTrhsOld + here->B2dNodePrime) ;
|
||||
*(ckt->CKTfvk + here->B2sNodePrime) += m * (here->B2sourceConductance) * *(ckt->CKTrhsOld + here->B2sNodePrime) ;
|
||||
*(ckt->CKTfvk + here->B2dNode) += m * (-here->B2drainConductance) * *(ckt->CKTrhsOld + here->B2dNodePrime) ;
|
||||
*(ckt->CKTfvk + here->B2sNode) += m * (-here->B2sourceConductance) * *(ckt->CKTrhsOld + here->B2sNodePrime) ;
|
||||
*(ckt->CKTfvk + here->B2dNodePrime) += m * (-here->B2drainConductance) * *(ckt->CKTrhsOld + here->B2dNode) ;
|
||||
*(ckt->CKTfvk + here->B2sNodePrime) += m * (-here->B2sourceConductance) * *(ckt->CKTrhsOld + here->B2sNode) ;
|
||||
#endif
|
||||
|
||||
line1000: ;
|
||||
|
||||
|
|
|
|||
|
|
@ -0,0 +1,30 @@
|
|||
/**********
|
||||
Author: 2013 Francesco Lannutti
|
||||
**********/
|
||||
|
||||
#include "ngspice/ngspice.h"
|
||||
#include "ngspice/cktdefs.h"
|
||||
#include "bsim2def.h"
|
||||
#include "ngspice/sperror.h"
|
||||
|
||||
int
|
||||
B2nodeIsNonLinear (GENmodel *inModel, CKTcircuit *ckt)
|
||||
{
|
||||
B2model *model = (B2model *)inModel ;
|
||||
B2instance *here ;
|
||||
|
||||
/* loop through all the BSIM2 models */
|
||||
for ( ; model != NULL ; model = model->B2nextModel)
|
||||
{
|
||||
/* loop through all the instances of the model */
|
||||
for (here = model->B2instances ; here != NULL ; here = here->B2nextInstance)
|
||||
{
|
||||
ckt->CKTnodeIsLinear [here->B2dNodePrime] = 0 ;
|
||||
ckt->CKTnodeIsLinear [here->B2sNodePrime] = 0 ;
|
||||
ckt->CKTnodeIsLinear [here->B2gNode] = 0 ;
|
||||
ckt->CKTnodeIsLinear [here->B2bNode] = 0 ;
|
||||
}
|
||||
}
|
||||
|
||||
return (OK) ;
|
||||
}
|
||||
|
|
@ -31,3 +31,7 @@ extern int B2bindCSC (GENmodel*, CKTcircuit*) ;
|
|||
extern int B2bindCSCComplex (GENmodel*, CKTcircuit*) ;
|
||||
extern int B2bindCSCComplexToReal (GENmodel*, CKTcircuit*) ;
|
||||
#endif
|
||||
|
||||
#ifdef KIRCHHOFF
|
||||
extern int B2nodeIsNonLinear (GENmodel *, CKTcircuit *) ;
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -73,12 +73,17 @@ SPICEdev B2info = {
|
|||
#endif
|
||||
/* DEVinstSize */ &B2iSize,
|
||||
/* DEVmodSize */ &B2mSize,
|
||||
|
||||
#if defined(KLU) || defined(SuperLU) || defined(UMFPACK)
|
||||
/* DEVbindCSC */ B2bindCSC,
|
||||
/* DEVbindCSCComplex */ B2bindCSCComplex,
|
||||
/* DEVbindCSCComplexToReal */ B2bindCSCComplexToReal,
|
||||
#endif
|
||||
|
||||
#ifdef KIRCHHOFF
|
||||
/* DEVnodeIsNonLinear */ B2nodeIsNonLinear
|
||||
#endif
|
||||
|
||||
};
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -40,6 +40,10 @@ if UMFPACK_WANTED
|
|||
libbsim3_la_SOURCES += b3bindCSC.c
|
||||
endif
|
||||
|
||||
if KIRCHHOFF_WANTED
|
||||
libbsim3_la_SOURCES += b3node.c
|
||||
endif
|
||||
|
||||
AM_CPPFLAGS = @AM_CPPFLAGS@ -I$(top_srcdir)/src/include
|
||||
AM_CFLAGS = $(STATIC)
|
||||
|
||||
|
|
|
|||
|
|
@ -26,44 +26,50 @@ IOP( "nrs", BSIM3_NRS, IF_REAL , "Number of squares in source"),
|
|||
IOP( "off", BSIM3_OFF, IF_FLAG , "Device is initially off"),
|
||||
IOP( "nqsmod", BSIM3_NQSMOD, IF_INTEGER, "Non-quasi-static model selector"),
|
||||
IOP( "acnqsmod", BSIM3_ACNQSMOD, IF_INTEGER, "AC NQS model selector"),
|
||||
IOP( "geo", BSIM3_GEO, IF_INTEGER, "ACM model drain/source connection"),
|
||||
IOP( "delvto", BSIM3_DELVTO, IF_REAL, "Zero bias threshold voltage variation"),
|
||||
IOP( "mulu0", BSIM3_MULU0, IF_REAL, "Low field mobility multiplier"),
|
||||
IP( "ic", BSIM3_IC, IF_REALVEC , "Vector of DS,GS,BS initial voltages"),
|
||||
OP( "gmbs", BSIM3_GMBS, IF_REAL, "Gmb"),
|
||||
OP( "gm", BSIM3_GM, IF_REAL, "Gm"),
|
||||
OP( "gds", BSIM3_GDS, IF_REAL, "Gds"),
|
||||
OP( "vdsat", BSIM3_VDSAT, IF_REAL, "Vdsat"),
|
||||
OP( "vth", BSIM3_VON, IF_REAL, "Vth"),
|
||||
OP( "id", BSIM3_CD, IF_REAL, "Ids"),
|
||||
OP( "vbs", BSIM3_VBS, IF_REAL, "Vbs"),
|
||||
OP( "vgs", BSIM3_VGS, IF_REAL, "Vgs"),
|
||||
OP( "vds", BSIM3_VDS, IF_REAL, "Vds"),
|
||||
OP( "ibd", BSIM3_CBD, IF_REAL, "Ibd"), /* newly added from here */
|
||||
OP( "ibs", BSIM3_CBS, IF_REAL, "Ibs"),
|
||||
OP( "gbd", BSIM3_GBD, IF_REAL, "gbd"),
|
||||
OP( "gbs", BSIM3_GBS, IF_REAL, "gbs"),
|
||||
OP( "qb", BSIM3_QB, IF_REAL, "Qbulk"),
|
||||
OP( "cqb", BSIM3_CQB, IF_REAL, "CQbulk"),
|
||||
OP( "qg", BSIM3_QG, IF_REAL, "Qgate"),
|
||||
OP( "cqg", BSIM3_CQG, IF_REAL, "CQgate"),
|
||||
OP( "qd", BSIM3_QD, IF_REAL, "Qdrain"),
|
||||
OP( "cqd", BSIM3_CQD, IF_REAL, "CQdrain"),
|
||||
OP( "cgg", BSIM3_CGG, IF_REAL, "Cggb"),
|
||||
OP( "cgd", BSIM3_CGD, IF_REAL, "Cgdb"),
|
||||
OP( "cgs", BSIM3_CGS, IF_REAL, "Cgsb"),
|
||||
OP( "cdg", BSIM3_CDG, IF_REAL, "Cdgb"),
|
||||
OP( "cdd", BSIM3_CDD, IF_REAL, "Cddb"),
|
||||
OP( "cds", BSIM3_CDS, IF_REAL, "Cdsb"),
|
||||
OP( "cbg", BSIM3_CBG, IF_REAL, "Cbgb"),
|
||||
OP( "cbd", BSIM3_CBDB, IF_REAL, "Cbdb"),
|
||||
OP( "cbs", BSIM3_CBSB, IF_REAL, "Cbsb"),
|
||||
OP( "capbd", BSIM3_CAPBD, IF_REAL, "Capbd"),
|
||||
OP( "capbs", BSIM3_CAPBS, IF_REAL, "Capbs"),
|
||||
OP( "gmbs", BSIM3_GMBS, IF_REAL, "Gmb"),
|
||||
OP( "gm", BSIM3_GM, IF_REAL, "Gm"),
|
||||
OP( "gds", BSIM3_GDS, IF_REAL, "Gds"),
|
||||
OP( "vdsat", BSIM3_VDSAT, IF_REAL, "Vdsat"),
|
||||
OP( "vth", BSIM3_VON, IF_REAL, "Vth"),
|
||||
OP( "id", BSIM3_CD, IF_REAL, "Ids"),
|
||||
OP( "vbs", BSIM3_VBS, IF_REAL, "Vbs"),
|
||||
OP( "vgs", BSIM3_VGS, IF_REAL, "Vgs"),
|
||||
OP( "vds", BSIM3_VDS, IF_REAL, "Vds"),
|
||||
OP( "ibd", BSIM3_CBD, IF_REAL, "Ibd"), /* newly added from here */
|
||||
OP( "ibs", BSIM3_CBS, IF_REAL, "Ibs"),
|
||||
OP( "gbd", BSIM3_GBD, IF_REAL, "gbd"),
|
||||
OP( "gbs", BSIM3_GBS, IF_REAL, "gbs"),
|
||||
OP( "qb", BSIM3_QB, IF_REAL, "Qbulk"),
|
||||
OP( "cqb", BSIM3_CQB, IF_REAL, "CQbulk"),
|
||||
OP( "qg", BSIM3_QG, IF_REAL, "Qgate"),
|
||||
OP( "cqg", BSIM3_CQG, IF_REAL, "CQgate"),
|
||||
OP( "qd", BSIM3_QD, IF_REAL, "Qdrain"),
|
||||
OP( "cqd", BSIM3_CQD, IF_REAL, "CQdrain"),
|
||||
OP( "cgg", BSIM3_CGG, IF_REAL, "Cggb"),
|
||||
OP( "cgd", BSIM3_CGD, IF_REAL, "Cgdb"),
|
||||
OP( "cgs", BSIM3_CGS, IF_REAL, "Cgsb"),
|
||||
OP( "cdg", BSIM3_CDG, IF_REAL, "Cdgb"),
|
||||
OP( "cdd", BSIM3_CDD, IF_REAL, "Cddb"),
|
||||
OP( "cds", BSIM3_CDS, IF_REAL, "Cdsb"),
|
||||
OP( "cbg", BSIM3_CBG, IF_REAL, "Cbgb"),
|
||||
OP( "cbd", BSIM3_CBDB, IF_REAL, "Cbdb"),
|
||||
OP( "cbs", BSIM3_CBSB, IF_REAL, "Cbsb"),
|
||||
OP( "capbd", BSIM3_CAPBD, IF_REAL, "Capbd"),
|
||||
OP( "capbs", BSIM3_CAPBS, IF_REAL, "Capbs"),
|
||||
};
|
||||
|
||||
IFparm BSIM3mPTable[] = { /* model parameters */
|
||||
IOP( "capmod", BSIM3_MOD_CAPMOD, IF_INTEGER, "Capacitance model selector"),
|
||||
IOP( "mobmod", BSIM3_MOD_MOBMOD, IF_INTEGER, "Mobility model selector"),
|
||||
IOP( "noimod", BSIM3_MOD_NOIMOD, IF_INTEGER, "Noise model selector"),
|
||||
IOP( "nqsmod", BSIM3_MOD_NQSMOD, IF_INTEGER, "Non-quasi-static model selector"),
|
||||
IOP( "acnqsmod", BSIM3_MOD_ACNQSMOD, IF_INTEGER, "AC NQS model selector"),
|
||||
IOP( "acm", BSIM3_MOD_ACMMOD, IF_INTEGER, "Area calculation method selector"),
|
||||
IOP( "calcacm", BSIM3_MOD_CALCACM, IF_INTEGER, "Area calculation method ACM=12"),
|
||||
IOP( "paramchk", BSIM3_MOD_PARAMCHK, IF_INTEGER, "Model parameter checking selector"),
|
||||
IOP( "binunit", BSIM3_MOD_BINUNIT, IF_INTEGER, "Bin unit selector"),
|
||||
IOP( "version", BSIM3_MOD_VERSION, IF_STRING, " parameter for model version"),
|
||||
|
|
@ -180,6 +186,10 @@ IOP( "lwl", BSIM3_MOD_LWL, IF_REAL, "Length reduction parameter"),
|
|||
IOP( "lwlc", BSIM3_MOD_LWLC, IF_REAL, "Length reduction parameter for CV"),
|
||||
IOP( "lmin", BSIM3_MOD_LMIN, IF_REAL, "Minimum length for the model"),
|
||||
IOP( "lmax", BSIM3_MOD_LMAX, IF_REAL, "Maximum length for the model"),
|
||||
|
||||
IOP( "xl", BSIM3_MOD_XL, IF_REAL, "Length correction parameter"),
|
||||
IOP( "xw", BSIM3_MOD_XW, IF_REAL, "Width correction parameter"),
|
||||
|
||||
IOP( "wr", BSIM3_MOD_WR, IF_REAL, "Width dependence of rds"),
|
||||
IOP( "wint", BSIM3_MOD_WINT, IF_REAL, "Width reduction parameter"),
|
||||
IOP( "dwg", BSIM3_MOD_DWG, IF_REAL, "Width reduction parameter"),
|
||||
|
|
@ -208,6 +218,15 @@ IOP( "cle", BSIM3_MOD_CLE, IF_REAL, "Vdsat parameter for C-V model"),
|
|||
IOP( "dwc", BSIM3_MOD_DWC, IF_REAL, "Delta W for C-V model"),
|
||||
IOP( "dlc", BSIM3_MOD_DLC, IF_REAL, "Delta L for C-V model"),
|
||||
|
||||
IOP( "hdif", BSIM3_MOD_HDIF, IF_REAL, "ACM Parameter: Distance Gate - contact"),
|
||||
IOP( "ldif", BSIM3_MOD_LDIF, IF_REAL, "ACM Parameter: Length of LDD Gate-Source/Drain"),
|
||||
IOP( "ld", BSIM3_MOD_LD, IF_REAL, "ACM Parameter: Length of LDD under Gate"),
|
||||
IOP( "rd", BSIM3_MOD_RD, IF_REAL, "ACM Parameter: Resistance of LDD drain side"),
|
||||
IOP( "rs", BSIM3_MOD_RS, IF_REAL, "ACM Parameter: Resistance of LDD source side"),
|
||||
IOP( "rdc", BSIM3_MOD_RDC, IF_REAL, "ACM Parameter: Resistance contact drain side"),
|
||||
IOP( "rsc", BSIM3_MOD_RSC, IF_REAL, "ACM Parameter: Resistance contact source side"),
|
||||
IOP( "wmlt", BSIM3_MOD_WMLT, IF_REAL, "ACM Parameter: Width shrink factor"),
|
||||
|
||||
IOP( "alpha0", BSIM3_MOD_ALPHA0, IF_REAL, "substrate current model parameter"),
|
||||
IOP( "alpha1", BSIM3_MOD_ALPHA1, IF_REAL, "substrate current model parameter"),
|
||||
IOP( "beta0", BSIM3_MOD_BETA0, IF_REAL, "substrate current model parameter"),
|
||||
|
|
@ -493,11 +512,11 @@ char *BSIM3names[] = {
|
|||
"Charge"
|
||||
};
|
||||
|
||||
int BSIM3nSize = NUMELEMS(BSIM3names);
|
||||
int BSIM3pTSize = NUMELEMS(BSIM3pTable);
|
||||
int BSIM3mPTSize = NUMELEMS(BSIM3mPTable);
|
||||
int BSIM3iSize = sizeof(BSIM3instance);
|
||||
int BSIM3mSize = sizeof(BSIM3model);
|
||||
int BSIM3nSize = NUMELEMS(BSIM3names);
|
||||
int BSIM3pTSize = NUMELEMS(BSIM3pTable);
|
||||
int BSIM3mPTSize = NUMELEMS(BSIM3mPTable);
|
||||
int BSIM3iSize = sizeof(BSIM3instance);
|
||||
int BSIM3mSize = sizeof(BSIM3model);
|
||||
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -65,6 +65,15 @@ BSIM3instance *here = (BSIM3instance*)inst;
|
|||
case BSIM3_ACNQSMOD:
|
||||
value->iValue = here->BSIM3acnqsMod;
|
||||
return(OK);
|
||||
case BSIM3_GEO:
|
||||
value->iValue = here->BSIM3geo;
|
||||
return(OK);
|
||||
case BSIM3_DELVTO:
|
||||
value->rValue = here->BSIM3delvto;
|
||||
return(OK);
|
||||
case BSIM3_MULU0:
|
||||
value->rValue = here->BSIM3mulu0;
|
||||
return(OK);
|
||||
case BSIM3_IC_VBS:
|
||||
value->rValue = here->BSIM3icVBS;
|
||||
return(OK);
|
||||
|
|
@ -94,11 +103,11 @@ BSIM3instance *here = (BSIM3instance*)inst;
|
|||
return(OK);
|
||||
case BSIM3_SOURCECONDUCT:
|
||||
value->rValue = here->BSIM3sourceConductance;
|
||||
value->rValue *= here->BSIM3m;
|
||||
value->rValue *= here->BSIM3m;
|
||||
return(OK);
|
||||
case BSIM3_DRAINCONDUCT:
|
||||
value->rValue = here->BSIM3drainConductance;
|
||||
value->rValue *= here->BSIM3m;
|
||||
value->rValue *= here->BSIM3m;
|
||||
return(OK);
|
||||
case BSIM3_VBD:
|
||||
value->rValue = *(ckt->CKTstate0 + here->BSIM3vbd);
|
||||
|
|
@ -114,103 +123,103 @@ BSIM3instance *here = (BSIM3instance*)inst;
|
|||
return(OK);
|
||||
case BSIM3_CD:
|
||||
value->rValue = here->BSIM3cd;
|
||||
value->rValue *= here->BSIM3m;
|
||||
value->rValue *= here->BSIM3m;
|
||||
return(OK);
|
||||
case BSIM3_CBS:
|
||||
value->rValue = here->BSIM3cbs;
|
||||
value->rValue *= here->BSIM3m;
|
||||
value->rValue *= here->BSIM3m;
|
||||
return(OK);
|
||||
case BSIM3_CBD:
|
||||
value->rValue = here->BSIM3cbd;
|
||||
value->rValue *= here->BSIM3m;
|
||||
value->rValue *= here->BSIM3m;
|
||||
return(OK);
|
||||
case BSIM3_GM:
|
||||
value->rValue = here->BSIM3gm;
|
||||
value->rValue *= here->BSIM3m;
|
||||
value->rValue *= here->BSIM3m;
|
||||
return(OK);
|
||||
case BSIM3_GDS:
|
||||
value->rValue = here->BSIM3gds;
|
||||
value->rValue *= here->BSIM3m;
|
||||
value->rValue *= here->BSIM3m;
|
||||
return(OK);
|
||||
case BSIM3_GMBS:
|
||||
value->rValue = here->BSIM3gmbs;
|
||||
value->rValue *= here->BSIM3m;
|
||||
value->rValue *= here->BSIM3m;
|
||||
return(OK);
|
||||
case BSIM3_GBD:
|
||||
value->rValue = here->BSIM3gbd;
|
||||
value->rValue *= here->BSIM3m;
|
||||
value->rValue *= here->BSIM3m;
|
||||
return(OK);
|
||||
case BSIM3_GBS:
|
||||
value->rValue = here->BSIM3gbs;
|
||||
value->rValue *= here->BSIM3m;
|
||||
value->rValue *= here->BSIM3m;
|
||||
return(OK);
|
||||
case BSIM3_QB:
|
||||
value->rValue = *(ckt->CKTstate0 + here->BSIM3qb);
|
||||
value->rValue *= here->BSIM3m;
|
||||
value->rValue *= here->BSIM3m;
|
||||
return(OK);
|
||||
case BSIM3_CQB:
|
||||
value->rValue = *(ckt->CKTstate0 + here->BSIM3cqb);
|
||||
value->rValue *= here->BSIM3m;
|
||||
value->rValue *= here->BSIM3m;
|
||||
return(OK);
|
||||
case BSIM3_QG:
|
||||
value->rValue = *(ckt->CKTstate0 + here->BSIM3qg);
|
||||
value->rValue *= here->BSIM3m;
|
||||
value->rValue *= here->BSIM3m;
|
||||
return(OK);
|
||||
case BSIM3_CQG:
|
||||
value->rValue = *(ckt->CKTstate0 + here->BSIM3cqg);
|
||||
value->rValue *= here->BSIM3m;
|
||||
value->rValue *= here->BSIM3m;
|
||||
return(OK);
|
||||
case BSIM3_QD:
|
||||
value->rValue = *(ckt->CKTstate0 + here->BSIM3qd);
|
||||
value->rValue *= here->BSIM3m;
|
||||
value->rValue *= here->BSIM3m;
|
||||
return(OK);
|
||||
case BSIM3_CQD:
|
||||
value->rValue = *(ckt->CKTstate0 + here->BSIM3cqd);
|
||||
value->rValue *= here->BSIM3m;
|
||||
value->rValue *= here->BSIM3m;
|
||||
return(OK);
|
||||
case BSIM3_CGG:
|
||||
value->rValue = here->BSIM3cggb;
|
||||
value->rValue *= here->BSIM3m;
|
||||
value->rValue *= here->BSIM3m;
|
||||
return(OK);
|
||||
case BSIM3_CGD:
|
||||
value->rValue = here->BSIM3cgdb;
|
||||
value->rValue *= here->BSIM3m;
|
||||
value->rValue *= here->BSIM3m;
|
||||
return(OK);
|
||||
case BSIM3_CGS:
|
||||
value->rValue = here->BSIM3cgsb;
|
||||
value->rValue *= here->BSIM3m;
|
||||
value->rValue *= here->BSIM3m;
|
||||
return(OK);
|
||||
case BSIM3_CDG:
|
||||
value->rValue = here->BSIM3cdgb;
|
||||
value->rValue *= here->BSIM3m;
|
||||
value->rValue *= here->BSIM3m;
|
||||
return(OK);
|
||||
case BSIM3_CDD:
|
||||
value->rValue = here->BSIM3cddb;
|
||||
value->rValue *= here->BSIM3m;
|
||||
value->rValue *= here->BSIM3m;
|
||||
return(OK);
|
||||
case BSIM3_CDS:
|
||||
value->rValue = here->BSIM3cdsb;
|
||||
value->rValue *= here->BSIM3m;
|
||||
value->rValue *= here->BSIM3m;
|
||||
return(OK);
|
||||
case BSIM3_CBG:
|
||||
value->rValue = here->BSIM3cbgb;
|
||||
value->rValue *= here->BSIM3m;
|
||||
value->rValue *= here->BSIM3m;
|
||||
return(OK);
|
||||
case BSIM3_CBDB:
|
||||
value->rValue = here->BSIM3cbdb;
|
||||
value->rValue *= here->BSIM3m;
|
||||
value->rValue *= here->BSIM3m;
|
||||
return(OK);
|
||||
case BSIM3_CBSB:
|
||||
value->rValue = here->BSIM3cbsb;
|
||||
value->rValue *= here->BSIM3m;
|
||||
value->rValue *= here->BSIM3m;
|
||||
return(OK);
|
||||
case BSIM3_CAPBD:
|
||||
value->rValue = here->BSIM3capbd;
|
||||
value->rValue *= here->BSIM3m;
|
||||
value->rValue *= here->BSIM3m;
|
||||
return(OK);
|
||||
case BSIM3_CAPBS:
|
||||
value->rValue = here->BSIM3capbs;
|
||||
value->rValue *= here->BSIM3m;
|
||||
value->rValue *= here->BSIM3m;
|
||||
return(OK);
|
||||
case BSIM3_VON:
|
||||
value->rValue = here->BSIM3von;
|
||||
|
|
@ -220,11 +229,11 @@ BSIM3instance *here = (BSIM3instance*)inst;
|
|||
return(OK);
|
||||
case BSIM3_QBS:
|
||||
value->rValue = *(ckt->CKTstate0 + here->BSIM3qbs);
|
||||
value->rValue *= here->BSIM3m;
|
||||
value->rValue *= here->BSIM3m;
|
||||
return(OK);
|
||||
case BSIM3_QBD:
|
||||
value->rValue = *(ckt->CKTstate0 + here->BSIM3qbd);
|
||||
value->rValue *= here->BSIM3m;
|
||||
value->rValue *= here->BSIM3m;
|
||||
return(OK);
|
||||
default:
|
||||
return(E_BADPARM);
|
||||
|
|
|
|||
|
|
@ -31,29 +31,29 @@ FILE *fplog;
|
|||
|
||||
NG_IGNORE(ckt);
|
||||
|
||||
if ((fplog = fopen("b3v3check.log", "w")) != NULL)
|
||||
if ((fplog = fopen("b3v33check.log", "w")) != NULL)
|
||||
{ pParam = here->pParam;
|
||||
fprintf(fplog, "BSIM3v3.3.0 Parameter Checking.\n");
|
||||
if ((strcmp(model->BSIM3version, "3.3.0")) && (strcmp(model->BSIM3version, "3.30")) && (strcmp(model->BSIM3version, "3.3")))
|
||||
if ((strncmp(model->BSIM3version, "3.3.0", 5)) && (strncmp(model->BSIM3version, "3.30", 4)) && (strncmp(model->BSIM3version, "3.3", 3)))
|
||||
{ fprintf(fplog, "Warning: This model is BSIM3v3.3.0; you specified a wrong version number.\n");
|
||||
printf("Warning: This model is BSIM3v3.3.0; you specified a wrong version number.\n");
|
||||
}
|
||||
fprintf(fplog, "Model = %s\n", model->BSIM3modName);
|
||||
|
||||
if (pParam->BSIM3nlx < -pParam->BSIM3leff)
|
||||
{ fprintf(fplog, "Fatal: Nlx = %g is less than -Leff.\n",
|
||||
pParam->BSIM3nlx);
|
||||
printf("Fatal: Nlx = %g is less than -Leff.\n",
|
||||
pParam->BSIM3nlx);
|
||||
Fatal_Flag = 1;
|
||||
{ fprintf(fplog, "Fatal: Nlx = %g is less than -Leff.\n",
|
||||
pParam->BSIM3nlx);
|
||||
printf("Fatal: Nlx = %g is less than -Leff.\n",
|
||||
pParam->BSIM3nlx);
|
||||
Fatal_Flag = 1;
|
||||
}
|
||||
|
||||
if (model->BSIM3tox <= 0.0)
|
||||
{ fprintf(fplog, "Fatal: Tox = %g is not positive.\n",
|
||||
model->BSIM3tox);
|
||||
printf("Fatal: Tox = %g is not positive.\n", model->BSIM3tox);
|
||||
Fatal_Flag = 1;
|
||||
}
|
||||
if (model->BSIM3tox <= 0.0)
|
||||
{ fprintf(fplog, "Fatal: Tox = %g is not positive.\n",
|
||||
model->BSIM3tox);
|
||||
printf("Fatal: Tox = %g is not positive.\n", model->BSIM3tox);
|
||||
Fatal_Flag = 1;
|
||||
}
|
||||
|
||||
if (model->BSIM3toxm <= 0.0)
|
||||
{ fprintf(fplog, "Fatal: Toxm = %g is not positive.\n",
|
||||
|
|
@ -70,104 +70,104 @@ FILE *fplog;
|
|||
Fatal_Flag = 1;
|
||||
}
|
||||
|
||||
if (pParam->BSIM3npeak <= 0.0)
|
||||
{ fprintf(fplog, "Fatal: Nch = %g is not positive.\n",
|
||||
pParam->BSIM3npeak);
|
||||
printf("Fatal: Nch = %g is not positive.\n",
|
||||
pParam->BSIM3npeak);
|
||||
Fatal_Flag = 1;
|
||||
}
|
||||
if (pParam->BSIM3nsub <= 0.0)
|
||||
{ fprintf(fplog, "Fatal: Nsub = %g is not positive.\n",
|
||||
pParam->BSIM3nsub);
|
||||
printf("Fatal: Nsub = %g is not positive.\n",
|
||||
pParam->BSIM3nsub);
|
||||
Fatal_Flag = 1;
|
||||
}
|
||||
if (pParam->BSIM3ngate < 0.0)
|
||||
{ fprintf(fplog, "Fatal: Ngate = %g is not positive.\n",
|
||||
pParam->BSIM3ngate);
|
||||
printf("Fatal: Ngate = %g Ngate is not positive.\n",
|
||||
pParam->BSIM3ngate);
|
||||
Fatal_Flag = 1;
|
||||
}
|
||||
if (pParam->BSIM3ngate > 1.e25)
|
||||
{ fprintf(fplog, "Fatal: Ngate = %g is too high.\n",
|
||||
pParam->BSIM3ngate);
|
||||
printf("Fatal: Ngate = %g Ngate is too high\n",
|
||||
pParam->BSIM3ngate);
|
||||
Fatal_Flag = 1;
|
||||
}
|
||||
if (pParam->BSIM3xj <= 0.0)
|
||||
{ fprintf(fplog, "Fatal: Xj = %g is not positive.\n",
|
||||
pParam->BSIM3xj);
|
||||
printf("Fatal: Xj = %g is not positive.\n", pParam->BSIM3xj);
|
||||
Fatal_Flag = 1;
|
||||
}
|
||||
|
||||
if (pParam->BSIM3dvt1 < 0.0)
|
||||
{ fprintf(fplog, "Fatal: Dvt1 = %g is negative.\n",
|
||||
pParam->BSIM3dvt1);
|
||||
printf("Fatal: Dvt1 = %g is negative.\n", pParam->BSIM3dvt1);
|
||||
Fatal_Flag = 1;
|
||||
}
|
||||
|
||||
if (pParam->BSIM3dvt1w < 0.0)
|
||||
{ fprintf(fplog, "Fatal: Dvt1w = %g is negative.\n",
|
||||
pParam->BSIM3dvt1w);
|
||||
printf("Fatal: Dvt1w = %g is negative.\n", pParam->BSIM3dvt1w);
|
||||
Fatal_Flag = 1;
|
||||
}
|
||||
|
||||
if (pParam->BSIM3w0 == -pParam->BSIM3weff)
|
||||
{ fprintf(fplog, "Fatal: (W0 + Weff) = 0 causing divided-by-zero.\n");
|
||||
printf("Fatal: (W0 + Weff) = 0 causing divided-by-zero.\n");
|
||||
Fatal_Flag = 1;
|
||||
if (pParam->BSIM3npeak <= 0.0)
|
||||
{ fprintf(fplog, "Fatal: Nch = %g is not positive.\n",
|
||||
pParam->BSIM3npeak);
|
||||
printf("Fatal: Nch = %g is not positive.\n",
|
||||
pParam->BSIM3npeak);
|
||||
Fatal_Flag = 1;
|
||||
}
|
||||
if (pParam->BSIM3nsub <= 0.0)
|
||||
{ fprintf(fplog, "Fatal: Nsub = %g is not positive.\n",
|
||||
pParam->BSIM3nsub);
|
||||
printf("Fatal: Nsub = %g is not positive.\n",
|
||||
pParam->BSIM3nsub);
|
||||
Fatal_Flag = 1;
|
||||
}
|
||||
if (pParam->BSIM3ngate < 0.0)
|
||||
{ fprintf(fplog, "Fatal: Ngate = %g is not positive.\n",
|
||||
pParam->BSIM3ngate);
|
||||
printf("Fatal: Ngate = %g Ngate is not positive.\n",
|
||||
pParam->BSIM3ngate);
|
||||
Fatal_Flag = 1;
|
||||
}
|
||||
if (pParam->BSIM3ngate > 1.e25)
|
||||
{ fprintf(fplog, "Fatal: Ngate = %g is too high.\n",
|
||||
pParam->BSIM3ngate);
|
||||
printf("Fatal: Ngate = %g Ngate is too high\n",
|
||||
pParam->BSIM3ngate);
|
||||
Fatal_Flag = 1;
|
||||
}
|
||||
if (pParam->BSIM3xj <= 0.0)
|
||||
{ fprintf(fplog, "Fatal: Xj = %g is not positive.\n",
|
||||
pParam->BSIM3xj);
|
||||
printf("Fatal: Xj = %g is not positive.\n", pParam->BSIM3xj);
|
||||
Fatal_Flag = 1;
|
||||
}
|
||||
|
||||
if (pParam->BSIM3dsub < 0.0)
|
||||
{ fprintf(fplog, "Fatal: Dsub = %g is negative.\n", pParam->BSIM3dsub);
|
||||
printf("Fatal: Dsub = %g is negative.\n", pParam->BSIM3dsub);
|
||||
Fatal_Flag = 1;
|
||||
}
|
||||
if (pParam->BSIM3b1 == -pParam->BSIM3weff)
|
||||
{ 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->BSIM3dvt1 < 0.0)
|
||||
{ fprintf(fplog, "Fatal: Dvt1 = %g is negative.\n",
|
||||
pParam->BSIM3dvt1);
|
||||
printf("Fatal: Dvt1 = %g is negative.\n", pParam->BSIM3dvt1);
|
||||
Fatal_Flag = 1;
|
||||
}
|
||||
|
||||
if (pParam->BSIM3dvt1w < 0.0)
|
||||
{ fprintf(fplog, "Fatal: Dvt1w = %g is negative.\n",
|
||||
pParam->BSIM3dvt1w);
|
||||
printf("Fatal: Dvt1w = %g is negative.\n", pParam->BSIM3dvt1w);
|
||||
Fatal_Flag = 1;
|
||||
}
|
||||
|
||||
if (pParam->BSIM3w0 == -pParam->BSIM3weff)
|
||||
{ fprintf(fplog, "Fatal: (W0 + Weff) = 0 causing divided-by-zero.\n");
|
||||
printf("Fatal: (W0 + Weff) = 0 causing divided-by-zero.\n");
|
||||
Fatal_Flag = 1;
|
||||
}
|
||||
|
||||
if (pParam->BSIM3dsub < 0.0)
|
||||
{ fprintf(fplog, "Fatal: Dsub = %g is negative.\n", pParam->BSIM3dsub);
|
||||
printf("Fatal: Dsub = %g is negative.\n", pParam->BSIM3dsub);
|
||||
Fatal_Flag = 1;
|
||||
}
|
||||
if (pParam->BSIM3b1 == -pParam->BSIM3weff)
|
||||
{ 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->BSIM3u0temp <= 0.0)
|
||||
{ fprintf(fplog, "Fatal: u0 at current temperature = %g is not positive.\n", pParam->BSIM3u0temp);
|
||||
printf("Fatal: u0 at current temperature = %g is not positive.\n",
|
||||
pParam->BSIM3u0temp);
|
||||
Fatal_Flag = 1;
|
||||
{ fprintf(fplog, "Fatal: u0 at current temperature = %g is not positive.\n", pParam->BSIM3u0temp);
|
||||
printf("Fatal: u0 at current temperature = %g is not positive.\n",
|
||||
pParam->BSIM3u0temp);
|
||||
Fatal_Flag = 1;
|
||||
}
|
||||
|
||||
/* Check delta parameter */
|
||||
if (pParam->BSIM3delta < 0.0)
|
||||
{ fprintf(fplog, "Fatal: Delta = %g is less than zero.\n",
|
||||
pParam->BSIM3delta);
|
||||
printf("Fatal: Delta = %g is less than zero.\n", pParam->BSIM3delta);
|
||||
Fatal_Flag = 1;
|
||||
{ fprintf(fplog, "Fatal: Delta = %g is less than zero.\n",
|
||||
pParam->BSIM3delta);
|
||||
printf("Fatal: Delta = %g is less than zero.\n", pParam->BSIM3delta);
|
||||
Fatal_Flag = 1;
|
||||
}
|
||||
|
||||
if (pParam->BSIM3vsattemp <= 0.0)
|
||||
{ fprintf(fplog, "Fatal: Vsat at current temperature = %g is not positive.\n", pParam->BSIM3vsattemp);
|
||||
printf("Fatal: Vsat at current temperature = %g is not positive.\n",
|
||||
pParam->BSIM3vsattemp);
|
||||
Fatal_Flag = 1;
|
||||
}
|
||||
if (pParam->BSIM3vsattemp <= 0.0)
|
||||
{ fprintf(fplog, "Fatal: Vsat at current temperature = %g is not positive.\n", pParam->BSIM3vsattemp);
|
||||
printf("Fatal: Vsat at current temperature = %g is not positive.\n",
|
||||
pParam->BSIM3vsattemp);
|
||||
Fatal_Flag = 1;
|
||||
}
|
||||
/* Check Rout parameters */
|
||||
if (pParam->BSIM3pclm <= 0.0)
|
||||
{ fprintf(fplog, "Fatal: Pclm = %g is not positive.\n", pParam->BSIM3pclm);
|
||||
printf("Fatal: Pclm = %g is not positive.\n", pParam->BSIM3pclm);
|
||||
Fatal_Flag = 1;
|
||||
}
|
||||
if (pParam->BSIM3pclm <= 0.0)
|
||||
{ fprintf(fplog, "Fatal: Pclm = %g is not positive.\n", pParam->BSIM3pclm);
|
||||
printf("Fatal: Pclm = %g is not positive.\n", pParam->BSIM3pclm);
|
||||
Fatal_Flag = 1;
|
||||
}
|
||||
|
||||
if (pParam->BSIM3drout < 0.0)
|
||||
{ fprintf(fplog, "Fatal: Drout = %g is negative.\n", pParam->BSIM3drout);
|
||||
printf("Fatal: Drout = %g is negative.\n", pParam->BSIM3drout);
|
||||
Fatal_Flag = 1;
|
||||
}
|
||||
if (pParam->BSIM3drout < 0.0)
|
||||
{ fprintf(fplog, "Fatal: Drout = %g is negative.\n", pParam->BSIM3drout);
|
||||
printf("Fatal: Drout = %g is negative.\n", pParam->BSIM3drout);
|
||||
Fatal_Flag = 1;
|
||||
}
|
||||
|
||||
if (pParam->BSIM3pscbe2 <= 0.0)
|
||||
{ fprintf(fplog, "Warning: Pscbe2 = %g is not positive.\n",
|
||||
|
|
@ -175,22 +175,31 @@ FILE *fplog;
|
|||
printf("Warning: Pscbe2 = %g is not positive.\n", pParam->BSIM3pscbe2);
|
||||
}
|
||||
|
||||
if (model->BSIM3unitLengthSidewallJctCap > 0.0 ||
|
||||
model->BSIM3unitLengthGateSidewallJctCap > 0.0)
|
||||
{
|
||||
if (here->BSIM3drainPerimeter < pParam->BSIM3weff)
|
||||
{ fprintf(fplog, "Warning: Pd = %g is less than W.\n",
|
||||
here->BSIM3drainPerimeter);
|
||||
printf("Warning: Pd = %g is less than W.\n",
|
||||
here->BSIM3drainPerimeter);
|
||||
}
|
||||
if (here->BSIM3sourcePerimeter < pParam->BSIM3weff)
|
||||
{ fprintf(fplog, "Warning: Ps = %g is less than W.\n",
|
||||
here->BSIM3sourcePerimeter);
|
||||
printf("Warning: Ps = %g is less than W.\n",
|
||||
here->BSIM3sourcePerimeter);
|
||||
}
|
||||
}
|
||||
/* ACM model */
|
||||
if (model->BSIM3acmMod == 0) {
|
||||
if (model->BSIM3unitLengthSidewallJctCap > 0.0 ||
|
||||
model->BSIM3unitLengthGateSidewallJctCap > 0.0)
|
||||
{
|
||||
if (here->BSIM3drainPerimeter < pParam->BSIM3weff)
|
||||
{ fprintf(fplog, "Warning: Pd = %g is less than W.\n",
|
||||
here->BSIM3drainPerimeter);
|
||||
printf("Warning: Pd = %g is less than W.\n",
|
||||
here->BSIM3drainPerimeter);
|
||||
}
|
||||
if (here->BSIM3sourcePerimeter < pParam->BSIM3weff)
|
||||
{ fprintf(fplog, "Warning: Ps = %g is less than W.\n",
|
||||
here->BSIM3sourcePerimeter);
|
||||
printf("Warning: Ps = %g is less than W.\n",
|
||||
here->BSIM3sourcePerimeter);
|
||||
}
|
||||
}
|
||||
}
|
||||
if ((model->BSIM3calcacm > 0) && (model->BSIM3acmMod != 12))
|
||||
{ fprintf(fplog, "Warning: CALCACM = %d is wrong. Set back to 0.\n",
|
||||
model->BSIM3calcacm);
|
||||
printf("Warning: CALCACM = %d is wrong. Set back to 0.\n", model->BSIM3calcacm);
|
||||
model->BSIM3calcacm = 0;
|
||||
}
|
||||
|
||||
if (pParam->BSIM3noff < 0.1)
|
||||
{ fprintf(fplog, "Warning: Noff = %g is too small.\n",
|
||||
|
|
@ -223,9 +232,9 @@ FILE *fplog;
|
|||
|
||||
/* Check capacitance parameters */
|
||||
if (pParam->BSIM3clc < 0.0)
|
||||
{ fprintf(fplog, "Fatal: Clc = %g is negative.\n", pParam->BSIM3clc);
|
||||
printf("Fatal: Clc = %g is negative.\n", pParam->BSIM3clc);
|
||||
Fatal_Flag = 1;
|
||||
{ fprintf(fplog, "Fatal: Clc = %g is negative.\n", pParam->BSIM3clc);
|
||||
printf("Fatal: Clc = %g is negative.\n", pParam->BSIM3clc);
|
||||
Fatal_Flag = 1;
|
||||
}
|
||||
|
||||
if (pParam->BSIM3moin < 5.0)
|
||||
|
|
@ -239,160 +248,160 @@ FILE *fplog;
|
|||
printf("Warning: Moin = %g is too large.\n", pParam->BSIM3moin);
|
||||
}
|
||||
|
||||
if(model->BSIM3capMod ==3) {
|
||||
if (pParam->BSIM3acde < 0.4)
|
||||
{ fprintf(fplog, "Warning: Acde = %g is too small.\n",
|
||||
pParam->BSIM3acde);
|
||||
printf("Warning: Acde = %g is too small.\n", pParam->BSIM3acde);
|
||||
}
|
||||
if (pParam->BSIM3acde > 1.6)
|
||||
{ fprintf(fplog, "Warning: Acde = %g is too large.\n",
|
||||
pParam->BSIM3acde);
|
||||
printf("Warning: Acde = %g is too large.\n", pParam->BSIM3acde);
|
||||
}
|
||||
}
|
||||
if(model->BSIM3capMod ==3) {
|
||||
if (pParam->BSIM3acde < 0.4)
|
||||
{ fprintf(fplog, "Warning: Acde = %g is too small.\n",
|
||||
pParam->BSIM3acde);
|
||||
printf("Warning: Acde = %g is too small.\n", pParam->BSIM3acde);
|
||||
}
|
||||
if (pParam->BSIM3acde > 1.6)
|
||||
{ fprintf(fplog, "Warning: Acde = %g is too large.\n",
|
||||
pParam->BSIM3acde);
|
||||
printf("Warning: Acde = %g is too large.\n", pParam->BSIM3acde);
|
||||
}
|
||||
}
|
||||
|
||||
if (model->BSIM3paramChk ==1)
|
||||
{
|
||||
/* Check L and W parameters */
|
||||
if (pParam->BSIM3leff <= 5.0e-8)
|
||||
{ fprintf(fplog, "Warning: Leff = %g may be too small.\n",
|
||||
pParam->BSIM3leff);
|
||||
printf("Warning: Leff = %g may be too small.\n",
|
||||
pParam->BSIM3leff);
|
||||
}
|
||||
if (pParam->BSIM3leff <= 5.0e-8)
|
||||
{ fprintf(fplog, "Warning: Leff = %g may be too small.\n",
|
||||
pParam->BSIM3leff);
|
||||
printf("Warning: Leff = %g may be too small.\n",
|
||||
pParam->BSIM3leff);
|
||||
}
|
||||
|
||||
if (pParam->BSIM3leffCV <= 5.0e-8)
|
||||
{ fprintf(fplog, "Warning: Leff for CV = %g may be too small.\n",
|
||||
pParam->BSIM3leffCV);
|
||||
printf("Warning: Leff for CV = %g may be too small.\n",
|
||||
pParam->BSIM3leffCV);
|
||||
}
|
||||
if (pParam->BSIM3leffCV <= 5.0e-8)
|
||||
{ fprintf(fplog, "Warning: Leff for CV = %g may be too small.\n",
|
||||
pParam->BSIM3leffCV);
|
||||
printf("Warning: Leff for CV = %g may be too small.\n",
|
||||
pParam->BSIM3leffCV);
|
||||
}
|
||||
|
||||
if (pParam->BSIM3weff <= 1.0e-7)
|
||||
{ fprintf(fplog, "Warning: Weff = %g may be too small.\n",
|
||||
pParam->BSIM3weff);
|
||||
printf("Warning: Weff = %g may be too small.\n",
|
||||
pParam->BSIM3weff);
|
||||
}
|
||||
{ fprintf(fplog, "Warning: Weff = %g may be too small.\n",
|
||||
pParam->BSIM3weff);
|
||||
printf("Warning: Weff = %g may be too small.\n",
|
||||
pParam->BSIM3weff);
|
||||
}
|
||||
|
||||
if (pParam->BSIM3weffCV <= 1.0e-7)
|
||||
{ fprintf(fplog, "Warning: Weff for CV = %g may be too small.\n",
|
||||
pParam->BSIM3weffCV);
|
||||
printf("Warning: Weff for CV = %g may be too small.\n",
|
||||
pParam->BSIM3weffCV);
|
||||
}
|
||||
if (pParam->BSIM3weffCV <= 1.0e-7)
|
||||
{ fprintf(fplog, "Warning: Weff for CV = %g may be too small.\n",
|
||||
pParam->BSIM3weffCV);
|
||||
printf("Warning: Weff for CV = %g may be too small.\n",
|
||||
pParam->BSIM3weffCV);
|
||||
}
|
||||
|
||||
/* Check threshold voltage parameters */
|
||||
if (pParam->BSIM3nlx < 0.0)
|
||||
{ fprintf(fplog, "Warning: Nlx = %g is negative.\n", pParam->BSIM3nlx);
|
||||
printf("Warning: Nlx = %g is negative.\n", pParam->BSIM3nlx);
|
||||
if (pParam->BSIM3nlx < 0.0)
|
||||
{ fprintf(fplog, "Warning: Nlx = %g is negative.\n", pParam->BSIM3nlx);
|
||||
printf("Warning: Nlx = %g is negative.\n", pParam->BSIM3nlx);
|
||||
}
|
||||
if (model->BSIM3tox < 1.0e-9)
|
||||
{ fprintf(fplog, "Warning: Tox = %g is less than 10A.\n",
|
||||
model->BSIM3tox);
|
||||
printf("Warning: Tox = %g is less than 10A.\n", model->BSIM3tox);
|
||||
if (model->BSIM3tox < 1.0e-9)
|
||||
{ fprintf(fplog, "Warning: Tox = %g is less than 10A.\n",
|
||||
model->BSIM3tox);
|
||||
printf("Warning: Tox = %g is less than 10A.\n", model->BSIM3tox);
|
||||
}
|
||||
|
||||
if (pParam->BSIM3npeak <= 1.0e15)
|
||||
{ fprintf(fplog, "Warning: Nch = %g may be too small.\n",
|
||||
pParam->BSIM3npeak);
|
||||
printf("Warning: Nch = %g may be too small.\n",
|
||||
pParam->BSIM3npeak);
|
||||
}
|
||||
else if (pParam->BSIM3npeak >= 1.0e21)
|
||||
{ fprintf(fplog, "Warning: Nch = %g may be too large.\n",
|
||||
pParam->BSIM3npeak);
|
||||
printf("Warning: Nch = %g may be too large.\n",
|
||||
pParam->BSIM3npeak);
|
||||
}
|
||||
{ fprintf(fplog, "Warning: Nch = %g may be too small.\n",
|
||||
pParam->BSIM3npeak);
|
||||
printf("Warning: Nch = %g may be too small.\n",
|
||||
pParam->BSIM3npeak);
|
||||
}
|
||||
else if (pParam->BSIM3npeak >= 1.0e21)
|
||||
{ fprintf(fplog, "Warning: Nch = %g may be too large.\n",
|
||||
pParam->BSIM3npeak);
|
||||
printf("Warning: Nch = %g may be too large.\n",
|
||||
pParam->BSIM3npeak);
|
||||
}
|
||||
|
||||
if (pParam->BSIM3nsub <= 1.0e14)
|
||||
{ fprintf(fplog, "Warning: Nsub = %g may be too small.\n",
|
||||
pParam->BSIM3nsub);
|
||||
printf("Warning: Nsub = %g may be too small.\n",
|
||||
pParam->BSIM3nsub);
|
||||
}
|
||||
else if (pParam->BSIM3nsub >= 1.0e21)
|
||||
{ fprintf(fplog, "Warning: Nsub = %g may be too large.\n",
|
||||
pParam->BSIM3nsub);
|
||||
printf("Warning: Nsub = %g may be too large.\n",
|
||||
pParam->BSIM3nsub);
|
||||
}
|
||||
if (pParam->BSIM3nsub <= 1.0e14)
|
||||
{ fprintf(fplog, "Warning: Nsub = %g may be too small.\n",
|
||||
pParam->BSIM3nsub);
|
||||
printf("Warning: Nsub = %g may be too small.\n",
|
||||
pParam->BSIM3nsub);
|
||||
}
|
||||
else if (pParam->BSIM3nsub >= 1.0e21)
|
||||
{ fprintf(fplog, "Warning: Nsub = %g may be too large.\n",
|
||||
pParam->BSIM3nsub);
|
||||
printf("Warning: Nsub = %g may be too large.\n",
|
||||
pParam->BSIM3nsub);
|
||||
}
|
||||
|
||||
if ((pParam->BSIM3ngate > 0.0) &&
|
||||
(pParam->BSIM3ngate <= 1.e18))
|
||||
{ fprintf(fplog, "Warning: Ngate = %g is less than 1.E18cm^-3.\n",
|
||||
pParam->BSIM3ngate);
|
||||
printf("Warning: Ngate = %g is less than 1.E18cm^-3.\n",
|
||||
pParam->BSIM3ngate);
|
||||
}
|
||||
if ((pParam->BSIM3ngate > 0.0) &&
|
||||
(pParam->BSIM3ngate <= 1.e18))
|
||||
{ fprintf(fplog, "Warning: Ngate = %g is less than 1.E18cm^-3.\n",
|
||||
pParam->BSIM3ngate);
|
||||
printf("Warning: Ngate = %g is less than 1.E18cm^-3.\n",
|
||||
pParam->BSIM3ngate);
|
||||
}
|
||||
|
||||
if (pParam->BSIM3dvt0 < 0.0)
|
||||
{ fprintf(fplog, "Warning: Dvt0 = %g is negative.\n",
|
||||
pParam->BSIM3dvt0);
|
||||
printf("Warning: Dvt0 = %g is negative.\n", pParam->BSIM3dvt0);
|
||||
}
|
||||
{ fprintf(fplog, "Warning: Dvt0 = %g is negative.\n",
|
||||
pParam->BSIM3dvt0);
|
||||
printf("Warning: Dvt0 = %g is negative.\n", pParam->BSIM3dvt0);
|
||||
}
|
||||
|
||||
if (fabs(1.0e-6 / (pParam->BSIM3w0 + pParam->BSIM3weff)) > 10.0)
|
||||
{ fprintf(fplog, "Warning: (W0 + Weff) may be too small.\n");
|
||||
printf("Warning: (W0 + Weff) may be too small.\n");
|
||||
if (fabs(1.0e-6 / (pParam->BSIM3w0 + pParam->BSIM3weff)) > 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->BSIM3nfactor < 0.0)
|
||||
{ fprintf(fplog, "Warning: Nfactor = %g is negative.\n",
|
||||
pParam->BSIM3nfactor);
|
||||
printf("Warning: Nfactor = %g is negative.\n", pParam->BSIM3nfactor);
|
||||
}
|
||||
if (pParam->BSIM3cdsc < 0.0)
|
||||
{ fprintf(fplog, "Warning: Cdsc = %g is negative.\n",
|
||||
pParam->BSIM3cdsc);
|
||||
printf("Warning: Cdsc = %g is negative.\n", pParam->BSIM3cdsc);
|
||||
}
|
||||
if (pParam->BSIM3cdscd < 0.0)
|
||||
{ fprintf(fplog, "Warning: Cdscd = %g is negative.\n",
|
||||
pParam->BSIM3cdscd);
|
||||
printf("Warning: Cdscd = %g is negative.\n", pParam->BSIM3cdscd);
|
||||
}
|
||||
if (pParam->BSIM3nfactor < 0.0)
|
||||
{ fprintf(fplog, "Warning: Nfactor = %g is negative.\n",
|
||||
pParam->BSIM3nfactor);
|
||||
printf("Warning: Nfactor = %g is negative.\n", pParam->BSIM3nfactor);
|
||||
}
|
||||
if (pParam->BSIM3cdsc < 0.0)
|
||||
{ fprintf(fplog, "Warning: Cdsc = %g is negative.\n",
|
||||
pParam->BSIM3cdsc);
|
||||
printf("Warning: Cdsc = %g is negative.\n", pParam->BSIM3cdsc);
|
||||
}
|
||||
if (pParam->BSIM3cdscd < 0.0)
|
||||
{ fprintf(fplog, "Warning: Cdscd = %g is negative.\n",
|
||||
pParam->BSIM3cdscd);
|
||||
printf("Warning: Cdscd = %g is negative.\n", pParam->BSIM3cdscd);
|
||||
}
|
||||
/* Check DIBL parameters */
|
||||
if (pParam->BSIM3eta0 < 0.0)
|
||||
{ fprintf(fplog, "Warning: Eta0 = %g is negative.\n",
|
||||
pParam->BSIM3eta0);
|
||||
printf("Warning: Eta0 = %g is negative.\n", pParam->BSIM3eta0);
|
||||
}
|
||||
if (pParam->BSIM3eta0 < 0.0)
|
||||
{ fprintf(fplog, "Warning: Eta0 = %g is negative.\n",
|
||||
pParam->BSIM3eta0);
|
||||
printf("Warning: Eta0 = %g is negative.\n", pParam->BSIM3eta0);
|
||||
}
|
||||
|
||||
/* Check Abulk parameters */
|
||||
if (fabs(1.0e-6 / (pParam->BSIM3b1 + pParam->BSIM3weff)) > 10.0)
|
||||
{ fprintf(fplog, "Warning: (B1 + Weff) may be too small.\n");
|
||||
printf("Warning: (B1 + Weff) may be too small.\n");
|
||||
if (fabs(1.0e-6 / (pParam->BSIM3b1 + pParam->BSIM3weff)) > 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->BSIM3a2 < 0.01)
|
||||
{ fprintf(fplog, "Warning: A2 = %g is too small. Set to 0.01.\n", pParam->BSIM3a2);
|
||||
printf("Warning: A2 = %g is too small. Set to 0.01.\n",
|
||||
pParam->BSIM3a2);
|
||||
pParam->BSIM3a2 = 0.01;
|
||||
}
|
||||
else if (pParam->BSIM3a2 > 1.0)
|
||||
{ fprintf(fplog, "Warning: A2 = %g is larger than 1. A2 is set to 1 and A1 is set to 0.\n",
|
||||
pParam->BSIM3a2);
|
||||
printf("Warning: A2 = %g is larger than 1. A2 is set to 1 and A1 is set to 0.\n",
|
||||
pParam->BSIM3a2);
|
||||
pParam->BSIM3a2 = 1.0;
|
||||
pParam->BSIM3a1 = 0.0;
|
||||
}
|
||||
if (pParam->BSIM3a2 < 0.01)
|
||||
{ fprintf(fplog, "Warning: A2 = %g is too small. Set to 0.01.\n", pParam->BSIM3a2);
|
||||
printf("Warning: A2 = %g is too small. Set to 0.01.\n",
|
||||
pParam->BSIM3a2);
|
||||
pParam->BSIM3a2 = 0.01;
|
||||
}
|
||||
else if (pParam->BSIM3a2 > 1.0)
|
||||
{ fprintf(fplog, "Warning: A2 = %g is larger than 1. A2 is set to 1 and A1 is set to 0.\n",
|
||||
pParam->BSIM3a2);
|
||||
printf("Warning: A2 = %g is larger than 1. A2 is set to 1 and A1 is set to 0.\n",
|
||||
pParam->BSIM3a2);
|
||||
pParam->BSIM3a2 = 1.0;
|
||||
pParam->BSIM3a1 = 0.0;
|
||||
}
|
||||
|
||||
if (pParam->BSIM3rdsw < 0.0)
|
||||
{ fprintf(fplog, "Warning: Rdsw = %g is negative. Set to zero.\n",
|
||||
pParam->BSIM3rdsw);
|
||||
printf("Warning: Rdsw = %g is negative. Set to zero.\n",
|
||||
pParam->BSIM3rdsw);
|
||||
pParam->BSIM3rdsw = 0.0;
|
||||
pParam->BSIM3rds0 = 0.0;
|
||||
}
|
||||
if (pParam->BSIM3rdsw < 0.0)
|
||||
{ fprintf(fplog, "Warning: Rdsw = %g is negative. Set to zero.\n",
|
||||
pParam->BSIM3rdsw);
|
||||
printf("Warning: Rdsw = %g is negative. Set to zero.\n",
|
||||
pParam->BSIM3rdsw);
|
||||
pParam->BSIM3rdsw = 0.0;
|
||||
pParam->BSIM3rds0 = 0.0;
|
||||
}
|
||||
if (pParam->BSIM3rds0 < 0.0)
|
||||
{ fprintf(fplog, "Warning: Rds at current temperature = %g is negative. Set to zero.\n",
|
||||
pParam->BSIM3rds0);
|
||||
|
|
@ -401,40 +410,40 @@ FILE *fplog;
|
|||
pParam->BSIM3rds0 = 0.0;
|
||||
}
|
||||
|
||||
if (pParam->BSIM3vsattemp < 1.0e3)
|
||||
{ fprintf(fplog, "Warning: Vsat at current temperature = %g may be too small.\n", pParam->BSIM3vsattemp);
|
||||
printf("Warning: Vsat at current temperature = %g may be too small.\n", pParam->BSIM3vsattemp);
|
||||
}
|
||||
if (pParam->BSIM3vsattemp < 1.0e3)
|
||||
{ fprintf(fplog, "Warning: Vsat at current temperature = %g may be too small.\n", pParam->BSIM3vsattemp);
|
||||
printf("Warning: Vsat at current temperature = %g may be too small.\n", pParam->BSIM3vsattemp);
|
||||
}
|
||||
|
||||
if (pParam->BSIM3pdibl1 < 0.0)
|
||||
{ fprintf(fplog, "Warning: Pdibl1 = %g is negative.\n",
|
||||
pParam->BSIM3pdibl1);
|
||||
printf("Warning: Pdibl1 = %g is negative.\n", pParam->BSIM3pdibl1);
|
||||
}
|
||||
if (pParam->BSIM3pdibl2 < 0.0)
|
||||
{ fprintf(fplog, "Warning: Pdibl2 = %g is negative.\n",
|
||||
pParam->BSIM3pdibl2);
|
||||
printf("Warning: Pdibl2 = %g is negative.\n", pParam->BSIM3pdibl2);
|
||||
}
|
||||
if (pParam->BSIM3pdibl1 < 0.0)
|
||||
{ fprintf(fplog, "Warning: Pdibl1 = %g is negative.\n",
|
||||
pParam->BSIM3pdibl1);
|
||||
printf("Warning: Pdibl1 = %g is negative.\n", pParam->BSIM3pdibl1);
|
||||
}
|
||||
if (pParam->BSIM3pdibl2 < 0.0)
|
||||
{ fprintf(fplog, "Warning: Pdibl2 = %g is negative.\n",
|
||||
pParam->BSIM3pdibl2);
|
||||
printf("Warning: Pdibl2 = %g is negative.\n", pParam->BSIM3pdibl2);
|
||||
}
|
||||
/* Check overlap capacitance parameters */
|
||||
if (model->BSIM3cgdo < 0.0)
|
||||
{ fprintf(fplog, "Warning: cgdo = %g is negative. Set to zero.\n", model->BSIM3cgdo);
|
||||
printf("Warning: cgdo = %g is negative. Set to zero.\n", model->BSIM3cgdo);
|
||||
model->BSIM3cgdo = 0.0;
|
||||
{ fprintf(fplog, "Warning: cgdo = %g is negative. Set to zero.\n", model->BSIM3cgdo);
|
||||
printf("Warning: cgdo = %g is negative. Set to zero.\n", model->BSIM3cgdo);
|
||||
model->BSIM3cgdo = 0.0;
|
||||
}
|
||||
if (model->BSIM3cgso < 0.0)
|
||||
{ fprintf(fplog, "Warning: cgso = %g is negative. Set to zero.\n", model->BSIM3cgso);
|
||||
printf("Warning: cgso = %g is negative. Set to zero.\n", model->BSIM3cgso);
|
||||
model->BSIM3cgso = 0.0;
|
||||
{ fprintf(fplog, "Warning: cgso = %g is negative. Set to zero.\n", model->BSIM3cgso);
|
||||
printf("Warning: cgso = %g is negative. Set to zero.\n", model->BSIM3cgso);
|
||||
model->BSIM3cgso = 0.0;
|
||||
}
|
||||
if (model->BSIM3cgbo < 0.0)
|
||||
{ fprintf(fplog, "Warning: cgbo = %g is negative. Set to zero.\n", model->BSIM3cgbo);
|
||||
printf("Warning: cgbo = %g is negative. Set to zero.\n", model->BSIM3cgbo);
|
||||
model->BSIM3cgbo = 0.0;
|
||||
{ fprintf(fplog, "Warning: cgbo = %g is negative. Set to zero.\n", model->BSIM3cgbo);
|
||||
printf("Warning: cgbo = %g is negative. Set to zero.\n", model->BSIM3cgbo);
|
||||
model->BSIM3cgbo = 0.0;
|
||||
}
|
||||
|
||||
}/* loop for the parameter check for warning messages */
|
||||
fclose(fplog);
|
||||
fclose(fplog);
|
||||
}
|
||||
else
|
||||
{ fprintf(stderr, "Warning: Can't open log file. Parameter checking skipped.\n");
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load Diff
|
|
@ -43,9 +43,18 @@ IFvalue *value)
|
|||
case BSIM3_MOD_NOIMOD:
|
||||
value->iValue = model->BSIM3noiMod;
|
||||
return(OK);
|
||||
case BSIM3_MOD_NQSMOD:
|
||||
value->iValue = model->BSIM3nqsMod;
|
||||
return(OK);
|
||||
case BSIM3_MOD_ACNQSMOD:
|
||||
value->iValue = model->BSIM3acnqsMod;
|
||||
return(OK);
|
||||
case BSIM3_MOD_ACMMOD:
|
||||
value->iValue = model->BSIM3acmMod;
|
||||
return(OK);
|
||||
case BSIM3_MOD_CALCACM:
|
||||
value->iValue = model->BSIM3calcacm;
|
||||
return(OK);
|
||||
case BSIM3_MOD_VERSION :
|
||||
value->sValue = model->BSIM3version;
|
||||
return(OK);
|
||||
|
|
@ -337,6 +346,32 @@ IFvalue *value)
|
|||
value->rValue = model->BSIM3tpbswg;
|
||||
return(OK);
|
||||
|
||||
/* ACM model */
|
||||
case BSIM3_MOD_HDIF:
|
||||
value->rValue = model->BSIM3hdif;
|
||||
return(OK);
|
||||
case BSIM3_MOD_LDIF:
|
||||
value->rValue = model->BSIM3ldif;
|
||||
return(OK);
|
||||
case BSIM3_MOD_LD:
|
||||
value->rValue = model->BSIM3ld;
|
||||
return(OK);
|
||||
case BSIM3_MOD_RD:
|
||||
value->rValue = model->BSIM3rd;
|
||||
return(OK);
|
||||
case BSIM3_MOD_RS:
|
||||
value->rValue = model->BSIM3rs;
|
||||
return(OK);
|
||||
case BSIM3_MOD_RDC:
|
||||
value->rValue = model->BSIM3rdc;
|
||||
return(OK);
|
||||
case BSIM3_MOD_RSC:
|
||||
value->rValue = model->BSIM3rsc;
|
||||
return(OK);
|
||||
case BSIM3_MOD_WMLT:
|
||||
value->rValue = model->BSIM3wmlt;
|
||||
return(OK);
|
||||
|
||||
/* Length dependence */
|
||||
case BSIM3_MOD_LCDSC :
|
||||
value->rValue = model->BSIM3lcdsc;
|
||||
|
|
@ -1219,6 +1254,14 @@ IFvalue *value)
|
|||
case BSIM3_MOD_WMAX:
|
||||
value->rValue = model->BSIM3Wmax;
|
||||
return(OK);
|
||||
|
||||
case BSIM3_MOD_XL:
|
||||
value->rValue = model->BSIM3xl;
|
||||
return(OK);
|
||||
case BSIM3_MOD_XW:
|
||||
value->rValue = model->BSIM3xw;
|
||||
return(OK);
|
||||
|
||||
case BSIM3_MOD_NOIA:
|
||||
value->rValue = model->BSIM3oxideTrapDensityA;
|
||||
return(OK);
|
||||
|
|
|
|||
|
|
@ -39,15 +39,27 @@ GENmodel *inMod)
|
|||
mod->BSIM3capMod = value->iValue;
|
||||
mod->BSIM3capModGiven = TRUE;
|
||||
break;
|
||||
case BSIM3_MOD_ACMMOD:
|
||||
mod->BSIM3acmMod = value->iValue;
|
||||
mod->BSIM3acmModGiven = TRUE;
|
||||
break;
|
||||
case BSIM3_MOD_CALCACM:
|
||||
mod->BSIM3calcacm = value->iValue;
|
||||
mod->BSIM3calcacmGiven = TRUE;
|
||||
break;
|
||||
case BSIM3_MOD_NOIMOD :
|
||||
mod->BSIM3noiMod = value->iValue;
|
||||
mod->BSIM3noiModGiven = TRUE;
|
||||
break;
|
||||
case BSIM3_MOD_NQSMOD :
|
||||
mod->BSIM3nqsMod = value->iValue;
|
||||
mod->BSIM3nqsModGiven = TRUE;
|
||||
break;
|
||||
case BSIM3_MOD_ACNQSMOD :
|
||||
mod->BSIM3acnqsMod = value->iValue;
|
||||
mod->BSIM3acnqsModGiven = TRUE;
|
||||
break;
|
||||
case BSIM3_MOD_VERSION :
|
||||
case BSIM3_MOD_VERSION :
|
||||
mod->BSIM3version = value->sValue;
|
||||
mod->BSIM3versionGiven = TRUE;
|
||||
break;
|
||||
|
|
@ -123,14 +135,14 @@ GENmodel *inMod)
|
|||
case BSIM3_MOD_NPEAK:
|
||||
mod->BSIM3npeak = value->rValue;
|
||||
mod->BSIM3npeakGiven = TRUE;
|
||||
if (mod->BSIM3npeak > 1.0e20)
|
||||
mod->BSIM3npeak *= 1.0e-6;
|
||||
if (mod->BSIM3npeak > 1.0e20)
|
||||
mod->BSIM3npeak *= 1.0e-6;
|
||||
break;
|
||||
case BSIM3_MOD_NGATE:
|
||||
mod->BSIM3ngate = value->rValue;
|
||||
mod->BSIM3ngateGiven = TRUE;
|
||||
if (mod->BSIM3ngate > 1.0e23)
|
||||
mod->BSIM3ngate *= 1.0e-6;
|
||||
if (mod->BSIM3ngate > 1.0e23)
|
||||
mod->BSIM3ngate *= 1.0e-6;
|
||||
break;
|
||||
case BSIM3_MOD_GAMMA1:
|
||||
mod->BSIM3gamma1 = value->rValue;
|
||||
|
|
@ -438,7 +450,41 @@ GENmodel *inMod)
|
|||
mod->BSIM3tpbswgGiven = TRUE;
|
||||
break;
|
||||
|
||||
/* Length dependence */
|
||||
/* acm model */
|
||||
case BSIM3_MOD_HDIF:
|
||||
mod->BSIM3hdif = value->rValue;
|
||||
mod->BSIM3hdifGiven = TRUE;
|
||||
break;
|
||||
case BSIM3_MOD_LDIF:
|
||||
mod->BSIM3ldif = value->rValue;
|
||||
mod->BSIM3ldifGiven = TRUE;
|
||||
break;
|
||||
case BSIM3_MOD_LD:
|
||||
mod->BSIM3ld = value->rValue;
|
||||
mod->BSIM3ldGiven = TRUE;
|
||||
break;
|
||||
case BSIM3_MOD_RD:
|
||||
mod->BSIM3rd = value->rValue;
|
||||
mod->BSIM3rdGiven = TRUE;
|
||||
break;
|
||||
case BSIM3_MOD_RS:
|
||||
mod->BSIM3rs = value->rValue;
|
||||
mod->BSIM3rsGiven = TRUE;
|
||||
break;
|
||||
case BSIM3_MOD_RDC:
|
||||
mod->BSIM3rdc = value->rValue;
|
||||
mod->BSIM3rdcGiven = TRUE;
|
||||
break;
|
||||
case BSIM3_MOD_RSC:
|
||||
mod->BSIM3rsc = value->rValue;
|
||||
mod->BSIM3rscGiven = TRUE;
|
||||
break;
|
||||
case BSIM3_MOD_WMLT:
|
||||
mod->BSIM3wmlt = value->rValue;
|
||||
mod->BSIM3wmltGiven = TRUE;
|
||||
break;
|
||||
|
||||
/* Length dependence */
|
||||
case BSIM3_MOD_LCDSC :
|
||||
mod->BSIM3lcdsc = value->rValue;
|
||||
mod->BSIM3lcdscGiven = TRUE;
|
||||
|
|
@ -502,14 +548,14 @@ GENmodel *inMod)
|
|||
case BSIM3_MOD_LNPEAK:
|
||||
mod->BSIM3lnpeak = value->rValue;
|
||||
mod->BSIM3lnpeakGiven = TRUE;
|
||||
if (mod->BSIM3lnpeak > 1.0e20)
|
||||
mod->BSIM3lnpeak *= 1.0e-6;
|
||||
if (mod->BSIM3lnpeak > 1.0e20)
|
||||
mod->BSIM3lnpeak *= 1.0e-6;
|
||||
break;
|
||||
case BSIM3_MOD_LNGATE:
|
||||
mod->BSIM3lngate = value->rValue;
|
||||
mod->BSIM3lngateGiven = TRUE;
|
||||
if (mod->BSIM3lngate > 1.0e23)
|
||||
mod->BSIM3lngate *= 1.0e-6;
|
||||
if (mod->BSIM3lngate > 1.0e23)
|
||||
mod->BSIM3lngate *= 1.0e-6;
|
||||
break;
|
||||
case BSIM3_MOD_LGAMMA1:
|
||||
mod->BSIM3lgamma1 = value->rValue;
|
||||
|
|
@ -781,7 +827,7 @@ GENmodel *inMod)
|
|||
mod->BSIM3lvoffcvGiven = TRUE;
|
||||
break;
|
||||
|
||||
/* Width dependence */
|
||||
/* Width dependence */
|
||||
case BSIM3_MOD_WCDSC :
|
||||
mod->BSIM3wcdsc = value->rValue;
|
||||
mod->BSIM3wcdscGiven = TRUE;
|
||||
|
|
@ -845,14 +891,14 @@ GENmodel *inMod)
|
|||
case BSIM3_MOD_WNPEAK:
|
||||
mod->BSIM3wnpeak = value->rValue;
|
||||
mod->BSIM3wnpeakGiven = TRUE;
|
||||
if (mod->BSIM3wnpeak > 1.0e20)
|
||||
mod->BSIM3wnpeak *= 1.0e-6;
|
||||
if (mod->BSIM3wnpeak > 1.0e20)
|
||||
mod->BSIM3wnpeak *= 1.0e-6;
|
||||
break;
|
||||
case BSIM3_MOD_WNGATE:
|
||||
mod->BSIM3wngate = value->rValue;
|
||||
mod->BSIM3wngateGiven = TRUE;
|
||||
if (mod->BSIM3wngate > 1.0e23)
|
||||
mod->BSIM3wngate *= 1.0e-6;
|
||||
if (mod->BSIM3wngate > 1.0e23)
|
||||
mod->BSIM3wngate *= 1.0e-6;
|
||||
break;
|
||||
case BSIM3_MOD_WGAMMA1:
|
||||
mod->BSIM3wgamma1 = value->rValue;
|
||||
|
|
@ -1124,7 +1170,7 @@ GENmodel *inMod)
|
|||
mod->BSIM3wvoffcvGiven = TRUE;
|
||||
break;
|
||||
|
||||
/* Cross-term dependence */
|
||||
/* Cross-term dependence */
|
||||
case BSIM3_MOD_PCDSC :
|
||||
mod->BSIM3pcdsc = value->rValue;
|
||||
mod->BSIM3pcdscGiven = TRUE;
|
||||
|
|
@ -1188,14 +1234,14 @@ GENmodel *inMod)
|
|||
case BSIM3_MOD_PNPEAK:
|
||||
mod->BSIM3pnpeak = value->rValue;
|
||||
mod->BSIM3pnpeakGiven = TRUE;
|
||||
if (mod->BSIM3pnpeak > 1.0e20)
|
||||
mod->BSIM3pnpeak *= 1.0e-6;
|
||||
if (mod->BSIM3pnpeak > 1.0e20)
|
||||
mod->BSIM3pnpeak *= 1.0e-6;
|
||||
break;
|
||||
case BSIM3_MOD_PNGATE:
|
||||
mod->BSIM3pngate = value->rValue;
|
||||
mod->BSIM3pngateGiven = TRUE;
|
||||
if (mod->BSIM3pngate > 1.0e23)
|
||||
mod->BSIM3pngate *= 1.0e-6;
|
||||
if (mod->BSIM3pngate > 1.0e23)
|
||||
mod->BSIM3pngate *= 1.0e-6;
|
||||
break;
|
||||
case BSIM3_MOD_PGAMMA1:
|
||||
mod->BSIM3pgamma1 = value->rValue;
|
||||
|
|
@ -1636,6 +1682,15 @@ GENmodel *inMod)
|
|||
mod->BSIM3WmaxGiven = TRUE;
|
||||
break;
|
||||
|
||||
case BSIM3_MOD_XL:
|
||||
mod->BSIM3xl = value->rValue;
|
||||
mod->BSIM3xlGiven = TRUE;
|
||||
break;
|
||||
case BSIM3_MOD_XW:
|
||||
mod->BSIM3xw = value->rValue;
|
||||
mod->BSIM3xwGiven = TRUE;
|
||||
break;
|
||||
|
||||
case BSIM3_MOD_NOIA :
|
||||
mod->BSIM3oxideTrapDensityA = value->rValue;
|
||||
mod->BSIM3oxideTrapDensityAGiven = TRUE;
|
||||
|
|
|
|||
|
|
@ -0,0 +1,29 @@
|
|||
/**********
|
||||
Author: 2013 Francesco Lannutti
|
||||
**********/
|
||||
|
||||
#include "ngspice/ngspice.h"
|
||||
#include "ngspice/cktdefs.h"
|
||||
#include "bsim3def.h"
|
||||
#include "ngspice/sperror.h"
|
||||
|
||||
int
|
||||
BSIM3nodeIsNonLinear (GENmodel *inModel, CKTcircuit *ckt)
|
||||
{
|
||||
BSIM3model *model = (BSIM3model *)inModel ;
|
||||
BSIM3instance *here ;
|
||||
|
||||
/* loop through all the BSIM3 models */
|
||||
for ( ; model != NULL ; model = model->BSIM3nextModel)
|
||||
{
|
||||
/* loop through all the instances of the model */
|
||||
for (here = model->BSIM3instances ; here != NULL ; here = here->BSIM3nextInstance)
|
||||
{
|
||||
ckt->CKTnodeIsLinear [here->BSIM3dNodePrime] = 0 ;
|
||||
ckt->CKTnodeIsLinear [here->BSIM3sNodePrime] = 0 ;
|
||||
ckt->CKTnodeIsLinear [here->BSIM3qNode] = 0 ;
|
||||
}
|
||||
}
|
||||
|
||||
return (OK) ;
|
||||
}
|
||||
|
|
@ -40,10 +40,10 @@ IFvalue *select)
|
|||
here->BSIM3l = value->rValue*scale;
|
||||
here->BSIM3lGiven = TRUE;
|
||||
break;
|
||||
case BSIM3_M:
|
||||
here->BSIM3m = value->rValue;
|
||||
here->BSIM3mGiven = TRUE;
|
||||
break;
|
||||
case BSIM3_M:
|
||||
here->BSIM3m = value->rValue;
|
||||
here->BSIM3mGiven = TRUE;
|
||||
break;
|
||||
case BSIM3_AS:
|
||||
here->BSIM3sourceArea = value->rValue*scale*scale;
|
||||
here->BSIM3sourceAreaGiven = TRUE;
|
||||
|
|
@ -91,6 +91,18 @@ IFvalue *select)
|
|||
here->BSIM3acnqsMod = value->iValue;
|
||||
here->BSIM3acnqsModGiven = TRUE;
|
||||
break;
|
||||
case BSIM3_GEO:
|
||||
here->BSIM3geo = value->iValue;
|
||||
here->BSIM3geoGiven = TRUE;
|
||||
break;
|
||||
case BSIM3_DELVTO:
|
||||
here->BSIM3delvto = value->rValue;
|
||||
here->BSIM3delvtoGiven = TRUE;
|
||||
break;
|
||||
case BSIM3_MULU0:
|
||||
here->BSIM3mulu0 = value->rValue;
|
||||
here->BSIM3mulu0Given = TRUE;
|
||||
break;
|
||||
case BSIM3_IC:
|
||||
switch(value->v.numValue){
|
||||
case 3:
|
||||
|
|
|
|||
|
|
@ -61,8 +61,18 @@ BSIM3instance **InstArray;
|
|||
model->BSIM3paramChk = 0;
|
||||
if (!model->BSIM3capModGiven)
|
||||
model->BSIM3capMod = 3;
|
||||
if (!model->BSIM3acmModGiven)
|
||||
model->BSIM3acmMod = 0;
|
||||
if (!model->BSIM3calcacmGiven)
|
||||
model->BSIM3calcacm = 0;
|
||||
if (!model->BSIM3noiModGiven)
|
||||
model->BSIM3noiMod = 1;
|
||||
if (!model->BSIM3nqsModGiven)
|
||||
model->BSIM3nqsMod = 0;
|
||||
else if ((model->BSIM3nqsMod != 0) && (model->BSIM3nqsMod != 1))
|
||||
{ model->BSIM3nqsMod = 0;
|
||||
printf("Warning: nqsMod has been set to its default value: 0.\n");
|
||||
}
|
||||
if (!model->BSIM3acnqsModGiven)
|
||||
model->BSIM3acnqsMod = 0;
|
||||
else if ((model->BSIM3acnqsMod != 0) && (model->BSIM3acnqsMod != 1))
|
||||
|
|
@ -247,6 +257,24 @@ BSIM3instance **InstArray;
|
|||
if (!model->BSIM3tpbswgGiven)
|
||||
model->BSIM3tpbswg = 0.0;
|
||||
|
||||
/* ACM model */
|
||||
if (!model->BSIM3hdifGiven)
|
||||
model->BSIM3hdif = 0.0;
|
||||
if (!model->BSIM3ldifGiven)
|
||||
model->BSIM3ldif = 0.0;
|
||||
if (!model->BSIM3ldGiven)
|
||||
model->BSIM3ld = 0.0;
|
||||
if (!model->BSIM3rdGiven)
|
||||
model->BSIM3rd = 0.0;
|
||||
if (!model->BSIM3rsGiven)
|
||||
model->BSIM3rs = 0.0;
|
||||
if (!model->BSIM3rdcGiven)
|
||||
model->BSIM3rdc = 0.0;
|
||||
if (!model->BSIM3rscGiven)
|
||||
model->BSIM3rsc = 0.0;
|
||||
if (!model->BSIM3wmltGiven)
|
||||
model->BSIM3wmlt = 1.0;
|
||||
|
||||
/* Length dependence */
|
||||
if (!model->BSIM3lcdscGiven)
|
||||
model->BSIM3lcdsc = 0.0;
|
||||
|
|
@ -780,6 +808,12 @@ BSIM3instance **InstArray;
|
|||
model->BSIM3dwc = model->BSIM3Wint;
|
||||
if (!model->BSIM3dlcGiven)
|
||||
model->BSIM3dlc = model->BSIM3Lint;
|
||||
|
||||
if (!model->BSIM3xlGiven)
|
||||
model->BSIM3xl = 0.0;
|
||||
if (!model->BSIM3xwGiven)
|
||||
model->BSIM3xw = 0.0;
|
||||
|
||||
if (!model->BSIM3cfGiven)
|
||||
model->BSIM3cf = 2.0 * EPSOX / PI
|
||||
* log(1.0 + 0.4e-6 / model->BSIM3tox);
|
||||
|
|
@ -874,7 +908,16 @@ BSIM3instance **InstArray;
|
|||
if (!here->BSIM3drainPerimeterGiven)
|
||||
here->BSIM3drainPerimeter = 0.0;
|
||||
if (!here->BSIM3drainSquaresGiven)
|
||||
here->BSIM3drainSquares = 1.0;
|
||||
{
|
||||
if (model->BSIM3acmMod == 0)
|
||||
here->BSIM3drainSquares = 1.0;
|
||||
else
|
||||
here->BSIM3drainSquares = 0.0;
|
||||
}
|
||||
if (!here->BSIM3delvtoGiven)
|
||||
here->BSIM3delvto = 0.0;
|
||||
if (!here->BSIM3mulu0Given)
|
||||
here->BSIM3mulu0 = 1.0;
|
||||
if (!here->BSIM3icVBSGiven)
|
||||
here->BSIM3icVBS = 0.0;
|
||||
if (!here->BSIM3icVDSGiven)
|
||||
|
|
@ -888,11 +931,21 @@ BSIM3instance **InstArray;
|
|||
if (!here->BSIM3sourcePerimeterGiven)
|
||||
here->BSIM3sourcePerimeter = 0.0;
|
||||
if (!here->BSIM3sourceSquaresGiven)
|
||||
here->BSIM3sourceSquares = 1.0;
|
||||
{
|
||||
if (model->BSIM3acmMod == 0)
|
||||
here->BSIM3sourceSquares = 1.0;
|
||||
else
|
||||
here->BSIM3sourceSquares = 0.0;
|
||||
}
|
||||
if (!here->BSIM3wGiven)
|
||||
here->BSIM3w = 5.0e-6;
|
||||
if (!here->BSIM3nqsModGiven)
|
||||
here->BSIM3nqsMod = 0;
|
||||
here->BSIM3nqsMod = model->BSIM3nqsMod;
|
||||
else if ((here->BSIM3nqsMod != 0) && (here->BSIM3nqsMod != 1))
|
||||
{ here->BSIM3nqsMod = model->BSIM3nqsMod;
|
||||
printf("Warning: nqsMod has been set to its global value %d.\n",
|
||||
model->BSIM3nqsMod);
|
||||
}
|
||||
if (!here->BSIM3acnqsModGiven)
|
||||
here->BSIM3acnqsMod = model->BSIM3acnqsMod;
|
||||
else if ((here->BSIM3acnqsMod != 0) && (here->BSIM3acnqsMod != 1))
|
||||
|
|
@ -900,14 +953,19 @@ BSIM3instance **InstArray;
|
|||
printf("Warning: acnqsMod has been set to its global value %d.\n",
|
||||
model->BSIM3acnqsMod);
|
||||
}
|
||||
|
||||
if (!here->BSIM3geoGiven)
|
||||
here->BSIM3geo = 0;
|
||||
|
||||
if (!here->BSIM3mGiven)
|
||||
here->BSIM3m = 1;
|
||||
|
||||
/* process drain series resistance */
|
||||
if ((model->BSIM3sheetResistance > 0.0) &&
|
||||
(here->BSIM3drainSquares > 0.0 ))
|
||||
if ( ((model->BSIM3sheetResistance > 0.0) && (here->BSIM3drainSquares > 0.0))
|
||||
||((model->BSIM3sheetResistance > 0.0) && (model->BSIM3hdif > 0.0))
|
||||
||((model->BSIM3rd > 0.0) && (model->BSIM3ldif > 0.0))
|
||||
||((model->BSIM3rd > 0.0) && (model->BSIM3ld > 0.0))
|
||||
||((model->BSIM3rdc > 0.0))
|
||||
)
|
||||
{
|
||||
if(here->BSIM3dNodePrime == 0) {
|
||||
error = CKTmkVolt(ckt,&tmp,here->BSIM3name,"drain");
|
||||
|
|
@ -928,8 +986,12 @@ BSIM3instance **InstArray;
|
|||
}
|
||||
|
||||
/* process source series resistance */
|
||||
if ((model->BSIM3sheetResistance > 0.0) &&
|
||||
(here->BSIM3sourceSquares > 0.0 ))
|
||||
if ( ((model->BSIM3sheetResistance > 0.0) && (here->BSIM3sourceSquares > 0.0))
|
||||
||((model->BSIM3sheetResistance > 0.0) && (model->BSIM3hdif > 0.0))
|
||||
||((model->BSIM3rs > 0.0) && (model->BSIM3ldif > 0.0))
|
||||
||((model->BSIM3rs > 0.0) && (model->BSIM3ld > 0.0))
|
||||
||((model->BSIM3rsc > 0.0))
|
||||
)
|
||||
{
|
||||
if(here->BSIM3sNodePrime == 0) {
|
||||
error = CKTmkVolt(ckt,&tmp,here->BSIM3name,"source");
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load Diff
|
|
@ -53,6 +53,13 @@ typedef struct sBSIM3instance
|
|||
double BSIM3sourcePerimeter;
|
||||
double BSIM3sourceConductance;
|
||||
double BSIM3drainConductance;
|
||||
double BSIM3delvto;
|
||||
double BSIM3mulu0;
|
||||
double BSIM3vth0;
|
||||
double BSIM3vfb;
|
||||
double BSIM3vfbzb;
|
||||
double BSIM3u0temp;
|
||||
double BSIM3tconst;
|
||||
|
||||
double BSIM3icVBS;
|
||||
double BSIM3icVDS;
|
||||
|
|
@ -61,6 +68,7 @@ typedef struct sBSIM3instance
|
|||
int BSIM3mode;
|
||||
int BSIM3nqsMod;
|
||||
int BSIM3acnqsMod;
|
||||
int BSIM3geo;
|
||||
|
||||
/* OP point */
|
||||
double BSIM3qinv;
|
||||
|
|
@ -122,6 +130,8 @@ typedef struct sBSIM3instance
|
|||
unsigned BSIM3sourceSquaresGiven :1;
|
||||
unsigned BSIM3drainPerimeterGiven :1;
|
||||
unsigned BSIM3sourcePerimeterGiven :1;
|
||||
unsigned BSIM3delvtoGiven :1;
|
||||
unsigned BSIM3mulu0Given :1;
|
||||
unsigned BSIM3dNodePrimeSet :1;
|
||||
unsigned BSIM3sNodePrimeSet :1;
|
||||
unsigned BSIM3icVBSGiven :1;
|
||||
|
|
@ -129,6 +139,7 @@ typedef struct sBSIM3instance
|
|||
unsigned BSIM3icVGSGiven :1;
|
||||
unsigned BSIM3nqsModGiven :1;
|
||||
unsigned BSIM3acnqsModGiven :1;
|
||||
unsigned BSIM3geoGiven :1;
|
||||
|
||||
double *BSIM3DdPtr;
|
||||
double *BSIM3GgPtr;
|
||||
|
|
@ -430,7 +441,10 @@ typedef struct sBSIM3model
|
|||
|
||||
int BSIM3mobMod;
|
||||
int BSIM3capMod;
|
||||
int BSIM3acmMod;
|
||||
int BSIM3calcacm;
|
||||
int BSIM3noiMod;
|
||||
int BSIM3nqsMod;
|
||||
int BSIM3acnqsMod;
|
||||
int BSIM3binUnit;
|
||||
int BSIM3paramChk;
|
||||
|
|
@ -532,6 +546,18 @@ typedef struct sBSIM3model
|
|||
double BSIM3tpbsw;
|
||||
double BSIM3tpbswg;
|
||||
|
||||
/* ACM model */
|
||||
double BSIM3xl;
|
||||
double BSIM3xw;
|
||||
double BSIM3hdif;
|
||||
double BSIM3ldif;
|
||||
double BSIM3ld;
|
||||
double BSIM3rd;
|
||||
double BSIM3rs;
|
||||
double BSIM3rdc;
|
||||
double BSIM3rsc;
|
||||
double BSIM3wmlt;
|
||||
|
||||
/* Length Dependence */
|
||||
double BSIM3lcdsc;
|
||||
double BSIM3lcdscb;
|
||||
|
|
@ -881,8 +907,11 @@ typedef struct sBSIM3model
|
|||
unsigned BSIM3mobModGiven :1;
|
||||
unsigned BSIM3binUnitGiven :1;
|
||||
unsigned BSIM3capModGiven :1;
|
||||
unsigned BSIM3acmModGiven :1;
|
||||
unsigned BSIM3calcacmGiven :1;
|
||||
unsigned BSIM3paramChkGiven :1;
|
||||
unsigned BSIM3noiModGiven :1;
|
||||
unsigned BSIM3nqsModGiven :1;
|
||||
unsigned BSIM3acnqsModGiven :1;
|
||||
unsigned BSIM3typeGiven :1;
|
||||
unsigned BSIM3toxGiven :1;
|
||||
|
|
@ -983,6 +1012,17 @@ typedef struct sBSIM3model
|
|||
unsigned BSIM3tpbswGiven :1;
|
||||
unsigned BSIM3tpbswgGiven :1;
|
||||
|
||||
/* ACM model */
|
||||
unsigned BSIM3xlGiven :1;
|
||||
unsigned BSIM3xwGiven :1;
|
||||
unsigned BSIM3hdifGiven :1;
|
||||
unsigned BSIM3ldifGiven :1;
|
||||
unsigned BSIM3ldGiven :1;
|
||||
unsigned BSIM3rdGiven :1;
|
||||
unsigned BSIM3rsGiven :1;
|
||||
unsigned BSIM3rdcGiven :1;
|
||||
unsigned BSIM3rscGiven :1;
|
||||
unsigned BSIM3wmltGiven :1;
|
||||
|
||||
/* Length dependence */
|
||||
unsigned BSIM3lcdscGiven :1;
|
||||
|
|
@ -1265,7 +1305,7 @@ typedef struct sBSIM3model
|
|||
unsigned BSIM3bulkJctGateSideGradingCoeffGiven :1;
|
||||
unsigned BSIM3unitLengthGateSidewallJctCapGiven :1;
|
||||
unsigned BSIM3jctEmissionCoeffGiven :1;
|
||||
unsigned BSIM3jctTempExponentGiven :1;
|
||||
unsigned BSIM3jctTempExponentGiven :1;
|
||||
|
||||
unsigned BSIM3oxideTrapDensityAGiven :1;
|
||||
unsigned BSIM3oxideTrapDensityBGiven :1;
|
||||
|
|
@ -1312,7 +1352,6 @@ typedef struct sBSIM3model
|
|||
/* device parameters */
|
||||
#define BSIM3_W 1
|
||||
#define BSIM3_L 2
|
||||
#define BSIM3_M 16
|
||||
#define BSIM3_AS 3
|
||||
#define BSIM3_AD 4
|
||||
#define BSIM3_PS 5
|
||||
|
|
@ -1326,9 +1365,15 @@ typedef struct sBSIM3model
|
|||
#define BSIM3_IC 13
|
||||
#define BSIM3_NQSMOD 14
|
||||
#define BSIM3_ACNQSMOD 15
|
||||
#define BSIM3_M 16
|
||||
#define BSIM3_DELVTO 17
|
||||
#define BSIM3_MULU0 18
|
||||
#define BSIM3_GEO 19
|
||||
|
||||
/* model parameters */
|
||||
#define BSIM3_MOD_CAPMOD 101
|
||||
#define BSIM3_MOD_CAPMOD 100
|
||||
#define BSIM3_MOD_ACMMOD 101
|
||||
#define BSIM3_MOD_CALCACM 102
|
||||
#define BSIM3_MOD_MOBMOD 103
|
||||
#define BSIM3_MOD_NOIMOD 104
|
||||
|
||||
|
|
@ -1440,7 +1485,8 @@ typedef struct sBSIM3model
|
|||
#define BSIM3_MOD_TPBSWG 207
|
||||
#define BSIM3_MOD_VOFFCV 208
|
||||
#define BSIM3_MOD_LINTNOI 209
|
||||
#define BSIM3_MOD_ACNQSMOD 210
|
||||
#define BSIM3_MOD_NQSMOD 210
|
||||
#define BSIM3_MOD_ACNQSMOD 211
|
||||
|
||||
/* Length dependence */
|
||||
#define BSIM3_MOD_LCDSC 251
|
||||
|
|
@ -1795,6 +1841,18 @@ typedef struct sBSIM3model
|
|||
#define BSIM3_MOD_WWC 701
|
||||
#define BSIM3_MOD_WWLC 702
|
||||
|
||||
/* ACM parameters */
|
||||
#define BSIM3_MOD_XL 703
|
||||
#define BSIM3_MOD_XW 704
|
||||
#define BSIM3_MOD_HDIF 711
|
||||
#define BSIM3_MOD_LDIF 712
|
||||
#define BSIM3_MOD_LD 713
|
||||
#define BSIM3_MOD_RD 714
|
||||
#define BSIM3_MOD_RS 715
|
||||
#define BSIM3_MOD_RDC 716
|
||||
#define BSIM3_MOD_RSC 717
|
||||
#define BSIM3_MOD_WMLT 718
|
||||
|
||||
/* device questions */
|
||||
#define BSIM3_DNODE 751
|
||||
#define BSIM3_GNODE 752
|
||||
|
|
|
|||
|
|
@ -34,3 +34,7 @@ extern int BSIM3bindCSC (GENmodel*, CKTcircuit*) ;
|
|||
extern int BSIM3bindCSCComplex (GENmodel*, CKTcircuit*) ;
|
||||
extern int BSIM3bindCSCComplexToReal (GENmodel*, CKTcircuit*) ;
|
||||
#endif
|
||||
|
||||
#ifdef KIRCHHOFF
|
||||
extern int BSIM3nodeIsNonLinear (GENmodel *, CKTcircuit *) ;
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -72,12 +72,17 @@ SPICEdev BSIM3info = {
|
|||
#endif
|
||||
/* DEVinstSize */ &BSIM3iSize,
|
||||
/* DEVmodSize */ &BSIM3mSize,
|
||||
|
||||
#if defined(KLU) || defined(SuperLU) || defined(UMFPACK)
|
||||
/* DEVbindCSC */ BSIM3bindCSC,
|
||||
/* DEVbindCSCComplex */ BSIM3bindCSCComplex,
|
||||
/* DEVbindCSCComplexToReal */ BSIM3bindCSCComplexToReal,
|
||||
#endif
|
||||
|
||||
#ifdef KIRCHHOFF
|
||||
/* DEVnodeIsNonLinear */ BSIM3nodeIsNonLinear
|
||||
#endif
|
||||
|
||||
};
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -2,29 +2,29 @@
|
|||
|
||||
noinst_LTLIBRARIES = libbsim3soidd.la
|
||||
|
||||
libbsim3soidd_la_SOURCES = \
|
||||
b3soidd.c \
|
||||
b3soiddacld.c \
|
||||
b3soiddask.c \
|
||||
b3soiddcheck.c \
|
||||
b3soiddcvtest.c \
|
||||
b3soidddel.c \
|
||||
b3soidddest.c \
|
||||
b3soiddgetic.c \
|
||||
b3soiddld.c \
|
||||
b3soiddmask.c \
|
||||
b3soiddmdel.c \
|
||||
b3soiddmpar.c \
|
||||
b3soiddnoi.c \
|
||||
b3soiddpar.c \
|
||||
b3soiddpzld.c \
|
||||
b3soiddset.c \
|
||||
b3soiddtemp.c \
|
||||
b3soiddtrunc.c \
|
||||
b3soidddef.h \
|
||||
b3soiddext.h \
|
||||
b3soiddinit.c \
|
||||
b3soiddinit.h \
|
||||
libbsim3soidd_la_SOURCES = \
|
||||
b3soidd.c \
|
||||
b3soiddacld.c \
|
||||
b3soiddask.c \
|
||||
b3soiddcheck.c \
|
||||
b3soiddcvtest.c \
|
||||
b3soidddel.c \
|
||||
b3soidddest.c \
|
||||
b3soiddgetic.c \
|
||||
b3soiddld.c \
|
||||
b3soiddmask.c \
|
||||
b3soiddmdel.c \
|
||||
b3soiddmpar.c \
|
||||
b3soiddnoi.c \
|
||||
b3soiddpar.c \
|
||||
b3soiddpzld.c \
|
||||
b3soiddset.c \
|
||||
b3soiddtemp.c \
|
||||
b3soiddtrunc.c \
|
||||
b3soidddef.h \
|
||||
b3soiddext.h \
|
||||
b3soiddinit.c \
|
||||
b3soiddinit.h \
|
||||
b3soidditf.h
|
||||
|
||||
|
||||
|
|
@ -40,6 +40,10 @@ if UMFPACK_WANTED
|
|||
libbsim3soidd_la_SOURCES += b3soiddbindCSC.c
|
||||
endif
|
||||
|
||||
if KIRCHHOFF_WANTED
|
||||
libbsim3soidd_la_SOURCES += b3soiddnode.c
|
||||
endif
|
||||
|
||||
AM_CPPFLAGS = @AM_CPPFLAGS@ -I$(top_srcdir)/src/include
|
||||
AM_CFLAGS = $(STATIC)
|
||||
|
||||
|
|
|
|||
|
|
@ -34,3 +34,7 @@ extern int B3SOIDDbindCSC (GENmodel*, CKTcircuit*) ;
|
|||
extern int B3SOIDDbindCSCComplex (GENmodel*, CKTcircuit*) ;
|
||||
extern int B3SOIDDbindCSCComplexToReal (GENmodel*, CKTcircuit*) ;
|
||||
#endif
|
||||
|
||||
#ifdef KIRCHHOFF
|
||||
extern int B3SOIDDnodeIsNonLinear (GENmodel *, CKTcircuit *) ;
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -70,12 +70,17 @@ SPICEdev B3SOIDDinfo = {
|
|||
#endif
|
||||
/* DEVinstSize */ &B3SOIDDiSize,
|
||||
/* DEVmodSize */ &B3SOIDDmSize,
|
||||
|
||||
#if defined(KLU) || defined(SuperLU) || defined(UMFPACK)
|
||||
/* DEVbindCSC */ B3SOIDDbindCSC,
|
||||
/* DEVbindCSCComplex */ B3SOIDDbindCSCComplex,
|
||||
/* DEVbindCSCComplexToReal */ B3SOIDDbindCSCComplexToReal,
|
||||
#endif
|
||||
|
||||
#ifdef KIRCHHOFF
|
||||
/* DEVnodeIsNonLinear */ B3SOIDDnodeIsNonLinear
|
||||
#endif
|
||||
|
||||
};
|
||||
|
||||
SPICEdev *
|
||||
|
|
|
|||
|
|
@ -0,0 +1,79 @@
|
|||
/**********
|
||||
Author: 2013 Francesco Lannutti
|
||||
**********/
|
||||
|
||||
#include "ngspice/ngspice.h"
|
||||
#include "ngspice/cktdefs.h"
|
||||
#include "b3soidddef.h"
|
||||
#include "ngspice/sperror.h"
|
||||
|
||||
int
|
||||
B3SOIDDnodeIsNonLinear (GENmodel *inModel, CKTcircuit *ckt)
|
||||
{
|
||||
B3SOIDDmodel *model = (B3SOIDDmodel *)inModel ;
|
||||
B3SOIDDinstance *here ;
|
||||
|
||||
/* loop through all the B3SOIDD models */
|
||||
for ( ; model != NULL ; model = model->B3SOIDDnextModel)
|
||||
{
|
||||
/* loop through all the instances of the model */
|
||||
for (here = model->B3SOIDDinstances ; here != NULL ; here = here->B3SOIDDnextInstance)
|
||||
{
|
||||
ckt->CKTnodeIsLinear [here->B3SOIDDdNodePrime] = 0 ;
|
||||
ckt->CKTnodeIsLinear [here->B3SOIDDsNodePrime] = 0 ;
|
||||
ckt->CKTnodeIsLinear [here->B3SOIDDbNode] = 0 ;
|
||||
ckt->CKTnodeIsLinear [here->B3SOIDDtempNode] = 0 ;
|
||||
if ((here->B3SOIDDdebugMod > 1) || (here->B3SOIDDdebugMod == -1))
|
||||
{
|
||||
ckt->CKTnodeIsLinear [here->B3SOIDDvbsNode] = 0 ;
|
||||
ckt->CKTnodeIsLinear [here->B3SOIDDidsNode] = 0 ;
|
||||
ckt->CKTnodeIsLinear [here->B3SOIDDicNode] = 0 ;
|
||||
ckt->CKTnodeIsLinear [here->B3SOIDDibsNode] = 0 ;
|
||||
ckt->CKTnodeIsLinear [here->B3SOIDDibdNode] = 0 ;
|
||||
ckt->CKTnodeIsLinear [here->B3SOIDDiiiNode] = 0 ;
|
||||
ckt->CKTnodeIsLinear [here->B3SOIDDigidlNode] = 0 ;
|
||||
ckt->CKTnodeIsLinear [here->B3SOIDDitunNode] = 0 ;
|
||||
ckt->CKTnodeIsLinear [here->B3SOIDDibpNode] = 0 ;
|
||||
ckt->CKTnodeIsLinear [here->B3SOIDDabeffNode] = 0 ;
|
||||
ckt->CKTnodeIsLinear [here->B3SOIDDvbs0effNode] = 0 ;
|
||||
ckt->CKTnodeIsLinear [here->B3SOIDDvbseffNode] = 0 ;
|
||||
ckt->CKTnodeIsLinear [here->B3SOIDDxcNode] = 0 ;
|
||||
ckt->CKTnodeIsLinear [here->B3SOIDDcbbNode] = 0 ;
|
||||
ckt->CKTnodeIsLinear [here->B3SOIDDcbdNode] = 0 ;
|
||||
ckt->CKTnodeIsLinear [here->B3SOIDDcbgNode] = 0 ;
|
||||
ckt->CKTnodeIsLinear [here->B3SOIDDqbNode] = 0 ;
|
||||
ckt->CKTnodeIsLinear [here->B3SOIDDqbfNode] = 0 ;
|
||||
ckt->CKTnodeIsLinear [here->B3SOIDDqjsNode] = 0 ;
|
||||
ckt->CKTnodeIsLinear [here->B3SOIDDqjdNode] = 0 ;
|
||||
ckt->CKTnodeIsLinear [here->B3SOIDDgmNode] = 0 ;
|
||||
ckt->CKTnodeIsLinear [here->B3SOIDDgmbsNode] = 0 ;
|
||||
ckt->CKTnodeIsLinear [here->B3SOIDDgdsNode] = 0 ;
|
||||
ckt->CKTnodeIsLinear [here->B3SOIDDgmeNode] = 0 ;
|
||||
ckt->CKTnodeIsLinear [here->B3SOIDDvbs0teffNode] = 0 ;
|
||||
ckt->CKTnodeIsLinear [here->B3SOIDDvthNode] = 0 ;
|
||||
ckt->CKTnodeIsLinear [here->B3SOIDDvgsteffNode] = 0 ;
|
||||
ckt->CKTnodeIsLinear [here->B3SOIDDxcsatNode] = 0 ;
|
||||
ckt->CKTnodeIsLinear [here->B3SOIDDqaccNode] = 0 ;
|
||||
ckt->CKTnodeIsLinear [here->B3SOIDDqsub0Node] = 0 ;
|
||||
ckt->CKTnodeIsLinear [here->B3SOIDDqsubs1Node] = 0 ;
|
||||
ckt->CKTnodeIsLinear [here->B3SOIDDqsubs2Node] = 0 ;
|
||||
ckt->CKTnodeIsLinear [here->B3SOIDDqeNode] = 0 ;
|
||||
ckt->CKTnodeIsLinear [here->B3SOIDDqdNode] = 0 ;
|
||||
ckt->CKTnodeIsLinear [here->B3SOIDDqgNode] = 0 ;
|
||||
ckt->CKTnodeIsLinear [here->B3SOIDDvdscvNode] = 0 ;
|
||||
ckt->CKTnodeIsLinear [here->B3SOIDDvcscvNode] = 0 ;
|
||||
ckt->CKTnodeIsLinear [here->B3SOIDDcbeNode] = 0 ;
|
||||
ckt->CKTnodeIsLinear [here->B3SOIDDdum1Node] = 0 ;
|
||||
ckt->CKTnodeIsLinear [here->B3SOIDDdum2Node] = 0 ;
|
||||
ckt->CKTnodeIsLinear [here->B3SOIDDdum3Node] = 0 ;
|
||||
ckt->CKTnodeIsLinear [here->B3SOIDDdum4Node] = 0 ;
|
||||
ckt->CKTnodeIsLinear [here->B3SOIDDdum5Node] = 0 ;
|
||||
}
|
||||
ckt->CKTnodeIsLinear [here->B3SOIDDgNode] = 0 ;
|
||||
ckt->CKTnodeIsLinear [here->B3SOIDDeNode] = 0 ;
|
||||
ckt->CKTnodeIsLinear [here->B3SOIDDpNode] = 0 ;
|
||||
}
|
||||
}
|
||||
|
||||
return (OK) ;
|
||||
}
|
||||
|
|
@ -2,29 +2,29 @@
|
|||
|
||||
noinst_LTLIBRARIES = libbsim3soifd.la
|
||||
|
||||
libbsim3soifd_la_SOURCES = \
|
||||
b3soifd.c \
|
||||
b3soifdacld.c \
|
||||
b3soifdask.c \
|
||||
b3soifdcheck.c \
|
||||
b3soifdcvtest.c \
|
||||
b3soifddel.c \
|
||||
b3soifddest.c \
|
||||
b3soifdgetic.c \
|
||||
b3soifdld.c \
|
||||
b3soifdmask.c \
|
||||
b3soifdmdel.c \
|
||||
b3soifdmpar.c \
|
||||
b3soifdnoi.c \
|
||||
b3soifdpar.c \
|
||||
b3soifdpzld.c \
|
||||
b3soifdset.c \
|
||||
b3soifdtemp.c \
|
||||
b3soifdtrunc.c \
|
||||
b3soifddef.h \
|
||||
b3soifdext.h \
|
||||
b3soifdinit.c \
|
||||
b3soifdinit.h \
|
||||
libbsim3soifd_la_SOURCES = \
|
||||
b3soifd.c \
|
||||
b3soifdacld.c \
|
||||
b3soifdask.c \
|
||||
b3soifdcheck.c \
|
||||
b3soifdcvtest.c \
|
||||
b3soifddel.c \
|
||||
b3soifddest.c \
|
||||
b3soifdgetic.c \
|
||||
b3soifdld.c \
|
||||
b3soifdmask.c \
|
||||
b3soifdmdel.c \
|
||||
b3soifdmpar.c \
|
||||
b3soifdnoi.c \
|
||||
b3soifdpar.c \
|
||||
b3soifdpzld.c \
|
||||
b3soifdset.c \
|
||||
b3soifdtemp.c \
|
||||
b3soifdtrunc.c \
|
||||
b3soifddef.h \
|
||||
b3soifdext.h \
|
||||
b3soifdinit.c \
|
||||
b3soifdinit.h \
|
||||
b3soifditf.h
|
||||
|
||||
|
||||
|
|
@ -40,6 +40,10 @@ if UMFPACK_WANTED
|
|||
libbsim3soifd_la_SOURCES += b3soifdbindCSC.c
|
||||
endif
|
||||
|
||||
if KIRCHHOFF_WANTED
|
||||
libbsim3soifd_la_SOURCES += b3soifdnode.c
|
||||
endif
|
||||
|
||||
AM_CPPFLAGS = @AM_CPPFLAGS@ -I$(top_srcdir)/src/include
|
||||
AM_CFLAGS = $(STATIC)
|
||||
|
||||
|
|
|
|||
|
|
@ -29,9 +29,12 @@ extern int B3SOIFDtrunc(GENmodel*,CKTcircuit*,double*);
|
|||
extern int B3SOIFDnoise(int,int,GENmodel*,CKTcircuit*,Ndata*,double*);
|
||||
extern int B3SOIFDunsetup(GENmodel*,CKTcircuit*);
|
||||
|
||||
|
||||
#if defined(KLU) || defined(SuperLU) || defined(UMFPACK)
|
||||
extern int B3SOIFDbindCSC (GENmodel*, CKTcircuit*) ;
|
||||
extern int B3SOIFDbindCSCComplex (GENmodel*, CKTcircuit*) ;
|
||||
extern int B3SOIFDbindCSCComplexToReal (GENmodel*, CKTcircuit*) ;
|
||||
#endif
|
||||
|
||||
#ifdef KIRCHHOFF
|
||||
extern int B3SOIFDnodeIsNonLinear (GENmodel *, CKTcircuit *) ;
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -71,12 +71,17 @@ SPICEdev B3SOIFDinfo = {
|
|||
#endif
|
||||
/* DEVinstSize*/ &B3SOIFDiSize,
|
||||
/* DEVmodSize*/ &B3SOIFDmSize,
|
||||
|
||||
#if defined(KLU) || defined(SuperLU) || defined(UMFPACK)
|
||||
/* DEVbindCSC */ B3SOIFDbindCSC,
|
||||
/* DEVbindCSCComplex */ B3SOIFDbindCSCComplex,
|
||||
/* DEVbindCSCComplexToReal */ B3SOIFDbindCSCComplexToReal,
|
||||
#endif
|
||||
|
||||
#ifdef KIRCHHOFF
|
||||
/* DEVnodeIsNonLinear */ B3SOIFDnodeIsNonLinear
|
||||
#endif
|
||||
|
||||
};
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -0,0 +1,79 @@
|
|||
/**********
|
||||
Author: 2013 Francesco Lannutti
|
||||
**********/
|
||||
|
||||
#include "ngspice/ngspice.h"
|
||||
#include "ngspice/cktdefs.h"
|
||||
#include "b3soifddef.h"
|
||||
#include "ngspice/sperror.h"
|
||||
|
||||
int
|
||||
B3SOIFDnodeIsNonLinear (GENmodel *inModel, CKTcircuit *ckt)
|
||||
{
|
||||
B3SOIFDmodel *model = (B3SOIFDmodel *)inModel ;
|
||||
B3SOIFDinstance *here ;
|
||||
|
||||
/* loop through all the B3SOIFD models */
|
||||
for ( ; model != NULL ; model = model->B3SOIFDnextModel)
|
||||
{
|
||||
/* loop through all the instances of the model */
|
||||
for (here = model->B3SOIFDinstances ; here != NULL ; here = here->B3SOIFDnextInstance)
|
||||
{
|
||||
ckt->CKTnodeIsLinear [here->B3SOIFDdNodePrime] = 0 ;
|
||||
ckt->CKTnodeIsLinear [here->B3SOIFDsNodePrime] = 0 ;
|
||||
ckt->CKTnodeIsLinear [here->B3SOIFDbNode] = 0 ;
|
||||
ckt->CKTnodeIsLinear [here->B3SOIFDtempNode] = 0 ;
|
||||
if ((here->B3SOIFDdebugMod > 1) || (here->B3SOIFDdebugMod == -1))
|
||||
{
|
||||
ckt->CKTnodeIsLinear [here->B3SOIFDvbsNode] = 0 ;
|
||||
ckt->CKTnodeIsLinear [here->B3SOIFDidsNode] = 0 ;
|
||||
ckt->CKTnodeIsLinear [here->B3SOIFDicNode] = 0 ;
|
||||
ckt->CKTnodeIsLinear [here->B3SOIFDibsNode] = 0 ;
|
||||
ckt->CKTnodeIsLinear [here->B3SOIFDibdNode] = 0 ;
|
||||
ckt->CKTnodeIsLinear [here->B3SOIFDiiiNode] = 0 ;
|
||||
ckt->CKTnodeIsLinear [here->B3SOIFDigidlNode] = 0 ;
|
||||
ckt->CKTnodeIsLinear [here->B3SOIFDitunNode] = 0 ;
|
||||
ckt->CKTnodeIsLinear [here->B3SOIFDibpNode] = 0 ;
|
||||
ckt->CKTnodeIsLinear [here->B3SOIFDabeffNode] = 0 ;
|
||||
ckt->CKTnodeIsLinear [here->B3SOIFDvbs0effNode] = 0 ;
|
||||
ckt->CKTnodeIsLinear [here->B3SOIFDvbseffNode] = 0 ;
|
||||
ckt->CKTnodeIsLinear [here->B3SOIFDxcNode] = 0 ;
|
||||
ckt->CKTnodeIsLinear [here->B3SOIFDcbbNode] = 0 ;
|
||||
ckt->CKTnodeIsLinear [here->B3SOIFDcbdNode] = 0 ;
|
||||
ckt->CKTnodeIsLinear [here->B3SOIFDcbgNode] = 0 ;
|
||||
ckt->CKTnodeIsLinear [here->B3SOIFDqbNode] = 0 ;
|
||||
ckt->CKTnodeIsLinear [here->B3SOIFDqbfNode] = 0 ;
|
||||
ckt->CKTnodeIsLinear [here->B3SOIFDqjsNode] = 0 ;
|
||||
ckt->CKTnodeIsLinear [here->B3SOIFDqjdNode] = 0 ;
|
||||
ckt->CKTnodeIsLinear [here->B3SOIFDgmNode] = 0 ;
|
||||
ckt->CKTnodeIsLinear [here->B3SOIFDgmbsNode] = 0 ;
|
||||
ckt->CKTnodeIsLinear [here->B3SOIFDgdsNode] = 0 ;
|
||||
ckt->CKTnodeIsLinear [here->B3SOIFDgmeNode] = 0 ;
|
||||
ckt->CKTnodeIsLinear [here->B3SOIFDvbs0teffNode] = 0 ;
|
||||
ckt->CKTnodeIsLinear [here->B3SOIFDvthNode] = 0 ;
|
||||
ckt->CKTnodeIsLinear [here->B3SOIFDvgsteffNode] = 0 ;
|
||||
ckt->CKTnodeIsLinear [here->B3SOIFDxcsatNode] = 0 ;
|
||||
ckt->CKTnodeIsLinear [here->B3SOIFDqaccNode] = 0 ;
|
||||
ckt->CKTnodeIsLinear [here->B3SOIFDqsub0Node] = 0 ;
|
||||
ckt->CKTnodeIsLinear [here->B3SOIFDqsubs1Node] = 0 ;
|
||||
ckt->CKTnodeIsLinear [here->B3SOIFDqsubs2Node] = 0 ;
|
||||
ckt->CKTnodeIsLinear [here->B3SOIFDqeNode] = 0 ;
|
||||
ckt->CKTnodeIsLinear [here->B3SOIFDqdNode] = 0 ;
|
||||
ckt->CKTnodeIsLinear [here->B3SOIFDqgNode] = 0 ;
|
||||
ckt->CKTnodeIsLinear [here->B3SOIFDvdscvNode] = 0 ;
|
||||
ckt->CKTnodeIsLinear [here->B3SOIFDvcscvNode] = 0 ;
|
||||
ckt->CKTnodeIsLinear [here->B3SOIFDcbeNode] = 0 ;
|
||||
ckt->CKTnodeIsLinear [here->B3SOIFDdum1Node] = 0 ;
|
||||
ckt->CKTnodeIsLinear [here->B3SOIFDdum2Node] = 0 ;
|
||||
ckt->CKTnodeIsLinear [here->B3SOIFDdum3Node] = 0 ;
|
||||
ckt->CKTnodeIsLinear [here->B3SOIFDdum4Node] = 0 ;
|
||||
ckt->CKTnodeIsLinear [here->B3SOIFDdum5Node] = 0 ;
|
||||
}
|
||||
ckt->CKTnodeIsLinear [here->B3SOIFDgNode] = 0 ;
|
||||
ckt->CKTnodeIsLinear [here->B3SOIFDeNode] = 0 ;
|
||||
ckt->CKTnodeIsLinear [here->B3SOIFDpNode] = 0 ;
|
||||
}
|
||||
}
|
||||
|
||||
return (OK) ;
|
||||
}
|
||||
|
|
@ -2,29 +2,29 @@
|
|||
|
||||
noinst_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 \
|
||||
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
|
||||
|
||||
|
||||
|
|
@ -40,6 +40,10 @@ if UMFPACK_WANTED
|
|||
libbsim3soipd_la_SOURCES += b3soipdbindCSC.c
|
||||
endif
|
||||
|
||||
if KIRCHHOFF_WANTED
|
||||
libbsim3soipd_la_SOURCES += b3soipdnode.c
|
||||
endif
|
||||
|
||||
AM_CPPFLAGS = @AM_CPPFLAGS@ -I$(top_srcdir)/src/include
|
||||
AM_CFLAGS = $(STATIC)
|
||||
|
||||
|
|
|
|||
|
|
@ -34,3 +34,7 @@ extern int B3SOIPDbindCSC (GENmodel*, CKTcircuit*) ;
|
|||
extern int B3SOIPDbindCSCComplex (GENmodel*, CKTcircuit*) ;
|
||||
extern int B3SOIPDbindCSCComplexToReal (GENmodel*, CKTcircuit*) ;
|
||||
#endif
|
||||
|
||||
#ifdef KIRCHHOFF
|
||||
extern int B3SOIPDnodeIsNonLinear (GENmodel *, CKTcircuit *) ;
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -72,12 +72,17 @@ SPICEdev B3SOIPDinfo = {
|
|||
#endif
|
||||
/* DEVinstSize*/ &B3SOIPDiSize,
|
||||
/* DEVmodSize*/ &B3SOIPDmSize,
|
||||
|
||||
#if defined(KLU) || defined(SuperLU) || defined(UMFPACK)
|
||||
/* DEVbindCSC */ B3SOIPDbindCSC,
|
||||
/* DEVbindCSCComplex */ B3SOIPDbindCSCComplex,
|
||||
/* DEVbindCSCComplexToReal */ B3SOIPDbindCSCComplexToReal,
|
||||
#endif
|
||||
|
||||
#ifdef KIRCHHOFF
|
||||
/* DEVnodeIsNonLinear */ B3SOIPDnodeIsNonLinear
|
||||
#endif
|
||||
|
||||
};
|
||||
|
||||
SPICEdev *
|
||||
|
|
|
|||
|
|
@ -0,0 +1,55 @@
|
|||
/**********
|
||||
Author: 2013 Francesco Lannutti
|
||||
**********/
|
||||
|
||||
#include "ngspice/ngspice.h"
|
||||
#include "ngspice/cktdefs.h"
|
||||
#include "b3soipddef.h"
|
||||
#include "ngspice/sperror.h"
|
||||
|
||||
int
|
||||
B3SOIPDnodeIsNonLinear (GENmodel *inModel, CKTcircuit *ckt)
|
||||
{
|
||||
B3SOIPDmodel *model = (B3SOIPDmodel *)inModel ;
|
||||
B3SOIPDinstance *here ;
|
||||
|
||||
/* loop through all the B3SOIPD models */
|
||||
for ( ; model != NULL ; model = model->B3SOIPDnextModel)
|
||||
{
|
||||
/* loop through all the instances of the model */
|
||||
for (here = model->B3SOIPDinstances ; here != NULL ; here = here->B3SOIPDnextInstance)
|
||||
{
|
||||
ckt->CKTnodeIsLinear [here->B3SOIPDdNodePrime] = 0 ;
|
||||
ckt->CKTnodeIsLinear [here->B3SOIPDsNodePrime] = 0 ;
|
||||
ckt->CKTnodeIsLinear [here->B3SOIPDbNode] = 0 ;
|
||||
ckt->CKTnodeIsLinear [here->B3SOIPDtempNode] = 0 ;
|
||||
if (here->B3SOIPDdebugMod != 0)
|
||||
{
|
||||
ckt->CKTnodeIsLinear [here->B3SOIPDvbsNode] = 0 ;
|
||||
ckt->CKTnodeIsLinear [here->B3SOIPDidsNode] = 0 ;
|
||||
ckt->CKTnodeIsLinear [here->B3SOIPDicNode] = 0 ;
|
||||
ckt->CKTnodeIsLinear [here->B3SOIPDibsNode] = 0 ;
|
||||
ckt->CKTnodeIsLinear [here->B3SOIPDibdNode] = 0 ;
|
||||
ckt->CKTnodeIsLinear [here->B3SOIPDiiiNode] = 0 ;
|
||||
ckt->CKTnodeIsLinear [here->B3SOIPDigNode] = 0 ;
|
||||
ckt->CKTnodeIsLinear [here->B3SOIPDgiggNode] = 0 ;
|
||||
ckt->CKTnodeIsLinear [here->B3SOIPDgigdNode] = 0 ;
|
||||
ckt->CKTnodeIsLinear [here->B3SOIPDgigbNode] = 0 ;
|
||||
ckt->CKTnodeIsLinear [here->B3SOIPDigidlNode] = 0 ;
|
||||
ckt->CKTnodeIsLinear [here->B3SOIPDitunNode] = 0 ;
|
||||
ckt->CKTnodeIsLinear [here->B3SOIPDibpNode] = 0 ;
|
||||
ckt->CKTnodeIsLinear [here->B3SOIPDcbbNode] = 0 ;
|
||||
ckt->CKTnodeIsLinear [here->B3SOIPDcbdNode] = 0 ;
|
||||
ckt->CKTnodeIsLinear [here->B3SOIPDcbgNode] = 0 ;
|
||||
ckt->CKTnodeIsLinear [here->B3SOIPDqbfNode] = 0 ;
|
||||
ckt->CKTnodeIsLinear [here->B3SOIPDqjsNode] = 0 ;
|
||||
ckt->CKTnodeIsLinear [here->B3SOIPDqjdNode] = 0 ;
|
||||
}
|
||||
ckt->CKTnodeIsLinear [here->B3SOIPDgNode] = 0 ;
|
||||
ckt->CKTnodeIsLinear [here->B3SOIPDeNode] = 0 ;
|
||||
ckt->CKTnodeIsLinear [here->B3SOIPDpNode] = 0 ;
|
||||
}
|
||||
}
|
||||
|
||||
return (OK) ;
|
||||
}
|
||||
|
|
@ -39,6 +39,10 @@ if UMFPACK_WANTED
|
|||
libbsim3v0_la_SOURCES += b3v0bindCSC.c
|
||||
endif
|
||||
|
||||
if KIRCHHOFF_WANTED
|
||||
libbsim3v0_la_SOURCES += b3v0node.c
|
||||
endif
|
||||
|
||||
AM_CPPFLAGS = @AM_CPPFLAGS@ -I$(top_srcdir)/src/include
|
||||
AM_CFLAGS = $(STATIC)
|
||||
|
||||
|
|
|
|||
|
|
@ -0,0 +1,31 @@
|
|||
/**********
|
||||
Author: 2013 Francesco Lannutti
|
||||
**********/
|
||||
|
||||
#include "ngspice/ngspice.h"
|
||||
#include "ngspice/cktdefs.h"
|
||||
#include "bsim3v0def.h"
|
||||
#include "ngspice/sperror.h"
|
||||
|
||||
int
|
||||
BSIM3v0nodeIsNonLinear (GENmodel *inModel, CKTcircuit *ckt)
|
||||
{
|
||||
BSIM3v0model *model = (BSIM3v0model *)inModel ;
|
||||
BSIM3v0instance *here ;
|
||||
|
||||
/* loop through all the BSIM3v0 models */
|
||||
for ( ; model != NULL ; model = model->BSIM3v0nextModel)
|
||||
{
|
||||
/* loop through all the instances of the model */
|
||||
for (here = model->BSIM3v0instances ; here != NULL ; here = here->BSIM3v0nextInstance)
|
||||
{
|
||||
ckt->CKTnodeIsLinear [here->BSIM3v0dNodePrime] = 0 ;
|
||||
ckt->CKTnodeIsLinear [here->BSIM3v0sNodePrime] = 0 ;
|
||||
ckt->CKTnodeIsLinear [here->BSIM3v0qNode] = 0 ;
|
||||
ckt->CKTnodeIsLinear [here->BSIM3v0gNode] = 0 ;
|
||||
ckt->CKTnodeIsLinear [here->BSIM3v0bNode] = 0 ;
|
||||
}
|
||||
}
|
||||
|
||||
return (OK) ;
|
||||
}
|
||||
|
|
@ -26,11 +26,14 @@ extern int BSIM3v0setup(SMPmatrix*,GENmodel*,CKTcircuit*,int*);
|
|||
extern int BSIM3v0temp(GENmodel*,CKTcircuit*);
|
||||
extern int BSIM3v0trunc(GENmodel*,CKTcircuit*,double*);
|
||||
extern int BSIM3v0noise(int,int,GENmodel*,CKTcircuit*,Ndata*,double*);
|
||||
extern int BSIM3v0unsetup(GENmodel *, CKTcircuit *);
|
||||
|
||||
extern int BSIM3v0unsetup(GENmodel *, CKTcircuit *);
|
||||
|
||||
#if defined(KLU) || defined(SuperLU) || defined(UMFPACK)
|
||||
extern int BSIM3v0bindCSC (GENmodel*, CKTcircuit*) ;
|
||||
extern int BSIM3v0bindCSCComplex (GENmodel*, CKTcircuit*) ;
|
||||
extern int BSIM3v0bindCSCComplexToReal (GENmodel*, CKTcircuit*) ;
|
||||
#endif
|
||||
|
||||
#ifdef KIRCHHOFF
|
||||
extern int BSIM3v0nodeIsNonLinear (GENmodel *, CKTcircuit *) ;
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -71,12 +71,17 @@ SPICEdev B3v0info = {
|
|||
#endif
|
||||
/* DEVinstSize */ &BSIM3v0iSize,
|
||||
/* DEVmodSize */ &BSIM3v0mSize,
|
||||
|
||||
#if defined(KLU) || defined(SuperLU) || defined(UMFPACK)
|
||||
/* DEVbindCSC */ BSIM3v0bindCSC,
|
||||
/* DEVbindCSCComplex */ BSIM3v0bindCSCComplex,
|
||||
/* DEVbindCSCComplexToReal */ BSIM3v0bindCSCComplexToReal,
|
||||
#endif
|
||||
|
||||
#ifdef KIRCHHOFF
|
||||
/* DEVnodeIsNonLinear */ BSIM3v0nodeIsNonLinear
|
||||
#endif
|
||||
|
||||
};
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -40,6 +40,10 @@ if UMFPACK_WANTED
|
|||
libbsim3v1_la_SOURCES += b3v1bindCSC.c
|
||||
endif
|
||||
|
||||
if KIRCHHOFF_WANTED
|
||||
libbsim3v1_la_SOURCES += b3v1node.c
|
||||
endif
|
||||
|
||||
AM_CPPFLAGS = @AM_CPPFLAGS@ -I$(top_srcdir)/src/include
|
||||
AM_CFLAGS = $(STATIC)
|
||||
|
||||
|
|
|
|||
|
|
@ -0,0 +1,31 @@
|
|||
/**********
|
||||
Author: 2013 Francesco Lannutti
|
||||
**********/
|
||||
|
||||
#include "ngspice/ngspice.h"
|
||||
#include "ngspice/cktdefs.h"
|
||||
#include "bsim3v1def.h"
|
||||
#include "ngspice/sperror.h"
|
||||
|
||||
int
|
||||
BSIM3v1nodeIsNonLinear (GENmodel *inModel, CKTcircuit *ckt)
|
||||
{
|
||||
BSIM3v1model *model = (BSIM3v1model *)inModel ;
|
||||
BSIM3v1instance *here ;
|
||||
|
||||
/* loop through all the BSIM3v1 models */
|
||||
for ( ; model != NULL ; model = model->BSIM3v1nextModel)
|
||||
{
|
||||
/* loop through all the instances of the model */
|
||||
for (here = model->BSIM3v1instances ; here != NULL ; here = here->BSIM3v1nextInstance)
|
||||
{
|
||||
ckt->CKTnodeIsLinear [here->BSIM3v1dNodePrime] = 0 ;
|
||||
ckt->CKTnodeIsLinear [here->BSIM3v1sNodePrime] = 0 ;
|
||||
ckt->CKTnodeIsLinear [here->BSIM3v1qNode] = 0 ;
|
||||
ckt->CKTnodeIsLinear [here->BSIM3v1gNode] = 0 ;
|
||||
ckt->CKTnodeIsLinear [here->BSIM3v1bNode] = 0 ;
|
||||
}
|
||||
}
|
||||
|
||||
return (OK) ;
|
||||
}
|
||||
|
|
@ -29,9 +29,12 @@ extern int BSIM3v1trunc(GENmodel *, CKTcircuit *, double *);
|
|||
extern int BSIM3v1noise(int, int, GENmodel *, CKTcircuit *, Ndata *, double *);
|
||||
extern int BSIM3v1unsetup(GENmodel *, CKTcircuit *);
|
||||
|
||||
|
||||
#if defined(KLU) || defined(SuperLU) || defined(UMFPACK)
|
||||
extern int BSIM3v1bindCSC (GENmodel*, CKTcircuit*) ;
|
||||
extern int BSIM3v1bindCSCComplex (GENmodel*, CKTcircuit*) ;
|
||||
extern int BSIM3v1bindCSCComplexToReal (GENmodel*, CKTcircuit*) ;
|
||||
#endif
|
||||
|
||||
#ifdef KIRCHHOFF
|
||||
extern int BSIM3v1nodeIsNonLinear (GENmodel *, CKTcircuit *) ;
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -71,12 +71,17 @@ SPICEdev BSIM3v1info = {
|
|||
#endif
|
||||
/* DEVinstSize */ &BSIM3v1iSize,
|
||||
/* DEVmodSize */ &BSIM3v1mSize,
|
||||
|
||||
#if defined(KLU) || defined(SuperLU) || defined(UMFPACK)
|
||||
/* DEVbindCSC */ BSIM3v1bindCSC,
|
||||
/* DEVbindCSCComplex */ BSIM3v1bindCSCComplex,
|
||||
/* DEVbindCSCComplexToReal */ BSIM3v1bindCSCComplexToReal,
|
||||
#endif
|
||||
|
||||
#ifdef KIRCHHOFF
|
||||
/* DEVnodeIsNonLinear */ BSIM3v1nodeIsNonLinear
|
||||
#endif
|
||||
|
||||
};
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -40,6 +40,10 @@ if UMFPACK_WANTED
|
|||
libbsim3v32_la_SOURCES += b3v32bindCSC.c
|
||||
endif
|
||||
|
||||
if KIRCHHOFF_WANTED
|
||||
libbsim3v32_la_SOURCES += b3v32node.c
|
||||
endif
|
||||
|
||||
AM_CPPFLAGS = @AM_CPPFLAGS@ -I$(top_srcdir)/src/include
|
||||
AM_CFLAGS = $(STATIC)
|
||||
|
||||
|
|
|
|||
|
|
@ -26,6 +26,7 @@ IOP( "nrd", BSIM3v32_NRD, IF_REAL , "Number of squares in drain"),
|
|||
IOP( "nrs", BSIM3v32_NRS, IF_REAL , "Number of squares in source"),
|
||||
IOP( "off", BSIM3v32_OFF, IF_FLAG , "Device is initially off"),
|
||||
IOP( "nqsmod", BSIM3v32_NQSMOD, IF_INTEGER, "Non-quasi-static model selector"),
|
||||
IOP( "geo", BSIM3v32_GEO, IF_INTEGER, "ACM model drain/source connection"),
|
||||
IOP( "delvto", BSIM3v32_DELVTO, IF_REAL , "Zero bias threshold voltage variation"),
|
||||
IOP( "mulu0", BSIM3v32_MULU0, IF_REAL , "Low field mobility multiplier"),
|
||||
IP( "ic", BSIM3v32_IC, IF_REALVEC , "Vector of DS,GS,BS initial voltages"),
|
||||
|
|
@ -65,7 +66,9 @@ IFparm BSIM3v32mPTable[] = { /* model parameters */
|
|||
IOP( "capmod", BSIM3v32_MOD_CAPMOD, IF_INTEGER, "Capacitance model selector"),
|
||||
IOP( "mobmod", BSIM3v32_MOD_MOBMOD, IF_INTEGER, "Mobility model selector"),
|
||||
IOP( "noimod", BSIM3v32_MOD_NOIMOD, IF_INTEGER, "Noise model selector"),
|
||||
IOP( "nqsmod", BSIM3v32_MOD_NQSMOD, IF_INTEGER, "Non-quasi-static model selector"),
|
||||
IOP( "acm", BSIM3v32_MOD_ACMMOD, IF_INTEGER, "Area calculation method selector"),
|
||||
IOP( "calcacm", BSIM3v32_MOD_CALCACM, IF_INTEGER, "Area calculation method ACM=12"),
|
||||
IOP( "paramchk", BSIM3v32_MOD_PARAMCHK, IF_INTEGER, "Model parameter checking selector"),
|
||||
IOP( "binunit", BSIM3v32_MOD_BINUNIT, IF_INTEGER, "Bin unit selector"),
|
||||
IOP( "version", BSIM3v32_MOD_VERSION, IF_STRING, " parameter for model version"),
|
||||
|
|
@ -218,8 +221,9 @@ IOP( "ldif", BSIM3v32_MOD_LDIF, IF_REAL, "ACM Parameter: Length of LDD Gate-Sour
|
|||
IOP( "ld", BSIM3v32_MOD_LD, IF_REAL, "ACM Parameter: Length of LDD under Gate"),
|
||||
IOP( "rd", BSIM3v32_MOD_RD, IF_REAL, "ACM Parameter: Resistance of LDD drain side"),
|
||||
IOP( "rs", BSIM3v32_MOD_RS, IF_REAL, "ACM Parameter: Resistance of LDD source side"),
|
||||
IOP( "rdc", BSIM3v32_MOD_RS, IF_REAL, "ACM Parameter: Resistance contact drain side"),
|
||||
IOP( "rsc", BSIM3v32_MOD_RS, IF_REAL, "ACM Parameter: Resistance contact source side"),
|
||||
IOP( "rdc", BSIM3v32_MOD_RDC, IF_REAL, "ACM Parameter: Resistance contact drain side"),
|
||||
IOP( "rsc", BSIM3v32_MOD_RSC, IF_REAL, "ACM Parameter: Resistance contact source side"),
|
||||
IOP( "wmlt", BSIM3v32_MOD_WMLT, IF_REAL, "ACM Parameter: Width shrink factor"),
|
||||
|
||||
IOP( "alpha0", BSIM3v32_MOD_ALPHA0, IF_REAL, "substrate current model parameter"),
|
||||
IOP( "alpha1", BSIM3v32_MOD_ALPHA1, IF_REAL, "substrate current model parameter"),
|
||||
|
|
@ -506,11 +510,11 @@ char *BSIM3v32names[] = {
|
|||
"Charge"
|
||||
};
|
||||
|
||||
int BSIM3v32nSize = NUMELEMS(BSIM3v32names);
|
||||
int BSIM3v32pTSize = NUMELEMS(BSIM3v32pTable);
|
||||
int BSIM3v32mPTSize = NUMELEMS(BSIM3v32mPTable);
|
||||
int BSIM3v32iSize = sizeof(BSIM3v32instance);
|
||||
int BSIM3v32mSize = sizeof(BSIM3v32model);
|
||||
int BSIM3v32nSize = NUMELEMS(BSIM3v32names);
|
||||
int BSIM3v32pTSize = NUMELEMS(BSIM3v32pTable);
|
||||
int BSIM3v32mPTSize = NUMELEMS(BSIM3v32mPTable);
|
||||
int BSIM3v32iSize = sizeof(BSIM3v32instance);
|
||||
int BSIM3v32mSize = sizeof(BSIM3v32model);
|
||||
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -39,9 +39,9 @@ double m;
|
|||
for (; model != NULL; model = model->BSIM3v32nextModel)
|
||||
{ for (here = model->BSIM3v32instances; here!= NULL;
|
||||
here = here->BSIM3v32nextInstance)
|
||||
{
|
||||
if (here->BSIM3v32mode >= 0)
|
||||
{ Gm = here->BSIM3v32gm;
|
||||
{
|
||||
if (here->BSIM3v32mode >= 0)
|
||||
{ Gm = here->BSIM3v32gm;
|
||||
Gmbs = here->BSIM3v32gmbs;
|
||||
FwdSum = Gm + Gmbs;
|
||||
RevSum = 0.0;
|
||||
|
|
@ -59,7 +59,7 @@ double m;
|
|||
gbspb = 0.0;
|
||||
gbspsp = 0.0;
|
||||
|
||||
if (here->BSIM3v32nqsMod == 0)
|
||||
if (here->BSIM3v32nqsMod == 0)
|
||||
{ cggb = here->BSIM3v32cggb;
|
||||
cgsb = here->BSIM3v32cgsb;
|
||||
cgdb = here->BSIM3v32cgdb;
|
||||
|
|
@ -73,19 +73,19 @@ double m;
|
|||
cddb = here->BSIM3v32cddb;
|
||||
|
||||
xgtg = xgtd = xgts = xgtb = 0.0;
|
||||
sxpart = 0.6;
|
||||
sxpart = 0.6;
|
||||
dxpart = 0.4;
|
||||
ddxpart_dVd = ddxpart_dVg = ddxpart_dVb
|
||||
= ddxpart_dVs = 0.0;
|
||||
dsxpart_dVd = dsxpart_dVg = dsxpart_dVb
|
||||
= dsxpart_dVs = 0.0;
|
||||
ddxpart_dVd = ddxpart_dVg = ddxpart_dVb
|
||||
= ddxpart_dVs = 0.0;
|
||||
dsxpart_dVd = dsxpart_dVg = dsxpart_dVb
|
||||
= dsxpart_dVs = 0.0;
|
||||
}
|
||||
else
|
||||
{ cggb = cgdb = cgsb = 0.0;
|
||||
cbgb = cbdb = cbsb = 0.0;
|
||||
cdgb = cddb = cdsb = 0.0;
|
||||
|
||||
xgtg = here->BSIM3v32gtg;
|
||||
xgtg = here->BSIM3v32gtg;
|
||||
xgtd = here->BSIM3v32gtd;
|
||||
xgts = here->BSIM3v32gts;
|
||||
xgtb = here->BSIM3v32gtb;
|
||||
|
|
@ -95,46 +95,46 @@ double m;
|
|||
xcqsb = here->BSIM3v32cqsb * omega;
|
||||
xcqbb = here->BSIM3v32cqbb * omega;
|
||||
|
||||
CoxWL = model->BSIM3v32cox * here->pParam->BSIM3v32weffCV
|
||||
CoxWL = model->BSIM3v32cox * here->pParam->BSIM3v32weffCV
|
||||
* here->pParam->BSIM3v32leffCV;
|
||||
qcheq = -(here->BSIM3v32qgate + here->BSIM3v32qbulk);
|
||||
if (fabs(qcheq) <= 1.0e-5 * CoxWL)
|
||||
{ if (model->BSIM3v32xpart < 0.5)
|
||||
{ dxpart = 0.4;
|
||||
}
|
||||
else if (model->BSIM3v32xpart > 0.5)
|
||||
{ dxpart = 0.0;
|
||||
}
|
||||
else
|
||||
{ dxpart = 0.5;
|
||||
}
|
||||
ddxpart_dVd = ddxpart_dVg = ddxpart_dVb
|
||||
= ddxpart_dVs = 0.0;
|
||||
}
|
||||
else
|
||||
{ dxpart = here->BSIM3v32qdrn / qcheq;
|
||||
Cdd = here->BSIM3v32cddb;
|
||||
Csd = -(here->BSIM3v32cgdb + here->BSIM3v32cddb
|
||||
+ here->BSIM3v32cbdb);
|
||||
ddxpart_dVd = (Cdd - dxpart * (Cdd + Csd)) / qcheq;
|
||||
Cdg = here->BSIM3v32cdgb;
|
||||
Csg = -(here->BSIM3v32cggb + here->BSIM3v32cdgb
|
||||
+ here->BSIM3v32cbgb);
|
||||
ddxpart_dVg = (Cdg - dxpart * (Cdg + Csg)) / qcheq;
|
||||
qcheq = -(here->BSIM3v32qgate + here->BSIM3v32qbulk);
|
||||
if (fabs(qcheq) <= 1.0e-5 * CoxWL)
|
||||
{ if (model->BSIM3v32xpart < 0.5)
|
||||
{ dxpart = 0.4;
|
||||
}
|
||||
else if (model->BSIM3v32xpart > 0.5)
|
||||
{ dxpart = 0.0;
|
||||
}
|
||||
else
|
||||
{ dxpart = 0.5;
|
||||
}
|
||||
ddxpart_dVd = ddxpart_dVg = ddxpart_dVb
|
||||
= ddxpart_dVs = 0.0;
|
||||
}
|
||||
else
|
||||
{ dxpart = here->BSIM3v32qdrn / qcheq;
|
||||
Cdd = here->BSIM3v32cddb;
|
||||
Csd = -(here->BSIM3v32cgdb + here->BSIM3v32cddb
|
||||
+ here->BSIM3v32cbdb);
|
||||
ddxpart_dVd = (Cdd - dxpart * (Cdd + Csd)) / qcheq;
|
||||
Cdg = here->BSIM3v32cdgb;
|
||||
Csg = -(here->BSIM3v32cggb + here->BSIM3v32cdgb
|
||||
+ here->BSIM3v32cbgb);
|
||||
ddxpart_dVg = (Cdg - dxpart * (Cdg + Csg)) / qcheq;
|
||||
|
||||
Cds = here->BSIM3v32cdsb;
|
||||
Css = -(here->BSIM3v32cgsb + here->BSIM3v32cdsb
|
||||
+ here->BSIM3v32cbsb);
|
||||
ddxpart_dVs = (Cds - dxpart * (Cds + Css)) / qcheq;
|
||||
Cds = here->BSIM3v32cdsb;
|
||||
Css = -(here->BSIM3v32cgsb + here->BSIM3v32cdsb
|
||||
+ here->BSIM3v32cbsb);
|
||||
ddxpart_dVs = (Cds - dxpart * (Cds + Css)) / qcheq;
|
||||
|
||||
ddxpart_dVb = -(ddxpart_dVd + ddxpart_dVg
|
||||
+ ddxpart_dVs);
|
||||
}
|
||||
sxpart = 1.0 - dxpart;
|
||||
dsxpart_dVd = -ddxpart_dVd;
|
||||
dsxpart_dVg = -ddxpart_dVg;
|
||||
dsxpart_dVs = -ddxpart_dVs;
|
||||
dsxpart_dVb = -(dsxpart_dVd + dsxpart_dVg + dsxpart_dVs);
|
||||
ddxpart_dVb = -(ddxpart_dVd + ddxpart_dVg
|
||||
+ ddxpart_dVs);
|
||||
}
|
||||
sxpart = 1.0 - dxpart;
|
||||
dsxpart_dVd = -ddxpart_dVd;
|
||||
dsxpart_dVg = -ddxpart_dVg;
|
||||
dsxpart_dVs = -ddxpart_dVs;
|
||||
dsxpart_dVb = -(dsxpart_dVd + dsxpart_dVg + dsxpart_dVs);
|
||||
}
|
||||
}
|
||||
else
|
||||
|
|
@ -156,7 +156,7 @@ double m;
|
|||
gbspb = here->BSIM3v32gbbs;
|
||||
gbspdp = -(gbspg + gbspsp + gbspb);
|
||||
|
||||
if (here->BSIM3v32nqsMod == 0)
|
||||
if (here->BSIM3v32nqsMod == 0)
|
||||
{ cggb = here->BSIM3v32cggb;
|
||||
cgsb = here->BSIM3v32cgdb;
|
||||
cgdb = here->BSIM3v32cgsb;
|
||||
|
|
@ -170,19 +170,19 @@ double m;
|
|||
cddb = -(here->BSIM3v32cdsb + cgdb + cbdb);
|
||||
|
||||
xgtg = xgtd = xgts = xgtb = 0.0;
|
||||
sxpart = 0.4;
|
||||
sxpart = 0.4;
|
||||
dxpart = 0.6;
|
||||
ddxpart_dVd = ddxpart_dVg = ddxpart_dVb
|
||||
= ddxpart_dVs = 0.0;
|
||||
dsxpart_dVd = dsxpart_dVg = dsxpart_dVb
|
||||
= dsxpart_dVs = 0.0;
|
||||
ddxpart_dVd = ddxpart_dVg = ddxpart_dVb
|
||||
= ddxpart_dVs = 0.0;
|
||||
dsxpart_dVd = dsxpart_dVg = dsxpart_dVb
|
||||
= dsxpart_dVs = 0.0;
|
||||
}
|
||||
else
|
||||
{ cggb = cgdb = cgsb = 0.0;
|
||||
cbgb = cbdb = cbsb = 0.0;
|
||||
cdgb = cddb = cdsb = 0.0;
|
||||
|
||||
xgtg = here->BSIM3v32gtg;
|
||||
xgtg = here->BSIM3v32gtg;
|
||||
xgtd = here->BSIM3v32gts;
|
||||
xgts = here->BSIM3v32gtd;
|
||||
xgtb = here->BSIM3v32gtb;
|
||||
|
|
@ -192,50 +192,50 @@ double m;
|
|||
xcqsb = here->BSIM3v32cqdb * omega;
|
||||
xcqbb = here->BSIM3v32cqbb * omega;
|
||||
|
||||
CoxWL = model->BSIM3v32cox * here->pParam->BSIM3v32weffCV
|
||||
CoxWL = model->BSIM3v32cox * here->pParam->BSIM3v32weffCV
|
||||
* here->pParam->BSIM3v32leffCV;
|
||||
qcheq = -(here->BSIM3v32qgate + here->BSIM3v32qbulk);
|
||||
if (fabs(qcheq) <= 1.0e-5 * CoxWL)
|
||||
{ if (model->BSIM3v32xpart < 0.5)
|
||||
{ sxpart = 0.4;
|
||||
}
|
||||
else if (model->BSIM3v32xpart > 0.5)
|
||||
{ sxpart = 0.0;
|
||||
}
|
||||
else
|
||||
{ sxpart = 0.5;
|
||||
}
|
||||
dsxpart_dVd = dsxpart_dVg = dsxpart_dVb
|
||||
= dsxpart_dVs = 0.0;
|
||||
}
|
||||
else
|
||||
{ sxpart = here->BSIM3v32qdrn / qcheq;
|
||||
Css = here->BSIM3v32cddb;
|
||||
Cds = -(here->BSIM3v32cgdb + here->BSIM3v32cddb
|
||||
+ here->BSIM3v32cbdb);
|
||||
dsxpart_dVs = (Css - sxpart * (Css + Cds)) / qcheq;
|
||||
Csg = here->BSIM3v32cdgb;
|
||||
Cdg = -(here->BSIM3v32cggb + here->BSIM3v32cdgb
|
||||
+ here->BSIM3v32cbgb);
|
||||
dsxpart_dVg = (Csg - sxpart * (Csg + Cdg)) / qcheq;
|
||||
qcheq = -(here->BSIM3v32qgate + here->BSIM3v32qbulk);
|
||||
if (fabs(qcheq) <= 1.0e-5 * CoxWL)
|
||||
{ if (model->BSIM3v32xpart < 0.5)
|
||||
{ sxpart = 0.4;
|
||||
}
|
||||
else if (model->BSIM3v32xpart > 0.5)
|
||||
{ sxpart = 0.0;
|
||||
}
|
||||
else
|
||||
{ sxpart = 0.5;
|
||||
}
|
||||
dsxpart_dVd = dsxpart_dVg = dsxpart_dVb
|
||||
= dsxpart_dVs = 0.0;
|
||||
}
|
||||
else
|
||||
{ sxpart = here->BSIM3v32qdrn / qcheq;
|
||||
Css = here->BSIM3v32cddb;
|
||||
Cds = -(here->BSIM3v32cgdb + here->BSIM3v32cddb
|
||||
+ here->BSIM3v32cbdb);
|
||||
dsxpart_dVs = (Css - sxpart * (Css + Cds)) / qcheq;
|
||||
Csg = here->BSIM3v32cdgb;
|
||||
Cdg = -(here->BSIM3v32cggb + here->BSIM3v32cdgb
|
||||
+ here->BSIM3v32cbgb);
|
||||
dsxpart_dVg = (Csg - sxpart * (Csg + Cdg)) / qcheq;
|
||||
|
||||
Csd = here->BSIM3v32cdsb;
|
||||
Cdd = -(here->BSIM3v32cgsb + here->BSIM3v32cdsb
|
||||
+ here->BSIM3v32cbsb);
|
||||
dsxpart_dVd = (Csd - sxpart * (Csd + Cdd)) / qcheq;
|
||||
Csd = here->BSIM3v32cdsb;
|
||||
Cdd = -(here->BSIM3v32cgsb + here->BSIM3v32cdsb
|
||||
+ here->BSIM3v32cbsb);
|
||||
dsxpart_dVd = (Csd - sxpart * (Csd + Cdd)) / qcheq;
|
||||
|
||||
dsxpart_dVb = -(dsxpart_dVd + dsxpart_dVg
|
||||
+ dsxpart_dVs);
|
||||
}
|
||||
dxpart = 1.0 - sxpart;
|
||||
ddxpart_dVd = -dsxpart_dVd;
|
||||
ddxpart_dVg = -dsxpart_dVg;
|
||||
ddxpart_dVs = -dsxpart_dVs;
|
||||
ddxpart_dVb = -(ddxpart_dVd + ddxpart_dVg + ddxpart_dVs);
|
||||
dsxpart_dVb = -(dsxpart_dVd + dsxpart_dVg
|
||||
+ dsxpart_dVs);
|
||||
}
|
||||
dxpart = 1.0 - sxpart;
|
||||
ddxpart_dVd = -dsxpart_dVd;
|
||||
ddxpart_dVg = -dsxpart_dVg;
|
||||
ddxpart_dVs = -dsxpart_dVs;
|
||||
ddxpart_dVb = -(ddxpart_dVd + ddxpart_dVg + ddxpart_dVs);
|
||||
}
|
||||
}
|
||||
|
||||
T1 = *(ckt->CKTstate0 + here->BSIM3v32qdef) * here->BSIM3v32gtau;
|
||||
T1 = *(ckt->CKTstate0 + here->BSIM3v32qdef) * here->BSIM3v32gtau;
|
||||
gdpr = here->BSIM3v32drainConductance;
|
||||
gspr = here->BSIM3v32sourceConductance;
|
||||
gds = here->BSIM3v32gds;
|
||||
|
|
@ -244,9 +244,9 @@ double m;
|
|||
capbd = here->BSIM3v32capbd;
|
||||
capbs = here->BSIM3v32capbs;
|
||||
|
||||
GSoverlapCap = here->BSIM3v32cgso;
|
||||
GDoverlapCap = here->BSIM3v32cgdo;
|
||||
GBoverlapCap = here->pParam->BSIM3v32cgbo;
|
||||
GSoverlapCap = here->BSIM3v32cgso;
|
||||
GDoverlapCap = here->BSIM3v32cgdo;
|
||||
GBoverlapCap = here->pParam->BSIM3v32cgbo;
|
||||
|
||||
xcdgb = (cdgb - GDoverlapCap) * omega;
|
||||
xcddb = (cddb + capbd + GDoverlapCap) * omega;
|
||||
|
|
@ -255,106 +255,106 @@ double m;
|
|||
xcsdb = -(cgdb + cbdb + cddb) * omega;
|
||||
xcssb = (capbs + GSoverlapCap - (cgsb + cbsb + cdsb)) * omega;
|
||||
xcggb = (cggb + GDoverlapCap + GSoverlapCap + GBoverlapCap)
|
||||
* omega;
|
||||
* omega;
|
||||
xcgdb = (cgdb - GDoverlapCap ) * omega;
|
||||
xcgsb = (cgsb - GSoverlapCap) * omega;
|
||||
xcbgb = (cbgb - GBoverlapCap) * omega;
|
||||
xcbdb = (cbdb - capbd ) * omega;
|
||||
xcbsb = (cbsb - capbs ) * omega;
|
||||
|
||||
m = here->BSIM3v32m;
|
||||
m = here->BSIM3v32m;
|
||||
|
||||
*(here->BSIM3v32GgPtr + 1) += m * xcggb;
|
||||
*(here->BSIM3v32BbPtr + 1) -=
|
||||
m * (xcbgb + xcbdb + xcbsb);
|
||||
*(here->BSIM3v32DPdpPtr + 1) += m * xcddb;
|
||||
*(here->BSIM3v32SPspPtr + 1) += m * xcssb;
|
||||
*(here->BSIM3v32GbPtr + 1) -=
|
||||
m * (xcggb + xcgdb + xcgsb);
|
||||
*(here->BSIM3v32GdpPtr + 1) += m * xcgdb;
|
||||
*(here->BSIM3v32GspPtr + 1) += m * xcgsb;
|
||||
*(here->BSIM3v32BgPtr + 1) += m * xcbgb;
|
||||
*(here->BSIM3v32BdpPtr + 1) += m * xcbdb;
|
||||
*(here->BSIM3v32BspPtr + 1) += m * xcbsb;
|
||||
*(here->BSIM3v32DPgPtr + 1) += m * xcdgb;
|
||||
*(here->BSIM3v32DPbPtr + 1) -=
|
||||
m * (xcdgb + xcddb + xcdsb);
|
||||
*(here->BSIM3v32DPspPtr + 1) += m * xcdsb;
|
||||
*(here->BSIM3v32SPgPtr + 1) += m * xcsgb;
|
||||
*(here->BSIM3v32SPbPtr + 1) -=
|
||||
m * (xcsgb + xcsdb + xcssb);
|
||||
*(here->BSIM3v32SPdpPtr + 1) += m * xcsdb;
|
||||
*(here->BSIM3v32GgPtr + 1) += m * xcggb;
|
||||
*(here->BSIM3v32BbPtr + 1) -=
|
||||
m * (xcbgb + xcbdb + xcbsb);
|
||||
*(here->BSIM3v32DPdpPtr + 1) += m * xcddb;
|
||||
*(here->BSIM3v32SPspPtr + 1) += m * xcssb;
|
||||
*(here->BSIM3v32GbPtr + 1) -=
|
||||
m * (xcggb + xcgdb + xcgsb);
|
||||
*(here->BSIM3v32GdpPtr + 1) += m * xcgdb;
|
||||
*(here->BSIM3v32GspPtr + 1) += m * xcgsb;
|
||||
*(here->BSIM3v32BgPtr + 1) += m * xcbgb;
|
||||
*(here->BSIM3v32BdpPtr + 1) += m * xcbdb;
|
||||
*(here->BSIM3v32BspPtr + 1) += m * xcbsb;
|
||||
*(here->BSIM3v32DPgPtr + 1) += m * xcdgb;
|
||||
*(here->BSIM3v32DPbPtr + 1) -=
|
||||
m * (xcdgb + xcddb + xcdsb);
|
||||
*(here->BSIM3v32DPspPtr + 1) += m * xcdsb;
|
||||
*(here->BSIM3v32SPgPtr + 1) += m * xcsgb;
|
||||
*(here->BSIM3v32SPbPtr + 1) -=
|
||||
m * (xcsgb + xcsdb + xcssb);
|
||||
*(here->BSIM3v32SPdpPtr + 1) += m * xcsdb;
|
||||
|
||||
*(here->BSIM3v32DdPtr) += m * gdpr;
|
||||
*(here->BSIM3v32SsPtr) += m * gspr;
|
||||
*(here->BSIM3v32BbPtr) +=
|
||||
m * (gbd + gbs - here->BSIM3v32gbbs);
|
||||
*(here->BSIM3v32DPdpPtr) +=
|
||||
m * (gdpr + gds + gbd + RevSum +
|
||||
dxpart * xgtd + T1 * ddxpart_dVd +
|
||||
gbdpdp);
|
||||
*(here->BSIM3v32SPspPtr) +=
|
||||
m * (gspr + gds + gbs + FwdSum +
|
||||
sxpart * xgts + T1 * dsxpart_dVs +
|
||||
gbspsp);
|
||||
*(here->BSIM3v32DdPtr) += m * gdpr;
|
||||
*(here->BSIM3v32SsPtr) += m * gspr;
|
||||
*(here->BSIM3v32BbPtr) +=
|
||||
m * (gbd + gbs - here->BSIM3v32gbbs);
|
||||
*(here->BSIM3v32DPdpPtr) +=
|
||||
m * (gdpr + gds + gbd + RevSum +
|
||||
dxpart * xgtd + T1 * ddxpart_dVd +
|
||||
gbdpdp);
|
||||
*(here->BSIM3v32SPspPtr) +=
|
||||
m * (gspr + gds + gbs + FwdSum +
|
||||
sxpart * xgts + T1 * dsxpart_dVs +
|
||||
gbspsp);
|
||||
|
||||
*(here->BSIM3v32DdpPtr) -= m * gdpr;
|
||||
*(here->BSIM3v32SspPtr) -= m * gspr;
|
||||
*(here->BSIM3v32DdpPtr) -= m * gdpr;
|
||||
*(here->BSIM3v32SspPtr) -= m * gspr;
|
||||
|
||||
*(here->BSIM3v32BgPtr) -= m * here->BSIM3v32gbgs;
|
||||
*(here->BSIM3v32BdpPtr) -= m * (gbd - gbbdp);
|
||||
*(here->BSIM3v32BspPtr) -= m * (gbs - gbbsp);
|
||||
*(here->BSIM3v32BgPtr) -= m * here->BSIM3v32gbgs;
|
||||
*(here->BSIM3v32BdpPtr) -= m * (gbd - gbbdp);
|
||||
*(here->BSIM3v32BspPtr) -= m * (gbs - gbbsp);
|
||||
|
||||
*(here->BSIM3v32DPdPtr) -= m * gdpr;
|
||||
*(here->BSIM3v32DPgPtr) +=
|
||||
m * (Gm + dxpart * xgtg + T1 * ddxpart_dVg +
|
||||
gbdpg);
|
||||
*(here->BSIM3v32DPbPtr) -=
|
||||
m * (gbd - Gmbs - dxpart * xgtb -
|
||||
T1 * ddxpart_dVb - gbdpb);
|
||||
*(here->BSIM3v32DPspPtr) -=
|
||||
m * (gds + FwdSum - dxpart * xgts -
|
||||
T1 * ddxpart_dVs - gbdpsp);
|
||||
*(here->BSIM3v32DPdPtr) -= m * gdpr;
|
||||
*(here->BSIM3v32DPgPtr) +=
|
||||
m * (Gm + dxpart * xgtg + T1 * ddxpart_dVg +
|
||||
gbdpg);
|
||||
*(here->BSIM3v32DPbPtr) -=
|
||||
m * (gbd - Gmbs - dxpart * xgtb -
|
||||
T1 * ddxpart_dVb - gbdpb);
|
||||
*(here->BSIM3v32DPspPtr) -=
|
||||
m * (gds + FwdSum - dxpart * xgts -
|
||||
T1 * ddxpart_dVs - gbdpsp);
|
||||
|
||||
*(here->BSIM3v32SPgPtr) -=
|
||||
m * (Gm - sxpart * xgtg - T1 * dsxpart_dVg -
|
||||
gbspg);
|
||||
*(here->BSIM3v32SPsPtr) -= m * gspr;
|
||||
*(here->BSIM3v32SPbPtr) -=
|
||||
m * (gbs + Gmbs - sxpart * xgtb -
|
||||
T1 * dsxpart_dVb - gbspb);
|
||||
*(here->BSIM3v32SPdpPtr) -=
|
||||
m * (gds + RevSum - sxpart * xgtd -
|
||||
T1 * dsxpart_dVd - gbspdp);
|
||||
*(here->BSIM3v32SPgPtr) -=
|
||||
m * (Gm - sxpart * xgtg - T1 * dsxpart_dVg -
|
||||
gbspg);
|
||||
*(here->BSIM3v32SPsPtr) -= m * gspr;
|
||||
*(here->BSIM3v32SPbPtr) -=
|
||||
m * (gbs + Gmbs - sxpart * xgtb -
|
||||
T1 * dsxpart_dVb - gbspb);
|
||||
*(here->BSIM3v32SPdpPtr) -=
|
||||
m * (gds + RevSum - sxpart * xgtd -
|
||||
T1 * dsxpart_dVd - gbspdp);
|
||||
|
||||
*(here->BSIM3v32GgPtr) -= m * xgtg;
|
||||
*(here->BSIM3v32GbPtr) -= m * xgtb;
|
||||
*(here->BSIM3v32GdpPtr) -= m * xgtd;
|
||||
*(here->BSIM3v32GspPtr) -= m * xgts;
|
||||
*(here->BSIM3v32GgPtr) -= m * xgtg;
|
||||
*(here->BSIM3v32GbPtr) -= m * xgtb;
|
||||
*(here->BSIM3v32GdpPtr) -= m * xgtd;
|
||||
*(here->BSIM3v32GspPtr) -= m * xgts;
|
||||
|
||||
if (here->BSIM3v32nqsMod)
|
||||
{
|
||||
*(here->BSIM3v32QqPtr + 1) +=
|
||||
m * omega * ScalingFactor;
|
||||
*(here->BSIM3v32QgPtr + 1) -= m * xcqgb;
|
||||
*(here->BSIM3v32QdpPtr + 1) -= m * xcqdb;
|
||||
*(here->BSIM3v32QspPtr + 1) -= m * xcqsb;
|
||||
*(here->BSIM3v32QbPtr + 1) -= m * xcqbb;
|
||||
if (here->BSIM3v32nqsMod)
|
||||
{
|
||||
*(here->BSIM3v32QqPtr + 1) +=
|
||||
m * omega * ScalingFactor;
|
||||
*(here->BSIM3v32QgPtr + 1) -= m * xcqgb;
|
||||
*(here->BSIM3v32QdpPtr + 1) -= m * xcqdb;
|
||||
*(here->BSIM3v32QspPtr + 1) -= m * xcqsb;
|
||||
*(here->BSIM3v32QbPtr + 1) -= m * xcqbb;
|
||||
|
||||
*(here->BSIM3v32QqPtr) += m * here->BSIM3v32gtau;
|
||||
*(here->BSIM3v32QqPtr) += m * here->BSIM3v32gtau;
|
||||
|
||||
*(here->BSIM3v32DPqPtr) +=
|
||||
m * (dxpart * here->BSIM3v32gtau);
|
||||
*(here->BSIM3v32SPqPtr) +=
|
||||
m * (sxpart * here->BSIM3v32gtau);
|
||||
*(here->BSIM3v32GqPtr) -= m * here->BSIM3v32gtau;
|
||||
*(here->BSIM3v32DPqPtr) +=
|
||||
m * (dxpart * here->BSIM3v32gtau);
|
||||
*(here->BSIM3v32SPqPtr) +=
|
||||
m * (sxpart * here->BSIM3v32gtau);
|
||||
*(here->BSIM3v32GqPtr) -= m * here->BSIM3v32gtau;
|
||||
|
||||
*(here->BSIM3v32QgPtr) += m * xgtg;
|
||||
*(here->BSIM3v32QdpPtr) += m * xgtd;
|
||||
*(here->BSIM3v32QspPtr) += m * xgts;
|
||||
*(here->BSIM3v32QbPtr) += m * xgtb;
|
||||
}
|
||||
}
|
||||
*(here->BSIM3v32QgPtr) += m * xgtg;
|
||||
*(here->BSIM3v32QdpPtr) += m * xgtd;
|
||||
*(here->BSIM3v32QspPtr) += m * xgts;
|
||||
*(here->BSIM3v32QbPtr) += m * xgtb;
|
||||
}
|
||||
}
|
||||
}
|
||||
return(OK);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -19,7 +19,7 @@
|
|||
|
||||
int
|
||||
BSIM3v32ask (CKTcircuit *ckt, GENinstance *inst, int which, IFvalue *value,
|
||||
IFvalue *select)
|
||||
IFvalue *select)
|
||||
{
|
||||
BSIM3v32instance *here = (BSIM3v32instance*)inst;
|
||||
|
||||
|
|
@ -32,9 +32,9 @@ BSIM3v32instance *here = (BSIM3v32instance*)inst;
|
|||
case BSIM3v32_W:
|
||||
value->rValue = here->BSIM3v32w;
|
||||
return(OK);
|
||||
case BSIM3v32_M:
|
||||
value->rValue = here->BSIM3v32m;
|
||||
return (OK);
|
||||
case BSIM3v32_M:
|
||||
value->rValue = here->BSIM3v32m;
|
||||
return (OK);
|
||||
case BSIM3v32_AS:
|
||||
value->rValue = here->BSIM3v32sourceArea;
|
||||
return(OK);
|
||||
|
|
@ -59,6 +59,9 @@ BSIM3v32instance *here = (BSIM3v32instance*)inst;
|
|||
case BSIM3v32_NQSMOD:
|
||||
value->iValue = here->BSIM3v32nqsMod;
|
||||
return(OK);
|
||||
case BSIM3v32_GEO:
|
||||
value->iValue = here->BSIM3v32geo;
|
||||
return(OK);
|
||||
case BSIM3v32_DELVTO:
|
||||
value->rValue = here->BSIM3v32delvto;
|
||||
return(OK);
|
||||
|
|
@ -94,11 +97,11 @@ BSIM3v32instance *here = (BSIM3v32instance*)inst;
|
|||
return(OK);
|
||||
case BSIM3v32_SOURCECONDUCT:
|
||||
value->rValue = here->BSIM3v32sourceConductance;
|
||||
value->rValue *= here->BSIM3v32m;
|
||||
value->rValue *= here->BSIM3v32m;
|
||||
return(OK);
|
||||
case BSIM3v32_DRAINCONDUCT:
|
||||
value->rValue = here->BSIM3v32drainConductance;
|
||||
value->rValue *= here->BSIM3v32m;
|
||||
value->rValue *= here->BSIM3v32m;
|
||||
return(OK);
|
||||
case BSIM3v32_VBD:
|
||||
value->rValue = *(ckt->CKTstate0 + here->BSIM3v32vbd);
|
||||
|
|
@ -114,103 +117,103 @@ BSIM3v32instance *here = (BSIM3v32instance*)inst;
|
|||
return(OK);
|
||||
case BSIM3v32_CD:
|
||||
value->rValue = here->BSIM3v32cd;
|
||||
value->rValue *= here->BSIM3v32m;
|
||||
value->rValue *= here->BSIM3v32m;
|
||||
return(OK);
|
||||
case BSIM3v32_CBS:
|
||||
value->rValue = here->BSIM3v32cbs;
|
||||
value->rValue *= here->BSIM3v32m;
|
||||
value->rValue *= here->BSIM3v32m;
|
||||
return(OK);
|
||||
case BSIM3v32_CBD:
|
||||
value->rValue = here->BSIM3v32cbd;
|
||||
value->rValue *= here->BSIM3v32m;
|
||||
value->rValue *= here->BSIM3v32m;
|
||||
return(OK);
|
||||
case BSIM3v32_GM:
|
||||
value->rValue = here->BSIM3v32gm;
|
||||
value->rValue *= here->BSIM3v32m;
|
||||
value->rValue *= here->BSIM3v32m;
|
||||
return(OK);
|
||||
case BSIM3v32_GDS:
|
||||
value->rValue = here->BSIM3v32gds;
|
||||
value->rValue *= here->BSIM3v32m;
|
||||
value->rValue *= here->BSIM3v32m;
|
||||
return(OK);
|
||||
case BSIM3v32_GMBS:
|
||||
value->rValue = here->BSIM3v32gmbs;
|
||||
value->rValue *= here->BSIM3v32m;
|
||||
value->rValue *= here->BSIM3v32m;
|
||||
return(OK);
|
||||
case BSIM3v32_GBD:
|
||||
value->rValue = here->BSIM3v32gbd;
|
||||
value->rValue *= here->BSIM3v32m;
|
||||
value->rValue *= here->BSIM3v32m;
|
||||
return(OK);
|
||||
case BSIM3v32_GBS:
|
||||
value->rValue = here->BSIM3v32gbs;
|
||||
value->rValue *= here->BSIM3v32m;
|
||||
value->rValue *= here->BSIM3v32m;
|
||||
return(OK);
|
||||
case BSIM3v32_QB:
|
||||
value->rValue = *(ckt->CKTstate0 + here->BSIM3v32qb);
|
||||
value->rValue *= here->BSIM3v32m;
|
||||
value->rValue *= here->BSIM3v32m;
|
||||
return(OK);
|
||||
case BSIM3v32_CQB:
|
||||
value->rValue = *(ckt->CKTstate0 + here->BSIM3v32cqb);
|
||||
value->rValue *= here->BSIM3v32m;
|
||||
value->rValue *= here->BSIM3v32m;
|
||||
return(OK);
|
||||
case BSIM3v32_QG:
|
||||
value->rValue = *(ckt->CKTstate0 + here->BSIM3v32qg);
|
||||
value->rValue *= here->BSIM3v32m;
|
||||
value->rValue *= here->BSIM3v32m;
|
||||
return(OK);
|
||||
case BSIM3v32_CQG:
|
||||
value->rValue = *(ckt->CKTstate0 + here->BSIM3v32cqg);
|
||||
value->rValue *= here->BSIM3v32m;
|
||||
value->rValue *= here->BSIM3v32m;
|
||||
return(OK);
|
||||
case BSIM3v32_QD:
|
||||
value->rValue = *(ckt->CKTstate0 + here->BSIM3v32qd);
|
||||
value->rValue *= here->BSIM3v32m;
|
||||
value->rValue *= here->BSIM3v32m;
|
||||
return(OK);
|
||||
case BSIM3v32_CQD:
|
||||
value->rValue = *(ckt->CKTstate0 + here->BSIM3v32cqd);
|
||||
value->rValue *= here->BSIM3v32m;
|
||||
value->rValue *= here->BSIM3v32m;
|
||||
return(OK);
|
||||
case BSIM3v32_CGG:
|
||||
value->rValue = here->BSIM3v32cggb;
|
||||
value->rValue *= here->BSIM3v32m;
|
||||
value->rValue *= here->BSIM3v32m;
|
||||
return(OK);
|
||||
case BSIM3v32_CGD:
|
||||
value->rValue = here->BSIM3v32cgdb;
|
||||
value->rValue *= here->BSIM3v32m;
|
||||
value->rValue *= here->BSIM3v32m;
|
||||
return(OK);
|
||||
case BSIM3v32_CGS:
|
||||
value->rValue = here->BSIM3v32cgsb;
|
||||
value->rValue *= here->BSIM3v32m;
|
||||
value->rValue *= here->BSIM3v32m;
|
||||
return(OK);
|
||||
case BSIM3v32_CDG:
|
||||
value->rValue = here->BSIM3v32cdgb;
|
||||
value->rValue *= here->BSIM3v32m;
|
||||
value->rValue *= here->BSIM3v32m;
|
||||
return(OK);
|
||||
case BSIM3v32_CDD:
|
||||
value->rValue = here->BSIM3v32cddb;
|
||||
value->rValue *= here->BSIM3v32m;
|
||||
value->rValue *= here->BSIM3v32m;
|
||||
return(OK);
|
||||
case BSIM3v32_CDS:
|
||||
value->rValue = here->BSIM3v32cdsb;
|
||||
value->rValue *= here->BSIM3v32m;
|
||||
value->rValue *= here->BSIM3v32m;
|
||||
return(OK);
|
||||
case BSIM3v32_CBG:
|
||||
value->rValue = here->BSIM3v32cbgb;
|
||||
value->rValue *= here->BSIM3v32m;
|
||||
value->rValue *= here->BSIM3v32m;
|
||||
return(OK);
|
||||
case BSIM3v32_CBDB:
|
||||
value->rValue = here->BSIM3v32cbdb;
|
||||
value->rValue *= here->BSIM3v32m;
|
||||
value->rValue *= here->BSIM3v32m;
|
||||
return(OK);
|
||||
case BSIM3v32_CBSB:
|
||||
value->rValue = here->BSIM3v32cbsb;
|
||||
value->rValue *= here->BSIM3v32m;
|
||||
value->rValue *= here->BSIM3v32m;
|
||||
return(OK);
|
||||
case BSIM3v32_CAPBD:
|
||||
value->rValue = here->BSIM3v32capbd;
|
||||
value->rValue *= here->BSIM3v32m;
|
||||
value->rValue *= here->BSIM3v32m;
|
||||
return(OK);
|
||||
case BSIM3v32_CAPBS:
|
||||
value->rValue = here->BSIM3v32capbs;
|
||||
value->rValue *= here->BSIM3v32m;
|
||||
value->rValue *= here->BSIM3v32m;
|
||||
return(OK);
|
||||
case BSIM3v32_VON:
|
||||
value->rValue = here->BSIM3v32von;
|
||||
|
|
@ -220,11 +223,11 @@ BSIM3v32instance *here = (BSIM3v32instance*)inst;
|
|||
return(OK);
|
||||
case BSIM3v32_QBS:
|
||||
value->rValue = *(ckt->CKTstate0 + here->BSIM3v32qbs);
|
||||
value->rValue *= here->BSIM3v32m;
|
||||
value->rValue *= here->BSIM3v32m;
|
||||
return(OK);
|
||||
case BSIM3v32_QBD:
|
||||
value->rValue = *(ckt->CKTstate0 + here->BSIM3v32qbd);
|
||||
value->rValue *= here->BSIM3v32m;
|
||||
value->rValue *= here->BSIM3v32m;
|
||||
return(OK);
|
||||
default:
|
||||
return(E_BADPARM);
|
||||
|
|
|
|||
|
|
@ -28,419 +28,425 @@ FILE *fplog;
|
|||
|
||||
NG_IGNORE(ckt);
|
||||
|
||||
if ((fplog = fopen("b3v3check.log", "w")) != NULL)
|
||||
if ((fplog = fopen("b3v32check.log", "w")) != NULL)
|
||||
{ pParam = here->pParam;
|
||||
|
||||
fprintf (fplog,
|
||||
"BSIM3 Model (Supports: v3.2, v3.2.2, v3.2.3, v3.2.4)\n");
|
||||
fprintf (fplog, "Parameter Checking.\n");
|
||||
fprintf (fplog, "Model = %s\n", model->BSIM3v32modName);
|
||||
fprintf (fplog, "W = %g, L = %g, M = %g\n", here->BSIM3v32w,
|
||||
here->BSIM3v32l, here->BSIM3v32m);
|
||||
fprintf (fplog,
|
||||
"BSIM3 Model (Supports: v3.2, v3.2.2, v3.2.3, v3.2.4)\n");
|
||||
fprintf (fplog, "Parameter Checking.\n");
|
||||
fprintf (fplog, "Model = %s\n", model->BSIM3v32modName);
|
||||
fprintf (fplog, "W = %g, L = %g, M = %g\n", here->BSIM3v32w,
|
||||
here->BSIM3v32l, here->BSIM3v32m);
|
||||
|
||||
if ((strcmp(model->BSIM3v32version, "3.2.4")) && (strcmp(model->BSIM3v32version, "3.24"))
|
||||
&& (strcmp(model->BSIM3v32version, "3.2.3")) && (strcmp(model->BSIM3v32version, "3.23"))
|
||||
&& (strcmp(model->BSIM3v32version, "3.2.2")) && (strcmp(model->BSIM3v32version, "3.22"))
|
||||
&& (strcmp(model->BSIM3v32version, "3.2")) && (strcmp(model->BSIM3v32version, "3.20")))
|
||||
{
|
||||
fprintf (fplog,
|
||||
"Warning: This model supports BSIM3v3.2, BSIM3v3.2.2, BSIM3v3.2.3, BSIM3v3.2.4\n");
|
||||
fprintf (fplog,
|
||||
"You specified a wrong version number. Working now with BSIM3v3.2.4.\n");
|
||||
printf ("Warning: This model supports BSIM3v3.2, BSIM3v3.2.2, BSIM3v3.2.3, BSIM3v3.2.4\n");
|
||||
printf ("You specified a wrong version number. Working now with BSIM3v3.2.4.\n");
|
||||
}
|
||||
if ((strcmp(model->BSIM3v32version, "3.2.4")) && (strcmp(model->BSIM3v32version, "3.24"))
|
||||
&& (strcmp(model->BSIM3v32version, "3.2.3")) && (strcmp(model->BSIM3v32version, "3.23"))
|
||||
&& (strcmp(model->BSIM3v32version, "3.2.2")) && (strcmp(model->BSIM3v32version, "3.22"))
|
||||
&& (strcmp(model->BSIM3v32version, "3.2")) && (strcmp(model->BSIM3v32version, "3.20")))
|
||||
{
|
||||
fprintf (fplog,
|
||||
"Warning: This model supports BSIM3v3.2, BSIM3v3.2.2, BSIM3v3.2.3, BSIM3v3.2.4\n");
|
||||
fprintf (fplog,
|
||||
"You specified a wrong version number. Working now with BSIM3v3.2.4.\n");
|
||||
printf ("Warning: This model supports BSIM3v3.2, BSIM3v3.2.2, BSIM3v3.2.3, BSIM3v3.2.4\n");
|
||||
printf ("You specified a wrong version number. Working now with BSIM3v3.2.4.\n");
|
||||
}
|
||||
|
||||
if (pParam->BSIM3v32nlx < -pParam->BSIM3v32leff)
|
||||
{ fprintf(fplog, "Fatal: Nlx = %g is less than -Leff.\n",
|
||||
pParam->BSIM3v32nlx);
|
||||
printf("Fatal: Nlx = %g is less than -Leff.\n",
|
||||
pParam->BSIM3v32nlx);
|
||||
Fatal_Flag = 1;
|
||||
}
|
||||
if (pParam->BSIM3v32nlx < -pParam->BSIM3v32leff)
|
||||
{ fprintf(fplog, "Fatal: Nlx = %g is less than -Leff.\n",
|
||||
pParam->BSIM3v32nlx);
|
||||
printf("Fatal: Nlx = %g is less than -Leff.\n",
|
||||
pParam->BSIM3v32nlx);
|
||||
Fatal_Flag = 1;
|
||||
}
|
||||
|
||||
if (model->BSIM3v32tox <= 0.0)
|
||||
{ fprintf(fplog, "Fatal: Tox = %g is not positive.\n",
|
||||
model->BSIM3v32tox);
|
||||
printf("Fatal: Tox = %g is not positive.\n", model->BSIM3v32tox);
|
||||
Fatal_Flag = 1;
|
||||
}
|
||||
if (model->BSIM3v32tox <= 0.0)
|
||||
{ fprintf(fplog, "Fatal: Tox = %g is not positive.\n",
|
||||
model->BSIM3v32tox);
|
||||
printf("Fatal: Tox = %g is not positive.\n", model->BSIM3v32tox);
|
||||
Fatal_Flag = 1;
|
||||
}
|
||||
|
||||
if (model->BSIM3v32toxm <= 0.0)
|
||||
{ fprintf(fplog, "Fatal: Toxm = %g is not positive.\n",
|
||||
model->BSIM3v32toxm);
|
||||
printf("Fatal: Toxm = %g is not positive.\n", model->BSIM3v32toxm);
|
||||
Fatal_Flag = 1;
|
||||
}
|
||||
if (model->BSIM3v32toxm <= 0.0)
|
||||
{ fprintf(fplog, "Fatal: Toxm = %g is not positive.\n",
|
||||
model->BSIM3v32toxm);
|
||||
printf("Fatal: Toxm = %g is not positive.\n", model->BSIM3v32toxm);
|
||||
Fatal_Flag = 1;
|
||||
}
|
||||
|
||||
if (pParam->BSIM3v32npeak <= 0.0)
|
||||
{ fprintf(fplog, "Fatal: Nch = %g is not positive.\n",
|
||||
pParam->BSIM3v32npeak);
|
||||
printf("Fatal: Nch = %g is not positive.\n",
|
||||
pParam->BSIM3v32npeak);
|
||||
Fatal_Flag = 1;
|
||||
}
|
||||
if (pParam->BSIM3v32nsub <= 0.0)
|
||||
{ fprintf(fplog, "Fatal: Nsub = %g is not positive.\n",
|
||||
pParam->BSIM3v32nsub);
|
||||
printf("Fatal: Nsub = %g is not positive.\n",
|
||||
pParam->BSIM3v32nsub);
|
||||
Fatal_Flag = 1;
|
||||
}
|
||||
if (pParam->BSIM3v32ngate < 0.0)
|
||||
{ fprintf(fplog, "Fatal: Ngate = %g is not positive.\n",
|
||||
pParam->BSIM3v32ngate);
|
||||
printf("Fatal: Ngate = %g Ngate is not positive.\n",
|
||||
pParam->BSIM3v32ngate);
|
||||
Fatal_Flag = 1;
|
||||
}
|
||||
if (pParam->BSIM3v32ngate > 1.e25)
|
||||
{ fprintf(fplog, "Fatal: Ngate = %g is too high.\n",
|
||||
pParam->BSIM3v32ngate);
|
||||
printf("Fatal: Ngate = %g Ngate is too high\n",
|
||||
pParam->BSIM3v32ngate);
|
||||
Fatal_Flag = 1;
|
||||
}
|
||||
if (pParam->BSIM3v32xj <= 0.0)
|
||||
{ fprintf(fplog, "Fatal: Xj = %g is not positive.\n",
|
||||
pParam->BSIM3v32xj);
|
||||
printf("Fatal: Xj = %g is not positive.\n", pParam->BSIM3v32xj);
|
||||
Fatal_Flag = 1;
|
||||
}
|
||||
if (pParam->BSIM3v32npeak <= 0.0)
|
||||
{ fprintf(fplog, "Fatal: Nch = %g is not positive.\n",
|
||||
pParam->BSIM3v32npeak);
|
||||
printf("Fatal: Nch = %g is not positive.\n",
|
||||
pParam->BSIM3v32npeak);
|
||||
Fatal_Flag = 1;
|
||||
}
|
||||
if (pParam->BSIM3v32nsub <= 0.0)
|
||||
{ fprintf(fplog, "Fatal: Nsub = %g is not positive.\n",
|
||||
pParam->BSIM3v32nsub);
|
||||
printf("Fatal: Nsub = %g is not positive.\n",
|
||||
pParam->BSIM3v32nsub);
|
||||
Fatal_Flag = 1;
|
||||
}
|
||||
if (pParam->BSIM3v32ngate < 0.0)
|
||||
{ fprintf(fplog, "Fatal: Ngate = %g is not positive.\n",
|
||||
pParam->BSIM3v32ngate);
|
||||
printf("Fatal: Ngate = %g Ngate is not positive.\n",
|
||||
pParam->BSIM3v32ngate);
|
||||
Fatal_Flag = 1;
|
||||
}
|
||||
if (pParam->BSIM3v32ngate > 1.e25)
|
||||
{ fprintf(fplog, "Fatal: Ngate = %g is too high.\n",
|
||||
pParam->BSIM3v32ngate);
|
||||
printf("Fatal: Ngate = %g Ngate is too high\n",
|
||||
pParam->BSIM3v32ngate);
|
||||
Fatal_Flag = 1;
|
||||
}
|
||||
if (pParam->BSIM3v32xj <= 0.0)
|
||||
{ fprintf(fplog, "Fatal: Xj = %g is not positive.\n",
|
||||
pParam->BSIM3v32xj);
|
||||
printf("Fatal: Xj = %g is not positive.\n", pParam->BSIM3v32xj);
|
||||
Fatal_Flag = 1;
|
||||
}
|
||||
|
||||
if (pParam->BSIM3v32dvt1 < 0.0)
|
||||
{ fprintf(fplog, "Fatal: Dvt1 = %g is negative.\n",
|
||||
pParam->BSIM3v32dvt1);
|
||||
printf("Fatal: Dvt1 = %g is negative.\n", pParam->BSIM3v32dvt1);
|
||||
Fatal_Flag = 1;
|
||||
}
|
||||
if (pParam->BSIM3v32dvt1 < 0.0)
|
||||
{ fprintf(fplog, "Fatal: Dvt1 = %g is negative.\n",
|
||||
pParam->BSIM3v32dvt1);
|
||||
printf("Fatal: Dvt1 = %g is negative.\n", pParam->BSIM3v32dvt1);
|
||||
Fatal_Flag = 1;
|
||||
}
|
||||
|
||||
if (pParam->BSIM3v32dvt1w < 0.0)
|
||||
{ fprintf(fplog, "Fatal: Dvt1w = %g is negative.\n",
|
||||
pParam->BSIM3v32dvt1w);
|
||||
printf("Fatal: Dvt1w = %g is negative.\n", pParam->BSIM3v32dvt1w);
|
||||
Fatal_Flag = 1;
|
||||
}
|
||||
if (pParam->BSIM3v32dvt1w < 0.0)
|
||||
{ fprintf(fplog, "Fatal: Dvt1w = %g is negative.\n",
|
||||
pParam->BSIM3v32dvt1w);
|
||||
printf("Fatal: Dvt1w = %g is negative.\n", pParam->BSIM3v32dvt1w);
|
||||
Fatal_Flag = 1;
|
||||
}
|
||||
|
||||
if (pParam->BSIM3v32w0 == -pParam->BSIM3v32weff)
|
||||
{ fprintf(fplog, "Fatal: (W0 + Weff) = 0 causing divided-by-zero.\n");
|
||||
printf("Fatal: (W0 + Weff) = 0 causing divided-by-zero.\n");
|
||||
Fatal_Flag = 1;
|
||||
}
|
||||
if (pParam->BSIM3v32w0 == -pParam->BSIM3v32weff)
|
||||
{ fprintf(fplog, "Fatal: (W0 + Weff) = 0 causing divided-by-zero.\n");
|
||||
printf("Fatal: (W0 + Weff) = 0 causing divided-by-zero.\n");
|
||||
Fatal_Flag = 1;
|
||||
}
|
||||
|
||||
if (pParam->BSIM3v32dsub < 0.0)
|
||||
{ fprintf(fplog, "Fatal: Dsub = %g is negative.\n", pParam->BSIM3v32dsub);
|
||||
printf("Fatal: Dsub = %g is negative.\n", pParam->BSIM3v32dsub);
|
||||
Fatal_Flag = 1;
|
||||
}
|
||||
if (pParam->BSIM3v32b1 == -pParam->BSIM3v32weff)
|
||||
{ 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->BSIM3v32u0temp <= 0.0)
|
||||
{ fprintf(fplog, "Fatal: u0 at current temperature = %g is not positive.\n", pParam->BSIM3v32u0temp);
|
||||
printf("Fatal: u0 at current temperature = %g is not positive.\n",
|
||||
pParam->BSIM3v32u0temp);
|
||||
Fatal_Flag = 1;
|
||||
}
|
||||
if (pParam->BSIM3v32dsub < 0.0)
|
||||
{ fprintf(fplog, "Fatal: Dsub = %g is negative.\n", pParam->BSIM3v32dsub);
|
||||
printf("Fatal: Dsub = %g is negative.\n", pParam->BSIM3v32dsub);
|
||||
Fatal_Flag = 1;
|
||||
}
|
||||
if (pParam->BSIM3v32b1 == -pParam->BSIM3v32weff)
|
||||
{ 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->BSIM3v32u0temp <= 0.0)
|
||||
{ fprintf(fplog, "Fatal: u0 at current temperature = %g is not positive.\n", pParam->BSIM3v32u0temp);
|
||||
printf("Fatal: u0 at current temperature = %g is not positive.\n",
|
||||
pParam->BSIM3v32u0temp);
|
||||
Fatal_Flag = 1;
|
||||
}
|
||||
|
||||
/* Check delta parameter */
|
||||
if (pParam->BSIM3v32delta < 0.0)
|
||||
{ fprintf(fplog, "Fatal: Delta = %g is less than zero.\n",
|
||||
pParam->BSIM3v32delta);
|
||||
printf("Fatal: Delta = %g is less than zero.\n", pParam->BSIM3v32delta);
|
||||
Fatal_Flag = 1;
|
||||
}
|
||||
if (pParam->BSIM3v32delta < 0.0)
|
||||
{ fprintf(fplog, "Fatal: Delta = %g is less than zero.\n",
|
||||
pParam->BSIM3v32delta);
|
||||
printf("Fatal: Delta = %g is less than zero.\n", pParam->BSIM3v32delta);
|
||||
Fatal_Flag = 1;
|
||||
}
|
||||
|
||||
if (pParam->BSIM3v32vsattemp <= 0.0)
|
||||
{ fprintf(fplog, "Fatal: Vsat at current temperature = %g is not positive.\n", pParam->BSIM3v32vsattemp);
|
||||
printf("Fatal: Vsat at current temperature = %g is not positive.\n",
|
||||
pParam->BSIM3v32vsattemp);
|
||||
Fatal_Flag = 1;
|
||||
}
|
||||
if (pParam->BSIM3v32vsattemp <= 0.0)
|
||||
{ fprintf(fplog, "Fatal: Vsat at current temperature = %g is not positive.\n", pParam->BSIM3v32vsattemp);
|
||||
printf("Fatal: Vsat at current temperature = %g is not positive.\n",
|
||||
pParam->BSIM3v32vsattemp);
|
||||
Fatal_Flag = 1;
|
||||
}
|
||||
/* Check Rout parameters */
|
||||
if (pParam->BSIM3v32pclm <= 0.0)
|
||||
{ fprintf(fplog, "Fatal: Pclm = %g is not positive.\n", pParam->BSIM3v32pclm);
|
||||
printf("Fatal: Pclm = %g is not positive.\n", pParam->BSIM3v32pclm);
|
||||
Fatal_Flag = 1;
|
||||
}
|
||||
if (pParam->BSIM3v32pclm <= 0.0)
|
||||
{ fprintf(fplog, "Fatal: Pclm = %g is not positive.\n", pParam->BSIM3v32pclm);
|
||||
printf("Fatal: Pclm = %g is not positive.\n", pParam->BSIM3v32pclm);
|
||||
Fatal_Flag = 1;
|
||||
}
|
||||
|
||||
if (pParam->BSIM3v32drout < 0.0)
|
||||
{ fprintf(fplog, "Fatal: Drout = %g is negative.\n", pParam->BSIM3v32drout);
|
||||
printf("Fatal: Drout = %g is negative.\n", pParam->BSIM3v32drout);
|
||||
Fatal_Flag = 1;
|
||||
}
|
||||
if (pParam->BSIM3v32drout < 0.0)
|
||||
{ fprintf(fplog, "Fatal: Drout = %g is negative.\n", pParam->BSIM3v32drout);
|
||||
printf("Fatal: Drout = %g is negative.\n", pParam->BSIM3v32drout);
|
||||
Fatal_Flag = 1;
|
||||
}
|
||||
|
||||
if (pParam->BSIM3v32pscbe2 <= 0.0)
|
||||
{ fprintf(fplog, "Warning: Pscbe2 = %g is not positive.\n",
|
||||
pParam->BSIM3v32pscbe2);
|
||||
printf("Warning: Pscbe2 = %g is not positive.\n", pParam->BSIM3v32pscbe2);
|
||||
}
|
||||
if (pParam->BSIM3v32pscbe2 <= 0.0)
|
||||
{ fprintf(fplog, "Warning: Pscbe2 = %g is not positive.\n",
|
||||
pParam->BSIM3v32pscbe2);
|
||||
printf("Warning: Pscbe2 = %g is not positive.\n", pParam->BSIM3v32pscbe2);
|
||||
}
|
||||
|
||||
/* acm model */
|
||||
if (model->BSIM3v32acmMod == 0) {
|
||||
if (model->BSIM3v32unitLengthSidewallJctCap > 0.0 ||
|
||||
model->BSIM3v32unitLengthGateSidewallJctCap > 0.0)
|
||||
{
|
||||
if (here->BSIM3v32drainPerimeter < pParam->BSIM3v32weff)
|
||||
{ fprintf(fplog, "Warning: Pd = %g is less than W.\n",
|
||||
here->BSIM3v32drainPerimeter);
|
||||
printf("Warning: Pd = %g is less than W.\n",
|
||||
here->BSIM3v32drainPerimeter);
|
||||
}
|
||||
if (here->BSIM3v32sourcePerimeter < pParam->BSIM3v32weff)
|
||||
{ fprintf(fplog, "Warning: Ps = %g is less than W.\n",
|
||||
here->BSIM3v32sourcePerimeter);
|
||||
printf("Warning: Ps = %g is less than W.\n",
|
||||
here->BSIM3v32sourcePerimeter);
|
||||
}
|
||||
}
|
||||
}
|
||||
/* ACM model */
|
||||
if (model->BSIM3v32acmMod == 0) {
|
||||
if (model->BSIM3v32unitLengthSidewallJctCap > 0.0 ||
|
||||
model->BSIM3v32unitLengthGateSidewallJctCap > 0.0)
|
||||
{
|
||||
if (here->BSIM3v32drainPerimeter < pParam->BSIM3v32weff)
|
||||
{ fprintf(fplog, "Warning: Pd = %g is less than W.\n",
|
||||
here->BSIM3v32drainPerimeter);
|
||||
printf("Warning: Pd = %g is less than W.\n",
|
||||
here->BSIM3v32drainPerimeter);
|
||||
}
|
||||
if (here->BSIM3v32sourcePerimeter < pParam->BSIM3v32weff)
|
||||
{ fprintf(fplog, "Warning: Ps = %g is less than W.\n",
|
||||
here->BSIM3v32sourcePerimeter);
|
||||
printf("Warning: Ps = %g is less than W.\n",
|
||||
here->BSIM3v32sourcePerimeter);
|
||||
}
|
||||
}
|
||||
}
|
||||
if ((model->BSIM3v32calcacm > 0) && (model->BSIM3v32acmMod != 12))
|
||||
{ fprintf(fplog, "Warning: CALCACM = %d is wrong. Set back to 0.\n",
|
||||
model->BSIM3v32calcacm);
|
||||
printf("Warning: CALCACM = %d is wrong. Set back to 0.\n", model->BSIM3v32calcacm);
|
||||
model->BSIM3v32calcacm = 0;
|
||||
}
|
||||
|
||||
if (pParam->BSIM3v32noff < 0.1)
|
||||
{ fprintf(fplog, "Warning: Noff = %g is too small.\n",
|
||||
pParam->BSIM3v32noff);
|
||||
printf("Warning: Noff = %g is too small.\n", pParam->BSIM3v32noff);
|
||||
}
|
||||
if (pParam->BSIM3v32noff > 4.0)
|
||||
{ fprintf(fplog, "Warning: Noff = %g is too large.\n",
|
||||
pParam->BSIM3v32noff);
|
||||
printf("Warning: Noff = %g is too large.\n", pParam->BSIM3v32noff);
|
||||
}
|
||||
if (pParam->BSIM3v32noff < 0.1)
|
||||
{ fprintf(fplog, "Warning: Noff = %g is too small.\n",
|
||||
pParam->BSIM3v32noff);
|
||||
printf("Warning: Noff = %g is too small.\n", pParam->BSIM3v32noff);
|
||||
}
|
||||
if (pParam->BSIM3v32noff > 4.0)
|
||||
{ fprintf(fplog, "Warning: Noff = %g is too large.\n",
|
||||
pParam->BSIM3v32noff);
|
||||
printf("Warning: Noff = %g is too large.\n", pParam->BSIM3v32noff);
|
||||
}
|
||||
|
||||
if (pParam->BSIM3v32voffcv < -0.5)
|
||||
{ fprintf(fplog, "Warning: Voffcv = %g is too small.\n",
|
||||
pParam->BSIM3v32voffcv);
|
||||
printf("Warning: Voffcv = %g is too small.\n", pParam->BSIM3v32voffcv);
|
||||
}
|
||||
if (pParam->BSIM3v32voffcv > 0.5)
|
||||
{ fprintf(fplog, "Warning: Voffcv = %g is too large.\n",
|
||||
pParam->BSIM3v32voffcv);
|
||||
printf("Warning: Voffcv = %g is too large.\n", pParam->BSIM3v32voffcv);
|
||||
}
|
||||
if (pParam->BSIM3v32voffcv < -0.5)
|
||||
{ fprintf(fplog, "Warning: Voffcv = %g is too small.\n",
|
||||
pParam->BSIM3v32voffcv);
|
||||
printf("Warning: Voffcv = %g is too small.\n", pParam->BSIM3v32voffcv);
|
||||
}
|
||||
if (pParam->BSIM3v32voffcv > 0.5)
|
||||
{ fprintf(fplog, "Warning: Voffcv = %g is too large.\n",
|
||||
pParam->BSIM3v32voffcv);
|
||||
printf("Warning: Voffcv = %g is too large.\n", pParam->BSIM3v32voffcv);
|
||||
}
|
||||
|
||||
if (model->BSIM3v32ijth < 0.0)
|
||||
{ fprintf(fplog, "Fatal: Ijth = %g cannot be negative.\n",
|
||||
model->BSIM3v32ijth);
|
||||
printf("Fatal: Ijth = %g cannot be negative.\n", model->BSIM3v32ijth);
|
||||
Fatal_Flag = 1;
|
||||
}
|
||||
if (model->BSIM3v32ijth < 0.0)
|
||||
{ fprintf(fplog, "Fatal: Ijth = %g cannot be negative.\n",
|
||||
model->BSIM3v32ijth);
|
||||
printf("Fatal: Ijth = %g cannot be negative.\n", model->BSIM3v32ijth);
|
||||
Fatal_Flag = 1;
|
||||
}
|
||||
|
||||
/* Check capacitance parameters */
|
||||
if (pParam->BSIM3v32clc < 0.0)
|
||||
{ fprintf(fplog, "Fatal: Clc = %g is negative.\n", pParam->BSIM3v32clc);
|
||||
printf("Fatal: Clc = %g is negative.\n", pParam->BSIM3v32clc);
|
||||
Fatal_Flag = 1;
|
||||
}
|
||||
if (pParam->BSIM3v32clc < 0.0)
|
||||
{ fprintf(fplog, "Fatal: Clc = %g is negative.\n", pParam->BSIM3v32clc);
|
||||
printf("Fatal: Clc = %g is negative.\n", pParam->BSIM3v32clc);
|
||||
Fatal_Flag = 1;
|
||||
}
|
||||
|
||||
if (pParam->BSIM3v32moin < 5.0)
|
||||
{ fprintf(fplog, "Warning: Moin = %g is too small.\n",
|
||||
pParam->BSIM3v32moin);
|
||||
printf("Warning: Moin = %g is too small.\n", pParam->BSIM3v32moin);
|
||||
}
|
||||
if (pParam->BSIM3v32moin > 25.0)
|
||||
{ fprintf(fplog, "Warning: Moin = %g is too large.\n",
|
||||
pParam->BSIM3v32moin);
|
||||
printf("Warning: Moin = %g is too large.\n", pParam->BSIM3v32moin);
|
||||
}
|
||||
if (pParam->BSIM3v32moin < 5.0)
|
||||
{ fprintf(fplog, "Warning: Moin = %g is too small.\n",
|
||||
pParam->BSIM3v32moin);
|
||||
printf("Warning: Moin = %g is too small.\n", pParam->BSIM3v32moin);
|
||||
}
|
||||
if (pParam->BSIM3v32moin > 25.0)
|
||||
{ fprintf(fplog, "Warning: Moin = %g is too large.\n",
|
||||
pParam->BSIM3v32moin);
|
||||
printf("Warning: Moin = %g is too large.\n", pParam->BSIM3v32moin);
|
||||
}
|
||||
|
||||
if(model->BSIM3v32capMod ==3) {
|
||||
if (pParam->BSIM3v32acde < 0.4)
|
||||
{ fprintf(fplog, "Warning: Acde = %g is too small.\n",
|
||||
pParam->BSIM3v32acde);
|
||||
printf("Warning: Acde = %g is too small.\n", pParam->BSIM3v32acde);
|
||||
}
|
||||
if (pParam->BSIM3v32acde > 1.6)
|
||||
{ fprintf(fplog, "Warning: Acde = %g is too large.\n",
|
||||
pParam->BSIM3v32acde);
|
||||
printf("Warning: Acde = %g is too large.\n", pParam->BSIM3v32acde);
|
||||
}
|
||||
}
|
||||
if(model->BSIM3v32capMod ==3) {
|
||||
if (pParam->BSIM3v32acde < 0.4)
|
||||
{ fprintf(fplog, "Warning: Acde = %g is too small.\n",
|
||||
pParam->BSIM3v32acde);
|
||||
printf("Warning: Acde = %g is too small.\n", pParam->BSIM3v32acde);
|
||||
}
|
||||
if (pParam->BSIM3v32acde > 1.6)
|
||||
{ fprintf(fplog, "Warning: Acde = %g is too large.\n",
|
||||
pParam->BSIM3v32acde);
|
||||
printf("Warning: Acde = %g is too large.\n", pParam->BSIM3v32acde);
|
||||
}
|
||||
}
|
||||
|
||||
if (model->BSIM3v32paramChk ==1)
|
||||
{
|
||||
/* Check L and W parameters */
|
||||
if (pParam->BSIM3v32leff <= 5.0e-8)
|
||||
{ fprintf(fplog, "Warning: Leff = %g may be too small.\n",
|
||||
pParam->BSIM3v32leff);
|
||||
printf("Warning: Leff = %g may be too small.\n",
|
||||
pParam->BSIM3v32leff);
|
||||
}
|
||||
if (model->BSIM3v32paramChk ==1)
|
||||
{
|
||||
/* Check L and W parameters */
|
||||
if (pParam->BSIM3v32leff <= 5.0e-8)
|
||||
{ fprintf(fplog, "Warning: Leff = %g may be too small.\n",
|
||||
pParam->BSIM3v32leff);
|
||||
printf("Warning: Leff = %g may be too small.\n",
|
||||
pParam->BSIM3v32leff);
|
||||
}
|
||||
|
||||
if (pParam->BSIM3v32leffCV <= 5.0e-8)
|
||||
{ fprintf(fplog, "Warning: Leff for CV = %g may be too small.\n",
|
||||
pParam->BSIM3v32leffCV);
|
||||
printf("Warning: Leff for CV = %g may be too small.\n",
|
||||
pParam->BSIM3v32leffCV);
|
||||
}
|
||||
if (pParam->BSIM3v32leffCV <= 5.0e-8)
|
||||
{ fprintf(fplog, "Warning: Leff for CV = %g may be too small.\n",
|
||||
pParam->BSIM3v32leffCV);
|
||||
printf("Warning: Leff for CV = %g may be too small.\n",
|
||||
pParam->BSIM3v32leffCV);
|
||||
}
|
||||
|
||||
if (pParam->BSIM3v32weff <= 1.0e-7)
|
||||
{ fprintf(fplog, "Warning: Weff = %g may be too small.\n",
|
||||
pParam->BSIM3v32weff);
|
||||
printf("Warning: Weff = %g may be too small.\n",
|
||||
pParam->BSIM3v32weff);
|
||||
}
|
||||
if (pParam->BSIM3v32weff <= 1.0e-7)
|
||||
{ fprintf(fplog, "Warning: Weff = %g may be too small.\n",
|
||||
pParam->BSIM3v32weff);
|
||||
printf("Warning: Weff = %g may be too small.\n",
|
||||
pParam->BSIM3v32weff);
|
||||
}
|
||||
|
||||
if (pParam->BSIM3v32weffCV <= 1.0e-7)
|
||||
{ fprintf(fplog, "Warning: Weff for CV = %g may be too small.\n",
|
||||
pParam->BSIM3v32weffCV);
|
||||
printf("Warning: Weff for CV = %g may be too small.\n",
|
||||
pParam->BSIM3v32weffCV);
|
||||
}
|
||||
if (pParam->BSIM3v32weffCV <= 1.0e-7)
|
||||
{ fprintf(fplog, "Warning: Weff for CV = %g may be too small.\n",
|
||||
pParam->BSIM3v32weffCV);
|
||||
printf("Warning: Weff for CV = %g may be too small.\n",
|
||||
pParam->BSIM3v32weffCV);
|
||||
}
|
||||
|
||||
/* Check threshold voltage parameters */
|
||||
if (pParam->BSIM3v32nlx < 0.0)
|
||||
{ fprintf(fplog, "Warning: Nlx = %g is negative.\n", pParam->BSIM3v32nlx);
|
||||
printf("Warning: Nlx = %g is negative.\n", pParam->BSIM3v32nlx);
|
||||
}
|
||||
if (model->BSIM3v32tox < 1.0e-9)
|
||||
{ fprintf(fplog, "Warning: Tox = %g is less than 10A.\n",
|
||||
model->BSIM3v32tox);
|
||||
printf("Warning: Tox = %g is less than 10A.\n", model->BSIM3v32tox);
|
||||
}
|
||||
/* Check threshold voltage parameters */
|
||||
if (pParam->BSIM3v32nlx < 0.0)
|
||||
{ fprintf(fplog, "Warning: Nlx = %g is negative.\n", pParam->BSIM3v32nlx);
|
||||
printf("Warning: Nlx = %g is negative.\n", pParam->BSIM3v32nlx);
|
||||
}
|
||||
if (model->BSIM3v32tox < 1.0e-9)
|
||||
{ fprintf(fplog, "Warning: Tox = %g is less than 10A.\n",
|
||||
model->BSIM3v32tox);
|
||||
printf("Warning: Tox = %g is less than 10A.\n", model->BSIM3v32tox);
|
||||
}
|
||||
|
||||
if (pParam->BSIM3v32npeak <= 1.0e15)
|
||||
{ fprintf(fplog, "Warning: Nch = %g may be too small.\n",
|
||||
pParam->BSIM3v32npeak);
|
||||
printf("Warning: Nch = %g may be too small.\n",
|
||||
pParam->BSIM3v32npeak);
|
||||
}
|
||||
else if (pParam->BSIM3v32npeak >= 1.0e21)
|
||||
{ fprintf(fplog, "Warning: Nch = %g may be too large.\n",
|
||||
pParam->BSIM3v32npeak);
|
||||
printf("Warning: Nch = %g may be too large.\n",
|
||||
pParam->BSIM3v32npeak);
|
||||
}
|
||||
if (pParam->BSIM3v32npeak <= 1.0e15)
|
||||
{ fprintf(fplog, "Warning: Nch = %g may be too small.\n",
|
||||
pParam->BSIM3v32npeak);
|
||||
printf("Warning: Nch = %g may be too small.\n",
|
||||
pParam->BSIM3v32npeak);
|
||||
}
|
||||
else if (pParam->BSIM3v32npeak >= 1.0e21)
|
||||
{ fprintf(fplog, "Warning: Nch = %g may be too large.\n",
|
||||
pParam->BSIM3v32npeak);
|
||||
printf("Warning: Nch = %g may be too large.\n",
|
||||
pParam->BSIM3v32npeak);
|
||||
}
|
||||
|
||||
if (pParam->BSIM3v32nsub <= 1.0e14)
|
||||
{ fprintf(fplog, "Warning: Nsub = %g may be too small.\n",
|
||||
pParam->BSIM3v32nsub);
|
||||
printf("Warning: Nsub = %g may be too small.\n",
|
||||
pParam->BSIM3v32nsub);
|
||||
}
|
||||
else if (pParam->BSIM3v32nsub >= 1.0e21)
|
||||
{ fprintf(fplog, "Warning: Nsub = %g may be too large.\n",
|
||||
pParam->BSIM3v32nsub);
|
||||
printf("Warning: Nsub = %g may be too large.\n",
|
||||
pParam->BSIM3v32nsub);
|
||||
}
|
||||
if (pParam->BSIM3v32nsub <= 1.0e14)
|
||||
{ fprintf(fplog, "Warning: Nsub = %g may be too small.\n",
|
||||
pParam->BSIM3v32nsub);
|
||||
printf("Warning: Nsub = %g may be too small.\n",
|
||||
pParam->BSIM3v32nsub);
|
||||
}
|
||||
else if (pParam->BSIM3v32nsub >= 1.0e21)
|
||||
{ fprintf(fplog, "Warning: Nsub = %g may be too large.\n",
|
||||
pParam->BSIM3v32nsub);
|
||||
printf("Warning: Nsub = %g may be too large.\n",
|
||||
pParam->BSIM3v32nsub);
|
||||
}
|
||||
|
||||
if ((pParam->BSIM3v32ngate > 0.0) &&
|
||||
(pParam->BSIM3v32ngate <= 1.e18))
|
||||
{ fprintf(fplog, "Warning: Ngate = %g is less than 1.E18cm^-3.\n",
|
||||
pParam->BSIM3v32ngate);
|
||||
printf("Warning: Ngate = %g is less than 1.E18cm^-3.\n",
|
||||
pParam->BSIM3v32ngate);
|
||||
}
|
||||
if ((pParam->BSIM3v32ngate > 0.0) &&
|
||||
(pParam->BSIM3v32ngate <= 1.e18))
|
||||
{ fprintf(fplog, "Warning: Ngate = %g is less than 1.E18cm^-3.\n",
|
||||
pParam->BSIM3v32ngate);
|
||||
printf("Warning: Ngate = %g is less than 1.E18cm^-3.\n",
|
||||
pParam->BSIM3v32ngate);
|
||||
}
|
||||
|
||||
if (pParam->BSIM3v32dvt0 < 0.0)
|
||||
{ fprintf(fplog, "Warning: Dvt0 = %g is negative.\n",
|
||||
pParam->BSIM3v32dvt0);
|
||||
printf("Warning: Dvt0 = %g is negative.\n", pParam->BSIM3v32dvt0);
|
||||
}
|
||||
if (pParam->BSIM3v32dvt0 < 0.0)
|
||||
{ fprintf(fplog, "Warning: Dvt0 = %g is negative.\n",
|
||||
pParam->BSIM3v32dvt0);
|
||||
printf("Warning: Dvt0 = %g is negative.\n", pParam->BSIM3v32dvt0);
|
||||
}
|
||||
|
||||
if (fabs(1.0e-6 / (pParam->BSIM3v32w0 + pParam->BSIM3v32weff)) > 10.0)
|
||||
{ fprintf(fplog, "Warning: (W0 + Weff) may be too small.\n");
|
||||
printf("Warning: (W0 + Weff) may be too small.\n");
|
||||
}
|
||||
if (fabs(1.0e-6 / (pParam->BSIM3v32w0 + pParam->BSIM3v32weff)) > 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->BSIM3v32nfactor < 0.0)
|
||||
{ fprintf(fplog, "Warning: Nfactor = %g is negative.\n",
|
||||
pParam->BSIM3v32nfactor);
|
||||
printf("Warning: Nfactor = %g is negative.\n", pParam->BSIM3v32nfactor);
|
||||
}
|
||||
if (pParam->BSIM3v32cdsc < 0.0)
|
||||
{ fprintf(fplog, "Warning: Cdsc = %g is negative.\n",
|
||||
pParam->BSIM3v32cdsc);
|
||||
printf("Warning: Cdsc = %g is negative.\n", pParam->BSIM3v32cdsc);
|
||||
}
|
||||
if (pParam->BSIM3v32cdscd < 0.0)
|
||||
{ fprintf(fplog, "Warning: Cdscd = %g is negative.\n",
|
||||
pParam->BSIM3v32cdscd);
|
||||
printf("Warning: Cdscd = %g is negative.\n", pParam->BSIM3v32cdscd);
|
||||
}
|
||||
/* Check DIBL parameters */
|
||||
if (pParam->BSIM3v32eta0 < 0.0)
|
||||
{ fprintf(fplog, "Warning: Eta0 = %g is negative.\n",
|
||||
pParam->BSIM3v32eta0);
|
||||
printf("Warning: Eta0 = %g is negative.\n", pParam->BSIM3v32eta0);
|
||||
}
|
||||
/* Check subthreshold parameters */
|
||||
if (pParam->BSIM3v32nfactor < 0.0)
|
||||
{ fprintf(fplog, "Warning: Nfactor = %g is negative.\n",
|
||||
pParam->BSIM3v32nfactor);
|
||||
printf("Warning: Nfactor = %g is negative.\n", pParam->BSIM3v32nfactor);
|
||||
}
|
||||
if (pParam->BSIM3v32cdsc < 0.0)
|
||||
{ fprintf(fplog, "Warning: Cdsc = %g is negative.\n",
|
||||
pParam->BSIM3v32cdsc);
|
||||
printf("Warning: Cdsc = %g is negative.\n", pParam->BSIM3v32cdsc);
|
||||
}
|
||||
if (pParam->BSIM3v32cdscd < 0.0)
|
||||
{ fprintf(fplog, "Warning: Cdscd = %g is negative.\n",
|
||||
pParam->BSIM3v32cdscd);
|
||||
printf("Warning: Cdscd = %g is negative.\n", pParam->BSIM3v32cdscd);
|
||||
}
|
||||
/* Check DIBL parameters */
|
||||
if (pParam->BSIM3v32eta0 < 0.0)
|
||||
{ fprintf(fplog, "Warning: Eta0 = %g is negative.\n",
|
||||
pParam->BSIM3v32eta0);
|
||||
printf("Warning: Eta0 = %g is negative.\n", pParam->BSIM3v32eta0);
|
||||
}
|
||||
|
||||
/* Check Abulk parameters */
|
||||
if (fabs(1.0e-6 / (pParam->BSIM3v32b1 + pParam->BSIM3v32weff)) > 10.0)
|
||||
{ fprintf(fplog, "Warning: (B1 + Weff) may be too small.\n");
|
||||
printf("Warning: (B1 + Weff) may be too small.\n");
|
||||
}
|
||||
/* Check Abulk parameters */
|
||||
if (fabs(1.0e-6 / (pParam->BSIM3v32b1 + pParam->BSIM3v32weff)) > 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->BSIM3v32a2 < 0.01)
|
||||
{ fprintf(fplog, "Warning: A2 = %g is too small. Set to 0.01.\n", pParam->BSIM3v32a2);
|
||||
printf("Warning: A2 = %g is too small. Set to 0.01.\n",
|
||||
pParam->BSIM3v32a2);
|
||||
pParam->BSIM3v32a2 = 0.01;
|
||||
}
|
||||
else if (pParam->BSIM3v32a2 > 1.0)
|
||||
{ fprintf(fplog, "Warning: A2 = %g is larger than 1. A2 is set to 1 and A1 is set to 0.\n",
|
||||
pParam->BSIM3v32a2);
|
||||
printf("Warning: A2 = %g is larger than 1. A2 is set to 1 and A1 is set to 0.\n",
|
||||
pParam->BSIM3v32a2);
|
||||
pParam->BSIM3v32a2 = 1.0;
|
||||
pParam->BSIM3v32a1 = 0.0;
|
||||
/* Check Saturation parameters */
|
||||
if (pParam->BSIM3v32a2 < 0.01)
|
||||
{ fprintf(fplog, "Warning: A2 = %g is too small. Set to 0.01.\n", pParam->BSIM3v32a2);
|
||||
printf("Warning: A2 = %g is too small. Set to 0.01.\n",
|
||||
pParam->BSIM3v32a2);
|
||||
pParam->BSIM3v32a2 = 0.01;
|
||||
}
|
||||
else if (pParam->BSIM3v32a2 > 1.0)
|
||||
{ fprintf(fplog, "Warning: A2 = %g is larger than 1. A2 is set to 1 and A1 is set to 0.\n",
|
||||
pParam->BSIM3v32a2);
|
||||
printf("Warning: A2 = %g is larger than 1. A2 is set to 1 and A1 is set to 0.\n",
|
||||
pParam->BSIM3v32a2);
|
||||
pParam->BSIM3v32a2 = 1.0;
|
||||
pParam->BSIM3v32a1 = 0.0;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
if (pParam->BSIM3v32rdsw < 0.0)
|
||||
{ fprintf(fplog, "Warning: Rdsw = %g is negative. Set to zero.\n",
|
||||
pParam->BSIM3v32rdsw);
|
||||
printf("Warning: Rdsw = %g is negative. Set to zero.\n",
|
||||
pParam->BSIM3v32rdsw);
|
||||
pParam->BSIM3v32rdsw = 0.0;
|
||||
pParam->BSIM3v32rds0 = 0.0;
|
||||
}
|
||||
else if ((pParam->BSIM3v32rds0 > 0.0) && (pParam->BSIM3v32rds0 < 0.001))
|
||||
{ fprintf(fplog, "Warning: Rds at current temperature = %g is less than 0.001 ohm. Set to zero.\n",
|
||||
pParam->BSIM3v32rds0);
|
||||
printf("Warning: Rds at current temperature = %g is less than 0.001 ohm. Set to zero.\n",
|
||||
pParam->BSIM3v32rds0);
|
||||
pParam->BSIM3v32rds0 = 0.0;
|
||||
}
|
||||
if (pParam->BSIM3v32vsattemp < 1.0e3)
|
||||
{ fprintf(fplog, "Warning: Vsat at current temperature = %g may be too small.\n", pParam->BSIM3v32vsattemp);
|
||||
printf("Warning: Vsat at current temperature = %g may be too small.\n", pParam->BSIM3v32vsattemp);
|
||||
}
|
||||
if (pParam->BSIM3v32rdsw < 0.0)
|
||||
{ fprintf(fplog, "Warning: Rdsw = %g is negative. Set to zero.\n",
|
||||
pParam->BSIM3v32rdsw);
|
||||
printf("Warning: Rdsw = %g is negative. Set to zero.\n",
|
||||
pParam->BSIM3v32rdsw);
|
||||
pParam->BSIM3v32rdsw = 0.0;
|
||||
pParam->BSIM3v32rds0 = 0.0;
|
||||
}
|
||||
else if ((pParam->BSIM3v32rds0 > 0.0) && (pParam->BSIM3v32rds0 < 0.001))
|
||||
{ fprintf(fplog, "Warning: Rds at current temperature = %g is less than 0.001 ohm. Set to zero.\n",
|
||||
pParam->BSIM3v32rds0);
|
||||
printf("Warning: Rds at current temperature = %g is less than 0.001 ohm. Set to zero.\n",
|
||||
pParam->BSIM3v32rds0);
|
||||
pParam->BSIM3v32rds0 = 0.0;
|
||||
}
|
||||
if (pParam->BSIM3v32vsattemp < 1.0e3)
|
||||
{ fprintf(fplog, "Warning: Vsat at current temperature = %g may be too small.\n", pParam->BSIM3v32vsattemp);
|
||||
printf("Warning: Vsat at current temperature = %g may be too small.\n", pParam->BSIM3v32vsattemp);
|
||||
}
|
||||
|
||||
if (pParam->BSIM3v32pdibl1 < 0.0)
|
||||
{ fprintf(fplog, "Warning: Pdibl1 = %g is negative.\n",
|
||||
pParam->BSIM3v32pdibl1);
|
||||
printf("Warning: Pdibl1 = %g is negative.\n", pParam->BSIM3v32pdibl1);
|
||||
}
|
||||
if (pParam->BSIM3v32pdibl2 < 0.0)
|
||||
{ fprintf(fplog, "Warning: Pdibl2 = %g is negative.\n",
|
||||
pParam->BSIM3v32pdibl2);
|
||||
printf("Warning: Pdibl2 = %g is negative.\n", pParam->BSIM3v32pdibl2);
|
||||
}
|
||||
/* Check overlap capacitance parameters */
|
||||
if (model->BSIM3v32cgdo < 0.0)
|
||||
{ fprintf(fplog, "Warning: cgdo = %g is negative. Set to zero.\n", model->BSIM3v32cgdo);
|
||||
printf("Warning: cgdo = %g is negative. Set to zero.\n", model->BSIM3v32cgdo);
|
||||
model->BSIM3v32cgdo = 0.0;
|
||||
}
|
||||
if (model->BSIM3v32cgso < 0.0)
|
||||
{ fprintf(fplog, "Warning: cgso = %g is negative. Set to zero.\n", model->BSIM3v32cgso);
|
||||
printf("Warning: cgso = %g is negative. Set to zero.\n", model->BSIM3v32cgso);
|
||||
model->BSIM3v32cgso = 0.0;
|
||||
}
|
||||
if (model->BSIM3v32cgbo < 0.0)
|
||||
{ fprintf(fplog, "Warning: cgbo = %g is negative. Set to zero.\n", model->BSIM3v32cgbo);
|
||||
printf("Warning: cgbo = %g is negative. Set to zero.\n", model->BSIM3v32cgbo);
|
||||
model->BSIM3v32cgbo = 0.0;
|
||||
}
|
||||
if (pParam->BSIM3v32pdibl1 < 0.0)
|
||||
{ fprintf(fplog, "Warning: Pdibl1 = %g is negative.\n",
|
||||
pParam->BSIM3v32pdibl1);
|
||||
printf("Warning: Pdibl1 = %g is negative.\n", pParam->BSIM3v32pdibl1);
|
||||
}
|
||||
if (pParam->BSIM3v32pdibl2 < 0.0)
|
||||
{ fprintf(fplog, "Warning: Pdibl2 = %g is negative.\n",
|
||||
pParam->BSIM3v32pdibl2);
|
||||
printf("Warning: Pdibl2 = %g is negative.\n", pParam->BSIM3v32pdibl2);
|
||||
}
|
||||
/* Check overlap capacitance parameters */
|
||||
if (model->BSIM3v32cgdo < 0.0)
|
||||
{ fprintf(fplog, "Warning: cgdo = %g is negative. Set to zero.\n", model->BSIM3v32cgdo);
|
||||
printf("Warning: cgdo = %g is negative. Set to zero.\n", model->BSIM3v32cgdo);
|
||||
model->BSIM3v32cgdo = 0.0;
|
||||
}
|
||||
if (model->BSIM3v32cgso < 0.0)
|
||||
{ fprintf(fplog, "Warning: cgso = %g is negative. Set to zero.\n", model->BSIM3v32cgso);
|
||||
printf("Warning: cgso = %g is negative. Set to zero.\n", model->BSIM3v32cgso);
|
||||
model->BSIM3v32cgso = 0.0;
|
||||
}
|
||||
if (model->BSIM3v32cgbo < 0.0)
|
||||
{ fprintf(fplog, "Warning: cgbo = %g is negative. Set to zero.\n", model->BSIM3v32cgbo);
|
||||
printf("Warning: cgbo = %g is negative. Set to zero.\n", model->BSIM3v32cgbo);
|
||||
model->BSIM3v32cgbo = 0.0;
|
||||
}
|
||||
|
||||
}/* loop for the parameter check for warning messages */
|
||||
fclose(fplog);
|
||||
}/* loop for the parameter check for warning messages */
|
||||
fclose(fplog);
|
||||
}
|
||||
else
|
||||
{ fprintf(stderr, "Warning: Can't open log file. Parameter checking skipped.\n");
|
||||
|
|
|
|||
|
|
@ -32,20 +32,20 @@ double cbd, cbhat, cbs, cd, cdhat, tol, vgd, vgdo, vgs;
|
|||
{ /* loop through all the instances of the model */
|
||||
for (here = model->BSIM3v32instances; here != NULL ;
|
||||
here=here->BSIM3v32nextInstance)
|
||||
{
|
||||
vbs = model->BSIM3v32type
|
||||
* (*(ckt->CKTrhsOld+here->BSIM3v32bNode)
|
||||
- *(ckt->CKTrhsOld+here->BSIM3v32sNodePrime));
|
||||
{
|
||||
vbs = model->BSIM3v32type
|
||||
* (*(ckt->CKTrhsOld+here->BSIM3v32bNode)
|
||||
- *(ckt->CKTrhsOld+here->BSIM3v32sNodePrime));
|
||||
vgs = model->BSIM3v32type
|
||||
* (*(ckt->CKTrhsOld+here->BSIM3v32gNode)
|
||||
- *(ckt->CKTrhsOld+here->BSIM3v32sNodePrime));
|
||||
* (*(ckt->CKTrhsOld+here->BSIM3v32gNode)
|
||||
- *(ckt->CKTrhsOld+here->BSIM3v32sNodePrime));
|
||||
vds = model->BSIM3v32type
|
||||
* (*(ckt->CKTrhsOld+here->BSIM3v32dNodePrime)
|
||||
- *(ckt->CKTrhsOld+here->BSIM3v32sNodePrime));
|
||||
* (*(ckt->CKTrhsOld+here->BSIM3v32dNodePrime)
|
||||
- *(ckt->CKTrhsOld+here->BSIM3v32sNodePrime));
|
||||
vbd = vbs - vds;
|
||||
vgd = vgs - vds;
|
||||
vgdo = *(ckt->CKTstate0 + here->BSIM3v32vgs)
|
||||
- *(ckt->CKTstate0 + here->BSIM3v32vds);
|
||||
- *(ckt->CKTstate0 + here->BSIM3v32vds);
|
||||
delvbs = vbs - *(ckt->CKTstate0 + here->BSIM3v32vbs);
|
||||
delvbd = vbd - *(ckt->CKTstate0 + here->BSIM3v32vbd);
|
||||
delvgs = vgs - *(ckt->CKTstate0 + here->BSIM3v32vgs);
|
||||
|
|
@ -54,47 +54,47 @@ double cbd, cbhat, cbs, cd, cdhat, tol, vgd, vgdo, vgs;
|
|||
|
||||
cd = here->BSIM3v32cd - here->BSIM3v32cbd;
|
||||
if (here->BSIM3v32mode >= 0)
|
||||
{ cd += here->BSIM3v32csub;
|
||||
cdhat = cd - here->BSIM3v32gbd * delvbd
|
||||
+ (here->BSIM3v32gmbs + here->BSIM3v32gbbs) * delvbs
|
||||
+ (here->BSIM3v32gm + here->BSIM3v32gbgs) * delvgs
|
||||
+ (here->BSIM3v32gds + here->BSIM3v32gbds) * delvds;
|
||||
{ cd += here->BSIM3v32csub;
|
||||
cdhat = cd - here->BSIM3v32gbd * delvbd
|
||||
+ (here->BSIM3v32gmbs + here->BSIM3v32gbbs) * delvbs
|
||||
+ (here->BSIM3v32gm + here->BSIM3v32gbgs) * delvgs
|
||||
+ (here->BSIM3v32gds + here->BSIM3v32gbds) * delvds;
|
||||
}
|
||||
else
|
||||
{ cdhat = cd + (here->BSIM3v32gmbs - here->BSIM3v32gbd) * delvbd
|
||||
+ here->BSIM3v32gm * delvgd - here->BSIM3v32gds * delvds;
|
||||
else
|
||||
{ cdhat = cd + (here->BSIM3v32gmbs - here->BSIM3v32gbd) * delvbd
|
||||
+ here->BSIM3v32gm * delvgd - here->BSIM3v32gds * delvds;
|
||||
}
|
||||
|
||||
/*
|
||||
* check convergence
|
||||
*/
|
||||
if ((here->BSIM3v32off == 0) || (!(ckt->CKTmode & MODEINITFIX)))
|
||||
{ tol = ckt->CKTreltol * MAX(fabs(cdhat), fabs(cd))
|
||||
+ ckt->CKTabstol;
|
||||
{ tol = ckt->CKTreltol * MAX(fabs(cdhat), fabs(cd))
|
||||
+ ckt->CKTabstol;
|
||||
if (fabs(cdhat - cd) >= tol)
|
||||
{ ckt->CKTnoncon++;
|
||||
{ ckt->CKTnoncon++;
|
||||
return(OK);
|
||||
}
|
||||
cbs = here->BSIM3v32cbs;
|
||||
cbd = here->BSIM3v32cbd;
|
||||
if (here->BSIM3v32mode >= 0)
|
||||
{ cbhat = cbs + cbd - here->BSIM3v32csub
|
||||
+ here->BSIM3v32gbd * delvbd
|
||||
+ (here->BSIM3v32gbs - here->BSIM3v32gbbs) * delvbs
|
||||
- here->BSIM3v32gbgs * delvgs
|
||||
- here->BSIM3v32gbds * delvds;
|
||||
}
|
||||
else
|
||||
{ cbhat = cbs + cbd - here->BSIM3v32csub
|
||||
+ here->BSIM3v32gbs * delvbs
|
||||
+ (here->BSIM3v32gbd - here->BSIM3v32gbbs) * delvbd
|
||||
- here->BSIM3v32gbgs * delvgd
|
||||
+ here->BSIM3v32gbds * delvds;
|
||||
}
|
||||
{ cbhat = cbs + cbd - here->BSIM3v32csub
|
||||
+ here->BSIM3v32gbd * delvbd
|
||||
+ (here->BSIM3v32gbs - here->BSIM3v32gbbs) * delvbs
|
||||
- here->BSIM3v32gbgs * delvgs
|
||||
- here->BSIM3v32gbds * delvds;
|
||||
}
|
||||
else
|
||||
{ cbhat = cbs + cbd - here->BSIM3v32csub
|
||||
+ here->BSIM3v32gbs * delvbs
|
||||
+ (here->BSIM3v32gbd - here->BSIM3v32gbbs) * delvbd
|
||||
- here->BSIM3v32gbgs * delvgd
|
||||
+ here->BSIM3v32gbds * delvds;
|
||||
}
|
||||
tol = ckt->CKTreltol * MAX(fabs(cbhat),
|
||||
fabs(cbs + cbd - here->BSIM3v32csub)) + ckt->CKTabstol;
|
||||
fabs(cbs + cbd - here->BSIM3v32csub)) + ckt->CKTabstol;
|
||||
if (fabs(cbhat - (cbs + cbd - here->BSIM3v32csub)) > tol)
|
||||
{ ckt->CKTnoncon++;
|
||||
{ ckt->CKTnoncon++;
|
||||
return(OK);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -28,8 +28,8 @@ BSIM3v32instance *here;
|
|||
for (; model ; model = model->BSIM3v32nextModel)
|
||||
{ prev = &(model->BSIM3v32instances);
|
||||
for (here = *prev; here ; here = *prev)
|
||||
{ if (here->BSIM3v32name == name || (fast && here==*fast))
|
||||
{ *prev= here->BSIM3v32nextInstance;
|
||||
{ if (here->BSIM3v32name == name || (fast && here==*fast))
|
||||
{ *prev= here->BSIM3v32nextInstance;
|
||||
FREE(here);
|
||||
return(OK);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -23,18 +23,18 @@ BSIM3v32instance *here;
|
|||
|
||||
for (; model ; model = model->BSIM3v32nextModel)
|
||||
{ for (here = model->BSIM3v32instances; here; here = here->BSIM3v32nextInstance)
|
||||
{
|
||||
if (!here->BSIM3v32icVBSGiven)
|
||||
{ here->BSIM3v32icVBS = *(ckt->CKTrhs + here->BSIM3v32bNode)
|
||||
- *(ckt->CKTrhs + here->BSIM3v32sNode);
|
||||
{
|
||||
if (!here->BSIM3v32icVBSGiven)
|
||||
{ here->BSIM3v32icVBS = *(ckt->CKTrhs + here->BSIM3v32bNode)
|
||||
- *(ckt->CKTrhs + here->BSIM3v32sNode);
|
||||
}
|
||||
if (!here->BSIM3v32icVDSGiven)
|
||||
{ here->BSIM3v32icVDS = *(ckt->CKTrhs + here->BSIM3v32dNode)
|
||||
- *(ckt->CKTrhs + here->BSIM3v32sNode);
|
||||
{ here->BSIM3v32icVDS = *(ckt->CKTrhs + here->BSIM3v32dNode)
|
||||
- *(ckt->CKTrhs + here->BSIM3v32sNode);
|
||||
}
|
||||
if (!here->BSIM3v32icVGSGiven)
|
||||
{ here->BSIM3v32icVGS = *(ckt->CKTrhs + here->BSIM3v32gNode)
|
||||
- *(ckt->CKTrhs + here->BSIM3v32sNode);
|
||||
{ here->BSIM3v32icVGS = *(ckt->CKTrhs + here->BSIM3v32gNode)
|
||||
- *(ckt->CKTrhs + here->BSIM3v32sNode);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue