DIRECTORY CCDUtils, CD, Core, CoreFrame, CoreGlue, CoreOps, CoreWire, CoreXform, IFUCoreData, IFUTest, IO, Ports, PW, PWC, PWCore, Rosemary, RosemaryUser; IFUTestAdder: CEDAR PROGRAM IMPORTS CCDUtils, CoreFrame, CoreGlue, CoreOps, CoreWire, CoreXform, IFUCoreData, IFUTest, IO, Ports, PW, PWC, Rosemary, RosemaryUser EXPORTS IFUTest = BEGIN CellType: TYPE = Core.CellType; Wire: TYPE = Core.Wire; ROPE: TYPE = Core.ROPE; adder: Core.CellType; adderObj: CD.Object; decoObj: CD.Object; Adder: PUBLIC PROC[size: INT] = { xform: CoreXform.Xform _ CoreXform.GenXform[ LIST[ [size, 0] ] ]; sb: CellType = IFUCoreData.CellProc[ subClass: "SwitchBox", name: "SB", top: "( Ina. Inb. )", left: "( Junk )", right: "( Junk )", bot: "( Ina. Inb. )", xform: xform ]; adderMain: CellType = IFUCoreData.CellProc[ subClass: "Adder", name: "AdderMain", top: "( Ina. Inb. )", right: "( GND )", in: "( Ina. Inb. )", out: "( Out. )", bot: "( Out. )", xform: xform ]; adder _ CoreFrame.NewFrameCells[name: "Adder", rec: [first:top], cells:LIST[sb, adderMain]]; CoreFrame.Expand[hard, adder]; CoreFrame.NameFrame[adder]; [ ] _ CoreGlue.RouteHard[adder]; adderObj _ CCDUtils.Layout[ adder]; decoObj _ CCDUtils.OrnateFrame[ adder]; [ ] _ PW.Draw[decoObj]; TestAdder[size, CoreFrame.FCT[adder].cell]}; TestAdder: PROC[size: INT, cell: CellType] = { UpdateDisplay: PROC = { RosemaryUser.UpdateDisplay[display]}; DisplayAndSignal: PROC = { RosemaryUser.UpdateDisplay[display]; Signal[]}; twoToPwrSize: CARDINAL _ 1; ina: NAT = 0; inb: NAT = 1; out: NAT = 2; VDD: NAT = 3; GND: NAT = 4; junk: NAT = 5; pubSize: NAT = 6; testerWire: CoreWire.CWire; testerPort: Ports.Port; display: RosemaryUser.RoseDisplay; simulation: Rosemary.Simulation; newCell: CellType; public: Wire _ CoreOps.CreateWires[pubSize]; public[ina] _ CoreOps.CreateWires[size, "Ina"]; public[inb] _ CoreOps.CreateWires[size, "Inb"]; public[out] _ CoreOps.CreateWires[size, "Out"]; public[VDD] _ CoreOps.CreateWires[0, "VDD"]; public[GND] _ CoreOps.CreateWires[0, "GND"]; public[junk] _ CoreOps.CreateWires[0, "Junk"]; FOR bit: INT IN [0..size) DO public[ina][bit] _ CoreOps.CreateWires[0, IO.PutFR["Ina.%g", IO.int[bit]]]; public[inb][bit] _ CoreOps.CreateWires[0, IO.PutFR["Inb.%g", IO.int[bit]]]; public[out][bit] _ CoreOps.CreateWires[0, IO.PutFR["Out.%g", IO.int[bit]]]; ENDLOOP; newCell _ IFUTest.RestructuredCell[public, cell]; PWC.SetAbutX[newCell]; [] _ PWC.Layout[newCell]; testerWire _ [newCell.public]; []_Ports.InitPort[wire: testerWire.i[ina].w, levelType: c]; []_Ports.InitPort[wire: testerWire.i[inb].w, levelType: c]; []_Ports.InitPort[wire: testerWire.i[out].w, levelType: c]; []_Ports.InitTesterDrive[wire: testerWire.i[ina].w, initDrive: force]; []_Ports.InitTesterDrive[wire: testerWire.i[inb].w, initDrive: force]; []_Ports.InitTesterDrive[wire: testerWire.i[out].w, initDrive: none]; FOR bit: INT IN [0..size) DO twoToPwrSize _ twoToPwrSize*2 ENDLOOP; [ ] _ Rosemary.SetFixedWire[testerWire.w[VDD], H]; [ ] _ Rosemary.SetFixedWire[testerWire.w[GND], L]; [ ] _ Rosemary.SetFixedWire[testerWire.w[junk], L]; testerPort _ Ports.CreatePort[newCell, TRUE]; simulation _ Rosemary.Instantiate[newCell, testerPort]; display _ RosemaryUser.DisplayViewer[simulation, newCell, "IFU Test", RosemaryUser.DisplayPortLeafWires[newCell]]; FOR arga: CARDINAL IN [0..twoToPwrSize) DO FOR argb: CARDINAL IN [0..twoToPwrSize) DO -- check for hidden state testerPort[ina].c _ arga; testerPort[inb].c _ argb; Rosemary.Settle[simulation]; UpdateDisplay[]; IF (testerPort[out].c#((arga+argb) MOD twoToPwrSize)) THEN DisplayAndSignal[]; ENDLOOP; ENDLOOP }; Signal: SIGNAL = CODE; END. ΔIFUTestAdder.mesa Copyright c 1986 by Xerox Corporation. All rights reserved. Curry, September 25, 1986 5:32:10 am PDT Don Curry October 27, 1986 12:44:11 pm PST [ ] _ PW.Draw[ adderObj]; Κ˜šœ™Icodešœ<™