Skip to content

Commit 408517d

Browse files
authored
fix(hugr-py): output and delete node issues (#1971)
Closes #1969 Closes #1970 drive-by add `add_order_link` to `Hugr`
1 parent fa28670 commit 408517d

File tree

3 files changed

+39
-8
lines changed

3 files changed

+39
-8
lines changed

hugr-py/src/hugr/build/dfg.py

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -510,10 +510,7 @@ def add_state_order(self, src: Node, dst: Node) -> None:
510510
[Node(2)]
511511
"""
512512
# adds edge to the right of all existing edges
513-
source = src.out(-1)
514-
target = dst.inp(-1)
515-
if not self.hugr.has_link(source, target):
516-
self.hugr.add_link(source, target)
513+
self.hugr.add_order_link(src, dst)
517514

518515
def load(
519516
self, const: ToNode | val.Value, const_parent: ToNode | None = None

hugr-py/src/hugr/hugr/base.py

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -174,6 +174,8 @@ def _add_node(
174174
node = replace(node, _num_out_ports=num_outs, _metadata=node_data.metadata)
175175
if parent:
176176
self[parent].children.append(node)
177+
178+
self._update_node_outs(node, num_outs)
177179
return node
178180

179181
def _update_node_outs(self, node: Node, num_outs: int | None) -> Node:
@@ -278,10 +280,10 @@ def delete_node(self, node: ToNode) -> NodeData | None:
278280
parent = self[node].parent
279281
if parent:
280282
self[parent].children.remove(node)
281-
for offset in range(self.num_in_ports(node)):
282-
self._links.delete_right(_SubPort(node.inp(offset)))
283-
for offset in range(self.num_out_ports(node)):
284-
self._links.delete_left(_SubPort(node.out(offset)))
283+
for inp, _ in self.incoming_links(node):
284+
self._links.delete_right(_SubPort(inp))
285+
for out, _ in self.outgoing_links(node):
286+
self._links.delete_left(_SubPort(out))
285287

286288
weight, self._nodes[node.idx] = self._nodes[node.idx], None
287289

@@ -344,6 +346,24 @@ def add_link(self, src: OutPort, dst: InPort) -> None:
344346
self[src.node]._num_outs = max(self[src.node]._num_outs, src.offset + 1)
345347
self[dst.node]._num_inps = max(self[dst.node]._num_inps, dst.offset + 1)
346348

349+
def add_order_link(self, src: ToNode, dst: ToNode) -> None:
350+
"""Add a state order link between two nodes.
351+
352+
Args:
353+
src: Source node.
354+
dst: Destination node.
355+
356+
Examples:
357+
>>> df = dfg.Dfg()
358+
>>> df.hugr.add_order_link(df.input_node, df.output_node)
359+
>>> list(df.hugr.outgoing_order_links(df.input_node))
360+
[Node(2)]
361+
"""
362+
source = src.out(-1)
363+
target = dst.inp(-1)
364+
if not self.has_link(source, target):
365+
self.add_link(source, target)
366+
347367
def delete_link(self, src: OutPort, dst: InPort) -> None:
348368
"""Delete a link (edge) between two nodes from the HUGR.
349369

hugr-py/tests/test_hugr_build.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -310,6 +310,20 @@ def test_higher_order() -> None:
310310
validate(d.hugr)
311311

312312

313+
def test_state_order() -> None:
314+
mod = Module()
315+
f_id = mod.define_function("id", [tys.Bool])
316+
f_id.set_outputs(f_id.input_node[0])
317+
318+
f_main = mod.define_main([tys.Bool])
319+
b = f_main.input_node[0]
320+
call1 = f_main.call(f_id, b)
321+
f_main.add_state_order(call1, f_main.output_node)
322+
# implicit discard of bool to test state order port logic
323+
f_main.set_outputs()
324+
validate(mod.hugr)
325+
326+
313327
def test_alias() -> None:
314328
mod = Module()
315329
_dfn = mod.add_alias_defn("my_int", INT_T)

0 commit comments

Comments
 (0)