Made a small change to add a flag to the DRC rules to denote whether

the rule is a normal database rule or a CIF-DRC rule.  For the latter,
the flag is used when substituting for escape strings in the "why"
rule explanation to produce the correct value in microns.
This commit is contained in:
Tim Edwards 2020-10-14 21:41:50 -04:00
parent e7074e5723
commit 9a5cc08d41
5 changed files with 46 additions and 13 deletions

View File

@ -145,6 +145,28 @@ CIFGetOutputScale(convert)
(float)(CIFCurStyle->cs_expander * convert));
}
/*
* ----------------------------------------------------------------------------
*
* CIFGetScale --
*
* Same as the above routine, but provides the scalefactor to get CIF
* units from centimicrons (which generally means just returning the
* expander value to show if units have been declared in nanometers or
* angstroms).
*
* ----------------------------------------------------------------------------
*/
float
CIFGetScale(convert)
int convert;
{
if (CIFCurStyle == NULL) return 1.0;
return (1.0 / (float)(CIFCurStyle->cs_expander * convert));
}
/*
* ----------------------------------------------------------------------------
*

View File

@ -66,6 +66,7 @@ extern void CIFReadTechFinal();
/* Externally-visible procedures: */
extern float CIFGetOutputScale();
extern float CIFGetScale();
extern float CIFGetInputScale();
extern int CIFGetDefaultContactSize();

View File

@ -200,7 +200,7 @@ drcCifWidth(argc, argv)
dpnew = (DRCCookie *) mallocMagic((unsigned) (sizeof (DRCCookie)));
drcCifAssign(dpnew, centidistance, dpnext, &CIFSolidBits,
&CIFSolidBits, why, centidistance,
DRC_FORWARD, thislayer, 0);
DRC_FORWARD | DRC_CIFRULE, thislayer, 0);
drcCifRules[thislayer][DRC_CIF_SPACE] = dpnew;
return ((centidistance+scalefactor-1)/scalefactor);
@ -291,7 +291,7 @@ drcCifSpacing(argc, argv)
dpnext = drcCifRules[layer[0]][DRC_CIF_SOLID];
dpnew = (DRCCookie *) mallocMagic((unsigned) sizeof (DRCCookie));
drcCifAssign(dpnew, centidistance, dpnext, &DBSpaceBits,
&cmask, why, centidistance, DRC_FORWARD, layer[1], 0);
&cmask, why, centidistance, DRC_FORWARD | DRC_CIFRULE, layer[1], 0);
drcCifRules[layer[0]][DRC_CIF_SOLID] = dpnew;
if (needReverse) dpnew->drcc_flags |= DRC_BOTHCORNERS;
@ -299,7 +299,7 @@ drcCifSpacing(argc, argv)
dpnext = drcCifRules[layer[0]][DRC_CIF_SPACE];
dpnew = (DRCCookie *) mallocMagic((unsigned) sizeof (DRCCookie));
drcCifAssign(dpnew, centidistance, dpnext, &DBSpaceBits,
&cmask, why, centidistance, DRC_REVERSE, layer[1], 0);
&cmask, why, centidistance, DRC_REVERSE | DRC_CIFRULE, layer[1], 0);
drcCifRules[layer[0]][DRC_CIF_SPACE] = dpnew;
if (needReverse)
@ -311,14 +311,16 @@ drcCifSpacing(argc, argv)
dpnext = drcCifRules[layer[1]][DRC_CIF_SOLID];
dpnew = (DRCCookie *) mallocMagic((unsigned) (sizeof (DRCCookie)));
drcCifAssign(dpnew, centidistance, dpnext, &DBSpaceBits, &cmask,
why, centidistance, DRC_FORWARD|DRC_BOTHCORNERS, layer[0], 0);
why, centidistance, DRC_FORWARD|DRC_BOTHCORNERS | DRC_CIFRULE,
layer[0], 0);
drcCifRules[layer[1]][DRC_CIF_SOLID] = dpnew;
// Add rule in reverse direction
dpnext = drcCifRules[layer[1]][DRC_CIF_SPACE];
dpnew = (DRCCookie *) mallocMagic((unsigned) sizeof (DRCCookie));
drcCifAssign(dpnew, centidistance, dpnext, &DBSpaceBits, &cmask,
why, centidistance, DRC_REVERSE|DRC_BOTHCORNERS, layer[0], 0);
why, centidistance, DRC_REVERSE|DRC_BOTHCORNERS | DRC_CIFRULE,
layer[0], 0);
drcCifRules[layer[1]][DRC_CIF_SPACE] = dpnew;
if (layer[0] == layer[1])
@ -326,14 +328,16 @@ drcCifSpacing(argc, argv)
dpnext = drcCifRules[layer[1]][DRC_CIF_SPACE];
dpnew = (DRCCookie *) mallocMagic((unsigned) (sizeof (DRCCookie)));
drcCifAssign(dpnew, centidistance, dpnext, &DBSpaceBits,
&cmask, why, centidistance, DRC_REVERSE | DRC_BOTHCORNERS,
&cmask, why, centidistance,
DRC_REVERSE | DRC_BOTHCORNERS | DRC_CIFRULE,
layer[0], 0);
drcCifRules[layer[1]][DRC_CIF_SPACE] = dpnew;
dpnext = drcCifRules[layer[0]][DRC_CIF_SPACE];
dpnew = (DRCCookie *) mallocMagic((unsigned) (sizeof (DRCCookie)));
drcCifAssign(dpnew, centidistance, dpnext, &DBSpaceBits, &cmask,
why, centidistance, DRC_REVERSE | DRC_BOTHCORNERS,
why, centidistance,
DRC_REVERSE | DRC_BOTHCORNERS | DRC_CIFRULE,
layer[1], 0);
drcCifRules[layer[0]][DRC_CIF_SPACE] = dpnew;
}
@ -344,13 +348,13 @@ drcCifSpacing(argc, argv)
dpnext = drcCifRules[layer[1]][DRC_CIF_SPACE];
dpnew = (DRCCookie *) mallocMagic((unsigned) (sizeof (DRCCookie)));
drcCifAssign(dpnew, scalefactor, dpnext, &DBSpaceBits, &DBZeroTypeBits,
why, scalefactor, DRC_FORWARD, layer[0], 0);
why, scalefactor, DRC_FORWARD | DRC_CIFRULE, layer[0], 0);
drcCifRules[layer[1]][DRC_CIF_SPACE] = dpnew;
dpnext = drcCifRules[layer[0]][DRC_CIF_SPACE];
dpnew = (DRCCookie *) mallocMagic((unsigned) (sizeof (DRCCookie)));
drcCifAssign(dpnew, scalefactor, dpnext, &DBSpaceBits, &DBZeroTypeBits,
why, scalefactor, DRC_FORWARD, layer[1], 0);
why, scalefactor, DRC_FORWARD | DRC_CIFRULE, layer[1], 0);
drcCifRules[layer[0]][DRC_CIF_SPACE] = dpnew;
}
@ -1097,7 +1101,7 @@ drcCifArea(argc, argv)
dpnext = drcCifRules[thislayer][DRC_CIF_SPACE];
dpnew = (DRCCookie *) mallocMagic((unsigned) (sizeof (DRCCookie)));
drcCifAssign(dpnew, centihorizon, dpnext, &CIFSolidBits, &CIFSolidBits,
why, centiarea, DRC_AREA | DRC_FORWARD, thislayer, 0);
why, centiarea, DRC_AREA | DRC_FORWARD | DRC_CIFRULE, thislayer, 0);
drcCifRules[thislayer][DRC_CIF_SPACE] = dpnew;
@ -1167,7 +1171,7 @@ drcCifMaxwidth(argc, argv)
dpnext = drcCifRules[thislayer][DRC_CIF_SPACE];
dpnew = (DRCCookie *) mallocMagic((unsigned) (sizeof (DRCCookie)));
drcCifAssign(dpnew, centidistance, dpnext, &CIFSolidBits, &CIFSolidBits,
why, centidistance, DRC_MAXWIDTH | bend, thislayer, 0);
why, centidistance, DRC_MAXWIDTH | DRC_CIFRULE | bend, thislayer, 0);
drcCifRules[thislayer][DRC_CIF_SPACE] = dpnew;
return ((centidistance+scalefactor-1)/scalefactor);

