qrisp.jasp.Jaspr.to_qir#

Jaspr.to_qir()[source]#

Compiles the Jaspr to QIR using the Catalyst framework.

Parameters:
None
Returns:
str

The QIR string.

Examples

We create a simple script and inspect the QIR 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_qir())

Yields:

; ModuleID = 'LLVMDialectModule'
source_filename = "LLVMDialectModule"

@"{'shots': 0, 'mcmc': False, 'num_burnin': 0, 'kernel_name': None}" = internal constant [66 x i8] c"{'shots': 0, 'mcmc': False, 'num_burnin': 0, 'kernel_name': None}"
@lightning.qubit = internal constant [16 x i8] c"lightning.qubit"
@"/home/positr0nium/miniconda3/envs/qrisp/lib/python3.10/site-packages/catalyst/utils/../lib/librtd_lightning.so" = internal constant [111 x i8] c"/home/positr0nium/miniconda3/envs/qrisp/lib/python3.10/site-packages/catalyst/utils/../lib/librtd_lightning.so"

declare void @__catalyst__rt__finalize() local_unnamed_addr

declare void @__catalyst__rt__initialize() local_unnamed_addr

declare ptr @__catalyst__qis__Measure(ptr, i32) local_unnamed_addr

declare void @__catalyst__qis__T(ptr, ptr) local_unnamed_addr

declare void @__catalyst__qis__CNOT(ptr, ptr, ptr) local_unnamed_addr

declare ptr @__catalyst__rt__array_get_element_ptr_1d(ptr, i64) local_unnamed_addr

declare ptr @__catalyst__rt__qubit_allocate_array(i64) local_unnamed_addr

declare void @__catalyst__rt__device_init(ptr, ptr, ptr) local_unnamed_addr

declare void @_mlir_memref_to_llvm_free(ptr) local_unnamed_addr

declare ptr @_mlir_memref_to_llvm_alloc(i64) local_unnamed_addr

