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.
		
		
		
		
		
			
		
			
				
					
					
						
							130 lines
						
					
					
						
							4.7 KiB
						
					
					
				
			
		
		
		
			
			
			
				
					
				
				
					
				
			
		
		
	
	
							130 lines
						
					
					
						
							4.7 KiB
						
					
					
				
								// CSMA/CD protocol - probabilistic version of kronos model (3 stations)
							 | 
						|
								// gxn/dxp 04/12/01
							 | 
						|
								
							 | 
						|
								mdp
							 | 
						|
								
							 | 
						|
								// note made changes since cannot have strict inequalities
							 | 
						|
								// in digital clocks approach and suppose a station only sends one message
							 | 
						|
								
							 | 
						|
								// simplified parameters scaled
							 | 
						|
								const int sigma=1; // time for messages to propagate along the bus
							 | 
						|
								const int lambda=30; // time to send a message
							 | 
						|
								
							 | 
						|
								// actual parameters
							 | 
						|
								const int N = 3; // number of processes
							 | 
						|
								const int K = 2; // exponential backoff limit
							 | 
						|
								const int slot = 2*sigma; // length of slot
							 | 
						|
								const int M = 3; // max number of slots to wait
							 | 
						|
								//const int lambda=782;
							 | 
						|
								//const int sigma=26;
							 | 
						|
								
							 | 
						|
								//----------------------------------------------------------------------------------------------------------------------------
							 | 
						|
								// the bus
							 | 
						|
								module bus
							 | 
						|
									
							 | 
						|
									b : [0..2];
							 | 
						|
									// b=0 - idle
							 | 
						|
									// b=1 - active
							 | 
						|
									// b=2 - collision
							 | 
						|
									
							 | 
						|
									// clocks of bus
							 | 
						|
									y1 : [0..sigma+1]; // time since first send (used find time until channel sensed busy)
							 | 
						|
									y2 : [0..sigma+1]; // time since second send (used to find time until collision detected)
							 | 
						|
									
							 | 
						|
									// a sender sends (ok - no other message being sent)
							 | 
						|
									[send1] (b=0) -> (b'=1);
							 | 
						|
									[send2] (b=0) -> (b'=1);
							 | 
						|
									[send3] (b=0) -> (b'=1);
							 | 
						|
									
							 | 
						|
									// a sender sends (bus busy - collision)
							 | 
						|
									[send1] (b=1|b=2) & (y1<sigma) -> (b'=2);
							 | 
						|
									[send2] (b=1|b=2) & (y1<sigma) -> (b'=2);
							 | 
						|
									[send3] (b=1|b=2) & (y1<sigma) -> (b'=2);
							 | 
						|
									
							 | 
						|
									// finish sending
							 | 
						|
									[end1] (b=1) -> (b'=0) & (y1'=0);
							 | 
						|
									[end2] (b=1) -> (b'=0) & (y1'=0);
							 | 
						|
									[end3] (b=1) -> (b'=0) & (y1'=0);
							 | 
						|
									
							 | 
						|
									// bus busy
							 | 
						|
									[busy1] (b=1|b=2) & (y1>=sigma) -> (b'=b);  
							 | 
						|
									[busy2] (b=1|b=2) & (y1>=sigma) -> (b'=b);  
							 | 
						|
									[busy3] (b=1|b=2) & (y1>=sigma) -> (b'=b);  
							 | 
						|
									
							 | 
						|
									// collision detected
							 | 
						|
									[cd] (b=2) & (y2<=sigma) -> (b'=0) & (y1'=0) & (y2'=0);
							 | 
						|
									
							 | 
						|
									// time passage
							 | 
						|
									[time] (b=0) -> (y1'=0); // value of y1/y2 does not matter in state 0
							 | 
						|
									[time] (b=1) -> (y1'=min(y1+1,sigma+1)); // no invariant in state 1
							 | 
						|
									[time] (b=2) & (y2<sigma) -> (y1'=min(y1+1,sigma+1)) & (y2'=min(y2+1,sigma+1)); // invariant in state 2 (time until collision detected)
							 | 
						|
									
							 | 
						|
								endmodule
							 | 
						|
								
							 | 
						|
								//----------------------------------------------------------------------------------------------------------------------------
							 | 
						|
								// model of first sender
							 | 
						|
								module station1
							 | 
						|
									
							 | 
						|
									// LOCAL STATE
							 | 
						|
									s1 : [0..5];
							 | 
						|
									// s1=0 - initial state
							 | 
						|
									// s1=1 - transmit
							 | 
						|
									// s1=2 - collision (set backoff)
							 | 
						|
									// s1=3 - wait (bus busy)
							 | 
						|
									// s1=4 - successfully sent
							 | 
						|
									
							 | 
						|
									// LOCAL CLOCK
							 | 
						|
									x1 : [0..max(lambda,slot)];
							 | 
						|
									
							 | 
						|
									// BACKOFF COUNTER (number of slots to wait)
							 | 
						|
									bc1 : [0..M];
							 | 
						|
									
							 | 
						|
									// COLLISION COUNTER
							 | 
						|
									cd1 : [0..K];
							 | 
						|
									
							 | 
						|
									// start sending
							 | 
						|
									[send1] (s1=0) -> (s1'=1) & (x1'=0); // start sending
							 | 
						|
									[busy1] (s1=0) -> (s1'=2) & (x1'=0) & (cd1'=min(K,cd1+1)); // detects channel is busy so go into backoff
							 | 
						|
									
							 | 
						|
									// transmitting
							 | 
						|
									[time] (s1=1) & (x1<lambda) -> (x1'=min(x1+1,lambda)); // let time pass
							 | 
						|
									[end1]  (s1=1) & (x1=lambda) -> (s1'=4) & (x1'=0); // finished
							 | 
						|
									[cd]   (s1=1) -> (s1'=2) & (x1'=0) & (cd1'=min(K,cd1+1)); // collision detected (increment backoff counter)
							 | 
						|
									[cd] !(s1=1) -> (s1'=s1); // add loop for collision detection when not important
							 | 
						|
									
							 | 
						|
									// set backoff (no time can pass in this state)
							 | 
						|
									// probability depends on which transmission this is (cd1)
							 | 
						|
									[] s1=2 & cd1=1 ->  1/2 : (s1'=3) & (bc1'=0) + 1/2 : (s1'=3) & (bc1'=1) ;
							 | 
						|
									[] s1=2 & cd1=2 ->  1/4 : (s1'=3) & (bc1'=0) + 1/4 : (s1'=3) & (bc1'=1) + 1/4 : (s1'=3) & (bc1'=2) + 1/4 : (s1'=3) & (bc1'=3) ;
							 | 
						|
									
							 | 
						|
									// wait until backoff counter reaches 0 then send again
							 | 
						|
									[time] (s1=3) & (x1<slot) -> (x1'=x1+1); // let time pass (in slot)
							 | 
						|
									[time] (s1=3) & (x1=slot) & (bc1>0) -> (x1'=1) & (bc1'=bc1-1); // let time pass (move slots)
							 | 
						|
									[send1] (s1=3) & (x1=slot) & (bc1=0) -> (s1'=1) & (x1'=0); // finished backoff (bus appears free)
							 | 
						|
									[busy1] (s1=3) & (x1=slot) & (bc1=0) -> (s1'=2) & (x1'=0) & (cd1'=min(K,cd1+1)); // finished backoff (bus busy)
							 | 
						|
									
							 | 
						|
									// once finished nothing matters
							 | 
						|
									[time] (s1>=4) -> (x1'=0);
							 | 
						|
								
							 | 
						|
								endmodule
							 | 
						|
								
							 | 
						|
								//----------------------------------------------------------------------------------------------------------------------------
							 | 
						|
								
							 | 
						|
								// construct further stations through renaming
							 | 
						|
								module station2=station1[s1=s2,x1=x2,cd1=cd2,bc1=bc2,send1=send2,busy1=busy2,end1=end2] endmodule
							 | 
						|
								module station3=station1[s1=s3,x1=x3,cd1=cd3,bc1=bc3,send1=send3,busy1=busy3,end1=end3] endmodule
							 | 
						|
								
							 | 
						|
								//----------------------------------------------------------------------------------------------------------------------------
							 | 
						|
								
							 | 
						|
								// reward structure for expected time
							 | 
						|
								rewards "time"
							 | 
						|
									[time] true : 1;
							 | 
						|
								endrewards
							 | 
						|
								
							 | 
						|
								//----------------------------------------------------------------------------------------------------------------------------
							 | 
						|
								
							 | 
						|
								// labels/formulae
							 | 
						|
								label "all_delivered" = s1=4&s2=4&s3=4;
							 | 
						|
								label "one_delivered" = s1=4|s2=4|s3=4;
							 | 
						|
								label "collision_max_backoff" = (cd1=K & s1=1 & b=2)|(cd2=K & s2=1 & b=2)|(cd3=K & s3=1 & b=2);
							 | 
						|
								
							 |