Skip to content

Commit

Permalink
Merge eee9c2d into 1621b26
Browse files Browse the repository at this point in the history
  • Loading branch information
cesarzc committed May 9, 2024
2 parents 1621b26 + eee9c2d commit 1a0cf28
Show file tree
Hide file tree
Showing 9 changed files with 4,050 additions and 670 deletions.
430 changes: 357 additions & 73 deletions compiler/qsc_partial_eval/src/lib.rs

Large diffs are not rendered by default.

294 changes: 0 additions & 294 deletions compiler/qsc_partial_eval/tests/arrays.rs
Original file line number Diff line number Diff line change
Expand Up @@ -215,231 +215,6 @@ fn array_repeat_with_dynamic_content() {
);
}

#[test]
fn array_of_results_replace_element_at_index_with_dynamic_content() {
let program = get_rir_program(indoc! {r#"
namespace Test {
@EntryPoint()
operation Main() : Result[] {
use (q0, q1) = (Qubit(), Qubit());
mutable arr = [MResetZ(q0), Zero];
set arr w/= 1 <- MResetZ(q1);
arr
}
}
"#});
let measurement_callable_id = CallableId(1);
assert_callable(
&program,
measurement_callable_id,
&expect![[r#"
Callable:
name: __quantum__qis__mresetz__body
call_type: Measurement
input_type:
[0]: Qubit
[1]: Result
output_type: <VOID>
body: <NONE>"#]],
);
let array_output_recording_callable_id = CallableId(2);
assert_callable(
&program,
array_output_recording_callable_id,
&expect![[r#"
Callable:
name: __quantum__rt__array_record_output
call_type: OutputRecording
input_type:
[0]: Integer
[1]: Pointer
output_type: <VOID>
body: <NONE>"#]],
);
let result_output_recording_callable_id = CallableId(3);
assert_callable(
&program,
result_output_recording_callable_id,
&expect![[r#"
Callable:
name: __quantum__rt__result_record_output
call_type: OutputRecording
input_type:
[0]: Result
[1]: Pointer
output_type: <VOID>
body: <NONE>"#]],
);
assert_block_instructions(
&program,
BlockId(0),
&expect![[r#"
Block:
Call id(1), args( Qubit(0), Result(0), )
Call id(1), args( Qubit(1), Result(1), )
Call id(2), args( Integer(2), Pointer, )
Call id(3), args( Result(0), Pointer, )
Call id(3), args( Result(1), Pointer, )
Return"#]],
);
}

#[test]
fn array_of_bools_replace_element_at_index_with_dynamic_content() {
let program = get_rir_program(indoc! {r#"
namespace Test {
@EntryPoint()
operation Main() : Bool[] {
use (q0, q1) = (Qubit(), Qubit());
mutable arr = [MResetZ(q0) == Zero, true];
set arr w/= 1 <- MResetZ(q1) == One;
arr
}
}
"#});
let measurement_callable_id = CallableId(1);
assert_callable(
&program,
measurement_callable_id,
&expect![[r#"
Callable:
name: __quantum__qis__mresetz__body
call_type: Measurement
input_type:
[0]: Qubit
[1]: Result
output_type: <VOID>
body: <NONE>"#]],
);
let readout_callable_id = CallableId(2);
assert_callable(
&program,
readout_callable_id,
&expect![[r#"
Callable:
name: __quantum__qis__read_result__body
call_type: Readout
input_type:
[0]: Result
output_type: Boolean
body: <NONE>"#]],
);
let array_output_recording_callable_id = CallableId(3);
assert_callable(
&program,
array_output_recording_callable_id,
&expect![[r#"
Callable:
name: __quantum__rt__array_record_output
call_type: OutputRecording
input_type:
[0]: Integer
[1]: Pointer
output_type: <VOID>
body: <NONE>"#]],
);
let bool_output_recording_callable_id = CallableId(4);
assert_callable(
&program,
bool_output_recording_callable_id,
&expect![[r#"
Callable:
name: __quantum__rt__bool_record_output
call_type: OutputRecording
input_type:
[0]: Boolean
[1]: Pointer
output_type: <VOID>
body: <NONE>"#]],
);
assert_block_instructions(
&program,
BlockId(0),
&expect![[r#"
Block:
Call id(1), args( Qubit(0), Result(0), )
Variable(0, Boolean) = Call id(2), args( Result(0), )
Variable(1, Boolean) = Icmp Eq, Variable(0, Boolean), Bool(false)
Call id(1), args( Qubit(1), Result(1), )
Variable(2, Boolean) = Call id(2), args( Result(1), )
Variable(3, Boolean) = Icmp Eq, Variable(2, Boolean), Bool(true)
Call id(3), args( Integer(2), Pointer, )
Call id(4), args( Variable(1, Boolean), Pointer, )
Call id(4), args( Variable(3, Boolean), Pointer, )
Return"#]],
);
}

#[test]
fn empty_array_of_results_in_place_concatenation() {
let program = get_rir_program(indoc! {r#"
namespace Test {
@EntryPoint()
operation Main() : Result[] {
use (q0, q1) = (Qubit(), Qubit());
mutable results = [];
set results += [MResetZ(q0)];
set results += [MResetZ(q1)];
results
}
}
"#});
let measurement_callable_id = CallableId(1);
assert_callable(
&program,
measurement_callable_id,
&expect![[r#"
Callable:
name: __quantum__qis__mresetz__body
call_type: Measurement
input_type:
[0]: Qubit
[1]: Result
output_type: <VOID>
body: <NONE>"#]],
);
let array_output_recording_callable_id = CallableId(2);
assert_callable(
&program,
array_output_recording_callable_id,
&expect![[r#"
Callable:
name: __quantum__rt__array_record_output
call_type: OutputRecording
input_type:
[0]: Integer
[1]: Pointer
output_type: <VOID>
body: <NONE>"#]],
);
let result_output_recording_callable_id = CallableId(3);
assert_callable(
&program,
result_output_recording_callable_id,
&expect![[r#"
Callable:
name: __quantum__rt__result_record_output
call_type: OutputRecording
input_type:
[0]: Result
[1]: Pointer
output_type: <VOID>
body: <NONE>"#]],
);
assert_block_instructions(
&program,
BlockId(0),
&expect![[r#"
Block:
Call id(1), args( Qubit(0), Result(0), )
Call id(1), args( Qubit(1), Result(1), )
Call id(2), args( Integer(2), Pointer, )
Call id(3), args( Result(0), Pointer, )
Call id(3), args( Result(1), Pointer, )
Return"#]],
);
}

#[test]
fn result_at_index_in_array() {
let program = get_rir_program(indoc! {r#"
Expand Down Expand Up @@ -491,72 +266,3 @@ fn result_at_index_in_array() {
Return"#]],
);
}

#[test]
fn non_empty_array_of_results_in_place_concatenation() {
let program = get_rir_program(indoc! {r#"
namespace Test {
@EntryPoint()
operation Main() : Result[] {
use (q0, q1) = (Qubit(), Qubit());
mutable results = [MResetZ(q0)];
set results += [MResetZ(q1)];
results
}
}
"#});
let measurement_callable_id = CallableId(1);
assert_callable(
&program,
measurement_callable_id,
&expect![[r#"
Callable:
name: __quantum__qis__mresetz__body
call_type: Measurement
input_type:
[0]: Qubit
[1]: Result
output_type: <VOID>
body: <NONE>"#]],
);
let array_output_recording_callable_id = CallableId(2);
assert_callable(
&program,
array_output_recording_callable_id,
&expect![[r#"
Callable:
name: __quantum__rt__array_record_output
call_type: OutputRecording
input_type:
[0]: Integer
[1]: Pointer
output_type: <VOID>
body: <NONE>"#]],
);
let result_output_recording_callable_id = CallableId(3);
assert_callable(
&program,
result_output_recording_callable_id,
&expect![[r#"
Callable:
name: __quantum__rt__result_record_output
call_type: OutputRecording
input_type:
[0]: Result
[1]: Pointer
output_type: <VOID>
body: <NONE>"#]],
);
assert_block_instructions(
&program,
BlockId(0),
&expect![[r#"
Block:
Call id(1), args( Qubit(0), Result(0), )
Call id(1), args( Qubit(1), Result(1), )
Call id(2), args( Integer(2), Pointer, )
Call id(3), args( Result(0), Pointer, )
Call id(3), args( Result(1), Pointer, )
Return"#]],
);
}

0 comments on commit 1a0cf28

Please sign in to comment.