<> <> <> DIRECTORY Core, CoreClasses, CoreOps, Rope, SC, SCCoreUtil, SCPrivate; SCCoreUtilImpl: CEDAR PROGRAM IMPORTS CoreOps, Rope, SC EXPORTS SCCoreUtil = BEGIN EnumerateInstances: PUBLIC PROC [cellType: Core.CellType, eachInstance: SCCoreUtil.EachInstanceProc] RETURNS [quit: BOOL _ FALSE] = { <> data: CoreClasses.RecordCellType _ NARROW[cellType.data]; IF data = NIL THEN SC.Error[callingError, Rope.Cat["Invalid Record Cell: ", cellType.name]]; FOR instList: CoreClasses.CellInstanceList _ data.instances, instList.rest WHILE instList # NIL AND ~quit DO quit _ eachInstance[instList.first]; ENDLOOP}; EnumerateFlatWires: PUBLIC PROC [wire: Core.WireSequence, eachWire: SCCoreUtil.EachWireProc] RETURNS [quit: BOOL _ FALSE] = { DoWire: CoreOps.EachWireProc = { IF wire.elements = NIL THEN [subWires, quit] _ eachWire[wire]}; [] _ CoreOps.VisitWireSequence[wire, DoWire]}; EnumFlatInstancePins: PUBLIC PROC [cellInstance: CoreClasses.CellInstance, eachInstancePin: SCCoreUtil.EachInstancePinProc] = { DoWire: CoreOps.EachWirePairProc = { IF actualWire.elements = NIL AND publicWire.elements = NIL THEN [subWires, quit] _ eachInstancePin[actualWire, publicWire]}; [] _ CoreOps.VisitBinding[cellInstance.actual, cellInstance.type.public, DoWire]}; END.