<> <> DIRECTORY IO, Random, Rope, RoseClocks, RoseCreate, RoseRun, RoseReadSim, RoseTypes, SwitchTypes; ArbTest: CEDAR PROGRAM IMPORTS IO, RoseCreate, RoseReadSim, RoseRun, SwitchTypes = BEGIN OPEN RoseCreate, RoseRun, RoseTypes; DataBits: CARDINAL = 8; AddressBits: CARDINAL = 2; MemLength: CARDINAL = TwoToThe[AddressBits]; CmdBits: CARDINAL = 2; BusWidth: CARDINAL = DataBits + AddressBits + CmdBits; Modules: CARDINAL = 3; Clients: CARDINAL = 16; inputH: SwitchTypes.SwitchVal = [[input, input, none], H]; inputL: SwitchTypes.SwitchVal = [[input, none, input], L]; driveH: SwitchTypes.SwitchVal = [[drive, drive, none], H]; driveX: SwitchTypes.SwitchVal = [[drive, drive, drive], X]; driveL: SwitchTypes.SwitchVal = [[drive, none, drive], L]; ClientIndex: TYPE = [0 .. Clients); ArbIO: TYPE = REF ArbIORep; ArbIORep: TYPE = MACHINE DEPENDENT RECORD [ <> PhA(0:16-SwitchTypes.bitsPerSwitchVal..15): SwitchTypes.SwitchVal, <> PhB(1:16-SwitchTypes.bitsPerSwitchVal..15): SwitchTypes.SwitchVal, <> NewRqBar(2:16-SwitchTypes.bitsPerSwitchVal..15): SwitchTypes.SwitchVal, clients(3:0..511): ARRAY ClientIndex OF Client]; Client: TYPE = MACHINE DEPENDENT RECORD [ <> RqBar(0:16-SwitchTypes.bitsPerSwitchVal..15): SwitchTypes.SwitchVal, <> GnBar(1:16-SwitchTypes.bitsPerSwitchVal..15): SwitchTypes.SwitchVal]; CreateArbIO: PROC [ct: CellType] RETURNS [ioAsAny: REF ANY] --IOCreator-- = BEGIN ioAsAny _ NEW [ArbIORep]; END; ArbState: TYPE = REF ArbStateRep; ArbStateRep: TYPE = RECORD [ startAt: ClientIndex _ 0, hasGrant: [0 .. Clients] _ Clients]; InitializeArb: Initializer--PROC [cell: Cell, initData: REF ANY, leafily: BOOLEAN]-- = BEGIN IF leafily THEN cell.realCellStuff.state _ NEW [ArbStateRep _ []]; END; <> <> <> <> <> <> <> <> <<{FOR client: ClientIndex IN ClientIndex DO>> <> <> <> <> <> <> <> <> <> <> <> <> <> <> <<{hasGrant _ client; startAt _ (hasGrant+1) MOD Clients; EXIT};>> <> <> <> <> ExpandArb: PROCEDURE [thisCell: Cell, to: ExpansionReceiver] --ExpandProc-- = BEGIN RoseReadSim.ReadSim[to: to, within: thisCell, fileName: "Passarb.sim", smallNode: 0.02, bigNode: 0.3]; END; TestArbiter: PROC [handle: CellTestHandle, testeeType: CellType, testData, io, driveAsAny, stateAsAny: REF ANY] --CellTestProc-- = BEGIN instructions: ArbIO _ NARROW[io]; BEGIN OPEN instructions; Cycle: PROC = BEGIN PhA _ inputH; PhB _ inputL; [] _ Eval[handle]; PhA _ inputL; [] _ Eval[handle]; PhB _ inputH; [] _ Eval[handle]; PhB _ inputL; [] _ Eval[handle]; END; NewRqBar _ inputL; FOR ci: ClientIndex IN ClientIndex DO clients[ci].RqBar _ inputH; ENDLOOP; clients[0].RqBar _ inputL; Cycle[]; Cycle[]; Cycle[]; FOR ci: ClientIndex IN ClientIndex DO IF clients[ci].GnBar.val # (IF ci = 0 THEN L ELSE H) THEN ERROR; ENDLOOP; END; END; ExpandArbTest: PROCEDURE [thisCell: Cell, to: ExpansionReceiver]--ExpandProc-- = BEGIN PhA: Node _ to.class.NodeInstance[to.instance, "PHASEA", SwitchTypes.bitType, NIL, NIL, SwitchTypes.refInput]; PhB: Node _ to.class.NodeInstance[to.instance, "PHASEB", SwitchTypes.bitType, NIL, NIL, SwitchTypes.refInput]; Requests, Grants: ARRAY ClientIndex OF Node; NewRqBar: Node _ to.class.NodeInstance[to.instance, "NEWRQ'", SwitchTypes.bitType, "L", NIL, SwitchTypes.refInput]; FOR client: ClientIndex IN ClientIndex DO Requests[client] _ to.class.NodeInstance[to.instance, IO.PutFR["RQ%02g'", IO.card[client]], SwitchTypes.bitType, "H", NIL, SwitchTypes.refInput]; Grants[client] _ to.class.NodeInstance[to.instance, IO.PutFR["GP%02g'", IO.card[client]], SwitchTypes.bitType, "H"]; ENDLOOP; [] _ to.class.CellInstance[to.instance, "Arbiter", "Arbiter", ""]; END; Setup: PROC = BEGIN arbPorts: Ports _ NEW [PortsRep[35]]; arbPorts[0] _ [0, 1, "PHASEA", SwitchTypes.bitType, TRUE, TRUE]; arbPorts[1] _ [1, 1, "PHASEB", SwitchTypes.bitType, TRUE, TRUE]; arbPorts[2] _ [2, 1, "NEWRQ'", SwitchTypes.bitType, TRUE, TRUE]; FOR client: ClientIndex IN ClientIndex DO arbPorts[3+2*client] _ [3+2*client, 1, IO.PutFR["RQ%02g'", IO.card[client]], SwitchTypes.bitType, TRUE, TRUE]; arbPorts[4+2*client] _ [4+2*client, 1, IO.PutFR["GP%02g'", IO.card[client]], SwitchTypes.bitType, TRUE, TRUE]; ENDLOOP; [] _ RegisterCellType[ name: "Arbiter", ioCreator: CreateArbIO, expandProc: ExpandArb, initializer: InitializeArb, evals: [--Other: ArbOther--], tests: LIST[ ["Test", TestArbiter, FALSE] ], ports: arbPorts]; [] _ RegisterCellType[ name: "ArbTest", expandProc: ExpandArbTest, evals: [], ports: NEW [PortsRep[0]]]; END; Setup[]; END.