1 # SPDX-License-Identifier: LGPL-2-or-later
2 # Copyright (C) Luke Kenneth Casson Leighton 2020,2021 <lkcl@lkcl.net>
4 Provides sign/unsigned extension/truncation utility functions.
6 This work is funded through NLnet under Grant 2019-02-012
8 from nmigen
import Repl
, Cat
, Const
11 def exts(exts_data
, width
, fullwidth
):
12 diff
= fullwidth
-width
15 exts_data
= exts_data
[0:width
]
17 return exts_data
[:fullwidth
]
18 topbit
= exts_data
[-1]
19 signbits
= Repl(topbit
, diff
)
20 return Cat(exts_data
, signbits
)
23 def extz(extz_data
, width
, fullwidth
):
24 diff
= fullwidth
-width
27 extz_data
= extz_data
[0:width
]
29 return extz_data
[:fullwidth
]
31 signbits
= Repl(topbit
, diff
)
32 return Cat(extz_data
, signbits
)
35 def ext(data
, shape
, newwidth
):
36 """extend/truncate data to new width, preserving sign
40 return exts(data
, width
, newwidth
)
41 return extz(data
, width
, newwidth
)