fhdl: RenameClockDomains decorator

This commit is contained in:
Sebastien Bourdeauducq 2013-07-26 15:42:14 +02:00
parent cec8fc4ca4
commit 9c7ad6b05b
4 changed files with 19 additions and 21 deletions

View File

@ -1,5 +1,5 @@
from migen.fhdl.structure import * from migen.fhdl.structure import *
from migen.fhdl.tools import insert_reset from migen.fhdl.tools import insert_reset, rename_clock_domain
class ModuleDecorator: class ModuleDecorator:
def __init__(self, decorated): def __init__(self, decorated):
@ -78,3 +78,14 @@ class InsertReset(InsertControl):
def transform_fragment_insert(self, f, to_insert): def transform_fragment_insert(self, f, to_insert):
for reset, cdn in to_insert: for reset, cdn in to_insert:
f.sync[cdn] = insert_reset(reset, f.sync[cdn]) f.sync[cdn] = insert_reset(reset, f.sync[cdn])
class RenameClockDomains(ModuleDecorator):
def __init__(self, decorated, cd_remapping):
ModuleDecorator.__init__(self, decorated)
if isinstance(cd_remapping, str):
cd_remapping = {"sys": cd_remapping}
object.__setattr__(self, "_rc_cd_remapping", cd_remapping)
def transform_fragment(self, f):
for old, new in self._rc_cd_remapping.items():
rename_clock_domain(f, old, new)

View File

@ -68,11 +68,11 @@ class _ModuleSpecials(_ModuleProxy, _ModuleForwardAttr):
class _ModuleSubmodules(_ModuleProxy): class _ModuleSubmodules(_ModuleProxy):
def __setattr__(self, name, value): def __setattr__(self, name, value):
self._fm._submodules += [(name, e, dict()) for e in _flat_list(value)] self._fm._submodules += [(name, e) for e in _flat_list(value)]
setattr(self._fm, name, value) setattr(self._fm, name, value)
def __iadd__(self, other): def __iadd__(self, other):
self._fm._submodules += [(None, e, dict()) for e in _flat_list(other)] self._fm._submodules += [(None, e) for e in _flat_list(other)]
return self return self
class _ModuleClockDomains(_ModuleProxy, _ModuleForwardAttr): class _ModuleClockDomains(_ModuleProxy, _ModuleForwardAttr):
@ -131,20 +131,8 @@ class Module:
else: else:
object.__setattr__(self, name, value) object.__setattr__(self, name, value)
def add_submodule(self, submodule, cd_remapping=dict(), name=None):
if isinstance(cd_remapping, str):
cd_remapping = {"sys": cd_remapping}
if name is not None:
setattr(self, name, submodule)
self._submodules.append((name, submodule, cd_remapping))
def _collect_submodules(self): def _collect_submodules(self):
r = [] r = [(name, submodule.get_fragment()) for name, submodule in self._submodules]
for name, submodule, cd_remapping in self._submodules:
f = submodule.get_fragment()
for old, new in cd_remapping.items():
rename_clock_domain(f, old, new)
r.append((name, f))
self._submodules = [] self._submodules = []
return r return r

View File

@ -2,4 +2,4 @@ from migen.fhdl.structure import *
from migen.fhdl.module import Module from migen.fhdl.module import Module
from migen.fhdl.specials import TSTriple, Instance, Memory from migen.fhdl.specials import TSTriple, Instance, Memory
from migen.fhdl.size import log2_int, bits_for, flen from migen.fhdl.size import log2_int, bits_for, flen
from migen.fhdl.decorators import DecorateModule, InsertCE, InsertReset from migen.fhdl.decorators import DecorateModule, InsertCE, InsertReset, RenameClockDomains

View File

@ -88,10 +88,9 @@ class AsyncFIFO(Module, _FIFOInterface):
depth_bits = log2_int(depth, True) depth_bits = log2_int(depth, True)
produce = GrayCounter(depth_bits+1) produce = RenameClockDomains(GrayCounter(depth_bits+1), "write")
self.add_submodule(produce, "write") consume = RenameClockDomains(GrayCounter(depth_bits+1), "read")
consume = GrayCounter(depth_bits+1) self.submodules += produce, consume
self.add_submodule(consume, "read")
self.comb += [ self.comb += [
produce.ce.eq(self.writable & self.we), produce.ce.eq(self.writable & self.we),
consume.ce.eq(self.readable & self.re) consume.ce.eq(self.readable & self.re)