MyHDL использует оператор yield
для передачи списка условий, которые, когда одним из них является True
, возобновят выполнение генератора.Например, генератор может выдать условие clock.posedge
, когда часы переходят от низкого к высокому (от 0 до 1) - когда часы делают этот переход, генератор будет возобновлен.
Для имитации (примерно)как это работает, вот генератор Python, который возобновляется, когда выполняется одно из его условий (аргумент делится на 3 или 7):
def process():
j = 0
while True:
yield (lambda x: x % 3 == 0, lambda x: x % 7 == 0)
j += 1
print 'process j=', j
gen = process()
conds = next(gen)
for i in range(1, 11):
print 'i=', i
if any(cond(i) for cond in conds):
conds = next(gen)
Вывод:
i= 1
i= 2
i= 3
process j= 1
i= 4
i= 5
i= 6
process j= 2
i= 7
process j= 3
i= 8
i= 9
process j= 4
i= 10
Обновление - Немного подробнее о некоторых из используемых мной синтаксисов:
Я склонен использовать функцию [next(gen, [default])
], поскольку она немного более гибкая, чем вызов gen.next()
.Например, если вы передадите аргумент default
, когда генератор будет исчерпан, он вернет default
вместо повышения StopIteration
.
переменная conds
указывает на кортеж , содержащий условия.В этом случае выше он указывает на кортеж , содержащий 2 лямбда-анонимных функций , возвращаемых process
.
Синтаксис:
if any(cond(i) for cond in conds):
conds = next(gen)
Вызывает встроенную функцию any
, передавая ей выражение генератора , которое зацикливается на conds
и оценивает if cond(i) is True
.Это сокращение для записи:
for cond in conds:
if cond(i):
conds = next(gen)
break