Corrected two errors: (1) Do not write subcircuit calls to subcircuits

that have been removed by flattening into the parent cell due to lack
of devices.  Previously the checks on writing the subcircuit and writing
the call were slightly different, leading to instances in which the
subcircuit call would be written to the netlist output without the
subcircuit being defined.  (2) Corrected an error in the "bridge" CIF/GDS
output operator.  In certain (somewhat rare) geometries, the tile behind
(instead of in front of) the corner being checked may be incorrectly
flagged as a DRC spacing error.  The fix is to ignore tiles that are
behind the corner being checked.
This commit is contained in:
Tim Edwards 2020-12-28 16:54:20 -05:00
parent e12d4c7e17
commit 44325f81e6
4 changed files with 22 additions and 1 deletions

View File

@ -1 +1 @@
8.3.105
8.3.106

View File

@ -1847,6 +1847,9 @@ cifBridgeCheckFunc(tile, brcs)
switch (dir) {
case BRIDGE_NW:
/* Ignore tile if it is not in the SE direction */
if (LEFT(tile) < RIGHT(brcs->tile) && TOP(tile) > BOTTOM(brcs->tile))
break;
/* Ignore tile if split, and SE corner is clipped */
if (TiGetRightType(tile) == checktype || TiGetBottomType(tile) == checktype)
break;
@ -1860,6 +1863,9 @@ cifBridgeCheckFunc(tile, brcs)
}
break;
case BRIDGE_NE:
/* Ignore tile if it is not in the SW direction */
if (RIGHT(tile) > LEFT(brcs->tile) && TOP(tile) > BOTTOM(brcs->tile))
break;
/* Ignore tile if split, and SW corner is clipped */
if (TiGetLeftType(tile) == checktype || TiGetBottomType(tile) == checktype)
break;
@ -1873,6 +1879,9 @@ cifBridgeCheckFunc(tile, brcs)
}
break;
case BRIDGE_SW:
/* Ignore tile if it is not in the NE direction */
if (LEFT(tile) < RIGHT(brcs->tile) && BOTTOM(tile) < TOP(brcs->tile))
break;
/* Ignore tile if split, and NE corner is clipped */
if (TiGetRightType(tile) == checktype || TiGetTopType(tile) == checktype)
break;
@ -1886,6 +1895,9 @@ cifBridgeCheckFunc(tile, brcs)
}
break;
case BRIDGE_SE:
/* Ignore tile if it is not in the NW direction */
if (RIGHT(tile) > LEFT(brcs->tile) && BOTTOM(tile) < TOP(brcs->tile))
break;
/* Ignore tile if split, and NW corner is clipped */
if (TiGetLeftType(tile) == checktype || TiGetTopType(tile) == checktype)
break;

View File

@ -405,6 +405,7 @@ subcktHierVisit(use, hierName, is_top)
EFNode *snode;
EFNodeName *nodeName;
bool hasports = FALSE;
bool isStub;
/* Avoid generating records for circuits that have no ports. */
/* These are already absorbed into the parent. All other */
@ -431,6 +432,13 @@ subcktHierVisit(use, hierName, is_top)
break;
}
/* Same considerations as at line 1831 for determining if the cell */
/* has been folded into the parent and should not be output. */
isStub = ((def->def_flags & DEF_ABSTRACT) && esDoBlackBox) ? TRUE : FALSE;
if ((!is_top) && (def->def_flags & DEF_NODEVICES) && (!isStub))
return 0;
if (hasports || is_top)
return subcktVisit(use, hierName, is_top);
else if (def->def_flags & DEF_NODEVICES)

View File

@ -397,6 +397,7 @@ efHierDevKilled(hc, dev, prefix)
for (n = 0; n < dev->dev_nterm; n++)
{
if (dev->dev_terms[n].dterm_node == NULL) continue;
suffix = dev->dev_terms[n].dterm_node->efnode_name->efnn_hier;
he = HashLookOnly(&efNodeHashTable, (char *)suffix);
if (he && (nn = (EFNodeName *) HashGetValue(he))