hdl.ir: typecheck convert(ports=)
more carefully.
The `ports` argument to the `convert` functions is a frequent hotspot of beginner issues. Check to make sure it is either a list or a tuple, and give an appropriately helpful error message if not. Fixes #362.
This commit is contained in:
parent
fd7f69f7a5
commit
f2b4584b34
|
@ -532,6 +532,12 @@ class Fragment:
|
||||||
if ports is None:
|
if ports is None:
|
||||||
fragment._propagate_ports(ports=(), all_undef_as_ports=True)
|
fragment._propagate_ports(ports=(), all_undef_as_ports=True)
|
||||||
else:
|
else:
|
||||||
|
if not isinstance(ports, tuple) and not isinstance(ports, list):
|
||||||
|
msg = "`ports` must be either a list or a tuple, not {!r}"\
|
||||||
|
.format(ports)
|
||||||
|
if isinstance(ports, Value):
|
||||||
|
msg += " (did you mean `ports=(<signal>,)`, rather than `ports=<signal>`?)"
|
||||||
|
raise TypeError(msg)
|
||||||
mapped_ports = []
|
mapped_ports = []
|
||||||
# Lower late bound signals like ClockSignal() to ports.
|
# Lower late bound signals like ClockSignal() to ports.
|
||||||
port_lowerer = DomainLowerer(fragment.domains)
|
port_lowerer = DomainLowerer(fragment.domains)
|
||||||
|
|
|
@ -304,6 +304,16 @@ class FragmentPortsTestCase(FHDLTestCase):
|
||||||
msg="Only signals may be added as ports, not (const 1'd1)"):
|
msg="Only signals may be added as ports, not (const 1'd1)"):
|
||||||
f.prepare(ports=(Const(1),))
|
f.prepare(ports=(Const(1),))
|
||||||
|
|
||||||
|
def test_port_not_iterable(self):
|
||||||
|
f = Fragment()
|
||||||
|
with self.assertRaises(TypeError,
|
||||||
|
msg="`ports` must be either a list or a tuple, not 1"):
|
||||||
|
f.prepare(ports=1)
|
||||||
|
with self.assertRaises(TypeError,
|
||||||
|
msg="`ports` must be either a list or a tuple, not (const 1'd1)" +
|
||||||
|
" (did you mean `ports=(<signal>,)`, rather than `ports=<signal>`?)"):
|
||||||
|
f.prepare(ports=Const(1))
|
||||||
|
|
||||||
class FragmentDomainsTestCase(FHDLTestCase):
|
class FragmentDomainsTestCase(FHDLTestCase):
|
||||||
def test_iter_signals(self):
|
def test_iter_signals(self):
|
||||||
cd1 = ClockDomain()
|
cd1 = ClockDomain()
|
||||||
|
|
Loading…
Reference in a new issue