From 0c24c3345174079a07101d89d35a9c7ac4d47a8e Mon Sep 17 00:00:00 2001 From: Tim Edwards Date: Thu, 19 Sep 2019 08:22:11 -0400 Subject: [PATCH 1/2] Corrected a bad error from a previous commit (5 days ago, for fixing the forward-referenced GDS cell problem) in which when writing cells from 3rd-party GDS, the structure names are written to GDS with the indicator flag in front, making the structure names and the referenced names different, so that the GDS file is no longer valid. This has been fixed. --- calma/CalmaWrite.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/calma/CalmaWrite.c b/calma/CalmaWrite.c index 5a01d85b..8a8842f3 100644 --- a/calma/CalmaWrite.c +++ b/calma/CalmaWrite.c @@ -487,7 +487,7 @@ calmaDumpStructure(def, outf, calmaDefHash, filename) HashSetValue(he, (char *)newnameptr); } } - calmaOutStringRecord(CALMA_STRNAME, newnameptr, outf); + calmaOutStringRecord(CALMA_STRNAME, newnameptr + 1, outf); } freeMagic(strname); From 091d7ba2ae128b7642cadcf372d85f8180dcdea2 Mon Sep 17 00:00:00 2001 From: Tim Edwards Date: Thu, 19 Sep 2019 14:33:30 -0400 Subject: [PATCH 2/2] Corrected drcAssign for use with CIF drc rules, where the check for plane is not relevant and can generate false-positive error messages (although no actual errors occur). --- drc/DRCcif.c | 23 +++++++++++------------ drc/DRCtech.c | 27 ++++++++++++++++++++++----- drc/drc.h | 2 ++ 3 files changed, 35 insertions(+), 17 deletions(-) diff --git a/drc/DRCcif.c b/drc/DRCcif.c index 6fe7321b..b4344620 100644 --- a/drc/DRCcif.c +++ b/drc/DRCcif.c @@ -200,7 +200,7 @@ drcCifWidth(argc, argv) dpnext = drcCifRules[thislayer][DRC_CIF_SPACE]; dpnew = (DRCCookie *) mallocMagic((unsigned) (sizeof (DRCCookie))); - drcAssign(dpnew, centidistance, dpnext, &CIFSolidBits, + drcCifAssign(dpnew, centidistance, dpnext, &CIFSolidBits, &CIFSolidBits, why, centidistance, DRC_FORWARD, thislayer, 0); drcCifRules[thislayer][DRC_CIF_SPACE] = dpnew; @@ -292,7 +292,7 @@ drcCifSpacing(argc, argv) centidistance *= drcCifStyle->cs_expander; // BSI dpnext = drcCifRules[layer[0]][DRC_CIF_SOLID]; dpnew = (DRCCookie *) mallocMagic((unsigned) sizeof (DRCCookie)); - drcAssign(dpnew, centidistance, dpnext, &DBSpaceBits, + drcCifAssign(dpnew, centidistance, dpnext, &DBSpaceBits, &cmask, why, centidistance, DRC_FORWARD, layer[1], 0); drcCifRules[layer[0]][DRC_CIF_SOLID] = dpnew; if (needReverse) dpnew->drcc_flags |= DRC_BOTHCORNERS; @@ -300,7 +300,7 @@ drcCifSpacing(argc, argv) // Add rule in reverse direction dpnext = drcCifRules[layer[0]][DRC_CIF_SPACE]; dpnew = (DRCCookie *) mallocMagic((unsigned) sizeof (DRCCookie)); - drcAssign(dpnew, centidistance, dpnext, &DBSpaceBits, + drcCifAssign(dpnew, centidistance, dpnext, &DBSpaceBits, &cmask, why, centidistance, DRC_REVERSE, layer[1], 0); drcCifRules[layer[0]][DRC_CIF_SPACE] = dpnew; @@ -312,14 +312,14 @@ drcCifSpacing(argc, argv) dpnew->drcc_flags |= DRC_BOTHCORNERS; dpnext = drcCifRules[layer[1]][DRC_CIF_SOLID]; dpnew = (DRCCookie *) mallocMagic((unsigned) (sizeof (DRCCookie))); - drcAssign(dpnew, centidistance, dpnext, &DBSpaceBits, &cmask, + drcCifAssign(dpnew, centidistance, dpnext, &DBSpaceBits, &cmask, why, centidistance, DRC_FORWARD|DRC_BOTHCORNERS, 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)); - drcAssign(dpnew, centidistance, dpnext, &DBSpaceBits, &cmask, + drcCifAssign(dpnew, centidistance, dpnext, &DBSpaceBits, &cmask, why, centidistance, DRC_REVERSE|DRC_BOTHCORNERS, layer[0], 0); drcCifRules[layer[1]][DRC_CIF_SPACE] = dpnew; @@ -327,14 +327,14 @@ drcCifSpacing(argc, argv) { dpnext = drcCifRules[layer[1]][DRC_CIF_SPACE]; dpnew = (DRCCookie *) mallocMagic((unsigned) (sizeof (DRCCookie))); - drcAssign(dpnew, centidistance, dpnext, &DBSpaceBits, + drcCifAssign(dpnew, centidistance, dpnext, &DBSpaceBits, &cmask, why, centidistance, DRC_REVERSE | DRC_BOTHCORNERS, layer[0], 0); drcCifRules[layer[1]][DRC_CIF_SPACE] = dpnew; dpnext = drcCifRules[layer[0]][DRC_CIF_SPACE]; dpnew = (DRCCookie *) mallocMagic((unsigned) (sizeof (DRCCookie))); - drcAssign(dpnew, centidistance, dpnext, &DBSpaceBits, &cmask, + drcCifAssign(dpnew, centidistance, dpnext, &DBSpaceBits, &cmask, why, centidistance, DRC_REVERSE | DRC_BOTHCORNERS, layer[1], 0); drcCifRules[layer[0]][DRC_CIF_SPACE] = dpnew; @@ -345,13 +345,13 @@ drcCifSpacing(argc, argv) { dpnext = drcCifRules[layer[1]][DRC_CIF_SPACE]; dpnew = (DRCCookie *) mallocMagic((unsigned) (sizeof (DRCCookie))); - drcAssign(dpnew, scalefactor, dpnext, &DBSpaceBits, &DBZeroTypeBits, + drcCifAssign(dpnew, scalefactor, dpnext, &DBSpaceBits, &DBZeroTypeBits, why, scalefactor, DRC_FORWARD, layer[0], 0); drcCifRules[layer[1]][DRC_CIF_SPACE] = dpnew; dpnext = drcCifRules[layer[0]][DRC_CIF_SPACE]; dpnew = (DRCCookie *) mallocMagic((unsigned) (sizeof (DRCCookie))); - drcAssign(dpnew, scalefactor, dpnext, &DBSpaceBits, &DBZeroTypeBits, + drcCifAssign(dpnew, scalefactor, dpnext, &DBSpaceBits, &DBZeroTypeBits, why, scalefactor, DRC_FORWARD, layer[1], 0); drcCifRules[layer[0]][DRC_CIF_SPACE] = dpnew; } @@ -1066,7 +1066,7 @@ drcCifArea(argc, argv) centiarea *= (drcCifStyle->cs_expander * drcCifStyle->cs_expander); dpnext = drcCifRules[thislayer][DRC_CIF_SPACE]; dpnew = (DRCCookie *) mallocMagic((unsigned) (sizeof (DRCCookie))); - drcAssign(dpnew, centihorizon, dpnext, &CIFSolidBits, &CIFSolidBits, + drcCifAssign(dpnew, centihorizon, dpnext, &CIFSolidBits, &CIFSolidBits, why, centiarea, DRC_AREA | DRC_FORWARD, thislayer, 0); drcCifRules[thislayer][DRC_CIF_SPACE] = dpnew; @@ -1136,11 +1136,10 @@ drcCifMaxwidth(argc, argv) centidistance *= drcCifStyle->cs_expander; // BSI dpnext = drcCifRules[thislayer][DRC_CIF_SPACE]; dpnew = (DRCCookie *) mallocMagic((unsigned) (sizeof (DRCCookie))); - drcAssign(dpnew, centidistance, dpnext, &CIFSolidBits, &CIFSolidBits, + drcCifAssign(dpnew, centidistance, dpnext, &CIFSolidBits, &CIFSolidBits, why, centidistance, DRC_MAXWIDTH | bend, thislayer, 0); drcCifRules[thislayer][DRC_CIF_SPACE] = dpnew; - return ((centidistance+scalefactor-1)/scalefactor); } diff --git a/drc/DRCtech.c b/drc/DRCtech.c index 62c09066..dd49a0d4 100644 --- a/drc/DRCtech.c +++ b/drc/DRCtech.c @@ -872,17 +872,13 @@ DRCTechLine(sectionName, argc, argv) } void -drcAssign(cookie, dist, next, mask, corner, why, cdist, flags, planeto, planefrom) +drcCifAssign(cookie, dist, next, mask, corner, why, cdist, flags, planeto, planefrom) DRCCookie *cookie, *next; int dist, cdist; TileTypeBitMask *mask, *corner; char *why; int flags, planeto, planefrom; { - /* Diagnostic */ - if (planeto >= DBNumPlanes) { - TxError("Bad plane in DRC assign!\n"); - } (cookie)->drcc_dist = dist; (cookie)->drcc_next = next; (cookie)->drcc_mask = *mask; @@ -896,6 +892,27 @@ drcAssign(cookie, dist, next, mask, corner, why, cdist, flags, planeto, planefro (cookie)->drcc_cmod = 0; } +// This is like drcCifAssign, but checks for bad plane numbers in planeto and +// planefrom + +void +drcAssign(cookie, dist, next, mask, corner, why, cdist, flags, planeto, planefrom) + DRCCookie *cookie, *next; + int dist, cdist; + TileTypeBitMask *mask, *corner; + char *why; + int flags, planeto, planefrom; +{ + /* Diagnostic */ + if (planeto >= DBNumPlanes) + TechError("Bad plane in DRC assignment.\n"); + if (planefrom >= DBNumPlanes) + TechError("Bad edge plane in DRC assignment.\n"); + + drcCifAssign(cookie, dist, next, mask, corner, why, cdist, flags, planeto, + planefrom); +} + /* * ---------------------------------------------------------------------------- * diff --git a/drc/drc.h b/drc/drc.h index 0ca8847a..e2dea941 100644 --- a/drc/drc.h +++ b/drc/drc.h @@ -239,6 +239,8 @@ extern void drcPrintError(); extern int drcIncludeArea(); extern int drcExactOverlapTile(); extern void drcInitRulesTbl(); +extern void drcAssign(); +extern void drcCifAssign(); /* * Exported procedures