Added simplification loop.
[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 static 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, edge->tgt);
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;
97                         if (src_index < tgt_index) {
98                                 dump_edge(pbqp, edge);
99                         }
100                 }
101         }
102         fputs("</p>", pbqp->dump_file);
103 }
104
105 static void dump_node(pbqp *pbqp, unsigned index)
106 {
107         assert(pbqp);
108         assert(pbqp->dump_file);
109
110         pbqp_node *node = get_node(pbqp, index);
111         if (node) {
112                 fprintf(pbqp->dump_file, "\tc<sub>%d</sub> = ", index);
113                 dump_vector(pbqp->dump_file, node->costs);
114                 fputs("<br>\n", pbqp->dump_file);
115         }
116 }
117
118 static void dump_node_costs(pbqp *pbqp)
119 {
120         unsigned index;
121
122         assert(pbqp);
123         assert(pbqp->dump_file);
124
125         /* dump node costs */
126         fputs("<p>", pbqp->dump_file);
127         for (index = 0; index < pbqp->num_nodes; ++index) {
128                 dump_node(pbqp, index);
129         }
130         fputs("</p>", pbqp->dump_file);
131 }
132
133 void dump_section(FILE *f, int level, char *txt)
134 {
135         assert(f);
136
137         fprintf(f, "<h%d>%s</h%d>\n", level, txt, level);
138 }
139
140 void pbqp_dump_graph(pbqp *pbqp)
141 {
142         unsigned src_index;
143
144         assert(pbqp);
145         assert(pbqp->dump_file);
146
147         fputs("<p>\n<graph>\n\tgraph input {\n", pbqp->dump_file);
148         for (src_index = 0; src_index < pbqp->num_nodes; ++src_index) {
149                 pbqp_node *node = get_node(pbqp, src_index);
150                 if (node) {
151                         fprintf(pbqp->dump_file, "\t n%d;\n", src_index);
152                 }
153         }
154
155         for (src_index = 0; src_index < pbqp->num_nodes; ++src_index) {
156                 pbqp_node *node = get_node(pbqp, src_index);
157
158                 if (!node)
159                         continue;
160
161                 unsigned len = ARR_LEN(node->edges);
162                 unsigned edge_index;
163                 for (edge_index = 0; edge_index < len; ++edge_index) {
164                         unsigned tgt_index = node->edges[edge_index]->tgt;
165
166                         if (src_index < tgt_index) {
167                                 fprintf(pbqp->dump_file, "\t n%d -- n%d;\n", src_index,
168                                                 tgt_index);
169                         }
170                 }
171         }
172         fputs("\t}\n</graph>\n</p>\n", pbqp->dump_file);
173 }
174
175 void pbqp_dump_input(pbqp *pbqp)
176 {
177         assert(pbqp);
178         assert(pbqp->dump_file);
179
180         dump_section(pbqp->dump_file, 1, "1. PBQP Problem");
181         dump_section(pbqp->dump_file, 2, "1.1 Topology");
182         pbqp_dump_graph(pbqp);
183         dump_section(pbqp->dump_file, 2, "1.2 Cost Vectors");
184         dump_node_costs(pbqp);
185         dump_section(pbqp->dump_file, 2, "1.3 Cost Matrices");
186         dump_edge_costs(pbqp);
187 }
188
189 void dump_simplifyedge(pbqp *pbqp, pbqp_edge *edge)
190 {
191         assert(pbqp);
192         assert(pbqp->dump_file);
193
194         dump_node(pbqp, edge->src);
195         dump_edge(pbqp, edge);
196         dump_node(pbqp, edge->tgt);
197 }