mirror of
				https://github.com/KevinMidboe/linguist.git
				synced 2025-10-29 17:50:22 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			168 lines
		
	
	
		
			6.0 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			168 lines
		
	
	
		
			6.0 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
package TL;
 | 
						|
 | 
						|
interface TL;
 | 
						|
   method Action ped_button_push();
 | 
						|
 | 
						|
         (* always_enabled *)
 | 
						|
         method Action set_car_state_N(Bool x);
 | 
						|
         (* always_enabled *)
 | 
						|
         method Action set_car_state_S(Bool x);
 | 
						|
         (* always_enabled *)
 | 
						|
         method Action set_car_state_E(Bool x);
 | 
						|
         (* always_enabled *)
 | 
						|
         method Action set_car_state_W(Bool x);
 | 
						|
 | 
						|
   method Bool lampRedNS();
 | 
						|
   method Bool lampAmberNS();
 | 
						|
   method Bool lampGreenNS();
 | 
						|
 | 
						|
   method Bool lampRedE();
 | 
						|
   method Bool lampAmberE();
 | 
						|
   method Bool lampGreenE();
 | 
						|
 | 
						|
   method Bool lampRedW();
 | 
						|
   method Bool lampAmberW();
 | 
						|
   method Bool lampGreenW();
 | 
						|
 | 
						|
   method Bool lampRedPed();
 | 
						|
   method Bool lampAmberPed();
 | 
						|
   method Bool lampGreenPed();
 | 
						|
endinterface: TL
 | 
						|
 | 
						|
typedef enum {
 | 
						|
         AllRed,
 | 
						|
         GreenNS, AmberNS,
 | 
						|
         GreenE, AmberE,
 | 
						|
         GreenW, AmberW,
 | 
						|
         GreenPed, AmberPed} TLstates deriving (Eq, Bits);
 | 
						|
 | 
						|
typedef UInt#(5) Time32;
 | 
						|
typedef UInt#(20) CtrSize;
 | 
						|
 | 
						|
(* synthesize *)
 | 
						|
