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
17 changes: 17 additions & 0 deletions qis-compiler/python/tests/generate_hugrs.py
Original file line number Diff line number Diff line change
Expand Up @@ -219,6 +219,22 @@ def main() -> None:
return main.compile().to_bytes()


def modifiers() -> bytes:
from guppylang import enable_experimental_features
enable_experimental_features()
@guppy
def main() -> None:
q1 = qubit()
q2 = qubit()
h(q1)
with control(q1):
x(q2)
result("q1", measure(q1))
result("q2", measure(q2))

return main.compile().to_bytes()


def entry_args() -> bytes:
@guppy
def foo(a: int) -> None:
Expand All @@ -243,6 +259,7 @@ def foo(a: int) -> None:
print_current_shot,
rng,
entry_args,
modifiers,
]:
envelope = func()
(resources_dir / f"{func.__name__}.hugr").write_bytes(envelope)
Binary file not shown.
Original file line number Diff line number Diff line change
@@ -0,0 +1,133 @@
; ModuleID = 'hugr'
source_filename = "hugr"
target datalayout = "e-m:o-i64:64-i128:128-n32:64-S128"
target triple = "aarch64-apple-darwin"

@"e_Some array.A77EF32E.0" = private constant [48 x i8] c"/EXIT:INT:Some array elements have been borrowed"
@res_q1.18BA0F1C.0 = private constant [13 x i8] c"\0CUSER:BOOL:q1"
@res_q2.2A5B30FD.0 = private constant [13 x i8] c"\0CUSER:BOOL:q2"
@"e_No more qu.3B2EEBF0.0" = private constant [47 x i8] c".EXIT:INT:No more qubits available to allocate."

declare i8* @heap_alloc(i64) local_unnamed_addr

; Function Attrs: noreturn
declare void @panic(i32, i8*) local_unnamed_addr #0

declare i64 @___lazy_measure(i64) local_unnamed_addr

declare void @___qfree(i64) local_unnamed_addr

declare i1 @___read_future_bool(i64) local_unnamed_addr

declare void @___dec_future_refcount(i64) local_unnamed_addr

declare void @print_bool(i8*, i64, i1) local_unnamed_addr

declare i64 @___qalloc() local_unnamed_addr

declare void @___reset(i64) local_unnamed_addr

declare void @___rxy(i64, double, double) local_unnamed_addr

declare void @___rz(i64, double) local_unnamed_addr

declare void @___rzz(i64, i64, double) local_unnamed_addr

