Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Use of class template 'connect' requires template arguments #417

Closed
Albresky opened this issue Nov 10, 2023 · 1 comment
Closed

Use of class template 'connect' requires template arguments #417

Albresky opened this issue Nov 10, 2023 · 1 comment

Comments

@Albresky
Copy link

Albresky commented Nov 10, 2023

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!

@Albresky
Copy link
Author

Problem solved.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant