mirror of https://github.com/KLayout/klayout.git
commit
2fa545d80b
|
|
@ -21,6 +21,7 @@ SOURCES = \
|
|||
strmcmp.cc \
|
||||
strmxor.cc \
|
||||
strmrun.cc \
|
||||
strm2mag.cc
|
||||
|
||||
HEADERS = \
|
||||
bdCommon.h \
|
||||
|
|
|
|||
|
|
@ -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 ()));
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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<std::string> m_magic_lib_path;
|
||||
|
||||
void set_layer_map (const std::string &lm);
|
||||
void set_dbu (double dbu);
|
||||
void set_read_named_layers (bool f);
|
||||
|
|
|
|||
|
|
@ -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<db::cell_index_type> selected;
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -0,0 +1,2 @@
|
|||
|
||||
include($$PWD/../buddy_app.pri)
|
||||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -84,7 +84,7 @@ extract_ld (const char *s, int &l, int &d, std::string &n)
|
|||
{
|
||||
l = d = 0;
|
||||
|
||||
if (*s == 'L') {
|
||||
if (*s == 'L' || *s == 'l') {
|
||||
++s;
|
||||
}
|
||||
|
||||
|
|
@ -97,7 +97,7 @@ extract_ld (const char *s, int &l, int &d, std::string &n)
|
|||
++s;
|
||||
}
|
||||
|
||||
if (*s == 'D' || *s == '.') {
|
||||
if (*s == 'D' || *s == 'd' || *s == '.') {
|
||||
++s;
|
||||
if (! safe_isdigit (*s)) {
|
||||
return false;
|
||||
|
|
|
|||
|
|
@ -294,6 +294,17 @@ SaveLayoutOptions::get_valid_layers (const db::Layout &layout, std::vector <std:
|
|||
}
|
||||
}
|
||||
|
||||
} else if (lm == LP_AssignNameWithPriority) {
|
||||
|
||||
for (std::vector<std::pair <unsigned int, db::LayerProperties> >::const_iterator l = all_layers.begin (); l != all_layers.end (); ++l) {
|
||||
layers.push_back (*l);
|
||||
if (l->second.name.empty ()) {
|
||||
layers.back ().second = tl::sprintf ("L%dD%d", l->second.layer, l->second.datatype);
|
||||
} else if (l->second.layer >= 0 && l->second.datatype >= 0) {
|
||||
layers.back ().second = l->second.name;
|
||||
}
|
||||
}
|
||||
|
||||
} else if (lm == LP_AssignNumber) {
|
||||
|
||||
int next_layer = 0;
|
||||
|
|
|
|||
|
|
@ -391,7 +391,8 @@ public:
|
|||
LP_OnlyNumbered = 0,
|
||||
LP_OnlyNamed = 1,
|
||||
LP_AssignName = 2,
|
||||
LP_AssignNumber = 3
|
||||
LP_AssignNameWithPriority = 3,
|
||||
LP_AssignNumber = 4
|
||||
};
|
||||
|
||||
/**
|
||||
|
|
@ -401,7 +402,8 @@ public:
|
|||
* The lm mode specifies how to create layer properties for "halfway defined" layers -
|
||||
* - LP_OnlyNamed will only select named ones
|
||||
* - LP_OnlyNumbered will select only numbered ones
|
||||
* - LP_AssignName will assign a name when no name is given
|
||||
* - LP_AssignName will assign a name when no name is given plus encode layer/datatype when given
|
||||
* - LP_AssignNameWithPriority will assign a name when no name is given and does not encore layer/datatype together with a name
|
||||
* - LP_AssignNumber will assign numbers when no number is given
|
||||
*/
|
||||
void get_valid_layers (const db::Layout &layout, std::vector <std::pair <unsigned int, db::LayerProperties> > &valid_layers, LayerAssignmentMode lm) const;
|
||||
|
|
|
|||
|
|
@ -160,6 +160,14 @@ public:
|
|||
*/
|
||||
void reserve (size_t n);
|
||||
|
||||
/**
|
||||
* @brief Sets the base verbosity of the processor (see EdgeProcessor::set_base_verbosity for details)
|
||||
*/
|
||||
void set_base_verbosity (int bv)
|
||||
{
|
||||
m_processor.set_base_verbosity (bv);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Enable progress
|
||||
*
|
||||
|
|
|
|||
|
|
@ -676,11 +676,11 @@ public:
|
|||
typedef typename Tr::target_coord_type target_coord_type;
|
||||
size_t p = (size_t) mp_ptr;
|
||||
if (p & 1) {
|
||||
return text<target_coord_type> (reinterpret_cast<StringRef *> (p - 1), simple_trans<target_coord_type> ((t.fp_trans () * m_trans.fp_trans ()).rot (), t (point_type () + m_trans.disp ()) - point<target_coord_type> ()), t.ctrans (m_size), m_font);
|
||||
return text<target_coord_type> (reinterpret_cast<StringRef *> (p - 1), simple_trans<target_coord_type> ((t.fp_trans () * m_trans.fp_trans ()).rot (), t (point_type () + m_trans.disp ()) - point<target_coord_type> ()), t.ctrans (m_size), m_font, m_halign, m_valign);
|
||||
} else if (mp_ptr) {
|
||||
return text<target_coord_type> (mp_ptr, simple_trans<target_coord_type> ((t.fp_trans () * m_trans.fp_trans ()).rot (), t (point_type () + m_trans.disp ()) - point<target_coord_type> ()), t.ctrans (m_size), m_font);
|
||||
return text<target_coord_type> (mp_ptr, simple_trans<target_coord_type> ((t.fp_trans () * m_trans.fp_trans ()).rot (), t (point_type () + m_trans.disp ()) - point<target_coord_type> ()), t.ctrans (m_size), m_font, m_halign, m_valign);
|
||||
} else {
|
||||
return text<target_coord_type> (simple_trans<target_coord_type> ((t.fp_trans () * m_trans.fp_trans ()).rot (), t (point_type () + m_trans.disp ()) - point<target_coord_type> ()), t.ctrans (m_size), m_font);
|
||||
return text<target_coord_type> (simple_trans<target_coord_type> ((t.fp_trans () * m_trans.fp_trans ()).rot (), t (point_type () + m_trans.disp ()) - point<target_coord_type> ()), t.ctrans (m_size), m_font, m_halign, m_valign);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -89,15 +89,15 @@ static
|
|||
gsi::ClassExt<db::LoadLayoutOptions> common_reader_options (
|
||||
gsi::method_ext ("set_layer_map", &set_layer_map, gsi::arg ("map"), gsi::arg ("create_other_layers"),
|
||||
"@brief Sets the layer map\n"
|
||||
"This sets a layer mapping for the reader. The \"create_other_layers\" specifies whether to create layers that are not "
|
||||
"in the mapping and automatically assign layers to them.\n"
|
||||
"This sets a layer mapping for the reader. The layer map allows selection and translation of the original layers, for example to add a layer name.\n"
|
||||
"@param map The layer map to set."
|
||||
"@param create_other_layers The flag telling whether other layer should be created also. Set to false if just the layers in the mapping table should be read.\n"
|
||||
"@param create_other_layers The flag telling whether other layer should be created as well. Set to false if just the layers in the mapping table should be read.\n"
|
||||
"\n"
|
||||
"Starting with version 0.25 this option only applies to GDS2 and OASIS format. Other formats provide their own configuration."
|
||||
) +
|
||||
gsi::method_ext ("layer_map=", &set_layer_map1, gsi::arg ("map"),
|
||||
"@brief Sets the layer map, but does not affect the \"create_other_layers\" flag.\n"
|
||||
"Use \\create_other_layers? to enable or disable other layers not listed in the layer map.\n"
|
||||
"@param map The layer map to set."
|
||||
"\n"
|
||||
"This convenience method has been introduced with version 0.26."
|
||||
|
|
@ -121,12 +121,15 @@ gsi::ClassExt<db::LoadLayoutOptions> common_reader_options (
|
|||
gsi::method_ext ("create_other_layers?", &create_other_layers,
|
||||
"@brief Gets a value indicating whether other layers shall be created\n"
|
||||
"@return True, if other layers should be created.\n"
|
||||
"This attribute acts together with a layer map (see \\layer_map=). Layers not listed in this map are created as well when "
|
||||
"\\create_other_layers? is true. Otherwise they are ignored.\n"
|
||||
"\n"
|
||||
"Starting with version 0.25 this option only applies to GDS2 and OASIS format. Other formats provide their own configuration."
|
||||
) +
|
||||
gsi::method_ext ("create_other_layers=", &set_create_other_layers, gsi::arg ("create"),
|
||||
"@brief Specifies whether other layers shall be created\n"
|
||||
"@param create True, if other layers should be created.\n"
|
||||
"See \\create_other_layers? for a description of this attribute.\n"
|
||||
"\n"
|
||||
"Starting with version 0.25 this option only applies to GDS2 and OASIS format. Other formats provide their own configuration."
|
||||
) +
|
||||
|
|
|
|||
|
|
@ -894,8 +894,9 @@ module DRC
|
|||
# "what" specifies what input to use. "what" be either
|
||||
#
|
||||
# @ul
|
||||
# @li A string "\@n" specifying output to a layout in the current panel @/li
|
||||
# @li A layout filename @/li
|
||||
# @li A string "\@n" (n is an integer) specifying output to a layout in the current panel @/li
|
||||
# @li A string "\@+" specifying output to a new layout in the current panel @/li
|
||||
# @li A layout filename @/li
|
||||
# @li A RBA::Layout object @/li
|
||||
# @li A RBA::Cell object @/li
|
||||
# @/ul
|
||||
|
|
@ -912,15 +913,21 @@ module DRC
|
|||
|
||||
if arg.is_a?(String)
|
||||
|
||||
if arg =~ /^@(\d+)/
|
||||
n = $1.to_i - 1
|
||||
if arg =~ /^@(\d+|\+)/
|
||||
view = RBA::LayoutView::current
|
||||
view || raise("No view open")
|
||||
if $1 == "+"
|
||||
n = view.create_layout(true)
|
||||
cellname ||= (@def_cell ? @def_cell.name : "TOP")
|
||||
else
|
||||
n = $1.to_i - 1
|
||||
end
|
||||
(n >= 0 && view.cellviews > n) || raise("Invalid layout index @#{n + 1}")
|
||||
cv = view.cellview(n)
|
||||
cv.is_valid? || raise("Invalid layout @#{n + 1}")
|
||||
@output_layout = cv.layout
|
||||
@output_cell = cellname ? (@output_layout.cell(cellname.to_s) || @output_layout.create_cell(cellname.to_s)) : cv.cell
|
||||
cv.cell = @output_cell
|
||||
@output_layout_file = nil
|
||||
else
|
||||
@output_layout = RBA::Layout::new
|
||||
|
|
@ -1545,7 +1552,7 @@ CODE
|
|||
|
||||
@output_layers.each do |li|
|
||||
if !present_layers[li]
|
||||
info = @def_layout.get_info(li)
|
||||
info = output.get_info(li)
|
||||
lp = RBA::LayerProperties::new
|
||||
lp.source_layer = info.layer
|
||||
lp.source_datatype = info.datatype
|
||||
|
|
|
|||
|
|
@ -767,7 +767,8 @@ a new target will be set up.
|
|||
"what" specifies what input to use. "what" be either
|
||||
</p><p>
|
||||
<ul>
|
||||
<li>A string "@n" specifying output to a layout in the current panel </li>
|
||||
<li>A string "@n" (n is an integer) specifying output to a layout in the current panel </li>
|
||||
<li>A string "@+" specifying output to a new layout in the current panel</li>
|
||||
<li>A layout filename </li>
|
||||
<li>A <class_doc href="Layout">Layout</class_doc> object </li>
|
||||
<li>A <class_doc href="Cell">Cell</class_doc> object </li>
|
||||
|
|
|
|||
|
|
@ -226,6 +226,9 @@ LayoutHandle::set_tech_name (const std::string &tn)
|
|||
} else {
|
||||
m_tech_name = std::string ();
|
||||
}
|
||||
if (mp_layout) {
|
||||
mp_layout->add_meta_info (db::MetaInfo ("technology", tl::to_string (tr ("Technology name")), tn));
|
||||
}
|
||||
technology_changed_event ();
|
||||
}
|
||||
}
|
||||
|
|
@ -339,6 +342,14 @@ LayoutHandle::load (const db::LoadLayoutOptions &options, const std::string &tec
|
|||
db::Reader reader (stream);
|
||||
db::LayerMap new_lmap = reader.read (layout (), m_load_options);
|
||||
|
||||
// If there is no technology given and the reader reports one, use this one
|
||||
if (technology.empty ()) {
|
||||
std::string tech_from_reader = layout ().meta_info_value ("technology");
|
||||
if (! tech_from_reader.empty ()) {
|
||||
set_tech_name (tech_from_reader);
|
||||
}
|
||||
}
|
||||
|
||||
// Update the file's data:
|
||||
file_watcher ().remove_file (filename ());
|
||||
file_watcher ().add_file (filename ());
|
||||
|
|
@ -358,6 +369,12 @@ LayoutHandle::load ()
|
|||
db::Reader reader (stream);
|
||||
db::LayerMap new_lmap = reader.read (layout (), m_load_options);
|
||||
|
||||
// Attach the technology from the reader if it reports one
|
||||
std::string tech_from_reader = layout ().meta_info_value ("technology");
|
||||
if (! tech_from_reader.empty ()) {
|
||||
set_tech_name (tech_from_reader);
|
||||
}
|
||||
|
||||
// Update the file's data:
|
||||
file_watcher ().remove_file (filename ());
|
||||
file_watcher ().add_file (filename ());
|
||||
|
|
|
|||
|
|
@ -475,7 +475,7 @@ LibrariesView::search_editing_finished ()
|
|||
}
|
||||
|
||||
void
|
||||
LibrariesView::middle_clicked (const QModelIndex &index)
|
||||
LibrariesView::middle_clicked (const QModelIndex & /*index*/)
|
||||
{
|
||||
// ... nothing yet ..
|
||||
}
|
||||
|
|
@ -493,7 +493,7 @@ LibrariesView::clicked (const QModelIndex & /*index*/)
|
|||
}
|
||||
|
||||
void
|
||||
LibrariesView::double_clicked (const QModelIndex &index)
|
||||
LibrariesView::double_clicked (const QModelIndex & /*index*/)
|
||||
{
|
||||
// ... nothing yet ..
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1143,5 +1143,150 @@ void DecoratedLineEdit::resizeEvent (QResizeEvent * /*event*/)
|
|||
}
|
||||
}
|
||||
|
||||
// -------------------------------------------------------------
|
||||
// InteractiveListWidget implementation
|
||||
|
||||
InteractiveListWidget::InteractiveListWidget (QWidget *parent)
|
||||
: QListWidget (parent)
|
||||
{
|
||||
setSelectionMode (QAbstractItemView::ExtendedSelection);
|
||||
setDragDropMode (QAbstractItemView::InternalMove);
|
||||
}
|
||||
|
||||
void
|
||||
InteractiveListWidget::set_values (const std::vector<std::string> &values)
|
||||
{
|
||||
clear ();
|
||||
add_values (values);
|
||||
}
|
||||
|
||||
std::vector<std::string>
|
||||
InteractiveListWidget::get_values ()
|
||||
{
|
||||
std::vector<std::string> v;
|
||||
v.reserve ((size_t) count ());
|
||||
for (int i = 0; i < count (); ++i) {
|
||||
v.push_back (tl::to_string (item (i)->text ()));
|
||||
}
|
||||
return v;
|
||||
}
|
||||
|
||||
void
|
||||
InteractiveListWidget::add_value (const std::string &value)
|
||||
{
|
||||
addItem (tl::to_qstring (value));
|
||||
refresh_flags ();
|
||||
clearSelection ();
|
||||
setCurrentItem (item (count () - 1));
|
||||
}
|
||||
|
||||
void
|
||||
InteractiveListWidget::add_values (const std::vector<std::string> &values)
|
||||
{
|
||||
for (std::vector<std::string>::const_iterator i = values.begin (); i != values.end (); ++i) {
|
||||
addItem (tl::to_qstring (*i));
|
||||
}
|
||||
refresh_flags ();
|
||||
clearSelection ();
|
||||
}
|
||||
|
||||
void
|
||||
InteractiveListWidget::delete_selected_items ()
|
||||
{
|
||||
QStringList items;
|
||||
for (int i = 0; i < count (); ++i) {
|
||||
if (! item (i)->isSelected ()) {
|
||||
items.push_back (item (i)->text ());
|
||||
}
|
||||
}
|
||||
|
||||
clear ();
|
||||
for (QStringList::const_iterator f = items.begin (); f != items.end (); ++f) {
|
||||
addItem (*f);
|
||||
}
|
||||
refresh_flags ();
|
||||
}
|
||||
|
||||
void
|
||||
InteractiveListWidget::move_selected_items_up ()
|
||||
{
|
||||
std::set<QString> selected;
|
||||
for (int i = 0; i < count (); ++i) {
|
||||
if (item (i)->isSelected ()) {
|
||||
selected.insert (item (i)->text ());
|
||||
}
|
||||
}
|
||||
|
||||
QStringList items;
|
||||
int j = -1;
|
||||
for (int i = 0; i < count (); ++i) {
|
||||
if (item (i)->isSelected ()) {
|
||||
items.push_back (item (i)->text ());
|
||||
} else {
|
||||
if (j >= 0) {
|
||||
items.push_back (item (j)->text ());
|
||||
}
|
||||
j = i;
|
||||
}
|
||||
}
|
||||
if (j >= 0) {
|
||||
items.push_back (item (j)->text ());
|
||||
}
|
||||
|
||||
clear ();
|
||||
for (QStringList::const_iterator f = items.begin (); f != items.end (); ++f) {
|
||||
addItem (*f);
|
||||
if (selected.find (*f) != selected.end ()) {
|
||||
item (count () - 1)->setSelected (true);
|
||||
}
|
||||
}
|
||||
refresh_flags ();
|
||||
}
|
||||
|
||||
void
|
||||
InteractiveListWidget::move_selected_items_down ()
|
||||
{
|
||||
std::set<QString> selected;
|
||||
for (int i = 0; i < count (); ++i) {
|
||||
if (item (i)->isSelected ()) {
|
||||
selected.insert (item (i)->text ());
|
||||
}
|
||||
}
|
||||
|
||||
QStringList items;
|
||||
int j = -1;
|
||||
for (int i = count (); i > 0; ) {
|
||||
--i;
|
||||
if (item (i)->isSelected ()) {
|
||||
items.push_back (item (i)->text ());
|
||||
} else {
|
||||
if (j >= 0) {
|
||||
items.push_back (item (j)->text ());
|
||||
}
|
||||
j = i;
|
||||
}
|
||||
}
|
||||
if (j >= 0) {
|
||||
items.push_back (item (j)->text ());
|
||||
}
|
||||
|
||||
clear ();
|
||||
for (QStringList::const_iterator f = items.end (); f != items.begin (); ) {
|
||||
--f;
|
||||
addItem (*f);
|
||||
if (selected.find (*f) != selected.end ()) {
|
||||
item (count () - 1)->setSelected (true);
|
||||
}
|
||||
}
|
||||
refresh_flags ();
|
||||
}
|
||||
|
||||
void
|
||||
InteractiveListWidget::refresh_flags ()
|
||||
{
|
||||
for (int i = 0; i < count (); ++i) {
|
||||
item (i)->setFlags (Qt::ItemIsSelectable | Qt::ItemIsEditable | Qt::ItemIsEnabled | Qt::ItemIsDragEnabled);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -31,6 +31,7 @@
|
|||
#include <QLabel>
|
||||
#include <QLineEdit>
|
||||
#include <QProxyStyle>
|
||||
#include <QListWidget>
|
||||
#include <string>
|
||||
|
||||
namespace db
|
||||
|
|
@ -460,6 +461,62 @@ private:
|
|||
int m_default_left_margin, m_default_right_margin;
|
||||
};
|
||||
|
||||
/**
|
||||
* @brief An interactive liste widget which offers slots to delete and move items and interfaces to std::vector<std::string>
|
||||
*/
|
||||
class LAYBASIC_PUBLIC InteractiveListWidget
|
||||
: public QListWidget
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
/**
|
||||
* @brief Constructor
|
||||
*/
|
||||
InteractiveListWidget (QWidget *parent = 0);
|
||||
|
||||
/**
|
||||
* @brief Sets the items in the widget
|
||||
*/
|
||||
void set_values (const std::vector<std::string> &values);
|
||||
|
||||
/**
|
||||
* @brief Gets the items in the widget
|
||||
*/
|
||||
std::vector<std::string> get_values ();
|
||||
|
||||
/**
|
||||
* @brief Adds a value
|
||||
*/
|
||||
void add_value (const std::string &value);
|
||||
|
||||
/**
|
||||
* @brief Adds values
|
||||
*/
|
||||
void add_values (const std::vector<std::string> &values);
|
||||
|
||||
private slots:
|
||||
/**
|
||||
* @brief Deletes the selected items
|
||||
*/
|
||||
void delete_selected_items ();
|
||||
|
||||
/**
|
||||
* @brief Moves the selected items up
|
||||
*/
|
||||
void move_selected_items_up ();
|
||||
|
||||
/**
|
||||
* @brief Moves the selected items down
|
||||
*/
|
||||
void move_selected_items_down ();
|
||||
|
||||
private:
|
||||
void refresh_flags ();
|
||||
|
||||
bool m_drag_and_drop_enabled;
|
||||
};
|
||||
|
||||
} // namespace lay
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -536,8 +536,6 @@ CIFReader::read_cell (db::Layout &layout, db::Cell &cell, double sf, int level)
|
|||
|
||||
} else if (c == 'L') {
|
||||
|
||||
skip_blanks ();
|
||||
|
||||
++layer_specs;
|
||||
|
||||
std::string name = read_name ();
|
||||
|
|
|
|||
|
|
@ -61,11 +61,7 @@ CIFWriter::operator<<(const std::string &s)
|
|||
CIFWriter &
|
||||
CIFWriter::operator<<(endl_tag)
|
||||
{
|
||||
#ifdef _WIN32
|
||||
*this << "\r\n";
|
||||
#else
|
||||
*this << "\n";
|
||||
#endif
|
||||
return *this;
|
||||
}
|
||||
|
||||
|
|
@ -78,6 +74,8 @@ CIFWriter::xy_sep () const
|
|||
void
|
||||
CIFWriter::write (db::Layout &layout, tl::OutputStream &stream, const db::SaveLayoutOptions &options)
|
||||
{
|
||||
stream.set_as_text (true);
|
||||
|
||||
m_options = options.get_options<CIFWriterOptions> ();
|
||||
mp_stream = &stream;
|
||||
|
||||
|
|
@ -107,7 +105,7 @@ CIFWriter::write (db::Layout &layout, tl::OutputStream &stream, const db::SaveLa
|
|||
strftime(timestr, sizeof (timestr), "%F %T", &tt);
|
||||
|
||||
// Write header
|
||||
*this << "(CIF file written " << (const char *)timestr << " by KLayout);" << endl;
|
||||
*this << "(CIF file written " << (const char *)timestr << " by KLayout);" << m_endl;
|
||||
|
||||
// TODO: this can be done more intelligently ..
|
||||
int tl_scale_divider;
|
||||
|
|
@ -136,8 +134,8 @@ CIFWriter::write (db::Layout &layout, tl::OutputStream &stream, const db::SaveLa
|
|||
|
||||
double sf = 1.0;
|
||||
|
||||
*this << "DS " << cell_index << " " << tl_scale_denom << " " << tl_scale_divider << ";" << endl;
|
||||
*this << "9 " << tl::to_word_or_quoted_string (layout.cell_name (*cell)) << ";" << endl;
|
||||
*this << "DS " << cell_index << " " << tl_scale_denom << " " << tl_scale_divider << ";" << m_endl;
|
||||
*this << "9 " << tl::to_word_or_quoted_string (layout.cell_name (*cell)) << ";" << m_endl;
|
||||
|
||||
// instances
|
||||
for (db::Cell::const_iterator inst = cref.begin (); ! inst.at_end (); ++inst) {
|
||||
|
|
@ -195,7 +193,7 @@ CIFWriter::write (db::Layout &layout, tl::OutputStream &stream, const db::SaveLa
|
|||
|
||||
*this << " T" << d.x() << xy_sep () << d.y();
|
||||
|
||||
*this << ";" << endl;
|
||||
*this << ";" << m_endl;
|
||||
|
||||
}
|
||||
|
||||
|
|
@ -219,7 +217,7 @@ CIFWriter::write (db::Layout &layout, tl::OutputStream &stream, const db::SaveLa
|
|||
}
|
||||
|
||||
// end of cell
|
||||
*this << "DF;" << endl;
|
||||
*this << "DF;" << m_endl;
|
||||
|
||||
}
|
||||
|
||||
|
|
@ -232,7 +230,7 @@ CIFWriter::write (db::Layout &layout, tl::OutputStream &stream, const db::SaveLa
|
|||
|
||||
std::map<db::cell_index_type, int>::const_iterator cif_index = db_to_cif_index_map.find (*cell);
|
||||
tl_assert(cif_index != db_to_cif_index_map.end ());
|
||||
*this << "C" << cif_index->second << ";" << endl;
|
||||
*this << "C" << cif_index->second << ";" << m_endl;
|
||||
|
||||
}
|
||||
|
||||
|
|
@ -241,7 +239,7 @@ CIFWriter::write (db::Layout &layout, tl::OutputStream &stream, const db::SaveLa
|
|||
}
|
||||
|
||||
// end of file
|
||||
*this << "E" << endl;
|
||||
*this << "E" << m_endl;
|
||||
|
||||
m_progress.set (mp_stream->pos ());
|
||||
|
||||
|
|
@ -252,7 +250,7 @@ CIFWriter::emit_layer()
|
|||
{
|
||||
if (m_needs_emit) {
|
||||
m_needs_emit = false;
|
||||
*this << "L " << tl::to_word_or_quoted_string(m_layer.name, "0123456789_.$") << ";" << endl;
|
||||
*this << "L " << tl::to_word_or_quoted_string (tl::to_upper_case (m_layer.name), "0123456789_.$") << ";" << m_endl;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -266,12 +264,12 @@ CIFWriter::write_texts (const db::Layout &layout, const db::Cell &cell, unsigned
|
|||
|
||||
emit_layer ();
|
||||
|
||||
*this << "94 " << tl::to_word_or_quoted_string(shape->text_string(), "0123456789:<>/&%$!.-_#+*?\\[]{}");
|
||||
*this << "94 " << tl::to_word_or_quoted_string (shape->text_string(), "0123456789:<>/&%$!.-_#+*?\\[]{}");
|
||||
|
||||
double h = shape->text_size () * layout.dbu ();
|
||||
|
||||
db::Vector p (shape->text_trans ().disp () * sf);
|
||||
*this << " " << p.x() << xy_sep () << p.y () << " " << h << ";" << endl;
|
||||
*this << " " << p.x() << xy_sep () << p.y () << " " << h << ";" << m_endl;
|
||||
|
||||
++shape;
|
||||
|
||||
|
|
@ -324,7 +322,7 @@ CIFWriter::write_polygon (const db::Polygon &polygon, double sf)
|
|||
db::Point pp (*p * sf);
|
||||
*this << " " << pp.x () << xy_sep () << pp.y ();
|
||||
}
|
||||
*this << ";" << endl;
|
||||
*this << ";" << m_endl;
|
||||
}
|
||||
|
||||
void
|
||||
|
|
@ -338,7 +336,7 @@ CIFWriter::write_boxes (const db::Layout & /*layout*/, const db::Cell &cell, uns
|
|||
emit_layer ();
|
||||
|
||||
db::Box b (shape->bbox () * sf);
|
||||
*this << "B " << b.width () << " " << b.height () << " " << b.center ().x () << xy_sep () << b.center ().y () << ";" << endl;
|
||||
*this << "B " << b.width () << " " << b.height () << " " << b.center ().x () << xy_sep () << b.center ().y () << ";" << m_endl;
|
||||
|
||||
++shape;
|
||||
|
||||
|
|
@ -411,13 +409,13 @@ CIFWriter::write_paths (const db::Layout & /*layout*/, const db::Cell &cell, uns
|
|||
db::Point pp (*shape->begin_point () * sf);
|
||||
*this << " " << pp.x () << xy_sep () << pp.y ();
|
||||
|
||||
*this << ";" << endl;
|
||||
*this << ";" << m_endl;
|
||||
|
||||
} else if (path_type >= 0 && npts > 1) {
|
||||
|
||||
emit_layer ();
|
||||
|
||||
*this << "98 " << path_type << ";" << endl;
|
||||
*this << "98 " << path_type << ";" << m_endl;
|
||||
|
||||
*this << "W " << long (floor (0.5 + sf * shape->path_width ()));
|
||||
|
||||
|
|
@ -426,7 +424,7 @@ CIFWriter::write_paths (const db::Layout & /*layout*/, const db::Cell &cell, uns
|
|||
*this << " " << pp.x () << xy_sep () << pp.y ();
|
||||
}
|
||||
|
||||
*this << ";" << endl;
|
||||
*this << ";" << m_endl;
|
||||
|
||||
} else {
|
||||
db::Polygon poly;
|
||||
|
|
|
|||
|
|
@ -66,7 +66,7 @@ private:
|
|||
tl::OutputStream *mp_stream;
|
||||
CIFWriterOptions m_options;
|
||||
tl::AbsoluteProgress m_progress;
|
||||
endl_tag endl;
|
||||
endl_tag m_endl;
|
||||
db::LayerProperties m_layer;
|
||||
bool m_needs_emit;
|
||||
|
||||
|
|
|
|||
|
|
@ -100,10 +100,9 @@ static
|
|||
gsi::ClassExt<db::LoadLayoutOptions> cif_reader_options (
|
||||
gsi::method_ext ("cif_set_layer_map", &set_layer_map, gsi::arg ("map"), gsi::arg ("create_other_layers"),
|
||||
"@brief Sets the layer map\n"
|
||||
"This sets a layer mapping for the reader. The \"create_other_layers\" specifies whether to create layers that are not "
|
||||
"in the mapping and automatically assign layers to them.\n"
|
||||
"@param map The layer map to set."
|
||||
"@param create_other_layers The flag telling whether other layer should be created also. Set to false if just the layers in the mapping table should be read.\n"
|
||||
"This sets a layer mapping for the reader. The layer map allows selection and translation of the original layers, for example to assign layer/datatype numbers to the named layers.\n"
|
||||
"@param map The layer map to set.\n"
|
||||
"@param create_other_layers The flag indicating whether other layers will be created as well. Set to false to read only the layers in the layer map.\n"
|
||||
"\n"
|
||||
"This method has been added in version 0.25 and replaces the respective global option in \\LoadLayoutOptions "
|
||||
"in a format-specific fashion."
|
||||
|
|
@ -111,7 +110,7 @@ gsi::ClassExt<db::LoadLayoutOptions> cif_reader_options (
|
|||
gsi::method_ext ("cif_layer_map=", &set_layer_map1, gsi::arg ("map"),
|
||||
"@brief Sets the layer map\n"
|
||||
"This sets a layer mapping for the reader. Unlike \\cif_set_layer_map, the 'create_other_layers' flag is not changed.\n"
|
||||
"@param map The layer map to set."
|
||||
"@param map The layer map to set.\n"
|
||||
"\n"
|
||||
"This convenience method has been added in version 0.26."
|
||||
) +
|
||||
|
|
@ -135,14 +134,17 @@ gsi::ClassExt<db::LoadLayoutOptions> cif_reader_options (
|
|||
) +
|
||||
gsi::method_ext ("cif_create_other_layers?", &create_other_layers,
|
||||
"@brief Gets a value indicating whether other layers shall be created\n"
|
||||
"@return True, if other layers should be created.\n"
|
||||
"@return True, if other layers will be created.\n"
|
||||
"This attribute acts together with a layer map (see \\cif_layer_map=). Layers not listed in this map are created as well when "
|
||||
"\\cif_create_other_layers? is true. Otherwise they are ignored.\n"
|
||||
"\n"
|
||||
"This method has been added in version 0.25 and replaces the respective global option in \\LoadLayoutOptions "
|
||||
"in a format-specific fashion."
|
||||
) +
|
||||
gsi::method_ext ("cif_create_other_layers=", &set_create_other_layers, gsi::arg ("create"),
|
||||
"@brief Specifies whether other layers shall be created\n"
|
||||
"@param create True, if other layers should be created.\n"
|
||||
"@param create True, if other layers will be created.\n"
|
||||
"See \\cif_create_other_layers? for a description of this attribute.\n"
|
||||
"\n"
|
||||
"This method has been added in version 0.25 and replaces the respective global option in \\LoadLayoutOptions "
|
||||
"in a format-specific fashion."
|
||||
|
|
@ -212,7 +214,7 @@ static bool get_cif_blank_separator (const db::SaveLayoutOptions *options)
|
|||
return options->get_options<db::CIFWriterOptions> ().blank_separator;
|
||||
}
|
||||
|
||||
// extend lay::SaveLayoutOptions with the GDS2 options
|
||||
// extend lay::SaveLayoutOptions with the CIF options
|
||||
static
|
||||
gsi::ClassExt<db::SaveLayoutOptions> cif_writer_options (
|
||||
gsi::method_ext ("cif_dummy_calls=", &set_cif_dummy_calls,
|
||||
|
|
|
|||
|
|
@ -174,10 +174,9 @@ static
|
|||
gsi::ClassExt<db::LoadLayoutOptions> dxf_reader_options (
|
||||
gsi::method_ext ("dxf_set_layer_map", &set_layer_map, gsi::arg ("map"), gsi::arg ("create_other_layers"),
|
||||
"@brief Sets the layer map\n"
|
||||
"This sets a layer mapping for the reader. The \"create_other_layers\" specifies whether to create layers that are not "
|
||||
"in the mapping and automatically assign layers to them.\n"
|
||||
"@param map The layer map to set."
|
||||
"@param create_other_layers The flag telling whether other layer should be created also. Set to false if just the layers in the mapping table should be read.\n"
|
||||
"This sets a layer mapping for the reader. The layer map allows selection and translation of the original layers, for example to assign layer/datatype numbers to the named layers.\n"
|
||||
"@param map The layer map to set.\n"
|
||||
"@param create_other_layers The flag indicating whether other layers will be created as well. Set to false to read only the layers in the layer map.\n"
|
||||
"\n"
|
||||
"This method has been added in version 0.25 and replaces the respective global option in \\LoadLayoutOptions "
|
||||
"in a format-specific fashion."
|
||||
|
|
@ -185,7 +184,7 @@ gsi::ClassExt<db::LoadLayoutOptions> dxf_reader_options (
|
|||
gsi::method_ext ("dxf_layer_map=", &set_layer_map1, gsi::arg ("map"),
|
||||
"@brief Sets the layer map\n"
|
||||
"This sets a layer mapping for the reader. Unlike \\dxf_set_layer_map, the 'create_other_layers' flag is not changed.\n"
|
||||
"@param map The layer map to set."
|
||||
"@param map The layer map to set.\n"
|
||||
"\n"
|
||||
"This convenience method has been added in version 0.26."
|
||||
) +
|
||||
|
|
@ -209,14 +208,17 @@ gsi::ClassExt<db::LoadLayoutOptions> dxf_reader_options (
|
|||
) +
|
||||
gsi::method_ext ("dxf_create_other_layers?", &create_other_layers,
|
||||
"@brief Gets a value indicating whether other layers shall be created\n"
|
||||
"@return True, if other layers should be created.\n"
|
||||
"@return True, if other layers will be created.\n"
|
||||
"This attribute acts together with a layer map (see \\dxf_layer_map=). Layers not listed in this map are created as well when "
|
||||
"\\dxf_create_other_layers? is true. Otherwise they are ignored.\n"
|
||||
"\n"
|
||||
"This method has been added in version 0.25 and replaces the respective global option in \\LoadLayoutOptions "
|
||||
"in a format-specific fashion."
|
||||
) +
|
||||
gsi::method_ext ("dxf_create_other_layers=", &set_create_other_layers, gsi::arg ("create"),
|
||||
"@brief Specifies whether other layers shall be created\n"
|
||||
"@param create True, if other layers should be created.\n"
|
||||
"@param create True, if other layers will be created.\n"
|
||||
"See \\dxf_create_other_layers? for a description of this attribute.\n"
|
||||
"\n"
|
||||
"This method has been added in version 0.25 and replaces the respective global option in \\LoadLayoutOptions "
|
||||
"in a format-specific fashion."
|
||||
|
|
|
|||
|
|
@ -190,7 +190,7 @@
|
|||
<string>...</string>
|
||||
</property>
|
||||
<property name="icon">
|
||||
<iconset resource="../../lay/lay/layResources.qrc">
|
||||
<iconset resource="../../../../lay/lay/layResources.qrc">
|
||||
<normaloff>:/clear.png</normaloff>:/clear.png</iconset>
|
||||
</property>
|
||||
</widget>
|
||||
|
|
@ -204,7 +204,7 @@
|
|||
<string>...</string>
|
||||
</property>
|
||||
<property name="icon">
|
||||
<iconset resource="../../lay/lay/layResources.qrc">
|
||||
<iconset resource="../../../../lay/lay/layResources.qrc">
|
||||
<normaloff>:/add.png</normaloff>:/add.png</iconset>
|
||||
</property>
|
||||
</widget>
|
||||
|
|
@ -218,7 +218,7 @@
|
|||
<string>...</string>
|
||||
</property>
|
||||
<property name="icon">
|
||||
<iconset resource="../../lay/lay/layResources.qrc">
|
||||
<iconset resource="../../../../lay/lay/layResources.qrc">
|
||||
<normaloff>:/up.png</normaloff>:/up.png</iconset>
|
||||
</property>
|
||||
</widget>
|
||||
|
|
@ -232,7 +232,7 @@
|
|||
<string>...</string>
|
||||
</property>
|
||||
<property name="icon">
|
||||
<iconset resource="../../lay/lay/layResources.qrc">
|
||||
<iconset resource="../../../../lay/lay/layResources.qrc">
|
||||
<normaloff>:/down.png</normaloff>:/down.png</iconset>
|
||||
</property>
|
||||
</widget>
|
||||
|
|
@ -298,7 +298,7 @@
|
|||
<tabstop>buttonBox</tabstop>
|
||||
</tabstops>
|
||||
<resources>
|
||||
<include location="../../lay/lay/layResources.qrc"/>
|
||||
<include location="../../../../lay/lay/layResources.qrc"/>
|
||||
</resources>
|
||||
<connections>
|
||||
<connection>
|
||||
|
|
|
|||
|
|
@ -0,0 +1,118 @@
|
|||
|
||||
/*
|
||||
|
||||
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 "dbMAG.h"
|
||||
#include "dbMAGReader.h"
|
||||
#include "dbMAGWriter.h"
|
||||
#include "dbStream.h"
|
||||
|
||||
#include "tlClassRegistry.h"
|
||||
|
||||
namespace db
|
||||
{
|
||||
|
||||
// ---------------------------------------------------------------
|
||||
// MAGDiagnostics implementation
|
||||
|
||||
MAGDiagnostics::~MAGDiagnostics ()
|
||||
{
|
||||
// .. nothing yet ..
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------
|
||||
// MAG format declaration
|
||||
|
||||
class MAGFormatDeclaration
|
||||
: public db::StreamFormatDeclaration
|
||||
{
|
||||
public:
|
||||
MAGFormatDeclaration ()
|
||||
{
|
||||
// .. nothing yet ..
|
||||
}
|
||||
|
||||
virtual std::string format_name () const { return "MAG"; }
|
||||
virtual std::string format_desc () const { return "Magic"; }
|
||||
virtual std::string format_title () const { return "MAG (Magic layout format)"; }
|
||||
virtual std::string file_format () const { return "Magic files (*.MAG *.mag *.mag.gz *.MAG.gz)"; }
|
||||
|
||||
virtual bool detect (tl::InputStream &s) const
|
||||
{
|
||||
return s.read_all (5) == "magic";
|
||||
}
|
||||
|
||||
virtual ReaderBase *create_reader (tl::InputStream &s) const
|
||||
{
|
||||
return new db::MAGReader (s);
|
||||
}
|
||||
|
||||
virtual WriterBase *create_writer () const
|
||||
{
|
||||
return new db::MAGWriter ();
|
||||
}
|
||||
|
||||
virtual bool can_read () const
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
virtual bool can_write () const
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
virtual tl::XMLElementBase *xml_reader_options_element () const
|
||||
{
|
||||
return new db::ReaderOptionsXMLElement<db::MAGReaderOptions> ("mag",
|
||||
tl::make_member (&db::MAGReaderOptions::lambda, "lambda") +
|
||||
tl::make_member (&db::MAGReaderOptions::dbu, "dbu") +
|
||||
tl::make_member (&db::MAGReaderOptions::layer_map, "layer-map") +
|
||||
tl::make_member (&db::MAGReaderOptions::create_other_layers, "create-other-layers") +
|
||||
tl::make_member (&db::MAGReaderOptions::keep_layer_names, "keep-layer-names") +
|
||||
tl::make_member (&db::MAGReaderOptions::merge, "merge") +
|
||||
tl::make_element<std::vector<std::string>, db::MAGReaderOptions> (&db::MAGReaderOptions::lib_paths, "lib-paths",
|
||||
tl::make_member<std::string, std::vector<std::string>::const_iterator, std::vector<std::string> > (&std::vector<std::string>::begin, &std::vector<std::string>::end, &std::vector<std::string>::push_back, "lib-path")
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
virtual tl::XMLElementBase *xml_writer_options_element () const
|
||||
{
|
||||
return new db::WriterOptionsXMLElement<db::MAGWriterOptions> ("mag",
|
||||
tl::make_member (&db::MAGWriterOptions::lambda, "lambda") +
|
||||
tl::make_member (&db::MAGWriterOptions::tech, "tech") +
|
||||
tl::make_member (&db::MAGWriterOptions::write_timestamp, "write-timestamp")
|
||||
);
|
||||
}
|
||||
};
|
||||
|
||||
// NOTE: Because MAG has such a high degree of syntactic freedom, the detection is somewhat
|
||||
// fuzzy: do MAG at the very end of the detection chain
|
||||
static tl::RegisteredClass<db::StreamFormatDeclaration> reader_decl (new MAGFormatDeclaration (), 2200, "MAG");
|
||||
|
||||
// provide a symbol to force linking against
|
||||
int force_link_MAG = 0;
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -0,0 +1,62 @@
|
|||
|
||||
/*
|
||||
|
||||
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
|
||||
|
||||
*/
|
||||
|
||||
|
||||
#ifndef HDR_dbMAG
|
||||
#define HDR_dbMAG
|
||||
|
||||
#include "dbPoint.h"
|
||||
|
||||
#include "tlException.h"
|
||||
#include "tlInternational.h"
|
||||
#include "tlString.h"
|
||||
#include "tlAssert.h"
|
||||
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
namespace db
|
||||
{
|
||||
|
||||
/**
|
||||
* @brief The diagnostics interface for reporting problems in the reader or writer
|
||||
*/
|
||||
class MAGDiagnostics
|
||||
{
|
||||
public:
|
||||
virtual ~MAGDiagnostics ();
|
||||
|
||||
/**
|
||||
* @brief Issue an error with positional information
|
||||
*/
|
||||
virtual void error (const std::string &txt) = 0;
|
||||
|
||||
/**
|
||||
* @brief Issue a warning with positional information
|
||||
*/
|
||||
virtual void warn (const std::string &txt) = 0;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
|
|
@ -0,0 +1,199 @@
|
|||
|
||||
/*
|
||||
|
||||
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
|
||||
|
||||
*/
|
||||
|
||||
#ifndef HDR_dbMAGFormat
|
||||
#define HDR_dbMAGFormat
|
||||
|
||||
#include "dbSaveLayoutOptions.h"
|
||||
#include "dbLoadLayoutOptions.h"
|
||||
#include "dbPluginCommon.h"
|
||||
|
||||
namespace db
|
||||
{
|
||||
|
||||
/**
|
||||
* @brief Structure that holds the MAG specific options for the reader
|
||||
* NOTE: this structure is non-public linkage by intention. This way it's instantiated
|
||||
* in all compile units and the shared object does not need to be linked.
|
||||
*/
|
||||
class DB_PLUGIN_PUBLIC MAGReaderOptions
|
||||
: public FormatSpecificReaderOptions
|
||||
{
|
||||
public:
|
||||
/**
|
||||
* @brief The constructor
|
||||
*/
|
||||
MAGReaderOptions ()
|
||||
: lambda (1.0),
|
||||
dbu (0.001),
|
||||
create_other_layers (true),
|
||||
keep_layer_names (false),
|
||||
merge (true)
|
||||
{
|
||||
// .. nothing yet ..
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Specifies the lambda value
|
||||
*
|
||||
* The lambda value is the basic scaling parameter
|
||||
*/
|
||||
double lambda;
|
||||
|
||||
/**
|
||||
* @brief Specify the database unit to produce
|
||||
*
|
||||
* Specify the database unit which the resulting layout will receive.
|
||||
*/
|
||||
double dbu;
|
||||
|
||||
/**
|
||||
* @brief Specifies a layer mapping
|
||||
*
|
||||
* If a layer mapping is specified, only the given layers are read.
|
||||
* Otherwise, all layers are read.
|
||||
* Setting "create_other_layers" to true will make the reader
|
||||
* create other layers for all layers not given in the layer map.
|
||||
* Setting an empty layer map and create_other_layers to true effectively
|
||||
* enables all layers for reading.
|
||||
*/
|
||||
db::LayerMap layer_map;
|
||||
|
||||
/**
|
||||
* @brief A flag indicating that a new layers shall be created
|
||||
*
|
||||
* If this flag is set to true, layers not listed in the layer map a created
|
||||
* too.
|
||||
*/
|
||||
bool create_other_layers;
|
||||
|
||||
/**
|
||||
* @brief A flag indicating whether the names of layers shall be kept as such
|
||||
*
|
||||
* If this flag is set to false (the default), layer name translation happens.
|
||||
* If set to true, translation will not happen.
|
||||
* Name translation will try to extract GDS layer/datatype numbers from the
|
||||
* layer names. If this value is set to true, no name translation happens.
|
||||
*/
|
||||
bool keep_layer_names;
|
||||
|
||||
/**
|
||||
* @brief A flag indicating whether to merge boxes into polygons
|
||||
*
|
||||
* If this flag is set to true (the default), the boxes of the Magic
|
||||
* layout files are merged into polygons.
|
||||
*/
|
||||
bool merge;
|
||||
|
||||
/**
|
||||
* @brief The library paths
|
||||
*
|
||||
* The library paths are the places where library references are looked up from.
|
||||
* Expression interpolation happens inside these paths.
|
||||
* "tech_dir", "tech_file", "tech_name" are variables by which you can refer to
|
||||
* technology parameters. Relative paths will be resolved relative to the current
|
||||
* file read.
|
||||
*/
|
||||
std::vector<std::string> lib_paths;
|
||||
|
||||
/**
|
||||
* @brief Implementation of FormatSpecificReaderOptions
|
||||
*/
|
||||
virtual FormatSpecificReaderOptions *clone () const
|
||||
{
|
||||
return new MAGReaderOptions (*this);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Implementation of FormatSpecificReaderOptions
|
||||
*/
|
||||
virtual const std::string &format_name () const
|
||||
{
|
||||
static const std::string n ("MAG");
|
||||
return n;
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* @brief Structure that holds the MAG specific options for the Writer
|
||||
* NOTE: this structure is non-public linkage by intention. This way it's instantiated
|
||||
* in all compile units and the shared object does not need to be linked.
|
||||
*/
|
||||
class DB_PLUGIN_PUBLIC MAGWriterOptions
|
||||
: public FormatSpecificWriterOptions
|
||||
{
|
||||
public:
|
||||
/**
|
||||
* @brief The constructor
|
||||
*/
|
||||
MAGWriterOptions ()
|
||||
: lambda (0.0), write_timestamp (true)
|
||||
{
|
||||
// .. nothing yet ..
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Specifies the lambda value for writing
|
||||
*
|
||||
* The lambda value is the basic scaling parameter.
|
||||
* If this value is set to 0 or negative, the lambda value stored in the layout
|
||||
* is used (meta data "lambda").
|
||||
*/
|
||||
double lambda;
|
||||
|
||||
/**
|
||||
* @brief Specifies the technology value for writing Magic files
|
||||
*
|
||||
* If this value is set an empty string, the technology store in the layout's
|
||||
* "technology" meta data is used.
|
||||
*/
|
||||
std::string tech;
|
||||
|
||||
/**
|
||||
* @brief A value indicating whether the real (true) or fake (false) timestamp is written
|
||||
*
|
||||
* A fake, static timestamp is useful for comparing files.
|
||||
*/
|
||||
bool write_timestamp;
|
||||
|
||||
/**
|
||||
* @brief Implementation of FormatSpecificWriterOptions
|
||||
*/
|
||||
virtual FormatSpecificWriterOptions *clone () const
|
||||
{
|
||||
return new MAGWriterOptions (*this);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Implementation of FormatSpecificWriterOptions
|
||||
*/
|
||||
virtual const std::string &format_name () const
|
||||
{
|
||||
static std::string n ("MAG");
|
||||
return n;
|
||||
}
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
|
|
@ -0,0 +1,669 @@
|
|||
|
||||
/*
|
||||
|
||||
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 "dbMAGReader.h"
|
||||
#include "dbStream.h"
|
||||
#include "dbObjectWithProperties.h"
|
||||
#include "dbArray.h"
|
||||
#include "dbStatic.h"
|
||||
#include "dbShapeProcessor.h"
|
||||
#include "dbTechnology.h"
|
||||
|
||||
#include "tlException.h"
|
||||
#include "tlString.h"
|
||||
#include "tlClassRegistry.h"
|
||||
#include "tlFileUtils.h"
|
||||
#include "tlUri.h"
|
||||
|
||||
#include <cctype>
|
||||
#include <string>
|
||||
|
||||
namespace db
|
||||
{
|
||||
|
||||
// ---------------------------------------------------------------
|
||||
// MAGReader
|
||||
|
||||
|
||||
MAGReader::MAGReader (tl::InputStream &s)
|
||||
: m_stream (s),
|
||||
m_progress (tl::to_string (tr ("Reading MAG file")), 1000),
|
||||
m_lambda (1.0), m_dbu (0.001), m_merge (true), mp_klayout_tech (0)
|
||||
{
|
||||
m_progress.set_format (tl::to_string (tr ("%.0fk lines")));
|
||||
m_progress.set_format_unit (1000.0);
|
||||
m_progress.set_unit (100000.0);
|
||||
|
||||
mp_current_stream = 0;
|
||||
}
|
||||
|
||||
MAGReader::~MAGReader ()
|
||||
{
|
||||
// .. nothing yet ..
|
||||
}
|
||||
|
||||
const LayerMap &
|
||||
MAGReader::read (db::Layout &layout)
|
||||
{
|
||||
return read (layout, db::LoadLayoutOptions ());
|
||||
}
|
||||
|
||||
const LayerMap &
|
||||
MAGReader::read (db::Layout &layout, const db::LoadLayoutOptions &options)
|
||||
{
|
||||
prepare_layers ();
|
||||
|
||||
mp_klayout_tech = 0;
|
||||
std::string klayout_tech_name = layout.meta_info_value ("technology");
|
||||
if (! klayout_tech_name.empty () && db::Technologies::instance ()->has_technology (klayout_tech_name)) {
|
||||
mp_klayout_tech = db::Technologies::instance ()->technology_by_name (klayout_tech_name);
|
||||
}
|
||||
|
||||
const db::MAGReaderOptions &specific_options = options.get_options<db::MAGReaderOptions> ();
|
||||
m_lambda = specific_options.lambda;
|
||||
m_dbu = specific_options.dbu;
|
||||
m_lib_paths = specific_options.lib_paths;
|
||||
m_merge = specific_options.merge;
|
||||
mp_current_stream = 0;
|
||||
|
||||
db::LayerMap lm = specific_options.layer_map;
|
||||
lm.prepare (layout);
|
||||
set_layer_map (lm);
|
||||
set_create_layers (specific_options.create_other_layers);
|
||||
set_keep_layer_names (specific_options.keep_layer_names);
|
||||
|
||||
std::string top_cellname = cell_name_from_path (m_stream.source ());
|
||||
db::cell_index_type top_cell;
|
||||
if (layout.has_cell (top_cellname.c_str ())) {
|
||||
top_cell = layout.cell_by_name (top_cellname.c_str ()).second;
|
||||
} else {
|
||||
top_cell = layout.add_cell (top_cellname.c_str ());
|
||||
}
|
||||
|
||||
layout.dbu (m_dbu);
|
||||
|
||||
m_cells_to_read.clear ();
|
||||
m_cells_read.clear ();
|
||||
m_use_lib_paths.clear ();
|
||||
m_dbu_trans_inv = db::CplxTrans (m_dbu).inverted ();
|
||||
m_tech.clear ();
|
||||
|
||||
{
|
||||
tl::SelfTimer timer (tl::verbosity () >= 21, "Reading MAGIC file tree");
|
||||
|
||||
// This is the seed
|
||||
do_read (layout, top_cell, m_stream);
|
||||
|
||||
while (! m_cells_to_read.empty ()) {
|
||||
|
||||
std::pair<std::string, std::pair<std::string, db::cell_index_type> > next = *m_cells_to_read.begin ();
|
||||
m_cells_to_read.erase (m_cells_to_read.begin ());
|
||||
|
||||
tl::InputStream stream (next.second.first);
|
||||
tl::TextInputStream text_stream (stream);
|
||||
do_read (layout, next.second.second, text_stream);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
finish_layers (layout);
|
||||
return layer_map ();
|
||||
}
|
||||
|
||||
void
|
||||
MAGReader::error (const std::string &msg)
|
||||
{
|
||||
throw MAGReaderException (msg, mp_current_stream->line_number (), mp_current_stream->source ());
|
||||
}
|
||||
|
||||
void
|
||||
MAGReader::warn (const std::string &msg)
|
||||
{
|
||||
// TODO: compress
|
||||
tl::warn << msg
|
||||
<< tl::to_string (tr (" (line=")) << mp_current_stream->line_number ()
|
||||
<< tl::to_string (tr (", file=")) << mp_current_stream->source ()
|
||||
<< ")";
|
||||
}
|
||||
|
||||
db::cell_index_type
|
||||
MAGReader::cell_from_path (const std::string &path, db::Layout &layout)
|
||||
{
|
||||
std::string cellname = tl::filename (path);
|
||||
|
||||
std::map<std::string, db::cell_index_type>::const_iterator c = m_cells_read.find (cellname);
|
||||
if (c != m_cells_read.end ()) {
|
||||
return c->second;
|
||||
}
|
||||
|
||||
// NOTE: this can lead to cell variants if a cell is present with different library paths ... (L500_CHAR_p)
|
||||
db::cell_index_type ci;
|
||||
if (layout.has_cell (cellname.c_str ())) {
|
||||
// NOTE: this reuses an existing cell and will add(!) the layout to the latter. This
|
||||
// enables "incremental read" like for GDS files.
|
||||
ci = layout.cell_by_name (cellname.c_str ()).second;
|
||||
} else {
|
||||
ci = layout.add_cell (cell_name_from_path (path).c_str ());
|
||||
}
|
||||
m_cells_read.insert (std::make_pair (cellname, ci));
|
||||
|
||||
std::string cell_file;
|
||||
if (! resolve_path (path, layout, cell_file)) {
|
||||
// skip with a warning if the file can't be opened (TODO: better to raise an error?)
|
||||
tl::warn << tl::to_string (tr ("Unable to find a layout file for cell - skipping this cell: ")) << path;
|
||||
layout.cell (ci).set_ghost_cell (true);
|
||||
} else {
|
||||
m_cells_to_read.insert (std::make_pair (cellname, std::make_pair (cell_file, ci)));
|
||||
}
|
||||
|
||||
return ci;
|
||||
}
|
||||
|
||||
std::string
|
||||
MAGReader::cell_name_from_path (const std::string &path)
|
||||
{
|
||||
std::string file = tl::split (path, "/").back ();
|
||||
return tl::split (file, ".").front ();
|
||||
}
|
||||
|
||||
static bool find_and_normalize_file (const tl::URI &uri, std::string &path)
|
||||
{
|
||||
// TODO: sync with plugin definition
|
||||
static const char *extensions[] = {
|
||||
".mag", ".mag.gz", ".MAG", ".MAG.gz"
|
||||
};
|
||||
|
||||
for (size_t e = 0; e < sizeof (extensions) / sizeof (extensions [0]); ++e) {
|
||||
|
||||
if (uri.scheme ().empty () || uri.scheme () == "file") {
|
||||
|
||||
std::string fp = uri.path () + extensions[e];
|
||||
|
||||
if (tl::verbosity () >= 30) {
|
||||
tl::log << tl::to_string (tr ("Trying layout file: ")) << fp;
|
||||
}
|
||||
|
||||
if (tl::file_exists (fp)) {
|
||||
path = fp;
|
||||
return true;
|
||||
}
|
||||
|
||||
} else {
|
||||
|
||||
// TODO: this is not quite efficient, but the only thing we can do for now
|
||||
tl::URI uri_with_ext = uri;
|
||||
uri_with_ext.set_path (uri_with_ext.path () + extensions[e]);
|
||||
std::string us = uri_with_ext.to_string ();
|
||||
|
||||
if (tl::verbosity () >= 30) {
|
||||
tl::log << tl::to_string (tr ("Trying layout URI: ")) << us;
|
||||
}
|
||||
|
||||
try {
|
||||
tl::InputStream is (us);
|
||||
if (is.get (1)) {
|
||||
path = us;
|
||||
return true;
|
||||
}
|
||||
} catch (...) {
|
||||
// .. nothing yet ..
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool
|
||||
MAGReader::resolve_path (const std::string &path, const db::Layout & /*layout*/, std::string &real_path)
|
||||
{
|
||||
tl::Eval expr;
|
||||
|
||||
// the variables supported for evaluation are
|
||||
// "tech_name": the name of the KLayout technology this file is loaded for (this may be the Magic technology name)
|
||||
// "tech_dir": the path to KLayout's technology folder for "tech_name" or the default technology's folder path
|
||||
// "magic_tech": the technology name from the Magic file currently read
|
||||
|
||||
if (mp_klayout_tech) {
|
||||
expr.set_var ("tech_dir", mp_klayout_tech->base_path ());
|
||||
expr.set_var ("tech_name", mp_klayout_tech->name ());
|
||||
} else {
|
||||
expr.set_var ("tech_dir", std::string ("."));
|
||||
expr.set_var ("tech_name", std::string ());
|
||||
}
|
||||
expr.set_var ("magic_tech", m_tech);
|
||||
|
||||
tl::URI path_uri (path);
|
||||
|
||||
// absolute URIs are kept - we just try to figure out the suffix
|
||||
if (tl::is_absolute (path_uri.path ())) {
|
||||
return find_and_normalize_file (path_uri, real_path);
|
||||
}
|
||||
|
||||
tl::URI source_uri (mp_current_stream->source ());
|
||||
source_uri.set_path (tl::dirname (source_uri.path ()));
|
||||
|
||||
// first attempt: try relative to source
|
||||
if (find_and_normalize_file (source_uri.resolved (tl::URI (path)), real_path)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
// then try relative to library paths
|
||||
for (std::vector<std::string>::const_iterator lp = m_lib_paths.begin (); lp != m_lib_paths.end (); ++lp) {
|
||||
std::string lib_path = expr.interpolate (*lp);
|
||||
if (find_and_normalize_file (source_uri.resolved (tl::URI (lib_path).resolved (tl::URI (path))), real_path)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
void
|
||||
MAGReader::do_read (db::Layout &layout, db::cell_index_type cell_index, tl::TextInputStream &stream)
|
||||
{
|
||||
try {
|
||||
|
||||
mp_current_stream = &stream;
|
||||
do_read_part (layout, cell_index, stream);
|
||||
|
||||
if (m_merge) {
|
||||
do_merge_part (layout, cell_index);
|
||||
}
|
||||
|
||||
} catch (tl::Exception &ex) {
|
||||
error (ex.msg ());
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
MAGReader::do_read_part (db::Layout &layout, db::cell_index_type cell_index, tl::TextInputStream &stream)
|
||||
{
|
||||
tl::SelfTimer timer (tl::verbosity () >= 31, "File read");
|
||||
|
||||
if (tl::verbosity () >= 30) {
|
||||
tl::log << "Reading layout file: " << stream.source ();
|
||||
}
|
||||
|
||||
std::string l = stream.get_line ();
|
||||
if (l != "magic") {
|
||||
error (tl::to_string (tr ("Could not find 'magic' header line - is this a MAGIC file?")));
|
||||
}
|
||||
|
||||
layout.add_meta_info (db::MetaInfo ("lambda", "lambda value (tech scaling)", tl::to_string (m_lambda)));
|
||||
|
||||
bool valid_layer = false;
|
||||
unsigned int current_layer = 0;
|
||||
bool in_labels = false;
|
||||
|
||||
while (! stream.at_end ()) {
|
||||
|
||||
std::string l = stream.get_line ();
|
||||
tl::Extractor ex (l.c_str ());
|
||||
|
||||
if (ex.at_end () || ex.test ("#")) {
|
||||
|
||||
// skip empty lines and comments
|
||||
continue;
|
||||
|
||||
} else if (ex.test ("tech")) {
|
||||
|
||||
ex.read_word_or_quoted (m_tech);
|
||||
|
||||
if (&m_stream == &stream) {
|
||||
|
||||
// initial file - store technology
|
||||
layout.add_meta_info (db::MetaInfo ("magic_technology", tl::to_string (tr ("MAGIC technology string")), m_tech));
|
||||
|
||||
// propose this is the KLayout technology unless a good one is given
|
||||
if (! mp_klayout_tech) {
|
||||
layout.add_meta_info (db::MetaInfo ("technology", tl::to_string (tr ("Technology name")), m_tech));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
ex.expect_end ();
|
||||
|
||||
} else if (ex.test ("timestamp")) {
|
||||
|
||||
size_t ts = 0;
|
||||
ex.read (ts);
|
||||
|
||||
if (&m_stream == &stream) {
|
||||
// initial file - store timestamp
|
||||
layout.add_meta_info (db::MetaInfo ("magic_timestamp", "MAGIC main file timestamp", tl::to_string (ts)));
|
||||
}
|
||||
|
||||
ex.expect_end ();
|
||||
|
||||
} else if (ex.test ("<<")) {
|
||||
|
||||
std::string lname;
|
||||
ex.read_word_or_quoted (lname);
|
||||
|
||||
if (lname == "end") {
|
||||
in_labels = false;
|
||||
valid_layer = false;
|
||||
} else if (lname == "labels") {
|
||||
in_labels = true;
|
||||
} else if (lname == "checkpaint") {
|
||||
// ignore "checkpaint" internal layer
|
||||
in_labels = false;
|
||||
valid_layer = false;
|
||||
} else {
|
||||
in_labels = false;
|
||||
std::pair<bool, unsigned int> ll = open_layer (layout, lname);
|
||||
valid_layer = ll.first;
|
||||
current_layer = ll.second;
|
||||
}
|
||||
|
||||
ex.expect (">>");
|
||||
ex.expect_end ();
|
||||
|
||||
} else if (ex.test ("rect")) {
|
||||
|
||||
if (in_labels) {
|
||||
error (tl::to_string (tr ("'rect' statement inside labels section")));
|
||||
} else if (valid_layer) {
|
||||
read_rect (ex, layout, cell_index, current_layer);
|
||||
}
|
||||
|
||||
} else if (ex.test ("tri")) {
|
||||
|
||||
if (in_labels) {
|
||||
error (tl::to_string (tr ("'rect' statement inside labels section")));
|
||||
} else if (valid_layer) {
|
||||
read_tri (ex, layout, cell_index, current_layer);
|
||||
}
|
||||
|
||||
} else if (ex.test ("rlabel")) {
|
||||
|
||||
if (! in_labels) {
|
||||
error (tl::to_string (tr ("'rlabel' statement outside labels section")));
|
||||
} else {
|
||||
read_rlabel (ex, layout, cell_index);
|
||||
}
|
||||
|
||||
} else if (ex.test ("use")) {
|
||||
|
||||
read_cell_instance (ex, stream, layout, cell_index);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
MAGReader::do_merge_part (Layout &layout, cell_index_type cell_index)
|
||||
{
|
||||
tl::SelfTimer timer (tl::verbosity () >= 31, "Merge step");
|
||||
|
||||
db::Cell &cell = layout.cell (cell_index);
|
||||
db::ShapeProcessor sp;
|
||||
if (tl::verbosity () >= 40) {
|
||||
sp.enable_progress (tl::to_string (tr ("Merging shapes for MAG reader")));
|
||||
} else {
|
||||
sp.disable_progress ();
|
||||
}
|
||||
sp.set_base_verbosity (40);
|
||||
|
||||
std::vector<db::Text> saved_texts;
|
||||
|
||||
for (db::Layout::layer_iterator l = layout.begin_layers (); l != layout.end_layers (); ++l) {
|
||||
|
||||
unsigned int li = (unsigned int) (*l).first;
|
||||
db::Shapes &shapes = cell.shapes (li);
|
||||
|
||||
// save texts before merge
|
||||
saved_texts.clear ();
|
||||
for (db::Shapes::shape_iterator t = shapes.begin (db::ShapeIterator::Texts); ! t.at_end (); ++t) {
|
||||
saved_texts.push_back (db::Text ());
|
||||
t->text (saved_texts.back ());
|
||||
}
|
||||
|
||||
sp.merge (layout, cell, li, shapes, false);
|
||||
|
||||
// re-insert the texts
|
||||
for (std::vector<db::Text>::const_iterator t = saved_texts.begin (); t != saved_texts.end (); ++t) {
|
||||
shapes.insert (*t);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
MAGReader::read_rect (tl::Extractor &ex, Layout &layout, cell_index_type cell_index, unsigned int layer)
|
||||
{
|
||||
double l, b, r, t;
|
||||
ex.read (l);
|
||||
ex.read (b);
|
||||
ex.read (r);
|
||||
ex.read (t);
|
||||
ex.expect_end ();
|
||||
|
||||
db::DBox box (l, b, r, t);
|
||||
layout.cell (cell_index).shapes (layer).insert ((box * m_lambda).transformed (m_dbu_trans_inv));
|
||||
}
|
||||
|
||||
void
|
||||
MAGReader::read_tri (tl::Extractor &ex, Layout &layout, cell_index_type cell_index, unsigned int layer)
|
||||
{
|
||||
double l, b, r, t;
|
||||
ex.read (l);
|
||||
ex.read (b);
|
||||
ex.read (r);
|
||||
ex.read (t);
|
||||
|
||||
bool s = false, e = false;
|
||||
while (! ex.at_end ()) {
|
||||
if (ex.test ("s")) {
|
||||
s = true;
|
||||
} else if (ex.test ("e")) {
|
||||
e = true;
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
ex.expect_end ();
|
||||
|
||||
std::vector<db::Point> pts;
|
||||
|
||||
if (s && e) {
|
||||
pts.push_back (db::Point (l, b));
|
||||
pts.push_back (db::Point (r, t));
|
||||
pts.push_back (db::Point (r, b));
|
||||
} else if (s) {
|
||||
pts.push_back (db::Point (l, b));
|
||||
pts.push_back (db::Point (l, t));
|
||||
pts.push_back (db::Point (r, b));
|
||||
} else if (e) {
|
||||
pts.push_back (db::Point (r, b));
|
||||
pts.push_back (db::Point (l, t));
|
||||
pts.push_back (db::Point (r, t));
|
||||
} else {
|
||||
pts.push_back (db::Point (l, b));
|
||||
pts.push_back (db::Point (l, t));
|
||||
pts.push_back (db::Point (r, t));
|
||||
}
|
||||
|
||||
db::SimplePolygon poly;
|
||||
poly.assign_hull (pts.begin (), pts.end ());
|
||||
layout.cell (cell_index).shapes (layer).insert ((poly * m_lambda).transformed (m_dbu_trans_inv));
|
||||
}
|
||||
|
||||
void
|
||||
MAGReader::read_rlabel (tl::Extractor &ex, Layout &layout, cell_index_type cell_index)
|
||||
{
|
||||
std::string lname;
|
||||
ex.read (lname);
|
||||
|
||||
double l, b, r, t;
|
||||
ex.read (l);
|
||||
ex.read (b);
|
||||
ex.read (r);
|
||||
ex.read (t);
|
||||
|
||||
int pos = 0;
|
||||
ex.read (pos);
|
||||
|
||||
ex.skip ();
|
||||
db::DText text (ex.get (), db::DTrans ());
|
||||
|
||||
double x = 0.5 * (l + r);
|
||||
double y = 0.5 * (b + t);
|
||||
if (pos == 2 || pos == 3 || pos == 4) {
|
||||
text.halign (db::HAlignRight);
|
||||
x = r;
|
||||
} else if (pos == 6 || pos == 7 || pos == 8) {
|
||||
text.halign (db::HAlignLeft);
|
||||
x = l;
|
||||
} else {
|
||||
text.halign (db::HAlignCenter);
|
||||
}
|
||||
if (pos == 1 || pos == 2 || pos == 8) {
|
||||
text.valign (db::VAlignTop);
|
||||
y = t;
|
||||
} else if (pos == 4 || pos == 5 || pos == 6) {
|
||||
text.valign (db::VAlignBottom);
|
||||
y = b;
|
||||
} else {
|
||||
text.valign (db::VAlignCenter);
|
||||
}
|
||||
|
||||
text.move (db::DVector (x, y));
|
||||
|
||||
if (true || lname != "space") { // really? "space"? ignore it?
|
||||
std::pair<bool, unsigned int> ll = open_layer (layout, lname);
|
||||
if (ll.first) {
|
||||
layout.cell (cell_index).shapes (ll.second).insert ((text * m_lambda).transformed (m_dbu_trans_inv));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
MAGReader::read_cell_instance (tl::Extractor &ex, tl::TextInputStream &stream, Layout &layout, cell_index_type cell_index)
|
||||
{
|
||||
const char *include_chars_in_files = "$_,.-$+#:;[]()<>|/\\";
|
||||
|
||||
std::string filename, use_id, lib_path;
|
||||
ex.read_word_or_quoted (filename, include_chars_in_files);
|
||||
if (! ex.at_end ()) {
|
||||
ex.read_word_or_quoted (use_id);
|
||||
}
|
||||
if (! ex.at_end ()) {
|
||||
ex.read_word_or_quoted (lib_path, include_chars_in_files);
|
||||
}
|
||||
|
||||
if (lib_path.empty ()) {
|
||||
std::map<std::string, std::string>::const_iterator lp = m_use_lib_paths.find (filename);
|
||||
if (lp != m_use_lib_paths.end ()) {
|
||||
lib_path = lp->second;
|
||||
}
|
||||
} else {
|
||||
// give precendence to lib_path
|
||||
filename = tl::filename (filename);
|
||||
// save for next use
|
||||
m_use_lib_paths.insert (std::make_pair (filename, lib_path));
|
||||
}
|
||||
|
||||
if (! lib_path.empty ()) {
|
||||
// NOTE: we don't use the system separator because it looks like MAG files use "/".
|
||||
filename = lib_path + "/" + filename;
|
||||
}
|
||||
|
||||
// read more lines until box
|
||||
|
||||
db::DVector a, b, p;
|
||||
unsigned long na = 1, nb = 1;
|
||||
|
||||
db::DCplxTrans trans;
|
||||
|
||||
while (! stream.at_end ()) {
|
||||
|
||||
std::string l = stream.get_line ();
|
||||
tl::Extractor ex2 (l.c_str ());
|
||||
|
||||
if (ex2.at_end () || ex2.test ("#")) {
|
||||
continue;
|
||||
} else if (ex2.test ("array")) {
|
||||
|
||||
int xlo = 0, xhi = 0, ylo = 0, yhi = 0;
|
||||
double xsep = 0.0, ysep = 0.0;
|
||||
|
||||
ex2.read (xlo);
|
||||
ex2.read (xhi);
|
||||
ex2.read (xsep);
|
||||
|
||||
ex2.read (ylo);
|
||||
ex2.read (yhi);
|
||||
ex2.read (ysep);
|
||||
|
||||
na = (unsigned long) std::max (0, xhi - xlo + 1);
|
||||
a = db::DVector (xsep, 0) * m_lambda;
|
||||
nb = (unsigned long) std::max (0, yhi - ylo + 1);
|
||||
b = db::DVector (0, ysep) * m_lambda;
|
||||
|
||||
} else if (ex2.test ("timestamp")) {
|
||||
// ignored
|
||||
} else if (ex2.test ("transform")) {
|
||||
|
||||
double m11 = 0.0, m12 = 0.0, m21 = 0.0, m22 = 0.0;
|
||||
double dx = 0.0, dy = 0.0;
|
||||
|
||||
ex2.read (m11);
|
||||
ex2.read (m12);
|
||||
ex2.read (dx);
|
||||
ex2.read (m21);
|
||||
ex2.read (m22);
|
||||
ex2.read (dy);
|
||||
|
||||
trans = db::DCplxTrans (db::Matrix2d (m11, m12, m21, m22), db::DVector (dx, dy) * m_lambda);
|
||||
|
||||
} else if (ex2.test ("box")) {
|
||||
// ignored
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// create the instance
|
||||
|
||||
a = trans * a;
|
||||
b = trans * b;
|
||||
|
||||
db::cell_index_type ci = cell_from_path (filename, layout);
|
||||
|
||||
db::ICplxTrans itrans = m_dbu_trans_inv * trans * db::CplxTrans (m_dbu);
|
||||
|
||||
if (na == 1 && nb == 1) {
|
||||
layout.cell (cell_index).insert (db::CellInstArray (db::CellInst (ci), itrans));
|
||||
} else {
|
||||
layout.cell (cell_index).insert (db::CellInstArray (db::CellInst (ci), itrans, m_dbu_trans_inv * a, m_dbu_trans_inv * b, na, nb));
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
|
@ -0,0 +1,165 @@
|
|||
|
||||
/*
|
||||
|
||||
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
|
||||
|
||||
*/
|
||||
|
||||
|
||||
|
||||
#ifndef HDR_dbMAGReader
|
||||
#define HDR_dbMAGReader
|
||||
|
||||
#include "dbPluginCommon.h"
|
||||
#include "dbNamedLayerReader.h"
|
||||
#include "dbLayout.h"
|
||||
#include "dbMAG.h"
|
||||
#include "dbMAGFormat.h"
|
||||
#include "dbStreamLayers.h"
|
||||
#include "dbPropertiesRepository.h"
|
||||
|
||||
#include "tlException.h"
|
||||
#include "tlInternational.h"
|
||||
#include "tlProgress.h"
|
||||
#include "tlString.h"
|
||||
#include "tlStream.h"
|
||||
|
||||
#include <map>
|
||||
#include <set>
|
||||
|
||||
namespace db
|
||||
{
|
||||
|
||||
class Technology;
|
||||
|
||||
/**
|
||||
* @brief Generic base class of MAG reader exceptions
|
||||
*/
|
||||
class DB_PLUGIN_PUBLIC MAGReaderException
|
||||
: public ReaderException
|
||||
{
|
||||
public:
|
||||
MAGReaderException (const std::string &msg, size_t l, const std::string &file)
|
||||
: ReaderException (tl::sprintf (tl::to_string (tr ("%s (line=%ld, file=%s)")), msg, l, file))
|
||||
{ }
|
||||
};
|
||||
|
||||
/**
|
||||
* @brief The MAG format stream reader
|
||||
*/
|
||||
class DB_PLUGIN_PUBLIC MAGReader
|
||||
: public NamedLayerReader,
|
||||
public MAGDiagnostics
|
||||
{
|
||||
public:
|
||||
typedef std::vector<tl::Variant> property_value_list;
|
||||
|
||||
/**
|
||||
* @brief Construct a stream reader object
|
||||
*
|
||||
* @param s The stream delegate from which to read stream data from
|
||||
*/
|
||||
MAGReader (tl::InputStream &s);
|
||||
|
||||
/**
|
||||
* @brief Destructor
|
||||
*/
|
||||
~MAGReader ();
|
||||
|
||||
/**
|
||||
* @brief The basic read method
|
||||
*
|
||||
* This method will read the stream data and translate this to
|
||||
* insert calls into the layout object. This will not do much
|
||||
* on the layout object beside inserting the objects.
|
||||
* A set of options can be specified with the LoadLayoutOptions
|
||||
* object.
|
||||
* The returned map will contain all layers, the passed
|
||||
* ones and the newly created ones.
|
||||
*
|
||||
* @param layout The layout object to write to
|
||||
* @param map The LayerMap object
|
||||
* @param create true, if new layers should be created
|
||||
* @return The LayerMap object that tells where which layer was loaded
|
||||
*/
|
||||
virtual const LayerMap &read (db::Layout &layout, const LoadLayoutOptions &options);
|
||||
|
||||
/**
|
||||
* @brief The basic read method (without mapping)
|
||||
*
|
||||
* This method will read the stream data and translate this to
|
||||
* insert calls into the layout object. This will not do much
|
||||
* on the layout object beside inserting the objects.
|
||||
* This version will read all input layers and return a map
|
||||
* which tells which MAG layer has been read into which logical
|
||||
* layer.
|
||||
*
|
||||
* @param layout The layout object to write to
|
||||
* @return The LayerMap object
|
||||
*/
|
||||
virtual const LayerMap &read (db::Layout &layout);
|
||||
|
||||
/**
|
||||
* @brief Format
|
||||
*/
|
||||
virtual const char *format () const { return "MAG"; }
|
||||
|
||||
/**
|
||||
* @brief Issue an error with positional information
|
||||
*
|
||||
* Reimplements MAGDiagnostics
|
||||
*/
|
||||
virtual void error (const std::string &txt);
|
||||
|
||||
/**
|
||||
* @brief Issue a warning with positional information
|
||||
*
|
||||
* Reimplements MAGDiagnostics
|
||||
*/
|
||||
virtual void warn (const std::string &txt);
|
||||
|
||||
private:
|
||||
tl::TextInputStream m_stream;
|
||||
tl::TextInputStream *mp_current_stream;
|
||||
tl::AbsoluteProgress m_progress;
|
||||
double m_lambda, m_dbu;
|
||||
std::vector<std::string> m_lib_paths;
|
||||
bool m_merge;
|
||||
std::map<std::string, db::cell_index_type> m_cells_read;
|
||||
std::map<std::string, std::pair<std::string, db::cell_index_type> > m_cells_to_read;
|
||||
std::map<std::string, std::string> m_use_lib_paths;
|
||||
db::VCplxTrans m_dbu_trans_inv;
|
||||
std::string m_tech;
|
||||
db::Technology *mp_klayout_tech;
|
||||
|
||||
void do_read (db::Layout &layout, db::cell_index_type to_cell, tl::TextInputStream &stream);
|
||||
void do_read_part (db::Layout &layout, db::cell_index_type cell_index, tl::TextInputStream &stream);
|
||||
void do_merge_part (db::Layout &layout, db::cell_index_type cell_index);
|
||||
bool resolve_path(const std::string &path, const Layout &layout, std::string &real_path);
|
||||
std::string cell_name_from_path (const std::string &path);
|
||||
db::cell_index_type cell_from_path (const std::string &path, Layout &layout);
|
||||
void read_rect (tl::Extractor &ex, Layout &layout, cell_index_type cell_index, unsigned int layer);
|
||||
void read_tri (tl::Extractor &ex, Layout &layout, cell_index_type cell_index, unsigned int layer);
|
||||
void read_rlabel (tl::Extractor &ex, Layout &layout, cell_index_type cell_index);
|
||||
void read_cell_instance (tl::Extractor &ex, tl::TextInputStream &stream, Layout &layout, cell_index_type cell_index);
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
|
|
@ -0,0 +1,455 @@
|
|||
|
||||
/*
|
||||
|
||||
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 "dbMAGWriter.h"
|
||||
#include "dbPolygonGenerators.h"
|
||||
#include "dbPolygonTools.h"
|
||||
#include "tlStream.h"
|
||||
#include "tlUtils.h"
|
||||
#include "tlFileUtils.h"
|
||||
#include "tlUri.h"
|
||||
#include "tlLog.h"
|
||||
#include "tlUniqueName.h"
|
||||
#include "tlTimer.h"
|
||||
|
||||
#include <time.h>
|
||||
#include <string.h>
|
||||
|
||||
namespace db
|
||||
{
|
||||
|
||||
// ---------------------------------------------------------------------------------
|
||||
// MAGWriter implementation
|
||||
|
||||
MAGWriter::MAGWriter ()
|
||||
: mp_stream (0),
|
||||
m_progress (tl::to_string (tr ("Writing Magic file")), 10000)
|
||||
{
|
||||
m_progress.set_format (tl::to_string (tr ("%.0f MB")));
|
||||
m_progress.set_unit (1024 * 1024);
|
||||
m_timestamp = 0;
|
||||
}
|
||||
|
||||
void
|
||||
MAGWriter::write (db::Layout &layout, tl::OutputStream &stream, const db::SaveLayoutOptions &options)
|
||||
{
|
||||
std::vector <std::pair <unsigned int, db::LayerProperties> > layers;
|
||||
options.get_valid_layers (layout, layers, db::SaveLayoutOptions::LP_AssignNameWithPriority);
|
||||
|
||||
std::set <db::cell_index_type> cell_set;
|
||||
options.get_cells (layout, cell_set, layers);
|
||||
|
||||
tl::URI src (stream.path ());
|
||||
std::string basename = tl::basename (src.path ());
|
||||
std::pair<bool, db::cell_index_type> ci = layout.cell_by_name (basename.c_str ());
|
||||
if (! ci.first || cell_set.find (ci.second) == cell_set.end ()) {
|
||||
tl::warn << tl::to_string (tr ("The output file is not corresponding to an existing cell name. The content of this cell will not be a real layout: ")) << basename;
|
||||
}
|
||||
|
||||
m_options = options.get_options<MAGWriterOptions> ();
|
||||
mp_stream = &stream;
|
||||
|
||||
m_base_uri = tl::URI (stream.path ());
|
||||
m_ext = tl::extension (m_base_uri.path ());
|
||||
m_base_uri.set_path (tl::dirname (m_base_uri.path ()));
|
||||
|
||||
m_timestamp = 0;
|
||||
if (m_options.write_timestamp) {
|
||||
timespec ts;
|
||||
tl::current_utc_time (&ts);
|
||||
m_timestamp = ts.tv_sec;
|
||||
}
|
||||
|
||||
double lambda = m_options.lambda;
|
||||
if (lambda <= 0.0) {
|
||||
const std::string &lv = layout.meta_info_value ("lambda");
|
||||
if (lv.empty ()) {
|
||||
throw tl::Exception (tl::to_string (tr ("No lambda value configured for MAG writer and no 'lambda' metadata present in layout.")));
|
||||
}
|
||||
tl::from_string (lv, lambda);
|
||||
}
|
||||
|
||||
m_sf = layout.dbu () / lambda;
|
||||
|
||||
// As a favor, write a dummy top level file before closing the stream. If the file name corresponds to a real cell,
|
||||
// this file is overwritten by the true cell.
|
||||
write_dummmy_top (cell_set, layout, stream);
|
||||
stream.close ();
|
||||
|
||||
for (std::set<db::cell_index_type>::const_iterator c = cell_set.begin (); c != cell_set.end (); ++c) {
|
||||
tl::OutputStream os (filename_for_cell (*c, layout), tl::OutputStream::OM_Auto, true);
|
||||
write_cell (*c, layers, layout, os);
|
||||
}
|
||||
}
|
||||
|
||||
std::string
|
||||
MAGWriter::filename_for_cell (db::cell_index_type ci, db::Layout &layout)
|
||||
{
|
||||
tl::URI uri (m_base_uri);
|
||||
if (uri.path ().empty ()) {
|
||||
uri.set_path (make_string (layout.cell_name (ci)) + "." + m_ext);
|
||||
} else {
|
||||
uri.set_path (uri.path () + "/" + make_string (layout.cell_name (ci)) + "." + m_ext);
|
||||
}
|
||||
return uri.to_string ();
|
||||
}
|
||||
|
||||
void
|
||||
MAGWriter::write_dummmy_top (const std::set<db::cell_index_type> &cell_set, const db::Layout &layout, tl::OutputStream &os)
|
||||
{
|
||||
os.set_as_text (true);
|
||||
os << "magic\n";
|
||||
|
||||
std::string tech = m_options.tech;
|
||||
if (tech.empty ()) {
|
||||
tech = layout.meta_info_value ("technology");
|
||||
}
|
||||
if (! tech.empty ()) {
|
||||
os << "tech " << make_string (tl::to_lower_case (tech)) << "\n";
|
||||
}
|
||||
|
||||
os << "timestamp " << m_timestamp << "\n";
|
||||
|
||||
std::map<std::string, db::cell_index_type> cells_by_name;
|
||||
for (std::set<db::cell_index_type>::const_iterator c = cell_set.begin (); c != cell_set.end (); ++c) {
|
||||
cells_by_name.insert (std::make_pair (std::string (layout.cell_name (*c)), *c));
|
||||
}
|
||||
|
||||
db::Coord y = 0;
|
||||
db::Coord w = 0;
|
||||
std::vector<db::CellInstArray> cell_instances;
|
||||
cell_instances.reserve (cells_by_name.size ());
|
||||
for (std::map<std::string, db::cell_index_type>::const_iterator c = cells_by_name.begin (); c != cells_by_name.end (); ++c) {
|
||||
// instances are arrayed as stack
|
||||
db::Box bx = layout.cell (c->second).bbox ();
|
||||
cell_instances.push_back (db::CellInstArray (db::CellInst (c->second), db::Trans (db::Vector (0, y) + (db::Point () - bx.p1 ()))));
|
||||
y += bx.height ();
|
||||
w = std::max (w, db::Coord (bx.width ()));
|
||||
}
|
||||
|
||||
os << "<< checkpaint >>\n";
|
||||
write_polygon (db::Polygon (db::Box (0, 0, w, y)), layout, os);
|
||||
|
||||
m_cell_id.clear ();
|
||||
for (std::vector<db::CellInstArray>::const_iterator i = cell_instances.begin (); i != cell_instances.end (); ++i) {
|
||||
write_instance (*i, layout, os);
|
||||
}
|
||||
|
||||
os << "<< end >>\n";
|
||||
}
|
||||
|
||||
void
|
||||
MAGWriter::write_cell (db::cell_index_type ci, const std::vector <std::pair <unsigned int, db::LayerProperties> > &layers, db::Layout &layout, tl::OutputStream &os)
|
||||
{
|
||||
m_cellname = layout.cell_name (ci);
|
||||
try {
|
||||
do_write_cell (ci, layers, layout, os);
|
||||
} catch (tl::Exception &ex) {
|
||||
throw tl::Exception (ex.msg () + tl::to_string (tr (" when writing cell ")) + m_cellname);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
MAGWriter::do_write_cell (db::cell_index_type ci, const std::vector <std::pair <unsigned int, db::LayerProperties> > &layers, db::Layout &layout, tl::OutputStream &os)
|
||||
{
|
||||
os.set_as_text (true);
|
||||
os << "magic\n";
|
||||
|
||||
std::string tech = m_options.tech;
|
||||
if (tech.empty ()) {
|
||||
tech = layout.meta_info_value ("technology");
|
||||
}
|
||||
if (! tech.empty ()) {
|
||||
os << "tech " << make_string (tl::to_lower_case (tech)) << "\n";
|
||||
}
|
||||
|
||||
os << "timestamp " << m_timestamp << "\n";
|
||||
|
||||
db::Cell &cell = layout.cell (ci);
|
||||
|
||||
os << "<< checkpaint >>\n";
|
||||
write_polygon (db::Polygon (cell.bbox ()), layout, os);
|
||||
|
||||
bool any;
|
||||
|
||||
for (std::vector <std::pair <unsigned int, db::LayerProperties> >::const_iterator ll = layers.begin (); ll != layers.end (); ++ll) {
|
||||
any = false;
|
||||
for (db::Shapes::shape_iterator s = cell.shapes (ll->first).begin (db::ShapeIterator::Boxes | db::ShapeIterator::Polygons | db::ShapeIterator::Paths); ! s.at_end (); ++s) {
|
||||
if (! any) {
|
||||
os << "<< " << make_string (tl::to_lower_case (ll->second.name)) << " >>\n";
|
||||
any = true;
|
||||
}
|
||||
db::Polygon poly;
|
||||
s->polygon (poly);
|
||||
write_polygon (poly, layout, os);
|
||||
}
|
||||
}
|
||||
|
||||
any = false;
|
||||
for (std::vector <std::pair <unsigned int, db::LayerProperties> >::const_iterator ll = layers.begin (); ll != layers.end (); ++ll) {
|
||||
for (db::Shapes::shape_iterator s = cell.shapes (ll->first).begin (db::ShapeIterator::Texts); ! s.at_end (); ++s) {
|
||||
if (! any) {
|
||||
os << "<< labels >>\n";
|
||||
any = true;
|
||||
}
|
||||
db::Text text;
|
||||
s->text (text);
|
||||
write_label (tl::to_lower_case (ll->second.name), text, layout, os);
|
||||
}
|
||||
}
|
||||
|
||||
m_cell_id.clear ();
|
||||
for (db::Cell::const_iterator i = cell.begin (); ! i.at_end (); ++i) {
|
||||
write_instance (i->cell_inst (), layout, os);
|
||||
}
|
||||
|
||||
os << "<< end >>\n";
|
||||
}
|
||||
|
||||
namespace {
|
||||
|
||||
/**
|
||||
* @brief A simple polygon receiver that writes triangles and rectangles from trapezoids
|
||||
*/
|
||||
class TrapezoidWriter
|
||||
: public SimplePolygonSink
|
||||
{
|
||||
public:
|
||||
TrapezoidWriter (tl::OutputStream &os)
|
||||
: mp_os (&os)
|
||||
{ }
|
||||
|
||||
virtual void put (const db::SimplePolygon &polygon)
|
||||
{
|
||||
db::Box b = polygon.box ();
|
||||
if (b.empty () || b.height () == 0 || b.width () == 0) {
|
||||
// safe fallback for degenerated polygons
|
||||
return;
|
||||
}
|
||||
|
||||
// Determine the border triangles left and right
|
||||
|
||||
// tl, tr describe the two triangles: tl left and tr right one.
|
||||
// If sl/sr indicate south half of the rectangle.
|
||||
db::Box tl, tr;
|
||||
bool sl = false, sr = false;
|
||||
|
||||
for (db::SimplePolygon::polygon_edge_iterator ie = polygon.begin_edge (); ! ie.at_end (); ++ie) {
|
||||
db::Edge e = *ie;
|
||||
if (e.dy () > 0 /*left side*/) {
|
||||
tl = e.bbox ();
|
||||
sl = e.dx () > 0;
|
||||
} else if (e.dy () < 0 /*right side*/) {
|
||||
tr = e.bbox ();
|
||||
sr = e.dx () > 0;
|
||||
}
|
||||
}
|
||||
|
||||
// outputs the parts
|
||||
|
||||
if (tl.width () > 0) {
|
||||
(*mp_os) << "tri " << tl.left () << " " << tl.bottom () << " " << tl.right () << " " << tl.top () << " " << (sl ? "s" : "") << "e\n";
|
||||
}
|
||||
|
||||
db::Box ib (tl.right (), tl.bottom (), tr.left (), tr.top ());
|
||||
if (ib.width () > 0) {
|
||||
(*mp_os) << "rect " << ib.left () << " " << ib.bottom () << " " << ib.right () << " " << ib.top () << "\n";
|
||||
}
|
||||
|
||||
if (tr.width () > 0) {
|
||||
(*mp_os) << "tri " << tr.left () << " " << tr.bottom () << " " << tr.right () << " " << tr.top () << " " << (sr ? "s" : "") << "\n";
|
||||
}
|
||||
}
|
||||
|
||||
private:
|
||||
tl::OutputStream *mp_os;
|
||||
};
|
||||
}
|
||||
|
||||
void
|
||||
MAGWriter::write_polygon (const db::Polygon &poly, const db::Layout & /*layout*/, tl::OutputStream &os)
|
||||
{
|
||||
db::EdgeProcessor ep;
|
||||
ep.insert (scaled (poly));
|
||||
db::MergeOp op;
|
||||
TrapezoidWriter writer (os);
|
||||
db::TrapezoidGenerator tpgen (writer);
|
||||
ep.process (tpgen, op);
|
||||
}
|
||||
|
||||
void
|
||||
MAGWriter::write_label (const std::string &layer, const db::Text &text, const db::Layout & /*layout*/, tl::OutputStream &os)
|
||||
{
|
||||
db::DVector v = db::DVector (text.trans ().disp ()) * m_sf;
|
||||
|
||||
std::string s = text.string ();
|
||||
if (s.find ("\n") != std::string::npos) {
|
||||
s = tl::replaced (s, "\n", "\\n");
|
||||
}
|
||||
|
||||
os << "rlabel " << make_string (layer) << " " << v.x () << " " << v.y () << " " << v.x () << " " << v.y () << " 0 " << s << "\n";
|
||||
}
|
||||
|
||||
void
|
||||
MAGWriter::write_instance (const db::CellInstArray &inst, const db::Layout &layout, tl::OutputStream &os)
|
||||
{
|
||||
db::Vector a, b;
|
||||
unsigned long na = 0, nb = 0;
|
||||
if (inst.is_regular_array (a, b, na, nb) && ((a.x () == 0 && b.y () == 0) || (a.y () == 0 && b.x () == 0)) && !needs_rounding (a) && !needs_rounding (b)) {
|
||||
|
||||
db::ICplxTrans tr = inst.complex_trans ();
|
||||
write_single_instance (inst.object ().cell_index (), tr, a, b, na, nb, layout, os);
|
||||
|
||||
} else {
|
||||
|
||||
for (db::CellInstArray::iterator ia = inst.begin (); ! ia.at_end (); ++ia) {
|
||||
db::ICplxTrans tr = inst.complex_trans (*ia);
|
||||
write_single_instance (inst.object ().cell_index (), tr, db::Vector (), db::Vector (), 1, 1, layout, os);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
MAGWriter::write_single_instance (db::cell_index_type ci, db::ICplxTrans trans, db::Vector a, db::Vector b, unsigned long na, unsigned long nb, const db::Layout &layout, tl::OutputStream &os)
|
||||
{
|
||||
if (trans.is_mag ()) {
|
||||
throw tl::Exception (tl::to_string (tr ("Cannot write magnified instance to MAG files: ")) + trans.to_string () + tl::to_string (tr (" of cell ")) + layout.cell_name (ci));
|
||||
}
|
||||
|
||||
int id = (m_cell_id [ci] += 1);
|
||||
std::string cn = layout.cell_name (ci);
|
||||
os << "use " << make_string (cn) << " " << make_string (cn + "_" + tl::to_string (id)) << "\n";
|
||||
|
||||
if (na > 1 || nb > 1) {
|
||||
|
||||
na = std::max ((unsigned long) 1, na);
|
||||
nb = std::max ((unsigned long) 1, nb);
|
||||
|
||||
db::ICplxTrans trinv = trans.inverted ();
|
||||
a = trinv * a;
|
||||
b = trinv * b;
|
||||
|
||||
if (a.y () != 0) {
|
||||
std::swap (a, b);
|
||||
std::swap (na, nb);
|
||||
}
|
||||
|
||||
db::Vector da = scaled (a);
|
||||
db::Vector db = scaled (b);
|
||||
|
||||
os << "array " << 0 << " " << (na - 1) << " " << da.x () << " " << 0 << " " << (nb - 1) << " " << db.y () << "\n";
|
||||
|
||||
}
|
||||
|
||||
os << "timestamp " << m_timestamp << "\n";
|
||||
|
||||
db::Matrix2d m = trans.to_matrix2d ();
|
||||
|
||||
db::Vector d = scaled (trans.disp ());
|
||||
os << "transform " << m.m11 () << " " << m.m12 () << " " << d.x () << " " << m.m21 () << " " << m.m22 () << " " << d.y () << "\n";
|
||||
|
||||
db::Box bx = scaled (layout.cell (ci).bbox ());
|
||||
os << "box " << bx.left () << " " << bx.bottom () << " " << bx.right () << " " << bx.top () << "\n";
|
||||
}
|
||||
|
||||
namespace {
|
||||
|
||||
struct ScalingOp
|
||||
{
|
||||
ScalingOp (MAGWriter *wr) : mp_wr (wr) { }
|
||||
db::Point operator() (const db::Point &pt) const { return mp_wr->scaled (pt); }
|
||||
private:
|
||||
MAGWriter *mp_wr;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
db::Polygon
|
||||
MAGWriter::scaled (const db::Polygon &poly)
|
||||
{
|
||||
db::Polygon spoly;
|
||||
spoly.assign_hull (poly.begin_hull (), poly.end_hull (), ScalingOp (this));
|
||||
for (unsigned int h = 0; h < poly.holes (); ++h) {
|
||||
spoly.assign_hole (h, poly.begin_hole (h), poly.end_hole (h), ScalingOp (this));
|
||||
}
|
||||
return spoly;
|
||||
}
|
||||
|
||||
db::Box
|
||||
MAGWriter::scaled (const db::Box &bx) const
|
||||
{
|
||||
return db::Box (scaled (bx.p1 ()), scaled (bx.p2 ()));
|
||||
}
|
||||
|
||||
db::Vector
|
||||
MAGWriter::scaled (const db::Vector &v) const
|
||||
{
|
||||
db::Vector res (db::DVector (v) * m_sf);
|
||||
if (! db::DVector (res).equal (db::DVector (v) * m_sf)) {
|
||||
tl::warn << tl::sprintf (tl::to_string (tr ("Vector rounding occured at %s in cell %s - not a multiple of lambda (%.12g)")), v.to_string (), m_cellname, m_options.lambda);
|
||||
}
|
||||
return res;
|
||||
}
|
||||
|
||||
db::Point
|
||||
MAGWriter::scaled (const db::Point &p) const
|
||||
{
|
||||
db::Point res (db::DPoint (p) * m_sf);
|
||||
if (! db::DPoint (res).equal (db::DPoint (p) * m_sf)) {
|
||||
tl::warn << tl::sprintf (tl::to_string (tr ("Coordinate rounding occured at %s in cell %s - not a multiple of lambda (%.12g)")), p.to_string (), m_cellname, m_options.lambda);
|
||||
}
|
||||
return res;
|
||||
}
|
||||
|
||||
bool
|
||||
MAGWriter::needs_rounding (const db::Vector &v) const
|
||||
{
|
||||
db::Vector res (db::DVector (v) * m_sf);
|
||||
return ! db::DVector (res).equal (db::DVector (v) * m_sf);
|
||||
}
|
||||
|
||||
static inline bool is_valid_char (uint32_t c32)
|
||||
{
|
||||
return (c32 >= 'A' && c32 <= 'Z') ||
|
||||
(c32 >= 'a' && c32 <= 'z') ||
|
||||
(c32 >= '0' && c32 <= '9') ||
|
||||
c32 == '_' || c32 == '.';
|
||||
}
|
||||
|
||||
std::string
|
||||
MAGWriter::make_string (const std::string &s)
|
||||
{
|
||||
std::string res;
|
||||
for (const char *cp = s.c_str (); *cp; ) {
|
||||
uint32_t c32 = tl::utf32_from_utf8 (cp);
|
||||
if (! is_valid_char (c32)) {
|
||||
res += tl::sprintf ("x%x", c32);
|
||||
} else {
|
||||
res += (char) c32;
|
||||
}
|
||||
}
|
||||
return res;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,114 @@
|
|||
|
||||
/*
|
||||
|
||||
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
|
||||
|
||||
*/
|
||||
|
||||
|
||||
|
||||
#ifndef HDR_dbMAGWriter
|
||||
#define HDR_dbMAGWriter
|
||||
|
||||
#include "dbPluginCommon.h"
|
||||
#include "dbWriter.h"
|
||||
#include "dbMAG.h"
|
||||
#include "dbMAGFormat.h"
|
||||
#include "dbSaveLayoutOptions.h"
|
||||
#include "tlProgress.h"
|
||||
#include "tlUri.h"
|
||||
|
||||
namespace tl
|
||||
{
|
||||
class OutputStream;
|
||||
}
|
||||
|
||||
namespace db
|
||||
{
|
||||
|
||||
class Layout;
|
||||
class SaveLayoutOptions;
|
||||
|
||||
/**
|
||||
* @brief A MAG writer abstraction
|
||||
*/
|
||||
class DB_PLUGIN_PUBLIC MAGWriter
|
||||
: public db::WriterBase
|
||||
{
|
||||
public:
|
||||
/**
|
||||
* @brief Instantiate the writer
|
||||
*/
|
||||
MAGWriter ();
|
||||
|
||||
/**
|
||||
* @brief Write the layout object
|
||||
*/
|
||||
void write (db::Layout &layout, tl::OutputStream &stream, const db::SaveLayoutOptions &options);
|
||||
|
||||
/**
|
||||
* @brief Scales the polygon to Magic lambda space
|
||||
*/
|
||||
db::Polygon scaled (const db::Polygon &poly);
|
||||
|
||||
/**
|
||||
* @brief Scales the box to Magic lambda space
|
||||
*/
|
||||
db::Box scaled (const Box &bx) const;
|
||||
|
||||
/**
|
||||
* @brief Scales the vector to Magic lambda space
|
||||
*/
|
||||
db::Vector scaled (const db::Vector &v) const;
|
||||
|
||||
/**
|
||||
* @brief Scales the point to Magic lambda space
|
||||
*/
|
||||
db::Point scaled (const db::Point &p) const;
|
||||
|
||||
/**
|
||||
* @brief Returns true if the vector can be scaled to Magic rounding space without loss
|
||||
*/
|
||||
bool needs_rounding (const db::Vector &v) const;
|
||||
|
||||
private:
|
||||
tl::OutputStream *mp_stream;
|
||||
MAGWriterOptions m_options;
|
||||
tl::AbsoluteProgress m_progress;
|
||||
tl::URI m_base_uri;
|
||||
std::string m_ext;
|
||||
size_t m_timestamp;
|
||||
std::map<db::cell_index_type, size_t> m_cell_id;
|
||||
double m_sf;
|
||||
std::string m_cellname;
|
||||
|
||||
std::string filename_for_cell (db::cell_index_type ci, db::Layout &layout);
|
||||
void write_cell (db::cell_index_type ci, const std::vector <std::pair <unsigned int, db::LayerProperties> > &layers, db::Layout &layout, tl::OutputStream &os);
|
||||
void write_dummmy_top (const std::set<db::cell_index_type> &cell_set, const db::Layout &layout, tl::OutputStream &os);
|
||||
void do_write_cell (db::cell_index_type ci, const std::vector <std::pair <unsigned int, db::LayerProperties> > &layers, db::Layout &layout, tl::OutputStream &os);
|
||||
void write_polygon (const db::Polygon &poly, const db::Layout &layout, tl::OutputStream &os);
|
||||
void write_label (const std::string &layer, const db::Text &text, const Layout &layout, tl::OutputStream &os);
|
||||
void write_instance (const db::CellInstArray &inst, const db::Layout &layout, tl::OutputStream &os);
|
||||
void write_single_instance (db::cell_index_type ci, ICplxTrans tr, db::Vector a, db::Vector b, unsigned long na, unsigned long nb, const db::Layout &layout, tl::OutputStream &os);
|
||||
std::string make_string (const std::string &s);
|
||||
};
|
||||
|
||||
} // namespace db
|
||||
|
||||
#endif
|
||||
|
||||
|
|
@ -0,0 +1,17 @@
|
|||
|
||||
TARGET = mag
|
||||
DESTDIR = $$OUT_PWD/../../../../db_plugins
|
||||
|
||||
include($$PWD/../../../db_plugin.pri)
|
||||
|
||||
HEADERS = \
|
||||
dbMAG.h \
|
||||
dbMAGReader.h \
|
||||
dbMAGWriter.h \
|
||||
dbMAGFormat.h \
|
||||
|
||||
SOURCES = \
|
||||
dbMAG.cc \
|
||||
dbMAGReader.cc \
|
||||
dbMAGWriter.cc \
|
||||
gsiDeclDbMAG.cc \
|
||||
|
|
@ -0,0 +1,316 @@
|
|||
|
||||
/*
|
||||
|
||||
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 "dbMAG.h"
|
||||
#include "dbMAGReader.h"
|
||||
#include "dbMAGWriter.h"
|
||||
#include "dbLoadLayoutOptions.h"
|
||||
#include "dbSaveLayoutOptions.h"
|
||||
#include "gsiDecl.h"
|
||||
|
||||
namespace gsi
|
||||
{
|
||||
|
||||
// ---------------------------------------------------------------
|
||||
// gsi Implementation of specific methods
|
||||
|
||||
static void set_mag_dbu (db::LoadLayoutOptions *options, double dbu)
|
||||
{
|
||||
options->get_options<db::MAGReaderOptions> ().dbu = dbu;
|
||||
}
|
||||
|
||||
static double get_mag_dbu (const db::LoadLayoutOptions *options)
|
||||
{
|
||||
return options->get_options<db::MAGReaderOptions> ().dbu;
|
||||
}
|
||||
|
||||
static void set_mag_lambda (db::LoadLayoutOptions *options, double lambda)
|
||||
{
|
||||
options->get_options<db::MAGReaderOptions> ().lambda = lambda;
|
||||
}
|
||||
|
||||
static double get_mag_lambda (const db::LoadLayoutOptions *options)
|
||||
{
|
||||
return options->get_options<db::MAGReaderOptions> ().lambda;
|
||||
}
|
||||
|
||||
static void set_mag_library_paths (db::LoadLayoutOptions *options, const std::vector<std::string> &lib_paths)
|
||||
{
|
||||
options->get_options<db::MAGReaderOptions> ().lib_paths = lib_paths;
|
||||
}
|
||||
|
||||
static std::vector<std::string> get_mag_library_paths (const db::LoadLayoutOptions *options)
|
||||
{
|
||||
return options->get_options<db::MAGReaderOptions> ().lib_paths;
|
||||
}
|
||||
|
||||
static void set_layer_map (db::LoadLayoutOptions *options, const db::LayerMap &lm, bool f)
|
||||
{
|
||||
options->get_options<db::MAGReaderOptions> ().layer_map = lm;
|
||||
options->get_options<db::MAGReaderOptions> ().create_other_layers = f;
|
||||
}
|
||||
|
||||
static void set_layer_map1 (db::LoadLayoutOptions *options, const db::LayerMap &lm)
|
||||
{
|
||||
options->get_options<db::MAGReaderOptions> ().layer_map = lm;
|
||||
}
|
||||
|
||||
static db::LayerMap &get_layer_map (db::LoadLayoutOptions *options)
|
||||
{
|
||||
return options->get_options<db::MAGReaderOptions> ().layer_map;
|
||||
}
|
||||
|
||||
static void select_all_layers (db::LoadLayoutOptions *options)
|
||||
{
|
||||
options->get_options<db::MAGReaderOptions> ().layer_map = db::LayerMap ();
|
||||
options->get_options<db::MAGReaderOptions> ().create_other_layers = true;
|
||||
}
|
||||
|
||||
static bool create_other_layers (const db::LoadLayoutOptions *options)
|
||||
{
|
||||
return options->get_options<db::MAGReaderOptions> ().create_other_layers;
|
||||
}
|
||||
|
||||
static void set_create_other_layers (db::LoadLayoutOptions *options, bool l)
|
||||
{
|
||||
options->get_options<db::MAGReaderOptions> ().create_other_layers = l;
|
||||
}
|
||||
|
||||
static bool keep_layer_names (const db::LoadLayoutOptions *options)
|
||||
{
|
||||
return options->get_options<db::MAGReaderOptions> ().keep_layer_names;
|
||||
}
|
||||
|
||||
static void set_keep_layer_names (db::LoadLayoutOptions *options, bool l)
|
||||
{
|
||||
options->get_options<db::MAGReaderOptions> ().keep_layer_names = l;
|
||||
}
|
||||
|
||||
static bool merge (const db::LoadLayoutOptions *options)
|
||||
{
|
||||
return options->get_options<db::MAGReaderOptions> ().merge;
|
||||
}
|
||||
|
||||
static void set_merge (db::LoadLayoutOptions *options, bool l)
|
||||
{
|
||||
options->get_options<db::MAGReaderOptions> ().merge = l;
|
||||
}
|
||||
|
||||
// extend lay::LoadLayoutOptions with the MAG options
|
||||
static
|
||||
gsi::ClassExt<db::LoadLayoutOptions> mag_reader_options (
|
||||
gsi::method_ext ("mag_set_layer_map", &set_layer_map, gsi::arg ("map"), gsi::arg ("create_other_layers"),
|
||||
"@brief Sets the layer map\n"
|
||||
"This sets a layer mapping for the reader. The layer map allows selection and translation of the original layers, for example to assign layer/datatype numbers to the named layers.\n"
|
||||
"@param map The layer map to set.\n"
|
||||
"@param create_other_layers The flag indicating whether other layers will be created as well. Set to false to read only the layers in the layer map.\n"
|
||||
"\n"
|
||||
"This method has been added in version 0.26.2."
|
||||
) +
|
||||
gsi::method_ext ("mag_layer_map=", &set_layer_map1, gsi::arg ("map"),
|
||||
"@brief Sets the layer map\n"
|
||||
"This sets a layer mapping for the reader. Unlike \\mag_set_layer_map, the 'create_other_layers' flag is not changed.\n"
|
||||
"@param map The layer map to set.\n"
|
||||
"\n"
|
||||
"This method has been added in version 0.26.2."
|
||||
) +
|
||||
gsi::method_ext ("mag_select_all_layers", &select_all_layers,
|
||||
"@brief Selects all layers and disables the layer map\n"
|
||||
"\n"
|
||||
"This disables any layer map and enables reading of all layers.\n"
|
||||
"New layers will be created when required.\n"
|
||||
"\n"
|
||||
"This method has been added in version 0.26.2."
|
||||
) +
|
||||
gsi::method_ext ("mag_layer_map", &get_layer_map,
|
||||
"@brief Gets the layer map\n"
|
||||
"@return A reference to the layer map\n"
|
||||
"\n"
|
||||
"This method has been added in version 0.26.2."
|
||||
) +
|
||||
gsi::method_ext ("mag_create_other_layers?", &create_other_layers,
|
||||
"@brief Gets a value indicating whether other layers shall be created\n"
|
||||
"@return True, if other layers will be created.\n"
|
||||
"This attribute acts together with a layer map (see \\mag_layer_map=). Layers not listed in this map are created as well when "
|
||||
"\\mag_create_other_layers? is true. Otherwise they are ignored.\n"
|
||||
"\n"
|
||||
"This method has been added in version 0.26.2."
|
||||
) +
|
||||
gsi::method_ext ("mag_create_other_layers=", &set_create_other_layers, gsi::arg ("create"),
|
||||
"@brief Specifies whether other layers shall be created\n"
|
||||
"@param create True, if other layers will be created.\n"
|
||||
"See \\mag_create_other_layers? for a description of this attribute.\n"
|
||||
"\n"
|
||||
"This method has been added in version 0.26.2."
|
||||
) +
|
||||
gsi::method_ext ("mag_keep_layer_names?", &keep_layer_names,
|
||||
"@brief Gets a value indicating whether layer names are kept\n"
|
||||
"@return True, if layer names are kept.\n"
|
||||
"\n"
|
||||
"When set to true, no attempt is made to translate "
|
||||
"layer names to GDS layer/datatype numbers. If set to false (the default), a layer named \"L2D15\" will be translated "
|
||||
"to GDS layer 2, datatype 15.\n"
|
||||
"\n"
|
||||
"This method has been added in version 0.26.2."
|
||||
) +
|
||||
gsi::method_ext ("mag_keep_layer_names=", &set_keep_layer_names, gsi::arg ("keep"),
|
||||
"@brief Gets a value indicating whether layer names are kept\n"
|
||||
"@param keep True, if layer names are to be kept.\n"
|
||||
"\n"
|
||||
"See \\mag_keep_layer_names? for a description of this property.\n"
|
||||
"\n"
|
||||
"This method has been added in version 0.26.2."
|
||||
) +
|
||||
gsi::method_ext ("mag_merge?", &merge,
|
||||
"@brief Gets a value indicating whether boxes are merged into polygons\n"
|
||||
"@return True, if boxes are merged.\n"
|
||||
"\n"
|
||||
"When set to true, the boxes and triangles of the Magic layout files are merged into polygons where possible.\n"
|
||||
"\n"
|
||||
"This method has been added in version 0.26.2."
|
||||
) +
|
||||
gsi::method_ext ("mag_merge=", &set_merge, gsi::arg ("merge"),
|
||||
"@brief Sets a value indicating whether boxes are merged into polygons\n"
|
||||
"@param merge True, if boxes and triangles will be merged into polygons.\n"
|
||||
"\n"
|
||||
"See \\mag_merge? for a description of this property.\n"
|
||||
"\n"
|
||||
"This method has been added in version 0.26.2."
|
||||
) +
|
||||
gsi::method_ext ("mag_library_paths=", &set_mag_library_paths, gsi::arg ("lib_paths"),
|
||||
"@brief Specifies the locations where to look up libraries (in this order)\n"
|
||||
"\n"
|
||||
"The reader will look up library reference in these paths when it can't find them locally.\n"
|
||||
"Relative paths in this collection are resolved relative to the initial file's path.\n"
|
||||
"Expression interpolation is supported in the path strings.\n"
|
||||
"\nThis property has been added in version 0.26.2.\n"
|
||||
) +
|
||||
gsi::method_ext ("mag_library_paths", &get_mag_library_paths,
|
||||
"@brief Gets the locations where to look up libraries (in this order)\n"
|
||||
"See \\mag_library_paths= method for a description of this attribute.\n"
|
||||
"\nThis property has been added in version 0.26.2.\n"
|
||||
) +
|
||||
gsi::method_ext ("mag_lambda=", &set_mag_lambda, gsi::arg ("lambda"),
|
||||
"@brief Specifies the lambda value to used for reading\n"
|
||||
"\n"
|
||||
"The lamdba value is the basic unit of the layout. Magic draws layout as multiples of this basic unit. "
|
||||
"The layout read by the MAG reader will use the database unit specified by \\mag_dbu, but the physical layout "
|
||||
"coordinates will be multiples of \\mag_lambda.\n"
|
||||
"\nThis property has been added in version 0.26.2.\n"
|
||||
) +
|
||||
gsi::method_ext ("mag_lambda", &get_mag_lambda,
|
||||
"@brief Gets the lambda value\n"
|
||||
"See \\mag_lambda= method for a description of this attribute.\n"
|
||||
"\nThis property has been added in version 0.26.2.\n"
|
||||
) +
|
||||
gsi::method_ext ("mag_dbu=", &set_mag_dbu, gsi::arg ("dbu"),
|
||||
"@brief Specifies the database unit which the reader uses and produces\n"
|
||||
"The database unit is the final resolution of the produced layout. This physical resolution is usually "
|
||||
"defined by the layout system - GDS for example typically uses 1nm (mag_dbu=0.001).\n"
|
||||
"All geometry in the MAG file will first be scaled to \\mag_lambda and is then brought to the database unit.\n"
|
||||
"\nThis property has been added in version 0.26.2.\n"
|
||||
) +
|
||||
gsi::method_ext ("mag_dbu", &get_mag_dbu,
|
||||
"@brief Specifies the database unit which the reader uses and produces\n"
|
||||
"See \\mag_dbu= method for a description of this property.\n"
|
||||
"\nThis property has been added in version 0.26.2.\n"
|
||||
),
|
||||
""
|
||||
);
|
||||
|
||||
// ---------------------------------------------------------------
|
||||
// gsi Implementation of specific methods
|
||||
|
||||
static void set_mag_lambda_w (db::SaveLayoutOptions *options, double f)
|
||||
{
|
||||
options->get_options<db::MAGWriterOptions> ().lambda = f;
|
||||
}
|
||||
|
||||
static double get_mag_lambda_w (const db::SaveLayoutOptions *options)
|
||||
{
|
||||
return options->get_options<db::MAGWriterOptions> ().lambda;
|
||||
}
|
||||
|
||||
static void set_mag_write_timestamp (db::SaveLayoutOptions *options, bool f)
|
||||
{
|
||||
options->get_options<db::MAGWriterOptions> ().write_timestamp = f;
|
||||
}
|
||||
|
||||
static bool get_mag_write_timestamp (const db::SaveLayoutOptions *options)
|
||||
{
|
||||
return options->get_options<db::MAGWriterOptions> ().write_timestamp;
|
||||
}
|
||||
|
||||
static void set_mag_tech_w (db::SaveLayoutOptions *options, const std::string &t)
|
||||
{
|
||||
options->get_options<db::MAGWriterOptions> ().tech = t;
|
||||
}
|
||||
|
||||
static const std::string &get_mag_tech_w (const db::SaveLayoutOptions *options)
|
||||
{
|
||||
return options->get_options<db::MAGWriterOptions> ().tech;
|
||||
}
|
||||
|
||||
// extend lay::SaveLayoutOptions with the MAG options
|
||||
static
|
||||
gsi::ClassExt<db::SaveLayoutOptions> mag_writer_options (
|
||||
gsi::method_ext ("mag_lambda=", &set_mag_lambda_w, gsi::arg ("lambda"),
|
||||
"@brief Specifies the lambda value to used for writing\n"
|
||||
"\n"
|
||||
"The lamdba value is the basic unit of the layout.\n"
|
||||
"The layout is brought to units of this value. If the layout is not on-grid on this unit, snapping will happen. "
|
||||
"If the value is less or equal to zero, KLayout will use the lambda value stored inside the layout set by a previous read operation "
|
||||
"of a MAGIC file. The lambda value is stored in the Layout object as the \"lambda\" metadata attribute.\n"
|
||||
"\nThis property has been added in version 0.26.2.\n"
|
||||
) +
|
||||
gsi::method_ext ("mag_lambda", &get_mag_lambda_w,
|
||||
"@brief Gets the lambda value\n"
|
||||
"See \\mag_lambda= method for a description of this attribute."
|
||||
"\nThis property has been added in version 0.26.2.\n"
|
||||
) +
|
||||
gsi::method_ext ("mag_write_timestamp=", &set_mag_write_timestamp, gsi::arg ("f"),
|
||||
"@brief Specifies whether to write a timestamp\n"
|
||||
"\n"
|
||||
"If this attribute is set to false, the timestamp written is 0. This is not permitted in the strict sense, but simplifies comparison of Magic files.\n"
|
||||
"\nThis property has been added in version 0.26.2.\n"
|
||||
) +
|
||||
gsi::method_ext ("mag_write_timestamp?", &get_mag_write_timestamp,
|
||||
"@brief Gets a value indicating whether to write a timestamp\n"
|
||||
"See \\write_timestamp= method for a description of this attribute.\n"
|
||||
"\nThis property has been added in version 0.26.2.\n"
|
||||
) +
|
||||
gsi::method_ext ("mag_tech=", &set_mag_tech_w, gsi::arg ("tech"),
|
||||
"@brief Specifies the technology string used for writing\n"
|
||||
"\n"
|
||||
"If this string is empty, the writer will try to obtain the technology from the \"technology\" metadata attribute of the layout.\n"
|
||||
"\nThis property has been added in version 0.26.2.\n"
|
||||
) +
|
||||
gsi::method_ext ("mag_tech", &get_mag_tech_w,
|
||||
"@brief Gets the technology string used for writing\n"
|
||||
"See \\mag_tech= method for a description of this attribute."
|
||||
"\nThis property has been added in version 0.26.2.\n"
|
||||
),
|
||||
""
|
||||
);
|
||||
|
||||
}
|
||||
|
||||
|
|
@ -0,0 +1,338 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<ui version="4.0">
|
||||
<class>MAGReaderOptionPage</class>
|
||||
<widget class="QWidget" name="MAGReaderOptionPage">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>584</width>
|
||||
<height>530</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
<string>Form</string>
|
||||
</property>
|
||||
<layout class="QVBoxLayout" name="verticalLayout">
|
||||
<item>
|
||||
<widget class="QGroupBox" name="groupBox">
|
||||
<property name="title">
|
||||
<string>Input Options</string>
|
||||
</property>
|
||||
<layout class="QGridLayout">
|
||||
<property name="leftMargin">
|
||||
<number>9</number>
|
||||
</property>
|
||||
<property name="topMargin">
|
||||
<number>9</number>
|
||||
</property>
|
||||
<property name="rightMargin">
|
||||
<number>9</number>
|
||||
</property>
|
||||
<property name="bottomMargin">
|
||||
<number>9</number>
|
||||
</property>
|
||||
<property name="spacing">
|
||||
<number>6</number>
|
||||
</property>
|
||||
<item row="0" column="0">
|
||||
<widget class="QLabel" name="label_6">
|
||||
<property name="text">
|
||||
<string>Lambda value</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="2">
|
||||
<widget class="QLabel" name="label_7">
|
||||
<property name="text">
|
||||
<string>Micron</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="3" column="1" colspan="2">
|
||||
<widget class="QCheckBox" name="keep_names_cbx">
|
||||
<property name="text">
|
||||
<string>Don't attempt to translate into layer/datatype numbers</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="2">
|
||||
<widget class="QLabel" name="label_3">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Expanding" vsizetype="Preferred">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Micron</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="1">
|
||||
<widget class="QLineEdit" name="dbu_le">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="3" column="0">
|
||||
<widget class="QLabel" name="label_4">
|
||||
<property name="text">
|
||||
<string>Keep layer names</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="0">
|
||||
<widget class="QLabel" name="label_2">
|
||||
<property name="text">
|
||||
<string>Database unit </string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="1">
|
||||
<widget class="QLineEdit" name="lambda_le"/>
|
||||
</item>
|
||||
<item row="2" column="1" colspan="2">
|
||||
<widget class="QCheckBox" name="merge_cbx">
|
||||
<property name="text">
|
||||
<string>Merge boxes into polygons</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="0">
|
||||
<widget class="QLabel" name="label">
|
||||
<property name="text">
|
||||
<string>Layout healing</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QGroupBox" name="groupBox_2">
|
||||
<property name="title">
|
||||
<string>Library paths</string>
|
||||
</property>
|
||||
<layout class="QGridLayout" name="gridLayout">
|
||||
<item row="0" column="0" rowspan="5">
|
||||
<widget class="lay::InteractiveListWidget" name="lib_path">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Expanding" vsizetype="Ignored">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>1</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="dragEnabled">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="dragDropMode">
|
||||
<enum>QAbstractItemView::InternalMove</enum>
|
||||
</property>
|
||||
<property name="selectionMode">
|
||||
<enum>QAbstractItemView::ExtendedSelection</enum>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="1">
|
||||
<widget class="QToolButton" name="del_lib_path">
|
||||
<property name="toolTip">
|
||||
<string>Delete selected paths</string>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>...</string>
|
||||
</property>
|
||||
<property name="icon">
|
||||
<iconset resource="../../../../lay/lay/layResources.qrc">
|
||||
<normaloff>:/clear.png</normaloff>:/clear.png</iconset>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="3" column="1">
|
||||
<widget class="QToolButton" name="move_lib_path_down">
|
||||
<property name="toolTip">
|
||||
<string>Move selected paths down</string>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>...</string>
|
||||
</property>
|
||||
<property name="icon">
|
||||
<iconset resource="../../../../lay/lay/layResources.qrc">
|
||||
<normaloff>:/down.png</normaloff>:/down.png</iconset>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="1">
|
||||
<widget class="QToolButton" name="add_lib_path">
|
||||
<property name="toolTip">
|
||||
<string>Add new a directory</string>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>...</string>
|
||||
</property>
|
||||
<property name="icon">
|
||||
<iconset resource="../../../../lay/lay/layResources.qrc">
|
||||
<normaloff>:/add.png</normaloff>:/add.png</iconset>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="5" column="0" colspan="2">
|
||||
<widget class="QLabel" name="label_5">
|
||||
<property name="text">
|
||||
<string>Relative paths are resolved relative to the file read.
|
||||
You can use expressions inside the path components for variable paths</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="1">
|
||||
<widget class="QToolButton" name="move_lib_path_up">
|
||||
<property name="toolTip">
|
||||
<string>Move selected paths up</string>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>...</string>
|
||||
</property>
|
||||
<property name="icon">
|
||||
<iconset resource="../../../../lay/lay/layResources.qrc">
|
||||
<normaloff>:/up.png</normaloff>:/up.png</iconset>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="2">
|
||||
<widget class="QToolButton" name="add_lib_path_with_choose">
|
||||
<property name="toolTip">
|
||||
<string>Add new a directory (file browser)</string>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>...</string>
|
||||
</property>
|
||||
<property name="autoRaise">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QGroupBox" name="layer_subset_grp">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
|
||||
<horstretch>1</horstretch>
|
||||
<verstretch>1</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="toolTip">
|
||||
<string/>
|
||||
</property>
|
||||
<property name="title">
|
||||
<string>Layer Subset And Layer Mapping</string>
|
||||
</property>
|
||||
<property name="checkable">
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
<layout class="QGridLayout" name="_2">
|
||||
<property name="leftMargin">
|
||||
<number>9</number>
|
||||
</property>
|
||||
<property name="topMargin">
|
||||
<number>9</number>
|
||||
</property>
|
||||
<property name="rightMargin">
|
||||
<number>9</number>
|
||||
</property>
|
||||
<property name="bottomMargin">
|
||||
<number>9</number>
|
||||
</property>
|
||||
<property name="spacing">
|
||||
<number>6</number>
|
||||
</property>
|
||||
<item row="0" column="0" colspan="2">
|
||||
<widget class="QCheckBox" name="read_all_cbx">
|
||||
<property name="text">
|
||||
<string>Read all layers (additionally to the ones in the mapping table)</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="0" colspan="2">
|
||||
<widget class="Line" name="line">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="0" rowspan="10" colspan="2">
|
||||
<widget class="lay::LayerMappingWidget" name="layer_map">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="frameShape">
|
||||
<enum>QFrame::NoFrame</enum>
|
||||
</property>
|
||||
<property name="frameShadow">
|
||||
<enum>QFrame::Raised</enum>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<customwidgets>
|
||||
<customwidget>
|
||||
<class>lay::LayerMappingWidget</class>
|
||||
<extends>QFrame</extends>
|
||||
<header>layLayerMappingWidget.h</header>
|
||||
<container>1</container>
|
||||
<slots>
|
||||
<signal>enable_all_layers(bool)</signal>
|
||||
</slots>
|
||||
</customwidget>
|
||||
<customwidget>
|
||||
<class>lay::InteractiveListWidget</class>
|
||||
<extends>QListWidget</extends>
|
||||
<header>layWidgets.h</header>
|
||||
</customwidget>
|
||||
</customwidgets>
|
||||
<tabstops>
|
||||
<tabstop>lambda_le</tabstop>
|
||||
<tabstop>dbu_le</tabstop>
|
||||
<tabstop>keep_names_cbx</tabstop>
|
||||
<tabstop>lib_path</tabstop>
|
||||
<tabstop>add_lib_path</tabstop>
|
||||
<tabstop>add_lib_path_with_choose</tabstop>
|
||||
<tabstop>del_lib_path</tabstop>
|
||||
<tabstop>move_lib_path_up</tabstop>
|
||||
<tabstop>move_lib_path_down</tabstop>
|
||||
<tabstop>read_all_cbx</tabstop>
|
||||
</tabstops>
|
||||
<resources>
|
||||
<include location="../../../../lay/lay/layResources.qrc"/>
|
||||
</resources>
|
||||
<connections>
|
||||
<connection>
|
||||
<sender>layer_map</sender>
|
||||
<signal>enable_all_layers(bool)</signal>
|
||||
<receiver>read_all_cbx</receiver>
|
||||
<slot>setChecked(bool)</slot>
|
||||
<hints>
|
||||
<hint type="sourcelabel">
|
||||
<x>122</x>
|
||||
<y>186</y>
|
||||
</hint>
|
||||
<hint type="destinationlabel">
|
||||
<x>109</x>
|
||||
<y>147</y>
|
||||
</hint>
|
||||
</hints>
|
||||
</connection>
|
||||
</connections>
|
||||
</ui>
|
||||
|
|
@ -0,0 +1,106 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<ui version="4.0">
|
||||
<class>MAGWriterOptionPage</class>
|
||||
<widget class="QWidget" name="MAGWriterOptionPage">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>619</width>
|
||||
<height>250</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
<string>Form</string>
|
||||
</property>
|
||||
<layout class="QVBoxLayout">
|
||||
<property name="spacing">
|
||||
<number>6</number>
|
||||
</property>
|
||||
<property name="leftMargin">
|
||||
<number>9</number>
|
||||
</property>
|
||||
<property name="topMargin">
|
||||
<number>9</number>
|
||||
</property>
|
||||
<property name="rightMargin">
|
||||
<number>9</number>
|
||||
</property>
|
||||
<property name="bottomMargin">
|
||||
<number>9</number>
|
||||
</property>
|
||||
<item>
|
||||
<widget class="QGroupBox" name="groupBox">
|
||||
<property name="title">
|
||||
<string>Magic Writer Options</string>
|
||||
</property>
|
||||
<layout class="QGridLayout" name="gridLayout">
|
||||
<item row="3" column="1">
|
||||
<widget class="QLineEdit" name="tech_le"/>
|
||||
</item>
|
||||
<item row="0" column="1">
|
||||
<widget class="QLineEdit" name="lambda_le"/>
|
||||
</item>
|
||||
<item row="2" column="0">
|
||||
<widget class="QLabel" name="label_4">
|
||||
<property name="text">
|
||||
<string>Zero timestamp</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="1">
|
||||
<widget class="QCheckBox" name="zero_ts_cbx">
|
||||
<property name="text">
|
||||
<string>If checked, a zero timestamp is written (good for comparing files)</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="1" colspan="2">
|
||||
<widget class="QLabel" name="label_2">
|
||||
<property name="text">
|
||||
<string>Leave this value empty to take the lambda value stored in the layout</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="3" column="0">
|
||||
<widget class="QLabel" name="label_5">
|
||||
<property name="text">
|
||||
<string>Technology</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="2">
|
||||
<widget class="QLabel" name="label">
|
||||
<property name="text">
|
||||
<string>Micron</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="0">
|
||||
<widget class="QLabel" name="label_6">
|
||||
<property name="text">
|
||||
<string>Lambda value</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<spacer>
|
||||
<property name="orientation">
|
||||
<enum>Qt::Vertical</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>601</width>
|
||||
<height>16</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<resources/>
|
||||
<connections/>
|
||||
</ui>
|
||||
|
|
@ -0,0 +1,145 @@
|
|||
|
||||
/*
|
||||
|
||||
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 "dbMAG.h"
|
||||
#include "dbMAGReader.h"
|
||||
#include "dbLoadLayoutOptions.h"
|
||||
#include "layMAGReaderPlugin.h"
|
||||
#include "ui_MAGReaderOptionPage.h"
|
||||
#include "gsiDecl.h"
|
||||
|
||||
#include <QFrame>
|
||||
#include <QFileDialog>
|
||||
|
||||
namespace lay
|
||||
{
|
||||
|
||||
// ---------------------------------------------------------------
|
||||
// MAGReaderOptionPage definition and implementation
|
||||
|
||||
MAGReaderOptionPage::MAGReaderOptionPage (QWidget *parent)
|
||||
: StreamReaderOptionsPage (parent)
|
||||
{
|
||||
mp_ui = new Ui::MAGReaderOptionPage ();
|
||||
mp_ui->setupUi (this);
|
||||
|
||||
connect (mp_ui->add_lib_path, SIGNAL (clicked ()), this, SLOT (add_lib_path_clicked ()));
|
||||
connect (mp_ui->add_lib_path_with_choose, SIGNAL (clicked ()), this, SLOT (add_lib_path_clicked_with_choose ()));
|
||||
connect (mp_ui->del_lib_path, SIGNAL (clicked ()), mp_ui->lib_path, SLOT (delete_selected_items ()));
|
||||
connect (mp_ui->move_lib_path_up, SIGNAL (clicked ()), mp_ui->lib_path, SLOT (move_selected_items_up ()));
|
||||
connect (mp_ui->move_lib_path_down, SIGNAL (clicked ()), mp_ui->lib_path, SLOT (move_selected_items_down ()));
|
||||
}
|
||||
|
||||
MAGReaderOptionPage::~MAGReaderOptionPage ()
|
||||
{
|
||||
delete mp_ui;
|
||||
mp_ui = 0;
|
||||
}
|
||||
|
||||
void
|
||||
MAGReaderOptionPage::setup (const db::FormatSpecificReaderOptions *o, const db::Technology * /*tech*/)
|
||||
{
|
||||
static const db::MAGReaderOptions default_options;
|
||||
const db::MAGReaderOptions *options = dynamic_cast<const db::MAGReaderOptions *> (o);
|
||||
if (!options) {
|
||||
options = &default_options;
|
||||
}
|
||||
|
||||
mp_ui->dbu_le->setText (tl::to_qstring (tl::to_string (options->dbu)));
|
||||
mp_ui->lambda_le->setText (tl::to_qstring (tl::to_string (options->lambda)));
|
||||
mp_ui->layer_map->set_layer_map (options->layer_map);
|
||||
mp_ui->read_all_cbx->setChecked (options->create_other_layers);
|
||||
mp_ui->keep_names_cbx->setChecked (options->keep_layer_names);
|
||||
mp_ui->merge_cbx->setChecked (options->merge);
|
||||
|
||||
mp_ui->lib_path->set_values (options->lib_paths);
|
||||
}
|
||||
|
||||
void
|
||||
MAGReaderOptionPage::commit (db::FormatSpecificReaderOptions *o, const db::Technology * /*tech*/)
|
||||
{
|
||||
db::MAGReaderOptions *options = dynamic_cast<db::MAGReaderOptions *> (o);
|
||||
if (options) {
|
||||
|
||||
tl::from_string (tl::to_string (mp_ui->dbu_le->text ()), options->dbu);
|
||||
if (options->dbu > 1000.0 || options->dbu < 1e-9) {
|
||||
throw tl::Exception (tl::to_string (QObject::tr ("Invalid value for database unit")));
|
||||
}
|
||||
|
||||
tl::from_string (tl::to_string (mp_ui->lambda_le->text ()), options->lambda);
|
||||
if (options->lambda > 10000000.0 || options->lambda < 1e-9) {
|
||||
throw tl::Exception (tl::to_string (QObject::tr ("Invalid value for lambda")));
|
||||
}
|
||||
|
||||
options->layer_map = mp_ui->layer_map->get_layer_map ();
|
||||
options->create_other_layers = mp_ui->read_all_cbx->isChecked ();
|
||||
options->keep_layer_names = mp_ui->keep_names_cbx->isChecked ();
|
||||
options->merge = mp_ui->merge_cbx->isChecked ();
|
||||
|
||||
options->lib_paths = mp_ui->lib_path->get_values ();
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
MAGReaderOptionPage::add_lib_path_clicked ()
|
||||
{
|
||||
mp_ui->lib_path->add_value (tl::to_string (tr ("Enter your path here ...")));
|
||||
}
|
||||
|
||||
void
|
||||
MAGReaderOptionPage::add_lib_path_clicked_with_choose ()
|
||||
{
|
||||
QString dir = QFileDialog::getExistingDirectory (this, QObject::tr ("Add library path"));
|
||||
if (! dir.isNull ()) {
|
||||
mp_ui->lib_path->add_value (tl::to_string (dir));
|
||||
}
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------
|
||||
// MAGReaderPluginDeclaration definition and implementation
|
||||
|
||||
class MAGReaderPluginDeclaration
|
||||
: public StreamReaderPluginDeclaration
|
||||
{
|
||||
public:
|
||||
MAGReaderPluginDeclaration ()
|
||||
: StreamReaderPluginDeclaration (db::MAGReaderOptions ().format_name ())
|
||||
{
|
||||
// .. nothing yet ..
|
||||
}
|
||||
|
||||
StreamReaderOptionsPage *format_specific_options_page (QWidget *parent) const
|
||||
{
|
||||
return new MAGReaderOptionPage (parent);
|
||||
}
|
||||
|
||||
db::FormatSpecificReaderOptions *create_specific_options () const
|
||||
{
|
||||
return new db::MAGReaderOptions ();
|
||||
}
|
||||
};
|
||||
|
||||
static tl::RegisteredClass<lay::PluginDeclaration> plugin_decl (new lay::MAGReaderPluginDeclaration (), 10000, "MAGReader");
|
||||
|
||||
}
|
||||
|
||||
|
|
@ -0,0 +1,63 @@
|
|||
|
||||
/*
|
||||
|
||||
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
|
||||
|
||||
*/
|
||||
|
||||
|
||||
|
||||
#ifndef HDR_layMAGReaderPlugin_h
|
||||
#define HDR_layMAGReaderPlugin_h
|
||||
|
||||
#include "layStream.h"
|
||||
#include <QObject>
|
||||
|
||||
namespace Ui
|
||||
{
|
||||
class MAGReaderOptionPage;
|
||||
}
|
||||
|
||||
namespace lay
|
||||
{
|
||||
|
||||
class MAGReaderOptionPage
|
||||
: public StreamReaderOptionsPage
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
MAGReaderOptionPage (QWidget *parent);
|
||||
~MAGReaderOptionPage ();
|
||||
|
||||
void setup (const db::FormatSpecificReaderOptions *options, const db::Technology *tech);
|
||||
void commit (db::FormatSpecificReaderOptions *options, const db::Technology *tech);
|
||||
|
||||
private slots:
|
||||
void add_lib_path_clicked ();
|
||||
void add_lib_path_clicked_with_choose ();
|
||||
|
||||
private:
|
||||
Ui::MAGReaderOptionPage *mp_ui;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
|
|
@ -0,0 +1,110 @@
|
|||
|
||||
/*
|
||||
|
||||
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 "dbMAG.h"
|
||||
#include "dbMAGWriter.h"
|
||||
#include "dbSaveLayoutOptions.h"
|
||||
#include "layMAGWriterPlugin.h"
|
||||
#include "ui_MAGWriterOptionPage.h"
|
||||
|
||||
#include <QFrame>
|
||||
|
||||
namespace lay
|
||||
{
|
||||
|
||||
// ---------------------------------------------------------------
|
||||
// MAGWriterOptionPage definition and implementation
|
||||
|
||||
MAGWriterOptionPage::MAGWriterOptionPage (QWidget *parent)
|
||||
: StreamWriterOptionsPage (parent)
|
||||
{
|
||||
mp_ui = new Ui::MAGWriterOptionPage ();
|
||||
mp_ui->setupUi (this);
|
||||
|
||||
// .. nothing yet ..
|
||||
}
|
||||
|
||||
MAGWriterOptionPage::~MAGWriterOptionPage ()
|
||||
{
|
||||
delete mp_ui;
|
||||
mp_ui = 0;
|
||||
}
|
||||
|
||||
void
|
||||
MAGWriterOptionPage::setup (const db::FormatSpecificWriterOptions *o, const db::Technology * /*tech*/)
|
||||
{
|
||||
const db::MAGWriterOptions *options = dynamic_cast<const db::MAGWriterOptions *> (o);
|
||||
if (options) {
|
||||
if (options->lambda <= 0.0) {
|
||||
mp_ui->lambda_le->setText (QString ());
|
||||
} else {
|
||||
mp_ui->lambda_le->setText (tl::to_qstring (tl::to_string (options->lambda)));
|
||||
}
|
||||
mp_ui->tech_le->setText (tl::to_qstring (options->tech));
|
||||
mp_ui->zero_ts_cbx->setChecked (! options->write_timestamp);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
MAGWriterOptionPage::commit (db::FormatSpecificWriterOptions *o, const db::Technology * /*tech*/, bool /*gzip*/)
|
||||
{
|
||||
db::MAGWriterOptions *options = dynamic_cast<db::MAGWriterOptions *> (o);
|
||||
if (options) {
|
||||
QString l = mp_ui->lambda_le->text ().trimmed ();
|
||||
options->lambda = 0.0;
|
||||
if (! l.isEmpty ()) {
|
||||
tl::from_string (tl::to_string (l), options->lambda);
|
||||
}
|
||||
options->tech = tl::to_string (mp_ui->tech_le->text ().trimmed ());
|
||||
options->write_timestamp = ! mp_ui->zero_ts_cbx->isChecked ();
|
||||
}
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------
|
||||
// MAGWriterPluginDeclaration definition and implementation
|
||||
|
||||
class MAGWriterPluginDeclaration
|
||||
: public StreamWriterPluginDeclaration
|
||||
{
|
||||
public:
|
||||
MAGWriterPluginDeclaration ()
|
||||
: StreamWriterPluginDeclaration (db::MAGWriterOptions ().format_name ())
|
||||
{
|
||||
// .. nothing yet ..
|
||||
}
|
||||
|
||||
StreamWriterOptionsPage *format_specific_options_page (QWidget *parent) const
|
||||
{
|
||||
return new MAGWriterOptionPage (parent);
|
||||
}
|
||||
|
||||
db::FormatSpecificWriterOptions *create_specific_options () const
|
||||
{
|
||||
return new db::MAGWriterOptions ();
|
||||
}
|
||||
};
|
||||
|
||||
static tl::RegisteredClass<lay::PluginDeclaration> plugin_decl (new lay::MAGWriterPluginDeclaration (), 10000, "MAGWriter");
|
||||
|
||||
}
|
||||
|
||||
|
|
@ -0,0 +1,58 @@
|
|||
|
||||
/*
|
||||
|
||||
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
|
||||
|
||||
*/
|
||||
|
||||
|
||||
#ifndef HDR_layMAGWriterPlugin_h
|
||||
#define HDR_layMAGWriterPlugin_h
|
||||
|
||||
#include "layStream.h"
|
||||
#include <QObject>
|
||||
|
||||
namespace Ui
|
||||
{
|
||||
class MAGWriterOptionPage;
|
||||
}
|
||||
|
||||
namespace lay
|
||||
{
|
||||
|
||||
class MAGWriterOptionPage
|
||||
: public StreamWriterOptionsPage
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
MAGWriterOptionPage (QWidget *parent);
|
||||
~MAGWriterOptionPage ();
|
||||
|
||||
void setup (const db::FormatSpecificWriterOptions *options, const db::Technology *tech);
|
||||
void commit (db::FormatSpecificWriterOptions *options, const db::Technology *tech, bool gzip);
|
||||
|
||||
private:
|
||||
Ui::MAGWriterOptionPage *mp_ui;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
|
|
@ -0,0 +1,25 @@
|
|||
|
||||
TARGET = mag_ui
|
||||
DESTDIR = $$OUT_PWD/../../../../lay_plugins
|
||||
|
||||
include($$PWD/../../../lay_plugin.pri)
|
||||
|
||||
INCLUDEPATH += $$PWD/../db_plugin
|
||||
DEPENDPATH += $$PWD/../db_plugin
|
||||
LIBS += -L$$DESTDIR/../db_plugins -lmag
|
||||
|
||||
!isEmpty(RPATH) {
|
||||
QMAKE_RPATHDIR += $$RPATH/db_plugins
|
||||
}
|
||||
|
||||
HEADERS = \
|
||||
layMAGReaderPlugin.h \
|
||||
layMAGWriterPlugin.h \
|
||||
|
||||
SOURCES = \
|
||||
layMAGReaderPlugin.cc \
|
||||
layMAGWriterPlugin.cc \
|
||||
|
||||
FORMS = \
|
||||
MAGWriterOptionPage.ui \
|
||||
MAGReaderOptionPage.ui \
|
||||
|
|
@ -0,0 +1,10 @@
|
|||
|
||||
TEMPLATE = subdirs
|
||||
|
||||
SUBDIRS = db_plugin unit_tests
|
||||
unit_tests.depends += db_plugin
|
||||
|
||||
!equals(HAVE_QT, "0") {
|
||||
SUBDIRS += lay_plugin
|
||||
lay_plugin.depends += db_plugin
|
||||
}
|
||||
|
|
@ -0,0 +1,153 @@
|
|||
|
||||
/*
|
||||
|
||||
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 "dbMAGReader.h"
|
||||
#include "dbLayoutDiff.h"
|
||||
#include "dbWriter.h"
|
||||
#include "dbMAGWriter.h"
|
||||
#include "tlUnitTest.h"
|
||||
|
||||
#include <stdlib.h>
|
||||
|
||||
static void run_test (tl::TestBase *_this, const std::string &base, const char *file, const char *file_au, const char *map = 0, double lambda = 0.1, double dbu = 0.001, const std::vector<std::string> *lib_paths = 0)
|
||||
{
|
||||
db::MAGReaderOptions *opt = new db::MAGReaderOptions();
|
||||
opt->dbu = dbu;
|
||||
if (lib_paths) {
|
||||
opt->lib_paths = *lib_paths;
|
||||
}
|
||||
|
||||
db::LayerMap lm;
|
||||
if (map) {
|
||||
unsigned int ln = 0;
|
||||
tl::Extractor ex (map);
|
||||
while (! ex.at_end ()) {
|
||||
std::string n;
|
||||
int l;
|
||||
ex.read_word_or_quoted (n);
|
||||
ex.test (":");
|
||||
ex.read (l);
|
||||
ex.test (",");
|
||||
lm.map (n, ln++, db::LayerProperties (l, 0));
|
||||
}
|
||||
opt->layer_map = lm;
|
||||
opt->create_other_layers = true;
|
||||
}
|
||||
|
||||
db::LoadLayoutOptions options;
|
||||
options.set_options (opt);
|
||||
|
||||
db::Manager m;
|
||||
db::Layout layout (&m), layout2 (&m), layout2_mag (&m), layout_au (&m);
|
||||
|
||||
{
|
||||
std::string fn (base);
|
||||
fn += "/testdata/magic/";
|
||||
fn += file;
|
||||
tl::InputStream stream (fn);
|
||||
db::Reader reader (stream);
|
||||
reader.read (layout, options);
|
||||
}
|
||||
|
||||
std::string tc_name = layout.cell_name (*layout.begin_top_down ());
|
||||
|
||||
// normalize the layout by writing to GDS and reading from ..
|
||||
|
||||
std::string tmp_cif_file = _this->tmp_file (tl::sprintf ("%s.cif", tc_name));
|
||||
std::string tmp_mag_file = _this->tmp_file (tl::sprintf ("%s.mag", tc_name));
|
||||
|
||||
{
|
||||
tl::OutputStream stream (tmp_cif_file);
|
||||
db::SaveLayoutOptions options;
|
||||
options.set_format ("CIF");
|
||||
db::Writer writer (options);
|
||||
writer.write (layout, stream);
|
||||
}
|
||||
|
||||
{
|
||||
tl::InputStream stream (tmp_cif_file);
|
||||
db::Reader reader (stream);
|
||||
reader.read (layout2);
|
||||
}
|
||||
|
||||
// normalize the layout by writing to MAG and reading from ..
|
||||
|
||||
{
|
||||
tl::OutputStream stream (tmp_mag_file);
|
||||
|
||||
db::MAGWriterOptions *opt = new db::MAGWriterOptions();
|
||||
opt->lambda = lambda;
|
||||
|
||||
db::MAGWriter writer;
|
||||
db::SaveLayoutOptions options;
|
||||
options.set_options (opt);
|
||||
writer.write (layout, stream, options);
|
||||
}
|
||||
|
||||
{
|
||||
tl::InputStream stream (tmp_mag_file);
|
||||
|
||||
db::MAGReaderOptions *opt = new db::MAGReaderOptions();
|
||||
opt->dbu = dbu;
|
||||
opt->lambda = lambda;
|
||||
db::LoadLayoutOptions reread_options;
|
||||
reread_options.set_options (opt);
|
||||
|
||||
db::Reader reader (stream);
|
||||
reader.read (layout2_mag, reread_options);
|
||||
|
||||
layout2_mag.rename_cell (*layout2_mag.begin_top_down (), layout.cell_name (*layout.begin_top_down ()));
|
||||
}
|
||||
|
||||
{
|
||||
std::string fn (base);
|
||||
fn += "/testdata/magic/";
|
||||
fn += file_au;
|
||||
tl::InputStream stream (fn);
|
||||
db::Reader reader (stream);
|
||||
reader.read (layout_au);
|
||||
}
|
||||
|
||||
bool equal = db::compare_layouts (layout2, layout_au, db::layout_diff::f_boxes_as_polygons | db::layout_diff::f_verbose | db::layout_diff::f_flatten_array_insts, 1);
|
||||
if (! equal) {
|
||||
_this->raise (tl::sprintf ("Compare failed after reading - see %s vs %s\n", tmp_cif_file, file_au));
|
||||
}
|
||||
|
||||
equal = db::compare_layouts (layout, layout2_mag, db::layout_diff::f_boxes_as_polygons | db::layout_diff::f_verbose | db::layout_diff::f_flatten_array_insts, 1);
|
||||
if (! equal) {
|
||||
_this->raise (tl::sprintf ("Compare failed after writing - see %s vs %s\n", file, tmp_mag_file));
|
||||
}
|
||||
}
|
||||
|
||||
TEST(1)
|
||||
{
|
||||
run_test (_this, tl::testsrc (), "MAG_TEST.mag.gz", "mag_test_au.cif.gz");
|
||||
}
|
||||
|
||||
TEST(2)
|
||||
{
|
||||
std::vector<std::string> lp;
|
||||
lp.push_back (std::string ("../.."));
|
||||
run_test (_this, tl::testsrc (), "PearlRiver/Layout/magic/PearlRiver_die.mag", "PearlRiver_au.cif.gz", 0, 1.0, 0.001, &lp);
|
||||
}
|
||||
|
||||
|
|
@ -0,0 +1,19 @@
|
|||
|
||||
DESTDIR_UT = $$OUT_PWD/../../../..
|
||||
|
||||
TARGET = mag_tests
|
||||
|
||||
include($$PWD/../../../../lib_ut.pri)
|
||||
|
||||
SOURCES = \
|
||||
dbMAGReader.cc \
|
||||
|
||||
INCLUDEPATH += $$LAY_INC $$TL_INC $$DB_INC $$GSI_INC $$PWD/../db_plugin $$PWD/../../../common
|
||||
DEPENDPATH += $$LAY_INC $$TL_INC $$DB_INC $$GSI_INC $$PWD/../db_plugin $$PWD/../../../common
|
||||
|
||||
LIBS += -L$$DESTDIR_UT -lklayout_db -lklayout_tl -lklayout_gsi
|
||||
|
||||
PLUGINPATH = $$OUT_PWD/../../../../db_plugins
|
||||
QMAKE_RPATHDIR += $$PLUGINPATH
|
||||
|
||||
LIBS += -L$$PLUGINPATH -lmag
|
||||
|
|
@ -29,49 +29,6 @@
|
|||
namespace tl
|
||||
{
|
||||
|
||||
// ---------------------------------------------------------------------------------
|
||||
// TODO: take from tlString.h
|
||||
|
||||
static inline uint32_t utf32_from_utf8 (const char *&cp, const char *cpe = 0)
|
||||
{
|
||||
uint32_t c32 = (unsigned char) *cp++;
|
||||
if (c32 >= 0xf0 && ((cpe && cp + 2 < cpe) || (! cpe && cp [0] && cp [1] && cp [2]))) {
|
||||
c32 = ((c32 & 0x7) << 18) | ((uint32_t (cp [0]) & 0x3f) << 12) | ((uint32_t (cp [1]) & 0x3f) << 6) | (uint32_t (cp [2]) & 0x3f);
|
||||
cp += 3;
|
||||
} else if (c32 >= 0xe0 && ((cpe && cp + 1 < cpe) || (! cpe && cp [0] && cp [1]))) {
|
||||
c32 = ((c32 & 0xf) << 12) | ((uint32_t (cp [0]) & 0x3f) << 6) | (uint32_t (cp [1]) & 0x3f);
|
||||
cp += 2;
|
||||
} else if (c32 >= 0xc0 && ((cpe && cp < cpe) || (! cpe && cp [0]))) {
|
||||
c32 = ((c32 & 0x1f) << 6) | (uint32_t (*cp) & 0x3f);
|
||||
++cp;
|
||||
}
|
||||
|
||||
return c32;
|
||||
}
|
||||
|
||||
#include "utf_casefolding.h"
|
||||
|
||||
static inline wchar_t wdowncase (wchar_t c)
|
||||
{
|
||||
int ch = c >> 8;
|
||||
if (ch >= 0 && ch < int (sizeof (uc_tab) / sizeof (uc_tab[0])) && uc_tab[ch]) {
|
||||
return uc_tab[ch][c & 0xff];
|
||||
} else {
|
||||
return c;
|
||||
}
|
||||
}
|
||||
|
||||
static inline uint32_t utf32_downcase (uint32_t c32)
|
||||
{
|
||||
if (sizeof (wchar_t) == 2 && c32 >= 0x10000) {
|
||||
return c32;
|
||||
} else {
|
||||
return uint32_t (wdowncase (wchar_t (c32)));
|
||||
}
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------------
|
||||
|
||||
class GlobPatternOpBase
|
||||
{
|
||||
public:
|
||||
|
|
|
|||
|
|
@ -691,7 +691,7 @@ OutputStreamBase *create_file_stream (const std::string &path, OutputStream::Out
|
|||
}
|
||||
|
||||
OutputStream::OutputStream (const std::string &abstract_path, OutputStreamMode om, bool as_text)
|
||||
: m_pos (0), mp_delegate (0), m_owns_delegate (false), m_as_text (as_text)
|
||||
: m_pos (0), mp_delegate (0), m_owns_delegate (false), m_as_text (as_text), m_path (abstract_path)
|
||||
{
|
||||
// Determine output mode
|
||||
om = output_mode_from_filename (abstract_path, om);
|
||||
|
|
@ -715,6 +715,12 @@ OutputStream::OutputStream (const std::string &abstract_path, OutputStreamMode o
|
|||
}
|
||||
|
||||
OutputStream::~OutputStream ()
|
||||
{
|
||||
close ();
|
||||
}
|
||||
|
||||
void
|
||||
OutputStream::close ()
|
||||
{
|
||||
flush ();
|
||||
|
||||
|
|
@ -728,6 +734,12 @@ OutputStream::~OutputStream ()
|
|||
}
|
||||
}
|
||||
|
||||
void
|
||||
OutputStream::set_as_text (bool f)
|
||||
{
|
||||
m_as_text = f;
|
||||
}
|
||||
|
||||
inline void fast_copy (char *t, const char *s, size_t n)
|
||||
{
|
||||
if (n >= sizeof (unsigned long)) {
|
||||
|
|
@ -753,7 +765,7 @@ inline void fast_copy (char *t, const char *s, size_t n)
|
|||
void
|
||||
OutputStream::flush ()
|
||||
{
|
||||
if (m_buffer_pos > 0) {
|
||||
if (m_buffer_pos > 0 && mp_delegate) {
|
||||
mp_delegate->write (mp_buffer, m_buffer_pos);
|
||||
m_buffer_pos = 0;
|
||||
}
|
||||
|
|
@ -762,6 +774,10 @@ OutputStream::flush ()
|
|||
void
|
||||
OutputStream::put (const char *b, size_t n)
|
||||
{
|
||||
if (! mp_delegate) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (m_as_text) {
|
||||
// skip CR, but replace LF by CRLF -> this will normalize the line terminators to CRLF
|
||||
while (n > 0) {
|
||||
|
|
@ -819,7 +835,9 @@ OutputStream::seek (size_t pos)
|
|||
{
|
||||
flush ();
|
||||
|
||||
mp_delegate->seek (pos);
|
||||
if (mp_delegate) {
|
||||
mp_delegate->seek (pos);
|
||||
}
|
||||
m_pos = pos;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1033,6 +1033,11 @@ public:
|
|||
*/
|
||||
virtual ~OutputStream ();
|
||||
|
||||
/**
|
||||
* @brief Closes the stream - after closing, the stream can't be accessed anymore
|
||||
*/
|
||||
void close ();
|
||||
|
||||
/**
|
||||
* @brief This is the outer write method to call
|
||||
*
|
||||
|
|
@ -1108,7 +1113,7 @@ public:
|
|||
*/
|
||||
bool supports_seek () const
|
||||
{
|
||||
return mp_delegate->supports_seek ();
|
||||
return mp_delegate != 0 && mp_delegate->supports_seek ();
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -1132,6 +1137,19 @@ public:
|
|||
*/
|
||||
void flush ();
|
||||
|
||||
/**
|
||||
* @brief Gets the path that was specified in the constructor
|
||||
*/
|
||||
const std::string &path () const
|
||||
{
|
||||
return m_path;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Configures the stream for text output
|
||||
*/
|
||||
void set_as_text (bool f);
|
||||
|
||||
protected:
|
||||
void reset_pos ()
|
||||
{
|
||||
|
|
@ -1145,6 +1163,7 @@ private:
|
|||
bool m_as_text;
|
||||
char *mp_buffer;
|
||||
size_t m_buffer_capacity, m_buffer_pos;
|
||||
std::string m_path;
|
||||
|
||||
void put_raw (const char *b, size_t n);
|
||||
|
||||
|
|
|
|||
|
|
@ -46,7 +46,7 @@ static std::locale c_locale ("C");
|
|||
|
||||
#include "utf_casefolding.h"
|
||||
|
||||
static inline wchar_t wdowncase (wchar_t c)
|
||||
wchar_t wdowncase (wchar_t c)
|
||||
{
|
||||
int ch = c >> 8;
|
||||
if (ch >= 0 && ch < int (sizeof (uc_tab) / sizeof (uc_tab[0])) && uc_tab[ch]) {
|
||||
|
|
@ -56,7 +56,7 @@ static inline wchar_t wdowncase (wchar_t c)
|
|||
}
|
||||
}
|
||||
|
||||
static inline wchar_t wupcase (wchar_t c)
|
||||
wchar_t wupcase (wchar_t c)
|
||||
{
|
||||
int ch = c >> 8;
|
||||
if (ch >= 0 && ch < int (sizeof (lc_tab) / sizeof (lc_tab[0])) && lc_tab[ch]) {
|
||||
|
|
@ -66,7 +66,7 @@ static inline wchar_t wupcase (wchar_t c)
|
|||
}
|
||||
}
|
||||
|
||||
static inline uint32_t utf32_downcase (uint32_t c32)
|
||||
uint32_t utf32_downcase (uint32_t c32)
|
||||
{
|
||||
if (sizeof (wchar_t) == 2 && c32 >= 0x10000) {
|
||||
return c32;
|
||||
|
|
@ -75,8 +75,7 @@ static inline uint32_t utf32_downcase (uint32_t c32)
|
|||
}
|
||||
}
|
||||
|
||||
/* Not used yet:
|
||||
static inline uint32_t utf32_upcase (uint32_t c32)
|
||||
uint32_t utf32_upcase (uint32_t c32)
|
||||
{
|
||||
if (sizeof (wchar_t) == 2 && c32 >= 0x10000) {
|
||||
return c32;
|
||||
|
|
@ -84,12 +83,11 @@ static inline uint32_t utf32_upcase (uint32_t c32)
|
|||
return uint32_t (wupcase (wchar_t (c32)));
|
||||
}
|
||||
}
|
||||
*/
|
||||
|
||||
// -------------------------------------------------------------------------
|
||||
// Conversion of UTF8 to wchar_t
|
||||
|
||||
uint32_t utf32_from_utf8 (const char *&cp, const char *cpe = 0)
|
||||
uint32_t utf32_from_utf8 (const char *&cp, const char *cpe)
|
||||
{
|
||||
uint32_t c32 = (unsigned char) *cp++;
|
||||
if (c32 >= 0xf0 && ((cpe && cp + 2 < cpe) || (! cpe && cp [0] && cp [1] && cp [2]))) {
|
||||
|
|
|
|||
|
|
@ -878,8 +878,33 @@ TL_PUBLIC std::string trim (const std::string &s);
|
|||
TL_PUBLIC std::vector<std::string> split (const std::string &s, const std::string &sep);
|
||||
TL_PUBLIC std::string join (const std::vector<std::string> &strings, const std::string &sep);
|
||||
|
||||
/**
|
||||
* @brief Returns the lower-case character for a wchar_t
|
||||
*/
|
||||
TL_PUBLIC wchar_t wdowncase (wchar_t c);
|
||||
|
||||
/**
|
||||
* @brief Returns the upper-case character for a wchar_t
|
||||
*/
|
||||
TL_PUBLIC wchar_t wupcase (wchar_t c);
|
||||
|
||||
/**
|
||||
* @brief Returns the lower-case UTF32 character
|
||||
*/
|
||||
TL_PUBLIC uint32_t utf32_downcase (uint32_t c32);
|
||||
|
||||
/**
|
||||
* @brief Returns the upper-case UTF32 character
|
||||
*/
|
||||
TL_PUBLIC uint32_t utf32_upcase (uint32_t c32);
|
||||
|
||||
/**
|
||||
* @brief Parses the next UTF32 character from an UTF-8 string
|
||||
* @param cp The input character's position, will be set to the next character.
|
||||
* @paran cpe The end of the string of 0 for "no end"
|
||||
*/
|
||||
TL_PUBLIC uint32_t utf32_from_utf8 (const char *&cp, const char *cpe = 0);
|
||||
|
||||
} // namespace tl
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -39,7 +39,7 @@ namespace tl
|
|||
* @brief clock_gettime is not implemented in Mac OS X 10.11 and lower
|
||||
* From: https://gist.githubusercontent.com/jbenet/1087739/raw/638b37f76cdd9dc46d617443cab27eac297e2ee3/current_utc_time.c
|
||||
*/
|
||||
void current_utc_time (struct timespec *ts);
|
||||
TL_PUBLIC void current_utc_time (struct timespec *ts);
|
||||
|
||||
/**
|
||||
* @brief A basic timer class
|
||||
|
|
|
|||
|
|
@ -59,6 +59,14 @@ public:
|
|||
return m_scheme;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Sets the scheme
|
||||
*/
|
||||
void set_scheme (const std::string &s)
|
||||
{
|
||||
m_scheme = s;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Returns the authority part or an empty string if there is no authority
|
||||
* The leading slashes and not part of the authority.
|
||||
|
|
@ -69,6 +77,14 @@ public:
|
|||
return m_authority;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Sets the authority
|
||||
*/
|
||||
void set_authority (const std::string &s)
|
||||
{
|
||||
m_authority = s;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Returns the path part or an empty string if there is no path
|
||||
* The path contains the leading slash if there is a path.
|
||||
|
|
@ -79,6 +95,14 @@ public:
|
|||
return m_path;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Sets the path
|
||||
*/
|
||||
void set_path (const std::string &s)
|
||||
{
|
||||
m_path = s;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Returns the query part or an empty map if there is no query
|
||||
* The map is a map of keys vs. values. Percent escaping is undone
|
||||
|
|
@ -89,6 +113,14 @@ public:
|
|||
return m_query;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Returns the query part or an empty map if there is no query (non-const version)
|
||||
*/
|
||||
std::map<std::string, std::string> &query ()
|
||||
{
|
||||
return m_query;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Returns the fragment or an empty string if there is none
|
||||
* Percent escaping is undone on the fragment already.
|
||||
|
|
@ -98,6 +130,14 @@ public:
|
|||
return m_fragment;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Sets the fragment
|
||||
*/
|
||||
void set_fragment (const std::string &s)
|
||||
{
|
||||
m_fragment = s;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Turns the URI into a string
|
||||
* Percent escaping is employed to escape special characters
|
||||
|
|
|
|||
|
|
@ -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" => 0x6d616769,
|
||||
}
|
||||
|
||||
# Windows CRLF -> LF translation
|
||||
|
|
@ -61,11 +62,15 @@ 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} ..."
|
||||
|
||||
out_file = File.join($ut_testtmp, "out_" + bin)
|
||||
if bin == "strm2mag"
|
||||
out_file = File.join($ut_testtmp, "TOP1.mag")
|
||||
else
|
||||
out_file = File.join($ut_testtmp, "out_" + bin)
|
||||
end
|
||||
if File.exists?(out_file)
|
||||
File.unlink(out_file)
|
||||
end
|
||||
|
|
|
|||
Binary file not shown.
Binary file not shown.
|
|
@ -0,0 +1,80 @@
|
|||
magic
|
||||
tech scmos
|
||||
timestamp 1541382103
|
||||
use Library/magic/L500_PBASE_W14_2000rsquare L500_PBASE_W14_2000rsquare_t
|
||||
timestamp 1541382052
|
||||
transform -1 0 8600 0 -1 8600
|
||||
box 0 0 7325 250
|
||||
use Layout/magic/PearlRiver_quarter PearlRiver_quarter_t
|
||||
timestamp 1541382103
|
||||
transform -1 0 8100 0 -1 8600
|
||||
box -28 0 7778 4050
|
||||
use Library/magic/L500_SIGNATURE_kallisti_huge L500_SIGNATURE_kallisti_huge_0
|
||||
timestamp 1533657739
|
||||
transform 1 0 3722 0 1 3763
|
||||
box 21 17 539 547
|
||||
use Library/magic/L500_SIGNATURE_pearlriver L500_SIGNATURE_pearlriver_0
|
||||
timestamp 1541382052
|
||||
transform 1 0 3897 0 1 3740
|
||||
box 0 0 202 18
|
||||
use Library/magic/L500_NBASE_W14_2000rsquare L500_NBASE_W14_2000rsquare_w
|
||||
timestamp 1541382052
|
||||
transform 0 1 0 -1 0 8600
|
||||
box 0 0 0 8600
|
||||
use Layout/magic/PearlRiver_quarter PearlRiver_quarter_w
|
||||
timestamp 1541382103
|
||||
transform 0 1 0 -1 0 8150
|
||||
box -28 0 7778 4050
|
||||
use Library/magic/L500_PWELL_W14_2000rsquare L500_PWELL_W14_2000rsquare_e
|
||||
timestamp 1541382052
|
||||
transform 0 -1 8600 1 0 50
|
||||
box 0 0 7324 250
|
||||
use Layout/magic/PearlRiver_quarter PearlRiver_quarter_e
|
||||
timestamp 1541382103
|
||||
transform 0 -1 8600 1 0 500
|
||||
box -28 0 7778 4050
|
||||
use Library/magic/L500_CHAR_0 L500_CHAR_0_0
|
||||
timestamp 1534325425
|
||||
transform 1 0 -3 0 1 42
|
||||
box 0 0 12 18
|
||||
use Library/magic/L500_NWELL_W14_2000rsquare L500_NWELL_W14_2000rsquare_b
|
||||
timestamp 1541382052
|
||||
transform 1 0 50 0 1 50
|
||||
box 0 0 7324 250
|
||||
use Layout/magic/PearlRiver_quarter PearlRiver_quarter_b
|
||||
timestamp 1541382103
|
||||
transform 1 0 500 0 1 50
|
||||
box -28 0 7778 4050
|
||||
use Library/magic/L500_CHAR_1 L500_CHAR_1_0
|
||||
timestamp 1534326485
|
||||
transform 1 0 1997 0 1 44
|
||||
box 0 0 12 18
|
||||
use Library/magic/L500_CHAR_2 L500_CHAR_2_0
|
||||
timestamp 1534324708
|
||||
transform 1 0 3997 0 1 44
|
||||
box 0 0 12 18
|
||||
use Library/magic/L500_CHAR_3 L500_CHAR_3_0
|
||||
timestamp 1534324785
|
||||
transform 1 0 5997 0 1 44
|
||||
box 0 0 12 18
|
||||
use Library/magic/L500_CHAR_4 L500_CHAR_4_0
|
||||
timestamp 1534324830
|
||||
transform 1 0 7997 0 1 44
|
||||
box 0 0 12 18
|
||||
use Library/magic/L500_SIGNATURE_ruler L500_SIGNATURE_ruler_0
|
||||
timestamp 1541382052
|
||||
transform 1 0 3 0 1 0
|
||||
box -3 0 2003 40
|
||||
use Library/magic/L500_SIGNATURE_ruler L500_SIGNATURE_ruler_1
|
||||
timestamp 1541382052
|
||||
transform 1 0 2003 0 1 0
|
||||
box -3 0 2003 40
|
||||
use Library/magic/L500_SIGNATURE_ruler L500_SIGNATURE_ruler_3
|
||||
timestamp 1541382052
|
||||
transform 1 0 4003 0 1 0
|
||||
box -3 0 2003 40
|
||||
use Library/magic/L500_SIGNATURE_ruler L500_SIGNATURE_ruler_2
|
||||
timestamp 1541382052
|
||||
transform 1 0 6003 0 1 0
|
||||
box -3 0 2003 40
|
||||
<< end >>
|
||||
|
|
@ -0,0 +1,72 @@
|
|||
magic
|
||||
tech scmos
|
||||
timestamp 1541940149
|
||||
use Layout/magic/contact_table contact_table_0 Layout/magic
|
||||
timestamp 1541940149
|
||||
transform 1 0 2500 0 1 550
|
||||
box 0 0 312 1700
|
||||
use Layout/magic/diode_table diode_table_0 Layout/magic
|
||||
timestamp 1541940149
|
||||
transform 1 0 50 0 1 1250
|
||||
box 0 0 3104 2800
|
||||
use Layout/magic/nmos_table nmos_table_0 Layout/magic
|
||||
timestamp 1541940149
|
||||
transform 1 0 750 0 1 1200
|
||||
box 0 0 1700 1700
|
||||
use Layout/magic/rpoly_rsquare rpoly_rsquare_0 Layout/magic
|
||||
timestamp 1541940149
|
||||
transform 1 0 -28 0 1 740
|
||||
box 0 0 2478 400
|
||||
use Layout/magic/npn_table npn_table_0 Layout/magic
|
||||
timestamp 1541940149
|
||||
transform 1 0 3200 0 1 1500
|
||||
box 0 0 300 650
|
||||
use ison_table ison_table_0
|
||||
timestamp 1541939920
|
||||
transform 1 0 2850 0 1 1150
|
||||
box 0 0 300 1700
|
||||
use Layout/magic/hvfet_table hvfet_table_0 Layout/magic
|
||||
timestamp 1541940149
|
||||
transform 1 0 3200 0 1 1150
|
||||
box 0 0 650 300
|
||||
use Layout/magic/metal3_rsquare metal3_rsquare_0 Layout/magic
|
||||
timestamp 1541940149
|
||||
transform 1 0 0 0 1 370
|
||||
box 0 0 2440 400
|
||||
use Layout/magic/metal2_rsquare metal2_rsquare_0 Layout/magic
|
||||
timestamp 1541940149
|
||||
transform 1 0 0 0 1 0
|
||||
box 0 0 2440 400
|
||||
use Layout/magic/pad_measure pad_measure_0 Layout/magic
|
||||
timestamp 1541940149
|
||||
transform 0 1 2500 -1 0 504
|
||||
box 0 0 504 250
|
||||
use Layout/magic/pnp_table pnp_table_0 Layout/magic
|
||||
timestamp 1541940149
|
||||
transform 1 0 2850 0 1 450
|
||||
box 0 0 300 650
|
||||
use Layout/magic/sonos_table sonos_table_0 Layout/magic
|
||||
timestamp 1541940149
|
||||
transform 1 0 3200 0 1 450
|
||||
box 0 0 650 650
|
||||
use Layout/magic/pmos_table pmos_table_0 Layout/magic
|
||||
timestamp 1541940149
|
||||
transform 1 0 4400 0 1 450
|
||||
box 0 0 1700 1700
|
||||
use Layout/magic/caps_table caps_table_0 Layout/magic
|
||||
timestamp 1541940149
|
||||
transform 1 0 4400 0 1 450
|
||||
box 0 0 2050 2072
|
||||
use Layout/magic/ringoscillator_stripe ringoscillator_stripe_0 Layout/magic
|
||||
timestamp 1541940149
|
||||
transform 0 1 3900 1 0 350
|
||||
box 0 0 2704 440
|
||||
use Layout/magic/metal1_rsquare metal1_rsquare_0 Layout/magic
|
||||
timestamp 1541940149
|
||||
transform 1 0 2800 0 1 0
|
||||
box 0 0 2440 400
|
||||
use Layout/magic/polysi_rsquare polysi_rsquare_0 Layout/magic
|
||||
timestamp 1541940149
|
||||
transform 1 0 5300 0 1 0
|
||||
box 0 0 2478 400
|
||||
<< end >>
|
||||
|
|
@ -0,0 +1,557 @@
|
|||
magic
|
||||
tech scmos
|
||||
timestamp 1538561894
|
||||
<< metal1 >>
|
||||
rect -310 152 0 156
|
||||
rect 824 152 1126 156
|
||||
rect -310 128 -210 152
|
||||
rect 1026 128 1126 152
|
||||
rect -10 80 0 84
|
||||
rect 824 80 826 84
|
||||
rect -10 72 0 76
|
||||
rect 824 72 826 76
|
||||
rect -310 4 -210 28
|
||||
rect 1026 4 1126 28
|
||||
rect -310 0 0 4
|
||||
rect 824 0 1126 4
|
||||
<< metal2 >>
|
||||
rect -6 36 -2 162
|
||||
rect 810 128 814 164
|
||||
rect 18 116 22 124
|
||||
rect 50 116 54 124
|
||||
rect 82 116 86 124
|
||||
rect 114 116 118 124
|
||||
rect 146 116 150 124
|
||||
rect 178 116 182 124
|
||||
rect 210 116 214 124
|
||||
rect 242 116 246 124
|
||||
rect 274 116 278 124
|
||||
rect 306 116 310 124
|
||||
rect 338 116 342 124
|
||||
rect 370 116 374 124
|
||||
rect 402 116 406 124
|
||||
rect 434 116 438 124
|
||||
rect 466 116 470 124
|
||||
rect 498 116 502 124
|
||||
rect 530 116 534 124
|
||||
rect 562 116 566 124
|
||||
rect 594 116 598 124
|
||||
rect 626 116 630 124
|
||||
rect 658 116 662 124
|
||||
rect 690 116 694 124
|
||||
rect 722 116 726 124
|
||||
rect 754 116 758 124
|
||||
rect 786 116 790 124
|
||||
rect 802 116 806 124
|
||||
rect 10 112 30 116
|
||||
rect 42 112 62 116
|
||||
rect 74 112 94 116
|
||||
rect 106 112 126 116
|
||||
rect 138 112 158 116
|
||||
rect 170 112 190 116
|
||||
rect 202 112 222 116
|
||||
rect 234 112 254 116
|
||||
rect 266 112 286 116
|
||||
rect 298 112 318 116
|
||||
rect 330 112 350 116
|
||||
rect 362 112 382 116
|
||||
rect 394 112 414 116
|
||||
rect 426 112 446 116
|
||||
rect 458 112 478 116
|
||||
rect 490 112 510 116
|
||||
rect 522 112 542 116
|
||||
rect 554 112 574 116
|
||||
rect 586 112 606 116
|
||||
rect 618 112 638 116
|
||||
rect 650 112 670 116
|
||||
rect 682 112 702 116
|
||||
rect 714 112 734 116
|
||||
rect 746 112 766 116
|
||||
rect 778 112 818 116
|
||||
rect 26 108 30 112
|
||||
rect 58 108 62 112
|
||||
rect 90 108 94 112
|
||||
rect 122 108 126 112
|
||||
rect 154 108 158 112
|
||||
rect 186 108 190 112
|
||||
rect 218 108 222 112
|
||||
rect 250 108 254 112
|
||||
rect 282 108 286 112
|
||||
rect 314 108 318 112
|
||||
rect 346 108 350 112
|
||||
rect 378 108 382 112
|
||||
rect 410 108 414 112
|
||||
rect 442 108 446 112
|
||||
rect 474 108 478 112
|
||||
rect 506 108 510 112
|
||||
rect 538 108 542 112
|
||||
rect 570 108 574 112
|
||||
rect 602 108 606 112
|
||||
rect 634 108 638 112
|
||||
rect 666 108 670 112
|
||||
rect 698 108 702 112
|
||||
rect 730 108 734 112
|
||||
rect 762 108 766 112
|
||||
rect 26 104 38 108
|
||||
rect 58 104 70 108
|
||||
rect 90 104 102 108
|
||||
rect 122 104 134 108
|
||||
rect 154 104 166 108
|
||||
rect 186 104 198 108
|
||||
rect 218 104 230 108
|
||||
rect 250 104 262 108
|
||||
rect 282 104 294 108
|
||||
rect 314 104 326 108
|
||||
rect 346 104 358 108
|
||||
rect 378 104 390 108
|
||||
rect 410 104 422 108
|
||||
rect 442 104 454 108
|
||||
rect 474 104 486 108
|
||||
rect 506 104 518 108
|
||||
rect 538 104 550 108
|
||||
rect 570 104 582 108
|
||||
rect 602 104 614 108
|
||||
rect 634 104 646 108
|
||||
rect 666 104 678 108
|
||||
rect 698 104 710 108
|
||||
rect 730 104 742 108
|
||||
rect 762 104 774 108
|
||||
rect 2 40 6 100
|
||||
rect 34 96 38 104
|
||||
rect 66 96 70 104
|
||||
rect 98 96 102 104
|
||||
rect 130 96 134 104
|
||||
rect 162 96 166 104
|
||||
rect 194 96 198 104
|
||||
rect 226 96 230 104
|
||||
rect 258 96 262 104
|
||||
rect 290 96 294 104
|
||||
rect 322 96 326 104
|
||||
rect 354 96 358 104
|
||||
rect 386 96 390 104
|
||||
rect 418 96 422 104
|
||||
rect 450 96 454 104
|
||||
rect 482 96 486 104
|
||||
rect 514 96 518 104
|
||||
rect 546 96 550 104
|
||||
rect 578 96 582 104
|
||||
rect 610 96 614 104
|
||||
rect 642 96 646 104
|
||||
rect 674 96 678 104
|
||||
rect 706 96 710 104
|
||||
rect 738 96 742 104
|
||||
rect 770 96 774 104
|
||||
rect 794 100 798 112
|
||||
rect 794 96 806 100
|
||||
rect 802 60 806 96
|
||||
rect 50 52 54 60
|
||||
rect 82 52 86 60
|
||||
rect 114 52 118 60
|
||||
rect 146 52 150 60
|
||||
rect 178 52 182 60
|
||||
rect 210 52 214 60
|
||||
rect 242 52 246 60
|
||||
rect 274 52 278 60
|
||||
rect 306 52 310 60
|
||||
rect 338 52 342 60
|
||||
rect 370 52 374 60
|
||||
rect 402 52 406 60
|
||||
rect 434 52 438 60
|
||||
rect 466 52 470 60
|
||||
rect 498 52 502 60
|
||||
rect 530 52 534 60
|
||||
rect 562 52 566 60
|
||||
rect 594 52 598 60
|
||||
rect 626 52 630 60
|
||||
rect 658 52 662 60
|
||||
rect 690 52 694 60
|
||||
rect 722 52 726 60
|
||||
rect 754 52 758 60
|
||||
rect 786 52 790 60
|
||||
rect 802 56 822 60
|
||||
rect 10 48 30 52
|
||||
rect 50 48 62 52
|
||||
rect 82 48 94 52
|
||||
rect 114 48 126 52
|
||||
rect 146 48 158 52
|
||||
rect 178 48 190 52
|
||||
rect 210 48 222 52
|
||||
rect 242 48 254 52
|
||||
rect 274 48 286 52
|
||||
rect 306 48 318 52
|
||||
rect 338 48 350 52
|
||||
rect 370 48 382 52
|
||||
rect 402 48 414 52
|
||||
rect 434 48 446 52
|
||||
rect 466 48 478 52
|
||||
rect 498 48 510 52
|
||||
rect 530 48 542 52
|
||||
rect 562 48 574 52
|
||||
rect 594 48 606 52
|
||||
rect 626 48 638 52
|
||||
rect 658 48 670 52
|
||||
rect 690 48 702 52
|
||||
rect 722 48 734 52
|
||||
rect 754 48 766 52
|
||||
rect 786 48 798 52
|
||||
rect 26 44 30 48
|
||||
rect 58 44 62 48
|
||||
rect 90 44 94 48
|
||||
rect 122 44 126 48
|
||||
rect 154 44 158 48
|
||||
rect 186 44 190 48
|
||||
rect 218 44 222 48
|
||||
rect 250 44 254 48
|
||||
rect 282 44 286 48
|
||||
rect 314 44 318 48
|
||||
rect 346 44 350 48
|
||||
rect 378 44 382 48
|
||||
rect 410 44 414 48
|
||||
rect 442 44 446 48
|
||||
rect 474 44 478 48
|
||||
rect 506 44 510 48
|
||||
rect 538 44 542 48
|
||||
rect 570 44 574 48
|
||||
rect 602 44 606 48
|
||||
rect 634 44 638 48
|
||||
rect 666 44 670 48
|
||||
rect 698 44 702 48
|
||||
rect 730 44 734 48
|
||||
rect 762 44 766 48
|
||||
rect 794 44 798 48
|
||||
rect 26 40 46 44
|
||||
rect 58 40 78 44
|
||||
rect 90 40 110 44
|
||||
rect 122 40 142 44
|
||||
rect 154 40 174 44
|
||||
rect 186 40 206 44
|
||||
rect 218 40 238 44
|
||||
rect 250 40 270 44
|
||||
rect 282 40 302 44
|
||||
rect 314 40 334 44
|
||||
rect 346 40 366 44
|
||||
rect 378 40 398 44
|
||||
rect 410 40 430 44
|
||||
rect 442 40 462 44
|
||||
rect 474 40 494 44
|
||||
rect 506 40 526 44
|
||||
rect 538 40 558 44
|
||||
rect 570 40 590 44
|
||||
rect 602 40 622 44
|
||||
rect 634 40 654 44
|
||||
rect 666 40 686 44
|
||||
rect 698 40 718 44
|
||||
rect 730 40 750 44
|
||||
rect 762 40 782 44
|
||||
rect 794 40 814 44
|
||||
rect -6 32 22 36
|
||||
rect 34 32 38 40
|
||||
rect 66 32 70 40
|
||||
rect 98 32 102 40
|
||||
rect 130 32 134 40
|
||||
rect 162 32 166 40
|
||||
rect 194 32 198 40
|
||||
rect 226 32 230 40
|
||||
rect 258 32 262 40
|
||||
rect 290 32 294 40
|
||||
rect 322 32 326 40
|
||||
rect 354 32 358 40
|
||||
rect 386 32 390 40
|
||||
rect 418 32 422 40
|
||||
rect 450 32 454 40
|
||||
rect 482 32 486 40
|
||||
rect 514 32 518 40
|
||||
rect 546 32 550 40
|
||||
rect 578 32 582 40
|
||||
rect 610 32 614 40
|
||||
rect 642 32 646 40
|
||||
rect 674 32 678 40
|
||||
rect 706 32 710 40
|
||||
rect 738 32 742 40
|
||||
rect 770 32 774 40
|
||||
rect 802 32 806 40
|
||||
use Library/magic/L500_CHAR_r L500_CHAR_r_0
|
||||
timestamp 1534323573
|
||||
transform 1 0 0 0 1 162
|
||||
box 0 0 12 18
|
||||
use Library/magic/L500_CHAR_o L500_CHAR_o_0
|
||||
timestamp 1534323159
|
||||
transform 1 0 16 0 1 162
|
||||
box 0 0 12 18
|
||||
use Library/magic/L500_CHAR_5 L500_CHAR_5_0
|
||||
timestamp 1534324893
|
||||
transform 1 0 32 0 1 162
|
||||
box 0 0 12 18
|
||||
use Library/magic/L500_CHAR_o L500_CHAR_o_1
|
||||
timestamp 1534323159
|
||||
transform 1 0 32 0 1 162
|
||||
box 0 0 12 18
|
||||
use Library/magic/L500_CHAR_1 L500_CHAR_1_0
|
||||
timestamp 1534326485
|
||||
transform 1 0 48 0 1 162
|
||||
box 0 0 12 18
|
||||
use Library/magic/L500_CHAR_under L500_CHAR_under_0
|
||||
timestamp 1534325915
|
||||
transform 1 0 64 0 1 162
|
||||
box 0 0 12 4
|
||||
use Library/magic/L500_CHAR_n L500_CHAR_n_0
|
||||
timestamp 1534323117
|
||||
transform 1 0 80 0 1 162
|
||||
box 0 0 12 18
|
||||
use Library/magic/L500_CHAR_a L500_CHAR_a_0
|
||||
timestamp 1534325357
|
||||
transform 1 0 96 0 1 162
|
||||
box 0 0 12 18
|
||||
use Library/magic/L500_CHAR_n L500_CHAR_n_1
|
||||
timestamp 1534323117
|
||||
transform 1 0 112 0 1 162
|
||||
box 0 0 12 18
|
||||
use Library/magic/L500_CHAR_d L500_CHAR_d_0
|
||||
timestamp 1534321738
|
||||
transform 1 0 128 0 1 162
|
||||
box 0 0 12 18
|
||||
use Library/magic/L500_CHAR_3 L500_CHAR_3_0
|
||||
timestamp 1534324785
|
||||
transform 1 0 144 0 1 162
|
||||
box 0 0 12 18
|
||||
use Library/magic/L500_TPAD_blank L500_TPAD_blank_1
|
||||
timestamp 1537343441
|
||||
transform 1 0 -310 0 1 28
|
||||
box 0 0 100 100
|
||||
use Library/magic/L500_SIGNATURE_vdd L500_SIGNATURE_vdd_0
|
||||
timestamp 1538544897
|
||||
transform 1 0 -170 0 1 100
|
||||
box 0 0 52 18
|
||||
use Library/magic/L500_SIGNATURE_gnd L500_SIGNATURE_gnd_0
|
||||
timestamp 1538544897
|
||||
transform 1 0 -200 0 1 38
|
||||
box 0 0 52 18
|
||||
use Library/magic/L500_TPAD_blank L500_TPAD_blank_0
|
||||
timestamp 1537343441
|
||||
transform 1 0 -110 0 1 28
|
||||
box 0 0 100 100
|
||||
use Library/magic/T10_NAND3 T10_NAND3_49
|
||||
timestamp 1533654785
|
||||
transform -1 0 32 0 -1 158
|
||||
box 0 0 32 80
|
||||
use Library/magic/T10_NAND3 T10_NAND3_48
|
||||
timestamp 1533654785
|
||||
transform -1 0 64 0 -1 158
|
||||
box 0 0 32 80
|
||||
use Library/magic/T10_NAND3 T10_NAND3_47
|
||||
timestamp 1533654785
|
||||
transform -1 0 96 0 -1 158
|
||||
box 0 0 32 80
|
||||
use Library/magic/T10_NAND3 T10_NAND3_46
|
||||
timestamp 1533654785
|
||||
transform -1 0 128 0 -1 158
|
||||
box 0 0 32 80
|
||||
use Library/magic/T10_NAND3 T10_NAND3_45
|
||||
timestamp 1533654785
|
||||
transform -1 0 160 0 -1 158
|
||||
box 0 0 32 80
|
||||
use Library/magic/T10_NAND3 T10_NAND3_44
|
||||
timestamp 1533654785
|
||||
transform -1 0 192 0 -1 158
|
||||
box 0 0 32 80
|
||||
use Library/magic/T10_NAND3 T10_NAND3_43
|
||||
timestamp 1533654785
|
||||
transform -1 0 224 0 -1 158
|
||||
box 0 0 32 80
|
||||
use Library/magic/T10_NAND3 T10_NAND3_42
|
||||
timestamp 1533654785
|
||||
transform -1 0 256 0 -1 158
|
||||
box 0 0 32 80
|
||||
use Library/magic/T10_NAND3 T10_NAND3_41
|
||||
timestamp 1533654785
|
||||
transform -1 0 288 0 -1 158
|
||||
box 0 0 32 80
|
||||
use Library/magic/T10_NAND3 T10_NAND3_40
|
||||
timestamp 1533654785
|
||||
transform -1 0 320 0 -1 158
|
||||
box 0 0 32 80
|
||||
use Library/magic/T10_NAND3 T10_NAND3_39
|
||||
timestamp 1533654785
|
||||
transform -1 0 352 0 -1 158
|
||||
box 0 0 32 80
|
||||
use Library/magic/T10_NAND3 T10_NAND3_38
|
||||
timestamp 1533654785
|
||||
transform -1 0 384 0 -1 158
|
||||
box 0 0 32 80
|
||||
use Library/magic/T10_NAND3 T10_NAND3_37
|
||||
timestamp 1533654785
|
||||
transform -1 0 416 0 -1 158
|
||||
box 0 0 32 80
|
||||
use Library/magic/T10_NAND3 T10_NAND3_36
|
||||
timestamp 1533654785
|
||||
transform -1 0 448 0 -1 158
|
||||
box 0 0 32 80
|
||||
use Library/magic/T10_NAND3 T10_NAND3_35
|
||||
timestamp 1533654785
|
||||
transform -1 0 480 0 -1 158
|
||||
box 0 0 32 80
|
||||
use Library/magic/T10_NAND3 T10_NAND3_34
|
||||
timestamp 1533654785
|
||||
transform -1 0 512 0 -1 158
|
||||
box 0 0 32 80
|
||||
use Library/magic/T10_NAND3 T10_NAND3_33
|
||||
timestamp 1533654785
|
||||
transform -1 0 544 0 -1 158
|
||||
box 0 0 32 80
|
||||
use Library/magic/T10_NAND3 T10_NAND3_32
|
||||
timestamp 1533654785
|
||||
transform -1 0 576 0 -1 158
|
||||
box 0 0 32 80
|
||||
use Library/magic/T10_NAND3 T10_NAND3_31
|
||||
timestamp 1533654785
|
||||
transform -1 0 608 0 -1 158
|
||||
box 0 0 32 80
|
||||
use Library/magic/T10_NAND3 T10_NAND3_30
|
||||
timestamp 1533654785
|
||||
transform -1 0 640 0 -1 158
|
||||
box 0 0 32 80
|
||||
use Library/magic/T10_NAND3 T10_NAND3_29
|
||||
timestamp 1533654785
|
||||
transform -1 0 672 0 -1 158
|
||||
box 0 0 32 80
|
||||
use Library/magic/T10_NAND3 T10_NAND3_28
|
||||
timestamp 1533654785
|
||||
transform -1 0 704 0 -1 158
|
||||
box 0 0 32 80
|
||||
use Library/magic/T10_NAND3 T10_NAND3_27
|
||||
timestamp 1533654785
|
||||
transform -1 0 736 0 -1 158
|
||||
box 0 0 32 80
|
||||
use Library/magic/T10_NAND3 T10_NAND3_26
|
||||
timestamp 1533654785
|
||||
transform -1 0 768 0 -1 158
|
||||
box 0 0 32 80
|
||||
use Library/magic/T10_NAND3 T10_NAND3_25
|
||||
timestamp 1533654785
|
||||
transform -1 0 800 0 -1 158
|
||||
box 0 0 32 80
|
||||
use Library/magic/T10_NAND2 T10_NAND2_1
|
||||
timestamp 1533654735
|
||||
transform -1 0 824 0 -1 158
|
||||
box 0 0 24 80
|
||||
use Library/magic/T10_NAND2 T10_NAND2_0
|
||||
timestamp 1533654735
|
||||
transform 1 0 0 0 1 -2
|
||||
box 0 0 24 80
|
||||
use Library/magic/T10_NAND3 T10_NAND3_0
|
||||
timestamp 1533654785
|
||||
transform 1 0 24 0 1 -2
|
||||
box 0 0 32 80
|
||||
use Library/magic/T10_NAND3 T10_NAND3_1
|
||||
timestamp 1533654785
|
||||
transform 1 0 56 0 1 -2
|
||||
box 0 0 32 80
|
||||
use Library/magic/T10_NAND3 T10_NAND3_2
|
||||
timestamp 1533654785
|
||||
transform 1 0 88 0 1 -2
|
||||
box 0 0 32 80
|
||||
use Library/magic/T10_NAND3 T10_NAND3_3
|
||||
timestamp 1533654785
|
||||
transform 1 0 120 0 1 -2
|
||||
box 0 0 32 80
|
||||
use Library/magic/T10_NAND3 T10_NAND3_4
|
||||
timestamp 1533654785
|
||||
transform 1 0 152 0 1 -2
|
||||
box 0 0 32 80
|
||||
use Library/magic/T10_NAND3 T10_NAND3_5
|
||||
timestamp 1533654785
|
||||
transform 1 0 184 0 1 -2
|
||||
box 0 0 32 80
|
||||
use Library/magic/T10_NAND3 T10_NAND3_6
|
||||
timestamp 1533654785
|
||||
transform 1 0 216 0 1 -2
|
||||
box 0 0 32 80
|
||||
use Library/magic/T10_NAND3 T10_NAND3_7
|
||||
timestamp 1533654785
|
||||
transform 1 0 248 0 1 -2
|
||||
box 0 0 32 80
|
||||
use Library/magic/T10_NAND3 T10_NAND3_8
|
||||
timestamp 1533654785
|
||||
transform 1 0 280 0 1 -2
|
||||
box 0 0 32 80
|
||||
use Library/magic/T10_NAND3 T10_NAND3_9
|
||||
timestamp 1533654785
|
||||
transform 1 0 312 0 1 -2
|
||||
box 0 0 32 80
|
||||
use Library/magic/T10_NAND3 T10_NAND3_10
|
||||
timestamp 1533654785
|
||||
transform 1 0 344 0 1 -2
|
||||
box 0 0 32 80
|
||||
use Library/magic/T10_NAND3 T10_NAND3_11
|
||||
timestamp 1533654785
|
||||
transform 1 0 376 0 1 -2
|
||||
box 0 0 32 80
|
||||
use Library/magic/T10_NAND3 T10_NAND3_12
|
||||
timestamp 1533654785
|
||||
transform 1 0 408 0 1 -2
|
||||
box 0 0 32 80
|
||||
use Library/magic/T10_NAND3 T10_NAND3_13
|
||||
timestamp 1533654785
|
||||
transform 1 0 440 0 1 -2
|
||||
box 0 0 32 80
|
||||
use Library/magic/T10_NAND3 T10_NAND3_14
|
||||
timestamp 1533654785
|
||||
transform 1 0 472 0 1 -2
|
||||
box 0 0 32 80
|
||||
use Library/magic/T10_NAND3 T10_NAND3_15
|
||||
timestamp 1533654785
|
||||
transform 1 0 504 0 1 -2
|
||||
box 0 0 32 80
|
||||
use Library/magic/T10_NAND3 T10_NAND3_16
|
||||
timestamp 1533654785
|
||||
transform 1 0 536 0 1 -2
|
||||
box 0 0 32 80
|
||||
use Library/magic/T10_NAND3 T10_NAND3_17
|
||||
timestamp 1533654785
|
||||
transform 1 0 568 0 1 -2
|
||||
box 0 0 32 80
|
||||
use Library/magic/T10_NAND3 T10_NAND3_18
|
||||
timestamp 1533654785
|
||||
transform 1 0 600 0 1 -2
|
||||
box 0 0 32 80
|
||||
use Library/magic/T10_NAND3 T10_NAND3_19
|
||||
timestamp 1533654785
|
||||
transform 1 0 632 0 1 -2
|
||||
box 0 0 32 80
|
||||
use Library/magic/T10_NAND3 T10_NAND3_20
|
||||
timestamp 1533654785
|
||||
transform 1 0 664 0 1 -2
|
||||
box 0 0 32 80
|
||||
use Library/magic/T10_NAND3 T10_NAND3_21
|
||||
timestamp 1533654785
|
||||
transform 1 0 696 0 1 -2
|
||||
box 0 0 32 80
|
||||
use Library/magic/T10_NAND3 T10_NAND3_22
|
||||
timestamp 1533654785
|
||||
transform 1 0 728 0 1 -2
|
||||
box 0 0 32 80
|
||||
use Library/magic/T10_NAND3 T10_NAND3_23
|
||||
timestamp 1533654785
|
||||
transform 1 0 760 0 1 -2
|
||||
box 0 0 32 80
|
||||
use Library/magic/T10_NAND3 T10_NAND3_24
|
||||
timestamp 1533654785
|
||||
transform 1 0 792 0 1 -2
|
||||
box 0 0 32 80
|
||||
use Library/magic/L500_TPAD_blank L500_TPAD_blank_2
|
||||
timestamp 1537343441
|
||||
transform 1 0 826 0 1 28
|
||||
box 0 0 100 100
|
||||
use Library/magic/L500_SIGNATURE_vdd L500_SIGNATURE_vdd_1
|
||||
timestamp 1538544897
|
||||
transform 1 0 936 0 1 100
|
||||
box 0 0 52 18
|
||||
use Library/magic/L500_SIGNATURE_gnd L500_SIGNATURE_gnd_1
|
||||
timestamp 1538544897
|
||||
transform 1 0 964 0 1 38
|
||||
box 0 0 52 18
|
||||
use Library/magic/L500_TPAD_blank L500_TPAD_blank_3
|
||||
timestamp 1537343441
|
||||
transform 1 0 1026 0 1 28
|
||||
box 0 0 100 100
|
||||
<< end >>
|
||||
|
|
@ -0,0 +1,552 @@
|
|||
magic
|
||||
tech scmos
|
||||
timestamp 1538561069
|
||||
<< metal1 >>
|
||||
rect -310 168 0 172
|
||||
rect 824 168 1126 172
|
||||
rect -310 136 -210 168
|
||||
rect 1026 136 1126 168
|
||||
rect -10 88 0 92
|
||||
rect 824 88 826 92
|
||||
rect -10 80 0 84
|
||||
rect 824 80 826 84
|
||||
rect -310 4 -210 36
|
||||
rect 1026 4 1126 36
|
||||
rect -310 0 0 4
|
||||
rect 824 0 1126 4
|
||||
<< metal2 >>
|
||||
rect -6 28 -2 180
|
||||
rect 34 148 38 156
|
||||
rect 66 148 70 156
|
||||
rect 98 148 102 156
|
||||
rect 130 148 134 156
|
||||
rect 162 148 166 156
|
||||
rect 194 148 198 156
|
||||
rect 226 148 230 156
|
||||
rect 258 148 262 156
|
||||
rect 290 148 294 156
|
||||
rect 322 148 326 156
|
||||
rect 354 148 358 156
|
||||
rect 386 148 390 156
|
||||
rect 418 148 422 156
|
||||
rect 450 148 454 156
|
||||
rect 482 148 486 156
|
||||
rect 514 148 518 156
|
||||
rect 546 148 550 156
|
||||
rect 578 148 582 156
|
||||
rect 610 148 614 156
|
||||
rect 642 148 646 156
|
||||
rect 674 148 678 155
|
||||
rect 706 148 710 156
|
||||
rect 738 148 742 156
|
||||
rect 770 148 774 156
|
||||
rect 26 144 38 148
|
||||
rect 58 144 70 148
|
||||
rect 90 144 102 148
|
||||
rect 122 144 134 148
|
||||
rect 154 144 166 148
|
||||
rect 186 144 198 148
|
||||
rect 218 144 230 148
|
||||
rect 250 144 262 148
|
||||
rect 282 144 294 148
|
||||
rect 314 144 326 148
|
||||
rect 346 144 358 148
|
||||
rect 378 144 390 148
|
||||
rect 410 144 422 148
|
||||
rect 442 144 454 148
|
||||
rect 474 144 486 148
|
||||
rect 506 144 518 148
|
||||
rect 538 144 550 148
|
||||
rect 570 144 582 148
|
||||
rect 602 144 614 148
|
||||
rect 634 144 646 148
|
||||
rect 666 144 678 148
|
||||
rect 698 144 710 148
|
||||
rect 730 144 742 148
|
||||
rect 762 144 774 148
|
||||
rect 26 140 30 144
|
||||
rect 58 140 62 144
|
||||
rect 90 140 94 144
|
||||
rect 122 140 126 144
|
||||
rect 154 140 158 144
|
||||
rect 186 140 190 144
|
||||
rect 218 140 222 144
|
||||
rect 250 140 254 144
|
||||
rect 282 140 286 144
|
||||
rect 314 140 318 144
|
||||
rect 346 140 350 144
|
||||
rect 378 140 382 144
|
||||
rect 410 140 414 144
|
||||
rect 442 140 446 144
|
||||
rect 474 140 478 144
|
||||
rect 506 140 510 144
|
||||
rect 538 140 542 144
|
||||
rect 570 140 574 144
|
||||
rect 602 140 606 144
|
||||
rect 634 140 638 144
|
||||
rect 666 140 670 144
|
||||
rect 698 140 702 144
|
||||
rect 730 140 734 144
|
||||
rect 762 140 766 144
|
||||
rect 794 140 798 148
|
||||
rect 10 136 30 140
|
||||
rect 42 136 62 140
|
||||
rect 74 136 94 140
|
||||
rect 106 136 126 140
|
||||
rect 138 136 158 140
|
||||
rect 170 136 190 140
|
||||
rect 202 136 222 140
|
||||
rect 234 136 254 140
|
||||
rect 266 136 286 140
|
||||
rect 298 136 318 140
|
||||
rect 330 136 350 140
|
||||
rect 362 136 382 140
|
||||
rect 394 136 414 140
|
||||
rect 426 136 446 140
|
||||
rect 458 136 478 140
|
||||
rect 490 136 510 140
|
||||
rect 522 136 542 140
|
||||
rect 554 136 574 140
|
||||
rect 586 136 606 140
|
||||
rect 618 136 638 140
|
||||
rect 650 136 670 140
|
||||
rect 682 136 702 140
|
||||
rect 714 136 734 140
|
||||
rect 746 136 766 140
|
||||
rect 778 136 806 140
|
||||
rect 18 128 22 136
|
||||
rect 50 128 54 136
|
||||
rect 82 128 86 136
|
||||
rect 114 128 118 136
|
||||
rect 146 128 150 136
|
||||
rect 178 128 182 136
|
||||
rect 210 128 214 136
|
||||
rect 242 128 246 136
|
||||
rect 274 128 278 136
|
||||
rect 306 128 310 136
|
||||
rect 338 128 342 136
|
||||
rect 370 128 374 136
|
||||
rect 402 128 406 136
|
||||
rect 434 128 438 136
|
||||
rect 466 128 470 136
|
||||
rect 498 128 502 136
|
||||
rect 530 128 534 136
|
||||
rect 562 128 566 136
|
||||
rect 594 128 598 136
|
||||
rect 626 128 630 136
|
||||
rect 658 128 662 136
|
||||
rect 690 128 694 136
|
||||
rect 722 128 726 136
|
||||
rect 754 128 758 136
|
||||
rect 786 128 790 136
|
||||
rect 802 124 806 136
|
||||
rect 810 128 814 180
|
||||
rect 818 124 822 148
|
||||
rect 2 52 6 124
|
||||
rect 802 120 822 124
|
||||
rect 2 48 22 52
|
||||
rect 818 48 822 120
|
||||
rect 10 28 14 44
|
||||
rect 18 32 22 48
|
||||
rect 34 36 38 44
|
||||
rect 66 36 70 44
|
||||
rect 98 36 102 44
|
||||
rect 130 36 134 44
|
||||
rect 162 36 166 44
|
||||
rect 194 36 198 44
|
||||
rect 226 36 230 44
|
||||
rect 258 36 262 44
|
||||
rect 290 36 294 44
|
||||
rect 322 36 326 44
|
||||
rect 354 36 358 44
|
||||
rect 386 36 390 44
|
||||
rect 418 36 422 44
|
||||
rect 450 36 454 44
|
||||
rect 482 36 486 44
|
||||
rect 514 36 518 44
|
||||
rect 546 36 550 44
|
||||
rect 578 36 582 44
|
||||
rect 610 36 614 44
|
||||
rect 642 36 646 44
|
||||
rect 674 36 678 44
|
||||
rect 706 36 710 44
|
||||
rect 738 36 742 44
|
||||
rect 770 36 774 44
|
||||
rect 802 36 806 44
|
||||
rect 26 32 46 36
|
||||
rect 58 32 78 36
|
||||
rect 90 32 110 36
|
||||
rect 122 32 142 36
|
||||
rect 154 32 174 36
|
||||
rect 186 32 206 36
|
||||
rect 218 32 238 36
|
||||
rect 250 32 270 36
|
||||
rect 282 32 302 36
|
||||
rect 314 32 334 36
|
||||
rect 346 32 366 36
|
||||
rect 378 32 398 36
|
||||
rect 410 32 430 36
|
||||
rect 442 32 462 36
|
||||
rect 474 32 494 36
|
||||
rect 506 32 526 36
|
||||
rect 538 32 558 36
|
||||
rect 570 32 590 36
|
||||
rect 602 32 622 36
|
||||
rect 634 32 654 36
|
||||
rect 666 32 686 36
|
||||
rect 698 32 718 36
|
||||
rect 730 32 750 36
|
||||
rect 762 32 782 36
|
||||
rect 794 32 814 36
|
||||
rect 26 28 30 32
|
||||
rect 58 28 62 32
|
||||
rect 90 28 94 32
|
||||
rect 122 28 126 32
|
||||
rect 154 28 158 32
|
||||
rect 186 28 190 32
|
||||
rect 218 28 222 32
|
||||
rect 250 28 254 32
|
||||
rect 282 28 286 32
|
||||
rect 314 28 318 32
|
||||
rect 346 28 350 32
|
||||
rect 378 28 382 32
|
||||
rect 410 28 414 32
|
||||
rect 442 28 446 32
|
||||
rect 474 28 478 32
|
||||
rect 506 28 510 32
|
||||
rect 538 28 542 32
|
||||
rect 570 28 574 32
|
||||
rect 602 28 606 32
|
||||
rect 634 28 638 32
|
||||
rect 666 28 670 32
|
||||
rect 698 28 702 32
|
||||
rect 730 28 734 32
|
||||
rect 762 28 766 32
|
||||
rect 794 28 798 32
|
||||
rect -6 24 6 28
|
||||
rect 10 24 30 28
|
||||
rect 50 24 62 28
|
||||
rect 82 24 94 28
|
||||
rect 114 24 126 28
|
||||
rect 146 24 158 28
|
||||
rect 178 24 190 28
|
||||
rect 210 24 222 28
|
||||
rect 242 24 254 28
|
||||
rect 274 24 286 28
|
||||
rect 306 24 318 28
|
||||
rect 338 24 350 28
|
||||
rect 370 24 382 28
|
||||
rect 402 24 414 28
|
||||
rect 434 24 446 28
|
||||
rect 466 24 478 28
|
||||
rect 498 24 510 28
|
||||
rect 530 24 542 28
|
||||
rect 562 24 574 28
|
||||
rect 594 24 606 28
|
||||
rect 626 24 638 28
|
||||
rect 658 24 670 28
|
||||
rect 690 24 702 28
|
||||
rect 722 24 734 28
|
||||
rect 754 24 766 28
|
||||
rect 786 24 798 28
|
||||
rect 50 16 54 24
|
||||
rect 82 16 86 24
|
||||
rect 114 16 118 24
|
||||
rect 146 16 150 24
|
||||
rect 178 16 182 24
|
||||
rect 210 16 214 24
|
||||
rect 242 16 246 24
|
||||
rect 274 16 278 24
|
||||
rect 306 16 310 24
|
||||
rect 338 16 342 24
|
||||
rect 370 16 374 24
|
||||
rect 402 16 406 24
|
||||
rect 434 16 438 24
|
||||
rect 466 16 470 24
|
||||
rect 498 16 502 24
|
||||
rect 530 16 534 24
|
||||
rect 562 16 566 24
|
||||
rect 594 16 598 24
|
||||
rect 626 16 630 24
|
||||
rect 658 16 662 24
|
||||
rect 690 16 694 24
|
||||
rect 722 16 726 24
|
||||
rect 754 16 758 24
|
||||
rect 786 16 790 24
|
||||
use Library/magic/L500_CHAR_r L500_CHAR_r_0
|
||||
timestamp 1534323573
|
||||
transform 1 0 0 0 1 178
|
||||
box 0 0 12 18
|
||||
use Library/magic/L500_CHAR_o L500_CHAR_o_0
|
||||
timestamp 1534323159
|
||||
transform 1 0 16 0 1 178
|
||||
box 0 0 12 18
|
||||
use Library/magic/L500_CHAR_5 L500_CHAR_5_0
|
||||
timestamp 1534324893
|
||||
transform 1 0 32 0 1 178
|
||||
box 0 0 12 18
|
||||
use Library/magic/L500_CHAR_1 L500_CHAR_1_0
|
||||
timestamp 1534326485
|
||||
transform 1 0 48 0 1 178
|
||||
box 0 0 12 18
|
||||
use Library/magic/L500_CHAR_under L500_CHAR_under_0
|
||||
timestamp 1534325915
|
||||
transform 1 0 64 0 1 178
|
||||
box 0 0 12 4
|
||||
use Library/magic/L500_CHAR_n L500_CHAR_n_0
|
||||
timestamp 1534323117
|
||||
transform 1 0 80 0 1 178
|
||||
box 0 0 12 18
|
||||
use Library/magic/L500_CHAR_o L500_CHAR_o_1
|
||||
timestamp 1534323159
|
||||
transform 1 0 96 0 1 178
|
||||
box 0 0 12 18
|
||||
use Library/magic/L500_CHAR_r L500_CHAR_r_1
|
||||
timestamp 1534323573
|
||||
transform 1 0 112 0 1 178
|
||||
box 0 0 12 18
|
||||
use Library/magic/L500_CHAR_3 L500_CHAR_3_0
|
||||
timestamp 1534324785
|
||||
transform 1 0 128 0 1 178
|
||||
box 0 0 12 18
|
||||
use Library/magic/L500_TPAD_blank L500_TPAD_blank_0
|
||||
timestamp 1537343441
|
||||
transform 1 0 -310 0 1 36
|
||||
box 0 0 100 100
|
||||
use Library/magic/L500_SIGNATURE_vdd L500_SIGNATURE_vdd_0
|
||||
timestamp 1538544897
|
||||
transform 1 0 -172 0 1 108
|
||||
box 0 0 52 18
|
||||
use Library/magic/L500_SIGNATURE_gnd L500_SIGNATURE_gnd_0
|
||||
timestamp 1538544897
|
||||
transform 1 0 -200 0 1 46
|
||||
box 0 0 52 18
|
||||
use Library/magic/L500_TPAD_blank L500_TPAD_blank_1
|
||||
timestamp 1537343441
|
||||
transform 1 0 -110 0 1 36
|
||||
box 0 0 100 100
|
||||
use Library/magic/T11_NOR3 T11_NOR3_49
|
||||
timestamp 1533654861
|
||||
transform -1 0 32 0 -1 174
|
||||
box 0 0 32 88
|
||||
use Library/magic/T11_NOR3 T11_NOR3_48
|
||||
timestamp 1533654861
|
||||
transform -1 0 64 0 -1 174
|
||||
box 0 0 32 88
|
||||
use Library/magic/T11_NOR3 T11_NOR3_47
|
||||
timestamp 1533654861
|
||||
transform -1 0 96 0 -1 174
|
||||
box 0 0 32 88
|
||||
use Library/magic/T11_NOR3 T11_NOR3_46
|
||||
timestamp 1533654861
|
||||
transform -1 0 128 0 -1 174
|
||||
box 0 0 32 88
|
||||
use Library/magic/T11_NOR3 T11_NOR3_45
|
||||
timestamp 1533654861
|
||||
transform -1 0 160 0 -1 174
|
||||
box 0 0 32 88
|
||||
use Library/magic/T11_NOR3 T11_NOR3_44
|
||||
timestamp 1533654861
|
||||
transform -1 0 192 0 -1 174
|
||||
box 0 0 32 88
|
||||
use Library/magic/T11_NOR3 T11_NOR3_43
|
||||
timestamp 1533654861
|
||||
transform -1 0 224 0 -1 174
|
||||
box 0 0 32 88
|
||||
use Library/magic/T11_NOR3 T11_NOR3_42
|
||||
timestamp 1533654861
|
||||
transform -1 0 256 0 -1 174
|
||||
box 0 0 32 88
|
||||
use Library/magic/T11_NOR3 T11_NOR3_41
|
||||
timestamp 1533654861
|
||||
transform -1 0 288 0 -1 174
|
||||
box 0 0 32 88
|
||||
use Library/magic/T11_NOR3 T11_NOR3_40
|
||||
timestamp 1533654861
|
||||
transform -1 0 320 0 -1 174
|
||||
box 0 0 32 88
|
||||
use Library/magic/T11_NOR3 T11_NOR3_39
|
||||
timestamp 1533654861
|
||||
transform -1 0 352 0 -1 174
|
||||
box 0 0 32 88
|
||||
use Library/magic/T11_NOR3 T11_NOR3_38
|
||||
timestamp 1533654861
|
||||
transform -1 0 384 0 -1 174
|
||||
box 0 0 32 88
|
||||
use Library/magic/T11_NOR3 T11_NOR3_37
|
||||
timestamp 1533654861
|
||||
transform -1 0 416 0 -1 174
|
||||
box 0 0 32 88
|
||||
use Library/magic/T11_NOR3 T11_NOR3_36
|
||||
timestamp 1533654861
|
||||
transform -1 0 448 0 -1 174
|
||||
box 0 0 32 88
|
||||
use Library/magic/T11_NOR3 T11_NOR3_35
|
||||
timestamp 1533654861
|
||||
transform -1 0 480 0 -1 174
|
||||
box 0 0 32 88
|
||||
use Library/magic/T11_NOR3 T11_NOR3_34
|
||||
timestamp 1533654861
|
||||
transform -1 0 512 0 -1 174
|
||||
box 0 0 32 88
|
||||
use Library/magic/T11_NOR3 T11_NOR3_33
|
||||
timestamp 1533654861
|
||||
transform -1 0 544 0 -1 174
|
||||
box 0 0 32 88
|
||||
use Library/magic/T11_NOR3 T11_NOR3_32
|
||||
timestamp 1533654861
|
||||
transform -1 0 576 0 -1 174
|
||||
box 0 0 32 88
|
||||
use Library/magic/T11_NOR3 T11_NOR3_31
|
||||
timestamp 1533654861
|
||||
transform -1 0 608 0 -1 174
|
||||
box 0 0 32 88
|
||||
use Library/magic/T11_NOR3 T11_NOR3_30
|
||||
timestamp 1533654861
|
||||
transform -1 0 640 0 -1 174
|
||||
box 0 0 32 88
|
||||
use Library/magic/T11_NOR3 T11_NOR3_29
|
||||
timestamp 1533654861
|
||||
transform -1 0 672 0 -1 174
|
||||
box 0 0 32 88
|
||||
use Library/magic/T11_NOR3 T11_NOR3_28
|
||||
timestamp 1533654861
|
||||
transform -1 0 704 0 -1 174
|
||||
box 0 0 32 88
|
||||
use Library/magic/T11_NOR3 T11_NOR3_27
|
||||
timestamp 1533654861
|
||||
transform -1 0 736 0 -1 174
|
||||
box 0 0 32 88
|
||||
use Library/magic/T11_NOR3 T11_NOR3_26
|
||||
timestamp 1533654861
|
||||
transform -1 0 768 0 -1 174
|
||||
box 0 0 32 88
|
||||
use Library/magic/T11_NOR3 T11_NOR3_25
|
||||
timestamp 1533654861
|
||||
transform -1 0 800 0 -1 174
|
||||
box 0 0 32 88
|
||||
use Library/magic/T11_NOR2 T11_NOR2_1
|
||||
timestamp 1533654819
|
||||
transform -1 0 824 0 -1 174
|
||||
box 0 0 24 88
|
||||
use Library/magic/T11_NOR2 T11_NOR2_0
|
||||
timestamp 1533654819
|
||||
transform 1 0 0 0 1 -2
|
||||
box 0 0 24 88
|
||||
use Library/magic/T11_NOR3 T11_NOR3_0
|
||||
timestamp 1533654861
|
||||
transform 1 0 24 0 1 -2
|
||||
box 0 0 32 88
|
||||
use Library/magic/T11_NOR3 T11_NOR3_1
|
||||
timestamp 1533654861
|
||||
transform 1 0 56 0 1 -2
|
||||
box 0 0 32 88
|
||||
use Library/magic/T11_NOR3 T11_NOR3_2
|
||||
timestamp 1533654861
|
||||
transform 1 0 88 0 1 -2
|
||||
box 0 0 32 88
|
||||
use Library/magic/T11_NOR3 T11_NOR3_3
|
||||
timestamp 1533654861
|
||||
transform 1 0 120 0 1 -2
|
||||
box 0 0 32 88
|
||||
use Library/magic/T11_NOR3 T11_NOR3_4
|
||||
timestamp 1533654861
|
||||
transform 1 0 152 0 1 -2
|
||||
box 0 0 32 88
|
||||
use Library/magic/T11_NOR3 T11_NOR3_5
|
||||
timestamp 1533654861
|
||||
transform 1 0 184 0 1 -2
|
||||
box 0 0 32 88
|
||||
use Library/magic/T11_NOR3 T11_NOR3_6
|
||||
timestamp 1533654861
|
||||
transform 1 0 216 0 1 -2
|
||||
box 0 0 32 88
|
||||
use Library/magic/T11_NOR3 T11_NOR3_7
|
||||
timestamp 1533654861
|
||||
transform 1 0 248 0 1 -2
|
||||
box 0 0 32 88
|
||||
use Library/magic/T11_NOR3 T11_NOR3_8
|
||||
timestamp 1533654861
|
||||
transform 1 0 280 0 1 -2
|
||||
box 0 0 32 88
|
||||
use Library/magic/T11_NOR3 T11_NOR3_9
|
||||
timestamp 1533654861
|
||||
transform 1 0 312 0 1 -2
|
||||
box 0 0 32 88
|
||||
use Library/magic/T11_NOR3 T11_NOR3_10
|
||||
timestamp 1533654861
|
||||
transform 1 0 344 0 1 -2
|
||||
box 0 0 32 88
|
||||
use Library/magic/T11_NOR3 T11_NOR3_11
|
||||
timestamp 1533654861
|
||||
transform 1 0 376 0 1 -2
|
||||
box 0 0 32 88
|
||||
use Library/magic/T11_NOR3 T11_NOR3_12
|
||||
timestamp 1533654861
|
||||
transform 1 0 408 0 1 -2
|
||||
box 0 0 32 88
|
||||
use Library/magic/T11_NOR3 T11_NOR3_13
|
||||
timestamp 1533654861
|
||||
transform 1 0 440 0 1 -2
|
||||
box 0 0 32 88
|
||||
use Library/magic/T11_NOR3 T11_NOR3_14
|
||||
timestamp 1533654861
|
||||
transform 1 0 472 0 1 -2
|
||||
box 0 0 32 88
|
||||
use Library/magic/T11_NOR3 T11_NOR3_15
|
||||
timestamp 1533654861
|
||||
transform 1 0 504 0 1 -2
|
||||
box 0 0 32 88
|
||||
use Library/magic/T11_NOR3 T11_NOR3_16
|
||||
timestamp 1533654861
|
||||
transform 1 0 536 0 1 -2
|
||||
box 0 0 32 88
|
||||
use Library/magic/T11_NOR3 T11_NOR3_17
|
||||
timestamp 1533654861
|
||||
transform 1 0 568 0 1 -2
|
||||
box 0 0 32 88
|
||||
use Library/magic/T11_NOR3 T11_NOR3_18
|
||||
timestamp 1533654861
|
||||
transform 1 0 600 0 1 -2
|
||||
box 0 0 32 88
|
||||
use Library/magic/T11_NOR3 T11_NOR3_19
|
||||
timestamp 1533654861
|
||||
transform 1 0 632 0 1 -2
|
||||
box 0 0 32 88
|
||||
use Library/magic/T11_NOR3 T11_NOR3_20
|
||||
timestamp 1533654861
|
||||
transform 1 0 664 0 1 -2
|
||||
box 0 0 32 88
|
||||
use Library/magic/T11_NOR3 T11_NOR3_21
|
||||
timestamp 1533654861
|
||||
transform 1 0 696 0 1 -2
|
||||
box 0 0 32 88
|
||||
use Library/magic/T11_NOR3 T11_NOR3_22
|
||||
timestamp 1533654861
|
||||
transform 1 0 728 0 1 -2
|
||||
box 0 0 32 88
|
||||
use Library/magic/T11_NOR3 T11_NOR3_23
|
||||
timestamp 1533654861
|
||||
transform 1 0 760 0 1 -2
|
||||
box 0 0 32 88
|
||||
use Library/magic/T11_NOR3 T11_NOR3_24
|
||||
timestamp 1533654861
|
||||
transform 1 0 792 0 1 -2
|
||||
box 0 0 32 88
|
||||
use Library/magic/L500_TPAD_blank L500_TPAD_blank_2
|
||||
timestamp 1537343441
|
||||
transform 1 0 826 0 1 36
|
||||
box 0 0 100 100
|
||||
use Library/magic/L500_SIGNATURE_vdd L500_SIGNATURE_vdd_1
|
||||
timestamp 1538544897
|
||||
transform 1 0 934 0 1 108
|
||||
box 0 0 52 18
|
||||
use Library/magic/L500_SIGNATURE_gnd L500_SIGNATURE_gnd_1
|
||||
timestamp 1538544897
|
||||
transform 1 0 966 0 1 46
|
||||
box 0 0 52 18
|
||||
use Library/magic/L500_TPAD_blank L500_TPAD_blank_3
|
||||
timestamp 1537343441
|
||||
transform 1 0 1026 0 1 36
|
||||
box 0 0 100 100
|
||||
<< end >>
|
||||
|
|
@ -0,0 +1,305 @@
|
|||
magic
|
||||
tech scmos
|
||||
timestamp 1538559977
|
||||
<< metal1 >>
|
||||
rect -310 114 0 118
|
||||
rect 600 114 904 118
|
||||
rect -310 109 -210 114
|
||||
rect 804 109 904 114
|
||||
rect -10 66 0 70
|
||||
rect 600 66 604 70
|
||||
rect -10 48 0 52
|
||||
rect 600 48 604 52
|
||||
rect -310 4 -210 9
|
||||
rect 804 4 904 9
|
||||
rect -310 0 19 4
|
||||
rect 600 0 904 4
|
||||
use Library/magic/L500_CHAR_c L500_CHAR_c_0
|
||||
timestamp 1534321654
|
||||
transform 1 0 0 0 1 122
|
||||
box 0 0 12 18
|
||||
use Library/magic/L500_CHAR_e L500_CHAR_e_0
|
||||
timestamp 1534321786
|
||||
transform 1 0 16 0 1 122
|
||||
box 0 0 12 18
|
||||
use Library/magic/L500_CHAR_l L500_CHAR_l_0
|
||||
timestamp 1534225390
|
||||
transform 1 0 32 0 1 122
|
||||
box 0 0 12 18
|
||||
use Library/magic/L500_CHAR_l L500_CHAR_l_1
|
||||
timestamp 1534225390
|
||||
transform 1 0 48 0 1 122
|
||||
box 0 0 12 18
|
||||
use Library/magic/L500_CHAR_5 L500_CHAR_5_0
|
||||
timestamp 1534324893
|
||||
transform 1 0 64 0 1 122
|
||||
box 0 0 12 18
|
||||
use Library/magic/L500_CHAR_0 L500_CHAR_0_0
|
||||
timestamp 1534325425
|
||||
transform 1 0 80 0 1 122
|
||||
box 0 0 12 18
|
||||
use Library/magic/L500_CHAR_under L500_CHAR_under_0
|
||||
timestamp 1534325915
|
||||
transform 1 0 96 0 1 122
|
||||
box 0 0 12 4
|
||||
use Library/magic/L500_CHAR_f L500_CHAR_f_0
|
||||
timestamp 1534344057
|
||||
transform 1 0 112 0 1 122
|
||||
box 0 0 12 18
|
||||
use Library/magic/L500_CHAR_i L500_CHAR_i_0
|
||||
timestamp 1534226087
|
||||
transform 1 0 128 0 1 122
|
||||
box 0 0 8 18
|
||||
use Library/magic/L500_CHAR_l L500_CHAR_l_2
|
||||
timestamp 1534225390
|
||||
transform 1 0 140 0 1 122
|
||||
box 0 0 12 18
|
||||
use Library/magic/L500_CHAR_l L500_CHAR_l_3
|
||||
timestamp 1534225390
|
||||
transform 1 0 156 0 1 122
|
||||
box 0 0 12 18
|
||||
use Library/magic/L500_CHAR_c L500_CHAR_c_1
|
||||
timestamp 1534321654
|
||||
transform 1 0 172 0 1 122
|
||||
box 0 0 12 18
|
||||
use Library/magic/L500_CHAR_a L500_CHAR_a_0
|
||||
timestamp 1534325357
|
||||
transform 1 0 188 0 1 122
|
||||
box 0 0 12 18
|
||||
use Library/magic/L500_CHAR_p L500_CHAR_p_0
|
||||
timestamp 1534323210
|
||||
transform 1 0 204 0 1 122
|
||||
box 0 0 12 18
|
||||
use Library/magic/L500_TPAD_blank L500_TPAD_blank_1
|
||||
timestamp 1537343441
|
||||
transform 1 0 -310 0 1 9
|
||||
box 0 0 100 100
|
||||
use Library/magic/L500_SIGNATURE_vdd L500_SIGNATURE_vdd_1
|
||||
timestamp 1538544897
|
||||
transform 1 0 -172 0 1 86
|
||||
box 0 0 52 18
|
||||
use Library/magic/L500_SIGNATURE_gnd L500_SIGNATURE_gnd_1
|
||||
timestamp 1538544897
|
||||
transform 1 0 -200 0 1 30
|
||||
box 0 0 52 18
|
||||
use Library/magic/L500_TPAD_blank L500_TPAD_blank_0
|
||||
timestamp 1537343441
|
||||
transform 1 0 -110 0 1 9
|
||||
box 0 0 100 100
|
||||
use Library/magic/T7_FILLCAP T7_FILLCAP_49
|
||||
timestamp 1533654616
|
||||
transform -1 0 24 0 -1 120
|
||||
box 0 0 24 56
|
||||
use Library/magic/T7_FILLCAP T7_FILLCAP_48
|
||||
timestamp 1533654616
|
||||
transform -1 0 48 0 -1 120
|
||||
box 0 0 24 56
|
||||
use Library/magic/T7_FILLCAP T7_FILLCAP_47
|
||||
timestamp 1533654616
|
||||
transform -1 0 72 0 -1 120
|
||||
box 0 0 24 56
|
||||
use Library/magic/T7_FILLCAP T7_FILLCAP_46
|
||||
timestamp 1533654616
|
||||
transform -1 0 96 0 -1 120
|
||||
box 0 0 24 56
|
||||
use Library/magic/T7_FILLCAP T7_FILLCAP_45
|
||||
timestamp 1533654616
|
||||
transform -1 0 120 0 -1 120
|
||||
box 0 0 24 56
|
||||
use Library/magic/T7_FILLCAP T7_FILLCAP_44
|
||||
timestamp 1533654616
|
||||
transform -1 0 144 0 -1 120
|
||||
box 0 0 24 56
|
||||
use Library/magic/T7_FILLCAP T7_FILLCAP_43
|
||||
timestamp 1533654616
|
||||
transform -1 0 168 0 -1 120
|
||||
box 0 0 24 56
|
||||
use Library/magic/T7_FILLCAP T7_FILLCAP_42
|
||||
timestamp 1533654616
|
||||
transform -1 0 192 0 -1 120
|
||||
box 0 0 24 56
|
||||
use Library/magic/T7_FILLCAP T7_FILLCAP_41
|
||||
timestamp 1533654616
|
||||
transform -1 0 216 0 -1 120
|
||||
box 0 0 24 56
|
||||
use Library/magic/T7_FILLCAP T7_FILLCAP_40
|
||||
timestamp 1533654616
|
||||
transform -1 0 240 0 -1 120
|
||||
box 0 0 24 56
|
||||
use Library/magic/T7_FILLCAP T7_FILLCAP_39
|
||||
timestamp 1533654616
|
||||
transform -1 0 264 0 -1 120
|
||||
box 0 0 24 56
|
||||
use Library/magic/T7_FILLCAP T7_FILLCAP_38
|
||||
timestamp 1533654616
|
||||
transform -1 0 288 0 -1 120
|
||||
box 0 0 24 56
|
||||
use Library/magic/T7_FILLCAP T7_FILLCAP_37
|
||||
timestamp 1533654616
|
||||
transform -1 0 312 0 -1 120
|
||||
box 0 0 24 56
|
||||
use Library/magic/T7_FILLCAP T7_FILLCAP_36
|
||||
timestamp 1533654616
|
||||
transform -1 0 336 0 -1 120
|
||||
box 0 0 24 56
|
||||
use Library/magic/T7_FILLCAP T7_FILLCAP_35
|
||||
timestamp 1533654616
|
||||
transform -1 0 360 0 -1 120
|
||||
box 0 0 24 56
|
||||
use Library/magic/T7_FILLCAP T7_FILLCAP_34
|
||||
timestamp 1533654616
|
||||
transform -1 0 384 0 -1 120
|
||||
box 0 0 24 56
|
||||
use Library/magic/T7_FILLCAP T7_FILLCAP_33
|
||||
timestamp 1533654616
|
||||
transform -1 0 408 0 -1 120
|
||||
box 0 0 24 56
|
||||
use Library/magic/T7_FILLCAP T7_FILLCAP_32
|
||||
timestamp 1533654616
|
||||
transform -1 0 432 0 -1 120
|
||||
box 0 0 24 56
|
||||
use Library/magic/T7_FILLCAP T7_FILLCAP_31
|
||||
timestamp 1533654616
|
||||
transform -1 0 456 0 -1 120
|
||||
box 0 0 24 56
|
||||
use Library/magic/T7_FILLCAP T7_FILLCAP_30
|
||||
timestamp 1533654616
|
||||
transform -1 0 480 0 -1 120
|
||||
box 0 0 24 56
|
||||
use Library/magic/T7_FILLCAP T7_FILLCAP_29
|
||||
timestamp 1533654616
|
||||
transform -1 0 504 0 -1 120
|
||||
box 0 0 24 56
|
||||
use Library/magic/T7_FILLCAP T7_FILLCAP_28
|
||||
timestamp 1533654616
|
||||
transform -1 0 528 0 -1 120
|
||||
box 0 0 24 56
|
||||
use Library/magic/T7_FILLCAP T7_FILLCAP_27
|
||||
timestamp 1533654616
|
||||
transform -1 0 552 0 -1 120
|
||||
box 0 0 24 56
|
||||
use Library/magic/T7_FILLCAP T7_FILLCAP_26
|
||||
timestamp 1533654616
|
||||
transform -1 0 576 0 -1 120
|
||||
box 0 0 24 56
|
||||
use Library/magic/T7_FILLCAP T7_FILLCAP_25
|
||||
timestamp 1533654616
|
||||
transform -1 0 600 0 -1 120
|
||||
box 0 0 24 56
|
||||
use Library/magic/T7_FILLCAP T7_FILLCAP_0
|
||||
timestamp 1533654616
|
||||
transform 1 0 0 0 1 -2
|
||||
box 0 0 24 56
|
||||
use Library/magic/T7_FILLCAP T7_FILLCAP_1
|
||||
timestamp 1533654616
|
||||
transform 1 0 24 0 1 -2
|
||||
box 0 0 24 56
|
||||
use Library/magic/T7_FILLCAP T7_FILLCAP_2
|
||||
timestamp 1533654616
|
||||
transform 1 0 48 0 1 -2
|
||||
box 0 0 24 56
|
||||
use Library/magic/T7_FILLCAP T7_FILLCAP_3
|
||||
timestamp 1533654616
|
||||
transform 1 0 72 0 1 -2
|
||||
box 0 0 24 56
|
||||
use Library/magic/T7_FILLCAP T7_FILLCAP_4
|
||||
timestamp 1533654616
|
||||
transform 1 0 96 0 1 -2
|
||||
box 0 0 24 56
|
||||
use Library/magic/T7_FILLCAP T7_FILLCAP_5
|
||||
timestamp 1533654616
|
||||
transform 1 0 120 0 1 -2
|
||||
box 0 0 24 56
|
||||
use Library/magic/T7_FILLCAP T7_FILLCAP_6
|
||||
timestamp 1533654616
|
||||
transform 1 0 144 0 1 -2
|
||||
box 0 0 24 56
|
||||
use Library/magic/T7_FILLCAP T7_FILLCAP_7
|
||||
timestamp 1533654616
|
||||
transform 1 0 168 0 1 -2
|
||||
box 0 0 24 56
|
||||
use Library/magic/T7_FILLCAP T7_FILLCAP_8
|
||||
timestamp 1533654616
|
||||
transform 1 0 192 0 1 -2
|
||||
box 0 0 24 56
|
||||
use Library/magic/T7_FILLCAP T7_FILLCAP_9
|
||||
timestamp 1533654616
|
||||
transform 1 0 216 0 1 -2
|
||||
box 0 0 24 56
|
||||
use Library/magic/T7_FILLCAP T7_FILLCAP_10
|
||||
timestamp 1533654616
|
||||
transform 1 0 240 0 1 -2
|
||||
box 0 0 24 56
|
||||
use Library/magic/T7_FILLCAP T7_FILLCAP_11
|
||||
timestamp 1533654616
|
||||
transform 1 0 264 0 1 -2
|
||||
box 0 0 24 56
|
||||
use Library/magic/T7_FILLCAP T7_FILLCAP_12
|
||||
timestamp 1533654616
|
||||
transform 1 0 288 0 1 -2
|
||||
box 0 0 24 56
|
||||
use Library/magic/T7_FILLCAP T7_FILLCAP_13
|
||||
timestamp 1533654616
|
||||
transform 1 0 312 0 1 -2
|
||||
box 0 0 24 56
|
||||
use Library/magic/T7_FILLCAP T7_FILLCAP_14
|
||||
timestamp 1533654616
|
||||
transform 1 0 336 0 1 -2
|
||||
box 0 0 24 56
|
||||
use Library/magic/T7_FILLCAP T7_FILLCAP_15
|
||||
timestamp 1533654616
|
||||
transform 1 0 360 0 1 -2
|
||||
box 0 0 24 56
|
||||
use Library/magic/T7_FILLCAP T7_FILLCAP_16
|
||||
timestamp 1533654616
|
||||
transform 1 0 384 0 1 -2
|
||||
box 0 0 24 56
|
||||
use Library/magic/T7_FILLCAP T7_FILLCAP_17
|
||||
timestamp 1533654616
|
||||
transform 1 0 408 0 1 -2
|
||||
box 0 0 24 56
|
||||
use Library/magic/T7_FILLCAP T7_FILLCAP_18
|
||||
timestamp 1533654616
|
||||
transform 1 0 432 0 1 -2
|
||||
box 0 0 24 56
|
||||
use Library/magic/T7_FILLCAP T7_FILLCAP_19
|
||||
timestamp 1533654616
|
||||
transform 1 0 456 0 1 -2
|
||||
box 0 0 24 56
|
||||
use Library/magic/T7_FILLCAP T7_FILLCAP_20
|
||||
timestamp 1533654616
|
||||
transform 1 0 480 0 1 -2
|
||||
box 0 0 24 56
|
||||
use Library/magic/T7_FILLCAP T7_FILLCAP_21
|
||||
timestamp 1533654616
|
||||
transform 1 0 504 0 1 -2
|
||||
box 0 0 24 56
|
||||
use Library/magic/T7_FILLCAP T7_FILLCAP_22
|
||||
timestamp 1533654616
|
||||
transform 1 0 528 0 1 -2
|
||||
box 0 0 24 56
|
||||
use Library/magic/T7_FILLCAP T7_FILLCAP_23
|
||||
timestamp 1533654616
|
||||
transform 1 0 552 0 1 -2
|
||||
box 0 0 24 56
|
||||
use Library/magic/T7_FILLCAP T7_FILLCAP_24
|
||||
timestamp 1533654616
|
||||
transform 1 0 576 0 1 -2
|
||||
box 0 0 24 56
|
||||
use Library/magic/L500_TPAD_blank L500_TPAD_blank_2
|
||||
timestamp 1537343441
|
||||
transform 1 0 604 0 1 9
|
||||
box 0 0 100 100
|
||||
use Library/magic/L500_SIGNATURE_gnd L500_SIGNATURE_gnd_0
|
||||
timestamp 1538544897
|
||||
transform 1 0 740 0 1 30
|
||||
box 0 0 52 18
|
||||
use Library/magic/L500_SIGNATURE_vdd L500_SIGNATURE_vdd_0
|
||||
timestamp 1538544897
|
||||
transform 1 0 720 0 1 85
|
||||
box 0 0 52 18
|
||||
use Library/magic/L500_TPAD_blank L500_TPAD_blank_3
|
||||
timestamp 1537343441
|
||||
transform 1 0 804 0 1 9
|
||||
box 0 0 100 100
|
||||
<< end >>
|
||||
|
|
@ -0,0 +1,396 @@
|
|||
magic
|
||||
tech scmos
|
||||
timestamp 1543212938
|
||||
<< metal1 >>
|
||||
rect -310 114 0 118
|
||||
rect 424 114 728 118
|
||||
rect -310 109 -210 114
|
||||
rect 628 109 728 114
|
||||
rect -10 66 0 70
|
||||
rect 424 66 428 70
|
||||
rect -10 48 0 52
|
||||
rect 424 48 428 52
|
||||
rect -310 4 -210 9
|
||||
rect 628 4 728 9
|
||||
rect -310 0 0 4
|
||||
rect 424 0 728 4
|
||||
<< metal2 >>
|
||||
rect -6 28 -2 123
|
||||
rect 410 98 414 126
|
||||
rect 10 86 14 94
|
||||
rect 26 86 30 94
|
||||
rect 42 86 46 94
|
||||
rect 58 86 62 94
|
||||
rect 74 86 78 94
|
||||
rect 90 86 94 94
|
||||
rect 106 86 110 94
|
||||
rect 122 86 126 94
|
||||
rect 138 86 142 94
|
||||
rect 154 86 158 94
|
||||
rect 170 86 174 94
|
||||
rect 186 86 190 94
|
||||
rect 202 86 206 94
|
||||
rect 218 86 222 94
|
||||
rect 234 86 238 94
|
||||
rect 250 86 254 94
|
||||
rect 266 86 270 94
|
||||
rect 282 86 286 94
|
||||
rect 298 86 302 94
|
||||
rect 314 86 318 94
|
||||
rect 330 86 334 94
|
||||
rect 346 86 350 94
|
||||
rect 362 86 366 94
|
||||
rect 378 86 382 94
|
||||
rect 394 90 422 94
|
||||
rect 2 61 6 86
|
||||
rect 10 82 22 86
|
||||
rect 26 82 38 86
|
||||
rect 42 82 54 86
|
||||
rect 58 82 70 86
|
||||
rect 74 82 86 86
|
||||
rect 90 82 102 86
|
||||
rect 106 82 118 86
|
||||
rect 122 82 134 86
|
||||
rect 138 82 150 86
|
||||
rect 154 82 166 86
|
||||
rect 170 82 182 86
|
||||
rect 186 82 198 86
|
||||
rect 202 82 214 86
|
||||
rect 218 82 230 86
|
||||
rect 234 82 246 86
|
||||
rect 250 82 262 86
|
||||
rect 266 82 278 86
|
||||
rect 282 82 294 86
|
||||
rect 298 82 310 86
|
||||
rect 314 82 326 86
|
||||
rect 330 82 342 86
|
||||
rect 346 82 358 86
|
||||
rect 362 82 374 86
|
||||
rect 378 82 390 86
|
||||
rect 2 57 22 61
|
||||
rect -6 24 6 28
|
||||
rect 18 24 22 57
|
||||
rect 34 32 46 36
|
||||
rect 50 32 62 36
|
||||
rect 66 32 78 36
|
||||
rect 82 32 94 36
|
||||
rect 98 32 110 36
|
||||
rect 114 32 126 36
|
||||
rect 130 32 142 36
|
||||
rect 146 32 158 36
|
||||
rect 162 32 174 36
|
||||
rect 178 32 190 36
|
||||
rect 194 32 206 36
|
||||
rect 210 32 222 36
|
||||
rect 226 32 238 36
|
||||
rect 242 32 254 36
|
||||
rect 258 32 270 36
|
||||
rect 274 32 286 36
|
||||
rect 290 32 302 36
|
||||
rect 306 32 318 36
|
||||
rect 322 32 334 36
|
||||
rect 338 32 350 36
|
||||
rect 354 32 366 36
|
||||
rect 370 32 382 36
|
||||
rect 386 32 398 36
|
||||
rect 402 32 414 36
|
||||
rect 418 32 422 90
|
||||
rect 26 20 30 28
|
||||
rect 42 24 46 32
|
||||
rect 58 24 62 32
|
||||
rect 74 24 78 32
|
||||
rect 90 24 94 32
|
||||
rect 106 24 110 32
|
||||
rect 122 24 126 32
|
||||
rect 138 24 142 32
|
||||
rect 154 24 158 32
|
||||
rect 170 24 174 32
|
||||
rect 186 24 190 32
|
||||
rect 202 24 206 32
|
||||
rect 218 24 222 32
|
||||
rect 234 24 238 32
|
||||
rect 250 24 254 32
|
||||
rect 266 24 270 32
|
||||
rect 282 24 286 32
|
||||
rect 298 24 302 32
|
||||
rect 314 24 318 32
|
||||
rect 330 24 334 32
|
||||
rect 346 24 350 32
|
||||
rect 362 24 366 32
|
||||
rect 378 24 382 32
|
||||
rect 394 24 398 32
|
||||
rect 410 24 414 32
|
||||
rect 10 16 30 20
|
||||
use Library/magic/L500_CHAR_r L500_CHAR_r_0
|
||||
timestamp 1534323573
|
||||
transform 1 0 0 0 1 124
|
||||
box 0 0 12 18
|
||||
use Library/magic/L500_CHAR_o L500_CHAR_o_0
|
||||
timestamp 1534323159
|
||||
transform 1 0 16 0 1 124
|
||||
box 0 0 12 18
|
||||
use Library/magic/L500_CHAR_5 L500_CHAR_5_0
|
||||
timestamp 1534324893
|
||||
transform 1 0 32 0 1 124
|
||||
box 0 0 12 18
|
||||
use Library/magic/L500_CHAR_1 L500_CHAR_1_0
|
||||
timestamp 1534326485
|
||||
transform 1 0 48 0 1 124
|
||||
box 0 0 12 18
|
||||
use Library/magic/L500_CHAR_under L500_CHAR_under_0
|
||||
timestamp 1534325915
|
||||
transform 1 0 64 0 1 124
|
||||
box 0 0 12 4
|
||||
use Library/magic/L500_CHAR_i L500_CHAR_i_0
|
||||
timestamp 1534226087
|
||||
transform 1 0 80 0 1 124
|
||||
box 0 0 8 18
|
||||
use Library/magic/L500_CHAR_n L500_CHAR_n_0
|
||||
timestamp 1534323117
|
||||
transform 1 0 92 0 1 124
|
||||
box 0 0 12 18
|
||||
use Library/magic/L500_CHAR_v L500_CHAR_v_0
|
||||
timestamp 1534326655
|
||||
transform 1 0 108 0 1 124
|
||||
box 0 0 12 18
|
||||
use Library/magic/L500_TPAD_blank L500_TPAD_blank_1
|
||||
timestamp 1537343441
|
||||
transform 1 0 -310 0 1 9
|
||||
box 0 0 100 100
|
||||
use Library/magic/L500_SIGNATURE_vdd L500_SIGNATURE_vdd_0
|
||||
timestamp 1538544897
|
||||
transform 1 0 -172 0 1 86
|
||||
box 0 0 52 18
|
||||
use Library/magic/L500_SIGNATURE_gnd L500_SIGNATURE_gnd_0
|
||||
timestamp 1538544897
|
||||
transform 1 0 -200 0 1 30
|
||||
box 0 0 52 18
|
||||
use Library/magic/L500_TPAD_blank L500_TPAD_blank_0
|
||||
timestamp 1537343441
|
||||
transform 1 0 -110 0 1 9
|
||||
box 0 0 100 100
|
||||
use Library/magic/T7_INV T7_INV_49
|
||||
timestamp 1533657739
|
||||
transform -1 0 16 0 -1 120
|
||||
box 0 0 16 56
|
||||
use Library/magic/T7_INV T7_INV_48
|
||||
timestamp 1533657739
|
||||
transform -1 0 32 0 -1 120
|
||||
box 0 0 16 56
|
||||
use Library/magic/T7_INV T7_INV_47
|
||||
timestamp 1533657739
|
||||
transform -1 0 48 0 -1 120
|
||||
box 0 0 16 56
|
||||
use Library/magic/T7_INV T7_INV_46
|
||||
timestamp 1533657739
|
||||
transform -1 0 64 0 -1 120
|
||||
box 0 0 16 56
|
||||
use Library/magic/T7_INV T7_INV_45
|
||||
timestamp 1533657739
|
||||
transform -1 0 80 0 -1 120
|
||||
box 0 0 16 56
|
||||
use Library/magic/T7_INV T7_INV_44
|
||||
timestamp 1533657739
|
||||
transform -1 0 96 0 -1 120
|
||||
box 0 0 16 56
|
||||
use Library/magic/T7_INV T7_INV_43
|
||||
timestamp 1533657739
|
||||
transform -1 0 112 0 -1 120
|
||||
box 0 0 16 56
|
||||
use Library/magic/T7_INV T7_INV_42
|
||||
timestamp 1533657739
|
||||
transform -1 0 128 0 -1 120
|
||||
box 0 0 16 56
|
||||
use Library/magic/T7_INV T7_INV_41
|
||||
timestamp 1533657739
|
||||
transform -1 0 144 0 -1 120
|
||||
box 0 0 16 56
|
||||
use Library/magic/T7_INV T7_INV_40
|
||||
timestamp 1533657739
|
||||
transform -1 0 160 0 -1 120
|
||||
box 0 0 16 56
|
||||
use Library/magic/T7_INV T7_INV_39
|
||||
timestamp 1533657739
|
||||
transform -1 0 176 0 -1 120
|
||||
box 0 0 16 56
|
||||
use Library/magic/T7_INV T7_INV_38
|
||||
timestamp 1533657739
|
||||
transform -1 0 192 0 -1 120
|
||||
box 0 0 16 56
|
||||
use Library/magic/T7_INV T7_INV_37
|
||||
timestamp 1533657739
|
||||
transform -1 0 208 0 -1 120
|
||||
box 0 0 16 56
|
||||
use Library/magic/T7_INV T7_INV_36
|
||||
timestamp 1533657739
|
||||
transform -1 0 224 0 -1 120
|
||||
box 0 0 16 56
|
||||
use Library/magic/T7_INV T7_INV_35
|
||||
timestamp 1533657739
|
||||
transform -1 0 240 0 -1 120
|
||||
box 0 0 16 56
|
||||
use Library/magic/T7_INV T7_INV_34
|
||||
timestamp 1533657739
|
||||
transform -1 0 256 0 -1 120
|
||||
box 0 0 16 56
|
||||
use Library/magic/T7_INV T7_INV_33
|
||||
timestamp 1533657739
|
||||
transform -1 0 272 0 -1 120
|
||||
box 0 0 16 56
|
||||
use Library/magic/T7_INV T7_INV_32
|
||||
timestamp 1533657739
|
||||
transform -1 0 288 0 -1 120
|
||||
box 0 0 16 56
|
||||
use Library/magic/T7_INV T7_INV_31
|
||||
timestamp 1533657739
|
||||
transform -1 0 304 0 -1 120
|
||||
box 0 0 16 56
|
||||
use Library/magic/T7_INV T7_INV_30
|
||||
timestamp 1533657739
|
||||
transform -1 0 320 0 -1 120
|
||||
box 0 0 16 56
|
||||
use Library/magic/T7_INV T7_INV_29
|
||||
timestamp 1533657739
|
||||
transform -1 0 336 0 -1 120
|
||||
box 0 0 16 56
|
||||
use Library/magic/T7_INV T7_INV_28
|
||||
timestamp 1533657739
|
||||
transform -1 0 352 0 -1 120
|
||||
box 0 0 16 56
|
||||
use Library/magic/T7_INV T7_INV_27
|
||||
timestamp 1533657739
|
||||
transform -1 0 368 0 -1 120
|
||||
box 0 0 16 56
|
||||
use Library/magic/T7_INV T7_INV_26
|
||||
timestamp 1533657739
|
||||
transform -1 0 384 0 -1 120
|
||||
box 0 0 16 56
|
||||
use Library/magic/T7_INV T7_INV_25
|
||||
timestamp 1533657739
|
||||
transform -1 0 400 0 -1 120
|
||||
box 0 0 16 56
|
||||
use Library/magic/T7_NAND2 T7_NAND2_1
|
||||
timestamp 1533654698
|
||||
transform -1 0 424 0 -1 120
|
||||
box 0 0 24 56
|
||||
use Library/magic/T7_NAND2 T7_NAND2_0
|
||||
timestamp 1533654698
|
||||
transform 1 0 0 0 1 -2
|
||||
box 0 0 24 56
|
||||
use Library/magic/T7_INV T7_INV_0
|
||||
timestamp 1533657739
|
||||
transform 1 0 24 0 1 -2
|
||||
box 0 0 16 56
|
||||
use Library/magic/T7_INV T7_INV_1
|
||||
timestamp 1533657739
|
||||
transform 1 0 40 0 1 -2
|
||||
box 0 0 16 56
|
||||
use Library/magic/T7_INV T7_INV_2
|
||||
timestamp 1533657739
|
||||
transform 1 0 56 0 1 -2
|
||||
box 0 0 16 56
|
||||
use Library/magic/T7_INV T7_INV_3
|
||||
timestamp 1533657739
|
||||
transform 1 0 72 0 1 -2
|
||||
box 0 0 16 56
|
||||
use Library/magic/T7_INV T7_INV_4
|
||||
timestamp 1533657739
|
||||
transform 1 0 88 0 1 -2
|
||||
box 0 0 16 56
|
||||
use Library/magic/T7_INV T7_INV_5
|
||||
timestamp 1533657739
|
||||
transform 1 0 104 0 1 -2
|
||||
box 0 0 16 56
|
||||
use Library/magic/T7_INV T7_INV_6
|
||||
timestamp 1533657739
|
||||
transform 1 0 120 0 1 -2
|
||||
box 0 0 16 56
|
||||
use Library/magic/T7_INV T7_INV_7
|
||||
timestamp 1533657739
|
||||
transform 1 0 136 0 1 -2
|
||||
box 0 0 16 56
|
||||
use Library/magic/T7_INV T7_INV_8
|
||||
timestamp 1533657739
|
||||
transform 1 0 152 0 1 -2
|
||||
box 0 0 16 56
|
||||
use Library/magic/T7_INV T7_INV_9
|
||||
timestamp 1533657739
|
||||
transform 1 0 168 0 1 -2
|
||||
box 0 0 16 56
|
||||
use Library/magic/T7_INV T7_INV_10
|
||||
timestamp 1533657739
|
||||
transform 1 0 184 0 1 -2
|
||||
box 0 0 16 56
|
||||
use Library/magic/T7_INV T7_INV_11
|
||||
timestamp 1533657739
|
||||
transform 1 0 200 0 1 -2
|
||||
box 0 0 16 56
|
||||
use Library/magic/T7_INV T7_INV_12
|
||||
timestamp 1533657739
|
||||
transform 1 0 216 0 1 -2
|
||||
box 0 0 16 56
|
||||
use Library/magic/T7_INV T7_INV_13
|
||||
timestamp 1533657739
|
||||
transform 1 0 232 0 1 -2
|
||||
box 0 0 16 56
|
||||
use Library/magic/T7_INV T7_INV_14
|
||||
timestamp 1533657739
|
||||
transform 1 0 248 0 1 -2
|
||||
box 0 0 16 56
|
||||
use Library/magic/T7_INV T7_INV_15
|
||||
timestamp 1533657739
|
||||
transform 1 0 264 0 1 -2
|
||||
box 0 0 16 56
|
||||
use Library/magic/T7_INV T7_INV_16
|
||||
timestamp 1533657739
|
||||
transform 1 0 280 0 1 -2
|
||||
box 0 0 16 56
|
||||
use Library/magic/T7_INV T7_INV_17
|
||||
timestamp 1533657739
|
||||
transform 1 0 296 0 1 -2
|
||||
box 0 0 16 56
|
||||
use Library/magic/T7_INV T7_INV_18
|
||||
timestamp 1533657739
|
||||
transform 1 0 312 0 1 -2
|
||||
box 0 0 16 56
|
||||
use Library/magic/T7_INV T7_INV_19
|
||||
timestamp 1533657739
|
||||
transform 1 0 328 0 1 -2
|
||||
box 0 0 16 56
|
||||
use Library/magic/T7_INV T7_INV_20
|
||||
timestamp 1533657739
|
||||
transform 1 0 344 0 1 -2
|
||||
box 0 0 16 56
|
||||
use Library/magic/T7_INV T7_INV_21
|
||||
timestamp 1533657739
|
||||
transform 1 0 360 0 1 -2
|
||||
box 0 0 16 56
|
||||
use Library/magic/T7_INV T7_INV_22
|
||||
timestamp 1533657739
|
||||
transform 1 0 376 0 1 -2
|
||||
box 0 0 16 56
|
||||
use Library/magic/T7_INV T7_INV_23
|
||||
timestamp 1533657739
|
||||
transform 1 0 392 0 1 -2
|
||||
box 0 0 16 56
|
||||
use Library/magic/T7_INV T7_INV_24
|
||||
timestamp 1533657739
|
||||
transform 1 0 408 0 1 -2
|
||||
box 0 0 16 56
|
||||
use Library/magic/L500_TPAD_blank L500_TPAD_blank_2
|
||||
timestamp 1537343441
|
||||
transform 1 0 428 0 1 9
|
||||
box 0 0 100 100
|
||||
use Library/magic/L500_SIGNATURE_vdd L500_SIGNATURE_vdd_1
|
||||
timestamp 1538544897
|
||||
transform 1 0 540 0 1 86
|
||||
box 0 0 52 18
|
||||
use Library/magic/L500_SIGNATURE_gnd L500_SIGNATURE_gnd_1
|
||||
timestamp 1538544897
|
||||
transform 1 0 569 0 1 30
|
||||
box 0 0 52 18
|
||||
use Library/magic/L500_TPAD_blank L500_TPAD_blank_3
|
||||
timestamp 1537343441
|
||||
transform 1 0 628 0 1 9
|
||||
box 0 0 100 100
|
||||
<< end >>
|
||||
|
|
@ -0,0 +1,28 @@
|
|||
magic
|
||||
tech scmos
|
||||
timestamp 1541350492
|
||||
use Library/magic/L500_POLYSI_NWELL_capacitance L500_POLYSI_NWELL_capacitance_0
|
||||
timestamp 1541350492
|
||||
transform 1 0 0 0 1 1750
|
||||
box 0 0 300 322
|
||||
use Library/magic/L500_POLYSI_PWELL_capacitance L500_POLYSI_PWELL_capacitance_0
|
||||
timestamp 1541350492
|
||||
transform 1 0 350 0 1 1400
|
||||
box 0 0 300 322
|
||||
use Library/magic/L500_METAL3_METAL2_capacitance L500_METAL3_METAL2_capacitance_0
|
||||
timestamp 1541350492
|
||||
transform 1 0 700 0 1 1050
|
||||
box 0 0 300 322
|
||||
use Library/magic/L500_METAL2_METAL1_capacitance L500_METAL2_METAL1_capacitance_0
|
||||
timestamp 1541350492
|
||||
transform 1 0 1050 0 1 700
|
||||
box 0 0 300 322
|
||||
use Library/magic/L500_METAL1_PWELL_capacitance L500_METAL1_PWELL_capacitance_0
|
||||
timestamp 1541350492
|
||||
transform 1 0 1400 0 1 350
|
||||
box 0 0 300 322
|
||||
use Library/magic/L500_METAL1_NWELL_capacitance L500_METAL1_NWELL_capacitance_0
|
||||
timestamp 1541350492
|
||||
transform 1 0 1750 0 1 0
|
||||
box 0 0 300 322
|
||||
<< end >>
|
||||
|
|
@ -0,0 +1,260 @@
|
|||
magic
|
||||
tech scmos
|
||||
timestamp 1541112713
|
||||
<< error_s >>
|
||||
rect 1165 1416 1187 1421
|
||||
rect 1170 1409 1171 1416
|
||||
rect 1182 1409 1187 1416
|
||||
rect 1170 1408 1187 1409
|
||||
rect 450 723 460 725
|
||||
rect 458 698 460 723
|
||||
rect 453 692 454 697
|
||||
rect 458 696 520 698
|
||||
rect 524 696 526 700
|
||||
rect 454 691 459 692
|
||||
<< pwell >>
|
||||
rect 1162 1400 1190 1492
|
||||
<< polysilicon >>
|
||||
rect 804 1055 808 1059
|
||||
rect 804 1046 808 1051
|
||||
rect 808 1042 818 1046
|
||||
rect 822 1042 826 1046
|
||||
<< ndiffusion >>
|
||||
rect 1174 1464 1178 1468
|
||||
rect 1174 1456 1178 1460
|
||||
rect 1174 1440 1178 1452
|
||||
rect 1174 1432 1178 1436
|
||||
<< metal1 >>
|
||||
rect 1150 1468 1174 1472
|
||||
rect 1174 1464 1178 1468
|
||||
rect 1154 1452 1174 1456
|
||||
rect 1154 1396 1158 1452
|
||||
rect 1174 1448 1178 1452
|
||||
rect 1129 1392 1158 1396
|
||||
rect 1162 1444 1178 1448
|
||||
rect 1129 1350 1133 1392
|
||||
rect 1162 1387 1166 1444
|
||||
rect 1174 1432 1178 1436
|
||||
rect 1174 1416 1178 1428
|
||||
rect 1182 1410 1200 1414
|
||||
rect 1154 1383 1166 1387
|
||||
rect 1154 1131 1158 1383
|
||||
rect 1150 1127 1158 1131
|
||||
rect 800 1059 804 1063
|
||||
rect 804 1055 808 1059
|
||||
rect 856 1046 860 1050
|
||||
rect 783 1042 804 1046
|
||||
rect 822 1042 826 1046
|
||||
rect 830 1042 860 1046
|
||||
rect 783 1000 787 1042
|
||||
rect 804 783 808 1042
|
||||
rect 800 779 808 783
|
||||
rect 78 342 104 346
|
||||
rect 78 300 82 342
|
||||
rect 104 56 108 342
|
||||
rect 100 52 108 56
|
||||
<< metal2 >>
|
||||
rect 421 692 454 696
|
||||
rect 421 650 425 692
|
||||
rect 454 442 458 692
|
||||
rect 450 438 458 442
|
||||
rect 100 361 108 365
|
||||
rect 104 346 108 361
|
||||
rect 170 346 174 350
|
||||
rect 108 342 174 346
|
||||
<< metal3 >>
|
||||
rect 450 719 458 723
|
||||
rect 454 696 458 719
|
||||
rect 520 696 524 700
|
||||
rect 458 692 524 696
|
||||
<< polycontact >>
|
||||
rect 804 1059 808 1063
|
||||
rect 804 1051 808 1055
|
||||
rect 804 1042 808 1046
|
||||
rect 818 1042 822 1046
|
||||
rect 826 1042 830 1046
|
||||
<< ndcontact >>
|
||||
rect 1174 1468 1178 1472
|
||||
rect 1174 1460 1178 1464
|
||||
rect 1174 1452 1178 1456
|
||||
rect 1174 1436 1178 1440
|
||||
rect 1174 1428 1178 1432
|
||||
<< pdcontact >>
|
||||
rect 1170 1408 1182 1416
|
||||
<< m2contact >>
|
||||
rect 104 342 108 346
|
||||
<< m3contact >>
|
||||
rect 454 692 458 696
|
||||
use L500_CHAR_plus L500_CHAR_plus_0 ../../Library/magic
|
||||
timestamp 1534325833
|
||||
transform 1 0 1095 0 1 1498
|
||||
box 0 4 12 16
|
||||
use L500_CHAR_minus L500_CHAR_minus_0 ../../Library/magic
|
||||
timestamp 1534325869
|
||||
transform 1 0 1244 0 1 1495
|
||||
box 0 8 12 12
|
||||
use L500_TPAD_blank L500_TPAD_blank_8 ../../Library/magic
|
||||
timestamp 1537343441
|
||||
transform 1 0 1050 0 1 1400
|
||||
box 0 0 100 100
|
||||
use L500_CHAR_n L500_CHAR_n_0 ../../Library/magic
|
||||
timestamp 1534323117
|
||||
transform 1 0 1153 0 1 1480
|
||||
box 0 0 12 18
|
||||
use L500_CHAR_d L500_CHAR_d_0 ../../Library/magic
|
||||
timestamp 1534321738
|
||||
transform 1 0 1168 0 1 1480
|
||||
box 0 0 12 18
|
||||
use L500_TPAD_blank L500_TPAD_blank_9
|
||||
timestamp 1537343441
|
||||
transform 1 0 1200 0 1 1400
|
||||
box 0 0 100 100
|
||||
use L500_CHAR_m L500_CHAR_m_9 ../../Library/magic
|
||||
timestamp 1534323034
|
||||
transform 1 0 1070 0 1 1353
|
||||
box 0 0 16 18
|
||||
use L500_CHAR_1 L500_CHAR_1_5 ../../Library/magic
|
||||
timestamp 1534326485
|
||||
transform 1 0 1089 0 1 1353
|
||||
box 0 0 12 18
|
||||
use L500_TPAD_blank L500_TPAD_blank_10
|
||||
timestamp 1537343441
|
||||
transform 1 0 1050 0 1 1250
|
||||
box 0 0 100 100
|
||||
use L500_CHAR_m L500_CHAR_m_8
|
||||
timestamp 1534323034
|
||||
transform 1 0 1078 0 1 1152
|
||||
box 0 0 16 18
|
||||
use L500_CHAR_1 L500_CHAR_1_4
|
||||
timestamp 1534326485
|
||||
transform 1 0 1096 0 1 1152
|
||||
box 0 0 12 18
|
||||
use L500_TPAD_blank L500_TPAD_blank_11
|
||||
timestamp 1537343441
|
||||
transform 1 0 700 0 1 1050
|
||||
box 0 0 100 100
|
||||
use L500_CHAR_p L500_CHAR_p_0 ../../Library/magic
|
||||
timestamp 1534323210
|
||||
transform 1 0 803 0 1 1096
|
||||
box 0 0 12 18
|
||||
use L500_CHAR_o L500_CHAR_o_0 ../../Library/magic
|
||||
timestamp 1534323159
|
||||
transform 1 0 817 0 1 1096
|
||||
box 0 0 12 18
|
||||
use L500_CHAR_l L500_CHAR_l_0 ../../Library/magic
|
||||
timestamp 1534225390
|
||||
transform 1 0 831 0 1 1096
|
||||
box 0 0 12 18
|
||||
use L500_TPAD_blank L500_TPAD_blank_12
|
||||
timestamp 1537343441
|
||||
transform 1 0 850 0 1 1050
|
||||
box 0 0 100 100
|
||||
use L500_TPAD_blank L500_TPAD_blank_13
|
||||
timestamp 1537343441
|
||||
transform 1 0 1050 0 1 1050
|
||||
box 0 0 100 100
|
||||
use L500_CHAR_m L500_CHAR_m_7
|
||||
timestamp 1534323034
|
||||
transform 1 0 720 0 1 1003
|
||||
box 0 0 16 18
|
||||
use L500_CHAR_1 L500_CHAR_1_3
|
||||
timestamp 1534326485
|
||||
transform 1 0 739 0 1 1003
|
||||
box 0 0 12 18
|
||||
use L500_TPAD_blank L500_TPAD_blank_14
|
||||
timestamp 1537343441
|
||||
transform 1 0 700 0 1 900
|
||||
box 0 0 100 100
|
||||
use L500_CHAR_m L500_CHAR_m_6
|
||||
timestamp 1534323034
|
||||
transform 1 0 716 0 1 803
|
||||
box 0 0 16 18
|
||||
use L500_CHAR_1 L500_CHAR_1_2
|
||||
timestamp 1534326485
|
||||
transform 1 0 734 0 1 803
|
||||
box 0 0 12 18
|
||||
use L500_TPAD_blank L500_TPAD_blank_4
|
||||
timestamp 1537343441
|
||||
transform 1 0 350 0 1 700
|
||||
box 0 0 100 100
|
||||
use L500_CHAR_m L500_CHAR_m_5
|
||||
timestamp 1534323034
|
||||
transform 1 0 461 0 1 750
|
||||
box 0 0 16 18
|
||||
use L500_CHAR_3 L500_CHAR_3_0 ../../Library/magic
|
||||
timestamp 1534324785
|
||||
transform 1 0 479 0 1 750
|
||||
box 0 0 12 18
|
||||
use L500_TPAD_blank L500_TPAD_blank_5
|
||||
timestamp 1537343441
|
||||
transform 1 0 500 0 1 700
|
||||
box 0 0 100 100
|
||||
use L500_TPAD_blank L500_TPAD_blank_15
|
||||
timestamp 1537343441
|
||||
transform 1 0 700 0 1 700
|
||||
box 0 0 100 100
|
||||
use L500_CHAR_m L500_CHAR_m_4
|
||||
timestamp 1534323034
|
||||
transform 1 0 365 0 1 653
|
||||
box 0 0 16 18
|
||||
use L500_CHAR_2 L500_CHAR_2_2 ../../Library/magic
|
||||
timestamp 1534324708
|
||||
transform 1 0 383 0 1 653
|
||||
box 0 0 12 18
|
||||
use L500_TPAD_blank L500_TPAD_blank_6
|
||||
timestamp 1537343441
|
||||
transform 1 0 350 0 1 550
|
||||
box 0 0 100 100
|
||||
use L500_CHAR_m L500_CHAR_m_3
|
||||
timestamp 1534323034
|
||||
transform 1 0 366 0 1 452
|
||||
box 0 0 16 18
|
||||
use L500_CHAR_2 L500_CHAR_2_1
|
||||
timestamp 1534324708
|
||||
transform 1 0 386 0 1 452
|
||||
box 0 0 12 18
|
||||
use L500_TPAD_blank L500_TPAD_blank_2
|
||||
timestamp 1537343441
|
||||
transform 1 0 0 0 1 350
|
||||
box 0 0 100 100
|
||||
use L500_CHAR_m L500_CHAR_m_2
|
||||
timestamp 1534323034
|
||||
transform 1 0 103 0 1 394
|
||||
box 0 0 16 18
|
||||
use L500_CHAR_2 L500_CHAR_2_0
|
||||
timestamp 1534324708
|
||||
transform 1 0 120 0 1 394
|
||||
box 0 0 12 18
|
||||
use L500_TPAD_blank L500_TPAD_blank_3
|
||||
timestamp 1537343441
|
||||
transform 1 0 150 0 1 350
|
||||
box 0 0 100 100
|
||||
use L500_TPAD_blank L500_TPAD_blank_7
|
||||
timestamp 1537343441
|
||||
transform 1 0 350 0 1 350
|
||||
box 0 0 100 100
|
||||
use L500_CHAR_m L500_CHAR_m_1
|
||||
timestamp 1534323034
|
||||
transform 1 0 26 0 1 303
|
||||
box 0 0 16 18
|
||||
use L500_CHAR_1 L500_CHAR_1_1
|
||||
timestamp 1534326485
|
||||
transform 1 0 44 0 1 303
|
||||
box 0 0 12 18
|
||||
use L500_TPAD_blank L500_TPAD_blank_1
|
||||
timestamp 1537343441
|
||||
transform 1 0 0 0 1 200
|
||||
box 0 0 100 100
|
||||
use L500_CHAR_m L500_CHAR_m_0
|
||||
timestamp 1534323034
|
||||
transform 1 0 16 0 1 104
|
||||
box 0 0 16 18
|
||||
use L500_CHAR_1 L500_CHAR_1_0
|
||||
timestamp 1534326485
|
||||
transform 1 0 34 0 1 104
|
||||
box 0 0 12 18
|
||||
use L500_TPAD_blank L500_TPAD_blank_0
|
||||
timestamp 1537343441
|
||||
transform 1 0 0 0 1 0
|
||||
box 0 0 100 100
|
||||
<< end >>
|
||||
|
|
@ -0,0 +1,24 @@
|
|||
magic
|
||||
tech scmos
|
||||
timestamp 1541743916
|
||||
use Library/magic/L500_PDCONTACT_Wmin_resistance L500_PDCONTACT_Wmin_resistance_0
|
||||
timestamp 1541743916
|
||||
transform 1 0 0 0 1 1400
|
||||
box 0 0 312 300
|
||||
use Library/magic/L500_NDCONTACT_Wmin_resistance L500_NDCONTACT_Wmin_resistance_0
|
||||
timestamp 1541739059
|
||||
transform 1 0 0 0 1 1050
|
||||
box 0 0 312 300
|
||||
use Library/magic/L500_CONTACT_Wmin_resistance L500_CONTACT_Wmin_resistance_0
|
||||
timestamp 1541642145
|
||||
transform 1 0 0 0 1 700
|
||||
box 0 0 300 300
|
||||
use Library/magic/L500_VIA_Wmin_resistance L500_VIA_Wmin_resistance_0
|
||||
timestamp 1541639931
|
||||
transform 1 0 0 0 1 350
|
||||
box 0 0 300 300
|
||||
use Library/magic/L500_VIA2_Wmin_resistance L500_VIA2_Wmin_resistance_0
|
||||
timestamp 1541639931
|
||||
transform 1 0 0 0 1 0
|
||||
box 0 0 300 300
|
||||
<< end >>
|
||||
|
|
@ -0,0 +1,109 @@
|
|||
magic
|
||||
tech scmos
|
||||
timestamp 1542633954
|
||||
<< error_s >>
|
||||
rect 3500 1958 3504 1971
|
||||
rect 3508 1966 3512 1971
|
||||
rect 3588 1966 3592 1971
|
||||
rect 3596 1958 3600 1971
|
||||
rect 3700 1958 3704 1971
|
||||
rect 3708 1966 3712 1971
|
||||
rect 3788 1966 3792 1971
|
||||
rect 3796 1958 3800 1971
|
||||
use Library/magic/L500_ZENER_W40_L1 L500_ZENER_W40_L1_0
|
||||
timestamp 1542633243
|
||||
transform 1 0 2100 0 1 2100
|
||||
box 0 0 304 300
|
||||
use Library/magic/L500_ZENER_W40_L2 L500_ZENER_W40_L2_0
|
||||
timestamp 1542633243
|
||||
transform 1 0 2450 0 1 2100
|
||||
box 0 0 304 300
|
||||
use Library/magic/L500_ZENER_W40_L3 L500_ZENER_W40_L3_0
|
||||
timestamp 1542633243
|
||||
transform 1 0 2800 0 1 2100
|
||||
box 0 0 304 300
|
||||
use Library/magic/L500_ZENER_W40_L4 L500_ZENER_W40_L4_0
|
||||
timestamp 1542632804
|
||||
transform 1 0 3150 0 1 2100
|
||||
box 0 0 304 300
|
||||
use Library/magic/L500_ZENER_W40_L5 L500_ZENER_W40_L5_0
|
||||
timestamp 1542632804
|
||||
transform 1 0 3500 0 1 2100
|
||||
box 0 0 304 300
|
||||
use Library/magic/L500_DIODE_PBASE_A10k_params L500_DIODE_PBASE_A10k_params_0
|
||||
timestamp 1541995960
|
||||
transform 1 0 3850 0 1 2078
|
||||
box 0 0 301 322
|
||||
use Library/magic/L500_ZENER_W20_L1 L500_ZENER_W20_L1_0
|
||||
timestamp 1540544127
|
||||
transform 1 0 1750 0 1 1750
|
||||
box 0 0 304 300
|
||||
use Library/magic/L500_ZENER_W20_L2 L500_ZENER_W20_L2_0
|
||||
timestamp 1540543980
|
||||
transform 1 0 2100 0 1 1750
|
||||
box 0 0 304 300
|
||||
use Library/magic/L500_ZENER_W20_L3 L500_ZENER_W20_L3_0
|
||||
timestamp 1540543901
|
||||
transform 1 0 2450 0 1 1750
|
||||
box 0 0 304 300
|
||||
use Library/magic/L500_ZENER_W20_L4 L500_ZENER_W20_L4_0
|
||||
timestamp 1542633243
|
||||
transform 1 0 2800 0 1 1750
|
||||
box 0 0 304 300
|
||||
use Library/magic/L500_ZENER_W20_L5 L500_ZENER_W20_L5_0
|
||||
timestamp 1540543671
|
||||
transform 1 0 3150 0 1 1750
|
||||
box 0 0 304 300
|
||||
use Library/magic/L500_DIODE_PBASE_A2k_params L500_DIODE_PBASE_A2k_params_0
|
||||
timestamp 1541945167
|
||||
transform 1 0 3500 0 1 1750
|
||||
box 0 0 300 322
|
||||
use Library/magic/L500_ZENER_W10_L5 L500_ZENER_W10_L5_0
|
||||
timestamp 1540543606
|
||||
transform 1 0 1400 0 1 1400
|
||||
box 0 0 304 300
|
||||
use Library/magic/L500_ZENER_W5_L5 L500_ZENER_W5_L5_0
|
||||
timestamp 1540544708
|
||||
transform 1 0 1750 0 1 1400
|
||||
box 0 0 300 300
|
||||
use Library/magic/L500_DIODE_SUBSTRATE_A1k_params L500_DIODE_SUBSTRATE_A1k_params_0
|
||||
timestamp 1541215827
|
||||
transform 1 0 2450 0 1 1400
|
||||
box 0 0 300 322
|
||||
use Library/magic/L500_ZENER_W10_L4 L500_ZENER_W10_L4_0
|
||||
timestamp 1542632071
|
||||
transform 1 0 1050 0 1 1050
|
||||
box 0 0 304 300
|
||||
use Library/magic/L500_ZENER_W5_L4 L500_ZENER_W5_L4_0
|
||||
timestamp 1542632071
|
||||
transform 1 0 1400 0 1 1050
|
||||
box 0 0 300 300
|
||||
use Library/magic/L500_DIODE_SUBSTRATE_A10k_params L500_DIODE_SUBSTRATE_A10k_params_0
|
||||
timestamp 1541224905
|
||||
transform 1 0 2450 0 1 1050
|
||||
box 0 0 301 322
|
||||
use Library/magic/L500_ZENER_W10_L3 L500_ZENER_W10_L3_0
|
||||
timestamp 1540543464
|
||||
transform 1 0 700 0 1 700
|
||||
box 0 0 304 300
|
||||
use Library/magic/L500_ZENER_W5_L3 L500_ZENER_W5_L3_0
|
||||
timestamp 1540544786
|
||||
transform 1 0 1050 0 1 700
|
||||
box 0 0 300 300
|
||||
use Library/magic/L500_ZENER_W10_L2 L500_ZENER_W10_L2_0
|
||||
timestamp 1540542704
|
||||
transform 1 0 350 0 1 350
|
||||
box 0 0 304 300
|
||||
use Library/magic/L500_ZENER_W5_L2 L500_ZENER_W5_L2_0
|
||||
timestamp 1540544905
|
||||
transform 1 0 700 0 1 350
|
||||
box 0 0 300 300
|
||||
use Library/magic/L500_ZENER_W10_L1 L500_ZENER_W10_L1_0
|
||||
timestamp 1540539143
|
||||
transform 1 0 0 0 1 0
|
||||
box 0 0 304 300
|
||||
use Library/magic/L500_ZENER_W5_L1 L500_ZENER_W5_L1_0
|
||||
timestamp 1540544919
|
||||
transform 1 0 350 0 1 0
|
||||
box 0 0 300 300
|
||||
<< end >>
|
||||
|
|
@ -0,0 +1,12 @@
|
|||
magic
|
||||
tech scmos
|
||||
timestamp 1541045395
|
||||
use L500_HVPFET_W108_L22_params L500_HVPFET_W108_L22_params_0 ../../Library/magic
|
||||
timestamp 1541002503
|
||||
transform 1 0 0 0 1 0
|
||||
box 0 0 300 300
|
||||
use L500_HVNFET_W108_L22_params L500_HVNFET_W108_L22_params_0 ../../Library/magic
|
||||
timestamp 1541038230
|
||||
transform 1 0 350 0 1 0
|
||||
box 0 0 300 300
|
||||
<< end >>
|
||||
|
|
@ -0,0 +1,40 @@
|
|||
magic
|
||||
tech scmos
|
||||
timestamp 1542634341
|
||||
use Library/magic/L500_NMOSi_W40_L40_params L500_NMOSi_W40_L40_params_0
|
||||
timestamp 1542441308
|
||||
transform 1 0 0 0 1 1400
|
||||
box 0 0 300 300
|
||||
use Library/magic/L500_NMOSi_W3_L3_params L500_NMOSi_W3_L3_params_0
|
||||
timestamp 1542623529
|
||||
transform 1 0 350 0 1 1400
|
||||
box 0 0 300 300
|
||||
use Library/magic/L500_NMOSi_W3_L8_params L500_NMOSi_W3_L8_params_0
|
||||
timestamp 1542624007
|
||||
transform 1 0 700 0 1 1400
|
||||
box 0 0 300 300
|
||||
use Library/magic/L500_NMOSi_W20_L20_params L500_NMOSi_W20_L20_params_0
|
||||
timestamp 1542441116
|
||||
transform 1 0 0 0 1 1050
|
||||
box 0 0 300 300
|
||||
use Library/magic/L500_NMOSi_W8_L3_params L500_NMOSi_W8_L3_params_0
|
||||
timestamp 1542624506
|
||||
transform 1 0 350 0 1 1050
|
||||
box 0 0 300 300
|
||||
use Library/magic/L500_NMOSi_W8_L8_params L500_NMOSi_W8_L8_params_0
|
||||
timestamp 1542624787
|
||||
transform 1 0 700 0 1 1050
|
||||
box 0 0 300 300
|
||||
use Library/magic/L500_NMOSi_W10_L10_params L500_NMOSi_W10_L10_params_0
|
||||
timestamp 1542440942
|
||||
transform 1 0 0 0 1 700
|
||||
box 0 0 300 300
|
||||
use Library/magic/L500_NMOSi_W5_L5_params L500_NMOSi_W5_L5_params_0
|
||||
timestamp 1542090445
|
||||
transform 1 0 0 0 1 350
|
||||
box 0 0 300 300
|
||||
use Library/magic/L500_NMOSi_W3_L2_params L500_NMOSi_W3_L2_params_0
|
||||
timestamp 1542090651
|
||||
transform 1 0 0 0 1 0
|
||||
box 0 0 300 300
|
||||
<< end >>
|
||||
|
|
@ -0,0 +1,124 @@
|
|||
magic
|
||||
tech scmos
|
||||
timestamp 1538240070
|
||||
use Library/magic/L500_METAL1_W4m_100rsquare L500_METAL1_W4m_100rsquare_0 Library/magic
|
||||
timestamp 1537372519
|
||||
transform 1 0 200 0 1 300
|
||||
box 0 0 420 100
|
||||
use Library/magic/L500_METAL1_W100_1rsquare L500_METAL1_W100_1rsquare_4 Library/magic
|
||||
timestamp 1537367970
|
||||
transform 0 1 520 -1 0 400
|
||||
box 0 0 100 300
|
||||
use Library/magic/L500_METAL1_W4_100rsquare L500_METAL1_W4_100rsquare_0 Library/magic
|
||||
timestamp 1537368500
|
||||
transform 1 0 1840 0 1 300
|
||||
box 0 0 600 100
|
||||
use Library/magic/L500_METAL1_W10_100rsquare L500_METAL1_W10_100rsquare_0 Library/magic
|
||||
timestamp 1537368500
|
||||
transform 1 0 0 0 1 200
|
||||
box 0 0 1200 100
|
||||
use Library/magic/L500_METAL1_W100_1rsquare L500_METAL1_W100_1rsquare_1
|
||||
timestamp 1537367970
|
||||
transform 0 1 1100 -1 0 300
|
||||
box 0 0 100 300
|
||||
use Library/magic/L500_METAL1_W6_100rsquare L500_METAL1_W6_100rsquare_0 Library/magic
|
||||
timestamp 1537368500
|
||||
transform 1 0 1300 0 1 200
|
||||
box 0 0 800 100
|
||||
use Library/magic/L500_METAL1_W100_1rsquare L500_METAL1_W100_1rsquare_2
|
||||
timestamp 1537367970
|
||||
transform 0 1 2000 -1 0 300
|
||||
box 0 0 100 300
|
||||
use Library/magic/L500_METAL2_W100_1rsquare L500_METAL2_W100_1rsquare_0 Library/magic
|
||||
timestamp 1537367970
|
||||
transform 1 0 200 0 1 100
|
||||
box 0 0 100 300
|
||||
use Library/magic/L500_METAL1_W8m_100rsquare L500_METAL1_W8m_100rsquare_0 Library/magic
|
||||
timestamp 1537373212
|
||||
transform 1 0 200 0 1 100
|
||||
box 0 0 640 100
|
||||
use Library/magic/L500_METAL1_W100_1rsquare L500_METAL1_W100_1rsquare_5
|
||||
timestamp 1537367970
|
||||
transform 0 1 740 -1 0 200
|
||||
box 0 0 100 300
|
||||
use Library/magic/L500_CHAR_m L500_CHAR_m_0 Library/magic
|
||||
timestamp 1534323034
|
||||
transform 1 0 1400 0 1 158
|
||||
box 0 0 16 18
|
||||
use Library/magic/L500_CHAR_e L500_CHAR_e_0 Library/magic
|
||||
timestamp 1534321786
|
||||
transform 1 0 1420 0 1 158
|
||||
box 0 0 12 18
|
||||
use Library/magic/L500_CHAR_t L500_CHAR_t_0 Library/magic
|
||||
timestamp 1534318840
|
||||
transform 1 0 1436 0 1 158
|
||||
box 0 0 12 18
|
||||
use Library/magic/L500_CHAR_a L500_CHAR_a_0 Library/magic
|
||||
timestamp 1534325357
|
||||
transform 1 0 1452 0 1 158
|
||||
box 0 0 12 18
|
||||
use Library/magic/L500_CHAR_l L500_CHAR_l_0 Library/magic
|
||||
timestamp 1534225390
|
||||
transform 1 0 1468 0 1 158
|
||||
box 0 0 12 18
|
||||
use Library/magic/L500_CHAR_1 L500_CHAR_1_0 Library/magic
|
||||
timestamp 1534326485
|
||||
transform 1 0 1484 0 1 158
|
||||
box 0 0 12 18
|
||||
use Library/magic/L500_CHAR_under L500_CHAR_under_0 Library/magic
|
||||
timestamp 1534325915
|
||||
transform 1 0 1500 0 1 158
|
||||
box 0 0 12 4
|
||||
use Library/magic/L500_CHAR_r L500_CHAR_r_0 Library/magic
|
||||
timestamp 1534323573
|
||||
transform 1 0 1516 0 1 158
|
||||
box 0 0 12 18
|
||||
use Library/magic/L500_CHAR_s L500_CHAR_s_0 Library/magic
|
||||
timestamp 1534323853
|
||||
transform 1 0 1532 0 1 158
|
||||
box 0 0 12 18
|
||||
use Library/magic/L500_CHAR_q L500_CHAR_q_0 Library/magic
|
||||
timestamp 1534588197
|
||||
transform 1 0 1548 0 1 158
|
||||
box 0 0 12 18
|
||||
use Library/magic/L500_CHAR_u L500_CHAR_u_0 Library/magic
|
||||
timestamp 1534323899
|
||||
transform 1 0 1564 0 1 158
|
||||
box 0 0 12 18
|
||||
use Library/magic/L500_CHAR_a L500_CHAR_a_1
|
||||
timestamp 1534325357
|
||||
transform 1 0 1580 0 1 158
|
||||
box 0 0 12 18
|
||||
use Library/magic/L500_CHAR_r L500_CHAR_r_1
|
||||
timestamp 1534323573
|
||||
transform 1 0 1596 0 1 158
|
||||
box 0 0 12 18
|
||||
use Library/magic/L500_CHAR_e L500_CHAR_e_1
|
||||
timestamp 1534321786
|
||||
transform 1 0 1612 0 1 158
|
||||
box 0 0 12 18
|
||||
use Library/magic/L500_METAL1_W8_100rsquare L500_METAL1_W8_100rsquare_0 Library/magic
|
||||
timestamp 1537368500
|
||||
transform 1 0 940 0 1 100
|
||||
box 0 0 1000 100
|
||||
use Library/magic/L500_METAL2_W100_1rsquare L500_METAL2_W100_1rsquare_1
|
||||
timestamp 1537367970
|
||||
transform -1 0 1940 0 -1 400
|
||||
box 0 0 100 300
|
||||
use Library/magic/L500_METAL1_W100_1rsquare L500_METAL1_W100_1rsquare_6
|
||||
timestamp 1537367970
|
||||
transform 1 0 2340 0 1 100
|
||||
box 0 0 100 300
|
||||
use Library/magic/L500_METAL1_W100_1rsquare L500_METAL1_W100_1rsquare_0
|
||||
timestamp 1537367970
|
||||
transform 1 0 0 0 1 0
|
||||
box 0 0 100 300
|
||||
use Library/magic/L500_METAL1_W19_100rsquare L500_METAL1_190_100rsquare_0 Library/magic
|
||||
timestamp 1537368500
|
||||
transform 1 0 0 0 1 0
|
||||
box 0 0 2100 100
|
||||
use Library/magic/L500_METAL1_W100_1rsquare L500_METAL1_W100_1rsquare_3
|
||||
timestamp 1537367970
|
||||
transform 0 1 2000 -1 0 100
|
||||
box 0 0 100 300
|
||||
<< end >>
|
||||
|
|
@ -0,0 +1,124 @@
|
|||
magic
|
||||
tech scmos
|
||||
timestamp 1538710199
|
||||
use Library/magic/L500_METAL2_W4m_100rsquare L500_METAL2_W4m_100rsquare_0
|
||||
timestamp 1537372519
|
||||
transform 1 0 200 0 1 300
|
||||
box 0 0 420 100
|
||||
use Library/magic/L500_METAL2_W100_1rsquare L500_METAL2_W100_1rsquare_4
|
||||
timestamp 1537367970
|
||||
transform 0 1 520 -1 0 400
|
||||
box 0 0 100 300
|
||||
use Library/magic/L500_METAL2_W4_100rsquare L500_METAL2_W4_100rsquare_0
|
||||
timestamp 1537368500
|
||||
transform 1 0 1840 0 1 300
|
||||
box 0 0 600 100
|
||||
use Library/magic/L500_METAL2_W10_100rsquare L500_METAL2_W10_100rsquare_0
|
||||
timestamp 1537368500
|
||||
transform 1 0 0 0 1 200
|
||||
box 0 0 1200 100
|
||||
use Library/magic/L500_METAL2_W100_1rsquare L500_METAL2_W100_1rsquare_1
|
||||
timestamp 1537367970
|
||||
transform 0 1 1100 -1 0 300
|
||||
box 0 0 100 300
|
||||
use Library/magic/L500_METAL2_W6_100rsquare L500_METAL2_W6_100rsquare_0
|
||||
timestamp 1537368500
|
||||
transform 1 0 1300 0 1 200
|
||||
box 0 0 800 100
|
||||
use Library/magic/L500_METAL2_W100_1rsquare L500_METAL2_W100_1rsquare_2
|
||||
timestamp 1537367970
|
||||
transform 0 1 2000 -1 0 300
|
||||
box 0 0 100 300
|
||||
use Library/magic/L500_METAL1_W100_1rsquare L500_METAL1_W100_1rsquare_0
|
||||
timestamp 1537367970
|
||||
transform 1 0 200 0 1 100
|
||||
box 0 0 100 300
|
||||
use Library/magic/L500_METAL2_W8m_100rsquare L500_METAL2_W8m_100rsquare_0
|
||||
timestamp 1537373212
|
||||
transform 1 0 200 0 1 100
|
||||
box 0 0 640 100
|
||||
use Library/magic/L500_METAL2_W100_1rsquare L500_METAL2_W100_1rsquare_5
|
||||
timestamp 1537367970
|
||||
transform 0 1 740 -1 0 200
|
||||
box 0 0 100 300
|
||||
use Library/magic/L500_CHAR_m L500_CHAR_m_0
|
||||
timestamp 1534323034
|
||||
transform 1 0 1400 0 1 158
|
||||
box 0 0 16 18
|
||||
use Library/magic/L500_CHAR_e L500_CHAR_e_0
|
||||
timestamp 1534321786
|
||||
transform 1 0 1420 0 1 158
|
||||
box 0 0 12 18
|
||||
use Library/magic/L500_CHAR_t L500_CHAR_t_0
|
||||
timestamp 1534318840
|
||||
transform 1 0 1436 0 1 158
|
||||
box 0 0 12 18
|
||||
use Library/magic/L500_CHAR_a L500_CHAR_a_0
|
||||
timestamp 1534325357
|
||||
transform 1 0 1452 0 1 158
|
||||
box 0 0 12 18
|
||||
use Library/magic/L500_CHAR_l L500_CHAR_l_0
|
||||
timestamp 1534225390
|
||||
transform 1 0 1468 0 1 158
|
||||
box 0 0 12 18
|
||||
use Library/magic/L500_CHAR_2 L500_CHAR_2_0
|
||||
timestamp 1534324708
|
||||
transform 1 0 1484 0 1 158
|
||||
box 0 0 12 18
|
||||
use Library/magic/L500_CHAR_under L500_CHAR_under_0
|
||||
timestamp 1534325915
|
||||
transform 1 0 1500 0 1 158
|
||||
box 0 0 12 4
|
||||
use Library/magic/L500_CHAR_r L500_CHAR_r_0
|
||||
timestamp 1534323573
|
||||
transform 1 0 1516 0 1 158
|
||||
box 0 0 12 18
|
||||
use Library/magic/L500_CHAR_s L500_CHAR_s_0
|
||||
timestamp 1534323853
|
||||
transform 1 0 1532 0 1 158
|
||||
box 0 0 12 18
|
||||
use Library/magic/L500_CHAR_q L500_CHAR_q_0
|
||||
timestamp 1534588197
|
||||
transform 1 0 1548 0 1 158
|
||||
box 0 0 12 18
|
||||
use Library/magic/L500_CHAR_u L500_CHAR_u_0
|
||||
timestamp 1534323899
|
||||
transform 1 0 1564 0 1 158
|
||||
box 0 0 12 18
|
||||
use Library/magic/L500_CHAR_a L500_CHAR_a_1
|
||||
timestamp 1534325357
|
||||
transform 1 0 1580 0 1 158
|
||||
box 0 0 12 18
|
||||
use Library/magic/L500_CHAR_r L500_CHAR_r_1
|
||||
timestamp 1534323573
|
||||
transform 1 0 1596 0 1 158
|
||||
box 0 0 12 18
|
||||
use Library/magic/L500_CHAR_e L500_CHAR_e_1
|
||||
timestamp 1534321786
|
||||
transform 1 0 1612 0 1 158
|
||||
box 0 0 12 18
|
||||
use Library/magic/L500_METAL2_W8_100rsquare L500_METAL2_W8_100rsquare_0
|
||||
timestamp 1537368500
|
||||
transform 1 0 940 0 1 100
|
||||
box 0 0 1000 100
|
||||
use Library/magic/L500_METAL1_W100_1rsquare L500_METAL1_W100_1rsquare_1
|
||||
timestamp 1537367970
|
||||
transform -1 0 1940 0 -1 400
|
||||
box 0 0 100 300
|
||||
use Library/magic/L500_METAL2_W100_1rsquare L500_METAL2_W100_1rsquare_6
|
||||
timestamp 1537367970
|
||||
transform 1 0 2340 0 1 100
|
||||
box 0 0 100 300
|
||||
use Library/magic/L500_METAL2_W100_1rsquare L500_METAL2_W100_1rsquare_0
|
||||
timestamp 1537367970
|
||||
transform 1 0 0 0 1 0
|
||||
box 0 0 100 300
|
||||
use Library/magic/L500_METAL2_W19_100rsquare L500_METAL2_190_100rsquare_0
|
||||
timestamp 1537368500
|
||||
transform 1 0 0 0 1 0
|
||||
box 0 0 2100 100
|
||||
use Library/magic/L500_METAL2_W100_1rsquare L500_METAL1_W100_1rsquare_3
|
||||
timestamp 1537367970
|
||||
transform 0 1 2000 -1 0 100
|
||||
box 0 0 100 300
|
||||
<< end >>
|
||||
|
|
@ -0,0 +1,124 @@
|
|||
magic
|
||||
tech scmos
|
||||
timestamp 1538319530
|
||||
use Library/magic/L500_METAL3_W4m_100rsquare L500_METAL3_W4m_100rsquare_0 Library/magic
|
||||
timestamp 1537372519
|
||||
transform 1 0 200 0 1 300
|
||||
box 0 0 420 100
|
||||
use Library/magic/L500_METAL3_W100_1rsquare L500_METAL3_W100_1rsquare_4 Library/magic
|
||||
timestamp 1537367970
|
||||
transform 0 1 520 -1 0 400
|
||||
box 0 0 100 300
|
||||
use Library/magic/L500_METAL3_W4_100rsquare L500_METAL3_W4_100rsquare_0 Library/magic
|
||||
timestamp 1537368500
|
||||
transform 1 0 1840 0 1 300
|
||||
box 0 0 600 100
|
||||
use Library/magic/L500_METAL3_W10_100rsquare L500_METAL3_W10_100rsquare_0 Library/magic
|
||||
timestamp 1537368500
|
||||
transform 1 0 0 0 1 200
|
||||
box 0 0 1200 100
|
||||
use Library/magic/L500_METAL3_W100_1rsquare L500_METAL3_W100_1rsquare_1
|
||||
timestamp 1537367970
|
||||
transform 0 1 1100 -1 0 300
|
||||
box 0 0 100 300
|
||||
use Library/magic/L500_METAL3_W6_100rsquare L500_METAL3_W6_100rsquare_0 Library/magic
|
||||
timestamp 1537368500
|
||||
transform 1 0 1300 0 1 200
|
||||
box 0 0 800 100
|
||||
use Library/magic/L500_METAL3_W100_1rsquare L500_METAL3_W100_1rsquare_2
|
||||
timestamp 1537367970
|
||||
transform 0 1 2000 -1 0 300
|
||||
box 0 0 100 300
|
||||
use Library/magic/L500_METAL2_W100_1rsquare L500_METAL2_W100_1rsquare_0 Library/magic
|
||||
timestamp 1537367970
|
||||
transform 1 0 200 0 1 100
|
||||
box 0 0 100 300
|
||||
use Library/magic/L500_METAL3_W8m_100rsquare L500_METAL3_W8m_100rsquare_0 Library/magic
|
||||
timestamp 1537373212
|
||||
transform 1 0 200 0 1 100
|
||||
box 0 0 640 100
|
||||
use Library/magic/L500_METAL3_W100_1rsquare L500_METAL3_W100_1rsquare_5
|
||||
timestamp 1537367970
|
||||
transform 0 1 740 -1 0 200
|
||||
box 0 0 100 300
|
||||
use Library/magic/L500_CHAR_m L500_CHAR_m_0 Library/magic
|
||||
timestamp 1534323034
|
||||
transform 1 0 1400 0 1 158
|
||||
box 0 0 16 18
|
||||
use Library/magic/L500_CHAR_e L500_CHAR_e_0 Library/magic
|
||||
timestamp 1534321786
|
||||
transform 1 0 1420 0 1 158
|
||||
box 0 0 12 18
|
||||
use Library/magic/L500_CHAR_t L500_CHAR_t_0 Library/magic
|
||||
timestamp 1534318840
|
||||
transform 1 0 1436 0 1 158
|
||||
box 0 0 12 18
|
||||
use Library/magic/L500_CHAR_a L500_CHAR_a_0 Library/magic
|
||||
timestamp 1534325357
|
||||
transform 1 0 1452 0 1 158
|
||||
box 0 0 12 18
|
||||
use Library/magic/L500_CHAR_l L500_CHAR_l_0 Library/magic
|
||||
timestamp 1534225390
|
||||
transform 1 0 1468 0 1 158
|
||||
box 0 0 12 18
|
||||
use Library/magic/L500_CHAR_3 L500_CHAR_3_0 Library/magic
|
||||
timestamp 1534324785
|
||||
transform 1 0 1484 0 1 158
|
||||
box 0 0 12 18
|
||||
use Library/magic/L500_CHAR_under L500_CHAR_under_0 Library/magic
|
||||
timestamp 1534325915
|
||||
transform 1 0 1500 0 1 158
|
||||
box 0 0 12 4
|
||||
use Library/magic/L500_CHAR_r L500_CHAR_r_0 Library/magic
|
||||
timestamp 1534323573
|
||||
transform 1 0 1516 0 1 158
|
||||
box 0 0 12 18
|
||||
use Library/magic/L500_CHAR_s L500_CHAR_s_0 Library/magic
|
||||
timestamp 1534323853
|
||||
transform 1 0 1532 0 1 158
|
||||
box 0 0 12 18
|
||||
use Library/magic/L500_CHAR_q L500_CHAR_q_0 Library/magic
|
||||
timestamp 1534588197
|
||||
transform 1 0 1548 0 1 158
|
||||
box 0 0 12 18
|
||||
use Library/magic/L500_CHAR_u L500_CHAR_u_0 Library/magic
|
||||
timestamp 1534323899
|
||||
transform 1 0 1564 0 1 158
|
||||
box 0 0 12 18
|
||||
use Library/magic/L500_CHAR_a L500_CHAR_a_1
|
||||
timestamp 1534325357
|
||||
transform 1 0 1580 0 1 158
|
||||
box 0 0 12 18
|
||||
use Library/magic/L500_CHAR_r L500_CHAR_r_1
|
||||
timestamp 1534323573
|
||||
transform 1 0 1596 0 1 158
|
||||
box 0 0 12 18
|
||||
use Library/magic/L500_CHAR_e L500_CHAR_e_1
|
||||
timestamp 1534321786
|
||||
transform 1 0 1612 0 1 158
|
||||
box 0 0 12 18
|
||||
use Library/magic/L500_METAL3_W8_100rsquare L500_METAL3_W8_100rsquare_0 Library/magic
|
||||
timestamp 1537368500
|
||||
transform 1 0 940 0 1 100
|
||||
box 0 0 1000 100
|
||||
use Library/magic/L500_METAL2_W100_1rsquare L500_METAL2_W100_1rsquare_1
|
||||
timestamp 1537367970
|
||||
transform -1 0 1940 0 -1 400
|
||||
box 0 0 100 300
|
||||
use Library/magic/L500_METAL3_W100_1rsquare L500_METAL3_W100_1rsquare_6
|
||||
timestamp 1537367970
|
||||
transform 1 0 2340 0 1 100
|
||||
box 0 0 100 300
|
||||
use Library/magic/L500_METAL3_W100_1rsquare L500_METAL3_W100_1rsquare_0
|
||||
timestamp 1537367970
|
||||
transform 1 0 0 0 1 0
|
||||
box 0 0 100 300
|
||||
use Library/magic/L500_METAL3_W19_100rsquare L500_METAL3_190_100rsquare_0 Library/magic
|
||||
timestamp 1537368500
|
||||
transform 1 0 0 0 1 0
|
||||
box 0 0 2100 100
|
||||
use Library/magic/L500_METAL3_W100_1rsquare L500_METAL3_W100_1rsquare_3
|
||||
timestamp 1537367970
|
||||
transform 0 1 2000 -1 0 100
|
||||
box 0 0 100 300
|
||||
<< end >>
|
||||
|
|
@ -0,0 +1,192 @@
|
|||
magic
|
||||
tech scmos
|
||||
timestamp 1533916061
|
||||
<< pwell >>
|
||||
rect 6 404 334 436
|
||||
rect 404 274 436 594
|
||||
<< nwell >>
|
||||
rect 164 6 196 326
|
||||
rect 274 164 594 196
|
||||
<< polysilicon >>
|
||||
rect 419 584 421 586
|
||||
rect 14 419 16 421
|
||||
rect 324 419 335 421
|
||||
rect 179 316 181 327
|
||||
rect 419 273 421 284
|
||||
rect 273 179 284 181
|
||||
rect 584 179 586 181
|
||||
rect 179 14 181 16
|
||||
<< ndiffusion >>
|
||||
rect 20 422 320 426
|
||||
rect 16 421 324 422
|
||||
rect 16 418 324 419
|
||||
rect 20 414 320 418
|
||||
rect 418 580 419 584
|
||||
rect 414 288 419 580
|
||||
rect 418 284 419 288
|
||||
rect 421 580 422 584
|
||||
rect 421 288 426 580
|
||||
rect 421 284 422 288
|
||||
<< pdiffusion >>
|
||||
rect 178 312 179 316
|
||||
rect 174 20 179 312
|
||||
rect 178 16 179 20
|
||||
rect 181 312 182 316
|
||||
rect 181 20 186 312
|
||||
rect 181 16 182 20
|
||||
rect 288 182 580 186
|
||||
rect 284 181 584 182
|
||||
rect 284 178 584 179
|
||||
rect 288 174 580 178
|
||||
<< metal1 >>
|
||||
rect 352 588 418 592
|
||||
rect 414 584 418 588
|
||||
rect 8 426 12 500
|
||||
rect 328 426 332 430
|
||||
rect 8 422 16 426
|
||||
rect 324 422 332 426
|
||||
rect 336 422 340 488
|
||||
rect 328 418 332 422
|
||||
rect 339 418 340 422
|
||||
rect 8 414 16 418
|
||||
rect 324 414 332 418
|
||||
rect 8 352 12 414
|
||||
rect 328 410 332 414
|
||||
rect 328 352 332 406
|
||||
rect 112 331 182 332
|
||||
rect 112 328 178 331
|
||||
rect 170 320 190 324
|
||||
rect 174 316 178 320
|
||||
rect 182 316 186 320
|
||||
rect 174 12 178 16
|
||||
rect 112 8 178 12
|
||||
rect 194 320 248 324
|
||||
rect 352 276 406 280
|
||||
rect 422 588 488 592
|
||||
rect 422 584 426 588
|
||||
rect 414 280 418 284
|
||||
rect 422 280 426 284
|
||||
rect 410 276 430 280
|
||||
rect 422 269 488 272
|
||||
rect 418 268 488 269
|
||||
rect 276 194 280 248
|
||||
rect 276 186 280 190
|
||||
rect 588 186 592 248
|
||||
rect 276 182 284 186
|
||||
rect 584 182 592 186
|
||||
rect 269 112 273 178
|
||||
rect 276 178 280 182
|
||||
rect 276 174 284 178
|
||||
rect 584 174 592 178
|
||||
rect 276 170 280 174
|
||||
rect 588 112 592 174
|
||||
rect 182 12 186 16
|
||||
rect 182 8 248 12
|
||||
<< ntransistor >>
|
||||
rect 16 419 324 421
|
||||
rect 419 284 421 584
|
||||
<< ptransistor >>
|
||||
rect 179 16 181 316
|
||||
rect 284 179 584 181
|
||||
<< polycontact >>
|
||||
rect 335 418 339 422
|
||||
rect 178 327 182 331
|
||||
rect 418 269 422 273
|
||||
rect 269 178 273 182
|
||||
<< ndcontact >>
|
||||
rect 16 422 20 426
|
||||
rect 320 422 324 426
|
||||
rect 16 414 20 418
|
||||
rect 320 414 324 418
|
||||
rect 414 580 418 584
|
||||
rect 414 284 418 288
|
||||
rect 422 580 426 584
|
||||
rect 422 284 426 288
|
||||
<< pdcontact >>
|
||||
rect 174 312 178 316
|
||||
rect 174 16 178 20
|
||||
rect 182 312 186 316
|
||||
rect 182 16 186 20
|
||||
rect 284 182 288 186
|
||||
rect 580 182 584 186
|
||||
rect 284 174 288 178
|
||||
rect 580 174 584 178
|
||||
<< psubstratepcontact >>
|
||||
rect 16 430 332 434
|
||||
rect 16 406 332 410
|
||||
rect 406 276 410 584
|
||||
rect 430 276 434 584
|
||||
<< nsubstratencontact >>
|
||||
rect 166 16 170 324
|
||||
rect 190 16 194 324
|
||||
rect 276 190 584 194
|
||||
rect 276 166 584 170
|
||||
<< nplusdoping >>
|
||||
rect 170 320 179 324
|
||||
rect 181 320 190 324
|
||||
rect 584 190 592 194
|
||||
rect 276 181 280 190
|
||||
rect 276 170 280 179
|
||||
rect 588 170 592 190
|
||||
rect 584 166 592 170
|
||||
rect 166 12 170 16
|
||||
rect 190 12 194 16
|
||||
rect 166 8 194 12
|
||||
<< pplusdoping >>
|
||||
rect 406 588 434 592
|
||||
rect 406 584 410 588
|
||||
rect 430 584 434 588
|
||||
rect 8 430 16 434
|
||||
rect 8 410 12 430
|
||||
rect 328 421 332 430
|
||||
rect 328 410 332 419
|
||||
rect 8 406 16 410
|
||||
rect 410 276 419 280
|
||||
rect 421 276 430 280
|
||||
use Library/magic/L500_TPM1_blank L500_TPM1_blank_6 Library/magic
|
||||
timestamp 1531942424
|
||||
transform 1 0 0 0 1 480
|
||||
box 0 0 120 120
|
||||
use Library/magic/L500_TPM1_blank L500_TPM1_blank_7
|
||||
timestamp 1531942424
|
||||
transform 1 0 240 0 1 480
|
||||
box 0 0 120 120
|
||||
use Library/magic/L500_TPM1_blank L500_TPM1_blank_8
|
||||
timestamp 1531942424
|
||||
transform 1 0 480 0 1 480
|
||||
box 0 0 120 120
|
||||
use Library/magic/L500_TPM1_blank L500_TPM1_blank_1
|
||||
timestamp 1531942424
|
||||
transform 1 0 0 0 1 240
|
||||
box 0 0 120 120
|
||||
use Library/magic/L500_TPM1_blank L500_TPM1_blank_3
|
||||
timestamp 1531942424
|
||||
transform 1 0 240 0 1 240
|
||||
box 0 0 120 120
|
||||
use Library/magic/L500_TPM1_blank L500_TPM1_blank_5
|
||||
timestamp 1531942424
|
||||
transform 1 0 480 0 1 240
|
||||
box 0 0 120 120
|
||||
use Library/magic/L500_TPM1_blank L500_TPM1_blank_0
|
||||
timestamp 1531942424
|
||||
transform 1 0 0 0 1 0
|
||||
box 0 0 120 120
|
||||
use Library/magic/L500_TPM1_blank L500_TPM1_blank_2
|
||||
timestamp 1531942424
|
||||
transform 1 0 240 0 1 0
|
||||
box 0 0 120 120
|
||||
use Library/magic/L500_TPM1_blank L500_TPM1_blank_4
|
||||
timestamp 1531942424
|
||||
transform 1 0 480 0 1 0
|
||||
box 0 0 120 120
|
||||
<< labels >>
|
||||
rlabel space 260 260 340 340 1 gnd!
|
||||
rlabel space 20 500 100 580 1 DRAIN_NMOS0
|
||||
rlabel space 500 500 580 580 1 DRAIN_NMOS1
|
||||
rlabel space 500 20 580 100 1 DRAIN_PMOS0
|
||||
rlabel space 20 20 100 100 1 DRAIN_PMOS0
|
||||
rlabel space 260 500 340 580 1 GATE_NMOS0
|
||||
rlabel space 500 260 580 340 1 GATE_NMOS1
|
||||
rlabel space 260 20 340 100 1 GATE_PMOS0
|
||||
rlabel space 20 260 100 340 1 GATE_PMOS1
|
||||
<< end >>
|
||||
|
|
@ -0,0 +1,64 @@
|
|||
magic
|
||||
tech scmos
|
||||
timestamp 1538814797
|
||||
use Library/magic/L500_NMOS_W3_L2_params L500_NMOS_W3_L2_params_0
|
||||
timestamp 1538814797
|
||||
transform 1 0 1400 0 1 1400
|
||||
box 0 0 340 340
|
||||
use Library/magic/L500_NMOS_W5_L5_params L500_NMOS_W5_L5_params_0
|
||||
timestamp 1538814797
|
||||
transform 1 0 1050 0 1 1050
|
||||
box 0 0 340 340
|
||||
use Library/magic/L500_NMOS_W5_L2_params L500_NMOS_W5_L2_params_0
|
||||
timestamp 1538814797
|
||||
transform 1 0 1400 0 1 1050
|
||||
box 0 0 340 340
|
||||
use Library/magic/L500_NMOS_W10_L10_params L500_NMOS_W10_L10_params_0
|
||||
timestamp 1538814797
|
||||
transform 1 0 700 0 1 700
|
||||
box 0 0 340 340
|
||||
use Library/magic/L500_NMOS_W10_L5_params L500_NMOS_W10_L5_params_0
|
||||
timestamp 1538814797
|
||||
transform 1 0 1050 0 1 700
|
||||
box 0 0 340 340
|
||||
use Library/magic/L500_NMOS_W10_L2_params L500_NMOS_W10_L2_params_0
|
||||
timestamp 1538814797
|
||||
transform 1 0 1400 0 1 700
|
||||
box 0 0 340 340
|
||||
use Library/magic/L500_NMOS_W20_L20_params L500_NMOS_W20_L20_params_0
|
||||
timestamp 1538814797
|
||||
transform 1 0 350 0 1 350
|
||||
box 0 0 340 340
|
||||
use Library/magic/L500_NMOS_W20_L10_params L500_NMOS_W20_L10_params_0
|
||||
timestamp 1538814797
|
||||
transform 1 0 700 0 1 350
|
||||
box 0 0 340 340
|
||||
use Library/magic/L500_NMOS_W20_L5_params L500_NMOS_W20_L5_params_0
|
||||
timestamp 1538814797
|
||||
transform 1 0 1050 0 1 350
|
||||
box 0 0 340 340
|
||||
use Library/magic/L500_NMOS_W20_L2_params L500_NMOS_W20_L2_params_0
|
||||
timestamp 1538814797
|
||||
transform 1 0 1400 0 1 350
|
||||
box 0 0 340 340
|
||||
use Library/magic/L500_NMOS_W40_L40_params L500_NMOS_W40_L40_params_0
|
||||
timestamp 1538755647
|
||||
transform 1 0 0 0 1 0
|
||||
box 0 0 300 300
|
||||
use Library/magic/L500_NMOS_W40_L20_params L500_NMOS_W40_L20_params_0
|
||||
timestamp 1538762096
|
||||
transform 1 0 350 0 1 0
|
||||
box 0 0 300 300
|
||||
use Library/magic/L500_NMOS_W40_L10_params L500_NMOS_W40_L10_params_0
|
||||
timestamp 1538760436
|
||||
transform 1 0 700 0 1 0
|
||||
box 0 0 300 300
|
||||
use Library/magic/L500_NMOS_W40_L5_params L500_NMOS_W40_L5_params_0
|
||||
timestamp 1538760846
|
||||
transform 1 0 1050 0 1 0
|
||||
box 0 0 300 300
|
||||
use Library/magic/L500_NMOS_W40_L2_params L500_NMOS_W40_L2_params_0
|
||||
timestamp 1538761352
|
||||
transform 1 0 1400 0 1 0
|
||||
box 0 0 300 300
|
||||
<< end >>
|
||||
|
|
@ -0,0 +1,20 @@
|
|||
magic
|
||||
tech scmos
|
||||
timestamp 1541350492
|
||||
use Library/magic/L500_NPNi2 L500_NPNi2
|
||||
timestamp 1541350492
|
||||
transform 1 0 350 0 1 350
|
||||
box 0 0 300 300
|
||||
use Library/magic/L500_NPNi1 L500_NPNi1
|
||||
timestamp 1541350492
|
||||
transform 1 0 350 0 1 0
|
||||
box 0 0 300 300
|
||||
use Library/magic/L500_NPN2 L500_NPN2
|
||||
timestamp 1541350492
|
||||
transform 1 0 0 0 1 350
|
||||
box 0 0 300 300
|
||||
use Library/magic/L500_NPN1 L500_NPN1
|
||||
timestamp 1541350492
|
||||
transform 1 0 0 0 1 0
|
||||
box 0 0 300 300
|
||||
<< end >>
|
||||
File diff suppressed because it is too large
Load Diff
|
|
@ -0,0 +1,64 @@
|
|||
magic
|
||||
tech scmos
|
||||
timestamp 1541350492
|
||||
use Library/magic/L500_PMOS_W3_L2_params L500_PMOS_W3_L2_params_0
|
||||
timestamp 1541350492
|
||||
transform 1 0 0 0 1 1400
|
||||
box 0 0 300 300
|
||||
use Library/magic/L500_PMOS_W5_L2_params L500_PMOS_W5_L2_params_0
|
||||
timestamp 1541350492
|
||||
transform 1 0 0 0 1 1050
|
||||
box 0 0 300 300
|
||||
use Library/magic/L500_PMOS_W5_L5_params L500_PMOS_W5_L5_params_0
|
||||
timestamp 1541350492
|
||||
transform 1 0 350 0 1 1050
|
||||
box 0 0 300 300
|
||||
use Library/magic/L500_PMOS_W10_L2_params L500_PMOS_W10_L2_params_0
|
||||
timestamp 1541350492
|
||||
transform 1 0 0 0 1 700
|
||||
box 0 0 300 300
|
||||
use Library/magic/L500_PMOS_W10_L5_params L500_PMOS_W10_L5_params_0
|
||||
timestamp 1541350492
|
||||
transform 1 0 350 0 1 700
|
||||
box 0 0 300 300
|
||||
use Library/magic/L500_PMOS_W10_L10_params L500_PMOS_W10_L10_params_0
|
||||
timestamp 1541350492
|
||||
transform 1 0 700 0 1 700
|
||||
box 0 0 300 300
|
||||
use Library/magic/L500_PMOS_W20_L2_params L500_PMOS_W20_L2_params_0
|
||||
timestamp 1541350492
|
||||
transform 1 0 0 0 1 350
|
||||
box 0 0 300 300
|
||||
use Library/magic/L500_PMOS_W20_L5_params L500_PMOS_W20_L5_params_0
|
||||
timestamp 1541350492
|
||||
transform 1 0 350 0 1 350
|
||||
box 0 0 300 300
|
||||
use Library/magic/L500_PMOS_W20_L10_params L500_PMOS_W20_L10_params_0
|
||||
timestamp 1541350492
|
||||
transform 1 0 700 0 1 350
|
||||
box 0 0 300 300
|
||||
use Library/magic/L500_PMOS_W20_L20_params L500_PMOS_W20_L20_params_0
|
||||
timestamp 1541350492
|
||||
transform 1 0 1050 0 1 350
|
||||
box 0 0 300 300
|
||||
use Library/magic/L500_PMOS_W40_L2_params L500_PMOS_W40_L2_params_0
|
||||
timestamp 1541350492
|
||||
transform 1 0 0 0 1 0
|
||||
box 0 0 300 300
|
||||
use Library/magic/L500_PMOS_W40_L5_params L500_PMOS_W40_L5_params_0
|
||||
timestamp 1541350492
|
||||
transform 1 0 350 0 1 0
|
||||
box 0 0 300 300
|
||||
use Library/magic/L500_PMOS_W40_L10_params L500_PMOS_W40_L10_params_0
|
||||
timestamp 1541350492
|
||||
transform 1 0 700 0 1 0
|
||||
box 0 0 300 300
|
||||
use Library/magic/L500_PMOS_W40_L20_params L500_PMOS_W40_L20_params_0
|
||||
timestamp 1541350492
|
||||
transform 1 0 1050 0 1 0
|
||||
box 0 0 300 300
|
||||
use Library/magic/L500_PMOS_W40_L40_params L500_PMOS_W40_L40_params_0
|
||||
timestamp 1541350492
|
||||
transform 1 0 1400 0 1 0
|
||||
box 0 0 300 300
|
||||
<< end >>
|
||||
|
|
@ -0,0 +1,12 @@
|
|||
magic
|
||||
tech scmos
|
||||
timestamp 1541350492
|
||||
use Library/magic/L500_PNP2 L500_PNP2
|
||||
timestamp 1541350492
|
||||
transform 1 0 0 0 1 350
|
||||
box 0 0 300 300
|
||||
use Library/magic/L500_PNP1 L500_PNP1
|
||||
timestamp 1541350492
|
||||
transform 1 0 0 0 1 0
|
||||
box 0 0 300 300
|
||||
<< end >>
|
||||
|
|
@ -0,0 +1,124 @@
|
|||
magic
|
||||
tech scmos
|
||||
timestamp 1538814797
|
||||
use Library/magic/L500_POLYSI_W4m_100rsquare L500_POLYSI_W4m_100rsquare_0
|
||||
timestamp 1538327188
|
||||
transform 1 0 200 0 1 300
|
||||
box 0 0 430 100
|
||||
use Library/magic/L500_METAL1_W100_1rsquare L500_METAL1_W100_1rsquare_4
|
||||
timestamp 1537367970
|
||||
transform 0 1 530 -1 0 400
|
||||
box 0 0 100 300
|
||||
use Library/magic/L500_POLYSI_W4_100rsquare L500_POLYSI_W4_100rsquare_0
|
||||
timestamp 1538326853
|
||||
transform 1 0 1868 0 1 300
|
||||
box 0 0 610 100
|
||||
use Library/magic/L500_POLYSI_W10_100rsquare L500_POLYSI_W10_100rsquare_0
|
||||
timestamp 1538326505
|
||||
transform 1 0 0 0 1 200
|
||||
box 0 0 1216 100
|
||||
use Library/magic/L500_METAL1_W100_1rsquare L500_METAL1_W100_1rsquare_1
|
||||
timestamp 1537367970
|
||||
transform 0 1 1116 -1 0 300
|
||||
box 0 0 100 300
|
||||
use Library/magic/L500_POLYSI_W6_100rsquare L500_POLYSI_W6_100rsquare_0
|
||||
timestamp 1538327339
|
||||
transform 1 0 1316 0 1 200
|
||||
box 0 0 812 100
|
||||
use Library/magic/L500_METAL1_W100_1rsquare L500_METAL1_W100_1rsquare_2
|
||||
timestamp 1537367970
|
||||
transform 0 1 2028 -1 0 300
|
||||
box 0 0 100 300
|
||||
use Library/magic/L500_METAL1_W100_1rsquare L500_METAL1_W100_1rsquare_0
|
||||
timestamp 1537367970
|
||||
transform 1 0 200 0 1 100
|
||||
box 0 0 100 300
|
||||
use Library/magic/L500_POLYSI_W8m_100rsquare L500_POLYSI_W8m_100rsquare_0
|
||||
timestamp 1538327824
|
||||
transform 1 0 200 0 1 100
|
||||
box 0 0 654 100
|
||||
use Library/magic/L500_METAL1_W100_1rsquare L500_METAL1_W100_1rsquare_5
|
||||
timestamp 1537367970
|
||||
transform 0 1 754 -1 0 200
|
||||
box 0 0 100 300
|
||||
use Library/magic/L500_CHAR_p L500_CHAR_p_0
|
||||
timestamp 1534323210
|
||||
transform 1 0 1120 0 1 100
|
||||
box 0 0 12 18
|
||||
use Library/magic/L500_CHAR_o L500_CHAR_o_0
|
||||
timestamp 1534323159
|
||||
transform 1 0 1136 0 1 100
|
||||
box 0 0 12 18
|
||||
use Library/magic/L500_CHAR_l L500_CHAR_l_0
|
||||
timestamp 1534225390
|
||||
transform 1 0 1152 0 1 100
|
||||
box 0 0 12 18
|
||||
use Library/magic/L500_CHAR_y L500_CHAR_y_0
|
||||
timestamp 1534324403
|
||||
transform 1 0 1168 0 1 100
|
||||
box 0 0 12 18
|
||||
use Library/magic/L500_CHAR_s L500_CHAR_s_0
|
||||
timestamp 1534323853
|
||||
transform 1 0 1184 0 1 100
|
||||
box 0 0 12 18
|
||||
use Library/magic/L500_CHAR_i L500_CHAR_i_0
|
||||
timestamp 1534226087
|
||||
transform 1 0 1200 0 1 100
|
||||
box 0 0 8 18
|
||||
use Library/magic/L500_CHAR_under L500_CHAR_under_0
|
||||
timestamp 1534325915
|
||||
transform 1 0 1212 0 1 100
|
||||
box 0 0 12 4
|
||||
use Library/magic/L500_CHAR_r L500_CHAR_r_0
|
||||
timestamp 1534323573
|
||||
transform 1 0 1228 0 1 100
|
||||
box 0 0 12 18
|
||||
use Library/magic/L500_CHAR_s L500_CHAR_s_1
|
||||
timestamp 1534323853
|
||||
transform 1 0 1244 0 1 100
|
||||
box 0 0 12 18
|
||||
use Library/magic/L500_CHAR_q L500_CHAR_q_0
|
||||
timestamp 1534588197
|
||||
transform 1 0 1260 0 1 100
|
||||
box 0 0 12 18
|
||||
use Library/magic/L500_CHAR_u L500_CHAR_u_0
|
||||
timestamp 1534323899
|
||||
transform 1 0 1276 0 1 100
|
||||
box 0 0 12 18
|
||||
use Library/magic/L500_CHAR_a L500_CHAR_a_0
|
||||
timestamp 1534325357
|
||||
transform 1 0 1292 0 1 100
|
||||
box 0 0 12 18
|
||||
use Library/magic/L500_CHAR_r L500_CHAR_r_1
|
||||
timestamp 1534323573
|
||||
transform 1 0 1308 0 1 100
|
||||
box 0 0 12 18
|
||||
use Library/magic/L500_CHAR_e L500_CHAR_e_0
|
||||
timestamp 1534321786
|
||||
transform 1 0 1324 0 1 100
|
||||
box 0 0 12 18
|
||||
use Library/magic/L500_POLYSI_W8_100rsquare L500_POLYSI_W8_100rsquare_0
|
||||
timestamp 1538327581
|
||||
transform 1 0 954 0 1 100
|
||||
box 0 0 1014 100
|
||||
use Library/magic/L500_METAL1_W100_1rsquare L500_METAL1_W100_1rsquare_0
|
||||
timestamp 1537367970
|
||||
transform -1 0 1968 0 -1 400
|
||||
box 0 0 100 300
|
||||
use Library/magic/L500_METAL1_W100_1rsquare L500_METAL1_W100_1rsquare_6
|
||||
timestamp 1537367970
|
||||
transform 1 0 2378 0 1 100
|
||||
box 0 0 100 300
|
||||
use Library/magic/L500_METAL1_W100_1rsquare L500_METAL1_W100_1rsquare_1
|
||||
timestamp 1537367970
|
||||
transform 1 0 0 0 1 0
|
||||
box 0 0 100 300
|
||||
use Library/magic/L500_POLYSI_W19_100rsquare L500_POLYSI_190_100rsquare_0
|
||||
timestamp 1538326743
|
||||
transform 1 0 0 0 1 0
|
||||
box 0 0 2126 100
|
||||
use Library/magic/L500_METAL1_W100_1rsquare L500_METAL1_W100_1rsquare_3
|
||||
timestamp 1537367970
|
||||
transform 0 1 2026 -1 0 100
|
||||
box 0 0 100 300
|
||||
<< end >>
|
||||
|
|
@ -0,0 +1,50 @@
|
|||
magic
|
||||
tech scmos
|
||||
timestamp 1542693000
|
||||
<< metal2 >>
|
||||
rect 1765 311 1773 314
|
||||
rect 1786 295 1790 310
|
||||
rect 2229 295 2233 310
|
||||
rect 1786 291 1798 295
|
||||
rect 2214 291 2233 295
|
||||
rect 300 274 308 278
|
||||
rect 1120 274 1136 278
|
||||
rect 300 178 308 182
|
||||
rect 1036 178 1124 182
|
||||
use Layout/magic/T10_RO51_NAND3 T10_RO51_NAND3_0
|
||||
timestamp 1538561894
|
||||
transform 1 0 310 0 -1 438
|
||||
box -310 -2 1126 180
|
||||
use Library/magic/L500_TPAD_blank L500_TPAD_blank_2
|
||||
timestamp 1537343441
|
||||
transform 1 0 1690 0 1 310
|
||||
box 0 0 100 100
|
||||
use Library/magic/L500_TPAD_blank L500_TPAD_blank_3
|
||||
timestamp 1537343441
|
||||
transform 1 0 2229 0 1 310
|
||||
box 0 0 100 100
|
||||
use Library/magic/L500_TPAD_blank L500_TPAD_blank_0
|
||||
timestamp 1537343441
|
||||
transform 1 0 200 0 1 178
|
||||
box 0 0 100 100
|
||||
use Library/magic/L500_TPAD_blank L500_TPAD_blank_4
|
||||
timestamp 1537343441
|
||||
transform 1 0 936 0 1 178
|
||||
box 0 0 100 100
|
||||
use Library/magic/L500_TPAD_blank L500_TPAD_blank_1
|
||||
timestamp 1537343441
|
||||
transform 1 0 1136 0 1 178
|
||||
box 0 0 100 100
|
||||
use Layout/magic/T11_RO51_NOR3 T11_RO51_NOR3_0
|
||||
timestamp 1538561069
|
||||
transform 1 0 310 0 1 2
|
||||
box -310 -2 1126 196
|
||||
use Layout/magic/T7_RO51_INV T7_RO51_INV_0
|
||||
timestamp 1538566008
|
||||
transform 1 0 1800 0 1 169
|
||||
box -310 -2 728 142
|
||||
use Layout/magic/T7_CELL50_FILLCAP T7_CELL50_FILLCAP_0
|
||||
timestamp 1538559977
|
||||
transform 1 0 1800 0 1 2
|
||||
box -310 -2 904 140
|
||||
<< end >>
|
||||
|
|
@ -0,0 +1,120 @@
|
|||
magic
|
||||
tech scmos
|
||||
timestamp 1541350492
|
||||
use Library/magic/L500_RPOLY_W4m_100rsquare L500_RPOLY_W4m_100rsquare_0
|
||||
timestamp 1538327188
|
||||
transform 1 0 200 0 1 300
|
||||
box 0 0 430 100
|
||||
use Library/magic/L500_METAL1_W100_1rsquare L500_METAL1_W100_1rsquare_4
|
||||
timestamp 1537367970
|
||||
transform 0 1 530 -1 0 400
|
||||
box 0 0 100 300
|
||||
use Library/magic/L500_RPOLY_W4_100rsquare L500_RPOLY_W4_100rsquare_0
|
||||
timestamp 1538326853
|
||||
transform 1 0 1868 0 1 300
|
||||
box 0 0 610 100
|
||||
use Library/magic/L500_RPOLY_W10_100rsquare L500_RPOLY_W10_100rsquare_0
|
||||
timestamp 1538326505
|
||||
transform 1 0 0 0 1 200
|
||||
box 0 0 1216 100
|
||||
use Library/magic/L500_METAL1_W100_1rsquare L500_METAL1_W100_1rsquare_1
|
||||
timestamp 1537367970
|
||||
transform 0 1 1116 -1 0 300
|
||||
box 0 0 100 300
|
||||
use Library/magic/L500_RPOLY_W6_100rsquare L500_RPOLY_W6_100rsquare_0
|
||||
timestamp 1538327339
|
||||
transform 1 0 1316 0 1 200
|
||||
box 0 0 812 100
|
||||
use Library/magic/L500_METAL1_W100_1rsquare L500_METAL1_W100_1rsquare_2
|
||||
timestamp 1537367970
|
||||
transform 0 1 2028 -1 0 300
|
||||
box 0 0 100 300
|
||||
use Library/magic/L500_METAL1_W100_1rsquare L500_METAL1_W100_1rsquare_0
|
||||
timestamp 1537367970
|
||||
transform 1 0 200 0 1 100
|
||||
box 0 0 100 300
|
||||
use Library/magic/L500_RPOLY_W8m_100rsquare L500_RPOLY_W8m_100rsquare_0
|
||||
timestamp 1538327824
|
||||
transform 1 0 200 0 1 100
|
||||
box 0 0 654 100
|
||||
use Library/magic/L500_METAL1_W100_1rsquare L500_METAL1_W100_1rsquare_5
|
||||
timestamp 1537367970
|
||||
transform 0 1 754 -1 0 200
|
||||
box 0 0 100 300
|
||||
use Library/magic/L500_CHAR_r L500_CHAR_r_0
|
||||
timestamp 1534323573
|
||||
transform 1 0 1400 0 1 158
|
||||
box 0 0 12 18
|
||||
use Library/magic/L500_CHAR_p L500_CHAR_p_0
|
||||
timestamp 1534323210
|
||||
transform 1 0 1416 0 1 158
|
||||
box 0 0 12 18
|
||||
use Library/magic/L500_CHAR_o L500_CHAR_o_0
|
||||
timestamp 1534323159
|
||||
transform 1 0 1432 0 1 158
|
||||
box 0 0 12 18
|
||||
use Library/magic/L500_CHAR_l L500_CHAR_l_0
|
||||
timestamp 1534225390
|
||||
transform 1 0 1448 0 1 158
|
||||
box 0 0 12 18
|
||||
use Library/magic/L500_CHAR_y L500_CHAR_y_0
|
||||
timestamp 1534324403
|
||||
transform 1 0 1464 0 1 158
|
||||
box 0 0 12 18
|
||||
use Library/magic/L500_CHAR_under L500_CHAR_under_0
|
||||
timestamp 1534325915
|
||||
transform 1 0 1480 0 1 158
|
||||
box 0 0 12 4
|
||||
use Library/magic/L500_CHAR_r L500_CHAR_r_0
|
||||
timestamp 1534323573
|
||||
transform 1 0 1496 0 1 158
|
||||
box 0 0 12 18
|
||||
use Library/magic/L500_CHAR_s L500_CHAR_s_1
|
||||
timestamp 1534323853
|
||||
transform 1 0 1512 0 1 158
|
||||
box 0 0 12 18
|
||||
use Library/magic/L500_CHAR_q L500_CHAR_q_0
|
||||
timestamp 1534588197
|
||||
transform 1 0 1528 0 1 158
|
||||
box 0 0 12 18
|
||||
use Library/magic/L500_CHAR_u L500_CHAR_u_0
|
||||
timestamp 1534323899
|
||||
transform 1 0 1544 0 1 158
|
||||
box 0 0 12 18
|
||||
use Library/magic/L500_CHAR_a L500_CHAR_a_0
|
||||
timestamp 1534325357
|
||||
transform 1 0 1560 0 1 158
|
||||
box 0 0 12 18
|
||||
use Library/magic/L500_CHAR_r L500_CHAR_r_1
|
||||
timestamp 1534323573
|
||||
transform 1 0 1576 0 1 158
|
||||
box 0 0 12 18
|
||||
use Library/magic/L500_CHAR_e L500_CHAR_e_0
|
||||
timestamp 1534321786
|
||||
transform 1 0 1592 0 1 158
|
||||
box 0 0 12 18
|
||||
use Library/magic/L500_METAL1_W100_1rsquare L500_METAL1_W100_1rsquare_0
|
||||
timestamp 1537367970
|
||||
transform -1 0 1968 0 -1 400
|
||||
box 0 0 100 300
|
||||
use Library/magic/L500_RPOLY_W8_100rsquare L500_RPOLY_W8_100rsquare_0
|
||||
timestamp 1538327581
|
||||
transform 1 0 954 0 1 100
|
||||
box 0 0 1014 100
|
||||
use Library/magic/L500_METAL1_W100_1rsquare L500_METAL1_W100_1rsquare_6
|
||||
timestamp 1537367970
|
||||
transform 1 0 2378 0 1 100
|
||||
box 0 0 100 300
|
||||
use Library/magic/L500_METAL1_W100_1rsquare L500_METAL1_W100_1rsquare_1
|
||||
timestamp 1537367970
|
||||
transform 1 0 0 0 1 0
|
||||
box 0 0 100 300
|
||||
use Library/magic/L500_RPOLY_W19_100rsquare L500_RPOLY_190_100rsquare_0
|
||||
timestamp 1538326743
|
||||
transform 1 0 0 0 1 0
|
||||
box 0 0 2126 100
|
||||
use Library/magic/L500_METAL1_W100_1rsquare L500_METAL1_W100_1rsquare_3
|
||||
timestamp 1537367970
|
||||
transform 0 1 2026 -1 0 100
|
||||
box 0 0 100 300
|
||||
<< end >>
|
||||
|
|
@ -0,0 +1,20 @@
|
|||
magic
|
||||
tech scmos
|
||||
timestamp 1541350492
|
||||
use Library/magic/L500_SONOS_PMOS_W3_L2_params L500_SONOS_PMOS_W3_L2_params_0
|
||||
timestamp 1541350492
|
||||
transform 1 0 0 0 1 350
|
||||
box 0 0 300 300
|
||||
use Library/magic/L500_SONOS_PMOS_W40_L20_params L500_SONOS_PMOS_W40_L20_params_0
|
||||
timestamp 1541350492
|
||||
transform 1 0 350 0 1 350
|
||||
box 0 0 300 300
|
||||
use Library/magic/L500_SONOS_NMOS_W3_L2_params L500_SONOS_NMOS_W3_L2_params_0
|
||||
timestamp 1541350492
|
||||
transform 1 0 0 0 1 0
|
||||
box 0 0 300 300
|
||||
use Library/magic/L500_SONOS_NMOS_W40_L20_params L500_SONOS_NMOS_W40_L20_params_0
|
||||
timestamp 1541350492
|
||||
transform 1 0 350 0 1 0
|
||||
box 0 0 300 300
|
||||
<< end >>
|
||||
|
|
@ -0,0 +1,180 @@
|
|||
magic
|
||||
tech scmos
|
||||
timestamp 1543784536
|
||||
use Library/magic/L500_CHAR_u L500_CHAR_u_0
|
||||
timestamp 1534323899
|
||||
transform 1 0 20 0 1 272
|
||||
box 0 0 12 18
|
||||
use Library/magic/L500_CHAR_e L500_CHAR_e_4
|
||||
timestamp 1534321786
|
||||
transform 1 0 36 0 1 272
|
||||
box 0 0 12 18
|
||||
use Library/magic/L500_CHAR_s L500_CHAR_s_2
|
||||
timestamp 1534323853
|
||||
transform 1 0 52 0 1 280
|
||||
box 0 0 12 18
|
||||
use Library/magic/L500_CHAR_s L500_CHAR_s_3
|
||||
timestamp 1534323853
|
||||
transform 1 0 68 0 1 280
|
||||
box 0 0 12 18
|
||||
use Library/magic/L500_CHAR_g L500_CHAR_g_0
|
||||
timestamp 1534322005
|
||||
transform 1 0 4 0 1 268
|
||||
box 0 0 12 18
|
||||
use Library/magic/T7_INV T7_INV_0
|
||||
timestamp 1533657739
|
||||
transform 1 0 0 0 1 188
|
||||
box 0 0 16 56
|
||||
use Library/magic/T10_NAND2 T10_NAND2_0
|
||||
timestamp 1533654735
|
||||
transform 1 0 26 0 1 188
|
||||
box 0 0 24 80
|
||||
use Library/magic/T11_NOR2 T11_NOR2_0
|
||||
timestamp 1533654819
|
||||
transform 1 0 60 0 1 188
|
||||
box 0 0 24 88
|
||||
use Library/magic/L500_CHAR_a L500_CHAR_a_1
|
||||
timestamp 1534325357
|
||||
transform 1 0 130 0 1 274
|
||||
box 0 0 12 18
|
||||
use Library/magic/L500_CHAR_t L500_CHAR_t_0
|
||||
timestamp 1534318840
|
||||
transform 1 0 146 0 1 274
|
||||
box 0 0 12 18
|
||||
use Library/magic/L500_CHAR_dot L500_CHAR_dot_3
|
||||
timestamp 1534325697
|
||||
transform 1 0 166 0 1 282
|
||||
box 0 0 4 4
|
||||
use Library/magic/L500_CHAR_dot L500_CHAR_dot_4
|
||||
timestamp 1534325697
|
||||
transform 1 0 174 0 1 282
|
||||
box 0 0 4 4
|
||||
use Library/magic/L500_CHAR_dot L500_CHAR_dot_5
|
||||
timestamp 1534325697
|
||||
transform 1 0 182 0 1 282
|
||||
box 0 0 4 4
|
||||
use Library/magic/L500_CHAR_w L500_CHAR_w_0
|
||||
timestamp 1534324213
|
||||
transform 1 0 94 0 1 268
|
||||
box 0 0 16 18
|
||||
use Library/magic/L500_CHAR_h L500_CHAR_h_0
|
||||
timestamp 1534224731
|
||||
transform 1 0 114 0 1 268
|
||||
box 0 0 12 18
|
||||
use Library/magic/T7_NAND2 T7_NAND2_0
|
||||
timestamp 1533654698
|
||||
transform 1 0 94 0 1 188
|
||||
box 0 0 24 56
|
||||
use Library/magic/T10_NAND3 T10_NAND3
|
||||
timestamp 1533654785
|
||||
transform 1 0 128 0 1 188
|
||||
box 0 0 32 80
|
||||
use Library/magic/T11_NOR3 T11_NOR3_0
|
||||
timestamp 1533654861
|
||||
transform 1 0 170 0 1 188
|
||||
box 0 0 32 88
|
||||
use Library/magic/L500_CHAR_l L500_CHAR_l_1
|
||||
timestamp 1534225390
|
||||
transform 1 0 8 0 1 164
|
||||
box 0 0 12 18
|
||||
use Library/magic/L500_CHAR_i L500_CHAR_i_0
|
||||
timestamp 1534226087
|
||||
transform 1 0 24 0 1 164
|
||||
box 0 0 8 18
|
||||
use Library/magic/L500_CHAR_b L500_CHAR_b_0
|
||||
timestamp 1534321628
|
||||
transform 1 0 36 0 1 164
|
||||
box 0 0 12 18
|
||||
use Library/magic/L500_CHAR_r L500_CHAR_r_1
|
||||
timestamp 1534323573
|
||||
transform 1 0 52 0 1 164
|
||||
box 0 0 12 18
|
||||
use Library/magic/L500_CHAR_e L500_CHAR_e_3
|
||||
timestamp 1534321786
|
||||
transform 1 0 68 0 1 164
|
||||
box 0 0 12 18
|
||||
use Library/magic/L500_CHAR_s L500_CHAR_s_1
|
||||
timestamp 1534323853
|
||||
transform 1 0 88 0 1 164
|
||||
box 0 0 12 18
|
||||
use Library/magic/L500_CHAR_i L500_CHAR_i_1
|
||||
timestamp 1534226087
|
||||
transform 1 0 104 0 1 164
|
||||
box 0 0 8 18
|
||||
use Library/magic/L500_CHAR_l L500_CHAR_l_2
|
||||
timestamp 1534225390
|
||||
transform 1 0 116 0 1 164
|
||||
box 0 0 12 18
|
||||
use Library/magic/L500_CHAR_i L500_CHAR_i_2
|
||||
timestamp 1534226087
|
||||
transform 1 0 132 0 1 164
|
||||
box 0 0 8 18
|
||||
use Library/magic/L500_CHAR_c L500_CHAR_c_0
|
||||
timestamp 1534321654
|
||||
transform 1 0 144 0 1 164
|
||||
box 0 0 12 18
|
||||
use Library/magic/L500_CHAR_o L500_CHAR_o_0
|
||||
timestamp 1534323159
|
||||
transform 1 0 160 0 1 164
|
||||
box 0 0 12 18
|
||||
use Library/magic/L500_CHAR_n L500_CHAR_n_0
|
||||
timestamp 1534323117
|
||||
transform 1 0 176 0 1 164
|
||||
box 0 0 12 18
|
||||
use Library/magic/L500_SIGNATURE_pearlriver L500_SIGNATURE_pearlriver_0
|
||||
timestamp 1543784536
|
||||
transform 1 0 0 0 1 142
|
||||
box 0 0 202 18
|
||||
use Library/magic/L500_CHAR_dot L500_CHAR_dot_0
|
||||
timestamp 1534325697
|
||||
transform 1 0 16 0 1 120
|
||||
box 0 0 4 4
|
||||
use Library/magic/L500_CHAR_dot L500_CHAR_dot_1
|
||||
timestamp 1534325697
|
||||
transform 1 0 24 0 1 120
|
||||
box 0 0 4 4
|
||||
use Library/magic/L500_CHAR_dot L500_CHAR_dot_2
|
||||
timestamp 1534325697
|
||||
transform 1 0 32 0 1 120
|
||||
box 0 0 4 4
|
||||
use Library/magic/L500_CHAR_r L500_CHAR_r_0
|
||||
timestamp 1534323573
|
||||
transform 1 0 44 0 1 120
|
||||
box 0 0 12 18
|
||||
use Library/magic/L500_CHAR_e L500_CHAR_e_0
|
||||
timestamp 1534321786
|
||||
transform 1 0 60 0 1 120
|
||||
box 0 0 12 18
|
||||
use Library/magic/L500_CHAR_l L500_CHAR_l_0
|
||||
timestamp 1534225390
|
||||
transform 1 0 76 0 1 120
|
||||
box 0 0 12 18
|
||||
use Library/magic/L500_CHAR_e L500_CHAR_e_1
|
||||
timestamp 1534321786
|
||||
transform 1 0 92 0 1 120
|
||||
box 0 0 12 18
|
||||
use Library/magic/L500_CHAR_a L500_CHAR_a_0
|
||||
timestamp 1534325357
|
||||
transform 1 0 108 0 1 120
|
||||
box 0 0 12 18
|
||||
use Library/magic/L500_CHAR_s L500_CHAR_s_0
|
||||
timestamp 1534323853
|
||||
transform 1 0 124 0 1 120
|
||||
box 0 0 12 18
|
||||
use Library/magic/L500_CHAR_e L500_CHAR_e_2
|
||||
timestamp 1534321786
|
||||
transform 1 0 140 0 1 120
|
||||
box 0 0 12 18
|
||||
use Library/magic/L500_CHAR_d L500_CHAR_d_0
|
||||
timestamp 1534321738
|
||||
transform 1 0 156 0 1 120
|
||||
box 0 0 12 18
|
||||
use Library/magic/L500_CHAR_mark L500_CHAR_mark_0
|
||||
timestamp 1534327094
|
||||
transform 1 0 172 0 1 120
|
||||
box 0 0 4 18
|
||||
use Library/magic/L500_SIGNATURE_kallisti L500_SIGNATURE_kallisti_0
|
||||
timestamp 1533657739
|
||||
transform 1 0 40 0 1 -4
|
||||
box 4 4 116 118
|
||||
<< end >>
|
||||
|
|
@ -0,0 +1,13 @@
|
|||
magic
|
||||
tech scmos
|
||||
timestamp 1534325425
|
||||
<< silk >>
|
||||
rect 4 17 12 18
|
||||
rect 2 16 12 17
|
||||
rect 1 14 12 16
|
||||
rect 0 13 6 14
|
||||
rect 0 12 5 13
|
||||
rect 0 4 4 12
|
||||
rect 9 4 12 14
|
||||
rect 0 0 12 4
|
||||
<< end >>
|
||||
|
|
@ -0,0 +1,9 @@
|
|||
magic
|
||||
tech scmos
|
||||
timestamp 1534326485
|
||||
<< silk >>
|
||||
rect 0 15 8 18
|
||||
rect 2 14 8 15
|
||||
rect 4 4 8 14
|
||||
rect 0 0 12 4
|
||||
<< end >>
|
||||
|
|
@ -0,0 +1,12 @@
|
|||
magic
|
||||
tech scmos
|
||||
timestamp 1534324708
|
||||
<< silk >>
|
||||
rect 0 14 12 18
|
||||
rect 8 11 12 14
|
||||
rect 4 10 12 11
|
||||
rect 1 8 12 10
|
||||
rect 0 7 11 8
|
||||
rect 0 4 4 7
|
||||
rect 0 0 12 4
|
||||
<< end >>
|
||||
|
|
@ -0,0 +1,16 @@
|
|||
magic
|
||||
tech scmos
|
||||
timestamp 1534324785
|
||||
<< silk >>
|
||||
rect 0 17 10 18
|
||||
rect 0 16 11 17
|
||||
rect 0 14 12 16
|
||||
rect 6 13 12 14
|
||||
rect 8 10 12 13
|
||||
rect 0 7 12 10
|
||||
rect 8 4 12 7
|
||||
rect 6 3 12 4
|
||||
rect 0 2 12 3
|
||||
rect 0 1 11 2
|
||||
rect 0 0 10 1
|
||||
<< end >>
|
||||
|
|
@ -0,0 +1,11 @@
|
|||
magic
|
||||
tech scmos
|
||||
timestamp 1534324830
|
||||
<< silk >>
|
||||
rect 0 12 4 18
|
||||
rect 8 12 12 18
|
||||
rect 0 10 12 12
|
||||
rect 1 9 12 10
|
||||
rect 2 8 12 9
|
||||
rect 8 0 12 8
|
||||
<< end >>
|
||||
|
|
@ -0,0 +1,15 @@
|
|||
magic
|
||||
tech scmos
|
||||
timestamp 1534324893
|
||||
<< silk >>
|
||||
rect 0 15 12 18
|
||||
rect 0 11 4 15
|
||||
rect 0 10 10 11
|
||||
rect 0 9 11 10
|
||||
rect 0 8 12 9
|
||||
rect 7 7 12 8
|
||||
rect 8 4 12 7
|
||||
rect 0 2 12 4
|
||||
rect 0 1 11 2
|
||||
rect 0 0 10 1
|
||||
<< end >>
|
||||
|
|
@ -0,0 +1,16 @@
|
|||
magic
|
||||
tech scmos
|
||||
timestamp 1534324947
|
||||
<< silk >>
|
||||
rect 1 16 12 18
|
||||
rect 0 15 12 16
|
||||
rect 0 12 4 15
|
||||
rect 0 11 10 12
|
||||
rect 0 10 11 11
|
||||
rect 0 8 12 10
|
||||
rect 0 4 4 8
|
||||
rect 8 4 12 8
|
||||
rect 0 2 12 4
|
||||
rect 1 1 11 2
|
||||
rect 2 0 10 1
|
||||
<< end >>
|
||||
|
|
@ -0,0 +1,10 @@
|
|||
magic
|
||||
tech scmos
|
||||
timestamp 1534324995
|
||||
<< silk >>
|
||||
rect 0 17 10 18
|
||||
rect 0 16 11 17
|
||||
rect 0 14 12 16
|
||||
rect 7 13 12 14
|
||||
rect 8 0 12 13
|
||||
<< end >>
|
||||
|
|
@ -0,0 +1,16 @@
|
|||
magic
|
||||
tech scmos
|
||||
timestamp 1534325077
|
||||
<< silk >>
|
||||
rect 2 17 10 18
|
||||
rect 1 16 11 17
|
||||
rect 0 14 12 16
|
||||
rect 0 11 4 14
|
||||
rect 8 11 12 14
|
||||
rect 1 8 11 11
|
||||
rect 0 4 4 8
|
||||
rect 8 4 12 8
|
||||
rect 0 2 12 4
|
||||
rect 1 1 11 2
|
||||
rect 2 0 10 1
|
||||
<< end >>
|
||||
|
|
@ -0,0 +1,16 @@
|
|||
magic
|
||||
tech scmos
|
||||
timestamp 1534327497
|
||||
<< silk >>
|
||||
rect 2 17 10 18
|
||||
rect 1 16 11 17
|
||||
rect 0 14 12 16
|
||||
rect 0 10 4 14
|
||||
rect 8 10 12 14
|
||||
rect 0 8 12 10
|
||||
rect 1 7 12 8
|
||||
rect 2 6 12 7
|
||||
rect 8 3 12 6
|
||||
rect 0 2 12 3
|
||||
rect 0 0 11 2
|
||||
<< end >>
|
||||
|
|
@ -0,0 +1,14 @@
|
|||
magic
|
||||
tech scmos
|
||||
timestamp 1534325357
|
||||
<< silk >>
|
||||
rect 4 17 12 18
|
||||
rect 2 16 12 17
|
||||
rect 1 14 12 16
|
||||
rect 0 13 5 14
|
||||
rect 0 10 4 13
|
||||
rect 8 10 12 14
|
||||
rect 0 6 12 10
|
||||
rect 0 0 4 6
|
||||
rect 8 0 12 6
|
||||
<< end >>
|
||||
|
|
@ -0,0 +1,15 @@
|
|||
magic
|
||||
tech scmos
|
||||
timestamp 1534321628
|
||||
<< silk >>
|
||||
rect 0 16 10 18
|
||||
rect 0 14 12 16
|
||||
rect 0 11 4 14
|
||||
rect 7 11 12 14
|
||||
rect 0 8 11 11
|
||||
rect 0 4 4 8
|
||||
rect 8 5 12 8
|
||||
rect 7 4 12 5
|
||||
rect 0 2 12 4
|
||||
rect 0 0 10 2
|
||||
<< end >>
|
||||
|
|
@ -0,0 +1,14 @@
|
|||
magic
|
||||
tech scmos
|
||||
timestamp 1534321654
|
||||
<< silk >>
|
||||
rect 2 16 12 18
|
||||
rect 0 14 12 16
|
||||
rect 0 12 6 14
|
||||
rect 9 12 12 14
|
||||
rect 0 6 4 12
|
||||
rect 0 4 6 6
|
||||
rect 9 4 12 6
|
||||
rect 0 2 12 4
|
||||
rect 2 0 12 2
|
||||
<< end >>
|
||||
|
|
@ -0,0 +1,17 @@
|
|||
magic
|
||||
tech scmos
|
||||
timestamp 1534321738
|
||||
<< silk >>
|
||||
rect 0 17 9 18
|
||||
rect 0 16 10 17
|
||||
rect 0 15 11 16
|
||||
rect 0 14 12 15
|
||||
rect 0 4 4 14
|
||||
rect 7 12 12 14
|
||||
rect 8 6 12 12
|
||||
rect 7 4 12 6
|
||||
rect 0 3 12 4
|
||||
rect 0 2 11 3
|
||||
rect 0 1 10 2
|
||||
rect 0 0 9 1
|
||||
<< end >>
|
||||
|
|
@ -0,0 +1,6 @@
|
|||
magic
|
||||
tech scmos
|
||||
timestamp 1534325697
|
||||
<< silk >>
|
||||
rect 0 0 4 4
|
||||
<< end >>
|
||||
|
|
@ -0,0 +1,13 @@
|
|||
magic
|
||||
tech scmos
|
||||
timestamp 1534321786
|
||||
<< silk >>
|
||||
rect 1 16 12 18
|
||||
rect 0 15 12 16
|
||||
rect 0 12 4 15
|
||||
rect 0 8 12 12
|
||||
rect 0 5 4 8
|
||||
rect 0 4 5 5
|
||||
rect 0 2 12 4
|
||||
rect 2 0 12 2
|
||||
<< end >>
|
||||
|
|
@ -0,0 +1,11 @@
|
|||
magic
|
||||
tech scmos
|
||||
timestamp 1534344057
|
||||
<< silk >>
|
||||
rect 2 17 12 18
|
||||
rect 1 16 12 17
|
||||
rect 0 14 12 16
|
||||
rect 0 10 4 14
|
||||
rect 0 6 10 10
|
||||
rect 0 0 4 6
|
||||
<< end >>
|
||||
|
|
@ -0,0 +1,17 @@
|
|||
magic
|
||||
tech scmos
|
||||
timestamp 1534322005
|
||||
<< silk >>
|
||||
rect 2 17 10 18
|
||||
rect 1 16 11 17
|
||||
rect 0 14 12 16
|
||||
rect 0 4 4 14
|
||||
rect 8 13 12 14
|
||||
rect 7 7 12 10
|
||||
rect 9 4 12 7
|
||||
rect 0 3 5 4
|
||||
rect 8 3 12 4
|
||||
rect 0 2 12 3
|
||||
rect 1 1 12 2
|
||||
rect 2 0 12 1
|
||||
<< end >>
|
||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue