From ca469510d530dcd330fcee71170f00d057a2b4af Mon Sep 17 00:00:00 2001 From: Tim Edwards Date: Tue, 27 Jun 2023 15:35:57 -0400 Subject: [PATCH] Found that extNodeName() prefers the first name in a region's label list for output, but that the code in ExtRegion.c does not sort a region's label list to keep ports at the beginning of the list. So any net with multiple labels may end up with a non-port label as the name of the node, which eventually becomes the name of the port. A quick fix keeps these lists sorted. --- VERSION | 2 +- extract/ExtRegion.c | 40 ++++++++++++++++++++++++++++++++++++---- 2 files changed, 37 insertions(+), 5 deletions(-) diff --git a/VERSION b/VERSION index 47513574..11e1c8a9 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -8.3.407 +8.3.408 diff --git a/extract/ExtRegion.c b/extract/ExtRegion.c index 65363ca0..47c1447c 100644 --- a/extract/ExtRegion.c +++ b/extract/ExtRegion.c @@ -251,12 +251,28 @@ ExtLabelRegions(def, connTo, nodeList, clipArea) reg = (LabRegion *) extGetRegion(tp); ll = (LabelList *) mallocMagic((unsigned) (sizeof (LabelList))); ll->ll_label = lab; - ll->ll_next = reg->lreg_labels; - reg->lreg_labels = ll; if (lab->lab_flags & PORT_DIR_MASK) ll->ll_attr = LL_PORTATTR; else ll->ll_attr = LL_NOATTR; + + if ((lab->lab_flags & PORT_DIR_MASK) || (reg->lreg_labels == NULL)) + { + ll->ll_next = reg->lreg_labels; + reg->lreg_labels = ll; + } + else + { + LabelList *fport = reg->lreg_labels; + + /* Place *after* any labels with LL_PORTATTR */ + while ((fport->ll_next != NULL) && + (fport->ll_next->ll_attr == LL_PORTATTR)) + fport = fport->ll_next; + + ll->ll_next = fport->ll_next; + fport->ll_next = ll; + } break; } } @@ -399,12 +415,28 @@ ExtLabelOneRegion(def, connTo, reg) { ll = (LabelList *) mallocMagic((unsigned) (sizeof (LabelList))); ll->ll_label = lab; - ll->ll_next = reg->nreg_labels; - reg->nreg_labels = ll; if (lab->lab_flags & PORT_DIR_MASK) ll->ll_attr = LL_PORTATTR; else ll->ll_attr = LL_NOATTR; + + if ((lab->lab_flags & PORT_DIR_MASK) || (reg->nreg_labels == NULL)) + { + ll->ll_next = reg->nreg_labels; + reg->nreg_labels = ll; + } + else + { + LabelList *fport = reg->nreg_labels; + + /* Place *after* any labels with LL_PORTATTR */ + while ((fport->ll_next != NULL) && + (fport->ll_next->ll_attr == LL_PORTATTR)) + fport = fport->ll_next; + + ll->ll_next = fport->ll_next; + fport->ll_next = ll; + } break; } }