生成不在结构列表中的字段

时间:2014-05-20 07:54:16

标签: specman

假设我们有一个结构,其中有一个名为idx的int字段。 我有一个这个结构的列表,我需要生成一个不在此列表中的索引。 最直接的保持是:     gen idx keep {         它不在mylist.idx中;     };

问题是如果mylist很长,那么mylist.idx会返回一个大列表。 我本来希望这样做:     gen idx keep {         不是mylist.has(it.idx == it);     };

还有其他方法可以做到这一点,具有更好的内存性能吗?

1 个答案:

答案 0 :(得分:3)

确实,当list.field返回一个新列表时,重复执行此操作时,可以分配大量内存。

缓解疼痛的一种方法是使用辅助列表来避免使用“mylist.idx”并分配新列表。

这样,如果您的原始代码是

<'  
struct A {
  idx:int;  
};
extend sys  {
    run() is also  {
        var mylist: list of A;
        var idx:int;
        for i from 0 to 10000 {
            gen idx keeping {it not in mylist.idx};
            mylist.add(new A with {.idx = idx;});
        };
    };
};
'>

峰值工艺尺寸:969MB

你可以添加一个辅助列表:

<'
struct A {
  idx:int;  
};
extend sys  {
    run() is also  {
        var mylist: list of A;
        var l : list of int;
        var idx:int;
        for i from 0 to 10000 {
            gen idx keeping {it not in l};
            mylist.add(new A with {.idx = idx;});
            l.add(idx);
        };
    };
};
'>

峰值工艺尺寸:736MB

但是,由于Specman 12.2你可以使用带有辅助变量的“set”类型,这在生成中更有效。

<'
struct A {
  idx:int;  
};
extend sys  {
    run() is also  {
        var mylist: list of A;
        var S:set;
        var idx:int;
        for i from 0 to 10000 {
            gen idx keeping {it not in value(S)};
            mylist.add(new A with {.idx = idx;});
            S = S.union([idx]);
        };
    };
};
'>

峰值工艺尺寸:135MB