<> <> <> <> <> <> DIRECTORY CD USING [Design, Instance, InstanceList, lambda, Object, Position], CDCommandOps USING [CallWithResource], CDInstances USING [OnlySelected], CDMenus USING [CreateEntry], CDOps USING [InstList, Info], CDOrient USING [MapPoint], CDSequencer USING [Command, ImplementCommand], IO USING [EndOfStream, Error, GetInt, RIS, STREAM], Process USING [priorityBackground, SetPriority], Rope USING [Cat, ROPE], SXAccess USING [Analyze], SXAtoms USING [analyzeAndCoreSelected, analyzeAndRoseSelected, analyzeAndThymeSelected, analyzeSelected, coreOut, highlightKeyboardCoordsNode, highlightPointedNode, rosePrint, thymePrint], SXHighlightNode USING [HighlightNode], TerminalIO USING [RequestRope, WriteRope]; SXCommands: CEDAR PROGRAM IMPORTS CDCommandOps, CDInstances, CDMenus, CDOps, CDOrient, CDSequencer, IO, Process, Rope, SXAccess, SXAtoms, SXHighlightNode, TerminalIO = BEGIN AnalyzeComm: PROCEDURE [comm: CDSequencer.Command] = BEGIN stopFlag: REF BOOL _ NEW[BOOL_FALSE]; ProtectedAnalyzeComm: PROCEDURE [comm: CDSequencer.Command] = BEGIN selected: CD.InstanceList _ CDInstances.OnlySelected[CDOps.InstList[comm.design]]; IF selected=NIL THEN TerminalIO.WriteRope[ "no selection\n"] ELSE { skipped: BOOL; format: REF ANY; SELECT comm.a FROM SXAtoms.analyzeAndThymeSelected => { TerminalIO.WriteRope["Analysis and Thyme format extraction of\n"]; format _ SXAtoms.thymePrint; }; SXAtoms.analyzeAndRoseSelected => { TerminalIO.WriteRope["Analysis and Rosemary format extraction of\n"]; format _ SXAtoms.rosePrint; }; SXAtoms.analyzeAndCoreSelected => { TerminalIO.WriteRope["Analysis and Core format extraction of\n"]; format _ SXAtoms.coreOut; }; ENDCASE => { TerminalIO.WriteRope["Analysis of\n"]; format _ NIL; }; FOR list: CD.InstanceList _ selected, list.rest WHILE list#NIL DO TerminalIO.WriteRope[Rope.Cat[" ", CDOps.Info[list.first.ob], "\n"]]; ENDLOOP; TRUSTED { Process.SetPriority[Process.priorityBackground] }; skipped _ SXAccess.Analyze[design: comm.design, hierarchyRoots: selected, formatKey: format, stopFlag: stopFlag]; IF skipped THEN TerminalIO.WriteRope["Analysis skipped\n"] ELSE TerminalIO.WriteRope["Analysis complete\n"] } END; TerminalIO.WriteRope["Spinifex\n"]; [] _ CDCommandOps.CallWithResource[ProtectedAnalyzeComm, comm, $Spinifex, stopFlag]; END; HighLightNode: PROCEDURE [comm: CDSequencer.Command] = BEGIN TerminalIO.WriteRope["Highlight Node (cur layer, pointed)\n"]; TRUSTED { Process.SetPriority[Process.priorityBackground] }; SXHighlightNode.HighlightNode[comm.design, comm.pos, comm.l]; END; HighLightNodeFromKeyboard: PROCEDURE [comm: CDSequencer.Command] = BEGIN ENABLE { IO.Error => { TerminalIO.WriteRope[" Invalid Coords (Format is: x y )\n"]; ERROR ABORTED }; IO.EndOfStream => { TerminalIO.WriteRope[" Invalid Coords (Format is: x y )\n"]; ERROR ABORTED }; }; coords: CD.Position _ [0,0]; inLine: IO.STREAM ~ IO.RIS[ TerminalIO.RequestRope["Highlight Node (cur layer)\n Enter coords of node relative to currently pushed cell>"]]; coords.x _ IO.GetInt[inLine] * CD.lambda; coords.y _ IO.GetInt[inLine] * CD.lambda; TRUSTED { Process.SetPriority[Process.priorityBackground] }; <<-- Transform coords from those of currently pushed appliaction to those of screen.>> { a: CD.Instance ~ comm.design.actual.first.mightReplace; IF a # NIL THEN coords _ CDOrient.MapPoint[ coords, a.ob.size, a.orientation, a.location]; }; SXHighlightNode.HighlightNode[comm.design, coords, comm.l]; END; <<>> <<-- SpinifexCommands>> CDSequencer.ImplementCommand[a: SXAtoms.analyzeSelected, p: AnalyzeComm, queue: doQueue]; CDSequencer.ImplementCommand[a: SXAtoms.analyzeAndThymeSelected, p: AnalyzeComm, queue: doQueue]; CDSequencer.ImplementCommand[a: SXAtoms.analyzeAndRoseSelected, p: AnalyzeComm, queue: doQueue]; CDSequencer.ImplementCommand[a: SXAtoms.analyzeAndCoreSelected, p: AnalyzeComm, queue: doQueue]; CDSequencer.ImplementCommand[a: SXAtoms.highlightPointedNode, p: HighLightNode, queue: doQueue]; CDSequencer.ImplementCommand[a: SXAtoms.highlightKeyboardCoordsNode, p: HighLightNodeFromKeyboard, queue: doQueue]; CDMenus.CreateEntry[menu: $ProgramMenu, entry: "DRC", key: SXAtoms.analyzeSelected]; CDMenus.CreateEntry[menu: $ProgramMenu, entry: "DRC & extract Thyme", key: SXAtoms.analyzeAndThymeSelected]; CDMenus.CreateEntry[menu: $ProgramMenu, entry: "DRC & extract Rose", key: SXAtoms.analyzeAndRoseSelected]; CDMenus.CreateEntry[menu: $ProgramMenu, entry: "DRC & extract Core", key: SXAtoms.analyzeAndCoreSelected]; CDMenus.CreateEntry[menu: $RectProgramMenu, entry: "Highlight node", key: SXAtoms.highlightPointedNode]; CDMenus.CreateEntry[menu: $ProgramMenu, entry: "Highlight node (at coords)", key: SXAtoms.highlightKeyboardCoordsNode]; TerminalIO.WriteRope["Spinifex layout analysis package loaded\n"] END. <> <> <> <> <> <> <> <> <> <> <> <> <> <> <> <<>>