<> <> <> <<>> <> <<>> DIRECTORY CD, CDBasics, CDBasicsInline, CDCells, CDCommandOps, CDDirectory, CDImports, CDInstances, CDOps, CDProperties, CDSatellites, CDSequencer, CDViewer, Core, CoreCDUser, CoreClasses, CoreFlat, CoreGeometry, CoreOps, ExtractOps, InstanceTable, IO, PW, PWCore, RefTab, Rope, Sinix, Sisyph, TerminalIO, ViewerClasses, ViewerOps; DAUserHacks: CEDAR PROGRAM IMPORTS CD, CDBasics, CDCells, CDCommandOps, CDDirectory, CDImports, CDInstances, CDOps, CDProperties, CDSatellites, CDSequencer, CDViewer, CoreCDUser, CoreClasses, CoreFlat, CoreGeometry, CoreOps, ExtractOps, InstanceTable, IO, PW, PWCore, RefTab, Rope, Sinix, Sisyph, TerminalIO, ViewerOps ~ BEGIN hackMenu: ATOM _ $SpecialMenu; -- where DAUserHacks commands are forcefully registered <> <> <> < if nothing is selected, do first a 'Select wire roots' operations. Then repeat a 'Grow wire one step' operation until either nothing more gets connected, or an error occurs.>> <> <> <> <> CoreCDItem: TYPE ~ RECORD [core: REF ANY, inst: CD.Instance]; Context: TYPE ~ REF ContextRep; ContextRep: TYPE ~ RECORD [ design: CD.Design _ NIL, mode: Sinix.Mode _ NIL, ob: CD.Object, -- the top-level pushed-in object name: Rope.ROPE _ NIL, -- of current wire, there may be only one highlight: CD.InstanceList _ NIL, userData: REF ANY _ NIL, rects: SEQUENCE nbOfLayers: NAT OF InstanceTable.Table ]; <> NewContext: PROC [design: CD.Design] RETURNS [cx: Context] ~ { <> CheckInstance: CDCells.InstEnumerator ~ { subResult: REF; subProps: Core.Properties; badInst: BOOL _ FALSE; CDProperties.PutInstanceProp[inst, Sinix.satellitesProp, CDSatellites.GetSatelliteRopes[inst]]; [subResult, subProps] _ Sinix.Extract[inst.ob, cx.mode, inst.properties, cx.userData]; IF subResult#NIL THEN WITH subResult SELECT FROM subWire: Core.Wire => badInst _ badInst OR subWire.size#0; subWires: Core.Wires => UNTIL subWires=NIL DO badInst _ badInst OR subWires.first.size#0; subWires _ subWires.rest; ENDLOOP; subCellType: Core.CellType => FOR i: NAT IN [0..subCellType.public.size) DO badInst _ badInst OR subCellType.public[i].size#0; ENDLOOP; ENDCASE => ERROR; -- Extract returned incorrect value... IF badInst THEN cx.highlight _ CONS [ExtractOps.HighlightInstance[[inst.ob, inst.trans]], cx.highlight]; }; ob: CD.Object = CDOps.PushedTopCell[design]; mode: Sinix.Mode = ExtractOps.GetExtractMode[design, ob]; cx _ NEW [ContextRep[mode.nbOfLayers]]; cx.design _ design; cx.ob _ ob; IF CDOps.RealTopCell[design]=ob THEN ERROR; -- not pushed into a cell [] _ CDSatellites.GetSatellites[ob]; -- enforce satellites links !!! cx.mode _ mode; cx.userData _ IF mode.userData#NIL THEN mode.userData[design] ELSE NIL; [] _ CDCells.EnumerateInstances[ob, CheckInstance]; ExtractOps.HighlightDesignList[cx.design, cx.highlight]; -- in any case IF cx.highlight#NIL THEN { -- something went wrong TerminalIO.PutF["Highlighted instances have structured wires, not supported...\n"]; cx _ NIL; -- notifies of error return }; }; DestroyContext: PROC [cx: Context] ~ { <> FOR i: NAT IN [0..cx.mode.nbOfLayers) DO InstanceTable.DeleteOutside[cx.rects[i]]; ENDLOOP; }; Select: PROC [inst: CD.Instance, cx: Context] RETURNS [new: BOOL] ~ { <