From 4c79215fdeebb0262678e181ff2f495c84f0808a Mon Sep 17 00:00:00 2001 From: Howard Mao Date: Tue, 12 Jul 2016 11:10:43 -0700 Subject: [PATCH] add a script for checking comparator trace --- groundtest | 2 +- scripts/check_comparator_trace.py | 106 ++++++++++++++++++++++++++++++ 2 files changed, 107 insertions(+), 1 deletion(-) create mode 100644 scripts/check_comparator_trace.py diff --git a/groundtest b/groundtest index b0bc77c3..466d79bd 160000 --- a/groundtest +++ b/groundtest @@ -1 +1 @@ -Subproject commit b0bc77c331ddb24558f9871135ba5bcbf8be2ac4 +Subproject commit 466d79bd63f714125b3947b54f1ad308c6403c04 diff --git a/scripts/check_comparator_trace.py b/scripts/check_comparator_trace.py new file mode 100644 index 00000000..7d339a61 --- /dev/null +++ b/scripts/check_comparator_trace.py @@ -0,0 +1,106 @@ +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()