1#!/usr/bin/env python 2 3# Copyright (c) 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 --- 57 unchanged lines hidden (view full) --- 66# 67# Authors: Radhika Jagtap 68# 69 70# This script is used to dump ASCII traces of the instruction dependency 71# graph to protobuf format. 72# 73# The ASCII trace format uses one line per instruction with the format |
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: |
80# seq_num,[pc],[weight,]type,[address,size,flags,]comp_delay:[rob_dep]: |
81# [reg_dep] |
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 |
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: --- 5 unchanged lines hidden (view full) --- 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 |
112DepRecord = inst_dep_record_pb2.InstDepRecord 113 |
114def main(): 115 if len(sys.argv) != 3: 116 print "Usage: ", sys.argv[0], " <ASCII input> <protobuf output>" 117 exit(-1) 118 119 # Open the file in write mode 120 proto_out = open(sys.argv[2], 'wb') 121 --- 11 unchanged lines hidden (view full) --- 133 # Add the packet header 134 header = inst_dep_record_pb2.InstDepRecordHeader() 135 header.obj_id = "Converted ASCII trace " + sys.argv[1] 136 # Assume the default tick rate 137 header.tick_freq = 1000000000 138 header.window_size = 120 139 protolib.encodeMessage(proto_out, header) 140 |
141 print "Creating enum name,value lookup from proto" 142 enumValues = {} 143 for namestr, valdesc in DepRecord.DESCRIPTOR.enum_values_by_name.items(): 144 print '\t', namestr, valdesc.number 145 enumValues[namestr] = valdesc.number 146 |
147 num_records = 0 148 # For each line in the ASCII trace, create a packet message and 149 # write it to the encoded output 150 for line in ascii_in: 151 inst_info_str, rob_dep_str, reg_dep_str = (line.strip()).split(':') 152 inst_info_list = inst_info_str.split(',') |
153 dep_record = DepRecord() |
154 155 dep_record.seq_num = long(inst_info_list[0]) 156 dep_record.pc = long(inst_info_list[1]) 157 dep_record.weight = long(inst_info_list[2]) |
158 # If the type is not one of the enum values, it should be a key error 159 try: 160 dep_record.type = enumValues[inst_info_list[3]] 161 except KeyError: 162 print "Seq. num", dep_record.seq_num, "has unsupported type", \ 163 inst_info_list[3] 164 exit(-1) |
165 |
166 if dep_record.type == DepRecord.INVALID: 167 print "Seq. num", dep_record.seq_num, "is of INVALID type" 168 exit(-1) 169 |
170 # If the instruction is a load or store record the addr, size flags 171 # in addition to recording the computation delay |
172 if dep_record.type in [DepRecord.LOAD, DepRecord.STORE]: 173 addr, size, flags, comp_delay = inst_info_list[4:8] |
174 dep_record.addr = long(addr) 175 dep_record.size = int(size) 176 dep_record.flags = int(flags) 177 dep_record.comp_delay = long(comp_delay) |
178 else: |
179 comp_delay = inst_info_list[4] 180 dep_record.comp_delay = long(comp_delay) |
181 182 # Parse the register and order dependencies both of which are 183 # repeated fields. An empty list is valid. 184 rob_deps = rob_dep_str.strip().split(',') 185 for a_dep in rob_deps: 186 # if the string is empty, split(',') returns 1 item: '' 187 # if the string is ",4", split(',') returns 2 items: '', '4' 188 # long('') gives error, so check if the item is non-empty --- 18 unchanged lines hidden --- |