mirror of https://github.com/KLayout/klayout.git
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:
parent
4ec4025e10
commit
b747bbabd9
|
|
@ -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);
|
||||
} 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<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") +
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
};
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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");
|
||||
}
|
||||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
Binary file not shown.
|
|
@ -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)
|
||||
)
|
||||
|
||||
)
|
||||
File diff suppressed because it is too large
Load Diff
|
|
@ -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>
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 71 KiB |
|
|
@ -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>
|
||||
Loading…
Reference in New Issue