1*f8a1b7d9SAlexander Kabaev#!/usr/bin/python
2*f8a1b7d9SAlexander Kabaev
3*f8a1b7d9SAlexander Kabaevimport string
4*f8a1b7d9SAlexander Kabaevimport sys
5*f8a1b7d9SAlexander Kabaevimport re
6*f8a1b7d9SAlexander Kabaevimport os
7*f8a1b7d9SAlexander Kabaevimport platform
8*f8a1b7d9SAlexander Kabaevimport commands
9*f8a1b7d9SAlexander Kabaevfrom Numeric import *
10*f8a1b7d9SAlexander Kabaevfrom pychart import *
11*f8a1b7d9SAlexander Kabaevfrom xml.dom import minidom
12*f8a1b7d9SAlexander Kabaev
13*f8a1b7d9SAlexander Kabaevclass exception:
14*f8a1b7d9SAlexander Kabaev	pass
15*f8a1b7d9SAlexander Kabaev
16*f8a1b7d9SAlexander Kabaev
17*f8a1b7d9SAlexander Kabaevdef comp_platform_info(compiler):
18*f8a1b7d9SAlexander Kabaev	ret = '<ul>\n'
19*f8a1b7d9SAlexander Kabaev	so = commands.getstatusoutput('cat /proc/cpuinfo | grep \'cpu MHz\'')
20*f8a1b7d9SAlexander Kabaev	if so[0] == 0:
21*f8a1b7d9SAlexander Kabaev		ret += '<li>CPU speed - %s</li>\n' % so[1]
22*f8a1b7d9SAlexander Kabaev	so = commands.getstatusoutput('cat /proc/meminfo | grep \'MemTotal\'')
23*f8a1b7d9SAlexander Kabaev	if so[0] == 0:
24*f8a1b7d9SAlexander Kabaev		ret += '<li>Memory - %s</li>\n' % so[1]
25*f8a1b7d9SAlexander Kabaev	ret += '<li>Platform - %s</li>\n' % platform.platform()
26*f8a1b7d9SAlexander Kabaev	so = commands.getstatusoutput(compiler + ' --version')
27*f8a1b7d9SAlexander Kabaev	if so[0] == 0:
28*f8a1b7d9SAlexander Kabaev		ret += '<li>Compiler - %s</li>\n' % so[1]
29*f8a1b7d9SAlexander Kabaev	ret += '</ul>\n'
30*f8a1b7d9SAlexander Kabaev	return ret
31*f8a1b7d9SAlexander Kabaev
32*f8a1b7d9SAlexander Kabaev
33*f8a1b7d9SAlexander Kabaevclass res:
34*f8a1b7d9SAlexander Kabaev	"""
35*f8a1b7d9SAlexander Kabaev	A 'structure' representing the results of a test.
36*f8a1b7d9SAlexander Kabaev	"""
37*f8a1b7d9SAlexander Kabaev	def __init__(self, x_label, y_label, cntnr_list, cntnr_descs, res_sets):
38*f8a1b7d9SAlexander Kabaev		self.x_label = x_label
39*f8a1b7d9SAlexander Kabaev		self.y_label = y_label
40*f8a1b7d9SAlexander Kabaev		self.cntnr_list = cntnr_list
41*f8a1b7d9SAlexander Kabaev		self.cntnr_descs = cntnr_descs
42*f8a1b7d9SAlexander Kabaev		self.res_sets = res_sets
43*f8a1b7d9SAlexander Kabaev
44*f8a1b7d9SAlexander Kabaev
45*f8a1b7d9SAlexander Kabaevclass res_getter:
46*f8a1b7d9SAlexander Kabaev	"""
47*f8a1b7d9SAlexander Kabaev	This class returns a res object for some test.
48*f8a1b7d9SAlexander Kabaev	"""
49*f8a1b7d9SAlexander Kabaev	class __sorter:
50*f8a1b7d9SAlexander Kabaev		def __accum(self, results):
51*f8a1b7d9SAlexander Kabaev			total = 0
52*f8a1b7d9SAlexander Kabaev			for result in results:
53*f8a1b7d9SAlexander Kabaev				total = total + result[1]
54*f8a1b7d9SAlexander Kabaev			return total
55*f8a1b7d9SAlexander Kabaev
56*f8a1b7d9SAlexander Kabaev		def sort(self, cntnr_list, res_sets):
57*f8a1b7d9SAlexander Kabaev			cntnrs_and_totals = []
58*f8a1b7d9SAlexander Kabaev			for cntnr in cntnr_list:
59*f8a1b7d9SAlexander Kabaev				results = res_sets[cntnr]
60*f8a1b7d9SAlexander Kabaev				total = self.__accum(results)
61*f8a1b7d9SAlexander Kabaev				cntnrs_and_totals.append((cntnr, total))
62*f8a1b7d9SAlexander Kabaev			by_total = lambda x,y: x[1] > y[1] and -1 or 1
63*f8a1b7d9SAlexander Kabaev			cntnrs_and_totals.sort(by_total)
64*f8a1b7d9SAlexander Kabaev			ret = []
65*f8a1b7d9SAlexander Kabaev			for cntnr_and_total in cntnrs_and_totals:
66*f8a1b7d9SAlexander Kabaev				cntnr = cntnr_and_total[0]
67*f8a1b7d9SAlexander Kabaev				ret.append(cntnr)
68*f8a1b7d9SAlexander Kabaev			return ret
69*f8a1b7d9SAlexander Kabaev
70*f8a1b7d9SAlexander Kabaev	def __init__(self, test_infos_f_name):
71*f8a1b7d9SAlexander Kabaev		self.__test_to_container_res_sets = {}
72*f8a1b7d9SAlexander Kabaev		self.__test_to_f_names = {}
73*f8a1b7d9SAlexander Kabaev		tests_dat = minidom.parse(test_infos_f_name)
74*f8a1b7d9SAlexander Kabaev		for test in tests_dat.getElementsByTagName('test'):
75*f8a1b7d9SAlexander Kabaev			test_name = test.attributes['name'].value
76*f8a1b7d9SAlexander Kabaev			self.__test_to_f_names[test_name] = test.getElementsByTagName('file')[0].attributes['name'].value
77*f8a1b7d9SAlexander Kabaev			cntnr_list = []
78*f8a1b7d9SAlexander Kabaev			for cntnr in test.getElementsByTagName('cntnr'):
79*f8a1b7d9SAlexander Kabaev				cntnr_list.append(cntnr.attributes['name'].value)
80*f8a1b7d9SAlexander Kabaev			self.__test_to_container_res_sets[test_name] = cntnr_list
81*f8a1b7d9SAlexander Kabaev
82*f8a1b7d9SAlexander Kabaev	def __get_label(self, tst_dat, label_name):
83*f8a1b7d9SAlexander Kabaev		label = tst_dat.getElementsByTagName(label_name)[0].firstChild.data
84*f8a1b7d9SAlexander Kabaev		label = string.strip(label, '\n')
85*f8a1b7d9SAlexander Kabaev		label = string.strip(label)
86*f8a1b7d9SAlexander Kabaev		return label
87*f8a1b7d9SAlexander Kabaev
88*f8a1b7d9SAlexander Kabaev	def __parse_res_sets(self, f_name, cntnr_list):
89*f8a1b7d9SAlexander Kabaev		tst_dat = minidom.parse(f_name)
90*f8a1b7d9SAlexander Kabaev		x_label = self.__get_label(tst_dat, 'x_name')
91*f8a1b7d9SAlexander Kabaev		y_label = self.__get_label(tst_dat, 'y_name')
92*f8a1b7d9SAlexander Kabaev		parsed_container_list = tst_dat.getElementsByTagName('cntnr')
93*f8a1b7d9SAlexander Kabaev		res_sets = {}
94*f8a1b7d9SAlexander Kabaev		cntnr_descs = {}
95*f8a1b7d9SAlexander Kabaev		for cntnr in parsed_container_list:
96*f8a1b7d9SAlexander Kabaev			cntnr_name = cntnr.attributes["name"].value
97*f8a1b7d9SAlexander Kabaev			res_sets[cntnr_name] = []
98*f8a1b7d9SAlexander Kabaev		for cntnr in parsed_container_list:
99*f8a1b7d9SAlexander Kabaev			cntnr_name = cntnr.attributes["name"].value
100*f8a1b7d9SAlexander Kabaev			cntnr_desc = cntnr.getElementsByTagName('desc')
101*f8a1b7d9SAlexander Kabaev			if res_sets.has_key(cntnr_name):
102*f8a1b7d9SAlexander Kabaev				res_set = []
103*f8a1b7d9SAlexander Kabaev				result_list = cntnr.getElementsByTagName('result')
104*f8a1b7d9SAlexander Kabaev				for result in result_list:
105*f8a1b7d9SAlexander Kabaev					x = string.atol(result.attributes["x"].value)
106*f8a1b7d9SAlexander Kabaev					y = string.atof(result.attributes["y"].value)
107*f8a1b7d9SAlexander Kabaev					res_set.append((x, y))
108*f8a1b7d9SAlexander Kabaev				res_sets[cntnr_name] = res_set
109*f8a1b7d9SAlexander Kabaev				cntnr_descs[cntnr_name] = cntnr_desc[0]
110*f8a1b7d9SAlexander Kabaev		return (x_label, y_label, cntnr_descs, res_sets)
111*f8a1b7d9SAlexander Kabaev
112*f8a1b7d9SAlexander Kabaev	def get(self, res_dir, test_name):
113*f8a1b7d9SAlexander Kabaev		cntnr_list = self.__test_to_container_res_sets[test_name]
114*f8a1b7d9SAlexander Kabaev		f_name = res_dir + '/' + self.__test_to_f_names[test_name]
115*f8a1b7d9SAlexander Kabaev		parsed = self.__parse_res_sets(f_name, cntnr_list)
116*f8a1b7d9SAlexander Kabaev		x_label = parsed[0]
117*f8a1b7d9SAlexander Kabaev		y_label = parsed[1]
118*f8a1b7d9SAlexander Kabaev		cntnr_descs = parsed[2]
119*f8a1b7d9SAlexander Kabaev		res_sets = parsed[3]
120*f8a1b7d9SAlexander Kabaev		cntnr_list = self.__sorter().sort(cntnr_list, res_sets)
121*f8a1b7d9SAlexander Kabaev		return res(x_label, y_label, cntnr_list, cntnr_descs, res_sets)
122*f8a1b7d9SAlexander Kabaev
123*f8a1b7d9SAlexander Kabaev
124*f8a1b7d9SAlexander Kabaevclass png_maker:
125*f8a1b7d9SAlexander Kabaev	"""
126*f8a1b7d9SAlexander Kabaev	This class creates a png file from a result set.
127*f8a1b7d9SAlexander Kabaev	"""
128*f8a1b7d9SAlexander Kabaev	class __style_chooser:
129*f8a1b7d9SAlexander Kabaev		def __init__(self):
130*f8a1b7d9SAlexander Kabaev			self.native_re = re.compile(r'n_(?:.*?)')
131*f8a1b7d9SAlexander Kabaev
132*f8a1b7d9SAlexander Kabaev			self.native_tick_mark_0 = tick_mark.Circle(size = 4)
133*f8a1b7d9SAlexander Kabaev			self.native_tick_mark_1 = tick_mark.Square(size = 4)
134*f8a1b7d9SAlexander Kabaev			self.native_line_style_0 = line_style.T(color = color.black, width=2)
135*f8a1b7d9SAlexander Kabaev			self.native_line_style_1 = line_style.T(color = color.black, width=2)
136*f8a1b7d9SAlexander Kabaev
137*f8a1b7d9SAlexander Kabaev			self.mask_re = re.compile(r'mask(?:.*?)')
138*f8a1b7d9SAlexander Kabaev			self.mod_re = re.compile(r'mod(?:.*?)')
139*f8a1b7d9SAlexander Kabaev
140*f8a1b7d9SAlexander Kabaev			self.rb_tree_mmap_rb_tree_set_re = re.compile(r'rb_tree_mmap_rb_tree_set(?:.*?)')
141*f8a1b7d9SAlexander Kabaev			self.rb_tree_mmap_lu_mtf_set_re = re.compile(r'rb_tree_mmap_lu_mtf_set(?:.*?)')
142*f8a1b7d9SAlexander Kabaev
143*f8a1b7d9SAlexander Kabaev			self.splay_re = re.compile(r'splay(?:.*?)')
144*f8a1b7d9SAlexander Kabaev			self.rb_tree_re = re.compile(r'rb_tree(?:.*?)')
145*f8a1b7d9SAlexander Kabaev			self.ov_tree_re = re.compile(r'ov_tree(?:.*?)')
146*f8a1b7d9SAlexander Kabaev			self.splay_tree_re = re.compile(r'splay_tree(?:.*?)')
147*f8a1b7d9SAlexander Kabaev
148*f8a1b7d9SAlexander Kabaev			self.pat_trie_re = re.compile(r'pat_trie(?:.*?)')
149*f8a1b7d9SAlexander Kabaev
150*f8a1b7d9SAlexander Kabaev			self.lc_1div8_1div2_re = re.compile(r'lc_1div8_1div2(?:.*?)')
151*f8a1b7d9SAlexander Kabaev			self.lc_1div8_1div1_re = re.compile(r'lc_1div8_1div1(?:.*?)')
152*f8a1b7d9SAlexander Kabaev			self.mcolc_1div2_re = re.compile(r'mcolc_1div2(?:.*?)')
153*f8a1b7d9SAlexander Kabaev
154*f8a1b7d9SAlexander Kabaev		def choose(self, cntnr):
155*f8a1b7d9SAlexander Kabaev			if self.native_re.search(cntnr):
156*f8a1b7d9SAlexander Kabaev				if cntnr == 'n_pq_vector':
157*f8a1b7d9SAlexander Kabaev					return (self.native_tick_mark_1, self.native_line_style_1)
158*f8a1b7d9SAlexander Kabaev
159*f8a1b7d9SAlexander Kabaev				return (self.native_tick_mark_0, self.native_line_style_0)
160*f8a1b7d9SAlexander Kabaev
161*f8a1b7d9SAlexander Kabaev			# tick_mark predefined
162*f8a1b7d9SAlexander Kabaev			# square, circle3, dia, tri, dtri, star, plus5, x5, gray70dia, blackdtri, blackdia
163*f8a1b7d9SAlexander Kabaev			if self.mask_re.search(cntnr):
164*f8a1b7d9SAlexander Kabaev				clr = color.navy
165*f8a1b7d9SAlexander Kabaev			elif self.mod_re.search(cntnr):
166*f8a1b7d9SAlexander Kabaev				clr = color.green4
167*f8a1b7d9SAlexander Kabaev			elif self.rb_tree_mmap_rb_tree_set_re.search(cntnr):
168*f8a1b7d9SAlexander Kabaev				clr = color.mediumblue
169*f8a1b7d9SAlexander Kabaev				tm = tick_mark.square
170*f8a1b7d9SAlexander Kabaev			elif self.rb_tree_mmap_lu_mtf_set_re.search(cntnr) or cntnr == 'rc_binomial_heap':
171*f8a1b7d9SAlexander Kabaev				clr = color.gray50
172*f8a1b7d9SAlexander Kabaev				tm = tick_mark.dia
173*f8a1b7d9SAlexander Kabaev			elif self.splay_tree_re.search(cntnr) or cntnr == 'binomial_heap':
174*f8a1b7d9SAlexander Kabaev				clr = color.gray58
175*f8a1b7d9SAlexander Kabaev				tm = tick_mark.tri
176*f8a1b7d9SAlexander Kabaev			elif self.rb_tree_re.search(cntnr) or cntnr == 'binary_heap':
177*f8a1b7d9SAlexander Kabaev				clr = color.red3
178*f8a1b7d9SAlexander Kabaev				tm = tick_mark.dtri
179*f8a1b7d9SAlexander Kabaev			elif self.ov_tree_re.search(cntnr) or cntnr == 'thin_heap':
180*f8a1b7d9SAlexander Kabaev				clr = color.orangered1
181*f8a1b7d9SAlexander Kabaev				tm = tick_mark.star
182*f8a1b7d9SAlexander Kabaev			elif self.pat_trie_re.search(cntnr) or cntnr == 'pairing_heap':
183*f8a1b7d9SAlexander Kabaev				clr = color.blueviolet
184*f8a1b7d9SAlexander Kabaev				tm = tick_mark.plus5
185*f8a1b7d9SAlexander Kabaev			else:
186*f8a1b7d9SAlexander Kabaev				sys.stderr.write(cntnr + '\n')
187*f8a1b7d9SAlexander Kabaev				raise exception
188*f8a1b7d9SAlexander Kabaev
189*f8a1b7d9SAlexander Kabaev                        # mask / mod
190*f8a1b7d9SAlexander Kabaev                        if cntnr.find('lc_1div8_1div') <> -1:
191*f8a1b7d9SAlexander Kabaev				if cntnr.find('mask') <> -1:
192*f8a1b7d9SAlexander Kabaev					# mask
193*f8a1b7d9SAlexander Kabaev					if self.lc_1div8_1div2_re.search(cntnr):
194*f8a1b7d9SAlexander Kabaev						if cntnr.find('nsth') <> -1:
195*f8a1b7d9SAlexander Kabaev							tm = tick_mark.x5
196*f8a1b7d9SAlexander Kabaev						else:
197*f8a1b7d9SAlexander Kabaev							tm = tick_mark.gray70dia
198*f8a1b7d9SAlexander Kabaev					if self.lc_1div8_1div1_re.search(cntnr):
199*f8a1b7d9SAlexander Kabaev						if cntnr.find('nsth') <> -1:
200*f8a1b7d9SAlexander Kabaev							tm = tick_mark.dia
201*f8a1b7d9SAlexander Kabaev                                                else:
202*f8a1b7d9SAlexander Kabaev							tm = tick_mark.circle3
203*f8a1b7d9SAlexander Kabaev                                else:
204*f8a1b7d9SAlexander Kabaev                                        # mod
205*f8a1b7d9SAlexander Kabaev					if self.lc_1div8_1div2_re.search(cntnr):
206*f8a1b7d9SAlexander Kabaev						if cntnr.find('nsth') <> -1:
207*f8a1b7d9SAlexander Kabaev							tm = tick_mark.tri
208*f8a1b7d9SAlexander Kabaev						else:
209*f8a1b7d9SAlexander Kabaev                                                        tm = tick_mark.square
210*f8a1b7d9SAlexander Kabaev					if self.lc_1div8_1div1_re.search(cntnr):
211*f8a1b7d9SAlexander Kabaev						if cntnr.find('nsth') <> -1:
212*f8a1b7d9SAlexander Kabaev                                                        tm = tick_mark.dtri
213*f8a1b7d9SAlexander Kabaev                                                else:
214*f8a1b7d9SAlexander Kabaev                                                        tm = tick_mark.star
215*f8a1b7d9SAlexander Kabaev
216*f8a1b7d9SAlexander Kabaev			if self.mcolc_1div2_re.search(cntnr):
217*f8a1b7d9SAlexander Kabaev				tm = tick_mark.circle3
218*f8a1b7d9SAlexander Kabaev
219*f8a1b7d9SAlexander Kabaev			return (tm, line_style.T(color = clr, width = 2))
220*f8a1b7d9SAlexander Kabaev
221*f8a1b7d9SAlexander Kabaev
222*f8a1b7d9SAlexander Kabaev	def __init__(self):
223*f8a1b7d9SAlexander Kabaev		self.__sc = self.__style_chooser()
224*f8a1b7d9SAlexander Kabaev		self.__mmap_re = re.compile('mmap_')
225*f8a1b7d9SAlexander Kabaev
226*f8a1b7d9SAlexander Kabaev	def __container_label_name(self, cntnr):
227*f8a1b7d9SAlexander Kabaev		return self.__mmap_re.sub('\nmmap_\n', cntnr)
228*f8a1b7d9SAlexander Kabaev
229*f8a1b7d9SAlexander Kabaev	def make(self, res, of_name):
230*f8a1b7d9SAlexander Kabaev		theme.output_format = 'png'
231*f8a1b7d9SAlexander Kabaev		theme.output_file = of_name
232*f8a1b7d9SAlexander Kabaev		theme.scale_factor = 2
233*f8a1b7d9SAlexander Kabaev#		theme.default_font_size = 5
234*f8a1b7d9SAlexander Kabaev		theme.use_color = 1
235*f8a1b7d9SAlexander Kabaev		theme.reinitialize()
236*f8a1b7d9SAlexander Kabaev		y_tick_interval = self.__get_y_tics(res)
237*f8a1b7d9SAlexander Kabaev		xaxis = axis.X(format = '/a90/hL%d',
238*f8a1b7d9SAlexander Kabaev			       tic_interval = 200,
239*f8a1b7d9SAlexander Kabaev			       label = res.x_label)
240*f8a1b7d9SAlexander Kabaev		yaxis = axis.Y(format = '%.2e',
241*f8a1b7d9SAlexander Kabaev			       tic_interval = y_tick_interval,
242*f8a1b7d9SAlexander Kabaev			       label = res.y_label)
243*f8a1b7d9SAlexander Kabaev		legend_lines = len(res.cntnr_list)
244*f8a1b7d9SAlexander Kabaev		legend_vloc = 50 + (legend_lines * 10)
245*f8a1b7d9SAlexander Kabaev		ar = area.T(x_axis = xaxis, y_axis = yaxis,
246*f8a1b7d9SAlexander Kabaev			    legend = legend.T(loc=(0,-legend_vloc),
247*f8a1b7d9SAlexander Kabaev					      frame_line_style=None,
248*f8a1b7d9SAlexander Kabaev					      inter_row_sep=2),
249*f8a1b7d9SAlexander Kabaev			    size=(240,110))
250*f8a1b7d9SAlexander Kabaev		plot_list = []
251*f8a1b7d9SAlexander Kabaev		for cntnr in res.cntnr_list:
252*f8a1b7d9SAlexander Kabaev			style = self.__sc.choose(cntnr)
253*f8a1b7d9SAlexander Kabaev			print cntnr
254*f8a1b7d9SAlexander Kabaev			pl = line_plot.T(label = self.__container_label_name(cntnr),
255*f8a1b7d9SAlexander Kabaev				data = res.res_sets[cntnr],
256*f8a1b7d9SAlexander Kabaev				tick_mark = style[0],
257*f8a1b7d9SAlexander Kabaev				line_style = style[1])
258*f8a1b7d9SAlexander Kabaev			plot_list.append(pl)
259*f8a1b7d9SAlexander Kabaev		for plot in plot_list:
260*f8a1b7d9SAlexander Kabaev			ar.add_plot(plot)
261*f8a1b7d9SAlexander Kabaev		ar.draw()
262*f8a1b7d9SAlexander Kabaev
263*f8a1b7d9SAlexander Kabaev
264*f8a1b7d9SAlexander Kabaev	def __get_y_tics(self, res):
265*f8a1b7d9SAlexander Kabaev		mx = 0
266*f8a1b7d9SAlexander Kabaev		for cntnr in res.cntnr_list:
267*f8a1b7d9SAlexander Kabaev			m = max(d[1] for d in res.res_sets[cntnr])
268*f8a1b7d9SAlexander Kabaev			mx = max(m, mx)
269*f8a1b7d9SAlexander Kabaev		return mx / 5
270*f8a1b7d9SAlexander Kabaev
271*f8a1b7d9SAlexander Kabaev
272*f8a1b7d9SAlexander Kabaev
273*f8a1b7d9SAlexander Kabaevdef make_tt(s):
274*f8a1b7d9SAlexander Kabaev	return '<tt>' + s + '</tt>'
275*f8a1b7d9SAlexander Kabaev
276*f8a1b7d9SAlexander Kabaevdef make_b(s):
277*f8a1b7d9SAlexander Kabaev	return '<b>' + s + '</b>'
278*f8a1b7d9SAlexander Kabaev
279*f8a1b7d9SAlexander Kabaevdef make_ttb(s):
280*f8a1b7d9SAlexander Kabaev	return '<tt><b>' + s + '</b></tt>'
281*f8a1b7d9SAlexander Kabaev
282*f8a1b7d9SAlexander Kabaevdef make_i(s):
283*f8a1b7d9SAlexander Kabaev	return '<i>' + s + '</i>'
284*f8a1b7d9SAlexander Kabaev
285*f8a1b7d9SAlexander Kabaevdef make_pb_ds_class_href(c_name):
286*f8a1b7d9SAlexander Kabaev	return '<a href = "' + c_name + '.html">' + make_tt(c_name) + '</a>\n'
287*f8a1b7d9SAlexander Kabaev
288*f8a1b7d9SAlexander Kabaevdef build_value_to_pb_ds_class_href(s_desc):
289*f8a1b7d9SAlexander Kabaev	value = s_desc.attributes['value'].value
290*f8a1b7d9SAlexander Kabaev	ret = make_pb_ds_class_href(value)
291*f8a1b7d9SAlexander Kabaev	return ret
292*f8a1b7d9SAlexander Kabaev
293*f8a1b7d9SAlexander Kabaevclass hash_desc_to_html_builder:
294*f8a1b7d9SAlexander Kabaev	def build_specific_comb_hash_fn(self, s_desc):
295*f8a1b7d9SAlexander Kabaev		comb_hash_fn_desc = s_desc.getElementsByTagName('Comb_Hash_Fn')[0]
296*f8a1b7d9SAlexander Kabaev		ret = make_tt('Comb_Hash_Fn')
297*f8a1b7d9SAlexander Kabaev		ret = ret + ' = '
298*f8a1b7d9SAlexander Kabaev		ret = ret + build_value_to_pb_ds_class_href(comb_hash_fn_desc)
299*f8a1b7d9SAlexander Kabaev		return ret
300*f8a1b7d9SAlexander Kabaev
301*f8a1b7d9SAlexander Kabaev	def __build_nom_denom(self, s_desc):
302*f8a1b7d9SAlexander Kabaev		nom_denom = s_desc.attributes['nom'].value + '/' + s_desc.attributes['denom'].value
303*f8a1b7d9SAlexander Kabaev		return make_i(nom_denom)
304*f8a1b7d9SAlexander Kabaev
305*f8a1b7d9SAlexander Kabaev	def __build_lc_trigger_desc(self, s_desc):
306*f8a1b7d9SAlexander Kabaev		ret = build_value_to_pb_ds_class_href(s_desc)
307*f8a1b7d9SAlexander Kabaev		ret = ret + ' with ' + make_i('&alpha;<sub>min</sub>')
308*f8a1b7d9SAlexander Kabaev		ret = ret + ' = '  + self.__build_nom_denom(s_desc.getElementsByTagName('alpha_min')[0])
309*f8a1b7d9SAlexander Kabaev		ret = ret + ' and ' + make_i('&alpha;<sub>max</sub>')
310*f8a1b7d9SAlexander Kabaev		ret = ret + ' = '  + self.__build_nom_denom(s_desc.getElementsByTagName('alpha_max')[0])
311*f8a1b7d9SAlexander Kabaev		return ret
312*f8a1b7d9SAlexander Kabaev
313*f8a1b7d9SAlexander Kabaev	def build_specific_resize_policy(self, s_desc):
314*f8a1b7d9SAlexander Kabaev		ret = make_tt('Resize_Policy')
315*f8a1b7d9SAlexander Kabaev		ret = ret + ' = '
316*f8a1b7d9SAlexander Kabaev		resize_policy_desc = s_desc.getElementsByTagName('Resize_Policy')[0]
317*f8a1b7d9SAlexander Kabaev		ret = ret + build_value_to_pb_ds_class_href(resize_policy_desc)
318*f8a1b7d9SAlexander Kabaev		ret = ret + ' with ' + make_tt('Size_Policy')
319*f8a1b7d9SAlexander Kabaev		ret = ret + ' = '
320*f8a1b7d9SAlexander Kabaev		size_policy_desc = resize_policy_desc.getElementsByTagName('Size_Policy')[0]
321*f8a1b7d9SAlexander Kabaev		ret = ret + build_value_to_pb_ds_class_href(size_policy_desc)
322*f8a1b7d9SAlexander Kabaev		ret = ret + ', and ' + make_tt('Trigger_Policy')
323*f8a1b7d9SAlexander Kabaev		ret = ret + ' = '
324*f8a1b7d9SAlexander Kabaev		trigger_policy_desc = resize_policy_desc.getElementsByTagName('Trigger_Policy')[0]
325*f8a1b7d9SAlexander Kabaev		if trigger_policy_desc.attributes['value'].value == 'hash_load_check_resize_trigger':
326*f8a1b7d9SAlexander Kabaev			ret = ret + self.__build_lc_trigger_desc(trigger_policy_desc)
327*f8a1b7d9SAlexander Kabaev		else:
328*f8a1b7d9SAlexander Kabaev			raise exception
329*f8a1b7d9SAlexander Kabaev		return ret
330*f8a1b7d9SAlexander Kabaev
331*f8a1b7d9SAlexander Kabaev
332*f8a1b7d9SAlexander Kabaevclass cc_hash_desc_to_html_builder:
333*f8a1b7d9SAlexander Kabaev	def __init__(self):
334*f8a1b7d9SAlexander Kabaev		self.__hash_builder = hash_desc_to_html_builder()
335*f8a1b7d9SAlexander Kabaev
336*f8a1b7d9SAlexander Kabaev	def build(self, s_desc):
337*f8a1b7d9SAlexander Kabaev		ret = build_value_to_pb_ds_class_href(s_desc)
338*f8a1b7d9SAlexander Kabaev		ret = ret + 'with ' + self.__hash_builder.build_specific_comb_hash_fn(s_desc)
339*f8a1b7d9SAlexander Kabaev		ret = ret + ', and ' + self.__hash_builder.build_specific_resize_policy(s_desc)
340*f8a1b7d9SAlexander Kabaev		return ret
341*f8a1b7d9SAlexander Kabaev
342*f8a1b7d9SAlexander Kabaev
343*f8a1b7d9SAlexander Kabaevclass gp_hash_desc_to_html_builder:
344*f8a1b7d9SAlexander Kabaev	def __init__(self):
345*f8a1b7d9SAlexander Kabaev		self.__hash_builder = hash_desc_to_html_builder()
346*f8a1b7d9SAlexander Kabaev
347*f8a1b7d9SAlexander Kabaev	def build(self, s_desc):
348*f8a1b7d9SAlexander Kabaev		ret = build_value_to_pb_ds_class_href(s_desc)
349*f8a1b7d9SAlexander Kabaev		ret = ret + ' with ' + self.__hash_builder.build_specific_comb_hash_fn(s_desc)
350*f8a1b7d9SAlexander Kabaev		ret = ret + ', ' + self.__hash_builder.build_specific_resize_policy(s_desc)
351*f8a1b7d9SAlexander Kabaev		ret = ret + ', and ' + make_tt('Probe_Fn')
352*f8a1b7d9SAlexander Kabaev		ret = ret + ' = '
353*f8a1b7d9SAlexander Kabaev		probe_fn = s_desc.getElementsByTagName('Probe_Fn')[0].attributes['value'].value
354*f8a1b7d9SAlexander Kabaev		ret = ret + make_pb_ds_class_href(probe_fn)
355*f8a1b7d9SAlexander Kabaev		return ret
356*f8a1b7d9SAlexander Kabaev
357*f8a1b7d9SAlexander Kabaev
358*f8a1b7d9SAlexander Kabaevclass basic_tree_like_desc_to_html_builder:
359*f8a1b7d9SAlexander Kabaev	def build_tag(self, s_desc):
360*f8a1b7d9SAlexander Kabaev		ret = make_tt('Tag')
361*f8a1b7d9SAlexander Kabaev		ret = ret + ' = '
362*f8a1b7d9SAlexander Kabaev		tag_desc = s_desc.getElementsByTagName('Tag')[0]
363*f8a1b7d9SAlexander Kabaev		ret = ret + build_value_to_pb_ds_class_href(tag_desc)
364*f8a1b7d9SAlexander Kabaev		return ret
365*f8a1b7d9SAlexander Kabaev
366*f8a1b7d9SAlexander Kabaev	def build_node_update(self, s_desc):
367*f8a1b7d9SAlexander Kabaev		ret = make_tt('Node_Update')
368*f8a1b7d9SAlexander Kabaev		ret = ret + ' = '
369*f8a1b7d9SAlexander Kabaev		node_update_desc = s_desc.getElementsByTagName('Node_Update')[0]
370*f8a1b7d9SAlexander Kabaev		ret = ret + build_value_to_pb_ds_class_href(node_update_desc)
371*f8a1b7d9SAlexander Kabaev		return ret
372*f8a1b7d9SAlexander Kabaev
373*f8a1b7d9SAlexander Kabaev
374*f8a1b7d9SAlexander Kabaevclass basic_tree_desc_to_html_builder:
375*f8a1b7d9SAlexander Kabaev	def __init__(self):
376*f8a1b7d9SAlexander Kabaev		self.__tree_like_builder = basic_tree_like_desc_to_html_builder()
377*f8a1b7d9SAlexander Kabaev
378*f8a1b7d9SAlexander Kabaev	def build(self, s_desc):
379*f8a1b7d9SAlexander Kabaev		ret = build_value_to_pb_ds_class_href(s_desc)
380*f8a1b7d9SAlexander Kabaev		ret = ret + ' with ' + self.__tree_like_builder.build_tag(s_desc)
381*f8a1b7d9SAlexander Kabaev		ret = ret + ', and ' + self.__tree_like_builder.build_node_update(s_desc)
382*f8a1b7d9SAlexander Kabaev		return ret
383*f8a1b7d9SAlexander Kabaev
384*f8a1b7d9SAlexander Kabaev
385*f8a1b7d9SAlexander Kabaevclass basic_trie_desc_to_html_builder:
386*f8a1b7d9SAlexander Kabaev	def __init__(self):
387*f8a1b7d9SAlexander Kabaev		self.__tree_like_builder = basic_tree_like_desc_to_html_builder()
388*f8a1b7d9SAlexander Kabaev
389*f8a1b7d9SAlexander Kabaev	def build(self, s_desc):
390*f8a1b7d9SAlexander Kabaev		ret = build_value_to_pb_ds_class_href(s_desc)
391*f8a1b7d9SAlexander Kabaev		ret = ret + ' with ' + self.__tree_like_builder.build_tag(s_desc)
392*f8a1b7d9SAlexander Kabaev		ret = ret + ', and ' + self.__tree_like_builder.build_node_update(s_desc)
393*f8a1b7d9SAlexander Kabaev		return ret
394*f8a1b7d9SAlexander Kabaev
395*f8a1b7d9SAlexander Kabaevclass lu_desc_to_html_builder:
396*f8a1b7d9SAlexander Kabaev	def build(self, s_desc):
397*f8a1b7d9SAlexander Kabaev		ret = build_value_to_pb_ds_class_href(s_desc)
398*f8a1b7d9SAlexander Kabaev		ret = ret + ' with ' + make_tt('Update_Policy')
399*f8a1b7d9SAlexander Kabaev		ret = ret + ' = '
400*f8a1b7d9SAlexander Kabaev		update_policy_desc = s_desc.getElementsByTagName('Update_Policy')[0]
401*f8a1b7d9SAlexander Kabaev		ret = ret + build_value_to_pb_ds_class_href(update_policy_desc)
402*f8a1b7d9SAlexander Kabaev		return ret
403*f8a1b7d9SAlexander Kabaev
404*f8a1b7d9SAlexander Kabaev
405*f8a1b7d9SAlexander Kabaevclass std_desc_to_html_builder:
406*f8a1b7d9SAlexander Kabaev	def build(self, s_desc):
407*f8a1b7d9SAlexander Kabaev		value = s_desc.attributes['value'].value
408*f8a1b7d9SAlexander Kabaev		return make_tt(value.replace('std_', 'std::'))
409*f8a1b7d9SAlexander Kabaev
410*f8a1b7d9SAlexander Kabaev
411*f8a1b7d9SAlexander Kabaevclass std_tr1_desc_to_html_builder:
412*f8a1b7d9SAlexander Kabaev	def build(self, s_desc):
413*f8a1b7d9SAlexander Kabaev		value = s_desc.attributes['value'].value
414*f8a1b7d9SAlexander Kabaev		ret =  make_tt(value.replace('std_tr1_', 'std::tr1::'))
415*f8a1b7d9SAlexander Kabaev		ret = ret + ' with ' + make_tt('cache_hash_code')
416*f8a1b7d9SAlexander Kabaev		ret = ret + ' = '
417*f8a1b7d9SAlexander Kabaev		cache_hash_code = s_desc.getElementsByTagName('cache_hash_code')[0].attributes['value'].value
418*f8a1b7d9SAlexander Kabaev		ret = ret + make_ttb(cache_hash_code)
419*f8a1b7d9SAlexander Kabaev		return ret
420*f8a1b7d9SAlexander Kabaev
421*f8a1b7d9SAlexander Kabaevclass gnucxx_desc_to_html_builder:
422*f8a1b7d9SAlexander Kabaev	def build(self, s_desc):
423*f8a1b7d9SAlexander Kabaev		value = s_desc.attributes['value'].value
424*f8a1b7d9SAlexander Kabaev		return make_tt(value.replace('__gnucxx_', '__gnucxx::'))
425*f8a1b7d9SAlexander Kabaev
426*f8a1b7d9SAlexander Kabaevclass stdext_desc_to_html_builder:
427*f8a1b7d9SAlexander Kabaev	def build(self, s_desc):
428*f8a1b7d9SAlexander Kabaev		value = s_desc.attributes['value'].value
429*f8a1b7d9SAlexander Kabaev		return make_tt(value.replace('stdext_', 'stdext::'))
430*f8a1b7d9SAlexander Kabaev
431*f8a1b7d9SAlexander Kabaevclass npq_desc_to_html_builder:
432*f8a1b7d9SAlexander Kabaev	def build(self, vector):
433*f8a1b7d9SAlexander Kabaev		if vector:
434*f8a1b7d9SAlexander Kabaev			under = make_tt('std::vector')
435*f8a1b7d9SAlexander Kabaev		else:
436*f8a1b7d9SAlexander Kabaev			under = make_tt('std::deque')
437*f8a1b7d9SAlexander Kabaev
438*f8a1b7d9SAlexander Kabaev		return make_tt('std::priority_queue') + ' adapting ' + under
439*f8a1b7d9SAlexander Kabaev
440*f8a1b7d9SAlexander Kabaevclass binary_heap_desc_to_html_builder:
441*f8a1b7d9SAlexander Kabaev	def build(self, s_desc):
442*f8a1b7d9SAlexander Kabaev		ret = make_pb_ds_class_href('priority_queue')
443*f8a1b7d9SAlexander Kabaev		ret = ret + ' with ' + make_tt('Tag')
444*f8a1b7d9SAlexander Kabaev		ret = ret + ' = ' + make_pb_ds_class_href('binary_heap_tag')
445*f8a1b7d9SAlexander Kabaev		return ret
446*f8a1b7d9SAlexander Kabaev
447*f8a1b7d9SAlexander Kabaevclass thin_heap_desc_to_html_builder:
448*f8a1b7d9SAlexander Kabaev	def build(self, s_desc):
449*f8a1b7d9SAlexander Kabaev		ret = make_pb_ds_class_href('priority_queue')
450*f8a1b7d9SAlexander Kabaev		ret = ret + ' with ' + make_tt('Tag')
451*f8a1b7d9SAlexander Kabaev		ret = ret + ' = ' + make_pb_ds_class_href('thin_heap_tag')
452*f8a1b7d9SAlexander Kabaev		return ret
453*f8a1b7d9SAlexander Kabaev
454*f8a1b7d9SAlexander Kabaevclass binomial_heap_desc_to_html_builder:
455*f8a1b7d9SAlexander Kabaev	def build(self, s_desc):
456*f8a1b7d9SAlexander Kabaev		ret = make_pb_ds_class_href('priority_queue')
457*f8a1b7d9SAlexander Kabaev		ret = ret + ' with ' + make_tt('Tag')
458*f8a1b7d9SAlexander Kabaev		ret = ret + ' = ' + make_pb_ds_class_href('binomial_heap_tag')
459*f8a1b7d9SAlexander Kabaev		return ret
460*f8a1b7d9SAlexander Kabaev
461*f8a1b7d9SAlexander Kabaevclass rc_binomial_heap_desc_to_html_builder:
462*f8a1b7d9SAlexander Kabaev	def build(self, s_desc):
463*f8a1b7d9SAlexander Kabaev		ret = make_pb_ds_class_href('priority_queue')
464*f8a1b7d9SAlexander Kabaev		ret = ret + ' with ' + make_tt('Tag')
465*f8a1b7d9SAlexander Kabaev		ret = ret + ' = ' + make_pb_ds_class_href('rc_binomial_heap_tag')
466*f8a1b7d9SAlexander Kabaev		return ret
467*f8a1b7d9SAlexander Kabaev
468*f8a1b7d9SAlexander Kabaevclass pairing_heap_desc_to_html_builder:
469*f8a1b7d9SAlexander Kabaev	def build(self, s_desc):
470*f8a1b7d9SAlexander Kabaev		ret = make_pb_ds_class_href('priority_queue')
471*f8a1b7d9SAlexander Kabaev		ret = ret + ' with ' + make_tt('Tag')
472*f8a1b7d9SAlexander Kabaev		ret = ret + ' = ' + make_pb_ds_class_href('pairing_heap_tag')
473*f8a1b7d9SAlexander Kabaev		return ret
474*f8a1b7d9SAlexander Kabaev
475*f8a1b7d9SAlexander Kabaevclass legend_desc_builder:
476*f8a1b7d9SAlexander Kabaev	"""
477*f8a1b7d9SAlexander Kabaev	Returns a string corresponding to a specific container type.
478*f8a1b7d9SAlexander Kabaev	"""
479*f8a1b7d9SAlexander Kabaev	def __init__(self):
480*f8a1b7d9SAlexander Kabaev		self.__cc_hash_builder = cc_hash_desc_to_html_builder()
481*f8a1b7d9SAlexander Kabaev		self.__gp_hash_builder = gp_hash_desc_to_html_builder()
482*f8a1b7d9SAlexander Kabaev		self.__basic_tree_builder = basic_tree_desc_to_html_builder()
483*f8a1b7d9SAlexander Kabaev		self.__basic_trie_builder = basic_trie_desc_to_html_builder()
484*f8a1b7d9SAlexander Kabaev		self.__lu_builder = lu_desc_to_html_builder()
485*f8a1b7d9SAlexander Kabaev		self.__std_builder = std_desc_to_html_builder()
486*f8a1b7d9SAlexander Kabaev		self.__std_tr1_builder = std_tr1_desc_to_html_builder()
487*f8a1b7d9SAlexander Kabaev		self.__gnucxx_builder = gnucxx_desc_to_html_builder()
488*f8a1b7d9SAlexander Kabaev		self.__stdext_builder = stdext_desc_to_html_builder()
489*f8a1b7d9SAlexander Kabaev		self.__npq_builder = npq_desc_to_html_builder()
490*f8a1b7d9SAlexander Kabaev		self.__thin_heap_builder = thin_heap_desc_to_html_builder()
491*f8a1b7d9SAlexander Kabaev		self.__thin_heap_builder = thin_heap_desc_to_html_builder()
492*f8a1b7d9SAlexander Kabaev		self.__binary_heap_builder = binary_heap_desc_to_html_builder()
493*f8a1b7d9SAlexander Kabaev		self.__binomial_heap_builder = binomial_heap_desc_to_html_builder()
494*f8a1b7d9SAlexander Kabaev		self.__rc_binomial_heap_builder = rc_binomial_heap_desc_to_html_builder()
495*f8a1b7d9SAlexander Kabaev		self.__pairing_heap_builder = pairing_heap_desc_to_html_builder()
496*f8a1b7d9SAlexander Kabaev
497*f8a1b7d9SAlexander Kabaev	def __build_specific(self, s_desc):
498*f8a1b7d9SAlexander Kabaev		type = s_desc.attributes['value'].value
499*f8a1b7d9SAlexander Kabaev
500*f8a1b7d9SAlexander Kabaev		if type == 'thin_heap':
501*f8a1b7d9SAlexander Kabaev			return self.__thin_heap_builder.build(s_desc)
502*f8a1b7d9SAlexander Kabaev		if type == 'binary_heap':
503*f8a1b7d9SAlexander Kabaev			return self.__binary_heap_builder.build(s_desc)
504*f8a1b7d9SAlexander Kabaev		if type == 'binomial_heap':
505*f8a1b7d9SAlexander Kabaev			return self.__binomial_heap_builder.build(s_desc)
506*f8a1b7d9SAlexander Kabaev		if type == 'rc_binomial_heap':
507*f8a1b7d9SAlexander Kabaev			return self.__rc_binomial_heap_builder.build(s_desc)
508*f8a1b7d9SAlexander Kabaev		if type == 'pairing_heap':
509*f8a1b7d9SAlexander Kabaev			return self.__pairing_heap_builder.build(s_desc)
510*f8a1b7d9SAlexander Kabaev		if type == 'cc_hash_table':
511*f8a1b7d9SAlexander Kabaev			ret = self.__cc_hash_builder.build(s_desc)
512*f8a1b7d9SAlexander Kabaev		elif type == 'gp_hash_table':
513*f8a1b7d9SAlexander Kabaev			ret = self.__gp_hash_builder.build(s_desc)
514*f8a1b7d9SAlexander Kabaev		elif type == 'tree':
515*f8a1b7d9SAlexander Kabaev			ret = self.__basic_tree_builder.build(s_desc)
516*f8a1b7d9SAlexander Kabaev		elif type == 'trie':
517*f8a1b7d9SAlexander Kabaev			ret = self.__basic_trie_builder.build(s_desc)
518*f8a1b7d9SAlexander Kabaev		elif type == 'list_update':
519*f8a1b7d9SAlexander Kabaev			ret = self.__lu_builder.build(s_desc)
520*f8a1b7d9SAlexander Kabaev		elif type == 'std::priority_queue_vector':
521*f8a1b7d9SAlexander Kabaev			return self.__npq_builder.build(True)
522*f8a1b7d9SAlexander Kabaev		elif type == 'std::priority_queue_deque':
523*f8a1b7d9SAlexander Kabaev			return self.__npq_builder.build(False)
524*f8a1b7d9SAlexander Kabaev		elif type == 'std_set' or type == 'std_map' or type == 'std_multimap':
525*f8a1b7d9SAlexander Kabaev			return self.__std_builder.build(s_desc)
526*f8a1b7d9SAlexander Kabaev		elif type == 'std_tr1_unordered_set' or type == 'std_tr1_unordered_map':
527*f8a1b7d9SAlexander Kabaev			return self.__std_tr1_builder.build(s_desc)
528*f8a1b7d9SAlexander Kabaev		elif type == 'stdext_hash_set' or type == 'stdext_hash_map' or type == 'stdext_hash_multimap':
529*f8a1b7d9SAlexander Kabaev			return self.__stdext_builder.build(s_desc)
530*f8a1b7d9SAlexander Kabaev		elif type == '__gnucxx_hash_set' or type == '__gnucxx_hash_map' or type == '__gnucxx_hash_multimap':
531*f8a1b7d9SAlexander Kabaev			return self.__gnucxx_builder.build(s_desc)
532*f8a1b7d9SAlexander Kabaev		else:
533*f8a1b7d9SAlexander Kabaev			sys.stderr.write('cannot recognize %s\n' % type)
534*f8a1b7d9SAlexander Kabaev			raise exception
535*f8a1b7d9SAlexander Kabaev		return ret
536*f8a1b7d9SAlexander Kabaev
537*f8a1b7d9SAlexander Kabaev
538*f8a1b7d9SAlexander Kabaev	def build(self, desc):
539*f8a1b7d9SAlexander Kabaev		s_descs = desc.getElementsByTagName('type')
540*f8a1b7d9SAlexander Kabaev		if s_descs.length == 0:
541*f8a1b7d9SAlexander Kabaev			print desc.toxml()
542*f8a1b7d9SAlexander Kabaev			raise exception
543*f8a1b7d9SAlexander Kabaev		ret = ''
544*f8a1b7d9SAlexander Kabaev		count = 0
545*f8a1b7d9SAlexander Kabaev		for s_desc in s_descs:
546*f8a1b7d9SAlexander Kabaev			if count > 0:
547*f8a1b7d9SAlexander Kabaev				ret = ret + ', mapping each key to '
548*f8a1b7d9SAlexander Kabaev			ret = ret + self.__build_specific(s_desc)
549*f8a1b7d9SAlexander Kabaev			count = count + 1
550*f8a1b7d9SAlexander Kabaev		return ret
551*f8a1b7d9SAlexander Kabaev
552*f8a1b7d9SAlexander Kabaev
553*f8a1b7d9SAlexander Kabaevdef main(doc_dir, res_dir, test_infos_f_name, test_name, build_name):
554*f8a1b7d9SAlexander Kabaev	res_gtr = res_getter(test_infos_f_name)
555*f8a1b7d9SAlexander Kabaev	res = res_gtr.get(res_dir, test_name)
556*f8a1b7d9SAlexander Kabaev	png_mkr = png_maker()
557*f8a1b7d9SAlexander Kabaev	png_of_name = doc_dir + '/' + test_name + '_' + build_name + '.png'
558*f8a1b7d9SAlexander Kabaev	print png_of_name
559*f8a1b7d9SAlexander Kabaev	png_mkr.make(res, png_of_name)
560*f8a1b7d9SAlexander Kabaev
561*f8a1b7d9SAlexander Kabaev
562*f8a1b7d9SAlexander Kabaevif __name__ == "__main__":
563*f8a1b7d9SAlexander Kabaev	"""
564*f8a1b7d9SAlexander Kabaev	This module takes 6 parameters from the command line:
565*f8a1b7d9SAlexander Kabaev	Docs directory
566*f8a1b7d9SAlexander Kabaev	Results directory
567*f8a1b7d9SAlexander Kabaev	Tests info XML file name
568*f8a1b7d9SAlexander Kabaev	Test name
569*f8a1b7d9SAlexander Kabaev	Build name
570*f8a1b7d9SAlexander Kabaev	Compiler name
571*f8a1b7d9SAlexander Kabaev	"""
572*f8a1b7d9SAlexander Kabaev	usg = "make_graph.py <doc_dir> <res_dir> <test_info_file> <test_name> <build_name>\n"
573*f8a1b7d9SAlexander Kabaev	if len(sys.argv) != 6:
574*f8a1b7d9SAlexander Kabaev		sys.stderr.write(usg)
575*f8a1b7d9SAlexander Kabaev		raise exception
576*f8a1b7d9SAlexander Kabaev	main(sys.argv[1], sys.argv[2], sys.argv[3], sys.argv[4], sys.argv[5])
577