Support of std::complex:
In Vivado HLS, std::complex data type could
not be used directly inside the DATAFLOW, because of multiple writers 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; // no need here (hls::stream has it internally)
proc_1(buffer, in);
proc_2(fifo, buffer, acc);
porc_3(out, fifo, acc);
}