The "extresist" command was still generating "Couldn't find wire"

messages which was traced to code that changes a drivepoint position
to match a label;  the same drivepoint may be part of the record for
the initial position to search on the net, in which case if the
position is changed, then the tile type needs to be changed to match
the new position.
This commit is contained in:
Tim Edwards 2021-10-11 10:18:27 -04:00
parent bb8f7e6960
commit 34af2f3309
3 changed files with 11 additions and 129 deletions

View File

@ -1 +1 @@
8.3.219
8.3.220

View File

@ -268,8 +268,9 @@ ResMakePortBreakpoints(def)
*----------------------------------------------------------------------------
*/
void
ResMakeLabelBreakpoints(def)
ResMakeLabelBreakpoints(def, goodies)
CellDef *def;
ResGlobalParams *goodies;
{
Plane *plane;
Rect *rect;
@ -284,6 +285,13 @@ ResMakeLabelBreakpoints(def)
entry = HashFind(&ResNodeTable, slab->lab_text);
node = ResInitializeNode(entry);
/* If the drivepoint position changes and the drivepoint is */
/* in the "goodies" record, then make sure the tile type in */
/* "goodies" gets changed to match. */
if (goodies->rg_devloc == &node->drivepoint)
goodies->rg_ttype = slab->lab_type;
node->drivepoint = slab->lab_rect.r_ll;
node->rs_bbox = slab->lab_rect;
node->location = slab->lab_rect.r_ll;
@ -1054,7 +1062,7 @@ ResExtractNet(node, goodies, cellname)
/* Finish preprocessing. */
ResMakePortBreakpoints(ResUse->cu_def);
ResMakeLabelBreakpoints(ResUse->cu_def);
ResMakeLabelBreakpoints(ResUse->cu_def, goodies);
ResFindNewContactTiles(ResContactList);
ResPreProcessDevices(DevTiles, ResDevList, ResUse->cu_def);

View File

@ -1507,130 +1507,6 @@ ResFixDevName(line, type, device, layoutnode)
}
}
#if 0
/*
*-------------------------------------------------------------------------
*
* Deprecated function. Horribly inefficient. See qsort() version below.
* (Not yet implemented; still under test.)
*
*-------------------------------------------------------------------------
*/
void
ResSortByGate(DevpointerList)
devPtr **DevpointerList;
{
int changed = TRUE;
int localchange = TRUE;
devPtr *working, *current;
devPtr *last = NULL, *gatelist = NULL;
/* Split out GATE entries into separate list (gatelist) */
working = *DevpointerList;
while (working != NULL)
{
if (working->terminal == GATE)
{
current = working;
working = working->nextDev;
if (last == NULL)
{
*DevpointerList = working;
}
else
{
last->nextDev = working;
}
current->nextDev = gatelist;
gatelist = current;
}
else
{
last = working;
working = working->nextDev;
}
}
/* Sort the SOURCE and DRAIN list (DevpointerList) */
while (changed == TRUE)
{
changed = localchange = FALSE;
working = *DevpointerList;
last = NULL;
while (working != NULL && (current = working->nextDev) != NULL)
{
RDev *w = working->thisDev;
RDev *c = current->thisDev;
if (w->gate > c->gate)
{
changed = TRUE;
localchange = TRUE;
}
else if (w->gate == c->gate &&
(working->terminal == SOURCE &&
current->terminal == SOURCE &&
w->drain > c->drain ||
working->terminal == SOURCE &&
current->terminal == DRAIN &&
w->drain > c->source ||
working->terminal == DRAIN &&
current->terminal == SOURCE &&
w->source > c->drain ||
working->terminal == DRAIN &&
current->terminal == DRAIN &&
w->source > c->source))
{
changed = TRUE;
localchange = TRUE;
}
else
{
last = working;
working = working->nextDev;
continue;
}
if (localchange)
{
localchange = FALSE;
if (last == NULL)
{
*DevpointerList = current;
}
else
{
last->nextDev = current;
}
working->nextDev = current->nextDev;
current->nextDev = working;
last = current;
}
}
}
/* Add the GATE list back to the end of DevpointerList */
if (working == NULL)
{
*DevpointerList = gatelist;
}
else
{
if (working->nextDev != NULL)
TxError("Bad Device pointer in sort\n");
else
working->nextDev = gatelist;
}
}
#endif /* 0 */
#if 1
/*
*-------------------------------------------------------------------------
*
@ -1730,8 +1606,6 @@ ResSortByGate(DevpointerList)
freeMagic(Devindexed);
}
#endif /* 1 */
/*
*-------------------------------------------------------------------------
*