bump to 0.2.dev
[litex.git] / litex / gen / genlib / roundrobin.py
1 from litex.gen.fhdl.structure import *
2 from litex.gen.fhdl.module import Module
3
4
5 (SP_WITHDRAW, SP_CE) = range(2)
6
7
8 class RoundRobin(Module):
9 def __init__(self, n, switch_policy=SP_WITHDRAW):
10 self.request = Signal(n)
11 self.grant = Signal(max=max(2, n))
12 self.switch_policy = switch_policy
13 if self.switch_policy == SP_CE:
14 self.ce = Signal()
15
16 ###
17
18 if n > 1:
19 cases = {}
20 for i in range(n):
21 switch = []
22 for j in reversed(range(i+1, i+n)):
23 t = j % n
24 switch = [
25 If(self.request[t],
26 self.grant.eq(t)
27 ).Else(
28 *switch
29 )
30 ]
31 if self.switch_policy == SP_WITHDRAW:
32 case = [If(~self.request[i], *switch)]
33 else:
34 case = switch
35 cases[i] = case
36 statement = Case(self.grant, cases)
37 if self.switch_policy == SP_CE:
38 statement = If(self.ce, statement)
39 self.sync += statement
40 else:
41 self.comb += self.grant.eq(0)