Merge branch 'work' into tomerge

This commit is contained in:
Tim Edwards 2017-10-06 12:47:25 -04:00
commit 8258058aab
5 changed files with 95 additions and 45 deletions

View File

@ -698,7 +698,8 @@ CmdPaint(w, cmd)
SelectClear();
DBWAreaChanged(EditCellUse->cu_def, &editRect, DBW_ALLWINDOWS, &mask);
DBReComputeBbox(EditCellUse->cu_def);
DRCCheckThis (EditCellUse->cu_def, TT_CHECKPAINT, &editRect);
if (DRCBackGround)
DRCCheckThis (EditCellUse->cu_def, TT_CHECKPAINT, &editRect);
}
/*

View File

@ -597,6 +597,14 @@ dbwPaintFunc(tile, cxp)
}
#endif
/* Ignore DRC error tiles in anything but the top-level window */
if (scx->scx_use != (CellUse *)dbwWindow->w_surfaceID)
{
TileType ttype = TiGetType(tile);
if (ttype == TT_ERROR_P || ttype == TT_ERROR_S || ttype == TT_ERROR_PS)
return 0;
}
if (!dbwIsLocked)
{
GrLock(dbwLockW, TRUE);

View File

@ -530,9 +530,6 @@ drcWhyFunc(scx, cdarg)
/* Check paint and interactions in this subcell. */
// (void) DRCBasicCheck(def, &haloArea, &scx->scx_area,
// (dolist) ? drcListError : drcPrintError,
// (ClientData) scx);
(void) DRCInteractionCheck(def, &scx->scx_area, &scx->scx_area,
(dolist) ? drcListError : drcPrintError,
(ClientData) scx);
@ -540,9 +537,8 @@ drcWhyFunc(scx, cdarg)
(dolist) ? drcListError : drcPrintError,
(ClientData) scx);
/* Also search children. */
(void) DBCellSrArea(scx, drcWhyFunc, (ClientData)cdarg);
/* New behavior: Don't search children, instead propagate errors up. */
/* (void) DBCellSrArea(scx, drcWhyFunc, (ClientData)cdarg); */
return 0;
}
@ -563,9 +559,8 @@ drcWhyAllFunc(scx, cdarg)
(void) DRCArrayCheck(def, &scx->scx_area,
drcListallError, (ClientData)scx);
/* Also search children. */
(void) DBCellSrArea(scx, drcWhyAllFunc, (ClientData)cdarg);
/* New behavior: Don't search children, instead propagate errors up. */
/* (void) DBCellSrArea(scx, drcWhyAllFunc, (ClientData)cdarg); */
return 0;
}
@ -637,9 +632,8 @@ drcCheckFunc(scx, cdarg)
DRCCheckThis(def, TT_CHECKPAINT, (Rect *) NULL);
/* Check child cells also. */
(void) DBCellSrArea(scx, drcCheckFunc, (ClientData) NULL);
/* New behavior: Don't search children, instead propagate errors up. */
/* (void) DBCellSrArea(scx, drcCheckFunc, (ClientData) NULL); */
/* As a special performance hack, if the complete cell area is
* handled here, don't bother to look at any more array elements.
@ -753,9 +747,8 @@ drcCountFunc(scx, dupTable)
if ((scx->scx_use->cu_def->cd_flags & CDAVAILABLE) == 0) return 0;
/* Scan children recursively. */
(void) DBCellSrArea(scx, drcCountFunc, (ClientData) dupTable);
/* New behavior: Don't search children, instead propagate errors up. */
/* (void) DBCellSrArea(scx, drcCountFunc, (ClientData) dupTable); */
/* As a special performance hack, if the complete cell area is
* handled here, don't bother to look at any more array elements.
@ -901,8 +894,9 @@ drcFindFunc(scx, finddata)
return 1;
}
/* Recursively search children */
return DBCellSrArea(scx, drcFindFunc, (ClientData)finddata);
/* New behavior: Don't search children, instead propagate errors up. */
/* return DBCellSrArea(scx, drcFindFunc, (ClientData)finddata); */
return 0;
}
int

View File

