From 661ae80360644dfe3a9e7f3610d534cc3a7e545f Mon Sep 17 00:00:00 2001 From: Jacob Lifshay Date: Mon, 29 Aug 2022 00:25:36 -0700 Subject: [PATCH] log memory in a more fancy format, like hexdump -C --- src/openpower/decoder/isa/caller.py | 1 + src/openpower/decoder/isa/mem.py | 53 +++++++++++++++++++++++++---- src/openpower/test/runner.py | 2 +- 3 files changed, 48 insertions(+), 8 deletions(-) diff --git a/src/openpower/decoder/isa/caller.py b/src/openpower/decoder/isa/caller.py index 58d2dc3f..ef528fdd 100644 --- a/src/openpower/decoder/isa/caller.py +++ b/src/openpower/decoder/isa/caller.py @@ -660,6 +660,7 @@ class ISACaller(ISACallerHelper, ISAFPHelpers): # "raw" memory self.mem = Mem(row_bytes=8, initial_mem=initial_mem) + self.mem.log_fancy(kind=LogKind.InstrInOuts) self.imem = Mem(row_bytes=4, initial_mem=initial_insns) # MMU mode, redirect underlying Mem through RADIX if mmu: diff --git a/src/openpower/decoder/isa/mem.py b/src/openpower/decoder/isa/mem.py index c41e436e..6e222627 100644 --- a/src/openpower/decoder/isa/mem.py +++ b/src/openpower/decoder/isa/mem.py @@ -12,14 +12,10 @@ related bugs: * https://bugs.libre-soc.org/show_bug.cgi?id=424 """ -from copy import copy -from openpower.decoder.selectable_int import (FieldSelectableInt, SelectableInt, - selectconcat) - -from openpower.decoder.helpers import exts, gtu, ltu, undefined -from openpower.util import log +from collections import defaultdict +from openpower.decoder.selectable_int import SelectableInt +from openpower.util import log, LogKind import math -import sys def swap_order(x, nbytes): @@ -155,3 +151,46 @@ class Mem: continue print ("%016x: %016x" % ((k*8) & 0xffffffffffffffff, self.mem[k])) return res + + def log_fancy(self, *, kind=LogKind.Default, name="Memory", + log2_line_size=4, log2_column_chunk_size=3): + line_size = 1 << log2_line_size + subline_mask = line_size - 1 + column_chunk_size = 1 << log2_column_chunk_size + + def make_line(): + return bytearray(line_size) + mem_lines = defaultdict(make_line) + subword_range = range(1 << self.word_log2) + for k in self.mem.keys(): + addr = k << self.word_log2 + for _ in subword_range: + v = self.ld(addr, width=1) + mem_lines[addr >> log2_line_size][addr & subline_mask] = v + addr += 1 + + lines = [] + last_line_index = None + for line_index in sorted(mem_lines.keys()): + line_addr = line_index << log2_line_size + if last_line_index is not None \ + and last_line_index + 1 != line_index: + lines.append("*") + last_line_index = line_index + line_bytes = mem_lines[line_index] + line_str = f"0x{line_addr:08X}:" + for col_chunk in range(0, line_size, + column_chunk_size): + line_str += " " + for i in range(column_chunk_size): + line_str += f" {line_bytes[col_chunk + i]:02X}" + line_str += " |" + for i in range(line_size): + if 0x20 <= line_bytes[i] <= 0x7E: + line_str += chr(line_bytes[i]) + else: + line_str += "." + line_str += "|" + lines.append(line_str) + lines = "\n".join(lines) + log(f"\n{name}:\n{lines}\n", kind=kind) diff --git a/src/openpower/test/runner.py b/src/openpower/test/runner.py index 5282c1e6..a831027c 100644 --- a/src/openpower/test/runner.py +++ b/src/openpower/test/runner.py @@ -254,7 +254,7 @@ class TestRunnerBase(FHDLTestCase): kind=LogKind.InstrInOuts) log("sprs", test.sprs, kind=LogKind.InstrInOuts) log("cr", test.cr, kind=LogKind.InstrInOuts) - log("mem", test.mem, kind=LogKind.InstrInOuts) + log("mem", test.mem) log("msr", test.msr, kind=LogKind.InstrInOuts) def format_assembly(assembly): -- 2.30.2