107 lines
3.2 KiB
Python
107 lines
3.2 KiB
Python
import sys
|
|
import re
|
|
|
|
N_BLOCKS = 4
|
|
N_BEATS = 8
|
|
N_BYTES = 8
|
|
N_OPS = 142
|
|
|
|
memory = [[list() for _ in range(0, N_BEATS)] for _ in range(0, N_BLOCKS)]
|
|
addresses = {}
|
|
|
|
def process_put_block(xid, addr_block, data):
|
|
fullmask = (1 << (N_BYTES * 8)) - 1
|
|
for i in range(0, N_BEATS):
|
|
real_data = (data << i) + data
|
|
memory[addr_block][i].append((xid, real_data & fullmask))
|
|
|
|
def expand_wmask(wmask):
|
|
bitmask = 0
|
|
bitmask_byte = 0xff
|
|
|
|
for i in range(0, N_BYTES):
|
|
if ((wmask >> i) & 1) == 1:
|
|
bitmask |= bitmask_byte
|
|
bitmask_byte <<= 8
|
|
|
|
return bitmask
|
|
|
|
def process_put(xid, addr_block, addr_beat, data, wmask):
|
|
fullmask = (1 << (N_BYTES * 8)) - 1
|
|
bitmask = expand_wmask(wmask)
|
|
old_data = memory[addr_block][addr_beat][-1][1]
|
|
new_data = ((bitmask & data) | (~bitmask & old_data)) & fullmask
|
|
memory[addr_block][addr_beat].append((xid, new_data))
|
|
|
|
ACQ_RE = re.compile(r"\[acq\s*(\d+)\]: (.*)")
|
|
PUT_BLOCK_RE = re.compile(
|
|
r"PutBlock\(addr_block = ([0-9a-f]+), data = ([0-9a-f]+)\)")
|
|
PUT_BEAT_RE = re.compile(
|
|
(r"Put\(addr_block = ([0-9a-f]+), addr_beat = ([0-9a-f]+), "
|
|
r"data = ([0-9a-f]+), wmask = ([0-9a-f]+)\)"))
|
|
GET_BLOCK_RE = re.compile(
|
|
r"GetBlock\(addr_block = ([0-9a-f]+)\)")
|
|
GET_BEAT_RE = re.compile(
|
|
(r"Get\(addr_block = ([0-9a-f]+), addr_beat = (\d+), "
|
|
"addr_byte = \d+, op_size = \d+\)"))
|
|
GNT_RE = re.compile(
|
|
r"\[gnt\s*(\d+)\]: g_type = \d+, addr_beat = (\d+), data = ([0-9a-f]+)")
|
|
|
|
def check_data(gnt_id, addr_beat, data):
|
|
addr_block = addresses[gnt_id]
|
|
last_data = None
|
|
for (put_id, put_data) in memory[addr_block][addr_beat]:
|
|
if put_id > gnt_id:
|
|
break
|
|
last_data = put_data
|
|
if last_data != data:
|
|
print("Data mismatch at {} for {:07x}, {} - got:{:016x} exp:{:016x}".format(
|
|
gnt_id, addr_block, addr_beat, data, last_data))
|
|
|
|
def process_input(f):
|
|
for line in f:
|
|
m = ACQ_RE.match(line)
|
|
if m:
|
|
acq_id = int(m.groups()[0])
|
|
body = m.groups()[1]
|
|
process_acquire(acq_id, body)
|
|
m = GNT_RE.match(line)
|
|
if m:
|
|
gnt_id = int(m.groups()[0])
|
|
addr_beat = int(m.groups()[1])
|
|
data = int(m.groups()[2], 16)
|
|
check_data(gnt_id, addr_beat, data)
|
|
|
|
def process_acquire(acq_id, body):
|
|
m = PUT_BLOCK_RE.match(body)
|
|
if m:
|
|
addr_block = int(m.groups()[0], 16)
|
|
data = int(m.groups()[1], 16)
|
|
process_put_block(acq_id, addr_block, data)
|
|
return
|
|
m = PUT_BEAT_RE.match(body)
|
|
if m:
|
|
addr_block = int(m.groups()[0], 16)
|
|
addr_beat = int(m.groups()[1], 16)
|
|
data = int(m.groups()[2], 16)
|
|
wmask = int(m.groups()[3], 16)
|
|
process_put(acq_id, addr_block, addr_beat, data, wmask)
|
|
return
|
|
m = GET_BLOCK_RE.match(body)
|
|
if m:
|
|
addresses[acq_id] = int(m.groups()[0], 16)
|
|
return
|
|
m = GET_BEAT_RE.match(body)
|
|
if m:
|
|
addresses[acq_id] = int(m.groups()[0], 16)
|
|
|
|
def main():
|
|
if len(sys.argv) < 2:
|
|
process_input(sys.stdin)
|
|
else:
|
|
with open(sys.argv[1]) as f:
|
|
process_input(f)
|
|
|
|
if __name__ == "__main__":
|
|
main()
|