Specman 宏对 int_range_list 对象进行集合减法

发布于 2024-07-05 01:26:18 字数 352 浏览 7 评论 0原文

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

I work with a bunch of sets in order to generate constrained random traffic, but I want to be able to call a Specman macro that computes the complement of a set with syntax like:

COMPLEMENT begin 
   domain=[0..10,24..30],
   complementing_set=[2..3,27..30] 
end

and have it generate:

[0..1,4..10,24..26]

Every time I need the complement of a set I'm using fully populated lists (e.g. {0;1;2;3....} ) and then removing elements, instead of using Specman's built-in int_range_list object. And I'm also doing a lot of these set calculations at run-time instead of compile-time.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

梦断已成空 2024-07-12 01:26:18

您可以尝试以下操作:

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

You can try this:

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

The all pseudo-method generates a sublist of the parent list of all the elements in the parent list for which the condition in the parentheses holds.

潦草背影 2024-07-12 01:26:18

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

In the recent versions of Specman, you can use the pre-defined set type, that serves exactly this purpose. For example, you can do things like this:

var s1: set = [1..5, 10..15];
var s2: set = [4..13];
var s3: set = s1.intersect(s2);

and even like this:

x: int;
y: int;
........
var s1: set = [x..y];
var s2: set = [1..10];
var s3: set = s1.union(s2);

etc.

蓝天 2024-07-12 01:26:18

另一种方法可能是使用 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);

此方法可能会更快地计算

one more way may be to use uints, say you have a 500 possible values:

domain : uint(bits:500);
complement : uint(bits:500);
set : uint(bits:500) = domain & ~complement;

you can later extract the indices with

set_l : list of uint = set[.]].all_indices(it==1);

depending on your domain to possible values ratio this method may be quicker to calculate

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文