define i64 @qmain(i64 %0) local_unnamed_addr {
entry:
tail call void @setup(i64 %0)
%qalloc.i.i = tail call i64 @___qalloc()
%not_max.not.i.i = icmp eq i64 %qalloc.i.i, -1
br i1 %not_max.not.i.i, label %id_bb.i.i, label %reset_bb.i.i

reset_bb.i.i: ; preds = %entry
tail call void @___reset(i64 %qalloc.i.i)
br label %id_bb.i.i

id_bb.i.i: ; preds = %reset_bb.i.i, %entry
%1 = insertvalue { i1, i64 } { i1 true, i64 poison }, i64 %qalloc.i.i, 1
%2 = select i1 %not_max.not.i.i, { i1, i64 } { i1 false, i64 poison }, { i1, i64 } %1
%.fca.0.extract.i.i = extractvalue { i1, i64 } %2, 0
br i1 %.fca.0.extract.i.i, label %__hugr__.__tk2_qalloc.13.exit.i, label %cond_57_case_0.i.i

cond_57_case_0.i.i: ; preds = %id_bb.i.i
tail call void @panic(i32 1001, i8* getelementptr inbounds ([47 x i8], [47 x i8]* @"e_No more qu.3B2EEBF0.0", i64 0, i64 0))
unreachable

__hugr__.__tk2_qalloc.13.exit.i: ; preds = %id_bb.i.i
%.fca.1.extract.i.i = extractvalue { i1, i64 } %2, 1
tail call void @___rxy(i64 %.fca.1.extract.i.i, double 0x3FF921FB54442D18, double 0xBFF921FB54442D18)
tail call void @___rz(i64 %.fca.1.extract.i.i, double 0x400921FB54442D18)
%3 = tail call i8* @heap_alloc(i64 8)
%4 = bitcast i8* %3 to i64*
%5 = tail call i8* @heap_alloc(i64 8)
%6 = bitcast i8* %5 to i64*
store i64 0, i64* %6, align 1
store i64 %.fca.1.extract.i.i, i64* %4, align 4
%7 = load i64, i64* %6, align 4
%8 = and i64 %7, 1
store i64 %8, i64* %6, align 4
%9 = icmp eq i64 %8, 0
br i1 %9, label %__barray_check_none_borrowed.exit.i, label %mask_block_err.i.i

mask_block_err.i.i: ; preds = %__hugr__.__tk2_qalloc.13.exit.i
tail call void @panic(i32 1002, i8* getelementptr inbounds ([48 x i8], [48 x i8]* @"e_Some array.A77EF32E.0", i64 0, i64 0))
unreachable

__barray_check_none_borrowed.exit.i: ; preds = %__hugr__.__tk2_qalloc.13.exit.i
%qalloc.i69.i = tail call i64 @___qalloc()
%not_max.not.i70.i = icmp eq i64 %qalloc.i69.i, -1
br i1 %not_max.not.i70.i, label %id_bb.i73.i, label %reset_bb.i71.i

reset_bb.i71.i: ; preds = %__barray_check_none_borrowed.exit.i
tail call void @___reset(i64 %qalloc.i69.i)
br label %id_bb.i73.i

id_bb.i73.i: ; preds = %reset_bb.i71.i, %__barray_check_none_borrowed.exit.i
%10 = insertvalue { i1, i64 } { i1 true, i64 poison }, i64 %qalloc.i69.i, 1
%11 = select i1 %not_max.not.i70.i, { i1, i64 } { i1 false, i64 poison }, { i1, i64 } %10
%.fca.0.extract.i72.i = extractvalue { i1, i64 } %11, 0
br i1 %.fca.0.extract.i72.i, label %__hugr__.main.1.exit, label %cond_71_case_0.i.i

cond_71_case_0.i.i: ; preds = %id_bb.i73.i
tail call void @panic(i32 1001, i8* getelementptr inbounds ([47 x i8], [47 x i8]* @"e_No more qu.3B2EEBF0.0", i64 0, i64 0))
unreachable

__hugr__.main.1.exit: ; preds = %id_bb.i73.i
%.fca.1.extract.i74.i = extractvalue { i1, i64 } %11, 1
%12 = load i64, i64* %4, align 4
tail call void @___rxy(i64 %.fca.1.extract.i74.i, double 0xBFF921FB54442D18, double 0x3FF921FB54442D18)
tail call void @___rzz(i64 %12, i64 %.fca.1.extract.i74.i, double 0x3FF921FB54442D18)
tail call void @___rz(i64 %12, double 0xBFF921FB54442D18)
tail call void @___rxy(i64 %.fca.1.extract.i74.i, double 0x3FF921FB54442D18, double 0x400921FB54442D18)
tail call void @___rz(i64 %.fca.1.extract.i74.i, double 0xBFF921FB54442D18)
%13 = tail call i8* @heap_alloc(i64 8)
%14 = bitcast i8* %13 to i64*
store i64 %12, i64* %14, align 4
%15 = tail call i8* @heap_alloc(i64 8)
%16 = bitcast i8* %15 to i64*
store i64 0, i64* %16, align 1
%17 = load i64, i64* %14, align 4
%lazy_measure.i = tail call i64 @___lazy_measure(i64 %17)
tail call void @___qfree(i64 %17)
%read_bool.i = tail call i1 @___read_future_bool(i64 %lazy_measure.i)
tail call void @___dec_future_refcount(i64 %lazy_measure.i)
tail call void @print_bool(i8* getelementptr inbounds ([13 x i8], [13 x i8]* @res_q1.18BA0F1C.0, i64 0, i64 0), i64 12, i1 %read_bool.i)
%lazy_measure33.i = tail call i64 @___lazy_measure(i64 %.fca.1.extract.i74.i)
tail call void @___qfree(i64 %.fca.1.extract.i74.i)
%read_bool46.i = tail call i1 @___read_future_bool(i64 %lazy_measure33.i)
tail call void @___dec_future_refcount(i64 %lazy_measure33.i)
tail call void @print_bool(i8* getelementptr inbounds ([13 x i8], [13 x i8]* @res_q2.2A5B30FD.0, i64 0, i64 0), i64 12, i1 %read_bool46.i)
%18 = tail call i64 @teardown()
ret i64 %18
}

