1 """ Priority Picker: optimised back-to-back PriorityEncoder and Decoder
3 The input is N bits, the output is N bits wide and only one is
7 from nmigen
import Module
, Signal
, Cat
, Elaboratable
9 class PriorityPicker(Elaboratable
):
10 """ implements a priority-picker. input: N bits, output: N bits
12 def __init__(self
, wid
):
15 self
.i
= Signal(wid
, reset_less
=True)
16 self
.o
= Signal(wid
, reset_less
=True)
18 def elaborate(self
, platform
):
22 ni
= Signal(self
.wid
, reset_less
= True)
23 m
.d
.comb
+= ni
.eq(~self
.i
)
24 for i
in range(0, self
.wid
):
25 t
= Signal(reset_less
= True)
28 m
.d
.comb
+= t
.eq(self
.i
[i
])
30 m
.d
.comb
+= t
.eq(~
Cat(ni
[i
], *self
.i
[:i
]).bool())
32 # we like Cat(*xxx). turn lists into concatenated bits
33 m
.d
.comb
+= self
.o
.eq(Cat(*res
))