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(din, k.in[0]);
adf::connect(k.out[0], RG.din);
adf::connect(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(din, k.in[0]);
adf::connect(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 as opposed to a sequential graph view obtained in the Vitis IDE is the following:
The hierarchy obtained using recursivity is clearly visible in the graph view.