@ -43,7 +43,7 @@ static char rcsid[] __attribute__ ((unused)) = "$Header: /usr/cvsroot/magic-8.0/
static Rect drcSubIntArea; /* Accumulates area of interactions. */
static CellDef *drcSubDef; /* Cell definition we're checking. */
static int drcSubRadius; /* Interaction radius. */
static CellUse *drcSubCurUse; /* Holds current use when checking to see
static CellTileBody *drcCurSub; /* Holds current tile when checking to see
* if more than one use in an area.
*/
static Rect drcSubLookArea; /* Area where we're looking for interactions */
@ -72,7 +72,7 @@ extern int DRCErrorType;
* drcFindOtherCells --
*
* This is a search function invoked when looking around a given
* cell for interactions. If a cell is found other than drcSubCurUse,
* cell for interactions. If a tile is found other than drcCurSub,
* then it constitutes an interaction, and its area is included
* into the area parameter.
*
@ -92,13 +92,19 @@ drcFindOtherCells(tile, area)
Rect *area; /* Area in which to include interactions. */
{
Rect r;
CellUse *use;
CellTileBody *ctbptr = (CellTileBody *) tile->ti_body;
if (ctbptr == NULL) return 0;
if ((ctbptr->ctb_use != drcSubCurUse) || (ctbptr->ctb_next != NULL))
/* XXX */
/* if (ctbptr == NULL) return 0; */
if (ctbptr == drcCurSub) return 0;
for (ctbptr = (CellTileBody *) TiGetBody(tile); ctbptr != NULL;
ctbptr = ctbptr->ctb_next)
{
TiToRect(tile, &r);
(void) GeoInclude(&r, area);
use = ctbptr->ctb_use;
GeoInclude(&use->cu_bbox, &r);
}
return 0;
}
@ -123,12 +129,14 @@ drcFindOtherCells(tile, area)
*/
int
drcSubcellTileFunc(tile)
drcSubcellTileFunc(tile, propagate)
Tile *tile; /* Subcell tile. */
bool *propagate; /* Errors to propagate up */
{
Rect area, haloArea, intArea;
Rect area, haloArea, intArea, subIntArea, locIntArea;
int i;
CellTileBody *ctbptr = (CellTileBody *) tile->ti_body;
CellUse *subUse;
if (ctbptr == NULL) return 0;
@ -138,9 +146,20 @@ drcSubcellTileFunc(tile)
* we're recomputing errors).
*/
TiToRect(tile, &area);
GEO_EXPAND(&area, drcSubRadius, &haloArea);
GeoClip(&haloArea, &drcSubLookArea);
/* XXX This is not right---the area of the cell plane tile is not */
/* the area of the subcell. */
/* TiToRect(tile, &area); */
for (ctbptr = (CellTileBody *) TiGetBody(tile); ctbptr != NULL;
ctbptr = ctbptr->ctb_next)
{
subUse = ctbptr->ctb_use;
area = subUse->cu_bbox;
GEO_EXPAND(&area, drcSubRadius, &haloArea);
GeoClip(&haloArea, &drcSubLookArea);
}
intArea = GeoNullRect;
for (i = PL_TECHDEPBASE; i < DBNumPlanes; i++)
{
@ -148,7 +167,26 @@ drcSubcellTileFunc(tile)
&haloArea, &DBAllButSpaceBits, drcIncludeArea,
(ClientData) &intArea);
}
drcSubCurUse = ctbptr->ctb_use;
/* DRC error tiles in a subcell are automatically pulled into the */
/* interaction area of the parent. Ultimately this is recursive as */
/* all cells are checked and errors propagate to the top level. */
/* XXX */
for (ctbptr = (CellTileBody *) TiGetBody(tile); ctbptr != NULL;
ctbptr = ctbptr->ctb_next)
{
subUse = ctbptr->ctb_use;
subIntArea = GeoNullRect;
DBSrPaintArea((Tile *) NULL, subUse->cu_def->cd_planes[PL_DRC_ERROR],
&TiPlaneRect, &DBAllButSpaceBits, drcIncludeArea,
(ClientData) &subIntArea);
GeoTransRect(&(subUse->cu_transform), &subIntArea, &locIntArea);
GeoInclude(&locIntArea, &intArea);
if (!GEO_RECTNULL(&subIntArea)) *propagate = TRUE;
}
drcCurSub = ctbptr;
(void) TiSrArea((Tile *) NULL, drcSubDef->cd_planes[PL_CELL],
&haloArea, drcFindOtherCells, (ClientData) &intArea);
if (GEO_RECTNULL(&intArea)) return 0;
@ -277,6 +315,7 @@ DRCFindInteractions(def, area, radius, interaction)
int i;
CellUse *use;
SearchContext scx;
bool propagate;
drcSubDef = def;
drcSubRadius = radius;
@ -291,8 +330,9 @@ DRCFindInteractions(def, area, radius, interaction)
drcSubIntArea = GeoNullRect;
GEO_EXPAND(area, radius, &drcSubLookArea);
propagate = FALSE;
(void) TiSrArea((Tile *) NULL, def->cd_planes[PL_CELL],
&drcSubLookArea, drcSubcellTileFunc, (ClientData) NULL);
&drcSubLookArea, drcSubcellTileFunc, (ClientData)(&propagate));
/* If there seems to be an interaction area, make a second pass
* to make sure there's more than one cell with paint in the
@ -302,21 +342,28 @@ DRCFindInteractions(def, area, radius, interaction)
if (GEO_RECTNULL(&drcSubIntArea)) return FALSE;
use = NULL;
for (i = PL_TECHDEPBASE; i < DBNumPlanes; i++)
/* If errors are being propagated up from child to parent, */
/* then the interaction area is always valid. */
if (propagate == FALSE)
{
if (DBSrPaintArea((Tile *) NULL, def->cd_planes[i],
&drcSubIntArea, &DBAllButSpaceBits, drcAlwaysOne,
(ClientData) NULL) != 0)
for (i = PL_TECHDEPBASE; i < DBNumPlanes; i++)
{
use = (CellUse *) -1;
break;
if (DBSrPaintArea((Tile *) NULL, def->cd_planes[i],
&drcSubIntArea, &DBAllButSpaceBits, drcAlwaysOne,
(ClientData) NULL) != 0)
{
use = (CellUse *) -1;
break;
}
}
scx.scx_use = DRCDummyUse;
scx.scx_trans = GeoIdentityTransform;
scx.scx_area = drcSubIntArea;
if (DBTreeSrCells(&scx, 0, drcSubCheckPaint, (ClientData) &use) == 0)
return FALSE;
}
scx.scx_use = DRCDummyUse;
scx.scx_trans = GeoIdentityTransform;
scx.scx_area = drcSubIntArea;
if (DBTreeSrCells(&scx, 0, drcSubCheckPaint, (ClientData) &use) == 0)
return FALSE;
/* OK, no more excuses, there's really an interaction area here. */

