klayout/src/db/unit_tests/dbLibraryTests.cc

93 lines
2.9 KiB
C++

/*
KLayout Layout Viewer
Copyright (C) 2006-2026 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 "dbLibraryManager.h"
#include "dbLibrary.h"
#include "dbFileBasedLibrary.h"
#include "tlUnitTest.h"
#include "tlFileUtils.h"
// map library to different file (aka reload/refresh)
TEST(1)
{
std::string pa = tl::testsrc () + "/testdata/gds/lib_a.gds";
std::string pb = tl::testsrc () + "/testdata/gds/lib_b.gds";
db::FileBasedLibrary *lib = new db::FileBasedLibrary (pa);
lib->load ();
lib->set_name ("LIB");
db::LibraryManager::instance ().register_lib (lib);
db::Layout l;
auto top_cell_index = l.add_cell ("TOP");
auto lib_proxy = l.get_lib_proxy (lib, lib->layout ().cell_by_name ("A").second);
l.cell (top_cell_index).insert (db::CellInstArray (db::CellInst (lib_proxy), db::Trans ()));
EXPECT_EQ (l.cell (top_cell_index).bbox ().to_string (), "(0,0;2000,2000)");
// switch to a different file and refresh
lib->set_paths (pb);
lib->refresh ();
EXPECT_EQ (l.cell (top_cell_index).bbox ().to_string (), "(-1000,-1000;1000,1000)");
db::LibraryManager::instance ().delete_lib (lib);
}
// merge multiple files into one library
TEST(2)
{
std::string pa = tl::testsrc () + "/testdata/gds/lib_a.gds";
std::string pb = tl::testsrc () + "/testdata/gds/lib_b.gds";
db::FileBasedLibrary *lib = new db::FileBasedLibrary (pa);
lib->merge_with_other_layout (pb);
lib->load ();
lib->set_name ("LIB");
db::LibraryManager::instance ().register_lib (lib);
{
db::Layout l;
auto top_cell_index = l.add_cell ("TOP");
auto lib_proxy = l.get_lib_proxy (lib, lib->layout ().cell_by_name ("A").second);
l.cell (top_cell_index).insert (db::CellInstArray (db::CellInst (lib_proxy), db::Trans ()));
// A comes from the first layout
EXPECT_EQ (l.cell (top_cell_index).bbox ().to_string (), "(0,0;2000,2000)");
}
{
db::Layout l;
auto top_cell_index = l.add_cell ("TOP");
auto lib_proxy = l.get_lib_proxy (lib, lib->layout ().cell_by_name ("Z").second);
l.cell (top_cell_index).insert (db::CellInstArray (db::CellInst (lib_proxy), db::Trans ()));
// Z comes from the second layout
EXPECT_EQ (l.cell (top_cell_index).bbox ().to_string (), "(0,0;100,100)");
}
db::LibraryManager::instance ().delete_lib (lib);
}