Fix missing error message if multiple unconditional field assignments are inferred. #93
This commit is contained in:
@@ -9,6 +9,7 @@ from ..struct_generator import RDLStructGenerator
|
||||
from ..forloop_generator import RDLForLoopGenerator
|
||||
from ..utils import get_indexed_path, clog2
|
||||
from ..identifier_filter import kw_filter as kwf
|
||||
from .bases import NextStateUnconditional
|
||||
|
||||
if TYPE_CHECKING:
|
||||
from . import FieldLogic
|
||||
@@ -117,6 +118,7 @@ class FieldLogicGenerator(RDLForLoopGenerator):
|
||||
)
|
||||
self.intr_fields = [] # type: List[FieldNode]
|
||||
self.halt_fields = [] # type: List[FieldNode]
|
||||
self.msg = self.ds.top_node.env.msg
|
||||
|
||||
|
||||
def enter_AddressableComponent(self, node: 'AddressableNode') -> Optional[WalkerAction]:
|
||||
@@ -212,14 +214,21 @@ class FieldLogicGenerator(RDLForLoopGenerator):
|
||||
def generate_field_storage(self, node: 'FieldNode') -> None:
|
||||
conditionals = self.field_logic.get_conditionals(node)
|
||||
extra_combo_signals = OrderedDict()
|
||||
unconditional = None
|
||||
unconditional: Optional[NextStateUnconditional] = None
|
||||
new_conditionals = []
|
||||
for conditional in conditionals:
|
||||
for signal in conditional.get_extra_combo_signals(node):
|
||||
extra_combo_signals[signal.name] = signal
|
||||
|
||||
if conditional.is_unconditional:
|
||||
assert unconditional is None # Can only have one unconditional assignment per field
|
||||
if isinstance(conditional, NextStateUnconditional):
|
||||
if unconditional is not None:
|
||||
# Too inconvenient to validate this early. Easier to validate here in-place generically
|
||||
self.msg.fatal(
|
||||
"Field has multiple conflicting properties that unconditionally set its state:\n"
|
||||
f" * {conditional.unconditional_explanation}\n"
|
||||
f" * {unconditional.unconditional_explanation}",
|
||||
node.inst.inst_src_ref
|
||||
)
|
||||
unconditional = conditional
|
||||
else:
|
||||
new_conditionals.append(conditional)
|
||||
|
||||
Reference in New Issue
Block a user