decode_inst_trace.py revision 13540
113540Sandrea.mondelli@ucf.edu#!/usr/bin/env python2.7 210695SAli.Saidi@ARM.com 310695SAli.Saidi@ARM.com# Copyright (c) 2013-2014 ARM Limited 410695SAli.Saidi@ARM.com# All rights reserved 510695SAli.Saidi@ARM.com# 610695SAli.Saidi@ARM.com# The license below extends only to copyright in the software and shall 710695SAli.Saidi@ARM.com# not be construed as granting a license to any other intellectual 810695SAli.Saidi@ARM.com# property including but not limited to intellectual property relating 910695SAli.Saidi@ARM.com# to a hardware implementation of the functionality of the software 1010695SAli.Saidi@ARM.com# licensed hereunder. You may use the software subject to the license 1110695SAli.Saidi@ARM.com# terms below provided that you ensure that this notice is replicated 1210695SAli.Saidi@ARM.com# unmodified and in its entirety in all distributions of the software, 1310695SAli.Saidi@ARM.com# modified or unmodified, in source code or in binary form. 1410695SAli.Saidi@ARM.com# 1510695SAli.Saidi@ARM.com# Redistribution and use in source and binary forms, with or without 1610695SAli.Saidi@ARM.com# modification, are permitted provided that the following conditions are 1710695SAli.Saidi@ARM.com# met: redistributions of source code must retain the above copyright 1810695SAli.Saidi@ARM.com# notice, this list of conditions and the following disclaimer; 1910695SAli.Saidi@ARM.com# redistributions in binary form must reproduce the above copyright 2010695SAli.Saidi@ARM.com# notice, this list of conditions and the following disclaimer in the 2110695SAli.Saidi@ARM.com# documentation and/or other materials provided with the distribution; 2210695SAli.Saidi@ARM.com# neither the name of the copyright holders nor the names of its 2310695SAli.Saidi@ARM.com# contributors may be used to endorse or promote products derived from 2410695SAli.Saidi@ARM.com# this software without specific prior written permission. 2510695SAli.Saidi@ARM.com# 2610695SAli.Saidi@ARM.com# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 2710695SAli.Saidi@ARM.com# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 2810695SAli.Saidi@ARM.com# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 2910695SAli.Saidi@ARM.com# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 3010695SAli.Saidi@ARM.com# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 3110695SAli.Saidi@ARM.com# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 3210695SAli.Saidi@ARM.com# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 3310695SAli.Saidi@ARM.com# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 3410695SAli.Saidi@ARM.com# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 3510695SAli.Saidi@ARM.com# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 3610695SAli.Saidi@ARM.com# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 3710695SAli.Saidi@ARM.com# 3810695SAli.Saidi@ARM.com# Authors: Ali Saidi 3910695SAli.Saidi@ARM.com# Andreas Hansson 4010695SAli.Saidi@ARM.com 4110695SAli.Saidi@ARM.com# This script is used to dump protobuf instruction traces to ASCII 4210695SAli.Saidi@ARM.com# format. It assumes that protoc has been executed and already 4310695SAli.Saidi@ARM.com# generated the Python package for the inst messages. This can 4410695SAli.Saidi@ARM.com# be done manually using: 4510695SAli.Saidi@ARM.com# protoc --python_out=. inst.proto 4610695SAli.Saidi@ARM.com# The ASCII trace format uses one line per request. 4710695SAli.Saidi@ARM.com 4810695SAli.Saidi@ARM.comimport protolib 4910695SAli.Saidi@ARM.comimport sys 5010695SAli.Saidi@ARM.com 5110695SAli.Saidi@ARM.com# Import the packet proto definitions 5210695SAli.Saidi@ARM.comtry: 5310695SAli.Saidi@ARM.com import inst_pb2 5410695SAli.Saidi@ARM.comexcept: 5510695SAli.Saidi@ARM.com print "Did not find protobuf inst definitions, attempting to generate" 5610695SAli.Saidi@ARM.com from subprocess import call 5710695SAli.Saidi@ARM.com error = call(['protoc', '--python_out=util', '--proto_path=src/proto', 5810695SAli.Saidi@ARM.com 'src/proto/inst.proto']) 5910695SAli.Saidi@ARM.com if not error: 6010695SAli.Saidi@ARM.com print "Generated inst proto definitions" 6110695SAli.Saidi@ARM.com 6210695SAli.Saidi@ARM.com try: 6310695SAli.Saidi@ARM.com import google.protobuf 6410695SAli.Saidi@ARM.com except: 6510695SAli.Saidi@ARM.com print "Please install Python protobuf module" 6610695SAli.Saidi@ARM.com exit(-1) 6710695SAli.Saidi@ARM.com 6810695SAli.Saidi@ARM.com import inst_pb2 6910695SAli.Saidi@ARM.com else: 7010695SAli.Saidi@ARM.com print "Failed to import inst proto definitions" 7110695SAli.Saidi@ARM.com exit(-1) 7210695SAli.Saidi@ARM.com 7310695SAli.Saidi@ARM.comdef main(): 7410695SAli.Saidi@ARM.com if len(sys.argv) != 3: 7510695SAli.Saidi@ARM.com print "Usage: ", sys.argv[0], " <protobuf input> <ASCII output>" 7610695SAli.Saidi@ARM.com exit(-1) 7710695SAli.Saidi@ARM.com 7810695SAli.Saidi@ARM.com # Open the file in read mode 7910695SAli.Saidi@ARM.com proto_in = protolib.openFileRd(sys.argv[1]) 8010695SAli.Saidi@ARM.com 8110695SAli.Saidi@ARM.com try: 8210695SAli.Saidi@ARM.com ascii_out = open(sys.argv[2], 'w') 8310695SAli.Saidi@ARM.com except IOError: 8410695SAli.Saidi@ARM.com print "Failed to open ", sys.argv[2], " for writing" 8510695SAli.Saidi@ARM.com exit(-1) 8610695SAli.Saidi@ARM.com 8710695SAli.Saidi@ARM.com # Read the magic number in 4-byte Little Endian 8810695SAli.Saidi@ARM.com magic_number = proto_in.read(4) 8910695SAli.Saidi@ARM.com 9010695SAli.Saidi@ARM.com if magic_number != "gem5": 9110695SAli.Saidi@ARM.com print "Unrecognized file", sys.argv[1] 9210695SAli.Saidi@ARM.com exit(-1) 9310695SAli.Saidi@ARM.com 9410695SAli.Saidi@ARM.com print "Parsing instruction header" 9510695SAli.Saidi@ARM.com 9610695SAli.Saidi@ARM.com # Add the packet header 9710695SAli.Saidi@ARM.com header = inst_pb2.InstHeader() 9810695SAli.Saidi@ARM.com protolib.decodeMessage(proto_in, header) 9910695SAli.Saidi@ARM.com 10010695SAli.Saidi@ARM.com print "Object id:", header.obj_id 10110695SAli.Saidi@ARM.com print "Tick frequency:", header.tick_freq 10210695SAli.Saidi@ARM.com print "Memory addresses included:", header.has_mem 10310695SAli.Saidi@ARM.com 10410695SAli.Saidi@ARM.com if header.ver != 0: 10510695SAli.Saidi@ARM.com print "Warning: file version newer than decoder:", header.ver 10610695SAli.Saidi@ARM.com print "This decoder may not understand how to decode this file" 10710695SAli.Saidi@ARM.com 10810695SAli.Saidi@ARM.com 10910695SAli.Saidi@ARM.com print "Parsing instructions" 11010695SAli.Saidi@ARM.com 11110695SAli.Saidi@ARM.com num_insts = 0 11210695SAli.Saidi@ARM.com inst = inst_pb2.Inst() 11310695SAli.Saidi@ARM.com 11410695SAli.Saidi@ARM.com # Decode the inst messages until we hit the end of the file 11510695SAli.Saidi@ARM.com optional_fields = ('tick', 'type', 'inst_flags', 'addr', 'size', 'mem_flags') 11610695SAli.Saidi@ARM.com while protolib.decodeMessage(proto_in, inst): 11710695SAli.Saidi@ARM.com # If we have a tick use it, otherwise count instructions 11810695SAli.Saidi@ARM.com if inst.HasField('tick'): 11910695SAli.Saidi@ARM.com tick = inst.tick 12010695SAli.Saidi@ARM.com else: 12110695SAli.Saidi@ARM.com tick = num_insts 12210695SAli.Saidi@ARM.com 12310695SAli.Saidi@ARM.com if inst.HasField('nodeid'): 12410695SAli.Saidi@ARM.com node_id = inst.nodeid 12510695SAli.Saidi@ARM.com else: 12610695SAli.Saidi@ARM.com node_id = 0; 12710695SAli.Saidi@ARM.com if inst.HasField('cpuid'): 12810695SAli.Saidi@ARM.com cpu_id = inst.cpuid 12910695SAli.Saidi@ARM.com else: 13010695SAli.Saidi@ARM.com cpu_id = 0; 13110695SAli.Saidi@ARM.com 13210695SAli.Saidi@ARM.com ascii_out.write('%-20d: (%03d/%03d) %#010x @ %#016x ' % (tick, node_id, cpu_id, 13310695SAli.Saidi@ARM.com inst.inst, inst.pc)) 13410695SAli.Saidi@ARM.com 13510695SAli.Saidi@ARM.com if inst.HasField('type'): 13610695SAli.Saidi@ARM.com ascii_out.write(' : %10s' % inst_pb2._INST_INSTTYPE.values_by_number[inst.type].name) 13710695SAli.Saidi@ARM.com 13810695SAli.Saidi@ARM.com for mem_acc in inst.mem_access: 13910695SAli.Saidi@ARM.com ascii_out.write(" %#x-%#x;" % (mem_acc.addr, mem_acc.addr + mem_acc.size)) 14010695SAli.Saidi@ARM.com 14110695SAli.Saidi@ARM.com ascii_out.write('\n') 14210695SAli.Saidi@ARM.com num_insts += 1 14310695SAli.Saidi@ARM.com 14410695SAli.Saidi@ARM.com print "Parsed instructions:", num_insts 14510695SAli.Saidi@ARM.com 14610695SAli.Saidi@ARM.com # We're done 14710695SAli.Saidi@ARM.com ascii_out.close() 14810695SAli.Saidi@ARM.com proto_in.close() 14910695SAli.Saidi@ARM.com 15010695SAli.Saidi@ARM.comif __name__ == "__main__": 15110695SAli.Saidi@ARM.com main() 152