diff options
author | 2016-03-05 17:11:04 +0100 | |
---|---|---|
committer | 2016-03-14 20:24:29 +0100 | |
commit | 41c8a9f6fa49b10c021196463adc654ecce25790 (patch) | |
tree | 2e59db2aa4d0730711e7e0a9541905b2f6380479 /src | |
parent | 0e48eb2a4392df8dd020f42432d90f614d73c6b3 (diff) |
netlist updates:
- First steps to move towards c++11.
- Base plist on std::vector
- Replace pstack with std::stack
- Remove pnamed_list
- use c++ "for each" in a number of places
- Fixed two "time bombs"
[couriersud]
Diffstat (limited to 'src')
30 files changed, 393 insertions, 618 deletions
diff --git a/src/lib/netlist/devices/nld_7404.h b/src/lib/netlist/devices/nld_7404.h index 60465f74d9c..18e7fe8087d 100644 --- a/src/lib/netlist/devices/nld_7404.h +++ b/src/lib/netlist/devices/nld_7404.h @@ -47,8 +47,8 @@ NETLIB_TRUTHTABLE(7404, 1, 1, 0); #else NETLIB_DEVICE(7404, public: - netlist_logic_input_t m_I[1]; - netlist_logic_output_t m_Q[1]; + logic_input_t m_I[1]; + logic_output_t m_Q[1]; ); #endif diff --git a/src/lib/netlist/devices/nld_7486.h b/src/lib/netlist/devices/nld_7486.h index 788b633dfe1..affc57b51ed 100644 --- a/src/lib/netlist/devices/nld_7486.h +++ b/src/lib/netlist/devices/nld_7486.h @@ -51,11 +51,11 @@ NETLIB_TRUTHTABLE(7486, 2, 1, 0); #else NETLIB_DEVICE(7486, public: - netlist_logic_input_t m_I[2]; - netlist_logic_output_t m_Q[1]; + logic_input_t m_I[2]; + logic_output_t m_Q[1]; - ATTR_HOT void inc_active(); - ATTR_HOT void dec_active(); + ATTR_HOT void inc_active() override; + ATTR_HOT void dec_active() override; int m_active; ); #endif diff --git a/src/lib/netlist/devices/nld_82S16.cpp b/src/lib/netlist/devices/nld_82S16.cpp index 07990ffa598..593ea1b0d89 100644 --- a/src/lib/netlist/devices/nld_82S16.cpp +++ b/src/lib/netlist/devices/nld_82S16.cpp @@ -22,7 +22,7 @@ NETLIB_UPDATE(82S16) } else { - int adr = 0; + unsigned int adr = 0; for (int i=0; i<8; i++) { //m_A[i].activate(); @@ -31,9 +31,9 @@ NETLIB_UPDATE(82S16) if (!INPLOGIC(m_WEQ)) { - m_ram[adr] = INPLOGIC(m_DIN); + m_ram[adr >> 6] = (m_ram[adr >> 6] & ~((UINT64) 1 << (adr & 0x3f))) | ((UINT64) INPLOGIC(m_DIN) << (adr & 0x3f)); } - OUTLOGIC(m_DOUTQ, m_ram[adr] ^ 1, NLTIME_FROM_NS(20)); + OUTLOGIC(m_DOUTQ, ((m_ram[adr >> 6] >> (adr & 0x3f)) & 1) ^ 1, NLTIME_FROM_NS(20)); } } @@ -62,7 +62,7 @@ NETLIB_START(82S16) NETLIB_RESET(82S16) { - for (int i=0; i<256; i++) + for (int i=0; i<4; i++) { m_ram[i] = 0; } diff --git a/src/lib/netlist/devices/nld_82S16.h b/src/lib/netlist/devices/nld_82S16.h index b6d8f6565d6..bb3f1c873ad 100644 --- a/src/lib/netlist/devices/nld_82S16.h +++ b/src/lib/netlist/devices/nld_82S16.h @@ -44,7 +44,7 @@ NETLIB_DEVICE(82S16, logic_output_t m_DOUTQ; //netlist_state_t<UINT8[256]> m_ram; - UINT8 m_ram[256]; + UINT64 m_ram[4]; // 256 bits ); NETLIB_DEVICE_DERIVED_PURE(82S16_dip, 82S16); diff --git a/src/lib/netlist/devices/nld_9312.h b/src/lib/netlist/devices/nld_9312.h index ab5c0a8f8c9..2d982474377 100644 --- a/src/lib/netlist/devices/nld_9312.h +++ b/src/lib/netlist/devices/nld_9312.h @@ -58,13 +58,13 @@ NETLIB_TRUTHTABLE(9312, 12, 2, 0); NETLIB_DEVICE(9312, public: // C, B, A, G,D0,D1,D2,D3,D4,D5,D6,D7| Y,YQ - netlist_logic_input_t m_A; - netlist_logic_input_t m_B; - netlist_logic_input_t m_C; - netlist_logic_input_t m_G; - netlist_logic_input_t m_D[8]; - netlist_logic_output_t m_Y; - netlist_logic_output_t m_YQ; + logic_input_t m_A; + logic_input_t m_B; + logic_input_t m_C; + logic_input_t m_G; + logic_input_t m_D[8]; + logic_output_t m_Y; + logic_output_t m_YQ; UINT8 m_last_chan; UINT8 m_last_G; diff --git a/src/lib/netlist/devices/nld_system.cpp b/src/lib/netlist/devices/nld_system.cpp index ca96f776aac..2cb65c7a543 100644 --- a/src/lib/netlist/devices/nld_system.cpp +++ b/src/lib/netlist/devices/nld_system.cpp @@ -329,7 +329,7 @@ NETLIB_START(function) if (err) netlist().log().fatal("nld_function: unknown/misformatted token <{1}> in <{2}>", cmd, m_func.Value()); } - m_precompiled.add(rc); + m_precompiled.push_back(rc); } } diff --git a/src/lib/netlist/devices/nld_truthtable.cpp b/src/lib/netlist/devices/nld_truthtable.cpp index 1f671b23108..09e5b4cff96 100644 --- a/src/lib/netlist/devices/nld_truthtable.cpp +++ b/src/lib/netlist/devices/nld_truthtable.cpp @@ -100,7 +100,7 @@ UINT32 truthtable_desc_t::get_ignored_extended(UINT32 i) // ---------------------------------------------------------------------------------------- void truthtable_desc_t::help(unsigned cur, pstring_list_t list, - UINT64 state,UINT16 val, UINT8 *timing_index) + UINT64 state,UINT16 val, parray_t<UINT8> &timing_index) { pstring elem = list[cur].trim(); int start = 0; @@ -192,8 +192,11 @@ void truthtable_desc_t::setup(const pstring_list_t &truthtable, UINT32 disabled_ tindex[j] = k; } - help(0, inout, 0 , val, tindex.data()); - ttline = truthtable[line]; + help(0, inout, 0 , val, tindex); + if (line < truthtable.size()) + ttline = truthtable[line]; + else + ttline = ""; line++; } diff --git a/src/lib/netlist/devices/nld_truthtable.h b/src/lib/netlist/devices/nld_truthtable.h index 47e479a0256..0eb5d41565e 100644 --- a/src/lib/netlist/devices/nld_truthtable.h +++ b/src/lib/netlist/devices/nld_truthtable.h @@ -30,10 +30,10 @@ # _name, # _name, "+" _def_params); #define TT_HEAD(_x) \ - ttd->m_desc.add(_x); + ttd->m_desc.push_back(_x); #define TT_LINE(_x) \ - ttd->m_desc.add(_x); + ttd->m_desc.push_back(_x); #define TT_FAMILY(_x) \ ttd->m_family = setup.family_from_model(_x); @@ -69,7 +69,7 @@ struct truthtable_desc_t private: void help(unsigned cur, pstring_list_t list, - UINT64 state,UINT16 val, UINT8 *timing_index); + UINT64 state,UINT16 val, parray_t<UINT8> &timing_index); static unsigned count_bits(UINT32 v); static UINT32 set_bits(UINT32 v, UINT32 b); UINT32 get_ignored_simple(UINT32 i); @@ -114,7 +114,7 @@ public: { while (*desc != NULL && **desc != 0 ) { - m_desc.add(*desc); + m_desc.push_back(*desc); desc++; } diff --git a/src/lib/netlist/nl_base.cpp b/src/lib/netlist/nl_base.cpp index f39de181da1..964ac8b4e03 100644 --- a/src/lib/netlist/nl_base.cpp +++ b/src/lib/netlist/nl_base.cpp @@ -186,16 +186,15 @@ netlist_t::netlist_t() netlist_t::~netlist_t() { - for (std::size_t i=0; i < m_nets.size(); i++) + for (net_t *net : m_nets) { - if (!m_nets[i]->isRailNet()) + if (!net->isRailNet()) { - pfree(m_nets[i]); + pfree(net); } } m_nets.clear(); - m_devices.clear_and_free(); pstring::resetmem(); @@ -237,12 +236,9 @@ ATTR_COLD void netlist_t::start() m_use_deactivate = (m_params->m_use_deactivate.Value() ? true : false); log().debug("Initializing devices ...\n"); - for (std::size_t i = 0; i < m_devices.size(); i++) - { - device_t *dev = m_devices[i]; + for (device_t *dev : m_devices) if (dev != m_solver && dev != m_params) dev->start_dev(); - } } @@ -251,28 +247,23 @@ ATTR_COLD void netlist_t::stop() /* find the main clock and solver ... */ log().debug("Stopping all devices ...\n"); - - // Step all devices once ! - for (std::size_t i = 0; i < m_devices.size(); i++) - { - m_devices[i]->stop_dev(); - } + for (device_t *dev : m_devices) + dev->stop_dev(); } ATTR_COLD net_t *netlist_t::find_net(const pstring &name) { - for (std::size_t i = 0; i < m_nets.size(); i++) - { - if (m_nets[i]->name() == name) - return m_nets[i]; - } + for (net_t *net : m_nets) + if (net->name() == name) + return net; + return NULL; } ATTR_COLD void netlist_t::rebuild_lists() { - for (std::size_t i = 0; i < m_nets.size(); i++) - m_nets[i]->rebuild_list(); + for (net_t *net : m_nets) + net->rebuild_list(); } @@ -303,9 +294,9 @@ ATTR_COLD void netlist_t::reset() // FIXME: some const devices rely on this /* make sure params are set now .. */ - for (std::size_t i = 0; i < m_devices.size(); i++) + for (device_t *dev : m_devices) { - m_devices[i]->update_param(); + dev->update_param(); } } @@ -318,7 +309,7 @@ ATTR_HOT void netlist_t::process_queue(const netlist_time &delta) { while ( (m_time < m_stop) && (m_queue.is_not_empty())) { - const queue_t::entry_t e = *m_queue.pop(); + const queue_t::entry_t &e = m_queue.pop(); m_time = e.exec_time(); e.object()->update_devs(); @@ -336,21 +327,25 @@ ATTR_HOT void netlist_t::process_queue(const netlist_time &delta) { if (m_queue.is_not_empty()) { - while (m_queue.peek()->exec_time() > mc_time) + while (m_queue.top().exec_time() > mc_time) { m_time = mc_time; mc_time += inc; - devices::NETLIB_NAME(mainclock)::mc_update(mc_net); + mc_net.toggle_new_Q(); + mc_net.update_devs(); + //devices::NETLIB_NAME(mainclock)::mc_update(mc_net); } - const queue_t::entry_t e = *m_queue.pop(); + const queue_t::entry_t &e = m_queue.pop(); m_time = e.exec_time(); e.object()->update_devs(); } else { m_time = mc_time; mc_time += inc; - devices::NETLIB_NAME(mainclock)::mc_update(mc_net); + mc_net.toggle_new_Q(); + mc_net.update_devs(); + //devices::NETLIB_NAME(mainclock)::mc_update(mc_net); } add_to_stat(m_perf_out_processed, 1); @@ -435,13 +430,13 @@ ATTR_HOT netlist_sig_t core_device_t::INPLOGIC_PASSIVE(logic_input_t &inp) device_t::device_t() : core_device_t(GENERIC), - m_terminals(20) + m_terminals() { } device_t::device_t(const family_t afamily) : core_device_t(afamily), - m_terminals(20) + m_terminals() { } @@ -477,7 +472,7 @@ ATTR_COLD void device_t::register_subalias(const pstring &name, core_terminal_t setup().register_alias_nofqn(alias, term.name()); if (term.isType(terminal_t::INPUT) || term.isType(terminal_t::TERMINAL)) - m_terminals.add(alias); + m_terminals.push_back(alias); } ATTR_COLD void device_t::register_subalias(const pstring &name, const pstring &aliased) @@ -497,7 +492,7 @@ ATTR_COLD void device_t::register_terminal(const pstring &name, terminal_t &port { setup().register_object(*this, name, port); if (port.isType(terminal_t::INPUT) || port.isType(terminal_t::TERMINAL)) - m_terminals.add(port.name()); + m_terminals.push_back(port.name()); } ATTR_COLD void device_t::register_output(const pstring &name, logic_output_t &port) @@ -515,13 +510,13 @@ ATTR_COLD void device_t::register_input(const pstring &name, logic_input_t &inp) { inp.set_logic_family(this->logic_family()); setup().register_object(*this, name, inp); - m_terminals.add(inp.name()); + m_terminals.push_back(inp.name()); } ATTR_COLD void device_t::register_input(const pstring &name, analog_input_t &inp) { setup().register_object(*this, name, inp); - m_terminals.add(inp.name()); + m_terminals.push_back(inp.name()); } ATTR_COLD void device_t::connect_late(core_terminal_t &t1, core_terminal_t &t2) @@ -584,7 +579,7 @@ ATTR_COLD net_t::~net_t() ATTR_COLD void net_t::init_object(netlist_t &nl, const pstring &aname) { object_t::init_object(nl, aname); - nl.m_nets.add(this); + nl.m_nets.push_back(this); } ATTR_HOT void net_t::inc_active(core_terminal_t &term) @@ -638,10 +633,10 @@ ATTR_COLD void net_t::rebuild_list() unsigned cnt = 0; m_list_active.clear(); - for (std::size_t i=0; i < m_core_terms.size(); i++) - if (m_core_terms[i]->state() != logic_t::STATE_INP_PASSIVE) + for (core_terminal_t *term : m_core_terms) + if (term->state() != logic_t::STATE_INP_PASSIVE) { - m_list_active.add(*m_core_terms[i]); + m_list_active.add(*term); cnt++; } m_active = cnt; @@ -689,14 +684,7 @@ ATTR_HOT /* inline */ void net_t::update_devs() } for (int i=0; i<cnt; i++) - t[i]->netdev().update_dev(); - core_terminal_t *p = m_list_active.first(); - - while (p != NULL) - { - p->update_dev(mask); - p = m_list_active.next(p); - } + t[i]->device().update_dev(); #else core_terminal_t *p = m_list_active.first(); @@ -704,7 +692,7 @@ ATTR_HOT /* inline */ void net_t::update_devs() while (p != NULL) { p->update_dev(mask); - p = p->m_next; + p = m_list_active.next(p); } #endif } @@ -722,14 +710,14 @@ ATTR_COLD void net_t::reset() /* rebuild m_list */ m_list_active.clear(); - for (std::size_t i=0; i < m_core_terms.size(); i++) - m_list_active.add(*m_core_terms[i]); + for (core_terminal_t *ct : m_core_terms) + m_list_active.add(*ct); - for (std::size_t i=0; i < m_core_terms.size(); i++) - m_core_terms[i]->do_reset(); + for (core_terminal_t *ct : m_core_terms) + ct->do_reset(); - for (std::size_t i=0; i < m_core_terms.size(); i++) - if (m_core_terms[i]->state() != logic_t::STATE_INP_PASSIVE) + for (core_terminal_t *ct : m_core_terms) + if (ct->state() != logic_t::STATE_INP_PASSIVE) m_active++; } @@ -737,7 +725,7 @@ ATTR_COLD void net_t::register_con(core_terminal_t &terminal) { terminal.set_net(*this); - m_core_terms.add(&terminal); + m_core_terms.push_back(&terminal); if (terminal.state() != logic_t::STATE_INP_PASSIVE) m_active++; @@ -745,11 +733,8 @@ ATTR_COLD void net_t::register_con(core_terminal_t &terminal) ATTR_COLD void net_t::move_connections(net_t *dest_net) { - for (std::size_t i = 0; i < m_core_terms.size(); i++) - { - core_terminal_t *p = m_core_terms[i]; - dest_net->register_con(*p); - } + for (core_terminal_t *ct : m_core_terms) + dest_net->register_con(*ct); m_core_terms.clear(); m_active = 0; } @@ -842,10 +827,9 @@ ATTR_COLD void analog_net_t::process_net(list_t *groups, int &cur_group) if (num_cons() == 0) return; /* add the net */ - groups[cur_group].add(this); - for (std::size_t i = 0; i < m_core_terms.size(); i++) + groups[cur_group].push_back(this); + for (core_terminal_t *p : m_core_terms) { - core_terminal_t *p = m_core_terms[i]; if (p->isType(terminal_t::TERMINAL)) { terminal_t *pt = static_cast<terminal_t *>(p); @@ -863,7 +847,7 @@ ATTR_COLD void analog_net_t::process_net(list_t *groups, int &cur_group) ATTR_COLD core_terminal_t::core_terminal_t(const type_t atype, const family_t afamily) : device_object_t(atype, afamily) -, plinkedlist_element_t<core_terminal_t>() +, plinkedlist_element_t() , m_net(NULL) , m_state(STATE_NONEX) { diff --git a/src/lib/netlist/nl_base.h b/src/lib/netlist/nl_base.h index 5289a3171e0..1c062b579f8 100644 --- a/src/lib/netlist/nl_base.h +++ b/src/lib/netlist/nl_base.h @@ -155,6 +155,8 @@ #ifndef NLBASE_H_ #define NLBASE_H_ +#include <vector> + #include "nl_lists.h" #include "nl_time.h" #include "nl_util.h" @@ -165,7 +167,14 @@ // Type definitions // ---------------------------------------------------------------------------------------- -typedef UINT8 netlist_sig_t; +//typedef UINT8 netlist_sig_t; + +/* + * unsigned int would be a 20% speed increase over UINT8 for pong. + * For breakout it causes a slight decrease. + * + */ +typedef unsigned int netlist_sig_t; //============================================================ // MACROS / netlist devices @@ -1193,7 +1202,7 @@ namespace netlist { _device_class *dev = dynamic_cast<_device_class *>(m_devices[i]); if (dev != NULL) - tmp.add(dev); + tmp.push_back(dev); } return tmp; } @@ -1228,7 +1237,7 @@ namespace netlist return ret; } - pnamedlist_t<device_t *> m_devices; + plist_t<device_t *> m_devices; net_t::list_t m_nets; #if (NL_KEEP_STATISTICS) pnamedlist_t<core_device_t *> m_started_devices; diff --git a/src/lib/netlist/nl_lists.h b/src/lib/netlist/nl_lists.h index b861d1e84e2..ac288fec153 100644 --- a/src/lib/netlist/nl_lists.h +++ b/src/lib/netlist/nl_lists.h @@ -64,12 +64,12 @@ namespace netlist /* Lock */ while (atomic_exchange32(&m_lock, 1)) { } #endif - const _Time t = e.exec_time(); + const _Time &t = e.exec_time(); entry_t * i = m_end++; - while (t > (i - 1)->exec_time()) + for (; t > (i - 1)->exec_time(); i--) { *(i) = *(i-1); - i--; + //i--; inc_stat(m_prof_sortmove); } *i = e; @@ -80,14 +80,14 @@ namespace netlist //nl_assert(m_end - m_list < _Size); } - ATTR_HOT const entry_t *pop() + ATTR_HOT const entry_t & pop() { - return --m_end; + return *(--m_end); } - ATTR_HOT const entry_t *peek() const + ATTR_HOT const entry_t & top() const { - return (m_end-1); + return *(m_end-1); } ATTR_HOT void remove(const _Element &elem) @@ -96,8 +96,7 @@ namespace netlist #if HAS_OPENMP && USE_OPENMP while (atomic_exchange32(&m_lock, 1)) { } #endif - entry_t * i = m_end - 1; - while (i > &m_list[0]) + for (entry_t * i = m_end - 1; i > &m_list[0]; i--) { if (i->object() == elem) { @@ -112,7 +111,6 @@ namespace netlist #endif return; } - i--; } #if HAS_OPENMP && USE_OPENMP m_lock = 0; @@ -148,9 +146,7 @@ namespace netlist volatile INT32 m_lock; #endif entry_t * m_end; - //entry_t m_list[_Size]; parray_t<entry_t> m_list; - }; } diff --git a/src/lib/netlist/nl_parser.cpp b/src/lib/netlist/nl_parser.cpp index 638bbae219a..2f4be0f9a57 100644 --- a/src/lib/netlist/nl_parser.cpp +++ b/src/lib/netlist/nl_parser.cpp @@ -168,13 +168,13 @@ void parser_t::net_truthtable_start() if (token.is(m_tok_TT_HEAD)) { require_token(m_tok_param_left); - ttd->m_desc.add(get_string()); + ttd->m_desc.push_back(get_string()); require_token(m_tok_param_right); } else if (token.is(m_tok_TT_LINE)) { require_token(m_tok_param_left); - ttd->m_desc.add(get_string()); + ttd->m_desc.push_back(get_string()); require_token(m_tok_param_right); } else if (token.is(m_tok_TT_FAMILY)) @@ -296,13 +296,13 @@ void parser_t::dippins() { pstring_list_t pins; - pins.add(get_identifier()); + pins.push_back(get_identifier()); require_token(m_tok_comma); while (true) { pstring t1 = get_identifier(); - pins.add(t1); + pins.push_back(t1); token_t n = get_token(); if (n.is(m_tok_param_right)) break; diff --git a/src/lib/netlist/nl_setup.cpp b/src/lib/netlist/nl_setup.cpp index 99874a0a06d..1975d088f73 100644 --- a/src/lib/netlist/nl_setup.cpp +++ b/src/lib/netlist/nl_setup.cpp @@ -53,6 +53,7 @@ namespace netlist setup_t::setup_t(netlist_t *netlist) : m_netlist(netlist) , m_proxy_cnt(0) + , m_frontier_cnt(0) { netlist->set_setup(this); m_factory = palloc(factory_list_t(*this)); @@ -85,7 +86,7 @@ ATTR_COLD pstring setup_t::build_fqn(const pstring &obj_name) const if (m_stack.empty()) return netlist().name() + "." + obj_name; else - return m_stack.peek() + "." + obj_name; + return m_stack.top() + "." + obj_name; } void setup_t::namespace_push(const pstring &aname) @@ -93,7 +94,7 @@ void setup_t::namespace_push(const pstring &aname) if (m_stack.empty()) m_stack.push(netlist().name() + "." + aname); else - m_stack.push(m_stack.peek() + "." + aname); + m_stack.push(m_stack.top() + "." + aname); } void setup_t::namespace_pop() @@ -108,8 +109,11 @@ device_t *setup_t::register_dev(device_t *dev, const pstring &name) dev->init(netlist(), fqn); - if (!(netlist().m_devices.add(dev, false)==true)) - log().fatal("Error adding {1} to device list\n", name); + for (auto & d : netlist().m_devices) + if (d->name() == dev->name()) + log().fatal("Error adding {1} to device list. Duplicate name \n", name); + + netlist().m_devices.push_back(dev); return dev; } @@ -118,7 +122,7 @@ void setup_t::register_lib_entry(const pstring &name) if (m_lib.contains(name)) log().warning("Lib entry collection already contains {1}. IGNORED", name); else - m_lib.add(name); + m_lib.push_back(name); } device_t *setup_t::register_dev(const pstring &classname, const pstring &name) @@ -235,7 +239,6 @@ void setup_t::register_object(device_t &dev, const pstring &name, object_t &obj) case terminal_t::PARAM: { param_t ¶m = dynamic_cast<param_t &>(obj); - //printf("name: {1}\n", name); if (m_params_temp.contains(name)) { const pstring val = m_params_temp[name]; @@ -305,7 +308,7 @@ void setup_t::register_link_fqn(const pstring &sin, const pstring &sout) { link_t temp = link_t(sin, sout); log().debug("link {1} <== {2}\n", sin, sout); - m_links.add(temp); + m_links.push_back(temp); } void setup_t::register_link(const pstring &sin, const pstring &sout) @@ -317,11 +320,13 @@ void setup_t::remove_connections(const pstring pin) { pstring pinfn = build_fqn(pin); bool found = false; - for (std::size_t i = 0; i < m_links.size(); i++) + + for (int i = m_links.size() - 1; i >= 0; i--) { - if ((m_links[i].e1 == pinfn) || (m_links[i].e2 == pinfn)) + auto &link = m_links[i]; + if ((link.e1 == pinfn) || (link.e2 == pinfn)) { - log().verbose("removing connection: {1} <==> {2}\n", m_links[i].e1, m_links[i].e2); + log().verbose("removing connection: {1} <==> {2}\n", link.e1, link.e2); m_links.remove_at(i); found = true; } @@ -333,25 +338,24 @@ void setup_t::remove_connections(const pstring pin) void setup_t::register_frontier(const pstring attach, const double r_IN, const double r_OUT) { - static int frontier_cnt = 0; - pstring frontier_name = pfmt("frontier_{1}")(frontier_cnt); - frontier_cnt++; + pstring frontier_name = pfmt("frontier_{1}")(m_frontier_cnt); + m_frontier_cnt++; device_t *front = register_dev("FRONTIER_DEV", frontier_name); register_param(frontier_name + ".RIN", r_IN); register_param(frontier_name + ".ROUT", r_OUT); register_link(frontier_name + ".G", "GND"); pstring attfn = build_fqn(attach); bool found = false; - for (std::size_t i = 0; i < m_links.size(); i++) + for (auto & link : m_links) { - if (m_links[i].e1 == attfn) + if (link.e1 == attfn) { - m_links[i].e1 = front->name() + ".I"; + link.e1 = front->name() + ".I"; found = true; } - else if (m_links[i].e2 == attfn) + else if (link.e2 == attfn) { - m_links[i].e2 = front->name() + ".I"; + link.e2 = front->name() + ".I"; found = true; } } @@ -472,7 +476,6 @@ devices::nld_base_proxy *setup_t::get_d_a_proxy(core_terminal_t &out) { nl_assert(out.isFamily(terminal_t::LOGIC)); - //printf("proxy for {1}\n", out.name());; logic_output_t &out_cast = dynamic_cast<logic_output_t &>(out); devices::nld_base_proxy *proxy = out_cast.get_proxy(); @@ -486,18 +489,16 @@ devices::nld_base_proxy *setup_t::get_d_a_proxy(core_terminal_t &out) register_dev(new_proxy, x); new_proxy->start_dev(); -#if 1 /* connect all existing terminals to new net */ - for (std::size_t i = 0; i < out.net().m_core_terms.size(); i++) + for (core_terminal_t *p : out.net().m_core_terms) { - core_terminal_t *p = out.net().m_core_terms[i]; p->clear_net(); // de-link from all nets ... if (!connect(new_proxy->proxy_term(), *p)) log().fatal("Error connecting {1} to {2}\n", new_proxy->proxy_term().name(), (*p).name()); } out.net().m_core_terms.clear(); // clear the list -#endif + out.net().register_con(new_proxy->in()); out_cast.set_proxy(new_proxy); proxy = new_proxy; @@ -648,13 +649,11 @@ bool setup_t::connect_input_input(core_terminal_t &t1, core_terminal_t &t2) ret = connect(t2, t1.net().railterminal()); if (!ret) { - for (std::size_t i=0; i<t1.net().m_core_terms.size(); i++) + for (core_terminal_t *t : t1.net().m_core_terms) { - if (t1.net().m_core_terms[i]->isType(core_terminal_t::TERMINAL) + if (t->isType(core_terminal_t::TERMINAL) /*|| t1.net().m_core_terms[i]->isType(netlist_core_terminal_t::OUTPUT)*/) - { - ret = connect(t2, *t1.net().m_core_terms[i]); - } + ret = connect(t2, *t); if (ret) break; } @@ -666,13 +665,11 @@ bool setup_t::connect_input_input(core_terminal_t &t1, core_terminal_t &t2) ret = connect(t1, t2.net().railterminal()); if (!ret) { - for (std::size_t i=0; i<t2.net().m_core_terms.size(); i++) + for (core_terminal_t *t : t2.net().m_core_terms) { - if (t2.net().m_core_terms[i]->isType(core_terminal_t::TERMINAL) + if (t->isType(core_terminal_t::TERMINAL) /*|| t2.net().m_core_terms[i]->isType(netlist_core_terminal_t::OUTPUT)*/) - { - ret = connect(t1, *t2.net().m_core_terms[i]); - } + ret = connect(t1, *t); if (ret) break; } @@ -774,24 +771,20 @@ void setup_t::resolve_inputs() net_t::list_t todelete; - for (std::size_t i = 0; i<netlist().m_nets.size(); i++) + for (net_t *net : netlist().m_nets) { - if (netlist().m_nets[i]->num_cons() == 0) - { - todelete.add(netlist().m_nets[i]); - } + if (net->num_cons() == 0) + todelete.push_back(net); else - { - netlist().m_nets[i]->rebuild_list(); - } + net->rebuild_list(); } - for (std::size_t i=0; i < todelete.size(); i++) + for (net_t *net : todelete) { - log().verbose("Deleting net {1} ...", todelete[i]->name()); - netlist().m_nets.remove(todelete[i]); - if (!todelete[i]->isRailNet()) - pfree(todelete[i]); + log().verbose("Deleting net {1} ...", net->name()); + netlist().m_nets.remove(net); + if (!net->isRailNet()) + pfree(net); } pstring errstr(""); @@ -819,13 +812,8 @@ void setup_t::resolve_inputs() { has_twoterms = true; if (t->m_N.net().isRailNet() && t->m_P.net().isRailNet()) -#if 0 - netlist().fatal("Found device {1} connected only to railterminals {2}/{3}\n", - t->name(), t->m_N.net().name(), t->m_P.net().name()); -#else log().warning("Found device {1} connected only to railterminals {2}/{3}\n", t->name(), t->m_N.net().name(), t->m_P.net().name()); -#endif } } @@ -848,15 +836,14 @@ void setup_t::start_devices() if (env != "") { log().debug("Creating dynamic logs ...\n"); - pstring_list_t ll(env, ":"); - for (unsigned i=0; i < ll.size(); i++) + pstring_list_t loglist(env, ":"); + for (pstring ll : loglist) { - log().debug("{1}: <{2}>\n",i, ll[i]); - log().debug("{1}: <{2}>\n",i, ll[i]); device_t *nc = factory().new_device_by_name("LOG"); - pstring name = "log_" + ll[i]; + pstring name = "log_" + ll; register_dev(nc, name); - register_link(name + ".I", ll[i]); + register_link(name + ".I", ll); + log().debug(" dynamic link {1}: <{2}>\n",ll, name); } } @@ -958,12 +945,12 @@ void setup_t::model_parse(const pstring &model_in, model_map_t &map) remainder = remainder.left(remainder.len() - 1); pstring_list_t pairs(remainder," ", true); - for (unsigned i=0; i<pairs.size(); i++) + for (pstring &pe : pairs) { - int pose = pairs[i].find("="); + int pose = pe.find("="); if (pose < 0) log().fatal("Model error on pair {1}\n", model); - map[pairs[i].left(pose).ucase()] = pairs[i].substr(pose+1); + map[pe.left(pose).ucase()] = pe.substr(pose+1); } } @@ -1012,9 +999,9 @@ nl_double setup_t::model_value(model_map_t &map, const pstring &entity) void setup_t::include(const pstring &netlist_name) { - for (std::size_t i=0; i < m_sources.size(); i++) + for (source_t *source : m_sources) { - if (m_sources[i]->parse(*this, netlist_name)) + if (source->parse(*this, netlist_name)) return; } log().fatal("unable to find {1} in source collection", netlist_name); diff --git a/src/lib/netlist/nl_setup.h b/src/lib/netlist/nl_setup.h index 4dd12b59854..058d8dcfd17 100644 --- a/src/lib/netlist/nl_setup.h +++ b/src/lib/netlist/nl_setup.h @@ -181,7 +181,7 @@ namespace netlist /* register a source */ - void register_source(source_t *src) { m_sources.add(src); } + void register_source(source_t *src) { m_sources.push_back(src); } factory_list_t &factory() { return *m_factory; } const factory_list_t &factory() const { return *m_factory; } @@ -231,8 +231,9 @@ namespace netlist phashmap_t<pstring, pstring> m_models; int m_proxy_cnt; + int m_frontier_cnt; - pstack_t<pstring> m_stack; + std::stack<pstring> m_stack; source_t::list_t m_sources; plist_t<pstring> m_lib; diff --git a/src/lib/netlist/plib/pconfig.h b/src/lib/netlist/plib/pconfig.h index 6a96eca52d1..06019dc6d26 100644 --- a/src/lib/netlist/plib/pconfig.h +++ b/src/lib/netlist/plib/pconfig.h @@ -12,7 +12,7 @@ #define PSTANDALONE (0) #endif -//#define PHAS_INT128 (0) +#define PHAS_INT128 (0) #ifndef PHAS_INT128 #define PHAS_INT128 (0) diff --git a/src/lib/netlist/plib/plists.h b/src/lib/netlist/plib/plists.h index dd26cfb963b..4e2026cb084 100644 --- a/src/lib/netlist/plib/plists.h +++ b/src/lib/netlist/plib/plists.h @@ -13,6 +13,8 @@ #include <cstring> #include <algorithm> #include <cmath> +#include <stack> +#include <vector> #include "palloc.h" #include "pstring.h" @@ -55,15 +57,8 @@ public: m_list = NULL; } - /* using the [] operator will not allow gcc to vectorize code because - * basically a pointer is returned. - * array works around this. - */ - - ATTR_HOT _ListClass *data() { return m_list; } - - ATTR_HOT _ListClass& operator[](std::size_t index) { return m_list[index]; } - ATTR_HOT const _ListClass& operator[](std::size_t index) const { return m_list[index]; } + ATTR_HOT _ListClass& operator[](const std::size_t index) { return m_list[index]; } + ATTR_HOT const _ListClass& operator[](const std::size_t index) const { return m_list[index]; } ATTR_HOT std::size_t size() const { return m_capacity; } @@ -93,385 +88,78 @@ private: // ---------------------------------------------------------------------------------------- // plist_t: a simple list // ---------------------------------------------------------------------------------------- -#if 0 -#include <vector> -//#define plist_t std::vector + template <typename _ListClass> class plist_t : public std::vector<_ListClass> { public: plist_t() : std::vector<_ListClass>() {} - plist_t(const int numElements) : std::vector<_ListClass>(numElements) {} - void add(const _ListClass &elem) { this->push_back(elem); } void clear_and_free() { - for (_ListClass *i = this->data(); i < this->data() + this->size(); i++) - { - pfree(*i); - } - this->clear(); - } - bool contains(const _ListClass &elem) const - { - for (const _ListClass *i = this->data(); i < this->data() + this->size(); i++) - { - if (*i == elem) - return true; - } - return false; - } - - void remove(const _ListClass &elem) - { - for (int i = 0; i < this->size(); i++) - { - if (this->at(i) == elem) - { - this->erase(this->begin() + i); - return; - } - } - } - void remove_at(const int pos) - { - this->erase(this->begin() + pos); - } - - int indexof(const _ListClass &elem) const - { - for (int i = 0; i < this->size(); i++) - { - if (this->at(i) == elem) - return i; - } - return -1; - } - - ATTR_HOT void swap(const int pos1, const int pos2) - { - //nl_assert((pos1>=0) && (pos1<m_count)); - //nl_assert((pos2>=0) && (pos2<m_count)); - _ListClass tmp = (*this)[pos1]; - (*this)[pos1] = (*this)[pos2]; - (*this)[pos2] =tmp; - } - -}; - -#else -template <typename _ListClass> -class plist_t -{ -public: - - ATTR_COLD plist_t(const std::size_t numElements = 0) - { - m_capacity = numElements; - if (m_capacity == 0) - m_list = NULL; - else - m_list = this->alloc(m_capacity); - m_count = 0; - } - - ATTR_COLD plist_t(const plist_t &rhs) - { - m_capacity = rhs.capacity(); - if (m_capacity == 0) - m_list = NULL; - else - m_list = this->alloc(m_capacity); - m_count = 0; - for (std::size_t i=0; i<rhs.size(); i++) + for (_ListClass i : *this) { - this->add(rhs[i]); + pfree(i); } - } - - ATTR_COLD plist_t &operator=(const plist_t &rhs) - { this->clear(); - for (std::size_t i=0; i<rhs.size(); i++) - { - this->add(rhs[i]); - } - return *this; } - - ~plist_t() + bool contains(const _ListClass &elem) const { - if (m_list != NULL) - this->dealloc(m_list); - m_list = NULL; + return (std::find(this->begin(), this->end(), elem) != this->end()); } - ATTR_HOT _ListClass *data() { return m_list; } - - ATTR_HOT _ListClass& operator[](std::size_t index) { return *(m_list + index); } - ATTR_HOT const _ListClass& operator[](std::size_t index) const { return *(m_list + index); } - - ATTR_HOT void add(const _ListClass &elem) + void remove(const _ListClass &elem) { - if (m_count >= m_capacity){ - std::size_t new_size = m_capacity * 2; - if (new_size < 32) - new_size = 32; - set_capacity(new_size); - } - - m_list[m_count++] = elem; + this->erase(std::remove(this->begin(), this->end(), elem), this->end()); } - ATTR_HOT void insert_at(const _ListClass &elem, const std::size_t index) + ATTR_HOT void insert_at(const std::size_t index, const _ListClass &elem) { - if (m_count >= m_capacity){ - std::size_t new_size = m_capacity * 2; - if (new_size < 32) - new_size = 32; - set_capacity(new_size); - } - for (std::size_t i = m_count; i>index; i--) - m_list[i] = m_list[i-1]; - m_list[index] = elem; - m_count++; - } - - ATTR_HOT void remove(const _ListClass &elem) - { - for (std::size_t i = 0; i < m_count; i++) - { - if (m_list[i] == elem) - { - m_count --; - while (i < m_count) - { - m_list[i] = m_list[i+1]; - i++; - } - return; - } - } + this->insert(this->begin() + index, elem); } ATTR_HOT void remove_at(const std::size_t pos) { - //nl_assert((pos>=0) && (pos<m_count)); - m_count--; - for (std::size_t i = pos; i < m_count; i++) - { - m_list[i] = m_list[i+1]; - } - } - - ATTR_HOT void swap(const std::size_t pos1, const std::size_t pos2) - { - //nl_assert((pos1>=0) && (pos1<m_count)); - //nl_assert((pos2>=0) && (pos2<m_count)); - _ListClass tmp = m_list[pos1]; - m_list[pos1] = m_list[pos2]; - m_list[pos2] =tmp; - } - - ATTR_HOT bool contains(const _ListClass &elem) const - { - for (_ListClass *i = m_list; i < m_list + m_count; i++) - { - if (*i == elem) - return true; - } - return false; + this->erase(this->begin() + pos); } - ATTR_HOT int indexof(const _ListClass &elem) const + int indexof(const _ListClass &elem) const { - for (std::size_t i = 0; i < m_count; i++) + for (int i = 0; i < this->size(); i++) { - if (m_list[i] == elem) + if (this->at(i) == elem) return i; } return -1; } - ATTR_HOT std::size_t size() const { return m_count; } - ATTR_HOT bool is_empty() const { return (m_count == 0); } - ATTR_HOT void clear() { m_count = 0; } - ATTR_HOT std::size_t capacity() const { return m_capacity; } - - ATTR_COLD void clear_and_free() - { - for (_ListClass *i = m_list; i < m_list + m_count; i++) - { - pfree(*i); - } - clear(); - } - -private: - ATTR_COLD void set_capacity(const std::size_t new_capacity) - { - std::size_t cnt = size(); - if (new_capacity > 0) - { - _ListClass *m_new = this->alloc(new_capacity); - _ListClass *pd = m_new; - - if (cnt > new_capacity) - cnt = new_capacity; - if (m_list != NULL) - { - for (_ListClass *ps = m_list; ps < m_list + cnt; ps++, pd++) - *pd = *ps; - this->dealloc(m_list); - } - m_list = m_new; - m_count = cnt; - } - else - { - if (m_list != NULL) - this->dealloc(m_list); - m_list = NULL; - m_count = 0; - } - m_capacity = new_capacity; - } - - _ListClass *alloc(const std::size_t n) - { - return palloc_array(_ListClass, n); - } - - void dealloc(_ListClass *p) - { - pfree_array(p); - } - - std::size_t m_count; - _ListClass * m_list; - std::size_t m_capacity; }; -#endif // ---------------------------------------------------------------------------------------- -// pnamedlist_t: a simple list of elements which have a name() interface +// plinkedlist_t: a simple linked list +// the list allows insertions / deletions if used properly // ---------------------------------------------------------------------------------------- template <class _ListClass> -class pnamedlist_t : public plist_t<_ListClass> -{ -public: - _ListClass find_by_name(const pstring &name) const - { - for (std::size_t i=0; i < this->size(); i++) - if (get_name((*this)[i]) == name) - return (*this)[i]; - return _ListClass(NULL); - } - - int index_by_name(const pstring &name) const - { - for (std::size_t i=0; i < this->size(); i++) - if (get_name((*this)[i]) == name) - return (int) i; - return -1; - } - - void remove_by_name(const pstring &name) - { - plist_t<_ListClass>::remove(find_by_name(name)); - } - - bool add(_ListClass dev, bool allow_duplicate) - { - if (allow_duplicate) - plist_t<_ListClass>::add(dev); - else - { - if (!(this->find_by_name(get_name(dev)) == _ListClass(NULL))) - return false; - plist_t<_ListClass>::add(dev); - } - return true; - } - -private: - template <typename T> const pstring &get_name(const T *elem) const { return elem->name(); } - template <typename T> const pstring &get_name(T *elem) const { return elem->name(); } - template <typename T> const pstring &get_name(const T &elem) const { return elem.name(); } - -}; - +class plinkedlist_t; -// ---------------------------------------------------------------------------------------- -// pstack_t: a simple stack -// ---------------------------------------------------------------------------------------- +#if 1 -template <class _StackClass> -class pstack_t +template <class _ListClass> +struct plinkedlist_element_t { public: - ATTR_COLD pstack_t(const int numElements = 128) - : m_list(numElements) - { - } + friend class plinkedlist_t<_ListClass>; - ATTR_COLD pstack_t(const pstack_t &rhs) - : m_list(rhs.m_list) - { - } - - ATTR_COLD pstack_t &operator=(const pstack_t &rhs) - { - m_list = rhs.m_list; - return *this; - } - - - ~pstack_t() - { - } - - ATTR_HOT void push(const _StackClass &elem) - { - m_list.add(elem); - } - - ATTR_HOT _StackClass peek() const - { - return m_list[m_list.size() - 1]; - } - - ATTR_HOT _StackClass pop() - { - _StackClass ret = peek(); - m_list.remove_at(m_list.size() - 1); - return ret; - } - - ATTR_HOT int count() const { return m_list.size(); } - ATTR_HOT bool empty() const { return (m_list.size() == 0); } - ATTR_HOT void reset() { m_list.reset(); } - ATTR_HOT int capacity() const { return m_list.capacity(); } + plinkedlist_element_t() : m_next(NULL) {} + _ListClass *next() const { return m_next; } private: - plist_t<_StackClass> m_list; -}; - -template <class _ListClass> -struct plinkedlist_element_t -{ - plinkedlist_element_t() : m_next(NULL) {} _ListClass * m_next; - }; -// ---------------------------------------------------------------------------------------- -// plinkedlist_t: a simple linked list -// ---------------------------------------------------------------------------------------- - template <class _ListClass> class plinkedlist_t { @@ -499,7 +187,7 @@ public: } p = p->m_next; } - throw pexception("element not found"); + //throw pexception("element not found"); } } @@ -541,6 +229,87 @@ public: private: _ListClass *m_head; }; +#else + +template <class _ListClass> +struct plinkedlist_element_t +{ +public: + + friend class plinkedlist_t<_ListClass>; + + plinkedlist_element_t() : m_next(NULL), m_prev(NULL) {} + + _ListClass *next() const { return m_next; } +private: + _ListClass * m_next; + _ListClass * m_prev; +}; + +template <class _ListClass> +class plinkedlist_t +{ +public: + + plinkedlist_t() : m_head(NULL), m_tail(NULL) {} + + ATTR_HOT void insert(_ListClass &elem) + { + if (m_head != NULL) + m_head->m_prev = &elem; + elem.m_next = m_head; + elem.m_prev = NULL; + m_head = &elem; + if (m_tail == NULL) + m_tail = &elem; + } + + ATTR_HOT void add(_ListClass &elem) + { + if (m_tail != NULL) + m_tail->m_next = &elem; + elem.m_prev = m_tail; + m_tail = &elem; + elem.m_next = NULL; + if (m_head == NULL) + m_head = &elem; + } + + ATTR_HOT void remove(const _ListClass &elem) + { + if (prev(elem) == NULL) + { + m_head = next(elem); + if (m_tail == &elem) + m_tail = NULL; + } + else + prev(elem)->m_next = next(elem); + + if (next(elem) == NULL) + { + m_tail = prev(elem); + if (m_head == &elem) + m_head = NULL; + } + else + next(elem)->m_prev = prev(elem); + } + + + ATTR_HOT static _ListClass *next(const _ListClass &elem) { return static_cast<_ListClass *>(elem.m_next); } + ATTR_HOT static _ListClass *next(const _ListClass *elem) { return static_cast<_ListClass *>(elem->m_next); } + ATTR_HOT static _ListClass *prev(const _ListClass &elem) { return static_cast<_ListClass *>(elem.m_prev); } + ATTR_HOT static _ListClass *prev(const _ListClass *elem) { return static_cast<_ListClass *>(elem->m_prev); } + ATTR_HOT _ListClass *first() const { return m_head; } + ATTR_HOT void clear() { m_head = m_tail = NULL; } + ATTR_HOT bool is_empty() const { return (m_head == NULL); } + +private: + _ListClass *m_head; + _ListClass *m_tail; +}; +#endif // ---------------------------------------------------------------------------------------- // string list @@ -562,7 +331,7 @@ public: { pstring t = str.substr(p, pn - p); if (!ignore_empty || t.len() != 0) - this->add(t); + this->push_back(t); p = pn + onstr.len(); pn = str.find(onstr, p); } @@ -570,7 +339,7 @@ public: { pstring t = str.substr(p); if (!ignore_empty || t.len() != 0) - this->add(t); + this->push_back(t); } } @@ -594,10 +363,10 @@ public: if (p>=0) { if (col != "") - temp.add(col); + temp.push_back(col); col = ""; - temp.add(onstrl[p]); + temp.push_back(onstrl[p]); i += onstrl[p].blen(); } else @@ -608,7 +377,7 @@ public: } } if (col != "") - temp.add(col); + temp.push_back(col); return temp; } }; @@ -768,7 +537,7 @@ public: if (m_hash[pos] == -1) { unsigned vpos = m_values.size(); - m_values.add(element_t(key, hash, value)); + m_values.push_back(element_t(key, hash, value)); m_hash[pos] = vpos; } else @@ -781,7 +550,7 @@ public: return false; /* duplicate */ } unsigned vpos = m_values.size(); - m_values.add(element_t(key, hash, value)); + m_values.push_back(element_t(key, hash, value)); m_values[vpos].m_next = m_hash[pos]; m_hash[pos] = vpos; } diff --git a/src/lib/netlist/plib/poptions.h b/src/lib/netlist/plib/poptions.h index c6daa3b2596..9c3abca49dc 100644 --- a/src/lib/netlist/plib/poptions.h +++ b/src/lib/netlist/plib/poptions.h @@ -127,7 +127,7 @@ public: int i=0; while (o[i] != NULL) { - m_opts.add(o[i]); + m_opts.push_back(o[i]); i++; } } @@ -139,7 +139,7 @@ public: void register_option(poption *opt) { - m_opts.add(opt); + m_opts.push_back(opt); } int parse(int argc, char *argv[]) diff --git a/src/lib/netlist/plib/pparser.cpp b/src/lib/netlist/plib/pparser.cpp index 4b5d7995658..774c54b12e7 100644 --- a/src/lib/netlist/plib/pparser.cpp +++ b/src/lib/netlist/plib/pparser.cpp @@ -255,16 +255,16 @@ ATTR_COLD void ptokenizer::error(const pstring &errs) ppreprocessor::ppreprocessor() : m_ifflag(0), m_level(0), m_lineno(0) { - m_expr_sep.add("!"); - m_expr_sep.add("("); - m_expr_sep.add(")"); - m_expr_sep.add("+"); - m_expr_sep.add("-"); - m_expr_sep.add("*"); - m_expr_sep.add("/"); - m_expr_sep.add("=="); - m_expr_sep.add(" "); - m_expr_sep.add("\t"); + m_expr_sep.push_back("!"); + m_expr_sep.push_back("("); + m_expr_sep.push_back(")"); + m_expr_sep.push_back("+"); + m_expr_sep.push_back("-"); + m_expr_sep.push_back("*"); + m_expr_sep.push_back("/"); + m_expr_sep.push_back("=="); + m_expr_sep.push_back(" "); + m_expr_sep.push_back("\t"); m_defines.add("__PLIB_PREPROCESSOR__", define_t("__PLIB_PREPROCESSOR__", "1")); } diff --git a/src/lib/netlist/plib/pparser.h b/src/lib/netlist/plib/pparser.h index 08294677328..111da148d7e 100644 --- a/src/lib/netlist/plib/pparser.h +++ b/src/lib/netlist/plib/pparser.h @@ -96,7 +96,7 @@ public: token_id_t register_token(pstring token) { - m_tokens.add(token); + m_tokens.push_back(token); return token_id_t(m_tokens.size() - 1); } diff --git a/src/lib/netlist/plib/pstate.cpp b/src/lib/netlist/plib/pstate.cpp index cf2c863ed11..d6ff433e388 100644 --- a/src/lib/netlist/plib/pstate.cpp +++ b/src/lib/netlist/plib/pstate.cpp @@ -37,7 +37,7 @@ ATTR_COLD void pstate_manager_t::save_state_ptr(const pstring &stname, const pst }; pstate_entry_t *p = palloc(pstate_entry_t(stname, dt, owner, size, count, ptr, is_ptr)); - m_save.add(p); + m_save.push_back(p); } ATTR_COLD void pstate_manager_t::remove_save_items(const void *owner) @@ -47,7 +47,7 @@ ATTR_COLD void pstate_manager_t::remove_save_items(const void *owner) for (std::size_t i=0; i < m_save.size(); i++) { if (m_save[i]->m_owner == owner) - todelete.add(m_save[i]); + todelete.push_back(m_save[i]); } for (std::size_t i=0; i < todelete.size(); i++) { @@ -75,6 +75,6 @@ template<> ATTR_COLD void pstate_manager_t::save_item(pstate_callback_t &state, //save_state_ptr(stname, DT_CUSTOM, 0, 1, &state); pstate_callback_t *state_p = &state; pstate_entry_t *p = palloc(pstate_entry_t(stname, owner, state_p)); - m_save.add(p); + m_save.push_back(p); state.register_state(*this, stname); } diff --git a/src/lib/netlist/plib/pstream.cpp b/src/lib/netlist/plib/pstream.cpp index ba7c5c7eda2..9702ab5dab5 100644 --- a/src/lib/netlist/plib/pstream.cpp +++ b/src/lib/netlist/plib/pstream.cpp @@ -101,7 +101,7 @@ void pifilestream::close() } } -unsigned pifilestream::vread(void *buf, unsigned n) +unsigned pifilestream::vread(void *buf, const unsigned n) { std::size_t r = fread(buf, 1, n, (FILE *) m_file); if (r < n) @@ -115,7 +115,7 @@ unsigned pifilestream::vread(void *buf, unsigned n) return r; } -void pifilestream::vseek(pos_type n) +void pifilestream::vseek(const pos_type n) { check_seekable(); if (fseek((FILE *) m_file, SEEK_SET, n) < 0) @@ -200,7 +200,7 @@ void pofilestream::close() } } -void pofilestream::vwrite(const void *buf, unsigned n) +void pofilestream::vwrite(const void *buf, const unsigned n) { std::size_t r = fwrite(buf, 1, n, (FILE *) m_file); if (r < n) @@ -211,7 +211,7 @@ void pofilestream::vwrite(const void *buf, unsigned n) m_pos += r; } -void pofilestream::vseek(pos_type n) +void pofilestream::vseek(const pos_type n) { check_seekable(); if (fseek((FILE *) m_file, SEEK_SET, n) < 0) @@ -271,7 +271,7 @@ pimemstream::~pimemstream() { } -unsigned pimemstream::vread(void *buf, unsigned n) +unsigned pimemstream::vread(void *buf, const unsigned n) { unsigned ret = (m_pos + n <= m_len) ? n : m_len - m_pos; @@ -287,7 +287,7 @@ unsigned pimemstream::vread(void *buf, unsigned n) return ret; } -void pimemstream::vseek(pos_type n) +void pimemstream::vseek(const pos_type n) { m_pos = (n>=m_len) ? m_len : n; clear_flag(FLAG_EOF); @@ -314,7 +314,7 @@ pomemstream::~pomemstream() pfree_array(m_mem); } -void pomemstream::vwrite(const void *buf, unsigned n) +void pomemstream::vwrite(const void *buf, const unsigned n) { if (m_pos + n >= m_capacity) { @@ -336,7 +336,7 @@ void pomemstream::vwrite(const void *buf, unsigned n) m_size = std::max(m_pos, m_size); } -void pomemstream::vseek(pos_type n) +void pomemstream::vseek(const pos_type n) { m_pos = n; m_size = std::max(m_pos, m_size); diff --git a/src/lib/netlist/plib/pstring.cpp b/src/lib/netlist/plib/pstring.cpp index 8ad86f41f3d..2acf1d789b1 100644 --- a/src/lib/netlist/plib/pstring.cpp +++ b/src/lib/netlist/plib/pstring.cpp @@ -314,7 +314,7 @@ long pstring_t<F>::as_long(bool *error) const #if 1 -static pstack_t<pstr_t *> *stk = NULL; +static std::stack<pstr_t *> *stk = NULL; static inline unsigned countleadbits(unsigned x) { @@ -373,7 +373,7 @@ template<typename F> pstr_t *pstring_t<F>::salloc(int n) { if (stk == NULL) - stk = palloc_array(pstack_t<pstr_t *>, 17); + stk = palloc_array(std::stack<pstr_t *>, 17); pstr_t *p; unsigned sn= ((32 - countleadbits(n)) + 1) / 2; unsigned size = sizeof(pstr_t) + ((UINT64) 1<<(sn * 2)) + 1; @@ -381,7 +381,8 @@ pstr_t *pstring_t<F>::salloc(int n) p = (pstr_t *) palloc_array(char, size); else { - p = stk[sn].pop(); + p = stk[sn].top(); + stk[sn].pop(); } // str_t *p = (str_t *) _mm_malloc(size, 8); @@ -395,8 +396,11 @@ void pstring_t<F>::resetmem() { for (unsigned i=0; i<=16; i++) { - for (; stk[i].count() > 0; ) - pfree_array(stk[i].pop()); + for (; stk[i].size() > 0; ) + { + pfree_array(stk[i].top()); + stk[i].pop(); + } } pfree_array(stk); stk = NULL; diff --git a/src/lib/netlist/prg/nltool.cpp b/src/lib/netlist/prg/nltool.cpp index 3c7065897e7..dcfe83d4450 100644 --- a/src/lib/netlist/prg/nltool.cpp +++ b/src/lib/netlist/prg/nltool.cpp @@ -272,7 +272,7 @@ plist_t<input_t> *read_input(netlist::netlist_t *netlist, pstring fname) if (l != "") { input_t inp(netlist, l); - ret->add(inp); + ret->push_back(inp); } } } diff --git a/src/lib/netlist/solver/nld_ms_direct.h b/src/lib/netlist/solver/nld_ms_direct.h index 8bb578ec6cd..ecc3cb19c3d 100644 --- a/src/lib/netlist/solver/nld_ms_direct.h +++ b/src/lib/netlist/solver/nld_ms_direct.h @@ -206,8 +206,8 @@ ATTR_COLD void matrix_solver_direct_t<m_N, _storage_N>::vsetup(analog_net_t::lis { if ((m_terms[i]->m_railstart - m_terms[i+1]->m_railstart) * sort_order < 0) { - std::swap(m_terms[i],m_terms[i+1]); - m_nets.swap(i, i+1); + std::swap(m_terms[i], m_terms[i+1]); + std::swap(m_nets[i], m_nets[i+1]); } } @@ -253,14 +253,14 @@ ATTR_COLD void matrix_solver_direct_t<m_N, _storage_N>::vsetup(analog_net_t::lis for (unsigned i = 0; i < t->m_railstart; i++) { if (!t->m_nzrd.contains(other[i]) && other[i] >= (int) (k + 1)) - t->m_nzrd.add(other[i]); + t->m_nzrd.push_back(other[i]); if (!t->m_nz.contains(other[i])) - t->m_nz.add(other[i]); + t->m_nz.push_back(other[i]); } } psort_list(t->m_nzrd); - t->m_nz.add(k); // add diagonal + t->m_nz.push_back(k); // add diagonal psort_list(t->m_nz); } @@ -283,7 +283,7 @@ ATTR_COLD void matrix_solver_direct_t<m_N, _storage_N>::vsetup(analog_net_t::lis if (touched[row][k]) { if (!m_terms[k]->m_nzbd.contains(row)) - m_terms[k]->m_nzbd.add(row); + m_terms[k]->m_nzbd.push_back(row); for (unsigned col = k; col < N(); col++) if (touched[k][col]) touched[row][col] = true; diff --git a/src/lib/netlist/solver/nld_ms_direct_lu.h b/src/lib/netlist/solver/nld_ms_direct_lu.h index 877e0b56cd8..5af166cfb84 100644 --- a/src/lib/netlist/solver/nld_ms_direct_lu.h +++ b/src/lib/netlist/solver/nld_ms_direct_lu.h @@ -287,7 +287,7 @@ ATTR_COLD void matrix_solver_direct_t<m_N, _storage_N>::vsetup(analog_net_t::lis if ((m_terms[i]->m_railstart - m_terms[i+1]->m_railstart) * sort_order < 0) { std::swap(m_terms[i],m_terms[i+1]); - m_nets.swap(i, i+1); + std::swap(m_nets[i], m_nets[i+1]); } } diff --git a/src/lib/netlist/solver/nld_ms_gmres.h b/src/lib/netlist/solver/nld_ms_gmres.h index 6124f7e527d..66649d5375b 100644 --- a/src/lib/netlist/solver/nld_ms_gmres.h +++ b/src/lib/netlist/solver/nld_ms_gmres.h @@ -114,7 +114,7 @@ void matrix_solver_GMRES_t<m_N, _storage_N>::vsetup(analog_net_t::list_t &nets) for (unsigned i = mat.ia[k]; i<nz; i++) if (this->m_terms[k]->net_other()[j] == (int) mat.ja[i]) { - m_term_cr[k].add(i); + m_term_cr[k].push_back(i); break; } nl_assert(m_term_cr[k].size() == this->m_terms[k]->m_railstart); diff --git a/src/lib/netlist/solver/nld_solver.cpp b/src/lib/netlist/solver/nld_solver.cpp index b862e031f3d..75d320e15cd 100644 --- a/src/lib/netlist/solver/nld_solver.cpp +++ b/src/lib/netlist/solver/nld_solver.cpp @@ -9,8 +9,11 @@ * the vectorizations fast-math enables pretty expensive */ +#pragma GCC optimize "-ffast-math" +#pragma GCC optimize "-fstrict-aliasing" #if 0 #pragma GCC optimize "-ffast-math" +#pragma GCC optimize "-fstrict-aliasing" //#pragma GCC optimize "-ftree-parallelize-loops=4" #pragma GCC optimize "-funroll-loops" #pragma GCC optimize "-funswitch-loops" @@ -54,21 +57,21 @@ ATTR_COLD void terms_t::add(terminal_t *term, int net_other, bool sorted) { if (m_net_other[i] > net_other) { - m_term.insert_at(term, i); - m_net_other.insert_at(net_other, i); - m_gt.insert_at(0.0, i); - m_go.insert_at(0.0, i); - m_Idr.insert_at(0.0, i); - m_other_curanalog.insert_at(NULL, i); + m_term.insert_at(i, term); + m_net_other.insert_at(i, net_other); + m_gt.insert_at(i, 0.0); + m_go.insert_at(i, 0.0); + m_Idr.insert_at(i, 0.0); + m_other_curanalog.insert_at(i, NULL); return; } } - m_term.add(term); - m_net_other.add(net_other); - m_gt.add(0.0); - m_go.add(0.0); - m_Idr.add(0.0); - m_other_curanalog.add(NULL); + m_term.push_back(term); + m_net_other.push_back(net_other); + m_gt.push_back(0.0); + m_go.push_back(0.0); + m_Idr.push_back(0.0); + m_other_curanalog.push_back(NULL); } ATTR_COLD void terms_t::set_pointers() @@ -109,10 +112,8 @@ ATTR_COLD void matrix_solver_t::setup(analog_net_t::list_t &nets) m_nets.clear(); - for (std::size_t k = 0; k < nets.size(); k++) - { - m_nets.add(nets[k]); - } + for (auto & net : nets) + m_nets.push_back(net); for (std::size_t k = 0; k < nets.size(); k++) { @@ -122,9 +123,8 @@ ATTR_COLD void matrix_solver_t::setup(analog_net_t::list_t &nets) net->m_solver = this; - for (std::size_t i = 0; i < net->m_core_terms.size(); i++) + for (core_terminal_t *p : net->m_core_terms) { - core_terminal_t *p = net->m_core_terms[i]; log().debug("{1} {2} {3}\n", p->name(), net->name(), (int) net->isRailNet()); switch (p->type()) { @@ -133,7 +133,7 @@ ATTR_COLD void matrix_solver_t::setup(analog_net_t::list_t &nets) { case device_t::CAPACITOR: if (!m_step_devices.contains(&p->device())) - m_step_devices.add(&p->device()); + m_step_devices.push_back(&p->device()); break; case device_t::BJT_EB: case device_t::DIODE: @@ -141,7 +141,7 @@ ATTR_COLD void matrix_solver_t::setup(analog_net_t::list_t &nets) case device_t::BJT_SWITCH: log().debug("found BJT/Diode/LVCCS\n"); if (!m_dynamic_devices.contains(&p->device())) - m_dynamic_devices.add(&p->device()); + m_dynamic_devices.push_back(&p->device()); break; default: break; @@ -155,10 +155,10 @@ ATTR_COLD void matrix_solver_t::setup(analog_net_t::list_t &nets) case terminal_t::INPUT: { analog_output_t *net_proxy_output = NULL; - for (std::size_t j = 0; j < m_inps.size(); j++) - if (m_inps[j]->m_proxied_net == &p->net().as_analog()) + for (auto & input : m_inps) + if (input->m_proxied_net == &p->net().as_analog()) { - net_proxy_output = m_inps[j]; + net_proxy_output = input; break; } @@ -166,7 +166,7 @@ ATTR_COLD void matrix_solver_t::setup(analog_net_t::list_t &nets) { net_proxy_output = palloc(analog_output_t); net_proxy_output->init_object(*this, this->name() + "." + pfmt("m{1}")(m_inps.size())); - m_inps.add(net_proxy_output); + m_inps.push_back(net_proxy_output); net_proxy_output->m_proxied_net = &p->net().as_analog(); } net_proxy_output->net().register_con(*p); @@ -399,9 +399,9 @@ NETLIB_UPDATE(solver) if (m_params.m_dynamic) return; - const std::size_t t_cnt = m_mat_solvers.size(); #if HAS_OPENMP && USE_OPENMP + const std::size_t t_cnt = m_mat_solvers.size(); if (m_parallel.Value()) { omp_set_num_threads(3); @@ -425,14 +425,10 @@ NETLIB_UPDATE(solver) ATTR_UNUSED const nl_double ts = m_mat_solvers[i]->solve(); } #else - for (std::size_t i = 0; i < t_cnt; i++) - { - if (m_mat_solvers[i]->is_timestep()) - { + for (auto & solver : m_mat_solvers) + if (solver->is_timestep()) // Ignore return value - ATTR_UNUSED const nl_double ts = m_mat_solvers[i]->solve(); - } - } + ATTR_UNUSED const nl_double ts = solver->solve(); #endif /* step circuit */ @@ -518,13 +514,13 @@ ATTR_COLD void NETLIB_NAME(solver)::post_start() netlist().log().verbose("Scanning net groups ..."); // determine net groups - for (std::size_t i=0; i<netlist().m_nets.size(); i++) + for (auto & net : netlist().m_nets) { - netlist().log().debug("processing {1}\n", netlist().m_nets[i]->name()); - if (!netlist().m_nets[i]->isRailNet()) + netlist().log().debug("processing {1}\n", net->name()); + if (!net->isRailNet()) { netlist().log().debug(" ==> not a rail net\n"); - analog_net_t *n = &netlist().m_nets[i]->as_analog(); + analog_net_t *n = &net->as_analog(); if (!n->already_processed(groups, cur_group)) { cur_group++; @@ -621,7 +617,7 @@ ATTR_COLD void NETLIB_NAME(solver)::post_start() ms->vsetup(groups[i]); - m_mat_solvers.add(ms); + m_mat_solvers.push_back(ms); netlist().log().verbose("Solver {1}", ms->name()); netlist().log().verbose(" # {1} ==> {2} nets", i, groups[i].size()); diff --git a/src/lib/netlist/tools/nl_convert.cpp b/src/lib/netlist/tools/nl_convert.cpp index 8157bfffdcd..cc24325a059 100644 --- a/src/lib/netlist/tools/nl_convert.cpp +++ b/src/lib/netlist/tools/nl_convert.cpp @@ -12,11 +12,11 @@ template<typename Class> -static plist_t<int> bubble(const pnamedlist_t<Class *> &sl) +static plist_t<int> bubble(const plist_t<Class *> &sl) { - plist_t<int> ret(sl.size()); + plist_t<int> ret; for (unsigned i=0; i<sl.size(); i++) - ret[i] = i; + ret.push_back(i); for(unsigned i=0; i < sl.size(); i++) { @@ -37,50 +37,64 @@ static plist_t<int> bubble(const pnamedlist_t<Class *> &sl) void nl_convert_base_t::add_pin_alias(const pstring &devname, const pstring &name, const pstring &alias) { - m_pins.add(palloc(pin_alias_t(devname + "." + name, devname + "." + alias)), false); + pstring pname = devname + "." + name; + m_pins.add(pname, palloc(pin_alias_t(pname, devname + "." + alias))); } void nl_convert_base_t::add_ext_alias(const pstring &alias) { - m_ext_alias.add(alias); + m_ext_alias.push_back(alias); +} + +void nl_convert_base_t::add_device(dev_t *dev) +{ + for (auto & d : m_devs) + if (d->name() == dev->name()) + { + out("ERROR: Duplicate device {1} ignored.", dev->name()); + return; + } + m_devs.push_back(dev); } void nl_convert_base_t::add_device(const pstring &atype, const pstring &aname, const pstring &amodel) { - m_devs.add(palloc(dev_t(atype, aname, amodel)), false); + add_device(palloc(dev_t(atype, aname, amodel))); } void nl_convert_base_t::add_device(const pstring &atype, const pstring &aname, double aval) { - m_devs.add(palloc(dev_t(atype, aname, aval)), false); + add_device(palloc(dev_t(atype, aname, aval))); } void nl_convert_base_t::add_device(const pstring &atype, const pstring &aname) { - m_devs.add(palloc(dev_t(atype, aname)), false); + add_device(palloc(dev_t(atype, aname))); } void nl_convert_base_t::add_term(pstring netname, pstring termname) { - net_t * net = m_nets.find_by_name(netname); - if (net == NULL) + net_t * net = NULL; + if (m_nets.contains(netname)) + net = m_nets[netname]; + else { net = palloc(net_t(netname)); - m_nets.add(net, false); + m_nets.add(netname, net); } /* if there is a pin alias, translate ... */ - pin_alias_t *alias = m_pins.find_by_name(termname); + pin_alias_t *alias = m_pins[termname]; if (alias != NULL) - net->terminals().add(alias->alias()); + net->terminals().push_back(alias->alias()); else - net->terminals().add(termname); + net->terminals().push_back(termname); } void nl_convert_base_t::dump_nl() { for (std::size_t i=0; i<m_ext_alias.size(); i++) { - net_t *net = m_nets.find_by_name(m_ext_alias[i]); + net_t *net = m_nets[m_ext_alias[i]]; // use the first terminal ... out("ALIAS({}, {})\n", m_ext_alias[i].cstr(), net->terminals()[0].cstr()); // if the aliased net only has this one terminal connected ==> don't dump @@ -105,7 +119,7 @@ void nl_convert_base_t::dump_nl() // print nets for (std::size_t i=0; i<m_nets.size(); i++) { - net_t * net = m_nets[i]; + net_t * net = m_nets.value_at(i); if (!net->is_no_export()) { //printf("Net {}\n", net->name().cstr()); @@ -118,8 +132,12 @@ void nl_convert_base_t::dump_nl() } } m_devs.clear_and_free(); - m_nets.clear_and_free(); - m_pins.clear_and_free(); + for (std::size_t i = 0; i < m_nets.size(); i++) + pfree(m_nets.value_at(i)); + m_nets.clear(); + for (std::size_t i = 0; i < m_pins.size(); i++) + pfree(m_pins.value_at(i)); + m_pins.clear(); m_ext_alias.clear(); } diff --git a/src/lib/netlist/tools/nl_convert.h b/src/lib/netlist/tools/nl_convert.h index 3b86c5ec1ad..502d452983c 100644 --- a/src/lib/netlist/tools/nl_convert.h +++ b/src/lib/netlist/tools/nl_convert.h @@ -25,9 +25,13 @@ public: nl_convert_base_t() : out(m_buf) {}; virtual ~nl_convert_base_t() { - m_nets.clear_and_free(); + for (std::size_t i = 0; i < m_nets.size(); i++) + pfree(m_nets.value_at(i)); + m_nets.clear(); m_devs.clear_and_free(); - m_pins.clear_and_free(); + for (std::size_t i = 0; i < m_pins.size(); i++) + pfree(m_pins.value_at(i)); + m_pins.clear(); } const pstringbuffer &result() { return m_buf.str(); } @@ -55,6 +59,7 @@ protected: pstream_fmt_writer_t out; private: + struct net_t { public: @@ -124,12 +129,14 @@ private: private: + void add_device(dev_t *dev); + postringstream m_buf; - pnamedlist_t<dev_t *> m_devs; - pnamedlist_t<net_t *> m_nets; + plist_t<dev_t *> m_devs; + phashmap_t<pstring, net_t *> m_nets; plist_t<pstring> m_ext_alias; - pnamedlist_t<pin_alias_t *> m_pins; + phashmap_t<pstring, pin_alias_t *> m_pins; static unit_t m_units[]; diff --git a/src/osd/modules/lib/osdlib_unix.cpp b/src/osd/modules/lib/osdlib_unix.cpp index 3075ea63769..9b2721a62cf 100644 --- a/src/osd/modules/lib/osdlib_unix.cpp +++ b/src/osd/modules/lib/osdlib_unix.cpp @@ -127,7 +127,8 @@ void osd_free_executable(void *ptr, size_t size) void osd_break_into_debugger(const char *message) { - #ifdef MAME_DEBUG + //#ifdef MAME_DEBUG + #if 1 printf("MAME exception: %s\n", message); printf("Attempting to fall into debugger\n"); kill(getpid(), SIGTRAP); |