diff options
author | 2020-02-03 20:21:40 +0100 | |
---|---|---|
committer | 2020-02-03 20:21:40 +0100 | |
commit | 636315be5f4eefed133be67e64348522c78b9798 (patch) | |
tree | b2585e5dcbc273803505d7126ce62c6366d0eb0c /src | |
parent | c2ca6e636982c84d821673332045f7cb4940c03d (diff) |
netlist: code maintenance. (nw)
Remove dead code, fix lint warnings, make spice netlist conversion more
flexible, implement changes to controlled sources.
Diffstat (limited to 'src')
-rw-r--r-- | src/lib/netlist/plib/pstream.h | 11 | ||||
-rw-r--r-- | src/lib/netlist/plib/ptokenizer.cpp | 4 | ||||
-rw-r--r-- | src/lib/netlist/prg/nlwav.cpp | 3 | ||||
-rw-r--r-- | src/lib/netlist/tools/nl_convert.cpp | 117 | ||||
-rw-r--r-- | src/lib/netlist/tools/nl_convert.h | 7 |
5 files changed, 92 insertions, 50 deletions
diff --git a/src/lib/netlist/plib/pstream.h b/src/lib/netlist/plib/pstream.h index b1dd55669b7..5999757b9e6 100644 --- a/src/lib/netlist/plib/pstream.h +++ b/src/lib/netlist/plib/pstream.h @@ -39,22 +39,17 @@ public: COPYASSIGN(putf8_reader, delete) virtual ~putf8_reader() = default; - putf8_reader(putf8_reader &&rhs) + putf8_reader(putf8_reader &&rhs) noexcept : m_strm(std::move(rhs.m_strm)) , m_linebuf(std::move(rhs.m_linebuf)) { } - putf8_reader(plib::unique_ptr<std::istream> &&rhs) + putf8_reader(plib::unique_ptr<std::istream> &&rhs) noexcept : m_strm(std::move(rhs)) { } -#if 0 - template<typename T, typename... Args> - putf8_reader(Args&&... args) - : m_strm(plib::make_unique<T>(std::forward<Args>(args)...)) - {} -#endif + bool eof() const { return m_strm->eof(); } bool readline(pstring &line) diff --git a/src/lib/netlist/plib/ptokenizer.cpp b/src/lib/netlist/plib/ptokenizer.cpp index 46af36d2bf9..d94a7ead20f 100644 --- a/src/lib/netlist/plib/ptokenizer.cpp +++ b/src/lib/netlist/plib/ptokenizer.cpp @@ -234,7 +234,9 @@ namespace plib { ungetc(c); return token_t(ret, tokstr); } - else if (m_identifier_chars.find(c) != pstring::npos) + + // not a number, try identifier + if (m_identifier_chars.find(c) != pstring::npos) { // read identifier till non identifier char pstring tokstr = ""; diff --git a/src/lib/netlist/prg/nlwav.cpp b/src/lib/netlist/prg/nlwav.cpp index a6334edbda9..dac8b91814b 100644 --- a/src/lib/netlist/prg/nlwav.cpp +++ b/src/lib/netlist/prg/nlwav.cpp @@ -138,7 +138,6 @@ public: bool readmore(std::vector<plib::putf8_reader> &r) { - fprintf(stderr, "%d %d\n", (int) m_e.size(), (int) r.size()); bool success = false; for (std::size_t i = 0; i< r.size(); i++) { @@ -146,7 +145,6 @@ public: { pstring line; m_e[i].eof = !r[i].readline(line); - //fprintf(stderr, "bla: <%s>\n", line.c_str()); if (!m_e[i].eof) { // sscanf is very fast ... @@ -518,7 +516,6 @@ int nlwav_app::execute() for (auto &oi: opt_args()) { plib::unique_ptr<std::istream> fin; - printf("%s\n", oi.c_str()); if (oi == "-") { auto temp(plib::make_unique<std::stringstream>()); diff --git a/src/lib/netlist/tools/nl_convert.cpp b/src/lib/netlist/tools/nl_convert.cpp index 1b2b6dc2368..ca200675e03 100644 --- a/src/lib/netlist/tools/nl_convert.cpp +++ b/src/lib/netlist/tools/nl_convert.cpp @@ -226,7 +226,7 @@ void nl_convert_base_t::dump_nl() { net_t *net = m_nets[alias].get(); // use the first terminal ... - out("ALIAS({}, {})\n", alias.c_str(), net->terminals()[0].c_str()); + out("ALIAS({}, {})\n", alias, net->terminals()[0]); // if the aliased net only has this one terminal connected ==> don't dump if (net->terminals().size() == 1) net->set_no_export(); @@ -243,14 +243,17 @@ void nl_convert_base_t::dump_nl() std::size_t j = sorted[i]; if (m_devs[j]->has_value()) - out("{}({}, {})\n", m_devs[j]->type().c_str(), - m_devs[j]->name().c_str(), get_nl_val(m_devs[j]->value()).c_str()); + { + pstring t = m_devs[j]->type(); + pstring vals = (t == "RES" || t == "CAP") ? get_nl_val(m_devs[j]->value()) : plib::pfmt("{1:g}")(m_devs[j]->value()); + out("{}({}, {})\n", t, m_devs[j]->name(), vals); + } else if (m_devs[j]->has_model()) - out("{}({}, \"{}\")\n", m_devs[j]->type().c_str(), - m_devs[j]->name().c_str(), m_devs[j]->model().c_str()); + out("{}({}, \"{}\")\n", m_devs[j]->type(), + m_devs[j]->name(), m_devs[j]->model()); else - out("{}({})\n", m_devs[j]->type().c_str(), - m_devs[j]->name().c_str()); + out("{}({})\n", m_devs[j]->type(), + m_devs[j]->name()); for (auto &e : m_devs[j]->extra()) out("{}\n", e); @@ -261,10 +264,10 @@ void nl_convert_base_t::dump_nl() net_t * net = i.second.get(); if (!net->is_no_export() && !(net->terminals().size() == 1 && net->terminals()[0] == "GND" )) { - out("NET_C({}", net->terminals()[0].c_str() ); + out("NET_C({}", net->terminals()[0] ); for (std::size_t j=1; j<net->terminals().size(); j++) { - out(", {}", net->terminals()[j].c_str() ); + out(", {}", net->terminals()[j] ); } out(")\n"); } @@ -276,7 +279,7 @@ void nl_convert_base_t::dump_nl() m_ext_alias.clear(); } -pstring nl_convert_base_t::get_nl_val(double val) +pstring nl_convert_base_t::get_nl_val(double val) const { for (auto &e : m_units) { @@ -294,7 +297,7 @@ pstring nl_convert_base_t::get_nl_val(double val) return plib::pfmt("{1}")(val); } -double nl_convert_base_t::get_sp_unit(const pstring &unit) +double nl_convert_base_t::get_sp_unit(const pstring &unit) const { for (auto &e : m_units) { @@ -305,7 +308,7 @@ double nl_convert_base_t::get_sp_unit(const pstring &unit) return 0.0; } -double nl_convert_base_t::get_sp_val(const pstring &sin) +double nl_convert_base_t::get_sp_val(const pstring &sin) const { std::size_t p = 0; while (p < sin.length() && (m_numberchars.find(sin.substr(p, 1)) != pstring::npos)) @@ -316,19 +319,26 @@ double nl_convert_base_t::get_sp_val(const pstring &sin) return ret; } +void nl_convert_spice_t::convert_block(const str_list &contents) +{ + for (const auto &line : contents) + process_line(line); +} + + void nl_convert_spice_t::convert(const pstring &contents) { std::vector<pstring> spnl(plib::psplit(contents, "\n")); + std::vector<pstring> after_linecontinuation; // Add gnd net // FIXME: Parameter - out("NETLIST_START(dummy)\n"); - add_term("0", "GND"); - add_term("GND", "GND"); // For Kicad pstring line = ""; + // process linecontinuation + for (const auto &i : spnl) { // Basic preprocessing @@ -337,11 +347,50 @@ void nl_convert_spice_t::convert(const pstring &contents) line += inl.substr(1); else { - process_line(line); + after_linecontinuation.push_back(line); line = inl; } } - process_line(line); + after_linecontinuation.push_back(line); + spnl.clear(); // no longer needed + + // Process subcircuits + + std::vector<std::vector<pstring>> subckts; + std::vector<pstring> nl; + auto inp = after_linecontinuation.begin(); + while (inp != after_linecontinuation.end()) + { + if (plib::startsWith(*inp, ".SUBCKT")) + { + std::vector<pstring> sub; + while (inp != after_linecontinuation.end()) + { + auto s(*inp); + sub.push_back(s); + inp++; + if (plib::startsWith(s, ".ENDS")) + break; + } + subckts.push_back(sub); + } + else + { + nl.push_back(*inp); + inp++; + } + } + + for (const auto &sub : subckts) + { + add_term("0", "GND"); + add_term("GND", "GND"); // For Kicad + convert_block(sub); + } + + out("NETLIST_START(dummy)\n"); + + convert_block(nl); dump_nl(); // FIXME: Parameter out("NETLIST_END()\n"); @@ -381,10 +430,8 @@ void nl_convert_spice_t::process_line(const pstring &line) switch (tt[0].at(0)) { case ';': - out("// {}\n", line.substr(1)); - break; case '*': - out("// {}\n", line.substr(1).c_str()); + out("// {}\n", line.substr(1)); break; case '.': if (tt[0] == ".SUBCKT") @@ -412,7 +459,7 @@ void nl_convert_spice_t::process_line(const pstring &line) m_is_kicad = true; } else - out("// {}\n", line.c_str()); + out("// {}\n", line); break; case 'Q': { @@ -475,12 +522,12 @@ void nl_convert_spice_t::process_line(const pstring &line) auto n=npoly(tt[3]); if (n<0) { - add_device("VCVS", tt[0]); + add_device("VCVS", tt[0], get_sp_val(tt[5])); add_term(tt[1], tt[0], 0); add_term(tt[2], tt[0], 1); add_term(tt[3], tt[0], 2); add_term(tt[4], tt[0], 3); - add_device_extra(tt[0], "PARAM({}, {})", tt[0] + ".G", tt[5]); + //add_device_extra(tt[0], "PARAM({}, {})", tt[0] + ".G", tt[5]); } else { @@ -488,7 +535,7 @@ void nl_convert_spice_t::process_line(const pstring &line) auto scoeff(static_cast<unsigned>(5 + n)); if ((tt.size() != 5 + 2 * static_cast<unsigned>(n)) || (tt[scoeff-1] != "0")) { - out("// IGNORED {}: {}\n", tt[0].c_str(), line.c_str()); + out("// IGNORED {}: {}\n", tt[0], line); break; } pstring lastnet = tt[1]; @@ -497,12 +544,12 @@ void nl_convert_spice_t::process_line(const pstring &line) pstring devname = tt[0] + plib::pfmt("{}")(i); pstring nextnet = (i<static_cast<std::size_t>(n)-1) ? tt[1] + "a" + plib::pfmt("{}")(i) : tt[2]; auto net2 = plib::psplit(plib::replace_all(plib::replace_all(tt[sce+i],")",""),"(",""),","); - add_device("VCVS", devname); + add_device("VCVS", devname, get_sp_val(tt[scoeff+i])); add_term(lastnet, devname, 0); add_term(nextnet, devname, 1); add_term(net2[0], devname, 2); add_term(net2[1], devname, 3); - add_device_extra(devname, "PARAM({}, {})", devname + ".G", tt[scoeff+i]); + //add_device_extra(devname, "PARAM({}, {})", devname + ".G", tt[scoeff+i]); lastnet = nextnet; } } @@ -523,39 +570,39 @@ void nl_convert_spice_t::process_line(const pstring &line) { if ((tt.size() != 5 + 2 * static_cast<unsigned>(n)) || (tt[scoeff-1] != "0")) { - out("// IGNORED {}: {}\n", tt[0].c_str(), line.c_str()); + out("// IGNORED {}: {}\n", tt[0], line); break; } } for (std::size_t i=0; i < static_cast<std::size_t>(n); i++) { pstring devname = tt[0] + plib::pfmt("{}")(i); - add_device("CCCS", devname); + add_device("CCCS", devname, get_sp_val(tt[scoeff+i])); add_term(tt[1], devname, 0); add_term(tt[2], devname, 1); pstring extranetname = devname + "net"; m_replace.push_back({tt[sce+i], devname + ".IP", extranetname }); add_term(extranetname, devname + ".IN"); - add_device_extra(devname, "PARAM({}, {})", devname + ".G", tt[scoeff+i]); + //add_device_extra(devname, "PARAM({}, {})", devname + ".G", tt[scoeff+i]); } } break; case 'H': - add_device("CCVS", tt[0]); + add_device("CCVS", tt[0], get_sp_val(tt[4])); add_term(tt[1], tt[0] + ".OP"); add_term(tt[2], tt[0] + ".ON"); m_replace.push_back({tt[3], tt[0] + ".IP", tt[2] + "a" }); add_term(tt[2] + "a", tt[0] + ".IN"); - add_device_extra(tt[0], "PARAM({}, {})", tt[0] + ".G", tt[4]); + //add_device_extra(tt[0], "PARAM({}, {})", tt[0] + ".G", tt[4]); break; case 'G': - add_device("VCCS", tt[0]); + add_device("VCCS", tt[0], get_sp_val(tt[5])); add_term(tt[1], tt[0], 0); add_term(tt[2], tt[0], 1); add_term(tt[3], tt[0], 2); add_term(tt[4], tt[0], 3); - add_device_extra(tt[0], "PARAM({}, {})", tt[0] + ".G", tt[5]); + //add_device_extra(tt[0], "PARAM({}, {})", tt[0] + ".G", tt[5]); break; case 'V': // only DC Voltage sources .... @@ -634,7 +681,7 @@ void nl_convert_spice_t::process_line(const pstring &line) break; } default: - out("// IGNORED {}: {}\n", tt[0].c_str(), line.c_str()); + out("// IGNORED {}: {}\n", tt[0], line); } } } @@ -770,7 +817,7 @@ void nl_convert_eagle_t::convert(const pstring &contents) } else { - out("Unexpected {}\n", token.str().c_str()); + out("Unexpected {}\n", token.str()); return; } } diff --git a/src/lib/netlist/tools/nl_convert.h b/src/lib/netlist/tools/nl_convert.h index f47eaf5ccaa..432fd451679 100644 --- a/src/lib/netlist/tools/nl_convert.h +++ b/src/lib/netlist/tools/nl_convert.h @@ -56,10 +56,10 @@ protected: void dump_nl(); - pstring get_nl_val(double val); - double get_sp_unit(const pstring &unit); + pstring get_nl_val(double val) const; + double get_sp_unit(const pstring &unit) const; - double get_sp_val(const pstring &sin); + double get_sp_val(const pstring &sin) const; plib::putf8_fmt_writer out; @@ -189,6 +189,7 @@ public: protected: bool is_kicad() const { return m_is_kicad; } + void convert_block(const str_list &contents); void process_line(const pstring &line); private: |