ArbSimImpl.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
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: BOOLFALSE, useDBus: BOOLFALSE ] = {
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]]],
... strictly for debugging
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 PANIL;
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 PALIST[
[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]]
];
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].
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 PALIST[
[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"]]
, recordDeltas: FALSE
];
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: REFNIL, msg: IO.ROPENIL] -- Commander.CommandProc -- = {
useSchematic, useDBus: BOOLFALSE;
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.