DIRECTORY Core, CoreFlat, CoreOps, IO, PlotGraph, RefText, Rope, SpiceOps, SymTab; SpiceOutputViewImpl: CEDAR PROGRAM IMPORTS CoreFlat, CoreOps, IO, PlotGraph, RefText, Rope, SymTab EXPORTS SpiceOps ~ BEGIN ConvData: TYPE ~ SpiceOps.ConvData; ROPE: TYPE ~ Rope.ROPE; VEC: TYPE ~ PlotGraph.VEC; VecList: TYPE ~ LIST OF VEC; matchingPattern: ROPE = "0**** "; analysisRope: ROPE = "ANALYSIS"; patternLength: INT = Rope.Length[matchingPattern]; leftPar: ROPE = "("; rigthPar: ROPE = ")"; window: PlotGraph.Rectangle _ [0.0, 0.0, 100.0, 5.0]; DisplaySpiceListing: PUBLIC PROC [convData: ConvData] ~ { plot: PlotGraph.Plot; stream: IO.STREAM _ convData.inS; IF stream=NIL THEN RETURN; SearchListingFile[stream, analysisRope]; plot _ PlotGraph.CreatePlot[CoreOps.GetCellTypeName[convData.rootCell]]; ReadFirstLine[stream, plot]; ChangeNames[plot, convData.rootCell, convData.invTable]; FillPlot[stream, plot]; PlotGraph.RefreshPlot[plot: plot, within: window, eraseFirst: TRUE] }; ChangeNames: PROC [plot: PlotGraph.Plot, cellType: Core.CellType, nameTable: SymTab.Ref] ~ { FOR iAxis: PlotGraph.AxisList _ plot.axis, iAxis.rest UNTIL iAxis=NIL DO wire: CoreFlat.FlatWire _ NARROW[SymTab.Fetch[nameTable, iAxis.first.name].val]; IF wire#NIL THEN iAxis.first.name _ CoreFlat.WirePathRope[cellType, wire^]; ENDLOOP; }; MyGetLineRope: PROC [stream: IO.STREAM] RETURNS [line: ROPE _ NIL] ~ { bufMax: NAT = 256; buffer: REF TEXT = RefText.ObtainScratch[bufMax]; bLen: NAT _ 0; chars: INT _ 0; { ENABLE UNWIND => RefText.ReleaseScratch[buffer]; DO char: CHAR _ IO.GetChar[stream ! IO.EndOfStream => IF chars > 0 THEN EXIT ELSE REJECT]; IF char = '\n OR char = '\l THEN EXIT; chars _ chars + 1; IF bLen = bufMax THEN { buffer.length _ bLen; line _ Rope.Concat[line, Rope.FromRefText[buffer]]; bLen _ 0; }; buffer[bLen] _ char; bLen _ bLen+1; ENDLOOP; }; buffer.length _ bLen; IF bLen # 0 THEN line _ Rope.Concat[line, Rope.FromRefText[buffer]]; RefText.ReleaseScratch[buffer]; RETURN [line]; }; SearchListingFile: PUBLIC PROC [stream: IO.STREAM, partName: ROPE] ~ { DO l: ROPE _ MyGetLineRope[stream]; IF Rope.Equal[Rope.Substr[l, 0, patternLength], matchingPattern] THEN IF Rope.Find[l, partName]> 0 THEN EXIT; ENDLOOP; [] _ MyGetLineRope[stream]; -- blank line [] _ MyGetLineRope[stream]; -- *****... line [] _ MyGetLineRope[stream]; -- blank line [] _ MyGetLineRope[stream]; -- blank line [] _ MyGetLineRope[stream]; -- blank line }; SpaceInsideLine: IO.BreakProc ~ { RETURN[SELECT char FROM IO.TAB, IO.SP => sepr, IO.CR, IO.LF, '(, ') => break, ENDCASE => other] }; ReadFirstLine: PUBLIC PROC [stream: IO.STREAM, plot: PlotGraph.Plot] ~ { nLines: INT _ 0; base, height: REAL; token: ROPE _ IO.GetTokenRope[stream, SpaceInsideLine].token; -- gets "TIME" token _ IO.GetTokenRope[stream, SpaceInsideLine].token; -- 1st output UNTIL IsEOL[token] DO name: ROPE; graph: PlotGraph.Graph _ NEW[PlotGraph.GraphRec _ [class: gClass]]; SELECT Rope.Fetch[token, 0] FROM 'V => {base _ 0.0; height _ 5.0}; 'I => {base _ 0.0; height _ 1e-6; name _ "Current in "}; ENDCASE => ERROR; IF ~Rope.Equal[IO.GetTokenRope[stream, SpaceInsideLine].token, leftPar] THEN ERROR; name _ Rope.Cat[name, IO.GetTokenRope[stream, SpaceInsideLine].token, " "]; IF ~Rope.Equal[IO.GetTokenRope[stream, SpaceInsideLine].token, rigthPar] THEN ERROR; nLines _ nLines+1; plot.axis _ CONS[NEW[PlotGraph.AxisRec _ [ graphs: LIST[graph], bounds: [0.0, base, 100.0, height], name: name, style: analog, axisData: [axisData, axisData] ]], plot.axis]; token _ IO.GetTokenRope[stream, SpaceInsideLine].token; ENDLOOP; }; MyGetReal: PROC [stream: IO.STREAM] RETURNS [r: REAL] ~ { r _ IO.GetReal[stream]; IF IO.PeekChar[stream]#'. THEN RETURN; [] _ IO.GetTokenRope[stream, SpaceInsideLine]; IF r=0.0 THEN IF ~Rope.Equal[IO.GetTokenRope[stream, SpaceInsideLine].token, "e+00"] THEN ERROR; }; IsEOL: PROC [token: ROPE] RETURNS [isEol: BOOLEAN] ~ { RETURN[SELECT Rope.Fetch[token, 0] FROM IO.LF, IO.CR => TRUE, ENDCASE => FALSE] }; ReadValues: PUBLIC PROC [stream: IO.STREAM, nVal: INT] RETURNS [vecList: VecList] ~ { eolRope: ROPE; time: REAL _ MyGetReal[stream]*1.e9; THROUGH [1..nVal] DO vecList _ CONS[[time, MyGetReal[stream]], vecList]; ENDLOOP; eolRope _ IO.GetTokenRope[stream, SpaceInsideLine].token; IF ~IsEOL[eolRope] THEN ERROR; }; Normalize: PROC [r: REAL] RETURNS [dec: REAL] ~ { neg: BOOL _ r<0.0; unsigned: REAL _ IF neg THEN -r ELSE r; base: REAL _ IF unsigned<1.0 THEN 10.0 ELSE 0.1; dec _ 1.0; IF r#0.0 THEN UNTIL unsigned>=1.0 AND unsigned<10.0 DO dec _ dec/base; unsigned _ unsigned*base; ENDLOOP; dec _ SELECT TRUE FROM unsigned<1.5 => dec, unsigned<3.5 => 2.0*dec, unsigned<7.5 => 5.0*dec, ENDCASE => 10.0*dec; IF neg THEN dec _ -dec; }; FillPlot: PROC [stream: IO.STREAM, plot: PlotGraph.Plot] ~ { nVal: INT _ 0; [] _ IO.GetTokenRope[stream, SpaceInsideLine]; [] _ IO.GetTokenRope[stream, SpaceInsideLine]; -- skip 2 lines plot.lowerBounds _ [1.0e24, 1.0e24]; plot.upperBounds _ [-1.0e24, -1.0e24]; FOR iAxis: PlotGraph.AxisList _ plot.axis, iAxis.rest UNTIL iAxis=NIL DO nVal _ nVal+1; ENDLOOP; DO axisList: PlotGraph.AxisList _ plot.axis; lineVecList: VecList _ ReadValues[stream, nVal]; IF IO.PeekChar[stream]#IO.SP THEN RETURN; FOR iVecList: VecList _ lineVecList, iVecList.rest UNTIL iVecList=NIL DO vecList: VecList _ CONS[iVecList.first, NARROW[axisList.first.graphs.first.data]]; axisList.first.graphs.first.data _ vecList; IF lineVecList.first.yaxisList.first.bounds.h THEN axisList.first.bounds.h _ Normalize[lineVecList.first.y]; axisList _ axisList.rest; ENDLOOP; ENDLOOP; }; Enum: PlotGraph.GraphEnumerateProc ~ { FOR iVecList: VecList _ NARROW[graph.data], iVecList.rest UNTIL iVecList=NIL DO IF eachPoint[iVecList.first.x, iVecList.first.y] THEN RETURN [TRUE]; ENDLOOP; }; gClass: PlotGraph.GraphClass _ NEW[PlotGraph.GraphClassRec _ [ insert: NIL, delete: NIL, enumerate: Enum ]]; axisData: PlotGraph.AxisData _ [1.0, TRUE]; END. ςSpiceOutputViewImpl.mesa Copyright c 1986 by Xerox Corporation. All rights reserved. Christian LeCocq March 25, 1987 10:01:45 am PST Christian Le Cocq April 8, 1988 6:02:32 pm PDT Description of what this module does. Public I/Os Description of the procedure. for transient analysis the next line is : " TIME V(1) V(2)"... which is where the data begins. PROC [char: CHAR] RETURNS [CharClass] Description of the procedure. the extra space is needed in order to recognize the wire name - see SpiceInputGenImpl.NextInstanceId which generates rope numbers. Tries to cope with 0 being written as 0. e+00, which is 2 tokens for IO. Description of the procedure. rounds r to the closest "round decimal number" Display PROC [plot: PlotGraph.Plot, graph: PlotGraph.Graph, bounds: PlotGraph.Rectangle, eachPoint: PlotGraph.PointProc] RETURNS [invalidEnumeration: BOOL _ FALSE] ~ { Commander.Register[key: "SpiceOps", proc: SpiceDisplayCmd, doc: "Display files sent by Spice"]; Κ Η˜codešœ™Kšœ Οmœ1™žœ˜CK˜K˜—š  œžœK˜\šžœ3žœžœž˜HKšœžœ0˜PKšžœžœžœ;˜KKšžœ˜—K˜K˜——™š  œžœ žœžœžœžœžœ˜FKšœžœ˜Kšœžœžœ!˜1Kšœžœ˜Kšœžœ˜šœžœžœ#˜2šž˜šœžœ˜ šžœ˜Kš œžœžœ žœžœžœžœ˜8——Kšžœ žœ žœžœ˜&Kšœ˜šžœžœ˜Kšœ˜Kšœ3˜3Kšœ ˜ K˜—Kšœ˜Kšœ˜Kšžœ˜—K˜—Kšœ˜Kšžœ žœ4˜DKšœ˜Kšžœ˜K˜K˜—š  œžœžœ žœžœ žœ˜FK™šž˜Kšœžœ˜ šžœ?ž˜EKšžœžœžœ˜'—Kšžœ˜—KšœΟc ˜)Kšœ‘˜,Kšœ‘ ˜)Kšœ‘ ˜)Kšœ‘ ˜)šœ+™+Kšœžœ™$—K™K˜K™—š œžœ˜!Jšžœžœžœ ™%šžœžœž˜Kšžœžœžœžœ ˜Kšžœžœžœžœ˜Kšžœ ˜—Jšœ˜J˜—š   œžœžœ žœžœ˜HK™Kšœžœ˜Kšœžœ˜Kšœžœžœ.‘˜LKšœžœ.‘ ˜Ešžœž˜Kšœžœ˜ Kšœžœ'˜Cšžœž˜ Kšœ!˜!Kšœ8˜8Kšžœžœ˜—Kšžœ žœ7žœžœ˜Sšœžœ3˜KKšœ‚™‚—Kšžœ žœ8žœžœ˜TKšœ˜šœ žœžœ˜*Kšœžœ˜Kšœ#˜#Kšœ ˜ Kšœ˜Kšœ˜Kšœ˜—Kšœžœ-˜7Kšžœ˜—K˜K˜—š   œžœ žœžœžœžœ˜9Kšœ&Οb œ™JKšœžœž˜Kšžœžœžœžœ˜&Kšœžœ'˜.Kš žœžœžœ žœ6žœžœ˜`K˜K˜—š  œžœ žœžœ žœ˜6šžœžœž˜'Kš žœžœžœžœžœ˜Kšžœžœ˜—K˜K˜—š  œžœžœ žœžœžœžœ˜UK™Kšœ žœ˜Kšœžœ˜$šžœ ž˜Kšœ žœ%˜3Kšžœ˜—Kšœ žœ-˜9Kšžœžœžœ˜˜K™——š   œžœžœžœžœ˜1K™/Kšœžœ ˜Kš œ žœžœžœžœ˜'Kš œžœžœžœžœ˜1Kšœ ˜ š žœžœžœžœž˜6Kšœ˜Kšœ˜Kšžœ˜—šœž˜Kšœ˜Kšœ˜Kšœ˜Kšžœ ˜—Kšžœžœ ˜K˜K˜—š œžœ žœžœ˜Kšœ$˜$Kšœ&˜&šžœ3žœžœž˜HKšœ˜Kšžœ˜—šž˜Kšœ)˜)Kšœ0˜0Kš žœžœžœžœžœžœ˜)šžœ0žœ žœž˜HKšœžœžœ$˜RKšœ+˜+Kšžœ-žœ:˜mKšžœ-žœ:˜mKšœ˜Kšžœ˜—Kšžœ˜—K˜——™šΠbnœ"˜&Kšžœmžœžœžœ™Ÿš žœžœžœ žœž˜OKšžœ/žœžœžœ˜DKšžœ˜—K˜K˜—šœžœ˜>Kšœžœ˜ Kšœžœ˜ Kšœ˜K˜—Kšœ%žœ˜+K•StartOfExpansionx[key: ROPE, proc: Commander.CommandProc, doc: ROPE _ NIL, clientData: REF ANY _ NIL, interpreted: BOOL _ TRUE]šœ_™_K˜K™—K˜Kšžœ˜—…—’%K