61b3d169d3b3a154a30cae482ad733a32813bc2a
[nmigen-soc.git] / nmigen_soc / scheduler.py
1 from nmigen import *
2
3
4 __all__ = ["RoundRobin"]
5
6
7 class RoundRobin(Elaboratable):
8 """A round-robin scheduler.
9
10 Parameters
11 ----------
12 n : int
13 Maximum number of requests to handle.
14
15 Attributes
16 ----------
17 request : Signal(n)
18 Signal where a '1' on the i-th bit represents an incoming request from the i-th device.
19 grant : Signal(range(n))
20 Signal that equals to the index of the device which is currently granted access.
21 """
22 def __init__(self, n):
23 self.n = n
24 self.request = Signal(n)
25 self.grant = Signal(range(n))
26
27 def elaborate(self, platform):
28 m = Module()
29
30 with m.Switch(self.grant):
31 for i in range(self.n):
32 with m.Case(i):
33 with m.If(~self.request[i]):
34 for j in reversed(range(i+1, i+self.n)):
35 t = j % self.n
36 with m.If(self.request[t]):
37 m.d.sync += self.grant.eq(t)
38
39 return m