4

我使用一堆集合来生成受约束的随机流量,但我希望能够调用一个 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 对象。而且我还在运行时而不是编译时进行了很多这样的集合计算。

4

3 回答 3

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伪方法生成父列表中括号中条件成立的所有元素的子列表。

于 2008-09-28T19:48:45.130 回答
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);

等等

于 2014-04-10T16:27:09.797 回答
1

另一种方法可能是使用 uint,假设您有 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);

根据您的域与可能值的比率,此方法可能计算得更快

于 2012-06-07T08:10:24.210 回答