DIRECTORY Convert, CoreGeometry, CoreOps, Rope, Sisyph, SCOpsImpl, TilingClass; SCOpsImpl: CEDAR PROGRAM IMPORTS Convert, CoreGeometry, CoreOps, Rope, Sisyph, TilingClass EXPORTS SCOpsImpl ~ BEGIN OPEN SCOpsImpl; BaseCTIx: TYPE = {0, 1, X, N, E}; ComLine: PUBLIC PROC [pattern: ROPE, cx: Sisyph.Context] RETURNS [ct: CellType] ~ { public: Wire; tileRow: TilingClass.TileRow _ NEW [TilingClass.TileRowRec[Rope.Length[pattern]]]; tileArray: TilingClass.TileArray _ NEW [TilingClass.TileArrayRec[1]]; baseCTNames: ARRAY BaseCTIx OF Rope _ ["ComCell0.icon", "ComCell1.icon", "ComCellX.icon", "ComCellN.icon", "ComCellE.icon"]; baseCTs: ARRAY BaseCTIx OF CellType; publicElements, arrayedWires, leftSideOnlyWires, rightSideOnlyWires: Wires _ NIL; EachWire: CoreOps.EachWireProc = { sides: CoreGeometry.Sides _ CoreGeometry.noSide; EachPin: CoreGeometry.EachPinProc = { SELECT side FROM bottom => sides[bottom] _ TRUE; top => sides[top] _ TRUE; left => sides[left] _ TRUE; right => sides[right] _ TRUE; ENDCASE => ERROR; }; IF wire=baseCT.public THEN RETURN; [] _ CoreGeometry.EnumerateSides[Sisyph.mode.decoration, baseCT, wire, EachPin]; IF sides[top] OR sides[bottom] THEN { newPublic: Wire _ CoreOps.CreateWires[count, CoreOps.GetShortWireName[wire]]; arrayedWires _ CONS[wire, arrayedWires]; FOR i: INT IN [0..count) DO newPublic[i] _ CoreOps.SetShortWireName[CoreOps.CopyWire[wire], NIL]; ENDLOOP; publicElements _ CONS[newPublic, publicElements]; } ELSE { IF sides[left] THEN {leftSideOnlyWires _ CONS[wire, leftSideOnlyWires]; publicElements _ CONS [wire, publicElements]}; IF sides[right] THEN {rightSideOnlyWires _ CONS[wire, rightSideOnlyWires]; publicElements _ CONS [wire, publicElements]} } }; FOR i: BaseCTIx IN [0..E] DO baseCTs[i] _ Sisyph.ExtractSchematicByName[baseCTNames[i], cx]; [] _ CoreOps.VisitWire[baseCT.public, EachWire]; public _ CoreOps.CreateWire[publicElements]; FOR i: INT IN [0..count) DO tileRow[i] _ NEW [TilingClass.TileRec _ [type: baseCT]] ENDLOOP; FOR wl: Wires _ leftSideOnlyWires, wl.rest WHILE wl#NIL DO wireName: ROPE _ CoreOps.GetShortWireName[wl.first]; tileRow[0].renaming _ CONS[[wireName, wireName], tileRow[0].renaming]; ENDLOOP; FOR wl: Wires _ rightSideOnlyWires, wl.rest WHILE wl#NIL DO wireName: ROPE _ CoreOps.GetShortWireName[wl.first]; tileRow[count-1].renaming _ CONS[[wireName, wireName], tileRow[count-1].renaming]; ENDLOOP; FOR wl: Wires _ arrayedWires, wl.rest WHILE wl#NIL DO wireName: ROPE _ CoreOps.GetShortWireName[wl.first]; FOR i: NAT IN [0..count) DO tileRow[i].renaming _ CONS[[wireName, Rope.Cat[wireName, "[", Convert.RopeFromInt[i], "]"]], tileRow[i].renaming]; ENDLOOP; ENDLOOP; tileArray[0] _ tileRow; ct _ TilingClass.CreateTiling[public, tileArray, TilingClass.SchematicsNeighborX, TilingClass.SchematicsNeighborY, Rope.Cat[obName, ".ArrayX"]]; }; END. πSCOpsImpl.mesa Copyright c 1986 by Xerox Corporation. All rights reserved. Written by: Pradeep Sindhu, October 2, 1986 10:52:55 pm PDT Pradeep Sindhu, May 15, 1987 3:45:56 pm PDT Types Exported Procs Extract each of the baseCT's ΚM˜codešœ™Kšœ Οmœ1™