56d268d552f461add161931a880ffabc2f67f22f
[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                 fprintf(f, "<span title=\"%s\">%6d</span>", vec->entries[index].name,
22                                 vec->entries[index].data);
23 #else
24                 fprintf(f, "%6d", vec->entries[index].data);
25 #endif
26         }
27         fprintf(f, " )</span>\n");
28 }
29
30 static void dump_matrix(FILE *f, pbqp_matrix *mat)
31 {
32         unsigned row, col;
33         assert(mat);
34         num *p = mat->entries;
35
36         assert(mat->cols> 0);
37         assert(mat->rows> 0);
38         fprintf(f, "\t\\begin{pmatrix}\n");
39         for (row = 0; row < mat->rows; ++row) {
40                 fprintf(f, "\t %6d", *p++);
41                 for (col = 1; col < mat->cols; ++col) {
42                         fprintf(f, "& %6d", *p++);
43                 }
44                 fprintf(f, "\\\\\n");
45         }
46         fprintf(f, "\t\\end{pmatrix}\n");
47 }
48
49 static void dump_edge_costs(pbqp *pbqp)
50 {
51         unsigned src_index;
52
53         assert(pbqp);
54         assert(pbqp->dump_file);
55
56         fputs("<p>", pbqp->dump_file);
57         for (src_index = 0; src_index < pbqp->num_nodes; ++src_index) {
58                 pbqp_node *src_node = get_node(pbqp, src_index);
59
60                 if (!src_node)
61                         continue;
62
63                 unsigned edge_index;
64                 unsigned len = ARR_LEN(src_node->edges);
65                 for (edge_index = 0; edge_index < len; ++edge_index) {
66                         pbqp_edge *edge = src_node->edges[edge_index];
67                         unsigned tgt_index = edge->tgt;
68                         if (src_index < tgt_index) {
69                                 fputs("<tex>\n", pbqp->dump_file);
70                                 fprintf(pbqp->dump_file, "\t\\overline\n{C}_{%d,%d}=\n",
71                                                 src_index, tgt_index);
72                                 dump_matrix(pbqp->dump_file, edge->costs);
73                                 fputs("</tex><br>", pbqp->dump_file);
74                         }
75                 }
76         }
77         fputs("</p>", pbqp->dump_file);
78 }
79
80 static void dump_node_costs(pbqp *pbqp)
81 {
82         unsigned index;
83
84         assert(pbqp);
85         assert(pbqp->dump_file);
86
87         /* dump node costs */
88         fputs("<p>", pbqp->dump_file);
89         for (index = 0; index < pbqp->num_nodes; ++index) {
90                 pbqp_node *node = get_node(pbqp, index);
91                 if (node) {
92                         fprintf(pbqp->dump_file, "\tc<sub>%d</sub> = ", index);
93                         dump_vector(pbqp->dump_file, node->costs);
94                         fputs("<br>\n", pbqp->dump_file);
95                 }
96         }
97         fputs("</p>", pbqp->dump_file);
98 }
99
100 static void dump_section(FILE *f, int level, char *txt)
101 {
102         assert(f);
103
104         fprintf(f, "<h%d>%s</h%d>\n", level, txt, level);
105 }
106
107 void pbqp_dump_graph(pbqp *pbqp)
108 {
109         unsigned src_index;
110
111         assert(pbqp);
112         assert(pbqp->dump_file);
113
114         fputs("<p>\n<graph>\n\tgraph input {\n", pbqp->dump_file);
115         for (src_index = 0; src_index < pbqp->num_nodes; ++src_index) {
116                 pbqp_node *node = get_node(pbqp, src_index);
117                 if (node) {
118                         fprintf(pbqp->dump_file, "\t n%d;\n", src_index);
119                 }
120         }
121
122         for (src_index = 0; src_index < pbqp->num_nodes; ++src_index) {
123                 pbqp_node *node = get_node(pbqp, src_index);
124
125                 if (!node)
126                         continue;
127
128                 unsigned len = ARR_LEN(node->edges);
129                 unsigned edge_index;
130                 for (edge_index = 0; edge_index < len; ++edge_index) {
131                         unsigned tgt_index = node->edges[edge_index]->tgt;
132
133                         if (src_index < tgt_index) {
134                                 fprintf(pbqp->dump_file, "\t n%d -- n%d;\n", src_index,
135                                                 tgt_index);
136                         }
137                 }
138         }
139         fputs("\t}\n</graph>\n</p>\n", pbqp->dump_file);
140 }
141
142 void pbqp_dump_input(pbqp *pbqp)
143 {
144         assert(pbqp);
145         assert(pbqp->dump_file);
146
147         dump_section(pbqp->dump_file, 1, "1. PBQP Problem");
148         dump_section(pbqp->dump_file, 2, "1.1 Topology");
149         pbqp_dump_graph(pbqp);
150         dump_section(pbqp->dump_file, 2, "1.2 Cost Vectors");
151         dump_node_costs(pbqp);
152         dump_section(pbqp->dump_file, 2, "1.3 Cost Matrices");
153         dump_edge_costs(pbqp);
154 }