mirror of
				https://github.com/KevinMidboe/linguist.git
				synced 2025-10-29 17:50:22 +00:00 
			
		
		
		
	Add Bluespec examples
This commit is contained in:
		
							
								
								
									
										167
									
								
								samples/Bluespec/TL.bsv
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										167
									
								
								samples/Bluespec/TL.bsv
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,167 @@ | ||||
| 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 | ||||
							
								
								
									
										109
									
								
								samples/Bluespec/TbTL.bsv
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										109
									
								
								samples/Bluespec/TbTL.bsv
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,109 @@ | ||||
| package TbTL; | ||||
|  | ||||
| import TL::*; | ||||
|  | ||||
| interface Lamp; | ||||
|    method Bool changed; | ||||
|    method Action show_offs; | ||||
|    method Action show_ons; | ||||
|    method Action reset; | ||||
| endinterface | ||||
|  | ||||
| module mkLamp#(String name, Bool lamp)(Lamp); | ||||
|    Reg#(Bool) prev <- mkReg(False); | ||||
|  | ||||
|    method changed = (prev != lamp); | ||||
|  | ||||
|    method Action show_offs; | ||||
|       if (prev && !lamp) | ||||
|       $write (name + " off, "); | ||||
|    endmethod | ||||
|  | ||||
|    method Action show_ons; | ||||
|       if (!prev && lamp) | ||||
|       $write (name + " on, "); | ||||
|    endmethod | ||||
|  | ||||
|    method Action reset; | ||||
|       prev <= lamp; | ||||
|    endmethod | ||||
| endmodule | ||||
|  | ||||
|  | ||||
| (* synthesize *) | ||||
| module mkTest(); | ||||
|    let dut <- sysTL; | ||||
|  | ||||
|    Reg#(Bit#(16)) ctr <- mkReg(0); | ||||
|  | ||||
|    Reg#(Bool) carN <- mkReg(False); | ||||
|    Reg#(Bool) carS <- mkReg(False); | ||||
|    Reg#(Bool) carE <- mkReg(False); | ||||
|    Reg#(Bool) carW <- mkReg(False); | ||||
|  | ||||
|    Lamp lamps[12]; | ||||
|  | ||||
|    lamps[0] <- mkLamp("0:  NS  red  ", dut.lampRedNS); | ||||
|    lamps[1] <- mkLamp("1:  NS  amber", dut.lampAmberNS); | ||||
|    lamps[2] <- mkLamp("2:  NS  green", dut.lampGreenNS); | ||||
|    lamps[3] <- mkLamp("3:  E   red  ", dut.lampRedE); | ||||
|    lamps[4] <- mkLamp("4:  E   amber", dut.lampAmberE); | ||||
|    lamps[5] <- mkLamp("5:  E   green", dut.lampGreenE); | ||||
|    lamps[6] <- mkLamp("6:  W   red  ", dut.lampRedW); | ||||
|    lamps[7] <- mkLamp("7:  W   amber", dut.lampAmberW); | ||||
|    lamps[8] <- mkLamp("8:  W   green", dut.lampGreenW); | ||||
|  | ||||
|    lamps[9]  <- mkLamp("9:  Ped red  ", dut.lampRedPed); | ||||
|    lamps[10] <- mkLamp("10: Ped amber", dut.lampAmberPed); | ||||
|    lamps[11] <- mkLamp("11: Ped green", dut.lampGreenPed); | ||||
|  | ||||
|    rule start (ctr == 0); | ||||
|       $dumpvars; | ||||
|    endrule | ||||
|  | ||||
|    rule detect_cars; | ||||
|       dut.set_car_state_N(carN); | ||||
|       dut.set_car_state_S(carS); | ||||
|       dut.set_car_state_E(carE); | ||||
|       dut.set_car_state_W(carW); | ||||
|    endrule | ||||
|  | ||||
|    rule go; | ||||
|       ctr <= ctr + 1; | ||||
|       if (ctr == 5000) carN <= True; | ||||
|       if (ctr == 6500) carN <= False; | ||||
|       if (ctr == 12_000) dut.ped_button_push; | ||||
|    endrule | ||||
|  | ||||
|    rule stop (ctr > 32768); | ||||
|       $display("TESTS FINISHED"); | ||||
|       $finish(0); | ||||
|    endrule | ||||
|  | ||||
|    function do_offs(l) = l.show_offs; | ||||
|       function do_ons(l) = l.show_ons; | ||||
|       function do_reset(l) = l.reset; | ||||
|  | ||||
|       function do_it(f); | ||||
|          action | ||||
|          for (Integer i=0; i<12; i=i+1) | ||||
|             f(lamps[i]); | ||||
|          endaction | ||||
|       endfunction | ||||
|  | ||||
|       function any_changes(); | ||||
|          Bool b = False; | ||||
|          for (Integer i=0; i<12; i=i+1) | ||||
|              b = b || lamps[i].changed; | ||||
|          return b; | ||||
|       endfunction | ||||
|  | ||||
|       rule show (any_changes()); | ||||
|       do_it(do_offs); | ||||
|       do_it(do_ons); | ||||
|       do_it(do_reset); | ||||
|       $display("(at time %d)", $time); | ||||
|    endrule | ||||
| endmodule | ||||
|  | ||||
| endpackage | ||||
		Reference in New Issue
	
	Block a user