Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse files

fhdl/autofragment: FModule

  • Loading branch information...
commit cc8118d35cd0fdb11ee7c1840dc727884968f6c5 1 parent d249182
Sébastien Bourdeauducq sbourdeauducq authored
Showing with 83 additions and 0 deletions.
  1. +83 −0 migen/fhdl/autofragment.py
83 migen/fhdl/autofragment.py
View
@@ -18,3 +18,86 @@ def from_attributes(obj):
if hasattr(x, "get_fragment"):
f += x.get_fragment()
return f
+
+class _FModuleProxy:
+ def __init__(self, fm):
+ object.__setattr__(self, "_fm", fm)
+
+class _FModuleComb(_FModuleProxy):
+ def __iadd__(self, other):
+ if isinstance(other, (list, tuple)):
+ self._fm._fragment.comb += other
+ else:
+ self._fm._fragment.comb.append(other)
+ return self
+
+def _cd_append(d, key, statements):
+ try:
+ l = d[key]
+ except KeyError:
+ l = []
+ d[key] = l
+ if isinstance(statements, (list, tuple)):
+ l += other
+ else:
+ l.append(statements)
+
+class _FModuleSyncCD:
+ def __init__(self, fm, cd):
+ self._fm = fm
+ self._cd = cd
+
+ def __iadd__(self, other):
+ _cd_append(self._fm._fragment.sync, self._cd, other)
+ return self
+
+class _FModuleSync(_FModuleProxy):
+ def __iadd__(self, other):
+ _cd_append(self._fm._fragment.sync, "sys", other)
+ return self
+
+ def __getattr__(self, name):
+ return _FModuleSyncCD(self._fm, name)
+
+ def __setattr__(self, name, value):
+ if not isinstance(value, _FModuleSyncCD):
+ raise AttributeError("Attempted to assign sync property - use += instead")
+
+class _FModuleSpecials(_FModuleProxy):
+ def __iadd__(self, other):
+ if isinstance(other, (set, list, tuple)):
+ self._fm._fragment.specials |= set(other)
+ else:
+ self._fm._fragment.specials.add(other)
+ return self
+
+class FModule:
+ def do_simulation(self, s):
+ pass
+
+ def get_fragment(self):
+ assert(not hasattr(self, "_fragment"))
+ self._fragment = Fragment(sim=[self.do_simulation])
+ self.build_fragment()
+ self._fragment += from_attributes(self)
+ return self._fragment
+
+ def __getattr__(self, name):
+ if name == "comb":
+ return _FModuleComb(self)
+ elif name == "sync":
+ return _FModuleSync(self)
+ elif name == "specials":
+ return _FModuleSpecials(self)
+ else:
+ raise AttributeError
+
+ def __setattr__(self, name, value):
+ if name in ["comb", "sync", "specials"]:
+ if not isinstance(value, _FModuleProxy):
+ raise AttributeError("Attempted to assign special FModule property - use += instead")
+ else:
+ object.__setattr__(self, name, value)
+
+ def build_fragment(self):
+ raise NotImplementedError("FModule.build_fragment needs to be overloaded")
Please sign in to comment.
Something went wrong with that request. Please try again.