DIRECTORY CedarProcess, CD, CDCells, CDOps, CDSequencer, CDSequencerExtras, Core, CoreOps, FS, IO, Rope, Rsh, SinixOps, Sisyph, TerminalIO, SpiceOps; SpiceCDCmds: CEDAR MONITOR IMPORTS CedarProcess, CDCells, CDOps, CDSequencerExtras, CoreOps, IO, FS, Rope, Rsh, SinixOps, Sisyph, SpiceOps, TerminalIO ~ BEGIN ROPE: TYPE = Rope.ROPE; stop: BOOL _ FALSE; cmd: ROPE _ "/usr/datools/spice "; host: ROPE _ "velantia"; SIGTERM: CHAR = VAL[15]; -- Unix signal to terminate a process. debug: BOOLEAN _ FALSE; local: BOOLEAN _ FALSE; WriteToFile: PROC [cellType: Core.CellType] ~ { cellName: Rope.ROPE _ CoreOps.GetCellTypeName[cellType]; s: IO.STREAM _ FS.StreamOpen[fileName: Rope.Cat[cellName, ".spice"], accessOptions: create]; convData: SpiceOps.ConvData _ SpiceOps.CreateConvData[s, s]; convData.rootCell _ cellType; SpiceOps.WriteSpiceDeck[cellType, convData]; }; ExtractSelectedObjAndSpiceIt: PROC [comm: CDSequencer.Command] = { msg: Rope.ROPE; selected: CD.Instance; multiple: BOOL; stdStr, errStr: IO.STREAM; cellType: Core.CellType; cellName: Rope.ROPE; [selected, multiple] _ CDOps.SelectedInstance[comm.design]; IF ~IsSingleSelectedAndCell[selected, multiple] THEN RETURN; cellType _ NARROW [SinixOps.ExtractCDInstance[selected, comm.design, Sisyph.mode].result]; IF local THEN {WriteToFile[cellType]; RETURN;}; cellName _ CoreOps.GetCellTypeName[cellType]; TerminalIO.PutRopes["SpiceOps on ", cellName, " ."]; [stdStr, errStr, msg] _ Rsh.RemoteShell[host, cmd, TRUE]; IF stdStr#NIL THEN { ENABLE ABORTED => { IO.PutChar[errStr, SIGTERM]; IO.Flush[errStr]; IO.Close[errStr]; IO.Close[stdStr]; TerminalIO.PutRopes["SpiceOps Failure : ", msg, "\n"]; GOTO Failed }; convData: SpiceOps.ConvData _ SpiceOps.CreateConvData[stdStr, stdStr]; convData.rootCell _ cellType; IF msg#NIL THEN ERROR ABORTED; IF debug THEN [] _ CedarProcess.Fork[action: WatchErrors, data: stdStr] ELSE [] _ CedarProcess.Fork[ReadOutput, convData, [inheritProperties: TRUE]]; [] _ CedarProcess.Fork[action: WatchErrors, data: errStr]; SpiceOps.WriteSpiceDeck[cellType, convData]; IO.Flush[stdStr]; IO.Close[stdStr]; TerminalIO.PutRope["."]; }; EXITS Failed => {}; }; ReadOutput: PROC [data: REF] RETURNS [result: REF _ NIL] ~ { line: Rope.ROPE _ NIL; convData: SpiceOps.ConvData _ NARROW[data]; stdStr: IO.STREAM _ convData.inS; fileName: Rope.ROPE _ Rope.Cat[CoreOps.GetCellTypeName[convData.rootCell], ".spo"]; file: IO.STREAM _ FS.StreamOpen[fileName, create]; WHILE NOT IO.EndOf[stdStr] DO c: CHAR _ IO.GetChar[stdStr]; IF c = '\l THEN { IO.PutRope[file, line]; IO.PutChar[file, '\n]; line _ NIL; } ELSE line _ Rope.Concat[line, Rope.FromChar[c]]; ENDLOOP; IF line#NIL THEN IO.PutRope[file, line]; IO.Close[file]; convData.inS _ FS.StreamOpen[fileName]; TerminalIO.PutRopes[".finished, ", fileName, " created.\n"]; SpiceOps.DisplaySpiceListing[convData ! IO.EndOfStream => { TerminalIO.PutRope["\n\n\n ***** Spice ERROR: open the .spo file **** \n\n\n"]; CONTINUE; }]; }; WatchErrors: PROC [data: REF] RETURNS [results: REF _ NIL] ~ { line: Rope.ROPE _ NIL; errStr: IO.STREAM _ NARROW[data]; WHILE NOT IO.EndOf[errStr] DO c: CHAR _ IO.GetChar[errStr ! IO.EndOfStream => { IF line#NIL THEN TerminalIO.PutRopes[line, "\n"]; GOTO CleanExit }]; IF c = '\l THEN { TerminalIO.PutRopes[line, "\n"]; line _ NIL; } ELSE line _ Rope.Concat[line, Rope.FromChar[c]]; ENDLOOP; EXITS CleanExit => NULL; }; IsSingleSelectedAndCell: PROC [selected: CD.Instance, multiple: BOOL] RETURNS [BOOL] = { IF ~IsSingleSelected[selected, multiple] THEN RETURN [FALSE]; IF ~CDCells.IsCell[selected.ob] THEN { TerminalIO.PutRope["\n** Selected instance is not a cellcan't do it.\n"]; RETURN[FALSE]; }; RETURN[TRUE]; }; IsSingleSelected: PROC [selected: CD.Instance, multiple: BOOL] RETURNS [BOOL] = { IF selected=NIL THEN { TerminalIO.PutRope["\n** No current selection--can't do it.\n"]; RETURN[FALSE]; }; IF multiple THEN { TerminalIO.PutRope["\n** Multiple instances selected--can't do it.\n"]; RETURN[FALSE]; }; RETURN[TRUE]; }; LoadModelFile: PROC [fileName: Rope.ROPE] ~ { file: IO.STREAM _ FS.StreamOpen[fileName]; SpiceOps.ReadModels[file]; }; CDSequencerExtras.RegisterCommand[key: $Spice, proc: ExtractSelectedObjAndSpiceIt, queue: doQueue]; LoadModelFile["MODELS.DAT"]; END. าSpiceCDCmds.mesa Copyright ำ 1987, 1988 by Xerox Corporation. All rights reserved. Christian Le Cocq September 27, 1988 5:11:43 pm PDT LeCocq, July 23, 1987 2:48:49 pm PDT Command Procs Initialization ส .˜šœ™Icode™BK™3K™$—J™šฯk ˜ Jšœ ˜ Jšœ˜Jšœ ˜ Jšœ˜Jšœ ˜ Jšœ˜Jšœ˜J˜Jšœ˜Jšœ˜Jšœ˜J˜Jšœ ˜ Jšœ˜Jšœ ˜ Jšœ ˜ J˜—šะbl œœ˜Kšœ9œœ3˜{Kšœ˜K˜Kšœœœ˜Kšœœœ˜Kšœœ˜"Kšœœ˜Kšœœœฯc&˜?K˜Kšœœœ˜Kšœœœ˜—head™ šฯn œœ˜/Kšœœ%˜8K•StartOfExpansionส[fileName: ROPE, accessOptions: FS.AccessOptions _ read, streamOptions: FS.StreamOptions _ (3)[TRUE, TRUE, TRUE], keep: CARDINAL _ 1B (1), createByteCount: FS.ByteCount _ 2560, streamBufferParms: FS.StreamBufferParms _ [vmPagesPerBuffer: 8, nBuffers: 2], extendFileProc: FS.ExtendFileProc, wantedCreatedTime: GMT _ nullGMT, remoteCheck: BOOL _ TRUE, wDir: ROPE _ NIL, checkFileType: BOOL _ FALSE, fileType: FS.FileType _ [0B (0)]]šœœœœK˜\Kšœ<˜Kšœ œœ˜Kšœœœœ˜!šœœœ˜šœœœœ˜1Kšœœœ!˜1Kšœ ˜Kšœ˜—šœ œ˜Kšœ ˜ Kšœœ˜ K˜—Kšœ,˜0Kšœ˜—š˜Kšœ ˜—K˜K˜—š  œœ œœœœ˜XKšœ'œœœ˜=šœœ˜&KšœJ˜JKšœœ˜K˜—Kšœœ˜ Kšœ˜—K˜š  œœ œœœœ˜Qšœ œœ˜Kšœ@˜@Kšœœ˜K˜—šœ œ˜KšœG˜GKšœœ˜K˜—Kšœœ˜ Kšœ˜K˜—š  œœœ˜-Kšœœœœ˜*K˜K˜K˜——™Kšœc˜cK˜Kšœ˜——…—ฆฆ