qrisp.jasp.Jaspr.to_mlir#
- Jaspr.to_mlir(lower_stablehlo: bool = False) Any[source]#
Compiles the Jaspr to an xDSL module using the Jasp Dialect.
Requires the xDSL package to be installed (
pip install qrisp[xdsl]).Note
An xDSL module can be visualized via:
print(xdsl_module)
and serialized to a string using:
from xdsl.printer import Printer Printer().print_op(xdsl_module)
- Parameters:
- lower_stablehlobool, optional
If True, runs additional MLIR passes to lower StableHLO operations (like arithmetic and data operations) to lower-level dialects such as linalg, arith, and tensor. StableHLO control flow involving quantum types is preserved and rewritten to SCF by xDSL. The default is False.
- Returns:
- xdsl.dialects.builtin.ModuleOp
An xDSL module representing the quantum computation.
Examples
We create a simple script and inspect the MLIR string:
from qrisp import * from qrisp.jasp import make_jaspr def example_function(i): qv = QuantumVariable(i) cx(qv[0], qv[1]) t(qv[1]) meas_res = measure(qv) meas_res += 1 return meas_res jaspr = make_jaspr(example_function)(2) print(jaspr.to_mlir())
builtin.module @jasp_module { func.func public @main(%arg13: tensor<i64>, %arg14: !jasp.QuantumState) -> (tensor<i64>, !jasp.QuantumState) { %0, %1 = jasp.create_qubits %arg13, %arg14 : tensor<i64>, !jasp.QuantumState -> !jasp.QubitArray, !jasp.QuantumState %2 = "stablehlo.constant"() <{value = dense<0> : tensor<i64>}> : () -> tensor<i64> %3 = jasp.get_qubit %0, %2 : !jasp.QubitArray, tensor<i64> -> !jasp.Qubit %4 = "stablehlo.constant"() <{value = dense<1> : tensor<i64>}> : () -> tensor<i64> %5 = jasp.get_qubit %0, %4 : !jasp.QubitArray, tensor<i64> -> !jasp.Qubit %6 = jasp.quantum_gate "cx" (%3, %5) , %1 : (!jasp.Qubit, !jasp.Qubit) , !jasp.QuantumState -> !jasp.QuantumState %7 = jasp.quantum_gate "t" (%5) , %6 : (!jasp.Qubit) , !jasp.QuantumState -> !jasp.QuantumState %8, %9 = jasp.measure %0, %7 : !jasp.QubitArray, !jasp.QuantumState -> tensor<i64>, !jasp.QuantumState %10 = "stablehlo.add"(%8, %4) : (tensor<i64>, tensor<i64>) -> tensor<i64> func.return %10, %9 : tensor<i64>, !jasp.QuantumState } func.func private @jasp.create_qubits(%arg11: tensor<i64>, %arg12: !jasp.QuantumState) -> (!jasp.QubitArray, !jasp.QuantumState) { %0, %1 = jasp.create_qubits %arg11, %arg12 : tensor<i64>, !jasp.QuantumState -> !jasp.QubitArray, !jasp.QuantumState func.return %0, %1 : !jasp.QubitArray, !jasp.QuantumState } func.func private @jasp.get_qubit(%arg9: !jasp.QubitArray, %arg10: tensor<i64>) -> !jasp.Qubit { %0 = jasp.get_qubit %arg9, %arg10 : !jasp.QubitArray, tensor<i64> -> !jasp.Qubit func.return %0 : !jasp.Qubit } func.func private @jasp.quantum_gate(%arg6: !jasp.Qubit, %arg7: !jasp.Qubit, %arg8: !jasp.QuantumState) -> !jasp.QuantumState { %0 = jasp.quantum_gate "cx" (%arg6, %arg7) , %arg8 : (!jasp.Qubit, !jasp.Qubit) , !jasp.QuantumState -> !jasp.QuantumState func.return %0 : !jasp.QuantumState } func.func private @jasp.quantum_gate_0(%arg4: !jasp.Qubit, %arg5: !jasp.QuantumState) -> !jasp.QuantumState { %0 = jasp.quantum_gate "t" (%arg4) , %arg5 : (!jasp.Qubit) , !jasp.QuantumState -> !jasp.QuantumState func.return %0 : !jasp.QuantumState } func.func private @jasp.measure(%arg2: !jasp.QubitArray, %arg3: !jasp.QuantumState) -> (tensor<i64>, !jasp.QuantumState) { %0, %1 = jasp.measure %arg2, %arg3 : !jasp.QubitArray, !jasp.QuantumState -> tensor<i64>, !jasp.QuantumState func.return %0, %1 : tensor<i64>, !jasp.QuantumState } func.func private @add(%arg0: tensor<i64>, %arg1: tensor<i64>) -> tensor<i64> { %0 = "stablehlo.add"(%arg0, %arg1) : (tensor<i64>, tensor<i64>) -> tensor<i64> func.return %0 : tensor<i64> } }