我使用一堆集合来生成约束随机流量,但我希望能够调用一个Specman宏来计算集合的补码,其语法如下:
COMPLEMENT begin
domain=[0..10,24..30],
complementing_set=[2..3,27..30]
end
并生成:
[0..1,4..10,24..26]
每当我需要一个集合的补充时,我使用完全填充的列表(例如{0; 1; 2; 3 ....})然后删除元素,而不是使用Specman的内置int_range_list对象。而且我也在运行时而不是编译时进行了大量的这些集合计算。
答案 0 :(得分:2)
你可以试试这个:
var domain: list of int = {0..10, 24..30};
var complementing_set: list of int = {2..3, 27..30};
var complement: list of int = domain.all(it in complementing set);
all
伪方法生成父列表中括号中的条件所包含的所有元素的父列表的子列表。
答案 1 :(得分:2)
在Specman的最新版本中,您可以使用预定义的set
类型,它正是出于此目的。例如,您可以执行以下操作:
var s1: set = [1..5, 10..15];
var s2: set = [4..13];
var s3: set = s1.intersect(s2);
甚至是这样的:
x: int;
y: int;
........
var s1: set = [x..y];
var s2: set = [1..10];
var s3: set = s1.union(s2);
等
答案 2 :(得分:1)
另一种方法可能是使用uints,比如你有500个可能的值:
domain : uint(bits:500);
complement : uint(bits:500);
set : uint(bits:500) = domain & ~complement;
您可以稍后使用
提取索引set_l : list of uint = set[.]].all_indices(it==1);
取决于您的域与可能的值比率,此方法可能更快计算