0

構造体 (mystruct_s など) があり、その下には、異なる階層に同じ型の構造体 (packet_s など) がいくつかあります。

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

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

mystruct_s のインスタンスを生成し、すべてのアクティブなパケットのサイズの合計が 1K 未満になるように強制したいと考えています。

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

この問題にアプローチする簡単な方法はありますか?

4

4 に答える 4

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 (またはそれ以降) を使用している場合は、生成リテラル リストと合計を使用して、次の制約を記述できます。

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 ;
};
于 2015-04-27T15:27:57.983 に答える
0

packet_s のすべてのインスタンスを単一のリストに置き換えます。次に、リスト疑似メソッド .sum 制約を使用します

于 2015-04-27T08:00:26.727 に答える
0

試してください(これが機能するかどうかはわかりません):

extend my_struct { keep {p.size p.active.as_a(bit),wpsize w.p.active.as_a(bit),...}.sum(it) < 1024; }

于 2015-04-27T13:01:16.330 に答える
-1
Keep %{mystruct.p.size, mystruct.q.p, ...}.count(it) < 1K
于 2015-04-27T08:08:13.773 に答える