-- 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;
 
}.