Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
320 commits
Select commit Hold shift + click to select a range
888d025
clean-up
andrijapau Nov 25, 2025
d4b34f9
whoops
andrijapau Nov 25, 2025
2f27f08
Merge branch 'fix/upgrade-dag-builders' into feature/mlir-to-dag-pass
andrijapau Nov 25, 2025
33aa334
fix test
andrijapau Nov 25, 2025
d50cfdc
whoops
andrijapau Nov 25, 2025
a364869
cleanup
andrijapau Nov 25, 2025
cddb234
clean-up
andrijapau Nov 25, 2025
1b5210c
fix formatting issue
andrijapau Nov 25, 2025
14b28bb
isort
andrijapau Nov 25, 2025
a1e9211
update tests
andrijapau Nov 25, 2025
aad7449
Apply suggestion from @andrijapau
andrijapau Nov 25, 2025
8225658
isort
andrijapau Nov 25, 2025
897fd16
feat: add bounding box visualization for funcops and devices
andrijapau Nov 25, 2025
8ae8692
Apply suggestion from @andrijapau
andrijapau Nov 25, 2025
3750ef2
cl
andrijapau Nov 25, 2025
f823ede
add tests for bounding boxes
andrijapau Nov 25, 2025
f397b47
isort
andrijapau Nov 25, 2025
59e7826
fix source code
andrijapau Nov 25, 2025
55fbb8e
Revert "fix source code"
andrijapau Nov 25, 2025
0e1b68b
fix test
andrijapau Nov 25, 2025
1749a1e
Apply suggestion from @andrijapau
andrijapau Nov 25, 2025
0b65d42
remove incorrect import
andrijapau Nov 25, 2025
8f579a0
update tests
andrijapau Nov 25, 2025
4105697
isort
andrijapau Nov 25, 2025
028098e
minor visual change
andrijapau Nov 25, 2025
9f37379
feat: visualize control flow as clusters in the graph
andrijapau Nov 25, 2025
a5b8cd2
format
andrijapau Nov 25, 2025
b51016e
Merge branch 'fix/upgrade-dag-builders' into feature/mlir-to-dag-pass
andrijapau Nov 25, 2025
13f39eb
Merge branch 'feature/mlir-to-dag-pass' into feature/visualize-qnode
andrijapau Nov 25, 2025
d8a38b7
Merge branch 'feature/visualize-qnode' into feature/control-flow-clus…
andrijapau Nov 25, 2025
07a0597
Update frontend/catalyst/python_interface/visualization/construct_cir…
andrijapau Nov 25, 2025
40b1eb4
move things around
andrijapau Nov 25, 2025
77dd502
minor cleanup
andrijapau Nov 25, 2025
7b807fd
Merge branch 'feature/mlir-to-dag-pass' into feature/visualize-qnode
andrijapau Nov 25, 2025
022171e
Merge branch 'feature/visualize-qnode' into feature/control-flow-clus…
andrijapau Nov 25, 2025
19af1c7
clean-up
andrijapau Nov 25, 2025
4c2c0b8
Merge branch 'feature/visualize-qnode' into feature/control-flow-clus…
andrijapau Nov 25, 2025
b4ccd61
refactor the get_ to properties
andrijapau Nov 25, 2025
d354dba
Merge branch 'fix/upgrade-dag-builders' into feature/mlir-to-dag-pass
andrijapau Nov 25, 2025
9cf53b5
Merge branch 'feature/mlir-to-dag-pass' into feature/visualize-qnode
andrijapau Nov 25, 2025
b36b3ae
Merge branch 'feature/visualize-qnode' into feature/control-flow-clus…
andrijapau Nov 25, 2025
d14c15b
update fake dag builder
andrijapau Nov 25, 2025
4f35dcf
Merge branch 'feature/mlir-to-dag-pass' into feature/visualize-qnode
andrijapau Nov 25, 2025
d429566
use new properties
andrijapau Nov 25, 2025
a2794c5
Merge branch 'feature/visualize-qnode' into feature/control-flow-clus…
andrijapau Nov 25, 2025
a1110ad
add test and use new properties
andrijapau Nov 25, 2025
cbb96ff
isort
andrijapau Nov 25, 2025
9c0220b
fix test
andrijapau Nov 26, 2025
0e0ddfd
attempt to get rid of _subgraphs
andrijapau Nov 26, 2025
c41adb9
clean-up test
andrijapau Nov 26, 2025
e803543
rename __base__ to None
andrijapau Nov 26, 2025
42cede2
Merge branch 'fix/upgrade-dag-builders' into feature/mlir-to-dag-pass
andrijapau Nov 26, 2025
a9aa9ec
Merge branch 'feature/mlir-to-dag-pass' into feature/visualize-qnode
andrijapau Nov 26, 2025
aa36682
Merge branch 'feature/visualize-qnode' into feature/control-flow-clus…
andrijapau Nov 26, 2025
085ec57
clean-up
andrijapau Nov 26, 2025
c08a84c
whoops
andrijapau Nov 26, 2025
edc2076
add cluster_ prefix
andrijapau Nov 26, 2025
4c71876
add debug string
andrijapau Nov 26, 2025
f1e5849
bring back cache
andrijapau Nov 26, 2025
0ff2ce9
Merge branch 'fix/upgrade-dag-builders' into feature/mlir-to-dag-pass
andrijapau Nov 26, 2025
6f49870
Merge branch 'feature/mlir-to-dag-pass' into feature/visualize-qnode
andrijapau Nov 26, 2025
a065593
Merge branch 'feature/visualize-qnode' into feature/control-flow-clus…
andrijapau Nov 26, 2025
3c9ca3a
add good dev comment
andrijapau Nov 26, 2025
b83e2a4
Merge branch 'fix/upgrade-dag-builders' into feature/mlir-to-dag-pass
andrijapau Nov 26, 2025
bc54dbf
Apply suggestion from @andrijapau
andrijapau Nov 26, 2025
ee57f40
Apply suggestion from @andrijapau
andrijapau Nov 26, 2025
c341858
whoops
andrijapau Nov 26, 2025
2ded5dc
Merge branch 'fix/upgrade-dag-builders' into feature/mlir-to-dag-pass
andrijapau Nov 26, 2025
5943c1a
Merge branch 'feature/mlir-to-dag-pass' into feature/visualize-qnode
andrijapau Nov 26, 2025
7d051ac
Merge branch 'feature/visualize-qnode' into feature/control-flow-clus…
andrijapau Nov 26, 2025
0460cac
refactor singledispatch
andrijapau Nov 26, 2025
fd44ce6
Merge branch 'feature/mlir-to-dag-pass' into feature/visualize-qnode
andrijapau Nov 26, 2025
1a6aa98
minor improvements
andrijapau Nov 26, 2025
39fe0b9
whoops
andrijapau Nov 26, 2025
f495934
Merge branch 'feature/visualize-qnode' into feature/control-flow-clus…
andrijapau Nov 26, 2025
194433f
format
andrijapau Nov 26, 2025
76025f3
more clean-up
andrijapau Nov 26, 2025
ccceb2b
clobbered
andrijapau Nov 26, 2025
0cbe9af
Update frontend/catalyst/python_interface/visualization/dag_builder.py
andrijapau Nov 26, 2025
4dbdb13
Merge branch 'fix/upgrade-dag-builders' into feature/mlir-to-dag-pass
andrijapau Nov 26, 2025
fddfa75
Merge branch 'feature/mlir-to-dag-pass' into feature/visualize-qnode
andrijapau Nov 26, 2025
4596d02
Merge branch 'feature/visualize-qnode' into feature/control-flow-clus…
andrijapau Nov 26, 2025
813ec0e
remove unused
andrijapau Nov 26, 2025
3b1d25e
remove unused
andrijapau Nov 26, 2025
f25d136
Merge branch 'feature/visualize-qnode' into feature/control-flow-clus…
andrijapau Nov 26, 2025
96d3b37
fix pylint
andrijapau Nov 26, 2025
2e2a97c
more tests
andrijapau Nov 26, 2025
e752329
add more details to docstring
andrijapau Nov 26, 2025
5dccfbb
Merge branch 'feature/mlir-to-dag-pass' into feature/visualize-qnode
andrijapau Nov 26, 2025
123144f
clean up tests
andrijapau Nov 26, 2025
d0c7c9f
try to improve tests
andrijapau Nov 26, 2025
cd9d5f4
add device test
andrijapau Nov 26, 2025
6cda3bf
format
andrijapau Nov 26, 2025
86b5662
Update frontend/catalyst/python_interface/visualization/dag_builder.py
andrijapau Nov 26, 2025
9c26efd
Update frontend/catalyst/python_interface/visualization/pydot_dag_bui…
andrijapau Nov 26, 2025
81a9aa6
Update frontend/catalyst/python_interface/visualization/pydot_dag_bui…
andrijapau Nov 26, 2025
ab06276
Update frontend/test/pytest/python_interface/visualization/test_pydot…
andrijapau Nov 26, 2025
3e4102b
Update frontend/catalyst/python_interface/visualization/pydot_dag_bui…
andrijapau Nov 26, 2025
194f14a
Update frontend/catalyst/python_interface/visualization/dag_builder.py
andrijapau Nov 26, 2025
199ab70
add reset
andrijapau Nov 26, 2025
e28a1a9
Merge branch 'feature/visualize-qnode' into feature/control-flow-clus…
andrijapau Nov 26, 2025
24d3dd3
Apply suggestion from @andrijapau
andrijapau Nov 26, 2025
685842c
fix fakebackend
andrijapau Nov 26, 2025
986fb3f
Merge branch 'fix/upgrade-dag-builders' into feature/mlir-to-dag-pass
andrijapau Nov 26, 2025
07b7655
Merge branch 'feature/mlir-to-dag-pass' into feature/visualize-qnode
andrijapau Nov 26, 2025
11f5864
Merge branch 'feature/visualize-qnode' into feature/control-flow-clus…
andrijapau Nov 26, 2025
8c64d81
isort
andrijapau Nov 26, 2025
606f5f5
Merge branch 'fix/upgrade-dag-builders' into feature/mlir-to-dag-pass
andrijapau Nov 26, 2025
edfcb93
Merge branch 'feature/mlir-to-dag-pass' into feature/visualize-qnode
andrijapau Nov 26, 2025
0370886
Merge branch 'feature/visualize-qnode' into feature/control-flow-clus…
andrijapau Nov 26, 2025
9847b39
try moving cluster stack to dag builder
andrijapau Nov 26, 2025
57ce573
add test
andrijapau Nov 26, 2025
805d21b
Revert "add test"
andrijapau Nov 26, 2025
c0e0283
Revert "try moving cluster stack to dag builder"
andrijapau Nov 26, 2025
e1a6c64
Merge branch 'feature/visualize-qnode' into feature/control-flow-clus…
andrijapau Nov 26, 2025
2a960cf
improve device test
andrijapau Nov 26, 2025
a21e6dd
fix black isort
andrijapau Nov 26, 2025
b06585b
Merge branch 'feature/visualize-qnode' into feature/control-flow-clus…
andrijapau Nov 26, 2025
f666a9f
add exceptions check
andrijapau Nov 26, 2025
e28b2b7
add better documentation
andrijapau Nov 26, 2025
af5e52c
fix
andrijapau Nov 26, 2025
952fd7f
fix typo
andrijapau Nov 26, 2025
99f9fc6
Merge branch 'fix/upgrade-dag-builders' into feature/mlir-to-dag-pass
andrijapau Nov 26, 2025
492276d
Merge branch 'feature/mlir-to-dag-pass' into feature/visualize-qnode
andrijapau Nov 26, 2025
8f2dc98
Apply suggestion from @andrijapau
andrijapau Nov 26, 2025
eac25d5
Merge branch 'fix/upgrade-dag-builders' into feature/mlir-to-dag-pass
andrijapau Nov 26, 2025
b06e92e
Merge branch 'feature/mlir-to-dag-pass' into feature/visualize-qnode
andrijapau Nov 26, 2025
53497ba
Merge branch 'feature/visualize-qnode' into feature/control-flow-clus…
andrijapau Nov 26, 2025
83225b3
Merge branch 'feature/graph-visualization' into feature/mlir-to-dag-pass
andrijapau Nov 26, 2025
7d04249
fix tests
andrijapau Nov 26, 2025
fbb0c5a
Merge branch 'feature/visualize-qnode' into feature/control-flow-clus…
andrijapau Nov 26, 2025
941675f
Merge branch 'feature/mlir-to-dag-pass' into feature/visualize-qnode
andrijapau Nov 26, 2025
bb9549d
Merge branch 'feature/visualize-qnode' into feature/control-flow-clus…
andrijapau Nov 26, 2025
2bad538
add reminder comments
andrijapau Nov 26, 2025
683768e
add back comment
andrijapau Nov 26, 2025
2adb3b2
format
andrijapau Nov 26, 2025
f7bbb6b
fix test name
andrijapau Nov 26, 2025
f7f4b5a
fix test
andrijapau Nov 26, 2025
a21f878
fix tests
andrijapau Nov 26, 2025
ae0ff32
format
andrijapau Nov 26, 2025
26ae968
Apply suggestion from @andrijapau
andrijapau Nov 26, 2025
1d4f1f1
more explanation
andrijapau Nov 26, 2025
70ec17a
Merge branch 'feature/visualize-qnode' into feature/control-flow-clus…
andrijapau Nov 26, 2025
ed8bae0
more fixes
andrijapau Nov 26, 2025
25e8051
fix up testing
andrijapau Nov 26, 2025
ffc9726
fix naming
andrijapau Nov 26, 2025
a243614
Merge branch 'feature/mlir-to-dag-pass' into feature/visualize-qnode
andrijapau Nov 26, 2025
e58891a
new testing approach
andrijapau Nov 27, 2025
6d1ab99
format
andrijapau Nov 27, 2025
710e6a8
test the fakebackend
andrijapau Nov 27, 2025
cb931d1
whoops forgot test
andrijapau Nov 27, 2025
049a683
improve test
andrijapau Nov 27, 2025
9ea917e
add new feature of jit_ prefix removal and single qnode
andrijapau Nov 27, 2025
fd41bc5
Merge branch 'feature/visualize-qnode' into feature/control-flow-clus…
andrijapau Nov 27, 2025
fd26a37
whoops
andrijapau Nov 27, 2025
1ad2ec0
format
andrijapau Nov 27, 2025
7fdbac0
Merge branch 'feature/visualize-qnode' into feature/control-flow-clus…
andrijapau Nov 27, 2025
8fc4a30
improve some tests
andrijapau Nov 27, 2025
bfd28b2
shouldn't have conditional label
andrijapau Nov 27, 2025
4753071
Merge branch 'feature/graph-visualization' into feature/visualize-qnode
andrijapau Nov 28, 2025
6200c76
Merge branch 'feature/graph-visualization' into feature/visualize-qnode
andrijapau Nov 28, 2025
1f90c6d
Merge branch 'feature/graph-visualization' into feature/visualize-qnode
andrijapau Nov 28, 2025
9aef399
id to uid rename
andrijapau Nov 28, 2025
e87dba2
format
andrijapau Nov 28, 2025
14ed4bc
Merge branch 'feature/graph-visualization' into feature/visualize-qnode
andrijapau Nov 28, 2025
be1961c
rename inner stack
andrijapau Nov 28, 2025
c92736a
format
andrijapau Nov 28, 2025
ca44e59
Apply suggestion from @andrijapau
andrijapau Nov 28, 2025
f84a6f1
Merge branch 'feature/visualize-qnode' into feature/control-flow-clus…
andrijapau Nov 28, 2025
3a8da55
Apply suggestion from @andrijapau
andrijapau Nov 28, 2025
26e95f9
format
andrijapau Nov 28, 2025
d7f21bd
Merge branch 'feature/visualize-qnode' into feature/control-flow-clus…
andrijapau Nov 28, 2025
c9594ee
fix
andrijapau Nov 28, 2025
d76fcca
Merge branch 'feature/visualize-qnode' into feature/control-flow-clus…
andrijapau Nov 28, 2025
c0554c5
fix
andrijapau Nov 28, 2025
a80141c
format
andrijapau Nov 28, 2025
529cace
rename cluster stack
andrijapau Nov 28, 2025
4a172dd
return op doesnt have regions
andrijapau Dec 1, 2025
a54de21
Apply suggestion from @andrijapau
andrijapau Dec 1, 2025
5a731c0
Merge branch 'feature/graph-visualization' into feature/visualize-qnode
andrijapau Dec 1, 2025
53f80b3
Merge branch 'feature/visualize-qnode' into feature/control-flow-clus…
andrijapau Dec 1, 2025
2bb5bde
update testing and add for loop label upgrade
andrijapau Dec 1, 2025
434c500
fix
andrijapau Dec 1, 2025
cfa5f3b
add more tests
andrijapau Dec 1, 2025
a62f2b1
add dev comments
andrijapau Dec 1, 2025
d9026ef
more testing
andrijapau Dec 1, 2025
faf338f
move things around
andrijapau Dec 1, 2025
5d03a81
add more qol
andrijapau Dec 2, 2025
56e4756
Update frontend/catalyst/python_interface/visualization/construct_cir…
andrijapau Dec 2, 2025
c95c45f
Update frontend/catalyst/python_interface/visualization/construct_cir…
andrijapau Dec 2, 2025
18aa30b
Update frontend/catalyst/python_interface/visualization/construct_cir…
andrijapau Dec 2, 2025
929bd23
add flattened ifop ability
andrijapau Dec 2, 2025
709e961
Merge branch 'feature/visualize-qnode' into feature/control-flow-clus…
andrijapau Dec 2, 2025
b51bb7b
fix
andrijapau Dec 2, 2025
89f45f3
fix
andrijapau Dec 2, 2025
b45b2f0
fix
andrijapau Dec 2, 2025
2028fa7
fix
andrijapau Dec 2, 2025
4e994e6
simplify PR by making it for ...
andrijapau Dec 2, 2025
e590847
format
andrijapau Dec 2, 2025
eb6a0c3
fix tests
andrijapau Dec 2, 2025
7eb31b6
format
andrijapau Dec 2, 2025
8e787c9
fix logic in flatten if op
andrijapau Dec 2, 2025
8b6287f
format
andrijapau Dec 2, 2025
83ebb18
fix type hinting
andrijapau Dec 2, 2025
6d84d36
add dev comment
andrijapau Dec 2, 2025
3c42841
more deviceop tests
andrijapau Dec 2, 2025
e319aae
Apply suggestion from @andrijapau
andrijapau Dec 2, 2025
1c9c857
re-order changelog
andrijapau Dec 2, 2025
093a5d5
Merge branch 'feature/visualize-qnode' into feature/control-flow-clus…
andrijapau Dec 2, 2025
2ca7bb8
add cl entry
andrijapau Dec 2, 2025
61b70d9
add smaller fontsize for the conditional bit
andrijapau Dec 2, 2025
089cb14
both single and multi qnode have qjit bounding box
andrijapau Dec 3, 2025
2a2d55c
Apply suggestion from @andrijapau
andrijapau Dec 3, 2025
220c6d5
Merge branch 'feature/visualize-qnode' into feature/control-flow-clus…
andrijapau Dec 3, 2025
f7261a9
add more detail to the for loop label
andrijapau Dec 3, 2025
a8cd49c
format
andrijapau Dec 3, 2025
70b0d93
fix test
andrijapau Dec 3, 2025
cb05921
use counter instead of builtin id function
andrijapau Dec 4, 2025
1883fb3
whoops
andrijapau Dec 4, 2025
5e2d456
Apply suggestion from @andrijapau
andrijapau Dec 4, 2025
36b5f7d
Apply suggestion from @andrijapau
andrijapau Dec 4, 2025
ee15b67
Apply suggestion from @andrijapau
andrijapau Dec 4, 2025
16e003d
add two counters
andrijapau Dec 4, 2025
23561f7
Merge branch 'feature/visualize-qnode' into feature/control-flow-clus…
andrijapau Dec 4, 2025
d5ccaf7
use the counters for uid
andrijapau Dec 4, 2025
1dd9f38
update tests to be simpler
andrijapau Dec 4, 2025
6a9b01d
fix tests
andrijapau Dec 4, 2025
a2ac9ff
minor fix
andrijapau Dec 4, 2025
0dbe4fe
foramt
andrijapau Dec 4, 2025
d92aea4
Merge branch 'feature/visualize-qnode' into feature/control-flow-clus…
andrijapau Dec 4, 2025
8afc67a
Apply suggestion from @andrijapau
andrijapau Dec 4, 2025
c0d4d67
update tests
andrijapau Dec 4, 2025
9706967
update tests
andrijapau Dec 4, 2025
5e62c31
format
andrijapau Dec 4, 2025
1474a66
whoops fix test
andrijapau Dec 4, 2025
82430af
Merge branch 'feature/visualize-qnode' into feature/control-flow-clus…
andrijapau Dec 4, 2025
ced6f75
format
andrijapau Dec 4, 2025
5641e68
fix test
andrijapau Dec 4, 2025
22c8ae1
add more nested testing
andrijapau Dec 4, 2025
ab7c471
format
andrijapau Dec 4, 2025
9996684
fix test
andrijapau Dec 4, 2025
c262df9
format
andrijapau Dec 4, 2025
506f839
fix labels
andrijapau Dec 4, 2025
f67802f
fix labels
andrijapau Dec 4, 2025
30db67e
Merge branch 'feature/graph-visualization' into feature/control-flow-…
andrijapau Dec 5, 2025
d069fef
fix
andrijapau Dec 5, 2025
e29f546
bring back ssavalue
andrijapau Dec 5, 2025
b34d8e2
format
andrijapau Dec 5, 2025
aa1d90c
format
andrijapau Dec 5, 2025
27ff971
remove random import
andrijapau Dec 5, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions doc/releases/changelog-dev.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
[(#2214)](https://github.com/PennyLaneAI/catalyst/pull/2214)
[(#2246)](https://github.com/PennyLaneAI/catalyst/pull/2246)
[(#2231)](https://github.com/PennyLaneAI/catalyst/pull/2231)
[(#2234)](https://github.com/PennyLaneAI/catalyst/pull/2234)

* Added ``catalyst.switch``, a qjit compatible, index-switch style control flow decorator.
[(#2171)](https://github.com/PennyLaneAI/catalyst/pull/2171)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,10 +16,10 @@

from functools import singledispatchmethod

from xdsl.dialects import builtin, func
from xdsl.ir import Block, Operation, Region
from xdsl.dialects import builtin, func, scf
from xdsl.ir import Block, Operation, Region, SSAValue

from catalyst.python_interface.dialects import catalyst, quantum
from catalyst.python_interface.dialects import quantum
from catalyst.python_interface.visualization.dag_builder import DAGBuilder


Expand Down Expand Up @@ -85,6 +85,97 @@ def _visit_block(self, block: Block) -> None:
for op in block.ops:
self._visit_operation(op)

# =============
# CONTROL FLOW
# =============

@_visit_operation.register
def _for_op(self, operation: scf.ForOp) -> None:
"""Handle an xDSL ForOp operation."""

uid = f"cluster{self._cluster_uid_counter}"
self.dag_builder.add_cluster(
uid,
node_label="for loop",
label="",
cluster_uid=self._cluster_uid_stack[-1],
)
self._cluster_uid_stack.append(uid)
self._cluster_uid_counter += 1

for region in operation.regions:
self._visit_region(region)

self._cluster_uid_stack.pop()

@_visit_operation.register
def _while_op(self, operation: scf.WhileOp) -> None:
"""Handle an xDSL WhileOp operation."""
uid = f"cluster{self._cluster_uid_counter}"
self.dag_builder.add_cluster(
uid,
node_label="while loop",
label="",
cluster_uid=self._cluster_uid_stack[-1],
)
self._cluster_uid_stack.append(uid)
self._cluster_uid_counter += 1

for region in operation.regions:
self._visit_region(region)

self._cluster_uid_stack.pop()

@_visit_operation.register
def _if_op(self, operation: scf.IfOp):
"""Handles the scf.IfOp operation."""
flattened_if_op: list[tuple[SSAValue | None, Region]] = _flatten_if_op(operation)

uid = f"cluster{self._cluster_uid_counter}"
self.dag_builder.add_cluster(
uid,
node_label="",
label="conditional",
labeljust="l",
cluster_uid=self._cluster_uid_stack[-1],
)
self._cluster_uid_stack.append(uid)
self._cluster_uid_counter += 1

# Loop through each branch and visualize as a cluster
num_regions = len(flattened_if_op)
for i, (condition_ssa, region) in enumerate(flattened_if_op):

def _get_conditional_branch_label(i):
if i == 0:
return "if"
elif i == num_regions - 1:
return "else"
else:
return "elif"

uid = f"cluster{self._cluster_uid_counter}"
self.dag_builder.add_cluster(
uid,
node_label=_get_conditional_branch_label(i),
label="",
style="dashed",
penwidth=1,
cluster_uid=self._cluster_uid_stack[-1],
)
self._cluster_uid_stack.append(uid)
self._cluster_uid_counter += 1

# Go recursively into the branch to process internals
self._visit_region(region)

# Pop branch cluster after processing to ensure
# logical branches are treated as 'parallel'
self._cluster_uid_stack.pop()

# Pop IfOp cluster before leaving this handler
self._cluster_uid_stack.pop()

# ============
# DEVICE NODE
# ============
Expand Down Expand Up @@ -138,3 +229,28 @@ def _func_return(self, operation: func.ReturnOp) -> None:
# If we hit a func.return operation we know we are leaving
# the FuncOp's scope and so we can pop the ID off the stack.
self._cluster_uid_stack.pop()


def _flatten_if_op(op: scf.IfOp) -> list[tuple[SSAValue | None, Region]]:
"""Recursively flattens a nested IfOp (if/elif/else chains)."""

condition_ssa: SSAValue = op.operands[0]
then_region, else_region = op.regions

# Save condition SSA in case we want to visualize it eventually
flattened_op: list[tuple[SSAValue | None, Region]] = [(condition_ssa, then_region)]

# Peak into else region to see if there's another IfOp
else_block: Block = else_region.block
# Completely relies on the structure that the second last operation
# will be an IfOp (seems to hold true)
if isinstance(else_block.ops.last.prev_op, scf.IfOp):
# Recursively flatten any IfOps found in said block
nested_flattened_op = _flatten_if_op(else_block.ops.last.prev_op)
flattened_op.extend(nested_flattened_op)
return flattened_op

# No more nested IfOps, therefore append final region
# with no SSAValue
flattened_op.extend([(None, else_region)])
return flattened_op
Loading