hdl.xfrm: Add Assert and Assume abstract methods for StatementVisitor, implement for children.
This commit is contained in:
parent
2412650f56
commit
f77dc40256
|
@ -297,6 +297,12 @@ class _StatementCompiler(StatementVisitor):
|
||||||
lhs(state, normalize(rhs(state), shape))
|
lhs(state, normalize(rhs(state), shape))
|
||||||
return run
|
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):
|
def on_Switch(self, stmt):
|
||||||
test = self.rrhs_compiler(stmt.test)
|
test = self.rrhs_compiler(stmt.test)
|
||||||
cases = []
|
cases = []
|
||||||
|
|
|
@ -141,6 +141,14 @@ class StatementVisitor(metaclass=ABCMeta):
|
||||||
def on_Assign(self, stmt):
|
def on_Assign(self, stmt):
|
||||||
pass # :nocov:
|
pass # :nocov:
|
||||||
|
|
||||||
|
@abstractmethod
|
||||||
|
def on_Assert(self, stmt):
|
||||||
|
pass # :nocov:
|
||||||
|
|
||||||
|
@abstractmethod
|
||||||
|
def on_Assume(self, stmt):
|
||||||
|
pass # :nocov:
|
||||||
|
|
||||||
@abstractmethod
|
@abstractmethod
|
||||||
def on_Switch(self, stmt):
|
def on_Switch(self, stmt):
|
||||||
pass # :nocov:
|
pass # :nocov:
|
||||||
|
@ -155,6 +163,10 @@ class StatementVisitor(metaclass=ABCMeta):
|
||||||
def on_statement(self, stmt):
|
def on_statement(self, stmt):
|
||||||
if type(stmt) is Assign:
|
if type(stmt) is Assign:
|
||||||
return self.on_Assign(stmt)
|
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):
|
elif isinstance(stmt, Switch):
|
||||||
# Uses `isinstance()` and not `type() is` because nmigen.compat requires it.
|
# Uses `isinstance()` and not `type() is` because nmigen.compat requires it.
|
||||||
return self.on_Switch(stmt)
|
return self.on_Switch(stmt)
|
||||||
|
@ -174,6 +186,12 @@ class StatementTransformer(StatementVisitor):
|
||||||
def on_Assign(self, stmt):
|
def on_Assign(self, stmt):
|
||||||
return Assign(self.on_value(stmt.lhs), self.on_value(stmt.rhs))
|
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):
|
def on_Switch(self, stmt):
|
||||||
cases = OrderedDict((k, self.on_statement(s)) for k, s 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)
|
return Switch(self.on_value(stmt.test), cases)
|
||||||
|
@ -294,6 +312,10 @@ class SwitchCleaner(StatementVisitor):
|
||||||
def on_Assign(self, stmt):
|
def on_Assign(self, stmt):
|
||||||
return stmt
|
return stmt
|
||||||
|
|
||||||
|
on_Assert = on_Assign
|
||||||
|
|
||||||
|
on_Assume = on_Assign
|
||||||
|
|
||||||
def on_Switch(self, stmt):
|
def on_Switch(self, stmt):
|
||||||
cases = OrderedDict((k, self.on_statement(s)) for k, s in stmt.cases.items())
|
cases = OrderedDict((k, self.on_statement(s)) for k, s in stmt.cases.items())
|
||||||
if any(len(s) for s in cases.values()):
|
if any(len(s) for s in cases.values()):
|
||||||
|
@ -338,6 +360,10 @@ class LHSGroupAnalyzer(StatementVisitor):
|
||||||
def on_Assign(self, stmt):
|
def on_Assign(self, stmt):
|
||||||
self.unify(*stmt._lhs_signals())
|
self.unify(*stmt._lhs_signals())
|
||||||
|
|
||||||
|
on_Assert = on_Assign
|
||||||
|
|
||||||
|
on_Assume = on_Assign
|
||||||
|
|
||||||
def on_Switch(self, stmt):
|
def on_Switch(self, stmt):
|
||||||
for case_stmts in stmt.cases.values():
|
for case_stmts in stmt.cases.values():
|
||||||
self.on_statements(case_stmts)
|
self.on_statements(case_stmts)
|
||||||
|
@ -362,6 +388,13 @@ class LHSGroupFilter(SwitchCleaner):
|
||||||
if any_lhs_signal in self.signals:
|
if any_lhs_signal in self.signals:
|
||||||
return stmt
|
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):
|
class _ControlInserter(FragmentTransformer):
|
||||||
def __init__(self, controls):
|
def __init__(self, controls):
|
||||||
|
|
Loading…
Reference in a new issue