summaryrefslogtreecommitdiffstatshomepage
path: root/src/lib/netlist/nl_setup.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/netlist/nl_setup.h')
-rw-r--r--src/lib/netlist/nl_setup.h167
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 &param)
+ : 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)
{