Based on output from a large contact array for a pad, modified the

default behavior of magic to make use of the "gds contacts true"
option to output contacts as arrays of subcells instead of
individual boundary entries, as the former is much more efficient
than the latter.  Set the option to be true by default, and set
the "gds flatglob" option to have one entry "$$*$$" corresponding
to the contact subcells created by the "gds contacts" option, so
that GDS reads and writes as it did previously (but using a
different method).  Expanded the method to include "squares-grid"
and "slots" operators (the latter should produce much more
efficient fill pattern arrays).  Implemented for both compressed
and uncompressed GDS.  Tested in all variations.
This commit is contained in:
Tim Edwards
2022-11-10 14:08:58 -05:00
parent 70e15b1d33
commit e37a4f418a
7 changed files with 60 additions and 17 deletions
+25 -13
View File
@@ -3433,7 +3433,13 @@ cifContactFunc(tile, csi)
left += halfsize;
bottom += halfsize;
result = CalmaGenerateArray((FILE *)csi->csi_client, csi->csi_type,
#ifdef HAVE_ZLIB
if (CalmaCompression > 0)
result = CalmaGenerateArrayZ((FILETYPE)csi->csi_client, csi->csi_type,
left, bottom, pitch, nAcross, nUp);
else
#endif
result = CalmaGenerateArray((FILE *)csi->csi_client, csi->csi_type,
left, bottom, pitch, nAcross, nUp);
return (result == TRUE) ? 0 : 1;
@@ -4840,12 +4846,15 @@ CIFGenLayer(op, area, cellDef, origDef, temps, hier, clientdata)
break;
}
}
DBClearPaintPlane(nextPlane);
cifPlane = nextPlane;
cifSquaresFillArea(op, cellDef, curPlane);
temp = curPlane;
curPlane = nextPlane;
nextPlane = temp;
if (CalmaContactArrays == FALSE)
{
DBClearPaintPlane(nextPlane);
cifPlane = nextPlane;
cifSquaresFillArea(op, cellDef, curPlane);
temp = curPlane;
curPlane = nextPlane;
nextPlane = temp;
}
break;
case CIFOP_SLOTS:
@@ -4857,12 +4866,15 @@ CIFGenLayer(op, area, cellDef, origDef, temps, hier, clientdata)
break;
}
}
DBClearPaintPlane(nextPlane);
cifPlane = nextPlane;
cifSlotsFillArea(op, cellDef, curPlane);
temp = curPlane;
curPlane = nextPlane;
nextPlane = temp;
if (CalmaContactArrays == FALSE)
{
DBClearPaintPlane(nextPlane);
cifPlane = nextPlane;
cifSlotsFillArea(op, cellDef, curPlane);
temp = curPlane;
curPlane = nextPlane;
nextPlane = temp;
}
break;
case CIFOP_MAXRECT:
+3 -1
View File
@@ -2049,7 +2049,9 @@ CIFTechFinal()
for (op = style->cs_layers[i]->cl_ops; (op != NULL) &&
(op->co_opcode == CIFOP_OR) &&
(TTMaskIsZero(&op->co_cifMask)); op = op->co_next);
if (op && (op->co_opcode == CIFOP_SQUARES) && (op->co_next == NULL))
if (op && ((op->co_opcode == CIFOP_SQUARES) ||
(op->co_opcode == CIFOP_SQUARES_G) ||
(op->co_opcode == CIFOP_SLOTS)) && (op->co_next == NULL))
{
clientdata = op->co_client;
for (op = style->cs_layers[i]->cl_ops; op->co_opcode == CIFOP_OR;