You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
94 lines
3.3 KiB
94 lines
3.3 KiB
// asynchronous leader election
|
|
// 4 processes
|
|
// gxn/dxp 29/01/01
|
|
|
|
mdp
|
|
|
|
const int N = 3; // number of processes
|
|
|
|
//----------------------------------------------------------------------------------------------------------------------------
|
|
module process1
|
|
|
|
// COUNTER
|
|
c1 : [0..3-1];
|
|
|
|
// STATES
|
|
s1 : [0..4];
|
|
// 0 make choice
|
|
// 1 have not received neighbours choice
|
|
// 2 active
|
|
// 3 inactive
|
|
// 4 leader
|
|
|
|
// PREFERENCE
|
|
p1 : [0..1];
|
|
|
|
// VARIABLES FOR SENDING AND RECEIVING
|
|
receive1 : [0..2];
|
|
// not received anything
|
|
// received choice
|
|
// received counter
|
|
sent1 : [0..2];
|
|
// not send anything
|
|
// sent choice
|
|
// sent counter
|
|
|
|
// pick value
|
|
[] (s1=0) -> 0.5 : (s1'=1) & (p1'=0) + 0.5 : (s1'=1) & (p1'=1);
|
|
|
|
// send preference
|
|
[p12] (s1=1) & (sent1=0) -> (sent1'=1);
|
|
// receive preference
|
|
// stay active
|
|
[p31] (s1=1) & (receive1=0) & !( (p1=0) & (p3=1) ) -> (s1'=2) & (receive1'=1);
|
|
// become inactive
|
|
[p31] (s1=1) & (receive1=0) & (p1=0) & (p3=1) -> (s1'=3) & (receive1'=1);
|
|
|
|
// send preference (can now reset preference)
|
|
[p12] (s1=2) & (sent1=0) -> (sent1'=1) & (p1'=0);
|
|
// send counter (already sent preference)
|
|
// not received counter yet
|
|
[c12] (s1=2) & (sent1=1) & (receive1=1) -> (sent1'=2);
|
|
// received counter (pick again)
|
|
[c12] (s1=2) & (sent1=1) & (receive1=2) -> (s1'=0) & (p1'=0) & (c1'=0) & (sent1'=0) & (receive1'=0);
|
|
|
|
// receive counter and not sent yet (note in this case do not pass it on as will send own counter)
|
|
[c31] (s1=2) & (receive1=1) & (sent1<2) -> (receive1'=2);
|
|
// receive counter and sent counter
|
|
// only active process (decide)
|
|
[c31] (s1=2) & (receive1=1) & (sent1=2) & (c3=N-1) -> (s1'=4) & (p1'=0) & (c1'=0) & (sent1'=0) & (receive1'=0);
|
|
// other active process (pick again)
|
|
[c31] (s1=2) & (receive1=1) & (sent1=2) & (c3<N-1) -> (s1'=0) & (p1'=0) & (c1'=0) & (sent1'=0) & (receive1'=0);
|
|
|
|
// send preference (must have received preference) and can now reset
|
|
[p12] (s1=3) & (receive1>0) & (sent1=0) -> (sent1'=1) & (p1'=0);
|
|
// send counter (must have received counter first) and can now reset
|
|
[c12] (s1=3) & (receive1=2) & (sent1=1) -> (s1'=3) & (p1'=0) & (c1'=0) & (sent1'=0) & (receive1'=0);
|
|
|
|
// receive preference
|
|
[p31] (s1=3) & (receive1=0) -> (p1'=p3) & (receive1'=1);
|
|
// receive counter
|
|
[c31] (s1=3) & (receive1=1) & (c3<N-1) -> (c1'=c3+1) & (receive1'=2);
|
|
|
|
// done
|
|
[done] (s1=4) -> (s1'=s1);
|
|
// add loop for processes who are inactive
|
|
[done] (s1=3) -> (s1'=s1);
|
|
|
|
endmodule
|
|
|
|
//----------------------------------------------------------------------------------------------------------------------------
|
|
|
|
// construct further stations through renaming
|
|
module process2=process1[s1=s2,p1=p2,c1=c2,sent1=sent2,receive1=receive2,p12=p23,p31=p12,c12=c23,c31=c12,p3=p1,c3=c1] endmodule
|
|
module process3=process1[s1=s3,p1=p3,c1=c3,sent1=sent3,receive1=receive3,p12=p31,p31=p23,c12=c31,c31=c23,p3=p2,c3=c2] endmodule
|
|
|
|
//----------------------------------------------------------------------------------------------------------------------------
|
|
rewards "rounds"
|
|
[c12] true : 1;
|
|
endrewards
|
|
|
|
//----------------------------------------------------------------------------------------------------------------------------
|
|
formula leaders = (s1=4?1:0)+(s2=4?1:0)+(s3=4?1:0);
|
|
label "elected" = s1=4|s2=4|s3=4;
|
|
|