X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fbsv%2Fperipheral_gen%2Fbase.py;h=53b5360b4de126901432f7683add55037ffe7c1b;hb=afc31db1d093e8427afec750191c65574ddeb1da;hp=582a035016560882fa6e4dca52b8000786e1cb32;hpb=9334e2230a72545dfa2f2ce3180b66546982cad0;p=pinmux.git diff --git a/src/bsv/peripheral_gen/base.py b/src/bsv/peripheral_gen/base.py index 582a035..53b5360 100644 --- a/src/bsv/peripheral_gen/base.py +++ b/src/bsv/peripheral_gen/base.py @@ -446,7 +446,7 @@ else""" return '\n'.join(ret) def mk_connection(self, name, count, fabricname, typ, name_override=None): - if name_override: # needed for GPIO + if name_override: # needed for GPIO name = name_override print "PBase mk_conn", name, count ret = [] @@ -639,21 +639,47 @@ class PeripheralIface(object): return ('', 0) return self.slow.axi_slave_idx(start, self.ifacename, count, typ) - def axi_fastaddr_map(self, count): + def axi_fastaddr_map(self, name, count): if not self.slow: return '' return self.slow.axi_fastaddr_map(self.ifacename, count) - def axi_addr_map(self, count): + def axi_addr_map(self, name, count): if not self.slow: return '' 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), + ('axi_addr_map', MkAxiAddrMap, 8), + ('axi_fastaddr_map', MkAxiFastAddrMap, 8), + ): + fn = CallIfaceFn(self, kls, indent) + setattr(self, fname, types.MethodType(fn, self)) + def slowimport(self, *args): ret = [] for (name, count) in self.ifacecount: @@ -774,24 +800,6 @@ class PeripheralInterfaces(object): return self._axi_num_idx(0, axi_fastslave_declarations, 'fastslave', 'fast', *args) - def axi_fastaddr_map(self, *args): - ret = [] - for (name, count) in self.ifacecount: - for i in range(count): - if self.is_on_fastbus(name, i): - continue - ret.append(self.data[name].axi_fastaddr_map(i)) - return '\n'.join(li(list(filter(None, ret)), 8)) - - def axi_addr_map(self, *args): - ret = [] - for (name, count) in self.ifacecount: - for i in range(count): - if self.is_on_fastbus(name, i): - continue - ret.append(self.data[name].axi_addr_map(i)) - return '\n'.join(li(list(filter(None, ret)), 8)) - def mkfast_peripheral(self, *args): ret = [] for (name, count) in self.ifacecount: @@ -818,21 +826,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: - ret += list(MkConnection(self, name, count, - fabric, typ, master, *args)) - 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 = [] @@ -855,12 +856,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: - ret += list(MkPinCon(self, name, count, typ)) - return '\n'.join(li(list(ret), 4)) - def mk_dma_irq(self): ret = [] sync = [] @@ -908,12 +903,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: - ret += list(MkExtIface(self, name, count)) - return '\n'.join(li(list(filter(None, ret)), 8)) - def mk_plic(self): ret = [] irq_offs = 8 # XXX: DMA scovers 0-7? @@ -938,12 +927,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: - ret += list(MkClkCon(self, name, count, ctype)) - 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) @@ -954,7 +937,8 @@ class PeripheralInterfaces(object): class IfaceIter(object): - def __init__(self, name, count, *args): + def __init__(self, ifaces, name, count, *args): + self.ifaces = ifaces self.i = 0 self.name = name self.maxcount = count @@ -968,7 +952,8 @@ class IfaceIter(object): if self.i >= self.maxcount: raise StopIteration if self.check(self.name, self.i): - #print self.item, self.args + #print "iter", self.item + #print "item args", self.args res = self.item(self.name, self.i, *self.args) if res: self.i += 1 @@ -978,11 +963,26 @@ class IfaceIter(object): 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) +class MkAxiFastAddrMap(IfaceIter): + + def check(self, name, i): + return not self.ifaces.is_on_fastbus(name, i) + + def item(self, name, i): + return self.ifaces.data[name].axi_fastaddr_map(name, i) + + +class MkAxiAddrMap(IfaceIter): + + def check(self, name, i): + return not self.ifaces.is_on_fastbus(name, i) + + def item(self, name, i): + return self.ifaces.data[name].axi_addr_map(name, i) + + +class MkConnection(IfaceIter): def check(self, name, i): return not self.ifaces.is_on_fastbus(name, i) @@ -990,14 +990,11 @@ class MkConnection(IfaceIter): def item(self, name, i, fabric, typ, master): if master: return self.ifaces.data[name].mk_master_connection(name, - i, fabric, typ) + 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) +class MkExtIface(IfaceIter): def check(self, name, i): return not self.ifaces.is_on_fastbus(name, i) @@ -1008,10 +1005,6 @@ class MkExtIface(IfaceIter): 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) @@ -1021,10 +1014,6 @@ class MkPinCon(IfaceIter): 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)