From 9a5cc08d41773f014ef53ddeacda38ee7ef11bd4 Mon Sep 17 00:00:00 2001 From: Tim Edwards Date: Wed, 14 Oct 2020 21:41:50 -0400 Subject: [PATCH] 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. --- cif/CIFmain.c | 22 ++++++++++++++++++++++ cif/cif.h | 1 + drc/DRCcif.c | 26 +++++++++++++++----------- drc/DRCmain.c | 5 ++++- drc/drc.h | 5 ++++- 5 files changed, 46 insertions(+), 13 deletions(-) diff --git a/cif/CIFmain.c b/cif/CIFmain.c index ad6742d1..fb2ea1af 100644 --- a/cif/CIFmain.c +++ b/cif/CIFmain.c @@ -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)); +} + /* * ---------------------------------------------------------------------------- * diff --git a/cif/cif.h b/cif/cif.h index b2407bf8..304f3840 100644 --- a/cif/cif.h +++ b/cif/cif.h @@ -66,6 +66,7 @@ extern void CIFReadTechFinal(); /* Externally-visible procedures: */ extern float CIFGetOutputScale(); +extern float CIFGetScale(); extern float CIFGetInputScale(); extern int CIFGetDefaultContactSize(); diff --git a/drc/DRCcif.c b/drc/DRCcif.c index cd7659ae..942501e1 100644 --- a/drc/DRCcif.c +++ b/drc/DRCcif.c @@ -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); diff --git a/drc/DRCmain.c b/drc/DRCmain.c index 1d9443a2..0258cd10 100644 --- a/drc/DRCmain.c +++ b/drc/DRCmain.c @@ -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) diff --git a/drc/drc.h b/drc/drc.h index 40984a0e..390a3cde 100644 --- a/drc/drc.h +++ b/drc/drc.h @@ -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