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:
parent
e12d4c7e17
commit
44325f81e6
12
cif/CIFgen.c
12
cif/CIFgen.c
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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))
|
||||
|
|
|
|||
Loading…
Reference in New Issue