-- FILE: Globals.mesa
-- Last edited by Ousterhout, November 22, 1983 1:04 pm
-- This file defines the circuit data structures manipulated by
-- all of Crystal. There are three main elements in the data
-- structure describing a circuit network. Objects of type Node
-- correspond to the nets (a collection of things that are all
-- electrically connected). Each Node contains some intrinsic
-- resistance and capacitance, as well as pointers to the transistors
-- that connect to it. The pointers are stored in a linked list of
-- Pointer objects. The actual transistors are described in Fet
-- objects. Each Fet contains pointers to the nodes it connects
-- as well as information about the Fet, such as its type and
-- shape.
-- Note: all units in Crystal are as follows:
-- Capacitance: pfs
-- Resistance: ohms
-- Time: ns
-- Distance: microns
-- Area: square microns
DIRECTORY
Hash,
IO,
Rope;
Globals: CEDAR DEFINITIONS =
BEGIN
Node: TYPE = REF NodeRec;
NodeRec: TYPE = RECORD [
name: Rope.ROPE,
cap, res: REAL,
-- Intrinsic capacitance and resistance.
hiTime, loTime: REAL,
-- Worst-case rise and fall times seen for this node so far.
firstPointer: Pointer,
-- Head of list of fets connnecting to this node.
always0, always1, input, output, bus, inPath, precharged,
dynamic, watched, ratioError: BOOLEAN
-- always0 means node has been determined always to be 0.
-- always1 means node has been ddetermined always to be 1.
-- input means node is forced to either 0 or 1 by outside
-- world, but it's not known which (unless always0 or always1
-- is set)
-- output means the value of the node is used by the outside world
-- (this used in determining the signal flow)
-- bus means the node is highly capacitive (used to chop up
-- delay paths passing through the node)
-- inPath is a piece of gingerbread left around when scanning
-- depth-first through the circuit in order to prevent circular
-- searches.
-- precharged means node is set initially to 1, so consider
-- only falling times.
-- dynamic means node is a dynamic memory node.
-- watched means delays to this node should be recorded in
-- the special "watched" list.
-- ratioError means a ratio violation has been found for the node.
];
Pointer: TYPE = REF PointerRec;
PointerRec: TYPE = RECORD [
fet: Fet,
next: Pointer
];
Fet: TYPE = REF FetRec;
FetRec: TYPE = RECORD [
source, drain, gate: Node,
-- Nodes connecting to transistor.
area, aspect, x, y: REAL,
-- Location and shape of transistor:
type: INTEGER,
-- Type of transistor (index into type table).
flowFromSource, flowFromDrain, forcedOn, forcedOff, on0, on1,
onAlways, noSourceInfo, noDrainInfo: BOOLEAN,
-- Various flags for transistors:
-- flowFromSource means information can potentially flow through
-- the fet from the source side.
-- flowFromDrain means the same thing, except other side.
-- forcedOn means the transistor has been determined through
-- simulation always to be turned on.
-- forcedOff means the transistor has been determined through
-- simulation always to be turned off.
-- on0, on1, and onalways are copies of the corresponding
-- bits from the transistor's type.
-- noSourceInfo means there is an "In" attribute attached to the
-- transistor's drain or an "Out" attribute attached to its source.
-- This flag prevents the flowFromSource flag from ever being
-- set in the mark package.
-- noDrainInfo means the same thing except for the transistor's drain.
firstFlow: FlowPtr
-- Pointer to first in list of flow records attached to this transistor.
];
-- The following definitions are for data structures that are used to
-- control information flow through complex transistor structures.
-- Since a transistor may have several flow attributes attached to it,
-- there are two different data structures. FlowCtls correspond to the
-- controlling records, and FlowPtrs are used to link together all of
-- the FlowCtls for a particular transistor.
FlowCtl: TYPE = REF FlowRec;
FlowRec: TYPE = RECORD [
name: Rope.ROPE,
entered, left: Node,
-- Entered is normally NIL. It is non-NIL if the current path
-- requires information to enter the side of the transistor labelled
-- with this attribute. In this case, entered refers to the node
-- from which info flowed into this fet. Left has the same
-- interpretation, except that it is non-NIL only when the current
-- path requires information to leave the tagged side of the fet.
inOnly, outOnly, ignore, off: BOOLEAN
-- These four flags are set by the "flow" command. InOnly
-- means Crystal should never allow information to flow in
-- to the transistor from the unnamed side. OutOnly means
-- Crystal should never allow information to flow out from
-- the unnamed side. Ignore means the flow attribute should
-- be ignored completely, thereby permitting arbitrary flow
-- with respect to this attribute. Out means Crystal should not
-- allow any information flow through this transistor at all.
];
FlowPtr: TYPE = REF FlowPtrRec;
FlowPtrRec: TYPE = RECORD [
flow: FlowCtl,
-- Pointer to the flow record.
next: FlowPtr,
-- Next pointer in chain of those attached to this transistor.
source, drain: BOOLEAN
-- Selects which transistor terminal the flow attribute is
-- attached to.
];
-- The following data structure is used to keep track of a single
-- stage in a delay path. A stage is a path from a source of Vdd
-- or Ground through transistor channels to a destination node
-- (a gate or output). The delay module collects information about
-- the transistors and nodes in the stage, then calls the model
-- routines to compute the actual delay. Delay calculation for a
-- stage is normally stimulated by a chnage in the value of a transistor
-- gate somewhere along the stage. This transistor is called the
-- trigger. Information about the stage is divided into two pieces:
-- one piece between the trigger and Vdd or Ground, including
-- the trigger (called piece1); and one piece between the trigger
-- and the destination gate (called piece2). Each piece is limited
-- in length to pieceLimit transistors in series. Within each piece,
-- the fets and nodes are in order emanating out from the trigger.
-- In piece1, node[i] is the one between fet[i] and fet[i+1], with
-- the last node being the information source. In piece2, fet[i] is
-- between node[i] and node[i+1]. The last node is the destination
-- and the last fet in piece2 is NIL. Some stages don't have trigger
-- transistors: examples are stages being driven by loads (the trigger
-- is off to the side of the stage) and stages driven by an input or
-- a bus through a pass transistor (the input or bus triggers the
-- change, but there's no trigger transistor). In these cases, piece1Size
-- is zero.
pieceLimit: INT = 8;
Stage: TYPE = REF StageRec;
StageRec: TYPE = RECORD [
piece1Size, piece2Size: INT,
-- Number of nodes in each piece.
time: REAL,
-- Time when stage finishes rising or falling.
edgeSpeed: REAL,
-- Slope of stage's waveform, in ns/volt.
rise: BOOLEAN,
-- TRUE means stage rises, FALSE means it falls.
prev: Stage,
-- Pointer to stage that triggers this stage, or NIL.
piece1Fet, piece2Fet: ARRAY[0..pieceLimit) OF Fet,
piece1Node, piece2Node: ARRAY[0..pieceLimit) OF Node
-- The nodes and feets for each of the pieces.
];
-- The data structure defined below is used to hold the arguments
-- from a command line, in a linked list. Each rope contains one
-- argument. An argument may either be a switch ("-" followed by
-- a single character) or something else (anything not starting with
-- a "-").
Arg: TYPE = REF ArgRec;
ArgRec: TYPE = RECORD [
rope: Rope.ROPE,
next: Arg
];
-- The following defines the command interpretation procedures.
CmdProc: TYPE = PROC[args: Arg];
-- Global variables:
VddNode, GroundNode: Node;
NodeTable: Hash.Table;
StdOut: IO.STREAM;
DupsOK: BOOLEAN; -- FALSE means avoid duplications in output.
Stop: REF BOOLEAN; -- TRUE means user buttoned STOP! button.
END.