mirror of https://github.com/KLayout/klayout.git
Bug fixed strmxor with deep mode, added tests.
This commit is contained in:
parent
f7bba9200e
commit
26f8fc5c83
|
|
@ -94,9 +94,11 @@ struct ResultDescriptor
|
||||||
size_t count () const
|
size_t count () const
|
||||||
{
|
{
|
||||||
if (layout && layer_output >= 0) {
|
if (layout && layer_output >= 0) {
|
||||||
// NOTE: this assumes the output is flat
|
size_t res = 0;
|
||||||
tl_assert (layout->cells () == 1);
|
for (db::Layout::const_iterator c = layout->begin (); c != layout->end (); ++c) {
|
||||||
return layout->cell (top_cell).shapes (layer_output).size ();
|
res += c->shapes (layer_output).size ();
|
||||||
|
}
|
||||||
|
return res;
|
||||||
} else {
|
} else {
|
||||||
return shape_count;
|
return shape_count;
|
||||||
}
|
}
|
||||||
|
|
@ -105,9 +107,12 @@ struct ResultDescriptor
|
||||||
bool is_empty () const
|
bool is_empty () const
|
||||||
{
|
{
|
||||||
if (layout && layer_output >= 0) {
|
if (layout && layer_output >= 0) {
|
||||||
// NOTE: this assumes the output is flat
|
for (db::Layout::const_iterator c = layout->begin (); c != layout->end (); ++c) {
|
||||||
tl_assert (layout->cells () == 1);
|
if (! c->shapes (layer_output).empty ()) {
|
||||||
return layout->cell (top_cell).shapes (layer_output).empty ();
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
} else {
|
} else {
|
||||||
return shape_count == 0;
|
return shape_count == 0;
|
||||||
}
|
}
|
||||||
|
|
@ -185,7 +190,7 @@ BD_PUBLIC int strmxor (int argc, char *argv[])
|
||||||
<< tl::arg ("-tb|--top-b=name", &top_b, "Specifies the top cell for the second layout",
|
<< tl::arg ("-tb|--top-b=name", &top_b, "Specifies the top cell for the second layout",
|
||||||
"See --top-a for details."
|
"See --top-a for details."
|
||||||
)
|
)
|
||||||
<< tl::arg ("-d|--deep", &deep, "Deep (hierarchical mode)",
|
<< tl::arg ("-u|--deep", &deep, "Deep (hierarchical mode)",
|
||||||
"Enables hierarchical XOR (experimental). In this mode, tiling is not supported "
|
"Enables hierarchical XOR (experimental). In this mode, tiling is not supported "
|
||||||
"and the tiling arguments are ignored."
|
"and the tiling arguments are ignored."
|
||||||
)
|
)
|
||||||
|
|
@ -593,7 +598,7 @@ bool run_deep_xor (const XORData &xor_data)
|
||||||
ri_a = db::RecursiveShapeIterator (*xor_data.layout_a, xor_data.layout_a->cell (xor_data.cell_a), ll->second.first);
|
ri_a = db::RecursiveShapeIterator (*xor_data.layout_a, xor_data.layout_a->cell (xor_data.cell_a), ll->second.first);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ll->second.second < 0) {
|
if (ll->second.second >= 0) {
|
||||||
ri_b = db::RecursiveShapeIterator (*xor_data.layout_b, xor_data.layout_b->cell (xor_data.cell_b), ll->second.second);
|
ri_b = db::RecursiveShapeIterator (*xor_data.layout_b, xor_data.layout_b->cell (xor_data.cell_b), ll->second.second);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -30,7 +30,7 @@
|
||||||
|
|
||||||
BD_PUBLIC int strmxor (int argc, char *argv[]);
|
BD_PUBLIC int strmxor (int argc, char *argv[]);
|
||||||
|
|
||||||
TEST(0)
|
TEST(0_Basic_Flat)
|
||||||
{
|
{
|
||||||
tl::CaptureChannel cap;
|
tl::CaptureChannel cap;
|
||||||
|
|
||||||
|
|
@ -51,7 +51,28 @@ TEST(0)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST(1A)
|
TEST(0_Basic_Deep)
|
||||||
|
{
|
||||||
|
tl::CaptureChannel cap;
|
||||||
|
|
||||||
|
std::string input_a = tl::testsrc ();
|
||||||
|
input_a += "/testdata/bd/strmxor_in1.gds";
|
||||||
|
|
||||||
|
std::string input_b = tl::testsrc ();
|
||||||
|
input_b += "/testdata/bd/strmxor_in1.gds";
|
||||||
|
|
||||||
|
std::string output = this->tmp_file ("tmp.oas");
|
||||||
|
|
||||||
|
const char *argv[] = { "x", "-u", input_a.c_str (), input_b.c_str () };
|
||||||
|
|
||||||
|
EXPECT_EQ (strmxor (sizeof (argv) / sizeof (argv[0]), (char **) argv), 0);
|
||||||
|
|
||||||
|
EXPECT_EQ (cap.captured_text (),
|
||||||
|
"No differences found\n"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(1A_Flat)
|
||||||
{
|
{
|
||||||
tl::CaptureChannel cap;
|
tl::CaptureChannel cap;
|
||||||
|
|
||||||
|
|
@ -93,7 +114,49 @@ TEST(1A)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST(1B)
|
TEST(1A_Deep)
|
||||||
|
{
|
||||||
|
tl::CaptureChannel cap;
|
||||||
|
|
||||||
|
std::string input_a = tl::testsrc ();
|
||||||
|
input_a += "/testdata/bd/strmxor_in1.gds";
|
||||||
|
|
||||||
|
std::string input_b = tl::testsrc ();
|
||||||
|
input_b += "/testdata/bd/strmxor_in2.gds";
|
||||||
|
|
||||||
|
std::string au = tl::testsrc ();
|
||||||
|
au += "/testdata/bd/strmxor_au1d.oas";
|
||||||
|
|
||||||
|
std::string output = this->tmp_file ("tmp.oas");
|
||||||
|
|
||||||
|
const char *argv[] = { "x", "--deep", input_a.c_str (), input_b.c_str (), output.c_str () };
|
||||||
|
|
||||||
|
EXPECT_EQ (strmxor (sizeof (argv) / sizeof (argv[0]), (char **) argv), 1);
|
||||||
|
|
||||||
|
db::Layout layout;
|
||||||
|
|
||||||
|
{
|
||||||
|
tl::InputStream stream (output);
|
||||||
|
db::Reader reader (stream);
|
||||||
|
reader.read (layout);
|
||||||
|
}
|
||||||
|
|
||||||
|
db::compare_layouts (this, layout, au, db::NoNormalization);
|
||||||
|
EXPECT_EQ (cap.captured_text (),
|
||||||
|
"Layer 10/0 is not present in first layout, but in second\n"
|
||||||
|
"Result summary (layers without differences are not shown):\n"
|
||||||
|
"\n"
|
||||||
|
" Layer Output Differences (shape count)\n"
|
||||||
|
" -------------------------------------------------------\n"
|
||||||
|
" 3/0 3/0 3\n"
|
||||||
|
" 6/0 6/0 314\n"
|
||||||
|
" 8/1 8/1 1\n"
|
||||||
|
" 10/0 - (no such layer in first layout)\n"
|
||||||
|
"\n"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(1B_Flat)
|
||||||
{
|
{
|
||||||
tl::CaptureChannel cap;
|
tl::CaptureChannel cap;
|
||||||
|
|
||||||
|
|
@ -123,7 +186,37 @@ TEST(1B)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST(1C)
|
TEST(1B_Deep)
|
||||||
|
{
|
||||||
|
tl::CaptureChannel cap;
|
||||||
|
|
||||||
|
std::string input_a = tl::testsrc ();
|
||||||
|
input_a += "/testdata/bd/strmxor_in1.gds";
|
||||||
|
|
||||||
|
std::string input_b = tl::testsrc ();
|
||||||
|
input_b += "/testdata/bd/strmxor_in2.gds";
|
||||||
|
|
||||||
|
std::string output = this->tmp_file ("tmp.oas");
|
||||||
|
|
||||||
|
const char *argv[] = { "x", "-u", input_a.c_str (), input_b.c_str () };
|
||||||
|
|
||||||
|
EXPECT_EQ (strmxor (sizeof (argv) / sizeof (argv[0]), (char **) argv), 1);
|
||||||
|
|
||||||
|
EXPECT_EQ (cap.captured_text (),
|
||||||
|
"Layer 10/0 is not present in first layout, but in second\n"
|
||||||
|
"Result summary (layers without differences are not shown):\n"
|
||||||
|
"\n"
|
||||||
|
" Layer Output Differences (shape count)\n"
|
||||||
|
" -------------------------------------------------------\n"
|
||||||
|
" 3/0 - 30\n"
|
||||||
|
" 6/0 - 314\n"
|
||||||
|
" 8/1 - 1\n"
|
||||||
|
" 10/0 - (no such layer in first layout)\n"
|
||||||
|
"\n"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(1C_Flat)
|
||||||
{
|
{
|
||||||
tl::CaptureChannel cap;
|
tl::CaptureChannel cap;
|
||||||
|
|
||||||
|
|
@ -144,7 +237,28 @@ TEST(1C)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST(1D)
|
TEST(1C_Deep)
|
||||||
|
{
|
||||||
|
tl::CaptureChannel cap;
|
||||||
|
|
||||||
|
std::string input_a = tl::testsrc ();
|
||||||
|
input_a += "/testdata/bd/strmxor_in1.gds";
|
||||||
|
|
||||||
|
std::string input_b = tl::testsrc ();
|
||||||
|
input_b += "/testdata/bd/strmxor_in2.gds";
|
||||||
|
|
||||||
|
std::string output = this->tmp_file ("tmp.oas");
|
||||||
|
|
||||||
|
const char *argv[] = { "x", "-u", "--no-summary", input_a.c_str (), input_b.c_str () };
|
||||||
|
|
||||||
|
EXPECT_EQ (strmxor (sizeof (argv) / sizeof (argv[0]), (char **) argv), 1);
|
||||||
|
|
||||||
|
EXPECT_EQ (cap.captured_text (),
|
||||||
|
"Layer 10/0 is not present in first layout, but in second\n"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(1D_Flat)
|
||||||
{
|
{
|
||||||
tl::CaptureChannel cap;
|
tl::CaptureChannel cap;
|
||||||
|
|
||||||
|
|
@ -162,7 +276,25 @@ TEST(1D)
|
||||||
EXPECT_EQ (cap.captured_text (), "");
|
EXPECT_EQ (cap.captured_text (), "");
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST(2)
|
TEST(1D_Deep)
|
||||||
|
{
|
||||||
|
tl::CaptureChannel cap;
|
||||||
|
|
||||||
|
std::string input_a = tl::testsrc ();
|
||||||
|
input_a += "/testdata/bd/strmxor_in1.gds";
|
||||||
|
|
||||||
|
std::string input_b = tl::testsrc ();
|
||||||
|
input_b += "/testdata/bd/strmxor_in2.gds";
|
||||||
|
|
||||||
|
std::string output = this->tmp_file ("tmp.oas");
|
||||||
|
|
||||||
|
const char *argv[] = { "x", "-u", "-s", input_a.c_str (), input_b.c_str () };
|
||||||
|
|
||||||
|
EXPECT_EQ (strmxor (sizeof (argv) / sizeof (argv[0]), (char **) argv), 1);
|
||||||
|
EXPECT_EQ (cap.captured_text (), "");
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(2_Flat)
|
||||||
{
|
{
|
||||||
tl::CaptureChannel cap;
|
tl::CaptureChannel cap;
|
||||||
|
|
||||||
|
|
@ -195,7 +327,40 @@ TEST(2)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST(3)
|
TEST(2_Deep)
|
||||||
|
{
|
||||||
|
tl::CaptureChannel cap;
|
||||||
|
|
||||||
|
std::string input_a = tl::testsrc ();
|
||||||
|
input_a += "/testdata/bd/strmxor_in1.gds";
|
||||||
|
|
||||||
|
std::string input_b = tl::testsrc ();
|
||||||
|
input_b += "/testdata/bd/strmxor_in2.gds";
|
||||||
|
|
||||||
|
std::string au = tl::testsrc ();
|
||||||
|
au += "/testdata/bd/strmxor_au2d.oas";
|
||||||
|
|
||||||
|
std::string output = this->tmp_file ("tmp.oas");
|
||||||
|
|
||||||
|
const char *argv[] = { "x", "-u", "--no-summary", "-l", input_a.c_str (), input_b.c_str (), output.c_str () };
|
||||||
|
|
||||||
|
EXPECT_EQ (strmxor (sizeof (argv) / sizeof (argv[0]), (char **) argv), 1);
|
||||||
|
|
||||||
|
db::Layout layout;
|
||||||
|
|
||||||
|
{
|
||||||
|
tl::InputStream stream (output);
|
||||||
|
db::Reader reader (stream);
|
||||||
|
reader.read (layout);
|
||||||
|
}
|
||||||
|
|
||||||
|
db::compare_layouts (this, layout, au, db::NoNormalization);
|
||||||
|
EXPECT_EQ (cap.captured_text (),
|
||||||
|
""
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(3_Flat)
|
||||||
{
|
{
|
||||||
tl::CaptureChannel cap;
|
tl::CaptureChannel cap;
|
||||||
|
|
||||||
|
|
@ -228,7 +393,41 @@ TEST(3)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST(4)
|
TEST(3_Deep)
|
||||||
|
{
|
||||||
|
tl::CaptureChannel cap;
|
||||||
|
|
||||||
|
std::string input_a = tl::testsrc ();
|
||||||
|
input_a += "/testdata/bd/strmxor_in1.gds";
|
||||||
|
|
||||||
|
std::string input_b = tl::testsrc ();
|
||||||
|
input_b += "/testdata/bd/strmxor_in2.gds";
|
||||||
|
|
||||||
|
std::string au = tl::testsrc ();
|
||||||
|
au += "/testdata/bd/strmxor_au3d.oas";
|
||||||
|
|
||||||
|
std::string output = this->tmp_file ("tmp.oas");
|
||||||
|
|
||||||
|
// NOTE: -p is ignored in deep mode
|
||||||
|
const char *argv[] = { "x", "-u", "--no-summary", "-p=1.0", "-n=4", input_a.c_str (), input_b.c_str (), output.c_str () };
|
||||||
|
|
||||||
|
EXPECT_EQ (strmxor (sizeof (argv) / sizeof (argv[0]), (char **) argv), 1);
|
||||||
|
|
||||||
|
db::Layout layout;
|
||||||
|
|
||||||
|
{
|
||||||
|
tl::InputStream stream (output);
|
||||||
|
db::Reader reader (stream);
|
||||||
|
reader.read (layout);
|
||||||
|
}
|
||||||
|
|
||||||
|
db::compare_layouts (this, layout, au, db::NoNormalization);
|
||||||
|
EXPECT_EQ (cap.captured_text (),
|
||||||
|
"Layer 10/0 is not present in first layout, but in second\n"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(4_Flat)
|
||||||
{
|
{
|
||||||
tl::CaptureChannel cap;
|
tl::CaptureChannel cap;
|
||||||
|
|
||||||
|
|
@ -261,7 +460,40 @@ TEST(4)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST(5)
|
TEST(4_Deep)
|
||||||
|
{
|
||||||
|
tl::CaptureChannel cap;
|
||||||
|
|
||||||
|
std::string input_a = tl::testsrc ();
|
||||||
|
input_a += "/testdata/bd/strmxor_in1.gds";
|
||||||
|
|
||||||
|
std::string input_b = tl::testsrc ();
|
||||||
|
input_b += "/testdata/bd/strmxor_in2.gds";
|
||||||
|
|
||||||
|
std::string au = tl::testsrc ();
|
||||||
|
au += "/testdata/bd/strmxor_au4d.oas";
|
||||||
|
|
||||||
|
std::string output = this->tmp_file ("tmp.oas");
|
||||||
|
|
||||||
|
const char *argv[] = { "x", "-u", "--no-summary", "-p=1.0", "-n=4", "-t=0.0,0.005,0.01,0.02,0.09,0.1", input_a.c_str (), input_b.c_str (), output.c_str () };
|
||||||
|
|
||||||
|
EXPECT_EQ (strmxor (sizeof (argv) / sizeof (argv[0]), (char **) argv), 1);
|
||||||
|
|
||||||
|
db::Layout layout;
|
||||||
|
|
||||||
|
{
|
||||||
|
tl::InputStream stream (output);
|
||||||
|
db::Reader reader (stream);
|
||||||
|
reader.read (layout);
|
||||||
|
}
|
||||||
|
|
||||||
|
db::compare_layouts (this, layout, au, db::NoNormalization);
|
||||||
|
EXPECT_EQ (cap.captured_text (),
|
||||||
|
"Layer 10/0 is not present in first layout, but in second\n"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(5_Flat)
|
||||||
{
|
{
|
||||||
tl::CaptureChannel cap;
|
tl::CaptureChannel cap;
|
||||||
|
|
||||||
|
|
@ -294,7 +526,40 @@ TEST(5)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST(6)
|
TEST(5_Deep)
|
||||||
|
{
|
||||||
|
tl::CaptureChannel cap;
|
||||||
|
|
||||||
|
std::string input_a = tl::testsrc ();
|
||||||
|
input_a += "/testdata/bd/strmxor_in1.gds";
|
||||||
|
|
||||||
|
std::string input_b = tl::testsrc ();
|
||||||
|
input_b += "/testdata/bd/strmxor_in2.gds";
|
||||||
|
|
||||||
|
std::string au = tl::testsrc ();
|
||||||
|
au += "/testdata/bd/strmxor_au5d.oas";
|
||||||
|
|
||||||
|
std::string output = this->tmp_file ("tmp.oas");
|
||||||
|
|
||||||
|
const char *argv[] = { "x", "-u", "--no-summary", "-b=1000", "-t=0.0,0.005,0.01,0.02,0.09,0.1", input_a.c_str (), input_b.c_str (), output.c_str () };
|
||||||
|
|
||||||
|
EXPECT_EQ (strmxor (sizeof (argv) / sizeof (argv[0]), (char **) argv), 1);
|
||||||
|
|
||||||
|
db::Layout layout;
|
||||||
|
|
||||||
|
{
|
||||||
|
tl::InputStream stream (output);
|
||||||
|
db::Reader reader (stream);
|
||||||
|
reader.read (layout);
|
||||||
|
}
|
||||||
|
|
||||||
|
db::compare_layouts (this, layout, au, db::NoNormalization);
|
||||||
|
EXPECT_EQ (cap.captured_text (),
|
||||||
|
"Layer 10/0 is not present in first layout, but in second\n"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(6_Flat)
|
||||||
{
|
{
|
||||||
tl::CaptureChannel cap;
|
tl::CaptureChannel cap;
|
||||||
|
|
||||||
|
|
@ -326,3 +591,36 @@ TEST(6)
|
||||||
"Layer 10/0 is not present in first layout, but in second\n"
|
"Layer 10/0 is not present in first layout, but in second\n"
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST(6_Deep)
|
||||||
|
{
|
||||||
|
tl::CaptureChannel cap;
|
||||||
|
|
||||||
|
std::string input_a = tl::testsrc ();
|
||||||
|
input_a += "/testdata/bd/strmxor_in1.gds";
|
||||||
|
|
||||||
|
std::string input_b = tl::testsrc ();
|
||||||
|
input_b += "/testdata/bd/strmxor_in2.gds";
|
||||||
|
|
||||||
|
std::string au = tl::testsrc ();
|
||||||
|
au += "/testdata/bd/strmxor_au6d.oas";
|
||||||
|
|
||||||
|
std::string output = this->tmp_file ("tmp.oas");
|
||||||
|
|
||||||
|
const char *argv[] = { "x", "-u", "--no-summary", "-ta=INV2", "-tb=2VNI", input_a.c_str (), input_b.c_str (), output.c_str () };
|
||||||
|
|
||||||
|
EXPECT_EQ (strmxor (sizeof (argv) / sizeof (argv[0]), (char **) argv), 1);
|
||||||
|
|
||||||
|
db::Layout layout;
|
||||||
|
|
||||||
|
{
|
||||||
|
tl::InputStream stream (output);
|
||||||
|
db::Reader reader (stream);
|
||||||
|
reader.read (layout);
|
||||||
|
}
|
||||||
|
|
||||||
|
db::compare_layouts (this, layout, au, db::NoNormalization);
|
||||||
|
EXPECT_EQ (cap.captured_text (),
|
||||||
|
"Layer 10/0 is not present in first layout, but in second\n"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
|
||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Loading…
Reference in New Issue