diff options
Diffstat (limited to 'src/lib/netlist/nl_setup.cpp')
-rw-r--r-- | src/lib/netlist/nl_setup.cpp | 152 |
1 files changed, 50 insertions, 102 deletions
diff --git a/src/lib/netlist/nl_setup.cpp b/src/lib/netlist/nl_setup.cpp index 8aa30c9d945..8048b7db46a 100644 --- a/src/lib/netlist/nl_setup.cpp +++ b/src/lib/netlist/nl_setup.cpp @@ -138,8 +138,8 @@ bool setup_t::device_exists(const pstring name) const void setup_t::register_model(const pstring &model_in) { - int pos = model_in.find(" "); - if (pos < 0) + auto pos = model_in.find(" "); + if (pos == model_in.end()) log().fatal("Unable to parse model: {1}", model_in); pstring model = model_in.left(pos).trim().ucase(); pstring def = model_in.substr(pos + 1).trim(); @@ -165,15 +165,15 @@ void setup_t::register_dippins_arr(const pstring &terms) plib::pstring_vector_t list(terms,", "); if (list.size() == 0 || (list.size() % 2) == 1) log().fatal("You must pass an equal number of pins to DIPPINS"); - unsigned n = list.size(); - for (unsigned i = 0; i < n / 2; i++) + std::size_t n = list.size(); + for (std::size_t i = 0; i < n / 2; i++) { register_alias(plib::pfmt("{1}")(i+1), list[i * 2]); register_alias(plib::pfmt("{1}")(n-i), list[i * 2 + 1]); } } -pstring setup_t::objtype_as_str(device_object_t &in) const +pstring setup_t::objtype_as_str(detail::device_object_t &in) const { switch (in.type()) { @@ -187,7 +187,7 @@ pstring setup_t::objtype_as_str(device_object_t &in) const return "PARAM"; } // FIXME: noreturn - log().fatal("Unknown object type {1}\n", (unsigned) in.type()); + log().fatal("Unknown object type {1}\n", static_cast<unsigned>(in.type())); return "Error"; } @@ -214,7 +214,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); - static_cast<param_int_t &>(param).initial((int) vald); + static_cast<param_int_t &>(param).initial(static_cast<int>(vald)); } break; case param_t::STRING: @@ -224,14 +224,14 @@ void setup_t::register_and_set_param(pstring name, param_t ¶m) } break; //default: - // log().fatal("Parameter is not supported {1} : {2}\n", name, val); + // log().fatal("Parameter is not supported {1} : {2}\n", name, val); } } if (!m_params.insert({param.name(), param_ref_t(param.name(), param.device(), param)}).second) log().fatal("Error adding parameter {1} to parameter list\n", name); } -void setup_t::register_term(core_terminal_t &term) +void setup_t::register_term(detail::core_terminal_t &term) { if (!m_terminals.insert({term.name(), &term}).second) log().fatal("Error adding {1} {2} to terminal list\n", objtype_as_str(term), term.name()); @@ -351,7 +351,7 @@ const pstring setup_t::resolve_alias(const pstring &name) const return ret; } -core_terminal_t *setup_t::find_terminal(const pstring &terminal_in, bool required) +detail::core_terminal_t *setup_t::find_terminal(const pstring &terminal_in, bool required) { const pstring &tname = resolve_alias(terminal_in); auto ret = m_terminals.find(tname); @@ -362,7 +362,7 @@ core_terminal_t *setup_t::find_terminal(const pstring &terminal_in, bool require ret = m_terminals.find(tname + ".Q"); } - core_terminal_t *term = (ret == m_terminals.end() ? nullptr : ret->second); + detail::core_terminal_t *term = (ret == m_terminals.end() ? nullptr : ret->second); if (term == nullptr && required) log().fatal("terminal {1}({2}) not found!\n", terminal_in, tname); @@ -371,12 +371,13 @@ core_terminal_t *setup_t::find_terminal(const pstring &terminal_in, bool require return term; } -core_terminal_t *setup_t::find_terminal(const pstring &terminal_in, device_object_t::type_t atype, bool required) +detail::core_terminal_t *setup_t::find_terminal(const pstring &terminal_in, + detail::device_object_t::type_t atype, bool required) { const pstring &tname = resolve_alias(terminal_in); auto ret = m_terminals.find(tname); /* look for default */ - if (ret == m_terminals.end() && atype == device_object_t::OUTPUT) + if (ret == m_terminals.end() && atype == detail::device_object_t::OUTPUT) { /* look for ".Q" std output */ ret = m_terminals.find(tname + ".Q"); @@ -384,7 +385,7 @@ core_terminal_t *setup_t::find_terminal(const pstring &terminal_in, device_objec if (ret == m_terminals.end() && required) log().fatal("terminal {1}({2}) not found!\n", terminal_in, tname); - core_terminal_t *term = (ret == m_terminals.end() ? nullptr : ret->second); + detail::core_terminal_t *term = (ret == m_terminals.end() ? nullptr : ret->second); if (term != nullptr && term->type() != atype) { @@ -413,7 +414,7 @@ param_t *setup_t::find_param(const pstring ¶m_in, bool required) const } // FIXME avoid dynamic cast here -devices::nld_base_proxy *setup_t::get_d_a_proxy(core_terminal_t &out) +devices::nld_base_proxy *setup_t::get_d_a_proxy(detail::core_terminal_t &out) { nl_assert(out.is_logic()); @@ -450,7 +451,7 @@ devices::nld_base_proxy *setup_t::get_d_a_proxy(core_terminal_t &out) return proxy; } -void setup_t::connect_input_output(core_terminal_t &in, core_terminal_t &out) +void setup_t::connect_input_output(detail::core_terminal_t &in, detail::core_terminal_t &out) { if (out.is_analog() && in.is_logic()) { @@ -483,7 +484,7 @@ void setup_t::connect_input_output(core_terminal_t &in, core_terminal_t &out) } -void setup_t::connect_terminal_input(terminal_t &term, core_terminal_t &inp) +void setup_t::connect_terminal_input(terminal_t &term, detail::core_terminal_t &inp) { if (inp.is_analog()) { @@ -514,7 +515,7 @@ void setup_t::connect_terminal_input(terminal_t &term, core_terminal_t &inp) } } -void setup_t::connect_terminal_output(terminal_t &in, core_terminal_t &out) +void setup_t::connect_terminal_output(terminal_t &in, detail::core_terminal_t &out) { if (out.is_analog()) { @@ -538,7 +539,7 @@ void setup_t::connect_terminal_output(terminal_t &in, core_terminal_t &out) } } -void setup_t::connect_terminals(core_terminal_t &t1, core_terminal_t &t2) +void setup_t::connect_terminals(detail::core_terminal_t &t1, detail::core_terminal_t &t2) { if (t1.has_net() && t2.has_net()) { @@ -566,7 +567,7 @@ void setup_t::connect_terminals(core_terminal_t &t1, core_terminal_t &t2) } } -static core_terminal_t &resolve_proxy(core_terminal_t &term) +static detail::core_terminal_t &resolve_proxy(detail::core_terminal_t &term) { if (term.is_logic()) { @@ -577,7 +578,7 @@ static core_terminal_t &resolve_proxy(core_terminal_t &term) return term; } -bool setup_t::connect_input_input(core_terminal_t &t1, core_terminal_t &t2) +bool setup_t::connect_input_input(detail::core_terminal_t &t1, detail::core_terminal_t &t2) { bool ret = false; if (t1.has_net()) @@ -588,7 +589,7 @@ bool setup_t::connect_input_input(core_terminal_t &t1, core_terminal_t &t2) { for (auto & t : t1.net().m_core_terms) { - if (t->is_type(core_terminal_t::TERMINAL)) + if (t->is_type(detail::core_terminal_t::TERMINAL)) ret = connect(t2, *t); if (ret) break; @@ -603,7 +604,7 @@ bool setup_t::connect_input_input(core_terminal_t &t1, core_terminal_t &t2) { for (auto & t : t2.net().m_core_terms) { - if (t->is_type(core_terminal_t::TERMINAL)) + if (t->is_type(detail::core_terminal_t::TERMINAL)) ret = connect(t1, *t); if (ret) break; @@ -615,46 +616,46 @@ bool setup_t::connect_input_input(core_terminal_t &t1, core_terminal_t &t2) -bool setup_t::connect(core_terminal_t &t1_in, core_terminal_t &t2_in) +bool setup_t::connect(detail::core_terminal_t &t1_in, detail::core_terminal_t &t2_in) { log().debug("Connecting {1} to {2}\n", t1_in.name(), t2_in.name()); - core_terminal_t &t1 = resolve_proxy(t1_in); - core_terminal_t &t2 = resolve_proxy(t2_in); + detail::core_terminal_t &t1 = resolve_proxy(t1_in); + detail::core_terminal_t &t2 = resolve_proxy(t2_in); bool ret = true; - if (t1.is_type(core_terminal_t::OUTPUT) && t2.is_type(core_terminal_t::INPUT)) + if (t1.is_type(detail::core_terminal_t::OUTPUT) && t2.is_type(detail::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.is_type(core_terminal_t::INPUT) && t2.is_type(core_terminal_t::OUTPUT)) + else if (t1.is_type(detail::core_terminal_t::INPUT) && t2.is_type(detail::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.is_type(core_terminal_t::OUTPUT) && t2.is_type(core_terminal_t::TERMINAL)) + else if (t1.is_type(detail::core_terminal_t::OUTPUT) && t2.is_type(detail::core_terminal_t::TERMINAL)) { connect_terminal_output(dynamic_cast<terminal_t &>(t2), t1); } - else if (t1.is_type(core_terminal_t::TERMINAL) && t2.is_type(core_terminal_t::OUTPUT)) + else if (t1.is_type(detail::core_terminal_t::TERMINAL) && t2.is_type(detail::core_terminal_t::OUTPUT)) { connect_terminal_output(dynamic_cast<terminal_t &>(t1), t2); } - else if (t1.is_type(core_terminal_t::INPUT) && t2.is_type(core_terminal_t::TERMINAL)) + else if (t1.is_type(detail::core_terminal_t::INPUT) && t2.is_type(detail::core_terminal_t::TERMINAL)) { connect_terminal_input(dynamic_cast<terminal_t &>(t2), t1); } - else if (t1.is_type(core_terminal_t::TERMINAL) && t2.is_type(core_terminal_t::INPUT)) + else if (t1.is_type(detail::core_terminal_t::TERMINAL) && t2.is_type(detail::core_terminal_t::INPUT)) { connect_terminal_input(dynamic_cast<terminal_t &>(t1), t2); } - else if (t1.is_type(core_terminal_t::TERMINAL) && t2.is_type(core_terminal_t::TERMINAL)) + else if (t1.is_type(detail::core_terminal_t::TERMINAL) && t2.is_type(detail::core_terminal_t::TERMINAL)) { connect_terminals(dynamic_cast<terminal_t &>(t1), dynamic_cast<terminal_t &>(t2)); } - else if (t1.is_type(core_terminal_t::INPUT) && t2.is_type(core_terminal_t::INPUT)) + else if (t1.is_type(detail::core_terminal_t::INPUT) && t2.is_type(detail::core_terminal_t::INPUT)) { ret = connect_input_input(t1, t2); } @@ -682,8 +683,8 @@ void setup_t::resolve_inputs() { const pstring t1s = li->first; const pstring t2s = li->second; - core_terminal_t *t1 = find_terminal(t1s); - core_terminal_t *t2 = find_terminal(t2s); + detail::core_terminal_t *t1 = find_terminal(t1s); + detail::core_terminal_t *t2 = find_terminal(t2s); if (connect(*t1, *t2)) li = m_links.erase(li); @@ -720,7 +721,7 @@ void setup_t::resolve_inputs() log().verbose("looking for terminals not connected ..."); for (auto & i : m_terminals) { - core_terminal_t *term = i.second; + detail::core_terminal_t *term = i.second; if (!term->has_net() && dynamic_cast< devices::NETLIB_NAME(dummy_input) *>(&term->device()) != nullptr) log().warning("Found dummy terminal {1} without connections", term->name()); else if (!term->has_net()) @@ -777,61 +778,7 @@ void setup_t::start_devices() } } - /* make sure the solver and parameters are started first! */ - - for (auto & e : m_device_factory) - { - if ( factory().is_class<devices::NETLIB_NAME(mainclock)>(e.second) - || factory().is_class<devices::NETLIB_NAME(solver)>(e.second) - || factory().is_class<devices::NETLIB_NAME(gnd)>(e.second) - || factory().is_class<devices::NETLIB_NAME(netlistparams)>(e.second)) - { - auto dev = plib::owned_ptr<device_t>(e.second->Create(netlist(), e.first)); - netlist().register_dev(std::move(dev)); - } - } - - log().debug("Searching for mainclock and solver ...\n"); - - netlist().m_mainclock = netlist().get_single_device<devices::NETLIB_NAME(mainclock)>("mainclock"); - netlist().m_solver = netlist().get_single_device<devices::NETLIB_NAME(solver)>("solver"); - netlist().m_gnd = netlist().get_single_device<devices::NETLIB_NAME(gnd)>("gnd"); - netlist().m_params = netlist().get_single_device<devices::NETLIB_NAME(netlistparams)>("parameter"); - - /* create devices */ - - for (auto & e : m_device_factory) - { - if ( !factory().is_class<devices::NETLIB_NAME(mainclock)>(e.second) - && !factory().is_class<devices::NETLIB_NAME(solver)>(e.second) - && !factory().is_class<devices::NETLIB_NAME(gnd)>(e.second) - && !factory().is_class<devices::NETLIB_NAME(netlistparams)>(e.second)) - { - auto dev = plib::owned_ptr<device_t>(e.second->Create(netlist(), e.first)); - netlist().register_dev(std::move(dev)); - } - } - - bool use_deactivate = (netlist().m_params->m_use_deactivate.Value() ? true : false); - - for (auto &d : netlist().m_devices) - { - if (use_deactivate) - { - auto p = m_param_values.find(d->name() + ".HINT_NO_DEACTIVATE"); - if (p != m_param_values.end()) - { - //FIXME: Error checking - auto v = p->second.as_long(); - d->set_hint_deactivate(!v); - } - } - else - d->set_hint_deactivate(false); - } - netlist().start(); - } plib::plog_base<NL_DEBUG> &setup_t::log() @@ -901,13 +848,13 @@ static pstring model_string(model_map_t &map) void setup_t::model_parse(const pstring &model_in, model_map_t &map) { pstring model = model_in; - int pos = 0; + pstring::iterator pos(nullptr); pstring key; while (true) { pos = model.find("("); - if (pos >= 0) break; + if (pos != model.end()) break; key = model.ucase(); auto i = m_models.find(key); @@ -931,13 +878,14 @@ void setup_t::model_parse(const pstring &model_in, model_map_t &map) pstring remainder=model.substr(pos+1).trim(); if (!remainder.endsWith(")")) log().fatal("Model error {1}\n", model); - remainder = remainder.left(remainder.len() - 1); + // FIMXE: Not optimal + remainder = remainder.left(remainder.begin() + (remainder.len() - 1)); plib::pstring_vector_t pairs(remainder," ", true); for (pstring &pe : pairs) { - int pose = pe.find("="); - if (pose < 0) + auto pose = pe.find("="); + if (pose == pe.end()) log().fatal("Model error on pair {1}\n", model); map[pe.left(pose).ucase()] = pe.substr(pose+1); } @@ -962,8 +910,8 @@ nl_double setup_t::model_value(model_map_t &map, const pstring &entity) pstring tmp = model_value_str(map, entity); nl_double factor = NL_FCONST(1.0); - pstring numfac = tmp.right(1); - switch (numfac.code_at(0)) + auto p = tmp.begin() + (tmp.len() - 1); + switch (*p) { case 'M': factor = 1e6; break; case 'k': factor = 1e3; break; @@ -974,11 +922,11 @@ nl_double setup_t::model_value(model_map_t &map, const pstring &entity) case 'f': factor = 1e-15; break; case 'a': factor = 1e-18; break; default: - if (numfac < "0" || numfac > "9") - nl_exception(plib::pfmt("Unknown number factor <{1}> in: {2}")(numfac)(entity)); + if (*p < '0' || *p > '9') + nl_exception(plib::pfmt("Unknown number factor in: {1}")(entity)); } if (factor != NL_FCONST(1.0)) - tmp = tmp.left(tmp.len() - 1); + tmp = tmp.left(tmp.begin() + (tmp.len() - 1)); return tmp.as_double() * factor; } @@ -1013,7 +961,7 @@ bool setup_t::parse_stream(plib::pistream &istrm, const pstring &name) void setup_t::register_define(pstring defstr) { auto p = defstr.find("="); - if (p>0) + if (p != defstr.end()) register_define(defstr.left(p), defstr.substr(p+1)); else register_define(defstr, "1"); |