diff options
author | 2019-11-04 22:04:11 +0100 | |
---|---|---|
committer | 2019-11-04 22:04:11 +0100 | |
commit | 2cf61b2e4c72a80eb688d1b6ffcacfdeaf55bf26 (patch) | |
tree | 0d056f80f69db1a17a680c6e3d8fac06aa6b3e45 /src/lib/netlist/nl_setup.cpp | |
parent | e89f009945652ea15d941d4491cb8d9c0d2e3b65 (diff) |
netlist: code maintenance. (nw)
- more const
- explicitly raise exceptions instead of leaving this to log.fatal()
- correct a number of cppcheck findings.
- dead code removal
- clang lint corrections, e.g. include order
Diffstat (limited to 'src/lib/netlist/nl_setup.cpp')
-rw-r--r-- | src/lib/netlist/nl_setup.cpp | 93 |
1 files changed, 76 insertions, 17 deletions
diff --git a/src/lib/netlist/nl_setup.cpp b/src/lib/netlist/nl_setup.cpp index 37eb34c5f97..67f441674b0 100644 --- a/src/lib/netlist/nl_setup.cpp +++ b/src/lib/netlist/nl_setup.cpp @@ -41,7 +41,10 @@ namespace netlist { std::vector<pstring> list(plib::psplit(terms,", ")); if (list.size() == 0 || (list.size() % 2) == 1) + { log().fatal(MF_DIP_PINS_MUST_BE_AN_EQUAL_NUMBER_OF_PINS_1(build_fqn(""))); + plib::pthrow<nl_exception>(MF_DIP_PINS_MUST_BE_AN_EQUAL_NUMBER_OF_PINS_1(build_fqn(""))); + } std::size_t n = list.size(); for (std::size_t i = 0; i < n / 2; i++) { @@ -54,14 +57,20 @@ namespace netlist { auto f = m_factory.factory_by_name(classname); if (f == nullptr) + { log().fatal(MF_CLASS_1_NOT_FOUND(classname)); + plib::pthrow<nl_exception>(MF_CLASS_1_NOT_FOUND(classname)); + } else { /* make sure we parse macro library entries */ f->macro_actions(*this, name); pstring key = build_fqn(name); if (device_exists(key)) + { log().fatal(MF_DEVICE_ALREADY_EXISTS_1(name)); + plib::pthrow<nl_exception>(MF_DEVICE_ALREADY_EXISTS_1(name)); + } else m_device_factory.insert(m_device_factory.end(), {key, f}); } @@ -76,7 +85,10 @@ namespace netlist { std::vector<pstring> list(plib::psplit(terms,", ")); if (list.size() < 2) + { log().fatal(MF_NET_C_NEEDS_AT_LEAST_2_TERMINAL()); + plib::pthrow<nl_exception>(MF_NET_C_NEEDS_AT_LEAST_2_TERMINAL()); + } for (std::size_t i = 1; i < list.size(); i++) { register_link(list[0], list[i]); @@ -85,21 +97,13 @@ namespace netlist void nlparse_t::include(const pstring &netlist_name) { -#if 0 - for (auto &base : m_sources) - { - auto source(dynamic_cast<source_netlist_t *>(base.get())); - if (source && source->parse(*this, netlist_name)) - return; - } - log().fatal(MF_NOT_FOUND_IN_SOURCE_COLLECTION(netlist_name)); -#endif if (m_sources.for_all<source_netlist_t>([this, &netlist_name] (source_netlist_t *src) { return src->parse(*this, netlist_name); })) return; log().fatal(MF_NOT_FOUND_IN_SOURCE_COLLECTION(netlist_name)); + plib::pthrow<nl_exception>(MF_NOT_FOUND_IN_SOURCE_COLLECTION(netlist_name)); } @@ -134,7 +138,10 @@ namespace netlist if (idx == m_param_values.end()) { if (!m_param_values.insert({fqn, value}).second) + { log().fatal(MF_ADDING_PARAMETER_1_TO_PARAMETER_LIST(param)); + plib::pthrow<nl_exception>(MF_ADDING_PARAMETER_1_TO_PARAMETER_LIST(param)); + } } else { @@ -174,7 +181,10 @@ namespace netlist } } if (!found) + { log().fatal(MF_FOUND_NO_OCCURRENCE_OF_1(attach)); + plib::pthrow<nl_exception>(MF_FOUND_NO_OCCURRENCE_OF_1(attach)); + } register_link(attach, frontier_name + ".Q"); } @@ -196,7 +206,11 @@ namespace netlist void nlparse_t::register_alias_nofqn(const pstring &alias, const pstring &out) { if (!m_alias.insert({alias, out}).second) + { log().fatal(MF_ADDING_ALI1_TO_ALIAS_LIST(alias)); + plib::pthrow<nl_exception>(MF_ADDING_ALI1_TO_ALIAS_LIST(alias)); + } + } void nlparse_t::register_link_fqn(const pstring &sin, const pstring &sout) @@ -245,10 +259,6 @@ setup_t::setup_t(netlist_state_t &nlstate) { } -setup_t::~setup_t() noexcept -{ -} - pstring setup_t::termtype_as_str(detail::core_terminal_t &in) const { switch (in.type()) @@ -260,8 +270,9 @@ pstring setup_t::termtype_as_str(detail::core_terminal_t &in) const case detail::terminal_type::OUTPUT: return "OUTPUT"; } - log().fatal(MF_UNKNOWN_OBJECT_TYPE_1(static_cast<unsigned>(in.type()))); - return "Error"; + // FIXME: in.type() will have thrown already + // log().fatal(MF_UNKNOWN_OBJECT_TYPE_1(static_cast<unsigned>(in.type()))); + return "Error"; // Tease gcc } pstring setup_t::get_initial_param_val(const pstring &name, const pstring &def) const @@ -275,11 +286,12 @@ pstring setup_t::get_initial_param_val(const pstring &name, const pstring &def) void setup_t::register_term(detail::core_terminal_t &term) { + log().debug("{1} {2}\n", termtype_as_str(term), term.name()); if (!m_terminals.insert({term.name(), &term}).second) { log().fatal(MF_ADDING_1_2_TO_TERMINAL_LIST(termtype_as_str(term), term.name())); + plib::pthrow<nl_exception>(MF_ADDING_1_2_TO_TERMINAL_LIST(termtype_as_str(term), term.name())); } - log().debug("{1} {2}\n", termtype_as_str(term), term.name()); } void setup_t::remove_connections(const pstring &pin) @@ -299,13 +311,19 @@ void setup_t::remove_connections(const pstring &pin) link++; } if (!found) + { log().fatal(MF_FOUND_NO_OCCURRENCE_OF_1(pin)); + plib::pthrow<nl_exception>(MF_FOUND_NO_OCCURRENCE_OF_1(pin)); + } } void setup_t::register_param_t(const pstring &name, param_t ¶m) { if (!m_params.insert({param.name(), param_ref_t(param.name(), param.device(), param)}).second) + { log().fatal(MF_ADDING_PARAMETER_1_TO_PARAMETER_LIST(name)); + plib::pthrow<nl_exception>(MF_ADDING_PARAMETER_1_TO_PARAMETER_LIST(name)); + } } pstring setup_t::resolve_alias(const pstring &name) const @@ -398,7 +416,10 @@ detail::core_terminal_t *setup_t::find_terminal(const pstring &terminal_in, bool detail::core_terminal_t *term = (ret == m_terminals.end() ? nullptr : ret->second); if (term == nullptr && required) + { log().fatal(MF_TERMINAL_1_2_NOT_FOUND(terminal_in, tname)); + plib::pthrow<nl_exception>(MF_TERMINAL_1_2_NOT_FOUND(terminal_in, tname)); + } if (term != nullptr) log().debug("Found input {1}\n", tname); return term; @@ -416,14 +437,19 @@ detail::core_terminal_t *setup_t::find_terminal(const pstring &terminal_in, ret = m_terminals.find(tname + ".Q"); } if (ret == m_terminals.end() && required) + { log().fatal(MF_TERMINAL_1_2_NOT_FOUND(terminal_in, tname)); - + plib::pthrow<nl_exception>(MF_TERMINAL_1_2_NOT_FOUND(terminal_in, tname)); + } detail::core_terminal_t *term = (ret == m_terminals.end() ? nullptr : ret->second); if (term != nullptr && term->type() != atype) { if (required) + { log().fatal(MF_OBJECT_1_2_WRONG_TYPE(terminal_in, tname)); + plib::pthrow<nl_exception>(MF_OBJECT_1_2_WRONG_TYPE(terminal_in, tname)); + } else term = nullptr; } @@ -440,7 +466,10 @@ param_t *setup_t::find_param(const pstring ¶m_in, bool required) const const pstring &outname = resolve_alias(param_in_fqn); auto ret = m_params.find(outname); if (ret == m_params.end() && required) + { log().fatal(MF_PARAMETER_1_2_NOT_FOUND(param_in_fqn, outname)); + plib::pthrow<nl_exception>(MF_PARAMETER_1_2_NOT_FOUND(param_in_fqn, outname)); + } if (ret != m_params.end()) log().debug("Found parameter {1}\n", outname); return (ret == m_params.end() ? nullptr : &ret->second.m_param); @@ -466,8 +495,12 @@ devices::nld_base_proxy *setup_t::get_d_a_proxy(detail::core_terminal_t &out) { p->clear_net(); // de-link from all nets ... if (!connect(new_proxy->proxy_term(), *p)) + { log().fatal(MF_CONNECTING_1_TO_2( new_proxy->proxy_term().name(), (*p).name())); + plib::pthrow<nl_exception>(MF_CONNECTING_1_TO_2( + new_proxy->proxy_term().name(), (*p).name())); + } } out.net().core_terms().clear(); // clear the list @@ -509,8 +542,13 @@ devices::nld_base_proxy *setup_t::get_a_d_proxy(detail::core_terminal_t &inp) { p->clear_net(); // de-link from all nets ... if (!connect(ret->proxy_term(), *p)) + { log().fatal(MF_CONNECTING_1_TO_2( ret->proxy_term().name(), (*p).name())); + plib::pthrow<nl_exception>(MF_CONNECTING_1_TO_2( + ret->proxy_term().name(), (*p).name())); + + } } inp.net().core_terms().clear(); // clear the list } @@ -530,7 +568,10 @@ void setup_t::merge_nets(detail::net_t &thisnet, detail::net_t &othernet) } if (thisnet.isRailNet() && othernet.isRailNet()) + { log().fatal(MF_MERGE_RAIL_NETS_1_AND_2(thisnet.name(), othernet.name())); + plib::pthrow<nl_exception>(MF_MERGE_RAIL_NETS_1_AND_2(thisnet.name(), othernet.name())); + } if (othernet.isRailNet()) { @@ -589,6 +630,7 @@ void setup_t::connect_terminal_input(terminal_t &term, detail::core_terminal_t & else { log().fatal(MF_OBJECT_INPUT_TYPE_1(inp.name())); + plib::pthrow<nl_exception>(MF_OBJECT_INPUT_TYPE_1(inp.name())); } } @@ -613,6 +655,7 @@ void setup_t::connect_terminal_output(terminal_t &in, detail::core_terminal_t &o else { log().fatal(MF_OBJECT_OUTPUT_TYPE_1(out.name())); + plib::pthrow<nl_exception>(MF_OBJECT_OUTPUT_TYPE_1(out.name())); } } @@ -703,13 +746,19 @@ bool setup_t::connect(detail::core_terminal_t &t1_in, detail::core_terminal_t &t if (t1.is_type(detail::terminal_type::OUTPUT) && t2.is_type(detail::terminal_type::INPUT)) { if (t2.has_net() && t2.net().isRailNet()) + { log().fatal(MF_INPUT_1_ALREADY_CONNECTED(t2.name())); + plib::pthrow<nl_exception>(MF_INPUT_1_ALREADY_CONNECTED(t2.name())); + } connect_input_output(t2, t1); } else if (t1.is_type(detail::terminal_type::INPUT) && t2.is_type(detail::terminal_type::OUTPUT)) { if (t1.has_net() && t1.net().isRailNet()) + { log().fatal(MF_INPUT_1_ALREADY_CONNECTED(t1.name())); + plib::pthrow<nl_exception>(MF_INPUT_1_ALREADY_CONNECTED(t1.name())); + } connect_input_output(t1, t2); } else if (t1.is_type(detail::terminal_type::OUTPUT) && t2.is_type(detail::terminal_type::TERMINAL)) @@ -774,6 +823,7 @@ void setup_t::resolve_inputs() log().warning(MF_CONNECTING_1_TO_2(setup().de_alias(link.first), setup().de_alias(link.second))); log().fatal(MF_LINK_TRIES_EXCEEDED(m_netlist_params->m_max_link_loops())); + plib::pthrow<nl_exception>(MF_LINK_TRIES_EXCEEDED(m_netlist_params->m_max_link_loops())); } log().verbose("deleting empty nets ..."); @@ -808,7 +858,10 @@ void setup_t::resolve_inputs() } } if (err) + { log().fatal(MF_TERMINALS_WITHOUT_NET()); + plib::pthrow<nl_exception>(MF_TERMINALS_WITHOUT_NET()); + } } @@ -1125,7 +1178,10 @@ void setup_t::prepare_to_run() bool err(false); auto v = plib::pstonum_ne<nl_fptype>(p->second, err); if (err || plib::abs(v - plib::floor(v)) > nlconst::magic(1e-6) ) + { log().fatal(MF_HND_VAL_NOT_SUPPORTED(p->second)); + plib::pthrow<nl_exception>(MF_HND_VAL_NOT_SUPPORTED(p->second)); + } // FIXME comparison with zero d.second->set_hint_deactivate(v == nlconst::zero()); } @@ -1164,7 +1220,10 @@ void setup_t::prepare_to_run() { for (auto &p : m_nlstate.nets()) if (p->is_analog()) + { log().fatal(MF_NO_SOLVER()); + plib::pthrow<nl_exception>(MF_NO_SOLVER()); + } } else solver->post_start(); |