wishbone.py: add Crossbar (concurrent/parallel/many-to-many interconnect)
authorRobert Jördens <jordens@gmail.com>
Mon, 22 Jul 2013 08:12:50 +0000 (02:12 -0600)
committerSebastien Bourdeauducq <sebastien@milkymist.org>
Mon, 22 Jul 2013 08:30:44 +0000 (10:30 +0200)
migen/bus/wishbone.py

index ecb19f49833379087810768fdda2b36e5b9078a3..7fc1b52163a12d81cd2d998fffe31e7160dfecfe 100644 (file)
@@ -98,6 +98,18 @@ class InterconnectShared(Module):
                self.submodules += Arbiter(masters, shared)
                self.submodules += Decoder(shared, slaves, register)
 
+class Crossbar(Module):
+       def __init__(self, masters, slaves, register=False):
+               matches, busses = zip(*slaves)
+               access = [[Interface() for j in slaves] for i in masters]
+               # decode each master into its access row
+               for row, master in zip(access, masters):
+                       row = list(zip(matches, row))
+                       self.submodules += Decoder(master, row, register)
+               # arbitrate each access column onto its slave
+               for column, bus in zip(zip(*access), busses):
+                       self.submodules += Arbiter(column, bus)
+
 class Tap(Module):
        def __init__(self, bus, handler=print):
                self.bus = bus