More tests, bug fixes.

This commit is contained in:
Matthias Koefferlein 2021-01-09 17:50:39 +01:00
parent b15e7f2b9f
commit 6f93ff616f
8 changed files with 105 additions and 51 deletions

View File

@ -583,13 +583,13 @@ TEST(12)
b.insert (db::Box (db::Point (30, 0), db::Point (100, 100)));
EXPECT_EQ (b.separation_check (a, 15).to_string (), "(30,9;30,41)/(20,30;20,20)");
EXPECT_EQ (b.separation_check (a, 15, true).to_string (), "(30,0;30,100)/(20,30;20,20)");
EXPECT_EQ (b.separation_check (a, 15, db::RegionCheckOptions (false, db::Euclidian, 91)).to_string (), "(30,9;30,20)/(20,20;15,20);(30,9;30,41)/(20,30;20,20);(30,30;30,41)/(15,30;20,30)");
EXPECT_EQ (b.separation_check (a, 15, db::RegionCheckOptions (false, db::Euclidian, 91)).to_string (), "(30,30;30,41)/(15,30;20,30);(30,9;30,41)/(20,30;20,20);(30,9;30,20)/(20,20;15,20)");
b.clear ();
b.insert (db::Box (db::Point (15, 0), db::Point (100, 100)));
EXPECT_EQ (b.overlap_check (a, 15).to_string (), "(15,6;15,44)/(20,30;20,20)");
EXPECT_EQ (b.overlap_check (a, 15, true).to_string (), "(15,0;15,100)/(20,30;20,20)");
EXPECT_EQ (b.overlap_check (a, 15, db::RegionCheckOptions (false, db::Euclidian, 91)).to_string (), "(15,20;15,35)/(20,20;15,20);(15,6;15,44)/(20,30;20,20);(15,15;15,30)/(15,30;20,30)");
EXPECT_EQ (b.overlap_check (a, 15, db::RegionCheckOptions (false, db::Euclidian, 91)).to_string (), "(15,15;15,30)/(15,30;20,30);(15,6;15,44)/(20,30;20,20);(15,20;15,35)/(20,20;15,20)");
}
TEST(20)

View File

