diff --git a/src/buddies/src/bd/bd.pro b/src/buddies/src/bd/bd.pro index 3ec14b734..ef71f239e 100644 --- a/src/buddies/src/bd/bd.pro +++ b/src/buddies/src/bd/bd.pro @@ -21,6 +21,7 @@ SOURCES = \ strmcmp.cc \ strmxor.cc \ strmrun.cc \ + strm2mag.cc HEADERS = \ bdCommon.h \ diff --git a/src/buddies/src/bd/bdReaderOptions.cc b/src/buddies/src/bd/bdReaderOptions.cc index c7fc839d8..186b68655 100644 --- a/src/buddies/src/bd/bdReaderOptions.cc +++ b/src/buddies/src/bd/bdReaderOptions.cc @@ -48,7 +48,11 @@ GenericReaderOptions::GenericReaderOptions () m_dxf_contour_accuracy (0.0), m_dxf_render_texts_as_polygons (false), m_dxf_keep_layer_names (false), - m_dxf_keep_other_cells (false) + m_dxf_keep_other_cells (false), + m_magic_lambda (1.0), + m_magic_dbu (0.001), + m_magic_keep_layer_names (false), + m_magic_merge (true) { // .. nothing yet .. } @@ -238,6 +242,27 @@ GenericReaderOptions::add_options (tl::CommandLineOptions &cmd) ) ; } + + { + std::string group ("[" + m_group_prefix + " options - MAG (Magic) specific]"); + + cmd << tl::arg (group + + "--" + m_long_prefix + "magic-lambda=lambda", &m_magic_lambda, "Specifies the lambda value", + "The lambda value is used as a scaling factor to turn the dimensionless Magic drawings into " + "physical layout." + ) + << tl::arg (group + + "#!--" + m_long_prefix + "magic-dont-merge", &m_magic_merge, "Disables polygon merging", + "With this option, the rectangles and triangles of the Magic file are not merged into polygons." + ) + << tl::arg (group + + "--" + m_long_prefix + "magic-lib-path=path", &m_magic_lib_path, "Specifies the library search path for Magic file loading", + "The library search path gives the locations where the reader looks up files for child cells. " + "This option either specifies a comma-separated list of paths to search or it can be present multiple times " + "for multiple search locations." + ) + ; + } } void GenericReaderOptions::set_layer_map (const std::string &lm) @@ -256,12 +281,14 @@ void GenericReaderOptions::set_read_named_layers (bool f) { m_dxf_keep_layer_names = f; m_cif_keep_layer_names = f; + m_magic_keep_layer_names = f; } void GenericReaderOptions::set_dbu (double dbu) { m_dxf_dbu = dbu; m_cif_dbu = dbu; + m_magic_dbu = dbu; } void @@ -297,6 +324,14 @@ GenericReaderOptions::configure (db::LoadLayoutOptions &load_options) const load_options.set_option_by_name ("dxf_render_texts_as_polygons", m_dxf_render_texts_as_polygons); load_options.set_option_by_name ("dxf_keep_layer_names", m_dxf_keep_layer_names); load_options.set_option_by_name ("dxf_keep_other_cells", m_dxf_keep_other_cells); + + load_options.set_option_by_name ("mag_layer_map", tl::Variant::make_variant (m_layer_map)); + load_options.set_option_by_name ("mag_create_other_layers", m_create_other_layers); + load_options.set_option_by_name ("mag_dbu", m_magic_dbu); + load_options.set_option_by_name ("mag_lambda", m_magic_lambda); + load_options.set_option_by_name ("mag_merge", m_magic_merge); + load_options.set_option_by_name ("mag_keep_layer_names", m_magic_keep_layer_names); + load_options.set_option_by_name ("mag_library_paths", tl::Variant (m_magic_lib_path.begin (), m_magic_lib_path.end ())); } } diff --git a/src/buddies/src/bd/bdReaderOptions.h b/src/buddies/src/bd/bdReaderOptions.h index 7158d0552..03982b53c 100644 --- a/src/buddies/src/bd/bdReaderOptions.h +++ b/src/buddies/src/bd/bdReaderOptions.h @@ -130,6 +130,13 @@ private: bool m_dxf_keep_layer_names; bool m_dxf_keep_other_cells; + // MAGIC + double m_magic_lambda; + double m_magic_dbu; + bool m_magic_keep_layer_names; + bool m_magic_merge; + std::vector m_magic_lib_path; + void set_layer_map (const std::string &lm); void set_dbu (double dbu); void set_read_named_layers (bool f); diff --git a/src/buddies/src/bd/bdWriterOptions.cc b/src/buddies/src/bd/bdWriterOptions.cc index 7605c389f..60b72e737 100644 --- a/src/buddies/src/bd/bdWriterOptions.cc +++ b/src/buddies/src/bd/bdWriterOptions.cc @@ -53,6 +53,7 @@ GenericWriterOptions::GenericWriterOptions () m_oasis_subst_char ("*"), m_cif_dummy_calls (false), m_cif_blank_separator (false), + m_magic_lambda (1.0), m_dxf_polygon_mode (0) { // .. nothing yet .. @@ -63,6 +64,7 @@ const std::string GenericWriterOptions::gds2text_format_name = "GDS2Text"; // const std::string GenericWriterOptions::oasis_format_name = "OASIS"; const std::string GenericWriterOptions::dxf_format_name = "DXF"; const std::string GenericWriterOptions::cif_format_name = "CIF"; +const std::string GenericWriterOptions::mag_format_name = "MAG"; void GenericWriterOptions::add_options (tl::CommandLineOptions &cmd, const std::string &format) @@ -267,6 +269,21 @@ GenericWriterOptions::add_options (tl::CommandLineOptions &cmd, const std::strin ; } + + if (format.empty () || format == mag_format_name) { + + // Add MAG format options + std::string group = "[Output options - MAG (Magic) specific]"; + + cmd << tl::arg (group + + "--magic-lambda-out=lambda", &m_magic_lambda, "Specifies the lambda value when writing Magic files (which are unitless)" + ) + << tl::arg (group + + "--magic-tech", &m_magic_tech, "Specifies the technology to include in the Magic files" + ) + ; + + } } void GenericWriterOptions::set_oasis_substitution_char (const std::string &text) @@ -353,6 +370,9 @@ GenericWriterOptions::configure (db::SaveLayoutOptions &save_options, const db:: save_options.set_option_by_name ("dxf_polygon_mode", m_dxf_polygon_mode); + save_options.set_option_by_name ("mag_lambda", m_magic_lambda); + save_options.set_option_by_name ("mag_tech", m_magic_tech); + if (!m_cell_selection.empty ()) { std::set selected; diff --git a/src/buddies/src/bd/bdWriterOptions.h b/src/buddies/src/bd/bdWriterOptions.h index 197b073c9..4246c27d1 100644 --- a/src/buddies/src/bd/bdWriterOptions.h +++ b/src/buddies/src/bd/bdWriterOptions.h @@ -103,6 +103,7 @@ public: static const std::string oasis_format_name; static const std::string cif_format_name; static const std::string dxf_format_name; + static const std::string mag_format_name; private: double m_scale_factor; @@ -133,6 +134,9 @@ private: bool m_cif_dummy_calls; bool m_cif_blank_separator; + double m_magic_lambda; + std::string m_magic_tech; + int m_dxf_polygon_mode; void set_oasis_substitution_char (const std::string &text); diff --git a/src/buddies/src/bd/strm2mag.cc b/src/buddies/src/bd/strm2mag.cc new file mode 100644 index 000000000..38207870a --- /dev/null +++ b/src/buddies/src/bd/strm2mag.cc @@ -0,0 +1,29 @@ + +/* + + KLayout Layout Viewer + Copyright (C) 2006-2019 Matthias Koefferlein + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +*/ + +#include "bdConverterMain.h" +#include "bdWriterOptions.h" + +BD_PUBLIC int strm2mag (int argc, char *argv[]) +{ + return bd::converter_main (argc, argv, bd::GenericWriterOptions::mag_format_name); +} diff --git a/src/buddies/src/src.pro b/src/buddies/src/src.pro index 3cf2321ba..eb9777725 100644 --- a/src/buddies/src/src.pro +++ b/src/buddies/src/src.pro @@ -8,6 +8,7 @@ SUBDIRS = \ strm2gds \ strm2gdstxt \ strm2oas \ + strm2mag \ strm2txt \ strmclip \ strmcmp \ @@ -19,6 +20,7 @@ strm2dxf.depends += bd strm2gds.depends += bd strm2gdstxt.depends += bd strm2oas.depends += bd +strm2mag.depends += bd strm2txt.depends += bd strmclip.depends += bd strmcmp.depends += bd diff --git a/src/buddies/src/strm2mag/strm2mag.pro b/src/buddies/src/strm2mag/strm2mag.pro new file mode 100644 index 000000000..e04ca961a --- /dev/null +++ b/src/buddies/src/strm2mag/strm2mag.pro @@ -0,0 +1,2 @@ + +include($$PWD/../buddy_app.pri) diff --git a/src/buddies/unit_tests/bdConverterTests.cc b/src/buddies/unit_tests/bdConverterTests.cc index 739d40b13..7a57a2467 100644 --- a/src/buddies/unit_tests/bdConverterTests.cc +++ b/src/buddies/unit_tests/bdConverterTests.cc @@ -158,3 +158,31 @@ TEST(5) db::compare_layouts (this, layout, input, db::NoNormalization); } +// Testing the converter main implementation (MAG) +TEST(6) +{ + std::string input = tl::testsrc (); + input += "/testdata/gds/t10.gds"; + + std::string input_au = tl::testsrc (); + input_au += "/testdata/magic/strm2mag_au.gds"; + + std::string output = this->tmp_file ("RINGO.mag"); + + const char *argv[] = { "x", input.c_str (), output.c_str (), "--magic-lambda-out=0.005" }; + + EXPECT_EQ (bd::converter_main (sizeof (argv) / sizeof (argv[0]), (char **) argv, bd::GenericWriterOptions::mag_format_name), 0); + + db::Layout layout; + + { + tl::InputStream stream (output); + db::LoadLayoutOptions options; + options.set_option_by_name ("mag_lambda", 0.005); + db::Reader reader (stream); + reader.read (layout, options); + EXPECT_EQ (reader.format (), "MAG"); + } + + db::compare_layouts (this, layout, input_au, db::WriteGDS2); +} diff --git a/testdata/buddies/buddies.rb b/testdata/buddies/buddies.rb index 4f3caddaa..59b5aa379 100644 --- a/testdata/buddies/buddies.rb +++ b/testdata/buddies/buddies.rb @@ -38,7 +38,7 @@ class Buddies_TestClass < TestBase def test_basic # Basic - buddies can be called - %w(strm2cif strm2dxf strm2gds strm2gdstxt strm2oas strm2txt strmclip strmcmp strmrun strmxor).each do |bin| + %w(strm2cif strm2dxf strm2gds strm2gdstxt strm2oas strm2mag strm2txt strmclip strmcmp strmrun strmxor).each do |bin| version = bin + " " + `#{self.buddy_bin(bin)} --version` assert_equal(version =~ /^#{bin} \d+\./, 0) end @@ -54,6 +54,7 @@ class Buddies_TestClass < TestBase "strm2gdstxt" => 0x48454144, "strm2oas" => 0x2553454d, "strm2txt" => 0x62656769, + "strm2mag" => 0x0, } # Windows CRLF -> LF translation @@ -61,7 +62,7 @@ class Buddies_TestClass < TestBase 0x300d0a53 => 0x300a5345 } - %w(strm2cif strm2dxf strm2gds strm2gdstxt strm2oas strm2txt).each do |bin| + %w(strm2cif strm2dxf strm2gds strm2gdstxt strm2oas strm2txt strm2mag).each do |bin| puts "Testing #{bin} ..." diff --git a/testdata/magic/strm2mag_au.gds b/testdata/magic/strm2mag_au.gds new file mode 100644 index 000000000..ebd097764 Binary files /dev/null and b/testdata/magic/strm2mag_au.gds differ