Re: [myhdl-list] [RFC/PATCH] constant driver support
Brought to you by:
jandecaluwe
From: Sébastien B. <seb...@mi...> - 2011-09-10 14:16:51
|
Sorry about the word-wrap damage, here is the patch again. diff -r e18493b5f0ad myhdl/_Waiter.py --- a/myhdl/_Waiter.py Fri May 20 21:07:24 2011 +0200 +++ b/myhdl/_Waiter.py Sat Sep 10 15:51:22 2011 +0200 @@ -107,7 +107,7 @@ elif isinstance(clause, join): waiters.append(_Waiter(clause._generator(), clone)) elif clause is None: - waiters.append(clone) + pass elif isinstance(clause, Exception): waiters.append(clone) if not exc: @@ -194,7 +194,17 @@ actives[id(wl)] = wl -_kind = enum("SIGNAL_TUPLE", "EDGE_TUPLE", "SIGNAL", "EDGE", "DELAY", "UNDEFINED") +class _InfiniteWaiter(_Waiter): + + __slots__ = ('generator') + + def __init__(self, generator): + self.generator = generator + + def next(self, waiters, actives, exc): + self.generator.next() + +_kind = enum("INFINITE", "SIGNAL_TUPLE", "EDGE_TUPLE", "SIGNAL", "EDGE", "DELAY", "UNDEFINED") def _inferWaiter(gen): @@ -207,6 +217,8 @@ # print ast.dump(root) v = _YieldVisitor(root) v.visit(root) + if v.kind == _kind.INFINITE: + return _InfiniteWaiter(gen) if v.kind == _kind.EDGE_TUPLE: return _EdgeTupleWaiter(gen) if v.kind == _kind.SIGNAL_TUPLE: @@ -265,7 +277,9 @@ def visit_Name(self, node): n = node.id node.kind = _kind.UNDEFINED - if n in self.root.symdict: + if n == "None": + node.kind = _kind.INFINITE + elif n in self.root.symdict: obj = self.root.symdict[n] if isinstance(obj, _Signal): node.kind = _kind.SIGNAL diff -r e18493b5f0ad myhdl/_always_comb.py --- a/myhdl/_always_comb.py Fri May 20 21:07:24 2011 +0200 +++ b/myhdl/_always_comb.py Sat Sep 10 15:51:22 2011 +0200 @@ -29,7 +29,7 @@ from myhdl._Signal import _Signal, _isListOfSigs from myhdl._util import _isGenFunc, _dedent from myhdl._cell_deref import _cell_deref -from myhdl._Waiter import _Waiter, _SignalWaiter, _SignalTupleWaiter +from myhdl._Waiter import _Waiter, _SignalWaiter, _SignalTupleWaiter, _InfiniteWaiter from myhdl._instance import _Instantiator class _error: @@ -39,7 +39,6 @@ _error.Scope = "always_comb argument should be a local function" _error.SignalAsInout = "signal (%s) used as inout in always_comb function argument" _error.EmbeddedFunction = "embedded functions in always_comb function argument not supported" -_error.EmptySensitivityList= "sensitivity list is empty" def always_comb(func): if not isinstance( func, FunctionType): @@ -200,8 +199,9 @@ self.senslist = tuple(senslist) self.gen = self.genfunc() if len(self.senslist) == 0: - raise AlwaysCombError(_error.EmptySensitivityList) - if len(self.senslist) == 1: + W = _InfiniteWaiter + self.senslist = None + elif len(self.senslist) == 1: W = _SignalWaiter else: W = _SignalTupleWaiter @@ -211,7 +211,7 @@ def genfunc(self): senslist = self.senslist - if len(senslist) == 1: + if (senslist != None) and (len(senslist) == 1): senslist = senslist[0] func = self.func while 1: diff -r e18493b5f0ad myhdl/conversion/_analyze.py --- a/myhdl/conversion/_analyze.py Fri May 20 21:07:24 2011 +0200 +++ b/myhdl/conversion/_analyze.py Sat Sep 10 15:51:22 2011 +0200 @@ -1042,6 +1042,8 @@ senslist = [n.obj] elif _isMem(n.obj): senslist = n.obj + elif n.obj is None: + pass else: self.raiseError(node, _error.UnsupportedYield) node.senslist = senslist diff -r e18493b5f0ad myhdl/conversion/_toVHDL.py --- a/myhdl/conversion/_toVHDL.py Fri May 20 21:07:24 2011 +0200 +++ b/myhdl/conversion/_toVHDL.py Sat Sep 10 15:51:22 2011 +0200 @@ -1354,17 +1354,18 @@ def visit_Yield(self, node): - self.write("wait ") + self.write("wait") yieldObj = self.getObj(node.value) - if isinstance(yieldObj, delay): - self.write("for ") - elif isinstance(yieldObj, _WaiterList): - self.write("until ") - else: - self.write("on ") - self.context = _context.YIELD - self.visit(node.value) - self.context = _context.UNKNOWN + if not yieldObj is None: + if isinstance(yieldObj, delay): + self.write(" for ") + elif isinstance(yieldObj, _WaiterList): + self.write(" until ") + else: + self.write(" on ") + self.context = _context.YIELD + self.visit(node.value) + self.context = _context.UNKNOWN self.write(";") diff -r e18493b5f0ad myhdl/conversion/_toVerilog.py --- a/myhdl/conversion/_toVerilog.py Fri May 20 21:07:24 2011 +0200 +++ b/myhdl/conversion/_toVerilog.py Sat Sep 10 15:51:22 2011 +0200 @@ -1176,7 +1176,6 @@ def visit_Yield(self, node): yieldObj = self.getObj(node.value) - assert node.senslist senslist = node.senslist if isinstance(yieldObj, delay): self.write("# ") @@ -1184,9 +1183,11 @@ self.visit(node.value) self.context = _context.UNKNOWN self.write(";") - else: + elif senslist: self.writeSensitivityList(senslist) self.write(";") + else: + self.write("wait(0);") |