Loading mlir/qir_qrt/qir-qis-ms-compat.cpp +1 −0 Original line number Diff line number Diff line #include "qir-qrt.hpp" #include "qir-qrt-ms-compat.hpp" #include <iostream> // QRT QIS (quantum instructions) implementation for MSFT Compatability Loading mlir/qir_qrt/qir-qrt-ms-compat.hpp 0 → 100644 +48 −0 Original line number Diff line number Diff line // These are MSFT QIR API generated by the Q# compiler. // They might be *ahead* of the official spec release // hence, we keep them separate here. #pragma once #include "qir-types.hpp" extern "C" { void __quantum__qis__exp__body(Array *paulis, double angle, Array *qubits); void __quantum__qis__exp__adj(Array *paulis, double angle, Array *qubits); void __quantum__qis__exp__ctl(Array *ctls, Array *paulis, double angle, Array *qubits); void __quantum__qis__exp__ctladj(Array *ctls, Array *paulis, double angle, Array *qubits); void __quantum__qis__h__body(Qubit *q); void __quantum__qis__h__ctl(Array *ctls, Qubit *q); void __quantum__qis__r__body(Pauli pauli, double theta, Qubit *q); void __quantum__qis__r__adj(Pauli pauli, double theta, Qubit *q); void __quantum__qis__r__ctl(Array *ctls, Pauli pauli, double theta, Qubit *q); void __quantum__qis__r__ctladj(Array *ctls, Pauli pauli, double theta, Qubit *q); void __quantum__qis__s__body(Qubit *q); void __quantum__qis__s__adj(Qubit *q); void __quantum__qis__s__ctl(Array *ctls, Qubit *q); void __quantum__qis__s__ctladj(Array *ctls, Qubit *q); void __quantum__qis__t__body(Qubit *q); void __quantum__qis__t__adj(Qubit *q); void __quantum__qis__t__ctl(Array *ctls, Qubit *q); void __quantum__qis__t__ctladj(Array *ctls, Qubit *q); void __quantum__qis__x__body(Qubit *q); void __quantum__qis__x__adj(Qubit *q); void __quantum__qis__x__ctl(Array *ctls, Qubit *q); void __quantum__qis__x__ctladj(Array *ctls, Qubit *q); void __quantum__qis__y__body(Qubit *q); void __quantum__qis__y__adj(Qubit *q); void __quantum__qis__y__ctl(Array *ctls, Qubit *q); void __quantum__qis__y__ctladj(Array *ctls, Qubit *q); void __quantum__qis__z__body(Qubit *q); void __quantum__qis__z__adj(Qubit *q); void __quantum__qis__z__ctl(Array *ctls, Qubit *q); void __quantum__qis__z__ctladj(Array *ctls, Qubit *q); void __quantum__qis__rx__body(double theta, Qubit *q); void __quantum__qis__ry__body(double theta, Qubit *q); void __quantum__qis__rz__body(double theta, Qubit *q); void __quantum__qis__cnot__body(Qubit *src, Qubit *tgt); Result *__quantum__qis__measure__body(Array *bases, Array *qubits); double __quantum__qis__intasdouble__body(int32_t intVal); } mlir/qir_qrt/qir-qrt.cpp +10 −2 Original line number Diff line number Diff line Loading @@ -224,10 +224,18 @@ void __quantum__rt__finalize() { bool __quantum__rt__result_equal(Result *res, Result *comp) { if (verbose) std::cout << "CALL: " << __PRETTY_FUNCTION__ << "\n"; if (mode == QRT_MODE::NISQ) { throw std::runtime_error( "Comparing Measure results in NISQ mode is prohibited."); } // std::cout << "RES = " << res << "\n"; // std::cout << "COMP = " << comp << "\n"; // We can do pointer comparison here. return res == comp; if (res && comp) { // Do pointer comparison here then fallback by deref the result. return (res == comp) || (*res) == (*comp); } return false; } void __quantum__rt__string_update_reference_count(void *str, int64_t count) { Loading mlir/qir_qrt/qir-qrt.hpp +7 −50 Original line number Diff line number Diff line #pragma once #include <memory> #include <vector> #include "qalloc.hpp" Loading @@ -19,11 +21,13 @@ extern std::shared_ptr<xacc::AcceleratorBuffer> global_qreg; extern QRT_MODE mode; void initialize(); // Initialize/Finalize/Config API void __quantum__rt__initialize(int argc, int8_t** argv); void __quantum__rt__finalize(); void __quantum__rt__set_external_qreg(qreg* q); // QIS API (i.e. quantum instructions) void __quantum__qis__cnot(Qubit* src, Qubit* tgt); void __quantum__qis__h(Qubit* q); void __quantum__qis__s(Qubit* q); Loading @@ -40,56 +44,9 @@ void __quantum__qis__rx(double x, Qubit* q); void __quantum__qis__ry(double x, Qubit* q); void __quantum__qis__rz(double x, Qubit* q); void __quantum__qis__u3(double theta, double phi, double lambda, Qubit* q); // New QIR runtime API: void __quantum__qis__exp__body(Array* paulis, double angle, Array* qubits); void __quantum__qis__exp__adj(Array* paulis, double angle, Array* qubits); void __quantum__qis__exp__ctl(Array* ctls, Array* paulis, double angle, Array* qubits); void __quantum__qis__exp__ctladj(Array* ctls, Array* paulis, double angle, Array* qubits); void __quantum__qis__h__body(Qubit* q); void __quantum__qis__h__ctl(Array* ctls, Qubit* q); void __quantum__qis__r__body(Pauli pauli, double theta, Qubit* q); void __quantum__qis__r__adj(Pauli pauli, double theta, Qubit* q); void __quantum__qis__r__ctl(Array* ctls, Pauli pauli, double theta, Qubit* q); void __quantum__qis__r__ctladj(Array* ctls, Pauli pauli, double theta, Qubit* q); void __quantum__qis__s__body(Qubit* q); void __quantum__qis__s__adj(Qubit* q); void __quantum__qis__s__ctl(Array* ctls, Qubit* q); void __quantum__qis__s__ctladj(Array* ctls, Qubit* q); void __quantum__qis__t__body(Qubit* q); void __quantum__qis__t__adj(Qubit* q); void __quantum__qis__t__ctl(Array* ctls, Qubit* q); void __quantum__qis__t__ctladj(Array* ctls, Qubit* q); void __quantum__qis__x__body(Qubit* q); void __quantum__qis__x__adj(Qubit* q); void __quantum__qis__x__ctl(Array* ctls, Qubit* q); void __quantum__qis__x__ctladj(Array* ctls, Qubit* q); void __quantum__qis__y__body(Qubit* q); void __quantum__qis__y__adj(Qubit* q); void __quantum__qis__y__ctl(Array* ctls, Qubit* q); void __quantum__qis__y__ctladj(Array* ctls, Qubit* q); void __quantum__qis__z__body(Qubit* q); void __quantum__qis__z__adj(Qubit* q); void __quantum__qis__z__ctl(Array* ctls, Qubit* q); void __quantum__qis__z__ctladj(Array* ctls, Qubit* q); void __quantum__qis__rx__body(double theta, Qubit* q); void __quantum__qis__ry__body(double theta, Qubit* q); void __quantum__qis__rz__body(double theta, Qubit* q); void __quantum__qis__cnot__body(Qubit* src, Qubit* tgt); Result* __quantum__qis__measure__body(Array* bases, Array* qubits); double __quantum__qis__intasdouble__body(int32_t intVal); void __quantum__rt__array_update_alias_count(Array* bases, int64_t count); bool __quantum__rt__result_equal(Result* res, Result* comp); int64_t __quantum__rt__array_get_size_1d(Array* state1); int8_t* __quantum__rt__tuple_create(int64_t state); void __quantum__rt__string_update_reference_count(void* str, int64_t count); void __quantum__rt__array_update_reference_count(Array* aux, int64_t count); void __quantum__rt__result_update_reference_count(Result *, int64_t count); // ===================================================== Result* __quantum__qis__mz(Qubit* q); // Compare results. bool __quantum__rt__result_equal(Result *res, Result *comp); // Qubit Alloc/Dealloc API Array* __quantum__rt__qubit_allocate_array(uint64_t idx); Loading mlir/qir_qrt/qir-types.hpp +2 −0 Original line number Diff line number Diff line #pragma once #include <cassert> // Defines implementations of QIR Opaque types Loading Loading
mlir/qir_qrt/qir-qis-ms-compat.cpp +1 −0 Original line number Diff line number Diff line #include "qir-qrt.hpp" #include "qir-qrt-ms-compat.hpp" #include <iostream> // QRT QIS (quantum instructions) implementation for MSFT Compatability Loading
mlir/qir_qrt/qir-qrt-ms-compat.hpp 0 → 100644 +48 −0 Original line number Diff line number Diff line // These are MSFT QIR API generated by the Q# compiler. // They might be *ahead* of the official spec release // hence, we keep them separate here. #pragma once #include "qir-types.hpp" extern "C" { void __quantum__qis__exp__body(Array *paulis, double angle, Array *qubits); void __quantum__qis__exp__adj(Array *paulis, double angle, Array *qubits); void __quantum__qis__exp__ctl(Array *ctls, Array *paulis, double angle, Array *qubits); void __quantum__qis__exp__ctladj(Array *ctls, Array *paulis, double angle, Array *qubits); void __quantum__qis__h__body(Qubit *q); void __quantum__qis__h__ctl(Array *ctls, Qubit *q); void __quantum__qis__r__body(Pauli pauli, double theta, Qubit *q); void __quantum__qis__r__adj(Pauli pauli, double theta, Qubit *q); void __quantum__qis__r__ctl(Array *ctls, Pauli pauli, double theta, Qubit *q); void __quantum__qis__r__ctladj(Array *ctls, Pauli pauli, double theta, Qubit *q); void __quantum__qis__s__body(Qubit *q); void __quantum__qis__s__adj(Qubit *q); void __quantum__qis__s__ctl(Array *ctls, Qubit *q); void __quantum__qis__s__ctladj(Array *ctls, Qubit *q); void __quantum__qis__t__body(Qubit *q); void __quantum__qis__t__adj(Qubit *q); void __quantum__qis__t__ctl(Array *ctls, Qubit *q); void __quantum__qis__t__ctladj(Array *ctls, Qubit *q); void __quantum__qis__x__body(Qubit *q); void __quantum__qis__x__adj(Qubit *q); void __quantum__qis__x__ctl(Array *ctls, Qubit *q); void __quantum__qis__x__ctladj(Array *ctls, Qubit *q); void __quantum__qis__y__body(Qubit *q); void __quantum__qis__y__adj(Qubit *q); void __quantum__qis__y__ctl(Array *ctls, Qubit *q); void __quantum__qis__y__ctladj(Array *ctls, Qubit *q); void __quantum__qis__z__body(Qubit *q); void __quantum__qis__z__adj(Qubit *q); void __quantum__qis__z__ctl(Array *ctls, Qubit *q); void __quantum__qis__z__ctladj(Array *ctls, Qubit *q); void __quantum__qis__rx__body(double theta, Qubit *q); void __quantum__qis__ry__body(double theta, Qubit *q); void __quantum__qis__rz__body(double theta, Qubit *q); void __quantum__qis__cnot__body(Qubit *src, Qubit *tgt); Result *__quantum__qis__measure__body(Array *bases, Array *qubits); double __quantum__qis__intasdouble__body(int32_t intVal); }
mlir/qir_qrt/qir-qrt.cpp +10 −2 Original line number Diff line number Diff line Loading @@ -224,10 +224,18 @@ void __quantum__rt__finalize() { bool __quantum__rt__result_equal(Result *res, Result *comp) { if (verbose) std::cout << "CALL: " << __PRETTY_FUNCTION__ << "\n"; if (mode == QRT_MODE::NISQ) { throw std::runtime_error( "Comparing Measure results in NISQ mode is prohibited."); } // std::cout << "RES = " << res << "\n"; // std::cout << "COMP = " << comp << "\n"; // We can do pointer comparison here. return res == comp; if (res && comp) { // Do pointer comparison here then fallback by deref the result. return (res == comp) || (*res) == (*comp); } return false; } void __quantum__rt__string_update_reference_count(void *str, int64_t count) { Loading
mlir/qir_qrt/qir-qrt.hpp +7 −50 Original line number Diff line number Diff line #pragma once #include <memory> #include <vector> #include "qalloc.hpp" Loading @@ -19,11 +21,13 @@ extern std::shared_ptr<xacc::AcceleratorBuffer> global_qreg; extern QRT_MODE mode; void initialize(); // Initialize/Finalize/Config API void __quantum__rt__initialize(int argc, int8_t** argv); void __quantum__rt__finalize(); void __quantum__rt__set_external_qreg(qreg* q); // QIS API (i.e. quantum instructions) void __quantum__qis__cnot(Qubit* src, Qubit* tgt); void __quantum__qis__h(Qubit* q); void __quantum__qis__s(Qubit* q); Loading @@ -40,56 +44,9 @@ void __quantum__qis__rx(double x, Qubit* q); void __quantum__qis__ry(double x, Qubit* q); void __quantum__qis__rz(double x, Qubit* q); void __quantum__qis__u3(double theta, double phi, double lambda, Qubit* q); // New QIR runtime API: void __quantum__qis__exp__body(Array* paulis, double angle, Array* qubits); void __quantum__qis__exp__adj(Array* paulis, double angle, Array* qubits); void __quantum__qis__exp__ctl(Array* ctls, Array* paulis, double angle, Array* qubits); void __quantum__qis__exp__ctladj(Array* ctls, Array* paulis, double angle, Array* qubits); void __quantum__qis__h__body(Qubit* q); void __quantum__qis__h__ctl(Array* ctls, Qubit* q); void __quantum__qis__r__body(Pauli pauli, double theta, Qubit* q); void __quantum__qis__r__adj(Pauli pauli, double theta, Qubit* q); void __quantum__qis__r__ctl(Array* ctls, Pauli pauli, double theta, Qubit* q); void __quantum__qis__r__ctladj(Array* ctls, Pauli pauli, double theta, Qubit* q); void __quantum__qis__s__body(Qubit* q); void __quantum__qis__s__adj(Qubit* q); void __quantum__qis__s__ctl(Array* ctls, Qubit* q); void __quantum__qis__s__ctladj(Array* ctls, Qubit* q); void __quantum__qis__t__body(Qubit* q); void __quantum__qis__t__adj(Qubit* q); void __quantum__qis__t__ctl(Array* ctls, Qubit* q); void __quantum__qis__t__ctladj(Array* ctls, Qubit* q); void __quantum__qis__x__body(Qubit* q); void __quantum__qis__x__adj(Qubit* q); void __quantum__qis__x__ctl(Array* ctls, Qubit* q); void __quantum__qis__x__ctladj(Array* ctls, Qubit* q); void __quantum__qis__y__body(Qubit* q); void __quantum__qis__y__adj(Qubit* q); void __quantum__qis__y__ctl(Array* ctls, Qubit* q); void __quantum__qis__y__ctladj(Array* ctls, Qubit* q); void __quantum__qis__z__body(Qubit* q); void __quantum__qis__z__adj(Qubit* q); void __quantum__qis__z__ctl(Array* ctls, Qubit* q); void __quantum__qis__z__ctladj(Array* ctls, Qubit* q); void __quantum__qis__rx__body(double theta, Qubit* q); void __quantum__qis__ry__body(double theta, Qubit* q); void __quantum__qis__rz__body(double theta, Qubit* q); void __quantum__qis__cnot__body(Qubit* src, Qubit* tgt); Result* __quantum__qis__measure__body(Array* bases, Array* qubits); double __quantum__qis__intasdouble__body(int32_t intVal); void __quantum__rt__array_update_alias_count(Array* bases, int64_t count); bool __quantum__rt__result_equal(Result* res, Result* comp); int64_t __quantum__rt__array_get_size_1d(Array* state1); int8_t* __quantum__rt__tuple_create(int64_t state); void __quantum__rt__string_update_reference_count(void* str, int64_t count); void __quantum__rt__array_update_reference_count(Array* aux, int64_t count); void __quantum__rt__result_update_reference_count(Result *, int64_t count); // ===================================================== Result* __quantum__qis__mz(Qubit* q); // Compare results. bool __quantum__rt__result_equal(Result *res, Result *comp); // Qubit Alloc/Dealloc API Array* __quantum__rt__qubit_allocate_array(uint64_t idx); Loading
mlir/qir_qrt/qir-types.hpp +2 −0 Original line number Diff line number Diff line #pragma once #include <cassert> // Defines implementations of QIR Opaque types Loading