1

DAC macroビットのリストの名前とそのサイズ、および整数変数の名前を入力として取得する a を作成しようとしています。リスト内のすべての要素は、変数内のすべてのビット (両方とも同じ長さ) と等しくなるように制約する必要があります。つまり、(リスト名list_of_bitsと変数名fooで長さが4の場合) マクロの出力は次のようになります。

keep list_of_bits[0] == foo[0:0];
keep list_of_bits[1] == foo[1:1];
keep list_of_bits[2] == foo[2:2];
keep list_of_bits[3] == foo[3:3];

のマクロのコードは次のとおりです。

define <keep_all_bits'exp> "keep_all_bits <list_size'exp> <num'name> <list_name'name>" as computed {
    for i from 0 to (<list_size'exp> - 1) do {
        result = appendf("%s keep %s[%d] == %s[%d:%d];",result, <list_name'name>, index, <num'name>, index, index);
    };
};

私が得るエラー

 *** Error: The type of '<list_size'exp>' is 'string', while expecting a
numeric type
             ...
    for i from 0 to (<list_size'exp> - 1)  do {

<list_size'exp>を文字列として解釈するのはなぜですか? ご協力ありがとうございました

4

2 に答える 2

3

DAC マクロのすべてのマクロ引数は文字列と見なされます (文字列のリストと見なされる繰り返しを除く)。要点は、マクロはその入力を純粋に構文的に扱い、引数に関するセマンティック情報を持たないということです。たとえば、式 ( <exp>) の場合、マクロは実際に式を評価してコンパイル時にその値を計算することはできず、その型を把握することさえできません。この情報は、後のコンパイル段階で把握されます。

あなたの場合、サイズは常に一定であると想定します。したがって、まず、そのマクロ引数<num>の代わりにを使用し、 を使用して実際の数値に変換できます。との違いは、定数のみが許可され、式は許可されないことです。ただし、マクロ内では文字列として扱われます。<exp>as_a()<exp><num><num>

<struct_member>もう 1 つの重要なポイント: マクロ自体は、マクロではなくマクロであるべきです。<exp>これは、この構成体自体が構造体のメンバー (つまり、制約) であり、式ではないためです。

もう 1 つ: リストのサイズが正確に必要とされるようにするには、リストのサイズに別の制約を追加します。

したがって、改善されたマクロは次のようになります。

define <keep_all_bits'struct_member> "keep_all_bits <list_size'num> <num'name> <list_name'name>" as computed {
    result = appendf("keep %s.size() == %s;", <list_name'name>, <list_size'num>);
    for i from 0 to (<list_size'num>.as_a(int) - 1) do {
        result = appendf("%s keep %s[%d] == %s[%d:%d];",result, <list_name'name>, i, <num'name>, i, i);
    };

};

于 2014-11-30T10:17:13.613 に答える