Skip to content

Commit d154bdd

Browse files
jfngwhitequark
authored andcommitted
lib.wiring: preserve insertion order in SignatureMembers.__iter__.
1 parent 8e6ae9e commit d154bdd

File tree

2 files changed

+26
-5
lines changed

2 files changed

+26
-5
lines changed

amaranth/lib/wiring.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -163,7 +163,7 @@ def flip(self):
163163

164164
def __eq__(self, other):
165165
return (isinstance(other, (SignatureMembers, FlippedSignatureMembers)) and
166-
list(self.flatten()) == list(other.flatten()))
166+
list(sorted(self.flatten())) == list(sorted(other.flatten())))
167167

168168
def __contains__(self, name):
169169
return name in self._dict
@@ -189,7 +189,7 @@ def __delitem__(self, name):
189189
raise SignatureError("Members cannot be removed from a signature")
190190

191191
def __iter__(self):
192-
return iter(sorted(self._dict))
192+
return iter(self._dict)
193193

194194
def __len__(self):
195195
return len(self._dict)
@@ -647,7 +647,7 @@ def connect(m, *args, **kwargs):
647647
signatures[handle] = obj.signature
648648

649649
# Collate signatures and build connections.
650-
flattens = {handle: signature.members.flatten()
650+
flattens = {handle: iter(sorted(signature.members.flatten()))
651651
for handle, signature in signatures.items()}
652652
connections = []
653653
# Each iteration of the outer loop is intended to connect several (usually a pair) members

tests/test_lib_wiring.py

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -200,11 +200,11 @@ def test_iter_len(self):
200200
self.assertEqual(list(iter(members)), ["a"])
201201
self.assertEqual(len(members), 1)
202202

203-
def test_iter_sorted(self):
203+
def test_iter_insertion_order(self):
204204
self.assertEqual(list(iter(SignatureMembers({"a": In(1), "b": Out(1)}))),
205205
["a", "b"])
206206
self.assertEqual(list(iter(SignatureMembers({"b": In(1), "a": Out(1)}))),
207-
["a", "b"])
207+
["b", "a"])
208208

209209
def test_flatten(self):
210210
sig = Signature({
@@ -915,6 +915,27 @@ def test_nested(self):
915915
'(eq (sig q__a) (sig p__a))'
916916
])
917917

918+
def test_unordered(self):
919+
m = Module()
920+
connect(m,
921+
p=NS(signature=Signature({"a": Out(1),
922+
"b": Out(Signature({"f": Out(1), "g": Out(1)}))}),
923+
a=Signal(name="p__a"),
924+
b=NS(signature=Signature({"f": Out(1), "g": Out(1)}),
925+
f=Signal(name="p__b__f"),
926+
g=Signal(name="p__b__g"))),
927+
q=NS(signature=Signature({"b": In(Signature({"g": Out(1), "f": Out(1)})),
928+
"a": In(1)}),
929+
b=NS(signature=Signature({"g": Out(1), "f": Out(1)}).flip(),
930+
g=Signal(name="q__b__g"),
931+
f=Signal(name="q__b__f")),
932+
a=Signal(name="q__a")))
933+
self.assertEqual([repr(stmt) for stmt in m._statements], [
934+
'(eq (sig q__a) (sig p__a))',
935+
'(eq (sig q__b__f) (sig p__b__f))',
936+
'(eq (sig q__b__g) (sig p__b__g))',
937+
])
938+
918939
def test_dimension(self):
919940
sig = Signature({"a": Out(1).array(2)})
920941

0 commit comments

Comments
 (0)