Skip to content

Commit 8a01352

Browse files
Merge pull request #1992 from KLayout/feature/issue-1989
Feature/issue 1989
2 parents e1c26fb + fb9e0c4 commit 8a01352

36 files changed

+1245
-126
lines changed

src/db/db/dbAsIfFlatEdgePairs.cc

Lines changed: 26 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -226,6 +226,16 @@ AsIfFlatEdgePairs::processed_to_edges (const EdgePairToEdgeProcessorBase &filter
226226
return edges.release ();
227227
}
228228

229+
static void
230+
insert_ep (FlatEdgePairs *dest, const db::EdgePair &ep, db::properties_id_type prop_id)
231+
{
232+
if (prop_id != 0) {
233+
dest->insert (db::EdgePairWithProperties (ep, prop_id));
234+
} else {
235+
dest->insert (ep);
236+
}
237+
}
238+
229239
EdgePairsDelegate *
230240
AsIfFlatEdgePairs::filtered (const EdgePairFilterBase &filter) const
231241
{
@@ -234,18 +244,28 @@ AsIfFlatEdgePairs::filtered (const EdgePairFilterBase &filter) const
234244

235245
for (EdgePairsIterator p (begin ()); ! p.at_end (); ++p) {
236246
if (filter.selected (*p)) {
237-
db::properties_id_type prop_id = pm (p.prop_id ());
238-
if (prop_id != 0) {
239-
new_edge_pairs->insert (db::EdgePairWithProperties (*p, prop_id));
240-
} else {
241-
new_edge_pairs->insert (*p);
242-
}
247+
insert_ep (new_edge_pairs.get (), *p, pm (p.prop_id ()));
243248
}
244249
}
245250

246251
return new_edge_pairs.release ();
247252
}
248253

254+
std::pair <EdgePairsDelegate *, EdgePairsDelegate *>
255+
AsIfFlatEdgePairs::filtered_pair (const EdgePairFilterBase &filter) const
256+
{
257+
std::unique_ptr<FlatEdgePairs> new_edge_pairs_true (new FlatEdgePairs ());
258+
std::unique_ptr<FlatEdgePairs> new_edge_pairs_false (new FlatEdgePairs ());
259+
db::PropertyMapper pm (new_edge_pairs_true->properties_repository (), properties_repository ());
260+
261+
for (EdgePairsIterator p (begin ()); ! p.at_end (); ++p) {
262+
FlatEdgePairs *dest = filter.selected (*p) ? new_edge_pairs_true.get () : new_edge_pairs_false.get ();
263+
insert_ep (dest, *p, pm (p.prop_id ()));
264+
}
265+
266+
return std::make_pair (new_edge_pairs_true.release (), new_edge_pairs_false.release ());
267+
}
268+
249269
RegionDelegate *
250270
AsIfFlatEdgePairs::pull_interacting (const Region &other) const
251271
{

src/db/db/dbAsIfFlatEdgePairs.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ class DB_PUBLIC AsIfFlatEdgePairs
5353
}
5454

5555
virtual EdgePairsDelegate *filtered (const EdgePairFilterBase &) const;
56+
virtual std::pair<EdgePairsDelegate *, EdgePairsDelegate *> filtered_pair (const EdgePairFilterBase &filter) const;
5657

5758
virtual EdgePairsDelegate *process_in_place (const EdgePairProcessorBase &proc)
5859
{

src/db/db/dbAsIfFlatEdges.cc

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -717,6 +717,23 @@ AsIfFlatEdges::filtered (const EdgeFilterBase &filter) const
717717
return new_region.release ();
718718
}
719719

720+
std::pair<EdgesDelegate *, EdgesDelegate *>
721+
AsIfFlatEdges::filtered_pair (const EdgeFilterBase &filter) const
722+
{
723+
std::unique_ptr<FlatEdges> new_region_true (new FlatEdges ());
724+
std::unique_ptr<FlatEdges> new_region_false (new FlatEdges ());
725+
726+
for (EdgesIterator p (begin_merged ()); ! p.at_end (); ++p) {
727+
if (filter.selected (*p)) {
728+
new_region_true->insert (*p);
729+
} else {
730+
new_region_false->insert (*p);
731+
}
732+
}
733+
734+
return std::make_pair (new_region_true.release (), new_region_false.release ());
735+
}
736+
720737
EdgePairsDelegate *
721738
AsIfFlatEdges::run_check (db::edge_relation_type rel, const Edges *other, db::Coord d, const db::EdgesCheckOptions &options) const
722739
{

src/db/db/dbAsIfFlatEdges.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,7 @@ class DB_PUBLIC AsIfFlatEdges
101101
}
102102

103103
virtual EdgesDelegate *filtered (const EdgeFilterBase &) const;
104+
virtual std::pair<EdgesDelegate *, EdgesDelegate *> filtered_pair (const EdgeFilterBase &filter) const;
104105

