mirror of https://github.com/KLayout/klayout.git
Generalized macro resolution mode options for LEF/DEF reader (UI, buddy tools). Added lefdef-lef-layouts for buddy scripts for providing external layouts for FOREIGN.
This commit is contained in:
parent
3db1db831f
commit
05901d767e
|
|
@ -124,7 +124,7 @@ GenericReaderOptions::GenericReaderOptions ()
|
|||
m_lefdef_read_lef_with_def = load_options.get_option_by_name ("lefdef_config.read_lef_with_def").to_bool ();
|
||||
m_lefdef_separate_groups = load_options.get_option_by_name ("lefdef_config.separate_groups").to_bool ();
|
||||
m_lefdef_map_file = load_options.get_option_by_name ("lefdef_config.map_file").to_string ();
|
||||
m_lefdef_produce_lef_macros = (load_options.get_option_by_name ("lefdef_config.macro_resolution_mode").to_int () == 0);
|
||||
m_lefdef_macro_resolution_mode = load_options.get_option_by_name ("lefdef_config.macro_resolution_mode").to_int ();
|
||||
}
|
||||
|
||||
void
|
||||
|
|
@ -615,13 +615,27 @@ GenericReaderOptions::add_options (tl::CommandLineOptions &cmd)
|
|||
"If a map file is used, only the layers present in the map file are generated. No other layers are produced."
|
||||
)
|
||||
<< tl::arg (group +
|
||||
"!--" + m_long_prefix + "lefdef-no-lef-macros", &m_lefdef_produce_lef_macros, "Don't produce LEF macro geometry",
|
||||
"!--" + m_long_prefix + "lefdef-macro-resolution-mode", &m_lefdef_macro_resolution_mode, "Specify how to generate layout from LEF macros",
|
||||
"This option applies when reading DEF files.\n"
|
||||
"\n"
|
||||
"If this option is present, no geometry will be produced for LEF macros. Instead, a ghost cell with the name of the LEF "
|
||||
"macro will be produced. If this option is not given, the LEF macros will be inserted in to these cells "
|
||||
"unless a FOREIGN specification is present in the LEF macro. If a FOREIGN specification is given, LEF geometry is never "
|
||||
"inserted into a DEF file. Instead ghost cells are created."
|
||||
"The following values are accepted for this option:\n"
|
||||
"\n"
|
||||
"* 0: produce LEF geometry unless a FOREIGN cell is specified\n"
|
||||
"* 1: produce LEF geometry always and ignore FOREIGN\n"
|
||||
"* 2: Never produce LEF geometry and assume FOREIGN always\n"
|
||||
"\n"
|
||||
"In case of FOREIGN macros in mode 1 or always in mode 2, the '--" + m_long_prefix + "lefdef-lef-layouts' option is available to specify "
|
||||
"external layout files for providing the LEF macro layouts.\n"
|
||||
)
|
||||
<< tl::arg (group +
|
||||
"--" + m_long_prefix + "lefdef-lef-layouts", &m_lefdef_lef_layout_files, "Layout files for resolving FOREIGN LEF cells from",
|
||||
"This option applies when reading DEF files.\n"
|
||||
"\n"
|
||||
"Use a comma-separated list of file names here to specify which layout files to use for resolving LEF macros. "
|
||||
"This applies when LEF macros are specified with FOREIGN. By using '--" + m_long_prefix + "lefdef-macro-resolution-mode' you "
|
||||
"can force external resolution (assume FOREIGN always) or turn it off (ignore FOREIGN).\n"
|
||||
"\n"
|
||||
"Relative paths are resolved based on the location of the DEF file which is read."
|
||||
)
|
||||
<< tl::arg (group +
|
||||
"!--" + m_long_prefix + "lefdef-no-implicit-lef", &m_lefdef_read_lef_with_def, "Disables reading all LEF files together with DEF files",
|
||||
|
|
@ -678,7 +692,7 @@ void GenericReaderOptions::set_dbu (double dbu)
|
|||
}
|
||||
|
||||
void
|
||||
GenericReaderOptions::configure (db::LoadLayoutOptions &load_options) const
|
||||
GenericReaderOptions::configure (db::LoadLayoutOptions &load_options)
|
||||
{
|
||||
load_options.set_option_by_name ("layer_map", tl::Variant::make_variant (m_layer_map));
|
||||
load_options.set_option_by_name ("create_other_layers", m_create_other_layers);
|
||||
|
|
@ -763,7 +777,31 @@ GenericReaderOptions::configure (db::LoadLayoutOptions &load_options) const
|
|||
load_options.set_option_by_name ("lefdef_config.read_lef_with_def", m_lefdef_read_lef_with_def);
|
||||
load_options.set_option_by_name ("lefdef_config.separate_groups", m_lefdef_separate_groups);
|
||||
load_options.set_option_by_name ("lefdef_config.map_file", m_lefdef_map_file);
|
||||
load_options.set_option_by_name ("lefdef_config.macro_resolution_mode", m_lefdef_produce_lef_macros ? 0 : 2);
|
||||
load_options.set_option_by_name ("lefdef_config.macro_resolution_mode", m_lefdef_macro_resolution_mode);
|
||||
|
||||
m_lef_layouts.clear ();
|
||||
tl::Variant lef_layout_ptrs = tl::Variant::empty_list ();
|
||||
for (std::vector<std::string>::const_iterator l = m_lefdef_lef_layout_files.begin (); l != m_lefdef_lef_layout_files.end (); ++l) {
|
||||
|
||||
try {
|
||||
|
||||
std::unique_ptr<db::Layout> ly (new db::Layout ());
|
||||
|
||||
tl::InputStream stream (*l);
|
||||
db::Reader reader (stream);
|
||||
db::LoadLayoutOptions load_options;
|
||||
reader.read (*ly, load_options);
|
||||
|
||||
lef_layout_ptrs.push (tl::Variant::make_variant_ref (ly.get ()));
|
||||
m_lef_layouts.push_back (ly.release ());
|
||||
|
||||
} catch (tl::Exception &ex) {
|
||||
tl::warn << ex.msg ();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
load_options.set_option_by_name ("lefdef_config.macro_layouts", lef_layout_ptrs);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -25,6 +25,7 @@
|
|||
|
||||
#include "bdCommon.h"
|
||||
#include "dbCommonReader.h"
|
||||
#include "tlObject.h"
|
||||
|
||||
#include <string>
|
||||
|
||||
|
|
@ -36,6 +37,7 @@ namespace tl
|
|||
namespace db
|
||||
{
|
||||
class LoadLayoutOptions;
|
||||
class Layout;
|
||||
}
|
||||
|
||||
namespace bd
|
||||
|
|
@ -61,7 +63,7 @@ public:
|
|||
/**
|
||||
* @brief Configures the reader options object with the options stored in this object
|
||||
*/
|
||||
void configure (db::LoadLayoutOptions &load_options) const;
|
||||
void configure (db::LoadLayoutOptions &load_options);
|
||||
|
||||
/**
|
||||
* @brief Sets the option prefix for the short option name
|
||||
|
|
@ -183,7 +185,10 @@ private:
|
|||
bool m_lefdef_read_lef_with_def;
|
||||
bool m_lefdef_separate_groups;
|
||||
std::string m_lefdef_map_file;
|
||||
bool m_lefdef_produce_lef_macros;
|
||||
int m_lefdef_macro_resolution_mode;
|
||||
std::vector<std::string> m_lefdef_lef_layout_files;
|
||||
|
||||
tl::shared_collection<db::Layout> m_lef_layouts;
|
||||
};
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -63,7 +63,7 @@ struct ClipData
|
|||
};
|
||||
|
||||
|
||||
void clip (const ClipData &data)
|
||||
void clip (ClipData &data)
|
||||
{
|
||||
db::Layout layout;
|
||||
db::Layout target_layout;
|
||||
|
|
|
|||
|
|
@ -863,9 +863,9 @@ gsi::Class<db::LEFDEFReaderOptions> decl_lefdef_config ("db", "LEFDEFReaderConfi
|
|||
"are three modes available:\n"
|
||||
"\n"
|
||||
"@ul\n"
|
||||
" @li 0: produce LEF geometry unless a FOREIGN cell is specified (default) @/li\n"
|
||||
" @li 0: produce LEF geometry unless a FOREIGN cell is specified @/li\n"
|
||||
" @li 1: produce LEF geometry always and ignore FOREIGN @/li\n"
|
||||
" @li 2: Never produce LEF geometry @/li\n"
|
||||
" @li 2: Never produce LEF geometry and assume FOREIGN always @/li\n"
|
||||
"@/ul\n"
|
||||
"\n"
|
||||
"If substitution layouts are specified with \\macro_layouts, these are used to provide "
|
||||
|
|
|
|||
|
|
@ -35,7 +35,7 @@
|
|||
<item>
|
||||
<widget class="QTabWidget" name="tabWidget">
|
||||
<property name="currentIndex">
|
||||
<number>2</number>
|
||||
<number>1</number>
|
||||
</property>
|
||||
<widget class="QWidget" name="tab_3">
|
||||
<attribute name="title">
|
||||
|
|
@ -255,6 +255,37 @@
|
|||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="1">
|
||||
<widget class="QLineEdit" name="prefix_via_cellname">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="1" colspan="2">
|
||||
<widget class="QCheckBox" name="separate_groups">
|
||||
<property name="text">
|
||||
<string>Produce a parent cell per group</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="0">
|
||||
<widget class="QLabel" name="label_21">
|
||||
<property name="text">
|
||||
<string>Via cell name prefix</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="3" column="0">
|
||||
<widget class="QLabel" name="label">
|
||||
<property name="text">
|
||||
<string>LEF import into DEF</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="1">
|
||||
<widget class="QLineEdit" name="dbu">
|
||||
<property name="sizePolicy">
|
||||
|
|
@ -278,7 +309,38 @@
|
|||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="3" rowspan="4">
|
||||
<item row="1" column="0">
|
||||
<widget class="QLabel" name="label_22">
|
||||
<property name="text">
|
||||
<string>Groups</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="4" column="1" colspan="3">
|
||||
<widget class="QFrame" name="frame_3">
|
||||
<property name="frameShape">
|
||||
<enum>QFrame::NoFrame</enum>
|
||||
</property>
|
||||
<property name="frameShadow">
|
||||
<enum>QFrame::Raised</enum>
|
||||
</property>
|
||||
<layout class="QVBoxLayout" name="verticalLayout_6">
|
||||
<property name="leftMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="topMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="rightMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="bottomMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="3" rowspan="3">
|
||||
<spacer name="horizontalSpacer">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
|
|
@ -291,49 +353,23 @@
|
|||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
<item row="1" column="0">
|
||||
<widget class="QLabel" name="label_22">
|
||||
<property name="text">
|
||||
<string>Groups</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="1" colspan="2">
|
||||
<widget class="QCheckBox" name="separate_groups">
|
||||
<property name="text">
|
||||
<string>Produce a parent cell per group</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="0">
|
||||
<widget class="QLabel" name="label_21">
|
||||
<property name="text">
|
||||
<string>Via cell name prefix</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="1">
|
||||
<widget class="QLineEdit" name="prefix_via_cellname">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="3" column="0">
|
||||
<widget class="QLabel" name="label">
|
||||
<property name="text">
|
||||
<string>LEF import into DEF</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="3" column="1" colspan="2">
|
||||
<widget class="QCheckBox" name="produce_lef_geo">
|
||||
<property name="text">
|
||||
<string>Produce LEF geometry</string>
|
||||
</property>
|
||||
<item row="3" column="1" colspan="3">
|
||||
<widget class="QComboBox" name="macro_resolution_mode">
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>Produce LEF geometry unless FOREIGN is used</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>Always produce LEF geometry and ignore FOREIGN</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>Never produce LEF geometry and assume FOREIGN always</string>
|
||||
</property>
|
||||
</item>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
|
|
@ -1362,7 +1398,6 @@ type ...</string>
|
|||
<tabstop>dbu</tabstop>
|
||||
<tabstop>separate_groups</tabstop>
|
||||
<tabstop>prefix_via_cellname</tabstop>
|
||||
<tabstop>produce_lef_geo</tabstop>
|
||||
<tabstop>produce_net_names</tabstop>
|
||||
<tabstop>net_prop_name</tabstop>
|
||||
<tabstop>produce_inst_names</tabstop>
|
||||
|
|
|
|||
|
|
@ -515,7 +515,7 @@ LEFDEFReaderOptionsEditor::commit (db::FormatSpecificReaderOptions *options, con
|
|||
data->set_separate_groups (separate_groups->isChecked ());
|
||||
data->set_read_lef_with_def (read_lef_with_def->isChecked ());
|
||||
data->set_map_file (tl::to_string (mapfile_path->text ()));
|
||||
data->set_macro_resolution_mode (produce_lef_geo->isChecked () ? 0 : 2);
|
||||
data->set_macro_resolution_mode (macro_resolution_mode->currentIndex ());
|
||||
|
||||
data->clear_lef_files ();
|
||||
for (int i = 0; i < lef_files->count (); ++i) {
|
||||
|
|
@ -582,7 +582,7 @@ LEFDEFReaderOptionsEditor::setup (const db::FormatSpecificReaderOptions *options
|
|||
read_lef_with_def->setChecked (data->read_lef_with_def ());
|
||||
mapfile_path->setText (tl::to_qstring (data->map_file ()));
|
||||
layer_map_mode->setCurrentIndex (data->map_file ().empty () ? 1 : 0);
|
||||
produce_lef_geo->setChecked (data->macro_resolution_mode () == 0);
|
||||
macro_resolution_mode->setCurrentIndex (data->macro_resolution_mode ());
|
||||
|
||||
checkbox_changed ();
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue