Specman导入文件时生成要导入的另一个文件

时间:2013-05-22 20:41:42

标签: specman

我想要一个导入两个其他文件的文件。第一个导入的文件实际上创建了要导入的第二个文件,因此必须在导入后立即执行。这在Specman有可能吗?我以为我在其中一本手册中读到,在加载文件后会立即运行某些内置函数。

接下来是我假设第一个文件可以使用Specman的Reflection来访问其他先前导入的结构/单元来决定生成什么。 有关使用反射的更多信息:StackOverflow - Using Reflection in Specman

示例:

File1.e:
<'
  // Function that runs immediately after this file is loaded
  // and generates File2.e
  on_load???(){
    ...
  };
'>

File2.e:
<'
// This file was generated by File1.e
'>

top.e:
<'
import File1;
import File2;
'>

1 个答案:

答案 0 :(得分:2)

这几乎可行,但看起来新版本的specman不允许#ifdef围绕导入..如果你能算出ifdef用法,那么这将有效......

               top.e
       +--------/| \----------+
      /          |             \
macro.e    macro_call.e     generated_loader.e
                                 |
                             generated.e

top.e有:

<'
import macro;
import macro_call;
import generated_loader;
'>

macro.e有:

<'
define <GENERATOR'statement> "GENERATOR" as computed {
    compute system("printf \"<'\\nextend sys{run() is first { print \\\"in generated.e\\\"; }; };\\n'>\\n\">generated.e");
};
#define ENABLE_GENERATOR_LOADER 1;
'>

macro_call.e有:

<'
GENERATOR;
'>

generated_loader.e有:

<'
#ifdef ENABLE_GENERATOR_LOADER {
import generated.e;
};
'>

然后generated.eGENERATOR宏运行后应该有以下内容:

<'
extend sys{run() is first { print "in generated.e"; }; };
'>

然而,Specman的第10版不喜欢#ifdef中的import语句,即使这是Specman 6.1文档中#ifdef用法的一个例子:

specman -c 'load top; test'

的产率:

[...]
Loading generated_loader.e   (imported by top.e) ...
read...parse...update...
   *** Error: Import Statements should be placed at the top of the file -
please change the statements order, pay attention to the imported module
'generated.e'.
                at line 4 in generated_loader.e
import generated.e;

修改

第二个想法,你可能只想要define as computed,它会生成要解析的代码,而无需经历生成新文件的麻烦。