lib.data: fix Layout.const masking for signed fields.

Fixes #846.
This commit is contained in:
Marcelina Kościelnicka 2023-07-22 02:21:59 +02:00 committed by Catherine
parent 7a9dbc8c11
commit f6c38061ff
2 changed files with 9 additions and 2 deletions

View file

@ -240,8 +240,9 @@ class Layout(ShapeCastable, metaclass=ABCMeta):
key_value.shape())) key_value.shape()))
elif not isinstance(key_value, Const): elif not isinstance(key_value, Const):
key_value = Const(key_value, cast_field_shape) key_value = Const(key_value, cast_field_shape)
int_value &= ~(((1 << cast_field_shape.width) - 1) << field.offset) mask = ((1 << cast_field_shape.width) - 1) << field.offset
int_value |= key_value.value << field.offset int_value &= ~mask
int_value |= (key_value.value << field.offset) & mask
return Const(int_value, self.as_shape()) return Const(int_value, self.as_shape())

View file

@ -398,6 +398,12 @@ class LayoutTestCase(FHDLTestCase):
self.assertRepr(fl.const({"b": 0b10}), "(const 2'd2)") self.assertRepr(fl.const({"b": 0b10}), "(const 2'd2)")
self.assertRepr(fl.const({"a": 0b1, "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): def test_const_wrong(self):
sl = StructLayout({"f": unsigned(1)}) sl = StructLayout({"f": unsigned(1)})
with self.assertRaisesRegex(TypeError, with self.assertRaisesRegex(TypeError,