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