stats.py revision 1317
113540Sandrea.mondelli@ucf.edu#!/usr/bin/env python
21376Sbinkertn@umich.edufrom __future__ import division
31376Sbinkertn@umich.eduimport re, sys
41376Sbinkertn@umich.edu
51376Sbinkertn@umich.edudef usage():
61376Sbinkertn@umich.edu    print '''\
71376Sbinkertn@umich.eduUsage: %s [-E] [-F] [-d <db> ] [-g <get> ] [-h <host>] [-p]
81376Sbinkertn@umich.edu       [-s <system>] [-r <runs> ] [-u <username>] <command> [command args]
91376Sbinkertn@umich.edu''' % sys.argv[0]
101376Sbinkertn@umich.edu    sys.exit(1)
111376Sbinkertn@umich.edu
121376Sbinkertn@umich.edudef getopts(list, flags):
131376Sbinkertn@umich.edu    import getopt
141376Sbinkertn@umich.edu    try:
151376Sbinkertn@umich.edu        opts, args = getopt.getopt(list, flags)
161376Sbinkertn@umich.edu    except getopt.GetoptError:
171376Sbinkertn@umich.edu        usage()
181376Sbinkertn@umich.edu
191376Sbinkertn@umich.edu    return opts, args
201376Sbinkertn@umich.edu
211376Sbinkertn@umich.edudef printval(name, value, invert = False):
221376Sbinkertn@umich.edu    if invert and value != 0.0:
231376Sbinkertn@umich.edu        value = 1 / value
241376Sbinkertn@umich.edu
251376Sbinkertn@umich.edu    if value == (1e300*1e300):
261376Sbinkertn@umich.edu        return
271376Sbinkertn@umich.edu
281376Sbinkertn@umich.edu    if printval.mode == 'G':
291376Sbinkertn@umich.edu        print '%s:    %g' % (name, value)
301376Sbinkertn@umich.edu    elif printval.mode != 'F' and value > 1e6:
311385Sbinkertn@umich.edu        print '%s:    %0.5e' % (name, value)
321376Sbinkertn@umich.edu    else:
331816Sbinkertn@umich.edu        print '%s:    %f' % (name, value)
341376Sbinkertn@umich.edu
351816Sbinkertn@umich.eduprintval.mode = 'G'
361376Sbinkertn@umich.edu
371385Sbinkertn@umich.edudef unique(list):
381385Sbinkertn@umich.edu    set = {}
391385Sbinkertn@umich.edu    map(set.__setitem__, list, [])
401385Sbinkertn@umich.edu    return set.keys()
411385Sbinkertn@umich.edu
421385Sbinkertn@umich.edudef graphdata68(runs, options, tag, label, value):
431385Sbinkertn@umich.edu    import info
441816Sbinkertn@umich.edu    configs = ['ste', 'hte', 'htd', 'ocm', 'occ', 'ocp' ]
451816Sbinkertn@umich.edu    benchmarks = [ 'm', 's', 'snt', 'nb1', 'w1', 'w2', 'w3', 'w4', 'nm', 'ns', 'nw1', 'nw2', 'nw3' ]
461816Sbinkertn@umich.edu    dmas = [ 'x' ]
471816Sbinkertn@umich.edu    caches = [ '2', '4' ]
481816Sbinkertn@umich.edu
491816Sbinkertn@umich.edu    names = []
501816Sbinkertn@umich.edu
511816Sbinkertn@umich.edu    bench_system = {
521816Sbinkertn@umich.edu        'm' : 'client',
531816Sbinkertn@umich.edu        's' : 'client',
541816Sbinkertn@umich.edu        'snt' : 'client',
551816Sbinkertn@umich.edu        'nb1' : 'server',
561816Sbinkertn@umich.edu        'nb2' : 'server',
571816Sbinkertn@umich.edu        'nt1' : 'server',
581816Sbinkertn@umich.edu        'nt2' : 'server',
591816Sbinkertn@umich.edu        'w1' : 'server',
601816Sbinkertn@umich.edu        'w2' : 'server',
611816Sbinkertn@umich.edu        'w3' : 'server',
621816Sbinkertn@umich.edu        'w4' : 'server',
631816Sbinkertn@umich.edu        'w1s' : 'server',
641816Sbinkertn@umich.edu        'w2s' : 'server',
651816Sbinkertn@umich.edu        'w3s' : 'server',
661816Sbinkertn@umich.edu        'ns' : 'natbox',
671816Sbinkertn@umich.edu        'nm' : 'natbox',
681816Sbinkertn@umich.edu        'nw1' : 'natbox',
691816Sbinkertn@umich.edu        'nw2' : 'natbox',
701816Sbinkertn@umich.edu        'nw3' : 'natbox'
711816Sbinkertn@umich.edu        }
721816Sbinkertn@umich.edu
731816Sbinkertn@umich.edu    for bench in benchmarks:
741816Sbinkertn@umich.edu        if bench_system[bench] != options.system:
751816Sbinkertn@umich.edu            continue
761385Sbinkertn@umich.edu
771376Sbinkertn@umich.edu        for dma in dmas:
781376Sbinkertn@umich.edu            for cache in caches:
791376Sbinkertn@umich.edu                    names.append([bench, dma, cache])
801602Sbinkertn@umich.edu
811376Sbinkertn@umich.edu    for bench,dma,cache in names:
821956Ssaidi@eecs.umich.edu        base = '%s.%s.%s' % (bench, dma, cache)
831956Ssaidi@eecs.umich.edu        fname = 'data/%s.%s.68.dat' % (tag, base)
841376Sbinkertn@umich.edu        f = open(fname, 'w')
851376Sbinkertn@umich.edu        print >>f, '#set TITLE = '
861376Sbinkertn@umich.edu        print >>f, '#set ylbl = %s' % label
871916Sbinkertn@umich.edu        #print >>f, '#set sublabels = %s' % ' '.join(configs)
881376Sbinkertn@umich.edu        print >>f, '#set sublabels = ste hte htd ocm occ ocs'
891376Sbinkertn@umich.edu
901602Sbinkertn@umich.edu        for speed,freq in zip(['s', '6', '8', 'q'],['4GHz', '6GHz','8GHz', '10GHz']):
911916Sbinkertn@umich.edu            print >>f, '"%s"' % freq,
921376Sbinkertn@umich.edu            for conf in configs:
931376Sbinkertn@umich.edu                name = '%s.%s.%s.%s.%s' % (conf, bench, dma, cache, speed)
941376Sbinkertn@umich.edu                run = info.source.allRunNames[name]
951376Sbinkertn@umich.edu                info.display_run = run.run;
961376Sbinkertn@umich.edu                val = float(value)
971376Sbinkertn@umich.edu                if val == 1e300*1e300:
981376Sbinkertn@umich.edu                    print >>f, 0.0,
991376Sbinkertn@umich.edu                else:
1001376Sbinkertn@umich.edu                    print >>f, "%f" % val,
1011948Sbinkertn@umich.edu            print >>f
1021376Sbinkertn@umich.edu        f.close()
1031376Sbinkertn@umich.edu
1041376Sbinkertn@umich.edudef graphdata(runs, options, tag, label, value):
1051916Sbinkertn@umich.edu    if options.graph68:
1061376Sbinkertn@umich.edu        graphdata68(runs, options, tag, label, value)
1071376Sbinkertn@umich.edu        return
1081376Sbinkertn@umich.edu
1091376Sbinkertn@umich.edu    import info
1101376Sbinkertn@umich.edu    configs = ['ste', 'hte', 'htd', 'ocm', 'occ', 'ocp' ]
1111376Sbinkertn@umich.edu    #benchmarks = [ 'm', 's', 'nb1', 'nb2', 'nt1', 'nt2', 'w1', 'w2', 'w3', 'w4', 'ns', 'nm', 'nw1', 'nw2', 'nw3' ]
1121376Sbinkertn@umich.edu    #benchmarks = [ 'm', 's', 'nb1', 'nb2', 'nt1', 'w1', 'w2', 'w3', 'ns', 'nm', 'w1s' ]
1131916Sbinkertn@umich.edu    benchmarks = [ 'm', 's', 'nb1', 'nb2', 'w1', 'w2', 'w3', 'w4', 'ns', 'nm', 'nw1', 'snt' ]
1141881Sbinkertn@umich.edu    #dmas = [ 'x', 'd', 'b' ]
1151881Sbinkertn@umich.edu    dmas = [ 'x' ]
1161881Sbinkertn@umich.edu    caches = [ '2', '4' ]
1171916Sbinkertn@umich.edu
1181948Sbinkertn@umich.edu    names = []
1191881Sbinkertn@umich.edu
1201381Sbinkertn@umich.edu    bench_system = {
1211881Sbinkertn@umich.edu        'm' : 'client',
1221881Sbinkertn@umich.edu        's' : 'client',
1231381Sbinkertn@umich.edu        'snt' : 'client',
1241376Sbinkertn@umich.edu        'nb1' : 'server',
1251916Sbinkertn@umich.edu        'nb2' : 'server',
1261916Sbinkertn@umich.edu        'nt1' : 'server',
1271381Sbinkertn@umich.edu        'nt2' : 'server',
1281376Sbinkertn@umich.edu        'w1' : 'server',
1291381Sbinkertn@umich.edu        'w2' : 'server',
1301376Sbinkertn@umich.edu        'w3' : 'server',
1311381Sbinkertn@umich.edu        'w4' : 'server',
1321376Sbinkertn@umich.edu        'w1s' : 'server',
1331376Sbinkertn@umich.edu        'w2s' : 'server',
1341602Sbinkertn@umich.edu        'w3s' : 'server',
1351602Sbinkertn@umich.edu        'ns' : 'natbox',
1361381Sbinkertn@umich.edu        'nm' : 'natbox',
1371376Sbinkertn@umich.edu        'nw1' : 'natbox',
1381948Sbinkertn@umich.edu        'nw2' : 'natbox',
1391948Sbinkertn@umich.edu        'nw3' : 'natbox'
1401381Sbinkertn@umich.edu        }
1411381Sbinkertn@umich.edu
1421916Sbinkertn@umich.edu    for bench in benchmarks:
1431916Sbinkertn@umich.edu        if bench_system[bench] != options.system:
1441916Sbinkertn@umich.edu            continue
1451916Sbinkertn@umich.edu
1461381Sbinkertn@umich.edu        for dma in dmas:
1471376Sbinkertn@umich.edu            for cache in caches:
1481376Sbinkertn@umich.edu                    names.append([bench, dma, cache])
1491881Sbinkertn@umich.edu
1501881Sbinkertn@umich.edu    for bench,dma,cache in names:
1511381Sbinkertn@umich.edu        base = '%s.%s.%s' % (bench, dma, cache)
1521376Sbinkertn@umich.edu        fname = 'data/%s.%s.dat' % (tag, base)
1531376Sbinkertn@umich.edu        f = open(fname, 'w')
1541376Sbinkertn@umich.edu        print >>f, '#set TITLE = '
1551881Sbinkertn@umich.edu        print >>f, '#set ylbl = %s' % label
1561881Sbinkertn@umich.edu        #print >>f, '#set sublabels = %s' % ' '.join(configs)
1571881Sbinkertn@umich.edu        print >>f, '#set sublabels = ste hte htd ocm occ ocs'
1581881Sbinkertn@umich.edu
1591881Sbinkertn@umich.edu        for speed,freq in zip(['s', 'q'],['4GHz','10GHz']):
1601948Sbinkertn@umich.edu            print >>f, '"%s"' % freq,
1611385Sbinkertn@umich.edu            for conf in configs:
1621385Sbinkertn@umich.edu                name = '%s.%s.%s.%s.%s' % (conf, bench, dma, cache, speed)
1631916Sbinkertn@umich.edu                run = info.source.allRunNames[name]
1641916Sbinkertn@umich.edu                info.display_run = run.run;
1651881Sbinkertn@umich.edu                val = float(value)
1661376Sbinkertn@umich.edu                if val == 1e300*1e300:
1671881Sbinkertn@umich.edu                    print >>f, 0.0,
1681881Sbinkertn@umich.edu                else:
1691376Sbinkertn@umich.edu                    print >>f, "%f" % val,
1701881Sbinkertn@umich.edu            print >>f
1711881Sbinkertn@umich.edu        f.close()
1721881Sbinkertn@umich.edu
1731881Sbinkertn@umich.edudef printdata(runs, value, invert = False):
1741881Sbinkertn@umich.edu    import info
1751881Sbinkertn@umich.edu    for run in runs:
1761376Sbinkertn@umich.edu        info.display_run = run.run;
1771881Sbinkertn@umich.edu        val = float(value)
1781881Sbinkertn@umich.edu        printval(run.name, val)
1791376Sbinkertn@umich.edu
1801376Sbinkertn@umich.educlass CommandException(Exception):
1811881Sbinkertn@umich.edu    pass
1821881Sbinkertn@umich.edu
1831881Sbinkertn@umich.edudef commands(options, command, args):
1841881Sbinkertn@umich.edu    if command == 'database':
1851881Sbinkertn@umich.edu        if len(args) == 0: raise CommandException
1861881Sbinkertn@umich.edu
1871881Sbinkertn@umich.edu        import dbinit
1881376Sbinkertn@umich.edu        mydb = dbinit.MyDB(options)
1891376Sbinkertn@umich.edu
1901376Sbinkertn@umich.edu        if args[0] == 'drop':
1911881Sbinkertn@umich.edu            if len(args) > 2: raise CommandException
1921881Sbinkertn@umich.edu            mydb.admin()
1931376Sbinkertn@umich.edu            mydb.drop()
1941881Sbinkertn@umich.edu            if len(args) == 2 and args[1] == 'init':
1951881Sbinkertn@umich.edu                mydb.create()
1961376Sbinkertn@umich.edu                mydb.connect()
1971376Sbinkertn@umich.edu                mydb.populate()
1981376Sbinkertn@umich.edu            mydb.close()
1991881Sbinkertn@umich.edu            return
2001881Sbinkertn@umich.edu
2011881Sbinkertn@umich.edu        if args[0] == 'init':
2021881Sbinkertn@umich.edu            if len(args) > 1: raise CommandException
2031376Sbinkertn@umich.edu            mydb.admin()
2041881Sbinkertn@umich.edu            mydb.create()
2051881Sbinkertn@umich.edu            mydb.connect()
2061376Sbinkertn@umich.edu            mydb.populate()
2071376Sbinkertn@umich.edu            mydb.close()
2081881Sbinkertn@umich.edu            return
2091881Sbinkertn@umich.edu
2101881Sbinkertn@umich.edu        if args[0] == 'clean':
2111881Sbinkertn@umich.edu            if len(args) > 1: raise CommandException
2121376Sbinkertn@umich.edu            mydb.connect()
2131376Sbinkertn@umich.edu            mydb.clean()
2141376Sbinkertn@umich.edu            return
2151881Sbinkertn@umich.edu
2161376Sbinkertn@umich.edu        raise CommandException
2171881Sbinkertn@umich.edu
2181881Sbinkertn@umich.edu    import db, info
2191881Sbinkertn@umich.edu    info.source = db.Database()
2201376Sbinkertn@umich.edu    info.source.host = options.host
2211881Sbinkertn@umich.edu    info.source.db = options.db
2221881Sbinkertn@umich.edu    info.source.passwd = options.passwd
2231881Sbinkertn@umich.edu    info.source.user = options.user
2241881Sbinkertn@umich.edu    info.source.connect()
2251881Sbinkertn@umich.edu    info.source.update_dict(globals())
2261816Sbinkertn@umich.edu
2271881Sbinkertn@umich.edu    if type(options.get) is str:
2281881Sbinkertn@umich.edu        info.source.get = options.get
2291881Sbinkertn@umich.edu
2301881Sbinkertn@umich.edu    if options.runs is None:
2311881Sbinkertn@umich.edu        runs = info.source.allRuns
2321816Sbinkertn@umich.edu    else:
2331881Sbinkertn@umich.edu        rx = re.compile(options.runs)
2341881Sbinkertn@umich.edu        runs = []
2351881Sbinkertn@umich.edu        for run in info.source.allRuns:
2361881Sbinkertn@umich.edu            if rx.match(run.name):
2371881Sbinkertn@umich.edu                runs.append(run)
2381376Sbinkertn@umich.edu
2391881Sbinkertn@umich.edu    info.display_run = runs[0].run
2401881Sbinkertn@umich.edu
2411881Sbinkertn@umich.edu    if command == 'runs':
2421881Sbinkertn@umich.edu        user = None
2431881Sbinkertn@umich.edu        opts, args = getopts(args, '-u')
2441881Sbinkertn@umich.edu        if len(args):
2451881Sbinkertn@umich.edu            raise CommandException
2461376Sbinkertn@umich.edu        for o,a in opts:
2471881Sbinkertn@umich.edu            if o == '-u':
2481881Sbinkertn@umich.edu                user = a
2491881Sbinkertn@umich.edu        info.source.listRuns(user)
2501881Sbinkertn@umich.edu        return
2511881Sbinkertn@umich.edu
2521881Sbinkertn@umich.edu    if command == 'stability':
2531916Sbinkertn@umich.edu        stats = info.source.getStat(args[0])
2541916Sbinkertn@umich.edu        info.source.get = "avg"
2551916Sbinkertn@umich.edu
2561881Sbinkertn@umich.edu        #loop through all the stats selected
2571881Sbinkertn@umich.edu        for stat in stats:
2581881Sbinkertn@umich.edu
2591881Sbinkertn@umich.edu            print "%s:" % stat.name
2601881Sbinkertn@umich.edu            print "%-30s %12s %12s %4s %5s %6s" % \
2611385Sbinkertn@umich.edu                  ("run name", "average", "stdev", ">10%", ">1SDV", "SAMP")
2621376Sbinkertn@umich.edu            print "%-30s %12s %12s %4s %5s %6s" % \
2631376Sbinkertn@umich.edu                  ("------------------------------", "------------", "------------", "----", "-----", "------")
2641376Sbinkertn@umich.edu            #loop through all the selected runs
2651881Sbinkertn@umich.edu            for run in runs:
2661881Sbinkertn@umich.edu                info.display_run = run.run;
2671376Sbinkertn@umich.edu                runTicks = info.source.retTicks([ run ])
2681916Sbinkertn@umich.edu                #throw away the first one, it's 0
2691881Sbinkertn@umich.edu                runTicks.pop(0)
2701881Sbinkertn@umich.edu                stat.ticks = runTicks
2711916Sbinkertn@umich.edu                avg = float(stat)
2721916Sbinkertn@umich.edu                stdev = 0
2731916Sbinkertn@umich.edu                numoutsideavg  = 0
2741376Sbinkertn@umich.edu
2751385Sbinkertn@umich.edu                #loop through all the various ticks for each run
2761376Sbinkertn@umich.edu                for tick in runTicks:
2771385Sbinkertn@umich.edu                    stat.ticks = str(tick)
2781385Sbinkertn@umich.edu                    val = float(stat)
2791385Sbinkertn@umich.edu                    if (val < (avg * .9)) or (val > (avg * 1.1)):
2801385Sbinkertn@umich.edu                        numoutsideavg += 1
2811385Sbinkertn@umich.edu                    stdev += pow((val-avg),2)
2821385Sbinkertn@umich.edu
2831816Sbinkertn@umich.edu                stdev = pow(stdev / len(runTicks), 0.5)
2841816Sbinkertn@umich.edu                numoutsidestd = 0
2851881Sbinkertn@umich.edu                for tick in runTicks:
2861881Sbinkertn@umich.edu                    stat.ticks = str(tick)
2871908Sbinkertn@umich.edu                    val = float(stat)
2881908Sbinkertn@umich.edu                    if (val < (avg - stdev)) or (val > (avg + stdev)):
2891881Sbinkertn@umich.edu                        numoutsidestd += 1
2901881Sbinkertn@umich.edu
2911385Sbinkertn@umich.edu                print "%-30s %12s %12s %4s %5s %6s" % \
2921385Sbinkertn@umich.edu                      (run.name, "%.1f" % avg, "%.1f" % stdev,
293                       "%d" % numoutsideavg, "%d" % numoutsidestd,
294                       "%d" % len(runTicks))
295        return
296
297
298    if command == 'stats':
299        if len(args) == 0:
300            info.source.listStats()
301        elif len(args) == 1:
302            info.source.listStats(args[0])
303        else:
304            raise CommandException
305
306        return
307
308    if command == 'stat':
309        if len(args) != 1:
310            raise CommandException
311
312        stats = info.source.getStat(args[0])
313        for stat in stats:
314            if options.graph:
315                graphdata(runs, options, stat.name, stat.name, stat)
316            else:
317                if options.ticks:
318                   print 'only displaying sample %s' % options.ticks
319                   stat.ticks = options.ticks
320
321                if options.binned:
322                    print 'kernel ticks'
323                    stat.bins = 'kernel'
324                    printdata(runs, stat)
325
326                    print 'idle ticks'
327                    stat.bins = 'idle'
328                    printdata(runs, stat)
329
330                    print 'user ticks'
331                    stat.bins = 'user'
332                    printdata(runs, stat)
333
334                    print 'interrupt ticks'
335                    stat.bins = 'interrupt'
336                    printdata(runs, stat)
337
338                    print 'total ticks'
339
340                stat.bins = None
341                print stat.name
342                printdata(runs, stat)
343        return
344
345    if command == 'formula':
346        if len(args) != 1:
347            raise CommandException
348
349        stats = eval(args[0])
350        for stat in stats:
351            if options.graph:
352                graphdata(runs, options, stat.name, stat.name, stat)
353            else:
354                if options.binned:
355                    print 'kernel ticks'
356                    stat.bins = 'kernel'
357                    printdata(runs, stat)
358
359                    print 'idle ticks'
360                    stat.bins = 'idle'
361                    printdata(runs, stat)
362
363                    print 'user ticks'
364                    stat.bins = 'user'
365                    printdata(runs, stat)
366
367                    print 'interrupt ticks'
368                    stat.bins = 'interrupt'
369                    printdata(runs, stat)
370
371                    print 'total ticks'
372
373                stat.bins = None
374                print args[0]
375                printdata(runs, stat)
376        return
377
378    if command == 'bins':
379        if len(args) == 0:
380            info.source.listBins()
381        elif len(args) == 1:
382            info.source.listBins(args[0])
383        else:
384            raise CommandException
385
386        return
387
388    if command == 'formulas':
389        if len(args) == 0:
390            info.source.listFormulas()
391        elif len(args) == 1:
392            info.source.listFormulas(args[0])
393        else:
394            raise CommandException
395
396        return
397
398    if command == 'samples':
399        if len(args):
400            raise CommandException
401
402        info.source.listTicks(runs)
403        return
404
405    if len(args):
406        raise CommandException
407
408    system = info.source.__dict__[options.system]
409
410    if command == 'usertime':
411        import copy
412        kernel = copy.copy(system.full_cpu.numCycles)
413        kernel.bins = 'kernel'
414
415        user = copy.copy(system.full_cpu.numCycles)
416        user.bins = 'user'
417
418        if options.graph:
419            graphdata(runs, options, 'usertime', 'User Fraction',
420                      user / system.full_cpu.numCycles)
421        else:
422            printdata(runs, user / system.full_cpu.numCycles)
423        return
424
425    if command == 'ticks':
426        if options.binned:
427            print 'kernel ticks'
428            system.full_cpu.numCycles.bins = 'kernel'
429            printdata(runs, system.full_cpu.numCycles)
430
431            print 'idle ticks'
432            system.full_cpu.numCycles.bins = 'idle'
433            printdata(runs, system.full_cpu.numCycles)
434
435            print 'user ticks'
436            system.full_cpu.numCycles.bins = 'user'
437            printdata(runs, system.full_cpu.numCycles)
438
439            print 'total ticks'
440
441        system.full_cpu.numCycles.bins = None
442        printdata(runs, system.full_cpu.numCycles)
443        return
444
445    if command == 'packets':
446        packets = system.tsunami.etherdev.rxPackets
447        if options.graph:
448            graphdata(runs, options, 'packets', 'Packets', packets)
449        else:
450            printdata(runs, packets)
451        return
452
453    if command == 'ppt' or command == 'tpp':
454        ppt = system.tsunami.etherdev.rxPackets / sim_ticks
455        printdata(runs, ppt, command == 'tpp')
456        return
457
458    if command == 'pps':
459        pps = system.tsunami.etherdev.rxPackets / sim_seconds
460        if options.graph:
461            graphdata(runs, options, 'pps', 'Packets/s', pps)
462        else:
463            printdata(runs, pps)
464        return
465
466    if command == 'bpt' or command == 'tpb':
467        bytes = system.tsunami.etherdev.rxBytes + system.tsunami.etherdev.txBytes
468        bpt = bytes / sim_ticks * 8
469        if options.graph:
470            graphdata(runs, options, 'bpt', 'bps / Hz', bpt)
471        else:
472            printdata(runs, bpt, command == 'tpb')
473        return
474
475    if command == 'bptb' or command == 'tpbb':
476        bytes = system.tsunami.etherdev.rxBytes + system.tsunami.etherdev.txBytes
477
478        print 'kernel stats'
479        bytes.bins = 'kernel'
480        printdata(runs, bytes / ticks)
481
482        print 'idle stats'
483        bytes.bins = 'idle'
484        printdata(runs, bytes / ticks)
485
486        print 'user stats'
487        bytes.bins = 'user'
488        printdata(runs, bytes / ticks)
489
490        return
491
492    if command == 'bytes':
493        stat = system.tsunami.etherdev.rxBytes + system.tsunami.etherdev.txBytes
494
495        if options.binned:
496            print '%s kernel stats' % stat.name
497            stat.bins = 'kernel'
498            printdata(runs, stat)
499
500            print '%s idle stats' % stat.name
501            stat.bins = 'idle'
502            printdata(runs, stat)
503
504            print '%s user stats' % stat.name
505            stat.bins = 'user'
506            printdata(runs, stat)
507
508            print '%s total stats' % stat.name
509            stat.bins = None
510
511        printdata(runs, stat)
512        return
513
514    if command == 'rxbps':
515        gbps = system.tsunami.etherdev.rxBandwidth / 1e9
516        if options.graph:
517            graphdata(runs, options, 'rxbps', 'Bandwidth (Gbps)',  gbps)
518        else:
519            printdata(runs, gbps)
520        return
521
522    if command == 'txbps':
523        gbps = system.tsunami.etherdev.txBandwidth / 1e9
524        if options.graph:
525            graphdata(runs, options, 'txbps', 'Bandwidth (Gbps)',  gbps)
526        else:
527            printdata(runs, gbps)
528        return
529
530    if command == 'bps':
531        rxbps = system.tsunami.etherdev.rxBandwidth
532        txbps = system.tsunami.etherdev.txBandwidth
533        gbps = (rxbps + txbps) / 1e9
534        if options.graph:
535            graphdata(runs, options, 'bps', 'Bandwidth (Gbps)',  gbps)
536        else:
537            printdata(runs, gbps)
538        return
539
540    if command == 'misses':
541        stat = system.L2.overall_mshr_misses
542        if options.binned:
543            print '%s kernel stats' % stat.name
544            stat.bins = 'kernel'
545            printdata(runs, stat)
546
547            print '%s idle stats' % stat.name
548            stat.bins = 'idle'
549            printdata(runs, stat)
550
551            print '%s user stats' % stat.name
552            stat.bins = 'user'
553            printdata(runs, stat)
554
555            print '%s total stats' % stat.name
556
557        stat.bins = None
558        if options.graph:
559            graphdata(runs, options, 'misses', 'Overall MSHR Misses', stat)
560        else:
561            printdata(runs, stat)
562        return
563
564    if command == 'mpkb':
565        misses = system.L2.overall_mshr_misses
566        rxbytes = system.tsunami.etherdev.rxBytes
567        txbytes = system.tsunami.etherdev.txBytes
568
569        if options.binned:
570            print 'mpkb kernel stats'
571            misses.bins = 'kernel'
572            mpkb = misses / ((rxbytes + txbytes) / 1024)
573            printdata(runs, mpkb)
574
575            print 'mpkb idle stats'
576            misses.bins = 'idle'
577            mpkb = misses / ((rxbytes + txbytes) / 1024)
578            printdata(runs, mpkb)
579
580            print 'mpkb user stats'
581            misses.bins = 'user'
582            mpkb = misses / ((rxbytes + txbytes) / 1024)
583            printdata(runs, mpkb)
584
585            print 'mpkb total stats'
586
587        mpkb = misses / ((rxbytes + txbytes) / 1024)
588        misses.bins = None
589        if options.graph:
590            graphdata(runs, options, 'mpkb', 'Misses / KB',  mpkb)
591        else:
592            printdata(runs, mpkb)
593        return
594
595    if command == 'ipkb':
596        interrupts = system.full_cpu.kern.faults[4]
597        rxbytes = system.tsunami.etherdev.rxBytes
598        txbytes = system.tsunami.etherdev.txBytes
599
600        if options.binned:
601            print 'ipkb kernel stats'
602            interrupts.bins = 'kernel'
603            ipkb = interrupts / ((rxbytes + txbytes) / 1024)
604            printdata(runs, ipkb)
605
606            print 'ipkb idle stats'
607            interrupts.bins = 'idle'
608            ipkb = interrupts / ((rxbytes + txbytes) / 1024)
609            printdata(runs, ipkb)
610
611            print 'ipkb user stats'
612            interrupts.bins = 'user'
613            ipkb = interrupts / ((rxbytes + txbytes) / 1024)
614            printdata(runs, ipkb)
615
616            print 'ipkb total stats'
617
618        ipkb = interrupts / ((rxbytes + txbytes) / 1024)
619        interrupts.bins = None
620        if options.graph:
621            graphdata(runs, options, 'ipkb', 'Interrupts / KB',  ipkb)
622        else:
623            printdata(runs, ipkb)
624        return
625
626    if command == 'execute':
627        printdata(runs, system.full_cpu.ISSUE__count)
628        return
629
630    if command == 'commit':
631        printdata(runs, system.full_cpu.COM__count)
632        return
633
634    if command == 'fetch':
635        printdata(runs, system.full_cpu.FETCH__count)
636        return
637
638    if command == 'bpp':
639        ed = system.tsunami.etherdev
640        bpp = (ed.rxBytes + ed.txBytes) / (ed.rxPackets + ed.txPackets)
641        if options.graph:
642            graphdata(runs, options, 'bpp', 'Bytes / Packet',  bpp)
643        else:
644            printdata(runs, bpp)
645        return
646
647    if command == 'rxbpp':
648        bpp = system.tsunami.etherdev.rxBytes / system.tsunami.etherdev.rxPackets
649        if options.graph:
650            graphdata(runs, options, 'rxbpp', 'Receive Bytes / Packet',  bpp)
651        else:
652            printdata(runs, bpp)
653        return
654
655    if command == 'txbpp':
656        bpp = system.tsunami.etherdev.txBytes / system.tsunami.etherdev.txPackets
657        if options.graph:
658            graphdata(runs, options, 'txbpp', 'Transmit Bytes / Packet',  bpp)
659        else:
660            printdata(runs, bpp)
661        return
662
663    if command == 'rtp':
664        rtp = system.tsunami.etherdev.rxPackets / system.tsunami.etherdev.txPackets
665        if options.graph:
666            graphdata(runs, options, 'rtp', 'rxPackets / txPackets',  rtp)
667        else:
668            printdata(runs, rtp)
669        return
670
671    if command == 'rtb':
672        rtb = system.tsunami.etherdev.rxBytes / system.tsunami.etherdev.txBytes
673        if options.graph:
674            graphdata(runs, options, 'rtb', 'rxBytes / txBytes',  rtb)
675        else:
676            printdata(runs, rtb)
677        return
678
679    raise CommandException
680
681
682class Options: pass
683
684if __name__ == '__main__':
685    import getpass
686
687    options = Options()
688    options.host = 'zizzer.pool'
689    options.db = None
690    options.passwd = ''
691    options.user = getpass.getuser()
692    options.runs = None
693    options.system = 'client'
694    options.get = None
695    options.binned = False
696    options.graph = False
697    options.graph68 = False
698    options.ticks = False
699
700    opts, args = getopts(sys.argv[1:], '-6BEFGd:g:h:pr:s:u:T:')
701    for o,a in opts:
702        if o == '-6':
703            options.graph68 = True
704        if o == '-B':
705            options.binned = True
706        if o == '-E':
707            printval.mode = 'E'
708        if o == '-F':
709            printval.mode = 'F'
710        if o == '-G':
711            options.graph = True;
712        if o == '-d':
713            options.db = a
714        if o == '-g':
715            options.get = a
716        if o == '-h':
717            options.host = a
718        if o == '-p':
719            options.passwd = getpass.getpass()
720        if o == '-r':
721            options.runs = a
722        if o == '-u':
723            options.user = a
724        if o == '-s':
725            options.system = a
726        if o == '-T':
727            options.ticks = a
728
729    if len(args) == 0:
730        usage()
731
732    command = args[0]
733    args = args[1:]
734
735    try:
736        commands(options, command, args)
737    except CommandException:
738        usage()
739