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.
		
		
		
		
		
			
		
			
				
					
					
						
							100 lines
						
					
					
						
							4.0 KiB
						
					
					
				
			
		
		
		
			
			
			
				
					
				
				
					
				
			
		
		
	
	
							100 lines
						
					
					
						
							4.0 KiB
						
					
					
				
								// asynchronous leader election
							 | 
						|
								// 4 processes
							 | 
						|
								// gxn/dxp 29/01/01
							 | 
						|
								
							 | 
						|
								mdp
							 | 
						|
								
							 | 
						|
								const N= 7; // number of processes
							 | 
						|
								
							 | 
						|
								//----------------------------------------------------------------------------------------------------------------------------
							 | 
						|
								module process1
							 | 
						|
									
							 | 
						|
									// COUNTER
							 | 
						|
									c1 : [0..7-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
							 | 
						|
									[p71] (s1=1) & (receive1=0) & !( (p1=0) & (p7=1) ) -> (s1'=2) & (receive1'=1);
							 | 
						|
									// become inactive
							 | 
						|
									[p71] (s1=1) & (receive1=0) & (p1=0) & (p7=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)
							 | 
						|
									[c71] (s1=2) & (receive1=1) & (sent1<2) -> (receive1'=2);
							 | 
						|
									// receive counter and sent counter
							 | 
						|
									// only active process (decide)
							 | 
						|
									[c71] (s1=2) & (receive1=1) & (sent1=2) & (c7=N-1) -> (s1'=4) & (p1'=0) & (c1'=0) & (sent1'=0) & (receive1'=0);
							 | 
						|
									// other active process (pick again)
							 | 
						|
									[c71] (s1=2) & (receive1=1) & (sent1=2) & (c7<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
							 | 
						|
									[p71] (s1=3) & (receive1=0) -> (p1'=p7) & (receive1'=1);
							 | 
						|
									// receive counter
							 | 
						|
									[c71] (s1=3) & (receive1=1) & (c7<N-1) -> (c1'=c7+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,p71=p12,c12=c23,c71=c12,p7=p1,c7=c1] endmodule
							 | 
						|
								module process3=process1[s1=s3,p1=p3,c1=c3,sent1=sent3,receive1=receive3,p12=p34,p71=p23,c12=c34,c71=c23,p7=p2,c7=c2] endmodule
							 | 
						|
								module process4=process1[s1=s4,p1=p4,c1=c4,sent1=sent4,receive1=receive4,p12=p45,p71=p34,c12=c45,c71=c34,p7=p3,c7=c3] endmodule
							 | 
						|
								module process5=process1[s1=s5,p1=p5,c1=c5,sent1=sent5,receive1=receive5,p12=p56,p71=p45,c12=c56,c71=c45,p7=p4,c7=c4] endmodule
							 | 
						|
								module process6=process1[s1=s6,p1=p6,c1=c6,sent1=sent6,receive1=receive6,p12=p67,p71=p56,c12=c67,c71=c56,p7=p5,c7=c5] endmodule
							 | 
						|
								module process7=process1[s1=s7,p1=p7,c1=c7,sent1=sent7,receive1=receive7,p12=p71,p71=p67,c12=c71,c71=c67,p7=p6,c7=c6] endmodule
							 | 
						|
								
							 | 
						|
								//----------------------------------------------------------------------------------------------------------------------------
							 | 
						|
								
							 | 
						|
								// reward - expected number of rounds (equals the number of times a process receives a counter)
							 | 
						|
								rewards
							 | 
						|
									[c12] true : 1;
							 | 
						|
								endrewards
							 | 
						|
								
							 | 
						|
								//----------------------------------------------------------------------------------------------------------------------------
							 | 
						|
								formula leaders = (s1=4?1:0)+(s2=4?1:0)+(s3=4?1:0)+(s4=4?1:0)+(s5=4?1:0)+(s6=4?1:0)+(s7=4?1:0);
							 | 
						|
								label "elected" = s1=4|s2=4|s3=4|s4=4|s5=4|s6=4|s7=4;
							 | 
						|
								
							 |