blob: ab2b8e0e23900d31714077e20e717cb71707a756 [file] [log] [blame]
# Copyright lowRISC contributors.
# Licensed under the Apache License, Version 2.0, see LICENSE for details.
# SPDX-License-Identifier: Apache-2.0
import re
from typing import Dict
_REG_RE = re.compile(r'\s*([a-zA-Z0-9_]+)\s*=\s*((:?0x[0-9a-f]+)|([0-9]+))$')
def parse_reg_dump(dump: str) -> Dict[str, int]:
'''Parse the output from a register dump.
Expects all non-empty lines of the dump to be in the form <name> = <value>,
e.g.
x0 = 0x00000000
x1 = 0x11111111
...
Registers may appear in any order and values may be hexadecimal or decimal
integers. Comments use '#'; any content in a line following '#' will be
ignored.
Returns a dictionary mapping register names to their integer values.
'''
out = {}
for line in dump.split('\n'):
# Remove comments and ignore blank lines.
line = line.split('#', 1)[0].strip()
if not line:
continue
m = _REG_RE.match(line)
if not m:
raise ValueError(f'Failed to parse reg dump line ({line:!r}).')
reg = m.group(1)
value = int(m.group(2), 0)
if reg in out:
raise ValueError(f'Register dump contains multiple values '
f'for {reg}.')
out[reg] = value
return out