如何编写宏来生成列表项

时间:2014-07-22 14:36:42

标签: specman

我有一个结构列表,结构有一个字段来定义它的类型(假设它的名字)。 我想有一个宏如下:

MYKEEP <name>.<field> <ANY KEEP>;

将被翻译为:

keep value(mylist.has(it.name == <name>)) => mylist.first(it.name == <name>).<field> <ANY KEEP>

是否可以在没有&#34; as计算&#34;宏?

2 个答案:

答案 0 :(得分:0)

看起来你想得到一个结构列表作为输入,检查一些的值 struct的字段,然后为不同的struct字段分配一个常量值 根据那个价值。

将表现考虑在内,这种&#39; Injective&#39;两个领域之间的关系应该 是在进行代码而不是生成。 (最有可能在post_generate()中)。

考虑使用如下所示的定义宏:

 define <name_induced_field'struct_member>  "MYKEEP <name'exp> <field'exp> <ANY_KEEP'exp>" as{

post_generate() is also{
    for each in l{
        if (it.t==<name'exp>){
            it.<field'exp> = <ANY_KEEP'exp>;
        };
    };

};
};

然后在代码中使用它:

type mytype: [AA,BB];

struct s {

t:mytype;
!i:int;

};

extend sys{

MYKEEP AA i 1;
MYKEEP BB i 2;

l:list of s;
keep l.size()==5;
};

注意:如果struct字段在其他情况下与其名称具有相同的关系,请考虑 可能会在结构中限制字段,例如:

 define <name_induced_field'struct_member>  "MYKEEP <name'exp> <field'exp> <ANY_KEEP'exp>" as{
keep value(t==<name'exp>) => (<field'exp>==<ANY_KEEP'exp>);
};

type mytype: [AA,BB];

struct s {

MYKEEP AA i 1;
MYKEEP BB i 2;

t:mytype;
i:int;

post_generate() is also{
print me;
};
};

答案 1 :(得分:0)

任务代码对我没有帮助,因为这些字段可能会影响其他代的生成时间。 我想找到一个似乎有用的宏:

define <ana_packet_gen_con_keep1'exp>   "KEEP_CON [(<WORD>soft) ]<type'exp>\.<field'any> <exp>" as {
    keep for each (con) in it.containers {
        <WORD> (con.con_type==<type'exp>) => con.as_a(<type'exp>'con_type ana_container).<field'any> <exp>;
    };
};

有几个&#34;保持每个&#34;影响表现太多了?