mirror of
https://github.com/enjoy-digital/litex.git
synced 2025-01-04 09:52:26 -05:00
fhdl/autofragment: bugfixes + add auto_attr
This commit is contained in:
parent
cc8118d35c
commit
bb5ee8d3bd
1 changed files with 27 additions and 7 deletions
|
@ -1,6 +1,7 @@
|
||||||
import inspect
|
import inspect
|
||||||
|
|
||||||
from migen.fhdl.structure import *
|
from migen.fhdl.structure import *
|
||||||
|
from migen.fhdl.specials import Special
|
||||||
|
|
||||||
def from_local():
|
def from_local():
|
||||||
f = Fragment()
|
f = Fragment()
|
||||||
|
@ -38,7 +39,7 @@ def _cd_append(d, key, statements):
|
||||||
l = []
|
l = []
|
||||||
d[key] = l
|
d[key] = l
|
||||||
if isinstance(statements, (list, tuple)):
|
if isinstance(statements, (list, tuple)):
|
||||||
l += other
|
l += statements
|
||||||
else:
|
else:
|
||||||
l.append(statements)
|
l.append(statements)
|
||||||
|
|
||||||
|
@ -71,15 +72,32 @@ class _FModuleSpecials(_FModuleProxy):
|
||||||
self._fm._fragment.specials.add(other)
|
self._fm._fragment.specials.add(other)
|
||||||
return self
|
return self
|
||||||
|
|
||||||
|
class _FModuleSubmodules(_FModuleProxy):
|
||||||
|
def __iadd__(self, other):
|
||||||
|
if isinstance(other, (list, tuple)):
|
||||||
|
self._fm._submodules += other
|
||||||
|
else:
|
||||||
|
self._fm._submodules.append(other)
|
||||||
|
return self
|
||||||
|
|
||||||
class FModule:
|
class FModule:
|
||||||
def do_simulation(self, s):
|
auto_attr = True
|
||||||
pass
|
|
||||||
|
|
||||||
def get_fragment(self):
|
def get_fragment(self):
|
||||||
assert(not hasattr(self, "_fragment"))
|
assert(not hasattr(self, "_fragment"))
|
||||||
self._fragment = Fragment(sim=[self.do_simulation])
|
self._fragment = Fragment()
|
||||||
|
self._submodules = []
|
||||||
self.build_fragment()
|
self.build_fragment()
|
||||||
self._fragment += from_attributes(self)
|
if hasattr(self, "do_simulation"):
|
||||||
|
self._fragment.sim.append(self.do_simulation)
|
||||||
|
for submodule in self._submodules:
|
||||||
|
f += submodule.get_fragment()
|
||||||
|
if self.auto_attr:
|
||||||
|
for x in self.__dict__.values():
|
||||||
|
if isinstance(x, Special):
|
||||||
|
self._fragment.specials.add(x)
|
||||||
|
elif hasattr(x, "get_fragment"):
|
||||||
|
self._fragment += x.get_fragment()
|
||||||
return self._fragment
|
return self._fragment
|
||||||
|
|
||||||
def __getattr__(self, name):
|
def __getattr__(self, name):
|
||||||
|
@ -89,11 +107,13 @@ class FModule:
|
||||||
return _FModuleSync(self)
|
return _FModuleSync(self)
|
||||||
elif name == "specials":
|
elif name == "specials":
|
||||||
return _FModuleSpecials(self)
|
return _FModuleSpecials(self)
|
||||||
|
elif name == "submodules":
|
||||||
|
return _FModuleSubmodules(self)
|
||||||
else:
|
else:
|
||||||
raise AttributeError
|
raise AttributeError("'"+self.__class__.__name__+"' object has no attribute '"+name+"'")
|
||||||
|
|
||||||
def __setattr__(self, name, value):
|
def __setattr__(self, name, value):
|
||||||
if name in ["comb", "sync", "specials"]:
|
if name in ["comb", "sync", "specials", "submodules"]:
|
||||||
if not isinstance(value, _FModuleProxy):
|
if not isinstance(value, _FModuleProxy):
|
||||||
raise AttributeError("Attempted to assign special FModule property - use += instead")
|
raise AttributeError("Attempted to assign special FModule property - use += instead")
|
||||||
else:
|
else:
|
||||||
|
|
Loading…
Reference in a new issue