mirror of https://github.com/KLayout/klayout.git
WIP: case insensitive compare of netlists (after reading Spice, the names are caseless)
This commit is contained in:
parent
0cbfa698f0
commit
955d21a656
|
|
@ -35,6 +35,10 @@
|
||||||
namespace db
|
namespace db
|
||||||
{
|
{
|
||||||
|
|
||||||
|
// Add this define for case insensitive compare
|
||||||
|
// (applies to circuits, device classes)
|
||||||
|
#define COMPARE_CASE_INSENSITIVE
|
||||||
|
|
||||||
// --------------------------------------------------------------------------------------------------------------------
|
// --------------------------------------------------------------------------------------------------------------------
|
||||||
// DeviceCompare definition and implementation
|
// DeviceCompare definition and implementation
|
||||||
|
|
||||||
|
|
@ -333,13 +337,18 @@ public:
|
||||||
return cp->second;
|
return cp->second;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::map<std::string, size_t>::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<std::string, size_t>::const_iterator c = m_cat_by_name.find (cls_name);
|
||||||
if (c != m_cat_by_name.end ()) {
|
if (c != m_cat_by_name.end ()) {
|
||||||
m_cat_by_ptr.insert (std::make_pair (cls, c->second));
|
m_cat_by_ptr.insert (std::make_pair (cls, c->second));
|
||||||
return c->second;
|
return c->second;
|
||||||
} else {
|
} else {
|
||||||
++m_next_cat;
|
++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));
|
m_cat_by_ptr.insert (std::make_pair (cls, m_next_cat));
|
||||||
return m_next_cat;
|
return m_next_cat;
|
||||||
}
|
}
|
||||||
|
|
@ -393,13 +402,18 @@ public:
|
||||||
return cp->second;
|
return cp->second;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::map<std::string, size_t>::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<std::string, size_t>::const_iterator c = m_cat_by_name.find (cr_name);
|
||||||
if (c != m_cat_by_name.end ()) {
|
if (c != m_cat_by_name.end ()) {
|
||||||
m_cat_by_ptr.insert (std::make_pair (cr, c->second));
|
m_cat_by_ptr.insert (std::make_pair (cr, c->second));
|
||||||
return c->second;
|
return c->second;
|
||||||
} else {
|
} else {
|
||||||
++m_next_cat;
|
++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));
|
m_cat_by_ptr.insert (std::make_pair (cr, m_next_cat));
|
||||||
return m_next_cat;
|
return m_next_cat;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -26,6 +26,7 @@
|
||||||
|
|
||||||
#include "tlStream.h"
|
#include "tlStream.h"
|
||||||
#include "tlLog.h"
|
#include "tlLog.h"
|
||||||
|
#include "tlString.h"
|
||||||
|
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
#include <cctype>
|
#include <cctype>
|
||||||
|
|
@ -539,7 +540,7 @@ void NetlistSpiceReader::read_pin_and_parameters (tl::Extractor &ex, std::vector
|
||||||
|
|
||||||
if (ex.test ("=")) {
|
if (ex.test ("=")) {
|
||||||
// a parameter
|
// 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 {
|
} else {
|
||||||
if (in_params) {
|
if (in_params) {
|
||||||
error (tl::to_string (tr ("Missing '=' in parameter assignment")));
|
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)
|
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;
|
double value = 0.0;
|
||||||
|
|
||||||
// interpret the parameters according to the code
|
// interpret the parameters according to the code
|
||||||
if (element == "X") {
|
if (element == "\1\n") {
|
||||||
|
|
||||||
// subcircuit call:
|
// subcircuit call:
|
||||||
// Xname n1 n2 ... nn circuit [params]
|
// 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 ()) {
|
while (! ex.at_end ()) {
|
||||||
std::string n = read_name (ex);
|
std::string n = read_name (ex);
|
||||||
if (ex.test ("=")) {
|
if (ex.test ("=")) {
|
||||||
pv [tl::to_upper_case (n)] = read_value (ex);
|
pv [n] = read_value (ex);
|
||||||
} else if (! model.empty ()) {
|
} else if (! model.empty ()) {
|
||||||
error (tl::sprintf (tl::to_string (tr ("Too many arguments for two-terminal device (additional argumen is '%s')")), n));
|
error (tl::sprintf (tl::to_string (tr ("Too many arguments for two-terminal device (additional argumen is '%s')")), n));
|
||||||
} else {
|
} else {
|
||||||
|
|
@ -670,7 +673,7 @@ bool NetlistSpiceReader::read_element (tl::Extractor &ex, const std::string &ele
|
||||||
while (! ex.at_end ()) {
|
while (! ex.at_end ()) {
|
||||||
std::string n = read_name (ex);
|
std::string n = read_name (ex);
|
||||||
if (ex.test ("=")) {
|
if (ex.test ("=")) {
|
||||||
pv [tl::to_upper_case (n)] = read_value (ex);
|
pv [n] = read_value (ex);
|
||||||
} else {
|
} else {
|
||||||
nn.push_back (n);
|
nn.push_back (n);
|
||||||
}
|
}
|
||||||
|
|
@ -710,10 +713,10 @@ bool NetlistSpiceReader::read_element (tl::Extractor &ex, const std::string &ele
|
||||||
if (! pv.empty ()) {
|
if (! pv.empty ()) {
|
||||||
warn (tl::to_string (tr ("Circuit parameters are not allowed currently")));
|
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;
|
return true;
|
||||||
} else {
|
} 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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue