Do not stress tail recursion elimination and partial condition evaluation too much...
[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         assert(src_node);
29         assert(get_node(pbqp, tgt_index));
30
31         len = ARR_LEN(src_node->edges);
32
33         for (i = 0; i < len; ++i) {
34                 pbqp_edge *cur_edge = src_node->edges[i];
35                 if (cur_edge->tgt->index == tgt_index) {
36                         return cur_edge;
37                 }
38         }
39
40         return NULL;
41 }
42
43 pbqp *alloc_pbqp(unsigned number_nodes)
44 {
45         pbqp* pbqp = xmalloc(sizeof(*pbqp));
46
47         obstack_init(&pbqp->obstack);
48
49         pbqp->solution = 0;
50         pbqp->num_nodes = number_nodes;
51         pbqp->dump_file = NULL;
52         pbqp->nodes = obstack_alloc(&pbqp->obstack, number_nodes
53                         * sizeof(*pbqp->nodes));
54         memset(pbqp->nodes, 0, number_nodes * sizeof(*pbqp->nodes));
55
56         return pbqp;
57 }
58
59 void free_pbqp(pbqp *pbqp)
60 {
61         obstack_free(&pbqp->obstack, NULL);
62         xfree(pbqp);
63 }
64
65 void add_node_costs(pbqp *pbqp, unsigned node_index, vector *costs)
66 {
67         pbqp_node *node = get_node(pbqp, node_index);
68
69         if (node == NULL) {
70                 node = alloc_node(pbqp, node_index, costs);
71                 pbqp->nodes[node_index] = node;
72         } else {
73                 vector_add(node->costs, costs);
74         }
75 }
76
77 void add_edge_costs(pbqp *pbqp, unsigned src_index, unsigned tgt_index,
78                 pbqp_matrix *costs)
79 {
80         pbqp_edge *edge = get_edge(pbqp, src_index, tgt_index);
81
82         if (edge == NULL) {
83                 edge = alloc_edge(pbqp, src_index, tgt_index, costs);
84         } else {
85                 pbqp_matrix_add(edge->costs, costs);
86         }
87 }
88
89 num get_node_solution(pbqp *pbqp, unsigned node_index)
90 {
91         pbqp_node *node = get_node(pbqp, node_index);
92         assert(node);
93
94         return node->solution;
95 }
96
97 num get_solution(pbqp *pbqp)
98 {
99         return pbqp->solution;
100 }
101
102 void set_dumpfile(pbqp *pbqp, FILE *f)
103 {
104         assert(pbqp);
105         pbqp->dump_file = f;
106 }