Index: trunk/src/plugins/rt_topo/crbs_cdt.c =================================================================== --- trunk/src/plugins/rt_topo/crbs_cdt.c (revision 1335) +++ trunk/src/plugins/rt_topo/crbs_cdt.c (revision 1336) @@ -102,3 +102,60 @@ } VTPOINT_FOREACH_END(); } + +static edge_t *crbs_cdt_get_edge(point_t *pt1, point_t *pt2) +{ + EDGELIST_FOREACH(e, (pt1->adj_edges)) { + if ((e->endp[0] == pt2) || (e->endp[1] == pt2)) + return e; + } + EDGELIST_FOREACH_END(); + + return NULL; +} + +void rt_topo_crbs_cdt_inc_edge(crbs_t *crbs, grbs_addr_t *a1, grbs_addr_t *a2) +{ + crbs_point_t *pt1, *pt2; + edge_t *cdt_e; + crbs_edge_t *edge; + + if ((a1->type & 0x0F) == ADDR_POINT) + pt1 = a1->obj.pt->user_data; + else + pt1 = a1->obj.arc->parent_pt->user_data; + + if ((a2->type & 0x0F) == ADDR_POINT) + pt2 = a2->obj.pt->user_data; + else + pt2 = a2->obj.arc->parent_pt->user_data; + + cdt_e = crbs_cdt_get_edge(pt1->cpt, pt2->cpt); + + assert(cdt_e != NULL); + edge = cdt_e->data; + edge->nets++; + assert(edge->nets > 0); /* unlikely: overflow */ +} + +void rt_topo_crbs_cdt_dec_edge(crbs_t *crbs, grbs_arc_t *arc1, grbs_arc_t *arc2) +{ + crbs_point_t *pt1 = arc1->parent_pt->user_data, *pt2 = arc1->parent_pt->user_data; + edge_t *cdt_e = crbs_cdt_get_edge(pt1->cpt, pt2->cpt); + crbs_edge_t *edge; + + assert(cdt_e != NULL); + edge = cdt_e->data; + assert(edge->nets > 0); + edge->nets--; +} + + +void rt_topo_crbs_cdt_unref_tn(crbs_t *crbs, grbs_2net_t *tn) +{ + grbs_arc_t *prev = NULL, *a; + for(a = gdl_first(&tn->arcs); a != NULL; prev = a, a = gdl_next(&tn->arcs, a)) { + if (prev != NULL) + rt_topo_crbs_cdt_dec_edge(crbs, prev, a); + } +} Index: trunk/src/plugins/rt_topo/crbs_route.c =================================================================== --- trunk/src/plugins/rt_topo/crbs_route.c (revision 1335) +++ trunk/src/plugins/rt_topo/crbs_route.c (revision 1336) @@ -439,6 +439,8 @@ if (grbs_path_validate(&crbs->grbs, crbs->routing_tn, pa, na, na->user_data) != 0) { abort(); } + if (pa != NULL) + rt_topo_crbs_cdt_inc_edge(crbs, pa, na); } for(na = firsta; na != NULL; na = na->user_data) @@ -489,6 +491,7 @@ /* remove the offending 2net */ best->ripped_up++; + rt_topo_crbs_cdt_unref_tn(crbs, best->gtn); grbs_path_remove_2net(&crbs->grbs, best->gtn); best->gtn = NULL;