-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathcarosol_deterministic.pml
73 lines (64 loc) · 1.19 KB
/
carosol_deterministic.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
#define CLIENT_NUM 3
#define PARTICIPANT_NUM 3
chan clientChannels[CLIENT_NUM] = [1] of {byte};
chan participantChannels[PARTICIPANT_NUM] = [2] of {byte, byte}; // TID, ClientId
byte client_num = 0;
byte participant_num = 0;
proctype Client(byte id)
{
byte i = 0;
byte numSent = 0;
byte TID = _pid;
byte receiveMsg;
client_num++;
do
::
do
:: i < PARTICIPANT_NUM -> atomic{participantChannels[i] ! TID, id ; i++; numSent++};
:: i >= PARTICIPANT_NUM -> break;
od;
do
:: numSent > 0 ->
atomic
{
clientChannels[id] ? receiveMsg;
assert(receiveMsg == TID);
numSent--;
}
:: else -> break;
od;
od;
}
proctype Participant(byte id)
{
byte receiveTID;
byte receiveClientId;
participant_num++;
do
:: participantChannels[id] ? receiveTID, receiveClientId -> clientChannels[receiveClientId] ! receiveTID;
od;
}
init
{
atomic
{
byte i = 0;
do
:: i < CLIENT_NUM -> run Client(i); i++;
:: i >= CLIENT_NUM -> break;
od;
i = 0;
do
:: i < PARTICIPANT_NUM -> run Participant(i); i++;
:: i >= PARTICIPANT_NUM -> break;
od;
}
}
never
{
do
:: !(participant_num <= PARTICIPANT_NUM) -> break
:: !(client_num <= CLIENT_NUM ) -> break
:: else
od
}