DIRECTORY Arbiter, Commander, CommandTool, Core, CoreCreate, CoreFlat, CoreOps, CoreProperties, IO, Ports, Rope, Rosemary, RosemaryUser; ArbSimImpl: CEDAR PROGRAM IMPORTS Arbiter, Commander, CommandTool, CoreCreate, CoreFlat, CoreOps, CoreProperties, IO, Ports, Rope, Rosemary, RosemaryUser = BEGIN OPEN CoreCreate, Arbiter; arbSys: Core.CellType _ NIL; tester: RosemaryUser.Tester _ NIL; logicCutSet: IO.ROPE = "Logic"; -- Logic.logicCutSet macroCutSet: IO.ROPE = "LogicMacro";-- Logic.macroCutSet CreateArbSysCellType: PROC [ useSchematic: BOOL _ FALSE, useDBus: BOOL _ FALSE ] = { inst: CoreCreate.CellInstance; instances: CellInstances _ LIST[]; publics: Wire = WireList[LIST[ Seq["nDReqs", maxArbiters, Seq[size: maxDevices, protoChild: Seq[size: 2]]], Seq["nDGrants", maxArbiters, Seq[size: maxDevices]], Seq["nBDHis", maxArbiters], Seq["nBDLongs", maxArbiters], Seq["nArbReqs", maxArbiters, Seq[size: 3]], "nStartGrant", "nBusy", Seq["ArbRovers6s", maxArbiters, Seq[size: 8, protoChild: Seq[size: 3]]], Seq["nDOwners", maxArbiters], "nBOwner", Seq["nSysOwners", maxArbiters], Seq["nDShareds", maxArbiters, Seq[size: maxDevices]], Seq["nBShareds", maxArbiters], Seq["nSysShareds", maxArbiters], Seq["nDStops", maxArbiters, Seq[size: maxDevices]], Seq["nBStops", maxArbiters], Seq["nSysStops", maxArbiters], Seq["DBus", 7], Seq["SlotNos", maxArbiters, Seq[size: 4]], Seq["DHybridSels", maxArbiters, Seq[size: 15]], Seq["DBdSels", maxArbiters], Seq["DPriorities", maxArbiters, Seq[size: maxDevices, protoChild: Seq[size: 9]]], Seq["ArbNos", maxArbiters, Seq[size: 3]], Seq["Rsts", maxArbiters], "nDynaBusBusy", "nHolding", "Ck", "Vdd", "Gnd" ]]; codeArbCT: Core.CellType _ CoreFlat.CellTypeCutLabels[on: Arbiter.ArbExceptDBusCodeCT[], l1: "TopLevel"]; schArbCT: Core.CellType _ NIL; arbCT: ARRAY Arbiters OF Core.CellType _ ALL[codeArbCT]; arbDBusCT: ARRAY Arbiters OF Core.CellType _ ALL[NIL]; codeArbDBusCT: Core.CellType _ NIL; schArbDBusCT: Core.CellType _ NIL; reqDevCT: Core.CellType _ CoreFlat.CellTypeCutLabels[on: Arbiter.ArbRandReq[], l1: "TopLevel"]; port: NAT; bpPAs: LIST OF PA _ NIL; IF useDBus THEN { codeArbDBusCT _ CoreFlat.CellTypeCutLabels[on: Arbiter.ArbDBusCodeCT[], l1: "TopLevel"]; arbDBusCT _ ALL[codeArbDBusCT]; }; IF useSchematic THEN { schArbCT _ SchematicCT[cellName: "ArbExceptDBus", designName: "Arbiter24"]; arbCT[0] _ schArbCT; IF useDBus THEN { schArbDBusCT _ SchematicCT[cellName: "DBusSect", designName: "Arbiter24"]; arbDBusCT[0] _ schArbCT; }; }; FOR a: Arbiters IN Arbiters DO pas: LIST OF PA _ LIST[ [public: "nDReq", actual: CoreOps.FindWire[publics, "nDReqs"][a]], [public: "nDGrant", actual: CoreOps.FindWire[publics, "nDGrants"][a]], [public: "nBDHi", actual: CoreOps.FindWire[publics, "nBDHis"][a]], [public: "nBDLong", actual: CoreOps.FindWire[publics, "nBDLongs"][a]], [public: "nArbReqOut", actual: CoreOps.FindWire[publics, "nArbReqs"][a]], [public: "nBusyOut", actual: "nBusy"], [public: "nBusyIn", actual: "nBusy"], [public: "nStopAct", actual: CoreOps.FindWire[publics, "nSysStops"][a]], [public: "ArbRovers6", actual: CoreOps.FindWire[publics, "ArbRovers6s"][a]], [public: "nDOwner", actual: CoreOps.FindWire[publics, "nDOwners"][a]], [public: "nBOwnerOut", actual: "nBOwner"], [public: "nBOwnerIn", actual: "nBOwner"], [public: "nSysOwner", actual: CoreOps.FindWire[publics, "nSysOwners"][a]], [public: "nDShared", actual: CoreOps.FindWire[publics, "nDShareds"][a]], [public: "nBSharedOut", actual: CoreOps.FindWire[publics, "nBShareds"][a]], [public: "nBSharedIn", actual: "nBShareds"], [public: "nSysShared", actual: CoreOps.FindWire[publics, "nSysShareds"][a]], [public: "nDStop", actual: CoreOps.FindWire[publics, "nDStops"][a]], [public: "nBStopOut", actual: CoreOps.FindWire[publics, "nBStops"][a]], [public: "nBStopIn", actual: "nBStops"], [public: "nSysStop", actual: CoreOps.FindWire[publics, "nSysStops"][a]], [public: "DPriority", actual: CoreOps.FindWire[publics, "DPriorities"][a]], [public: "ArbNo", actual: CoreOps.FindWire[publics, "ArbNos"][a]], [public: "Rst", actual: CoreOps.FindWire[publics, "Rsts"][a]] ]; FOR oa: OtherArbiters IN OtherArbiters DO pas _ CONS[[ public: CoreOps.FindWire[arbCT[a].public, "nOtherArbIn"][oa], actual: CoreOps.FindWire[publics, "nArbReqs"][(a-1-oa+2*maxArbiters) MOD maxArbiters] ], pas]; ENDLOOP; inst _ InstanceList[ type: arbCT[a], pas: pas, name: IO.PutFR["Arb%d", IO.int[a]] ]; instances _ CONS[inst, instances]; IF useDBus THEN { pas: LIST OF PA _ LIST[ [public: "DPriority", actual: CoreOps.FindWire[publics, "DPriorities"][a]], [public: "ArbNo", actual: CoreOps.FindWire[publics, "ArbNos"][a]], [public: "Rst", actual: CoreOps.FindWire[publics, "Rsts"][a]], [public: "SlotNo", actual: CoreOps.FindWire[publics, "SlotNos"][a]], [public: CoreOps.FindWire[arbCT[a].public, "BdVersion"][0], actual: CoreOps.FindWire[publics, "DHybridSels"][a][0]], [public: CoreOps.FindWire[arbCT[a].public, "BdVersion"][1], actual: CoreOps.FindWire[publics, "DHybridSels"][a][5]], [public: "DHybridSel", actual: CoreOps.FindWire[publics, "DHybridSels"][a]], [public: "DBdSel", actual: CoreOps.FindWire[publics, "DBdSels"][a]] ]; inst _ InstanceList[ type: arbDBusCT[a], pas: pas, name: IO.PutFR["ArbDBus%d", IO.int[a]] ]; instances _ CONS[inst, instances]; }; FOR d: Devices IN Devices DO inst _ InstanceList[ type: reqDevCT, pas: LIST [ [public: "nDReq", actual: CoreOps.FindWire[publics, "nDReqs"][a][d]], [public: "nDGrant", actual: CoreOps.FindWire[publics, "nDGrants"][a][d]], [public: "nBDHi", actual: CoreOps.FindWire[publics, "nBDHis"][a]], [public: "nBDLong", actual: CoreOps.FindWire[publics, "nBDLongs"][a]], [public: "nDOwner", actual: CoreOps.FindWire[publics, "nDOwners"][a]], [public: "nSysOwner", actual: CoreOps.FindWire[publics, "nSysOwners"][a]], [public: "nDShared", actual: CoreOps.FindWire[publics, "nDShareds"][a][d]], [public: "nSysShared", actual: CoreOps.FindWire[publics, "nSysShareds"][a]], [public: "nDStop", actual: CoreOps.FindWire[publics, "nDStops"][a][d]], [public: "nSysStop", actual: CoreOps.FindWire[publics, "nSysStops"][a]], [public: "nDReset", actual: CoreOps.FindWire[publics, "DBus"][nDReset]], [public: "DPriority", actual: CoreOps.FindWire[publics, "DPriorities"][a][d]] ], name: IO.PutFR["Arb%dReq%d", IO.int[a], IO.int[d]] ]; instances _ CONS[inst, instances]; ENDLOOP; ENDLOOP; inst _ InstanceList[ type: CoreFlat.CellTypeCutLabels[on: CreateSanity[], l1: "TopLevel"], pas: LIST [ [public: "nDReset", actual: CoreOps.FindWire[publics, "DBus"][nDReset]]], name: "San"]; instances _ CONS[inst, instances]; arbSys _ CoreCreate.Cell[public: publics, onlyInternal: NIL, instances: instances, name: "ArbSys" ]; FOR a: Arbiters IN Arbiters DO [] _ Ports.InitPort[CoreOps.FindWire[arbSys.public, "SlotNos"][a], c]; [] _ Ports.InitTesterDrive[CoreOps.FindWire[arbSys.public, "SlotNos"][a], force]; [] _ Ports.InitPort[CoreOps.FindWire[arbSys.public, "ArbNos"][a], c]; FOR d: Devices IN Devices DO [] _ Ports.InitPort[CoreOps.FindWire[arbSys.public, "DPriorities"][a][d], c]; ENDLOOP; ENDLOOP; port _ CoreOps.GetWireIndex[arbSys.public, "DBus"]; FOR i: NAT IN (DSerialOut..DShiftCK] DO Ports.InitTesterDrive[arbSys.public[port][i], force]; ENDLOOP; Ports.InitTesterDrives[arbSys, force, "Ck"]; [] _ Rosemary.SetFixedWire[CoreOps.FindWire[arbSys.public, "Vdd"], H]; [] _ Rosemary.SetFixedWire[CoreOps.FindWire[arbSys.public, "Gnd"], L]; tester _ RosemaryUser.TestProcedureViewer[cellType: arbSys, testButtons: LIST["SingleRequesterTest", "SingleArbiterTest", "FullArbSysTest"], name: "Arbiter System Test", displayWires: LIST[ NEW[CoreFlat.FlatWireRec _ CoreFlat.ParseWirePath[arbSys, "Ck"]], NEW[CoreFlat.FlatWireRec _ CoreFlat.ParseWirePath[arbSys, "DBus"]], NEW[CoreFlat.FlatWireRec _ CoreFlat.ParseWirePath[arbSys, "nArbReqs"]], NEW[CoreFlat.FlatWireRec _ CoreFlat.ParseWirePath[arbSys, "nBDLongs"]], NEW[CoreFlat.FlatWireRec _ CoreFlat.ParseWirePath[arbSys, "nBDHis"]], NEW[CoreFlat.FlatWireRec _ CoreFlat.ParseWirePath[arbSys, "nStartGrant"]], NEW[CoreFlat.FlatWireRec _ CoreFlat.ParseWirePath[arbSys, "nDGrants"]], NEW[CoreFlat.FlatWireRec _ CoreFlat.ParseWirePath[arbSys, "nBusy"]], NEW[CoreFlat.FlatWireRec _ CoreFlat.ParseWirePath[arbSys, "nDynaBusBusy"]], NEW[CoreFlat.FlatWireRec _ CoreFlat.ParseWirePath[arbSys, "nHolding"]] ], cutSet: CoreFlat.CreateCutSet[labels: LIST[logicCutSet, macroCutSet, "TopLevel"]] ]; arbSys.properties _ CoreProperties.PutProp[on: arbSys.properties, prop: $UseDBus, value: NEW[BOOL _ useDBus]]; arbSys.properties _ CoreProperties.PutProp[on: arbSys.properties, prop: $Tester, value: tester]; }; DoArbiterSim: PROC [cmd: Commander.Handle] RETURNS [result: REF _ NIL, msg: IO.ROPE _ NIL] -- Commander.CommandProc -- = { useSchematic, useDBus: BOOL _ FALSE; argv: CommandTool.ArgumentVector = CommandTool.Parse[cmd]; FOR i: NAT IN [1..argv.argc) DO SELECT Rope.Fetch[argv[i], 0] FROM '+ => FOR j: INT IN [1..Rope.Length[argv[i]]) DO SELECT Rope.Fetch[argv[i], j] FROM 's, 'S => useSchematic _ TRUE; 'd, 'D => useDBus _ TRUE; ENDCASE => NULL; ENDLOOP; ENDCASE => NULL; ENDLOOP; CreateArbSysCellType[useSchematic, useDBus]; }; Commander.Register["ArbiterSim", DoArbiterSim, "Set up a simulation of 8 arbiters, each receiving random requests from 8 requesters. +s => use one schematic arbiter, +d => use the DBus to initialize the arbiters."]; END. BArbSimImpl.mesa Copyright c 1986 by Xerox Corporation. All rights reserved. E. McCreight, May 26, 1987 4:46:40 pm PDT Barth, April 4, 1987 10:21:15 am PST ... strictly for debugging The following code interconnects the nArbReq bus. Arbiter x has its rover pointers initialized to x during reset, so our interconnection must be consistent with that. Assume that Arbiter x's nArbReqOut wire is connected to nArbReqs[x]. Then Arbiter 0's public nArbReqIn[0] wire should be connected to nArbReqs[7], its public nArbReqIn[1] wire to nArbReqs[6], and so on. Likewise Arbiter 1's public nArbReqIn[0] wire should be connected to nArbReqs[0], its public nArbReqIn[1] wire to nArbReqs[7], and so on. In general Arbiter a's public nArbReqIn[oa] wire should be connected to nArbReqs[(a-1-oa) MOD maxArbiters]. , recordDeltas: FALSE Κ˜šœ™Jšœ<™˜>J˜JšœD˜Dšœ;˜;Jšœ8˜8—šœ;˜;Jšœ8˜8—JšœL˜LJšœC˜CJ˜J˜—šœ˜J˜J˜ Jšœœœ˜&Jšœ˜—Jšœ œ˜"Jšœ˜J˜—šœ œ ˜˜J˜šœœ˜ JšœE˜EJšœI˜IJšœB˜BJšœF˜FJšœF˜FJšœJ˜JJšœK˜KJšœL˜LJšœG˜GJšœH˜HJšœH˜HJšœM˜MJ˜—Jšœœœ œ˜2J˜—Jšœ œ˜"Jšœ˜—J˜Jšœ˜J˜—šœ˜JšœE˜Ešœœ˜ JšœI˜IJšœ ˜ ——šœ œ˜"J˜—šœ8œ˜RJ˜—J˜šœ œ ˜JšœF˜FJšœQ˜QJšœE˜Ešœ œ ˜JšœM˜MJšœ˜—Jšœ˜—Jšœ3˜3šœœœ˜'Jšœ5˜5Jšœ˜—Jšœ,˜,J˜J˜J˜FJ˜FJ™˜;Jšœ œ?˜PJšœ˜šœœ˜Jšœ>˜AJšœ@˜CJšœD˜GJšœD˜GJšœB˜EJšœG˜JJšœD˜GJšœA˜DJšœH˜KJšœC˜FJ˜—Jšœ&œ'˜QJšœ™J˜———˜JšœYœœ ˜nJšœ`˜`J˜˜J˜J˜J˜—šž œœœ œœœœœŸœ˜zJšœœœ˜$Jšœ:˜:šœœœ˜šœ˜"šœ˜šœœœ˜*šœ˜"Jšœœ˜Jšœœ˜Jšœœ˜—Jšœ˜——Jšœœ˜—Jšœ˜—Jšœ,˜,J˜—J˜J˜J˜ΨJ˜J˜Jšœ˜—J˜J˜—…—$–/ι