From 969e6ed6a0f46aa98a6fbc8c98c4dc575fc9ca9c Mon Sep 17 00:00:00 2001 From: couriersud Date: Sun, 15 Jan 2017 23:59:33 +0100 Subject: [PATCH] Keep track were registry elements are created. (nw) --- src/lib/netlist/devices/nld_truthtable.cpp | 37 +++++++++++----------- src/lib/netlist/devices/nld_truthtable.h | 4 +-- src/lib/netlist/nl_factory.cpp | 10 +++++- src/lib/netlist/nl_factory.h | 22 +++++++++++-- src/lib/netlist/nl_parser.cpp | 10 +++--- src/lib/netlist/nl_parser.h | 2 +- src/lib/netlist/nl_setup.cpp | 8 ++--- src/lib/netlist/nl_setup.h | 8 ++--- src/lib/netlist/prg/nltool.cpp | 9 ++++++ 9 files changed, 73 insertions(+), 37 deletions(-) diff --git a/src/lib/netlist/devices/nld_truthtable.cpp b/src/lib/netlist/devices/nld_truthtable.cpp index 9030f6b8801..67acc61f9ef 100644 --- a/src/lib/netlist/devices/nld_truthtable.cpp +++ b/src/lib/netlist/devices/nld_truthtable.cpp @@ -19,8 +19,8 @@ namespace netlist P_PREVENT_COPYING(netlist_factory_truthtable_t) public: netlist_factory_truthtable_t(const pstring &name, const pstring &classname, - const pstring &def_param) - : netlist_base_factory_truthtable_t(name, classname, def_param) + const pstring &def_param, const pstring &sourcefile) + : netlist_base_factory_truthtable_t(name, classname, def_param, sourcefile) { } plib::owned_ptr Create(netlist_t &anetlist, const pstring &name) override @@ -260,8 +260,8 @@ void truthtable_desc_t::setup(const plib::pstring_vector_t &truthtable, uint_lea } netlist_base_factory_truthtable_t::netlist_base_factory_truthtable_t(const pstring &name, const pstring &classname, - const pstring &def_param) -: factory::element_t(name, classname, def_param), m_family(family_TTL()) + const pstring &def_param, const pstring &sourcefile) +: factory::element_t(name, classname, def_param, sourcefile), m_family(family_TTL()) { } @@ -270,28 +270,29 @@ netlist_base_factory_truthtable_t::~netlist_base_factory_truthtable_t() } -#define ENTRYY(n, m) case (n * 100 + m): \ +#define ENTRYY(n, m, s) case (n * 100 + m): \ { using xtype = netlist_factory_truthtable_t; \ - ret = new xtype(desc.name, desc.classname, desc.def_param); } break + ret = new xtype(desc.name, desc.classname, desc.def_param, s); } break -#define ENTRY(n) ENTRYY(n, 1); ENTRYY(n, 2); ENTRYY(n, 3); ENTRYY(n, 4); ENTRYY(n, 5); ENTRYY(n, 6) +#define ENTRY(n, s) ENTRYY(n, 1, s); ENTRYY(n, 2, s); ENTRYY(n, 3, s); \ + ENTRYY(n, 4, s); ENTRYY(n, 5, s); ENTRYY(n, 6, s) -void tt_factory_create(setup_t &setup, tt_desc &desc) +void tt_factory_create(setup_t &setup, tt_desc &desc, const pstring &sourcefile) { netlist_base_factory_truthtable_t *ret; switch (desc.ni * 100 + desc.no) { - ENTRY(1); - ENTRY(2); - ENTRY(3); - ENTRY(4); - ENTRY(5); - ENTRY(6); - ENTRY(7); - ENTRY(8); - ENTRY(9); - ENTRY(10); + ENTRY(1, sourcefile); + ENTRY(2, sourcefile); + ENTRY(3, sourcefile); + ENTRY(4, sourcefile); + ENTRY(5, sourcefile); + ENTRY(6, sourcefile); + ENTRY(7, sourcefile); + ENTRY(8, sourcefile); + ENTRY(9, sourcefile); + ENTRY(10, sourcefile); default: pstring msg = plib::pfmt("unable to create truthtable<{1},{2}>")(desc.ni)(desc.no); nl_assert_always(false, msg); diff --git a/src/lib/netlist/devices/nld_truthtable.h b/src/lib/netlist/devices/nld_truthtable.h index 990afc45dd7..d4a9f4ea441 100644 --- a/src/lib/netlist/devices/nld_truthtable.h +++ b/src/lib/netlist/devices/nld_truthtable.h @@ -371,7 +371,7 @@ namespace netlist P_PREVENT_COPYING(netlist_base_factory_truthtable_t) public: netlist_base_factory_truthtable_t(const pstring &name, const pstring &classname, - const pstring &def_param); + const pstring &def_param, const pstring &sourcefile); virtual ~netlist_base_factory_truthtable_t(); @@ -379,7 +379,7 @@ namespace netlist const logic_family_desc_t *m_family; }; - void tt_factory_create(setup_t &setup, tt_desc &desc); + void tt_factory_create(setup_t &setup, tt_desc &desc, const pstring &sourcefile); } //namespace devices } // namespace netlist diff --git a/src/lib/netlist/nl_factory.cpp b/src/lib/netlist/nl_factory.cpp index 50dc2ef9c8d..98740945e6c 100644 --- a/src/lib/netlist/nl_factory.cpp +++ b/src/lib/netlist/nl_factory.cpp @@ -16,9 +16,17 @@ namespace netlist { namespace factory { +element_t::element_t(const pstring &name, const pstring &classname, + const pstring &def_param, const pstring &sourcefile) + : m_name(name), m_classname(classname), m_def_param(def_param), + m_sourcefile(sourcefile) +{ +} + element_t::element_t(const pstring &name, const pstring &classname, const pstring &def_param) - : m_name(name), m_classname(classname), m_def_param(def_param) + : m_name(name), m_classname(classname), m_def_param(def_param), + m_sourcefile("") { } diff --git a/src/lib/netlist/nl_factory.h b/src/lib/netlist/nl_factory.h index 9e2185e0729..a22c48b7646 100644 --- a/src/lib/netlist/nl_factory.h +++ b/src/lib/netlist/nl_factory.h @@ -17,7 +17,18 @@ #include "plib/putil.h" #include "nl_base.h" +#if 1 +#define NETLIB_DEVICE_IMPL(chip) \ + static std::unique_ptr NETLIB_NAME(chip ## _c)( \ + const pstring &name, const pstring &classname, const pstring &def_param) \ + { \ + return std::unique_ptr(new factory::device_element_t(name, classname, def_param, pstring(__FILE__))); \ + } \ + factory::constructor_ptr_t decl_ ## chip = NETLIB_NAME(chip ## _c); +#else #define NETLIB_DEVICE_IMPL(chip) factory::constructor_ptr_t decl_ ## chip = factory::constructor_t< NETLIB_NAME(chip) >; +#endif + #define NETLIB_DEVICE_IMPL_NS(ns, chip) factory::constructor_ptr_t decl_ ## chip = factory::constructor_t< ns :: NETLIB_NAME(chip) >; namespace netlist { namespace factory @@ -32,6 +43,8 @@ namespace netlist { namespace factory public: element_t(const pstring &name, const pstring &classname, const pstring &def_param); + element_t(const pstring &name, const pstring &classname, + const pstring &def_param, const pstring &sourcefile); virtual ~element_t(); virtual plib::owned_ptr Create(netlist_t &anetlist, const pstring &name) = 0; @@ -40,11 +53,13 @@ namespace netlist { namespace factory const pstring &name() const { return m_name; } const pstring &classname() const { return m_classname; } const pstring ¶m_desc() const { return m_def_param; } + const pstring &sourcefile() const { return m_sourcefile; } protected: pstring m_name; /* device name */ pstring m_classname; /* device class name */ pstring m_def_param; /* default parameter */ + pstring m_sourcefile; /* source file */ }; template @@ -55,6 +70,9 @@ namespace netlist { namespace factory device_element_t(const pstring &name, const pstring &classname, const pstring &def_param) : element_t(name, classname, def_param) { } + device_element_t(const pstring &name, const pstring &classname, + const pstring &def_param, const pstring &sourcefile) + : element_t(name, classname, def_param, sourcefile) { } plib::owned_ptr Create(netlist_t &anetlist, const pstring &name) override { @@ -125,8 +143,8 @@ namespace netlist { namespace factory public: library_element_t(setup_t &setup, const pstring &name, const pstring &classname, - const pstring &def_param) - : element_t(name, classname, def_param), m_setup(setup) { } + const pstring &def_param, const pstring &source) + : element_t(name, classname, def_param, source), m_setup(setup) { } plib::owned_ptr Create(netlist_t &anetlist, const pstring &name) override; diff --git a/src/lib/netlist/nl_parser.cpp b/src/lib/netlist/nl_parser.cpp index 6dee211ce56..365054fc7d0 100644 --- a/src/lib/netlist/nl_parser.cpp +++ b/src/lib/netlist/nl_parser.cpp @@ -99,7 +99,7 @@ bool parser_t::parse(const pstring nlname) } } -void parser_t::parse_netlist(ATTR_UNUSED const pstring &nlname) +void parser_t::parse_netlist(const pstring &nlname) { while (true) { @@ -132,10 +132,10 @@ void parser_t::parse_netlist(ATTR_UNUSED const pstring &nlname) else if (token.is(m_tok_LOCAL_SOURCE)) net_local_source(); else if (token.is(m_tok_TRUTHTABLE_START)) - net_truthtable_start(); + net_truthtable_start(nlname); else if (token.is(m_tok_LOCAL_LIB_ENTRY)) { - m_setup.register_lib_entry(get_identifier()); + m_setup.register_lib_entry(get_identifier(), "parser: " + nlname); require_token(m_tok_param_right); } else if (token.is(m_tok_NETLIST_END)) @@ -148,7 +148,7 @@ void parser_t::parse_netlist(ATTR_UNUSED const pstring &nlname) } } -void parser_t::net_truthtable_start() +void parser_t::net_truthtable_start(const pstring &nlname) { pstring name = get_identifier(); require_token(m_tok_comma); @@ -194,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); - netlist::devices::tt_factory_create(m_setup, desc); + netlist::devices::tt_factory_create(m_setup, desc, nlname); return; } } diff --git a/src/lib/netlist/nl_parser.h b/src/lib/netlist/nl_parser.h index 5c915e69997..a023a7cbbab 100644 --- a/src/lib/netlist/nl_parser.h +++ b/src/lib/netlist/nl_parser.h @@ -37,7 +37,7 @@ namespace netlist void net_submodel(); void net_include(); void net_local_source(); - void net_truthtable_start(); + void net_truthtable_start(const pstring &nlname); /* for debugging messages */ netlist_t &netlist() { return m_setup.netlist(); } diff --git a/src/lib/netlist/nl_setup.cpp b/src/lib/netlist/nl_setup.cpp index 57a125d1843..cf090c68dbe 100644 --- a/src/lib/netlist/nl_setup.cpp +++ b/src/lib/netlist/nl_setup.cpp @@ -71,9 +71,9 @@ void setup_t::namespace_pop() m_namespace_stack.pop(); } -void setup_t::register_lib_entry(const pstring &name) +void setup_t::register_lib_entry(const pstring &name, const pstring &sourcefile) { - factory().register_device(plib::make_unique_base(*this, name, name, "")); + factory().register_device(plib::make_unique_base(*this, name, name, "", sourcefile)); } void setup_t::register_dev(const pstring &classname, const pstring &name) @@ -892,9 +892,9 @@ nl_double setup_t::model_value(model_map_t &map, const pstring &entity) return tmp.as_double() * factor; } -void setup_t::tt_factory_create(tt_desc &desc) +void setup_t::tt_factory_create(tt_desc &desc, const pstring &sourcefile) { - devices::tt_factory_create(*this, desc); + devices::tt_factory_create(*this, desc, sourcefile); } diff --git a/src/lib/netlist/nl_setup.h b/src/lib/netlist/nl_setup.h index 41c1ecc67ee..1ce715a9fdf 100644 --- a/src/lib/netlist/nl_setup.h +++ b/src/lib/netlist/nl_setup.h @@ -71,7 +71,7 @@ void NETLIST_NAME(name)(netlist::setup_t &setup) \ #define LOCAL_LIB_ENTRY(name) \ LOCAL_SOURCE(name) \ - setup.register_lib_entry(# name); + setup.register_lib_entry(# name, __FILE__); #define INCLUDE(name) \ setup.include(# name); @@ -108,7 +108,7 @@ void NETLIST_NAME(name)(netlist::setup_t &setup) \ desc.family = x; #define TRUTHTABLE_END() \ - netlist::devices::tt_factory_create(setup, desc); \ + netlist::devices::tt_factory_create(setup, desc, __FILE__); \ } @@ -205,7 +205,7 @@ namespace netlist void register_dev(const pstring &classname, const pstring &name); - void register_lib_entry(const pstring &name); + void register_lib_entry(const pstring &name, const pstring &sourcefile); void register_model(const pstring &model_in); void register_alias(const pstring &alias, const pstring &out); @@ -268,7 +268,7 @@ namespace netlist /* FIXME: truth table trampoline */ - void tt_factory_create(tt_desc &desc); + void tt_factory_create(tt_desc &desc, const pstring &sourcefile); /* helper - also used by nltool */ const pstring resolve_alias(const pstring &name) const; diff --git a/src/lib/netlist/prg/nltool.cpp b/src/lib/netlist/prg/nltool.cpp index 3850dd935e4..1d796201fd9 100644 --- a/src/lib/netlist/prg/nltool.cpp +++ b/src/lib/netlist/prg/nltool.cpp @@ -365,8 +365,17 @@ static void create_header(tool_options_t &opts) pout(" * ---------------------------------------------------------------------------*/\n"); pout("\n"); + pstring last_source(""); + for (auto &e : nt.setup().factory()) { + if (last_source != e->sourcefile()) + { + last_source = e->sourcefile(); + pout("{1}\n", pstring("// ").rpad("-", 72)); + pout("{1}\n", pstring("// Source: ").cat(e->sourcefile().replace("../",""))); + pout("{1}\n", pstring("// ").rpad("-", 72)); + } auto v = plib::pstring_vector_t(e->param_desc(), ","); pstring vs; for (auto s : v)