约束不同实例总和的好方法

时间:2015-04-27 07:54:21

标签: specman e

我有一个struct(例如mystruct_s),在不同的层次结构中有几个相同的类型结构(例如packet_s)。

( sum(Status='Approved')  / COUNT(*)) * 100

我想生成一个mystruct_s实例,并强制所有活动包的大小总和小于1K。

SELECT `Reviewer`, 
`ProjectID`,
 COUNT(*) as NumberOfTimesProjectSubmitted ,
 ( sum(Status='Approved')  / COUNT(*)) * 100 Approval_Percentage 
FROM `Project_Assignment`
GROUP by ProjectID,Reviewer

有没有一种简单的方法可以解决这个问题?

4 个答案:

答案 0 :(得分:2)

直接的解决方案是使用三元和加号来计算活动时的大小:

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(或更高版本),您可以使用生成文字列表和sum来编写以下约束:

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

答案 1 :(得分:0)

用一个列表替换packet_s的所有实例。 然后使用list伪方法.sum约束

答案 2 :(得分:0)

尝试(不确定这是否有效):

扩展my_struct {     keep {p.size p.active.as_a(bit),w.p.size w.p.active.as_a(bit),...}。sum(it)&lt; 1024; }

答案 3 :(得分:-1)

Keep %{mystruct.p.size, mystruct.q.p, ...}.count(it) < 1K