From 96c150a4ee101a21b20513f441e8046f23ee57c9 Mon Sep 17 00:00:00 2001 From: Matthias Koefferlein Date: Tue, 20 Jun 2017 22:05:22 +0200 Subject: [PATCH] Fixed #13 (OASIS reader performance on forward-ref PROPSTRING) --- src/db/dbOASISReader.cc | 108 ++++++++++++++++++++++------------------ src/db/dbOASISReader.h | 2 +- 2 files changed, 60 insertions(+), 50 deletions(-) diff --git a/src/db/dbOASISReader.cc b/src/db/dbOASISReader.cc index 0da801454..d77b8d540 100644 --- a/src/db/dbOASISReader.cc +++ b/src/db/dbOASISReader.cc @@ -978,51 +978,9 @@ OASISReader::do_read (db::Layout &layout) error (tl::sprintf (tl::to_string (QObject::tr ("A PROPSTRING with id %ld is present already")), id)); } - // resolve forward references to property names - std::set ::iterator pvf = m_propvalue_forward_references.find (id); - if (pvf != m_propvalue_forward_references.end ()) { - - // replace the id variant placeholder by the correct one - tl::Variant id_var (id, true /*dummy for id type*/); - - for (db::PropertiesRepository::non_const_iterator pi = layout.properties_repository ().begin_non_const (); pi != layout.properties_repository ().end_non_const (); ++pi) { - - for (db::PropertiesRepository::properties_set::iterator ps = pi->second.begin (); ps != pi->second.end (); ++ps) { - - if (ps->second == id_var) { - ps->second = tl::Variant (name); - } else if (ps->second.is_list ()) { - - // Replace list elements as well - // TODO: Q: can there be a list of lists? would need recursive replacement -> make that a method of tl::Variant - - const std::vector &l = ps->second.get_list (); - bool needs_replacement = false; - for (std::vector::const_iterator ll = l.begin (); ll != l.end () && ! needs_replacement; ++ll) { - needs_replacement = (*ll == id_var); - } - - if (needs_replacement) { - - std::vector new_list (l); - for (std::vector::iterator ll = new_list.begin (); ll != new_list.end (); ++ll) { - if (*ll == id_var) { - *ll = tl::Variant (name); - } - } - - ps->second = tl::Variant (new_list.begin (), new_list.end ()); - - } - - } - - } - - } - - m_propvalue_forward_references.erase (pvf); - + std::map::iterator fw = m_propvalue_forward_references.find (id); + if (fw != m_propvalue_forward_references.end ()) { + fw->second = name; } reset_modal_variables (); @@ -1292,9 +1250,61 @@ OASISReader::do_read (db::Layout &layout) error (tl::sprintf (tl::to_string (QObject::tr ("No property name defined for property name id %ld")), fw->first)); } - // all forward references to property value string id's must be resolved - for (std::set ::const_iterator fw = m_propvalue_forward_references.begin (); fw != m_propvalue_forward_references.end (); ++fw) { - error (tl::sprintf (tl::to_string (QObject::tr ("No property value defined for property value id %ld")), *fw)); + // resolve all propvalue forward referenced + if (! m_propvalue_forward_references.empty ()) { + + for (db::PropertiesRepository::non_const_iterator pi = layout.properties_repository ().begin_non_const (); pi != layout.properties_repository ().end_non_const (); ++pi) { + + for (db::PropertiesRepository::properties_set::iterator ps = pi->second.begin (); ps != pi->second.end (); ++ps) { + + if (ps->second.is_id ()) { + + unsigned long id = (unsigned long) ps->second.to_id (); + std::map ::const_iterator fw = m_propvalue_forward_references.find (id); + if (fw != m_propvalue_forward_references.end ()) { + ps->second = tl::Variant (fw->second); + } else { + error (tl::sprintf (tl::to_string (QObject::tr ("No property value defined for property value id %ld")), id)); + } + + } else if (ps->second.is_list ()) { + + // Replace list elements as well + // TODO: Q: can there be a list of lists? would need recursive replacement -> make that a method of tl::Variant + + const std::vector &l = ps->second.get_list (); + bool needs_replacement = false; + for (std::vector::const_iterator ll = l.begin (); ll != l.end () && ! needs_replacement; ++ll) { + needs_replacement = ll->is_id (); + } + + if (needs_replacement) { + + std::vector new_list (l); + for (std::vector::iterator ll = new_list.begin (); ll != new_list.end (); ++ll) { + if (ll->is_id ()) { + unsigned long id = (unsigned long) ps->second.to_id (); + std::map ::const_iterator fw = m_propvalue_forward_references.find (id); + if (fw != m_propvalue_forward_references.end ()) { + *ll = tl::Variant (fw->second); + } else { + error (tl::sprintf (tl::to_string (QObject::tr ("No property value defined for property value id %ld")), id)); + } + } + } + + ps->second = tl::Variant (new_list.begin (), new_list.end ()); + + } + + } + + } + + } + + m_propvalue_forward_references.clear (); + } for (std::map ::const_iterator fw = m_forward_references.begin (); fw != m_forward_references.end (); ++fw) { @@ -1568,7 +1578,7 @@ OASISReader::read_properties (db::PropertiesRepository &rep) if (m_read_properties) { std::map ::const_iterator sid = m_propstrings.find (id); if (sid == m_propstrings.end ()) { - m_propvalue_forward_references.insert (id); + m_propvalue_forward_references.insert (std::make_pair (id, std::string ())); mm_last_value_list.get_non_const ().push_back (tl::Variant (id, true /*dummy for id type*/)); } else { mm_last_value_list.get_non_const ().push_back (tl::Variant (sid->second)); diff --git a/src/db/dbOASISReader.h b/src/db/dbOASISReader.h index 4ce062e12..0733a9473 100644 --- a/src/db/dbOASISReader.h +++ b/src/db/dbOASISReader.h @@ -269,7 +269,7 @@ private: std::set m_defined_cells_by_name; std::map m_propname_forward_references; - std::set m_propvalue_forward_references; + std::map m_propvalue_forward_references; db::property_names_id_type m_s_gds_property_name_id; db::property_names_id_type m_klayout_context_property_name_id;