View File

@ -754,7 +754,7 @@ lefWriteMacro(def, f, scale)
if (!TTMaskIsZero(&boundmask))
{
for (pNum = PL_PAINTBASE; pNum < DBNumPlanes; pNum++)
for (pNum = PL_TECHDEPBASE; pNum < DBNumPlanes; pNum++)
DBSrPaintArea((Tile *)NULL, def->cd_planes[pNum],
&TiPlaneRect, &boundmask, lefGetBound,
(ClientData)(&boundary));
@ -922,7 +922,7 @@ lefWriteMacro(def, f, scale)
lc.numWrites = 0;
lc.lastType = TT_SPACE;
for (pNum = PL_PAINTBASE; pNum < DBNumPlanes; pNum++)
for (pNum = PL_TECHDEPBASE; pNum < DBNumPlanes; pNum++)
{
lc.pNum = pNum;
DBSrPaintArea((Tile *)NULL, SelectDef->cd_planes[pNum],
@ -977,7 +977,7 @@ lefWriteMacro(def, f, scale)
/* Restrict to routing planes only */
for (pNum = PL_PAINTBASE; pNum < DBNumPlanes; pNum++)
for (pNum = PL_TECHDEPBASE; pNum < DBNumPlanes; pNum++)
{
lc.pNum = pNum;
DBSrPaintArea((Tile *)NULL, lefFlatDef->cd_planes[pNum],