diff options
| author | 2016-06-18 17:15:17 +0200 | |
|---|---|---|
| committer | 2016-06-18 17:15:17 +0200 | |
| commit | b4beaa37b744c8b2804ff398e373e035a7e8941c (patch) | |
| tree | 93b7a1edcfb25197fce1028959f1f494fa3d461b /src/lib/netlist/nl_setup.cpp | |
| parent | 0213201d1d902f7f166afd8f0ded227b009dfc07 (diff) | |
| parent | 1ad39fd8250863ff4c7f90e84d971db006085a17 (diff) | |
Merge remote-tracking branch 'mainline/master'
Diffstat (limited to 'src/lib/netlist/nl_setup.cpp')
| -rw-r--r-- | src/lib/netlist/nl_setup.cpp | 143 |
1 files changed, 59 insertions, 84 deletions
diff --git a/src/lib/netlist/nl_setup.cpp b/src/lib/netlist/nl_setup.cpp index b311e4b1a68..5b7099a9e14 100644 --- a/src/lib/netlist/nl_setup.cpp +++ b/src/lib/netlist/nl_setup.cpp @@ -110,7 +110,7 @@ void setup_t::register_dev(plib::owned_ptr<device_t> dev) void setup_t::register_lib_entry(const pstring &name) { - if (m_lib.contains(name)) + if (plib::container::contains(m_lib, name)) log().warning("Lib entry collection already contains {1}. IGNORED", name); else m_lib.push_back(name); @@ -118,7 +118,7 @@ void setup_t::register_lib_entry(const pstring &name) void setup_t::register_dev(const pstring &classname, const pstring &name) { - if (m_lib.contains(classname)) + if (plib::container::contains(m_lib, classname)) { namespace_push(name); include(classname); @@ -151,13 +151,13 @@ void setup_t::register_model(const pstring &model_in) 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(); - if (!m_models.add(model, def)) + if (!m_models.insert({model, def}).second) log().fatal("Model already exists: {1}", model_in); } void setup_t::register_alias_nofqn(const pstring &alias, const pstring &out) { - if (!m_alias.add(alias, out)) + if (!m_alias.insert({alias, out}).second) log().fatal("Error adding alias {1} to alias list\n", alias); } @@ -181,7 +181,7 @@ void setup_t::register_dippins_arr(const pstring &terms) } } -pstring setup_t::objtype_as_str(object_t &in) const +pstring setup_t::objtype_as_str(device_object_t &in) const { switch (in.type()) { @@ -191,14 +191,8 @@ pstring setup_t::objtype_as_str(object_t &in) const return "INPUT"; case terminal_t::OUTPUT: return "OUTPUT"; - case terminal_t::NET: - return "NET"; case terminal_t::PARAM: return "PARAM"; - case terminal_t::DEVICE: - return "DEVICE"; - case terminal_t::QUEUE: - return "QUEUE"; } // FIXME: noreturn log().fatal("Unknown object type {1}\n", (unsigned) in.type()); @@ -207,9 +201,10 @@ pstring setup_t::objtype_as_str(object_t &in) const void setup_t::register_and_set_param(pstring name, param_t ¶m) { - if (m_param_values.contains(name)) + auto i = m_param_values.find(name); + if (i != m_param_values.end()) { - const pstring val = m_param_values[name]; + const pstring val = i->second; log().debug("Found parameter ... {1} : {1}\n", name, val); switch (param.param_type()) { @@ -240,24 +235,13 @@ void setup_t::register_and_set_param(pstring name, param_t ¶m) log().fatal("Parameter is not supported {1} : {2}\n", name, val); } } - if (!m_params.add(param.name(), param_ref_t(param.name(), param.device(), param))) + 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) { - if (term.is_type(terminal_t::OUTPUT)) - { - } - 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)) + if (!m_terminals.insert({term.name(), &term}).second) 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()); } @@ -291,15 +275,16 @@ void setup_t::remove_connections(const pstring pin) pstring pinfn = build_fqn(pin); bool found = false; - for (int i = m_links.size() - 1; i >= 0; i--) + for (auto link = m_links.begin(); link != m_links.end(); ) { - auto &link = m_links[i]; - if ((link.first == pinfn) || (link.second == pinfn)) + if ((link->first == pinfn) || (link->second == pinfn)) { - log().verbose("removing connection: {1} <==> {2}\n", link.first, link.second); - m_links.remove_at(i); + log().verbose("removing connection: {1} <==> {2}\n", link->first, link->second); + link = m_links.erase(link); found = true; } + else + link++; } if (!found) log().fatal("remove_connections: found no occurrence of {1}\n", pin); @@ -345,15 +330,15 @@ void setup_t::register_param(const pstring ¶m, const pstring &value) { pstring fqn = build_fqn(param); - int idx = m_param_values.index_of(fqn); - if (idx < 0) + auto idx = m_param_values.find(fqn); + if (idx == m_param_values.end()) { - if (!m_param_values.add(fqn, value)) + if (!m_param_values.insert({fqn, value}).second) log().fatal("Unexpected error adding parameter {1} to parameter list\n", param); } else { - log().warning("Overwriting {1} old <{2}> new <{3}>\n", fqn, m_param_values.value_at(idx), value); + log().warning("Overwriting {1} old <{2}> new <{3}>\n", fqn, idx->second, value); m_param_values[fqn] = value; } } @@ -366,8 +351,8 @@ const pstring setup_t::resolve_alias(const pstring &name) const /* FIXME: Detect endless loop */ do { ret = temp; - int p = m_alias.index_of(ret); - temp = (p>=0 ? m_alias.value_at(p) : ""); + auto p = m_alias.find(ret); + temp = (p != m_alias.end() ? p->second : ""); } while (temp != ""); log().debug("{1}==>{2}\n", name, ret); @@ -377,17 +362,15 @@ const pstring setup_t::resolve_alias(const pstring &name) const core_terminal_t *setup_t::find_terminal(const pstring &terminal_in, bool required) { const pstring &tname = resolve_alias(terminal_in); - int ret; - - ret = m_terminals.index_of(tname); + auto ret = m_terminals.find(tname); /* look for default */ - if (ret < 0) + if (ret == m_terminals.end()) { /* look for ".Q" std output */ - ret = m_terminals.index_of(tname + ".Q"); + ret = m_terminals.find(tname + ".Q"); } - core_terminal_t *term = (ret < 0 ? nullptr : m_terminals.value_at(ret)); + 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); @@ -396,22 +379,20 @@ 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, object_t::type_t atype, bool required) +core_terminal_t *setup_t::find_terminal(const pstring &terminal_in, device_object_t::type_t atype, bool required) { const pstring &tname = resolve_alias(terminal_in); - int ret; - - ret = m_terminals.index_of(tname); + auto ret = m_terminals.find(tname); /* look for default */ - if (ret < 0 && atype == object_t::OUTPUT) + if (ret == m_terminals.end() && atype == device_object_t::OUTPUT) { /* look for ".Q" std output */ - ret = m_terminals.index_of(tname + ".Q"); + ret = m_terminals.find(tname + ".Q"); } - if (ret < 0 && required) + if (ret == m_terminals.end() && required) log().fatal("terminal {1}({2}) not found!\n", terminal_in, tname); - core_terminal_t *term = (ret < 0 ? nullptr : m_terminals.value_at(ret)); + core_terminal_t *term = (ret == m_terminals.end() ? nullptr : ret->second); if (term != nullptr && term->type() != atype) { @@ -431,14 +412,12 @@ param_t *setup_t::find_param(const pstring ¶m_in, bool required) const pstring param_in_fqn = build_fqn(param_in); const pstring &outname = resolve_alias(param_in_fqn); - int ret; - - ret = m_params.index_of(outname); - if (ret < 0 && required) + auto ret = m_params.find(outname); + if (ret == m_params.end() && required) log().fatal("parameter {1}({2}) not found!\n", param_in_fqn, outname); - if (ret != -1) + if (ret != m_params.end()) log().debug("Found parameter {1}\n", outname); - return (ret == -1 ? nullptr : &m_params.value_at(ret).m_param); + return (ret == m_params.end() ? nullptr : &ret->second.m_param); } // FIXME avoid dynamic cast here @@ -588,7 +567,7 @@ void setup_t::connect_terminals(core_terminal_t &t1, core_terminal_t &t2) { log().debug("adding analog net ...\n"); // FIXME: Nets should have a unique name - analog_net_t::ptr_t anet = plib::palloc<analog_net_t>(netlist(),"net." + t1.name()); + auto anet = plib::palloc<analog_net_t>(netlist(),"net." + t1.name()); t1.set_net(anet); anet->register_con(t2); anet->register_con(t1); @@ -706,16 +685,16 @@ void setup_t::resolve_inputs() int tries = 100; while (m_links.size() > 0 && tries > 0) // FIXME: convert into constant { - unsigned li = 0; - while (li < m_links.size()) + auto li = m_links.begin(); + while (li != m_links.end()) { - const pstring t1s = m_links[li].first; - const pstring t2s = m_links[li].second; + const pstring t1s = li->first; + const pstring t2s = li->second; core_terminal_t *t1 = find_terminal(t1s); core_terminal_t *t2 = find_terminal(t2s); if (connect(*t1, *t2)) - m_links.remove_at(li); + li = m_links.erase(li); else li++; } @@ -733,28 +712,23 @@ void setup_t::resolve_inputs() // delete empty nets ... and save m_list ... - net_t::list_t todelete; - - for (auto & net : netlist().m_nets) + for (auto net = netlist().m_nets.begin(); net != netlist().m_nets.end();) { - if (net->num_cons() == 0) - todelete.push_back(net); + if (net->get()->num_cons() == 0) + { + log().verbose("Deleting net {1} ...", net->get()->name()); + net = netlist().m_nets.erase(net); + } else - net->rebuild_list(); - } - - for (auto & net : todelete) - { - log().verbose("Deleting net {1} ...", net->name()); - netlist().m_nets.remove(net); + ++net; } pstring errstr(""); log().verbose("looking for terminals not connected ..."); - for (std::size_t i = 0; i < m_terminals.size(); i++) + for (auto & i : m_terminals) { - core_terminal_t *term = m_terminals.value_at(i); + 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()) @@ -862,13 +836,12 @@ const logic_family_desc_t *setup_t::family_from_model(const pstring &model) static pstring model_string(model_map_t &map) { pstring ret = map["COREMODEL"] + "("; - for (unsigned i=0; i<map.size(); i++) - ret = ret + map.key_at(i) + "=" + map.value_at(i) + " "; + for (auto & i : map) + ret = ret + i.first + "=" + i.second + " "; return ret + ")"; } - void setup_t::model_parse(const pstring &model_in, model_map_t &map) { pstring model = model_in; @@ -881,9 +854,10 @@ void setup_t::model_parse(const pstring &model_in, model_map_t &map) if (pos >= 0) break; key = model.ucase(); - if (!m_models.contains(key)) + auto i = m_models.find(key); + if (i == m_models.end()) log().fatal("Model {1} not found\n", model); - model = m_models[key]; + model = i->second; } pstring xmodel = model.left(pos); @@ -891,7 +865,8 @@ void setup_t::model_parse(const pstring &model_in, model_map_t &map) map["COREMODEL"] = key; else { - if (m_models.contains(xmodel)) + auto i = m_models.find(xmodel); + if (i != m_models.end()) model_parse(xmodel, map); else log().fatal("Model doesn't exist: <{1}>\n", model_in); @@ -918,7 +893,7 @@ const pstring setup_t::model_value_str(model_map_t &map, const pstring &entity) if (entity != entity.ucase()) log().fatal("model parameters should be uppercase:{1} {2}\n", entity, model_string(map)); - if (!map.contains(entity)) + if (map.find(entity) == map.end()) log().fatal("Entity {1} not found in model {2}\n", entity, model_string(map)); else ret = map[entity]; |
