Specman / e ограничение (для каждого в) итерации - PullRequest
0 голосов
/ 08 октября 2018

Могу ли я перебирать только часть списка в e в ограничении.Например, этот код будет проходить через весь список layer_l:

<'

struct layer_s {
  a : int;
    keep soft a == 3;
};

struct layer_gen_s {
  n_layers : int;
    keep soft n_layers == 8;
  layer_l  : list of layer_s;
    keep layer_l.size() == read_only(n_layers);
};

extend sys {
  layer_gen : layer_gen_s;     

  run() is also {
    messagef(LOW, "n_layers = %0d", layer_gen.n_layers);
    for each in layer_gen.layer_l{
      messagef(LOW, "layer[%2d]: a = %0d", index, it.a);
    };
  };
};

-- this will go through all layer_l
extend layer_gen_s {    
  keep for each (layer) using index (i) in layer_l {
    layer.a == 7;
  };
};

Но я хотел бы только выполнить итерацию для каждого входа, например, через 2 элемента.Я попробовал приведенный ниже код, но он не работает:

-- this produces an error
extend layer_gen_s {    
  keep for each (layer) using index (i) in [layer_l.all(index < 2)] {
    layer.a == 7;
  };
};

Также я не хочу использовать импликацию, так что это не то, что я хочу:

-- not what I want, I want to specify directly in iterated list
extend layer_gen_s {    
  keep for each (layer) using index (i) in layer_l {
    (i < 2) => {
      layer.a == 7;
    };
  };
};

1 Ответ

0 голосов
/ 09 октября 2018

Использование оператора нарезки списка также не работает, потому что path в ограничении for..each ограничено простым path (например, переменная списка).Следующее также не работает:

keep for each (layer) using index (i) in layer_l[0..2] {
  //...
};

Это ограничение Specman.

Чтобы форсировать циклы над подсписком, ваша единственная ставка - создать этот подсписок как отдельныйпеременная:

layer_subl: list of layer_s;
keep layer_subl.size() == 3;
keep for each (layer) using index (i) in layer_subl {
  layer == layer_l[i];
};

Теперь вы можете зациклить только первые 3 элемента в пределах вашего ограничения for..each:

keep for each (layer) in layer_subl {
  layer.a == 7;
};

Это позволяет избежать использования импликации внутри ограничения.Стоит ли это решать вам.Также обратите внимание, что списки будут содержать одинаковые объекты (это хорошо).Никаких дополнительных struct объектов не создается.

Создание подсписка, подобного этому, является стандартным кодом, который может обрабатываться самим инструментом.Это сделало бы код более кратким и читабельным.Вы можете связаться с вашим поставщиком и запросить эту функцию.

...