View File

@ -201,7 +201,10 @@ drcSubstitute (cptr)
why_out = (char *)mallocMagic(whylen * sizeof(char));
strcpy(why_out, whyptr);
oscale = CIFGetOutputScale(1000); /* 1000 for conversion to um */
if (cptr->drcc_flags & DRC_CIFRULE)
oscale = CIFGetScale(100); /* 100 = microns to centimicrons */
else
oscale = CIFGetOutputScale(1000); /* 1000 for conversion to um */
wptr = why_out;
while ((sptr = strchr(whyptr, '%')) != NULL)

View File

@ -35,7 +35,7 @@ typedef struct drccookie
unsigned char drcc_cmod; /* Fractional part of drcc_cdist */
TileTypeBitMask drcc_mask; /* Legal types on RHS */
TileTypeBitMask drcc_corner; /* Types that trigger corner check */
unsigned char drcc_flags; /* Miscellaneous flags, see below. */
unsigned short drcc_flags; /* Miscellaneous flags, see below. */
int drcc_edgeplane; /* Plane of edge */
int drcc_plane; /* Index of plane on which to check
* legal types. */
@ -74,6 +74,9 @@ typedef struct drccookie
#define DRC_ANGLES 0x80
#define DRC_NONSTANDARD (DRC_AREA|DRC_MAXWIDTH|DRC_RECTSIZE|DRC_ANGLES)
/* More flags for indicating what the rule type represents */
#define DRC_CIFRULE 0x100
#define DRC_PENDING 0
#define DRC_UNPROCESSED CLIENTDEFAULT
#define DRC_PROCESSED 1