我已经阅读了 e 中'类型'约束的主题。我看到可以约束struct字段的类型,比如在这个例子中:
extend DATA packet {
keep type header is a COP header;
};
这意味着每当我处理 DATA数据包时,我都不需要将标题转换为 COP标题作为编译器为我假设这一点。
我尝试使用'type'约束来绑定两个不同的行列式字段。例如,假设我们有一个指令 struct ,其中包含一个 kind 字段,用于对操作码和格式进行编码确定指令所用参数的字段:
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 格式绑定,如keep kind == ADD => format == RRR
,那么约束 ADD的参数,我需要做以下事情:
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指令就更自然了。
我试图为此目的使用'type'约束,但没有成功。如果我写下以下内容:
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
第二个错误明确禁止我正在尝试做的事情,但第一个错误允许解释空间。
我可以将参数提取到自己的结构中:
struct instruction_args {
const format : format_e;
};
extend RRR instruction_args {
rd : register_e;
rs1 : register_e;
rs2 : register_e;
};
并设置'type'约束,如文档中所示:
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
的内容不会打印出来。这是一个可接受的解决方案,但我仍然对最初的想法感兴趣。
当相同的结构中的 子类型可以关联时,我只是没有使用正确的语法吗?
答案 0 :(得分:0)
原则上,当知道每个 ADD instruction
实际上是ADD RRR instruction
时,并且希望编译器自动处理每个变量或表达式更具体的声明类型更具体(允许在不进行转换的情况下访问更具体类型的成员),然后您可以首先使用更具体的类型进行任何此类声明。
如果不知道这是什么,那么遗憾的是我没有看到任何更好的通用方法来实现这一目标。部分解决方法可能是定义将<type>
转换为ADD instruction
的{{1}}宏,但您需要非常仔细地定义此宏,因为它应该捕获确切使用的语法(对于例如,如果您希望它同时捕获short和full if限定符,则需要相应地定义它。您可以尝试制作宏ADD RRR instruction
并在其代码中使用反射API来涵盖各种情况。