This repository has been archived by the owner on Nov 10, 2022. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 1
/
README
417 lines (298 loc) · 16.4 KB
/
README
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
Source: http://www.thedigitalmachine.net/eispice.manual.html
-----
TABLE OF CONTENTS:
* Introduction
* Features
* Usage
* The Circuit
* Devices
* Utilities
-----
INTRODUCTION:
*** NOTE ***
This manual is far from complete. For anything not covered by this manual you can refer to the python doc-strings and the examples (and/or feel free to ask any questions you may have on the eispice mailing list). You can access the doctrings by either using the built-in python help function or by using the stand-alone pydoc utility that comes with Python (thanks Thomas for finding this tool).
$ pydoc -g
Available with Python2.x. Opens a GUI where you can enter a search string e.g. "eispice". This opens your web browser and shows the eispice docstrings in HTML.
Alternatively you can start a pydoc server:
$ pydoc -p 8099
This lets you access all python documentation via http://localhost:8099.
Status of This Document:
eispice is still being actively developed and as a result this User's Manual is a continuous work in progress. It doesn't describe the entire functionality of the tool and it may have glaring technical inaccuracies (and more likely glaring grammatical errors). If you find any please let me know, by either posting to the Mailing List or sending me an email at: [email protected] .
This document only applies to the most recent version of eispice, if you're using an older version please upgrade to the most recent version.
Purpose:
eispice is a clone of the Berkley Spice 3 Simulation Engine optimized for High Speed Digital Design with a Python based front-end. It contains a subset of standard spice3 device models and a set of unique models e.g. direct IBIS model support, Python based Behavioral models, etc. The purpose of this document is to provide a reference for eispice Users. Those new to eispice may want to also check out the Tutorials and the example scripts in the test/recursion folder of the source-code distribution.
Intended Audience:
The indented audience for this document is the eispice user (development documents are stored separately). A basic understanding of Berkley Spice 3 is assumed, for an introduction to Spice take a look at Spice Opus. A basic understanding of Python is also assumed. If you are new to Python you may want to take a look at a Python Tutorial.
If you've never used Python before don't let it scare you off. It shouldn't take more than a half hour or so for you to pick up enough Python to get a simulation running and hopefully you find it much more powerful, and liberating compared to basic spice syntax.
-----
FEATURES:
The following lists highlight some common and unique features of eispice:
Spice3 Features:
Transient Analysis And Operating Point Analysis
B - Non-linear current and voltage source models.
I and V - Independent Source Models
R, L, and C - Device Models
T - Lossless Transmission Line Model
D - Diode Model
Subckt support (same functionality with a very different syntax).
Supports a simple plotter (Tk based).
Unique Features:
Access to the Python Language to manipulate Spice Decks and results.
Contains an IBIS model import tool plus driver, receiver, and pin models.
Uses the SuperLU Matrix Library.
A piece-wise cubic-spline extension of the traditional pwl, same usage except pwc keyword is used.
New device models for VI Curves, and TA x VI Curves
Improved B-Element that includes a time variable.
B-Element based on a Python call-back, i.e. can use Python statements within a B-element model.
Plus many more additions and improvements.
-----
USAGE:
Installation:
For Windows users eispice is distributed as a binary installation executable. It can be installed / uninstalled like any other Windows application. Simply download and install the Windows version of Python 2.5, download and install the Windows version of Numpy and then download and install the Windows Binary version of eispice.
For other systems, i.e. Linux, eispice is distributed as source code. You will need to compile and install it before using it. You can also be compile from source on a Windows system using a gcc based compiler, like the gcc compiler that comes with cygwin, or mingw.
To install eispice from the source code distribution, download the most recent release from the Download Page. Uncompress it "tar xvjf eispice-x.x.tar.bz2". Cd into the new eispice directory and run "make install". This will put the eispice binaries in your local Python library repository.
As of release 0.9 in order to use eispice you will need to have Python and the Numpy and Scipy Python Module installed on your system.
Running eispice:
Fire up Python, i.e. run "python" (on some systems python2, as python3.x is the default python version) from the command line and then import the eispice module with a "import eispice" command. Then you're off to the races, check out the Python scripts in the test/pass directory for some examples, or try out the example below or use the help command for up to data and maybe more detailed help, i.e. help(eispice), help(eispice.device), etc...
Example:
Before jumping into the nitty-gritty of eispice here's a simple example that should give you a taste of what you're up against, enter it into a text file and run it with a python myfile.py command or run the python interpreter with a "python" command at the command line and enter it line by line:
import eispice
cct = eispice.Circuit("Capacitor Test")
cct.Vx = eispice.V(1, eispice.GND, 4,
eispice.Pulse(4, 8, '10n', '2n', '3n', '5n', '20n'))
cct.Cx = eispice.C(1, eispice.GND, '10n')
cct.tran('0.5n', '100n')
eispice.plot(cct)
Basic Statement Types:
Much like spice3 eispice statements come in 3 flavors. There are component definition commands which consist of a device names, types, connection nodes (strings or integers that represent node names), and parameter values. There are analysis commands, to run the Transient and Operating Point Analysis, and there are post processing commands, like plot.
Most parameters can be defined as floating point numbers, i.e. 1.0, 13-9, etc. or strings with units, i.e. '10nF'.
Node names may be arbitrary character strings, or integer values. The datum (ground) node must be named 0, '0', or eispice.GND.
-----
THE CIRCUIT:
The Circuit is the main eispice class. In your average simulation, devices are added to a circuit, a simulation is run, and then the results are plotted or manipulated to determine some sort of characteristic of the circuit, e.g. under-shoot. Once a simulation has been run new devices can't be added, and devices can never be removed, but most parameter values can be changed and new simulations run on the same circuit, e.g. running through a series of termination resistor values to find which one minimizes under-shoot.
To create a new circuit simply call it's constructor, the only argument is the circuit title.:
cct = eispice.Circuit("Title")
To add a device to a circuit set a new device name to be equal to either pre-defined device, or a new device, e.g.
cct.R1 = Rx , or...
cct.R2 = eispice.R(2, 0, '20kOhm')
For more details on device specifics refer to the Device Sections below.
To run an analysis on a circuit call the analysis method, e.g.:
cct.tran('0.1n', '100n')
result = cct.results
For more details refer to the Analysis Section below.
To retrieve the results you can access the results member of the deck class which is a Numpy array, e.g.
print cct.results
There is list of result headings called names, the list index corresponds to a row index in the results array, and the list value is a string representing the row name, e.g.
column = cct.names.index('v(1)') or...
name = cct.names[column]
Circuit Class Methods:
_init__(self, title='eispice')
Circuit constructor.
Arguments:
title -- String containing the circuit's name.
__setattr__(self, name, value)
Adds a device to the circuit, if it's a dictionary of devices
like a Subckt it adds all of the devices in the dict.
check(self, name, value, type='v')
Raises an exception if the value of the variable at 0 seconds
does not equal the value supplied plus / minus 0.00001%.
Arguments:
name -- name of the node or device
value -- value to check against
type -- either Voltage or Current
current(self, *variables)
Returns an array where the first column is time, and the subsequent
columns are the value of the current through each listed device.
Currents are only calculated through voltage sources and inductors
(plus a few other special devices).
devices(self)
Prints a list of the devices in the circuit.
op(self)
Runs an Operating Point analysis and sets the value of the circuit's
results array accordingly. It is equivalent to the Spice3 op command.
tran(self, tstep, tstop, tmax=0.0)
Runs a Transient analysis and sets the value of the circuit's
results array accordingly. It is equivalent to the Spice3 tran
command.
Arguments:
tstep -- desired plotting increment, the actual time-steps will
vary from step to step, this is simply a suggestion
tstop -- the last time point to simulate
tmax -- maximum step size, it is set to tstep if not defined or 0.0
voltage(self, *variables)
Returns a results array where the first column is time, and the
subsequent columns are the value of the voltage at each listed node.
Circuit Class Data:
results
Results of the last simulation.
title
Circuit Title
variables
List that contains the column headers for the results array.
-----
DEVICES:
Resistor:
Syntax: R('pNode', 'nNode', resistance (Ohms))
Example: Rx = eispice.R('pNode', 'nNode', 10)
Parameters:
x.R --> Resistance
Inductor:
Syntax: L('pNode', 'nNode', inductance (Henrys))
Example: Lx = eispice.L('pNode', 'nNode', '10nH')
Parameters:
x.L --> Inductance
Capacitor:
Syntax: C('pNode', 'nNode', capacitance (Farads))
Example: Cx = eispice.C('pNode', 'nNode', '10pF')
Parameters:
x.C --> Capacitance
Source:
Syntax: (V or I)('pNode', 'nNode', DC, wave-opt.)
Examples:
Vx = eispice.V('pNode', 'nNode', 10)
Ix = eispice.I('pNode', 'nNode', -2, wave.pulse(2, 4))
Parameters:
x.DC --> DC Value
x.wave --> Optional Waveform
The optional waveform can be any of the objects listed below.
Waveforms:
All of the basic waveforms reside in the "wave" module so waveform declarations must be preceded by "wave.".
Sinusoidal:
Syntax: Sin(Vo, Va, Freq-opt., Td-opt., Theta-opt.)
Example: s = eispice.Sin(10, 20, '10M')
Parameters:
x.Vo --> Offset
x.Va --> Amplitude
x.Fc --> Frequency, def. 1/tstop
x.Td --> Delay, def. 0.0
x.DF --> Damping Factor, def. 0.0
Single Frequency FM:
Syntax: SFFM(Vo, Va, Freq-opt., MDI-opt., Fs-opt.)
Example: s = eispice.SFFM(10, 20, '10M')
Parameters:
x.Vo --> Offset
x.Va --> Amplitude
x.Fc --> Carrier Frequency, def. 1/tstop
x.MDI --> Modulation Index, def. 0.0
x.Fs --> Signal Frequency, def. 1/tstop
Exponential:
Syntax: Exp(V1, V2, Td1-opt., Tau1-opt., Td2-opt., Tau2-opt.)
Example: s = eispice.Exp(0, 4, '5n', '2n', '25n', '5n')
Parameters:
x.V1 --> Initial Value
x.V2 --> Pulsed Value
x.Td1 --> Rise Delay Time, def. 0.0
x.Tau1 --> Rise Time Constant, def. tstep
x.Td2 --> Fall Delay Time, def. td1 + tstep
x.Tau2 --> Fall Time Constant, def. tstep
Pulse:
Syntax: Pulse(V1, V2, Td-opt., Tr-opt., Tf-opt., PW-opt., Per-opt.)
Example: s = eispice.Pulse(4, 8, '10n', '2n', '3n', '5n', '20n')
Parameters:
x.V1 --> Initial Value
x.V2 --> Pulsed Value
x.Td --> Delay Time, def. 0.0
x.Tr --> Rise Time, def. tstep
x.Tf --> Fall Time, def. tstep
x.PW --> Pulse Width, def. tstop
x.Per --> Period, def. tstop
Gaussian Pulse:
Syntax: Gauss(V1, V2, Td-opt., Tr-opt., Tf-opt., PW-opt., Per-opt.)
Example: s = eispice.Gauss(4, 8, '10n', '2n', '3n', '5n', '20n')
Parameters:
x.V1 --> Initial Value
x.V2 --> Pulsed Value
x.Td --> Delay Time, def. 0.0
x.Tr --> Rise Time, def. tstep
x.Tf --> Fall Time, def. tstep
x.PW --> Pulse Width, def. tstop
x.Per --> Period, def. tstop
Piece-Wise (Linear or C-Spline):
Syntax: (PWL or PWC)([[x0,y0],[x1,y1],...])
Example:
data = [
['2n', 4],
['12n', 3],
['50n', 20],
['75n', -20],
['95n', -22]]
s = eispice.PWL(data)
Parameters:
x.type --> 'l' = linear, 'c' = cspline, readonly
x.pw --> data array, readonly
Nonlinear Source:
Syntax: B('pNode', 'nNode', type, equation)
Example: Bx = eispice.B('2', GND, 'i', "4.7 * uramp(v(2,0))")
Parameters:
x.type --> 'i' or 'v', readonly
x.equation --> equation string, readonly
This is the most versatile device (and the easiest to abuse). This device should behave the same as the B element in Spice 3, i.e. it should be possible to cut and paste B element equations from spice 3 into this B elements equations string.
The equation string can consist of any of the following functions and operators: abs(), acosh(), acos(), asinh(), asin(), atanh(), atan(), cosh(), cos(), exp(), ln(), log(), sinh(), sin(), sqrt(), tan(), uramp(), u(), +, -, *, /, ^.
The function "u" is the unit step function, with a value of one for arguments greater than one and a value of zero for arguments less than zero. The function "uramp" is the integral of the unit step: for an input x, the value is zero if x is less than zero, or if x is greater than zero the value is x.
It is also possible to add a time variable to the B element equations using the keyword time, i.e. eispice.B(2, 0, device.Voltage, 'sin(2*3.14159*100e6*time)')
Nonlinear Capacitor:
Syntax: BC('pNode', 'nNode', type, equation)
Example: BCx = eispice.BC('2', GND, 'i', "4.7 * uramp(v(2,0))")
Parameters:
x.type --> 'i' or 'v', readonly
x.equation --> equation string, readonly
Refer to the Nonlinear Source.
Python Based Behavioral Model:
Syntax: PyB('pNode', 'nNode', type, variables, callback)
Example:
class MyDevice(eispice.PyB):
def __init__(self, pNode, nNode):
dev.PyB.__init__(self, pNode, nNode, Current, v(pNode), v(nNode), Time)
def model(self, vP, vN, time):
if time > 10e-9:
return 2 * (vP - vN)
else:
return 0.0
d = Deck("Call-Back Time Test")
d.Vx = eispice.V(1, 0, 4)
d.PyBx = MyDevice(1, 0)
Parameters:
x.type --> 'i' or 'v', readonly
This device is intended as a version of the B-Element that can make use of python commands. It provides an inheritable class that can be used to define Python based Behavioral models. The constructor takes as arguments, the positive node, the negative node, the type (Voltage or Current), and a list of node voltages, source currents, or 'Time' to be passed to the defined callback function, which is called model and should be part of the new device class.
Transmission Line:
Syntax: T('pNode0', 'nNode0', 'pNode1', 'nNode1', Z0, Td, loss-opt.)
Example: eispice.T('vi', GND, 'vo', GND, 50, '5n', 0.5)
Parameters:
x.Z0 --> Characteristic Impedance
x.Td --> Time Delay
x.loss --> Loss Factor Times Length
VI Curve:
Syntax: VI('pNode', 'nNode', VI-PW, TA-PW-opt.)
Example:
viData = [
[-10, -10],
[-5, -2],
[0, 1],
[1, 3],
[5, 8],
[10, 10],
[12, 8]]
taData = [
[0, 1.0],
['25n',0.52],
['100n', 0.0]])
VIx = eispice.VI(1, GND,eispice.PWL(viData), eispice.PWC(taData))
Parameters:
x.VI --> VI Piece-Wise Object
x.TA --> TA Piece-Wise Object
The optional TA Piece-Wise element multiplies the VI curve by the A factor depending on the simulation time, T. It is used for the basis of the IBIS model driver. If not included the element behaves like a run-of-the-mill VI Curve (also used for IBIS elements).
-----
UTILITIES:
There are a handful of functions that are part of the eispice module that can be used to help out during a simulation (mostly for debug purposes).
Log File:
Syntax: logFile(filename)
Example: logFile("crud.log")
Usually the simulator library prints it's log messages (and debug messages if they are turned on with a compile-time option) to std-out, this function can be used to output the messages to a file instead.
Error File:
Syntax: errorFile(filename)
Example: errorFile("crud.err")
Usually the simulator library prints it's error and warning messages to std-err, this function can be used to output the messages to a file instead.
About:
Syntax: about()
Prints some library version information.
....TBC