Use bigger type for PBQP costs.
[libfirm] / html_dumper.c
1 #include "adt/array.h"
2 #include "assert.h"
3
4 #include "pbqp_edge_t.h"
5 #include "pbqp_node_t.h"
6 #include "heuristical.h"
7 #include "html_dumper.h"
8 #include "kaps.h"
9 #include "pbqp_t.h"
10
11 /* Caution: Due to static buffer use only once per statement */
12 static const char *cost2a(num const cost)
13 {
14         static char buf[10];
15
16         if (cost == INF_COSTS) return "inf";
17         sprintf(buf, "%10lld", cost);
18         return buf;
19 }
20
21 /* print vector */
22 static void dump_vector(FILE *f, vector *vec)
23 {
24         unsigned index;
25         assert(vec);
26
27         fprintf(f, "<span class=\"vector\">( ");
28         unsigned len = vec->len;
29         assert(len > 0);
30         for (index = 0; index < len; ++index) {
31 #if EXT_GRS_DEBUG
32                 fprintf(f, "<span title=\"%s\">%s</span> ",
33                                 vec->entries[index].name, cost2a(vec->entries[index].data));
34 #else
35                 fprintf(f, "%s ", cost2a(vec->entries[index].data));
36 #endif
37         }
38         fprintf(f, " )</span>\n");
39 }
40
41 static void dump_matrix(FILE *f, pbqp_matrix *mat)
42 {
43         unsigned row, col;
44         assert(mat);
45         num *p = mat->entries;
46
47         assert(mat->cols> 0);
48         assert(mat->rows> 0);
49         fprintf(f, "\t\\begin{pmatrix}\n");
50         for (row = 0; row < mat->rows; ++row) {
51                 fprintf(f, "\t %s", cost2a(*p++));
52
53                 for (col = 1; col < mat->cols; ++col) {
54                         fprintf(f, "& %s", cost2a(*p++));
55                 }
56                 fprintf(f, "\\\\\n");
57         }
58         fprintf(f, "\t\\end{pmatrix}\n");
59 }
60
61 void dump_edge(pbqp *pbqp, pbqp_edge *edge)
62 {
63         fputs("<tex>\n", pbqp->dump_file);
64         fprintf(pbqp->dump_file, "\t\\overline\n{C}_{%d,%d}=\n",
65                         edge->src->index, edge->tgt->index);
66         dump_matrix(pbqp->dump_file, edge->costs);
67         fputs("</tex><br>", pbqp->dump_file);
68 }
69
70 static void dump_edge_costs(pbqp *pbqp)
71 {
72         unsigned src_index;
73
74         assert(pbqp);
75         assert(pbqp->dump_file);
76
77         fputs("<p>", pbqp->dump_file);
78         for (src_index = 0; src_index < pbqp->num_nodes; ++src_index) {
79                 pbqp_node *src_node = get_node(pbqp, src_index);
80
81                 if (!src_node)
82                         continue;
83
84                 unsigned edge_index;
85                 unsigned len = ARR_LEN(src_node->edges);
86                 for (edge_index = 0; edge_index < len; ++edge_index) {
87                         pbqp_edge *edge = src_node->edges[edge_index];
88                         unsigned tgt_index = edge->tgt->index;
89                         if (src_index < tgt_index) {
90                                 dump_edge(pbqp, edge);
91                         }
92                 }
93         }
94         fputs("</p>", pbqp->dump_file);
95 }
96
97 void dump_node(pbqp *pbqp, pbqp_node *node)
98 {
99         assert(pbqp);
100         assert(pbqp->dump_file);
101
102         if (node) {
103                 fprintf(pbqp->dump_file, "\tc<sub>%d</sub> = ", node->index);
104                 dump_vector(pbqp->dump_file, node->costs);
105                 fputs("<br>\n", pbqp->dump_file);
106         }
107 }
108
109 static void dump_node_costs(pbqp *pbqp)
110 {
111         unsigned index;
112
113         assert(pbqp);
114         assert(pbqp->dump_file);
115
116         /* dump node costs */
117         fputs("<p>", pbqp->dump_file);
118         for (index = 0; index < pbqp->num_nodes; ++index) {
119                 dump_node(pbqp, get_node(pbqp, index));
120         }
121         fputs("</p>", pbqp->dump_file);
122 }
123
124 void dump_section(FILE *f, int level, char *txt)
125 {
126         assert(f);
127
128         fprintf(f, "<h%d>%s</h%d>\n", level, txt, level);
129 }
130
131 void pbqp_dump_graph(pbqp *pbqp)
132 {
133         unsigned src_index;
134
135         assert(pbqp);
136         assert(pbqp->dump_file);
137
138         fputs("<p>\n<graph>\n\tgraph input {\n", pbqp->dump_file);
139         for (src_index = 0; src_index < pbqp->num_nodes; ++src_index) {
140                 pbqp_node *node = get_node(pbqp, src_index);
141                 if (node && !node_is_reduced(node)) {
142                         fprintf(pbqp->dump_file, "\t n%d;\n", src_index);
143                 }
144         }
145
146         for (src_index = 0; src_index < pbqp->num_nodes; ++src_index) {
147                 pbqp_node *node = get_node(pbqp, src_index);
148
149                 if (!node)
150                         continue;
151
152                 if (node_is_reduced(node))
153                         continue;
154
155                 unsigned len = ARR_LEN(node->edges);
156                 unsigned edge_index;
157                 for (edge_index = 0; edge_index < len; ++edge_index) {
158                         pbqp_node *tgt_node = node->edges[edge_index]->tgt;
159                         unsigned tgt_index = tgt_node->index;
160
161                         if (node_is_reduced(tgt_node))
162                                 continue;
163
164                         if (src_index < tgt_index) {
165                                 fprintf(pbqp->dump_file, "\t n%d -- n%d;\n", src_index,
166                                                 tgt_index);
167                         }
168                 }
169         }
170         fputs("\t}\n</graph>\n</p>\n", pbqp->dump_file);
171 }
172
173 void pbqp_dump_input(pbqp *pbqp)
174 {
175         assert(pbqp);
176         assert(pbqp->dump_file);
177
178         dump_section(pbqp->dump_file, 1, "1. PBQP Problem");
179         dump_section(pbqp->dump_file, 2, "1.1 Topology");
180         pbqp_dump_graph(pbqp);
181         dump_section(pbqp->dump_file, 2, "1.2 Cost Vectors");
182         dump_node_costs(pbqp);
183         dump_section(pbqp->dump_file, 2, "1.3 Cost Matrices");
184         dump_edge_costs(pbqp);
185 }
186
187 void dump_simplifyedge(pbqp *pbqp, pbqp_edge *edge)
188 {
189         assert(pbqp);
190         assert(pbqp->dump_file);
191
192         dump_node(pbqp, edge->src);
193         dump_edge(pbqp, edge);
194         dump_node(pbqp, edge->tgt);
195 }