Specman:动态生成具有所有不同值

时间:2016-01-12 10:28:28

标签: specman on-the-fly e

我尝试生成具有所有不同值的uint(my_list_of_list)列表的动态列表(我有一个变量num_of_ms_in_each_g : list of uint,它保持{{1}内的每个列表的长度}):

my_list_of_list

代码算法的说明:生成 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)]; }; }; (值)之前尚未出现在任何uint(m)列表中,并且未出现在当前以前索引的列表。

我收到编译错误:

g

您是否知道如何解决编译错误? ( *** Error: 'm' is of type 'uint', while expecting type 'list of uint' or 'list of list of uint'. 是uint ..)或者可能是另一种生成具有所有不同值的it[0..g_idx-1][0..num_of_ms_in_each_g[g_idx]-1]的方法? 谢谢你的帮助。

2 个答案:

答案 0 :(得分:1)

我会通过使用包含所有项目的统一列表来减少此约束的复杂性,然后 将此列表分成所需的列表列表(因为生成单个唯一列表更容易)。 此外,一般来说,最好将所有非生成操作保持在约束之外,因为它可以在程序上完成 之后,这将改善生成这样的字段集的整体性能。

我会使用以下代码执行此操作:

   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);
        };

感谢

答案 1 :(得分:1)

实际上,表达式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);
};