<> <> <> <> DIRECTORY CD, Core, CoreCreate, CoreFlat, CoreOps, Logic, Ports, PW, Rosemary, RosemaryUser, Random, Sisyph; ArbPESimImpl: CEDAR PROGRAM IMPORTS CoreCreate, CoreFlat, CoreOps, Logic, Ports, PW, Rosemary, RosemaryUser, Random, Sisyph = BEGIN nInputs: INT = 8; nBits: INT = 3; range: INT = 8; rs: Random.RandomStream _ Random.Create[]; peType: Core.CellType _ NIL; <> tester: RosemaryUser.Tester _ NIL; ExtractCellType: PROC = { In: INT; -- ports nIn: INT; nMin: INT; design: CD.Design _ PW.OpenDesign["Arbiter24"]; cx: Sisyph.Context _ Sisyph.Create[design]; peType _ Sisyph.ExtractSchematicByName[name: "PE-8-3.icon", cx: cx]; In _ CoreOps.GetWireIndex[peType.public, "In"]; nIn _ CoreOps.GetWireIndex[peType.public, "nIn"]; nMin _ CoreOps.GetWireIndex[peType.public, "nMin"]; [] _ Rosemary.SetFixedWire[CoreCreate.FindWire[peType.public, "Vdd"], H]; [] _ Rosemary.SetFixedWire[CoreCreate.FindWire[peType.public, "Gnd"], L]; FOR i: INT IN [0..nInputs) DO [] _ Ports.InitPort[wire: peType.public[In][i], levelType: c]; [] _ Ports.InitTesterDrive[wire: peType.public[In][i], initDrive: force]; [] _ Ports.InitPort[wire: peType.public[nIn][i], levelType: c]; [] _ Ports.InitTesterDrive[wire: peType.public[nIn][i], initDrive: force]; ENDLOOP; [] _ Ports.InitPort[wire: peType.public[nMin], levelType: c, initDrive: force]; [] _ Ports.InitTesterDrive[wire: peType.public[nMin], initDrive: expect]; <> <> tester _ RosemaryUser.TestProcedureViewer[cellType: peType, testButtons: LIST["PERandomTest"], name: "Priority Encoder Test", -- displayWires: RosemaryUser.DisplayPortLeafWires[peType], -- cutSet: CoreFlat.CreateCutSet[labels: LIST[Logic.logicCutSet, Logic.macroCutSet]]]; }; iterations: INT _ 0; PERandomTestProc: RosemaryUser.TestProc = { In: INT = CoreOps.GetWireIndex[cellType.public, "In"]; -- ports nIn: INT = CoreOps.GetWireIndex[cellType.public, "nIn"]; nMin: INT = CoreOps.GetWireIndex[cellType.public, "nMin"]; iterations _ 0; DO min: NAT = rs.ChooseInt[0, range-1]; where: NAT = rs.ChooseInt[0, nInputs-1]; inputs: ARRAY [0..nInputs) OF INT; iterations _ iterations+1; FOR i: INT IN [0..nInputs) DO inputs[i] _ (IF i = where THEN min ELSE rs.ChooseInt[min, range-1]); p[In][i].c _ inputs[i]; p[nIn][i].c _ range-1-inputs[i]; ENDLOOP; p[nMin].c _ range-1-min; Eval[]; ENDLOOP; }; RosemaryUser.RegisterTestProc["PERandomTest", PERandomTestProc]; END.