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>
  }
}