AI Engine API User Guide (AIE) 2021.2
Reshaping

Overview

AIE API provides operations to change the location of the elements within a vector and to combine the elements from two or more vectors.

Functions

template<VectorVec>
auto aie::filter_even(const Vec &v, unsigned step=1) ->vector< typename Vec::value_type, Vec::size()/2 >
More...
template<VectorVec>
auto aie::filter_odd(const Vec &v, unsigned step=1) ->vector< typename Vec::value_type, Vec::size()/2 >
More...
template<VectorVec1,VectorVec2>
auto aie::interleave_unzip(const Vec1 &v1, const Vec2 &v2, unsigned step) -> std::pair<aie_dm_resource_remove_t< Vec1 >,aie_dm_resource_remove_t< Vec1 >>
More...
template<VectorVec1,VectorVec2>
auto aie::interleave_zip(const Vec1 &v1, const Vec2 &v2, unsigned step) -> std::pair<aie_dm_resource_remove_t< Vec1 >,aie_dm_resource_remove_t< Vec1 >>
More...
template<VectorVec>
auto aie::reverse(const Vec &v) ->aie_dm_resource_remove_t< Vec >
More...
template<ElemE1,ElemE2,MaskM>
vector<operand_base_type_t< E1 >, M::size()> aie::select(const E1 &a, const E2 &b, const M &m)
More...
template<VectorVec,ElemE,MaskM>
auto aie::select(const Vec &v, E a, const M &m) ->aie_dm_resource_remove_t< Vec >
More...
template<VectorVec1,VectorVec2,MaskM>
auto aie::select(const Vec1 &v1, const Vec2 &v2, const M &m) ->aie_dm_resource_remove_t< Vec1 >
More...
template<ElemE,VectorVec,MaskM>
auto aie::select(E a, const Vec &v, const M &m) ->aie_dm_resource_remove_t< Vec >
More...
template<VectorVec>
auto aie::shuffle_down(const Vec &v, unsigned n) ->aie_dm_resource_remove_t< Vec >
More...
template<VectorVec>
auto aie::shuffle_down_fill(const Vec &v, const Vec &fill, unsigned n) ->aie_dm_resource_remove_t< Vec >
More...
template<VectorVec>
auto aie::shuffle_down_rotate(const Vec &v, unsigned n) ->aie_dm_resource_remove_t< Vec >
More...
template<VectorVec>
auto aie::shuffle_up(const Vec &v, unsigned n) ->aie_dm_resource_remove_t< Vec >
More...
template<VectorVec>
auto aie::shuffle_up_fill(const Vec &v, const Vec &fill, unsigned n) ->aie_dm_resource_remove_t< Vec >
More...
template<VectorVec>
auto aie::shuffle_up_replicate(const Vec &v, unsigned n) ->aie_dm_resource_remove_t< Vec >
More...
template<VectorVec>
auto aie::shuffle_up_rotate(const Vec &v, unsigned n) ->aie_dm_resource_remove_t< Vec >
More...

Function Documentation

filter_even()

template< VectorVec>
auto aie::filter_even ( const Vec & v,
unsigned step=1
) ->vector

Returns a vector of half the size whose contents follow the following pattern.

out = { a[0:step], a[2*step:3*step], ... }
#
Parameters
v Input vector. Must meetVector.
step Number of contiguous elements taken from the input vector. Must be a power of two.

filter_odd()

template< VectorVec>
auto aie::filter_odd ( const Vec & v,
unsigned step=1
) ->vector

Returns a vector of half the size whose contents follow the following pattern.

out = { a[step:2*step], a[3*step:4*step], ... }
#
Parameters
v Input vector. Must meetVector.
step Number of contiguous elements taken from the input vector. Must be a power of two.

interleave_unzip()

template< VectorVec1, VectorVec2>
auto aie::interleave_unzip ( const Vec1 & v1,
const Vec2 & v2,
unsigned step
) -> std::pair<aie_dm_resource_remove_t,aie_dm_resource_remove_t>

Picks elements sequentially from the input vectors and writes them alternatively into the output vectors.

out = { a[0:step], a[2*step:3*step], ..., b[0:step], b[2*step:3*step], ..., a[step:2*step], a[3*step:4*step], ..., b[step:2*step], b[3*step:4*step], ... }
#
Parameters
v1 First input vector. Must meetVector.
v2 Second input vector. Must meetVector.
step Number of contiguous elements taken from each input vector. Must be a power of two.

interleave_zip()

template< VectorVec1, VectorVec2>
auto aie::interleave_zip ( const Vec1 & v1,
const Vec2 & v2,
unsigned step
) -> std::pair<aie_dm_resource_remove_t,aie_dm_resource_remove_t>

Picks elements alternatively from the input vectors and writes them sequentially into the output vectors.

out = { a[0:step], b[0:step], a[step:2*step], b[step:2*step], ... }
Parameters
v1 First input vector. Must meetVector.
v2 Second input vector. Must meetVector.
step Number of contiguous elements taken from each input vector. Must be a power of two.

reverse()

template< VectorVec>
auto aie::reverse ( const Vec & v ) ->aie_dm_resource_remove_t

Returns a vector whose contents are the same as the input vector, but in reverse order.

for( unsignedi = 0; i < Elems; ++i)
out[i] = in[Elems - i - 1];
Parameters
v Input vector. The type must meetVector.

select()[1/4]

template< ElemE1, ElemE2, MaskM>
vector<operand_base_type_t, M::size()> aie::select ( const E1 & a,
const E2 & b,
const M & m
)

Combines the values of the input vector and value into a vector of the same size by using a mask that specifies which is the source input for each element of the output vector.

