summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author couriersud <couriersud@gmx.org>2020-02-16 19:16:20 +0100
committer couriersud <couriersud@gmx.org>2020-02-16 19:16:20 +0100
commitacaea048e19b1f9fe548fa8107a0d9576df1d6d8 (patch)
tree4ed3d79b958198bb256ae31cf6c17f4b1d5c0cc0
parenta2dd2a1c76e325724f2d9e8d2bd66c41388f5e43 (diff)
netlist: Add support for pots to spice conversion. [Couriersud]
-rw-r--r--src/lib/netlist/tools/nl_convert.cpp65
-rw-r--r--src/lib/netlist/tools/nl_convert.h3
2 files changed, 51 insertions, 17 deletions
diff --git a/src/lib/netlist/tools/nl_convert.cpp b/src/lib/netlist/tools/nl_convert.cpp
index ca200675e03..af959bc4112 100644
--- a/src/lib/netlist/tools/nl_convert.cpp
+++ b/src/lib/netlist/tools/nl_convert.cpp
@@ -92,6 +92,7 @@ nl_convert_base_t::nl_convert_base_t()
{ "VS", {"1", "2"} },
{ "TTL_INPUT", {"Q", "VCC", "GND"} },
{ "DIODE", {"A", "K"} },
+ { "POT", {"1", "2", "3"} },
};
}
@@ -110,7 +111,12 @@ void nl_convert_base_t::add_pin_alias(const pstring &devname, const pstring &nam
void nl_convert_base_t::add_ext_alias(const pstring &alias)
{
- m_ext_alias.push_back(alias);
+ m_ext_alias.emplace_back(alias, alias);
+}
+
+void nl_convert_base_t::add_ext_alias(const pstring &alias, const pstring &net)
+{
+ m_ext_alias.emplace_back(alias, net);
}
void nl_convert_base_t::add_device(plib::unique_ptr<dev_t> dev)
@@ -224,9 +230,9 @@ void nl_convert_base_t::dump_nl()
for (auto & alias : m_ext_alias)
{
- net_t *net = m_nets[alias].get();
+ net_t *net = m_nets[alias.second].get();
// use the first terminal ...
- out("ALIAS({}, {})\n", alias, net->terminals()[0]);
+ out("ALIAS({}, {})\n", alias.first, 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();
@@ -389,6 +395,8 @@ void nl_convert_spice_t::convert(const pstring &contents)
}
out("NETLIST_START(dummy)\n");
+ add_term("0", "GND");
+ add_term("GND", "GND"); // For Kicad
convert_block(nl);
dump_nl();
@@ -621,10 +629,8 @@ void nl_convert_spice_t::process_line(const pstring &line)
break;
case 'D':
add_device("DIODE", tt[0], m_subckt + tt[3]);
- // Spice D Anode Kathode model
- // Kicad outputs K first and D as second net
- add_term(tt[1], tt[0], is_kicad() ? 1 : 0);
- add_term(tt[2], tt[0], is_kicad() ? 0 : 1);
+ add_term(tt[1], tt[0], 0);
+ add_term(tt[2], tt[0], 1);
break;
case 'U':
case 'X':
@@ -636,11 +642,12 @@ void nl_convert_spice_t::process_line(const pstring &line)
pstring xname = plib::replace_all(tt[0], pstring("."), pstring("_"));
// Extract parameters of form X=Y
std::vector<pstring> nets;
- std::vector<pstring> params;
+ std::unordered_map<pstring, pstring> params;
for (std::size_t i=1; i < tt.size(); i++)
{
- if (tt[i].find('=') != pstring::npos)
- params.push_back(tt[i]);
+ auto p = tt[i].find('=');
+ if (p != pstring::npos)
+ params.emplace(tt[i].substr(0,p), tt[i].substr(p+1));
else
{
nets.push_back(tt[i]);
@@ -652,30 +659,56 @@ void nl_convert_spice_t::process_line(const pstring &line)
tname = "TTL_" + modname + "_DIP";
else if (plib::startsWith(modname, "4"))
tname = "CD" + modname + "_DIP";
- else if (modname == "ANALOG_INPUT" && params.size()== 1 && params[0].substr(0,2) == "V=")
+ else if (modname == "ANALOG_INPUT" && params.size()== 1 && params.begin()->first == "V")
{
auto yname=pstring("I_") + tt[0].substr(1);
- val = get_sp_val(params[0].substr(2));
+ val = get_sp_val(params["V"]);
add_device(modname, yname, val);
add_term(nets[0], yname + ".Q");
break;
}
- else if (modname == "TTL_INPUT" && params.size()== 1 && params[0].substr(0,2) == "L=")
+ else if (modname == "TTL_INPUT" && params.size()== 1 && params.begin()->first == "L")
{
auto yname=pstring("I_") + tt[0].substr(1);
- val = get_sp_val(params[0].substr(2));
+ val = get_sp_val(params["L"]);
add_device(modname, yname, val);
add_term(nets[0], yname, 0);
add_term(nets[1], yname, 1);
add_term(nets[2], yname, 2);
break;
}
+ else if (modname == "ALIAS" && nets.size() == 2 && params.empty())
+ {
+ auto yname=tt[0].substr(1);
+ add_ext_alias(yname, nets[0]);
+ break;
+ }
+ else if (modname == "RPOT" && nets.size() == 4 && !params.empty())
+ {
+ auto yname=tt[0];
+ auto R = params.find("R");
+ auto V = params.find("V");
+ if (R != params.end())
+ {
+ add_device("POT", yname, get_sp_val(R->second));
+ add_term(nets[0], yname, 0);
+ add_term(nets[1], yname, 1);
+ add_term(nets[2], yname, 2);
+ if (V != params.end())
+ add_device_extra(yname, "PARAM({}, {})", yname + ".DIAL", get_sp_val(V->second));
+ }
+ else
+ out("// IGNORED {}: {}\n", tt[0], line);
+ break;
+ }
+ else
+ tname = modname + "_DIP";
add_device(tname, xname);
- for (std::size_t i=0; i < nets.size(); i++)
+ for (std::size_t i=0; i < nets.size() - 1; i++)
{
// FIXME:
- pstring term = plib::pfmt("X{1}.{2}")(xname)(i+1);
+ pstring term = plib::pfmt("{1}.{2}")(xname)(i+1);
add_term(nets[i], term);
}
break;
diff --git a/src/lib/netlist/tools/nl_convert.h b/src/lib/netlist/tools/nl_convert.h
index 432fd451679..14d65ca3223 100644
--- a/src/lib/netlist/tools/nl_convert.h
+++ b/src/lib/netlist/tools/nl_convert.h
@@ -38,6 +38,7 @@ protected:
void add_pin_alias(const pstring &devname, const pstring &name, const pstring &alias);
void add_ext_alias(const pstring &alias);
+ void add_ext_alias(const pstring &alias, const pstring &net);
void add_device(const pstring &atype, const pstring &aname, const pstring &amodel);
void add_device(const pstring &atype, const pstring &aname, double aval);
@@ -168,7 +169,7 @@ private:
std::vector<plib::unique_ptr<dev_t>> m_devs;
std::unordered_map<pstring, plib::unique_ptr<net_t> > m_nets;
- std::vector<pstring> m_ext_alias;
+ std::vector<std::pair<pstring, pstring>> m_ext_alias;
std::unordered_map<pstring, plib::unique_ptr<pin_alias_t>> m_pins;
std::vector<unit_t> m_units;