<> <> <> <> DIRECTORY Core, CoreClasses, CoreOps, CoreProperties, Rope, SC, SCCoreUtil, SCPrivate; SCCoreUtilImpl: CEDAR PROGRAM IMPORTS CoreOps, CoreProperties, 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: ", NARROW[CoreProperties.GetCellTypeProp[cellType, CoreOps.nameProp]]]]; 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]}; END.