Found what I think is the last major issue in extresist, which is

that the check for the "starting device" was not checking if a
terminal was substrate, and so was treating it as a terminal,
which would cause the extraction starting point to be set on the
wrong plane, along with probably other unwanted behavior.
Ignoring substrate terminals when checking for current drivers
solved the problem.  Also:  Removed some code that had been
reworked but was still sitting in an "#ifdef 0" block.
This commit is contained in:
R. Timothy Edwards 2026-06-07 12:35:45 -04:00
parent 14afb4bd52
commit e2673e4e36
4 changed files with 9 additions and 79 deletions

View File

@ -1 +1 @@
8.3.659
8.3.660

View File

@ -488,83 +488,6 @@ ResEachTile(tile, devNodeTable)
HashSetValue(he, (char *)NULL); /* Done with hash record */
}
#if 0
/* Deprecated: Searching through all devices for all tiles is
* irresponsibly slow. Do not do this.
*/
if (TTMaskHasType(&ResTermTypesBitMask, t1))
{
Rect r;
int pNum;
TileTypeBitMask devMask;
TileAndTerm tat;
ResDevTile *devtile;
ExtDevice *devptr;
TiToRect(tile, &r);
for (devtile = devTiles; devtile; devtile = devtile->nextDev)
{
Tile *tp;
TileType devtype = devtile->type;
devptr = devtile->devptr;
for (i = 0; i < devptr->exts_deviceSDCount; i++)
{
if (TTMaskHasType(&devptr->exts_deviceSDTypes[i], t1))
{
if (GEO_OVERLAP(&devtile->area, &r))
{
Plane *plane = ResUse->cu_def->cd_planes[DBPlane(devtype)];
xj = (r.r_xtop + r.r_xbot) / 2;
yj = (r.r_ytop + r.r_ybot) / 2;
tp = PlaneGetHint(plane);
GOTOPOINT(tp, &devtile->area.r_ll);
PlaneSetHint(plane, tp);
ResNewTermDevice(tile, tp, i, xj, yj, OTHERPLANE, &ResNodeQueue);
}
}
}
}
}
/* Check for substrate under device */
if (TTMaskHasType(&ResSubTypesBitMask, t1))
{
Rect r;
int pNum;
TileTypeBitMask devMask;
ResDevTile *devtile;
ExtDevice *devptr;
TiToRect(tile, &r);
for (devtile = devTiles; devtile; devtile = devtile->nextDev)
{
Tile *tp;
TileType devtype = devtile->type;
devptr = devtile->devptr;
if (TTMaskHasType(&devptr->exts_deviceSubstrateTypes, t1))
{
if (GEO_OVERLAP(&devtile->area, &r))
{
Plane *plane = ResUse->cu_def->cd_planes[DBPlane(devtype)];
xj = (r.r_xtop + r.r_xbot) / 2;
yj = (r.r_ytop + r.r_ybot) / 2;
tp = PlaneGetHint(plane);
GOTOPOINT(tp, &devtile->area.r_ll);
PlaneSetHint(plane, tp);
ResNewSubDevice(tile, tp, xj, yj, OTHERPLANE, &ResNodeQueue);
}
}
}
}
#endif /* 0 */
tstructs->ri_status |= RES_TILE_DONE;
resMakePortBreakpoints(tile, &ResNodeQueue);

View File

@ -1472,6 +1472,13 @@ ResExtractNet(node, resisdata, cellname)
resdevList = (resDevTerm *)HashGetValue(he);
while (resdevList)
{
/* Diagnostic */
Tile *tp;
tp = (Tile *)he->h_key.h_ptr;
TxError("Error: %s tile at (%d %d) not visited!\n",
(resdevList->rdt_term < 0) ? "Substrate" : "Terminal",
tp->ti_ll.p_x, tp->ti_ll.p_y);
resdevNext = resdevList->rdt_next;
freeMagic((char *)resdevList);
resdevList = resdevNext;

View File

@ -1142,7 +1142,7 @@ ResProcessNode(
*/
if (ptr->terminal == GATE)
break;
else
else if (ptr->terminal != SUBS)
{
/* Sorting has put all parallel devices together, so
* combine their total W/L