mirror of https://github.com/KLayout/klayout.git
Some bug fixes for user-property aware RDB and antenna check enhancements
This commit is contained in:
parent
db4baf3a6d
commit
60e6523c30
|
|
@ -1442,41 +1442,57 @@ create_antenna_values (double agate, db::Polygon::area_type agate_int, double ga
|
||||||
{
|
{
|
||||||
std::vector<std::pair<std::string, tl::Variant> > values;
|
std::vector<std::pair<std::string, tl::Variant> > values;
|
||||||
|
|
||||||
values.push_back (std::make_pair ("agate_eff", agate));
|
if (fabs (gate_area_factor - 1.0) <= db::epsilon && fabs (gate_perimeter_factor) <= db::epsilon) {
|
||||||
if (fabs (gate_area_factor) > 1e-6) {
|
values.push_back (std::make_pair ("agate", agate));
|
||||||
values.push_back (std::make_pair ("agate", agate_int * dbu * dbu));
|
} else {
|
||||||
values.push_back (std::make_pair ("agate_factor", gate_area_factor));
|
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) {
|
if (fabs (metal_area_factor - 1.0) <= db::epsilon && fabs (metal_perimeter_factor) <= db::epsilon) {
|
||||||
values.push_back (std::make_pair ("pgate", pgate_int * dbu));
|
values.push_back (std::make_pair ("ametal", ametal));
|
||||||
values.push_back (std::make_pair ("pgate_factor", gate_perimeter_factor));
|
} else {
|
||||||
}
|
if (fabs (metal_area_factor) > db::epsilon) {
|
||||||
values.push_back (std::make_pair ("ametal_eff", ametal));
|
values.push_back (std::make_pair ("ametal", ametal_int * dbu * dbu));
|
||||||
if (fabs (metal_area_factor) > 1e-6) {
|
values.push_back (std::make_pair ("ametal_factor", metal_area_factor));
|
||||||
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));
|
||||||
if (fabs (metal_perimeter_factor) > 1e-6) {
|
values.push_back (std::make_pair ("pmetal_factor", metal_perimeter_factor));
|
||||||
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 ()) {
|
if (! adiodes_int.empty ()) {
|
||||||
tl::Variant adiodes;
|
std::vector<tl::Variant> v;
|
||||||
|
v.reserve (adiodes_int.size ());
|
||||||
for (auto d = adiodes_int.begin (); d != adiodes_int.end (); ++d) {
|
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 ()) {
|
if (! diodes.empty ()) {
|
||||||
tl::Variant diode_factors;
|
std::vector<tl::Variant> v;
|
||||||
|
v.reserve (diodes.size ());
|
||||||
for (auto d = diodes.begin (); d != diodes.end (); ++d) {
|
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 ("ratio", ametal / agate));
|
||||||
values.push_back (std::make_pair ("max_ratio_eff", r));
|
if (ratio > db::epsilon) {
|
||||||
values.push_back (std::make_pair ("max_ratio", ratio));
|
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;
|
return values;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -25,6 +25,7 @@
|
||||||
#include "rdbMarkerBrowserDialog.h"
|
#include "rdbMarkerBrowserDialog.h"
|
||||||
#include "rdb.h"
|
#include "rdb.h"
|
||||||
#include "rdbReader.h"
|
#include "rdbReader.h"
|
||||||
|
#include "rdbUtils.h"
|
||||||
#include "tlProgress.h"
|
#include "tlProgress.h"
|
||||||
#include "layLayoutViewBase.h"
|
#include "layLayoutViewBase.h"
|
||||||
#include "tlExceptions.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) {
|
for (db::ShapeIterator shape = cell.shapes ((*l)->layer_index ()).begin (db::ShapeIterator::All); ! shape.at_end (); ++shape) {
|
||||||
|
|
||||||
std::unique_ptr<rdb::ValueBase> value (rdb::ValueBase::create_from_shape (*shape, db::CplxTrans (layout.dbu ())));
|
rdb::create_item_from_shape (rdb.get (), rdb_cell->id (), cat->id (), db::CplxTrans (layout.dbu ()), *shape);
|
||||||
if (value.get ()) {
|
|
||||||
rdb::Item *item = rdb->create_item (rdb_cell->id (), cat->id ());
|
|
||||||
item->values ().add (value.release ());
|
|
||||||
}
|
|
||||||
|
|
||||||
++progress;
|
++progress;
|
||||||
|
|
||||||
|
|
@ -869,11 +866,7 @@ MarkerBrowserDialog::scan_layer_flat ()
|
||||||
db::RecursiveShapeIterator shape (layout, *cv.cell (), (*l)->layer_index ());
|
db::RecursiveShapeIterator shape (layout, *cv.cell (), (*l)->layer_index ());
|
||||||
while (! shape.at_end ()) {
|
while (! shape.at_end ()) {
|
||||||
|
|
||||||
std::unique_ptr<rdb::ValueBase> value (rdb::ValueBase::create_from_shape (*shape, db::CplxTrans (layout.dbu ()) * shape.trans ()));
|
rdb::create_item_from_shape (rdb.get (), rdb_top_cell->id (), cat->id (), db::CplxTrans (layout.dbu ()) * shape.trans (), *shape);
|
||||||
if (value.get ()) {
|
|
||||||
rdb::Item *item = rdb->create_item (rdb_top_cell->id (), cat->id ());
|
|
||||||
item->values ().add (value.release ());
|
|
||||||
}
|
|
||||||
|
|
||||||
++progress;
|
++progress;
|
||||||
++shape;
|
++shape;
|
||||||
|
|
|
||||||
|
|
@ -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<db::DPath> (), tag_id);
|
return item->add_value (v.to_user<db::DPath> (), tag_id);
|
||||||
} else if (v.is_user<db::DText> ()) {
|
} else if (v.is_user<db::DText> ()) {
|
||||||
return item->add_value (v.to_user<db::DText> (), tag_id);
|
return item->add_value (v.to_user<db::DText> (), 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 {
|
} else {
|
||||||
return item->add_value (std::string (v.to_string ()), tag_id);
|
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<db::DPath> (), tag_id);
|
return item->add_value (v.to_user<db::DPath> (), tag_id);
|
||||||
} else if (v.is_user<db::DText> ()) {
|
} else if (v.is_user<db::DText> ()) {
|
||||||
return item->add_value (v.to_user<db::DText> (), tag_id);
|
return item->add_value (v.to_user<db::DText> (), 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 {
|
} else {
|
||||||
return item->add_value (std::string (v.to_string ()), tag_id);
|
return item->add_value (std::string (v.to_string ()), tag_id);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue