Pygears — неразрешенный аргумент массива при создании экземпляра компонента

#python #pygears

#python #pygears

Вопрос:

Я пытаюсь реализовать и смоделировать простой компонент сумматора, который удваивает входное значение. Ниже приведен мой код.

 from pygears.typing import Uint
from pygears.hdl import *
from pygears.sim import sim
from pygears.lib import drv

@gear
def add(x):
    return x   x
    
    
@gear
async def collect(din, result):
    async with din as val:
        result.append(val)
    
    
result = []
drv(t=Uint[16], seq=[0, 1, 2, 3]) | add() | collect(result=result)

hdlgen('/adder', outdir='sv/adder_svlib')

sim('/adder')

  

После попытки запустить этот код я получаю следующую ошибку:

  File "test.py", line 34, in <module>
    drv(t=Uint[16], seq=[0, 1, 2, 3]) | add() | collect(result=result)
GearArgsNotSpecified: [0], Unresolved argument "[]" connected to the input "result"
 - when instantiating "collect"
  

Почему этот аргумент неразрешен? Я видел аналогичную реализацию в примере «echo», где в функции wav_echo_sim пустой массив был передан в механизм сбора, чтобы сохранить значения.

Заранее благодарю вас.

Ответ №1:

Существует два типа аргументов передачи (функции), которые различаются в PyGears:

  • интерфейсы — которые могут быть указаны с использованием либо позиционных, либо ключевых (именованных) аргументов, и
  • параметры времени компиляции, которые должны быть объявлены только как ключевые слова

В вашем примере collect механизм ожидает список Python для result аргумента, но result аргумент не объявлен как только для ключевых слов, поэтому PyGears ожидает получить там интерфейс, отсюда и сообщение об ошибке. Ваш механизм должен быть объявлен следующим образом (обратите внимание на звездочку ‘*’ между двумя аргументами):

 @gear
async def collect(din, *, result):
    async with din as val:
        result.append(val)
  

Другими словами, интерфейсы и неинтерфейсные аргументы должны быть разделены звездочкой ‘*’.

Далее, ваш вызов hdlgen не будет работать, поскольку нет такого экземпляра gear с именем «сумматор». Я предполагаю, что вы хотели сгенерировать файлы HDL для экземпляра add gear. По умолчанию экземпляры получают то же имя, что и функция определения передач, поэтому в вашем случае экземпляр будет называться «add». Вы можете либо явно указать имя экземпляра следующим образом:

 drv(t=Uint[16], seq=[0, 1, 2, 3]) | add(name="adder") | collect(result=result)
  

или измените путь hdlgen , указанный для:

 hdlgen('/add', outdir='sv/adder_svlib')
  

Наконец, первым аргументом для sim вызова является путь к каталогу, в который должны быть помещены артефакты моделирования (например, формы сигналов, сгенерированные файлы HDL, журналы …), Поэтому вам следует либо»

  • оставьте его пустым — в этом случае будет использоваться временная папка или
  • укажите допустимый абсолютный или относительный путь