def main(): if len(sys.argv) != 3: print "Usage: ", sys.argv[0], " <ASCII input> <protobuf output>" exit(-1) try: ascii_in = open(sys.argv[1], 'r') except IOError: print "Failed to open ", sys.argv[1], " for reading" exit(-1) try: proto_out = open(sys.argv[2], 'wb') except IOError: print "Failed to open ", sys.argv[2], " for writing" exit(-1) # Write the magic number in 4-byte Little Endian, similar to what # is done in src/proto/protoio.cc proto_out.write("gem5") # Add the packet header header = packet_pb2.PacketHeader() header.obj_id = "Converted ASCII trace " + sys.argv[1] # Assume the default tick rate header.tick_freq = 1000000000 protolib.encodeMessage(proto_out, header) # For each line in the ASCII trace, create a packet message and # write it to the encoded output for line in ascii_in: cmd, addr, size, tick = line.split(',') packet = packet_pb2.Packet() packet.tick = long(tick) # ReadReq is 1 and WriteReq is 4 in src/mem/packet.hh Command enum packet.cmd = 1 if cmd == 'r' else 4 packet.addr = long(addr) packet.size = int(size) protolib.encodeMessage(proto_out, packet) # We're done ascii_in.close() proto_out.close()
def create_trace(filename, max_addr, burst_size, itt): try: proto_out = gzip.open(filename, 'wb') except IOError: print "Failed to open ", filename, " for writing" exit(-1) # write the magic number in 4-byte Little Endian, similar to what # is done in src/proto/protoio.cc proto_out.write("gem5") # add the packet header header = packet_pb2.PacketHeader() header.obj_id = "lat_mem_rd for range 0:" + str(max_addr) # assume the default tick rate (1 ps) header.tick_freq = 1000000000000 protolib.encodeMessage(proto_out, header) # create a list of every single address to touch addrs = range(0, max_addr, burst_size) import random random.shuffle(addrs) tick = 0 # create a packet we can re-use for all the addresses packet = packet_pb2.Packet() # ReadReq is 1 in src/mem/packet.hh Command enum packet.cmd = 1 packet.size = int(burst_size) for addr in addrs: packet.tick = long(tick) packet.addr = long(addr) protolib.encodeMessage(proto_out, packet) tick = tick + itt proto_out.close()
def create_trace(filename, max_addr, burst_size, itt): try: proto_out = gzip.open(filename, 'wb') except IOError: print("Failed to open ", filename, " for writing") exit(-1) # write the magic number in 4-byte Little Endian, similar to what # is done in src/proto/protoio.cc proto_out.write("gem5") # add the packet header header = packet_pb2.PacketHeader() header.obj_id = "lat_mem_rd for range 0:" + str(max_addr) # assume the default tick rate (1 ps) header.tick_freq = 1000000000000 protolib.encodeMessage(proto_out, header) # create a list of every single address to touch addrs = list(range(0, max_addr, burst_size)) import random random.shuffle(addrs) tick = 0 # create a packet we can re-use for all the addresses packet = packet_pb2.Packet() # ReadReq is 1 in src/mem/packet.hh Command enum packet.cmd = 1 packet.size = int(burst_size) for addr in addrs: packet.tick = long(tick) packet.addr = long(addr) protolib.encodeMessage(proto_out, packet) tick = tick + itt proto_out.close()
def main(): if len(sys.argv) != 3: print "Usage: ", sys.argv[0], " <ASCII input> <protobuf output>" exit(-1) # Open the file in write mode proto_out = open(sys.argv[2], 'wb') # Open the file in read mode try: ascii_in = open(sys.argv[1], 'r') except IOError: print "Failed to open ", sys.argv[1], " for reading" exit(-1) # Write the magic number in 4-byte Little Endian, similar to what # is done in src/proto/protoio.cc proto_out.write("gem5") # Add the packet header header = inst_dep_record_pb2.InstDepRecordHeader() header.obj_id = "Converted ASCII trace " + sys.argv[1] # Assume the default tick rate header.tick_freq = 1000000000 header.window_size = 120 protolib.encodeMessage(proto_out, header) print "Creating enum name,value lookup from proto" enumValues = {} for namestr, valdesc in DepRecord.DESCRIPTOR.enum_values_by_name.items(): print '\t', namestr, valdesc.number enumValues[namestr] = valdesc.number num_records = 0 # For each line in the ASCII trace, create a packet message and # write it to the encoded output for line in ascii_in: inst_info_str, rob_dep_str, reg_dep_str = (line.strip()).split(':') inst_info_list = inst_info_str.split(',') dep_record = DepRecord() dep_record.seq_num = long(inst_info_list[0]) dep_record.pc = long(inst_info_list[1]) dep_record.weight = long(inst_info_list[2]) # If the type is not one of the enum values, it should be a key error try: dep_record.type = enumValues[inst_info_list[3]] except KeyError: print "Seq. num", dep_record.seq_num, "has unsupported type", \ inst_info_list[3] exit(-1) if dep_record.type == DepRecord.INVALID: print "Seq. num", dep_record.seq_num, "is of INVALID type" exit(-1) # If the instruction is a load or store record the physical addr, # size flags in addition to recording the computation delay if dep_record.type in [DepRecord.LOAD, DepRecord.STORE]: p_addr, size, flags, comp_delay = inst_info_list[4:8] dep_record.p_addr = long(p_addr) dep_record.size = int(size) dep_record.flags = int(flags) dep_record.comp_delay = long(comp_delay) else: comp_delay = inst_info_list[4] dep_record.comp_delay = long(comp_delay) # Parse the register and order dependencies both of which are # repeated fields. An empty list is valid. rob_deps = rob_dep_str.strip().split(',') for a_dep in rob_deps: # if the string is empty, split(',') returns 1 item: '' # if the string is ",4", split(',') returns 2 items: '', '4' # long('') gives error, so check if the item is non-empty if a_dep: dep_record.rob_dep.append(long(a_dep)) reg_deps = reg_dep_str.split(',') for a_dep in reg_deps: if a_dep: dep_record.reg_dep.append(long(a_dep)) protolib.encodeMessage(proto_out, dep_record) num_records += 1 print "Converted", num_records, "records." # We're done ascii_in.close() proto_out.close()