2 This work is funded through NLnet under Grant 2019-02-012
7 from nmigen
import Signal
, Cat
9 # TODO: turn this into a module?
10 def byte_reverse(m
, name
, data
, length
):
11 """byte_reverse: unlike nmigen word_select this takes a dynamic length
13 nmigen Signal.word_select may only take a fixed length. we need
14 bigendian byte-reverse, half-word reverse, word and dword reverse.
17 data_r
= Signal
.like(data
, name
=name
)
19 # if length is a static integer, we do not require a Case statement
20 if isinstance(length
, int):
24 dest
= data_r
.word_select(i
, 8)
25 rev
.append(data
.word_select(j
-1-i
, 8))
26 comb
+= data_r
.eq(Cat(*rev
))
29 # Switch statement needed: dynamic length had better be = 1,2,4 or 8
30 with m
.Switch(length
):
35 rev
.append(data
.word_select(j
-1-i
, 8))
36 comb
+= data_r
.eq(Cat(*rev
))