2008-09-22 5 views
4

Je travaille avec un ensemble d'ensembles pour générer du trafic aléatoire contraint, mais je veux être capable d'appeler une macro Specman qui calcule le complément d'un ensemble avec une syntaxe comme:Macro Specman pour faire la soustraction avec les objets int_range_list

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

et l'ont generate:

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

Chaque fois que je besoin du complément d'un ensemble que je utilise des listes entièrement peuplées (par exemple {0, 1, 2, 3 ....}) puis en supprimant des éléments, au lieu d'utiliser l'objet intégré int_range_list de Specman. Et je fais aussi beaucoup de ces calculs au moment de l'exécution au lieu de la compilation.

Répondre

2

Vous pouvez essayer ceci:

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

Le pseudo-méthode all génère une sous-liste de la liste des parents de tous les éléments dans la liste des parents pour lesquels la condition entre parenthèses détient.

+0

C'est une excellente façon de faire les syndicats avec une liste d'int! Mon but est de * ne * pas utiliser list_of_int, car il consomme trop de mémoire. Nous avons plus de 16 nœuds dans notre conception et les nœuds sont de différents types. Je veux utiliser int_range_list car Specman est plus rapide lors du test si un val est dans l'ensemble. –

+0

Je ne veux pas non plus faire beaucoup de calculs dynamiquement. Je regarde des tonnes de champs de paquets à la volée, et je veux accélérer le test de savoir si un certain nombre entier vit dans un ensemble (ou une union de différents ensembles). –

+0

Merci pour la réponse. Je ne pense pas qu'il existe une solution, car Specman n'a pas de très bon pré-processeur. Je testais surtout pour voir si stackoverflow pouvait m'aider à générer des réponses à des questions difficiles et obscures. –

1

une autre façon peut-être utiliser uints, que vous avez un 500 valeurs possibles:

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

vous pouvez ensuite extraire les indices avec

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

en fonction de votre domaine rapport des valeurs possibles cette méthode peut être plus rapide à calculer

2

Dans les versions récentes de Specman, vous pouvez utiliser le type set prédéfini qui remplit exactement cette fonction. Par exemple, vous pouvez faire des choses comme ceci:

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

et même comme ceci:

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

etc.

Questions connexes