diff --git a/src/db/db/dbLayoutToNetlist.cc b/src/db/db/dbLayoutToNetlist.cc index 71748e2e0..2f47d395f 100644 --- a/src/db/db/dbLayoutToNetlist.cc +++ b/src/db/db/dbLayoutToNetlist.cc @@ -1442,41 +1442,57 @@ create_antenna_values (double agate, db::Polygon::area_type agate_int, double ga { std::vector > values; - values.push_back (std::make_pair ("agate_eff", agate)); - if (fabs (gate_area_factor) > 1e-6) { - values.push_back (std::make_pair ("agate", agate_int * dbu * dbu)); - values.push_back (std::make_pair ("agate_factor", gate_area_factor)); + if (fabs (gate_area_factor - 1.0) <= db::epsilon && fabs (gate_perimeter_factor) <= db::epsilon) { + values.push_back (std::make_pair ("agate", agate)); + } else { + if (fabs (gate_area_factor) > db::epsilon) { + values.push_back (std::make_pair ("agate", agate_int * dbu * dbu)); + values.push_back (std::make_pair ("agate_factor", gate_area_factor)); + } + if (fabs (gate_perimeter_factor) > db::epsilon) { + values.push_back (std::make_pair ("pgate", pgate_int * dbu)); + values.push_back (std::make_pair ("pgate_factor", gate_perimeter_factor)); + } + values.push_back (std::make_pair ("agate_eff", agate)); } - if (fabs (gate_perimeter_factor) > 1e-6) { - values.push_back (std::make_pair ("pgate", pgate_int * dbu)); - values.push_back (std::make_pair ("pgate_factor", gate_perimeter_factor)); - } - values.push_back (std::make_pair ("ametal_eff", ametal)); - if (fabs (metal_area_factor) > 1e-6) { - values.push_back (std::make_pair ("ametal", ametal_int * dbu * dbu)); - values.push_back (std::make_pair ("ametal_factor", metal_area_factor)); - } - if (fabs (metal_perimeter_factor) > 1e-6) { - values.push_back (std::make_pair ("pmetal", pmetal_int * dbu)); - values.push_back (std::make_pair ("pmetal_factor", metal_perimeter_factor)); + if (fabs (metal_area_factor - 1.0) <= db::epsilon && fabs (metal_perimeter_factor) <= db::epsilon) { + values.push_back (std::make_pair ("ametal", ametal)); + } else { + if (fabs (metal_area_factor) > db::epsilon) { + values.push_back (std::make_pair ("ametal", ametal_int * dbu * dbu)); + values.push_back (std::make_pair ("ametal_factor", metal_area_factor)); + } + if (fabs (metal_perimeter_factor) > db::epsilon) { + values.push_back (std::make_pair ("pmetal", pmetal_int * dbu)); + values.push_back (std::make_pair ("pmetal_factor", metal_perimeter_factor)); + } + values.push_back (std::make_pair ("ametal_eff", ametal)); } if (! adiodes_int.empty ()) { - tl::Variant adiodes; + std::vector v; + v.reserve (adiodes_int.size ()); for (auto d = adiodes_int.begin (); d != adiodes_int.end (); ++d) { - adiodes.push (*d * dbu * dbu); + v.push_back (*d * dbu * dbu); } - values.push_back (std::make_pair ("adiodes", adiodes)); + values.push_back (std::make_pair ("adiodes", tl::Variant (v))); } if (! diodes.empty ()) { - tl::Variant diode_factors; + std::vector v; + v.reserve (diodes.size ()); for (auto d = diodes.begin (); d != diodes.end (); ++d) { - diode_factors.push (d->second); + v.push_back (d->second); } - values.push_back (std::make_pair ("diode_factors", diode_factors)); + values.push_back (std::make_pair ("diode_factors", tl::Variant (v))); } values.push_back (std::make_pair ("ratio", ametal / agate)); - values.push_back (std::make_pair ("max_ratio_eff", r)); - values.push_back (std::make_pair ("max_ratio", ratio)); + if (ratio > db::epsilon) { + if (fabs (r / ratio - 1.0) < db::epsilon) { + values.push_back (std::make_pair ("max_ratio", ratio)); + } else { + values.push_back (std::make_pair ("max_ratio_eff", r)); + values.push_back (std::make_pair ("max_ratio", ratio)); + } + } return values; } diff --git a/src/layui/layui/rdbMarkerBrowserDialog.cc b/src/layui/layui/rdbMarkerBrowserDialog.cc index 39863b20a..965a60d77 100644 --- a/src/layui/layui/rdbMarkerBrowserDialog.cc +++ b/src/layui/layui/rdbMarkerBrowserDialog.cc @@ -25,6 +25,7 @@ #include "rdbMarkerBrowserDialog.h" #include "rdb.h" #include "rdbReader.h" +#include "rdbUtils.h" #include "tlProgress.h" #include "layLayoutViewBase.h" #include "tlExceptions.h" @@ -790,11 +791,7 @@ MarkerBrowserDialog::scan_layer () for (db::ShapeIterator shape = cell.shapes ((*l)->layer_index ()).begin (db::ShapeIterator::All); ! shape.at_end (); ++shape) { - std::unique_ptr value (rdb::ValueBase::create_from_shape (*shape, db::CplxTrans (layout.dbu ()))); - if (value.get ()) { - rdb::Item *item = rdb->create_item (rdb_cell->id (), cat->id ()); - item->values ().add (value.release ()); - } + rdb::create_item_from_shape (rdb.get (), rdb_cell->id (), cat->id (), db::CplxTrans (layout.dbu ()), *shape); ++progress; @@ -869,11 +866,7 @@ MarkerBrowserDialog::scan_layer_flat () db::RecursiveShapeIterator shape (layout, *cv.cell (), (*l)->layer_index ()); while (! shape.at_end ()) { - std::unique_ptr value (rdb::ValueBase::create_from_shape (*shape, db::CplxTrans (layout.dbu ()) * shape.trans ())); - if (value.get ()) { - rdb::Item *item = rdb->create_item (rdb_top_cell->id (), cat->id ()); - item->values ().add (value.release ()); - } + rdb::create_item_from_shape (rdb.get (), rdb_top_cell->id (), cat->id (), db::CplxTrans (layout.dbu ()) * shape.trans (), *shape); ++progress; ++shape; diff --git a/src/rdb/rdb/rdbUtils.cc b/src/rdb/rdb/rdbUtils.cc index fd65a3d66..c2c281fd3 100644 --- a/src/rdb/rdb/rdbUtils.cc +++ b/src/rdb/rdb/rdbUtils.cc @@ -371,6 +371,8 @@ ValueBase *add_item_value (rdb::Item *item, const tl::Variant &v, const db::Cplx return item->add_value (v.to_user (), tag_id); } else if (v.is_user ()) { return item->add_value (v.to_user (), tag_id); + } else if (v.is_double () || v.is_long () || v.is_ulong () || v.is_longlong () || v.is_ulonglong ()) { + return item->add_value (v.to_double (), tag_id); } else { return item->add_value (std::string (v.to_string ()), tag_id); } @@ -418,6 +420,8 @@ ValueBase *add_item_value(rdb::Item *item, const tl::Variant &v, double dbu, rdb return item->add_value (v.to_user (), tag_id); } else if (v.is_user ()) { return item->add_value (v.to_user (), tag_id); + } else if (v.is_double () || v.is_long () || v.is_ulong () || v.is_longlong () || v.is_ulonglong ()) { + return item->add_value (v.to_double (), tag_id); } else { return item->add_value (std::string (v.to_string ()), tag_id); }