1e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng/* 2e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * svghelper.c - helper functions for outputting svg 3e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * 4e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * (C) Copyright 2009 Intel Corporation 5e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * 6e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * Authors: 7e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * Arjan van de Ven <arjan@linux.intel.com> 8e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * 9e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * This program is free software; you can redistribute it and/or 10e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * modify it under the terms of the GNU General Public License 11e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * as published by the Free Software Foundation; version 2 12e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * of the License. 13e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng */ 14e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 15e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include <inttypes.h> 16e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include <stdio.h> 17e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include <stdlib.h> 18e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include <unistd.h> 19e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include <string.h> 20e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 21e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "svghelper.h" 22e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 23e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstatic u64 first_time, last_time; 24e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstatic u64 turbo_frequency, max_freq; 25e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 26e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 27e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#define SLOT_MULT 30.0 28e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#define SLOT_HEIGHT 25.0 29e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 30e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengint svg_page_width = 1000; 31e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 32e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#define MIN_TEXT_SIZE 0.01 33e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 34e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstatic u64 total_height; 35e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstatic FILE *svgfile; 36e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 37e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstatic double cpu2slot(int cpu) 38e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{ 39e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng return 2 * cpu + 1; 40e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng} 41e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 42e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstatic double cpu2y(int cpu) 43e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{ 44e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng return cpu2slot(cpu) * SLOT_MULT; 45e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng} 46e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 47e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstatic double time2pixels(u64 __time) 48e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{ 49e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng double X; 50e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 51e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng X = 1.0 * svg_page_width * (__time - first_time) / (last_time - first_time); 52e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng return X; 53e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng} 54e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 55e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng/* 56e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * Round text sizes so that the svg viewer only needs a discrete 57e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * number of renderings of the font 58e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng */ 59e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstatic double round_text_size(double size) 60e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{ 61e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng int loop = 100; 62e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng double target = 10.0; 63e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 64e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (size >= 10.0) 65e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng return size; 66e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng while (loop--) { 67e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (size >= target) 68e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng return target; 69e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng target = target / 2.0; 70e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng } 71e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng return size; 72e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng} 73e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 74e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengvoid open_svg(const char *filename, int cpus, int rows, u64 start, u64 end) 75e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{ 76e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng int new_width; 77e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 78e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng svgfile = fopen(filename, "w"); 79e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (!svgfile) { 80e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng fprintf(stderr, "Cannot open %s for output\n", filename); 81e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng return; 82e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng } 83e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng first_time = start; 84e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng first_time = first_time / 100000000 * 100000000; 85e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng last_time = end; 86e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 87e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng /* 88e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * if the recording is short, we default to a width of 1000, but 89e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * for longer recordings we want at least 200 units of width per second 90e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng */ 91e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng new_width = (last_time - first_time) / 5000000; 92e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 93e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (new_width > svg_page_width) 94e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng svg_page_width = new_width; 95e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 96e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng total_height = (1 + rows + cpu2slot(cpus)) * SLOT_MULT; 97e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng fprintf(svgfile, "<?xml version=\"1.0\" standalone=\"no\"?> \n"); 98e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng fprintf(svgfile, "<svg width=\"%i\" height=\"%" PRIu64 "\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\">\n", svg_page_width, total_height); 99e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 100e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng fprintf(svgfile, "<defs>\n <style type=\"text/css\">\n <![CDATA[\n"); 101e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 102e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng fprintf(svgfile, " rect { stroke-width: 1; }\n"); 103e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng fprintf(svgfile, " rect.process { fill:rgb(180,180,180); fill-opacity:0.9; stroke-width:1; stroke:rgb( 0, 0, 0); } \n"); 104e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng fprintf(svgfile, " rect.process2 { fill:rgb(180,180,180); fill-opacity:0.9; stroke-width:0; stroke:rgb( 0, 0, 0); } \n"); 105e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng fprintf(svgfile, " rect.sample { fill:rgb( 0, 0,255); fill-opacity:0.8; stroke-width:0; stroke:rgb( 0, 0, 0); } \n"); 106e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng fprintf(svgfile, " rect.blocked { fill:rgb(255, 0, 0); fill-opacity:0.5; stroke-width:0; stroke:rgb( 0, 0, 0); } \n"); 107e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng fprintf(svgfile, " rect.waiting { fill:rgb(224,214, 0); fill-opacity:0.8; stroke-width:0; stroke:rgb( 0, 0, 0); } \n"); 108e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng fprintf(svgfile, " rect.WAITING { fill:rgb(255,214, 48); fill-opacity:0.6; stroke-width:0; stroke:rgb( 0, 0, 0); } \n"); 109e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng fprintf(svgfile, " rect.cpu { fill:rgb(192,192,192); fill-opacity:0.2; stroke-width:0.5; stroke:rgb(128,128,128); } \n"); 110e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng fprintf(svgfile, " rect.pstate { fill:rgb(128,128,128); fill-opacity:0.8; stroke-width:0; } \n"); 111e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng fprintf(svgfile, " rect.c1 { fill:rgb(255,214,214); fill-opacity:0.5; stroke-width:0; } \n"); 112e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng fprintf(svgfile, " rect.c2 { fill:rgb(255,172,172); fill-opacity:0.5; stroke-width:0; } \n"); 113e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng fprintf(svgfile, " rect.c3 { fill:rgb(255,130,130); fill-opacity:0.5; stroke-width:0; } \n"); 114e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng fprintf(svgfile, " rect.c4 { fill:rgb(255, 88, 88); fill-opacity:0.5; stroke-width:0; } \n"); 115e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng fprintf(svgfile, " rect.c5 { fill:rgb(255, 44, 44); fill-opacity:0.5; stroke-width:0; } \n"); 116e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng fprintf(svgfile, " rect.c6 { fill:rgb(255, 0, 0); fill-opacity:0.5; stroke-width:0; } \n"); 117e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng fprintf(svgfile, " line.pstate { stroke:rgb(255,255, 0); stroke-opacity:0.8; stroke-width:2; } \n"); 118e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 119e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng fprintf(svgfile, " ]]>\n </style>\n</defs>\n"); 120e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng} 121e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 122e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengvoid svg_box(int Yslot, u64 start, u64 end, const char *type) 123e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{ 124e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (!svgfile) 125e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng return; 126e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 127e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng fprintf(svgfile, "<rect x=\"%4.8f\" width=\"%4.8f\" y=\"%4.1f\" height=\"%4.1f\" class=\"%s\"/>\n", 128e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng time2pixels(start), time2pixels(end)-time2pixels(start), Yslot * SLOT_MULT, SLOT_HEIGHT, type); 129e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng} 130e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 131e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengvoid svg_sample(int Yslot, int cpu, u64 start, u64 end) 132e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{ 133e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng double text_size; 134e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (!svgfile) 135e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng return; 136e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 137e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng fprintf(svgfile, "<rect x=\"%4.8f\" width=\"%4.8f\" y=\"%4.1f\" height=\"%4.1f\" class=\"sample\"/>\n", 138e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng time2pixels(start), time2pixels(end)-time2pixels(start), Yslot * SLOT_MULT, SLOT_HEIGHT); 139e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 140e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng text_size = (time2pixels(end)-time2pixels(start)); 141e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (cpu > 9) 142e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng text_size = text_size/2; 143e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (text_size > 1.25) 144e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng text_size = 1.25; 145e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng text_size = round_text_size(text_size); 146e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 147e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (text_size > MIN_TEXT_SIZE) 148e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng fprintf(svgfile, "<text x=\"%1.8f\" y=\"%1.8f\" font-size=\"%1.8fpt\">%i</text>\n", 149e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng time2pixels(start), Yslot * SLOT_MULT + SLOT_HEIGHT - 1, text_size, cpu + 1); 150e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 151e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng} 152e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 153e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstatic char *time_to_string(u64 duration) 154e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{ 155e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng static char text[80]; 156e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 157e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng text[0] = 0; 158e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 159e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (duration < 1000) /* less than 1 usec */ 160e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng return text; 161e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 162e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (duration < 1000 * 1000) { /* less than 1 msec */ 163e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng sprintf(text, "%4.1f us", duration / 1000.0); 164e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng return text; 165e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng } 166e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng sprintf(text, "%4.1f ms", duration / 1000.0 / 1000); 167e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 168e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng return text; 169e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng} 170e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 171e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengvoid svg_waiting(int Yslot, u64 start, u64 end) 172e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{ 173e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng char *text; 174e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng const char *style; 175e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng double font_size; 176e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 177e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (!svgfile) 178e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng return; 179e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 180e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng style = "waiting"; 181e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 182e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (end-start > 10 * 1000000) /* 10 msec */ 183e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng style = "WAITING"; 184e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 185e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng text = time_to_string(end-start); 186e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 187e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng font_size = 1.0 * (time2pixels(end)-time2pixels(start)); 188e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 189e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (font_size > 3) 190e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng font_size = 3; 191e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 192e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng font_size = round_text_size(font_size); 193e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 194e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng fprintf(svgfile, "<g transform=\"translate(%4.8f,%4.8f)\">\n", time2pixels(start), Yslot * SLOT_MULT); 195e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng fprintf(svgfile, "<rect x=\"0\" width=\"%4.8f\" y=\"0\" height=\"%4.1f\" class=\"%s\"/>\n", 196e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng time2pixels(end)-time2pixels(start), SLOT_HEIGHT, style); 197e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (font_size > MIN_TEXT_SIZE) 198e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng fprintf(svgfile, "<text transform=\"rotate(90)\" font-size=\"%1.8fpt\"> %s</text>\n", 199e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng font_size, text); 200e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng fprintf(svgfile, "</g>\n"); 201e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng} 202e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 203e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstatic char *cpu_model(void) 204e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{ 205e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng static char cpu_m[255]; 206e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng char buf[256]; 207e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng FILE *file; 208e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 209e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng cpu_m[0] = 0; 210e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng /* CPU type */ 211e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng file = fopen("/proc/cpuinfo", "r"); 212e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (file) { 213e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng while (fgets(buf, 255, file)) { 214e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (strstr(buf, "model name")) { 215e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng strncpy(cpu_m, &buf[13], 255); 216e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng break; 217e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng } 218e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng } 219e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng fclose(file); 220e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng } 221e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 222e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng /* CPU type */ 223e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng file = fopen("/sys/devices/system/cpu/cpu0/cpufreq/scaling_available_frequencies", "r"); 224e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (file) { 225e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng while (fgets(buf, 255, file)) { 226e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng unsigned int freq; 227e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng freq = strtoull(buf, NULL, 10); 228e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (freq > max_freq) 229e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng max_freq = freq; 230e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng } 231e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng fclose(file); 232e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng } 233e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng return cpu_m; 234e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng} 235e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 236e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengvoid svg_cpu_box(int cpu, u64 __max_freq, u64 __turbo_freq) 237e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{ 238e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng char cpu_string[80]; 239e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (!svgfile) 240e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng return; 241e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 242e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng max_freq = __max_freq; 243e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng turbo_frequency = __turbo_freq; 244e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 245e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng fprintf(svgfile, "<rect x=\"%4.8f\" width=\"%4.8f\" y=\"%4.1f\" height=\"%4.1f\" class=\"cpu\"/>\n", 246e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng time2pixels(first_time), 247e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng time2pixels(last_time)-time2pixels(first_time), 248e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng cpu2y(cpu), SLOT_MULT+SLOT_HEIGHT); 249e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 250e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng sprintf(cpu_string, "CPU %i", (int)cpu+1); 251e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng fprintf(svgfile, "<text x=\"%4.8f\" y=\"%4.8f\">%s</text>\n", 252e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 10+time2pixels(first_time), cpu2y(cpu) + SLOT_HEIGHT/2, cpu_string); 253e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 254e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng fprintf(svgfile, "<text transform=\"translate(%4.8f,%4.8f)\" font-size=\"1.25pt\">%s</text>\n", 255e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 10+time2pixels(first_time), cpu2y(cpu) + SLOT_MULT + SLOT_HEIGHT - 4, cpu_model()); 256e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng} 257e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 258e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengvoid svg_process(int cpu, u64 start, u64 end, const char *type, const char *name) 259e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{ 260e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng double width; 261e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 262e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (!svgfile) 263e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng return; 264e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 265e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 266e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng fprintf(svgfile, "<g transform=\"translate(%4.8f,%4.8f)\">\n", time2pixels(start), cpu2y(cpu)); 267e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng fprintf(svgfile, "<rect x=\"0\" width=\"%4.8f\" y=\"0\" height=\"%4.1f\" class=\"%s\"/>\n", 268e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng time2pixels(end)-time2pixels(start), SLOT_MULT+SLOT_HEIGHT, type); 269e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng width = time2pixels(end)-time2pixels(start); 270e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (width > 6) 271e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng width = 6; 272e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 273e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng width = round_text_size(width); 274e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 275e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (width > MIN_TEXT_SIZE) 276e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng fprintf(svgfile, "<text transform=\"rotate(90)\" font-size=\"%3.8fpt\">%s</text>\n", 277e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng width, name); 278e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 279e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng fprintf(svgfile, "</g>\n"); 280e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng} 281e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 282e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengvoid svg_cstate(int cpu, u64 start, u64 end, int type) 283e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{ 284e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng double width; 285e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng char style[128]; 286e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 287e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (!svgfile) 288e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng return; 289e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 290e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 291e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (type > 6) 292e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng type = 6; 293e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng sprintf(style, "c%i", type); 294e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 295e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng fprintf(svgfile, "<rect class=\"%s\" x=\"%4.8f\" width=\"%4.8f\" y=\"%4.1f\" height=\"%4.1f\"/>\n", 296e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng style, 297e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng time2pixels(start), time2pixels(end)-time2pixels(start), 298e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng cpu2y(cpu), SLOT_MULT+SLOT_HEIGHT); 299e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 300e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng width = (time2pixels(end)-time2pixels(start))/2.0; 301e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (width > 6) 302e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng width = 6; 303e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 304e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng width = round_text_size(width); 305e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 306e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (width > MIN_TEXT_SIZE) 307e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng fprintf(svgfile, "<text x=\"%4.8f\" y=\"%4.8f\" font-size=\"%3.8fpt\">C%i</text>\n", 308e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng time2pixels(start), cpu2y(cpu)+width, width, type); 309e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng} 310e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 311e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstatic char *HzToHuman(unsigned long hz) 312e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{ 313e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng static char buffer[1024]; 314e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng unsigned long long Hz; 315e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 316e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng memset(buffer, 0, 1024); 317e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 318e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng Hz = hz; 319e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 320e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng /* default: just put the Number in */ 321e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng sprintf(buffer, "%9lli", Hz); 322e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 323e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (Hz > 1000) 324e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng sprintf(buffer, " %6lli Mhz", (Hz+500)/1000); 325e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 326e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (Hz > 1500000) 327e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng sprintf(buffer, " %6.2f Ghz", (Hz+5000.0)/1000000); 328e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 329e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (Hz == turbo_frequency) 330e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng sprintf(buffer, "Turbo"); 331e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 332e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng return buffer; 333e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng} 334e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 335e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengvoid svg_pstate(int cpu, u64 start, u64 end, u64 freq) 336e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{ 337e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng double height = 0; 338e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 339e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (!svgfile) 340e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng return; 341e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 342e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (max_freq) 343e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng height = freq * 1.0 / max_freq * (SLOT_HEIGHT + SLOT_MULT); 344e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng height = 1 + cpu2y(cpu) + SLOT_MULT + SLOT_HEIGHT - height; 345e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng fprintf(svgfile, "<line x1=\"%4.8f\" x2=\"%4.8f\" y1=\"%4.1f\" y2=\"%4.1f\" class=\"pstate\"/>\n", 346e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng time2pixels(start), time2pixels(end), height, height); 347e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng fprintf(svgfile, "<text x=\"%4.8f\" y=\"%4.8f\" font-size=\"0.25pt\">%s</text>\n", 348e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng time2pixels(start), height+0.9, HzToHuman(freq)); 349e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 350e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng} 351e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 352e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 353e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengvoid svg_partial_wakeline(u64 start, int row1, char *desc1, int row2, char *desc2) 354e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{ 355e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng double height; 356e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 357e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (!svgfile) 358e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng return; 359e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 360e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 361e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (row1 < row2) { 362e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (row1) { 363e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 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\"/>\n", 364e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng time2pixels(start), row1 * SLOT_MULT + SLOT_HEIGHT, time2pixels(start), row1 * SLOT_MULT + SLOT_HEIGHT + SLOT_MULT/32); 365e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (desc2) 366e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng fprintf(svgfile, "<g transform=\"translate(%4.8f,%4.8f)\"><text transform=\"rotate(90)\" font-size=\"0.02pt\">%s ></text></g>\n", 367e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng time2pixels(start), row1 * SLOT_MULT + SLOT_HEIGHT + SLOT_HEIGHT/48, desc2); 368e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng } 369e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (row2) { 370e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 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\"/>\n", 371e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng time2pixels(start), row2 * SLOT_MULT - SLOT_MULT/32, time2pixels(start), row2 * SLOT_MULT); 372e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (desc1) 373e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng fprintf(svgfile, "<g transform=\"translate(%4.8f,%4.8f)\"><text transform=\"rotate(90)\" font-size=\"0.02pt\">%s ></text></g>\n", 374e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng time2pixels(start), row2 * SLOT_MULT - SLOT_MULT/32, desc1); 375e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng } 376e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng } else { 377e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (row2) { 378e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 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\"/>\n", 379e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng time2pixels(start), row2 * SLOT_MULT + SLOT_HEIGHT, time2pixels(start), row2 * SLOT_MULT + SLOT_HEIGHT + SLOT_MULT/32); 380e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (desc1) 381e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng fprintf(svgfile, "<g transform=\"translate(%4.8f,%4.8f)\"><text transform=\"rotate(90)\" font-size=\"0.02pt\">%s <</text></g>\n", 382e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng time2pixels(start), row2 * SLOT_MULT + SLOT_HEIGHT + SLOT_MULT/48, desc1); 383e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng } 384e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (row1) { 385e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 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\"/>\n", 386e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng time2pixels(start), row1 * SLOT_MULT - SLOT_MULT/32, time2pixels(start), row1 * SLOT_MULT); 387e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (desc2) 388e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng fprintf(svgfile, "<g transform=\"translate(%4.8f,%4.8f)\"><text transform=\"rotate(90)\" font-size=\"0.02pt\">%s <</text></g>\n", 389e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng time2pixels(start), row1 * SLOT_MULT - SLOT_HEIGHT/32, desc2); 390e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng } 391e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng } 392e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng height = row1 * SLOT_MULT; 393e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (row2 > row1) 394e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng height += SLOT_HEIGHT; 395e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (row1) 396e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng fprintf(svgfile, "<circle cx=\"%4.8f\" cy=\"%4.2f\" r = \"0.01\" style=\"fill:rgb(32,255,32)\"/>\n", 397e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng time2pixels(start), height); 398e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng} 399e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 400e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengvoid svg_wakeline(u64 start, int row1, int row2) 401e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{ 402e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng double height; 403e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 404e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (!svgfile) 405e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng return; 406e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 407e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 408e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (row1 < row2) 409e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 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\"/>\n", 410e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng time2pixels(start), row1 * SLOT_MULT + SLOT_HEIGHT, time2pixels(start), row2 * SLOT_MULT); 411e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng else 412e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 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\"/>\n", 413e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng time2pixels(start), row2 * SLOT_MULT + SLOT_HEIGHT, time2pixels(start), row1 * SLOT_MULT); 414e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 415e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng height = row1 * SLOT_MULT; 416e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (row2 > row1) 417e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng height += SLOT_HEIGHT; 418e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng fprintf(svgfile, "<circle cx=\"%4.8f\" cy=\"%4.2f\" r = \"0.01\" style=\"fill:rgb(32,255,32)\"/>\n", 419e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng time2pixels(start), height); 420e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng} 421e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 422e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengvoid svg_interrupt(u64 start, int row) 423e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{ 424e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (!svgfile) 425e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng return; 426e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 427e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng fprintf(svgfile, "<circle cx=\"%4.8f\" cy=\"%4.2f\" r = \"0.01\" style=\"fill:rgb(255,128,128)\"/>\n", 428e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng time2pixels(start), row * SLOT_MULT); 429e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng fprintf(svgfile, "<circle cx=\"%4.8f\" cy=\"%4.2f\" r = \"0.01\" style=\"fill:rgb(255,128,128)\"/>\n", 430e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng time2pixels(start), row * SLOT_MULT + SLOT_HEIGHT); 431e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng} 432e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 433e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengvoid svg_text(int Yslot, u64 start, const char *text) 434e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{ 435e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (!svgfile) 436e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng return; 437e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 438e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng fprintf(svgfile, "<text x=\"%4.8f\" y=\"%4.8f\">%s</text>\n", 439e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng time2pixels(start), Yslot * SLOT_MULT+SLOT_HEIGHT/2, text); 440e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng} 441e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 442e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstatic void svg_legenda_box(int X, const char *text, const char *style) 443e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{ 444e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng double boxsize; 445e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng boxsize = SLOT_HEIGHT / 2; 446e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 447e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng fprintf(svgfile, "<rect x=\"%i\" width=\"%4.8f\" y=\"0\" height=\"%4.1f\" class=\"%s\"/>\n", 448e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng X, boxsize, boxsize, style); 449e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng fprintf(svgfile, "<text transform=\"translate(%4.8f, %4.8f)\" font-size=\"%4.8fpt\">%s</text>\n", 450e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng X + boxsize + 5, boxsize, 0.8 * boxsize, text); 451e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng} 452e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 453e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengvoid svg_legenda(void) 454e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{ 455e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (!svgfile) 456e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng return; 457e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 458e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng svg_legenda_box(0, "Running", "sample"); 459e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng svg_legenda_box(100, "Idle","c1"); 460e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng svg_legenda_box(200, "Deeper Idle", "c3"); 461e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng svg_legenda_box(350, "Deepest Idle", "c6"); 462e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng svg_legenda_box(550, "Sleeping", "process2"); 463e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng svg_legenda_box(650, "Waiting for cpu", "waiting"); 464e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng svg_legenda_box(800, "Blocked on IO", "blocked"); 465e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng} 466e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 467e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengvoid svg_time_grid(void) 468e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{ 469e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng u64 i; 470e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 471e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (!svgfile) 472e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng return; 473e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 474e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng i = first_time; 475e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng while (i < last_time) { 476e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng int color = 220; 477e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng double thickness = 0.075; 478e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if ((i % 100000000) == 0) { 479e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng thickness = 0.5; 480e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng color = 192; 481e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng } 482e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if ((i % 1000000000) == 0) { 483e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng thickness = 2.0; 484e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng color = 128; 485e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng } 486e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 487e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng fprintf(svgfile, "<line x1=\"%4.8f\" y1=\"%4.2f\" x2=\"%4.8f\" y2=\"%" PRIu64 "\" style=\"stroke:rgb(%i,%i,%i);stroke-width:%1.3f\"/>\n", 488e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng time2pixels(i), SLOT_MULT/2, time2pixels(i), total_height, color, color, color, thickness); 489e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 490e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng i += 10000000; 491e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng } 492e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng} 493e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 494e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengvoid svg_close(void) 495e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{ 496e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (svgfile) { 497e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng fprintf(svgfile, "</svg>\n"); 498e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng fclose(svgfile); 499e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng svgfile = NULL; 500e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng } 501e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng} 502