stats.py revision 1301
11049Sbinkertn@umich.edu#!/usr/bin/env python
21049Sbinkertn@umich.edufrom __future__ import division
31049Sbinkertn@umich.eduimport re, sys
41049Sbinkertn@umich.edu
51049Sbinkertn@umich.edudef usage():
61049Sbinkertn@umich.edu    print '''\
71049Sbinkertn@umich.eduUsage: %s [-E] [-F] [-d <db> ] [-g <get> ] [-h <host>] [-p]
81049Sbinkertn@umich.edu       [-s <system>] [-r <runs> ] [-u <username>] <command> [command args]
91049Sbinkertn@umich.edu''' % sys.argv[0]
101049Sbinkertn@umich.edu    sys.exit(1)
111049Sbinkertn@umich.edu
121049Sbinkertn@umich.edudef getopts(list, flags):
131049Sbinkertn@umich.edu    import getopt
141049Sbinkertn@umich.edu    try:
151049Sbinkertn@umich.edu        opts, args = getopt.getopt(list, flags)
161049Sbinkertn@umich.edu    except getopt.GetoptError:
171049Sbinkertn@umich.edu        usage()
181049Sbinkertn@umich.edu
191049Sbinkertn@umich.edu    return opts, args
201049Sbinkertn@umich.edu
211049Sbinkertn@umich.edudef printval(name, value, invert = False):
221049Sbinkertn@umich.edu    if invert and value != 0.0:
231049Sbinkertn@umich.edu        value = 1 / value
241049Sbinkertn@umich.edu
251049Sbinkertn@umich.edu    if value == (1e300*1e300):
261049Sbinkertn@umich.edu        return
271049Sbinkertn@umich.edu
281049Sbinkertn@umich.edu    if printval.mode == 'G':
291049Sbinkertn@umich.edu        print '%s:    %g' % (name, value)
301049Sbinkertn@umich.edu    elif printval.mode != 'F' and value > 1e6:
311049Sbinkertn@umich.edu        print '%s:    %0.5e' % (name, value)
321049Sbinkertn@umich.edu    else:
331049Sbinkertn@umich.edu        print '%s:    %f' % (name, value)
341049Sbinkertn@umich.edu
351049Sbinkertn@umich.eduprintval.mode = 'G'
361049Sbinkertn@umich.edu
371049Sbinkertn@umich.edudef unique(list):
381049Sbinkertn@umich.edu    set = {}
391049Sbinkertn@umich.edu    map(set.__setitem__, list, [])
401049Sbinkertn@umich.edu    return set.keys()
411049Sbinkertn@umich.edu
421269Sbinkertn@umich.edudef graphdata(runs, options, tag, label, value):
431049Sbinkertn@umich.edu    import info
441269Sbinkertn@umich.edu    configs = ['ste', 'hte', 'htd', 'ocm', 'occ', 'ocp' ]
451269Sbinkertn@umich.edu    #benchmarks = [ 'm', 's', 'nb1', 'nb2', 'nt1', 'nt2', 'w1', 'w2', 'w3', 'w4', 'ns', 'nm', 'nw1', 'nw2', 'nw3' ]
461269Sbinkertn@umich.edu    #benchmarks = [ 'm', 's', 'nb1', 'nb2', 'nt1', 'w1', 'w2', 'w3', 'ns', 'nm', 'w1s' ]
471269Sbinkertn@umich.edu    benchmarks = [ 'm', 's', 'nb1', 'nb2', 'w1', 'w2', 'w3', 'w4', 'ns', 'nm', 'nw1', 'snt' ]
481269Sbinkertn@umich.edu    #dmas = [ 'x', 'd', 'b' ]
491269Sbinkertn@umich.edu    dmas = [ 'x' ]
501162Sbinkertn@umich.edu    caches = [ '2', '4' ]
511049Sbinkertn@umich.edu
521049Sbinkertn@umich.edu    names = []
531269Sbinkertn@umich.edu
541269Sbinkertn@umich.edu    bench_system = {
551269Sbinkertn@umich.edu        'm' : 'client',
561269Sbinkertn@umich.edu        's' : 'client',
571269Sbinkertn@umich.edu        'snt' : 'client',
581269Sbinkertn@umich.edu        'nb1' : 'server',
591269Sbinkertn@umich.edu        'nb2' : 'server',
601269Sbinkertn@umich.edu        'nt1' : 'server',
611269Sbinkertn@umich.edu        'nt2' : 'server',
621269Sbinkertn@umich.edu        'w1' : 'server',
631269Sbinkertn@umich.edu        'w2' : 'server',
641269Sbinkertn@umich.edu        'w3' : 'server',
651269Sbinkertn@umich.edu        'w4' : 'server',
661269Sbinkertn@umich.edu        'w1s' : 'server',
671269Sbinkertn@umich.edu        'w2s' : 'server',
681269Sbinkertn@umich.edu        'w3s' : 'server',
691269Sbinkertn@umich.edu        'ns' : 'natbox',
701269Sbinkertn@umich.edu        'nm' : 'natbox',
711269Sbinkertn@umich.edu        'nw1' : 'natbox',
721269Sbinkertn@umich.edu        'nw2' : 'natbox',
731269Sbinkertn@umich.edu        'nw3' : 'natbox'
741269Sbinkertn@umich.edu        }
751269Sbinkertn@umich.edu
761049Sbinkertn@umich.edu    for bench in benchmarks:
771269Sbinkertn@umich.edu        if bench_system[bench] != options.system:
781269Sbinkertn@umich.edu            continue
791269Sbinkertn@umich.edu
801049Sbinkertn@umich.edu        for dma in dmas:
811049Sbinkertn@umich.edu            for cache in caches:
821269Sbinkertn@umich.edu                    names.append([bench, dma, cache])
831049Sbinkertn@umich.edu
841269Sbinkertn@umich.edu    for bench,dma,cache in names:
851269Sbinkertn@umich.edu        base = '%s.%s.%s' % (bench, dma, cache)
861165Sbinkertn@umich.edu        fname = 'data/%s.%s.dat' % (tag, base)
871049Sbinkertn@umich.edu        f = open(fname, 'w')
881049Sbinkertn@umich.edu        print >>f, '#set TITLE = %s' % base
891049Sbinkertn@umich.edu        print >>f, '#set xlbl = Configuration'
901049Sbinkertn@umich.edu        print >>f, '#set ylbl = %s' % label
911049Sbinkertn@umich.edu        print >>f, '#set sublabels = %s' % ' '.join(configs)
921049Sbinkertn@umich.edu
931049Sbinkertn@umich.edu        for speed,freq in zip(['s', 'q'],['4GHz','10GHz']):
941049Sbinkertn@umich.edu            print >>f, '"%s"' % freq,
951049Sbinkertn@umich.edu            for conf in configs:
961269Sbinkertn@umich.edu                name = '%s.%s.%s.%s.%s' % (conf, bench, dma, cache, speed)
971049Sbinkertn@umich.edu                run = info.source.allRunNames[name]
981049Sbinkertn@umich.edu                info.display_run = run.run;
991049Sbinkertn@umich.edu                val = float(value)
1001049Sbinkertn@umich.edu                if val == 1e300*1e300:
1011049Sbinkertn@umich.edu                    print >>f, 0.0,
1021049Sbinkertn@umich.edu                else:
1031049Sbinkertn@umich.edu                    print >>f, "%f" % val,
1041049Sbinkertn@umich.edu            print >>f
1051049Sbinkertn@umich.edu        f.close()
1061049Sbinkertn@umich.edu
1071049Sbinkertn@umich.edudef printdata(runs, value, invert = False):
1081049Sbinkertn@umich.edu    import info
1091049Sbinkertn@umich.edu    for run in runs:
1101049Sbinkertn@umich.edu        info.display_run = run.run;
1111049Sbinkertn@umich.edu        val = float(value)
1121049Sbinkertn@umich.edu        printval(run.name, val)
1131049Sbinkertn@umich.edu
1141049Sbinkertn@umich.educlass CommandException(Exception):
1151049Sbinkertn@umich.edu    pass
1161049Sbinkertn@umich.edu
1171049Sbinkertn@umich.edudef commands(options, command, args):
1181049Sbinkertn@umich.edu    if command == 'database':
1191049Sbinkertn@umich.edu        if len(args) == 0: raise CommandException
1201049Sbinkertn@umich.edu
1211049Sbinkertn@umich.edu        import dbinit
1221049Sbinkertn@umich.edu        mydb = dbinit.MyDB(options)
1231049Sbinkertn@umich.edu
1241049Sbinkertn@umich.edu        if args[0] == 'drop':
1251049Sbinkertn@umich.edu            if len(args) > 2: raise CommandException
1261049Sbinkertn@umich.edu            mydb.admin()
1271049Sbinkertn@umich.edu            mydb.drop()
1281049Sbinkertn@umich.edu            if len(args) == 2 and args[1] == 'init':
1291049Sbinkertn@umich.edu                mydb.create()
1301049Sbinkertn@umich.edu                mydb.connect()
1311049Sbinkertn@umich.edu                mydb.populate()
1321049Sbinkertn@umich.edu            mydb.close()
1331049Sbinkertn@umich.edu            return
1341049Sbinkertn@umich.edu
1351049Sbinkertn@umich.edu        if args[0] == 'init':
1361049Sbinkertn@umich.edu            if len(args) > 1: raise CommandException
1371049Sbinkertn@umich.edu            mydb.admin()
1381049Sbinkertn@umich.edu            mydb.create()
1391049Sbinkertn@umich.edu            mydb.connect()
1401049Sbinkertn@umich.edu            mydb.populate()
1411049Sbinkertn@umich.edu            mydb.close()
1421049Sbinkertn@umich.edu            return
1431049Sbinkertn@umich.edu
1441049Sbinkertn@umich.edu        if args[0] == 'clean':
1451049Sbinkertn@umich.edu            if len(args) > 1: raise CommandException
1461049Sbinkertn@umich.edu            mydb.connect()
1471049Sbinkertn@umich.edu            mydb.clean()
1481049Sbinkertn@umich.edu            return
1491049Sbinkertn@umich.edu
1501049Sbinkertn@umich.edu        raise CommandException
1511049Sbinkertn@umich.edu
1521049Sbinkertn@umich.edu    import db, info
1531049Sbinkertn@umich.edu    info.source = db.Database()
1541049Sbinkertn@umich.edu    info.source.host = options.host
1551049Sbinkertn@umich.edu    info.source.db = options.db
1561049Sbinkertn@umich.edu    info.source.passwd = options.passwd
1571049Sbinkertn@umich.edu    info.source.user = options.user
1581049Sbinkertn@umich.edu    info.source.connect()
1591049Sbinkertn@umich.edu    info.source.update_dict(globals())
1601049Sbinkertn@umich.edu
1611049Sbinkertn@umich.edu    if type(options.get) is str:
1621049Sbinkertn@umich.edu        info.source.get = options.get
1631049Sbinkertn@umich.edu
1641049Sbinkertn@umich.edu    if options.runs is None:
1651049Sbinkertn@umich.edu        runs = info.source.allRuns
1661049Sbinkertn@umich.edu    else:
1671049Sbinkertn@umich.edu        rx = re.compile(options.runs)
1681049Sbinkertn@umich.edu        runs = []
1691049Sbinkertn@umich.edu        for run in info.source.allRuns:
1701049Sbinkertn@umich.edu            if rx.match(run.name):
1711049Sbinkertn@umich.edu                runs.append(run)
1721049Sbinkertn@umich.edu
1731049Sbinkertn@umich.edu    info.display_run = runs[0].run
1741049Sbinkertn@umich.edu
1751049Sbinkertn@umich.edu    if command == 'runs':
1761049Sbinkertn@umich.edu        user = None
1771049Sbinkertn@umich.edu        opts, args = getopts(args, '-u')
1781049Sbinkertn@umich.edu        if len(args):
1791049Sbinkertn@umich.edu            raise CommandException
1801049Sbinkertn@umich.edu        for o,a in opts:
1811049Sbinkertn@umich.edu            if o == '-u':
1821049Sbinkertn@umich.edu                user = a
1831049Sbinkertn@umich.edu        info.source.listRuns(user)
1841049Sbinkertn@umich.edu        return
1851049Sbinkertn@umich.edu
1861049Sbinkertn@umich.edu    if command == 'stats':
1871049Sbinkertn@umich.edu        if len(args) == 0:
1881049Sbinkertn@umich.edu            info.source.listStats()
1891049Sbinkertn@umich.edu        elif len(args) == 1:
1901049Sbinkertn@umich.edu            info.source.listStats(args[0])
1911049Sbinkertn@umich.edu        else:
1921049Sbinkertn@umich.edu            raise CommandException
1931049Sbinkertn@umich.edu
1941049Sbinkertn@umich.edu        return
1951049Sbinkertn@umich.edu
1961049Sbinkertn@umich.edu    if command == 'stat':
1971049Sbinkertn@umich.edu        if len(args) != 1:
1981049Sbinkertn@umich.edu            raise CommandException
1991049Sbinkertn@umich.edu
2001049Sbinkertn@umich.edu        stats = info.source.getStat(args[0])
2011049Sbinkertn@umich.edu        for stat in stats:
2021076Sbinkertn@umich.edu            if options.graph:
2031269Sbinkertn@umich.edu                graphdata(runs, options, stat.name, stat.name, stat)
2041049Sbinkertn@umich.edu            else:
2051301Ssaidi@eecs.umich.edu                if options.ticks:
2061301Ssaidi@eecs.umich.edu                   print 'only displaying sample %s' % options.ticks
2071301Ssaidi@eecs.umich.edu                   stat.ticks = options.ticks
2081301Ssaidi@eecs.umich.edu
2091165Sbinkertn@umich.edu                if options.binned:
2101165Sbinkertn@umich.edu                    print 'kernel ticks'
2111165Sbinkertn@umich.edu                    stat.bins = 'kernel'
2121165Sbinkertn@umich.edu                    printdata(runs, stat)
2131165Sbinkertn@umich.edu
2141165Sbinkertn@umich.edu                    print 'idle ticks'
2151165Sbinkertn@umich.edu                    stat.bins = 'idle'
2161165Sbinkertn@umich.edu                    printdata(runs, stat)
2171165Sbinkertn@umich.edu
2181165Sbinkertn@umich.edu                    print 'user ticks'
2191165Sbinkertn@umich.edu                    stat.bins = 'user'
2201165Sbinkertn@umich.edu                    printdata(runs, stat)
2211165Sbinkertn@umich.edu
2221165Sbinkertn@umich.edu                    print 'interrupt ticks'
2231301Ssaidi@eecs.umich.edu                    stat.bins = 'interrupt'
2241165Sbinkertn@umich.edu                    printdata(runs, stat)
2251165Sbinkertn@umich.edu
2261165Sbinkertn@umich.edu                    print 'total ticks'
2271165Sbinkertn@umich.edu
2281165Sbinkertn@umich.edu                stat.bins = None
2291049Sbinkertn@umich.edu                print stat.name
2301049Sbinkertn@umich.edu                printdata(runs, stat)
2311049Sbinkertn@umich.edu        return
2321049Sbinkertn@umich.edu
2331269Sbinkertn@umich.edu    if command == 'formula':
2341269Sbinkertn@umich.edu        if len(args) != 1:
2351269Sbinkertn@umich.edu            raise CommandException
2361269Sbinkertn@umich.edu
2371269Sbinkertn@umich.edu        stats = eval(args[0])
2381269Sbinkertn@umich.edu        for stat in stats:
2391269Sbinkertn@umich.edu            if options.graph:
2401269Sbinkertn@umich.edu                graphdata(runs, options, stat.name, stat.name, stat)
2411269Sbinkertn@umich.edu            else:
2421269Sbinkertn@umich.edu                if options.binned:
2431269Sbinkertn@umich.edu                    print 'kernel ticks'
2441269Sbinkertn@umich.edu                    stat.bins = 'kernel'
2451269Sbinkertn@umich.edu                    printdata(runs, stat)
2461269Sbinkertn@umich.edu
2471269Sbinkertn@umich.edu                    print 'idle ticks'
2481269Sbinkertn@umich.edu                    stat.bins = 'idle'
2491269Sbinkertn@umich.edu                    printdata(runs, stat)
2501269Sbinkertn@umich.edu
2511269Sbinkertn@umich.edu                    print 'user ticks'
2521269Sbinkertn@umich.edu                    stat.bins = 'user'
2531269Sbinkertn@umich.edu                    printdata(runs, stat)
2541269Sbinkertn@umich.edu
2551269Sbinkertn@umich.edu                    print 'interrupt ticks'
2561301Ssaidi@eecs.umich.edu                    stat.bins = 'interrupt'
2571269Sbinkertn@umich.edu                    printdata(runs, stat)
2581269Sbinkertn@umich.edu
2591269Sbinkertn@umich.edu                    print 'total ticks'
2601269Sbinkertn@umich.edu
2611269Sbinkertn@umich.edu                stat.bins = None
2621269Sbinkertn@umich.edu                print args[0]
2631269Sbinkertn@umich.edu                printdata(runs, stat)
2641269Sbinkertn@umich.edu        return
2651269Sbinkertn@umich.edu
2661049Sbinkertn@umich.edu    if command == 'bins':
2671049Sbinkertn@umich.edu        if len(args) == 0:
2681049Sbinkertn@umich.edu            info.source.listBins()
2691049Sbinkertn@umich.edu        elif len(args) == 1:
2701049Sbinkertn@umich.edu            info.source.listBins(args[0])
2711049Sbinkertn@umich.edu        else:
2721049Sbinkertn@umich.edu            raise CommandException
2731049Sbinkertn@umich.edu
2741049Sbinkertn@umich.edu        return
2751049Sbinkertn@umich.edu
2761049Sbinkertn@umich.edu    if command == 'formulas':
2771049Sbinkertn@umich.edu        if len(args) == 0:
2781049Sbinkertn@umich.edu            info.source.listFormulas()
2791049Sbinkertn@umich.edu        elif len(args) == 1:
2801049Sbinkertn@umich.edu            info.source.listFormulas(args[0])
2811049Sbinkertn@umich.edu        else:
2821049Sbinkertn@umich.edu            raise CommandException
2831049Sbinkertn@umich.edu
2841049Sbinkertn@umich.edu        return
2851049Sbinkertn@umich.edu
2861049Sbinkertn@umich.edu    if command == 'samples':
2871049Sbinkertn@umich.edu        if len(args):
2881049Sbinkertn@umich.edu            raise CommandException
2891049Sbinkertn@umich.edu
2901049Sbinkertn@umich.edu        info.source.listTicks(runs)
2911049Sbinkertn@umich.edu        return
2921049Sbinkertn@umich.edu
2931049Sbinkertn@umich.edu    if len(args):
2941049Sbinkertn@umich.edu        raise CommandException
2951049Sbinkertn@umich.edu
2961209Sbinkertn@umich.edu    system = info.source.__dict__[options.system]
2971209Sbinkertn@umich.edu
2981049Sbinkertn@umich.edu    if command == 'usertime':
2991049Sbinkertn@umich.edu        import copy
3001049Sbinkertn@umich.edu        kernel = copy.copy(system.full_cpu.numCycles)
3011049Sbinkertn@umich.edu        kernel.bins = 'kernel'
3021049Sbinkertn@umich.edu
3031049Sbinkertn@umich.edu        user = copy.copy(system.full_cpu.numCycles)
3041049Sbinkertn@umich.edu        user.bins = 'user'
3051049Sbinkertn@umich.edu
3061076Sbinkertn@umich.edu        if options.graph:
3071269Sbinkertn@umich.edu            graphdata(runs, options, 'usertime', 'User Fraction',
3081049Sbinkertn@umich.edu                      user / system.full_cpu.numCycles)
3091049Sbinkertn@umich.edu        else:
3101049Sbinkertn@umich.edu            printdata(runs, user / system.full_cpu.numCycles)
3111049Sbinkertn@umich.edu        return
3121049Sbinkertn@umich.edu
3131049Sbinkertn@umich.edu    if command == 'ticks':
3141076Sbinkertn@umich.edu        if options.binned:
3151049Sbinkertn@umich.edu            print 'kernel ticks'
3161049Sbinkertn@umich.edu            system.full_cpu.numCycles.bins = 'kernel'
3171049Sbinkertn@umich.edu            printdata(runs, system.full_cpu.numCycles)
3181049Sbinkertn@umich.edu
3191049Sbinkertn@umich.edu            print 'idle ticks'
3201049Sbinkertn@umich.edu            system.full_cpu.numCycles.bins = 'idle'
3211049Sbinkertn@umich.edu            printdata(runs, system.full_cpu.numCycles)
3221049Sbinkertn@umich.edu
3231049Sbinkertn@umich.edu            print 'user ticks'
3241049Sbinkertn@umich.edu            system.full_cpu.numCycles.bins = 'user'
3251049Sbinkertn@umich.edu            printdata(runs, system.full_cpu.numCycles)
3261049Sbinkertn@umich.edu
3271049Sbinkertn@umich.edu            print 'total ticks'
3281049Sbinkertn@umich.edu
3291049Sbinkertn@umich.edu        system.full_cpu.numCycles.bins = None
3301049Sbinkertn@umich.edu        printdata(runs, system.full_cpu.numCycles)
3311049Sbinkertn@umich.edu        return
3321049Sbinkertn@umich.edu
3331049Sbinkertn@umich.edu    if command == 'packets':
3341162Sbinkertn@umich.edu        packets = system.tsunami.etherdev.rxPackets
3351076Sbinkertn@umich.edu        if options.graph:
3361269Sbinkertn@umich.edu            graphdata(runs, options, 'packets', 'Packets', packets)
3371049Sbinkertn@umich.edu        else:
3381049Sbinkertn@umich.edu            printdata(runs, packets)
3391049Sbinkertn@umich.edu        return
3401049Sbinkertn@umich.edu
3411049Sbinkertn@umich.edu    if command == 'ppt' or command == 'tpp':
3421162Sbinkertn@umich.edu        ppt = system.tsunami.etherdev.rxPackets / sim_ticks
3431049Sbinkertn@umich.edu        printdata(runs, ppt, command == 'tpp')
3441049Sbinkertn@umich.edu        return
3451049Sbinkertn@umich.edu
3461049Sbinkertn@umich.edu    if command == 'pps':
3471162Sbinkertn@umich.edu        pps = system.tsunami.etherdev.rxPackets / sim_seconds
3481076Sbinkertn@umich.edu        if options.graph:
3491269Sbinkertn@umich.edu            graphdata(runs, options, 'pps', 'Packets/s', pps)
3501049Sbinkertn@umich.edu        else:
3511049Sbinkertn@umich.edu            printdata(runs, pps)
3521049Sbinkertn@umich.edu        return
3531049Sbinkertn@umich.edu
3541049Sbinkertn@umich.edu    if command == 'bpt' or command == 'tpb':
3551162Sbinkertn@umich.edu        bytes = system.tsunami.etherdev.rxBytes + system.tsunami.etherdev.txBytes
3561049Sbinkertn@umich.edu        bpt = bytes / sim_ticks * 8
3571076Sbinkertn@umich.edu        if options.graph:
3581269Sbinkertn@umich.edu            graphdata(runs, options, 'bpt', 'bps / Hz', bpt)
3591049Sbinkertn@umich.edu        else:
3601049Sbinkertn@umich.edu            printdata(runs, bpt, command == 'tpb')
3611049Sbinkertn@umich.edu        return
3621049Sbinkertn@umich.edu
3631049Sbinkertn@umich.edu    if command == 'bptb' or command == 'tpbb':
3641162Sbinkertn@umich.edu        bytes = system.tsunami.etherdev.rxBytes + system.tsunami.etherdev.txBytes
3651049Sbinkertn@umich.edu
3661049Sbinkertn@umich.edu        print 'kernel stats'
3671049Sbinkertn@umich.edu        bytes.bins = 'kernel'
3681049Sbinkertn@umich.edu        printdata(runs, bytes / ticks)
3691049Sbinkertn@umich.edu
3701049Sbinkertn@umich.edu        print 'idle stats'
3711049Sbinkertn@umich.edu        bytes.bins = 'idle'
3721049Sbinkertn@umich.edu        printdata(runs, bytes / ticks)
3731049Sbinkertn@umich.edu
3741049Sbinkertn@umich.edu        print 'user stats'
3751049Sbinkertn@umich.edu        bytes.bins = 'user'
3761049Sbinkertn@umich.edu        printdata(runs, bytes / ticks)
3771049Sbinkertn@umich.edu
3781049Sbinkertn@umich.edu        return
3791049Sbinkertn@umich.edu
3801049Sbinkertn@umich.edu    if command == 'bytes':
3811162Sbinkertn@umich.edu        stat = system.tsunami.etherdev.rxBytes + system.tsunami.etherdev.txBytes
3821049Sbinkertn@umich.edu
3831076Sbinkertn@umich.edu        if options.binned:
3841049Sbinkertn@umich.edu            print '%s kernel stats' % stat.name
3851049Sbinkertn@umich.edu            stat.bins = 'kernel'
3861049Sbinkertn@umich.edu            printdata(runs, stat)
3871049Sbinkertn@umich.edu
3881049Sbinkertn@umich.edu            print '%s idle stats' % stat.name
3891049Sbinkertn@umich.edu            stat.bins = 'idle'
3901049Sbinkertn@umich.edu            printdata(runs, stat)
3911049Sbinkertn@umich.edu
3921049Sbinkertn@umich.edu            print '%s user stats' % stat.name
3931049Sbinkertn@umich.edu            stat.bins = 'user'
3941049Sbinkertn@umich.edu            printdata(runs, stat)
3951049Sbinkertn@umich.edu
3961049Sbinkertn@umich.edu            print '%s total stats' % stat.name
3971049Sbinkertn@umich.edu            stat.bins = None
3981049Sbinkertn@umich.edu
3991049Sbinkertn@umich.edu        printdata(runs, stat)
4001049Sbinkertn@umich.edu        return
4011049Sbinkertn@umich.edu
4021049Sbinkertn@umich.edu    if command == 'rxbps':
4031162Sbinkertn@umich.edu        gbps = system.tsunami.etherdev.rxBandwidth / 1e9
4041076Sbinkertn@umich.edu        if options.graph:
4051269Sbinkertn@umich.edu            graphdata(runs, options, 'rxbps', 'Bandwidth (Gbps)',  gbps)
4061049Sbinkertn@umich.edu        else:
4071049Sbinkertn@umich.edu            printdata(runs, gbps)
4081049Sbinkertn@umich.edu        return
4091049Sbinkertn@umich.edu
4101049Sbinkertn@umich.edu    if command == 'txbps':
4111162Sbinkertn@umich.edu        gbps = system.tsunami.etherdev.txBandwidth / 1e9
4121076Sbinkertn@umich.edu        if options.graph:
4131269Sbinkertn@umich.edu            graphdata(runs, options, 'txbps', 'Bandwidth (Gbps)',  gbps)
4141049Sbinkertn@umich.edu        else:
4151049Sbinkertn@umich.edu            printdata(runs, gbps)
4161049Sbinkertn@umich.edu        return
4171049Sbinkertn@umich.edu
4181049Sbinkertn@umich.edu    if command == 'bps':
4191162Sbinkertn@umich.edu        rxbps = system.tsunami.etherdev.rxBandwidth
4201162Sbinkertn@umich.edu        txbps = system.tsunami.etherdev.txBandwidth
4211049Sbinkertn@umich.edu        gbps = (rxbps + txbps) / 1e9
4221076Sbinkertn@umich.edu        if options.graph:
4231269Sbinkertn@umich.edu            graphdata(runs, options, 'bps', 'Bandwidth (Gbps)',  gbps)
4241049Sbinkertn@umich.edu        else:
4251049Sbinkertn@umich.edu            printdata(runs, gbps)
4261049Sbinkertn@umich.edu        return
4271049Sbinkertn@umich.edu
4281049Sbinkertn@umich.edu    if command == 'misses':
4291162Sbinkertn@umich.edu        stat = system.L2.overall_mshr_misses
4301076Sbinkertn@umich.edu        if options.binned:
4311049Sbinkertn@umich.edu            print '%s kernel stats' % stat.name
4321049Sbinkertn@umich.edu            stat.bins = 'kernel'
4331049Sbinkertn@umich.edu            printdata(runs, stat)
4341049Sbinkertn@umich.edu
4351049Sbinkertn@umich.edu            print '%s idle stats' % stat.name
4361049Sbinkertn@umich.edu            stat.bins = 'idle'
4371049Sbinkertn@umich.edu            printdata(runs, stat)
4381049Sbinkertn@umich.edu
4391049Sbinkertn@umich.edu            print '%s user stats' % stat.name
4401049Sbinkertn@umich.edu            stat.bins = 'user'
4411049Sbinkertn@umich.edu            printdata(runs, stat)
4421049Sbinkertn@umich.edu
4431049Sbinkertn@umich.edu            print '%s total stats' % stat.name
4441049Sbinkertn@umich.edu
4451049Sbinkertn@umich.edu        stat.bins = None
4461076Sbinkertn@umich.edu        if options.graph:
4471269Sbinkertn@umich.edu            graphdata(runs, options, 'misses', 'Overall MSHR Misses', stat)
4481049Sbinkertn@umich.edu        else:
4491049Sbinkertn@umich.edu            printdata(runs, stat)
4501049Sbinkertn@umich.edu        return
4511049Sbinkertn@umich.edu
4521049Sbinkertn@umich.edu    if command == 'mpkb':
4531162Sbinkertn@umich.edu        misses = system.L2.overall_mshr_misses
4541162Sbinkertn@umich.edu        rxbytes = system.tsunami.etherdev.rxBytes
4551162Sbinkertn@umich.edu        txbytes = system.tsunami.etherdev.txBytes
4561049Sbinkertn@umich.edu
4571076Sbinkertn@umich.edu        if options.binned:
4581049Sbinkertn@umich.edu            print 'mpkb kernel stats'
4591049Sbinkertn@umich.edu            misses.bins = 'kernel'
4601049Sbinkertn@umich.edu            mpkb = misses / ((rxbytes + txbytes) / 1024)
4611049Sbinkertn@umich.edu            printdata(runs, mpkb)
4621049Sbinkertn@umich.edu
4631049Sbinkertn@umich.edu            print 'mpkb idle stats'
4641049Sbinkertn@umich.edu            misses.bins = 'idle'
4651049Sbinkertn@umich.edu            mpkb = misses / ((rxbytes + txbytes) / 1024)
4661049Sbinkertn@umich.edu            printdata(runs, mpkb)
4671049Sbinkertn@umich.edu
4681049Sbinkertn@umich.edu            print 'mpkb user stats'
4691049Sbinkertn@umich.edu            misses.bins = 'user'
4701049Sbinkertn@umich.edu            mpkb = misses / ((rxbytes + txbytes) / 1024)
4711049Sbinkertn@umich.edu            printdata(runs, mpkb)
4721049Sbinkertn@umich.edu
4731049Sbinkertn@umich.edu            print 'mpkb total stats'
4741049Sbinkertn@umich.edu
4751049Sbinkertn@umich.edu        mpkb = misses / ((rxbytes + txbytes) / 1024)
4761049Sbinkertn@umich.edu        misses.bins = None
4771076Sbinkertn@umich.edu        if options.graph:
4781269Sbinkertn@umich.edu            graphdata(runs, options, 'mpkb', 'Misses / KB',  mpkb)
4791049Sbinkertn@umich.edu        else:
4801049Sbinkertn@umich.edu            printdata(runs, mpkb)
4811049Sbinkertn@umich.edu        return
4821049Sbinkertn@umich.edu
4831269Sbinkertn@umich.edu    if command == 'ipkb':
4841269Sbinkertn@umich.edu        interrupts = system.full_cpu.kern.faults[4]
4851269Sbinkertn@umich.edu        rxbytes = system.tsunami.etherdev.rxBytes
4861269Sbinkertn@umich.edu        txbytes = system.tsunami.etherdev.txBytes
4871269Sbinkertn@umich.edu
4881269Sbinkertn@umich.edu        if options.binned:
4891269Sbinkertn@umich.edu            print 'ipkb kernel stats'
4901269Sbinkertn@umich.edu            interrupts.bins = 'kernel'
4911269Sbinkertn@umich.edu            ipkb = interrupts / ((rxbytes + txbytes) / 1024)
4921269Sbinkertn@umich.edu            printdata(runs, ipkb)
4931269Sbinkertn@umich.edu
4941269Sbinkertn@umich.edu            print 'ipkb idle stats'
4951269Sbinkertn@umich.edu            interrupts.bins = 'idle'
4961269Sbinkertn@umich.edu            ipkb = interrupts / ((rxbytes + txbytes) / 1024)
4971269Sbinkertn@umich.edu            printdata(runs, ipkb)
4981269Sbinkertn@umich.edu
4991269Sbinkertn@umich.edu            print 'ipkb user stats'
5001269Sbinkertn@umich.edu            interrupts.bins = 'user'
5011269Sbinkertn@umich.edu            ipkb = interrupts / ((rxbytes + txbytes) / 1024)
5021269Sbinkertn@umich.edu            printdata(runs, ipkb)
5031269Sbinkertn@umich.edu
5041269Sbinkertn@umich.edu            print 'ipkb total stats'
5051269Sbinkertn@umich.edu
5061269Sbinkertn@umich.edu        ipkb = interrupts / ((rxbytes + txbytes) / 1024)
5071269Sbinkertn@umich.edu        interrupts.bins = None
5081269Sbinkertn@umich.edu        if options.graph:
5091269Sbinkertn@umich.edu            graphdata(runs, options, 'ipkb', 'Interrupts / KB',  ipkb)
5101269Sbinkertn@umich.edu        else:
5111269Sbinkertn@umich.edu            printdata(runs, ipkb)
5121269Sbinkertn@umich.edu        return
5131269Sbinkertn@umich.edu
5141049Sbinkertn@umich.edu    if command == 'execute':
5151049Sbinkertn@umich.edu        printdata(runs, system.full_cpu.ISSUE__count)
5161049Sbinkertn@umich.edu        return
5171049Sbinkertn@umich.edu
5181049Sbinkertn@umich.edu    if command == 'commit':
5191049Sbinkertn@umich.edu        printdata(runs, system.full_cpu.COM__count)
5201049Sbinkertn@umich.edu        return
5211049Sbinkertn@umich.edu
5221049Sbinkertn@umich.edu    if command == 'fetch':
5231049Sbinkertn@umich.edu        printdata(runs, system.full_cpu.FETCH__count)
5241049Sbinkertn@umich.edu        return
5251049Sbinkertn@umich.edu
5261162Sbinkertn@umich.edu    if command == 'bpp':
5271162Sbinkertn@umich.edu        ed = system.tsunami.etherdev
5281162Sbinkertn@umich.edu        bpp = (ed.rxBytes + ed.txBytes) / (ed.rxPackets + ed.txPackets)
5291162Sbinkertn@umich.edu        if options.graph:
5301269Sbinkertn@umich.edu            graphdata(runs, options, 'bpp', 'Bytes / Packet',  bpp)
5311162Sbinkertn@umich.edu        else:
5321162Sbinkertn@umich.edu            printdata(runs, bpp)
5331162Sbinkertn@umich.edu        return
5341162Sbinkertn@umich.edu
5351049Sbinkertn@umich.edu    if command == 'rxbpp':
5361162Sbinkertn@umich.edu        bpp = system.tsunami.etherdev.rxBytes / system.tsunami.etherdev.rxPackets
5371162Sbinkertn@umich.edu        if options.graph:
5381269Sbinkertn@umich.edu            graphdata(runs, options, 'rxbpp', 'Receive Bytes / Packet',  bpp)
5391162Sbinkertn@umich.edu        else:
5401162Sbinkertn@umich.edu            printdata(runs, bpp)
5411049Sbinkertn@umich.edu        return
5421049Sbinkertn@umich.edu
5431049Sbinkertn@umich.edu    if command == 'txbpp':
5441162Sbinkertn@umich.edu        bpp = system.tsunami.etherdev.txBytes / system.tsunami.etherdev.txPackets
5451162Sbinkertn@umich.edu        if options.graph:
5461269Sbinkertn@umich.edu            graphdata(runs, options, 'txbpp', 'Transmit Bytes / Packet',  bpp)
5471162Sbinkertn@umich.edu        else:
5481162Sbinkertn@umich.edu            printdata(runs, bpp)
5491162Sbinkertn@umich.edu        return
5501162Sbinkertn@umich.edu
5511162Sbinkertn@umich.edu    if command == 'rtp':
5521162Sbinkertn@umich.edu        rtp = system.tsunami.etherdev.rxPackets / system.tsunami.etherdev.txPackets
5531162Sbinkertn@umich.edu        if options.graph:
5541269Sbinkertn@umich.edu            graphdata(runs, options, 'rtp', 'rxPackets / txPackets',  rtp)
5551162Sbinkertn@umich.edu        else:
5561162Sbinkertn@umich.edu            printdata(runs, rtp)
5571162Sbinkertn@umich.edu        return
5581162Sbinkertn@umich.edu
5591162Sbinkertn@umich.edu    if command == 'rtb':
5601162Sbinkertn@umich.edu        rtb = system.tsunami.etherdev.rxBytes / system.tsunami.etherdev.txBytes
5611162Sbinkertn@umich.edu        if options.graph:
5621269Sbinkertn@umich.edu            graphdata(runs, options, 'rtb', 'rxBytes / txBytes',  rtb)
5631162Sbinkertn@umich.edu        else:
5641162Sbinkertn@umich.edu            printdata(runs, rtb)
5651049Sbinkertn@umich.edu        return
5661049Sbinkertn@umich.edu
5671049Sbinkertn@umich.edu    raise CommandException
5681049Sbinkertn@umich.edu
5691049Sbinkertn@umich.edu
5701049Sbinkertn@umich.educlass Options: pass
5711049Sbinkertn@umich.edu
5721049Sbinkertn@umich.eduif __name__ == '__main__':
5731049Sbinkertn@umich.edu    import getpass
5741049Sbinkertn@umich.edu
5751049Sbinkertn@umich.edu    options = Options()
5761049Sbinkertn@umich.edu    options.host = 'zizzer.pool'
5771049Sbinkertn@umich.edu    options.db = None
5781049Sbinkertn@umich.edu    options.passwd = ''
5791049Sbinkertn@umich.edu    options.user = getpass.getuser()
5801049Sbinkertn@umich.edu    options.runs = None
5811049Sbinkertn@umich.edu    options.system = 'client'
5821049Sbinkertn@umich.edu    options.get = None
5831076Sbinkertn@umich.edu    options.binned = False
5841076Sbinkertn@umich.edu    options.graph = False
5851301Ssaidi@eecs.umich.edu    options.ticks = False
5861049Sbinkertn@umich.edu
5871301Ssaidi@eecs.umich.edu    opts, args = getopts(sys.argv[1:], '-BEFGd:g:h:pr:s:u:T:')
5881049Sbinkertn@umich.edu    for o,a in opts:
5891049Sbinkertn@umich.edu        if o == '-B':
5901049Sbinkertn@umich.edu            options.binned = True
5911049Sbinkertn@umich.edu        if o == '-E':
5921049Sbinkertn@umich.edu            printval.mode = 'E'
5931049Sbinkertn@umich.edu        if o == '-F':
5941049Sbinkertn@umich.edu            printval.mode = 'F'
5951049Sbinkertn@umich.edu        if o == '-G':
5961049Sbinkertn@umich.edu            options.graph = True;
5971049Sbinkertn@umich.edu        if o == '-d':
5981049Sbinkertn@umich.edu            options.db = a
5991049Sbinkertn@umich.edu        if o == '-g':
6001049Sbinkertn@umich.edu            options.get = a
6011049Sbinkertn@umich.edu        if o == '-h':
6021049Sbinkertn@umich.edu            options.host = a
6031049Sbinkertn@umich.edu        if o == '-p':
6041049Sbinkertn@umich.edu            options.passwd = getpass.getpass()
6051049Sbinkertn@umich.edu        if o == '-r':
6061049Sbinkertn@umich.edu            options.runs = a
6071049Sbinkertn@umich.edu        if o == '-u':
6081049Sbinkertn@umich.edu            options.user = a
6091049Sbinkertn@umich.edu        if o == '-s':
6101049Sbinkertn@umich.edu            options.system = a
6111301Ssaidi@eecs.umich.edu        if o == '-T':
6121301Ssaidi@eecs.umich.edu            options.ticks = a
6131049Sbinkertn@umich.edu
6141049Sbinkertn@umich.edu    if len(args) == 0:
6151049Sbinkertn@umich.edu        usage()
6161049Sbinkertn@umich.edu
6171049Sbinkertn@umich.edu    command = args[0]
6181049Sbinkertn@umich.edu    args = args[1:]
6191049Sbinkertn@umich.edu
6201049Sbinkertn@umich.edu    try:
6211049Sbinkertn@umich.edu        commands(options, command, args)
6221049Sbinkertn@umich.edu    except CommandException:
6231049Sbinkertn@umich.edu        usage()
624