Index: trunk/src/plugins/rt_topo/laa3_solve.c =================================================================== --- trunk/src/plugins/rt_topo/laa3_solve.c (revision 1475) +++ trunk/src/plugins/rt_topo/laa3_solve.c (revision 1476) @@ -225,7 +225,7 @@ return NULL; } -static int laa3_board_has_via(rtrnd_t *ctx, double x, double y, rtrnd_net_t *net) +static rtrnd_via_t *laa3_board_via_at(rtrnd_t *ctx, double x, double y) { rtrnd_rtree_it_t it; rtrnd_rtree_box_t bbox; @@ -233,7 +233,7 @@ bbox.x1 = x - 0.001; bbox.y1 = y - 0.001; bbox.x2 = x + 0.001; bbox.y2 = y + 0.001; - return (rtrnd_rtree_first(&it, &ctx->board->vias, &bbox) != NULL); + return rtrnd_rtree_first(&it, &ctx->board->vias, &bbox); } static void laa3_check_steiner_via(laa3_t *laa3, vtp0_t *vias, rt_topo_laa_2net_t *tn1, int i1, rt_topo_laa_2net_t *tn2, int i2, double x, double y) @@ -360,9 +360,16 @@ for(bi = 1; bi < tn->br.used; bi++) { if (tn->asg[bi] != tn->asg[bi-1]) { char oid[128]; + rtrnd_via_t *ev; + sprintf(oid, "rt_topo_v_%ld", vias->used); - if (laa3_board_has_via(ctx, tn->br.array[bi].x, tn->br.array[bi].y, net)) - continue; + ev = laa3_board_via_at(ctx, tn->br.array[bi].x, tn->br.array[bi].y); + if (ev != NULL) { + if (ev->hdr.net == net) + continue; /* we already have a via at the right place */ + /* via, but wrong net; go on placing a new one (on the same spot, + the solver will move it away due to collision) */ + } via = laa3_find_via(laa3, vias, tn->br.array[bi].x, tn->br.array[bi].y, net); printf(" VIA at %f;%f: %p\n", tn->br.array[bi].x, tn->br.array[bi].y, via); if (via == NULL) {