Corrected what seems to be a long-standing error in which

DRCCheckThis() is called in order of top to bottom of the hierarchy
when called from drcCheckFunc() although it was changed to order
DRCPendingRoot from bottom to top.  drcCheckFunc() then does it
backwards.  Fixing this appears to have resolved some weird errors
with DRC errors not showing up when doing "drc check" (initially)
and DRC errors disappearing when making changes to a generated
cell.  Appears to be okay now.
This commit is contained in:
R. Timothy Edwards 2025-10-22 17:27:00 -04:00
parent 4d2912a406
commit 42aa06f8f5
3 changed files with 7 additions and 7 deletions

View File

@ -1 +1 @@
8.3.566 8.3.567

View File

@ -203,13 +203,12 @@ DRCCheckThis (celldef, operation, area)
/* Insert celldef into list of Defs waiting to be checked, unless */ /* Insert celldef into list of Defs waiting to be checked, unless */
/* it is already there. */ /* it is already there. */
#if (0)
/* The switch to copying up DRC errors from non-interacting */ /* The switch to copying up DRC errors from non-interacting */
/* child cells means that the child cells must be processed */ /* child cells means that the child cells must be processed */
/* first. So this routine changes from prepending the cell */ /* first. So this routine changes from prepending the cell */
/* to the list to appending it. */ /* to the list to appending it. */
#if (0)
pback = &DRCPendingRoot; pback = &DRCPendingRoot;
p = DRCPendingRoot; p = DRCPendingRoot;
@ -230,8 +229,8 @@ DRCCheckThis (celldef, operation, area)
} }
p->dpc_next = DRCPendingRoot; p->dpc_next = DRCPendingRoot;
DRCPendingRoot = p; DRCPendingRoot = p;
#endif #endif
/* Append new cell to check to the pending list */ /* Append new cell to check to the pending list */
if (DRCPendingRoot == NULL) if (DRCPendingRoot == NULL)
{ {

View File

@ -737,11 +737,12 @@ drcCheckFunc(scx, cdarg)
DBStdPaintTbl(TT_CHECKPAINT, PL_DRC_CHECK), DBStdPaintTbl(TT_CHECKPAINT, PL_DRC_CHECK),
(PaintUndoInfo *) NULL); (PaintUndoInfo *) NULL);
DRCCheckThis(def, TT_CHECKPAINT, (Rect *) NULL); /* Search children and apply recursively */
/* Search children */
(void) DBCellSrArea(scx, drcCheckFunc, (ClientData) NULL); (void) DBCellSrArea(scx, drcCheckFunc, (ClientData) NULL);
/* Then do self */
DRCCheckThis(def, TT_CHECKPAINT, (Rect *) NULL);
/* As a special performance hack, if the complete cell area is /* As a special performance hack, if the complete cell area is
* handled here, don't bother to look at any more array elements. * handled here, don't bother to look at any more array elements.
*/ */