Support of std::complex:
In Vivado HLS, std::complex data type could
not be used directly inside the DATAFLOW, because of multiple readers and writer
issue. This multiple reader and writer issue is coming from the std class
constructor being called to initialize the value. When this variable is also used
inside the dataflow as a channel, it leads to the above issue. However, Vitis supports the use of std::complex
with support of an attribute no_ctor
as shown below.
// Nothing to do here.
void proc_1(std::complex<float> (&buffer)[50], const std::complex<float> *in);
void proc_2(hls::stream<std::complex<float>> &fifo, const std::complex<float> (&buffer)[50], std::complex<float> &acc);
void proc_3(std::complex<float> *out, hls::stream<std::complex<float>> &fifo, const std::complex<float> acc);
void top(std::complex<float> *out, const std::complex<float> *in) {
#pragma HLS DATAFLOW
std::complex<float> acc __attribute((no_ctor)); // here
std::complex<float> buffer[50] __attribute__((no_ctor)); // here
hls::stream<std::complex<float>, 5> fifo; // not here! (hls::stream has it internally)
proc_1(buffer, in);
proc_2(fifo, buffer, acc);
porc_3(out, fifo, acc);
}