我有my_list
这样定义:
struct my_struct {
comparator[2] : list of int(bits:16);
something_else[2] : list of uint(bits:16);
};
...
my_list[10] : list of my_struct;
禁止comparators
在同一索引(0或1)中的所有列表中的 keep my_list.all_different(it.comparator[0]);
相同。当我以这种方式约束它时(例如索引0):
*** Error: GEN_NO_GENERATABLE_NOTIF:
Constraint without any generatable element.
...
keep my_list.all_different(it.comparator[0]);
我收到编译错误:
{{1}}
我怎样才能生成不同的一样?感谢任何帮助
答案 0 :(得分:2)
当您引用my_list.comparator
时,它不会按照您的想法执行。会发生的是它将所有comparator
列表连接成一个20位元素列表。通过删除约束并打印它来尝试:
extend sys {
my_list[10] : list of my_struct;
run() is also {
print my_list.comparator;
};
};
在这种情况下,您可以构建自己的comparator[0]
元素列表:
extend sys {
comparators0 : list of int;
keep comparators0.size() == my_list.size();
keep for each (comp) in comparators0 {
comp == my_list.comparator[index * 2];
};
keep comparators0.all_different(it);
// just to make sure that we've sliced the appropriate elements
run() is also {
print my_list[0].comparator[0], comparators0[0];
print my_list[1].comparator[0], comparators0[1];
print my_list[2].comparator[0], comparators0[2];
};
};
您可以在此新列表中应用all_different()
约束。为了确保它正常工作,添加以下约束应该会导致矛盾:
extend sys {
// this constraint should cause a contradiction
keep my_list[0].comparator[0] == my_list[1].comparator[0];
};
答案 1 :(得分:2)
它也可以一气呵成:
keep for each (elem) in my_list {
elem.comparator[0] not in my_list[0..max(0, index-1)].apply(.comparator[0]);
elem.comparator[1] not in my_list[0..max(0, index-1)].apply(.comparator[1]);
};