X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fbsv%2Fperipheral_gen.py;h=5326144bcae74927cbc0ae2fb704eafcdf5d5e38;hb=4547ec9c0795c5badeea607ca0dfe8bf083cbb29;hp=693a79215fc4d31fd5cc4781c13e1c56171d2b9a;hpb=2fbf35246dd64e87a26d28ee9818a772baeca4b1;p=pinmux.git diff --git a/src/bsv/peripheral_gen.py b/src/bsv/peripheral_gen.py index 693a792..5326144 100644 --- a/src/bsv/peripheral_gen.py +++ b/src/bsv/peripheral_gen.py @@ -9,6 +9,9 @@ class PBase(object): def slowifdeclmux(self): return '' + def slowifinstance(self): + return '' + def slowimport(self): return '' @@ -72,10 +75,10 @@ class PBase(object): if typ == 'out' or typ == 'inout': ret.append(" rule con_%s%d_%s_out;" % (name, count, pname)) fname = self.pinname_out(pname) - if not n.startswith('gpio'): # XXX EURGH! horrible hack - n_ = "{0}{1}".format(n, count) + if not n.startswith('gpio'): # XXX EURGH! horrible hack + n_ = "{0}{1}".format(n, count) else: - n_ = n + n_ = n if fname: if p.get('outen'): ps_ = ps + '_out' @@ -102,7 +105,9 @@ class PBase(object): " rule con_%s%d_%s_in;" % (name, count, pname)) n_ = "{0}{1}".format(n, count) - ret.append(" {1}.{2}({0});".format(ps_, n_, fname)) + n_ = '{0}.{1}'.format(n_, fname) + n_ = self.ifname_tweak(pname, 'in', n_) + ret.append(" {1}({0});".format(ps_, n_)) ret.append(" endrule") return '\n'.join(ret) @@ -147,6 +152,9 @@ class PBase(object): def pinname_outen(self, pname): return '' + def ifname_tweak(self, pname, typ, txt): + return txt + def pinname_tweak(self, pname, typ, txt): return txt @@ -179,31 +187,51 @@ class uart(PBase): return {'rx': 'coe_rs232.sin'}.get(pname, '') -class qquart(PBase): +class quart(PBase): def slowimport(self): return " import Uart16550 :: *;" def slowifdecl(self): - return " interface RS232_PHY_Ifc uart{0}_coe;\n" + \ - " method Bit#(1) uart{0}_intr;" + return " interface RS232_PHY_Ifc quart{0}_coe;\n" + \ + " method Bit#(1) quart{0}_intr;" def num_axi_regs32(self): return 8 def mkslow_peripheral(self, size=0): - return " Uart16550_AXI4_Lite_Ifc uart{0} <- \n" + \ + return " Uart16550_AXI4_Lite_Ifc quart{0} <- \n" + \ " mkUart16550(clocked_by sp_clock,\n" + \ " reset_by uart_reset, sp_clock, sp_reset);" def _mk_connection(self, name=None, count=0): - return "uart{0}.slave_axi_uart" + return "quart{0}.slave_axi_uart" def pinname_out(self, pname): - return {'tx': 'coe_rs232.sout'}.get(pname, '') + return {'tx' : 'coe_rs232.modem_output_stx', + 'rts': 'coe_rs232.modem_output_rts', + }.get(pname, '') - def pinname_in(self, pname): - return {'rx': 'coe_rs232.sin'}.get(pname, '') + def _pinname_in(self, pname): + return {'rx': 'coe_rs232.modem_input.srx', + 'cts': 'coe_rs232.modem_input.cts' + }.get(pname, '') + + def mk_pincon(self, name, count): + ret = [PBase.mk_pincon(self, name, count)] + size = len(self.peripheral.pinspecs) + ret.append(eint_pincon_template.format(size)) + ret.append(" rule con_%s%d_io_in;" % (name, count)) + ret.append(" {0}{1}.coe_rs232.modem_input(".format(name, count)) + for idx, pname in enumerate(['rx', 'cts']): + sname = self.peripheral.pname(pname).format(count) + ps = "pinmux.peripheral_side.%s" % sname + ret.append(" {0},".format(ps)) + ret.append(" 1'b1,1'b0,1'b1") + ret.append(" );") + ret.append(" endrule") + + return '\n'.join(ret) class rs232(PBase): @@ -278,15 +306,10 @@ class eint(PBase): size = len(self.peripheral.pinspecs) return " `define NUM_EINTS %d" % size - def slowifdeclmux(self): - size = len(self.peripheral.pinspecs) - return " method Action external_int(Bit#(%d) in);" % size - def mkslow_peripheral(self, size=0): size = len(self.peripheral.pinspecs) return " Wire#(Bit#(%d)) wr_interrupt <- mkWire();" % size - def axi_slave_name(self, name, ifacenum): return '' @@ -296,35 +319,27 @@ class eint(PBase): def axi_addr_map(self, name, ifacenum): return '' - def _pinname_out(self, pname): - return {'sda': 'out.sda_out', - 'scl': 'out.scl_out'}.get(pname, '') - - def _pinname_in(self, pname): - return {'sda': 'out.sda_in', - 'scl': 'out.scl_in'}.get(pname, '') - - def _pinname_outen(self, pname): - return {'sda': 'out.sda_out_en', - 'scl': 'out.scl_out_en'}.get(pname, '') + def ifname_tweak(self, pname, typ, txt): + if typ != 'in': + return txt + print "ifnameweak", pname, typ, txt + return "wr_interrupt[{0}] <= ".format(pname) def mk_pincon(self, name, count): + ret = [PBase.mk_pincon(self, name, count)] size = len(self.peripheral.pinspecs) - ret = [] ret.append(eint_pincon_template.format(size)) - - ret.append(" rule con_%s%d_io_out;" % (name, count)) - for idx, p in enumerate(self.peripheral.pinspecs): - pname = p['name'] - sname = self.peripheral.pname(pname).format(count) - ps = "pinmux.peripheral_side.%s_out" % sname - ret.append(" wr_interrupt[{0}] <= {1};".format(idx, ps)) + ret.append(" rule con_%s%d_io_in;" % (name, count)) + ret.append(" wr_interrupt <= ({") for idx, p in enumerate(self.peripheral.pinspecs): pname = p['name'] sname = self.peripheral.pname(pname).format(count) - ps = "pinmux.peripheral_side.%s_out_en" % sname - ret.append(" {0} <= 1'b1;".format(ps)) + ps = "pinmux.peripheral_side.%s" % sname + comma = '' if idx == size - 1 else ',' + ret.append(" {0}{1}".format(ps, comma)) + ret.append(" });") ret.append(" endrule") + return '\n'.join(ret) @@ -339,6 +354,70 @@ eint_pincon_template = '''\ ''' +class jtag(PBase): + + def axi_slave_name(self, name, ifacenum): + return '' + + def axi_slave_idx(self, idx, name, ifacenum): + return ('', 0) + + def axi_addr_map(self, name, ifacenum): + return '' + + def slowifdeclmux(self): + return " method Action jtag_ms (Bit#(1) in);\n" + \ + " method Bit#(1) jtag_di;\n" + \ + " method Action jtag_do (Bit#(1) in);\n" + \ + " method Action jtag_ck (Bit#(1) in);" + + def slowifinstance(self): + return jtag_method_template # bit of a lazy hack this... + +jtag_method_template = """\ + method Action jtag_ms (Bit#(1) in); + pinmux.peripheral_side.jtag_ms(in); + endmethod + method Bit#(1) jtag_di=pinmux.peripheral_side.jtag_di; + method Action jtag_do (Bit#(1) in); + pinmux.peripheral_side.jtag_do(in); + endmethod + method Action jtag_ck (Bit#(1) in); + pinmux.peripheral_side.jtag_ck(in); + endmethod +""" + +class sdmmc(PBase): + + def slowimport(self): + return " import sdcard_dummy :: *;" + + def slowifdecl(self): + return " interface QSPI_out sd{0}_out;\n" + \ + " method Bit#(1) sd{0}_isint;" + + def num_axi_regs32(self): + return 13 + + def mkslow_peripheral(self): + return " Ifc_sdcard_dummy sd{0} <- mksdcard_dummy();" + + def _mk_connection(self, name=None, count=0): + return "sd{0}.slave" + + def pinname_in(self, pname): + return "%s_in" % pname + + def pinname_out(self, pname): + if pname.startswith('d'): + return "%s_out" % pname + return pname + + def pinname_outen(self, pname): + if pname.startswith('d'): + return "%s_outen" % pname + + class spi(PBase): def slowimport(self): @@ -493,13 +572,13 @@ class gpio(PBase): name = name.upper() mname = 'mux' + name[4:] mname = mname.upper() - print "AXIslavenum", name, mname + print "AXIslavenum", name, mname (ret, x) = PBase.axi_slave_idx(self, idx, name, ifacenum) - (ret2, x) = PBase.axi_slave_idx(self, idx+1, mname, ifacenum) + (ret2, x) = PBase.axi_slave_idx(self, idx + 1, mname, ifacenum) return ("%s\n%s" % (ret, ret2), 2) def mkslow_peripheral(self, size=0): - print "gpioslow", self.peripheral, dir(self.peripheral) + print "gpioslow", self.peripheral, dir(self.peripheral) size = len(self.peripheral.pinspecs) return " MUX#(%d) mux{0} <- mkmux();\n" % size + \ " GPIO#(%d) gpio{0} <- mkgpio();" % size @@ -597,7 +676,8 @@ class PeripheralIface(object): if slow: self.slow = slow(ifacename) self.slow.peripheral = self - for fname in ['slowimport', 'slowifdecl', 'slowifdeclmux', + for fname in ['slowimport', + 'slowifinstance', 'slowifdecl', 'slowifdeclmux', 'mkslow_peripheral', 'mk_connection', 'mk_cellconn', 'mk_pincon']: fn = CallFn(self, fname) @@ -638,6 +718,13 @@ class PeripheralInterfaces(object): ret.append(self.data[name].slowimport()) return '\n'.join(list(filter(None, ret))) + def slowifinstance(self, *args): + ret = [] + for (name, count) in self.ifacecount: + #print "slowimport", name, self.data[name].slowimport + ret.append(self.data[name].slowifinstance()) + return '\n'.join(list(filter(None, ret))) + def slowifdeclmux(self, *args): ret = [] for (name, count) in self.ifacecount: @@ -734,10 +821,13 @@ class PFactory(object): for k, v in {'uart': uart, 'rs232': rs232, 'twi': twi, + 'quart': quart, 'qspi': qspi, 'spi': spi, 'pwm': pwm, 'eint': eint, + 'sd': sdmmc, + 'jtag': jtag, 'gpio': gpio }.items(): if name.startswith(k):