Skip to content

Commit efccdbf

Browse files
Made some changes to the extresist code to handle the case where
a transistor's first tile record is a well or substrate type; normally this is avoided, but if that's the only device terminal that connects to the node, it will be used. Also changed the code to not report a failure when space is found under the device, when space is allowed as a substrate type. Instead it will print a message that the substrate is not being extracted as a resistive network. However, note that the correct solution is to do what the regular "extract" code does, which is to paint the substrate type in the cell area first, so that there are valid tile types to use for extracting the substrate network.
1 parent 3dc5018 commit efccdbf

File tree

3 files changed

+34
-7
lines changed

3 files changed

+34
-7
lines changed

VERSION

+1-1
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
8.3.477
1+
8.3.478

resis/ResMain.c

+28-5
Original file line numberDiff line numberDiff line change
@@ -1055,11 +1055,14 @@ ResExtractNet(node, goodies, cellname)
10551055
* that does not correspond exactly to the layer underneath, include
10561056
* all connecting types.
10571057
*/
1058-
TTMaskZero(&FirstTileMask);
1059-
TTMaskSetMask(&FirstTileMask, &DBConnectTbl[node->type]);
1058+
if (node->type != TT_SPACE)
1059+
{
1060+
TTMaskZero(&FirstTileMask);
1061+
TTMaskSetMask(&FirstTileMask, &DBConnectTbl[node->type]);
10601062

1061-
DBTreeCopyConnect(&scx, &FirstTileMask, 0, ResCopyMask, &TiPlaneRect,
1063+
DBTreeCopyConnect(&scx, &FirstTileMask, 0, ResCopyMask, &TiPlaneRect,
10621064
SEL_DO_LABELS, ResUse);
1065+
}
10631066

10641067
TTMaskZero(&ResSDTypesBitMask);
10651068
TTMaskZero(&ResSubTypesBitMask);
@@ -1651,11 +1654,31 @@ FindStartTile(goodies, SourcePoint)
16511654
if (tp != NULL) return tp;
16521655
}
16531656
}
1657+
1658+
/* Is it possible that the net is the substrate under the device? */
1659+
for (pnum = 0; pnum < DBNumPlanes; pnum++)
1660+
{
1661+
DBSrPaintArea((Tile *)NULL, ResUse->cu_def->cd_planes[pnum],
1662+
&r, &(devptr->exts_deviceSubstrateTypes), ResGetTileFunc, &tp);
1663+
if (tp != NULL) return tp;
1664+
}
16541665
}
16551666

1656-
/* Didn't find a terminal (S/D) type tile anywhere. Flag an error. */
1667+
/* If any device type has TT_SPACE as a substrate type, then don't
1668+
* issue an error; however, not handling the substrate as a
1669+
* resistive network is not a good idea and "extresist" needs to use
1670+
* the method employed by "extract" of drawing a substrate type out
1671+
* to the boundary of each subcell.
1672+
*/
1673+
1674+
for (devptr = ExtCurStyle->exts_device[t1]; devptr; devptr = devptr->exts_next)
1675+
if (TTMaskHasType(&(devptr->exts_deviceSubstrateTypes), TT_SPACE))
1676+
break;
1677+
1678+
/* Didn't find a terminal (S/D or substrate) type tile anywhere. Flag an error. */
16571679

1658-
TxError("Couldn't find a terminal of the device at %d %d\n",
1680+
if (devptr == NULL)
1681+
TxError("Couldn't find a terminal of the device at %d %d\n",
16591682
goodies->rg_devloc->p_x, goodies->rg_devloc->p_y);
16601683
return((Tile *) NULL);
16611684
}

resis/ResRex.c

+5-1
Original file line numberDiff line numberDiff line change
@@ -1206,7 +1206,11 @@ ResCheckSimNodes(celldef, resisdata)
12061206
if (ResExtractNet(node, &gparams, outfile) != 0)
12071207
{
12081208
/* On error, don't output this net, but keep going */
1209-
TxError("Error in extracting node %s\n", node->name);
1209+
if (node->type == TT_SPACE)
1210+
TxPrintf("Note: Substrate node %s not extracted as network.\n",
1211+
node->name);
1212+
else
1213+
TxError("Error in extracting node %s\n", node->name);
12101214
}
12111215
else
12121216
{

0 commit comments

Comments
 (0)