define { ptr, ptr, i64 } @jit_jaspr_function(ptr nocapture readnone %0, ptr nocapture readonly %1, i64 %2) local_unnamed_addr {
  tail call void @__catalyst__rt__device_init(ptr nonnull @"/home/positr0nium/miniconda3/envs/qrisp/lib/python3.10/site-packages/catalyst/utils/../lib/librtd_lightning.so", ptr nonnull @lightning.qubit, ptr nonnull @"{'shots': 0, 'mcmc': False, 'num_burnin': 0, 'kernel_name': None}")
  %4 = tail call ptr @__catalyst__rt__qubit_allocate_array(i64 20)
  %5 = tail call ptr @__catalyst__rt__array_get_element_ptr_1d(ptr %4, i64 0)
  %6 = load ptr, ptr %5, align 8
  %7 = tail call ptr @__catalyst__rt__array_get_element_ptr_1d(ptr %4, i64 1)
  %8 = load ptr, ptr %7, align 8
  tail call void @__catalyst__qis__CNOT(ptr %6, ptr %8, ptr null)
  %9 = tail call ptr @__catalyst__rt__array_get_element_ptr_1d(ptr %4, i64 1)
  %10 = load ptr, ptr %9, align 8
  tail call void @__catalyst__qis__T(ptr %10, ptr null)
  %11 = tail call ptr @_mlir_memref_to_llvm_alloc(i64 65)
  %12 = ptrtoint ptr %11 to i64
  %13 = add i64 %12, 63
  %14 = and i64 %13, -64
  %15 = inttoptr i64 %14 to ptr
  %16 = tail call ptr @_mlir_memref_to_llvm_alloc(i64 65)
  %17 = ptrtoint ptr %16 to i64
  %18 = add i64 %17, 63
  %19 = and i64 %18, -64
  %20 = inttoptr i64 %19 to ptr
  %21 = tail call ptr @_mlir_memref_to_llvm_alloc(i64 72)
  %22 = ptrtoint ptr %21 to i64
  %23 = add i64 %22, 63
  %24 = and i64 %23, -64
  %25 = inttoptr i64 %24 to ptr
  %26 = tail call ptr @_mlir_memref_to_llvm_alloc(i64 72)
  %27 = ptrtoint ptr %26 to i64
  %28 = add i64 %27, 63
  %29 = and i64 %28, -64
  %30 = inttoptr i64 %29 to ptr
  %31 = tail call ptr @_mlir_memref_to_llvm_alloc(i64 72)
  %32 = ptrtoint ptr %31 to i64
  %33 = add i64 %32, 63
  %34 = and i64 %33, -64
  %35 = inttoptr i64 %34 to ptr
  %36 = tail call ptr @_mlir_memref_to_llvm_alloc(i64 72)
  %37 = ptrtoint ptr %36 to i64
  %38 = add i64 %37, 63
  %39 = and i64 %38, -64
  %40 = inttoptr i64 %39 to ptr
  %41 = tail call ptr @_mlir_memref_to_llvm_alloc(i64 8)
  store i64 0, ptr %41, align 1
  %42 = tail call ptr @_mlir_memref_to_llvm_alloc(i64 8)
  store i64 0, ptr %42, align 1
  %43 = load i64, ptr %1, align 4
  %44 = icmp slt i64 %43, 1
  store i1 %44, ptr %15, align 64
  %45 = tail call ptr @_mlir_memref_to_llvm_alloc(i64 8)
  %46 = load i64, ptr %42, align 1
  store i64 %46, ptr %45, align 1
  tail call void @_mlir_memref_to_llvm_free(ptr nonnull %42)
  %47 = tail call ptr @_mlir_memref_to_llvm_alloc(i64 8)
  %48 = load i64, ptr %41, align 1
  store i64 %48, ptr %47, align 1
  tail call void @_mlir_memref_to_llvm_free(ptr nonnull %41)
  br i1 %44, label %.lr.ph, label %._crit_edge

.lr.ph:                                           ; preds = %3, %.lr.ph
  %49 = phi ptr [ %87, %.lr.ph ], [ %47, %3 ]
  %50 = phi ptr [ %85, %.lr.ph ], [ %45, %3 ]
  %51 = load i64, ptr %50, align 4
  %52 = tail call ptr @__catalyst__rt__array_get_element_ptr_1d(ptr %4, i64 %51)
  %53 = load ptr, ptr %52, align 8
  %54 = tail call ptr @__catalyst__qis__Measure(ptr %53, i32 -1)
  %55 = load i1, ptr %54, align 1
  store i1 %55, ptr %20, align 64
  %56 = load i64, ptr %50, align 4
  store i64 %56, ptr %25, align 64
  %57 = shl i64 2, %56
  %58 = icmp ult i64 %56, 64
  %59 = select i1 %58, i64 %57, i64 0
  store i64 %59, ptr %30, align 64
  %60 = load i1, ptr %20, align 64
  %61 = zext i1 %60 to i64
  store i64 %61, ptr %35, align 64
  %62 = load i64, ptr %30, align 64
  %63 = select i1 %60, i64 %62, i64 0
  store i64 %63, ptr %40, align 64
  %64 = tail call ptr @_mlir_memref_to_llvm_alloc(i64 72)
  %65 = ptrtoint ptr %64 to i64
  %66 = add i64 %65, 63
  %67 = and i64 %66, -64
  %68 = inttoptr i64 %67 to ptr
  %69 = load i64, ptr %49, align 4
  %70 = load i64, ptr %40, align 64
  %71 = add i64 %70, %69
  store i64 %71, ptr %68, align 64
  tail call void @_mlir_memref_to_llvm_free(ptr nonnull %49)
  %72 = tail call ptr @_mlir_memref_to_llvm_alloc(i64 72)
  %73 = ptrtoint ptr %72 to i64
  %74 = add i64 %73, 63
  %75 = and i64 %74, -64
  %76 = inttoptr i64 %75 to ptr
  %77 = load i64, ptr %50, align 4
  %78 = add i64 %77, 1
  store i64 %78, ptr %76, align 64
  tail call void @_mlir_memref_to_llvm_free(ptr nonnull %50)
  %79 = tail call ptr @_mlir_memref_to_llvm_alloc(i64 8)
  %80 = load i64, ptr %68, align 64
  store i64 %80, ptr %79, align 1
  tail call void @_mlir_memref_to_llvm_free(ptr %64)
  %81 = tail call ptr @_mlir_memref_to_llvm_alloc(i64 8)
  %82 = load i64, ptr %76, align 64
  store i64 %82, ptr %81, align 1
  tail call void @_mlir_memref_to_llvm_free(ptr %72)
  %.pre = load i64, ptr %81, align 4
  %83 = load i64, ptr %1, align 4
  %84 = icmp sge i64 %.pre, %83
  store i1 %84, ptr %15, align 64
  %85 = tail call ptr @_mlir_memref_to_llvm_alloc(i64 8)
  %86 = load i64, ptr %81, align 1
  store i64 %86, ptr %85, align 1
  tail call void @_mlir_memref_to_llvm_free(ptr nonnull %81)
  %87 = tail call ptr @_mlir_memref_to_llvm_alloc(i64 8)
  %88 = load i64, ptr %79, align 1
  store i64 %88, ptr %87, align 1
  tail call void @_mlir_memref_to_llvm_free(ptr nonnull %79)
  br i1 %84, label %.lr.ph, label %._crit_edge

._crit_edge:                                      ; preds = %.lr.ph, %3
  %.lcssa20 = phi ptr [ %45, %3 ], [ %85, %.lr.ph ]
  %.lcssa = phi ptr [ %47, %3 ], [ %87, %.lr.ph ]
  tail call void @_mlir_memref_to_llvm_free(ptr nonnull %.lcssa20)
  tail call void @_mlir_memref_to_llvm_free(ptr %36)
  tail call void @_mlir_memref_to_llvm_free(ptr %31)
  tail call void @_mlir_memref_to_llvm_free(ptr %26)
  tail call void @_mlir_memref_to_llvm_free(ptr %21)
  tail call void @_mlir_memref_to_llvm_free(ptr %16)
  tail call void @_mlir_memref_to_llvm_free(ptr %11)
  %89 = tail call ptr @_mlir_memref_to_llvm_alloc(i64 68)
  %90 = ptrtoint ptr %89 to i64
  %91 = add i64 %90, 63
  %92 = and i64 %91, -64
  %93 = inttoptr i64 %92 to ptr
  %94 = load i64, ptr %.lcssa, align 4
  %95 = trunc i64 %94 to i32
  store i32 %95, ptr %93, align 64
  tail call void @_mlir_memref_to_llvm_free(ptr nonnull %.lcssa)
  %96 = tail call ptr @_mlir_memref_to_llvm_alloc(i64 68)
  %97 = ptrtoint ptr %96 to i64
  %98 = add i64 %97, 63
  %99 = and i64 %98, -64
  %100 = inttoptr i64 %99 to ptr
  %101 = load i32, ptr %93, align 64
  %102 = add i32 %101, 1
  store i32 %102, ptr %100, align 64
  tail call void @_mlir_memref_to_llvm_free(ptr %89)
  %103 = icmp eq ptr %96, inttoptr (i64 3735928559 to ptr)
  br i1 %103, label %104, label %107

104:                                              ; preds = %._crit_edge
  %105 = tail call ptr @_mlir_memref_to_llvm_alloc(i64 4)
  %106 = load i32, ptr %100, align 64
  store i32 %106, ptr %105, align 1
  br label %107

107:                                              ; preds = %104, %._crit_edge
  %.pn16 = phi ptr [ %105, %104 ], [ %96, %._crit_edge ]
  %.pn14 = phi ptr [ %105, %104 ], [ %100, %._crit_edge ]
  %.pn13 = insertvalue { ptr, ptr, i64 } undef, ptr %.pn16, 0
  %.pn = insertvalue { ptr, ptr, i64 } %.pn13, ptr %.pn14, 1
  %108 = insertvalue { ptr, ptr, i64 } %.pn, i64 0, 2
  ret { ptr, ptr, i64 } %108
}