declare void @setup(i64) local_unnamed_addr

declare i64 @teardown() local_unnamed_addr

attributes #0 = { noreturn }

!name = !{!0}

!0 = !{!"mainlib"}
Original file line number Diff line number Diff line change
@@ -0,0 +1,133 @@
; ModuleID = 'hugr'
source_filename = "hugr"
target datalayout = "e-m:o-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-apple-darwin"

@"e_Some array.A77EF32E.0" = private constant [48 x i8] c"/EXIT:INT:Some array elements have been borrowed"
@res_q1.18BA0F1C.0 = private constant [13 x i8] c"\0CUSER:BOOL:q1"
@res_q2.2A5B30FD.0 = private constant [13 x i8] c"\0CUSER:BOOL:q2"
@"e_No more qu.3B2EEBF0.0" = private constant [47 x i8] c".EXIT:INT:No more qubits available to allocate."

declare i8* @heap_alloc(i64) local_unnamed_addr

; Function Attrs: noreturn
declare void @panic(i32, i8*) local_unnamed_addr #0

declare i64 @___lazy_measure(i64) local_unnamed_addr

declare void @___qfree(i64) local_unnamed_addr

declare i1 @___read_future_bool(i64) local_unnamed_addr

declare void @___dec_future_refcount(i64) local_unnamed_addr

declare void @print_bool(i8*, i64, i1) local_unnamed_addr

declare i64 @___qalloc() local_unnamed_addr

declare void @___reset(i64) local_unnamed_addr

declare void @___rxy(i64, double, double) local_unnamed_addr

declare void @___rz(i64, double) local_unnamed_addr

declare void @___rzz(i64, i64, double) local_unnamed_addr

