mirror of https://github.com/KLayout/klayout.git
added option to skip duplicate defined LEF MACROS during lef import
This commit is contained in:
parent
87060b4364
commit
592d65f9f6
|
|
@ -1069,7 +1069,7 @@ void
|
||||||
LEFDEFReaderState::ensure_lef_importer (int warn_level)
|
LEFDEFReaderState::ensure_lef_importer (int warn_level)
|
||||||
{
|
{
|
||||||
if (! mp_lef_importer.get ()) {
|
if (! mp_lef_importer.get ()) {
|
||||||
mp_lef_importer.reset (new db::LEFImporter (warn_level));
|
mp_lef_importer.reset (new db::LEFImporter (warn_level, true));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -896,6 +896,16 @@ public:
|
||||||
m_map_files = f;
|
m_map_files = f;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool skip_duplicate_macros () const
|
||||||
|
{
|
||||||
|
return m_skip_duplicate_macros;
|
||||||
|
}
|
||||||
|
|
||||||
|
void set_skip_duplicate_macros (bool v)
|
||||||
|
{
|
||||||
|
m_skip_duplicate_macros = v;
|
||||||
|
}
|
||||||
|
|
||||||
std::string single_map_file () const
|
std::string single_map_file () const
|
||||||
{
|
{
|
||||||
return m_map_files.empty () ? std::string () : m_map_files.front ();
|
return m_map_files.empty () ? std::string () : m_map_files.front ();
|
||||||
|
|
@ -1055,6 +1065,7 @@ private:
|
||||||
bool m_separate_groups;
|
bool m_separate_groups;
|
||||||
bool m_joined_paths;
|
bool m_joined_paths;
|
||||||
std::vector<std::string> m_map_files;
|
std::vector<std::string> m_map_files;
|
||||||
|
bool m_skip_duplicate_macros;
|
||||||
unsigned int m_macro_resolution_mode;
|
unsigned int m_macro_resolution_mode;
|
||||||
bool m_read_lef_with_def;
|
bool m_read_lef_with_def;
|
||||||
std::vector<std::string> m_lef_files;
|
std::vector<std::string> m_lef_files;
|
||||||
|
|
|
||||||
|
|
@ -142,7 +142,7 @@ LEFDEFReader::read_lefdef (db::Layout &layout, const db::LoadLayoutOptions &opti
|
||||||
|
|
||||||
tl::SelfTimer timer (tl::verbosity () >= 21, tl::to_string (tr ("Reading LEF file")));
|
tl::SelfTimer timer (tl::verbosity () >= 21, tl::to_string (tr ("Reading LEF file")));
|
||||||
|
|
||||||
db::LEFImporter importer (warn_level ());
|
db::LEFImporter importer (warn_level (), effective_options.skip_duplicate_macros ());
|
||||||
|
|
||||||
for (std::vector<std::string>::const_iterator l = effective_options.begin_lef_files (); l != effective_options.end_lef_files (); ++l) {
|
for (std::vector<std::string>::const_iterator l = effective_options.begin_lef_files (); l != effective_options.end_lef_files (); ++l) {
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -33,8 +33,9 @@ namespace db
|
||||||
// -----------------------------------------------------------------------------------
|
// -----------------------------------------------------------------------------------
|
||||||
// LEFImporter implementation
|
// LEFImporter implementation
|
||||||
|
|
||||||
LEFImporter::LEFImporter (int warn_level)
|
LEFImporter::LEFImporter (int warn_level, bool skip_duplicate_macros)
|
||||||
: LEFDEFImporter (warn_level)
|
: LEFDEFImporter (warn_level),
|
||||||
|
m_skip_duplicate_macros (skip_duplicate_macros)
|
||||||
{
|
{
|
||||||
// .. nothing yet ..
|
// .. nothing yet ..
|
||||||
}
|
}
|
||||||
|
|
@ -886,7 +887,58 @@ LEFImporter::read_macro (Layout &layout)
|
||||||
std::string mn = get ();
|
std::string mn = get ();
|
||||||
|
|
||||||
if (m_macros.find (mn) != m_macros.end ()) {
|
if (m_macros.find (mn) != m_macros.end ()) {
|
||||||
error (tl::to_string (tr ("Duplicate MACRO name: ")) + mn);
|
if (m_skip_duplicate_macros) {
|
||||||
|
// 1. Change error to warning
|
||||||
|
warn (tl::to_string (tr ("Duplicate MACRO name: ")) + mn + tl::to_string (tr (" (Skipping duplicate)")));
|
||||||
|
|
||||||
|
// Safe LEF block skipping
|
||||||
|
while (! at_end ()) {
|
||||||
|
|
||||||
|
if (test ("END")) {
|
||||||
|
expect (mn);
|
||||||
|
break;
|
||||||
|
} else if (test ("PIN")) {
|
||||||
|
std::string pn = get (); // PIN always has a pin-name -> skip it
|
||||||
|
//tl::info << tl::to_string (tr ("Found PIN : ")) + pn;
|
||||||
|
while (! at_end ()) {
|
||||||
|
if (test ("PORT")) {
|
||||||
|
//tl::info << tl::to_string (tr ("Found PORT within ")) + pn;
|
||||||
|
while (! at_end ()) {
|
||||||
|
if (test ("END")) {
|
||||||
|
//tl::info << tl::to_string (tr ("Found PORT END within ")) + pn;
|
||||||
|
break;
|
||||||
|
} else {
|
||||||
|
skip_entry ();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else if (test ("END")) {
|
||||||
|
std::string pn = get (); // PIN always has a pin-name -> skip it
|
||||||
|
//tl::info << tl::to_string (tr ("Found PIN END : ")) + pn;
|
||||||
|
break;
|
||||||
|
} else {
|
||||||
|
skip_entry ();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else if (test ("OBS")) {
|
||||||
|
//tl::info << tl::to_string (tr ("Found OBS"));
|
||||||
|
while (! at_end ()) {
|
||||||
|
if (test ("END")) {
|
||||||
|
//tl::info << tl::to_string (tr ("Found END OBS"));
|
||||||
|
break;
|
||||||
|
} else {
|
||||||
|
skip_entry ();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
skip_entry ();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
tl::info << tl::to_string (tr ("Successfully skipped duplicate MACRO: ")) + mn;
|
||||||
|
|
||||||
|
return; // Exit early so we don't register or process this duplicate
|
||||||
|
} else {
|
||||||
|
error (tl::to_string (tr ("Duplicate MACRO name: ")) + mn);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
set_cellname (mn);
|
set_cellname (mn);
|
||||||
|
|
|
||||||
|
|
@ -50,7 +50,7 @@ public:
|
||||||
/**
|
/**
|
||||||
* @brief Default constructor
|
* @brief Default constructor
|
||||||
*/
|
*/
|
||||||
LEFImporter (int warn_level);
|
LEFImporter (int warn_level, bool skip_duplicate_macros);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Destructor
|
* @brief Destructor
|
||||||
|
|
@ -169,6 +169,8 @@ private:
|
||||||
void read_layer (Layout &layout);
|
void read_layer (Layout &layout);
|
||||||
void read_macro (Layout &layout);
|
void read_macro (Layout &layout);
|
||||||
void skip_entry ();
|
void skip_entry ();
|
||||||
|
|
||||||
|
bool m_skip_duplicate_macros;
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -967,6 +967,19 @@ gsi::Class<db::LEFDEFReaderOptions> decl_lefdef_config ("db", "LEFDEFReaderConfi
|
||||||
"\n"
|
"\n"
|
||||||
"This property has been added in version 0.27. The ability to supply multiple files has been added in version 0.30.6.\n"
|
"This property has been added in version 0.27. The ability to supply multiple files has been added in version 0.30.6.\n"
|
||||||
) +
|
) +
|
||||||
|
gsi::method ("skip_duplicate_macros", &db::LEFDEFReaderOptions::skip_duplicate_macros,
|
||||||
|
"@brief Get the setting for wether to skip douplicate LEF Macro definitions.\n"
|
||||||
|
"This property describes what to do when while reading LEF files douplicate MACRO definitions are "
|
||||||
|
"discovered. Normally an error is issued and the import fails. When setting this flag to true a"
|
||||||
|
"warning is issued and the macro definition is skipped. So always the first definition of MACRO is used.\n"
|
||||||
|
"\n"
|
||||||
|
"This property has been added in version 0.30.x.\n"
|
||||||
|
) +
|
||||||
|
gsi::method ("skip_duplicate_macros=", &db::LEFDEFReaderOptions::set_skip_duplicate_macros, gsi::arg ("skip_duplicate_macros"),
|
||||||
|
"@brief Sets mode how to handle douplicate MARCO definitions.\n"
|
||||||
|
"\n"
|
||||||
|
"This property has been added in version 0.30.x.\n"
|
||||||
|
) +
|
||||||
gsi::method ("macro_resolution_mode", &db::LEFDEFReaderOptions::macro_resolution_mode,
|
gsi::method ("macro_resolution_mode", &db::LEFDEFReaderOptions::macro_resolution_mode,
|
||||||
"@brief Gets the macro resolution mode (LEF macros into DEF).\n"
|
"@brief Gets the macro resolution mode (LEF macros into DEF).\n"
|
||||||
"This property describes the way LEF macros are turned into layout cells when reading DEF. There "
|
"This property describes the way LEF macros are turned into layout cells when reading DEF. There "
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue