<> <> <> DIRECTORY BasicTime, BitTwiddling, Core, CoreProperties, GetMe, IO, Rope, RoseBehavior, AggerLatchRoseDefs; AggerLatchRoseDetails: CEDAR PROGRAM IMPORTS GetMe, RoseBehavior = BEGIN OPEN RoseBehavior, AggerLatchRoseDefs; LatchState: TYPE = REF LatchStatePrivate; LatchStatePrivate: TYPE = RECORD [ val: PACKED SEQUENCE length: NAT OF BOOL]; EvalLatch : PROC [ argsAny, switchAny, simpleAny, strengthAny, stateAny: REF ANY, perturb: PROC [portPath: PortPath] ] = { io: REF AggerLatchSimple = NARROW[simpleAny]; drive: REF AggerLatchDrive = NARROW[strengthAny]; state: LatchState = NARROW[stateAny]; drive.load _ drive.in _ none; drive.out _ drive; IF io.load THEN FOR i: NAT IN [0 .. state.length) DO state[i] _ io.in[i] ENDLOOP; FOR i: NAT IN [0 .. state.length) DO io.out[i] _ state[i] ENDLOOP; }; CreateLatchState: PROC [argsAny: REF ANY _ NIL] RETURNS [stateAny: REF ANY _ NIL] = { rw: REF INT = NARROW[argsAny]; stateAny _ NEW [LatchStatePrivate[rw^]]; }; RegisterDetails[ "AggerLatch", NEW [DetailsRec _ [EvalSimple: EvalLatch, CreateState: CreateLatchState]], GetMe.GetVersion[] ]; END.