diff --git a/migen/corelogic/roundrobin.py b/migen/corelogic/roundrobin.py index 1f0e5527d..6b0ca5312 100644 --- a/migen/corelogic/roundrobin.py +++ b/migen/corelogic/roundrobin.py @@ -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])