Use of class template 'connect' requires template arguments
Albresky opened this issue · 1 comments
Albresky commented
Here is an official example of matrix-multiply in AIE, the code below is the graph.h
file.
/*
Copyright (C) 2023, Advanced Micro Devices, Inc. All rights reserved.
SPDX-License-Identifier: MIT
*/
#include <adf.h>
#include "adf/new_frontend/types.h"
#include "aie_kernels.h"
#include "system_settings.h"
using namespace adf;
template<int COL,int ROW>
class MatMultFloatGraph : public graph
{
private:
kernel k;
public:
port<input> ina,inb;
port<output> outc;
MatMultFloatGraph()
{
k = kernel::create(matmult_float);
connect float_ina(ina, k.in[0]);
connect<port<input>,port<input>> float_inb(inb, k.in[1]);
connect<port<output>,port<output>> float_outc(k.out[0], outc);
source(k) = "aie_kernels/matmult_float.cpp";
location<kernel>(k) = tile(COL,ROW);
runtime<ratio>(k) = 0.6;
}
};
template<int COL,int ROW>
class MatMultCFloatGraph : public graph
{
private:
kernel k,k_conf,k_conj;
public:
port<input> ina,inb;
port<output> outc,outc_conf,outc_conj;
MatMultCFloatGraph()
{
k = kernel::create(matmult_cfloat);
k_conf = kernel::create(matmult_cfloat_conf);
k_conj = kernel::create(matmult_cfloat_conj);
connect<port<input>,port<input>> float_ina(ina, k.in[0]);
connect<port<input>,port<input>> float_inb(inb, k.in[1]);
connect<port<output>,port<output>> float_outc(k.out[0], outc);
connect<port<input>,port<input>> float_ina_conf(ina, k_conf.in[0]);
connect<port<input>,port<input>> float_inb_conf(inb, k_conf.in[1]);
connect<port<output>,port<output>> float_outc_conf(k_conf.out[0], outc_conf);
connect<port<input>,port<input>> float_ina_conj(ina, k_conj.in[0]);
connect<port<input>,port<input>> float_inb_conj(inb, k_conj.in[1]);
connect<port<output>,port<output>> float_outc_conj(k_conj.out[0], outc_conj);
source(k) = "aie_kernels/matmult_cfloat.cpp";
location<kernel>(k) = tile(COL,ROW);
runtime<ratio>(k) = 0.6;
source(k_conf) = "aie_kernels/matmult_cfloat.cpp";
location<kernel>(k_conf) = tile(COL,ROW+1);
runtime<ratio>(k_conf) = 0.6;
source(k_conj) = "aie_kernels/matmult_cfloat.cpp";
location<kernel>(k_conj) = tile(COL,ROW+2);
runtime<ratio>(k_conj) = 0.6;
}
};
class TopGraph : public graph
{
public:
input_plio in[4];
output_plio out[4];
MatMultFloatGraph<25,0> FG;
MatMultCFloatGraph<27,0> CFG;
TopGraph()
{
in[0] = input_plio::create("DataIn0", plio_64_bits, "data/inputa_float.txt");
in[1] = input_plio::create("DataIn1", plio_64_bits, "data/inputb_float.txt");
in[2] = input_plio::create("DataIn2", plio_64_bits, "data/inputa_cfloat.txt");
in[3] = input_plio::create("DataIn3", plio_64_bits, "data/inputb_cfloat.txt");
out[0] = output_plio::create("DataOut0", plio_64_bits, "float_output.txt");
out[1] = output_plio::create("DataOut1", plio_64_bits, "cfloat_output.txt");
out[2] = output_plio::create("DataOut2", plio_64_bits, "cfloat_conf_output.txt");
out[3] = output_plio::create("DataOut3", plio_64_bits, "cfloat_conj_output.txt");
connect<port<output>,port<input>> net0(in[0].out[0],FG.ina);
connect<port<output>,port<input>> net1(in[1].out[0],FG.inb);
connect<port<output>,port<input>> net2(FG.outc,out[0].in[0]);
connect<port<output>,port<input>> net3(in[2].out[0],CFG.ina);
connect<port<output>,port<input>> net4(in[3].out[0],CFG.inb);
connect<port<output>,port<input>> net5(CFG.outc,out[1].in[0]);
connect<port<output>,port<input>> net6(CFG.outc_conf,out[2].in[0]);
connect<port<output>,port<input>> net7(CFG.outc_conj,out[3].in[0]);
}
};
I have few questions here(Each of these problems occurs in the code of officical tutorials):
-
- Why the official examples of AIE always have warnings or problems given by the
Vitis IDE 2023.02
- e.g.
Use of class template 'connect' requires template arguments.
- Why the official examples of AIE always have warnings or problems given by the
-
- Why the IDE could not find the declarations of methods(class or variables) declared in anther
xx.h
header file?
- Everytime these scenes happen, I have to import the
absolutely right
header file manually. (e.g. changeaie_kernels.h
into../aie_kernels.h
, anyway, I didn't change the project's structure.)
- Why the IDE could not find the declarations of methods(class or variables) declared in anther
-
- As just mentioned above, after problem
Use of class template 'connect' requires template arguments
was raised, I attempted to declare the template type asadf::port<adf::input>
oradf::port<adf::output>
, the errors from IDE were all gone. But the compile failed with messageno member named 'porttype' in 'adf::port<adf::direction::in>'
, here is the log.
- As just mentioned above, after problem

In file included from /home/albre/VitisWorkspace/mm_sample/src/graph.cpp:6:
In file included from /opt/Xilinx/Vitis/2023.2/aietools/include/adf.h:16:
In file included from /opt/Xilinx/Vitis/2023.2/aietools/include/adf/new_frontend/adf.h:12:
[ERROR] /opt/Xilinx/Vitis/2023.2/aietools/include/adf/new_frontend/adf_api_impl.h:113:52: error: no member named 'porttype' in 'adf::port<adf::direction::in>'
return{ (adf::port_type)_XILINX_ADF_T::porttype, _XILINX_ADF_T::winsz, _XILINX_ADF_T::margin };
~~~~~~~~~~~~~~~^
/opt/Xilinx/Vitis/2023.2/aietools/include/adf/new_frontend/adf.h:294:109: note: in instantiation of function template specialization 'adf::api_impl::connectTemplateParam<adf::port<adf::direction::in>>' requested here
adf::port<adf::input>& portR) { api_impl::connectPorts(impl, portL.impl, portR.impl, api_impl::connectTemplateParam<_XILINX_ADF_L>(), api_impl::connectTemplateParam<_XILINX_ADF_R>()); }
^
/home/albre/VitisWorkspace/mm_sample/src/graph.h:28:42: note: in instantiation of member function 'adf::connect<adf::port<adf::direction::in>, adf::port<adf::direction::in>>::connect' requested here
connect<port<input>,port<input>> float_ina(ina, k.in[0]);
^
/home/albre/VitisWorkspace/mm_sample/src/graph.h:91:5: note: in instantiation of member function 'MatMultFloatGraph<25, 0>::MatMultFloatGraph' requested here
TopGraph()
^
I just begin to learn about the ACAP platform and not so familiar with the Vitis environment. Could anyone help? Thanks a million!
Albresky commented
Problem solved.