Modified an ad-hoc rule in CIFgen stating that "squares" and similar

rules do not get hierarchical processing.  I am not sure why I added
that exception, which clearly is not like "bound" or "net" in causing
serious issues when used hierarchically.  The current counterexample
is the use in sky130A.tech for the NPC layer.  Based on that usage,
the exception has been relaxed to consider any "squares" and similar
rule during hierarchical processing if followed by a "grow" operator.
Possibly this is still not relaxed enough to capture all meaningful
use cases, but should suffice for now.
This commit is contained in:
Tim Edwards 2021-07-27 16:13:54 -04:00
parent 25166f2f7c
commit 11c53bb6d5
1 changed files with 20 additions and 6 deletions

View File

@ -4418,6 +4418,11 @@ CIFGenLayer(op, area, cellDef, origDef, temps, hier, clientdata)
* NOTE: Some opcodes (and whatever follows them) should never
* be run during hierarchical processing. That includes BOUNDARY,
* SQUARES/SLOTS, BBOX, and NET.
*
* Caveat: SQUARES/SLOTS followed by GROW can be used to define
* an etch area around a contact; this should be considered a
* special case that requires hierarchical processing on SQUARES/
* SLOTS.
*/
for ( ; op != NULL; op = op->co_next)
@ -4717,8 +4722,11 @@ CIFGenLayer(op, area, cellDef, origDef, temps, hier, clientdata)
case CIFOP_SQUARES:
if (hier)
{
hstop = TRUE; /* Stop hierarchical processing */
break;
if ((op->co_next == NULL) || (op->co_next->co_opcode != CIFOP_GROW))
{
hstop = TRUE; /* Stop hierarchical processing */
break;
}
}
if (CalmaContactArrays == FALSE)
{
@ -4734,8 +4742,11 @@ CIFGenLayer(op, area, cellDef, origDef, temps, hier, clientdata)
case CIFOP_SQUARES_G:
if (hier)
{
hstop = TRUE; /* Stop hierarchical processing */
break;
if ((op->co_next == NULL) || (op->co_next->co_opcode != CIFOP_GROW))
{
hstop = TRUE; /* Stop hierarchical processing */
break;
}
}
DBClearPaintPlane(nextPlane);
cifPlane = nextPlane;
@ -4748,8 +4759,11 @@ CIFGenLayer(op, area, cellDef, origDef, temps, hier, clientdata)
case CIFOP_SLOTS:
if (hier)
{
hstop = TRUE; /* Stop hierarchical processing */
break;
if ((op->co_next == NULL) || (op->co_next->co_opcode != CIFOP_GROW))
{
hstop = TRUE; /* Stop hierarchical processing */
break;
}
}
DBClearPaintPlane(nextPlane);
cifPlane = nextPlane;