defined the user-interface for the memory mapped registers
[pinmux.git] / src / pinmux_generator.py
index 55795c9dba586002c3fd70ce41d022bb372ddf97..f52f8037a8d6a6459133ee10fa474dcd0d1882fc 100644 (file)
@@ -33,8 +33,7 @@ if not os.path.exists("bsv_src"):
 
 bsv_file = open("./bsv_src/pinmux.bsv", "w")
 
-
-header = '''
+copyright = '''
 /*
    This BSV file has been generated by the PinMux tool available at:
    https://bitbucket.org/casl/pinmux.
@@ -42,6 +41,8 @@ header = '''
    Authors: Neel Gala, Luke
    Date of generation: ''' + time.strftime("%c") + '''
 */
+'''
+header = copyright+'''
 package pinmux;
 
    typedef struct{
@@ -214,16 +215,74 @@ print("BSV file successfully generated: bsv_src/pinmux.bsv")
 # ======================================================================
 bsv_file.close()
 
-bsv_file = open('bsv_src/PinTop.bsv','w')
-bsv_file.write('''
+bsv_file = open('bsv_src/PinTop.bsv', 'w')
+bsv_file.write(copyright+'''
 package PinTop;
     import pinmux::*;
     interface Ifc_PintTop;
+        method ActionValue#(Bool) write(Bit#({0}) addr, Bit#({1}) data);
+        method Tuple2#(Bool,Bit#({1})) read(Bit#({0}) addr);
         interface PeripheralSide peripheral_side;
     endinterface
 
     module mkPinTop(Ifc_PintTop);
+        // instantiate the pin-mux module here
         Ifc_pinmux pinmux <-mkpinmux;
+
+        // declare the registers which will be used to mux the IOs
+'''.format(ADDR_WIDTH, DATA_WIDTH))
+
+for cell in muxed_cells:
+    bsv_file.write('''
+        Reg#(Bit#({0})) rg_muxio_{1} <-mkReg(0);'''.format(
+        int(math.log(len(cell) - 1, 2)), cell[0]))
+
+bsv_file.write('''
+        // rule to connect the registers to the selection lines of the
+        // pin-mux module
+        rule connect_selection_registers;''')
+
+for cell in muxed_cells:
+    bsv_file.write('''
+          pinmux.mux_lines.cell{0}_mux(rg_muxio_{0});'''.format(cell[0]))
+
+bsv_file.write('''
+        endrule
+        // method definitions for the write user interface
+        method ActionValue#(Bool) write(Bit#({2}) addr, Bit#({3}) data);
+          Bool err=False;
+          case (addr[{0}:{1}])'''.format(upper_offset, lower_offset,
+                                         ADDR_WIDTH, DATA_WIDTH))
+index = 0
+for cell in muxed_cells:
+    bsv_file.write('''
+            {0}: rg_muxio_{1}<=truncate(data);'''.format(index, cell[0]))
+    index = index + 1
+
+bsv_file.write('''
+            default: err=True;
+          endcase
+          return err;
+        endmethod''')
+
+bsv_file.write('''
+        // method definitions for the read user interface
+        method Tuple2#(Bool,Bit#({3})) read(Bit#({2}) addr);
+          Bool err=False;
+          Bit#(32) data=0;
+          case (addr[{0}:{1}])'''.format(upper_offset, lower_offset,
+                                         ADDR_WIDTH, DATA_WIDTH))
+index = 0
+for cell in muxed_cells:
+    bsv_file.write('''
+            {0}: data=zeroExtend(rg_muxio_{1});'''.format(index, cell[0]))
+    index = index + 1
+
+bsv_file.write('''
+            default:err=True;
+          endcase
+          return tuple2(err,data);
+        endmethod
         interface peripheral_side=pinmux.peripheral_side;
     endmodule
 endpackage