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.cpp119
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 &param)
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 &param)
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 &param)
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 &param, 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();
}