commit
978f1c32a2
1201 changed files with 245231 additions and 0 deletions
-
1ANALYSES
-
39AUTHORS
-
31COPYING
-
107ChangeLog
-
167DEVICES
-
299FAQ
-
153INSTALL
-
15Makefile.am
-
108NEWS
-
162README
-
24acconfig.h
-
73autogen.sh
-
245configure.in
-
11contrib/ChangeLog
-
5contrib/mslib/COPYING
-
87contrib/mslib/datadef.h
-
93contrib/mslib/inc_LSD.c
-
199contrib/mslib/inc_inp.c
-
208contrib/mslib/inc_main.c
-
12contrib/mslib/makefile
-
35contrib/mslib/mslib_readme
-
5contrib/scripts/COPYING
-
77contrib/scripts/liblook
-
9contrib/scripts/liblook_readme
-
58contrib/scripts/libprm
-
14contrib/scripts/libprm_readme
-
18contrib/spiceprm/CHANGES
-
339contrib/spiceprm/COPYING
-
176contrib/spiceprm/EXAMPLES
-
216contrib/spiceprm/README
-
304contrib/spiceprm/spiceprm
-
19contrib/spiceprm/spiceprm-0.11.lsm
-
11doc/ChangeLog
-
11doc/Makefile.am
-
8496doc/ngspice.texi
-
5951doc/texinfo.tex
-
5man/Makefile.am
-
8man/man1/Makefile.am
-
1051man/man1/nutmeg.1
-
127man/man1/sconvert.1
-
325man/man1/spice.1
-
164notes/Linux.changes
-
7notes/dbx
-
98notes/internal
-
207notes/mac_port
-
237notes/porting
-
15notes/spice2
-
97src/ChangeLog
-
162src/Makefile.am
-
60src/analysis/ChangeLog
-
106src/analysis/Makefile.am
-
277src/analysis/acan.c
-
63src/analysis/acaskq.c
-
105src/analysis/acsetp.c
-
130src/analysis/ckt.h
-
47src/analysis/cktaccpt.c
-
142src/analysis/cktacct.c
-
43src/analysis/cktacdum.c
-
45src/analysis/cktask.c
-
25src/analysis/cktaskaq.c
-
43src/analysis/cktasknq.c
-
54src/analysis/cktbindn.c
-
25src/analysis/cktbkdum.c
-
39src/analysis/cktclrbk.c
-
47src/analysis/cktcrte.c
-
27src/analysis/cktdelt.c
-
61src/analysis/cktdest.c
-
177src/analysis/cktdisto.c
-
25src/analysis/cktdlti.c
-
45src/analysis/cktdltm.c
-
59src/analysis/cktdltn.c
-
146src/analysis/cktdojob.c
-
29src/analysis/cktdump.c
-
36src/analysis/cktfbran.c
-
86src/analysis/cktfdev.c
-
36src/analysis/cktfnda.c
-
53src/analysis/cktfndm.c
-
33src/analysis/cktfnode.c
-
25src/analysis/cktftask.c
-
46src/analysis/cktgrnd.c
-
66src/analysis/ckti2nod.c
-
57src/analysis/cktic.c
-
66src/analysis/cktinit.c
-
36src/analysis/cktlnkeq.c
-
166src/analysis/cktload.c
-
51src/analysis/cktmapn.c
-
30src/analysis/cktmask.c
-
45src/analysis/cktmcrt.c
-
45src/analysis/cktmkcur.c
-
32src/analysis/cktmknod.c
-
43src/analysis/cktmkvol.c
-
32src/analysis/cktmpar.c
-
45src/analysis/cktnames.c
-
34src/analysis/cktnewan.c
-
38src/analysis/cktneweq.c
-
45src/analysis/cktnewn.c
-
33src/analysis/cktnodn.c
-
140src/analysis/cktnoise.c
-
56src/analysis/cktntask.c
-
32src/analysis/cktnum2n.c
@ -0,0 +1 @@ |
|||||
|
This file will contain a list of implemented analyses. |
||||
@ -0,0 +1,39 @@ |
|||||
|
SPICE was originally written at The University of Berkeley (USA). |
||||
|
|
||||
|
|
||||
|
Contributors: |
||||
|
------------- |
||||
|
|
||||
|
Giles C. Billingsley |
||||
|
Mansun Chan |
||||
|
Wayne A. Christopher |
||||
|
Noah Friedman <friedman@prep.ai.mit.edu> |
||||
|
David A. Gates |
||||
|
JianHui Huang |
||||
|
Jeffrey M. Hsu |
||||
|
S. Hwang |
||||
|
Gordon M. Jacobs |
||||
|
Min-Chie Jeng |
||||
|
Kenneth H. Keller |
||||
|
Mathew Lew |
||||
|
Weidong Liu |
||||
|
Gary W. Ng |
||||
|
Hong June Park |
||||
|
Thomas L. Quarles |
||||
|
Jaijeet S. Roychowdhury |
||||
|
Takayasu Sakurai |
||||
|
Kanwar Jit Singh |
||||
|
Andrew Tuckey <Tuckey@ieee.org> |
||||
|
|
||||
|
NGSPICE is now actively hacked by: |
||||
|
|
||||
|
* Glao S. Dezai <dezai@hotbot.com> |
||||
|
* Daniele Foci <d.foci@ieee.ing.uniroma1.it> |
||||
|
* Chris Inbody <cinbody@cowtown.net> |
||||
|
* Paolo Nenzi <pnenzi@ieee.ing.uniroma1.it> |
||||
|
* Arno Peters <A.W.Peters@ieee.org> |
||||
|
* Serban-Mihai Popescu <serbanp@ix.netcom.com> |
||||
|
* Emmanuel Rouat <emmanuel.rouat@wanadoo.fr> |
||||
|
* Michael Widlok <widlok@uci.agh.edu.pl> |
||||
|
|
||||
|
(and many others...) |
||||
@ -0,0 +1,31 @@ |
|||||
|
|
||||
|
(The original copyright for Spice3f5.) |
||||
|
|
||||
|
|
||||
|
Copyright (C) 1996 The Regents of the University of California. |
||||
|
All Rights Reserved. |
||||
|
|
||||
|
Permission to use, copy, modify, and distribute this software and its |
||||
|
documentation for educational, research and non-profit purposes, |
||||
|
without fee, and without a written agreement is hereby granted, |
||||
|
provided that the above copyright notice, this paragraph and the |
||||
|
following three paragraphs appear in all copies. |
||||
|
|
||||
|
This software program and documentation are copyrighted by The Regents |
||||
|
of the University of California. The software program and |
||||
|
documentation are supplied "as is", without any accompanying services |
||||
|
from The Regents. The Regents does not warrant that the operation of |
||||
|
the program will be uninterrupted or error-free. The end-user |
||||
|
understands that the program was developed for research purposes and |
||||
|
is advised not to rely exclusively on the program for any reason. |
||||
|
|
||||
|
IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY |
||||
|
FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, |
||||
|
INCLUDING LOST PROFITS, ARISING OUT OF THE USE OF THIS SOFTWARE AND |
||||
|
ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF CALIFORNIA HAS BEEN |
||||
|
ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. THE UNIVERSITY OF |
||||
|
CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT |
||||
|
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
||||
|
A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS ON AN "AS IS" |
||||
|
BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATIONS TO PROVIDE |
||||
|
MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. |
||||
@ -0,0 +1,107 @@ |
|||||
|
1999-12-07 Arno Peters <A.W.Peters@ieee.org> |
||||
|
|
||||
|
* source tree: Added MAINTAINERCLEANFILES to Makefile.am to |
||||
|
eliminate automatically generated cruft from patches. To create a |
||||
|
minimal patch between two trees, just do `make maintainer-clean' |
||||
|
on both trees and run `diff -ruN tree1 tree2'. |
||||
|
|
||||
|
1999-10-15 Emmanuel Rouat <emmanuel.rouat@wanadoo.fr> |
||||
|
|
||||
|
* source tree: entirely modified by Arno Peters (after discussion |
||||
|
on the mailing list) |
||||
|
|
||||
|
1999-09-06 Emmanuel Rouat <emmanuel.rouat@wanadoo.fr> |
||||
|
|
||||
|
* AUTHORS: added list provided by Arno Peters |
||||
|
|
||||
|
* Applied patch supplied by Arno |
||||
|
|
||||
|
1999-09-01 Emmanuel Rouat <emmanuel.rouat@wanadoo.fr> |
||||
|
|
||||
|
* AUTHORS: some additions |
||||
|
|
||||
|
* FAQ: a few minor corrections |
||||
|
|
||||
|
1999-08-31 Emmanuel Rouat <emmanuel.rouat@wanadoo.fr> |
||||
|
|
||||
|
* configure.in: config.h now in top directory |
||||
|
|
||||
|
* All Makefile.am's: removed useless 'DEFS' line |
||||
|
|
||||
|
1999-08-30 Emmanuel Rouat <emmanuel.rouat@wanadoo.fr> |
||||
|
|
||||
|
* FAQ: added the FAQ to the distribution |
||||
|
|
||||
|
1999-08-28 Emmanuel Rouat <emmanuel.rouat@wanadoo.fr> |
||||
|
|
||||
|
* Removed mfb from build - nutmeg doesn't use it on Unix. |
||||
|
|
||||
|
1999-08-23 Emmanuel Rouat <emmanuel.rouat@wanadoo.fr> |
||||
|
|
||||
|
* configure.in: added tests ('make check') |
||||
|
|
||||
|
* ng-spice.patch: added cleanup patch by Arno Peters |
||||
|
|
||||
|
1999-08-08 Emmanuel Rouat <emmanuel.rouat@wanadoo.fr> |
||||
|
|
||||
|
* configure.in: added some features |
||||
|
|
||||
|
1999-08-03 Emmanuel Rouat <emmanuel.rouat@wanadoo.fr> |
||||
|
|
||||
|
* configure.in: added a whole bunch of tests! |
||||
|
|
||||
|
1999-08-02 Emmanuel Rouat <emmanuel.rouat@wanadoo.fr> |
||||
|
|
||||
|
* configure.in: added --with-checkergcc option (experimental!) |
||||
|
added some maths checks |
||||
|
|
||||
|
1999-07-31 Emmanuel Rouat <emmanuel.rouat@wanadoo.fr> |
||||
|
|
||||
|
* configure.in: made X11 tests more efficient |
||||
|
|
||||
|
|
||||
|
ng-spice-0.0: |
||||
|
------------- |
||||
|
* changed HAX_X11 define to XMISSING_DISPLAY supplied in config.h |
||||
|
|
||||
|
* added 'Changelog' files in all subdirectories |
||||
|
|
||||
|
* added '--enable-ansi' option to configure |
||||
|
|
||||
|
* put src/lib/dev/devsup.c into src/lib/dev/devsup/ |
||||
|
|
||||
|
* added header files into Makefile.am's |
||||
|
|
||||
|
Chianti: |
||||
|
-------- |
||||
|
(27/07/99) |
||||
|
|
||||
|
* added some tests to configure.in (ncurses/termcap, xaw....) |
||||
|
|
||||
|
* cleaned up some directories (examples, patches..) |
||||
|
|
||||
|
* removed all .orig files |
||||
|
|
||||
|
Pizza: |
||||
|
------ |
||||
|
(25/07/99) |
||||
|
|
||||
|
* added installation of man pages |
||||
|
|
||||
|
* emptied 'COPYING' file until we know what to put in it |
||||
|
|
||||
|
* fixed missing install of help and init files (created tune.c.in |
||||
|
to support this) |
||||
|
|
||||
|
* added missing -DWANT_X11 and -DWANT_MFB in several compiles |
||||
|
(fixed some headers in: src/lib/fte/x11.c |
||||
|
src/lib/fte/x11disp.c ) |
||||
|
|
||||
|
|
||||
|
Spaghetti: |
||||
|
---------- |
||||
|
(25/07/99) |
||||
|
|
||||
|
- first attempt at autoconf/automake support |
||||
|
|
||||
|
- based on spice3f5-chili, hardly anything touched on it. |
||||
@ -0,0 +1,167 @@ |
|||||
|
DEVICES |
||||
|
------------------------------------------------------------------------------- |
||||
|
|
||||
|
This file contains the status of devices available in ng-spice. This file will |
||||
|
be updated every time the device cospecific code is altered/changed. |
||||
|
|
||||
|
|
||||
|
************************************** |
||||
|
********** Linear devices ********** |
||||
|
************************************** |
||||
|
|
||||
|
CAP - Capacitor |
||||
|
Initial Release |
||||
|
|
||||
|
IND - Inductor |
||||
|
Initial Release |
||||
|
|
||||
|
RES - Resistor |
||||
|
This is a modified version of the spice3 resistance model. This model |
||||
|
supports different ac and dc values (ac=...). This changes are |
||||
|
introduced by Serban Popescu. This device needs more testing. |
||||
|
TO BE TESTED AND IMPROVED. |
||||
|
|
||||
|
|
||||
|
************************************** |
||||
|
******** Distributed elements ******** |
||||
|
************************************** |
||||
|
|
||||
|
TRA - Transmission line |
||||
|
Initial release |
||||
|
|
||||
|
LTRA - Lossy Transmission line |
||||
|
Initial release |
||||
|
|
||||
|
URC - Uniform distributed RC line |
||||
|
Initial release |
||||
|
|
||||
|
|
||||
|
************************************** |
||||
|
********** V/I Sources ********** |
||||
|
************************************** |
||||
|
|
||||
|
ASRC - Arbitrary Source |
||||
|
Initial Release |
||||
|
|
||||
|
CCCS - Current Controlled Current Source |
||||
|
Initial Release |
||||
|
|
||||
|
CCVS - Current Controlled Voltage Source |
||||
|
Initial Release |
||||
|
|
||||
|
ISRC - Independent Current Source |
||||
|
Initial Release |
||||
|
|
||||
|
VCCS - Voltage Controlled Current Source |
||||
|
Initial Release |
||||
|
|
||||
|
VCVS - Voltage Controlled Voltage Source |
||||
|
Initial Release |
||||
|
|
||||
|
VSRC - Indipendent Voltage Source |
||||
|
Initial Release |
||||
|
|
||||
|
|
||||
|
************************************** |
||||
|
********* Switches ********** |
||||
|
************************************** |
||||
|
|
||||
|
CSW - Current controlled switch |
||||
|
Initial release |
||||
|
|
||||
|
SW - Voltage controlled switch |
||||
|
Initial release |
||||
|
|
||||
|
|
||||
|
************************************** |
||||
|
********** Diodes ********** |
||||
|
************************************** |
||||
|
|
||||
|
DIO - Junction Diode |
||||
|
Initial Release |
||||
|
|
||||
|
|
||||
|
************************************** |
||||
|
*********** Bipolar Devices ********** |
||||
|
************************************** |
||||
|
|
||||
|
BJT - Bipolar Junction Transistor |
||||
|
Initial Relelase |
||||
|
|
||||
|
|
||||
|
************************************** |
||||
|
********** FET Devices ********** |
||||
|
************************************** |
||||
|
|
||||
|
JFET - Junction Field Effect transistor |
||||
|
Initial Release |
||||
|
|
||||
|
JFET2 - Jfet PS model |
||||
|
Initial release. TO BE TESTED |
||||
|
|
||||
|
|
||||
|
************************************** |
||||
|
********* MES devices ********* |
||||
|
************************************** |
||||
|
|
||||
|
MES - MESfet model |
||||
|
Initial release |
||||
|
|
||||
|
|
||||
|
************************************** |
||||
|
********* MOS devices ********* |
||||
|
************************************** |
||||
|
|
||||
|
MOS1 - Level 1 MOS model |
||||
|
Initial Release |
||||
|
|
||||
|
MOS2 - Level 2 MOS model |
||||
|
Initial Release |
||||
|
|
||||
|
MOS3 - Level 3 MOS model |
||||
|
Initial Release |
||||
|
|
||||
|
MOS6 - Level 6 MOS model |
||||
|
Initial Release |
||||
|
|
||||
|
BSIM1 - BSIM model level 1 |
||||
|
Initial Release |
||||
|
|
||||
|
BSIM2 - BSIM model level 2 |
||||
|
Initial Release |
||||
|
|
||||
|
BSIM3 - BSIM model level 3 |
||||
|
This is the BSIM3v3.2.2 model from Berkeley device group. |
||||
|
You can find some test netlists with results for this model |
||||
|
at http://www-device.eecs.berkeley.edu/~bsim3. |
||||
|
|
||||
|
|
||||
|
BSIM3v1 - BSIM model level 3 |
||||
|
This is the BSIM3v3.1 model modified by Serban Popescu. This |
||||
|
is level 49 model. It is an implementation that supports |
||||
|
HDIF and M parameters. Test netlists are available at the URL |
||||
|
above. |
||||
|
TO BE TESTED AND IMPROVED. |
||||
|
|
||||
|
BSIM3v2 - BSIM model level 3 |
||||
|
This is the BSIM3v3.2 model. It is proved only for compatibility |
||||
|
with existing netlists and parameters files. As always, tests are |
||||
|
availabe on the Berkeley's device group site (at the above URL). |
||||
|
|
||||
|
BSIM4 - BSIM model level 4 (0.18 um) |
||||
|
Initial Release. TO BE TESTED. |
||||
|
|
||||
|
|
||||
|
************************************** |
||||
|
********** SOI Devices ********* |
||||
|
************************************** |
||||
|
|
||||
|
|
||||
|
BSIM3SOI_DD - SOI model (dynamic depletion) |
||||
|
NOT YET IMPLEMENTED. |
||||
|
|
||||
|
BSIM3SOI_FD - SOI model (fully depleted devices) |
||||
|
NOT YET IMPLEMENTED. |
||||
|
|
||||
|
BSIM3SOI_PD - SOI model (partially depleted devices) |
||||
|
NOT YET IMPLEMENTED. |
||||
@ -0,0 +1,299 @@ |
|||||
|
|
||||
|
|
||||
|
NG-Spice F.A.Q. |
||||
|
Frequently Asked Questions |
||||
|
(and Answers) |
||||
|
|
||||
|
Maintened by Daniele Foci <d.foci@ieee.ing.uniroma1.it> |
||||
|
Last update: 29/08/1999 |
||||
|
|
||||
|
|
||||
|
CONTENTS |
||||
|
|
||||
|
1. INTRODUCTION AND GENERAL INFORMATION |
||||
|
1.1 What is NG-Spice? |
||||
|
1.2 Why resurrecting Berkeley's Spice? |
||||
|
1.3 What is the project's goal? |
||||
|
1.4 What you are going to do ? |
||||
|
1.5 Legal issues |
||||
|
1.6 What mailing lists exist for NG-Spice? |
||||
|
1.7 Are the mailing lists archived anywhere? |
||||
|
1.8 What newsgroups exist for NG-Spice? |
||||
|
1.9 Where can I get a copy of NG-Spice? |
||||
|
1.10 Where should I look on the World Wide Web for NG-Spice stuff? |
||||
|
2. DEVELOPMENT |
||||
|
2.1 What is the current version? |
||||
|
2.2 What are the latest features in the current release? |
||||
|
2.3 What does it look like ? |
||||
|
2.4 Who are the authors of ng-spice ? |
||||
|
2.5 How can I report a bug/request for a feature? |
||||
|
2.6 How can I join the development? |
||||
|
3. SOLUTIONS TO COMMON MISCELLANEOUS PROBLEMS |
||||
|
3.1 What systems are supported? |
||||
|
3.2 I get errors when I try to compile the source code, why? |
||||
|
3.3 This document didn't answer my question. Where else can I look for |
||||
|
an answer? |
||||
|
4. ADMINISTRATIVE INFORMATION AND ACKNOWLEDGEMENTS |
||||
|
4.1 Feedback |
||||
|
4.2 Formats in which this FAQ is available |
||||
|
4.3 Authorship and acknowledgements |
||||
|
4.4 Disclaimer and Copyright |
||||
|
|
||||
|
------------------------------------------------------------------------------- |
||||
|
|
||||
|
1. INTRODUCTION AND GENERAL INFORMATION |
||||
|
|
||||
|
1.1 What is NG-Spice? |
||||
|
|
||||
|
NG-spice is the name of a project and of a program in the project. Spice is |
||||
|
the famous circuit simulator developed by the CAD Group of the University |
||||
|
of California at Berkeley (UCB). The NG prefix has a lot of meanings: Next |
||||
|
Generation, New Good, etc. Choose or invent the one you prefer. The NG-spice |
||||
|
project aims to improve the capabilities of the Spice3 circuit simulator. |
||||
|
The heart of the project is the ng-spice program, a circuit simulator |
||||
|
derived from spice3f5. |
||||
|
|
||||
|
1.2 Why resurrecting Berkeley's Spice? |
||||
|
|
||||
|
Berkeley's Spice can be considered the father of most circuit simulators |
||||
|
available today. It is an old but still good piece of software, it may not |
||||
|
be the fastest or the most reliable but it's free, it's available in |
||||
|
source code and most of the electrical simulators inherited it's syntax. |
||||
|
On the more technical side, spice3 uses good numerical algorithms |
||||
|
( most commercial implementations have only strengthened them), implements |
||||
|
most of the models for MOSFET submicron designs and has a powerful set of |
||||
|
analyses. On the more "social" side, spice3 it's well introduced in the |
||||
|
academic environment. |
||||
|
|
||||
|
1.3 What is the project's goal? |
||||
|
|
||||
|
The final goal of NG-spice project is to develop a reliable, fast and |
||||
|
friendly circuit simulator for mixed signal/mixed level simulation. |
||||
|
Easy isn't it ;-). |
||||
|
|
||||
|
1.4 What you are going to do? |
||||
|
|
||||
|
The NG-spice project is divided in two main overlapping phases. The first |
||||
|
phase is strictly pertinent to the spice3f5 code: during this phase the |
||||
|
original spice3f5 code will be "cleaned" and corrected and small improvements |
||||
|
made to it. In phase one the Autoconf interface will replace the Berkeley's |
||||
|
one and this will lead to a different structure of the sources. |
||||
|
The second phase is the development of improvements in the ngspice code |
||||
|
(the old spice3f5 code cleaned and corrected) and of some programs that will |
||||
|
interface with it, like a schematic editor and a waveform viewer. A list of |
||||
|
proposed improvements follows: |
||||
|
|
||||
|
1) The framework (or Graphic User Interface): |
||||
|
Spice is (and should continue to be) a command line or a text tool, but |
||||
|
this makes very difficult to design large circuits. To overcome this |
||||
|
difficulty, a schematic entry tool and a waveform viewer tools are needed. |
||||
|
Nevertheless, there are other tools that can be useful: a parts database, |
||||
|
an editor which higlights the syntax, a symbol editor, etc. |
||||
|
Most of these program already exists in the open source world, so they |
||||
|
need only to be integrated in a common EDA environment. |
||||
|
|
||||
|
2) Documentation: |
||||
|
Commercial simulators have very good manuals with tutorials, models |
||||
|
equations explained, example of use, suggestions, etc. This line of |
||||
|
development has the task of providing the final spice user with an ordered |
||||
|
and comprehensive set of information on the program and its features. |
||||
|
The documentation should be useful for the student as well as for the |
||||
|
circuit professional. |
||||
|
|
||||
|
3) Improvements to the Spice code: |
||||
|
This is the hard part. The target of this direction is to make ngspice a |
||||
|
commercial grade simulator. This means improving it's speed, its |
||||
|
numerical strenght, include the latest models available and some other |
||||
|
important features: |
||||
|
|
||||
|
* Numerical Algorithms: |
||||
|
- More stable algorithms for integration (as Runge-Kutta Methods). |
||||
|
- Better convergence in Operating Point Calculation replacing the |
||||
|
Newton-Raphson algorithm, a modified version of Fixed-Point |
||||
|
Homotopy. |
||||
|
|
||||
|
* Devices: |
||||
|
- Behavioral device: enhance the B device of spice3 to accepts IF THEN |
||||
|
ELSE conditions, and digital keywords like DELAY, |
||||
|
HIGHV, LOWV, etc. to simulate simple digital |
||||
|
device. |
||||
|
- Dynamically Loadable Devices: reduce the memory occupied by the |
||||
|
simulator by using shared object code |
||||
|
for devices. Each device is a .so |
||||
|
library that is inserted only if the |
||||
|
circuit contains an element modeled by |
||||
|
the device. If we are simulating CMOS, |
||||
|
we do not need BJT or SOI (in most of |
||||
|
the situations). |
||||
|
- Code Level Modeling: let users write their devices in C and use |
||||
|
them in the simulator. |
||||
|
- Improving device: include additional parameters to some devices as |
||||
|
HDIF, LDIF, etc. |
||||
|
|
||||
|
* New types of analysis, oriented to circuits syntesis and optimization: |
||||
|
- Network analysis: given four nodes, extract z,y,s and the other |
||||
|
double bipole paramters. |
||||
|
- Monte Carlo analysis: statistical simulation based on device |
||||
|
tolerances. |
||||
|
- Worst Case analysis: find the worst case of operation of a given |
||||
|
circuit based on device tolerances. |
||||
|
- Parametric analysis: repeat an analysis when one or more parameters |
||||
|
assumes different values. |
||||
|
|
||||
|
* Faster handling of sparse matrices. |
||||
|
|
||||
|
* Possibility to mesure circuit pameters, like the delay between two |
||||
|
nodes, etc. |
||||
|
|
||||
|
* ... whatever else can be judged useful. |
||||
|
|
||||
|
|
||||
|
1.5 Legal issues |
||||
|
|
||||
|
[not written yet: GPL vs. Berkeley] |
||||
|
|
||||
|
1.6 What mailing lists exist for NG-Spice? |
||||
|
|
||||
|
Only one. Send an empty message to <ng-spice-help@ieee.ing.uniroma1.it> to |
||||
|
have information on subscription. |
||||
|
|
||||
|
1.7 Is the mailing lists archived anywhere? |
||||
|
|
||||
|
Yes, the list is archived. Send an empty message to |
||||
|
<ng-spice-help@ieee.ing.uniroma1.it> to have information on how to retrieve |
||||
|
old messages. |
||||
|
|
||||
|
1.8 What newsgroups exist for NG-Spice? |
||||
|
|
||||
|
None. Sorry. |
||||
|
|
||||
|
1.9 Where can I get a copy of NG-Spice? |
||||
|
|
||||
|
You can download NG-Spice from: |
||||
|
ftp://ieee.ing.uniroma1.it/pub/ng-spice/distribution/ |
||||
|
|
||||
|
1.10 Where should I look on the World Wide Web for NG-Spice stuff? |
||||
|
|
||||
|
There is a WWW page for NG-Spice. The URL is: |
||||
|
http://geda.seul.org under the tools section. |
||||
|
|
||||
|
|
||||
|
2. DEVELOPMENT |
||||
|
|
||||
|
2.1 What is the current version? |
||||
|
|
||||
|
0.3 (released on 30/08/1999) |
||||
|
|
||||
|
2.2 What are the latest features in the current release? |
||||
|
|
||||
|
* New features: |
||||
|
- Autoconf interface. |
||||
|
- BSIM 3.2.2 Model. |
||||
|
- PS jfet Model (jfet level 2). |
||||
|
- Temperature and resistance sweeps. |
||||
|
- "spec" command for spectrum analysis. |
||||
|
|
||||
|
* Bug fixes: |
||||
|
- Altermod command connected to the parser. |
||||
|
- Some memory leaks closed. |
||||
|
- Spice3f5 fixes available on the net. |
||||
|
|
||||
|
2.3 What does it look like ? |
||||
|
|
||||
|
This is a command line utility, no screenshots! |
||||
|
|
||||
|
2.4 Who are the authors of ng-spice ? |
||||
|
|
||||
|
The development is open to anyone who wish to contribute. |
||||
|
People who contributed are: |
||||
|
|
||||
|
* Daniele Foci <d.foci@ieee.ing.uniroma1.it> |
||||
|
* Paolo Nenzi <pnenzi@ieee.ing.uniroma1.it> |
||||
|
* Arno Peters <A.W.Peters@ieee.org> |
||||
|
* Serban-Mihai Popescu <serbanp@ix.netcom.com> |
||||
|
* Emmanuel Rouat <emmanuel.rouat@wanadoo.fr> |
||||
|
* Michael Widlok <widlok@uci.agh.edu.pl> |
||||
|
|
||||
|
This list is surely incomplete (due to open development group), there are |
||||
|
many people who contributed with improvements, pieces of code, bux fixes, |
||||
|
etc. If you have contributed and do not appear, write to: |
||||
|
ng-spice@ieee.ing.uniroma1.it |
||||
|
and ask to be included. |
||||
|
|
||||
|
2.5 How can I report a bug/request for a feature? |
||||
|
|
||||
|
Write in the mailing list. |
||||
|
|
||||
|
2.6 How can I join the development? |
||||
|
|
||||
|
To join the development just code the feature you want to add and send your |
||||
|
patch in the mailing list. Before you start coding check the latest |
||||
|
development release of NG-Spice from our CVS. It might be that your feature |
||||
|
has already been implemented. |
||||
|
To access the anonymous CVS do the following: |
||||
|
|
||||
|
1) Install cvs on your machine (version 1.9.x - 1.10.x are just fine). |
||||
|
2) Set one of the following environment variables: |
||||
|
For bash: |
||||
|
export CVSROOT=:pserver:anonymous@ieee.ing.uniroma1.it:/var/services/cvsroot |
||||
|
For csh/tcsh: |
||||
|
setenv CVSROOT :pserver:anonymous@ieee.ing.uniroma1.it:/var/services/cvsroot |
||||
|
3) Login to the cvs server by running: |
||||
|
$> cvs login |
||||
|
The password is 'guest' (without the quotes of course). You will only |
||||
|
have to do this once. |
||||
|
4) Checkout the appropriate files executing the following commands: |
||||
|
$> mkdir somedirectory |
||||
|
$> cd somedirectory |
||||
|
$> cvs co ng-spice |
||||
|
5) Wait for the cvs logout. |
||||
|
|
||||
|
|
||||
|
3. SOLUTIONS TO COMMON MISCELLANEOUS PROBLEMS |
||||
|
|
||||
|
3.1 What systems are supported? |
||||
|
|
||||
|
This is the updated list: |
||||
|
|
||||
|
Hardware O.S. Compiler Functional? |
||||
|
---------------- ------------------ -------------- ----------- |
||||
|
i386 Linux (RedHat) gcc yes |
||||
|
i386 Linux (Debian) gcc yes |
||||
|
i386 Linux (SuSE) gcc yes |
||||
|
IBM Risc 6000 AiX lcc no |
||||
|
SUN Solaris 7 gcc yes |
||||
|
SUN Solaris 7 SUN Workshop ? |
||||
|
|
||||
|
3.2 I get errors when I try to compile the source code, why? |
||||
|
|
||||
|
[not written yet] |
||||
|
|
||||
|
3.3 This document didn't answer my question. Where else can I look for |
||||
|
an answer? |
||||
|
|
||||
|
Read old messages from the mailing list archive, search the web site or read |
||||
|
the docs. Upgrade to the latest version of NG-Spice, many problems are fixed |
||||
|
in the new versions. If you still can't find an answer, post your question |
||||
|
to the mailing list. |
||||
|
|
||||
|
|
||||
|
4. ADMINISTRATIVE INFORMATION AND ACKNOWLEDGEMENTS |
||||
|
|
||||
|
4.1 Feedback |
||||
|
|
||||
|
Send your comments about this F.A.Q. to <d.foci@ieee.ing.uniroma1.it>. |
||||
|
Send your comments about NG-Spice to <ng-spice@ieee.ing.uniroma1.it>. |
||||
|
|
||||
|
4.2 Formats in which this FAQ is available |
||||
|
|
||||
|
This document is available only in ASCII format in the NG-Spice source |
||||
|
package. |
||||
|
|
||||
|
4.3 Authorship and acknowledgements |
||||
|
|
||||
|
Parts of the questions and answers are originate from Paolo Nenzi. |
||||
|
|
||||
|
4.4 Disclaimer and Copyright |
||||
|
|
||||
|
This document is provided as is. The information in it is not warranted to |
||||
|
be correct: you use it at your own risk. |
||||
@ -0,0 +1,153 @@ |
|||||
|
Basic Installation |
||||
|
================== |
||||
|
|
||||
|
|
||||
|
The autoconf support is still very crude and needs work, but basically |
||||
|
you should be able to do: |
||||
|
./configure |
||||
|
make |
||||
|
make install |
||||
|
(default install dir is /usr/local/bin) |
||||
|
|
||||
|
You can use some extra options to 'configure' |
||||
|
|
||||
|
--disable-debug : this option will remove the '-g' option passed to the |
||||
|
compiler (speeds up compilation a *lot*) |
||||
|
|
||||
|
--enable-ansi : configure will try to find an option for your compiler so |
||||
|
that it expects ansi-C |
||||
|
|
||||
|
Do a './configure --help' to get all available options. |
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
Compilers and Options |
||||
|
===================== |
||||
|
|
||||
|
Some systems require unusual options for compilation or linking that |
||||
|
the `configure' script does not know about. You can give `configure' |
||||
|
initial values for variables by setting them in the environment. Using |
||||
|
a Bourne-compatible shell, you can do that on the command line like |
||||
|
this: |
||||
|
CC=c89 CFLAGS=-O2 LIBS=-lposix ./configure |
||||
|
|
||||
|
Or on systems that have the `env' program, you can do it like this: |
||||
|
env CPPFLAGS=-I/usr/local/include LDFLAGS=-s ./configure |
||||
|
|
||||
|
Compiling For Multiple Architectures |
||||
|
==================================== |
||||
|
|
||||
|
You can compile the package for more than one kind of computer at the |
||||
|
same time, by placing the object files for each architecture in their |
||||
|
own directory. To do this, you must use a version of `make' that |
||||
|
supports the `VPATH' variable, such as GNU `make'. `cd' to the |
||||
|
directory where you want the object files and executables to go and run |
||||
|
the `configure' script. `configure' automatically checks for the |
||||
|
source code in the directory that `configure' is in and in `..'. |
||||
|
|
||||
|
If you have to use a `make' that does not supports the `VPATH' |
||||
|
variable, you have to compile the package for one architecture at a time |
||||
|
in the source code directory. After you have installed the package for |
||||
|
one architecture, use `make distclean' before reconfiguring for another |
||||
|
architecture. |
||||
|
|
||||
|
Installation Names |
||||
|
================== |
||||
|
|
||||
|
By default, `make install' will install the package's files in |
||||
|
`/usr/local/bin', `/usr/local/man', etc. You can specify an |
||||
|
installation prefix other than `/usr/local' by giving `configure' the |
||||
|
option `--prefix=PATH'. |
||||
|
|
||||
|
You can specify separate installation prefixes for |
||||
|
architecture-specific files and architecture-independent files. If you |
||||
|
give `configure' the option `--exec-prefix=PATH', the package will use |
||||
|
PATH as the prefix for installing programs and libraries. |
||||
|
Documentation and other data files will still use the regular prefix. |
||||
|
|
||||
|
In addition, if you use an unusual directory layout you can give |
||||
|
options like `--bindir=PATH' to specify different values for particular |
||||
|
kinds of files. Run `configure --help' for a list of the directories |
||||
|
you can set and what kinds of files go in them. |
||||
|
|
||||
|
If the package supports it, you can cause programs to be installed |
||||
|
with an extra prefix or suffix on their names by giving `configure' the |
||||
|
option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. |
||||
|
|
||||
|
Optional Features |
||||
|
================= |
||||
|
|
||||
|
Some packages pay attention to `--enable-FEATURE' options to |
||||
|
`configure', where FEATURE indicates an optional part of the package. |
||||
|
They may also pay attention to `--with-PACKAGE' options, where PACKAGE |
||||
|
is something like `gnu-as' or `x' (for the X Window System). The |
||||
|
`README' should mention any `--enable-' and `--with-' options that the |
||||
|
package recognizes. |
||||
|
|
||||
|
For packages that use the X Window System, `configure' can usually |
||||
|
find the X include and library files automatically, but if it doesn't, |
||||
|
you can use the `configure' options `--x-includes=DIR' and |
||||
|
`--x-libraries=DIR' to specify their locations. |
||||
|
|
||||
|
Specifying the System Type |
||||
|
========================== |
||||
|
|
||||
|
There may be some features `configure' can not figure out |
||||
|
automatically, but needs to determine by the type of host the package |
||||
|
will run on. Usually `configure' can figure that out, but if it prints |
||||
|
a message saying it can not guess the host type, give it the |
||||
|
`--host=TYPE' option. TYPE can either be a short name for the system |
||||
|
type, such as `sun4', or a canonical name with three fields: |
||||
|
CPU-COMPANY-SYSTEM |
||||
|
|
||||
|
See the file `config.sub' for the possible values of each field. If |
||||
|
`config.sub' isn't included in this package, then this package doesn't |
||||
|
need to know the host type. |
||||
|
|
||||
|
If you are building compiler tools for cross-compiling, you can also |
||||
|
use the `--target=TYPE' option to select the type of system they will |
||||
|
produce code for and the `--build=TYPE' option to select the type of |
||||
|
system on which you are compiling the package. |
||||
|
|
||||
|
Sharing Defaults |
||||
|
================ |
||||
|
|
||||
|
If you want to set default values for `configure' scripts to share, |
||||
|
you can create a site shell script called `config.site' that gives |
||||
|
default values for variables like `CC', `cache_file', and `prefix'. |
||||
|
`configure' looks for `PREFIX/share/config.site' if it exists, then |
||||
|
`PREFIX/etc/config.site' if it exists. Or, you can set the |
||||
|
`CONFIG_SITE' environment variable to the location of the site script. |
||||
|
A warning: not all `configure' scripts look for a site script. |
||||
|
|
||||
|
Operation Controls |
||||
|
================== |
||||
|
|
||||
|
`configure' recognizes the following options to control how it |
||||
|
operates. |
||||
|
|
||||
|
`--cache-file=FILE' |
||||
|
Use and save the results of the tests in FILE instead of |
||||
|
`./config.cache'. Set FILE to `/dev/null' to disable caching, for |
||||
|
debugging `configure'. |
||||
|
|
||||
|
`--help' |
||||
|
Print a summary of the options to `configure', and exit. |
||||
|
|
||||
|
`--quiet' |
||||
|
`--silent' |
||||
|
`-q' |
||||
|
Do not print messages saying which checks are being made. To |
||||
|
suppress all normal output, redirect it to `/dev/null' (any error |
||||
|
messages will still be shown). |
||||
|
|
||||
|
`--srcdir=DIR' |
||||
|
Look for the package's source code in directory DIR. Usually |
||||
|
`configure' can determine that directory automatically. |
||||
|
|
||||
|
`--version' |
||||
|
Print the version of Autoconf used to generate the `configure' |
||||
|
script, and exit. |
||||
|
|
||||
|
`configure' also accepts some other, not widely useful, options. |
||||
@ -0,0 +1,15 @@ |
|||||
|
## Process this file with automake to produce Makefile.in
|
||||
|
|
||||
|
SUBDIRS = doc src man tests |
||||
|
|
||||
|
EXTRA_DIST = FAQ acconfig.h autogen.sh notes contrib |
||||
|
|
||||
|
MAINTAINERCLEANFILES = Makefile.in aclocal.m4 config.guess \
|
||||
|
config.h.in config.sub configure install-sh \
|
||||
|
missing mkinstalldirs stamp-h.in ltconfig \
|
||||
|
ltmain.sh |
||||
|
|
||||
|
mrproper: maintainer-clean |
||||
|
rm -f `find . -type f -name "*~" -print` |
||||
|
rm -f `find . -type f -name "*.orig" -print` |
||||
|
rm -f `find . -type f -name "*.rej" -print` |
||||
@ -0,0 +1,108 @@ |
|||||
|
Ng-spice-rework-10 |
||||
|
============ |
||||
|
|
||||
|
Added BSIM4 model and closed a couple of serious bugs. Added DEVICES file |
||||
|
to distribution. This file contains the status of device models in this |
||||
|
simulator. Read it, this file can save you a lot of time. |
||||
|
|
||||
|
Ng-spice-rework-9 |
||||
|
============ |
||||
|
|
||||
|
Thanks to Arno Peters now all device models are dynamically loaed on demand. |
||||
|
Thay are linked as shared libraries. The next step is the dlopen() one which |
||||
|
will make possible to link devices without any recompilation. |
||||
|
|
||||
|
|
||||
|
|
||||
|
Ng-spice-rework-8 |
||||
|
============ |
||||
|
|
||||
|
Applied Arno's patch. |
||||
|
|
||||
|
From his mail message: |
||||
|
|
||||
|
Hi Paolo, |
||||
|
|
||||
|
I have prepared a source cleaning patch. |
||||
|
|
||||
|
Features: |
||||
|
|
||||
|
+ patches don't get polluted with differences between automatically |
||||
|
generated Makefile.am files. Usually these make up the biggest part |
||||
|
of the patches. This allows me to read the patch on the mailing |
||||
|
list instead of sifting through 90% redundant and irrelevant changes. |
||||
|
|
||||
|
+ the shell script autogen.sh automatically regenerates the required |
||||
|
files if the user has automake, autoconf and libtool installed. |
||||
|
|
||||
|
+ this feature is only valuable to developers, not to end users. |
||||
|
|
||||
|
|
||||
|
Usage of this patch, once incorporated: |
||||
|
|
||||
|
# create a working tree to work from |
||||
|
cp -a ng-spice-rework-x ng-spice |
||||
|
|
||||
|
[ Changes made to ng-spice ] |
||||
|
|
||||
|
# clean up all the automatically generated files |
||||
|
cd ng-spice; make maintainer-clean |
||||
|
|
||||
|
# extract the differences |
||||
|
diff -ruN ng-spice-rework-x ng-spice > my.patch |
||||
|
|
||||
|
[ Patch sent to ng-spice mailing list or you ] |
||||
|
|
||||
|
# incorporate changes into the tree |
||||
|
cd ng-spice-rework-x; patch -p1 < my.patch |
||||
|
|
||||
|
# update the automatically generated files |
||||
|
cd ng-spice-rework-x; sh autogen.sh |
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
Ng-spice-rework-7 (22 Mar 2000) |
||||
|
============ |
||||
|
|
||||
|
Bug fix release |
||||
|
|
||||
|
|
||||
|
|
||||
|
Ng-spice-rework-6 (29 Jan 2000) |
||||
|
============ |
||||
|
|
||||
|
This porting includes: |
||||
|
|
||||
|
1) BSIM3V3.1 model as level 49. This is the version modified by Serban Popescu |
||||
|
which understands the M parameter and implements HDIF. |
||||
|
|
||||
|
2) BSIM3V3.2 model al Level 50. This is the standard Berkeley version. |
||||
|
|
||||
|
3) Now the resistor model can accepts two differents values for DC and AC |
||||
|
resistance. |
||||
|
|
||||
|
|
||||
|
|
||||
|
Ng-spice-rework-5 and 5_2 (Jan 2000) |
||||
|
============ |
||||
|
|
||||
|
Internal development release, buggy and not working. |
||||
|
|
||||
|
Ng-spice-rework-4 (22/12/99) |
||||
|
============ |
||||
|
|
||||
|
This porting includes a new feature: |
||||
|
|
||||
|
1) dynamically loading of some device code as an experimental feature for |
||||
|
the future GPL simulator. Thanks to Arno Peters and Manu Rouat. |
||||
|
|
||||
|
2) Patched the following bug (thanks to Andrew Tuckey for having supplied the |
||||
|
patch). |
||||
|
|
||||
|
* Wsw (current controlled switch) in subckt, parsing bug. |
||||
|
* scale factor in arbitrary source. |
||||
|
* bug in noise analisys. |
||||
|
* save segmentation faults. |
||||
|
|
||||
|
|
||||
@ -0,0 +1,162 @@ |
|||||
|
README for NGSPICE |
||||
|
------------------ |
||||
|
|
||||
|
This long message describes what NG-SPICE may become in the (near ?) |
||||
|
future. I used a question mark because, as you will read, most of the |
||||
|
features of ng-spice are found on Hi-quality commercial products and |
||||
|
(which is the true reason) I have no idea on how can be implemented. |
||||
|
|
||||
|
** Why resurrecting Berkeley's Spice ? |
||||
|
|
||||
|
Berkeley's spice can be considered the father of most circuit simulator |
||||
|
available today. It is an old but still good piece of software. It may not |
||||
|
be the fastest or the most reliable, but it's free, it is available in |
||||
|
source code, and most of the electrical simulators inherited it's syntax. |
||||
|
On the more technical side, spice3f4(5) uses good numerical algorithms |
||||
|
(commercial implementations have only strengthened them), implements most |
||||
|
of the models for MOSFET submicron designs and has a powerful set of |
||||
|
analyses. On the more "social" side: it's weel introduced in the |
||||
|
academic environment. |
||||
|
|
||||
|
|
||||
|
** What does NG-SPICE mean ? |
||||
|
|
||||
|
It stands for Next Generation Spice but that's not the official name of |
||||
|
the projest. This projects still lacks a name. NG-SPICE is a temporary |
||||
|
name. |
||||
|
|
||||
|
|
||||
|
** What will NG-SPICE be ? |
||||
|
|
||||
|
Berkeley's Spice lacks in three directions: |
||||
|
|
||||
|
a) Graphical user interface (I prefer to say "the framework"). |
||||
|
b) Documentation. |
||||
|
c) Features in the code. |
||||
|
|
||||
|
* The framework: |
||||
|
Spice is (and should continue to be) acommand line or a text tool, but |
||||
|
this makes very difficult to design large circuits. To overcome this |
||||
|
difficulty, a schematic entry tool and a waveform viewer tool are |
||||
|
needed. Nevertheless, there are other tools that can be useful: |
||||
|
a parts database, an editor which higlights the syntax, a symbol |
||||
|
editor, etc. Most of these program already exists in the open source |
||||
|
world, so they need ony to be integrated in a common EDA environment. |
||||
|
This is the first direction of development. |
||||
|
|
||||
|
* Documentation: Commercial simulators (hi-end) have very good manuals |
||||
|
with tutorials, models equation explained, example of use, suggestions, |
||||
|
etc. This line of development has the task of provinding the final |
||||
|
spice user with an orderd and comprehensive set of information on the |
||||
|
program and it's features. The documentation should be useful for the |
||||
|
student as well as for the circuit professional. |
||||
|
|
||||
|
* Improvements to the spice code: This is the hard part. Th target of |
||||
|
this direction is to make ng-spice a commercial grade simulator. This |
||||
|
means improving it's speed, it's numerical robustness, include the |
||||
|
latest models available and some other important features. I will |
||||
|
describe some of them briefly: |
||||
|
|
||||
|
- Analyses - |
||||
|
Network analisys: given four nodes, extract z,y,s and the other |
||||
|
double bipole paramters. |
||||
|
|
||||
|
Monte Carlo analisys: statistical simulation based on device |
||||
|
tolerances. |
||||
|
|
||||
|
Worst Case analisys: find the worst case of operation of a given |
||||
|
circuit based on device tolerances. |
||||
|
|
||||
|
Parametric analisys: repeat an analysis when one or more parameters |
||||
|
assumes different values. |
||||
|
|
||||
|
- Devices - |
||||
|
Behavioral device: enhance the B device of spice3 to accepts IF THEN |
||||
|
ELSE conditions, and digital keywords like DELAY, HIGHV. LOWV, etc to |
||||
|
simulate simple digital device. |
||||
|
|
||||
|
Dynamically loading of device: reduce the memory occupied by the |
||||
|
simulator by using shared object code for devices. Each device |
||||
|
is a .so library that is inserted only if the circuit contains |
||||
|
an element modeled by the device. If we are simulating CMOS, |
||||
|
we do not need BJT or SOI (in most of the situations). |
||||
|
|
||||
|
Code Level Modeling: Let users write their devices in C and use |
||||
|
them in the simulator. I have discovered a couple of standars |
||||
|
for doing this at the Sematech ftp site. |
||||
|
|
||||
|
Improving device: Include additional parameters to some devices: |
||||
|
HDIF, LDIF, etc. (Serban, can you explain better). |
||||
|
|
||||
|
- Numerical Algs - |
||||
|
Integration: include (if necessary) more stable algorithms for |
||||
|
integration. Runge-Kutta Methods ? |
||||
|
|
||||
|
Linearization: |
||||
|
Are there better algorithms for nonlinear equations the the Newton |
||||
|
raphson ? |
||||
|
|
||||
|
- Sparse Matrix - |
||||
|
Faster handling of sparse matrices. |
||||
|
|
||||
|
|
||||
|
- Options - |
||||
|
Possibility to mesure circuit pameters, like the delay between two |
||||
|
nodes, etc. |
||||
|
|
||||
|
|
||||
|
... and others that will emerge during the project. |
||||
|
|
||||
|
|
||||
|
Paolo Nenzi (pnenzi@ieee.ing.uniroma.it) |
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
NOTES: |
||||
|
------ |
||||
|
|
||||
|
This version builds correctly on redhat linux 6.0, and most probably |
||||
|
on any glibc2-based linux distribution. The executables have hardly been |
||||
|
tested, all I know is that they build. The main goal of this release is |
||||
|
to get autoconf to work. |
||||
|
|
||||
|
The goal is to put all possible configurations flags into the autoconf support. |
||||
|
|
||||
|
It should build on most other unices (especially POSIX ones), please report to me |
||||
|
if it does, or if you know how to fix it if it doesn't. |
||||
|
|
||||
|
As the -Wall flag is turned on during compilation, you will notice a HUGE |
||||
|
amount of warnings - our first job should be to work on those to 'sanitize' |
||||
|
the existing code. |
||||
|
|
||||
|
|
||||
|
MAILING LISTS: |
||||
|
------------- |
||||
|
|
||||
|
There are three mailing lists dedicated to the development of ngspice. |
||||
|
|
||||
|
ng-spice@ieee.ing.uniroma1.it: This list is the list for the users of the |
||||
|
ng-spice simulator. |
||||
|
|
||||
|
ng-spice-devel@ieee.ing.uniroma1.it: ng-spice development issues. |
||||
|
|
||||
|
ng-spice-frontends@ieee.ing.uniroma1.it: issues related to development of |
||||
|
frontends for ng-spice. |
||||
|
|
||||
|
To subscribe the list(s), send a message to: |
||||
|
<ng-spice-subscribe@ieee.ing.uniroma1.it> |
||||
|
<ng-spice-devel-subscribe@ieee.ing.uniroma1.it> |
||||
|
<ng-spice-frontends-subscribe@ieee.ing.uniroma1.it> |
||||
|
|
||||
|
|
||||
|
WEB SITE: |
||||
|
-------- |
||||
|
|
||||
|
This project is hosted on the IEEE Central & South Italy Section Server. |
||||
|
The home page is http://ieee.ing.uniroma1.it/ngspice |
||||
|
|
||||
|
Manu (emmanuel.rouat@wanadoo.fr) |
||||
|
Paolo (p.nenzi@ieee.org) |
||||
|
|
||||
|
|
||||
@ -0,0 +1,24 @@ |
|||||
|
|
||||
|
/* Define the location of NGSPICEDATADIR */ |
||||
|
#define NGSPICEDATADIR none |
||||
|
|
||||
|
/* Define the location of NGSPICEBINDIR */ |
||||
|
#define NGSPICEBINDIR none |
||||
|
|
||||
|
/* Define the build date */ |
||||
|
#define NGSPICEBUILDDATE none |
||||
|
|
||||
|
/* Define if we have termcap */ |
||||
|
#undef HAVE_TERMCAP |
||||
|
|
||||
|
/* Define if we want NOBYPASS */ |
||||
|
#undef NOBYPASS |
||||
|
|
||||
|
/* Define if we want predictor algorithm */ |
||||
|
#undef PREDICTOR |
||||
|
|
||||
|
/* Define if we want spice2 sensitivity analysis */ |
||||
|
#undef WANT_SENSE2 |
||||
|
|
||||
|
/* Define if we want some experimental code */ |
||||
|
#undef EXPERIMENTAL_CODE |
||||
@ -0,0 +1,73 @@ |
|||||
|
#!/bin/sh |
||||
|
# Run this to generate all the initial makefiles, etc. |
||||
|
|
||||
|
PROJECT=ng-spice |
||||
|
TEST_TYPE=-d |
||||
|
FILE=src/circuit |
||||
|
|
||||
|
DIE=0 |
||||
|
|
||||
|
(autoconf --version) < /dev/null > /dev/null 2>&1 || { |
||||
|
echo |
||||
|
echo "You must have autoconf installed to compile $PROJECT." |
||||
|
echo "Download the appropriate package for your distribution," |
||||
|
echo "or get the source tarball at ftp://ftp.gnu.org/pub/gnu/" |
||||
|
DIE=1 |
||||
|
} |
||||
|
|
||||
|
(libtool --version) < /dev/null > /dev/null 2>&1 || { |
||||
|
echo |
||||
|
echo "You must have libtool installed to compile $PROJECT." |
||||
|
echo "Get ftp://alpha.gnu.org/gnu/libtool-1.0h.tar.gz" |
||||
|
echo "(or a newer version if it is available)" |
||||
|
DIE=1 |
||||
|
} |
||||
|
|
||||
|
(automake --version) < /dev/null > /dev/null 2>&1 || { |
||||
|
echo |
||||
|
echo "You must have automake installed to compile $PROJECT." |
||||
|
echo "Get ftp://ftp.cygnus.com/pub/home/tromey/automake-1.2d.tar.gz" |
||||
|
echo "(or a newer version if it is available)" |
||||
|
DIE=1 |
||||
|
} |
||||
|
|
||||
|
if test "$DIE" -eq 1; then |
||||
|
exit 1 |
||||
|
fi |
||||
|
|
||||
|
test $TEST_TYPE $FILE || { |
||||
|
echo "You must run this script in the top-level $PROJECT directory" |
||||
|
exit 1 |
||||
|
} |
||||
|
|
||||
|
if test -z "$*"; then |
||||
|
echo "I am going to run ./configure with no arguments - if you wish " |
||||
|
echo "to pass any to it, please specify them on the $0 command line." |
||||
|
fi |
||||
|
|
||||
|
case $CC in |
||||
|
*lcc | *lcc\ *) am_opt=--include-deps;; |
||||
|
esac |
||||
|
|
||||
|
#echo "Running gettextize... Ignore non-fatal messages." |
||||
|
# Hmm, we specify --force here, since otherwise things don't |
||||
|
# get added reliably, but we don't want to overwrite intl |
||||
|
# while making dist. |
||||
|
#echo "no" | gettextize --copy --force |
||||
|
|
||||
|
echo "Running libtoolize" |
||||
|
libtoolize --copy --force |
||||
|
|
||||
|
aclocal $ACLOCAL_FLAGS |
||||
|
|
||||
|
# optionally feature autoheader |
||||
|
(autoheader --version) < /dev/null > /dev/null 2>&1 && autoheader |
||||
|
|
||||
|
automake -c -a $am_opt |
||||
|
autoconf |
||||
|
|
||||
|
./configure "$@" |
||||
|
|
||||
|
echo |
||||
|
echo "Now type 'make' to compile $PROJECT." |
||||
|
|
||||
@ -0,0 +1,245 @@ |
|||||
|
dnl Process this file with autoconf to produce a configure script. |
||||
|
AC_INIT(src/main.c) |
||||
|
dnl Create a configuration header |
||||
|
AM_CONFIG_HEADER(config.h) |
||||
|
|
||||
|
dnl --enable-ansi : try to force --ansi option to the compiler |
||||
|
AC_ARG_ENABLE(ansi, |
||||
|
[ --enable-ansi Force --ansi option for compilation]) |
||||
|
|
||||
|
dnl --disable-debug : remove -g and -Wall option to the compiler |
||||
|
AC_ARG_ENABLE(debug, |
||||
|
[ --enable-debug Add -g option for compilation (default)]) |
||||
|
|
||||
|
dnl --enable-checker : add --with-checker-debug option to the compiler |
||||
|
AC_ARG_ENABLE(checker, |
||||
|
[ --enable-checkergcc Option for compilation with checkergcc]) |
||||
|
|
||||
|
dnl --enable-bypass : define BYPASS for the code |
||||
|
AC_ARG_ENABLE(nobypass, |
||||
|
[ --enable-nobypass Don't bypass recalculations of slowly changing variables]) |
||||
|
|
||||
|
dnl --enable-predictor : define PREDICTOR for the code |
||||
|
AC_ARG_ENABLE(predictor, |
||||
|
[ --enable-predictor Enables a predictor method for convergence]) |
||||
|
|
||||
|
dnl --enable-sense2 : define HAVE_SENSE2 for the code |
||||
|
AC_ARG_ENABLE(sense2, |
||||
|
[ --enable-sense2 Use spice2 sensitivity analysis]) |
||||
|
|
||||
|
dnl --enable-experimental : define EXPERIMENTAL_CODE for the code |
||||
|
AC_ARG_ENABLE(experimental, |
||||
|
[ --enable-experimental Enables some experimental code]) |
||||
|
|
||||
|
|
||||
|
dnl Initialize automake stuff |
||||
|
AM_INIT_AUTOMAKE(ng-spice-rework,10) |
||||
|
|
||||
|
dnl Enable maintainer commands only if requested |
||||
|
AM_MAINTAINER_MODE |
||||
|
|
||||
|
dnl Work on compiler options according to system: |
||||
|
dnl Set default CFLAG - only use -Wall if we have gcc |
||||
|
|
||||
|
AC_PROG_CC |
||||
|
|
||||
|
if test "x$GCC" = "xyes"; then |
||||
|
CFLAGS="$CFLAGS -Wall " |
||||
|
fi |
||||
|
|
||||
|
if test "$enable_debug" = "no"; then |
||||
|
AC_MSG_WARN(Removing debugging option!) |
||||
|
CFLAGS=" " |
||||
|
fi |
||||
|
|
||||
|
dnl Not sure that this will work.... |
||||
|
if test "$with_checkergcc" = "yes"; then |
||||
|
CC="checkergcc" |
||||
|
fi |
||||
|
|
||||
|
|
||||
|
dnl Checks for ANSI-C header files. |
||||
|
AC_HEADER_STDC |
||||
|
|
||||
|
if test "$enable_ansi" = "yes"; then |
||||
|
AM_PROG_CC_STDC |
||||
|
if test ! "$am_cv_prog_cc_stdc"="yes"; then |
||||
|
AC_MSG_WARN(Failed to find Ansi flag!) |
||||
|
fi |
||||
|
fi |
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
dnl Chech system we're on , and tune accordingly |
||||
|
AC_CANONICAL_HOST |
||||
|
|
||||
|
case "$host" in |
||||
|
|
||||
|
*bsd* ) CFLAGS="$CFLAGS";; |
||||
|
*linux*) CFLAGS="$CFLAGS";; |
||||
|
*rs6000* ) CFLAGS="$CFLAGS";; |
||||
|
*sgi* ) CFLAGS="$CFLAGS";; |
||||
|
*sun* ) CFLAGS="$CFLAGS";; |
||||
|
*ultrix* ) CFLAGS="$CFLAGS";; |
||||
|
|
||||
|
esac |
||||
|
|
||||
|
|
||||
|
|
||||
|
dnl Checks for programs |
||||
|
|
||||
|
AC_LIBTOOL_DLOPEN |
||||
|
AM_PROG_LIBTOOL |
||||
|
|
||||
|
|
||||
|
dnl Checks for X11 header files and libraries - X11 support can be disabled |
||||
|
dnl by passing the '--without-x' option to configure: |
||||
|
|
||||
|
AC_PATH_X |
||||
|
AC_PATH_XTRA |
||||
|
|
||||
|
|
||||
|
|
||||
|
dnl Checks for X libraries - if X11 wasn't found then don't make following |
||||
|
dnl tests and compile without X11 support - otherwise, check if the following |
||||
|
dnl libraries are present (error if they are not) |
||||
|
|
||||
|
|
||||
|
if test ! "$no_x" = "yes" ; then |
||||
|
X_LIBS="$X_LIBS -lX11 -lXt" |
||||
|
AC_CHECK_LIB(Xext, XShmAttach,X_LIBS="$X_LIBS -lXext",AC_MSG_ERROR(Couldn't find Xext librairies), $X_LIBS $X_EXTRA_LIBS) |
||||
|
AC_CHECK_LIB(Xaw,main,X_LIBS="$X_LIBS -lXaw",AC_MSG_ERROR(Couldn't find Xaw librairies),$X_LIBS $X_EXTRA_LIBS) |
||||
|
AC_CHECK_LIB(Xmu,main,X_LIBS="$X_LIBS -lXmu",AC_MSG_ERROR(Couldn't find Xmu librairies), $X_LIBS $X_EXTRA_LIBS) |
||||
|
|
||||
|
fi |
||||
|
|
||||
|
dnl Check for a few typdefs: |
||||
|
AC_TYPE_PID_T |
||||
|
AC_TYPE_SIGNAL |
||||
|
|
||||
|
dnl Check for a few libraries and headers: |
||||
|
|
||||
|
dnl Look for ncurses first, then termcap |
||||
|
AC_SEARCH_LIBS(tputs,ncurses termcap,AC_DEFINE(HAVE_TERMCAP), |
||||
|
AC_MSG_ERROR(Found neither ncurses or termcap)) |
||||
|
|
||||
|
|
||||
|
AC_HEADER_DIRENT |
||||
|
AC_CHECK_HEADERS(ctype.h unistd.h pwd.h fcntl.h) |
||||
|
AC_HEADER_SYS_WAIT |
||||
|
AC_HEADER_STAT |
||||
|
|
||||
|
dnl Check time and ressources headers and functions: |
||||
|
AC_HEADER_TIME |
||||
|
AC_STRUCT_TM |
||||
|
AC_STRUCT_TIMEZONE |
||||
|
AC_CHECK_FUNCS(localtime) |
||||
|
AC_CHECK_FUNCS(gettimeofday time ftime , break) |
||||
|
AC_CHECK_FUNCS(getrusage utimes, break) |
||||
|
AC_CHECK_FUNCS(getrlimit ulimit, break) |
||||
|
|
||||
|
dnl Look for termios first (posix) |
||||
|
AC_CHECK_HEADERS(termios.h termio.h sgtty.h , break) |
||||
|
AC_CHECK_FUNCS(isatty) |
||||
|
|
||||
|
dnl Check for a few functions: |
||||
|
AC_FUNC_VFORK |
||||
|
AC_CHECK_FUNCS(access bcopy qsort dup2 popen) |
||||
|
AC_CHECK_FUNCS(strchr index , break) |
||||
|
AC_CHECK_FUNCS(getcwd getwd , break) |
||||
|
|
||||
|
|
||||
|
AC_MSG_RESULT(Checking mathematical features of the system:) |
||||
|
dnl Look for math library: |
||||
|
AC_CHECK_LIB(m,sqrt) |
||||
|
AC_CHECK_HEADERS(float.h limits.h values.h) |
||||
|
|
||||
|
dnl Check for a few mathematical functions: |
||||
|
AC_CHECK_FUNCS(erfc logb scalb scalbn asinh acosh atanh) |
||||
|
|
||||
|
|
||||
|
# Expand the prefix variable (this is really annoying!) |
||||
|
if eval "test x$prefix = xNONE"; then |
||||
|
dprefix=$ac_default_prefix |
||||
|
else |
||||
|
dprefix=$prefix |
||||
|
fi |
||||
|
|
||||
|
AC_DEFINE_UNQUOTED(NGSPICEBINDIR, "`echo $dprefix/bin`" ) |
||||
|
AC_DEFINE_UNQUOTED(NGSPICEDATADIR, "`echo $dprefix/share/ng-spice`" ) |
||||
|
AC_DEFINE_UNQUOTED(NGSPICEBUILDDATE, "`date`" ) |
||||
|
|
||||
|
|
||||
|
# Recapitulate settings: |
||||
|
AC_MSG_RESULT(Settings which were chosen:) |
||||
|
if test "$enable_sense2" = "yes"; then |
||||
|
AC_DEFINE(WANT_SENSE2) |
||||
|
AC_MSG_RESULT(Spice2 sensitivity analysis enabled) |
||||
|
fi |
||||
|
if test "$enable_nobypass" = "yes"; then |
||||
|
AC_DEFINE(NOBYPASS) |
||||
|
AC_MSG_RESULT(NOBYPASS option enabled) |
||||
|
fi |
||||
|
if test "$enable_predictor" = "yes"; then |
||||
|
AC_DEFINE(PREDICTOR) |
||||
|
AC_MSG_RESULT(PREDICTOR algorithm enabled) |
||||
|
fi |
||||
|
if test "$enable_experimental" = "yes"; then |
||||
|
AC_DEFINE(EXPERIMENTAL_CODE) |
||||
|
AC_MSG_RESULT(EXPERIMENTAL_CODE enabled) |
||||
|
fi |
||||
|
|
||||
|
|
||||
|
AC_OUTPUT( \ |
||||
|
Makefile \ |
||||
|
doc/Makefile \ |
||||
|
man/Makefile \ |
||||
|
man/man1/Makefile \ |
||||
|
src/Makefile \ |
||||
|
src/analysis/Makefile \ |
||||
|
src/circuit/Makefile \ |
||||
|
src/devices/Makefile \ |
||||
|
src/devices/asrc/Makefile \ |
||||
|
src/devices/bjt/Makefile \ |
||||
|
src/devices/bsim1/Makefile \ |
||||
|
src/devices/bsim2/Makefile \ |
||||
|
src/devices/bsim3v1/Makefile \ |
||||
|
src/devices/bsim3/Makefile \ |
||||
|
src/devices/bsim4/Makefile \ |
||||
|
src/devices/bsim3v2/Makefile \ |
||||
|
src/devices/cap/Makefile \ |
||||
|
src/devices/cccs/Makefile \ |
||||
|
src/devices/ccvs/Makefile \ |
||||
|
src/devices/csw/Makefile \ |
||||
|
src/devices/devsup/Makefile \ |
||||
|
src/devices/dio/Makefile \ |
||||
|
src/devices/disto/Makefile \ |
||||
|
src/devices/ind/Makefile \ |
||||
|
src/devices/isrc/Makefile \ |
||||
|
src/devices/jfet/Makefile \ |
||||
|
src/devices/jfet2/Makefile \ |
||||
|
src/devices/ltra/Makefile \ |
||||
|
src/devices/mes/Makefile \ |
||||
|
src/devices/mos1/Makefile \ |
||||
|
src/devices/mos2/Makefile \ |
||||
|
src/devices/mos3/Makefile \ |
||||
|
src/devices/mos6/Makefile \ |
||||
|
src/devices/res/Makefile \ |
||||
|
src/devices/sw/Makefile \ |
||||
|
src/devices/tra/Makefile \ |
||||
|
src/devices/urc/Makefile \ |
||||
|
src/devices/vccs/Makefile \ |
||||
|
src/devices/vcvs/Makefile \ |
||||
|
src/devices/vsrc/Makefile \ |
||||
|
src/frontend/Makefile \ |
||||
|
src/hlp/Makefile \ |
||||
|
src/include/Makefile \ |
||||
|
src/maths/Makefile \ |
||||
|
src/maths/cmaths/Makefile \ |
||||
|
src/maths/ni/Makefile \ |
||||
|
src/maths/sparse/Makefile \ |
||||
|
src/misc/Makefile \ |
||||
|
src/parser/Makefile \ |
||||
|
tests/Makefile \ |
||||
|
) |
||||
@ -0,0 +1,11 @@ |
|||||
|
2000-03-22 Paolo Nenzi <p.nenzi@ieee.org> |
||||
|
|
||||
|
* mslib: Major update. M. Widlok sent the new version of it's programs. |
||||
|
|
||||
|
* spiceprm: Major update. See above line. |
||||
|
|
||||
|
1999-09-14 Arno <A.W.Peters@ieee.org> |
||||
|
|
||||
|
* mslib: Added. |
||||
|
|
||||
|
* spiceprm: Added. |
||||
@ -0,0 +1,5 @@ |
|||||
|
Mslib is free for everyone who think that it might by useful for |
||||
|
him. If someone makes it better please e-mail me. |
||||
|
|
||||
|
Michael Widlok |
||||
|
widlok@uci.agh.edu.pl |
||||
@ -0,0 +1,87 @@ |
|||||
|
/* |
||||
|
* MW. Include for spice |
||||
|
*/ |
||||
|
|
||||
|
#ifndef DATADEF_INC |
||||
|
#define DATADEF_INC |
||||
|
|
||||
|
/* |
||||
|
* Program defaults |
||||
|
* |
||||
|
* *Directory for input file and input libraries |
||||
|
*/ |
||||
|
#define DECKPATH "./" |
||||
|
#define LIBPATH "/usr/local/lib/" |
||||
|
|
||||
|
/* |
||||
|
* Name for output library file |
||||
|
*/ |
||||
|
#define TMPLIBNAME ".lib" /* |
||||
|
* * * * actual name is "deck.TMPLIBNAME" |
||||
|
*/ |
||||
|
|
||||
|
/* |
||||
|
* Command for libraries, subckts and models declaration |
||||
|
*/ |
||||
|
#define LIBINVL "*LIB" |
||||
|
#define SUBINVL "*SUB" |
||||
|
#define MODINVL "*MOD" |
||||
|
|
||||
|
/* |
||||
|
* Keywords for subckt start, end and model |
||||
|
*/ |
||||
|
#define SUBLINE ".SUBCKT" |
||||
|
#define SUBEND ".ENDS" |
||||
|
#define MODLINE ".MODEL" |
||||
|
#define MODEND |
||||
|
|
||||
|
#define LIBMESSAGE "* MW Library include for Spice" |
||||
|
|
||||
|
#define BSIZE 255 |
||||
|
#define MODDLINE 1 |
||||
|
#define SUBDLINE 4 |
||||
|
#define LIBDLINE 8 |
||||
|
#define SUBLLINE 16 |
||||
|
#define MODLLINE 32 |
||||
|
#define ENDSLLINE 64 |
||||
|
#define CONTLLINE 128 |
||||
|
#define NORMLINE 0 |
||||
|
#define WRITESUB 0xffff |
||||
|
#define WRITEMOD 0x1111 |
||||
|
#define NOWRITE 0x0 |
||||
|
#define FAILED 0xffffff |
||||
|
#define SUCCESS 0 |
||||
|
|
||||
|
#define IS_LIB 0x1 |
||||
|
#define LIB_OPEN 0x2 |
||||
|
|
||||
|
#define IS_MOD 0x10 |
||||
|
#define IS_SUB 0x100 |
||||
|
#define FINDED 0x400 |
||||
|
#define DUPLICATE 0x800 |
||||
|
|
||||
|
#define DECK_OPEN 0x20000 |
||||
|
#define TLIB_OPEN 0x100000 |
||||
|
|
||||
|
#define NAMEVALID 0xfff |
||||
|
#define NAMENOTV 0x0 |
||||
|
|
||||
|
struct LSData |
||||
|
{ |
||||
|
char name[BSIZE]; |
||||
|
FILE *filedes; |
||||
|
int flag; |
||||
|
struct LSData *prevLS; |
||||
|
struct LSData *nextLS; |
||||
|
}; |
||||
|
|
||||
|
struct LSData *LSinsert(struct LSData *LS, struct LSData *where); |
||||
|
struct LSData *LSclear(struct LSData *LS); |
||||
|
struct LSData *Backfree(struct LSData *LS); |
||||
|
int readdeck(FILE * tdeck, struct LSData *lib, \ |
||||
|
struct LSData *sub, struct LSData *mod); |
||||
|
int readlib(struct LSData *lib, FILE * tlib, \ |
||||
|
struct LSData *firstSUB, struct LSData *firstMOD); |
||||
|
int checkname(struct LSData *smp, char *name); |
||||
|
|
||||
|
#endif |
||||
@ -0,0 +1,93 @@ |
|||||
|
/* |
||||
|
* MW. Include for spice - LSData functions |
||||
|
*/ |
||||
|
|
||||
|
#include <stdlib.h> |
||||
|
#include <stdio.h> |
||||
|
#include <sys/types.h> |
||||
|
#include <string.h> |
||||
|
|
||||
|
#include "datadef.h" |
||||
|
|
||||
|
char *Message = "Michael Widlok, all rights reserved \n" |
||||
|
"mslib - MW include for Spice models/subckts\n"; |
||||
|
|
||||
|
/* |
||||
|
* Add or cretate new LS structure just after where pointer |
||||
|
*/ |
||||
|
struct LSData * |
||||
|
LSinsert(struct LSData *LS, struct LSData *where) |
||||
|
{ |
||||
|
|
||||
|
if (!(LS)) |
||||
|
{ |
||||
|
LS = (struct LSData *) malloc(sizeof(struct LSData)); |
||||
|
|
||||
|
if (!(LS)) |
||||
|
{ |
||||
|
fprintf(stderr, "LSinsert: Can't allocate LSData srtucture.\n"); |
||||
|
exit(FAILED); |
||||
|
} |
||||
|
LS->filedes = NULL; |
||||
|
} |
||||
|
/* |
||||
|
* If where is given we must set nextLS and prevLS correctly |
||||
|
*/ |
||||
|
if (where) |
||||
|
{ |
||||
|
LS->prevLS = where; |
||||
|
if (LS->nextLS = where->nextLS) |
||||
|
where->nextLS->prevLS = LS; |
||||
|
where->nextLS = LS; |
||||
|
} else |
||||
|
LS->nextLS = LS->prevLS = NULL; |
||||
|
return LS; |
||||
|
} |
||||
|
|
||||
|
/* |
||||
|
* Clear all LS list from end. This also closes opened files |
||||
|
*/ |
||||
|
struct LSData * |
||||
|
LSclear(struct LSData *LS) |
||||
|
{ |
||||
|
while (LS->nextLS) |
||||
|
LS = LS->nextLS; |
||||
|
return Backfree(LS); |
||||
|
} |
||||
|
|
||||
|
/* |
||||
|
* Used by LSclear |
||||
|
*/ |
||||
|
struct LSData * |
||||
|
Backfree(struct LSData *LS) |
||||
|
{ |
||||
|
if (LS->filedes) |
||||
|
fclose(LS->filedes); |
||||
|
return (LS->prevLS) ? Backfree(LS->prevLS) : free(LS), LS; |
||||
|
} |
||||
|
|
||||
|
/* |
||||
|
* Check if sub/mod name should by included |
||||
|
*/ |
||||
|
int |
||||
|
checkname(struct LSData *smp, char *name) |
||||
|
{ |
||||
|
do |
||||
|
{ |
||||
|
if (!(strcmp(smp->name, name))) |
||||
|
{ |
||||
|
if (smp->flag != FINDED) |
||||
|
{ |
||||
|
smp->flag = FINDED; |
||||
|
return NAMEVALID; |
||||
|
} else |
||||
|
{ |
||||
|
smp->flag = DUPLICATE; |
||||
|
return NAMEVALID; |
||||
|
} |
||||
|
} |
||||
|
smp = smp->nextLS; |
||||
|
} |
||||
|
while (smp); |
||||
|
return NAMENOTV; |
||||
|
} |
||||
@ -0,0 +1,199 @@ |
|||||
|
/* |
||||
|
* MW. Include for spice |
||||
|
*/ |
||||
|
#include <stdlib.h> |
||||
|
#include <stdio.h> |
||||
|
#include <sys/types.h> |
||||
|
#include <string.h> |
||||
|
|
||||
|
#include "datadef.h" |
||||
|
|
||||
|
static int whatdline(char *tbuf, char *firstname); |
||||
|
static int whatlline(char *tbuf, char *name); |
||||
|
|
||||
|
extern int bsizer; |
||||
|
extern char buf[BSIZE]; |
||||
|
|
||||
|
/* |
||||
|
* Read deck and search for *MOD, *LIB, *SUB commands |
||||
|
*/ |
||||
|
int |
||||
|
readdeck(FILE * tdeck, struct LSData *lib, \ |
||||
|
struct LSData *sub, struct LSData *mod) |
||||
|
{ |
||||
|
char firstname[BSIZE]; |
||||
|
char *names, *smlp; |
||||
|
struct LSData *which; |
||||
|
|
||||
|
while (fgets(buf, bsizer, tdeck)) |
||||
|
{ |
||||
|
|
||||
|
smlp = buf; |
||||
|
/* |
||||
|
* Ignore control chars at the end of line |
||||
|
*/ |
||||
|
do |
||||
|
{ |
||||
|
smlp++; |
||||
|
} |
||||
|
while ((!(iscntrl(*smlp))) && (*smlp != '\0')); |
||||
|
*smlp = '\0'; |
||||
|
|
||||
|
switch (whatdline(buf, firstname)) |
||||
|
{ |
||||
|
|
||||
|
case LIBDLINE: |
||||
|
lib->flag = IS_LIB; |
||||
|
which = lib; |
||||
|
break; |
||||
|
|
||||
|
case SUBDLINE: |
||||
|
sub->flag = IS_SUB; |
||||
|
which = sub; |
||||
|
break; |
||||
|
|
||||
|
case MODDLINE: |
||||
|
mod->flag = IS_MOD; |
||||
|
which = mod; |
||||
|
break; |
||||
|
|
||||
|
default: |
||||
|
which = NULL; |
||||
|
} |
||||
|
|
||||
|
/* |
||||
|
* If we finded something |
||||
|
*/ |
||||
|
if (which) |
||||
|
{ |
||||
|
names = buf; |
||||
|
strsep(&names, " "); |
||||
|
|
||||
|
while (smlp = strsep(&names, " ")) |
||||
|
{ |
||||
|
if (*smlp) |
||||
|
{ |
||||
|
which = LSinsert(NULL, which); |
||||
|
strcpy(which->name, smlp); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
return ((lib->flag != IS_LIB) && (mod->flag != IS_MOD) \ |
||||
|
&&(sub->flag != IS_SUB)) ? FAILED : SUCCESS; |
||||
|
} |
||||
|
|
||||
|
/* |
||||
|
* Read library and write specififed models/subckts to tmplib |
||||
|
*/ |
||||
|
int |
||||
|
readlib(struct LSData *lib, FILE * tlib, \ |
||||
|
struct LSData *sub, struct LSData *mod) |
||||
|
{ |
||||
|
|
||||
|
char name[BSIZE]; |
||||
|
int numi, wflag; |
||||
|
|
||||
|
numi = 0; |
||||
|
wflag = NOWRITE; |
||||
|
|
||||
|
while (fgets(buf, bsizer, lib->filedes)) |
||||
|
{ |
||||
|
/* |
||||
|
* Now we must check what line is it and if it should be written to tmplib |
||||
|
*/ |
||||
|
switch (whatlline(buf, name)) |
||||
|
{ |
||||
|
|
||||
|
case (MODLLINE): |
||||
|
if (wflag == WRITESUB) |
||||
|
fputs(buf, tlib); |
||||
|
else |
||||
|
{ |
||||
|
|
||||
|
if (mod) |
||||
|
{ |
||||
|
if (checkname(mod, name)) |
||||
|
{ |
||||
|
wflag = WRITEMOD; |
||||
|
numi++; |
||||
|
fprintf(tlib, "* Model: %s, from: %s.\n", \ |
||||
|
name, lib->name); |
||||
|
fputs(buf, tlib); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
break; |
||||
|
|
||||
|
case (SUBLLINE): |
||||
|
if (sub) |
||||
|
{ |
||||
|
if (checkname(sub, name)) |
||||
|
{ |
||||
|
wflag = WRITESUB; |
||||
|
numi++; |
||||
|
fprintf(tlib, "* Subckt: %s, from: %s.\n", \ |
||||
|
name, lib->name); |
||||
|
fputs(buf, tlib); |
||||
|
} |
||||
|
} |
||||
|
break; |
||||
|
|
||||
|
case (NORMLINE): |
||||
|
if (wflag == WRITEMOD) |
||||
|
{ |
||||
|
wflag = NOWRITE; |
||||
|
fputs("\n* End Model.\n\n", tlib); |
||||
|
} |
||||
|
if (wflag == WRITESUB) |
||||
|
fputs(buf, tlib); |
||||
|
break; |
||||
|
|
||||
|
case (ENDSLLINE): |
||||
|
if (wflag == WRITESUB) |
||||
|
{ |
||||
|
fprintf(tlib, "%s\n* End Subckt\n\n", buf); |
||||
|
} |
||||
|
wflag = NOWRITE; |
||||
|
break; |
||||
|
|
||||
|
case (CONTLLINE): |
||||
|
if (wflag != NOWRITE) |
||||
|
fputs(buf, tlib); |
||||
|
} |
||||
|
|
||||
|
} |
||||
|
return numi; |
||||
|
} |
||||
|
|
||||
|
/* |
||||
|
* Check what line in deck it is |
||||
|
*/ |
||||
|
int |
||||
|
whatdline(char *tbuf, char *firstname) |
||||
|
{ |
||||
|
if (sscanf(tbuf, "*LIB %s", firstname) == 1) |
||||
|
return LIBDLINE; |
||||
|
if (sscanf(tbuf, "*SUB %s", firstname) == 1) |
||||
|
return SUBDLINE; |
||||
|
if (sscanf(tbuf, "*MOD %s", firstname) == 1) |
||||
|
return MODDLINE; |
||||
|
return NORMLINE; |
||||
|
} |
||||
|
|
||||
|
/* |
||||
|
* Check what line it is. If we have model or subckt line we also read its name |
||||
|
*/ |
||||
|
int |
||||
|
whatlline(char *tbuf, char *name) |
||||
|
{ |
||||
|
if (sscanf(tbuf, ".SUBCKT %s %*s", name) == 1) |
||||
|
return SUBLLINE; |
||||
|
if (sscanf(tbuf, ".MODEL %s %*s", name) == 1) |
||||
|
return MODLLINE; |
||||
|
if (sscanf(tbuf, ".ENDS%c", name) == 1) |
||||
|
return ENDSLLINE; |
||||
|
if (sscanf(tbuf, "+%s", name) == 1) |
||||
|
return CONTLLINE; |
||||
|
return NORMLINE; |
||||
|
} |
||||
@ -0,0 +1,208 @@ |
|||||
|
/* |
||||
|
* MW. Include - main functions |
||||
|
*/ |
||||
|
|
||||
|
#include <stdlib.h> |
||||
|
#include <stdio.h> |
||||
|
#include <unistd.h> |
||||
|
#include <string.h> |
||||
|
|
||||
|
#include "datadef.h" |
||||
|
|
||||
|
struct LSData *firstLIB; |
||||
|
struct LSData *firstSUB; |
||||
|
struct LSData *firstMOD; |
||||
|
struct LSData *deck; |
||||
|
struct LSData *tmplib; |
||||
|
int bsize, bsizer; |
||||
|
char buf[BSIZE]; |
||||
|
|
||||
|
int |
||||
|
main(int argc, char *argv[]) |
||||
|
{ |
||||
|
|
||||
|
/* |
||||
|
* Initialize everything |
||||
|
*/ |
||||
|
struct LSData *subp, *libp, *modp; |
||||
|
char tch[BSIZE]; |
||||
|
int mswritten; |
||||
|
|
||||
|
tmplib = LSinsert(NULL, NULL); |
||||
|
deck = LSinsert(NULL, NULL); |
||||
|
*tch = '\0'; |
||||
|
mswritten = 0; |
||||
|
|
||||
|
switch (argc) |
||||
|
{ |
||||
|
|
||||
|
case 3: |
||||
|
strcpy(tmplib->name, argv[--argc]); |
||||
|
strcpy(tch, tmplib->name); |
||||
|
|
||||
|
case 2: |
||||
|
strcpy(deck->name, argv[--argc]); |
||||
|
if (!(*tch)) |
||||
|
{ |
||||
|
sprintf(tmplib->name, "%s%s", deck->name, TMPLIBNAME); |
||||
|
strcpy(tch, tmplib->name); |
||||
|
} |
||||
|
break; |
||||
|
|
||||
|
case 1: |
||||
|
fprintf(stdout, "Usage: mslib deck [tmplib]\n"); |
||||
|
return FAILED; |
||||
|
|
||||
|
default: |
||||
|
fprintf(stderr, "mslib: Incorrect parameters count.\n"); |
||||
|
return FAILED; |
||||
|
} |
||||
|
|
||||
|
/* |
||||
|
* Open deck |
||||
|
*/ |
||||
|
if (!(deck->filedes = fopen(deck->name, "r"))) |
||||
|
{ |
||||
|
sprintf(deck->name, "%s%s", DECKPATH, argv[1]); |
||||
|
sprintf(tmplib->name, "%s%s", DECKPATH, tch); |
||||
|
|
||||
|
if (!(deck->filedes = fopen(deck->name, "r"))) |
||||
|
{ |
||||
|
fprintf(stderr, "mslib: Can't open deck %s.\n", deck->name); |
||||
|
LSclear(deck); |
||||
|
LSclear(tmplib); |
||||
|
return FAILED; |
||||
|
} |
||||
|
} |
||||
|
bsizer = BSIZE; |
||||
|
bsize = bsizer--; |
||||
|
|
||||
|
deck->flag = DECK_OPEN; |
||||
|
|
||||
|
/* |
||||
|
* Create tmplib and write first line to it |
||||
|
*/ |
||||
|
if (!(tmplib->filedes = fopen(tmplib->name, "w"))) |
||||
|
{ |
||||
|
fprintf(stderr, "mslib: Can't creat tmplib %s.\n", tmplib->name); |
||||
|
LSclear(tmplib); |
||||
|
LSclear(deck); |
||||
|
return FAILED; |
||||
|
} |
||||
|
tmplib->flag = TLIB_OPEN; |
||||
|
fprintf(tmplib->filedes, "%s\n* Tmp library: %s,\n* For deck: %s.\n\n", \ |
||||
|
LIBMESSAGE, tmplib->name, deck->name); |
||||
|
|
||||
|
firstLIB = LSinsert(NULL, NULL); |
||||
|
firstSUB = LSinsert(NULL, NULL); |
||||
|
firstMOD = LSinsert(NULL, NULL); |
||||
|
|
||||
|
/* |
||||
|
* Find commands in deck |
||||
|
*/ |
||||
|
readdeck(deck->filedes, firstLIB, firstSUB, firstMOD); |
||||
|
|
||||
|
if (firstLIB->flag = IS_LIB) |
||||
|
{ |
||||
|
|
||||
|
libp = firstLIB->nextLS; |
||||
|
do |
||||
|
{ |
||||
|
if (!(libp->filedes = fopen(libp->name, "r"))) |
||||
|
{ |
||||
|
strcpy(tch, libp->name); |
||||
|
sprintf(libp->name, "%s%s", LIBPATH, tch); |
||||
|
|
||||
|
if (!(libp->filedes = fopen(libp->name, "r"))) |
||||
|
{ |
||||
|
libp->flag = FAILED; |
||||
|
} |
||||
|
} |
||||
|
/* |
||||
|
* Read libraries if everything is OK |
||||
|
*/ |
||||
|
if (libp->flag != FAILED) |
||||
|
{ |
||||
|
libp->flag = LIB_OPEN; |
||||
|
|
||||
|
modp = (firstMOD->flag == IS_MOD) ? firstMOD->nextLS : NULL; |
||||
|
subp = (firstSUB->flag == IS_SUB) ? firstSUB->nextLS : NULL; |
||||
|
|
||||
|
mswritten += readlib(libp, tmplib->filedes, subp, modp); |
||||
|
} |
||||
|
libp = libp->nextLS; |
||||
|
} |
||||
|
while (libp); |
||||
|
} |
||||
|
fprintf(stdout, "mslib: Written %d items to tmplib %s.\n", \ |
||||
|
mswritten, tmplib->name); |
||||
|
|
||||
|
if (libp = firstLIB->nextLS) |
||||
|
{ |
||||
|
do |
||||
|
{ |
||||
|
if (libp->flag != LIB_OPEN) |
||||
|
fprintf(stderr, " Can't open lib %s.\n", libp->name); |
||||
|
libp = libp->nextLS; |
||||
|
} |
||||
|
while (libp); |
||||
|
} |
||||
|
/* |
||||
|
* Check is models or subckts were find and |
||||
|
* * are not duplicated |
||||
|
*/ |
||||
|
if (modp = firstMOD->nextLS) |
||||
|
{ |
||||
|
do |
||||
|
{ |
||||
|
switch (modp->flag) |
||||
|
{ |
||||
|
case DUPLICATE: |
||||
|
fprintf(stderr, " Model duplicated %s.\n", \ |
||||
|
modp->name); |
||||
|
break; |
||||
|
default: |
||||
|
fprintf(stderr, " Can't find model %s.\n", \ |
||||
|
modp->name); |
||||
|
break; |
||||
|
|
||||
|
case FINDED: |
||||
|
} |
||||
|
|
||||
|
modp = modp->nextLS; |
||||
|
} |
||||
|
while (modp); |
||||
|
} |
||||
|
if (subp = firstSUB->nextLS) |
||||
|
{ |
||||
|
do |
||||
|
{ |
||||
|
switch (subp->flag) |
||||
|
{ |
||||
|
case DUPLICATE: |
||||
|
fprintf(stderr, " Subckt duplicated %s.\n", \ |
||||
|
subp->name); |
||||
|
break; |
||||
|
default: |
||||
|
fprintf(stderr, " Can't find subckt %s.\n", \ |
||||
|
subp->name); |
||||
|
break; |
||||
|
|
||||
|
case FINDED: |
||||
|
} |
||||
|
subp = subp->nextLS; |
||||
|
} |
||||
|
while (subp); |
||||
|
} |
||||
|
/* |
||||
|
* Clear all data and close files |
||||
|
*/ |
||||
|
|
||||
|
LSclear(tmplib); |
||||
|
LSclear(deck); |
||||
|
LSclear(firstLIB); |
||||
|
LSclear(firstSUB); |
||||
|
|
||||
|
return SUCCESS; |
||||
|
|
||||
|
} |
||||
@ -0,0 +1,12 @@ |
|||||
|
# MW. Include libs for Spice
|
||||
|
CFLAGS= -O2 -s |
||||
|
LDFLAGS= -s |
||||
|
|
||||
|
OBJS= inc_main.o inc_inp.o inc_LSD.o |
||||
|
HDRS= datadef.h |
||||
|
SRCC= inc_main.c inc_inp.c inc_LSD.c |
||||
|
|
||||
|
mslib: $(OBJS) |
||||
|
$(CC) $(LDFLAGS) -o $@ $(OBJS) |
||||
|
|
||||
|
$(OBJS): $(HDRS) |
||||
@ -0,0 +1,35 @@ |
|||||
|
Mslib can create a small tmp library which can be .include to spice deck or |
||||
|
used as tmp file with libprm. |
||||
|
You invoke it like this: mslib deck_name [tmp_lib_name]. If second argument |
||||
|
is not given mslib uses deck_name.lib. Mslib then reads deck and looks for |
||||
|
special commands in it. This commands are: |
||||
|
|
||||
|
*SUB name1 name2 ... - what subckts are used |
||||
|
*MOD name1 name2 ... - what models are used |
||||
|
*LIB name1 name2 ... - what libraries should be searched |
||||
|
|
||||
|
You can give full path for libraries or just the name. Mslib tries to |
||||
|
find them in current directory and then in directory specified in datadef.h |
||||
|
file. There are also some other default options defined there. Check them |
||||
|
After all a tmp. library for the deck is created. It consist only the models |
||||
|
and subckts that were specified in *MOD and *SUB commands. |
||||
|
|
||||
|
|
||||
|
|
||||
|
This is all. |
||||
|
Mslib is _NOT_ a good program. It should automatically recognize what models |
||||
|
or subckts were used and it should be written with flex or bison. Now it |
||||
|
just indicates what is my level of programming in C. |
||||
|
There are some options that You can set for mslib in datadef.h. I tried to |
||||
|
document all of them there, so when want to know more look to the sources. |
||||
|
|
||||
|
And one more thing. There is a perl program "spiceprm" that lets You use |
||||
|
parameters in subckts. Many Intusoft's libraries use this feature. To use |
||||
|
parameters I have written a small shell script "libprm". This program |
||||
|
automatic runs spiceprm and mslib on Your's deck to give a working spice |
||||
|
input file. To see how this all works please read "libprm_readme" and |
||||
|
spiceprm readme. |
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
@ -0,0 +1,5 @@ |
|||||
|
These scripts are free for everyone who think that they might by useful for |
||||
|
him. If someone makes them better please e-mail me. |
||||
|
|
||||
|
Michael Widlok |
||||
|
widlok@uci.agh.edu.pl |
||||
@ -0,0 +1,77 @@ |
|||||
|
#!/bin/sh |
||||
|
#set -x -v |
||||
|
|
||||
|
# MW. Lib search / show program |
||||
|
|
||||
|
# usage liblook libname [text_to_find] [l_before] [l_after] |
||||
|
|
||||
|
LIBPATH=/usr/local/lib |
||||
|
|
||||
|
function trapper() |
||||
|
{ |
||||
|
echo User break! |
||||
|
echo Exiting . . . |
||||
|
unset LIBPATH |
||||
|
exit 1 |
||||
|
} |
||||
|
|
||||
|
trap trapper SIGINT SIGQUIT |
||||
|
|
||||
|
function operror() |
||||
|
{ |
||||
|
echo Incorrect parameters: $*, $# |
||||
|
echo Usage: liblook libname [text_to_find] [l_before] [l_after] |
||||
|
unset LIBPATH |
||||
|
exit 2 |
||||
|
} |
||||
|
|
||||
|
function showlib() |
||||
|
{ |
||||
|
if test -f $LIBPATH/$1; then |
||||
|
less $LIBPATH/$1; exit 0; fi |
||||
|
|
||||
|
if test -f [C./$1; then |
||||
|
less ./$1; exit 0; fi |
||||
|
|
||||
|
echo Searching $1 in ~/ . . . |
||||
|
less $(find ~/ -name $1) |
||||
|
} |
||||
|
|
||||
|
function searchlib() |
||||
|
{ |
||||
|
if test -f $LIBPATH/$1; then |
||||
|
echo File: $LIBNMAE; echo; |
||||
|
grep -B"$3" -A"$4" --ignore-case -e "$2" $LIBPATH/$LIBNAME1; |
||||
|
echo; exit 0; fi |
||||
|
|
||||
|
if test -f ./$1; then |
||||
|
echo File: $1; echo; |
||||
|
grep -B"$3" -A"$4" --ignore-case -e "$2" ./$1; |
||||
|
echo; exit 0; fi |
||||
|
|
||||
|
#if *.lib or sth like this |
||||
|
|
||||
|
echo Searching $1 in ~/ . . .;echo; |
||||
|
if (grep -B"$3" -A"$4" --ignore-case -e "$2" $(find ~/ -name $1)); then |
||||
|
echo; exit 0; fi |
||||
|
|
||||
|
echo Searching $1 in $LIBPATH;echo; |
||||
|
if (grep -B"$3" -A"$4" --ignore-case -e "$2" $(find $LIBPATH -name $1)); then |
||||
|
echo; exit 0; fi |
||||
|
|
||||
|
} |
||||
|
|
||||
|
|
||||
|
# Main body |
||||
|
if test $# -lt 1 -o $# -gt 4; then operror $*; fi |
||||
|
|
||||
|
case $# in |
||||
|
1) showlib $*;; |
||||
|
2) searchlib $1 $2 2 2;; |
||||
|
3) searchlib $1 $2 $3 2;; |
||||
|
4) searchlib $1 $2 $3 $4;; |
||||
|
esac |
||||
|
|
||||
|
unset LIBPATH |
||||
|
exit 0 |
||||
|
|
||||
@ -0,0 +1,9 @@ |
|||||
|
Liblook is a script that can show specified model or sub-circuit entry in |
||||
|
spice library. Common use look like this: |
||||
|
|
||||
|
liblook lib_name [text_to_find] [lines_before] [lines_after] |
||||
|
|
||||
|
lines_before and lines_after are used when you want to specify how many lines |
||||
|
you want to see before or after given text. Look to he source for more |
||||
|
details. |
||||
|
|
||||
@ -0,0 +1,58 @@ |
|||||
|
#!/bin/sh |
||||
|
#set -x -v |
||||
|
|
||||
|
# MW. Lip / Param parsing program for spice |
||||
|
|
||||
|
# -n normal, -f full (keep everything), -r replace original file |
||||
|
|
||||
|
export TMPLP=/tmp/LibPrm.$$- |
||||
|
|
||||
|
function trapper() |
||||
|
{ |
||||
|
echo User break! |
||||
|
echo Exiting . . . |
||||
|
rm -f -v ${TMPLP}* |
||||
|
unset TMPLP |
||||
|
exit 1 |
||||
|
} |
||||
|
|
||||
|
trap trapper SIGINT SIGQUIT |
||||
|
|
||||
|
function operror() |
||||
|
{ |
||||
|
echo Incorrect parameters: $*, $# |
||||
|
unset TMPLP |
||||
|
exit 2 |
||||
|
} |
||||
|
|
||||
|
function repnormpl() |
||||
|
{ |
||||
|
mslib $1 ${TMPLP}1 |
||||
|
sed -n -e 'p' -e "1r ${TMPLP}1" $1 >${TMPLP}2 |
||||
|
spiceprm ${TMPLP}2 $2 |
||||
|
} |
||||
|
|
||||
|
function keepall() |
||||
|
{ |
||||
|
mslib $1 |
||||
|
sed -n -e 'p' -e "1r $1.lib" $1 >${TMPLP}2 |
||||
|
spiceprm ${TMPLP}2 $2 |
||||
|
} |
||||
|
|
||||
|
|
||||
|
# Main body |
||||
|
if test $# -lt 2 -o $# -gt 3; then operror $*; fi |
||||
|
|
||||
|
case $1$# in |
||||
|
-r3) operror $*;; |
||||
|
-n2) repnormpl $2 ${2%.cir}.ckt;; |
||||
|
-n3) repnormpl $2 $3;; |
||||
|
-r2) repnormpl $2 $2;; |
||||
|
-f2) keepall $2 ${2%.cir}.ckt;; |
||||
|
-f3) keepall $2 $3;; |
||||
|
esac |
||||
|
|
||||
|
rm -f ${TMPLP}* |
||||
|
unset TMPLP |
||||
|
exit 0 |
||||
|
|
||||
@ -0,0 +1,14 @@ |
|||||
|
So, this is my idea of using parametrized subckts with spice. |
||||
|
|
||||
|
First I create an input file like foo.cir and I include commands for |
||||
|
mslib (*MOD, *SUB, *LIB) in it. Then I run "libprm -n foo.cir". Libprm then |
||||
|
runs mslib first to get all models and subckts form given libraries and then |
||||
|
runs spiceprm to evaluate all used parameters. |
||||
|
This works quite right for me, and I hope that You will find my idea |
||||
|
useful. Spiceprm is not my program (I get it from Internet), but I think |
||||
|
that it will better to enclose all used programs in this packet. Spiceprm |
||||
|
has it's own directory with very good readme and examples. If You want to |
||||
|
find out more about libprm or mslib look for the source code. These are rather |
||||
|
short and easy programs - they are all that I could write in quite short |
||||
|
time. |
||||
|
|
||||
@ -0,0 +1,18 @@ |
|||||
|
---------------------------------------------------------------------- |
||||
|
Version 0.11 January 2, 1996 |
||||
|
---------------------------------------------------------------------- |
||||
|
No new features. |
||||
|
|
||||
|
Bug Fixes - |
||||
|
----------- |
||||
|
|
||||
|
1. Duplicate name clash problem with parameterized subckt calls from |
||||
|
within a .subckt....ends block. |
||||
|
|
||||
|
2. Writing continuation lines to the output file occaisionally choked. |
||||
|
|
||||
|
|
||||
|
---------------------------------------------------------------------- |
||||
|
Version 0.10 October 10, 1996 |
||||
|
---------------------------------------------------------------------- |
||||
|
Original release. |
||||
@ -0,0 +1,339 @@ |
|||||
|
GNU GENERAL PUBLIC LICENSE |
||||
|
Version 2, June 1991 |
||||
|
|
||||
|
Copyright (C) 1989, 1991 Free Software Foundation, Inc. |
||||
|
675 Mass Ave, Cambridge, MA 02139, USA |
||||
|
Everyone is permitted to copy and distribute verbatim copies |
||||
|
of this license document, but changing it is not allowed. |
||||
|
|
||||
|
Preamble |
||||
|
|
||||
|
The licenses for most software are designed to take away your |
||||
|
freedom to share and change it. By contrast, the GNU General Public |
||||
|
License is intended to guarantee your freedom to share and change free |
||||
|
software--to make sure the software is free for all its users. This |
||||
|
General Public License applies to most of the Free Software |
||||
|
Foundation's software and to any other program whose authors commit to |
||||
|
using it. (Some other Free Software Foundation software is covered by |
||||
|
the GNU Library General Public License instead.) You can apply it to |
||||
|
your programs, too. |
||||
|
|
||||
|
When we speak of free software, we are referring to freedom, not |
||||
|
price. Our General Public Licenses are designed to make sure that you |
||||
|
have the freedom to distribute copies of free software (and charge for |
||||
|
this service if you wish), that you receive source code or can get it |
||||
|
if you want it, that you can change the software or use pieces of it |
||||
|
in new free programs; and that you know you can do these things. |
||||
|
|
||||
|
To protect your rights, we need to make restrictions that forbid |
||||
|
anyone to deny you these rights or to ask you to surrender the rights. |
||||
|
These restrictions translate to certain responsibilities for you if you |
||||
|
distribute copies of the software, or if you modify it. |
||||
|
|
||||
|
For example, if you distribute copies of such a program, whether |
||||
|
gratis or for a fee, you must give the recipients all the rights that |
||||
|
you have. You must make sure that they, too, receive or can get the |
||||
|
source code. And you must show them these terms so they know their |
||||
|
rights. |
||||
|
|
||||
|
We protect your rights with two steps: (1) copyright the software, and |
||||
|
(2) offer you this license which gives you legal permission to copy, |
||||
|
distribute and/or modify the software. |
||||
|
|
||||
|
Also, for each author's protection and ours, we want to make certain |
||||
|
that everyone understands that there is no warranty for this free |
||||
|
software. If the software is modified by someone else and passed on, we |
||||
|
want its recipients to know that what they have is not the original, so |
||||
|
that any problems introduced by others will not reflect on the original |
||||
|
authors' reputations. |
||||
|
|
||||
|
Finally, any free program is threatened constantly by software |
||||
|
patents. We wish to avoid the danger that redistributors of a free |
||||
|
program will individually obtain patent licenses, in effect making the |
||||
|
program proprietary. To prevent this, we have made it clear that any |
||||
|
patent must be licensed for everyone's free use or not licensed at all. |
||||
|
|
||||
|
The precise terms and conditions for copying, distribution and |
||||
|
modification follow. |
||||
|
|
||||
|
GNU GENERAL PUBLIC LICENSE |
||||
|
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION |
||||
|
|
||||
|
0. This License applies to any program or other work which contains |
||||
|
a notice placed by the copyright holder saying it may be distributed |
||||
|
under the terms of this General Public License. The "Program", below, |
||||
|
refers to any such program or work, and a "work based on the Program" |
||||
|
means either the Program or any derivative work under copyright law: |
||||
|
that is to say, a work containing the Program or a portion of it, |
||||
|
either verbatim or with modifications and/or translated into another |
||||
|
language. (Hereinafter, translation is included without limitation in |
||||
|
the term "modification".) Each licensee is addressed as "you". |
||||
|
|
||||
|
Activities other than copying, distribution and modification are not |
||||
|
covered by this License; they are outside its scope. The act of |
||||
|
running the Program is not restricted, and the output from the Program |
||||
|
is covered only if its contents constitute a work based on the |
||||
|
Program (independent of having been made by running the Program). |
||||
|
Whether that is true depends on what the Program does. |
||||
|
|
||||
|
1. You may copy and distribute verbatim copies of the Program's |
||||
|
source code as you receive it, in any medium, provided that you |
||||
|
conspicuously and appropriately publish on each copy an appropriate |
||||
|
copyright notice and disclaimer of warranty; keep intact all the |
||||
|
notices that refer to this License and to the absence of any warranty; |
||||
|
and give any other recipients of the Program a copy of this License |
||||
|
along with the Program. |
||||
|
|
||||
|
You may charge a fee for the physical act of transferring a copy, and |
||||
|
you may at your option offer warranty protection in exchange for a fee. |
||||
|
|
||||
|
2. You may modify your copy or copies of the Program or any portion |
||||
|
of it, thus forming a work based on the Program, and copy and |
||||
|
distribute such modifications or work under the terms of Section 1 |
||||
|
above, provided that you also meet all of these conditions: |
||||
|
|
||||
|
a) You must cause the modified files to carry prominent notices |
||||
|
stating that you changed the files and the date of any change. |
||||
|
|
||||
|
b) You must cause any work that you distribute or publish, that in |
||||
|
whole or in part contains or is derived from the Program or any |
||||
|
part thereof, to be licensed as a whole at no charge to all third |
||||
|
parties under the terms of this License. |
||||
|
|
||||
|
c) If the modified program normally reads commands interactively |
||||
|
when run, you must cause it, when started running for such |
||||
|
interactive use in the most ordinary way, to print or display an |
||||
|
announcement including an appropriate copyright notice and a |
||||
|
notice that there is no warranty (or else, saying that you provide |
||||
|
a warranty) and that users may redistribute the program under |
||||
|
these conditions, and telling the user how to view a copy of this |
||||
|
License. (Exception: if the Program itself is interactive but |
||||
|
does not normally print such an announcement, your work based on |
||||
|
the Program is not required to print an announcement.) |
||||
|
|
||||
|
These requirements apply to the modified work as a whole. If |
||||
|
identifiable sections of that work are not derived from the Program, |
||||
|
and can be reasonably considered independent and separate works in |
||||
|
themselves, then this License, and its terms, do not apply to those |
||||
|
sections when you distribute them as separate works. But when you |
||||
|
distribute the same sections as part of a whole which is a work based |
||||
|
on the Program, the distribution of the whole must be on the terms of |
||||
|
this License, whose permissions for other licensees extend to the |
||||
|
entire whole, and thus to each and every part regardless of who wrote it. |
||||
|
|
||||
|
Thus, it is not the intent of this section to claim rights or contest |
||||
|
your rights to work written entirely by you; rather, the intent is to |
||||
|
exercise the right to control the distribution of derivative or |
||||
|
collective works based on the Program. |
||||
|
|
||||
|
In addition, mere aggregation of another work not based on the Program |
||||
|
with the Program (or with a work based on the Program) on a volume of |
||||
|
a storage or distribution medium does not bring the other work under |
||||
|
the scope of this License. |
||||
|
|
||||
|
3. You may copy and distribute the Program (or a work based on it, |
||||
|
under Section 2) in object code or executable form under the terms of |
||||
|
Sections 1 and 2 above provided that you also do one of the following: |
||||
|
|
||||
|
a) Accompany it with the complete corresponding machine-readable |
||||
|
source code, which must be distributed under the terms of Sections |
||||
|
1 and 2 above on a medium customarily used for software interchange; or, |
||||
|
|
||||
|
b) Accompany it with a written offer, valid for at least three |
||||
|
years, to give any third party, for a charge no more than your |
||||
|
cost of physically performing source distribution, a complete |
||||
|
machine-readable copy of the corresponding source code, to be |
||||
|
distributed under the terms of Sections 1 and 2 above on a medium |
||||
|
customarily used for software interchange; or, |
||||
|
|
||||
|
c) Accompany it with the information you received as to the offer |
||||
|
to distribute corresponding source code. (This alternative is |
||||
|
allowed only for noncommercial distribution and only if you |
||||
|
received the program in object code or executable form with such |
||||
|
an offer, in accord with Subsection b above.) |
||||
|
|
||||
|
The source code for a work means the preferred form of the work for |
||||
|
making modifications to it. For an executable work, complete source |
||||
|
code means all the source code for all modules it contains, plus any |
||||
|
associated interface definition files, plus the scripts used to |
||||
|
control compilation and installation of the executable. However, as a |
||||
|
special exception, the source code distributed need not include |
||||
|
anything that is normally distributed (in either source or binary |
||||
|
form) with the major components (compiler, kernel, and so on) of the |
||||
|
operating system on which the executable runs, unless that component |
||||
|
itself accompanies the executable. |
||||
|
|
||||
|
If distribution of executable or object code is made by offering |
||||
|
access to copy from a designated place, then offering equivalent |
||||
|
access to copy the source code from the same place counts as |
||||
|
distribution of the source code, even though third parties are not |
||||
|
compelled to copy the source along with the object code. |
||||
|
|
||||
|
4. You may not copy, modify, sublicense, or distribute the Program |
||||
|
except as expressly provided under this License. Any attempt |
||||
|
otherwise to copy, modify, sublicense or distribute the Program is |
||||
|
void, and will automatically terminate your rights under this License. |
||||
|
However, parties who have received copies, or rights, from you under |
||||
|
this License will not have their licenses terminated so long as such |
||||
|
parties remain in full compliance. |
||||
|
|
||||
|
5. You are not required to accept this License, since you have not |
||||
|
signed it. However, nothing else grants you permission to modify or |
||||
|
distribute the Program or its derivative works. These actions are |
||||
|
prohibited by law if you do not accept this License. Therefore, by |
||||
|
modifying or distributing the Program (or any work based on the |
||||
|
Program), you indicate your acceptance of this License to do so, and |
||||
|
all its terms and conditions for copying, distributing or modifying |
||||
|
the Program or works based on it. |
||||
|
|
||||
|
6. Each time you redistribute the Program (or any work based on the |
||||
|
Program), the recipient automatically receives a license from the |
||||
|
original licensor to copy, distribute or modify the Program subject to |
||||
|
these terms and conditions. You may not impose any further |
||||
|
restrictions on the recipients' exercise of the rights granted herein. |
||||
|
You are not responsible for enforcing compliance by third parties to |
||||
|
this License. |
||||
|
|
||||
|
7. If, as a consequence of a court judgment or allegation of patent |
||||
|
infringement or for any other reason (not limited to patent issues), |
||||
|
conditions are imposed on you (whether by court order, agreement or |
||||
|
otherwise) that contradict the conditions of this License, they do not |
||||
|
excuse you from the conditions of this License. If you cannot |
||||
|
distribute so as to satisfy simultaneously your obligations under this |
||||
|
License and any other pertinent obligations, then as a consequence you |
||||
|
may not distribute the Program at all. For example, if a patent |
||||
|
license would not permit royalty-free redistribution of the Program by |
||||
|
all those who receive copies directly or indirectly through you, then |
||||
|
the only way you could satisfy both it and this License would be to |
||||
|
refrain entirely from distribution of the Program. |
||||
|
|
||||
|
If any portion of this section is held invalid or unenforceable under |
||||
|
any particular circumstance, the balance of the section is intended to |
||||
|
apply and the section as a whole is intended to apply in other |
||||
|
circumstances. |
||||
|
|
||||
|
It is not the purpose of this section to induce you to infringe any |
||||
|
patents or other property right claims or to contest validity of any |
||||
|
such claims; this section has the sole purpose of protecting the |
||||
|
integrity of the free software distribution system, which is |
||||
|
implemented by public license practices. Many people have made |
||||
|
generous contributions to the wide range of software distributed |
||||
|
through that system in reliance on consistent application of that |
||||
|
system; it is up to the author/donor to decide if he or she is willing |
||||
|
to distribute software through any other system and a licensee cannot |
||||
|
impose that choice. |
||||
|
|
||||
|
This section is intended to make thoroughly clear what is believed to |
||||
|
be a consequence of the rest of this License. |
||||
|
|
||||
|
8. If the distribution and/or use of the Program is restricted in |
||||
|
certain countries either by patents or by copyrighted interfaces, the |
||||
|
original copyright holder who places the Program under this License |
||||
|
may add an explicit geographical distribution limitation excluding |
||||
|
those countries, so that distribution is permitted only in or among |
||||
|
countries not thus excluded. In such case, this License incorporates |
||||
|
the limitation as if written in the body of this License. |
||||
|
|
||||
|
9. The Free Software Foundation may publish revised and/or new versions |
||||
|
of the General Public License from time to time. Such new versions will |
||||
|
be similar in spirit to the present version, but may differ in detail to |
||||
|
address new problems or concerns. |
||||
|
|
||||
|
Each version is given a distinguishing version number. If the Program |
||||
|
specifies a version number of this License which applies to it and "any |
||||
|
later version", you have the option of following the terms and conditions |
||||
|
either of that version or of any later version published by the Free |
||||
|
Software Foundation. If the Program does not specify a version number of |
||||
|
this License, you may choose any version ever published by the Free Software |
||||
|
Foundation. |
||||
|
|
||||
|
10. If you wish to incorporate parts of the Program into other free |
||||
|
programs whose distribution conditions are different, write to the author |
||||
|
to ask for permission. For software which is copyrighted by the Free |
||||
|
Software Foundation, write to the Free Software Foundation; we sometimes |
||||
|
make exceptions for this. Our decision will be guided by the two goals |
||||
|
of preserving the free status of all derivatives of our free software and |
||||
|
of promoting the sharing and reuse of software generally. |
||||
|
|
||||
|
NO WARRANTY |
||||
|
|
||||
|
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY |
||||
|
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN |
||||
|
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES |
||||
|
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED |
||||
|
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF |
||||
|
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS |
||||
|
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE |
||||
|
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, |
||||
|
REPAIR OR CORRECTION. |
||||
|
|
||||
|
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING |
||||
|
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR |
||||
|
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, |
||||
|
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING |
||||
|
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED |
||||
|
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY |
||||
|
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER |
||||
|
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE |
||||
|
POSSIBILITY OF SUCH DAMAGES. |
||||
|
|
||||
|
END OF TERMS AND CONDITIONS |
||||
|
|
||||
|
How to Apply These Terms to Your New Programs |
||||
|
|
||||
|
If you develop a new program, and you want it to be of the greatest |
||||
|
possible use to the public, the best way to achieve this is to make it |
||||
|
free software which everyone can redistribute and change under these terms. |
||||
|
|
||||
|
To do so, attach the following notices to the program. It is safest |
||||
|
to attach them to the start of each source file to most effectively |
||||
|
convey the exclusion of warranty; and each file should have at least |
||||
|
the "copyright" line and a pointer to where the full notice is found. |
||||
|
|
||||
|
<one line to give the program's name and a brief idea of what it does.> |
||||
|
Copyright (C) 19yy <name of author> |
||||
|
|
||||
|
This program is free software; you can redistribute it and/or modify |
||||
|
it under the terms of the GNU General Public License as published by |
||||
|
the Free Software Foundation; either version 2 of the License, or |
||||
|
(at your option) any later version. |
||||
|
|
||||
|
This program is distributed in the hope that it will be useful, |
||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
|
GNU General Public License for more details. |
||||
|
|
||||
|
You should have received a copy of the GNU General Public License |
||||
|
along with this program; if not, write to the Free Software |
||||
|
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. |
||||
|
|
||||
|
Also add information on how to contact you by electronic and paper mail. |
||||
|
|
||||
|
If the program is interactive, make it output a short notice like this |
||||
|
when it starts in an interactive mode: |
||||
|
|
||||
|
Gnomovision version 69, Copyright (C) 19yy name of author |
||||
|
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. |
||||
|
This is free software, and you are welcome to redistribute it |
||||
|
under certain conditions; type `show c' for details. |
||||
|
|
||||
|
The hypothetical commands `show w' and `show c' should show the appropriate |
||||
|
parts of the General Public License. Of course, the commands you use may |
||||
|
be called something other than `show w' and `show c'; they could even be |
||||
|
mouse-clicks or menu items--whatever suits your program. |
||||
|
|
||||
|
You should also get your employer (if you work as a programmer) or your |
||||
|
school, if any, to sign a "copyright disclaimer" for the program, if |
||||
|
necessary. Here is a sample; alter the names: |
||||
|
|
||||
|
Yoyodyne, Inc., hereby disclaims all copyright interest in the program |
||||
|
`Gnomovision' (which makes passes at compilers) written by James Hacker. |
||||
|
|
||||
|
<signature of Ty Coon>, 1 April 1989 |
||||
|
Ty Coon, President of Vice |
||||
|
|
||||
|
This General Public License does not permit incorporating your program into |
||||
|
proprietary programs. If your program is a subroutine library, you may |
||||
|
consider it more useful to permit linking proprietary applications with the |
||||
|
library. If this is what you want to do, use the GNU Library General |
||||
|
Public License instead of this License. |
||||
@ -0,0 +1,176 @@ |
|||||
|
**************************************************************** |
||||
|
* Pi attenuator pad. |
||||
|
* Parameters: R0 = impedance |
||||
|
* DB = attenuation in dB (positive) |
||||
|
.SUBCKT PIPAD 1 2 { R0 DB } |
||||
|
R1 1 0 {R0*(1+2/(10**(DB/20)-1))} |
||||
|
R2 1 2 {(R0/2)*(10**(DB/20)-10**(DB/-20))} |
||||
|
R3 2 0 {R0*(1+2/(10**(DB/20)-1))} |
||||
|
.ENDS |
||||
|
**************************************************************** |
||||
|
* PCB Via inductance + extra L. |
||||
|
* H = substrate height in inches |
||||
|
* D = via diameter in inches |
||||
|
* L = extra inductance in henries. |
||||
|
.SUBCKT VIA 1 2 { H D L } |
||||
|
LV 1 2 {L+ |
||||
|
+ 5.08E-9*H*(log((2+sqrt(4+D*D/(H*H)))*H/D)+ |
||||
|
+ .75*(D/H-sqrt(4+D*D/(H*H))))} |
||||
|
.ENDS |
||||
|
**************************************************************** |
||||
|
* Voltage-controlled oscillator. |
||||
|
* Parameters: F = frequency @ Vc = 0 in Hz |
||||
|
* KV = tuning sensitivity in Hz/volt |
||||
|
* A = peak output amplitude |
||||
|
* RO = output port resistance |
||||
|
* Connections: Vc Out |
||||
|
.SUBCKT VCO 20 2 { F KV A RO } |
||||
|
RIN1 20 0 1E12 |
||||
|
VSW 30 0 DC 0 PULSE 0 1 |
||||
|
RSW 30 0 1E12 |
||||
|
BIN 3 0 V=(V(20)+{F/KV})*V(30) |
||||
|
R3 3 0 1E6 |
||||
|
GSIN 2 0 22 0 {1/RO} |
||||
|
RSIN 2 0 {RO} |
||||
|
B1 1 0 I=-(V(22)*V(3)) |
||||
|
B2 22 0 I=V(1)*V(3) |
||||
|
R2 1 0 1E9 |
||||
|
I1 0 1 PULSE {1E-9*A} 0 |
||||
|
C2 1 0 {.159154943/KV} |
||||
|
C1 22 0 {.159154943/KV} |
||||
|
R1 22 0 1E9 |
||||
|
.ENDS |
||||
|
**************************************************************** |
||||
|
* Ideal Frequency converter. |
||||
|
* Parameters: F = Oscillator frequency |
||||
|
* RI = input port resistance |
||||
|
* RO = output port resistance |
||||
|
* Connections: In Out |
||||
|
.SUBCKT FCNVT 1 2 { F RI RO } |
||||
|
RIN 1 0 {RI} |
||||
|
VLO 3 0 DC 0 SIN 0 1 {F} |
||||
|
RLO 3 0 1E12 |
||||
|
BMIX 0 2 I=(V(1)*V(3))/{RO} |
||||
|
RO 2 0 {RO} |
||||
|
.ENDS |
||||
|
**************************************************************** |
||||
|
* Sine wave RF power source. |
||||
|
* Parameters: F = Frequency |
||||
|
* R = Output resistance |
||||
|
* P = Power in dBm |
||||
|
* V = DC (EMF) |
||||
|
.SUBCKT RFGEN 1 2 { F R P V } |
||||
|
* + - |
||||
|
Is 2 1 DC {V/R} SIN {V/R} {sqrt((10**(P/10))/(125*R))} {F} |
||||
|
Ro 1 2 {R} |
||||
|
.ENDS |
||||
|
**************************************************************** |
||||
|
* Sine wave 2-tone RF power source. |
||||
|
* Parameters: F1 = 1st tone frequency |
||||
|
* F2 = 2nd tone frequency |
||||
|
* R = output resistance |
||||
|
* P = power per tone in dBm |
||||
|
* V = DC (EMF) |
||||
|
.SUBCKT 2TGEN 1 2 { F1 F2 R P V } |
||||
|
* + - |
||||
|
I1 2 1 DC {V/R} SIN {V/R} {sqrt((10**(P/10))/(125*R))} {F1} |
||||
|
I2 2 1 DC 0 SIN 0 {sqrt((10**(P/10))/(125*R))} {F2} |
||||
|
Ro 1 2 {R} |
||||
|
.ENDS |
||||
|
**************************************************************** |
||||
|
* Transmission lines |
||||
|
* All ports must have external connections. |
||||
|
* Parameters: Z0 = impedance |
||||
|
* L = length in inches |
||||
|
* VP = velocity-of-propagation rel. to air |
||||
|
* Connections: 1+ 1- 2+ 2- |
||||
|
.SUBCKT TXL 1 2 3 4 { Z0 L VP } |
||||
|
T1 1 2 3 4 Z0={Z0} TD={L/(1.180315E10*VP)} |
||||
|
.ENDS |
||||
|
**************************************************************** |
||||
|
* Lossy transmission line. |
||||
|
* All ports must have external connections. |
||||
|
* Parameters: Z0 = impedance |
||||
|
* L = length in inches |
||||
|
* VP = velocity-of-propagation rel. to air |
||||
|
* A = loss in dB/inch |
||||
|
* Connections: 1+ 1- 2+ 2- |
||||
|
.SUBCKT LTXL 1 2 3 4 { Z0 L VP A } |
||||
|
O1 1 2 3 4 LOSSY |
||||
|
.MODEL LOSSY LTRA LEN={L} |
||||
|
+ R={5.848492e-3*A*Z0} |
||||
|
+ L={Z0/(1.180315E10*VP)} |
||||
|
+ C={1/(1.180315E10*VP*Z0)} |
||||
|
.ENDS |
||||
|
**************************************************************** |
||||
|
* 2 coupled transmission lines |
||||
|
* All ports must have external connections. |
||||
|
* Parameters: Z0E = even-mode impedance |
||||
|
* Z0O = odd-mode impedance |
||||
|
* L = length in inches |
||||
|
* VP = velocity-of-propagation rel. to air |
||||
|
* Connections: 1+ 1- 2+ 2- { Z0E Z0O L VP } |
||||
|
.SUBCKT CPL2 1 2 3 4 |
||||
|
T1 1 0 3 0 Z0={Z0E} TD={L/(1.180315E10*VP)} |
||||
|
T2 1 2 3 4 Z0={2*Z0E*Z0O/(Z0E-Z0O)} TD={L/(1.180315E10*VP)} |
||||
|
T3 2 0 4 0 Z0={Z0E} TD={L/(1.180315E10*VP)} |
||||
|
.ENDS |
||||
|
**************************************************************** |
||||
|
* Generic Bipolar OpAmp - linear model |
||||
|
* Parameters: G = open-loop gain in dB |
||||
|
* FT = unity gain frequency in Hz |
||||
|
* IOS = input offset current in amps |
||||
|
* VOS = input offset voltage |
||||
|
* IB = input bias current in amps |
||||
|
.SUBCKT BIPOPA 2 3 6 7 4 { G FT IOS VOS IB } |
||||
|
* - In + Out Vcc Vee |
||||
|
RP 4 7 10K |
||||
|
RXX 4 0 10MEG |
||||
|
IBP 3 0 {IB-IOS} |
||||
|
RIP 3 0 10MEG |
||||
|
CIP 3 0 1.4PF |
||||
|
IBN 2 0 {IB} |
||||
|
RIN 2 0 10MEG |
||||
|
CIN 2 0 1.4PF |
||||
|
VOFST 2 10 {VOS} |
||||
|
RID 10 3 200K |
||||
|
EA 11 0 10 3 1 |
||||
|
R1 11 12 5K |
||||
|
R2 12 13 50K |
||||
|
C1 12 0 {13E-6/FT} |
||||
|
GA 0 14 0 13 {0.0135*(10**(G/20))} |
||||
|
C2 13 14 {2.7E-6/FT} |
||||
|
RO 14 0 75 |
||||
|
L 14 6 {30/FT} |
||||
|
RL 14 6 1000 |
||||
|
CL 6 0 3PF |
||||
|
.ENDS |
||||
|
**************************************************************** |
||||
|
* Generic FET OpAmp - linear model |
||||
|
* Parameters: G = open-loop gain in dB |
||||
|
* FT = unity gain frequency in Hz |
||||
|
* VOS = input offset voltage |
||||
|
.SUBCKT FETOPA 2 3 6 7 4 { G FT VOS } |
||||
|
* - In + Out Vcc Vee |
||||
|
RP 4 7 6K |
||||
|
RXX 4 0 10MEG |
||||
|
IBP 3 0 33E-12 |
||||
|
RIP 3 0 1E12 |
||||
|
CIP 3 0 3PF |
||||
|
IBN 2 0 30E-12 |
||||
|
RIN 2 0 1E12 |
||||
|
CIN 2 0 3PF |
||||
|
VOFST 2 10 {VOS} |
||||
|
RID 10 3 1E12 |
||||
|
EA 11 0 10 3 1 |
||||
|
R1 11 12 5K |
||||
|
R2 12 13 50K |
||||
|
C1 12 0 {24E-6/FT} |
||||
|
GA 0 14 0 13 {0.0135*(10**(G/20))} |
||||
|
C2 13 14 {2.33E-6/FT} |
||||
|
RO 14 0 75 |
||||
|
L 14 6 {4E-6/FT} |
||||
|
RL 14 6 100 |
||||
|
CL 6 0 3PF |
||||
|
.ENDS |
||||
|
**************************************************************** |
||||
@ -0,0 +1,216 @@ |
|||||
|
------------------------------------------------------------------------ |
||||
|
SPICEPRM - A Spice preprocessor for parameterized subcircuits (v 0.11) |
||||
|
Copyright (C) 1996 Andrew J. Borsa <andy@moose.mv.com> |
||||
|
------------------------------------------------------------------------ |
||||
|
|
||||
|
This program is free software; you can redistribute it and/or modify |
||||
|
it under the terms of the GNU General Public License as published by |
||||
|
the Free Software Foundation; either version 2 of the License, or |
||||
|
(at your option) any later version. |
||||
|
|
||||
|
This program is distributed in the hope that it will be useful, |
||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
|
GNU General Public License for more details. |
||||
|
|
||||
|
You should have received a copy of the GNU General Public License |
||||
|
along with this program; if not, write to the Free Software |
||||
|
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. |
||||
|
|
||||
|
------------------------------------------------------------------------ |
||||
|
|
||||
|
Spiceprm was written in the course of moving my engineering activities |
||||
|
to the Linux operating system. My previous MSDOS spice package |
||||
|
permitted passing parameters to subcircuits. The raw Berkely Spice |
||||
|
doesn't. Anyone used to this feature knows the frustration of trying |
||||
|
to use a simulator without it. This script is the result of my |
||||
|
desperation. It translates a circuit file containing parameterized |
||||
|
subcircuits with math expressions into another circuit file meeting raw |
||||
|
spice requirements. You then run spice on the translated output file. |
||||
|
|
||||
|
This is an alpha version. It probably has some bugs I haven't caught. |
||||
|
But I have used it in a work environment enough to feel comfortable |
||||
|
about releasing it for comments and improvement suggestions. |
||||
|
|
||||
|
|
||||
|
What's So Great About Subcircuits With Parameters? |
||||
|
-------------------------------------------------- |
||||
|
1. You can generalize a model once and then use it without having to |
||||
|
recalculate values of it's internal elements every time. |
||||
|
|
||||
|
2. Many electronic devices can be modelled by using mathematical |
||||
|
expressions. The independent variables can be passed to the model as |
||||
|
parameters, evaluated in equations, and used to set the behavior of a |
||||
|
particular model instance. |
||||
|
|
||||
|
3. They save mucho time and minimize human calculation error. |
||||
|
|
||||
|
|
||||
|
Installation |
||||
|
------------ |
||||
|
1. Copy the executable script to an accessible directory. I keep mine |
||||
|
in $HOME/bin so it's on my path. |
||||
|
|
||||
|
2. Modify the top line if necessary to reflect the path to your Perl |
||||
|
interpreter. |
||||
|
For ex., #! /usr/bin/perl may have to become #! /usr/local/bin/perl or |
||||
|
wherever the perl binary is located. |
||||
|
|
||||
|
|
||||
|
Usage |
||||
|
----- |
||||
|
spiceprm infile [outfile] |
||||
|
|
||||
|
infile: Circuit file name containing parameterized subcircuits. |
||||
|
outfile: Transformed file meeting raw spice netlist conventions. |
||||
|
Optional. If not given, output is produced on standard |
||||
|
output (stdout). |
||||
|
|
||||
|
My file name convention: infile = *.cir, outfile = *.ckt |
||||
|
|
||||
|
infile == outfile isn't permitted for a coupla good reasons, the |
||||
|
best being you don't want to trash your original source. |
||||
|
|
||||
|
Now source outfile from spice. |
||||
|
|
||||
|
I always check the output from a new infile just to make sure. This |
||||
|
version only checks for a few obvious errors, so scanning outfile for |
||||
|
reasonable looking values and netlist correctness is wise. Note that |
||||
|
comment and blank lines are discarded in outfile and alphabetic |
||||
|
characters are transformed to lower case. |
||||
|
|
||||
|
|
||||
|
Parameterized Subcircuit Netlist Convention |
||||
|
------------------------------------------- |
||||
|
Calling a parameterized subcircuit works similarly to a normal spice call |
||||
|
except for the addition of a {} delimited list of parameter value |
||||
|
assignments - |
||||
|
|
||||
|
Xname n1 n2 n3 ... ni subname {p1 = val1 ... pj = valj} |
||||
|
p1 thru pj are the parameter assignments to be passed to the |
||||
|
subcircuit. |
||||
|
val is any valid spice value. |
||||
|
{} (braces) must enclose the parameter assignment sequence. |
||||
|
|
||||
|
After running the preprocessor on this file, each call in the netlist |
||||
|
will be replaced by the following - |
||||
|
|
||||
|
Xname n1 n2 n3 ... ni subname#k |
||||
|
*{p1 = val1 ... pj = valj} |
||||
|
where k is a digit or digits representing a subcircuit with that |
||||
|
specific set of parameter substitutions. k will be incremented for |
||||
|
each unique set of parameters and matched by a new .subckt listing |
||||
|
named subname#k as follows - |
||||
|
|
||||
|
.subckt subname#k n1 n2 n3 ... ni |
||||
|
... listing with parameters substituted and equations evaluated |
||||
|
.ends |
||||
|
|
||||
|
|
||||
|
Creating Parameterized Subcircuits |
||||
|
---------------------------------- |
||||
|
Below is a simple example. See the EXAMPLES file for a number of |
||||
|
illustrative and useful models for Spice3. |
||||
|
|
||||
|
This model creates an RF power source specified using the natural |
||||
|
output power units of dBm (dB referenced to 1 milliwatt). Note that |
||||
|
the model parameters must be declared on the ".subckt" definition line |
||||
|
inside curly braces {}. |
||||
|
**************************************************************** |
||||
|
* Sine wave RF power source. |
||||
|
* Parameters: F = Frequency |
||||
|
* R = Output resistance |
||||
|
* P = Power in dBm |
||||
|
* V = DC (EMF) |
||||
|
.SUBCKT RFGEN 1 2 {F R P V} |
||||
|
* + - |
||||
|
Is 2 1 DC {V/R} SIN {V/R} {sqrt((10**(P/10))/(125*R))} {F} |
||||
|
Ro 1 2 {R} |
||||
|
.ENDS |
||||
|
**************************************************************** |
||||
|
Note that independent current source Is has it's literal spice |
||||
|
parameters replaced by equations that calculate the required values |
||||
|
from the passed parameters. Each equation must be enclosed by {} to |
||||
|
inform the preprocessor that a substitution and calculation must be |
||||
|
performed for whatever appears between the braces. |
||||
|
|
||||
|
Equations may span multiple lines by using the spice line continuation |
||||
|
symbol "+" as the first character of the following line. |
||||
|
|
||||
|
.MODEL statements inside subcircuits may also use passed parameters. |
||||
|
In fact, anything between {} inside a subcircuit will be evaluated and |
||||
|
replaced with a result. |
||||
|
|
||||
|
Be careful in situations like the following: |
||||
|
Bx 3 0 v = {v(1)*sgn(v(2))*frick/frack} WRONG!!! |
||||
|
|
||||
|
The Spice3 nonlinear source element "B" also accepts equations |
||||
|
describing it's output dependency on functions of circuit voltages |
||||
|
and currents. If "frick" and "frack" are parameters, you must |
||||
|
separate them from the element's equation as follows - |
||||
|
Bx 3 0 v = v(1)*sgn(v(2))*{frick/frack} |
||||
|
|
||||
|
Just remember that preprocessor equations and spice functions must |
||||
|
never meld. |
||||
|
|
||||
|
The parameter substitution first replaces all parameters between any {} |
||||
|
with their numerical values and then uses Perl's eval() function to |
||||
|
produce a final numerical value. Theoretically at least, you could |
||||
|
execute a Perl program within those braces. I haven't explored this |
||||
|
yet so feel free. Realize though, that whatever's inside the braces |
||||
|
gets a ";" appended at the end to make a valid Perl statement from the |
||||
|
usual equation. Also, Perl's block delimiters are braces, so extra |
||||
|
one's could confuse the current parsing which is simply oriented to |
||||
|
equations. Ah well. |
||||
|
|
||||
|
|
||||
|
Known Bugs, Anomalies, and Perl Gotcha's |
||||
|
---------------------------------------- |
||||
|
1. Minimal error checking! Be forewarned! |
||||
|
|
||||
|
2. Don't use ".ends subckt_name" with parameters. Use ".ends" only. |
||||
|
The preprocessor modifies subckt_name to subckt_name#k. |
||||
|
|
||||
|
3. Spice unit representations like "k", "meg", etc, are not recognized |
||||
|
inside the {} equation sections of .subckt listings. They may, |
||||
|
however, be used in the parameter assignment section of a .subckt call. |
||||
|
|
||||
|
4. "-" as part of .subckt name doesn't work but "_" does. Stick to |
||||
|
alphanumeric names with optional underscore characters. |
||||
|
|
||||
|
5. Equations must use Perl math operators and functions. |
||||
|
The following lists operator differences I'm aware of - |
||||
|
|
||||
|
Exponentiation - Perl : ** |
||||
|
Spice3 : ^ |
||||
|
|
||||
|
Logical AND, OR - Perl : &&, || |
||||
|
Spice3 : &, | |
||||
|
|
||||
|
Equality, Inequality - Perl : ==, != |
||||
|
Spice3 : =, <> |
||||
|
|
||||
|
These operators are the same for Perl and Spice3 - |
||||
|
+ - * / % ! < > <= >= |
||||
|
|
||||
|
These operators are unique to Perl - |
||||
|
& | ^ ~ : bitwise AND, OR, exclusive OR, complement |
||||
|
|
||||
|
Perl math functions - |
||||
|
abs(EXPR) : absolute value of EXPR |
||||
|
atan2(Y,X) : arctangent of Y/X in the range of -pi to +pi |
||||
|
cos(EXPR) : cosine of EXPR in radians |
||||
|
exp(EXPR) : e raised to EXPR |
||||
|
int(EXPR) : integer portion of EXPR |
||||
|
log(EXPR) : natural logarithm (base e) of EXPR |
||||
|
rand[(EXPR)]: returns a random fractional number between 0 and the |
||||
|
value of EXPR. If EXPR is omitted, returns a value |
||||
|
between 0 and 1. |
||||
|
sin(EXPR) : sine of EXPR in radians |
||||
|
sqrt(EXPR) : square root of EXPR |
||||
|
|
||||
|
|
||||
|
Finally, if you could make use of a language allowing you to do neat |
||||
|
things like this with minimal pain, give Perl a try. It's naturally |
||||
|
suited for text processing and transformation tasks like pre and post |
||||
|
processors, along with any math manipulation required. |
||||
@ -0,0 +1,304 @@ |
|||||
|
#! /usr/bin/perl |
||||
|
# spiceprm |
||||
|
# Pass parameters to spice subcircuits. |
||||
|
# Usage: spiceprm infile [outfile] |
||||
|
# infile and outfile must be different. |
||||
|
# Output written to STDOUT if outfile not given. |
||||
|
|
||||
|
$BANNER = "Spiceprm version 0.11, Copyright (C) 1996 Andrew J. Borsa"; |
||||
|
|
||||
|
# NOTES: |
||||
|
# 1. Units not recognized inside .subckt {} expressions. |
||||
|
# 2. Perl exponent operator: "**", Spice exp op: "^". |
||||
|
# 3. "-" as part of subckt name doesn't work but "_" does. |
||||
|
|
||||
|
# Netlist convention |
||||
|
# Xname n1 n2 n3 ... ni subname {p1 = val1 ... pj = valj} |
||||
|
# p1 thru pj are the parameters to be passed to the subcircuit. |
||||
|
# val is any valid spice value. |
||||
|
# |
||||
|
# .subckt name n1 n2 ... ni {p1 p2 ... pj} |
||||
|
# parameter expressions must be enclosed in {}. |
||||
|
|
||||
|
# After substitution - |
||||
|
# Xname n1 n2 n3 ... ni subname#k |
||||
|
# *{p1 = val1 ... pj = valj} |
||||
|
# .subckt subname#k n1 n2 n3 ... ni |
||||
|
# ... listing with parameters substituted |
||||
|
# .ends |
||||
|
|
||||
|
# %subckt: key = subname |
||||
|
# value = startline, endline, listing(.subckt ... .ends) |
||||
|
# Only for .subckts with parameters. |
||||
|
# %subprm: key = subname |
||||
|
# value = parameter name list |
||||
|
# %subcall: key = Xname[#subname0#subname1...] |
||||
|
# value = subname#k |
||||
|
# NOTE: IF Xname is called from within a .subckt, it will have calling |
||||
|
# .subckt names appended, delimited by #'s. |
||||
|
# %sub: key = subname#k |
||||
|
# value = p1 val1 ... pj valj, where val is a pure |
||||
|
# numeric with no units. |
||||
|
|
||||
|
$MAXLEN = 70; # Max output file line length. |
||||
|
$DMAXLEN = 10; # Amount to increment if necessary. |
||||
|
$linenum = 0; |
||||
|
|
||||
|
%units = ('f','1e-15','p','1e-12','n','1e-9','u','1e-6','mil','25.4e-6', |
||||
|
'm','1e-3','k','1e3','meg','1e6','g','1e9','t','1e12'); |
||||
|
|
||||
|
$* = 1; # Pattern match with multi-line strings. |
||||
|
|
||||
|
($infile, $outfile) = @ARGV; |
||||
|
print "\n$BANNER\ninfile: $infile\noutfile: $outfile\n\n"; |
||||
|
$#ARGV && ($infile eq $outfile) |
||||
|
&& die "Input and Output filenames must be different\n"; |
||||
|
open(INFILE, $infile) || die "Can't open source file: $infile\n"; |
||||
|
$hasprm = $depth = 0; |
||||
|
&prm_scan; |
||||
|
close(INFILE); |
||||
|
|
||||
|
open(INFILE, $infile) || die "Can't open source file: $infile\n"; |
||||
|
unlink $outfile if $#ARGV; |
||||
|
open(OUTFILE, $#ARGV ? ">$outfile" : ">-") |
||||
|
|| die "Can't open output file: $outfile\n"; |
||||
|
$depth = 0; |
||||
|
&prm_wr; |
||||
|
close(INFILE); |
||||
|
close(OUTFILE); |
||||
|
|
||||
|
# Get a line from the input file, combining any continuation lines into |
||||
|
# one long line. Skip comment and blank lines. |
||||
|
sub prm_getline { |
||||
|
local($line); |
||||
|
|
||||
|
chop($line = defined($nxtline) ? $nxtline : <INFILE>); |
||||
|
$linenum = $.; |
||||
|
while ($nxtline = <INFILE>) { |
||||
|
if ($line =~ /^\*|^\s/) { $line = ''; } |
||||
|
if ($line eq '' || $nxtline =~ s/^(\+)/ /) { |
||||
|
chop($nxtline); |
||||
|
$line .= $nxtline; |
||||
|
} |
||||
|
else { last; } |
||||
|
} |
||||
|
$line; |
||||
|
} |
||||
|
|
||||
|
# Scan the input file looking for subcircuit calls with parameter list and |
||||
|
# any subcircuits with defined parameters. |
||||
|
sub prm_scan { |
||||
|
local(@w, @tmp, @list); |
||||
|
local($xnm, $subnm, $i, $max, $m, $s, $n, $tmp, $start); |
||||
|
local($sublist) = ''; |
||||
|
|
||||
|
PRM_SCAN: while ($_ = &prm_getline) { |
||||
|
# skip .control - .endc blocks |
||||
|
if (/^\.control/i) { |
||||
|
while ($_ = &prm_getline) { next PRM_SCAN if (/^\.endc/i); } |
||||
|
} |
||||
|
tr/A-Z/a-z/; |
||||
|
PRM_TST: { |
||||
|
if (/^x/ && s/(\{([^\}]+)\})//) { |
||||
|
@w = split(' '); |
||||
|
@tmp = @w[0 .. $#w-1]; |
||||
|
$xnm = $w[0] . $sublist; $subnm = $w[$#w]; |
||||
|
$_ = $2; $i = 0; |
||||
|
while (/(\w+)\s*\=\s*([+-]?\d*(\.\d*)?([Ee][+-]?\d+)?)([a-z]\w*)?/) { |
||||
|
# 1 2 3 4 5 |
||||
|
$prmval{$1} = $2*($5 ? &unit2mult($5) : 1); |
||||
|
$_ = $'; |
||||
|
$i += 2; |
||||
|
} |
||||
|
$max = -1; $m = ''; |
||||
|
CHKDUP: foreach $s (keys %sub) { |
||||
|
$s =~ /(\w+)\#(\d+)/; |
||||
|
if ($subnm eq $1) { |
||||
|
if ($max < $2) { $max = $2; } |
||||
|
$n = (@w = split(' ', $sub{$s})); |
||||
|
if ($n == $i) { |
||||
|
for ($i = 0; $i < $n; $i += 2) { |
||||
|
last if $w[$i+1] ne $prmval{$w[$i]}; |
||||
|
} |
||||
|
if ($i >= $n) { |
||||
|
$m = 1; |
||||
|
$subcall{$xnm} = $s; |
||||
|
last CHKDUP; |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
if ($m eq '') { |
||||
|
foreach $n (keys %prmval) { |
||||
|
$m = join(' ', $m, $n, $prmval{$n}); |
||||
|
} |
||||
|
$sub{($s = join('', $subnm, '#', $max+1))} = $m; |
||||
|
$subcall{$xnm} = $s; |
||||
|
} |
||||
|
push(@list, join(' ', @tmp, $subcall{$xnm})) if $depth; |
||||
|
undef %prmval; |
||||
|
last PRM_TST; |
||||
|
} |
||||
|
if (/^\.subckt\s+(\w+)/) { |
||||
|
$depth++; $tmp = $1; |
||||
|
$sublist .= '#' . $1; |
||||
|
if (s/(\{([^\}]+)\})//) { |
||||
|
if ($hasprm) { |
||||
|
print "Line $linenum: ", |
||||
|
"Nested parameterized subckt definitions not permitted\n\n"; |
||||
|
} |
||||
|
else { |
||||
|
$hasprm = 1; $start = $.; |
||||
|
$subprm{$psubnm = $tmp} = $2; |
||||
|
} |
||||
|
} |
||||
|
push(@list, $_); # With {} parameter defs removed. |
||||
|
last PRM_TST; |
||||
|
} |
||||
|
if (/^\.ends/) { |
||||
|
$sublist =~ s/(\#\w+)$//; |
||||
|
if (--$depth == 0) { |
||||
|
if ($hasprm) { |
||||
|
$subckt{$psubnm} = join("\n",join(' ',$start,$.),@list,$_); |
||||
|
} |
||||
|
$hasprm = 0; |
||||
|
undef @list; $sublist = ''; |
||||
|
} |
||||
|
last PRM_TST; |
||||
|
} |
||||
|
if ($depth) { |
||||
|
push(@list, $_); |
||||
|
last PRM_TST; |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
# Write the output file. |
||||
|
sub prm_wr { |
||||
|
local(@w, @pnms, @list, @line); |
||||
|
local($xnm, $subnm, $n, $m, $i, $s); |
||||
|
local($sublist) = ''; |
||||
|
|
||||
|
PRMWR_SCAN: while ($_ = &prm_getline) { |
||||
|
# write .control - .endc blocks |
||||
|
if (/^\.control/i) { |
||||
|
print OUTFILE "$_\n"; |
||||
|
while ($_ = &prm_getline) { |
||||
|
prm_wrline($_); |
||||
|
next PRMWR_SCAN if (/^\.endc/i); |
||||
|
} |
||||
|
} |
||||
|
tr/A-Z/a-z/; |
||||
|
if (/^x/ && s/(\{([^\}]+)\})//) { |
||||
|
@w = split(' '); $subnm = pop(@w); |
||||
|
$xnm = $w[0] . $sublist; |
||||
|
prm_wrline(join(' ', @w, $subcall{$xnm})); |
||||
|
print OUTFILE "* $1\n"; |
||||
|
if (!defined($subprm{$subnm})) { |
||||
|
print "Line $linenum: Subckt \"$subnm\" has no defined parameters\n\n"; |
||||
|
next PRMWR_SCAN; |
||||
|
} |
||||
|
$n = @pnms = sort(split(' ', $subprm{$subnm})); |
||||
|
$m = (@w = split(' ', $sub{$subcall{$xnm}})); |
||||
|
if ($n == $m/2) { |
||||
|
for ($i = 0, undef(@list); $i < $m; $i += 2) { |
||||
|
push(@list, $w[$i]); |
||||
|
} |
||||
|
for ($i = 0, @w = sort(@list); $i < $n; ++$i) { |
||||
|
if ($pnms[$i] ne $w[$i]) { |
||||
|
print "Line $linenum: ", |
||||
|
"Undefined parameter \"$w[$i]\"", |
||||
|
"in subckt \"$subnm\" call\n\n"; |
||||
|
next PRMWR_SCAN; |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
else { |
||||
|
print "Line $linenum: ", |
||||
|
"Incorrect number of parameters in subckt \"$subnm\" call\n\n"; |
||||
|
} |
||||
|
next PRMWR_SCAN; |
||||
|
} |
||||
|
if (/^\.subckt\s+(\w+)/) { |
||||
|
if ($s = $subckt{$1}) { |
||||
|
$s =~ /\d+\s+(\d+)/; |
||||
|
$n = $1; |
||||
|
&prm_getline until $. == $n; |
||||
|
} |
||||
|
else { |
||||
|
$depth++; $sublist .= '#' . $1; |
||||
|
prm_wrline($_); |
||||
|
} |
||||
|
next PRMWR_SCAN; |
||||
|
} |
||||
|
if (/^\.end\b/) { |
||||
|
foreach $s (keys %sub) { |
||||
|
($subnm = $s) =~ s/\#\d+//; |
||||
|
@line = split(/\n/, $subckt{$subnm}); |
||||
|
shift(@line); |
||||
|
$line[0] =~ s/$subnm/$s/; |
||||
|
%prmval = split(' ', $sub{$s}); |
||||
|
foreach (@line) { |
||||
|
s/\{([^\}]+)\}/&prm_eval($1, %prmval)/eg; |
||||
|
prm_wrline($_); |
||||
|
} |
||||
|
} |
||||
|
print OUTFILE ".end\n"; |
||||
|
last PRMWR_SCAN; |
||||
|
} |
||||
|
if (/^\.ends/) { |
||||
|
if (--$depth == 0) { $sublist = ''; } |
||||
|
else { $sublist =~ s/(\#\w+)$//; } |
||||
|
} |
||||
|
prm_wrline($_); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
# Translate a possible unit into a multiplier factor. |
||||
|
# Parameter is the unit letter string assumed lower case. |
||||
|
sub unit2mult { |
||||
|
local($u) = shift; |
||||
|
|
||||
|
$u = ($u =~ /^(mil|meg)/ ? $1 : substr($u, 0, 1)); |
||||
|
$u = defined($units{$u}) ? $units{$u} : 1; |
||||
|
} |
||||
|
|
||||
|
# Evaluate a parameter expression. |
||||
|
# Arguments: expression, parameter & value assoc. array. |
||||
|
sub prm_eval { |
||||
|
local($x,%prm) = @_; |
||||
|
|
||||
|
foreach $key (keys %prm) { |
||||
|
$x =~ s/\b$key\b/$prm{$key}/eg; |
||||
|
} |
||||
|
eval($x . ';'); |
||||
|
} |
||||
|
|
||||
|
# Write an output file line with a max length. The line is split on |
||||
|
# whitespace or '=' at a point less than or equal to the max length |
||||
|
# and output as a spice continuation line. |
||||
|
# If a splitting delimiter is not found within $MAXLEN, then allowable |
||||
|
# length is increased, potentially up to the actual line length. |
||||
|
# NOTE: outputs '\n'. |
||||
|
# $MAXLEN sets the max value, $DMAXLEN the increment. |
||||
|
# File handle = OUTFILE. |
||||
|
sub prm_wrline { |
||||
|
local($line) = shift; |
||||
|
local($max, $s, $m); |
||||
|
|
||||
|
$max = $MAXLEN; |
||||
|
until ($line eq '') { |
||||
|
if (length($line) > $max) { |
||||
|
$m = substr($line, 0, $max); |
||||
|
if ($m =~ /((\s|\=)[^(\s|\=)]*)$/) { |
||||
|
$s = $` . $2; |
||||
|
$line = '+' . substr($line, length($s)); |
||||
|
} |
||||
|
else { $max += $DMAXLEN; next; } |
||||
|
} |
||||
|
else { $s = $line; $line = ''; } |
||||
|
print OUTFILE "$s\n"; |
||||
|
$max = $MAXLEN; |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,19 @@ |
|||||
|
Begin3 |
||||
|
Title: spiceprm-0.11.tar.gz |
||||
|
Version: 0.11 |
||||
|
Entered-date: 02JAN97 |
||||
|
Description: A Perl script preprocessor adding parameterized |
||||
|
subcircuit capability to the Berkeley Spice circuit |
||||
|
simulator. Should also work with any spice lacking |
||||
|
this feature. |
||||
|
Keywords: spice cad simulation preprocessor perl script |
||||
|
Author: andy@moose.mv.com (Andy Borsa) |
||||
|
Maintained-by: |
||||
|
Primary-site: sunsite.unc.edu /pub/Linux/apps/circuits |
||||
|
15.6kB spiceprm-0.11.tar.gz |
||||
|
Alternate-site: |
||||
|
Original-site: |
||||
|
Platforms: Linux or most any unix, Perl 4 or greater. |
||||
|
Tested with Linux and Perl 5. |
||||
|
Copying-policy: GNU General Public License. See file COPYING. |
||||
|
End |
||||
@ -0,0 +1,11 @@ |
|||||
|
1999-09-06 Arno Peters <A.W.Peters@ieee.org> |
||||
|
|
||||
|
* ngspice.texi: Added TeX equivalents for some formula. |
||||
|
First tables converted to texinfo format. |
||||
|
|
||||
|
1999-08-31 Emmanuel Rouat <emmanuel.rouat@wanadoo.fr> |
||||
|
|
||||
|
* Makefile.am: added .texi file by Arno Peters - a distribution will now |
||||
|
include a postscript doc. |
||||
|
updated 'clean' rules |
||||
|
|
||||
@ -0,0 +1,11 @@ |
|||||
|
## Process this file with automake to produce Makefile.in
|
||||
|
|
||||
|
EXTRA_DIST = ngspice.ps |
||||
|
|
||||
|
info_TEXINFOS = ngspice.texi |
||||
|
|
||||
|
CLEANFILES = *.fns *.pg *.tp *.aux *.cp *.ky *.vr *.fn *.log *.toc *.vrs |
||||
|
|
||||
|
DISTCLEANFILES = $CLEANFILES *.ps *.dvi *.info* |
||||
|
|
||||
|
MAINTAINERCLEANFILES = $DISTCLEANFILES Makefile.in |
||||
8496
doc/ngspice.texi
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
5951
doc/texinfo.tex
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
@ -0,0 +1,5 @@ |
|||||
|
## Process this file with automake to produce Makefile.in
|
||||
|
|
||||
|
SUBDIRS = man1 |
||||
|
|
||||
|
MAINTAINERCLEANFILES = Makefile.in |
||||
@ -0,0 +1,8 @@ |
|||||
|
## Process this file with automake to produce Makefile.in
|
||||
|
|
||||
|
|
||||
|
man_MANS = spice.1 nutmeg.1 sconvert.1 |
||||
|
|
||||
|
EXTRA_DIST = $(man_MANS) |
||||
|
|
||||
|
MAINTAINERCLEANFILES = Makefile.in |
||||
1051
man/man1/nutmeg.1
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
@ -0,0 +1,127 @@ |
|||||
|
.\" RCS Info: $Revision$ on $Date$ |
||||
|
.\" $Source$ |
||||
|
.\" Copyright (c) 1985 Wayne A. Christopher, U. C. Berkeley CAD Group |
||||
|
.TH SCONVERT 1 "20 March 1986" |
||||
|
.UC 4 |
||||
|
.SH NAME |
||||
|
sconvert \- convert spice formats |
||||
|
.SH SYNOPSIS |
||||
|
.B sconvert fromtype fromfile totype tofile |
||||
|
.br |
||||
|
.B sconvert fromtype totype |
||||
|
.br |
||||
|
.B sconvert |
||||
|
.br |
||||
|
.SH DESCRIPTION |
||||
|
.B Sconvert |
||||
|
translates spice output files among three formats: the old |
||||
|
binary format, a new binary format, and a new ascii format. |
||||
|
The formats are specified by the |
||||
|
.B fromtype |
||||
|
and |
||||
|
.B totype |
||||
|
arguments: `o' for the old format, `b' for the new binary format, |
||||
|
and `a' for the new ascii format. |
||||
|
.B Fromtype |
||||
|
specifies the format to be read, and |
||||
|
.B totype |
||||
|
specifies the format to be written. |
||||
|
If |
||||
|
.B fromfile |
||||
|
and |
||||
|
.B tofile |
||||
|
are given, then they are used as the input and output, otherwise |
||||
|
standard input and output are used. (Note that this second option is |
||||
|
only available on \s-2UNIX\s+2 systems \- on VMS and other systems you must |
||||
|
supply the filenames.) |
||||
|
If no arguments are given, the parameters are prompted for. |
||||
|
.PP |
||||
|
Binary format is the preferred format for general use, as it is |
||||
|
the most economical in terms of space and speed of access, and ascii is |
||||
|
provided to make it easy to modify data files and transfer them |
||||
|
between machines with different floating-point formats. |
||||
|
The old format is provided only |
||||
|
for backward compatibility. The three formats are as follows: |
||||
|
.br |
||||
|
.nf |
||||
|
|
||||
|
.B Old: |
||||
|
|
||||
|
What Size in Bytes |
||||
|
|
||||
|
title 80 |
||||
|
date 8 |
||||
|
time 8 |
||||
|
numoutputs 2 |
||||
|
the integer 4 2 |
||||
|
variable names -- |
||||
|
char[numoutputs][8] numoutputs * 8 |
||||
|
types of output numoutputs * 2 |
||||
|
node index numoutputs * 2 |
||||
|
plot title numoutputs * 24 |
||||
|
the actual data numpoints * numoutputs * 8 |
||||
|
|
||||
|
.B Ascii: |
||||
|
|
||||
|
Title: \fITitle Card String\fR |
||||
|
Date: \fIDate\fR |
||||
|
[ Plotname: \fIPlot Name\fR |
||||
|
Flags: \fIcomplex\fR or \fIreal\fR |
||||
|
No. Variables: \fInumoutputs\fR |
||||
|
No. Points: \fInumpoints\fR |
||||
|
Command: \fInutmeg command\fR |
||||
|
Variables: 0 \fIvarname1\fR \fItypename1\fR |
||||
|
1 \fIvarname2\fR \fItypename2\fR |
||||
|
etc... |
||||
|
Values: |
||||
|
0 n n n n ... |
||||
|
1 n n n n ... |
||||
|
And so forth... |
||||
|
] repeated one or more times |
||||
|
|
||||
|
.PP |
||||
|
If one of the flags is \fIcomplex\fR, the points look like r,i where r and i |
||||
|
are floating point (in %e format). Otherwise they are in %e format. |
||||
|
Only one of \fIreal\fR and \fIcomplex\fR should appear. |
||||
|
.PP |
||||
|
The lines are guaranteed to be less than 80 columns wide (unless the |
||||
|
plot title or variable names are very long), so this format is safe |
||||
|
to mail between systems like CMS. |
||||
|
.PP |
||||
|
Any number of \fBCommand:\fR lines may appear between the \fBNo. Points:\fR |
||||
|
and the \fBVariables:\fR lines, and whenever the plot is loaded into |
||||
|
\fBnutmeg\fR they will be executed. |
||||
|
.nf |
||||
|
|
||||
|
.B Binary: |
||||
|
|
||||
|
\fITitle Card\fR (a NULL terminated string) |
||||
|
\fIDate, Time\fR (a NULL terminated string) |
||||
|
[ |
||||
|
\fIPlot title\fR (a NULL terminated string) |
||||
|
\fINumber of variables\fR (an int) |
||||
|
\fINumber of data points\fR (an int) |
||||
|
\fIflags\fR (a short) |
||||
|
\fIvariable header struct\fR (repeated numoutputs times) |
||||
|
\fIvariable name\fR (a NULL terminated string) |
||||
|
\fIvariable type\fR (an int) |
||||
|
\fIset of outputs\fR (repeated numpoints times) |
||||
|
] repeated one or more times. |
||||
|
|
||||
|
.PP |
||||
|
A set of outputs is a vector of doubles of length numoutputs, or |
||||
|
a vector of real-imaginary pairs of doubles if the data is complex. |
||||
|
.SH "SEE ALSO" |
||||
|
nutmeg(1), spice(1), writedata(3) |
||||
|
.SH AUTHOR |
||||
|
Wayne Christopher (faustus@cad.berkeley.edu) |
||||
|
.SH BUGS |
||||
|
If variable names and the title |
||||
|
and plotname strings have trailing |
||||
|
blanks in them they will be stripped off when the file is read, if |
||||
|
it is in ascii format. |
||||
|
.PP |
||||
|
If a plot title begins with "Title:" \fBnutmeg\fR will be fooled into thinking |
||||
|
that this is an ascii format file. \fBSconvert\fR always requires the |
||||
|
type to be specified, however. |
||||
|
|
||||
@ -0,0 +1,325 @@ |
|||||
|
.\" RCS Info: $Revision$ on $Date$ |
||||
|
.\" $Source$ |
||||
|
.\" Copyright (c) 1985 Wayne A. Christopher, U. C. Berkeley CAD Group |
||||
|
.TH SPICE 1 "20 March 1986" |
||||
|
.ds S \s-2SPICE\s+2\&3 |
||||
|
.UC 4 |
||||
|
.SH NAME |
||||
|
spice \- circuit simulator |
||||
|
.SH SYNOPSIS |
||||
|
\fBspice [ -n ] [ -t term ] [ -r rawfile] [ -b ] |
||||
|
[ -i ] [ input file ... ]\fR |
||||
|
.SH DESCRIPTION |
||||
|
This manual page describes the commands available for interactive |
||||
|
use of \*S. For details of circuit descriptions and the |
||||
|
process of simulating a circuit, see the \*S User's Manual. |
||||
|
The commands available are a superset of those available for |
||||
|
\fBnutmeg\fR \- only the additional commands available in \*S |
||||
|
are described here. You should be familiar with the manual page for |
||||
|
\fBnutmeg(1)\fR before reading this manual page. |
||||
|
.PP |
||||
|
Arguments are: |
||||
|
.TP |
||||
|
\fB-n\fR (or \fB-N\fR) |
||||
|
Don't try to source the file ".spiceinit" upon startup. Normally \*S |
||||
|
tries to find the file in the current directory, and if it is not found then |
||||
|
in the user's home directory. |
||||
|
.TP |
||||
|
\fB-t term\fR (or \fB-T term\fR) |
||||
|
The program is being run on a terminal with \fImfb\fR name \fBterm\fR. |
||||
|
.TP |
||||
|
\fB-b\fR (or \fB-B\fR) |
||||
|
Run in batch mode. \*S will read the standard input or the specified |
||||
|
input file and do the simulation. Note that if the standard input |
||||
|
is not a terminal, \*S will default to batch mode, unless the |
||||
|
-i flag is given. |
||||
|
.TP |
||||
|
\fB-s\fR (or \fB-S\fR) |
||||
|
Run in server mode. This is like batch mode, except that a temporary |
||||
|
rawfile is used and then written to the standard output, preceded by |
||||
|
a line with a single "@", after the simulation is done. This mode |
||||
|
is used by the spice daemon. |
||||
|
.TP |
||||
|
\fB-i\fR (or \fB-I\fR) |
||||
|
Run in interactive mode. This is useful if the standard input is |
||||
|
not a terminal but interactive mode is desired. Command completion is |
||||
|
not available unless the standard input is a terminal, however. |
||||
|
.TP |
||||
|
\fB-r rawfile\fR (or \fB-R rawfile\fR) |
||||
|
Use \fBrawfile\fR as the default file into which the results of |
||||
|
the simulation are saved. |
||||
|
.PP |
||||
|
Further arguments are taken to be \*S input decks, which are read |
||||
|
and saved. (If batch mode is requested then they are run immediately.) |
||||
|
.PP |
||||
|
\*S will accept any \s-2SPICE\s+2\&2 input decks, and output |
||||
|
ascii plots, fourier analyses, and node printouts as specified |
||||
|
in .plot, .four, and .print cards. If a \fBout\fR parameter |
||||
|
is given on a .width card, the effect is the same as \fBset width = ...\fR. |
||||
|
Since \*S ascii plots do not use multiple ranges, however, if vectors |
||||
|
together on a .plot card have different ranges they will not provide |
||||
|
as much information as they would in \s-2SPICE\s+2\&2. The output |
||||
|
of \*S is also much less verbose than \s-2SPICE\s+2\&2, in that the only |
||||
|
data printed is that requested by the above cards. |
||||
|
.PP |
||||
|
Vector names are the same as in \fBnutmeg\fR, with this addition: |
||||
|
a name such as \fB@name[param]\fR, where \fBname\fR is either |
||||
|
the name of a device instance or model, denotes the value of the |
||||
|
\fBparam\fR parameter of the device or model. See the \*S User's |
||||
|
Manual for details of what parameters are available. The value is a |
||||
|
vector of length 1. This function is also available with the |
||||
|
\fBshow\fR command, and is available with variables for convenience for |
||||
|
command scripts. |
||||
|
.PP |
||||
|
\*S |
||||
|
commands are as follows (these are only those commands not also |
||||
|
available in \fBnutmeg\fR \- consult the \fBnutmeg\fR manual page for |
||||
|
more commands): |
||||
|
.TP |
||||
|
\fBsetcirc [circuit name]\fR |
||||
|
Change the current circuit. The current circuit is the one that is |
||||
|
used for the simulation commands below. When a circuit is loaded |
||||
|
with the \fIsource\fR command (see below) it becomes the |
||||
|
current circuit. |
||||
|
.TP |
||||
|
\fBop [.op card args]\fR |
||||
|
Do an operating point analysis. |
||||
|
.TP |
||||
|
\fBtran [.tran card args]\fR |
||||
|
Do a transient analysis. |
||||
|
.TP |
||||
|
\fBac [.ac card args]\fR |
||||
|
Do an ac analysis. |
||||
|
.TP |
||||
|
\fBdc [.dc card args]\fR |
||||
|
Do a dc transfer curve analysis. |
||||
|
.TP |
||||
|
\fBlisting [logical] [physical] [deck] [expand]\fR |
||||
|
Print a listing of the current circuit. If the \fBlogical\fR argument |
||||
|
is given, the listing is with all continuation lines collapsed |
||||
|
into one line, and if the \fBphysical\fR |
||||
|
argument is given the lines are printed out as they were found in |
||||
|
the file. The default is \fBlogical\fR. A \fBdeck\fR listing is just like |
||||
|
the \fBphysical\fR listing, except without the line numbers it recreates |
||||
|
the input file verbatim (except that it does not preserve case). |
||||
|
If the word \fBexpand\fR is present, the circuit will be printed with all |
||||
|
subcircuits expanded. |
||||
|
.TP |
||||
|
\fBedit [file]\fR |
||||
|
Print the current \*S deck into a file, call up the editor on that file |
||||
|
and allow the user to modify it, and then read it back in, replacing |
||||
|
the origonal deck. If a \fBfilename\fR is given, then edit that file |
||||
|
and load it, making the circuit the current one. |
||||
|
.TP |
||||
|
\fBresume\fR |
||||
|
Resume a simulation after a stop. |
||||
|
.TP |
||||
|
\fBshow \fR |
||||
|
Show a device parameter. |
||||
|
.TP |
||||
|
\fBalter \fR |
||||
|
Alter a device parameter. |
||||
|
.TP |
||||
|
\fBstate\fR |
||||
|
Print the state of the circuit. (This command is largely unimplemented.) |
||||
|
.TP |
||||
|
\fBsave [all] [output ...]\fR or \fB.save [all] [output ...]\fR |
||||
|
Save a set of outputs, discarding the rest. If a node has been mentioned |
||||
|
in a \fBsave\fR command, it will appear in the working plot after |
||||
|
a run has completed, or in the rawfile if spice is run in batch |
||||
|
mode. If a node is traced or plotted (see below) it will |
||||
|
also be saved. For backward compatibility, if there are \fBno\fR save |
||||
|
commands given, all outputs are saved. |
||||
|
.TP |
||||
|
\fBstop [ after n] [ when something cond something ] ... \fR |
||||
|
Set a breakpoint. The argument \fBafter n\fR means stop after \fBn\fR |
||||
|
iteration number \fBn\fR, and the argument |
||||
|
\fBwhen something cond something\fR means |
||||
|
stop when the first \fBsomething\fR is in the given relation with |
||||
|
the second \fBsomething\fR, the possible relations being |
||||
|
\fBeq\fR or = (equal to), |
||||
|
\fBne\fR or <> (not equal to), |
||||
|
\fBgt\fR or > (greater than), |
||||
|
\fBlt\fR or < (less than), |
||||
|
\fBge\fR or >= (greater than or equal to), and |
||||
|
\fBle\fR or <= (less than or equal to). |
||||
|
IO redirection is disabled for the \fBstop\fR command, since the relational |
||||
|
operations conflict with it (it doesn't produce any output anyway). |
||||
|
The \fBsomething\fR\&s above may be node names in |
||||
|
the running circuit, or real values. |
||||
|
If more than one condition is given, e.g. |
||||
|
\fBstop after 4 when v(1) > 4 when v(2) < 2\fR, the conjunction of |
||||
|
the conditions is implied. |
||||
|
.TP |
||||
|
\fBtrace [ node ...]\fR |
||||
|
Trace nodes. Every iteration the value of the node is printed to the |
||||
|
standard output. |
||||
|
.TP |
||||
|
\fBiplot [ node ...]\fR |
||||
|
Incrementally plot the values of the nodes while \*S runs. |
||||
|
.TP |
||||
|
\fBstep [number]\fR |
||||
|
Iterate \fBnumber\fR times, or once, and then stop. |
||||
|
.TP |
||||
|
\fBstatus\fR |
||||
|
Display all of the traces and breakpoints currently in effect. |
||||
|
.TP |
||||
|
\fBdelete [debug number ...]\fR |
||||
|
Delete the specified breakpoints and traces. The \fBdebug numbers\fR |
||||
|
are those shown by the \fBstatus\fR command. (Unless you do |
||||
|
\fBstatus > file\fR, in which case the debug numbers aren't printed.) |
||||
|
.TP |
||||
|
\fBreset\fR |
||||
|
Throw out any intermediate data in the circuit (e.g, after a breakpoint |
||||
|
or after one or more analyses have been done already), and re-parse |
||||
|
the deck. The circuit can then be re-run. (\fBNote\fR: this command |
||||
|
used to be \fBend\fR in \s-2SPICE\s+2 3a5 and earlier versions -- \fBend\fR |
||||
|
is now used for control structures.) The \fBrun\fR command will take |
||||
|
care of this automatically, so this command should not be necessary... |
||||
|
.TP |
||||
|
\fBrun [rawfile]\fR |
||||
|
Run the simulation as specified in the input file. If there were any |
||||
|
of the control cards .ac, .op, .tran, or .dc, they are executed. The output |
||||
|
is put in \fBrawfile\fR if it was given, in addition to being available |
||||
|
interactively. |
||||
|
.TP |
||||
|
\fBsource file\fR |
||||
|
Read the \*S input file \fBfile\fR. \fBNutmeg\fR and \*S commands may be |
||||
|
included in the file, and must be enclosed between the lines |
||||
|
\fI.control\fR and \fI.endc\fR. These commands |
||||
|
are executed immediately after the circuit is loaded, so a control line |
||||
|
of \fIac ...\fR will work the same as the corresponding \fI.ac\fR card. |
||||
|
The first line in any input file is considered a title |
||||
|
line and not parsed but kept as the name of the circuit. The |
||||
|
exception to this rule is the file \fI.spiceinit\fR. |
||||
|
Thus, a \*S command script must begin with a blank line and then with |
||||
|
a \fI.control\fR line. |
||||
|
Also, any line beginning with the characters *# is considered a control |
||||
|
line. This makes it possible to imbed commands in \*S input files |
||||
|
that will be ignored by earlier versions of \s-2SPICE\s+2. |
||||
|
\fINote:\fR in spice3a7 and before, the \fI.control\fR and \fI.endc\fR |
||||
|
lines were not needed, and any line beginning with the name of a front-end |
||||
|
command would be executed. |
||||
|
.TP |
||||
|
\fBlinearize vec ...\fR |
||||
|
Create a new plot with all of the vectors in the current plot, or |
||||
|
only those mentioned if arguments are given. The new vectors |
||||
|
will be interpolated onto a linear time scale, which is determined |
||||
|
by the values of \fBtstep, tstart,\fR and \fBtstop\fR in the |
||||
|
currently active transient analysis. The currently loaded deck |
||||
|
must include a transient analysis (a \fBtran\fR command may be run |
||||
|
interactively before the last \fBreset\fR, alternately), and the |
||||
|
current plot must be from this transient analysis. This command |
||||
|
is needed because \s-2SPICE\s+2\&3 doesn't output the results |
||||
|
from a transient analysis in the same manner that \s-2SPICE\s+2\&2 did. |
||||
|
.PP |
||||
|
There are several \fBset\fR variables that \*S uses but \fBnutmeg\fR |
||||
|
does not. They are: |
||||
|
.IP "" 16 |
||||
|
\fBeditor\fR |
||||
|
.br |
||||
|
The editor to use for the \fBedit\fR command. |
||||
|
.IP |
||||
|
\fBmodelcard\fR |
||||
|
.br |
||||
|
The name of the model card (normally \fB.model\fR). |
||||
|
.IP |
||||
|
\fBnoaskquit\fR |
||||
|
.br |
||||
|
Do not check to make sure that there are no circuits suspended and |
||||
|
no plots unsaved. Normally \*S will warn the user when he tries to |
||||
|
quit if this is the case. |
||||
|
.IP |
||||
|
\fBnobjthack\fR |
||||
|
.br |
||||
|
Assume that BJT's have 4 nodes. |
||||
|
.IP |
||||
|
\fBnoparse\fR |
||||
|
.br |
||||
|
Don't attempt to parse decks when they are read in (useful for |
||||
|
debugging). Of course, they |
||||
|
cannot be run if they are not parsed. |
||||
|
.IP |
||||
|
\fBnosubckt\fR |
||||
|
.br |
||||
|
Don't expand subcircuits. |
||||
|
.IP |
||||
|
\fBrenumber\fR |
||||
|
.br |
||||
|
Renumber input lines when a deck has \fB.include\fR's. |
||||
|
.IP |
||||
|
\fBsubend\fR |
||||
|
.br |
||||
|
The card to end subcircuits (normally \fB.ends\fR). |
||||
|
.IP |
||||
|
\fBsubinvoke\fR |
||||
|
.br |
||||
|
The prefix to invoke subcircuits (normally \fBx\fR). |
||||
|
.IP |
||||
|
\fBsubstart\fR |
||||
|
.br |
||||
|
The card to begin subcircuits (normally \fB.subckt\fR). |
||||
|
.PP |
||||
|
There are a number of \fBrusage\fR parameters available, in addition |
||||
|
to the ones available in \fBnutmeg\fR: |
||||
|
.IP "" 16 |
||||
|
.PP |
||||
|
If there are subcircuits in the input file, \*S expands instances of them. |
||||
|
A subcircuit is delimited by the cards |
||||
|
.B .subckt |
||||
|
and |
||||
|
.B .ends, |
||||
|
or whatever the value of the variables |
||||
|
.B substart |
||||
|
and |
||||
|
.B subend |
||||
|
is, respectively. An instance of a subcircuit is created by specifying |
||||
|
a device with type 'x' \- the device line is written |
||||
|
.IP |
||||
|
\fBxname node1 node2 ... subcktname\fR |
||||
|
.LP |
||||
|
where the nodes are the node names that replace the formal parameters |
||||
|
on the \fB.subckt\fR line. All nodes that are not formal parameters |
||||
|
are prepended with the name given to the instance and a ':', as are |
||||
|
the names of the devices in the subcircuit. If there are several nested |
||||
|
subcircuits, node and device names look like \fBsubckt1:subckt2:...:name\fR. |
||||
|
If the variable \fBsubinvoke\fR is set, then it is used as the prefix |
||||
|
that specifies instances of subcircuits, instead of 'x'. |
||||
|
.SH "VMS NOTES" |
||||
|
The standard suffix for rawspice files in VMS is ".raw". |
||||
|
.PP |
||||
|
You may have to redefine the value EDITOR if you wish to use the \fBedit\fR |
||||
|
command, since the default for VMS is "vi". |
||||
|
.SH "SEE ALSO" |
||||
|
nutmeg(1), sconvert(1), spice(1), mfb(3), writedata(3) |
||||
|
\*S User's Guide |
||||
|
.SH AUTHORS |
||||
|
\*S: Tom Quarles (quarles@cad.berkeley.edu) |
||||
|
.br |
||||
|
\fBnutmeg\fR / User interface: Wayne Christopher (faustus@cad.berkeley.edu) |
||||
|
.SH BUGS |
||||
|
.PP |
||||
|
\*S will recognise all the notations used in \s-2SPICE\s+2\&2 \fB.plot\fR |
||||
|
cards, and will translate \fBvp(1)\fR into \fBph(v(1))\fR, and so |
||||
|
forth. However, if there are spaces in these names it won't work. Hence |
||||
|
\fBv(1, 2)\fR and \fB(-.5, .5)\fR aren't recognised. |
||||
|
.PP |
||||
|
BJT's can have either 3 or 4 nodes, which makes it difficult for the subcircuit |
||||
|
expansion routines to decide what to rename. If the fourth parameter has |
||||
|
been declared as a model name, then it is assumed that there are 3 nodes, |
||||
|
otherwise it is considered a node. To disable this kludge, you can set |
||||
|
the variable "nobjthack", which will force BJT's to have 4 nodes (for the |
||||
|
purposes of subcircuit expansion, at least). |
||||
|
.PP |
||||
|
The \fB@name[param]\fR notation might not work with \fBtrace, iplot,\fR etc. |
||||
|
yet. |
||||
|
.PP |
||||
|
The first line of a command file (except for the \fI.spiceinit\fR file) |
||||
|
should be a comment. Otherwise \s-2SPICE\s+2 may create an empty circuit |
||||
|
structure. |
||||
|
.SH CAVEATS |
||||
|
.PP |
||||
|
\*S files specified on the command line are read in before the\fB .spiceinit\fR |
||||
|
file is read. Thus if you define aliases there that you call in a |
||||
|
\*S source file mentioned on the command line, they won't be recognised. |
||||
|
|
||||
@ -0,0 +1,164 @@ |
|||||
|
So, this is third version of Spice3f5 for RedHat Linux 2.6. I took re-ported |
||||
|
version of spice3f5 and made changes to fix some bugs. If someone want to help, |
||||
|
please send me "newer" versions wtih more bugs fixed. |
||||
|
I hope that those who wnat to have good spice under Linux (no more Win95) |
||||
|
will find this port useful and maybe help each other to improve it. |
||||
|
|
||||
|
There was a lot of bugs in previus versions, generally in command parsiong routines. |
||||
|
I copy all original files to *.orig and marked all my changes with /* MW. ... */ |
||||
|
|
||||
|
I changed cp/bquote.c and cp/var2.c to handle some special situations |
||||
|
and commands like $foo, `foo`. Also problems with 'gets()' (in sconvert and |
||||
|
inp.c) function are fixed. I chnaget it to fgets(buf, BSIZE_SP, stdin) for |
||||
|
safe use. |
||||
|
|
||||
|
Globing ('[]{}?*') didn't work at all. Now it is removed (form cp/glob.c). |
||||
|
We don't need this features in spice. |
||||
|
|
||||
|
Initial command parsing (cp_lexer() from cp/lexical.c) strip all commas from |
||||
|
strings. This was in conflict with aritchetic expressions. |
||||
|
|
||||
|
com_let() in fte/postcoms.c caused core dump in some situations - fixed. |
||||
|
|
||||
|
Editor problems. Com_edit() in fte/inp.c failed occasionally, when it |
||||
|
tryies to fclose() fp second time. Now inp_spsource() always closes fp, and |
||||
|
other calling functions do not. It seems to work right now. |
||||
|
|
||||
|
vec_get() (fte/vectors.c) has some problems with devices parameters and |
||||
|
memory leaks. I hope that my changes fixed it at all. |
||||
|
|
||||
|
I have to add INPinsertNofree() in inp/inpsymt.c. This is special case for |
||||
|
routines from fte/spiceif.c and fte/outitf.c - It does not do free() for |
||||
|
any pointers that it gets. This may cause small memory leaks, but I don't |
||||
|
know how to make it better. |
||||
|
|
||||
|
com_alter_common() (fte/device.c) caused segmentation faults ocassionally, |
||||
|
due to double free the same pointers. It works right now. |
||||
|
|
||||
|
cp_lexer() corretly gets ^V, ^D, and ESC. I have to #include ioctl.h file in |
||||
|
cp/lexical.c and cp/complete.c |
||||
|
|
||||
|
There were problem with com_iplot() if it was called when X11 does not run. |
||||
|
I have to add additonal check to gr_pmsg() (from fte/graph.c) and now it |
||||
|
works fine. |
||||
|
|
||||
|
Trace failed to display comlex data due to segmentation fault. Someone wants |
||||
|
to plot realdata even if given vector was complex. I changed gr_iplot() |
||||
|
(in fte/graf.c) and now it is fine. |
||||
|
|
||||
|
There are some changes in os_linux.h and os_unix.h, but they are not mandatory, |
||||
|
I think. Also I have to add PI, and some other const. declarations in spice.h |
||||
|
They were needed somewhere. (why someone didn't used M_PI and so on instead ?) |
||||
|
|
||||
|
In file fte/x11.c, was a prloblem with background color for plot windows. I |
||||
|
changed init_colors() and now we can use color0 variable. |
||||
|
|
||||
|
Spice3f5 has a few memory leaks. I suppose that some vectors and maybe other |
||||
|
things are simple 'lost' somewhere. If you (just like me) trying to make this |
||||
|
program better, take care about this also. |
||||
|
Generally I didn't do much with graphisc interface, because it seems to work |
||||
|
quite good. Only problem is core dump, when cliking mouse on help screen. |
||||
|
|
||||
|
Manuals are sometimes in error. Vector creation by [ el. el. ...] is not |
||||
|
supported I think. For indexing we must use [low , hi]. For setting 'list' |
||||
|
variables - ( el. el. ... ). Indexing also doesn't work with let xx[...] = yy. |
||||
|
|
||||
|
Someone should change these f... manuals. |
||||
|
|
||||
|
|
||||
|
And now for those who think about makeing this program better. There is a big |
||||
|
problem with memory, when you run a few simulations. Destroy commad does not |
||||
|
free much memory, and after some time you can see that spice uses 3MB, when |
||||
|
you just clean all vectros. Also I don't know how to unload a circuit - |
||||
|
spice hold all sourced files in the "deck" list and there is no way to free |
||||
|
it from command line (or maybe I didn't find any). |
||||
|
Unfortunatelly I am sure that these are not all off the problems |
||||
|
with this program, but now I can use it quite effectively. If anyone will |
||||
|
know anything about bugs-free, good, commannd driven simulator for Linux |
||||
|
__PLEASE__ let me know. |
||||
|
|
||||
|
For easer use I made special debug file (conf/debug). I used it for makeing |
||||
|
"debug" version of spice with efence library and -g option. Executable files |
||||
|
from this are located in spice3f5/objdbg/bin, when you do 'util/build linux debug'. |
||||
|
|
||||
|
I am an electronic designer, so I really need a good working simulator... |
||||
|
|
||||
|
Original readme file is given below. |
||||
|
|
||||
|
Michael Widlok (widlok@uci.agh.edu.pl) |
||||
|
Uniersity of Mining and Metallurgy |
||||
|
Krakow, Poland. |
||||
|
|
||||
|
|
||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
|
This is my (re-)port of Spice3f4 to Linux version 2 (I am not the same |
||||
|
person who ported it before). It also wraps in the latest official |
||||
|
pre-3f5 patches from Berkeley I could find (found in |
||||
|
sp3f4.patch.tar.Z). Support for the MFB interface using the Linux |
||||
|
termcap library and some various Linux features have been ported. |
||||
|
|
||||
|
This was not done for the hell of it, but it seemed that something |
||||
|
broke due to some Linux/system/library changes, so I decided to try |
||||
|
porting it from scratch. In fact, if you don't have any problems with |
||||
|
the previous port, your probably fine then. However, if you do have |
||||
|
problems (e.g. exiting Spice leaves you in uppercase mode), or want |
||||
|
MFB for some reason, then try this. It seems to work here. |
||||
|
|
||||
|
Basically, I started out with sp3f4.kit.tar.Z. Then, I applied the |
||||
|
most recent patches contained in sp3f4.patch.tar.Z and wrote new Linux |
||||
|
build files: "linux" and "os_linux.h" (some minor mods to the source |
||||
|
were also necessary, protected with linux conditionals). |
||||
|
|
||||
|
Since the previous spice3f4.tar.gz port file was generally available, |
||||
|
there was no point in duplicating source, so I just diffed from the |
||||
|
spice3f4.tar.gz tree to freshly ported tree and edited or removed a |
||||
|
few of the diffs. A few of the changes made in spice3f4.tar.gz have |
||||
|
been reverted to the distribution defaults, but one notable change is |
||||
|
that performing the install step will install the necessary files into |
||||
|
/usr/local/spice. You'll need to add /usr/local/spice/bin to your |
||||
|
shell path. See the file conf/linux to change the installation |
||||
|
location (this location gets hard-coded in the spice binaries). |
||||
|
|
||||
|
This is a patched file of the original readme.Linux from |
||||
|
spice3f4.tar.gz, and the previous contents by Jeff@EE.Ryerson.Ca is |
||||
|
given below. Just follow the below instructions, so you should be |
||||
|
able to safely do: |
||||
|
|
||||
|
./util/build linux |
||||
|
./util/build linux install |
||||
|
|
||||
|
You should then find the spice binaries and library files |
||||
|
in e.g. /usr/local/spice. Example files and the man pages |
||||
|
are not installed, so you might want to copy them by hand. |
||||
|
|
||||
|
Andrew Veliath (veliaa@rpi.edu) |
||||
|
January 25, 1997 |
||||
|
|
||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
|
This is my port of Spice3f4 to Linux. It required a few more changes |
||||
|
than the porting document indicated would be necessary, mostly to do |
||||
|
with supported/unsupported functions in Linux libc & libm. |
||||
|
|
||||
|
I've tried to make these changes in as as portable a way as possible, |
||||
|
so it should build cleanly on other Unicies, however I've removed the |
||||
|
MS-DOS support so the tarred and gziped source fits on one disk. |
||||
|
|
||||
|
To build spice3, first have a look in the file readme, but you should |
||||
|
be able to just do... |
||||
|
|
||||
|
./util/build linux |
||||
|
./util/build install linux |
||||
|
|
||||
|
Note that there is a modifyer "gcc" you can try if you have trouble, but |
||||
|
it claims to work around some obscure bug in gcc that I'm positive got |
||||
|
fixed eons ago. To use it anyway, do ./util/build linux gcc. |
||||
|
|
||||
|
I found this source through archie, (look for spice3f3.tar.Z, and then |
||||
|
patched it to 3f4 with patches from ic.berkeley.edu), I assume that the |
||||
|
ftp site I got it from has read thier license from Berkeley, which if |
||||
|
it's the same as the 3e2 license states that the holder can distribute |
||||
|
copies free of charge provided it does not fall into hands unfriendly |
||||
|
to the U.S. So... I guess if that's you, please destroy all copies of this |
||||
|
you might have! |
||||
|
|
||||
|
Jeff@EE.Ryerson.Ca |
||||
@ -0,0 +1,7 @@ |
|||||
|
A note when using dbx (under unix-type operating systems) to debug spice3: |
||||
|
|
||||
|
To avoid a segmentation fault in the initial run, use the following command |
||||
|
in dbx: |
||||
|
setenv SPICE_NO_DATASEG_CHECK "1" |
||||
|
Or, the comparable command in your shell before running dbx. This |
||||
|
disable accurate tracking of how much memory is used. |
||||
@ -0,0 +1,98 @@ |
|||||
|
Internal Changes from 3e2 |
||||
|
|
||||
|
The device structure has changed: The state counter in all device |
||||
|
structures has been moved to correspond to GENstates in the |
||||
|
GENinstance structure. |
||||
|
|
||||
|
Also, a new per-device-type function has been added: XXXunsetup, |
||||
|
which deallocates nodes and other resources created in the |
||||
|
XXXsetup function. ("XXX" is the device abbreviation.) |
||||
|
|
||||
|
Internal Changes from 3d2 |
||||
|
|
||||
|
FILE NAMES: |
||||
|
|
||||
|
Of the changes to spice3 between 3d2 and 3e1, the |
||||
|
the most obvious is the new filenames. All filesnames |
||||
|
have been converted to lowercase and are at most eight |
||||
|
characters plus an optional dot and three character extension. |
||||
|
This change was made to accomodate MS-DOS and other operating |
||||
|
systems which limit the maximum file name length. |
||||
|
|
||||
|
|
||||
|
ORGANIZATION |
||||
|
|
||||
|
The top level directory contains the installation "readme" file |
||||
|
and a "makedefs" files used by the "build" command. |
||||
|
|
||||
|
"src/" contains all of the C source code. This used to be named |
||||
|
"spice3" or "spice3d2" in previous releases. |
||||
|
|
||||
|
"src/lib" is the library or "toolkit" portion of Spice3. Within |
||||
|
it are the following subdirectories: |
||||
|
|
||||
|
ckt/ All of the analysis code. |
||||
|
ni/ Numerical algorithms (used by ckt routines). |
||||
|
sparse/ Sparse matrix package (used by ckt and ni). |
||||
|
misc/ Miscellaneous utility and portability routines. |
||||
|
dev/ All of the device specific code, with a subdir for |
||||
|
each device implementation. |
||||
|
|
||||
|
inp/ Input parsing; could be much smaller. |
||||
|
|
||||
|
fte/ The front end. Really bad. |
||||
|
cp/ More front end -- "C shell". |
||||
|
hlp/ The windowed help system. |
||||
|
|
||||
|
mfb/ Terminal independant graphics package. |
||||
|
mfbpc/ MFB interface for the IBM PC. |
||||
|
|
||||
|
|
||||
|
"src/bin" contains the source for all executable programs (the |
||||
|
location for "main( )"). "main.c" is used by spice, nutmeg, |
||||
|
bspice, and cspice (the latter two for MS-DOS). The function |
||||
|
of "main.c" is altered by defining the pre-processor symbols |
||||
|
SIMULATOR (for either spice, bspice, or cspice), BATCH for |
||||
|
bspice, and BATCH and SPICE2 for cspice (no special defines |
||||
|
give nutmeg). Each variant of the simulator uses "conf.c" (or |
||||
|
"bconf.c" or "cconf.c", or "nconf.c" for nutmeg), which is |
||||
|
automatically generated from "config.c". "config.c" is a |
||||
|
template used to select devices and analyses. "tune.c" |
||||
|
("tunepc.c") contains the compiled in pathnames. |
||||
|
|
||||
|
|
||||
|
"examples/" contains several spice input files. |
||||
|
|
||||
|
"lib/" contains standard data files for spice, such as the help |
||||
|
files and MFB capability files. |
||||
|
|
||||
|
"man/" contains UNIX style manual pages (ala "man(1)"). |
||||
|
|
||||
|
"util/" contains utility scripts, such as "build" for running the |
||||
|
recursive "make" and "delall.bat" for deleting the distribution on |
||||
|
MS-DOS systems. |
||||
|
|
||||
|
All "Makefile"s have been replaced with "makedefs" (and optionally |
||||
|
"depend" and "makeops"). "makedefs" is combined with other |
||||
|
make definition files with the "build" script. |
||||
|
|
||||
|
SOURCE LEVEL CHANGES |
||||
|
|
||||
|
(Added features are listed in the "README" file). |
||||
|
|
||||
|
DEVICES: The interface to devices has, once again, changed. |
||||
|
The change is small from 3d2. Table size values in the device |
||||
|
information struction are now pointers to integers containing |
||||
|
the table sizes. Per-analyses functions have been surrounded |
||||
|
with "#ifdef AN_xx"/"#else"/"#endif" lines. Note that the |
||||
|
"itf.h" files are stored only in the "include/" subdirectory. |
||||
|
|
||||
|
Adding devices to the master list is done in the file |
||||
|
"src/bin/config.c", instead of "FTE/SPIinit.c". |
||||
|
|
||||
|
SPARSE MATRIX PACKAGE: the sparse matrix package in Spice3e1 |
||||
|
and later is a more efficient implementation than in earlier releases. |
||||
|
The interface is the same. |
||||
|
|
||||
|
|
||||
|
|
||||
@ -0,0 +1,207 @@ |
|||||
|
|
||||
|
|
||||
|
Compiling spice with Think C on a Macintosh. |
||||
|
|
||||
|
A 68020 (Mac II) with co-processor is required. |
||||
|
|
||||
|
The src directory from the spice distribution should be moved into |
||||
|
the C folder. |
||||
|
|
||||
|
**** recompile think c libraries **** |
||||
|
|
||||
|
Both the ANSI and unix libraries must be recompiled with the |
||||
|
following additional compiler settings: |
||||
|
Generate 68020 instructions |
||||
|
Generate 68881 instructions |
||||
|
4-bytes ints |
||||
|
Native floating-point format |
||||
|
|
||||
|
The "console.c" file must be edited and should be removed from |
||||
|
the ANSI project. I actually recompiled copies of the ANSI and |
||||
|
unix libraries that I called ANSI.68881 and unix.68881. |
||||
|
Copy the "console.c" source (a THINK C file) to a suitable |
||||
|
location so that it can be included in the spice project. (See |
||||
|
the next section for details of how "consol.c" must be modified.) |
||||
|
|
||||
|
|
||||
|
**** creating the project **** |
||||
|
|
||||
|
Create a new project and set the Options as follows: |
||||
|
Laguage Settings |
||||
|
Turn on the following options |
||||
|
Define #__STDC__ |
||||
|
Recognize trigraphs |
||||
|
enums are always ints |
||||
|
Check pointer types |
||||
|
Language Extension |
||||
|
THINK C |
||||
|
Compiler Settings |
||||
|
Turn on the following options |
||||
|
Generate 68020 instructions |
||||
|
Generate 68881 instructions |
||||
|
4-bytes ints |
||||
|
Native floating-point format |
||||
|
Code Optimization |
||||
|
Turn on all options |
||||
|
Prefix |
||||
|
make sure there is no prefix (remove |
||||
|
default #include <macheaders>) |
||||
|
|
||||
|
Note: The Language setting 'Strict Prototype Enforcement' must be |
||||
|
turned off. |
||||
|
|
||||
|
Set the project type to application with at least 1024k partition |
||||
|
and turn on the 'Far DATA' option. |
||||
|
|
||||
|
*** Adding the code to the project *** |
||||
|
|
||||
|
Start Adding the code to the project. The code must be divided |
||||
|
into segments that are less that 32K each when compiled. The |
||||
|
following division has been used: |
||||
|
|
||||
|
Segment 1: the ANSI.68881 and unix.68881 libraries. |
||||
|
Segment 2: all *.c files in /src/sparse |
||||
|
Segment 3: all *.c files in /src/lib/ni |
||||
|
Segment 4: all *.c files in /src/lib/misc |
||||
|
Segment 5: files /src/lib/inp/inp2dot.c |
||||
|
and /src/lib/inp/inptree.c |
||||
|
Segment 6: all other *.c files in /src/inp |
||||
|
Segment 7: all *.c files in /src/lib/hlp |
||||
|
Segment 8: all *.c files in /src/lib/cp |
||||
|
except /src/lib/cp/input.c |
||||
|
Segment 9: file /src/lib/ckt/dloadfns.c |
||||
|
Segment 10: files /src/lib/ckt/cktpzstr.c, |
||||
|
/src/lib/ckt/cktsens.c, /src/lib/ckt/dctran.c, |
||||
|
and /src/lib/ckt/distoan.c |
||||
|
Segment 11: all other *.c files in /src/lib/ckt |
||||
|
Segment 12: cmath*.c files in /src/lib/fte |
||||
|
Segment 13: files agraf.c, clip.c, display.c, graf.c, |
||||
|
graphdb.c, plot5.c, plotcurv.c and |
||||
|
postsc.c in /src/lib/fte |
||||
|
|
||||
|
Segment 14: files evaluate.c, parse.c, postcoms.c, |
||||
|
and subckt.c in /src/lib/fte |
||||
|
Segment 15: files breakp.c, device.c, doplot.c, |
||||
|
grid.c and shyu.c in /src/lib/fte |
||||
|
Segment 16: files dotcards.c, inp.c, outif.c, rawfile.c, |
||||
|
spiceif.c and vectors.c in /src/lib/fte |
||||
|
Segment 17: all other *.c files in /src/lib/fte |
||||
|
except nutmegif.c |
||||
|
Segment 18: all *.c files in /src/lib/fte/vsrc |
||||
|
and /src/lib/fte/isrc |
||||
|
Segment 19: all *.c files in /src/lib/fte/jfet |
||||
|
Segment 20: all *.c files in /src/lib/fte/vccs, |
||||
|
/src/lib/fte/vcvs, /src/lib/fte/cccs, |
||||
|
and /src/lib/fte/ccvs |
||||
|
Segment 21: all *.c files in /src/lib/fte/asrc |
||||
|
and /src/lib/fte/urc |
||||
|
Segment 22: all *.c files in /src/lib/fte/cap, |
||||
|
/src/lib/fte/ind, and /src/lib/fte/res |
||||
|
Segment 23: all *.c files in /src/lib/fte/csw, |
||||
|
/src/lib/fte/sw, and /src/lib/fte/tra |
||||
|
Segment 24: all *.c files in /src/lib/fte/mos6 |
||||
|
Segment 25: all *.c files in /src/lib/fte/mes |
||||
|
Segment 26: all *.c files in /src/lib/fte/ltra |
||||
|
Segment 27: file mos3load.c in /src/lib/fte/mos3 |
||||
|
Segment 28: files mos3dist.c, mos3dset.c, |
||||
|
and mos3sld.c in /src/lib/fte/mos3 |
||||
|
Segment 29: remaining *.c files in /src/lib/fte/mos3 |
||||
|
Segment 30: all *.c files in /src/lib/fte/dio |
||||
|
Segment 31: file mos1load.c in /src/lib/fte/mos1 |
||||
|
Segment 32: files mos1dist.c, mos1dset.c, |
||||
|
and mos1sld.c in /src/lib/fte/mos1 |
||||
|
Segment 33: remaining *.c files in /src/lib/fte/mos1 |
||||
|
Segment 34: file bjtload.c in /src/lib/fte/bjt |
||||
|
Segment 35: files bjtdisto.c, bjtdset.c, |
||||
|
and bjtsload.c in /src/lib/fte/bjt |
||||
|
Segment 36: remaining *.c files in /src/lib/fte/bjt |
||||
|
Segment 37: file mos2load.c in /src/lib/fte/mos2 |
||||
|
Segment 38: file mos2dset.c in /src/lib/fte/mos2 |
||||
|
Segment 39: files mos2dist.c, and mos2sld.c |
||||
|
in /src/lib/fte/mos2 |
||||
|
Segment 40: remaining *.c files in /src/lib/fte/mos2 |
||||
|
Segment 41: files b1dset.c, and b1ld.c in /src/lib/fte/bsim1 |
||||
|
Segment 42: files b1disto.c, and b1eval.c in /src/lib/fte/bsim1 |
||||
|
Segment 43: remaining *.c files in /src/lib/fte/bsim1 |
||||
|
Segment 44: files b2eval.c, and b2ld.c in /src/lib/fte/bsim2 |
||||
|
Segment 45: remaining *.c files in /src/lib/fte/bsim2 |
||||
|
Segment 46: all *.c files in /src/lib/dev/disto, |
||||
|
and devsup.c in /src/lib/dev |
||||
|
Segment 47 all *.c files in /src/lib/mac, |
||||
|
and file /src/bin/main.c |
||||
|
|
||||
|
Note that the following files are not included: |
||||
|
/src/lib/cp/input.c |
||||
|
/src/lib/fte/nutmegif.c |
||||
|
|
||||
|
Add "console.c" (the copy made as described above) and make the |
||||
|
following alterations to it: |
||||
|
1. The lines: |
||||
|
static char console_environment, noPrint, interrupted; |
||||
|
static short console_refnum; |
||||
|
static MenuHandle appleMenu; |
||||
|
static WindowPeek theConsole; |
||||
|
|
||||
|
must be changed to make console_environment and |
||||
|
appleMenu external: |
||||
|
extern char console_environment, noPrint, interrupted; |
||||
|
static char noPrint, interrupted; |
||||
|
static short console_refnum; |
||||
|
extern MenuHandle appleMenu; |
||||
|
static WindowPeek theConsole; |
||||
|
|
||||
|
2. Alter the function ProcessEvent() to add a default switch |
||||
|
case. The altered section appears following a doEvent label as |
||||
|
(note: this code fragment has 4-space tabs and long lines |
||||
|
broken to fit an 80-column page; these changes do not affect |
||||
|
the code): |
||||
|
|
||||
|
doEvent: |
||||
|
if (event.what == mouseDown) { |
||||
|
switch (FindWindow(event.where, &wp)) { |
||||
|
case inMenuBar: |
||||
|
InitCursor(); |
||||
|
choice = MenuSelect(event.where); |
||||
|
goto doMenu; |
||||
|
case inSysWindow: |
||||
|
SystemClick(&event, wp); |
||||
|
break; |
||||
|
default: /* For spice to pass mouse |
||||
|
events to graphs */ |
||||
|
if ((WindowPtr) wp != FrontWindow()) { |
||||
|
SelectWindow(wp); |
||||
|
in.cnt = 0; |
||||
|
} /* in.cnt=0 forces console to |
||||
|
return to application */ |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
Compilation takes about 3 to 4 hours on a 25MHz mac. Set the cache |
||||
|
to at least 256k to eliminate a lot of disk access. |
||||
|
|
||||
|
**** makeindx **** |
||||
|
Create a project with the same option settings decribed above. |
||||
|
|
||||
|
Add src/bin/makeidx.c, ANSI.68881 and an unmodified version of |
||||
|
"console.c". |
||||
|
|
||||
|
Build the makeindex application. |
||||
|
|
||||
|
Move the application into lib/helpdir directory of the the spice |
||||
|
distribution. Run it and add the names of the files to be indexed |
||||
|
(nutmeg.txt spice.txt) to the command line and hit return. |
||||
|
|
||||
|
**** proc2mod **** |
||||
|
|
||||
|
Create a project with the same option settings decribed above. |
||||
|
|
||||
|
Add src/bin/proc2mod.c, src/lib/misc/alloc.c, src/lib/misc/string.c |
||||
|
src/lib/inp/inpcfix.c, src/lib/inp/inpeval.c, |
||||
|
src/lib/inp/inpgtok.c, ANSI.68881 and an unmodified |
||||
|
version of console.c. |
||||
|
|
||||
|
Build the proc2mod application. |
||||
@ -0,0 +1,237 @@ |
|||||
|
(ER - 7/08/99) |
||||
|
|
||||
|
These are a few notes on the autoconf porting that is being done. |
||||
|
|
||||
|
Autoconf automaticcaly provides #defines (in config.h) that describe |
||||
|
the system that ng-spice is being compiled on. Thus, all the os_xxx.h |
||||
|
files should no longer be necessary. |
||||
|
|
||||
|
|
||||
|
Here is a (as complete as possible) list of new #defines and their |
||||
|
corresponding #defines in the old build system: |
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
#define HAS_VAX_FPERRORS - unused (should remove the code) |
||||
|
#define MAXPOSINT 4294967295 - don't know about that one |
||||
|
#define MAX_EXP_ARG 87.0 - same |
||||
|
|
||||
|
---------- Operating System (os_xxx.h) parameters: |
||||
|
|
||||
|
----- Enabling flags |
||||
|
#define AVAIL_MFB -DWANT_MFB passed to cpp |
||||
|
#define AVAIL_X11 X_DISPLAY_MISSING (reversed) |
||||
|
|
||||
|
----- String or character constants |
||||
|
#define DIR_CWD "." now in spice.h |
||||
|
#define DIR_PATHSEP "/" now in spice;h |
||||
|
#define DIR_TERM '/' now in spice.h |
||||
|
|
||||
|
On Unix, I don't think that there are other possibilities. |
||||
|
We should get rid of those. |
||||
|
|
||||
|
|
||||
|
----- sprintf( ) format strings |
||||
|
#define TEMPFORMAT "/tmp/%s%d" /* sprintf format for creating temp files */ |
||||
|
#define SYSTEM_MAIL "mail -s \"%s (%s) Bug Report\" %s" /* mail command */ |
||||
|
#define SYSTEM_PLOT5LPR "lpr -P%s -g %s" /* For printing Unix plot(5) files */ |
||||
|
#define SYSTEM_PSLPR "lpr -P%s %s" /* For printing postscript files */ |
||||
|
|
||||
|
|
||||
|
Same for these I guess... |
||||
|
|
||||
|
|
||||
|
|
||||
|
----- System capabilities |
||||
|
#define HAS_ACCESS HAVE_ACCES |
||||
|
#define HAS_ASCII not handled yet |
||||
|
#define HAS_ATRIGH HAVE_ATANH HAVE_ACOSH HAVE_ASINH |
||||
|
#define HAS_BCOPY HAVE_BCOPY |
||||
|
#define HAS_BSDDIRS HAVE_DIR_H |
||||
|
#define HAS_BSDRANDOM unused |
||||
|
#define HAS_BSDRLIMIT HAVE_GETRLIMIT |
||||
|
#define HAS_BSDRUSAGE HAVE_GETRUSAGE |
||||
|
#define HAS_BSDSOCKETS unused |
||||
|
#define HAS_BSDTIME HAVE_GETTIMEOFDAY |
||||
|
#define HAS_BSDTTY HAVE_SGTTY_H |
||||
|
#define HAS_CHDIR removed |
||||
|
#define HAS_CLEARERR removed |
||||
|
#define HAS_CTYPE HAVE_CTYPE_H |
||||
|
#define HAS_DOSDIRS dos only - should remove code |
||||
|
#define HAS_DUP2 HAVE_DUP2 |
||||
|
#define HAS_ENVIRON removed |
||||
|
#define HAS_EXIT1 vms only - should remove the code |
||||
|
#define HAS_FCNTL HAVE_FCNTL_H |
||||
|
#define HAS_FTIME HAVE_FTIME |
||||
|
#define HAS_GETCWD HAVE_GETCWD |
||||
|
#define HAS_GETPID removed |
||||
|
#define HAS_GETPW HAVE_PWD_H |
||||
|
#define HAS_GETWD HAVE_GETWD |
||||
|
#define HAS_INDEX HAVE_INDEX |
||||
|
#define HAS_NO_IEEE_LOGB HAVE_LOGB HAVE_SCALB HAVE_SCALBN |
||||
|
#define HAS_NO_IEEE_LOGB_DECL removed |
||||
|
#define HAS_ISATTY HAVE_ISATTY |
||||
|
#define HAS_LONGJUMP removed |
||||
|
#define HAS_MINDATA dos only? - should remove code if so |
||||
|
#define HAS_NOINLINE dos only? - should remove code if so |
||||
|
#define HAS_NOVM dos only? - should remove code if so |
||||
|
#define HAS_NO_ATRIGH_DECL removed |
||||
|
#define HAS_PCTERM dos only - should remove code |
||||
|
#define HAS_POPEN HAVE_POPEN |
||||
|
#define HAS_QSORT HAVE_QSORT |
||||
|
#define HAS_SHORTMACRO dos only - should remove code |
||||
|
#define HAS_STAT STAT_MACROS_BROKEN (reversed) |
||||
|
#define HAS_STDLIB STDC_HEADERS |
||||
|
#define HAS_STRCHR HAVE_STRCHR |
||||
|
#define HAS_STRINGS STDC_HEADERS (reversed) not sure about that one! |
||||
|
#define HAS_SYSTEM removed |
||||
|
#define HAS_SYSVDIRS HAVE_DIRENT_H |
||||
|
#define HAS_SYSVRLIMIT HAVE_ULIMIT |
||||
|
#define HAS_SYSVRUSAGE HAVE_UTIME |
||||
|
#define HAS_SYSVTIME HAVE_TIME |
||||
|
#define HAS_SYSVTTY HAVE_TERMIO_H |
||||
|
#define HAS_TERMCAP HAVE_TERMCAP |
||||
|
#define HAS_TERMREAD don't know what to do with this one |
||||
|
#define HAS_UNIX_SIGS removed |
||||
|
#define HAS_UNLINK removed |
||||
|
#define HAS_VFORK HAVE_VFORK_H |
||||
|
#define HAS_VMSHACK vms only - should remove the code |
||||
|
#define HAS_VPERROR removed |
||||
|
#define HAS_WAIT HAVE_WAIT |
||||
|
|
||||
|
plus a few others: |
||||
|
|
||||
|
#define HAS_MEMAVL dos only - should remove code |
||||
|
#define HAS_FLAT_INCLUDES macos only - should remove code |
||||
|
#define HAS_BATCHSIM dos only - should remove code |
||||
|
|
||||
|
|
||||
|
|
||||
|
---------------------------------------------------------------------------- |
||||
|
|
||||
|
PORTING SPICE3e1 |
||||
|
|
||||
|
Porting Spice3 to a new operating system usually consists of listing |
||||
|
the capabilities of that operating system in a new '.h' file and |
||||
|
including this '.h' file in the standard portability sequence. This |
||||
|
also needs to be done separately for the numerical capabilities of the |
||||
|
system hardware (this consist of only two parameters at present). |
||||
|
|
||||
|
For each operating system there is a file in the "include/" directory |
||||
|
named "os_xxx.h", where xxx identifies the given operating system (ex. |
||||
|
"os_bsd.h", "os_aix.h"). These files are selectively #include-d by |
||||
|
"include/port.h". For a new operating system, you should add the |
||||
|
appropriate "#include" line to "include/port.h". Be sure to guard |
||||
|
the new "#include" line with "#ifdef/#endif", as is done with the other |
||||
|
operating system capability files. The same may also need to be done |
||||
|
for your hardware (for the file "hw_xxx.h"), though there is typically |
||||
|
very little difference in hardware. |
||||
|
|
||||
|
Note that operating system which are a derivative of another supported |
||||
|
system can '#include' the "os_xxx.h" file from the other system. For |
||||
|
example, "os_aix.h" includes "os_sysv.h", which in turn includes |
||||
|
"os_unix.h". |
||||
|
|
||||
|
The entries that can go into a "os_xxx.h" file are described below; |
||||
|
most are simple flags (e.g. HAS_xxxx). To turn on a flag, insert the |
||||
|
"#define" line for that flag; to turn off the flag, simply leave the |
||||
|
"#define" line out. Other entries are strings, others single-quoted |
||||
|
characters or numbers. Be sure to use the same type as the example |
||||
|
values shown. |
||||
|
|
||||
|
There are always exceptions to the rule. Some incompatibilities |
||||
|
have not yet been dealt with cleanly; review the other "os_xxx.h" |
||||
|
files, the file "capabil.h", and the file "suffix.h" to understand |
||||
|
how some problems have been handled (note especially the lines like |
||||
|
"#define index strchr"). After trying to compile, you may yet find |
||||
|
non-portable code that is not guarded by one of the following |
||||
|
options. You are encouraged to alter the source code (".c" or ".h" |
||||
|
files) in the style of the current portability scheme. |
||||
|
|
||||
|
Note: to enable X11 or MFB, the flag AVAIL_X11 or AVAIL_MFB, |
||||
|
respectively, must be included in the "os_xxx.h" file; this _was_ to |
||||
|
simplify the problems of forgetting to re-edit the "config.h" file, |
||||
|
but this is no longer necessary. |
||||
|
|
||||
|
---------- Machine architecture numerics (hw_xxx.h) parameters: |
||||
|
(In the future this will be more complete and will be used for |
||||
|
tuning the accuracy or performance of the numerical algorithms) |
||||
|
|
||||
|
#define HAS_VAX_FPERRORS /* Only for Vax */ |
||||
|
#define MAXPOSINT 4294967295 /* == 2^32 - 1, maximum positive integer */ |
||||
|
#define MAX_EXP_ARG 87.0 /* Approximate largest arg to exp() */ |
||||
|
|
||||
|
---------- Operating System (os_xxx.h) parameters: |
||||
|
|
||||
|
----- Enabling flags |
||||
|
#define AVAIL_MFB /* If the MFB package can work on this system */ |
||||
|
#define AVAIL_X11 /* If the X11 Window System can work */ |
||||
|
|
||||
|
----- String or character constants |
||||
|
#define DIR_CWD "." /* Current working directory */ |
||||
|
#define DIR_PATHSEP "/" /* subdirectory separator */ |
||||
|
#define DIR_TERM '/' /* Subdirectory component terminator */ |
||||
|
|
||||
|
----- sprintf( ) format strings |
||||
|
#define TEMPFORMAT "/tmp/%s%d" /* sprintf format for creating temp files */ |
||||
|
#define SYSTEM_MAIL "mail -s \"%s (%s) Bug Report\" %s" /* mail command */ |
||||
|
#define SYSTEM_PLOT5LPR "lpr -P%s -g %s" /* For printing Unix plot(5) files */ |
||||
|
#define SYSTEM_PSLPR "lpr -P%s %s" /* For printing postscript files */ |
||||
|
|
||||
|
----- System capabilities |
||||
|
#define HAS_ACCESS /* access( ) */ |
||||
|
#define HAS_ASCII /* eighth bit of a character is not used */ |
||||
|
#define HAS_ATRIGH /* acosh( ), asinh( ), atanh( ) */ |
||||
|
#define HAS_BCOPY /* bcopy( ), bzero( ) */ |
||||
|
#define HAS_BSDDIRS /* <sys/dir.h> */ |
||||
|
#define HAS_BSDRANDOM /* srandom( ) and random( ) */ |
||||
|
#define HAS_BSDRLIMIT /* getrlimit( ) returns proc limits */ |
||||
|
#define HAS_BSDRUSAGE /* getrusage( ) returns cpu usage */ |
||||
|
#define HAS_BSDSOCKETS /* <net/inet.h>, socket( ), etc. */ |
||||
|
#define HAS_BSDTIME /* gettimeofday( ) return time */ |
||||
|
#define HAS_BSDTTY /* <sgtty.h> */ |
||||
|
#define HAS_CHDIR /* for tree filesystems, chdir( ) */ |
||||
|
#define HAS_CLEARERR /* clearerr( ), should be in stdio */ |
||||
|
#define HAS_CTYPE /* <ctype.h>, iswhite( ), etc. */ |
||||
|
#define HAS_DOSDIRS /* Emulate opendir, etc. */ |
||||
|
#define HAS_DUP2 /* dup2(a, b) for shifting file descrs. */ |
||||
|
#define HAS_ENVIRON /* getenv( ) */ |
||||
|
#define HAS_EXIT1 /* If exit status of 1 is normal for procs */ |
||||
|
#define HAS_FCNTL /* acosh( ), asinh( ), atanh( ) */ |
||||
|
#define HAS_FTIME /* ftime( ), <times.h> */ |
||||
|
#define HAS_GETCWD /* getcwd(buf, size) */ |
||||
|
#define HAS_GETPID /* getpid( ) to identify processes */ |
||||
|
#define HAS_GETPW /* getpwuid( ), etc. */ |
||||
|
#define HAS_GETWD /* getwd(buf) */ |
||||
|
#define HAS_INDEX /* index( ) instead of strchr( ) */ |
||||
|
#define HAS_NO_IEEE_LOGB /* no logb( ) and scalb( ) functions */ |
||||
|
#define HAS_NO_IEEE_LOGB_DECL /* logb( ) and scalb( ) not in math.h */ |
||||
|
#define HAS_ISATTY /* isatty( ) */ |
||||
|
#define HAS_LONGJUMP /* setjmp( ), longjmp( ) */ |
||||
|
#define HAS_MINDATA /* Machine has limited data area */ |
||||
|
#define HAS_NOINLINE /* Machine has limited data area */ |
||||
|
#define HAS_NOVM /* Machine has limited data area */ |
||||
|
#define HAS_NO_ATRIGH_DECL /* if asinh( ) is not in math.h */ |
||||
|
#define HAS_PCTERM /* For MS-DOS, use PC graphics for MFB */ |
||||
|
#define HAS_POPEN /* popen( ), pipe through shell command */ |
||||
|
#define HAS_QSORT /* qsort( ) exists */ |
||||
|
#define HAS_SHORTMACRO /* If the compiler can't handle long macros */ |
||||
|
#define HAS_STAT /* stat( ) returns info on files */ |
||||
|
#define HAS_STDLIB /* #include <stdlib.h> for libc defs */ |
||||
|
#define HAS_STRCHR /* strchr( ) instead of index( ) */ |
||||
|
#define HAS_STRINGS /* #include <strings.h> (else <string.h>) */ |
||||
|
#define HAS_SYSTEM /* system( ), execute system command */ |
||||
|
#define HAS_SYSVDIRS /* <dirent.h> */ |
||||
|
#define HAS_SYSVRLIMIT /* ulimit( ) reports on proc size limit */ |
||||
|
#define HAS_SYSVRUSAGE /* utimes( ) reports on cpu usage */ |
||||
|
#define HAS_SYSVTIME /* time( ) returns seconds from 1970 */ |
||||
|
#define HAS_SYSVTTY /* <termio.h> */ |
||||
|
#define HAS_TERMCAP /* tgetxxx( ) */ |
||||
|
#define HAS_TERMREAD /* Has "read" syscall from terminals */ |
||||
|
#define HAS_UNIX_SIGS /* signal( ), kill( ) */ |
||||
|
#define HAS_UNLINK /* unlink( ), for removing files */ |
||||
|
#define HAS_VFORK /* BSD-ism, should not be necessary */ |
||||
|
#define HAS_VMSHACK /* Stand on your head for VMS */ |
||||
|
#define HAS_VPERROR /* perror( ) defined by standard '.h's */ |
||||
|
#define HAS_WAIT /* wait( ) wait for processes */ |
||||
@ -0,0 +1,15 @@ |
|||||
|
|
||||
|
Incompatibilities between spice3 and spice2 |
||||
|
|
||||
|
The output format of spice3 is slightly different for .print and .plot lines. |
||||
|
Most notably, different traces on plots are not scaled independently. This |
||||
|
is most noticeable on phase/magnitude plots from an AC analysis (also, |
||||
|
phase is displayed in radians). Finally, frequency for ".PRINT AC" lines |
||||
|
is displayed as a complex quantity with an all-zero imaginary component. |
||||
|
|
||||
|
For input, "POLY( )" sources are not supported (the non-linear dependent |
||||
|
source provides a more general replacement). Also, the ".ALTER" line |
||||
|
is not supported. The Spice3 parser may be slightly different |
||||
|
on subtle points of reading input (lines need not start at column 1 |
||||
|
for instance). |
||||
|
|
||||
@ -0,0 +1,97 @@ |
|||||
|
2000-04-04 Paolo Nenzi <p.nenzi@ieee.org> |
||||
|
|
||||
|
* ngspice.c: Added support for BSIM4. |
||||
|
|
||||
|
* Makefile.am: Added support for bsim4 shared library. |
||||
|
|
||||
|
2000-01-14 Paolo Nenzi <p.nenzi@ieee.org> |
||||
|
|
||||
|
* conf.c: inserted definitions for bsim3v2 and bsim3v1 devices. |
||||
|
It is necessary to include old models for commercially available |
||||
|
components libraries. |
||||
|
|
||||
|
1999-12-01 Emmanuel Rouat <emmanuel.rouat@wanadoo.fr> |
||||
|
|
||||
|
* source code: created new directory 'frontend' mainly filled with |
||||
|
files from 'fte' - remaing files go into maths/cmaths (complex maths |
||||
|
routines) |
||||
|
|
||||
|
1999-11-30 Emmanuel Rouat <emmanuel.rouat@wanadoo.fr> |
||||
|
|
||||
|
* tune.c: removed |
||||
|
|
||||
|
* conf.c/nconf.c : simplified |
||||
|
|
||||
|
1999-09-07 Arno <A.W.Peters@ieee.org> |
||||
|
|
||||
|
* conf.c: removed unused variables `devs' and `ans' |
||||
|
|
||||
|
* help.c: return value from main() changed to int |
||||
|
|
||||
|
1999-09-04 Emmanuel Rouat <emmanuel.rouat@wanadoo.fr> |
||||
|
|
||||
|
* main.c: removed #include patchlec.h and suffix.h (and related code) |
||||
|
|
||||
|
* Makefile.am: updated to reflect filename changes in fte/ |
||||
|
|
||||
|
1999-08-31 Emmanuel Rouat <emmanuel.rouat@wanadoo.fr> |
||||
|
|
||||
|
* help.c: renamed helpfile 'ngspice' |
||||
|
|
||||
|
* main.c: renamed helpfile 'ngspice' |
||||
|
|
||||
|
1999-08-28 Emmanuel Rouat <emmanuel.rouat@wanadoo.fr> |
||||
|
|
||||
|
* Removed all #includes of misc.h and util.h (now in spice.h) |
||||
|
|
||||
|
1999-08-24 Paolo Nenzi <pnenzi@ieee.ing.uniroma1.it> |
||||
|
|
||||
|
* conf.c: linked the jfet2 model to the devices table. |
||||
|
|
||||
|
1999-08-08 Emmanuel Rouat <emmanuel.rouat@wanadoo.fr> |
||||
|
|
||||
|
* makeidx.c: removed HAS_MAC_ARCARGV related code |
||||
|
|
||||
|
* main.c: removed all code related to dos and macos features |
||||
|
|
||||
|
1999-08-06 Emmanuel Rouat <emmanuel.rouat@wanadoo.fr> |
||||
|
|
||||
|
* proc2mod.c: removed test on HAS_VPERROR (always true on Unix) |
||||
|
|
||||
|
* main.c (main): changed HAS_ISATTY in HAVE_ISATTY |
||||
|
(main): removed test on HAS_LONGJUMP (always have it) |
||||
|
(main): removed test on HAS_UNIX_SIGS (always true on Unix) |
||||
|
(main): removed test on HAS_UNLINK (always true on Unix) |
||||
|
|
||||
|
1999-08-05 Emmanuel Rouat <emmanuel.rouat@wanadoo.fr> |
||||
|
|
||||
|
* main.c: changed HAS_GETPW in HAVE_PWD_H |
||||
|
(main): removed test on HAS_GETPID |
||||
|
|
||||
|
1999-08-02 Emmanuel Rouat <emmanuel.rouat@wanadoo.fr> |
||||
|
|
||||
|
* Makefile.am (LIBS): removed '-lm' since it is handled by autoconf |
||||
|
|
||||
|
1999-08-01 Emmanuel Rouat <emmanuel.rouat@wanadoo.fr> |
||||
|
|
||||
|
* conf.c: changed SIMinfo entry to 'ngspice' |
||||
|
|
||||
|
* Makefile.am: changed binary name to ngspice |
||||
|
|
||||
|
1999-07-31 Emmanuel Rouat <emmanuel.rouat@wanadoo.fr> |
||||
|
|
||||
|
* Makefile.am: added @X_CFLAGS@ to INCLUDES list |
||||
|
|
||||
|
1999-07-30 Emmanuel Rouat <emmanuel.rouat@wanadoo.fr> |
||||
|
|
||||
|
* Makefile.am : fixed breaking of 'make distcheck' |
||||
|
|
||||
|
29-07-1999 emmanuel.rouat@wanadoo.fr (Manu Rouat) |
||||
|
|
||||
|
* tune.c: includes <config.h> which defines SPICEBINDIR etc |
||||
|
|
||||
|
28-07-1999 emmanuel.rouat@wanadoo.fr (Manu Rouat) |
||||
|
|
||||
|
* help.c: Changed HAS_X11 define to X_DISPLAY_MISSING (supplied by |
||||
|
autoconf in config.h) |
||||
|
* removed HAS_X11 in defs flag in Makefile.am |
||||
@ -0,0 +1,162 @@ |
|||||
|
## Process this file with automake to produce Makefile.in
|
||||
|
|
||||
|
SUBDIRS = analysis circuit devices frontend hlp maths misc parser include |
||||
|
|
||||
|
bin_PROGRAMS = ngspice nutmeg help sconvert proc2mod multidec makeidx |
||||
|
|
||||
|
EXTRA_DIST = ngspice.txt ngspice.idx |
||||
|
|
||||
|
helpdatadir = $(pkgdatadir)/helpdir |
||||
|
|
||||
|
helpdata_DATA = ngspice.idx ngspice.txt |
||||
|
|
||||
|
|
||||
|
|
||||
|
DYNAMIC_DEVICELIBS = \
|
||||
|
devices/asrc/libasrc.la \
|
||||
|
devices/bjt/libbjt.la \
|
||||
|
devices/bsim1/libbsim1.la \
|
||||
|
devices/bsim2/libbsim2.la \
|
||||
|
devices/bsim3/libbsim3.la \
|
||||
|
devices/bsim4/libbsim4.la \
|
||||
|
devices/bsim3v1/libbsim3v1.la \
|
||||
|
devices/bsim3v2/libbsim3v2.la \
|
||||
|
devices/cap/libcap.la \
|
||||
|
devices/cccs/libcccs.la \
|
||||
|
devices/ccvs/libccvs.la \
|
||||
|
devices/csw/libcsw.la \
|
||||
|
devices/devsup/libdevsup.la \
|
||||
|
devices/dio/libdio.la \
|
||||
|
devices/disto/libdisto.la \
|
||||
|
devices/ind/libind.la \
|
||||
|
devices/isrc/libisrc.la \
|
||||
|
devices/jfet/libjfet.la \
|
||||
|
devices/jfet2/libjfet2.la \
|
||||
|
devices/ltra/libltra.la \
|
||||
|
devices/cccs/libcccs.la \
|
||||
|
devices/ccvs/libccvs.la \
|
||||
|
devices/csw/libcsw.la \
|
||||
|
devices/devsup/libdevsup.la \
|
||||
|
devices/dio/libdio.la \
|
||||
|
devices/disto/libdisto.la \
|
||||
|
devices/ind/libind.la \
|
||||
|
devices/isrc/libisrc.la \
|
||||
|
devices/jfet/libjfet.la \
|
||||
|
devices/jfet2/libjfet2.la \
|
||||
|
devices/ltra/libltra.la \
|
||||
|
devices/mes/libmes.la \
|
||||
|
devices/mos1/libmos1.la \
|
||||
|
devices/mos2/libmos2.la \
|
||||
|
devices/mos3/libmos3.la \
|
||||
|
devices/mos6/libmos6.la \
|
||||
|
devices/res/libres.la \
|
||||
|
devices/sw/libsw.la \
|
||||
|
devices/tra/libtra.la \
|
||||
|
devices/urc/liburc.la \
|
||||
|
devices/vccs/libvccs.la \
|
||||
|
devices/vcvs/libvcvs.la \
|
||||
|
devices/vsrc/libvsrc.la |
||||
|
|
||||
|
## Build ngspice first:
|
||||
|
|
||||
|
ngspice_SOURCES = \
|
||||
|
conf.c \
|
||||
|
conf.h \
|
||||
|
ngspice.c |
||||
|
|
||||
|
ngspice_LDADD = \
|
||||
|
spice.o \
|
||||
|
frontend/libfte.a \
|
||||
|
$(DYNAMIC_DEVICELIBS) \
|
||||
|
analysis/libckt.a \
|
||||
|
parser/libparser.a \
|
||||
|
hlp/libhlp.a \
|
||||
|
circuit/libinp.a \
|
||||
|
maths/cmaths/libcmaths.a \
|
||||
|
maths/ni/libni.a \
|
||||
|
maths/sparse/libsparse.a \
|
||||
|
misc/libmisc.a |
||||
|
|
||||
|
|
||||
|
spice.o: main.c |
||||
|
$(COMPILE) -DSIMULATOR -o spice.o -c $(srcdir)/main.c |
||||
|
|
||||
|
## nutmeg:
|
||||
|
|
||||
|
nutmeg_SOURCES = \
|
||||
|
main.c \
|
||||
|
conf.c \
|
||||
|
conf.h \
|
||||
|
nutmeg.c |
||||
|
|
||||
|
nutmeg_LDADD = \
|
||||
|
frontend/libfte.a \
|
||||
|
parser/libparser.a \
|
||||
|
hlp/libhlp.a \
|
||||
|
maths/cmaths/libcmaths.a \
|
||||
|
misc/libmisc.a |
||||
|
|
||||
|
|
||||
|
|
||||
|
## help:
|
||||
|
|
||||
|
help_SOURCES = help.c |
||||
|
|
||||
|
help_LDADD = \
|
||||
|
hlp/libhlp.a \
|
||||
|
parser/libparser.a \
|
||||
|
misc/libmisc.a |
||||
|
|
||||
|
|
||||
|
## sconvert:
|
||||
|
|
||||
|
sconvert_SOURCES = sconvert.c |
||||
|
|
||||
|
|
||||
|
|
||||
|
sconvert_LDADD = \
|
||||
|
frontend/libfte.a \
|
||||
|
parser/libparser.a \
|
||||
|
misc/libmisc.a |
||||
|
|
||||
|
|
||||
|
## proc2mod:
|
||||
|
|
||||
|
proc2mod_SOURCES = proc2mod.c |
||||
|
|
||||
|
proc2mod_LDADD = \
|
||||
|
parser/libparser.a \
|
||||
|
circuit/libinp.a \
|
||||
|
misc/libmisc.a |
||||
|
|
||||
|
|
||||
|
|
||||
|
## multidec:
|
||||
|
|
||||
|
multidec_SOURCES = multidec.c |
||||
|
|
||||
|
multidec_LDADD = \
|
||||
|
maths/sparse/libsparse.a \
|
||||
|
misc/libmisc.a |
||||
|
|
||||
|
## makeidx:
|
||||
|
|
||||
|
makeidx_SOURCES = makeidx.c |
||||
|
|
||||
|
makeidx_LDADD = \
|
||||
|
misc/libmisc.a |
||||
|
|
||||
|
## create index for online help:
|
||||
|
|
||||
|
all: |
||||
|
./makeidx $(srcdir)/ngspice.txt |
||||
|
|
||||
|
|
||||
|
## General Includes and libraries:
|
||||
|
|
||||
|
|
||||
|
INCLUDES = -I$(top_srcdir)/src/include -I$(top_srcdir)/src/devices @X_CFLAGS@ |
||||
|
|
||||
|
LIBS = @LIBS@ @X_LIBS@ @X_PRE_LIBS@ @X_EXTRA_LIBS@ |
||||
|
|
||||
|
MAINTAINERCLEANFILES = Makefile.in |
||||
@ -0,0 +1,60 @@ |
|||||
|
2000-04-04 Paolo Nenzi <p.nenzi@ieee.or |
||||
|
|
||||
|
* noisean.c: Merged the previous code with the new one included in |
||||
|
bsim4 distribution. This code originated from Weidong Lu |
||||
|
(bsim group). |
||||
|
|
||||
|
1999-12-20 Paolo Nenzi <p.nenzi@ieee.org> |
||||
|
|
||||
|
* noisean.c: |
||||
|
Bug: he ac noise analysis in Spice3f4 has a serious bug. In interactive mode, |
||||
|
it fails to reproduce frequency dependence known to exist. In batch (Spice2) |
||||
|
mode, it works only if a corresponding ac analysis has been run first. |
||||
|
Fix: This bug is fixed by providing a call to CKTload() in noisean.c as shown |
||||
|
by the source code patch which is attached below. |
||||
|
|
||||
|
|
||||
|
1999-09-08 Emmanuel Rouat <emmanuel.rouat@wanadoo.fr> |
||||
|
|
||||
|
* ckt.h: created (and included in Makefile.am) |
||||
|
|
||||
|
1999-09-07 Arno <A.W.Peters@ieee.org> |
||||
|
|
||||
|
* cktpzstr.c: reformatted and corrected(?) complex if condition. |
||||
|
|
||||
|
1999-08-28 Emmanuel Rouat <emmanuel.rouat@wanadoo.fr> |
||||
|
|
||||
|
* Removed all #includes of misc.h and util.h (now in spice.h) |
||||
|
|
||||
|
1999-08-27 Paolo Nenzi <pnenzi@ieee.ing.uniroma1.it> |
||||
|
|
||||
|
* Removed GENERIC and #include "suffix.h" from all the files. |
||||
|
GENERIC has been replaced by void. ANSIfied all functions with |
||||
|
protoize. |
||||
|
|
||||
|
1999-08-26 Paolo Nenzi <pnenzi@ieee.ing.uniroma1.it> |
||||
|
|
||||
|
* cktacct.c: added #include "spmatrix.h" to avoid implicit declaration |
||||
|
warning at compile time. |
||||
|
|
||||
|
* dctran.c: ansified and substituted void with void. |
||||
|
* tranasq.c: same as before. |
||||
|
* traninit.c: same as before. |
||||
|
* transetp.c: same as before. |
||||
|
|
||||
|
|
||||
|
1999-08-08 Emmanuel Rouat <emmanuel.rouat@wanadoo.fr> |
||||
|
|
||||
|
* Removed all HAS_SHORTMACRO and HAS_FLATINCLUDES code in directory |
||||
|
|
||||
|
* cktdest.c (and other files): changed HAS_SENSE2 in WANT_SENSE2 |
||||
|
|
||||
|
1999-08-04 Paolo Nenzi <pnenzi@ieee.ing.uniroma1.it> |
||||
|
|
||||
|
* changed dctrcurv.c: added code for temperature sweeps and |
||||
|
resistance sweeps. Now you can execute .dc temp <start> <stop> |
||||
|
<increment> to do a temp sweep, temp is the keyword for temp |
||||
|
sweeps (The code comes from a patch supplied by Serban-Mihai |
||||
|
Popescu <serbanp@ix.netcom.com>. To do a resitance sweep just |
||||
|
insert resistor name to the .cd line:.dc vin -5 5 1 rin 100 1000 10. |
||||
|
Resistance and temperature sweeps can be nested. |
||||
@ -0,0 +1,106 @@ |
|||||
|
## Process this file with automake to produce Makefile.in
|
||||
|
|
||||
|
noinst_LIBRARIES = libckt.a |
||||
|
|
||||
|
libckt_a_SOURCES = \
|
||||
|
acan.c \
|
||||
|
acaskq.c \
|
||||
|
acsetp.c \
|
||||
|
cktaccpt.c \
|
||||
|
cktacct.c \
|
||||
|
cktacdum.c \
|
||||
|
cktask.c \
|
||||
|
cktaskaq.c \
|
||||
|
cktasknq.c \
|
||||
|
cktbindn.c \
|
||||
|
cktbkdum.c \
|
||||
|
cktclrbk.c \
|
||||
|
cktcrte.c \
|
||||
|
cktdelt.c \
|
||||
|
cktdest.c \
|
||||
|
cktdisto.c \
|
||||
|
cktdlti.c \
|
||||
|
cktdltm.c \
|
||||
|
cktdltn.c \
|
||||
|
cktdojob.c \
|
||||
|
cktdump.c \
|
||||
|
cktfbran.c \
|
||||
|
cktfdev.c \
|
||||
|
cktfnda.c \
|
||||
|
cktfndm.c \
|
||||
|
cktfnode.c \
|
||||
|
cktftask.c \
|
||||
|
cktgrnd.c \
|
||||
|
ckti2nod.c \
|
||||
|
cktic.c \
|
||||
|
cktinit.c \
|
||||
|
cktlnkeq.c \
|
||||
|
cktload.c \
|
||||
|
cktmapn.c \
|
||||
|
cktmask.c \
|
||||
|
cktmcrt.c \
|
||||
|
cktmkcur.c \
|
||||
|
cktmknod.c \
|
||||
|
cktmkvol.c \
|
||||
|
cktmpar.c \
|
||||
|
cktnames.c \
|
||||
|
cktnewan.c \
|
||||
|
cktneweq.c \
|
||||
|
cktnewn.c \
|
||||
|
cktnodn.c \
|
||||
|
cktnoise.c \
|
||||
|
cktntask.c \
|
||||
|
cktnum2n.c \
|
||||
|
cktop.c \
|
||||
|
cktparam.c \
|
||||
|
cktpartn.c \
|
||||
|
cktpmnam.c \
|
||||
|
cktpname.c \
|
||||
|
cktpzld.c \
|
||||
|
cktpzset.c \
|
||||
|
cktpzstr.c \
|
||||
|
cktsens.c \
|
||||
|
cktsetap.c \
|
||||
|
cktsetbk.c \
|
||||
|
cktsetnp.c \
|
||||
|
cktsetup.c \
|
||||
|
cktsgen.c \
|
||||
|
cktsopt.c \
|
||||
|
ckttemp.c \
|
||||
|
cktterr.c \
|
||||
|
ckttroub.c \
|
||||
|
ckttrunc.c \
|
||||
|
ckttyplk.c \
|
||||
|
daskq.c \
|
||||
|
dcoaskq.c \
|
||||
|
dcop.c \
|
||||
|
dcosetp.c \
|
||||
|
dctaskq.c \
|
||||
|
dctran.c \
|
||||
|
dctrcurv.c \
|
||||
|
dctsetp.c \
|
||||
|
distoan.c \
|
||||
|
dkerproc.c \
|
||||
|
dloadfns.c \
|
||||
|
dsetparm.c \
|
||||
|
naskq.c \
|
||||
|
nevalsrc.c \
|
||||
|
ninteg.c \
|
||||
|
noisean.c \
|
||||
|
nsetparm.c \
|
||||
|
pzan.c \
|
||||
|
pzaskq.c \
|
||||
|
pzsetp.c \
|
||||
|
sensaskq.c \
|
||||
|
senssetp.c \
|
||||
|
tfanal.c \
|
||||
|
tfaskq.c \
|
||||
|
tfsetp.c \
|
||||
|
tranaskq.c \
|
||||
|
traninit.c \
|
||||
|
transetp.c \
|
||||
|
ckt.h |
||||
|
|
||||
|
|
||||
|
INCLUDES = -I$(top_srcdir)/src/include -I$(top_srcdir)/src/devices |
||||
|
MAINTAINERCLEANFILES = Makefile.in |
||||
@ -0,0 +1,277 @@ |
|||||
|
/********** |
||||
|
Copyright 1990 Regents of the University of California. All rights reserved. |
||||
|
Author: 1985 Thomas L. Quarles |
||||
|
**********/ |
||||
|
|
||||
|
#include "ngspice.h" |
||||
|
#include <stdio.h> |
||||
|
#include "cktdefs.h" |
||||
|
#include "acdefs.h" |
||||
|
#include "devdefs.h" |
||||
|
#include "sperror.h" |
||||
|
|
||||
|
|
||||
|
int |
||||
|
ACan(CKTcircuit *ckt, int restart) |
||||
|
{ |
||||
|
|
||||
|
double freq; |
||||
|
double freqTol; /* tolerence parameter for finding final frequency */ |
||||
|
double startdTime; |
||||
|
double startsTime; |
||||
|
double startlTime; |
||||
|
double startcTime; |
||||
|
double startkTime; |
||||
|
double startTime; |
||||
|
int error; |
||||
|
int numNames; |
||||
|
IFuid *nameList; |
||||
|
IFuid freqUid; |
||||
|
static void *acPlot; |
||||
|
void *plot; |
||||
|
|
||||
|
if(((ACAN*)ckt->CKTcurJob)->ACsaveFreq == 0 || restart) { |
||||
|
/* start at beginning */ |
||||
|
|
||||
|
if (((ACAN*)ckt->CKTcurJob)->ACnumberSteps < 1) |
||||
|
((ACAN*)ckt->CKTcurJob)->ACnumberSteps = 1; |
||||
|
|
||||
|
switch(((ACAN*)ckt->CKTcurJob)->ACstepType) { |
||||
|
|
||||
|
case DECADE: |
||||
|
((ACAN*)ckt->CKTcurJob)->ACfreqDelta = |
||||
|
exp(log(10.0)/((ACAN*)ckt->CKTcurJob)->ACnumberSteps); |
||||
|
break; |
||||
|
case OCTAVE: |
||||
|
((ACAN*)ckt->CKTcurJob)->ACfreqDelta = |
||||
|
exp(log(2.0)/((ACAN*)ckt->CKTcurJob)->ACnumberSteps); |
||||
|
break; |
||||
|
case LINEAR: |
||||
|
if (((ACAN*)ckt->CKTcurJob)->ACnumberSteps-1 > 1) |
||||
|
((ACAN*)ckt->CKTcurJob)->ACfreqDelta = |
||||
|
(((ACAN*)ckt->CKTcurJob)->ACstopFreq - |
||||
|
((ACAN*)ckt->CKTcurJob)->ACstartFreq)/ |
||||
|
(((ACAN*)ckt->CKTcurJob)->ACnumberSteps-1); |
||||
|
else |
||||
|
((ACAN*)ckt->CKTcurJob)->ACfreqDelta = HUGE; |
||||
|
break; |
||||
|
default: |
||||
|
return(E_BADPARM); |
||||
|
} |
||||
|
error = CKTop(ckt, |
||||
|
(ckt->CKTmode & MODEUIC) | MODEDCOP | MODEINITJCT, |
||||
|
(ckt->CKTmode & MODEUIC) | MODEDCOP | MODEINITFLOAT, |
||||
|
ckt->CKTdcMaxIter); |
||||
|
if(error) return(error); |
||||
|
|
||||
|
ckt->CKTmode = (ckt->CKTmode & MODEUIC) | MODEDCOP | MODEINITSMSIG; |
||||
|
error = CKTload(ckt); |
||||
|
if(error) return(error); |
||||
|
|
||||
|
error = CKTnames(ckt,&numNames,&nameList); |
||||
|
if(error) return(error); |
||||
|
|
||||
|
if (ckt->CKTkeepOpInfo) { |
||||
|
/* Dump operating point. */ |
||||
|
error = (*(SPfrontEnd->OUTpBeginPlot))((void *)ckt, |
||||
|
(void*)ckt->CKTcurJob, "AC Operating Point", |
||||
|
(IFuid)NULL,IF_REAL,numNames,nameList, IF_REAL,&plot); |
||||
|
if(error) return(error); |
||||
|
CKTdump(ckt,(double)0,plot); |
||||
|
(*(SPfrontEnd->OUTendPlot))(plot); |
||||
|
} |
||||
|
|
||||
|
(*(SPfrontEnd->IFnewUid))((void *)ckt,&freqUid,(IFuid)NULL, |
||||
|
"frequency", UID_OTHER,(void **)NULL); |
||||
|
error = (*(SPfrontEnd->OUTpBeginPlot))((void *)ckt, |
||||
|
(void*)ckt->CKTcurJob, |
||||
|
ckt->CKTcurJob->JOBname,freqUid,IF_REAL,numNames,nameList, |
||||
|
IF_COMPLEX,&acPlot); |
||||
|
if(error) return(error); |
||||
|
|
||||
|
if (((ACAN*)ckt->CKTcurJob)->ACstepType != LINEAR) { |
||||
|
(*(SPfrontEnd->OUTattributes))((void *)acPlot,NULL, |
||||
|
OUT_SCALE_LOG, NULL); |
||||
|
} |
||||
|
freq = ((ACAN*)ckt->CKTcurJob)->ACstartFreq; |
||||
|
|
||||
|
} else { /* continue previous analysis */ |
||||
|
freq = ((ACAN*)ckt->CKTcurJob)->ACsaveFreq; |
||||
|
((ACAN*)ckt->CKTcurJob)->ACsaveFreq = 0; /* clear the 'old' frequency */ |
||||
|
} |
||||
|
switch(((ACAN*)ckt->CKTcurJob)->ACstepType) { |
||||
|
case DECADE: |
||||
|
case OCTAVE: |
||||
|
freqTol = ((ACAN*)ckt->CKTcurJob)->ACfreqDelta * |
||||
|
((ACAN*)ckt->CKTcurJob)->ACstopFreq * ckt->CKTreltol; |
||||
|
break; |
||||
|
case LINEAR: |
||||
|
freqTol = ((ACAN*)ckt->CKTcurJob)->ACfreqDelta * ckt->CKTreltol; |
||||
|
break; |
||||
|
default: |
||||
|
return(E_BADPARM); |
||||
|
} |
||||
|
|
||||
|
startTime = SPfrontEnd->IFseconds(); |
||||
|
startdTime = ckt->CKTstat->STATdecompTime; |
||||
|
startsTime = ckt->CKTstat->STATsolveTime; |
||||
|
startlTime = ckt->CKTstat->STATloadTime; |
||||
|
startcTime = ckt->CKTstat->STATcombineTime; |
||||
|
startkTime = ckt->CKTstat->STATsyncTime; |
||||
|
while(freq <= ((ACAN*)ckt->CKTcurJob)->ACstopFreq+freqTol) { |
||||
|
|
||||
|
if( (*(SPfrontEnd->IFpauseTest))() ) { |
||||
|
/* user asked us to pause via an interrupt */ |
||||
|
((ACAN*)ckt->CKTcurJob)->ACsaveFreq = freq; |
||||
|
return(E_PAUSE); |
||||
|
} |
||||
|
ckt->CKTomega = 2.0 * M_PI *freq; |
||||
|
ckt->CKTmode = (ckt->CKTmode&MODEUIC) | MODEAC; |
||||
|
|
||||
|
error = NIacIter(ckt); |
||||
|
if (error) { |
||||
|
ckt->CKTcurrentAnalysis = DOING_AC; |
||||
|
ckt->CKTstat->STATacTime += SPfrontEnd->IFseconds() - startTime; |
||||
|
ckt->CKTstat->STATacDecompTime += ckt->CKTstat->STATdecompTime - |
||||
|
startdTime; |
||||
|
ckt->CKTstat->STATacSolveTime += ckt->CKTstat->STATsolveTime - |
||||
|
startsTime; |
||||
|
ckt->CKTstat->STATacLoadTime += ckt->CKTstat->STATloadTime - |
||||
|
startlTime; |
||||
|
ckt->CKTstat->STATacCombTime += ckt->CKTstat->STATcombineTime - |
||||
|
startcTime; |
||||
|
ckt->CKTstat->STATacSyncTime += ckt->CKTstat->STATsyncTime - |
||||
|
startkTime; |
||||
|
return(error); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
|
||||
|
#ifdef WANT_SENSE2 |
||||
|
if(ckt->CKTsenInfo && (ckt->CKTsenInfo->SENmode&ACSEN) ){ |
||||
|
|
||||
|
save = ckt->CKTmode; |
||||
|
ckt->CKTmode=(ckt->CKTmode&MODEUIC)|MODEDCOP|MODEINITSMSIG; |
||||
|
save1 = ckt->CKTsenInfo->SENmode; |
||||
|
ckt->CKTsenInfo->SENmode = ACSEN; |
||||
|
if(freq == ((ACAN*)ckt->CKTcurJob)->ACstartFreq){ |
||||
|
ckt->CKTsenInfo->SENacpertflag = 1; |
||||
|
} |
||||
|
else{ |
||||
|
ckt->CKTsenInfo->SENacpertflag = 0; |
||||
|
} |
||||
|
if(error = CKTsenAC(ckt)) return (error); |
||||
|
ckt->CKTmode = save; |
||||
|
ckt->CKTsenInfo->SENmode = save1; |
||||
|
} |
||||
|
#endif |
||||
|
|
||||
|
error = CKTacDump(ckt,freq,acPlot); |
||||
|
if (error) { |
||||
|
ckt->CKTcurrentAnalysis = DOING_AC; |
||||
|
ckt->CKTstat->STATacTime += SPfrontEnd->IFseconds() - startTime; |
||||
|
ckt->CKTstat->STATacDecompTime += ckt->CKTstat->STATdecompTime - |
||||
|
startdTime; |
||||
|
ckt->CKTstat->STATacSolveTime += ckt->CKTstat->STATsolveTime - |
||||
|
startsTime; |
||||
|
ckt->CKTstat->STATacLoadTime += ckt->CKTstat->STATloadTime - |
||||
|
startlTime; |
||||
|
ckt->CKTstat->STATacCombTime += ckt->CKTstat->STATcombineTime - |
||||
|
startcTime; |
||||
|
ckt->CKTstat->STATacSyncTime += ckt->CKTstat->STATsyncTime - |
||||
|
startkTime; |
||||
|
return(error); |
||||
|
} |
||||
|
|
||||
|
/* increment frequency */ |
||||
|
|
||||
|
switch(((ACAN*)ckt->CKTcurJob)->ACstepType) { |
||||
|
case DECADE: |
||||
|
case OCTAVE: |
||||
|
freq *= ((ACAN*)ckt->CKTcurJob)->ACfreqDelta; |
||||
|
if(((ACAN*)ckt->CKTcurJob)->ACfreqDelta==1) goto endsweep; |
||||
|
break; |
||||
|
case LINEAR: |
||||
|
freq += ((ACAN*)ckt->CKTcurJob)->ACfreqDelta; |
||||
|
if(((ACAN*)ckt->CKTcurJob)->ACfreqDelta==0) goto endsweep; |
||||
|
break; |
||||
|
default: |
||||
|
return(E_INTERN); |
||||
|
} |
||||
|
} |
||||
|
endsweep: |
||||
|
(*(SPfrontEnd->OUTendPlot))(acPlot); |
||||
|
ckt->CKTcurrentAnalysis = 0; |
||||
|
ckt->CKTstat->STATacTime += SPfrontEnd->IFseconds() - startTime; |
||||
|
ckt->CKTstat->STATacDecompTime += ckt->CKTstat->STATdecompTime - |
||||
|
startdTime; |
||||
|
ckt->CKTstat->STATacSolveTime += ckt->CKTstat->STATsolveTime - |
||||
|
startsTime; |
||||
|
ckt->CKTstat->STATacLoadTime += ckt->CKTstat->STATloadTime - |
||||
|
startlTime; |
||||
|
ckt->CKTstat->STATacCombTime += ckt->CKTstat->STATcombineTime - |
||||
|
startcTime; |
||||
|
ckt->CKTstat->STATacSyncTime += ckt->CKTstat->STATsyncTime - |
||||
|
startkTime; |
||||
|
return(0); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
/* CKTacLoad(ckt) |
||||
|
* this is a driver program to iterate through all the various |
||||
|
* ac load functions provided for the circuit elements in the |
||||
|
* given circuit |
||||
|
*/ |
||||
|
|
||||
|
|
||||
|
int |
||||
|
CKTacLoad(register CKTcircuit *ckt) |
||||
|
{ |
||||
|
extern SPICEdev *DEVices[]; |
||||
|
register int i; |
||||
|
register int size; |
||||
|
int error; |
||||
|
#ifdef PARALLEL_ARCH |
||||
|
long type = MT_ACLOAD, length = 1; |
||||
|
#endif /* PARALLEL_ARCH */ |
||||
|
double startTime; |
||||
|
|
||||
|
startTime = SPfrontEnd->IFseconds(); |
||||
|
size = SMPmatSize(ckt->CKTmatrix); |
||||
|
for (i=0;i<=size;i++) { |
||||
|
*(ckt->CKTrhs+i)=0; |
||||
|
*(ckt->CKTirhs+i)=0; |
||||
|
} |
||||
|
SMPcClear(ckt->CKTmatrix); |
||||
|
|
||||
|
for (i=0;i<DEVmaxnum;i++) { |
||||
|
if ( ((*DEVices[i]).DEVacLoad != NULL) && (ckt->CKThead[i] != NULL) ){ |
||||
|
error = (*((*DEVices[i]).DEVacLoad))(ckt->CKThead[i],ckt); |
||||
|
#ifdef PARALLEL_ARCH |
||||
|
if (error) goto combine; |
||||
|
#else |
||||
|
if(error) return(error); |
||||
|
#endif /* PARALLEL_ARCH */ |
||||
|
} |
||||
|
} |
||||
|
#ifdef PARALLEL_ARCH |
||||
|
combine: |
||||
|
ckt->CKTstat->STATloadTime += SPfrontEnd->IFseconds() - startTime; |
||||
|
startTime = SPfrontEnd->IFseconds(); |
||||
|
/* See if any of the DEVload functions bailed. If not, proceed. */ |
||||
|
IGOP_( &type, &error, &length, "max" ); |
||||
|
ckt->CKTstat->STATsyncTime += SPfrontEnd->IFseconds() - startTime; |
||||
|
if (error == OK) { |
||||
|
startTime = SPfrontEnd->IFseconds(); |
||||
|
SMPcCombine( ckt->CKTmatrix, ckt->CKTrhs, ckt->CKTrhsSpare, |
||||
|
ckt->CKTirhs, ckt->CKTirhsSpare ); |
||||
|
ckt->CKTstat->STATcombineTime += SPfrontEnd->IFseconds() - startTime; |
||||
|
return(OK); |
||||
|
} else { |
||||
|
return(error); |
||||
|
} |
||||
|
#else |
||||
|
ckt->CKTstat->STATloadTime += SPfrontEnd->IFseconds() - startTime; |
||||
|
return(OK); |
||||
|
#endif /* PARALLEL_ARCH */ |
||||
|
} |
||||
@ -0,0 +1,63 @@ |
|||||
|
/********** |
||||
|
Copyright 1990 Regents of the University of California. All rights reserved. |
||||
|
Author: 1985 Thomas L. Quarles |
||||
|
**********/ |
||||
|
/* |
||||
|
*/ |
||||
|
|
||||
|
#include "ngspice.h" |
||||
|
#include <stdio.h> |
||||
|
#include "ifsim.h" |
||||
|
#include "iferrmsg.h" |
||||
|
#include "acdefs.h" |
||||
|
#include "cktdefs.h" |
||||
|
|
||||
|
|
||||
|
/* ARGSUSED */ |
||||
|
int |
||||
|
ACaskQuest(CKTcircuit *ckt, void *anal, int which, IFvalue *value) |
||||
|
{ |
||||
|
switch(which) { |
||||
|
|
||||
|
case AC_START: |
||||
|
value->rValue = ((ACAN*)anal)->ACstartFreq; |
||||
|
break; |
||||
|
|
||||
|
case AC_STOP: |
||||
|
value->rValue = ((ACAN*)anal)->ACstopFreq ; |
||||
|
break; |
||||
|
|
||||
|
case AC_STEPS: |
||||
|
value->iValue = ((ACAN*)anal)->ACnumberSteps; |
||||
|
break; |
||||
|
|
||||
|
case AC_DEC: |
||||
|
if(((ACAN*)anal)->ACstepType == DECADE) { |
||||
|
value->iValue=1; |
||||
|
} else { |
||||
|
value->iValue=0; |
||||
|
} |
||||
|
break; |
||||
|
|
||||
|
case AC_OCT: |
||||
|
if(((ACAN*)anal)->ACstepType == OCTAVE) { |
||||
|
value->iValue=1; |
||||
|
} else { |
||||
|
value->iValue=0; |
||||
|
} |
||||
|
break; |
||||
|
|
||||
|
case AC_LIN: |
||||
|
if(((ACAN*)anal)->ACstepType == LINEAR) { |
||||
|
value->iValue=1; |
||||
|
} else { |
||||
|
value->iValue=0; |
||||
|
} |
||||
|
break; |
||||
|
|
||||
|
default: |
||||
|
return(E_BADPARM); |
||||
|
} |
||||
|
return(OK); |
||||
|
} |
||||
|
|
||||
@ -0,0 +1,105 @@ |
|||||
|
/********** |
||||
|
Copyright 1990 Regents of the University of California. All rights reserved. |
||||
|
Author: 1985 Thomas L. Quarles |
||||
|
**********/ |
||||
|
|
||||
|
#include "ngspice.h" |
||||
|
#include <stdio.h> |
||||
|
#include "ifsim.h" |
||||
|
#include "iferrmsg.h" |
||||
|
#include "acdefs.h" |
||||
|
#include "cktdefs.h" |
||||
|
|
||||
|
|
||||
|
/* ARGSUSED */ |
||||
|
int |
||||
|
ACsetParm(CKTcircuit *ckt, void *anal, int which, IFvalue *value) |
||||
|
{ |
||||
|
switch(which) { |
||||
|
|
||||
|
case AC_START: |
||||
|
if (value->rValue <= 0.0) { |
||||
|
errMsg = copy("Frequency of 0 is invalid"); |
||||
|
((ACAN*)anal)->ACstartFreq = 1.0; |
||||
|
return(E_PARMVAL); |
||||
|
} |
||||
|
|
||||
|
((ACAN*)anal)->ACstartFreq = value->rValue; |
||||
|
break; |
||||
|
|
||||
|
case AC_STOP: |
||||
|
if (value->rValue <= 0.0) { |
||||
|
errMsg = copy("Frequency of 0 is invalid"); |
||||
|
((ACAN*)anal)->ACstartFreq = 1.0; |
||||
|
return(E_PARMVAL); |
||||
|
} |
||||
|
|
||||
|
((ACAN*)anal)->ACstopFreq = value->rValue; |
||||
|
break; |
||||
|
|
||||
|
case AC_STEPS: |
||||
|
((ACAN*)anal)->ACnumberSteps = value->iValue; |
||||
|
break; |
||||
|
|
||||
|
case AC_DEC: |
||||
|
if(value->iValue) { |
||||
|
((ACAN*)anal)->ACstepType = DECADE; |
||||
|
} else { |
||||
|
if( ((ACAN*)anal)->ACstepType == DECADE) { |
||||
|
((ACAN*)anal)->ACstepType = 0; |
||||
|
} |
||||
|
} |
||||
|
break; |
||||
|
|
||||
|
case AC_OCT: |
||||
|
if(value->iValue) { |
||||
|
((ACAN*)anal)->ACstepType = OCTAVE; |
||||
|
} else { |
||||
|
if( ((ACAN*)anal)->ACstepType == OCTAVE) { |
||||
|
((ACAN*)anal)->ACstepType = 0; |
||||
|
} |
||||
|
} |
||||
|
break; |
||||
|
|
||||
|
case AC_LIN: |
||||
|
if(value->iValue) { |
||||
|
((ACAN*)anal)->ACstepType = LINEAR; |
||||
|
} else { |
||||
|
if( ((ACAN*)anal)->ACstepType == LINEAR) { |
||||
|
((ACAN*)anal)->ACstepType = 0; |
||||
|
} |
||||
|
} |
||||
|
break; |
||||
|
|
||||
|
default: |
||||
|
return(E_BADPARM); |
||||
|
} |
||||
|
return(OK); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
static IFparm ACparms[] = { |
||||
|
{ "start", AC_START, IF_SET|IF_ASK|IF_REAL, "starting frequency" }, |
||||
|
{ "stop", AC_STOP, IF_SET|IF_ASK|IF_REAL, "ending frequency" }, |
||||
|
{ "numsteps", AC_STEPS,IF_SET|IF_ASK|IF_INTEGER, "number of frequencies"}, |
||||
|
{ "dec", AC_DEC, IF_SET|IF_FLAG, "step by decades" }, |
||||
|
{ "oct", AC_OCT, IF_SET|IF_FLAG, "step by octaves" }, |
||||
|
{ "lin", AC_LIN, IF_SET|IF_FLAG, "step linearly" } |
||||
|
}; |
||||
|
|
||||
|
SPICEanalysis ACinfo = { |
||||
|
{ |
||||
|
"AC", |
||||
|
"A.C. Small signal analysis", |
||||
|
|
||||
|
sizeof(ACparms)/sizeof(IFparm), |
||||
|
ACparms |
||||
|
}, |
||||
|
sizeof(ACAN), |
||||
|
FREQUENCYDOMAIN, |
||||
|
1, |
||||
|
ACsetParm, |
||||
|
ACaskQuest, |
||||
|
NULL, |
||||
|
ACan |
||||
|
}; |
||||
@ -0,0 +1,130 @@ |
|||||
|
/* |
||||
|
* Copyright (c) 1985 Thomas L. Quarles |
||||
|
* Modified 1999 Paolo Nenzi - Removed non STDC definitions |
||||
|
* Kept only prototypes (structs defined in struct.h) ER |
||||
|
*/ |
||||
|
|
||||
|
|
||||
|
#ifndef CKT_H_INCLUDED |
||||
|
#define CKT_H_INCLUDED |
||||
|
|
||||
|
|
||||
|
/* function prototypes */ |
||||
|
|
||||
|
int ACan( CKTcircuit *, int ); |
||||
|
int ACaskQuest( CKTcircuit *, void *, int , IFvalue *); |
||||
|
int ACsetParm( CKTcircuit *, void *, int , IFvalue *); |
||||
|
int CKTacDump( CKTcircuit *, double , void *); |
||||
|
int CKTacLoad( CKTcircuit *); |
||||
|
int CKTaccept( CKTcircuit *); |
||||
|
int CKTacct( CKTcircuit *, void *, int , IFvalue *); |
||||
|
int CKTask( void *, void *, int , IFvalue *, IFvalue *); |
||||
|
int CKTaskAnalQ( void *, void *, int , IFvalue *, IFvalue *); |
||||
|
int CKTaskNodQst( void *, void *, int , IFvalue *, IFvalue *); |
||||
|
int CKTbindNode( void *, void *, int , void *); |
||||
|
void CKTbreakDump( CKTcircuit *); |
||||
|
int CKTclrBreak( CKTcircuit *); |
||||
|
int CKTconvTest( CKTcircuit *); |
||||
|
int CKTcrtElt( void *, void *, void **, IFuid ); |
||||
|
int CKTdelTask( void *, void *); |
||||
|
int CKTdestroy( void *); |
||||
|
int CKTdltAnal( void *, void *, void *); |
||||
|
int CKTdltInst( void *, void *); |
||||
|
int CKTdltMod( void *, void *); |
||||
|
int CKTdltNod( void *, void *); |
||||
|
int CKTdoJob( void *, int , void *); |
||||
|
void CKTdump( CKTcircuit *, double, void *); |
||||
|
int CKTfndAnal( void *, int *, void **, IFuid , void *, IFuid ); |
||||
|
int CKTfndBranch( CKTcircuit *, IFuid); |
||||
|
int CKTfndDev( void *, int *, void **, IFuid , void *, IFuid ); |
||||
|
int CKTfndMod( void *, int *, void **, IFuid ); |
||||
|
int CKTfndNode( void *, void **, IFuid ); |
||||
|
int CKTfndTask( void *, void **, IFuid ); |
||||
|
int CKTground( void *, void **, IFuid ); |
||||
|
int CKTic( CKTcircuit *); |
||||
|
int CKTinit( void **); |
||||
|
int CKTinst2Node( void *, void *, int , void **, IFuid *); |
||||
|
int CKTlinkEq(CKTcircuit*,CKTnode*); |
||||
|
int CKTload( CKTcircuit *); |
||||
|
int CKTmapNode( void *, void **, IFuid ); |
||||
|
int CKTmkCur( CKTcircuit *, CKTnode **, IFuid , char *); |
||||
|
int CKTmkNode(CKTcircuit*,CKTnode**); |
||||
|
int CKTmkVolt( CKTcircuit *, CKTnode **, IFuid , char *); |
||||
|
int CKTmodAsk( void *, void *, int , IFvalue *, IFvalue *); |
||||
|
int CKTmodCrt( void *, int , void **, IFuid ); |
||||
|
int CKTmodParam( void *, void *, int , IFvalue *, IFvalue *); |
||||
|
int CKTnames(CKTcircuit *, int *, IFuid **); |
||||
|
int CKTnewAnal( void *, int , IFuid , void **, void *); |
||||
|
int CKTnewEq( void *, void **, IFuid ); |
||||
|
int CKTnewNode( void *, void **, IFuid ); |
||||
|
int CKTnewTask( void *, void **, IFuid ); |
||||
|
IFuid CKTnodName( CKTcircuit *, int ); |
||||
|
void CKTnodOut( CKTcircuit *); |
||||
|
CKTnode * CKTnum2nod( CKTcircuit *, int ); |
||||
|
int CKTop(CKTcircuit *, long, long, int ); |
||||
|
int CKTpModName( char *, IFvalue *, CKTcircuit *, int , IFuid , GENmodel **); |
||||
|
int CKTpName( char *, IFvalue *, CKTcircuit *, int , char *, GENinstance **); |
||||
|
int CKTparam( void *, void *, int , IFvalue *, IFvalue *); |
||||
|
int CKTpzFindZeros( CKTcircuit *, PZtrial **, int * ); |
||||
|
int CKTpzLoad( CKTcircuit *, SPcomplex * ); |
||||
|
int CKTpzSetup( CKTcircuit *, int); |
||||
|
int CKTsenAC( CKTcircuit *); |
||||
|
int CKTsenComp( CKTcircuit *); |
||||
|
int CKTsenDCtran( CKTcircuit *); |
||||
|
int CKTsenLoad( CKTcircuit *); |
||||
|
void CKTsenPrint( CKTcircuit *); |
||||
|
int CKTsenSetup( CKTcircuit *); |
||||
|
int CKTsenUpdate( CKTcircuit *); |
||||
|
int CKTsetAnalPm( void *, void *, int , IFvalue *, IFvalue *); |
||||
|
int CKTsetBreak( CKTcircuit *, double ); |
||||
|
int CKTsetNodPm( void *, void *, int , IFvalue *, IFvalue *); |
||||
|
int CKTsetOpt( void *, void *, int , IFvalue *); |
||||
|
int CKTsetup( CKTcircuit *); |
||||
|
int CKTunsetup(CKTcircuit *ckt); |
||||
|
int CKTtemp( CKTcircuit *); |
||||
|
char *CKTtrouble(void *, char *); |
||||
|
void CKTterr( int , CKTcircuit *, double *); |
||||
|
int CKTtrunc( CKTcircuit *, double *); |
||||
|
int CKTtypelook( char *); |
||||
|
int DCOaskQuest( CKTcircuit *, void *, int , IFvalue *); |
||||
|
int DCOsetParm( CKTcircuit *, void *, int , IFvalue *); |
||||
|
int DCTaskQuest( CKTcircuit *, void *, int , IFvalue *); |
||||
|
int DCTsetParm( CKTcircuit *, void *, int , IFvalue *); |
||||
|
int DCop( CKTcircuit *); |
||||
|
int DCtrCurv( CKTcircuit *, int ); |
||||
|
int DCtran( CKTcircuit *, int ); |
||||
|
int DISTOan(CKTcircuit *, int); |
||||
|
int NOISEan(CKTcircuit *, int); |
||||
|
int PZan( CKTcircuit *, int ); |
||||
|
int PZinit( CKTcircuit * ); |
||||
|
int PZpost( CKTcircuit * ); |
||||
|
int PZaskQuest( CKTcircuit *, void *, int , IFvalue *); |
||||
|
int PZsetParm( CKTcircuit *, void *, int , IFvalue *); |
||||
|
int SENaskQuest( CKTcircuit *, void *, int , IFvalue *); |
||||
|
void SENdestroy( SENstruct *); |
||||
|
int SENsetParm( CKTcircuit *, void *, int , IFvalue *); |
||||
|
int SENstartup( CKTcircuit *); |
||||
|
int SPIinit( IFfrontEnd *, IFsimulator **); |
||||
|
char * SPerror( int ); |
||||
|
int TFanal( CKTcircuit *, int ); |
||||
|
int TFaskQuest( CKTcircuit *, void *, int , IFvalue *); |
||||
|
int TFsetParm( CKTcircuit *, void *, int , IFvalue *); |
||||
|
int TRANaskQuest( CKTcircuit *, void *, int , IFvalue *); |
||||
|
int TRANsetParm( CKTcircuit *, void *, int , IFvalue *); |
||||
|
int TRANinit(CKTcircuit *, JOB *); |
||||
|
int NIacIter( CKTcircuit * ); |
||||
|
int NIcomCof( CKTcircuit * ); |
||||
|
int NIconvTest(CKTcircuit * ); |
||||
|
void NIdestroy(CKTcircuit * ); |
||||
|
int NIinit( CKTcircuit * ); |
||||
|
int NIintegrate( CKTcircuit *, double *, double *, double , int ); |
||||
|
int NIiter( CKTcircuit * , int ); |
||||
|
int NIpzMuller(PZtrial **, PZtrial *); |
||||
|
int NIpzComplex(PZtrial **, PZtrial *); |
||||
|
int NIpzSym(PZtrial **, PZtrial *); |
||||
|
int NIpzSym2(PZtrial **, PZtrial *); |
||||
|
int NIreinit( CKTcircuit *); |
||||
|
int NIsenReinit( CKTcircuit *); |
||||
|
IFfrontEnd *SPfrontEnd; |
||||
|
|
||||
|
#endif /*CKT*/ |
||||
@ -0,0 +1,47 @@ |
|||||
|
/********** |
||||
|
Copyright 1990 Regents of the University of California. All rights reserved. |
||||
|
Author: 1985 Thomas L. Quarles |
||||
|
**********/ |
||||
|
|
||||
|
/* CKTaccept(ckt) |
||||
|
* this is a driver program to iterate through all the various |
||||
|
* accept functions provided for the circuit elements in the |
||||
|
* given circuit |
||||
|
*/ |
||||
|
|
||||
|
#include "ngspice.h" |
||||
|
#include <stdio.h> |
||||
|
#include "smpdefs.h" |
||||
|
#include "cktdefs.h" |
||||
|
#include "devdefs.h" |
||||
|
#include "sperror.h" |
||||
|
|
||||
|
|
||||
|
int |
||||
|
CKTaccept(register CKTcircuit *ckt) |
||||
|
{ |
||||
|
extern SPICEdev *DEVices[]; |
||||
|
|
||||
|
register int i; |
||||
|
int error; |
||||
|
|
||||
|
for (i=0;i<DEVmaxnum;i++) { |
||||
|
if ( ((*DEVices[i]).DEVaccept != NULL) && (ckt->CKThead[i] != NULL) ){ |
||||
|
error = (*((*DEVices[i]).DEVaccept))(ckt,ckt->CKThead[i]); |
||||
|
if(error) return(error); |
||||
|
} |
||||
|
} |
||||
|
#ifdef PREDICTOR |
||||
|
/* now, move the sols vectors around */ |
||||
|
temp = ckt->CKTsols[7]; |
||||
|
for ( i=7;i>0;i--) { |
||||
|
ckt->CKTsols[i] = ckt->CKTsols[i-1]; |
||||
|
} |
||||
|
ckt->CKTsols[0]=temp; |
||||
|
size = SMPmatSize(ckt->CKTmatrix); |
||||
|
for(i=0;i<=size;i++) { |
||||
|
ckt->CKTsols[0][i]=ckt->CKTrhs[i]; |
||||
|
} |
||||
|
#endif /* PREDICTOR */ |
||||
|
return(OK); |
||||
|
} |
||||
@ -0,0 +1,142 @@ |
|||||
|
/********** |
||||
|
Copyright 1990 Regents of the University of California. All rights reserved. |
||||
|
Author: 1985 Thomas L. Quarles |
||||
|
**********/ |
||||
|
/* |
||||
|
*/ |
||||
|
|
||||
|
/* |
||||
|
* CKTacct |
||||
|
* get the specified accounting item into 'value' in the |
||||
|
* given circuit 'ckt'. |
||||
|
*/ |
||||
|
|
||||
|
#include "ngspice.h" |
||||
|
#include "const.h" |
||||
|
#include "optdefs.h" |
||||
|
#include "ifsim.h" |
||||
|
#include <stdio.h> |
||||
|
#include "cktdefs.h" |
||||
|
#include "spmatrix.h" |
||||
|
|
||||
|
|
||||
|
|
||||
|
/* ARGSUSED */ |
||||
|
int |
||||
|
CKTacct(CKTcircuit *ckt, void *anal, int which, IFvalue *val) |
||||
|
{ |
||||
|
switch(which) { |
||||
|
|
||||
|
case OPT_EQNS: |
||||
|
val->iValue = ckt->CKTmaxEqNum; |
||||
|
break; |
||||
|
case OPT_ORIGNZ: |
||||
|
if ( ckt->CKTmatrix != NULL ) { |
||||
|
val->iValue = spOriginalCount((char *)ckt->CKTmatrix); |
||||
|
} else { |
||||
|
val->iValue = 0; |
||||
|
} |
||||
|
break; |
||||
|
case OPT_FILLNZ: |
||||
|
if ( ckt->CKTmatrix != NULL ) { |
||||
|
val->iValue = spFillinCount((char *)ckt->CKTmatrix); |
||||
|
} else { |
||||
|
val->iValue = 0; |
||||
|
} |
||||
|
break; |
||||
|
case OPT_TOTALNZ: |
||||
|
if ( ckt->CKTmatrix != NULL ) { |
||||
|
val->iValue = spElementCount((char *)ckt->CKTmatrix); |
||||
|
} else { |
||||
|
val->iValue = 0; |
||||
|
} |
||||
|
break; |
||||
|
case OPT_ITERS: |
||||
|
val->iValue = ckt->CKTstat->STATnumIter; |
||||
|
break; |
||||
|
case OPT_TRANIT: |
||||
|
val->iValue = ckt->CKTstat->STATtranIter; |
||||
|
break; |
||||
|
case OPT_TRANCURITER: |
||||
|
val->iValue = ckt->CKTstat->STATnumIter - ckt->CKTstat->STAToldIter; |
||||
|
break; |
||||
|
case OPT_TRANPTS: |
||||
|
val->iValue = ckt->CKTstat->STATtimePts; |
||||
|
break; |
||||
|
case OPT_TRANACCPT: |
||||
|
val->iValue = ckt->CKTstat->STATaccepted; |
||||
|
break; |
||||
|
case OPT_TRANRJCT: |
||||
|
val->iValue = ckt->CKTstat->STATrejected; |
||||
|
break; |
||||
|
case OPT_TOTANALTIME: |
||||
|
val->rValue = ckt->CKTstat->STATtotAnalTime; |
||||
|
break; |
||||
|
case OPT_TRANTIME: |
||||
|
val->rValue = ckt->CKTstat->STATtranTime; |
||||
|
break; |
||||
|
case OPT_ACTIME: |
||||
|
val->rValue = ckt->CKTstat->STATacTime; |
||||
|
break; |
||||
|
case OPT_LOADTIME: |
||||
|
val->rValue = ckt->CKTstat->STATloadTime; |
||||
|
break; |
||||
|
case OPT_SYNCTIME: |
||||
|
val->rValue = ckt->CKTstat->STATsyncTime; |
||||
|
break; |
||||
|
case OPT_COMBTIME: |
||||
|
val->rValue = ckt->CKTstat->STATcombineTime; |
||||
|
break; |
||||
|
case OPT_REORDTIME: |
||||
|
val->rValue = ckt->CKTstat->STATreorderTime; |
||||
|
break; |
||||
|
case OPT_DECOMP: |
||||
|
val->rValue = ckt->CKTstat->STATdecompTime; |
||||
|
break; |
||||
|
case OPT_SOLVE: |
||||
|
val->rValue = ckt->CKTstat->STATsolveTime; |
||||
|
break; |
||||
|
case OPT_TRANLOAD: |
||||
|
val->rValue = ckt->CKTstat->STATtranLoadTime; |
||||
|
break; |
||||
|
case OPT_TRANSYNC: |
||||
|
val->rValue = ckt->CKTstat->STATtranSyncTime; |
||||
|
break; |
||||
|
case OPT_TRANCOMB: |
||||
|
val->rValue = ckt->CKTstat->STATtranCombTime; |
||||
|
break; |
||||
|
case OPT_TRANDECOMP: |
||||
|
val->rValue = ckt->CKTstat->STATtranDecompTime; |
||||
|
break; |
||||
|
case OPT_TRANSOLVE: |
||||
|
val->rValue = ckt->CKTstat->STATtranSolveTime; |
||||
|
break; |
||||
|
case OPT_TRANTRUNC: |
||||
|
val->rValue = ckt->CKTstat->STATtranTruncTime; |
||||
|
break; |
||||
|
case OPT_ACLOAD: |
||||
|
val->rValue = ckt->CKTstat->STATacLoadTime; |
||||
|
break; |
||||
|
case OPT_ACSYNC: |
||||
|
val->rValue = ckt->CKTstat->STATacSyncTime; |
||||
|
break; |
||||
|
case OPT_ACCOMB: |
||||
|
val->rValue = ckt->CKTstat->STATacCombTime; |
||||
|
break; |
||||
|
case OPT_ACDECOMP: |
||||
|
val->rValue = ckt->CKTstat->STATacDecompTime; |
||||
|
break; |
||||
|
case OPT_ACSOLVE: |
||||
|
val->rValue = ckt->CKTstat->STATacSolveTime; |
||||
|
break; |
||||
|
case OPT_TEMP: |
||||
|
val->rValue = ckt->CKTtemp - CONSTCtoK; |
||||
|
break; |
||||
|
case OPT_TNOM: |
||||
|
val->rValue = ckt->CKTnomTemp - CONSTCtoK; |
||||
|
break; |
||||
|
default: |
||||
|
return(-1); |
||||
|
} |
||||
|
return(0); |
||||
|
} |
||||
@ -0,0 +1,43 @@ |
|||||
|
/********** |
||||
|
Copyright 1990 Regents of the University of California. All rights reserved. |
||||
|
Author: 1985 Thomas L. Quarles |
||||
|
**********/ |
||||
|
|
||||
|
/* CKTacDump(ckt,freq,file) |
||||
|
* this is a simple program to dump the complex rhs vector |
||||
|
* into the rawfile. |
||||
|
*/ |
||||
|
|
||||
|
#include "ngspice.h" |
||||
|
#include <stdio.h> |
||||
|
#include "smpdefs.h" |
||||
|
#include "cktdefs.h" |
||||
|
#include "iferrmsg.h" |
||||
|
#include "ifsim.h" |
||||
|
|
||||
|
|
||||
|
|
||||
|
int |
||||
|
CKTacDump(register CKTcircuit *ckt, double freq, void *plot) |
||||
|
{ |
||||
|
register double *rhsold; |
||||
|
register double *irhsold; |
||||
|
register int i; |
||||
|
register IFcomplex *data; |
||||
|
IFvalue freqData; |
||||
|
IFvalue valueData; |
||||
|
|
||||
|
rhsold = ckt->CKTrhsOld; |
||||
|
irhsold = ckt->CKTirhsOld; |
||||
|
freqData.rValue = freq; |
||||
|
valueData.v.numValue = ckt->CKTmaxEqNum-1; |
||||
|
data = (IFcomplex *) MALLOC((ckt->CKTmaxEqNum-1)*sizeof(IFcomplex)); |
||||
|
valueData.v.vec.cVec = data; |
||||
|
for (i=0;i<ckt->CKTmaxEqNum-1;i++) { |
||||
|
data[i].real = rhsold[i+1]; |
||||
|
data[i].imag = irhsold[i+1]; |
||||
|
} |
||||
|
(*(SPfrontEnd->OUTpData))(plot,&freqData,&valueData); |
||||
|
FREE(data); |
||||
|
return(OK); |
||||
|
} |
||||
@ -0,0 +1,45 @@ |
|||||
|
/********** |
||||
|
Copyright 1990 Regents of the University of California. All rights reserved. |
||||
|
Author: 1985 Thomas L. Quarles |
||||
|
**********/ |
||||
|
|
||||
|
/* CKTask |
||||
|
* Ask questions about a specified device. |
||||
|
*/ |
||||
|
|
||||
|
#include "ngspice.h" |
||||
|
#include <stdio.h> |
||||
|
#include "cktdefs.h" |
||||
|
#include "ifsim.h" |
||||
|
#include "devdefs.h" |
||||
|
#include "sperror.h" |
||||
|
|
||||
|
|
||||
|
extern SPICEdev *DEVices[]; |
||||
|
|
||||
|
int |
||||
|
CKTask(void *ckt, void *fast, int which, IFvalue *value, IFvalue *selector) |
||||
|
{ |
||||
|
register int type = ((GENinstance *)fast)->GENmodPtr->GENmodType; |
||||
|
int error; |
||||
|
#ifdef PARALLEL_ARCH |
||||
|
long msgtype, length; |
||||
|
long from = ((GENinstance *)fast)->GENowner; |
||||
|
#endif /* PARALLEL_ARCH */ |
||||
|
|
||||
|
if((*DEVices[type]).DEVask) { |
||||
|
error = DEVices[type]->DEVask((CKTcircuit *)ckt, |
||||
|
(GENinstance *)fast,which,value,selector); |
||||
|
} else { |
||||
|
error = E_BADPARM; |
||||
|
} |
||||
|
#ifdef PARALLEL_ARCH |
||||
|
msgtype = MT_ASK; |
||||
|
length = sizeof(IFvalue); |
||||
|
BRDCST_(&msgtype, (char *)value, &length, &from); |
||||
|
msgtype++; |
||||
|
length = sizeof(int); |
||||
|
BRDCST_(&msgtype, (char *)&error, &length, &from); |
||||
|
#endif /* PARALLEL_ARCH */ |
||||
|
return(error); |
||||
|
} |
||||
@ -0,0 +1,25 @@ |
|||||
|
/********** |
||||
|
Copyright 1990 Regents of the University of California. All rights reserved. |
||||
|
Author: 1985 Thomas L. Quarles |
||||
|
**********/ |
||||
|
|
||||
|
#include "ngspice.h" |
||||
|
#include <stdio.h> |
||||
|
#include "tskdefs.h" |
||||
|
#include "jobdefs.h" |
||||
|
#include "cktdefs.h" |
||||
|
#include "ifsim.h" |
||||
|
#include "iferrmsg.h" |
||||
|
|
||||
|
|
||||
|
extern SPICEanalysis *analInfo[]; |
||||
|
|
||||
|
/* ARGSUSED */ |
||||
|
int |
||||
|
CKTaskAnalQ(void *ckt, void *analPtr, int parm, IFvalue *value, IFvalue *selector) |
||||
|
{ |
||||
|
register int type = ((JOB *)analPtr)->JOBtype; |
||||
|
|
||||
|
if((analInfo[type]->askQuest) == NULL) return(E_BADPARM); |
||||
|
return( (*(analInfo[type]->askQuest))((CKTcircuit*)ckt,analPtr,parm,value)); |
||||
|
} |
||||
@ -0,0 +1,43 @@ |
|||||
|
/********** |
||||
|
Copyright 1990 Regents of the University of California. All rights reserved. |
||||
|
Author: 1985 Thomas L. Quarles |
||||
|
**********/ |
||||
|
|
||||
|
/* |
||||
|
*CKTaskNodQst |
||||
|
* |
||||
|
* ask about a parameter on a node. |
||||
|
*/ |
||||
|
|
||||
|
#include "ngspice.h" |
||||
|
#include <stdio.h> |
||||
|
#include "ifsim.h" |
||||
|
#include "iferrmsg.h" |
||||
|
#include "cktdefs.h" |
||||
|
|
||||
|
|
||||
|
|
||||
|
/* ARGSUSED */ |
||||
|
int |
||||
|
CKTaskNodQst(void *ckt, void *node, int parm, IFvalue *value, IFvalue *selector) |
||||
|
{ |
||||
|
if(!node) return(E_BADPARM); |
||||
|
switch(parm) { |
||||
|
|
||||
|
case PARM_NS: |
||||
|
value->rValue = ((CKTnode *)node)->nodeset; |
||||
|
break; |
||||
|
|
||||
|
case PARM_IC: |
||||
|
value->rValue = ((CKTnode *)node)->ic; |
||||
|
break; |
||||
|
|
||||
|
case PARM_NODETYPE: |
||||
|
value->iValue = ((CKTnode *)node)->type; |
||||
|
break; |
||||
|
|
||||
|
default: |
||||
|
return(E_BADPARM); |
||||
|
} |
||||
|
return(OK); |
||||
|
} |
||||
@ -0,0 +1,54 @@ |
|||||
|
/********** |
||||
|
Copyright 1990 Regents of the University of California. All rights reserved. |
||||
|
Author: 1985 Thomas L. Quarles |
||||
|
**********/ |
||||
|
|
||||
|
/* CKTbindNode |
||||
|
* bind a node of the specified device of the given type to its place |
||||
|
* in the specified circuit. |
||||
|
*/ |
||||
|
|
||||
|
#include "ngspice.h" |
||||
|
#include <stdio.h> |
||||
|
#include "ifsim.h" |
||||
|
#include "smpdefs.h" |
||||
|
#include "cktdefs.h" |
||||
|
#include "devdefs.h" |
||||
|
#include "sperror.h" |
||||
|
|
||||
|
|
||||
|
extern SPICEdev *DEVices[]; |
||||
|
|
||||
|
/*ARGSUSED*/ |
||||
|
int |
||||
|
CKTbindNode(void *ckt, void *fast, int term, void *node) |
||||
|
{ |
||||
|
int mappednode; |
||||
|
register int type = ((GENinstance *)fast)->GENmodPtr->GENmodType; |
||||
|
|
||||
|
mappednode = ((CKTnode *)node)->number; |
||||
|
|
||||
|
if(*((*DEVices[type]).DEVpublic.terms) >= term && term >0 ) { |
||||
|
switch(term) { |
||||
|
default: return(E_NOTERM); |
||||
|
case 1: |
||||
|
((GENinstance *)fast)->GENnode1 = mappednode; |
||||
|
break; |
||||
|
case 2: |
||||
|
((GENinstance *)fast)->GENnode2 = mappednode; |
||||
|
break; |
||||
|
case 3: |
||||
|
((GENinstance *)fast)->GENnode3 = mappednode; |
||||
|
break; |
||||
|
case 4: |
||||
|
((GENinstance *)fast)->GENnode4 = mappednode; |
||||
|
break; |
||||
|
case 5: |
||||
|
((GENinstance *)fast)->GENnode5 = mappednode; |
||||
|
break; |
||||
|
} |
||||
|
return(OK); |
||||
|
} else { |
||||
|
return(E_NOTERM); |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,25 @@ |
|||||
|
/********** |
||||
|
Copyright 1990 Regents of the University of California. All rights reserved. |
||||
|
Author: 1985 Thomas L. Quarles |
||||
|
**********/ |
||||
|
/* |
||||
|
*/ |
||||
|
|
||||
|
/* CKTbreakDump(ckt) - dump the breakpoint table associated with |
||||
|
* the given circuit |
||||
|
*/ |
||||
|
|
||||
|
#include "ngspice.h" |
||||
|
#include <stdio.h> |
||||
|
#include "cktdefs.h" |
||||
|
|
||||
|
|
||||
|
|
||||
|
void |
||||
|
CKTbreakDump(CKTcircuit *ckt) |
||||
|
{ |
||||
|
register int i; |
||||
|
for(i=0;i<ckt->CKTbreakSize;i++) { |
||||
|
(void)printf("breakpoint table entry %d is %g\n",i,*(ckt->CKTbreaks+i)); |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,39 @@ |
|||||
|
/********** |
||||
|
Copyright 1990 Regents of the University of California. All rights reserved. |
||||
|
Author: 1985 Thomas L. Quarles |
||||
|
**********/ |
||||
|
/* |
||||
|
*/ |
||||
|
|
||||
|
/* CKTclrBreak(ckt) |
||||
|
* delete the first time from the breakpoint table for the given circuit |
||||
|
*/ |
||||
|
|
||||
|
#include "ngspice.h" |
||||
|
#include <stdio.h> |
||||
|
#include "cktdefs.h" |
||||
|
#include "sperror.h" |
||||
|
|
||||
|
|
||||
|
|
||||
|
int |
||||
|
CKTclrBreak(register CKTcircuit *ckt) |
||||
|
{ |
||||
|
double *tmp; |
||||
|
register int j; |
||||
|
|
||||
|
if(ckt->CKTbreakSize >2) { |
||||
|
tmp = (double *)MALLOC((ckt->CKTbreakSize-1)*sizeof(double)); |
||||
|
if(tmp == (double *)NULL) return(E_NOMEM); |
||||
|
for(j=1;j<ckt->CKTbreakSize;j++) { |
||||
|
*(tmp+j-1) = *(ckt->CKTbreaks+j); |
||||
|
} |
||||
|
FREE(ckt->CKTbreaks); |
||||
|
ckt->CKTbreakSize--; |
||||
|
ckt->CKTbreaks=tmp; |
||||
|
} else { |
||||
|
*(ckt->CKTbreaks)= *(ckt->CKTbreaks+1); |
||||
|
*(ckt->CKTbreaks+1) = ckt->CKTfinalTime; |
||||
|
} |
||||
|
return(OK); |
||||
|
} |
||||
@ -0,0 +1,47 @@ |
|||||
|
/********** |
||||
|
Copyright 1990 Regents of the University of California. All rights reserved. |
||||
|
Author: 1985 Thomas L. Quarles |
||||
|
**********/ |
||||
|
/* |
||||
|
*/ |
||||
|
|
||||
|
/* CKTcrtElement(ckt,type,inModPtr,inInstPtr,name,subname) |
||||
|
* Create a device of the specified type, with the given name, using |
||||
|
* the specified model in the named circuit. |
||||
|
*/ |
||||
|
|
||||
|
#include "ngspice.h" |
||||
|
#include <stdio.h> |
||||
|
#include "ifsim.h" |
||||
|
#include "cktdefs.h" |
||||
|
#include "devdefs.h" |
||||
|
#include "sperror.h" |
||||
|
|
||||
|
|
||||
|
|
||||
|
/*ARGSUSED*/ |
||||
|
int |
||||
|
CKTcrtElt(void *ckt, void *inModPtr, void **inInstPtr, IFuid name) |
||||
|
{ |
||||
|
GENinstance *instPtr = NULL; |
||||
|
GENmodel *modPtr=(GENmodel*)inModPtr; |
||||
|
extern SPICEdev *DEVices[]; |
||||
|
int error; |
||||
|
int type; |
||||
|
|
||||
|
if((GENmodel *)modPtr==(GENmodel*)NULL) return(E_NOMOD); |
||||
|
type = ((GENmodel*)modPtr)->GENmodType; |
||||
|
error =CKTfndDev(ckt,&type,(void**)&instPtr,name,inModPtr,(char *)NULL ); |
||||
|
if (error== OK) { |
||||
|
if(inInstPtr) *inInstPtr=(void *)instPtr; |
||||
|
return(E_EXISTS); |
||||
|
} else if (error != E_NODEV) return(error); |
||||
|
instPtr = (GENinstance *)MALLOC(*DEVices[type]->DEVinstSize); |
||||
|
if(instPtr == (GENinstance *)NULL) return(E_NOMEM); |
||||
|
instPtr->GENname = name; |
||||
|
instPtr->GENmodPtr = modPtr; |
||||
|
instPtr->GENnextInstance = modPtr->GENinstances; |
||||
|
modPtr->GENinstances = instPtr; |
||||
|
if(inInstPtr != NULL) *inInstPtr = (void *)instPtr; |
||||
|
return(OK); |
||||
|
} |
||||
@ -0,0 +1,27 @@ |
|||||
|
/********** |
||||
|
Copyright 1990 Regents of the University of California. All rights reserved. |
||||
|
Author: 1985 Thomas L. Quarles |
||||
|
**********/ |
||||
|
|
||||
|
#include "ngspice.h" |
||||
|
#include <stdio.h> |
||||
|
#include "tskdefs.h" |
||||
|
#include "jobdefs.h" |
||||
|
#include "ifsim.h" |
||||
|
#include "iferrmsg.h" |
||||
|
|
||||
|
|
||||
|
/* ARGSUSED */ |
||||
|
int |
||||
|
CKTdelTask(void *ckt, void *task) |
||||
|
{ |
||||
|
JOB *job; |
||||
|
JOB *old=NULL; |
||||
|
for(job = ((TSKtask*)task)->jobs; job; job=job->JOBnextJob){ |
||||
|
if(old) FREE(old); |
||||
|
old=job; |
||||
|
} |
||||
|
if(old)FREE(old); |
||||
|
FREE(task); |
||||
|
return(OK); |
||||
|
} |
||||
@ -0,0 +1,61 @@ |
|||||
|
/********** |
||||
|
Copyright 1990 Regents of the University of California. All rights reserved. |
||||
|
Author: 1985 Thomas L. Quarles |
||||
|
**********/ |
||||
|
/* |
||||
|
*/ |
||||
|
|
||||
|
/* CKTdestroy(ckt) |
||||
|
* this is a driver program to iterate through all the various |
||||
|
* destroy functions provided for the circuit elements in the |
||||
|
* given circuit |
||||
|
*/ |
||||
|
|
||||
|
#include "ngspice.h" |
||||
|
#include <stdio.h> |
||||
|
#include "cktdefs.h" |
||||
|
#include "devdefs.h" |
||||
|
#include "ifsim.h" |
||||
|
#include "sperror.h" |
||||
|
|
||||
|
|
||||
|
|
||||
|
extern SPICEdev *DEVices[]; |
||||
|
int |
||||
|
CKTdestroy(void *inCkt) |
||||
|
{ |
||||
|
register CKTcircuit *ckt = (CKTcircuit *)inCkt; |
||||
|
register int i; |
||||
|
register CKTnode *node; |
||||
|
register CKTnode *nnode; |
||||
|
|
||||
|
|
||||
|
#ifdef WANT_SENSE2 |
||||
|
if(ckt->CKTsenInfo){ |
||||
|
if(ckt->CKTrhsOp) FREE(ckt->CKTrhsOp); |
||||
|
if(ckt->CKTsenRhs) FREE(ckt->CKTsenRhs); |
||||
|
if(ckt->CKTseniRhs) FREE(ckt->CKTseniRhs); |
||||
|
SENdestroy(ckt->CKTsenInfo); |
||||
|
} |
||||
|
#endif |
||||
|
|
||||
|
for (i=0;i<DEVmaxnum;i++) { |
||||
|
if ( ((*DEVices[i]).DEVdestroy != NULL) && (ckt->CKThead[i] != NULL) ){ |
||||
|
(*((*DEVices[i]).DEVdestroy))(&(ckt->CKThead[i])); |
||||
|
} |
||||
|
} |
||||
|
for(i=0;i<=ckt->CKTmaxOrder+1;i++){ |
||||
|
FREE(ckt->CKTstates[i]); |
||||
|
} |
||||
|
if(ckt->CKTmatrix) SMPdestroy(ckt->CKTmatrix); |
||||
|
if(ckt->CKTbreaks) FREE(ckt->CKTbreaks); |
||||
|
for(node = ckt->CKTnodes; node; ) { |
||||
|
nnode = node->next; |
||||
|
FREE(node); |
||||
|
node = nnode; |
||||
|
} |
||||
|
ckt->CKTnodes = (CKTnode *)NULL; |
||||
|
ckt->CKTlastNode = (CKTnode *)NULL; |
||||
|
FREE(ckt); |
||||
|
return(OK); |
||||
|
} |
||||
@ -0,0 +1,177 @@ |
|||||
|
/********** |
||||
|
Copyright 1990 Regents of the University of California. All rights reserved. |
||||
|
Author: 1988 Jaijeet S Roychowdhury |
||||
|
**********/ |
||||
|
|
||||
|
/* |
||||
|
* CKTdisto (ckt, mode) |
||||
|
*/ |
||||
|
|
||||
|
|
||||
|
#include "ngspice.h" |
||||
|
#include "cktdefs.h" |
||||
|
#include "devdefs.h" |
||||
|
#include "vsrc/vsrcdefs.h" |
||||
|
#include "isrc/isrcdefs.h" |
||||
|
#include "fteconst.h" |
||||
|
#include "iferrmsg.h" |
||||
|
#include "distodef.h" |
||||
|
#include "sperror.h" |
||||
|
#include <stdio.h> |
||||
|
|
||||
|
|
||||
|
int |
||||
|
CKTdisto (register CKTcircuit *ckt, int mode) |
||||
|
{ |
||||
|
extern SPICEdev *DEVices[]; |
||||
|
register DISTOAN* cv = (DISTOAN*) (ckt->CKTcurJob); |
||||
|
register int i; |
||||
|
int error=0; |
||||
|
int size; |
||||
|
|
||||
|
switch(mode) { |
||||
|
|
||||
|
case D_SETUP: |
||||
|
|
||||
|
for (i=0;i<DEVmaxnum;i++) { |
||||
|
if ( ((*DEVices[i]).DEVdisto != NULL) && (ckt->CKThead[i] != NULL) ){ |
||||
|
error = (*((*DEVices[i]).DEVdisto))(mode,ckt->CKThead[i],ckt); |
||||
|
if(error) return(error); |
||||
|
} |
||||
|
} |
||||
|
break; |
||||
|
|
||||
|
case D_TWOF1: |
||||
|
case D_THRF1: |
||||
|
case D_F1PF2: |
||||
|
case D_F1MF2: |
||||
|
case D_2F1MF2: |
||||
|
|
||||
|
size = SMPmatSize(ckt->CKTmatrix); |
||||
|
for (i=1; i<=size; i++) |
||||
|
{ |
||||
|
ckt->CKTrhs[i] = 0.0; |
||||
|
ckt->CKTirhs[i] = 0.0; |
||||
|
} |
||||
|
|
||||
|
for (i=0;i<DEVmaxnum;i++) { |
||||
|
if ( ((*DEVices[i]).DEVdisto != NULL) && (ckt->CKThead[i] != NULL) ){ |
||||
|
error = (*((*DEVices[i]).DEVdisto))(mode,ckt->CKThead[i],ckt); |
||||
|
if(error) return(error); |
||||
|
} |
||||
|
} |
||||
|
break; |
||||
|
|
||||
|
case D_RHSF1: |
||||
|
|
||||
|
cv->Df2given = 0; /* will change if any F2 source is found */ |
||||
|
|
||||
|
case D_RHSF2: |
||||
|
|
||||
|
|
||||
|
|
||||
|
{ |
||||
|
int vcode; |
||||
|
int icode; |
||||
|
double mag=0.0; |
||||
|
double phase=0.0; |
||||
|
int size; |
||||
|
|
||||
|
size = SMPmatSize(ckt->CKTmatrix); |
||||
|
for (i=0;i<=size;i++) { |
||||
|
*(ckt->CKTrhs+i)=0; |
||||
|
*(ckt->CKTirhs+i)=0; |
||||
|
} |
||||
|
|
||||
|
vcode = CKTtypelook("Vsource"); |
||||
|
icode = CKTtypelook("Isource"); |
||||
|
|
||||
|
|
||||
|
if(vcode >= 0) { |
||||
|
/* voltage sources are in this version, so use them */ |
||||
|
register VSRCinstance *here; |
||||
|
register VSRCmodel *model; |
||||
|
for(model = (VSRCmodel *)ckt->CKThead[vcode];model != NULL; |
||||
|
model=model->VSRCnextModel){ |
||||
|
for(here=model->VSRCinstances;here!=NULL; |
||||
|
here=here->VSRCnextInstance) { |
||||
|
|
||||
|
/* check if the source has a distortion input*/ |
||||
|
|
||||
|
if (here->VSRCdGiven) { |
||||
|
if (here->VSRCdF2given) cv->Df2given = 1; |
||||
|
if ((here->VSRCdF1given) && (mode == D_RHSF1)) { |
||||
|
|
||||
|
mag = here->VSRCdF1mag; |
||||
|
phase = here->VSRCdF1phase; |
||||
|
} |
||||
|
else if ((here->VSRCdF2given) && (mode == D_RHSF2)) { |
||||
|
|
||||
|
mag = here->VSRCdF2mag; |
||||
|
phase = here->VSRCdF2phase; |
||||
|
} |
||||
|
if (((here->VSRCdF1given) && (mode == D_RHSF1)) || |
||||
|
((here->VSRCdF2given) && (mode == D_RHSF2))) { |
||||
|
|
||||
|
*(ckt->CKTrhs + here->VSRCbranch) = 0.5*mag* cos(M_PI*phase/180.0); |
||||
|
*(ckt->CKTirhs + here->VSRCbranch) = 0.5*mag*sin(M_PI*phase/180.0); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
if(icode >= 0 ) { |
||||
|
/* current sources are in this version, so use them */ |
||||
|
register ISRCinstance *here; |
||||
|
register ISRCmodel *model; |
||||
|
|
||||
|
for(model= (ISRCmodel *)ckt->CKThead[icode];model != NULL; |
||||
|
model=model->ISRCnextModel){ |
||||
|
for(here=model->ISRCinstances;here!=NULL; |
||||
|
here=here->ISRCnextInstance) { |
||||
|
|
||||
|
/* check if the source has a distortion input*/ |
||||
|
|
||||
|
if (here->ISRCdGiven) { |
||||
|
if (here->ISRCdF2given) cv->Df2given = 1; |
||||
|
if ((here->ISRCdF1given) && (mode == D_RHSF1)) { |
||||
|
|
||||
|
mag = here->ISRCdF1mag; |
||||
|
phase = here->ISRCdF1phase; |
||||
|
} |
||||
|
else if ((here->ISRCdF2given) && (mode == D_RHSF2)) { |
||||
|
|
||||
|
mag = here->ISRCdF2mag; |
||||
|
phase = here->ISRCdF2phase; |
||||
|
} |
||||
|
if (((here->ISRCdF1given) && (mode == D_RHSF1)) || |
||||
|
((here->ISRCdF2given) && (mode == D_RHSF2))) { |
||||
|
|
||||
|
*(ckt->CKTrhs + here->ISRCposNode) = - 0.5 * mag |
||||
|
* cos(M_PI*phase/180.0); |
||||
|
*(ckt->CKTrhs + here->ISRCnegNode) = 0.5 * mag * cos( |
||||
|
M_PI*phase/180.0); |
||||
|
*(ckt->CKTirhs + here->ISRCposNode) = - 0.5 * mag * sin( |
||||
|
M_PI*phase/180.0); |
||||
|
*(ckt->CKTirhs + here->ISRCnegNode) = 0.5 * mag * sin( |
||||
|
M_PI*phase/180.0); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
error = 0; |
||||
|
break; |
||||
|
|
||||
|
default: |
||||
|
|
||||
|
error = E_BADPARM; |
||||
|
break; |
||||
|
} |
||||
|
|
||||
|
return(error); |
||||
|
|
||||
|
} |
||||
@ -0,0 +1,25 @@ |
|||||
|
/********** |
||||
|
Copyright 1990 Regents of the University of California. All rights reserved. |
||||
|
Author: 1985 Thomas L. Quarles |
||||
|
**********/ |
||||
|
/* |
||||
|
*/ |
||||
|
|
||||
|
/* CKTdltInst |
||||
|
* delete the specified instance - not yet supported in spice |
||||
|
*/ |
||||
|
|
||||
|
#include "ngspice.h" |
||||
|
#include <stdio.h> |
||||
|
#include "cktdefs.h" |
||||
|
#include "ifsim.h" |
||||
|
#include "sperror.h" |
||||
|
|
||||
|
|
||||
|
|
||||
|
/* ARGSUSED */ |
||||
|
int |
||||
|
CKTdltInst(void *ckt, void *instance) |
||||
|
{ |
||||
|
return(E_UNSUPP); |
||||
|
} |
||||
@ -0,0 +1,45 @@ |
|||||
|
/********** |
||||
|
Copyright 1990 Regents of the University of California. All rights reserved. |
||||
|
Author: 1985 Thomas L. Quarles |
||||
|
**********/ |
||||
|
|
||||
|
/* CKTdltMod |
||||
|
* delete the specified model - not yet supported in spice |
||||
|
*/ |
||||
|
|
||||
|
#include "ngspice.h" |
||||
|
#include <stdio.h> |
||||
|
#include "cktdefs.h" |
||||
|
#include "ifsim.h" |
||||
|
#include "sperror.h" |
||||
|
|
||||
|
|
||||
|
|
||||
|
/* ARGSUSED */ |
||||
|
int |
||||
|
CKTdltMod(void *cktp, void *modPtr) |
||||
|
{ |
||||
|
CKTcircuit *ckt = (CKTcircuit *) cktp; |
||||
|
GENmodel *m = (GENmodel *) modPtr, *mod, **prevp; |
||||
|
GENinstance *h, *next_i; |
||||
|
int error; |
||||
|
|
||||
|
prevp = &ckt->CKThead[m->GENmodType]; |
||||
|
for (mod = *prevp; m && mod != m; mod = mod->GENnextModel) |
||||
|
prevp = &mod->GENnextModel; |
||||
|
|
||||
|
if (!mod) |
||||
|
return OK; |
||||
|
|
||||
|
*prevp = m->GENnextModel; |
||||
|
|
||||
|
for (h = m->GENinstances; h; h = next_i) { |
||||
|
next_i = h->GENnextInstance; |
||||
|
error = (*(SPfrontEnd->IFdelUid))((void *)ckt,h->GENname, |
||||
|
UID_INSTANCE); |
||||
|
tfree(h); |
||||
|
} |
||||
|
error = (*(SPfrontEnd->IFdelUid))((void *)ckt,m->GENmodName, UID_MODEL); |
||||
|
tfree(m); |
||||
|
return(OK); |
||||
|
} |
||||
@ -0,0 +1,59 @@ |
|||||
|
/********** |
||||
|
Copyright 1992 Regents of the University of California. All rights reserved. |
||||
|
**********/ |
||||
|
|
||||
|
/* CKTdltNod |
||||
|
*/ |
||||
|
|
||||
|
#include "ngspice.h" |
||||
|
#include <stdio.h> |
||||
|
#include "cktdefs.h" |
||||
|
#include "ifsim.h" |
||||
|
#include "sperror.h" |
||||
|
|
||||
|
int CKTdltNNum(void *cktp, int num); |
||||
|
|
||||
|
/* ARGSUSED */ |
||||
|
int |
||||
|
CKTdltNod(void *ckt, void *node) |
||||
|
{ |
||||
|
return CKTdltNNum(ckt, ((CKTnode *) node)->number); |
||||
|
} |
||||
|
|
||||
|
int |
||||
|
CKTdltNNum(void *cktp, int num) |
||||
|
{ |
||||
|
CKTcircuit *ckt = (CKTcircuit *) cktp; |
||||
|
CKTnode *n, *prev, *node, *sprev; |
||||
|
int error; |
||||
|
|
||||
|
prev = NULL; |
||||
|
node = NULL; |
||||
|
sprev = NULL; |
||||
|
|
||||
|
for (n = ckt->CKTnodes; n; n = n->next) { |
||||
|
if (n->number == num) { |
||||
|
node = n; |
||||
|
sprev = prev; |
||||
|
} |
||||
|
prev = n; |
||||
|
} |
||||
|
|
||||
|
if (!node) |
||||
|
return OK; |
||||
|
|
||||
|
ckt->CKTmaxEqNum -= 1; |
||||
|
|
||||
|
if (!sprev) { |
||||
|
ckt->CKTnodes = node->next; |
||||
|
} else { |
||||
|
sprev->next = node->next; |
||||
|
} |
||||
|
if (node == ckt->CKTlastNode) |
||||
|
ckt->CKTlastNode = sprev; |
||||
|
|
||||
|
error = (*(SPfrontEnd->IFdelUid))((void *)ckt,node->name, UID_SIGNAL); |
||||
|
tfree(node); |
||||
|
|
||||
|
return error; |
||||
|
} |
||||
@ -0,0 +1,146 @@ |
|||||
|
/********** |
||||
|
Copyright 1990 Regents of the University of California. All rights reserved. |
||||
|
Author: 1985 Thomas L. Quarles |
||||
|
**********/ |
||||
|
|
||||
|
#include "ngspice.h" |
||||
|
#include "cktdefs.h" |
||||
|
#include <stdio.h> |
||||
|
#include "sperror.h" |
||||
|
#include "trandefs.h" |
||||
|
|
||||
|
|
||||
|
extern SPICEanalysis *analInfo[]; |
||||
|
extern int ANALmaxnum; |
||||
|
|
||||
|
int |
||||
|
CKTdoJob(void *inCkt, int reset, void *inTask) |
||||
|
{ |
||||
|
CKTcircuit *ckt = (CKTcircuit *)inCkt; |
||||
|
TSKtask *task = (TSKtask *)inTask; |
||||
|
JOB *job; |
||||
|
double startTime; |
||||
|
int error, i, error2; |
||||
|
|
||||
|
#ifdef WANT_SENSE2 |
||||
|
int senflag; |
||||
|
static int sens_num = -1; |
||||
|
|
||||
|
/* Sensitivity is special */ |
||||
|
if (sens_num < 0) { |
||||
|
for (i = 0; i < ANALmaxnum; i++) |
||||
|
if (!strcmp("SENS2", analInfo[i]->public.name)) |
||||
|
break; |
||||
|
sens_num = i; |
||||
|
} |
||||
|
#endif |
||||
|
|
||||
|
startTime = (*(SPfrontEnd->IFseconds))( ); |
||||
|
|
||||
|
ckt->CKTtemp = task->TSKtemp; |
||||
|
ckt->CKTnomTemp = task->TSKnomTemp; |
||||
|
ckt->CKTmaxOrder = task->TSKmaxOrder; |
||||
|
ckt->CKTintegrateMethod = task->TSKintegrateMethod; |
||||
|
ckt->CKTbypass = task->TSKbypass; |
||||
|
ckt->CKTdcMaxIter = task->TSKdcMaxIter; |
||||
|
ckt->CKTdcTrcvMaxIter = task->TSKdcTrcvMaxIter; |
||||
|
ckt->CKTtranMaxIter = task->TSKtranMaxIter; |
||||
|
ckt->CKTnumSrcSteps = task->TSKnumSrcSteps; |
||||
|
ckt->CKTnumGminSteps = task->TSKnumGminSteps; |
||||
|
ckt->CKTminBreak = task->TSKminBreak; |
||||
|
ckt->CKTabstol = task->TSKabstol; |
||||
|
ckt->CKTpivotAbsTol = task->TSKpivotAbsTol; |
||||
|
ckt->CKTpivotRelTol = task->TSKpivotRelTol; |
||||
|
ckt->CKTreltol = task->TSKreltol; |
||||
|
ckt->CKTchgtol = task->TSKchgtol; |
||||
|
ckt->CKTvoltTol = task->TSKvoltTol; |
||||
|
ckt->CKTgmin = task->TSKgmin; |
||||
|
ckt->CKTdelmin = task->TSKdelmin; |
||||
|
ckt->CKTtrtol = task->TSKtrtol; |
||||
|
ckt->CKTdefaultMosL = task->TSKdefaultMosL; |
||||
|
ckt->CKTdefaultMosW = task->TSKdefaultMosW; |
||||
|
ckt->CKTdefaultMosAD = task->TSKdefaultMosAD; |
||||
|
ckt->CKTdefaultMosAS = task->TSKdefaultMosAS; |
||||
|
ckt->CKTfixLimit = task->TSKfixLimit; |
||||
|
ckt->CKTnoOpIter = task->TSKnoOpIter; |
||||
|
ckt->CKTtryToCompact = task->TSKtryToCompact; |
||||
|
ckt->CKTbadMos3 = task->TSKbadMos3; |
||||
|
ckt->CKTkeepOpInfo = task->TSKkeepOpInfo; |
||||
|
ckt->CKTtroubleNode = 0; |
||||
|
ckt->CKTtroubleElt = NULL; |
||||
|
#ifdef NEWTRUNC |
||||
|
ckt->CKTlteReltol = task->TSKlteReltol; |
||||
|
ckt->CKTlteAbstol = task->TSKlteAbstol; |
||||
|
#endif /* NEWTRUNC */ |
||||
|
|
||||
|
error = 0; |
||||
|
|
||||
|
if (reset) { |
||||
|
|
||||
|
ckt->CKTdelta = 0.0; |
||||
|
ckt->CKTtime = 0.0; |
||||
|
ckt->CKTcurrentAnalysis = 0; |
||||
|
|
||||
|
#ifdef WANT_SENSE2 |
||||
|
senflag = 0; |
||||
|
if (sens_num < ANALmaxnum) |
||||
|
for (job = task->jobs; !error && job; job = job->JOBnextJob) { |
||||
|
if (job->JOBtype == sens_num) { |
||||
|
senflag = 1; |
||||
|
ckt->CKTcurJob = job; |
||||
|
ckt->CKTsenInfo = (SENstruct *) job; |
||||
|
error = (*(analInfo[sens_num]->an_func))(ckt, reset); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
if (ckt->CKTsenInfo && (!senflag || error)) |
||||
|
FREE(ckt->CKTsenInfo); |
||||
|
#endif |
||||
|
|
||||
|
/* normal reset */ |
||||
|
if (!error) |
||||
|
error = CKTunsetup(ckt); |
||||
|
if (!error) |
||||
|
error = CKTsetup(ckt); |
||||
|
if (!error) |
||||
|
error = CKTtemp(ckt); |
||||
|
if (error) |
||||
|
return error; |
||||
|
} |
||||
|
|
||||
|
error2 = OK; |
||||
|
|
||||
|
/* Analysis order is important */ |
||||
|
for (i = 0; i < ANALmaxnum; i++) { |
||||
|
|
||||
|
#ifdef WANT_SENSE2 |
||||
|
if (i == sens_num) |
||||
|
continue; |
||||
|
#endif |
||||
|
|
||||
|
for (job = task->jobs; job; job = job->JOBnextJob) { |
||||
|
if (job->JOBtype == i) { |
||||
|
ckt->CKTcurJob=job; |
||||
|
error = OK; |
||||
|
if (analInfo[i]->an_init) |
||||
|
error = (*(analInfo[i]->an_init))(ckt, job); |
||||
|
if (!error && analInfo[i]->do_ic) |
||||
|
error = CKTic(ckt); |
||||
|
if (!error) |
||||
|
error = (*(analInfo[i]->an_func))(ckt, reset); |
||||
|
if (error) |
||||
|
error2 = error; |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
ckt->CKTstat->STATtotAnalTime += (*(SPfrontEnd->IFseconds))( ) - startTime; |
||||
|
|
||||
|
#ifdef WANT_SENSE2 |
||||
|
if (ckt->CKTsenInfo) |
||||
|
SENdestroy(ckt->CKTsenInfo); |
||||
|
#endif |
||||
|
|
||||
|
return(error2); |
||||
|
} |
||||
|
|
||||
@ -0,0 +1,29 @@ |
|||||
|
/********** |
||||
|
Copyright 1990 Regents of the University of California. All rights reserved. |
||||
|
Author: 1985 Thomas L. Quarles |
||||
|
**********/ |
||||
|
/* |
||||
|
*/ |
||||
|
|
||||
|
/* CKTdump(ckt) |
||||
|
* this is a simple program to dump the rhs vector to stdout |
||||
|
*/ |
||||
|
|
||||
|
#include "ngspice.h" |
||||
|
#include <stdio.h> |
||||
|
#include "smpdefs.h" |
||||
|
#include "cktdefs.h" |
||||
|
|
||||
|
|
||||
|
|
||||
|
void |
||||
|
CKTdump(register CKTcircuit *ckt, double ref, void *plot) |
||||
|
{ |
||||
|
IFvalue refData; |
||||
|
IFvalue valData; |
||||
|
|
||||
|
refData.rValue = ref; |
||||
|
valData.v.numValue = ckt->CKTmaxEqNum-1; |
||||
|
valData.v.vec.rVec = ckt->CKTrhsOld+1; |
||||
|
(*(SPfrontEnd->OUTpData))(plot,&refData,&valData); |
||||
|
} |
||||
@ -0,0 +1,36 @@ |
|||||
|
/********** |
||||
|
Copyright 1990 Regents of the University of California. All rights reserved. |
||||
|
Author: 1985 Thomas L. Quarles |
||||
|
**********/ |
||||
|
/* |
||||
|
*/ |
||||
|
|
||||
|
/* CKTfndBranch(ckt,name) |
||||
|
* this is a driver program to iterate through all the various |
||||
|
* findBranch functions provided for the circuit elements in the |
||||
|
* given circuit |
||||
|
*/ |
||||
|
|
||||
|
#include "ngspice.h" |
||||
|
#include <stdio.h> |
||||
|
#include "cktdefs.h" |
||||
|
#include "devdefs.h" |
||||
|
|
||||
|
|
||||
|
|
||||
|
int |
||||
|
CKTfndBranch(register CKTcircuit *ckt, IFuid name) |
||||
|
{ |
||||
|
extern SPICEdev *DEVices[]; |
||||
|
|
||||
|
register int i; |
||||
|
int j; |
||||
|
|
||||
|
for (i=0;i<DEVmaxnum;i++) { |
||||
|
if ((*DEVices[i]).DEVfindBranch != NULL && ckt->CKThead[i] != NULL) { |
||||
|
j = (*((*DEVices[i]).DEVfindBranch))(ckt,ckt->CKThead[i],name); |
||||
|
if(j != 0) return(j); |
||||
|
} |
||||
|
} |
||||
|
return(0); |
||||
|
} |
||||
@ -0,0 +1,86 @@ |
|||||
|
/********** |
||||
|
Copyright 1990 Regents of the University of California. All rights reserved. |
||||
|
Author: 1985 Thomas L. Quarles |
||||
|
**********/ |
||||
|
|
||||
|
#include "ngspice.h" |
||||
|
#include <stdio.h> |
||||
|
#include "ifsim.h" |
||||
|
#include "cktdefs.h" |
||||
|
#include "sperror.h" |
||||
|
|
||||
|
|
||||
|
|
||||
|
int |
||||
|
CKTfndDev(void *Ckt, int *type, void **fast, IFuid name, void *modfast, IFuid modname) |
||||
|
{ |
||||
|
register CKTcircuit *ckt=(CKTcircuit *)Ckt; |
||||
|
register GENinstance *here; |
||||
|
register GENmodel *mods; |
||||
|
|
||||
|
if((GENinstance **)fast != (GENinstance **)NULL && |
||||
|
*(GENinstance **)fast != (GENinstance *)NULL) { |
||||
|
/* already have fast, so nothing much to do */ |
||||
|
/* just get & set type */ |
||||
|
if(type) *type = (*((GENinstance**)fast))->GENmodPtr->GENmodType; |
||||
|
return(OK); |
||||
|
} |
||||
|
if(modfast) { |
||||
|
/* have model, just need device */ |
||||
|
mods = (GENmodel*)modfast; |
||||
|
for(here = mods->GENinstances ; here != NULL; |
||||
|
here = here->GENnextInstance) { |
||||
|
if (here->GENname == name) { |
||||
|
if(fast != NULL) *(GENinstance **)fast = here; |
||||
|
if(type) *type = mods->GENmodType; |
||||
|
return(OK); |
||||
|
} |
||||
|
} |
||||
|
return(E_NODEV); |
||||
|
} |
||||
|
if(*type >=0 && *type < DEVmaxnum) { |
||||
|
/* have device type, need to find model & device */ |
||||
|
/* look through all models */ |
||||
|
for(mods=(GENmodel *)ckt->CKThead[*type]; mods != NULL ; |
||||
|
mods = mods->GENnextModel) { |
||||
|
/* and all instances */ |
||||
|
if(modname == (char *)NULL || mods->GENmodName == modname) { |
||||
|
for(here = mods->GENinstances ; here != NULL; |
||||
|
here = here->GENnextInstance) { |
||||
|
if (here->GENname == name) { |
||||
|
if(fast != 0) *(GENinstance **)fast = here; |
||||
|
return(OK); |
||||
|
} |
||||
|
} |
||||
|
if(mods->GENmodName == modname) { |
||||
|
return(E_NODEV); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
return(E_NOMOD); |
||||
|
} else if(*type == -1) { |
||||
|
/* look through all types (UGH - worst case - take forever) */ |
||||
|
for(*type = 0;*type <DEVmaxnum;(*type)++) { |
||||
|
/* need to find model & device */ |
||||
|
/* look through all models */ |
||||
|
for(mods=(GENmodel *)ckt->CKThead[*type];mods!=NULL; |
||||
|
mods = mods->GENnextModel) { |
||||
|
/* and all instances */ |
||||
|
if(modname == (char *)NULL || mods->GENmodName == modname) { |
||||
|
for(here = mods->GENinstances ; here != NULL; |
||||
|
here = here->GENnextInstance) { |
||||
|
if (here->GENname == name) { |
||||
|
if(fast != 0) *(GENinstance **)fast = here; |
||||
|
return(OK); |
||||
|
} |
||||
|
} |
||||
|
if(mods->GENmodName == modname) { |
||||
|
return(E_NODEV); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
*type = -1; |
||||
|
return(E_NODEV); |
||||
|
} else return(E_BADPARM); |
||||
|
} |
||||
@ -0,0 +1,36 @@ |
|||||
|
/********** |
||||
|
Copyright 1990 Regents of the University of California. All rights reserved. |
||||
|
Author: 1985 Thomas L. Quarles |
||||
|
**********/ |
||||
|
/* |
||||
|
*/ |
||||
|
|
||||
|
/* CKTfndAnal |
||||
|
* find the given Analysis given its name and return the Analysis pointer |
||||
|
*/ |
||||
|
|
||||
|
#include "ngspice.h" |
||||
|
#include <stdio.h> |
||||
|
#include "ifsim.h" |
||||
|
#include "jobdefs.h" |
||||
|
#include "tskdefs.h" |
||||
|
#include "sperror.h" |
||||
|
#include "cktdefs.h" |
||||
|
|
||||
|
|
||||
|
|
||||
|
/* ARGSUSED */ |
||||
|
int |
||||
|
CKTfndAnal(void *ckt, int *analIndex, void **anal, IFuid name, void *inTask, IFuid taskName) |
||||
|
{ |
||||
|
TSKtask *task = (TSKtask *)inTask; |
||||
|
register JOB *here; |
||||
|
|
||||
|
for (here = ((TSKtask *)task)->jobs;here;here = here->JOBnextJob) { |
||||
|
if(strcmp(here->JOBname,name)==0) { |
||||
|
if(anal) *anal = (void *)here; |
||||
|
return(OK); |
||||
|
} |
||||
|
} |
||||
|
return(E_NOTFOUND); |
||||
|
} |
||||
@ -0,0 +1,53 @@ |
|||||
|
/********** |
||||
|
Copyright 1990 Regents of the University of California. All rights reserved. |
||||
|
Author: 1985 Thomas L. Quarles |
||||
|
**********/ |
||||
|
/* |
||||
|
*/ |
||||
|
|
||||
|
#include "ngspice.h" |
||||
|
#include <stdio.h> |
||||
|
#include "cktdefs.h" |
||||
|
#include "ifsim.h" |
||||
|
#include "sperror.h" |
||||
|
|
||||
|
|
||||
|
|
||||
|
int |
||||
|
CKTfndMod(void *ckt, int *type, void **modfast, IFuid modname) |
||||
|
{ |
||||
|
register GENmodel *mods; |
||||
|
|
||||
|
if(modfast != NULL && *(GENmodel **)modfast != NULL) { |
||||
|
/* already have modfast, so nothing to do */ |
||||
|
if(type) *type = (*(GENmodel **)modfast)->GENmodType; |
||||
|
return(OK); |
||||
|
} |
||||
|
if(*type >=0 && *type < DEVmaxnum) { |
||||
|
/* have device type, need to find model */ |
||||
|
/* look through all models */ |
||||
|
for(mods=((CKTcircuit *)ckt)->CKThead[*type]; mods != NULL ; |
||||
|
mods = mods->GENnextModel) { |
||||
|
if(mods->GENmodName == modname) { |
||||
|
*modfast = (char *)mods; |
||||
|
return(OK); |
||||
|
} |
||||
|
} |
||||
|
return(E_NOMOD); |
||||
|
} else if(*type == -1) { |
||||
|
/* look through all types (UGH - worst case - take forever) */ |
||||
|
for(*type = 0;*type <DEVmaxnum;(*type)++) { |
||||
|
/* need to find model & device */ |
||||
|
/* look through all models */ |
||||
|
for(mods=((CKTcircuit *)ckt)->CKThead[*type];mods!=NULL; |
||||
|
mods = mods->GENnextModel) { |
||||
|
if(mods->GENmodName == modname) { |
||||
|
*modfast = (char *)mods; |
||||
|
return(OK); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
*type = -1; |
||||
|
return(E_NOMOD); |
||||
|
} else return(E_BADPARM); |
||||
|
} |
||||
@ -0,0 +1,33 @@ |
|||||
|
/********** |
||||
|
Copyright 1990 Regents of the University of California. All rights reserved. |
||||
|
Author: 1985 Thomas L. Quarles |
||||
|
**********/ |
||||
|
/* |
||||
|
*/ |
||||
|
|
||||
|
/* CKTfndNode |
||||
|
* find the given node given its name and return the node pointer |
||||
|
*/ |
||||
|
|
||||
|
#include "ngspice.h" |
||||
|
#include <stdio.h> |
||||
|
#include "ifsim.h" |
||||
|
#include "sperror.h" |
||||
|
#include "cktdefs.h" |
||||
|
|
||||
|
|
||||
|
|
||||
|
/* ARGSUSED */ |
||||
|
int |
||||
|
CKTfndNode(void *ckt, void **node, IFuid name) |
||||
|
{ |
||||
|
register CKTnode *here; |
||||
|
|
||||
|
for (here = ((CKTcircuit *)ckt)->CKTnodes; here; here = here->next) { |
||||
|
if(here->name == name) { |
||||
|
if(node) *node = (char *)here; |
||||
|
return(OK); |
||||
|
} |
||||
|
} |
||||
|
return(E_NOTFOUND); |
||||
|
} |
||||
@ -0,0 +1,25 @@ |
|||||
|
/********** |
||||
|
Copyright 1990 Regents of the University of California. All rights reserved. |
||||
|
Author: 1985 Thomas L. Quarles |
||||
|
**********/ |
||||
|
/* |
||||
|
*/ |
||||
|
|
||||
|
/* CKTfndTask |
||||
|
* find the specified task - not yet supported in spice |
||||
|
*/ |
||||
|
|
||||
|
#include "ngspice.h" |
||||
|
#include <stdio.h> |
||||
|
#include "cktdefs.h" |
||||
|
#include "ifsim.h" |
||||
|
#include "sperror.h" |
||||
|
|
||||
|
|
||||
|
|
||||
|
/* ARGSUSED */ |
||||
|
int |
||||
|
CKTfndTask(void *ckt, void **taskPtr, IFuid taskName) |
||||
|
{ |
||||
|
return(E_UNSUPP); |
||||
|
} |
||||
@ -0,0 +1,46 @@ |
|||||
|
/********** |
||||
|
Copyright 1990 Regents of the University of California. All rights reserved. |
||||
|
Author: 1985 Thomas L. Quarles |
||||
|
**********/ |
||||
|
/* |
||||
|
*/ |
||||
|
|
||||
|
/* CKTground(ckt,node) |
||||
|
* specify the node to be the ground node of the given circuit |
||||
|
*/ |
||||
|
|
||||
|
#include "ngspice.h" |
||||
|
#include <stdio.h> |
||||
|
#include "cktdefs.h" |
||||
|
#include "ifsim.h" |
||||
|
#include "sperror.h" |
||||
|
|
||||
|
|
||||
|
|
||||
|
int |
||||
|
CKTground(void *inCkt, void **node, IFuid name) |
||||
|
{ |
||||
|
register CKTcircuit *ckt = (CKTcircuit *)inCkt; |
||||
|
|
||||
|
if(ckt->CKTnodes) { |
||||
|
if(ckt->CKTnodes->name) { |
||||
|
/*already exists - keep old name, but return it */ |
||||
|
if(node)*node = (char *)ckt->CKTnodes; |
||||
|
return(E_EXISTS); |
||||
|
} |
||||
|
ckt->CKTnodes->name = name; |
||||
|
ckt->CKTnodes->type = SP_VOLTAGE; |
||||
|
ckt->CKTnodes->number = 0; |
||||
|
} else { |
||||
|
ckt->CKTnodes = (CKTnode *)MALLOC(sizeof(CKTnode)); |
||||
|
if(ckt->CKTnodes == NULL) return(E_NOMEM); |
||||
|
ckt->CKTnodes->name = name; |
||||
|
ckt->CKTnodes->type = SP_VOLTAGE; |
||||
|
ckt->CKTnodes->number = 0; |
||||
|
ckt->CKTnodes->next = (CKTnode *)NULL; |
||||
|
ckt->CKTlastNode = ckt->CKTnodes; |
||||
|
} |
||||
|
if(node)*node = (char *)ckt->CKTnodes; |
||||
|
return(OK); |
||||
|
|
||||
|
} |
||||
@ -0,0 +1,66 @@ |
|||||
|
/********** |
||||
|
Copyright 1990 Regents of the University of California. All rights reserved. |
||||
|
Author: 1985 Thomas L. Quarles |
||||
|
**********/ |
||||
|
/* |
||||
|
*/ |
||||
|
|
||||
|
/* CKTinst2Node |
||||
|
* get the name and node pointer for a node given a device it is |
||||
|
* bound to and the terminal of the device. |
||||
|
*/ |
||||
|
|
||||
|
#include "ngspice.h" |
||||
|
#include <stdio.h> |
||||
|
#include "ifsim.h" |
||||
|
#include "sperror.h" |
||||
|
#include "cktdefs.h" |
||||
|
#include "gendefs.h" |
||||
|
#include "devdefs.h" |
||||
|
|
||||
|
|
||||
|
|
||||
|
extern SPICEdev *DEVices[]; |
||||
|
|
||||
|
int |
||||
|
CKTinst2Node(void *ckt, void *instPtr, int terminal, void **node, IFuid *nodeName) |
||||
|
{ |
||||
|
int nodenum; |
||||
|
register int type; |
||||
|
CKTnode *here; |
||||
|
|
||||
|
type = ((GENinstance *)instPtr)->GENmodPtr->GENmodType; |
||||
|
|
||||
|
if(*((*DEVices[type]).DEVpublic.terms) >= terminal && terminal >0 ) { |
||||
|
switch(terminal) { |
||||
|
default: return(E_NOTERM); |
||||
|
case 1: |
||||
|
nodenum = ((GENinstance *)instPtr)->GENnode1; |
||||
|
break; |
||||
|
case 2: |
||||
|
nodenum = ((GENinstance *)instPtr)->GENnode2; |
||||
|
break; |
||||
|
case 3: |
||||
|
nodenum = ((GENinstance *)instPtr)->GENnode3; |
||||
|
break; |
||||
|
case 4: |
||||
|
nodenum = ((GENinstance *)instPtr)->GENnode4; |
||||
|
break; |
||||
|
case 5: |
||||
|
nodenum = ((GENinstance *)instPtr)->GENnode5; |
||||
|
break; |
||||
|
} |
||||
|
/* ok, now we know its number, so we just have to find it.*/ |
||||
|
for(here = ((CKTcircuit*)ckt)->CKTnodes;here;here = here->next) { |
||||
|
if(here->number == nodenum) { |
||||
|
/* found it */ |
||||
|
*node = (void*) here; |
||||
|
*nodeName = here->name; |
||||
|
return(OK); |
||||
|
} |
||||
|
} |
||||
|
return(E_NOTFOUND); |
||||
|
} else { |
||||
|
return(E_NOTERM); |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,57 @@ |
|||||
|
/********** |
||||
|
Copyright 1990 Regents of the University of California. All rights reserved. |
||||
|
Author: 1985 Thomas L. Quarles |
||||
|
**********/ |
||||
|
|
||||
|
#include "ngspice.h" |
||||
|
#include <stdio.h> |
||||
|
#include "cktdefs.h" |
||||
|
#include "smpdefs.h" |
||||
|
#include "sperror.h" |
||||
|
#include "devdefs.h" |
||||
|
|
||||
|
|
||||
|
|
||||
|
extern SPICEdev *DEVices[]; |
||||
|
|
||||
|
int |
||||
|
CKTic(CKTcircuit *ckt) |
||||
|
{ |
||||
|
int error; |
||||
|
int size; |
||||
|
int i; |
||||
|
CKTnode *node; |
||||
|
|
||||
|
size = SMPmatSize(ckt->CKTmatrix); |
||||
|
for (i=0;i<=size;i++) { |
||||
|
*(ckt->CKTrhs+i)=0; |
||||
|
} |
||||
|
|
||||
|
for(node = ckt->CKTnodes;node != NULL; node = node->next) { |
||||
|
if(node->nsGiven) { |
||||
|
node->ptr = SMPmakeElt(ckt->CKTmatrix,node->number,node->number); |
||||
|
if(node->ptr == (double *)NULL) return(E_NOMEM); |
||||
|
ckt->CKThadNodeset = 1; |
||||
|
*(ckt->CKTrhs+node->number) = node->nodeset; |
||||
|
} |
||||
|
if(node->icGiven) { |
||||
|
if(! ( node->ptr)) { |
||||
|
node->ptr = SMPmakeElt(ckt->CKTmatrix,node->number, |
||||
|
node->number); |
||||
|
if(node->ptr == (double *)NULL) return(E_NOMEM); |
||||
|
} |
||||
|
*(ckt->CKTrhs+node->number) = node->ic; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
if(ckt->CKTmode & MODEUIC) { |
||||
|
for (i=0;i<DEVmaxnum;i++) { |
||||
|
if( ((*DEVices[i]).DEVsetic != NULL) && (ckt->CKThead[i] != NULL) ){ |
||||
|
error = (*((*DEVices[i]).DEVsetic))(ckt->CKThead[i],ckt); |
||||
|
if(error) return(error); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
return(OK); |
||||
|
} |
||||
@ -0,0 +1,66 @@ |
|||||
|
/********** |
||||
|
Copyright 1990 Regents of the University of California. All rights reserved. |
||||
|
Author: 1985 Thomas L. Quarles |
||||
|
**********/ |
||||
|
|
||||
|
#include "ngspice.h" |
||||
|
#include <stdio.h> |
||||
|
#include "ifsim.h" |
||||
|
#include "cktdefs.h" |
||||
|
#include "const.h" |
||||
|
#include "sperror.h" |
||||
|
|
||||
|
|
||||
|
int |
||||
|
CKTinit(void **ckt) |
||||
|
/* new circuit to create */ |
||||
|
{ |
||||
|
register int i; |
||||
|
register CKTcircuit *sckt; |
||||
|
|
||||
|
sckt = (CKTcircuit *)( *ckt = (char *)MALLOC(sizeof(CKTcircuit)) ); |
||||
|
if(sckt == NULL) return(E_NOMEM); |
||||
|
for (i=0;i<DEVmaxnum;i++) { |
||||
|
(sckt)->CKThead[i] = (GENmodel *) NULL; |
||||
|
} |
||||
|
(sckt)->CKTmaxEqNum = 1; |
||||
|
(sckt)->CKTnodes = (CKTnode *)NULL; |
||||
|
(sckt)->CKTlastNode = (CKTnode *)NULL; |
||||
|
sckt->CKTmatrix = NULL; |
||||
|
#ifdef notdef |
||||
|
error = NIinit(sckt); |
||||
|
if(error) return(error); |
||||
|
#endif |
||||
|
|
||||
|
(sckt)->CKTgmin = 1e-12; |
||||
|
(sckt)->CKTabstol = 1e-12; |
||||
|
(sckt)->CKTreltol = 1e-3; |
||||
|
(sckt)->CKTchgtol = 1e-14; |
||||
|
(sckt)->CKTvoltTol = 1e-6; |
||||
|
(sckt)->CKTtrtol = 7; |
||||
|
(sckt)->CKTbypass = 1; |
||||
|
(sckt)->CKTisSetup = 0; |
||||
|
(sckt)->CKTtranMaxIter = 10; |
||||
|
(sckt)->CKTdcMaxIter = 100; |
||||
|
(sckt)->CKTdcTrcvMaxIter = 50; |
||||
|
(sckt)->CKTintegrateMethod = TRAPEZOIDAL; |
||||
|
(sckt)->CKTorder = 1; |
||||
|
(sckt)->CKTmaxOrder = 2; |
||||
|
(sckt)->CKTpivotAbsTol = 1e-13; |
||||
|
(sckt)->CKTpivotRelTol = 1e-3; |
||||
|
(sckt)->CKTtemp = 300.15; |
||||
|
(sckt)->CKTnomTemp = 300.15; |
||||
|
(sckt)->CKTdefaultMosL = 1e-4; |
||||
|
(sckt)->CKTdefaultMosW = 1e-4; |
||||
|
(sckt)->CKTdefaultMosAD = 0; |
||||
|
(sckt)->CKTdefaultMosAS = 0; |
||||
|
(sckt)->CKTsrcFact=1; |
||||
|
(sckt)->CKTdiagGmin=0; |
||||
|
(sckt)->CKTstat = (STATistics *)MALLOC(sizeof(STATistics)); |
||||
|
(sckt)->CKTtroubleNode = 0; |
||||
|
(sckt)->CKTtroubleElt = NULL; |
||||
|
(sckt)->CKTtimePoints = NULL; |
||||
|
if( (sckt)->CKTstat == (STATistics *)NULL) return(E_NOMEM); |
||||
|
|
||||
|
return(OK); |
||||
|
} |
||||
@ -0,0 +1,36 @@ |
|||||
|
/********** |
||||
|
Copyright 1990 Regents of the University of California. All rights reserved. |
||||
|
Author: 1985 Thomas L. Quarles |
||||
|
**********/ |
||||
|
|
||||
|
/* |
||||
|
*CKTlinkEq |
||||
|
* Link an already allocated node into the necessary structure |
||||
|
*/ |
||||
|
|
||||
|
#include "ngspice.h" |
||||
|
#include <stdio.h> |
||||
|
#include "ifsim.h" |
||||
|
#include "iferrmsg.h" |
||||
|
#include "smpdefs.h" |
||||
|
#include "cktdefs.h" |
||||
|
|
||||
|
|
||||
|
int |
||||
|
CKTlinkEq(CKTcircuit *ckt, CKTnode *node) |
||||
|
{ |
||||
|
if(!(ckt->CKTnodes)) { /* starting the list - allocate both ground and 1 */ |
||||
|
ckt->CKTnodes = (CKTnode *) MALLOC(sizeof(CKTnode)); |
||||
|
if(ckt->CKTnodes == (CKTnode *)NULL) return(E_NOMEM); |
||||
|
ckt->CKTnodes->name = (char *)NULL; |
||||
|
ckt->CKTnodes->type = SP_VOLTAGE; |
||||
|
ckt->CKTnodes->number = 0; |
||||
|
ckt->CKTlastNode = ckt->CKTnodes; |
||||
|
} |
||||
|
if(node == (CKTnode *)NULL) return(E_BADPARM); |
||||
|
ckt->CKTlastNode->next = node; |
||||
|
ckt->CKTlastNode = ckt->CKTlastNode->next; |
||||
|
ckt->CKTlastNode->number = ckt->CKTmaxEqNum++; |
||||
|
ckt->CKTlastNode->next = (CKTnode *)NULL; |
||||
|
return(OK); |
||||
|
} |
||||
@ -0,0 +1,166 @@ |
|||||
|
/********** |
||||
|
Copyright 1990 Regents of the University of California. All rights reserved. |
||||
|
Author: 1985 Thomas L. Quarles |
||||
|
**********/ |
||||
|
/* |
||||
|
*/ |
||||
|
|
||||
|
/* CKTload(ckt) |
||||
|
* this is a driver program to iterate through all the various |
||||
|
* load functions provided for the circuit elements in the |
||||
|
* given circuit |
||||
|
*/ |
||||
|
|
||||
|
#include "ngspice.h" |
||||
|
#include <stdio.h> |
||||
|
#include "smpdefs.h" |
||||
|
#include "cktdefs.h" |
||||
|
#include "devdefs.h" |
||||
|
#include "sperror.h" |
||||
|
|
||||
|
|
||||
|
static int ZeroNoncurRow(SMPmatrix *matrix, CKTnode *nodes, int rownum); |
||||
|
|
||||
|
int |
||||
|
CKTload(register CKTcircuit *ckt) |
||||
|
{ |
||||
|
extern SPICEdev *DEVices[]; |
||||
|
register int i; |
||||
|
register int size; |
||||
|
double startTime; |
||||
|
CKTnode *node; |
||||
|
int error; |
||||
|
#ifdef PARALLEL_ARCH |
||||
|
int ibuf[2]; |
||||
|
long type = MT_LOAD, length = 2; |
||||
|
#endif /* PARALLEL_ARCH */ |
||||
|
#ifdef STEPDEBUG |
||||
|
int noncon; |
||||
|
#endif /* STEPDEBUG */ |
||||
|
|
||||
|
startTime = (*(SPfrontEnd->IFseconds))(); |
||||
|
size = SMPmatSize(ckt->CKTmatrix); |
||||
|
for (i=0;i<=size;i++) { |
||||
|
*(ckt->CKTrhs+i)=0; |
||||
|
} |
||||
|
SMPclear(ckt->CKTmatrix); |
||||
|
#ifdef STEPDEBUG |
||||
|
noncon = ckt->CKTnoncon; |
||||
|
#endif /* STEPDEBUG */ |
||||
|
|
||||
|
for (i=0;i<DEVmaxnum;i++) { |
||||
|
if ( ((*DEVices[i]).DEVload != NULL) && (ckt->CKThead[i] != NULL) ){ |
||||
|
error = (*((*DEVices[i]).DEVload))(ckt->CKThead[i],ckt); |
||||
|
if (ckt->CKTnoncon) |
||||
|
ckt->CKTtroubleNode = 0; |
||||
|
#ifdef STEPDEBUG |
||||
|
if(noncon != ckt->CKTnoncon) { |
||||
|
printf("device type %s nonconvergence\n", |
||||
|
(*DEVices[i]).DEVpublic.name); |
||||
|
noncon = ckt->CKTnoncon; |
||||
|
} |
||||
|
#endif /* STEPDEBUG */ |
||||
|
#ifdef PARALLEL_ARCH |
||||
|
if (error) goto combine; |
||||
|
#else |
||||
|
if(error) return(error); |
||||
|
#endif /* PARALLEL_ARCH */ |
||||
|
} |
||||
|
} |
||||
|
if(ckt->CKTmode & MODEDC) { |
||||
|
/* consider doing nodeset & ic assignments */ |
||||
|
if(ckt->CKTmode & (MODEINITJCT | MODEINITFIX)) { |
||||
|
/* do nodesets */ |
||||
|
for(node=ckt->CKTnodes;node;node=node->next) { |
||||
|
if(node->nsGiven) { |
||||
|
if (ZeroNoncurRow(ckt->CKTmatrix, ckt->CKTnodes, |
||||
|
node->number)) |
||||
|
{ |
||||
|
*(ckt->CKTrhs+node->number) = 1.0e10 * node->nodeset; |
||||
|
*(node->ptr) = 1e10; |
||||
|
} else { |
||||
|
*(ckt->CKTrhs+node->number) = node->nodeset; |
||||
|
*(node->ptr) = 1; |
||||
|
} |
||||
|
/* DAG: Original CIDER fix. If above fix doesn't work, |
||||
|
* revert to this. |
||||
|
*/ |
||||
|
/* |
||||
|
*(ckt->CKTrhs+node->number) += 1.0e10 * node->nodeset; |
||||
|
*(node->ptr) += 1.0e10; |
||||
|
*/ |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
if( (ckt->CKTmode & MODETRANOP) && (!(ckt->CKTmode & MODEUIC))) { |
||||
|
for(node=ckt->CKTnodes;node;node=node->next) { |
||||
|
if(node->icGiven) { |
||||
|
if (ZeroNoncurRow(ckt->CKTmatrix, ckt->CKTnodes, |
||||
|
node->number)) |
||||
|
{ |
||||
|
*(ckt->CKTrhs+node->number) += 1.0e10 * node->ic; |
||||
|
*(node->ptr) += 1.0e10; |
||||
|
} else { |
||||
|
*(ckt->CKTrhs+node->number) = node->ic; |
||||
|
*(node->ptr) = 1; |
||||
|
} |
||||
|
/* DAG: Original CIDER fix. If above fix doesn't work, |
||||
|
* revert to this. |
||||
|
*/ |
||||
|
/* |
||||
|
*(ckt->CKTrhs+node->number) += 1.0e10 * node->ic; |
||||
|
*(node->ptr) += 1.0e10; |
||||
|
*/ |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
/* SMPprint(ckt->CKTmatrix, stdout); if you want to debug, this is a |
||||
|
good place to start ... */ |
||||
|
|
||||
|
#ifdef PARALLEL_ARCH |
||||
|
combine: |
||||
|
ckt->CKTstat->STATloadTime += SPfrontEnd->IFseconds() - startTime; |
||||
|
startTime = SPfrontEnd->IFseconds(); |
||||
|
/* See if any of the DEVload functions bailed. If not, proceed. */ |
||||
|
ibuf[0] = error; |
||||
|
ibuf[1] = ckt->CKTnoncon; |
||||
|
IGOP_( &type, ibuf, &length, "+" ); |
||||
|
ckt->CKTnoncon = ibuf[1]; |
||||
|
ckt->CKTstat->STATsyncTime += SPfrontEnd->IFseconds() - startTime; |
||||
|
if (ibuf[0] == OK) { |
||||
|
startTime = SPfrontEnd->IFseconds(); |
||||
|
SMPcombine( ckt->CKTmatrix, ckt->CKTrhs, ckt->CKTrhsSpare ); |
||||
|
ckt->CKTstat->STATcombineTime += SPfrontEnd->IFseconds() - startTime; |
||||
|
return(OK); |
||||
|
} else { |
||||
|
if ( ibuf[0] != error ) { |
||||
|
error = E_MULTIERR; |
||||
|
} |
||||
|
return(error); |
||||
|
} |
||||
|
#else |
||||
|
ckt->CKTstat->STATloadTime += SPfrontEnd->IFseconds()-startTime; |
||||
|
return(OK); |
||||
|
#endif /* PARALLEL_ARCH */ |
||||
|
} |
||||
|
|
||||
|
static int |
||||
|
ZeroNoncurRow(SMPmatrix *matrix, CKTnode *nodes, int rownum) |
||||
|
{ |
||||
|
CKTnode *n; |
||||
|
double *x; |
||||
|
int currents; |
||||
|
|
||||
|
currents = 0; |
||||
|
for (n = nodes; n; n = n->next) { |
||||
|
x = (double *) SMPfindElt(matrix, rownum, n->number, 0); |
||||
|
if (x) { |
||||
|
if (n->type == SP_CURRENT) |
||||
|
currents = 1; |
||||
|
else |
||||
|
*x = 0.0; |
||||
|
} |
||||
|
} |
||||
|
return currents; |
||||
|
} |
||||
@ -0,0 +1,51 @@ |
|||||
|
/********** |
||||
|
Copyright 1990 Regents of the University of California. All rights reserved. |
||||
|
Author: 1985 Thomas L. Quarles |
||||
|
**********/ |
||||
|
/* |
||||
|
*/ |
||||
|
|
||||
|
/* CKTmapNode(ckt,node) |
||||
|
* map the given node to the compact node numbering set of the |
||||
|
* specified circuit |
||||
|
*/ |
||||
|
|
||||
|
#include "ngspice.h" |
||||
|
#include <stdio.h> |
||||
|
#include "ifsim.h" |
||||
|
#include "sperror.h" |
||||
|
#include "cktdefs.h" |
||||
|
|
||||
|
|
||||
|
|
||||
|
/* ARGSUSED */ |
||||
|
int |
||||
|
CKTmapNode(void *ckt, void **node, IFuid name) |
||||
|
{ |
||||
|
register CKTnode *here; |
||||
|
int error; |
||||
|
IFuid uid; |
||||
|
CKTnode *mynode; |
||||
|
|
||||
|
for (here = ((CKTcircuit *)ckt)->CKTnodes; here; here = here->next) { |
||||
|
if(here->name == name) { |
||||
|
if(node) *node = (char *)here; |
||||
|
return(E_EXISTS); |
||||
|
} |
||||
|
} |
||||
|
/* not found, so must be a new one */ |
||||
|
error = CKTmkNode((CKTcircuit*)ckt,&mynode); /*allocate the node*/ |
||||
|
if(error) return(error); |
||||
|
error = (*(SPfrontEnd->IFnewUid))((void *)ckt, |
||||
|
&uid, |
||||
|
(IFuid) NULL, |
||||
|
name, |
||||
|
UID_SIGNAL, |
||||
|
(void**)mynode); /* get a uid for it */ |
||||
|
if(error) return(error); |
||||
|
mynode->name = uid; /* set the info we have */ |
||||
|
mynode->type = SP_VOLTAGE; |
||||
|
error = CKTlinkEq((CKTcircuit*)ckt,mynode); /* and link it in */ |
||||
|
if(node) *node = (void *)mynode; /* and finally, return it */ |
||||
|
return(OK); |
||||
|
} |
||||
@ -0,0 +1,30 @@ |
|||||
|
/********** |
||||
|
Copyright 1990 Regents of the University of California. All rights reserved. |
||||
|
Author: 1985 Thomas L. Quarles |
||||
|
**********/ |
||||
|
|
||||
|
/* CKTmodAsk |
||||
|
* Ask questions about a specified device. |
||||
|
*/ |
||||
|
|
||||
|
#include "ngspice.h" |
||||
|
#include <stdio.h> |
||||
|
#include "cktdefs.h" |
||||
|
#include "ifsim.h" |
||||
|
#include "devdefs.h" |
||||
|
#include "sperror.h" |
||||
|
|
||||
|
|
||||
|
extern SPICEdev *DEVices[]; |
||||
|
|
||||
|
/* ARGSUSED */ |
||||
|
int |
||||
|
CKTmodAsk(void *ckt, void *modfast, int which, IFvalue *value, IFvalue *selector) |
||||
|
{ |
||||
|
int type = ((GENmodel *)modfast)->GENmodType; |
||||
|
if((*DEVices[type]).DEVmodAsk) { |
||||
|
return( (*((*DEVices[type]).DEVmodAsk)) ((CKTcircuit *)ckt, |
||||
|
(GENmodel *)modfast,which,value) ); |
||||
|
} |
||||
|
return(E_BADPARM); |
||||
|
} |
||||
@ -0,0 +1,45 @@ |
|||||
|
/********** |
||||
|
Copyright 1990 Regents of the University of California. All rights reserved. |
||||
|
Author: 1985 Thomas L. Quarles |
||||
|
**********/ |
||||
|
/* |
||||
|
*/ |
||||
|
|
||||
|
/* CKTmodCrt(type,name,ckt,fast) |
||||
|
* Create a device model of the specified type, with the given name |
||||
|
* in the named circuit. |
||||
|
*/ |
||||
|
|
||||
|
#include "ngspice.h" |
||||
|
#include <stdio.h> |
||||
|
#include "devdefs.h" |
||||
|
#include "cktdefs.h" |
||||
|
#include "sperror.h" |
||||
|
|
||||
|
|
||||
|
|
||||
|
int |
||||
|
CKTmodCrt(void *ckt, int type, void **modfast, IFuid name) |
||||
|
{ |
||||
|
extern SPICEdev *DEVices[]; |
||||
|
GENmodel *mymodfast = NULL; |
||||
|
int error; |
||||
|
|
||||
|
error = CKTfndMod(ckt,&type,(void**)&mymodfast,name); |
||||
|
if(error == E_NOMOD) { |
||||
|
mymodfast = (GENmodel *)MALLOC(*DEVices[type]->DEVmodSize); |
||||
|
if(mymodfast == (GENmodel *)NULL) return(E_NOMEM); |
||||
|
mymodfast->GENmodType = type; |
||||
|
mymodfast->GENmodName = name; |
||||
|
mymodfast->GENnextModel =(GENmodel *)((CKTcircuit *)ckt)->CKThead[type]; |
||||
|
((CKTcircuit *)ckt)->CKThead[type]=(GENmodel *)mymodfast; |
||||
|
if(modfast) *modfast=(void *)mymodfast; |
||||
|
return(OK); |
||||
|
} else if (error==0) { |
||||
|
if(modfast) *modfast=(void *)mymodfast; |
||||
|
return(E_EXISTS); |
||||
|
} else { |
||||
|
return(error); |
||||
|
} |
||||
|
/*NOTREACHED*/ |
||||
|
} |
||||
@ -0,0 +1,45 @@ |
|||||
|
/********** |
||||
|
Copyright 1990 Regents of the University of California. All rights reserved. |
||||
|
Author: 1985 Thomas L. Quarles |
||||
|
**********/ |
||||
|
/* |
||||
|
*/ |
||||
|
|
||||
|
/* CKTmkCur |
||||
|
* make the given name a 'node' of type current in the |
||||
|
* specified circuit |
||||
|
*/ |
||||
|
|
||||
|
#include "ngspice.h" |
||||
|
#include <stdio.h> |
||||
|
#include "ifsim.h" |
||||
|
#include "sperror.h" |
||||
|
#include "cktdefs.h" |
||||
|
|
||||
|
|
||||
|
|
||||
|
/* ARGSUSED */ |
||||
|
int |
||||
|
CKTmkCur(CKTcircuit *ckt, CKTnode **node, IFuid basename, char *suffix) |
||||
|
{ |
||||
|
IFuid uid; |
||||
|
int error; |
||||
|
CKTnode *mynode; |
||||
|
CKTnode *checknode; |
||||
|
|
||||
|
error = CKTmkNode(ckt,&mynode); |
||||
|
if(error) return(error); |
||||
|
checknode = mynode; |
||||
|
error = (*(SPfrontEnd->IFnewUid))((void *)ckt,&uid,basename, |
||||
|
suffix,UID_SIGNAL,(void**)&checknode); |
||||
|
if(error) { |
||||
|
FREE(mynode); |
||||
|
if(node) *node = checknode; |
||||
|
return(error); |
||||
|
} |
||||
|
mynode->name = uid; |
||||
|
mynode->type = SP_CURRENT; |
||||
|
if(node) *node = mynode; |
||||
|
error = CKTlinkEq(ckt,mynode); |
||||
|
return(error); |
||||
|
} |
||||
@ -0,0 +1,32 @@ |
|||||
|
/********** |
||||
|
Copyright 1990 Regents of the University of California. All rights reserved. |
||||
|
Author: 1985 Thomas L. Quarles |
||||
|
**********/ |
||||
|
|
||||
|
/* |
||||
|
*CKTmkNode(ckt,node) |
||||
|
* Tentatively allocate a new circuit equation structure |
||||
|
*/ |
||||
|
|
||||
|
#include "ngspice.h" |
||||
|
#include <stdio.h> |
||||
|
#include "ifsim.h" |
||||
|
#include "iferrmsg.h" |
||||
|
#include "smpdefs.h" |
||||
|
#include "cktdefs.h" |
||||
|
|
||||
|
|
||||
|
/* ARGSUSED */ |
||||
|
int |
||||
|
CKTmkNode(CKTcircuit *ckt, CKTnode **node) |
||||
|
{ |
||||
|
CKTnode *mynode; |
||||
|
|
||||
|
mynode = (CKTnode *)MALLOC(sizeof(CKTnode)); |
||||
|
if(mynode == (CKTnode *)NULL) return(E_NOMEM); |
||||
|
mynode->next = (CKTnode *)NULL; |
||||
|
mynode->name = (IFuid) 0; |
||||
|
|
||||
|
if(node) *node = mynode; |
||||
|
return(OK); |
||||
|
} |
||||
@ -0,0 +1,43 @@ |
|||||
|
/********** |
||||
|
Copyright 1990 Regents of the University of California. All rights reserved. |
||||
|
Author: 1985 Thomas L. Quarles |
||||
|
**********/ |
||||
|
|
||||
|
/* CKTmkVolt |
||||
|
* make the given name a 'node' of type current in the |
||||
|
* specified circuit |
||||
|
*/ |
||||
|
|
||||
|
#include "ngspice.h" |
||||
|
#include <stdio.h> |
||||
|
#include "ifsim.h" |
||||
|
#include "sperror.h" |
||||
|
#include "cktdefs.h" |
||||
|
|
||||
|
|
||||
|
|
||||
|
/* ARGSUSED */ |
||||
|
int |
||||
|
CKTmkVolt(CKTcircuit *ckt, CKTnode **node, IFuid basename, char *suffix) |
||||
|
{ |
||||
|
IFuid uid; |
||||
|
int error; |
||||
|
CKTnode *mynode; |
||||
|
CKTnode *checknode; |
||||
|
|
||||
|
error = CKTmkNode(ckt,&mynode); |
||||
|
if(error) return(error); |
||||
|
checknode = mynode; |
||||
|
error = (*(SPfrontEnd->IFnewUid))((void *)ckt,&uid,basename, |
||||
|
suffix,UID_SIGNAL,(void**)&checknode); |
||||
|
if(error) { |
||||
|
FREE(mynode); |
||||
|
if(node) *node = checknode; |
||||
|
return(error); |
||||
|
} |
||||
|
mynode->name = uid; |
||||
|
mynode->type = SP_VOLTAGE; |
||||
|
if(node) *node = mynode; |
||||
|
error = CKTlinkEq(ckt,mynode); |
||||
|
return(error); |
||||
|
} |
||||
@ -0,0 +1,32 @@ |
|||||
|
/********** |
||||
|
Copyright 1990 Regents of the University of California. All rights reserved. |
||||
|
Author: 1985 Thomas L. Quarles |
||||
|
**********/ |
||||
|
|
||||
|
/* CKTmodParam |
||||
|
* attach the given parameter to the specified model in the given circuit |
||||
|
*/ |
||||
|
|
||||
|
#include "ngspice.h" |
||||
|
#include <stdio.h> |
||||
|
#include "cktdefs.h" |
||||
|
#include "ifsim.h" |
||||
|
#include "devdefs.h" |
||||
|
#include "sperror.h" |
||||
|
|
||||
|
|
||||
|
extern SPICEdev *DEVices[]; |
||||
|
|
||||
|
/* ARGSUSED */ |
||||
|
int |
||||
|
CKTmodParam(void *ckt, void *modfast, int param, IFvalue *val, IFvalue *selector) |
||||
|
{ |
||||
|
register int type = ((GENmodel *)modfast)->GENmodType; |
||||
|
|
||||
|
if (((*DEVices[type]).DEVmodParam)) { |
||||
|
return(((*((*DEVices[type]).DEVmodParam)) (param,val, |
||||
|
(GENmodel *)modfast))); |
||||
|
} else { |
||||
|
return(E_BADPARM); |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,45 @@ |
|||||
|
/********** |
||||
|
Copyright 1990 Regents of the University of California. All rights reserved. |
||||
|
Author: 1988 Thomas L. Quarles |
||||
|
**********/ |
||||
|
|
||||
|
/* |
||||
|
* CKTnames(ckt) |
||||
|
* output information on all circuit nodes/equations |
||||
|
* |
||||
|
*/ |
||||
|
|
||||
|
#include "ngspice.h" |
||||
|
#include <stdio.h> |
||||
|
#include "cktdefs.h" |
||||
|
#include "ifsim.h" |
||||
|
#include "iferrmsg.h" |
||||
|
|
||||
|
|
||||
|
int |
||||
|
CKTnames(register CKTcircuit *ckt, int *numNames, register IFuid **nameList) |
||||
|
{ |
||||
|
register CKTnode *here; |
||||
|
register int i; |
||||
|
*numNames = ckt->CKTmaxEqNum-1; |
||||
|
*nameList = (IFuid *)MALLOC(*numNames * sizeof(IFuid )); |
||||
|
if ((*nameList) == (IFuid *)NULL) return(E_NOMEM); |
||||
|
i=0; |
||||
|
for (here = ckt->CKTnodes->next; here; here = here->next) { |
||||
|
*((*nameList)+i++) = here->name; |
||||
|
} |
||||
|
return(OK); |
||||
|
} |
||||
|
|
||||
|
int |
||||
|
CKTdnames(CKTcircuit *ckt) |
||||
|
{ |
||||
|
CKTnode *here; |
||||
|
register int i; |
||||
|
|
||||
|
i=0; |
||||
|
for (here = ckt->CKTnodes->next; here; here = here->next) { |
||||
|
printf("%03d: %s\n", here->number, (char *)here->name); |
||||
|
} |
||||
|
return(OK); |
||||
|
} |
||||
@ -0,0 +1,34 @@ |
|||||
|
/********** |
||||
|
Copyright 1990 Regents of the University of California. All rights reserved. |
||||
|
Author: 1985 Thomas L. Quarles |
||||
|
**********/ |
||||
|
|
||||
|
#include "ngspice.h" |
||||
|
#include <stdio.h> |
||||
|
#include "tskdefs.h" |
||||
|
#include "jobdefs.h" |
||||
|
#include "ifsim.h" |
||||
|
#include "iferrmsg.h" |
||||
|
|
||||
|
|
||||
|
extern SPICEanalysis *analInfo[]; |
||||
|
|
||||
|
/* ARGSUSED */ |
||||
|
int |
||||
|
CKTnewAnal(void *ckt, int type, IFuid name, void **analPtr, void *taskPtr) |
||||
|
{ |
||||
|
if(type==0) { |
||||
|
/* special case for analysis type 0 == option card */ |
||||
|
*analPtr=taskPtr; /* pointer to the task itself */ |
||||
|
(*(JOB **)analPtr)->JOBname = name; |
||||
|
(*(JOB **)analPtr)->JOBtype = type; |
||||
|
return(OK); /* doesn't need to be created */ |
||||
|
} |
||||
|
*analPtr = (void *)MALLOC(analInfo[type]->size); |
||||
|
if(*analPtr==NULL) return(E_NOMEM); |
||||
|
(*(JOB **)analPtr)->JOBname = name; |
||||
|
(*(JOB **)analPtr)->JOBtype = type; |
||||
|
(*(JOB **)analPtr)->JOBnextJob = ((TSKtask *)taskPtr)->jobs; |
||||
|
((TSKtask *)taskPtr)->jobs = (JOB *)*analPtr; |
||||
|
return(OK); |
||||
|
} |
||||
@ -0,0 +1,38 @@ |
|||||
|
/********** |
||||
|
Copyright 1990 Regents of the University of California. All rights reserved. |
||||
|
Author: 1985 Thomas L. Quarles |
||||
|
**********/ |
||||
|
|
||||
|
/* |
||||
|
*CKTnewEq(ckt,node,name) |
||||
|
* Allocate a new circuit equation number (returned) in the specified |
||||
|
* circuit to contain a new equation or node |
||||
|
* returns -1 for failure to allocate a node number |
||||
|
* |
||||
|
*/ |
||||
|
|
||||
|
#include "ngspice.h" |
||||
|
#include <stdio.h> |
||||
|
#include "ifsim.h" |
||||
|
#include "iferrmsg.h" |
||||
|
#include "smpdefs.h" |
||||
|
#include "cktdefs.h" |
||||
|
|
||||
|
|
||||
|
int |
||||
|
CKTnewEq(void *inCkt, void **node, IFuid name) |
||||
|
{ |
||||
|
CKTnode *mynode; |
||||
|
register CKTcircuit *ckt = (CKTcircuit *)inCkt; |
||||
|
int error; |
||||
|
|
||||
|
error = CKTmkNode(ckt,&mynode); |
||||
|
if(error) return(error); |
||||
|
|
||||
|
if(node) *node = (void *)mynode; |
||||
|
mynode->name = name; |
||||
|
|
||||
|
error = CKTlinkEq(ckt,mynode); |
||||
|
|
||||
|
return(error); |
||||
|
} |
||||
@ -0,0 +1,45 @@ |
|||||
|
/********** |
||||
|
Copyright 1990 Regents of the University of California. All rights reserved. |
||||
|
Author: 1985 Thomas L. Quarles |
||||
|
**********/ |
||||
|
|
||||
|
/* |
||||
|
*CKTnewNode(ckt,node,name) |
||||
|
* Allocate a new circuit equation number (returned) in the specified |
||||
|
* circuit to contain a new equation or node |
||||
|
* returns -1 for failure to allocate a node number |
||||
|
* |
||||
|
*/ |
||||
|
|
||||
|
#include "ngspice.h" |
||||
|
#include <stdio.h> |
||||
|
#include "ifsim.h" |
||||
|
#include "iferrmsg.h" |
||||
|
#include "smpdefs.h" |
||||
|
#include "cktdefs.h" |
||||
|
|
||||
|
|
||||
|
/* should just call CKTnewEQ and set node type afterwards */ |
||||
|
int |
||||
|
CKTnewNode(void *inCkt, void **node, IFuid name) |
||||
|
{ |
||||
|
register CKTcircuit *ckt = (CKTcircuit *)inCkt; |
||||
|
if(!(ckt->CKTnodes)) { /* starting the list - allocate both ground and 1 */ |
||||
|
ckt->CKTnodes = (CKTnode *) MALLOC(sizeof(CKTnode)); |
||||
|
if(ckt->CKTnodes == (CKTnode *)NULL) return(E_NOMEM); |
||||
|
ckt->CKTnodes->name = (char *)NULL; |
||||
|
ckt->CKTnodes->type = SP_VOLTAGE; |
||||
|
ckt->CKTnodes->number = 0; |
||||
|
ckt->CKTlastNode = ckt->CKTnodes; |
||||
|
} |
||||
|
ckt->CKTlastNode->next = (CKTnode *)MALLOC(sizeof(CKTnode)); |
||||
|
if(ckt->CKTlastNode->next == (CKTnode *)NULL) return(E_NOMEM); |
||||
|
ckt->CKTlastNode = ckt->CKTlastNode->next; |
||||
|
ckt->CKTlastNode->name = name; |
||||
|
ckt->CKTlastNode->number = ckt->CKTmaxEqNum++; |
||||
|
ckt->CKTlastNode->type = SP_VOLTAGE; |
||||
|
ckt->CKTlastNode->next = (CKTnode *)NULL; |
||||
|
|
||||
|
if(node) *node = (void *)ckt->CKTlastNode; |
||||
|
return(OK); |
||||
|
} |
||||
@ -0,0 +1,33 @@ |
|||||
|
/********** |
||||
|
Copyright 1990 Regents of the University of California. All rights reserved. |
||||
|
Author: 1985 Thomas L. Quarles |
||||
|
**********/ |
||||
|
/* |
||||
|
*/ |
||||
|
|
||||
|
/* |
||||
|
*CKTnodName(ckt) |
||||
|
* output information on all circuit nodes/equations |
||||
|
* |
||||
|
*/ |
||||
|
|
||||
|
#include "ngspice.h" |
||||
|
#include <stdio.h> |
||||
|
#include "cktdefs.h" |
||||
|
|
||||
|
|
||||
|
|
||||
|
IFuid |
||||
|
CKTnodName(CKTcircuit *ckt, register int nodenum) |
||||
|
{ |
||||
|
register CKTnode *here; |
||||
|
|
||||
|
for(here = ckt->CKTnodes;here; here = here->next) { |
||||
|
if(here->number == nodenum) { |
||||
|
/* found it */ |
||||
|
return(here->name); |
||||
|
} |
||||
|
} |
||||
|
/* doesn't exist - do something */ |
||||
|
return("UNKNOWN NODE"); |
||||
|
} |
||||
@ -0,0 +1,140 @@ |
|||||
|
/********** |
||||
|
Copyright 1990 Regents of the University of California. All rights reserved. |
||||
|
Author: 1987 Gary W. Ng |
||||
|
**********/ |
||||
|
|
||||
|
/* |
||||
|
* CKTnoise (ckt, mode, operation, data) |
||||
|
* |
||||
|
* This routine is responsible for naming and evaluating all of the |
||||
|
* noise sources in the circuit. It uses a series of subroutines to |
||||
|
* name and evaluate the sources associated with each model, and then |
||||
|
* it evaluates the noise for the entire circuit. |
||||
|
*/ |
||||
|
|
||||
|
#include "ngspice.h" |
||||
|
#include <stdio.h> |
||||
|
#include "cktdefs.h" |
||||
|
#include "devdefs.h" |
||||
|
#include "fteconst.h" |
||||
|
#include "iferrmsg.h" |
||||
|
#include "noisedef.h" |
||||
|
#include "sperror.h" |
||||
|
|
||||
|
|
||||
|
int |
||||
|
CKTnoise (CKTcircuit *ckt, int mode, int operation, Ndata *data) |
||||
|
{ |
||||
|
double outNdens; |
||||
|
int i; |
||||
|
extern SPICEdev *DEVices[]; |
||||
|
IFvalue outData; /* output variable (points to list of outputs)*/ |
||||
|
IFvalue refVal; /* reference variable (always 0)*/ |
||||
|
int error; |
||||
|
|
||||
|
outNdens = 0.0; |
||||
|
|
||||
|
/* let each device decide how many and what type of noise sources it has */ |
||||
|
|
||||
|
for (i=0; i < DEVmaxnum; i++) { |
||||
|
if ( ((*DEVices[i]).DEVnoise != NULL) && (ckt->CKThead[i] != NULL) ) { |
||||
|
error = (*((*DEVices[i]).DEVnoise))(mode,operation,ckt->CKThead[i], |
||||
|
ckt,data, &outNdens); |
||||
|
if (error) return (error); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
switch (operation) { |
||||
|
|
||||
|
case N_OPEN: |
||||
|
|
||||
|
/* take care of the noise for the circuit as a whole */ |
||||
|
|
||||
|
switch (mode) { |
||||
|
|
||||
|
case N_DENS: |
||||
|
|
||||
|
data->namelist = (IFuid *)trealloc((char *)data->namelist, |
||||
|
(data->numPlots + 1)*sizeof(IFuid)); |
||||
|
|
||||
|
(*(SPfrontEnd->IFnewUid))(ckt, &(data->namelist[data->numPlots++]), |
||||
|
(IFuid)NULL,"onoise_spectrum",UID_OTHER,(void **)NULL); |
||||
|
|
||||
|
data->namelist = (IFuid *)trealloc((char *)data->namelist, |
||||
|
(data->numPlots + 1)*sizeof(IFuid)); |
||||
|
|
||||
|
(*(SPfrontEnd->IFnewUid))(ckt, &(data->namelist[data->numPlots++]), |
||||
|
(IFuid)NULL,"inoise_spectrum",UID_OTHER,(void **)NULL); |
||||
|
|
||||
|
/* we've added two more plots */ |
||||
|
|
||||
|
data->outpVector = |
||||
|
(double *)MALLOC(data->numPlots * sizeof(double)); |
||||
|
break; |
||||
|
|
||||
|
case INT_NOIZ: |
||||
|
|
||||
|
data->namelist = (IFuid *)trealloc((char *)data->namelist, |
||||
|
(data->numPlots + 1)*sizeof(IFuid)); |
||||
|
(*(SPfrontEnd->IFnewUid))(ckt, &(data->namelist[data->numPlots++]), |
||||
|
(IFuid)NULL,"onoise_total",UID_OTHER,(void **)NULL); |
||||
|
|
||||
|
data->namelist = (IFuid *)trealloc((char *)data->namelist, |
||||
|
(data->numPlots + 1)*sizeof(IFuid)); |
||||
|
(*(SPfrontEnd->IFnewUid))(ckt, &(data->namelist[data->numPlots++]), |
||||
|
(IFuid)NULL,"inoise_total",UID_OTHER,(void **)NULL); |
||||
|
/* we've added two more plots */ |
||||
|
|
||||
|
data->outpVector = |
||||
|
(double *) MALLOC(data->numPlots * sizeof(double)); |
||||
|
break; |
||||
|
|
||||
|
default: |
||||
|
return (E_INTERN); |
||||
|
} |
||||
|
|
||||
|
break; |
||||
|
|
||||
|
case N_CALC: |
||||
|
|
||||
|
switch (mode) { |
||||
|
|
||||
|
case N_DENS: |
||||
|
if ((((NOISEAN*)ckt->CKTcurJob)->NStpsSm == 0) |
||||
|
|| data->prtSummary) |
||||
|
{ |
||||
|
data->outpVector[data->outNumber++] = outNdens; |
||||
|
data->outpVector[data->outNumber++] = |
||||
|
(outNdens * data->GainSqInv); |
||||
|
|
||||
|
refVal.rValue = data->freq; /* the reference is the freq */ |
||||
|
outData.v.numValue = data->outNumber; /* vector number */ |
||||
|
outData.v.vec.rVec = data->outpVector; /* vector of outputs */ |
||||
|
(*(SPfrontEnd->OUTpData))(data->NplotPtr,&refVal,&outData); |
||||
|
} |
||||
|
break; |
||||
|
|
||||
|
case INT_NOIZ: |
||||
|
data->outpVector[data->outNumber++] = data->outNoiz; |
||||
|
data->outpVector[data->outNumber++] = data->inNoise; |
||||
|
outData.v.vec.rVec = data->outpVector; /* vector of outputs */ |
||||
|
outData.v.numValue = data->outNumber; /* vector number */ |
||||
|
(*(SPfrontEnd->OUTpData))(data->NplotPtr,&refVal,&outData); |
||||
|
break; |
||||
|
|
||||
|
default: |
||||
|
return (E_INTERN); |
||||
|
} |
||||
|
break; |
||||
|
|
||||
|
case N_CLOSE: |
||||
|
(*(SPfrontEnd->OUTendPlot))(data->NplotPtr); |
||||
|
FREE(data->namelist); |
||||
|
FREE(data->outpVector); |
||||
|
break; |
||||
|
|
||||
|
default: |
||||
|
return (E_INTERN); |
||||
|
} |
||||
|
return (OK); |
||||
|
} |
||||
@ -0,0 +1,56 @@ |
|||||
|
/********** |
||||
|
Copyright 1990 Regents of the University of California. All rights reserved. |
||||
|
Author: 1985 Thomas L. Quarles |
||||
|
**********/ |
||||
|
/* |
||||
|
*/ |
||||
|
|
||||
|
#include "ngspice.h" |
||||
|
#include <stdio.h> |
||||
|
#include "tskdefs.h" |
||||
|
#include "ifsim.h" |
||||
|
#include "cktdefs.h" |
||||
|
#include "iferrmsg.h" |
||||
|
|
||||
|
|
||||
|
/* ARGSUSED */ |
||||
|
int |
||||
|
CKTnewTask(void *ckt, void **taskPtr, IFuid taskName) |
||||
|
{ |
||||
|
register TSKtask *tsk; |
||||
|
*taskPtr = (void *)MALLOC(sizeof(TSKtask)); |
||||
|
if(*taskPtr==NULL) return(E_NOMEM); |
||||
|
tsk = *(TSKtask **)taskPtr; |
||||
|
tsk->TSKname = taskName; |
||||
|
tsk->TSKgmin = 1e-12; |
||||
|
tsk->TSKabstol = 1e-12; |
||||
|
tsk->TSKreltol = 1e-3; |
||||
|
tsk->TSKchgtol = 1e-14; |
||||
|
tsk->TSKvoltTol = 1e-6; |
||||
|
#ifdef NEWTRUNC |
||||
|
tsk->TSKlteReltol = 1e-3; |
||||
|
tsk->TSKlteAbstol = 1e-6; |
||||
|
#endif /* NEWTRUNC */ |
||||
|
tsk->TSKtrtol = 7; |
||||
|
tsk->TSKbypass = 1; |
||||
|
tsk->TSKtranMaxIter = 10; |
||||
|
tsk->TSKdcMaxIter = 100; |
||||
|
tsk->TSKdcTrcvMaxIter = 50; |
||||
|
tsk->TSKintegrateMethod = TRAPEZOIDAL; |
||||
|
tsk->TSKmaxOrder = 2; |
||||
|
tsk->TSKnumSrcSteps = 10; |
||||
|
tsk->TSKnumGminSteps = 10; |
||||
|
tsk->TSKpivotAbsTol = 1e-13; |
||||
|
tsk->TSKpivotRelTol = 1e-3; |
||||
|
tsk->TSKtemp = 300.15; |
||||
|
tsk->TSKnomTemp = 300.15; |
||||
|
tsk->TSKdefaultMosL = 1e-4; |
||||
|
tsk->TSKdefaultMosW = 1e-4; |
||||
|
tsk->TSKdefaultMosAD = 0; |
||||
|
tsk->TSKdefaultMosAS = 0; |
||||
|
tsk->TSKnoOpIter=0; |
||||
|
tsk->TSKtryToCompact=0; |
||||
|
tsk->TSKbadMos3=0; |
||||
|
tsk->TSKkeepOpInfo=0; |
||||
|
return(OK); |
||||
|
} |
||||
@ -0,0 +1,32 @@ |
|||||
|
/********** |
||||
|
Copyright 1990 Regents of the University of California. All rights reserved. |
||||
|
Author: 1985 Thomas L. Quarles |
||||
|
**********/ |
||||
|
/* |
||||
|
*/ |
||||
|
|
||||
|
/* CKTnum2nod |
||||
|
* find the given node given its name and return the node pointer |
||||
|
*/ |
||||
|
|
||||
|
#include "ngspice.h" |
||||
|
#include <stdio.h> |
||||
|
#include "ifsim.h" |
||||
|
#include "sperror.h" |
||||
|
#include "cktdefs.h" |
||||
|
|
||||
|
|
||||
|
|
||||
|
/* ARGSUSED */ |
||||
|
CKTnode * |
||||
|
CKTnum2nod(CKTcircuit *ckt, int node) |
||||
|
{ |
||||
|
register CKTnode *here; |
||||
|
|
||||
|
for (here = ((CKTcircuit *)ckt)->CKTnodes; here; here = here->next) { |
||||
|
if(here->number == node) { |
||||
|
return(here); |
||||
|
} |
||||
|
} |
||||
|
return((CKTnode *)NULL); |
||||
|
} |
||||
Some files were not shown because too many files changed in this diff
Write
Preview
Loading…
Cancel
Save
Reference in new issue