diff --git a/sycl/include/CL/sycl.hpp b/sycl/include/CL/sycl.hpp index 8ca7d28223cad..f5d9aa76ff093 100644 --- a/sycl/include/CL/sycl.hpp +++ b/sycl/include/CL/sycl.hpp @@ -71,3 +71,5 @@ #include #include #include + +#include diff --git a/sycl/include/sycl/ext/intel/experimental/pipe_properties.hpp b/sycl/include/sycl/ext/intel/experimental/pipe_properties.hpp new file mode 100644 index 0000000000000..e4e012ccd972d --- /dev/null +++ b/sycl/include/sycl/ext/intel/experimental/pipe_properties.hpp @@ -0,0 +1,197 @@ +//==----- pipe_properties.hpp - SYCL properties associated with data flow pipe +//---==// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#pragma once + +#include +#include + +__SYCL_INLINE_NAMESPACE(cl) { +namespace sycl { +namespace ext { +namespace intel { +namespace experimental { + +struct min_capacity_key { + template + using value_t = oneapi::experimental::property_value< + min_capacity_key, std::integral_constant>; +}; + +struct ready_latency_key { + template + using value_t = oneapi::experimental::property_value< + ready_latency_key, std::integral_constant>; +}; + +struct bits_per_symbol_key { + template + using value_t = + oneapi::experimental::property_value>; +}; + +struct uses_valid_key { + template + using value_t = + oneapi::experimental::property_value>; +}; + +struct uses_ready_key { + template + using value_t = + oneapi::experimental::property_value>; +}; + +struct in_csr_key { + template + using value_t = + oneapi::experimental::property_value>; +}; + +struct first_symbol_in_high_order_bits_key { + template + using value_t = oneapi::experimental::property_value< + first_symbol_in_high_order_bits_key, + sycl::detail::bool_constant>; +}; + +enum class protocol_name : std::uint16_t { AVALON, AXI }; +struct protocol_key { + template + using value_t = oneapi::experimental::property_value< + protocol_key, std::integral_constant>; +}; + +template +inline constexpr min_capacity_key::value_t min_capacity; + +template +inline constexpr ready_latency_key::value_t ready_latency; + +template +inline constexpr bits_per_symbol_key::value_t bits_per_symbol; + +template +inline constexpr uses_valid_key::value_t uses_valid; +inline constexpr uses_valid_key::value_t uses_valid_on; +inline constexpr uses_valid_key::value_t uses_valid_off; + +template +inline constexpr uses_ready_key::value_t uses_ready; +inline constexpr uses_ready_key::value_t uses_ready_on; +inline constexpr uses_ready_key::value_t uses_ready_off; + +template inline constexpr in_csr_key::value_t in_csr; +inline constexpr in_csr_key::value_t in_csr_on; +inline constexpr in_csr_key::value_t in_csr_off; + +template +inline constexpr first_symbol_in_high_order_bits_key::value_t + first_symbol_in_high_order_bits; +inline constexpr first_symbol_in_high_order_bits_key::value_t + first_symbol_in_high_order_bits_on; +inline constexpr first_symbol_in_high_order_bits_key::value_t + first_symbol_in_high_order_bits_off; + +template +inline constexpr protocol_key::value_t protocol; +inline constexpr protocol_key::value_t protocol_avalon; +inline constexpr protocol_key::value_t protocol_axi; + +} // namespace experimental +} // namespace intel + +namespace oneapi { +namespace experimental { + +template <> +struct is_property_key : std::true_type { +}; +template <> +struct is_property_key + : std::true_type {}; +template <> +struct is_property_key + : std::true_type {}; +template <> +struct is_property_key : std::true_type {}; +template <> +struct is_property_key : std::true_type {}; +template <> +struct is_property_key : std::true_type {}; +template <> +struct is_property_key + : std::true_type {}; +template <> +struct is_property_key : std::true_type {}; + +namespace detail { +template <> struct PropertyToKind { + static constexpr PropKind Kind = PropKind::MinCapacity; +}; +template <> struct PropertyToKind { + static constexpr PropKind Kind = PropKind::ReadyLatency; +}; +template <> struct PropertyToKind { + static constexpr PropKind Kind = PropKind::BitsPerSymbol; +}; +template <> struct PropertyToKind { + static constexpr PropKind Kind = PropKind::UsesValid; +}; +template <> struct PropertyToKind { + static constexpr PropKind Kind = PropKind::UsesReady; +}; +template <> struct PropertyToKind { + static constexpr PropKind Kind = PropKind::ImplementInCSR; +}; +template <> +struct PropertyToKind< + intel::experimental::first_symbol_in_high_order_bits_key> { + static constexpr PropKind Kind = PropKind::FirstSymbolInHigherOrderBit; +}; +template <> struct PropertyToKind { + static constexpr PropKind Kind = PropKind::PipeProtocol; +}; + +template <> +struct IsCompileTimeProperty + : std::true_type {}; +template <> +struct IsCompileTimeProperty + : std::true_type {}; +template <> +struct IsCompileTimeProperty + : std::true_type {}; +template <> +struct IsCompileTimeProperty + : std::true_type {}; +template <> +struct IsCompileTimeProperty + : std::true_type {}; +template <> +struct IsCompileTimeProperty : std::true_type { +}; +template <> +struct IsCompileTimeProperty< + intel::experimental::first_symbol_in_high_order_bits_key> : std::true_type { +}; +template <> +struct IsCompileTimeProperty + : std::true_type {}; + +} // namespace detail +} // namespace experimental +} // namespace oneapi +} // namespace ext +} // namespace sycl +} // __SYCL_INLINE_NAMESPACE(cl) diff --git a/sycl/include/sycl/ext/oneapi/properties/property.hpp b/sycl/include/sycl/ext/oneapi/properties/property.hpp index 658fa6721ca20..bde7ccd85c6b1 100644 --- a/sycl/include/sycl/ext/oneapi/properties/property.hpp +++ b/sycl/include/sycl/ext/oneapi/properties/property.hpp @@ -148,7 +148,14 @@ enum PropKind : uint32_t { HostAccess = 1, InitMode = 2, ImplementInCSR = 3, - PropKindSize = 4, + BitsPerSymbol = 4, + FirstSymbolInHigherOrderBit = 5, + MinCapacity = 6, + PipeProtocol = 7, + ReadyLatency = 8, + UsesReady = 9, + UsesValid = 10, + PropKindSize = 11, }; // This trait must be specialized for all properties and must have a unique diff --git a/sycl/test/extensions/properties/properties_pipe.cpp b/sycl/test/extensions/properties/properties_pipe.cpp new file mode 100644 index 0000000000000..9179d9f66c003 --- /dev/null +++ b/sycl/test/extensions/properties/properties_pipe.cpp @@ -0,0 +1,168 @@ +// RUN: %clangxx -fsycl -fsycl-targets=%sycl_triple -fsyntax-only -Xclang -verify -Xclang -verify-ignore-unexpected=note,warning %s +// expected-no-diagnostics + +#include + +#include + +using namespace sycl::ext; + +constexpr sycl::ext::intel::experimental::protocol_name TestProtocol = + sycl::ext::intel::experimental::protocol_name::AVALON; + +int main() { + // Check that is_property_key is correctly specialized. + static_assert(sycl::ext::oneapi::experimental::is_property_key< + sycl::ext::intel::experimental::min_capacity_key>::value); + static_assert(sycl::ext::oneapi::experimental::is_property_key< + sycl::ext::intel::experimental::ready_latency_key>::value); + static_assert(sycl::ext::oneapi::experimental::is_property_key< + sycl::ext::intel::experimental::bits_per_symbol_key>::value); + static_assert(sycl::ext::oneapi::experimental::is_property_key< + sycl::ext::intel::experimental::uses_valid_key>::value); + static_assert(sycl::ext::oneapi::experimental::is_property_key< + sycl::ext::intel::experimental::uses_ready_key>::value); + static_assert(sycl::ext::oneapi::experimental::is_property_key< + sycl::ext::intel::experimental::in_csr_key>::value); + static_assert( + sycl::ext::oneapi::experimental::is_property_key< + sycl::ext::intel::experimental::first_symbol_in_high_order_bits_key>:: + value); + static_assert(sycl::ext::oneapi::experimental::is_property_key< + sycl::ext::intel::experimental::protocol_key>::value); + + // Check that is_property_value is correctly specialized. + static_assert( + sycl::ext::oneapi::experimental::is_property_value< + decltype(sycl::ext::intel::experimental::min_capacity<3>)>::value); + static_assert( + sycl::ext::oneapi::experimental::is_property_value< + decltype(sycl::ext::intel::experimental::ready_latency<3>)>::value); + static_assert( + sycl::ext::oneapi::experimental::is_property_value< + decltype(sycl::ext::intel::experimental::bits_per_symbol<3>)>::value); + + static_assert( + sycl::ext::oneapi::experimental::is_property_value< + decltype(sycl::ext::intel::experimental::uses_valid)>::value); + static_assert( + sycl::ext::oneapi::experimental::is_property_value< + decltype(sycl::ext::intel::experimental::uses_valid_on)>::value); + static_assert( + sycl::ext::oneapi::experimental::is_property_value< + decltype(sycl::ext::intel::experimental::uses_valid_off)>::value); + + static_assert( + sycl::ext::oneapi::experimental::is_property_value< + decltype(sycl::ext::intel::experimental::uses_ready)>::value); + static_assert( + sycl::ext::oneapi::experimental::is_property_value< + decltype(sycl::ext::intel::experimental::uses_ready_on)>::value); + static_assert( + sycl::ext::oneapi::experimental::is_property_value< + decltype(sycl::ext::intel::experimental::uses_ready_off)>::value); + + static_assert(sycl::ext::oneapi::experimental::is_property_value< + decltype(sycl::ext::intel::experimental::in_csr)>::value); + static_assert(sycl::ext::oneapi::experimental::is_property_value< + decltype(sycl::ext::intel::experimental::in_csr_on)>::value); + static_assert(sycl::ext::oneapi::experimental::is_property_value< + decltype(sycl::ext::intel::experimental::in_csr_off)>::value); + + static_assert(sycl::ext::oneapi::experimental::is_property_value< + decltype(sycl::ext::intel::experimental:: + first_symbol_in_high_order_bits)>::value); + static_assert(sycl::ext::oneapi::experimental::is_property_value< + decltype(sycl::ext::intel::experimental:: + first_symbol_in_high_order_bits_on)>::value); + static_assert(sycl::ext::oneapi::experimental::is_property_value< + decltype(sycl::ext::intel::experimental:: + first_symbol_in_high_order_bits_off)>::value); + + static_assert( + sycl::ext::oneapi::experimental::is_property_value< + decltype(sycl::ext::intel::experimental::protocol)>:: + value); + static_assert( + sycl::ext::oneapi::experimental::is_property_value< + decltype(sycl::ext::intel::experimental::protocol_avalon)>::value); + static_assert(sycl::ext::oneapi::experimental::is_property_value< + decltype(sycl::ext::intel::experimental::protocol_axi)>::value); + + // Checks that fully specialized properties are the same as the templated + // variants. + static_assert(std::is_same_v< + decltype(sycl::ext::intel::experimental::uses_valid_on), + decltype(sycl::ext::intel::experimental::uses_valid)>); + static_assert(std::is_same_v< + decltype(sycl::ext::intel::experimental::uses_ready_off), + decltype(sycl::ext::intel::experimental::uses_ready)>); + static_assert( + std::is_same_v)>); + static_assert( + std::is_same_v)>); + static_assert( + std::is_same_v< + decltype(sycl::ext::intel::experimental::protocol_avalon), + decltype(sycl::ext::intel::experimental::protocol)>); + static_assert(std::is_same_v< + decltype(sycl::ext::intel::experimental::protocol_axi), + decltype(sycl::ext::intel::experimental::protocol< + sycl::ext::intel::experimental::protocol_name::AXI>)>); + + // Check that property lists will accept the new properties. + using P = decltype(sycl::ext::oneapi::experimental::properties( + sycl::ext::intel::experimental::min_capacity<0>, + sycl::ext::intel::experimental::ready_latency<1>, + sycl::ext::intel::experimental::bits_per_symbol<2>, + sycl::ext::intel::experimental::uses_valid, + sycl::ext::intel::experimental::uses_ready, + sycl::ext::intel::experimental::in_csr, + sycl::ext::intel::experimental::first_symbol_in_high_order_bits_off, + sycl::ext::intel::experimental::protocol_avalon)); + static_assert(sycl::ext::oneapi::experimental::is_property_list_v

); + static_assert( + P::has_property()); + static_assert( + P::has_property()); + static_assert( + P::has_property()); + static_assert( + P::has_property()); + static_assert( + P::has_property()); + static_assert(P::has_property()); + static_assert(P::has_property()); + static_assert( + P::has_property()); + + static_assert( + P::get_property() == + sycl::ext::intel::experimental::min_capacity<0>); + static_assert( + P::get_property() == + sycl::ext::intel::experimental::ready_latency<1>); + static_assert( + P::get_property() == + sycl::ext::intel::experimental::bits_per_symbol<2>); + static_assert( + P::get_property() == + sycl::ext::intel::experimental::uses_valid); + static_assert( + P::get_property() == + sycl::ext::intel::experimental::uses_ready); + static_assert(P::get_property() == + sycl::ext::intel::experimental::in_csr); + static_assert( + P::get_property() == + sycl::ext::intel::experimental::first_symbol_in_high_order_bits_off); + static_assert( + P::get_property() == + sycl::ext::intel::experimental::protocol_avalon); +}