diff --git a/src/lay/lay/laySession.cc b/src/lay/lay/laySession.cc index f834856e2..344bee1f8 100644 --- a/src/lay/lay/laySession.cc +++ b/src/lay/lay/laySession.cc @@ -30,7 +30,10 @@ #include "layStream.h" #include "tlXMLParser.h" #include "tlStream.h" +#include "tlFileUtils.h" +#include "tlUri.h" #include "dbStream.h" +#include "dbLayoutToNetlist.h" #include "rdb.h" #include @@ -86,7 +89,16 @@ Session::fetch (const lay::MainWindow &mw) const rdb::Database *rdb = view->get_rdb (j); if (rdb && ! rdb->filename ().empty ()) { - view_desc.rdb_filenames.push_back (rdb->filename ()); + view_desc.rdb_filenames.push_back (tl::InputStream::absolute_path (rdb->filename ())); + } + + } + + for (unsigned int j = 0; j < view->num_l2ndbs (); ++j) { + + const db::LayoutToNetlist *l2ndb = view->get_l2ndb (j); + if (l2ndb && ! l2ndb->filename ().empty ()) { + view_desc.l2ndb_filenames.push_back (tl::InputStream::absolute_path (l2ndb->filename ())); } } @@ -128,6 +140,17 @@ Session::fetch (const lay::MainWindow &mw) } +std::string +Session::make_absolute (const std::string &fp) const +{ + tl::URI fp_uri (fp); + if (! m_base_dir.empty () && ! tl::is_absolute (fp_uri.path ())) { + return tl::URI (m_base_dir).resolved (fp_uri).to_string (); + } else { + return fp; + } +} + void Session::restore (lay::MainWindow &mw) { @@ -163,11 +186,7 @@ Session::restore (lay::MainWindow &mw) std::map ::const_iterator ld = ld_by_name.find (cvd->layout_name); - std::string fp = ld->second->file_path; - QFileInfo fi (tl::to_qstring (fp)); - if (! m_base_dir.empty () && fi.isRelative ()) { - fp = tl::to_string (QDir (tl::to_qstring (m_base_dir)).filePath (tl::to_qstring (ld->second->file_path))); - } + std::string fp = make_absolute (ld->second->file_path); bool ok = false; if (ld != ld_by_name.end ()) { @@ -218,13 +237,26 @@ Session::restore (lay::MainWindow &mw) for (unsigned int j = 0; j < vd.rdb_filenames.size (); ++j) { - rdb::Database *rdb = new rdb::Database (); + std::auto_ptr rdb (new rdb::Database ()); try { - rdb->load (vd.rdb_filenames[j]); - view->add_rdb (rdb); - } catch (...) { - delete rdb; + rdb->load (make_absolute (vd.rdb_filenames[j])); + view->add_rdb (rdb.release ()); + } catch (tl::Exception &ex) { + tl::error << ex.msg (); + } catch (...) { + } + + } + + for (unsigned int j = 0; j < vd.l2ndb_filenames.size (); ++j) { + + try { + db::LayoutToNetlist *l2ndb = db::LayoutToNetlist::create_from_file (make_absolute (vd.l2ndb_filenames [j])); + view->add_l2ndb (l2ndb); + } catch (tl::Exception &ex) { + tl::error << ex.msg (); + } catch (...) { } } @@ -289,6 +321,9 @@ session_structure () tl::make_element, SessionViewDescriptor> (&SessionViewDescriptor::rdb_filenames, "rdb-files", tl::make_member::const_iterator, std::vector > (&std::vector::begin, &std::vector::end, &std::vector::push_back, "rdb-file") ) + + tl::make_element, SessionViewDescriptor> (&SessionViewDescriptor::l2ndb_filenames, "l2ndb-files", + tl::make_member::const_iterator, std::vector > (&std::vector::begin, &std::vector::end, &std::vector::push_back, "l2ndb-file") + ) + // for backward compatibility: tl::make_element (&SessionViewDescriptor::set_layer_properties, "layer-properties", lay::LayerPropertiesList::xml_format ()) + tl::make_member (&SessionViewDescriptor::current_layer_list, "current-layer-property-tab") + diff --git a/src/lay/lay/laySession.h b/src/lay/lay/laySession.h index e2ae4a9a9..0b06186ee 100644 --- a/src/lay/lay/laySession.h +++ b/src/lay/lay/laySession.h @@ -112,6 +112,7 @@ struct SessionViewDescriptor std::vector layer_properties_lists; unsigned int current_layer_list; std::vector rdb_filenames; + std::vector l2ndb_filenames; SessionCellViewDescriptors cellviews; SessionAnnotationShapes annotation_shapes; int active_cellview; @@ -174,6 +175,8 @@ private: std::string m_window_state; std::string m_window_geometry; std::string m_base_dir; + + std::string make_absolute (const std::string &fp) const; }; } diff --git a/src/lay/unit_tests/laySessionTests.cc b/src/lay/unit_tests/laySessionTests.cc new file mode 100644 index 000000000..c62f8169c --- /dev/null +++ b/src/lay/unit_tests/laySessionTests.cc @@ -0,0 +1,171 @@ + +/* + + 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 "laySession.h" +#include "layMainWindow.h" +#include "layLayoutView.h" +#include "tlUnitTest.h" +#include "dbLayoutToNetlist.h" +#include "dbLayoutVsSchematic.h" +#include "rdb.h" +#include "antObject.h" +#include "antService.h" +#include "imgObject.h" +#include "imgService.h" +#include "tlFileUtils.h" + +TEST (1) +{ + lay::MainWindow *mw = lay::MainWindow::instance (); + tl_assert (mw != 0); + + mw->close_all (); + + mw->load_layout (tl::testsrc () + "/testdata/sessions/test.gds"); + + lay::LayoutView *view = mw->current_view (); + + ant::Service *ant_service = view->get_plugin (); + tl_assert (ant_service != 0); + if (ant_service) { + ant::Object ruler; + ruler.fmt ("Hello, world!"); + ant_service->insert_ruler (ruler, false /*do not observe the ruler count limit*/); + } + + img::Service *img_service = view->get_plugin (); + tl_assert (img_service != 0); + if (img_service) { + img::Object img; + img.load_data (tl::testsrc () + "/testdata/sessions/test.png"); + img_service->insert_image (img); + } + + std::auto_ptr rdb (new rdb::Database ()); + rdb->load (tl::testsrc () + "/testdata/sessions/test.lyrdb"); + view->add_rdb (rdb.release ()); + + std::auto_ptr l2ndb (db::LayoutToNetlist::create_from_file (tl::testsrc () + "/testdata/sessions/test.l2n")); + view->add_l2ndb (l2ndb.release ()); + + std::auto_ptr lvsdb (db::LayoutToNetlist::create_from_file (tl::testsrc () + "/testdata/sessions/test.lvsdb")); + view->add_l2ndb (lvsdb.release ()); + + std::string lys_file = tmp_file ("test1.lys"); + mw->save_session (lys_file); + + mw->close_all (); + + EXPECT_EQ (mw->views (), (unsigned int) 0); + mw->restore_session (lys_file); + + EXPECT_EQ (mw->views (), (unsigned int) 1); + + view = mw->current_view (); + tl_assert (view != 0); + + ant_service = view->get_plugin (); + tl_assert (ant_service != 0); + if (ant_service) { + ant::AnnotationIterator a = ant_service->begin_annotations (); + EXPECT_EQ (a.at_end (), false); + if (! a.at_end ()) { + EXPECT_EQ (a->fmt (), "Hello, world!"); + ++a; + EXPECT_EQ (a.at_end (), true); + } + } + + img_service = view->get_plugin (); + tl_assert (img_service != 0); + if (img_service) { + img::ImageIterator i = img_service->begin_images (); + EXPECT_EQ (i.at_end (), false); + if (! i.at_end ()) { + EXPECT_EQ (i->width (), (unsigned int) 256); + EXPECT_EQ (i->height (), (unsigned int) 256); + ++i; + EXPECT_EQ (i.at_end (), true); + } + } + + EXPECT_EQ (view->num_l2ndbs (), (unsigned int) 2); + EXPECT_EQ (tl::filename (view->get_l2ndb (0)->filename ()), "test.l2n"); + EXPECT_EQ (tl::filename (view->get_l2ndb (1)->filename ()), "test.lvsdb"); + EXPECT_EQ (dynamic_cast (view->get_l2ndb (1)) != 0, true); + + EXPECT_EQ (view->num_rdbs (), (unsigned int) 1); + EXPECT_EQ (tl::filename (view->get_rdb (0)->filename ()), "test.lyrdb"); +} + +// issue-353 (all paths relative to .lys file) +TEST (2) +{ + lay::MainWindow *mw = lay::MainWindow::instance (); + tl_assert (mw != 0); + + mw->close_all (); + + mw->close_all (); + + EXPECT_EQ (mw->views (), (unsigned int) 0); + mw->restore_session (tl::testsrc () + "/testdata/sessions/test_with_relative_paths.lys"); + + EXPECT_EQ (mw->views (), (unsigned int) 1); + + lay::LayoutView *view = mw->current_view (); + tl_assert (view != 0); + + ant::Service *ant_service = view->get_plugin (); + tl_assert (ant_service != 0); + if (ant_service) { + ant::AnnotationIterator a = ant_service->begin_annotations (); + EXPECT_EQ (a.at_end (), false); + if (! a.at_end ()) { + EXPECT_EQ (a->fmt (), "Hello, world!"); + ++a; + EXPECT_EQ (a.at_end (), true); + } + } + + img::Service *img_service = view->get_plugin (); + tl_assert (img_service != 0); + if (img_service) { + img::ImageIterator i = img_service->begin_images (); + EXPECT_EQ (i.at_end (), false); + if (! i.at_end ()) { + EXPECT_EQ (i->width (), (unsigned int) 256); + EXPECT_EQ (i->height (), (unsigned int) 256); + ++i; + EXPECT_EQ (i.at_end (), true); + } + } + + EXPECT_EQ (view->num_l2ndbs (), (unsigned int) 2); + EXPECT_EQ (tl::filename (view->get_l2ndb (0)->filename ()), "test.l2n"); + EXPECT_EQ (tl::filename (view->get_l2ndb (1)->filename ()), "test.lvsdb"); + EXPECT_EQ (dynamic_cast (view->get_l2ndb (1)) != 0, true); + + EXPECT_EQ (view->num_rdbs (), (unsigned int) 1); + EXPECT_EQ (tl::filename (view->get_rdb (0)->filename ()), "test.lyrdb"); +} diff --git a/src/lay/unit_tests/unit_tests.pro b/src/lay/unit_tests/unit_tests.pro index 3591a4a7f..dc5315166 100644 --- a/src/lay/unit_tests/unit_tests.pro +++ b/src/lay/unit_tests/unit_tests.pro @@ -8,9 +8,10 @@ include($$PWD/../../lib_ut.pri) SOURCES = \ laySalt.cc \ + laySessionTests.cc -INCLUDEPATH += $$LAY_INC $$TL_INC $$LAYBASIC_INC $$DB_INC $$GSI_INC -DEPENDPATH += $$LAY_INC $$TL_INC $$LAYBASIC_INC $$DB_INC $$GSI_INC +INCLUDEPATH += $$LAY_INC $$TL_INC $$LAYBASIC_INC $$DB_INC $$GSI_INC $$ANT_INC $$IMG_INC $$RDB_INC +DEPENDPATH += $$LAY_INC $$TL_INC $$LAYBASIC_INC $$DB_INC $$GSI_INC $$ANT_INC $$IMG_INC $$RDB_INC -LIBS += -L$$DESTDIR_UT -lklayout_lay -lklayout_laybasic -lklayout_db -lklayout_tl -lklayout_gsi +LIBS += -L$$DESTDIR_UT -lklayout_lay -lklayout_laybasic -lklayout_db -lklayout_tl -lklayout_gsi -lklayout_ant -lklayout_img -lklayout_rdb diff --git a/testdata/sessions/test.gds b/testdata/sessions/test.gds new file mode 100644 index 000000000..c6a7aac64 Binary files /dev/null and b/testdata/sessions/test.gds differ diff --git a/testdata/sessions/test.l2n b/testdata/sessions/test.l2n new file mode 100644 index 000000000..81bda92f4 --- /dev/null +++ b/testdata/sessions/test.l2n @@ -0,0 +1,837 @@ +#%l2n-klayout +top(RINGO) +unit(0.001) + +# Layer section +# This section lists the mask layers (drawing or derived) and their connections. + +# Mask layers +layer($3 '3/0') +layer($9 '3/1') +layer($4 '4/0') +layer($5 '5/0') +layer($6 '6/0') +layer($10 '6/1') +layer($7 '7/0') +layer($8 '8/0') +layer($11 '8/1') +layer($1) +layer($2) + +# Mask layer connectivity +connect($3 $3 $9 $5) +connect($9 $3) +connect($4 $4 $6 $1 $2) +connect($5 $3 $5 $6) +connect($6 $4 $5 $6 $10 $7) +connect($10 $6) +connect($7 $6 $7 $8) +connect($8 $7 $8 $11) +connect($11 $8) +connect($1 $4 $1) +connect($2 $4 $2) + +# Device class section +class(PMOS MOS3) +class(NMOS MOS3) + +# Device abstracts section +# Device abstracts list the pin shapes of the devices. +device(D$PMOS PMOS + terminal(S + rect($1 (-650 -475) (525 950)) + ) + terminal(G + rect($3 (-125 -475) (250 950)) + ) + terminal(D + rect($1 (125 -475) (550 950)) + ) +) +device(D$PMOS$1 PMOS + terminal(S + rect($1 (-675 -475) (550 950)) + ) + terminal(G + rect($3 (-125 -475) (250 950)) + ) + terminal(D + rect($1 (125 -475) (525 950)) + ) +) +device(D$PMOS$2 PMOS + terminal(S + rect($1 (-475 -650) (950 525)) + ) + terminal(G + rect($3 (-475 -125) (950 250)) + ) + terminal(D + rect($1 (-475 125) (950 525)) + ) +) +device(D$PMOS$3 PMOS + terminal(S + rect($1 (-650 -475) (525 950)) + ) + terminal(G + rect($3 (-125 -475) (250 950)) + ) + terminal(D + rect($1 (125 -475) (525 950)) + ) +) +device(D$NMOS NMOS + terminal(S + rect($2 (-650 -475) (525 950)) + ) + terminal(G + rect($3 (-125 -475) (250 950)) + ) + terminal(D + rect($2 (125 -475) (550 950)) + ) +) +device(D$NMOS$1 NMOS + terminal(S + rect($2 (-675 -475) (550 950)) + ) + terminal(G + rect($3 (-125 -475) (250 950)) + ) + terminal(D + rect($2 (125 -475) (525 950)) + ) +) +device(D$NMOS$2 NMOS + terminal(S + rect($2 (-475 -650) (950 525)) + ) + terminal(G + rect($3 (-475 -125) (950 250)) + ) + terminal(D + rect($2 (-475 125) (950 525)) + ) +) +device(D$NMOS$3 NMOS + terminal(S + rect($2 (-650 -475) (525 950)) + ) + terminal(G + rect($3 (-125 -475) (250 950)) + ) + terminal(D + rect($2 (125 -475) (525 950)) + ) +) + +# Circuit section +# Circuits are the hierarchical building blocks of the netlist. +circuit(INV2X + + # Nets with their geometries + net(1 + rect($3 (-125 700) (250 1500)) + rect($3 (-125 -1000) (800 500)) + rect($3 (-125 -1000) (250 1500)) + rect($3 (-250 -100) (250 1600)) + rect($3 (-1050 -1600) (250 1600)) + rect($3 (550 -4500) (250 1600)) + rect($3 (-1050 -1600) (250 1600)) + ) + net(2 + rect($4 (1090 2590) (220 220)) + rect($4 (-220 180) (220 220)) + rect($4 (-1820 -620) (220 220)) + rect($4 (-220 180) (220 220)) + rect($6 (1310 -690) (360 760)) + rect($6 (-1960 -760) (360 760)) + rect($7 (-290 -290) (220 220)) + rect($7 (-220 -620) (220 220)) + rect($7 (1380 180) (220 220)) + rect($7 (-220 -620) (220 220)) + rect($8 (-2410 -510) (3000 1200)) + rect($1 (-975 -1075) (525 950)) + rect($1 (-2100 -950) (525 950)) + ) + net(3 + rect($4 (1090 -310) (220 220)) + rect($4 (-220 180) (220 220)) + rect($4 (-1820 -620) (220 220)) + rect($4 (-220 180) (220 220)) + rect($6 (1310 -690) (360 760)) + rect($6 (-1960 -760) (360 760)) + rect($7 (-290 -290) (220 220)) + rect($7 (-220 -620) (220 220)) + rect($7 (1380 180) (220 220)) + rect($7 (-220 -620) (220 220)) + rect($8 (-2410 -510) (3000 1200)) + rect($2 (-975 -1075) (525 950)) + rect($2 (-2100 -950) (525 950)) + ) + net(4 + rect($4 (290 2590) (220 220)) + rect($4 (-220 180) (220 220)) + rect($4 (-220 -620) (220 220)) + rect($4 (-220 180) (220 220)) + rect($4 (-220 -3520) (220 220)) + rect($4 (-220 180) (220 220)) + rect($4 (-220 -620) (220 220)) + rect($4 (-220 180) (220 220)) + rect($6 (-290 -10) (360 2300)) + rect($6 (-360 -80) (360 760)) + rect($6 (-360 -760) (360 760)) + rect($6 (-360 -3660) (360 760)) + rect($6 (-360 -760) (360 760)) + rect($1 (-455 2045) (550 950)) + rect($2 (-550 -3850) (550 950)) + ) + + # Outgoing pins and their connections to nets + pin(1) + pin(2) + pin(3) + pin(4) + + # Devices and their connections + device(1 D$PMOS + device(D$PMOS$1 location(800 0)) + connect(0 S S) + connect(1 S D) + connect(0 G G) + connect(1 G G) + connect(0 D D) + connect(1 D S) + location(0 2900) + param(L 0.25) + param(W 1.9) + param(AS 0.76) + param(AD 0.76) + param(PS 4.45) + param(PD 4.45) + terminal(S 2) + terminal(G 1) + terminal(D 4) + ) + device(3 D$NMOS + device(D$NMOS$1 location(800 0)) + connect(0 S S) + connect(1 S D) + connect(0 G G) + connect(1 G G) + connect(0 D D) + connect(1 D S) + location(0 0) + param(L 0.25) + param(W 1.9) + param(AS 0.76) + param(AD 0.76) + param(PS 4.45) + param(PD 4.45) + terminal(S 3) + terminal(G 1) + terminal(D 4) + ) + +) +circuit(NAND1X + + # Nets with their geometries + net(1 + rect($4 (290 2590) (220 220)) + rect($4 (-220 180) (220 220)) + rect($4 (-220 -620) (220 220)) + rect($4 (-220 180) (220 220)) + rect($4 (580 -3520) (220 220)) + rect($4 (-220 180) (220 220)) + rect($6 (-290 -310) (360 1500)) + rect($6 (-1160 -400) (1160 400)) + rect($6 (-1160 -400) (360 1500)) + rect($6 (-360 -80) (360 760)) + rect($6 (-360 -760) (360 760)) + rect($6 (440 -3660) (360 760)) + rect($1 (-1255 2045) (550 950)) + rect($2 (250 -3850) (525 950)) + ) + net(2 + rect($4 (1090 2590) (220 220)) + rect($4 (-220 180) (220 220)) + rect($4 (-1820 -620) (220 220)) + rect($4 (-220 180) (220 220)) + rect($6 (1310 -690) (360 760)) + rect($6 (-1960 -760) (360 760)) + rect($7 (-290 -290) (220 220)) + rect($7 (-220 -620) (220 220)) + rect($7 (1380 180) (220 220)) + rect($7 (-220 -620) (220 220)) + rect($8 (-2410 -510) (3000 1200)) + rect($1 (-975 -1075) (525 950)) + rect($1 (-2100 -950) (525 950)) + ) + net(3 + rect($4 (-510 -310) (220 220)) + rect($4 (-220 180) (220 220)) + rect($6 (-290 -690) (360 760)) + rect($7 (-290 -290) (220 220)) + rect($7 (-220 -620) (220 220)) + rect($8 (-810 -510) (3000 1200)) + rect($2 (-2550 -1075) (525 950)) + ) + net(4 + rect($3 (-125 700) (250 1500)) + rect($3 (-250 -100) (250 1600)) + rect($3 (-250 -4500) (250 1600)) + ) + net(5 + rect($3 (675 700) (250 1500)) + rect($3 (-250 -100) (250 1600)) + rect($3 (-250 -4500) (250 1600)) + ) + net(6 + rect($4 (290 -310) (220 220)) + rect($4 (-220 180) (220 220)) + rect($4 (-220 -620) (220 220)) + rect($4 (-220 180) (220 220)) + rect($6 (-290 -690) (360 760)) + rect($6 (-360 -760) (360 760)) + rect($2 (-455 -855) (550 950)) + ) + + # Outgoing pins and their connections to nets + pin(1) + pin(2) + pin(3) + pin(4) + pin(5) + + # Devices and their connections + device(1 D$PMOS + location(0 2900) + param(L 0.25) + param(W 0.95) + param(AS 0.49875) + param(AD 0.26125) + param(PS 2.95) + param(PD 1.5) + terminal(S 2) + terminal(G 4) + terminal(D 1) + ) + device(2 D$PMOS$1 + location(800 2900) + param(L 0.25) + param(W 0.95) + param(AS 0.26125) + param(AD 0.49875) + param(PS 1.5) + param(PD 2.95) + terminal(S 1) + terminal(G 5) + terminal(D 2) + ) + device(3 D$NMOS + location(0 0) + param(L 0.25) + param(W 0.95) + param(AS 0.49875) + param(AD 0.26125) + param(PS 2.95) + param(PD 1.5) + terminal(S 3) + terminal(G 4) + terminal(D 6) + ) + device(4 D$NMOS$1 + location(800 0) + param(L 0.25) + param(W 0.95) + param(AS 0.26125) + param(AD 0.49875) + param(PS 1.5) + param(PD 2.95) + terminal(S 6) + terminal(G 5) + terminal(D 1) + ) + +) +circuit(INV2ALT + + # Nets with their geometries + net(1 + rect($3 (675 600) (250 2300)) + rect($3 (-250 0) (1050 200)) + rect($3 (-1725 -1900) (800 500)) + rect($3 (700 1400) (225 1300)) + rect($3 (-1850 -3700) (250 1500)) + rect($3 (-250 -3000) (250 1600)) + rect($3 (775 -225) (1600 250)) + rect($3 (-2400 3350) (1600 250)) + rect($3 (-1825 -2325) (250 1600)) + ) + net(2 + rect($4 (290 -310) (220 220)) + rect($4 (-220 180) (220 220)) + rect($4 (-220 2280) (220 220)) + rect($4 (-220 180) (220 220)) + rect($4 (880 -2220) (220 220)) + rect($4 (180 -220) (220 220)) + rect($4 (-1020 2580) (220 220)) + rect($4 (-620 -220) (220 220)) + rect($6 (-590 -3710) (360 3800)) + rect($6 (-180 -3200) (920 380)) + rect($6 (-1100 -1660) (360 760)) + rect($6 (-360 2140) (360 760)) + rect($6 (740 -2360) (760 360)) + rect($6 (-1560 2440) (760 360)) + rect($1 (-855 -430) (950 525)) + rect($1 (-1250 -1750) (525 950)) + rect($2 (575 -2550) (950 525)) + rect($2 (-2050 -1825) (525 950)) + ) + net(3 + rect($4 (990 4590) (220 220)) + rect($4 (-620 -220) (220 220)) + rect($4 (-1320 -2220) (220 220)) + rect($4 (-220 180) (220 220)) + rect($6 (810 1310) (760 360)) + rect($6 (-1860 -2360) (360 760)) + rect($7 (-290 -290) (220 220)) + rect($7 (-220 -620) (220 220)) + rect($7 (880 1780) (220 220)) + rect($7 (180 -220) (220 220)) + polygon($8 (-5510 -2510) (0 1200) (3100 0) (0 1800) (3800 0) (0 -1800) (2100 0) (0 -1200) (-2900 0) (0 2200) (-2000 0) (0 -2200)) + rect($1 (625 2125) (950 525)) + rect($1 (-2025 -2525) (525 950)) + ) + net(4 + rect($4 (1390 190) (220 220)) + rect($4 (180 -220) (220 220)) + rect($4 (-2520 -720) (220 220)) + rect($4 (-220 180) (220 220)) + rect($6 (1610 -190) (760 360)) + rect($6 (-2660 -860) (360 760)) + rect($7 (-290 -290) (220 220)) + rect($7 (-220 -620) (220 220)) + rect($7 (1680 280) (220 220)) + rect($7 (180 -220) (220 220)) + rect($8 (-6310 -1010) (9000 1200)) + rect($2 (-3475 -550) (950 525)) + rect($2 (-2825 -1050) (525 950)) + ) + + # Outgoing pins and their connections to nets + pin(1) + pin(2) + pin(3) + pin(4) + + # Devices and their connections + device(1 D$PMOS$2 + device(D$PMOS$3 location(-900 -1400)) + connect(0 S S) + connect(1 S D) + connect(0 G G) + connect(1 G G) + connect(0 D D) + connect(1 D S) + location(900 4300) + param(L 0.25) + param(W 1.9) + param(AS 0.9975) + param(AD 0.9975) + param(PS 5.9) + param(PD 5.9) + terminal(S 2) + terminal(G 1) + terminal(D 3) + ) + device(3 D$NMOS$2 + device(D$NMOS$3 location(-1700 -700)) + connect(0 S S) + connect(1 S S) + connect(0 G G) + connect(1 G G) + connect(0 D D) + connect(1 D D) + location(1700 700) + param(L 0.25) + param(W 1.9) + param(AS 0.9975) + param(AD 0.9975) + param(PS 5.9) + param(PD 5.9) + terminal(S 4) + terminal(G 1) + terminal(D 2) + ) + +) +circuit(RINGO + + # Nets with their geometries + net(1 + rect($3 (1700 1100) (1300 400)) + rect($4 (-2710 1090) (220 220)) + rect($4 (-220 180) (220 220)) + rect($4 (-220 -620) (220 220)) + rect($4 (-220 180) (220 220)) + rect($4 (-220 -3520) (220 220)) + rect($4 (-220 180) (220 220)) + rect($4 (-220 -620) (220 220)) + rect($4 (-220 180) (220 220)) + rect($5 (1290 890) (200 200)) + rect($6 (-1500 -300) (1600 400)) + ) + net(2 + rect($3 (4700 1100) (1300 400)) + rect($4 (-2710 1090) (220 220)) + rect($4 (-220 180) (220 220)) + rect($4 (-220 -620) (220 220)) + rect($4 (-220 180) (220 220)) + rect($4 (-220 -3520) (220 220)) + rect($4 (-220 180) (220 220)) + rect($4 (-220 -620) (220 220)) + rect($4 (-220 180) (220 220)) + rect($5 (1290 890) (200 200)) + rect($6 (-1500 -300) (1600 400)) + ) + net(3 + rect($3 (15000 1100) (1300 400)) + rect($4 (-4910 -1810) (220 220)) + rect($4 (-220 180) (220 220)) + rect($4 (-220 2280) (220 220)) + rect($4 (-220 180) (220 220)) + rect($4 (880 -2220) (220 220)) + rect($4 (180 -220) (220 220)) + rect($4 (-1020 2580) (220 220)) + rect($4 (-620 -220) (220 220)) + rect($5 (3190 -2810) (200 200)) + rect($6 (-2400 -300) (2500 400)) + ) + net(4 + rect($3 (18000 1100) (1300 400)) + rect($4 (-2710 1090) (220 220)) + rect($4 (-220 180) (220 220)) + rect($4 (-220 -620) (220 220)) + rect($4 (-220 180) (220 220)) + rect($4 (-220 -3520) (220 220)) + rect($4 (-220 180) (220 220)) + rect($4 (-220 -620) (220 220)) + rect($4 (-220 180) (220 220)) + rect($5 (1290 890) (200 200)) + rect($6 (-1500 -300) (1600 400)) + ) + net(5 + rect($3 (21000 1100) (1300 400)) + rect($4 (-2710 1090) (220 220)) + rect($4 (-220 180) (220 220)) + rect($4 (-220 -620) (220 220)) + rect($4 (-220 180) (220 220)) + rect($4 (-220 -3520) (220 220)) + rect($4 (-220 180) (220 220)) + rect($4 (-220 -620) (220 220)) + rect($4 (-220 180) (220 220)) + rect($5 (1290 890) (200 200)) + rect($6 (-1500 -300) (1600 400)) + ) + net(6 + rect($3 (24000 1100) (1300 400)) + rect($4 (-2710 1090) (220 220)) + rect($4 (-220 180) (220 220)) + rect($4 (-220 -620) (220 220)) + rect($4 (-220 180) (220 220)) + rect($4 (-220 -3520) (220 220)) + rect($4 (-220 180) (220 220)) + rect($4 (-220 -620) (220 220)) + rect($4 (-220 180) (220 220)) + rect($5 (1290 890) (200 200)) + rect($6 (-1500 -300) (1600 400)) + ) + net(7 + rect($3 (27000 1100) (1300 400)) + rect($4 (-2710 1090) (220 220)) + rect($4 (-220 180) (220 220)) + rect($4 (-220 -620) (220 220)) + rect($4 (-220 180) (220 220)) + rect($4 (-220 -3520) (220 220)) + rect($4 (-220 180) (220 220)) + rect($4 (-220 -620) (220 220)) + rect($4 (-220 180) (220 220)) + rect($5 (1290 890) (200 200)) + rect($6 (-1500 -300) (1600 400)) + ) + net(8 name(FB) + rect($3 (30000 1100) (1300 400)) + rect($3 (-33375 100) (1275 400)) + rect($4 (29390 590) (220 220)) + rect($4 (-220 180) (220 220)) + rect($4 (-220 -620) (220 220)) + rect($4 (-220 180) (220 220)) + rect($4 (-220 -3520) (220 220)) + rect($4 (-220 180) (220 220)) + rect($4 (-220 -620) (220 220)) + rect($4 (-220 180) (220 220)) + rect($5 (1290 890) (200 200)) + rect($5 (-31400 300) (200 200)) + rect($6 (29700 -800) (1600 400)) + rect($6 (-31600 100) (400 400)) + rect($7 (30900 -800) (200 200)) + rect($7 (-31400 300) (200 200)) + rect($8 (-300 -800) (31600 400)) + rect($8 (-31600 -400) (400 900)) + rect($11 (16399 -701) (2 2)) + ) + net(9 + rect($3 (-1300 900) (1300 400)) + rect($4 (-2710 1290) (220 220)) + rect($4 (-220 180) (220 220)) + rect($4 (-220 -620) (220 220)) + rect($4 (-220 180) (220 220)) + rect($4 (580 -3520) (220 220)) + rect($4 (-220 180) (220 220)) + rect($5 (490 690) (200 200)) + rect($6 (-800 -300) (900 400)) + ) + net(10 name(EN) + rect($3 (-4000 1200) (875 500)) + rect($9 (-476 -201) (2 2)) + ) + net(11 + rect($3 (9800 1100) (1300 400)) + rect($4 (-4810 1090) (220 220)) + rect($4 (-220 180) (220 220)) + rect($4 (-220 -620) (220 220)) + rect($4 (-220 180) (220 220)) + rect($4 (-220 -3520) (220 220)) + rect($4 (-220 180) (220 220)) + rect($4 (-220 -620) (220 220)) + rect($4 (-220 180) (220 220)) + rect($5 (3390 890) (200 200)) + rect($6 (-3600 -300) (3700 400)) + ) + net(12 name(OUT) + rect($4 (31590 2590) (220 220)) + rect($4 (-220 180) (220 220)) + rect($4 (-220 -620) (220 220)) + rect($4 (-220 180) (220 220)) + rect($4 (-220 -3520) (220 220)) + rect($4 (-220 180) (220 220)) + rect($4 (-220 -620) (220 220)) + rect($4 (-220 180) (220 220)) + rect($10 (-111 589) (2 2)) + ) + net(13 name(VDD) + rect($4 (4090 2590) (220 220)) + rect($4 (-220 180) (220 220)) + rect($4 (-1820 -620) (220 220)) + rect($4 (-220 180) (220 220)) + rect($4 (-1620 -620) (220 220)) + rect($4 (-220 180) (220 220)) + rect($4 (-1820 -620) (220 220)) + rect($4 (-220 180) (220 220)) + rect($4 (-1620 -620) (220 220)) + rect($4 (-220 180) (220 220)) + rect($4 (-1820 -620) (220 220)) + rect($4 (-220 180) (220 220)) + rect($4 (10380 -620) (220 220)) + rect($4 (-220 180) (220 220)) + rect($4 (-1820 -620) (220 220)) + rect($4 (-220 180) (220 220)) + rect($4 (6380 1380) (220 220)) + rect($4 (-620 -220) (220 220)) + rect($4 (-1320 -2220) (220 220)) + rect($4 (-220 180) (220 220)) + rect($4 (6580 -620) (220 220)) + rect($4 (-220 180) (220 220)) + rect($4 (-1820 -620) (220 220)) + rect($4 (-220 180) (220 220)) + rect($4 (4380 -620) (220 220)) + rect($4 (-220 180) (220 220)) + rect($4 (-1820 -620) (220 220)) + rect($4 (-220 180) (220 220)) + rect($4 (4380 -620) (220 220)) + rect($4 (-220 180) (220 220)) + rect($4 (-1820 -620) (220 220)) + rect($4 (-220 180) (220 220)) + rect($4 (4380 -620) (220 220)) + rect($4 (-220 180) (220 220)) + rect($4 (-1820 -620) (220 220)) + rect($4 (-220 180) (220 220)) + rect($4 (4380 -620) (220 220)) + rect($4 (-220 180) (220 220)) + rect($4 (-1820 -620) (220 220)) + rect($4 (-220 180) (220 220)) + rect($4 (4380 -620) (220 220)) + rect($4 (-220 180) (220 220)) + rect($4 (-1820 -620) (220 220)) + rect($4 (-220 180) (220 220)) + rect($6 (-26990 -690) (360 760)) + rect($6 (-1960 -760) (360 760)) + rect($6 (-1760 -760) (360 760)) + rect($6 (-1960 -760) (360 760)) + rect($6 (-1760 -760) (360 760)) + rect($6 (-1960 -760) (360 760)) + rect($6 (10240 -760) (360 760)) + rect($6 (-1960 -760) (360 760)) + rect($6 (5840 1240) (760 360)) + rect($6 (-1860 -2360) (360 760)) + rect($6 (6440 -760) (360 760)) + rect($6 (-1960 -760) (360 760)) + rect($6 (4240 -760) (360 760)) + rect($6 (-1960 -760) (360 760)) + rect($6 (4240 -760) (360 760)) + rect($6 (-1960 -760) (360 760)) + rect($6 (4240 -760) (360 760)) + rect($6 (-1960 -760) (360 760)) + rect($6 (4240 -760) (360 760)) + rect($6 (-1960 -760) (360 760)) + rect($6 (4240 -760) (360 760)) + rect($6 (-1960 -760) (360 760)) + rect($11 (-881 -381) (2 2)) + ) + net(14 name(VSS) + rect($4 (4090 -310) (220 220)) + rect($4 (-220 180) (220 220)) + rect($4 (-1820 -620) (220 220)) + rect($4 (-220 180) (220 220)) + rect($4 (-1620 -620) (220 220)) + rect($4 (-220 180) (220 220)) + rect($4 (-1820 -620) (220 220)) + rect($4 (-220 180) (220 220)) + rect($4 (-3220 -620) (220 220)) + rect($4 (-220 180) (220 220)) + rect($4 (10380 -620) (220 220)) + rect($4 (-220 180) (220 220)) + rect($4 (-1820 -620) (220 220)) + rect($4 (-220 180) (220 220)) + rect($4 (6780 -120) (220 220)) + rect($4 (180 -220) (220 220)) + rect($4 (-2520 -720) (220 220)) + rect($4 (-220 180) (220 220)) + rect($4 (6580 -620) (220 220)) + rect($4 (-220 180) (220 220)) + rect($4 (-1820 -620) (220 220)) + rect($4 (-220 180) (220 220)) + rect($4 (4380 -620) (220 220)) + rect($4 (-220 180) (220 220)) + rect($4 (-1820 -620) (220 220)) + rect($4 (-220 180) (220 220)) + rect($4 (4380 -620) (220 220)) + rect($4 (-220 180) (220 220)) + rect($4 (-1820 -620) (220 220)) + rect($4 (-220 180) (220 220)) + rect($4 (4380 -620) (220 220)) + rect($4 (-220 180) (220 220)) + rect($4 (-1820 -620) (220 220)) + rect($4 (-220 180) (220 220)) + rect($4 (4380 -620) (220 220)) + rect($4 (-220 180) (220 220)) + rect($4 (-1820 -620) (220 220)) + rect($4 (-220 180) (220 220)) + rect($4 (4380 -620) (220 220)) + rect($4 (-220 180) (220 220)) + rect($4 (-1820 -620) (220 220)) + rect($4 (-220 180) (220 220)) + rect($6 (-26990 -690) (360 760)) + rect($6 (-1960 -760) (360 760)) + rect($6 (-1760 -760) (360 760)) + rect($6 (-1960 -760) (360 760)) + rect($6 (-3360 -760) (360 760)) + rect($6 (10240 -760) (360 760)) + rect($6 (-1960 -760) (360 760)) + rect($6 (6640 -260) (760 360)) + rect($6 (-2660 -860) (360 760)) + rect($6 (6440 -760) (360 760)) + rect($6 (-1960 -760) (360 760)) + rect($6 (4240 -760) (360 760)) + rect($6 (-1960 -760) (360 760)) + rect($6 (4240 -760) (360 760)) + rect($6 (-1960 -760) (360 760)) + rect($6 (4240 -760) (360 760)) + rect($6 (-1960 -760) (360 760)) + rect($6 (4240 -760) (360 760)) + rect($6 (-1960 -760) (360 760)) + rect($6 (4240 -760) (360 760)) + rect($6 (-1960 -760) (360 760)) + rect($11 (-881 -381) (2 2)) + ) + + # Outgoing pins and their connections to nets + pin(8 name(FB)) + pin(10 name(EN)) + pin(12 name(OUT)) + pin(13 name(VDD)) + pin(14 name(VSS)) + + # Subcircuits and their connections + circuit(1 INV2X location(0 0) + pin(0 9) + pin(1 13) + pin(2 14) + pin(3 1) + ) + circuit(2 INV2X location(3000 0) + pin(0 1) + pin(1 13) + pin(2 14) + pin(3 2) + ) + circuit(3 INV2X location(6000 0) + pin(0 2) + pin(1 13) + pin(2 14) + pin(3 11) + ) + circuit(4 INV2ALT location(11100 0) + pin(0 11) + pin(1 3) + pin(2 13) + pin(3 14) + ) + circuit(5 INV2X location(16300 0) + pin(0 3) + pin(1 13) + pin(2 14) + pin(3 4) + ) + circuit(6 INV2X location(19300 0) + pin(0 4) + pin(1 13) + pin(2 14) + pin(3 5) + ) + circuit(7 INV2X location(22300 0) + pin(0 5) + pin(1 13) + pin(2 14) + pin(3 6) + ) + circuit(8 INV2X location(25300 0) + pin(0 6) + pin(1 13) + pin(2 14) + pin(3 7) + ) + circuit(9 INV2X location(28300 0) + pin(0 7) + pin(1 13) + pin(2 14) + pin(3 8) + ) + circuit(10 NAND1X location(-3000 0) + pin(0 9) + pin(1 13) + pin(2 14) + pin(3 10) + pin(4 8) + ) + circuit(11 INV2X location(31300 0) + pin(0 8) + pin(1 13) + pin(2 14) + pin(3 12) + ) + +) diff --git a/testdata/sessions/test.lvsdb b/testdata/sessions/test.lvsdb new file mode 100644 index 000000000..58faa611b --- /dev/null +++ b/testdata/sessions/test.lvsdb @@ -0,0 +1,1002 @@ +#%lvsdb-klayout + +# Layout +layout( + top(RINGO) + unit(0.001) + + # Layer section + # This section lists the mask layers (drawing or derived) and their connections. + + # Mask layers + layer(bulk '1/0') + layer(nwell '1/0') + layer(poly '3/0') + layer(poly_lbl '3/1') + layer(diff_cont '4/0') + layer(poly_cont '5/0') + layer(metal1 '6/0') + layer(metal1_lbl '6/1') + layer(via1 '7/0') + layer(metal2 '8/0') + layer(metal2_lbl '8/1') + layer(ntie) + layer(psd) + layer(ptie) + layer(nsd) + + # Mask layer connectivity + connect(nwell nwell ntie) + connect(poly poly poly_lbl poly_cont) + connect(poly_lbl poly) + connect(diff_cont diff_cont metal1 ntie psd ptie nsd) + connect(poly_cont poly poly_cont metal1) + connect(metal1 diff_cont poly_cont metal1 metal1_lbl via1) + connect(metal1_lbl metal1) + connect(via1 metal1 via1 metal2) + connect(metal2 via1 metal2 metal2_lbl) + connect(metal2_lbl metal2) + connect(ntie nwell diff_cont ntie) + connect(psd diff_cont psd) + connect(ptie diff_cont ptie) + connect(nsd diff_cont nsd) + + # Global nets and connectivity + global(bulk BULK) + global(ptie BULK) + + # Device class section + class(PMOS MOS4) + class(NMOS MOS4) + + # Device abstracts section + # Device abstracts list the pin shapes of the devices. + device(D$PMOS PMOS + terminal(S + rect(psd (-650 -875) (525 1750)) + ) + terminal(G + rect(poly (-125 -875) (250 1750)) + ) + terminal(D + rect(psd (125 -875) (550 1750)) + ) + terminal(B + rect(nwell (-125 -875) (250 1750)) + ) + ) + device(D$PMOS$1 PMOS + terminal(S + rect(psd (-675 -875) (550 1750)) + ) + terminal(G + rect(poly (-125 -875) (250 1750)) + ) + terminal(D + rect(psd (125 -875) (525 1750)) + ) + terminal(B + rect(nwell (-125 -875) (250 1750)) + ) + ) + device(D$NMOS NMOS + terminal(S + rect(nsd (-650 -875) (525 1750)) + ) + terminal(G + rect(poly (-125 -875) (250 1750)) + ) + terminal(D + rect(nsd (125 -875) (550 1750)) + ) + terminal(B + rect(bulk (-125 -875) (250 1750)) + ) + ) + device(D$NMOS$1 NMOS + terminal(S + rect(nsd (-675 -875) (550 1750)) + ) + terminal(G + rect(poly (-125 -875) (250 1750)) + ) + terminal(D + rect(nsd (125 -875) (525 1750)) + ) + terminal(B + rect(bulk (-125 -875) (250 1750)) + ) + ) + + # Circuit section + # Circuits are the hierarchical building blocks of the netlist. + circuit(INV2 + + # Circuit boundary + rect((-1700 -2440) (3100 7820)) + + # Nets with their geometries + net(1 + rect(nwell (-1400 1800) (2800 3580)) + rect(diff_cont (-1510 -650) (220 220)) + rect(ntie (-510 -450) (800 680)) + ) + net(2 name(IN) + rect(poly (-525 -250) (250 2500)) + rect(poly (-1425 -630) (2100 360)) + rect(poly (-125 -2230) (250 2500)) + rect(poly (-1050 -3850) (250 2400)) + rect(poly (550 1200) (250 2400)) + rect(poly (-250 -6000) (250 2400)) + rect(poly (-1050 1200) (250 2400)) + rect(poly_lbl (-526 -2601) (2 2)) + rect(poly_cont (-831 -111) (220 220)) + ) + net(3 name(OUT) + rect(diff_cont (-910 90) (220 220)) + rect(diff_cont (-220 -620) (220 220)) + rect(diff_cont (-220 -620) (220 220)) + rect(diff_cont (-220 -620) (220 220)) + rect(diff_cont (1380 3380) (220 220)) + rect(diff_cont (-220 180) (220 220)) + rect(diff_cont (-220 180) (220 220)) + rect(diff_cont (-220 180) (220 220)) + rect(diff_cont (-220 -3820) (220 220)) + rect(diff_cont (-220 -620) (220 220)) + rect(diff_cont (-220 -620) (220 220)) + rect(diff_cont (-220 -620) (220 220)) + rect(diff_cont (-1820 3380) (220 220)) + rect(diff_cont (-220 180) (220 220)) + rect(diff_cont (-220 180) (220 220)) + rect(diff_cont (-220 180) (220 220)) + rect(metal1 (1310 -3710) (360 2220)) + rect(metal1 (-1900 -800) (2220 360)) + rect(metal1 (-2280 -2400) (360 2840)) + rect(metal1 (-360 -3600) (360 1560)) + rect(metal1 (1240 2040) (360 1560)) + rect(metal1 (-360 -5160) (360 1560)) + rect(metal1 (-1960 2040) (360 1560)) + rect(metal1_lbl (1419 -2181) (2 2)) + rect(psd (-276 524) (525 1750)) + rect(psd (-2100 -1750) (525 1750)) + rect(nsd (1050 -5350) (525 1750)) + rect(nsd (-2100 -1750) (525 1750)) + ) + net(4 name(VSS) + rect(diff_cont (-110 90) (220 220)) + rect(diff_cont (-220 -620) (220 220)) + rect(diff_cont (-220 -620) (220 220)) + rect(diff_cont (-220 -620) (220 220)) + rect(diff_cont (-220 980) (220 220)) + rect(diff_cont (-220 -620) (220 220)) + rect(diff_cont (-220 -620) (220 220)) + rect(diff_cont (-220 -620) (220 220)) + rect(metal1 (-290 -290) (360 1560)) + rect(metal1 (-360 -1560) (360 1560)) + rect(via1 (-305 -705) (250 250)) + rect(via1 (-250 150) (250 250)) + rect(via1 (-250 -1450) (250 250)) + rect(via1 (-250 150) (250 250)) + rect(metal2 (-1525 -775) (2800 1700)) + rect(metal2_lbl (-161 -541) (2 2)) + rect(nsd (-1516 -1186) (550 1750)) + ) + net(5 name(VDD) + rect(diff_cont (-110 2490) (220 220)) + rect(diff_cont (-220 180) (220 220)) + rect(diff_cont (-220 180) (220 220)) + rect(diff_cont (-220 180) (220 220)) + rect(diff_cont (-220 -1420) (220 220)) + rect(diff_cont (-220 180) (220 220)) + rect(diff_cont (-220 180) (220 220)) + rect(diff_cont (-220 180) (220 220)) + rect(metal1 (-290 -1490) (360 1560)) + rect(metal1 (-360 -1560) (360 1560)) + rect(via1 (-305 -1505) (250 250)) + rect(via1 (-250 150) (250 250)) + rect(via1 (-250 150) (250 250)) + rect(via1 (-250 150) (250 250)) + rect(metal2 (-1525 -1575) (2800 1700)) + rect(metal2_lbl (-151 -1251) (2 2)) + rect(psd (-1526 -476) (550 1750)) + ) + net(6 name(BULK) + rect(diff_cont (-110 -2160) (220 220)) + rect(ptie (-510 -450) (800 680)) + ) + + # Outgoing pins and their connections to nets + pin(1) + pin(2 name(IN)) + pin(3 name(OUT)) + pin(4 name(VSS)) + pin(5 name(VDD)) + pin(6 name(BULK)) + + # Devices and their connections + device(1 D$PMOS + device(D$PMOS$1 location(800 0)) + connect(0 S S) + connect(1 S D) + connect(0 G G) + connect(1 G G) + connect(0 D D) + connect(1 D S) + connect(0 B B) + connect(1 B B) + location(-400 3200) + param(L 0.25) + param(W 3.5) + param(AS 1.4) + param(AD 1.4) + param(PS 6.85) + param(PD 6.85) + terminal(S 3) + terminal(G 2) + terminal(D 5) + terminal(B 1) + ) + device(2 D$NMOS + device(D$NMOS$1 location(800 0)) + connect(0 S S) + connect(1 S D) + connect(0 G G) + connect(1 G G) + connect(0 D D) + connect(1 D S) + connect(0 B B) + connect(1 B B) + location(-400 -400) + param(L 0.25) + param(W 3.5) + param(AS 1.4) + param(AD 1.4) + param(PS 6.85) + param(PD 6.85) + terminal(S 3) + terminal(G 2) + terminal(D 4) + terminal(B 6) + ) + + ) + circuit(INV2PAIR + + # Circuit boundary + rect((0 -1640) (5740 7820)) + + # Nets with their geometries + net(1 name(BULK)) + net(2 + rect(diff_cont (4230 3290) (220 220)) + rect(diff_cont (-220 180) (220 220)) + rect(diff_cont (-220 180) (220 220)) + rect(diff_cont (-220 180) (220 220)) + rect(diff_cont (-220 -1420) (220 220)) + rect(diff_cont (-220 180) (220 220)) + rect(diff_cont (-220 180) (220 220)) + rect(diff_cont (-220 180) (220 220)) + rect(diff_cont (-2860 -1420) (220 220)) + rect(diff_cont (-220 180) (220 220)) + rect(diff_cont (-220 180) (220 220)) + rect(diff_cont (-220 180) (220 220)) + rect(diff_cont (-220 -1420) (220 220)) + rect(diff_cont (-220 180) (220 220)) + rect(diff_cont (-220 180) (220 220)) + rect(diff_cont (-220 180) (220 220)) + rect(metal1 (2350 -1490) (360 1560)) + rect(metal1 (-360 -1560) (360 1560)) + rect(metal1 (-3000 -1560) (360 1560)) + rect(metal1 (-360 -1560) (360 1560)) + ) + net(3 + rect(diff_cont (4230 890) (220 220)) + rect(diff_cont (-220 -620) (220 220)) + rect(diff_cont (-220 -620) (220 220)) + rect(diff_cont (-220 -620) (220 220)) + rect(diff_cont (-220 980) (220 220)) + rect(diff_cont (-220 -620) (220 220)) + rect(diff_cont (-220 -620) (220 220)) + rect(diff_cont (-220 -620) (220 220)) + rect(diff_cont (-2860 980) (220 220)) + rect(diff_cont (-220 -620) (220 220)) + rect(diff_cont (-220 -620) (220 220)) + rect(diff_cont (-220 -620) (220 220)) + rect(diff_cont (-220 980) (220 220)) + rect(diff_cont (-220 -620) (220 220)) + rect(diff_cont (-220 -620) (220 220)) + rect(diff_cont (-220 -620) (220 220)) + rect(metal1 (2350 -290) (360 1560)) + rect(metal1 (-360 -1560) (360 1560)) + rect(metal1 (-3000 -1560) (360 1560)) + rect(metal1 (-360 -1560) (360 1560)) + ) + net(4 + rect(diff_cont (790 890) (220 220)) + rect(diff_cont (-220 -620) (220 220)) + rect(diff_cont (-220 -620) (220 220)) + rect(diff_cont (-220 -620) (220 220)) + rect(diff_cont (1380 3380) (220 220)) + rect(diff_cont (-220 180) (220 220)) + rect(diff_cont (-220 180) (220 220)) + rect(diff_cont (-220 180) (220 220)) + rect(diff_cont (-220 -3820) (220 220)) + rect(diff_cont (-220 -620) (220 220)) + rect(diff_cont (-220 -620) (220 220)) + rect(diff_cont (-220 -620) (220 220)) + rect(diff_cont (-1820 3380) (220 220)) + rect(diff_cont (-220 180) (220 220)) + rect(diff_cont (-220 180) (220 220)) + rect(diff_cont (-220 180) (220 220)) + ) + net(5) + net(6 + rect(diff_cont (3430 890) (220 220)) + rect(diff_cont (-220 -620) (220 220)) + rect(diff_cont (-220 -620) (220 220)) + rect(diff_cont (-220 -620) (220 220)) + rect(diff_cont (1380 3380) (220 220)) + rect(diff_cont (-220 180) (220 220)) + rect(diff_cont (-220 180) (220 220)) + rect(diff_cont (-220 180) (220 220)) + rect(diff_cont (-220 -3820) (220 220)) + rect(diff_cont (-220 -620) (220 220)) + rect(diff_cont (-220 -620) (220 220)) + rect(diff_cont (-220 -620) (220 220)) + rect(diff_cont (-1820 3380) (220 220)) + rect(diff_cont (-220 180) (220 220)) + rect(diff_cont (-220 180) (220 220)) + rect(diff_cont (-220 180) (220 220)) + ) + net(7) + + # Outgoing pins and their connections to nets + pin(1 name(BULK)) + pin(2) + pin(3) + pin(4) + pin(5) + pin(6) + pin(7) + + # Subcircuits and their connections + circuit(1 INV2 location(1700 800) + pin(0 7) + pin(1 5) + pin(2 4) + pin(3 3) + pin(4 2) + pin(5 1) + ) + circuit(2 INV2 location(4340 800) + pin(0 7) + pin(1 4) + pin(2 6) + pin(3 3) + pin(4 2) + pin(5 1) + ) + + ) + circuit(RINGO + + # Circuit boundary + rect((-1720 -2440) (26880 7820)) + + # Nets with their geometries + net(1 name(FB) + rect(diff_cont (20210 90) (220 220)) + rect(diff_cont (-220 -620) (220 220)) + rect(diff_cont (-220 -620) (220 220)) + rect(diff_cont (-220 -620) (220 220)) + rect(diff_cont (1380 3380) (220 220)) + rect(diff_cont (-220 180) (220 220)) + rect(diff_cont (-220 180) (220 220)) + rect(diff_cont (-220 180) (220 220)) + rect(diff_cont (-220 -3820) (220 220)) + rect(diff_cont (-220 -620) (220 220)) + rect(diff_cont (-220 -620) (220 220)) + rect(diff_cont (-220 -620) (220 220)) + rect(diff_cont (-1820 3380) (220 220)) + rect(diff_cont (-220 180) (220 220)) + rect(diff_cont (-220 180) (220 220)) + rect(diff_cont (-220 180) (220 220)) + rect(metal1 (-22130 -2290) (360 360)) + rect(via1 (-305 -305) (250 250)) + rect(via1 (23190 -250) (250 250)) + rect(metal2 (-23765 -325) (23840 400)) + rect(metal2_lbl (-22121 -201) (2 2)) + ) + net(2 name(OSC) + rect(diff_cont (22850 90) (220 220)) + rect(diff_cont (-220 -620) (220 220)) + rect(diff_cont (-220 -620) (220 220)) + rect(diff_cont (-220 -620) (220 220)) + rect(diff_cont (1380 3380) (220 220)) + rect(diff_cont (-220 180) (220 220)) + rect(diff_cont (-220 180) (220 220)) + rect(diff_cont (-220 180) (220 220)) + rect(diff_cont (-220 -3820) (220 220)) + rect(diff_cont (-220 -620) (220 220)) + rect(diff_cont (-220 -620) (220 220)) + rect(diff_cont (-220 -620) (220 220)) + rect(diff_cont (-1820 3380) (220 220)) + rect(diff_cont (-220 180) (220 220)) + rect(diff_cont (-220 180) (220 220)) + rect(diff_cont (-220 180) (220 220)) + rect(via1 (1365 -2235) (250 250)) + rect(metal2 (-325 -325) (400 400)) + rect(metal2_lbl (-201 -201) (2 2)) + ) + net(3 name(VDD) + rect(diff_cont (7810 2490) (220 220)) + rect(diff_cont (-220 180) (220 220)) + rect(diff_cont (-220 180) (220 220)) + rect(diff_cont (-220 180) (220 220)) + rect(diff_cont (-220 -1420) (220 220)) + rect(diff_cont (-220 180) (220 220)) + rect(diff_cont (-220 180) (220 220)) + rect(diff_cont (-220 180) (220 220)) + rect(diff_cont (-2860 -1420) (220 220)) + rect(diff_cont (-220 180) (220 220)) + rect(diff_cont (-220 180) (220 220)) + rect(diff_cont (-220 180) (220 220)) + rect(diff_cont (-220 -1420) (220 220)) + rect(diff_cont (-220 180) (220 220)) + rect(diff_cont (-220 180) (220 220)) + rect(diff_cont (-220 180) (220 220)) + rect(diff_cont (-2860 -1420) (220 220)) + rect(diff_cont (-220 180) (220 220)) + rect(diff_cont (-220 180) (220 220)) + rect(diff_cont (-220 180) (220 220)) + rect(diff_cont (-220 -1420) (220 220)) + rect(diff_cont (-220 180) (220 220)) + rect(diff_cont (-220 180) (220 220)) + rect(diff_cont (-220 180) (220 220)) + rect(diff_cont (-2860 -1420) (220 220)) + rect(diff_cont (-220 180) (220 220)) + rect(diff_cont (-220 180) (220 220)) + rect(diff_cont (-220 180) (220 220)) + rect(diff_cont (-220 -1420) (220 220)) + rect(diff_cont (-220 180) (220 220)) + rect(diff_cont (-220 180) (220 220)) + rect(diff_cont (-220 180) (220 220)) + rect(diff_cont (12980 -1420) (220 220)) + rect(diff_cont (-220 180) (220 220)) + rect(diff_cont (-220 180) (220 220)) + rect(diff_cont (-220 180) (220 220)) + rect(diff_cont (-220 -1420) (220 220)) + rect(diff_cont (-220 180) (220 220)) + rect(diff_cont (-220 180) (220 220)) + rect(diff_cont (-220 180) (220 220)) + rect(diff_cont (-2860 -1420) (220 220)) + rect(diff_cont (-220 180) (220 220)) + rect(diff_cont (-220 180) (220 220)) + rect(diff_cont (-220 180) (220 220)) + rect(diff_cont (-220 -1420) (220 220)) + rect(diff_cont (-220 180) (220 220)) + rect(diff_cont (-220 180) (220 220)) + rect(diff_cont (-220 180) (220 220)) + rect(diff_cont (7700 -1420) (220 220)) + rect(diff_cont (-220 180) (220 220)) + rect(diff_cont (-220 180) (220 220)) + rect(diff_cont (-220 180) (220 220)) + rect(diff_cont (-220 -1420) (220 220)) + rect(diff_cont (-220 180) (220 220)) + rect(diff_cont (-220 180) (220 220)) + rect(diff_cont (-220 180) (220 220)) + rect(diff_cont (-2860 -1420) (220 220)) + rect(diff_cont (-220 180) (220 220)) + rect(diff_cont (-220 180) (220 220)) + rect(diff_cont (-220 180) (220 220)) + rect(diff_cont (-220 -1420) (220 220)) + rect(diff_cont (-220 180) (220 220)) + rect(diff_cont (-220 180) (220 220)) + rect(diff_cont (-220 180) (220 220)) + rect(diff_cont (7700 -1420) (220 220)) + rect(diff_cont (-220 180) (220 220)) + rect(diff_cont (-220 180) (220 220)) + rect(diff_cont (-220 180) (220 220)) + rect(diff_cont (-220 -1420) (220 220)) + rect(diff_cont (-220 180) (220 220)) + rect(diff_cont (-220 180) (220 220)) + rect(diff_cont (-220 180) (220 220)) + rect(diff_cont (-2860 -1420) (220 220)) + rect(diff_cont (-220 180) (220 220)) + rect(diff_cont (-220 180) (220 220)) + rect(diff_cont (-220 180) (220 220)) + rect(diff_cont (-220 -1420) (220 220)) + rect(diff_cont (-220 180) (220 220)) + rect(diff_cont (-220 180) (220 220)) + rect(diff_cont (-220 180) (220 220)) + rect(metal1 (-21410 -10) (360 1120)) + rect(metal1 (2280 -1120) (360 1120)) + rect(metal1 (2280 -1120) (360 1120)) + rect(metal1 (2280 -1120) (360 1120)) + rect(metal1 (2280 -1120) (360 1120)) + rect(metal1 (2280 -1120) (360 1120)) + rect(metal1 (2280 -1120) (360 1120)) + rect(metal1 (2280 -1120) (360 1120)) + rect(metal1 (2280 -1120) (360 1120)) + rect(metal1 (2280 -1120) (360 1120)) + rect(metal1 (-16200 -2600) (360 1560)) + rect(metal1 (-360 -1560) (360 1560)) + rect(metal1 (-3000 -1560) (360 1560)) + rect(metal1 (-360 -1560) (360 1560)) + rect(metal1 (-3000 -1560) (360 1560)) + rect(metal1 (-360 -1560) (360 1560)) + rect(metal1 (-3000 -1560) (360 1560)) + rect(metal1 (-360 -1560) (360 1560)) + rect(metal1 (12840 -1560) (360 1560)) + rect(metal1 (-360 -1560) (360 1560)) + rect(metal1 (-3000 -1560) (360 1560)) + rect(metal1 (-360 -1560) (360 1560)) + rect(metal1 (7560 -1560) (360 1560)) + rect(metal1 (-360 -1560) (360 1560)) + rect(metal1 (-3000 -1560) (360 1560)) + rect(metal1 (-360 -1560) (360 1560)) + rect(metal1 (7560 -1560) (360 1560)) + rect(metal1 (-360 -1560) (360 1560)) + rect(metal1 (-3000 -1560) (360 1560)) + rect(metal1 (-360 -1560) (360 1560)) + rect(metal2_lbl (-21301 -1181) (2 2)) + ) + net(4 name(VSS) + rect(diff_cont (7810 90) (220 220)) + rect(diff_cont (-220 -620) (220 220)) + rect(diff_cont (-220 -620) (220 220)) + rect(diff_cont (-220 -620) (220 220)) + rect(diff_cont (-220 980) (220 220)) + rect(diff_cont (-220 -620) (220 220)) + rect(diff_cont (-220 -620) (220 220)) + rect(diff_cont (-220 -620) (220 220)) + rect(diff_cont (-2860 980) (220 220)) + rect(diff_cont (-220 -620) (220 220)) + rect(diff_cont (-220 -620) (220 220)) + rect(diff_cont (-220 -620) (220 220)) + rect(diff_cont (-220 980) (220 220)) + rect(diff_cont (-220 -620) (220 220)) + rect(diff_cont (-220 -620) (220 220)) + rect(diff_cont (-220 -620) (220 220)) + rect(diff_cont (-2860 980) (220 220)) + rect(diff_cont (-220 -620) (220 220)) + rect(diff_cont (-220 -620) (220 220)) + rect(diff_cont (-220 -620) (220 220)) + rect(diff_cont (-220 980) (220 220)) + rect(diff_cont (-220 -620) (220 220)) + rect(diff_cont (-220 -620) (220 220)) + rect(diff_cont (-220 -620) (220 220)) + rect(diff_cont (-2860 980) (220 220)) + rect(diff_cont (-220 -620) (220 220)) + rect(diff_cont (-220 -620) (220 220)) + rect(diff_cont (-220 -620) (220 220)) + rect(diff_cont (-220 980) (220 220)) + rect(diff_cont (-220 -620) (220 220)) + rect(diff_cont (-220 -620) (220 220)) + rect(diff_cont (-220 -620) (220 220)) + rect(diff_cont (12980 980) (220 220)) + rect(diff_cont (-220 -620) (220 220)) + rect(diff_cont (-220 -620) (220 220)) + rect(diff_cont (-220 -620) (220 220)) + rect(diff_cont (-220 980) (220 220)) + rect(diff_cont (-220 -620) (220 220)) + rect(diff_cont (-220 -620) (220 220)) + rect(diff_cont (-220 -620) (220 220)) + rect(diff_cont (-2860 980) (220 220)) + rect(diff_cont (-220 -620) (220 220)) + rect(diff_cont (-220 -620) (220 220)) + rect(diff_cont (-220 -620) (220 220)) + rect(diff_cont (-220 980) (220 220)) + rect(diff_cont (-220 -620) (220 220)) + rect(diff_cont (-220 -620) (220 220)) + rect(diff_cont (-220 -620) (220 220)) + rect(diff_cont (7700 980) (220 220)) + rect(diff_cont (-220 -620) (220 220)) + rect(diff_cont (-220 -620) (220 220)) + rect(diff_cont (-220 -620) (220 220)) + rect(diff_cont (-220 980) (220 220)) + rect(diff_cont (-220 -620) (220 220)) + rect(diff_cont (-220 -620) (220 220)) + rect(diff_cont (-220 -620) (220 220)) + rect(diff_cont (-2860 980) (220 220)) + rect(diff_cont (-220 -620) (220 220)) + rect(diff_cont (-220 -620) (220 220)) + rect(diff_cont (-220 -620) (220 220)) + rect(diff_cont (-220 980) (220 220)) + rect(diff_cont (-220 -620) (220 220)) + rect(diff_cont (-220 -620) (220 220)) + rect(diff_cont (-220 -620) (220 220)) + rect(diff_cont (7700 980) (220 220)) + rect(diff_cont (-220 -620) (220 220)) + rect(diff_cont (-220 -620) (220 220)) + rect(diff_cont (-220 -620) (220 220)) + rect(diff_cont (-220 980) (220 220)) + rect(diff_cont (-220 -620) (220 220)) + rect(diff_cont (-220 -620) (220 220)) + rect(diff_cont (-220 -620) (220 220)) + rect(diff_cont (-2860 980) (220 220)) + rect(diff_cont (-220 -620) (220 220)) + rect(diff_cont (-220 -620) (220 220)) + rect(diff_cont (-220 -620) (220 220)) + rect(diff_cont (-220 980) (220 220)) + rect(diff_cont (-220 -620) (220 220)) + rect(diff_cont (-220 -620) (220 220)) + rect(diff_cont (-220 -620) (220 220)) + rect(metal1 (-21410 -1330) (360 1120)) + rect(metal1 (2280 -1120) (360 1120)) + rect(metal1 (2280 -1120) (360 1120)) + rect(metal1 (2280 -1120) (360 1120)) + rect(metal1 (2280 -1120) (360 1120)) + rect(metal1 (2280 -1120) (360 1120)) + rect(metal1 (2280 -1120) (360 1120)) + rect(metal1 (2280 -1120) (360 1120)) + rect(metal1 (2280 -1120) (360 1120)) + rect(metal1 (2280 -1120) (360 1120)) + rect(metal1 (-16200 -80) (360 1560)) + rect(metal1 (-360 -1560) (360 1560)) + rect(metal1 (-3000 -1560) (360 1560)) + rect(metal1 (-360 -1560) (360 1560)) + rect(metal1 (-3000 -1560) (360 1560)) + rect(metal1 (-360 -1560) (360 1560)) + rect(metal1 (-3000 -1560) (360 1560)) + rect(metal1 (-360 -1560) (360 1560)) + rect(metal1 (12840 -1560) (360 1560)) + rect(metal1 (-360 -1560) (360 1560)) + rect(metal1 (-3000 -1560) (360 1560)) + rect(metal1 (-360 -1560) (360 1560)) + rect(metal1 (7560 -1560) (360 1560)) + rect(metal1 (-360 -1560) (360 1560)) + rect(metal1 (-3000 -1560) (360 1560)) + rect(metal1 (-360 -1560) (360 1560)) + rect(metal1 (7560 -1560) (360 1560)) + rect(metal1 (-360 -1560) (360 1560)) + rect(metal1 (-3000 -1560) (360 1560)) + rect(metal1 (-360 -1560) (360 1560)) + rect(metal2_lbl (-21301 -381) (2 2)) + ) + net(5 + rect(diff_cont (1730 90) (220 220)) + rect(diff_cont (-220 -620) (220 220)) + rect(diff_cont (-220 -620) (220 220)) + rect(diff_cont (-220 -620) (220 220)) + rect(diff_cont (1380 3380) (220 220)) + rect(diff_cont (-220 180) (220 220)) + rect(diff_cont (-220 180) (220 220)) + rect(diff_cont (-220 180) (220 220)) + rect(diff_cont (-220 -3820) (220 220)) + rect(diff_cont (-220 -620) (220 220)) + rect(diff_cont (-220 -620) (220 220)) + rect(diff_cont (-220 -620) (220 220)) + rect(diff_cont (-1820 3380) (220 220)) + rect(diff_cont (-220 180) (220 220)) + rect(diff_cont (-220 180) (220 220)) + rect(diff_cont (-220 180) (220 220)) + ) + net(6 + rect(diff_cont (17570 90) (220 220)) + rect(diff_cont (-220 -620) (220 220)) + rect(diff_cont (-220 -620) (220 220)) + rect(diff_cont (-220 -620) (220 220)) + rect(diff_cont (1380 3380) (220 220)) + rect(diff_cont (-220 180) (220 220)) + rect(diff_cont (-220 180) (220 220)) + rect(diff_cont (-220 180) (220 220)) + rect(diff_cont (-220 -3820) (220 220)) + rect(diff_cont (-220 -620) (220 220)) + rect(diff_cont (-220 -620) (220 220)) + rect(diff_cont (-220 -620) (220 220)) + rect(diff_cont (-1820 3380) (220 220)) + rect(diff_cont (-220 180) (220 220)) + rect(diff_cont (-220 180) (220 220)) + rect(diff_cont (-220 180) (220 220)) + ) + net(7 + rect(diff_cont (12290 90) (220 220)) + rect(diff_cont (-220 -620) (220 220)) + rect(diff_cont (-220 -620) (220 220)) + rect(diff_cont (-220 -620) (220 220)) + rect(diff_cont (1380 3380) (220 220)) + rect(diff_cont (-220 180) (220 220)) + rect(diff_cont (-220 180) (220 220)) + rect(diff_cont (-220 180) (220 220)) + rect(diff_cont (-220 -3820) (220 220)) + rect(diff_cont (-220 -620) (220 220)) + rect(diff_cont (-220 -620) (220 220)) + rect(diff_cont (-220 -620) (220 220)) + rect(diff_cont (-1820 3380) (220 220)) + rect(diff_cont (-220 180) (220 220)) + rect(diff_cont (-220 180) (220 220)) + rect(diff_cont (-220 180) (220 220)) + ) + net(8 + rect(diff_cont (7010 90) (220 220)) + rect(diff_cont (-220 -620) (220 220)) + rect(diff_cont (-220 -620) (220 220)) + rect(diff_cont (-220 -620) (220 220)) + rect(diff_cont (1380 3380) (220 220)) + rect(diff_cont (-220 180) (220 220)) + rect(diff_cont (-220 180) (220 220)) + rect(diff_cont (-220 180) (220 220)) + rect(diff_cont (-220 -3820) (220 220)) + rect(diff_cont (-220 -620) (220 220)) + rect(diff_cont (-220 -620) (220 220)) + rect(diff_cont (-220 -620) (220 220)) + rect(diff_cont (-1820 3380) (220 220)) + rect(diff_cont (-220 180) (220 220)) + rect(diff_cont (-220 180) (220 220)) + rect(diff_cont (-220 180) (220 220)) + ) + + # Outgoing pins and their connections to nets + pin(1 name(FB)) + pin(2 name(OSC)) + pin(3 name(VDD)) + pin(4 name(VSS)) + + # Subcircuits and their connections + circuit(1 INV2PAIR location(19420 -800) + pin(0 4) + pin(1 3) + pin(2 4) + pin(3 1) + pin(4 6) + pin(5 2) + pin(6 3) + ) + circuit(2 INV2PAIR location(-1700 -800) + pin(0 4) + pin(1 3) + pin(2 4) + pin(4 1) + pin(5 5) + pin(6 3) + ) + circuit(3 INV2PAIR location(3580 -800) + pin(0 4) + pin(1 3) + pin(2 4) + pin(4 5) + pin(5 8) + pin(6 3) + ) + circuit(4 INV2PAIR location(8860 -800) + pin(0 4) + pin(1 3) + pin(2 4) + pin(4 8) + pin(5 7) + pin(6 3) + ) + circuit(5 INV2PAIR location(14140 -800) + pin(0 4) + pin(1 3) + pin(2 4) + pin(4 7) + pin(5 6) + pin(6 3) + ) + + ) +) + +# Reference netlist +reference( + + # Device class section + class(PMOS MOS4) + class(NMOS MOS4) + + # Circuit section + # Circuits are the hierarchical building blocks of the netlist. + circuit(INV2 + + # Nets + net(1 name('1')) + net(2 name('2')) + net(3 name('3')) + net(4 name('4')) + net(5 name('5')) + net(6 name('6')) + + # Outgoing pins and their connections to nets + pin(1 name('1')) + pin(2 name('2')) + pin(3 name('3')) + pin(4 name('4')) + pin(5 name('5')) + pin(6 name('6')) + + # Devices and their connections + device(1 PMOS + name($1) + param(L 0.25) + param(W 3.5) + param(AS 1.4) + param(AD 1.4) + param(PS 6.85) + param(PD 6.85) + terminal(S 3) + terminal(G 2) + terminal(D 5) + terminal(B 1) + ) + device(2 NMOS + name($3) + param(L 0.25) + param(W 3.5) + param(AS 1.4) + param(AD 1.4) + param(PS 6.85) + param(PD 6.85) + terminal(S 3) + terminal(G 2) + terminal(D 4) + terminal(B 6) + ) + + ) + circuit(INV2PAIR + + # Nets + net(1 name('1')) + net(2 name('2')) + net(3 name('3')) + net(4 name('4')) + net(5 name('5')) + net(6 name('6')) + net(7 name('7')) + + # Outgoing pins and their connections to nets + pin(1 name('1')) + pin(2 name('2')) + pin(3 name('3')) + pin(4 name('4')) + pin(5 name('5')) + pin(6 name('6')) + pin(7 name('7')) + + # Subcircuits and their connections + circuit(1 INV2 name($1) + pin(0 7) + pin(1 5) + pin(2 4) + pin(3 3) + pin(4 2) + pin(5 1) + ) + circuit(2 INV2 name($2) + pin(0 7) + pin(1 4) + pin(2 6) + pin(3 3) + pin(4 2) + pin(5 1) + ) + + ) + circuit(RINGO + + # Nets + net(1 name('1')) + net(2 name('2')) + net(3 name('3')) + net(4 name('4')) + net(5 name('6')) + net(6 name('5')) + net(7 name('8')) + net(8 name('7')) + + # Outgoing pins and their connections to nets + pin(1 name('1')) + pin(2 name('2')) + pin(3 name('3')) + pin(4 name('4')) + + # Subcircuits and their connections + circuit(1 INV2PAIR name($1) + pin(0 4) + pin(1 3) + pin(2 4) + pin(3 1) + pin(4 5) + pin(5 2) + pin(6 3) + ) + circuit(2 INV2PAIR name($2) + pin(0 4) + pin(1 3) + pin(2 4) + pin(4 1) + pin(5 6) + pin(6 3) + ) + circuit(3 INV2PAIR name($3) + pin(0 4) + pin(1 3) + pin(2 4) + pin(4 6) + pin(5 7) + pin(6 3) + ) + circuit(4 INV2PAIR name($4) + pin(0 4) + pin(1 3) + pin(2 4) + pin(4 7) + pin(5 8) + pin(6 3) + ) + circuit(5 INV2PAIR name($5) + pin(0 4) + pin(1 3) + pin(2 4) + pin(4 8) + pin(5 5) + pin(6 3) + ) + + ) +) + +# Cross reference +xref( + circuit(INV2 INV2 match + xref( + net(1 1 match) + net(6 6 match) + net(2 2 match) + net(3 3 match) + net(5 5 match) + net(4 4 match) + pin(0 0 match) + pin(5 5 match) + pin(1 1 match) + pin(2 2 match) + pin(4 4 match) + pin(3 3 match) + device(1 1 match) + device(2 2 match) + ) + ) + circuit(INV2PAIR INV2PAIR match + xref( + net(2 2 match) + net(3 3 match) + net(4 4 match) + net(5 5 match) + net(6 6 match) + net(7 7 match) + net(1 1 match) + pin(1 1 match) + pin(2 2 match) + pin(3 3 match) + pin(4 4 match) + pin(5 5 match) + pin(6 6 match) + pin(0 0 match) + circuit(1 1 match) + circuit(2 2 match) + ) + ) + circuit(RINGO RINGO match + xref( + net(5 6 match) + net(6 5 match) + net(7 8 match) + net(8 7 match) + net(1 1 match) + net(2 2 match) + net(3 3 match) + net(4 4 match) + pin(0 0 match) + pin(1 1 match) + pin(2 2 match) + pin(3 3 match) + circuit(1 1 match) + circuit(2 2 match) + circuit(3 3 match) + circuit(4 4 match) + circuit(5 5 match) + ) + ) +) diff --git a/testdata/sessions/test.lyrdb b/testdata/sessions/test.lyrdb new file mode 100644 index 000000000..7fa6932ce --- /dev/null +++ b/testdata/sessions/test.lyrdb @@ -0,0 +1,57 @@ + + + desc + of + gg + top + + + x + xdesc + + + x2 + + + + x1 + + + + + + cat + + + + subcat + + + + + + + + + + cell_name + + + + + + + + #x2,x1 + cat + cell_name + false + 1 + iVBORw0KGgoAAAANSUhEUgAAACoAAAA0CAIAAABzfT3nAAAAA3NCSVQICAjb4U/gAAAACXBIWXMAAA0SAAANOgHo3ZneAAAA3UlEQVRYhe2WwQ3DIAxFoco8XaGZIaeO43FyYgZYgYXcQ6SWuDGgBhWq/qccIvGCEd9SbAwAAPSGaW2lFR2rfWDpXrPpSe2SP10fvnn/PZHZH9IwbKFVZZ/Z6wMtZcjW02Bn2FVpZYdWdkr2nvh23S2FyDNJuVITpwmRjTGbNr0v20U5byNtJuuJt/fO2f93+UlbEJl5UjVPr3Y71EQ/PoPPlU+lDJtWlCt3GwCMG33BuJGAcWMEMG6c1jBudCyf/nzV8nbZPRohclFLHdGbZ8eNSjN1fmf0AACA1jwA4hKxu4C6P7EAAAAASUVORK5CYII= + + [#x2] text: a + [x1] text: b + + + + diff --git a/testdata/sessions/test.png b/testdata/sessions/test.png new file mode 100644 index 000000000..4451152f6 Binary files /dev/null and b/testdata/sessions/test.png differ diff --git a/testdata/sessions/test_with_relative_paths.lys b/testdata/sessions/test_with_relative_paths.lys new file mode 100644 index 000000000..bc9ffbe62 --- /dev/null +++ b/testdata/sessions/test_with_relative_paths.lys @@ -0,0 +1,393 @@ + + + 960 + 480 + AAAA/wAAAAD9AAAAAgAAAAAAAAAAAAAAAPwCAAAAA/sAAAAqAG4AYQB2AGkAZwBhAHQAbwByAF8AZABvAGMAawBfAHcAaQBkAGcAZQB0AAAAAAD/////AAAAlQD////7AAAAHABoAHAAXwBkAG8AYwBrAF8AdwBpAGQAZwBlAHQBAAAAAP////8AAAAZAP////sAAAAgAGwAaQBiAHMAXwBkAG8AYwBrAF8AdwBpAGQAZwBlAHQBAAAAAP////8AAAAZAP///wAAAAEAAAAAAAAAAPwCAAAAA/sAAAAqAGIAbwBvAGsAbQBhAHIAawBzAF8AZABvAGMAawBfAHcAaQBkAGcAZQB0AAAAAAD/////AAAAGQD////7AAAAHABsAHAAXwBkAG8AYwBrAF8AdwBpAGQAZwBlAHQBAAAAAP////8AAAAZAP////sAAAAcAGwAdABfAGQAbwBjAGsAXwB3AGkAZABnAGUAdAEAAAAA/////wAAAIsAAACLAAAAAAAAAAAAAAAEAAAABAAAAAgAAAAI/AAAAAEAAAACAAAAAQAAAA4AdABvAG8AbABiAGEAcgEAAAAA/////wAAAAAAAAAA + AdnQywABAAAAAAAAAAAAAAAAA78AAAHfAAAAAAAAAAAAAAO/AAAB3wAAAAAAAA== + 0 + + test.gds + test.gds + false + + + true + false + false + false + false + 8000 + 32000 + LIB + + + 2 + false + false + 1 + * + false + + + 0 + + + false + false + + + + + 1 + true + true + + + true + layer_map() + true + true + + + true + layer_map() + 0.001 + true + #1 + true + #1 + true + OUTLINE + true + PLACEMENT_BLK + true + REGIONS + true + + 0 + true + .PIN + 2 + true + .OBS + 3 + true + .BLK + 4 + true + .LABEL + 1 + true + + 0 + + + false + true + true + 64 + 0 + 1 + 0 + DATA + 0 + 0 + BORDER + layer_map() + true + + + 0.001 + 1 + 100 + 100 + 0 + 0 + 0 + false + false + false + true + layer_map() + + + 0 + 0.001 + layer_map() + true + false + + + + + + <active-cellview-index>0</active-cellview-index> + <display> + <x-left>-0.5418</x-left> + <x-right>26.5482</x-right> + <y-bottom>-9.4815</y-bottom> + <y-top>17.6085</y-top> + <min-hier>0</min-hier> + <max-hier>1</max-hier> + <cellpaths> + <cellpath> + <cellname>RINGO</cellname> + </cellpath> + </cellpaths> + </display> + <cellviews> + <cellview> + <layout-ref>test.gds</layout-ref> + <tech-name/> + <hidden-cells> + </hidden-cells> + </cellview> + </cellviews> + <bookmarks> + </bookmarks> + <rdb-files> + <rdb-file>test.lyrdb</rdb-file> + </rdb-files> + <l2ndb-files> + <l2ndb-file>test.l2n</l2ndb-file> + <l2ndb-file>test.lvsdb</l2ndb-file> + </l2ndb-files> + <current-layer-property-tab>0</current-layer-property-tab> + <layer-properties-tabs> + <layer-properties> + <properties> + <frame-color>#ff80a8</frame-color> + <fill-color>#ff80a8</fill-color> + <frame-brightness>0</frame-brightness> + <fill-brightness>0</fill-brightness> + <dither-pattern>I9</dither-pattern> + <line-style/> + <valid>true</valid> + <visible>true</visible> + <transparent>false</transparent> + <width/> + <marked>false</marked> + <xfill>false</xfill> + <animation>0</animation> + <name/> + <source>1/0@1</source> + </properties> + <properties> + <frame-color>#c080ff</frame-color> + <fill-color>#c080ff</fill-color> + <frame-brightness>0</frame-brightness> + <fill-brightness>0</fill-brightness> + <dither-pattern>I5</dither-pattern> + <line-style/> + <valid>true</valid> + <visible>true</visible> + <transparent>false</transparent> + <width/> + <marked>false</marked> + <xfill>false</xfill> + <animation>0</animation> + <name/> + <source>2/0@1</source> + </properties> + <properties> + <frame-color>#9580ff</frame-color> + <fill-color>#9580ff</fill-color> + <frame-brightness>0</frame-brightness> + <fill-brightness>0</fill-brightness> + <dither-pattern>I9</dither-pattern> + <line-style/> + <valid>true</valid> + <visible>true</visible> + <transparent>false</transparent> + <width/> + <marked>false</marked> + <xfill>false</xfill> + <animation>0</animation> + <name/> + <source>3/0@1</source> + </properties> + <properties> + <frame-color>#8086ff</frame-color> + <fill-color>#8086ff</fill-color> + <frame-brightness>0</frame-brightness> + <fill-brightness>0</fill-brightness> + <dither-pattern>I5</dither-pattern> + <line-style/> + <valid>true</valid> + <visible>true</visible> + <transparent>false</transparent> + <width/> + <marked>false</marked> + <xfill>false</xfill> + <animation>0</animation> + <name/> + <source>4/0@1</source> + </properties> + <properties> + <frame-color>#80a8ff</frame-color> + <fill-color>#80a8ff</fill-color> + <frame-brightness>0</frame-brightness> + <fill-brightness>0</fill-brightness> + <dither-pattern>I9</dither-pattern> + <line-style/> + <valid>true</valid> + <visible>true</visible> + <transparent>false</transparent> + <width/> + <marked>false</marked> + <xfill>false</xfill> + <animation>0</animation> + <name/> + <source>5/0@1</source> + </properties> + <properties> + <frame-color>#ff00ff</frame-color> + <fill-color>#ff00ff</fill-color> + <frame-brightness>0</frame-brightness> + <fill-brightness>0</fill-brightness> + <dither-pattern>I5</dither-pattern> + <line-style/> + <valid>true</valid> + <visible>true</visible> + <transparent>false</transparent> + <width/> + <marked>false</marked> + <xfill>false</xfill> + <animation>0</animation> + <name/> + <source>8/0@1</source> + </properties> + <properties> + <frame-color>#8000ff</frame-color> + <fill-color>#8000ff</fill-color> + <frame-brightness>0</frame-brightness> + <fill-brightness>0</fill-brightness> + <dither-pattern>I9</dither-pattern> + <line-style/> + <valid>true</valid> + <visible>true</visible> + <transparent>false</transparent> + <width/> + <marked>false</marked> + <xfill>false</xfill> + <animation>0</animation> + <name/> + <source>9/0@1</source> + </properties> + <properties> + <frame-color>#0000ff</frame-color> + <fill-color>#0000ff</fill-color> + <frame-brightness>0</frame-brightness> + <fill-brightness>0</fill-brightness> + <dither-pattern>I5</dither-pattern> + <line-style/> + <valid>true</valid> + <visible>true</visible> + <transparent>false</transparent> + <width/> + <marked>false</marked> + <xfill>false</xfill> + <animation>0</animation> + <name/> + <source>10/0@1</source> + </properties> + <properties> + <frame-color>#0080ff</frame-color> + <fill-color>#0080ff</fill-color> + <frame-brightness>0</frame-brightness> + <fill-brightness>0</fill-brightness> + <dither-pattern>I9</dither-pattern> + <line-style/> + <valid>true</valid> + <visible>true</visible> + <transparent>false</transparent> + <width/> + <marked>false</marked> + <xfill>false</xfill> + <animation>0</animation> + <name/> + <source>11/0@1</source> + </properties> + <properties> + <frame-color>#800057</frame-color> + <fill-color>#800057</fill-color> + <frame-brightness>0</frame-brightness> + <fill-brightness>0</fill-brightness> + <dither-pattern>I5</dither-pattern> + <line-style/> + <valid>true</valid> + <visible>true</visible> + <transparent>false</transparent> + <width/> + <marked>false</marked> + <xfill>false</xfill> + <animation>0</animation> + <name/> + <source>13/0@1</source> + </properties> + <properties> + <frame-color>#800080</frame-color> + <fill-color>#800080</fill-color> + <frame-brightness>0</frame-brightness> + <fill-brightness>0</fill-brightness> + <dither-pattern>I9</dither-pattern> + <line-style/> + <valid>true</valid> + <visible>true</visible> + <transparent>false</transparent> + <width/> + <marked>false</marked> + <xfill>false</xfill> + <animation>0</animation> + <name/> + <source>14/0@1</source> + </properties> + <properties> + <frame-color>#ffae00</frame-color> + <fill-color>#ffae00</fill-color> + <frame-brightness>0</frame-brightness> + <fill-brightness>0</fill-brightness> + <dither-pattern>I5</dither-pattern> + <line-style/> + <valid>true</valid> + <visible>true</visible> + <transparent>false</transparent> + <width/> + <marked>false</marked> + <xfill>false</xfill> + <animation>0</animation> + <name/> + <source>1000/0@1</source> + </properties> + <properties> + <frame-color>#ff8000</frame-color> + <fill-color>#ff8000</fill-color> + <frame-brightness>0</frame-brightness> + <fill-brightness>0</fill-brightness> + <dither-pattern>I9</dither-pattern> + <line-style/> + <valid>true</valid> + <visible>true</visible> + <transparent>false</transparent> + <width/> + <marked>false</marked> + <xfill>false</xfill> + <animation>0</animation> + <name/> + <source>1001/0@1</source> + </properties> + <name/> + </layer-properties> + </layer-properties-tabs> + <annotations> + <annotation> + <class>ant::Object</class> + <value>id=0,x1=0,y1=0,x2=0,y2=0,category='',fmt='Hello, world!',fmt_x=$X,fmt_y=$Y,position=auto,xalign=auto,yalign=auto,xlabel_xalign=auto,xlabel_yalign=auto,ylabel_xalign=auto,ylabel_yalign=auto,style=ruler,outline=diag,snap=true,angle_constraint=global</value> + </annotation> + <annotation> + <class>img::Object</class> + <value>color:matrix=(1,0,0) (0,1,0) (0,0,1);min_value=0;max_value=255;is_visible=true;z_position=0;brightness=0;contrast=0;gamma=1;red_gain=1;green_gain=1;blue_gain=1;color_mapping=[0,'#000000';1,'#ffffff';];file='../testdata/sessions/test.png'</value> + </annotation> + </annotations> + </view> +</session>