diff --git a/amaranth/lib/data.py b/amaranth/lib/data.py index 16e75413a..d537c916a 100644 --- a/amaranth/lib/data.py +++ b/amaranth/lib/data.py @@ -856,6 +856,12 @@ def __len__(self): f"`len()` can only be used on views of array layout, not {self.__layout!r}") return self.__layout.length + def __iter__(self): + if not isinstance(self.__layout, ArrayLayout): + raise TypeError( + f"Only views of array layout can be iterated, not {self.__layout!r}") + return (self[i] for i in range(self.__layout.length)) + def __eq__(self, other): if isinstance(other, View) and self.__layout == other.__layout: return self.__target == other.__target diff --git a/tests/test_lib_data.py b/tests/test_lib_data.py index ceafd638b..203d91ac8 100644 --- a/tests/test_lib_data.py +++ b/tests/test_lib_data.py @@ -771,6 +771,14 @@ def test_len(self): s2 = Signal(data.ArrayLayout(2, 3)) self.assertEqual(len(s2), 3) + def test_iter(self): + s1 = Signal(data.StructLayout({"a": unsigned(2)})) + with self.assertRaisesRegex(TypeError, + r"^Only views of array layout can be iterated, not StructLayout.*$"): + iter(s1) + s2 = Signal(data.ArrayLayout(2, 3)) + self.assertRepr(tuple(s2), "((slice (sig s2) 0:2), (slice (sig s2) 2:4), (slice (sig s2) 4:6))") + def test_operator(self): s1 = Signal(data.StructLayout({"a": unsigned(2)})) s2 = Signal(unsigned(2))