define i64 @qmain(i64 %0) local_unnamed_addr {
entry:
tail call void @setup(i64 %0)
%qalloc.i.i = tail call i64 @___qalloc()
%not_max.not.i.i = icmp eq i64 %qalloc.i.i, -1
br i1 %not_max.not.i.i, label %id_bb.i.i, label %reset_bb.i.i

reset_bb.i.i: ; preds = %entry
tail call void @___reset(i64 %qalloc.i.i)
br label %id_bb.i.i

id_bb.i.i: ; preds = %reset_bb.i.i, %entry
%1 = insertvalue { i1, i64 } { i1 true, i64 poison }, i64 %qalloc.i.i, 1
%2 = select i1 %not_max.not.i.i, { i1, i64 } { i1 false, i64 poison }, { i1, i64 } %1
%.fca.0.extract.i.i = extractvalue { i1, i64 } %2, 0
br i1 %.fca.0.extract.i.i, label %__hugr__.__tk2_qalloc.13.exit.i, label %cond_57_case_0.i.i

cond_57_case_0.i.i: ; preds = %id_bb.i.i
tail call void @panic(i32 1001, i8* getelementptr inbounds ([47 x i8], [47 x i8]* @"e_No more qu.3B2EEBF0.0", i64 0, i64 0))
unreachable

__hugr__.__tk2_qalloc.13.exit.i: ; preds = %id_bb.i.i
%.fca.1.extract.i.i = extractvalue { i1, i64 } %2, 1
tail call void @___rxy(i64 %.fca.1.extract.i.i, double 0x3FF921FB54442D18, double 0xBFF921FB54442D18)
tail call void @___rz(i64 %.fca.1.extract.i.i, double 0x400921FB54442D18)
%3 = tail call i8* @heap_alloc(i64 8)
%4 = bitcast i8* %3 to i64*
%5 = tail call i8* @heap_alloc(i64 8)
%6 = bitcast i8* %5 to i64*
store i64 0, i64* %6, align 1
store i64 %.fca.1.extract.i.i, i64* %4, align 4
%7 = load i64, i64* %6, align 4
%8 = and i64 %7, 1
store i64 %8, i64* %6, align 4
%9 = icmp eq i64 %8, 0
br i1 %9, label %__barray_check_none_borrowed.exit.i, label %mask_block_err.i.i

mask_block_err.i.i: ; preds = %__hugr__.__tk2_qalloc.13.exit.i
tail call void @panic(i32 1002, i8* getelementptr inbounds ([48 x i8], [48 x i8]* @"e_Some array.A77EF32E.0", i64 0, i64 0))
unreachable

__barray_check_none_borrowed.exit.i: ; preds = %__hugr__.__tk2_qalloc.13.exit.i
%qalloc.i69.i = tail call i64 @___qalloc()
%not_max.not.i70.i = icmp eq i64 %qalloc.i69.i, -1
br i1 %not_max.not.i70.i, label %id_bb.i73.i, label %reset_bb.i71.i

reset_bb.i71.i: ; preds = %__barray_check_none_borrowed.exit.i
tail call void @___reset(i64 %qalloc.i69.i)
br label %id_bb.i73.i

id_bb.i73.i: ; preds = %reset_bb.i71.i, %__barray_check_none_borrowed.exit.i
%10 = insertvalue { i1, i64 } { i1 true, i64 poison }, i64 %qalloc.i69.i, 1
%11 = select i1 %not_max.not.i70.i, { i1, i64 } { i1 false, i64 poison }, { i1, i64 } %10
%.fca.0.extract.i72.i = extractvalue { i1, i64 } %11, 0
br i1 %.fca.0.extract.i72.i, label %__hugr__.main.1.exit, label %cond_71_case_0.i.i

cond_71_case_0.i.i: ; preds = %id_bb.i73.i
tail call void @panic(i32 1001, i8* getelementptr inbounds ([47 x i8], [47 x i8]* @"e_No more qu.3B2EEBF0.0", i64 0, i64 0))
unreachable

__hugr__.main.1.exit: ; preds = %id_bb.i73.i
%.fca.1.extract.i74.i = extractvalue { i1, i64 } %11, 1
%12 = load i64, i64* %4, align 4
tail call void @___rxy(i64 %.fca.1.extract.i74.i, double 0xBFF921FB54442D18, double 0x3FF921FB54442D18)
tail call void @___rzz(i64 %12, i64 %.fca.1.extract.i74.i, double 0x3FF921FB54442D18)
tail call void @___rz(i64 %12, double 0xBFF921FB54442D18)
tail call void @___rxy(i64 %.fca.1.extract.i74.i, double 0x3FF921FB54442D18, double 0x400921FB54442D18)
tail call void @___rz(i64 %.fca.1.extract.i74.i, double 0xBFF921FB54442D18)
%13 = tail call i8* @heap_alloc(i64 8)
%14 = bitcast i8* %13 to i64*
store i64 %12, i64* %14, align 4
%15 = tail call i8* @heap_alloc(i64 8)
%16 = bitcast i8* %15 to i64*
store i64 0, i64* %16, align 1
%17 = load i64, i64* %14, align 4
%lazy_measure.i = tail call i64 @___lazy_measure(i64 %17)
tail call void @___qfree(i64 %17)
%read_bool.i = tail call i1 @___read_future_bool(i64 %lazy_measure.i)
tail call void @___dec_future_refcount(i64 %lazy_measure.i)
tail call void @print_bool(i8* getelementptr inbounds ([13 x i8], [13 x i8]* @res_q1.18BA0F1C.0, i64 0, i64 0), i64 12, i1 %read_bool.i)
%lazy_measure33.i = tail call i64 @___lazy_measure(i64 %.fca.1.extract.i74.i)
tail call void @___qfree(i64 %.fca.1.extract.i74.i)
%read_bool46.i = tail call i1 @___read_future_bool(i64 %lazy_measure33.i)
tail call void @___dec_future_refcount(i64 %lazy_measure33.i)
tail call void @print_bool(i8* getelementptr inbounds ([13 x i8], [13 x i8]* @res_q2.2A5B30FD.0, i64 0, i64 0), i64 12, i1 %read_bool46.i)
%18 = tail call i64 @teardown()
ret i64 %18
}

declare void @setup(i64) local_unnamed_addr

declare i64 @teardown() local_unnamed_addr

attributes #0 = { noreturn }

!name = !{!0}

!0 = !{!"mainlib"}
Loading
Loading