Index: trunk/src/plugins/rt_topo/crbs.c =================================================================== --- trunk/src/plugins/rt_topo/crbs.c (revision 1319) +++ trunk/src/plugins/rt_topo/crbs.c (revision 1320) @@ -44,6 +44,7 @@ crbs_2net_t *ctn = tn->user_data, *coll_ctn = coll_tn->user_data; printf("\n(COLLISION %s %s)\n", ctn->tn->net->hdr.oid, coll_ctn->tn->net->hdr.oid); + htpi_set(&crbs->coll_nets, coll_ctn, 1); } @@ -67,6 +68,7 @@ crbs->grbs.coll_report_cb = crbs_coll_report_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)) { @@ -91,10 +93,12 @@ 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 1319) +++ trunk/src/plugins/rt_topo/crbs.h (revision 1320) @@ -6,6 +6,7 @@ #include #include #include +#include #include <../libgrbs/grbs.h> #include "../libgrbs/addr_hash.h" @@ -26,6 +27,7 @@ point_t *cstart, *cend; rt_topo_2net_t *tn; gdl_elem_t link; + unsigned int ripped_up; /* how many times this net got ripped up */ } crbs_2net_t; typedef struct crbs_point_s { @@ -47,6 +49,7 @@ 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 *) */ } crbs_t; int rt_topo_crbs(rtrnd_t *ctx, rt_topo_laa2rbs_t *src); Index: trunk/src/plugins/rt_topo/crbs_route.c =================================================================== --- trunk/src/plugins/rt_topo/crbs_route.c (revision 1319) +++ trunk/src/plugins/rt_topo/crbs_route.c (revision 1320) @@ -421,10 +421,20 @@ err: usrch_a_star_uninit(&ast); -/* crbs->routing_net = NULL;*/ + crbs->routing_tn = NULL; return res; } +static void on_fail_ripup(crbs_t *crbs, crbs_2net_t *tn) +{ + htpi_entry_t *e; + 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); + } +} + static int rt_topo_crbs_layer_(rtrnd_t *ctx, crbs_t *crbs, rtrnd_layer_t *ly, long attempt, rtrnd_layer_t *ly_cdt, rtrnd_layer_t *ly_bnk) { rtrnd_layer_t ly_neighb = {0}, ly_route = {0}; @@ -443,7 +453,7 @@ for(ttn = gdl_first(&crbs->twonets); ttn != NULL; ttn = gdl_next(&crbs->twonets, ttn)) { printf("CRBS route net %s:\n", ttn->tn->net->hdr.oid); if (rt_topo_crbs_route_net(crbs, ttn) != 0) { -/* reorder(crbs, ttn, crbs->collision); -> rather ripup */ + on_fail_ripup(crbs, ttn); res = 1; break; }