corelogic/roundrobin: CE switching
authorSebastien Bourdeauducq <sebastien@milkymist.org>
Fri, 16 Mar 2012 15:54:47 +0000 (16:54 +0100)
committerSebastien Bourdeauducq <sebastien@milkymist.org>
Fri, 16 Mar 2012 15:54:47 +0000 (16:54 +0100)
migen/corelogic/roundrobin.py

index 1f0e5527d0e34b7be3fef1aa9fecadbf5929931c..6b0ca5312b67db93e34667d7f9d0894508715a1a 100644 (file)
@@ -1,11 +1,16 @@
 from migen.fhdl.structure import *
 
+(SP_WITHDRAW, SP_CE) = range(2)
+
 class RoundRobin:
-       def __init__(self, n):
+       def __init__(self, n, switch_policy=SP_WITHDRAW):
                self.n = n
                self.bn = bits_for(self.n-1)
                self.request = Signal(BV(self.n))
                self.grant = Signal(BV(self.bn))
+               self.switch_policy = switch_policy
+               if self.switch_policy == SP_CE:
+                       self.ce = Signal()
        
        def get_fragment(self):
                cases = []
@@ -20,7 +25,12 @@ class RoundRobin:
                                                *switch
                                        )
                                ]
-                       case = If(~self.request[i], *switch)
-                       cases.append([Constant(i, BV(self.bn)), case])
+                       if self.switch_policy == SP_WITHDRAW:
+                               case = [If(~self.request[i], *switch)]
+                       else:
+                               case = switch
+                       cases.append([Constant(i, BV(self.bn))] + case)
                statement = Case(self.grant, *cases)
+               if self.switch_policy == SP_CE:
+                       statement = If(self.ce, statement)
                return Fragment(sync=[statement])