Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
220 commits
Select commit Hold shift + click to select a range
265cd4d
copy files over
andrijapau Nov 19, 2025
e9ceaa7
add pydot to requirements.txt
andrijapau Nov 19, 2025
ae50ca1
add files
andrijapau Nov 19, 2025
a0e37b0
rename
andrijapau Nov 19, 2025
76b5565
add base class
andrijapau Nov 19, 2025
659f480
quick changes
andrijapau Nov 19, 2025
8699557
add control flow support
andrijapau Nov 19, 2025
db6edc9
clean-up
andrijapau Nov 19, 2025
2be63e4
Apply suggestion from @andrijapau
andrijapau Nov 20, 2025
12fa2af
Apply suggestion from @andrijapau
andrijapau Nov 20, 2025
2c93330
Apply suggestion from @andrijapau
andrijapau Nov 20, 2025
e68c3f4
Apply suggestion from @andrijapau
andrijapau Nov 20, 2025
4aad864
Apply suggestion from @andrijapau
andrijapau Nov 20, 2025
3be39dc
update cluster label logic
andrijapau Nov 20, 2025
a383ba8
fix dag builders test
andrijapau Nov 20, 2025
8ddaa5d
fix pydot dag builders test
andrijapau Nov 20, 2025
1166f40
update doc
andrijapau Nov 20, 2025
b0fbf7e
Merge branch 'feature/graph-visualization' into feature/dag-builders
andrijapau Nov 20, 2025
df9bf45
basic cl
andrijapau Nov 20, 2025
bd75450
Merge branch 'feature/dag-builders' into feature/mlir-to-dag-pass
andrijapau Nov 20, 2025
8ca5b1f
basic cl
andrijapau Nov 20, 2025
b579a3f
Trigger CI
andrijapau Nov 20, 2025
a94d843
Trigger CI
andrijapau Nov 20, 2025
331e349
Apply suggestion from @andrijapau
andrijapau Nov 20, 2025
a87d117
just do customop
andrijapau Nov 20, 2025
9713aa3
fix wording
andrijapau Nov 20, 2025
68e8453
Merge branch 'feature/graph-visualization' into feature/dag-builders
andrijapau Nov 20, 2025
8faae36
Merge branch 'feature/dag-builders' into feature/mlir-to-dag-pass
andrijapau Nov 20, 2025
7bbc224
rename
andrijapau Nov 20, 2025
d6db965
add back
andrijapau Nov 20, 2025
11b08f0
Update frontend/catalyst/python_interface/visualization/pydot_dag_bui…
andrijapau Nov 20, 2025
a76b5bd
Update frontend/catalyst/python_interface/visualization/pydot_dag_bui…
andrijapau Nov 20, 2025
66a87ab
Merge branch 'feature/dag-builders' into feature/mlir-to-dag-pass
andrijapau Nov 20, 2025
90e4ebd
fix
andrijapau Nov 20, 2025
3d9e4bb
fix
andrijapau Nov 20, 2025
e303ef1
Merge branch 'feature/graph-visualization' into feature/mlir-to-dag-pass
andrijapau Nov 20, 2025
2504c13
clean-up
andrijapau Nov 21, 2025
4e78777
remove unnecessary stuff
andrijapau Nov 21, 2025
e17c111
add test skeleton
andrijapau Nov 21, 2025
19ca1b5
add basic tests
andrijapau Nov 21, 2025
7f88834
basic test idea
andrijapau Nov 21, 2025
3d48c92
make visit private
andrijapau Nov 21, 2025
49b3834
make visit private
andrijapau Nov 21, 2025
80ca59d
fix tests
andrijapau Nov 21, 2025
430ceb8
fix tests
andrijapau Nov 22, 2025
0aff4e5
clean-up
andrijapau Nov 24, 2025
e22cbd2
fix: upgrade DAG builders to have get_ methods
andrijapau Nov 24, 2025
acf3da7
cl
andrijapau Nov 24, 2025
bc978ad
update pydot to adhere to new base class methods
andrijapau Nov 24, 2025
dc4cb1c
add test skeletons
andrijapau Nov 24, 2025
7e825d6
add tests
andrijapau Nov 24, 2025
41fc4d1
Apply suggestion from @andrijapau
andrijapau Nov 24, 2025
1868346
add tests
andrijapau Nov 24, 2025
fd8d721
fix tests
andrijapau Nov 24, 2025
284ba07
update tests
andrijapau Nov 24, 2025
95ace87
fix documentation
andrijapau Nov 24, 2025
ec9caae
fix documentation
andrijapau Nov 24, 2025
99bd602
fix tests
andrijapau Nov 24, 2025
7622b50
whoops
andrijapau Nov 24, 2025
86e8389
whoops
andrijapau Nov 24, 2025
a5dc1ac
rename a bunch of stuff
andrijapau Nov 24, 2025
fe7ef47
fix documentation
andrijapau Nov 24, 2025
b2a13cf
rename a bunch of stuff
andrijapau Nov 24, 2025
abfd932
add dev comment
andrijapau Nov 24, 2025
a481a04
rename
andrijapau Nov 24, 2025
9a18e5c
update test
andrijapau Nov 24, 2025
afa60ee
merge fix/upgrade-dag-builders to feature/mlir-to-dag-pass
andrijapau Nov 24, 2025
0f6ab76
add immutability tests
andrijapau Nov 24, 2025
5584c90
Merge branch 'fix/upgrade-dag-builders' into feature/mlir-to-dag-pass
andrijapau Nov 24, 2025
6d15d7b
clean-up
andrijapau Nov 25, 2025
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
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
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
19af1c7
clean-up
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
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
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
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
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
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
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
3b1d25e
remove unused
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
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
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
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
2a960cf
improve device test
andrijapau Nov 26, 2025
a21e6dd
fix black isort
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
83225b3
Merge branch 'feature/graph-visualization' into feature/mlir-to-dag-pass
andrijapau Nov 26, 2025
7d04249
fix tests
andrijapau Nov 26, 2025
941675f
Merge branch 'feature/mlir-to-dag-pass' into feature/visualize-qnode
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
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
fd26a37
whoops
andrijapau Nov 27, 2025
1ad2ec0
format
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
3a8da55
Apply suggestion from @andrijapau
andrijapau Nov 28, 2025
26e95f9
format
andrijapau Nov 28, 2025
c9594ee
fix
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
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
1c9c857
re-order changelog
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
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
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
1474a66
whoops fix test
andrijapau Dec 4, 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 @@ -7,6 +7,7 @@
[(#2229)](https://github.com/PennyLaneAI/catalyst/pull/2229)
[(#2214)](https://github.com/PennyLaneAI/catalyst/pull/2214)
[(#2246)](https://github.com/PennyLaneAI/catalyst/pull/2246)
[(#2231)](https://github.com/PennyLaneAI/catalyst/pull/2231)

* 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,9 +16,10 @@

from functools import singledispatchmethod

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

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


Expand All @@ -40,13 +41,27 @@ class ConstructCircuitDAG:
def __init__(self, dag_builder: DAGBuilder) -> None:
self.dag_builder: DAGBuilder = dag_builder

# Keep track of nesting clusters using a stack
self._cluster_uid_stack: list[str] = []

# Use counter internally for UID
self._node_uid_counter: int = 0
self._cluster_uid_counter: int = 0

def _reset(self) -> None:
"""Resets the instance."""
self._cluster_uid_stack: list[str] = []
self._node_uid_counter: int = 0
self._cluster_uid_counter: int = 0

def construct(self, module: builtin.ModuleOp) -> None:
"""Constructs the DAG from the module.

Args:
module (xdsl.builtin.ModuleOp): The module containing the quantum program to visualize.

"""
self._reset()
for op in module.ops:
self._visit_operation(op)

Expand All @@ -69,3 +84,57 @@ def _visit_block(self, block: Block) -> None:
"""Visit an xDSL Block operation, dispatching handling for each contained Operation."""
for op in block.ops:
self._visit_operation(op)

# ============
# DEVICE NODE
# ============

@_visit_operation.register
def _device_init(self, operation: quantum.DeviceInitOp) -> None:
"""Handles the initialization of a quantum device."""
node_id = f"node{self._node_uid_counter}"
self.dag_builder.add_node(
node_id,
label=operation.device_name.data,
cluster_uid=self._cluster_uid_stack[-1],
fillcolor="grey",
color="black",
penwidth=2,
shape="rectangle",
)
self._node_uid_counter += 1

# =======================
# FuncOp NESTING UTILITY
# =======================

@_visit_operation.register
def _func_op(self, operation: func.FuncOp) -> None:
"""Visit a FuncOp Operation."""

label = operation.sym_name.data
if "jit_" in operation.sym_name.data:
label = "qjit"

uid = f"cluster{self._cluster_uid_counter}"
parent_cluster_uid = None if self._cluster_uid_stack == [] else self._cluster_uid_stack[-1]
self.dag_builder.add_cluster(
uid,
label=label,
cluster_uid=parent_cluster_uid,
)
self._cluster_uid_counter += 1
self._cluster_uid_stack.append(uid)

self._visit_block(operation.regions[0].blocks[0])

@_visit_operation.register
def _func_return(self, operation: func.ReturnOp) -> None:
"""Handle func.return to exit FuncOp's cluster scope."""

# NOTE: Skip first cluster as it is the "base" of the graph diagram.
# In our case, it is the `qjit` bounding box.
if len(self._cluster_uid_stack) > 1:
# 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()
Original file line number Diff line number Diff line change
Expand Up @@ -19,12 +19,14 @@

pytestmark = pytest.mark.usefixtures("requires_xdsl")

# pylint: disable=wrong-import-position
# This import needs to be after pytest in order to prevent ImportErrors
import pennylane as qml
from xdsl.dialects import test
from xdsl.dialects.builtin import ModuleOp
from xdsl.ir.core import Block, Region

# pylint: disable=wrong-import-position
# This import needs to be after pytest in order to prevent ImportErrors
from catalyst.python_interface.conversion import xdsl_from_qjit
from catalyst.python_interface.visualization.construct_circuit_dag import (
ConstructCircuitDAG,
)
Expand Down Expand Up @@ -124,3 +126,164 @@ def test_does_not_mutate_module():

# Ensure not mutated
assert str(module_op) == module_op_str_before


@pytest.mark.unit
class TestFuncOpVisualization:
"""Tests the visualization of FuncOps with bounding boxes"""

def test_standard_qnode(self):
"""Tests that a standard QJIT'd QNode is visualized correctly"""
dev = qml.device("null.qubit", wires=1)

@xdsl_from_qjit
@qml.qjit(autograph=True, target="mlir")
@qml.qnode(dev)
def my_workflow():
qml.H(0)

module = my_workflow()

utility = ConstructCircuitDAG(FakeDAGBuilder())
utility.construct(module)

graph_clusters = utility.dag_builder.clusters

# Check nesting is correct
# graph
# └── qjit
# └── my_workflow

# Check qjit is nested under graph
assert graph_clusters["cluster0"]["cluster_label"] == "qjit"
assert graph_clusters["cluster0"]["parent_cluster_uid"] is None

# Check that my_workflow is under qjit
assert graph_clusters["cluster1"]["cluster_label"] == "my_workflow"
assert graph_clusters["cluster1"]["parent_cluster_uid"] == "cluster0"

def test_nested_qnodes(self):
"""Tests that nested QJIT'd QNodes are visualized correctly"""

dev = qml.device("null.qubit", wires=1)

@qml.qnode(dev)
def my_qnode2():
qml.X(0)

@qml.qnode(dev)
def my_qnode1():
qml.H(0)

@xdsl_from_qjit
@qml.qjit(autograph=True, target="mlir")
def my_workflow():
my_qnode1()
my_qnode2()

module = my_workflow()

utility = ConstructCircuitDAG(FakeDAGBuilder())
utility.construct(module)

graph_clusters = utility.dag_builder.clusters

# Check nesting is correct
# graph
# └── qjit
# ├── my_qnode1
# └── my_qnode2

# Check qjit is under graph
assert graph_clusters["cluster0"]["cluster_label"] == "qjit"
assert graph_clusters["cluster0"]["parent_cluster_uid"] is None

# Check both qnodes are under my_workflow
assert graph_clusters["cluster1"]["cluster_label"] == "my_qnode1"
assert graph_clusters["cluster1"]["parent_cluster_uid"] == "cluster0"

assert graph_clusters["cluster2"]["cluster_label"] == "my_qnode2"
assert graph_clusters["cluster2"]["parent_cluster_uid"] == "cluster0"


class TestDeviceNode:
"""Tests that the device node is correctly visualized."""

def test_standard_qnode(self):
"""Tests that a standard setup works."""

dev = qml.device("null.qubit", wires=1)

@xdsl_from_qjit
@qml.qjit(autograph=True, target="mlir")
@qml.qnode(dev)
def my_workflow():
qml.H(0)

module = my_workflow()

utility = ConstructCircuitDAG(FakeDAGBuilder())
utility.construct(module)

graph_nodes = utility.dag_builder.nodes
graph_clusters = utility.dag_builder.clusters

# Check nesting is correct
# graph
# └── qjit
# └── my_workflow: NullQubit

# Assert device node is inside my_workflow cluster
assert graph_clusters["cluster1"]["cluster_label"] == "my_workflow"
assert graph_nodes["node0"]["parent_cluster_uid"] == "cluster1"

# Assert label is as expected
assert graph_nodes["node0"]["label"] == "NullQubit"

def test_nested_qnodes(self):
"""Tests that nested QJIT'd QNodes are visualized correctly"""

dev1 = qml.device("null.qubit", wires=1)
dev2 = qml.device("lightning.qubit", wires=1)

@qml.qnode(dev2)
def my_qnode2():
qml.X(0)

@qml.qnode(dev1)
def my_qnode1():
qml.H(0)

@xdsl_from_qjit
@qml.qjit(autograph=True, target="mlir")
def my_workflow():
my_qnode1()
my_qnode2()

module = my_workflow()

utility = ConstructCircuitDAG(FakeDAGBuilder())
utility.construct(module)

graph_nodes = utility.dag_builder.nodes
graph_clusters = utility.dag_builder.clusters

# Check nesting is correct
# graph
# └── qjit
# ├── my_qnode1: NullQubit
# └── my_qnode2: LightningSimulator

# Assert lightning.qubit device node is inside my_qnode1 cluster
assert graph_clusters["cluster1"]["cluster_label"] == "my_qnode1"
assert graph_nodes["node0"]["parent_cluster_uid"] == "cluster1"

# Assert label is as expected
assert graph_nodes["node0"]["label"] == "NullQubit"

# Assert null qubit device node is inside my_qnode2 cluster
assert graph_clusters["cluster2"]["cluster_label"] == "my_qnode2"
assert graph_nodes["node1"]["parent_cluster_uid"] == "cluster2"

# Assert label is as expected
assert graph_nodes["node1"]["label"] == "LightningSimulator"