@ -508,11 +508,11 @@ TEST(15a)
EXPECT_EQ (r.width_check (15).to_string (), "(0,0;0,10)/(10,10;10,0);(0,10;10,10)/(10,0;0,0)");
EXPECT_EQ (r.width_check (5).to_string (), "");
EXPECT_EQ (r.width_check (5, db::RegionCheckOptions (false, db::Euclidian, 91)).to_string (), "(0,5;0,10)/(0,10;5,10);(0,0;0,5)/(5,0;0,0);(5,10;10,10)/(10,10;10,5);(10,5;10,0)/(10,0;5,0);(20,45;20,50)/(20,50;25,50);(20,20;20,25)/(25,20;20,20);(35,50;40,50)/(40,50;40,45);(40,25;40,20)/(40,20;35,20)");
EXPECT_EQ (r.space_check (15, db::RegionCheckOptions (false, db::Euclidian, 91)).to_string (), "(21,20;20,20)/(10,10;10,9);(21,20;20,20)/(9,10;10,10);(20,20;20,21)/(10,10;10,9);(20,20;20,21)/(9,10;10,10)");
EXPECT_EQ (r.space_check (15, db::RegionCheckOptions (false, db::Square, 91)).to_string (), "(25,20;20,20)/(10,10;10,5);(25,20;20,20)/(5,10;10,10);(20,20;20,25)/(10,10;10,5);(20,20;20,25)/(5,10;10,10)");
EXPECT_EQ (r.space_check (15).to_string (), "(21,20;20,20)/(9,10;10,10);(20,20;20,21)/(10,10;10,9)");
EXPECT_EQ (r.space_check (15, db::RegionCheckOptions (true)).to_string (), "(40,20;20,20)/(0,10;10,10);(20,20;20,50)/(10,10;10,0)");
EXPECT_EQ (r.space_check (15, db::RegionCheckOptions (false, db::Square)).to_string (), "(25,20;20,20)/(5,10;10,10);(20,20;20,25)/(10,10;10,5)");
EXPECT_EQ (r.space_check (15, db::RegionCheckOptions (false, db::Euclidian, 91)).to_string (), "(20,20;20,21)/(9,10;10,10);(20,20;20,21)/(10,10;10,9);(21,20;20,20)/(9,10;10,10);(21,20;20,20)/(10,10;10,9)");
EXPECT_EQ (r.space_check (15, db::RegionCheckOptions (false, db::Square, 91)).to_string (), "(20,20;20,25)/(5,10;10,10);(20,20;20,25)/(10,10;10,5);(25,20;20,20)/(5,10;10,10);(25,20;20,20)/(10,10;10,5)");
EXPECT_EQ (r.space_check (15).to_string (), "(20,20;20,21)/(10,10;10,9);(21,20;20,20)/(9,10;10,10)");
EXPECT_EQ (r.space_check (15, db::RegionCheckOptions (true)).to_string (), "(20,20;20,50)/(10,10;10,0);(40,20;20,20)/(0,10;10,10)");
EXPECT_EQ (r.space_check (15, db::RegionCheckOptions (false, db::Square)).to_string (), "(20,20;20,25)/(10,10;10,5);(25,20;20,20)/(5,10;10,10)");
r.clear ();
db::Point pts[] = {
@ -545,9 +545,9 @@ TEST(15b)
r.insert (db::Box (db::Point (400, 200), db::Point (500, 300)));
EXPECT_EQ (r.width_check (120, db::RegionCheckOptions (false, db::Projection)).to_string (), "(400,200;400,300)/(500,300;500,200)");
EXPECT_EQ (r.space_check (120, db::RegionCheckOptions (false, db::Projection)).to_string (), "(300,200;400,200)/(400,300;300,300);(300,300;300,500)/(200,500;200,300);(300,0;300,200)/(200,200;200,0)");
EXPECT_EQ (r.space_check (120, db::RegionCheckOptions (false, db::Projection)).to_string (), "(300,0;300,200)/(200,200;200,0);(300,300;300,500)/(200,500;200,300);(300,200;400,200)/(400,300;300,300)");
EXPECT_EQ (r.notch_check (120, db::RegionCheckOptions (false, db::Projection)).to_string (), "(300,200;400,200)/(400,300;300,300)");
EXPECT_EQ (r.isolated_check (120, db::RegionCheckOptions (false, db::Projection)).to_string (), "(200,500;200,300)/(300,300;300,500);(200,200;200,0)/(300,0;300,200)");
EXPECT_EQ (r.isolated_check (120, db::RegionCheckOptions (false, db::Projection)).to_string (), "(200,200;200,0)/(300,0;300,200);(200,500;200,300)/(300,300;300,500)");
}
TEST(15c)
@ -563,9 +563,9 @@ TEST(15c)
r.insert (db::Box (db::Point (400, 250), db::Point (500, 300)));
EXPECT_EQ (r.width_check (120, db::RegionCheckOptions (false, db::Projection)).to_string (), "(400,200;400,300)/(500,300;500,200)");
EXPECT_EQ (r.space_check (120, db::RegionCheckOptions (false, db::Projection)).to_string (), "(300,200;400,200)/(400,300;300,300);(300,300;300,500)/(200,500;200,300);(300,0;300,200)/(200,200;200,0)");
EXPECT_EQ (r.space_check (120, db::RegionCheckOptions (false, db::Projection)).to_string (), "(300,0;300,200)/(200,200;200,0);(300,300;300,500)/(200,500;200,300);(300,200;400,200)/(400,300;300,300)");
EXPECT_EQ (r.notch_check (120, db::RegionCheckOptions (false, db::Projection)).to_string (), "(300,200;400,200)/(400,300;300,300)");
EXPECT_EQ (r.isolated_check (120, db::RegionCheckOptions (false, db::Projection)).to_string (), "(200,500;200,300)/(300,300;300,500);(200,200;200,0)/(300,0;300,200)");
EXPECT_EQ (r.isolated_check (120, db::RegionCheckOptions (false, db::Projection)).to_string (), "(200,200;200,0)/(300,0;300,200);(200,500;200,300)/(300,300;300,500)");
}
TEST(15d)
@ -653,15 +653,15 @@ TEST(15g)
options.metrics = db::Projection;
options.opposite_filter = db::NoOppositeFilter;
EXPECT_EQ (r1.separation_check (r2, 40, options).to_string (),
"(200,200;200,100)/(210,100;210,200);(100,0;100,300)/(90,300;90,0)");
"(100,0;100,300)/(90,300;90,0);(200,200;200,100)/(210,100;210,200)");
options.opposite_filter = db::NotOpposite;
EXPECT_EQ (r1.separation_check (r2, 40, options).to_string (),
"(100,200;100,300)/(90,300;90,0);(100,0;100,100)/(90,300;90,0)");
"(100,0;100,100)/(90,300;90,0);(100,200;100,300)/(90,300;90,0)");
options.opposite_filter = db::OnlyOpposite;
EXPECT_EQ (r1.separation_check (r2, 40, options).to_string (),
"(100,100;100,200)/(90,300;90,0);(200,200;200,100)/(210,100;210,200)");
"(200,200;200,100)/(210,100;210,200);(100,100;100,200)/(90,300;90,0)");
}
TEST(15h)
@ -684,15 +684,15 @@ TEST(15h)
options.metrics = db::Projection;
options.opposite_filter = db::NoOppositeFilter;
EXPECT_EQ (r1.separation_check (r2, 40, options).to_string (),
"(100,0;100,100)/(90,100;90,0);(200,100;200,0)/(210,0;210,100);(100,200;100,300)/(90,300;90,200);(200,300;200,200)/(210,200;210,300)");
"(200,300;200,200)/(210,200;210,300);(100,200;100,300)/(90,300;90,200);(200,100;200,0)/(210,0;210,100);(100,0;100,100)/(90,100;90,0)");
options.opposite_filter = db::NotOpposite;
EXPECT_EQ (r1.separation_check (r2, 40, options).to_string (),
"(200,300;200,200)/(210,200;210,300);(100,200;100,300)/(90,300;90,200)");
"(100,200;100,300)/(90,300;90,200);(200,300;200,200)/(210,200;210,300)");
options.opposite_filter = db::OnlyOpposite;
EXPECT_EQ (r1.separation_check (r2, 40, options).to_string (),
"(200,100;200,0)/(210,0;210,100);(100,0;100,100)/(90,100;90,0)");
"(100,0;100,100)/(90,100;90,0);(200,100;200,0)/(210,0;210,100)");
}
TEST(15i)
@ -718,11 +718,11 @@ TEST(15i)
options.metrics = db::Projection;
options.rect_filter = db::OneSideAllowed;
EXPECT_EQ (r.separation_check (rl + rr, 40, options).to_string (), "(-90,-90;-90,90)/(-100,90;-100,-90);(90,90;90,-90)/(100,-90;100,90)");
EXPECT_EQ (r.separation_check (rl + rt, 40, options).to_string (), "(-90,90;90,90)/(90,100;-90,100);(-90,-90;-90,90)/(-100,90;-100,-90)");
EXPECT_EQ (r.separation_check (rl + rr, 40, options).to_string (), "(90,90;90,-90)/(100,-90;100,90);(-90,-90;-90,90)/(-100,90;-100,-90)");
EXPECT_EQ (r.separation_check (rl + rt, 40, options).to_string (), "(-90,-90;-90,90)/(-100,90;-100,-90);(-90,90;90,90)/(90,100;-90,100)");
EXPECT_EQ (r.separation_check (rl, 40, options).to_string (), "");
EXPECT_EQ (r.separation_check (rt, 40, options).to_string (), "");
EXPECT_EQ (r.separation_check (rt + rr + rb, 40, options).to_string (), "(90,-90;-90,-90)/(-90,-100;90,-100);(90,90;90,-90)/(100,-90;100,90);(-90,90;90,90)/(90,100;-90,100)");
EXPECT_EQ (r.separation_check (rt + rr + rb, 40, options).to_string (), "(-90,90;90,90)/(90,100;-90,100);(90,90;90,-90)/(100,-90;100,90);(90,-90;-90,-90)/(-90,-100;90,-100)");
options.rect_filter = db::TwoSidesAllowed;
@ -730,28 +730,28 @@ TEST(15i)
EXPECT_EQ (r.separation_check (rl + rt, 40, options).to_string (), "");
EXPECT_EQ (r.separation_check (rl, 40, options).to_string (), "(-90,-90;-90,90)/(-100,90;-100,-90)");
EXPECT_EQ (r.separation_check (rt, 40, options).to_string (), "(-90,90;90,90)/(90,100;-90,100)");
EXPECT_EQ (r.separation_check (rt + rr + rb, 40, options).to_string (), "(90,-90;-90,-90)/(-90,-100;90,-100);(90,90;90,-90)/(100,-90;100,90);(-90,90;90,90)/(90,100;-90,100)");
EXPECT_EQ (r.separation_check (rt + rr + rb, 40, options).to_string (), "(-90,90;90,90)/(90,100;-90,100);(90,90;90,-90)/(100,-90;100,90);(90,-90;-90,-90)/(-90,-100;90,-100)");
options.rect_filter = db::TwoOppositeSidesAllowed;
EXPECT_EQ (r.separation_check (rl + rr, 40, options).to_string (), "");
EXPECT_EQ (r.separation_check (rl + rt, 40, options).to_string (), "(-90,90;90,90)/(90,100;-90,100);(-90,-90;-90,90)/(-100,90;-100,-90)");
EXPECT_EQ (r.separation_check (rl + rt, 40, options).to_string (), "(-90,-90;-90,90)/(-100,90;-100,-90);(-90,90;90,90)/(90,100;-90,100)");
EXPECT_EQ (r.separation_check (rl, 40, options).to_string (), "(-90,-90;-90,90)/(-100,90;-100,-90)");
EXPECT_EQ (r.separation_check (rt, 40, options).to_string (), "(-90,90;90,90)/(90,100;-90,100)");
EXPECT_EQ (r.separation_check (rt + rr + rb, 40, options).to_string (), "(90,-90;-90,-90)/(-90,-100;90,-100);(90,90;90,-90)/(100,-90;100,90);(-90,90;90,90)/(90,100;-90,100)");
EXPECT_EQ (r.separation_check (rt + rr + rb, 40, options).to_string (), "(-90,90;90,90)/(90,100;-90,100);(90,90;90,-90)/(100,-90;100,90);(90,-90;-90,-90)/(-90,-100;90,-100)");
options.rect_filter = db::TwoConnectedSidesAllowed;
EXPECT_EQ (r.separation_check (rl + rr, 40, options).to_string (), "(-90,-90;-90,90)/(-100,90;-100,-90);(90,90;90,-90)/(100,-90;100,90)");
EXPECT_EQ (r.separation_check (rl + rr, 40, options).to_string (), "(90,90;90,-90)/(100,-90;100,90);(-90,-90;-90,90)/(-100,90;-100,-90)");
EXPECT_EQ (r.separation_check (rl + rt, 40, options).to_string (), "");
EXPECT_EQ (r.separation_check (rl, 40, options).to_string (), "(-90,-90;-90,90)/(-100,90;-100,-90)");
EXPECT_EQ (r.separation_check (rt, 40, options).to_string (), "(-90,90;90,90)/(90,100;-90,100)");
EXPECT_EQ (r.separation_check (rt + rr + rb, 40, options).to_string (), "(90,-90;-90,-90)/(-90,-100;90,-100);(90,90;90,-90)/(100,-90;100,90);(-90,90;90,90)/(90,100;-90,100)");
EXPECT_EQ (r.separation_check (rt + rr + rb, 40, options).to_string (), "(-90,90;90,90)/(90,100;-90,100);(90,90;90,-90)/(100,-90;100,90);(90,-90;-90,-90)/(-90,-100;90,-100)");
options.rect_filter = db::ThreeSidesAllowed;
EXPECT_EQ (r.separation_check (rl + rr, 40, options).to_string (), "(-90,-90;-90,90)/(-100,90;-100,-90);(90,90;90,-90)/(100,-90;100,90)");
EXPECT_EQ (r.separation_check (rl + rt, 40, options).to_string (), "(-90,90;90,90)/(90,100;-90,100);(-90,-90;-90,90)/(-100,90;-100,-90)");
EXPECT_EQ (r.separation_check (rl + rr, 40, options).to_string (), "(90,90;90,-90)/(100,-90;100,90);(-90,-90;-90,90)/(-100,90;-100,-90)");
EXPECT_EQ (r.separation_check (rl + rt, 40, options).to_string (), "(-90,-90;-90,90)/(-100,90;-100,-90);(-90,90;90,90)/(90,100;-90,100)");
EXPECT_EQ (r.separation_check (rl, 40, options).to_string (), "(-90,-90;-90,90)/(-100,90;-100,-90)");
EXPECT_EQ (r.separation_check (rt, 40, options).to_string (), "(-90,90;90,90)/(90,100;-90,100)");
EXPECT_EQ (r.separation_check (rt + rr + rb, 40, options).to_string (), "");
@ -762,16 +762,16 @@ TEST(15i)
EXPECT_EQ (r.separation_check (rl + rt, 40, options).to_string (), "");
EXPECT_EQ (r.separation_check (rl, 40, options).to_string (), "");
EXPECT_EQ (r.separation_check (rt, 40, options).to_string (), "");
EXPECT_EQ (r.separation_check (rt + rr + rb, 40, options).to_string (), "(90,-90;-90,-90)/(-90,-100;90,-100);(90,90;90,-90)/(100,-90;100,90);(-90,90;90,90)/(90,100;-90,100)");
EXPECT_EQ (r.separation_check (rt + rr + rb, 40, options).to_string (), "(-90,90;90,90)/(90,100;-90,100);(90,90;90,-90)/(100,-90;100,90);(90,-90;-90,-90)/(-90,-100;90,-100)");
options.rect_filter = db::RectFilter (0x31); // one and two connected sides allowed
EXPECT_EQ (r.separation_check (rl + rr, 40, options).to_string (), "(-90,-90;-90,90)/(-100,90;-100,-90);(90,90;90,-90)/(100,-90;100,90)");
EXPECT_EQ (r.separation_check (rl + rr, 40, options).to_string (), "(90,90;90,-90)/(100,-90;100,90);(-90,-90;-90,90)/(-100,90;-100,-90)");
EXPECT_EQ (r.separation_check (rl + rt, 40, options).to_string (), "");
EXPECT_EQ (r.separation_check (rr + rt, 40, options).to_string (), "");
EXPECT_EQ (r.separation_check (rl, 40, options).to_string (), "");
EXPECT_EQ (r.separation_check (rt, 40, options).to_string (), "");
EXPECT_EQ (r.separation_check (rt + rr + rb, 40, options).to_string (), "(90,-90;-90,-90)/(-90,-100;90,-100);(90,90;90,-90)/(100,-90;100,90);(-90,90;90,90)/(90,100;-90,100)");
EXPECT_EQ (r.separation_check (rt + rr + rb, 40, options).to_string (), "(-90,90;90,90)/(90,100;-90,100);(90,90;90,-90)/(100,-90;100,90);(90,-90;-90,-90)/(-90,-100;90,-100)");
}
TEST(16)
@ -784,22 +784,22 @@ TEST(16)
EXPECT_EQ (a.inside_check (b, 15).to_string (), "(10,20;10,30)/(0,9;0,41)");
EXPECT_EQ (a.inside_check (b, 15, db::RegionCheckOptions (true)).to_string (), "(10,20;10,30)/(0,0;0,100)");
EXPECT_EQ (a.inside_check (b, 15, db::RegionCheckOptions (false, db::Euclidian, 91)).to_string (), "(15,20;10,20)/(0,9;0,20);(10,30;15,30)/(0,30;0,41);(10,20;10,30)/(0,9;0,41)");
EXPECT_EQ (a.inside_check (b, 15, db::RegionCheckOptions (false, db::Euclidian, 91)).to_string (), "(10,20;10,30)/(0,9;0,41);(10,30;15,30)/(0,30;0,41);(15,20;10,20)/(0,9;0,20)");
EXPECT_EQ (b.enclosing_check (a, 15).to_string (), "(0,9;0,41)/(10,20;10,30)");
EXPECT_EQ (b.enclosing_check (a, 15, db::RegionCheckOptions (true)).to_string (), "(0,0;0,100)/(10,20;10,30)");
EXPECT_EQ (b.enclosing_check (a, 15, db::RegionCheckOptions (false, db::Euclidian, 91)).to_string (), "(0,9;0,20)/(15,20;10,20);(0,30;0,41)/(10,30;15,30);(0,9;0,41)/(10,20;10,30)");
EXPECT_EQ (b.enclosing_check (a, 15, db::RegionCheckOptions (false, db::Euclidian, 91)).to_string (), "(0,9;0,41)/(10,20;10,30);(0,30;0,41)/(10,30;15,30);(0,9;0,20)/(15,20;10,20)");
b.clear ();
b.insert (db::Box (db::Point (30, 0), db::Point (100, 100)));
EXPECT_EQ (b.separation_check (a, 15).to_string (), "(30,9;30,41)/(20,30;20,20)");
EXPECT_EQ (b.separation_check (a, 15, db::RegionCheckOptions (true)).to_string (), "(30,0;30,100)/(20,30;20,20)");
EXPECT_EQ (b.separation_check (a, 15, db::RegionCheckOptions (false, db::Euclidian, 91)).to_string (), "(30,9;30,20)/(20,20;15,20);(30,9;30,41)/(20,30;20,20);(30,30;30,41)/(15,30;20,30)");
EXPECT_EQ (b.separation_check (a, 15, db::RegionCheckOptions (false, db::Euclidian, 91)).to_string (), "(30,30;30,41)/(15,30;20,30);(30,9;30,41)/(20,30;20,20);(30,9;30,20)/(20,20;15,20)");
b.clear ();
b.insert (db::Box (db::Point (15, 0), db::Point (100, 100)));
EXPECT_EQ (b.overlap_check (a, 15).to_string (), "(15,6;15,44)/(20,30;20,20)");
EXPECT_EQ (b.overlap_check (a, 15, db::RegionCheckOptions (true)).to_string (), "(15,0;15,100)/(20,30;20,20)");
EXPECT_EQ (b.overlap_check (a, 15, db::RegionCheckOptions (false, db::Euclidian, 91)).to_string (), "(15,20;15,35)/(20,20;15,20);(15,6;15,44)/(20,30;20,20);(15,15;15,30)/(15,30;20,30)");
EXPECT_EQ (b.overlap_check (a, 15, db::RegionCheckOptions (false, db::Euclidian, 91)).to_string (), "(15,15;15,30)/(15,30;20,30);(15,6;15,44)/(20,30;20,20);(15,20;15,35)/(20,20;15,20)");
}
TEST(17)
@ -1242,7 +1242,7 @@ TEST(20)
{
db::Region r1 (db::RecursiveShapeIterator (ly, ly.cell (top), l2));
EXPECT_EQ (r1.has_valid_polygons (), false);
EXPECT_EQ (r1.space_check (30).to_string (), "(40,40;40,10)/(60,10;60,20);(92,40;80,40)/(60,20;70,20);(80,40;80,48)/(70,20;70,12)");
EXPECT_EQ (r1.space_check (30).to_string (), "(40,40;40,10)/(60,10;60,20);(80,40;80,48)/(70,20;70,12);(92,40;80,40)/(60,20;70,20)");
EXPECT_EQ (r1.space_check (2).to_string (), "");
}
@ -1251,7 +1251,7 @@ TEST(20)
EXPECT_EQ (r1.has_valid_polygons (), false);
db::Region r2 (db::RecursiveShapeIterator (ly, ly.cell (top), l2));
EXPECT_EQ (r2.has_valid_polygons (), false);
EXPECT_EQ (r1.separation_check (r2, 20).to_string (), "(50,0;50,30)/(40,40;40,10);(50,40;50,57)/(40,40;40,23);(63,30;80,30)/(97,40;80,40);(80,70;80,40)/(80,40;80,70)");
EXPECT_EQ (r1.separation_check (r2, 20).to_string (), "(50,0;50,30)/(40,40;40,10);(63,30;80,30)/(97,40;80,40);(80,70;80,40)/(80,40;80,70);(50,40;50,57)/(40,40;40,23)");
}
{

View File

@ -108,6 +108,16 @@ class DRCOpNode
# of two expressions. The NOT operation is defined for polygons,
# edges and polygons subtracted from edges (first argument edge,
# second argument polygon).
#
# CAUTION: be careful not to take secondary input for the
# first argument. This will not render the desired results.
# Remember that the "drc" function will walk over all primary
# shapes and present single primaries to the NOT operation together
# the the secondaries of that single shape. So when you use
# secondary shapes as the first argument, they will not see all
# all the primaries required to compute the correct result.
# That's also why a XOR operation cannot be provided in the
# context of a generic DRC function.
#
# The following example will produce edge markers where the
# width of is less then 0.3 micron but not inside polygons on
@ -117,16 +127,7 @@ class DRCOpNode
# out = in.drc((width < 0.3).edges - secondary(waive))
# @/code
# %DRC%
# @name ^
# @brief Boolean XOR between the results of two expressions
# @synopsis expression - expression
#
# The ^ operator will compute the XOR (symmetric difference) between the results
# of two expressions. The XOR operation is defined for polygons and edges.
# Both expressions must be of the same type.
%w(& - ^ | +).each do |f|
%w(& - | +).each do |f|
eval <<"CODE"
def #{f}(other)
@engine._context("#{f}") do
@ -976,10 +977,10 @@ class DRCOpNodeJoin < DRCOpNode
attr_accessor :children
def initialize(engine, op, a, b)
def initialize(engine, cc)
super(engine)
self.children = [a, b]
self.description = "Join #{op.to_s}"
self.children = cc
self.description = "Join"
end
def dump(indent)
@ -988,10 +989,10 @@ class DRCOpNodeJoin < DRCOpNode
def do_create_node(cache)
nodes = self.children.collect { |c| c.create_node(cache) }
if nodes.collect(:result_type).sort.uniq.size > 1
if nodes.collect { |n| n.result_type.to_i }.sort.uniq.size > 1
raise("All inputs to the + operator need to have the same type")
end
RBA::CompoundRegionOperationNode::new_join(*nodes)
RBA::CompoundRegionOperationNode::new_join(nodes)
end
end

View File

@ -98,3 +98,13 @@ TEST(3d)
{
run_test (_this, "3", true);
}
TEST(4)
{
run_test (_this, "4", false);
}
TEST(4d)
{
run_test (_this, "4", true);
}

43
testdata/drc/drcGenericTests_4.drc vendored Normal file
View File

@ -0,0 +1,43 @@
source $drc_test_source
target $drc_test_target
if $drc_test_deep
deep
threads(0) # easier to debug
end
l1 = input(1, 0)
l2 = input(2, 0)
l3 = input(3, 0)
l1.output(1, 0)
l2.output(2, 0)
l3.output(3, 0)
# booleans
l1.drc(primary + l2 + l3).output(100, 0)
l1.drc(secondary(l2) + primary + l3).output(101, 0)
l1.drc(primary + secondary(l2) + l3).output(102, 0)
l1.drc(primary - l2).output(110, 0)
# This will not work as the l2 shapes (being intruders)
# will not see all all primary shapes to give the
# correct result:
# l1.drc(secondary(l2) - primary).output(111, 0)
l1.drc(primary - secondary(l2)).output(112, 0)
l1.drc(primary & l2).output(120, 0)
l1.drc(secondary(l2) & primary).output(121, 0)
l1.drc(primary & secondary(l2)).output(122, 0)
l1.drc(primary | l2).output(130, 0)
l1.drc(secondary(l2) | primary).output(131, 0)
l1.drc(primary | secondary(l2)).output(132, 0)
# XOR will not work as the l2 shapes (being intruders)
# will not see all all primary shapes to give the
# correct result:
# l1.drc(primary ^ l2).output(140, 0)
# l1.drc(secondary(l2) ^ primary).output(141, 0)
# l1.drc(primary ^ secondary(l2)).output(142, 0)

BIN
testdata/drc/drcGenericTests_4.gds vendored Normal file

Binary file not shown.

BIN
testdata/drc/drcGenericTests_au4.gds vendored Normal file

Binary file not shown.

BIN
testdata/drc/drcGenericTests_au4d.gds vendored Normal file

Binary file not shown.