diff options
author | couriersud <couriersud@arcor.de> | 2016-05-12 01:13:27 +0200 |
---|---|---|
committer | couriersud <couriersud@arcor.de> | 2016-05-12 01:15:19 +0200 |
commit | 7d9c8b78eab2cf3a072bb0a1157cbca3f3d4b37b (patch) | |
tree | 67ac639e2afdd6843cfc6b3697e5859c68e14fe2 /src/lib/netlist | |
parent | c2fb41964cc06c3ecf0e58f584e1cb1f3ecec992 (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.cpp | 75 | ||||
-rw-r--r-- | src/lib/netlist/nl_base.h | 14 | ||||
-rw-r--r-- | src/lib/netlist/nl_setup.cpp | 17 | ||||
-rw-r--r-- | src/lib/netlist/solver/nld_solver.cpp | 3 |
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(); } |