MyHDL使用yield
语句来传达的,当其中一人是True
,将恢复发电机的运行条件的列表。例如,当时钟从低电平转换到高电平(0到1)时,发生器可能产生条件clock.posedge
- 当时钟发生此转换时,发生器将恢复。
为了模拟(大致)是如何工作的,在这里是一个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
而不是raising StopIteration
。
var conds
指向包含条件的tuple。在这种情况下,它指向包含由process
返回的2 lambda anonymous functions的tuple。
语法:
if any(cond(i) for cond in conds):
conds = next(gen)
调用any
built-in function,传递一个generator expression其循环遍历conds
和评估if cond(i) is True
。它是写作的简写:
for cond in conds:
if cond(i):
conds = next(gen)
break
@samplebias:非常感谢您回复......但是请您在下面的代码中解释以下内容:1)conds = next(gen)意味着conds = gen.next()..对吗? 2)你能解释一下“cond cond in conds”是什么意思...... conds不是我能解释的列表。那么我们如何迭代它呢?非常感谢! – Adwaitvedant 2011-05-19 08:33:28
@samplebias:谢谢你的回复!..忽略我最后的帖子...我仔细检查了你的例子,并正确理解它!但是我仍然没有得到答案...在Python中我们必须明确地调用next(conds )当我们想再次调用函数...在myhdl那不是这种情况....当yield语句中的对象“回火”时,它会自动触发自己(这是他们在文档中说过的)。这是如何实施的? – Adwaitvedant 2011-05-19 15:51:31
@Adwait我相信他们正在使用Python代码来生成其行为不同的HDL。将一些[MyHDL Python源代码](http://www.myhdl.org/doku.php/cookbook:sinecomp#design)与相应的[生成的Verilog代码](http://www.myhdl.org/doku.php) /食谱:sinecomp#automatic_conversion_to_verilog)。请注意'yield clock.posedge'如何创建'always(..)'指令。 – samplebias 2011-05-19 16:10:13