Merge post ngspice-39 branch 'pre-master' into bt_dev
This commit is contained in:
commit
0288dc2b22
2
AUTHORS
2
AUTHORS
|
|
@ -1,4 +1,4 @@
|
||||||
@c This file will be processed with texinfo.
|
ngspice authors
|
||||||
|
|
||||||
Spice was originally written at The University of California at Berkeley (USA).
|
Spice was originally written at The University of California at Berkeley (USA).
|
||||||
Since then, there have been many people working on the software, most of them
|
Since then, there have been many people working on the software, most of them
|
||||||
|
|
|
||||||
5
COPYING
5
COPYING
|
|
@ -1,6 +1,6 @@
|
||||||
Ngspice Licensing
|
Ngspice Licensing
|
||||||
|
|
||||||
Copyright (c) 2022 by ngspice team
|
Copyright (c) 2023 by ngspice team
|
||||||
All rights reserved.
|
All rights reserved.
|
||||||
|
|
||||||
license for this document: CC-BY-SA v4.0
|
license for this document: CC-BY-SA v4.0
|
||||||
|
|
@ -16,9 +16,6 @@ its source code, test and example files except for the files listed below.
|
||||||
|
|
||||||
************** files with licenses different to 'Modified BSD' ****************
|
************** files with licenses different to 'Modified BSD' ****************
|
||||||
|
|
||||||
* ngspice/contrib
|
|
||||||
GPL, Public Domain
|
|
||||||
|
|
||||||
* ngspice/m4
|
* ngspice/m4
|
||||||
unnamed, compatible to DFSG
|
unnamed, compatible to DFSG
|
||||||
|
|
||||||
|
|
|
||||||
79
DEVICES
79
DEVICES
|
|
@ -69,6 +69,7 @@ Table of contents
|
||||||
13.4 HICUM0 Bipolar Model
|
13.4 HICUM0 Bipolar Model
|
||||||
13.5 Mextram Bipolar Model
|
13.5 Mextram Bipolar Model
|
||||||
14. XSPICE code models
|
14. XSPICE code models
|
||||||
|
15. Digital Building Blocks (U instances)
|
||||||
|
|
||||||
------------------
|
------------------
|
||||||
|
|
||||||
|
|
@ -814,59 +815,33 @@ will be updated every time the device specific code is altered or changed to ref
|
||||||
|
|
||||||
13. Verilog-A models
|
13. Verilog-A models
|
||||||
|
|
||||||
Configuring ngspice with ADMS (see Readme.adms) following
|
ngspice inherits the OSDI interface for compiled Verilog-A models
|
||||||
devices are available:
|
OpenVAF from https://openvaf.semimod.de/ is required to compile
|
||||||
|
LRM2.x-conforming Verilog-A models into shared libraries which
|
||||||
|
may be loaded into ngspice dynamically at run-time.
|
||||||
|
|
||||||
13.1 EKV MOS Model
|
The following models have been tested, example netlists are available:
|
||||||
|
|
||||||
Ver: 2.6
|
13.1 BSIMBULK 107
|
||||||
Level: 44
|
13.2 BSIM-CMG
|
||||||
Dir: devices/adms/ekv
|
13.3 HICUM L0
|
||||||
Status: TO BE TESTED
|
13.4 ASM-HEMT
|
||||||
|
13.5 VBIC
|
||||||
EKV version based on a contribution of Ivan Riis Nielsen 11/2006
|
13.6 MEXTRAM 504/505
|
||||||
|
13.7 PSP 103.8
|
||||||
Web site at: https://www.epfl.ch/labs/iclab/ekv/model/
|
13.8 r2_cmc
|
||||||
(The model from https://github.com/ekv26/model is not compatible
|
|
||||||
to the current ngspice adms implementation)
|
More may be made available, user compiled models are possible as well
|
||||||
|
(See ngspice manual, chapter 13).
|
||||||
|
|
||||||
|
|
||||||
13.2 PSP MOS Model 102
|
14. XSpice code models
|
||||||
|
|
||||||
Ver: 102.1
|
more than 100 models are available, please see ngspice manual chapt. 12
|
||||||
Level: 45
|
|
||||||
Dir: devices/adms/psp102
|
15. Digital Building Blocks (U instances)
|
||||||
Status: TO BE TESTED
|
|
||||||
|
U instances are digital primitives which may be used (in proper combination) to
|
||||||
Philips SimKit 2.5.
|
model digital devices, e.g. from the 74xx or 40xx families. ngspice maps them
|
||||||
|
onto XSPICE models, which allows a fast event based simulation. Please see the
|
||||||
13.3 PSP MOS Model 103
|
ngspice manual, chapter 14.
|
||||||
|
|
||||||
Ver: 103.1
|
|
||||||
Level: 69
|
|
||||||
Dir: devices/adms/psp103
|
|
||||||
Status: TO BE TESTED
|
|
||||||
|
|
||||||
Philips SimKit 2.5.
|
|
||||||
|
|
||||||
13.4 HICUM0 Bipolar Model
|
|
||||||
|
|
||||||
Ver: Level_0 Version_1.12
|
|
||||||
Level: 7
|
|
||||||
Dir: devices/adms/hicum0
|
|
||||||
Status: TO BE TESTED
|
|
||||||
|
|
||||||
A simplified version of HICUM Level2 model for BJT
|
|
||||||
Web site at: http://www.iee.et.tu-dresden.de/iee/eb/hic_new
|
|
||||||
|
|
||||||
|
|
||||||
13.5 Mextram Bipolar Model
|
|
||||||
|
|
||||||
Ver: 504.6.1
|
|
||||||
Level: 6
|
|
||||||
Dir: devices/adms/mextram
|
|
||||||
Status: TO BE TESTED
|
|
||||||
|
|
||||||
Web site at: http://mextram.ewi.tudelft.nl/ and http://mextram.sourceforge.net/
|
|
||||||
|
|
||||||
14. XSpice code models, see ngspice manual chapt. 12
|
|
||||||
|
|
|
||||||
72
FAQ
72
FAQ
|
|
@ -1,7 +1,7 @@
|
||||||
Ngspice F.A.Q.Version 2.7 (ngspice-37 release)
|
Ngspice F.A.Q.Version 2.9 (ngspice-39 release)
|
||||||
|
|
||||||
Maintained by Holger Vogt
|
Maintained by Holger Vogt
|
||||||
Last update: May 11 2022
|
Last update: Jan 24 2023
|
||||||
|
|
||||||
This document contains the Frequently Asked Questions (and Answers)
|
This document contains the Frequently Asked Questions (and Answers)
|
||||||
for ngspice project.
|
for ngspice project.
|
||||||
|
|
@ -123,7 +123,7 @@
|
||||||
capabilities) and user interface are other goals.
|
capabilities) and user interface are other goals.
|
||||||
|
|
||||||
|
|
||||||
1.6 What you are going to do?
|
1.6 What are you going to do?
|
||||||
|
|
||||||
An official roadmap for ngspice was never drawn. Contributions made by
|
An official roadmap for ngspice was never drawn. Contributions made by
|
||||||
developers drive ngspice development and the roadmap is built day by
|
developers drive ngspice development and the roadmap is built day by
|
||||||
|
|
@ -140,18 +140,18 @@
|
||||||
+ Compact models: The interest in using ngspice is intimately connected
|
+ Compact models: The interest in using ngspice is intimately connected
|
||||||
to the available models. To provide the latest models available for
|
to the available models. To provide the latest models available for
|
||||||
active and passive devices is a fundamental goal of the project. In
|
active and passive devices is a fundamental goal of the project. In
|
||||||
this direction we are integrating ADMS model compiler into ngspice.
|
this direction we are integrating OSDI interface into ngspice for
|
||||||
|
reading OpenVAF compiled Verilog-A compact models.
|
||||||
|
|
||||||
+ Documentation: Commercial simulators come with very good manuals
|
+ Documentation: Commercial simulators come with very good manuals
|
||||||
containing tutorials, description of models equations, example of
|
containing tutorials, description of models equations, example of
|
||||||
use, suggestions, etc. Spice came with little documentation. The
|
use, suggestions, etc. Spice came with little documentation. The
|
||||||
Spice3f manual, available on the Internet has been used as the basis
|
Spice3f manual, available on the Internet has been used as the basis
|
||||||
for the new manual. It will be constantly improved during ngspice
|
for the ngspice manual. It will be constantly improved during ngspice
|
||||||
development and integrated with the documentation accompanying Xspice
|
development. The ngspice manual today contains description of all
|
||||||
and Cider. The ngspice manual today contains description of all
|
|
||||||
features ngspice is offering. It is however not a tutorial of ngspice
|
features ngspice is offering. It is however not a tutorial of ngspice
|
||||||
usage, but there are now several good ones available on the internet
|
usage, but there are several good ones available on the internet
|
||||||
(see http://ngspice.sourceforge.net/tutorials.html).
|
(see https://ngspice.sourceforge.io/tutorials.html).
|
||||||
|
|
||||||
|
|
||||||
1.7 Legal issues
|
1.7 Legal issues
|
||||||
|
|
@ -208,37 +208,40 @@
|
||||||
web server and then moved to sourceforge. Sourceforge provides an
|
web server and then moved to sourceforge. Sourceforge provides an
|
||||||
archiving service that cam be accessed via the summary page:
|
archiving service that cam be accessed via the summary page:
|
||||||
|
|
||||||
http://sourceforge.net/p/ngspice/mailman/
|
https://sourceforge.net/p/ngspice/mailman/
|
||||||
|
|
||||||
|
|
||||||
1.11 Where can I get a copy of ngspice?
|
1.11 Where can I get a copy of ngspice?
|
||||||
|
|
||||||
You can download ngspice from:
|
You can download ngspice source code or MS Windows executables from:
|
||||||
|
|
||||||
http://sourceforge.net/projects/ngspice/files/ng-spice-rework/
|
https://sourceforge.net/projects/ngspice/files/ng-spice-rework/
|
||||||
|
|
||||||
|
Nearly all distributions for MINGW, Cygwin, Linux, macOS and
|
||||||
|
others offer install-ready copies of ngspice.
|
||||||
|
|
||||||
|
|
||||||
1.12 Where should I look on the World Wide Web for ngspice stuff?
|
1.12 Where should I look on the World Wide Web for ngspice stuff?
|
||||||
|
|
||||||
Look at the official Ngpice Web Page:
|
Look at the official Ngpice Web Page:
|
||||||
|
|
||||||
http://ngspice.sourceforge.net
|
https://ngspice.sourceforge.io
|
||||||
|
|
||||||
|
|
||||||
1.13 Where should I look on the World Wide Web for Spice documentation?
|
1.13 Where should I look on the World Wide Web for Spice documentation?
|
||||||
|
|
||||||
There is a detailed ngspice manual available at:
|
There is a detailed ngspice manual available at:
|
||||||
http://ngspice.sourceforge.net/docs.html
|
https://ngspice.sourceforge.io/docs.html
|
||||||
|
|
||||||
Others docs are assembled at:
|
Others docs are assembled at:
|
||||||
http://ngspice.sourceforge.net/literature.html
|
https://ngspice.sourceforge.io/literature.html
|
||||||
|
|
||||||
|
|
||||||
1.14 Are there some (official) tutorials available?
|
1.14 Are there some (official) tutorials available?
|
||||||
|
|
||||||
Yes, they are, for ngspice, ngspice within KiCAD and on eletro-thermal
|
Yes, they are, for ngspice, ngspice within KiCAD and on eletro-thermal
|
||||||
simulation. You may find them at:
|
simulation. You may find them at:
|
||||||
http://ngspice.sourceforge.net/tutorials.html
|
https://ngspice.sourceforge.io/tutorials.html
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -249,43 +252,20 @@
|
||||||
|
|
||||||
The latest version released is:
|
The latest version released is:
|
||||||
|
|
||||||
* ngspice-37 (released on May 22 2022)
|
* ngspice-39 (released on Jan 31 2023)
|
||||||
|
|
||||||
|
|
||||||
2.2. What are the latest features in the current release?
|
2.2. What are the latest features in the current release?
|
||||||
|
|
||||||
- New features:
|
Please see file NEWS accompaniing this FAQ.
|
||||||
+ Reduce XSPICE memory consumption dramatically
|
|
||||||
(> factor of 10).
|
|
||||||
+ Add source stepping to B source
|
|
||||||
+ Add 'esave' command to save only specific event nodes.
|
|
||||||
+ Accept '.temp=125' or .temp='param'.
|
|
||||||
+ Enable output redirection for meas command.
|
|
||||||
+ Use total current for diffcap calculation in diode model.
|
|
||||||
+ Speed output and reduces file size when plotting large
|
|
||||||
result vectors (Windows).
|
|
||||||
+ Enable RKM notation also for inductors (e.g. 1u2 for 1.2u).
|
|
||||||
+ Add S parameter simulation (command '.sp').
|
|
||||||
+ Add new flag 'digitop' for the 'plot' command.
|
|
||||||
+ Add a flag 'alle' (all event nodes) to the plot command.
|
|
||||||
+ New code model d_pwm: hybrid oscillator (analg control in,
|
|
||||||
digital out) with PWM.
|
|
||||||
+ Make "nogrid" plotting option work.
|
|
||||||
+ Add current measurement for all nodes of a device,
|
|
||||||
e.g. .probe i(Q1) will measure Ic, Ib, Ie (and Is).
|
|
||||||
+ .probe P(dev): Add measurement of power dissipation in a device.
|
|
||||||
+ Add new flags -type and -flags to command devhelp.
|
|
||||||
|
|
||||||
- Bug fixes:
|
|
||||||
+ many bugs fixed and code improvements (see bugs 557 and up)
|
|
||||||
+ making error messages more verbose
|
|
||||||
+ memory leaks removed
|
|
||||||
|
|
||||||
|
|
||||||
2.3. What does it look like?
|
2.3. What does it look like?
|
||||||
|
|
||||||
Ngspice, as the original Spice3 (and Xspice and Cider) is a command
|
Ngspice, as the original Spice3 (and Xspice and Cider) is a command
|
||||||
line simulator, but with a graphics output capability.
|
line simulator, but with a graphics output capability. Excellent
|
||||||
|
open source third party tool for schematic capture (KiCad, XSCHEM,
|
||||||
|
Qucs-S and others) are available.
|
||||||
|
|
||||||
|
|
||||||
2.4. Who are the authors of ngspice?
|
2.4. Who are the authors of ngspice?
|
||||||
|
|
@ -303,7 +283,7 @@
|
||||||
feature-request and bugs trackers. You can use them or subscribe to
|
feature-request and bugs trackers. You can use them or subscribe to
|
||||||
mailing lists and post there. The former is preferred since almost
|
mailing lists and post there. The former is preferred since almost
|
||||||
it allows to track all necessary actions upon a bug. The web site at
|
it allows to track all necessary actions upon a bug. The web site at
|
||||||
http://ngspice.sourceforge.net/bugrep.html will give you more details.
|
https://ngspice.sourceforge.io/bugrep.html will give you more details.
|
||||||
|
|
||||||
|
|
||||||
2.6. How can I join the development?
|
2.6. How can I join the development?
|
||||||
|
|
@ -370,7 +350,7 @@
|
||||||
|
|
||||||
4.4. Disclaimer and Copyright
|
4.4. Disclaimer and Copyright
|
||||||
|
|
||||||
Copyright: Holger Vogt, 2022
|
Copyright: Holger Vogt, 2023
|
||||||
License: Creative Commons Attribution Share-Alike (CC-BY-SA) v4.0.
|
License: Creative Commons Attribution Share-Alike (CC-BY-SA) v4.0.
|
||||||
This document is provided as is. The information in it is not
|
This document is provided as is. The information in it is not
|
||||||
warranted to be correct: you use it at your own risk.
|
warranted to be correct: you use it at your own risk.
|
||||||
|
|
|
||||||
24
INSTALL
24
INSTALL
|
|
@ -11,7 +11,7 @@ Table of contents
|
||||||
|
|
||||||
1 Ngspice installation (LINUX)
|
1 Ngspice installation (LINUX)
|
||||||
1.1 Prerequisites
|
1.1 Prerequisites
|
||||||
1.2 Install from tarball (e.g. ngspice-36.tar.gz)
|
1.2 Install from tarball (e.g. ngspice-38.tar.gz)
|
||||||
1.3 Install from git repository
|
1.3 Install from git repository
|
||||||
1.4 ngspice as a shared library
|
1.4 ngspice as a shared library
|
||||||
1.5 Advanced Install
|
1.5 Advanced Install
|
||||||
|
|
@ -28,7 +28,7 @@ Table of contents
|
||||||
8 Operation Controls
|
8 Operation Controls
|
||||||
9 NGSPICE COMPILATION UNDER WINDOWS OS
|
9 NGSPICE COMPILATION UNDER WINDOWS OS
|
||||||
9.1 How to make ngspice with MINGW and MSYS
|
9.1 How to make ngspice with MINGW and MSYS
|
||||||
9.2 make ngspice with MS Visual Studio 2019
|
9.2 make ngspice with MS Visual Studio 2019 or 2022
|
||||||
9.3 make ngspice with pure CYGWIN
|
9.3 make ngspice with pure CYGWIN
|
||||||
9.4 ngspice console app with MINGW or CYGWIN
|
9.4 ngspice console app with MINGW or CYGWIN
|
||||||
9.5 cross compiling ngspice for Windows from LINUX
|
9.5 cross compiling ngspice for Windows from LINUX
|
||||||
|
|
@ -133,7 +133,7 @@ This file describes the procedures to install ngspice from sources.
|
||||||
sections titled 'Install from tarball' and 'Advanced Install'.
|
sections titled 'Install from tarball' and 'Advanced Install'.
|
||||||
|
|
||||||
Download ngspice sources from the git repository as described on the sourceforge project page
|
Download ngspice sources from the git repository as described on the sourceforge project page
|
||||||
(see http://ngspice.sourceforge.net/download.html and click on the git link)
|
(see https://ngspice.sourceforge.io/download.html and click on the git link)
|
||||||
|
|
||||||
Now change directories in to the top-level source directory (where this
|
Now change directories in to the top-level source directory (where this
|
||||||
INSTALL file can be found).
|
INSTALL file can be found).
|
||||||
|
|
@ -240,7 +240,15 @@ This file describes the procedures to install ngspice from sources.
|
||||||
--with-editline=yes
|
--with-editline=yes
|
||||||
Enables the use of the BSD editline library (libedit) instead
|
Enables the use of the BSD editline library (libedit) instead
|
||||||
of readline.
|
of readline.
|
||||||
See http://www.thrysoee.dk/editline/
|
See https://www.thrysoee.dk/editline/
|
||||||
|
|
||||||
|
--enable-shortcheck
|
||||||
|
Enables a 'make check' with strongly reduced runtime. Besides some
|
||||||
|
regression tests only BSIM3 and BSM4 devices are checked.
|
||||||
|
|
||||||
|
--enable-shortcheck
|
||||||
|
Enables a 'make check' with strongly reduced runtime. Besides some
|
||||||
|
regression tests only BSIM3 and BSM4 devices are checked.
|
||||||
|
|
||||||
--enable-shortcheck
|
--enable-shortcheck
|
||||||
Enables a 'make check' with strongly reduced runtime. Besides some
|
Enables a 'make check' with strongly reduced runtime. Besides some
|
||||||
|
|
@ -509,7 +517,7 @@ This file describes the procedures to install ngspice from sources.
|
||||||
$ make install
|
$ make install
|
||||||
|
|
||||||
However, to compile code extracted from the git repository the procedure is
|
However, to compile code extracted from the git repository the procedure is
|
||||||
a little different. Firstly install git, e.g. from http://git-scm.com/download/win
|
a little different. Firstly install git, e.g. from https://git-scm.com/download/win
|
||||||
To obtain ngspice, you may do the following:
|
To obtain ngspice, you may do the following:
|
||||||
|
|
||||||
Open the git command window. Go to a directory of your choice, e.g. D:\Spice
|
Open the git command window. Go to a directory of your choice, e.g. D:\Spice
|
||||||
|
|
@ -580,7 +588,7 @@ This file describes the procedures to install ngspice from sources.
|
||||||
script compile_min_shared.sh.
|
script compile_min_shared.sh.
|
||||||
|
|
||||||
|
|
||||||
9.2 make ngspice with MS Visual Studio 2019
|
9.2 make ngspice with MS Visual Studio 2019 and 2022
|
||||||
|
|
||||||
ngspice may be compiled with MS Visual Studio 2019 or newer.
|
ngspice may be compiled with MS Visual Studio 2019 or newer.
|
||||||
|
|
||||||
|
|
@ -704,7 +712,7 @@ cross-compile-shared.sh.
|
||||||
|
|
||||||
10.2 Compile NGSPICE manually from a tarball
|
10.2 Compile NGSPICE manually from a tarball
|
||||||
1. Install an X11 interface (like Xquartz)
|
1. Install an X11 interface (like Xquartz)
|
||||||
2. Install MacPorts from http://www.macports.org
|
2. Install MacPorts from https://www.macports.org
|
||||||
3. Execute this command:
|
3. Execute this command:
|
||||||
sudo port install autoconf automake libtool bison flex ncurses
|
sudo port install autoconf automake libtool bison flex ncurses
|
||||||
readline fontconfig freetype libomp xorg-libXaw
|
readline fontconfig freetype libomp xorg-libXaw
|
||||||
|
|
@ -717,7 +725,7 @@ cross-compile-shared.sh.
|
||||||
|
|
||||||
10.3 Compile NGSPICE manually from git
|
10.3 Compile NGSPICE manually from git
|
||||||
1. Install an X11 interface (like Xquartz)
|
1. Install an X11 interface (like Xquartz)
|
||||||
2. Install MacPorts from http://www.macports.org
|
2. Install MacPorts from https://www.macports.org
|
||||||
3. Execute this command:
|
3. Execute this command:
|
||||||
sudo port install automake autoconf libtool bison flex ncurses xorg-libXaw
|
sudo port install automake autoconf libtool bison flex ncurses xorg-libXaw
|
||||||
readline fontconfig freetype libomp SM ICE
|
readline fontconfig freetype libomp SM ICE
|
||||||
|
|
|
||||||
33
INTERNALS
33
INTERNALS
|
|
@ -17,22 +17,21 @@ CODE ORGANIZATION
|
||||||
"visualc/" project files to enable compilation with MS Visual Studio.
|
"visualc/" project files to enable compilation with MS Visual Studio.
|
||||||
|
|
||||||
"src/" and its subdirectories contain all of the C source code.
|
"src/" and its subdirectories contain all of the C source code.
|
||||||
It contains the top level files "main.c" used by ngspice console
|
It contains the top level files "main.c" used by ngspice and
|
||||||
as entry point, "winmain.c" as entry and setup of the MS Windows GUI,
|
"sharedspice.c" used by ngspice as shared library.
|
||||||
and "sharedspice.c" used as entry for ngspice as a shared library.
|
|
||||||
There are also main files for outdated ngnutmeg, nghelp, ngmultidec,
|
There are also main files for outdated ngnutmeg, nghelp, ngmultidec,
|
||||||
ngproc2mod, and ngsconvert.
|
ngproc2mod, and ngsconvert.
|
||||||
|
|
||||||
"src/ciderlib" hosts the code for the CIDER extension to ngspice, a
|
"src/ciderlib" hosts the code for the CIDER extension to ngspice, a
|
||||||
2D process simulator offering connection between process and devices
|
2D process simulator offering connection between process and devices
|
||||||
to be simulated by ngspice.
|
to be simulated by ngspice.
|
||||||
|
|
||||||
"src/xspice" contains the code for the XSPICE extension to ngspice, an
|
"src/xspice" contains the code for the XSPICE extension to ngspice, an
|
||||||
interface to analog and digital code models for true mixed signal simulation.
|
interface to analog and digital code models for true mixed signal simulation.
|
||||||
|
|
||||||
"src/misc" Miscellaneous utility and portability routines.
|
"src/misc" Miscellaneous utility and portability routines.
|
||||||
|
|
||||||
"src/include" Header files for all *.c files of ngspice.
|
"src/include" Header files for all *.c files of ngspice.
|
||||||
|
|
||||||
"src/spicelib" is the device library and analysis portion of ngspice. Within
|
"src/spicelib" is the device library and analysis portion of ngspice. Within
|
||||||
it are the following subdirectories:
|
it are the following subdirectories:
|
||||||
|
|
@ -40,7 +39,7 @@ CODE ORGANIZATION
|
||||||
each device implementation.
|
each device implementation.
|
||||||
analysis/ All of the analysis code.
|
analysis/ All of the analysis code.
|
||||||
parser/ To set up the matrix derived from the netlist.
|
parser/ To set up the matrix derived from the netlist.
|
||||||
|
|
||||||
"src/maths" contains all maths functions of ngspice with
|
"src/maths" contains all maths functions of ngspice with
|
||||||
ni/ Numerical algorithms (used by ckt routines).
|
ni/ Numerical algorithms (used by ckt routines).
|
||||||
sparse/ Sparse matrix package (used by ckt and ni).
|
sparse/ Sparse matrix package (used by ckt and ni).
|
||||||
|
|
@ -50,20 +49,20 @@ CODE ORGANIZATION
|
||||||
misc/ Various math support algorithms
|
misc/ Various math support algorithms
|
||||||
deriv/ Various partial derivatives used by some device models (bjt, MOS1-9)
|
deriv/ Various partial derivatives used by some device models (bjt, MOS1-9)
|
||||||
dense/ Matrix operations used by S-parameter simulation
|
dense/ Matrix operations used by S-parameter simulation
|
||||||
|
|
||||||
"src/frontend" contains the code for interfacing ngspice to its input and output.
|
"src/frontend" contains the code for interfacing ngspice to its input and output.
|
||||||
Files com_*.c contain the control language commands. outitf.c organizes the
|
Files com_*.c contain the control language commands. outitf.c organizes the
|
||||||
output file structure, rawfile.c writes output files, parse.c is the control
|
output file structure, rawfile.c writes output files, parse.c is the control
|
||||||
language function parser. svg and postscript output are handled as well.
|
language function parser. svg and postscript output are handled as well.
|
||||||
inp.c, inpcom.c and subckt.c serve the main input handling functions:
|
inp.c, inpcom.c and subckt.c serve the main input handling functions:
|
||||||
reading the netlist, parsing it, dealing with compatibility, expanding
|
reading the netlist, parsing it, dealing with compatibility, expanding
|
||||||
subcircuits and preparing the internal circuit structure.
|
subcircuits and preparing the internal circuit structure.
|
||||||
|
|
||||||
Furthermore it contains subdirs
|
Furthermore it contains subdirs
|
||||||
help/ The windowed help system (outdated).
|
help/ The windowed help system (outdated).
|
||||||
numparam/ Parser for .param and .func statements.
|
numparam/ Parser for .param and .func statements.
|
||||||
parser/ More front end -- "C shell".
|
parser/ More front end -- "C shell".
|
||||||
wdisp/ MS Windows GUI for plotting
|
wdisp/ MS Windows GUI
|
||||||
trannoise/ random number and noise generators
|
trannoise/ random number and noise generator
|
||||||
plotting/ plot interface to X11, gnuplot, and preparing output graphs
|
plotting/ plot interface to X11, gnuplot, and preparing output graphs
|
||||||
(curves and grid), interpreter for 'plot' command (plotit.c)
|
(curves and grid), interpreter for 'plot' command (plotit.c)
|
||||||
|
|
|
||||||
|
|
@ -7,13 +7,13 @@ EXTRA_DIST = FAQ autogen.sh Stuarts_Poly_Notes \
|
||||||
ANALYSES BUGS AUTHORS ChangeLog \
|
ANALYSES BUGS AUTHORS ChangeLog \
|
||||||
DEVICES NEWS README README.tcl \
|
DEVICES NEWS README README.tcl \
|
||||||
README.shared-xspice README.vdmos \
|
README.shared-xspice README.vdmos \
|
||||||
README.adms README-old.adms README.utf8 \
|
README.adms README.utf8 \
|
||||||
examples m4 visualc \
|
examples m4 visualc \
|
||||||
cross-compile.sh cross-compile-shared.sh \
|
cross-compile.sh cross-compile-shared.sh \
|
||||||
compile_min.sh compile_linux.sh compile_min_shared.sh \
|
compile_min.sh compile_linux.sh compile_min_shared.sh \
|
||||||
compile_linux_shared.sh compile_cyg_make_short_check_64.sh \
|
compile_linux_shared.sh compile_cyg_make_short_check_64.sh \
|
||||||
compile_macos_clang.sh compile_macos_gcc.sh \
|
compile_macos_clang.sh compile_macos_gcc.sh \
|
||||||
ngspice.pc.in .gitignore
|
compile_linux_dist.sh ngspice.pc.in .gitignore
|
||||||
|
|
||||||
MAINTAINERCLEANFILES = Makefile.in aclocal.m4 ar-lib compile config.guess \
|
MAINTAINERCLEANFILES = Makefile.in aclocal.m4 ar-lib compile config.guess \
|
||||||
src/include/ngspice/config.h.in config.sub configure install-sh \
|
src/include/ngspice/config.h.in config.sub configure install-sh \
|
||||||
|
|
|
||||||
70
NEWS
70
NEWS
|
|
@ -1,3 +1,73 @@
|
||||||
|
Ngspice-39, Jan 31st, 2023
|
||||||
|
============
|
||||||
|
- New features:
|
||||||
|
+ OSDI interface integrated to read und simulate with
|
||||||
|
OpenVAF-compiled Verilog-A compact models delivers
|
||||||
|
access to open CMC models and many others.
|
||||||
|
+ Visual Studio 2022 is required.
|
||||||
|
+ ADMS is declared deprecated.
|
||||||
|
+ Extended support of digital U devices with f_logicexp and f_pindly,
|
||||||
|
ngspice now fully simulates 74xx ICs.
|
||||||
|
+ BSIM4 updated to 4.8.2
|
||||||
|
+ Examples for Laplace model x_fer added
|
||||||
|
+ String-valued parameters enabled
|
||||||
|
+ Add --enable-shortcheck as configure option to reduce check time
|
||||||
|
+ Add a function ddt (derivative versus time) to the B-source
|
||||||
|
+ The 8th parameter on a voltage or current source now is 'number of pulses'
|
||||||
|
+ Add a new compatibility mode xs (for XSPICE legacy behavior)
|
||||||
|
+ Add new functions for operators x**y or x^y
|
||||||
|
+ Add a user definable variable enable_noisy_r (for .spiceinit)
|
||||||
|
+ Replace obscure warning "singular matrix: check nodes mymode1 and mynode1"
|
||||||
|
by "singular matrix: check node mynode1", if both node names are equal.
|
||||||
|
+ Preprocessor flag PREDICTOR is enabled
|
||||||
|
+ Search path for *.osdi lib files extended: current, inputdir, relative
|
||||||
|
to executable
|
||||||
|
|
||||||
|
- Bug fixes:
|
||||||
|
+ many bugs fixed and code improvements (see bugs 608 and up)
|
||||||
|
+ making error messages more verbose
|
||||||
|
+ memory leaks removed
|
||||||
|
|
||||||
|
Ngspice-38, Oct 30th, 2022
|
||||||
|
============
|
||||||
|
- New features:
|
||||||
|
+ Add multiplier flag 'm' to behavioral capacitor and inductor.
|
||||||
|
+ Re-enable dc sweep after transient sim.
|
||||||
|
+ When plotting the phase, standard now is "Radiant".
|
||||||
|
+ Add Lundin's geometry correction to the inductance formula.
|
||||||
|
+ New variable keep#branch to write the current to raw file
|
||||||
|
in the old fashion 1 v1#branch current
|
||||||
|
+ Translate PSPICE U instances into equivaalent XSPICE code models.
|
||||||
|
+ New configure flag --enable-shortcheck to enable a shortened make check
|
||||||
|
(only BSIM3 and BSIM4).
|
||||||
|
+ B source will accept parameters in statistical functions like agauss.
|
||||||
|
+ WinGUI: Add a button 'Stop' to stop a simulation in intercative
|
||||||
|
or control mode.
|
||||||
|
+ Update to the .probe p (power measurement) and .probe alli commands.
|
||||||
|
+ Update to XSPICE aswitch and pswitch.
|
||||||
|
+ Make FROM/TO work in TRIG/TARG and WHEN variants of .meas/meas command.
|
||||||
|
+ Limits to exp function, allow 0 for log (returning -1e99), used
|
||||||
|
when starting iterations.
|
||||||
|
+ Insert XSPICE bridging devices automatically when an analogue node
|
||||||
|
has the same name as an XSPICE event node.
|
||||||
|
+ New options savecurrents_bsim3, savecurrents_bsim4, savecurrents_mos1.
|
||||||
|
+ pwlts: a pwl v/i source with time input, smoothing and limiting
|
||||||
|
functions.
|
||||||
|
+ New functions to the Code Model Library: cm_get_node_name()
|
||||||
|
and cm_probe_node().
|
||||||
|
+ XSPICE: Add bidirectional digital/analog bridge.
|
||||||
|
+ Search for .spiceinit firstly in a user defined directory named in env
|
||||||
|
SPICE_USERINIT_DIR, then in the current directory, then in HOME, then
|
||||||
|
in USERPROFILE.
|
||||||
|
+ If compatmode is lt, change the pow(x,y) and x**y functions:
|
||||||
|
If x < 0, output only if y is integer number, otherwise output 0.
|
||||||
|
+ Add a limit of 0.999 to bipolar parameters mje, mjc, and mjs.
|
||||||
|
|
||||||
|
- Bug fixes:
|
||||||
|
+ many bugs fixed and code improvements (see bugs 583 and up)
|
||||||
|
+ making error messages more verbose
|
||||||
|
+ memory leaks removed
|
||||||
|
|
||||||
Ngspice-37, May 22nd, 2022
|
Ngspice-37, May 22nd, 2022
|
||||||
============
|
============
|
||||||
- New features:
|
- New features:
|
||||||
|
|
|
||||||
13
README
13
README
|
|
@ -9,9 +9,10 @@ Spice3 does not need any introduction, is the most popular circuit
|
||||||
simulator. In over 30 years of its life Spice3 has become a de-facto
|
simulator. In over 30 years of its life Spice3 has become a de-facto
|
||||||
standard for simulating circuits.
|
standard for simulating circuits.
|
||||||
|
|
||||||
Cider couples Spice3f5 circuit level simulator to DSIM device simulator
|
Cider couples Spice3f5 circuit level simulator to a device simulator
|
||||||
to provide greater simulation accuracy of critical devices. DSIM
|
to provide greater simulation accuracy of critical devices. So you may
|
||||||
devices are described in terms of their structures and materials.
|
create device models for diodes, bipolar, JFet and MOSFETs derived
|
||||||
|
from their cross-sectional structures and materials.
|
||||||
|
|
||||||
Xspice is an extension to Spice3C1 that provides code modelling support
|
Xspice is an extension to Spice3C1 that provides code modelling support
|
||||||
and simulation of digital components through an embedded event driven
|
and simulation of digital components through an embedded event driven
|
||||||
|
|
@ -62,6 +63,6 @@ WEB SITEs:
|
||||||
--------
|
--------
|
||||||
|
|
||||||
This project is hosted on Sourceforge.net.
|
This project is hosted on Sourceforge.net.
|
||||||
The home page is http://ngspice.sourceforge.net
|
The home page is https://ngspice.sourceforge.io
|
||||||
The page offering source code and user interaction is
|
The page offering source code, MS Windows executables, and user interaction is
|
||||||
http://sourceforge.net/projects/ngspice
|
https://sourceforge.net/projects/ngspice
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
This document is covered by the Creative Commons Attribution Share-Alike (CC-BY-SA) v4.0. .
|
This document is covered by the Creative Commons Attribution Share-Alike (CC-BY-SA) v4.0. .
|
||||||
|
|
||||||
As of Jan. 23 ADMS is deprectated and replaced by OpenVAF/OSDI.
|
As of Jan. 2023 ADMS is deprectated and replaced by OpenVAF/OSDI.
|
||||||
See README_OSDI.md and README_OSDI_howto.
|
See README_OSDI.md and README_OSDI_howto.
|
||||||
All references to ADMS will be removed in a future ngspice release.
|
All references to ADMS will be removed in a future ngspice release.
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -21,7 +21,7 @@ This ensures that netlists can be simulated from any directory
|
||||||
## Build Instructions
|
## Build Instructions
|
||||||
|
|
||||||
To compile NGSPICE with OSDI support ensure that the `--enable-predictor` and `--enable-osdi` flags are used.
|
To compile NGSPICE with OSDI support ensure that the `--enable-predictor` and `--enable-osdi` flags are used.
|
||||||
The `compile_linus.sh` file enables these flags by default.
|
The `compile_linux.sh` file enables these flags by default.
|
||||||
|
|
||||||
|
|
||||||
## Example/Test Case
|
## Example/Test Case
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,49 @@
|
||||||
|
#!/bin/bash
|
||||||
|
# ngspice build script for Linux distributable, 64 bit
|
||||||
|
# compile_linux_dist.sh <d>
|
||||||
|
|
||||||
|
# Procedure:
|
||||||
|
# Install gcc, bison, flex, libtool, autoconf, automake,
|
||||||
|
# libx11 and libx11-dev (headers), libXaw and libXaw-dev, libreadline and dev
|
||||||
|
# Declare 'compile_linux_dist.sh' executable and start compiling with
|
||||||
|
# './compile_linux_dist.sh' from the ngspice directory.
|
||||||
|
|
||||||
|
SECONDS=0
|
||||||
|
|
||||||
|
|
||||||
|
if [ ! -d "release" ]; then
|
||||||
|
mkdir release
|
||||||
|
if [ $? -ne 0 ]; then echo "mkdir release failed"; exit 1 ; fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
# If compiling sources from git, you may need to uncomment the following two lines:
|
||||||
|
./autogen.sh
|
||||||
|
if [ $? -ne 0 ]; then echo "./autogen.sh failed"; exit 1 ; fi
|
||||||
|
|
||||||
|
echo
|
||||||
|
cd release
|
||||||
|
if [ $? -ne 0 ]; then echo "cd release failed"; exit 1 ; fi
|
||||||
|
echo "configuring for 64 bit release"
|
||||||
|
echo
|
||||||
|
|
||||||
|
../configure --with-x --enable-xspice --enable-cider --with-readline=yes --enable-openmp --enable-osdi --disable-debug CFLAGS="-m64 -O2" LDFLAGS="-m64 -s"
|
||||||
|
|
||||||
|
if [ $? -ne 0 ]; then echo "../configure failed"; exit 1 ; fi
|
||||||
|
|
||||||
|
echo
|
||||||
|
# make clean is required for properly making the code models
|
||||||
|
echo "cleaning (see make_clean.log)"
|
||||||
|
make clean 2>&1 -j8 | tee make_clean.log
|
||||||
|
exitcode=${PIPESTATUS[0]}
|
||||||
|
if [ $exitcode -ne 0 ]; then echo "make clean failed"; exit 1 ; fi
|
||||||
|
echo "generate distribution (see make_dist.log)"
|
||||||
|
make dist 2>&1 -j8 | tee make_dist.log
|
||||||
|
exitcode=${PIPESTATUS[0]}
|
||||||
|
if [ $exitcode -ne 0 ]; then echo "make dist failed"; exit 1 ; fi
|
||||||
|
|
||||||
|
ELAPSED="Elapsed compile time: $(($SECONDS / 3600))hrs $((($SECONDS / 60) % 60))min $(($SECONDS % 60))sec"
|
||||||
|
echo
|
||||||
|
echo $ELAPSED
|
||||||
|
echo "success"
|
||||||
|
exit 0
|
||||||
|
|
@ -8,10 +8,9 @@
|
||||||
# Declare 'compile_linux_shared.sh' as being executable and start compiling with
|
# Declare 'compile_linux_shared.sh' as being executable and start compiling with
|
||||||
# './compile_linux_shared.sh' or './compile_linux_shared.sh d' from the ngspice directory.
|
# './compile_linux_shared.sh' or './compile_linux_shared.sh d' from the ngspice directory.
|
||||||
# Options:
|
# Options:
|
||||||
# --adms and --enable-adms will install extra HICUM, EKV, PSP and MEXTRAM models via the
|
# --enable-osdi will add the osdi interface which allows to dynamically load compiled Verilog-A
|
||||||
# adms interface. You need to download and install the *.va files via ng-adms-va.tgz
|
# compact models. Compiling the VA code of the models is done by the OpenVAF compiler.
|
||||||
# and have adms installed.
|
# Please see the ngspice manual, chapt. 13, for more info on OSDI/OpenVAF.
|
||||||
# Please see the ngspice manual, chapt. 13, for more info on adms.
|
|
||||||
# CIDER, XSPICE, and OpenMP may be selected at will.
|
# CIDER, XSPICE, and OpenMP may be selected at will.
|
||||||
# --disable-debug will give O2 optimization (versus O0 for debug) and removes all debugging info.
|
# --disable-debug will give O2 optimization (versus O0 for debug) and removes all debugging info.
|
||||||
|
|
||||||
|
|
@ -37,31 +36,23 @@ fi
|
||||||
./autogen.sh
|
./autogen.sh
|
||||||
if [ $? -ne 0 ]; then echo "./autogen.sh failed"; exit 1 ; fi
|
if [ $? -ne 0 ]; then echo "./autogen.sh failed"; exit 1 ; fi
|
||||||
|
|
||||||
# Alternatively, if compiling sources from git, and want to add adms created devices,
|
|
||||||
# you may need to uncomment the following two lines (and don't forget to add adms option
|
|
||||||
# to the ../configure statement):
|
|
||||||
#./autogen.sh --adms
|
|
||||||
#if [ $? -ne 0 ]; then echo "./autogen.sh failed"; exit 1 ; fi
|
|
||||||
|
|
||||||
echo
|
echo
|
||||||
if test "$1" = "d"; then
|
if test "$1" = "d"; then
|
||||||
cd debugsh
|
cd debugsh
|
||||||
if [ $? -ne 0 ]; then echo "cd debugsh failed"; exit 1 ; fi
|
if [ $? -ne 0 ]; then echo "cd debugsh failed"; exit 1 ; fi
|
||||||
echo "configuring shared lib for 64 bit, debug enabled"
|
echo "configuring shared lib for 64 bit, debug enabled"
|
||||||
echo
|
echo
|
||||||
# You may add --enable-adms to the following command for adding adms generated devices.
|
|
||||||
# The --prefix (and perhaps --libdir) may be used to determine a different install location
|
# The --prefix (and perhaps --libdir) may be used to determine a different install location
|
||||||
# (depending on the Linux distribution, and on the calling programs search path).
|
# (depending on the Linux distribution, and on the calling programs search path).
|
||||||
../configure --with-ngshared --enable-xspice --enable-cider --enable-openmp --prefix=/usr CFLAGS="-g -m64 -O0 -Wall" LDFLAGS="-m64 -g"
|
../configure --with-ngshared --enable-xspice --enable-cider --enable-openmp --enable-osdi --prefix=/usr CFLAGS="-g -m64 -O0 -Wall" LDFLAGS="-m64 -g"
|
||||||
else
|
else
|
||||||
cd releasesh
|
cd releasesh
|
||||||
if [ $? -ne 0 ]; then echo "cd releasesh failed"; exit 1 ; fi
|
if [ $? -ne 0 ]; then echo "cd releasesh failed"; exit 1 ; fi
|
||||||
echo "configuring shared lib for 64 bit release"
|
echo "configuring shared lib for 64 bit release"
|
||||||
echo
|
echo
|
||||||
# You may add --enable-adms to the following command for adding adms generated devices.
|
|
||||||
# The --prefix (and perhaps --libdir) may be used to determine a different install location
|
# The --prefix (and perhaps --libdir) may be used to determine a different install location
|
||||||
# (depending on the Linux distribution, and on the calling programs search path).
|
# (depending on the Linux distribution, and on the calling programs search path).
|
||||||
../configure --with-ngshared --enable-xspice --enable-cider --enable-openmp --disable-debug --prefix=/usr CFLAGS="-m64 -O2" LDFLAGS="-m64 -s"
|
../configure --with-ngshared --enable-xspice --enable-cider --enable-openmp --disable-debug --enable-osdi --prefix=/usr CFLAGS="-m64 -O2" LDFLAGS="-m64 -s"
|
||||||
fi
|
fi
|
||||||
if [ $? -ne 0 ]; then echo "../configure failed"; exit 1 ; fi
|
if [ $? -ne 0 ]; then echo "../configure failed"; exit 1 ; fi
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -51,14 +51,14 @@ if test "$1" = "d"; then
|
||||||
echo "configuring for 64 bit debug"
|
echo "configuring for 64 bit debug"
|
||||||
echo
|
echo
|
||||||
# You may add --enable-adms to the following command for adding adms generated devices
|
# You may add --enable-adms to the following command for adding adms generated devices
|
||||||
../configure --with-ngshared --enable-xspice --enable-cider --enable-openmp --enable-relpath --disable-debug prefix="C:/Spice64d" CFLAGS="-m64 -g -O0 -Wall" LDFLAGS="-m64"
|
../configure --with-ngshared --enable-xspice --enable-cider --enable-openmp --enable-osdi --enable-relpath --disable-debug prefix="C:/Spice64d" CFLAGS="-m64 -g -O0 -Wall" LDFLAGS="-m64"
|
||||||
else
|
else
|
||||||
cd release-sh
|
cd release-sh
|
||||||
if [ $? -ne 0 ]; then echo "cd release-sh failed"; exit 1 ; fi
|
if [ $? -ne 0 ]; then echo "cd release-sh failed"; exit 1 ; fi
|
||||||
echo "configuring for 64 bit release"
|
echo "configuring for 64 bit release"
|
||||||
echo
|
echo
|
||||||
# You may add --enable-adms to the following command for adding adms generated devices
|
# You may add --enable-adms to the following command for adding adms generated devices
|
||||||
../configure --with-ngshared --enable-xspice --enable-cider --enable-openmp --enable-relpath --disable-debug prefix="C:/Spice64" CFLAGS="-m64 -O2" LDFLAGS="-m64 -s"
|
../configure --with-ngshared --enable-xspice --enable-cider --enable-openmp --enable-osdi --enable-relpath --disable-debug prefix="C:/Spice64" CFLAGS="-m64 -O2" LDFLAGS="-m64 -s"
|
||||||
fi
|
fi
|
||||||
if [ $? -ne 0 ]; then echo "../configure failed"; exit 1 ; fi
|
if [ $? -ne 0 ]; then echo "../configure failed"; exit 1 ; fi
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -16,7 +16,7 @@
|
||||||
# problem to the user.
|
# problem to the user.
|
||||||
AC_PREREQ([2.59])
|
AC_PREREQ([2.59])
|
||||||
|
|
||||||
m4_define([ngspice_major_version], [38+])
|
m4_define([ngspice_major_version], [39])
|
||||||
m4_define([ngspice_minor_version], [0])
|
m4_define([ngspice_minor_version], [0])
|
||||||
m4_define([ngspice_version],
|
m4_define([ngspice_version],
|
||||||
[ngspice_major_version])
|
[ngspice_major_version])
|
||||||
|
|
@ -117,7 +117,7 @@ LT_INIT([shared static])
|
||||||
# --> Set 'LT_NGSPICE_AGE' to 0.
|
# --> Set 'LT_NGSPICE_AGE' to 0.
|
||||||
|
|
||||||
LT_NGSPICE_CURRENT=0
|
LT_NGSPICE_CURRENT=0
|
||||||
LT_NGSPICE_REVISION=5
|
LT_NGSPICE_REVISION=6
|
||||||
LT_NGSPICE_AGE=1
|
LT_NGSPICE_AGE=1
|
||||||
LIBNGSPICE_SO_VERSION=$LT_NGSPICE_CURRENT.$LT_NGSPICE_REVISION.$LT_NGSPICE_AGE
|
LIBNGSPICE_SO_VERSION=$LT_NGSPICE_CURRENT.$LT_NGSPICE_REVISION.$LT_NGSPICE_AGE
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,16 @@
|
||||||
|
URC transmission line
|
||||||
|
|
||||||
|
.subckt UTM in out gnd1
|
||||||
|
U1 in out gnd1 URCMOD L =20m
|
||||||
|
.model URCMOD URC CPERL=100p RPERL=100k FMAX=10G
|
||||||
|
.ends
|
||||||
|
|
||||||
|
XUTM 1 2 0 UTM
|
||||||
|
|
||||||
|
VS 1 0 dc 0 PULSE (0 5 15.9NS 0.2NS 0.2NS 15.8NS 32NS )
|
||||||
|
.control
|
||||||
|
TRAN 0.2N 47N 0 0.1N
|
||||||
|
plot v(1) v(2)
|
||||||
|
.endc
|
||||||
|
|
||||||
|
.end
|
||||||
|
|
@ -78,7 +78,8 @@ run
|
||||||
display
|
display
|
||||||
edisplay
|
edisplay
|
||||||
eprint a b cin sum cout
|
eprint a b cin sum cout
|
||||||
*plot cout sum
|
set xbrushwidth=3
|
||||||
quit
|
plot a b cin cout sum digitop
|
||||||
|
*quit
|
||||||
.endc
|
.endc
|
||||||
.end
|
.end
|
||||||
|
|
|
||||||
|
|
@ -125,7 +125,8 @@ run
|
||||||
*edisplay
|
*edisplay
|
||||||
eprint o1 o2 o3 o4 o5 o6 o7 o8
|
eprint o1 o2 o3 o4 o5 o6 o7 o8
|
||||||
eprint q1 q2 q3 q4 q5 q6 q7 q8
|
eprint q1 q2 q3 q4 q5 q6 q7 q8
|
||||||
*plot q4 o6
|
*set xbrushwidth=2
|
||||||
quit
|
plot o1 o2 o3 o4 o5 o6 o7 o8 q1 q2 q3 q4 q5 q6 q7 q8 digitop
|
||||||
|
*quit
|
||||||
.endc
|
.endc
|
||||||
.end
|
.end
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,922 @@
|
||||||
|
/*
|
||||||
|
EKV MOS model version 2.6 rev.15 with documentation at: http://ekv.epfl.ch
|
||||||
|
Matthias Bucher, Christophe Lallement, Christian Enz, Fabien Theodoloz, Francois Krummenacher
|
||||||
|
Electronics Laboratories, Swiss Federal Institute of Technology Lausanne, Switzerland
|
||||||
|
This Verilog-A was developed by Wladek Grabinski with modifications
|
||||||
|
by Tiburon Design Automation (www.tiburon-da.com).
|
||||||
|
This software has been provided pursuant to a License Agreement containing restrictions on its use.
|
||||||
|
It may not be copied or distributed in any form or medium, disclosed to third parties,
|
||||||
|
reverse engineered or used in any manner not provided for in said License Agreement
|
||||||
|
except with the prior written authorization.
|
||||||
|
Licensed under the Educational Community License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
|
||||||
|
You may obtain a copy of the License at http://opensource.org/licenses/ECL-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software distributed under
|
||||||
|
the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
|
||||||
|
either express or implied. See the License for the specific language governing permissions
|
||||||
|
and limitations under the License.
|
||||||
|
|
||||||
|
$RCSfile: ekv.va,v $ $Revision: 1.9 $ $Date: 2003/12/17 01:20:10 $
|
||||||
|
$RCSfile: ekv.va,v $ $Revision: 2.6.15 $ $Date: 2020/05/29 11:50:10 $
|
||||||
|
*/
|
||||||
|
/*
|
||||||
|
`include "disciplines.vams"
|
||||||
|
`include "constants.vams"
|
||||||
|
`include "compact.vams"
|
||||||
|
*/
|
||||||
|
|
||||||
|
// Macros for the model/instance parameters
|
||||||
|
//
|
||||||
|
// MPRxx model parameter real
|
||||||
|
// MPIxx model parameter integer
|
||||||
|
// IPRxx instance parameter real
|
||||||
|
// IPIxx instance parameter integer
|
||||||
|
// ||
|
||||||
|
// cc closed lower bound, closed upper bound
|
||||||
|
// oo open lower bound, open upper bound
|
||||||
|
// co closed lower bound, open upper bound
|
||||||
|
// oc open lower bound, closed upper bound
|
||||||
|
// cz closed lower bound=0, open upper bound=inf
|
||||||
|
// oz open lower bound=0, open upper bound=inf
|
||||||
|
// nb no bounds
|
||||||
|
// ex no bounds with exclude
|
||||||
|
// sw switch(integer only, values 0=false and 1=true)
|
||||||
|
// ty switch(integer only, values -1=p-type and +1=n-type)
|
||||||
|
//
|
||||||
|
// IPM instance parameter mFactor(multiplicity, implicit for LRM 2.2)
|
||||||
|
// OPP operating point parameter, includes units and description for printing
|
||||||
|
|
||||||
|
`define OPP(nam,uni,des) (* units=uni, desc=des *) real nam;
|
||||||
|
`define OPM(nam,uni,des) (* units=uni, desc=des, multiplicity="multiply" *) real nam;
|
||||||
|
`define OPD(nam,uni,des) (* units=uni, desc=des, multiplicity="divide" *) real nam;
|
||||||
|
|
||||||
|
`define MPRnb(nam,def,uni, des) (* units=uni, desc=des *) parameter real nam=def;
|
||||||
|
`define MPRex(nam,def,uni,exc, des) (* units=uni, desc=des *) parameter real nam=def exclude exc;
|
||||||
|
`define MPRcc(nam,def,uni,lwr,upr,des) (* units=uni, desc=des *) parameter real nam=def from[lwr:upr];
|
||||||
|
`define MPRoo(nam,def,uni,lwr,upr,des) (* units=uni, desc=des *) parameter real nam=def from(lwr:upr);
|
||||||
|
`define MPRco(nam,def,uni,lwr,upr,des) (* units=uni, desc=des *) parameter real nam=def from[lwr:upr);
|
||||||
|
`define MPRoc(nam,def,uni,lwr,upr,des) (* units=uni, desc=des *) parameter real nam=def from(lwr:upr];
|
||||||
|
`define MPRcz(nam,def,uni, des) (* units=uni, desc=des *) parameter real nam=def from[ 0:inf);
|
||||||
|
`define MPRoz(nam,def,uni, des) (* units=uni, desc=des *) parameter real nam=def from( 0:inf);
|
||||||
|
|
||||||
|
`define MPInb(nam,def,uni, des) (* units=uni, desc=des *) parameter integer nam=def;
|
||||||
|
`define MPIex(nam,def,uni,exc, des) (* units=uni, desc=des *) parameter integer nam=def exclude exc;
|
||||||
|
`define MPIcc(nam,def,uni,lwr,upr,des) (* units=uni, desc=des *) parameter integer nam=def from[lwr:upr];
|
||||||
|
`define MPIoo(nam,def,uni,lwr,upr,des) (* units=uni, desc=des *) parameter integer nam=def from(lwr:upr);
|
||||||
|
`define MPIco(nam,def,uni,lwr,upr,des) (* units=uni, desc=des *) parameter integer nam=def from[lwr:upr);
|
||||||
|
`define MPIoc(nam,def,uni,lwr,upr,des) (* units=uni, desc=des *) parameter integer nam=def from(lwr:upr];
|
||||||
|
`define MPIcz(nam,def,uni, des) (* units=uni, desc=des *) parameter integer nam=def from[ 0:inf);
|
||||||
|
`define MPIoz(nam,def,uni, des) (* units=uni, desc=des *) parameter integer nam=def from( 0:inf);
|
||||||
|
`define MPIsw(nam,def,uni, des) (* units=uni, desc=des *) parameter integer nam=def from[ 0: 1];
|
||||||
|
`define MPIty(nam,def,uni, des) (* units=uni, desc=des *) parameter integer nam=def from[ -1: 1] exclude 0;
|
||||||
|
`define IPRnb(nam,def,uni, des) (* units=uni, type = "instance", desc=des *) parameter real nam=def;
|
||||||
|
`define IPRex(nam,def,uni,exc, des) (* units=uni, type = "instance", desc=des *) parameter real nam=def exclude exc;
|
||||||
|
`define IPRcc(nam,def,uni,lwr,upr,des) (* units=uni, type = "instance", desc=des *) parameter real nam=def from[lwr:upr];
|
||||||
|
`define IPRoo(nam,def,uni,lwr,upr,des) (* units=uni, type = "instance", desc=des *) parameter real nam=def from(lwr:upr);
|
||||||
|
`define IPRco(nam,def,uni,lwr,upr,des) (* units=uni, type = "instance", desc=des *) parameter real nam=def from[lwr:upr);
|
||||||
|
`define IPRoc(nam,def,uni,lwr,upr,des) (* units=uni, type = "instance", desc=des *) parameter real nam=def from(lwr:upr];
|
||||||
|
`define IPRcz(nam,def,uni, des) (* units=uni, type = "instance", desc=des *) parameter real nam=def from[ 0:inf);
|
||||||
|
`define IPRoz(nam,def,uni, des) (* units=uni, type = "instance", desc=des *) parameter real nam=def from( 0:inf);
|
||||||
|
`define IPInb(nam,def,uni, des) (* units=uni, type = "instance", desc=des *) parameter integer nam=def;
|
||||||
|
`define IPIex(nam,def,uni,exc, des) (* units=uni, type = "instance", desc=des *) parameter integer nam=def exclude exc;
|
||||||
|
`define IPIcc(nam,def,uni,lwr,upr,des) (* units=uni, type = "instance", desc=des *) parameter integer nam=def from[lwr:upr];
|
||||||
|
`define IPIoo(nam,def,uni,lwr,upr,des) (* units=uni, type = "instance", desc=des *) parameter integer nam=def from(lwr:upr);
|
||||||
|
`define IPIco(nam,def,uni,lwr,upr,des) (* units=uni, type = "instance", desc=des *) parameter integer nam=def from[lwr:upr);
|
||||||
|
`define IPIoc(nam,def,uni,lwr,upr,des) (* units=uni, type = "instance", desc=des *) parameter integer nam=def from(lwr:upr];
|
||||||
|
`define IPIcz(nam,def,uni, des) (* units=uni, type = "instance", desc=des *) parameter integer nam=def from[ 0:inf);
|
||||||
|
`define IPIoz(nam,def,uni, des) (* units=uni, type = "instance", desc=des *) parameter integer nam=def from( 0:inf);
|
||||||
|
`define BPRco(nam, def, uni, lwr, upr, des) (* units = uni, type = "instance", desc = des *) parameter real nam = def from[lwr : upr);
|
||||||
|
`define BPRoz(nam, def, uni, des) (* units = uni, type = "instance", desc = des *) parameter real nam = def from(0.0 : inf);
|
||||||
|
`define BPRcz(nam, def, uni, des) (* units = uni, type = "instance", desc = des *) parameter real nam = def from[0.0 : inf);
|
||||||
|
`define BPIcc(nam, def, uni, lwr, upr, des) (* units = uni, type = "instance", desc = des *) parameter integer nam = def from[lwr : upr];
|
||||||
|
`define BPInb(nam,def,uni, des) (* units=uni, type = "instance", desc=des *) parameter integer nam=def;
|
||||||
|
`define BPRnb(nam,def,uni, des) (* units=uni, type = "instance", desc=des *) parameter real nam=def;
|
||||||
|
|
||||||
|
// includes: in case we do not want to include any other file [AB:040902]
|
||||||
|
// we can just add the following section in this file
|
||||||
|
// AB: i hope this may help our code to be easily transported
|
||||||
|
//----------------------------------------
|
||||||
|
// from disciplines.h we need:
|
||||||
|
// Electrical
|
||||||
|
// Current in amperes
|
||||||
|
nature Current
|
||||||
|
units = "A";
|
||||||
|
access = I;
|
||||||
|
idt_nature = Charge;
|
||||||
|
`ifdef CURRENT_ABSTOL
|
||||||
|
abstol = `CURRENT_ABSTOL;
|
||||||
|
`else
|
||||||
|
abstol = 1e-12;
|
||||||
|
`endif
|
||||||
|
endnature
|
||||||
|
// Charge in coulombs
|
||||||
|
nature Charge
|
||||||
|
units = "coul";
|
||||||
|
access = Q;
|
||||||
|
ddt_nature = Current;
|
||||||
|
`ifdef CHARGE_ABSTOL
|
||||||
|
abstol = `CHARGE_ABSTOL;
|
||||||
|
`else
|
||||||
|
abstol = 1e-14;
|
||||||
|
`endif
|
||||||
|
endnature
|
||||||
|
// Potential in volts
|
||||||
|
nature Voltage
|
||||||
|
units = "V";
|
||||||
|
access = V;
|
||||||
|
idt_nature = Flux;
|
||||||
|
`ifdef VOLTAGE_ABSTOL
|
||||||
|
abstol = `VOLTAGE_ABSTOL;
|
||||||
|
`else
|
||||||
|
abstol = 1e-6;
|
||||||
|
`endif
|
||||||
|
endnature
|
||||||
|
// Flux in Webers
|
||||||
|
nature Flux
|
||||||
|
units = "Wb";
|
||||||
|
access = Phi;
|
||||||
|
ddt_nature = Voltage;
|
||||||
|
`ifdef FLUX_ABSTOL
|
||||||
|
abstol = `FLUX_ABSTOL;
|
||||||
|
`else
|
||||||
|
abstol = 1e-9;
|
||||||
|
`endif
|
||||||
|
endnature
|
||||||
|
// Conservative discipline
|
||||||
|
discipline electrical
|
||||||
|
potential Voltage;
|
||||||
|
flow Current;
|
||||||
|
enddiscipline
|
||||||
|
// Signal flow disciplines
|
||||||
|
discipline voltage
|
||||||
|
potential Voltage;
|
||||||
|
enddiscipline
|
||||||
|
discipline current
|
||||||
|
potential Current;
|
||||||
|
enddiscipline
|
||||||
|
//from constants.h we need
|
||||||
|
`define C_EPSSIL 1.03594314e-10
|
||||||
|
`define C_EPSOX 34.5e-12
|
||||||
|
`define C_QE 1.602e-19
|
||||||
|
`define C_K 1.3807e-23
|
||||||
|
`define P_K 1.3806226e-23
|
||||||
|
`define P_EPS0 8.85418792394420013968e-12
|
||||||
|
`define P_CELSIUS0 273.15
|
||||||
|
`define POS_MIN 1.0E-6
|
||||||
|
`define SQRT2 1.4142135623730950488016887242097
|
||||||
|
`define ONE3RD 0.33333333333333333333333333333333
|
||||||
|
`define ONESQRT2 0.70710678118654752440084436210485
|
||||||
|
//if any other constant is needed it may be copied from the constants.h and be put above.
|
||||||
|
//------------------------------------------ end of includes
|
||||||
|
`define FWD 1
|
||||||
|
`define REV -1
|
||||||
|
// AB 040902
|
||||||
|
`define NOT_GIVEN -1.0e21
|
||||||
|
`define DEFAULT_TNOM 25
|
||||||
|
module ekv_va(d,g,s,b);
|
||||||
|
// %%DEVICE_CLASS=MOS(NMOS:TYPE=1,PMOS:TYPE=-1)%%
|
||||||
|
// Node definitions
|
||||||
|
inout d,g,s,b; // external nodes
|
||||||
|
electrical d,g,s,b; // external nodes
|
||||||
|
// Branch definitions
|
||||||
|
branch (d,s) ds;
|
||||||
|
branch (d,b) db;
|
||||||
|
branch (s,b) sb;
|
||||||
|
branch (g,b) gb;
|
||||||
|
// * Local variables
|
||||||
|
real tmp1, tmp2, tmp3; // temporary variables
|
||||||
|
real VGprime, GAMMAprime;// short and narrow channel effect
|
||||||
|
real VP, VPprime; // pinch-off voltage
|
||||||
|
real if_, ir, irprime; // normalized currents
|
||||||
|
real VDSS, VDSSprime;// saturation voltage
|
||||||
|
real deltaL, Leq; // channel length reduction
|
||||||
|
real beta; // transconductance factor
|
||||||
|
real n; // slope factor
|
||||||
|
real Ispec; // specific current
|
||||||
|
real Vt; // k*T/q
|
||||||
|
real gm, gms, gmbs, gds;
|
||||||
|
real isub, Isub;
|
||||||
|
real inv_Vt, Vt_01, Vt_2, Vt_4, Vt_Vt, Vt_Vt_2, Vt_Vt_16;
|
||||||
|
real eps_COX, eps_COX_W, eps_COX_L;
|
||||||
|
real Lc, Lc_LAMBDA, IBN_2, T0, T1, eta_qi;
|
||||||
|
real inv_UCRIT, Lc_UCRIT, Lc_IBB, IBA_IBB;
|
||||||
|
integer Mode;
|
||||||
|
real WETA_W, LETA_L;
|
||||||
|
real E0_Q_1, AWL;
|
||||||
|
real T, KP_Weff;
|
||||||
|
real Eg, refEg, deltaT, ratioT, Tnom;
|
||||||
|
real VTO_T, VTO_S, KP_T, UCRIT_T, IBB_T, PHI_T, GAMMA_S;
|
||||||
|
real sqrt_Lprime_Lmin;
|
||||||
|
real GAMMAstar, sqrt_GAMMAstar;
|
||||||
|
real big_sqrt_VP;
|
||||||
|
real big_sqrt_VP0, VP0;
|
||||||
|
real PHI_VD, PHI_VS;
|
||||||
|
real sqrt_PHI;
|
||||||
|
real sqrt_PHI_VP, sqrt_PHI_VD, sqrt_PHI_VS;
|
||||||
|
real sqrt_PHI_VD_Vt, sqrt_PHI_VS_Vt;
|
||||||
|
real Vds, deltaV_2, Vip;
|
||||||
|
real VDSS_sqrt, sqrt_VDSS_deltaV, sqrt_Vds_VDSS_deltaV;
|
||||||
|
real VDSSprime_sqrt, sqrt_VDSSprime_deltaV, sqrt_Vds_VDSSprime_deltaV;
|
||||||
|
real if_ir;
|
||||||
|
real sqrt_if, sqrt_ir, sqrt_irprime;
|
||||||
|
real dif_dv, dir_dv, dirprime_dv;
|
||||||
|
// Charge related variables
|
||||||
|
real sif, sir, sif2, sir2, sif3, sir3;
|
||||||
|
real sif_sir_2;
|
||||||
|
real qi, qb;
|
||||||
|
real QD, QS, QI, QB, QG;
|
||||||
|
real VP_PHI_eps, sqrt_PHI_VP_2, WLCox;
|
||||||
|
real n_Vt_COX, n_1, n_1_n;
|
||||||
|
// Variables used for derivatives computation
|
||||||
|
real dVP_dVD, dVP_dVG, dVP_dVS;
|
||||||
|
real dif_dVD, dif_dVS, dif_dVG;
|
||||||
|
real dir_dVD, dir_dVS, dir_dVG;
|
||||||
|
real dVDSS_dVD, dVDSS_dVG, dVDSS_dVS;
|
||||||
|
real ddeltaV_dVD, ddeltaV_dVG, ddeltaV_dVS;
|
||||||
|
real dVip_dVD, dVip_dVG, dVip_dVS;
|
||||||
|
real dVDSSprime_dVD, dVDSSprime_dVG, dVDSSprime_dVS;
|
||||||
|
real dirprime_dVD, dirprime_dVG, dirprime_dVS;
|
||||||
|
real dLeq_dVD, dLeq_dVG, dLeq_dVS;
|
||||||
|
real dbeta_dVD, dbeta_dVG, dbeta_dVS;
|
||||||
|
real VGstar, sqrt_VGstar;
|
||||||
|
real VG, VD, VS;
|
||||||
|
real Von, Vdsat, Id, Ibd;
|
||||||
|
real Gn;
|
||||||
|
real GAMMA_sqrt_PHI, Lmin, Lprime, T0_GAMMA_1, THETA_VP_1, Vc;
|
||||||
|
real Vdsprime, Vt_Vc, dGAMMAprime_dVD, dGAMMAprime_dVG, dGAMMAprime_dVS;
|
||||||
|
real dVPprime_dVD, dVPprime_dVG, dVPprime_dVS, ddeltaL_dVD, ddeltaL_dVG;
|
||||||
|
real ddeltaL_dVS, dn_dVD, dn_dVG, dn_dVS;
|
||||||
|
real log_Vc_Vt, sqrt_PHI_VP0, sqrt_VP_Vt;
|
||||||
|
real Lc_IBB_Vib, Vib, dIsub_factor, exp_ib;
|
||||||
|
real inv_Vib, sqrt_PHI_VP2_2;
|
||||||
|
real V0, deltaVFB, vL;
|
||||||
|
real dQI_dVD, dQI_dVS, dQI_dVG;
|
||||||
|
real dQB_dVD, dQB_dVS, dQB_dVG;
|
||||||
|
real Leff, Weff;
|
||||||
|
real RSeff, RDeff;
|
||||||
|
real yk, z0, zk;
|
||||||
|
real EPSOX, epssil;
|
||||||
|
real ddt_QD, ddt_QS;
|
||||||
|
//DIODES realted variables [AB: 040902]
|
||||||
|
real as_i, ad_i, ps_i, pd_i, v_di_b, v_si_b;
|
||||||
|
real temp_arg, tmp0;
|
||||||
|
real js_t, jsw_t, jswg_t;
|
||||||
|
real pb_t, pbsw_t, pbswg_t;
|
||||||
|
real cj_t, cjsw_t, cjswg_t;
|
||||||
|
real njts_t, njtssw_t, njtsswg_t;
|
||||||
|
real is_d, arg_d, is_s, arg_s;
|
||||||
|
real f_breakdown_d, f_breakdown_s, idb_tun, isb_tun;
|
||||||
|
real csb_d, cssw_d, csswg_d;
|
||||||
|
real csb_s, cssw_s, csswg_s;
|
||||||
|
real qjd, qjs;
|
||||||
|
|
||||||
|
// parameter definitions
|
||||||
|
parameter integer TYPE = 1 from [-1:1] exclude 0; // NMOS=1, PMOS=-1
|
||||||
|
parameter integer Noise = 1 from [0:1]; // Set to zero to prevent noise calculation
|
||||||
|
parameter real Trise = 0.0 from [-inf:inf]; // Difference sim. temp and device temp [C deg]
|
||||||
|
// parameter real Temp = -`NOT_GIVEN from [`P_CELSIUS0:inf]; // Device temp [C]
|
||||||
|
//AB: the parameter name Temp is not working for no obvious reason; changed to TEMP
|
||||||
|
parameter real TEMP = -`NOT_GIVEN from [`P_CELSIUS0:inf]; // Device temp [C]
|
||||||
|
parameter real TNOM = -`NOT_GIVEN; // Temperature [C]
|
||||||
|
|
||||||
|
|
||||||
|
// Instance parameters
|
||||||
|
|
||||||
|
// - intrinsic model
|
||||||
|
`IPRoz( L ,1.0e-5 ,"m" ,"Length" )
|
||||||
|
`IPRoz( W ,1.0e-5 ,"m" ,"Total width including fingers" )
|
||||||
|
`IPIco( M ,1 ,"" ,1 ,inf ,"Parallel multiplier" )
|
||||||
|
`IPIco( NS ,1 ,"" ,1 ,inf ,"Series multiplier" )
|
||||||
|
`BPRnb( DTEMP ,0.0 ,"K" ,"Offset of device temperature" )
|
||||||
|
|
||||||
|
// - external parasitics
|
||||||
|
`IPRcz( AS ,0.0 ,"m^2" ,"Source-to-substrate junction area" )
|
||||||
|
`IPRcz( AD ,0.0 ,"m^2" ,"Drain-to-substrate junction area" )
|
||||||
|
`IPRcz( PS ,0.0 ,"m" ,"Source-to-substrate junction perimeter" )
|
||||||
|
`IPRcz( PD ,0.0 ,"m" ,"Drain-to-substrate junction perimeter" )
|
||||||
|
|
||||||
|
`IPRcz( NRS ,1.0 ,"" ,"Number of squares in source" )
|
||||||
|
`IPRcz( NRD ,1.0 ,"" ,"Number of squares in drain" )
|
||||||
|
|
||||||
|
|
||||||
|
// *** Process related parameters
|
||||||
|
parameter real COX = 2.0E-3 from [0.0:inf]; // Gate oxide capacitance per unit area [F]
|
||||||
|
parameter real XJ = 300E-9 from [0.0:inf]; // Junction depth [m]
|
||||||
|
//*** Threshold voltage/substrate effect parameters (long-channel)
|
||||||
|
parameter real VTO = 0.5 from [-inf:inf]; // Long-channel threshold voltage [V]
|
||||||
|
parameter real TCV = 1.0e-3; // Threshold voltage temperature coefficient [V/K]
|
||||||
|
parameter real GAMMA = 0.7 from [0.0:inf]; // Body effect parameter
|
||||||
|
parameter real PHI = 0.5 from [0.2:inf]; // Bulk Fermi potential [V]
|
||||||
|
//*** Mobility parameters (long-channel) ***
|
||||||
|
parameter real KP = 150E-6 from [0.0:inf]; // Transconductance parameter [A/V/V]
|
||||||
|
parameter real BEX = -1.5; // Mobility temperature exponent
|
||||||
|
parameter real THETA = 0.0 from [0.0:inf]; // Mobility reduction coefficient [1/V]
|
||||||
|
parameter real E0 = 1.0E8; // Mobility reduction coefficient [V/m]
|
||||||
|
//*** Velocity sat./channel length mod. parameters (short-channel)
|
||||||
|
parameter real UCRIT = 2.0E6 from [0.0:inf]; // Longitudinal critical field [V/m]
|
||||||
|
parameter real UCEX = 0.8; // Longitudinal critical field temperature exponent
|
||||||
|
parameter real LAMBDA = 0.8 from [0.0:inf]; // Depletion length coefficient (channel length modulation)
|
||||||
|
//*** Process related parameters
|
||||||
|
parameter real DL = -0.01E-6; // Channel width correction [m]
|
||||||
|
parameter real DW = -0.01E-6; // Channel length correction [m]
|
||||||
|
//*** Threshold voltage/substrate effect parameter (narrow-channel)
|
||||||
|
parameter real WETA = 0.2 from [0.0:inf]; // Narrow-channel effect coefficient
|
||||||
|
//*** Threshold voltage/substrate effect parameters (short-channel)
|
||||||
|
parameter real LETA = 0.3 from [0.0:inf]; // Short-channel effect coefficient
|
||||||
|
parameter real Q0 = 230E-6 from [0.0:inf]; // Reverse short channel effect peak charge density
|
||||||
|
parameter real LK = 0.4E-6 from [0.0:inf]; // Reverse short channel effect characteristic length [m]
|
||||||
|
//*** Substrate current parameters
|
||||||
|
parameter real IBA = 5.0E8 from [0.0:inf]; // First impact ionization coefficient [1/m]
|
||||||
|
parameter real IBB = 4.0E8 from [0.0:inf]; // Second impact ionization coefficient [V/m]
|
||||||
|
parameter real IBBT = 9.0e-4; // Temperature coefficient for IBB [1/K]
|
||||||
|
parameter real IBN = 1.0 from [0.0:inf]; // Saturation voltage factor for impact ionization
|
||||||
|
//*** Series resistance parameters
|
||||||
|
parameter real RSH = 0.0 from [0.0:inf]; // Sheet resistance [Ohms]
|
||||||
|
parameter real HDIF = 0.5E-6 from [0.0:inf]; // Sheet resistance multipler
|
||||||
|
//*** for MC analysis fk 25/05/97
|
||||||
|
parameter real AVTO = 1E-6 from [0.0:inf]; // Area related threshold voltage mismatch parameter [Vm]
|
||||||
|
parameter real AKP = 1E-6 from [0.0:inf]; // Area related gain mismatch parameter [m]
|
||||||
|
parameter real AGAMMA = 1E-6 from [0.0:inf]; // Area related body effect mismatch parameter [sqr(V) m]
|
||||||
|
parameter real AF = 1.0 from (0:inf); // Flicker noise exponent
|
||||||
|
parameter real KF = 0.0 from [0:inf); // Flicker noise coefficient
|
||||||
|
//*** JUNCTION DRAIN-BULK AND SOURCE-BULK AREA, CURRENT, CAPACITANCE [AB:040902]
|
||||||
|
parameter real xd_n = 1.0 from [0.0:inf);
|
||||||
|
parameter real xd_js = 1.0E-09 from [0.0:inf);
|
||||||
|
parameter real xd_jsw = 1.0E-12 from [0.0:inf);
|
||||||
|
parameter real xd_jswg = 1.0E-12 from [0.0:inf);
|
||||||
|
parameter real xd_mj = 0.900 from [0.0:1.0];
|
||||||
|
parameter real xd_mjsw = 0.700 from [0.0:1.0];
|
||||||
|
parameter real xd_mjswg = 0.700 from [0.0:1.0];
|
||||||
|
parameter real xd_pb = 0.800 from (0.0:inf);
|
||||||
|
parameter real xd_pbsw = 0.600 from (0.0:inf);
|
||||||
|
parameter real xd_pbswg = 0.600 from (0.0:inf);
|
||||||
|
parameter real xd_cj = 1.0E-09 from [0.0:inf);
|
||||||
|
parameter real xd_cjsw = 1.0E-12 from [0.0:inf);
|
||||||
|
parameter real xd_cjswg = 1.0E-12 from [0.0:inf);
|
||||||
|
parameter real xd_gmin = 0.0 from [0.0:inf);
|
||||||
|
parameter real xd_xjbv = 0.0 from [0.0:inf);
|
||||||
|
parameter real xd_bv = 10.0 from [0.0:inf);
|
||||||
|
parameter real xd_njts = 1.0 from [0.0:inf);
|
||||||
|
parameter real xd_njtssw = 1.0 from [0.0:inf);
|
||||||
|
parameter real xd_njtsswg = 1.0 from [0.0:inf);
|
||||||
|
parameter real xd_vts = 0.0 from [0.0:inf);
|
||||||
|
parameter real xd_vtssw = 0.0 from [0.0:inf);
|
||||||
|
parameter real xd_vtsswg = 0.0 from [0.0:inf);
|
||||||
|
parameter real tp_xti = 3.0 from (-inf:inf);
|
||||||
|
parameter real tp_cj = 0.0 from (-inf:inf);
|
||||||
|
parameter real tp_cjsw = 0.0 from (-inf:inf);
|
||||||
|
parameter real tp_cjswg = 0.0 from (-inf:inf);
|
||||||
|
parameter real tp_pb = 0.0 from (-inf:inf);
|
||||||
|
parameter real tp_pbsw = 0.0 from (-inf:inf);
|
||||||
|
parameter real tp_pbswg = 0.0 from (-inf:inf);
|
||||||
|
parameter real tp_njts = 0.0 from [0.0:inf);
|
||||||
|
parameter real tp_njtssw = 0.0 from [0.0:inf);
|
||||||
|
parameter real tp_njtsswg = 0.0 from [0.0:inf);
|
||||||
|
analog begin
|
||||||
|
// Set constant
|
||||||
|
EPSOX = 3.9 * `P_EPS0;
|
||||||
|
epssil = 11.7 * `P_EPS0;
|
||||||
|
Ibd = 0.0;
|
||||||
|
// The following are necessary to prevent memory states being reserved:
|
||||||
|
THETA_VP_1 = 0.0;
|
||||||
|
VPprime = 0.0;
|
||||||
|
sqrt_VP_Vt = 0.0;
|
||||||
|
// Geometry, voltage and temperature independent model variables
|
||||||
|
eps_COX = epssil/COX;
|
||||||
|
Lc = sqrt(eps_COX*XJ);
|
||||||
|
Lc_LAMBDA = Lc * LAMBDA;
|
||||||
|
eps_COX_W = 3.0 * eps_COX * WETA;
|
||||||
|
eps_COX_L = eps_COX * LETA;
|
||||||
|
IBN_2 = IBN + IBN;
|
||||||
|
T0 = COX / (epssil*E0);
|
||||||
|
V0 = (Q0+Q0) / COX;
|
||||||
|
eta_qi = TYPE > 0 ? 0.5 : 0.3333333333333;
|
||||||
|
/* Model working variables, geometry and voltage independent,
|
||||||
|
* which need to be updated after temperature change
|
||||||
|
* EKV model internal variables depending on temperature.
|
||||||
|
*/
|
||||||
|
/* If Temp is explicitly specified, use that value
|
||||||
|
otherwise use Tckt+Trise */
|
||||||
|
if (TEMP == -`NOT_GIVEN) //AB: 040902 Temp -> TEMP
|
||||||
|
T = $temperature + Trise;
|
||||||
|
else
|
||||||
|
T = TEMP + `P_CELSIUS0; //AB: 040902 Temp -> TEMP
|
||||||
|
if (TNOM == -`NOT_GIVEN)
|
||||||
|
Tnom = `DEFAULT_TNOM + `P_CELSIUS0;
|
||||||
|
else
|
||||||
|
Tnom = TNOM + `P_CELSIUS0;
|
||||||
|
Vt = $vt(T);
|
||||||
|
Vt_01 = 0.1 * Vt;
|
||||||
|
inv_Vt = 1.0 / Vt;
|
||||||
|
Vt_2 = Vt + Vt;
|
||||||
|
Vt_4 = Vt_2 + Vt_2;
|
||||||
|
Vt_Vt = Vt * Vt;
|
||||||
|
Vt_Vt_2 = Vt_Vt + Vt_Vt;
|
||||||
|
Vt_Vt_16 = 16.0 * Vt_Vt;
|
||||||
|
|
||||||
|
Eg = 1.16 - 7.02e-4 * T * T / (T + 1108.0);
|
||||||
|
refEg = 1.16 - (7.02e-4*Tnom*Tnom) / (Tnom + 1108.0);
|
||||||
|
deltaT = T - Tnom;
|
||||||
|
ratioT = T / Tnom;
|
||||||
|
VTO_T = VTO - TCV * deltaT;
|
||||||
|
KP_T = KP * pow(ratioT, BEX);
|
||||||
|
UCRIT_T = UCRIT * pow(ratioT, UCEX);
|
||||||
|
IBB_T = IBB * (1.0 + IBBT * deltaT);
|
||||||
|
PHI_T = PHI * ratioT - 3.0 * Vt * ln(ratioT) - refEg * ratioT + Eg;
|
||||||
|
// !! mb 99/07/30 prevents PHI from becoming smaller than 0.2
|
||||||
|
tmp1 = 0.2;
|
||||||
|
tmp2 = PHI_T - tmp1;
|
||||||
|
PHI_T = 0.5*(tmp2 + sqrt(tmp2*tmp2 + Vt*Vt)) + tmp1;
|
||||||
|
sqrt_PHI = sqrt(PHI_T);
|
||||||
|
inv_UCRIT = 1.0/UCRIT_T;
|
||||||
|
Lc_UCRIT = Lc * UCRIT_T;
|
||||||
|
Lc_IBB = Lc * IBB_T;
|
||||||
|
IBA_IBB = IBA / IBB_T;
|
||||||
|
/* VTO, KP and GAMMA with variation for MC analysis if required.
|
||||||
|
* The default value for model parameters AVTO, AKP and AGAMMA
|
||||||
|
* is set to 1e-6 to allow meaningful sensitivity analysis. Only
|
||||||
|
* the deviation from this value has to be taken into account
|
||||||
|
*/
|
||||||
|
// wg: for userc.c and verilog implementations
|
||||||
|
Leff = L + DL;
|
||||||
|
// wg: for userc.c and verilog implementations
|
||||||
|
Weff = W + DW;
|
||||||
|
Vc = UCRIT_T*Leff; // NOTE: use L if necessary
|
||||||
|
log_Vc_Vt = Vt*(ln(0.5*Vc*inv_Vt)-0.6); // mb 98/02/05 (r1)
|
||||||
|
// de-normalization
|
||||||
|
AWL = 1.0/sqrt(Weff*Leff);
|
||||||
|
if (TYPE > 0)
|
||||||
|
VTO_S = ((AVTO != 1e-6) ? AWL*(AVTO - 1e-6) + VTO_T : VTO_T);
|
||||||
|
else
|
||||||
|
VTO_S = ((AVTO != 1e-6) ? AWL*(1e-6 - AVTO) - VTO_T: -VTO_T);
|
||||||
|
KP_Weff = Weff * ((AKP != 1e-6) ? KP_T*(1 + (AKP - 1e-6)*AWL) : KP_T);
|
||||||
|
GAMMA_S = ((AGAMMA !=1e-6) ? GAMMA + (AGAMMA - 1e-6)*AWL : GAMMA);
|
||||||
|
GAMMA_sqrt_PHI = GAMMA_S*sqrt_PHI;
|
||||||
|
/* ************************************
|
||||||
|
* STATIC MODEL EQUATIONS
|
||||||
|
* *************************************/
|
||||||
|
// VGprime:
|
||||||
|
if (V0 == 0.0)
|
||||||
|
deltaVFB = 0.0;
|
||||||
|
// else begin : VGprime //AB: 040902 VGPrime is also a variable and
|
||||||
|
else begin : VGprime_block //AB: 040902 VGPrime -> VGprime_block
|
||||||
|
real sqv;
|
||||||
|
// mb 99/03/26 corrected for multiple device number
|
||||||
|
vL = 0.28 * (Leff/(LK*NS) - 0.1);
|
||||||
|
sqv = 1.0 / (1.0 + 0.5*(vL + sqrt(vL*vL + 1.936e-3)));
|
||||||
|
deltaVFB = V0 * sqv * sqv;
|
||||||
|
end
|
||||||
|
VG = TYPE * V(g,b); // wg 22/04/08 corrected for device TYPE
|
||||||
|
VS = TYPE * V(s,b);
|
||||||
|
VD = TYPE * V(d,b);
|
||||||
|
if (VD - VS < 0) begin
|
||||||
|
Mode = `REV;
|
||||||
|
T1 = VS;
|
||||||
|
VS = VD;
|
||||||
|
VD = T1;
|
||||||
|
end
|
||||||
|
else
|
||||||
|
Mode = `FWD;
|
||||||
|
// VGB = VGS - VBS;
|
||||||
|
// VBD = VBS - VDS;
|
||||||
|
VGstar = VG - VTO_S - deltaVFB + PHI_T + GAMMA_sqrt_PHI;
|
||||||
|
sqrt_VGstar = sqrt(VGstar*VGstar + 2.0*Vt_Vt_16);
|
||||||
|
VGprime = 0.5*(VGstar + sqrt_VGstar);
|
||||||
|
// Pinch-off voltage VP, limited to VP >= -PHI
|
||||||
|
PHI_VS = PHI_T+VS;
|
||||||
|
sqrt_PHI_VS_Vt = sqrt(PHI_VS*PHI_VS+Vt_Vt_16);
|
||||||
|
sqrt_PHI_VS = sqrt(0.5*(PHI_VS+sqrt_PHI_VS_Vt));
|
||||||
|
PHI_VD = PHI_T+VD;
|
||||||
|
sqrt_PHI_VD_Vt = sqrt(PHI_VD*PHI_VD+Vt_Vt_16);
|
||||||
|
sqrt_PHI_VD = sqrt(0.5*(PHI_VD+sqrt_PHI_VD_Vt));
|
||||||
|
WETA_W = eps_COX_W * M / Weff;
|
||||||
|
LETA_L = eps_COX_L * NS / Leff;
|
||||||
|
// mb: symmetric version of GAMMAprime necessary with charges model
|
||||||
|
big_sqrt_VP0 = sqrt(VGprime + 0.25*GAMMA_S*GAMMA_S);
|
||||||
|
VP0 = VGprime - PHI_T - GAMMA_S*(big_sqrt_VP0 - 0.5*GAMMA_S);
|
||||||
|
sqrt_PHI_VP0 = sqrt(VP0+PHI_T+Vt_01);
|
||||||
|
GAMMAstar = GAMMA_S - LETA_L * (sqrt_PHI_VS+sqrt_PHI_VD) +
|
||||||
|
WETA_W * sqrt_PHI_VP0;
|
||||||
|
// keep GAMMAprime from becoming negative
|
||||||
|
sqrt_GAMMAstar = sqrt(GAMMAstar*GAMMAstar+Vt_01);
|
||||||
|
GAMMAprime = 0.5*(GAMMAstar+sqrt_GAMMAstar);
|
||||||
|
big_sqrt_VP = sqrt(VGprime+0.25*GAMMAprime*GAMMAprime);
|
||||||
|
VP = VGprime-PHI_T-GAMMAprime*(big_sqrt_VP-0.5*GAMMAprime);
|
||||||
|
// Forward normalized current:
|
||||||
|
tmp1 = (VP - VS) * inv_Vt;
|
||||||
|
if (tmp1 > -0.35) begin
|
||||||
|
z0 = 2.0/(1.3 + tmp1 - ln(tmp1 + 1.6));
|
||||||
|
zk = (2.0 + z0)/(1.0 + tmp1 + ln(z0));
|
||||||
|
yk = (1.0 + tmp1 + ln(zk))/(2.0 + zk);
|
||||||
|
end else begin
|
||||||
|
if (tmp1 > -15.0) begin
|
||||||
|
z0 = 1.55 + exp(-tmp1);
|
||||||
|
zk = (2.0 + z0)/(1.0 + tmp1 + ln(z0));
|
||||||
|
yk = (1.0 + tmp1 + ln(zk))/(2.0 + zk);
|
||||||
|
end else begin
|
||||||
|
if (tmp1 > -23.0) begin
|
||||||
|
yk = 1.0/(2.0 + exp(-tmp1));
|
||||||
|
end else begin
|
||||||
|
yk = exp(tmp1) + 1E-64;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
if_ = yk*(1.0 + yk);
|
||||||
|
sqrt_if = sqrt(if_);
|
||||||
|
dif_dv = yk;
|
||||||
|
// Saturation voltage:
|
||||||
|
Vt_Vc = Vt / Vc;
|
||||||
|
VDSS_sqrt = sqrt(0.25+sqrt_if*Vt_Vc);
|
||||||
|
VDSS = Vc*(VDSS_sqrt-0.5);
|
||||||
|
Vds = 0.5*(VD-VS);
|
||||||
|
deltaV_2 = Vt_Vt_16*(LAMBDA*(sqrt_if-
|
||||||
|
VDSS*inv_Vt)+15.625e-3);
|
||||||
|
sqrt_VDSS_deltaV = sqrt(VDSS*VDSS+deltaV_2);
|
||||||
|
sqrt_Vds_VDSS_deltaV = sqrt((Vds-VDSS)*(Vds-VDSS)+deltaV_2);
|
||||||
|
Vip = sqrt_VDSS_deltaV-sqrt_Vds_VDSS_deltaV;
|
||||||
|
VDSSprime_sqrt = sqrt(0.25+(sqrt_if-0.75*ln(if_))*Vt_Vc);
|
||||||
|
VDSSprime = Vc*(VDSSprime_sqrt-0.5)+log_Vc_Vt;
|
||||||
|
// Reverse normalized current:
|
||||||
|
Vdsprime = Vds-VDSSprime; // mb 97/07/18 introduced Vdsprime
|
||||||
|
sqrt_VDSSprime_deltaV = sqrt(VDSSprime*VDSSprime+deltaV_2);
|
||||||
|
sqrt_Vds_VDSSprime_deltaV = sqrt(Vdsprime*Vdsprime+deltaV_2);
|
||||||
|
tmp1 = (VP-Vds-VS-sqrt_VDSSprime_deltaV+
|
||||||
|
sqrt_Vds_VDSSprime_deltaV)*inv_Vt;
|
||||||
|
// include -> Charge F(x) interpolate function
|
||||||
|
if (tmp1 > -0.35) begin
|
||||||
|
z0 = 2.0/(1.3 + tmp1 - ln(tmp1 + 1.6));
|
||||||
|
zk = (2.0 + z0)/(1.0 + tmp1 + ln(z0));
|
||||||
|
yk = (1.0 + tmp1 + ln(zk))/(2.0 + zk);
|
||||||
|
end else begin
|
||||||
|
if (tmp1 > -15.0) begin
|
||||||
|
z0 = 1.55 + exp(-tmp1);
|
||||||
|
zk = (2.0 + z0)/(1.0 + tmp1 + ln(z0));
|
||||||
|
yk = (1.0 + tmp1 + ln(zk))/(2.0 + zk);
|
||||||
|
end else begin
|
||||||
|
if (tmp1 > -23.0) begin
|
||||||
|
yk = 1.0/(2.0 + exp(-tmp1));
|
||||||
|
end else begin
|
||||||
|
yk = exp(tmp1) + 1E-64;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
irprime = yk*(1.0 + yk);
|
||||||
|
sqrt_irprime = sqrt(irprime);
|
||||||
|
dirprime_dv = yk;
|
||||||
|
/* Channel length modulation & mobility reduction due
|
||||||
|
* to longitudinal field */
|
||||||
|
deltaL = Lc_LAMBDA*ln(1.0+(Vds-Vip)/Lc_UCRIT);
|
||||||
|
Lprime = Leff-deltaL+(Vds+Vip)*inv_UCRIT;
|
||||||
|
Lmin = 0.1*Leff;
|
||||||
|
sqrt_Lprime_Lmin = sqrt(Lprime*Lprime+Lmin*Lmin);
|
||||||
|
Leq = 0.5*(Lprime+sqrt_Lprime_Lmin);
|
||||||
|
// Transconductance factor:
|
||||||
|
// Mobility reduction due to vertical field
|
||||||
|
// Reverse normalized current:
|
||||||
|
// ratioV_ir
|
||||||
|
tmp1 = (VP - VD) * inv_Vt;
|
||||||
|
if (tmp1 > -0.35) begin
|
||||||
|
z0 = 2.0/(1.3 + tmp1 - ln(tmp1 + 1.6));
|
||||||
|
zk = (2.0 + z0)/(1.0 + tmp1 + ln(z0));
|
||||||
|
yk = (1.0 + tmp1 + ln(zk))/(2.0 + zk);
|
||||||
|
end else begin
|
||||||
|
if (tmp1 > -15.0) begin
|
||||||
|
z0 = 1.55 + exp(-tmp1);
|
||||||
|
zk = (2.0 + z0)/(1.0 + tmp1 + ln(z0));
|
||||||
|
yk = (1.0 + tmp1 + ln(zk))/(2.0 + zk);
|
||||||
|
end else begin
|
||||||
|
if (tmp1 > -23.0) begin
|
||||||
|
yk = 1.0/(2.0 + exp(-tmp1));
|
||||||
|
end else begin
|
||||||
|
yk = exp(tmp1) + 1E-64;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
ir = yk*(1.0 + yk);
|
||||||
|
sqrt_ir = sqrt(ir);
|
||||||
|
dir_dv = yk;
|
||||||
|
sif2 = 0.25+if_;
|
||||||
|
sir2 = 0.25+ir;
|
||||||
|
sif = sqrt(sif2);
|
||||||
|
sir = sqrt(sir2);
|
||||||
|
sif_sir_2 = (sif+sir)*(sif+sir);
|
||||||
|
VP_PHI_eps = VP+PHI_T+1.0e-6;
|
||||||
|
sqrt_PHI_VP_2 = 2.0*sqrt(VP_PHI_eps);
|
||||||
|
n_1 = GAMMA_S/sqrt_PHI_VP_2;
|
||||||
|
n_1_n = GAMMA_S/(sqrt_PHI_VP_2 + GAMMA_S);
|
||||||
|
// Normalized inversion charge (qi=QI/WLCox)
|
||||||
|
qi = -(1.0+n_1)*Vt*((0.66666666+0.66666666)*
|
||||||
|
(sir2+sir*sif+sif2)/(sif+sir) - 1.0);
|
||||||
|
// Normalized depletion charge (qb=QB/WLCox), for depletion to inversion
|
||||||
|
qb = -0.5*GAMMA_S*sqrt_PHI_VP_2 - n_1_n*qi;
|
||||||
|
if (E0 == 0.0) begin
|
||||||
|
/* NOTE: this version of the simple mobility model from prior
|
||||||
|
* versions of the EKV model is reinstated.
|
||||||
|
* In case E0 is *not* specified, this
|
||||||
|
* simple mobility model is used according to THETA, if specified.
|
||||||
|
* VPprime:
|
||||||
|
* mb eliminated discontinuity of derivative of 1+THETA*VP
|
||||||
|
*/
|
||||||
|
sqrt_VP_Vt = sqrt(VP*VP + Vt_Vt_2);
|
||||||
|
VPprime = 0.5 * (VP + sqrt_VP_Vt);
|
||||||
|
THETA_VP_1 = 1.0+THETA*VPprime;
|
||||||
|
beta = KP_Weff / (Leq * THETA_VP_1); // mb 97/07/18
|
||||||
|
end
|
||||||
|
else begin
|
||||||
|
/* new model for mobility reduction, linked to the charges model
|
||||||
|
* mb 98/10/11 (r10) introduced fabs(Eeff) (jpm)
|
||||||
|
* E0_Q_1 = 1.0 + T0 * abs(qb+eta_qi*qi);
|
||||||
|
*/
|
||||||
|
if ((qb + eta_qi*qi) > 0.0)
|
||||||
|
E0_Q_1 = 1.0 + T0*(qb + eta_qi*qi);
|
||||||
|
else
|
||||||
|
E0_Q_1 = 1.0 - T0*(qb + eta_qi*qi);
|
||||||
|
T0_GAMMA_1 = 1.0 + T0*GAMMA_sqrt_PHI;
|
||||||
|
beta = KP_Weff * T0_GAMMA_1 / (Leq * E0_Q_1);
|
||||||
|
end
|
||||||
|
/* Slope factor: mb introduced new formula to avoid divergence
|
||||||
|
* of n for VP->-PHI */
|
||||||
|
sqrt_PHI_VP = sqrt(PHI_T+VP+Vt_4); // mb 95/12/19 introduced Vt_4
|
||||||
|
n = 1.0 + GAMMA_S/(2.0*sqrt_PHI_VP);
|
||||||
|
// Drain current:
|
||||||
|
if_ir = if_-irprime;
|
||||||
|
Ispec = Vt_Vt_2 * n * beta;
|
||||||
|
Id = Ispec * if_ir;
|
||||||
|
/* Return threshold voltage
|
||||||
|
* Von = Vth(Vs) = Vto + Gamma*(sqrt(Phi + Vsb)-sqrt(Phi)) */
|
||||||
|
Von = VTO_S + GAMMAprime*(sqrt_PHI_VS - sqrt_PHI);
|
||||||
|
// Return saturation voltage (estimate)
|
||||||
|
Vdsat = Vt * (2.0*sqrt_if + 4.0);
|
||||||
|
// Return equivalent conductance for thermal noise calculation
|
||||||
|
Gn = beta * abs(qi);
|
||||||
|
/* Pinch-off voltage derivatives:
|
||||||
|
* mb 97/09/14 symmetric version of GAMMAprime necessary with
|
||||||
|
* charges model
|
||||||
|
* mb 99/05/10 (r12) New VGprime formulation (REVISION III) allows
|
||||||
|
* VP derivatives to be expressed with a single equation
|
||||||
|
*/
|
||||||
|
tmp1 = GAMMAprime / (sqrt_GAMMAstar+sqrt_GAMMAstar);
|
||||||
|
tmp2 = VGprime/sqrt_VGstar; // dVGprime_dVG
|
||||||
|
dGAMMAprime_dVD = -LETA_L * tmp1 * sqrt_PHI_VD / sqrt_PHI_VD_Vt;
|
||||||
|
dGAMMAprime_dVS = -LETA_L * tmp1 * sqrt_PHI_VS / sqrt_PHI_VS_Vt;
|
||||||
|
dGAMMAprime_dVG = WETA_W * tmp1 * (big_sqrt_VP0-0.5*GAMMA_S) /
|
||||||
|
(big_sqrt_VP0*sqrt_PHI_VP0) * tmp2;
|
||||||
|
tmp3 = (VP+PHI_T) / big_sqrt_VP;
|
||||||
|
dVP_dVD = -tmp3 * dGAMMAprime_dVD;
|
||||||
|
dVP_dVS = -tmp3 * dGAMMAprime_dVS;
|
||||||
|
dVP_dVG = -tmp3 * dGAMMAprime_dVG + (1.0 -
|
||||||
|
GAMMAprime/(big_sqrt_VP+big_sqrt_VP)) * tmp2;
|
||||||
|
// Forward normalized current derivatives:
|
||||||
|
tmp1 = dif_dv * inv_Vt; // mb 95/08/28, 97/04/21
|
||||||
|
dif_dVD = tmp1 * dVP_dVD;
|
||||||
|
dif_dVS = tmp1 * (dVP_dVS-1.0);
|
||||||
|
dif_dVG = tmp1 * dVP_dVG;
|
||||||
|
// Saturation voltage derivatives:
|
||||||
|
tmp1 = Vt / (4.0*VDSS_sqrt*sqrt_if);
|
||||||
|
dVDSS_dVD = tmp1 * dif_dVD;
|
||||||
|
dVDSS_dVS = tmp1 * dif_dVS;
|
||||||
|
dVDSS_dVG = tmp1 * dif_dVG;
|
||||||
|
// deltaV derivatives:
|
||||||
|
tmp1 = (Vt_4+Vt_4) * LAMBDA;
|
||||||
|
tmp2 = Vt / (sqrt_if+sqrt_if);
|
||||||
|
ddeltaV_dVD = tmp1 * (dif_dVD*tmp2 - dVDSS_dVD);
|
||||||
|
ddeltaV_dVS = tmp1 * (dif_dVS*tmp2 - dVDSS_dVS);
|
||||||
|
ddeltaV_dVG = tmp1 * (dif_dVG*tmp2 - dVDSS_dVG);
|
||||||
|
// Vip derivatives:
|
||||||
|
tmp1 = 1.0 / sqrt_VDSS_deltaV;
|
||||||
|
tmp2 = 1.0 / sqrt_Vds_VDSS_deltaV;
|
||||||
|
tmp3 = Vds-VDSS;
|
||||||
|
dVip_dVD = (VDSS*dVDSS_dVD + ddeltaV_dVD) * tmp1 -
|
||||||
|
(tmp3 * (0.5-dVDSS_dVD) + ddeltaV_dVD) * tmp2;
|
||||||
|
dVip_dVS = (VDSS*dVDSS_dVS + ddeltaV_dVS) * tmp1 -
|
||||||
|
(tmp3 * (-0.5-dVDSS_dVS) + ddeltaV_dVS) * tmp2;
|
||||||
|
dVip_dVG = (VDSS*dVDSS_dVG + ddeltaV_dVG) * tmp1 -
|
||||||
|
(tmp3 * -dVDSS_dVG + ddeltaV_dVG) * tmp2;
|
||||||
|
// VDSSprime derivatives:
|
||||||
|
tmp1 = Vt * (sqrt_if-1.5)/(4.0*VDSSprime_sqrt*if_);
|
||||||
|
dVDSSprime_dVD = tmp1 * dif_dVD;
|
||||||
|
dVDSSprime_dVS = tmp1 * dif_dVS;
|
||||||
|
dVDSSprime_dVG = tmp1 * dif_dVG;
|
||||||
|
// Reverse normalized current derivatives:
|
||||||
|
tmp1 = dirprime_dv * inv_Vt; // mb 95/08/28, 97/04/21
|
||||||
|
tmp2 = 1.0 / sqrt_VDSSprime_deltaV; // mb 97/04/21
|
||||||
|
tmp3 = 1.0 / sqrt_Vds_VDSSprime_deltaV;
|
||||||
|
dirprime_dVD = tmp1 * (dVP_dVD-0.5 -
|
||||||
|
(VDSSprime*dVDSSprime_dVD+ddeltaV_dVD) * tmp2 +
|
||||||
|
(Vdsprime*(0.5-dVDSSprime_dVD)+ddeltaV_dVD) * tmp3);
|
||||||
|
dirprime_dVS = tmp1 * (dVP_dVS-0.5 -
|
||||||
|
(VDSSprime*dVDSSprime_dVS+ddeltaV_dVS) * tmp2 +
|
||||||
|
(Vdsprime*(-0.5-dVDSSprime_dVS)+ddeltaV_dVS) * tmp3);
|
||||||
|
dirprime_dVG = tmp1*(dVP_dVG -
|
||||||
|
(VDSSprime*dVDSSprime_dVG+ddeltaV_dVG) * tmp2 +
|
||||||
|
(Vdsprime*(-dVDSSprime_dVG)+ddeltaV_dVG) * tmp3);
|
||||||
|
// Channel length modulation & mobility reduction derivatives:
|
||||||
|
// deltaL derivatives:
|
||||||
|
tmp1 = Lc_LAMBDA / (Lc_UCRIT+Vds-Vip);
|
||||||
|
ddeltaL_dVD = tmp1 * (0.5-dVip_dVD);
|
||||||
|
ddeltaL_dVS = tmp1 * (-0.5-dVip_dVS);
|
||||||
|
ddeltaL_dVG = -tmp1 * dVip_dVG;
|
||||||
|
// Leq derivatives:
|
||||||
|
tmp1 = 1.0 / sqrt_Lprime_Lmin; // in fact dLeq_dVX/Leq
|
||||||
|
dLeq_dVD = tmp1 * (-ddeltaL_dVD + (0.5+dVip_dVD)*inv_UCRIT);
|
||||||
|
dLeq_dVS = tmp1 * (-ddeltaL_dVS + (-0.5+dVip_dVS)*inv_UCRIT);
|
||||||
|
dLeq_dVG = tmp1 * (-ddeltaL_dVG + dVip_dVG*inv_UCRIT);
|
||||||
|
// Transconductance factor derivatives:
|
||||||
|
tmp1 = dir_dv*inv_Vt;
|
||||||
|
dir_dVD = tmp1 * (dVP_dVD-1.0);
|
||||||
|
dir_dVS = tmp1 * dVP_dVS;
|
||||||
|
dir_dVG = tmp1 * dVP_dVG;
|
||||||
|
tmp1 = -(1.0+n_1)*Vt*0.66666666/sif_sir_2;
|
||||||
|
tmp2 = tmp1*(sif+2.0*sir);
|
||||||
|
tmp3 = tmp1*(sir+2.0*sif);
|
||||||
|
tmp1 = -n_1*qi/((2.0+n_1+n_1)*VP_PHI_eps);
|
||||||
|
dQI_dVD = tmp1 * dVP_dVD + tmp2 * dif_dVD + tmp3 * dir_dVD;
|
||||||
|
dQI_dVS = tmp1 * dVP_dVS + tmp2 * dif_dVS + tmp3 * dir_dVS;
|
||||||
|
dQI_dVG = tmp1 * dVP_dVG + tmp2 * dif_dVG + tmp3 * dir_dVG;
|
||||||
|
tmp1 = (1.0+n_1)-qi/(2.0*(1.0+n_1)*VP_PHI_eps);
|
||||||
|
dQB_dVD = -n_1_n * (tmp1 * dVP_dVD + dQI_dVD);
|
||||||
|
dQB_dVS = -n_1_n * (tmp1 * dVP_dVS + dQI_dVS);
|
||||||
|
dQB_dVG = -n_1_n * (tmp1 * dVP_dVG + dQI_dVG);
|
||||||
|
if (E0 == 0.0) begin
|
||||||
|
tmp1 = THETA * VPprime / (THETA_VP_1 * sqrt_VP_Vt);
|
||||||
|
// VPprime derivatives:
|
||||||
|
dVPprime_dVD = tmp1 * dVP_dVD;
|
||||||
|
dVPprime_dVS = tmp1 * dVP_dVS;
|
||||||
|
dVPprime_dVG = tmp1 * dVP_dVG;
|
||||||
|
dbeta_dVD = -dLeq_dVD - dVPprime_dVD; // in fact dbeta_dVX / beta
|
||||||
|
dbeta_dVS = -dLeq_dVS - dVPprime_dVS;
|
||||||
|
dbeta_dVG = -dLeq_dVG - dVPprime_dVG;
|
||||||
|
end
|
||||||
|
else begin
|
||||||
|
tmp1 = T0 / E0_Q_1;
|
||||||
|
dbeta_dVD = -dLeq_dVD + tmp1 * (dQB_dVD+eta_qi*dQI_dVD);
|
||||||
|
dbeta_dVS = -dLeq_dVS + tmp1 * (dQB_dVS+eta_qi*dQI_dVS);
|
||||||
|
dbeta_dVG = -dLeq_dVG + tmp1 * (dQB_dVG+eta_qi*dQI_dVG);
|
||||||
|
end
|
||||||
|
// Slope factor derivatives:
|
||||||
|
tmp1 = -GAMMA_S/(4.0*n*sqrt_PHI_VP*(PHI_T+VP+Vt_4));// mb 95/12/19
|
||||||
|
dn_dVD = tmp1 * dVP_dVD;
|
||||||
|
dn_dVS = tmp1 * dVP_dVS;
|
||||||
|
dn_dVG = tmp1 * dVP_dVG;
|
||||||
|
// Transconductances:
|
||||||
|
gds = Ispec*((dn_dVD + dbeta_dVD)*if_ir + dif_dVD - dirprime_dVD);
|
||||||
|
gms = -Ispec*((dn_dVS + dbeta_dVS)*if_ir + dif_dVS - dirprime_dVS);
|
||||||
|
gm = Ispec*((dn_dVG + dbeta_dVG)*if_ir + dif_dVG - dirprime_dVG);
|
||||||
|
gmbs = gms - gm - gds;
|
||||||
|
// S/D resistance corrections including W and DW
|
||||||
|
RSeff = (RSH*HDIF)/(Weff-DW);
|
||||||
|
RDeff = (RSH*HDIF)/(Weff-DW);
|
||||||
|
tmp1 = 1.0/(1.0 + gms*RSeff + gds*RDeff);
|
||||||
|
Id = Id*tmp1;
|
||||||
|
/****** Impact ionization current ******
|
||||||
|
* mb 95/12/19 introduced impact ionization
|
||||||
|
* This current component is flowing from the intrinsic drain terminal
|
||||||
|
* to the bulk (for NMOS) in parallel with the junction current.
|
||||||
|
* The simulator should also take into account the corresponding
|
||||||
|
* conductances.
|
||||||
|
*/
|
||||||
|
// Substrate current:
|
||||||
|
Vib = VD-VS-IBN_2*VDSS;
|
||||||
|
if ((Vib > 0.0) && (IBA_IBB > 0.0)) begin
|
||||||
|
inv_Vib = 1.0/Vib;
|
||||||
|
Lc_IBB_Vib = -Lc_IBB*inv_Vib;
|
||||||
|
if (Lc_IBB_Vib < -35.0) // math precision check
|
||||||
|
Lc_IBB_Vib = -35.0;
|
||||||
|
exp_ib = exp(Lc_IBB_Vib);
|
||||||
|
isub = IBA_IBB*Vib*exp_ib;
|
||||||
|
Isub = isub*Id;
|
||||||
|
dIsub_factor = Isub*inv_Vib*(1.0-Lc_IBB_Vib);
|
||||||
|
end
|
||||||
|
else begin
|
||||||
|
Lc_IBB_Vib = 0.0;
|
||||||
|
Isub = 0.0;
|
||||||
|
end
|
||||||
|
// END: substrate current computation
|
||||||
|
Ibd = Ibd - Isub;
|
||||||
|
// --- Charge calculations ---
|
||||||
|
WLCox = Weff * Leff * COX;
|
||||||
|
sif3 = sif*sif2;
|
||||||
|
sir3 = sir*sir2;
|
||||||
|
tmp1 = sqrt(PHI_T + 0.5 * VP);
|
||||||
|
sqrt_PHI_VP2_2 = tmp1+tmp1;
|
||||||
|
n_Vt_COX = (1.0 + GAMMAprime/sqrt_PHI_VP2_2) * Vt*WLCox;
|
||||||
|
QD = -n_Vt_COX*(0.266666666*(3.0*sir3+6.0*sir2*sif+4.0*
|
||||||
|
sir*sif2+2.0*sif3)/sif_sir_2 - 0.5);
|
||||||
|
QS = -n_Vt_COX*(0.266666666*(3.0*sif3+6.0*sif2*sir+4.0*
|
||||||
|
sif*sir2+2.0*sir3)/sif_sir_2 - 0.5);
|
||||||
|
QI = QS + QD;
|
||||||
|
QB = WLCox * (-0.5*GAMMAprime*sqrt_PHI_VP_2 + VGprime - VGstar) -
|
||||||
|
QI*GAMMAprime/(GAMMAprime+sqrt_PHI_VP2_2);
|
||||||
|
QG = -QI -QB;
|
||||||
|
I(ds) <+ TYPE * Mode * Id; // wg 22/04/08 corrected for device TYPE
|
||||||
|
ddt_QD = ddt(QD);
|
||||||
|
ddt_QS = ddt(QS);
|
||||||
|
if (Mode == `FWD) begin
|
||||||
|
I(db) <+ TYPE * ddt_QD; // wg 22/04/08 corrected for device TYPE
|
||||||
|
I(sb) <+ TYPE * ddt_QS;
|
||||||
|
I(db) <+ TYPE * Isub;
|
||||||
|
end
|
||||||
|
else begin
|
||||||
|
I(sb) <+ TYPE * ddt_QD; // wg 22/04/08 corrected for device TYPE
|
||||||
|
I(db) <+ TYPE * ddt_QS;
|
||||||
|
I(sb) <+ TYPE * Isub;
|
||||||
|
end
|
||||||
|
I(gb) <+ TYPE * ddt(QG); // wg 22/04/08 corrected for device TYPE
|
||||||
|
// if (Noise) begin : Noise //AB: 040902 Noise is also a variable and
|
||||||
|
if (Noise) begin : Noise_block //AB: 040902 Noise -> Noise_block
|
||||||
|
real S_flicker, S_thermal;
|
||||||
|
S_thermal = 4 * `P_K * T * Gn;
|
||||||
|
S_flicker = KF * gm * gm / (Weff * NS * Leff * COX);
|
||||||
|
I(ds) <+ white_noise(S_thermal, "thermal") +
|
||||||
|
flicker_noise(S_flicker, AF, "flicker");
|
||||||
|
end
|
||||||
|
///////////////////////////////////
|
||||||
|
//EXTRINSIC PART: JUNCTION DIODES//
|
||||||
|
///////////////////////////////////
|
||||||
|
//diode area and perimeter computation
|
||||||
|
if ((AS == 0.0) && (HDIF>0.0)) as_i = 2.0*HDIF*Weff;
|
||||||
|
else as_i = AS;
|
||||||
|
if ((PS == 0.0) && (HDIF>0.0)) ps_i = 4.0*HDIF+1.0*Weff;
|
||||||
|
else ps_i = PS;
|
||||||
|
if ((AD == 0.0) && (HDIF>0.0)) ad_i = 2.0*HDIF*Weff;
|
||||||
|
else ad_i = AD;
|
||||||
|
if ((PD == 0.0) && (HDIF>0.0)) pd_i = 4.0*HDIF+1.0*Weff;
|
||||||
|
else pd_i = PD;
|
||||||
|
//temperature update for diodes
|
||||||
|
temp_arg = exp((refEg/$vt(Tnom) - Eg/Vt + tp_xti*ln(ratioT))/xd_n);
|
||||||
|
js_t = xd_js*temp_arg;
|
||||||
|
jsw_t = xd_jsw*temp_arg;
|
||||||
|
jswg_t = xd_jswg*temp_arg;
|
||||||
|
pb_t = xd_pb - tp_pb*deltaT;
|
||||||
|
pbsw_t = xd_pbsw - tp_pbsw*deltaT;
|
||||||
|
pbswg_t = xd_pbswg - tp_pbswg*deltaT;
|
||||||
|
cj_t = xd_cj*(1.0+tp_cj*deltaT);
|
||||||
|
cjsw_t = xd_cjsw*(1.0+tp_cjsw*deltaT);
|
||||||
|
cjswg_t = xd_cjswg*(1.0+tp_cjswg*deltaT);
|
||||||
|
njts_t = xd_njts*(1.0+(ratioT-1.0)*tp_njts);
|
||||||
|
njtssw_t = xd_njtssw*(1.0+(ratioT-1.0)*tp_njtssw);
|
||||||
|
njtsswg_t = xd_njtsswg*(1.0+(ratioT-1.0)*tp_njtsswg);
|
||||||
|
//DC
|
||||||
|
v_di_b = TYPE*V(d,b);
|
||||||
|
v_si_b = TYPE*V(s,b);
|
||||||
|
//DRAIN - BULK
|
||||||
|
is_d = js_t*ad_i+jsw_t*pd_i+jswg_t*Weff;
|
||||||
|
arg_d = -v_di_b*ratioT/(Vt*xd_n);
|
||||||
|
if (arg_d < -40.0) arg_d = -40.0;
|
||||||
|
tmp0 = (-v_di_b+xd_bv)*ratioT/(Vt*xd_n);
|
||||||
|
if (tmp0>70) f_breakdown_d = 1.0;
|
||||||
|
else f_breakdown_d = 1.0 + xd_xjbv*exp(-tmp0);
|
||||||
|
// TRAP-ASSISTED TUNNELING CURRENT
|
||||||
|
idb_tun = -Weff*jswg_t*(exp(v_di_b*ratioT/(Vt*njtsswg_t) * xd_vtsswg/max(xd_vtsswg+v_di_b,1.0e-3))-1.0);
|
||||||
|
idb_tun = idb_tun - pd_i*jsw_t*(exp(v_di_b*ratioT/(Vt*njtssw_t) * xd_vtssw/max(xd_vtssw+v_di_b,1.0e-3))-1.0);
|
||||||
|
idb_tun = idb_tun - ad_i*js_t*(exp(v_di_b*ratioT/(Vt*njts_t) * xd_vts/max(xd_vts+v_di_b,1.0e-3))-1.0);
|
||||||
|
I(d,b) <+ (is_d * (1.0 - exp(arg_d))*f_breakdown_d+v_di_b*xd_gmin + idb_tun)*TYPE*M;
|
||||||
|
//SOURCE - BULK
|
||||||
|
is_s = js_t*as_i+jsw_t*ps_i+jswg_t*Weff;
|
||||||
|
arg_s = -v_si_b*ratioT/(Vt*xd_n);
|
||||||
|
if (arg_s < -40.0) arg_s = -40.0;
|
||||||
|
tmp0 = (-v_si_b+xd_bv)*ratioT/(Vt*xd_n);
|
||||||
|
if (tmp0>70) f_breakdown_s = 1.0;
|
||||||
|
else f_breakdown_s = 1.0 + xd_xjbv*exp(-tmp0);
|
||||||
|
// TRAP-ASSISTED TUNNELING CURRENT
|
||||||
|
isb_tun = -Weff*jswg_t*(exp(v_si_b*ratioT/(Vt*njtsswg_t) * xd_vtsswg/max(xd_vtsswg+v_si_b,1.0e-3))-1.0);
|
||||||
|
isb_tun = isb_tun - ps_i*jsw_t*(exp(v_si_b*ratioT/(Vt*njtssw_t) * xd_vtssw/max(xd_vtssw+v_si_b,1.0e-3))-1.0);
|
||||||
|
isb_tun = isb_tun - as_i*js_t*(exp(v_si_b*ratioT/(Vt*njts_t) * xd_vts/max(xd_vts+v_si_b,1.0e-3))-1.0);
|
||||||
|
I(s,b) <+ (is_s * (1.0 - exp(arg_s))*f_breakdown_s+v_si_b*xd_gmin + isb_tun)*TYPE*M;
|
||||||
|
//AC
|
||||||
|
|
||||||
|
//DRAIN - BULK
|
||||||
|
if (v_di_b>0.0)
|
||||||
|
begin
|
||||||
|
csb_d = cj_t * ad_i * exp(-xd_mj*ln(1.0+v_di_b/pb_t));
|
||||||
|
cssw_d = cjsw_t * pd_i * exp(-xd_mjsw*ln(1.0+v_di_b/pbsw_t));
|
||||||
|
csswg_d = cjswg_t * Weff * exp(-xd_mjswg*ln(1.0+v_di_b/pbswg_t));
|
||||||
|
end
|
||||||
|
else
|
||||||
|
begin
|
||||||
|
csb_d = cj_t * ad_i * (1.0 - xd_mj*v_di_b/pb_t);
|
||||||
|
cssw_d = cjsw_t * pd_i * (1.0 - xd_mjsw*v_di_b/pbsw_t);
|
||||||
|
csswg_d = cjswg_t * Weff * (1.0 - xd_mjswg*v_di_b/pbswg_t);
|
||||||
|
end
|
||||||
|
qjd = (csb_d+cssw_d+csswg_d) * v_di_b;
|
||||||
|
I(d,b) <+ ddt(qjd)*TYPE*M;
|
||||||
|
//SOURCE - BULK
|
||||||
|
if (v_si_b>0.0)
|
||||||
|
begin
|
||||||
|
csb_s = cj_t * as_i * exp(-xd_mj*ln(1.0+v_si_b/pb_t));
|
||||||
|
cssw_s = cjsw_t * ps_i * exp(-xd_mjsw*ln(1.0+v_si_b/pbsw_t));
|
||||||
|
csswg_s = cjswg_t * Weff * exp(-xd_mjswg*ln(1.0+v_si_b/pbswg_t));
|
||||||
|
end
|
||||||
|
else
|
||||||
|
begin
|
||||||
|
csb_s = cj_t * as_i * (1.0 - xd_mj*v_si_b/pb_t);
|
||||||
|
cssw_s = cjsw_t * ps_i * (1.0 - xd_mjsw*v_si_b/pbsw_t);
|
||||||
|
csswg_s = cjswg_t * Weff * (1.0 - xd_mjswg*v_si_b/pbswg_t);
|
||||||
|
end
|
||||||
|
qjs = (csb_s+cssw_s+csswg_s) * v_si_b;
|
||||||
|
I(s,b) <+ ddt(qjs)*TYPE*M;
|
||||||
|
//END OF DIODES
|
||||||
|
end
|
||||||
|
endmodule
|
||||||
|
|
@ -1,5 +1,6 @@
|
||||||
Model the rossler attractor
|
Model the rossler attractor
|
||||||
*https://www.glensstuff.com/rosslerattractor/rossler.htm
|
*https://www.glensstuff.com/rosslerattractor/rossler.htm
|
||||||
|
* provided by Giles Atkinson
|
||||||
|
|
||||||
.param a=0.2 b=0.2 c=5.7
|
.param a=0.2 b=0.2 c=5.7
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
## Process this file with automake to produce Makefile.in
|
## Process this file with automake to produce Makefile.in
|
||||||
|
|
||||||
SUBDIRS = include/ngspice include/cppduals/duals misc maths frontend spicelib
|
SUBDIRS = include/ngspice include/cppduals/duals misc maths frontend spicelib
|
||||||
DIST_SUBDIRS = include/ngspice include/cppduals/duals misc maths frontend spicelib xspice ciderlib
|
DIST_SUBDIRS = include/ngspice include/cppduals/duals misc maths frontend spicelib xspice ciderlib osdi
|
||||||
|
|
||||||
if XSPICE_WANTED
|
if XSPICE_WANTED
|
||||||
SUBDIRS += xspice
|
SUBDIRS += xspice
|
||||||
|
|
@ -593,8 +593,9 @@ libngspice_la_LIBADD += \
|
||||||
ciderlib/support/libcidersuprt.la
|
ciderlib/support/libcidersuprt.la
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
if OSDI_WANTED
|
||||||
libngspice_la_LIBADD += osdi/libosdi.la
|
libngspice_la_LIBADD += osdi/libosdi.la
|
||||||
|
endif
|
||||||
|
|
||||||
libngspice_la_LIBADD += \
|
libngspice_la_LIBADD += \
|
||||||
maths/deriv/libderiv.la \
|
maths/deriv/libderiv.la \
|
||||||
|
|
|
||||||
|
|
@ -137,7 +137,6 @@ libfte_la_SOURCES = \
|
||||||
linear.c \
|
linear.c \
|
||||||
linear.h \
|
linear.h \
|
||||||
logicexp.c \
|
logicexp.c \
|
||||||
logicexp.h \
|
|
||||||
measure.c \
|
measure.c \
|
||||||
misccoms.c \
|
misccoms.c \
|
||||||
misccoms.h \
|
misccoms.h \
|
||||||
|
|
@ -187,7 +186,6 @@ libfte_la_SOURCES = \
|
||||||
typesdef.c \
|
typesdef.c \
|
||||||
typesdef.h \
|
typesdef.h \
|
||||||
udevices.c \
|
udevices.c \
|
||||||
udevices.h \
|
|
||||||
vectors.c \
|
vectors.c \
|
||||||
vectors.h \
|
vectors.h \
|
||||||
where.c \
|
where.c \
|
||||||
|
|
|
||||||
|
|
@ -427,12 +427,7 @@ com_measure_when(
|
||||||
value = get_value(meas, d, i); //d->v_compdata[i].cx_real;
|
value = get_value(meas, d, i); //d->v_compdata[i].cx_real;
|
||||||
else
|
else
|
||||||
value = d->v_realdata[i];
|
value = d->v_realdata[i];
|
||||||
if (dScale->v_compdata)
|
scaleValue = dScale->v_compdata[i].cx_real;
|
||||||
scaleValue = dScale->v_compdata[i].cx_real;
|
|
||||||
else {
|
|
||||||
fprintf(cp_err, "Error: no valid frequency scale for 'meas ac ...'\n");
|
|
||||||
return MEASUREMENT_FAILURE;
|
|
||||||
}
|
|
||||||
} else if (sp_check) {
|
} else if (sp_check) {
|
||||||
if (d->v_compdata)
|
if (d->v_compdata)
|
||||||
value = get_value(meas, d, i); //d->v_compdata[i].cx_real;
|
value = get_value(meas, d, i); //d->v_compdata[i].cx_real;
|
||||||
|
|
@ -685,12 +680,7 @@ measure_at(
|
||||||
value = d->v_realdata[i];
|
value = d->v_realdata[i];
|
||||||
// fprintf(cp_err, "Warning: 'meas ac' input vector is real!\n");
|
// fprintf(cp_err, "Warning: 'meas ac' input vector is real!\n");
|
||||||
}
|
}
|
||||||
if (dScale->v_compdata)
|
svalue = dScale->v_compdata[i].cx_real;
|
||||||
svalue = dScale->v_compdata[i].cx_real;
|
|
||||||
else {
|
|
||||||
fprintf(cp_err, "Error: no valid frequency scale for 'meas ac ...'\n");
|
|
||||||
return MEASUREMENT_FAILURE;
|
|
||||||
}
|
|
||||||
} else if (sp_check) {
|
} else if (sp_check) {
|
||||||
if (d->v_compdata)
|
if (d->v_compdata)
|
||||||
value = get_value(meas, d, i); //d->v_compdata[i].cx_real;
|
value = get_value(meas, d, i); //d->v_compdata[i].cx_real;
|
||||||
|
|
@ -792,12 +782,7 @@ measure_minMaxAvg(
|
||||||
value = d->v_realdata[i];
|
value = d->v_realdata[i];
|
||||||
// fprintf(cp_err, "Warning: 'meas ac' input vector is real!\n");
|
// fprintf(cp_err, "Warning: 'meas ac' input vector is real!\n");
|
||||||
}
|
}
|
||||||
if (dScale->v_compdata)
|
svalue = dScale->v_compdata[i].cx_real;
|
||||||
svalue = dScale->v_compdata[i].cx_real;
|
|
||||||
else {
|
|
||||||
fprintf(cp_err, "Error: no valid frequency scale for 'meas ac ...'\n");
|
|
||||||
return MEASUREMENT_FAILURE;
|
|
||||||
}
|
|
||||||
} else if (sp_check) {
|
} else if (sp_check) {
|
||||||
if (d->v_compdata)
|
if (d->v_compdata)
|
||||||
value = get_value(meas, d, i); //d->v_compdata[i].cx_real;
|
value = get_value(meas, d, i); //d->v_compdata[i].cx_real;
|
||||||
|
|
|
||||||
|
|
@ -1907,10 +1907,10 @@ void create_circbyline(char *line, bool reset, bool lastline)
|
||||||
}
|
}
|
||||||
|
|
||||||
char *p_src = skip_ws(line);
|
char *p_src = skip_ws(line);
|
||||||
/* return if line is empty */
|
/* An empty line may have been received. Skip it. */
|
||||||
if (*p_src == '\0')
|
if (*p_src == '\0') {
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
/* Remove any leading whitespace by shifting */
|
/* Remove any leading whitespace by shifting */
|
||||||
if (p_src != line) {
|
if (p_src != line) {
|
||||||
char *p_dst = line;
|
char *p_dst = line;
|
||||||
|
|
|
||||||
|
|
@ -1030,10 +1030,17 @@ static char *get_terminal_name(char* element, char *numberstr, NGHASHPTR instanc
|
||||||
for (i = 0; i <= numnodes; i++)
|
for (i = 0; i <= numnodes; i++)
|
||||||
thisline = nexttok(thisline);
|
thisline = nexttok(thisline);
|
||||||
subcktname = gettok(&thisline);
|
subcktname = gettok(&thisline);
|
||||||
|
|
||||||
/*Search for the corresponding .subckt line*/
|
/*Search for the corresponding .subckt line*/
|
||||||
struct card_assoc* allsubs = xcard->level->subckts;
|
struct card_assoc* allsubs = xcard->level->subckts;
|
||||||
|
|
||||||
while (allsubs) {
|
while (allsubs) {
|
||||||
xcardsubsline = allsubs->line->line;
|
xcardsubsline = allsubs->line->line;
|
||||||
|
/* safeguard against NULL pointers) */
|
||||||
|
if (!subcktname || !allsubs->name) {
|
||||||
|
tfree(subcktname);
|
||||||
|
return tprintf("n%s", numberstr);
|
||||||
|
}
|
||||||
if (cieq(subcktname, allsubs->name))
|
if (cieq(subcktname, allsubs->name))
|
||||||
break;
|
break;
|
||||||
allsubs = allsubs->next;
|
allsubs = allsubs->next;
|
||||||
|
|
@ -1230,7 +1237,7 @@ static char* get_terminal_number(char* element, char* namestr)
|
||||||
Called from inp.c*/
|
Called from inp.c*/
|
||||||
void modprobenames(INPtables* tab) {
|
void modprobenames(INPtables* tab) {
|
||||||
GENinstance* GENinst;
|
GENinstance* GENinst;
|
||||||
if (tab->defVmod) {
|
if (tab && tab->defVmod && tab->defVmod->GENinstances) {
|
||||||
for (GENinst = tab->defVmod->GENinstances; GENinst; GENinst = GENinst->GENnextInstance) {
|
for (GENinst = tab->defVmod->GENinstances; GENinst; GENinst = GENinst->GENnextInstance) {
|
||||||
char* name = GENinst->GENname;
|
char* name = GENinst->GENname;
|
||||||
if (prefix("vcurr_", name)) {
|
if (prefix("vcurr_", name)) {
|
||||||
|
|
|
||||||
|
|
@ -2490,6 +2490,8 @@ static int is_a_modelname(char *s, const char* line)
|
||||||
case 'P':
|
case 'P':
|
||||||
case 'f':
|
case 'f':
|
||||||
case 'F':
|
case 'F':
|
||||||
|
case 'a':
|
||||||
|
case 'A':
|
||||||
st = st + 1;
|
st = st + 1;
|
||||||
break;
|
break;
|
||||||
case 'm':
|
case 'm':
|
||||||
|
|
@ -4534,9 +4536,24 @@ static int inp_get_param_level(
|
||||||
int param_num, struct dependency *deps, int num_params)
|
int param_num, struct dependency *deps, int num_params)
|
||||||
{
|
{
|
||||||
int i, k, l, level = 0;
|
int i, k, l, level = 0;
|
||||||
|
static int recounter = 0;
|
||||||
|
recounter++;
|
||||||
|
|
||||||
if (deps[param_num].level != -1)
|
if (recounter > 1000) { /* magic number 1000: if larger, stack overflow occurs */
|
||||||
|
fprintf(stderr,
|
||||||
|
"ERROR: A level depth greater 1000 for dependent parameters is not supported!\n");
|
||||||
|
fprintf(stderr,
|
||||||
|
" You probably do have a circular parameter dependency at line\n");
|
||||||
|
fprintf(stderr,
|
||||||
|
" %s\n", deps[param_num].card->line);
|
||||||
|
recounter = 0;
|
||||||
|
controlled_exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (deps[param_num].level != -1) {
|
||||||
|
recounter = 0;
|
||||||
return deps[param_num].level;
|
return deps[param_num].level;
|
||||||
|
}
|
||||||
|
|
||||||
for (i = 0; deps[param_num].depends_on[i]; i++) {
|
for (i = 0; deps[param_num].depends_on[i]; i++) {
|
||||||
|
|
||||||
|
|
@ -4548,6 +4565,7 @@ static int inp_get_param_level(
|
||||||
fprintf(stderr,
|
fprintf(stderr,
|
||||||
"ERROR: unable to find dependency parameter for %s!\n",
|
"ERROR: unable to find dependency parameter for %s!\n",
|
||||||
deps[param_num].param_name);
|
deps[param_num].param_name);
|
||||||
|
recounter = 0;
|
||||||
controlled_exit(EXIT_FAILURE);
|
controlled_exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -4558,6 +4576,7 @@ static int inp_get_param_level(
|
||||||
}
|
}
|
||||||
|
|
||||||
deps[param_num].level = level;
|
deps[param_num].level = level;
|
||||||
|
recounter = 0;
|
||||||
|
|
||||||
return level;
|
return level;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -273,6 +273,9 @@ com_version(wordlist *wl)
|
||||||
#endif
|
#endif
|
||||||
#ifdef EXP_DEV
|
#ifdef EXP_DEV
|
||||||
fprintf(cp_out, "** Experimental devices enabled.\n");
|
fprintf(cp_out, "** Experimental devices enabled.\n");
|
||||||
|
#endif
|
||||||
|
#ifdef SHARED_MODULE
|
||||||
|
fprintf(cp_out, "** ngspice shared library.\n");
|
||||||
#endif
|
#endif
|
||||||
fprintf(cp_out, "******\n");
|
fprintf(cp_out, "******\n");
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -610,6 +610,7 @@ parseunit(const char *s)
|
||||||
case 'N': return 1e-9;
|
case 'N': return 1e-9;
|
||||||
case 'P': return 1e-12;
|
case 'P': return 1e-12;
|
||||||
case 'F': return 1e-15;
|
case 'F': return 1e-15;
|
||||||
|
case 'A': return 1e-18;
|
||||||
default : return 1;
|
default : return 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -95,6 +95,11 @@ int ft_numparse(char **p_str, bool whole, double *p_val)
|
||||||
expo = -15.0;
|
expo = -15.0;
|
||||||
++p_cur;
|
++p_cur;
|
||||||
break;
|
break;
|
||||||
|
case 'a':
|
||||||
|
case 'A':
|
||||||
|
expo = -18.0;
|
||||||
|
++p_cur;
|
||||||
|
break;
|
||||||
case 'm':
|
case 'm':
|
||||||
case 'M': {
|
case 'M': {
|
||||||
char ch_cur;
|
char ch_cur;
|
||||||
|
|
|
||||||
|
|
@ -639,12 +639,12 @@ lingrid(GRAPH *graph, double lo, double hi, double delta, int type, Axis axis)
|
||||||
dd[1] = hi;
|
dd[1] = hi;
|
||||||
|
|
||||||
/* Reset the max coordinate to deal with round-off error. */
|
/* Reset the max coordinate to deal with round-off error. */
|
||||||
if (nsp) {
|
if (nsp && (delta == 0.0)) {
|
||||||
if (axis == x_axis)
|
if (axis == x_axis)
|
||||||
graph->viewport.width = (int)(spacing * nsp);
|
graph->viewport.width = (int)(spacing * nsp);
|
||||||
else
|
else
|
||||||
graph->viewport.height = (int)(spacing * nsp);
|
graph->viewport.height = (int)(spacing * nsp);
|
||||||
} else {
|
} else if (!nsp) {
|
||||||
nsp = 1;
|
nsp = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -62,6 +62,7 @@ noinst_HEADERS = \
|
||||||
ipcproto.h \
|
ipcproto.h \
|
||||||
ipctiein.h \
|
ipctiein.h \
|
||||||
jobdefs.h \
|
jobdefs.h \
|
||||||
|
logicexp.h \
|
||||||
lsort.h \
|
lsort.h \
|
||||||
macros.h \
|
macros.h \
|
||||||
material.h \
|
material.h \
|
||||||
|
|
@ -92,6 +93,7 @@ noinst_HEADERS = \
|
||||||
opdefs.h \
|
opdefs.h \
|
||||||
optdefs.h \
|
optdefs.h \
|
||||||
optndefs.h \
|
optndefs.h \
|
||||||
|
osdiitf.h \
|
||||||
outpdefs.h \
|
outpdefs.h \
|
||||||
plot.h \
|
plot.h \
|
||||||
pnode.h \
|
pnode.h \
|
||||||
|
|
@ -119,6 +121,7 @@ noinst_HEADERS = \
|
||||||
twodev.h \
|
twodev.h \
|
||||||
twomesh.h \
|
twomesh.h \
|
||||||
typedefs.h \
|
typedefs.h \
|
||||||
|
udevices.h \
|
||||||
wordlist.h \
|
wordlist.h \
|
||||||
1-f-code.h \
|
1-f-code.h \
|
||||||
FastNorm3.h \
|
FastNorm3.h \
|
||||||
|
|
|
||||||
|
|
@ -97,7 +97,7 @@ are of type bool if sharedspice.h is used externally.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef NGSPICE_PACKAGE_VERSION
|
#ifndef NGSPICE_PACKAGE_VERSION
|
||||||
#define NGSPICE_PACKAGE_VERSION "38+"
|
#define NGSPICE_PACKAGE_VERSION "39"
|
||||||
#endif
|
#endif
|
||||||
/* we have NG_BOOL instead of BOOL */
|
/* we have NG_BOOL instead of BOOL */
|
||||||
#ifndef HAS_NG_BOOL
|
#ifndef HAS_NG_BOOL
|
||||||
|
|
|
||||||
|
|
@ -12,7 +12,6 @@ libosdi_la_SOURCES = \
|
||||||
osdiparam.c \
|
osdiparam.c \
|
||||||
osdiregistry.c \
|
osdiregistry.c \
|
||||||
osdisetup.c \
|
osdisetup.c \
|
||||||
osdiitf.h \
|
|
||||||
osditrunc.c \
|
osditrunc.c \
|
||||||
osdipzld.c \
|
osdipzld.c \
|
||||||
osdicallbacks.c
|
osdicallbacks.c
|
||||||
|
|
|
||||||
|
|
@ -50,6 +50,18 @@ double osdi_pnjlim(bool init, bool *check, double vnew, double vold, double vt,
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
double osdi_typedpnjlim(bool init, bool *check, double vnew, double vold, double vt,
|
||||||
|
double vcrit, double type) {
|
||||||
|
if (init) {
|
||||||
|
*check = true;
|
||||||
|
return vcrit;
|
||||||
|
}
|
||||||
|
int icheck = 0;
|
||||||
|
double res = DEVpnjlim(type*vnew, vold, vt, vcrit, &icheck);
|
||||||
|
*check = icheck != 0;
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
double osdi_limvds(bool init, bool *check, double vnew, double vold) {
|
double osdi_limvds(bool init, bool *check, double vnew, double vold) {
|
||||||
if (init) {
|
if (init) {
|
||||||
*check = true;
|
*check = true;
|
||||||
|
|
|
||||||
|
|
@ -25,6 +25,9 @@
|
||||||
|
|
||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
#ifndef _MSC_VER
|
||||||
|
#include <stdalign.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef _MSC_VER
|
#ifdef _MSC_VER
|
||||||
typedef struct {
|
typedef struct {
|
||||||
|
|
@ -44,7 +47,7 @@ typedef struct {
|
||||||
#ifdef _MSC_VER
|
#ifdef _MSC_VER
|
||||||
#define MAX_ALIGN 8
|
#define MAX_ALIGN 8
|
||||||
#else
|
#else
|
||||||
#define MAX_ALIGN sizeof(max_align_t)
|
#define MAX_ALIGN alignof(max_align_t)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -93,7 +96,8 @@ typedef void (*osdi_log_ptr)(void *handle, char *msg, uint32_t lvl);
|
||||||
|
|
||||||
double osdi_pnjlim(bool init, bool *icheck, double vnew, double vold, double vt,
|
double osdi_pnjlim(bool init, bool *icheck, double vnew, double vold, double vt,
|
||||||
double vcrit);
|
double vcrit);
|
||||||
|
double osdi_typedpnjlim(bool init, bool *icheck, double vnew, double vold, double vt,
|
||||||
|
double vcrit, double type);
|
||||||
double osdi_limvds(bool init, bool *icheck, double vnew, double vold);
|
double osdi_limvds(bool init, bool *icheck, double vnew, double vold);
|
||||||
double osdi_limitlog(bool init, bool *icheck, double vnew, double vold,
|
double osdi_limitlog(bool init, bool *icheck, double vnew, double vold,
|
||||||
double LIM_TOL);
|
double LIM_TOL);
|
||||||
|
|
|
||||||
|
|
@ -65,7 +65,7 @@ static int write_param_info(IFparm **dst, const OsdiDescriptor *descr,
|
||||||
|
|
||||||
for (uint32_t j = 0; j < num_names; j++) {
|
for (uint32_t j = 0; j < num_names; j++) {
|
||||||
if (j != 0) {
|
if (j != 0) {
|
||||||
dataType = IF_UNINTERESTING;
|
dataType |= IF_UNINTERESTING;
|
||||||
}
|
}
|
||||||
char *para_name = copy(para->name[j]);
|
char *para_name = copy(para->name[j]);
|
||||||
strtolower(para_name);
|
strtolower(para_name);
|
||||||
|
|
|
||||||
|
|
@ -338,6 +338,7 @@ extern OsdiObjectFile load_object_file(const char *input) {
|
||||||
for (uint32_t i = 0; i < lim_table_len; i++) {
|
for (uint32_t i = 0; i < lim_table_len; i++) {
|
||||||
int expected_args = -1;
|
int expected_args = -1;
|
||||||
IS_LIM_FUN("pnjlim", 2, osdi_pnjlim)
|
IS_LIM_FUN("pnjlim", 2, osdi_pnjlim)
|
||||||
|
IS_LIM_FUN("typedpnjlim", 3, osdi_typedpnjlim)
|
||||||
IS_LIM_FUN("limvds", 0, osdi_limvds)
|
IS_LIM_FUN("limvds", 0, osdi_limvds)
|
||||||
IS_LIM_FUN("fetlim", 1, osdi_fetlim)
|
IS_LIM_FUN("fetlim", 1, osdi_fetlim)
|
||||||
IS_LIM_FUN("limitlog", 1, osdi_limitlog)
|
IS_LIM_FUN("limitlog", 1, osdi_limitlog)
|
||||||
|
|
|
||||||
|
|
@ -169,6 +169,10 @@ INPevaluate(char **line, int *error, int gobble)
|
||||||
case 'F':
|
case 'F':
|
||||||
expo1 = expo1 - 15;
|
expo1 = expo1 - 15;
|
||||||
break;
|
break;
|
||||||
|
case 'a':
|
||||||
|
case 'A':
|
||||||
|
expo1 = expo1 - 18;
|
||||||
|
break;
|
||||||
case 'm':
|
case 'm':
|
||||||
case 'M':
|
case 'M':
|
||||||
if (((here[1] == 'E') || (here[1] == 'e')) &&
|
if (((here[1] == 'E') || (here[1] == 'e')) &&
|
||||||
|
|
@ -626,6 +630,10 @@ INPevaluateRKM_C(char** line, int* error, int gobble)
|
||||||
expo1 = expo1 - 15;
|
expo1 = expo1 - 15;
|
||||||
hasmulti = TRUE;
|
hasmulti = TRUE;
|
||||||
break;
|
break;
|
||||||
|
case 'a':
|
||||||
|
case 'A':
|
||||||
|
expo1 = expo1 - 18;
|
||||||
|
break;
|
||||||
case 'm':
|
case 'm':
|
||||||
case 'M':
|
case 'M':
|
||||||
if (((here[1] == 'E') || (here[1] == 'e')) &&
|
if (((here[1] == 'E') || (here[1] == 'e')) &&
|
||||||
|
|
@ -860,6 +868,10 @@ INPevaluateRKM_L(char** line, int* error, int gobble)
|
||||||
expo1 = expo1 - 15;
|
expo1 = expo1 - 15;
|
||||||
hasmulti = TRUE;
|
hasmulti = TRUE;
|
||||||
break;
|
break;
|
||||||
|
case 'a':
|
||||||
|
case 'A':
|
||||||
|
expo1 = expo1 - 18;
|
||||||
|
break;
|
||||||
case 'm':
|
case 'm':
|
||||||
case 'M':
|
case 'M':
|
||||||
if (((here[1] == 'E') || (here[1] == 'e')) &&
|
if (((here[1] == 'E') || (here[1] == 'e')) &&
|
||||||
|
|
|
||||||
|
|
@ -195,15 +195,10 @@ static struct card *expand_deck(struct card *head)
|
||||||
struct card *card, *next;
|
struct card *card, *next;
|
||||||
char **pointers;
|
char **pointers;
|
||||||
int i, dico;
|
int i, dico;
|
||||||
bool save_debug;
|
|
||||||
|
|
||||||
/* Save the current parameter symbol table and debug global.
|
/* Save the current parameter symbol table. */
|
||||||
* Prevent overwriting of debug output in inp_readall().
|
|
||||||
*/
|
|
||||||
|
|
||||||
dico = nupa_add_dicoslist();
|
dico = nupa_add_dicoslist();
|
||||||
save_debug = ft_ngdebug;
|
|
||||||
ft_ngdebug = FALSE;
|
|
||||||
|
|
||||||
/* Count the cards, allocate and fill a pointer array. */
|
/* Count the cards, allocate and fill a pointer array. */
|
||||||
|
|
||||||
|
|
@ -226,7 +221,6 @@ static struct card *expand_deck(struct card *head)
|
||||||
circarray = pointers;
|
circarray = pointers;
|
||||||
card = inp_readall(NULL, Infile_Path, FALSE, TRUE, NULL);
|
card = inp_readall(NULL, Infile_Path, FALSE, TRUE, NULL);
|
||||||
card = inp_subcktexpand(card);
|
card = inp_subcktexpand(card);
|
||||||
ft_ngdebug = save_debug;
|
|
||||||
|
|
||||||
/* Destroy the parameter table that was created in subcircuit/parameter
|
/* Destroy the parameter table that was created in subcircuit/parameter
|
||||||
* expansion and restore the previous version.
|
* expansion and restore the previous version.
|
||||||
|
|
|
||||||
|
|
@ -429,6 +429,10 @@ double *p_value ) /* OUT - The numerical value */
|
||||||
scale_factor = 1.0e-15;
|
scale_factor = 1.0e-15;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case 'a':
|
||||||
|
scale_factor = 1.0e-18;
|
||||||
|
break;
|
||||||
|
|
||||||
case 'm':
|
case 'm':
|
||||||
i++;
|
i++;
|
||||||
if(i >= len) {
|
if(i >= len) {
|
||||||
|
|
|
||||||
|
|
@ -441,6 +441,10 @@ double *p_value ) /* OUT - The numerical value */
|
||||||
scale_factor = 1.0e-15;
|
scale_factor = 1.0e-15;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case 'a':
|
||||||
|
scale_factor = 1.0e-18;
|
||||||
|
break;
|
||||||
|
|
||||||
case 'm':
|
case 'm':
|
||||||
i++;
|
i++;
|
||||||
if(i >= len) {
|
if(i >= len) {
|
||||||
|
|
|
||||||
|
|
@ -567,13 +567,9 @@ MIF_INP2A (
|
||||||
|
|
||||||
param_info = &(DEVices[type]->DEVpublic.param[i]);
|
param_info = &(DEVices[type]->DEVpublic.param[i]);
|
||||||
|
|
||||||
/* Don't check for model iron core with hysteresis (type 110) due to always missing defaults */
|
if(mdfast->param[i]->is_null) {
|
||||||
/* FIXME: preliminary, bug is generated elsewhere */
|
if(! param_info->has_default) {
|
||||||
if (mdfast->param[i]->is_null && type != 110) {
|
LITERR("Parameter on model has no default");
|
||||||
if (!param_info->has_default) {
|
|
||||||
char* emessage = tprintf("Parameter %s on model %s has no default", param_info->name, mdfast->gen.GENmodName);
|
|
||||||
LITERR(emessage);
|
|
||||||
tfree(emessage);
|
|
||||||
gc_end();
|
gc_end();
|
||||||
return;
|
return;
|
||||||
} else if((param_info->is_array) && (! param_info->has_conn_ref)) {
|
} else if((param_info->is_array) && (! param_info->has_conn_ref)) {
|
||||||
|
|
|
||||||
|
|
@ -15,7 +15,7 @@
|
||||||
#define PACKAGE "ngspice"
|
#define PACKAGE "ngspice"
|
||||||
|
|
||||||
/* Version number of package */
|
/* Version number of package */
|
||||||
#define VERSION "38+"
|
#define VERSION "39"
|
||||||
|
|
||||||
/* Define the directory for executables */
|
/* Define the directory for executables */
|
||||||
#define NGSPICEBINDIR "../bin"
|
#define NGSPICEBINDIR "../bin"
|
||||||
|
|
@ -491,7 +491,7 @@
|
||||||
#define PACKAGE_VERSION VERSION
|
#define PACKAGE_VERSION VERSION
|
||||||
|
|
||||||
/* Define if we want predictor algorithm */
|
/* Define if we want predictor algorithm */
|
||||||
#define PREDICTOR
|
/* #undef PREDICTOR */
|
||||||
|
|
||||||
/* Define to 1 if the C compiler supports function prototypes. */
|
/* Define to 1 if the C compiler supports function prototypes. */
|
||||||
/* #undef PROTOTYPES */
|
/* #undef PROTOTYPES */
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue