Additional change: The switch to propagating DRC errors up from

the bottom in non-interacting areas means that any change in DRC
to a subcell must be handled before checking DRC in the parent.
Previously the order of checks was reversed, moving parent cells
to the beginning of the check list.  This prevents the error cited
in the previous commit which was showing up as a delayed DRC check
when creating parameterized cells.
This commit is contained in:
Tim Edwards 2020-10-15 20:59:08 -04:00
parent 2a4baa82c3
commit 4b0652ecc9
2 changed files with 34 additions and 4 deletions

View File

@ -208,6 +208,13 @@ 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 */
/* child cells means that the child cells must be processed */
/* first. So this routine changes from prepending the cell */
/* to the list to appending it. */
pback = &DRCPendingRoot; pback = &DRCPendingRoot;
p = DRCPendingRoot; p = DRCPendingRoot;
@ -229,6 +236,33 @@ DRCCheckThis (celldef, operation, area)
p->dpc_next = DRCPendingRoot; p->dpc_next = DRCPendingRoot;
DRCPendingRoot = p; DRCPendingRoot = p;
#endif
/* Append new cell to check to the pending list */
if (DRCPendingRoot == NULL)
{
p = (DRCPendingCookie *) mallocMagic(sizeof (DRCPendingCookie));
p->dpc_def = celldef;
p->dpc_next = NULL;
DRCPendingRoot = p;
}
else
{
DRCPendingCookie *plast;
plast = DRCPendingRoot;
while (plast->dpc_next != NULL)
{
if (plast->dpc_def == celldef) break;
plast = plast->dpc_next;
}
if (plast->dpc_next == NULL)
{
p = (DRCPendingCookie *) mallocMagic(sizeof (DRCPendingCookie));
p->dpc_def = celldef;
p->dpc_next = NULL;
plast->dpc_next = p;
}
}
/* Mark the area in this celldef (but don't worry about this stuff /* Mark the area in this celldef (but don't worry about this stuff
* for undo purposes). Also, it's important to disable interrupts * for undo purposes). Also, it's important to disable interrupts
* in here, or the paint operation could get aborted underneath us. * in here, or the paint operation could get aborted underneath us.

View File

@ -363,8 +363,6 @@ proc magic::gencell_change {instname gencell_type library parameters} {
eval "box values $savebox" eval "box values $savebox"
snap $snaptype snap $snaptype
resumeall resumeall
puts stdout "Done."
drc check
redraw redraw
} }
@ -474,8 +472,6 @@ proc magic::gencell_create {gencell_type library parameters} {
snap $snaptype snap $snaptype
resumeall resumeall
redraw redraw
puts stdout "Done."
drc check
return $instname return $instname
} }