diff --git a/src/buddies/src/bd/bdReaderOptions.cc b/src/buddies/src/bd/bdReaderOptions.cc index 925212796..270d6f97b 100644 --- a/src/buddies/src/bd/bdReaderOptions.cc +++ b/src/buddies/src/bd/bdReaderOptions.cc @@ -97,6 +97,9 @@ GenericReaderOptions::GenericReaderOptions () m_lefdef_produce_lef_pins = load_options.get_option_by_name ("lefdef_config.produce_lef_pins").to_bool (); m_lefdef_lef_pins_suffix = load_options.get_option_by_name ("lefdef_config.lef_pins_suffix_str").to_string (); m_lefdef_lef_pins_datatype = load_options.get_option_by_name ("lefdef_config.lef_pins_datatype_str").to_string (); + m_lefdef_produce_fills = load_options.get_option_by_name ("lefdef_config.produce_fills").to_bool (); + m_lefdef_fills_suffix = load_options.get_option_by_name ("lefdef_config.fills_suffix_str").to_string (); + m_lefdef_fills_datatype = load_options.get_option_by_name ("lefdef_config.fills_datatype_str").to_string (); m_lefdef_produce_obstructions = load_options.get_option_by_name ("lefdef_config.produce_obstructions").to_bool (); m_lefdef_obstruction_suffix = load_options.get_option_by_name ("lefdef_config.obstructions_suffix").to_string (); m_lefdef_obstruction_datatype = load_options.get_option_by_name ("lefdef_config.obstructions_datatype").to_int (); @@ -500,6 +503,20 @@ GenericReaderOptions::add_options (tl::CommandLineOptions &cmd) "The LEF pin geometry generation and layer mapping is designed in the same way than via geometry mapping. " "See '--" + m_long_prefix + "lefdef-produce-via-geometry' for a description of the mapping scheme.\n" ) + << tl::arg (group + + "#!--" + m_long_prefix + "lefdef-dont-produce-fills", &m_lefdef_produce_fills, "Skips fills when producing geometry", + "If this option is given, no fill geometry will be produced." + ) + << tl::arg (group + + "#--" + m_long_prefix + "lefdef-fills-suffix", &m_lefdef_fills_suffix, "Specifies the fill geometry layer suffix in pattern-based mode", + "The fill geometry generation and layer mapfillg is designed in the same way than via geometry mapfillg. " + "See '--" + m_long_prefix + "lefdef-via-geometry-suffix' for a description of the mapfillg scheme.\n" + ) + << tl::arg (group + + "#--" + m_long_prefix + "lefdef-fills-datatype", &m_lefdef_fills_datatype, "Specifies the fill geometry layer datatype in pattern-based mode", + "The fill geometry generation and layer mapfillg is designed in the same way than via geometry mapfillg. " + "See '--" + m_long_prefix + "lefdef-produce-via-geometry' for a description of the mapfillg scheme.\n" + ) << tl::arg (group + "#!--" + m_long_prefix + "lefdef-dont-produce-routing", &m_lefdef_produce_routing, "Skips routing when producing geometry", "If this option is given, no routing geometry will be produced." diff --git a/src/buddies/src/bd/bdReaderOptions.h b/src/buddies/src/bd/bdReaderOptions.h index ac4cf2acf..2f877dc00 100644 --- a/src/buddies/src/bd/bdReaderOptions.h +++ b/src/buddies/src/bd/bdReaderOptions.h @@ -161,6 +161,9 @@ private: bool m_lefdef_produce_lef_pins; std::string m_lefdef_lef_pins_suffix; std::string m_lefdef_lef_pins_datatype; + bool m_lefdef_produce_fills; + std::string m_lefdef_fills_suffix; + std::string m_lefdef_fills_datatype; bool m_lefdef_produce_obstructions; std::string m_lefdef_obstruction_suffix; int m_lefdef_obstruction_datatype; diff --git a/src/plugins/streamers/lefdef/db_plugin/dbDEFImporter.cc b/src/plugins/streamers/lefdef/db_plugin/dbDEFImporter.cc index 68ec18f34..bc97a32da 100644 --- a/src/plugins/streamers/lefdef/db_plugin/dbDEFImporter.cc +++ b/src/plugins/streamers/lefdef/db_plugin/dbDEFImporter.cc @@ -1426,10 +1426,12 @@ DEFImporter::do_read (db::Layout &layout) take (); } } else if (test ("FILLS")) { + // read over FILLS statements while (! test ("END") || ! test ("FILLS")) { take (); } + } else if (test ("SCANCHAINS")) { // read over SCANCHAINS statements while (! test ("END") || ! test ("SCANCHAINS")) { diff --git a/src/plugins/streamers/lefdef/db_plugin/dbDEFImporter.h b/src/plugins/streamers/lefdef/db_plugin/dbDEFImporter.h index cbfb9c83a..c5f26970b 100644 --- a/src/plugins/streamers/lefdef/db_plugin/dbDEFImporter.h +++ b/src/plugins/streamers/lefdef/db_plugin/dbDEFImporter.h @@ -82,6 +82,7 @@ private: void read_regions (std::map > ®ions, double scale); void read_groups (std::list &groups, double scale); void read_blockages (db::Layout &layout, db::Cell &design, double scale); + void read_fills (db::Layout &layout, db::Cell &design, double scale); void read_nets (db::Layout &layout, db::Cell &design, double scale, bool specialnets); void read_vias (db::Layout &layout, db::Cell &design, double scale); void read_pins (db::Layout &layout, db::Cell &design, double scale); diff --git a/src/plugins/streamers/lefdef/db_plugin/dbLEFDEFImporter.cc b/src/plugins/streamers/lefdef/db_plugin/dbLEFDEFImporter.cc index 615b8f556..97f75ce09 100644 --- a/src/plugins/streamers/lefdef/db_plugin/dbLEFDEFImporter.cc +++ b/src/plugins/streamers/lefdef/db_plugin/dbLEFDEFImporter.cc @@ -425,6 +425,9 @@ LEFDEFReaderOptions::LEFDEFReaderOptions () m_produce_lef_pins (true), m_lef_pins_suffix (".PIN"), m_lef_pins_datatype (2), + m_produce_fills (true), + m_fills_suffix (".FILL"), + m_fills_datatype (5), m_produce_obstructions (true), m_obstructions_suffix (".OBS"), m_obstructions_datatype (3), @@ -489,6 +492,11 @@ LEFDEFReaderOptions &LEFDEFReaderOptions::operator= (const LEFDEFReaderOptions & m_lef_pins_suffixes = d.m_lef_pins_suffixes; m_lef_pins_datatype = d.m_lef_pins_datatype; m_lef_pins_datatypes = d.m_lef_pins_datatypes; + m_produce_fills = d.m_produce_fills; + m_fills_suffix = d.m_fills_suffix; + m_fills_suffixes = d.m_fills_suffixes; + m_fills_datatype = d.m_fills_datatype; + m_fills_datatypes = d.m_fills_datatypes; m_produce_obstructions = d.m_produce_obstructions; m_obstructions_suffix = d.m_obstructions_suffix; m_obstructions_datatype = d.m_obstructions_datatype; @@ -711,6 +719,30 @@ LEFDEFReaderOptions::lef_pins_datatype_str () const return get_datatypes (this, &LEFDEFReaderOptions::lef_pins_datatype, &LEFDEFReaderOptions::lef_pins_datatype_per_mask, max_mask_number ()); } +void +LEFDEFReaderOptions::set_fills_suffix_str (const std::string &s) +{ + set_suffixes (this, &LEFDEFReaderOptions::clear_fills_suffixes_per_mask, &LEFDEFReaderOptions::set_fills_suffix, &LEFDEFReaderOptions::set_fills_suffix_per_mask, s); +} + +std::string +LEFDEFReaderOptions::fills_suffix_str () const +{ + return get_suffixes (this, &LEFDEFReaderOptions::fills_suffix, &LEFDEFReaderOptions::fills_suffix_per_mask, max_mask_number ()); +} + +void +LEFDEFReaderOptions::set_fills_datatype_str (const std::string &s) +{ + set_datatypes (this, &LEFDEFReaderOptions::clear_fills_datatypes_per_mask, &LEFDEFReaderOptions::set_fills_datatype, &LEFDEFReaderOptions::set_fills_datatype_per_mask, s); +} + +std::string +LEFDEFReaderOptions::fills_datatype_str () const +{ + return get_datatypes (this, &LEFDEFReaderOptions::fills_datatype, &LEFDEFReaderOptions::fills_datatype_per_mask, max_mask_number ()); +} + void LEFDEFReaderOptions::set_routing_suffix_str (const std::string &s) { @@ -835,6 +867,8 @@ LEFDEFReaderState::read_map_file (const std::string &path, db::Layout &layout) std::map purpose_translation; purpose_translation ["LEFPIN"] = LEFPins; purpose_translation ["PIN"] = Pins; + purpose_translation ["FILL"] = Fills; + purpose_translation ["FILLOPC"] = FillsOPC; purpose_translation ["LEFOBS"] = Obstructions; purpose_translation ["SPNET"] = SpecialRouting; purpose_translation ["NET"] = Routing; @@ -1091,6 +1125,10 @@ static std::string purpose_to_name (LayerPurpose purpose) return "LABEL"; case Pins: return "PIN"; + case Fills: + return "FILL"; + case FillsOPC: + return "FILLOPC"; case LEFPins: return "LEFPIN"; case Obstructions: @@ -1262,6 +1300,10 @@ std::set LEFDEFReaderState::open_layer_uncached(db::Layout &layout case Pins: produce = mp_tech_comp->produce_pins (); break; + case Fills: + case FillsOPC: + produce = mp_tech_comp->produce_fills (); + break; case LEFPins: produce = mp_tech_comp->produce_lef_pins (); break; @@ -1303,6 +1345,11 @@ std::set LEFDEFReaderState::open_layer_uncached(db::Layout &layout name_suffix = mp_tech_comp->pins_suffix_per_mask (mask); dt = mp_tech_comp->pins_datatype_per_mask (mask); break; + case Fills: + case FillsOPC: + name_suffix = mp_tech_comp->fills_suffix_per_mask (mask); + dt = mp_tech_comp->fills_datatype_per_mask (mask); + break; case LEFPins: name_suffix = mp_tech_comp->lef_pins_suffix_per_mask (mask); dt = mp_tech_comp->lef_pins_datatype_per_mask (mask); diff --git a/src/plugins/streamers/lefdef/db_plugin/dbLEFDEFImporter.h b/src/plugins/streamers/lefdef/db_plugin/dbLEFDEFImporter.h index 9ae66d983..7a85c62b1 100644 --- a/src/plugins/streamers/lefdef/db_plugin/dbLEFDEFImporter.h +++ b/src/plugins/streamers/lefdef/db_plugin/dbLEFDEFImporter.h @@ -476,6 +476,72 @@ public: set_per_mask_value (m_lef_pins_datatypes, mask, s); } + bool produce_fills () const + { + return m_produce_fills; + } + + void set_produce_fills (bool f) + { + m_produce_fills = f; + } + + const std::string &fills_suffix () const + { + return m_fills_suffix; + } + + void set_fills_suffix (const std::string &s) + { + m_fills_suffix = s; + } + + int fills_datatype () const + { + return m_fills_datatype; + } + + void set_fills_datatype (int s) + { + m_fills_datatype = s; + } + + void set_fills_suffix_str (const std::string &s); + std::string fills_suffix_str () const; + + void set_fills_datatype_str (const std::string &s); + std::string fills_datatype_str () const; + + void clear_fills_suffixes_per_mask () + { + m_fills_suffixes.clear (); + } + + void clear_fills_datatypes_per_mask () + { + m_fills_datatypes.clear (); + } + + const std::string &fills_suffix_per_mask (unsigned int mask) const + { + return per_mask_value (m_fills_suffixes, m_fills_suffix, mask); + } + + void set_fills_suffix_per_mask (unsigned int mask, const std::string &s) + { + set_per_mask_value (m_fills_suffixes, mask, s); + } + + int fills_datatype_per_mask (unsigned int mask) const + { + return per_mask_value (m_fills_datatypes, m_fills_datatype, mask); + } + + void set_fills_datatype_per_mask (unsigned int mask, int s) + { + set_per_mask_value (m_fills_datatypes, mask, s); + } + bool produce_obstructions () const { return m_produce_obstructions; @@ -707,6 +773,8 @@ public: get_max_mask_number (mm, m_pins_datatypes); get_max_mask_number (mm, m_lef_pins_suffixes); get_max_mask_number (mm, m_lef_pins_datatypes); + get_max_mask_number (mm, m_fills_suffixes); + get_max_mask_number (mm, m_fills_datatypes); get_max_mask_number (mm, m_routing_suffixes); get_max_mask_number (mm, m_routing_datatypes); get_max_mask_number (mm, m_special_routing_suffixes); @@ -841,6 +909,11 @@ private: int m_lef_pins_datatype; std::map m_lef_pins_suffixes; std::map m_lef_pins_datatypes; + bool m_produce_fills; + std::string m_fills_suffix; + int m_fills_datatype; + std::map m_fills_suffixes; + std::map m_fills_datatypes; bool m_produce_obstructions; std::string m_obstructions_suffix; int m_obstructions_datatype; @@ -875,6 +948,8 @@ enum LayerPurpose { Routing = 0, // from DEF only Pins, // from DEF + Fills, // from DEF + FillsOPC, // from DEF SpecialRouting, // from DEF only LEFPins, // from LEF ViaGeometry, // from LEF+DEF diff --git a/src/plugins/streamers/lefdef/db_plugin/dbLEFDEFPlugin.cc b/src/plugins/streamers/lefdef/db_plugin/dbLEFDEFPlugin.cc index 6a099a0cb..30d50f357 100644 --- a/src/plugins/streamers/lefdef/db_plugin/dbLEFDEFPlugin.cc +++ b/src/plugins/streamers/lefdef/db_plugin/dbLEFDEFPlugin.cc @@ -339,6 +339,13 @@ class LEFDEFFormatDeclaration // new: tl::make_member (&LEFDEFReaderOptions::lef_pins_suffix_str, &LEFDEFReaderOptions::set_lef_pins_suffix_str, "special-lef_pins-suffix-string") + tl::make_member (&LEFDEFReaderOptions::lef_pins_datatype_str, &LEFDEFReaderOptions::set_lef_pins_datatype_str, "special-lef_pins-datatype-string") + + tl::make_member (&LEFDEFReaderOptions::produce_fills, &LEFDEFReaderOptions::set_produce_fills, "produce-fills") + + // for backward compatibility + tl::make_member (&LEFDEFReaderOptions::set_fills_suffix, "special-fills-suffix") + + tl::make_member (&LEFDEFReaderOptions::set_fills_datatype, "special-fills-datatype") + + // new: + tl::make_member (&LEFDEFReaderOptions::fills_suffix_str, &LEFDEFReaderOptions::set_fills_suffix_str, "special-fills-suffix-string") + + tl::make_member (&LEFDEFReaderOptions::fills_datatype_str, &LEFDEFReaderOptions::set_fills_datatype_str, "special-fills-datatype-string") + tl::make_member (&LEFDEFReaderOptions::produce_obstructions, &LEFDEFReaderOptions::set_produce_obstructions, "produce-obstructions") + tl::make_member (&LEFDEFReaderOptions::obstructions_suffix, &LEFDEFReaderOptions::set_obstructions_suffix, "obstructions-suffix") + tl::make_member (&LEFDEFReaderOptions::obstructions_datatype, &LEFDEFReaderOptions::set_obstructions_datatype, "obstructions-datatype") + diff --git a/src/plugins/streamers/lefdef/db_plugin/gsiDeclDbLEFDEF.cc b/src/plugins/streamers/lefdef/db_plugin/gsiDeclDbLEFDEF.cc index 99533c8fc..44b1279e7 100644 --- a/src/plugins/streamers/lefdef/db_plugin/gsiDeclDbLEFDEF.cc +++ b/src/plugins/streamers/lefdef/db_plugin/gsiDeclDbLEFDEF.cc @@ -502,6 +502,94 @@ gsi::Class decl_lefdef_config ("db", "LEFDEFReaderConfi gsi::method ("lef_pins_datatype_str=", &db::LEFDEFReaderOptions::set_lef_pins_datatype_str, gsi::arg ("datatype"), "@hide" ) + + gsi::method ("produce_fills", &db::LEFDEFReaderOptions::produce_fills, + "@brief Gets a value indicating whether fill geometries shall be produced.\n" + "See \\produce_via_geometry for details about the layer production rules." + "\n\n" + "Fill support has been introduced in version 0.27." + ) + + gsi::method ("produce_fills=", &db::LEFDEFReaderOptions::set_produce_fills, gsi::arg ("produce"), + "@brief Sets a value indicating whether fill geometries shall be produced.\n" + "See \\produce_via_geometry for details about the layer production rules." + "\n\n" + "Fill support has been introduced in version 0.27." + ) + + gsi::method ("fills_suffix", &db::LEFDEFReaderOptions::fills_suffix, + "@brief Gets the fill geometry layer name suffix.\n" + "See \\produce_via_geometry for details about the layer production rules." + "\n\n" + "Fill support has been introduced in version 0.27." + ) + + gsi::method ("fills_suffix=", &db::LEFDEFReaderOptions::set_fills_suffix, gsi::arg ("suffix"), + "@brief Sets the fill geometry layer name suffix.\n" + "See \\produce_via_geometry for details about the layer production rules." + "\n\n" + "Fill support has been introduced in version 0.27." + ) + + gsi::method ("fills_datatype", &db::LEFDEFReaderOptions::fills_datatype, + "@brief Gets the fill geometry layer datatype value.\n" + "See \\produce_via_geometry for details about the layer production rules." + "\n\n" + "Fill support has been introduced in version 0.27." + ) + + gsi::method ("fills_datatype=", &db::LEFDEFReaderOptions::set_fills_datatype, gsi::arg ("datatype"), + "@brief Sets the fill geometry layer datatype value.\n" + "See \\produce_via_geometry for details about the layer production rules." + "\n\n" + "Fill support has been introduced in version 0.27." + ) + + gsi::method ("clear_fills_suffixes_per_mask", &db::LEFDEFReaderOptions::clear_fills_suffixes_per_mask, + "@brief Clears the fill layer name suffix per mask.\n" + "See \\produce_via_geometry for details about this property.\n" + "\n\n" + "Mask specific rules have been introduced in version 0.27." + ) + + gsi::method ("clear_fill_datatypes_per_mask", &db::LEFDEFReaderOptions::clear_fills_datatypes_per_mask, + "@brief Clears the fill layer datatypes per mask.\n" + "See \\produce_via_geometry for details about this property.\n" + "\n\n" + "Mask specific rules have been introduced in version 0.27." + ) + + gsi::method ("fills_suffix_per_mask", &db::LEFDEFReaderOptions::fills_suffix_per_mask, gsi::arg ("mask"), + "@brief Gets the fill geometry layer name suffix per mask.\n" + "See \\produce_via_geometry for details about the layer production rules." + "The mask number is a zero-based mask index (0: MASK 1, 1: MASK 2 ...)." + "\n\n" + "Mask specific rules have been introduced in version 0.27." + ) + + gsi::method ("set_fills_suffix_per_mask", &db::LEFDEFReaderOptions::set_fills_suffix_per_mask, gsi::arg ("mask"), gsi::arg ("suffix"), + "@brief Sets the fill geometry layer name suffix per mask.\n" + "See \\produce_via_geometry for details about the layer production rules." + "The mask number is a zero-based mask index (0: MASK 1, 1: MASK 2 ...)." + "\n\n" + "Mask specific rules have been introduced in version 0.27." + ) + + gsi::method ("fills_datatype", &db::LEFDEFReaderOptions::fills_datatype_per_mask, + "@brief Gets the fill geometry layer datatype value per mask.\n" + "See \\produce_via_geometry for details about the layer production rules." + "The mask number is a zero-based mask index (0: MASK 1, 1: MASK 2 ...)." + "\n\n" + "Mask specific rules have been introduced in version 0.27." + ) + + gsi::method ("set_fills_datatype_per_mask", &db::LEFDEFReaderOptions::set_fills_datatype_per_mask, gsi::arg ("mask"), gsi::arg ("datatype"), + "@brief Sets the fill geometry layer datatype value.\n" + "See \\produce_via_geometry for details about the layer production rules." + "The mask number is a zero-based mask index (0: MASK 1, 1: MASK 2 ...)." + "\n\n" + "Mask specific rules have been introduced in version 0.27." + ) + + gsi::method ("fills_suffix_str", &db::LEFDEFReaderOptions::fills_suffix_str, + "@hide" + ) + + gsi::method ("fills_suffix_str=", &db::LEFDEFReaderOptions::set_fills_suffix_str, gsi::arg ("suffix"), + "@hide" + ) + + gsi::method ("fills_datatype_str", &db::LEFDEFReaderOptions::fills_datatype_str, + "@hide" + ) + + gsi::method ("fills_datatype_str=", &db::LEFDEFReaderOptions::set_fills_datatype_str, gsi::arg ("datatype"), + "@hide" + ) + gsi::method ("produce_obstructions", &db::LEFDEFReaderOptions::produce_obstructions, "@brief Gets a value indicating whether obstruction markers shall be produced.\n" "See \\produce_via_geometry for details about the layer production rules." diff --git a/src/plugins/streamers/lefdef/lay_plugin/LEFDEFTechnologyComponentEditor.ui b/src/plugins/streamers/lefdef/lay_plugin/LEFDEFTechnologyComponentEditor.ui index 73212cb25..1c8979355 100644 --- a/src/plugins/streamers/lefdef/lay_plugin/LEFDEFTechnologyComponentEditor.ui +++ b/src/plugins/streamers/lefdef/lay_plugin/LEFDEFTechnologyComponentEditor.ui @@ -33,1222 +33,1301 @@ 9 - - - - 0 - 0 - - - - LEF Files - - - true - - - - 6 - - - 9 - - - 4 - - - 9 - - - 4 - - - - - - 0 - 0 - - - - - 16 - 120 - - - - - 16777215 - 16777215 - - - - QFrame::NoFrame - - - QFrame::Raised - - - - 0 - - - 0 - - - 0 - - - 0 - - - 6 - - - - - Delete selected files - - - ... - - - - :/clear.png:/clear.png - - - - - - - - 0 - 0 - - - - QAbstractItemView::ExtendedSelection - - - - - - - Move selected files down - - - ... - - - - :/down.png:/down.png - - - - - - - Qt::Vertical - - - - 20 - 0 - - - - - - - - Add LEF file - - - ... - - - - :/add.png:/add.png - - - - - - - Move selected files up - - - ... - - - - :/up.png:/up.png - - - - - - - - - - for DEF: also read all LEF files in the same directory than the DEF file - - - - - - - - - - Options - - - true - - - - 4 - - - 4 - - - - - - 0 - 0 - - - - - - - - - 0 - 0 - - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - Groups - - - - - - - Layout DBU - - - - - - - Produce a parent cell per group - - - - - - - Qt::Horizontal - - - QSizePolicy::Fixed - - - - 5 - 20 - - - - - - - - Produce LEF geometry - - - - - - - LEF import into DEF - - - - - - - Via cell name prefix - - - - - - - - 1 - 0 - - - - µm - - - - - - - - - - Global Production Rules (specify what objects to produce and on what layers) - - - true - - - - 9 - - - 4 - - - 9 - - - 4 - - - 6 - - - - - - 50 - false - false - - - - Net names - - - - - - - - 0 - 0 - - - - - - - :/right.png - - - - - - - - 0 - 0 - - - - As properties with name ... - - - - - - - - 0 - 0 - - - - - - - - Qt::Vertical - - - - - - - - 0 - 0 - - - - - - - - - - - :/right.png - - - - - - - - 0 - 0 - - - - - - - - - 0 - 0 - - - - <html><body>(<a href="int:/about/variant_notation.xml">See here for the name notation</a>)</body></html> - - - Qt::AlignRight|Qt::AlignTop|Qt::AlignTrailing - - - - - - - - 0 - 0 - - - - - - - - - - - :/right.png - - - - - - - - 0 - 0 - - - - - - - - - - - :/right.png - - - - - - - - 0 - 0 - - - - Blockages (2*) - - - - - - - - 0 - 0 - - - - - - - :/right.png - - - - - - - - 50 - false - false - false - - - - Produce ... - - - - - - - Inst names - - - - - - - - 1 - 0 - - - - On layer with spec ... - - - Qt::AlignBottom|Qt::AlignLeading|Qt::AlignLeft - - - - - - - QFrame::NoFrame - - - QFrame::Raised - - - - 0 - - - 0 - - - 0 - - - 0 - - - - - - 0 - 0 - - - - Produce ... - - - - - - - - - - - 0 - 0 - - - - - - - - - 0 - 0 - - - - Regions (2*) - - - - - - - Pin names - - - - - - - - 0 - 0 - - - - Die area (2*) - - - - - - - - 0 - 0 - - - - - - - :/right.png - - - - - - - - 0 - 0 - - - - <html><body>(<a href="int:/about/layer_specs.xml">See here for the layer specification</a>)</body></html> - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - - - - - - + - 0 + 2 - + - Layer Map File + LEF Files - - - + + + - Layer map file + for DEF: also read all LEF files in the same directory than the DEF file - - - - ... + + + + Qt::Vertical - - false + + QSizePolicy::Fixed + + + + 20 + 6 + + + + + + + + Additional LEF files - - - - - - - If a layer map file is given, pattern based rules are ignored. -If used inside a technology, the file will be looked up relative to the technology's base path. -Otherwise it's looked up relative to the LEF or DEF file. - -(2*) Die area, Blockage and Region layers in map file will have priority over global production rules above. - - - true + + + + + 0 + 0 + + + + 6 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + 0 + 0 + + + + + 16 + 120 + + + + + 16777215 + 16777215 + + + + QFrame::NoFrame + + + QFrame::Raised + + + + 0 + + + 0 + + + 0 + + + 0 + + + 6 + + + + + Delete selected files + + + ... + + + + :/clear.png:/clear.png + + + + + + + + 0 + 0 + + + + QAbstractItemView::ExtendedSelection + + + + + + + Move selected files down + + + ... + + + + :/down.png:/down.png + + + + + + + Qt::Vertical + + + + 20 + 0 + + + + + + + + Add LEF file + + + ... + + + + :/add.png:/add.png + + + + + + + Move selected files up + + + ... + + + + :/up.png:/up.png + + + + + + + - - + + + + + Options + + + + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + Layout DBU + + + + + + + + 0 + 0 + + + + + + + + + 0 + 0 + + + + µm + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Groups + + + + + + + Produce a parent cell per group + + + + + + + Via cell name prefix + + + + + + + + 0 + 0 + + + + + + + + LEF import into DEF + + + + + + + Produce LEF geometry + + + + + + + + Qt::Vertical 20 - 278 + 40 - + - Pattern Based Layer Production Rules + Production - - - 0 - - - 0 - - - 0 - - - 0 - + - - - QFrame::NoFrame + + + Global Production Rules (specify what objects to produce and on what layers) - + true - - - - 0 - 0 - 616 - 375 - + + + 9 - - - - - - 0 - 0 - + + 4 + + + 9 + + + 4 + + + 6 + + + + + + 50 + false + false + + + + Net names + + + + + + + + 0 + 0 + + + + + + + :/right.png + + + + + + + + 0 + 0 + + + + As properties with name ... + + + + + + + + 0 + 0 + + + + + + + + Qt::Vertical + + + + + + + + 0 + 0 + + + + + + + + + + + :/right.png + + + + + + + + 0 + 0 + + + + + + + + + 0 + 0 + + + + <html><body>(<a href="int:/about/variant_notation.xml">See here for the name notation</a>)</body></html> + + + Qt::AlignRight|Qt::AlignTop|Qt::AlignTrailing + + + + + + + + 0 + 0 + + + + + + + + + + + :/right.png + + + + + + + + 0 + 0 + + + + + + + + + + + :/right.png + + + + + + + + 0 + 0 + + + + Blockages (2*) + + + + + + + + 0 + 0 + + + + + + + :/right.png + + + + + + + + 50 + false + false + false + + + + Produce ... + + + + + + + Inst names + + + + + + + + 1 + 0 + + + + On layer with spec ... + + + Qt::AlignBottom|Qt::AlignLeading|Qt::AlignLeft + + + + + + + QFrame::NoFrame + + + QFrame::Raised + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + 0 + 0 + + + + Produce ... + + + + + + + + + + + 0 + 0 + + + + + + + + + 0 + 0 + + + + Regions (2*) + + + + + + + Pin names + + + + + + + + 0 + 0 + + + + Die area (2*) + + + + + + + + 0 + 0 + + + + + + + :/right.png + + + + + + + + 0 + 0 + + + + <html><body>(<a href="int:/about/layer_specs.xml">See here for the layer specification</a>)</body></html> + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + + + + 0 + + + + Layer Map File + + + + + + Layer map file - - - 0 - - - 0 - - - 0 - - - 0 - - - - - - 0 - 0 - - - - - - - - - 0 - 0 - - - - - - - :/right.png - - - - - - - - 0 - 0 - - - - - - - - - 0 - 0 - - - - - - - - Special routing (*) - - - - - - - - 0 - 0 - - - - - - - - - 0 - 0 - - - - - - - - - 0 - 0 - - - - - - - - - 0 - 0 - - - - - - - :/right.png - - - - - - - - 0 - 0 - - - - - - - - - 0 - 0 - - - - - - - - - 0 - 0 - - - - - - - - - 0 - 0 - - - - - - - :/right.png - - - - - - - - 0 - 0 - - - - - - - :/right.png - - - - - - - Routing (*) - - - - - - - - 0 - 0 - - - - - - - - - 0 - 0 - - - - - - - :/right.png - - - - - - - - 0 - 0 - - - - - - - :/right.png - - - - - - - Via geometry (*) - - - - - - - Pin labels - - - - - - - LEF Pins (*) - - - - - - - Layer name -suffix ... - - - - - - - Pins (*) - - - - - - - - 0 - 0 - - - - - - - - - 0 - 0 - - - - - - - - GDS data- -type ... - - - - - - - - 0 - 0 - - - - - - - :/right.png - - - - - - - - 0 - 0 - - - - - - - - - 0 - 0 - - - - - - - - - 0 - 0 - - - - - - - - Blockages - - - - - - - Obstructions - - - - - - - - 0 - 0 - - - - - - - :/right.png - - - - - - - - 0 - 0 - - - - - - - - Layer name -suffix ... - - - - - - - GDS data- -type ... - - - - - - - Qt::Vertical - - - - - - + + - (*) Separate suffixes or datatypes can be given for different masks, using the following notation: -"x,1:y,2:z ..." (which will use x by default, y for MASK 1, z for MASK 2 etc.) + ... + + + false + + + + + + + + + + If a layer map file is given, pattern based rules are ignored. +If used inside a technology, the file will be looked up relative to the technology's base path. +Otherwise it's looked up relative to the LEF or DEF file. + +(2*) Die area, Blockage and Region layers in map file will have priority over global production rules above. true + + + + Qt::Vertical + + + + 20 + 278 + + + + + + + + + Pattern Based Layer Production Rules + + + + 0 + + + 0 + + + 0 + + + 0 + - - - - 0 - 1 - + + + QFrame::NoFrame - - Layer Mapping (filter/modify layers, assign GDS layer/datatypes) - - + true - - - 9 + + + + 0 + 0 + 609 + 591 + - - 4 - - - 9 - - - 4 - - - - - Read all layers (additionally to the ones in the mapping table) - - - - - - - - 0 - 1 - - - - - 16 - 0 - - - - QFrame::NoFrame - - - QFrame::Raised - - - - - - - Qt::Horizontal - - - - + + + + + + 0 + 0 + + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + 0 + 0 + + + + + + + + + 0 + 0 + + + + + + + :/right.png + + + + + + + + 0 + 0 + + + + + + + + + 0 + 0 + + + + + + + :/right.png + + + + + + + + 0 + 0 + + + + + + + + Fills (*) + + + + + + + Layer name +suffix ... + + + + + + + + 0 + 0 + + + + + + + + + 0 + 0 + + + + + + + + LEF Pins (*) + + + + + + + Layer name +suffix ... + + + + + + + + + + :/right.png + + + + + + + Via geometry (*) + + + + + + + + 0 + 0 + + + + + + + + + 0 + 0 + + + + + + + + + 0 + 0 + + + + + + + + + 0 + 0 + + + + + + + + GDS data- +type ... + + + + + + + + 0 + 0 + + + + + + + + + 0 + 0 + + + + + + + :/right.png + + + + + + + + 0 + 0 + + + + + + + + Pins (*) + + + + + + + + 0 + 0 + + + + + + + :/right.png + + + + + + + + 0 + 0 + + + + + + + + + 0 + 0 + + + + + + + + + 0 + 0 + + + + + + + :/right.png + + + + + + + Special routing (*) + + + + + + + Obstructions + + + + + + + + 0 + 0 + + + + + + + + + 0 + 0 + + + + + + + :/right.png + + + + + + + Pin labels + + + + + + + GDS data- +type ... + + + + + + + Routing (*) + + + + + + + + 0 + 0 + + + + + + + + + 0 + 0 + + + + + + + :/right.png + + + + + + + Qt::Vertical + + + + + + + + 0 + 0 + + + + + + + + Blockages + + + + + + + + 0 + 0 + + + + + + + :/right.png + + + + + + + + 0 + 0 + + + + + + + + + 0 + 0 + + + + + + + + + + + (*) Separate suffixes or datatypes can be given for different masks, using the following notation: +"x,1:y,2:z ..." (which will use x by default, y for MASK 1, z for MASK 2 etc.) + + + true + + + + + + + + 0 + 1 + + + + Layer Mapping (filter/modify layers, assign GDS layer/datatypes) + + + true + + + + 9 + + + 4 + + + 9 + + + 4 + + + + + Read all layers (additionally to the ones in the mapping table) + + + + + + + + 0 + 1 + + + + + 16 + 0 + + + + QFrame::NoFrame + + + QFrame::Raised + + + + + + + Qt::Horizontal + + + + + + + + @@ -1273,15 +1352,6 @@ type ... - lef_files - add_lef_file - del_lef_files - move_lef_files_up - move_lef_files_down - dbu - prefix_via_cellname - separate_groups - produce_lef_geo produce_net_names net_prop_name produce_inst_names @@ -1294,7 +1364,6 @@ type ... placement_blockage_layer produce_regions region_layer - layer_map_mode produce_via_geometry suffix_via_geometry datatype_via_geometry @@ -1316,9 +1385,6 @@ type ... produce_labels suffix_labels datatype_labels - produce_blockages - suffix_blockages - datatype_blockages mapfile_path browse_mapfile diff --git a/src/plugins/streamers/lefdef/lay_plugin/layLEFDEFImportDialogs.cc b/src/plugins/streamers/lefdef/lay_plugin/layLEFDEFImportDialogs.cc index 4c64e034f..1ebe6c8b8 100644 --- a/src/plugins/streamers/lefdef/lay_plugin/layLEFDEFImportDialogs.cc +++ b/src/plugins/streamers/lefdef/lay_plugin/layLEFDEFImportDialogs.cc @@ -354,6 +354,7 @@ LEFDEFReaderOptionsEditor::LEFDEFReaderOptionsEditor (QWidget *parent) connect (produce_via_geometry, SIGNAL (stateChanged (int)), this, SLOT (checkbox_changed ())); connect (produce_pins, SIGNAL (stateChanged (int)), this, SLOT (checkbox_changed ())); connect (produce_lef_pins, SIGNAL (stateChanged (int)), this, SLOT (checkbox_changed ())); + connect (produce_fills, SIGNAL (stateChanged (int)), this, SLOT (checkbox_changed ())); connect (produce_obstructions, SIGNAL (stateChanged (int)), this, SLOT (checkbox_changed ())); connect (produce_blockages, SIGNAL (stateChanged (int)), this, SLOT (checkbox_changed ())); connect (produce_routing, SIGNAL (stateChanged (int)), this, SLOT (checkbox_changed ())); @@ -493,6 +494,9 @@ LEFDEFReaderOptionsEditor::commit (db::FormatSpecificReaderOptions *options, con data->set_produce_lef_pins (produce_lef_pins->isChecked ()); data->set_lef_pins_suffix_str (tl::to_string (suffix_lef_pins->text ())); data->set_lef_pins_datatype_str (tl::to_string (datatype_lef_pins->text ())); + data->set_produce_fills (produce_fills->isChecked ()); + data->set_fills_suffix_str (tl::to_string (suffix_fills->text ())); + data->set_fills_datatype_str (tl::to_string (datatype_fills->text ())); data->set_produce_obstructions (produce_obstructions->isChecked ()); data->set_obstructions_suffix (tl::to_string (suffix_obstructions->text ())); data->set_obstructions_datatype (datatype_obstructions->text ().toInt ()); @@ -556,6 +560,9 @@ LEFDEFReaderOptionsEditor::setup (const db::FormatSpecificReaderOptions *options produce_lef_pins->setChecked (data->produce_lef_pins ()); suffix_lef_pins->setText (tl::to_qstring (data->lef_pins_suffix_str ())); datatype_lef_pins->setText (tl::to_qstring (data->lef_pins_datatype_str ())); + produce_fills->setChecked (data->produce_fills ()); + suffix_fills->setText (tl::to_qstring (data->fills_suffix_str ())); + datatype_fills->setText (tl::to_qstring (data->fills_datatype_str ())); produce_obstructions->setChecked (data->produce_obstructions ()); suffix_obstructions->setText (tl::to_qstring (data->obstructions_suffix ())); datatype_obstructions->setText (QString::number (data->obstructions_datatype ())); @@ -604,6 +611,7 @@ LEFDEFReaderOptionsEditor::checkbox_changed () suffix_via_geometry->setEnabled (produce_via_geometry->isChecked ()); suffix_pins->setEnabled (produce_pins->isChecked ()); suffix_lef_pins->setEnabled (produce_lef_pins->isChecked ()); + suffix_fills->setEnabled (produce_fills->isChecked ()); suffix_obstructions->setEnabled (produce_obstructions->isChecked ()); suffix_blockages->setEnabled (produce_blockages->isChecked ()); suffix_routing->setEnabled (produce_routing->isChecked ()); @@ -612,6 +620,7 @@ LEFDEFReaderOptionsEditor::checkbox_changed () datatype_via_geometry->setEnabled (produce_via_geometry->isChecked ()); datatype_pins->setEnabled (produce_pins->isChecked ()); datatype_lef_pins->setEnabled (produce_lef_pins->isChecked ()); + datatype_fills->setEnabled (produce_fills->isChecked ()); datatype_obstructions->setEnabled (produce_obstructions->isChecked ()); datatype_blockages->setEnabled (produce_blockages->isChecked ()); datatype_routing->setEnabled (produce_routing->isChecked ()); diff --git a/src/plugins/streamers/lefdef/unit_tests/dbLEFDEFImportTests.cc b/src/plugins/streamers/lefdef/unit_tests/dbLEFDEFImportTests.cc index 884253775..83e1b3f37 100644 --- a/src/plugins/streamers/lefdef/unit_tests/dbLEFDEFImportTests.cc +++ b/src/plugins/streamers/lefdef/unit_tests/dbLEFDEFImportTests.cc @@ -752,6 +752,16 @@ TEST(119_multimapping) ) } +TEST(120_simplefill) +{ + run_test (_this, "fill", "lef:simple.lef+def:simple.def+map:simple.map", "simple_au.oas.gz", default_options (), false); +} + +TEST(121_fillwithmask) +{ + run_test (_this, "fill", "lef:with_mask.lef+def:with_mask.def+map:with_mask.map", "with_mask_au.oas.gz", default_options (), false); +} + TEST(200_lefdef_plugin) { db::Layout ly;