def _propagate_domains(self, ensure_sync_exists):
self._propagate_domains_up()
if ensure_sync_exists and not self.domains:
- self.add_domains(ClockDomain("sync"))
+ cd_sync = ClockDomain()
+ self.add_domains(cd_sync)
+ new_domains = (cd_sync,)
+ else:
+ new_domains = ()
self._propagate_domains_down()
+ return new_domains
def _insert_domain_resets(self):
from .xfrm import ResetInserter
from .xfrm import SampleLowerer
fragment = SampleLowerer()(self)
- fragment._propagate_domains(ensure_sync_exists)
+ new_domains = fragment._propagate_domains(ensure_sync_exists)
fragment._resolve_hierarchy_conflicts()
fragment = fragment._insert_domain_resets()
fragment = fragment._lower_domain_signals()
if ports is None:
fragment._propagate_ports(ports=(), all_undef_as_ports=True)
else:
- fragment._propagate_ports(ports=ports, all_undef_as_ports=False)
+ new_ports = []
+ for cd in new_domains:
+ new_ports.append(cd.clk)
+ if cd.rst is not None:
+ new_ports.append(cd.rst)
+ fragment._propagate_ports(ports=(*ports, *new_ports), all_undef_as_ports=False)
return fragment
def test_prepare(self):
self.setUp_cpu()
f = self.inst.prepare()
- clk = f.domains["sync"].clk
+ sync_clk = f.domains["sync"].clk
self.assertEqual(f.ports, SignalDict([
- (clk, "i"),
+ (sync_clk, "i"),
(self.rst, "i"),
(self.pins, "io"),
]))
def test_prepare_explicit_ports(self):
self.setUp_cpu()
f = self.inst.prepare(ports=[self.rst, self.stb])
+ sync_clk = f.domains["sync"].clk
+ sync_rst = f.domains["sync"].rst
self.assertEqual(f.ports, SignalDict([
+ (sync_clk, "i"),
+ (sync_rst, "i"),
(self.rst, "i"),
(self.stb, "o"),
(self.pins, "io"),