If a header file appears in a adf::headers
constraint and that header file includes aie_api/aie.hpp
directly or indirectly, aiecompiler --target=x86sim
will fail. As a workaround, you can move the include of aie_api/aie.hpp
from the kernel header to the kernel source file.
For example, the kernel kernel1
has an
adf::headers
constraint (project.h), which specifies
the header file, kernels.h.
project.h
#pragma once
#include "kernels.h"
class MyGraph: public adf::graph {
adf::kernel kernel1;
..
MyGraph()
{
kernel1 = adf::kernel::create(F1);
adf::source(kernel1) = "kernels.cpp";
adf::headers(kernel1) = {"kernels.h"};
..
}
};
Header file, kernels.h
, includes
aie_api/aie.hpp
(lines 3-5).
kernels.h
#pragma once
#include "adf.h"
#include <aie_api/aie.hpp>
#include <aie_api/aie_adf.hpp>
#include "aie_api/utils.hpp"
void F1(input_stream<int32> *streamin,
output_stream<acc80> *cascout,output_stream<int32> *streamout);
aiecompiler --target=x86sim
fails.
Compiler Output
aiecompiler --target=x86sim project.cpp
...
In file included from .../aietools/include/aie_api/aie.hpp:70:0,
from ../.././src/kernels.h:3,
from PthreadSim.cpp:11:
.../aietools/include/aie_api/aie_declaration.hpp:62:12: error: multiple definition of 'enum class aie_dm_resource'
enum class aie_dm_resource {
^~~~~~~~~~~~~~~
In file included from ...aietools/include/adf/x86sim/x86sim.h:8:0,
from PthreadSim.cpp:8:
.../aietools/include/adf/x86sim/x86simResourceTypes.h:4:12: note: previous definition here
enum class aie_dm_resource {
^~~~~~~~~~~~~~~
There are several ways to work around this issue:
- The
adf::headers
constraint is needed only if the graph has graph scoped tables (see Global Graph-scoped Tables). If it does not, theadf::headers
constraint can be omitted. - The include of the
aie_api
headers can be moved from kernels.h to kernel.cpp because the high-level kernel APIaie_api/aie.hpp
is typically needed only in the kernel source file.