X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=pbqp_edge.c;h=610b53c0c6f3b9209f18d5fc1a2025e5fb3c5bfb;hb=fe4449bb019217bdc353e3a78e78b8849ee52690;hp=6218306f2858fc9d4772e2e71cb6ee6ccf3ce07b;hpb=1ea0aa5252ce08621d0859f9310761accde922ea;p=libfirm diff --git a/pbqp_edge.c b/pbqp_edge.c index 6218306f2..610b53c0c 100644 --- a/pbqp_edge.c +++ b/pbqp_edge.c @@ -1,3 +1,4 @@ +#include "adt/array.h" #include "assert.h" #include "kaps.h" @@ -8,10 +9,16 @@ #include "pbqp_node_t.h" #include "pbqp_t.h" -pbqp_edge *alloc_edge(pbqp *pbqp, int src_index, int tgt_index, matrix *costs) +pbqp_edge *alloc_edge(pbqp *pbqp, int src_index, int tgt_index, pbqp_matrix *costs) { + int transpose = 0; + if (tgt_index < src_index) { - return alloc_edge(pbqp, tgt_index, src_index, costs); + int tmp = src_index; + src_index = tgt_index; + tgt_index = tmp; + + transpose = 1; } pbqp_edge *edge = obstack_alloc(&pbqp->obstack, sizeof(*edge)); @@ -19,15 +26,41 @@ pbqp_edge *alloc_edge(pbqp *pbqp, int src_index, int tgt_index, matrix *costs) pbqp_node *src_node = get_node(pbqp, src_index); assert(src_node); - edge->src = src_node; pbqp_node *tgt_node = get_node(pbqp, tgt_index); assert(tgt_node); - edge->tgt = tgt_node; - edge->costs = matrix_copy(pbqp, costs); + if (transpose) { + edge->costs = pbqp_matrix_copy_and_transpose(pbqp, costs); + } else { + edge->costs = pbqp_matrix_copy(pbqp, costs); + } - // TODO: connect edge with nodes + /* + * Connect edge with incident nodes. Since the edge is allocated, we know + * that it don't appear in the edge lists of the nodes. + */ + ARR_APP1(pbqp_edge *, src_node->edges, edge); + edge->src = src_node; + ARR_APP1(pbqp_edge *, tgt_node->edges, edge); + edge->tgt = tgt_node; + edge->bucket_index = UINT_MAX; return edge; } + +void delete_edge(pbqp_edge *edge) +{ + pbqp_node *src_node; + pbqp_node *tgt_node; + + assert(edge); + + src_node = edge->src; + tgt_node = edge->tgt; + assert(src_node); + assert(tgt_node); + + disconnect_edge(src_node, edge); + disconnect_edge(tgt_node, edge); +}