diff options
Diffstat (limited to 'src/lib/netlist/nl_setup.cpp')
-rw-r--r-- | src/lib/netlist/nl_setup.cpp | 91 |
1 files changed, 58 insertions, 33 deletions
diff --git a/src/lib/netlist/nl_setup.cpp b/src/lib/netlist/nl_setup.cpp index cef51f481db..d60074c0e47 100644 --- a/src/lib/netlist/nl_setup.cpp +++ b/src/lib/netlist/nl_setup.cpp @@ -6,16 +6,16 @@ */ #include "plib/palloc.h" -#include "plib/putil.h" +#include "analog/nld_twoterm.h" +#include "devices/nlid_proxy.h" +#include "devices/nlid_system.h" +#include "devices/nlid_truthtable.h" #include "nl_base.h" -#include "nl_setup.h" -#include "nl_parser.h" #include "nl_factory.h" -#include "devices/nlid_system.h" -#include "devices/nlid_proxy.h" -#include "analog/nld_twoterm.h" +#include "nl_parser.h" +#include "nl_setup.h" +#include "plib/putil.h" #include "solver/nld_solver.h" -#include "devices/nlid_truthtable.h" #include <cmath> @@ -88,17 +88,24 @@ void setup_t::register_dev(const pstring &classname, const pstring &name) auto f = factory().factory_by_name(classname); if (f == nullptr) log().fatal(MF_1_CLASS_1_NOT_FOUND, classname); - /* make sure we parse macro library entries */ - f->macro_actions(netlist(), name); - pstring key = build_fqn(name); - if (device_exists(key)) - log().fatal(MF_1_DEVICE_ALREADY_EXISTS_1, name); - m_device_factory[key] = f; + else + { + /* make sure we parse macro library entries */ + f->macro_actions(netlist(), name); + pstring key = build_fqn(name); + if (device_exists(key)) + log().fatal(MF_1_DEVICE_ALREADY_EXISTS_1, name); + else + m_device_factory.insert(m_device_factory.end(), {key, f}); + } } bool setup_t::device_exists(const pstring &name) const { - return (m_device_factory.find(name) != m_device_factory.end()); + for (auto &d : m_device_factory) + if (d.first == name) + return true; + return false; } @@ -398,7 +405,7 @@ devices::nld_base_proxy *setup_t::get_d_a_proxy(detail::core_terminal_t &out) { nl_assert(out.is_logic()); - logic_output_t &out_cast = static_cast<logic_output_t &>(out); + auto &out_cast = static_cast<logic_output_t &>(out); devices::nld_base_proxy *proxy = out_cast.get_proxy(); if (proxy == nullptr) @@ -424,7 +431,7 @@ devices::nld_base_proxy *setup_t::get_d_a_proxy(detail::core_terminal_t &out) proxy = new_proxy.get(); - m_netlist.nlstate().add_dev(std::move(new_proxy)); + m_netlist.nlstate().add_dev(new_proxy->name(), std::move(new_proxy)); } return proxy; } @@ -433,7 +440,7 @@ devices::nld_base_proxy *setup_t::get_a_d_proxy(detail::core_terminal_t &inp) { nl_assert(inp.is_logic()); - logic_input_t &incast = dynamic_cast<logic_input_t &>(inp); + auto &incast = dynamic_cast<logic_input_t &>(inp); devices::nld_base_proxy *proxy = incast.get_proxy(); if (proxy != nullptr) @@ -463,7 +470,7 @@ devices::nld_base_proxy *setup_t::get_a_d_proxy(detail::core_terminal_t &inp) inp.net().m_core_terms.clear(); // clear the list } ret->out().net().add_terminal(inp); - m_netlist.nlstate().add_dev(std::move(new_proxy)); + m_netlist.nlstate().add_dev(new_proxy->name(), std::move(new_proxy)); return ret; } } @@ -598,7 +605,7 @@ static detail::core_terminal_t &resolve_proxy(detail::core_terminal_t &term) { if (term.is_logic()) { - logic_t &out = dynamic_cast<logic_t &>(term); + auto &out = dynamic_cast<logic_t &>(term); if (out.has_proxy()) return out.get_proxy()->proxy_term(); } @@ -765,7 +772,7 @@ void setup_t::register_dynamic_log_devices() auto nc = factory().factory_by_name("LOG")->Create(netlist(), name); register_link(name + ".I", ll); log().debug(" dynamic link {1}: <{2}>\n",ll, name); - m_netlist.nlstate().add_dev(std::move(nc)); + m_netlist.nlstate().add_dev(nc->name(), std::move(nc)); } } } @@ -858,7 +865,7 @@ nl_double setup_t::model_value(detail::model_map_t &map, const pstring &entity) { pstring tmp = model_value_str(map, entity); - nl_double factor = NL_FCONST(1.0); + nl_double factor = plib::constants<nl_double>::one; auto p = std::next(tmp.begin(), static_cast<pstring::difference_type>(tmp.size() - 1)); switch (*p) { @@ -874,7 +881,7 @@ nl_double setup_t::model_value(detail::model_map_t &map, const pstring &entity) if (*p < '0' || *p > '9') log().fatal(MF_1_UNKNOWN_NUMBER_FACTOR_IN_1, entity); } - if (factor != NL_FCONST(1.0)) + if (factor != plib::constants<nl_double>::one) tmp = plib::left(tmp, tmp.size() - 1); // FIXME: check for errors return plib::pstonum<nl_double>(tmp) * factor; @@ -883,10 +890,10 @@ nl_double setup_t::model_value(detail::model_map_t &map, const pstring &entity) class logic_family_std_proxy_t : public logic_family_desc_t { public: - logic_family_std_proxy_t() { } - virtual plib::owned_ptr<devices::nld_base_d_to_a_proxy> create_d_a_proxy(netlist_base_t &anetlist, + logic_family_std_proxy_t() = default; + plib::owned_ptr<devices::nld_base_d_to_a_proxy> create_d_a_proxy(netlist_base_t &anetlist, const pstring &name, logic_output_t *proxied) const override; - virtual plib::owned_ptr<devices::nld_base_a_to_d_proxy> create_a_d_proxy(netlist_base_t &anetlist, const pstring &name, logic_input_t *proxied) const override; + plib::owned_ptr<devices::nld_base_a_to_d_proxy> create_a_d_proxy(netlist_base_t &anetlist, const pstring &name, logic_input_t *proxied) const override; }; plib::owned_ptr<devices::nld_base_d_to_a_proxy> logic_family_std_proxy_t::create_d_a_proxy(netlist_base_t &anetlist, @@ -1017,8 +1024,7 @@ void setup_t::prepare_to_run() if ( factory().is_class<devices::NETLIB_NAME(solver)>(e.second) || factory().is_class<devices::NETLIB_NAME(netlistparams)>(e.second)) { - auto dev = plib::owned_ptr<device_t>(e.second->Create(netlist(), e.first)); - m_netlist.nlstate().add_dev(std::move(dev)); + m_netlist.nlstate().add_dev(e.first, plib::owned_ptr<device_t>(e.second->Create(netlist(), e.first))); } } @@ -1036,7 +1042,22 @@ void setup_t::prepare_to_run() && !factory().is_class<devices::NETLIB_NAME(netlistparams)>(e.second)) { auto dev = plib::owned_ptr<device_t>(e.second->Create(netlist(), e.first)); - m_netlist.nlstate().add_dev(std::move(dev)); + m_netlist.nlstate().add_dev(dev->name(), std::move(dev)); + } + } + + log().debug("Looking for unknown parameters ...\n"); + for (auto &p : m_param_values) + { + auto f = m_params.find(p.first); + if (f == m_params.end()) + { + if (plib::endsWith(p.first, pstring(".HINT_NO_DEACTIVATE"))) + { + // FIXME: get device name, check for device + } + else + log().info("Unknown parameter: {}", p.first); } } @@ -1046,18 +1067,18 @@ void setup_t::prepare_to_run() { if (use_deactivate) { - auto p = m_param_values.find(d->name() + ".HINT_NO_DEACTIVATE"); + auto p = m_param_values.find(d.second->name() + ".HINT_NO_DEACTIVATE"); if (p != m_param_values.end()) { //FIXME: check for errors ... - double v = plib::pstonum<double>(p->second); + auto v = plib::pstonum<double>(p->second); if (std::abs(v - std::floor(v)) > 1e-6 ) log().fatal(MF_1_HND_VAL_NOT_SUPPORTED, p->second); - d->set_hint_deactivate(v == 0.0); + d.second->set_hint_deactivate(v == 0.0); } } else - d->set_hint_deactivate(false); + d.second->set_hint_deactivate(false); } /* resolve inputs */ @@ -1113,16 +1134,19 @@ bool source_t::parse(const pstring &name) std::unique_ptr<plib::pistream> source_string_t::stream(const pstring &name) { + plib::unused_var(name); return plib::make_unique_base<plib::pistream, plib::pimemstream>(m_str.c_str(), std::strlen(m_str.c_str())); } std::unique_ptr<plib::pistream> source_mem_t::stream(const pstring &name) { + plib::unused_var(name); return plib::make_unique_base<plib::pistream, plib::pimemstream>(m_str.c_str(), std::strlen(m_str.c_str())); } std::unique_ptr<plib::pistream> source_file_t::stream(const pstring &name) { + plib::unused_var(name); return plib::make_unique_base<plib::pistream, plib::pifilestream>(m_filename); } @@ -1139,9 +1163,10 @@ bool source_proc_t::parse(const pstring &name) std::unique_ptr<plib::pistream> source_proc_t::stream(const pstring &name) { + plib::unused_var(name); std::unique_ptr<plib::pistream> p(nullptr); return p; } -} +} // namespace netlist |