forked from kmsalem/Carousel-TLA
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathndmatch.pml
97 lines (83 loc) · 1.47 KB
/
ndmatch.pml
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
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
mtype{MSG}
chan toClient = [10] of {int, chan}
chan getRN = [20] of {int}
/*random number generator*/
proctype Random_num (int upperbound; chan RN)
{
int nr;
do
:: nr >= upperbound -> nr = 0
:: nr < 0 -> nr=upperbound -1
:: nr++ /* randomly increment */
:: nr-- /* or decrement */
:: nr >= 0 && nr < upperbound -> RN ! nr /* or output */
od;
}
/*participants*/
proctype P1(chan RN, out)
{
int rn;
chan in = [10] of {mtype, bit};
do
::bit recebit;
RN ? rn;
out ! rn, in;
in ? MSG(recebit);
od
}
proctype P2(chan RN, out)
{
int rn;
chan in = [10] of {mtype, bit};
do
::bit recebit;
RN ? rn;
out ! rn, in;
in ? MSG(recebit);
od
}
proctype P3(chan RN, out)
{
int rn;
chan in = [10] of {mtype, bit};
do
::bit recebit;
RN ? rn;
out ! rn, in;
in ? MSG(recebit);
od
}
/*Client*/
proctype Client(chan RN, in)
{
int rn;
int sSet;
bit sendbit;
RN ? rn;
RN ? sSet;
int match;
chan toSend;
do
::if
::sSet >= 0 ->
do
::in? match, toSend ->
if
::match == rn -> break
::else
fi
od;
toSend ! MSG(sendbit);
sSet--;
::else -> break;
fi
od
}
/*main function*/
init{
run Random_num (2, getRN);
run P1(getRN, toClient);
run P2(getRN, toClient);
run P3(getRN, toClient);
run Client(getRN, toClient);
}