Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse files

fhdl/autofragment: bugfixes + add auto_attr

  • Loading branch information...
commit bb5ee8d3bd9755bb8c0e608db21038f0b776a719 1 parent cc8118d
Sébastien Bourdeauducq sbourdeauducq authored
Showing with 27 additions and 7 deletions.
  1. +27 −7 migen/fhdl/autofragment.py
34 migen/fhdl/autofragment.py
View
@@ -1,6 +1,7 @@
import inspect
from migen.fhdl.structure import *
+from migen.fhdl.specials import Special
def from_local():
f = Fragment()
@@ -38,7 +39,7 @@ def _cd_append(d, key, statements):
l = []
d[key] = l
if isinstance(statements, (list, tuple)):
- l += other
+ l += statements
else:
l.append(statements)
@@ -71,15 +72,32 @@ def __iadd__(self, other):
self._fm._fragment.specials.add(other)
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:
- def do_simulation(self, s):
- pass
+ auto_attr = True
def get_fragment(self):
assert(not hasattr(self, "_fragment"))
- self._fragment = Fragment(sim=[self.do_simulation])
+ self._fragment = Fragment()
+ self._submodules = []
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
def __getattr__(self, name):
@@ -89,11 +107,13 @@ def __getattr__(self, name):
return _FModuleSync(self)
elif name == "specials":
return _FModuleSpecials(self)
+ elif name == "submodules":
+ return _FModuleSubmodules(self)
else:
- raise AttributeError
+ raise AttributeError("'"+self.__class__.__name__+"' object has no attribute '"+name+"'")
def __setattr__(self, name, value):
- if name in ["comb", "sync", "specials"]:
+ if name in ["comb", "sync", "specials", "submodules"]:
if not isinstance(value, _FModuleProxy):
raise AttributeError("Attempted to assign special FModule property - use += instead")
else:
Please sign in to comment.
Something went wrong with that request. Please try again.