En Specman, ¿por qué es mi macro etiqueta para el cuerpo de código de regresar de basura?

StackOverflow https://stackoverflow.com/questions/3774300

  •  04-10-2019
  •  | 
  •  

Pregunta

Al igual que en este post http://feedproxy.google.com/~r/cadence/community/blogs/fv/~3/IvdCIla8_Es/extending-multiple-when-subtypes-simultaneously.aspx

Quiero hacer una macro que hace bucle desenrollado de moverse cuando algunos de los-subtipificación y problemas de herencia Specman tiene.

he empezado con:

-- 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");
      };
   };
};
'>

Cuando ejecuto esto, me sale:

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.

Si nos fijamos en la copia impresa de <UNROLLEES>:

<UNROLLEES> = "[35]"

¿Por qué no me quiere <UNROLLEES> [35] en lugar del cuerpo dentro de las llaves? 35 es el valor ASCII para #, así que estoy en una pérdida por eso me gustaría conseguir un 35 ...

P.S. Soy consciente de macros son del diablo, pero creo que la copia de código es peor. Tengo que hacer esto porque no es realmente Specman polimórfica.

¿Fue útil?

Solución

Resulta que necesitaba usar el str_expand_dots función en mi versión de Specman (8.2).

Esta es la macros.e modificado:

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 Modificado:

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

Y la salida:

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.
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top