-- SakuraRT.mesa -- Last edited by Suzuki: 19-Apr-82 10:04:02 DIRECTORY Rope; SakuraRT: DEFINITIONS = { Choice: TYPE = REF ChoiceNode; -- This object is created for each CHOICE statement ChoiceNode: TYPE; Handle: TYPE = REF Node; -- One Handle is created for each connection Node: TYPE; -- Choice interface -- Choice statements are of the form -- CHOICE { -- WHEN a1 CHANGE => s1 || -- WHEN a2 CHANGE => s2} -- The implementation is to create an object for each Choice stetatement. Each arm of the --Choice statement is implemented as a process, which is waiting for the Choice object to --wake up. When a1 or a2 change, it is signaled to the Choice object, and it wakes up the --the appropriate process, according to which signal it received. CreateChoice: PROC RETURNS [Choice]; RegisterUp: PROC [choice: Choice, retValue: CARDINAL, port: Handle]; -- Tell the "port" that the "choice" is waiting, and "port" should send "retValue", to --tell "chice" in order for "choice" to know who woke up the "choice". RegisterDown: PROC [Choice, CARDINAL, Handle]; RegisterChange: PROC [Choice, CARDINAL, Handle]; GetChoice: PROC [Choice] RETURNS [CARDINAL]; -- Wait until being waken up by one of the ports -- Ports interface Create: PROC [size: CARDINAL ← 10] RETURNS [Handle]; Put: PROC [Handle, REF ANY]; GetNew: PROC [n: Handle, v: BOOLEAN]; -- Wait until the value assigned to "n" becomes "v". GetNewChange: PROC [Handle]; -- Wait until some value assigned to "n". Get: PROC [Handle] RETURNS [REF ANY]; -- Obtain the value of the port. GetCard: PROC [tree: Handle] RETURNS [CARDINAL]; -- NARROW[SakuraRT.Get[tree], REF CARDINAL]↑ GetBool: PROC [tree: Handle] RETURNS [BOOLEAN]; -- NARROW[SakuraRT.Get[tree], REF [BOOLEAN]↑ -- MOSSIM interface SIMGet: PROC [Handle]; -- Obtain the value from MOSSIM SIMSet: PROC [Handle]; -- Assign the value to MOSSIM SIMConnect: PROC [node: Handle, name: STRING]; -- Make the connection between "node" of Sakura, and "name" of --layout SIMMultiConnectInit: PROC [node: Handle, size: CARDINAL]; -- "node" passes values that need to be represented by "size" --number of lines SIMMultiConnectAssign: PROC [node: Handle, name: STRING, loc: CARDINAL]; -- The line of the layout named "name" constitue "loc"-th position --construct the value of the "node". SIMRead: PROC [file: STRING]; -- Read transistors from "file". SIMStep: PROC; -- Execute MOSSIM until stabilizes -- Scheduler interface -- The processes are either currently running (there is exactly one --such process), waiting for a condition, or doing nothing until --woken up at a later time. We call a process to be active if it --is running or waiting for a condition. Fork: PROC[PROC] RETURNS[PROCESS]; Join: PROC[PROCESS]; CatalogProcId: PROC [process: PROCESS]; AbortAll: PROC; NotifyAll: PROC[p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15: Handle ← NIL]; Abort: PROC; ProcessEnd: PROC; GetProcessSize: PROC RETURNS[CARDINAL]; Delay: PROC[CARDINAL]; RandomDelay: PROC [min, max: CARDINAL]; -- Delays random number of ticks between min and max StandardDelay: PROC; Wait: PROC [LONG POINTER TO CONDITION]; IncCurrent: PROC; -- Increment the number of currently active processes DecCurrent: PROC; }.