From b747bbabd97f82a559aa2bbc5c315f692d7c8f4a Mon Sep 17 00:00:00 2001 From: Matthias Koefferlein Date: Sat, 14 Sep 2019 22:38:23 +0200 Subject: [PATCH] Fixed #353 (paths relative to .lys file for rdb-file) This fix also includes: L2N and LVS DB files are now also included in the sessions. --- src/lay/lay/laySession.cc | 57 +- src/lay/lay/laySession.h | 3 + src/lay/unit_tests/laySessionTests.cc | 171 +++ src/lay/unit_tests/unit_tests.pro | 7 +- testdata/sessions/test.gds | Bin 0 -> 10210 bytes testdata/sessions/test.l2n | 837 ++++++++++++++ testdata/sessions/test.lvsdb | 1002 +++++++++++++++++ testdata/sessions/test.lyrdb | 57 + testdata/sessions/test.png | Bin 0 -> 73051 bytes .../sessions/test_with_relative_paths.lys | 393 +++++++ 10 files changed, 2513 insertions(+), 14 deletions(-) create mode 100644 src/lay/unit_tests/laySessionTests.cc create mode 100644 testdata/sessions/test.gds create mode 100644 testdata/sessions/test.l2n create mode 100644 testdata/sessions/test.lvsdb create mode 100644 testdata/sessions/test.lyrdb create mode 100644 testdata/sessions/test.png create mode 100644 testdata/sessions/test_with_relative_paths.lys 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 0000000000000000000000000000000000000000..c6a7aac644361582519b2a0e2b6800332b41344b GIT binary patch literal 10210 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 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..4451152f6422fdc159579036cb43c756534a3228 GIT binary patch literal 73051 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
FX^HCPx`2457bV?bgVI|jU>qUQBAg)9SAV@ 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 literal 0 HcmV?d00001 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>