From f6c38061ff1932b7f7f79855e231598c95ccfdea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcelina=20Ko=C5=9Bcielnicka?= Date: Sat, 22 Jul 2023 02:21:59 +0200 Subject: [PATCH] lib.data: fix `Layout.const` masking for signed fields. Fixes #846. --- amaranth/lib/data.py | 5 +++-- tests/test_lib_data.py | 6 ++++++ 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/amaranth/lib/data.py b/amaranth/lib/data.py index 237cc93..605b1fc 100644 --- a/amaranth/lib/data.py +++ b/amaranth/lib/data.py @@ -240,8 +240,9 @@ class Layout(ShapeCastable, metaclass=ABCMeta): key_value.shape())) elif not isinstance(key_value, Const): key_value = Const(key_value, cast_field_shape) - int_value &= ~(((1 << cast_field_shape.width) - 1) << field.offset) - int_value |= key_value.value << field.offset + mask = ((1 << cast_field_shape.width) - 1) << field.offset + int_value &= ~mask + int_value |= (key_value.value << field.offset) & mask return Const(int_value, self.as_shape()) diff --git a/tests/test_lib_data.py b/tests/test_lib_data.py index 845d240..2dd1928 100644 --- a/tests/test_lib_data.py +++ b/tests/test_lib_data.py @@ -398,6 +398,12 @@ class LayoutTestCase(FHDLTestCase): self.assertRepr(fl.const({"b": 0b10}), "(const 2'd2)") self.assertRepr(fl.const({"a": 0b1, "b": 0b10}), "(const 2'd2)") + sls = StructLayout({ + "a": signed(4), + "b": signed(4) + }) + self.assertRepr(sls.const({"b": 0, "a": -1}), "(const 8'd15)") + def test_const_wrong(self): sl = StructLayout({"f": unsigned(1)}) with self.assertRaisesRegex(TypeError,