hdl.xfrm: implement SwitchCleaner, for pruning empty switches.

This commit is contained in:
whitequark 2018-12-24 02:02:59 +00:00
parent fc0fb9d89f
commit 1c7c75a254
3 changed files with 45 additions and 3 deletions

View file

@ -13,7 +13,7 @@ __all__ = ["ValueVisitor", "ValueTransformer",
"StatementVisitor", "StatementTransformer",
"FragmentTransformer",
"DomainRenamer", "DomainLowerer",
"LHSGroupAnalyzer",
"SwitchCleaner", "LHSGroupAnalyzer",
"ResetInserter", "CEInserter"]
@ -165,7 +165,7 @@ class StatementTransformer(StatementVisitor):
return Assign(self.on_value(stmt.lhs), self.on_value(stmt.rhs))
def on_Switch(self, stmt):
cases = OrderedDict((k, self.on_statement(v)) for k, v in stmt.cases.items())
cases = OrderedDict((k, self.on_statement(s)) for k, s in stmt.cases.items())
return Switch(self.on_value(stmt.test), cases)
def on_statements(self, stmts):
@ -280,6 +280,20 @@ class DomainLowerer(FragmentTransformer, ValueTransformer, StatementTransformer)
return cd.rst
class SwitchCleaner(StatementVisitor):
def on_Assign(self, stmt):
return stmt
def on_Switch(self, stmt):
cases = OrderedDict((k, self.on_statement(s)) for k, s in stmt.cases.items())
if any(len(s) for s in stmt.cases.values()):
return Switch(stmt.test, cases)
def on_statements(self, stmts):
stmts = flatten(self.on_statement(stmt) for stmt in stmts)
return _StatementList(stmt for stmt in stmts if stmt is not None)
class LHSGroupAnalyzer(StatementVisitor):
def __init__(self):
self.signals = SignalDict()