Blame view

tools/perf/util/svghelper.c 14.7 KB
f48d55ce7   Arjan van de Ven   perf: Add a SVG h...
1
2
3
4
5
6
7
8
9
10
11
12
13
  /*
   * svghelper.c - helper functions for outputting svg
   *
   * (C) Copyright 2009 Intel Corporation
   *
   * Authors:
   *     Arjan van de Ven <arjan@linux.intel.com>
   *
   * This program is free software; you can redistribute it and/or
   * modify it under the terms of the GNU General Public License
   * as published by the Free Software Foundation; version 2
   * of the License.
   */
9486aa387   Arnaldo Carvalho de Melo   perf tools: Fix 6...
14
  #include <inttypes.h>
f48d55ce7   Arjan van de Ven   perf: Add a SVG h...
15
16
17
18
19
20
21
22
23
24
25
26
27
  #include <stdio.h>
  #include <stdlib.h>
  #include <unistd.h>
  #include <string.h>
  
  #include "svghelper.h"
  
  static u64 first_time, last_time;
  static u64 turbo_frequency, max_freq;
  
  
  #define SLOT_MULT 30.0
  #define SLOT_HEIGHT 25.0
5094b6554   Arjan van de Ven   perf util: Make t...
28
29
  
  int svg_page_width = 1000;
f48d55ce7   Arjan van de Ven   perf: Add a SVG h...
30

39a90a8ef   Arjan van de Ven   perf timechart: A...
31
  #define MIN_TEXT_SIZE 0.01
964a0b3d2   Arjan van de Ven   perf utils: Be co...
32

f48d55ce7   Arjan van de Ven   perf: Add a SVG h...
33
34
35
36
37
38
39
40
41
42
43
44
  static u64 total_height;
  static FILE *svgfile;
  
  static double cpu2slot(int cpu)
  {
  	return 2 * cpu + 1;
  }
  
  static double cpu2y(int cpu)
  {
  	return cpu2slot(cpu) * SLOT_MULT;
  }
00e99a49f   Thomas Renninger   perf tools: Fix t...
45
  static double time2pixels(u64 __time)
f48d55ce7   Arjan van de Ven   perf: Add a SVG h...
46
47
  {
  	double X;
00e99a49f   Thomas Renninger   perf tools: Fix t...
48
  	X = 1.0 * svg_page_width * (__time - first_time) / (last_time - first_time);
f48d55ce7   Arjan van de Ven   perf: Add a SVG h...
49
50
  	return X;
  }
611a546be   Arjan van de Ven   perf util: SVG pe...
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
  /*
   * Round text sizes so that the svg viewer only needs a discrete
   * number of renderings of the font
   */
  static double round_text_size(double size)
  {
  	int loop = 100;
  	double target = 10.0;
  
  	if (size >= 10.0)
  		return size;
  	while (loop--) {
  		if (size >= target)
  			return target;
  		target = target / 2.0;
  	}
  	return size;
  }
5094b6554   Arjan van de Ven   perf util: Make t...
69
  void open_svg(const char *filename, int cpus, int rows, u64 start, u64 end)
