if isinstance(value, str) and len(value) != len(switch_data["test"]):
raise SyntaxError("Case value '{}' must have the same width as test (which is {})"
.format(value, len(switch_data["test"])))
+ omit_case = False
if isinstance(value, int) and bits_for(value) > len(switch_data["test"]):
warnings.warn("Case value '{:b}' is wider than test (which has width {}); "
- "comparison will be made against truncated value"
+ "comparison will never be true"
.format(value, len(switch_data["test"])), SyntaxWarning, stacklevel=3)
- value &= (1 << len(switch_data["test"])) - 1
+ omit_case = True
try:
_outer_case, self._statements = self._statements, []
self._ctrl_context = None
yield
self._flush_ctrl()
- switch_data["cases"][value] = self._statements
+ if not omit_case:
+ switch_data["cases"][value] = self._statements
finally:
self._ctrl_context = "Switch"
self._statements = _outer_case
pass
with self.assertWarns(SyntaxWarning,
msg="Case value '10110' is wider than test (which has width 4); comparison "
- "will be made against truncated value"):
+ "will never be true"):
with m.Case(0b10110):
pass
self.assertRepr(m._statements, """
(
- (switch (sig w1)
- (case 0110 )
- )
+ (switch (sig w1) )
)
""")
class FHDLTestCase(unittest.TestCase):
def assertRepr(self, obj, repr_str):
obj = Statement.wrap(obj)
- repr_str = re.sub(r"\s+", " ", repr_str)
- repr_str = re.sub(r"\( (?=\()", "(", repr_str)
- repr_str = re.sub(r"\) (?=\))", ")", repr_str)
- self.assertEqual(repr(obj), repr_str.strip())
+ def prepare_repr(repr_str):
+ repr_str = re.sub(r"\s+", " ", repr_str)
+ repr_str = re.sub(r"\( (?=\()", "(", repr_str)
+ repr_str = re.sub(r"\) (?=\))", ")", repr_str)
+ return repr_str.strip()
+ self.assertEqual(prepare_repr(repr(obj)), prepare_repr(repr_str))
@contextmanager
def assertRaises(self, exception, msg=None):