mirror of
https://github.com/RTimothyEdwards/magic.git
synced 2026-08-28 17:15:13 +02:00
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:
+25
-13
@@ -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
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user