-- NewFIFOImpl.sak -- last edited by Suzuki: 20-Apr-82 12:55:47 DIRECTORY FIFO, SakuraRT; NewFIFOImpl: MONITOR IMPORTS SakuraRT EXPORTS FIFO ={ FIFOFunc: PUBLIC DEVICE [size: CARDINAL] = { IN Init, WriteRequest, ReadRequest: BOOLEAN, DIn: CARDINAL OUT SpaceAv, DataAv: BOOLEAN, DOut: CARDINAL GUARDIAN { Initialized: BOOLEAN _ FALSE; DO CHOICE { WHEN Init UP -> {IF ReadRequest OR WriteRequest THEN ERROR; Initialized _ TRUE} || WHEN ReadRequest UP -> IF ~Initialized OR Init OR ~DataAv THEN ERROR || WHEN WriteRequest UP -> IF ~Initialized OR Init OR ~SpaceAv THEN ERROR} ENDLOOP } CONTROL { A: ARRAY [0..37] OF CARDINAL; rp, wp: CARDINAL; DO WHEN Init UP : {rp _ 1; wp _ 0; SpaceAv _ TRUE; DataAv _ FALSE}; PAR { DO WHEN ReadRequest UP : { SakuraRT.Delay[1]; DataAv_FALSE; rp_rp+1; DOut_A[rp]; SpaceAv _ ~WriteRequest AND wp