hdl.xfrm: lower resets in DomainLowerer as well.
Changed in preparation for introducing local clock domains. Also makes elaboration about 15% faster.
This commit is contained in:
parent
404f99f022
commit
69d36dc139
|
@ -386,12 +386,6 @@ class Fragment:
|
||||||
self._propagate_domains_down()
|
self._propagate_domains_down()
|
||||||
return new_domains
|
return new_domains
|
||||||
|
|
||||||
def _insert_domain_resets(self):
|
|
||||||
from .xfrm import ResetInserter
|
|
||||||
|
|
||||||
resets = {cd.name: cd.rst for cd in self.domains.values() if cd.rst is not None}
|
|
||||||
return ResetInserter(resets)(self)
|
|
||||||
|
|
||||||
def _lower_domain_signals(self):
|
def _lower_domain_signals(self):
|
||||||
from .xfrm import DomainLowerer
|
from .xfrm import DomainLowerer
|
||||||
|
|
||||||
|
@ -543,7 +537,6 @@ class Fragment:
|
||||||
fragment = SampleLowerer()(self)
|
fragment = SampleLowerer()(self)
|
||||||
new_domains = fragment._propagate_domains(missing_domain)
|
new_domains = fragment._propagate_domains(missing_domain)
|
||||||
fragment._resolve_hierarchy_conflicts()
|
fragment._resolve_hierarchy_conflicts()
|
||||||
fragment = fragment._insert_domain_resets()
|
|
||||||
fragment = fragment._lower_domain_signals()
|
fragment = fragment._lower_domain_signals()
|
||||||
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)
|
||||||
|
|
|
@ -488,22 +488,34 @@ class DomainLowerer(FragmentTransformer, ValueTransformer, StatementTransformer)
|
||||||
return not isinstance(value, (ClockSignal, ResetSignal))
|
return not isinstance(value, (ClockSignal, ResetSignal))
|
||||||
|
|
||||||
def on_ClockSignal(self, value):
|
def on_ClockSignal(self, value):
|
||||||
cd = self._resolve(value.domain, value)
|
domain = self._resolve(value.domain, value)
|
||||||
return cd.clk
|
return domain.clk
|
||||||
|
|
||||||
def on_ResetSignal(self, value):
|
def on_ResetSignal(self, value):
|
||||||
cd = self._resolve(value.domain, value)
|
domain = self._resolve(value.domain, value)
|
||||||
if cd.rst is None:
|
if domain.rst is None:
|
||||||
if value.allow_reset_less:
|
if value.allow_reset_less:
|
||||||
return Const(0)
|
return Const(0)
|
||||||
else:
|
else:
|
||||||
raise DomainError("Signal {!r} refers to reset of reset-less domain '{}'"
|
raise DomainError("Signal {!r} refers to reset of reset-less domain '{}'"
|
||||||
.format(value, value.domain))
|
.format(value, value.domain))
|
||||||
return cd.rst
|
return domain.rst
|
||||||
|
|
||||||
|
def _insert_resets(self, fragment):
|
||||||
|
for domain_name, signals in fragment.drivers.items():
|
||||||
|
if domain_name is None:
|
||||||
|
continue
|
||||||
|
domain = fragment.domains[domain_name]
|
||||||
|
if domain.rst is None:
|
||||||
|
continue
|
||||||
|
stmts = [signal.eq(Const(signal.reset, signal.nbits))
|
||||||
|
for signal in signals if not signal.reset_less]
|
||||||
|
fragment.add_statements(Switch(domain.rst, {1: stmts}))
|
||||||
|
|
||||||
def on_fragment(self, fragment):
|
def on_fragment(self, fragment):
|
||||||
self.domains = fragment.domains
|
self.domains = fragment.domains
|
||||||
new_fragment = super().on_fragment(fragment)
|
new_fragment = super().on_fragment(fragment)
|
||||||
|
self._insert_resets(new_fragment)
|
||||||
return new_fragment
|
return new_fragment
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -150,9 +150,10 @@ class DomainLowererTestCase(FHDLTestCase):
|
||||||
""")
|
""")
|
||||||
|
|
||||||
def test_lower_drivers(self):
|
def test_lower_drivers(self):
|
||||||
|
sync = ClockDomain()
|
||||||
pix = ClockDomain()
|
pix = ClockDomain()
|
||||||
f = Fragment()
|
f = Fragment()
|
||||||
f.add_domains(pix)
|
f.add_domains(sync, pix)
|
||||||
f.add_driver(ClockSignal("pix"), None)
|
f.add_driver(ClockSignal("pix"), None)
|
||||||
f.add_driver(ResetSignal("pix"), "sync")
|
f.add_driver(ResetSignal("pix"), "sync")
|
||||||
|
|
||||||
|
@ -597,6 +598,7 @@ class UserValueTestCase(FHDLTestCase):
|
||||||
def test_lower(self):
|
def test_lower(self):
|
||||||
sync = ClockDomain()
|
sync = ClockDomain()
|
||||||
f = Fragment()
|
f = Fragment()
|
||||||
|
f.add_domains(sync)
|
||||||
f.add_statements(
|
f.add_statements(
|
||||||
self.uv.eq(1)
|
self.uv.eq(1)
|
||||||
)
|
)
|
||||||
|
@ -611,5 +613,8 @@ class UserValueTestCase(FHDLTestCase):
|
||||||
(switch (sig c)
|
(switch (sig c)
|
||||||
(case 1 (eq (sig s) (const 1'd0)))
|
(case 1 (eq (sig s) (const 1'd0)))
|
||||||
)
|
)
|
||||||
|
(switch (sig rst)
|
||||||
|
(case 1 (eq (sig s) (const 1'd0)))
|
||||||
|
)
|
||||||
)
|
)
|
||||||
""")
|
""")
|
||||||
|
|
Loading…
Reference in a new issue