2013-05-22 5 views
1

Я хочу иметь файл, который импортирует два других файла. Первый импортированный файл фактически создает второй файл, который должен быть импортирован, и поэтому должен выполняться сразу после импорта. Возможно ли это в Specman? Я думал, что прочитал в одном из руководств, что есть определенные встроенные функции, которые запускаются сразу после загрузки файла.Specman Import-file-time генерация другого файла для импорта

Далее следует, что я предполагаю, что этот первый файл может использовать Specman Reflection для доступа к другим ранее импортированным структурам/единицам, чтобы решить, что создавать. Более подробная информация об использовании 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; 
'> 

ответ

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

Однако, версия 10 из Specman не нравится оператор импорта внутри #ifdef, несмотря на то, что является примером #ifdef использования в Specman 6.1 документации:

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; 

EDIT

С другой стороны, вы, вероятно, просто хотите получить define as computed, который будет генерировать код, который будет анализироваться на месте, не пропуская проблемы с созданием нового файла.