summaryrefslogtreecommitdiffstatshomepage
path: root/src/lib/netlist/nl_base.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/netlist/nl_base.cpp')
-rw-r--r--src/lib/netlist/nl_base.cpp173
1 files changed, 111 insertions, 62 deletions
diff --git a/src/lib/netlist/nl_base.cpp b/src/lib/netlist/nl_base.cpp
index 7b171e851ed..c4d402ff3ee 100644
--- a/src/lib/netlist/nl_base.cpp
+++ b/src/lib/netlist/nl_base.cpp
@@ -18,18 +18,20 @@
namespace netlist
{
-#if (NL_USE_MEMPOOL)
-static plib::mempool p(65536, 8);
+namespace detail
+{
+#if (USE_MEMPOOL)
+static plib::mempool pool(65536, 8);
void * object_t::operator new (size_t size)
{
- return p.alloc(size);
+ return pool.alloc(size);
}
void object_t::operator delete (void * mem)
{
if (mem)
- p.free(mem);
+ pool.free(mem);
}
#else
void * object_t::operator new (size_t size)
@@ -44,6 +46,8 @@ void object_t::operator delete (void * mem)
}
#endif
+}
+
// ----------------------------------------------------------------------------------------
// logic_family_ttl_t
// ----------------------------------------------------------------------------------------
@@ -101,7 +105,7 @@ const logic_family_desc_t *family_CD4XXX()
// queue_t
// ----------------------------------------------------------------------------------------
-queue_t::queue_t(netlist_t &nl)
+detail::queue_t::queue_t(netlist_t &nl)
: timed_queue<net_t *, netlist_time>(512)
, object_t("QUEUE")
, netlist_ref(nl)
@@ -112,7 +116,7 @@ queue_t::queue_t(netlist_t &nl)
{
}
-void queue_t::register_state(plib::state_manager_t &manager, const pstring &module)
+void detail::queue_t::register_state(plib::state_manager_t &manager, const pstring &module)
{
netlist().log().debug("register_state\n");
manager.save_item(this, m_qsize, module + "." + "qsize");
@@ -120,30 +124,30 @@ void queue_t::register_state(plib::state_manager_t &manager, const pstring &modu
manager.save_item(this, &(m_names[0].m_buf[0]), module + "." + "names", m_names.size() * sizeof(names_t));
}
-void queue_t::on_pre_save()
+void detail::queue_t::on_pre_save()
{
netlist().log().debug("on_pre_save\n");
m_qsize = this->size();
netlist().log().debug("current time {1} qsize {2}\n", netlist().time().as_double(), m_qsize);
- for (int i = 0; i < m_qsize; i++ )
+ for (std::size_t i = 0; i < m_qsize; i++ )
{
m_times[i] = this->listptr()[i].m_exec_time.as_raw();
pstring p = this->listptr()[i].m_object->name();
- int n = p.len();
- n = std::min(63, n);
+ std::size_t n = p.len();
+ if (n > 63) n = 63;
std::strncpy(m_names[i].m_buf, p.cstr(), n);
m_names[i].m_buf[n] = 0;
}
}
-void queue_t::on_post_load()
+void detail::queue_t::on_post_load()
{
this->clear();
netlist().log().debug("current time {1} qsize {2}\n", netlist().time().as_double(), m_qsize);
- for (int i = 0; i < m_qsize; i++ )
+ for (std::size_t i = 0; i < m_qsize; i++ )
{
- net_t *n = netlist().find_net(m_names[i].m_buf);
+ detail::net_t *n = netlist().find_net(m_names[i].m_buf);
//log().debug("Got {1} ==> {2}\n", qtemp[i].m_name, n));
//log().debug("schedule time {1} ({2})\n", n->time().as_double(), netlist_time::from_raw(m_times[i]).as_double()));
this->push(netlist_time::from_raw(m_times[i]), n);
@@ -154,16 +158,16 @@ void queue_t::on_post_load()
// object_t
// ----------------------------------------------------------------------------------------
-object_t::object_t(const pstring &aname)
+detail::object_t::object_t(const pstring &aname)
: m_name(aname)
{
}
-object_t::~object_t()
+detail::object_t::~object_t()
{
}
-const pstring &object_t::name() const
+const pstring &detail::object_t::name() const
{
return m_name;
}
@@ -172,7 +176,7 @@ const pstring &object_t::name() const
// device_object_t
// ----------------------------------------------------------------------------------------
-device_object_t::device_object_t(core_device_t &dev, const pstring &aname, const type_t atype)
+detail::device_object_t::device_object_t(core_device_t &dev, const pstring &aname, const type_t atype)
: object_t(aname)
, m_device(dev)
, m_type(atype)
@@ -227,6 +231,60 @@ void netlist_t::start()
{
/* load the library ... */
+ /* make sure the solver and parameters are started first! */
+
+ for (auto & e : setup().m_device_factory)
+ {
+ if ( setup().factory().is_class<devices::NETLIB_NAME(mainclock)>(e.second)
+ || setup().factory().is_class<devices::NETLIB_NAME(solver)>(e.second)
+ || setup().factory().is_class<devices::NETLIB_NAME(gnd)>(e.second)
+ || setup().factory().is_class<devices::NETLIB_NAME(netlistparams)>(e.second))
+ {
+ auto dev = plib::owned_ptr<device_t>(e.second->Create(*this, e.first));
+ register_dev(std::move(dev));
+ }
+ }
+
+ log().debug("Searching for mainclock and solver ...\n");
+
+ m_mainclock = get_single_device<devices::NETLIB_NAME(mainclock)>("mainclock");
+ m_solver = get_single_device<devices::NETLIB_NAME(solver)>("solver");
+ m_gnd = get_single_device<devices::NETLIB_NAME(gnd)>("gnd");
+ m_params = get_single_device<devices::NETLIB_NAME(netlistparams)>("parameter");
+
+ /* create devices */
+
+ for (auto & e : setup().m_device_factory)
+ {
+ if ( !setup().factory().is_class<devices::NETLIB_NAME(mainclock)>(e.second)
+ && !setup().factory().is_class<devices::NETLIB_NAME(solver)>(e.second)
+ && !setup().factory().is_class<devices::NETLIB_NAME(gnd)>(e.second)
+ && !setup().factory().is_class<devices::NETLIB_NAME(netlistparams)>(e.second))
+ {
+ auto dev = plib::owned_ptr<device_t>(e.second->Create(*this, e.first));
+ register_dev(std::move(dev));
+ }
+ }
+
+ bool use_deactivate = (m_params->m_use_deactivate() ? true : false);
+
+ for (auto &d : m_devices)
+ {
+ if (use_deactivate)
+ {
+ auto p = setup().m_param_values.find(d->name() + ".HINT_NO_DEACTIVATE");
+ if (p != setup().m_param_values.end())
+ {
+ //FIXME: Error checking
+ auto v = p->second.as_long();
+ d->set_hint_deactivate(!v);
+ }
+ }
+ else
+ d->set_hint_deactivate(false);
+ }
+
+
pstring libpath = plib::util::environment("NL_BOOSTLIB", plib::util::buildpath({".", "nlboost.so"}));
m_lib = plib::palloc<plib::dynlib>(libpath);
@@ -243,7 +301,7 @@ void netlist_t::stop()
dev->stop_dev();
}
-net_t *netlist_t::find_net(const pstring &name)
+detail::net_t *netlist_t::find_net(const pstring &name)
{
for (auto & net : m_nets)
if (net->name() == name)
@@ -291,8 +349,9 @@ void netlist_t::reset()
* It is however not acceptable that this depends on the startup order.
* Best would be, if reset would call update_dev for devices which need it.
*/
- for (int i = m_devices.size() - 1; i >= 0; i--)
- m_devices[i]->update_dev();
+ std::size_t i = m_devices.size();
+ while (i>0)
+ m_devices[--i]->update_dev();
#endif
}
@@ -307,7 +366,7 @@ void netlist_t::process_queue(const netlist_time &delta)
if (m_mainclock == nullptr)
{
- queue_t::entry_t e(m_queue.pop());
+ detail::queue_t::entry_t e(m_queue.pop());
m_time = e.m_exec_time;
while (e.m_object != nullptr)
{
@@ -333,7 +392,7 @@ void netlist_t::process_queue(const netlist_time &delta)
mc_net.update_devs();
}
- const queue_t::entry_t e(m_queue.pop());
+ const detail::queue_t::entry_t e(m_queue.pop());
m_time = e.m_exec_time;
if (e.m_object == nullptr)
break;
@@ -379,7 +438,9 @@ void netlist_t::print_stats() const
}
overhead.stop();
- uint_least64_t total_overhead = (uint_least64_t) overhead()*(uint_least64_t)total_count/(uint_least64_t)200000;
+ nperftime_t::type total_overhead = overhead()
+ * static_cast<nperftime_t::type>(total_count)
+ / static_cast<nperftime_t::type>(200000);
log().verbose("Queue Pushes {1:15}", queue().m_prof_call());
log().verbose("Queue Moves {1:15}", queue().m_prof_sortmove());
@@ -391,7 +452,9 @@ void netlist_t::print_stats() const
log().verbose("");
log().verbose("Take the next lines with a grain of salt. They depend on the measurement implementation.");
log().verbose("Total overhead {1:15}", total_overhead);
- log().verbose("Overhead per pop {1:11}", (m_stat_mainloop()-2*total_overhead - (total_time - total_overhead ))/queue().m_prof_call());
+ nperftime_t::type overhead_per_pop = (m_stat_mainloop()-2*total_overhead - (total_time - total_overhead))
+ / static_cast<nperftime_t::type>(queue().m_prof_call());
+ log().verbose("Overhead per pop {1:11}", overhead_per_pop );
log().verbose("");
for (auto &entry : m_devices)
{
@@ -478,20 +541,6 @@ void core_device_t::stop_dev()
//stop();
}
-netlist_sig_t core_device_t::INPLOGIC_PASSIVE(logic_input_t &inp)
-{
- if (inp.state() != logic_t::STATE_INP_PASSIVE)
- return inp.Q();
- else
- {
- inp.activate();
- const netlist_sig_t ret = inp.Q();
- inp.inactivate();
- return ret;
- }
-}
-
-
// ----------------------------------------------------------------------------------------
// device_t
// ----------------------------------------------------------------------------------------
@@ -506,7 +555,7 @@ setup_t &device_t::setup()
return netlist().setup();
}
-void device_t::register_subalias(const pstring &name, core_terminal_t &term)
+void device_t::register_subalias(const pstring &name, detail::core_terminal_t &term)
{
pstring alias = this->name() + "." + name;
@@ -523,7 +572,7 @@ void device_t::register_subalias(const pstring &name, const pstring &aliased)
setup().register_alias_nofqn(alias, aliased_fqn);
}
-void device_t::connect_late(core_terminal_t &t1, core_terminal_t &t2)
+void device_t::connect_late(detail::core_terminal_t &t1, detail::core_terminal_t &t2)
{
setup().register_link_fqn(t1.name(), t2.name());
}
@@ -536,7 +585,7 @@ void device_t::connect_late(const pstring &t1, const pstring &t2)
/* FIXME: this is only used by solver code since matrix solvers are started in
* post_start.
*/
-void device_t::connect_post_start(core_terminal_t &t1, core_terminal_t &t2)
+void device_t::connect_post_start(detail::core_terminal_t &t1, detail::core_terminal_t &t2)
{
if (!setup().connect(t1, t2))
netlist().log().fatal("Error connecting {1} to {2}\n", t1.name(), t2.name());
@@ -547,12 +596,12 @@ void device_t::connect_post_start(core_terminal_t &t1, core_terminal_t &t2)
// family_setter_t
// -----------------------------------------------------------------------------
-family_setter_t::family_setter_t(core_device_t &dev, const char *desc)
+detail::family_setter_t::family_setter_t(core_device_t &dev, const char *desc)
{
dev.set_logic_family(dev.netlist().setup().family_from_model(desc));
}
-family_setter_t::family_setter_t(core_device_t &dev, const logic_family_desc_t *desc)
+detail::family_setter_t::family_setter_t(core_device_t &dev, const logic_family_desc_t *desc)
{
dev.set_logic_family(desc);
}
@@ -568,7 +617,7 @@ struct do_nothing_deleter{
};
-net_t::net_t(netlist_t &nl, const pstring &aname, core_terminal_t *mr)
+detail::net_t::net_t(netlist_t &nl, const pstring &aname, core_terminal_t *mr)
: object_t(aname)
, netlist_ref(nl)
, m_new_Q(*this, "m_new_Q", 0)
@@ -586,16 +635,16 @@ net_t::net_t(netlist_t &nl, const pstring &aname, core_terminal_t *mr)
nl.m_nets.push_back(plib::owned_ptr<net_t>(this, true));
}
-net_t::~net_t()
+detail::net_t::~net_t()
{
netlist().state().remove_save_items(this);
}
-void net_t::inc_active(core_terminal_t &term)
+void detail::net_t::inc_active(core_terminal_t &term)
{
m_active++;
m_list_active.push_front(&term);
- nl_assert(m_active <= (int) num_cons());
+ nl_assert(m_active <= static_cast<int>(num_cons()));
if (m_active == 1)
{
railterminal().device().do_inc_active();
@@ -615,7 +664,7 @@ void net_t::inc_active(core_terminal_t &term)
}
}
-void net_t::dec_active(core_terminal_t &term)
+void detail::net_t::dec_active(core_terminal_t &term)
{
--m_active;
nl_assert(m_active >= 0);
@@ -624,7 +673,7 @@ void net_t::dec_active(core_terminal_t &term)
railterminal().device().do_dec_active();
}
-void net_t::rebuild_list()
+void detail::net_t::rebuild_list()
{
/* rebuild m_list */
@@ -639,7 +688,7 @@ void net_t::rebuild_list()
m_active = cnt;
}
-void net_t::update_devs()
+void detail::net_t::update_devs()
{
//assert(m_num_cons != 0);
nl_assert(this->isRailNet());
@@ -665,7 +714,7 @@ void net_t::update_devs()
}
}
-void net_t::reset()
+void detail::net_t::reset()
{
m_time = netlist_time::zero();
m_active = 0;
@@ -689,7 +738,7 @@ void net_t::reset()
m_active++;
}
-void net_t::register_con(core_terminal_t &terminal)
+void detail::net_t::register_con(detail::core_terminal_t &terminal)
{
terminal.set_net(this);
@@ -699,15 +748,15 @@ void net_t::register_con(core_terminal_t &terminal)
m_active++;
}
-void net_t::move_connections(net_t *dest_net)
+void detail::net_t::move_connections(detail::net_t *dest_net)
{
- for (core_terminal_t *ct : m_core_terms)
+ for (auto &ct : m_core_terms)
dest_net->register_con(*ct);
m_core_terms.clear();
m_active = 0;
}
-void net_t::merge_net(net_t *othernet)
+void detail::net_t::merge_net(detail::net_t *othernet)
{
netlist().log().debug("merging nets ...\n");
if (othernet == nullptr)
@@ -738,7 +787,7 @@ void net_t::merge_net(net_t *othernet)
// logic_net_t
// ----------------------------------------------------------------------------------------
-logic_net_t::logic_net_t(netlist_t &nl, const pstring &aname, core_terminal_t *mr)
+logic_net_t::logic_net_t(netlist_t &nl, const pstring &aname, detail::core_terminal_t *mr)
: net_t(nl, aname, mr)
{
}
@@ -748,7 +797,7 @@ logic_net_t::logic_net_t(netlist_t &nl, const pstring &aname, core_terminal_t *m
// analog_net_t
// ----------------------------------------------------------------------------------------
-analog_net_t::analog_net_t(netlist_t &nl, const pstring &aname, core_terminal_t *mr)
+analog_net_t::analog_net_t(netlist_t &nl, const pstring &aname, detail::core_terminal_t *mr)
: net_t(nl, aname, mr)
, m_solver(nullptr)
{
@@ -772,7 +821,7 @@ void analog_net_t::process_net(std::vector<list_t> &groups)
return;
/* add the net */
groups.back().push_back(this);
- for (core_terminal_t *p : m_core_terms)
+ for (auto &p : m_core_terms)
{
if (p->is_type(terminal_t::TERMINAL))
{
@@ -789,7 +838,7 @@ void analog_net_t::process_net(std::vector<list_t> &groups)
// core_terminal_t
// ----------------------------------------------------------------------------------------
-core_terminal_t::core_terminal_t(core_device_t &dev, const pstring &aname, const type_t atype)
+detail::core_terminal_t::core_terminal_t(core_device_t &dev, const pstring &aname, const type_t atype)
: device_object_t(dev, dev.name() + "." + aname, atype)
, plib::linkedlist_t<core_terminal_t>::element_t()
, m_net(nullptr)
@@ -797,7 +846,7 @@ core_terminal_t::core_terminal_t(core_device_t &dev, const pstring &aname, const
{
}
-void core_terminal_t::reset()
+void detail::core_terminal_t::reset()
{
if (is_type(OUTPUT))
set_state(STATE_OUT);
@@ -805,12 +854,12 @@ void core_terminal_t::reset()
set_state(STATE_INP_ACTIVE);
}
-void core_terminal_t::set_net(net_t *anet)
+void detail::core_terminal_t::set_net(net_t *anet)
{
m_net = anet;
}
- void core_terminal_t::clear_net()
+ void detail::core_terminal_t::clear_net()
{
m_net = nullptr;
}