hdl: track domain renames in IR.

Co-authored-by: Wanda <wanda@phinode.net>
This commit is contained in:
Catherine 2024-04-29 14:09:47 +00:00
parent f637530093
commit 5e59189c2b
3 changed files with 64 additions and 0 deletions

View file

@ -71,6 +71,7 @@ class Fragment:
self.src_loc = src_loc
self.origins = None
self.domains_propagated_up = {}
self.domain_renames = {}
def add_domains(self, *domains):
for domain in flatten(domains):
@ -655,6 +656,19 @@ class Design:
subfragment_name = _add_name(frag_info.assigned_names, subfragment_name)
self._assign_names(subfragment, hierarchy=(*hierarchy, subfragment_name))
def lookup_domain(self, domain, context):
if domain == "comb":
raise KeyError("comb")
if context is not None:
try:
fragment = self.elaboratables[context]
except KeyError:
raise ValueError(f"Elaboratable {context!r} is not a part of the design")
else:
fragment = self.fragment
domain = fragment.domain_renames.get(domain, domain)
return fragment.domains[domain]
############################################################################################### >:3

View file

@ -252,6 +252,9 @@ class FragmentTransformer:
for domain, statements in fragment.statements.items():
new_fragment.add_statements(domain, statements)
def map_domain_renames(self, fragment, new_fragment):
new_fragment.domain_renames = dict(fragment.domain_renames)
def map_memory_ports(self, fragment, new_fragment):
if hasattr(self, "on_value"):
for port in new_fragment._read_ports:
@ -318,6 +321,7 @@ class FragmentTransformer:
self.map_subfragments(fragment, new_fragment)
self.map_domains(fragment, new_fragment)
self.map_statements(fragment, new_fragment)
self.map_domain_renames(fragment, new_fragment)
return new_fragment
def __call__(self, value, *, src_loc_at=0):
@ -513,6 +517,15 @@ class DomainRenamer(FragmentTransformer, ValueTransformer, StatementTransformer)
map(self.on_statement, statements)
)
def map_domain_renames(self, fragment, new_fragment):
new_fragment.domain_renames = {
src: self.domain_map.get(dst, dst)
for src, dst in fragment.domain_renames.items()
}
for src, dst in self.domain_map.items():
if src not in new_fragment.domain_renames:
new_fragment.domain_renames[src] = dst
def map_memory_ports(self, fragment, new_fragment):
super().map_memory_ports(fragment, new_fragment)
for port in new_fragment._read_ports: