summaryrefslogtreecommitdiffstatshomepage
path: root/src/lib/netlist
diff options
context:
space:
mode:
author couriersud <couriersud@arcor.de>2016-05-12 01:13:27 +0200
committer couriersud <couriersud@arcor.de>2016-05-12 01:15:19 +0200
commit7d9c8b78eab2cf3a072bb0a1157cbca3f3d4b37b (patch)
tree67ac639e2afdd6843cfc6b3697e5859c68e14fe2 /src/lib/netlist
parentc2fb41964cc06c3ecf0e58f584e1cb1f3ecec992 (diff)
Some use of share_ptr to ease memory management. (nw)
Diffstat (limited to 'src/lib/netlist')
-rw-r--r--src/lib/netlist/nl_base.cpp75
-rw-r--r--src/lib/netlist/nl_base.h14
-rw-r--r--src/lib/netlist/nl_setup.cpp17
-rw-r--r--src/lib/netlist/solver/nld_solver.cpp3
4 files changed, 57 insertions, 52 deletions
diff --git a/src/lib/netlist/nl_base.cpp b/src/lib/netlist/nl_base.cpp
index 0ab1312f77e..7436a8e870a 100644
--- a/src/lib/netlist/nl_base.cpp
+++ b/src/lib/netlist/nl_base.cpp
@@ -211,13 +211,6 @@ netlist_t::netlist_t(const pstring &aname)
netlist_t::~netlist_t()
{
- for (net_t *net : m_nets)
- {
- if (!net->isRailNet())
- {
- pfree(net);
- }
- }
m_nets.clear();
m_devices.clear_and_free();
@@ -278,16 +271,16 @@ ATTR_COLD void netlist_t::stop()
ATTR_COLD net_t *netlist_t::find_net(const pstring &name)
{
- for (net_t *net : m_nets)
+ for (auto & net : m_nets)
if (net->name() == name)
- return net;
+ return net.get();
return nullptr;
}
ATTR_COLD void netlist_t::rebuild_lists()
{
- for (net_t *net : m_nets)
+ for (auto & net : m_nets)
net->rebuild_list();
}
@@ -581,10 +574,20 @@ ATTR_COLD net_t::~net_t()
netlist().remove_save_items(this);
}
-ATTR_COLD void net_t::init_object(netlist_t &nl, const pstring &aname)
+// FIXME: move somewhere central
+
+struct do_nothing_deleter{
+ template<typename T> void operator()(T*){}
+};
+
+ATTR_COLD void net_t::init_object(netlist_t &nl, const pstring &aname, core_terminal_t *mr)
{
object_t::init_object(nl, aname);
- nl.m_nets.push_back(this);
+ m_railterminal = mr;
+ if (mr != nullptr)
+ nl.m_nets.push_back(std::shared_ptr<net_t>(this, do_nothing_deleter()));
+ else
+ nl.m_nets.push_back(std::shared_ptr<net_t>(this));
}
ATTR_HOT void net_t::inc_active(core_terminal_t &term)
@@ -626,12 +629,6 @@ ATTR_HOT void net_t::dec_active(core_terminal_t &term)
railterminal().device().dec_active();
}
-ATTR_COLD void net_t::register_railterminal(core_terminal_t &mr)
-{
- nl_assert(m_railterminal == nullptr);
- m_railterminal = &mr;
-}
-
ATTR_COLD void net_t::rebuild_list()
{
/* rebuild m_list */
@@ -703,7 +700,7 @@ ATTR_COLD void net_t::reset()
ATTR_COLD void net_t::register_con(core_terminal_t &terminal)
{
- terminal.set_net(*this);
+ terminal.set_net(this);
m_core_terms.push_back(&terminal);
@@ -776,6 +773,13 @@ ATTR_COLD analog_net_t::analog_net_t()
{
}
+ATTR_COLD analog_net_t::analog_net_t(netlist_t &nl, const pstring &aname)
+ : net_t(ANALOG)
+ , m_solver(nullptr)
+{
+ init_object(nl, aname);
+}
+
ATTR_COLD void analog_net_t::reset()
{
net_t::reset();
@@ -829,11 +833,17 @@ ATTR_COLD core_terminal_t::core_terminal_t(const type_t atype, const family_t af
{
}
-ATTR_COLD void core_terminal_t::set_net(net_t &anet)
+ATTR_COLD void core_terminal_t::set_net(net_t::ptr_t anet)
{
- m_net = &anet;
+ m_net = anet;
}
+ATTR_COLD void core_terminal_t::clear_net()
+{
+ m_net = nullptr;
+}
+
+
// ----------------------------------------------------------------------------------------
// terminal_t
// ----------------------------------------------------------------------------------------
@@ -895,14 +905,13 @@ ATTR_COLD logic_output_t::logic_output_t()
: logic_t(OUTPUT)
{
set_state(STATE_OUT);
- this->set_net(m_my_net);
+ this->set_net(&m_my_net);
}
ATTR_COLD void logic_output_t::init_object(core_device_t &dev, const pstring &aname)
{
core_terminal_t::init_object(dev, aname);
- net().init_object(dev.netlist(), aname + ".net");
- net().register_railterminal(*this);
+ net().init_object(dev.netlist(), aname + ".net", this);
}
ATTR_COLD void logic_output_t::initial(const netlist_sig_t val)
@@ -915,33 +924,31 @@ ATTR_COLD void logic_output_t::initial(const netlist_sig_t val)
// analog_output_t
// ----------------------------------------------------------------------------------------
-ATTR_COLD analog_output_t::analog_output_t()
+ATTR_COLD analog_output_t::analog_output_t(core_device_t &dev, const pstring &aname)
: analog_t(OUTPUT), m_proxied_net(nullptr)
{
- this->set_net(m_my_net);
+ this->set_net(&m_my_net);
set_state(STATE_OUT);
net().m_cur_Analog = NL_FCONST(0.99);
+
+ analog_t::init_object(dev, aname);
+ net().init_object(dev.netlist(), aname + ".net", this);
}
-ATTR_COLD analog_output_t::analog_output_t(core_device_t &dev, const pstring &aname)
+ATTR_COLD analog_output_t::analog_output_t()
: analog_t(OUTPUT), m_proxied_net(nullptr)
{
- this->set_net(m_my_net);
+ this->set_net(&m_my_net);
set_state(STATE_OUT);
net().m_cur_Analog = NL_FCONST(0.99);
-
- analog_t::init_object(dev, aname);
- net().init_object(dev.netlist(), aname + ".net");
- net().register_railterminal(*this);
}
ATTR_COLD void analog_output_t::init_object(core_device_t &dev, const pstring &aname)
{
analog_t::init_object(dev, aname);
- net().init_object(dev.netlist(), aname + ".net");
- net().register_railterminal(*this);
+ net().init_object(dev.netlist(), aname + ".net", this);
}
ATTR_COLD void analog_output_t::initial(const nl_double val)
diff --git a/src/lib/netlist/nl_base.h b/src/lib/netlist/nl_base.h
index 0af0ce9e326..b71eb351e77 100644
--- a/src/lib/netlist/nl_base.h
+++ b/src/lib/netlist/nl_base.h
@@ -482,8 +482,8 @@ namespace netlist
ATTR_COLD core_terminal_t(const type_t atype, const family_t afamily);
- ATTR_COLD void set_net(net_t &anet);
- ATTR_COLD void clear_net() { m_net = nullptr; }
+ ATTR_COLD void set_net(net_t *anet);
+ ATTR_COLD void clear_net();
ATTR_HOT bool has_net() const { return (m_net != nullptr); }
ATTR_HOT const net_t & net() const { return *m_net;}
@@ -505,7 +505,7 @@ namespace netlist
}
private:
- net_t * m_net;
+ net_t * m_net;
state_e m_state;
};
@@ -692,16 +692,16 @@ namespace netlist
P_PREVENT_COPYING(net_t)
public:
- using list_t = pvector_t<net_t *>;
+ using ptr_t = net_t *;
+ using list_t = pvector_t<std::shared_ptr<net_t>>;
ATTR_COLD net_t(const family_t afamily);
virtual ~net_t();
- ATTR_COLD void init_object(netlist_t &nl, const pstring &aname);
+ ATTR_COLD void init_object(netlist_t &nl, const pstring &aname, core_terminal_t *mr = nullptr);
ATTR_COLD void register_con(core_terminal_t &terminal);
ATTR_COLD void merge_net(net_t *othernet);
- ATTR_COLD void register_railterminal(core_terminal_t &mr);
ATTR_HOT logic_net_t & as_logic();
ATTR_HOT const logic_net_t & as_logic() const;
@@ -835,6 +835,8 @@ namespace netlist
using list_t = pvector_t<analog_net_t *>;
ATTR_COLD analog_net_t();
+ ATTR_COLD analog_net_t(netlist_t &nl, const pstring &aname);
+
virtual ~analog_net_t() { };
ATTR_HOT const nl_double &Q_Analog() const
diff --git a/src/lib/netlist/nl_setup.cpp b/src/lib/netlist/nl_setup.cpp
index 5734f0b5e87..b557bf8a839 100644
--- a/src/lib/netlist/nl_setup.cpp
+++ b/src/lib/netlist/nl_setup.cpp
@@ -636,13 +636,12 @@ void setup_t::connect_terminals(core_terminal_t &t1, core_terminal_t &t2)
}
else
{
- log().debug("adding net ...\n");
- analog_net_t *anet = palloc(analog_net_t);
- t1.set_net(*anet);
+ log().debug("adding analog net ...\n");
// FIXME: Nets should have a unique name
- t1.net().init_object(netlist(),"net." + t1.name() );
- t1.net().register_con(t2);
- t1.net().register_con(t1);
+ analog_net_t::ptr_t anet = palloc(analog_net_t(netlist(),"net." + t1.name()));
+ t1.set_net(anet);
+ anet->register_con(t2);
+ anet->register_con(t1);
}
}
@@ -786,7 +785,7 @@ void setup_t::resolve_inputs()
net_t::list_t todelete;
- for (net_t *net : netlist().m_nets)
+ for (auto & net : netlist().m_nets)
{
if (net->num_cons() == 0)
todelete.push_back(net);
@@ -794,12 +793,10 @@ void setup_t::resolve_inputs()
net->rebuild_list();
}
- for (net_t *net : todelete)
+ for (auto & net : todelete)
{
log().verbose("Deleting net {1} ...", net->name());
netlist().m_nets.remove(net);
- if (!net->isRailNet())
- pfree(net);
}
pstring errstr("");
diff --git a/src/lib/netlist/solver/nld_solver.cpp b/src/lib/netlist/solver/nld_solver.cpp
index 9b420588cf0..1238fba39f8 100644
--- a/src/lib/netlist/solver/nld_solver.cpp
+++ b/src/lib/netlist/solver/nld_solver.cpp
@@ -184,8 +184,7 @@ ATTR_COLD void matrix_solver_t::setup_base(analog_net_t::list_t &nets)
//net_proxy_output = palloc(analog_output_t(*this,
// this->name() + "." + pfmt("m{1}")(m_inps.size())));
- net_proxy_output = palloc(analog_output_t);
- net_proxy_output->init_object(*this, this->name() + "." + pfmt("m{1}")(m_inps.size()));
+ net_proxy_output = palloc(analog_output_t(*this, this->name() + "." + pfmt("m{1}")(m_inps.size())));
m_inps.push_back(net_proxy_output);
net_proxy_output->m_proxied_net = &p->net().as_analog();
}