hdl.xfrm: Add Assert and Assume abstract methods for StatementVisitor, implement for children.

This commit is contained in:
William D. Jones 2018-12-30 05:17:39 -05:00 committed by whitequark
parent 2412650f56
commit f77dc40256
2 changed files with 39 additions and 0 deletions

View file

@ -297,6 +297,12 @@ class _StatementCompiler(StatementVisitor):
lhs(state, normalize(rhs(state), shape))
return run
def on_Assert(self, stmt):
raise NotImplementedError("Asserts not yet implemented for Simulator backend.") # :nocov:
def on_Assume(self, stmt):
pass # :nocov:
def on_Switch(self, stmt):
test = self.rrhs_compiler(stmt.test)
cases = []

View file

@ -141,6 +141,14 @@ class StatementVisitor(metaclass=ABCMeta):
def on_Assign(self, stmt):
pass # :nocov:
@abstractmethod
def on_Assert(self, stmt):
pass # :nocov:
@abstractmethod
def on_Assume(self, stmt):
pass # :nocov:
@abstractmethod
def on_Switch(self, stmt):
pass # :nocov:
@ -155,6 +163,10 @@ class StatementVisitor(metaclass=ABCMeta):
def on_statement(self, stmt):
if type(stmt) is Assign:
return self.on_Assign(stmt)
elif type(stmt) is Assert:
return self.on_Assert(stmt)
elif type(stmt) is Assume:
return self.on_Assume(stmt)
elif isinstance(stmt, Switch):
# Uses `isinstance()` and not `type() is` because nmigen.compat requires it.
return self.on_Switch(stmt)
@ -174,6 +186,12 @@ class StatementTransformer(StatementVisitor):
def on_Assign(self, stmt):
return Assign(self.on_value(stmt.lhs), self.on_value(stmt.rhs))
def on_Assert(self, stmt):
return Assert(self.on_value(stmt.test), _check=stmt._check, _en=stmt._en)
def on_Assume(self, stmt):
return Assume(self.on_value(stmt.test), _check=stmt._check, _en=stmt._en)
def on_Switch(self, stmt):
cases = OrderedDict((k, self.on_statement(s)) for k, s in stmt.cases.items())
return Switch(self.on_value(stmt.test), cases)
@ -294,6 +312,10 @@ class SwitchCleaner(StatementVisitor):
def on_Assign(self, stmt):
return stmt
on_Assert = on_Assign
on_Assume = on_Assign
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 cases.values()):
@ -338,6 +360,10 @@ class LHSGroupAnalyzer(StatementVisitor):
def on_Assign(self, stmt):
self.unify(*stmt._lhs_signals())
on_Assert = on_Assign
on_Assume = on_Assign
def on_Switch(self, stmt):
for case_stmts in stmt.cases.values():
self.on_statements(case_stmts)
@ -362,6 +388,13 @@ class LHSGroupFilter(SwitchCleaner):
if any_lhs_signal in self.signals:
return stmt
def on_Assert(self, stmt):
any_lhs_signal = next(iter(stmt._lhs_signals()))
if any_lhs_signal in self.signals:
return stmt
on_Assume = on_Assert
class _ControlInserter(FragmentTransformer):
def __init__(self, controls):