defined the user-interface for the memory mapped registers
authorNeel <neelgala@gmail.com>
Mon, 19 Mar 2018 10:36:56 +0000 (16:06 +0530)
committerNeel <neelgala@gmail.com>
Mon, 19 Mar 2018 10:36:56 +0000 (16:06 +0530)
Support is provided to address registers using 8-bit, 16-bit, 32-bit or 64-bit addressing scheme.
Need to add support for a compressed scheme as well.

src/parse.py
src/pinmux_generator.py

index a9913ae972b385c62c4080f06e1582c438774a6e..babf31d469c8d70d6ed86ee7fe1cab528911ea92 100644 (file)
@@ -1,3 +1,4 @@
+import math
 # == Parameters == #
 N_MUX = 1              # number of selection lines for the mux per io
 N_IO = 0
@@ -7,8 +8,25 @@ N_SPI = 1
 N_TWI = 2
 N_SD = 2
 N_JTAG = 2
+Addressing = 'WORD'
+ADDR_WIDTH = 32
+DATA_WIDTH = 32
 # ================ #
 
+# Generating the number of bits for memory map #
+lower_offset = 0
+if(Addressing == 'BYTE'):
+    lower_offset = 0
+elif(Addressing == 'HWORD'):
+    lower_offset = 1
+elif(Addressing == 'WORD'):
+    lower_offset = 2
+elif(Addressing == 'DWORD'):
+    lower_offset = 3
+else:
+    print('ERROR: Addressing should be one of: BYTE, HWORD, WORD, DWORD')
+    exit(1)
+
 
 def missing_numbers(num_list):
     original_list = [x for x in range(num_list[0], num_list[-1] + 1)]
@@ -31,6 +49,8 @@ for lineno, line in enumerate(pinmapfile):
         if(len(line1) > 2):
             muxed_cells.append(line1)
 pinnumbers = sorted(pinnumbers)
+
+upper_offset = lower_offset + int(math.log(len(muxed_cells), 2))
 # ============================================= #
 # ======= Multiple checks to see if the user has not screwed ======#
 missing_pins = missing_numbers(pinnumbers)
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