speed up ==, hash, <, >, <=, and >= for plain_data
[nmutil.git] / src / nmutil / extend.py
1 # SPDX-License-Identifier: LGPL-2-or-later
2 # Copyright (C) Luke Kenneth Casson Leighton 2020,2021 <lkcl@lkcl.net>
3 """
4 Provides sign/unsigned extension/truncation utility functions.
5
6 This work is funded through NLnet under Grant 2019-02-012
7 """
8 from nmigen import Repl, Cat, Const
9
10
11 def exts(exts_data, width, fullwidth):
12 diff = fullwidth-width
13 if diff == 0:
14 return exts_data
15 exts_data = exts_data[0:width]
16 if diff <= 0:
17 return exts_data[:fullwidth]
18 topbit = exts_data[-1]
19 signbits = Repl(topbit, diff)
20 return Cat(exts_data, signbits)
21
22
23 def extz(extz_data, width, fullwidth):
24 diff = fullwidth-width
25 if diff == 0:
26 return extz_data
27 extz_data = extz_data[0:width]
28 if diff <= 0:
29 return extz_data[:fullwidth]
30 topbit = Const(0)
31 signbits = Repl(topbit, diff)
32 return Cat(extz_data, signbits)
33
34
35 def ext(data, shape, newwidth):
36 """extend/truncate data to new width, preserving sign
37 """
38 width, signed = shape
39 if signed:
40 return exts(data, width, newwidth)
41 return extz(data, width, newwidth)