From 4b0652ecc98e1abc4b350f7ee7f520082b82e99c Mon Sep 17 00:00:00 2001 From: Tim Edwards Date: Thu, 15 Oct 2020 20:59:08 -0400 Subject: [PATCH] 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. --- drc/DRCcontin.c | 34 ++++++++++++++++++++++++++++++++++ tcltk/toolkit.tcl | 4 ---- 2 files changed, 34 insertions(+), 4 deletions(-) diff --git a/drc/DRCcontin.c b/drc/DRCcontin.c index 41e97133..a8131361 100644 --- a/drc/DRCcontin.c +++ b/drc/DRCcontin.c @@ -208,6 +208,13 @@ DRCCheckThis (celldef, operation, area) /* Insert celldef into list of Defs waiting to be checked, unless */ /* 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; p = DRCPendingRoot; @@ -229,6 +236,33 @@ DRCCheckThis (celldef, operation, area) p->dpc_next = DRCPendingRoot; 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 * for undo purposes). Also, it's important to disable interrupts * in here, or the paint operation could get aborted underneath us. diff --git a/tcltk/toolkit.tcl b/tcltk/toolkit.tcl index 1ec0778e..75fa12cd 100644 --- a/tcltk/toolkit.tcl +++ b/tcltk/toolkit.tcl @@ -363,8 +363,6 @@ proc magic::gencell_change {instname gencell_type library parameters} { eval "box values $savebox" snap $snaptype resumeall - puts stdout "Done." - drc check redraw } @@ -474,8 +472,6 @@ proc magic::gencell_create {gencell_type library parameters} { snap $snaptype resumeall redraw - puts stdout "Done." - drc check return $instname }