хороший способ ограничить сумму различных экземпляров

У меня есть структура (например, mystruct_s), в которой есть несколько структур одного типа (например, package_s) в разных иерархиях.

struct packet_s {
   size:uint;
   active:bool;
};

struct mystruct_s {
   // packet struct paths:
   // p
   // q.p
   // w.p
};

Я хотел бы создать экземпляр mystruct_s и обеспечить, чтобы сумма размеров всех активных пакетов была меньше 1 КБ.

var s : mystruct_s;
gen s keeping {
     // it.p.size (if it.p.active) + it.q.p.size (if it.q.p.active) + it.w.p.size (if it.w.p.active) < 1024 ;
};

Есть ли простой способ решить эту проблему?


person orit1018    schedule 27.04.2015    source источник
comment
Пожалуйста, назовите заголовок как вопрос; Кроме того, ваш вопрос определенно слишком широк - попробуйте переориентировать свой вопрос на меньшую сферу.   -  person Cinch    schedule 27.04.2015


Ответы (4)


Простым решением будет использование троичного и плюса для суммирования размеров, если они активны:

var s : mystruct_s;
gen s keeping {
    (it.p.active ? it.p.size : 0) + (it.q.p.active ? it.q.p.size : 0) + (it.w.p.active ? it.w.p.size : 0) < 1024 ;
};

Если вы используете Specman 14.1 (или выше), вы можете использовать генеративный литеральный список и сумму, чтобы написать следующее ограничение:

var s : mystruct_s;
gen s keeping {
    {it.p; it.q.p; it.w.p}.sum(it.active ? it.size : 0)) < 1024 ;
};

Использование генеративного литерального списка также даст вам лучшее распределение по размерам.

Если вы используете Specman 14.2 (или выше), вы можете использовать условную сумму вместо суммы с троичным:

var s : mystruct_s;
gen s keeping {
    {it.p; it.q.p; it.w.p}.sum(it.size, it.active) < 1024 ;
};
person Amit M.    schedule 27.04.2015

Замените все экземпляры packet_s одним списком. Затем используйте псевдометод списка .sum ограничение

person Zvika    schedule 27.04.2015

Попробуйте (не уверен, что это сработает):

extend my_struct { keep {p.sizep.active.as_a(bit),w.p.sizew.p.active.as_a(bit),...}.sum(it) ‹ 1024; }

person ehudv    schedule 27.04.2015

person    schedule
comment
Как это должно работать? %{} объединяет все значения; count() ожидает в качестве аргумента все логические значения. - person Thorsten; 27.04.2015