diff options
Diffstat (limited to 'src/lib/netlist/nl_setup.cpp')
-rw-r--r-- | src/lib/netlist/nl_setup.cpp | 119 |
1 files changed, 44 insertions, 75 deletions
diff --git a/src/lib/netlist/nl_setup.cpp b/src/lib/netlist/nl_setup.cpp index c072e917240..b311e4b1a68 100644 --- a/src/lib/netlist/nl_setup.cpp +++ b/src/lib/netlist/nl_setup.cpp @@ -10,10 +10,10 @@ #include "solver/nld_solver.h" #include "plib/palloc.h" +#include "plib/putil.h" #include "nl_base.h" #include "nl_setup.h" #include "nl_parser.h" -#include "nl_util.h" #include "nl_factory.h" #include "devices/net_lib.h" #include "devices/nlid_system.h" @@ -76,7 +76,7 @@ setup_t::~setup_t() pstring::resetmem(); } -ATTR_COLD pstring setup_t::build_fqn(const pstring &obj_name) const +pstring setup_t::build_fqn(const pstring &obj_name) const { if (m_namespace_stack.empty()) //return netlist().name() + "." + obj_name; @@ -181,7 +181,7 @@ void setup_t::register_dippins_arr(const pstring &terms) } } -pstring setup_t::objtype_as_astr(object_t &in) const +pstring setup_t::objtype_as_str(object_t &in) const { switch (in.type()) { @@ -218,7 +218,7 @@ void setup_t::register_and_set_param(pstring name, param_t ¶m) double vald = 0; if (sscanf(val.cstr(), "%lf", &vald) != 1) log().fatal("Invalid number conversion {1} : {2}\n", name, val); - dynamic_cast<param_double_t &>(param).initial(vald); + static_cast<param_double_t &>(param).initial(vald); } break; case param_t::INTEGER: @@ -227,13 +227,13 @@ void setup_t::register_and_set_param(pstring name, param_t ¶m) double vald = 0; if (sscanf(val.cstr(), "%lf", &vald) != 1) log().fatal("Invalid number conversion {1} : {2}\n", name, val); - dynamic_cast<param_int_t &>(param).initial((int) vald); + static_cast<param_int_t &>(param).initial((int) vald); } break; case param_t::STRING: case param_t::MODEL: { - dynamic_cast<param_str_t &>(param).initial(val); + static_cast<param_str_t &>(param).initial(val); } break; default: @@ -244,46 +244,22 @@ void setup_t::register_and_set_param(pstring name, param_t ¶m) log().fatal("Error adding parameter {1} to parameter list\n", name); } -void setup_t::register_object(object_t &obj) +void setup_t::register_term(core_terminal_t &term) { - switch (obj.type()) + if (term.is_type(terminal_t::OUTPUT)) { - case terminal_t::TERMINAL: - case terminal_t::INPUT: - case terminal_t::OUTPUT: - { - core_terminal_t &term = dynamic_cast<core_terminal_t &>(obj); - if (term.isType(terminal_t::OUTPUT)) - { - } - else if (term.isType(terminal_t::INPUT)) - { - static_cast<device_t &>(term.device()).m_terminals.push_back(obj.name()); - } - else - { - static_cast<device_t &>(term.device()).m_terminals.push_back(obj.name()); - } - if (!m_terminals.add(term.name(), &term)) - log().fatal("Error adding {1} {2} to terminal list\n", objtype_as_astr(obj), obj.name()); - log().debug("{1} {2}\n", objtype_as_astr(obj), obj.name()); - } - break; - case terminal_t::NET: - break; - case terminal_t::PARAM: - { - //register_and_set_param(name, dynamic_cast<param_t &>(obj)); - log().fatal("should use register_param"); - } - break; - case terminal_t::DEVICE: - log().fatal("Device registration not yet supported - {1}\n", obj.name()); - break; - case terminal_t::QUEUE: - log().fatal("QUEUE registration not yet supported - {1}\n", obj.name()); - break; } + else if (term.is_type(terminal_t::INPUT)) + { + static_cast<device_t &>(term.device()).m_terminals.push_back(term.name()); + } + else + { + static_cast<device_t &>(term.device()).m_terminals.push_back(term.name()); + } + if (!m_terminals.add(term.name(), &term)) + log().fatal("Error adding {1} {2} to terminal list\n", objtype_as_str(term), term.name()); + log().debug("{1} {2}\n", objtype_as_str(term), term.name()); } void setup_t::register_link_arr(const pstring &terms) @@ -362,7 +338,6 @@ void setup_t::register_frontier(const pstring attach, const double r_IN, const d void setup_t::register_param(const pstring ¶m, const double value) { - // FIXME: there should be a better way register_param(param, plib::pfmt("{1}").e(value,".9")); } @@ -486,7 +461,7 @@ devices::nld_base_proxy *setup_t::get_d_a_proxy(core_terminal_t &out) /* connect all existing terminals to new net */ - for (core_terminal_t *p : out.net().m_core_terms) + for (auto & p : out.net().m_core_terms) { p->clear_net(); // de-link from all nets ... if (!connect(new_proxy->proxy_term(), *p)) @@ -499,7 +474,7 @@ devices::nld_base_proxy *setup_t::get_d_a_proxy(core_terminal_t &out) proxy = new_proxy.get(); - register_dev_s(std::move(new_proxy)); + register_dev(std::move(new_proxy)); } return proxy; } @@ -517,7 +492,7 @@ void setup_t::connect_input_output(core_terminal_t &in, core_terminal_t &out) proxy->m_Q.net().register_con(in); out.net().register_con(proxy->m_I); - register_dev_s(std::move(proxy)); + register_dev(std::move(proxy)); } else if (out.is_logic() && in.is_analog()) @@ -560,7 +535,7 @@ void setup_t::connect_terminal_input(terminal_t &term, core_terminal_t &inp) else proxy->m_Q.net().register_con(inp); - register_dev_s(std::move(proxy)); + register_dev(std::move(proxy)); } else { @@ -640,9 +615,9 @@ bool setup_t::connect_input_input(core_terminal_t &t1, core_terminal_t &t2) ret = connect(t2, t1.net().railterminal()); if (!ret) { - for (core_terminal_t *t : t1.net().m_core_terms) + for (auto & t : t1.net().m_core_terms) { - if (t->isType(core_terminal_t::TERMINAL)) + if (t->is_type(core_terminal_t::TERMINAL)) ret = connect(t2, *t); if (ret) break; @@ -655,9 +630,9 @@ bool setup_t::connect_input_input(core_terminal_t &t1, core_terminal_t &t2) ret = connect(t1, t2.net().railterminal()); if (!ret) { - for (core_terminal_t *t : t2.net().m_core_terms) + for (auto & t : t2.net().m_core_terms) { - if (t->isType(core_terminal_t::TERMINAL)) + if (t->is_type(core_terminal_t::TERMINAL)) ret = connect(t1, *t); if (ret) break; @@ -676,39 +651,39 @@ bool setup_t::connect(core_terminal_t &t1_in, core_terminal_t &t2_in) core_terminal_t &t2 = resolve_proxy(t2_in); bool ret = true; - if (t1.isType(core_terminal_t::OUTPUT) && t2.isType(core_terminal_t::INPUT)) + if (t1.is_type(core_terminal_t::OUTPUT) && t2.is_type(core_terminal_t::INPUT)) { if (t2.has_net() && t2.net().isRailNet()) log().fatal("Input {1} already connected\n", t2.name()); connect_input_output(t2, t1); } - else if (t1.isType(core_terminal_t::INPUT) && t2.isType(core_terminal_t::OUTPUT)) + else if (t1.is_type(core_terminal_t::INPUT) && t2.is_type(core_terminal_t::OUTPUT)) { if (t1.has_net() && t1.net().isRailNet()) log().fatal("Input {1} already connected\n", t1.name()); connect_input_output(t1, t2); } - else if (t1.isType(core_terminal_t::OUTPUT) && t2.isType(core_terminal_t::TERMINAL)) + else if (t1.is_type(core_terminal_t::OUTPUT) && t2.is_type(core_terminal_t::TERMINAL)) { connect_terminal_output(dynamic_cast<terminal_t &>(t2), t1); } - else if (t1.isType(core_terminal_t::TERMINAL) && t2.isType(core_terminal_t::OUTPUT)) + else if (t1.is_type(core_terminal_t::TERMINAL) && t2.is_type(core_terminal_t::OUTPUT)) { connect_terminal_output(dynamic_cast<terminal_t &>(t1), t2); } - else if (t1.isType(core_terminal_t::INPUT) && t2.isType(core_terminal_t::TERMINAL)) + else if (t1.is_type(core_terminal_t::INPUT) && t2.is_type(core_terminal_t::TERMINAL)) { connect_terminal_input(dynamic_cast<terminal_t &>(t2), t1); } - else if (t1.isType(core_terminal_t::TERMINAL) && t2.isType(core_terminal_t::INPUT)) + else if (t1.is_type(core_terminal_t::TERMINAL) && t2.is_type(core_terminal_t::INPUT)) { connect_terminal_input(dynamic_cast<terminal_t &>(t1), t2); } - else if (t1.isType(core_terminal_t::TERMINAL) && t2.isType(core_terminal_t::TERMINAL)) + else if (t1.is_type(core_terminal_t::TERMINAL) && t2.is_type(core_terminal_t::TERMINAL)) { connect_terminals(dynamic_cast<terminal_t &>(t1), dynamic_cast<terminal_t &>(t2)); } - else if (t1.isType(core_terminal_t::INPUT) && t2.isType(core_terminal_t::INPUT)) + else if (t1.is_type(core_terminal_t::INPUT) && t2.is_type(core_terminal_t::INPUT)) { ret = connect_input_input(t1, t2); } @@ -748,8 +723,8 @@ void setup_t::resolve_inputs() } if (tries == 0) { - for (std::size_t i = 0; i < m_links.size(); i++ ) - log().warning("Error connecting {1} to {2}\n", m_links[i].first, m_links[i].second); + for (auto & link : m_links) + log().warning("Error connecting {1} to {2}\n", link.first, link.second); log().fatal("Error connecting -- bailing out\n"); } @@ -792,17 +767,12 @@ void setup_t::resolve_inputs() log().verbose("looking for two terms connected to rail nets ...\n"); - // FIXME: doesn't find internal devices. This needs to be more clever - for (std::size_t i=0; i < netlist().m_devices.size(); i++) + for (auto & t : netlist().get_device_list<devices::NETLIB_NAME(twoterm)>()) { - devices::NETLIB_NAME(twoterm) *t = dynamic_cast<devices::NETLIB_NAME(twoterm) *>(netlist().m_devices[i].get()); - if (t != nullptr) - { - has_twoterms = true; - if (t->m_N.net().isRailNet() && t->m_P.net().isRailNet()) - log().warning("Found device {1} connected only to railterminals {2}/{3}\n", - t->name(), t->m_N.net().name(), t->m_P.net().name()); - } + has_twoterms = true; + if (t->m_N.net().isRailNet() && t->m_P.net().isRailNet()) + log().warning("Found device {1} connected only to railterminals {2}/{3}\n", + t->name(), t->m_N.net().name(), t->m_P.net().name()); } log().verbose("initialize solver ...\n"); @@ -825,7 +795,7 @@ void setup_t::resolve_inputs() void setup_t::start_devices() { - pstring env = nl_util::environment("NL_LOGS"); + pstring env = plib::util::environment("NL_LOGS"); if (env != "") { @@ -837,11 +807,10 @@ void setup_t::start_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); - register_dev_s(std::move(nc)); + register_dev(std::move(nc)); } } - netlist().start(); } |