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 = []
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):
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),
+ ):
+ fn = CallIfaceFn(self, kls, indent)
+ setattr(self, fname, types.MethodType(fn, self))
+
def slowimport(self, *args):
ret = []
for (name, count) in self.ifacecount:
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:
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 = []
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 = []
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?
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)
return iname not in self.fastbus
return iname in self.fastbus
+
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
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
def next(self):
return self.__next__()
+class MkAxiAddrMap(IfaceIter):
-class MkPinCon(IfaceIter):
+ def check(self, name, i):
+ return not self.ifaces.is_on_fastbus(name, i)
- def __init__(self, ifaces, name, count, *args):
- self.ifaces = ifaces
- IfaceIter.__init__(self, name, count, *args)
+ 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)
+
+ 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 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 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)
+class MkClkCon(IfaceIter):
def check(self, name, i):
return not self.ifaces.is_on_fastbus(name, i)