2 * Copyright (C) 1995-2008 University of Karlsruhe. All right reserved.
4 * This file is part of libFirm.
6 * This file may be distributed and/or modified under the terms of the
7 * GNU General Public License version 2 as published by the Free Software
8 * Foundation and appearing in the file LICENSE.GPL included in the
9 * packaging of this file.
11 * Licensees holding valid libFirm Professional Edition licenses may use
12 * this file in accordance with the libFirm Commercial License.
13 * Agreement provided with the Software.
15 * This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
16 * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22 * @brief HTML dumper for PBQP.
24 * @author Sebastian Buchwald
29 #include "adt/array.h"
32 #include "pbqp_edge_t.h"
33 #include "pbqp_node_t.h"
35 #include "html_dumper.h"
38 /* Caution: Due to static buffer use only once per statement */
39 static const char *cost2a(num const cost)
43 if (cost == INF_COSTS) return "inf";
45 sprintf(buf, "%u", cost);
47 sprintf(buf, "%10lld", cost);
53 static void dump_vector(FILE *f, vector_t *vec)
58 fprintf(f, "<span class=\"vector\">( ");
59 unsigned len = vec->len;
61 for (index = 0; index < len; ++index) {
62 #if KAPS_ENABLE_VECTOR_NAMES
63 fprintf(f, "<span title=\"%s\">%s</span> ",
64 vec->entries[index].name, cost2a(vec->entries[index].data));
66 fprintf(f, "%s ", cost2a(vec->entries[index].data));
69 fprintf(f, " )</span>\n");
72 static void dump_matrix(FILE *f, pbqp_matrix_t *mat)
76 num *p = mat->entries;
80 fprintf(f, "\t\\begin{pmatrix}\n");
81 for (row = 0; row < mat->rows; ++row) {
82 fprintf(f, "\t %s", cost2a(*p++));
84 for (col = 1; col < mat->cols; ++col) {
85 fprintf(f, "& %s", cost2a(*p++));
89 fprintf(f, "\t\\end{pmatrix}\n");
92 void dump_edge(FILE *file, pbqp_edge_t *edge)
94 fputs("<tex>\n", file);
95 fprintf(file, "\t\\overline\n{C}_{%d,%d}=\n",
96 edge->src->index, edge->tgt->index);
97 dump_matrix(file, edge->costs);
98 fputs("</tex><br>", file);
101 static void dump_edge_costs(pbqp_t *pbqp)
106 assert(pbqp->dump_file);
108 fputs("<p>", pbqp->dump_file);
109 for (src_index = 0; src_index < pbqp->num_nodes; ++src_index) {
110 pbqp_node_t *src_node = get_node(pbqp, src_index);
116 unsigned len = ARR_LEN(src_node->edges);
117 for (edge_index = 0; edge_index < len; ++edge_index) {
118 pbqp_edge_t *edge = src_node->edges[edge_index];
119 unsigned tgt_index = edge->tgt->index;
120 if (src_index < tgt_index) {
121 dump_edge(pbqp->dump_file, edge);
125 fputs("</p>", pbqp->dump_file);
128 void dump_node(FILE *file, pbqp_node_t *node)
133 fprintf(file, "\tc<sub>%d</sub> = ", node->index);
134 dump_vector(file, node->costs);
135 fputs("<br>\n", file);
139 static void dump_node_costs(pbqp_t *pbqp)
144 assert(pbqp->dump_file);
146 /* dump node costs */
147 fputs("<p>", pbqp->dump_file);
148 for (index = 0; index < pbqp->num_nodes; ++index) {
149 dump_node(pbqp->dump_file, get_node(pbqp, index));
151 fputs("</p>", pbqp->dump_file);
154 void dump_section(FILE *f, int level, const char *txt)
158 fprintf(f, "<h%d>%s</h%d>\n", level, txt, level);
161 void pbqp_dump_graph(pbqp_t *pbqp)
166 assert(pbqp->dump_file);
168 fputs("<p>\n<graph>\n\tgraph input {\n", pbqp->dump_file);
169 for (src_index = 0; src_index < pbqp->num_nodes; ++src_index) {
170 pbqp_node_t *node = get_node(pbqp, src_index);
171 if (node && !node_is_reduced(node)) {
172 fprintf(pbqp->dump_file, "\t n%d;\n", src_index);
176 for (src_index = 0; src_index < pbqp->num_nodes; ++src_index) {
177 pbqp_node_t *node = get_node(pbqp, src_index);
182 if (node_is_reduced(node))
185 unsigned len = ARR_LEN(node->edges);
187 for (edge_index = 0; edge_index < len; ++edge_index) {
188 pbqp_node_t *tgt_node = node->edges[edge_index]->tgt;
189 unsigned tgt_index = tgt_node->index;
191 if (node_is_reduced(tgt_node))
194 if (src_index < tgt_index) {
195 fprintf(pbqp->dump_file, "\t n%d -- n%d;\n", src_index,
200 fputs("\t}\n</graph>\n</p>\n", pbqp->dump_file);
203 void pbqp_dump_input(pbqp_t *pbqp)
206 assert(pbqp->dump_file);
208 dump_section(pbqp->dump_file, 1, "1. PBQP Problem");
209 dump_section(pbqp->dump_file, 2, "1.1 Topology");
210 pbqp_dump_graph(pbqp);
211 dump_section(pbqp->dump_file, 2, "1.2 Cost Vectors");
212 dump_node_costs(pbqp);
213 dump_section(pbqp->dump_file, 2, "1.3 Cost Matrices");
214 dump_edge_costs(pbqp);
217 void dump_simplifyedge(pbqp_t *pbqp, pbqp_edge_t *edge)
220 assert(pbqp->dump_file);
222 dump_node(pbqp->dump_file, edge->src);
223 dump_edge(pbqp->dump_file, edge);
224 dump_node(pbqp->dump_file, edge->tgt);