summaryrefslogtreecommitdiff
path: root/lef.c
diff options
context:
space:
mode:
Diffstat (limited to 'lef.c')
-rw-r--r--lef.c38
1 files changed, 31 insertions, 7 deletions
diff --git a/lef.c b/lef.c
index 9c654ac..ce4b36e 100644
--- a/lef.c
+++ b/lef.c
@@ -865,7 +865,10 @@ LefGetXYViaWidth(int base, int layer, int dir, int orient)
viatable = ViaYY;
break;
}
- lefl = LefFindLayer(*(viatable + base));
+ if (*viatable == NULL)
+ lefl = NULL;
+ else
+ lefl = LefFindLayer(*(viatable + base));
/* The routine LefAssignLayerVias() should assign all Via** types. */
/* Below are fallback assignments. */
@@ -2565,11 +2568,11 @@ LefList LefNewVia(char *name)
enum lef_sections {LEF_VERSION = 0,
LEF_BUSBITCHARS, LEF_DIVIDERCHAR, LEF_MANUFACTURINGGRID,
- LEF_USEMINSPACING, LEF_CLEARANCEMEASURE,
+ LEF_USEMINSPACING, LEF_CLEARANCEMEASURE, LEF_NOWIREEXTENSIONATPIN,
LEF_NAMESCASESENSITIVE, LEF_PROPERTYDEFS, LEF_UNITS,
LEF_SECTION_LAYER, LEF_SECTION_VIA, LEF_SECTION_VIARULE,
- LEF_SECTION_SPACING, LEF_SECTION_SITE, LEF_PROPERTY,
- LEF_NOISETABLE, LEF_CORRECTIONTABLE, LEF_IRDROP,
+ LEF_SECTION_NONDEFAULTRULE, LEF_SECTION_SPACING, LEF_SECTION_SITE,
+ LEF_PROPERTY, LEF_NOISETABLE, LEF_CORRECTIONTABLE, LEF_IRDROP,
LEF_ARRAY, LEF_SECTION_TIMING, LEF_EXTENSION, LEF_MACRO,
LEF_END};
/*
@@ -2592,7 +2595,7 @@ enum lef_layer_keys {LEF_LAYER_TYPE=0, LEF_LAYER_WIDTH,
LEF_LAYER_MINWIDTH, LEF_LAYER_MAXWIDTH, LEF_LAYER_AREA,
LEF_LAYER_SPACING, LEF_LAYER_SPACINGTABLE,
LEF_LAYER_PITCH, LEF_LAYER_DIRECTION, LEF_LAYER_OFFSET,
- LEF_LAYER_WIREEXT,
+ LEF_LAYER_FOREIGN, LEF_LAYER_WIREEXT,
LEF_LAYER_RES, LEF_LAYER_CAP, LEF_LAYER_EDGECAP,
LEF_LAYER_THICKNESS, LEF_LAYER_HEIGHT, LEF_LAYER_MINIMUMCUT,
LEF_LAYER_MINDENSITY, LEF_LAYER_ACDENSITY, LEF_LAYER_DCDENSITY,
@@ -2643,6 +2646,7 @@ LefReadLayerSection(f, lname, mode, lefl)
"PITCH",
"DIRECTION",
"OFFSET",
+ "FOREIGN",
"WIREEXTENSION",
"RESISTANCE",
"CAPACITANCE",
@@ -2786,6 +2790,7 @@ LefReadLayerSection(f, lname, mode, lefl)
}
LefEndStatement(f);
break;
+ case LEF_LAYER_FOREIGN:
case LEF_LAYER_MAXWIDTH:
// Not handled.
LefEndStatement(f);
@@ -3034,6 +3039,7 @@ LefReadLayerSection(f, lname, mode, lefl)
else
lefl->info.route.method = CALC_AGG_SIDEAREA;
LefEndStatement(f);
+ break;
case LEF_LAYER_ANTENNADIFF:
case LEF_LAYER_AGG_ANTENNADIFF:
/* Not specifically handling these antenna types */
@@ -3262,12 +3268,22 @@ LefAssignLayerVias()
if (lefl->info.via.generated == TRUE) {
/* Find the base layer and set hasGenerate[] for that layer */
baselayer = lefl->info.via.area.layer;
- if (lefl->info.via.lr)
+ if (lefl->info.via.lr) {
+ if (lefl->info.via.lr->layer < 0) {
+ lefl->info.via.generated = FALSE;
+ continue;
+ }
if ((baselayer < 0) || (lefl->info.via.lr->layer < baselayer))
baselayer = lefl->info.via.lr->layer;
- if (lefl->info.via.lr->next)
+ }
+ if (lefl->info.via.lr->next) {
+ if (lefl->info.via.lr->next->layer < 0) {
+ lefl->info.via.generated = FALSE;
+ continue;
+ }
if ((baselayer < 0) || (lefl->info.via.lr->next->layer < baselayer))
baselayer = lefl->info.via.lr->next->layer;
+ }
if ((baselayer >= 0) && (baselayer < MAX_LAYERS))
hasGenerate[baselayer] = TRUE;
}
@@ -3488,12 +3504,14 @@ LefRead(inName)
"MANUFACTURINGGRID",
"USEMINSPACING",
"CLEARANCEMEASURE",
+ "NOWIREEXTENSIONATPIN",
"NAMESCASESENSITIVE",
"PROPERTYDEFINITIONS",
"UNITS",
"LAYER",
"VIA",
"VIARULE",
+ "NONDEFAULTRULE",
"SPACING",
"SITE",
"PROPERTY",
@@ -3547,6 +3565,7 @@ LefRead(inName)
case LEF_CLEARANCEMEASURE:
case LEF_USEMINSPACING:
case LEF_NAMESCASESENSITIVE:
+ case LEF_NOWIREEXTENSIONATPIN:
LefEndStatement(f);
break;
case LEF_MANUFACTURINGGRID:
@@ -3561,6 +3580,11 @@ LefRead(inName)
case LEF_UNITS:
LefSkipSection(f, sections[LEF_UNITS]);
break;
+ case LEF_SECTION_NONDEFAULTRULE:
+ token = LefNextToken(f, TRUE);
+ sprintf(tsave, "%.127s", token);
+ LefSkipSection(f, tsave);
+ break;
case LEF_SECTION_VIA:
case LEF_SECTION_VIARULE: