Макрос Specman для выполнения вычитания множества с объектами int_range_list

Я работаю с множеством наборов, чтобы генерировать ограниченный случайный трафик, но я хочу иметь возможность вызывать макрос 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. И я также делаю много этих вычислений во время выполнения, а не во время компиляции.


person Ross Rogers    schedule 22.09.2008    source источник


Ответы (3)


Вы можете попробовать это:

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 создает подсписок родительского списка всех элементов родительского списка, для которых выполняется условие в скобках.

person Nathan Fellman    schedule 28.09.2008
comment
Это действительно отличный способ сделать союзы со списком int! Моя цель - не использовать list_of_int, потому что он потребляет слишком много памяти. В нашем проекте более 16 узлов, и узлы бывают разных типов. Я хочу использовать int_range_list, потому что Specman быстрее проверяет наличие val в наборе. - person Ross Rogers; 29.09.2008
comment
Я также не хочу делать много вычислений динамически. Я просматриваю тонны полей пакета на лету и хочу ускорить проверку того, находится ли определенное целое число в каком-то наборе (или объединении разных наборов). - person Ross Rogers; 29.09.2008
comment
Спасибо за ответ. Я не думаю, что есть решение, потому что у Specman нет очень хорошего препроцессора. В основном я просто проверял, может ли stackoverflow помочь мне генерировать ответы на сложные вопросы на непонятном языке. - person Ross Rogers; 29.09.2008

В последних версиях 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);

и т. д.

person Yuri Tsoglin    schedule 10.04.2014

еще один способ может заключаться в использовании 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);

в зависимости от отношения вашего домена к возможным значениям этот метод может быть быстрее для расчета

person guy    schedule 07.06.2012