Using Complex Types - 2024.1 English

Vitis Model Composer User Guide (UG1483)

Document ID
UG1483
Release Date
2024-05-30
Version
2024.1 English

C++ code for Vitis HLS can use std::complex<T> or hls::x_complex<T> to model complex signals for xmcImportFunction blocks.

The code generated by Model Composer uses std::complex for representing complex signals. If your imported C/C++ block function is modeled with hls::x_complex, when generating the output code Model Composer will automatically insert std::complex-to-hls::x_complex adapters to convert the complex types for the block ports.

The C++ code must also include the required header file for the complex type declaration. For the hls::x_complex type, the xmcImportFunction command must also include ‘$XILINX_VIVADO/include’ search path for the hls_x_complex.h header file. For example, the following imports the complex_mult function, and specifies the needed include path:

xmcImportFunction('my_lib',{'complex_mult'}, 'complex_mult.h', {}, {'$XILINX_VIVADO/include'});

Example Functions Using Complex Types

#include "hls_x_complex.h"
hls::x_complex<double>
complex_mult(hls::x_complex<double> in1, hls::x_complex<double> in2)
{ return in1 * in2; }

#include <complex> 
std::complex<double> 
complex_mult2(std::complex<double> in1, std::complex<double> in2)
{ return in1 * in2; }

#include <complex> 
void 
complex_mult3(std::complex<double> in1, std::complex<double> in2, std::complex<double> &out1) 
{ out1.real(in1.real() * in2.real() - in1.imag() * in2.imag()); 
   out1.imag(in1.real() * in2.imag() + in1.imag() * in2.real()); }