2014-09-21 4 views
1

в моей среде проверки. У меня разные типы регистров с почти одинаковым именем, которое отличается только индексом, например: timer_load_0, timer_load_1 и т. Д. Я пытаюсь создать макрос, который получает 2 параметра: string («имя» регистр без его индекса) и uint (индекс регистра) и возвращает переменную типа «конкатенированный» тип. Например, я хотел бы, что команда:Specman DAC macro: Как определить 2 входа различного типа (uint и string)?

my_idx : uint = 0; 
create_reg "timer_load" my_idx; 

возвращает переменную timer_load_0.

Мой код макроса:

define <var_by_idx'action> "create_reg <name'any> <idx'exp>" as computed { 
    var idx : uint = <idx'exp>.as_a(uint); 
    result = appendf("%s_%d",<name'any>, idx); 
}; 

Ошибка компиляции я получаю:

Error: Looking for a number but found 'my_idx' 
       at line 45 in @macros 
    var idx : uint = <idx'exp>.as_a(uint); 
       during execution of a define-as-computed macro: 
       at line 380 in @timer_monitor 
      create_reg "timer_load" my_idx; 

Макрос не распознает my_idx, как uint переменная, а как string .. Спасибо за любую помощь ,

+1

Непонятно, что именно вы пытаетесь достичь этим макросом. В общем случае макрос ЦАП выполняется во время разбора (не во время выполнения), и обычно он должен возвращать некоторую строку, которая содержит некоторый юридический e-код, и который далее разбирается. В этом примере я не вижу, чтобы макрос возвращал любую строку. Не могли бы вы прояснить, что именно вы пытаетесь здесь сделать? Что ожидается во время выполнения? –

+1

Привет, Юрий, я отредактировал свой вопрос с исправлениями в соответствии с вашими заметками. – Halona

+1

Я думаю, что я получаю то, что вы хотите сделать здесь, из вопросов, которые вы задавали ранее. Вероятно, у вас есть одно и то же поле, определенное в обоих подтипах, и вам просто нужно сделать бросок, чтобы иметь доступ к нему. В этом случае вы можете использовать отражение, но, по-моему, это будет дорогостоящим с точки зрения производительности во время выполнения. –

ответ

2

Макрос, который делает то, что вы хотите, может передаваться только постоянным значением, поэтому вам нужно будет вернуться к <idx'num>.

Как упоминалось в Юрии, определите, как вычисляемые макросы расширяются во время компиляции. Это означает, что вашему макросу нужно получить постоянное значение для idx, чтобы узнать, какой тип переменной выделить для вашего created_reg. Значение переменной idx, которую вы хотите передать макросу, устанавливается только во время выполнения, что слишком поздно.

+1

Привет, Tudor, я отредактировал вопрос, и я исправил код с помощью as_a (uint), но у меня все еще есть ошибка компиляции. – Halona

+1

@Halona Я просто понял, что то, что вы хотите, невозможно, потому что вам нужно знать на время компиляции, какой подтип вам нужен (TIMER_LOAD_0 или TIMER_LOAD_1). Вы не можете использовать переменную для этого. –

+0

Даже если макрос использовался с константой (например, «create_reg» timer_load «1»), до сих пор неясно, каков ожидаемый результат. Макрос объявляется как , но 'timer_load_1' не является действием. Итак, что он должен делать на самом деле? Объявить поле? Объявить локальную переменную? Что-нибудь еще? –