One feature of C++ is recursive templates. Graphs can be created
recursively by taking advantage of the recursive
templates.
template<int Level>
class RecursiveGraph: public adf::graph {
private:
adf::kernel k;
RecursiveGraph<Level-1> RG;
public:
adf::port<input> din;
adf::port<output> dout;
RecursiveGraph() {
k = adf::kernel::create(passthrough);
adf::source(k) = "kernels.cpp";
adf::runtime<ratio>(k) = 0.9;
adf::connect<window<FRAME_LENGTH*4>>(din, k.in[0]);
adf::connect<window<FRAME_LENGTH*4>>(k.out[0], RG.din);
adf::connect<window<FRAME_LENGTH*4>>(RG.dout, dout);
};
};
template<>
class RecursiveGraph<1>: public adf::graph {
private:
adf::kernel k;
public:
adf::port<input> din;
adf::port<output> dout;
RecursiveGraph() {
k = adf::kernel::create(passthrough);
adf::source(k) = "kernels.cpp";
adf::runtime<ratio>(k) = 0.9;
adf::connect<window<FRAME_LENGTH*4>>(din, k.in[0]);
adf::connect<window<FRAME_LENGTH*4>>(k.out[0], dout);
};
};
The class RecursiveGraph
is
parametrized with the template parameter Level
which represents the depth of the recursive function. Within the RecursiveGraph
class, an instantiati on of the same
class is performed as RecursiveGraph<Level-1>
RG;
with the template parameter Level-1
. This will recursively instantiate RecursiveGraph
Level-1
times. The RecursiveGraph<1>
class specialization behaves as the stop
condition of the recursion.
class TestRecursiveGraph: public adf::graph {
public:
adf::input_plio plin;
adf::output_plio plout;
RecursiveGraph<5> Recursive;
TestRecursiveGraph()
{
plin = adf::input_plio::create("input",adf::plio_64_bits,"data/Input_64.txt",500);
adf::connect(plin.out[0],Recursive.din);
plout = adf::output_plio::create("output",adf::plio_64_bits,"data/Output.txt",500);
adf::connect(Recursive.dout,plout.in[0]);
};
};
In this example, five instances of RecursiveGraph
will be instantiated in the TestRecursiveGraph
graph.
TestRecursiveGraph RecursiveUnitTest;
int main(int argc, char ** argv) {
RecursiveUnitTest.init();
RecursiveUnitTest.run(NFRAMES*NITERATIONS);
RecursiveUnitTest.end();
return 0;
}
The recursive graph view obtained in Vitis Analyzer is the following:
Figure 1. Recursive Graph View