Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
fhdl/autofragment: bugfixes + add auto_attr
  • Loading branch information
Sebastien Bourdeauducq committed Mar 3, 2013
1 parent cc8118d commit bb5ee8d
Showing 1 changed file with 27 additions and 7 deletions.
34 changes: 27 additions & 7 deletions migen/fhdl/autofragment.py
@@ -1,6 +1,7 @@
import inspect

from migen.fhdl.structure import *
from migen.fhdl.specials import Special

def from_local():
f = Fragment()
Expand Down Expand Up @@ -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)

Expand Down Expand Up @@ -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):
Expand All @@ -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:
Expand Down

0 comments on commit bb5ee8d

Please sign in to comment.