-- MOSSIMCharFIFODriver.sak
-- last edited by Suzuki: 14-Dec-81 10:26:38 

DIRECTORY
	MOSSIMFIFO,
	Connector,
	Scheduler,
	SimIO;

MOSSIMCharFIFODriver: MONITOR  
	IMPORTS 
		Connector, MOSSIMFIFO, Scheduler, SimIO = {

Reader: DEVICE = {
	IN DataAv: BOOLEAN, DataOut: ARRAY [0..16) OF CHARACTER, Done: BOOLEAN
	OUT ReadReq: BOOLEAN
	GUARDIAN {}
	CONTROL {
	  SimIO.WF0["  Reader started.*n"];
	  THROUGH [0..30) DO
		Scheduler.Delay[20];
		WHEN Done UP: ReadReq ← TRUE;
		FOR i: NAT IN [0..16) DO
		  SimIO.WF1["%u", DataOut[i]];
		  ENDLOOP;
		SimIO.WF0["  "];
		Scheduler.Delay[10];
		ReadReq ← FALSE;
	  ENDLOOP;
	  SimIO.WF0["  Reader terminated.*n"]}
	};

Writer: DEVICE = {
	IN SpaceAv, Done: BOOLEAN
	OUT WriteReq: BOOLEAN, DataIn: CARDINAL
	GUARDIAN {}
	CONTROL {
	  i: CARDINAL;
	  SimIO.WF0[" Writer started.*n"];
	  FOR i IN [0..30) DO
		Scheduler.Delay[20];
		WHEN Done UP: {DataIn ← i; WriteReq ← TRUE};
		SimIO.WF1["%u-  ", i];
		Scheduler.Delay[10];
		WriteReq ← FALSE;
	  ENDLOOP;
	  SimIO.WF0[" Writer terminated.*n"]}
	};

Start: DEVICE = {
	IN
	OUT Init, ReadReq, WriteReq: BOOLEAN
	GUARDIAN {}
	CONTROL {
	  ReadReq ← FALSE;
	  WriteReq ← FALSE;
	  Scheduler.Delay[10];
	  Init ← TRUE;
	  Scheduler.Delay[5];
	  Init ← FALSE}
	};

SimIO.Start["FIFO.jam"];
 CIRCUIT {
  COMPONENTS fifo: MOSSIMFIFO.FIFOFunc[size: 100], reader: Reader, writer: Writer, start: Start
  NODES init, write, read, in, space, data, out, done: NODE
  REPRESENTATION
  CONNECTIONS
    fifo[Init: init, WriteRequest: write, ReadRequest: read,
		DIn: in, SpaceAv: space, DataAv: data, DOut: out, Done: done],
    reader[DataAv: data, DataOut: out, ReadReq: read, Done: done],
    writer[SpaceAv: space, Done: done, WriteReq: write, DataIn: in],
    start[Init: init, ReadReq: read, WriteReq: write]};
SimIO.Stop[];
}.