module sysTL(TL);
 | 
						|
   Time32 allRedDelay = 2;
 | 
						|
   Time32 amberDelay = 4;
 | 
						|
   Time32 nsGreenDelay = 20;
 | 
						|
   Time32 ewGreenDelay = 10;
 | 
						|
   Time32 pedGreenDelay = 10;
 | 
						|
   Time32 pedAmberDelay = 6;
 | 
						|
 | 
						|
   CtrSize clocks_per_sec = 100;
 | 
						|
 | 
						|
   Reg#(TLstates) state <- mkReg(AllRed);
 | 
						|
   Reg#(TLstates) next_green <- mkReg(GreenNS);
 | 
						|
   Reg#(Time32) secs <- mkReg(0);
 | 
						|
   Reg#(Bool) ped_button_pushed <- mkReg(False);
 | 
						|
         Reg#(Bool) car_present_N <- mkReg(True);
 | 
						|
   Reg#(Bool) car_present_S <- mkReg(True);
 | 
						|
   Reg#(Bool) car_present_E <- mkReg(True);
 | 
						|
   Reg#(Bool) car_present_W <- mkReg(True);
 | 
						|
         Bool car_present_NS = car_present_N || car_present_S;
 | 
						|
   Reg#(CtrSize) cycle_ctr <- mkReg(0);
 | 
						|
 | 
						|
   rule dec_cycle_ctr (cycle_ctr != 0);
 | 
						|
      cycle_ctr <= cycle_ctr - 1;
 | 
						|
   endrule
 | 
						|
 | 
						|
   Rules low_priority_rule = (rules
 | 
						|
                        rule inc_sec (cycle_ctr == 0);
 | 
						|
                                 secs <= secs + 1;
 | 
						|
                                 cycle_ctr <= clocks_per_sec;
 | 
						|
                        endrule endrules);
 | 
						|
 | 
						|
   function Action next_state(TLstates ns);
 | 
						|
         action
 | 
						|
                                 state <= ns;
 | 
						|
                                 secs <= 0;
 | 
						|
      endaction
 | 
						|
   endfunction: next_state
 | 
						|
 | 
						|
   function TLstates green_seq(TLstates x);
 | 
						|
      case (x)
 | 
						|
                                 GreenNS: return (GreenE);
 | 
						|
                                 GreenE:  return (GreenW);
 | 
						|
                                 GreenW:  return (GreenNS);
 | 
						|
      endcase
 | 
						|
   endfunction
 | 
						|
 | 
						|
   function Bool car_present(TLstates x);
 | 
						|
      case (x)
 | 
						|
                                 GreenNS: return (car_present_NS);
 | 
						|
                                 GreenE:  return (car_present_E);
 | 
						|
                                 GreenW:  return (car_present_W);
 | 
						|
      endcase
 | 
						|
   endfunction
 | 
						|
 | 
						|
   function Rules make_from_green_rule(TLstates green_state, Time32 delay, Bool car_is_present, TLstates ns);
 | 
						|
                        return (rules
 | 
						|
                                 rule from_green (state == green_state && (secs >= delay || !car_is_present));
 | 
						|
                                                next_state(ns);
 | 
						|
                                 endrule endrules);
 | 
						|
   endfunction: make_from_green_rule
 | 
						|
 | 
						|
   function Rules make_from_amber_rule(TLstates amber_state, TLstates ng);
 | 
						|
      return (rules
 | 
						|
                                 rule from_amber (state == amber_state && secs >= amberDelay);
 | 
						|
                                                next_state(AllRed);
 | 
						|
                                                next_green <= ng;
 | 
						|
                                 endrule endrules);
 | 
						|
   endfunction: make_from_amber_rule
 | 
						|
 | 
						|
   Rules hprs[7];
 | 
						|
 | 
						|
   hprs[1] = make_from_green_rule(GreenNS, nsGreenDelay, car_present_NS, AmberNS);
 | 
						|
   hprs[2] = make_from_amber_rule(AmberNS, GreenE);
 | 
						|
   hprs[3] = make_from_green_rule(GreenE, ewGreenDelay, car_present_E, AmberE);
 | 
						|
   hprs[4] = make_from_amber_rule(AmberE, GreenW);
 | 
						|
   hprs[5] = make_from_green_rule(GreenW, ewGreenDelay, car_present_W, AmberW);
 | 
						|
   hprs[6] = make_from_amber_rule(AmberW, GreenNS);
 | 
						|
 | 
						|
         hprs[0] = (rules
 | 
						|
                        rule fromAllRed (state == AllRed && secs >= allRedDelay);
 | 
						|
                                 if (ped_button_pushed) action
 | 
						|
                                                ped_button_pushed <= False;
 | 
						|
                                                next_state(GreenPed);
 | 
						|
                                 endaction else if (car_present(next_green))
 | 
						|
                              next_state(next_green);
 | 
						|
                           else if (car_present(green_seq(next_green)))
 | 
						|
                                    next_state(green_seq(next_green));
 | 
						|
         else if (car_present(green_seq(green_seq(next_green))))
 | 
						|
                                    next_state(green_seq(green_seq(next_green)));
 | 
						|
         else
 | 
						|
                                    noAction;
 | 
						|
                        endrule: fromAllRed endrules);
 | 
						|
 | 
						|
         Rules high_priority_rules = hprs[0];
 | 
						|
   for (Integer i = 1; i<7; i=i+1)
 | 
						|
      high_priority_rules = rJoin(hprs[i], high_priority_rules);
 | 
						|
 | 
						|
         addRules(preempts(high_priority_rules, low_priority_rule));
 | 
						|
 | 
						|
   method Action ped_button_push();
 | 
						|
      ped_button_pushed <= True;
 | 
						|
   endmethod: ped_button_push
 | 
						|
 | 
						|
   method Action set_car_state_N(b) ; car_present_N <= b; endmethod
 | 
						|
   method Action set_car_state_S(b) ; car_present_S <= b; endmethod
 | 
						|
   method Action set_car_state_E(b) ; car_present_E <= b; endmethod
 | 
						|
   method Action set_car_state_W(b) ; car_present_W <= b; endmethod
 | 
						|
 | 
						|
   method lampRedNS() = (!(state == GreenNS || state == AmberNS));
 | 
						|
   method lampAmberNS() = (state == AmberNS);
 | 
						|
   method lampGreenNS() = (state == GreenNS);
 | 
						|
   method lampRedE() = (!(state == GreenE || state == AmberE));
 | 
						|
   method lampAmberE() = (state == AmberE);
 | 
						|
   method lampGreenE() = (state == GreenE);
 | 
						|
   method lampRedW() = (!(state == GreenW || state == AmberW));
 | 
						|
   method lampAmberW() = (state == AmberW);
 | 
						|
   method lampGreenW() = (state == GreenW);
 | 
						|
 | 
						|
   method lampRedPed() = (!(state == GreenPed || state == AmberPed));
 | 
						|
   method lampAmberPed() = (state == AmberPed);
 | 
						|
   method lampGreenPed() = (state == GreenPed);
 | 
						|
 | 
						|
endmodule: sysTL
 | 
						|
 | 
						|
endpackage: TL
 |