diff options
Diffstat (limited to 'src/lib/netlist')
-rw-r--r-- | src/lib/netlist/analog/nlid_twoterm.h | 20 | ||||
-rw-r--r-- | src/lib/netlist/netlist_types.h | 28 | ||||
-rw-r--r-- | src/lib/netlist/nl_base.cpp | 13 | ||||
-rw-r--r-- | src/lib/netlist/nl_base.h | 50 | ||||
-rw-r--r-- | src/lib/netlist/nl_setup.cpp | 4 | ||||
-rw-r--r-- | src/lib/netlist/nl_setup.h | 4 | ||||
-rw-r--r-- | src/lib/netlist/plib/pomp.h | 2 | ||||
-rw-r--r-- | src/lib/netlist/plib/pparser.cpp | 2 | ||||
-rw-r--r-- | src/lib/netlist/prg/nltool.cpp | 24 | ||||
-rw-r--r-- | src/lib/netlist/solver/nld_solver.cpp | 2 |
10 files changed, 89 insertions, 60 deletions
diff --git a/src/lib/netlist/analog/nlid_twoterm.h b/src/lib/netlist/analog/nlid_twoterm.h index 624dd98e558..4ab5fcda89b 100644 --- a/src/lib/netlist/analog/nlid_twoterm.h +++ b/src/lib/netlist/analog/nlid_twoterm.h @@ -48,6 +48,20 @@ namespace netlist // nld_twoterm // ----------------------------------------------------------------------------- + template <class C> + inline core_device_t &bselect(bool b, C &d1, core_device_t &d2) + { + core_device_t *h = dynamic_cast<core_device_t *>(&d1); + return b ? *h : d2; + } + template<> + inline core_device_t &bselect(bool b, netlist_t &d1, core_device_t &d2) + { + if (b) + throw nl_exception("bselect with netlist and b==true"); + return d2; + } + NETLIB_OBJECT(twoterm) { NETLIB_CONSTRUCTOR_EX(twoterm, bool terminals_owned = false) @@ -87,12 +101,6 @@ public: } private: - template <class C> - static core_device_t &bselect(bool b, C &d1, core_device_t &d2) - { - core_device_t *h = dynamic_cast<core_device_t *>(&d1); - return b ? *h : d2; - } }; diff --git a/src/lib/netlist/netlist_types.h b/src/lib/netlist/netlist_types.h index d5fe7b11e20..bbca9949e49 100644 --- a/src/lib/netlist/netlist_types.h +++ b/src/lib/netlist/netlist_types.h @@ -12,12 +12,40 @@ #include "nl_config.h" #include "plib/pchrono.h" #include "plib/pstring.h" +#include "plib/pfmtlog.h" #include <cstdint> #include <unordered_map> namespace netlist { + /*! @brief netlist_sig_t is the type used for logic signals. + * + * This may be any of bool, uint8_t, uint16_t, uin32_t and uint64_t. + * The choice has little to no impact on performance. + */ + using netlist_sig_t = std::uint32_t; + + /** + * @brief Interface definition for netlist callbacks into calling code + * + * A class inheriting from netlist_callbacks_t has to be passed to the netlist_t + * constructor. Netlist does processing during construction and thus needs + * the object passed completely constructed. + * + */ + class callbacks_t + { + public: + virtual ~callbacks_t() {} + + /* logging callback */ + virtual void vlog(const plib::plog_level &l, const pstring &ls) const = 0; + }; + + using log_type = plib::plog_base<callbacks_t, NL_DEBUG>; + + //============================================================ // Performance tracking //============================================================ diff --git a/src/lib/netlist/nl_base.cpp b/src/lib/netlist/nl_base.cpp index 6a8ac148151..4bdec442f17 100644 --- a/src/lib/netlist/nl_base.cpp +++ b/src/lib/netlist/nl_base.cpp @@ -239,20 +239,22 @@ detail::terminal_type detail::core_terminal_t::type() const // netlist_t // ---------------------------------------------------------------------------------------- -netlist_t::netlist_t(const pstring &aname) +netlist_t::netlist_t(const pstring &aname, std::unique_ptr<callbacks_t> callbacks) : m_time(netlist_time::zero()) , m_queue(*this) , m_mainclock(nullptr) , m_solver(nullptr) , m_params(nullptr) , m_name(aname) - , m_log(*this) , m_lib(nullptr) , m_state() + , m_callbacks(std::move(callbacks)) // Order is important here + , m_log(*m_callbacks) { state().save_item(this, static_cast<plib::state_manager_t::callback_t &>(m_queue), "m_queue"); state().save_item(this, m_time, "m_time"); m_setup = plib::make_unique<setup_t>(*this); + NETLIST_NAME(base)(*m_setup); } netlist_t::~netlist_t() @@ -261,11 +263,6 @@ netlist_t::~netlist_t() m_devices.clear(); } -void netlist_t::load_base_libraries() -{ - NETLIST_NAME(base)(*m_setup); -} - nl_double netlist_t::gmin() const NL_NOEXCEPT { return solver()->gmin(); @@ -694,7 +691,7 @@ void core_device_t::set_default_delegate(detail::core_terminal_t &term) term.m_delegate.set(&core_device_t::update, this); } -plib::plog_base<netlist_t, NL_DEBUG> &core_device_t::log() +log_type & core_device_t::log() { return netlist().log(); } diff --git a/src/lib/netlist/nl_base.h b/src/lib/netlist/nl_base.h index 24129821b4b..6e4f9c50543 100644 --- a/src/lib/netlist/nl_base.h +++ b/src/lib/netlist/nl_base.h @@ -9,6 +9,11 @@ #ifndef NLBASE_H_ #define NLBASE_H_ +#ifdef NL_PROHIBIT_BASEH_INCLUDE +#error "nl_base.h included. Please correct." +#endif + +#include "netlist_types.h" #include "nl_lists.h" #include "nl_time.h" #include "plib/palloc.h" // owned_ptr @@ -20,21 +25,6 @@ #include <unordered_map> -#ifdef NL_PROHIBIT_BASEH_INCLUDE -#error "nl_base.h included. Please correct." -#endif - -// ---------------------------------------------------------------------------------------- -// Type definitions -// ---------------------------------------------------------------------------------------- - -/*! @brief netlist_sig_t is the type used for logic signals. - * - * This may be any of bool, uint8_t, uint16_t, uin32_t and uint64_t. - * The choice has little to no impact on performance. - */ -using netlist_sig_t = std::uint32_t; - //============================================================ // MACROS / New Syntax //============================================================ @@ -221,6 +211,7 @@ namespace netlist class netlist_t; class core_device_t; class device_t; + class callbacks_t; //============================================================ // Exceptions @@ -1115,7 +1106,7 @@ namespace netlist update(); } - plib::plog_base<netlist_t, NL_DEBUG> &log(); + log_type & log(); public: virtual void timestep(const nl_double st) { plib::unused_var(st); } @@ -1178,6 +1169,7 @@ namespace netlist // ----------------------------------------------------------------------------- // nld_base_dummy : basis for dummy devices + // FIXME: this is not the right place to define this // ----------------------------------------------------------------------------- NETLIB_OBJECT(base_dummy) @@ -1223,16 +1215,8 @@ namespace netlist { public: - explicit netlist_t(const pstring &aname); - virtual ~netlist_t(); - - /** - * @brief Load base libraries for diodes, transistors ... - * - * This must be called after netlist_t is created. - * - */ - void load_base_libraries(); + explicit netlist_t(const pstring &aname, std::unique_ptr<callbacks_t> callbacks); + ~netlist_t(); /* run functions */ @@ -1292,8 +1276,9 @@ namespace netlist /* logging and name */ pstring name() const { return m_name; } - plib::plog_base<netlist_t, NL_DEBUG> &log() { return m_log; } - const plib::plog_base<netlist_t, NL_DEBUG> &log() const { return m_log; } + + log_type & log() { return m_log; } + const log_type &log() const { return m_log; } /* state related */ @@ -1319,9 +1304,6 @@ namespace netlist // FIXME: sort rebuild_lists out void rebuild_lists(); /* must be called after post_load ! */ - /* logging callback */ - virtual void vlog(const plib::plog_level &l, const pstring &ls) const = 0; - protected: void print_stats() const; @@ -1345,8 +1327,6 @@ namespace netlist devices::NETLIB_NAME(netlistparams) *m_params; pstring m_name; - std::unique_ptr<setup_t> m_setup; - plib::plog_base<netlist_t, NL_DEBUG> m_log; std::unique_ptr<plib::dynlib> m_lib; // external lib needs to be loaded as long as netlist exists plib::state_manager_t m_state; @@ -1356,6 +1336,10 @@ namespace netlist nperfcount_t<NL_KEEP_STATISTICS> m_perf_out_processed; std::vector<plib::owned_ptr<core_device_t>> m_devices; + + std::unique_ptr<callbacks_t> m_callbacks; + log_type m_log; + std::unique_ptr<setup_t> m_setup; }; // ----------------------------------------------------------------------------- diff --git a/src/lib/netlist/nl_setup.cpp b/src/lib/netlist/nl_setup.cpp index a02d5f5bbae..e876b2f7e8b 100644 --- a/src/lib/netlist/nl_setup.cpp +++ b/src/lib/netlist/nl_setup.cpp @@ -768,11 +768,11 @@ void setup_t::start_devices() } } -plib::plog_base<netlist_t, NL_DEBUG> &setup_t::log() +log_type &setup_t::log() { return netlist().log(); } -const plib::plog_base<netlist_t, NL_DEBUG> &setup_t::log() const +const log_type &setup_t::log() const { return netlist().log(); } diff --git a/src/lib/netlist/nl_setup.h b/src/lib/netlist/nl_setup.h index cae829023a4..3894cad5415 100644 --- a/src/lib/netlist/nl_setup.h +++ b/src/lib/netlist/nl_setup.h @@ -288,8 +288,8 @@ namespace netlist /* helper - also used by nltool */ const pstring resolve_alias(const pstring &name) const; - plib::plog_base<netlist_t, NL_DEBUG> &log(); - const plib::plog_base<netlist_t, NL_DEBUG> &log() const; + log_type &log(); + const log_type &log() const; //std::vector<std::pair<pstring, factory::element_t *>> m_device_factory; std::unordered_map<pstring, factory::element_t *> m_device_factory; diff --git a/src/lib/netlist/plib/pomp.h b/src/lib/netlist/plib/pomp.h index 221c0d61c00..f13df2539ac 100644 --- a/src/lib/netlist/plib/pomp.h +++ b/src/lib/netlist/plib/pomp.h @@ -9,6 +9,8 @@ #ifndef POMP_H_ #define POMP_H_ +#include <cstddef> + #include "pconfig.h" #if HAS_OPENMP diff --git a/src/lib/netlist/plib/pparser.cpp b/src/lib/netlist/plib/pparser.cpp index f70001530c4..43ed9e14d41 100644 --- a/src/lib/netlist/plib/pparser.cpp +++ b/src/lib/netlist/plib/pparser.cpp @@ -318,7 +318,7 @@ void ppreprocessor::error(const pstring &err) int ppreprocessor::expr(const std::vector<pstring> &sexpr, std::size_t &start, int prio) { - int val; + int val = 0; pstring tok=sexpr[start]; if (tok == "(") { diff --git a/src/lib/netlist/prg/nltool.cpp b/src/lib/netlist/prg/nltool.cpp index c7c3ac652fd..0a5fba22d9e 100644 --- a/src/lib/netlist/prg/nltool.cpp +++ b/src/lib/netlist/prg/nltool.cpp @@ -132,22 +132,35 @@ std::unique_ptr<plib::pistream> netlist_data_folder_t::stream(const pstring &fil return std::unique_ptr<plib::pistream>(nullptr); } +class netlist_tool_callbacks_t : public netlist::callbacks_t +{ +public: + netlist_tool_callbacks_t(tool_app_t &app) + : netlist::callbacks_t() + , m_app(app) + { } + + void vlog(const plib::plog_level &l, const pstring &ls) const override; + +private: + tool_app_t &m_app; +}; + class netlist_tool_t : public netlist::netlist_t { public: netlist_tool_t(tool_app_t &app, const pstring &aname) - : netlist::netlist_t(aname), m_app(app) + : netlist::netlist_t(aname, plib::make_unique<netlist_tool_callbacks_t>(app)) { } - virtual ~netlist_tool_t() override + ~netlist_tool_t() { } void init() { - load_base_libraries(); } void read_netlist(const pstring &filename, const pstring &name, @@ -234,13 +247,10 @@ public: protected: - void vlog(const plib::plog_level &l, const pstring &ls) const override; - private: - tool_app_t &m_app; }; -void netlist_tool_t::vlog(const plib::plog_level &l, const pstring &ls) const +void netlist_tool_callbacks_t::vlog(const plib::plog_level &l, const pstring &ls) const { pstring err = plib::pfmt("{}: {}\n")(l.name())(ls.c_str()); // FIXME: ... diff --git a/src/lib/netlist/solver/nld_solver.cpp b/src/lib/netlist/solver/nld_solver.cpp index 760b7088e67..f9de00d417d 100644 --- a/src/lib/netlist/solver/nld_solver.cpp +++ b/src/lib/netlist/solver/nld_solver.cpp @@ -104,7 +104,7 @@ NETLIB_UPDATE(solver) if (nthreads > 1 && solvers.size() > 1) { plib::omp::set_num_threads(nthreads); - plib::omp::for_static(static_cast<std::size_t>(0), solvers.size(), [this, &solvers](std::size_t i) + plib::omp::for_static(static_cast<std::size_t>(0), solvers.size(), [&solvers](std::size_t i) { const netlist_time ts = solvers[i]->solve(); plib::unused_var(ts); |