diff options
Diffstat (limited to 'lef.c')
-rw-r--r-- | lef.c | 38 |
1 files changed, 31 insertions, 7 deletions
@@ -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: |