diff options
Diffstat (limited to 'src/lib/netlist/nl_setup.h')
-rw-r--r-- | src/lib/netlist/nl_setup.h | 167 |
1 files changed, 118 insertions, 49 deletions
diff --git a/src/lib/netlist/nl_setup.h b/src/lib/netlist/nl_setup.h index 39ef1c514ff..2fee7210aa9 100644 --- a/src/lib/netlist/nl_setup.h +++ b/src/lib/netlist/nl_setup.h @@ -11,7 +11,13 @@ #include <memory> #include <stack> #include <unordered_map> +#include <vector> +#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,75 +40,136 @@ #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 HINT(name, val) \ + setup.register_param(# name ".HINT_" # val, 1); + +#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) \ - setup.register_source(std::make_shared<netlist::source_proc_t>(# name, &NETLIST_NAME(name))); +#define LOCAL_SOURCE(name) \ + setup.register_source(plib::make_unique_base<netlist::source_t, netlist::source_proc_t>(# 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 -// ---------------------------------------------------------------------------------------- +// ----------------------------------------------------------------------------- +// truthtable defines +// ----------------------------------------------------------------------------- + +#define TRUTHTABLE_START(cname, in, out, def_params) \ + { \ + netlist::tt_desc desc; \ + desc.name = #cname ; \ + desc.classname = #cname ; \ + desc.ni = in; \ + desc.no = out; \ + desc.def_param = pstring("+") + def_params; \ + desc.family = ""; + +#define TT_HEAD(x) \ + desc.desc.push_back(x); + +#define TT_LINE(x) \ + desc.desc.push_back(x); + +#define TT_FAMILY(x) \ + desc.family = x; + +#define TRUTHTABLE_END() \ + netlist::devices::tt_factory_create(setup, desc); \ + } + namespace netlist { - // Forward definition so we keep nl_factory.h out of the public - class factory_list_t; + // ----------------------------------------------------------------------------- + // truthtable desc + // ----------------------------------------------------------------------------- - class setup_t + struct tt_desc + { + pstring name; + pstring classname; + unsigned ni; + unsigned no; + pstring def_param; + plib::pstring_vector_t desc; + pstring family; + }; + + // ----------------------------------------------------------------------------- + // 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 { - P_PREVENT_COPYING(setup_t) public: + using list_t = std::vector<std::unique_ptr<source_t>>; - // ---------------------------------------------------------------------------------------- - // A Generic netlist sources implementation - // ---------------------------------------------------------------------------------------- + source_t() + {} - class source_t - { - public: - using list_t = std::vector<std::shared_ptr<source_t>>; + virtual ~source_t() { } + + virtual bool parse(setup_t &setup, const pstring &name) = 0; + private: + }; - source_t() - {} + // ---------------------------------------------------------------------------------------- + // setup_t + // ---------------------------------------------------------------------------------------- - virtual ~source_t() { } - virtual bool parse(setup_t &setup, const pstring &name) = 0; - private: - }; + class setup_t + { + P_PREVENT_COPYING(setup_t) + public: using link_t = std::pair<pstring, pstring>; @@ -118,7 +185,6 @@ namespace netlist void register_term(core_terminal_t &obj); - void register_dev(plib::owned_ptr<device_t> dev); void register_dev(const pstring &classname, const pstring &name); void register_lib_entry(const pstring &name); @@ -160,10 +226,9 @@ namespace netlist /* register a source */ - template <class C> - void register_source(std::shared_ptr<C> src) + void register_source(std::unique_ptr<source_t> &&src) { - m_sources.push_back(std::static_pointer_cast<source_t>(src)); + m_sources.push_back(std::move(src)); } factory_list_t &factory() { return m_factory; } @@ -179,11 +244,15 @@ namespace netlist void model_parse(const pstring &model, model_map_t &map); - plib::plog_base<NL_DEBUG> &log() { return netlist().log(); } - const plib::plog_base<NL_DEBUG> &log() const { return netlist().log(); } + plib::plog_base<NL_DEBUG> &log(); + const plib::plog_base<NL_DEBUG> &log() const; std::vector<std::pair<pstring, base_factory_t *>> m_device_factory; + /* FIXME: truth table trampoline */ + + void tt_factory_create(tt_desc &desc); + protected: private: @@ -232,12 +301,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 +316,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 +331,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 +345,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) { |