DIRECTORY CD, Core, CoreCreate, CoreFlat, CoreIO, CoreOps, IO, PLAOps, PLASim, Ports, REFBit, Rope, Rosemary, TerminalIO; PLASimImpl: CEDAR PROGRAM IMPORTS CoreCreate, CoreFlat, CoreIO, CoreOps, IO, PLAOps, Ports, REFBit, Rope, Rosemary, TerminalIO EXPORTS PLASim = BEGIN ROPE: TYPE = Core.ROPE; simplePLARoseClass: ROPE _ Rosemary.Register ["SimplePLA", SimplePLAInit, SimplePLAEval]; simplePLAClass: PUBLIC Core.CellClass _ Rosemary.BindCellClass[ CoreIO.RegisterClass[ CoreOps.SetClassPrintProc[ class: NEW[ Core.CellClassRec _ [name: "SimplePLA", layersProps: FALSE]], proc: PrintSimplePLACell], WriteSimplePLACell, ReadSimplePLACell ], simplePLARoseClass]; WriteSimplePLACell: CoreIO.ClassWriteProc = {CoreIO.WriteRope[h, NARROW[cellType.data]]}; ReadSimplePLACell: CoreIO.ClassReadProc = {cellType.data _ CoreIO.ReadRope[h]}; PrintSimplePLACell: CoreOps.PrintClassProc = {name: ROPE _ NARROW [data]; out.PutF["PLA File: %g.ttt", IO.rope[name]]}; inputs: NAT = 0; ninputs: NAT = 1; outputs: NAT = 2; CreateSimplePLAPublic: PUBLIC PROC[name: ROPE, additionalPublics: Core.Wires _ NIL] RETURNS[public: Core.Wire] = { pla: PLAOps.PLA _ PLAOps.ReadPLAFile[name.Cat[".ttt"]]; nofIns: INT _ REFBit.Size[pla.data]; nofOuts: INT _ REFBit.Size[pla.out]; publics: Core.Wires _ LIST [ CoreCreate.Seq["in", nofIns], CoreCreate.Seq["nin", nofIns], CoreCreate.Seq["out", nofOuts], CoreCreate.Seq["GND", 0], CoreCreate.Seq["VDD", 0] ]; publics.rest.rest.rest.rest.rest _ additionalPublics; public _ CoreOps.CreateWire[publics]}; CreateSimplePLA: PUBLIC PROC[name: ROPE, public: Core.Wire] RETURNS[cellType: Core.CellType] = { cellType _ NEW [ Core.CellTypeRec _ [ class: simplePLAClass, public: public, data: name ] ]}; badInsList: LIST OF PLASim.SimplePLAState _ NIL; SetUpRose: PUBLIC PROC[cell: Core.CellType] = { dummy: Core.Wire _ CoreOps.FindWire[cell.public, "DisChg"]; IF dummy#NIL THEN []_Ports.InitPort[wire: dummy, levelType: l, initDrive: none]; []_Ports.InitPort[wire: cell.public[inputs], levelType: bs, initDrive: none]; []_Ports.InitPort[wire: cell.public[ninputs], levelType: bs, initDrive: none]; []_Ports.InitPort[wire: cell.public[outputs], levelType: bs, initDrive: drive]; []_CoreFlat.CellTypeCutLabels[cell, simplePLARoseClass]}; BadIns: PUBLIC PROC RETURNS[BOOL] = { FOR list: LIST OF PLASim.SimplePLAState _ badInsList, list.rest WHILE list # NIL DO IF list.first.badIns THEN RETURN[TRUE]; ENDLOOP; RETURN[FALSE]}; BadInsReset: PUBLIC PROC = {badInsList _ NIL}; SimplePLAInit: Rosemary.InitProc = { s: PLASim.SimplePLAState; pla: PLAOps.PLA; name: ROPE _ NARROW[cellType.data]; IF oldStateAny # NIL THEN RETURN[oldStateAny]; -- no real state in SimplePLAStateRec pla _ PLAOps.ReadPLAFile[name.Cat[".ttt"] , TerminalIO.CreateStream[]]; s _ NEW[PLASim.SimplePLAStateRec _ [ pla: pla, in: CoreOps.GetWireIndex[cellType.public, "in"], nin: CoreOps.GetWireIndex[cellType.public, "nin"], out: CoreOps.GetWireIndex[cellType.public, "out"] ] ]; s.inSize _ cellType.public[s.in].size; s.outSize _ cellType.public[s.out].size; badInsList _ CONS[s, badInsList]; RETURN[s]}; SimplePLAEval: Rosemary.EvalProc = { s: PLASim.SimplePLAState _ NARROW[stateAny]; s.badIns _ FALSE; FOR i: INT IN [0..s.inSize) DO IF p[s.in].bs[i] = p[s.nin].bs[i] THEN s.badIns _ TRUE; REFBit.Set[s.pla.data, i, p[s.in].bs[i]] ENDLOOP; PLAOps.GetOutForData[s.pla]; FOR i: INT IN [0..s.outSize) DO p[s.out].bs[i] _ NOT REFBit.Get[s.pla.out, i] ENDLOOP }; Signal: SIGNAL = CODE; END. ‚PLASimImpl.mesa, Copyright c 1986 by Xerox Corporation. All rights reserved. Last Edited by Curry, October 22, 1986 3:47:06 pm PDT Don Curry October 31, 1986 1:23:48 pm PST Last Edited by: Louis Monier February 10, 1987 7:34:53 pm PST IF cell.class#simplePLAClass THEN Signal[]; SimplePLAEval: Rosemary.EvalProc = { s: PLASim.SimplePLAState _ NARROW[stateAny]; FOR i: INT IN [0..s.inSize) DO REFBit.Set[s.pla.data, i, p[s.in].bs[i]] ENDLOOP; PLAOps.GetOutForData[s.pla]; FOR i: INT IN [0..s.outSize) DO p[s.out].bs[i] _ NOT REFBit.Get[s.pla.out, i] ENDLOOP }; NOR NOR arrays => Inverted outputs NOR NOR arrays => Inverted outputs ʵ˜šœ™Jšœ<™