1

この投稿と同様 http://feedproxy.google.com/~r/cadence/community/blogs/fv/~3/IvdCIla8_Es/extending-multiple-when-subtypes-simultaneously.aspx

Specman が持つ when-subtyping と継承の問題のいくつかを回避するために、ループ展開を行うマクロを作成したいと考えています。

私は始めました:

-- 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]"

中括弧内の体の代わりに<UNROLLEES>私を与えるのはなぜですか? [35]35 は のアスキー値な#ので、なぜ 35 になるのか途方に暮れています...

PSマクロは悪魔のものだと思いますが、コードのコピーはもっと悪いと思います。Specman は実際にはポリモーフィックではないため、これを行う必要があります。

4

1 に答える 1

0

str_expand_dots自分のバージョンの Specman (8.2) で関数を使用する必要があることがわかりました。

変更された macros.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.
于 2010-09-23T17:28:56.227 に答える