Merge branch 'master' into magic-8.2

This commit is contained in:
Tim Edwards 2020-03-07 03:00:04 -05:00
commit ab0f5686bf
4 changed files with 23 additions and 41 deletions

View File

@ -1 +1 @@
8.2.192
8.2.193

View File

@ -40,6 +40,7 @@ static char rcsid[] __attribute__ ((unused)) = "$Header: /usr/cvsroot/magic-8.0/
CIFStyle *drcCifStyle = NULL;
bool DRCForceReload = FALSE;
HashTable DRCWhyErrorTable; /* Table of DRC errors */
/*
* DRC interaction radius being used (not necessarily the same as
@ -339,7 +340,7 @@ drcTechNewStyle()
* Adds to the DRCWhyList if whystring has not been used before.
* Calls StrDup() and increments DRCWhySize. DRCWhyList is allocated
* in blocks of 50 at a time and only expands when filled.
* Temporary hash table DRCErrorTable is used to determine if a
* Temporary hash table DRCWhyErrorTable is used to determine if a
* string entry is unique. It is cleared after the technology file
* has been processed.
* ----------------------------------------------------------------------------
@ -351,7 +352,7 @@ drcWhyCreate(whystring)
{
HashEntry *he;
he = HashLookOnly(&DRCErrorTable, whystring);
he = HashLookOnly(&DRCWhyErrorTable, whystring);
if (he != NULL)
return (int)((pointertype)HashGetValue(he));
@ -370,7 +371,7 @@ drcWhyCreate(whystring)
}
DRCCurStyle->DRCWhySize++;
he = HashFind(&DRCErrorTable, whystring);
he = HashFind(&DRCWhyErrorTable, whystring);
HashSetValue(he, (char *)((pointertype)DRCCurStyle->DRCWhySize));
DRCCurStyle->DRCWhyList[DRCCurStyle->DRCWhySize] = StrDup((char **)NULL, whystring);
@ -564,7 +565,7 @@ DRCTechStyleInit()
DRCCurStyle->DRCFlags = (char)0;
DRCCurStyle->DRCWhySize = 0;
HashInit(&DRCErrorTable, 16, HT_STRINGKEYS);
HashInit(&DRCWhyErrorTable, 16, HT_STRINGKEYS);
/* First DRC entry is associated with the statically-allocated */
/* drcArrayCookie and has a tag of DRC_ARRAY_OVERLAP_TAG = 1 */
@ -3505,8 +3506,8 @@ drcTechFinalStyle(style)
DRCCookie **dpp, **dp2back;
TileType i, j;
/* Done with DRCErrorTable */
HashKill(&DRCErrorTable);
/* Done with DRCWhyErrorTable */
HashKill(&DRCWhyErrorTable);
/* If the scale factor is not 1, then divide all distances by */
/* the scale factor, take the ceiling, and save the (negative) */

View File

@ -219,7 +219,6 @@ extern DRCKeep *DRCStyleList; /* List of available DRC styles */
extern DRCStyle *DRCCurStyle; /* Current DRC style in effect */
extern CellDef *DRCdef; /* Current cell being checked for DRC */
extern CellUse *DRCuse, *DRCDummyUse;
extern HashTable DRCErrorTable; /* DRC errors, hashed by name */
/*
* Internal procedures

View File

@ -1770,10 +1770,18 @@ origin_error:
*
* For LEF contact types matching magic contact types, size the
* LEF contact cut to cover the minimum rectangle in the other
* layers that satisfies the CIF/GDS contact generation. Use
* the "cifinput" style to determine how much the via layer
* needs to grow to make a contact area. If the "cifinput"
* style is not defined, then determine rules from "cifoutput".
* layers that satisfies the CIF/GDS contact generation.
*
* NOTE: If a "cifinput" style is defined, then the via
* remains the size declared in LEF or DEF file, and the
* magic view of the via is generated by applying "cifinput"
* rules when painting into the magic database. If no input
* style is defined, then the output style rules are used to
* modify the cut size to match the way the via is defined in
* magic, and the result is painted directly.
*
* If a "cifinput" style exists, then this routine does
* nothing and has no side effects.
*
*------------------------------------------------------------
*/
@ -1783,36 +1791,10 @@ void LefGrowVia(curlayer, currect, lefl)
Rect *currect;
lefLayer *lefl;
{
if (DBIsContact(curlayer) && cifCurReadStyle != NULL)
{
int growSize;
/* To be completed: This should be deprecated by moving the entire */
/* LEF and DEF read routines to use the cifinput style. */
/* Get the amount (in magic units) that the layer needs to */
/* expand according to the "cifinput" style rules to convert */
/* a contact cut to a magic contact layer. */
growSize = CIFReadGetGrowSize(curlayer);
/* All internal LEF via geometry values are doubled */
growSize <<= 1;
if (growSize % cifCurReadStyle->crs_scaleFactor == 0)
growSize /= cifCurReadStyle->crs_scaleFactor;
else
growSize = growSize / cifCurReadStyle->crs_scaleFactor + 1;
if (growSize > 0)
{
/* cifinput styles expect the cut size to be correct, so */
/* there is no check for correctness of the layer. */
currect->r_xbot = currect->r_xbot - growSize;
currect->r_ybot = currect->r_ybot - growSize;
currect->r_xtop = currect->r_xtop + growSize;
currect->r_ytop = currect->r_ytop + growSize;
}
}
else if (DBIsContact(curlayer) && CIFCurStyle != NULL)
if (DBIsContact(curlayer) && CIFCurStyle != NULL)
{
int edgeSize = 0, contSize, halfSize;