データ型の関数テンプレートは、汎用データ型を使用可能な関数です。関数テンプレートを使用すると、複数のデータ型をサポートするライブラリ関数を作成でき、各データ型をサポートするために Vitis Model Composer HLS ブロック ライブラリでコードまたはブロックを複製する必要はありません。Model Composer の xmcImportFunction
コマンドを使用して、ブロックでサポートされるどのデータ型の信号にでも接続可能な汎用ライブラリ ブロックを作成します。
データ型 (typename
) テンプレート パラメーターは、コードおよびシミュレーション ラッパーが生成されるシミュレーション実行時間に解決されます。パラメーターはシミュレーション中にライブラリ ブロックに接続されている信号で指定された実際のデータ型に置き換えられます。置き換えられるデータ型は、データ型の使用 に説明されている Model Composer でサポートされるデータ型である必要があります。
template <typename T>
T max(T x, T y) {
return (x > y) ? x : y;
}
#include <complex>
template <typename T>
void mult_by_two(std::complex< T > x, std::complex< T > *y)
{
*Out = In1 * 2;
}
typename
(または class
) パラメーターはブロックの入力信号から伝搬されるか、シミュレーション前にユーザーが定義する必要のあるカスタマイズ パラメーターです。 次の例では、関数テンプレートでパラメーター T をカスタマイズ パラメーターとして定義しています。入力引数 x または y に関連付けられていないので、ブロックをモデルに追加したときにユーザーが値を指定する必要があります。
template <typename T>
T min(int x, int y) {
return (x < y) ? x : y;
}
生成された Library Function ブロックの [Block Parameters] ダイアログ ボックスには、次の図に示すように、テンプレート引数を入力する編集フィールドがあります。
テンプレート構文では、関数またはクラスのデータ型テンプレート パラメーターをほかのテンプレート パラメーターで指定できます。指定順序は重要ではありません。次に例を示します。
template <typename T1, int ROWS, int COLS, int W, int I>
T1 func(T1 x[ROW][COLS], ap_fixed<W, I> &y) {
...
}
SUPPORTED_TYPES/UNSUPPORTED_TYPES プラグマ
typename
) テンプレート パラメーター (または class
) を定義する際、関数シグネチャの一部として SUPPORTED_TYPES
または UNSUPPORTED_TYPES
プラグマを使用して変数でサポートされるデータ型を定義できます。これを次のコード例に示します。#pragma XMC INPORT x
#pragma XMC INPORT y
#pragma XMC SUPPORTED_TYPES T: int8, int16, int32, double, single, half
template <class T>
T max(T x, T y) {
return (x > y) ? x : y;
}
#pragma XMC UNSUPPORTED_TYPES T: boolean
#pragma XMC INPORT x, y
template <typename T>
T min(T x, T y) {
return (x < y) ? x : y;
}
Model Composer では、データ型の使用 に示すデータ型がサポートされます。テンプレート パラメーターでサポートされるデータ型を指定するには、サポートされるデータ型またはサポートされないデータ型をリストします。SUPPORTED_TYPES
と UNSUPPORTED_TYPES
プラグマは、同じものを反対の方法で指定します。
-
SUPPORTED_TYPES
: テンプレート パラメーター名 (param
) を指定し、そのパラメーターでサポートされるデータ型をリストします。リストされていないデータ型はサポートされません。#pragma XMC SUPPORTED_TYPES param: type1, type2, ...
-
UNSUPPORTED_TYPES
: テンプレート パラメーター名 (param
) を指定し、そのパラメーターでサポートされないデータ型をリストします。リストされていないデータ型すべてがサポートされます。#pragma XMC UNSUPPORTED_TYPES param: type1, type2, ...
SUPPORTED_TYPES
または UNSUPPORTED_TYPES
プラグマの指定に基づいて、Model Composer でブロックに接続されている入力信号のデータ型がサポートされているかどうかが確認されます。これらのプラグマを使用しない場合、データ型テンプレート パラメーターで Model Composer でサポートされるデータ型がすべてサポートされます。
関数テンプレートの特殊化およびオーバーロード
xmcImportFunction
コマンドでは、関数テンプレートの特殊化がサポートされています。Model Composer では、複数のデータ型をサポートする汎用関数テンプレートのライブラリ ブロックが作成されますが、一致するデータ型の入力信号に接続されたときに使用される特殊化関数も含まれます。汎用関数と特殊化関数の両方がブロック DLL にコンパイルされます。次に例を示します。
template <typename T>
T min(T x, T y) {
return (x < y) ? x : y;
}
template <>
bool min<bool>(bool x, bool y) {
...
}
この例では、ブロックがブール信号に接続されたときに、Model Composer で min
関数の特殊化されたブール式が呼び出されます。
int func(int x);
float func(float x);
次のように関数テンプレートをオーバーロードさせることもできます。template <typename T>
int func(int x, T y);
template <typename T>
float func(float x, T y);