Skip to content

Commit f6c3806

Browse files
wanda-phiwhitequark
authored andcommitted
lib.data: fix Layout.const masking for signed fields.
Fixes #846.
1 parent 7a9dbc8 commit f6c3806

File tree

2 files changed

+9
-2
lines changed

2 files changed

+9
-2
lines changed

amaranth/lib/data.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -240,8 +240,9 @@ def const(self, init):
240240
key_value.shape()))
241241
elif not isinstance(key_value, Const):
242242
key_value = Const(key_value, cast_field_shape)
243-
int_value &= ~(((1 << cast_field_shape.width) - 1) << field.offset)
244-
int_value |= key_value.value << field.offset
243+
mask = ((1 << cast_field_shape.width) - 1) << field.offset
244+
int_value &= ~mask
245+
int_value |= (key_value.value << field.offset) & mask
245246
return Const(int_value, self.as_shape())
246247

247248

tests/test_lib_data.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -398,6 +398,12 @@ def test_const(self):
398398
self.assertRepr(fl.const({"b": 0b10}), "(const 2'd2)")
399399
self.assertRepr(fl.const({"a": 0b1, "b": 0b10}), "(const 2'd2)")
400400

401+
sls = StructLayout({
402+
"a": signed(4),
403+
"b": signed(4)
404+
})
405+
self.assertRepr(sls.const({"b": 0, "a": -1}), "(const 8'd15)")
406+
401407
def test_const_wrong(self):
402408
sl = StructLayout({"f": unsigned(1)})
403409
with self.assertRaisesRegex(TypeError,

0 commit comments

Comments
 (0)