Skip to content

Commit

Permalink
fhdl/autofragment: bugfixes + add auto_attr
Browse files Browse the repository at this point in the history
Sebastien Bourdeauducq committed Mar 3, 2013

Verified

This commit was created on GitHub.com and signed with GitHub’s verified signature.
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
Original file line number Diff line number Diff line change
@@ -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:

0 comments on commit bb5ee8d

Please sign in to comment.