Xilinx/Vitis-Tutorials

Use of class template 'connect' requires template arguments

Albresky opened this issue · 1 comments

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):

    1. 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.
    1. 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. change aie_kernels.h into ../aie_kernels.h, anyway, I didn't change the project's structure.)
    1. As just mentioned above, after problem Use of class template 'connect' requires template arguments was raised, I attempted to declare the template type as adf::port<adf::input>oradf::port<adf::output>, the errors from IDE were all gone. But the compile failed with message no member named 'porttype' in 'adf::port<adf::direction::in>', here is the log.
problems
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!

Problem solved.