File: hajek.pml

package info (click to toggle)
spin 6.5.2%2Bdfsg-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 2,512 kB
  • sloc: ansic: 39,876; yacc: 1,021; makefile: 58; sh: 13
file content (68 lines) | stat: -rwxr-xr-x 1,055 bytes parent folder | download | duplicates (4)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
/*
 * Hajek's THE protocol
 */

#define MAX	8
#define printf(a,b)	skip

chan q0 = [1] of { bit, byte };
chan q1 = [1] of { bit, byte };

proctype station(chan inp, out)
{	bit phased, phase, everaccepted, everfetched, c, v;
	bit gotack = 1;
	byte din, prev_din, dout=1;

	do
	:: empty(inp) ->
		printf("%d empty\n", _pid);
		c = 1;
		goto pr
	:: inp?v,din ->
		if
		:: c = 0
		:: c = 1
		fi;
pr:		if
		:: c == 0 ->
			if
			:: (!everaccepted && v) || (v != phased) ->
				gotack = 1;
			:: else
			fi;
			if
			:: (v != phased) || (!everaccepted) ->
				printf("%d accept\n", _pid);
				assert(din == (prev_din+1)%MAX); /* ACCEPT */
				prev_din = din;
				everaccepted = 1;
				phased = v;
				phase = 1 - phase
			:: else
			fi
				
		:: c != 0 ->
			printf("%d error\n", _pid);
		fi;
		if
		:: gotack ->
			if
			:: everfetched ->
progress:			printf("%d fetch\n", _pid);
				dout = (dout+1)%MAX
			:: else
			fi;
			everfetched = 1
		:: else
		fi;
		out!phase,dout;
		gotack = 0
	od
}

init {
	atomic {
		run station(q0, q1);
		run station(q1, q0)
	}
}