DIRECTORY BasicTime USING [Now], CommandTool USING [Run], Core USING [CellType], FileNames USING [CurrentWorkingDirectory], FS USING [Error], IO USING [PutF, rope], MessageWindow USING [Append], Process USING [Detach, GetPriority, Priority, priorityBackground, SetPriority], RefText USING [New], Rope USING [Equal, Find, FromRefText, IsEmpty, ROPE, Substr], ThymeGlobals USING [Aborted, Bomb, CircuitRec, CleanUp, DefineCircuit, DumpAll, Error, ErrWarnSummary, fileNameStackSeq, fileStackSeq, function, functionTable, FuncTableBlk, Handle, keys, MakePlotList, MakePrintList, maxInclude, maxLog, maxPlots, maxPrints, model, modFuncPtr, modelTable, ModelTableBlk, nameBlk, namePtr, Next, NodeRec, OpenInputFile, Output, PlotSeq, PrintHole, PrintSeq, PutMsgLine, RunIt, SearchKey, SetICs, TopoAnalysis, Variables, WorstNodeLog], ViewerClasses USING [Viewer], ViewerTools USING [SetContents]; ThymeMain: CEDAR MONITOR IMPORTS BasicTime, CommandTool, FileNames, FS, IO, MessageWindow, Process, RefText, Rope, ThymeGlobals, ViewerTools EXPORTS ThymeGlobals ={ OPEN ThymeGlobals; NormalRun: PUBLIC PROC[handle: Handle, background, fork: BOOL _ TRUE]= { IF handle = NIL THEN RETURN; IF handle.stage=idle AND handle.simulation=NIL THEN { curPriority: Process.Priority = Process.GetPriority[]; IF background THEN Process.SetPriority[Process.priorityBackground]; handle.stage _ input; IF fork THEN { handle.simulation _ FORK Simulate[NIL, handle]; TRUSTED {Process.Detach[handle.simulation]}; } ELSE { handle.simulation _ NIL; Simulate[NIL, handle]; }; Process.SetPriority[curPriority]; } ELSE MessageWindow.Append[message: "Previous simulation has not finished yet.", clearFirst: TRUE]; }; -- NormalRun BatchRun: PUBLIC PROC[handle: Handle, wDir, inputFile: Rope.ROPE _ NIL, background, fork: BOOL _ TRUE]= { IF handle = NIL OR inputFile = NIL THEN RETURN; IF wDir = NIL THEN wDir _ FileNames.CurrentWorkingDirectory[]; ViewerTools.SetContents[handle.wDir, wDir]; ViewerTools.SetContents[handle.input, inputFile]; NormalRun[handle, background, fork]; }; -- BatchRun Simulate: PUBLIC PROC[cell: Core.CellType, handle: Handle]= { ENABLE { Aborted => GOTO stop; ABORTED => {handle.vars.canned _ TRUE; GOTO dumpStop}; FS.Error => { handle.msgStream.PutF["%g\nProgram stopped.\n", IO.rope[error.explanation]]; GOTO stop; }; }; theRoot: namePtr _ NEW[nameBlk _ [name: "Main Circuit", details: NEW[CircuitRec_ []]] ]; gndNodeName: namePtr _ NEW[nameBlk _ [name: "Gnd", details: NEW[NodeRec] ] ]; Process.SetPriority[Process.priorityBackground]; InitVars[handle]; OpenInputFile[handle]; Next[handle]; WHILE handle.vars.item=name DO IF Canned[handle] THEN GOTO stop; IF SearchKey[handle]=libraryKey THEN AddLibrary[handle] ELSE EXIT; ENDLOOP; IF handle.vars.item=name AND SearchKey[handle]=circuitKey THEN { DefineCircuit[handle: handle, cktRoot: theRoot, gndNodeName: gndNodeName]; -- may signal Aborted } ELSE Error[handle, 820, TRUE]; IF handle.vars.item=slash AND handle.vars.errCount <= 0 THEN { Next[handle]; Output[handle, theRoot, 0]; }; IF handle.vars.item#semi THEN Error[handle, 800,, FALSE] ELSE IF handle.vars.errCount <= 0 THEN { NextStage[handle]; Bomb[handle, theRoot, gndNodeName]; -- may signal Aborted Next[handle]; IF handle.vars.item=plus THEN {Next[handle]; PrintHole[handle]}; }; IF handle.vars.errCount <= 0 THEN { NextStage[handle]; TopoAnalysis[handle]; IF Canned[handle] THEN GOTO stop; }; IF handle.vars.errCount <= 0 THEN { NextStage[handle]; WHILE handle.vars.item=name DO OPEN handle.vars; key: keys _ SearchKey[handle]; Next[handle]; SELECT key FROM runKey=> { lastTime _ RunIt[handle]; IF NOT Canned[handle] THEN PutMsgLine[handle, "Done."]; }; printKey=> MakePrintList[handle]; plotKey => MakePlotList[handle]; icKey => SetICs[handle]; dumpKey => IF ~ForcedDump[handle] THEN DumpAll[handle, lastTime]; checkPointKey=> { IF item=leftB THEN Next[handle] ELSE Error[handle, 801]; IF item=number THEN { Next[handle] } ELSE Error[handle, 809, FALSE]; IF item=rightB THEN Next[handle] ELSE Error[handle, 802]; } ENDCASE=> GOTO err1; IF item=eof THEN EXIT; IF item=semi THEN Next[handle] ELSE Error[handle, 800,, FALSE]; REPEAT err1=> Error[handle, 821, TRUE]; ENDLOOP; }; -- run IF ForcedDump[handle] THEN DumpAll[handle, handle.vars.lastTime]; ErrWarnSummary[handle]; GOTO stop; EXITS dumpStop=> { DumpAll[handle, handle.vars.lastTime]; handle.msgStream.PutF["Last state is dumped in the dump file."]; CleanIt[handle]; }; stop=> CleanIt[handle]; }; -- Simulate EnterModels: PUBLIC ENTRY PROC[entry: ModelTableBlk]= { ENABLE UNWIND => NULL; FOR m: LIST OF REF ModelTableBlk _ modelTable, m.rest UNTIL m=NIL DO IF Rope.Equal[m.first.name, entry.name] THEN { m.first^ _ entry; RETURN; }; ENDLOOP; modelTable _ CONS[NEW[ModelTableBlk_ entry], modelTable]; }; -- EnterModels EnterFunctions: PUBLIC ENTRY PROC[entry: FuncTableBlk]= { ENABLE UNWIND => NULL; FOR f: LIST OF REF FuncTableBlk _ functionTable, f.rest UNTIL f=NIL DO IF Rope.Equal[f.first.name, entry.name] THEN { f.first^ _ entry; RETURN; }; ENDLOOP; functionTable _ CONS[NEW[FuncTableBlk_ entry], functionTable]; }; -- EnterFunctions FindModel: PUBLIC ENTRY PROC[name: Rope.ROPE] RETURNS[REF ModelTableBlk]= { ENABLE UNWIND => NULL; FOR m: LIST OF REF ModelTableBlk _ modelTable, m.rest UNTIL m=NIL DO IF Rope.Equal[m.first.name, name] THEN RETURN[m.first]; ENDLOOP; RETURN[NIL]; }; -- FindModel FindFunction: PUBLIC ENTRY PROC[name: Rope.ROPE] RETURNS[REF FuncTableBlk]= { ENABLE UNWIND => NULL; FOR f: LIST OF REF FuncTableBlk _ functionTable, f.rest UNTIL f=NIL DO IF Rope.Equal[f.first.name, name] THEN RETURN[f.first]; ENDLOOP; RETURN[NIL]; }; -- FindFunction ResetCheckPoint: PUBLIC ENTRY PROC[handle: Handle]= { ENABLE UNWIND => NULL; handle.vars.checkPoint_ FALSE }; Canned: PUBLIC ENTRY PROC[handle: Handle] RETURNS[BOOL]= { ENABLE UNWIND => NULL; RETURN[handle.vars.canned]}; ForcedDump: PUBLIC ENTRY PROC[handle: Handle] RETURNS[BOOL]= { ENABLE UNWIND => NULL; RETURN[handle.vars.forcedDump]}; CheckPoint: PUBLIC ENTRY PROC[handle: Handle] RETURNS[BOOL]= { ENABLE UNWIND => NULL; RETURN[handle.vars.checkPoint]}; ShowDetails: PUBLIC ENTRY PROC[handle: Handle] RETURNS[BOOL]= { ENABLE UNWIND => NULL; RETURN[handle.showTimeStep]}; EchoInput: PUBLIC ENTRY PROC[handle: Handle] RETURNS[BOOL]= { ENABLE UNWIND => NULL; RETURN[handle.echoInput]}; SaveAll: PUBLIC ENTRY PROC[handle: Handle] RETURNS[BOOL]= { ENABLE UNWIND => NULL; RETURN[handle.saveAllData]}; StopIt: PUBLIC ENTRY PROC[handle: Handle]= { ENABLE UNWIND => NULL; IF handle # NIL THEN { IF handle.vars # NIL THEN { handle.vars.forcedDump_ FALSE; handle.vars.canned_ TRUE; }; }; }; -- StopIt DumpIt: PUBLIC ENTRY PROC[handle: Handle]= { ENABLE UNWIND => NULL; IF handle # NIL THEN { IF handle.vars # NIL THEN { handle.vars.forcedDump_ TRUE; handle.vars.canned_ TRUE; }; }; }; -- DumpIt ToggleShowDetails: PUBLIC ENTRY PROC[handle: Handle]= { ENABLE UNWIND => NULL; handle.showTimeStep_ ~handle.showTimeStep; }; -- ToggleShowDetails ToggleEchoInput: PUBLIC ENTRY PROC[handle: Handle]= { ENABLE UNWIND => NULL; handle.echoInput_ ~handle.echoInput; }; -- ToggleEchoInput ToggleSaveAll: PUBLIC ENTRY PROC[handle: Handle]= { ENABLE UNWIND => NULL; handle.saveAllData _ ~handle.saveAllData; }; -- ToggleSaveAll NextStage: PUBLIC ENTRY PROC[handle: Handle]= { ENABLE UNWIND => NULL; SELECT handle.stage FROM input, bomb, topo => handle.stage _ SUCC[handle.stage]; run => handle.vars.runState _ (handle.vars.runState + 1) MOD 4; ENDCASE => MessageWindow.Append[message: "*** Weird 'NextStage'", clearFirst: TRUE]; }; -- NextStage CleanIt: ENTRY PROC[handle: Handle]= { ENABLE UNWIND => NULL; CleanUp[handle]; }; -- CleanIt AddLibrary: PROC[handle: Handle]= { Next[handle]; IF handle.vars.item=leftB THEN Next[handle] ELSE Error[handle, 801, TRUE]; IF handle.vars.item=name THEN { originalName, nameRoot, errMsg: Rope.ROPE; dotPosition: INT; originalName_ Rope.FromRefText[handle.vars.newString]; dotPosition_ Rope.Find[originalName, "."]; nameRoot_ IF dotPosition=-1 THEN originalName ELSE Rope.Substr[originalName, 0, dotPosition-1]; IF NOT (Rope.Equal[nameRoot, "MosModels", FALSE] OR Rope.Equal[nameRoot, "StdFunctions", FALSE] OR Rope.Equal[nameRoot, "Level2Model", FALSE]) THEN { [errMsg, ] _ CommandTool.Run[originalName]; IF NOT errMsg.IsEmpty[] THEN PutMsgLine[handle, errMsg]; }; Next[handle]; } ELSE Error[handle, 804, TRUE]; IF handle.vars.item=rightB THEN Next[handle] ELSE Error[handle, 802, FALSE]; IF handle.vars.item=semi THEN Next[handle] ELSE Error[handle, 800, FALSE]; }; -- AddLibrary InitVars: PROC[handle: Handle]= { handle.vars_ NEW[Variables_ [ ]]; {OPEN handle.vars; simTime _ BasicTime.Now[]; line _ RefText.New[256]; newString _ RefText.New[256]; line.length _ 0; newString.length _ 0; fileStack _ NEW[fileStackSeq[maxInclude]]; FOR i: NAT IN [0..maxInclude) DO fileStack[i] _ NIL ENDLOOP; fileNameStack _ NEW[fileNameStackSeq[maxInclude]]; FOR i: NAT IN [0..maxInclude) DO fileNameStack[i] _ NIL ENDLOOP; prints _ NEW[PrintSeq[maxPrints]]; FOR i: NAT IN [0..maxPrints) DO prints[i] _ [] ENDLOOP; plots _ NEW[PlotSeq[maxPlots]]; FOR i: NAT IN [0..maxPlots) DO plots[i] _ [] ENDLOOP; worstNodeLog _ NEW[WorstNodeLog[maxLog]]; FOR i: NAT IN [0..maxLog) DO worstNodeLog[i] _ []; ENDLOOP; }; }; -- InitVars }. CHANGE LOG Wilhelm, April 27, 1982 4:07 PM Barth, 7-May-82 14:41:52 PDT Chen, April 19, 1983 6:45 PM, changed the version name for openSysWindow. Barth, July 11, 1983 12:46 PM Chen, June 12, 1984 11:37:19 am PDT, cedarized. Chen, May 15, 1985 5:23:49 pm PDT, Thyme viewer is inhibited from being destroyed by user when simulation is running. Chen, July 22, 1985 8:09:51 pm PDT, => Cedar6.0. Chen, November 24, 1985 2:57:05 pm PST, as suggested by Pradeep, changed NormalRun, BatchRun, and Simulate to allow client to choose whether to fork and whether to run in background. Christian Jacobi, June 10, 1986 6:35:28 pm PDT, Changed Simulate to always run in background; (ignoring the interface's option not run in background). ThymeMain.mesa Copyright c 1985, 1986 by Xerox Corporation. All rights reserved. Last Edited by: Last Edited by: Jacobi June 10, 1986 6:37:00 pm PDT Christian LeCocq February 4, 1987 6:12:06 pm PST Pradeep Sindhu March 19, 1986 11:26:37 pm PST Sweetsun Chen, April 26, 1986 4:59:00 pm PST Christian Jacobi, June 10, 1986 6:35:10 pm PDT handle.outer.inhibitDestroy _ TRUE; IF handle.simulation # NIL THEN TRUSTED {JOIN handle.simulation}; libraries circuit definition explode analyze run killPlot[] entry procs AbortCheckPoint[handle]; AbortCheckPoint[handle]; PeriodicSetCheckPoint: ENTRY PROC[handle: Handle]= { ENABLE UNWIND => NULL; WHILE handle # NIL DO ENABLE ABORTED => EXIT; WAIT handle.checkPointCV; IF handle # NIL THEN IF handle.vars # NIL THEN handle.vars.checkPoint _ TRUE ELSE EXIT; ENDLOOP; IF handle # NIL THEN TRUSTED {Process.SetTimeout[@handle.checkPointCV, PrincOps.NoTimeout]}; }; -- PeriodicSetCheckPoint AbortCheckPoint: INTERNAL PROC[handle: Handle]= { IF handle = NIL THEN RETURN; IF handle.stage=run AND handle.checkProcess # NIL THEN { TRUSTED {Process.Abort[LOOPHOLE[handle.checkProcess, UNSPECIFIED]]}; handle.checkProcess_ NIL; }; }; -- AbortCheckPoint if the name of the library is not in {MosModels, StdFunctions, Level2Model} then run the program in the command tool Κ[˜Icodešœ Οt™Kšœ Οmœ7™Bšœ™Kšœ0Οk™3K™0Kšœ*Ÿ™-Kšœ)Ÿ™,Kšœ+Ÿ™.—K™šŸ ˜ Kšœ Ÿœ˜Kšœ Ÿœ˜KšœŸœ ˜Kšœ Ÿœ˜*KšŸœŸœ ˜KšŸœŸœ˜KšœŸœ ˜KšœŸœB˜OKšœŸœ˜KšœŸœ%Ÿœ ˜=Kšœ ŸœΑ˜ΣKšœŸœ ˜Kšœ Ÿœ˜ —K˜šΟn œŸœŸ˜šŸ˜Kšœ ˜ Kšœ ˜ Kšœ ˜ KšŸœ˜KšŸœ˜Kšœ˜Kšœ˜Kšœ˜Kšœ˜Kšœ ˜ Kšœ ˜ —šŸ˜Kšœ ˜ ——K˜KšœŸœ˜K˜š   œŸœŸœ#ŸœŸœ˜HKšŸœ ŸœŸœŸœ˜šŸœŸœŸœŸœ˜5K˜6KšŸœ Ÿœ1˜CKšœ˜KšœŸœ™#šŸœŸœ˜KšœŸœ˜/KšŸœ%˜,K˜—šŸœ˜KšœŸœ˜Kšœ˜K˜—Kšœ!˜!Kšœ˜—KšŸœXŸœ˜bKšœΟcΠct ˜—K˜š œŸœŸœ'ŸœŸœŸœŸœ˜iKš Ÿœ ŸœŸœ ŸœŸœŸœ˜/KšŸœŸœŸœ,˜>Kšœ+˜+Kšœ1˜1Kšœ$˜$Kš ŸœŸœŸœŸœŸœ™AKšœ‘ ˜—K˜š œŸœŸœ(˜=šŸœ˜Kšœ Ÿœ˜KšŸœŸœŸœ ˜6šŸœ ˜ Kšœ0Ÿœ˜LKšŸœ˜ K˜—K˜—KšœŸœ+Ÿœ˜XKšœŸœ"Ÿœ˜MKšœ0˜0Kšœ˜Kšœ˜Kšœ ˜ Kš ™ šŸœŸ˜KšŸœŸœŸœ˜!KšŸœŸœŸœŸœ˜BKšŸœ˜ —Kš™šŸœŸœŸœ˜@Kšœ.Ÿœ Ÿœ‘˜`Kšœ˜—KšŸœŸœ˜šŸœŸœŸœ˜>Kšœ ˜ Kšœ˜Kšœ˜—Kšœ™KšŸœŸœŸœ˜8šŸœŸœŸœ˜(Kšœ˜Kšœ$‘˜9Kšœ ˜ KšŸœŸœ#˜@Kšœ˜—Kšœ™šŸœŸœ˜#Kšœ˜Kšœ˜KšŸœŸœŸœ˜!Kšœ˜—Kšœ™šŸœŸœ˜#Kšœ˜šŸœŸ˜KšŸœ ˜Kšœ˜Kšœ ˜ šŸœŸ˜šœ ˜ Kšœ˜KšŸœŸœŸœ˜7Kšœ˜—Kšœ!˜!Kšœ ˜ Kšœ˜Kšœ ŸœŸœ˜Ašœ˜KšŸœ ŸœŸœ˜8šŸœ Ÿœ˜Kšœ ˜ Kšœ˜—KšŸœŸœ˜KšŸœ ŸœŸœ˜9Kšœ˜—KšŸœŸœ˜—KšŸœ ŸœŸœ˜KšŸœ ŸœŸœŸœ˜?šŸ˜KšœŸœ˜ —KšŸœ˜—Kšœ’˜ —KšŸœŸœ'˜AKšœ˜Kšœ ™ KšŸœ˜ šŸ˜šœ ˜ Kšœ&˜&Kšœ@˜@Kšœ˜Kšœ˜—Kšœ˜—Kšœ’ ˜K™—š  œŸœŸœŸœ˜7KšŸœŸœŸœ˜š ŸœŸœŸœŸœ$ŸœŸœŸ˜DšŸœ&Ÿœ˜.Kšœ˜KšŸœ˜Kšœ˜—KšŸœ˜—Kšœ ŸœŸœ$˜9Kšœ’˜—K˜š œŸœŸœŸœ˜9KšŸœŸœŸœ˜š ŸœŸœŸœŸœ&ŸœŸœŸ˜FšŸœ&Ÿœ˜.Kšœ˜KšŸœ˜Kšœ˜—KšŸœ˜—KšœŸœŸœ&˜>Kšœ’˜—K˜Kš ™ K˜š  œŸœŸœŸœ ŸœŸœŸœ˜KKšŸœŸœŸœ˜š ŸœŸœŸœŸœ$ŸœŸœŸ˜DKšŸœ ŸœŸœ ˜7KšŸœ˜—KšŸœŸœ˜ Kšœ’ ˜—K˜š   œŸœŸœŸœ Ÿœ˜0KšŸœŸœ˜KšŸœŸœŸœ˜š ŸœŸœŸœŸœ&ŸœŸœŸ˜FKšŸœ ŸœŸœ ˜7KšŸœ˜—KšŸœŸœ˜ Kšœ’˜—K˜š œŸœŸœŸœ˜5KšŸœŸœŸœ˜KšœŸœ˜ —K˜š  œŸœŸœŸœŸœŸœ˜:KšŸœŸœŸœ˜KšŸœ˜—K˜š   œŸœŸœŸœŸœŸœ˜>KšŸœŸœŸœ˜KšŸœ˜ —K˜š   œŸœŸœŸœŸœŸœ˜>KšŸœŸœŸœ˜KšŸœ˜ —K˜š   œŸœŸœŸœŸœŸœ˜?KšŸœŸœŸœ˜KšŸœ˜—K˜š   œŸœŸœŸœŸœŸœ˜=KšŸœŸœŸœ˜KšŸœ˜—K˜š  œŸœŸœŸœŸœŸœ˜;KšŸœŸœŸœ˜KšŸœ˜—K˜š œŸœŸœŸœ˜,KšŸœŸœŸœ˜šŸœ ŸœŸœ˜šŸœŸœŸœ˜KšœŸœ˜KšœŸœ˜K˜—Kšœ™K˜—Kšœ’ ˜ —K˜š œŸœŸœŸœ˜,KšŸœŸœŸœ˜šŸœ ŸœŸœ˜šŸœŸœŸœ˜KšœŸœ˜KšœŸœ˜K˜—Kšœ™K˜—Kšœ’ ˜ —K˜š œŸœŸœŸœ˜7KšŸœŸœŸœ˜Kšœ*˜*Kšœ’˜—K˜š œŸœŸœŸœ˜5KšŸœŸœŸœ˜Kšœ$˜$Kšœ’˜—K˜š  œŸœŸœŸœ˜3KšŸœŸœŸœ˜Kšœ)˜)Kšœ’‘ ˜—K˜š  œŸœŸœŸœ˜/KšŸœŸœŸœ˜šŸœŸ˜Kšœ$Ÿœ˜7Kšœ9Ÿœ˜?KšŸœGŸœ˜T—Kšœ’ ˜—K˜š œŸœŸœ™4KšŸœŸœŸœ™šŸœ ŸœŸ™KšŸœŸœŸœ™KšŸœ™KšŸœ ŸœŸœŸœŸœŸ œŸœ™WKšŸœ™—KšŸœ ŸœŸ œ@™\Kšœ’™—K˜š œŸœŸœ˜&KšŸœŸœŸœ˜K˜Kšœ’ ˜ —K˜š œŸœŸœ™1KšŸœ ŸœŸœŸœ™šŸœŸœŸœŸœ™8KšŸœŸœŸ œ™DKšœŸœ™Kšœ™—Kšœ’™—K˜š  œŸœ˜#Kšœt™tKšœ ˜ KšŸœŸœŸœŸœ˜JšŸœŸœ˜Kšœ%Ÿœ˜*Kšœ Ÿœ˜Kšœ6˜6Kšœ*˜*šœ ŸœŸœ ˜-KšŸœ-˜1—šŸœŸœ'ŸœŸ˜6Kšœ%ŸœŸ˜.šœ%ŸœŸœ˜3Kšœ+˜+KšŸœŸœŸœ˜8Kšœ˜——Kšœ ˜ Kšœ˜—KšŸœŸœ˜KšŸœŸœŸœŸœ˜LKšŸœŸœŸœŸœ˜JKšœ’ ˜—K˜š œŸœ˜!Kšœ Ÿœ˜!šœŸœ ˜Kšœ˜Kšœ˜Kšœ˜Kšœ˜Kšœ˜Kšœ Ÿœ˜*Kš ŸœŸœŸœŸœŸœŸœ˜