# Copyright (c) 2009 The Regents of The University of Michigan # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are # met: redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer; # redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution; # neither the name of the copyright holders nor the names of its # contributors may be used to endorse or promote products derived from # this software without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR # A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT # OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # # Authors: Lisa Hsu from ConfigParser import ConfigParser import gzip import sys, re, optparse, os class myCP(ConfigParser): def __init__(self): ConfigParser.__init__(self) def optionxform(self, optionstr): return optionstr def aggregate(options, args): merged = myCP() page_ptr = 0 allfiles = os.listdir(os.getcwd()) cpts = [] for arg in args: found = False for f in allfiles: if re.compile("cpt." + arg + ".\d+").search(f): found = True cpts.append(f) break if not found: print "missing checkpoint: ", arg sys.exit(1) dirname = "-".join([options.prefix, "cpt"]) agg_name = "-".join(args) print agg_name fullpath = os.path.join("..", dirname, "cpt." + agg_name + ".10000") if not os.path.isdir(fullpath): os.system("mkdir -p " + fullpath) elif os.path.isfile(fullpath + "/system.physmem.physmem"): if os.path.isfile(fullpath + "/m5.cpt"): print fullpath, " already done" return myfile = open(fullpath + "/system.physmem.physmem", "wb+") merged_mem = gzip.GzipFile(fileobj=myfile, mode="wb") max_curtick = 0 when = 0 for (i, arg) in enumerate(args): print arg config = myCP() config.readfp(open(cpts[i] + "/m5.cpt")) for sec in config.sections(): if re.compile("cpu").search(sec): newsec = re.sub("cpu", "cpu" + str(i), sec) merged.add_section(newsec) if re.compile("workload$").search(sec): merged.set(newsec, "M5_pid", i) items = config.items(sec) for item in items: if item[0] == "ppn": if config.getint(sec, "tag") != 0: merged.set(newsec, item[0], int(item[1]) + page_ptr) continue elif item[0] == "asn": tmp = re.compile("(.*).Entry(\d+)").search(sec).groups() if config.has_option(tmp[0], "nlu"): size = config.getint(tmp[0], "nlu") if int(tmp[1]) < size: merged.set(newsec, item[0], i) continue else: merged.set(newsec, item[0], i) continue merged.set(newsec, item[0], item[1]) elif sec == "system": pass elif sec == "Globals": tick = config.getint(sec, "curTick") if tick > max_curtick: max_curtick = tick when = config.getint("system.cpu.tickEvent", "_when") else: if i == 0: merged.add_section(sec) for item in config.items(sec): merged.set(sec, item[0], item[1]) if item[0] == "curtick": merged.optionxform(str("curTick")) elif item[0] == "numevents": merged.optionxform(str("numEvents")) page_ptr = page_ptr + int(config.get("system", "page_ptr")) ### memory stuff f = open(cpts[i] + "/system.physmem.physmem", "rb") gf = gzip.GzipFile(fileobj=f, mode="rb") pages = int(config.get("system", "page_ptr")) print "pages to be read: ", pages x = 0 while x < pages: bytesRead = gf.read(1 << 13) merged_mem.write(bytesRead) x += 1 gf.close() f.close() merged.add_section("system") merged.set("system", "page_ptr", page_ptr) print "WARNING: " print "Make sure the simulation using this checkpoint has at least " if page_ptr > (1<<20): print "8G ", elif page_ptr > (1<<19): print "4G ", elif page_ptr > (1<<18): print "2G ", elif page_ptr > (1<<17): print "1G ", elif page_ptr > (1<<16): print "512KB ", else: print "this is a small sim, you're probably fine", print "of memory." merged.add_section("Globals") merged.set("Globals", "curTick", max_curtick) for i in xrange(len(args)): merged.set("system.cpu" + str(i) + ".tickEvent", "_when", when) merged.write(file(fullpath + "/m5.cpt", "wb")) merged_mem.close() myfile.close() if __name__ == "__main__": parser = optparse.OptionParser() parser.add_option("--prefix", type="string", default="agg") (options, args) = parser.parse_args() aggregate(options, args)