f48d55ce7   Arjan van de Ven   perf: Add a SVG h...
70
  {
5094b6554   Arjan van de Ven   perf util: Make t...
71
  	int new_width;
f48d55ce7   Arjan van de Ven   perf: Add a SVG h...
72
73
74
75
76
77
78
  
  	svgfile = fopen(filename, "w");
  	if (!svgfile) {
  		fprintf(stderr, "Cannot open %s for output
  ", filename);
  		return;
  	}
5094b6554   Arjan van de Ven   perf util: Make t...
79
80
81
82
83
84
85
86
87
88
89
90
  	first_time = start;
  	first_time = first_time / 100000000 * 100000000;
  	last_time = end;
  
  	/*
  	 * if the recording is short, we default to a width of 1000, but
  	 * for longer recordings we want at least 200 units of width per second
  	 */
  	new_width = (last_time - first_time) / 5000000;
  
  	if (new_width > svg_page_width)
  		svg_page_width = new_width;
f48d55ce7   Arjan van de Ven   perf: Add a SVG h...
91
92
93
  	total_height = (1 + rows + cpu2slot(cpus)) * SLOT_MULT;
  	fprintf(svgfile, "<?xml version=\"1.0\" standalone=\"no\"?> 
  ");
9486aa387   Arnaldo Carvalho de Melo   perf tools: Fix 6...
94
95
  	fprintf(svgfile, "<svg width=\"%i\" height=\"%" PRIu64 "\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\">
  ", svg_page_width, total_height);
f48d55ce7   Arjan van de Ven   perf: Add a SVG h...
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
  
  	fprintf(svgfile, "<defs>
    <style type=\"text/css\">
      <![CDATA[
  ");
  
  	fprintf(svgfile, "      rect          { stroke-width: 1; }
  ");
  	fprintf(svgfile, "      rect.process  { fill:rgb(180,180,180); fill-opacity:0.9; stroke-width:1;   stroke:rgb(  0,  0,  0); } 
  ");
  	fprintf(svgfile, "      rect.process2 { fill:rgb(180,180,180); fill-opacity:0.9; stroke-width:0;   stroke:rgb(  0,  0,  0); } 
  ");
  	fprintf(svgfile, "      rect.sample   { fill:rgb(  0,  0,255); fill-opacity:0.8; stroke-width:0;   stroke:rgb(  0,  0,  0); } 
  ");
  	fprintf(svgfile, "      rect.blocked  { fill:rgb(255,  0,  0); fill-opacity:0.5; stroke-width:0;   stroke:rgb(  0,  0,  0); } 
  ");
2e600d01c   Arjan van de Ven   perf timechart: I...
112
113
  	fprintf(svgfile, "      rect.waiting  { fill:rgb(224,214,  0); fill-opacity:0.8; stroke-width:0;   stroke:rgb(  0,  0,  0); } 
  ");
a92fe7b30   Arjan van de Ven   perf timechart: S...
114
115
  	fprintf(svgfile, "      rect.WAITING  { fill:rgb(255,214, 48); fill-opacity:0.6; stroke-width:0;   stroke:rgb(  0,  0,  0); } 
  ");
f48d55ce7   Arjan van de Ven   perf: Add a SVG h...
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
  	fprintf(svgfile, "      rect.cpu      { fill:rgb(192,192,192); fill-opacity:0.2; stroke-width:0.5; stroke:rgb(128,128,128); } 
  ");
  	fprintf(svgfile, "      rect.pstate   { fill:rgb(128,128,128); fill-opacity:0.8; stroke-width:0; } 
  ");
  	fprintf(svgfile, "      rect.c1       { fill:rgb(255,214,214); fill-opacity:0.5; stroke-width:0; } 
  ");
  	fprintf(svgfile, "      rect.c2       { fill:rgb(255,172,172); fill-opacity:0.5; stroke-width:0; } 
  ");
  	fprintf(svgfile, "      rect.c3       { fill:rgb(255,130,130); fill-opacity:0.5; stroke-width:0; } 
  ");
  	fprintf(svgfile, "      rect.c4       { fill:rgb(255, 88, 88); fill-opacity:0.5; stroke-width:0; } 
  ");
  	fprintf(svgfile, "      rect.c5       { fill:rgb(255, 44, 44); fill-opacity:0.5; stroke-width:0; } 
  ");
  	fprintf(svgfile, "      rect.c6       { fill:rgb(255,  0,  0); fill-opacity:0.5; stroke-width:0; } 
  ");
  	fprintf(svgfile, "      line.pstate   { stroke:rgb(255,255,  0); stroke-opacity:0.8; stroke-width:2; } 
  ");
  
  	fprintf(svgfile, "    ]]>
     </style>
  </defs>
  ");
  }
  
  void svg_box(int Yslot, u64 start, u64 end, const char *type)
  {
  	if (!svgfile)
  		return;
  
  	fprintf(svgfile, "<rect x=\"%4.8f\" width=\"%4.8f\" y=\"%4.1f\" height=\"%4.1f\" class=\"%s\"/>
  ",
  		time2pixels(start), time2pixels(end)-time2pixels(start), Yslot * SLOT_MULT, SLOT_HEIGHT, type);
  }
a92fe7b30   Arjan van de Ven   perf timechart: S...
150
  void svg_sample(int Yslot, int cpu, u64 start, u64 end)
f48d55ce7   Arjan van de Ven   perf: Add a SVG h...
151
152
153
154
  {
  	double text_size;
  	if (!svgfile)
  		return;
a92fe7b30   Arjan van de Ven   perf timechart: S...
155
156
157
  	fprintf(svgfile, "<rect x=\"%4.8f\" width=\"%4.8f\" y=\"%4.1f\" height=\"%4.1f\" class=\"sample\"/>
  ",
  		time2pixels(start), time2pixels(end)-time2pixels(start), Yslot * SLOT_MULT, SLOT_HEIGHT);
f48d55ce7   Arjan van de Ven   perf: Add a SVG h...
158
159
160
161
162
163
  
  	text_size = (time2pixels(end)-time2pixels(start));
  	if (cpu > 9)
  		text_size = text_size/2;
  	if (text_size > 1.25)
  		text_size = 1.25;
611a546be   Arjan van de Ven   perf util: SVG pe...
164
  	text_size = round_text_size(text_size);
964a0b3d2   Arjan van de Ven   perf utils: Be co...
165
  	if (text_size > MIN_TEXT_SIZE)
611a546be   Arjan van de Ven   perf util: SVG pe...
166
167
  		fprintf(svgfile, "<text x=\"%1.8f\" y=\"%1.8f\" font-size=\"%1.8fpt\">%i</text>
  ",
f48d55ce7   Arjan van de Ven   perf: Add a SVG h...
168
169
170
  			time2pixels(start), Yslot *  SLOT_MULT + SLOT_HEIGHT - 1, text_size,  cpu + 1);
  
  }
a92fe7b30   Arjan van de Ven   perf timechart: S...
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
  static char *time_to_string(u64 duration)
  {
  	static char text[80];
  
  	text[0] = 0;
  
  	if (duration < 1000) /* less than 1 usec */
  		return text;
  
  	if (duration < 1000 * 1000) { /* less than 1 msec */
  		sprintf(text, "%4.1f us", duration / 1000.0);
  		return text;
  	}
  	sprintf(text, "%4.1f ms", duration / 1000.0 / 1000);
  
  	return text;
  }
  
  void svg_waiting(int Yslot, u64 start, u64 end)
  {
  	char *text;
  	const char *style;
  	double font_size;
  
  	if (!svgfile)
  		return;
  
  	style = "waiting";
  
  	if (end-start > 10 * 1000000) /* 10 msec */
  		style = "WAITING";
  
  	text = time_to_string(end-start);
611a546be   Arjan van de Ven   perf util: SVG pe...
204
  	font_size = 1.0 * (time2pixels(end)-time2pixels(start));
a92fe7b30   Arjan van de Ven   perf timechart: S...
205

611a546be   Arjan van de Ven   perf util: SVG pe...
206
207
  	if (font_size > 3)
  		font_size = 3;
a92fe7b30   Arjan van de Ven   perf timechart: S...
208

611a546be   Arjan van de Ven   perf util: SVG pe...
209
  	font_size = round_text_size(font_size);
a92fe7b30   Arjan van de Ven   perf timechart: S...
210

611a546be   Arjan van de Ven   perf util: SVG pe...
211
212
213
214
215
  	fprintf(svgfile, "<g transform=\"translate(%4.8f,%4.8f)\">
  ", time2pixels(start), Yslot * SLOT_MULT);
  	fprintf(svgfile, "<rect x=\"0\" width=\"%4.8f\" y=\"0\" height=\"%4.1f\" class=\"%s\"/>
  ",
  		time2pixels(end)-time2pixels(start), SLOT_HEIGHT, style);
a92fe7b30   Arjan van de Ven   perf timechart: S...
216
  	if (font_size > MIN_TEXT_SIZE)
611a546be   Arjan van de Ven   perf util: SVG pe...
217
218
219
220
221
  		fprintf(svgfile, "<text transform=\"rotate(90)\" font-size=\"%1.8fpt\"> %s</text>
  ",
  			font_size, text);
  	fprintf(svgfile, "</g>
  ");
a92fe7b30   Arjan van de Ven   perf timechart: S...
222
  }
f48d55ce7   Arjan van de Ven   perf: Add a SVG h...
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
  static char *cpu_model(void)
  {
  	static char cpu_m[255];
  	char buf[256];
  	FILE *file;
  
  	cpu_m[0] = 0;
  	/* CPU type */
  	file = fopen("/proc/cpuinfo", "r");
  	if (file) {
  		while (fgets(buf, 255, file)) {
  			if (strstr(buf, "model name")) {
  				strncpy(cpu_m, &buf[13], 255);
  				break;
  			}
  		}
  		fclose(file);
  	}
39a90a8ef   Arjan van de Ven   perf timechart: A...
241
242
243
244
245
246
247
248
249
250
251
252
  
  	/* CPU type */
  	file = fopen("/sys/devices/system/cpu/cpu0/cpufreq/scaling_available_frequencies", "r");
  	if (file) {
  		while (fgets(buf, 255, file)) {
  			unsigned int freq;
  			freq = strtoull(buf, NULL, 10);
  			if (freq > max_freq)
  				max_freq = freq;
  		}
  		fclose(file);
  	}
f48d55ce7   Arjan van de Ven   perf: Add a SVG h...
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
  	return cpu_m;
  }
  
  void svg_cpu_box(int cpu, u64 __max_freq, u64 __turbo_freq)
  {
  	char cpu_string[80];
  	if (!svgfile)
  		return;
  
  	max_freq = __max_freq;
  	turbo_frequency = __turbo_freq;
  
  	fprintf(svgfile, "<rect x=\"%4.8f\" width=\"%4.8f\" y=\"%4.1f\" height=\"%4.1f\" class=\"cpu\"/>
  ",
  		time2pixels(first_time),
  		time2pixels(last_time)-time2pixels(first_time),
  		cpu2y(cpu), SLOT_MULT+SLOT_HEIGHT);
  
  	sprintf(cpu_string, "CPU %i", (int)cpu+1);
611a546be   Arjan van de Ven   perf util: SVG pe...
272
273
  	fprintf(svgfile, "<text x=\"%4.8f\" y=\"%4.8f\">%s</text>
  ",
f48d55ce7   Arjan van de Ven   perf: Add a SVG h...
274
  		10+time2pixels(first_time), cpu2y(cpu) + SLOT_HEIGHT/2, cpu_string);
964a0b3d2   Arjan van de Ven   perf utils: Be co...
275
276
  	fprintf(svgfile, "<text transform=\"translate(%4.8f,%4.8f)\" font-size=\"1.25pt\">%s</text>
  ",
f48d55ce7   Arjan van de Ven   perf: Add a SVG h...
277
278
279
280
281
282
283
284
285
  		10+time2pixels(first_time), cpu2y(cpu) + SLOT_MULT + SLOT_HEIGHT - 4, cpu_model());
  }
  
  void svg_process(int cpu, u64 start, u64 end, const char *type, const char *name)
  {
  	double width;
  
  	if (!svgfile)
  		return;
611a546be   Arjan van de Ven   perf util: SVG pe...
286
287
288
289
290
291
  
  	fprintf(svgfile, "<g transform=\"translate(%4.8f,%4.8f)\">
  ", time2pixels(start), cpu2y(cpu));
  	fprintf(svgfile, "<rect x=\"0\" width=\"%4.8f\" y=\"0\" height=\"%4.1f\" class=\"%s\"/>
  ",
  		time2pixels(end)-time2pixels(start), SLOT_MULT+SLOT_HEIGHT, type);
f48d55ce7   Arjan van de Ven   perf: Add a SVG h...
292
293
294
  	width = time2pixels(end)-time2pixels(start);
  	if (width > 6)
  		width = 6;
611a546be   Arjan van de Ven   perf util: SVG pe...
295
  	width = round_text_size(width);
964a0b3d2   Arjan van de Ven   perf utils: Be co...
296
  	if (width > MIN_TEXT_SIZE)
611a546be   Arjan van de Ven   perf util: SVG pe...
297
298
299
300
301
302
  		fprintf(svgfile, "<text transform=\"rotate(90)\" font-size=\"%3.8fpt\">%s</text>
  ",
  			width, name);
  
  	fprintf(svgfile, "</g>
  ");
f48d55ce7   Arjan van de Ven   perf: Add a SVG h...
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
  }
  
  void svg_cstate(int cpu, u64 start, u64 end, int type)
  {
  	double width;
  	char style[128];
  
  	if (!svgfile)
  		return;
  
  
  	if (type > 6)
  		type = 6;
  	sprintf(style, "c%i", type);
  
  	fprintf(svgfile, "<rect class=\"%s\" x=\"%4.8f\" width=\"%4.8f\" y=\"%4.1f\" height=\"%4.1f\"/>
  ",
  		style,
  		time2pixels(start), time2pixels(end)-time2pixels(start),
  		cpu2y(cpu), SLOT_MULT+SLOT_HEIGHT);
611a546be   Arjan van de Ven   perf util: SVG pe...
323
  	width = (time2pixels(end)-time2pixels(start))/2.0;
f48d55ce7   Arjan van de Ven   perf: Add a SVG h...
324
325
  	if (width > 6)
  		width = 6;
611a546be   Arjan van de Ven   perf util: SVG pe...
326
  	width = round_text_size(width);
964a0b3d2   Arjan van de Ven   perf utils: Be co...
327
  	if (width > MIN_TEXT_SIZE)
611a546be   Arjan van de Ven   perf util: SVG pe...
328
329
330
  		fprintf(svgfile, "<text x=\"%4.8f\" y=\"%4.8f\" font-size=\"%3.8fpt\">C%i</text>
  ",
  			time2pixels(start), cpu2y(cpu)+width, width, type);
f48d55ce7   Arjan van de Ven   perf: Add a SVG h...
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
  }
  
  static char *HzToHuman(unsigned long hz)
  {
  	static char buffer[1024];
  	unsigned long long Hz;
  
  	memset(buffer, 0, 1024);
  
  	Hz = hz;
  
  	/* default: just put the Number in */
  	sprintf(buffer, "%9lli", Hz);
  
  	if (Hz > 1000)
  		sprintf(buffer, " %6lli Mhz", (Hz+500)/1000);
  
  	if (Hz > 1500000)
  		sprintf(buffer, " %6.2f Ghz", (Hz+5000.0)/1000000);
  
  	if (Hz == turbo_frequency)
  		sprintf(buffer, "Turbo");
  
  	return buffer;
  }
  
  void svg_pstate(int cpu, u64 start, u64 end, u64 freq)
  {
  	double height = 0;
  
  	if (!svgfile)
  		return;
  
  	if (max_freq)
  		height = freq * 1.0 / max_freq * (SLOT_HEIGHT + SLOT_MULT);
  	height = 1 + cpu2y(cpu) + SLOT_MULT + SLOT_HEIGHT - height;
  	fprintf(svgfile, "<line x1=\"%4.8f\" x2=\"%4.8f\" y1=\"%4.1f\" y2=\"%4.1f\" class=\"pstate\"/>
  ",
  		time2pixels(start), time2pixels(end), height, height);
611a546be   Arjan van de Ven   perf util: SVG pe...
370
371
  	fprintf(svgfile, "<text x=\"%4.8f\" y=\"%4.8f\" font-size=\"0.25pt\">%s</text>
  ",
f48d55ce7   Arjan van de Ven   perf: Add a SVG h...
372
373
374
  		time2pixels(start), height+0.9, HzToHuman(freq));
  
  }
4f1202c8e   Arjan van de Ven   perf timechart: S...
375
  void svg_partial_wakeline(u64 start, int row1, char *desc1, int row2, char *desc2)
f48d55ce7   Arjan van de Ven   perf: Add a SVG h...
376
377
378
379
380
381
382
383
  {
  	double height;
  
  	if (!svgfile)
  		return;
  
  
  	if (row1 < row2) {
4f1202c8e   Arjan van de Ven   perf timechart: S...
384
  		if (row1) {
f48d55ce7   Arjan van de Ven   perf: Add a SVG h...
385
386
387
  			fprintf(svgfile, "<line x1=\"%4.8f\" y1=\"%4.2f\" x2=\"%4.8f\" y2=\"%4.2f\" style=\"stroke:rgb(32,255,32);stroke-width:0.009\"/>
  ",
  				time2pixels(start), row1 * SLOT_MULT + SLOT_HEIGHT,  time2pixels(start), row1 * SLOT_MULT + SLOT_HEIGHT + SLOT_MULT/32);
4f1202c8e   Arjan van de Ven   perf timechart: S...
388
  			if (desc2)
611a546be   Arjan van de Ven   perf util: SVG pe...
389
390
  				fprintf(svgfile, "<g transform=\"translate(%4.8f,%4.8f)\"><text transform=\"rotate(90)\" font-size=\"0.02pt\">%s &gt;</text></g>
  ",
4f1202c8e   Arjan van de Ven   perf timechart: S...
391
392
393
  					time2pixels(start), row1 * SLOT_MULT + SLOT_HEIGHT + SLOT_HEIGHT/48, desc2);
  		}
  		if (row2) {
f48d55ce7   Arjan van de Ven   perf: Add a SVG h...
394
395
396
  			fprintf(svgfile, "<line x1=\"%4.8f\" y1=\"%4.2f\" x2=\"%4.8f\" y2=\"%4.2f\" style=\"stroke:rgb(32,255,32);stroke-width:0.009\"/>
  ",
  				time2pixels(start), row2 * SLOT_MULT - SLOT_MULT/32,  time2pixels(start), row2 * SLOT_MULT);
4f1202c8e   Arjan van de Ven   perf timechart: S...
397
  			if (desc1)
611a546be   Arjan van de Ven   perf util: SVG pe...
398
399
  				fprintf(svgfile, "<g transform=\"translate(%4.8f,%4.8f)\"><text transform=\"rotate(90)\" font-size=\"0.02pt\">%s &gt;</text></g>
  ",
4f1202c8e   Arjan van de Ven   perf timechart: S...
400
401
  					time2pixels(start), row2 * SLOT_MULT - SLOT_MULT/32, desc1);
  		}
f48d55ce7   Arjan van de Ven   perf: Add a SVG h...
402
  	} else {
4f1202c8e   Arjan van de Ven   perf timechart: S...
403
  		if (row2) {
f48d55ce7   Arjan van de Ven   perf: Add a SVG h...
404
405
406
  			fprintf(svgfile, "<line x1=\"%4.8f\" y1=\"%4.2f\" x2=\"%4.8f\" y2=\"%4.2f\" style=\"stroke:rgb(32,255,32);stroke-width:0.009\"/>
  ",
  				time2pixels(start), row2 * SLOT_MULT + SLOT_HEIGHT,  time2pixels(start), row2 * SLOT_MULT + SLOT_HEIGHT + SLOT_MULT/32);
4f1202c8e   Arjan van de Ven   perf timechart: S...
407
  			if (desc1)
611a546be   Arjan van de Ven   perf util: SVG pe...
408
409
  				fprintf(svgfile, "<g transform=\"translate(%4.8f,%4.8f)\"><text transform=\"rotate(90)\" font-size=\"0.02pt\">%s &lt;</text></g>
  ",
4f1202c8e   Arjan van de Ven   perf timechart: S...
410
411
412
  					time2pixels(start), row2 * SLOT_MULT + SLOT_HEIGHT + SLOT_MULT/48, desc1);
  		}
  		if (row1) {
f48d55ce7   Arjan van de Ven   perf: Add a SVG h...
413
414
415
  			fprintf(svgfile, "<line x1=\"%4.8f\" y1=\"%4.2f\" x2=\"%4.8f\" y2=\"%4.2f\" style=\"stroke:rgb(32,255,32);stroke-width:0.009\"/>
  ",
  				time2pixels(start), row1 * SLOT_MULT - SLOT_MULT/32,  time2pixels(start), row1 * SLOT_MULT);
4f1202c8e   Arjan van de Ven   perf timechart: S...
416
  			if (desc2)
611a546be   Arjan van de Ven   perf util: SVG pe...
417
418
  				fprintf(svgfile, "<g transform=\"translate(%4.8f,%4.8f)\"><text transform=\"rotate(90)\" font-size=\"0.02pt\">%s &lt;</text></g>
  ",
4f1202c8e   Arjan van de Ven   perf timechart: S...
419
420
  					time2pixels(start), row1 * SLOT_MULT - SLOT_HEIGHT/32, desc2);
  		}
f48d55ce7   Arjan van de Ven   perf: Add a SVG h...
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
  	}
  	height = row1 * SLOT_MULT;
  	if (row2 > row1)
  		height += SLOT_HEIGHT;
  	if (row1)
  		fprintf(svgfile, "<circle  cx=\"%4.8f\" cy=\"%4.2f\" r = \"0.01\"  style=\"fill:rgb(32,255,32)\"/>
  ",
  			time2pixels(start), height);
  }
  
  void svg_wakeline(u64 start, int row1, int row2)
  {
  	double height;
  
  	if (!svgfile)
  		return;
  
  
  	if (row1 < row2)
  		fprintf(svgfile, "<line x1=\"%4.8f\" y1=\"%4.2f\" x2=\"%4.8f\" y2=\"%4.2f\" style=\"stroke:rgb(32,255,32);stroke-width:0.009\"/>
  ",
  			time2pixels(start), row1 * SLOT_MULT + SLOT_HEIGHT,  time2pixels(start), row2 * SLOT_MULT);
  	else
  		fprintf(svgfile, "<line x1=\"%4.8f\" y1=\"%4.2f\" x2=\"%4.8f\" y2=\"%4.2f\" style=\"stroke:rgb(32,255,32);stroke-width:0.009\"/>
  ",
  			time2pixels(start), row2 * SLOT_MULT + SLOT_HEIGHT,  time2pixels(start), row1 * SLOT_MULT);
  
  	height = row1 * SLOT_MULT;
  	if (row2 > row1)
  		height += SLOT_HEIGHT;
  	fprintf(svgfile, "<circle  cx=\"%4.8f\" cy=\"%4.2f\" r = \"0.01\"  style=\"fill:rgb(32,255,32)\"/>
  ",
  			time2pixels(start), height);
  }
  
  void svg_interrupt(u64 start, int row)
  {
  	if (!svgfile)
  		return;
  
  	fprintf(svgfile, "<circle  cx=\"%4.8f\" cy=\"%4.2f\" r = \"0.01\"  style=\"fill:rgb(255,128,128)\"/>
  ",
  			time2pixels(start), row * SLOT_MULT);
  	fprintf(svgfile, "<circle  cx=\"%4.8f\" cy=\"%4.2f\" r = \"0.01\"  style=\"fill:rgb(255,128,128)\"/>
  ",
  			time2pixels(start), row * SLOT_MULT + SLOT_HEIGHT);
  }
  
  void svg_text(int Yslot, u64 start, const char *text)
  {
  	if (!svgfile)
  		return;
611a546be   Arjan van de Ven   perf util: SVG pe...
473
474
  	fprintf(svgfile, "<text x=\"%4.8f\" y=\"%4.8f\">%s</text>
  ",
f48d55ce7   Arjan van de Ven   perf: Add a SVG h...
475
476
477
478
479
480
481
482
483
484
485
  		time2pixels(start), Yslot * SLOT_MULT+SLOT_HEIGHT/2, text);
  }
  
  static void svg_legenda_box(int X, const char *text, const char *style)
  {
  	double boxsize;
  	boxsize = SLOT_HEIGHT / 2;
  
  	fprintf(svgfile, "<rect x=\"%i\" width=\"%4.8f\" y=\"0\" height=\"%4.1f\" class=\"%s\"/>
  ",
  		X, boxsize, boxsize, style);
611a546be   Arjan van de Ven   perf util: SVG pe...
486
487
  	fprintf(svgfile, "<text transform=\"translate(%4.8f, %4.8f)\" font-size=\"%4.8fpt\">%s</text>
  ",
f48d55ce7   Arjan van de Ven   perf: Add a SVG h...
488
489
490
491
492
493
494
495
496
  		X + boxsize + 5, boxsize, 0.8 * boxsize, text);
  }
  
  void svg_legenda(void)
  {
  	if (!svgfile)
  		return;
  
  	svg_legenda_box(0,	"Running", "sample");
e85307205   Thomas Renninger   perf timechart: F...
497
498
499
  	svg_legenda_box(100,	"Idle","c1");
  	svg_legenda_box(200,	"Deeper Idle", "c3");
  	svg_legenda_box(350,	"Deepest Idle", "c6");
f48d55ce7   Arjan van de Ven   perf: Add a SVG h...
500
501
502
503
  	svg_legenda_box(550,	"Sleeping", "process2");
  	svg_legenda_box(650,	"Waiting for cpu", "waiting");
  	svg_legenda_box(800,	"Blocked on IO", "blocked");
  }
5094b6554   Arjan van de Ven   perf util: Make t...
504
  void svg_time_grid(void)
f48d55ce7   Arjan van de Ven   perf: Add a SVG h...
505
506
  {
  	u64 i;
f48d55ce7   Arjan van de Ven   perf: Add a SVG h...
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
  	if (!svgfile)
  		return;
  
  	i = first_time;
  	while (i < last_time) {
  		int color = 220;
  		double thickness = 0.075;
  		if ((i % 100000000) == 0) {
  			thickness = 0.5;
  			color = 192;
  		}
  		if ((i % 1000000000) == 0) {
  			thickness = 2.0;
  			color = 128;
  		}
9486aa387   Arnaldo Carvalho de Melo   perf tools: Fix 6...
522
523
  		fprintf(svgfile, "<line x1=\"%4.8f\" y1=\"%4.2f\" x2=\"%4.8f\" y2=\"%" PRIu64 "\" style=\"stroke:rgb(%i,%i,%i);stroke-width:%1.3f\"/>
  ",
f48d55ce7   Arjan van de Ven   perf: Add a SVG h...
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
  			time2pixels(i), SLOT_MULT/2, time2pixels(i), total_height, color, color, color, thickness);
  
  		i += 10000000;
  	}
  }
  
  void svg_close(void)
  {
  	if (svgfile) {
  		fprintf(svgfile, "</svg>
  ");
  		fclose(svgfile);
  		svgfile = NULL;
  	}
  }