From 09ded52aea6d89e438e759e702f430db3f60620e Mon Sep 17 00:00:00 2001 From: whitequark Date: Sat, 3 Aug 2019 15:31:00 +0000 Subject: [PATCH] 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. --- nmigen/hdl/ir.py | 15 ++++++++++----- nmigen/test/test_hdl_ir.py | 9 +++++++++ 2 files changed, 19 insertions(+), 5 deletions(-) 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() -- 2.30.2