corelogic/roundrobin: handle correctly special case with 1 request source

This commit is contained in:
Sebastien Bourdeauducq 2012-03-31 18:01:40 +02:00
parent 94b02aa8ed
commit 0dfc215fe8
1 changed files with 24 additions and 21 deletions

View File

@ -13,24 +13,27 @@ class RoundRobin:
self.ce = Signal()
def get_fragment(self):
cases = []
for i in range(self.n):
switch = []
for j in reversed(range(i+1,i+self.n)):
t = j % self.n
switch = [
If(self.request[t],
self.grant.eq(Constant(t, BV(self.bn)))
).Else(
*switch
)
]
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])
if self.n > 1:
cases = []
for i in range(self.n):
switch = []
for j in reversed(range(i+1,i+self.n)):
t = j % self.n
switch = [
If(self.request[t],
self.grant.eq(Constant(t, BV(self.bn)))
).Else(
*switch
)
]
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])
else:
return Fragment([self.grant.eq(0)])