代码之家  ›  专栏  ›  技术社区  ›  Ross Rogers

在Specman中,为什么代码体的宏标签返回垃圾?

  •  1
  • Ross Rogers  · 技术社区  · 14 年前

    类似于这个帖子 http://feedproxy.google.com/~r/cadence/community/blogs/fv/~3/IvdCIla8_Es/extending-multiple-when-subtypes-simultaneously.aspx

    我想做一个宏,当Specman遇到子类型和继承问题时,它会循环展开来解决一些问题。

    我从以下几点开始:

    -- macros.e
    <'
    define <FOREACH_UNROLL'action> "FOREACH_UNROLL (<UNROLLEES>\[<unrollee'name>,...\]) (<STATEMENTS>{<statement>;...})" as computed {
       print <UNROLLEES>;
       print str_split(<UNROLLEES>,"/ *, */");
       for each in str_split(<UNROLLEES>,"/ *, */") {
          out(it.as_a(string));
          var statements := str_replace( <STATEMENTS>,"\"REPLACE_ME\"",it);
          result =appendf("%s %s;",result,statements);
       };
    };
    '>
    
    
    -- main.e
    <'
    import macros.e
    extend sys {
       run() is also {
          FOREACH_UNROLL [baz,foo,bar] {
             out("REPLACE_ME");
             out("part2","REPLACE_ME");
          };
       };
    };
    '>
    

    specman -c 'load $HOME/main; test'
    Welcome to Specman Elite(64) (08.20.007-s)  -  Linked on Tue Dec 15 17:07:26
    2009
    
    Protected by U.S. Patents 6,141,630 ;6,182,258; 6,219,809; 6,347,388;
    6,487,704; 6,499,132; 6,502,232; 6,519,727; 6,530,054; 6,675,138; 6,684,359;
    6,687,662; 6,907,599; 6,918,076; 6,920,583; Other Patents Pending.
    
    0 notifications were modified by command 'set notify -severity=WARNING
    DEPR_START_TCM_ARG_BY_REF'
    Checking license ... OK
    Loading macros.e   (imported by main.e) ...
    read...parse...update...patch...h code...code...clean...
    Loading /nfs/pdx/home/rbroger1/main.e ...
    read...parse...  <UNROLLEES> = "[35]"
      str_split(<UNROLLEES>,"/ *, */") =
    0.      "[35]"
    [35]
    update...patch...h code...code...clean...
    Doing setup ...
    Generating the test using seed 1...
    
    Starting the test ...
    Running the test ...
    REPLACE_ME
    part2REPLACE_ME
    No actual running requested.
    Checking the test ...
    Checking is complete - 0 DUT errors, 0 DUT warnings.
    

    如果你看看 <UNROLLEES> :

    <UNROLLEES> = "[35]"
    

    <展开> 给我 [35] # ,所以我不知道为什么我会得到一个35。。。

    另外,我知道宏是来自魔鬼,但我认为代码复制更糟。我必须这么做,因为斯派克曼不是真的多态。

    1 回复  |  直到 14 年前
        1
  •  0
  •   Ross Rogers    14 年前

    结果我需要使用这个函数 str_expand_dots 在我的Specman版本(8.2)中。

    以下是修改后的宏。e:

    define <FOREACH_UNROLL'action> "FOREACH_UNROLL (<UNROLLEES>\[<unrollee'name>,...\]) (<STATEMENTS>{<statement>;...})" as computed {
       -- print str_expand_dots(<UNROLLEES>);
       --print str_expand_dots(<STATEMENTS>);
       -- print str_split(str_expand_dots(<UNROLLEES>),"/ *, */");
       for each  in str_split(str_expand_dots(<UNROLLEES>),"/ *, */") {
          var unrollee := str_replace(it, "[","");
          unrollee = str_replace(unrollee, "]","");
          --out(unrollee);
          var statements := str_replace( str_expand_dots(<STATEMENTS>),"\"REPLACE_ME\"",unrollee);
          result =appendf("%s %s;",result,statements);
       };
    };
    

    修改的main.e:

    import macros;
    extend sys {
       run() is also {
          FOREACH_UNROLL ["baz","foo","bar"] {
             out("REPLACE_ME");
             out("part2","REPLACE_ME");
             if "REPLACE_ME" == "baz" {
                out("found baz");
             };
          };
       };
    };
    

    以及输出:

    Welcome to Specman Elite(64) (08.20.007-s)  -  Linked on Tue Dec 15 17:07:26
    2009
    
    Protected by U.S. Patents 6,141,630 ;6,182,258; 6,219,809; 6,347,388;
    6,487,704; 6,499,132; 6,502,232; 6,519,727; 6,530,054; 6,675,138; 6,684,359;
    6,687,662; 6,907,599; 6,918,076; 6,920,583; Other Patents Pending.
    
    0 notifications were modified by command 'set notify -severity=WARNING
    DEPR_START_TCM_ARG_BY_REF'
    Checking license ... OK
    Loading /nfs/pdx/home/rbroger1/macros.e   (imported by main.e) ...
    read...parse...update...patch...h code...code...clean...
    Loading /nfs/pdx/home/rbroger1/main.e ...
    read...parse...update...patch...h code...code...clean...
    Doing setup ...
    Generating the test using seed 1...
    
    Starting the test ...
    Running the test ...
    baz
    part2baz
    found baz
    foo
    part2foo
    bar
    part2bar
    No actual running requested.
    Checking the test ...
    Checking is complete - 0 DUT errors, 0 DUT warnings.