-- File: [Indigo]<Sakura>Dragon>DragonArbiterImpl1.sak
-- 15-Mar-82  9:19:33

DIRECTORY
  DragonArbiter1,
  SakuraRT;
  
DragonArbiterImpl1: MONITOR
  IMPORTS SakuraRT
  EXPORTS DragonArbiter1 = {

Arbiter: PUBLIC DEVICE = {
  IN ClockA, ClockB, Proc1Rq, Proc2Rq: BOOLEAN
  OUT Proc1Gr, Proc2Gr: BOOLEAN
  GUARDIAN {}
  CONTROL {
    granted: BOOLEAN ← FALSE;
    last: CARDINAL ← 0;
    Grant: ENTRY PROC = {
      IF last=1 THEN {
	IF Proc1Rq AND granted THEN RETURN
	ELSE IF Proc2Rq THEN 
	  {Proc1Gr ← FALSE; last ← 2; Proc2Gr ← TRUE; granted ← TRUE}
	ELSE IF Proc1Rq THEN {Proc1Gr ←  TRUE; granted ← TRUE}
	ELSE {Proc1Gr ← FALSE; granted ← FALSE} }
      ELSE IF last=2 THEN {
        IF Proc2Rq AND granted THEN RETURN
	ELSE IF Proc1Rq THEN 
	  {Proc2Gr ← FALSE; last ← 1; Proc1Gr ← TRUE; granted ← TRUE}
	ELSE IF Proc2Rq THEN {Proc2Gr ← TRUE; granted ← TRUE}
	ELSE {Proc2Gr ← FALSE; granted ← FALSE} }
      ELSE 
        IF Proc1Rq THEN {last ← 1; Proc1Gr ← TRUE; granted ← TRUE}
	ELSE IF Proc2Rq THEN {last ← 2; Proc2Gr ← TRUE; granted ← TRUE}
      }; -- Grant
    DO
      WHEN ClockB UP: Grant[];
    ENDLOOP
    }
  };
  
}.