105106
virtual EdgesDelegate *merged_in_place ()
106107
{

src/db/db/dbAsIfFlatRegion.cc

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -414,6 +414,25 @@ AsIfFlatRegion::filtered (const PolygonFilterBase &filter) const
414414
return new_region.release ();
415415
}
416416

417+
std::pair<RegionDelegate *, RegionDelegate *>
418+
AsIfFlatRegion::filtered_pair (const PolygonFilterBase &filter) const
419+
{
420+
std::unique_ptr<FlatRegion> new_region_true (new FlatRegion ());
421+
std::unique_ptr<FlatRegion> new_region_false (new FlatRegion ());
422+
423+
for (RegionIterator p (begin_merged ()); ! p.at_end (); ++p) {
424+
if (filter.selected (*p)) {
425+
new_region_true->insert (*p);
426+
} else {
427+
new_region_false->insert (*p);
428+
}
429+
}
430+
431+
new_region_true->set_is_merged (true);
432+
new_region_false->set_is_merged (true);
433+
return std::make_pair (new_region_true.release (), new_region_false.release ());
434+
}
435+
417436
RegionDelegate *
418437
AsIfFlatRegion::processed (const PolygonProcessorBase &filter) const
419438
{

src/db/db/dbAsIfFlatRegion.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,7 @@ class DB_PUBLIC AsIfFlatRegion
101101
}
102102

103103
virtual RegionDelegate *filtered (const PolygonFilterBase &filter) const;
104+
virtual std::pair<RegionDelegate *, RegionDelegate *> filtered_pair (const PolygonFilterBase &filter) const;
104105

105106
virtual RegionDelegate *merged_in_place ()
106107
{

src/db/db/dbAsIfFlatTexts.cc

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -164,6 +164,23 @@ AsIfFlatTexts::filtered (const TextFilterBase &filter) const
164164
return new_texts.release ();
165165
}
166166

167+
std::pair<TextsDelegate *, TextsDelegate *>
168+
AsIfFlatTexts::filtered_pair (const TextFilterBase &filter) const
169+
{
170+
std::unique_ptr<FlatTexts> new_texts_true (new FlatTexts ());
171+
std::unique_ptr<FlatTexts> new_texts_false (new FlatTexts ());
172+
173+
for (TextsIterator p (begin ()); ! p.at_end (); ++p) {
174+
if (filter.selected (*p)) {
175+
new_texts_true->insert (*p);
176+
} else {
177+
new_texts_false->insert (*p);
178+
}
179+
}
180+
181+
return std::make_pair (new_texts_true.release (), new_texts_false.release ());
182+
}
183+
167184
TextsDelegate *
168185
AsIfFlatTexts::processed (const TextProcessorBase &filter) const
169186
{

src/db/db/dbAsIfFlatTexts.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ class DB_PUBLIC AsIfFlatTexts
5454
}
5555

5656
virtual TextsDelegate *filtered (const TextFilterBase &) const;
57+
virtual std::pair<TextsDelegate *, TextsDelegate *> filtered_pair (const TextFilterBase &filter) const;
5758

