integration/common/get_mem_data: Add data_width support.

This commit is contained in:
Florent Kermarrec 2022-09-12 16:45:33 +02:00
parent a7cc1af416
commit 481234de91
1 changed files with 12 additions and 6 deletions

View File

@ -39,7 +39,8 @@ def get_mem_regions(filename_or_regions, offset):
regions = {filename: f"{offset:08x}"} regions = {filename: f"{offset:08x}"}
return regions return regions
def get_mem_data(filename_or_regions, endianness="big", mem_size=None, offset=0): def get_mem_data(filename_or_regions, data_width=32, endianness="big", mem_size=None, offset=0):
assert data_width in [32, 64]
# Create memory regions. # Create memory regions.
regions = get_mem_regions(filename_or_regions, offset) regions = get_mem_regions(filename_or_regions, offset)
@ -56,23 +57,28 @@ def get_mem_data(filename_or_regions, endianness="big", mem_size=None, offset=0)
data_size, mem_size)) data_size, mem_size))
# Fill data. # Fill data.
data = [0]*math.ceil(data_size/4) bytes_per_data = data_width//8
data = [0]*math.ceil(data_size/bytes_per_data)
for filename, base in regions.items(): for filename, base in regions.items():
base = int(base, 16) base = int(base, 16)
with open(filename, "rb") as f: with open(filename, "rb") as f:
i = 0 i = 0
while True: while True:
w = f.read(4) w = f.read(bytes_per_data)
if not w: if not w:
break break
if len(w) != 4: if len(w) != bytes_per_data:
for _ in range(len(w), 4): for _ in range(len(w), bytes_per_data):
w += b'\x00' w += b'\x00'
unpack_order = { unpack_order = {
"little": "<I", "little": "<I",
"big": ">I" "big": ">I"
}[endianness] }[endianness]
data[(base - offset)//4 + i] = struct.unpack(unpack_order, w)[0] if data_width == 32:
data[(base - offset)//bytes_per_data + i] = struct.unpack(unpack_order, w)[0]
if data_width == 64:
data[(base - offset)//bytes_per_data + i] = (struct.unpack(unpack_order, w[0:4])[0] << 0)
data[(base - offset)//bytes_per_data + i] |= (struct.unpack(unpack_order, w[4:8])[0] << 32)
i += 1 i += 1
return data return data