From 6492061480bf7c85897c8d6716061991bd9796a5 Mon Sep 17 00:00:00 2001 From: Tim Edwards Date: Thu, 15 Mar 2018 10:51:07 -0400 Subject: [PATCH] Corrected two errors in the DRC checking, one of which passed a much larger area than necessary to the interaction check, and the other which failed to scale the tech halo distance down after scaling all the rules. Both of these led to huge areas of a layout being unnecessarily checked when even a tiny part of the layout was modified. Corrected behavior matches expectations for interactive DRC response. --- drc/DRCbasic.c | 2 +- drc/DRCcontin.c | 8 ++++---- drc/DRCmain.c | 4 ++-- drc/DRCsubcell.c | 19 +++++++++---------- drc/DRCtech.c | 4 ++++ 5 files changed, 20 insertions(+), 17 deletions(-) diff --git a/drc/DRCbasic.c b/drc/DRCbasic.c index 97448766..7ceca8d2 100644 --- a/drc/DRCbasic.c +++ b/drc/DRCbasic.c @@ -281,7 +281,7 @@ areaCheck(tile, arg) * Side effects: * Calls function for each design-rule violation in celldef * that is triggered by an edge in rect and whose violation - * area falls withing clipRect. This routine makes a flat check: + * area falls within clipRect. This routine makes a flat check: * it considers only information in the paint planes of celldef, * and does not expand children. Function should have the form: * void diff --git a/drc/DRCcontin.c b/drc/DRCcontin.c index 6365db7a..000050a7 100644 --- a/drc/DRCcontin.c +++ b/drc/DRCcontin.c @@ -481,7 +481,7 @@ DRCContinuous() */ while ((DRCPendingRoot != (DRCPendingCookie *)NULL) && DBSrPaintArea ((Tile *) NULL, - DRCPendingRoot->dpc_def->cd_planes [PL_DRC_CHECK], + DRCPendingRoot->dpc_def->cd_planes[PL_DRC_CHECK], &TiPlaneRect, &DBAllButSpaceBits, drcCheckTile, (ClientData) NULL)) { /* check for new user command (without blocking) */ @@ -664,7 +664,7 @@ drcCheckTile(tile, arg) */ /* DRCBasicCheck (celldef, &checkbox, &erasebox, drcPaintError, - (ClientData) drcTempPlane); */ + (ClientData) drcTempPlane); */ /* Check #2: check interactions between paint and subcells, and * also between subcells and other subcells. If any part of a @@ -675,8 +675,8 @@ drcCheckTile(tile, arg) */ DRCErrorType = TT_ERROR_S; - (void) DRCInteractionCheck(celldef, &square, &erasebox, - drcPaintError, (ClientData) drcTempPlane); + (void) DRCInteractionCheck(celldef, &erasebox, drcPaintError, + (ClientData) drcTempPlane); /* Check #3: check for array formation errors in the area. */ diff --git a/drc/DRCmain.c b/drc/DRCmain.c index a9c879f0..ed119de7 100644 --- a/drc/DRCmain.c +++ b/drc/DRCmain.c @@ -530,7 +530,7 @@ drcWhyFunc(scx, cdarg) /* Check paint and interactions in this subcell. */ - (void) DRCInteractionCheck(def, &scx->scx_area, &scx->scx_area, + (void) DRCInteractionCheck(def, &scx->scx_area, (dolist) ? drcListError : drcPrintError, (ClientData) scx); (void) DRCArrayCheck(def, &scx->scx_area, @@ -554,7 +554,7 @@ drcWhyAllFunc(scx, cdarg) /* Check paint and interactions in this subcell. */ - (void) DRCInteractionCheck(def, &scx->scx_area, &scx->scx_area, + (void) DRCInteractionCheck(def, &scx->scx_area, drcListallError, (ClientData)scx); (void) DRCArrayCheck(def, &scx->scx_area, drcListallError, (ClientData)scx); diff --git a/drc/DRCsubcell.c b/drc/DRCsubcell.c index f7f8c159..561845ad 100644 --- a/drc/DRCsubcell.c +++ b/drc/DRCsubcell.c @@ -573,9 +573,8 @@ drcExactOverlapTile(tile, cxp) */ int -DRCInteractionCheck(def, area, erasebox, func, cdarg) +DRCInteractionCheck(def, erasebox, func, cdarg) CellDef *def; /* Definition in which to do check. */ - Rect *area; /* Area in which all errors are to be found. */ Rect *erasebox; /* Smaller area containing DRC check tiles */ void (*func)(); /* Function to call for each error. */ ClientData cdarg; /* Extra info to be passed to func. */ @@ -596,25 +595,25 @@ DRCInteractionCheck(def, area, erasebox, func, cdarg) * square separately. */ - x = (area->r_xbot/DRCStepSize) * DRCStepSize; - if (x > area->r_xbot) x -= DRCStepSize; - y = (area->r_ybot/DRCStepSize) * DRCStepSize; - if (y > area->r_ybot) y -= DRCStepSize; - for (square.r_xbot = x; square.r_xbot < area->r_xtop; + x = (erasebox->r_xbot/DRCStepSize) * DRCStepSize; + if (x > erasebox->r_xbot) x -= DRCStepSize; + y = (erasebox->r_ybot/DRCStepSize) * DRCStepSize; + if (y > erasebox->r_ybot) y -= DRCStepSize; + for (square.r_xbot = x; square.r_xbot < erasebox->r_xtop; square.r_xbot += DRCStepSize) - for (square.r_ybot = y; square.r_ybot < area->r_ytop; + for (square.r_ybot = y; square.r_ybot < erasebox->r_ytop; square.r_ybot += DRCStepSize) { square.r_xtop = square.r_xbot + DRCStepSize; square.r_ytop = square.r_ybot + DRCStepSize; - /* Limit square to area. Otherwise, a huge processing */ + /* Limit square to erasebox. Otherwise, a huge processing */ /* penalty is incurred for finding a single error (e.g., */ /* using "drc find" or "drc why" in a large design with a */ /* large step size. */ cliparea = square; - GeoClip(&cliparea, area); + GeoClip(&cliparea, erasebox); /* Find all the interactions in the square, and clip to the error * area we're interested in. */ diff --git a/drc/DRCtech.c b/drc/DRCtech.c index 034ff029..38798c54 100644 --- a/drc/DRCtech.c +++ b/drc/DRCtech.c @@ -3384,6 +3384,10 @@ drcTechFinalStyle(style) drcScaleUp(style, style->DRCScaleFactorD); drcScaleDown(style, style->DRCScaleFactorN); + /* Scale DRCTechHalo to match */ + DRCTechHalo *= style->DRCScaleFactorD; + DRCTechHalo /= style->DRCScaleFactorN; + /* Set maximum halo */ style->DRCTechHalo = DRCTechHalo;