b0c9daf4afa61ed3aaeef570eb228b217a8383cb
1 # SPDX-License-Identifier: LGPL-3-or-later
3 This work is funded through NLnet under Grant 2019-02-012
8 from nmigen
import Signal
, Cat
10 # TODO: turn this into a module?
13 def byte_reverse(m
, name
, data
, length
):
14 """byte_reverse: unlike nmigen word_select this takes a dynamic length
16 nmigen Signal.word_select may only take a fixed length. we need
17 bigendian byte-reverse, half-word reverse, word and dword reverse.
20 data_r
= Signal
.like(data
, name
=name
)
22 # if length is a static integer, we do not require a Case statement
23 if isinstance(length
, int):
27 dest
= data_r
.word_select(i
, 8)
28 rev
.append(data
.word_select(j
-1-i
, 8))
29 comb
+= data_r
.eq(Cat(*rev
))
32 # Switch statement needed: dynamic length had better be = 1,2,4 or 8
33 with m
.Switch(length
):
34 for j
in [1, 2, 4, 8]:
38 rev
.append(data
.word_select(j
-1-i
, 8))
39 comb
+= data_r
.eq(Cat(*rev
))