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.
		
		
		
		
		
			
		
			
				
					
					
						
							151 lines
						
					
					
						
							4.5 KiB
						
					
					
				
			
		
		
		
			
			
			
				
					
				
				
					
				
			
		
		
	
	
							151 lines
						
					
					
						
							4.5 KiB
						
					
					
				| ctmc | |
| 
 | |
| // constants | |
| const int MAX_COUNT; | |
| const int MIN_SENSORS = 2; | |
| const int MIN_ACTUATORS = 1; | |
| 
 | |
| // rates | |
| const double lambda_p = 1/(365*24*60*60); // 1 year | |
| const double lambda_s = 1/(30*24*60*60); // 1 month | |
| const double lambda_a = 1/(2*30*24*60*60); // 2 months | |
| const double tau = 1/60; // 1 min | |
| const double delta_f = 1/(24*60*60); // 1 day | |
| const double delta_r = 1/30; // 30 secs | |
| 
 | |
| // sensors | |
| module sensors | |
| 	 | |
| 	s : [0..3] init 3; // number of sensors working | |
| 	 | |
| 	[] s>1 -> s*lambda_s : (s'=s-1); // failure of a single sensor | |
| 	 | |
| endmodule | |
| 
 | |
| // input processor | |
| // (takes data from sensors and passes onto main processor) | |
| module proci | |
| 	 | |
| 	i : [0..2] init 2; // 2=ok, 1=transient fault, 0=failed | |
| 	 | |
| 	[] i>0 & s>=MIN_SENSORS -> lambda_p : (i'=0); // failure of processor | |
| 	[] i=2 & s>=MIN_SENSORS -> delta_f : (i'=1); // transient fault | |
| 	[input_reboot] i=1 & s>=MIN_SENSORS -> delta_r : (i'=2); // reboot after transient fault | |
| 	 | |
| endmodule | |
| 
 | |
| // actuators | |
| module actuators | |
| 	 | |
| 	a : [0..2] init 2; // number of actuators working | |
| 	 | |
| 	[] a>0 -> a*lambda_a : (a'=a-1); // failure of a single actuator | |
| 	 | |
| endmodule | |
| 
 | |
| // output processor | |
| // (receives instructions from main processor and passes onto actuators) | |
| module proco = proci [ i=o, s=a, input_reboot=output_reboot, MIN_SENSORS=MIN_ACTUATORS ] endmodule | |
| 
 | |
| // main processor | |
| // (takes data from proci, processes it, and passes instructions to proco) | |
| module procm | |
| 	 | |
| 	m : [0..1] init 1; // 1=ok, 0=failed | |
| 	count : [0..MAX_COUNT+1] init 0; // number of consecutive skipped cycles | |
| 	 | |
| 	// failure of processor | |
| 	[] m=1 -> lambda_p : (m'=0); | |
| 	// processing completed before timer expires - reset skipped cycle counter | |
| 	[timeout]  comp -> tau : (count'=0); | |
| 	// processing not completed before timer expires - increment skipped cycle counter | |
| 	[timeout] !comp -> tau : (count'=min(count+1, MAX_COUNT+1)); | |
| 	 | |
| endmodule | |
| 
 | |
| // connecting bus | |
| module bus | |
| 	 | |
| 	// flags | |
| 	// main processor has processed data from input processor | |
| 	// and sent corresponding instructions to output processor (since last timeout) | |
| 	comp : bool init true;  | |
| 	// input processor has data ready to send | |
| 	reqi : bool init true;  | |
| 	// output processor has instructions ready to be processed | |
| 	reqo : bool init false; | |
| 	 | |
| 	// input processor reboots | |
| 	[input_reboot]  true -> 1 : | |
| 	// performs a computation if has already done so or | |
| 	// it is up and ouput clear (i.e. nothing waiting) | |
| 	(comp'=(comp | (m=1 & !reqo)))  | |
| 	// up therefore something to process | |
| 	& (reqi'=true) | |
| 	// something to process if not functioning and either | |
| 	// there is something already pending | |
| 	// or the main processor sends a request | |
| 	& (reqo'=!(o=2 & a>=1) & (reqo | m=1)); | |
| 	 | |
| 	// output processor reboots | |
| 	[output_reboot] true -> 1 : | |
| 	// performs a computation if it has already or | |
| 	// something waiting and is up | |
| 	// (can be processes as the output has come up and cleared pending requests) | |
| 	(comp'=(comp | (reqi & m=1))) | |
| 	// something to process it they are up or | |
| 	// there was already something and the main processor acts | |
| 	// (output now up must be due to main processor being down) | |
| 	& (reqi'=(i=2 & s>=2) | (reqi & m=0)) | |
| 	// output and actuators up therefore nothing can be pending | |
| 	& (reqo'=false); | |
| 	 | |
| 	// main processor times out | |
| 	[timeout] true -> 1 : | |
| 	// performs a computation if it is up something was pending | |
| 	// and nothing is waiting for the output | |
| 	(comp'=(reqi & !reqo & m=1)) | |
| 	// something to process if up or | |
| 	// already something and main process cannot act  | |
| 	// (down or outputs pending) | |
| 	& (reqi'=(i=2 & s>=2) | (reqi & (reqo | m=0))) | |
| 	// something to process if they are not functioning and  | |
| 	// either something is already pending | |
| 	// or the main processor acts | |
| 	& (reqo'=!(o=2 & a>=1) & (reqo | (reqi & m=1))); | |
| 	 | |
| endmodule | |
| 
 | |
| 
 | |
| // the system is down | |
| formula down = (i=2&s<MIN_SENSORS)|(count=MAX_COUNT+1)|(o=2&a<MIN_ACTUATORS)|(m=0); | |
| // transient failure has occured but the system is not down | |
| formula danger = !down & (i=1 | o=1); | |
| // the system is operational | |
| formula up = !down & !danger; | |
| 
 | |
| 
 | |
| // reward structures | |
| 
 | |
| rewards "up" | |
| 	up : 1/3600; | |
| endrewards | |
| 
 | |
| rewards "danger" | |
| 	danger : 1/3600; | |
| endrewards | |
| rewards "down" | |
| 	down : 1/3600; | |
| endrewards | |
| 
 | |
| //labels | |
| // causes of failues | |
| label "fail_sensors" = i=2&s<MIN_SENSORS; // sensors have failed | |
| label "fail_actuators" = o=2&a<MIN_ACTUATORS; // actuators have failed | |
| label "fail_io" = count=MAX_COUNT+1; // IO has failed | |
| label "fail_main" = m=0; // ,main processor has failed | |
| 
 | |
| // system status | |
| label "down" = (i=2&s<MIN_SENSORS)|(count=MAX_COUNT+1)|(o=2&a<MIN_ACTUATORS)|(m=0); // system has shutdown | |
| label "danger" = !down & (i=1 | o=1); // transient fault has occured | |
| label "up" = !down & !danger;  |