define void @_catalyst_pyface_jit_jaspr_function(ptr nocapture writeonly %0, ptr nocapture readonly %1) local_unnamed_addr {
  %.unpack = load ptr, ptr %1, align 8
  %.elt1.i = getelementptr inbounds { ptr, ptr, i64 }, ptr %.unpack, i64 0, i32 1
  %.unpack2.i = load ptr, ptr %.elt1.i, align 8
  %3 = tail call { ptr, ptr, i64 } @jit_jaspr_function(ptr poison, ptr %.unpack2.i, i64 poison)
  %.elt.i = extractvalue { ptr, ptr, i64 } %3, 0
  store ptr %.elt.i, ptr %0, align 8
  %.repack5.i = getelementptr inbounds { ptr, ptr, i64 }, ptr %0, i64 0, i32 1
  %.elt6.i = extractvalue { ptr, ptr, i64 } %3, 1
  store ptr %.elt6.i, ptr %.repack5.i, align 8
  %.repack7.i = getelementptr inbounds { ptr, ptr, i64 }, ptr %0, i64 0, i32 2
  %.elt8.i = extractvalue { ptr, ptr, i64 } %3, 2
  store i64 %.elt8.i, ptr %.repack7.i, align 8
  ret void
}

define void @_catalyst_ciface_jit_jaspr_function(ptr nocapture writeonly %0, ptr nocapture readonly %1) local_unnamed_addr {
  %.elt1 = getelementptr inbounds { ptr, ptr, i64 }, ptr %1, i64 0, i32 1
  %.unpack2 = load ptr, ptr %.elt1, align 8
  %3 = tail call { ptr, ptr, i64 } @jit_jaspr_function(ptr poison, ptr %.unpack2, i64 poison)
  %.elt = extractvalue { ptr, ptr, i64 } %3, 0
  store ptr %.elt, ptr %0, align 8
  %.repack5 = getelementptr inbounds { ptr, ptr, i64 }, ptr %0, i64 0, i32 1
  %.elt6 = extractvalue { ptr, ptr, i64 } %3, 1
  store ptr %.elt6, ptr %.repack5, align 8
  %.repack7 = getelementptr inbounds { ptr, ptr, i64 }, ptr %0, i64 0, i32 2
  %.elt8 = extractvalue { ptr, ptr, i64 } %3, 2
  store i64 %.elt8, ptr %.repack7, align 8
  ret void
}

define void @setup() local_unnamed_addr {
  tail call void @__catalyst__rt__initialize()
  ret void
}

define void @teardown() local_unnamed_addr {
  tail call void @__catalyst__rt__finalize()
  ret void
}

!llvm.module.flags = !{!0}

!0 = !{i32 2, !"Debug Info Version", i32 3}