Merge pull request #435 from KLayout/issue-429

Issue 429
This commit is contained in:
Matthias Köfferlein 2019-12-02 21:15:05 +01:00 committed by GitHub
commit 2fa545d80b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
288 changed files with 67702 additions and 122 deletions

View File

@ -21,6 +21,7 @@ SOURCES = \
strmcmp.cc \
strmxor.cc \
strmrun.cc \
strm2mag.cc
HEADERS = \
bdCommon.h \

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -0,0 +1,2 @@
include($$PWD/../buddy_app.pri)

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -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"
),
""
);
}

View File

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

View File

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

View File

@ -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");
}

View File

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

View File

@ -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");
}

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

BIN
testdata/magic/CHILD.mag.gz vendored Normal file

Binary file not shown.

BIN
testdata/magic/MAG_TEST.mag.gz vendored Normal file

Binary file not shown.

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -0,0 +1,6 @@
magic
tech scmos
timestamp 1534325697
<< silk >>
rect 0 0 4 4
<< end >>

View File

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

View File

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

View File

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