Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,8 @@
version="0.2.0",
license="Apache License 2.0",
python_requires=">= 3.10",
packages=find_namespace_packages(where="src", exclude=("test",)),
packages=find_namespace_packages(where="src", exclude=("test",))
+ ["qir2qasm_trans", "qir2qasm_trans.qir_trans"],
package_dir={"": "src"},
install_requires=[
"amazon-braket-sdk>=1.89.1",
Expand All @@ -36,6 +37,8 @@
"gast",
"termcolor",
"openqasm_pygments",
"llvmlite",
"pyqir",
],
extras_require={
"test": [
Expand Down
8 changes: 8 additions & 0 deletions src/autoqasm/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,12 @@ def my_program():
result[1] = measure __qubits__[1];
"""

# Create an alias so it can be accessed as autoqasm.qir2qasm_trans
import sys

# Import qir2qasm_trans module to make it available as autoqasm.qir2qasm_trans
import qir2qasm_trans # noqa: F401

from . import errors, instructions, operators # noqa: F401
from .api import gate, gate_calibration, main, subroutine # noqa: F401
from .instructions import QubitIdentifierType as Qubit # noqa: F401
Expand All @@ -52,6 +58,8 @@ def my_program():
from .types import ArrayVar, BitVar, BoolVar, FloatVar, IntVar # noqa: F401
from .types import Range as range # noqa: F401

sys.modules[__name__ + ".qir2qasm_trans"] = qir2qasm_trans


def __getattr__(name):
if name == "qubits":
Expand Down
40 changes: 40 additions & 0 deletions src/qir2qasm_trans/QIR-example/CUDAQ_bell.ll
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
; ModuleID = 'LLVMDialectModule'
source_filename = "LLVMDialectModule"
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"

%Qubit = type opaque
%Result = type opaque

@cstr.72303030303000 = private constant [7 x i8] c"r00000\00"
@cstr.72303030303100 = private constant [7 x i8] c"r00001\00"

define void @__nvqpp__mlirgen____nvqppBuilderKernel_R23EYF50OU() local_unnamed_addr #0 {
"0":
tail call void @__quantum__qis__h__body(%Qubit* null)
tail call void @__quantum__qis__cnot__body(%Qubit* null, %Qubit* nonnull inttoptr (i64 1 to %Qubit*))
tail call void @__quantum__qis__mz__body(%Qubit* null, %Result* writeonly null)
tail call void @__quantum__qis__mz__body(%Qubit* nonnull inttoptr (i64 1 to %Qubit*), %Result* nonnull writeonly inttoptr (i64 1 to %Result*))
tail call void @__quantum__rt__result_record_output(%Result* null, i8* nonnull getelementptr inbounds ([7 x i8], [7 x i8]* @cstr.72303030303000, i64 0, i64 0))
tail call void @__quantum__rt__result_record_output(%Result* nonnull inttoptr (i64 1 to %Result*), i8* nonnull getelementptr inbounds ([7 x i8], [7 x i8]* @cstr.72303030303100, i64 0, i64 0))
ret void
}

declare void @__quantum__qis__h__body(%Qubit*) local_unnamed_addr

declare void @__quantum__qis__mz__body(%Qubit*, %Result* writeonly) local_unnamed_addr #1

declare void @__quantum__rt__result_record_output(%Result*, i8*) local_unnamed_addr

declare void @__quantum__qis__cnot__body(%Qubit*, %Qubit*) local_unnamed_addr

attributes #0 = { "entry_point" "output_labeling_schema"="schema_id" "output_names"="[[[0,[0,\22r00000\22]],[1,[1,\22r00001\22]]]]" "qir_profiles"="base_profile" "requiredQubits"="2" "requiredResults"="2" }
attributes #1 = { "irreversible" }

!llvm.module.flags = !{!0, !1, !2, !3, !4}

!0 = !{i32 2, !"Debug Info Version", i32 3}
!1 = !{i32 1, !"qir_major_version", i32 1}
!2 = !{i32 7, !"qir_minor_version", i32 0}
!3 = !{i32 1, !"dynamic_qubit_management", i1 false}
!4 = !{i32 1, !"dynamic_result_management", i1 false}
27 changes: 27 additions & 0 deletions src/qir2qasm_trans/QIR-example/arithmetic.ll
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
; ModuleID = 'arithmetic'
source_filename = "arithmetic"

define void @main() #0 {
entry:
%0 = call i32 @get_int()
%1 = add i32 3, %0
%2 = mul i32 2, %1
%3 = call i32 @get_int()
%4 = sub i32 0, %3
call void @take_int(i32 %2)
call void @take_int(i32 %4)
ret void
}

declare i32 @get_int()

declare void @take_int(i32)

attributes #0 = { "entry_point" "output_labeling_schema" "qir_profiles"="custom" "required_num_qubits"="0" "required_num_results"="0" }

!llvm.module.flags = !{!0, !1, !2, !3}

!0 = !{i32 1, !"qir_major_version", i32 1}
!1 = !{i32 7, !"qir_minor_version", i32 0}
!2 = !{i32 1, !"dynamic_qubit_management", i1 false}
!3 = !{i32 1, !"dynamic_result_management", i1 false}
69 changes: 69 additions & 0 deletions src/qir2qasm_trans/QIR-example/base_profile.ll
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
; type definitions

%Result = type opaque
%Qubit = type opaque

; global constants (labels for output recording)

@0 = internal constant [3 x i8] c"r1\00"
@1 = internal constant [3 x i8] c"r2\00"

; entry point definition

define i64 @Entry_Point_Name() #0 {
entry:
; calls to initialize the execution environment
call void @__quantum__rt__initialize(i8* null)
br label %body

body: ; preds = %entry
; calls to QIS functions that are not irreversible
call void @__quantum__qis__h__body(%Qubit* null)
call void @__quantum__qis__cnot__body(%Qubit* null, %Qubit* inttoptr (i64 1 to %Qubit*))
br label %measurements

measurements: ; preds = %body
; calls to QIS functions that are irreversible
call void @__quantum__qis__mz__body(%Qubit* null, %Result* writeonly null)
call void @__quantum__qis__mz__body(%Qubit* inttoptr (i64 1 to %Qubit*), %Result* writeonly inttoptr (i64 1 to %Result*))
br label %output

output: ; preds = %measurements
; calls to record the program output
call void @__quantum__rt__tuple_record_output(i64 2, i8* null)
call void @__quantum__rt__result_record_output(%Result* null, i8* getelementptr inbounds ([3 x i8], [3 x i8]* @0, i32 0, i32 0))
call void @__quantum__rt__result_record_output(%Result* inttoptr (i64 1 to %Result*), i8* getelementptr inbounds ([3 x i8], [3 x i8]* @1, i32 0, i32 0))

ret i64 0
}

; declarations of QIS functions

declare void @__quantum__qis__h__body(%Qubit*)

declare void @__quantum__qis__cnot__body(%Qubit*, %Qubit*)

declare void @__quantum__qis__mz__body(%Qubit*, %Result* writeonly) #1

; declarations of runtime functions for initialization and output recording

declare void @__quantum__rt__initialize(i8*)

declare void @__quantum__rt__tuple_record_output(i64, i8*)

declare void @__quantum__rt__result_record_output(%Result*, i8*)

; attributes

attributes #0 = { "entry_point" "qir_profiles"="base_profile" "output_labeling_schema"="schema_id" "required_num_qubits"="2" "required_num_results"="2" }

attributes #1 = { "irreversible" }

; module flags

!llvm.module.flags = !{!0, !1, !2, !3}

!0 = !{i32 1, !"qir_major_version", i32 1}
!1 = !{i32 7, !"qir_minor_version", i32 0}
!2 = !{i32 1, !"dynamic_qubit_management", i1 false}
!3 = !{i32 1, !"dynamic_result_management", i1 false}
Binary file added src/qir2qasm_trans/QIR-example/bell_pair.bc
Binary file not shown.
30 changes: 30 additions & 0 deletions src/qir2qasm_trans/QIR-example/bell_pair.ll
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
; ModuleID = 'bell'
source_filename = "bell"

%Qubit = type opaque
%Result = type opaque

define void @main() #0 {
entry:
call void @__quantum__qis__h__body(%Qubit* null)
call void @__quantum__qis__cnot__body(%Qubit* null, %Qubit* inttoptr (i64 1 to %Qubit*))
call void @__quantum__qis__mz__body(%Qubit* null, %Result* null)
call void @__quantum__qis__mz__body(%Qubit* inttoptr (i64 1 to %Qubit*), %Result* inttoptr (i64 1 to %Result*))
ret void
}

declare void @__quantum__qis__h__body(%Qubit*)

declare void @__quantum__qis__cnot__body(%Qubit*, %Qubit*)

declare void @__quantum__qis__mz__body(%Qubit*, %Result* writeonly) #1

attributes #0 = { "entry_point" "output_labeling_schema" "qir_profiles"="custom" "required_num_qubits"="2" "required_num_results"="2" }
attributes #1 = { "irreversible" }

!llvm.module.flags = !{!0, !1, !2, !3}

!0 = !{i32 1, !"qir_major_version", i32 1}
!1 = !{i32 7, !"qir_minor_version", i32 0}
!2 = !{i32 1, !"dynamic_qubit_management", i1 false}
!3 = !{i32 1, !"dynamic_result_management", i1 false}
51 changes: 51 additions & 0 deletions src/qir2qasm_trans/QIR-example/bernstein_vazirani.ll
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
; ModuleID = 'python2qir'
source_filename = "python2qir"

%Qubit = type opaque
%Result = type opaque

define void @main() #0 {
entry:
call void @__quantum__qis__h__body(%Qubit* null)
call void @__quantum__qis__h__body(%Qubit* inttoptr (i64 1 to %Qubit*))
call void @__quantum__qis__h__body(%Qubit* inttoptr (i64 2 to %Qubit*))
call void @__quantum__qis__h__body(%Qubit* inttoptr (i64 3 to %Qubit*))
call void @__quantum__qis__h__body(%Qubit* inttoptr (i64 4 to %Qubit*))
call void @__quantum__qis__h__body(%Qubit* inttoptr (i64 5 to %Qubit*))
call void @__quantum__qis__h__body(%Qubit* inttoptr (i64 6 to %Qubit*))
call void @__quantum__qis__z__body(%Qubit* inttoptr (i64 6 to %Qubit*))
call void @__quantum__qis__cnot__body(%Qubit* inttoptr (i64 1 to %Qubit*), %Qubit* inttoptr (i64 6 to %Qubit*))
call void @__quantum__qis__cnot__body(%Qubit* inttoptr (i64 3 to %Qubit*), %Qubit* inttoptr (i64 6 to %Qubit*))
call void @__quantum__qis__cnot__body(%Qubit* inttoptr (i64 5 to %Qubit*), %Qubit* inttoptr (i64 6 to %Qubit*))
call void @__quantum__qis__h__body(%Qubit* inttoptr (i64 5 to %Qubit*))
call void @__quantum__qis__h__body(%Qubit* inttoptr (i64 4 to %Qubit*))
call void @__quantum__qis__h__body(%Qubit* inttoptr (i64 3 to %Qubit*))
call void @__quantum__qis__h__body(%Qubit* inttoptr (i64 2 to %Qubit*))
call void @__quantum__qis__h__body(%Qubit* inttoptr (i64 1 to %Qubit*))
call void @__quantum__qis__h__body(%Qubit* null)
call void @__quantum__qis__mz__body(%Qubit* null, %Result* null)
call void @__quantum__qis__mz__body(%Qubit* inttoptr (i64 1 to %Qubit*), %Result* inttoptr (i64 1 to %Result*))
call void @__quantum__qis__mz__body(%Qubit* inttoptr (i64 2 to %Qubit*), %Result* inttoptr (i64 2 to %Result*))
call void @__quantum__qis__mz__body(%Qubit* inttoptr (i64 3 to %Qubit*), %Result* inttoptr (i64 3 to %Result*))
call void @__quantum__qis__mz__body(%Qubit* inttoptr (i64 4 to %Qubit*), %Result* inttoptr (i64 4 to %Result*))
call void @__quantum__qis__mz__body(%Qubit* inttoptr (i64 5 to %Qubit*), %Result* inttoptr (i64 5 to %Result*))
ret void
}

declare void @__quantum__qis__h__body(%Qubit*)

declare void @__quantum__qis__z__body(%Qubit*)

declare void @__quantum__qis__cnot__body(%Qubit*, %Qubit*)

declare void @__quantum__qis__mz__body(%Qubit*, %Result* writeonly) #1

attributes #0 = { "entry_point" "output_labeling_schema" "qir_profiles"="custom" "required_num_qubits"="7" "required_num_results"="6" }
attributes #1 = { "irreversible" }

!llvm.module.flags = !{!0, !1, !2, !3}

!0 = !{i32 1, !"qir_major_version", i32 1}
!1 = !{i32 7, !"qir_minor_version", i32 0}
!2 = !{i32 1, !"dynamic_qubit_management", i1 false}
!3 = !{i32 1, !"dynamic_result_management", i1 false}
Binary file not shown.
49 changes: 49 additions & 0 deletions src/qir2qasm_trans/QIR-example/dynamic_allocation.ll
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
; ModuleID = 'dynamic_allocation'
source_filename = "dynamic_allocation"

%Qubit = type opaque
%Result = type opaque

declare %Qubit* @__quantum__rt__qubit_allocate()

declare void @__quantum__rt__qubit_release(%Qubit*)

declare %Result* @__quantum__rt__result_get_one()

declare i1 @__quantum__rt__result_equal(%Result*, %Result*)

declare %Result* @__quantum__qis__m__body(%Qubit*)

define void @main() #0 {
entry:
%0 = call %Qubit* @__quantum__rt__qubit_allocate()
call void @__quantum__qis__h__body(%Qubit* %0)
%1 = call %Result* @__quantum__qis__m__body(%Qubit* %0)
%2 = call %Result* @__quantum__rt__result_get_one()
%3 = call i1 @__quantum__rt__result_equal(%Result* %1, %Result* %2)
br i1 %3, label %then, label %else

then: ; preds = %entry
call void @__quantum__qis__reset__body(%Qubit* %0)
br label %continue

else: ; preds = %entry
br label %continue

continue: ; preds = %else, %then
call void @__quantum__rt__qubit_release(%Qubit* %0)
ret void
}

declare void @__quantum__qis__h__body(%Qubit*)

declare void @__quantum__qis__reset__body(%Qubit*)

attributes #0 = { "entry_point" "output_labeling_schema" "qir_profiles"="custom" "required_num_qubits"="1" "required_num_results"="1" }

!llvm.module.flags = !{!0, !1, !2, !3}

!0 = !{i32 1, !"qir_major_version", i32 1}
!1 = !{i32 7, !"qir_minor_version", i32 0}
!2 = !{i32 1, !"dynamic_qubit_management", i1 true}
!3 = !{i32 1, !"dynamic_result_management", i1 true}
34 changes: 34 additions & 0 deletions src/qir2qasm_trans/QIR-example/if_then1.ll
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
; ModuleID = 'dynamic_allocation'
source_filename = "dynamic_allocation"

%Qubit = type opaque
%Result = type opaque

define void @main() #0 {
A:
%0 = call i32 @get_int()
br i1 0, label %B, label %D

B: ; preds = %entry
%1 = add i32 1, %0
br i1 0, label %C, label %D

C: ; preds = %entry
%2 = add i32 2, %0
br label %D

D: ; preds = %entry
%3 = add i32 3, %0
ret void
}

declare i32 @get_int()

attributes #0 = { "entry_point" "output_labeling_schema" "qir_profiles"="custom"}

!llvm.module.flags = !{!0, !1, !2, !3}

!0 = !{i32 1, !"qir_major_version", i32 1}
!1 = !{i32 7, !"qir_minor_version", i32 0}
!2 = !{i32 1, !"dynamic_qubit_management", i1 true}
!3 = !{i32 1, !"dynamic_result_management", i1 true}
43 changes: 43 additions & 0 deletions src/qir2qasm_trans/QIR-example/if_then2.ll
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
; ModuleID = 'dynamic_allocation'
source_filename = "dynamic_allocation"

%Qubit = type opaque
%Result = type opaque

define void @main() #0 {
A0:
%0 = call i32 @get_int()
%1 = add i32 0, %0
br i1 0, label %B1, label %C2

B1:
%2 = add i32 1, %0
br i1 0, label %D3, label %E4

C2:
%3 = add i32 2, %0
br label %E4

D3:
%4 = add i32 3, %0
br label %F5

E4:
%5 = add i32 4, %0
br label %F5

F5:
%6 = add i32 5, %0
ret void
}

declare i32 @get_int()

attributes #0 = { "entry_point" "output_labeling_schema" "qir_profiles"="custom"}

!llvm.module.flags = !{!0, !1, !2, !3}

!0 = !{i32 1, !"qir_major_version", i32 1}
!1 = !{i32 7, !"qir_minor_version", i32 0}
!2 = !{i32 1, !"dynamic_qubit_management", i1 true}
!3 = !{i32 1, !"dynamic_result_management", i1 true}
Loading
Loading