Define macros before including files.
[libfirm] / kaps.c
1 #include "adt/array.h"
2
3 #include "kaps.h"
4 #include "matrix.h"
5 #include "pbqp_edge.h"
6 #include "pbqp_edge_t.h"
7 #include "pbqp_node.h"
8 #include "pbqp_node_t.h"
9 #include "vector.h"
10
11 pbqp_node *get_node(pbqp *pbqp, unsigned index)
12 {
13         return pbqp->nodes[index];
14 }
15
16 pbqp_edge *get_edge(pbqp *pbqp, unsigned src_index, unsigned tgt_index)
17 {
18         int i;
19         int len;
20
21         if (tgt_index < src_index) {
22                 unsigned tmp = src_index;
23                 src_index    = tgt_index;
24                 tgt_index    = tmp;
25         }
26
27         pbqp_node *src_node = get_node(pbqp, src_index);
28         pbqp_node *tgt_node = get_node(pbqp, tgt_index);
29         assert(src_node);
30         assert(tgt_node);
31
32         len = ARR_LEN(src_node->edges);
33
34         for (i = 0; i < len; ++i) {
35                 pbqp_edge *cur_edge = src_node->edges[i];
36                 if (cur_edge->tgt == tgt_node) {
37                         return cur_edge;
38                 }
39         }
40
41         return NULL;
42 }
43
44 pbqp *alloc_pbqp(unsigned number_nodes)
45 {
46         pbqp* pbqp = xmalloc(sizeof(*pbqp));
47
48         obstack_init(&pbqp->obstack);
49
50         pbqp->solution = 0;
51         pbqp->num_nodes = number_nodes;
52 #if     KAPS_DUMP
53         pbqp->dump_file = NULL;
54 #endif
55         pbqp->nodes = obstack_alloc(&pbqp->obstack, number_nodes
56                         * sizeof(*pbqp->nodes));
57         memset(pbqp->nodes, 0, number_nodes * sizeof(*pbqp->nodes));
58 #if KAPS_STATISTIC
59         pbqp->num_bf = 0;
60         pbqp->num_edges = 0;
61         pbqp->num_r0 = 0;
62         pbqp->num_r1 = 0;
63         pbqp->num_r2 = 0;
64         pbqp->num_rn = 0;
65 #endif
66
67         return pbqp;
68 }
69
70 void free_pbqp(pbqp *pbqp)
71 {
72         obstack_free(&pbqp->obstack, NULL);
73         xfree(pbqp);
74 }
75
76 void add_node_costs(pbqp *pbqp, unsigned node_index, vector *costs)
77 {
78         pbqp_node *node = get_node(pbqp, node_index);
79
80         if (node == NULL) {
81                 node = alloc_node(pbqp, node_index, costs);
82                 pbqp->nodes[node_index] = node;
83         } else {
84                 vector_add(node->costs, costs);
85         }
86 }
87
88 void add_edge_costs(pbqp *pbqp, unsigned src_index, unsigned tgt_index,
89                 pbqp_matrix *costs)
90 {
91         pbqp_edge *edge = get_edge(pbqp, src_index, tgt_index);
92
93         if (tgt_index < src_index) {
94                 pbqp_matrix_transpose(pbqp, costs);
95                 add_edge_costs(pbqp, tgt_index, src_index, costs);
96                 return;
97         }
98
99         if (edge == NULL) {
100                 edge = alloc_edge(pbqp, src_index, tgt_index, costs);
101         } else {
102                 pbqp_matrix_add(edge->costs, costs);
103         }
104 }
105
106 num get_node_solution(pbqp *pbqp, unsigned node_index)
107 {
108         pbqp_node *node = get_node(pbqp, node_index);
109         assert(node);
110
111         return node->solution;
112 }
113
114 num get_solution(pbqp *pbqp)
115 {
116         return pbqp->solution;
117 }
118
119 #if     KAPS_DUMP
120 void set_dumpfile(pbqp *pbqp, FILE *f)
121 {
122         assert(pbqp);
123         pbqp->dump_file = f;
124 }
125 #endif