X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fbsv%2Fperipheral_gen%2Fbase.py;h=eb9b896872f5ada6ff0f45991bbf15df57f3e4f0;hb=ad1c3f41a3d2e7becd618e1081fc7b09bb1b5ac8;hp=e6f9a53f84219c9a8513f59dabdea874aa2ce87d;hpb=af003c6988cda83dd677e6ff8ff2b609e1f7312e;p=pinmux.git diff --git a/src/bsv/peripheral_gen/base.py b/src/bsv/peripheral_gen/base.py index e6f9a53..eb9b896 100644 --- a/src/bsv/peripheral_gen/base.py +++ b/src/bsv/peripheral_gen/base.py @@ -149,7 +149,7 @@ class PBase(MMapConfig): if cfgstart: start = cfgstart end = start + offs - 1 - offs = 0 # don't do contiguous addressing + offs = 0 # don't do contiguous addressing else: end = start + offs - 1 bname = self.axibase(name, ifacenum, idx) @@ -347,9 +347,8 @@ else""" else: spc = ck ck = self.get_clk_spc(ctype) - template = """\ -Ifc_sync#({0}) {1}_sync <-mksyncconnection( - {2}, {3});""" + template = "Ifc_sync#({0}) {1}_sync <-mksyncconnection(\n" + \ + " {2}, {3});" for p in self.peripheral.pinspecs: typ = p['type'] pname = p['name'] @@ -390,9 +389,8 @@ Ifc_sync#({0}) {1}_sync <-mksyncconnection( else: spc = ck ck = self.get_clk_spc(ctype) - template = """\ -Ifc_sync#({0}) {1}_sync <-mksyncconnection( - {2}, {3});""" + template = "Ifc_sync#({0}) {1}_sync <-mksyncconnection(\n" + \ + " {2}, {3});""" n_ = "{0}{1}".format(name, count) n_ = '{0}_{1}'.format(n_, pname) @@ -433,11 +431,9 @@ Ifc_sync#({0}) {1}_sync <-mksyncconnection( con = con.format(count, aname) return txt.format(con, aname, fabricname) - def mk_master_connection(self, count, fabricname, typ, name=None): + def mk_master_connection(self, name, count, fabricname, typ): if not self.has_axi_master(): return '' - if name is None: - name = self.name print "PBase mk_master_conn", self.name, count aname = self.axi_master_name(name, count, typ) ret = [] @@ -449,20 +445,17 @@ Ifc_sync#({0}) {1}_sync <-mksyncconnection( fabricname)) return '\n'.join(ret) - def mk_connection(self, count, fabricname, typ, name=None): - if name is None: - name = self.name - print "PBase mk_conn", self.name, count + def mk_connection(self, name, count, fabricname, typ, name_override=None): + if name_override: # needed for GPIO + name = name_override + print "PBase mk_conn", name, count ret = [] connections = self._mk_connection(name, count) if not isinstance(connections, list): connections = [connections] for (idx, con) in enumerate(connections): - if len(connections) == 1: - idx = "" - else: - idx = "_%d_" % idx - aname = self.axi_slave_name(idx, name, count, typ) + cfg = self.get_mmap_cfg_name(idx) + aname = self.axi_slave_name(cfg, name, count, typ) ret.append(self.__mk_connection(con, aname, count, fabricname)) return '\n'.join(ret) @@ -657,10 +650,34 @@ class PeripheralIface(object): return self.slow.axi_addr_map(self.ifacename, count) +class CallIfaceFn(object): + def __init__(self, ifaces, kls, indent): + self.ifaces = ifaces + self.kls = kls + self.indent = indent + + def __call__(self, ifaces, *args): + ret = [] + for (name, count) in self.ifaces.ifacecount: + print "CallIfaceFn", self.kls, self.ifaces + print "CallIfaceFn args", name, count, args + ret += list(self.kls(self.ifaces, name, count, *args)) + return '\n'.join(li(list(filter(None, ret)), self.indent)) + + class PeripheralInterfaces(object): def __init__(self): self.fastbusmode = False + for (fname, kls, indent) in ( + ('_mk_connection', MkConnection, 8), + ('_mk_pincon', MkPinCon, 4), + ('_mk_clk_con', MkClkCon, 8), + ('mk_ext_ifacedef', MkExtIface, 8), + ): + fn = CallIfaceFn(self, kls, indent) + setattr(self, fname, types.MethodType(fn, self)) + def slowimport(self, *args): ret = [] for (name, count) in self.ifacecount: @@ -672,8 +689,6 @@ class PeripheralInterfaces(object): ret = [] for (name, count) in self.ifacecount: for i in range(count): - iname = self.data[name].iname().format(i) - print "extfast", iname, self.is_on_fastbus(name, i) if self.is_on_fastbus(name, i): continue ret.append(self.data[name].extfastifinstance(name, i)) @@ -683,7 +698,6 @@ class PeripheralInterfaces(object): ret = [] for (name, count) in self.ifacecount: for i in range(count): - iname = self.data[name].iname().format(i) ret.append(self.data[name].extifinstance2(name, i)) return '\n'.join(li(list(filter(None, ret)), 8)) @@ -691,7 +705,6 @@ class PeripheralInterfaces(object): ret = [] for (name, count) in self.ifacecount: for i in range(count): - iname = self.data[name].iname().format(i) if not self.is_on_fastbus(name, i): continue ret.append(self.data[name].extifinstance(name, i)) @@ -829,29 +842,14 @@ class PeripheralInterfaces(object): ret.append(x.format(suffix)) return '\n'.join(li(list(filter(None, ret)), 8)) - def _mk_connection(self, fabric, typ, indent, master, *args): - ret = [] - for (name, count) in self.ifacecount: - for i in range(count): - if self.is_on_fastbus(name, i): - continue - if master: - txt = self.data[name].mk_master_connection(i, fabric, typ) - else: - txt = self.data[name].mk_connection(i, fabric, typ) - if name == 'gpioa': - print "txt", txt - ret.append(txt) - return '\n'.join(li(list(filter(None, ret)), indent)) - def mk_master_connection(self, *args): - return self._mk_connection("fabric", "fast", 8, True, *args) + return self._mk_connection("fabric", "fast", True, *args) def mk_fast_connection(self, *args): - return self._mk_connection("fabric", "fast", 12, False, *args) + return self._mk_connection("fabric", "fast", False, *args) def mk_connection(self, *args): - return self._mk_connection("slow_fabric", "", 8, False, *args) + return self._mk_connection("slow_fabric", "", False, *args) def mk_cellconn(self): ret = [] @@ -860,7 +858,7 @@ class PeripheralInterfaces(object): for i in range(count): if self.is_on_fastbus(name, i): continue - res = self.data[name].mk_cellconn(cellcount, name, i) + res = self.data[name].mk_cellconn(name, i, cellcount) if not res: continue (txt, cellcount) = res @@ -874,16 +872,6 @@ class PeripheralInterfaces(object): def mk_fast_pincon(self): return self._mk_pincon("fast") - def _mk_pincon(self, typ): - ret = [] - for (name, count) in self.ifacecount: - for i in range(count): - if self.is_on_fastbus(name, i): - continue - txt = self.data[name]._mk_pincon(name, i, typ) - ret.append(txt) - return '\n'.join(li(list(filter(None, ret)), 4)) - def mk_dma_irq(self): ret = [] sync = [] @@ -931,16 +919,6 @@ class PeripheralInterfaces(object): def num_dmachannels(self): return "`define NUM_DMACHANNELS {0}".format(self.dma_count) - def mk_ext_ifacedef(self): - ret = [] - for (name, count) in self.ifacecount: - for i in range(count): - if self.is_on_fastbus(name, i): - continue - txt = self.data[name].mk_ext_ifacedef(name, i) - ret.append(txt) - return '\n'.join(li(list(filter(None, ret)), 8)) - def mk_plic(self): ret = [] irq_offs = 8 # XXX: DMA scovers 0-7? @@ -965,16 +943,6 @@ class PeripheralInterfaces(object): def mk_slowclk_con(self): return self._mk_clk_con("slow") - def _mk_clk_con(self, ctype): - ret = [] - for (name, count) in self.ifacecount: - for i in range(count): - if self.is_on_fastbus(name, i): - continue - txt = self.data[name]._mk_clk_con(name, i, ctype) - ret.append(txt) - return '\n'.join(li(list(filter(None, ret)), 8)) - def is_on_fastbus(self, name, i): #print "fastbus mode", self.fastbusmode, name, i iname = self.data[name].iname().format(i) @@ -983,11 +951,95 @@ class PeripheralInterfaces(object): return iname in self.fastbus +class IfaceIter(object): + + def __init__(self, name, count, *args): + self.i = 0 + self.name = name + self.maxcount = count + self.args = args + + def __iter__(self): + return self + + def __next__(self): + while True: + if self.i >= self.maxcount: + raise StopIteration + if self.check(self.name, self.i): + #print "iter", self.item + #print "item args", self.args + res = self.item(self.name, self.i, *self.args) + if res: + self.i += 1 + return res + self.i += 1 + + def next(self): + return self.__next__() + + +class MkConnection(IfaceIter): + + def __init__(self, ifaces, name, count, *args): + self.ifaces = ifaces + IfaceIter.__init__(self, name, count, *args) + + def check(self, name, i): + return not self.ifaces.is_on_fastbus(name, i) + + def item(self, name, i, fabric, typ, master): + if master: + return self.ifaces.data[name].mk_master_connection(name, + i, fabric, typ) + return self.ifaces.data[name].mk_connection(name, i, fabric, typ) + + +class MkExtIface(IfaceIter): + + def __init__(self, ifaces, name, count, *args): + self.ifaces = ifaces + IfaceIter.__init__(self, name, count, *args) + + def check(self, name, i): + return not self.ifaces.is_on_fastbus(name, i) + + def item(self, name, i): + return self.ifaces.data[name].mk_ext_ifacedef(name, i) + + +class MkPinCon(IfaceIter): + + def __init__(self, ifaces, name, count, *args): + self.ifaces = ifaces + IfaceIter.__init__(self, name, count, *args) + + def check(self, name, i): + return not self.ifaces.is_on_fastbus(name, i) + + def item(self, name, i, typ): + return self.ifaces.data[name]._mk_pincon(name, i, typ) + + +class MkClkCon(IfaceIter): + + def __init__(self, ifaces, name, count, *args): + self.ifaces = ifaces + IfaceIter.__init__(self, name, count, *args) + + def check(self, name, i): + return not self.ifaces.is_on_fastbus(name, i) + + def item(self, name, i, ctype): + return self.ifaces.data[name]._mk_clk_con(name, i, ctype) + + class PFactory(object): def getcls(self, name): from uart import uart from quart import quart from sdmmc import sdmmc + from emmc import emmc from pwm import pwm from eint import eint from rs232 import rs232 @@ -1013,6 +1065,7 @@ class PFactory(object): 'pwm': pwm, 'eint': eint, 'mmc': sdmmc, + 'emmc': emmc, 'jtag': jtag, 'lcd': rgbttl, 'fb': flexbus,