From a1b97d3064ddad5fe86eb718bd37a53d4a17c8a2 Mon Sep 17 00:00:00 2001 From: couriersud Date: Fri, 17 Jun 2016 18:39:17 +0200 Subject: [PATCH] Truthtable refactoring. (nw) --- src/devices/machine/netlist.h | 4 +- src/lib/netlist/devices/nld_truthtable.cpp | 19 ++-- src/lib/netlist/devices/nld_truthtable.h | 43 +++++--- src/lib/netlist/nl_base.h | 16 --- src/lib/netlist/nl_parser.cpp | 20 ++-- src/lib/netlist/nl_setup.cpp | 10 ++ src/lib/netlist/nl_setup.h | 116 ++++++++++++--------- 7 files changed, 133 insertions(+), 95 deletions(-) diff --git a/src/devices/machine/netlist.h b/src/devices/machine/netlist.h index 98b9c03244d..fe0ff740e8a 100644 --- a/src/devices/machine/netlist.h +++ b/src/devices/machine/netlist.h @@ -67,11 +67,11 @@ // Extensions to interface netlist with MAME code .... // ---------------------------------------------------------------------------------------- -class netlist_source_memregion_t : public netlist::setup_t::source_t +class netlist_source_memregion_t : public netlist::source_t { public: netlist_source_memregion_t(pstring name) - : netlist::setup_t::source_t(), m_name(name) + : netlist::source_t(), m_name(name) { } diff --git a/src/lib/netlist/devices/nld_truthtable.cpp b/src/lib/netlist/devices/nld_truthtable.cpp index 9ed524e58b1..4821532de26 100644 --- a/src/lib/netlist/devices/nld_truthtable.cpp +++ b/src/lib/netlist/devices/nld_truthtable.cpp @@ -7,6 +7,7 @@ #include "nld_truthtable.h" #include "plib/plists.h" +#include "nl_setup.h" namespace netlist { @@ -261,18 +262,17 @@ void truthtable_desc_t::setup(const plib::pstring_vector_t &truthtable, uint_lea #define ENTRYX(n, m, h) case (n * 1000 + m * 10 + h): \ { using xtype = netlist_factory_truthtable_t; \ - return plib::owned_ptr::Create(name,classname,def_param); } break + ret = new xtype(desc.name, desc.classname, desc.def_param); } break #define ENTRYY(n, m) ENTRYX(n, m, 0); ENTRYX(n, m, 1) #define ENTRY(n) ENTRYY(n, 1); ENTRYY(n, 2); ENTRYY(n, 3); ENTRYY(n, 4); ENTRYY(n, 5); ENTRYY(n, 6) -plib::owned_ptr nl_tt_factory_create(const unsigned ni, const unsigned no, - const unsigned has_state, - const pstring &name, const pstring &classname, - const pstring &def_param) +void nl_tt_factory_create(setup_t &setup, tt_desc &desc) { - switch (ni * 1000 + no * 10 + has_state) + netlist_base_factory_truthtable_t *ret; + + switch (desc.ni * 1000 + desc.no * 10 + desc.has_state) { ENTRY(1); ENTRY(2); @@ -285,10 +285,13 @@ plib::owned_ptr nl_tt_factory_create(const un ENTRY(9); ENTRY(10); default: - pstring msg = plib::pfmt("unable to create truthtable<{1},{2},{3}>")(ni)(no)(has_state); + pstring msg = plib::pfmt("unable to create truthtable<{1},{2},{3}>")(desc.ni)(desc.no)(desc.has_state); nl_assert_always(false, msg); } - //return nullptr; + ret->m_desc = desc.desc; + if (desc.family != "") + ret->m_family = setup.family_from_model(desc.family); + setup.factory().register_device(plib::owned_ptr(ret, true)); } } //namespace devices diff --git a/src/lib/netlist/devices/nld_truthtable.h b/src/lib/netlist/devices/nld_truthtable.h index d30ff03704c..99a178bc9b8 100644 --- a/src/lib/netlist/devices/nld_truthtable.h +++ b/src/lib/netlist/devices/nld_truthtable.h @@ -17,34 +17,40 @@ #include "nl_factory.h" #include "plib/plists.h" -#define NETLIB_TRUTHTABLE(cname, nIN, nOUT, state) \ - class NETLIB_NAME(cname) : public nld_truthtable_t \ +#define NETLIB_TRUTHTABLE(cname, nIN, nOUT, state) \ + class NETLIB_NAME(cname) : public nld_truthtable_t \ { \ public: \ template \ - NETLIB_NAME(cname)(C &owner, const pstring &name) \ + NETLIB_NAME(cname)(C &owner, const pstring &name) \ : nld_truthtable_t(owner, name, nullptr, &m_ttbl, m_desc) { } \ private: \ static truthtable_t m_ttbl; \ static const char *m_desc[]; \ } -#define TRUTHTABLE_START(cname, in, out, has_state, def_params) \ +#define TRUTHTABLE_START(cname, in, out, has_statep, def_params) \ { \ - auto ttd = netlist::devices::nl_tt_factory_create(in, out, has_state, \ - # cname, # cname, "+" def_params); + netlist::devices::tt_desc desc; \ + desc.name = #cname ; \ + desc.classname = #cname ; \ + desc.ni = in; \ + desc.no = out; \ + desc.has_state = has_statep; \ + desc.def_param = pstring("+") + def_params; \ + desc.family = ""; #define TT_HEAD(x) \ - ttd->m_desc.push_back(x); + desc.desc.push_back(x); #define TT_LINE(x) \ - ttd->m_desc.push_back(x); + desc.desc.push_back(x); #define TT_FAMILY(x) \ - ttd->m_family = setup.family_from_model(x); + desc.family = x; #define TRUTHTABLE_END() \ - setup.factory().register_device(std::move(ttd)); \ + netlist::devices::nl_tt_factory_create(setup, desc); \ } namespace netlist @@ -411,10 +417,19 @@ namespace netlist const logic_family_desc_t *m_family; }; - plib::owned_ptr nl_tt_factory_create(const unsigned ni, const unsigned no, - const unsigned has_state, - const pstring &name, const pstring &classname, - const pstring &def_param); + struct tt_desc + { + pstring name; + pstring classname; + unsigned ni; + unsigned no; + unsigned has_state; + pstring def_param; + plib::pstring_vector_t desc; + pstring family; + }; + + void nl_tt_factory_create(setup_t &setup, tt_desc &desc); } //namespace devices } // namespace netlist diff --git a/src/lib/netlist/nl_base.h b/src/lib/netlist/nl_base.h index 1587cefb99b..9ae08fd8786 100644 --- a/src/lib/netlist/nl_base.h +++ b/src/lib/netlist/nl_base.h @@ -965,22 +965,6 @@ namespace netlist #endif }; - // ----------------------------------------------------------------------------- - // param_ref_t - // ----------------------------------------------------------------------------- - - struct param_ref_t - { - param_ref_t(const pstring name, core_device_t &device, param_t ¶m) - : m_name(name) - , m_device(device) - , m_param(param) - { } - pstring m_name; - core_device_t &m_device; - param_t &m_param; - }; - // ----------------------------------------------------------------------------- // device_t // ----------------------------------------------------------------------------- diff --git a/src/lib/netlist/nl_parser.cpp b/src/lib/netlist/nl_parser.cpp index 14aabdf4a0e..7ec3fdca2be 100644 --- a/src/lib/netlist/nl_parser.cpp +++ b/src/lib/netlist/nl_parser.cpp @@ -158,8 +158,14 @@ void parser_t::net_truthtable_start() pstring def_param = get_string(); require_token(m_tok_param_right); - plib::owned_ptr ttd = netlist::devices::nl_tt_factory_create(ni, no, hs, - name, name, "+" + def_param); + netlist::devices::tt_desc desc; + desc.classname = name; + desc.name = name; + desc.ni = ni; + desc.no = no; + desc.has_state = hs; + desc.def_param = "+" + def_param; + desc.family = ""; while (true) { @@ -168,19 +174,19 @@ void parser_t::net_truthtable_start() if (token.is(m_tok_TT_HEAD)) { require_token(m_tok_param_left); - ttd->m_desc.push_back(get_string()); + desc.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.push_back(get_string()); + desc.desc.push_back(get_string()); require_token(m_tok_param_right); } else if (token.is(m_tok_TT_FAMILY)) { require_token(m_tok_param_left); - ttd->m_family = m_setup.family_from_model(get_string()); + desc.family = get_string(); require_token(m_tok_param_right); } else @@ -188,7 +194,7 @@ void parser_t::net_truthtable_start() require_token(token, m_tok_TRUTHTABLE_END); require_token(m_tok_param_left); require_token(m_tok_param_right); - m_setup.factory().register_device(std::move(ttd)); + netlist::devices::nl_tt_factory_create(m_setup, desc); return; } } @@ -431,7 +437,7 @@ nl_double parser_t::eval_param(const token_t tok) val = tok.str(); ret = val.as_double(&e); if (e) - error("Error with parameter ...\n"); + error(plib::pfmt("Error with parameter {1}...\n")(val)); } return ret * facs[f]; diff --git a/src/lib/netlist/nl_setup.cpp b/src/lib/netlist/nl_setup.cpp index 5b7099a9e14..a9c6c1249e6 100644 --- a/src/lib/netlist/nl_setup.cpp +++ b/src/lib/netlist/nl_setup.cpp @@ -788,6 +788,16 @@ void setup_t::start_devices() netlist().start(); } +plib::plog_base &setup_t::log() +{ + return netlist().log(); +} +const plib::plog_base &setup_t::log() const +{ + return netlist().log(); +} + + // ---------------------------------------------------------------------------------------- // Model / family // ---------------------------------------------------------------------------------------- diff --git a/src/lib/netlist/nl_setup.h b/src/lib/netlist/nl_setup.h index 39ef1c514ff..caf9fddff92 100644 --- a/src/lib/netlist/nl_setup.h +++ b/src/lib/netlist/nl_setup.h @@ -11,7 +11,13 @@ #include #include #include +#include +#include "plib/pstring.h" +#include "plib/palloc.h" +#include "plib/pfmtlog.h" +#include "plib/putil.h" +#include "nl_config.h" #include "nl_base.h" #include "nl_factory.h" @@ -34,51 +40,83 @@ #define NET_REGISTER_DEV(type, name) \ setup.register_dev(# type, # name); -#define NET_CONNECT(name, input, output) \ +#define NET_CONNECT(name, input, output) \ setup.register_link(# name "." # input, # output); -#define NET_C(term1, ...) \ +#define NET_C(term1, ...) \ setup.register_link_arr( # term1 ", " # __VA_ARGS__); -#define PARAM(name, val) \ +#define PARAM(name, val) \ setup.register_param(# name, val); -#define NETDEV_PARAMI(name, param, val) \ +#define NETDEV_PARAMI(name, param, val) \ setup.register_param(# name "." # param, val); #define NETLIST_NAME(name) netlist ## _ ## name -#define NETLIST_EXTERNAL(name) \ +#define NETLIST_EXTERNAL(name) \ void NETLIST_NAME(name)(netlist::setup_t &setup); -#define NETLIST_START(name) \ -void NETLIST_NAME(name)(netlist::setup_t &setup) \ +#define NETLIST_START(name) \ +void NETLIST_NAME(name)(netlist::setup_t &setup) \ { #define NETLIST_END() } -#define LOCAL_SOURCE(name) \ +#define LOCAL_SOURCE(name) \ setup.register_source(std::make_shared(# name, &NETLIST_NAME(name))); -#define LOCAL_LIB_ENTRY(name) \ - LOCAL_SOURCE(name) \ +#define LOCAL_LIB_ENTRY(name) \ + LOCAL_SOURCE(name) \ setup.register_lib_entry(# name); -#define INCLUDE(name) \ +#define INCLUDE(name) \ setup.include(# name); -#define SUBMODEL(model, name) \ - setup.namespace_push(# name); \ - NETLIST_NAME(model)(setup); \ +#define SUBMODEL(model, name) \ + setup.namespace_push(# name); \ + NETLIST_NAME(model)(setup); \ setup.namespace_pop(); -// ---------------------------------------------------------------------------------------- -// netlist_setup_t -// ---------------------------------------------------------------------------------------- - namespace netlist { - // Forward definition so we keep nl_factory.h out of the public - class factory_list_t; + + // ----------------------------------------------------------------------------- + // param_ref_t + // ----------------------------------------------------------------------------- + + struct param_ref_t + { + param_ref_t(const pstring name, core_device_t &device, param_t ¶m) + : m_name(name) + , m_device(device) + , m_param(param) + { } + pstring m_name; + core_device_t &m_device; + param_t &m_param; + }; + + // ---------------------------------------------------------------------------------------- + // A Generic netlist sources implementation + // ---------------------------------------------------------------------------------------- + + class source_t + { + public: + using list_t = std::vector>; + + source_t() + {} + + virtual ~source_t() { } + + virtual bool parse(setup_t &setup, const pstring &name) = 0; + private: + }; + + // ---------------------------------------------------------------------------------------- + // setup_t + // ---------------------------------------------------------------------------------------- class setup_t @@ -86,24 +124,6 @@ namespace netlist P_PREVENT_COPYING(setup_t) public: - // ---------------------------------------------------------------------------------------- - // A Generic netlist sources implementation - // ---------------------------------------------------------------------------------------- - - class source_t - { - public: - using list_t = std::vector>; - - source_t() - {} - - virtual ~source_t() { } - - virtual bool parse(setup_t &setup, const pstring &name) = 0; - private: - }; - using link_t = std::pair; setup_t(netlist_t &netlist); @@ -179,8 +199,8 @@ namespace netlist void model_parse(const pstring &model, model_map_t &map); - plib::plog_base &log() { return netlist().log(); } - const plib::plog_base &log() const { return netlist().log(); } + plib::plog_base &log(); + const plib::plog_base &log() const; std::vector> m_device_factory; @@ -232,12 +252,12 @@ namespace netlist // ---------------------------------------------------------------------------------------- - class source_string_t : public setup_t::source_t + class source_string_t : public source_t { public: source_string_t(const pstring &source) - : setup_t::source_t(), m_str(source) + : source_t(), m_str(source) { } @@ -247,12 +267,12 @@ namespace netlist pstring m_str; }; - class source_file_t : public setup_t::source_t + class source_file_t : public source_t { public: source_file_t(const pstring &filename) - : setup_t::source_t(), m_filename(filename) + : source_t(), m_filename(filename) { } @@ -262,11 +282,11 @@ namespace netlist pstring m_filename; }; - class source_mem_t : public setup_t::source_t + class source_mem_t : public source_t { public: source_mem_t(const char *mem) - : setup_t::source_t(), m_str(mem) + : source_t(), m_str(mem) { } @@ -276,11 +296,11 @@ namespace netlist pstring m_str; }; - class source_proc_t : public setup_t::source_t + class source_proc_t : public source_t { public: source_proc_t(pstring name, void (*setup_func)(setup_t &)) - : setup_t::source_t(), + : source_t(), m_setup_func(setup_func), m_setup_func_name(name) {