hdl.ir: warn if .elaborate() returns None.

Fixes #164.
This commit is contained in:
whitequark 2019-08-03 12:30:39 +00:00
parent 995e4adb8c
commit 29fee01f86
2 changed files with 18 additions and 0 deletions

View file

@ -52,10 +52,12 @@ class DriverConflict(UserWarning):
class Fragment:
@staticmethod
def get(obj, platform):
code = None
while True:
if isinstance(obj, Fragment):
return obj
elif isinstance(obj, Elaboratable):
code = obj.elaborate.__code__
obj._Elaboratable__used = True
obj = obj.elaborate(platform)
elif hasattr(obj, "elaborate"):
@ -65,9 +67,16 @@ class Fragment:
.format(type(obj)),
category=RuntimeWarning,
stacklevel=2)
code = obj.elaborate.__code__
obj = obj.elaborate(platform)
else:
raise AttributeError("Object '{!r}' cannot be elaborated".format(obj))
if obj is None and code is not None:
warnings.warn_explicit(
message=".elaborate() returned None; missing return statement?",
category=UserWarning,
filename=code.co_filename,
lineno=code.co_firstlineno)
def __init__(self):
self.ports = SignalDict()

View file

@ -7,12 +7,21 @@ from ..hdl.mem import *
from .tools import *
class BadElaboratable(Elaboratable):
def elaborate(self, platform):
return
class FragmentGetTestCase(FHDLTestCase):
def test_get_wrong(self):
with self.assertRaises(AttributeError,
msg="Object 'None' cannot be elaborated"):
Fragment.get(None, platform=None)
with self.assertRaises(AttributeError,
msg="Object 'None' cannot be elaborated"):
Fragment.get(BadElaboratable(), platform=None)
class FragmentGeneratedTestCase(FHDLTestCase):
def test_find_subfragment(self):