Ограничение Specman/e (для каждой входящей) итерации

Могу ли я перебирать только часть списка в 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;
    };
  };
};

person evilpascal    schedule 08.10.2018    source источник


Ответы (1)


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

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

person Tudor Timi    schedule 09.10.2018
comment
Когда вы говорите, что списки будут содержать одни и те же объекты, вы имеете в виду, что layer_subl будет вести себя как указатель на layer_l и не будет создавать дополнительные объекты? Итак, когда я ограничиваю layer_subl, по сути, я буду ограничивать подмножество layer_l? - person evilpascal; 09.10.2018
comment
@evilpascal Да. Оператор == для structs означает «ссылочное равенство», то есть «идентичность». - person Tudor Timi; 09.10.2018
comment
@evilpascal Кроме того, электронные макросы очень эффективны. Вероятно, можно написать макрос define as computed, который расширяет keep for each (layer) in layer_l[0..2] точно до кода, который я предоставил, тем самым расширяя язык. - person Tudor Timi; 09.10.2018
comment
На самом деле он не будет создавать новые объекты, но создаст новый список: layer_subl будет отдельным списком, который будет содержать указатели из исходного списка. Если вы беспокоитесь о производительности, имейте в виду, что списки (даже если их элементы являются указателями) сами по себе имеют накладные расходы памяти. - person Yuri Tsoglin; 18.10.2018