qrisp.jasp.Jaspr.to_catalyst_mlir#

Jaspr.to_catalyst_mlir() str | None[source]#

Compiles the Jaspr to MLIR using the Catalyst dialect.

Requires the Catalyst package to be installed (pip install qrisp[catalyst]).

Returns:
str

The MLIR string.

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 = QuantumFloat(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_catalyst_mlir())
module @jaspr_function {
  func.func public @jit_jaspr_function(%arg0: tensor<i64>)
      -> tensor<f64> attributes {llvm.emit_c_interface} {
    %cst = stablehlo.constant dense<1.000000e+00> : tensor<f64>
    %c_4 = stablehlo.constant dense<0> : tensor<i64>
    %c0_i64 = arith.constant 0 : i64
    quantum.device shots(%c0_i64) [..., "LightningSimulator",
        "{'mcmc': False, 'num_burnin': 0, 'kernel_name': None}"] {auto_qubit_management}
    %0 = quantum.alloc( 20) : !quantum.reg
    ... (bookkeeping: a %c_3-seeded ``stablehlo.while`` populates a
         30-entry index stack via calls to @_pop/@_append, resolving
         the dynamic qubit positions %11 and %19 used below) ...
    %extracted = tensor.extract %11[] : tensor<i64>
    %20 = quantum.extract %0[%extracted] : !quantum.reg -> !quantum.bit
    %extracted_5 = tensor.extract %19[] : tensor<i64>
    %21 = quantum.extract %0[%extracted_5] : !quantum.reg -> !quantum.bit
    %out_qubits:2 = quantum.custom "CNOT"() %20, %21 : !quantum.bit, !quantum.bit
    %extracted_6 = tensor.extract %11[] : tensor<i64>
    %22 = quantum.insert %0[%extracted_6], %out_qubits#0 : !quantum.reg, !quantum.bit
    %extracted_7 = tensor.extract %19[] : tensor<i64>
    %23 = quantum.insert %22[%extracted_7], %out_qubits#1 : !quantum.reg, !quantum.bit
    %extracted_8 = tensor.extract %19[] : tensor<i64>
    %24 = quantum.extract %23[%extracted_8] : !quantum.reg -> !quantum.bit
    %out_qubits_9 = quantum.custom "T"() %24 : !quantum.bit
    %extracted_10 = tensor.extract %19[] : tensor<i64>
    %25 = quantum.insert %23[%extracted_10], %out_qubits_9 : !quantum.reg, !quantum.bit
    %26:3 = scf.while (%arg1 = %c_4, %arg2 = %c_4, %arg3 = %25) : (tensor<i64>, tensor<i64>, !quantum.reg)
        -> (tensor<i64>, tensor<i64>, !quantum.reg) {
      ...
    } do {
    ^bb0(%arg1: tensor<i64>, %arg2: tensor<i64>, %arg3: !quantum.reg):
      ...
      %mres, %out_qubit = quantum.measure %35 : i1, !quantum.bit
      ...
      scf.yield %41, %40, %36 : tensor<i64>, tensor<i64>, !quantum.reg
    }
    %27 = stablehlo.convert %26#1 : (tensor<i64>) -> tensor<f64>
    %28 = stablehlo.multiply %27, %cst : tensor<f64>
    %29 = stablehlo.add %28, %cst : tensor<f64>
    return %29 : tensor<f64>
  }
  func.func private @make_tracer(...) { ... }
  func.func private @_pop(...) { ... }
  func.func private @_append(...) { ... }
  func.func @setup() {
    quantum.init
    return
  }
  func.func @teardown() {
    quantum.finalize
    return
  }
}