再帰関数は合成できません。これは、次のような再帰が複数回繰り返される可能性のある関数に適用されます。
unsigned foo (unsigned n)
{
if (n == 0 || n == 1) return 1;
return (foo(n-2) + foo(n-1));
}
Vitis HLS では、有限数の関数呼び出しがある末尾再帰もサポートされません。
unsigned foo (unsigned m, unsigned n)
{
if (m == 0) return n;
if (n == 0) return m;
return foo(n, m%n);
}
C++ では、テンプレートで末尾再帰をインプリメントでき、合成可能な末尾再帰デザインに使用できます。
注意:
仮想関数はサポートされません。