CDSequencer.mesa (A ChipNDale module)
Copyright © 1983, 1985 by Xerox Corporation. All rights reserved.
by Christian Jacobi, June 29, 1983 2:34 pm
last edited by Christian Jacobi, April 24, 1985 11:41:11 am PST
DIRECTORY
CD;
CDSequencer: CEDAR DEFINITIONS =
BEGIN
Command: TYPE = REF CommandRec;
CommandRec: TYPE = RECORD [
a: ATOMNIL,
design: CD.Design ← NIL,
l: CD.Layer ← CD.combined,
n: CD.Number ← 0,
pos: CD.DesignPosition ← [0, 0], -- final position of command
sPos: CD.DesignPosition ← [0, 0], -- special position, start position, (exceptional: size)
orient: CD.Orientation ← CD.original,
b: BOOLEANFALSE,
ref: REFNIL, --typically describes who issued the command (viewers data field)
data: REFNIL, --reserved for command implementor
fetched: --PRIVATE-- REF READONLY CommDescriptor ← NIL --private for CDSequencerImpl
];
CommandProc: TYPE = PROC[Command];
QueueMethod: TYPE = {doQueueAndMark, doQueue, dontQueue, useDefault};
--doQueueAndMark: mark the design as changed
--the queued executions are also forked
CommDescriptor: TYPE = RECORD [p: CommandProc, qm: QueueMethod];
ExecuteProc: PROC [comm: CDSequencer.Command ← NIL, design: CD.Design ← NIL, proc: CommandProc, queue: QueueMethod ← doQueue];
--if design#NIL replaces comm.design
ExecuteCommand: PROC [comm: CDSequencer.Command ← NIL, design: CD.Design ← NIL, command: ATOM NIL, queue: QueueMethod ← useDefault];
--if command#NIL replaces comm.a
--if design#NIL replaces comm.design
ImplementCommand: PROC [a: ATOM, p: CommandProc, technology: CD.Technology←NIL, queue: QueueMethod ← doQueueAndMark];
--If technology is NIL implement for all technologies.
--Reimplementing the same atom in a technology overwrites the command;
--If the same atom is specified for a particular technology and all technologies,
--the more specific implementation wins independent of order.
--There is a (finite, short) list of atoms you can NOT use.
FetchCommand: PROC [a: ATOM, technology: CD.Technology]
RETURNS [REF READONLY CommDescriptor];
--NIL if not defined
MarkChanged: PROC [design: CD.Design];
AbortTheCommand: PROC [design: CD.Design];
Aborted: PROC [design: CD.Design] RETURNS [BOOL];
CheckAborted: PROC [design: CD.Design];
--IF Aborted[design] THEN SIGNAL TerminalIO.UserAbort
END.