add formal verif
[lttv.git] / trunk / verif / Spin / Test / examples
diff --git a/trunk/verif/Spin/Test/examples b/trunk/verif/Spin/Test/examples
new file mode 100755 (executable)
index 0000000..0edd887
--- /dev/null
@@ -0,0 +1,1171 @@
+# To unbundle, sh this file
+echo ex.readme 1>&2
+sed 's/.//' >ex.readme <<'//GO.SYSIN DD ex.readme'
+-The 12 files in this bundle are the PROMELA
+-files of all exercises and examples discussed
+-in the document Doc/Exercises.ps from the
+-SPIN distribution.
+//GO.SYSIN DD ex.readme
+echo ex.1a 1>&2
+sed 's/.//' >ex.1a <<'//GO.SYSIN DD ex.1a'
+-init {
+-      byte i = 0;
+-      do
+-      :: i = i+1
+-      od
+-}
+//GO.SYSIN DD ex.1a
+echo ex.1b 1>&2
+sed 's/.//' >ex.1b <<'//GO.SYSIN DD ex.1b'
+-init {
+-      chan dummy = [20] of { byte };
+-      do
+-      :: dummy!85
+-      :: dummy!170
+-      od
+-}
+//GO.SYSIN DD ex.1b
+echo ex.1c 1>&2
+sed 's/.//' >ex.1c <<'//GO.SYSIN DD ex.1c'
+-#define N     26
+-
+-int a;
+-byte b;
+-
+-init {
+-      do
+-      :: atomic { (b < N) ->
+-              if
+-              :: a = a + (1<<b)
+-              :: skip
+-              fi;
+-              b=b+1 }
+-      od
+-}
+//GO.SYSIN DD ex.1c
+echo ex.2 1>&2
+sed 's/.//' >ex.2 <<'//GO.SYSIN DD ex.2'
+-#define MAX 8
+-proctype A(chan in, out)
+-{     byte mt; /* message data */
+-      bit  vr;
+-S1:   mt = (mt+1)%MAX;
+-      out!mt,1;
+-      goto S2;
+-S2:   in?vr;
+-      if
+-      :: (vr == 1) -> goto S1
+-      :: (vr == 0) -> goto S3
+-      :: printf("AERROR1\n") -> goto S5
+-      fi;
+-S3:   out!mt,1;
+-      goto S4;
+-S4:   in?vr;
+-      if
+-      :: goto S1
+-      :: printf("AERROR2\n"); goto S5
+-      fi;
+-S5:   out!mt,0;
+-      goto S4
+-}
+-proctype B(chan in, out)
+-{     byte mr, lmr;
+-      bit ar;
+-      goto S2; /* initial state */
+-S1:   assert(mr == (lmr+1)%MAX);
+-      lmr = mr;
+-      out!1;
+-      goto S2;
+-S2:   in?mr,ar;
+-      if
+-      :: (ar == 1) -> goto S1
+-      :: (ar == 0) -> goto S3
+-      :: printf("ERROR1\n"); goto S5
+-      fi;
+-S3:   out!1;
+-      goto S2;
+-S4:   in?mr,ar;
+-      if
+-      :: goto S1
+-      :: printf("ERROR2\n"); goto S5
+-      fi;
+-S5:   out!0;
+-      goto S4
+-}
+-init {
+-      chan a2b = [2] of { bit };
+-      chan b2a = [2] of { byte, bit };
+-      atomic {
+-              run A(a2b, b2a);
+-              run B(b2a, a2b)
+-      }
+-}
+//GO.SYSIN DD ex.2
+echo ex.3 1>&2
+sed 's/.//' >ex.3 <<'//GO.SYSIN DD ex.3'
+-mtype = { a, b, c, d, e, i, l, m, n, q, r, u, v };
+-
+-chan dce = [0] of { mtype };
+-chan dte = [0] of { mtype };
+-
+-active proctype dte_proc()
+-{
+-state01:
+-      do
+-      :: dce!b -> /* state21 */ dce!a
+-      :: dce!i -> /* state14 */
+-                      if
+-                      :: dte?m -> goto state19
+-                      :: dce!a
+-                      fi
+-      :: dte?m -> goto state18
+-      :: dte?u -> goto state08
+-      :: dce!d -> break
+-      od;
+-
+-      /* state02: */
+-      if
+-      :: dte?v
+-      :: dte?u -> goto state15
+-      :: dte?m -> goto state19
+-      fi;
+-state03:
+-      dce!e;
+-      /* state04: */
+-      if
+-      :: dte?m -> goto state19
+-      :: dce!c
+-      fi;
+-      /* state05: */
+-      if
+-      :: dte?m -> goto state19
+-      :: dte?r
+-      fi;
+-      /* state6A: */
+-      if
+-      :: dte?m -> goto state19
+-      :: dte?q
+-      fi;
+-state07:
+-      if
+-      :: dte?m -> goto state19
+-      :: dte?r
+-      fi;
+-      /* state6B: */
+-      if              /* non-deterministic select */
+-      :: dte?q -> goto state07
+-      :: dte?q
+-      :: dte?m -> goto state19
+-      fi;
+-      /* state10: */
+-      if
+-      :: dte?m -> goto state19
+-      :: dte?r
+-      fi;
+-state6C:
+-      if
+-      :: dte?m -> goto state19
+-      :: dte?l
+-      fi;
+-      /* state11: */
+-      if
+-      :: dte?m -> goto state19
+-      :: dte?n
+-      fi;
+-      /* state12: */
+-      if
+-      :: dte?m -> goto state19
+-      :: dce!b -> goto state16
+-      fi;
+-
+-state15:
+-      if
+-      :: dte?v -> goto state03
+-      :: dte?m -> goto state19
+-      fi;
+-state08:
+-      if
+-      :: dce!c
+-      :: dce!d -> goto state15
+-      :: dte?m -> goto state19
+-      fi;
+-      /* state09: */
+-      if
+-      :: dte?m -> goto state19
+-      :: dte?q
+-      fi;
+-      /* state10B: */
+-      if
+-      :: dte?r -> goto state6C
+-      :: dte?m -> goto state19
+-      fi;
+-state18:
+-      if
+-      :: dte?l -> goto state01
+-      :: dte?m -> goto state19
+-      fi;
+-state16:
+-      dte?m;
+-      /* state17: */
+-      dte?l;
+-      /* state21: */
+-      dce!a; goto state01;
+-state19:
+-      dce!b;
+-      /* state20: */
+-      dte?l;
+-      /* state21: */
+-      dce!a; goto state01
+-}
+-
+-active proctype dce_proc()
+-{
+-state01:
+-      do
+-      :: dce?b -> /* state21 */ dce?a
+-      :: dce?i -> /* state14 */
+-                      if
+-                      :: dce?b -> goto state16
+-                      :: dce?a
+-                      fi
+-      :: dte!m -> goto state18
+-      :: dte!u -> goto state08
+-      :: dce?d -> break
+-      od;
+-
+-      /* state02: */
+-      if
+-      :: dte!v
+-      :: dte!u -> goto state15
+-      :: dce?b -> goto state16
+-      fi;
+-state03:
+-      dce?e;
+-      /* state04: */
+-      if
+-      :: dce?b -> goto state16
+-      :: dce?c
+-      fi;
+-      /* state05: */
+-      if
+-      :: dce?b -> goto state16
+-      :: dte!r
+-      fi;
+-      /* state6A: */
+-      if
+-      :: dce?b -> goto state16
+-      :: dte!q
+-      fi;
+-state07:
+-      if
+-      :: dce?b -> goto state16
+-      :: dte!r
+-      fi;
+-      /* state6B: */
+-      if              /* non-deterministic select */
+-      :: dte!q -> goto state07
+-      :: dte!q
+-      :: dce?b -> goto state16
+-      fi;
+-      /* state10: */
+-      if
+-      :: dce?b -> goto state16
+-      :: dte!r
+-      fi;
+-state6C:
+-      if
+-      :: dce?b -> goto state16
+-      :: dte!l
+-      fi;
+-      /* state11: */
+-      if
+-      :: dce?b -> goto state16
+-      :: dte!n
+-      fi;
+-      /* state12: */
+-      if
+-      :: dce?b -> goto state16
+-      :: dte!m -> goto state19
+-      fi;
+-
+-state15:
+-      if
+-      :: dte!v -> goto state03
+-      :: dce?b -> goto state16
+-      fi;
+-state08:
+-      if
+-      :: dce?c
+-      :: dce?d -> goto state15
+-      :: dce?b -> goto state16
+-      fi;
+-      /* state09: */
+-      if
+-      :: dce?b -> goto state16
+-      :: dte!q
+-      fi;
+-      /* state10B: */
+-      if
+-      :: dte!r -> goto state6C
+-      :: dce?b -> goto state16
+-      fi;
+-state18:
+-      if
+-      :: dte!l -> goto state01
+-      :: dce?b -> goto state16
+-      fi;
+-state16:
+-      dte!m;
+-      /* state17: */
+-      dte!l;
+-      /* state21: */
+-      dce?a; goto state01;
+-state19:
+-      dce?b;
+-      /* state20: */
+-      dte!l;
+-      /* state21: */
+-      dce?a; goto state01
+-}
+//GO.SYSIN DD ex.3
+echo ex.4b 1>&2
+sed 's/.//' >ex.4b <<'//GO.SYSIN DD ex.4b'
+-#define true  1
+-#define false 0
+-
+-bool flag[2];
+-bool turn;
+-
+-active [2] proctype user()
+-{     flag[_pid] = true;
+-      turn = _pid;
+-      (flag[1-_pid] == false || turn == 1-_pid);
+-crit: skip;   /* critical section */
+-      flag[_pid] = false
+-}
+//GO.SYSIN DD ex.4b
+echo ex.4c 1>&2
+sed 's/.//' >ex.4c <<'//GO.SYSIN DD ex.4c'
+-byte in;
+-byte x, y, z;
+-active [2] proctype user()    /* file ex.4c */
+-{     byte me = _pid+1;                       /* me is 1 or 2 */
+-L1:   x = me;
+-L2:   if
+-      :: (y != 0 && y != me) -> goto L1       /* try again */
+-      :: (y == 0 || y == me)
+-      fi;
+-L3:   z = me;
+-L4:   if
+-      :: (x != me)  -> goto L1                /* try again */
+-      :: (x == me)
+-      fi;
+-L5:   y = me;
+-L6:   if
+-      :: (z != me) -> goto L1                 /* try again */
+-      :: (z == me)
+-      fi;
+-L7:                                           /* success */
+-      in = in+1;
+-      assert(in == 1);
+-      in = in - 1;
+-      goto L1
+-}
+//GO.SYSIN DD ex.4c
+echo ex.5a 1>&2
+sed 's/.//' >ex.5a <<'//GO.SYSIN DD ex.5a'
+-#define Place byte    /* assume < 256 tokens per place */
+-
+-Place p1, p2, p3;
+-Place p4, p5, p6;
+-#define inp1(x)               (x>0) -> x=x-1
+-#define inp2(x,y)     (x>0&&y>0) -> x = x-1; y=y-1
+-#define out1(x)               x=x+1
+-#define out2(x,y)     x=x+1; y=y+1
+-init
+-{     p1 = 1; p4 = 1; /* initial marking */
+-      do
+-/*t1*/        :: atomic { inp1(p1)    -> out1(p2) }
+-/*t2*/        :: atomic { inp2(p2,p4) -> out1(p3) }
+-/*t3*/        :: atomic { inp1(p3)    -> out2(p1,p4) }
+-/*t4*/        :: atomic { inp1(p4)    -> out1(p5) }
+-/*t5*/        :: atomic { inp2(p1,p5) -> out1(p6) }
+-/*t6*/        :: atomic { inp1(p6)    -> out2(p4,p1) }
+-      od
+-}
+//GO.SYSIN DD ex.5a
+echo ex.5b 1>&2
+sed 's/.//' >ex.5b <<'//GO.SYSIN DD ex.5b'
+-#define Place byte    /* assume < 256 tokens per place */
+-
+-Place P1, P2, P4, P5, RC, CC, RD, CD;
+-Place p1, p2, p4, p5, rc, cc, rd, cd;
+-
+-#define inp1(x)               (x>0) -> x=x-1
+-#define inp2(x,y)     (x>0&&y>0) -> x = x-1; y=y-1
+-#define out1(x)               x=x+1
+-#define out2(x,y)     x=x+1; y=y+1
+-
+-init                  /* file ex.5b */
+-{     P1 = 1; p1 = 1; /* initial marking */
+-      do
+-      :: atomic { inp1(P1)    -> out2(rc,P2)  }       /* DC */
+-      :: atomic { inp2(P2,CC) -> out1(P4)     }       /* CA */
+-      :: atomic { inp1(P4)    -> out2(P5,rd)  }       /* DD */
+-      :: atomic { inp2(P5,CD) -> out1(P1)     }       /* FD */
+-      :: atomic { inp2(P1,RC) -> out2(P4,cc)  }       /* AC */
+-      :: atomic { inp2(P4,RD) -> out2(P1,cd)  }       /* AD */
+-      :: atomic { inp2(P5,RD) -> out1(P1)     }       /* DA */
+-
+-      :: atomic { inp1(p1)    -> out2(RC,p2)  }       /* dc */
+-      :: atomic { inp2(p2,cc) -> out1(p4)     }       /* ca */
+-      :: atomic { inp1(p4)    -> out2(p5,RD)  }       /* dd */
+-      :: atomic { inp2(p5,cd) -> out1(p1)     }       /* fd */
+-      :: atomic { inp2(p1,rc) -> out2(p4,CC)  }       /* ac */
+-      :: atomic { inp2(p4,rd) -> out2(p1,CD)  }       /* ad */
+-      :: atomic { inp2(p5,rd) -> out1(p1)     }       /* da */
+-      od
+-}
+//GO.SYSIN DD ex.5b
+echo ex.6 1>&2
+sed 's/.//' >ex.6 <<'//GO.SYSIN DD ex.6'
+-#if 0
+-      Cambridge Ring Protocol [Needham'82]
+-      basic protocol - no LTL properties
+-#endif
+-
+-#define LOSS  1
+-#define RELAXED       1
+-
+-#if RELAXED==1
+-#define stimeout      empty(sender)
+-#define rtimeout      empty(recv)
+-#else
+-#define stimeout      timeout
+-#define rtimeout      timeout
+-#endif
+-
+-#define QSZ   6       /* length of message queues */
+-
+-      mtype = {
+-              RDY, NOTRDY, DATA, NODATA, RESET
+-      };
+-      chan sender     = [QSZ] of { mtype, byte };
+-      chan recv       = [QSZ] of { mtype, byte };
+-
+-active proctype Sender()
+-{     short n = -1; byte t,m;
+-
+-      xr sender;
+-      xs recv;
+-
+-I:            /* Idle State */
+-              do
+-#if LOSS==1
+-              :: sender?_,_ -> progress2: skip
+-#endif
+-              :: sender?RESET,0 ->
+-ackreset:             recv!RESET,0;   /* stay in idle */
+-                      n = -1;
+-                      goto I
+-
+-              /* E-rep: protocol error */
+-
+-              :: sender?RDY,m ->              /* E-exp */
+-                      assert(m == (n+1)%4);
+-advance:              n = (n+1)%4;
+-                      if
+-/* buffer */          :: atomic {
+-                              printf("MSC: NEW\n");
+-                              recv!DATA,n;
+-                              goto E
+-                         }
+-/* no buffer */               :: recv!NODATA,n;
+-                              goto N
+-                      fi
+-
+-              :: sender?NOTRDY,m ->   /* N-exp */
+-expected:             assert(m == (n+1)%4);
+-                      goto I
+-
+-              /* Timeout */
+-              /* ignored (p.154, in [Needham'82]) */
+-
+-              :: goto reset
+-
+-              od;
+-
+-E:            /* Essential element sent, ack expected */
+-              do
+-#if LOSS==1
+-              :: sender?_,_ -> progress0: skip
+-#endif
+-              :: sender?RESET,0 ->
+-                      goto ackreset
+-
+-              :: sender?RDY,m ->
+-                      if
+-                      :: (m == n) ->          /* E-rep */
+-                              goto retrans
+-                      :: (m == (n+1)%4) ->    /* E-exp */
+-                              goto advance
+-                      fi
+-
+-              :: sender?NOTRDY,m ->   /* N-exp */
+-                      goto expected
+-
+-              /* Timeout */
+-              :: stimeout ->
+-                      printf("MSC: STO\n");
+-retrans:              recv!DATA,n     /* retransmit */
+-
+-              :: goto reset
+-
+-              od;
+-
+-
+-N:            /* Non-essential element sent */
+-              do
+-#if LOSS==1
+-              :: sender?_,_ -> progress1: skip
+-#endif
+-              :: sender?RESET,0 ->
+-                      goto ackreset
+-
+-              :: sender?RDY,m ->              /* E-rep */
+-                      assert(m == n)          /* E-exp: protocol error */
+-                      -> recv!NODATA,n        /* retransmit and stay in N */
+-
+-              :: recv!DATA,n;         /* buffer ready event */
+-                      goto E
+-
+-              :: goto reset
+-
+-              /* Timeout */
+-              /* ignored (p.154, in [Needham'82]) */
+-              od;
+-
+-reset:                recv!RESET,0;
+-              do
+-#if LOSS==1
+-              :: sender?_,_ -> progress3: skip
+-#endif
+-              :: sender?t,m ->
+-                      if
+-                      :: t == RESET -> n = -1; goto I
+-                      :: else /* ignored, p. 152 */
+-                      fi
+-              :: timeout ->   /* a real timeout */
+-                      goto reset
+-              od
+-}
+-
+-active proctype Receiver()
+-{     byte t, n, m, Nexp;
+-
+-      xr recv;
+-      xs sender;
+-
+-I:            /* Idle State */
+-              do
+-#if LOSS==1
+-              :: recv?_,_ -> progress2: skip
+-#endif
+-              :: recv?RESET,0 ->
+-ackreset:             sender!RESET,0;         /* stay in idle */
+-                      n = 0; Nexp = 0;
+-                      goto I
+-
+-              :: atomic { recv?DATA(m) ->     /* E-exp */
+-                      assert(m == n);
+-advance:              printf("MSC: EXP\n");
+-                      n = (n+1)%4;
+-                      assert(m == Nexp);
+-                      Nexp = (m+1)%4;
+-                      if
+-                      :: sender!RDY,n; goto E
+-                      :: sender!NOTRDY,n; goto N
+-                      fi
+-                 }
+-
+-              :: recv?NODATA(m) ->            /* N-exp */
+-                      assert(m == n)
+-
+-              /* Timeout: ignored */
+-
+-      /* only receiver can initiate transfer; p. 156 */
+-      :: empty(recv) -> sender!RDY,n; goto E
+-
+-              :: goto reset
+-              od;
+-
+-E:
+-              do
+-#if LOSS==1
+-              :: recv?_,_ -> progress1: skip
+-#endif
+-              :: recv?RESET,0 ->
+-                      goto ackreset
+-
+-              :: atomic { recv?DATA(m) ->
+-                      if
+-                      :: ((m+1)%4 == n) ->            /* E-rep */
+-                              printf("MSC: REP\n");
+-                              goto retrans
+-                      :: (m == n) ->                  /* E-exp */
+-                              goto advance
+-                      fi
+-                 }
+-
+-              :: recv?NODATA(m) ->            /* N-exp  */
+-                      assert(m == n);
+-                      goto I
+-
+-              :: rtimeout ->
+-                      printf("MSC: RTO\n");
+-retrans:              sender!RDY,n;
+-                      goto E
+-
+-              :: goto reset
+-
+-              od;
+-
+-N:
+-              do
+-#if LOSS==1
+-              :: recv?_,_ -> progress0: skip
+-#endif
+-              :: recv?RESET,0 ->
+-                      goto ackreset
+-
+-              :: recv?DATA(m) ->              /* E-rep */
+-                      assert((m+1)%4 == n);   /* E-exp and N-exp: protocol error */
+-                      printf("MSC: REP\n");
+-                      sender!NOTRDY,n /* retransmit and stay in N */
+-
+-              :: sender!RDY,n ->              /* buffer ready event */
+-                      goto E
+-
+-              /* Timeout: ignored */
+-
+-              :: goto reset
+-
+-              od;
+-
+-progress:
+-reset:                sender!RESET,0;
+-              do
+-#if LOSS==1
+-              :: recv?_,_ -> progress3: skip
+-#endif
+-              :: recv?t,m ->
+-                      if
+-                      :: t == RESET -> n = 0; Nexp = 0; goto I
+-                      :: else /* ignored, p. 152 */
+-                      fi
+-              :: timeout ->   /* a real timeout */
+-                      goto reset
+-              od
+-}
+//GO.SYSIN DD ex.6
+echo ex.7 1>&2
+sed 's/.//' >ex.7 <<'//GO.SYSIN DD ex.7'
+-mtype = { Wakeme, Running };
+-
+-bit   lk,     sleep_q;
+-bit   r_lock, r_want;
+-mtype State = Running;
+-
+-active proctype client()
+-{
+-sleep:                                        /* sleep routine */
+-      atomic { (lk == 0) -> lk = 1 }; /* spinlock(&lk) */
+-      do                              /* while r->lock */
+-      :: (r_lock == 1) ->             /* r->lock == 1 */
+-              r_want = 1;
+-              State = Wakeme;
+-              lk = 0;                 /* freelock(&lk) */
+-              (State == Running);     /* wait for wakeup */
+-      :: else ->                      /* r->lock == 0 */
+-              break
+-      od;
+-progress:
+-      assert(r_lock == 0);            /* should still be true */
+-      r_lock = 1;                     /* consumed resource */
+-      lk = 0;                         /* freelock(&lk) */
+-      goto sleep
+-}
+-
+-active proctype server()              /* interrupt routine */
+-{
+-wakeup:                                       /* wakeup routine */
+-      r_lock = 0;                     /* r->lock = 0 */
+-      (lk == 0);                      /* waitlock(&lk) */
+-      if
+-      :: r_want ->                    /* someone is sleeping */
+-              atomic {                /* spinlock on sleep queue */
+-                      (sleep_q == 0) -> sleep_q = 1
+-              };
+-              r_want = 0;
+-#ifdef PROPOSED_FIX
+-              (lk == 0);              /* waitlock(&lk) */
+-#endif
+-              if
+-              :: (State == Wakeme) ->
+-                      State = Running;
+-              :: else ->
+-              fi;
+-              sleep_q = 0
+-      :: else ->
+-      fi;
+-      goto wakeup
+-}
+//GO.SYSIN DD ex.7
+echo ex.8 1>&2
+sed 's/.//' >ex.8 <<'//GO.SYSIN DD ex.8'
+-/* Dolev, Klawe & Rodeh for leader election in unidirectional ring
+- * `An O(n log n) unidirectional distributed algorithm for extrema
+- * finding in a circle,'  J. of Algs, Vol 3. (1982), pp. 245-260
+- */
+-
+-#define elected               (nr_leaders >  0)
+-#define noLeader      (nr_leaders == 0)
+-#define oneLeader     (nr_leaders == 1)
+-
+-/* properties:
+- *    ![] noLeader
+- *    <>  elected
+- *    <>[]oneLeader
+- *    [] (noLeader U oneLeader)
+- */
+-
+-#define N     7       /* nr of processes (use 5 for demos) */
+-#define I     3       /* node given the smallest number    */
+-#define L     14      /* size of buffer  (>= 2*N) */
+-
+-mtype = { one, two, winner };
+-chan q[N] = [L] of { mtype, byte};
+-
+-byte nr_leaders = 0;
+-
+-proctype node (chan in, out; byte mynumber)
+-{     bit Active = 1, know_winner = 0;
+-      byte nr, maximum = mynumber, neighbourR;
+-
+-      xr in;
+-      xs out;
+-
+-      printf("MSC: %d\n", mynumber);
+-      out!one(mynumber);
+-end:  do
+-      :: in?one(nr) ->
+-              if
+-              :: Active -> 
+-                      if
+-                      :: nr != maximum ->
+-                              out!two(nr);
+-                              neighbourR = nr
+-                      :: else ->
+-                              /* Raynal p.39:  max is greatest number */
+-                              assert(nr == N);
+-                              know_winner = 1;
+-                              out!winner,nr;
+-                      fi
+-              :: else ->
+-                      out!one(nr)
+-              fi
+-
+-      :: in?two(nr) ->
+-              if
+-              :: Active -> 
+-                      if
+-                      :: neighbourR > nr && neighbourR > maximum ->
+-                              maximum = neighbourR;
+-                              out!one(neighbourR)
+-                      :: else ->
+-                              Active = 0
+-                      fi
+-              :: else ->
+-                      out!two(nr)
+-              fi
+-      :: in?winner,nr ->
+-              if
+-              :: nr != mynumber ->
+-                      printf("MSC: LOST\n");
+-              :: else ->
+-                      printf("MSC: LEADER\n");
+-                      nr_leaders++;
+-                      assert(nr_leaders == 1)
+-              fi;
+-              if
+-              :: know_winner
+-              :: else -> out!winner,nr
+-              fi;
+-              break
+-      od
+-}
+-
+-init {
+-      byte proc;
+-      atomic {
+-              proc = 1;
+-              do
+-              :: proc <= N ->
+-                      run node (q[proc-1], q[proc%N], (N+I-proc)%N+1);
+-                      proc++
+-              :: proc > N ->
+-                      break
+-              od
+-      }
+-}
+-
+-#if 0
+-/* !(<>[]oneLeader) */
+-
+-never {
+-T0:
+-        if
+-        :: skip -> goto T0
+-        :: !oneLeader -> goto accept
+-        fi;
+-accept:
+-        if
+-        :: skip -> goto T0
+-        fi
+-}
+-#endif
+//GO.SYSIN DD ex.8
+echo ex.9 1>&2
+sed 's/.//' >ex.9 <<'//GO.SYSIN DD ex.9'
+-#define MaxSeq        3
+-#define MaxSeq_plus_1 4
+-#define inc(x)        x = (x + 1) % (MaxSeq_plus_1)
+-
+-chan q[2] = [MaxSeq] of { byte, byte };
+-
+-active [2] proctype p5()
+-{     byte    NextFrame, AckExp, FrameExp,
+-              r, s, nbuf, i;
+-      chan in, out;
+-
+-      in = q[_pid];
+-      out = q[1-_pid];
+-
+-      xr in;
+-      xs out;
+-
+-      do
+-      :: nbuf < MaxSeq ->
+-              nbuf++;
+-              out!NextFrame , (FrameExp + MaxSeq) % (MaxSeq_plus_1);
+-              inc(NextFrame)
+-      :: in?r,s ->
+-              if
+-              :: r == FrameExp ->
+-                      inc(FrameExp)
+-              :: else
+-              fi;
+-              do
+-              :: ((AckExp <= s) && (s <  NextFrame))
+-              || ((AckExp <= s) && (NextFrame <  AckExp))
+-              || ((s <  NextFrame) && (NextFrame <  AckExp)) ->
+-                      nbuf--;
+-                      inc(AckExp)
+-              :: else ->
+-                      break
+-              od
+-      :: timeout ->
+-              NextFrame = AckExp;
+-              i = 1;
+-              do
+-              :: i <= nbuf ->
+-                      out!NextFrame , (FrameExp + MaxSeq) % (MaxSeq_plus_1);
+-                      inc(NextFrame);
+-                      i++
+-              :: else ->
+-                      break
+-              od
+-      od
+-}
+//GO.SYSIN DD ex.9
+echo ex.9b 1>&2
+sed 's/.//' >ex.9b <<'//GO.SYSIN DD ex.9b'
+-#define MaxSeq        3
+-#define MaxSeq_plus_1 4
+-#define inc(x)        x = (x + 1) % (MaxSeq + 1)
+-
+-chan q[2] = [MaxSeq] of { byte, byte };
+-
+-active [2] proctype p5()
+-{     byte    NextFrame, AckExp, FrameExp,
+-              r, s, nbuf, i;
+-      chan in, out;
+-
+-      d_step {
+-              in = q[_pid];
+-              out = q[1-_pid]
+-      };
+-      xr in;
+-      xs out;
+-
+-      do
+-      :: atomic { nbuf < MaxSeq ->
+-              nbuf++;
+-              out!NextFrame , (FrameExp + MaxSeq) % (MaxSeq + 1);
+-              printf("MSC: nbuf: %d\n", nbuf);
+-              inc(NextFrame)
+-      }
+-      :: atomic { in?r,s ->
+-              if
+-              :: r == FrameExp ->
+-                      printf("MSC: accept %d\n", r);
+-                      inc(FrameExp)
+-              :: else
+-                      -> printf("MSC: reject\n")
+-              fi
+-      };
+-      d_step {
+-              do
+-              :: ((AckExp <= s) && (s <  NextFrame))
+-              || ((AckExp <= s) && (NextFrame <  AckExp))
+-              || ((s <  NextFrame) && (NextFrame <  AckExp)) ->
+-                      nbuf--;
+-                      printf("MSC: nbuf: %d\n", nbuf);
+-                      inc(AckExp)
+-              :: else ->
+-                      printf("MSC: %d %d %d\n", AckExp, s, NextFrame);
+-                      break
+-              od; skip
+-      }
+-      :: timeout ->
+-      d_step {
+-              NextFrame = AckExp;
+-              printf("MSC: timeout\n");
+-              i = 1;
+-              do
+-              :: i <= nbuf ->
+-                      out!NextFrame , (FrameExp + MaxSeq) % (MaxSeq + 1);
+-                      inc(NextFrame);
+-                      i++
+-              :: else ->
+-                      break
+-              od; i = 0
+-      }
+-      od
+-}
+//GO.SYSIN DD ex.9b
+echo ex.9c 1>&2
+sed 's/.//' >ex.9c <<'//GO.SYSIN DD ex.9c'
+-#define MaxSeq        3
+-#define MaxSeq_plus_1 4
+-#define inc(x)        x = (x + 1) % (MaxSeq + 1)
+-
+-#define CHECKIT
+-
+-#ifdef CHECKIT
+-      mtype = { red, white, blue };   /* Wolper's test */
+-      chan source = [0] of { mtype };
+-      chan q[2] = [MaxSeq] of { mtype, byte, byte };
+-      mtype rcvd = white;
+-      mtype sent = white;
+-#else
+-      chan q[2] = [MaxSeq] of { byte, byte };
+-#endif
+-
+-active [2] proctype p5()
+-{     byte    NextFrame, AckExp, FrameExp,
+-              r, s, nbuf, i;
+-      chan in, out;
+-#ifdef CHECKIT
+-      mtype   ball;
+-      byte frames[MaxSeq_plus_1];
+-#endif
+-
+-      d_step {
+-              in = q[_pid];
+-              out = q[1-_pid]
+-      };
+-
+-      xr in;
+-      xs out;
+-
+-      do
+-      :: atomic {
+-              nbuf < MaxSeq ->
+-              nbuf++;
+-#ifdef CHECKIT
+-              if
+-              :: _pid%2 -> source?ball
+-              :: else
+-              fi;
+-              frames[NextFrame] = ball;
+-              out!ball, NextFrame , (FrameExp + MaxSeq) % (MaxSeq + 1);
+-              if
+-              :: _pid%2 -> sent = ball;
+-              :: else
+-              fi;
+-#else
+-              out!NextFrame , (FrameExp + MaxSeq) % (MaxSeq + 1);
+-#endif
+-#ifdef VERBOSE
+-              printf("MSC: nbuf: %d\n", nbuf);
+-#endif
+-              inc(NextFrame)
+-      }
+-#ifdef CHECKIT
+-      :: atomic { in?ball,r,s ->
+-#else
+-      :: atomic { in?r,s ->
+-#endif
+-              if
+-              :: r == FrameExp ->
+-#ifdef VERBOSE
+-                      printf("MSC: accept %d\n", r);
+-#endif
+-#ifdef CHECKIT
+-                      if
+-                      :: _pid%2
+-                      :: else -> rcvd = ball
+-                      fi;
+-#endif
+-                      inc(FrameExp)
+-              :: else
+-#ifdef VERBOSE
+-                      -> printf("MSC: reject\n")
+-#endif
+-              fi
+-      };
+-      d_step {
+-              do
+-              :: ((AckExp <= s) && (s <  NextFrame))
+-              || ((AckExp <= s) && (NextFrame <  AckExp))
+-              || ((s <  NextFrame) && (NextFrame <  AckExp)) ->
+-                      nbuf--;
+-#ifdef VERBOSE
+-                      printf("MSC: nbuf: %d\n", nbuf);
+-#endif
+-                      inc(AckExp)
+-              :: else ->
+-#ifdef VERBOSE
+-                      printf("MSC: %d %d %d\n", AckExp, s, NextFrame);
+-#endif
+-                      break
+-              od;
+-              skip
+-      }
+-      :: timeout ->
+-      d_step {
+-              NextFrame = AckExp;
+-#ifdef VERBOSE
+-              printf("MSC: timeout\n");
+-#endif
+-              i = 1;
+-              do
+-              :: i <= nbuf ->
+-#ifdef CHECKIT
+-                      if
+-                      :: _pid%2 -> ball = frames[NextFrame]
+-                      :: else
+-                      fi;             
+-                      out!ball, NextFrame , (FrameExp + MaxSeq) % (MaxSeq + 1);
+-#else
+-                      out!NextFrame , (FrameExp + MaxSeq) % (MaxSeq + 1);
+-#endif
+-                      inc(NextFrame);
+-                      i++
+-              :: else ->
+-                      break
+-              od;
+-              i = 0
+-      }
+-      od
+-}
+-#ifdef CHECKIT
+-active proctype Source()
+-{
+-      do
+-      :: source!white
+-      :: source!red -> break
+-      od;
+-      do
+-      :: source!white
+-      :: source!blue -> break
+-      od;
+-end:  do
+-      :: source!white
+-      od
+-}
+-
+-#define sw    (sent == white)
+-#define sr    (sent == red)
+-#define sb    (sent == blue)
+-
+-#define rw    (rcvd == white)
+-#define rr    (rcvd == red)
+-#define rb    (rcvd == blue)
+-
+-#define LTL   3
+-#if LTL==1
+-
+-never {               /* ![](sr -> <> rr) */
+-              /* the never claim is generated by
+-                      spin -f "![](sr -> <> rr)"
+-                 and then edited a little for readability
+-                 the same is true for all others below
+-               */
+-        do
+-        :: 1
+-        :: !rr && sr -> goto accept
+-        od;
+-accept:
+-        if
+-        :: !rr -> goto accept
+-        fi
+-}
+-
+-#endif
+-#if LTL==2
+-
+-never {               /* !rr U rb */
+-      do
+-        :: !rr
+-        :: rb -> break        /* move to implicit 2nd state */
+-        od
+-}
+-
+-#endif
+-#if LTL==3
+-
+-never {               /* (![](sr -> <> rr)) || (!rr U rb) */
+-
+-        if
+-        :: 1 -> goto T0_S5
+-        :: !rr && sr -> goto accept_S8
+-        :: !rr -> goto T0_S2
+-        :: rb -> goto accept_all
+-        fi;
+-accept_S8:
+-        if
+-        :: !rr -> goto T0_S8
+-        fi;
+-T0_S2:
+-        if
+-        :: !rr -> goto T0_S2
+-        :: rb -> goto accept_all
+-        fi;
+-T0_S8:
+-        if
+-        :: !rr -> goto accept_S8
+-        fi;
+-T0_S5:
+-        if
+-        :: 1 -> goto T0_S5
+-        :: !rr && sr -> goto accept_S8
+-        fi;
+-accept_all:
+-        skip
+-}
+-#endif
+-
+-#endif
+//GO.SYSIN DD ex.9c
This page took 0.033547 seconds and 4 git commands to generate.