mirror of https://github.com/KLayout/klayout.git
Added full-circuit test for recursive shape iterator
This commit is contained in:
parent
40a8f21f9c
commit
3fc32e77c3
|
|
@ -26,6 +26,10 @@
|
||||||
#include "dbLayoutDiff.h"
|
#include "dbLayoutDiff.h"
|
||||||
#include "tlString.h"
|
#include "tlString.h"
|
||||||
#include "tlUnitTest.h"
|
#include "tlUnitTest.h"
|
||||||
|
#include "tlFileUtils.h"
|
||||||
|
#include "tlStream.h"
|
||||||
|
#include "dbReader.h"
|
||||||
|
#include "dbWriter.h"
|
||||||
|
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
|
|
@ -1623,6 +1627,164 @@ TEST(12_ForMerged)
|
||||||
i1.set_for_merged_input (true);
|
i1.set_for_merged_input (true);
|
||||||
x = collect(i1, *g);
|
x = collect(i1, *g);
|
||||||
EXPECT_EQ (x, "[$1](0,0;3000,2000)/[$4](-1200,0;-100,1000)");
|
EXPECT_EQ (x, "[$1](0,0;3000,2000)/[$4](-1200,0;-100,1000)");
|
||||||
|
|
||||||
// ...
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void write (const db::Region ®ion, const std::string &fn)
|
||||||
|
{
|
||||||
|
db::Layout layout;
|
||||||
|
const db::Cell &top = layout.cell (layout.add_cell ("TOP"));
|
||||||
|
unsigned int li = layout.insert_layer (db::LayerProperties (0, 0));
|
||||||
|
region.insert_into (&layout, top.cell_index (), li);
|
||||||
|
|
||||||
|
tl::OutputStream os (fn);
|
||||||
|
db::SaveLayoutOptions opt;
|
||||||
|
opt.set_format_from_filename (fn);
|
||||||
|
db::Writer writer (opt);
|
||||||
|
writer.write (layout, os);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(13_ForMergedPerformance)
|
||||||
|
{
|
||||||
|
test_is_long_runner ();
|
||||||
|
|
||||||
|
std::string fn (tl::combine_path (tl::testdata_private (), "oasis/caravel.oas.gz"));
|
||||||
|
|
||||||
|
db::Layout ly;
|
||||||
|
|
||||||
|
{
|
||||||
|
tl::InputStream is (fn);
|
||||||
|
db::Reader reader (is);
|
||||||
|
reader.read (ly);
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned l1 = ly.get_layer (db::LayerProperties (66, 20));
|
||||||
|
unsigned l2 = ly.get_layer (db::LayerProperties (235, 4));
|
||||||
|
|
||||||
|
db::RecursiveShapeIterator si1 (ly, ly.cell (*ly.begin_top_down ()), l1);
|
||||||
|
db::RecursiveShapeIterator si2 (ly, ly.cell (*ly.begin_top_down ()), l2);
|
||||||
|
|
||||||
|
{
|
||||||
|
tl::SelfTimer timer ("Standard loop on 66/20");
|
||||||
|
size_t n = 0;
|
||||||
|
while (! si1.at_end ()) {
|
||||||
|
++si1;
|
||||||
|
++n;
|
||||||
|
}
|
||||||
|
tl::info << "Counted " << n << " shapes on 66/20";
|
||||||
|
EXPECT_EQ (n, size_t (1218378));
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
tl::SelfTimer timer ("Standard loop on 235/4");
|
||||||
|
size_t n = 0;
|
||||||
|
while (! si2.at_end ()) {
|
||||||
|
++si2;
|
||||||
|
++n;
|
||||||
|
}
|
||||||
|
tl::info << "Counted " << n << " shapes on 235/4";
|
||||||
|
EXPECT_EQ (n, size_t (57462));
|
||||||
|
}
|
||||||
|
|
||||||
|
si1.set_for_merged_input (true);
|
||||||
|
si2.set_for_merged_input (true);
|
||||||
|
|
||||||
|
{
|
||||||
|
tl::SelfTimer timer ("'for_merged' loop on 66/20");
|
||||||
|
size_t n = 0;
|
||||||
|
while (! si1.at_end ()) {
|
||||||
|
++si1;
|
||||||
|
++n;
|
||||||
|
}
|
||||||
|
tl::info << "Counted " << n << " shapes on 66/20";
|
||||||
|
EXPECT_EQ (n, size_t (1217072));
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
tl::SelfTimer timer ("'for_merged' loop on 235/4");
|
||||||
|
size_t n = 0;
|
||||||
|
while (! si2.at_end ()) {
|
||||||
|
++si2;
|
||||||
|
++n;
|
||||||
|
}
|
||||||
|
tl::info << "Counted " << n << " shapes on 235/4";
|
||||||
|
EXPECT_EQ (n, size_t (919));
|
||||||
|
}
|
||||||
|
|
||||||
|
si1.set_for_merged_input (false);
|
||||||
|
si1.set_region (db::Box (0, 0, 1000000, 1000000));
|
||||||
|
si2.set_for_merged_input (false);
|
||||||
|
si2.set_region (db::Box (0, 0, 1000000, 1000000));
|
||||||
|
|
||||||
|
{
|
||||||
|
tl::SelfTimer timer ("Standard loop on 66/20");
|
||||||
|
size_t n = 0;
|
||||||
|
while (! si1.at_end ()) {
|
||||||
|
++si1;
|
||||||
|
++n;
|
||||||
|
}
|
||||||
|
tl::info << "Counted " << n << " shapes on 66/20";
|
||||||
|
EXPECT_EQ (n, size_t (218823));
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
tl::SelfTimer timer ("Standard loop on 235/4");
|
||||||
|
size_t n = 0;
|
||||||
|
while (! si2.at_end ()) {
|
||||||
|
++si2;
|
||||||
|
++n;
|
||||||
|
}
|
||||||
|
tl::info << "Counted " << n << " shapes on 235/4";
|
||||||
|
EXPECT_EQ (n, size_t (2578));
|
||||||
|
}
|
||||||
|
|
||||||
|
si1.set_for_merged_input (true);
|
||||||
|
si2.set_for_merged_input (true);
|
||||||
|
|
||||||
|
{
|
||||||
|
tl::SelfTimer timer ("'for_merged' loop on 66/20");
|
||||||
|
size_t n = 0;
|
||||||
|
while (! si1.at_end ()) {
|
||||||
|
++si1;
|
||||||
|
++n;
|
||||||
|
}
|
||||||
|
tl::info << "Counted " << n << " shapes on 66/20";
|
||||||
|
EXPECT_EQ (n, size_t (218736));
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
tl::SelfTimer timer ("'for_merged' loop on 235/4");
|
||||||
|
size_t n = 0;
|
||||||
|
while (! si2.at_end ()) {
|
||||||
|
++si2;
|
||||||
|
++n;
|
||||||
|
}
|
||||||
|
tl::info << "Counted " << n << " shapes on 235/4";
|
||||||
|
EXPECT_EQ (n, size_t (1));
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
tl::SelfTimer timer ("XOR on tile of 66/20");
|
||||||
|
si1.set_for_merged_input (false);
|
||||||
|
db::Region r1 (si1);
|
||||||
|
si1.set_for_merged_input (true);
|
||||||
|
db::Region r2 (si1);
|
||||||
|
|
||||||
|
EXPECT_EQ (r1.count (), size_t (218823));
|
||||||
|
EXPECT_EQ (r2.count (), size_t (218736));
|
||||||
|
EXPECT_EQ ((r1 ^ r2).count (), size_t (0));
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
tl::SelfTimer timer ("XOR on tile of 235/4");
|
||||||
|
si2.set_for_merged_input (false);
|
||||||
|
db::Region r1 (si2);
|
||||||
|
si2.set_for_merged_input (true);
|
||||||
|
db::Region r2 (si2);
|
||||||
|
|
||||||
|
EXPECT_EQ (r1.count (), size_t (2578));
|
||||||
|
EXPECT_EQ (r2.count (), size_t (1));
|
||||||
|
EXPECT_EQ ((r1 ^ r2).count (), size_t (0));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue