Specman:在动态生成具有所有不同值的列表列表时出错
问题描述:
我尝试生成具有所有不同值的uint列表(my_list_of_list
)的动态列表(我有一个变量num_of_ms_in_each_g : list of uint
,即前产生m
(中值),这是尚未UINT(g
的任何列表),并没有出现在当前的:保持内部my_list_of_list
每个列表的长度):Specman:在动态生成具有所有不同值的列表列表时出错
var my_list_of_list : list of list of uint;
gen my_list_of_list keeping {
for each (g) using index (g_idx) in it {
g.size() == num_of_ms_in_each_g[g_idx];
for each (m) using index (m_idx) in g {
// Error in the next line:
m not in it[0..g_idx-1][0..num_of_ms_in_each_g[g_idx]-1];
m not in it[g_idx][0..max(0, m_idx-1)];
};
};
说明的编码算法以前的索引列表。
我得到的编译错误:
*** Error: 'm' is of type 'uint', while expecting type 'list of uint' or
'list of list of uint'.
你有任何想法如何解决编译错误? (it[0..g_idx-1][0..num_of_ms_in_each_g[g_idx]-1]
is uint ..)或者也许另一种方式来生成具有所有不同值的即时list of list of uint
? 谢谢你的帮助。
答
我会通过使用一种包含所有项目的统一列表来降低这个约束的复杂性,然后将这个列表分解成所需的列表列表(因为它更容易生成单个唯一列表) 。另外,一般而言,最好将所有非生成操作保留在约束之外,因为它可以通过程序完成 之后将提高生成此类字段集的整体性能。
我会用下面的代码做到这一点:
var unified_list:list of uint;
var my_list_of_list : list of list of uint;
gen unified_list keeping {
it.size()==num_of_ms_in_each_g.sum(it);
it.all_different(it);
};
for each in num_of_ms_in_each_g {
var temp_list:list of uint;
for i from 0 to it-1 {
temp_list.add(unified_list.pop0());
};
my_list_of_list.add(temp_list);
};
感谢
答
其实,表达it[0..g_idx-1][0..num_of_ms_in_each_g[g_idx]-1]
是list of list of uint
类型。运营商list[from..to]
产生子列表。在你的代码中,你将它应用两次到it
,它首先产生一个子列表,然后产生子列表的子列表。
代码中的第二个这样的约束起作用,因为it[g_idx]
不会生成子列表,而是访问列表项,该列表项的类型为list of uint
,然后生成子列表。
为了产生列表的所有不同的名单我会做这样的事情:
var my_list_of_list : list of list of uint;
for each (sz) in num_of_ms_in_each_g {
var l : list of uint;
gen l keeping {
it.size() == sz;
it.all_different(it);
// not it.has(it in my_list_of_list.flatten());
// for better performance
for each (itm) in it {
itm not in my_list_of_list.flatten();
};
};
my_list_of_list.add(l);
};