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:
parent
2a4baa82c3
commit
4b0652ecc9
|
|
@ -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.
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue