From 1aa595560e8b5c583af1bb0195e4d9a1c97350d6 Mon Sep 17 00:00:00 2001 From: Matthias Koefferlein Date: Sat, 13 Mar 2021 10:34:48 +0100 Subject: [PATCH] Some refactoring --- src/db/db/dbFillTool.cc | 54 +++++++++++++++++++++++++---------------- 1 file changed, 33 insertions(+), 21 deletions(-) diff --git a/src/db/db/dbFillTool.cc b/src/db/db/dbFillTool.cc index 9e4e65759..2adaf5d41 100644 --- a/src/db/db/dbFillTool.cc +++ b/src/db/db/dbFillTool.cc @@ -26,6 +26,7 @@ #include "dbEdgeProcessor.h" #include "dbRegion.h" #include "dbCell.h" +#include "dbTilingProcessor.h" #include "tlIntervalMap.h" #include "tlMath.h" @@ -193,20 +194,9 @@ private: }; -DB_PUBLIC bool -fill_region (db::Cell *cell, const db::Polygon &fp0, db::cell_index_type fill_cell_index, const db::Box &fc_bbox, const db::Point &origin, bool enhanced_fill, - std::vector *remaining_parts, const db::Vector &fill_margin) -{ - if (fc_bbox.empty () || fc_bbox.width () == 0 || fc_bbox.height () == 0) { - throw tl::Exception (tl::to_string (tr ("Invalid fill cell footprint (empty or zero width/height)"))); - } - - return fill_region (cell, fp0, fill_cell_index, fc_bbox.p1 () - db::Point (), db::Vector (fc_bbox.width (), 0), db::Vector (0, fc_bbox.height ()), origin, enhanced_fill, remaining_parts, fill_margin); -} - -DB_PUBLIC bool -fill_region (db::Cell *cell, const db::Polygon &fp0, db::cell_index_type fill_cell_index, const db::Vector &kernel_origin, const db::Vector &row_step, const db::Vector &column_step, const db::Point &origin, bool enhanced_fill, - std::vector *remaining_parts, const db::Vector &fill_margin) +static bool +fill_polygon_impl (db::Cell *cell, const db::Polygon &fp0, db::cell_index_type fill_cell_index, const db::Vector &kernel_origin, const db::Vector &row_step, const db::Vector &column_step, const db::Point &origin, bool enhanced_fill, + std::vector *remaining_parts, const db::Vector &fill_margin) { if (row_step.x () <= 0 || column_step.y () <= 0) { throw tl::Exception (tl::to_string (tr ("Invalid row or column step vectors in fill_region: row step must have a positive x component while column step must have a positive y component"))); @@ -294,7 +284,11 @@ fill_region (db::Cell *cell, const db::Polygon &fp0, db::cell_index_type fill_ce array = db::CellInstArray (db::CellInst (fill_cell_index), db::Trans (p0)); } - cell->insert (array); + { + // In case we run this from a tiling processor we need to lock against multithread races + tl::MutexLocker locker (&db::TilingProcessor::output_lock ()); + cell->insert (array); + } if (remaining_parts) { if (am1.d ().y () == am1.p ().y ()) { @@ -350,16 +344,22 @@ fill_region (db::Cell *cell, const db::Polygon &fp0, db::cell_index_type fill_ce } } -DB_PUBLIC void -fill_region (db::Cell *cell, const db::Region &fr, db::cell_index_type fill_cell_index, const db::Box &fc_bbox, const db::Point &origin, bool enhanced_fill, - db::Region *remaining_parts, const db::Vector &fill_margin, db::Region *remaining_polygons) +DB_PUBLIC bool +fill_region (db::Cell *cell, const db::Polygon &fp0, db::cell_index_type fill_cell_index, const db::Vector &kernel_origin, const db::Vector &row_step, const db::Vector &column_step, const db::Point &origin, bool enhanced_fill, + std::vector *remaining_parts, const db::Vector &fill_margin) +{ + return fill_polygon_impl (cell, fp0, fill_cell_index, kernel_origin, row_step, column_step, origin, enhanced_fill, remaining_parts, fill_margin); +} + +DB_PUBLIC bool +fill_region (db::Cell *cell, const db::Polygon &fp0, db::cell_index_type fill_cell_index, const db::Box &fc_bbox, const db::Point &origin, bool enhanced_fill, + std::vector *remaining_parts, const db::Vector &fill_margin) { if (fc_bbox.empty () || fc_bbox.width () == 0 || fc_bbox.height () == 0) { throw tl::Exception (tl::to_string (tr ("Invalid fill cell footprint (empty or zero width/height)"))); } - fill_region (cell, fr, fill_cell_index, fc_bbox.p1 () - db::Point (), db::Vector (fc_bbox.width (), 0), db::Vector (0, fc_bbox.height ()), - origin, enhanced_fill, remaining_parts, fill_margin, remaining_polygons); + return fill_polygon_impl (cell, fp0, fill_cell_index, fc_bbox.p1 () - db::Point (), db::Vector (fc_bbox.width (), 0), db::Vector (0, fc_bbox.height ()), origin, enhanced_fill, remaining_parts, fill_margin); } static void @@ -391,7 +391,7 @@ fill_region_impl (db::Cell *cell, const db::Region &fr, db::cell_index_type fill tl::RelativeProgress progress (progress_title, n); for (db::Region::const_iterator p = fr.begin_merged (); !p.at_end (); ++p) { - if (!fill_region (cell, *p, fill_cell_index, kernel_origin, row_step, column_step, origin, enhanced_fill, remaining_parts ? &rem_pp : 0, fill_margin)) { + if (! fill_polygon_impl (cell, *p, fill_cell_index, kernel_origin, row_step, column_step, origin, enhanced_fill, remaining_parts ? &rem_pp : 0, fill_margin)) { if (remaining_polygons) { rem_poly.push_back (*p); } @@ -426,6 +426,18 @@ fill_region (db::Cell *cell, const db::Region &fr, db::cell_index_type fill_cell fill_region_impl (cell, fr, fill_cell_index, kernel_origin, row_step, column_step, origin, enhanced_fill, remaining_parts, fill_margin, remaining_polygons, 0); } +DB_PUBLIC void +fill_region (db::Cell *cell, const db::Region &fr, db::cell_index_type fill_cell_index, const db::Box &fc_bbox, const db::Point &origin, bool enhanced_fill, + db::Region *remaining_parts, const db::Vector &fill_margin, db::Region *remaining_polygons) +{ + if (fc_bbox.empty () || fc_bbox.width () == 0 || fc_bbox.height () == 0) { + throw tl::Exception (tl::to_string (tr ("Invalid fill cell footprint (empty or zero width/height)"))); + } + + fill_region_impl (cell, fr, fill_cell_index, fc_bbox.p1 () - db::Point (), db::Vector (fc_bbox.width (), 0), db::Vector (0, fc_bbox.height ()), + origin, enhanced_fill, remaining_parts, fill_margin, remaining_polygons, 0); +} + DB_PUBLIC void fill_region_repeat (db::Cell *cell, const db::Region &fr, db::cell_index_type fill_cell_index, const db::Vector &kernel_origin, const db::Vector &row_step, const db::Vector &column_step,