Index: trunk/src/plugins/rt_topo/crbs.h =================================================================== --- trunk/src/plugins/rt_topo/crbs.h (revision 1410) +++ trunk/src/plugins/rt_topo/crbs.h (revision 1411) @@ -53,7 +53,8 @@ gdl_list_t twonets; /* of crbs_2net_t */ htad_t addrs; - unsigned disable_concave:1; /* when set to 1, do an all-convex routing */ + unsigned disable_concave:1; /* when set to 1, do an all-convex routing (and possibly virtual-concave) */ + unsigned disable_vconcave:1; /* when set to 1, so not do the virtual-concave optimization */ unsigned enable_mid_virt:1; /* when set to 1, insert a virtual point in between any two real points in the original cdt; this allows convex-only routing to emulate concave in corridors */ /* routing */ Index: trunk/src/plugins/rt_topo/crbs_route.c =================================================================== --- trunk/src/plugins/rt_topo/crbs_route.c (revision 1410) +++ trunk/src/plugins/rt_topo/crbs_route.c (revision 1411) @@ -317,11 +317,17 @@ while(a->grbs_idx < 5) { if (crbs_trace_ast) printf(" try from %s P%ld to P%ld", from_type, curr->pt->uid, pt->gpt->uid); + if (crbs->disable_vconcave) { + if (a->grbs_idx < 3) + a->grbs_idx = 3; + } + if (crbs->disable_concave) { if (a->grbs_idx < 2) a->grbs_idx = 2; } + /* prefer concave over convex; order matters when reaching target: first valid solution will stop the search */ switch(a->grbs_idx) { @@ -663,6 +669,7 @@ int res, tries; memset(&crbs, 0, sizeof(crbs_t)); + crbs.disable_vconcave = 1; crbs.disable_concave = 1; crbs.enable_mid_virt = rt_topo_cfg.mid_virt; crbs_init(&crbs, ctx);