Corrected an error in search for substrate under a device. If
"space" is considered part of the substrate, then the check for planes to search should exclude "space" from the type mask first. Otherwise, all planes get searched, not just the substrate. Also: The same routine can falsely flag a device terminal as substrate if a split tile is marked as the device's region. This was also fixed.
This commit is contained in:
parent
bf7f1ab39e
commit
a33d7b78b5
|
|
@ -2480,8 +2480,15 @@ extOutputDevices(def, transList, outFile)
|
||||||
/* device is asymmetric, in which case source and drain do not */
|
/* device is asymmetric, in which case source and drain do not */
|
||||||
/* permute, and the terminal order is fixed. */
|
/* permute, and the terminal order is fixed. */
|
||||||
|
|
||||||
if (TTMaskIsZero(&devptr->exts_deviceSDTypes[1]))
|
switch (devptr->exts_deviceClass)
|
||||||
ExtSortTerminals(&extTransRec, ll);
|
{
|
||||||
|
case DEV_FET:
|
||||||
|
case DEV_MOSFET:
|
||||||
|
case DEV_MSUBCKT:
|
||||||
|
if (TTMaskIsZero(&devptr->exts_deviceSDTypes[1]))
|
||||||
|
ExtSortTerminals(&extTransRec, ll);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
/* each non-gate terminal */
|
/* each non-gate terminal */
|
||||||
for (nsd = 0; nsd < extTransRec.tr_nterm; nsd++)
|
for (nsd = 0; nsd < extTransRec.tr_nterm; nsd++)
|
||||||
|
|
@ -2515,6 +2522,7 @@ extTransFindSubs(tile, t, mask, def, sn, layerptr)
|
||||||
int pNum;
|
int pNum;
|
||||||
int extTransFindSubsFunc1(); /* Forward declaration */
|
int extTransFindSubsFunc1(); /* Forward declaration */
|
||||||
NodeAndType noderec;
|
NodeAndType noderec;
|
||||||
|
TileTypeBitMask lmask;
|
||||||
|
|
||||||
noderec.region = (NodeRegion *)NULL;
|
noderec.region = (NodeRegion *)NULL;
|
||||||
noderec.layer = TT_SPACE;
|
noderec.layer = TT_SPACE;
|
||||||
|
|
@ -2525,9 +2533,16 @@ extTransFindSubs(tile, t, mask, def, sn, layerptr)
|
||||||
/* on certain extended drain MOSFET devices. */
|
/* on certain extended drain MOSFET devices. */
|
||||||
GEO_EXPAND(&tileArea, 1, &tileAreaPlus);
|
GEO_EXPAND(&tileArea, 1, &tileAreaPlus);
|
||||||
|
|
||||||
|
/* If mask includes TT_SPACE, make sure that is removed before */
|
||||||
|
/* determining a plane intersection (because space intersects all */
|
||||||
|
/* planes). */
|
||||||
|
|
||||||
|
lmask = *mask;
|
||||||
|
TTMaskClearType(&lmask, TT_SPACE);
|
||||||
|
|
||||||
for (pNum = PL_TECHDEPBASE; pNum < DBNumPlanes; pNum++)
|
for (pNum = PL_TECHDEPBASE; pNum < DBNumPlanes; pNum++)
|
||||||
{
|
{
|
||||||
if (TTMaskIntersect(&DBPlaneTypes[pNum], mask))
|
if (TTMaskIntersect(&DBPlaneTypes[pNum], &lmask))
|
||||||
{
|
{
|
||||||
if (DBSrPaintArea((Tile *) NULL, def->cd_planes[pNum], &tileAreaPlus,
|
if (DBSrPaintArea((Tile *) NULL, def->cd_planes[pNum], &tileAreaPlus,
|
||||||
mask, extTransFindSubsFunc1, (ClientData)&noderec))
|
mask, extTransFindSubsFunc1, (ClientData)&noderec))
|
||||||
|
|
@ -2559,7 +2574,10 @@ extTransFindSubsFunc1(tile, noderecptr)
|
||||||
TxError("Warning: Split substrate under device at (%d %d)\n",
|
TxError("Warning: Split substrate under device at (%d %d)\n",
|
||||||
tile->ti_ll.p_x, tile->ti_ll.p_y);
|
tile->ti_ll.p_x, tile->ti_ll.p_y);
|
||||||
if (IsSplit(tile))
|
if (IsSplit(tile))
|
||||||
|
{
|
||||||
type = (SplitSide(tile)) ? SplitRightType(tile): SplitLeftType(tile);
|
type = (SplitSide(tile)) ? SplitRightType(tile): SplitLeftType(tile);
|
||||||
|
if (type == TT_SPACE) return 0; /* Ignore space in split tiles */
|
||||||
|
}
|
||||||
else
|
else
|
||||||
type = TiGetTypeExact(tile);
|
type = TiGetTypeExact(tile);
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue