LEF/DEF: preparations for FILLS support, UI rearrangement.

This commit is contained in:
Matthias Koefferlein 2021-02-21 17:28:58 +01:00
parent 7f7a3324d9
commit 96e3570c6d
11 changed files with 1505 additions and 1180 deletions

View File

@ -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."

View File

@ -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;

View File

@ -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")) {

View File

@ -82,6 +82,7 @@ private:
void read_regions (std::map<std::string, std::vector<db::Polygon> > &regions, double scale);
void read_groups (std::list<DEFImporterGroup> &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);

View File

@ -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<std::string, LayerPurpose> 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<unsigned int> 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<unsigned int> 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);

View File

@ -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<unsigned int, std::string> m_lef_pins_suffixes;
std::map<unsigned int, int> m_lef_pins_datatypes;
bool m_produce_fills;
std::string m_fills_suffix;
int m_fills_datatype;
std::map<unsigned int, std::string> m_fills_suffixes;
std::map<unsigned int, int> 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

View File

@ -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") +

View File

@ -502,6 +502,94 @@ gsi::Class<db::LEFDEFReaderOptions> 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."

View File

@ -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 ());

View File

@ -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;