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}