-- sim-tsim.mesa
-- last edited by Suzuki: December 1, 1981 3:28 PM
DIRECTORY
stdio USING [FILE],
StreamDefs;
SimTsim: DEFINITIONS = { OPEN stdio;
-- #include <stdio.h>
-- header for event driven mosfet simulator. Chris Terman (2/80)
nptr: TYPE = LONG POINTER TO Node;
tptr: TYPE = LONG POINTER TO Trans;
-- #ifdef TIMING
--Node: TYPE = RECORD [
-- flink,blink: nptr; doubly-linked event list
-- ngate: tptr; list of gates connected to this node
-- nsource: tptr; list of sources connected to this node
-- ndrain: tptr; list of drains connected to this node
-- hnext: nptr; link in hash bucket
-- nlink: nptr; sundries list
-- ncap: REAL; capacitance of node in pf*/
-- nresist: REAL; total resistance of node material(s) in ohms
-- presist: REAL; resistance to vdd for pulled up node in ohms
-- ntime: LONG CARDINAL; time, in DELTAs, node was last scheduled in simulation
-- npot: CHARACTER; current potential
-- nflags: CHARACTER; flag word (see defs below)
-- nname: STRING; asciz name of node
--];
--
--Trans: TYPE = RECORD [
-- trans: RECORD [ gate,source,drain: nptr; nodes to which trans is connected
-- glink,slink,dlink: tptr; link in node connection list
-- tresist: REAL; resistance across transistor
-- ];
--];
-- #else
Node: TYPE = MACHINE DEPENDENT RECORD [
elink: nptr, -- event list
ngate: tptr, -- list of gates connected to this node
nsource: tptr, -- list of sources connected to this node
ndrain: tptr, -- list of drains connected to this node
hnext: nptr, -- link in hash bucket
nlink: nptr, -- sundries list
ncap: REAL, -- capacitance of node in pf
ndef: tptr, -- functional definition of node
nfuns: tptr, -- list of functions for which this node is an input
fpotfill: [0..3B],
marked, xqueued, named, pullup, input, watched, traced, warned: BOOLEAN, -- flags
npot: Potential, -- current potential
fpot: FunctionValue,
changecount: CARDINAL, -- counter for the number of charge changes of this node
-- the following two fields are used to detect the multiple changes
-- of the potentials in one step
stepcount: CARDINAL, -- the last step when this node was changed
lastpot: Potential, -- the last non-X potential of this node
fill: [0..7777B],
nname: STRING, -- asciz name of node
xpos,ypos: REAL
];
Trans: TYPE = RECORD[
SELECT OVERLAID * FROM
trans => [
gate,source,drain: nptr, -- nodes to which trans is connected
glink,slink,dlink: tptr -- link in node connection list
],
function => [
orlink,andlink: tptr, -- other pieces of function defn
vlink: tptr, -- other funs of this input variable
output,variable: nptr -- name of output and this input
],
ENDCASE
];
-- #endif
uptr: TYPE = LONG POINTER TO Usymbol;
Usymbol: TYPE = RECORD [
unext: uptr, -- next record in hash bucket
uname: STRING, -- asciz for user symbol name
unode: nptr -- node for which name is pseudonym
];
wptr: TYPE = LONG POINTER TO Wnode;
Wnode: TYPE = RECORD [
wnext: wptr,
wname: STRING
];
NINPUTS: CARDINAL = 100;
-- node potentials
Potential: TYPE = {INIT, DX, DHIGH, DLOW, CX, CHIGH, CLOW, P, DXLOW, DXHIGH, CSHARE};
NPOTS: CARDINAL = 11; -- number of possible potentials
--INIT = 0; initial value for accumulator = '-
--DX = 1; driven unknown = 'X
--DHIGH = 2; driven high = '1
--DLOW = 3; driven low = '0
--CX = 4; charged unknown = 'X
--CHIGH = 5; charged high = '1
--CLOW = 6; charged low = '0
--P = 7; pulled high = '1
--DXLOW = 8; resistively connected to DL = 'X
--DXHIGH = 9; resistively connected to DH = 'X
--CSHARE = 10; shared charge = 'S
-- translation of potential to function value
FunctionValue: TYPE = {FL, FX, NotFX, FH};
NotFL: FunctionValue = FH;
NotFH: FunctionValue = FL;
--FL = 0;
--NotFL = 177777B - FL;
--FH = 3;
--NotFH = 177777B - FH;
--FX = 1;
--NotFX = 177777B - FX;
MaxTargv: CARDINAL = 53;
extension: PROC[INTEGER, POINTER TO ARRAY [0..MaxTargv) OF STRING];
-- makeGates: PROC;
-- Declared in simnsim
debug: INTEGER;
GNDNode: nptr;
outfile: FILE; -- current output file
-- MOSSIM.log
log: StreamDefs.DiskHandle;
traceNumber: CARDINAL;
hinputs: ARRAY [0..NINPUTS) OF nptr; -- list of nodes to be driven high
nhinputs: INTEGER; -- number of entries in hinputs
linputs: ARRAY [0..NINPUTS) OF nptr; -- list of nodes to be driven low
nlinputs: INTEGER; -- number of entries in linputs
xinputs: ARRAY [0..NINPUTS) OF nptr; -- list of nodes just removed from input lists
nxinputs: INTEGER; -- number of entries in xinputs
pchars: ARRAY Potential OF CHARACTER = [ '-, 'X, '1, '0, 'X, '1, '0, '1, 'X, 'X, 'S ];
potential: ARRAY Potential OF STRING;
pnode: PROC[n: nptr] RETURNS [STRING];
ptrans: PROC[t: tptr];
walkNet: PROC[func: PROC[nptr] RETURNS[CARDINAL]] RETURNS[CARDINAL];
pvalue: PROC[n: nptr];
parseLine: PROC[line: STRING];
GateState: TYPE = {RESIST, ON, OFF};
-- RESIST = 0;
-- ON = 1;
-- OFF = 2;
-- Declared in simttable
transTbl: ARRAY GateState OF ARRAY Potential OF ARRAY Potential OF Potential;
}.