DIRECTORY Core, CoreClasses, CoreFlat, CoreOps, CoreProperties, HashTable, Rope, SC, SCCoreUtil, SCPrivate; SCCoreUtilImpl: CEDAR PROGRAM IMPORTS CoreClasses, CoreFlat, CoreOps, CoreProperties, HashTable, Rope, SC EXPORTS SCCoreUtil = BEGIN EnumerateInstances: PUBLIC PROC [cellType: Core.CellType, eachInstance: SCCoreUtil.EachInstanceProc] RETURNS [quit: BOOL _ FALSE] = { parentRCT: CoreClasses.RecordCellType _ NARROW[cellType.data]; IF parentRCT = NIL THEN SC.Error[callingError, Rope.Cat["Invalid Record Cell: ", CoreOps.GetCellTypeName[cellType]]]; FOR in: NAT IN [0..parentRCT.size) DO instance: CoreClasses.CellInstance _ parentRCT[in]; quit _ eachInstance[instance]; ENDLOOP; }; EnumerateFlatWires: PUBLIC PROC [wire: Core.Wire, eachWire: SCCoreUtil.EachWireProc] RETURNS [quit: BOOL _ FALSE] = { DoWire: CoreOps.EachWireProc = { IF wire.size = 0 THEN [subWires, quit] _ eachWire[wire]}; quit _ CoreOps.VisitWire[wire, DoWire]}; EnumFlatInstancePins: PUBLIC PROC [cellInstance: CoreClasses.CellInstance, eachInstancePin: SCCoreUtil.EachInstancePinProc] = { DoWire: CoreOps.EachWirePairProc = { IF actualWire # NIL AND actualWire.size = 0 AND publicWire.size = 0 THEN [subWires, quit] _ eachInstancePin[actualWire, publicWire]}; [] _ CoreOps.VisitBinding[cellInstance.actual, cellInstance.type.public, DoWire]}; Flatten: PUBLIC PROC [root: Core.CellType, flattenCellType: CoreFlat.FlattenCellTypeProc, definePublicWire, defineInternalWire: SCCoreUtil.FlatWireProc, defineInstance: SCCoreUtil.FlatInstanceProc] = { BuildPublic: PROC [wire: Core.Wire] = { name: Rope.ROPE; flatWire: CoreFlat.FlatWire = NEW [CoreFlat.FlatWireRec _ [wire: wire, path: CoreFlat.NullPath]]; IF HashTable.Fetch[rootFlatsToInternals, flatWire].value#NIL THEN RETURN; -- public already seen name _ CoreOps.GetFullWireName[root.public, wire]; [] _ HashTable.Store[rootFlatsToInternals, flatWire, wire]; [] _ defineInternalWire[wire, name]; [] _ definePublicWire[wire, name]; }; BuildActual: PROC [actual: Core.Wire, bindings: CoreFlat.Bindings] RETURNS [newActual: Core.Wire] = { IF actual.size=0 THEN { wireBind: CoreFlat.WireBind _ NARROW [HashTable.Fetch[bindings, actual].value]; flatWire: CoreFlat.FlatWire = NEW [CoreFlat.FlatWireRec _ [wire: wireBind.wire, path: wireBind.path]]; wireName: Rope.ROPE _ CoreFlat.WirePathRope[root, flatWire^]; newActual _ NARROW [HashTable.Fetch[rootFlatsToInternals, flatWire].value]; IF newActual#NIL THEN RETURN; newActual _ CoreOps.CopyWire[wireBind.wire]; [] _ HashTable.Store[rootFlatsToInternals, flatWire, newActual]; [] _ defineInternalWire[newActual, wireName]} ELSE { newActual _ CoreOps.CreateWires[size: actual.size]; FOR i: NAT IN [0 .. actual.size) DO newActual[i] _ BuildActual[actual[i], bindings]; ENDLOOP}}; EachInstance: CoreFlat.EachInstanceProc = { basic: Core.CellType; newActual: Core.Wire; name: Rope.ROPE _ CoreFlat.InstancePathRope[root, [path, instance]]; IF flattenCellType # NIL AND flattenCellType[instance.type] THEN RETURN [TRUE]; newActual _ BuildActual[instance.actual, bindings]; FOR basic _ instance.type, CoreOps.Recast[basic] UNTIL CoreProperties.GetCellTypeProp[basic, $Layout]#NIL DO NULL ENDLOOP; [] _ defineInstance[CoreClasses.CreateInstance[newActual, basic, name, instance.properties], name]; RETURN[FALSE]}; rootFlatsToInternals: CoreFlat.Bindings _ HashTable.Create[equal: CoreFlat.FlatWireEqual, hash: CoreFlat.FlatWireHash]; CoreOps.VisitAtomicWires[root.public, BuildPublic]; CoreFlat.EnumerateLeaves[root, EachInstance]; }; END. nSCCoreUtilImpl.mesa ///StdCell/SCCoreUtilImpl.mesa Copyright c 1985 by Xerox Corporation. All rights reserved. Bryan Preas, August 26, 1985 5:47:05 pm PDT Frank Bowers December 18, 1985 4:23:30 pm PST May raise StructureError[MissingParameter]. added test for actualWire = NIL - Frank Bowers January 10, 1986 11:05:46 am PST -- make an instance from basic Κ—˜šœ3™3Jšœ Οmœ1™šžœ žœž˜Jšžœ[˜]—šžœžœžœž˜%Kšœ3˜3Jšœ˜Kšžœ˜—Jšœ˜K˜—š Ÿœžœžœ6žœžœžœ˜všŸœ˜ Jšžœžœ%˜:—Jšœ(˜(K˜—šŸœžœžœ^˜K˜šŸœ˜$JšœO™Oš žœžœžœžœž˜HJšœ=˜=——JšœR˜RK˜—šŸœžœžœΆ˜ΚK˜šŸ œžœ˜'Kšœ žœ˜Kšœžœ@˜aKš žœ7žœžœžœΟc˜`Kšœ2˜2Kšœ;˜;Kšœ$˜$Kšœ"˜"Kšœ˜—K˜šŸ œžœ2žœ˜ešžœžœ˜Kšœžœ+˜OKšœžœE˜fKšœžœ*˜=šœ žœ9˜KKšžœ žœžœžœ˜—Kšœ,˜,Kšœ@˜@Kšœ-˜-—šžœ˜Kšœ3˜3šžœžœžœž˜#Kšœ0˜0Kšžœ˜ ———K˜šŸ œ˜+Kšœ˜Kšœ˜Kšœ žœ5˜DKš žœžœžœ žœžœžœ˜OKšœ3˜3š žœ.žœ0žœžœž˜qKšžœ˜—Kšœ™Kšœc˜cKšžœžœ˜—K˜Kšœw˜wKšœ3˜3Kšœ-˜-K˜—J˜Jšžœ˜—J˜J˜J˜J˜—…— ΖΛ