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.
This commit is contained in:
Tim Edwards 2023-06-27 15:35:57 -04:00
parent 3ae24e8a8c
commit ca469510d5
2 changed files with 37 additions and 5 deletions

View File

@ -1 +1 @@
8.3.407
8.3.408

View File

@ -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;
}
}