eの「型」制約のトピックについて読みました。次の例のように、構造体フィールドの型を制限できることがわかりました。
extend DATA packet {
keep type header is a COP header;
};
これは、 DATA パケットを扱っているときはいつでも、コンパイラーがこれを想定しているため、ヘッダーをCOP ヘッダーにキャストする必要がないことを意味します。
「タイプ」制約を使用して、2 つの異なる決定フィールドを関連付けようとしました。たとえば、オペコードをエンコードするkindフィールドと、命令が受け取る引数を決定するformatフィールドを含む命令 構造体があるとします。
type instruction_kind : [ ADD, SUB, JMP, BE ] (bits:4);
type format_e : [ RRR, RI, RRI ];
struct instruction {
const kind : instruction_kind;
const format : format_e;
};
たとえば、RRR形式には次の引数が必要です。
type register_e : [ R0, R1, R2, R3 ] (bits:4);
extend RRR instruction {
rd : register_e;
rs1 : register_e;
rs2 : register_e;
};
ADD命令はこの形式になります。のように単純な制約のみを使用してADDをRRR形式に関連付ける場合、 ADDkeep kind == ADD => format == RRR
の引数を制約するには、次の手順を実行する必要があります。
extend sys {
run() is also {
var instr : instruction;
gen instr keeping {
it is a ADD RRR instruction (add) and all of {
add.rd == R3;
add.rs1 == R1;
add.rs2 == R2;
};
};
print instr;
};
};
引数はRRRサブタイプで定義されているため、明示的にキャストする必要があります。各命令がどのような形式であるかを常に調べる必要があるため、これはかなり面倒です。ADD 命令にキャストするだけのほうが自然でした。
この目的のために「タイプ」制約を使用しようとしましたが、成功しませんでした。私が次のように書くと:
extend ADD instruction {
keep type me is a RRR instruction;
};
次のエラー メッセージが表示されます。
*** Error: Type constraints may only be put on fields of this struct
次のように書くと:
extend ADD instruction {
keep type format == RRR;
};
別のエラー メッセージが表示されます。
*** Error: Type constraints may only equate a property (enum field) of
the context struct with that of an associated struct
2 番目のエラーは、私がやろうとしていることを明確に禁止していますが、最初のエラーは解釈の余地があります。
引数を独自の構造体に抽出するだけです。
struct instruction_args {
const format : format_e;
};
extend RRR instruction_args {
rd : register_e;
rs1 : register_e;
rs2 : register_e;
};
ドキュメントに示されているように、「タイプ」制約を設定します。
extend instruction {
when ADD { keep type args is a RRR instruction_args };
};
しかし、今では制約するときは常にすべての引数の前に.argsを付ける必要があります:
extend sys {
run() is also {
var instr : instruction;
gen instr keeping {
it is a ADD instruction (add) and all of {
add.args.rd == R3;
add.args.rs1 == R1;
add.args.rs2 == R2;
};
};
print instr;
};
};
これは制約を書くときは大したことではありませんが、印刷するときは の内容はargs
印刷されません。これは許容できる回避策ですが、私はまだ最初のアイデアに興味があります。
同じ構造体のwhenサブタイプを関連付けることは可能ですが、適切な構文を使用していませんでしたか?