Primitive APIs in xf::database
¶
aggregate¶
aggregate overload (1)¶
#include "xf_database/aggregate.hpp"
template < AggregateOp op, typename T > void aggregate ( hls::stream <T>& in_strm, hls::stream <bool>& in_e_strm, hls::stream <T>& out_strm, hls::stream <bool>& out_e_strm )
Overload for most common aggregations.
As shown below in the parameters, this function can calculate one of a range of statistics, including minimal, maximal, average (mean), variance, L1 norm, L2 norm. It can also calculate the sum and count.
The limitation in this function is that the output data type must match with the input data type. In some cases, the sum or count may overflow the output type, but it can be safely covered by other aggregation overloads.
Note that minimum, maximum, sum, count, number of non-zero, L1 norm as well as L2 norm aggregate functions will all be returned as zero when the input is empty.
For group-by aggregation, please refer to the hashGroupAggregateMPU
primitive.
Parameters:
op | the aggregate operator: AOP_SUM, AOP_MAX, AOP_MIN, AOP_MEAN, AOP_VARIANCE, AOP_NORML1 or AOP_NORML2 |
T | the data type of input and output streams |
in_strm | input data stream |
in_e_strm | end flag stream for input data |
out_strm | output data stream |
out_e_strm | end flag stream for output data |
aggregate overload (2)¶
#include "xf_database/aggregate.hpp"
template < AggregateOp op, typename T, typename T2 > void aggregate ( hls::stream <T>& in_strm, hls::stream <bool>& in_e_strm, hls::stream <T2>& out_strm, hls::stream <bool>& out_e_strm )
Aggregate function overload for SUM operation.
The output type can be inferred to be different from input type, this allows the sum value to have more precision bits than input, and avoid overflow.
Note that sum aggregate function will be returned as zero when the input is empty.
For group-by aggregation, please refer to the hashGroupAggregateMPU
primitive.
Parameters:
op | the aggregate operator: AOP_SUM |
T | the data type of input stream, inferred from argument |
T2 | the data type of output stream, inferred from argument |
in_strm | input data stream |
in_e_strm | end flag stream for input data |
out_strm | output data stream |
out_e_strm | end flag stream for output data |
aggregate overload (3)¶
#include "xf_database/aggregate.hpp"
template < AggregateOp op, typename T > void aggregate ( hls::stream <T>& in_strm, hls::stream <bool>& in_e_strm, hls::stream <uint64_t>& out_strm, hls::stream <bool>& out_e_strm )
Aggregate function overload for counting.
This function counts the number of input rows, or number of non-zero input rows, and returns the count as uint64_t
value.
Note that count aggregate function will be returned as zero when the input is empty.
For group-by aggregation, please refer to the hashGroupAggregateMPU
primitive.
Parameters:
op | the aggregate operator: AOP_COUNT or AOP_COUNTNONZEROS |
T | the data type of input stream, inferred from argument |
in_strm | input data stream |
in_e_strm | end flag stream for input data |
out_strm | output data stream |
out_e_strm | end flag stream for output data |
bitonicSort¶
#include "xf_database/bitonic_sort.hpp"
template < typename Key_Type, int BitonicSortNumber > void bitonicSort ( hls::stream <Key_Type>& kin_strm, hls::stream <bool>& kin_strm_end, hls::stream <Key_Type>& kout_strm, hls::stream <bool>& kout_strm_end, bool order )
Bitonic sort is parallel algorithm for sorting.
This algorithms can sort a large vector of data in parallel, and by cascading the sorters into a network it can offer good theoretical throughput.
Although this algorithms is suitable for FPGA acceleration, it does not work well with the row-by-row streaming interface in database library. Please consider this primitive as a demo, and only use it by deriving from this code. Alternative sorting algorithms in this library are insertSort
and mergeSort
.
Parameters:
Key_Type | the input and output key type |
BitonicSortNumber | the parallel number |
kin_strm | input key stream |
kin_strm_end | end flag stream for input key |
kout_strm | output key stream |
kout_strm_end | end flag stream for output key |
order | 1 for ascending or 0 for descending sort |
bfGen¶
#include "xf_database/bloom_filter.hpp"
template < bool IS_BRAM, int STR_IN_W, int BV_W > void bfGen ( hls::stream <ap_uint <STR_IN_W>>& msg_strm, hls::stream <bool>& in_e_strm, ap_uint <IS_BRAM ? 16 :72>* bit_vector_ptr0, ap_uint <IS_BRAM ? 16 :72>* bit_vector_ptr1, ap_uint <IS_BRAM ? 16 :72>* bit_vector_ptr2 )
Generate the bloomfilter in on-chip RAM blocks.
This primitive calculates hash of input values, and marks corresponding bits in the on-chip RAM blocks. RAM blocks can be configured to be 18-bit BRAM or 72-bit URAM.
The bloom-filter bit vectors are passed as three pointers, and behind the scene, one hash value is calculated and manipulated into three distint marker locatins in these vectors.
To check for existance of a value with generated vector, use the bfCheck
primitive.
Parameters:
STR_IN_W | W width of the streamed input message, e.g., W=512. |
BV_W | width of the hash value. ptr0, ptr1 and ptr2 should point at MEM_SPACE=2^BV_W (bit). |
msg_strm | input message stream. |
in_e_strm | the flag that indicate the end of input message stream. |
bit_vector_ptr0 | the pointer of bit_vector0. |
bit_vector_ptr1 | the pointer of bit_vector1. |
bit_vector_ptr2 | the pointer of bit_vector2. |
bfGenStream¶
#include "xf_database/bloom_filter.hpp"
template < bool IS_BRAM, int STR_IN_W, int BV_W > void bfGenStream ( hls::stream <ap_uint <STR_IN_W>>& msg_strm, hls::stream <bool>& in_e_strm, hls::stream <ap_uint <IS_BRAM ? 16 :64>>& bit_vet_strm, hls::stream <bool>& out_e_strm )
Generate the bloomfilter in on-chip RAM blocks, and emit the vectors upon finish.
This primitive calculates hash values of input, and marks corresponding bits in the on-chip RAM blocks. RAM blocks can be configured to be 18-bit BRAM or 72-bit URAM.
The bloom-filter bit vectors are built into internally allocated buffers, and streamed out after the filter has been fully built.
Parameters:
STR_IN_W | W width of the streamed input message, e.g., W=512. |
BV_W | width of the hash value. bit_vet_strm should send out MEM_SPACE=2^BV_W (bit) data in total. |
msg_strm | input message stream. |
in_e_strm | the flag that indicate the end of input message stream. |
bit_vet_strm | the output stream of bit_vector. |
out_e_strm | the flag that indicate the end of output stream. |
bfCheck¶
#include "xf_database/bloom_filter.hpp"
template < bool IS_BRAM, int STR_IN_W, int BV_W > void bfCheck ( hls::stream <ap_uint <STR_IN_W>>& msg_strm, hls::stream <bool>& in_e_strm, ap_uint <IS_BRAM ? 16 :72>* bit_vector_ptr0, ap_uint <IS_BRAM ? 16 :72>* bit_vector_ptr1, ap_uint <IS_BRAM ? 16 :72>* bit_vector_ptr2, hls::stream <bool>& out_v_strm, hls::stream <bool>& out_e_strm )
Check existance of value using bloom-filter vectors.
This primitive is designed to work with the bloom-filter vectors generated by the bfGen
primitive. Basically, it detects the existance of value by hashing it and check for the corresponding vector bits. When hit, it is likely to be in the set of generating values, otherwise, it cannot be element of the set. RAM blocks can be configured to be 18-bit BRAM or 72-bit URAM, the setting must match bfGen
.
Parameters:
IS_BRAM | choose which types of memory to use. True for BRAM. False for URAM |
STR_IN_W | W width of the streamed input message, e.g., W=512. |
BV_W | width of the hash value. ptr0, ptr1 and ptr2 should point at MEM_SPACE=2^BV_W (bit). |
msg_strm | input message stream. |
in_e_strm | the flag that indicate the end of input message stream. |
bit_vector_ptr0 | the pointer of bit_vector0. |
bit_vector_ptr1 | the pointer of bit_vector1. |
bit_vector_ptr2 | the pointer of bit_vector2. |
out_v_strm | the output stream that indicate whether the value may exist <1 for true, 0 for false>. |
out_e_strm | the output end flag stream. |
combineCol¶
combineCol overload (1)¶
#include "xf_database/combine_split_col.hpp"
template < int _WCol1, int _WCol2, int _WColOut > void combineCol ( hls::stream <ap_uint <_WCol1>>& din1_strm, hls::stream <ap_uint <_WCol2>>& din2_strm, hls::stream <bool>& in_e_strm, hls::stream <ap_uint <_WColOut>>& dout_strm, hls::stream <bool>& out_e_strm )
Combines two columns into one.
Columns are passed through streams of certain width in hardware. Normally, each column uses one stream, but for some primitives, the processing semantic abstract the columns into a couple of groups, and trait each group as a whole. To make calling such primitives easier, the combine column primitive fuses data of same row but different columns into one wide column.
The counter part of this primitive is splitCol
.
Parameters:
_WCol1 | the width of 1st input stream. |
_WCol2 | the width of 2nd input stream. |
_WColOut | the width of output stream. |
din1_strm | 1st input data stream. |
din2_strm | 2nd input data stream. |
in_e_strm | end flag stream for input data. |
dout_strm | output data stream. |
out_e_strm | end flag stream for output data. |
combineCol overload (2)¶
#include "xf_database/combine_split_col.hpp"
template < int _WCol1, int _WCol2, int _WCol3, int _WColOut > void combineCol ( hls::stream <ap_uint <_WCol1>>& din1_strm, hls::stream <ap_uint <_WCol2>>& din2_strm, hls::stream <ap_uint <_WCol3>>& din3_strm, hls::stream <bool>& in_e_strm, hls::stream <ap_uint <_WColOut>>& dout_strm, hls::stream <bool>& out_e_strm )
Combines three columns into one.
Columns are passed through streams of certain width in hardware. Normally, each column uses one stream, but for some primitives, the processing semantic abstract the columns into a couple of groups, and trait each group as a whole. To make calling such primitives easier, the combine column primitive fuses data of same row but different columns into one wide column.
The counter part of this primitive is splitCol
.
Parameters:
_WCol1 | the width of 1st input stream. |
_WCol2 | the width of 2nd input stream. |
_WCol3 | the width of 3rd input stream. |
_WColOut | the width of output stream. |
din1_strm | 1st input data stream. |
din2_strm | 2nd input data stream. |
din3_strm | 3rd input data stream. |
in_e_strm | end flag stream for input data. |
dout_strm | output data stream. |
out_e_strm | end flag stream for output data. |
combineCol overload (3)¶
#include "xf_database/combine_split_col.hpp"
template < int _WCol1, int _WCol2, int _WCol3, int _WCol4, int _WColOut > void combineCol ( hls::stream <ap_uint <_WCol1>>& din1_strm, hls::stream <ap_uint <_WCol2>>& din2_strm, hls::stream <ap_uint <_WCol3>>& din3_strm, hls::stream <ap_uint <_WCol4>>& din4_strm, hls::stream <bool>& in_e_strm, hls::stream <ap_uint <_WColOut>>& dout_strm, hls::stream <bool>& out_e_strm )
Combines four columns into one.
Columns are passed through streams of certain width in hardware. Normally, each column uses one stream, but for some primitives, the processing semantic abstract the columns into a couple of groups, and trait each group as a whole. To make calling such primitives easier, the combine column primitive fuses data of same row but different columns into one wide column.
The counter part of this primitive is splitCol
.
Parameters:
_WCol1 | the width of 1st input stream. |
_WCol2 | the width of 2nd input stream. |
_WCol3 | the width of 3rd input stream. |
_WCol4 | the width of 4th input stream. |
_WColOut | the width of output stream. |
din1_strm | 1st input data stream. |
din2_strm | 2nd input data stream. |
din3_strm | 3rd input data stream. |
din4_strm | 4th input data stream. |
in_e_strm | end flag stream for input data. |
dout_strm | output data stream. |
out_e_strm | end flag stream for output data. |
combineCol overload (4)¶
#include "xf_database/combine_split_col.hpp"
template < int _WCol1, int _WCol2, int _WCol3, int _WCol4, int _WCol5, int _WColOut > void combineCol ( hls::stream <ap_uint <_WCol1>>& din1_strm, hls::stream <ap_uint <_WCol2>>& din2_strm, hls::stream <ap_uint <_WCol3>>& din3_strm, hls::stream <ap_uint <_WCol4>>& din4_strm, hls::stream <ap_uint <_WCol5>>& din5_strm, hls::stream <bool>& in_e_strm, hls::stream <ap_uint <_WColOut>>& dout_strm, hls::stream <bool>& out_e_strm )
Combines five columns into one.
Columns are passed through streams of certain width in hardware. Normally, each column uses one stream, but for some primitives, the processing semantic abstract the columns into a couple of groups, and trait each group as a whole. To make calling such primitives easier, the combine column primitive fuses data of same row but different columns into one wide column.
The counter part of this primitive is splitCol
.
Parameters:
_WCol1 | the width of 1st input stream. |
_WCol2 | the width of 2nd input stream. |
_WCol3 | the width of 3rd input stream. |
_WCol4 | the width of 4th input stream. |
_WCol5 | the width of 5th input stream. |
_WColOut | the width of output stream. |
din1_strm | 1st input data stream. |
din2_strm | 2nd input data stream. |
din3_strm | 3rd input data stream. |
din4_strm | 4th input data stream. |
din5_strm | 5th input data stream. |
in_e_strm | end flag stream for input data. |
dout_strm | output data stream. |
out_e_strm | end flag stream for output data. |
splitCol¶
splitCol overload (1)¶
#include "xf_database/combine_split_col.hpp"
template < int _WColIn, int _WCol1, int _WCol2 > void splitCol ( hls::stream <ap_uint <_WColIn>>& din_strm, hls::stream <bool>& in_e_strm, hls::stream <ap_uint <_WCol1>>& dout1_strm, hls::stream <ap_uint <_WCol2>>& dout2_strm, hls::stream <bool>& out_e_strm )
Split previously combined columns into two.
Columns are passed through streams of certain width in hardware. Normally, each column uses one stream, but for some primitives, the processing semantic abstract the columns into a couple of groups, and trait each group as a whole. To make calling such primitives easier, the split column primitive breaks the wide output stream into independent column-specific streams.
The counter part of this primitive is combineCol
.
Parameters:
_WColIn | the width of input stream. |
_WCol1 | the width of 1st output stream. |
_WCol2 | the width of 2nd output stream. |
din_strm | input data stream. |
in_e_strm | end flag stream for input data. |
dout1_strm | 1st output data stream. |
dout2_strm | 2nd output data stream. |
out_e_strm | end flag stream for output data. |
splitCol overload (2)¶
#include "xf_database/combine_split_col.hpp"
template < int _WColIn, int _WCol1, int _WCol2, int _WCol3 > void splitCol ( hls::stream <ap_uint <_WColIn>>& din_strm, hls::stream <bool>& in_e_strm, hls::stream <ap_uint <_WCol1>>& dout1_strm, hls::stream <ap_uint <_WCol2>>& dout2_strm, hls::stream <ap_uint <_WCol3>>& dout3_strm, hls::stream <bool>& out_e_strm )
Split previously combined columns into three.
Columns are passed through streams of certain width in hardware. Normally, each column uses one stream, but for some primitives, the processing semantic abstract the columns into a couple of groups, and trait each group as a whole. To make calling such primitives easier, the split column primitive breaks the wide output stream into independent column-specific streams.
The counter part of this primitive is combineCol
.
Parameters:
_WColIn | the width of input stream. |
_WCol1 | the width of 1st output stream. |
_WCol2 | the width of 2nd output stream. |
_WCol3 | the width of 3rd output stream. |
din_strm | input data stream |
in_e_strm | end flag stream for input data |
dout1_strm | 1st output data stream |
dout2_strm | 2nd output data stream |
dout3_strm | 3rd output data stream |
out_e_strm | end flag stream for output data |
splitCol overload (3)¶
#include "xf_database/combine_split_col.hpp"
template < int _WColIn, int _WCol1, int _WCol2, int _WCol3, int _WCol4 > void splitCol ( hls::stream <ap_uint <_WColIn>>& din_strm, hls::stream <bool>& in_e_strm, hls::stream <ap_uint <_WCol1>>& dout1_strm, hls::stream <ap_uint <_WCol2>>& dout2_strm, hls::stream <ap_uint <_WCol3>>& dout3_strm, hls::stream <ap_uint <_WCol4>>& dout4_strm, hls::stream <bool>& out_e_strm )
Split previously combined columns into four.
Columns are passed through streams of certain width in hardware. Normally, each column uses one stream, but for some primitives, the processing semantic abstract the columns into a couple of groups, and trait each group as a whole. To make calling such primitives easier, the split column primitive breaks the wide output stream into independent column-specific streams.
The counter part of this primitive is combineCol
.
Parameters:
_WColIn | the width of input stream. |
_WCol1 | the width of 1st output stream. |
_WCol2 | the width of 2nd output stream. |
_WCol3 | the width of 3rd output stream. |
_WCol4 | the width of 4th output stream. |
din_strm | input data stream |
in_e_strm | end flag stream for input data |
dout1_strm | 1st output data stream |
dout2_strm | 2nd output data stream |
dout3_strm | 3rd output data stream |
dout4_strm | 4th output data stream |
out_e_strm | end flag stream for output data |
splitCol overload (4)¶
#include "xf_database/combine_split_col.hpp"
template < int _WColIn, int _WCol1, int _WCol2, int _WCol3, int _WCol4, int _WCol5 > void splitCol ( hls::stream <ap_uint <_WColIn>>& din_strm, hls::stream <bool>& in_e_strm, hls::stream <ap_uint <_WCol1>>& dout1_strm, hls::stream <ap_uint <_WCol2>>& dout2_strm, hls::stream <ap_uint <_WCol3>>& dout3_strm, hls::stream <ap_uint <_WCol4>>& dout4_strm, hls::stream <ap_uint <_WCol5>>& dout5_strm, hls::stream <bool>& out_e_strm )
Split previously combined columns into five.
Columns are passed through streams of certain width in hardware. Normally, each column uses one stream, but for some primitives, the processing semantic abstract the columns into a couple of groups, and trait each group as a whole. To make calling such primitives easier, the split column primitive breaks the wide output stream into independent column-specific streams.
The counter part of this primitive is combineCol
.
Parameters:
_WColIn | the width of input stream. |
_WCol1 | the width of 1st output stream. |
_WCol2 | the width of 2nd output stream. |
_WCol3 | the width of 3rd output stream. |
_WCol4 | the width of 4th output stream. |
_WCol5 | the width of 5th output stream. |
din_strm | input data stream |
in_e_strm | end flag stream for input data |
dout1_strm | 1st output data stream |
dout2_strm | 2nd output data stream |
dout3_strm | 3rd output data stream |
dout4_strm | 4th output data stream |
dout5_strm | 5th output data stream |
out_e_strm | end flag stream for output data |
directGroupAggregate¶
directGroupAggregate overload (1)¶
#include "xf_database/direct_group_aggregate.hpp"
template < int op, int DATINW, int DATOUTW, int DIRECTW > void directGroupAggregate ( hls::stream <ap_uint <DATINW>>& vin_strm, hls::stream <bool>& in_e_strm, hls::stream <ap_uint <DATOUTW>>& vout_strm, hls::stream <bool>& out_e_strm, hls::stream <ap_uint <DIRECTW>>& kin_strm, hls::stream <ap_uint <DIRECTW>>& kout_strm )
Group-by aggregation with limited key width.
This primitive is suitable for scenario in which the width of group key is limited, so that a on-chip array directly addressed by the key can be created to store the aggregation value. The total storage required is row size * (2 ^ key width)
.
The following aggregate operators are supported:
- AOP_MAX
- AOP_MIN
- AOP_SUM
- AOP_COUNT
- AOP_MEAN
- AOP_VARIANCE
- AOP_NORML1
- AOP_NORML2
The return value is typed the same as the input payload value.
Caution
Attention should be paid for overflow in sum or count.
Parameters:
op | the aggregate operator, as defined in AggregateOp enum. |
DATINW | the width of input payload |
DATOUTW | the width of output aggr-payload |
DIRECTW | the width of input and output key |
vin_strm | value input |
in_e_strm | end flag stream for input data |
vout_strm | value output |
out_e_strm | end flag stream for output data |
kin_strm | group-by key input |
kout_strm | group-by key output |
directGroupAggregate overload (2)¶
#include "xf_database/direct_group_aggregate.hpp"
template < int DATINW, int DATOUTW, int DIRECTW > void directGroupAggregate ( ap_uint <32> op, hls::stream <ap_uint <DATINW>>& vin_strm, hls::stream <bool>& in_e_strm, hls::stream <ap_uint <DATOUTW>>& vout_strm, hls::stream <bool>& out_e_strm, hls::stream <ap_uint <DIRECTW>>& kin_strm, hls::stream <ap_uint <DIRECTW>>& kout_strm )
Group-by aggregation with limited key width, runtime programmable.
This primitive is suitable for scenario in which the width of group key is limited, so that a on-chip array directly addressed by the key can be created to store the aggregation value. The total storage required is row size * (2 ^ key width)
.
The following aggregate operators are supported:
- AOP_MAX
- AOP_MIN
- AOP_SUM
- AOP_COUNT
- AOP_MEAN
- AOP_NORM1
The return value is typed the same as the input payload value.
Caution
Attention should be paid for overflow in sum or count.
Parameters:
DATINW | the width of input payload |
DATOUTW | the width of output aggr-payload |
DIRECTW | the width of input and output key |
op | the aggregate operator, as defined in AggregateOp enum. |
vin_strm | value input |
in_e_strm | end flag stream for input data |
vout_strm | value output |
out_e_strm | end flag stream for output data |
kin_strm | group-by key input |
kout_strm | group-by key output |
duplicateCol¶
#include "xf_database/duplicate_col.hpp"
template <int W> void duplicateCol ( hls::stream <ap_uint <W>>& d_in_strm, hls::stream <bool>& e_in_strm, hls::stream <ap_uint <W>>& d0_out_strm, hls::stream <ap_uint <W>>& d1_out_strm, hls::stream <bool>& e_out_strm )
Duplicate one column into two columns.
Parameters:
W | column data width in bits. |
d_in_strm | input data stream. |
e_in_strm | end flag for input data. |
d0_out_strm | output data stream 0. |
d1_out_strm | output data stream 1. |
e_out_strm | end flag for output data. |
dynamicEval¶
#include "xf_database/dynamic_eval.hpp"
template < typename TStrm1, typename TStrm2, typename TStrm3, typename TStrm4, typename TConst1, typename TConst2, typename TConst3, typename TConst4, typename TOut > void dynamicEval ( ap_uint <289> config, hls::stream <TStrm1>& strm_in1, hls::stream <TStrm2>& strm_in2, hls::stream <TStrm3>& strm_in3, hls::stream <TStrm4>& strm_in4, hls::stream <bool>& strm_in_end, hls::stream <TOut>& strm_out, hls::stream <bool>& strm_out_end )
Dynamic expression evaluation.
This primitive has four fixed number of column inputs, and allows up to four constants to be specified via configuration. The operation between the column values and constants can be defined dynamically through the configuration at run-time. The same configuration is used for all rows until the end of input.
The constant numbers are assumed to be no more than 32-bits.
For the definition of the config word, please refer to the “Design Internal” Section of the document and the corresponding test in L1/tests
.
Parameters:
TStrm1 | Type of input Stream1 |
TStrm2 | Type of input Stream2 |
TStrm3 | Type of input Stream3 |
TStrm4 | Type of input Stream4 |
TConst1 | Type of input Constant1 |
TConst2 | Type of input Constant2 |
TConst3 | Type of input Constant3 |
TConst4 | Type of input Constant4 |
TOut | Type of Compute Result |
config | configuration bits of ops and constants. |
strm_in1 | input Stream1 |
strm_in2 | input Stream2 |
strm_in3 | input Stream3 |
strm_in4 | input Stream4 |
strm_in_end | end flag of input stream |
strm_out | output Stream |
strm_out_end | end flag of output stream |
dynamicFilter¶
dynamicFilter overload (1)¶
#include "xf_database/dynamic_filter.hpp"
template < int W, int WP > void dynamicFilter ( hls::stream <ap_uint <32>>& filter_cfg_strm, hls::stream <ap_uint <W>>& v0_strm, hls::stream <ap_uint <W>>& v1_strm, hls::stream <ap_uint <W>>& v2_strm, hls::stream <ap_uint <W>>& v3_strm, hls::stream <ap_uint <WP>>& pay_in_strm, hls::stream <bool>& e_in_strm, hls::stream <ap_uint <WP>>& pay_out_strm, hls::stream <bool>& e_pay_out_strm )
Filter payloads according to conditions set during run-time.
This primitive, with its 3 overloads, supports filtering rows using up to four columns as conditions. The payload columns should be grouped together into this primitive, using combineCol
primitive, and its total width is not explicitly limited (but naturally bound by resources).
The filter conditions consists of whether each of the conditions is within a given range, and relations between any two conditions. The configuration is set once before processing the rows, and reused until the last row. For configuration generation, please refer to the “Design Internals” Section of the document and corresponding test case of this primitive.
Parameters:
W | width of all condition column streams, in bits. |
WP | width of payload column, in bits. |
filter_cfg_strm | stream of raw config bits for this primitive. |
v0_strm | condition column stream 0. |
v1_strm | condition column stream 1. |
v2_strm | condition column stream 2. |
v3_strm | condition column stream 3. |
pay_in_strm | payload input stream. |
e_in_strm | end flag stream for input table. |
pay_out_strm | payload output stream. |
e_pay_out_strm | end flag stream for payload output. |
dynamicFilter overload (2)¶
#include "xf_database/dynamic_filter.hpp"
template < int W, int WP > void dynamicFilter ( hls::stream <ap_uint <32>>& filter_cfg_strm, hls::stream <ap_uint <W>>& v0_strm, hls::stream <ap_uint <W>>& v1_strm, hls::stream <ap_uint <W>>& v2_strm, hls::stream <ap_uint <WP>>& pay_in_strm, hls::stream <bool>& e_in_strm, hls::stream <ap_uint <WP>>& pay_out_strm, hls::stream <bool>& e_pay_out_strm )
Filter payloads according to conditions set during run-time.
This function is a wrapper-around the four-condition-column dynamic_filter, just duplicating the columns to feed all its inputs. Thus they share the same configuration bit pattern. All op related to the 4th column should be set to FOP_DC
.
Parameters:
W | width of all condition column streams, in bits. |
WP | width of payload column, in bits. |
filter_cfg_strm | stream of raw config bits for this primitive. |
v0_strm | condition column stream 0. |
v1_strm | condition column stream 1. |
v2_strm | condition column stream 2. |
pay_in_strm | payload input stream. |
e_in_strm | end flag stream for input table. |
pay_out_strm | payload output stream. |
e_pay_out_strm | end flag stream for payload output. |
dynamicFilter overload (3)¶
#include "xf_database/dynamic_filter.hpp"
template < int W, int WP > void dynamicFilter ( hls::stream <ap_uint <32>>& filter_cfg_strm, hls::stream <ap_uint <W>>& v0_strm, hls::stream <ap_uint <W>>& v1_strm, hls::stream <ap_uint <WP>>& pay_in_strm, hls::stream <bool>& e_in_strm, hls::stream <ap_uint <WP>>& pay_out_strm, hls::stream <bool>& e_pay_out_strm )
Filter payloads according to conditions set during run-time.
This function is a wrapper-around the four-condition-column dynamic_filter, just duplicating the columns to feed all its inputs. Thus they share the same configuration bit pattern. All op related to the 3rd and 4th columns should be set to FOP_DC
.
Parameters:
W | width of all condition column streams, in bits. |
WP | width of payload column, in bits. |
filter_cfg_strm | stream of raw config bits for this primitive. |
v0_strm | condition column stream 0. |
v1_strm | condition column stream 1. |
pay_in_strm | payload input stream. |
e_in_strm | end flag stream for input table. |
pay_out_strm | payload output stream. |
e_pay_out_strm | end flag stream for payload output. |
dynamicFilter overload (4)¶
#include "xf_database/dynamic_filter.hpp"
template < int W, int WP > void dynamicFilter ( hls::stream <ap_uint <32>>& filter_cfg_strm, hls::stream <ap_uint <W>>& v0_strm, hls::stream <ap_uint <WP>>& pay_in_strm, hls::stream <bool>& e_in_strm, hls::stream <ap_uint <WP>>& pay_out_strm, hls::stream <bool>& e_pay_out_strm )
Filter payloads according to conditions set during run-time.
This function is a wrapper-around the four-condition-column dynamic_filter, just duplicating the columns to feed all its inputs. Thus they share the same configuration bit pattern. All op related to the 2nd to 4th columns should be set to FOP_DC
.
Parameters:
W | width of all condition column streams, in bits. |
WP | width of payload column, in bits. |
filter_cfg_strm | stream of raw config bits for this primitive. |
v0_strm | condition column stream 0. |
pay_in_strm | payload input stream. |
e_in_strm | end flag stream for input table. |
pay_out_strm | payload output stream. |
e_pay_out_strm | end flag stream for payload output. |
groupAggregate¶
groupAggregate overload (1)¶
#include "xf_database/group_aggregate.hpp"
template < AggregateOp op, typename T, typename KEY_T > void groupAggregate ( hls::stream <T>& din_strm, hls::stream <bool>& in_e_strm, hls::stream <T>& dout_strm, hls::stream <bool>& out_e_strm, hls::stream <KEY_T>& kin_strm, hls::stream <KEY_T>& kout_strm )
group aggregate function that returns same type as input
Parameters:
op | the aggregate operator: AOP_MAX, AOP_MIN, AOP_MEAN, AOP_VARIANCE, AOP_NORML1 or AOP_NORML2 |
T | the data type of input and output streams |
KEY_T | the input and output indexing key type |
din_strm | input data stream |
in_e_strm | end flag stream for input data |
dout_strm | output data stream |
out_e_strm | end flag stream for output data |
kin_strm | input indexing key stream |
kout_strm | output indexing key stream |
groupAggregate overload (2)¶
#include "xf_database/group_aggregate.hpp"
template < AggregateOp op, typename T, typename T2, typename KEY_T > void groupAggregate ( hls::stream <T>& in_strm, hls::stream <bool>& in_e_strm, hls::stream <T2>& out_strm, hls::stream <bool>& out_e_strm, hls::stream <KEY_T>& kin_strm, hls::stream <KEY_T>& kout_strm )
group aggregate function that returns different type as input
Parameters:
op | the aggregate operator: AOP_SUM |
T | the input stream type, inferred from argument |
T2 | the output stream type, inferred from argument |
KEY_T | the input and output stream type, inferred from argument |
in_strm | input data stream |
in_e_strm | end flag stream for input data |
out_strm | output data stream |
out_e_strm | end flag stream for output data |
kin_strm | input indexing key stream |
kout_strm | output indexing key stream |
groupAggregate overload (3)¶
#include "xf_database/group_aggregate.hpp"
template < AggregateOp op, typename T, typename KEY_T > void groupAggregate ( hls::stream <T>& in_strm, hls::stream <bool>& in_e_strm, hls::stream <uint64_t>& out_strm, hls::stream <bool>& out_e_strm, hls::stream <KEY_T>& kin_strm, hls::stream <KEY_T>& kout_strm )
aggregate function that counts and returns uint64_t
Parameters:
op | the aggregate operator: AOP_COUNT or AOP_COUNTNONZEROS |
T | the input stream type, inferred from argument |
KEY_T | the input and output stream type, inferred from argument |
in_strm | input data stream |
in_e_strm | end flag stream for input data |
out_strm | output data stream |
out_e_strm | end flag stream for output data |
kin_strm | input indexing key stream |
kout_strm | output indexing key stream |
groupAggregate overload (4)¶
#include "xf_database/group_aggregate.hpp"
template < AggregateOp op, typename T, typename KEY_T > void groupAggregate ( hls::stream <T>& in_strm, hls::stream <bool>& isnull_strm, hls::stream <bool>& in_e_strm, hls::stream <uint64_t>& out_strm, hls::stream <bool>& out_e_strm, hls::stream <KEY_T>& kin_strm, hls::stream <KEY_T>& kout_strm )
aggregate function that counts and returns uint64_t
Parameters:
op | the aggregate operator: AOP_COUNT |
T | the input stream type, inferred from argument |
KEY_T | the input and output stream type, inferred from argument |
in_strm | input data stream |
isnull_strm | flag to indicate the input data is null or not |
in_e_strm | end flag stream for input data |
out_strm | output data stream |
out_e_strm | end flag stream for output data |
kin_strm | input indexing key stream |
kout_strm | output indexing key stream |
hashAntiJoin¶
#include "xf_database/hash_anti_join.hpp"
template < int HASH_MODE, int KEYW, int PW, int S_PW, int B_PW, int HASHWH, int HASHWL, int ARW, int CH_NM > void hashAntiJoin ( hls::stream <ap_uint <KEYW>> k0_strm_arry [CH_NM], hls::stream <ap_uint <PW>> p0_strm_arry [CH_NM], hls::stream <bool> e0_strm_arry [CH_NM], ap_uint <64>* htb0_buf, ap_uint <64>* htb1_buf, ap_uint <64>* htb2_buf, ap_uint <64>* htb3_buf, ap_uint <64>* htb4_buf, ap_uint <64>* htb5_buf, ap_uint <64>* htb6_buf, ap_uint <64>* htb7_buf, ap_uint <64>* stb0_buf, ap_uint <64>* stb1_buf, ap_uint <64>* stb2_buf, ap_uint <64>* stb3_buf, ap_uint <64>* stb4_buf, ap_uint <64>* stb5_buf, ap_uint <64>* stb6_buf, ap_uint <64>* stb7_buf, hls::stream <ap_uint <32>>& pu_begin_status_strms, hls::stream <ap_uint <32>>& pu_end_status_strms, hls::stream <ap_uint <KEYW+S_PW+B_PW>>& j_strm, hls::stream <bool>& j_e_strm )
Multi-PU Hash-Anti-Join primitive, using multiple DDR/HBM buffers.
This primitive shares most of the structure of hashJoinV3
, but performs anti-join instead of inner-join. Both inner and outer table should be send to this primitve once, starting with the inner table.
Parameters:
HASH_MODE | 0 for radix and 1 for Jenkin’s Lookup3 hash. |
KEYW | width of key, in bit. |
PW | width of max payload, in bit. |
S_PW | width of payload of small table. |
B_PW | width of payload of big table. |
HASHWH | number of hash bits used for PU/buffer selection, 1~3. |
HASHWL | number of hash bits used for hash-table in PU. |
ARW | width of address, larger than 24 is suggested. |
CH_NM | number of input channels, 1,2,4. |
k0_strm_arry | input of key columns of both tables. |
p0_strm_arry | input of payload columns of both tables. |
e0_strm_arry | input of end signal of both tables. |
htb0_buf | HBM/DDR buffer of hash_table0 |
htb1_buf | HBM/DDR buffer of hash_table1 |
htb2_buf | HBM/DDR buffer of hash_table2 |
htb3_buf | HBM/DDR buffer of hash_table3 |
htb4_buf | HBM/DDR buffer of hash_table4 |
htb5_buf | HBM/DDR buffer of hash_table5 |
htb6_buf | HBM/DDR buffer of hash_table6 |
htb7_buf | HBM/DDR buffer of hash_table7 |
stb0_buf | HBM/DDR buffer of PU0 |
stb1_buf | HBM/DDR buffer of PU1 |
stb2_buf | HBM/DDR buffer of PU2 |
stb3_buf | HBM/DDR buffer of PU3 |
stb4_buf | HBM/DDR buffer of PU4 |
stb5_buf | HBM/DDR buffer of PU5 |
stb6_buf | HBM/DDR buffer of PU6 |
stb7_buf | HBM/DDR buffer of PU7 |
pu_begin_status_strms | the 1st element is the depth of each hash, the 2nd element is joined number |
pu_end_status_strms | |
j_strm | output of joined result |
j_e_strm | end flag of joined result |
hashGroupAggregate¶
#include "xf_database/hash_group_aggregate.hpp"
template < int _WKey, int _KeyNM, int _WPay, int _PayNM, int _HashMode, int _WHashHigh, int _WHashLow, int _CHNM, int _Wcnt, int _WBuffer, int _BurstLenW = 32, int _BurstLenR = 32 > void hashGroupAggregate ( hls::stream <ap_uint <_WKey>> strm_key_in [_CHNM][_KeyNM], hls::stream <ap_uint <_WPay>> strm_pld_in [_CHNM][_PayNM], hls::stream <bool> strm_e_in [_CHNM], hls::stream <ap_uint <32>>& config, hls::stream <ap_uint <32>>& result_info, ap_uint <_WBuffer>* ping_buf0, ap_uint <_WBuffer>* ping_buf1, ap_uint <_WBuffer>* ping_buf2, ap_uint <_WBuffer>* ping_buf3, ap_uint <_WBuffer>* pong_buf0, ap_uint <_WBuffer>* pong_buf1, ap_uint <_WBuffer>* pong_buf2, ap_uint <_WBuffer>* pong_buf3, hls::stream <ap_uint <_WKey>> aggr_key_out [_KeyNM], hls::stream <ap_uint <_WPay>> aggr_pld_out [3][_PayNM], hls::stream <bool>& strm_e_out )
Generic hash group aggregate primitive.
With this primitive, the max number of lines of aggregate table is bound by the AXI buffer size.
The group aggregation values are updated inside the chip, and when a hash-bucket overflows, the overflowed rows are spilled into external buffers. The overflow buffer will be automatically re-scanned, and within each round, a number of distinct groups will be aggregated and emitted. This algorithm ends when the overflow buffer is empty and all groups are aggregated.
Attention
- This module can accept multiple input row of key and payload pair per cycle.
- The max distinct groups aggregated in one pass is
2 ^ (1 + _WHash)
. - When the width of the input stream is not fully used, data should be aligned to the little-end.
- It is highly recommended to assign the ping buffer and pong buffer in different HBM banks, input and output in different DDR banks for a better performance.
- The max number of lines of aggregate table cannot bigger than the max DDR/HBM SIZE used in this design.
- When the bit-width of group key is known to be small, say 10-bit, please consider the
directAggregate
primitive, which offers smaller utilization, and requires no external buffer access.
Parameters:
_WKey | width of key, in bit. |
_KeyNM | maximum number of key column, maximum is 8. |
_WPay | width of max payload, in bit. |
_PayNM | maximum number of payload column, maximum is 8. |
_HashMode | control hash algotithm, 0: radix 1: lookup3. |
_WHashHigh | number of hash bits used for dispatch pu. |
_WHashLow | number of hash bits used for hash-table. |
_CHNM | number of input channels. |
_WBuffer | width of HBM/DDR buffer(ping_buf and pong_buf). |
_BurstLenW | burst len of writting unhandled data. |
_BurstLenR | burst len of reloading unhandled data. |
strm_key_in | input of key streams. |
strm_pld_in | input of payload streams. |
strm_e_in | input of end signal. |
config | information for initializing primitive, contains op for maximum of 8 columns, key column number(less than 8), pld column number(less than 8) and initial aggregate cnt. |
result_info | result information at kernel end, contains op, key_column, pld_column and aggregate result cnt |
ping_buf0 | DDR/HBM ping buffer for unhandled data. |
ping_buf1 | DDR/HBM ping buffer for unhandled data. |
ping_buf2 | DDR/HBM ping buffer for unhandled data. |
ping_buf3 | DDR/HBM ping buffer for unhandled data. |
pong_buf0 | DDR/HBM pong buffer for unhandled data. |
pong_buf1 | DDR/HBM pong buffer for unhandled data. |
pong_buf2 | DDR/HBM pong buffer for unhandled data. |
pong_buf3 | DDR/HBM pong buffer for unhandled data. |
aggr_key_out | output of key columns. |
aggr_pld_out | output of pld columns. [0][*] is the result of min/max/cnt for pld columns, [1][*] is the low-bit value of sum/average, [2][*] is the hight-bit value of sum/average. |
strm_e_out | is the end signal of output. |
hashJoinMPU¶
hashJoinMPU overload (1)¶
#include "xf_database/hash_join_v2.hpp"
template < int HASH_MODE, int KEYW, int PW, int S_PW, int B_PW, int HASHWH, int HASHWL, int ARW, int BFW, int CH_NM, int BF_W, int EN_BF > static void hashJoinMPU ( hls::stream <ap_uint <KEYW>> k0_strm_arry [CH_NM], hls::stream <ap_uint <PW>> p0_strm_arry [CH_NM], hls::stream <bool> e0_strm_arry [CH_NM], ap_uint <BFW>* stb0_buf, ap_uint <BFW>* stb1_buf, ap_uint <BFW>* stb2_buf, ap_uint <BFW>* stb3_buf, ap_uint <BFW>* stb4_buf, ap_uint <BFW>* stb5_buf, ap_uint <BFW>* stb6_buf, ap_uint <BFW>* stb7_buf, hls::stream <ap_uint <S_PW+B_PW>>& j1_strm, hls::stream <bool>& e5_strm )
Multi-PU Hash-Join primitive, using multiple DDR/HBM buffers.
The max number of lines of small table is 2M in this design. It is assumed that the hash-conflict is within 512 per bin.
This module can accept more than 1 input row per cycle, via multiple input channels. The small table and the big table shares the same input ports, so the width of the payload should be the max of both, while the data should be aligned to the little-end. The small table should be fed TWICE, followed by the big table once.
Parameters:
HASH_MODE | 0 for radix and 1 for Jenkin’s Lookup3 hash. |
KEYW | width of key, in bit. |
PW | width of max payload, in bit. |
S_PW | width of payload of small table. |
B_PW | width of payload of big table. |
HASHWH | number of hash bits used for PU/buffer selection, 1~3. |
HASHWL | number of hash bits used for hash-table in PU. |
ARW | width of address, log2(small table max num of rows). |
BFW | width of buffer. |
CH_NM | number of input channels, 1,2,4. |
BF_W | bloom-filter hash width. |
EN_BF | bloom-filter switch, 0 for off, 1 for on. |
k0_strm_arry | input of key columns of both tables. |
p0_strm_arry | input of payload columns of both tables. |
e0_strm_arry | input of end signal of both tables. |
stb0_buf | HBM/DDR buffer of PU0 |
stb1_buf | HBM/DDR buffer of PU1 |
stb2_buf | HBM/DDR buffer of PU2 |
stb3_buf | HBM/DDR buffer of PU3 |
stb4_buf | HBM/DDR buffer of PU4 |
stb5_buf | HBM/DDR buffer of PU5 |
stb6_buf | HBM/DDR buffer of PU6 |
stb7_buf | HBM/DDR buffer of PU7 |
j1_strm | output of joined rows. |
e5_strm | end signal of joined rows. |
hashJoinMPU overload (2)¶
#include "xf_database/hash_join_v2.hpp"
template < int HASH_MODE, int KEYW, int PW, int S_PW, int B_PW, int HASHWH, int HASHWL, int ARW, int BFW, int CH_NM > void hashJoinMPU ( hls::stream <ap_uint <KEYW>> k0_strm_arry [CH_NM], hls::stream <ap_uint <PW>> p0_strm_arry [CH_NM], hls::stream <bool> e0_strm_arry [CH_NM], ap_uint <BFW>* stb0_buf, ap_uint <BFW>* stb1_buf, ap_uint <BFW>* stb2_buf, ap_uint <BFW>* stb3_buf, ap_uint <BFW>* stb4_buf, ap_uint <BFW>* stb5_buf, ap_uint <BFW>* stb6_buf, ap_uint <BFW>* stb7_buf, hls::stream <ap_uint <S_PW+B_PW>>& j1_strm, hls::stream <bool>& e5_strm )
Multi-PU Hash-Join primitive, using multiple DDR/HBM buffers.
The max number of lines of small table is 8M in this design. It is assumed that the hash-conflict is within 512 per bin.
This module can accept more than 1 input row per cycle, via multiple input channels. The small table and the big table shares the same input ports, so the width of the payload should be the max of both, while the data should be aligned to the little-end. The small table should be fed TWICE, followed by the big table once.
Parameters:
HASH_MODE | 0 for radix and 1 for Jenkin’s Lookup3 hash. |
KEYW | width of key, in bit. |
PW | width of max payload, in bit. |
S_PW | width of payload of small table. |
B_PW | width of payload of big table. |
HASHWH | number of hash bits used for PU/buffer selection, 1~3. |
HASHWL | number of hash bits used for hash-table in PU. |
ARW | width of address, log2(small table max num of rows). |
BFW | width of buffer. |
CH_NM | number of input channels, 1,2,4. |
k0_strm_arry | input of key columns of both tables. |
p0_strm_arry | input of payload columns of both tables. |
e0_strm_arry | input of end signal of both tables. |
stb0_buf | HBM/DDR buffer of PU0 |
stb1_buf | HBM/DDR buffer of PU1 |
stb2_buf | HBM/DDR buffer of PU2 |
stb3_buf | HBM/DDR buffer of PU3 |
stb4_buf | HBM/DDR buffer of PU4 |
stb5_buf | HBM/DDR buffer of PU5 |
stb6_buf | HBM/DDR buffer of PU6 |
stb7_buf | HBM/DDR buffer of PU7 |
j1_strm | output of joined rows. |
e5_strm | end signal of joined rows. |
hashJoinV3¶
#include "xf_database/hash_join_v3.hpp"
template < int HASH_MODE, int KEYW, int PW, int S_PW, int B_PW, int HASHWH, int HASHWL, int ARW, int CH_NM > void hashJoinV3 ( hls::stream <ap_uint <KEYW>> k0_strm_arry [CH_NM], hls::stream <ap_uint <PW>> p0_strm_arry [CH_NM], hls::stream <bool> e0_strm_arry [CH_NM], ap_uint <64>* htb0_buf, ap_uint <64>* htb1_buf, ap_uint <64>* htb2_buf, ap_uint <64>* htb3_buf, ap_uint <64>* htb4_buf, ap_uint <64>* htb5_buf, ap_uint <64>* htb6_buf, ap_uint <64>* htb7_buf, ap_uint <64>* stb0_buf, ap_uint <64>* stb1_buf, ap_uint <64>* stb2_buf, ap_uint <64>* stb3_buf, ap_uint <64>* stb4_buf, ap_uint <64>* stb5_buf, ap_uint <64>* stb6_buf, ap_uint <64>* stb7_buf, hls::stream <ap_uint <32>>& pu_begin_status_strms, hls::stream <ap_uint <32>>& pu_end_status_strms, hls::stream <ap_uint <KEYW+S_PW+B_PW>>& j_strm, hls::stream <bool>& j_e_strm )
Hash-Join v3 primitive, it takes more resourse than hashJoinMPU
and promises a better performance in large size of table.
The maximum size of small table is 256MBx8(HBM number)=2GB in this design. The total hash entries is equal to 1<<(HASHWH + HASHWL), and it is limitied to maximum of 1M entries because of the size of URAM in a single SLR.
This module can accept more than 1 input row per cycle, via multiple input channels. The small table and the big table shares the same input ports, so the width of the payload should be the max of both, while the data should be aligned to the little-end. To be different with hashJoinMPU
, the small table and big table should be fed only once.
Parameters:
HASH_MODE | 0 for radix and 1 for Jenkin’s Lookup3 hash. |
KEYW | width of key, in bit. |
PW | width of max payload, in bit. |
S_PW | width of payload of small table. |
B_PW | width of payload of big table. |
HASHWH | number of hash bits used for PU/buffer selection, 1~3. |
HASHWL | number of hash bits used for hash-table in PU. |
ARW | width of address, larger than 24 is suggested. |
CH_NM | number of input channels, 1,2,4. |
k0_strm_arry | input of key columns of both tables. |
p0_strm_arry | input of payload columns of both tables. |
e0_strm_arry | input of end signal of both tables. |
htb0_buf | HBM/DDR buffer of hash_table0 |
htb1_buf | HBM/DDR buffer of hash_table1 |
htb2_buf | HBM/DDR buffer of hash_table2 |
htb3_buf | HBM/DDR buffer of hash_table3 |
htb4_buf | HBM/DDR buffer of hash_table4 |
htb5_buf | HBM/DDR buffer of hash_table5 |
htb6_buf | HBM/DDR buffer of hash_table6 |
htb7_buf | HBM/DDR buffer of hash_table7 |
stb0_buf | HBM/DDR buffer of PU0 |
stb1_buf | HBM/DDR buffer of PU1 |
stb2_buf | HBM/DDR buffer of PU2 |
stb3_buf | HBM/DDR buffer of PU3 |
stb4_buf | HBM/DDR buffer of PU4 |
stb5_buf | HBM/DDR buffer of PU5 |
stb6_buf | HBM/DDR buffer of PU6 |
stb7_buf | HBM/DDR buffer of PU7 |
pu_begin_status_strms | contains hash depth, row number of join result |
pu_end_status_strms | contains hash depth, row number of join result |
j_strm | output of joined result |
j_e_strm | end flag of joined result |
hashBuildProbeV3¶
#include "xf_database/hash_join_v3.hpp"
template < int HASH_MODE, int KEYW, int PW, int S_PW, int B_PW, int HASHWH, int HASHWL, int ARW, int CH_NM, int BF_W, int EN_BF > static void hashBuildProbeV3 ( bool& build_probe_flag, hls::stream <ap_uint <KEYW>> k0_strm_arry [CH_NM], hls::stream <ap_uint <PW>> p0_strm_arry [CH_NM], hls::stream <bool> e0_strm_arry [CH_NM], ap_uint <64>* htb0_buf, ap_uint <64>* htb1_buf, ap_uint <64>* htb2_buf, ap_uint <64>* htb3_buf, ap_uint <64>* htb4_buf, ap_uint <64>* htb5_buf, ap_uint <64>* htb6_buf, ap_uint <64>* htb7_buf, ap_uint <64>* stb0_buf, ap_uint <64>* stb1_buf, ap_uint <64>* stb2_buf, ap_uint <64>* stb3_buf, ap_uint <64>* stb4_buf, ap_uint <64>* stb5_buf, ap_uint <64>* stb6_buf, ap_uint <64>* stb7_buf, hls::stream <ap_uint <32>>& pu_begin_status_strms, hls::stream <ap_uint <32>>& pu_end_status_strms, hls::stream <ap_uint <KEYW+S_PW+B_PW>>& j_strm, hls::stream <bool>& j_e_strm )
Hash-Build-Probe v3 primitive, it can perform hash build and hash probe separately. It needs two call of kernel to perform build and probe seperately. There is a control flag to decide buld or probe. This primitive supports multiple build and mutiple probe, for example, you can scadule a workflow as: build0->build1->probe0->probe1->build2->build3->probe3…
The maximum size of small table is 256MBx8=2GB in this design. The total hash entries is equal to 1<<(HASHWH + HASHWL), and it is limitied to maximum of 1M entries because of the size of URAM in a single SLR.
This module can accept more than 1 input row per cycle, via multiple input channels. The small table and the big table shares the same input ports, so the width of the payload should be the max of both, while the data should be aligned to the little-end. The small table and big table should be fed only ONCE.
Parameters:
HASH_MODE | 0 for radix and 1 for Jenkin’s Lookup3 hash. |
KEYW | width of key, in bit. |
PW | width of max payload, in bit. |
S_PW | width of payload of small table. |
B_PW | width of payload of big table. |
HASHWH | number of hash bits used for PU/buffer selection, 1~3. |
HASHWL | number of hash bits used for hash-table in PU. |
ARW | width of address, log2(small table max num of rows). |
CH_NM | number of input channels, 1,2,4. |
BF_W | bloom-filter hash width. |
EN_BF | bloom-filter switch, 0 for off, 1 for on. |
build_probe_flag | 0:build 1:probe |
k0_strm_arry | input of key columns of both tables. |
p0_strm_arry | input of payload columns of both tables. |
e0_strm_arry | input of end signal of both tables. |
htb0_buf | HBM/DDR buffer of hash_table0 |
htb1_buf | HBM/DDR buffer of hash_table1 |
htb2_buf | HBM/DDR buffer of hash_table2 |
htb3_buf | HBM/DDR buffer of hash_table3 |
htb4_buf | HBM/DDR buffer of hash_table4 |
htb5_buf | HBM/DDR buffer of hash_table5 |
htb6_buf | HBM/DDR buffer of hash_table6 |
htb7_buf | HBM/DDR buffer of hash_table7 |
stb0_buf | HBM/DDR buffer of PU0 |
stb1_buf | HBM/DDR buffer of PU1 |
stb2_buf | HBM/DDR buffer of PU2 |
stb3_buf | HBM/DDR buffer of PU3 |
stb4_buf | HBM/DDR buffer of PU4 |
stb5_buf | HBM/DDR buffer of PU5 |
stb6_buf | HBM/DDR buffer of PU6 |
stb7_buf | HBM/DDR buffer of PU7 |
pu_begin_status_strms | contains build id, fixed hash depth, joined number of last probe and start addr of unused stb_buf for each PU |
pu_end_status_strms | returns next build id, fixed hash depth, joined number of current probe and end addr of used stb_buf for each PU |
j_strm | output of joined result |
j_e_strm | end flag of joined result |
hashJoinV4¶
#include "xf_database/hash_join_v4.hpp"
template < int HASH_MODE, int KEYW, int PW, int S_PW, int B_PW, int HASHWH, int HASHWL, int ARW, int CH_NM, int BF_HASH_NM, int BFW, bool EN_BF > static void hashJoinV4 ( hls::stream <ap_uint <KEYW>> k0_strm_arry [CH_NM], hls::stream <ap_uint <PW>> p0_strm_arry [CH_NM], hls::stream <bool> e0_strm_arry [CH_NM], ap_uint <64>* htb0_buf, ap_uint <64>* htb1_buf, ap_uint <64>* htb2_buf, ap_uint <64>* htb3_buf, ap_uint <64>* htb4_buf, ap_uint <64>* htb5_buf, ap_uint <64>* htb6_buf, ap_uint <64>* htb7_buf, ap_uint <64>* stb0_buf, ap_uint <64>* stb1_buf, ap_uint <64>* stb2_buf, ap_uint <64>* stb3_buf, ap_uint <64>* stb4_buf, ap_uint <64>* stb5_buf, ap_uint <64>* stb6_buf, ap_uint <64>* stb7_buf, hls::stream <ap_uint <32>>& pu_begin_status_strms, hls::stream <ap_uint <32>>& pu_end_status_strms, hls::stream <ap_uint <KEYW+S_PW+B_PW>>& j_strm, hls::stream <bool>& j_e_strm )
Hash-Join v4 primitive, using bloom filter to enhance performance of hash join.
The build and probe procedure is similar to which in hashJoinV3
, and this primitive adds a bloom filter to reduce the redundant access to HBM.
The maximum size of small table is 256MBx8=2GB in this design. The total hash entries is equal to 1<<(HASHWH + HASHWL), and it is limitied to maximum of 1M entries because of the size of URAM in a single SLR.
This module can accept more than 1 input row per cycle, via multiple input channels. The small table and the big table shares the same input ports, so the width of the payload should be the max of both, while the data should be aligned to the little-end. Similar to hashJoinV3
, small table and big table should be fed only once.
Parameters:
HASH_MODE | 0 for radix and 1 for Jenkin’s Lookup3 hash. |
KEYW | width of key, in bit. |
PW | width of max payload, in bit. |
S_PW | width of payload of small table. |
B_PW | width of payload of big table. |
HASHWH | number of hash bits used for PU/buffer selection, 1~3. |
HASHWL | number of hash bits used for hash-table in PU. |
ARW | width of address, log2(small table max num of rows). |
CH_NM | number of input channels, 1,2,4. |
BF_HASH_NM | number of bloom filter, 1,2,3. |
BF_W | bloom-filter hash width. |
EN_BF | bloom-filter switch, 0 for off, 1 for on. |
k0_strm_arry | input of key columns of both tables. |
p0_strm_arry | input of payload columns of both tables. |
e0_strm_arry | input of end signal of both tables. |
htb0_buf | HBM/DDR buffer of hash_table0 |
htb1_buf | HBM/DDR buffer of hash_table1 |
htb2_buf | HBM/DDR buffer of hash_table2 |
htb3_buf | HBM/DDR buffer of hash_table3 |
htb4_buf | HBM/DDR buffer of hash_table4 |
htb5_buf | HBM/DDR buffer of hash_table5 |
htb6_buf | HBM/DDR buffer of hash_table6 |
htb7_buf | HBM/DDR buffer of hash_table7 |
stb0_buf | HBM/DDR buffer of PU0 |
stb1_buf | HBM/DDR buffer of PU1 |
stb2_buf | HBM/DDR buffer of PU2 |
stb3_buf | HBM/DDR buffer of PU3 |
stb4_buf | HBM/DDR buffer of PU4 |
stb5_buf | HBM/DDR buffer of PU5 |
stb6_buf | HBM/DDR buffer of PU6 |
stb7_buf | HBM/DDR buffer of PU7 |
pu_begin_status_strms | contains build id, fixed hash depth |
pu_end_status_strms | returns next build id, fixed hash depth, joined number |
j_strm | output of joined result |
j_e_strm | end flag of joined result |
hashBuildProbeV4¶
#include "xf_database/hash_join_v4.hpp"
template < int KEYW, int PW, int S_PW, int B_PW, int HASHWH, int HASHWL, int HASHO, int ARW, int CH_NM, int BF_HASH_NM, int BFW, int EN_BF > static void hashBuildProbeV4 ( bool& build_probe_flag, hls::stream <ap_uint <KEYW>> k0_strm_arry [CH_NM], hls::stream <ap_uint <PW>> p0_strm_arry [CH_NM], hls::stream <bool> e0_strm_arry [CH_NM], ap_uint <64>* htb0_buf, ap_uint <64>* htb1_buf, ap_uint <64>* htb2_buf, ap_uint <64>* htb3_buf, ap_uint <64>* htb4_buf, ap_uint <64>* htb5_buf, ap_uint <64>* htb6_buf, ap_uint <64>* htb7_buf, ap_uint <64>* stb0_buf, ap_uint <64>* stb1_buf, ap_uint <64>* stb2_buf, ap_uint <64>* stb3_buf, ap_uint <64>* stb4_buf, ap_uint <64>* stb5_buf, ap_uint <64>* stb6_buf, ap_uint <64>* stb7_buf, hls::stream <ap_uint <32>>& pu_begin_status_strms, hls::stream <ap_uint <32>>& pu_end_status_strms, hls::stream <ap_uint <KEYW+S_PW+B_PW>>& j_strm, hls::stream <bool>& j_e_strm )
Hash-Build-Probe v4 primitive. Compared with HashBuildProbeV3
, it enables bloom filter to reduce redundant access to HBM which can further reduce run-time of hash join. Build and probe are separately performed and controlled by a boolean flag. Mutiple build and probe are also provided, and it should make sure all rows in build phase can be stored temporarily in HBM to maintain correctness.
The maximum size of small table is 256MBx8=2GB in this design. The total hash entries is equal to 1<<(HASHWH + HASHWL), and it is limitied to maximun of 1M entries because of the size of URAM in a single SLR.
Parameters:
KEYW | width of key, in bit. |
PW | width of max payload, in bit. |
S_PW | width of payload of small table. |
B_PW | width of payload of big table. |
HASHWH | number of hash bits used for PU/buffer selection, 1~3. |
HASHWL | number of hash bits used for hash-table in PU. |
HASHO | number of hash bits used for overflow hash counter, 8-12. |
ARW | width of address, log2(small table max num of rows). |
CH_NM | number of input channels, 1,2,4. |
BF_HASH_NM | number of hash functions in bloom filter, 1,2,3. |
BFW | bloom-filter hash width. |
EN_BF | bloom-filter switch, 0 for off, 1 for on. |
build_probe_flag | 0:build 1:probe |
k0_strm_arry | input of key columns of both tables. |
p0_strm_arry | input of payload columns of both tables. |
e0_strm_arry | input of end signal of both tables. |
htb0_buf | HBM/DDR buffer of hash_table0 |
htb1_buf | HBM/DDR buffer of hash_table1 |
htb2_buf | HBM/DDR buffer of hash_table2 |
htb3_buf | HBM/DDR buffer of hash_table3 |
htb4_buf | HBM/DDR buffer of hash_table4 |
htb5_buf | HBM/DDR buffer of hash_table5 |
htb6_buf | HBM/DDR buffer of hash_table6 |
htb7_buf | HBM/DDR buffer of hash_table7 |
stb0_buf | HBM/DDR buffer of PU0 |
stb1_buf | HBM/DDR buffer of PU1 |
stb2_buf | HBM/DDR buffer of PU2 |
stb3_buf | HBM/DDR buffer of PU3 |
stb4_buf | HBM/DDR buffer of PU4 |
stb5_buf | HBM/DDR buffer of PU5 |
stb6_buf | HBM/DDR buffer of PU6 |
stb7_buf | HBM/DDR buffer of PU7 |
pu_begin_status_strms | contains build ID, probe ID, fixed hash depth, joined number of last probe and start addr of unused stb_buf for each PU |
pu_end_status_strms | returns next build ID, next probe ID, fixed hash depth, joined number of current probe and end addr of stb_buf for each PU |
j_strm | output of joined rows. |
j_e_strm | is the end flag of joined result. |
hashLookup3¶
hashLookup3 overload (1)¶
#include "xf_database/hash_lookup3.hpp"
template <int W> void hashLookup3 ( hls::stream <ap_uint <W>>& key_strm, hls::stream <ap_uint <64>>& hash_strm )
lookup3 algorithm, 64-bit hash. II=1 when W<=96, otherwise II=(W/96).
Parameters:
W | the bit width of ap_uint type for input message stream. |
key_strm | the message being hashed. |
hash_strm | the result. |
hashLookup3 overload (2)¶
#include "xf_database/hash_lookup3.hpp"
template <int W> void hashLookup3 ( hls::stream <ap_uint <W>>& key_strm, hls::stream <ap_uint <32>>& hash_strm )
lookup3 algorithm, 32-bit hash. II=1 when W<=96, otherwise II=(W/96).
Parameters:
W | the bit width of ap_uint type for input message stream. |
key_strm | the message being hashed. |
hash_strm | the result. |
hashLookup3 overload (3)¶
#include "xf_database/hash_lookup3.hpp"
template < int WK, int WH > void hashLookup3 ( hls::stream <ap_uint <WK>>& key_strm, hls::stream <bool>& e_key_strm, hls::stream <ap_uint <WH>>& hash_strm, hls::stream <bool>& e_hash_strm )
lookup3 algorithm, 64-bit or 32-bit hash.
Parameters:
WK | the bit width of input message stream. |
WH | the bit width of output hash stream, must be 64 or 32. |
key_strm | the message being hashed. |
e_key_strm | end of key flag stream. |
hash_strm | the result. |
e_hash_strm | end of hash flag stream. |
hashMultiJoin¶
#include "xf_database/hash_multi_join.hpp"
template < int HASH_MODE, int KEYW, int PW, int S_PW, int B_PW, int HASHWH, int HASHWL, int ARW, int CH_NM > void hashMultiJoin ( hls::stream <ap_uint <3>>& join_flag_strm, hls::stream <ap_uint <KEYW>> k0_strm_arry [CH_NM], hls::stream <ap_uint <PW>> p0_strm_arry [CH_NM], hls::stream <bool> e0_strm_arry [CH_NM], ap_uint <64>* htb0_buf, ap_uint <64>* htb1_buf, ap_uint <64>* htb2_buf, ap_uint <64>* htb3_buf, ap_uint <64>* htb4_buf, ap_uint <64>* htb5_buf, ap_uint <64>* htb6_buf, ap_uint <64>* htb7_buf, ap_uint <64>* stb0_buf, ap_uint <64>* stb1_buf, ap_uint <64>* stb2_buf, ap_uint <64>* stb3_buf, ap_uint <64>* stb4_buf, ap_uint <64>* stb5_buf, ap_uint <64>* stb6_buf, ap_uint <64>* stb7_buf, hls::stream <ap_uint <32>>& pu_begin_status_strms, hls::stream <ap_uint <32>>& pu_end_status_strms, hls::stream <ap_uint <KEYW+S_PW+B_PW>>& j_strm, hls::stream <bool>& j_e_strm )
Multi-PU Hash-Multi-Join primitive, using multiple DDR/HBM buffers.
This primitive shares most of the structure of hashJoinV3
. The inner table should be fed once, followed by the outer table once.
Parameters:
HASH_MODE | 0 for radix and 1 for Jenkin’s Lookup3 hash. |
KEYW | width of key, in bit. |
PW | width of max payload, in bit. |
S_PW | width of payload of small table. |
B_PW | width of payload of big table. |
HASHWH | number of hash bits used for PU/buffer selection, 1~3. |
HASHWL | number of hash bits used for hash-table in PU. |
ARW | width of address, larger than 24 is suggested. |
CH_NM | number of input channels, 1,2,4. |
join_flag_strm | specifies the join type, this flag is only read once. |
k0_strm_arry | input of key columns of both tables. |
p0_strm_arry | input of payload columns of both tables. |
e0_strm_arry | input of end signal of both tables. |
htb0_buf | HBM/DDR buffer of hash_table0 |
htb1_buf | HBM/DDR buffer of hash_table1 |
htb2_buf | HBM/DDR buffer of hash_table2 |
htb3_buf | HBM/DDR buffer of hash_table3 |
htb4_buf | HBM/DDR buffer of hash_table4 |
htb5_buf | HBM/DDR buffer of hash_table5 |
htb6_buf | HBM/DDR buffer of hash_table6 |
htb7_buf | HBM/DDR buffer of hash_table7 |
stb0_buf | HBM/DDR buffer of PU0 |
stb1_buf | HBM/DDR buffer of PU1 |
stb2_buf | HBM/DDR buffer of PU2 |
stb3_buf | HBM/DDR buffer of PU3 |
stb4_buf | HBM/DDR buffer of PU4 |
stb5_buf | HBM/DDR buffer of PU5 |
stb6_buf | HBM/DDR buffer of PU6 |
stb7_buf | HBM/DDR buffer of PU7 |
pu_begin_status_strms | constains depth of hash, row number of join result |
pu_end_status_strms | constains depth of hash, row number of join result |
j_strm | output of joined result |
j_e_strm | end flag of joined result |
hashMurmur3¶
#include "xf_database/hash_murmur3.hpp"
template < int W, int H > void hashMurmur3 ( hls::stream <ap_uint <W>>& key_strm, hls::stream <ap_uint <H>>& hash_strm )
murmur3 algorithm.
Parameters:
W | the bit width of ap_uint type for input message stream. |
h | the bit width of ap_uint type for output hash stream. |
key_strm | the message being hashed. |
hash_strm | the result. |
hashPartition¶
#include "xf_database/hash_partition.hpp"
template < int HASH_MODE, int KEYW, int PW, int EW, int HASHWH, int HASHWL, int ARW, int CH_NM, int COL_NM > void hashPartition ( bool mk_on, int depth, hls::stream <int>& bit_num_strm, hls::stream <ap_uint <KEYW>> k0_strm_arry [CH_NM], hls::stream <ap_uint <PW>> p0_strm_arry [CH_NM], hls::stream <bool> e0_strm_arry [CH_NM], hls::stream <ap_uint <16>>& o_bkpu_num_strm, hls::stream <ap_uint <10>>& o_nm_strm, hls::stream <ap_uint <EW>> o_kpld_strm [COL_NM] )
Hash-Partition primitive.
Parameters:
HASH_MODE | 0 for radix and 1 for Jenkin’s Lookup3 hash. |
KEYW | width of key, in bit. |
PW | width of max payload, in bit. |
EW | element data width of input table, in bit. |
HASHWH | number of hash bits used for PU selection. |
HASHWL | number of hash bits used for partition selection. |
ARW | width of address for URAM |
CH_NM | number of input channels, 1,2,4. |
COL_NM | number of input columns, 1~8. |
mk_on | input of double key flag, 0 for off, 1 for on. |
depth | input of depth of each hash bucket in URAM. |
bit_num_strm | input of partition number, log2(number of partition). |
k0_strm_arry | input of key columns of both tables. |
p0_strm_arry | input of payload columns of both tables. |
e0_strm_arry | input of end signal of both tables. |
o_bkpu_num_strm | output of index for bucket and PU |
o_nm_strm | output of row number each time |
o_kpld_strm | output of key+payload |
hashSemiJoin¶
#include "xf_database/hash_semi_join.hpp"
template < int HashMode, int WKey, int WPayload, int WHashHigh, int WhashLow, int WTmpBufferAddress, int WTmpBuffer, int NChannels, int WBloomFilter, int EnBloomFilter > static void hashSemiJoin ( hls::stream <ap_uint <WKey>> key_istrms [NChannels], hls::stream <ap_uint <WPayload>> payload_istrms [NChannels], hls::stream <bool> e0_strm_arry [NChannels], ap_uint <WTmpBuffer>* pu0_tmp_rwtpr, ap_uint <WTmpBuffer>* pu1_tmp_rwptr, ap_uint <WTmpBuffer>* pu2_tmp_rwptr, ap_uint <WTmpBuffer>* pu3_tmp_rwptr, ap_uint <WTmpBuffer>* pu4_tmp_rwptr, ap_uint <WTmpBuffer>* pu5_tmp_rwptr, ap_uint <WTmpBuffer>* pu6_tmp_rwptr, ap_uint <WTmpBuffer>* pu7_tmp_rwptr, hls::stream <ap_uint <WPayload>>& join_ostrm, hls::stream <bool>& end_ostrm )
Multi-PU Hash-Semi-Join primitive, using multiple DDR/HBM buffers.
The max number of lines of inner table is 2M in this design. It is assumed that the hash-conflict is within 256K per bin.
This module can accept more than 1 input row per cycle, via multiple input channels. The outer table and the inner table share the same input ports, so the width of the payload should be the max of both, while the data should be aligned to the little-end. The inner table should be fed TWICE, followed by the outer table ONCE.
Parameters:
HashMode | 0 for radix and 1 for Jenkin’s Lookup3 hash. |
WKey | width of key, in bit. |
WPayload | width of payload of outer table. |
WHashHigh | number of hash bits used for PU/buffer selection, 1~3. |
WhashLow | number of hash bits used for hash-table in PU. |
WTmpBufferAddress | width of address, log2(inner table max num of rows). |
WTmpBuffer | width of buffer. |
NChannels | number of input channels, 1,2,4. |
WBloomFilter | bloom-filter hash width. |
EnBloomFilter | bloom-filter switch, 0 for off, 1 for on. |
key_istrms | input of key columns of both tables. |
payload_istrms | input of payload columns of both tables. |
e0_strm_arry | input of end signal of both tables. |
pu0_tmp_rwtpr | HBM/DDR buffer of PU0 |
pu1_tmp_rwptr | HBM/DDR buffer of PU1 |
pu2_tmp_rwptr | HBM/DDR buffer of PU2 |
pu3_tmp_rwptr | HBM/DDR buffer of PU3 |
pu4_tmp_rwptr | HBM/DDR buffer of PU4 |
pu5_tmp_rwptr | HBM/DDR buffer of PU5 |
pu6_tmp_rwptr | HBM/DDR buffer of PU6 |
pu7_tmp_rwptr | HBM/DDR buffer of PU7 |
join_ostrm | output of joined rows. |
end_ostrm | end signal of joined rows. |
insertSort¶
#include "xf_database/insert_sort.hpp"
template < typename KEY_TYPE, typename DATA_TYPE, int MAX_SORT_NUMBER > void insertSort ( hls::stream <DATA_TYPE>& dinStrm, hls::stream <KEY_TYPE>& kinStrm, hls::stream <bool>& endInStrm, hls::stream <DATA_TYPE>& doutStrm, hls::stream <KEY_TYPE>& koutStrm, hls::stream <bool>& endOutStrm, bool order )
Insert sort top function.
Parameters:
KEY_TYPE | the input and output key type |
DATA_TYPE | the input and output data type |
MAX_SORT_NUMBER | the max number of the sequence can be sorted |
dinStrm | input data stream |
kinStrm | input key stream |
endInStrm | end flag stream for input |
doutStrm | output data stream |
koutStrm | output key stream |
endOutStrm | end flag stream for output |
order | 1:sort ascending 0:sort descending |
mergeJoin¶
#include "xf_database/merge_join.hpp"
template < typename KEY_T, typename LEFT_FIELD_T, typename RIGHT_FIELD_T > void mergeJoin ( bool isascend, hls::stream <KEY_T>& left_strm_in_key, hls::stream <LEFT_FIELD_T>& left_strm_in_field, hls::stream <bool>& left_e_strm, hls::stream <KEY_T>& right_strm_in_key, hls::stream <RIGHT_FIELD_T>& right_strm_in_field, hls::stream <bool>& right_e_strm, hls::stream <KEY_T>& left_strm_out_key, hls::stream <LEFT_FIELD_T>& left_strm_out_field, hls::stream <KEY_T>& right_strm_out_key, hls::stream <RIGHT_FIELD_T>& right_strm_out_field, hls::stream <bool>& out_e_strm )
merge join function for sorted tables without duplicated key in the left table
Parameters:
KEY_T | the type of the key of left table |
LEFT_FIELD_T | the type of the field of left table |
RIGHT_FIELD_T | the type of the field of right table |
isascend | the flag to show if the input tables are ascend or descend tables |
left_strm_in_key | the key stream of the left input table |
left_strm_in_field | the field stream of the left input table |
left_e_strm | the end flag stream to mark the end of left input table |
right_strm_in_key | the key stream of the right input table |
right_strm_in_field | the field stream of the right input table |
right_e_strm | the end flag stream to mark the end of right input table |
left_strm_out_key | the output key stream of left table |
left_strm_out_field | the output field stream of left table |
right_strm_out_key | the output key stream of right table |
right_strm_out_field | the output field stream of right |
out_e_strm | the end flag stream to mark the end of out table |
mergeLeftJoin¶
#include "xf_database/merge_left_join.hpp"
template < typename KEY_T, typename LEFT_FIELD_T, typename RIGHT_FIELD_T > void mergeLeftJoin ( bool isascend, hls::stream <KEY_T>& left_strm_in_key, hls::stream <LEFT_FIELD_T>& left_strm_in_field, hls::stream <bool>& left_e_strm, hls::stream <KEY_T>& right_strm_in_key, hls::stream <RIGHT_FIELD_T>& right_strm_in_field, hls::stream <bool>& right_e_strm, hls::stream <KEY_T>& left_strm_out_key, hls::stream <LEFT_FIELD_T>& left_strm_out_field, hls::stream <KEY_T>& right_strm_out_key, hls::stream <RIGHT_FIELD_T>& right_strm_out_field, hls::stream <bool>& out_e_strm, hls::stream <bool>& isnull_strm )
merge left join function for sorted table, left table should not have duplicated keys.
Parameters:
KEY_T | the type of the key |
LEFT_FIELD_T | the type of the field of left table |
RIGHT_FIELD_T | the type of the field of right table |
isascend | flag to show if the input tables are ascend tables |
left_strm_in_key | the key stream of the left input table |
left_strm_in_field | the field stream of the left input table |
left_e_strm | the end flag stream to mark the end of left input table |
right_strm_in_key | the key stream of the right input table |
right_strm_in_field | the field stream of the right input table |
right_e_strm | the end flag stream to mark the end of right input table |
left_strm_out_key | the output key stream of left table |
left_strm_out_field | the output field stream of left table |
right_strm_out_key | the output key stream of right table |
right_strm_out_field | the output field stream of right |
out_e_strm | the end flag stream to mark the end of out table |
isnull_strm | the isnull stream to show if the result right table is null. |
mergeSort¶
#include "xf_database/merge_sort.hpp"
template < typename Data_Type, typename Key_Type > void mergeSort ( hls::stream <Data_Type>& left_din_strm, hls::stream <Key_Type>& left_kin_strm, hls::stream <bool>& left_strm_in_end, hls::stream <Data_Type>& right_din_strm, hls::stream <Key_Type>& right_kin_strm, hls::stream <bool>& right_strm_in_end, hls::stream <Data_Type>& dout_strm, hls::stream <Key_Type>& kout_strm, hls::stream <bool>& strm_out_end, bool order )
Merge sort function.
Parameters:
Data_Type | the input and output data type |
Data_Type | the input and output key type |
left_din_strm | input left data stream |
left_kin_strm | input key stream |
left_strm_in_end | end flag stream for left input |
right_din_strm | input right data stream |
right_kin_strm | input key stream |
right_strm_in_end | end flag stream for right input |
dout_strm | output data stream |
kout_strm | output key stream |
strm_out_end | end flag stream for output data |
order | 1:ascending 0:descending |
nestedLoopJoin¶
#include "xf_database/nested_loop_join.hpp"
template < int CMP_NUM, typename KEY_T, typename LEFT_FIELD_T, typename RIGHT_FIELD_T > void nestedLoopJoin ( hls::stream <KEY_T>& strm_in_left_key, hls::stream <LEFT_FIELD_T>& strm_in_left_field, hls::stream <bool>& strm_in_left_e, hls::stream <KEY_T>& strm_in_right_key, hls::stream <RIGHT_FIELD_T>& strm_in_right_field, hls::stream <bool>& strm_in_right_e, hls::stream <KEY_T> strm_out_left_key [CMP_NUM], hls::stream <LEFT_FIELD_T> strm_out_left_field [CMP_NUM], hls::stream <KEY_T> strm_out_right_key [CMP_NUM], hls::stream <RIGHT_FIELD_T> strm_out_right_field [CMP_NUM], hls::stream <bool> strm_out_e [CMP_NUM] )
Nested loop join function.
Parameters:
KEY_T | the type of the key of left table |
LEFT_FIELD_T | the type of the field of left table |
RIGHT_FIELD_T | the type of the field of right table |
strm_in_left_key | the key stream of the left input table |
strm_in_left_field | the field stream of the left input table |
strm_in_left_e | the end flag stream to mark the end of left input table |
strm_in_right_key | the key stream of the right input table |
strm_in_right_field | the field stream of the right input table |
strm_in_right_e | the end flag stream to mark the end of right input table |
strm_out_left_key | the output key stream of left table |
strm_out_left_field | the output field stream of left table |
strm_out_right_key | the output key stream of right table |
strm_out_right_field | the output field stream of right |
strm_out_e | the end flag stream to mark the end of out table |
scanCmpStrCol¶
#include "xf_database/scan_cmp_str_col.hpp"
void scanCmpStrCol ( ap_uint <512>* ddr_ptr, hls::stream <int>& size, hls::stream <int>& num_str, hls::stream <ap_uint <512>>& cnst_stream, hls::stream <bool>& out_stream, hls::stream <bool>& e_str_o )
sacn multiple columns of string in global memory, and compare each of them with constant string
Parameters:
ddr_ptr | input string array stored in global memory. |
size | the number of times reading global memory |
num_str | the number of actual strings |
cnst_stream | input constant string stream, 512 bits in heading-length and padding-zero format, read only once as configuration. |
out_stream | output whether each string is equal to the constant string, true indicates they are equal. |
e_str_o | end flag stream for output stream. |
scanCol¶
scanCol overload (1)¶
#include "xf_database/scan_col.hpp"
template < int burst_len, int vec_len, int size0 > void scanCol ( ap_uint <8*size0*vec_len>* c0vec_ptr, const int nrow, hls::stream <ap_uint <8*size0>>& c0_strm, hls::stream <bool>& e_row_strm )
Scan 1 column from DDR/HBM buffers.
Parameters:
burst_len | burst read length, must be supported by MC. |
vec_len | number of items to be scanned as a vector from AXI port. |
size0 | size of column 0, in byte. |
c0vec_ptr | buffer pointer to column 0. |
nrow | number of row to scan. |
c0_strm | column 0 stream. |
e_row_strm | output end flag stream. |
scanCol overload (2)¶
#include "xf_database/scan_col.hpp"
template < int burst_len, int vec_len, int size0, int size1 > void scanCol ( ap_uint <8*size0*vec_len>* c0vec_ptr, ap_uint <8*size1*vec_len>* c1vec_ptr, const int nrow, hls::stream <ap_uint <8*size0>>& c0_strm, hls::stream <ap_uint <8*size1>>& c1_strm, hls::stream <bool>& e_row_strm )
Scan 2 columns from DDR/HBM buffers.
Parameters:
burst_len | burst read length, must be supported by MC. |
vec_len | number of items to be scanned as a vector from AXI port. |
size0 | size of column 0, in byte. |
size1 | size of column 1, in byte. |
c0vec_ptr | buffer pointer to column 0. |
c1vec_ptr | buffer pointer to column 1. |
nrow | number of row to scan. |
c0_strm | column 0 stream. |
c1_strm | column 1 stream. |
e_row_strm | output end flag stream. |
scanCol overload (3)¶
#include "xf_database/scan_col.hpp"
template < int burst_len, int vec_len, int size0, int size1, int size2 > void scanCol ( ap_uint <8*size0*vec_len>* c0vec_ptr, ap_uint <8*size1*vec_len>* c1vec_ptr, ap_uint <8*size2*vec_len>* c2vec_ptr, const int nrow, hls::stream <ap_uint <8*size0>>& c0_strm, hls::stream <ap_uint <8*size1>>& c1_strm, hls::stream <ap_uint <8*size2>>& c2_strm, hls::stream <bool>& e_row_strm )
Scan 3 columns from DDR/HBM buffers.
Parameters:
burst_len | burst read length, must be supported by MC. |
vec_len | number of items to be scanned as a vector from AXI port. |
size0 | size of column 0, in byte. |
size1 | size of column 1, in byte. |
size2 | size of column 2, in byte. |
c0vec_ptr | buffer pointer to column 0. |
c1vec_ptr | buffer pointer to column 1. |
c2vec_ptr | buffer pointer to column 2. |
nrow | number of row to scan. |
c0_strm | column 0 stream. |
c1_strm | column 1 stream. |
c2_strm | column 2 stream. |
e_row_strm | output end flag stream. |
scanCol overload (4)¶
#include "xf_database/scan_col.hpp"
template < int burst_len, int vec_len, int size0, int size1, int size2, int size3 > void scanCol ( ap_uint <8*size0*vec_len>* c0vec_ptr, ap_uint <8*size1*vec_len>* c1vec_ptr, ap_uint <8*size2*vec_len>* c2vec_ptr, ap_uint <8*size3*vec_len>* c3vec_ptr, const int nrow, hls::stream <ap_uint <8*size0>>& c0_strm, hls::stream <ap_uint <8*size1>>& c1_strm, hls::stream <ap_uint <8*size2>>& c2_strm, hls::stream <ap_uint <8*size3>>& c3_strm, hls::stream <bool>& e_row_strm )
Scan 4 columns from DDR/HBM buffers.
Parameters:
burst_len | burst read length, must be supported by MC. |
vec_len | number of items to be scanned as a vector from AXI port. |
size0 | size of column 0, in byte. |
size1 | size of column 1, in byte. |
size2 | size of column 2, in byte. |
size3 | size of column 3, in byte. |
c0vec_ptr | buffer pointer to column 0. |
c1vec_ptr | buffer pointer to column 1. |
c2vec_ptr | buffer pointer to column 2. |
c3vec_ptr | buffer pointer to column 3. |
nrow | number of row to scan. |
c0_strm | column 0 stream. |
c1_strm | column 1 stream. |
c2_strm | column 2 stream. |
c3_strm | column 3 stream. |
e_row_strm | output end flag stream. |
scanCol overload (5)¶
#include "xf_database/scan_col.hpp"
template < int burst_len, int vec_len, int size0, int size1, int size2, int size3, int size4 > void scanCol ( ap_uint <8*size0*vec_len>* c0vec_ptr, ap_uint <8*size1*vec_len>* c1vec_ptr, ap_uint <8*size2*vec_len>* c2vec_ptr, ap_uint <8*size3*vec_len>* c3vec_ptr, ap_uint <8*size4*vec_len>* c4vec_ptr, const int nrow, hls::stream <ap_uint <8*size0>>& c0_strm, hls::stream <ap_uint <8*size1>>& c1_strm, hls::stream <ap_uint <8*size2>>& c2_strm, hls::stream <ap_uint <8*size3>>& c3_strm, hls::stream <ap_uint <8*size4>>& c4_strm, hls::stream <bool>& e_row_strm )
Scan 5 columns from DDR/HBM buffers.
Parameters:
burst_len | burst read length, must be supported by MC. |
vec_len | number of items to be scanned as a vector from AXI port. |
size0 | size of column 0, in byte. |
size1 | size of column 1, in byte. |
size2 | size of column 2, in byte. |
size3 | size of column 3, in byte. |
size4 | size of column 4, in byte. |
c0vec_ptr | buffer pointer to column 0. |
c1vec_ptr | buffer pointer to column 1. |
c2vec_ptr | buffer pointer to column 2. |
c3vec_ptr | buffer pointer to column 3. |
c4vec_ptr | buffer pointer to column 4. |
nrow | number of row to scan. |
c0_strm | column 0 stream. |
c1_strm | column 1 stream. |
c2_strm | column 2 stream. |
c3_strm | column 3 stream. |
c4_strm | column 4 stream. |
e_row_strm | output end flag stream. |
scanCol overload (6)¶
#include "xf_database/scan_col.hpp"
template < int burst_len, int vec_len, int size0, int size1, int size2, int size3, int size4, int size5 > void scanCol ( ap_uint <8*size0*vec_len>* c0vec_ptr, ap_uint <8*size1*vec_len>* c1vec_ptr, ap_uint <8*size2*vec_len>* c2vec_ptr, ap_uint <8*size3*vec_len>* c3vec_ptr, ap_uint <8*size4*vec_len>* c4vec_ptr, ap_uint <8*size5*vec_len>* c5vec_ptr, const int nrow, hls::stream <ap_uint <8*size0>>& c0_strm, hls::stream <ap_uint <8*size1>>& c1_strm, hls::stream <ap_uint <8*size2>>& c2_strm, hls::stream <ap_uint <8*size3>>& c3_strm, hls::stream <ap_uint <8*size4>>& c4_strm, hls::stream <ap_uint <8*size5>>& c5_strm, hls::stream <bool>& e_row_strm )
Scan 6 columns from DDR/HBM buffers.
Parameters:
burst_len | burst read length, must be supported by MC. |
vec_len | number of items to be scanned as a vector from AXI port. |
size0 | size of column 0, in byte. |
size1 | size of column 1, in byte. |
size2 | size of column 2, in byte. |
size3 | size of column 3, in byte. |
size4 | size of column 4, in byte. |
size5 | size of column 5, in byte. |
c0vec_ptr | buffer pointer to column 0. |
c1vec_ptr | buffer pointer to column 1. |
c2vec_ptr | buffer pointer to column 2. |
c3vec_ptr | buffer pointer to column 3. |
c4vec_ptr | buffer pointer to column 4. |
c5vec_ptr | buffer pointer to column 5. |
nrow | number of row to scan. |
c0_strm | column 0 stream. |
c1_strm | column 1 stream. |
c2_strm | column 2 stream. |
c3_strm | column 3 stream. |
c4_strm | column 4 stream. |
c5_strm | column 5 stream. |
e_row_strm | output end flag stream. |
scanCol overload (7)¶
#include "xf_database/scan_col.hpp"
template < int burst_len, int vec_len, int ch_num, int size0 > void scanCol ( ap_uint <8*size0*vec_len>* c0vec_ptr, const int nrow, hls::stream <ap_uint <8*size0>> c0_strm [ch_num], hls::stream <bool> e_row_strm [ch_num] )
Scan one column from DDR/HBM buffers, emit multiple rows concurrently.
Parameters:
burst_len | burst read length, must be supported by MC. |
vec_len | number of items to be scanned as a vector from AXI port. |
ch_num | number of concurrent output channels per column. |
size0 | size of column 0, in byte. |
c0vec_ptr | buffer pointer to column 0. |
nrow | number of row to scan. |
c0_strm | array of column 0 stream. |
e_row_strm | array of output end flag stream. |
scanCol overload (8)¶
#include "xf_database/scan_col.hpp"
template < int burst_len, int vec_len, int ch_num, int size0, int size1 > void scanCol ( ap_uint <8*size0*vec_len>* c0vec_ptr, ap_uint <8*size1*vec_len>* c1vec_ptr, const int nrow, hls::stream <ap_uint <8*size0>> c0_strm [ch_num], hls::stream <ap_uint <8*size1>> c1_strm [ch_num], hls::stream <bool> e_row_strm [ch_num] )
Scan two columns from DDR/HBM buffers, emit multiple rows concurrently.
Parameters:
burst_len | burst read length, must be supported by MC. |
vec_len | number of items to be scanned as a vector from AXI port. |
ch_num | number of concurrent output channels per column. |
size0 | size of column 0, in byte. |
size1 | size of column 1, in byte. |
c0vec_ptr | buffer pointer to column 0. |
c1vec_ptr | buffer pointer to column 1. |
nrow | number of row to scan. |
c0_strm | array of column 0 stream. |
c1_strm | array of column 1 stream. |
e_row_strm | array of output end flag stream. |
scanCol overload (9)¶
#include "xf_database/scan_col.hpp"
template < int burst_len, int vec_len, int ch_num, int size0, int size1, int size2 > void scanCol ( ap_uint <8*size0*vec_len>* c0vec_ptr, ap_uint <8*size1*vec_len>* c1vec_ptr, ap_uint <8*size2*vec_len>* c2vec_ptr, const int nrow, hls::stream <ap_uint <8*size0>> c0_strm [ch_num], hls::stream <ap_uint <8*size1>> c1_strm [ch_num], hls::stream <ap_uint <8*size2>> c2_strm [ch_num], hls::stream <bool> e_row_strm [ch_num] )
Scan three columns from DDR/HBM buffers, emit multiple rows concurrently.
Parameters:
burst_len | burst read length, must be supported by MC. |
vec_len | number of items to be scanned as a vector from AXI port. |
ch_num | number of concurrent output channels per column. |
size0 | size of column 0, in byte. |
size1 | size of column 1, in byte. |
size2 | size of column 2, in byte. |
c0vec_ptr | buffer pointer to column 0. |
c1vec_ptr | buffer pointer to column 1. |
c2vec_ptr | buffer pointer to column 2. |
nrow | number of row to scan. |
c0_strm | array of column 0 stream. |
c1_strm | array of column 1 stream. |
c2_strm | array of column 2 stream. |
e_row_strm | array of output end flag stream. |
scanCol overload (10)¶
#include "xf_database/scan_col_2.hpp"
template < int burst_len, int vec_len, int ch_nm, int size0, int size1 > static void scanCol ( ap_uint <8*size0*vec_len>* c0vec_ptr, ap_uint <8*size1*vec_len>* c1vec_ptr, hls::stream <ap_uint <8*size0>> c0_strm [ch_nm], hls::stream <ap_uint <8*size1>> c1_strm [ch_nm], hls::stream <bool> e_row_strm [ch_nm] )
scan 2 columns from DDR/HBM buffers.
The LSB of first vector of first column specifies the number of rows to be scanned. For a following buffer, if the first vector is zero, same number of zeros will be emitted, otherwise, same number of rows will be read from the buffer.
Parameters:
burst_len | burst read length, must be supported by MC. |
vec_len | scan this number of items as a vector from AXI port. |
ch_nm | number of concurrent output channels per column. |
size0 | size of column 0, in byte. |
size1 | size of column 1, in byte. |
c0vec_ptr | buffer pointer to column 0. |
c1vec_ptr | buffer pointer to column 1. |
c0_strm | array of column 0 stream. |
c1_strm | array of column 1 stream. |
e_row_strm | array of output end flag stream. |
scanCol overload (11)¶
#include "xf_database/scan_col_2.hpp"
template < int burst_len, int vec_len, int ch_nm, int size0, int size1, int size2 > static void scanCol ( ap_uint <8*size0*vec_len>* c0vec_ptr, ap_uint <8*size1*vec_len>* c1vec_ptr, ap_uint <8*size2*vec_len>* c2vec_ptr, hls::stream <ap_uint <8*size0>> c0_strm [ch_nm], hls::stream <ap_uint <8*size1>> c1_strm [ch_nm], hls::stream <ap_uint <8*size2>> c2_strm [ch_nm], hls::stream <bool> e_row_strm [ch_nm] )
scan 3 columns from DDR/HBM buffers.
The LSB of first vector of first column specifies the number of rows to be scanned. For a following buffer, if the first vector is zero, same number of zeros will be emitted, otherwise, same number of rows will be read from the buffer.
Parameters:
burst_len | burst read length, must be supported by MC. |
vec_len | scan this number of items as a vector from AXI port. |
ch_nm | number of concurrent output channels per column. |
size0 | size of column 0, in byte. |
size1 | size of column 1, in byte. |
size2 | size of column 2, in byte. |
c0vec_ptr | buffer pointer to column 0. |
c1vec_ptr | buffer pointer to column 1. |
c2vec_ptr | buffer pointer to column 2. |
c0_strm | array of column 0 stream. |
c1_strm | array of column 1 stream. |
c2_strm | array of column 2 stream. |
e_row_strm | array of output end flag stream. |
scanCol overload (12)¶
#include "xf_database/scan_col_2.hpp"
template < int burst_len, int vec_len, int ch_nm, int size0, int size1, int size2, int size3 > static void scanCol ( ap_uint <8*size0*vec_len>* c0vec_ptr, ap_uint <8*size1*vec_len>* c1vec_ptr, ap_uint <8*size2*vec_len>* c2vec_ptr, ap_uint <8*size3*vec_len>* c3vec_ptr, hls::stream <ap_uint <8*size0>> c0_strm [ch_nm], hls::stream <ap_uint <8*size1>> c1_strm [ch_nm], hls::stream <ap_uint <8*size2>> c2_strm [ch_nm], hls::stream <ap_uint <8*size3>> c3_strm [ch_nm], hls::stream <bool> e_row_strm [ch_nm] )
scan 4 columns from DDR/HBM buffers.
The LSB of first vector of first column specifies the number of rows to be scanned. For a following buffer, if the first vector is zero, same number of zeros will be emitted, otherwise, same number of rows will be read from the buffer.
Parameters:
burst_len | burst read length, must be supported by MC. |
vec_len | scan this number of items as a vector from AXI port. |
ch_nm | number of concurrent output channels per column. |
size0 | size of column 0, in byte. |
size1 | size of column 1, in byte. |
size2 | size of column 2, in byte. |
size3 | size of column 3, in byte. |
c0vec_ptr | buffer pointer to column 0. |
c1vec_ptr | buffer pointer to column 1. |
c2vec_ptr | buffer pointer to column 2. |
c3vec_ptr | buffer pointer to column 3. |
c0_strm | array of column 0 stream. |
c1_strm | array of column 1 stream. |
c2_strm | array of column 2 stream. |
c3_strm | array of column 3 stream. |
e_row_strm | array of output end flag stream. |
scanCol overload (13)¶
#include "xf_database/scan_col_2.hpp"
template < int burst_len, int vec_len, int ch_nm, int size0, int size1, int size2, int size3, int size4 > static void scanCol ( ap_uint <8*size0*vec_len>* c0vec_ptr, ap_uint <8*size1*vec_len>* c1vec_ptr, ap_uint <8*size2*vec_len>* c2vec_ptr, ap_uint <8*size3*vec_len>* c3vec_ptr, ap_uint <8*size4*vec_len>* c4vec_ptr, hls::stream <ap_uint <8*size0>> c0_strm [ch_nm], hls::stream <ap_uint <8*size1>> c1_strm [ch_nm], hls::stream <ap_uint <8*size2>> c2_strm [ch_nm], hls::stream <ap_uint <8*size3>> c3_strm [ch_nm], hls::stream <ap_uint <8*size4>> c4_strm [ch_nm], hls::stream <bool> e_row_strm [ch_nm] )
scan 5 columns from DDR/HBM buffers.
The LSB of first vector of first column specifies the number of rows to be scanned. For a following buffer, if the first vector is zero, same number of zeros will be emitted, otherwise, same number of rows will be read from the buffer.
Parameters:
burst_len | burst read length, must be supported by MC. |
vec_len | scan this number of items as a vector from AXI port. |
ch_nm | number of concurrent output channels per column. |
size0 | size of column 0, in byte. |
size1 | size of column 1, in byte. |
size2 | size of column 2, in byte. |
size3 | size of column 3, in byte. |
size4 | size of column 4, in byte. |
c0vec_ptr | buffer pointer to column 0. |
c1vec_ptr | buffer pointer to column 1. |
c2vec_ptr | buffer pointer to column 2. |
c3vec_ptr | buffer pointer to column 3. |
c4vec_ptr | buffer pointer to column 4. |
c0_strm | array of column 0 stream. |
c1_strm | array of column 1 stream. |
c2_strm | array of column 2 stream. |
c3_strm | array of column 3 stream. |
c4_strm | array of column 4 stream. |
e_row_strm | array of output end flag stream. |
staticEval¶
staticEval overload (1)¶
#include "xf_database/static_eval.hpp"
template < typename T, typename T_O, T_O(*)(T) opf > void staticEval ( hls::stream <T>& in_strm, hls::stream <bool>& e_in_strm, hls::stream <T_O>& out_strm, hls::stream <bool>& e_out_strm )
One stream input static evaluation.
static_eval function calculates the experssion result that user defined. This result will be passed to aggregate module as the input. When calling this API, the T
T_O
are the input/output data types for each parameter of user code. E.g.
// decl
long user_func(int a);
// use
database::static_eval<int, long, user_func>(
in1_strm, e_in_strm, out_strm, e_out_strm);
In the above call, int
is the data type of input of user_func
, and long
is the return type of user_func
.
Parameters:
T | the input stream type, inferred from argument |
T_O | the output stream type, inferred from argument |
opf | the user-defined expression function |
in_strm | input data stream |
e_in_strm | end flag stream for input data |
out_strm | output data stream |
e_out_strm | end flag stream for output data |
staticEval overload (2)¶
#include "xf_database/static_eval.hpp"
template < typename T1, typename T2, typename T_O, T_O(*)(T1, T2) opf > void staticEval ( hls::stream <T1>& in1_strm, hls::stream <T2>& in2_strm, hls::stream <bool>& e_in_strm, hls::stream <T_O>& out_strm, hls::stream <bool>& e_out_strm )
Two stream input static evaluation.
static_eval function calculate the experssion result that user defined. This result will be passed to aggregate module as the input. When calling this API, the T1
T2
T_O
are the input/output data types for each parameter of user code. E.g.
// decl
long user_func(int a, int b);
// use
database::static_eval<int, int, long, user_func>(
in1_strm, in2_strm, e_in_strm, out_strm, e_out_strm);
In the above call, two int
are the data type of input of user_func
, and long
is the return type of user_func
.
Parameters:
T1 | the input stream type, inferred from argument |
T2 | the input stream type, inferred from argument |
T_O | the output stream type, inferred from argument |
opf | the user-defined expression function |
in1_strm | input data stream |
in2_strm | input data stream |
e_in_strm | end flag stream for input data |
out_strm | output data stream |
e_out_strm | end flag stream for output data |
staticEval overload (3)¶
#include "xf_database/static_eval.hpp"
template < typename T1, typename T2, typename T3, typename T_O, T_O(*)(T1, T2, T3) opf > void staticEval ( hls::stream <T1>& in1_strm, hls::stream <T2>& in2_strm, hls::stream <T3>& in3_strm, hls::stream <bool>& e_in_strm, hls::stream <T_O>& out_strm, hls::stream <bool>& e_out_strm )
Three stream input static evaluation.
static_eval function calculate the experssion result that user defined. This result will be passed to aggregate module as the input. When calling this API, the T1
T2
T3
T_O
are the input/output data types for each parameter of user code. E.g.
// decl
long user_func(int a, int b, int c);
// use
database::static_eval<int, int, int, long, user_func>(
in1_strm, in2_strm, in3_strm, e_in_strm,
out_strm, e_out_strm);
In the above call, three int
are the data type of input of user_func
, and long
is the return type of user_func
.
Parameters:
T1 | the input stream type, inferred from argument |
T2 | the input stream type, inferred from argument |
T3 | the input stream type, inferred from argument |
T_O | the output stream type, inferred from argument |
opf | the user-defined expression function |
in1_strm | input data stream |
in2_strm | input data stream |
in3_strm | input data stream |
e_in_strm | end flag stream for input data |
out_strm | output data stream |
e_out_strm | end flag stream for output data |
staticEval overload (4)¶
#include "xf_database/static_eval.hpp"
template < typename T1, typename T2, typename T3, typename T4, typename T_O, T_O(*)(T1, T2, T3, T4) opf > void staticEval ( hls::stream <T1>& in1_strm, hls::stream <T2>& in2_strm, hls::stream <T3>& in3_strm, hls::stream <T4>& in4_strm, hls::stream <bool>& e_in_strm, hls::stream <T_O>& out_strm, hls::stream <bool>& e_out_strm )
Four stream input static evaluation.
static_eval function calculate the experssion result that user defined. This result will be passed to aggregate module as the input. When calling this API, the T1
T2
T3
T_O
are the input/output data types for each parameter of user code. E.g.
// decl
long user_func(int a, int b, int c, int d);
// use
database::static_eval<int, int, int, int, long, user_func>(
in1_strm, in2_strm, in3_strm, in3_strm, e_in_strm,
out_strm, e_out_strm);
In the above call, four int
are the data type of input of user_func
, and long
is the return type of user_func
.
Parameters:
T1 | the input stream type, inferred from argument |
T2 | the input stream type, inferred from argument |
T3 | the input stream type, inferred from argument |
T4 | the input stream type, inferred from argument |
T_O | the output stream type, inferred from argument |
opf | the user-defined expression function |
in1_strm | input data stream |
in2_strm | input data stream |
in3_strm | input data stream |
in4_strm | input data stream |
e_in_strm | end flag stream for input data |
out_strm | output data stream |
e_out_strm | end flag stream for output data |