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