特定のタイプを別の方法で処理するためにデフォルトのテンプレート インプリメンテーションをオーバーライドする必要がある場合、Vitis Model Composer でテンプレートの特殊化がサポートされます。クラス MyClass
にジェネリック MyClass
とは異なる 2 つのインターフェイスがある次の例を考えます。1 つの特殊化バージョンは cint16
型をインプリメントするよう宣言され、もう 1 つのバージョンは uint32
型をインプリメントするよう宣言されています。
template_specialization.h
#include <adf.h>
template<typename T,int N>
class MyClass
{
};
template<>
class MyClass<cint16,1> {
int m_count;
int16 var_1;
int16 var_2;
int16 var_3;
uint16 var_4;
public:
MyClass();
MyClass(int16 q_var1,int16 q_var2,int16 q_var3,uint16 q_var4);
MyClass(int16 q_var1,int16 q_var2);
MyClass(int16 q_var1,int16 q_var2,int16 q_var3);
void func_mem(input_stream<cint16> *i1,
output_stream<cint16> *o1,
output_stream<int> *o2);
static void registerKernelClass()
{
REGISTER_FUNCTION(MyClass::func_mem);
}
};
template<>
class MyClass<uint32,2> {
int m_count;
int16 var;
public:
MyClass(uint32 q_var1);
void func_mem(input_stream<uint32> *i1,
output_stream<uint32> *o1,
output_stream<int> *o2);
static void registerKernelClass()
{
REGISTER_FUNCTION(MyClass::func_mem);
}
};
2 つの関数が個別に 2 つの特殊化クラスで登録されています。カーネル func_mem
を AIE Class Kernel ブロックを使用してブロックとして Model Composer にインポートすると、ブロックの [Block Parameters] ダイアログ ボックスの Kernel Class タブは次のようになります。
図 1. クラス バリアント
[Kernel Class Variants] セクションでいずれかのカーネル クラス バリアントを選択すると、それに応じて [Class Template Parameters] のリストがアップデートされます。対応するクラス バリアントのカーネル クラス コンストラクターのリストがアップデートされ、リストから選択できるようになります (次の図を参照)。
図 2. カーネル クラス コンストラクター
注記: カーネル クラス コンストラクター パラメーターの値の指定には、MATLAB 変数を使用できます。