fhdl.xfrm: implement DomainRenamer.
This commit is contained in:
parent
8963ab5d9f
commit
9bee90f1bd
6 changed files with 110 additions and 36 deletions
|
|
@ -573,7 +573,7 @@ class ClockSignal(Value):
|
|||
Parameters
|
||||
----------
|
||||
domain : str
|
||||
Clock domain to obtain a clock signal for. Defaults to `"sync"`.
|
||||
Clock domain to obtain a clock signal for. Defaults to ``"sync"``.
|
||||
"""
|
||||
def __init__(self, domain="sync"):
|
||||
super().__init__()
|
||||
|
|
@ -588,13 +588,13 @@ class ClockSignal(Value):
|
|||
class ResetSignal(Value):
|
||||
"""Reset signal for a given clock domain
|
||||
|
||||
`ResetSignal` s for a given clock domain can be retrieved multiple
|
||||
``ResetSignal`` s for a given clock domain can be retrieved multiple
|
||||
times. They all ultimately refer to the same signal.
|
||||
|
||||
Parameters
|
||||
----------
|
||||
domain : str
|
||||
Clock domain to obtain a reset signal for. Defaults to `"sync"`.
|
||||
Clock domain to obtain a reset signal for. Defaults to ``"sync"``.
|
||||
"""
|
||||
def __init__(self, domain="sync"):
|
||||
super().__init__()
|
||||
|
|
@ -603,7 +603,7 @@ class ResetSignal(Value):
|
|||
self.domain = domain
|
||||
|
||||
def __repr__(self):
|
||||
return "(reset {})".format(self.domain)
|
||||
return "(rst {})".format(self.domain)
|
||||
|
||||
|
||||
class _StatementList(list):
|
||||
|
|
|
|||
|
|
@ -4,7 +4,8 @@ from .ast import *
|
|||
from .ir import *
|
||||
|
||||
|
||||
__all__ = ["ValueTransformer", "StatementTransformer", "ResetInserter", "CEInserter"]
|
||||
__all__ = ["ValueTransformer", "StatementTransformer", "FragmentTransformer",
|
||||
"DomainRenamer", "ResetInserter", "CEInserter"]
|
||||
|
||||
|
||||
class ValueTransformer:
|
||||
|
|
@ -116,6 +117,30 @@ class FragmentTransformer:
|
|||
return self.on_fragment(value)
|
||||
|
||||
|
||||
class DomainRenamer(FragmentTransformer, ValueTransformer, StatementTransformer):
|
||||
def __init__(self, domains):
|
||||
if isinstance(domains, str):
|
||||
domains = {"sync": domains}
|
||||
self.domains = OrderedDict(domains)
|
||||
|
||||
def on_ClockSignal(self, value):
|
||||
if value.domain in self.domains:
|
||||
return ClockSignal(self.domains[value.domain])
|
||||
return value
|
||||
|
||||
def on_ResetSignal(self, value):
|
||||
if value.domain in self.domains:
|
||||
return ResetSignal(self.domains[value.domain])
|
||||
return value
|
||||
|
||||
def map_drivers(self, fragment, new_fragment):
|
||||
for cd_name, signals in fragment.iter_domains():
|
||||
if cd_name in self.domains:
|
||||
cd_name = self.domains[cd_name]
|
||||
for signal in signals:
|
||||
new_fragment.drive(signal, cd_name)
|
||||
|
||||
|
||||
class _ControlInserter(FragmentTransformer):
|
||||
def __init__(self, controls):
|
||||
if isinstance(controls, Value):
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue