diff --git a/dev/sim/coco/OPEnv.py b/dev/sim/coco/OPEnv.py index ccbc145..669de0b 100755 --- a/dev/sim/coco/OPEnv.py +++ b/dev/sim/coco/OPEnv.py @@ -1,5 +1,7 @@ # OP Environment +import math + import cocotb from cocotb.triggers import Timer from cocotb.handle import Force @@ -84,6 +86,7 @@ class TransQ(DotMap): def __init__(self): super().__init__() +# could allow registering callback for loads and/or stores in range class Memory(DotMap): def __init__(self, sim, default=0, logStores=True): @@ -140,11 +143,77 @@ class Memory(DotMap): self.sim.msg(f'Mem Update: @{addr:08X} {self.data[addr]:08X}->{data:08X}') self.data[addr] = data + def dump(self, start, end, cols=4, ascii=True, trimLeadingZeros=False, trimTrailingZeros=False): + #wtf check for start>end and do in reverse + #wtf trimTrailingZeros + + # word-align + wordstart = (start >> 2) << 2 + wordend = (end >> 2) << 2 + # column align (handles powers of 2) + c = int(math.log2(cols)) + # address of column 0 of first line + linestart = (wordstart >> 2 >> c) << c << 2 + # column of wordstart + colstart = (wordstart>>2) - (linestart>>2) + # word address + word = wordstart>>2 + + text = '' + row = '' + rowTransDict = {} + for i in range(32): + rowTransDict[i] = '.' + + # first line may be unaligned by row + zeros = True + if colstart != 0: + textRow += f'{linestart:08X}: ' + for i in range(colstart): + textRow += f'{"":8s} ' + row += f'{"":8s} ' + for i in range(colstart, cols): + v = f'{self.read(word<<2):08X}' + textRow += v + ' ' + if v != '00000000': + zeros = False + row += v + word +=1 + rowb = bytearray.fromhex(row) + rowb = rowb.decode('iso-8859-1').translate(rowTransDict) + textRow += (' ' + rowb) if ascii else '' + textRow += '\n' + if not trimLeadingZeros or not zeros: + text += textRow + + lastword = wordend >> 2 + while (word <= lastword): + textRow = f'{word<<2:08X}: ' + row = '' + for j in range(cols): + v = f'{self.read(word<<2):08X}' + textRow += v + ' ' + if v != '00000000': + zeros = False + row += v + word += 1 + if (word > lastword): + break + rowb = bytearray.fromhex(row) + rowb = rowb.decode('iso-8859-1').translate(rowTransDict) + textRow += (' ' + rowb) if ascii else '' + textRow += '\n' + if not trimLeadingZeros or not zeros: + text += textRow + + return text + # ------------------------------------------------------------------------------------------------ # Functions +# the zero char pad should be based on pad value; currently 64 max def hex(n, pad=0): if pad: - return f'000000000000000000000000{n.value.hex()[2:].upper()}'[-pad:] + return f'0000000000000000000000000000000000000000000000000000000000000000{n.value.hex()[2:].upper()}'[-pad:] else: return n.value.hex()[2:].upper()