2008-09-22 46 views
4

爲了生成受約束的隨機通信量,我使用了一系列的集合,但是我希望能夠調用一個Specman宏來計算集合的補碼,語法如下:Specman宏用int_range_list對象進行減法運算

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對象。而且我在運行時而不是編譯時也做了很多這些集計算。

回答

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僞方法生成在其中括號內的條件成立父列表中的所有元素的父表的子表。

+0

這是做工會爲int的名單一個真正偉大的方式!我的目標是*不*使用list_of_int's,因爲它消耗太多內存。我們的設計中有16個以上的節點,節點的類型也各不相同。我想使用int_range_list,因爲當測試val是否在set中時,Specman更快。 – 2008-09-29 19:04:53

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

取決於你自己的域名可能值比例提取指數此方法可能更快計算

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