Index: trunk/src/plugins/rt_topo/crbs_cdt.c =================================================================== --- trunk/src/plugins/rt_topo/crbs_cdt.c (revision 1356) +++ trunk/src/plugins/rt_topo/crbs_cdt.c (revision 1357) @@ -74,7 +74,36 @@ } } + if (crbs->enable_mid_virt) { + vtd0_t np = {0}; + double minlen2 = (rt_topo_cfg.wire_thick + rt_topo_cfg.wire_clr/2) * 4; /* minimum length of an edge to split */ + minlen2 = minlen2 * minlen2; + + for(n = 0; n < cdt->edges.used; n++) { + double len; + edge_t *e = cdt->edges.array[n]; + double dx, dy, len2; + + if (e->is_constrained) + continue; + + dx = e->endp[0]->pos.x - e->endp[1]->pos.x; + dy = e->endp[0]->pos.y - e->endp[1]->pos.y; + len2 = dx*dx + dy*dy; + if (len2 > minlen2) { + vtd0_append(&np, (e->endp[0]->pos.x + e->endp[1]->pos.x)/2); + vtd0_append(&np, (e->endp[0]->pos.y + e->endp[1]->pos.y)/2); + } + e->is_constrained = 1; + } + for(n = 0; n < np.used; n+=2) { + cdt_insert_point(&crbs->cdt, np.array[n], np.array[n+1]); +/* crbs_make_point(crbs, np.array[n], np.array[n+1], 0, 0, NULL);*/ + } + vtd0_uninit(&np); + } + for(n = 0; n < cdt->edges.used; n++) { edge_t *e = cdt->edges.array[n]; #warning TODO: use libualloc here Index: trunk/src/plugins/rt_topo/crbs_route.c =================================================================== --- trunk/src/plugins/rt_topo/crbs_route.c (revision 1356) +++ trunk/src/plugins/rt_topo/crbs_route.c (revision 1357) @@ -617,8 +617,9 @@ int res, tries; memset(&crbs, 0, sizeof(crbs_t)); + crbs.disable_concave = 1; + crbs.enable_mid_virt = 1; rt_topo_crbs_cdt_init(ctx, ly, &crbs); - crbs.disable_concave = 1; crbs_init(&crbs, ctx); rtrnd_layer_init(&ly_cdt, "laa");