Created an additional argument "start" to the "slots" operator,

which adds an offset value of "start" to both X and Y from the
lower left corner of the fill area.  This allows the use of the
"offset" (from the previous git commit) to be declared on different
layers without creating an exact overlap, as is often required by
foundries for fill patterns.
This commit is contained in:
Tim Edwards 2019-11-20 13:36:03 -05:00
parent adb4d2613d
commit be8ba09373
3 changed files with 23 additions and 7 deletions

View File

@ -2011,13 +2011,13 @@ cifSlotsFillArea(op, cellDef, plane)
cifSlotFunc(&bbox, op, &nUp, &nAcross, &llcut, vertical);
cut.r_ybot = llcut.r_ybot;
cut.r_ytop = llcut.r_ytop;
cut.r_ybot = llcut.r_ybot + slots->sl_start;
cut.r_ytop = llcut.r_ytop + slots->sl_start;
/* For each contact cut area, check that there is */
/* no whitespace */
offset = 0;
offset = slots->sl_start;
for (i = 0; i < nUp; i++)
{
cut.r_xbot = llcut.r_xbot + offset;

View File

@ -69,6 +69,7 @@ typedef struct slots_data
int sl_lsize;
int sl_lsep;
int sl_offset;
int sl_start;
} SlotsData;
typedef struct cifop

View File

@ -1327,6 +1327,7 @@ bloatCheck:
slots->sl_lsize = 0;
slots->sl_lsep = 0;
slots->sl_offset = 0;
slots->sl_start = 0;
}
if (argc >= 5)
{
@ -1361,7 +1362,7 @@ bloatCheck:
goto errorReturn;
}
}
if (argc == 8)
if (argc >= 8)
{
i = atoi(argv[7]);
slots->sl_offset = i;
@ -1371,7 +1372,17 @@ bloatCheck:
goto errorReturn;
}
}
if ((argc < 4) || (argc == 6) || (argc > 8))
if (argc == 9)
{
i = atoi(argv[8]);
slots->sl_start = i;
if (i < 0)
{
TechError("Slot start must be non-negative.\n");
goto errorReturn;
}
}
if ((argc < 4) || (argc == 6) || (argc > 9))
goto wrongNumArgs;
break;
}
@ -1685,7 +1696,7 @@ CIFTechFinal()
{
slots = (SlotsData *)op->co_client;
for (j = 0; j < 7; j++)
for (j = 0; j < 8; j++)
{
switch (j) {
case 0: bvalue = slots->sl_sborder; break;
@ -1695,6 +1706,7 @@ CIFTechFinal()
case 4: bvalue = slots->sl_lsize; break;
case 5: bvalue = slots->sl_lsep; break;
case 6: bvalue = slots->sl_offset; break;
case 7: bvalue = slots->sl_start; break;
}
if (bvalue != 0)
{
@ -2193,7 +2205,7 @@ CIFTechOutputScale(n, d)
else if (op->co_opcode == CIFOP_SLOTS)
{
slots = (SlotsData *)op->co_client;
for (j = 0; j < 7; j++)
for (j = 0; j < 8; j++)
{
switch (j) {
case 0: bptr = &slots->sl_sborder; break;
@ -2203,6 +2215,7 @@ CIFTechOutputScale(n, d)
case 4: bptr = &slots->sl_lsize; break;
case 5: bptr = &slots->sl_lsep; break;
case 6: bptr = &slots->sl_offset; break;
case 7: bptr = &slots->sl_start; break;
}
if (*bptr != 0)
{
@ -2319,6 +2332,8 @@ CIFTechOutputScale(n, d)
slots->sl_lsep /= lexpand;
if (slots->sl_offset != 0)
slots->sl_offset /= lexpand;
if (slots->sl_start != 0)
slots->sl_start /= lexpand;
break;
case CIFOP_SQUARES_G:
squares = (SquaresData *)op->co_client;