Loading mlir/parsers/qasm3/tests/test_control_directives.cpp +86 −0 Original line number Diff line number Diff line Loading @@ -83,6 +83,92 @@ print("made it out of the loop"); EXPECT_FALSE(qcor::execute(uint_index, "uint_index")); } TEST(qasm3VisitorTester, checkIqpewithIf) { const std::string qasm_code = R"#(OPENQASM 3; include "qelib1.inc"; // Expected to get 4 bits (iteratively) of 1011 (or 1101 LSB) = 11(decimal): // phi_est = 11/16 (denom = 16 since we have 4 bits) // => phi = 2pi * 11/16 = 11pi/8 = 2pi - 5pi/8 // i.e. we estimate the -5*pi/8 angle... qubit q[2]; const bits_precision = 4; bit c[bits_precision]; // Prepare the eigen-state: |1> x q[1]; // First bit h q[0]; // Controlled rotation: CU^k for i in [0:8] { cphase(-5*pi/8) q[0], q[1]; } h q[0]; // Measure and reset measure q[0] -> c[0]; reset q[0]; // Second bit h q[0]; for i in [0:4] { cphase(-5*pi/8) q[0], q[1]; } // Conditional rotation if (c[0] == 1) { rz(-pi/2) q[0]; } h q[0]; // Measure and reset measure q[0] -> c[1]; reset q[0]; // Third bit h q[0]; for i in [0:2] { cphase(-5*pi/8) q[0], q[1]; } // Conditional rotation if (c[0] == 1) { rz(-pi/4) q[0]; } if (c[1] == 1) { rz(-pi/2) q[0]; } h q[0]; // Measure and reset measure q[0] -> c[2]; reset q[0]; // Fourth bit h q[0]; cphase(-5*pi/8) q[0], q[1]; // Conditional rotation if (c[0] == 1) { rz(-pi/8) q[0]; } if (c[1] == 1) { rz(-pi/4) q[0]; } if (c[2] == 1) { rz(-pi/2) q[0]; } h q[0]; measure q[0] -> c[3]; print(c[0], c[1], c[2], c[3]); QCOR_EXPECT_TRUE(c[0] == 1); QCOR_EXPECT_TRUE(c[1] == 1); QCOR_EXPECT_TRUE(c[2] == 0); QCOR_EXPECT_TRUE(c[3] == 1); )#"; // Make sure we can compile this in FTQC. // i.e., usual if ... auto mlir = qcor::mlir_compile(qasm_code, "iqpe", qcor::OutputType::LLVMIR, false); std::cout << mlir << "\n"; } int main(int argc, char **argv) { ::testing::InitGoogleTest(&argc, argv); Loading Loading
mlir/parsers/qasm3/tests/test_control_directives.cpp +86 −0 Original line number Diff line number Diff line Loading @@ -83,6 +83,92 @@ print("made it out of the loop"); EXPECT_FALSE(qcor::execute(uint_index, "uint_index")); } TEST(qasm3VisitorTester, checkIqpewithIf) { const std::string qasm_code = R"#(OPENQASM 3; include "qelib1.inc"; // Expected to get 4 bits (iteratively) of 1011 (or 1101 LSB) = 11(decimal): // phi_est = 11/16 (denom = 16 since we have 4 bits) // => phi = 2pi * 11/16 = 11pi/8 = 2pi - 5pi/8 // i.e. we estimate the -5*pi/8 angle... qubit q[2]; const bits_precision = 4; bit c[bits_precision]; // Prepare the eigen-state: |1> x q[1]; // First bit h q[0]; // Controlled rotation: CU^k for i in [0:8] { cphase(-5*pi/8) q[0], q[1]; } h q[0]; // Measure and reset measure q[0] -> c[0]; reset q[0]; // Second bit h q[0]; for i in [0:4] { cphase(-5*pi/8) q[0], q[1]; } // Conditional rotation if (c[0] == 1) { rz(-pi/2) q[0]; } h q[0]; // Measure and reset measure q[0] -> c[1]; reset q[0]; // Third bit h q[0]; for i in [0:2] { cphase(-5*pi/8) q[0], q[1]; } // Conditional rotation if (c[0] == 1) { rz(-pi/4) q[0]; } if (c[1] == 1) { rz(-pi/2) q[0]; } h q[0]; // Measure and reset measure q[0] -> c[2]; reset q[0]; // Fourth bit h q[0]; cphase(-5*pi/8) q[0], q[1]; // Conditional rotation if (c[0] == 1) { rz(-pi/8) q[0]; } if (c[1] == 1) { rz(-pi/4) q[0]; } if (c[2] == 1) { rz(-pi/2) q[0]; } h q[0]; measure q[0] -> c[3]; print(c[0], c[1], c[2], c[3]); QCOR_EXPECT_TRUE(c[0] == 1); QCOR_EXPECT_TRUE(c[1] == 1); QCOR_EXPECT_TRUE(c[2] == 0); QCOR_EXPECT_TRUE(c[3] == 1); )#"; // Make sure we can compile this in FTQC. // i.e., usual if ... auto mlir = qcor::mlir_compile(qasm_code, "iqpe", qcor::OutputType::LLVMIR, false); std::cout << mlir << "\n"; } int main(int argc, char **argv) { ::testing::InitGoogleTest(&argc, argv); Loading