From 94ea3f8312794de66a13518157ca228843528dac Mon Sep 17 00:00:00 2001 From: Robin Kuzmin Date: Mon, 22 Mar 2021 17:40:03 -0700 Subject: [PATCH 1/7] Turned off the test for Message() --- .../test/QIR-static/qir-test-ouput.cpp | 31 ++++++++++--------- 1 file changed, 16 insertions(+), 15 deletions(-) diff --git a/src/QirRuntime/test/QIR-static/qir-test-ouput.cpp b/src/QirRuntime/test/QIR-static/qir-test-ouput.cpp index a7d47893926..d276956ab47 100644 --- a/src/QirRuntime/test/QIR-static/qir-test-ouput.cpp +++ b/src/QirRuntime/test/QIR-static/qir-test-ouput.cpp @@ -31,23 +31,24 @@ struct OstreamRedirectorScoped }; -TEST_CASE("QIR: Out.Message", "[qir.Out][qir.Out.Message]") -{ - const std::string testStr1 = "Test String 1"; - const std::string testStr2 = "Test String 2"; +// To do: Uncomment after the https://github.com/microsoft/qsharp-runtime/issues/578 is resolved. +// TEST_CASE("QIR: Out.Message", "[qir.Out][qir.Out.Message]") +// { +// const std::string testStr1 = "Test String 1"; +// const std::string testStr2 = "Test String 2"; - std::ostringstream outStrStream; +// std::ostringstream outStrStream; - { - OstreamRedirectorScoped qOStreamRedirector(outStrStream); // Redirect the output from std::cout to outStrStream. +// { +// OstreamRedirectorScoped qOStreamRedirector(outStrStream); // Redirect the output from std::cout to outStrStream. - // Log something (to the redirected output): - QirString qstr{std::string(testStr1)}; - Microsoft__Quantum__Testing__QIR__Out__MessageTest__body(&qstr); - qstr.str = testStr2; - Microsoft__Quantum__Testing__QIR__Out__MessageTest__body(&qstr); +// // Log something (to the redirected output): +// QirString qstr{std::string(testStr1)}; +// Microsoft__Quantum__Testing__QIR__Out__MessageTest__body(&qstr); +// qstr.str = testStr2; +// Microsoft__Quantum__Testing__QIR__Out__MessageTest__body(&qstr); - } // Recover the output stream. +// } // Recover the output stream. - REQUIRE(outStrStream.str() == (testStr1 + "\n" + testStr2 + "\n")); -} +// REQUIRE(outStrStream.str() == (testStr1 + "\n" + testStr2 + "\n")); +// } From 9a5ac93bbbe4917f41f9bc4d3a03e2bb0aa76974 Mon Sep 17 00:00:00 2001 From: Robin Kuzmin Date: Mon, 22 Mar 2021 17:43:30 -0700 Subject: [PATCH 2/7] Moved lib/QSharpFoundation/intrinsicsOut.cpp -> lib/QIR/rtOut.cpp. --- .../lib/{QSharpFoundation/intrinsicsOut.cpp => QIR/rtOut.cpp} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/QirRuntime/lib/{QSharpFoundation/intrinsicsOut.cpp => QIR/rtOut.cpp} (100%) diff --git a/src/QirRuntime/lib/QSharpFoundation/intrinsicsOut.cpp b/src/QirRuntime/lib/QIR/rtOut.cpp similarity index 100% rename from src/QirRuntime/lib/QSharpFoundation/intrinsicsOut.cpp rename to src/QirRuntime/lib/QIR/rtOut.cpp From 91f7bb64d4dcc7c3d91537de705411c79c7f5cfe Mon Sep 17 00:00:00 2001 From: Robin Kuzmin Date: Mon, 22 Mar 2021 19:10:27 -0700 Subject: [PATCH 3/7] Moved SetOutputStream() --- src/QirRuntime/lib/QIR/CMakeLists.txt | 1 + src/QirRuntime/lib/QIR/bridge-rt.ll | 18 ++++++++++++++++-- src/QirRuntime/lib/QIR/rtOut.cpp | 6 +++--- src/QirRuntime/lib/QIR/utils.cpp | 6 ------ .../lib/QSharpFoundation/CMakeLists.txt | 1 - .../QSharpFoundation/qsharp-foundation-qis.ll | 5 +++-- .../qsharp__foundation__qis.hpp | 2 +- src/QirRuntime/public/QirRuntime.hpp | 12 +++++++++++- src/QirRuntime/public/SimFactory.hpp | 1 - .../test/QIR-static/qir-test-ouput.cpp | 5 +++-- 10 files changed, 38 insertions(+), 19 deletions(-) diff --git a/src/QirRuntime/lib/QIR/CMakeLists.txt b/src/QirRuntime/lib/QIR/CMakeLists.txt index 8f1d7226ee1..a9afbe799ef 100644 --- a/src/QirRuntime/lib/QIR/CMakeLists.txt +++ b/src/QirRuntime/lib/QIR/CMakeLists.txt @@ -22,6 +22,7 @@ set(rt_sup_source_files delegated.cpp strings.cpp utils.cpp + rtOut.cpp ) add_library(qir-rt-support ${rt_sup_source_files}) diff --git a/src/QirRuntime/lib/QIR/bridge-rt.ll b/src/QirRuntime/lib/QIR/bridge-rt.ll index ebb41b97528..9ed2ee01276 100644 --- a/src/QirRuntime/lib/QIR/bridge-rt.ll +++ b/src/QirRuntime/lib/QIR/bridge-rt.ll @@ -108,6 +108,10 @@ declare i8* @quantum__rt_string_get_data(%"struct.QirString"* %str) declare i32 @quantum__rt_string_get_length(%"struct.QirString"* %str) +;------------------------------------------------------------------------------ +; message +; +declare void @quantum__rt__message(%"struct.QirString"* %str) ;======================================================================================================================= ; __quantum__rt__* bridge implementation @@ -480,19 +484,29 @@ define dllexport %String* @__quantum__rt__range_to_string(%Range %.range) { ret %String* %.str } -define i8* @__quantum__rt_string_get_data(%String* %.str) { +define dllexport i8* @__quantum__rt_string_get_data(%String* %.str) { %str = bitcast %String* %.str to %"struct.QirString"* %result = call i8* @quantum__rt_string_get_data(%"struct.QirString"* %str) ret i8* %result } -define i32 @__quantum__rt_string_get_length(%String* %.str) { +define dllexport i32 @__quantum__rt_string_get_length(%String* %.str) { %str = bitcast %String* %.str to %"struct.QirString"* %result = call i32 @quantum__rt_string_get_length(%"struct.QirString"* %str) ret i32 %result } +;------------------------------------------------------------------------------ +; message bridge +; +define dllexport void @__quantum__rt__message(%String* %.str) { + %str = bitcast %String* %.str to %"struct.QirString"* + call void @quantum__rt__message(%"struct.QirString"* %str) + ret void +} + + ;------------------------------------------------------------------------------ ; bigints bridge ; diff --git a/src/QirRuntime/lib/QIR/rtOut.cpp b/src/QirRuntime/lib/QIR/rtOut.cpp index 99eb2292dac..c1a36eb7725 100644 --- a/src/QirRuntime/lib/QIR/rtOut.cpp +++ b/src/QirRuntime/lib/QIR/rtOut.cpp @@ -4,8 +4,8 @@ #include #include "QirTypes.hpp" -#include "SimFactory.hpp" -#include "qsharp__foundation__qis.hpp" +//#include "SimFactory.hpp" +//#include "qsharp__foundation__qis.hpp" // Forward declarations: static std::ostream& GetOutputStream(); @@ -13,7 +13,7 @@ static std::ostream& GetOutputStream(); // Public API: extern "C" { - void quantum__qis__message__body(QirString* qstr) // NOLINT + void quantum__rt__message(QirString* qstr) // NOLINT { GetOutputStream() << qstr->str << std::endl; } diff --git a/src/QirRuntime/lib/QIR/utils.cpp b/src/QirRuntime/lib/QIR/utils.cpp index 00bd1959ed5..16ab94fa645 100644 --- a/src/QirRuntime/lib/QIR/utils.cpp +++ b/src/QirRuntime/lib/QIR/utils.cpp @@ -59,10 +59,4 @@ extern "C" throw std::runtime_error(str); } - // Include the given message in the computation's execution log or equivalent. - // TODO: should we allow the user to register their own output? - void quantum__rt__message(QirString* msg) // NOLINT - { - std::cout << msg->str; - } } \ No newline at end of file diff --git a/src/QirRuntime/lib/QSharpFoundation/CMakeLists.txt b/src/QirRuntime/lib/QSharpFoundation/CMakeLists.txt index 6318dc7f062..216b971b9d8 100644 --- a/src/QirRuntime/lib/QSharpFoundation/CMakeLists.txt +++ b/src/QirRuntime/lib/QSharpFoundation/CMakeLists.txt @@ -13,7 +13,6 @@ compile_from_qir(qsharp-foundation-qis ${qsharp_foundation_qis_target}) # set(qsharp_foundation_sup_source_files intrinsicsMath.cpp - intrinsicsOut.cpp conditionals.cpp ) diff --git a/src/QirRuntime/lib/QSharpFoundation/qsharp-foundation-qis.ll b/src/QirRuntime/lib/QSharpFoundation/qsharp-foundation-qis.ll index 4bc362335c1..fdb635a6485 100644 --- a/src/QirRuntime/lib/QSharpFoundation/qsharp-foundation-qis.ll +++ b/src/QirRuntime/lib/QSharpFoundation/qsharp-foundation-qis.ll @@ -31,13 +31,14 @@ %struct.QirString = type opaque %PauliId = type i32 -declare void @quantum__qis__message__body(%struct.QirString* %str) +;declare void @quantum__qis__message__body(%struct.QirString* %str) ;=============================================================================== ; +; To do: remove this function after the https://github.com/microsoft/qsharp-runtime/issues/578 is resolved. define dllexport void @__quantum__qis__message__body(%String* %.str) { %str = bitcast %String* %.str to %struct.QirString* - call void @quantum__qis__message__body(%struct.QirString* %str) + ;call void @quantum__qis__message__body(%struct.QirString* %str) ret void } diff --git a/src/QirRuntime/lib/QSharpFoundation/qsharp__foundation__qis.hpp b/src/QirRuntime/lib/QSharpFoundation/qsharp__foundation__qis.hpp index 3c15948463b..3dd16480a20 100644 --- a/src/QirRuntime/lib/QSharpFoundation/qsharp__foundation__qis.hpp +++ b/src/QirRuntime/lib/QSharpFoundation/qsharp__foundation__qis.hpp @@ -27,7 +27,7 @@ namespace Quantum */ extern "C" { - QIR_SHARED_API void quantum__qis__message__body(QirString* qstr); // NOLINT + //QIR_SHARED_API void quantum__qis__message__body(QirString* qstr); // NOLINT // Q# Math: QIR_SHARED_API bool quantum__qis__isnan__body(double d); // NOLINT diff --git a/src/QirRuntime/public/QirRuntime.hpp b/src/QirRuntime/public/QirRuntime.hpp index 563af6a2d50..f7f393eaaa0 100644 --- a/src/QirRuntime/public/QirRuntime.hpp +++ b/src/QirRuntime/public/QirRuntime.hpp @@ -5,6 +5,7 @@ #include #include // for va_list +#include #include "CoreTypes.hpp" #include "QirTypes.hpp" @@ -302,4 +303,13 @@ extern "C" // Returns true if the first big integer is greater than or equal to the second, false otherwise. // TODO QIR_SHARED_API bool quantum__rt__bigint_greater_eq(QirBigInt*, QirBigInt*); // NOLINT -} \ No newline at end of file +} + +// To do: consider extracting to QirRuntimeOut.hpp +namespace Microsoft // Replace with `namespace Microsoft::Quantum` after migration to C++17. +{ +namespace Quantum +{ + QIR_SHARED_API std::ostream& SetOutputStream(std::ostream & newOStream); +} // namespace Microsoft +} // namespace Quantum diff --git a/src/QirRuntime/public/SimFactory.hpp b/src/QirRuntime/public/SimFactory.hpp index f8ab837443e..14128657262 100644 --- a/src/QirRuntime/public/SimFactory.hpp +++ b/src/QirRuntime/public/SimFactory.hpp @@ -18,6 +18,5 @@ namespace Quantum // Full State Simulator QIR_SHARED_API std::unique_ptr CreateFullstateSimulator(); - QIR_SHARED_API std::ostream& SetOutputStream(std::ostream& newOStream); } // namespace Quantum } // namespace Microsoft \ No newline at end of file diff --git a/src/QirRuntime/test/QIR-static/qir-test-ouput.cpp b/src/QirRuntime/test/QIR-static/qir-test-ouput.cpp index d276956ab47..b8dd38547df 100644 --- a/src/QirRuntime/test/QIR-static/qir-test-ouput.cpp +++ b/src/QirRuntime/test/QIR-static/qir-test-ouput.cpp @@ -6,8 +6,9 @@ #include "catch.hpp" #include "QirTypes.hpp" -#include "SimFactory.hpp" -#include "qsharp__foundation_internal.hpp" +#include "QirRuntime.hpp" +//#include "SimFactory.hpp" +//#include "qsharp__foundation_internal.hpp" extern "C" void Microsoft__Quantum__Testing__QIR__Out__MessageTest__body(void*); // NOLINT From 17a125d0e3b388606a44237597e753ac6610ec46 Mon Sep 17 00:00:00 2001 From: Robin Kuzmin Date: Mon, 22 Mar 2021 20:18:10 -0700 Subject: [PATCH 4/7] Build fix. --- src/QirRuntime/lib/QIR/rtOut.cpp | 1 + src/QirRuntime/lib/QSharpFoundation/qsharp-foundation-qis.ll | 2 ++ 2 files changed, 3 insertions(+) diff --git a/src/QirRuntime/lib/QIR/rtOut.cpp b/src/QirRuntime/lib/QIR/rtOut.cpp index c1a36eb7725..90e66500d57 100644 --- a/src/QirRuntime/lib/QIR/rtOut.cpp +++ b/src/QirRuntime/lib/QIR/rtOut.cpp @@ -4,6 +4,7 @@ #include #include "QirTypes.hpp" +#include "QirRuntime.hpp" //#include "SimFactory.hpp" //#include "qsharp__foundation__qis.hpp" diff --git a/src/QirRuntime/lib/QSharpFoundation/qsharp-foundation-qis.ll b/src/QirRuntime/lib/QSharpFoundation/qsharp-foundation-qis.ll index fdb635a6485..a64bd816c41 100644 --- a/src/QirRuntime/lib/QSharpFoundation/qsharp-foundation-qis.ll +++ b/src/QirRuntime/lib/QSharpFoundation/qsharp-foundation-qis.ll @@ -32,6 +32,7 @@ %PauliId = type i32 ;declare void @quantum__qis__message__body(%struct.QirString* %str) +declare void @quantum__rt__message(%"struct.QirString"* %str) ;=============================================================================== ; @@ -39,6 +40,7 @@ define dllexport void @__quantum__qis__message__body(%String* %.str) { %str = bitcast %String* %.str to %struct.QirString* ;call void @quantum__qis__message__body(%struct.QirString* %str) + call void @quantum__rt__message(%"struct.QirString"* %str) ret void } From 419f09a92e29941ff5056c1b6cb1b02f8425fa00 Mon Sep 17 00:00:00 2001 From: Robin Kuzmin Date: Mon, 22 Mar 2021 20:23:05 -0700 Subject: [PATCH 5/7] Uncommented the test --- .../test/QIR-static/qir-test-ouput.cpp | 31 +++++++++---------- 1 file changed, 15 insertions(+), 16 deletions(-) diff --git a/src/QirRuntime/test/QIR-static/qir-test-ouput.cpp b/src/QirRuntime/test/QIR-static/qir-test-ouput.cpp index b8dd38547df..674d057673c 100644 --- a/src/QirRuntime/test/QIR-static/qir-test-ouput.cpp +++ b/src/QirRuntime/test/QIR-static/qir-test-ouput.cpp @@ -32,24 +32,23 @@ struct OstreamRedirectorScoped }; -// To do: Uncomment after the https://github.com/microsoft/qsharp-runtime/issues/578 is resolved. -// TEST_CASE("QIR: Out.Message", "[qir.Out][qir.Out.Message]") -// { -// const std::string testStr1 = "Test String 1"; -// const std::string testStr2 = "Test String 2"; +TEST_CASE("QIR: Out.Message", "[qir.Out][qir.Out.Message]") +{ + const std::string testStr1 = "Test String 1"; + const std::string testStr2 = "Test String 2"; -// std::ostringstream outStrStream; + std::ostringstream outStrStream; -// { -// OstreamRedirectorScoped qOStreamRedirector(outStrStream); // Redirect the output from std::cout to outStrStream. + { + OstreamRedirectorScoped qOStreamRedirector(outStrStream); // Redirect the output from std::cout to outStrStream. -// // Log something (to the redirected output): -// QirString qstr{std::string(testStr1)}; -// Microsoft__Quantum__Testing__QIR__Out__MessageTest__body(&qstr); -// qstr.str = testStr2; -// Microsoft__Quantum__Testing__QIR__Out__MessageTest__body(&qstr); + // Log something (to the redirected output): + QirString qstr{std::string(testStr1)}; + Microsoft__Quantum__Testing__QIR__Out__MessageTest__body(&qstr); + qstr.str = testStr2; + Microsoft__Quantum__Testing__QIR__Out__MessageTest__body(&qstr); -// } // Recover the output stream. + } // Recover the output stream. -// REQUIRE(outStrStream.str() == (testStr1 + "\n" + testStr2 + "\n")); -// } + REQUIRE(outStrStream.str() == (testStr1 + "\n" + testStr2 + "\n")); +} From d31ce0b436238c86f2e75e137fb09e66c288db49 Mon Sep 17 00:00:00 2001 From: Robin Kuzmin Date: Mon, 22 Mar 2021 20:30:48 -0700 Subject: [PATCH 6/7] Clean-up. --- src/QirRuntime/lib/QIR/rtOut.cpp | 2 -- src/QirRuntime/lib/QSharpFoundation/qsharp-foundation-qis.ll | 4 +--- .../lib/QSharpFoundation/qsharp__foundation__qis.hpp | 2 -- src/QirRuntime/test/QIR-static/qir-test-ouput.cpp | 2 -- 4 files changed, 1 insertion(+), 9 deletions(-) diff --git a/src/QirRuntime/lib/QIR/rtOut.cpp b/src/QirRuntime/lib/QIR/rtOut.cpp index 90e66500d57..5f921c706fc 100644 --- a/src/QirRuntime/lib/QIR/rtOut.cpp +++ b/src/QirRuntime/lib/QIR/rtOut.cpp @@ -5,8 +5,6 @@ #include "QirTypes.hpp" #include "QirRuntime.hpp" -//#include "SimFactory.hpp" -//#include "qsharp__foundation__qis.hpp" // Forward declarations: static std::ostream& GetOutputStream(); diff --git a/src/QirRuntime/lib/QSharpFoundation/qsharp-foundation-qis.ll b/src/QirRuntime/lib/QSharpFoundation/qsharp-foundation-qis.ll index a64bd816c41..71b45b7c692 100644 --- a/src/QirRuntime/lib/QSharpFoundation/qsharp-foundation-qis.ll +++ b/src/QirRuntime/lib/QSharpFoundation/qsharp-foundation-qis.ll @@ -31,15 +31,13 @@ %struct.QirString = type opaque %PauliId = type i32 -;declare void @quantum__qis__message__body(%struct.QirString* %str) -declare void @quantum__rt__message(%"struct.QirString"* %str) +declare dllimport void @quantum__rt__message(%"struct.QirString"* %str) ;=============================================================================== ; ; To do: remove this function after the https://github.com/microsoft/qsharp-runtime/issues/578 is resolved. define dllexport void @__quantum__qis__message__body(%String* %.str) { %str = bitcast %String* %.str to %struct.QirString* - ;call void @quantum__qis__message__body(%struct.QirString* %str) call void @quantum__rt__message(%"struct.QirString"* %str) ret void } diff --git a/src/QirRuntime/lib/QSharpFoundation/qsharp__foundation__qis.hpp b/src/QirRuntime/lib/QSharpFoundation/qsharp__foundation__qis.hpp index 3dd16480a20..5e64f5f0751 100644 --- a/src/QirRuntime/lib/QSharpFoundation/qsharp__foundation__qis.hpp +++ b/src/QirRuntime/lib/QSharpFoundation/qsharp__foundation__qis.hpp @@ -27,8 +27,6 @@ namespace Quantum */ extern "C" { - //QIR_SHARED_API void quantum__qis__message__body(QirString* qstr); // NOLINT - // Q# Math: QIR_SHARED_API bool quantum__qis__isnan__body(double d); // NOLINT QIR_SHARED_API double quantum__qis__infinity__body(); // NOLINT diff --git a/src/QirRuntime/test/QIR-static/qir-test-ouput.cpp b/src/QirRuntime/test/QIR-static/qir-test-ouput.cpp index 674d057673c..9331edc0a0f 100644 --- a/src/QirRuntime/test/QIR-static/qir-test-ouput.cpp +++ b/src/QirRuntime/test/QIR-static/qir-test-ouput.cpp @@ -7,8 +7,6 @@ #include "QirTypes.hpp" #include "QirRuntime.hpp" -//#include "SimFactory.hpp" -//#include "qsharp__foundation_internal.hpp" extern "C" void Microsoft__Quantum__Testing__QIR__Out__MessageTest__body(void*); // NOLINT From c5bd53ef21035e284d20c54c5f92f81d0836de2f Mon Sep 17 00:00:00 2001 From: Robin Kuzmin Date: Tue, 23 Mar 2021 08:18:17 -0700 Subject: [PATCH 7/7] CR changes --- src/QirRuntime/lib/QIR/bridge-rt.ll | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/src/QirRuntime/lib/QIR/bridge-rt.ll b/src/QirRuntime/lib/QIR/bridge-rt.ll index 9ed2ee01276..71498842c92 100644 --- a/src/QirRuntime/lib/QIR/bridge-rt.ll +++ b/src/QirRuntime/lib/QIR/bridge-rt.ll @@ -142,6 +142,12 @@ define dllexport void @__quantum__rt__fail(%String* %.str) { ret void } +define dllexport void @__quantum__rt__message(%String* %.str) { + %str = bitcast %String* %.str to %"struct.QirString"* + call void @quantum__rt__message(%"struct.QirString"* %str) + ret void +} + ;------------------------------------------------------------------------------ ; qubits bridge @@ -497,15 +503,6 @@ define dllexport i32 @__quantum__rt_string_get_length(%String* %.str) { } -;------------------------------------------------------------------------------ -; message bridge -; -define dllexport void @__quantum__rt__message(%String* %.str) { - %str = bitcast %String* %.str to %"struct.QirString"* - call void @quantum__rt__message(%"struct.QirString"* %str) - ret void -} - ;------------------------------------------------------------------------------ ; bigints bridge