qrisp.jasp.Jaspr.to_mlir#

Jaspr.to_mlir()[source]#

Compiles the Jaspr to MLIR using the Catalyst dialect.

Parameters:
None
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_mlir())
            module @jaspr_function {
  func.func public @jit_jaspr_function(%arg0: tensor<i64>) -> tensor<i32> attributes {llvm.emit_c_interface} {
    %0 = stablehlo.constant dense<1> : tensor<i32>
    %1 = stablehlo.constant dense<2> : tensor<i64>
    %2 = stablehlo.constant dense<1> : tensor<i64>
    %3 = stablehlo.constant dense<0> : tensor<i64>
    quantum.device["/home/positr0nium/miniconda3/envs/qrisp/lib/python3.10/site-packages/catalyst/utils/../lib/librtd_lightning.so", "lightning.qubit", "{'shots': 0, 'mcmc': False, 'num_burnin': 0, 'kernel_name': None}"]
    %4 = quantum.alloc( 20) : !quantum.reg
    %5 = quantum.extract %4[ 0] : !quantum.reg -> !quantum.bit
    %6 = quantum.extract %4[ 1] : !quantum.reg -> !quantum.bit
    %out_qubits:2 = quantum.custom "CNOT"() %5, %6 : !quantum.bit, !quantum.bit
    %7 = quantum.insert %4[ 0], %out_qubits#0 : !quantum.reg, !quantum.bit
    %8 = quantum.insert %7[ 1], %out_qubits#1 : !quantum.reg, !quantum.bit
    %9 = quantum.extract %8[ 1] : !quantum.reg -> !quantum.bit
    %out_qubits_0 = quantum.custom "T"() %9 : !quantum.bit
    %10 = quantum.insert %8[ 1], %out_qubits_0 : !quantum.reg, !quantum.bit
    %11 = stablehlo.add %3, %arg0 : tensor<i64>
    %12:3 = scf.while (%arg1 = %3, %arg2 = %3, %arg3 = %10) : (tensor<i64>, tensor<i64>, !quantum.reg) -> (tensor<i64>, tensor<i64>, !quantum.reg) {
      %16 = stablehlo.compare  GE, %arg1, %11,  SIGNED : (tensor<i64>, tensor<i64>) -> tensor<i1>
      %extracted = tensor.extract %16[] : tensor<i1>
      scf.condition(%extracted) %arg1, %arg2, %arg3 : tensor<i64>, tensor<i64>, !quantum.reg
    } do {
    ^bb0(%arg1: tensor<i64>, %arg2: tensor<i64>, %arg3: !quantum.reg):
      %extracted = tensor.extract %arg1[] : tensor<i64>
      %16 = quantum.extract %arg3[%extracted] : !quantum.reg -> !quantum.bit
      %mres, %out_qubit = quantum.measure %16 : i1, !quantum.bit
      %from_elements = tensor.from_elements %mres : tensor<i1>
      %extracted_1 = tensor.extract %arg1[] : tensor<i64>
      %17 = quantum.insert %arg3[%extracted_1], %out_qubit : !quantum.reg, !quantum.bit
      %18 = stablehlo.subtract %arg1, %3 : tensor<i64>
      %19 = stablehlo.shift_left %1, %18 : tensor<i64>
      %20 = stablehlo.convert %from_elements : (tensor<i1>) -> tensor<i64>
      %21 = stablehlo.multiply %19, %20 : tensor<i64>
      %22 = stablehlo.add %arg2, %21 : tensor<i64>
      %23 = stablehlo.add %arg1, %2 : tensor<i64>
      scf.yield %23, %22, %17 : tensor<i64>, tensor<i64>, !quantum.reg
    }
    %13 = stablehlo.convert %12#1 : (tensor<i64>) -> tensor<i32>
    %14 = stablehlo.multiply %13, %0 : tensor<i32>
    %15 = stablehlo.add %14, %0 : tensor<i32>
    return %15 : tensor<i32>
  }
  func.func @setup() {
    quantum.init
    return
  }
  func.func @teardown() {
    quantum.finalize
    return
  }
}