我想在特定限制下生成列表中的项目。例如:
dup_offset: list of uint(bits:5);
keep dup_offset.size() == 3;
foo_gen() is {
for each in dup_offset {
gen dup_offset[index] keeping {
read_only(index == 0) => it <= 21;
read_only(index == 1) => it < dup_offset[0];
read_only(index == 2) => it < dup_offset[0];
read_only(index == 2) => it < dup_offset[1];
};
};
};
列表是一个全局变量,生成在gen_foo()中完成。 它不会以我编写的方式编译。 任何人都可以建议我该怎么做?
答案 0 :(得分:1)
&#39; gen keep&#39;构造不能用于列表项。 您仍然可以使用关键字&#39; prev&#39;来建模您的约束。 如果我理解正确,您希望所有商品的值都小于或等于21,并且每件商品都会小于之前的商品。
!dup_offset: list of uint(bits:5);
foo_gen() is {
gen dup_offset keeping {
it.size() == 3;
for each in it {
it <= 21; //all items will be <= 21
(prev == 0 ? (it == 0) : (it < prev)); // each items is smaller than the previous item
};
};
};
答案 1 :(得分:0)
在编写约束时,可以将代码重写为:
!dup_offset: list of uint(bits:5);
keep dup_offset.size() == 3;
keep for each in dup_offset {
index == 0 => it <= 21;
index == 1 => it < prev;
index == 2 => it < dup_offset[0];
index == 2 => it < prev;
};
foo_gen() is {
gen dup_offset;
};
请注意,您可以删除keep for each
中的第三个约束,因为它会立即隐含在第二个和第四个约束的组合中。
但是,如果我正确理解您的要求 - 您需要减少一系列小于21的元素 - 那么约束可以重写如下:
!dup_offset: list of uint(bits:5);
keep dup_offset.size() == 3;
keep for each (a) using index (ind1) in dup_offset {
ind1 == 0 => a <= 21;
for each (b) using index (ind2) in dup_offset {
ind1 > ind2 => a < b;
};
};
foo_gen() is {
gen dup_offset;
};
请注意,现在模型不再取决于列表的大小 - 使列表更大不需要添加任何更多约束。