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: ExpandProc--PROCEDURE [thisCell: Cell, initData: REF ANY]-- = BEGIN RoseReadSim.ReadSim[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: ExpandProc--PROCEDURE [thisCell: Cell, initData: REF ANY]-- = BEGIN PhA: Node _ CreateNode[thisCell, "PHASEA", SwitchTypes.bitType, NIL, SwitchTypes.refInput]; PhB: Node _ CreateNode[thisCell, "PHASEB", SwitchTypes.bitType, NIL, SwitchTypes.refInput]; Requests, Grants: ARRAY ClientIndex OF Node; NewRqBar: Node _ CreateNode[thisCell, "NEWRQ'", SwitchTypes.bitType, "L", SwitchTypes.refInput]; FOR client: ClientIndex IN ClientIndex DO Requests[client] _ CreateNode[thisCell, IO.PutFR["RQ%02g'", IO.card[client]], SwitchTypes.bitType, "H", SwitchTypes.refInput]; Grants[client] _ CreateNode[thisCell, IO.PutFR["GP%02g'", IO.card[client]], SwitchTypes.bitType, "H"]; ENDLOOP; [] _ CreateCell[thisCell, "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; [] _ RegisterCellClass[ className: "Arbiter", ioCreator: CreateArbIO, expandProc: ExpandArb, initializer: InitializeArb, evals: [--Other: ArbOther--], blackBox: TestArbiter, ports: arbPorts]; [] _ RegisterCellClass[ className: "ArbTest", expandProc: ExpandArbTest, evals: [], ports: NEW [PortsRep[0]]]; END; Setup[]; END. ArbTest.Mesa Last Edited by: Spreitzer, May 28, 1984 11:38:34 am 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; Κq– "cedar" style˜Jšœ ™ J™7J˜IcodešΟk œœU˜aK˜šΠbxœœ˜Kšœœ1˜;—K˜Kšœœ ˜*K˜Kšœ œ˜Kšœ œ˜Kšœ œ˜,Kšœ œ˜Kšœ œ$˜6Kšœ œ˜Kšœ œ˜K˜Kšœ7œ˜:Kšœ7œ˜:K˜Kšœ7œ˜:Kšœ8œ˜;Kšœ7œ˜:K˜Kšœ œ˜#K˜Kšœœœ ˜š œ œœ œœ˜+KšœN™NKšœB˜BKšœN™NKšœB˜BKšœN™NKšœG˜GKšœœ œ ˜0—K˜š œœœ œœ˜)KšœN™NKšœD˜DKšœN™NKšœE˜E—K˜šΟn œ Οc(œ˜@Kš˜Kšœœ ˜-Kšœœ ˜*Kšœœ ˜*Kšœ˜—K˜Kšœ œœ ˜!šœ œœ˜Kšœ˜Kšœ$˜$—K˜šŸ œ  :œ˜VKš˜Kšœ œœ˜BKšœ˜—K˜šŸœ  œ™)Kš™Kšœœ™0Kšœœ™0Kšœœ™0™Kšœœ ™šŸœœœœ™$šœœœ ™*Kš œœœœœ™0Kšœ™—Kšœœ™ —šœ™ šœœ ™)K™*Kšœ™——šœ™ š œœ œœœœ ™[Kš™K™šœœ ™)Kšœ)œ ™5šœœ™!Kšœ+œ œ™>—Kšœ™—Kšœ™——Kšœ™—Kšœ™—K˜šŸ œ  1œ˜HKš˜K˜^Kšœ˜—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˜šŸ œ  1œ˜LKš˜Kšœ@œ˜[Kšœ@œ˜[Kšœœ œ˜,Kšœ`˜`šœœ ˜)Kšœ(œœ@˜~Kšœ&œœ*˜fKšœ˜—K˜4Kšœ˜—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šœ˜—…—Vε