---
 migen/fhdl/tools.py   | 43 ++++++++++++++++++++++++++++++++++++++++++-
 migen/fhdl/verilog.py | 46 ++--------------------------------------------
 migen/sim/core.py     |  9 ++++++++-
 3 files changed, 52 insertions(+), 46 deletions(-)

diff --git a/migen/fhdl/tools.py b/migen/fhdl/tools.py
index ddc135c..1ad4646 100644
--- a/migen/fhdl/tools.py
+++ b/migen/fhdl/tools.py
@@ -1,5 +1,5 @@
 from migen.fhdl.structure import *
-from migen.fhdl.structure import _Slice, _Assign
+from migen.fhdl.structure import _Slice, _Assign, _Fragment
 from migen.fhdl.visit import NodeVisitor, NodeTransformer
 from migen.fhdl.bitcontainer import value_bits_sign
 from migen.util.misc import flat_iteration
@@ -296,3 +296,44 @@ def rename_clock_domain(f, old, new):
         pass
     else:
         cd.rename(new)
+
+
+def call_special_classmethod(overrides, obj, method, *args, **kwargs):
+    cl = obj.__class__
+    if cl in overrides:
+        cl = overrides[cl]
+    if hasattr(cl, method):
+        return getattr(cl, method)(obj, *args, **kwargs)
+    else:
+        return None
+
+
+def _lower_specials_step(overrides, specials):
+    f = _Fragment()
+    lowered_specials = set()
+    for special in sorted(specials, key=lambda x: x.duid):
+        impl = call_special_classmethod(overrides, special, "lower")
+        if impl is not None:
+            f += impl.get_fragment()
+            lowered_specials.add(special)
+    return f, lowered_specials
+
+
+def _can_lower(overrides, specials):
+    for special in specials:
+        cl = special.__class__
+        if cl in overrides:
+            cl = overrides[cl]
+        if hasattr(cl, "lower"):
+            return True
+    return False
+
+
+def lower_specials(overrides, specials):
+    f, lowered_specials = _lower_specials_step(overrides, specials)
+    while _can_lower(overrides, f.specials):
+        f2, lowered_specials2 = _lower_specials_step(overrides, f.specials)
+        f += f2
+        lowered_specials |= lowered_specials2
+        f.specials -= lowered_specials2
+    return f, lowered_specials
diff --git a/migen/fhdl/verilog.py b/migen/fhdl/verilog.py
index 19bba1f..747a752 100644
--- a/migen/fhdl/verilog.py
+++ b/migen/fhdl/verilog.py
@@ -5,7 +5,6 @@ import collections
 from migen.fhdl.structure import *
 from migen.fhdl.structure import _Operator, _Slice, _Assign, _Fragment
 from migen.fhdl.tools import *
-from migen.fhdl.bitcontainer import bits_for
 from migen.fhdl.namer import build_namespace
 from migen.fhdl.conv_output import ConvOutput
 
@@ -262,51 +261,10 @@ def _printsync(f, ns):
     return r
 
 
-def _call_special_classmethod(overrides, obj, method, *args, **kwargs):
-    cl = obj.__class__
-    if cl in overrides:
-        cl = overrides[cl]
-    if hasattr(cl, method):
-        return getattr(cl, method)(obj, *args, **kwargs)
-    else:
-        return None
-
-
-def _lower_specials_step(overrides, specials):
-    f = _Fragment()
-    lowered_specials = set()
-    for special in sorted(specials, key=lambda x: x.duid):
-        impl = _call_special_classmethod(overrides, special, "lower")
-        if impl is not None:
-            f += impl.get_fragment()
-            lowered_specials.add(special)
-    return f, lowered_specials
-
-
-def _can_lower(overrides, specials):
-    for special in specials:
-        cl = special.__class__
-        if cl in overrides:
-            cl = overrides[cl]
-        if hasattr(cl, "lower"):
-            return True
-    return False
-
-
-def _lower_specials(overrides, specials):
-    f, lowered_specials = _lower_specials_step(overrides, specials)
-    while _can_lower(overrides, f.specials):
-        f2, lowered_specials2 = _lower_specials_step(overrides, f.specials)
-        f += f2
-        lowered_specials |= lowered_specials2
-        f.specials -= lowered_specials2
-    return f, lowered_specials
-
-
 def _printspecials(overrides, specials, ns, add_data_file):
     r = ""
     for special in sorted(specials, key=lambda x: x.duid):
-        pr = _call_special_classmethod(overrides, special, "emit_verilog", ns, 
add_data_file)
+        pr = call_special_classmethod(overrides, special, "emit_verilog", ns, 
add_data_file)
         if pr is None:
             raise NotImplementedError("Special " + str(special) + " failed to 
implement emit_verilog")
         r += pr
@@ -337,7 +295,7 @@ def convert(f, ios=None, name="top",
     f = lower_complex_slices(f)
     insert_resets(f)
     f = lower_basics(f)
-    fs, lowered_specials = _lower_specials(special_overrides, f.specials)
+    fs, lowered_specials = lower_specials(special_overrides, f.specials)
     f += lower_basics(fs)
 
     ns = build_namespace(list_signals(f) \
diff --git a/migen/sim/core.py b/migen/sim/core.py
index 0418984..eec7dfe 100644
--- a/migen/sim/core.py
+++ b/migen/sim/core.py
@@ -2,13 +2,14 @@ import operator
 import collections
 import inspect
 from functools import wraps
+from warnings import warn
 
 from migen.fhdl.structure import *
 from migen.fhdl.structure import (_Value, _Statement,
                                   _Operator, _Slice, _ArrayProxy,
                                   _Assign, _Fragment)
 from migen.fhdl.bitcontainer import value_bits_sign
-from migen.fhdl.tools import list_targets, insert_resets
+from migen.fhdl.tools import list_targets, insert_resets, lower_specials
 from migen.fhdl.simplify import MemoryToArray
 from migen.fhdl.specials import _MemoryLocation
 from migen.sim.vcd import VCDWriter, DummyVCDWriter
@@ -222,6 +223,12 @@ class Simulator:
             self.fragment = fragment_or_module
         else:
             self.fragment = fragment_or_module.get_fragment()
+        fs, lowered = lower_specials(overrides={}, 
specials=self.fragment.specials)
+        self.fragment += fs
+        self.fragment.specials -= lowered
+        if self.fragment.specials:
+            warn("Could not lower all specials", self.fragment.specials)
+
         if not isinstance(generators, dict):
             generators = {"sys": generators}
         self.generators = dict()
-- 
1.9.1

_______________________________________________
M-Labs devel mailing list
https://ssl.serverraum.org/lists/listinfo/devel

Reply via email to