5859
virtual TextsDelegate *process_in_place (const TextProcessorBase &proc)
5960
{

src/db/db/dbDeepEdgePairs.cc

Lines changed: 50 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -375,18 +375,24 @@ EdgePairsDelegate *
375375
DeepEdgePairs::filter_in_place (const EdgePairFilterBase &filter)
376376
{
377377
// TODO: implement to be really in-place
378-
*this = *apply_filter (filter);
378+
*this = *apply_filter (filter, true, false).first;
379379
return this;
380380
}
381381

382382
EdgePairsDelegate *
383383
DeepEdgePairs::filtered (const EdgePairFilterBase &filter) const
384384
{
385-
return apply_filter (filter);
385+
return apply_filter (filter, true, false).first;
386386
}
387387

388-
DeepEdgePairs *
389-
DeepEdgePairs::apply_filter (const EdgePairFilterBase &filter) const
388+
std::pair<EdgePairsDelegate *, EdgePairsDelegate *>
389+
DeepEdgePairs::filtered_pair (const EdgePairFilterBase &filter) const
390+
{
391+
return apply_filter (filter, true, true);
392+
}
393+
394+
std::pair<DeepEdgePairs *, DeepEdgePairs *>
395+
DeepEdgePairs::apply_filter (const EdgePairFilterBase &filter, bool with_true, bool with_false) const
390396
{
391397
const db::DeepLayer &edge_pairs = deep_layer ();
392398
db::Layout &layout = const_cast<db::Layout &> (edge_pairs.layout ());
@@ -404,9 +410,10 @@ DeepEdgePairs::apply_filter (const EdgePairFilterBase &filter) const
404410

405411
}
406412

407-
std::map<db::cell_index_type, std::map<db::ICplxTrans, db::Shapes> > to_commit;
413+
std::map<db::cell_index_type, std::map<db::ICplxTrans, db::Shapes> > to_commit_true, to_commit_false;
408414

409-
std::unique_ptr<db::DeepEdgePairs> res (new db::DeepEdgePairs (edge_pairs.derived ()));
415+
std::unique_ptr<db::DeepEdgePairs> res_true (with_true ? new db::DeepEdgePairs (edge_pairs.derived ()) : 0);
416+
std::unique_ptr<db::DeepEdgePairs> res_false (with_false ? new db::DeepEdgePairs (edge_pairs.derived ()) : 0);
410417
for (db::Layout::iterator c = layout.begin (); c != layout.end (); ++c) {
411418

412419
const db::Shapes &s = c->shapes (edge_pairs.layer ());
@@ -416,42 +423,70 @@ DeepEdgePairs::apply_filter (const EdgePairFilterBase &filter) const
416423
const std::set<db::ICplxTrans> &vv = vars->variants (c->cell_index ());
417424
for (auto v = vv.begin (); v != vv.end (); ++v) {
418425

419-
db::Shapes *st;
426+
db::Shapes *st_true = 0, *st_false = 0;
420427
if (vv.size () == 1) {
421-
st = & c->shapes (res->deep_layer ().layer ());
428+
if (with_true) {
429+
st_true = & c->shapes (res_true->deep_layer ().layer ());
430+
}
431+
if (with_false) {
432+
st_false = & c->shapes (res_false->deep_layer ().layer ());
433+
}
422434
} else {
423-
st = & to_commit [c->cell_index ()] [*v];
435+
if (with_true) {
436+
st_true = & to_commit_true [c->cell_index ()] [*v];
437+
}
438+
if (with_false) {
439+
st_false = & to_commit_false [c->cell_index ()] [*v];
440+
}
424441
}
425442

426443
const db::ICplxTrans &tr = *v;
427444

428445
for (db::Shapes::shape_iterator si = s.begin (db::ShapeIterator::EdgePairs); ! si.at_end (); ++si) {
429446
if (filter.selected (si->edge_pair ().transformed (tr))) {
430-
st->insert (*si);
447+
if (st_true) {
448+
st_true->insert (*si);
449+
}
450+
} else {
451+
if (st_false) {
452+
st_false->insert (*si);
453+
}
431454
}
432455
}
433456

434457
}
435458

436459
} else {
437460

438-
db::Shapes &st = c->shapes (res->deep_layer ().layer ());
461+
db::Shapes *st_true = with_true ? &c->shapes (res_true->deep_layer ().layer ()) : 0;
462+
db::Shapes *st_false = with_false ? &c->shapes (res_false->deep_layer ().layer ()) : 0;
439463

440464
for (db::Shapes::shape_iterator si = s.begin (db::ShapeIterator::EdgePairs); ! si.at_end (); ++si) {
441465
if (filter.selected (si->edge_pair ())) {
442-
st.insert (*si);
466+
if (with_true) {
467+
st_true->insert (*si);
468+
}
469+
} else {
470+
if (with_false) {
471+
st_false->insert (*si);
472+
}
443473
}
444474
}
445475

446476
}
447477

448478
}
449479

450-
if (! to_commit.empty () && vars.get ()) {
451-
vars->commit_shapes (res->deep_layer ().layer (), to_commit);
480+
if (! to_commit_true.empty () && vars.get ()) {
481+
tl_assert (res_true.get () != 0);
482+
vars->commit_shapes (res_true->deep_layer ().layer (), to_commit_true);
483+
}
484+
if (! to_commit_false.empty () && vars.get ()) {
485+
tl_assert (res_false.get () != 0);
486+
vars->commit_shapes (res_false->deep_layer ().layer (), to_commit_false);
452487
}
453488

454-
return res.release ();
489+
return std::make_pair (res_true.release (), res_false.release ());
455490
}
456491

457492
EdgePairsDelegate *DeepEdgePairs::process_in_place (const EdgePairProcessorBase &filter)

src/db/db/dbDeepEdgePairs.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,7 @@ class DB_PUBLIC DeepEdgePairs
7878

7979
virtual EdgePairsDelegate *filter_in_place (const EdgePairFilterBase &filter);
8080
virtual EdgePairsDelegate *filtered (const EdgePairFilterBase &) const;
81+
virtual std::pair<EdgePairsDelegate *, EdgePairsDelegate *> filtered_pair (const EdgePairFilterBase &filter) const;
8182
virtual EdgePairsDelegate *process_in_place (const EdgePairProcessorBase &);
8283
virtual EdgePairsDelegate *processed (const EdgePairProcessorBase &) const;
8384
virtual RegionDelegate *processed_to_polygons (const EdgePairToPolygonProcessorBase &filter) const;
@@ -117,7 +118,7 @@ class DB_PUBLIC DeepEdgePairs
117118

118119
void init ();
119120
EdgesDelegate *generic_edges (bool first, bool second) const;
120-
DeepEdgePairs *apply_filter (const EdgePairFilterBase &filter) const;
121+
std::pair<DeepEdgePairs *, DeepEdgePairs *> apply_filter (const EdgePairFilterBase &filter, bool with_true, bool with_false) const;
121122
};
122123

123124
}

0 commit comments

Comments
 (0)