add grant links, and record of funding under #538
[nmutil.git] / src / nmutil / byterev.py
1 """
2 This work is funded through NLnet under Grant 2019-02-012
3
4 License: LGPLv3+
5 """
6
7 from nmigen import Signal, Cat
8
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
12
13 nmigen Signal.word_select may only take a fixed length. we need
14 bigendian byte-reverse, half-word reverse, word and dword reverse.
15 """
16 comb = m.d.comb
17 data_r = Signal.like(data, name=name)
18
19 if isinstance(length, int):
20 j = length
21 rev = []
22 for i in range(j):
23 dest = data_r.word_select(i, 8)
24 rev.append(data.word_select(j-1-i, 8))
25 comb += data_r.eq(Cat(*rev))
26 return data_r
27
28 with m.Switch(length):
29 for j in [1,2,4,8]:
30 with m.Case(j):
31 rev = []
32 for i in range(j):
33 rev.append(data.word_select(j-1-i, 8))
34 comb += data_r.eq(Cat(*rev))
35 return data_r
36
37