klayout/src/unit_tests/dbShapes.cc

3267 lines
133 KiB
C++

/*
KLayout Layout Viewer
Copyright (C) 2006-2017 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 "dbLayout.h"
#include "tlTimer.h"
#include "utHead.h"
#include "dbOASISReader.h"
#include "dbStatic.h"
TEST(1)
{
db::Manager m;
db::Shapes s (&m, 0, db::default_editable_mode ());
db::Box b_empty;
s.update_bbox ();
EXPECT_EQ (s.bbox (), b_empty);
db::Box b (0, 100, 1000, 1200);
s.insert (b);
s.update_bbox ();
EXPECT_EQ (s.bbox (), b);
db::Edge e (-100, -200, 0, 0);
s.insert (e);
s.update_bbox ();
EXPECT_EQ (s.bbox (), db::Box (-100, -200, 1000, 1200));
db::Shapes s2 (s);
s2.update_bbox ();
EXPECT_EQ (s2.bbox (), db::Box (-100, -200, 1000, 1200));
if (db::default_editable_mode ()) {
s2.erase (db::Box::tag (), db::stable_layer_tag (), s2.begin (db::Box::tag (), db::stable_layer_tag ()));
s2.update_bbox ();
EXPECT_EQ (s2.bbox (), db::Box (-100, -200, 0, 0));
}
}
TEST(1a)
{
db::Manager m;
db::Shapes s (&m, 0, true);
db::Box b_empty;
s.update_bbox ();
EXPECT_EQ (s.bbox (), b_empty);
db::Box b (0, 100, 1000, 1200);
s.insert (b);
s.update_bbox ();
EXPECT_EQ (s.bbox (), b);
db::Edge e (-100, -200, 0, 0);
s.insert (e);
s.update_bbox ();
EXPECT_EQ (s.bbox (), db::Box (-100, -200, 1000, 1200));
db::Shapes s2 (s);
s2.update_bbox ();
EXPECT_EQ (s2.bbox (), db::Box (-100, -200, 1000, 1200));
s2.erase (db::Box::tag (), db::stable_layer_tag (), s2.begin (db::Box::tag (), db::stable_layer_tag ()));
s2.update_bbox ();
EXPECT_EQ (s2.bbox (), db::Box (-100, -200, 0, 0));
}
TEST(1b)
{
db::Manager m;
db::Shapes s (&m, 0, false);
db::Box b_empty;
s.update_bbox ();
EXPECT_EQ (s.bbox (), b_empty);
db::Box b (0, 100, 1000, 1200);
s.insert (b);
s.update_bbox ();
EXPECT_EQ (s.bbox (), b);
db::Edge e (-100, -200, 0, 0);
s.insert (e);
s.update_bbox ();
EXPECT_EQ (s.bbox (), db::Box (-100, -200, 1000, 1200));
db::Shapes s2 (s);
s2.update_bbox ();
EXPECT_EQ (s2.bbox (), db::Box (-100, -200, 1000, 1200));
}
std::string shapes_to_string_norm (ut::TestBase *_this, const db::Shapes &shapes, const db::ICplxTrans &trans)
{
std::vector<std::string> strings;
for (db::Shapes::shape_iterator shape = shapes.begin (db::Shapes::shape_iterator::All); ! shape.at_end (); ++shape) {
std::string r;
if (shape->is_polygon ()) {
db::Shape::polygon_type p;
shape->polygon (p);
r += "polygon " + p.transformed (trans).to_string ();
// check the area and bbox while we are here.
EXPECT_EQ (p.box ().to_string (), shape->bbox ().to_string ());
EXPECT_EQ (p.area (), shape->area ());
} else if (shape->is_path ()) {
db::Shape::path_type p;
shape->path (p);
r += "path " + p.transformed (trans).to_string ();
EXPECT_EQ (p.box ().to_string (), shape->bbox ().to_string ());
EXPECT_EQ (p.area (), shape->area ());
} else if (shape->is_text ()) {
db::Shape::text_type p;
shape->text (p);
r += "text " + p.transformed (trans).to_string ();
EXPECT_EQ (p.box ().to_string (), shape->bbox ().to_string ());
EXPECT_EQ (0.0, shape->area ());
} else if (shape->is_box ()) {
db::Shape::box_type p;
shape->box (p);
r += "box " + p.transformed (trans).to_string ();
EXPECT_EQ (p.to_string (), shape->bbox ().to_string ());
EXPECT_EQ (p.area (), shape->area ());
} else {
r += "*unknown type*";
}
r += " #" + tl::to_string (shape->prop_id ()) + "\n";
strings.push_back (r);
}
std::sort (strings.begin (), strings.end ());
std::string r;
for (std::vector<std::string>::const_iterator s = strings.begin (); s != strings.end (); ++s) {
r += *s;
}
return r;
}
std::string shapes_to_string_norm (ut::TestBase *_this, const db::Shapes &shapes)
{
std::vector<std::string> strings;
for (db::Shapes::shape_iterator shape = shapes.begin (db::Shapes::shape_iterator::All); ! shape.at_end (); ++shape) {
std::string r;
if (shape->is_polygon ()) {
db::Shape::polygon_type p;
shape->polygon (p);
r += "polygon " + p.to_string ();
// check the area and bbox while we are here.
EXPECT_EQ (p.box ().to_string (), shape->bbox ().to_string ());
EXPECT_EQ (p.area (), shape->area ());
} else if (shape->is_path ()) {
db::Shape::path_type p;
shape->path (p);
r += "path " + p.to_string ();
EXPECT_EQ (p.box ().to_string (), shape->bbox ().to_string ());
EXPECT_EQ (p.area (), shape->area ());
} else if (shape->is_text ()) {
db::Shape::text_type p;
shape->text (p);
r += "text " + p.to_string ();
EXPECT_EQ (p.box ().to_string (), shape->bbox ().to_string ());
EXPECT_EQ (0.0, shape->area ());
} else if (shape->is_box ()) {
db::Shape::box_type p;
shape->box (p);
r += "box " + p.to_string ();
EXPECT_EQ (p.to_string (), shape->bbox ().to_string ());
EXPECT_EQ (p.area (), shape->area ());
} else {
r += "*unknown type*";
}
r += " #" + tl::to_string (shape->prop_id ()) + "\n";
strings.push_back (r);
}
std::sort (strings.begin (), strings.end ());
std::string r;
for (std::vector<std::string>::const_iterator s = strings.begin (); s != strings.end (); ++s) {
r += *s;
}
return r;
}
std::string shapes_to_string (ut::TestBase *_this, const db::Shapes &shapes)
{
std::string r;
for (db::Shapes::shape_iterator shape = shapes.begin (db::Shapes::shape_iterator::All); ! shape.at_end (); ++shape) {
if (shape->is_polygon ()) {
db::Shape::polygon_type p;
shape->polygon (p);
r += "polygon " + p.to_string ();
// check the area and bbox while we are here.
EXPECT_EQ (p.box ().to_string (), shape->bbox ().to_string ());
EXPECT_EQ (p.area (), shape->area ());
} else if (shape->is_path ()) {
db::Shape::path_type p;
shape->path (p);
r += "path " + p.to_string ();
EXPECT_EQ (p.box ().to_string (), shape->bbox ().to_string ());
EXPECT_EQ (p.area (), shape->area ());
} else if (shape->is_text ()) {
db::Shape::text_type p;
shape->text (p);
r += "text " + p.to_string ();
EXPECT_EQ (p.box ().to_string (), shape->bbox ().to_string ());
EXPECT_EQ (0.0, shape->area ());
} else if (shape->is_box ()) {
db::Shape::box_type p;
shape->box (p);
r += "box " + p.to_string ();
EXPECT_EQ (p.to_string (), shape->bbox ().to_string ());
EXPECT_EQ (p.area (), shape->area ());
} else {
r += "*unknown type*";
}
if (shape->is_array_member ()) {
r += " [" + shape->array_trans ().to_string () + "]";
}
r += " #" + tl::to_string (shape->prop_id ()) + "\n";
}
return r;
}
unsigned int read_testdata (db::Layout &layout, unsigned int what = 0xff)
{
db::cell_index_type top = layout.add_cell ("TOP");
db::Cell &top_cell = layout.cell (top);
unsigned int layer_id = layout.insert_layer ();
db::Shapes &shapes = top_cell.shapes (layer_id);
bool with_arrays = ((what & 0x80) == 0);
if ((what & 0x1) != 0) {
static db::SimplePolygon p1 (db::Box (0, 100, 1000, 2000));
static db::SimplePolygon p2 (db::Box (100, 200, 1100, 2100));
static db::SimplePolygon p3 (db::Box (150, 150, 1150, 2050));
shapes.insert (p1);
shapes.insert (p2);
shapes.insert (p3);
shapes.insert (db::Shape::simple_polygon_ref_type (&p1, db::Trans (db::Vector (-10, 15))));
shapes.insert (db::Shape::simple_polygon_ref_type (&p2, db::Trans (db::Vector (-110, 115))));
shapes.insert (db::Shape::simple_polygon_ref_type (&p3, db::Trans (db::Vector (-210, 215))));
if (with_arrays) shapes.insert (db::Shape::simple_polygon_ptr_array_type (db::Shape::simple_polygon_ptr_type (&p1, db::UnitTrans ()), db::Disp (db::Vector (0, 5)), db::Vector (0, 10000), db::Vector (11000, 0), 3, 4));
shapes.insert (db::object_with_properties<db::SimplePolygon> (p1, 1));
shapes.insert (db::object_with_properties<db::SimplePolygon> (p2, 2));
shapes.insert (db::object_with_properties<db::SimplePolygon> (p3, 3));
shapes.insert (db::object_with_properties<db::Shape::simple_polygon_ref_type> (db::Shape::simple_polygon_ref_type (&p1, db::Trans (db::Vector (-10, 15))), 5));
shapes.insert (db::object_with_properties<db::Shape::simple_polygon_ref_type> (db::Shape::simple_polygon_ref_type (&p2, db::Trans (db::Vector (-110, 115))), 6));
shapes.insert (db::object_with_properties<db::Shape::simple_polygon_ref_type> (db::Shape::simple_polygon_ref_type (&p3, db::Trans (db::Vector (-210, 215))), 7));
if (with_arrays) shapes.insert (db::object_with_properties<db::Shape::simple_polygon_ptr_array_type> (db::Shape::simple_polygon_ptr_array_type (db::Shape::simple_polygon_ptr_type (&p1, db::UnitTrans ()), db::Disp (db::Vector (0, 5)), db::Vector (0, 10000), db::Vector (11000, 0), 3, 4), 8));
}
if ((what & 0x2) != 0) {
static db::Polygon q1 (db::Box (0, 100, 2000, 1000));
static db::Polygon q2 (db::Box (100, 200, 2100, 1100));
static db::Polygon q3 (db::Box (150, 150, 2150, 1050));
shapes.insert (q1);
shapes.insert (q2);
shapes.insert (q3);
shapes.insert (db::Shape::polygon_ref_type (&q1, db::Trans (db::Vector (-10, 15))));
shapes.insert (db::Shape::polygon_ref_type (&q2, db::Trans (db::Vector (-110, 115))));
shapes.insert (db::Shape::polygon_ref_type (&q3, db::Trans (db::Vector (-210, 215))));
if (with_arrays) shapes.insert (db::Shape::polygon_ptr_array_type (db::Shape::polygon_ptr_type (&q1, db::UnitTrans ()), db::Disp (db::Vector (0, 5)), db::Vector (0, 10000), db::Vector (11000, 0), 3, 4));
shapes.insert (db::object_with_properties<db::Polygon> (q1, 1));
shapes.insert (db::object_with_properties<db::Polygon> (q2, 2));
shapes.insert (db::object_with_properties<db::Polygon> (q3, 3));
shapes.insert (db::object_with_properties<db::Shape::polygon_ref_type> (db::Shape::polygon_ref_type (&q1, db::Trans (db::Vector (-10, 15))), 5));
shapes.insert (db::object_with_properties<db::Shape::polygon_ref_type> (db::Shape::polygon_ref_type (&q2, db::Trans (db::Vector (-110, 115))), 6));
shapes.insert (db::object_with_properties<db::Shape::polygon_ref_type> (db::Shape::polygon_ref_type (&q3, db::Trans (db::Vector (-210, 215))), 7));
if (with_arrays) shapes.insert (db::object_with_properties<db::Shape::polygon_ptr_array_type> (db::Shape::polygon_ptr_array_type (db::Shape::polygon_ptr_type (&q1, db::UnitTrans ()), db::Disp (db::Vector (0, 5)), db::Vector (0, 10000), db::Vector (11000, 0), 3, 4), 8));
}
if ((what & 0x4) != 0) {
static db::Path r1;
static db::Path r2;
static db::Path r3;
db::Point pts1 [] = { db::Point (0, 100), db::Point (0, 500), db::Point (200, 700) };
db::Point pts2 [] = { db::Point (0, 1100), db::Point (0, 1500), db::Point (200, 1300) };
db::Point pts3 [] = { db::Point (0, 2100), db::Point (0, 2500), db::Point (-200, 2700) };
r1 = db::Path (pts1, pts1 + 3, 100);
r2 = db::Path (pts2, pts2 + 3, 150);
r3 = db::Path (pts3, pts3 + 3, 200);
shapes.insert (r1);
shapes.insert (r2);
shapes.insert (r3);
shapes.insert (db::Shape::path_ref_type (&r1, db::Trans (db::Vector (-10, 15))));
shapes.insert (db::Shape::path_ref_type (&r2, db::Trans (db::Vector (-110, 115))));
shapes.insert (db::Shape::path_ref_type (&r3, db::Trans (db::Vector (-210, 215))));
if (with_arrays) shapes.insert (db::Shape::path_ptr_array_type (db::Shape::path_ptr_type (&r1, db::UnitTrans ()), db::Disp (db::Vector (0, 5)), db::Vector (0, 10000), db::Vector (11000, 0), 3, 4));
shapes.insert (db::object_with_properties<db::Path> (r1, 1));
shapes.insert (db::object_with_properties<db::Path> (r2, 2));
shapes.insert (db::object_with_properties<db::Path> (r3, 3));
shapes.insert (db::object_with_properties<db::Shape::path_ref_type> (db::Shape::path_ref_type (&r1, db::Trans (db::Vector (-10, 15))), 5));
shapes.insert (db::object_with_properties<db::Shape::path_ref_type> (db::Shape::path_ref_type (&r2, db::Trans (db::Vector (-110, 115))), 6));
shapes.insert (db::object_with_properties<db::Shape::path_ref_type> (db::Shape::path_ref_type (&r3, db::Trans (db::Vector (-210, 215))), 7));
if (with_arrays) shapes.insert (db::object_with_properties<db::Shape::path_ptr_array_type> (db::Shape::path_ptr_array_type (db::Shape::path_ptr_type (&r1, db::UnitTrans ()), db::Disp (db::Vector (0, 5)), db::Vector (0, 10000), db::Vector (11000, 0), 3, 4), 8));
}
if ((what & 0x8) != 0) {
static db::Text t1 ("A", db::Trans (0, db::Vector (10, 35)));
static db::Text t2 ("B", db::Trans (1, db::Vector (20, 25)));
static db::Text t3 ("C", db::Trans (6, db::Vector (30, 15)));
shapes.insert (t1);
shapes.insert (t2);
shapes.insert (t3);
shapes.insert (db::Shape::text_ref_type (&t1, db::Disp (db::Vector (-10, 15))));
shapes.insert (db::Shape::text_ref_type (&t2, db::Disp (db::Vector (-110, 115))));
shapes.insert (db::Shape::text_ref_type (&t3, db::Disp (db::Vector (-210, 215))));
if (with_arrays) shapes.insert (db::Shape::text_ptr_array_type (db::Shape::text_ptr_type (&t1, db::UnitTrans ()), db::Disp (db::Vector (0, 5)), db::Vector (0, 10000), db::Vector (11000, 0), 3, 4));
shapes.insert (db::object_with_properties<db::Text> (t1, 1));
shapes.insert (db::object_with_properties<db::Text> (t2, 2));
shapes.insert (db::object_with_properties<db::Text> (t3, 3));
shapes.insert (db::object_with_properties<db::Shape::text_ref_type> (db::Shape::text_ref_type (&t1, db::Disp (db::Vector (-10, 15))), 5));
shapes.insert (db::object_with_properties<db::Shape::text_ref_type> (db::Shape::text_ref_type (&t2, db::Disp (db::Vector (-110, 115))), 6));
shapes.insert (db::object_with_properties<db::Shape::text_ref_type> (db::Shape::text_ref_type (&t3, db::Disp (db::Vector (-210, 215))), 7));
if (with_arrays) shapes.insert (db::object_with_properties<db::Shape::text_ptr_array_type> (db::Shape::text_ptr_array_type (db::Shape::text_ptr_type (&t1, db::UnitTrans ()), db::Disp (db::Vector (0, 5)), db::Vector (0, 10000), db::Vector (11000, 0), 3, 4), 8));
}
if ((what & 0x10) != 0) {
static db::Box b1 (0, 100, 2000, 1000);
static db::Box b2 (100, 200, 2100, 1100);
static db::Box b3 (150, 150, 2150, 1050);
shapes.insert (b1);
shapes.insert (b2);
shapes.insert (b3);
if (with_arrays) shapes.insert (db::Shape::box_array_type (db::Box (50, -50, 1050, -1050), db::UnitTrans (), db::Vector (0, 10000), db::Vector (11000, 0), 3, 4));
shapes.insert (db::object_with_properties<db::Box> (b1, 10));
shapes.insert (db::object_with_properties<db::Box> (b2, 11));
shapes.insert (db::object_with_properties<db::Box> (b3, 12));
if (with_arrays) shapes.insert (db::object_with_properties<db::Shape::box_array_type> (db::Shape::box_array_type (db::Box (50, -50, 1050, -1050), db::UnitTrans (), db::Vector (0, 10000), db::Vector (11000, 0), 3, 4), 20));
}
if ((what & 0x20) != 0) {
static db::ShortBox s1 (0, 100, 2000, 1000);
static db::ShortBox s2 (100, 200, 2100, 1100);
static db::ShortBox s3 (150, 150, 2150, 1050);
shapes.insert (s1);
shapes.insert (s2);
shapes.insert (s3);
if (with_arrays) shapes.insert (db::Shape::short_box_array_type (db::ShortBox (50, -50, 1050, -1050), db::UnitTrans (), db::Vector (0, 10000), db::Vector (11000, 0), 3, 4));
shapes.insert (db::object_with_properties<db::ShortBox> (s1, 10));
shapes.insert (db::object_with_properties<db::ShortBox> (s2, 11));
shapes.insert (db::object_with_properties<db::ShortBox> (s3, 12));
if (with_arrays) shapes.insert (db::object_with_properties<db::Shape::short_box_array_type> (db::Shape::short_box_array_type (db::ShortBox (50, -50, 1050, -1050), db::UnitTrans (), db::Vector (0, 10000), db::Vector (11000, 0), 3, 4), 20));
}
return layer_id;
}
struct plus1
{
db::Layout::properties_id_type operator() (db::Layout::properties_id_type i) const { return i+1; }
};
TEST(2)
{
db::Manager m;
db::Layout other_layout (&m);
db::Cell &other_topcell = other_layout.cell (other_layout.add_cell ());
db::Layout layout (&m);
unsigned int lindex = read_testdata (layout, 0x1);
db::Cell &topcell = layout.cell (*layout.begin_top_down ());
db::Shapes copy (&m, &topcell, db::default_editable_mode ());
EXPECT_EQ (shapes_to_string_norm (_this, topcell.shapes (lindex)),
"polygon (-10,115;-10,2015;990,2015;990,115) #0\n"
"polygon (-10,115;-10,2015;990,2015;990,115) #5\n"
"polygon (-10,315;-10,2215;990,2215;990,315) #0\n"
"polygon (-10,315;-10,2215;990,2215;990,315) #6\n"
"polygon (-60,365;-60,2265;940,2265;940,365) #0\n"
"polygon (-60,365;-60,2265;940,2265;940,365) #7\n"
"polygon (0,100;0,2000;1000,2000;1000,100) #0\n"
"polygon (0,100;0,2000;1000,2000;1000,100) #1\n"
"polygon (0,10105;0,12005;1000,12005;1000,10105) #0\n"
"polygon (0,10105;0,12005;1000,12005;1000,10105) #8\n"
"polygon (0,105;0,2005;1000,2005;1000,105) #0\n"
"polygon (0,105;0,2005;1000,2005;1000,105) #8\n"
"polygon (0,20105;0,22005;1000,22005;1000,20105) #0\n"
"polygon (0,20105;0,22005;1000,22005;1000,20105) #8\n"
"polygon (100,200;100,2100;1100,2100;1100,200) #0\n"
"polygon (100,200;100,2100;1100,2100;1100,200) #2\n"
"polygon (11000,10105;11000,12005;12000,12005;12000,10105) #0\n"
"polygon (11000,10105;11000,12005;12000,12005;12000,10105) #8\n"
"polygon (11000,105;11000,2005;12000,2005;12000,105) #0\n"
"polygon (11000,105;11000,2005;12000,2005;12000,105) #8\n"
"polygon (11000,20105;11000,22005;12000,22005;12000,20105) #0\n"
"polygon (11000,20105;11000,22005;12000,22005;12000,20105) #8\n"
"polygon (150,150;150,2050;1150,2050;1150,150) #0\n"
"polygon (150,150;150,2050;1150,2050;1150,150) #3\n"
"polygon (22000,10105;22000,12005;23000,12005;23000,10105) #0\n"
"polygon (22000,10105;22000,12005;23000,12005;23000,10105) #8\n"
"polygon (22000,105;22000,2005;23000,2005;23000,105) #0\n"
"polygon (22000,105;22000,2005;23000,2005;23000,105) #8\n"
"polygon (22000,20105;22000,22005;23000,22005;23000,20105) #0\n"
"polygon (22000,20105;22000,22005;23000,22005;23000,20105) #8\n"
"polygon (33000,10105;33000,12005;34000,12005;34000,10105) #0\n"
"polygon (33000,10105;33000,12005;34000,12005;34000,10105) #8\n"
"polygon (33000,105;33000,2005;34000,2005;34000,105) #0\n"
"polygon (33000,105;33000,2005;34000,2005;34000,105) #8\n"
"polygon (33000,20105;33000,22005;34000,22005;34000,20105) #0\n"
"polygon (33000,20105;33000,22005;34000,22005;34000,20105) #8\n"
);
// tests simple copy
copy = topcell.shapes(lindex);
EXPECT_EQ (shapes_to_string_norm (_this, topcell.shapes (lindex)), shapes_to_string_norm (_this, copy));
// tests translate
db::Shapes other_copy (&m, &other_topcell, db::default_editable_mode ());
other_copy = topcell.shapes(lindex);
EXPECT_EQ (shapes_to_string_norm (_this, topcell.shapes (lindex)), shapes_to_string_norm (_this, other_copy));
// tests translate plus transform
other_copy.assign_transformed (topcell.shapes(lindex), db::ICplxTrans (2.0));
EXPECT_EQ (shapes_to_string_norm (_this, topcell.shapes (lindex)), shapes_to_string_norm (_this, other_copy, db::ICplxTrans (0.5)));
// tests deref
db::Shapes sb_copy;
sb_copy = topcell.shapes(lindex);
EXPECT_EQ (shapes_to_string_norm (_this, topcell.shapes (lindex)), shapes_to_string_norm (_this, sb_copy));
// tests deref plus transform
sb_copy.assign_transformed (topcell.shapes(lindex), db::ICplxTrans (2.0));
EXPECT_EQ (shapes_to_string_norm (_this, topcell.shapes (lindex)), shapes_to_string_norm (_this, sb_copy, db::ICplxTrans (0.5)));
tl::ident_map<db::Layout::properties_id_type> pm;
copy.clear ();
for (db::Shapes::shape_iterator shape = topcell.shapes (lindex).begin (db::Shapes::shape_iterator::All); ! shape.at_end (); ++shape) {
copy.insert (*shape, pm);
}
EXPECT_EQ (shapes_to_string (_this, copy),
"polygon (0,100;0,2000;1000,2000;1000,100) #0\n"
"polygon (100,200;100,2100;1100,2100;1100,200) #0\n"
"polygon (150,150;150,2050;1150,2050;1150,150) #0\n"
"polygon (0,100;0,2000;1000,2000;1000,100) #1\n"
"polygon (100,200;100,2100;1100,2100;1100,200) #2\n"
"polygon (150,150;150,2050;1150,2050;1150,150) #3\n"
"polygon (-10,115;-10,2015;990,2015;990,115) #0\n"
"polygon (-10,315;-10,2215;990,2215;990,315) #0\n"
"polygon (-60,365;-60,2265;940,2265;940,365) #0\n"
"polygon (0,105;0,2005;1000,2005;1000,105) #0\n"
"polygon (0,10105;0,12005;1000,12005;1000,10105) #0\n"
"polygon (0,20105;0,22005;1000,22005;1000,20105) #0\n"
"polygon (11000,105;11000,2005;12000,2005;12000,105) #0\n"
"polygon (11000,10105;11000,12005;12000,12005;12000,10105) #0\n"
"polygon (11000,20105;11000,22005;12000,22005;12000,20105) #0\n"
"polygon (22000,105;22000,2005;23000,2005;23000,105) #0\n"
"polygon (22000,10105;22000,12005;23000,12005;23000,10105) #0\n"
"polygon (22000,20105;22000,22005;23000,22005;23000,20105) #0\n"
"polygon (33000,105;33000,2005;34000,2005;34000,105) #0\n"
"polygon (33000,10105;33000,12005;34000,12005;34000,10105) #0\n"
"polygon (33000,20105;33000,22005;34000,22005;34000,20105) #0\n"
"polygon (-10,115;-10,2015;990,2015;990,115) #5\n"
"polygon (-10,315;-10,2215;990,2215;990,315) #6\n"
"polygon (-60,365;-60,2265;940,2265;940,365) #7\n"
"polygon (0,105;0,2005;1000,2005;1000,105) #8\n"
"polygon (0,10105;0,12005;1000,12005;1000,10105) #8\n"
"polygon (0,20105;0,22005;1000,22005;1000,20105) #8\n"
"polygon (11000,105;11000,2005;12000,2005;12000,105) #8\n"
"polygon (11000,10105;11000,12005;12000,12005;12000,10105) #8\n"
"polygon (11000,20105;11000,22005;12000,22005;12000,20105) #8\n"
"polygon (22000,105;22000,2005;23000,2005;23000,105) #8\n"
"polygon (22000,10105;22000,12005;23000,12005;23000,10105) #8\n"
"polygon (22000,20105;22000,22005;23000,22005;23000,20105) #8\n"
"polygon (33000,105;33000,2005;34000,2005;34000,105) #8\n"
"polygon (33000,10105;33000,12005;34000,12005;34000,10105) #8\n"
"polygon (33000,20105;33000,22005;34000,22005;34000,20105) #8\n"
);
db::Shapes sa_copy;
for (db::Shapes::shape_iterator shape = topcell.shapes (lindex).begin (db::Shapes::shape_iterator::All); ! shape.at_end (); ++shape) {
sa_copy.insert (*shape);
}
EXPECT_EQ (shapes_to_string (_this, sa_copy),
"polygon (0,100;0,2000;1000,2000;1000,100) #0\n"
"polygon (100,200;100,2100;1100,2100;1100,200) #0\n"
"polygon (150,150;150,2050;1150,2050;1150,150) #0\n"
"polygon (-10,115;-10,2015;990,2015;990,115) #0\n"
"polygon (-10,315;-10,2215;990,2215;990,315) #0\n"
"polygon (-60,365;-60,2265;940,2265;940,365) #0\n"
"polygon (0,105;0,2005;1000,2005;1000,105) #0\n"
"polygon (0,10105;0,12005;1000,12005;1000,10105) #0\n"
"polygon (0,20105;0,22005;1000,22005;1000,20105) #0\n"
"polygon (11000,105;11000,2005;12000,2005;12000,105) #0\n"
"polygon (11000,10105;11000,12005;12000,12005;12000,10105) #0\n"
"polygon (11000,20105;11000,22005;12000,22005;12000,20105) #0\n"
"polygon (22000,105;22000,2005;23000,2005;23000,105) #0\n"
"polygon (22000,10105;22000,12005;23000,12005;23000,10105) #0\n"
"polygon (22000,20105;22000,22005;23000,22005;23000,20105) #0\n"
"polygon (33000,105;33000,2005;34000,2005;34000,105) #0\n"
"polygon (33000,10105;33000,12005;34000,12005;34000,10105) #0\n"
"polygon (33000,20105;33000,22005;34000,22005;34000,20105) #0\n"
"polygon (0,100;0,2000;1000,2000;1000,100) #1\n"
"polygon (100,200;100,2100;1100,2100;1100,200) #2\n"
"polygon (150,150;150,2050;1150,2050;1150,150) #3\n"
"polygon (-10,115;-10,2015;990,2015;990,115) #5\n"
"polygon (-10,315;-10,2215;990,2215;990,315) #6\n"
"polygon (-60,365;-60,2265;940,2265;940,365) #7\n"
"polygon (0,105;0,2005;1000,2005;1000,105) #8\n"
"polygon (0,10105;0,12005;1000,12005;1000,10105) #8\n"
"polygon (0,20105;0,22005;1000,22005;1000,20105) #8\n"
"polygon (11000,105;11000,2005;12000,2005;12000,105) #8\n"
"polygon (11000,10105;11000,12005;12000,12005;12000,10105) #8\n"
"polygon (11000,20105;11000,22005;12000,22005;12000,20105) #8\n"
"polygon (22000,105;22000,2005;23000,2005;23000,105) #8\n"
"polygon (22000,10105;22000,12005;23000,12005;23000,10105) #8\n"
"polygon (22000,20105;22000,22005;23000,22005;23000,20105) #8\n"
"polygon (33000,105;33000,2005;34000,2005;34000,105) #8\n"
"polygon (33000,10105;33000,12005;34000,12005;34000,10105) #8\n"
"polygon (33000,20105;33000,22005;34000,22005;34000,20105) #8\n"
);
if (db::default_editable_mode ()) {
db::Shapes::shape_iterator shape = topcell.shapes (lindex).begin (db::Shapes::shape_iterator::All);
++shape;
db::Shape s1 = *shape;
for (unsigned int i = 0; i < 3; ++i) { ++shape; }
db::Shape s2 = *shape;
for (unsigned int i = 0; i < 3; ++i) { ++shape; }
db::Shape s3 = *shape;
for (unsigned int i = 0; i < 3; ++i) { ++shape; }
db::Shape s4 = *shape;
for (unsigned int i = 0; i < 3; ++i) { ++shape; }
db::Shape s5 = *shape;
for (unsigned int i = 0; i < 12; ++i) { ++shape; }
db::Shape s6 = *shape;
topcell.shapes (lindex).erase_shape (s1);
topcell.shapes (lindex).erase_shape (s2);
topcell.shapes (lindex).erase_shape (s3);
topcell.shapes (lindex).erase_shape (s4);
topcell.shapes (lindex).erase_shape (s5);
topcell.shapes (lindex).erase_shape (s6);
EXPECT_EQ (shapes_to_string (_this, topcell.shapes (lindex)),
"polygon (0,100;0,2000;1000,2000;1000,100) #0\n"
"polygon (150,150;150,2050;1150,2050;1150,150) #0\n"
"polygon (0,100;0,2000;1000,2000;1000,100) #1\n"
"polygon (150,150;150,2050;1150,2050;1150,150) #3\n"
"polygon (-10,115;-10,2015;990,2015;990,115) #0\n"
"polygon (-60,365;-60,2265;940,2265;940,365) #0\n"
"polygon (0,105;0,2005;1000,2005;1000,105) #0\n"
"polygon (0,20105;0,22005;1000,22005;1000,20105) #0\n"
"polygon (11000,105;11000,2005;12000,2005;12000,105) #0\n"
"polygon (11000,20105;11000,22005;12000,22005;12000,20105) #0\n"
"polygon (22000,105;22000,2005;23000,2005;23000,105) #0\n"
"polygon (22000,10105;22000,12005;23000,12005;23000,10105) #0\n"
"polygon (22000,20105;22000,22005;23000,22005;23000,20105) #0\n"
"polygon (33000,105;33000,2005;34000,2005;34000,105) #0\n"
"polygon (33000,10105;33000,12005;34000,12005;34000,10105) #0\n"
"polygon (33000,20105;33000,22005;34000,22005;34000,20105) #0\n"
"polygon (-10,115;-10,2015;990,2015;990,115) #5\n"
"polygon (-10,315;-10,2215;990,2215;990,315) #6\n"
"polygon (-60,365;-60,2265;940,2265;940,365) #7\n"
"polygon (0,105;0,2005;1000,2005;1000,105) #8\n"
"polygon (0,20105;0,22005;1000,22005;1000,20105) #8\n"
"polygon (11000,105;11000,2005;12000,2005;12000,105) #8\n"
"polygon (11000,10105;11000,12005;12000,12005;12000,10105) #8\n"
"polygon (11000,20105;11000,22005;12000,22005;12000,20105) #8\n"
"polygon (22000,105;22000,2005;23000,2005;23000,105) #8\n"
"polygon (22000,10105;22000,12005;23000,12005;23000,10105) #8\n"
"polygon (22000,20105;22000,22005;23000,22005;23000,20105) #8\n"
"polygon (33000,105;33000,2005;34000,2005;34000,105) #8\n"
"polygon (33000,10105;33000,12005;34000,12005;34000,10105) #8\n"
"polygon (33000,20105;33000,22005;34000,22005;34000,20105) #8\n"
);
// test shape insert from shape reference
copy.clear ();
for (db::Shapes::shape_iterator shape = topcell.shapes (lindex).begin (db::Shapes::shape_iterator::All); ! shape.at_end (); ++shape) {
copy.insert (*shape, pm);
}
EXPECT_EQ (shapes_to_string (_this, copy), shapes_to_string (_this, topcell.shapes (lindex)));
// test shape insert from shape reference with transformation
copy.clear ();
db::ICplxTrans t (2.0, 90.0, false, db::Vector (100, -50));
db::ICplxTrans ti = t.inverted ();
for (db::Shapes::shape_iterator shape = topcell.shapes (lindex).begin (db::Shapes::shape_iterator::All); ! shape.at_end (); ++shape) {
db::Shape s = copy.insert (*shape, t, pm);
copy.transform (s, ti);
}
EXPECT_EQ (shapes_to_string_norm (_this, copy), shapes_to_string_norm (_this, topcell.shapes (lindex)));
// test shape insert from shape reference with property modification
copy.clear ();
for (db::Shapes::shape_iterator shape = topcell.shapes (lindex).begin (db::Shapes::shape_iterator::All); ! shape.at_end (); ++shape) {
plus1 pm;
copy.insert (*shape, pm);
}
for (db::Shapes::shape_iterator shape = topcell.shapes (lindex).begin (db::Shapes::shape_iterator::All); ! shape.at_end (); ++shape) {
if (shape->has_prop_id ()) {
topcell.shapes (lindex).replace_prop_id (*shape, shape->prop_id () + 1);
}
}
EXPECT_EQ (shapes_to_string (_this, copy), shapes_to_string (_this, topcell.shapes (lindex)));
}
}
TEST(2A)
{
db::Manager m;
db::Layout layout (&m);
unsigned int lindex = read_testdata (layout, 0x1);
db::Cell &topcell = layout.cell (*layout.begin_top_down ());
db::Shapes copy (&m, &topcell, db::default_editable_mode ());
if (db::default_editable_mode ()) {
db::Shapes::shape_iterator shape = topcell.shapes (lindex).begin (db::Shapes::shape_iterator::All);
++shape;
topcell.shapes (lindex).erase_shape (*shape);
// duplicate erase should not hurt:
topcell.shapes (lindex).erase_shape (*shape);
topcell.shapes (lindex).erase_shape (*shape);
topcell.shapes (lindex).erase_shape (*shape);
for (unsigned int i = 0; i < 3; ++i) { ++shape; }
topcell.shapes (lindex).erase_shape (*shape);
for (unsigned int i = 0; i < 3; ++i) { ++shape; }
topcell.shapes (lindex).erase_shape (*shape);
for (unsigned int i = 0; i < 3; ++i) { ++shape; }
topcell.shapes (lindex).erase_shape (*shape);
for (unsigned int i = 0; i < 3; ++i) { ++shape; }
topcell.shapes (lindex).erase_shape (*shape);
for (unsigned int i = 0; i < 12; ++i) { ++shape; }
topcell.shapes (lindex).erase_shape (*shape);
EXPECT_EQ (shapes_to_string (_this, topcell.shapes (lindex)),
"polygon (0,100;0,2000;1000,2000;1000,100) #0\n"
"polygon (150,150;150,2050;1150,2050;1150,150) #0\n"
"polygon (0,100;0,2000;1000,2000;1000,100) #1\n"
"polygon (150,150;150,2050;1150,2050;1150,150) #3\n"
"polygon (-10,115;-10,2015;990,2015;990,115) #0\n"
"polygon (-60,365;-60,2265;940,2265;940,365) #0\n"
"polygon (0,105;0,2005;1000,2005;1000,105) #0\n"
"polygon (0,20105;0,22005;1000,22005;1000,20105) #0\n"
"polygon (11000,105;11000,2005;12000,2005;12000,105) #0\n"
"polygon (11000,20105;11000,22005;12000,22005;12000,20105) #0\n"
"polygon (22000,105;22000,2005;23000,2005;23000,105) #0\n"
"polygon (22000,10105;22000,12005;23000,12005;23000,10105) #0\n"
"polygon (22000,20105;22000,22005;23000,22005;23000,20105) #0\n"
"polygon (33000,105;33000,2005;34000,2005;34000,105) #0\n"
"polygon (33000,10105;33000,12005;34000,12005;34000,10105) #0\n"
"polygon (33000,20105;33000,22005;34000,22005;34000,20105) #0\n"
"polygon (-10,115;-10,2015;990,2015;990,115) #5\n"
"polygon (-10,315;-10,2215;990,2215;990,315) #6\n"
"polygon (-60,365;-60,2265;940,2265;940,365) #7\n"
"polygon (0,105;0,2005;1000,2005;1000,105) #8\n"
"polygon (0,20105;0,22005;1000,22005;1000,20105) #8\n"
"polygon (11000,105;11000,2005;12000,2005;12000,105) #8\n"
"polygon (11000,10105;11000,12005;12000,12005;12000,10105) #8\n"
"polygon (11000,20105;11000,22005;12000,22005;12000,20105) #8\n"
"polygon (22000,105;22000,2005;23000,2005;23000,105) #8\n"
"polygon (22000,10105;22000,12005;23000,12005;23000,10105) #8\n"
"polygon (22000,20105;22000,22005;23000,22005;23000,20105) #8\n"
"polygon (33000,105;33000,2005;34000,2005;34000,105) #8\n"
"polygon (33000,10105;33000,12005;34000,12005;34000,10105) #8\n"
"polygon (33000,20105;33000,22005;34000,22005;34000,20105) #8\n"
);
// test shape insert from shape reference
copy.clear ();
for (db::Shapes::shape_iterator shape = topcell.shapes (lindex).begin (db::Shapes::shape_iterator::All); ! shape.at_end (); ++shape) {
copy.insert (*shape);
}
EXPECT_EQ (shapes_to_string (_this, copy), shapes_to_string (_this, topcell.shapes (lindex)));
// test shape insert from shape reference with property modification
copy.clear ();
for (db::Shapes::shape_iterator shape = topcell.shapes (lindex).begin (db::Shapes::shape_iterator::All); ! shape.at_end (); ++shape) {
plus1 pm;
copy.insert (*shape, pm);
}
for (db::Shapes::shape_iterator shape = topcell.shapes (lindex).begin (db::Shapes::shape_iterator::All); ! shape.at_end (); ++shape) {
if (shape->has_prop_id ()) {
topcell.shapes (lindex).replace_prop_id (*shape, shape->prop_id () + 1);
}
}
EXPECT_EQ (shapes_to_string (_this, copy), shapes_to_string (_this, topcell.shapes (lindex)));
shape = topcell.shapes (lindex).begin (db::Shapes::shape_iterator::All);
while (! shape.at_end ()) {
topcell.shapes (lindex).erase_shape (*shape);
++shape;
}
EXPECT_EQ (shapes_to_string (_this, topcell.shapes (lindex)), "");
}
}
TEST(3)
{
db::Manager m;
db::Layout other_layout (&m);
db::Cell &other_topcell = other_layout.cell (other_layout.add_cell ());
db::Layout layout (&m);
unsigned int lindex = read_testdata (layout, 0x2);
db::Cell &topcell = layout.cell (*layout.begin_top_down ());
db::Shapes copy (&m, &topcell, db::default_editable_mode ());
EXPECT_EQ (shapes_to_string_norm (_this, topcell.shapes (lindex)),
"polygon (-10,115;-10,1015;1990,1015;1990,115) #0\n"
"polygon (-10,115;-10,1015;1990,1015;1990,115) #5\n"
"polygon (-10,315;-10,1215;1990,1215;1990,315) #0\n"
"polygon (-10,315;-10,1215;1990,1215;1990,315) #6\n"
"polygon (-60,365;-60,1265;1940,1265;1940,365) #0\n"
"polygon (-60,365;-60,1265;1940,1265;1940,365) #7\n"
"polygon (0,100;0,1000;2000,1000;2000,100) #0\n"
"polygon (0,100;0,1000;2000,1000;2000,100) #1\n"
"polygon (0,10105;0,11005;2000,11005;2000,10105) #0\n"
"polygon (0,10105;0,11005;2000,11005;2000,10105) #8\n"
"polygon (0,105;0,1005;2000,1005;2000,105) #0\n"
"polygon (0,105;0,1005;2000,1005;2000,105) #8\n"
"polygon (0,20105;0,21005;2000,21005;2000,20105) #0\n"
"polygon (0,20105;0,21005;2000,21005;2000,20105) #8\n"
"polygon (100,200;100,1100;2100,1100;2100,200) #0\n"
"polygon (100,200;100,1100;2100,1100;2100,200) #2\n"
"polygon (11000,10105;11000,11005;13000,11005;13000,10105) #0\n"
"polygon (11000,10105;11000,11005;13000,11005;13000,10105) #8\n"
"polygon (11000,105;11000,1005;13000,1005;13000,105) #0\n"
"polygon (11000,105;11000,1005;13000,1005;13000,105) #8\n"
"polygon (11000,20105;11000,21005;13000,21005;13000,20105) #0\n"
"polygon (11000,20105;11000,21005;13000,21005;13000,20105) #8\n"
"polygon (150,150;150,1050;2150,1050;2150,150) #0\n"
"polygon (150,150;150,1050;2150,1050;2150,150) #3\n"
"polygon (22000,10105;22000,11005;24000,11005;24000,10105) #0\n"
"polygon (22000,10105;22000,11005;24000,11005;24000,10105) #8\n"
"polygon (22000,105;22000,1005;24000,1005;24000,105) #0\n"
"polygon (22000,105;22000,1005;24000,1005;24000,105) #8\n"
"polygon (22000,20105;22000,21005;24000,21005;24000,20105) #0\n"
"polygon (22000,20105;22000,21005;24000,21005;24000,20105) #8\n"
"polygon (33000,10105;33000,11005;35000,11005;35000,10105) #0\n"
"polygon (33000,10105;33000,11005;35000,11005;35000,10105) #8\n"
"polygon (33000,105;33000,1005;35000,1005;35000,105) #0\n"
"polygon (33000,105;33000,1005;35000,1005;35000,105) #8\n"
"polygon (33000,20105;33000,21005;35000,21005;35000,20105) #0\n"
"polygon (33000,20105;33000,21005;35000,21005;35000,20105) #8\n"
);
// tests simple copy
copy = topcell.shapes(lindex);
EXPECT_EQ (shapes_to_string_norm (_this, topcell.shapes (lindex)), shapes_to_string_norm (_this, copy));
// tests translate
db::Shapes other_copy (&m, &other_topcell, db::default_editable_mode ());
other_copy = topcell.shapes(lindex);
EXPECT_EQ (shapes_to_string_norm (_this, topcell.shapes (lindex)), shapes_to_string_norm (_this, other_copy));
// tests translate plus transform
other_copy.assign_transformed (topcell.shapes(lindex), db::ICplxTrans (2.0));
EXPECT_EQ (shapes_to_string_norm (_this, topcell.shapes (lindex)), shapes_to_string_norm (_this, other_copy, db::ICplxTrans (0.5)));
// tests deref
db::Shapes sb_copy;
sb_copy = topcell.shapes(lindex);
EXPECT_EQ (shapes_to_string_norm (_this, topcell.shapes (lindex)), shapes_to_string_norm (_this, sb_copy));
// tests deref plus transform
sb_copy.assign_transformed (topcell.shapes(lindex), db::ICplxTrans (2.0));
EXPECT_EQ (shapes_to_string_norm (_this, topcell.shapes (lindex)), shapes_to_string_norm (_this, sb_copy, db::ICplxTrans (0.5)));
copy.clear ();
for (db::Shapes::shape_iterator shape = topcell.shapes (lindex).begin (db::Shapes::shape_iterator::All); ! shape.at_end (); ++shape) {
copy.insert (*shape);
}
EXPECT_EQ (shapes_to_string (_this, copy),
"polygon (0,100;0,1000;2000,1000;2000,100) #0\n"
"polygon (100,200;100,1100;2100,1100;2100,200) #0\n"
"polygon (150,150;150,1050;2150,1050;2150,150) #0\n"
"polygon (0,100;0,1000;2000,1000;2000,100) #1\n"
"polygon (100,200;100,1100;2100,1100;2100,200) #2\n"
"polygon (150,150;150,1050;2150,1050;2150,150) #3\n"
"polygon (-10,115;-10,1015;1990,1015;1990,115) #0\n"
"polygon (-10,315;-10,1215;1990,1215;1990,315) #0\n"
"polygon (-60,365;-60,1265;1940,1265;1940,365) #0\n"
"polygon (0,105;0,1005;2000,1005;2000,105) #0\n"
"polygon (0,10105;0,11005;2000,11005;2000,10105) #0\n"
"polygon (0,20105;0,21005;2000,21005;2000,20105) #0\n"
"polygon (11000,105;11000,1005;13000,1005;13000,105) #0\n"
"polygon (11000,10105;11000,11005;13000,11005;13000,10105) #0\n"
"polygon (11000,20105;11000,21005;13000,21005;13000,20105) #0\n"
"polygon (22000,105;22000,1005;24000,1005;24000,105) #0\n"
"polygon (22000,10105;22000,11005;24000,11005;24000,10105) #0\n"
"polygon (22000,20105;22000,21005;24000,21005;24000,20105) #0\n"
"polygon (33000,105;33000,1005;35000,1005;35000,105) #0\n"
"polygon (33000,10105;33000,11005;35000,11005;35000,10105) #0\n"
"polygon (33000,20105;33000,21005;35000,21005;35000,20105) #0\n"
"polygon (-10,115;-10,1015;1990,1015;1990,115) #5\n"
"polygon (-10,315;-10,1215;1990,1215;1990,315) #6\n"
"polygon (-60,365;-60,1265;1940,1265;1940,365) #7\n"
"polygon (0,105;0,1005;2000,1005;2000,105) #8\n"
"polygon (0,10105;0,11005;2000,11005;2000,10105) #8\n"
"polygon (0,20105;0,21005;2000,21005;2000,20105) #8\n"
"polygon (11000,105;11000,1005;13000,1005;13000,105) #8\n"
"polygon (11000,10105;11000,11005;13000,11005;13000,10105) #8\n"
"polygon (11000,20105;11000,21005;13000,21005;13000,20105) #8\n"
"polygon (22000,105;22000,1005;24000,1005;24000,105) #8\n"
"polygon (22000,10105;22000,11005;24000,11005;24000,10105) #8\n"
"polygon (22000,20105;22000,21005;24000,21005;24000,20105) #8\n"
"polygon (33000,105;33000,1005;35000,1005;35000,105) #8\n"
"polygon (33000,10105;33000,11005;35000,11005;35000,10105) #8\n"
"polygon (33000,20105;33000,21005;35000,21005;35000,20105) #8\n"
);
db::Shapes sa_copy;
sa_copy.clear ();
for (db::Shapes::shape_iterator shape = topcell.shapes (lindex).begin (db::Shapes::shape_iterator::All); ! shape.at_end (); ++shape) {
sa_copy.insert (*shape);
}
EXPECT_EQ (shapes_to_string (_this, sa_copy),
"polygon (0,100;0,1000;2000,1000;2000,100) #0\n"
"polygon (100,200;100,1100;2100,1100;2100,200) #0\n"
"polygon (150,150;150,1050;2150,1050;2150,150) #0\n"
"polygon (-10,115;-10,1015;1990,1015;1990,115) #0\n"
"polygon (-10,315;-10,1215;1990,1215;1990,315) #0\n"
"polygon (-60,365;-60,1265;1940,1265;1940,365) #0\n"
"polygon (0,105;0,1005;2000,1005;2000,105) #0\n"
"polygon (0,10105;0,11005;2000,11005;2000,10105) #0\n"
"polygon (0,20105;0,21005;2000,21005;2000,20105) #0\n"
"polygon (11000,105;11000,1005;13000,1005;13000,105) #0\n"
"polygon (11000,10105;11000,11005;13000,11005;13000,10105) #0\n"
"polygon (11000,20105;11000,21005;13000,21005;13000,20105) #0\n"
"polygon (22000,105;22000,1005;24000,1005;24000,105) #0\n"
"polygon (22000,10105;22000,11005;24000,11005;24000,10105) #0\n"
"polygon (22000,20105;22000,21005;24000,21005;24000,20105) #0\n"
"polygon (33000,105;33000,1005;35000,1005;35000,105) #0\n"
"polygon (33000,10105;33000,11005;35000,11005;35000,10105) #0\n"
"polygon (33000,20105;33000,21005;35000,21005;35000,20105) #0\n"
"polygon (0,100;0,1000;2000,1000;2000,100) #1\n"
"polygon (100,200;100,1100;2100,1100;2100,200) #2\n"
"polygon (150,150;150,1050;2150,1050;2150,150) #3\n"
"polygon (-10,115;-10,1015;1990,1015;1990,115) #5\n"
"polygon (-10,315;-10,1215;1990,1215;1990,315) #6\n"
"polygon (-60,365;-60,1265;1940,1265;1940,365) #7\n"
"polygon (0,105;0,1005;2000,1005;2000,105) #8\n"
"polygon (0,10105;0,11005;2000,11005;2000,10105) #8\n"
"polygon (0,20105;0,21005;2000,21005;2000,20105) #8\n"
"polygon (11000,105;11000,1005;13000,1005;13000,105) #8\n"
"polygon (11000,10105;11000,11005;13000,11005;13000,10105) #8\n"
"polygon (11000,20105;11000,21005;13000,21005;13000,20105) #8\n"
"polygon (22000,105;22000,1005;24000,1005;24000,105) #8\n"
"polygon (22000,10105;22000,11005;24000,11005;24000,10105) #8\n"
"polygon (22000,20105;22000,21005;24000,21005;24000,20105) #8\n"
"polygon (33000,105;33000,1005;35000,1005;35000,105) #8\n"
"polygon (33000,10105;33000,11005;35000,11005;35000,10105) #8\n"
"polygon (33000,20105;33000,21005;35000,21005;35000,20105) #8\n"
);
db::Shapes::shape_iterator shape = topcell.shapes (lindex).begin (db::Shapes::shape_iterator::All);
++shape;
db::Shape s1 = *shape;
for (unsigned int i = 0; i < 3; ++i) { ++shape; }
db::Shape s2 = *shape;
for (unsigned int i = 0; i < 3; ++i) { ++shape; }
db::Shape s3 = *shape;
for (unsigned int i = 0; i < 3; ++i) { ++shape; }
db::Shape s4 = *shape;
for (unsigned int i = 0; i < 3; ++i) { ++shape; }
db::Shape s5 = *shape;
for (unsigned int i = 0; i < 12; ++i) { ++shape; }
db::Shape s6 = *shape;
if (db::default_editable_mode ()) {
topcell.shapes (lindex).erase_shape (s1);
topcell.shapes (lindex).erase_shape (s2);
topcell.shapes (lindex).erase_shape (s3);
topcell.shapes (lindex).erase_shape (s4);
topcell.shapes (lindex).erase_shape (s5);
topcell.shapes (lindex).erase_shape (s6);
EXPECT_EQ (shapes_to_string (_this, topcell.shapes (lindex)),
"polygon (0,100;0,1000;2000,1000;2000,100) #0\n"
"polygon (150,150;150,1050;2150,1050;2150,150) #0\n"
"polygon (0,100;0,1000;2000,1000;2000,100) #1\n"
"polygon (150,150;150,1050;2150,1050;2150,150) #3\n"
"polygon (-10,115;-10,1015;1990,1015;1990,115) #0\n"
"polygon (-60,365;-60,1265;1940,1265;1940,365) #0\n"
"polygon (0,105;0,1005;2000,1005;2000,105) #0\n"
"polygon (0,20105;0,21005;2000,21005;2000,20105) #0\n"
"polygon (11000,105;11000,1005;13000,1005;13000,105) #0\n"
"polygon (11000,20105;11000,21005;13000,21005;13000,20105) #0\n"
"polygon (22000,105;22000,1005;24000,1005;24000,105) #0\n"
"polygon (22000,10105;22000,11005;24000,11005;24000,10105) #0\n"
"polygon (22000,20105;22000,21005;24000,21005;24000,20105) #0\n"
"polygon (33000,105;33000,1005;35000,1005;35000,105) #0\n"
"polygon (33000,10105;33000,11005;35000,11005;35000,10105) #0\n"
"polygon (33000,20105;33000,21005;35000,21005;35000,20105) #0\n"
"polygon (-10,115;-10,1015;1990,1015;1990,115) #5\n"
"polygon (-10,315;-10,1215;1990,1215;1990,315) #6\n"
"polygon (-60,365;-60,1265;1940,1265;1940,365) #7\n"
"polygon (0,105;0,1005;2000,1005;2000,105) #8\n"
"polygon (0,20105;0,21005;2000,21005;2000,20105) #8\n"
"polygon (11000,105;11000,1005;13000,1005;13000,105) #8\n"
"polygon (11000,10105;11000,11005;13000,11005;13000,10105) #8\n"
"polygon (11000,20105;11000,21005;13000,21005;13000,20105) #8\n"
"polygon (22000,105;22000,1005;24000,1005;24000,105) #8\n"
"polygon (22000,10105;22000,11005;24000,11005;24000,10105) #8\n"
"polygon (22000,20105;22000,21005;24000,21005;24000,20105) #8\n"
"polygon (33000,105;33000,1005;35000,1005;35000,105) #8\n"
"polygon (33000,10105;33000,11005;35000,11005;35000,10105) #8\n"
"polygon (33000,20105;33000,21005;35000,21005;35000,20105) #8\n"
);
// test shape insert from shape reference
copy.clear ();
for (db::Shapes::shape_iterator shape = topcell.shapes (lindex).begin (db::Shapes::shape_iterator::All); ! shape.at_end (); ++shape) {
copy.insert (*shape);
}
EXPECT_EQ (shapes_to_string (_this, copy), shapes_to_string (_this, topcell.shapes (lindex)));
// test shape insert from shape reference with transformation
copy.clear ();
db::ICplxTrans t (2.0, 90.0, false, db::Vector (100, -50));
db::ICplxTrans ti = t.inverted ();
for (db::Shapes::shape_iterator shape = topcell.shapes (lindex).begin (db::Shapes::shape_iterator::All); ! shape.at_end (); ++shape) {
tl::ident_map<db::Layout::properties_id_type> pm;
db::Shape s = copy.insert (*shape, t, pm);
copy.transform (s, ti);
}
EXPECT_EQ (shapes_to_string_norm (_this, copy), shapes_to_string_norm (_this, topcell.shapes (lindex)));
// test shape insert from shape reference with property modification
copy.clear ();
for (db::Shapes::shape_iterator shape = topcell.shapes (lindex).begin (db::Shapes::shape_iterator::All); ! shape.at_end (); ++shape) {
plus1 pm;
copy.insert (*shape, pm);
}
for (db::Shapes::shape_iterator shape = topcell.shapes (lindex).begin (db::Shapes::shape_iterator::All); ! shape.at_end (); ++shape) {
if (shape->has_prop_id ()) {
topcell.shapes (lindex).replace_prop_id (*shape, shape->prop_id () + 1);
}
}
EXPECT_EQ (shapes_to_string (_this, copy), shapes_to_string (_this, topcell.shapes (lindex)));
}
}
TEST(4)
{
db::Manager m;
db::Layout other_layout (&m);
db::Cell &other_topcell = other_layout.cell (other_layout.add_cell ());
db::Layout layout (&m);
unsigned int lindex = read_testdata (layout, 0x4);
db::Cell &topcell = layout.cell (*layout.begin_top_down ());
db::Shapes copy (&m, &topcell, db::default_editable_mode ());
EXPECT_EQ (shapes_to_string_norm (_this, topcell.shapes (lindex)),
"path (-10,115;-10,515;190,715) w=100 bx=0 ex=0 r=false #0\n"
"path (-10,115;-10,515;190,715) w=100 bx=0 ex=0 r=false #5\n"
"path (-110,1215;-110,1615;90,1415) w=150 bx=0 ex=0 r=false #0\n"
"path (-110,1215;-110,1615;90,1415) w=150 bx=0 ex=0 r=false #6\n"
"path (-210,2315;-210,2715;-410,2915) w=200 bx=0 ex=0 r=false #0\n"
"path (-210,2315;-210,2715;-410,2915) w=200 bx=0 ex=0 r=false #7\n"
"path (0,100;0,500;200,700) w=100 bx=0 ex=0 r=false #0\n"
"path (0,100;0,500;200,700) w=100 bx=0 ex=0 r=false #1\n"
"path (0,10105;0,10505;200,10705) w=100 bx=0 ex=0 r=false #0\n"
"path (0,10105;0,10505;200,10705) w=100 bx=0 ex=0 r=false #8\n"
"path (0,105;0,505;200,705) w=100 bx=0 ex=0 r=false #0\n"
"path (0,105;0,505;200,705) w=100 bx=0 ex=0 r=false #8\n"
"path (0,1100;0,1500;200,1300) w=150 bx=0 ex=0 r=false #0\n"
"path (0,1100;0,1500;200,1300) w=150 bx=0 ex=0 r=false #2\n"
"path (0,20105;0,20505;200,20705) w=100 bx=0 ex=0 r=false #0\n"
"path (0,20105;0,20505;200,20705) w=100 bx=0 ex=0 r=false #8\n"
"path (0,2100;0,2500;-200,2700) w=200 bx=0 ex=0 r=false #0\n"
"path (0,2100;0,2500;-200,2700) w=200 bx=0 ex=0 r=false #3\n"
"path (11000,10105;11000,10505;11200,10705) w=100 bx=0 ex=0 r=false #0\n"
"path (11000,10105;11000,10505;11200,10705) w=100 bx=0 ex=0 r=false #8\n"
"path (11000,105;11000,505;11200,705) w=100 bx=0 ex=0 r=false #0\n"
"path (11000,105;11000,505;11200,705) w=100 bx=0 ex=0 r=false #8\n"
"path (11000,20105;11000,20505;11200,20705) w=100 bx=0 ex=0 r=false #0\n"
"path (11000,20105;11000,20505;11200,20705) w=100 bx=0 ex=0 r=false #8\n"
"path (22000,10105;22000,10505;22200,10705) w=100 bx=0 ex=0 r=false #0\n"
"path (22000,10105;22000,10505;22200,10705) w=100 bx=0 ex=0 r=false #8\n"
"path (22000,105;22000,505;22200,705) w=100 bx=0 ex=0 r=false #0\n"
"path (22000,105;22000,505;22200,705) w=100 bx=0 ex=0 r=false #8\n"
"path (22000,20105;22000,20505;22200,20705) w=100 bx=0 ex=0 r=false #0\n"
"path (22000,20105;22000,20505;22200,20705) w=100 bx=0 ex=0 r=false #8\n"
"path (33000,10105;33000,10505;33200,10705) w=100 bx=0 ex=0 r=false #0\n"
"path (33000,10105;33000,10505;33200,10705) w=100 bx=0 ex=0 r=false #8\n"
"path (33000,105;33000,505;33200,705) w=100 bx=0 ex=0 r=false #0\n"
"path (33000,105;33000,505;33200,705) w=100 bx=0 ex=0 r=false #8\n"
"path (33000,20105;33000,20505;33200,20705) w=100 bx=0 ex=0 r=false #0\n"
"path (33000,20105;33000,20505;33200,20705) w=100 bx=0 ex=0 r=false #8\n"
);
// tests simple copy
copy = topcell.shapes(lindex);
EXPECT_EQ (shapes_to_string_norm (_this, topcell.shapes (lindex)), shapes_to_string_norm (_this, copy));
// tests translate
db::Shapes other_copy (&m, &other_topcell, db::default_editable_mode ());
other_copy = topcell.shapes(lindex);
EXPECT_EQ (shapes_to_string_norm (_this, topcell.shapes (lindex)), shapes_to_string_norm (_this, other_copy));
// tests translate plus transform
other_copy.assign_transformed (topcell.shapes(lindex), db::ICplxTrans (2.0));
EXPECT_EQ (shapes_to_string_norm (_this, topcell.shapes (lindex)), shapes_to_string_norm (_this, other_copy, db::ICplxTrans (0.5)));
// tests deref
db::Shapes sb_copy;
sb_copy = topcell.shapes(lindex);
EXPECT_EQ (shapes_to_string_norm (_this, topcell.shapes (lindex)), shapes_to_string_norm (_this, sb_copy));
// tests deref plus transform
sb_copy.assign_transformed (topcell.shapes(lindex), db::ICplxTrans (2.0));
EXPECT_EQ (shapes_to_string_norm (_this, topcell.shapes (lindex)), shapes_to_string_norm (_this, sb_copy, db::ICplxTrans (0.5)));
copy.clear ();
for (db::Shapes::shape_iterator shape = topcell.shapes (lindex).begin (db::Shapes::shape_iterator::All); ! shape.at_end (); ++shape) {
copy.insert (*shape);
}
EXPECT_EQ (shapes_to_string (_this, copy),
"path (0,100;0,500;200,700) w=100 bx=0 ex=0 r=false #0\n"
"path (0,1100;0,1500;200,1300) w=150 bx=0 ex=0 r=false #0\n"
"path (0,2100;0,2500;-200,2700) w=200 bx=0 ex=0 r=false #0\n"
"path (0,100;0,500;200,700) w=100 bx=0 ex=0 r=false #1\n"
"path (0,1100;0,1500;200,1300) w=150 bx=0 ex=0 r=false #2\n"
"path (0,2100;0,2500;-200,2700) w=200 bx=0 ex=0 r=false #3\n"
"path (-10,115;-10,515;190,715) w=100 bx=0 ex=0 r=false #0\n"
"path (-110,1215;-110,1615;90,1415) w=150 bx=0 ex=0 r=false #0\n"
"path (-210,2315;-210,2715;-410,2915) w=200 bx=0 ex=0 r=false #0\n"
"path (0,105;0,505;200,705) w=100 bx=0 ex=0 r=false #0\n"
"path (0,10105;0,10505;200,10705) w=100 bx=0 ex=0 r=false #0\n"
"path (0,20105;0,20505;200,20705) w=100 bx=0 ex=0 r=false #0\n"
"path (11000,105;11000,505;11200,705) w=100 bx=0 ex=0 r=false #0\n"
"path (11000,10105;11000,10505;11200,10705) w=100 bx=0 ex=0 r=false #0\n"
"path (11000,20105;11000,20505;11200,20705) w=100 bx=0 ex=0 r=false #0\n"
"path (22000,105;22000,505;22200,705) w=100 bx=0 ex=0 r=false #0\n"
"path (22000,10105;22000,10505;22200,10705) w=100 bx=0 ex=0 r=false #0\n"
"path (22000,20105;22000,20505;22200,20705) w=100 bx=0 ex=0 r=false #0\n"
"path (33000,105;33000,505;33200,705) w=100 bx=0 ex=0 r=false #0\n"
"path (33000,10105;33000,10505;33200,10705) w=100 bx=0 ex=0 r=false #0\n"
"path (33000,20105;33000,20505;33200,20705) w=100 bx=0 ex=0 r=false #0\n"
"path (-10,115;-10,515;190,715) w=100 bx=0 ex=0 r=false #5\n"
"path (-110,1215;-110,1615;90,1415) w=150 bx=0 ex=0 r=false #6\n"
"path (-210,2315;-210,2715;-410,2915) w=200 bx=0 ex=0 r=false #7\n"
"path (0,105;0,505;200,705) w=100 bx=0 ex=0 r=false #8\n"
"path (0,10105;0,10505;200,10705) w=100 bx=0 ex=0 r=false #8\n"
"path (0,20105;0,20505;200,20705) w=100 bx=0 ex=0 r=false #8\n"
"path (11000,105;11000,505;11200,705) w=100 bx=0 ex=0 r=false #8\n"
"path (11000,10105;11000,10505;11200,10705) w=100 bx=0 ex=0 r=false #8\n"
"path (11000,20105;11000,20505;11200,20705) w=100 bx=0 ex=0 r=false #8\n"
"path (22000,105;22000,505;22200,705) w=100 bx=0 ex=0 r=false #8\n"
"path (22000,10105;22000,10505;22200,10705) w=100 bx=0 ex=0 r=false #8\n"
"path (22000,20105;22000,20505;22200,20705) w=100 bx=0 ex=0 r=false #8\n"
"path (33000,105;33000,505;33200,705) w=100 bx=0 ex=0 r=false #8\n"
"path (33000,10105;33000,10505;33200,10705) w=100 bx=0 ex=0 r=false #8\n"
"path (33000,20105;33000,20505;33200,20705) w=100 bx=0 ex=0 r=false #8\n"
);
db::Shapes sa_copy;
for (db::Shapes::shape_iterator shape = topcell.shapes (lindex).begin (db::Shapes::shape_iterator::All); ! shape.at_end (); ++shape) {
sa_copy.insert (*shape);
}
EXPECT_EQ (shapes_to_string (_this, sa_copy),
"path (0,100;0,500;200,700) w=100 bx=0 ex=0 r=false #0\n"
"path (0,1100;0,1500;200,1300) w=150 bx=0 ex=0 r=false #0\n"
"path (0,2100;0,2500;-200,2700) w=200 bx=0 ex=0 r=false #0\n"
"path (-10,115;-10,515;190,715) w=100 bx=0 ex=0 r=false #0\n"
"path (-110,1215;-110,1615;90,1415) w=150 bx=0 ex=0 r=false #0\n"
"path (-210,2315;-210,2715;-410,2915) w=200 bx=0 ex=0 r=false #0\n"
"path (0,105;0,505;200,705) w=100 bx=0 ex=0 r=false #0\n"
"path (0,10105;0,10505;200,10705) w=100 bx=0 ex=0 r=false #0\n"
"path (0,20105;0,20505;200,20705) w=100 bx=0 ex=0 r=false #0\n"
"path (11000,105;11000,505;11200,705) w=100 bx=0 ex=0 r=false #0\n"
"path (11000,10105;11000,10505;11200,10705) w=100 bx=0 ex=0 r=false #0\n"
"path (11000,20105;11000,20505;11200,20705) w=100 bx=0 ex=0 r=false #0\n"
"path (22000,105;22000,505;22200,705) w=100 bx=0 ex=0 r=false #0\n"
"path (22000,10105;22000,10505;22200,10705) w=100 bx=0 ex=0 r=false #0\n"
"path (22000,20105;22000,20505;22200,20705) w=100 bx=0 ex=0 r=false #0\n"
"path (33000,105;33000,505;33200,705) w=100 bx=0 ex=0 r=false #0\n"
"path (33000,10105;33000,10505;33200,10705) w=100 bx=0 ex=0 r=false #0\n"
"path (33000,20105;33000,20505;33200,20705) w=100 bx=0 ex=0 r=false #0\n"
"path (0,100;0,500;200,700) w=100 bx=0 ex=0 r=false #1\n"
"path (0,1100;0,1500;200,1300) w=150 bx=0 ex=0 r=false #2\n"
"path (0,2100;0,2500;-200,2700) w=200 bx=0 ex=0 r=false #3\n"
"path (-10,115;-10,515;190,715) w=100 bx=0 ex=0 r=false #5\n"
"path (-110,1215;-110,1615;90,1415) w=150 bx=0 ex=0 r=false #6\n"
"path (-210,2315;-210,2715;-410,2915) w=200 bx=0 ex=0 r=false #7\n"
"path (0,105;0,505;200,705) w=100 bx=0 ex=0 r=false #8\n"
"path (0,10105;0,10505;200,10705) w=100 bx=0 ex=0 r=false #8\n"
"path (0,20105;0,20505;200,20705) w=100 bx=0 ex=0 r=false #8\n"
"path (11000,105;11000,505;11200,705) w=100 bx=0 ex=0 r=false #8\n"
"path (11000,10105;11000,10505;11200,10705) w=100 bx=0 ex=0 r=false #8\n"
"path (11000,20105;11000,20505;11200,20705) w=100 bx=0 ex=0 r=false #8\n"
"path (22000,105;22000,505;22200,705) w=100 bx=0 ex=0 r=false #8\n"
"path (22000,10105;22000,10505;22200,10705) w=100 bx=0 ex=0 r=false #8\n"
"path (22000,20105;22000,20505;22200,20705) w=100 bx=0 ex=0 r=false #8\n"
"path (33000,105;33000,505;33200,705) w=100 bx=0 ex=0 r=false #8\n"
"path (33000,10105;33000,10505;33200,10705) w=100 bx=0 ex=0 r=false #8\n"
"path (33000,20105;33000,20505;33200,20705) w=100 bx=0 ex=0 r=false #8\n"
);
db::Shapes::shape_iterator shape = topcell.shapes (lindex).begin (db::Shapes::shape_iterator::All);
++shape;
db::Shape s1 = *shape;
for (unsigned int i = 0; i < 3; ++i) { ++shape; }
db::Shape s2 = *shape;
for (unsigned int i = 0; i < 3; ++i) { ++shape; }
db::Shape s3 = *shape;
for (unsigned int i = 0; i < 3; ++i) { ++shape; }
db::Shape s4 = *shape;
for (unsigned int i = 0; i < 3; ++i) { ++shape; }
db::Shape s5 = *shape;
for (unsigned int i = 0; i < 12; ++i) { ++shape; }
db::Shape s6 = *shape;
if (db::default_editable_mode ()) {
topcell.shapes (lindex).erase_shape (s1);
topcell.shapes (lindex).erase_shape (s2);
topcell.shapes (lindex).erase_shape (s3);
topcell.shapes (lindex).erase_shape (s4);
topcell.shapes (lindex).erase_shape (s5);
topcell.shapes (lindex).erase_shape (s6);
EXPECT_EQ (shapes_to_string (_this, topcell.shapes (lindex)),
"path (0,100;0,500;200,700) w=100 bx=0 ex=0 r=false #0\n"
"path (0,2100;0,2500;-200,2700) w=200 bx=0 ex=0 r=false #0\n"
"path (0,100;0,500;200,700) w=100 bx=0 ex=0 r=false #1\n"
"path (0,2100;0,2500;-200,2700) w=200 bx=0 ex=0 r=false #3\n"
"path (-10,115;-10,515;190,715) w=100 bx=0 ex=0 r=false #0\n"
"path (-210,2315;-210,2715;-410,2915) w=200 bx=0 ex=0 r=false #0\n"
"path (0,105;0,505;200,705) w=100 bx=0 ex=0 r=false #0\n"
"path (0,20105;0,20505;200,20705) w=100 bx=0 ex=0 r=false #0\n"
"path (11000,105;11000,505;11200,705) w=100 bx=0 ex=0 r=false #0\n"
"path (11000,20105;11000,20505;11200,20705) w=100 bx=0 ex=0 r=false #0\n"
"path (22000,105;22000,505;22200,705) w=100 bx=0 ex=0 r=false #0\n"
"path (22000,10105;22000,10505;22200,10705) w=100 bx=0 ex=0 r=false #0\n"
"path (22000,20105;22000,20505;22200,20705) w=100 bx=0 ex=0 r=false #0\n"
"path (33000,105;33000,505;33200,705) w=100 bx=0 ex=0 r=false #0\n"
"path (33000,10105;33000,10505;33200,10705) w=100 bx=0 ex=0 r=false #0\n"
"path (33000,20105;33000,20505;33200,20705) w=100 bx=0 ex=0 r=false #0\n"
"path (-10,115;-10,515;190,715) w=100 bx=0 ex=0 r=false #5\n"
"path (-110,1215;-110,1615;90,1415) w=150 bx=0 ex=0 r=false #6\n"
"path (-210,2315;-210,2715;-410,2915) w=200 bx=0 ex=0 r=false #7\n"
"path (0,105;0,505;200,705) w=100 bx=0 ex=0 r=false #8\n"
"path (0,20105;0,20505;200,20705) w=100 bx=0 ex=0 r=false #8\n"
"path (11000,105;11000,505;11200,705) w=100 bx=0 ex=0 r=false #8\n"
"path (11000,10105;11000,10505;11200,10705) w=100 bx=0 ex=0 r=false #8\n"
"path (11000,20105;11000,20505;11200,20705) w=100 bx=0 ex=0 r=false #8\n"
"path (22000,105;22000,505;22200,705) w=100 bx=0 ex=0 r=false #8\n"
"path (22000,10105;22000,10505;22200,10705) w=100 bx=0 ex=0 r=false #8\n"
"path (22000,20105;22000,20505;22200,20705) w=100 bx=0 ex=0 r=false #8\n"
"path (33000,105;33000,505;33200,705) w=100 bx=0 ex=0 r=false #8\n"
"path (33000,10105;33000,10505;33200,10705) w=100 bx=0 ex=0 r=false #8\n"
"path (33000,20105;33000,20505;33200,20705) w=100 bx=0 ex=0 r=false #8\n"
);
// test shape insert from shape reference
copy.clear ();
for (db::Shapes::shape_iterator shape = topcell.shapes (lindex).begin (db::Shapes::shape_iterator::All); ! shape.at_end (); ++shape) {
copy.insert (*shape);
}
EXPECT_EQ (shapes_to_string (_this, copy), shapes_to_string (_this, topcell.shapes (lindex)));
// test shape insert from shape reference with transformation
copy.clear ();
db::ICplxTrans t (2.0, 90.0, false, db::Vector (100, -50));
db::ICplxTrans ti = t.inverted ();
for (db::Shapes::shape_iterator shape = topcell.shapes (lindex).begin (db::Shapes::shape_iterator::All); ! shape.at_end (); ++shape) {
tl::ident_map<db::Layout::properties_id_type> pm;
db::Shape s = copy.insert (*shape, t, pm);
copy.transform (s, ti);
}
EXPECT_EQ (shapes_to_string_norm (_this, copy), shapes_to_string_norm (_this, topcell.shapes (lindex)));
// test shape insert from shape reference with property modification
copy.clear ();
for (db::Shapes::shape_iterator shape = topcell.shapes (lindex).begin (db::Shapes::shape_iterator::All); ! shape.at_end (); ++shape) {
plus1 pm;
copy.insert (*shape, pm);
}
for (db::Shapes::shape_iterator shape = topcell.shapes (lindex).begin (db::Shapes::shape_iterator::All); ! shape.at_end (); ++shape) {
if (shape->has_prop_id ()) {
topcell.shapes (lindex).replace_prop_id (*shape, shape->prop_id () + 1);
}
}
EXPECT_EQ (shapes_to_string (_this, copy), shapes_to_string (_this, topcell.shapes (lindex)));
}
}
TEST(5)
{
db::Manager m;
db::Layout other_layout (&m);
db::Cell &other_topcell = other_layout.cell (other_layout.add_cell ());
db::Layout layout (&m);
unsigned int lindex = read_testdata (layout, 0x8);
db::Cell &topcell = layout.cell (*layout.begin_top_down ());
db::Shapes copy (&m, &topcell, db::default_editable_mode ());
EXPECT_EQ (shapes_to_string_norm (_this, topcell.shapes (lindex)),
"text ('A',r0 0,50) #0\n"
"text ('A',r0 0,50) #5\n"
"text ('A',r0 10,10040) #0\n"
"text ('A',r0 10,10040) #8\n"
"text ('A',r0 10,20040) #0\n"
"text ('A',r0 10,20040) #8\n"
"text ('A',r0 10,35) #0\n"
"text ('A',r0 10,35) #1\n"
"text ('A',r0 10,40) #0\n"
"text ('A',r0 10,40) #8\n"
"text ('A',r0 11010,10040) #0\n"
"text ('A',r0 11010,10040) #8\n"
"text ('A',r0 11010,20040) #0\n"
"text ('A',r0 11010,20040) #8\n"
"text ('A',r0 11010,40) #0\n"
"text ('A',r0 11010,40) #8\n"
"text ('A',r0 22010,10040) #0\n"
"text ('A',r0 22010,10040) #8\n"
"text ('A',r0 22010,20040) #0\n"
"text ('A',r0 22010,20040) #8\n"
"text ('A',r0 22010,40) #0\n"
"text ('A',r0 22010,40) #8\n"
"text ('A',r0 33010,10040) #0\n"
"text ('A',r0 33010,10040) #8\n"
"text ('A',r0 33010,20040) #0\n"
"text ('A',r0 33010,20040) #8\n"
"text ('A',r0 33010,40) #0\n"
"text ('A',r0 33010,40) #8\n"
"text ('B',r90 -90,140) #0\n"
"text ('B',r90 -90,140) #6\n"
"text ('B',r90 20,25) #0\n"
"text ('B',r90 20,25) #2\n"
"text ('C',m90 -180,230) #0\n"
"text ('C',m90 -180,230) #7\n"
"text ('C',m90 30,15) #0\n"
"text ('C',m90 30,15) #3\n"
);
// tests simple copy
copy = topcell.shapes(lindex);
EXPECT_EQ (shapes_to_string_norm (_this, topcell.shapes (lindex)), shapes_to_string_norm (_this, copy));
// tests translate
db::Shapes other_copy (&m, &other_topcell, db::default_editable_mode ());
other_copy = topcell.shapes(lindex);
EXPECT_EQ (shapes_to_string_norm (_this, topcell.shapes (lindex)), shapes_to_string_norm (_this, other_copy));
// tests translate plus transform
other_copy.assign_transformed (topcell.shapes(lindex), db::ICplxTrans (2.0));
EXPECT_EQ (shapes_to_string_norm (_this, topcell.shapes (lindex)), shapes_to_string_norm (_this, other_copy, db::ICplxTrans (0.5)));
// tests deref
db::Shapes sb_copy;
sb_copy = topcell.shapes(lindex);
EXPECT_EQ (shapes_to_string_norm (_this, topcell.shapes (lindex)), shapes_to_string_norm (_this, sb_copy));
// tests deref plus transform
sb_copy.assign_transformed (topcell.shapes(lindex), db::ICplxTrans (2.0));
EXPECT_EQ (shapes_to_string_norm (_this, topcell.shapes (lindex)), shapes_to_string_norm (_this, sb_copy, db::ICplxTrans (0.5)));
copy.clear ();
for (db::Shapes::shape_iterator shape = topcell.shapes (lindex).begin (db::Shapes::shape_iterator::All); ! shape.at_end (); ++shape) {
copy.insert (*shape);
}
EXPECT_EQ (shapes_to_string (_this, copy),
"text ('A',r0 10,35) #0\n"
"text ('B',r90 20,25) #0\n"
"text ('C',m90 30,15) #0\n"
"text ('A',r0 0,50) #0\n"
"text ('B',r90 -90,140) #0\n"
"text ('C',m90 -180,230) #0\n"
"text ('A',r0 10,40) #0\n"
"text ('A',r0 10,10040) #0\n"
"text ('A',r0 10,20040) #0\n"
"text ('A',r0 11010,40) #0\n"
"text ('A',r0 11010,10040) #0\n"
"text ('A',r0 11010,20040) #0\n"
"text ('A',r0 22010,40) #0\n"
"text ('A',r0 22010,10040) #0\n"
"text ('A',r0 22010,20040) #0\n"
"text ('A',r0 33010,40) #0\n"
"text ('A',r0 33010,10040) #0\n"
"text ('A',r0 33010,20040) #0\n"
"text ('A',r0 10,35) #1\n"
"text ('B',r90 20,25) #2\n"
"text ('C',m90 30,15) #3\n"
"text ('A',r0 0,50) #5\n"
"text ('B',r90 -90,140) #6\n"
"text ('C',m90 -180,230) #7\n"
"text ('A',r0 10,40) #8\n"
"text ('A',r0 10,10040) #8\n"
"text ('A',r0 10,20040) #8\n"
"text ('A',r0 11010,40) #8\n"
"text ('A',r0 11010,10040) #8\n"
"text ('A',r0 11010,20040) #8\n"
"text ('A',r0 22010,40) #8\n"
"text ('A',r0 22010,10040) #8\n"
"text ('A',r0 22010,20040) #8\n"
"text ('A',r0 33010,40) #8\n"
"text ('A',r0 33010,10040) #8\n"
"text ('A',r0 33010,20040) #8\n"
);
db::Shapes sa_copy;
for (db::Shapes::shape_iterator shape = topcell.shapes (lindex).begin (db::Shapes::shape_iterator::All); ! shape.at_end (); ++shape) {
sa_copy.insert (*shape);
}
EXPECT_EQ (shapes_to_string (_this, sa_copy),
"text ('A',r0 10,35) #0\n"
"text ('B',r90 20,25) #0\n"
"text ('C',m90 30,15) #0\n"
"text ('A',r0 0,50) #0\n"
"text ('B',r90 -90,140) #0\n"
"text ('C',m90 -180,230) #0\n"
"text ('A',r0 10,40) #0\n"
"text ('A',r0 10,10040) #0\n"
"text ('A',r0 10,20040) #0\n"
"text ('A',r0 11010,40) #0\n"
"text ('A',r0 11010,10040) #0\n"
"text ('A',r0 11010,20040) #0\n"
"text ('A',r0 22010,40) #0\n"
"text ('A',r0 22010,10040) #0\n"
"text ('A',r0 22010,20040) #0\n"
"text ('A',r0 33010,40) #0\n"
"text ('A',r0 33010,10040) #0\n"
"text ('A',r0 33010,20040) #0\n"
"text ('A',r0 10,35) #1\n"
"text ('B',r90 20,25) #2\n"
"text ('C',m90 30,15) #3\n"
"text ('A',r0 0,50) #5\n"
"text ('B',r90 -90,140) #6\n"
"text ('C',m90 -180,230) #7\n"
"text ('A',r0 10,40) #8\n"
"text ('A',r0 10,10040) #8\n"
"text ('A',r0 10,20040) #8\n"
"text ('A',r0 11010,40) #8\n"
"text ('A',r0 11010,10040) #8\n"
"text ('A',r0 11010,20040) #8\n"
"text ('A',r0 22010,40) #8\n"
"text ('A',r0 22010,10040) #8\n"
"text ('A',r0 22010,20040) #8\n"
"text ('A',r0 33010,40) #8\n"
"text ('A',r0 33010,10040) #8\n"
"text ('A',r0 33010,20040) #8\n"
);
db::Shapes::shape_iterator shape = topcell.shapes (lindex).begin (db::Shapes::shape_iterator::All);
++shape;
db::Shape s1 = *shape;
for (unsigned int i = 0; i < 3; ++i) { ++shape; }
db::Shape s2 = *shape;
for (unsigned int i = 0; i < 3; ++i) { ++shape; }
db::Shape s3 = *shape;
for (unsigned int i = 0; i < 3; ++i) { ++shape; }
db::Shape s4 = *shape;
for (unsigned int i = 0; i < 3; ++i) { ++shape; }
db::Shape s5 = *shape;
for (unsigned int i = 0; i < 12; ++i) { ++shape; }
db::Shape s6 = *shape;
if (db::default_editable_mode ()) {
topcell.shapes (lindex).erase_shape (s1);
topcell.shapes (lindex).erase_shape (s2);
topcell.shapes (lindex).erase_shape (s3);
topcell.shapes (lindex).erase_shape (s4);
topcell.shapes (lindex).erase_shape (s5);
topcell.shapes (lindex).erase_shape (s6);
EXPECT_EQ (shapes_to_string (_this, topcell.shapes (lindex)),
"text ('A',r0 10,35) #0\n"
"text ('C',m90 30,15) #0\n"
"text ('A',r0 10,35) #1\n"
"text ('C',m90 30,15) #3\n"
"text ('A',r0 0,50) #0\n"
"text ('C',m90 -180,230) #0\n"
"text ('A',r0 10,40) #0\n"
"text ('A',r0 10,20040) #0\n"
"text ('A',r0 11010,40) #0\n"
"text ('A',r0 11010,20040) #0\n"
"text ('A',r0 22010,40) #0\n"
"text ('A',r0 22010,10040) #0\n"
"text ('A',r0 22010,20040) #0\n"
"text ('A',r0 33010,40) #0\n"
"text ('A',r0 33010,10040) #0\n"
"text ('A',r0 33010,20040) #0\n"
"text ('A',r0 0,50) #5\n"
"text ('B',r90 -90,140) #6\n"
"text ('C',m90 -180,230) #7\n"
"text ('A',r0 10,40) #8\n"
"text ('A',r0 10,20040) #8\n"
"text ('A',r0 11010,40) #8\n"
"text ('A',r0 11010,10040) #8\n"
"text ('A',r0 11010,20040) #8\n"
"text ('A',r0 22010,40) #8\n"
"text ('A',r0 22010,10040) #8\n"
"text ('A',r0 22010,20040) #8\n"
"text ('A',r0 33010,40) #8\n"
"text ('A',r0 33010,10040) #8\n"
"text ('A',r0 33010,20040) #8\n"
);
// test shape insert from shape reference
copy.clear ();
for (db::Shapes::shape_iterator shape = topcell.shapes (lindex).begin (db::Shapes::shape_iterator::All); ! shape.at_end (); ++shape) {
copy.insert (*shape);
}
// note: we need "norm" since shapes are subject to normalization because of potential StringRef's in the source
EXPECT_EQ (shapes_to_string_norm (_this, copy), shapes_to_string_norm (_this, topcell.shapes (lindex)));
// test shape insert from shape reference with transformation
copy.clear ();
db::ICplxTrans t (2.0, 90.0, false, db::Vector (100, -50));
db::ICplxTrans ti = t.inverted ();
for (db::Shapes::shape_iterator shape = topcell.shapes (lindex).begin (db::Shapes::shape_iterator::All); ! shape.at_end (); ++shape) {
tl::ident_map<db::Layout::properties_id_type> pm;
db::Shape s = copy.insert (*shape, t, pm);
copy.transform (s, ti);
}
EXPECT_EQ (shapes_to_string_norm (_this, copy), shapes_to_string_norm (_this, topcell.shapes (lindex)));
// test shape insert from shape reference with property modification
copy.clear ();
for (db::Shapes::shape_iterator shape = topcell.shapes (lindex).begin (db::Shapes::shape_iterator::All); ! shape.at_end (); ++shape) {
plus1 pm;
copy.insert (*shape, pm);
}
for (db::Shapes::shape_iterator shape = topcell.shapes (lindex).begin (db::Shapes::shape_iterator::All); ! shape.at_end (); ++shape) {
if (shape->has_prop_id ()) {
topcell.shapes (lindex).replace_prop_id (*shape, shape->prop_id () + 1);
}
}
EXPECT_EQ (shapes_to_string_norm (_this, copy), shapes_to_string_norm (_this, topcell.shapes (lindex)));
}
}
TEST(6)
{
db::Manager m;
db::Layout other_layout (&m);
db::Cell &other_topcell = other_layout.cell (other_layout.add_cell ());
db::Layout layout (&m);
unsigned int lindex = read_testdata (layout, 0x10);
db::Cell &topcell = layout.cell (*layout.begin_top_down ());
db::Shapes copy (&m, &topcell, db::default_editable_mode ());
EXPECT_EQ (shapes_to_string_norm (_this, topcell.shapes (lindex)),
"box (0,100;2000,1000) #0\n"
"box (0,100;2000,1000) #10\n"
"box (100,200;2100,1100) #0\n"
"box (100,200;2100,1100) #11\n"
"box (11050,-1050;12050,-50) #0\n"
"box (11050,-1050;12050,-50) #20\n"
"box (11050,18950;12050,19950) #0\n"
"box (11050,18950;12050,19950) #20\n"
"box (11050,8950;12050,9950) #0\n"
"box (11050,8950;12050,9950) #20\n"
"box (150,150;2150,1050) #0\n"
"box (150,150;2150,1050) #12\n"
"box (22050,-1050;23050,-50) #0\n"
"box (22050,-1050;23050,-50) #20\n"
"box (22050,18950;23050,19950) #0\n"
"box (22050,18950;23050,19950) #20\n"
"box (22050,8950;23050,9950) #0\n"
"box (22050,8950;23050,9950) #20\n"
"box (33050,-1050;34050,-50) #0\n"
"box (33050,-1050;34050,-50) #20\n"
"box (33050,18950;34050,19950) #0\n"
"box (33050,18950;34050,19950) #20\n"
"box (33050,8950;34050,9950) #0\n"
"box (33050,8950;34050,9950) #20\n"
"box (50,-1050;1050,-50) #0\n"
"box (50,-1050;1050,-50) #20\n"
"box (50,18950;1050,19950) #0\n"
"box (50,18950;1050,19950) #20\n"
"box (50,8950;1050,9950) #0\n"
"box (50,8950;1050,9950) #20\n"
);
// tests simple copy
copy = topcell.shapes(lindex);
EXPECT_EQ (shapes_to_string_norm (_this, topcell.shapes (lindex)), shapes_to_string_norm (_this, copy));
// tests translate
db::Shapes other_copy (&m, &other_topcell, db::default_editable_mode ());
other_copy = topcell.shapes(lindex);
EXPECT_EQ (shapes_to_string_norm (_this, topcell.shapes (lindex)), shapes_to_string_norm (_this, other_copy));
// tests translate plus transform
other_copy.assign_transformed (topcell.shapes(lindex), db::ICplxTrans (2.0));
EXPECT_EQ (shapes_to_string_norm (_this, topcell.shapes (lindex)), shapes_to_string_norm (_this, other_copy, db::ICplxTrans (0.5)));
// tests deref
db::Shapes sb_copy;
sb_copy = topcell.shapes(lindex);
EXPECT_EQ (shapes_to_string_norm (_this, topcell.shapes (lindex)), shapes_to_string_norm (_this, sb_copy));
// tests deref plus transform
sb_copy.assign_transformed (topcell.shapes(lindex), db::ICplxTrans (2.0));
EXPECT_EQ (shapes_to_string_norm (_this, topcell.shapes (lindex)), shapes_to_string_norm (_this, sb_copy, db::ICplxTrans (0.5)));
copy.clear ();
for (db::Shapes::shape_iterator shape = topcell.shapes (lindex).begin (db::Shapes::shape_iterator::All); ! shape.at_end (); ++shape) {
copy.insert (*shape);
}
EXPECT_EQ (shapes_to_string (_this, copy),
"box (0,100;2000,1000) #0\n"
"box (100,200;2100,1100) #0\n"
"box (150,150;2150,1050) #0\n"
"box (50,-1050;1050,-50) #0\n"
"box (50,8950;1050,9950) #0\n"
"box (50,18950;1050,19950) #0\n"
"box (11050,-1050;12050,-50) #0\n"
"box (11050,8950;12050,9950) #0\n"
"box (11050,18950;12050,19950) #0\n"
"box (22050,-1050;23050,-50) #0\n"
"box (22050,8950;23050,9950) #0\n"
"box (22050,18950;23050,19950) #0\n"
"box (33050,-1050;34050,-50) #0\n"
"box (33050,8950;34050,9950) #0\n"
"box (33050,18950;34050,19950) #0\n"
"box (0,100;2000,1000) #10\n"
"box (100,200;2100,1100) #11\n"
"box (150,150;2150,1050) #12\n"
"box (50,-1050;1050,-50) #20\n"
"box (50,8950;1050,9950) #20\n"
"box (50,18950;1050,19950) #20\n"
"box (11050,-1050;12050,-50) #20\n"
"box (11050,8950;12050,9950) #20\n"
"box (11050,18950;12050,19950) #20\n"
"box (22050,-1050;23050,-50) #20\n"
"box (22050,8950;23050,9950) #20\n"
"box (22050,18950;23050,19950) #20\n"
"box (33050,-1050;34050,-50) #20\n"
"box (33050,8950;34050,9950) #20\n"
"box (33050,18950;34050,19950) #20\n"
);
db::Shapes sa_copy;
for (db::Shapes::shape_iterator shape = topcell.shapes (lindex).begin (db::Shapes::shape_iterator::All); ! shape.at_end (); ++shape) {
sa_copy.insert (*shape);
}
EXPECT_EQ (shapes_to_string (_this, sa_copy),
"box (0,100;2000,1000) #0\n"
"box (100,200;2100,1100) #0\n"
"box (150,150;2150,1050) #0\n"
"box (50,-1050;1050,-50) #0\n"
"box (50,8950;1050,9950) #0\n"
"box (50,18950;1050,19950) #0\n"
"box (11050,-1050;12050,-50) #0\n"
"box (11050,8950;12050,9950) #0\n"
"box (11050,18950;12050,19950) #0\n"
"box (22050,-1050;23050,-50) #0\n"
"box (22050,8950;23050,9950) #0\n"
"box (22050,18950;23050,19950) #0\n"
"box (33050,-1050;34050,-50) #0\n"
"box (33050,8950;34050,9950) #0\n"
"box (33050,18950;34050,19950) #0\n"
"box (0,100;2000,1000) #10\n"
"box (100,200;2100,1100) #11\n"
"box (150,150;2150,1050) #12\n"
"box (50,-1050;1050,-50) #20\n"
"box (50,8950;1050,9950) #20\n"
"box (50,18950;1050,19950) #20\n"
"box (11050,-1050;12050,-50) #20\n"
"box (11050,8950;12050,9950) #20\n"
"box (11050,18950;12050,19950) #20\n"
"box (22050,-1050;23050,-50) #20\n"
"box (22050,8950;23050,9950) #20\n"
"box (22050,18950;23050,19950) #20\n"
"box (33050,-1050;34050,-50) #20\n"
"box (33050,8950;34050,9950) #20\n"
"box (33050,18950;34050,19950) #20\n"
);
db::Shapes::shape_iterator shape = topcell.shapes (lindex).begin (db::Shapes::shape_iterator::All);
++shape;
db::Shape s1 = *shape;
for (unsigned int i = 0; i < 3; ++i) { ++shape; }
db::Shape s2 = *shape;
for (unsigned int i = 0; i < 3; ++i) { ++shape; }
db::Shape s3 = *shape;
for (unsigned int i = 0; i < 12; ++i) { ++shape; }
db::Shape s4 = *shape;
if (db::default_editable_mode ()) {
topcell.shapes (lindex).erase_shape (s1);
topcell.shapes (lindex).erase_shape (s2);
topcell.shapes (lindex).erase_shape (s3);
topcell.shapes (lindex).erase_shape (s4);
EXPECT_EQ (shapes_to_string (_this, topcell.shapes (lindex)),
"box (0,100;2000,1000) #0\n"
"box (150,150;2150,1050) #0\n"
"box (50,-1050;1050,-50) #0\n"
"box (50,18950;1050,19950) #0\n"
"box (11050,-1050;12050,-50) #0\n"
"box (11050,18950;12050,19950) #0\n"
"box (22050,-1050;23050,-50) #0\n"
"box (22050,8950;23050,9950) #0\n"
"box (22050,18950;23050,19950) #0\n"
"box (33050,-1050;34050,-50) #0\n"
"box (33050,8950;34050,9950) #0\n"
"box (33050,18950;34050,19950) #0\n"
"box (0,100;2000,1000) #10\n"
"box (100,200;2100,1100) #11\n"
"box (150,150;2150,1050) #12\n"
"box (50,-1050;1050,-50) #20\n"
"box (50,18950;1050,19950) #20\n"
"box (11050,-1050;12050,-50) #20\n"
"box (11050,8950;12050,9950) #20\n"
"box (11050,18950;12050,19950) #20\n"
"box (22050,-1050;23050,-50) #20\n"
"box (22050,8950;23050,9950) #20\n"
"box (22050,18950;23050,19950) #20\n"
"box (33050,-1050;34050,-50) #20\n"
"box (33050,8950;34050,9950) #20\n"
"box (33050,18950;34050,19950) #20\n"
);
// test shape insert from shape reference
copy.clear ();
for (db::Shapes::shape_iterator shape = topcell.shapes (lindex).begin (db::Shapes::shape_iterator::All); ! shape.at_end (); ++shape) {
copy.insert (*shape);
}
EXPECT_EQ (shapes_to_string (_this, copy), shapes_to_string (_this, topcell.shapes (lindex)));
// test shape insert from shape reference with transformation
copy.clear ();
db::ICplxTrans t (2.0, 90.0, false, db::Vector (100, -50));
db::ICplxTrans ti = t.inverted ();
for (db::Shapes::shape_iterator shape = topcell.shapes (lindex).begin (db::Shapes::shape_iterator::All); ! shape.at_end (); ++shape) {
tl::ident_map<db::Layout::properties_id_type> pm;
db::Shape s = copy.insert (*shape, t, pm);
copy.transform (s, ti);
}
EXPECT_EQ (shapes_to_string (_this, copy), shapes_to_string (_this, topcell.shapes (lindex)));
// test shape insert from shape reference with property modification
copy.clear ();
for (db::Shapes::shape_iterator shape = topcell.shapes (lindex).begin (db::Shapes::shape_iterator::All); ! shape.at_end (); ++shape) {
plus1 pm;
copy.insert (*shape, pm);
}
for (db::Shapes::shape_iterator shape = topcell.shapes (lindex).begin (db::Shapes::shape_iterator::All); ! shape.at_end (); ++shape) {
if (shape->has_prop_id ()) {
topcell.shapes (lindex).replace_prop_id (*shape, shape->prop_id () + 1);
}
}
EXPECT_EQ (shapes_to_string (_this, copy), shapes_to_string (_this, topcell.shapes (lindex)));
}
}
TEST(7)
{
db::Manager m;
db::Layout other_layout (&m);
db::Cell &other_topcell = other_layout.cell (other_layout.add_cell ());
db::Layout layout (&m);
unsigned int lindex = read_testdata (layout, 0x20);
db::Cell &topcell = layout.cell (*layout.begin_top_down ());
db::Shapes copy (&m, &topcell, db::default_editable_mode ());
EXPECT_EQ (shapes_to_string_norm (_this, topcell.shapes (lindex)),
"box (0,100;2000,1000) #0\n"
"box (0,100;2000,1000) #10\n"
"box (100,200;2100,1100) #0\n"
"box (100,200;2100,1100) #11\n"
"box (11050,-1050;12050,-50) #0\n"
"box (11050,-1050;12050,-50) #20\n"
"box (11050,18950;12050,19950) #0\n"
"box (11050,18950;12050,19950) #20\n"
"box (11050,8950;12050,9950) #0\n"
"box (11050,8950;12050,9950) #20\n"
"box (150,150;2150,1050) #0\n"
"box (150,150;2150,1050) #12\n"
"box (22050,-1050;23050,-50) #0\n"
"box (22050,-1050;23050,-50) #20\n"
"box (22050,18950;23050,19950) #0\n"
"box (22050,18950;23050,19950) #20\n"
"box (22050,8950;23050,9950) #0\n"
"box (22050,8950;23050,9950) #20\n"
"box (33050,-1050;34050,-50) #0\n"
"box (33050,-1050;34050,-50) #20\n"
"box (33050,18950;34050,19950) #0\n"
"box (33050,18950;34050,19950) #20\n"
"box (33050,8950;34050,9950) #0\n"
"box (33050,8950;34050,9950) #20\n"
"box (50,-1050;1050,-50) #0\n"
"box (50,-1050;1050,-50) #20\n"
"box (50,18950;1050,19950) #0\n"
"box (50,18950;1050,19950) #20\n"
"box (50,8950;1050,9950) #0\n"
"box (50,8950;1050,9950) #20\n"
);
// tests simple copy
copy = topcell.shapes(lindex);
EXPECT_EQ (shapes_to_string_norm (_this, topcell.shapes (lindex)), shapes_to_string_norm (_this, copy));
// tests translate
db::Shapes other_copy (&m, &other_topcell, db::default_editable_mode ());
other_copy = topcell.shapes(lindex);
EXPECT_EQ (shapes_to_string_norm (_this, topcell.shapes (lindex)), shapes_to_string_norm (_this, other_copy));
// tests translate plus transform
other_copy.assign_transformed (topcell.shapes(lindex), db::ICplxTrans (2.0));
EXPECT_EQ (shapes_to_string_norm (_this, topcell.shapes (lindex)), shapes_to_string_norm (_this, other_copy, db::ICplxTrans (0.5)));
// tests deref
db::Shapes sb_copy;
sb_copy = topcell.shapes(lindex);
EXPECT_EQ (shapes_to_string_norm (_this, topcell.shapes (lindex)), shapes_to_string_norm (_this, sb_copy));
// tests deref plus transform
sb_copy.assign_transformed (topcell.shapes(lindex), db::ICplxTrans (2.0));
EXPECT_EQ (shapes_to_string_norm (_this, topcell.shapes (lindex)), shapes_to_string_norm (_this, sb_copy, db::ICplxTrans (0.5)));
copy.clear ();
for (db::Shapes::shape_iterator shape = topcell.shapes (lindex).begin (db::Shapes::shape_iterator::All); ! shape.at_end (); ++shape) {
copy.insert (*shape);
}
if (db::default_editable_mode ()) {
// in editable mode, no arrays are stored, thus no expansion problems occure for short boxes
EXPECT_EQ (shapes_to_string (_this, copy),
"box (50,-1050;1050,-50) #0\n"
"box (50,8950;1050,9950) #0\n"
"box (50,18950;1050,19950) #0\n"
"box (11050,-1050;12050,-50) #0\n"
"box (11050,8950;12050,9950) #0\n"
"box (11050,18950;12050,19950) #0\n"
"box (22050,-1050;23050,-50) #0\n"
"box (22050,8950;23050,9950) #0\n"
"box (22050,18950;23050,19950) #0\n"
"box (33050,-1050;34050,-50) #0\n"
"box (33050,8950;34050,9950) #0\n"
"box (33050,18950;34050,19950) #0\n"
"box (50,-1050;1050,-50) #20\n"
"box (50,8950;1050,9950) #20\n"
"box (50,18950;1050,19950) #20\n"
"box (11050,-1050;12050,-50) #20\n"
"box (11050,8950;12050,9950) #20\n"
"box (11050,18950;12050,19950) #20\n"
"box (22050,-1050;23050,-50) #20\n"
"box (22050,8950;23050,9950) #20\n"
"box (22050,18950;23050,19950) #20\n"
"box (33050,-1050;34050,-50) #20\n"
"box (33050,8950;34050,9950) #20\n"
"box (33050,18950;34050,19950) #20\n"
"box (0,100;2000,1000) #0\n"
"box (100,200;2100,1100) #0\n"
"box (150,150;2150,1050) #0\n"
"box (0,100;2000,1000) #10\n"
"box (100,200;2100,1100) #11\n"
"box (150,150;2150,1050) #12\n"
);
} else {
EXPECT_EQ (shapes_to_string (_this, copy),
"box (0,100;2000,1000) #0\n"
"box (100,200;2100,1100) #0\n"
"box (150,150;2150,1050) #0\n"
"box (50,-1050;1050,-50) #0\n"
"box (50,8950;1050,9950) #0\n"
"box (50,18950;1050,19950) #0\n"
"box (11050,-1050;12050,-50) #0\n"
"box (11050,8950;12050,9950) #0\n"
"box (11050,18950;12050,19950) #0\n"
"box (22050,-1050;23050,-50) #0\n"
"box (22050,8950;23050,9950) #0\n"
"box (22050,18950;23050,19950) #0\n"
"box (-32486,-1050;-31486,-50) #0\n"
"box (-32486,8950;-31486,9950) #0\n"
"box (-32486,18950;-31486,19950) #0\n"
"box (0,100;2000,1000) #10\n"
"box (100,200;2100,1100) #11\n"
"box (150,150;2150,1050) #12\n"
"box (50,-1050;1050,-50) #20\n"
"box (50,8950;1050,9950) #20\n"
"box (50,18950;1050,19950) #20\n"
"box (11050,-1050;12050,-50) #20\n"
"box (11050,8950;12050,9950) #20\n"
"box (11050,18950;12050,19950) #20\n"
"box (22050,-1050;23050,-50) #20\n"
"box (22050,8950;23050,9950) #20\n"
"box (22050,18950;23050,19950) #20\n"
"box (-32486,-1050;-31486,-50) #20\n"
"box (-32486,8950;-31486,9950) #20\n"
"box (-32486,18950;-31486,19950) #20\n"
);
}
db::Shapes sa_copy;
for (db::Shapes::shape_iterator shape = topcell.shapes (lindex).begin (db::Shapes::shape_iterator::All); ! shape.at_end (); ++shape) {
sa_copy.insert (*shape);
}
if (db::default_editable_mode ()) {
// in editable mode, no arrays are stored, thus no expansion problems occure for short boxes
EXPECT_EQ (shapes_to_string (_this, sa_copy),
"box (50,-1050;1050,-50) #0\n"
"box (50,8950;1050,9950) #0\n"
"box (50,18950;1050,19950) #0\n"
"box (11050,-1050;12050,-50) #0\n"
"box (11050,8950;12050,9950) #0\n"
"box (11050,18950;12050,19950) #0\n"
"box (22050,-1050;23050,-50) #0\n"
"box (22050,8950;23050,9950) #0\n"
"box (22050,18950;23050,19950) #0\n"
"box (33050,-1050;34050,-50) #0\n"
"box (33050,8950;34050,9950) #0\n"
"box (33050,18950;34050,19950) #0\n"
"box (50,-1050;1050,-50) #20\n"
"box (50,8950;1050,9950) #20\n"
"box (50,18950;1050,19950) #20\n"
"box (11050,-1050;12050,-50) #20\n"
"box (11050,8950;12050,9950) #20\n"
"box (11050,18950;12050,19950) #20\n"
"box (22050,-1050;23050,-50) #20\n"
"box (22050,8950;23050,9950) #20\n"
"box (22050,18950;23050,19950) #20\n"
"box (33050,-1050;34050,-50) #20\n"
"box (33050,8950;34050,9950) #20\n"
"box (33050,18950;34050,19950) #20\n"
"box (0,100;2000,1000) #0\n"
"box (100,200;2100,1100) #0\n"
"box (150,150;2150,1050) #0\n"
"box (0,100;2000,1000) #10\n"
"box (100,200;2100,1100) #11\n"
"box (150,150;2150,1050) #12\n"
);
} else {
EXPECT_EQ (shapes_to_string (_this, sa_copy),
"box (0,100;2000,1000) #0\n"
"box (100,200;2100,1100) #0\n"
"box (150,150;2150,1050) #0\n"
"box (50,-1050;1050,-50) #0\n"
"box (50,8950;1050,9950) #0\n"
"box (50,18950;1050,19950) #0\n"
"box (11050,-1050;12050,-50) #0\n"
"box (11050,8950;12050,9950) #0\n"
"box (11050,18950;12050,19950) #0\n"
"box (22050,-1050;23050,-50) #0\n"
"box (22050,8950;23050,9950) #0\n"
"box (22050,18950;23050,19950) #0\n"
"box (-32486,-1050;-31486,-50) #0\n"
"box (-32486,8950;-31486,9950) #0\n"
"box (-32486,18950;-31486,19950) #0\n"
"box (0,100;2000,1000) #10\n"
"box (100,200;2100,1100) #11\n"
"box (150,150;2150,1050) #12\n"
"box (50,-1050;1050,-50) #20\n"
"box (50,8950;1050,9950) #20\n"
"box (50,18950;1050,19950) #20\n"
"box (11050,-1050;12050,-50) #20\n"
"box (11050,8950;12050,9950) #20\n"
"box (11050,18950;12050,19950) #20\n"
"box (22050,-1050;23050,-50) #20\n"
"box (22050,8950;23050,9950) #20\n"
"box (22050,18950;23050,19950) #20\n"
"box (-32486,-1050;-31486,-50) #20\n"
"box (-32486,8950;-31486,9950) #20\n"
"box (-32486,18950;-31486,19950) #20\n"
);
}
db::Shapes::shape_iterator shape = topcell.shapes (lindex).begin (db::Shapes::shape_iterator::All);
++shape;
db::Shape s1 = *shape;
for (unsigned int i = 0; i < 3; ++i) { ++shape; }
db::Shape s2 = *shape;
for (unsigned int i = 0; i < 3; ++i) { ++shape; }
db::Shape s3 = *shape;
for (unsigned int i = 0; i < 12; ++i) { ++shape; }
db::Shape s4 = *shape;
if (db::default_editable_mode ()) {
topcell.shapes (lindex).erase_shape (s1);
topcell.shapes (lindex).erase_shape (s2);
topcell.shapes (lindex).erase_shape (s3);
topcell.shapes (lindex).erase_shape (s4);
EXPECT_EQ (shapes_to_string (_this, topcell.shapes (lindex)),
"box (50,-1050;1050,-50) #0\n"
"box (50,18950;1050,19950) #0\n"
"box (11050,-1050;12050,-50) #0\n"
"box (11050,18950;12050,19950) #0\n"
"box (22050,-1050;23050,-50) #0\n"
"box (22050,18950;23050,19950) #0\n"
"box (33050,-1050;34050,-50) #0\n"
"box (33050,8950;34050,9950) #0\n"
"box (33050,18950;34050,19950) #0\n"
"box (50,-1050;1050,-50) #20\n"
"box (50,8950;1050,9950) #20\n"
"box (50,18950;1050,19950) #20\n"
"box (11050,-1050;12050,-50) #20\n"
"box (11050,8950;12050,9950) #20\n"
"box (11050,18950;12050,19950) #20\n"
"box (22050,-1050;23050,-50) #20\n"
"box (22050,18950;23050,19950) #20\n"
"box (33050,-1050;34050,-50) #20\n"
"box (33050,8950;34050,9950) #20\n"
"box (33050,18950;34050,19950) #20\n"
"box (0,100;2000,1000) #0\n"
"box (100,200;2100,1100) #0\n"
"box (150,150;2150,1050) #0\n"
"box (0,100;2000,1000) #10\n"
"box (100,200;2100,1100) #11\n"
"box (150,150;2150,1050) #12\n"
);
// test shape insert from shape reference
copy.clear ();
for (db::Shapes::shape_iterator shape = topcell.shapes (lindex).begin (db::Shapes::shape_iterator::All); ! shape.at_end (); ++shape) {
copy.insert (*shape);
}
EXPECT_EQ (shapes_to_string (_this, copy), shapes_to_string (_this, topcell.shapes (lindex)));
// test shape insert from shape reference with transformation
copy.clear ();
db::ICplxTrans t (2.0, 90.0, false, db::Vector (100, -50));
db::ICplxTrans ti = t.inverted ();
for (db::Shapes::shape_iterator shape = topcell.shapes (lindex).begin (db::Shapes::shape_iterator::All); ! shape.at_end (); ++shape) {
tl::ident_map<db::Layout::properties_id_type> pm;
db::Shape s = copy.insert (*shape, t, pm);
copy.transform (s, ti);
}
EXPECT_EQ (shapes_to_string_norm (_this, copy), shapes_to_string_norm (_this, topcell.shapes (lindex)));
// test shape insert from shape reference with property modification
copy.clear ();
for (db::Shapes::shape_iterator shape = topcell.shapes (lindex).begin (db::Shapes::shape_iterator::All); ! shape.at_end (); ++shape) {
plus1 pm;
copy.insert (*shape, pm);
}
for (db::Shapes::shape_iterator shape = topcell.shapes (lindex).begin (db::Shapes::shape_iterator::All); ! shape.at_end (); ++shape) {
if (shape->has_prop_id ()) {
topcell.shapes (lindex).replace_prop_id (*shape, shape->prop_id () + 1);
}
}
EXPECT_EQ (shapes_to_string (_this, copy), shapes_to_string (_this, topcell.shapes (lindex)));
}
}
TEST(10A)
{
if (db::default_editable_mode ()) {
db::Manager m;
db::Layout layout (&m);
unsigned int lindex = read_testdata (layout, 0x1);
db::Cell &topcell = layout.cell (*layout.begin_top_down ());
std::vector <db::Shape> to_delete;
db::Shapes::shape_iterator shape = topcell.shapes (lindex).begin (db::Shapes::shape_iterator::All);
while (! shape.at_end ()) {
to_delete.push_back (*shape);
++shape;
if (! shape.at_end ()) {
++shape;
}
}
std::sort (to_delete.begin (), to_delete.end ());
topcell.shapes (lindex).erase_shapes (to_delete);
EXPECT_EQ (shapes_to_string (_this, topcell.shapes (lindex)),
"polygon (100,200;100,2100;1100,2100;1100,200) #0\n"
"polygon (0,100;0,2000;1000,2000;1000,100) #1\n"
"polygon (150,150;150,2050;1150,2050;1150,150) #3\n"
"polygon (-10,315;-10,2215;990,2215;990,315) #0\n"
"polygon (0,105;0,2005;1000,2005;1000,105) #0\n"
"polygon (0,20105;0,22005;1000,22005;1000,20105) #0\n"
"polygon (11000,10105;11000,12005;12000,12005;12000,10105) #0\n"
"polygon (22000,105;22000,2005;23000,2005;23000,105) #0\n"
"polygon (22000,20105;22000,22005;23000,22005;23000,20105) #0\n"
"polygon (33000,10105;33000,12005;34000,12005;34000,10105) #0\n"
"polygon (-10,115;-10,2015;990,2015;990,115) #5\n"
"polygon (-60,365;-60,2265;940,2265;940,365) #7\n"
"polygon (0,10105;0,12005;1000,12005;1000,10105) #8\n"
"polygon (11000,105;11000,2005;12000,2005;12000,105) #8\n"
"polygon (11000,20105;11000,22005;12000,22005;12000,20105) #8\n"
"polygon (22000,10105;22000,12005;23000,12005;23000,10105) #8\n"
"polygon (33000,105;33000,2005;34000,2005;34000,105) #8\n"
"polygon (33000,20105;33000,22005;34000,22005;34000,20105) #8\n"
);
to_delete.clear ();
shape = topcell.shapes (lindex).begin (db::Shapes::shape_iterator::All);
while (! shape.at_end ()) {
to_delete.push_back (*shape);
++shape;
}
std::sort (to_delete.begin (), to_delete.end ());
topcell.shapes (lindex).erase_shapes (to_delete);
EXPECT_EQ (shapes_to_string (_this, topcell.shapes (lindex)), "");
}
}
TEST(10C)
{
if (db::default_editable_mode ()) {
db::Manager m;
db::Layout layout (&m);
unsigned int lindex = read_testdata (layout, 0x1);
db::Cell &topcell = layout.cell (*layout.begin_top_down ());
std::vector <db::Shape> to_delete;
db::Shapes::shape_iterator shape = topcell.shapes (lindex).begin (db::Shapes::shape_iterator::All);
while (! shape.at_end ()) {
to_delete.push_back (*shape);
++shape;
}
std::sort (to_delete.begin (), to_delete.end ());
topcell.shapes (lindex).erase_shapes (to_delete);
EXPECT_EQ (shapes_to_string (_this, topcell.shapes (lindex)), "");
}
}
TEST(10D)
{
if (db::default_editable_mode ()) {
db::Manager m;
db::Layout layout (&m);
unsigned int lindex = read_testdata (layout, 0x1);
db::Cell &topcell = layout.cell (*layout.begin_top_down ());
std::vector <db::Shape> to_delete;
db::Shapes::shape_iterator shape = topcell.shapes (lindex).begin (db::Shapes::shape_iterator::All);
while (! shape.at_end ()) {
to_delete.push_back (*shape);
++shape;
}
std::sort (to_delete.begin (), to_delete.end ());
topcell.shapes (lindex).erase_shapes (to_delete);
EXPECT_EQ (shapes_to_string (_this, topcell.shapes (lindex)), "");
}
}
TEST(11A)
{
if (db::default_editable_mode ()) {
db::Manager m;
db::Layout layout (&m);
unsigned int lindex = read_testdata (layout, 0x20);
db::Cell &topcell = layout.cell (*layout.begin_top_down ());
std::vector <db::Shape> to_delete;
db::Shapes::shape_iterator shape = topcell.shapes (lindex).begin (db::Shapes::shape_iterator::All);
while (! shape.at_end ()) {
to_delete.push_back (*shape);
++shape;
if (! shape.at_end ()) {
++shape;
}
}
std::sort (to_delete.begin (), to_delete.end ());
topcell.shapes (lindex).erase_shapes (to_delete);
EXPECT_EQ (shapes_to_string (_this, topcell.shapes (lindex)),
"box (50,8950;1050,9950) #0\n"
"box (11050,-1050;12050,-50) #0\n"
"box (11050,18950;12050,19950) #0\n"
"box (22050,8950;23050,9950) #0\n"
"box (33050,-1050;34050,-50) #0\n"
"box (33050,18950;34050,19950) #0\n"
"box (50,8950;1050,9950) #20\n"
"box (11050,-1050;12050,-50) #20\n"
"box (11050,18950;12050,19950) #20\n"
"box (22050,8950;23050,9950) #20\n"
"box (33050,-1050;34050,-50) #20\n"
"box (33050,18950;34050,19950) #20\n"
"box (100,200;2100,1100) #0\n"
"box (0,100;2000,1000) #10\n"
"box (150,150;2150,1050) #12\n"
);
to_delete.clear ();
shape = topcell.shapes (lindex).begin (db::Shapes::shape_iterator::All);
while (! shape.at_end ()) {
to_delete.push_back (*shape);
++shape;
}
std::sort (to_delete.begin (), to_delete.end ());
topcell.shapes (lindex).erase_shapes (to_delete);
EXPECT_EQ (shapes_to_string (_this, topcell.shapes (lindex)), "");
}
}
TEST(11C)
{
if (db::default_editable_mode ()) {
db::Manager m;
db::Layout layout (&m);
unsigned int lindex = read_testdata (layout, 0x20);
db::Cell &topcell = layout.cell (*layout.begin_top_down ());
std::vector <db::Shape> to_delete;
db::Shapes::shape_iterator shape = topcell.shapes (lindex).begin (db::Shapes::shape_iterator::All);
while (! shape.at_end ()) {
to_delete.push_back (*shape);
++shape;
}
std::sort (to_delete.begin (), to_delete.end ());
topcell.shapes (lindex).erase_shapes (to_delete);
EXPECT_EQ (shapes_to_string (_this, topcell.shapes (lindex)), "");
}
}
TEST(11D)
{
if (db::default_editable_mode ()) {
db::Manager m;
db::Layout layout (&m);
unsigned int lindex = read_testdata (layout, 0x20);
db::Cell &topcell = layout.cell (*layout.begin_top_down ());
std::vector <db::Shape> to_delete;
db::Shapes::shape_iterator shape = topcell.shapes (lindex).begin (db::Shapes::shape_iterator::All);
while (! shape.at_end ()) {
to_delete.push_back (*shape);
++shape;
}
std::sort (to_delete.begin (), to_delete.end ());
topcell.shapes (lindex).erase_shapes (to_delete);
EXPECT_EQ (shapes_to_string (_this, topcell.shapes (lindex)), "");
}
}
TEST(11E)
{
if (db::default_editable_mode ()) {
db::Manager m;
db::Layout layout (&m);
m.transaction ("y");
unsigned int lindex = read_testdata (layout, 0x20);
m.commit ();
db::Cell &topcell = layout.cell (*layout.begin_top_down ());
std::string ref_string = shapes_to_string (_this, topcell.shapes (lindex));
std::vector <db::Shape> to_delete;
db::Shapes::shape_iterator shape = topcell.shapes (lindex).begin (db::Shapes::shape_iterator::All);
while (! shape.at_end ()) {
to_delete.push_back (*shape);
++shape;
}
std::sort (to_delete.begin (), to_delete.end ());
m.transaction ("x");
topcell.shapes (lindex).erase_shapes (to_delete);
m.commit ();
EXPECT_EQ (shapes_to_string (_this, topcell.shapes (lindex)), "");
m.undo ();
EXPECT_EQ (shapes_to_string (_this, topcell.shapes (lindex)), ref_string);
m.undo ();
EXPECT_EQ (shapes_to_string (_this, topcell.shapes (lindex)), "");
}
}
TEST(11F)
{
if (db::default_editable_mode ()) {
db::Manager m;
db::Layout layout (&m);
m.transaction ("y");
unsigned int lindex = read_testdata (layout, 0x20);
m.commit ();
db::Cell &topcell = layout.cell (*layout.begin_top_down ());
std::vector <db::Shape> to_delete;
db::Shapes::shape_iterator shape = topcell.shapes (lindex).begin (db::Shapes::shape_iterator::All);
while (! shape.at_end ()) {
to_delete.push_back (*shape);
++shape;
if (! shape.at_end ()) {
++shape;
}
}
std::sort (to_delete.begin (), to_delete.end ());
m.transaction ("x");
topcell.shapes (lindex).erase_shapes (to_delete);
m.commit ();
EXPECT_EQ (shapes_to_string (_this, topcell.shapes (lindex)),
"box (50,8950;1050,9950) #0\n"
"box (11050,-1050;12050,-50) #0\n"
"box (11050,18950;12050,19950) #0\n"
"box (22050,8950;23050,9950) #0\n"
"box (33050,-1050;34050,-50) #0\n"
"box (33050,18950;34050,19950) #0\n"
"box (50,8950;1050,9950) #20\n"
"box (11050,-1050;12050,-50) #20\n"
"box (11050,18950;12050,19950) #20\n"
"box (22050,8950;23050,9950) #20\n"
"box (33050,-1050;34050,-50) #20\n"
"box (33050,18950;34050,19950) #20\n"
"box (100,200;2100,1100) #0\n"
"box (0,100;2000,1000) #10\n"
"box (150,150;2150,1050) #12\n"
);
to_delete.clear ();
shape = topcell.shapes (lindex).begin (db::Shapes::shape_iterator::All);
while (! shape.at_end ()) {
to_delete.push_back (*shape);
++shape;
}
std::sort (to_delete.begin (), to_delete.end ());
m.transaction ("z");
topcell.shapes (lindex).erase_shapes (to_delete);
m.commit ();
EXPECT_EQ (shapes_to_string (_this, topcell.shapes (lindex)), "");
m.undo ();
m.undo ();
EXPECT_EQ (shapes_to_string_norm (_this, topcell.shapes (lindex)),
"box (0,100;2000,1000) #0\n"
"box (0,100;2000,1000) #10\n"
"box (100,200;2100,1100) #0\n"
"box (100,200;2100,1100) #11\n"
"box (11050,-1050;12050,-50) #0\n"
"box (11050,-1050;12050,-50) #20\n"
"box (11050,18950;12050,19950) #0\n"
"box (11050,18950;12050,19950) #20\n"
"box (11050,8950;12050,9950) #0\n"
"box (11050,8950;12050,9950) #20\n"
"box (150,150;2150,1050) #0\n"
"box (150,150;2150,1050) #12\n"
"box (22050,-1050;23050,-50) #0\n"
"box (22050,-1050;23050,-50) #20\n"
"box (22050,18950;23050,19950) #0\n"
"box (22050,18950;23050,19950) #20\n"
"box (22050,8950;23050,9950) #0\n"
"box (22050,8950;23050,9950) #20\n"
"box (33050,-1050;34050,-50) #0\n"
"box (33050,-1050;34050,-50) #20\n"
"box (33050,18950;34050,19950) #0\n"
"box (33050,18950;34050,19950) #20\n"
"box (33050,8950;34050,9950) #0\n"
"box (33050,8950;34050,9950) #20\n"
"box (50,-1050;1050,-50) #0\n"
"box (50,-1050;1050,-50) #20\n"
"box (50,18950;1050,19950) #0\n"
"box (50,18950;1050,19950) #20\n"
"box (50,8950;1050,9950) #0\n"
"box (50,8950;1050,9950) #20\n"
);
m.undo ();
EXPECT_EQ (shapes_to_string (_this, topcell.shapes (lindex)), "");
}
}
TEST(12A)
{
if (db::default_editable_mode ()) {
db::Manager m;
db::Layout layout (&m);
unsigned int lindex = read_testdata (layout, 0x20 | 0x80); // short box, no arrays
db::Cell &topcell = layout.cell (*layout.begin_top_down ());
db::Shapes::shape_iterator shape = topcell.shapes (lindex).begin (db::Shapes::shape_iterator::All);
while (! shape.at_end ()) {
topcell.shapes (lindex).replace (*shape, db::Box (shape->box ().transformed (db::Trans (1))));
++shape;
}
EXPECT_EQ (shapes_to_string (_this, topcell.shapes (lindex)),
"box (-1000,0;-100,2000) #0\n"
"box (-1100,100;-200,2100) #0\n"
"box (-1050,150;-150,2150) #0\n"
"box (-1000,0;-100,2000) #10\n"
"box (-1100,100;-200,2100) #11\n"
"box (-1050,150;-150,2150) #12\n"
);
shape = topcell.shapes (lindex).begin (db::Shapes::shape_iterator::All);
while (! shape.at_end ()) {
if (shape->with_props ()) {
topcell.shapes (lindex).replace_prop_id (*shape, shape->prop_id () + 100);
}
++shape;
}
EXPECT_EQ (shapes_to_string (_this, topcell.shapes (lindex)),
"box (-1000,0;-100,2000) #0\n"
"box (-1100,100;-200,2100) #0\n"
"box (-1050,150;-150,2150) #0\n"
"box (-1000,0;-100,2000) #110\n"
"box (-1100,100;-200,2100) #111\n"
"box (-1050,150;-150,2150) #112\n"
);
}
}
TEST(12B)
{
if (db::default_editable_mode ()) {
db::Manager m;
db::Layout layout (&m);
unsigned int lindex = read_testdata (layout, 0x20 | 0x80); // short box, no arrays
db::Cell &topcell = layout.cell (*layout.begin_top_down ());
db::Shapes::shape_iterator shape = topcell.shapes (lindex).begin (db::Shapes::shape_iterator::All);
while (! shape.at_end ()) {
topcell.shapes (lindex).replace (*shape, db::ShortBox (shape->box ().transformed (db::Trans (1))));
++shape;
}
EXPECT_EQ (shapes_to_string (_this, topcell.shapes (lindex)),
"box (-1000,0;-100,2000) #0\n"
"box (-1100,100;-200,2100) #0\n"
"box (-1050,150;-150,2150) #0\n"
"box (-1000,0;-100,2000) #10\n"
"box (-1100,100;-200,2100) #11\n"
"box (-1050,150;-150,2150) #12\n"
);
}
}
TEST(12C)
{
if (db::default_editable_mode ()) {
db::Manager m;
db::Layout layout (&m);
unsigned int lindex = read_testdata (layout, 0x10 | 0x80); // box, no arrays
db::Cell &topcell = layout.cell (*layout.begin_top_down ());
db::Shapes::shape_iterator shape = topcell.shapes (lindex).begin (db::Shapes::shape_iterator::All);
while (! shape.at_end ()) {
topcell.shapes (lindex).replace (*shape, db::Box (shape->box ().transformed (db::Trans (1))));
++shape;
}
EXPECT_EQ (shapes_to_string (_this, topcell.shapes (lindex)),
"box (-1000,0;-100,2000) #0\n"
"box (-1100,100;-200,2100) #0\n"
"box (-1050,150;-150,2150) #0\n"
"box (-1000,0;-100,2000) #10\n"
"box (-1100,100;-200,2100) #11\n"
"box (-1050,150;-150,2150) #12\n"
);
shape = topcell.shapes (lindex).begin (db::Shapes::shape_iterator::All);
while (! shape.at_end ()) {
if (shape->with_props ()) {
topcell.shapes (lindex).replace_prop_id (*shape, shape->prop_id () + 100);
}
++shape;
}
EXPECT_EQ (shapes_to_string (_this, topcell.shapes (lindex)),
"box (-1000,0;-100,2000) #0\n"
"box (-1100,100;-200,2100) #0\n"
"box (-1050,150;-150,2150) #0\n"
"box (-1000,0;-100,2000) #110\n"
"box (-1100,100;-200,2100) #111\n"
"box (-1050,150;-150,2150) #112\n"
);
}
}
TEST(12D)
{
if (db::default_editable_mode ()) {
db::Manager m;
db::Layout layout (&m);
unsigned int lindex = read_testdata (layout, 0x10 | 0x80); // box, no arrays
db::Cell &topcell = layout.cell (*layout.begin_top_down ());
db::Shapes::shape_iterator shape = topcell.shapes (lindex).begin (db::Shapes::shape_iterator::All);
while (! shape.at_end ()) {
topcell.shapes (lindex).replace (*shape, db::ShortBox (shape->box ().transformed (db::Trans (1))));
++shape;
}
EXPECT_EQ (shapes_to_string (_this, topcell.shapes (lindex)),
"box (-1000,0;-100,2000) #0\n"
"box (-1100,100;-200,2100) #0\n"
"box (-1050,150;-150,2150) #0\n"
"box (-1000,0;-100,2000) #10\n"
"box (-1100,100;-200,2100) #11\n"
"box (-1050,150;-150,2150) #12\n"
);
}
}
TEST(12E)
{
if (db::default_editable_mode ()) {
db::Manager m;
db::Layout layout (&m);
unsigned int lindex = read_testdata (layout, 0x01 | 0x80); // simple polygon, no arrays
db::Cell &topcell = layout.cell (*layout.begin_top_down ());
db::Shapes::shape_iterator shape = topcell.shapes (lindex).begin (db::Shapes::shape_iterator::All);
while (! shape.at_end ()) {
db::SimplePolygon sp;
shape->simple_polygon (sp);
sp.transform (db::Trans (1));
db::Polygon pp;
pp.assign_hull (sp.begin_hull (), sp.end_hull ());
topcell.shapes (lindex).replace (*shape, pp);
++shape;
}
EXPECT_EQ (shapes_to_string_norm (_this, topcell.shapes (lindex)),
"polygon (-2000,0;-2000,1000;-100,1000;-100,0) #0\n"
"polygon (-2000,0;-2000,1000;-100,1000;-100,0) #1\n"
"polygon (-2015,-10;-2015,990;-115,990;-115,-10) #0\n"
"polygon (-2015,-10;-2015,990;-115,990;-115,-10) #5\n"
"polygon (-2050,150;-2050,1150;-150,1150;-150,150) #0\n"
"polygon (-2050,150;-2050,1150;-150,1150;-150,150) #3\n"
"polygon (-2100,100;-2100,1100;-200,1100;-200,100) #0\n"
"polygon (-2100,100;-2100,1100;-200,1100;-200,100) #2\n"
"polygon (-2215,-10;-2215,990;-315,990;-315,-10) #0\n"
"polygon (-2215,-10;-2215,990;-315,990;-315,-10) #6\n"
"polygon (-2265,-60;-2265,940;-365,940;-365,-60) #0\n"
"polygon (-2265,-60;-2265,940;-365,940;-365,-60) #7\n"
);
shape = topcell.shapes (lindex).begin (db::Shapes::shape_iterator::All);
while (! shape.at_end ()) {
if (shape->with_props ()) {
topcell.shapes (lindex).replace_prop_id (*shape, shape->prop_id () + 100);
}
++shape;
}
EXPECT_EQ (shapes_to_string_norm (_this, topcell.shapes (lindex)),
"polygon (-2000,0;-2000,1000;-100,1000;-100,0) #0\n"
"polygon (-2000,0;-2000,1000;-100,1000;-100,0) #101\n"
"polygon (-2015,-10;-2015,990;-115,990;-115,-10) #0\n"
"polygon (-2015,-10;-2015,990;-115,990;-115,-10) #105\n"
"polygon (-2050,150;-2050,1150;-150,1150;-150,150) #0\n"
"polygon (-2050,150;-2050,1150;-150,1150;-150,150) #103\n"
"polygon (-2100,100;-2100,1100;-200,1100;-200,100) #0\n"
"polygon (-2100,100;-2100,1100;-200,1100;-200,100) #102\n"
"polygon (-2215,-10;-2215,990;-315,990;-315,-10) #0\n"
"polygon (-2215,-10;-2215,990;-315,990;-315,-10) #106\n"
"polygon (-2265,-60;-2265,940;-365,940;-365,-60) #0\n"
"polygon (-2265,-60;-2265,940;-365,940;-365,-60) #107\n"
);
}
}
TEST(12F)
{
if (db::default_editable_mode ()) {
db::Manager m;
db::Layout layout (&m);
unsigned int lindex = read_testdata (layout, 0x01 | 0x80); // simple polygon, no arrays
db::Cell &topcell = layout.cell (*layout.begin_top_down ());
db::Shapes::shape_iterator shape = topcell.shapes (lindex).begin (db::Shapes::shape_iterator::All);
while (! shape.at_end ()) {
db::SimplePolygon sp;
shape->simple_polygon (sp);
sp.transform (db::Trans (1));
topcell.shapes (lindex).replace (*shape, sp);
++shape;
}
EXPECT_EQ (shapes_to_string_norm (_this, topcell.shapes (lindex)),
"polygon (-2000,0;-2000,1000;-100,1000;-100,0) #0\n"
"polygon (-2000,0;-2000,1000;-100,1000;-100,0) #1\n"
"polygon (-2015,-10;-2015,990;-115,990;-115,-10) #0\n"
"polygon (-2015,-10;-2015,990;-115,990;-115,-10) #5\n"
"polygon (-2050,150;-2050,1150;-150,1150;-150,150) #0\n"
"polygon (-2050,150;-2050,1150;-150,1150;-150,150) #3\n"
"polygon (-2100,100;-2100,1100;-200,1100;-200,100) #0\n"
"polygon (-2100,100;-2100,1100;-200,1100;-200,100) #2\n"
"polygon (-2215,-10;-2215,990;-315,990;-315,-10) #0\n"
"polygon (-2215,-10;-2215,990;-315,990;-315,-10) #6\n"
"polygon (-2265,-60;-2265,940;-365,940;-365,-60) #0\n"
"polygon (-2265,-60;-2265,940;-365,940;-365,-60) #7\n"
);
}
}
TEST(12G)
{
if (db::default_editable_mode ()) {
db::Manager m;
db::Layout layout (&m);
unsigned int lindex = read_testdata (layout, 0x02 | 0x80); // polygon, no arrays
db::Cell &topcell = layout.cell (*layout.begin_top_down ());
db::Shapes::shape_iterator shape = topcell.shapes (lindex).begin (db::Shapes::shape_iterator::All);
while (! shape.at_end ()) {
db::Polygon sp;
shape->polygon (sp);
sp.transform (db::Trans (1));
db::SimplePolygon pp;
pp.assign_hull (sp.begin_hull (), sp.end_hull ());
topcell.shapes (lindex).replace (*shape, pp);
++shape;
}
EXPECT_EQ (shapes_to_string_norm (_this, topcell.shapes (lindex)),
"polygon (-1000,0;-1000,2000;-100,2000;-100,0) #0\n"
"polygon (-1000,0;-1000,2000;-100,2000;-100,0) #1\n"
"polygon (-1015,-10;-1015,1990;-115,1990;-115,-10) #0\n"
"polygon (-1015,-10;-1015,1990;-115,1990;-115,-10) #5\n"
"polygon (-1050,150;-1050,2150;-150,2150;-150,150) #0\n"
"polygon (-1050,150;-1050,2150;-150,2150;-150,150) #3\n"
"polygon (-1100,100;-1100,2100;-200,2100;-200,100) #0\n"
"polygon (-1100,100;-1100,2100;-200,2100;-200,100) #2\n"
"polygon (-1215,-10;-1215,1990;-315,1990;-315,-10) #0\n"
"polygon (-1215,-10;-1215,1990;-315,1990;-315,-10) #6\n"
"polygon (-1265,-60;-1265,1940;-365,1940;-365,-60) #0\n"
"polygon (-1265,-60;-1265,1940;-365,1940;-365,-60) #7\n"
);
shape = topcell.shapes (lindex).begin (db::Shapes::shape_iterator::All);
while (! shape.at_end ()) {
if (shape->with_props ()) {
topcell.shapes (lindex).replace_prop_id (*shape, shape->prop_id () + 100);
}
++shape;
}
EXPECT_EQ (shapes_to_string_norm (_this, topcell.shapes (lindex)),
"polygon (-1000,0;-1000,2000;-100,2000;-100,0) #0\n"
"polygon (-1000,0;-1000,2000;-100,2000;-100,0) #101\n"
"polygon (-1015,-10;-1015,1990;-115,1990;-115,-10) #0\n"
"polygon (-1015,-10;-1015,1990;-115,1990;-115,-10) #105\n"
"polygon (-1050,150;-1050,2150;-150,2150;-150,150) #0\n"
"polygon (-1050,150;-1050,2150;-150,2150;-150,150) #103\n"
"polygon (-1100,100;-1100,2100;-200,2100;-200,100) #0\n"
"polygon (-1100,100;-1100,2100;-200,2100;-200,100) #102\n"
"polygon (-1215,-10;-1215,1990;-315,1990;-315,-10) #0\n"
"polygon (-1215,-10;-1215,1990;-315,1990;-315,-10) #106\n"
"polygon (-1265,-60;-1265,1940;-365,1940;-365,-60) #0\n"
"polygon (-1265,-60;-1265,1940;-365,1940;-365,-60) #107\n"
);
}
}
TEST(12H)
{
if (db::default_editable_mode ()) {
db::Manager m;
db::Layout layout (&m);
unsigned int lindex = read_testdata (layout, 0x02 | 0x80); // polygon, no arrays
db::Cell &topcell = layout.cell (*layout.begin_top_down ());
db::Shapes::shape_iterator shape = topcell.shapes (lindex).begin (db::Shapes::shape_iterator::All);
while (! shape.at_end ()) {
db::Polygon sp;
shape->polygon (sp);
sp.transform (db::Trans (1));
topcell.shapes (lindex).replace (*shape, sp);
++shape;
}
EXPECT_EQ (shapes_to_string_norm (_this, topcell.shapes (lindex)),
"polygon (-1000,0;-1000,2000;-100,2000;-100,0) #0\n"
"polygon (-1000,0;-1000,2000;-100,2000;-100,0) #1\n"
"polygon (-1015,-10;-1015,1990;-115,1990;-115,-10) #0\n"
"polygon (-1015,-10;-1015,1990;-115,1990;-115,-10) #5\n"
"polygon (-1050,150;-1050,2150;-150,2150;-150,150) #0\n"
"polygon (-1050,150;-1050,2150;-150,2150;-150,150) #3\n"
"polygon (-1100,100;-1100,2100;-200,2100;-200,100) #0\n"
"polygon (-1100,100;-1100,2100;-200,2100;-200,100) #2\n"
"polygon (-1215,-10;-1215,1990;-315,1990;-315,-10) #0\n"
"polygon (-1215,-10;-1215,1990;-315,1990;-315,-10) #6\n"
"polygon (-1265,-60;-1265,1940;-365,1940;-365,-60) #0\n"
"polygon (-1265,-60;-1265,1940;-365,1940;-365,-60) #7\n"
);
}
}
TEST(12I)
{
if (db::default_editable_mode ()) {
db::Manager m;
db::Layout layout (&m);
unsigned int lindex = read_testdata (layout, 0x04 | 0x80); // path, no arrays
db::Cell &topcell = layout.cell (*layout.begin_top_down ());
db::Shapes::shape_iterator shape = topcell.shapes (lindex).begin (db::Shapes::shape_iterator::All);
while (! shape.at_end ()) {
db::Path sp;
shape->path (sp);
sp.transform (db::Trans (1));
topcell.shapes (lindex).replace (*shape, sp);
++shape;
}
EXPECT_EQ (shapes_to_string_norm (_this, topcell.shapes (lindex)),
"path (-100,0;-500,0;-700,200) w=100 bx=0 ex=0 r=false #0\n"
"path (-100,0;-500,0;-700,200) w=100 bx=0 ex=0 r=false #1\n"
"path (-1100,0;-1500,0;-1300,200) w=150 bx=0 ex=0 r=false #0\n"
"path (-1100,0;-1500,0;-1300,200) w=150 bx=0 ex=0 r=false #2\n"
"path (-115,-10;-515,-10;-715,190) w=100 bx=0 ex=0 r=false #0\n"
"path (-115,-10;-515,-10;-715,190) w=100 bx=0 ex=0 r=false #5\n"
"path (-1215,-110;-1615,-110;-1415,90) w=150 bx=0 ex=0 r=false #0\n"
"path (-1215,-110;-1615,-110;-1415,90) w=150 bx=0 ex=0 r=false #6\n"
"path (-2100,0;-2500,0;-2700,-200) w=200 bx=0 ex=0 r=false #0\n"
"path (-2100,0;-2500,0;-2700,-200) w=200 bx=0 ex=0 r=false #3\n"
"path (-2315,-210;-2715,-210;-2915,-410) w=200 bx=0 ex=0 r=false #0\n"
"path (-2315,-210;-2715,-210;-2915,-410) w=200 bx=0 ex=0 r=false #7\n"
);
shape = topcell.shapes (lindex).begin (db::Shapes::shape_iterator::All);
while (! shape.at_end ()) {
if (shape->with_props ()) {
topcell.shapes (lindex).replace_prop_id (*shape, shape->prop_id () + 100);
}
++shape;
}
EXPECT_EQ (shapes_to_string_norm (_this, topcell.shapes (lindex)),
"path (-100,0;-500,0;-700,200) w=100 bx=0 ex=0 r=false #0\n"
"path (-100,0;-500,0;-700,200) w=100 bx=0 ex=0 r=false #101\n"
"path (-1100,0;-1500,0;-1300,200) w=150 bx=0 ex=0 r=false #0\n"
"path (-1100,0;-1500,0;-1300,200) w=150 bx=0 ex=0 r=false #102\n"
"path (-115,-10;-515,-10;-715,190) w=100 bx=0 ex=0 r=false #0\n"
"path (-115,-10;-515,-10;-715,190) w=100 bx=0 ex=0 r=false #105\n"
"path (-1215,-110;-1615,-110;-1415,90) w=150 bx=0 ex=0 r=false #0\n"
"path (-1215,-110;-1615,-110;-1415,90) w=150 bx=0 ex=0 r=false #106\n"
"path (-2100,0;-2500,0;-2700,-200) w=200 bx=0 ex=0 r=false #0\n"
"path (-2100,0;-2500,0;-2700,-200) w=200 bx=0 ex=0 r=false #103\n"
"path (-2315,-210;-2715,-210;-2915,-410) w=200 bx=0 ex=0 r=false #0\n"
"path (-2315,-210;-2715,-210;-2915,-410) w=200 bx=0 ex=0 r=false #107\n"
);
}
}
TEST(12J)
{
if (db::default_editable_mode ()) {
db::Manager m;
db::Layout layout (&m);
unsigned int lindex = read_testdata (layout, 0x08 | 0x80); // text, no arrays
db::Cell &topcell = layout.cell (*layout.begin_top_down ());
db::Shapes::shape_iterator shape = topcell.shapes (lindex).begin (db::Shapes::shape_iterator::All);
while (! shape.at_end ()) {
db::Text sp;
shape->text (sp);
sp.transform (db::Trans (1));
topcell.shapes (lindex).replace (*shape, sp);
++shape;
}
EXPECT_EQ (shapes_to_string_norm (_this, topcell.shapes (lindex)),
"text ('A',r90 -35,10) #0\n"
"text ('A',r90 -35,10) #1\n"
"text ('A',r90 -50,0) #0\n"
"text ('A',r90 -50,0) #5\n"
"text ('B',r180 -140,-90) #0\n"
"text ('B',r180 -140,-90) #6\n"
"text ('B',r180 -25,20) #0\n"
"text ('B',r180 -25,20) #2\n"
"text ('C',m135 -15,30) #0\n"
"text ('C',m135 -15,30) #3\n"
"text ('C',m135 -230,-180) #0\n"
"text ('C',m135 -230,-180) #7\n"
);
shape = topcell.shapes (lindex).begin (db::Shapes::shape_iterator::All);
while (! shape.at_end ()) {
if (shape->with_props ()) {
topcell.shapes (lindex).replace_prop_id (*shape, shape->prop_id () + 100);
}
++shape;
}
EXPECT_EQ (shapes_to_string_norm (_this, topcell.shapes (lindex)),
"text ('A',r90 -35,10) #0\n"
"text ('A',r90 -35,10) #101\n"
"text ('A',r90 -50,0) #0\n"
"text ('A',r90 -50,0) #105\n"
"text ('B',r180 -140,-90) #0\n"
"text ('B',r180 -140,-90) #106\n"
"text ('B',r180 -25,20) #0\n"
"text ('B',r180 -25,20) #102\n"
"text ('C',m135 -15,30) #0\n"
"text ('C',m135 -15,30) #103\n"
"text ('C',m135 -230,-180) #0\n"
"text ('C',m135 -230,-180) #107\n"
);
}
}
TEST(13)
{
db::Manager m;
db::Layout layout (&m);
unsigned int lindex = read_testdata (layout, 0x3f); // all with arrays
db::Cell &topcell = layout.cell (*layout.begin_top_down ());
if (db::default_editable_mode ()) {
// replace all with first one
db::Shapes::shape_iterator shape = topcell.shapes (lindex).begin (db::Shapes::shape_iterator::All);
db::Shape shape0 = *shape;
db::Shapes ref;
while (! shape.at_end ()) {
ref.insert (db::BoxWithProperties (shape0.bbox (), shape->prop_id ()));
db::Shape new_shape = topcell.shapes (lindex).replace (*shape, shape0.bbox ());
if (*shape == shape0) {
shape0 = new_shape;
}
++shape;
}
EXPECT_EQ (shapes_to_string_norm (_this, topcell.shapes (lindex)), shapes_to_string_norm (_this, ref));
}
}
TEST(14)
{
db::Manager m;
db::Layout layout (&m);
unsigned int lindex = read_testdata (layout, 0x10); // boxes
db::Cell &topcell = layout.cell (*layout.begin_top_down ());
if (db::default_editable_mode ()) {
EXPECT_EQ (shapes_to_string (_this, topcell.shapes (lindex)),
"box (0,100;2000,1000) #0\n"
"box (100,200;2100,1100) #0\n"
"box (150,150;2150,1050) #0\n"
"box (50,-1050;1050,-50) #0\n"
"box (50,8950;1050,9950) #0\n"
"box (50,18950;1050,19950) #0\n"
"box (11050,-1050;12050,-50) #0\n"
"box (11050,8950;12050,9950) #0\n"
"box (11050,18950;12050,19950) #0\n"
"box (22050,-1050;23050,-50) #0\n"
"box (22050,8950;23050,9950) #0\n"
"box (22050,18950;23050,19950) #0\n"
"box (33050,-1050;34050,-50) #0\n"
"box (33050,8950;34050,9950) #0\n"
"box (33050,18950;34050,19950) #0\n"
"box (0,100;2000,1000) #10\n"
"box (100,200;2100,1100) #11\n"
"box (150,150;2150,1050) #12\n"
"box (50,-1050;1050,-50) #20\n"
"box (50,8950;1050,9950) #20\n"
"box (50,18950;1050,19950) #20\n"
"box (11050,-1050;12050,-50) #20\n"
"box (11050,8950;12050,9950) #20\n"
"box (11050,18950;12050,19950) #20\n"
"box (22050,-1050;23050,-50) #20\n"
"box (22050,8950;23050,9950) #20\n"
"box (22050,18950;23050,19950) #20\n"
"box (33050,-1050;34050,-50) #20\n"
"box (33050,8950;34050,9950) #20\n"
"box (33050,18950;34050,19950) #20\n"
);
// replace all with first one
db::Shapes::shape_iterator shape = topcell.shapes (lindex).begin (db::Shapes::shape_iterator::All);
++shape;
topcell.shapes (lindex).transform (*shape, db::ICplxTrans (2.5, 45.0, false, db::Vector ()));
for (unsigned int i = 0; i < 15; ++i) {
++shape;
}
topcell.shapes (lindex).transform (*shape, db::ICplxTrans (2.5, 45.0, false, db::Vector ()));
EXPECT_EQ (shapes_to_string (_this, topcell.shapes (lindex)),
"polygon (-177,530;-1768,2121;1768,5657;3359,4066) #0\n"
"polygon (-177,530;-1768,2121;1768,5657;3359,4066) #11\n"
"box (0,100;2000,1000) #0\n"
"box (150,150;2150,1050) #0\n"
"box (50,-1050;1050,-50) #0\n"
"box (50,8950;1050,9950) #0\n"
"box (50,18950;1050,19950) #0\n"
"box (11050,-1050;12050,-50) #0\n"
"box (11050,8950;12050,9950) #0\n"
"box (11050,18950;12050,19950) #0\n"
"box (22050,-1050;23050,-50) #0\n"
"box (22050,8950;23050,9950) #0\n"
"box (22050,18950;23050,19950) #0\n"
"box (33050,-1050;34050,-50) #0\n"
"box (33050,8950;34050,9950) #0\n"
"box (33050,18950;34050,19950) #0\n"
"box (0,100;2000,1000) #10\n"
"box (150,150;2150,1050) #12\n"
"box (50,-1050;1050,-50) #20\n"
"box (50,8950;1050,9950) #20\n"
"box (50,18950;1050,19950) #20\n"
"box (11050,-1050;12050,-50) #20\n"
"box (11050,8950;12050,9950) #20\n"
"box (11050,18950;12050,19950) #20\n"
"box (22050,-1050;23050,-50) #20\n"
"box (22050,8950;23050,9950) #20\n"
"box (22050,18950;23050,19950) #20\n"
"box (33050,-1050;34050,-50) #20\n"
"box (33050,8950;34050,9950) #20\n"
"box (33050,18950;34050,19950) #20\n"
);
}
}
TEST(15)
{
db::Manager m;
db::Layout layout (&m);
unsigned int lindex = read_testdata (layout, 0x1);
db::Cell &topcell = layout.cell (*layout.begin_top_down ());
db::Shapes copy (&m, &topcell, db::default_editable_mode ());
EXPECT_EQ (shapes_to_string_norm (_this, topcell.shapes (lindex)),
"polygon (-10,115;-10,2015;990,2015;990,115) #0\n"
"polygon (-10,115;-10,2015;990,2015;990,115) #5\n"
"polygon (-10,315;-10,2215;990,2215;990,315) #0\n"
"polygon (-10,315;-10,2215;990,2215;990,315) #6\n"
"polygon (-60,365;-60,2265;940,2265;940,365) #0\n"
"polygon (-60,365;-60,2265;940,2265;940,365) #7\n"
"polygon (0,100;0,2000;1000,2000;1000,100) #0\n"
"polygon (0,100;0,2000;1000,2000;1000,100) #1\n"
"polygon (0,10105;0,12005;1000,12005;1000,10105) #0\n"
"polygon (0,10105;0,12005;1000,12005;1000,10105) #8\n"
"polygon (0,105;0,2005;1000,2005;1000,105) #0\n"
"polygon (0,105;0,2005;1000,2005;1000,105) #8\n"
"polygon (0,20105;0,22005;1000,22005;1000,20105) #0\n"
"polygon (0,20105;0,22005;1000,22005;1000,20105) #8\n"
"polygon (100,200;100,2100;1100,2100;1100,200) #0\n"
"polygon (100,200;100,2100;1100,2100;1100,200) #2\n"
"polygon (11000,10105;11000,12005;12000,12005;12000,10105) #0\n"
"polygon (11000,10105;11000,12005;12000,12005;12000,10105) #8\n"
"polygon (11000,105;11000,2005;12000,2005;12000,105) #0\n"
"polygon (11000,105;11000,2005;12000,2005;12000,105) #8\n"
"polygon (11000,20105;11000,22005;12000,22005;12000,20105) #0\n"
"polygon (11000,20105;11000,22005;12000,22005;12000,20105) #8\n"
"polygon (150,150;150,2050;1150,2050;1150,150) #0\n"
"polygon (150,150;150,2050;1150,2050;1150,150) #3\n"
"polygon (22000,10105;22000,12005;23000,12005;23000,10105) #0\n"
"polygon (22000,10105;22000,12005;23000,12005;23000,10105) #8\n"
"polygon (22000,105;22000,2005;23000,2005;23000,105) #0\n"
"polygon (22000,105;22000,2005;23000,2005;23000,105) #8\n"
"polygon (22000,20105;22000,22005;23000,22005;23000,20105) #0\n"
"polygon (22000,20105;22000,22005;23000,22005;23000,20105) #8\n"
"polygon (33000,10105;33000,12005;34000,12005;34000,10105) #0\n"
"polygon (33000,10105;33000,12005;34000,12005;34000,10105) #8\n"
"polygon (33000,105;33000,2005;34000,2005;34000,105) #0\n"
"polygon (33000,105;33000,2005;34000,2005;34000,105) #8\n"
"polygon (33000,20105;33000,22005;34000,22005;34000,20105) #0\n"
"polygon (33000,20105;33000,22005;34000,22005;34000,20105) #8\n"
);
db::Shapes sa_copy;
for (db::Shapes::shape_iterator shape = topcell.shapes (lindex).begin_touching (db::Box (0, 0, 200, 200), db::Shapes::shape_iterator::All); ! shape.at_end (); ++shape) {
sa_copy.insert (*shape);
}
EXPECT_EQ (shapes_to_string_norm (_this, sa_copy),
"polygon (-10,115;-10,2015;990,2015;990,115) #0\n"
"polygon (-10,115;-10,2015;990,2015;990,115) #5\n"
"polygon (0,100;0,2000;1000,2000;1000,100) #0\n"
"polygon (0,100;0,2000;1000,2000;1000,100) #1\n"
"polygon (0,105;0,2005;1000,2005;1000,105) #0\n"
"polygon (0,105;0,2005;1000,2005;1000,105) #8\n"
"polygon (100,200;100,2100;1100,2100;1100,200) #0\n"
"polygon (100,200;100,2100;1100,2100;1100,200) #2\n"
"polygon (150,150;150,2050;1150,2050;1150,150) #0\n"
"polygon (150,150;150,2050;1150,2050;1150,150) #3\n"
);
sa_copy.clear ();
for (db::Shapes::shape_iterator shape = topcell.shapes (lindex).begin_touching (db::Box::world (), db::Shapes::shape_iterator::All); ! shape.at_end (); ++shape) {
sa_copy.insert (*shape);
}
EXPECT_EQ (shapes_to_string_norm (_this, sa_copy),
"polygon (-10,115;-10,2015;990,2015;990,115) #0\n"
"polygon (-10,115;-10,2015;990,2015;990,115) #5\n"
"polygon (-10,315;-10,2215;990,2215;990,315) #0\n"
"polygon (-10,315;-10,2215;990,2215;990,315) #6\n"
"polygon (-60,365;-60,2265;940,2265;940,365) #0\n"
"polygon (-60,365;-60,2265;940,2265;940,365) #7\n"
"polygon (0,100;0,2000;1000,2000;1000,100) #0\n"
"polygon (0,100;0,2000;1000,2000;1000,100) #1\n"
"polygon (0,10105;0,12005;1000,12005;1000,10105) #0\n"
"polygon (0,10105;0,12005;1000,12005;1000,10105) #8\n"
"polygon (0,105;0,2005;1000,2005;1000,105) #0\n"
"polygon (0,105;0,2005;1000,2005;1000,105) #8\n"
"polygon (0,20105;0,22005;1000,22005;1000,20105) #0\n"
"polygon (0,20105;0,22005;1000,22005;1000,20105) #8\n"
"polygon (100,200;100,2100;1100,2100;1100,200) #0\n"
"polygon (100,200;100,2100;1100,2100;1100,200) #2\n"
"polygon (11000,10105;11000,12005;12000,12005;12000,10105) #0\n"
"polygon (11000,10105;11000,12005;12000,12005;12000,10105) #8\n"
"polygon (11000,105;11000,2005;12000,2005;12000,105) #0\n"
"polygon (11000,105;11000,2005;12000,2005;12000,105) #8\n"
"polygon (11000,20105;11000,22005;12000,22005;12000,20105) #0\n"
"polygon (11000,20105;11000,22005;12000,22005;12000,20105) #8\n"
"polygon (150,150;150,2050;1150,2050;1150,150) #0\n"
"polygon (150,150;150,2050;1150,2050;1150,150) #3\n"
"polygon (22000,10105;22000,12005;23000,12005;23000,10105) #0\n"
"polygon (22000,10105;22000,12005;23000,12005;23000,10105) #8\n"
"polygon (22000,105;22000,2005;23000,2005;23000,105) #0\n"
"polygon (22000,105;22000,2005;23000,2005;23000,105) #8\n"
"polygon (22000,20105;22000,22005;23000,22005;23000,20105) #0\n"
"polygon (22000,20105;22000,22005;23000,22005;23000,20105) #8\n"
"polygon (33000,10105;33000,12005;34000,12005;34000,10105) #0\n"
"polygon (33000,10105;33000,12005;34000,12005;34000,10105) #8\n"
"polygon (33000,105;33000,2005;34000,2005;34000,105) #0\n"
"polygon (33000,105;33000,2005;34000,2005;34000,105) #8\n"
"polygon (33000,20105;33000,22005;34000,22005;34000,20105) #0\n"
"polygon (33000,20105;33000,22005;34000,22005;34000,20105) #8\n"
);
}
TEST(16)
{
db::Manager m;
db::Layout layout (&m);
unsigned int lindex = read_testdata (layout, 0x1);
db::Cell &topcell = layout.cell (*layout.begin_top_down ());
db::Layout layout2 (&m);
unsigned int lindex2 = read_testdata (layout2, 0x100);
db::Cell &topcell2 = layout2.cell (*layout2.begin_top_down ());
for (db::Shapes::shape_iterator shape = topcell.shapes (lindex).begin (db::Shapes::shape_iterator::All); ! shape.at_end (); ++shape) {
topcell2.shapes (lindex2).insert (*shape);
}
std::string s = shapes_to_string_norm (_this, topcell.shapes (lindex));
db::Layout empty_layout;
layout = empty_layout;
EXPECT_EQ (shapes_to_string_norm (_this, topcell2.shapes (lindex2)), s);
}
TEST(17)
{
db::Shapes shapes;
tl::SelfTimer timer ("insert/transform sequence");
db::Point ar, br;
// test performance of insert/transform sequences
for (unsigned int i = 0; i < 50000; ++i) {
db::Box b (0, 0, 10, 10);
db::Shape shape = shapes.insert (b);
db::Trans t (db::Vector (i, 50));
shape = shapes.transform(shape, t);
b.transform (t);
ar += b.lower_left () - db::Point ();
br += b.upper_right () - db::Point ();
}
db::Point af, bf;
for (db::Shapes::shape_iterator shape = shapes.begin (db::Shapes::shape_iterator::All); ! shape.at_end (); ++shape) {
af += shape->box ().lower_left () - db::Point ();
bf += shape->box ().upper_right () - db::Point ();
}
EXPECT_EQ (af, ar);
EXPECT_EQ (bf, br);
}
TEST(18)
{
db::Shapes shapes;
tl::SelfTimer timer ("insert/transform sequence");
db::Point ar, br;
// test performance of insert/transform sequences
for (unsigned int i = 0; i < 50000; ++i) {
db::Box b (0, 0, 10, 10);
db::Shape shape = shapes.insert (b);
db::Trans t (db::Vector (i, 50));
shape = shapes.transform(shape, t);
b.transform (t);
ar += b.lower_left () - db::Point ();
br += b.upper_right () - db::Point ();
}
db::Point af, bf;
for (db::Shapes::shape_iterator shape = shapes.begin (db::Shapes::shape_iterator::All); ! shape.at_end (); ++shape) {
af += shape->box ().lower_left () - db::Point ();
bf += shape->box ().upper_right () - db::Point ();
}
EXPECT_EQ (af, ar);
EXPECT_EQ (bf, br);
}
TEST(19)
{
db::Shapes shapes0;
shapes0.insert (db::BoxWithProperties (db::Box (0, 0, 100, 100), 1));
shapes0.insert (db::BoxWithProperties (db::Box (0, 0, 100, 100), 2));
db::Shapes shapes;
if (db::default_editable_mode ()) {
db::ShapeIterator s = shapes0.begin (db::ShapeIterator::All);
plus1 pm;
shapes.insert (*s, db::Trans (2), pm);
++s;
shapes.insert (*s, db::ICplxTrans (1.5, 45.0, false, db::Vector ()), pm);
++s;
EXPECT_EQ (shapes_to_string_norm (_this, shapes),
"box (-100,-100;0,0) #2\n"
"polygon (0,0;-106,106;0,212;106,106) #3\n"
);
}
}
TEST(20)
{
db::Shapes shapes;
db::ShapeIterator s = shapes.begin (db::ShapeIterator::All);
EXPECT_EQ (s.quad_id (), size_t (0));
EXPECT_EQ (s.quad_box ().to_string (), db::Box::world ().to_string ());
s = shapes.begin_touching (db::Box (-500, -500, 500, 500), db::ShapeIterator::All);
EXPECT_EQ (s.quad_id (), size_t (0));
EXPECT_EQ (s.quad_box ().to_string (), "()");
for (int i = 0; i < 200; ++i) {
shapes.insert (db::Box (-200, -200, -110, -110));
shapes.insert (db::Box (200, -200, 110, -110));
shapes.insert (db::Box (-200, 200, -110, 110));
shapes.insert (db::Box (200, 200, 110, 110));
}
s = shapes.begin_touching (db::Box (-500, -500, 500, 500), db::ShapeIterator::All);
size_t qid = s.quad_id ();
EXPECT_EQ (qid != 0, true);
EXPECT_EQ (s.quad_box ().to_string (), "(100,100;200,200)");
EXPECT_EQ (s->to_string (), "box (110,110;200,200)");
++s;
EXPECT_EQ (qid == s.quad_id (), true);
EXPECT_EQ (s.quad_box ().to_string (), "(100,100;200,200)");
EXPECT_EQ (s->to_string (), "box (110,110;200,200)");
s.skip_quad ();
EXPECT_EQ (qid != s.quad_id (), true);
EXPECT_EQ (s.quad_box ().to_string (), "(-200,100;-100,200)");
EXPECT_EQ (s->to_string (), "box (-200,110;-110,200)");
s.skip_quad ();
EXPECT_EQ (qid != s.quad_id (), true);
EXPECT_EQ (s.quad_box ().to_string (), "(-200,-200;-100,-100)");
EXPECT_EQ (s->to_string (), "box (-200,-200;-110,-110)");
s.skip_quad ();
EXPECT_EQ (qid != s.quad_id (), true);
EXPECT_EQ (s.quad_box ().to_string (), "(100,-200;200,-100)");
EXPECT_EQ (s->to_string (), "box (110,-200;200,-110)");
s.skip_quad ();
EXPECT_EQ (s.at_end (), true);
}
TEST(21)
{
db::Shapes shapes;
db::ShapeIterator s = shapes.begin (db::ShapeIterator::All);
EXPECT_EQ (s.quad_id (), size_t (0));
EXPECT_EQ (s.quad_box ().to_string (), db::Box::world ().to_string ());
s = shapes.begin_touching (db::Box (-500, -500, 500, 500), db::ShapeIterator::All);
EXPECT_EQ (s.quad_id (), size_t (0));
EXPECT_EQ (s.quad_box ().to_string (), "()");
for (int i = 0; i < 50; ++i) {
shapes.insert (db::Box (200, -200, 100, -100));
shapes.insert (db::Box (-200, 200, -100, 100));
shapes.insert (db::Box (200, 200, 100, 100));
}
s = shapes.begin_touching (db::Box (-500, -500, 500, 500), db::ShapeIterator::All);
size_t qid = s.quad_id ();
EXPECT_EQ (qid != 0, true);
EXPECT_EQ (s.quad_box ().to_string (), "(0,0;2147483647,2147483647)");
EXPECT_EQ (s->to_string (), "box (100,100;200,200)");
++s;
EXPECT_EQ (qid == s.quad_id (), true);
EXPECT_EQ (s.quad_box ().to_string (), "(0,0;2147483647,2147483647)");
EXPECT_EQ (s->to_string (), "box (100,100;200,200)");
s.skip_quad ();
EXPECT_EQ (qid != s.quad_id (), true);
EXPECT_EQ (s.quad_box ().to_string (), "(-2147483648,0;0,2147483647)");
EXPECT_EQ (s->to_string (), "box (-200,100;-100,200)");
s.skip_quad ();
EXPECT_EQ (qid != s.quad_id (), true);
EXPECT_EQ (s.quad_box ().to_string (), "(0,-2147483648;2147483647,0)");
EXPECT_EQ (s->to_string (), "box (100,-200;200,-100)");
s.skip_quad ();
EXPECT_EQ (s.at_end (), true);
}
TEST(22)
{
db::Shapes shapes1;
shapes1.insert (db::Box (200, -200, 100, -100));
shapes1.insert (db::Box (-200, 200, -100, 100));
shapes1.insert (db::Box (200, 200, 100, 100));
db::Shapes shapes2;
shapes2.insert (db::Box (200, -200, 100, -100));
shapes2.insert (db::Box (-210, 200, -100, 100));
db::Shapes shapes;
shapes = shapes1;
db::Shapes::shape_iterator s = shapes1.begin (db::ShapeIterator::All);
EXPECT_EQ (shapes.find (*s).to_string (), s->to_string ());
++s;
EXPECT_EQ (shapes.find (*s).to_string (), s->to_string ());
++s;
EXPECT_EQ (shapes.find (*s).to_string (), s->to_string ());
s = shapes2.begin (db::ShapeIterator::All);
EXPECT_EQ (shapes.find (*s).to_string (), s->to_string ());
++s;
EXPECT_EQ (shapes.find (*s).to_string (), "null");
}