back.rtlil: only translate switch tests once.
authorwhitequark <whitequark@whitequark.org>
Sun, 23 Dec 2018 07:17:33 +0000 (07:17 +0000)
committerwhitequark <whitequark@whitequark.org>
Sun, 23 Dec 2018 07:17:52 +0000 (07:17 +0000)
This seems to affect synthesis with Yosys but only marginally.
It is mostly a speed and readability improvement.

nmigen/back/rtlil.py

index 2c2f1ad4bf416c1f136e648fc7ee7407554cfcc3..817f9b2135b0060adad4f7e6ce53315e9895deb4 100644 (file)
@@ -529,6 +529,8 @@ class _StatementCompiler(xfrm.StatementVisitor):
         self._group = None
         self._case  = None
 
+        self._test_cache = {}
+
     @contextmanager
     def case(self, switch, value):
         try:
@@ -556,7 +558,11 @@ class _StatementCompiler(xfrm.StatementVisitor):
         self._case.assign(self.lhs_compiler(stmt.lhs), rhs_sigspec)
 
     def on_Switch(self, stmt):
-        with self._case.switch(self.rhs_compiler(stmt.test)) as switch:
+        if stmt not in self._test_cache:
+            self._test_cache[stmt] = self.rhs_compiler(stmt.test)
+        test_sigspec = self._test_cache[stmt]
+
+        with self._case.switch(test_sigspec) as switch:
             for value, stmts in stmt.cases.items():
                 with self.case(switch, value):
                     self.on_statements(stmts)