Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
109 commits
Select commit Hold shift + click to select a range
5ac829c
cl
andrijapau Nov 20, 2025
855fa4c
Apply suggestion from @andrijapau
andrijapau Nov 20, 2025
13cc8fc
initial commit
andrijapau Nov 20, 2025
6d46558
whoops, forgot parent graph id
andrijapau Nov 20, 2025
13935f3
Merge branch 'feature/mlir-to-dag-pass' into feature/visualize-nodes
andrijapau Nov 20, 2025
57f2a83
Merge branch 'feature/mlir-to-dag-pass' into feature/visualize-nodes
andrijapau Nov 20, 2025
518f756
only get labels for easy stuff for now
andrijapau Nov 20, 2025
aa5f7b6
typo
andrijapau Nov 20, 2025
20bc6cc
Merge branch 'feature/mlir-to-dag-pass' into feature/visualize-nodes
andrijapau Nov 20, 2025
5ffb87f
whoops
andrijapau Nov 20, 2025
3a1f077
whoops
andrijapau Nov 20, 2025
f9a6100
whoops
andrijapau Nov 20, 2025
c85d592
add more support
andrijapau Nov 21, 2025
d7f2ebb
Merge branch 'feature/mlir-to-dag-pass' into feature/visualize-nodes
andrijapau Nov 21, 2025
0a1950a
add support for other ops
andrijapau Nov 21, 2025
a4a9955
Merge branch 'feature/mlir-to-dag-pass' into feature/visualize-nodes
andrijapau Nov 21, 2025
f9380a7
Merge branch 'feature/mlir-to-dag-pass' into feature/visualize-nodes
andrijapau Nov 22, 2025
7c1b495
get rid of cluster stuff
andrijapau Nov 22, 2025
f19f605
add test classes
andrijapau Nov 22, 2025
04413ec
add basic test skeleton
andrijapau Nov 22, 2025
314de1f
add more tests
andrijapau Nov 24, 2025
552aaf4
clean-up
andrijapau Nov 24, 2025
14bcec4
Merge branch 'feature/mlir-to-dag-pass' into feature/visualize-nodes
andrijapau Nov 24, 2025
c1cc80a
update test
andrijapau Nov 24, 2025
aa4d241
update test
andrijapau Nov 24, 2025
d418cb0
clean up
andrijapau Nov 24, 2025
d3a5c0d
temp test
andrijapau Nov 24, 2025
23a9904
Merge branch 'feature/mlir-to-dag-pass' into feature/visualize-nodes
andrijapau Nov 24, 2025
4bb4f38
update custom op test
andrijapau Nov 24, 2025
13948f5
Merge branch 'feature/mlir-to-dag-pass' into feature/visualize-nodes
andrijapau Nov 24, 2025
9580d9e
update test with fake dag builder
andrijapau Nov 24, 2025
2ff7723
parametrize over ops
andrijapau Nov 24, 2025
fac9f27
improvements
andrijapau Nov 24, 2025
e3f2e58
whoops
andrijapau Nov 24, 2025
ed5316e
fix and add test
andrijapau Nov 24, 2025
fe25ff6
add test case
andrijapau Nov 24, 2025
cb89995
more tests
andrijapau Nov 24, 2025
e25b016
cleanup
andrijapau Nov 24, 2025
d766ddd
add expval var test
andrijapau Nov 24, 2025
1db0c6c
whoops typo
andrijapau Nov 24, 2025
fbf9b04
add test for mid measure
andrijapau Nov 24, 2025
3576c81
add more tests
andrijapau Nov 24, 2025
9df1f89
clarify tests
andrijapau Nov 24, 2025
f5f1a9b
cleanup and tests
andrijapau Nov 25, 2025
ba6ec87
Merge branch 'feature/mlir-to-dag-pass' into feature/visualize-nodes
andrijapau Nov 25, 2025
4203f51
Merge branch 'feature/mlir-to-dag-pass' into feature/visualize-nodes
andrijapau Nov 25, 2025
b4a0cb2
clean-up
andrijapau Nov 25, 2025
3bdf9ff
fix mock dagbuilder
andrijapau Nov 25, 2025
89af208
Merge branch 'feature/mlir-to-dag-pass' into feature/visualize-nodes
andrijapau Nov 25, 2025
7dc2491
whoops
andrijapau Nov 25, 2025
464ed8b
clean-up
andrijapau Nov 25, 2025
92b1c19
improve testing
andrijapau Nov 25, 2025
da995c9
Merge branch 'feature/mlir-to-dag-pass' into feature/visualize-nodes
andrijapau Nov 25, 2025
5eaf7df
cleanup
andrijapau Nov 25, 2025
70f8b80
Apply suggestion from @andrijapau
andrijapau Nov 25, 2025
6a867b1
Merge branch 'feature/mlir-to-dag-pass' into feature/visualize-nodes
andrijapau Nov 25, 2025
4f3814a
run black
andrijapau Nov 25, 2025
c194099
Merge branch 'feature/mlir-to-dag-pass' into feature/visualize-nodes
andrijapau Nov 25, 2025
91c11a3
isort
andrijapau Nov 25, 2025
41327e0
fix import
andrijapau Nov 25, 2025
dc362cd
Merge branch 'feature/mlir-to-dag-pass' into feature/visualize-nodes
andrijapau Nov 25, 2025
2b2333e
Merge branch 'feature/mlir-to-dag-pass' into feature/visualize-nodes
andrijapau Nov 25, 2025
bcba0b5
black
andrijapau Nov 25, 2025
c8a49e8
Merge branch 'feature/mlir-to-dag-pass' into feature/visualize-nodes
andrijapau Nov 25, 2025
0659cdf
Merge branch 'feature/mlir-to-dag-pass' into feature/visualize-nodes
andrijapau Nov 26, 2025
1d8ac14
Merge branch 'feature/control-flow-clusters' into feature/visualize-n…
andrijapau Dec 2, 2025
9d724bf
Merge branch 'feature/control-flow-clusters' into feature/visualize-n…
andrijapau Dec 2, 2025
3a2ab18
Merge branch 'feature/control-flow-clusters' into feature/visualize-n…
andrijapau Dec 2, 2025
e9c69d8
format
andrijapau Dec 2, 2025
f47b1a5
fix id to uid
andrijapau Dec 2, 2025
5e83fe4
fix
andrijapau Dec 2, 2025
d5a0611
Apply suggestion from @andrijapau
andrijapau Dec 2, 2025
98bf7ea
clean-up
andrijapau Dec 2, 2025
818448c
clean up
andrijapau Dec 2, 2025
b924c43
format
andrijapau Dec 2, 2025
44bf9d3
Merge branch 'feature/control-flow-clusters' into feature/visualize-n…
andrijapau Dec 3, 2025
d983e97
Merge branch 'feature/control-flow-clusters' into feature/visualize-n…
andrijapau Dec 3, 2025
649aed2
Merge branch 'feature/control-flow-clusters' into feature/visualize-n…
andrijapau Dec 4, 2025
9c74b6a
update id
andrijapau Dec 4, 2025
4ffc9d3
Merge branch 'feature/control-flow-clusters' into feature/visualize-n…
andrijapau Dec 4, 2025
dd1df44
adjust test
andrijapau Dec 4, 2025
57409bd
Merge branch 'feature/control-flow-clusters' into feature/visualize-n…
andrijapau Dec 4, 2025
303fb03
Merge branch 'feature/control-flow-clusters' into feature/visualize-n…
andrijapau Dec 4, 2025
05df88c
Merge branch 'feature/control-flow-clusters' into feature/visualize-n…
andrijapau Dec 4, 2025
3175efa
add tests
andrijapau Dec 4, 2025
194b357
fix get_nodes -> nodes
andrijapau Dec 4, 2025
ad35efc
Merge branch 'feature/control-flow-clusters' into feature/visualize-n…
andrijapau Dec 4, 2025
fac6150
fix measure
andrijapau Dec 5, 2025
9bdf8da
fix globalphase test
andrijapau Dec 5, 2025
b9479b1
fix sample test
andrijapau Dec 5, 2025
60e83c4
fix sample
andrijapau Dec 5, 2025
ebd108e
format
andrijapau Dec 5, 2025
bfd1d10
add dev comment
andrijapau Dec 5, 2025
aec9f83
fix code
andrijapau Dec 5, 2025
c36a43e
fix naming
andrijapau Dec 5, 2025
6c1d825
add expected error messages
andrijapau Dec 5, 2025
7b56f89
fix test for probs
andrijapau Dec 5, 2025
4f83355
format
andrijapau Dec 5, 2025
9f6a131
add compileerror
andrijapau Dec 5, 2025
9855985
update
andrijapau Dec 5, 2025
2fe2074
Merge branch 'feature/control-flow-clusters' into feature/visualize-n…
andrijapau Dec 5, 2025
b65ae16
Merge branch 'feature/control-flow-clusters' into feature/visualize-n…
andrijapau Dec 5, 2025
d3fdfea
Merge branch 'feature/control-flow-clusters' into feature/visualize-n…
andrijapau Dec 5, 2025
1a0ac68
Merge branch 'feature/control-flow-clusters' into feature/visualize-n…
andrijapau Dec 5, 2025
5e3a6d2
re-work node labels to be records with ports
andrijapau Dec 5, 2025
a25f7b4
format
andrijapau Dec 5, 2025
02d4a55
fix tests
andrijapau Dec 5, 2025
7237a3f
move mid measure to an operator
andrijapau Dec 5, 2025
6410aae
fix test
andrijapau Dec 6, 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 @@ -9,6 +9,7 @@
[(#2246)](https://github.com/PennyLaneAI/catalyst/pull/2246)
[(#2231)](https://github.com/PennyLaneAI/catalyst/pull/2231)
[(#2234)](https://github.com/PennyLaneAI/catalyst/pull/2234)
[(#2118)](https://github.com/PennyLaneAI/catalyst/pull/2218)

* 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 @@ -14,12 +14,18 @@

"""Contains the ConstructCircuitDAG tool for constructing a DAG from an xDSL module."""

from functools import singledispatchmethod
from functools import singledispatch, singledispatchmethod

from pennylane.measurements import MeasurementProcess
from pennylane.operation import Operator
from xdsl.dialects import builtin, func, scf
from xdsl.ir import Block, Operation, Region, SSAValue

from catalyst.python_interface.dialects import quantum
from catalyst.python_interface.inspection.xdsl_conversion import (
xdsl_to_qml_measurement,
xdsl_to_qml_op,
)
from catalyst.python_interface.visualization.dag_builder import DAGBuilder


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

# ===================
# QUANTUM OPERATIONS
# ===================

@_visit_operation.register
def _unitary(
self,
op: quantum.CustomOp | quantum.GlobalPhaseOp | quantum.QubitUnitaryOp | quantum.MultiRZOp,
) -> None:
"""Generic handler for unitary gates."""

# Create PennyLane instance
qml_op = xdsl_to_qml_op(op)

# Add node to current cluster
node_uid = f"node{self._node_uid_counter}"
self.dag_builder.add_node(
uid=node_uid,
label=get_label(qml_op),
cluster_uid=self._cluster_uid_stack[-1],
# NOTE: "record" allows us to use ports (https://graphviz.org/doc/info/shapes.html#record)
shape="record",
)
self._node_uid_counter += 1

@_visit_operation.register
def _projective_measure_op(self, op: quantum.MeasureOp) -> None:
"""Handler for the single-qubit projective measurement operation."""

# Create PennyLane instance
meas = xdsl_to_qml_measurement(op)

# Add node to current cluster
node_uid = f"node{self._node_uid_counter}"
self.dag_builder.add_node(
uid=node_uid,
label=get_label(meas),
cluster_uid=self._cluster_uid_stack[-1],
# NOTE: "record" allows us to use ports (https://graphviz.org/doc/info/shapes.html#record)
shape="record",
)
self._node_uid_counter += 1

# =====================
# QUANTUM MEASUREMENTS
# =====================

@_visit_operation.register
def _state_op(self, op: quantum.StateOp) -> None:
"""Handler for the terminal state measurement operation."""

# Create PennyLane instance
meas = xdsl_to_qml_measurement(op)

# Add node to current cluster
node_uid = f"node{self._node_uid_counter}"
self.dag_builder.add_node(
uid=node_uid,
label=get_label(meas),
cluster_uid=self._cluster_uid_stack[-1],
fillcolor="lightpink",
color="lightpink3",
)
self._node_uid_counter += 1

@_visit_operation.register
def _statistical_measurement_ops(
self,
op: quantum.ExpvalOp | quantum.VarianceOp,
) -> None:
"""Handler for statistical measurement operations."""

# Create PennyLane instance
obs_op = op.obs.owner
meas = xdsl_to_qml_measurement(op, xdsl_to_qml_measurement(obs_op))

# Add node to current cluster
node_uid = f"node{self._node_uid_counter}"
self.dag_builder.add_node(
uid=node_uid,
label=get_label(meas),
cluster_uid=self._cluster_uid_stack[-1],
fillcolor="lightpink",
color="lightpink3",
)
self._node_uid_counter += 1

@_visit_operation.register
def _visit_sample_and_probs_ops(
self,
op: quantum.SampleOp | quantum.ProbsOp,
) -> None:
"""Handler for sample operations."""

# Create PennyLane instance
obs_op = op.obs.owner

# TODO: This doesn't logically make sense, but quantum.compbasis
# is obs_op and function below just pulls out the static wires
wires = xdsl_to_qml_measurement(obs_op)
meas = xdsl_to_qml_measurement(op, wires=None if wires == [] else wires)

# Add node to current cluster
node_uid = f"node{self._node_uid_counter}"
self.dag_builder.add_node(
uid=node_uid,
label=get_label(meas),
cluster_uid=self._cluster_uid_stack[-1],
fillcolor="lightpink",
color="lightpink3",
)
self._node_uid_counter += 1

# =============
# CONTROL FLOW
# =============
Expand Down Expand Up @@ -254,3 +373,26 @@ def _flatten_if_op(op: scf.IfOp) -> list[tuple[SSAValue | None, Region]]:
# with no SSAValue
flattened_op.extend([(None, else_region)])
return flattened_op


@singledispatch
def get_label(op: Operator | MeasurementProcess) -> str:
"""Gets the appropriate label for a PennyLane object."""
return str(op)


@get_label.register
def _operator(op: Operator) -> str:
"""Returns the appropriate label for an xDSL operation."""
wires = list(op.wires.labels)
if wires == []:
wires_str = "all"
else:
wires_str = f"[{', '.join(map(str, wires))}]"
return f"<name> {op.name}|<wire> {wires_str}"


@get_label.register
def _mp(mp: MeasurementProcess) -> str:
"""Returns the appropriate label for an xDSL operation."""
return str(mp)
Loading