Index: trunk/src/plugins/rt_topo/crbs.c =================================================================== --- trunk/src/plugins/rt_topo/crbs.c (revision 1339) +++ trunk/src/plugins/rt_topo/crbs.c (revision 1340) @@ -38,7 +38,7 @@ #include "crbs.h" -static crbs_2net_t tn_unknown; +grbs_2net_t tn_unknown; static void crbs_coll_report_cb(grbs_t *grbs, grbs_2net_t *tn, grbs_2net_t *coll_tn, grbs_arc_t *coll_arc) { @@ -47,7 +47,7 @@ /* crbs_2net_t *ctn = tn->user_data;*/ if (coll_ctn != &tn_unknown) - htpi_set(&crbs->coll_nets, coll_ctn, 1); + coll_ctn->coll = 1; } static grbs_2net_t *crbs_coll_check_arc_cb(grbs_t *grbs, grbs_2net_t *tn, grbs_arc_t *arc) @@ -57,7 +57,16 @@ EDGELIST_FOREACH(edge, (pt->cpt->adj_edges)) { crbs_edge_t *e = edge->data; if (e->nets > 0) { -#warning TODO: check if edge is crossed + double ang; + if (edge->endp[0] == pt->cpt) + ang = e->ang[0]; + else if (edge->endp[1] == pt->cpt) + ang = e->ang[1]; + else + abort(); + + if (grbs_angle_in_arc(arc->new_sa, arc->new_da, ang, 1)) + return &tn_unknown; } } EDGELIST_FOREACH_END(); @@ -85,7 +94,6 @@ crbs->grbs.coll_check_arc = crbs_coll_check_arc_cb; crbs->grbs.user_data = crbs; htad_init(&crbs->addrs, htad_hash, grbs_addr_hash_keyeq); - htpi_init(&crbs->coll_nets, ptrhash, ptrkeyeq); for(via = rtrnd_rtree_all_first(&it, &ctx->board->vias); via != NULL; via = rtrnd_rtree_all_next(&it)) { @@ -110,12 +118,10 @@ static void crbs_clean(crbs_t *crbs) { - htpi_clear(&crbs->coll_nets); } static void crbs_uninit(crbs_t *crbs) { - htpi_uninit(&crbs->coll_nets); } Index: trunk/src/plugins/rt_topo/crbs.h =================================================================== --- trunk/src/plugins/rt_topo/crbs.h (revision 1339) +++ trunk/src/plugins/rt_topo/crbs.h (revision 1340) @@ -6,7 +6,6 @@ #include #include #include -#include #include #include @@ -28,6 +27,7 @@ rt_topo_2net_t *tn; grbs_2net_t *gtn; unsigned int ripped_up; /* how many times this net got ripped up */ + unsigned coll:1; /* collided with current routing effort */ gdl_elem_t link; } crbs_2net_t; @@ -39,6 +39,8 @@ typedef struct crbs_edge_s { long nets; + double ang[2]; /* outgoing edge angle, indexed by endp[] */ + edge_t *edge; } crbs_edge_t; typedef struct { @@ -53,12 +55,14 @@ grbs_detached_addr_t *target; /* the address we are trying to reach */ void *first_mark, *target_mark; grbs_2net_t *routing_tn; - htpi_t coll_nets; /* nets routing_tn has collided with; indexed with (crbs_2net_t *) */ int max_ripup; /* how many times are we willing to rip up a 2net (total within a layer routing) */ } crbs_t; int rt_topo_crbs(rtrnd_t *ctx, rt_topo_laa2rbs_t *src); +/* When a collision happens but the 2net is not known */ +extern grbs_2net_t tn_unknown; + #define DIST_HEUR_MULT 1000.0 #endif Index: trunk/src/plugins/rt_topo/crbs_cdt.c =================================================================== --- trunk/src/plugins/rt_topo/crbs_cdt.c (revision 1339) +++ trunk/src/plugins/rt_topo/crbs_cdt.c (revision 1340) @@ -80,8 +80,10 @@ #warning TODO: use libualloc here crbs_edge_t *ce = malloc(sizeof(crbs_edge_t)); e->data = ce; - - memset(ce, 0, sizeof(ce)); + memset(ce, 0, sizeof(crbs_edge_t)); + ce->ang[0] = atan2(e->endp[1]->pos.y - e->endp[0]->pos.y, e->endp[1]->pos.x - e->endp[0]->pos.x); + ce->ang[1] = atan2(e->endp[0]->pos.y - e->endp[1]->pos.y, e->endp[0]->pos.x - e->endp[1]->pos.x); + ce->edge = e; } } Index: trunk/src/plugins/rt_topo/crbs_route.c =================================================================== --- trunk/src/plugins/rt_topo/crbs_route.c (revision 1339) +++ trunk/src/plugins/rt_topo/crbs_route.c (revision 1340) @@ -356,9 +356,15 @@ usrch_a_star_node_t *it; grbs_detached_addr_t addr_tmp[2]; grbs_detached_addr_t *first, *da, *prev; - grbs_addr_t *na, *pa, *firsta, *lasta; + grbs_addr_t *na, *pa, *firsta, *lasta; + crbs_2net_t *tn; int res = -1; + + /* reset net collisions */ + for(tn = gdl_first(&crbs->twonets); tn != NULL; tn = gdl_next(&crbs->twonets, tn)) + tn->coll = 0; + ast.heuristic = crbs_ast_heuristic; ast.cost = crbs_ast_cost; ast.neighbor_pre = crbs_ast_neighbor_pre; @@ -464,19 +470,19 @@ /* Returns 1 if ripped up something */ static int on_fail_ripup(crbs_t *crbs, crbs_2net_t *tn) { - htpi_entry_t *e; int best_r = crbs->max_ripup; - crbs_2net_t *best = NULL; + crbs_2net_t *ctn, *best = NULL; char tmp[128]; printf(" Failed to route; checking what to rip up:\n"); - for(e = htpi_first(&crbs->coll_nets); e != NULL; e = htpi_next(&crbs->coll_nets, e)) { - crbs_2net_t *ctn = e->key; - printf(" %s (%d)\n", ctn->tn->net->hdr.oid, ctn->ripped_up); - if (ctn->ripped_up < best_r) { - best_r = ctn->ripped_up; - best = ctn; + for(ctn = gdl_first(&crbs->twonets); ctn != NULL; ctn = gdl_next(&crbs->twonets, ctn)) { + if (ctn->coll) { + printf(" %s (%d)\n", ctn->tn->net->hdr.oid, ctn->ripped_up); + if (ctn->ripped_up < best_r) { + best_r = ctn->ripped_up; + best = ctn; + } } }