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.
This commit is contained in:
Matthias Koefferlein 2019-09-14 22:38:23 +02:00
parent 4ec4025e10
commit b747bbabd9
10 changed files with 2513 additions and 14 deletions

View File

@ -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 <fstream>
@ -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 <std::string, const SessionLayoutDescriptor *>::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::Database> rdb (new rdb::Database ());
try {
rdb->load (vd.rdb_filenames[j]);
view->add_rdb (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 (...) {
delete rdb;
}
}
@ -289,6 +321,9 @@ session_structure ()
tl::make_element<std::vector<std::string>, SessionViewDescriptor> (&SessionViewDescriptor::rdb_filenames, "rdb-files",
tl::make_member<std::string, std::vector<std::string>::const_iterator, std::vector<std::string> > (&std::vector<std::string>::begin, &std::vector<std::string>::end, &std::vector<std::string>::push_back, "rdb-file")
) +
tl::make_element<std::vector<std::string>, SessionViewDescriptor> (&SessionViewDescriptor::l2ndb_filenames, "l2ndb-files",
tl::make_member<std::string, std::vector<std::string>::const_iterator, std::vector<std::string> > (&std::vector<std::string>::begin, &std::vector<std::string>::end, &std::vector<std::string>::push_back, "l2ndb-file")
) +
// for backward compatibility:
tl::make_element<lay::LayerPropertiesList, SessionViewDescriptor> (&SessionViewDescriptor::set_layer_properties, "layer-properties", lay::LayerPropertiesList::xml_format ()) +
tl::make_member<unsigned int, SessionViewDescriptor> (&SessionViewDescriptor::current_layer_list, "current-layer-property-tab") +

View File

@ -112,6 +112,7 @@ struct SessionViewDescriptor
std::vector<lay::LayerPropertiesList> layer_properties_lists;
unsigned int current_layer_list;
std::vector<std::string> rdb_filenames;
std::vector<std::string> 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;
};
}

View File

