/* addLoop: * Add two temporary nodes to sgraph corresponding to two ends of a loop at cell cp, i * represented by dp and sp. */ static void addLoop (sgraph* sg, cell* cp, snode* dp, snode* sp) { int i; int onTop; pointf midp = midPt (cp); for (i = 0; i < cp->nsides; i++) { cell* ocp; pointf p; double wt; snode* onp = cp->sides[i]; if (onp->isVert) continue; if (onp->cells[0] == cp) { onTop = 1; ocp = onp->cells[1]; } else { onTop = 0; ocp = onp->cells[0]; } p = sidePt (onp, ocp); wt = abs(p.x - midp.x) + abs(p.y - midp.y); if (onTop) createSEdge (sg, sp, onp, 0); /* FIX weight */ else createSEdge (sg, dp, onp, 0); /* FIX weight */ } sg->nnodes += 2; }
/* addNodeEdges: * Add temporary node to sgraph corresponding to cell cp, represented * by np. */ static void addNodeEdges (sgraph* sg, cell* cp, snode* np) { int i; pointf midp = midPt (cp); for (i = 0; i < cp->nsides; i++) { snode* onp = cp->sides[i]; cell* ocp; pointf p; double wt; if (onp->cells[0] == cp) ocp = onp->cells[1]; else ocp = onp->cells[0]; p = sidePt (onp, ocp); wt = abs(p.x - midp.x) + abs(p.y - midp.y); createSEdge (sg, np, onp, 0); /* FIX weight */ } sg->nnodes++; #ifdef DEBUG np->cells[0] = np->cells[1] = cp; #endif }
static void createSEdges (cell* cp, sgraph* g) { boxf bb = cp->bb; double hwt = delta*(bb.UR.x-bb.LL.x); double vwt = delta*(bb.UR.y-bb.LL.y); double wt = (hwt + vwt)/2.0 + mu; /* We automatically make small channels have high cost to guide routes to * more spacious channels. */ if (IS_SMALL(bb.UR.y-bb.LL.y) && !IsSmallV(cp)) { hwt = BIG; wt = BIG; } if (IS_SMALL(bb.UR.x-bb.LL.x) && !IsSmallH(cp)) { vwt = BIG; wt = BIG; } if (cp->sides[M_LEFT] && cp->sides[M_TOP]) cp->edges[cp->nedges++] = createSEdge (g, cp->sides[M_LEFT], cp->sides[M_TOP], wt); if (cp->sides[M_TOP] && cp->sides[M_RIGHT]) cp->edges[cp->nedges++] = createSEdge (g, cp->sides[M_TOP], cp->sides[M_RIGHT], wt); if (cp->sides[M_LEFT] && cp->sides[M_BOTTOM]) cp->edges[cp->nedges++] = createSEdge (g, cp->sides[M_LEFT], cp->sides[M_BOTTOM], wt); if (cp->sides[M_BOTTOM] && cp->sides[M_RIGHT]) cp->edges[cp->nedges++] = createSEdge (g, cp->sides[M_BOTTOM], cp->sides[M_RIGHT], wt); if (cp->sides[M_TOP] && cp->sides[M_BOTTOM]) cp->edges[cp->nedges++] = createSEdge (g, cp->sides[M_TOP], cp->sides[M_BOTTOM], vwt); if (cp->sides[M_LEFT] && cp->sides[M_RIGHT]) cp->edges[cp->nedges++] = createSEdge (g, cp->sides[M_LEFT], cp->sides[M_RIGHT], hwt); }