Merge branch 'work' into tomerge
This commit is contained in:
commit
44e34fb0ad
120
lef/lefRead.c
120
lef/lefRead.c
|
|
@ -948,7 +948,8 @@ LefPaintPolygon(lefMacro, pointList, points, curlayer, keep)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
enum lef_geometry_keys {LEF_LAYER = 0, LEF_WIDTH, LEF_PATH,
|
enum lef_geometry_keys {LEF_LAYER = 0, LEF_WIDTH, LEF_PATH,
|
||||||
LEF_RECT, LEF_POLYGON, LEF_VIA, LEF_GEOMETRY_END};
|
LEF_RECT, LEF_POLYGON, LEF_VIA, LEF_PORT_CLASS,
|
||||||
|
LEF_GEOMETRY_END};
|
||||||
|
|
||||||
LinkedRect *
|
LinkedRect *
|
||||||
LefReadGeometry(lefMacro, f, oscale, do_list)
|
LefReadGeometry(lefMacro, f, oscale, do_list)
|
||||||
|
|
@ -973,6 +974,7 @@ LefReadGeometry(lefMacro, f, oscale, do_list)
|
||||||
"RECT",
|
"RECT",
|
||||||
"POLYGON",
|
"POLYGON",
|
||||||
"VIA",
|
"VIA",
|
||||||
|
"CLASS",
|
||||||
"END",
|
"END",
|
||||||
NULL
|
NULL
|
||||||
};
|
};
|
||||||
|
|
@ -1073,6 +1075,9 @@ LefReadGeometry(lefMacro, f, oscale, do_list)
|
||||||
case LEF_VIA:
|
case LEF_VIA:
|
||||||
LefEndStatement(f);
|
LefEndStatement(f);
|
||||||
break;
|
break;
|
||||||
|
case LEF_PORT_CLASS:
|
||||||
|
LefEndStatement(f);
|
||||||
|
break;
|
||||||
case LEF_GEOMETRY_END:
|
case LEF_GEOMETRY_END:
|
||||||
if (LefParseEndStatement(f, NULL) == 0)
|
if (LefParseEndStatement(f, NULL) == 0)
|
||||||
{
|
{
|
||||||
|
|
@ -1161,7 +1166,9 @@ LefReadPort(lefMacro, f, pinName, pinNum, pinDir, pinUse, oscale)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
enum lef_pin_keys {LEF_DIRECTION = 0, LEF_USE, LEF_PORT, LEF_CAPACITANCE,
|
enum lef_pin_keys {LEF_DIRECTION = 0, LEF_USE, LEF_PORT, LEF_CAPACITANCE,
|
||||||
LEF_PIN_END};
|
LEF_ANTENNADIFF, LEF_ANTENNAGATE, LEF_ANTENNAMOD,
|
||||||
|
LEF_ANTENNAPAR, LEF_ANTENNAPARSIDE, LEF_ANTENNAMAX, LEF_ANTENNAMAXSIDE,
|
||||||
|
LEF_SHAPE, LEF_NETEXPR, LEF_PIN_END};
|
||||||
|
|
||||||
void
|
void
|
||||||
LefReadPin(lefMacro, f, pinname, pinNum, oscale)
|
LefReadPin(lefMacro, f, pinname, pinNum, oscale)
|
||||||
|
|
@ -1181,6 +1188,15 @@ LefReadPin(lefMacro, f, pinname, pinNum, oscale)
|
||||||
"USE",
|
"USE",
|
||||||
"PORT",
|
"PORT",
|
||||||
"CAPACITANCE",
|
"CAPACITANCE",
|
||||||
|
"ANTENNADIFFAREA",
|
||||||
|
"ANTENNAGATEAREA",
|
||||||
|
"ANTENNAMODEL",
|
||||||
|
"ANTENNAPARTIALMETALAREA",
|
||||||
|
"ANTENNAPARTIALMETALSIDEAREA",
|
||||||
|
"ANTENNAMAXAREACAR",
|
||||||
|
"ANTENNAMAXSIDEAREACAR",
|
||||||
|
"SHAPE",
|
||||||
|
"NETEXPR",
|
||||||
"END",
|
"END",
|
||||||
NULL
|
NULL
|
||||||
};
|
};
|
||||||
|
|
@ -1256,6 +1272,15 @@ LefReadPin(lefMacro, f, pinname, pinNum, oscale)
|
||||||
LefReadPort(lefMacro, f, pinname, pinNum, pinDir, pinUse, oscale);
|
LefReadPort(lefMacro, f, pinname, pinNum, pinDir, pinUse, oscale);
|
||||||
break;
|
break;
|
||||||
case LEF_CAPACITANCE:
|
case LEF_CAPACITANCE:
|
||||||
|
case LEF_ANTENNADIFF:
|
||||||
|
case LEF_ANTENNAGATE:
|
||||||
|
case LEF_ANTENNAMOD:
|
||||||
|
case LEF_ANTENNAPAR:
|
||||||
|
case LEF_ANTENNAPARSIDE:
|
||||||
|
case LEF_ANTENNAMAX:
|
||||||
|
case LEF_ANTENNAMAXSIDE:
|
||||||
|
case LEF_SHAPE:
|
||||||
|
case LEF_NETEXPR:
|
||||||
LefEndStatement(f); /* Ignore. . . */
|
LefEndStatement(f); /* Ignore. . . */
|
||||||
break;
|
break;
|
||||||
case LEF_PIN_END:
|
case LEF_PIN_END:
|
||||||
|
|
@ -1681,10 +1706,20 @@ LefAddViaGeometry(f, lefl, curlayer, oscale)
|
||||||
*------------------------------------------------------------
|
*------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
|
|
||||||
enum lef_layer_keys {LEF_LAYER_TYPE=0, LEF_LAYER_WIDTH, LEF_LAYER_SPACING,
|
enum lef_layer_keys {LEF_LAYER_TYPE=0, LEF_LAYER_WIDTH,
|
||||||
|
LEF_LAYER_MAXWIDTH, LEF_LAYER_AREA,
|
||||||
|
LEF_LAYER_SPACING, LEF_LAYER_SPACINGTABLE,
|
||||||
LEF_LAYER_PITCH, LEF_LAYER_DIRECTION, LEF_LAYER_OFFSET,
|
LEF_LAYER_PITCH, LEF_LAYER_DIRECTION, LEF_LAYER_OFFSET,
|
||||||
|
LEF_LAYER_WIREEXT,
|
||||||
|
LEF_LAYER_RES, LEF_LAYER_CAP, LEF_LAYER_EDGECAP,
|
||||||
|
LEF_LAYER_THICKNESS, LEF_LAYER_HEIGHT,
|
||||||
|
LEF_LAYER_MINDENSITY, LEF_LAYER_ANTENNADIFF,
|
||||||
|
LEF_LAYER_ANTENNASIDE,
|
||||||
LEF_VIA_DEFAULT, LEF_VIA_LAYER, LEF_VIA_RECT,
|
LEF_VIA_DEFAULT, LEF_VIA_LAYER, LEF_VIA_RECT,
|
||||||
LEF_VIARULE_VIA, LEF_LAYER_END};
|
LEF_VIA_ENCLOSURE, LEF_VIA_PREFERENCLOSURE,
|
||||||
|
LEF_VIARULE_OVERHANG,
|
||||||
|
LEF_VIARULE_METALOVERHANG, LEF_VIARULE_VIA,
|
||||||
|
LEF_VIARULE_GENERATE, LEF_LAYER_END};
|
||||||
|
|
||||||
void
|
void
|
||||||
LefReadLayerSection(f, lname, mode, lefl)
|
LefReadLayerSection(f, lname, mode, lefl)
|
||||||
|
|
@ -1711,18 +1746,41 @@ LefReadLayerSection(f, lname, mode, lefl)
|
||||||
static char *layer_keys[] = {
|
static char *layer_keys[] = {
|
||||||
"TYPE",
|
"TYPE",
|
||||||
"WIDTH",
|
"WIDTH",
|
||||||
|
"MAXWIDTH",
|
||||||
|
"AREA",
|
||||||
"SPACING",
|
"SPACING",
|
||||||
|
"SPACINGTABLE",
|
||||||
"PITCH",
|
"PITCH",
|
||||||
"DIRECTION",
|
"DIRECTION",
|
||||||
"OFFSET",
|
"OFFSET",
|
||||||
|
"WIREEXTENSION",
|
||||||
|
"RESISTANCE",
|
||||||
|
"CAPACITANCE",
|
||||||
|
"EDGECAPACITANCE",
|
||||||
|
"THICKNESS",
|
||||||
|
"HEIGHT",
|
||||||
|
"MINIMUMDENSITY",
|
||||||
|
"ANTENNADIFFAREARATIO",
|
||||||
|
"ANTENNASIDEAREARATIO",
|
||||||
"DEFAULT",
|
"DEFAULT",
|
||||||
"LAYER",
|
"LAYER",
|
||||||
"RECT",
|
"RECT",
|
||||||
|
"ENCLOSURE",
|
||||||
|
"PREFERENCLOSURE",
|
||||||
|
"OVERHANG",
|
||||||
|
"METALOVERHANG",
|
||||||
"VIA",
|
"VIA",
|
||||||
|
"GENERATE",
|
||||||
"END",
|
"END",
|
||||||
NULL
|
NULL
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static char *spacing_keys[] = {
|
||||||
|
"RANGE",
|
||||||
|
";",
|
||||||
|
NULL
|
||||||
|
};
|
||||||
|
|
||||||
oscale = CIFGetOutputScale(1000);
|
oscale = CIFGetOutputScale(1000);
|
||||||
viaArea = GeoNullRect;
|
viaArea = GeoNullRect;
|
||||||
|
|
||||||
|
|
@ -1747,9 +1805,15 @@ LefReadLayerSection(f, lname, mode, lefl)
|
||||||
"ignoring.\n", token);
|
"ignoring.\n", token);
|
||||||
}
|
}
|
||||||
if (lefl->lefClass != typekey)
|
if (lefl->lefClass != typekey)
|
||||||
LefError("Attempt to reclassify layer %s from %s to %s\n",
|
{
|
||||||
lname, layer_type_keys[lefl->lefClass],
|
/* ROUTE and VIA are taken from techfile lef section */
|
||||||
layer_type_keys[typekey]);
|
/* and so having a different TYPE is an error. */
|
||||||
|
/* Otherwise just ignore the type. */
|
||||||
|
if (typekey == CLASS_ROUTE || typekey == CLASS_VIA)
|
||||||
|
LefError("Attempt to reclassify layer %s from %s to %s\n",
|
||||||
|
lname, layer_type_keys[lefl->lefClass],
|
||||||
|
layer_type_keys[typekey]);
|
||||||
|
}
|
||||||
LefEndStatement(f);
|
LefEndStatement(f);
|
||||||
break;
|
break;
|
||||||
case LEF_LAYER_WIDTH:
|
case LEF_LAYER_WIDTH:
|
||||||
|
|
@ -1759,13 +1823,23 @@ LefReadLayerSection(f, lname, mode, lefl)
|
||||||
lefl->info.route.width = (int)roundf(fvalue / oscale);
|
lefl->info.route.width = (int)roundf(fvalue / oscale);
|
||||||
LefEndStatement(f);
|
LefEndStatement(f);
|
||||||
break;
|
break;
|
||||||
|
case LEF_LAYER_MAXWIDTH:
|
||||||
|
case LEF_LAYER_AREA:
|
||||||
|
/* Not handled */
|
||||||
|
LefEndStatement(f);
|
||||||
|
break;
|
||||||
case LEF_LAYER_SPACING:
|
case LEF_LAYER_SPACING:
|
||||||
|
/* To do: Handle RANGE */
|
||||||
token = LefNextToken(f, TRUE);
|
token = LefNextToken(f, TRUE);
|
||||||
sscanf(token, "%f", &fvalue);
|
sscanf(token, "%f", &fvalue);
|
||||||
if (lefl->lefClass == CLASS_ROUTE)
|
if (lefl->lefClass == CLASS_ROUTE)
|
||||||
lefl->info.route.spacing = (int)roundf(fvalue / oscale);
|
lefl->info.route.spacing = (int)roundf(fvalue / oscale);
|
||||||
LefEndStatement(f);
|
LefEndStatement(f);
|
||||||
break;
|
break;
|
||||||
|
case LEF_LAYER_SPACINGTABLE:
|
||||||
|
/* To do: Handle spacing tables */
|
||||||
|
LefEndStatement(f);
|
||||||
|
break;
|
||||||
case LEF_LAYER_PITCH:
|
case LEF_LAYER_PITCH:
|
||||||
token = LefNextToken(f, TRUE);
|
token = LefNextToken(f, TRUE);
|
||||||
sscanf(token, "%f", &fvalue);
|
sscanf(token, "%f", &fvalue);
|
||||||
|
|
@ -1781,9 +1855,19 @@ LefReadLayerSection(f, lname, mode, lefl)
|
||||||
LefEndStatement(f);
|
LefEndStatement(f);
|
||||||
break;
|
break;
|
||||||
case LEF_LAYER_OFFSET:
|
case LEF_LAYER_OFFSET:
|
||||||
|
case LEF_LAYER_RES:
|
||||||
|
case LEF_LAYER_CAP:
|
||||||
|
case LEF_LAYER_EDGECAP:
|
||||||
|
case LEF_LAYER_THICKNESS:
|
||||||
|
case LEF_LAYER_HEIGHT:
|
||||||
|
case LEF_LAYER_MINDENSITY:
|
||||||
|
case LEF_LAYER_ANTENNADIFF:
|
||||||
|
case LEF_LAYER_ANTENNASIDE:
|
||||||
|
case LEF_LAYER_WIREEXT:
|
||||||
LefEndStatement(f);
|
LefEndStatement(f);
|
||||||
break;
|
break;
|
||||||
case LEF_VIA_DEFAULT:
|
case LEF_VIA_DEFAULT:
|
||||||
|
case LEF_VIARULE_GENERATE:
|
||||||
/* Do nothing; especially, don't look for end-of-statement! */
|
/* Do nothing; especially, don't look for end-of-statement! */
|
||||||
break;
|
break;
|
||||||
case LEF_VIA_LAYER:
|
case LEF_VIA_LAYER:
|
||||||
|
|
@ -1795,6 +1879,10 @@ LefReadLayerSection(f, lname, mode, lefl)
|
||||||
LefEndStatement(f);
|
LefEndStatement(f);
|
||||||
break;
|
break;
|
||||||
case LEF_VIARULE_VIA:
|
case LEF_VIARULE_VIA:
|
||||||
|
case LEF_VIA_ENCLOSURE:
|
||||||
|
case LEF_VIA_PREFERENCLOSURE:
|
||||||
|
case LEF_VIARULE_OVERHANG:
|
||||||
|
case LEF_VIARULE_METALOVERHANG:
|
||||||
LefEndStatement(f);
|
LefEndStatement(f);
|
||||||
break;
|
break;
|
||||||
case LEF_LAYER_END:
|
case LEF_LAYER_END:
|
||||||
|
|
@ -1826,7 +1914,10 @@ LefReadLayerSection(f, lname, mode, lefl)
|
||||||
*------------------------------------------------------------
|
*------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
|
|
||||||
enum lef_sections {LEF_VERSION = 0, LEF_NAMESCASESENSITIVE,
|
enum lef_sections {LEF_VERSION = 0,
|
||||||
|
LEF_BUSBITCHARS, LEF_DIVIDERCHAR, LEF_MANUFACTURINGGRID,
|
||||||
|
LEF_USEMINSPACING, LEF_CLEARANCEMEASURE,
|
||||||
|
LEF_NAMESCASESENSITIVE,
|
||||||
LEF_PROPERTYDEFS, LEF_UNITS, LEF_SECTION_LAYER,
|
LEF_PROPERTYDEFS, LEF_UNITS, LEF_SECTION_LAYER,
|
||||||
LEF_SECTION_VIA, LEF_SECTION_VIARULE,
|
LEF_SECTION_VIA, LEF_SECTION_VIARULE,
|
||||||
LEF_SECTION_SPACING, LEF_SECTION_SITE, LEF_PROPERTY,
|
LEF_SECTION_SPACING, LEF_SECTION_SITE, LEF_PROPERTY,
|
||||||
|
|
@ -1850,6 +1941,11 @@ LefRead(inName, importForeign)
|
||||||
|
|
||||||
static char *sections[] = {
|
static char *sections[] = {
|
||||||
"VERSION",
|
"VERSION",
|
||||||
|
"BUSBITCHARS",
|
||||||
|
"DIVIDERCHAR",
|
||||||
|
"MANUFACTURINGGRID",
|
||||||
|
"USEMINSPACING",
|
||||||
|
"CLEARANCEMEASURE",
|
||||||
"NAMESCASESENSITIVE",
|
"NAMESCASESENSITIVE",
|
||||||
"PROPERTYDEFINITIONS",
|
"PROPERTYDEFINITIONS",
|
||||||
"UNITS",
|
"UNITS",
|
||||||
|
|
@ -1909,6 +2005,10 @@ LefRead(inName, importForeign)
|
||||||
switch (keyword)
|
switch (keyword)
|
||||||
{
|
{
|
||||||
case LEF_VERSION:
|
case LEF_VERSION:
|
||||||
|
case LEF_BUSBITCHARS:
|
||||||
|
case LEF_DIVIDERCHAR:
|
||||||
|
case LEF_CLEARANCEMEASURE:
|
||||||
|
case LEF_MANUFACTURINGGRID:
|
||||||
LefEndStatement(f);
|
LefEndStatement(f);
|
||||||
break;
|
break;
|
||||||
case LEF_NAMESCASESENSITIVE:
|
case LEF_NAMESCASESENSITIVE:
|
||||||
|
|
@ -1966,8 +2066,8 @@ LefRead(inName, importForeign)
|
||||||
mtype = DBTechNameType(LefLower(token));
|
mtype = DBTechNameType(LefLower(token));
|
||||||
if (mtype < 0)
|
if (mtype < 0)
|
||||||
{
|
{
|
||||||
LefError("Layer %s cannot be mapped to any magic layer!\n",
|
/* Ignore. This is probably a masterslice or */
|
||||||
token);
|
/* overlap, but that hasn't been parsed yet. */
|
||||||
LefSkipSection(f, tsave);
|
LefSkipSection(f, tsave);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue