Loading mlir/qir_qrt/qir-qrt.cpp +7 −4 Original line number Diff line number Diff line Loading @@ -434,12 +434,15 @@ bool __quantum__rt__result_equal(Result *res, Result *comp) { Result *__quantum__rt__result_get_one() { return ResultOne; } Result *__quantum__rt__result_get_zero() { return ResultZero; } void __quantum__rt__string_update_reference_count(void *str, int32_t count) { void __quantum__rt__result_update_reference_count(Result *, int32_t count) { // TODO if (verbose) std::cout << "CALL: " << __PRETTY_FUNCTION__ << "\n"; } void __quantum__rt__result_update_reference_count(Result *, int32_t count) { // TODO if (verbose) std::cout << "CALL: " << __PRETTY_FUNCTION__ << "\n"; void __quantum__rt__fail(QirString *str) { throw std::runtime_error(str->m_str); } void __quantum__rt__message(QirString *str) { std::cout << "[QIR Message] " << str->m_str << "\n"; } No newline at end of file mlir/qir_qrt/qir-qrt.hpp +24 −2 Original line number Diff line number Diff line Loading @@ -124,8 +124,25 @@ int8_t *__quantum__rt__array_get_element_ptr_nonvariadic(Array *array, int8_t *__quantum__rt__array_get_element_ptr(Array *array, ...); Array *__quantum__rt__array_project(Array *array, int dim, int64_t index); // String-related API void __quantum__rt__string_update_reference_count(void *str, int32_t count); // String-related API: // Specs: https://github.com/microsoft/qsharp-language/blob/main/Specifications/QIR/Data-Types.md#strings void __quantum__rt__string_update_reference_count(QirString *str, int32_t count); QirString *__quantum__rt__string_create(char *null_terminated_buffer); QirString *__quantum__rt__string_concatenate(QirString *in_head, QirString *in_tail); bool __quantum__rt__string_equal(QirString *lhs, QirString *rhs); QirString *__quantum__rt__int_to_string(int64_t val); QirString *__quantum__rt__double_to_string(double val); QirString *__quantum__rt__bool_to_string(bool val); QirString *__quantum__rt__result_to_string(Result *val); QirString *__quantum__rt__pauli_to_string(Pauli pauli); QirString *__quantum__rt__qubit_to_string(Qubit *q); QirString *__quantum__rt__range_to_string(int64_t range_start, int64_t range_step, int64_t range_end); const char *__quantum__rt__string_get_data(QirString *str); int32_t __quantum__rt__string_get_length(QirString *str); // Tuples: TuplePtr __quantum__rt__tuple_create(int64_t size); Loading @@ -142,6 +159,11 @@ void __quantum__rt__capture_update_reference_count(Callable *clb, void __quantum__rt__capture_update_alias_count(Callable *clb, int32_t count); void __quantum__rt__callable_memory_management(int32_t index, Callable *clb, int64_t parameter); // Classical Runtime: // https://github.com/microsoft/qsharp-language/blob/main/Specifications/QIR/Classical-Runtime.md#classical-runtime void __quantum__rt__fail(QirString *str); void __quantum__rt__message(QirString *str); } namespace qcor { Loading mlir/qir_qrt/qir-types.hpp +9 −0 Original line number Diff line number Diff line Loading @@ -238,6 +238,15 @@ private: qcor::qsharp::IFunctor *m_functor; }; // QIR string type (regular string with ref. counting) struct QirString { int32_t m_refCount; std::string m_str; QirString(std::string &&str) : m_refCount(1), m_str(str) {} QirString(const char *cstr) : m_refCount(1), m_str(cstr) {} }; namespace qcor { // Helper func. std::vector<int64_t> getRangeValues(::Array *in_array, const ::Range &in_range); Loading mlir/qir_qrt/qir_rt_string.cpp 0 → 100644 +119 −0 Original line number Diff line number Diff line #include "qir-qrt.hpp" #include <cstring> #include <iostream> extern "C" { void __quantum__rt__string_update_reference_count(QirString *str, int32_t count) { if (verbose) std::cout << "CALL: " << __PRETTY_FUNCTION__ << "\n"; if (str) { str->m_refCount += count; if (str->m_refCount <= 0) { // Dealloc: delete str; } } } QirString *__quantum__rt__string_create(char *null_terminated_buffer) { if (verbose) std::cout << "CALL: " << __PRETTY_FUNCTION__ << "\n"; return new QirString(null_terminated_buffer); } QirString *__quantum__rt__string_concatenate(QirString *in_head, QirString *in_tail) { if (verbose) std::cout << "CALL: " << __PRETTY_FUNCTION__ << "\n"; return new QirString(in_head->m_str + in_tail->m_str); } bool __quantum__rt__string_equal(QirString *lhs, QirString *rhs) { if (verbose) std::cout << "CALL: " << __PRETTY_FUNCTION__ << "\n"; return (lhs->m_str == rhs->m_str); } QirString *__quantum__rt__int_to_string(int64_t val) { if (verbose) std::cout << "CALL: " << __PRETTY_FUNCTION__ << "\n"; return new QirString(std::to_string(val)); } QirString *__quantum__rt__double_to_string(double val) { if (verbose) std::cout << "CALL: " << __PRETTY_FUNCTION__ << "\n"; return new QirString(std::to_string(val)); } QirString *__quantum__rt__bool_to_string(bool val) { if (verbose) std::cout << "CALL: " << __PRETTY_FUNCTION__ << "\n"; return new QirString(std::to_string(val)); } QirString *__quantum__rt__result_to_string(Result *val) { if (verbose) std::cout << "CALL: " << __PRETTY_FUNCTION__ << "\n"; return new QirString(std::to_string(*val)); } QirString *__quantum__rt__pauli_to_string(Pauli pauli) { if (verbose) std::cout << "CALL: " << __PRETTY_FUNCTION__ << "\n"; return new QirString("Pauli"); } QirString *__quantum__rt__qubit_to_string(Qubit *q) { if (verbose) std::cout << "CALL: " << __PRETTY_FUNCTION__ << "\n"; return new QirString("q[" + std::to_string(q->id) + "]"); } QirString *__quantum__rt__range_to_string(int64_t range_start, int64_t range_step, int64_t range_end) { if (verbose) std::cout << "CALL: " << __PRETTY_FUNCTION__ << "\n"; return new QirString("Range(" + std::to_string(range_start) + "," + std::to_string(range_step) + "," + std::to_string(range_end) + ")"); } const char *__quantum__rt__string_get_data(QirString *str) { if (verbose) std::cout << "CALL: " << __PRETTY_FUNCTION__ << "\n"; return str->m_str.c_str(); } int32_t __quantum__rt__string_get_length(QirString *str) { if (verbose) std::cout << "CALL: " << __PRETTY_FUNCTION__ << "\n"; return str->m_str.size(); } } No newline at end of file Loading
mlir/qir_qrt/qir-qrt.cpp +7 −4 Original line number Diff line number Diff line Loading @@ -434,12 +434,15 @@ bool __quantum__rt__result_equal(Result *res, Result *comp) { Result *__quantum__rt__result_get_one() { return ResultOne; } Result *__quantum__rt__result_get_zero() { return ResultZero; } void __quantum__rt__string_update_reference_count(void *str, int32_t count) { void __quantum__rt__result_update_reference_count(Result *, int32_t count) { // TODO if (verbose) std::cout << "CALL: " << __PRETTY_FUNCTION__ << "\n"; } void __quantum__rt__result_update_reference_count(Result *, int32_t count) { // TODO if (verbose) std::cout << "CALL: " << __PRETTY_FUNCTION__ << "\n"; void __quantum__rt__fail(QirString *str) { throw std::runtime_error(str->m_str); } void __quantum__rt__message(QirString *str) { std::cout << "[QIR Message] " << str->m_str << "\n"; } No newline at end of file
mlir/qir_qrt/qir-qrt.hpp +24 −2 Original line number Diff line number Diff line Loading @@ -124,8 +124,25 @@ int8_t *__quantum__rt__array_get_element_ptr_nonvariadic(Array *array, int8_t *__quantum__rt__array_get_element_ptr(Array *array, ...); Array *__quantum__rt__array_project(Array *array, int dim, int64_t index); // String-related API void __quantum__rt__string_update_reference_count(void *str, int32_t count); // String-related API: // Specs: https://github.com/microsoft/qsharp-language/blob/main/Specifications/QIR/Data-Types.md#strings void __quantum__rt__string_update_reference_count(QirString *str, int32_t count); QirString *__quantum__rt__string_create(char *null_terminated_buffer); QirString *__quantum__rt__string_concatenate(QirString *in_head, QirString *in_tail); bool __quantum__rt__string_equal(QirString *lhs, QirString *rhs); QirString *__quantum__rt__int_to_string(int64_t val); QirString *__quantum__rt__double_to_string(double val); QirString *__quantum__rt__bool_to_string(bool val); QirString *__quantum__rt__result_to_string(Result *val); QirString *__quantum__rt__pauli_to_string(Pauli pauli); QirString *__quantum__rt__qubit_to_string(Qubit *q); QirString *__quantum__rt__range_to_string(int64_t range_start, int64_t range_step, int64_t range_end); const char *__quantum__rt__string_get_data(QirString *str); int32_t __quantum__rt__string_get_length(QirString *str); // Tuples: TuplePtr __quantum__rt__tuple_create(int64_t size); Loading @@ -142,6 +159,11 @@ void __quantum__rt__capture_update_reference_count(Callable *clb, void __quantum__rt__capture_update_alias_count(Callable *clb, int32_t count); void __quantum__rt__callable_memory_management(int32_t index, Callable *clb, int64_t parameter); // Classical Runtime: // https://github.com/microsoft/qsharp-language/blob/main/Specifications/QIR/Classical-Runtime.md#classical-runtime void __quantum__rt__fail(QirString *str); void __quantum__rt__message(QirString *str); } namespace qcor { Loading
mlir/qir_qrt/qir-types.hpp +9 −0 Original line number Diff line number Diff line Loading @@ -238,6 +238,15 @@ private: qcor::qsharp::IFunctor *m_functor; }; // QIR string type (regular string with ref. counting) struct QirString { int32_t m_refCount; std::string m_str; QirString(std::string &&str) : m_refCount(1), m_str(str) {} QirString(const char *cstr) : m_refCount(1), m_str(cstr) {} }; namespace qcor { // Helper func. std::vector<int64_t> getRangeValues(::Array *in_array, const ::Range &in_range); Loading
mlir/qir_qrt/qir_rt_string.cpp 0 → 100644 +119 −0 Original line number Diff line number Diff line #include "qir-qrt.hpp" #include <cstring> #include <iostream> extern "C" { void __quantum__rt__string_update_reference_count(QirString *str, int32_t count) { if (verbose) std::cout << "CALL: " << __PRETTY_FUNCTION__ << "\n"; if (str) { str->m_refCount += count; if (str->m_refCount <= 0) { // Dealloc: delete str; } } } QirString *__quantum__rt__string_create(char *null_terminated_buffer) { if (verbose) std::cout << "CALL: " << __PRETTY_FUNCTION__ << "\n"; return new QirString(null_terminated_buffer); } QirString *__quantum__rt__string_concatenate(QirString *in_head, QirString *in_tail) { if (verbose) std::cout << "CALL: " << __PRETTY_FUNCTION__ << "\n"; return new QirString(in_head->m_str + in_tail->m_str); } bool __quantum__rt__string_equal(QirString *lhs, QirString *rhs) { if (verbose) std::cout << "CALL: " << __PRETTY_FUNCTION__ << "\n"; return (lhs->m_str == rhs->m_str); } QirString *__quantum__rt__int_to_string(int64_t val) { if (verbose) std::cout << "CALL: " << __PRETTY_FUNCTION__ << "\n"; return new QirString(std::to_string(val)); } QirString *__quantum__rt__double_to_string(double val) { if (verbose) std::cout << "CALL: " << __PRETTY_FUNCTION__ << "\n"; return new QirString(std::to_string(val)); } QirString *__quantum__rt__bool_to_string(bool val) { if (verbose) std::cout << "CALL: " << __PRETTY_FUNCTION__ << "\n"; return new QirString(std::to_string(val)); } QirString *__quantum__rt__result_to_string(Result *val) { if (verbose) std::cout << "CALL: " << __PRETTY_FUNCTION__ << "\n"; return new QirString(std::to_string(*val)); } QirString *__quantum__rt__pauli_to_string(Pauli pauli) { if (verbose) std::cout << "CALL: " << __PRETTY_FUNCTION__ << "\n"; return new QirString("Pauli"); } QirString *__quantum__rt__qubit_to_string(Qubit *q) { if (verbose) std::cout << "CALL: " << __PRETTY_FUNCTION__ << "\n"; return new QirString("q[" + std::to_string(q->id) + "]"); } QirString *__quantum__rt__range_to_string(int64_t range_start, int64_t range_step, int64_t range_end) { if (verbose) std::cout << "CALL: " << __PRETTY_FUNCTION__ << "\n"; return new QirString("Range(" + std::to_string(range_start) + "," + std::to_string(range_step) + "," + std::to_string(range_end) + ")"); } const char *__quantum__rt__string_get_data(QirString *str) { if (verbose) std::cout << "CALL: " << __PRETTY_FUNCTION__ << "\n"; return str->m_str.c_str(); } int32_t __quantum__rt__string_get_length(QirString *str) { if (verbose) std::cout << "CALL: " << __PRETTY_FUNCTION__ << "\n"; return str->m_str.size(); } } No newline at end of file