説明
syn.directive.disaggregate
コマンドを使用すると、struct
変数が個別の要素に分割されます。作成される要素の数とタイプは、その構造体の内容によって決まります。
重要: 最上位関数への引数として使用される構造体は、デフォルトでは集約されますが、このプラグマまたは指示子を使用して分割できます。
構文
syn.directive.disaggregate=<location> <variable>
- <
location
>: 分割する変数のディレクトリで、function[/label]
の形式で指定します。 -
variable
: 変数名を指定します。
オプション
このコマンドにはオプションはありません。
例 1
次の例は、関数 top
の構造体変数 a
を分割します。
syn.directive.disaggregate=top a
例 2
分割された構造体は、次に示すように、標準の C/C++ コーディング スタイルを使用して、コード内でアドレス指定できます。指示子を使用する場合:
syn.directive.disaggregate=top a
syn.directive.disaggregate=top c
このコードは、次のような構造で使用されます。
struct SS
{
int x[N];
int y[N];
};
int top(SS *a, int b[4][6], SS &c) {
syn.directive.interface=mode=s_axilite top a->x
syn.directive.interface=mode=s_axilite top a->y
syn.directive.interface=mode=ap_memory top c.x
syn.directive.interface=mode=ap_memory top c.y
重要: ポインターの要素にアクセスする方法 (a) と、リファレンスの要素にアクセスする方法 (c) が異なることに注意してください。
例 3
次の例は、RGB
構造体を要素として含む Dot
構造体を示しています。Arr
変数に syn.directive.disaggregate
を適用すると、最上位の Dot
構造体のみが分割されます。
struct Pixel {
char R;
char G;
char B;
};
struct Dot {
Pixel RGB;
unsigned Size;
};
#define N 1086
void DUT(Dot Arr[N]) {
...
}
syn.directive.disaggregate=DUT Arr
構造体全体 (Dot
および RGB
) を分割する場合は、次のように set_directive_disaggregate
を割り当てます。
void DUT(Dot Arr[N]) {
#pragma HLS disaggregate variable=Arr->RGB
...
}
syn.directive.disaggregate=DUT Arr->RGB
この場合、結果は次のようになります。
void DUT(char Arr_RGB_R[N], char Arr_RGB_G[N], char Arr_RGB_B[N], unsigned Arr_Size[N]) {
...
}