@ -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 <ant::Service> ();
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 <img::Service> ();
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::Database> rdb (new rdb::Database ());
rdb->load (tl::testsrc () + "/testdata/sessions/test.lyrdb");
view->add_rdb (rdb.release ());
std::auto_ptr<db::LayoutToNetlist> l2ndb (db::LayoutToNetlist::create_from_file (tl::testsrc () + "/testdata/sessions/test.l2n"));
view->add_l2ndb (l2ndb.release ());
std::auto_ptr<db::LayoutToNetlist> 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 <ant::Service> ();
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 <img::Service> ();
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 <db::LayoutVsSchematic *> (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 <ant::Service> ();
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 <img::Service> ();
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 <db::LayoutVsSchematic *> (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");
}

View File

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

BIN
testdata/sessions/test.gds vendored Normal file

Binary file not shown.

837
testdata/sessions/test.l2n vendored Normal file
View File

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

1002
testdata/sessions/test.lvsdb vendored Normal file

File diff suppressed because it is too large Load Diff

57
testdata/sessions/test.lyrdb vendored Normal file
View File

@ -0,0 +1,57 @@
<?xml version="1.0" encoding="utf-8"?>
<report-database>
<description>desc</description>
<original-file>of</original-file>
<generator>gg</generator>
<top-cell>top</top-cell>
<tags>
<tag>
<name>x</name>
<description>xdesc</description>
</tag>
<tag>
<name>x2</name>
<description/>
</tag>
<tag>
<name>x1</name>
<description/>
</tag>
</tags>
<categories>
<category>
<name>cat</name>
<description/>
<categories>
<category>
<name>subcat</name>
<description/>
<categories>
</categories>
</category>
</categories>
</category>
</categories>
<cells>
<cell>
<name>cell_name</name>
<variant/>
<references>
</references>
</cell>
</cells>
<items>
<item>
<tags>#x2,x1</tags>
<category>cat</category>
<cell>cell_name</cell>
<visited>false</visited>
<multiplicity>1</multiplicity>
<image>iVBORw0KGgoAAAANSUhEUgAAACoAAAA0CAIAAABzfT3nAAAAA3NCSVQICAjb4U/gAAAACXBIWXMAAA0SAAANOgHo3ZneAAAA3UlEQVRYhe2WwQ3DIAxFoco8XaGZIaeO43FyYgZYgYXcQ6SWuDGgBhWq/qccIvGCEd9SbAwAAPSGaW2lFR2rfWDpXrPpSe2SP10fvnn/PZHZH9IwbKFVZZ/Z6wMtZcjW02Bn2FVpZYdWdkr2nvh23S2FyDNJuVITpwmRjTGbNr0v20U5byNtJuuJt/fO2f93+UlbEJl5UjVPr3Y71EQ/PoPPlU+lDJtWlCt3GwCMG33BuJGAcWMEMG6c1jBudCyf/nzV8nbZPRohclFLHdGbZ8eNSjN1fmf0AACA1jwA4hKxu4C6P7EAAAAASUVORK5CYII=</image>
<values>
<value>[#x2] text: a</value>
<value>[x1] text: b</value>
</values>
</item>
</items>
</report-database>

BIN
testdata/sessions/test.png vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 71 KiB

View File

@ -0,0 +1,393 @@
<?xml version="1.0" encoding="utf-8"?>
<session>
<window-width>960</window-width>
<window-height>480</window-height>
<window-state>AAAA/wAAAAD9AAAAAgAAAAAAAAAAAAAAAPwCAAAAA/sAAAAqAG4AYQB2AGkAZwBhAHQAbwByAF8AZABvAGMAawBfAHcAaQBkAGcAZQB0AAAAAAD/////AAAAlQD////7AAAAHABoAHAAXwBkAG8AYwBrAF8AdwBpAGQAZwBlAHQBAAAAAP////8AAAAZAP////sAAAAgAGwAaQBiAHMAXwBkAG8AYwBrAF8AdwBpAGQAZwBlAHQBAAAAAP////8AAAAZAP///wAAAAEAAAAAAAAAAPwCAAAAA/sAAAAqAGIAbwBvAGsAbQBhAHIAawBzAF8AZABvAGMAawBfAHcAaQBkAGcAZQB0AAAAAAD/////AAAAGQD////7AAAAHABsAHAAXwBkAG8AYwBrAF8AdwBpAGQAZwBlAHQBAAAAAP////8AAAAZAP////sAAAAcAGwAdABfAGQAbwBjAGsAXwB3AGkAZABnAGUAdAEAAAAA/////wAAAIsAAACLAAAAAAAAAAAAAAAEAAAABAAAAAgAAAAI/AAAAAEAAAACAAAAAQAAAA4AdABvAG8AbABiAGEAcgEAAAAA/////wAAAAAAAAAA</window-state>
<window-geometry>AdnQywABAAAAAAAAAAAAAAAAA78AAAHfAAAAAAAAAAAAAAO/AAAB3wAAAAAAAA==</window-geometry>
<current-view>0</current-view>
<layout>
<name>test.gds</name>
<file-path>test.gds</file-path>
<save-options-valid>false</save-options-valid>
<save-options>
<gds2>
<write-timestamps>true</write-timestamps>
<write-cell-properties>false</write-cell-properties>
<write-file-properties>false</write-file-properties>
<no-zero-length-paths>false</no-zero-length-paths>
<multi-xy-records>false</multi-xy-records>
<max-vertex-count>8000</max-vertex-count>
<max-cellname-length>32000</max-cellname-length>
<libname>LIB</libname>
</gds2>
<oasis>
<compression-level>2</compression-level>
<write-cblocks>false</write-cblocks>
<strict-mode>false</strict-mode>
<write-std-properties>1</write-std-properties>
<subst-char>*</subst-char>
<permissive>false</permissive>
</oasis>
<cif>
<polygon-mode>0</polygon-mode>
</cif>
<cif>
<dummy-calls>false</dummy-calls>
<blank-separator>false</blank-separator>
</cif>
</save-options>
<load-options>
<gds2>
<box-mode>1</box-mode>
<allow-big-records>true</allow-big-records>
<allow-multi-xy-records>true</allow-multi-xy-records>
</gds2>
<common>
<create-other-layers>true</create-other-layers>
<layer-map>layer_map()</layer-map>
<enable-properties>true</enable-properties>
<enable-text-objects>true</enable-text-objects>
</common>
<lefdef>
<read-all-layers>true</read-all-layers>
<layer-map>layer_map()</layer-map>
<dbu>0.001</dbu>
<produce-net-names>true</produce-net-names>
<net-property-name>#1</net-property-name>
<produce-inst-names>true</produce-inst-names>
<inst-property-name>#1</inst-property-name>
<produce-cell-outlines>true</produce-cell-outlines>
<cell-outline-layer>OUTLINE</cell-outline-layer>
<produce-placement-blockages>true</produce-placement-blockages>
<placement-blockage-layer>PLACEMENT_BLK</placement-blockage-layer>
<produce-regions>true</produce-regions>
<region-layer>REGIONS</region-layer>
<produce-via-geometry>true</produce-via-geometry>
<via-geometry-suffix/>
<via-geometry-datatype>0</via-geometry-datatype>
<produce-pins>true</produce-pins>
<pins-suffix>.PIN</pins-suffix>
<pins-datatype>2</pins-datatype>
<produce-obstructions>true</produce-obstructions>
<obstructions-suffix>.OBS</obstructions-suffix>
<obstructions-datatype>3</obstructions-datatype>
<produce-blockages>true</produce-blockages>
<blockages-suffix>.BLK</blockages-suffix>
<blockages-datatype>4</blockages-datatype>
<produce-labels>true</produce-labels>
<labels-suffix>.LABEL</labels-suffix>
<labels-datatype>1</labels-datatype>
<produce-routing>true</produce-routing>
<routing-suffix/>
<routing-datatype>0</routing-datatype>
</lefdef>
<mebes>
<invert>false</invert>
<subresolution>true</subresolution>
<produce-boundary>true</produce-boundary>
<num-stripes-per-cell>64</num-stripes-per-cell>
<num-shapes-per-cell>0</num-shapes-per-cell>
<data-layer>1</data-layer>
<data-datatype>0</data-datatype>
<data-name>DATA</data-name>
<boundary-layer>0</boundary-layer>
<boundary-datatype>0</boundary-datatype>
<boundary-name>BORDER</boundary-name>
<layer-map>layer_map()</layer-map>
<create-other-layers>true</create-other-layers>
</mebes>
<dxf>
<dbu>0.001</dbu>
<unit>1</unit>
<text-scaling>100</text-scaling>
<circle-points>100</circle-points>
<circle-accuracy>0</circle-accuracy>
<contour-accuracy>0</contour-accuracy>
<polyline-mode>0</polyline-mode>
<render-texts-as-polygons>false</render-texts-as-polygons>
<keep-other-cells>false</keep-other-cells>
<keep-layer-names>false</keep-layer-names>
<create-other-layers>true</create-other-layers>
<layer-map>layer_map()</layer-map>
</dxf>
<cif>
<wire-mode>0</wire-mode>
<dbu>0.001</dbu>
<layer-map>layer_map()</layer-map>
<create-other-layers>true</create-other-layers>
<keep-layer-names>false</keep-layer-names>
</cif>
</load-options>
</layout>
<view>
<title/>
<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>