-- FIFOImpl.sak
-- last edited by Suzuki: 20-Nov-81 16:02:15
DIRECTORY
Connector,
FIFO,
Process;
FIFOImpl: MONITOR IMPORTS Connector, Process
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 }
STATE A: ARRAY [1..37] OF CARDINAL, rp, wp: CARDINAL
CONTROL
DO
WHEN Init UP : rp ← wp ← 0;
A[rp] ← DIn; DOut ← A[wp];
SpaceAv ← FALSE; DataAv ← FALSE;
PAR {
DO
WHEN ReadRequest UP : {
DataAv ← FALSE; rp ← rp+1; A[rp]←DIn;
DOut←A[wp]; SpaceAv←~WriteRequest AND wp<rp+size};
WHEN ReadRequest DOWN: DataAv ← rp<wp
ENDLOOP
//
DO
WHEN WriteRequest UP : {
SpaceAv←FALSE; wp←wp+1;
DOut←A[wp]; DataAv←~ReadRequest AND rp<wp};
WHEN WriteRequest DOWN: SpaceAv←wp<rp+size;
ENDLOOP
}
ENDLOOP
};
NULL
}. -- end of FIFO DEFINITION