<<>> <> <> <> <> <> DIRECTORY Basics USING [LongNumber], IntCodeDefs USING [Label, Location, Node, NodeList, Var, VarList, Word]; IntCodeUtils: CEDAR DEFINITIONS = BEGIN OPEN IntCodeDefs; <> zone: ZONE; <> <> Visitor: TYPE = PROC [node: Node] RETURNS [Node]; <> <<>> MapNode: PROC [node: Node, visitor: Visitor]; <> MapNodeList: PROC [nodeList: NodeList, visitor: Visitor]; <> MapVarList: PROC [varList: VarList, visitor: Visitor]; <> MapLocation: PROC [location: Location, visitor: Visitor]; <> <<>> VisitLabels: PROC [node: Node, visitor: LabelVisitor, fullTree: BOOL, visitNIL: BOOL ¬ FALSE]; <> LabelVisitor: TYPE = PROC [label: Label, node: Node, define: BOOL] RETURNS [Label]; <> <<>> <> NodeListCons: PROC [first: Node, rest: NodeList ¬ NIL] RETURNS [NodeList]; NodeListTail: PROC [list: NodeList] RETURNS [NodeList]; VarListCons: PROC [first: Var, rest: VarList ¬ NIL] RETURNS [VarList]; VarListTail: PROC [list: VarList] RETURNS [VarList]; <<>> <> PrincOpsHost: BOOL = (BITS[WORD] = 16); SwapWords: PROC [w: Basics.LongNumber] RETURNS [Basics.LongNumber] = INLINE { RETURN[[pair[w.hi, w.lo]]]; }; WordToInt: PROC [w: Word] RETURNS [INT] = INLINE { IF PrincOpsHost THEN RETURN[SwapWords[LOOPHOLE[w]].int] ELSE RETURN[LOOPHOLE[w]]; }; IntToWord: PROC [i: INT] RETURNS [Word] = INLINE { IF PrincOpsHost THEN RETURN[SwapWords[LOOPHOLE[i]].bits] ELSE RETURN[LOOPHOLE[i]]; }; WordToCard: PROC [w: Word] RETURNS [CARD] = INLINE { IF PrincOpsHost THEN RETURN[SwapWords[LOOPHOLE[w]].card] ELSE RETURN[LOOPHOLE[w]]; }; CardToWord: PROC [c: CARD] RETURNS [Word] = INLINE { IF PrincOpsHost THEN RETURN[SwapWords[LOOPHOLE[c]].bits] ELSE RETURN[LOOPHOLE[c]]; }; WordToReal: PROC [w: Word] RETURNS [REAL] = INLINE { IF PrincOpsHost THEN RETURN[SwapWords[LOOPHOLE[w]].real] ELSE RETURN[LOOPHOLE[w]]; }; RealToWord: PROC [r: REAL] RETURNS [Word] = INLINE { IF PrincOpsHost THEN RETURN[SwapWords[LOOPHOLE[r]].bits] ELSE RETURN[LOOPHOLE[r]]; }; <> SideEffectFree: PROC [node: Node, noSignals: BOOL] RETURNS [BOOL]; <> <> SideEffectFreeList: PROC [nodes: NodeList, noSignals: BOOL] RETURNS [BOOL]; <> <> SimplyEqual: PUBLIC PROC [n1, n2: Node] RETURNS [BOOL]; <> SimplyEqualList: PUBLIC PROC [nl1, nl2: NodeList] RETURNS [BOOL]; <> IsSimple: PUBLIC PROC [node: Node, level: SimplicityLevel] RETURNS [BOOL]; <> IsSimpleList: PUBLIC PROC [list: NodeList, level: SimplicityLevel] RETURNS [BOOL]; <> SimplicityLevel: TYPE = RECORD [ derefs: [0..4) ¬ 0, <> simpleOps: [0..4) ¬ 0, <> <<(any procedure call is not simple, indexing is a simple op)>> noSignals: BOOL ¬ FALSE, <> maxBits: CARD16 ¬ 0 < no limit)>> ]; <<>> <> <> <> <<>> IdTab: TYPE = REF IdTabRep; IdTabRep: TYPE = RECORD [ entries: INT ¬ 0, data: REF ¬ NIL ]; Id: TYPE = INT; Value: TYPE = REF; NullValue: Value = NIL; NewIdTab: PROC RETURNS [IdTab]; <> Fetch: PROC [idTab: IdTab, id: Id] RETURNS [Value]; <> Store: PROC [idTab: IdTab, id: Id, val: Value ¬ NullValue] RETURNS [Value]; <> Insert: PROC [idTab: IdTab, id: Id, val: Value] RETURNS [Value]; <> Enumerate: PROC [idTab: IdTab, visitor: IdTabVisitor]; IdTabVisitor: TYPE = PROC [id: Id, value: Value] RETURNS [stop: BOOL ¬ FALSE]; <> END.