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