1*1a3d31e3SAndroid Build Coastguard Worker#! /usr/bin/env python 2*1a3d31e3SAndroid Build Coastguard Worker# 3*1a3d31e3SAndroid Build Coastguard Worker# btt blkno plotting interface 4*1a3d31e3SAndroid Build Coastguard Worker# 5*1a3d31e3SAndroid Build Coastguard Worker# (C) Copyright 2008 Hewlett-Packard Development Company, L.P. 6*1a3d31e3SAndroid Build Coastguard Worker# 7*1a3d31e3SAndroid Build Coastguard Worker# This program is free software; you can redistribute it and/or modify 8*1a3d31e3SAndroid Build Coastguard Worker# it under the terms of the GNU General Public License as published by 9*1a3d31e3SAndroid Build Coastguard Worker# the Free Software Foundation; either version 2 of the License, or 10*1a3d31e3SAndroid Build Coastguard Worker# (at your option) any later version. 11*1a3d31e3SAndroid Build Coastguard Worker# 12*1a3d31e3SAndroid Build Coastguard Worker# This program is distributed in the hope that it will be useful, 13*1a3d31e3SAndroid Build Coastguard Worker# but WITHOUT ANY WARRANTY; without even the implied warranty of 14*1a3d31e3SAndroid Build Coastguard Worker# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15*1a3d31e3SAndroid Build Coastguard Worker# GNU General Public License for more details. 16*1a3d31e3SAndroid Build Coastguard Worker# 17*1a3d31e3SAndroid Build Coastguard Worker# You should have received a copy of the GNU General Public License 18*1a3d31e3SAndroid Build Coastguard Worker# along with this program; if not, write to the Free Software 19*1a3d31e3SAndroid Build Coastguard Worker# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 20*1a3d31e3SAndroid Build Coastguard Worker# 21*1a3d31e3SAndroid Build Coastguard Worker""" 22*1a3d31e3SAndroid Build Coastguard Workerbno_plot.py 23*1a3d31e3SAndroid Build Coastguard Worker [ -h | --help ] 24*1a3d31e3SAndroid Build Coastguard Worker [ -K | --keys-below ] 25*1a3d31e3SAndroid Build Coastguard Worker [ -v | --verbose ] 26*1a3d31e3SAndroid Build Coastguard Worker [ <file...> ] 27*1a3d31e3SAndroid Build Coastguard Worker 28*1a3d31e3SAndroid Build Coastguard WorkerUtilizes gnuplot to generate a 3D plot of the block number output 29*1a3d31e3SAndroid Build Coastguard Workerfrom btt. If no <files> are specified, it will utilize all files 30*1a3d31e3SAndroid Build Coastguard Workergenerated after btt was run with -B blknos (meaning: all files of the 31*1a3d31e3SAndroid Build Coastguard Workerform blknos*[rw].dat). 32*1a3d31e3SAndroid Build Coastguard Worker 33*1a3d31e3SAndroid Build Coastguard WorkerThe -K option forces bno_plot.py to put the keys below the graph, 34*1a3d31e3SAndroid Build Coastguard Workertypically all keys for input files are put in the upper right corner 35*1a3d31e3SAndroid Build Coastguard Workerof the graph. If the number of devices exceed 10, then bno_plot.py will 36*1a3d31e3SAndroid Build Coastguard Workerautomatically push the keys under the graph. 37*1a3d31e3SAndroid Build Coastguard Worker 38*1a3d31e3SAndroid Build Coastguard WorkerTo exit the plotter, enter 'quit' or ^D at the 'gnuplot> ' prompt. 39*1a3d31e3SAndroid Build Coastguard Worker""" 40*1a3d31e3SAndroid Build Coastguard Worker 41*1a3d31e3SAndroid Build Coastguard Workerimport getopt, glob, os, sys, tempfile 42*1a3d31e3SAndroid Build Coastguard Worker 43*1a3d31e3SAndroid Build Coastguard Workerverbose = 0 44*1a3d31e3SAndroid Build Coastguard Workercmds = """ 45*1a3d31e3SAndroid Build Coastguard Workerset title 'btt Generated Block Accesses' 46*1a3d31e3SAndroid Build Coastguard Workerset xlabel 'Time (secs)' 47*1a3d31e3SAndroid Build Coastguard Workerset ylabel 'Block Number' 48*1a3d31e3SAndroid Build Coastguard Workerset zlabel '# Blocks per IO' 49*1a3d31e3SAndroid Build Coastguard Workerset grid 50*1a3d31e3SAndroid Build Coastguard Worker""" 51*1a3d31e3SAndroid Build Coastguard Worker 52*1a3d31e3SAndroid Build Coastguard Worker 53*1a3d31e3SAndroid Build Coastguard Worker#----------------------------------------------------------------------------- 54*1a3d31e3SAndroid Build Coastguard Workerdef parse_args(in_args): 55*1a3d31e3SAndroid Build Coastguard Worker global verbose 56*1a3d31e3SAndroid Build Coastguard Worker 57*1a3d31e3SAndroid Build Coastguard Worker keys_below = False 58*1a3d31e3SAndroid Build Coastguard Worker s_opts = 'hKv' 59*1a3d31e3SAndroid Build Coastguard Worker l_opts = [ 'help', 'keys-below', 'verbose' ] 60*1a3d31e3SAndroid Build Coastguard Worker 61*1a3d31e3SAndroid Build Coastguard Worker try: 62*1a3d31e3SAndroid Build Coastguard Worker (opts, args) = getopt.getopt(in_args, s_opts, l_opts) 63*1a3d31e3SAndroid Build Coastguard Worker except getopt.error, msg: 64*1a3d31e3SAndroid Build Coastguard Worker print >>sys.stderr, msg 65*1a3d31e3SAndroid Build Coastguard Worker print >>sys.stderr, __doc__ 66*1a3d31e3SAndroid Build Coastguard Worker sys.exit(1) 67*1a3d31e3SAndroid Build Coastguard Worker 68*1a3d31e3SAndroid Build Coastguard Worker for (o, a) in opts: 69*1a3d31e3SAndroid Build Coastguard Worker if o in ('-h', '--help'): 70*1a3d31e3SAndroid Build Coastguard Worker print __doc__ 71*1a3d31e3SAndroid Build Coastguard Worker sys.exit(0) 72*1a3d31e3SAndroid Build Coastguard Worker elif o in ('-v', '--verbose'): 73*1a3d31e3SAndroid Build Coastguard Worker verbose += 1 74*1a3d31e3SAndroid Build Coastguard Worker elif o in ('-K', '--keys-below'): 75*1a3d31e3SAndroid Build Coastguard Worker keys_below = True 76*1a3d31e3SAndroid Build Coastguard Worker 77*1a3d31e3SAndroid Build Coastguard Worker if len(args) > 0: bnos = args 78*1a3d31e3SAndroid Build Coastguard Worker else: bnos = glob.glob('blknos*[rw].dat') 79*1a3d31e3SAndroid Build Coastguard Worker 80*1a3d31e3SAndroid Build Coastguard Worker return (bnos, keys_below) 81*1a3d31e3SAndroid Build Coastguard Worker 82*1a3d31e3SAndroid Build Coastguard Worker#----------------------------------------------------------------------------- 83*1a3d31e3SAndroid Build Coastguard Workerif __name__ == '__main__': 84*1a3d31e3SAndroid Build Coastguard Worker (bnos, keys_below) = parse_args(sys.argv[1:]) 85*1a3d31e3SAndroid Build Coastguard Worker 86*1a3d31e3SAndroid Build Coastguard Worker if verbose: 87*1a3d31e3SAndroid Build Coastguard Worker print 'Using files:', 88*1a3d31e3SAndroid Build Coastguard Worker for bno in bnos: print bno, 89*1a3d31e3SAndroid Build Coastguard Worker if keys_below: print '\nKeys are to be placed below graph' 90*1a3d31e3SAndroid Build Coastguard Worker else: print '' 91*1a3d31e3SAndroid Build Coastguard Worker 92*1a3d31e3SAndroid Build Coastguard Worker tmpdir = tempfile.mktemp() 93*1a3d31e3SAndroid Build Coastguard Worker os.mkdir(tmpdir) 94*1a3d31e3SAndroid Build Coastguard Worker 95*1a3d31e3SAndroid Build Coastguard Worker plot_cmd = None 96*1a3d31e3SAndroid Build Coastguard Worker for f in bnos: 97*1a3d31e3SAndroid Build Coastguard Worker t = '%s/%s' % (tmpdir, f) 98*1a3d31e3SAndroid Build Coastguard Worker 99*1a3d31e3SAndroid Build Coastguard Worker fo = open(t, 'w') 100*1a3d31e3SAndroid Build Coastguard Worker for line in open(f, 'r'): 101*1a3d31e3SAndroid Build Coastguard Worker fld = line.split(None) 102*1a3d31e3SAndroid Build Coastguard Worker print >>fo, fld[0], fld[1], int(fld[2])-int(fld[1]) 103*1a3d31e3SAndroid Build Coastguard Worker fo.close() 104*1a3d31e3SAndroid Build Coastguard Worker 105*1a3d31e3SAndroid Build Coastguard Worker t = t[t.rfind('/')+1:] 106*1a3d31e3SAndroid Build Coastguard Worker if plot_cmd == None: plot_cmd = "splot '%s'" % t 107*1a3d31e3SAndroid Build Coastguard Worker else: plot_cmd = "%s,'%s'" % (plot_cmd, t) 108*1a3d31e3SAndroid Build Coastguard Worker 109*1a3d31e3SAndroid Build Coastguard Worker fo = open('%s/plot.cmds' % tmpdir, 'w') 110*1a3d31e3SAndroid Build Coastguard Worker print >>fo, cmds 111*1a3d31e3SAndroid Build Coastguard Worker if len(bnos) > 10 or keys_below: print >>fo, 'set key below' 112*1a3d31e3SAndroid Build Coastguard Worker print >>fo, plot_cmd 113*1a3d31e3SAndroid Build Coastguard Worker fo.close() 114*1a3d31e3SAndroid Build Coastguard Worker 115*1a3d31e3SAndroid Build Coastguard Worker pid = os.fork() 116*1a3d31e3SAndroid Build Coastguard Worker if pid == 0: 117*1a3d31e3SAndroid Build Coastguard Worker cmd = 'gnuplot %s/plot.cmds -' % tmpdir 118*1a3d31e3SAndroid Build Coastguard Worker 119*1a3d31e3SAndroid Build Coastguard Worker if verbose: print 'Executing %s' % cmd 120*1a3d31e3SAndroid Build Coastguard Worker 121*1a3d31e3SAndroid Build Coastguard Worker os.chdir(tmpdir) 122*1a3d31e3SAndroid Build Coastguard Worker os.system(cmd) 123*1a3d31e3SAndroid Build Coastguard Worker sys.exit(1) 124*1a3d31e3SAndroid Build Coastguard Worker 125*1a3d31e3SAndroid Build Coastguard Worker os.waitpid(pid, 0) 126*1a3d31e3SAndroid Build Coastguard Worker os.system('/bin/rm -rf ' + tmpdir) 127