One more change to the extraction method to avoid extracting the

substrate more than once for the same subcell, since the substrate
extraction method scans the entire plane area;  this was making
large standard cell layouts extract very slowly, as every component
cell was causing the substrate search to be repeated.
This commit is contained in:
Tim Edwards
2020-03-13 11:36:42 -04:00
parent 2569a06c1f
commit 2788fd70ab
4 changed files with 39 additions and 0 deletions
+25
View File
@@ -93,6 +93,26 @@ void extSubtreeAdjustInit();
void extSubtreeOutputCoupling();
void extSubtreeHardSearch();
/*
* ----------------------------------------------------------------------------
*
* extClearUseFlags --
*
* Callback function to clear the CU_SUB_EXTRACTED flag from each child
* use of a CellDef.
*
* ----------------------------------------------------------------------------
*/
int
extClearUseFlags(use, clientData)
CellUse *use;
ClientData clientData;
{
use->cu_flags &= ~CU_SUB_EXTRACTED;
return 0;
}
/*
* ----------------------------------------------------------------------------
@@ -292,6 +312,9 @@ done:
/* Output connections and node adjustments */
extOutputConns(&ha.ha_connHash, f);
HashKill(&ha.ha_connHash);
/* Clear the CU_SUB_EXTRACTED flag from all children instances */
DBCellEnum(def, extClearUseFlags, (ClientData)NULL);
}
#ifdef exactinteractions
@@ -800,6 +823,8 @@ extSubtreeFunc(scx, ha)
for (y = use->cu_ylo; y <= use->cu_yhi; y++)
extHierSubstrate(ha, use, x, y);
}
/* Mark substrate as having been extracted for this use. */
use->cu_flags |= CU_SUB_EXTRACTED;
/* Free the cumulative node list we extracted above */
if (ha->ha_cumFlat.et_nodes)