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.
		
		
		
		
		
			
		
			
				
					
					
						
							160 lines
						
					
					
						
							3.9 KiB
						
					
					
				
			
		
		
		
			
			
			
				
					
				
				
					
				
			
		
		
	
	
							160 lines
						
					
					
						
							3.9 KiB
						
					
					
				
								// power manager example
							 | 
						|
								mdp
							 | 
						|
								
							 | 
						|
								const int QMAX =2; // max queue size
							 | 
						|
								
							 | 
						|
								// to model the pm making a choice and then a move being made we need
							 | 
						|
								// two clock ticks for each transition
							 | 
						|
								// first the pm decides tick1 and then the system moves tick2
							 | 
						|
								
							 | 
						|
								module timer
							 | 
						|
								
							 | 
						|
									c : [0..1];
							 | 
						|
								
							 | 
						|
									[tick1] c=0 -> (c'=1);
							 | 
						|
									[tick2] c=1 -> (c'=0);
							 | 
						|
									
							 | 
						|
								endmodule
							 | 
						|
								
							 | 
						|
								//-------------------------------------------------------------------------
							 | 
						|
								
							 | 
						|
								// POWER MANAGER
							 | 
						|
								module PM
							 | 
						|
								
							 | 
						|
									pm : [0..4] init 4;
							 | 
						|
									// 0 - go to active 
							 | 
						|
									// 1 - go to idle 
							 | 
						|
									// 2 - go to idlelp 
							 | 
						|
									// 3 - go to stby  
							 | 
						|
									// 4 - go to sleep 
							 | 
						|
								
							 | 
						|
									[tick1] true -> (pm'=0);
							 | 
						|
									[tick1] true -> (pm'=1);
							 | 
						|
									[tick1] true -> (pm'=2);
							 | 
						|
									[tick1] true -> (pm'=3);
							 | 
						|
									[tick1] true -> (pm'=4);
							 | 
						|
									
							 | 
						|
								endmodule
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								//-------------------------------------------------------------------------
							 | 
						|
								
							 | 
						|
								// SERVICE REQUESTER
							 | 
						|
								module SR
							 | 
						|
								
							 | 
						|
									sr : [0..1] init 0;
							 | 
						|
									// 0 idle
							 | 
						|
									// 1 1req
							 | 
						|
									
							 | 
						|
									[tick2] sr=0 -> 0.898: (sr'=0) + 0.102: (sr'=1);
							 | 
						|
									[tick2] sr=1 -> 0.454: (sr'=0) + 0.546: (sr'=1);
							 | 
						|
								
							 | 
						|
								endmodule
							 | 
						|
								
							 | 
						|
								//-------------------------------------------------------------------------
							 | 
						|
								
							 | 
						|
								// SERVICE PROVIDER
							 | 
						|
								
							 | 
						|
								module SP 
							 | 
						|
								
							 | 
						|
									sp : [0..10] init 9;
							 | 
						|
									// 0 active
							 | 
						|
									// 1 idle
							 | 
						|
									// 2 active_idlelp
							 | 
						|
									// 3 idlelp
							 | 
						|
									// 4 idlelp_active
							 | 
						|
									// 5 active_stby
							 | 
						|
									// 6 stby
							 | 
						|
									// 7 stby_active
							 | 
						|
								    // 8 active_sleep
							 | 
						|
									// 9 sleep
							 | 
						|
									// 10 sleep_active
							 | 
						|
									
							 | 
						|
									// states where PM has no control (transient states)
							 | 
						|
									[tick2] sp=2  ->   0.75   : (sp'=2) + 0.25   : (sp'=3);   // active_idlelp
							 | 
						|
									[tick2] sp=4  ->   0.25   : (sp'=0) + 0.75   : (sp'=4);  // idlelp_active
							 | 
						|
									[tick2] sp=5  ->   0.995  : (sp'=5) + 0.005  : (sp'=6);  // active_stby
							 | 
						|
									[tick2] sp=7  ->   0.005  : (sp'=0) + 0.995  : (sp'=7);  // stby_active
							 | 
						|
									[tick2] sp=8  ->   0.9983 : (sp'=8) + 0.0017 : (sp'=9);  // active_sleep
							 | 
						|
									[tick2] sp=10 ->   0.0017 : (sp'=0) + 0.9983 : (sp'=10); // sleep_active
							 | 
						|
								
							 | 
						|
									// states where PM has control
							 | 
						|
									// goto_active
							 | 
						|
									[tick2] sp=0 & pm=0 -> (sp'=0); // active
							 | 
						|
									[tick2] sp=1 & pm=0 -> (sp'=0); // idle
							 | 
						|
									[tick2] sp=3 & pm=0 -> (sp'=4); // idlelp
							 | 
						|
									[tick2] sp=6 & pm=0 -> (sp'=7); // stby
							 | 
						|
									[tick2] sp=9 & pm=0 -> (sp'=10); // sleep
							 | 
						|
									// goto_idle
							 | 
						|
									[tick2] sp=0 & pm=1 -> (sp'=1); // active
							 | 
						|
									[tick2] sp=1 & pm=1 -> (sp'=1); // idle
							 | 
						|
									[tick2] sp=3 & pm=1 -> (sp'=3); // idlelp
							 | 
						|
									[tick2] sp=6 & pm=1 -> (sp'=6); // stby
							 | 
						|
									[tick2] sp=9 & pm=1 -> (sp'=9); // sleep
							 | 
						|
									// goto_idlelp
							 | 
						|
									[tick2] sp=0 & pm=2 -> (sp'=2); // active
							 | 
						|
									[tick2] sp=1 & pm=2 -> (sp'=2); // idle
							 | 
						|
									[tick2] sp=3 & pm=2 -> (sp'=3); // idlelp
							 | 
						|
									[tick2] sp=6 & pm=2 -> (sp'=6); // stby
							 | 
						|
									[tick2] sp=9 & pm=2 -> (sp'=9); // sleep
							 | 
						|
									// goto_stby
							 | 
						|
									[tick2] sp=0 & pm=3 -> (sp'=5); // active
							 | 
						|
									[tick2] sp=1 & pm=3 -> (sp'=5); // idle
							 | 
						|
									[tick2] sp=3 & pm=3 -> (sp'=5); // idlelp
							 | 
						|
									[tick2] sp=6 & pm=3 -> (sp'=6); // stby
							 | 
						|
									[tick2] sp=9 & pm=3 -> (sp'=9); // sleep
							 | 
						|
									// goto_sleep
							 | 
						|
									[tick2] sp=0 & pm=4 -> (sp'=8); // active
							 | 
						|
									[tick2] sp=1 & pm=4 -> (sp'=8); // idle
							 | 
						|
									[tick2] sp=3 & pm=4 -> (sp'=8); // idlelp
							 | 
						|
									[tick2] sp=6 & pm=4 -> (sp'=8); // stby
							 | 
						|
									[tick2] sp=9 & pm=4 -> (sp'=9); // sleep
							 | 
						|
									  
							 | 
						|
								endmodule
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								//-------------------------------------------------------------------------
							 | 
						|
								
							 | 
						|
								// SQ
							 | 
						|
								module SQ
							 | 
						|
								
							 | 
						|
									q : [0..QMAX] init 0;
							 | 
						|
									
							 | 
						|
									// serve if busy
							 | 
						|
									[tick2] sr=0 & sp=0 -> (q'=max(q-1,0));
							 | 
						|
									[tick2] sr=1 & sp=0 -> (q'=q);
							 | 
						|
									
							 | 
						|
									// otherwise do nothing
							 | 
						|
									[tick2] sr=0 & sp>0 -> (q'=q);
							 | 
						|
									[tick2] sr=1 & sp>0 -> (q'=min(q+1,QMAX));
							 | 
						|
								
							 | 
						|
								endmodule
							 | 
						|
								
							 | 
						|
								//-------------------------------------------------------------------------
							 | 
						|
								//rewards "time"
							 | 
						|
								//	[tick2] bat=1 : 1;
							 | 
						|
								//endrewards
							 | 
						|
								
							 | 
						|
								rewards "power"
							 | 
						|
									[tick2] sp=0  & c=1  : 2.5;
							 | 
						|
									[tick2] sp=1  & c=1  : 1.5;
							 | 
						|
									[tick2] sp=2  & c=1  : 2.5;
							 | 
						|
									[tick2] sp=3  & c=1  : 0.8;
							 | 
						|
									[tick2] sp=4  & c=1  : 2.5;
							 | 
						|
									[tick2] sp=5  & c=1  : 2.5;
							 | 
						|
									[tick2] sp=6  & c=1  : 0.3;
							 | 
						|
									[tick2] sp=7  & c=1  : 2.5;
							 | 
						|
									[tick2] sp=8  & c=1  : 2.5;
							 | 
						|
									[tick2] sp=9  & c=1  : 0.1;
							 | 
						|
									[tick2] sp=10 & c=1  : 2.5;
							 | 
						|
								endrewards
							 | 
						|
								
							 | 
						|
								// is an instantaneous property but I suppose we can look at average size
							 | 
						|
								// i.e. divide by the expected number of time steps
							 | 
						|
								rewards "queue"
							 | 
						|
									[tick2] c=1  : q;
							 | 
						|
								endrewards
							 | 
						|
								
							 | 
						|
								rewards "lost"
							 | 
						|
									[tick2] sr=1 & sp>0 & q=2  : 1;
							 | 
						|
								endrewards
							 |