for( unsignedi = 0; i < Elems; ++i)
out[i] = m[i] == 0? a : b;
Parameters
a Input value. The type must meetElem.
b Input value. The type must meetElem.
m Maskthat specifies the source input for each output element. The type must meetMask.

select()[2/4]

template< VectorVec, ElemE, MaskM>
auto aie::select ( const Vec & v,
E a,
const M & m
) ->aie_dm_resource_remove_t

Combines the values of the input vector and value into a vector of the same size by using a mask that specifies which is the source input for each element of the output vector.

for( unsignedi = 0; i < Elems; ++i)
out[i] = m[i] == 0? v[i] : a;
Parameters
v Input vector. The type must meetVector.
a Input value. The type must meetElem.
m Maskthat specifies the source input for each output element. The type must meetMask.

select()[3/4]

template< VectorVec1, VectorVec2, MaskM>
auto aie::select ( const Vec1 & v1,
const Vec2 & v2,
const M & m
) ->aie_dm_resource_remove_t

Combines the values of the two input vectors into a vector of the same size by using a mask that specifies which is the source input for each element of the output vector.

for( unsignedi = 0; i < Elems; ++i)
out[i] = m[i] == 0? v1[i] : v2[i];
Parameters
v1 First input vector. The type must meetVector.
v2 Second input vector. The type must meetVector.
m Maskthat specifies the source input for each output element. The type must meetMask.

select()[4/4]

template< ElemE, VectorVec, MaskM>
auto aie::select ( E a,
const Vec & v,
const M & m
) ->aie_dm_resource_remove_t

Combines the values of the input value and vector into a vector of the same size by using a mask that specifies which is the source input for each element of the output vector.

for( unsignedi = 0; i < Elems; ++i)
out[i] = m[i] == 0? a : v[i];
Parameters
a Input value. The type must meetElem.
v Input vector. The type must meetVector.
m Maskthat specifies the source input for each output element. The type must meetMask.

shuffle_down()

template< VectorVec>
auto aie::shuffle_down ( const Vec & v,
unsigned n
) ->aie_dm_resource_remove_t

Returns a vector whose contents are the same as the input vector, but shifted down by n. Elements do not wrap around and new elements are undefined.

for( unsignedi = 0; i < Elems - n; ++i)
out[i] = in[i + n]
Parameters
v Input vector. The type must meetVector.
n Distance for the elements to be shifted.

shuffle_down_fill()

template< VectorVec>
auto aie::shuffle_down_fill ( const Vec & v,
const Vec & fill,
unsigned n
) ->aie_dm_resource_remove_t

Returns a vector whose contents are the same as the input vector, but shifted down by n. Elements do not wrap around and new elements are filled from a second vector.

for( unsignedi = 0; i < Elems - n; ++i)
out[i] = in[i + n]
for( unsignedi = 0; i < n; ++i)
out[i + Elems - n] = fill[i]
Parameters
v Input vector. The type must meetVector.
fill Second input vector used to fill the elements in the upper part of the output vector.
n Distance for the elements to be shifted.

shuffle_down_rotate()

template< VectorVec>
auto aie::shuffle_down_rotate ( const Vec & v,
unsigned n
) ->aie_dm_resource_remove_t

Returns a vector whose contents are the same as the input vector, but shifted down by n (elements wrap around):

for( unsignedi = 0; i < Elems; ++i)
out[i] = in[(i + n) % Elems]
Parameters
v Input vector. The type must meetVector.
n Distance for the elements to be shifted.

shuffle_up()

template< VectorVec>
auto aie::shuffle_up ( const Vec & v,
unsigned n
) ->aie_dm_resource_remove_t

Returns a vector whose contents are the same as the input vector, but shifted up by n. Elements do not wrap around and new elements are undefined.

for( unsignedi = 0; i < Elems - n; ++i)
out[i + n] = in[i]
Parameters
v Input vector. The type must meetVector.
n Distance for the elements to be shifted.

shuffle_up_fill()

template< VectorVec>
auto aie::shuffle_up_fill ( const Vec & v,
const Vec & fill,
unsigned n
) ->aie_dm_resource_remove_t

Returns a vector whose contents are the same as the input vector, but shifted up by n. Elements do not wrap around and new elements are filled from a second vector.

for( unsignedi = 0; i < Elems - n; ++i)
out[i + n] = in[i]
for( unsignedi = 0; i < n; ++i)
out[i] = fill[i + Elems - n];
Parameters
v Input vector. The type must meetVector.
fill Second input vector used to fill the elements in the lower part of the output vector.
n Distance for the elements to be shifted.

shuffle_up_replicate()

template< VectorVec>
auto aie::shuffle_up_replicate ( const Vec & v,
unsigned n
) ->aie_dm_resource_remove_t

Returns a vector whose contents are the same as the input vector, but shifted up by n. Elements do not wrap around and new elements are copies of the first element of the input vector.

for( unsignedi = 0; i < Elems - n; ++i)
out[i + n] = in[i]
for( unsignedi = 0; i < n; ++i)
out[i] = in[0];
Parameters
v Input vector. The type must meetVector.
n Distance for the elements to be shifted.

shuffle_up_rotate()

template< VectorVec>
auto aie::shuffle_up_rotate ( const Vec & v,
unsigned n
) ->aie_dm_resource_remove_t

Returns a vector whose contents are the same as the input vector, but shifted up by n (elements wrap around):

for( unsignedi = 0; i < Elems; ++i)
out[i] = in[(i - n) % Elems]
Parameters
v Input vector. The type must meetVector.
n Distance for the elements to be shifted.