summaryrefslogtreecommitdiffstatshomepage
path: root/src/lib/netlist/nl_setup.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/netlist/nl_setup.cpp')
-rw-r--r--src/lib/netlist/nl_setup.cpp143
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 &param)
{
- 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 &param)
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 &param, 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 &param_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];