util: Add script to plot DRAM low power sweep
[gem5.git] / util / plot_dram / lowp_dram_sweep_plot.py
1 #! /usr/bin/python
2 #
3 # Copyright (c) 2017 ARM Limited
4 # All rights reserved
5 #
6 # The license below extends only to copyright in the software and shall
7 # not be construed as granting a license to any other intellectual
8 # property including but not limited to intellectual property relating
9 # to a hardware implementation of the functionality of the software
10 # licensed hereunder. You may use the software subject to the license
11 # terms below provided that you ensure that this notice is replicated
12 # unmodified and in its entirety in all distributions of the software,
13 # modified or unmodified, in source code or in binary form.
14 #
15 # Redistribution and use in source and binary forms, with or without
16 # modification, are permitted provided that the following conditions are
17 # met: redistributions of source code must retain the above copyright
18 # notice, this list of conditions and the following disclaimer;
19 # redistributions in binary form must reproduce the above copyright
20 # notice, this list of conditions and the following disclaimer in the
21 # documentation and/or other materials provided with the distribution;
22 # neither the name of the copyright holders nor the names of its
23 # contributors may be used to endorse or promote products derived from
24 # this software without specific prior written permission.
25 #
26 # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
27 # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
28 # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
29 # A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
30 # OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
31 # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
32 # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
33 # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
34 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
35 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
36 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
37 #
38 # Authors: Radhika Jagtap
39
40 import PlotPowerStates as plotter
41 import argparse
42 import os
43 from subprocess import call
44
45 parser = argparse.ArgumentParser(formatter_class=
46 argparse.ArgumentDefaultsHelpFormatter)
47
48 parser.add_argument("--statsfile", required=True, help="stats file path")
49
50 parser.add_argument("--bankutils", default="b1 b2 b3", help="target bank " \
51 "utilization values separated by space, e.g. \"1 4 8\"")
52
53 parser.add_argument("--seqbytes", default="s1 s2 s3", help="no. of " \
54 "sequential bytes requested by each traffic gen request." \
55 " e.g. \"64 256 512\"")
56
57 parser.add_argument("--delays", default="d1 d2 d3", help="string of delay"
58 " values separated by a space. e.g. \"1 20 100\"")
59
60 parser.add_argument("--outdir", help="directory to output plots",
61 default='plot_test')
62
63 parser.add_argument("--pdf", action='store_true', help="output Latex and pdf")
64
65 def main():
66 args = parser.parse_args()
67 if not os.path.isfile(args.statsfile):
68 exit('Error! File not found: %s' % args.statsfile)
69 if not os.path.isdir(args.outdir):
70 os.mkdir(args.outdir)
71
72 bank_util_list = args.bankutils.strip().split()
73 seqbyte_list = args.seqbytes.strip().split()
74 delays = args.delays.strip().split()
75 plotter.plotLowPStates(args.outdir + '/', args.statsfile, bank_util_list,
76 seqbyte_list, delays)
77
78 if args.pdf:
79 textwidth = '0.5'
80
81 ### Time and energy plots ###
82 #############################
83 # place tex and pdf files in outdir
84 os.chdir(args.outdir)
85 texfile_s = 'stacked_lowp_sweep.tex'
86 print "\t", texfile_s
87 outfile = open(texfile_s, 'w')
88
89 startDocText(outfile)
90 outfile.write("\\begin{figure} \n\centering\n")
91 ## Time plots for all delay values
92 for delay in delays:
93 # Time
94 filename = plotter.stateTimePlotName(str(delay) + '-')
95 outfile.write(wrapForGraphic(filename, textwidth))
96 outfile.write(getCaption(delay))
97 outfile.write("\end{figure}\n")
98
99 # Energy plots for all delay values
100 outfile.write("\\begin{figure} \n\centering\n")
101 for delay in delays:
102 # Energy
103 filename = plotter.stateEnergyPlotName(str(delay) + '-')
104 outfile.write(wrapForGraphic(filename, textwidth))
105 outfile.write(getCaption(delay))
106 outfile.write("\end{figure}\n")
107
108 endDocText(outfile)
109 outfile.close()
110
111 print "\n Generating pdf file"
112 print "*******************************"
113 print "\tpdflatex ", texfile_s
114 # Run pdflatex to generate to pdf
115 call(["pdflatex", texfile_s])
116 call(["open", texfile_s.split('.')[0] + '.pdf'])
117
118
119 def getCaption(delay):
120 return ('\caption{' +
121 'itt delay = ' + str(delay) +
122 '}\n')
123
124 def wrapForGraphic(filename, width='1.0'):
125 # \t is tab and needs to be escaped, therefore \\textwidth
126 return '\includegraphics[width=' + width + \
127 '\\textwidth]{' + filename + '}\n'
128
129 def startDocText(outfile):
130
131 start_stuff = '''
132 \documentclass[a4paper,landscape,twocolumn]{article}
133
134 \usepackage{graphicx}
135 \usepackage[margin=0.5cm]{geometry}
136 \\begin{document}
137 '''
138 outfile.write(start_stuff)
139
140 def endDocText(outfile):
141
142 end_stuff = '''
143
144 \end{document}
145
146 '''
147 outfile.write(end_stuff)
148
149 # Call main
150 if __name__ == '__main__':
151 main()