From 955d21a656aa0c008a478cc5625d1c162f23de04 Mon Sep 17 00:00:00 2001 From: Matthias Koefferlein Date: Wed, 26 Jun 2019 20:58:42 +0200 Subject: [PATCH] WIP: case insensitive compare of netlists (after reading Spice, the names are caseless) --- src/db/db/dbNetlistCompare.cc | 22 ++++++++++++++++++---- src/db/db/dbNetlistSpiceReader.cc | 17 ++++++++++------- 2 files changed, 28 insertions(+), 11 deletions(-) diff --git a/src/db/db/dbNetlistCompare.cc b/src/db/db/dbNetlistCompare.cc index 9a4e11021..29a8cba22 100644 --- a/src/db/db/dbNetlistCompare.cc +++ b/src/db/db/dbNetlistCompare.cc @@ -35,6 +35,10 @@ namespace db { +// Add this define for case insensitive compare +// (applies to circuits, device classes) +#define COMPARE_CASE_INSENSITIVE + // -------------------------------------------------------------------------------------------------------------------- // DeviceCompare definition and implementation @@ -333,13 +337,18 @@ public: return cp->second; } - std::map::const_iterator c = m_cat_by_name.find (cls->name ()); + std::string cls_name = cls->name (); +#if defined(COMPARE_CASE_INSENSITIVE) + cls_name = tl::to_upper_case (cls_name); +#endif + + std::map::const_iterator c = m_cat_by_name.find (cls_name); if (c != m_cat_by_name.end ()) { m_cat_by_ptr.insert (std::make_pair (cls, c->second)); return c->second; } else { ++m_next_cat; - m_cat_by_name.insert (std::make_pair (cls->name (), m_next_cat)); + m_cat_by_name.insert (std::make_pair (cls_name, m_next_cat)); m_cat_by_ptr.insert (std::make_pair (cls, m_next_cat)); return m_next_cat; } @@ -393,13 +402,18 @@ public: return cp->second; } - std::map::const_iterator c = m_cat_by_name.find (cr->name ()); + std::string cr_name = cr->name (); +#if defined(COMPARE_CASE_INSENSITIVE) + cr_name = tl::to_upper_case (cr_name); +#endif + + std::map::const_iterator c = m_cat_by_name.find (cr_name); if (c != m_cat_by_name.end ()) { m_cat_by_ptr.insert (std::make_pair (cr, c->second)); return c->second; } else { ++m_next_cat; - m_cat_by_name.insert (std::make_pair (cr->name (), m_next_cat)); + m_cat_by_name.insert (std::make_pair (cr_name, m_next_cat)); m_cat_by_ptr.insert (std::make_pair (cr, m_next_cat)); return m_next_cat; } diff --git a/src/db/db/dbNetlistSpiceReader.cc b/src/db/db/dbNetlistSpiceReader.cc index b596d267e..eed12e3a9 100644 --- a/src/db/db/dbNetlistSpiceReader.cc +++ b/src/db/db/dbNetlistSpiceReader.cc @@ -26,6 +26,7 @@ #include "tlStream.h" #include "tlLog.h" +#include "tlString.h" #include #include @@ -539,7 +540,7 @@ void NetlistSpiceReader::read_pin_and_parameters (tl::Extractor &ex, std::vector if (ex.test ("=")) { // a parameter - pv.insert (std::make_pair (tl::to_upper_case (n), read_value (ex))); + pv.insert (std::make_pair (n, read_value (ex))); } else { if (in_params) { error (tl::to_string (tr ("Missing '=' in parameter assignment"))); @@ -603,7 +604,9 @@ std::string NetlistSpiceReader::read_name (tl::Extractor &ex) } - return nn; + // TODO: allow configuring Spice reader as case sensitive? + // this is easy to do: just avoid to_upper here: + return tl::to_upper_case (nn); } bool NetlistSpiceReader::read_element (tl::Extractor &ex, const std::string &element, const std::string &name) @@ -616,7 +619,7 @@ bool NetlistSpiceReader::read_element (tl::Extractor &ex, const std::string &ele double value = 0.0; // interpret the parameters according to the code - if (element == "X") { + if (element == "\1\n") { // subcircuit call: // Xname n1 n2 ... nn circuit [params] @@ -655,7 +658,7 @@ bool NetlistSpiceReader::read_element (tl::Extractor &ex, const std::string &ele while (! ex.at_end ()) { std::string n = read_name (ex); if (ex.test ("=")) { - pv [tl::to_upper_case (n)] = read_value (ex); + pv [n] = read_value (ex); } else if (! model.empty ()) { error (tl::sprintf (tl::to_string (tr ("Too many arguments for two-terminal device (additional argumen is '%s')")), n)); } else { @@ -670,7 +673,7 @@ bool NetlistSpiceReader::read_element (tl::Extractor &ex, const std::string &ele while (! ex.at_end ()) { std::string n = read_name (ex); if (ex.test ("=")) { - pv [tl::to_upper_case (n)] = read_value (ex); + pv [n] = read_value (ex); } else { nn.push_back (n); } @@ -710,10 +713,10 @@ bool NetlistSpiceReader::read_element (tl::Extractor &ex, const std::string &ele if (! pv.empty ()) { warn (tl::to_string (tr ("Circuit parameters are not allowed currently"))); } - read_subcircuit (name, tl::to_upper_case (model), nets); + read_subcircuit (name, model, nets); return true; } else { - return mp_delegate->element (mp_circuit, element, name, tl::to_upper_case (model), value, nets, pv); + return mp_delegate->element (mp_circuit, element, name, model, value, nets, pv); } }