mirror of https://github.com/KLayout/klayout.git
Implemented a fix for issue #2191 (LIBNAME not saved)
The fix consists of moving that options into the case-specific options like DBU, instead of having it in the format-specific, default writer options. So they can be specified on a per-case basis and taken from the current layout by default. Specifically: * SaveLayoutOptions#gds2_libname is deprecated and replaced by SaveLayoutOptions#libname * -ol (buddy tools) is no longer format specific * The GDS writer takes SaveLayoutOptions#libname, and if empty, substitutes by the current libname. As last resort, "LIB" is used, because LIBNAME cannot be an empty string. * The libname got removed from the global writer options UI * In the "Save As" options dialog, it now is part of the global options and initialized with the current layout's libname.
This commit is contained in:
parent
ec5de0ffe8
commit
937e557564
|
|
@ -35,6 +35,7 @@ GenericWriterOptions::GenericWriterOptions ()
|
|||
db::SaveLayoutOptions save_options;
|
||||
|
||||
m_dbu = save_options.get_option_by_name ("dbu").to_double ();
|
||||
m_libname = save_options.get_option_by_name ("libname").to_string ();
|
||||
|
||||
m_dont_write_empty_cells = save_options.get_option_by_name ("no_empty_cells").to_bool ();
|
||||
m_keep_instances = save_options.get_option_by_name ("keep_instances").to_bool ();
|
||||
|
|
@ -45,7 +46,6 @@ GenericWriterOptions::GenericWriterOptions ()
|
|||
m_gds2_multi_xy_records = save_options.get_option_by_name ("gds2_multi_xy_records").to_bool ();
|
||||
m_gds2_resolve_skew_arrays = save_options.get_option_by_name ("gds2_resolve_skew_arrays").to_bool ();
|
||||
m_gds2_max_cellname_length = save_options.get_option_by_name ("gds2_max_cellname_length").to_uint ();
|
||||
m_gds2_libname = save_options.get_option_by_name ("gds2_libname").to_string ();
|
||||
m_gds2_user_units = save_options.get_option_by_name ("gds2_user_units").to_double ();
|
||||
m_gds2_write_timestamps = save_options.get_option_by_name ("gds2_write_timestamps").to_bool ();
|
||||
m_gds2_write_cell_properties = save_options.get_option_by_name ("gds2_write_cell_properties").to_bool ();
|
||||
|
|
@ -98,6 +98,11 @@ GenericWriterOptions::add_options (tl::CommandLineOptions &cmd, const std::strin
|
|||
"change physically because internally, the coordinates are scaled to match the "
|
||||
"new database unit."
|
||||
);
|
||||
cmd << tl::arg (group +
|
||||
"-ol|--libname=libname", &m_libname, "Uses the given library name",
|
||||
"This option can specify the LIBNAME for the output file. By default, the original LIBNAME is "
|
||||
"written. This option is generic, but currently only supported by GDS2."
|
||||
);
|
||||
}
|
||||
|
||||
cmd << tl::arg (group +
|
||||
|
|
@ -178,11 +183,6 @@ GenericWriterOptions::add_options (tl::CommandLineOptions &cmd, const std::strin
|
|||
"-on|--cellname-length=length", &m_gds2_max_cellname_length, "Limits cell names to the given length",
|
||||
"If this option is given, long cell names will truncated if their length exceeds the given length."
|
||||
)
|
||||
<< tl::arg (group +
|
||||
"-ol|--libname=libname", &m_gds2_libname, "Uses the given library name",
|
||||
"This option can specify the GDS2 LIBNAME for the output file. By default, the original LIBNAME is "
|
||||
"written."
|
||||
)
|
||||
<< tl::arg (group +
|
||||
"#--user-units=unit", &m_gds2_user_units, "Specifies the user unit to use",
|
||||
"Specifies the GDS2 user unit. By default micrometers are used for the user unit."
|
||||
|
|
@ -374,6 +374,7 @@ GenericWriterOptions::configure (db::SaveLayoutOptions &save_options, const db::
|
|||
{
|
||||
save_options.set_scale_factor (m_scale_factor);
|
||||
save_options.set_dbu (m_dbu);
|
||||
save_options.set_libname (m_libname);
|
||||
save_options.set_dont_write_empty_cells (m_dont_write_empty_cells);
|
||||
save_options.set_keep_instances (m_keep_instances);
|
||||
save_options.set_write_context_info (m_write_context_info);
|
||||
|
|
@ -383,7 +384,6 @@ GenericWriterOptions::configure (db::SaveLayoutOptions &save_options, const db::
|
|||
save_options.set_option_by_name ("gds2_multi_xy_records", m_gds2_multi_xy_records);
|
||||
save_options.set_option_by_name ("gds2_resolve_skew_arrays", m_gds2_resolve_skew_arrays);
|
||||
save_options.set_option_by_name ("gds2_max_cellname_length", m_gds2_max_cellname_length);
|
||||
save_options.set_option_by_name ("gds2_libname", m_gds2_libname);
|
||||
save_options.set_option_by_name ("gds2_user_units", m_gds2_user_units);
|
||||
save_options.set_option_by_name ("gds2_write_timestamps", m_gds2_write_timestamps);
|
||||
save_options.set_option_by_name ("gds2_write_cell_properties", m_gds2_write_cell_properties);
|
||||
|
|
|
|||
|
|
@ -118,7 +118,7 @@ private:
|
|||
bool m_gds2_multi_xy_records;
|
||||
bool m_gds2_resolve_skew_arrays;
|
||||
unsigned int m_gds2_max_cellname_length;
|
||||
std::string m_gds2_libname;
|
||||
std::string m_libname;
|
||||
double m_gds2_user_units;
|
||||
bool m_gds2_write_timestamps;
|
||||
bool m_gds2_write_cell_properties;
|
||||
|
|
|
|||
|
|
@ -43,13 +43,13 @@ TEST(1)
|
|||
"--drop-empty-cells",
|
||||
"--keep-instances",
|
||||
"--no-context-info",
|
||||
"-ol=MYLIBNAME",
|
||||
// CIF
|
||||
"--blank-separator",
|
||||
"--dummy-calls",
|
||||
// DXF
|
||||
"-op=2",
|
||||
// GDS2
|
||||
"-ol=MYLIBNAME",
|
||||
"-ov=250",
|
||||
"--multi-xy-records",
|
||||
"--no-timestamps",
|
||||
|
|
@ -77,7 +77,7 @@ TEST(1)
|
|||
EXPECT_EQ (stream_opt.get_option_by_name ("cif_blank_separator").to_bool (), false);
|
||||
EXPECT_EQ (stream_opt.get_option_by_name ("cif_dummy_calls").to_bool (), false);
|
||||
EXPECT_EQ (stream_opt.get_option_by_name ("dxf_polygon_mode").to_int (), 0);
|
||||
EXPECT_EQ (stream_opt.get_option_by_name ("gds2_libname").to_string (), "LIB");
|
||||
EXPECT_EQ (stream_opt.get_option_by_name ("libname").to_string (), "");
|
||||
EXPECT_EQ (stream_opt.get_option_by_name ("gds2_max_vertex_count").to_uint (), (unsigned int) 8000);
|
||||
EXPECT_EQ (stream_opt.get_option_by_name ("gds2_multi_xy_records").to_bool (), false);
|
||||
EXPECT_EQ (stream_opt.get_option_by_name ("gds2_write_timestamps").to_bool (), true);
|
||||
|
|
@ -100,10 +100,11 @@ TEST(1)
|
|||
EXPECT_EQ (stream_opt.dont_write_empty_cells (), true);
|
||||
EXPECT_EQ (stream_opt.keep_instances (), true);
|
||||
EXPECT_EQ (stream_opt.write_context_info (), false);
|
||||
EXPECT_EQ (stream_opt.libname (), "MYLIBNAME");
|
||||
EXPECT_EQ (stream_opt.get_option_by_name ("libname").to_string (), "MYLIBNAME");
|
||||
EXPECT_EQ (stream_opt.get_option_by_name ("cif_blank_separator").to_bool (), true);
|
||||
EXPECT_EQ (stream_opt.get_option_by_name ("cif_dummy_calls").to_bool (), true);
|
||||
EXPECT_EQ (stream_opt.get_option_by_name ("dxf_polygon_mode").to_int (), 2);
|
||||
EXPECT_EQ (stream_opt.get_option_by_name ("gds2_libname").to_string (), "MYLIBNAME");
|
||||
EXPECT_EQ (stream_opt.get_option_by_name ("gds2_max_vertex_count").to_uint (), (unsigned int) 250);
|
||||
EXPECT_EQ (stream_opt.get_option_by_name ("gds2_multi_xy_records").to_bool (), true);
|
||||
EXPECT_EQ (stream_opt.get_option_by_name ("gds2_write_timestamps").to_bool (), false);
|
||||
|
|
|
|||
|
|
@ -61,6 +61,7 @@ SaveLayoutOptions::operator= (const SaveLayoutOptions &d)
|
|||
m_all_cells = d.m_all_cells;
|
||||
m_dbu = d.m_dbu;
|
||||
m_scale_factor = d.m_scale_factor;
|
||||
m_libname = d.m_libname;
|
||||
m_keep_instances = d.m_keep_instances;
|
||||
m_write_context_info = d.m_write_context_info;
|
||||
m_dont_write_empty_cells = d.m_dont_write_empty_cells;
|
||||
|
|
@ -220,7 +221,13 @@ SaveLayoutOptions::set_dbu (double dbu)
|
|||
m_dbu = dbu;
|
||||
}
|
||||
|
||||
void
|
||||
void
|
||||
SaveLayoutOptions::set_libname (const std::string &libname)
|
||||
{
|
||||
m_libname = libname;
|
||||
}
|
||||
|
||||
void
|
||||
SaveLayoutOptions::set_scale_factor (double f)
|
||||
{
|
||||
m_scale_factor = f;
|
||||
|
|
|
|||
|
|
@ -194,6 +194,19 @@ public:
|
|||
return m_scale_factor;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Sets the libname
|
||||
*/
|
||||
void set_libname (const std::string &libname);
|
||||
|
||||
/**
|
||||
* @brief Gets the libname
|
||||
*/
|
||||
const std::string &libname () const
|
||||
{
|
||||
return m_libname;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Set the "don't write empty cells flag"
|
||||
*/
|
||||
|
|
@ -440,6 +453,7 @@ private:
|
|||
bool m_all_cells;
|
||||
double m_dbu;
|
||||
double m_scale_factor;
|
||||
std::string m_libname;
|
||||
bool m_keep_instances;
|
||||
bool m_write_context_info;
|
||||
bool m_dont_write_empty_cells;
|
||||
|
|
|
|||
|
|
@ -2972,7 +2972,7 @@ Class<db::SaveLayoutOptions> decl_SaveLayoutOptions ("db", "SaveLayoutOptions",
|
|||
"This method was introduced in version 0.23.\n"
|
||||
) +
|
||||
gsi::method ("dbu=", &db::SaveLayoutOptions::set_dbu, gsi::arg ("dbu"),
|
||||
"@brief Set the database unit to be used in the stream file\n"
|
||||
"@brief Sets the database unit to be used in the stream file\n"
|
||||
"\n"
|
||||
"By default, the database unit of the layout is used. This method allows one to explicitly use a different\n"
|
||||
"database unit. A scale factor is introduced automatically which scales all layout objects accordingly so their physical dimensions remain the same. "
|
||||
|
|
@ -2980,7 +2980,7 @@ Class<db::SaveLayoutOptions> decl_SaveLayoutOptions ("db", "SaveLayoutOptions",
|
|||
"layout may become slightly distorted."
|
||||
) +
|
||||
gsi::method ("dbu", &db::SaveLayoutOptions::dbu,
|
||||
"@brief Get the explicit database unit if one is set\n"
|
||||
"@brief Gets the explicit database unit if one is set\n"
|
||||
"\n"
|
||||
"See \\dbu= for a description of that attribute.\n"
|
||||
) +
|
||||
|
|
@ -2994,8 +2994,24 @@ Class<db::SaveLayoutOptions> decl_SaveLayoutOptions ("db", "SaveLayoutOptions",
|
|||
gsi::method ("no_empty_cells?", &db::SaveLayoutOptions::dont_write_empty_cells,
|
||||
"@brief Returns a flag indicating whether empty cells are not written.\n"
|
||||
) +
|
||||
gsi::method ("libname=|#gds2_libname=", &db::SaveLayoutOptions::set_libname, gsi::arg ("libname"),
|
||||
"@brief Sets the library name\n"
|
||||
"\n"
|
||||
"The library name is an attribute and specifies a formal name for a library, if the layout files is to be used as one.\n"
|
||||
"Currently, this attribute is only supported by the GDS2 format. Hence the alias.\n"
|
||||
"\n"
|
||||
"By default or if the libname is an empty string, the current library name of the layout or 'LIB' is used.\n"
|
||||
"\n"
|
||||
"The 'libname' alias has been introduced in version 0.30.5. The original name \\gds2_libname= is still available."
|
||||
) +
|
||||
gsi::method ("libname|#gds2_libname", &db::SaveLayoutOptions::libname,
|
||||
"@brief Gets the library name\n"
|
||||
"\n"
|
||||
"See \\libname= for details.\n"
|
||||
"The 'libname' alias has been introduced in version 0.30.5. The original name \\gds2_libname is still available."
|
||||
) +
|
||||
gsi::method ("scale_factor=", &db::SaveLayoutOptions::set_scale_factor, gsi::arg ("scale_factor"),
|
||||
"@brief Set the scaling factor for the saving \n"
|
||||
"@brief Sets the scaling factor for the saving \n"
|
||||
"\n"
|
||||
"Using a scaling factor will scale all objects accordingly. "
|
||||
"This scale factor adds to a potential scaling implied by using an explicit database unit.\n"
|
||||
|
|
|
|||
|
|
@ -2315,8 +2315,17 @@ MainWindow::do_save (bool as)
|
|||
options.set_format (cv->save_options ().format ());
|
||||
}
|
||||
|
||||
// preconfigure options with current values
|
||||
|
||||
options.set_dbu (cv->layout ().dbu ());
|
||||
|
||||
if (cv->layout ().has_meta_info ("libname")) {
|
||||
tl::Variant libname = cv->layout ().meta_info ("libname").value;
|
||||
if (libname.is_a_string ()) {
|
||||
options.set_libname (libname.to_stdstring ());
|
||||
}
|
||||
}
|
||||
|
||||
if (as || options.format ().empty ()) {
|
||||
options.set_format_from_filename (fn);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -319,7 +319,6 @@ LayoutHandle::update_save_options (db::SaveLayoutOptions &options)
|
|||
}
|
||||
|
||||
if (specific_options.get ()) {
|
||||
decl->initialize_options_from_layout_handle (specific_options.get (), *this);
|
||||
options.set_options (specific_options.release ());
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -258,18 +258,6 @@ public:
|
|||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Initialize the writer options from a layout handle
|
||||
*
|
||||
* The layout handle carries information about meta data read and similar. This
|
||||
* method gives the plugin a chance to modify the options based on the meta data
|
||||
* of the layout.
|
||||
*/
|
||||
virtual void initialize_options_from_layout_handle (db::FormatSpecificWriterOptions * /*options*/, const lay::LayoutHandle & /*lh*/) const
|
||||
{
|
||||
// the default implementation does nothing.
|
||||
}
|
||||
};
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -152,10 +152,10 @@
|
|||
<property name="spacing">
|
||||
<number>6</number>
|
||||
</property>
|
||||
<item row="1" column="2">
|
||||
<widget class="QLabel" name="label_7">
|
||||
<item row="4" column="0">
|
||||
<widget class="QLabel" name="label_4">
|
||||
<property name="text">
|
||||
<string>µm</string>
|
||||
<string>Cell context</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
|
|
@ -166,16 +166,23 @@
|
|||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="5">
|
||||
<widget class="QLineEdit" name="sf_le">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<item row="4" column="1" colspan="6">
|
||||
<widget class="QCheckBox" name="store_context_cb">
|
||||
<property name="text">
|
||||
<string>1.0</string>
|
||||
<string>Store PCell and library context information (format specific)</string>
|
||||
</property>
|
||||
<property name="checked">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="3" column="0">
|
||||
<widget class="QLabel" name="label_8">
|
||||
<property name="text">
|
||||
<string>Cell tree</string>
|
||||
</property>
|
||||
<property name="alignment">
|
||||
<set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
|
|
@ -195,14 +202,7 @@
|
|||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
<item row="1" column="4">
|
||||
<widget class="QLabel" name="label_6">
|
||||
<property name="text">
|
||||
<string>Scaling factor</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="1" colspan="6">
|
||||
<item row="3" column="1" colspan="6">
|
||||
<widget class="QFrame" name="frame_2">
|
||||
<property name="frameShape">
|
||||
<enum>QFrame::NoFrame</enum>
|
||||
|
|
@ -278,6 +278,46 @@
|
|||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="2">
|
||||
<widget class="QLabel" name="label_7">
|
||||
<property name="text">
|
||||
<string>µm</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="4">
|
||||
<widget class="QLabel" name="label_6">
|
||||
<property name="text">
|
||||
<string>Scaling factor</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="3">
|
||||
<spacer>
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>40</width>
|
||||
<height>20</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
<item row="1" column="5">
|
||||
<widget class="QLineEdit" name="sf_le">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>1.0</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="0">
|
||||
<widget class="QLabel" name="label_3">
|
||||
<property name="text">
|
||||
|
|
@ -304,29 +344,6 @@
|
|||
</item>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="0">
|
||||
<widget class="QLabel" name="label_8">
|
||||
<property name="text">
|
||||
<string>Cell tree</string>
|
||||
</property>
|
||||
<property name="alignment">
|
||||
<set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="3">
|
||||
<spacer>
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>40</width>
|
||||
<height>20</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
<item row="1" column="1">
|
||||
<widget class="QLineEdit" name="dbu_le">
|
||||
<property name="sizePolicy">
|
||||
|
|
@ -337,20 +354,13 @@
|
|||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="3" column="1" colspan="6">
|
||||
<widget class="QCheckBox" name="store_context_cb">
|
||||
<property name="text">
|
||||
<string>Store PCell and library context information (format specific)</string>
|
||||
</property>
|
||||
<property name="checked">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
</widget>
|
||||
<item row="2" column="1" colspan="5">
|
||||
<widget class="QLineEdit" name="libname_le"/>
|
||||
</item>
|
||||
<item row="3" column="0">
|
||||
<widget class="QLabel" name="label_4">
|
||||
<item row="2" column="0">
|
||||
<widget class="QLabel" name="label_9">
|
||||
<property name="text">
|
||||
<string>Cell context</string>
|
||||
<string>Library name</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
|
|
|
|||
|
|
@ -462,6 +462,7 @@ SaveLayoutAsOptionsDialog::get_options (lay::LayoutViewBase *view, unsigned int
|
|||
mp_ui->compression->setCurrentIndex (om_to_index (om));
|
||||
|
||||
mp_ui->dbu_le->setText (tl::to_qstring (tl::to_string (options.dbu ())));
|
||||
mp_ui->libname_le->setText (tl::to_qstring (options.libname ()));
|
||||
|
||||
mp_ui->fmt_cbx->setCurrentIndex (0);
|
||||
fmt_cbx_changed (0);
|
||||
|
|
@ -490,8 +491,6 @@ SaveLayoutAsOptionsDialog::get_options (lay::LayoutViewBase *view, unsigned int
|
|||
specific_options.reset (decl->create_specific_options ());
|
||||
}
|
||||
|
||||
decl->initialize_options_from_layout_handle (specific_options.get (), *cv.handle ());
|
||||
|
||||
if (page->first) {
|
||||
page->first->setup (specific_options.get (), mp_tech);
|
||||
}
|
||||
|
|
@ -524,6 +523,7 @@ SaveLayoutAsOptionsDialog::get_options (lay::LayoutViewBase *view, unsigned int
|
|||
options.set_dbu (dbu);
|
||||
options.set_scale_factor (sf);
|
||||
|
||||
options.set_libname (tl::to_string (mp_ui->libname_le->text ()));
|
||||
options.set_dont_write_empty_cells (mp_ui->no_empty_cells_cb->isChecked ());
|
||||
options.set_keep_instances (mp_ui->keep_instances_cb->isChecked ());
|
||||
options.set_write_context_info (mp_ui->store_context_cb->isChecked ());
|
||||
|
|
|
|||
|
|
@ -77,8 +77,7 @@ class GDS2FormatDeclaration
|
|||
tl::make_member (&db::GDS2WriterOptions::multi_xy_records, "multi-xy-records") +
|
||||
tl::make_member (&db::GDS2WriterOptions::resolve_skew_arrays, "resolve-skew-arrays") +
|
||||
tl::make_member (&db::GDS2WriterOptions::max_vertex_count, "max-vertex-count") +
|
||||
tl::make_member (&db::GDS2WriterOptions::max_cellname_length, "max-cellname-length") +
|
||||
tl::make_member (&db::GDS2WriterOptions::libname, "libname")
|
||||
tl::make_member (&db::GDS2WriterOptions::max_cellname_length, "max-cellname-length")
|
||||
);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -111,7 +111,6 @@ public:
|
|||
multi_xy_records (false),
|
||||
resolve_skew_arrays (false),
|
||||
max_cellname_length (32000),
|
||||
libname ("LIB"),
|
||||
user_units (1.0),
|
||||
write_timestamps (true),
|
||||
write_cell_properties (false),
|
||||
|
|
@ -163,13 +162,6 @@ public:
|
|||
*/
|
||||
unsigned int max_cellname_length;
|
||||
|
||||
/**
|
||||
* @brief The library name
|
||||
*
|
||||
* This property describes that library name written to the LIBNAME record.
|
||||
*/
|
||||
std::string libname;
|
||||
|
||||
/**
|
||||
* @brief The user units to use
|
||||
*
|
||||
|
|
|
|||
|
|
@ -435,9 +435,20 @@ GDS2WriterBase::write (db::Layout &layout, tl::OutputStream &stream, const db::S
|
|||
|
||||
db::GDS2WriterOptions gds2_options = options.get_options<db::GDS2WriterOptions> ();
|
||||
|
||||
m_libname = options.libname ();
|
||||
if (m_libname.empty () && layout.has_meta_info ("libname")) {
|
||||
tl::Variant libname = layout.meta_info ("libname").value;
|
||||
if (libname.is_a_string ()) {
|
||||
m_libname = libname.to_stdstring ();
|
||||
}
|
||||
}
|
||||
if (m_libname.empty ()) {
|
||||
m_libname = "LIB";
|
||||
}
|
||||
|
||||
layout.add_meta_info ("dbuu", MetaInfo (tl::to_string (tr ("Database unit in user units")), tl::to_string (m_dbu / std::max (1e-9, gds2_options.user_units))));
|
||||
layout.add_meta_info ("dbum", MetaInfo (tl::to_string (tr ("Database unit in meter")), tl::to_string (m_dbu * 1e-6)));
|
||||
layout.add_meta_info ("libname", MetaInfo (tl::to_string (tr ("Library name")), gds2_options.libname));
|
||||
layout.add_meta_info ("libname", MetaInfo (tl::to_string (tr ("Library name")), m_libname));
|
||||
|
||||
std::vector <std::pair <unsigned int, db::LayerProperties> > layers;
|
||||
options.get_valid_layers (layout, layers, db::SaveLayoutOptions::LP_AssignNumber);
|
||||
|
|
@ -517,7 +528,7 @@ GDS2WriterBase::write (db::Layout &layout, tl::OutputStream &stream, const db::S
|
|||
write_time (time_data);
|
||||
|
||||
try {
|
||||
write_string_record (sLIBNAME, gds2_options.libname);
|
||||
write_string_record (sLIBNAME, m_libname);
|
||||
} catch (tl::Exception &ex) {
|
||||
throw tl::Exception (ex.msg () + tl::to_string (tr (", writing LIBNAME")));
|
||||
}
|
||||
|
|
|
|||
|
|
@ -168,6 +168,7 @@ protected:
|
|||
private:
|
||||
db::WriterCellNameMap m_cell_name_map;
|
||||
double m_dbu;
|
||||
std::string m_libname;
|
||||
bool m_resolve_skew_arrays;
|
||||
bool m_multi_xy;
|
||||
bool m_no_zero_length_paths;
|
||||
|
|
|
|||
|
|
@ -126,16 +126,6 @@ static tl::Variant get_gds2_default_text_size (const db::SaveLayoutOptions *opti
|
|||
return ts < 0.0 ? tl::Variant () : tl::Variant (ts);
|
||||
}
|
||||
|
||||
static void set_gds2_libname (db::SaveLayoutOptions *options, const std::string &n)
|
||||
{
|
||||
options->get_options<db::GDS2WriterOptions> ().libname = n;
|
||||
}
|
||||
|
||||
static std::string get_gds2_libname (const db::SaveLayoutOptions *options)
|
||||
{
|
||||
return options->get_options<db::GDS2WriterOptions> ().libname;
|
||||
}
|
||||
|
||||
static void set_gds2_user_units (db::SaveLayoutOptions *options, double n)
|
||||
{
|
||||
options->get_options<db::GDS2WriterOptions> ().user_units = n;
|
||||
|
|
@ -263,18 +253,6 @@ gsi::ClassExt<db::SaveLayoutOptions> gds2_writer_options (
|
|||
"See \\gds2_max_cellname_length= method for a description of the maximum cell name length."
|
||||
"\nThis property has been added in version 0.18.\n"
|
||||
) +
|
||||
gsi::method_ext ("gds2_libname=", &set_gds2_libname, gsi::arg ("libname"),
|
||||
"@brief Set the library name\n"
|
||||
"\n"
|
||||
"The library name is the string written into the LIBNAME records of the GDS file.\n"
|
||||
"The library name should not be an empty string and is subject to certain limitations in the character choice.\n"
|
||||
"\nThis property has been added in version 0.18.\n"
|
||||
) +
|
||||
gsi::method_ext ("gds2_libname", &get_gds2_libname,
|
||||
"@brief Get the library name\n"
|
||||
"See \\gds2_libname= method for a description of the library name."
|
||||
"\nThis property has been added in version 0.18.\n"
|
||||
) +
|
||||
gsi::method_ext ("gds2_user_units=", &set_gds2_user_units, gsi::arg ("uu"),
|
||||
"@brief Set the users units to write into the GDS file\n"
|
||||
"\n"
|
||||
|
|
|
|||
|
|
@ -50,55 +50,45 @@
|
|||
<property name="spacing">
|
||||
<number>6</number>
|
||||
</property>
|
||||
<item row="0" column="1" colspan="2">
|
||||
<widget class="QLineEdit" name="libname_le"/>
|
||||
</item>
|
||||
<item row="1" column="0">
|
||||
<widget class="QLabel" name="label">
|
||||
<item row="3" column="2">
|
||||
<widget class="QLabel" name="label_10">
|
||||
<property name="text">
|
||||
<string>Max. cell name length</string>
|
||||
<string>µm (empty for no size)</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="1">
|
||||
<widget class="QLineEdit" name="cell_name_length_le"/>
|
||||
</item>
|
||||
<item row="7" column="0" colspan="3">
|
||||
<widget class="QCheckBox" name="no_zero_length_paths">
|
||||
<property name="text">
|
||||
<string>Eliminate zero-length paths (convert to BOUNDARY)</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="2">
|
||||
<widget class="QLabel" name="label_4">
|
||||
<property name="text">
|
||||
<string>(<4000 recommended, absolute limit 8191)</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="6" column="0" colspan="3">
|
||||
<item row="5" column="0" colspan="3">
|
||||
<widget class="QCheckBox" name="resolve_skew_arrays_cbx">
|
||||
<property name="text">
|
||||
<string>Resolve skew (non-orthogonal) arrays into single instances</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="8" column="0" colspan="3">
|
||||
<item row="3" column="0">
|
||||
<widget class="QLabel" name="label_9">
|
||||
<property name="text">
|
||||
<string>Default text size</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="1">
|
||||
<widget class="QLineEdit" name="max_vertex_le"/>
|
||||
</item>
|
||||
<item row="0" column="0">
|
||||
<widget class="QLabel" name="label">
|
||||
<property name="text">
|
||||
<string>Max. cell name length</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="7" column="0" colspan="3">
|
||||
<widget class="QCheckBox" name="write_timestamps">
|
||||
<property name="text">
|
||||
<string>Write current time to time stamps (BGNLIB, BGNSTR)</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="0">
|
||||
<widget class="QLabel" name="label_5">
|
||||
<property name="text">
|
||||
<string>Library name</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="3" column="1" colspan="3">
|
||||
<item row="2" column="1" colspan="3">
|
||||
<widget class="QCheckBox" name="multi_xy_cbx">
|
||||
<property name="text">
|
||||
<string>Multi-XY record mode for boundaries
|
||||
|
|
@ -106,24 +96,7 @@
|
|||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="2">
|
||||
<widget class="QLabel" name="label_3">
|
||||
<property name="text">
|
||||
<string>(keep empty for unspecified limit)</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="0">
|
||||
<widget class="QLabel" name="label_2">
|
||||
<property name="text">
|
||||
<string>Max. vertices</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="1">
|
||||
<widget class="QLineEdit" name="max_vertex_le"/>
|
||||
</item>
|
||||
<item row="5" column="0" colspan="3">
|
||||
<item row="4" column="0" colspan="3">
|
||||
<widget class="QFrame" name="frame">
|
||||
<property name="frameShape">
|
||||
<enum>QFrame::NoFrame</enum>
|
||||
|
|
@ -188,20 +161,37 @@
|
|||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="4" column="1">
|
||||
<widget class="QLineEdit" name="default_text_size_le"/>
|
||||
</item>
|
||||
<item row="4" column="0">
|
||||
<widget class="QLabel" name="label_9">
|
||||
<item row="1" column="0">
|
||||
<widget class="QLabel" name="label_2">
|
||||
<property name="text">
|
||||
<string>Default text size</string>
|
||||
<string>Max. vertices</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="4" column="2">
|
||||
<widget class="QLabel" name="label_10">
|
||||
<item row="3" column="1">
|
||||
<widget class="QLineEdit" name="default_text_size_le"/>
|
||||
</item>
|
||||
<item row="1" column="2">
|
||||
<widget class="QLabel" name="label_4">
|
||||
<property name="text">
|
||||
<string>µm (empty for no size)</string>
|
||||
<string>(<4000 recommended, absolute limit 8191)</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="6" column="0" colspan="3">
|
||||
<widget class="QCheckBox" name="no_zero_length_paths">
|
||||
<property name="text">
|
||||
<string>Eliminate zero-length paths (convert to BOUNDARY)</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="1">
|
||||
<widget class="QLineEdit" name="cell_name_length_le"/>
|
||||
</item>
|
||||
<item row="0" column="2">
|
||||
<widget class="QLabel" name="label_3">
|
||||
<property name="text">
|
||||
<string>(keep empty for unspecified limit)</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
|
|
@ -224,7 +214,6 @@
|
|||
</layout>
|
||||
</widget>
|
||||
<tabstops>
|
||||
<tabstop>libname_le</tabstop>
|
||||
<tabstop>cell_name_length_le</tabstop>
|
||||
<tabstop>max_vertex_le</tabstop>
|
||||
<tabstop>multi_xy_cbx</tabstop>
|
||||
|
|
|
|||
|
|
@ -66,7 +66,6 @@ GDS2WriterOptionPage::setup (const db::FormatSpecificWriterOptions *o, const db:
|
|||
mp_ui->max_vertex_le->setText (tl::to_qstring (tl::to_string (options->max_vertex_count)));
|
||||
mp_ui->cell_name_length_le->setText (tl::to_qstring (tl::to_string (options->max_cellname_length)));
|
||||
mp_ui->default_text_size_le->setText (tl::to_qstring (options->default_text_size >= 0.0 ? tl::to_string (options->default_text_size) : std::string ()));
|
||||
mp_ui->libname_le->setText (tl::to_qstring (tl::to_string (options->libname)));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -118,8 +117,6 @@ GDS2WriterOptionPage::commit (db::FormatSpecificWriterOptions *o, const db::Tech
|
|||
}
|
||||
options->max_cellname_length = n;
|
||||
|
||||
options->libname = tl::to_string (mp_ui->libname_le->text ());
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -153,20 +150,6 @@ public:
|
|||
{
|
||||
return new db::GDS2WriterOptions ();
|
||||
}
|
||||
|
||||
void initialize_options_from_layout_handle (db::FormatSpecificWriterOptions *o, const lay::LayoutHandle &lh) const
|
||||
{
|
||||
// Initialize the libname property from meta data with key "libname".
|
||||
db::GDS2WriterOptions *options = dynamic_cast<db::GDS2WriterOptions *> (o);
|
||||
if (options) {
|
||||
db::Layout::meta_info_name_id_type libname_name_id = lh.layout().meta_info_name_id ("libname");
|
||||
for (db::Layout::meta_info_iterator meta = lh.layout().begin_meta (); meta != lh.layout().end_meta (); ++meta) {
|
||||
if (meta->first == libname_name_id && !meta->second.value.is_nil ()) {
|
||||
options->libname = meta->second.value.to_string ();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue