<> <> <> <> <> <> <> DIRECTORY TerminalIO USING [WriteRope, RequestRope], CD USING [Design, ObPtr, ApplicationList, DesignPosition, ApplicationPtr, lambda], CDApplications USING [OnlySelected], CDCommandOps, CDSequencer USING [Command, ImplementCommand], CDMenus USING [CreateEntry], CDOps USING [AppList, Info], CDOrient USING [MapPoint], Process USING [SetPriority, priorityBackground], Rope USING [Cat, ROPE], IO USING [Error, EndOfStream, GetInt, RIS, STREAM], SXAtoms USING [analyzeSelected, analyzeAndThymeSelected, thymePrint, analyzeAndRoseSelected, rosePrint, highlightPointedNode, highlightKeyboardCoordsNode], SXAccess USING [Analyze], SXHighlightNode USING [HighlightNode]; SXCommands: CEDAR PROGRAM IMPORTS TerminalIO, CDApplications, CDCommandOps, CDSequencer, CDMenus, CDOps, CDOrient, Process, Rope, IO, SXAtoms, SXAccess, SXHighlightNode = BEGIN AnalyzeComm: PROCEDURE [comm: CDSequencer.Command] = BEGIN stopFlag: REF BOOL _ NEW[BOOL_FALSE]; ProtectedAnalyzeComm: PROCEDURE [comm: CDSequencer.Command] = BEGIN selected: CD.ApplicationList _ CDApplications.OnlySelected[CDOps.AppList[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; }; ENDCASE => { TerminalIO.WriteRope["Analysis of\n"]; format _ NIL; }; FOR list: CD.ApplicationList _ 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.DesignPosition _ [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.ApplicationPtr ~ 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.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: $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. <<>> <> <> <> <<>> <> <> <<>> <> <> <<>> <> <> <<>> <<>> <> <> <> <<>> <<>> <<>> <<>> <<>>