def test_bits_value_hex(self): self.assertEqual(value_from_string('bits[3]:0x7'), Value.make_ubits(bit_count=3, value=7)) self.assertEqual(value_from_string('bits[1]:0x1'), Value.make_ubits(bit_count=1, value=1)) self.assertEqual(value_from_string('bits[1]:0x0'), Value.make_ubits(bit_count=1, value=0)) self.assertEqual(value_from_string('bits[8]:0xff'), Value.make_ubits(bit_count=8, value=0xff)) self.assertEqual(value_from_string('u8:0xff'), Value.make_ubits(bit_count=8, value=0xff))
def test_tuple_values(self): self.assertEqual( value_from_string('(bits[8]:0xff, bits[2]:0x1)'), Value.make_tuple(( Value.make_ubits(bit_count=8, value=0xff), Value.make_ubits(bit_count=2, value=1), ))) self.assertEqual(value_from_string('()'), Value.make_tuple(())) # Tuple of single element. want = Value.make_tuple((Value.make_ubits(bit_count=2, value=1),)) got = value_from_string('(bits[2]:0x1,)') self.assertEqual(want, got) with self.assertRaises(ValueParseError) as cm: value_from_string('(,)') self.assertIn('Unexpected token in value', str(cm.exception))
def test_array_values(self): self.assertEqual( value_from_string('[(u8:0xff, u2:0x1), (u8:0, u2:3)]'), Value.make_array(( Value.make_tuple(( Value.make_ubits(bit_count=8, value=0xff), Value.make_ubits(bit_count=2, value=1), )), Value.make_tuple(( Value.make_ubits(bit_count=8, value=0x0), Value.make_ubits(bit_count=2, value=3), )), )))
def ir_value_to_interpreter_value(value: ir_value_mod.Value) -> Value: """Converts an IR Value to an interpreter Value.""" if value.is_bits(): if value.get_bits().bit_count() <= 64: return Value.make_bits(Tag.UBITS, value.get_bits()) else: # For wide values which do not fit in 64 bits, parse value as as string. return value_from_string(value.to_str(FormatPreference.HEX)) elif value.is_array(): return Value.make_array( tuple(ir_value_to_interpreter_value(e) for e in value.get_elements())) else: assert value.is_tuple() return Value.make_tuple( tuple(ir_value_to_interpreter_value(e) for e in value.get_elements()))
def parse_args(args_text: Text) -> Args: """Parses a semicolon-delimited list of values. Example input: bits[32]:6; (bits[8]:2, bits[16]:4) Returns bits values are always unsigned. Args: args_text: Text to parse. Returns: List of parsed Values, """ return tuple( value_parser.value_from_string(a) for a in args_text.split(';') if a.strip())