Corrected an error in the the extSubtreeFunc() routine, that is

supposed to pull "sticky labels" into the cumulative flattened
layout.  Because it failed to check for the "sticky" flag, it
would copy all labels, causing extraction time to go exponential
as the number of labels in the design increases.  Based on this
correction, the extHierConnectFunc1() routine should be able to
be optimized by stopping the search for sticky labels on the first
non-sticky label, since extSubtreeFunc() ensures that all sticky
labels come first in the label list.
This commit is contained in:
Tim Edwards 2020-07-18 15:49:20 -04:00
parent 1a774e92d1
commit d755e4400a
3 changed files with 9 additions and 2 deletions

View File

@ -1 +1 @@
8.3.35 8.3.36

View File

@ -291,7 +291,12 @@ extHierConnectFunc1(oneTile, ha)
// node only describes a single point. // node only describes a single point.
for (lab = cumDef->cd_labels; lab; lab = lab->lab_next) for (lab = cumDef->cd_labels; lab; lab = lab->lab_next)
if (GEO_TOUCH(&r, &lab->lab_rect) && (lab->lab_flags & LABEL_STICKY))
// All sticky labels are at the front of the list in cumDef, so
// stop when we see the first non-sticky label.
if (!(lab->lab_flags & LABEL_STICKY)) break;
if (GEO_TOUCH(&r, &lab->lab_rect))
if (TTMaskHasType(connected, lab->lab_type)) if (TTMaskHasType(connected, lab->lab_type))
{ {
HashTable *table = &ha->ha_connHash; HashTable *table = &ha->ha_connHash;

View File

@ -766,6 +766,8 @@ extSubtreeFunc(scx, ha)
for (lab = cumDef->cd_labels; lab ; lab = lab->lab_next) for (lab = cumDef->cd_labels; lab ; lab = lab->lab_next)
{ {
if (!(lab->lab_flags & LABEL_STICKY)) continue;
n = sizeof (Label) + strlen(lab->lab_text) n = sizeof (Label) + strlen(lab->lab_text)
- sizeof lab->lab_text + 1; - sizeof lab->lab_text + 1;