Skip to content

Commit 21b5451

Browse files
whitequarkwanda-phi
andcommitted
ast: ensure Part offset is unsigned.
Co-authored-by: Marcelina Kościelnicka <mwk@0x04.net>
1 parent 8c4a15a commit 21b5451

File tree

2 files changed

+17
-2
lines changed

2 files changed

+17
-2
lines changed

amaranth/hdl/ast.py

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -860,9 +860,14 @@ def __init__(self, value, offset, width, stride=1, *, src_loc_at=0):
860860
if not isinstance(stride, int) or stride <= 0:
861861
raise TypeError("Part stride must be a positive integer, not {!r}".format(stride))
862862

863+
value = Value.cast(value)
864+
offset = Value.cast(offset)
865+
if offset.shape().signed:
866+
raise TypeError("Part offset must be unsigned")
867+
863868
super().__init__(src_loc_at=src_loc_at)
864-
self.value = Value.cast(value)
865-
self.offset = Value.cast(offset)
869+
self.value = value
870+
self.offset = offset
866871
self.width = width
867872
self.stride = stride
868873

tests/test_hdl_ast.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -785,6 +785,11 @@ def test_repr(self):
785785
s = self.c.bit_select(self.s, 2)
786786
self.assertEqual(repr(s), "(part (const 8'd0) (sig s) 2 1)")
787787

788+
def test_offset_wrong(self):
789+
with self.assertRaisesRegex(TypeError,
790+
r"^Part offset must be unsigned$"):
791+
self.c.bit_select(self.s.as_signed(), 1)
792+
788793

789794
class WordSelectTestCase(FHDLTestCase):
790795
def setUp(self):
@@ -817,6 +822,11 @@ def test_repr(self):
817822
s = self.c.word_select(self.s, 2)
818823
self.assertEqual(repr(s), "(part (const 8'd0) (sig s) 2 2)")
819824

825+
def test_offset_wrong(self):
826+
with self.assertRaisesRegex(TypeError,
827+
r"^Part offset must be unsigned$"):
828+
self.c.word_select(self.s.as_signed(), 1)
829+
820830

821831
class CatTestCase(FHDLTestCase):
822832
def test_shape(self):

0 commit comments

Comments
 (0)