Deploying solution for XOR tool. Needs testing.

This commit is contained in:
Matthias Koefferlein 2024-03-24 23:03:08 +01:00
parent b4c7176c52
commit 254f598a08
1 changed files with 91 additions and 93 deletions

View File

@ -772,6 +772,9 @@ XORWorker::do_perform_deep (const XORTask *xor_task)
db::RecursiveShapeIterator s_a (mp_job->cva ()->layout (), mp_job->cva ()->layout ().cell (mp_job->cva ().cell_index ()), la, xor_task->region_a ());
db::RecursiveShapeIterator s_b (mp_job->cvb ()->layout (), mp_job->cvb ()->layout ().cell (mp_job->cvb ().cell_index ()), lb, xor_task->region_b ());
s_a.set_for_merged_input (true);
s_b.set_for_merged_input (true);
db::Region ra (s_a, dss, db::ICplxTrans (mp_job->cva ()->layout ().dbu () / mp_job->dbu ()));
db::Region rb (s_b, dss, db::ICplxTrans (mp_job->cvb ()->layout ().dbu () / mp_job->dbu ()));
@ -800,6 +803,8 @@ XORWorker::do_perform_deep (const XORTask *xor_task)
dbu_scale = db::ICplxTrans (mp_job->cvb ()->layout ().dbu () / mp_job->dbu ());
}
s.set_for_merged_input (true);
rr = db::Region (s, dss, dbu_scale);
}
@ -867,119 +872,110 @@ XORWorker::do_perform_tiled (const XORTask *xor_task)
if ((!la.empty () && !lb.empty ()) || mp_job->el_handling () == XORJob::EL_process) {
if (! mp_job->has_tiles ()) {
tl::SelfTimer timer (tl::verbosity () >= 31, "Boolean part");
size_t n;
tl::SelfTimer timer (tl::verbosity () >= 21, "Boolean part");
if (! merge_before_bool ()) {
if (! merge_before_bool ()) {
#
// Straightforward implementation
sp.boolean (mp_job->cva ()->layout (), mp_job->cva ()->layout ().cell (mp_job->cva ().cell_index ()), la,
mp_job->cvb ()->layout (), mp_job->cvb ()->layout ().cell (mp_job->cvb ().cell_index ()), lb,
xor_results_cell.shapes (0), mp_job->op (), true, false, true);
// Straightforward implementation
sp.clear ();
db::CplxTrans dbu_scale_a (mp_job->cva ()->layout ().dbu () / xor_results.dbu ());
db::CplxTrans dbu_scale_b (mp_job->cvb ()->layout ().dbu () / xor_results.dbu ());
n = 0;
db::RecursiveShapeIterator s_a;
if (mp_job->has_tiles ()) {
s_a = db::RecursiveShapeIterator (mp_job->cva ()->layout (), *mp_job->cva ().cell (), la, xor_task->region_a ());
} else {
// This implementation is faster when a lot of overlapping shapes are involved
db::Layout merge_helper;
db::Cell &merge_helper_cell = merge_helper.cell (merge_helper.add_cell ());
merge_helper.insert_layer (0);
merge_helper.insert_layer (1);
if (!la.empty ()) {
sp.merge (mp_job->cva ()->layout (), mp_job->cva ()->layout ().cell (mp_job->cva ().cell_index ()), la,
merge_helper_cell.shapes (0), true, 0, false, true);
}
if (!lb.empty ()) {
sp.merge (mp_job->cvb ()->layout (), mp_job->cvb ()->layout ().cell (mp_job->cvb ().cell_index ()), lb,
merge_helper_cell.shapes (1), true, 0, false, true);
}
sp.boolean (merge_helper, merge_helper_cell, 0,
merge_helper, merge_helper_cell, 1,
xor_results_cell.shapes (0), mp_job->op (), true, false, true);
s_a = db::RecursiveShapeIterator (mp_job->cva ()->layout (), *mp_job->cva ().cell (), la);
}
s_a.set_for_merged_input (true);
for ( ; ! s_a.at_end (); ++s_a, ++n) {
sp.insert (s_a.shape (), dbu_scale_a * s_a.trans (), n * 2);
}
n = 0;
db::RecursiveShapeIterator s_b;
if (mp_job->has_tiles ()) {
s_b = db::RecursiveShapeIterator (mp_job->cvb ()->layout (), *mp_job->cvb ().cell (), lb, xor_task->region_b ());
} else {
s_b = db::RecursiveShapeIterator (mp_job->cvb ()->layout (), *mp_job->cvb ().cell (), lb);
}
s_b.set_for_merged_input (true);
for (; ! s_b.at_end (); ++s_b, ++n) {
sp.insert (s_b.shape (), dbu_scale_b * s_b.trans (), n * 2 + 1);
}
db::BooleanOp bool_op (mp_job->op ());
db::ShapeGenerator sg (xor_results_cell.shapes (0), true /*clear shapes*/);
db::PolygonGenerator out (sg, false /*don't resolve holes*/, false /*no min. coherence*/);
sp.process (out, bool_op);
} else {
tl::SelfTimer timer (tl::verbosity () >= 31, "Boolean part");
size_t n;
// This implementation is faster when a lot of overlapping shapes are involved
db::Layout merge_helper;
merge_helper.dbu (mp_job->dbu ());
db::Cell &merge_helper_cell = merge_helper.cell (merge_helper.add_cell ());
merge_helper.insert_layer (0);
merge_helper.insert_layer (1);
if (! merge_before_bool ()) {
// This implementation is faster when a lot of overlapping shapes are involved
if (!la.empty ()) {
// Straightforward implementation
sp.clear ();
db::CplxTrans dbu_scale_a (mp_job->cva ()->layout ().dbu () / xor_results.dbu ());
db::CplxTrans dbu_scale_b (mp_job->cvb ()->layout ().dbu () / xor_results.dbu ());
db::CplxTrans dbu_scale (mp_job->cva ()->layout ().dbu () / xor_results.dbu ());
n = 0;
for (db::RecursiveShapeIterator s (mp_job->cva ()->layout (), *mp_job->cva ().cell (), la, xor_task->region_a ()); ! s.at_end (); ++s, ++n) {
sp.insert (s.shape (), dbu_scale_a * s.trans (), n * 2);
db::RecursiveShapeIterator s;
if (mp_job->has_tiles ()) {
s = db::RecursiveShapeIterator (mp_job->cva ()->layout (), *mp_job->cva ().cell (), la, xor_task->region_a ());
} else {
s = db::RecursiveShapeIterator (mp_job->cva ()->layout (), *mp_job->cva ().cell (), la);
}
s.set_for_merged_input (true);
for ( ; ! s.at_end (); ++s, ++n) {
sp.insert (s.shape (), dbu_scale * s.trans (), n);
}
n = 0;
for (db::RecursiveShapeIterator s (mp_job->cvb ()->layout (), *mp_job->cvb ().cell (), lb, xor_task->region_b ()); ! s.at_end (); ++s, ++n) {
sp.insert (s.shape (), dbu_scale_b * s.trans (), n * 2 + 1);
}
db::BooleanOp bool_op (mp_job->op ());
db::ShapeGenerator sg (xor_results_cell.shapes (0), true /*clear shapes*/);
db::MergeOp op (0);
db::ShapeGenerator sg (merge_helper_cell.shapes (0), true /*clear shapes*/);
db::PolygonGenerator out (sg, false /*don't resolve holes*/, false /*no min. coherence*/);
sp.process (out, bool_op);
} else {
// This implementation is faster when a lot of overlapping shapes are involved
db::Layout merge_helper;
merge_helper.dbu (mp_job->dbu ());
db::Cell &merge_helper_cell = merge_helper.cell (merge_helper.add_cell ());
merge_helper.insert_layer (0);
merge_helper.insert_layer (1);
// This implementation is faster when a lot of overlapping shapes are involved
if (!la.empty ()) {
sp.clear ();
db::CplxTrans dbu_scale (mp_job->cva ()->layout ().dbu () / xor_results.dbu ());
n = 0;
for (db::RecursiveShapeIterator s (mp_job->cva ()->layout (), *mp_job->cva ().cell (), la, xor_task->region_a ()); ! s.at_end (); ++s, ++n) {
sp.insert (s.shape (), dbu_scale * s.trans (), n);
}
db::MergeOp op (0);
db::ShapeGenerator sg (merge_helper_cell.shapes (0), true /*clear shapes*/);
db::PolygonGenerator out (sg, false /*don't resolve holes*/, false /*no min. coherence*/);
sp.process (out, op);
}
if (!lb.empty ()) {
sp.clear ();
db::CplxTrans dbu_scale (mp_job->cvb ()->layout ().dbu () / xor_results.dbu ());
n = 0;
for (db::RecursiveShapeIterator s (mp_job->cvb ()->layout (), *mp_job->cvb ().cell (), lb, xor_task->region_b ()); ! s.at_end (); ++s, ++n) {
sp.insert (s.shape (), dbu_scale * s.trans (), n);
}
db::MergeOp op (0);
db::ShapeGenerator sg (merge_helper_cell.shapes (1), true /*clear shapes*/);
db::PolygonGenerator out (sg, false /*don't resolve holes*/, false /*no min. coherence*/);
sp.process (out, op);
}
sp.boolean (merge_helper, merge_helper_cell, 0,
merge_helper, merge_helper_cell, 1,
xor_results_cell.shapes (0), mp_job->op (), true, false, true);
sp.process (out, op);
}
if (!lb.empty ()) {
sp.clear ();
db::CplxTrans dbu_scale (mp_job->cvb ()->layout ().dbu () / xor_results.dbu ());
n = 0;
db::RecursiveShapeIterator s;
if (mp_job->has_tiles ()) {
s = db::RecursiveShapeIterator (mp_job->cvb ()->layout (), *mp_job->cvb ().cell (), lb, xor_task->region_b ());
} else {
s = db::RecursiveShapeIterator (mp_job->cvb ()->layout (), *mp_job->cvb ().cell (), lb);
}
s.set_for_merged_input (true);
for ( ; ! s.at_end (); ++s, ++n) {
sp.insert (s.shape (), dbu_scale * s.trans (), n);
}
db::MergeOp op (0);
db::ShapeGenerator sg (merge_helper_cell.shapes (1), true /*clear shapes*/);
db::PolygonGenerator out (sg, false /*don't resolve holes*/, false /*no min. coherence*/);
sp.process (out, op);
}
sp.boolean (merge_helper, merge_helper_cell, 0,
merge_helper, merge_helper_cell, 1,
xor_results_cell.shapes (0), mp_job->op (), true, false, true);
}
} else if (mp_job->op () == db::BooleanOp::Xor ||
@ -1005,6 +1001,8 @@ XORWorker::do_perform_tiled (const XORTask *xor_task)
dbu_scale = db::CplxTrans (mp_job->cvb ()->layout ().dbu () / xor_results.dbu ());
}
s.set_for_merged_input (true);
for (; ! s.at_end (); ++s) {
if (s->is_polygon () || s->is_box () || s->is_path ()) {
db::Polygon p;