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.
Authors: Neel Gala, Luke
Date of generation: ''' + time.strftime("%c") + '''
*/
+'''
+header = copyright+'''
package pinmux;
typedef struct{
# ======================================================================
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