-- MOSSIMFIFOImpl.sak -- last edited by Suzuki: 20-Nov-81 16:02:15 DIRECTORY Connector: TYPE, FIFO: TYPE, MOSSIMFunc: TYPE, Process: TYPE, Scheduler: TYPE; MOSSIMFIFOImpl: MONITOR IMPORTS Connector, MOSSIMFunc, Process, Scheduler EXPORTS FIFO = BEGIN choice1: Connector.Choice ← Connector.CreateChoice[]; MAIN: PROC = { MOSSIMFunc.Read["fifo.sim"]; }; FIFOFunc: PUBLIC PROC [size: CARDINAL, Init, WriteRequest, ReadRequest: Connector.Handle, DIn: Connector.Handle, SpaceAv, DataAv: Connector.Handle, DOut: Connector.Handle] = { guardian: PROC = {Initialized: BOOLEAN ← FALSE; Connector.RegisterUp[choice1, 1, Init]; Connector.RegisterUp[choice1, 2, ReadRequest]; Connector.RegisterUp[choice1, 3, WriteRequest]; DO SELECT Connector.GetChoice[choice1] FROM 1 => {IF NARROW[Connector.Get[ReadRequest], REF BOOLEAN]↑ OR NARROW[Connector.Get[WriteRequest], REF BOOLEAN]↑ THEN ERROR; Initialized ← TRUE}; 2 => IF NOT Initialized OR NARROW[Connector.Get[Init], REF BOOLEAN]↑ OR NOT NARROW[Connector.Get[DataAv], REF BOOLEAN]↑ THEN ERROR; 3 => IF NOT Initialized OR NARROW[Connector.Get[Init], REF BOOLEAN]↑ OR NOT NARROW[Connector.Get[SpaceAv], REF BOOLEAN]↑ THEN ERROR ENDCASE => ERROR ENDLOOP; Scheduler.ProcessEnd[]}; p: PROCESS; device: CONDITION; Wait: ENTRY PROC = {WAIT device}; locInit, locWriteRequest, locReadRequest, locDIn, locSpaceAv, locDataAv, locDOut: CARDINAL; Scheduler.IncCurrent[]; p ← Scheduler.Fork[guardian]; Connector.MOSSIMConnect[Init, "INITIALIZE"]; Connector.MOSSIMConnect[WriteRequest, "WR"]; Connector.MOSSIMConnect[ReadRequest, "RR"]; Connector.MOSSIMMultiConnectInit[DIn, 16]; Connector.MOSSIMMultiConnectAssign[DIn, "DI0", 0]; Connector.MOSSIMMultiConnectAssign[DIn, "DI1", 1]; Connector.MOSSIMMultiConnectAssign[DIn, "DI2", 2]; Connector.MOSSIMMultiConnectAssign[DIn, "DI3", 3]; Connector.MOSSIMMultiConnectAssign[DIn, "DI4", 4]; Connector.MOSSIMMultiConnectAssign[DIn, "DI5", 5]; Connector.MOSSIMMultiConnectAssign[DIn, "DI6", 6]; Connector.MOSSIMMultiConnectAssign[DIn, "DI7", 7]; Connector.MOSSIMMultiConnectAssign[DIn, "DI8", 8]; Connector.MOSSIMMultiConnectAssign[DIn, "DI9", 9]; Connector.MOSSIMMultiConnectAssign[DIn, "DI10", 10]; Connector.MOSSIMMultiConnectAssign[DIn, "DI11", 11]; Connector.MOSSIMMultiConnectAssign[DIn, "DI12", 12]; Connector.MOSSIMMultiConnectAssign[DIn, "DI13", 13]; Connector.MOSSIMMultiConnectAssign[DIn, "DI14", 14]; Connector.MOSSIMMultiConnectAssign[DIn, "DI15", 15]; Connector.MOSSIMConnect[SpaceAv, "SA"]; Connector.MOSSIMConnect[DataAv, "DA"]; Connector.MOSSIMMultiConnectInit[DOut, 16]; Connector.MOSSIMMultiConnectAssign[DOut, "DO0", 0]; Connector.MOSSIMMultiConnectAssign[DOut, "DO1", 1]; Connector.MOSSIMMultiConnectAssign[DOut, "DO2", 2]; Connector.MOSSIMMultiConnectAssign[DOut, "DO3", 3]; Connector.MOSSIMMultiConnectAssign[DOut, "DO4", 4]; Connector.MOSSIMMultiConnectAssign[DOut, "DO5", 5]; Connector.MOSSIMMultiConnectAssign[DOut, "DO6", 6]; Connector.MOSSIMMultiConnectAssign[DOut, "DO7", 7]; Connector.MOSSIMMultiConnectAssign[DOut, "DO8", 8]; Connector.MOSSIMMultiConnectAssign[DOut, "DO9", 9]; Connector.MOSSIMMultiConnectAssign[DOut, "DO10", 10]; Connector.MOSSIMMultiConnectAssign[DOut, "DO11", 11]; Connector.MOSSIMMultiConnectAssign[DOut, "DO12", 12]; Connector.MOSSIMMultiConnectAssign[DOut, "DO13", 13]; Connector.MOSSIMMultiConnectAssign[DOut, "DO14", 14]; Connector.MOSSIMMultiConnectAssign[DOut, "DO15", 15]; locInit ← Connector.Assign[@device, Init]; locWriteRequest ← Connector.Assign[@device, WriteRequest]; locReadRequest ← Connector.Assign[@device, ReadRequest]; locDIn ← Connector.Assign[@device, DIn]; locSpaceAv ← Connector.Assign[@device, SpaceAv]; locDataAv ← Connector.Assign[@device, DataAv]; locDOut ← Connector.Assign[@device, DOut]; DO Wait[]; Connector.MOSSIMSet[Init]; Connector.MOSSIMSet[WriteRequest]; Connector.MOSSIMSet[ReadRequest]; Connector.MOSSIMSet[DIn]; MOSSIMFunc.Step[]; Connector.MOSSIMGet[SpaceAv]; Connector.MOSSIMGet[DataAv]; Connector.MOSSIMGet[DOut]; ENDLOOP; Connector.Remove[locInit, Init]; Connector.Remove[locWriteRequest, WriteRequest]; Connector.Remove[locReadRequest, ReadRequest]; Connector.Remove[locDIn, DIn]; Connector.Remove[locSpaceAv, SpaceAv]; Connector.Remove[locDataAv, DataAv]; Connector.Remove[locDOut, DOut]; Process.Abort[p]; [] ← Scheduler.Join[p]; Scheduler.ProcessEnd[]}; MAIN[]; NULL END.