DIRECTORY Rope; DynaSeerImpl: CEDAR PROGRAM IMPORTS Rope EXPORTS DynaSeer = BEGIN OPEN DynaSeer; CreateBusOp: PROC [opcode: Opcode, owner: INT, requestTime: INT] RETURNS [BusOp] ~ { RETURN [NEW[BusOpRec _ [opcode: opcode, owner: owner, requestTime: requestTime]]]; }; BusOpToHistory: PROC [busOp: BusOp] RETURNS [h: History] ~ { h _ NEW[HistoryRec[1]]; h[0] _ busOp; }; ConcatHistories: PROC [h0, h1: History] RETURNS [h: History] ~ { n0, n1: NAT; IF h0=NIL THEN RETURN [h1]; IF h1=NIL THEN RETURN [h0]; h _ NEW[HistoryRec[h0.size+h1.size]]; FOR i: NAT IN [0..h0.size) DO h[i] _ h0[i]; ENDLOOP; FOR i: NAT IN [0..h1.size) DO h[h0.size+i] _ h1[i]; ENDLOOP; }; CreateHistory: PROC [timeLimit: INT] RETURNS [history: History _ NIL] ~ { FOR time: NAT IN [0..timeLimit) DO history _ Arbiter[history]; ENDLOOP; }; Arbiter: PROC [past: History] RETURNS [history: History] ~ { FOR device: DeviceID IN DeviceID DO Cycle[device, currentCycle]; ENDLOOP; nextGrantee _ SelectNext[]; currentCycle _ requests[nextGrantee].intendedCycle; history _ AppendToHistory[past, currentCycle]; }; proba: ARRAY Opcode OF INT; thresholds: ARRAY Opcode OF INT; proba[ProcOp] _ 2; proba[Bubble] _ 2; proba[NoOp] _ 2; proba[MemOp] _ 2; maxRandom: INT; Processor: PROC [n, time: INT] RETURNS [h: History] ~ { random: INT _ Random.NextInt[randomSpace]; FOR op: Opcode IN Opcode DO IF random