我想要一个导入两个其他文件的文件。第一个导入的文件实际上创建了要导入的第二个文件,因此必须在导入后立即执行。这在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;
'>
答案 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.e
在GENERATOR
宏运行后应该有以下内容:
<'
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
,它会生成要解析的代码,而无需经历生成新文件的麻烦。