Merge branch 'master' into magic-8.2
This commit is contained in:
commit
ab0f5686bf
|
|
@ -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) */
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue