From: whitequark Date: Sat, 3 Aug 2019 15:31:00 +0000 (+0000) Subject: hdl.ir: raise DomainError if a domain is used but not defined. X-Git-Tag: locally_working~61 X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=fc846532c7090687f6de32c8c36f1d805c291c30;p=nmigen.git hdl.ir: raise DomainError if a domain is used but not defined. Before this commit, a KeyError would be raised elsewhere in guts of hdl.ir, which is not helpful. --- diff --git a/nmigen/hdl/ir.py b/nmigen/hdl/ir.py index 805c31c..578509e 100644 --- a/nmigen/hdl/ir.py +++ b/nmigen/hdl/ir.py @@ -351,19 +351,24 @@ class Fragment: subfrag._propagate_domains_down() - def _propagate_domains(self, missing_domain): + def _create_missing_domains(self, missing_domain): from .xfrm import DomainCollector - self._propagate_domains_up() new_domains = [] for domain_name in DomainCollector()(self): if domain_name is None: continue if domain_name not in self.domains: domain = missing_domain(domain_name) - if domain is not None: - self.add_domains(domain) - new_domains.append(domain) + if domain is None: + raise DomainError("Domain '{}' is used but not defined".format(domain_name)) + self.add_domains(domain) + new_domains.append(domain) + return new_domains + + def _propagate_domains(self, missing_domain): + self._propagate_domains_up() + new_domains = self._create_missing_domains(missing_domain) self._propagate_domains_down() return new_domains diff --git a/nmigen/test/test_hdl_ir.py b/nmigen/test/test_hdl_ir.py index f8efd8c..60c0189 100644 --- a/nmigen/test/test_hdl_ir.py +++ b/nmigen/test/test_hdl_ir.py @@ -380,6 +380,15 @@ class FragmentDomainsTestCase(FHDLTestCase): self.assertEqual(f1.domains, {"cd": cd}) self.assertEqual(f2.domains, {"cd": cd}) + def test_propagate_missing(self): + s1 = Signal() + f1 = Fragment() + f1.add_driver(s1, "sync") + + with self.assertRaises(DomainError, + msg="Domain 'sync' is used but not defined"): + f1._propagate_domains(missing_domain=lambda name: None) + def test_propagate_create_missing(self): s1 = Signal() f1 = Fragment()