2 * This file is part of libFirm.
3 * Copyright (C) 2012 University of Karlsruhe.
10 * @author Sebastian Buchwald
14 #include "adt/array.h"
20 #include "pbqp_edge.h"
21 #include "pbqp_edge_t.h"
22 #include "pbqp_node.h"
23 #include "pbqp_node_t.h"
26 pbqp_edge_t *alloc_edge(pbqp_t *pbqp, int src_index, int tgt_index,
30 pbqp_edge_t *edge = OALLOC(&pbqp->obstack, pbqp_edge_t);
31 pbqp_node_t *src_node;
32 pbqp_node_t *tgt_node;
34 if (tgt_index < src_index) {
36 src_index = tgt_index;
42 src_node = get_node(pbqp, src_index);
44 tgt_node = get_node(pbqp, tgt_index);
47 edge->costs = pbqp_matrix_copy_and_transpose(pbqp, costs);
49 edge->costs = pbqp_matrix_copy(pbqp, costs);
53 * Connect edge with incident nodes. Since the edge is allocated, we know
54 * that it don't appear in the edge lists of the nodes.
56 ARR_APP1(pbqp_edge_t *, src_node->edges, edge);
58 ARR_APP1(pbqp_edge_t *, tgt_node->edges, edge);
60 edge->bucket_index = UINT_MAX;
65 void delete_edge(pbqp_edge_t *edge)
67 pbqp_node_t *src_node;
68 pbqp_node_t *tgt_node;
73 disconnect_edge(src_node, edge);
74 disconnect_edge(tgt_node, edge);
79 reorder_node_after_edge_deletion(src_node);
80 reorder_node_after_edge_deletion(tgt_node);
83 unsigned is_deleted(pbqp_edge_t *edge)
87 deleted = (edge->src == NULL) && (edge-> tgt == NULL);
92 pbqp_edge_t *pbqp_edge_deep_copy(pbqp_t *pbqp, pbqp_edge_t *edge,
93 pbqp_node_t *src_node, pbqp_node_t *tgt_node)
95 pbqp_edge_t *copy = OALLOC(&pbqp->obstack, pbqp_edge_t);
99 copy->costs = pbqp_matrix_copy(pbqp, edge->costs);
101 /* Connect edge with incident nodes. */
102 copy->src = src_node;
103 copy->tgt = tgt_node;
104 copy->bucket_index = UINT_MAX;