Я пытаюсь использовать универсальный код манипулирования кортеж на основе примеров в этом блог, но используя только код C ++ 11 (Vivado HLS, похоже, не поддерживает C ++ 14). Приведенный ниже код вызывает сбой Vivado HLS 2018.1 с Abnormal program termination (11)
ошибка.
#include <cassert>
#include <tuple>
// index_sequence from https://stackoverflow.com/questions/17424477/implementation-c14-make-integer-sequence/
template<size_t...> struct index_sequence{ typedef index_sequence type; };
template<class S1, class S2> struct concat;
template<size_t... I1, size_t... I2>
struct concat<index_sequence<I1...>, index_sequence<I2...>>
: index_sequence<I1..., (sizeof...(I1)+I2)...>
{};
template<size_t N> struct make_index_sequence;
template<size_t N>
struct make_index_sequence : concat<
typename make_index_sequence<N/2>::type,
typename make_index_sequence<N - N/2>::type
>
{};
template<> struct make_index_sequence<0> : index_sequence<>{};
template<> struct make_index_sequence<1> : index_sequence<0>{};
using namespace std;
template <typename Tuple, typename Seq>
struct tuple_map_type
{
typedef tuple<> type;
};
template <typename Tuple, size_t... Is>
struct tuple_map_type<Tuple, index_sequence<Is...> >
{
typedef tuple<typename tuple_element<Is, Tuple>::type...> type;
};
template <typename Tuple, size_t... Is>
constexpr typename tuple_map_type<Tuple, index_sequence<Is...> >::type
take_front_impl(Tuple t, index_sequence<Is...>)
{
return make_tuple(get<Is>(t)...);
}
template <size_t N, class Tuple>
constexpr typename tuple_map_type<Tuple, typename make_index_sequence<N>::type>::type take_front(Tuple t) {
return take_front_impl(t, make_index_sequence<N>{});
}
tuple<int, int> top(int a, int b, int c)
{
auto all = make_tuple(a, b, c);
return take_front<2>(all);
}
int main()
{
assert(top(1,2,3) == make_tuple(1, 2));
}
Есть ли обходной путь для HLS, который позволил бы такой универсальный код кортежа компилироваться с Vivado HLS?
РЕДАКТИРОВАТЬ: уточнить, что этот вопрос касается компилятора Vivado HLS. Я знаю, что код прекрасно работает со стандартными компиляторами, такими как g ++ и clang ++.
(Этот вопрос был также размещен на Xilinx HLS Community Forum.)
Задача ещё не решена.
Других решений пока нет …