1#!/usr/bin/env python 2 3# Copyright (c) 2013 - 2015 ARM Limited 4# All rights reserved 5# 6# The license below extends only to copyright in the software and shall 7# not be construed as granting a license to any other intellectual 8# property including but not limited to intellectual property relating 9# to a hardware implementation of the functionality of the software 10# licensed hereunder. You may use the software subject to the license 11# terms below provided that you ensure that this notice is replicated 12# unmodified and in its entirety in all distributions of the software, 13# modified or unmodified, in source code or in binary form. 14# 15# Redistribution and use in source and binary forms, with or without 16# modification, are permitted provided that the following conditions are 17# met: redistributions of source code must retain the above copyright 18# notice, this list of conditions and the following disclaimer; 19# redistributions in binary form must reproduce the above copyright 20# notice, this list of conditions and the following disclaimer in the 21# documentation and/or other materials provided with the distribution; 22# neither the name of the copyright holders nor the names of its 23# contributors may be used to endorse or promote products derived from 24# this software without specific prior written permission. 25# 26# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 27# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 28# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 29# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 30# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 31# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 32# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 33# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 34# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 35# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 36# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 37# 38# Copyright 2008 Google Inc. All rights reserved. 39# http://code.google.com/p/protobuf/ 40# 41# Redistribution and use in source and binary forms, with or without 42# modification, are permitted provided that the following conditions are 43# met: 44# 45# * Redistributions of source code must retain the above copyright 46# notice, this list of conditions and the following disclaimer. 47# * Redistributions in binary form must reproduce the above 48# copyright notice, this list of conditions and the following disclaimer 49# in the documentation and/or other materials provided with the 50# distribution. 51# * Neither the name of Google Inc. nor the names of its 52# contributors may be used to endorse or promote products derived from 53# this software without specific prior written permission. 54# 55# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 56# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 57# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 58# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 59# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 60# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 61# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 62# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 63# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 64# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 65# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 66# 67# Authors: Radhika Jagtap 68# 69 70# This script is used to dump protobuf traces of the instruction dependency 71# graph to ASCII format. 72# 73# The ASCII trace format uses one line per instruction with the format
| 1#!/usr/bin/env python 2 3# Copyright (c) 2013 - 2015 ARM Limited 4# All rights reserved 5# 6# The license below extends only to copyright in the software and shall 7# not be construed as granting a license to any other intellectual 8# property including but not limited to intellectual property relating 9# to a hardware implementation of the functionality of the software 10# licensed hereunder. You may use the software subject to the license 11# terms below provided that you ensure that this notice is replicated 12# unmodified and in its entirety in all distributions of the software, 13# modified or unmodified, in source code or in binary form. 14# 15# Redistribution and use in source and binary forms, with or without 16# modification, are permitted provided that the following conditions are 17# met: redistributions of source code must retain the above copyright 18# notice, this list of conditions and the following disclaimer; 19# redistributions in binary form must reproduce the above copyright 20# notice, this list of conditions and the following disclaimer in the 21# documentation and/or other materials provided with the distribution; 22# neither the name of the copyright holders nor the names of its 23# contributors may be used to endorse or promote products derived from 24# this software without specific prior written permission. 25# 26# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 27# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 28# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 29# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 30# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 31# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 32# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 33# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 34# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 35# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 36# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 37# 38# Copyright 2008 Google Inc. All rights reserved. 39# http://code.google.com/p/protobuf/ 40# 41# Redistribution and use in source and binary forms, with or without 42# modification, are permitted provided that the following conditions are 43# met: 44# 45# * Redistributions of source code must retain the above copyright 46# notice, this list of conditions and the following disclaimer. 47# * Redistributions in binary form must reproduce the above 48# copyright notice, this list of conditions and the following disclaimer 49# in the documentation and/or other materials provided with the 50# distribution. 51# * Neither the name of Google Inc. nor the names of its 52# contributors may be used to endorse or promote products derived from 53# this software without specific prior written permission. 54# 55# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 56# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 57# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 58# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 59# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 60# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 61# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 62# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 63# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 64# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 65# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 66# 67# Authors: Radhika Jagtap 68# 69 70# This script is used to dump protobuf traces of the instruction dependency 71# graph to ASCII format. 72# 73# The ASCII trace format uses one line per instruction with the format
|
74# instruction sequence number, (optional) pc, (optional) weight, load, store,
| 74# instruction sequence number, (optional) pc, (optional) weight, type
|
75# (optional) flags, (optional) addr, (optional) size, comp delay, 76# (repeated) order dependencies comma-separated, and (repeated) register 77# dependencies comma-separated. 78# 79# examples:
| 75# (optional) flags, (optional) addr, (optional) size, comp delay, 76# (repeated) order dependencies comma-separated, and (repeated) register 77# dependencies comma-separated. 78# 79# examples:
|
80# seq_num,[pc],[weight,]load,store,[address,size,flags,]comp_delay:[rob_dep]:
| 80# seq_num,[pc],[weight,]type,[address,size,flags,]comp_delay:[rob_dep]:
|
81# [reg_dep]
| 81# [reg_dep]
|
82# 1,1,False,False,8500:: 83# 2,1,False,False,1000:,1: 84# 3,1,True,False,831248,4,74,500:,2: 85# 4,1,False,False,0:,2: 86# 5,1,False,False,500::,4 87# 6,1,False,True,831248,4,74,1000:,3:,4,5
| 82# 1,35652,1,COMP,8500:: 83# 2,35656,1,COMP,0:,1: 84# 3,35660,1,LOAD,1748752,4,74,500:,2: 85# 4,35660,1,COMP,0:,3: 86# 5,35664,1,COMP,3000::,4 87# 6,35666,1,STORE,1748752,4,74,1000:,3:,4,5 88# 7,35666,1,COMP,3000::,4 89# 8,35670,1,STORE,1748748,4,74,0:,6,3:,7 90# 9,35670,1,COMP,500::,7
|
88 89import protolib 90import sys 91 92# Import the packet proto definitions. If they are not found, attempt 93# to generate them automatically. This assumes that the script is 94# executed from the gem5 root. 95try: 96 import inst_dep_record_pb2 97except: 98 print "Did not find proto definition, attempting to generate" 99 from subprocess import call 100 error = call(['protoc', '--python_out=util', '--proto_path=src/proto', 101 'src/proto/inst_dep_record.proto']) 102 if not error: 103 import inst_dep_record_pb2 104 print "Generated proto definitions for instruction dependency record" 105 else: 106 print "Failed to import proto definitions" 107 exit(-1) 108 109def main(): 110 if len(sys.argv) != 3: 111 print "Usage: ", sys.argv[0], " <protobuf input> <ASCII output>" 112 exit(-1) 113 114 # Open the file on read mode 115 proto_in = protolib.openFileRd(sys.argv[1]) 116 117 try: 118 ascii_out = open(sys.argv[2], 'w') 119 except IOError: 120 print "Failed to open ", sys.argv[2], " for writing" 121 exit(-1) 122 123 # Read the magic number in 4-byte Little Endian 124 magic_number = proto_in.read(4) 125 126 if magic_number != "gem5": 127 print "Unrecognized file" 128 exit(-1) 129 130 print "Parsing packet header" 131 132 # Add the packet header 133 header = inst_dep_record_pb2.InstDepRecordHeader() 134 protolib.decodeMessage(proto_in, header) 135 136 print "Object id:", header.obj_id 137 print "Tick frequency:", header.tick_freq 138 139 print "Parsing packets" 140
| 91 92import protolib 93import sys 94 95# Import the packet proto definitions. If they are not found, attempt 96# to generate them automatically. This assumes that the script is 97# executed from the gem5 root. 98try: 99 import inst_dep_record_pb2 100except: 101 print "Did not find proto definition, attempting to generate" 102 from subprocess import call 103 error = call(['protoc', '--python_out=util', '--proto_path=src/proto', 104 'src/proto/inst_dep_record.proto']) 105 if not error: 106 import inst_dep_record_pb2 107 print "Generated proto definitions for instruction dependency record" 108 else: 109 print "Failed to import proto definitions" 110 exit(-1) 111 112def main(): 113 if len(sys.argv) != 3: 114 print "Usage: ", sys.argv[0], " <protobuf input> <ASCII output>" 115 exit(-1) 116 117 # Open the file on read mode 118 proto_in = protolib.openFileRd(sys.argv[1]) 119 120 try: 121 ascii_out = open(sys.argv[2], 'w') 122 except IOError: 123 print "Failed to open ", sys.argv[2], " for writing" 124 exit(-1) 125 126 # Read the magic number in 4-byte Little Endian 127 magic_number = proto_in.read(4) 128 129 if magic_number != "gem5": 130 print "Unrecognized file" 131 exit(-1) 132 133 print "Parsing packet header" 134 135 # Add the packet header 136 header = inst_dep_record_pb2.InstDepRecordHeader() 137 protolib.decodeMessage(proto_in, header) 138 139 print "Object id:", header.obj_id 140 print "Tick frequency:", header.tick_freq 141 142 print "Parsing packets" 143
|
| 144 print "Creating enum value,name lookup from proto" 145 enumNames = {} 146 desc = inst_dep_record_pb2.InstDepRecord.DESCRIPTOR 147 for namestr, valdesc in desc.enum_values_by_name.items(): 148 print '\t', valdesc.number, namestr 149 enumNames[valdesc.number] = namestr 150
|
141 num_packets = 0 142 num_regdeps = 0 143 num_robdeps = 0 144 packet = inst_dep_record_pb2.InstDepRecord() 145 146 # Decode the packet messages until we hit the end of the file 147 while protolib.decodeMessage(proto_in, packet): 148 num_packets += 1 149 150 # Write to file the seq num 151 ascii_out.write('%s' % (packet.seq_num)) 152 # Write to file the pc of the instruction, default is 0 153 if packet.HasField('pc'): 154 ascii_out.write(',%s' % (packet.pc)) 155 else: 156 ascii_out.write(',0') 157 # Write to file the weight, default is 1 158 if packet.HasField('weight'): 159 ascii_out.write(',%s' % (packet.weight)) 160 else: 161 ascii_out.write(',1')
| 151 num_packets = 0 152 num_regdeps = 0 153 num_robdeps = 0 154 packet = inst_dep_record_pb2.InstDepRecord() 155 156 # Decode the packet messages until we hit the end of the file 157 while protolib.decodeMessage(proto_in, packet): 158 num_packets += 1 159 160 # Write to file the seq num 161 ascii_out.write('%s' % (packet.seq_num)) 162 # Write to file the pc of the instruction, default is 0 163 if packet.HasField('pc'): 164 ascii_out.write(',%s' % (packet.pc)) 165 else: 166 ascii_out.write(',0') 167 # Write to file the weight, default is 1 168 if packet.HasField('weight'): 169 ascii_out.write(',%s' % (packet.weight)) 170 else: 171 ascii_out.write(',1')
|
162 # Write to file if it is a load and if it is a store 163 ascii_out.write(',%s,%s' % (packet.load, packet.store))
| 172 # Write to file the type of the record 173 try: 174 ascii_out.write(',%s' % enumNames[packet.type]) 175 except KeyError: 176 print "Seq. num", packet.seq_num, "has unsupported type", \ 177 packet.type 178 exit(-1)
|
164
| 179
|
| 180
|
165 # Write to file if it has the optional fields addr, size, flags 166 if packet.HasField('addr'): 167 ascii_out.write(',%s' % (packet.addr)) 168 if packet.HasField('size'): 169 ascii_out.write(',%s' % (packet.size)) 170 if packet.HasField('flags'): 171 ascii_out.write(',%s' % (packet.flags)) 172 173 # Write to file the comp delay 174 ascii_out.write(',%s' % (packet.comp_delay)) 175 176 # Write to file the repeated field order dependency 177 ascii_out.write(':') 178 if packet.rob_dep: 179 num_robdeps += 1 180 for dep in packet.rob_dep: 181 ascii_out.write(',%s' % dep) 182 # Write to file the repeated field register dependency 183 ascii_out.write(':') 184 if packet.reg_dep: 185 num_regdeps += 1 # No. of packets with atleast 1 register dependency 186 for dep in packet.reg_dep: 187 ascii_out.write(',%s' % dep) 188 # New line 189 ascii_out.write('\n') 190 191 print "Parsed packets:", num_packets 192 print "Packets with at least 1 reg dep:", num_regdeps 193 print "Packets with at least 1 rob dep:", num_robdeps 194 195 # We're done 196 ascii_out.close() 197 proto_in.close() 198 199if __name__ == "__main__": 200 main()
| 181 # Write to file if it has the optional fields addr, size, flags 182 if packet.HasField('addr'): 183 ascii_out.write(',%s' % (packet.addr)) 184 if packet.HasField('size'): 185 ascii_out.write(',%s' % (packet.size)) 186 if packet.HasField('flags'): 187 ascii_out.write(',%s' % (packet.flags)) 188 189 # Write to file the comp delay 190 ascii_out.write(',%s' % (packet.comp_delay)) 191 192 # Write to file the repeated field order dependency 193 ascii_out.write(':') 194 if packet.rob_dep: 195 num_robdeps += 1 196 for dep in packet.rob_dep: 197 ascii_out.write(',%s' % dep) 198 # Write to file the repeated field register dependency 199 ascii_out.write(':') 200 if packet.reg_dep: 201 num_regdeps += 1 # No. of packets with atleast 1 register dependency 202 for dep in packet.reg_dep: 203 ascii_out.write(',%s' % dep) 204 # New line 205 ascii_out.write('\n') 206 207 print "Parsed packets:", num_packets 208 print "Packets with at least 1 reg dep:", num_regdeps 209 print "Packets with at least 1 rob dep:", num_robdeps 210 211 # We're done 212 ascii_out.close() 213 proto_in.close() 214 215if __name__ == "__main__": 216 main()
|