From 0d9d439b9b826d20bf31392dfda40237490a1361 Mon Sep 17 00:00:00 2001 From: Couriersud Date: Tue, 11 Feb 2014 21:35:26 +0000 Subject: [PATCH] Netlist maintenance: - netlist construction now is relying on fully qualified names, i.e. the name of a netlist object now starts with the netlist name. This is a first step towards supporting netlist models, i.e. netlists which can be used as a macro model. Very handy for opamps ... - Changed log file filename format. - Support analog net groups of up to 256 nets (i.e. Voltages). --- src/emu/netlist/analog/nld_solver.c | 33 ++++++++++++++++++------- src/emu/netlist/devices/nld_log.c | 2 +- src/emu/netlist/devices/nld_log.h | 6 ++--- src/emu/netlist/nl_base.c | 7 +++--- src/emu/netlist/nl_base.h | 4 +-- src/emu/netlist/nl_setup.c | 38 ++++++++++++++++++++--------- src/emu/netlist/nl_setup.h | 3 +++ 7 files changed, 64 insertions(+), 29 deletions(-) diff --git a/src/emu/netlist/analog/nld_solver.c b/src/emu/netlist/analog/nld_solver.c index 897666a850b..a0920897b11 100644 --- a/src/emu/netlist/analog/nld_solver.c +++ b/src/emu/netlist/analog/nld_solver.c @@ -118,7 +118,7 @@ void netlist_matrix_solver_t::schedule() } else { - m_owner->netlist().warning("Matrix solver reschedule .. Consider increasing RESCHED_LOOPS"); + //m_owner->netlist().warning("Matrix solver reschedule .. Consider increasing RESCHED_LOOPS"); if (m_owner != NULL) this->m_owner->schedule(); } @@ -750,7 +750,7 @@ NETLIB_UPDATE(solver) if (global_resched) { - netlist().warning("Gobal reschedule .. Consider increasing RESCHED_LOOPS"); + //netlist().warning("Gobal reschedule .. Consider increasing RESCHED_LOOPS"); schedule(); } else @@ -784,8 +784,9 @@ ATTR_COLD void NETLIB_NAME(solver)::post_start() for (int i = 0; i <= cur_group; i++) { netlist_matrix_solver_t *ms; + int net_count = groups[i].count(); - switch (groups[i].count()) + switch (net_count) { case 1: ms = new netlist_matrix_solver_direct1_t(); @@ -803,17 +804,31 @@ ATTR_COLD void NETLIB_NAME(solver)::post_start() break; #if 0 case 5: - ms = new netlist_matrix_solver_direct_t<5,5>(); - //ms = new netlist_matrix_solver_gauss_seidel_t<4,4>(); + //ms = new netlist_matrix_solver_direct_t<5,5>(); + ms = new netlist_matrix_solver_gauss_seidel_t<5,5>(); break; case 6: - ms = new netlist_matrix_solver_direct_t<6,6>(); - //ms = new netlist_matrix_solver_gauss_seidel_t<4,4>(); + //ms = new netlist_matrix_solver_direct_t<6,6>(); + ms = new netlist_matrix_solver_gauss_seidel_t<6,6>(); break; #endif default: - //ms = new netlist_matrix_solver_direct_t<0,16>(); - ms = new netlist_matrix_solver_gauss_seidel_t<0,16>(); + if (net_count <= 16) + { + //ms = new netlist_matrix_solver_direct_t<0,16>(); + ms = new netlist_matrix_solver_gauss_seidel_t<0,16>(); + } + else if (net_count <= 32) + { + //ms = new netlist_matrix_solver_direct_t<0,16>(); + ms = new netlist_matrix_solver_gauss_seidel_t<0,32>(); + } + else if (net_count <= 64) + { + //ms = new netlist_matrix_solver_direct_t<0,16>(); + ms = new netlist_matrix_solver_gauss_seidel_t<0,64>(); + } + break; } diff --git a/src/emu/netlist/devices/nld_log.c b/src/emu/netlist/devices/nld_log.c index ae925043d79..b98076e26cb 100644 --- a/src/emu/netlist/devices/nld_log.c +++ b/src/emu/netlist/devices/nld_log.c @@ -12,7 +12,7 @@ NETLIB_START(log) { register_input("I", m_I); - pstring filename = "netlist_" + name() + ".log"; + pstring filename = pstring::sprintf("%s.log", name().cstr()); m_file = fopen(filename, "w"); } diff --git a/src/emu/netlist/devices/nld_log.h b/src/emu/netlist/devices/nld_log.h index 9cdd94ab546..738c69fc700 100644 --- a/src/emu/netlist/devices/nld_log.h +++ b/src/emu/netlist/devices/nld_log.h @@ -21,7 +21,7 @@ #include "../nl_base.h" #define LOG(_name, _I) \ - NET_REGISTER_DEV(log, _name) \ + NET_REGISTER_DEV(log, _name) \ NET_CONNECT(_name, I, _I) NETLIB_DEVICE(log, @@ -32,8 +32,8 @@ protected: ); #define LOGD(_name, _I, _I2) \ - NET_REGISTER_DEV(logD, _name) \ - NET_CONNECT(_name, I, _I) \ + NET_REGISTER_DEV(logD, _name) \ + NET_CONNECT(_name, I, _I) \ NET_CONNECT(_name, I2, _I2) NETLIB_DEVICE_DERIVED(logD, log, diff --git a/src/emu/netlist/nl_base.c b/src/emu/netlist/nl_base.c index c6b6d6f3c0e..828bd38f93b 100644 --- a/src/emu/netlist/nl_base.c +++ b/src/emu/netlist/nl_base.c @@ -90,11 +90,11 @@ ATTR_COLD void netlist_object_t::init_object(netlist_base_t &nl, const pstring & save_register(); } -ATTR_COLD const pstring &netlist_object_t::name() const +ATTR_COLD const pstring netlist_object_t::name() const { if (m_name == "") netlist().error("object not initialized"); - return m_name; + return m_name; } // ---------------------------------------------------------------------------------------- @@ -386,7 +386,8 @@ ATTR_COLD void netlist_device_t::register_subalias(const pstring &name, netlist_ { pstring alias = this->name() + "." + name; - setup().register_alias(alias, term.name()); + // everything already fully qualified + setup().register_alias_nofqn(alias, term.name()); if (term.isType(netlist_terminal_t::INPUT) || term.isType(netlist_terminal_t::TERMINAL)) m_terminals.add(alias); diff --git a/src/emu/netlist/nl_base.h b/src/emu/netlist/nl_base.h index 1275ea342e0..07125e4d388 100644 --- a/src/emu/netlist/nl_base.h +++ b/src/emu/netlist/nl_base.h @@ -312,7 +312,7 @@ public: ATTR_COLD void init_object(netlist_base_t &nl, const pstring &aname); ATTR_COLD bool isInitalized() { return (m_netlist != NULL); } - ATTR_COLD const pstring &name() const; + ATTR_COLD const pstring name() const; PSTATE_INTERFACE_DECL() @@ -1121,7 +1121,7 @@ protected: }; // any derived netlist must override this ... - virtual void vfatalerror(const loglevel_e level, + ATTR_COLD ATTR_NORETURN virtual void vfatalerror(const loglevel_e level, const char *format, va_list ap) const = 0; /* from netlist_object */ diff --git a/src/emu/netlist/nl_setup.c b/src/emu/netlist/nl_setup.c index 3132ab2e52b..0971f828bb6 100644 --- a/src/emu/netlist/nl_setup.c +++ b/src/emu/netlist/nl_setup.c @@ -56,11 +56,18 @@ netlist_setup_t::~netlist_setup_t() pstring::resetmem(); } -// FIXME: Move to netlist ... +ATTR_COLD pstring netlist_setup_t::build_fqn(const pstring &obj_name) const +{ + return netlist().name() + "." + obj_name; +} + netlist_device_t *netlist_setup_t::register_dev(netlist_device_t *dev, const pstring &name) { - dev->init(netlist(), name); - if (!(netlist().m_devices.add(name, dev, false)==TMERR_NONE)) + pstring fqn = build_fqn(name); + + dev->init(netlist(), fqn); + + if (!(netlist().m_devices.add(fqn, dev, false)==TMERR_NONE)) netlist().error("Error adding %s to device list\n", name.cstr()); return dev; } @@ -109,11 +116,17 @@ void netlist_setup_t::register_model(const pstring &model) m_models.add(model); } +void netlist_setup_t::register_alias_nofqn(const pstring &alias, const pstring &out) +{ + if (!(m_alias.add(alias, out, false)==TMERR_NONE)) + netlist().error("Error adding alias %s to alias list\n", alias.cstr()); +} + void netlist_setup_t::register_alias(const pstring &alias, const pstring &out) { - //if (!(m_alias.add(alias, new nstring(out), false)==TMERR_NONE)) - if (!(m_alias.add(alias, out, false)==TMERR_NONE)) - netlist().error("Error adding alias %s to alias list\n", alias.cstr()); + pstring alias_fqn = build_fqn(alias); + pstring out_fqn = build_fqn(out); + register_alias_nofqn(alias_fqn, out_fqn); } pstring netlist_setup_t::objtype_as_astr(netlist_object_t &in) const @@ -239,7 +252,7 @@ void netlist_setup_t::register_object(netlist_device_t &dev, const pstring &name void netlist_setup_t::register_link(const pstring &sin, const pstring &sout) { - link_t temp = link_t(sin, sout); + link_t temp = link_t(build_fqn(sin), build_fqn(sout)); NL_VERBOSE_OUT(("link %s <== %s\n", sin.cstr(), sout.cstr())); m_links.add(temp); //if (!(m_links.add(sin + "." + sout, temp, false)==TMERR_NONE)) @@ -254,8 +267,9 @@ void netlist_setup_t::register_param(const pstring ¶m, const double value) void netlist_setup_t::register_param(const pstring ¶m, const pstring &value) { - //if (!(m_params_temp.add(param, new nstring(value), false)==TMERR_NONE)) - if (!(m_params_temp.add(param, value, false)==TMERR_NONE)) + pstring fqn = build_fqn(param); + + if (!(m_params_temp.add(fqn, value, false)==TMERR_NONE)) netlist().error("Error adding parameter %s to parameter list\n", param.cstr()); } @@ -323,12 +337,14 @@ netlist_core_terminal_t *netlist_setup_t::find_terminal(const pstring &terminal_ netlist_param_t *netlist_setup_t::find_param(const pstring ¶m_in, bool required) { - const pstring &outname = resolve_alias(param_in); + const pstring param_in_fqn = build_fqn(param_in); + + const pstring &outname = resolve_alias(param_in_fqn); netlist_param_t *ret; ret = m_params.find(outname); if (ret == NULL && required) - netlist().error("parameter %s(%s) not found!\n", param_in.cstr(), outname.cstr()); + netlist().error("parameter %s(%s) not found!\n", param_in_fqn.cstr(), outname.cstr()); if (ret != NULL) NL_VERBOSE_OUT(("Found parameter %s\n", outname.cstr())); return ret; diff --git a/src/emu/netlist/nl_setup.h b/src/emu/netlist/nl_setup.h index d0af1ebe50d..d8d6848a397 100644 --- a/src/emu/netlist/nl_setup.h +++ b/src/emu/netlist/nl_setup.h @@ -110,11 +110,14 @@ public: netlist_factory_t &factory() { return m_factory; } const netlist_factory_t &factory() const { return m_factory; } + pstring build_fqn(const pstring &obj_name) const; + netlist_device_t *register_dev(netlist_device_t *dev, const pstring &name); void remove_dev(const pstring &name); void register_model(const pstring &model); void register_alias(const pstring &alias, const pstring &out); + void register_alias_nofqn(const pstring &alias, const pstring &out); void register_link(const pstring &sin, const pstring &sout); void register_param(const pstring ¶m, const pstring &value); void register_param(const pstring ¶m, const double value);