Bug fixed strmxor with deep mode, added tests.

This commit is contained in:
Matthias Koefferlein 2019-09-07 21:27:12 +02:00
parent f7bba9200e
commit 26f8fc5c83
8 changed files with 321 additions and 18 deletions

View File

@ -94,9 +94,11 @@ struct ResultDescriptor
size_t count () const
{
if (layout && layer_output >= 0) {
// NOTE: this assumes the output is flat
tl_assert (layout->cells () == 1);
return layout->cell (top_cell).shapes (layer_output).size ();
size_t res = 0;
for (db::Layout::const_iterator c = layout->begin (); c != layout->end (); ++c) {
res += c->shapes (layer_output).size ();
}
return res;
} else {
return shape_count;
}
@ -105,9 +107,12 @@ struct ResultDescriptor
bool is_empty () const
{
if (layout && layer_output >= 0) {
// NOTE: this assumes the output is flat
tl_assert (layout->cells () == 1);
return layout->cell (top_cell).shapes (layer_output).empty ();
for (db::Layout::const_iterator c = layout->begin (); c != layout->end (); ++c) {
if (! c->shapes (layer_output).empty ()) {
return false;
}
}
return true;
} else {
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",
"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 "
"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);
}
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);
}

View File

@ -30,7 +30,7 @@
BD_PUBLIC int strmxor (int argc, char *argv[]);
TEST(0)
TEST(0_Basic_Flat)
{
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;
@ -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;
@ -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;
@ -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;
@ -162,7 +276,25 @@ TEST(1D)
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;
@ -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;
@ -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;
@ -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;
@ -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;
@ -326,3 +591,36 @@ TEST(6)
"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"
);
}

BIN
testdata/bd/strmxor_au1d.oas vendored Normal file

Binary file not shown.

BIN
testdata/bd/strmxor_au2d.oas vendored Normal file

Binary file not shown.

BIN
testdata/bd/strmxor_au3d.oas vendored Normal file

Binary file not shown.

BIN
testdata/bd/strmxor_au4d.oas vendored Normal file

Binary file not shown.

BIN
testdata/bd/strmxor_au5d.oas vendored Normal file

Binary file not shown.

BIN
testdata/bd/strmxor_au6d.oas vendored Normal file

Binary file not shown.