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: IOCreator--PROC [cell: Cell, initData: REF ANY]-- = BEGIN cell.realCellStuff.switchIO _ NEW [ArbIORep]; cell.realCellStuff.newIO _ NEW [ArbIORep]; cell.realCellStuff.oldIO _ 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; 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: CellTestProc--PROC [handle: CellTestHandle, initData, testData, io: REF ANY]-- = 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, SwitchTypes.refInput]; PhB: Node _ to.class.NodeInstance[to.instance, "PHASEB", SwitchTypes.bitType, NIL, SwitchTypes.refInput]; Requests, Grants: ARRAY ClientIndex OF Node; NewRqBar: Node _ to.class.NodeInstance[to.instance, "NEWRQ'", SwitchTypes.bitType, "L", 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", 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--], blackBox: TestArbiter, ports: arbPorts]; [] _ RegisterCellType[ name: "ArbTest", expandProc: ExpandArbTest, evals: [], ports: NEW [PortsRep[0]]]; END; Setup[]; END. "ArbTest.Mesa Last Edited by: Spreitzer, September 15, 1984 8:05:55 pm PDT fill0(0:0..SwitchTypes.bitsPerSwitchValFiller-1): SwitchTypes.SwitchValFiller, fill1(1:0..SwitchTypes.bitsPerSwitchValFiller-1): SwitchTypes.SwitchValFiller, fill2(2:0..SwitchTypes.bitsPerSwitchValFiller-1): SwitchTypes.SwitchValFiller, fill0(0:0..SwitchTypes.bitsPerSwitchValFiller-1): SwitchTypes.SwitchValFiller, fill1(1:0..SwitchTypes.bitsPerSwitchValFiller-1): SwitchTypes.SwitchValFiller, ArbOther: CellProc--PROC [cell: Cell]-- = BEGIN as: ArbState _ NARROW[cell.realCellStuff.state]; newIO: ArbIO _ NARROW[cell.realCellStuff.newIO]; oldIO: ArbIO _ NARROW[cell.realCellStuff.oldIO]; oldIO^ _ newIO^; BEGIN OPEN as, newIO; AnyRq: PROC RETURNS [any: BOOLEAN] = {FOR client: ClientIndex IN ClientIndex DO IF NOT clients[client].RqBar THEN RETURN [TRUE]; ENDLOOP; any _ FALSE}; IF PhA THEN FOR client: ClientIndex IN ClientIndex DO clients[client].GnBar _ client # hasGrant; ENDLOOP; IF PhB THEN IF (NOT NewRqBar) OR (IF hasGrant < Clients THEN clients[hasGrant].RqBar ELSE AnyRq[]) THEN BEGIN hasGrant _ Clients; FOR offset: ClientIndex IN ClientIndex DO client: ClientIndex _ (offset + startAt) MOD Clients; IF NOT clients[client].RqBar THEN {hasGrant _ client; startAt _ (hasGrant+1) MOD Clients; EXIT}; ENDLOOP; END; END; END; Κ~– "cedar" style˜Jšœ ™ J™—Kšœ™—Kšœ™——Kšœ™—Kšœ™—K˜šŸ œ œ) œ˜MKš˜K˜fKšœ˜—K˜šŸ œ Bœ˜]Kš˜šœœ˜!Kšœœ˜šŸœœ˜ Kš˜Kšœ ˜ Kšœ ˜ Kšœ˜Kšœ ˜ Kšœ˜Kšœ ˜ Kšœ˜Kšœ ˜ Kšœ˜Kšœ˜—Kšœ˜šœœ ˜%Kšœ˜Kšœ˜—Kšœ˜K˜K˜K˜šœœ ˜%Kšœœœœœœœœ˜@Kšœ˜—Kšœ˜—Kšœ˜—K˜šŸ œ œ( œ˜PKš˜KšœNœ˜iKšœNœ˜iKšœœ œ˜,Kšœn˜nšœœ ˜)Kšœ6œœ@˜ŒKšœ4œœ*˜tKšœ˜—KšœB˜BKšœ˜—K˜šŸœœ˜ Kš˜Kšœœ˜%K˜Kšœ4œœ˜@Kšœ4œœ˜@Kšœ4œœ˜@šœœ ˜)Kš œ'œœ%œœ˜nKš œ'œœ%œœ˜nKšœ˜—K˜˜K˜K˜K˜K˜Kšœ œ˜Kšœ˜K˜—K˜˜Kšœ˜Kšœ˜K˜ Kšœœ˜—Kšœ˜—K˜K˜K˜Kšœ˜—…—°P