stats.py revision 1918
11049Sbinkertn@umich.edu#!/usr/bin/env python
21758Ssaidi@eecs.umich.edu
31758Ssaidi@eecs.umich.edu# Copyright (c) 2003-2004 The Regents of The University of Michigan
41758Ssaidi@eecs.umich.edu# All rights reserved.
51758Ssaidi@eecs.umich.edu#
61758Ssaidi@eecs.umich.edu# Redistribution and use in source and binary forms, with or without
71758Ssaidi@eecs.umich.edu# modification, are permitted provided that the following conditions are
81758Ssaidi@eecs.umich.edu# met: redistributions of source code must retain the above copyright
91758Ssaidi@eecs.umich.edu# notice, this list of conditions and the following disclaimer;
101758Ssaidi@eecs.umich.edu# redistributions in binary form must reproduce the above copyright
111758Ssaidi@eecs.umich.edu# notice, this list of conditions and the following disclaimer in the
121758Ssaidi@eecs.umich.edu# documentation and/or other materials provided with the distribution;
131758Ssaidi@eecs.umich.edu# neither the name of the copyright holders nor the names of its
141758Ssaidi@eecs.umich.edu# contributors may be used to endorse or promote products derived from
151758Ssaidi@eecs.umich.edu# this software without specific prior written permission.
161758Ssaidi@eecs.umich.edu#
171758Ssaidi@eecs.umich.edu# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
181758Ssaidi@eecs.umich.edu# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
191758Ssaidi@eecs.umich.edu# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
201758Ssaidi@eecs.umich.edu# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
211758Ssaidi@eecs.umich.edu# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
221758Ssaidi@eecs.umich.edu# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
231758Ssaidi@eecs.umich.edu# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
241758Ssaidi@eecs.umich.edu# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
251758Ssaidi@eecs.umich.edu# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
261758Ssaidi@eecs.umich.edu# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
271758Ssaidi@eecs.umich.edu# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
281758Ssaidi@eecs.umich.edu
291049Sbinkertn@umich.edufrom __future__ import division
301318Ssaidi@eecs.umich.eduimport re, sys, math
311049Sbinkertn@umich.edu
321049Sbinkertn@umich.edudef usage():
331049Sbinkertn@umich.edu    print '''\
341881Sbinkertn@umich.eduUsage: %s [-E] [-F] [ -G <get> ] [-d <db> ] [-g <graphdir> ] [-h <host>] [-p]
351331Ssaidi@eecs.umich.edu       [-s <system>] [-r <runs> ] [-T <samples>] [-u <username>]
361331Ssaidi@eecs.umich.edu       <command> [command args]
371331Ssaidi@eecs.umich.edu
381331Ssaidi@eecs.umich.edu       commands    extra parameters   description
391331Ssaidi@eecs.umich.edu       ----------- ------------------ ---------------------------------------
401331Ssaidi@eecs.umich.edu       bins        [regex]            List bins (only matching regex)
411331Ssaidi@eecs.umich.edu       formula     <formula>          Evaluated formula specified
421331Ssaidi@eecs.umich.edu       formulas    [regex]            List formulas (only matching regex)
431331Ssaidi@eecs.umich.edu       runs        none               List all runs in database
441331Ssaidi@eecs.umich.edu       samples     none               List samples present in database
451331Ssaidi@eecs.umich.edu       stability   <pairnum> <stats>  Calculated statistical info about stats
461331Ssaidi@eecs.umich.edu       stat        <regex>            Show stat data (only matching regex)
471331Ssaidi@eecs.umich.edu       stats       [regex]            List all stats (only matching regex)
481596Ssaidi@eecs.umich.edu
491596Ssaidi@eecs.umich.edu       database    <command>          Where command is drop, init, or clean
501596Ssaidi@eecs.umich.edu
511049Sbinkertn@umich.edu''' % sys.argv[0]
521049Sbinkertn@umich.edu    sys.exit(1)
531049Sbinkertn@umich.edu
541049Sbinkertn@umich.edudef getopts(list, flags):
551049Sbinkertn@umich.edu    import getopt
561049Sbinkertn@umich.edu    try:
571049Sbinkertn@umich.edu        opts, args = getopt.getopt(list, flags)
581049Sbinkertn@umich.edu    except getopt.GetoptError:
591049Sbinkertn@umich.edu        usage()
601049Sbinkertn@umich.edu
611049Sbinkertn@umich.edu    return opts, args
621049Sbinkertn@umich.edu
631049Sbinkertn@umich.educlass CommandException(Exception):
641049Sbinkertn@umich.edu    pass
651049Sbinkertn@umich.edu
661049Sbinkertn@umich.edudef commands(options, command, args):
671049Sbinkertn@umich.edu    if command == 'database':
681049Sbinkertn@umich.edu        if len(args) == 0: raise CommandException
691049Sbinkertn@umich.edu
701049Sbinkertn@umich.edu        import dbinit
711049Sbinkertn@umich.edu        mydb = dbinit.MyDB(options)
721049Sbinkertn@umich.edu
731049Sbinkertn@umich.edu        if args[0] == 'drop':
741049Sbinkertn@umich.edu            if len(args) > 2: raise CommandException
751049Sbinkertn@umich.edu            mydb.admin()
761049Sbinkertn@umich.edu            mydb.drop()
771049Sbinkertn@umich.edu            if len(args) == 2 and args[1] == 'init':
781049Sbinkertn@umich.edu                mydb.create()
791049Sbinkertn@umich.edu                mydb.connect()
801049Sbinkertn@umich.edu                mydb.populate()
811049Sbinkertn@umich.edu            mydb.close()
821049Sbinkertn@umich.edu            return
831049Sbinkertn@umich.edu
841049Sbinkertn@umich.edu        if args[0] == 'init':
851049Sbinkertn@umich.edu            if len(args) > 1: raise CommandException
861049Sbinkertn@umich.edu            mydb.admin()
871049Sbinkertn@umich.edu            mydb.create()
881049Sbinkertn@umich.edu            mydb.connect()
891049Sbinkertn@umich.edu            mydb.populate()
901049Sbinkertn@umich.edu            mydb.close()
911049Sbinkertn@umich.edu            return
921049Sbinkertn@umich.edu
931049Sbinkertn@umich.edu        if args[0] == 'clean':
941049Sbinkertn@umich.edu            if len(args) > 1: raise CommandException
951049Sbinkertn@umich.edu            mydb.connect()
961049Sbinkertn@umich.edu            mydb.clean()
971049Sbinkertn@umich.edu            return
981049Sbinkertn@umich.edu
991049Sbinkertn@umich.edu        raise CommandException
1001049Sbinkertn@umich.edu
1011049Sbinkertn@umich.edu    import db, info
1021049Sbinkertn@umich.edu    info.source = db.Database()
1031049Sbinkertn@umich.edu    info.source.host = options.host
1041049Sbinkertn@umich.edu    info.source.db = options.db
1051049Sbinkertn@umich.edu    info.source.passwd = options.passwd
1061049Sbinkertn@umich.edu    info.source.user = options.user
1071049Sbinkertn@umich.edu    info.source.connect()
1081881Sbinkertn@umich.edu    #info.source.update_dict(globals())
1091049Sbinkertn@umich.edu
1101049Sbinkertn@umich.edu    if type(options.get) is str:
1111049Sbinkertn@umich.edu        info.source.get = options.get
1121049Sbinkertn@umich.edu
1131049Sbinkertn@umich.edu    if options.runs is None:
1141049Sbinkertn@umich.edu        runs = info.source.allRuns
1151049Sbinkertn@umich.edu    else:
1161049Sbinkertn@umich.edu        rx = re.compile(options.runs)
1171049Sbinkertn@umich.edu        runs = []
1181049Sbinkertn@umich.edu        for run in info.source.allRuns:
1191049Sbinkertn@umich.edu            if rx.match(run.name):
1201049Sbinkertn@umich.edu                runs.append(run)
1211049Sbinkertn@umich.edu
1221049Sbinkertn@umich.edu    info.display_run = runs[0].run
1231049Sbinkertn@umich.edu
1241049Sbinkertn@umich.edu    if command == 'runs':
1251049Sbinkertn@umich.edu        user = None
1261049Sbinkertn@umich.edu        opts, args = getopts(args, '-u')
1271049Sbinkertn@umich.edu        if len(args):
1281049Sbinkertn@umich.edu            raise CommandException
1291049Sbinkertn@umich.edu        for o,a in opts:
1301049Sbinkertn@umich.edu            if o == '-u':
1311049Sbinkertn@umich.edu                user = a
1321049Sbinkertn@umich.edu        info.source.listRuns(user)
1331049Sbinkertn@umich.edu        return
1341049Sbinkertn@umich.edu
1351881Sbinkertn@umich.edu    if command == 'stats':
1361881Sbinkertn@umich.edu        if len(args) == 0:
1371881Sbinkertn@umich.edu            info.source.listStats()
1381881Sbinkertn@umich.edu        elif len(args) == 1:
1391881Sbinkertn@umich.edu            info.source.listStats(args[0])
1401881Sbinkertn@umich.edu        else:
1411881Sbinkertn@umich.edu            raise CommandException
1421881Sbinkertn@umich.edu
1431881Sbinkertn@umich.edu        return
1441881Sbinkertn@umich.edu
1451881Sbinkertn@umich.edu    if command == 'bins':
1461881Sbinkertn@umich.edu        if len(args) == 0:
1471881Sbinkertn@umich.edu            info.source.listBins()
1481881Sbinkertn@umich.edu        elif len(args) == 1:
1491881Sbinkertn@umich.edu            info.source.listBins(args[0])
1501881Sbinkertn@umich.edu        else:
1511881Sbinkertn@umich.edu            raise CommandException
1521881Sbinkertn@umich.edu
1531881Sbinkertn@umich.edu        return
1541881Sbinkertn@umich.edu
1551881Sbinkertn@umich.edu    if command == 'formulas':
1561881Sbinkertn@umich.edu        if len(args) == 0:
1571881Sbinkertn@umich.edu            info.source.listFormulas()
1581881Sbinkertn@umich.edu        elif len(args) == 1:
1591881Sbinkertn@umich.edu            info.source.listFormulas(args[0])
1601881Sbinkertn@umich.edu        else:
1611881Sbinkertn@umich.edu            raise CommandException
1621881Sbinkertn@umich.edu
1631881Sbinkertn@umich.edu        return
1641881Sbinkertn@umich.edu
1651881Sbinkertn@umich.edu    if command == 'samples':
1661881Sbinkertn@umich.edu        if len(args):
1671881Sbinkertn@umich.edu            raise CommandException
1681881Sbinkertn@umich.edu
1691881Sbinkertn@umich.edu        info.source.listTicks(runs)
1701881Sbinkertn@umich.edu        return
1711881Sbinkertn@umich.edu
1721309Ssaidi@eecs.umich.edu    if command == 'stability':
1731331Ssaidi@eecs.umich.edu        if len(args) < 2:
1741331Ssaidi@eecs.umich.edu            raise CommandException
1751331Ssaidi@eecs.umich.edu
1761331Ssaidi@eecs.umich.edu        try:
1771331Ssaidi@eecs.umich.edu            merge = int(args[0])
1781331Ssaidi@eecs.umich.edu        except ValueError:
1791331Ssaidi@eecs.umich.edu            usage()
1801331Ssaidi@eecs.umich.edu        stats = info.source.getStat(args[1])
1811331Ssaidi@eecs.umich.edu        info.source.get = "sum"
1821331Ssaidi@eecs.umich.edu
1831881Sbinkertn@umich.edu        def disp(*args):
1841881Sbinkertn@umich.edu            print "%-20s %12s %12s %4s %5s %5s %5s %10s" % args
1851881Sbinkertn@umich.edu
1861881Sbinkertn@umich.edu        # temporary variable containing a bunch of dashes
1871881Sbinkertn@umich.edu        d = '-' * 100
1881309Ssaidi@eecs.umich.edu
1891309Ssaidi@eecs.umich.edu        #loop through all the stats selected
1901309Ssaidi@eecs.umich.edu        for stat in stats:
1911881Sbinkertn@umich.edu            print "%s:" % stat.name
1921881Sbinkertn@umich.edu            disp("run name", "average", "stdev", ">10%", ">1SDV", ">2SDV",
1931881Sbinkertn@umich.edu                 "SAMP", "CV")
1941881Sbinkertn@umich.edu            disp(d[:20], d[:12], d[:12], d[:4], d[:5], d[:5], d[:5], d[:10])
1951309Ssaidi@eecs.umich.edu
1961309Ssaidi@eecs.umich.edu            #loop through all the selected runs
1971309Ssaidi@eecs.umich.edu            for run in runs:
1981309Ssaidi@eecs.umich.edu                info.display_run = run.run;
1991309Ssaidi@eecs.umich.edu                runTicks = info.source.retTicks([ run ])
2001309Ssaidi@eecs.umich.edu                #throw away the first one, it's 0
2011309Ssaidi@eecs.umich.edu                runTicks.pop(0)
2021329Ssaidi@eecs.umich.edu                info.globalTicks = runTicks
2031331Ssaidi@eecs.umich.edu                avg = 0
2041317Ssaidi@eecs.umich.edu                stdev = 0
2051317Ssaidi@eecs.umich.edu                numoutsideavg  = 0
2061318Ssaidi@eecs.umich.edu                numoutside1std = 0
2071318Ssaidi@eecs.umich.edu                numoutside2std = 0
2081331Ssaidi@eecs.umich.edu                pairRunTicks = []
2091331Ssaidi@eecs.umich.edu                if float(stat) == 1e300*1e300:
2101331Ssaidi@eecs.umich.edu                    continue
2111331Ssaidi@eecs.umich.edu                for t in range(0, len(runTicks)-(merge-1), merge):
2121331Ssaidi@eecs.umich.edu                    tempPair = []
2131331Ssaidi@eecs.umich.edu                    for p in range(0,merge):
2141331Ssaidi@eecs.umich.edu                        tempPair.append(runTicks[t+p])
2151331Ssaidi@eecs.umich.edu                    pairRunTicks.append(tempPair)
2161309Ssaidi@eecs.umich.edu                #loop through all the various ticks for each run
2171331Ssaidi@eecs.umich.edu                for tick in pairRunTicks:
2181331Ssaidi@eecs.umich.edu                    info.globalTicks = tick
2191331Ssaidi@eecs.umich.edu                    avg += float(stat)
2201331Ssaidi@eecs.umich.edu                avg /= len(pairRunTicks)
2211331Ssaidi@eecs.umich.edu                for tick in pairRunTicks:
2221331Ssaidi@eecs.umich.edu                    info.globalTicks = tick
2231331Ssaidi@eecs.umich.edu                    val = float(stat)
2241331Ssaidi@eecs.umich.edu                    stdev += pow((val-avg),2)
2251331Ssaidi@eecs.umich.edu                stdev = math.sqrt(stdev / len(pairRunTicks))
2261331Ssaidi@eecs.umich.edu                for tick in pairRunTicks:
2271331Ssaidi@eecs.umich.edu                    info.globalTicks = tick
2281309Ssaidi@eecs.umich.edu                    val = float(stat)
2291309Ssaidi@eecs.umich.edu                    if (val < (avg * .9)) or (val > (avg * 1.1)):
2301317Ssaidi@eecs.umich.edu                        numoutsideavg += 1
2311317Ssaidi@eecs.umich.edu                    if (val < (avg - stdev)) or (val > (avg + stdev)):
2321318Ssaidi@eecs.umich.edu                        numoutside1std += 1
2331318Ssaidi@eecs.umich.edu                    if (val < (avg - (2*stdev))) or (val > (avg + (2*stdev))):
2341318Ssaidi@eecs.umich.edu                        numoutside2std += 1
2351331Ssaidi@eecs.umich.edu                if avg > 1000:
2361881Sbinkertn@umich.edu                    disp(run.name, "%.1f" % avg, "%.1f" % stdev,
2371881Sbinkertn@umich.edu                         "%d" % numoutsideavg, "%d" % numoutside1std,
2381881Sbinkertn@umich.edu                         "%d" % numoutside2std, "%d" % len(pairRunTicks),
2391881Sbinkertn@umich.edu                         "%.3f" % (stdev/avg*100))
2401331Ssaidi@eecs.umich.edu                elif avg > 100:
2411881Sbinkertn@umich.edu                    disp(run.name, "%.1f" % avg, "%.1f" % stdev,
2421881Sbinkertn@umich.edu                         "%d" % numoutsideavg, "%d" % numoutside1std,
2431881Sbinkertn@umich.edu                         "%d" % numoutside2std, "%d" % len(pairRunTicks),
2441881Sbinkertn@umich.edu                         "%.5f" % (stdev/avg*100))
2451331Ssaidi@eecs.umich.edu                else:
2461881Sbinkertn@umich.edu                    disp(run.name, "%.5f" % avg, "%.5f" % stdev,
2471881Sbinkertn@umich.edu                         "%d" % numoutsideavg, "%d" % numoutside1std,
2481881Sbinkertn@umich.edu                         "%d" % numoutside2std, "%d" % len(pairRunTicks),
2491881Sbinkertn@umich.edu                         "%.7f" % (stdev/avg*100))
2501309Ssaidi@eecs.umich.edu        return
2511309Ssaidi@eecs.umich.edu
2521881Sbinkertn@umich.edu    if command == 'all':
2531881Sbinkertn@umich.edu        if len(args):
2541049Sbinkertn@umich.edu            raise CommandException
2551049Sbinkertn@umich.edu
2561881Sbinkertn@umich.edu        all = [ 'bps', 'rxbps', 'txbps', 'bpt',
2571881Sbinkertn@umich.edu                'misses', 'mpkb',
2581881Sbinkertn@umich.edu                'ipkb',
2591881Sbinkertn@umich.edu                'pps', 'bpp', 'txbpp', 'rxbpp',
2601881Sbinkertn@umich.edu                'rtp', 'rtb' ]
2611881Sbinkertn@umich.edu        for command in all:
2621881Sbinkertn@umich.edu            commands(options, command, args)
2631049Sbinkertn@umich.edu
2641881Sbinkertn@umich.edu    if options.ticks:
2651881Sbinkertn@umich.edu        if not options.graph:
2661881Sbinkertn@umich.edu            print 'only displaying sample %s' % options.ticks
2671881Sbinkertn@umich.edu        info.globalTicks = [ int(x) for x in options.ticks.split() ]
2681881Sbinkertn@umich.edu
2691881Sbinkertn@umich.edu    from output import StatOutput
2701881Sbinkertn@umich.edu
2711881Sbinkertn@umich.edu    def display():
2721881Sbinkertn@umich.edu        if options.graph:
2731881Sbinkertn@umich.edu            output.graph(options.graphdir)
2741881Sbinkertn@umich.edu        else:
2751881Sbinkertn@umich.edu            output.display(options.binned, options.printmode)
2761881Sbinkertn@umich.edu
2771881Sbinkertn@umich.edu
2781881Sbinkertn@umich.edu    if command == 'stat' or command == 'formula':
2791049Sbinkertn@umich.edu        if len(args) != 1:
2801049Sbinkertn@umich.edu            raise CommandException
2811049Sbinkertn@umich.edu
2821881Sbinkertn@umich.edu        if command == 'stat':
2831881Sbinkertn@umich.edu            stats = info.source.getStat(args[0])
2841881Sbinkertn@umich.edu        if command == 'formula':
2851881Sbinkertn@umich.edu            stats = eval(args[0])
2861881Sbinkertn@umich.edu
2871049Sbinkertn@umich.edu        for stat in stats:
2881881Sbinkertn@umich.edu            output = StatOutput(stat.name, options.jobfile)
2891881Sbinkertn@umich.edu            output.stat = stat
2901881Sbinkertn@umich.edu            output.label = stat.name
2911881Sbinkertn@umich.edu            display()
2921301Ssaidi@eecs.umich.edu
2931049Sbinkertn@umich.edu        return
2941049Sbinkertn@umich.edu
2951049Sbinkertn@umich.edu    if len(args):
2961049Sbinkertn@umich.edu        raise CommandException
2971049Sbinkertn@umich.edu
2981209Sbinkertn@umich.edu    system = info.source.__dict__[options.system]
2991209Sbinkertn@umich.edu
3001881Sbinkertn@umich.edu    from proxy import ProxyGroup
3011881Sbinkertn@umich.edu    sim_ticks = info.source['sim_ticks']
3021881Sbinkertn@umich.edu    sim_seconds = info.source['sim_seconds']
3031881Sbinkertn@umich.edu    proxy = ProxyGroup(system = info.source[options.system])
3041881Sbinkertn@umich.edu    system = proxy.system
3051881Sbinkertn@umich.edu
3061881Sbinkertn@umich.edu    etherdev = system.tsunami.etherdev0
3071881Sbinkertn@umich.edu    bytes = etherdev.rxBytes + etherdev.txBytes
3081881Sbinkertn@umich.edu    kbytes = bytes / 1024
3091881Sbinkertn@umich.edu    packets = etherdev.rxPackets + etherdev.txPackets
3101881Sbinkertn@umich.edu    bps = etherdev.rxBandwidth + etherdev.txBandwidth
3111881Sbinkertn@umich.edu
3121881Sbinkertn@umich.edu    output = StatOutput(command, options.jobfile)
3131881Sbinkertn@umich.edu
3141049Sbinkertn@umich.edu    if command == 'usertime':
3151049Sbinkertn@umich.edu        import copy
3161604Srdreslin@umich.edu        user = copy.copy(system.full0.numCycles)
3171049Sbinkertn@umich.edu        user.bins = 'user'
3181049Sbinkertn@umich.edu
3191881Sbinkertn@umich.edu        output.stat = user / system.full0.numCycles
3201881Sbinkertn@umich.edu        output.label = 'User Fraction'
3211881Sbinkertn@umich.edu
3221881Sbinkertn@umich.edu        display()
3231049Sbinkertn@umich.edu        return
3241049Sbinkertn@umich.edu
3251049Sbinkertn@umich.edu    if command == 'ticks':
3261881Sbinkertn@umich.edu        output.stat = system.full0.numCycles
3271881Sbinkertn@umich.edu        output.binstats = [ system.full0.numCycles ]
3281049Sbinkertn@umich.edu
3291881Sbinkertn@umich.edu        display()
3301881Sbinkertn@umich.edu        return
3311049Sbinkertn@umich.edu
3321881Sbinkertn@umich.edu    if command == 'bytes':
3331881Sbinkertn@umich.edu        output.stat = bytes
3341881Sbinkertn@umich.edu        display()
3351049Sbinkertn@umich.edu        return
3361049Sbinkertn@umich.edu
3371049Sbinkertn@umich.edu    if command == 'packets':
3381881Sbinkertn@umich.edu        output.stat = packets
3391881Sbinkertn@umich.edu        display()
3401049Sbinkertn@umich.edu        return
3411049Sbinkertn@umich.edu
3421049Sbinkertn@umich.edu    if command == 'ppt' or command == 'tpp':
3431881Sbinkertn@umich.edu        output.stat = packets / sim_ticks
3441881Sbinkertn@umich.edu        output.invert = command == 'tpp'
3451881Sbinkertn@umich.edu        display()
3461049Sbinkertn@umich.edu        return
3471049Sbinkertn@umich.edu
3481049Sbinkertn@umich.edu    if command == 'pps':
3491881Sbinkertn@umich.edu        output.stat = packets / sim_seconds
3501881Sbinkertn@umich.edu        output.label = 'Packets/s'
3511881Sbinkertn@umich.edu        display()
3521049Sbinkertn@umich.edu        return
3531049Sbinkertn@umich.edu
3541049Sbinkertn@umich.edu    if command == 'bpt' or command == 'tpb':
3551881Sbinkertn@umich.edu        output.stat = bytes / sim_ticks * 8
3561881Sbinkertn@umich.edu        output.label = 'bps / Hz'
3571881Sbinkertn@umich.edu        output.invert = command == 'tpb'
3581881Sbinkertn@umich.edu        display()
3591049Sbinkertn@umich.edu        return
3601049Sbinkertn@umich.edu
3611049Sbinkertn@umich.edu    if command == 'rxbps':
3621881Sbinkertn@umich.edu        output.stat = etherdev.rxBandwidth / 1e9
3631881Sbinkertn@umich.edu        output.label = 'Bandwidth (Gbps)'
3641881Sbinkertn@umich.edu        display()
3651049Sbinkertn@umich.edu        return
3661049Sbinkertn@umich.edu
3671049Sbinkertn@umich.edu    if command == 'txbps':
3681881Sbinkertn@umich.edu        output.stat = etherdev.txBandwidth / 1e9
3691881Sbinkertn@umich.edu        output.label = 'Bandwidth (Gbps)'
3701881Sbinkertn@umich.edu        display()
3711049Sbinkertn@umich.edu        return
3721049Sbinkertn@umich.edu
3731049Sbinkertn@umich.edu    if command == 'bps':
3741881Sbinkertn@umich.edu        output.stat = bps / 1e9
3751881Sbinkertn@umich.edu        output.label = 'Bandwidth (Gbps)'
3761881Sbinkertn@umich.edu        display()
3771049Sbinkertn@umich.edu        return
3781049Sbinkertn@umich.edu
3791881Sbinkertn@umich.edu    if command == 'bpp':
3801881Sbinkertn@umich.edu        output.stat = bytes / packets
3811881Sbinkertn@umich.edu        output.label = 'Bytes / Packet'
3821881Sbinkertn@umich.edu        display()
3831881Sbinkertn@umich.edu        return
3841881Sbinkertn@umich.edu
3851881Sbinkertn@umich.edu    if command == 'rxbpp':
3861881Sbinkertn@umich.edu        output.stat = etherdev.rxBytes / etherdev.rxPackets
3871881Sbinkertn@umich.edu        output.label = 'Receive Bytes / Packet'
3881881Sbinkertn@umich.edu        display()
3891881Sbinkertn@umich.edu        return
3901881Sbinkertn@umich.edu
3911881Sbinkertn@umich.edu    if command == 'txbpp':
3921881Sbinkertn@umich.edu        output.stat = etherdev.txBytes / etherdev.txPackets
3931881Sbinkertn@umich.edu        output.label = 'Transmit Bytes / Packet'
3941881Sbinkertn@umich.edu        display()
3951881Sbinkertn@umich.edu        return
3961881Sbinkertn@umich.edu
3971881Sbinkertn@umich.edu    if command == 'rtp':
3981881Sbinkertn@umich.edu        output.stat = etherdev.rxPackets / etherdev.txPackets
3991881Sbinkertn@umich.edu        output.label = 'rxPackets / txPackets'
4001881Sbinkertn@umich.edu        display()
4011881Sbinkertn@umich.edu        return
4021881Sbinkertn@umich.edu
4031881Sbinkertn@umich.edu    if command == 'rtb':
4041881Sbinkertn@umich.edu        output.stat = etherdev.rxBytes / etherdev.txBytes
4051881Sbinkertn@umich.edu        output.label = 'rxBytes / txBytes'
4061881Sbinkertn@umich.edu        display()
4071881Sbinkertn@umich.edu        return
4081881Sbinkertn@umich.edu
4091881Sbinkertn@umich.edu    misses = system.l2.overall_mshr_misses
4101881Sbinkertn@umich.edu
4111049Sbinkertn@umich.edu    if command == 'misses':
4121881Sbinkertn@umich.edu        output.stat = misses
4131881Sbinkertn@umich.edu        output.label = 'Overall MSHR Misses'
4141881Sbinkertn@umich.edu        display()
4151049Sbinkertn@umich.edu        return
4161049Sbinkertn@umich.edu
4171049Sbinkertn@umich.edu    if command == 'mpkb':
4181881Sbinkertn@umich.edu        output.stat = misses / (bytes / 1024)
4191881Sbinkertn@umich.edu        output.binstats = [ misses ]
4201881Sbinkertn@umich.edu        output.label = 'Misses / KB'
4211881Sbinkertn@umich.edu        display()
4221049Sbinkertn@umich.edu        return
4231049Sbinkertn@umich.edu
4241269Sbinkertn@umich.edu    if command == 'ipkb':
4251604Srdreslin@umich.edu        interrupts = system.full0.kern.faults[4]
4261881Sbinkertn@umich.edu        output.stat = interrupts / kbytes
4271881Sbinkertn@umich.edu        output.binstats = [ interrupts ]
4281881Sbinkertn@umich.edu        output.label = 'Interrupts / KB'
4291881Sbinkertn@umich.edu        display()
4301269Sbinkertn@umich.edu        return
4311269Sbinkertn@umich.edu
4321049Sbinkertn@umich.edu    if command == 'execute':
4331881Sbinkertn@umich.edu        output.stat = system.full0.ISSUE__count
4341881Sbinkertn@umich.edu        display()
4351049Sbinkertn@umich.edu        return
4361049Sbinkertn@umich.edu
4371049Sbinkertn@umich.edu    if command == 'commit':
4381881Sbinkertn@umich.edu        output.stat = system.full0.COM__count
4391881Sbinkertn@umich.edu        display()
4401049Sbinkertn@umich.edu        return
4411049Sbinkertn@umich.edu
4421049Sbinkertn@umich.edu    if command == 'fetch':
4431881Sbinkertn@umich.edu        output.stat = system.full0.FETCH__count
4441881Sbinkertn@umich.edu        display()
4451049Sbinkertn@umich.edu        return
4461049Sbinkertn@umich.edu
4471049Sbinkertn@umich.edu    raise CommandException
4481049Sbinkertn@umich.edu
4491049Sbinkertn@umich.edu
4501049Sbinkertn@umich.educlass Options: pass
4511049Sbinkertn@umich.edu
4521049Sbinkertn@umich.eduif __name__ == '__main__':
4531049Sbinkertn@umich.edu    import getpass
4541881Sbinkertn@umich.edu    from jobfile import JobFile
4551049Sbinkertn@umich.edu
4561049Sbinkertn@umich.edu    options = Options()
4571881Sbinkertn@umich.edu    options.host = None
4581049Sbinkertn@umich.edu    options.db = None
4591049Sbinkertn@umich.edu    options.passwd = ''
4601049Sbinkertn@umich.edu    options.user = getpass.getuser()
4611049Sbinkertn@umich.edu    options.runs = None
4621049Sbinkertn@umich.edu    options.system = 'client'
4631049Sbinkertn@umich.edu    options.get = None
4641076Sbinkertn@umich.edu    options.binned = False
4651076Sbinkertn@umich.edu    options.graph = False
4661301Ssaidi@eecs.umich.edu    options.ticks = False
4671881Sbinkertn@umich.edu    options.printmode = 'G'
4681918Sbinkertn@umich.edu    jobfilename = 'Test.py'
4691881Sbinkertn@umich.edu    options.jobfile = None
4701881Sbinkertn@umich.edu    options.all = False
4711049Sbinkertn@umich.edu
4721918Sbinkertn@umich.edu    opts, args = getopts(sys.argv[1:], '-BEFG:Jad:g:h:j:pr:s:u:T:')
4731049Sbinkertn@umich.edu    for o,a in opts:
4741049Sbinkertn@umich.edu        if o == '-B':
4751049Sbinkertn@umich.edu            options.binned = True
4761049Sbinkertn@umich.edu        if o == '-E':
4771881Sbinkertn@umich.edu            options.printmode = 'E'
4781049Sbinkertn@umich.edu        if o == '-F':
4791881Sbinkertn@umich.edu            options.printmode = 'F'
4801049Sbinkertn@umich.edu        if o == '-G':
4811881Sbinkertn@umich.edu            options.get = a
4821881Sbinkertn@umich.edu        if o == '-a':
4831881Sbinkertn@umich.edu            options.all = True
4841049Sbinkertn@umich.edu        if o == '-d':
4851049Sbinkertn@umich.edu            options.db = a
4861049Sbinkertn@umich.edu        if o == '-g':
4871881Sbinkertn@umich.edu            options.graph = True;
4881881Sbinkertn@umich.edu            options.graphdir = a
4891049Sbinkertn@umich.edu        if o == '-h':
4901049Sbinkertn@umich.edu            options.host = a
4911918Sbinkertn@umich.edu        if o == '-J':
4921918Sbinkertn@umich.edu            jobfilename = None
4931881Sbinkertn@umich.edu        if o == '-j':
4941918Sbinkertn@umich.edu            jobfilename = a
4951049Sbinkertn@umich.edu        if o == '-p':
4961049Sbinkertn@umich.edu            options.passwd = getpass.getpass()
4971049Sbinkertn@umich.edu        if o == '-r':
4981049Sbinkertn@umich.edu            options.runs = a
4991049Sbinkertn@umich.edu        if o == '-u':
5001049Sbinkertn@umich.edu            options.user = a
5011049Sbinkertn@umich.edu        if o == '-s':
5021049Sbinkertn@umich.edu            options.system = a
5031301Ssaidi@eecs.umich.edu        if o == '-T':
5041301Ssaidi@eecs.umich.edu            options.ticks = a
5051049Sbinkertn@umich.edu
5061918Sbinkertn@umich.edu    if jobfilename:
5071918Sbinkertn@umich.edu        options.jobfile = JobFile(jobfilename)
5081881Sbinkertn@umich.edu        if not options.host:
5091881Sbinkertn@umich.edu            options.host = options.jobfile.dbhost
5101881Sbinkertn@umich.edu        if not options.db:
5111881Sbinkertn@umich.edu            options.db = options.jobfile.statdb
5121881Sbinkertn@umich.edu
5131881Sbinkertn@umich.edu    if not options.host:
5141881Sbinkertn@umich.edu        sys.exit('Database server must be provided from a jobfile or -h')
5151881Sbinkertn@umich.edu
5161881Sbinkertn@umich.edu    if not options.db:
5171881Sbinkertn@umich.edu        sys.exit('Database name must be provided from a jobfile or -d')
5181881Sbinkertn@umich.edu
5191049Sbinkertn@umich.edu    if len(args) == 0:
5201049Sbinkertn@umich.edu        usage()
5211049Sbinkertn@umich.edu
5221049Sbinkertn@umich.edu    command = args[0]
5231049Sbinkertn@umich.edu    args = args[1:]
5241049Sbinkertn@umich.edu
5251049Sbinkertn@umich.edu    try:
5261049Sbinkertn@umich.edu        commands(options, command, args)
5271049Sbinkertn@umich.edu    except CommandException:
5281049Sbinkertn@umich.edu        usage()
529