From 4f84cc0b443637ad89ad186e37fb5210b1d1d688 Mon Sep 17 00:00:00 2001 From: couriersud Date: Fri, 27 May 2016 03:21:21 +0200 Subject: [PATCH 01/44] Fix pongf. (nw) --- src/lib/netlist/devices/nld_9316.h | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/lib/netlist/devices/nld_9316.h b/src/lib/netlist/devices/nld_9316.h index 82bd008b64c..fcb9228390e 100644 --- a/src/lib/netlist/devices/nld_9316.h +++ b/src/lib/netlist/devices/nld_9316.h @@ -51,16 +51,16 @@ #include "nl_base.h" -#define TTL_9316(name, cCLK, cENP, cENT, cCLRQ, cLOADQ, cA, cB, cC, cD) \ - NET_REGISTER_DEV(TTL_9316, name) \ - NET_CONNECT(name, CLK, cCLK) \ - NET_CONNECT(name, ENP, cENP) \ - NET_CONNECT(name, ENT, cENT) \ - NET_CONNECT(name, CLRQ, cCLRQ) \ - NET_CONNECT(name, LOADQ,_LOADQ) \ - NET_CONNECT(name, A, cA) \ - NET_CONNECT(name, B, cB) \ - NET_CONNECT(name, C, cC) \ +#define TTL_9316(name, cCLK, cENP, cENT, cCLRQ, cLOADQ, cA, cB, cC, cD) \ + NET_REGISTER_DEV(TTL_9316, name) \ + NET_CONNECT(name, CLK, cCLK) \ + NET_CONNECT(name, ENP, cENP) \ + NET_CONNECT(name, ENT, cENT) \ + NET_CONNECT(name, CLRQ, cCLRQ) \ + NET_CONNECT(name, LOADQ, cLOADQ) \ + NET_CONNECT(name, A, cA) \ + NET_CONNECT(name, B, cB) \ + NET_CONNECT(name, C, cC) \ NET_CONNECT(name, D, cD) #define TTL_9316_DIP(name) \ From 3ea466a845aac01c3d106be120bf4de7b3887a4d Mon Sep 17 00:00:00 2001 From: couriersud Date: Fri, 27 May 2016 14:42:58 +0200 Subject: [PATCH 02/44] Minor cosmetic refactoring. Added a "uninitialised array" template to allow in-place creation (for increased locality) of netlist classes. Main use is in truthtable class. (nw) --- src/devices/machine/netlist.cpp | 2 +- src/lib/netlist/devices/nld_log.h | 2 +- src/lib/netlist/devices/nld_system.h | 4 +- src/lib/netlist/devices/nld_truthtable.cpp | 4 +- src/lib/netlist/devices/nld_truthtable.h | 17 ++++++--- src/lib/netlist/nl_base.cpp | 18 ++++----- src/lib/netlist/nl_base.h | 7 ++-- src/lib/netlist/nl_config.h | 7 +++- src/lib/netlist/nl_factory.cpp | 2 +- src/lib/netlist/nl_factory.h | 14 +++---- src/lib/netlist/nl_parser.cpp | 2 +- src/lib/netlist/nl_setup.cpp | 10 ++--- src/lib/netlist/nl_setup.h | 4 +- src/lib/netlist/plib/palloc.cpp | 10 ++--- src/lib/netlist/plib/palloc.h | 34 ++++++++--------- src/lib/netlist/plib/plists.h | 44 ++++++++++++++++++++++ src/lib/netlist/plib/pstate.cpp | 4 +- src/lib/netlist/tools/nl_convert.cpp | 2 +- 18 files changed, 121 insertions(+), 66 deletions(-) diff --git a/src/devices/machine/netlist.cpp b/src/devices/machine/netlist.cpp index a3936b9e5d4..8cfba776257 100644 --- a/src/devices/machine/netlist.cpp +++ b/src/devices/machine/netlist.cpp @@ -100,7 +100,7 @@ void netlist_mame_analog_output_t::custom_netlist_additions(netlist::setup_t &se pstring dname = "OUT_" + m_in; m_delegate.bind_relative_to(owner()->machine().root_device()); - plib::powned_ptr dev = plib::powned_ptr::Create(setup.netlist(), setup.build_fqn(dname)); + plib::owned_ptr dev = plib::owned_ptr::Create(setup.netlist(), setup.build_fqn(dname)); static_cast(dev.get())->register_callback(m_delegate); setup.register_dev(std::move(dev)); setup.register_link(dname + ".IN", m_in); diff --git a/src/lib/netlist/devices/nld_log.h b/src/lib/netlist/devices/nld_log.h index 79ef4e53ae6..76e60be8951 100644 --- a/src/lib/netlist/devices/nld_log.h +++ b/src/lib/netlist/devices/nld_log.h @@ -42,7 +42,7 @@ NETLIB_OBJECT(log) enregister("I", m_I); pstring filename = plib::pfmt("{1}.log")(this->name()); - m_strm = plib::pmake_unique(filename); + m_strm = plib::make_unique(filename); } NETLIB_DESTRUCTOR(log); NETLIB_UPDATEI(); diff --git a/src/lib/netlist/devices/nld_system.h b/src/lib/netlist/devices/nld_system.h index d7e340c421e..89864d1fb4f 100644 --- a/src/lib/netlist/devices/nld_system.h +++ b/src/lib/netlist/devices/nld_system.h @@ -631,9 +631,9 @@ public: pstring m_devname; }; - plib::powned_ptr Create(netlist_t &anetlist, const pstring &name) override + plib::owned_ptr Create(netlist_t &anetlist, const pstring &name) override { - return plib::powned_ptr::Create(this->name(), anetlist, name); + return plib::owned_ptr::Create(this->name(), anetlist, name); } private: diff --git a/src/lib/netlist/devices/nld_truthtable.cpp b/src/lib/netlist/devices/nld_truthtable.cpp index bd37a80d4f4..bd34a537471 100644 --- a/src/lib/netlist/devices/nld_truthtable.cpp +++ b/src/lib/netlist/devices/nld_truthtable.cpp @@ -243,13 +243,13 @@ void truthtable_desc_t::setup(const plib::pstring_vector_t &truthtable, UINT32 d #define ENTRYX(n, m, h) case (n * 1000 + m * 10 + h): \ { using xtype = netlist_factory_truthtable_t; \ - return plib::powned_ptr::Create(name,classname,def_param); } break + return plib::owned_ptr::Create(name,classname,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::powned_ptr nl_tt_factory_create(const unsigned ni, const unsigned no, +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) diff --git a/src/lib/netlist/devices/nld_truthtable.h b/src/lib/netlist/devices/nld_truthtable.h index 8f447420490..14aa9fd31b3 100644 --- a/src/lib/netlist/devices/nld_truthtable.h +++ b/src/lib/netlist/devices/nld_truthtable.h @@ -10,8 +10,11 @@ #ifndef NLD_TRUTHTABLE_H_ #define NLD_TRUTHTABLE_H_ +#include + #include "nl_base.h" #include "nl_factory.h" +#include "plib/plists.h" #define NETLIB_TRUTHTABLE(cname, nIN, nOUT, state) \ class NETLIB_NAME(cname) : public nld_truthtable_t \ @@ -159,11 +162,13 @@ public: for (unsigned i=0; i < m_NI; i++) { + new (&m_I[i]) logic_input_t(); inout[i] = inout[i].trim(); enregister(inout[i], m_I[i]); } for (unsigned i=0; i < m_NO; i++) { + new (&m_Q[i]) logic_output_t(); out[i] = out[i].trim(); enregister(out[i], m_Q[i]); } @@ -246,8 +251,10 @@ public: } } - logic_input_t m_I[m_NI]; - logic_output_t m_Q[m_NO]; + //logic_input_t m_I[m_NI]; + //logic_output_t m_Q[m_NO]; + plib::uninitialised_array_t m_I; + plib::uninitialised_array_t m_Q; protected: @@ -341,16 +348,16 @@ public: const pstring &def_param) : netlist_base_factory_truthtable_t(name, classname, def_param) { } - plib::powned_ptr Create(netlist_t &anetlist, const pstring &name) override + plib::owned_ptr Create(netlist_t &anetlist, const pstring &name) override { typedef nld_truthtable_t tt_type; - return plib::powned_ptr::Create(anetlist, name, m_family, &m_ttbl, m_desc); + return plib::owned_ptr::Create(anetlist, name, m_family, &m_ttbl, m_desc); } private: typename nld_truthtable_t::truthtable_t m_ttbl; }; -plib::powned_ptr nl_tt_factory_create(const unsigned ni, const unsigned no, +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); diff --git a/src/lib/netlist/nl_base.cpp b/src/lib/netlist/nl_base.cpp index f7629065ff4..c0df377ee37 100644 --- a/src/lib/netlist/nl_base.cpp +++ b/src/lib/netlist/nl_base.cpp @@ -21,8 +21,8 @@ const netlist::netlist_time netlist::netlist_time::zero = netlist::netlist_time( namespace netlist { -#if 0 -static pmempool p(65536, 16); +#if (NL_USE_MEMPOOL) +static plib::pmempool p(65536, 16); void * object_t::operator new (size_t size) { @@ -64,9 +64,9 @@ public: m_R_low = 1.0; m_R_high = 130.0; } - virtual plib::powned_ptr create_d_a_proxy(netlist_t &anetlist, const pstring &name, logic_output_t *proxied) const override + virtual plib::owned_ptr create_d_a_proxy(netlist_t &anetlist, const pstring &name, logic_output_t *proxied) const override { - return plib::powned_ptr::Create(anetlist, name, proxied); + return plib::owned_ptr::Create(anetlist, name, proxied); } }; @@ -84,9 +84,9 @@ public: m_R_low = 10.0; m_R_high = 10.0; } - virtual plib::powned_ptr create_d_a_proxy(netlist_t &anetlist, const pstring &name, logic_output_t *proxied) const override + virtual plib::owned_ptr create_d_a_proxy(netlist_t &anetlist, const pstring &name, logic_output_t *proxied) const override { - return plib::powned_ptr::Create(anetlist, name, proxied); + return plib::owned_ptr::Create(anetlist, name, proxied); } }; @@ -264,7 +264,7 @@ ATTR_COLD void netlist_t::start() || setup().factory().is_class(e.second) || setup().factory().is_class(e.second)) { - auto dev = plib::powned_ptr(e.second->Create(*this, e.first)); + auto dev = plib::owned_ptr(e.second->Create(*this, e.first)); setup().register_dev_s(std::move(dev)); } } @@ -287,7 +287,7 @@ ATTR_COLD void netlist_t::start() && !setup().factory().is_class(e.second) && !setup().factory().is_class(e.second)) { - auto dev = plib::powned_ptr(e.second->Create(*this, e.first)); + auto dev = plib::owned_ptr(e.second->Create(*this, e.first)); setup().register_dev_s(std::move(dev)); } } @@ -495,7 +495,7 @@ ATTR_COLD core_device_t::core_device_t(core_device_t &owner, const pstring &name if (logic_family() == nullptr) set_logic_family(family_TTL()); init_object(owner.netlist(), owner.name() + "." + name); - owner.netlist().m_devices.push_back(plib::powned_ptr(this, false)); + owner.netlist().m_devices.push_back(plib::owned_ptr(this, false)); } ATTR_COLD core_device_t::~core_device_t() diff --git a/src/lib/netlist/nl_base.h b/src/lib/netlist/nl_base.h index 63650c25700..06db55b796b 100644 --- a/src/lib/netlist/nl_base.h +++ b/src/lib/netlist/nl_base.h @@ -313,7 +313,7 @@ namespace netlist public: logic_family_desc_t() {} virtual ~logic_family_desc_t() {} - virtual plib::powned_ptr create_d_a_proxy(netlist_t &anetlist, const pstring &name, + virtual plib::owned_ptr create_d_a_proxy(netlist_t &anetlist, const pstring &name, logic_output_t *proxied) const = 0; nl_double m_low_thresh_V; @@ -404,11 +404,10 @@ namespace netlist const type_t m_objtype; netlist_t * m_netlist; -#if 1 public: + void * operator new (size_t size, void *ptr) { return ptr; } void * operator new (size_t size); void operator delete (void * mem); -#endif }; // ----------------------------------------------------------------------------- @@ -1270,7 +1269,7 @@ namespace netlist void print_stats() const; - plib::pvector_t> m_devices; + plib::pvector_t> m_devices; /* sole use is to manage lifetime of net objects */ net_t::list_t m_nets; diff --git a/src/lib/netlist/nl_config.h b/src/lib/netlist/nl_config.h index dd96bbd5ecc..580e03ec1ad 100644 --- a/src/lib/netlist/nl_config.h +++ b/src/lib/netlist/nl_config.h @@ -73,7 +73,6 @@ #pragma GCC diagnostic ignored "-Wpmf-conversions" #endif -#define USE_TRUTHTABLE (1) // The following adds about 10% performance ... @@ -95,6 +94,12 @@ #define nl_double double #define NL_FCONST(x) x +//============================================================ +// GENERAL +//============================================================ + +#define NL_USE_MEMPOOL (0) +#define USE_TRUTHTABLE (1) //============================================================ // Solver defines diff --git a/src/lib/netlist/nl_factory.cpp b/src/lib/netlist/nl_factory.cpp index 0b59d0afef4..7a9a61668bd 100644 --- a/src/lib/netlist/nl_factory.cpp +++ b/src/lib/netlist/nl_factory.cpp @@ -67,7 +67,7 @@ void factory_list_t::error(const pstring &s) m_setup.log().fatal("{1}", s); } -plib::powned_ptr factory_list_t::new_device_by_name(const pstring &devname, netlist_t &anetlist, const pstring &name) +plib::owned_ptr factory_list_t::new_device_by_name(const pstring &devname, netlist_t &anetlist, const pstring &name) { base_factory_t *f = factory_by_name(devname); return f->Create(anetlist, name); diff --git a/src/lib/netlist/nl_factory.h b/src/lib/netlist/nl_factory.h index 97374d29c1a..8197d8a5a95 100644 --- a/src/lib/netlist/nl_factory.h +++ b/src/lib/netlist/nl_factory.h @@ -32,7 +32,7 @@ namespace netlist virtual ~base_factory_t() {} - virtual plib::powned_ptr Create(netlist_t &anetlist, const pstring &name) = 0; + virtual plib::owned_ptr Create(netlist_t &anetlist, const pstring &name) = 0; const pstring &name() const { return m_name; } const pstring &classname() const { return m_classname; } @@ -55,14 +55,14 @@ namespace netlist const pstring &def_param) : base_factory_t(name, classname, def_param) { } - plib::powned_ptr Create(netlist_t &anetlist, const pstring &name) override + plib::owned_ptr Create(netlist_t &anetlist, const pstring &name) override { - return plib::powned_ptr::Create(anetlist, name); + return plib::owned_ptr::Create(anetlist, name); } }; - class factory_list_t : public plib::pvector_t> + class factory_list_t : public plib::pvector_t> { public: factory_list_t(setup_t &m_setup); @@ -72,10 +72,10 @@ namespace netlist void register_device(const pstring &name, const pstring &classname, const pstring &def_param) { - register_device(plib::powned_ptr::Create>(name, classname, def_param)); + register_device(plib::owned_ptr::Create>(name, classname, def_param)); } - void register_device(plib::powned_ptr factory) + void register_device(plib::owned_ptr factory) { for (auto & e : *this) if (e->name() == factory->name()) @@ -85,7 +85,7 @@ namespace netlist //ATTR_COLD device_t *new_device_by_classname(const pstring &classname) const; // FIXME: legacy, should use factory_by_name - plib::powned_ptr new_device_by_name(const pstring &devname, netlist_t &anetlist, const pstring &name); + plib::owned_ptr new_device_by_name(const pstring &devname, netlist_t &anetlist, const pstring &name); base_factory_t * factory_by_name(const pstring &devname); template diff --git a/src/lib/netlist/nl_parser.cpp b/src/lib/netlist/nl_parser.cpp index 2aa4366b0ba..c001a6c0fd6 100644 --- a/src/lib/netlist/nl_parser.cpp +++ b/src/lib/netlist/nl_parser.cpp @@ -158,7 +158,7 @@ void parser_t::net_truthtable_start() pstring def_param = get_string(); require_token(m_tok_param_right); - plib::powned_ptr ttd = netlist::devices::nl_tt_factory_create(ni, no, hs, + plib::owned_ptr ttd = netlist::devices::nl_tt_factory_create(ni, no, hs, name, name, "+" + def_param); while (true) diff --git a/src/lib/netlist/nl_setup.cpp b/src/lib/netlist/nl_setup.cpp index 8e0b9a11ff2..1f91e1666a8 100644 --- a/src/lib/netlist/nl_setup.cpp +++ b/src/lib/netlist/nl_setup.cpp @@ -100,7 +100,7 @@ void setup_t::namespace_pop() } -void setup_t::register_dev(plib::powned_ptr dev) +void setup_t::register_dev(plib::owned_ptr dev) { for (auto & d : netlist().m_devices) if (d->name() == dev->name()) @@ -529,7 +529,7 @@ void setup_t::connect_input_output(core_terminal_t &in, core_terminal_t &out) { logic_input_t &incast = dynamic_cast(in); pstring x = plib::pfmt("proxy_ad_{1}_{2}")(in.name())( m_proxy_cnt); - auto proxy = plib::powned_ptr::Create(netlist(), x, &incast); + auto proxy = plib::owned_ptr::Create(netlist(), x, &incast); incast.set_proxy(proxy.get()); m_proxy_cnt++; @@ -567,7 +567,7 @@ void setup_t::connect_terminal_input(terminal_t &term, core_terminal_t &inp) logic_input_t &incast = dynamic_cast(inp); log().debug("connect_terminal_input: connecting proxy\n"); pstring x = plib::pfmt("proxy_ad_{1}_{2}")(inp.name())(m_proxy_cnt); - auto proxy = plib::powned_ptr::Create(netlist(), x, &incast); + auto proxy = plib::owned_ptr::Create(netlist(), x, &incast); incast.set_proxy(proxy.get()); m_proxy_cnt++; @@ -872,10 +872,10 @@ class logic_family_std_proxy_t : public logic_family_desc_t { public: logic_family_std_proxy_t() { } - virtual plib::powned_ptr create_d_a_proxy(netlist_t &anetlist, + virtual plib::owned_ptr create_d_a_proxy(netlist_t &anetlist, const pstring &name, logic_output_t *proxied) const override { - return plib::powned_ptr::Create(anetlist, name, proxied); + return plib::owned_ptr::Create(anetlist, name, proxied); } }; diff --git a/src/lib/netlist/nl_setup.h b/src/lib/netlist/nl_setup.h index bb0a6f2d01a..d7ab1723b79 100644 --- a/src/lib/netlist/nl_setup.h +++ b/src/lib/netlist/nl_setup.h @@ -116,13 +116,13 @@ namespace netlist void register_object(device_t &dev, const pstring &name, object_t &obj); template - void register_dev_s(plib::powned_ptr dev) + void register_dev_s(plib::owned_ptr dev) { register_dev(std::move(dev)); } - void register_dev(plib::powned_ptr dev); + void register_dev(plib::owned_ptr dev); void register_dev(const pstring &classname, const pstring &name); void register_lib_entry(const pstring &name); diff --git a/src/lib/netlist/plib/palloc.cpp b/src/lib/netlist/plib/palloc.cpp index c3d674f7519..64675bf4938 100644 --- a/src/lib/netlist/plib/palloc.cpp +++ b/src/lib/netlist/plib/palloc.cpp @@ -22,11 +22,11 @@ pexception::pexception(const pstring &text) fprintf(stderr, "%s\n", m_text.cstr()); } -pmempool::pmempool(int min_alloc, int min_align) +mempool::mempool(int min_alloc, int min_align) : m_min_alloc(min_alloc), m_min_align(min_align) { } -pmempool::~pmempool() +mempool::~mempool() { for (auto & b : m_blocks) { @@ -37,7 +37,7 @@ pmempool::~pmempool() m_blocks.clear(); } -int pmempool::new_block() +int mempool::new_block() { block b; b.data = new char[m_min_alloc]; @@ -49,7 +49,7 @@ int pmempool::new_block() } -void *pmempool::alloc(size_t size) +void *mempool::alloc(size_t size) { size_t rs = (size + sizeof(info) + m_min_align - 1) & ~(m_min_align - 1); for (int bn=0; bn < m_blocks.size(); bn++) @@ -79,7 +79,7 @@ void *pmempool::alloc(size_t size) } } -void pmempool::free(void *ptr) +void mempool::free(void *ptr) { char *p = (char *) ptr; diff --git a/src/lib/netlist/plib/palloc.h b/src/lib/netlist/plib/palloc.h index bd994466226..c361bd75b72 100644 --- a/src/lib/netlist/plib/palloc.h +++ b/src/lib/netlist/plib/palloc.h @@ -77,7 +77,7 @@ template void pfree_array(T *ptr) { delete [] ptr; } template -std::unique_ptr pmake_unique(Args&&... args) { +std::unique_ptr make_unique(Args&&... args) { return std::unique_ptr(new T(std::forward(args)...)); } @@ -89,19 +89,19 @@ static std::unique_ptr make_unique_base(Args&&... args) } template -class powned_ptr +class owned_ptr { private: - powned_ptr() + owned_ptr() : m_ptr(nullptr), m_is_owned(true) { } public: - powned_ptr(SC *p, bool owned) + owned_ptr(SC *p, bool owned) : m_ptr(p), m_is_owned(owned) { } - powned_ptr(const powned_ptr &r) = delete; - powned_ptr & operator =(const powned_ptr &r) = delete; + owned_ptr(const owned_ptr &r) = delete; + owned_ptr & operator =(const owned_ptr &r) = delete; - powned_ptr(powned_ptr &&r) + owned_ptr(owned_ptr &&r) { m_is_owned = r.m_is_owned; m_ptr = r.m_ptr; @@ -110,7 +110,7 @@ public: } template - powned_ptr(powned_ptr &&r) + owned_ptr(owned_ptr &&r) { SC *dest_ptr = &dynamic_cast(*r.get()); bool o = r.is_owned(); @@ -119,24 +119,24 @@ public: m_ptr = dest_ptr; } - ~powned_ptr() + ~owned_ptr() { if (m_is_owned) delete m_ptr; } template - static powned_ptr Create(Args&&... args) + static owned_ptr Create(Args&&... args) { - powned_ptr a; + owned_ptr a; DC *x = new DC(std::forward(args)...); a.m_ptr = static_cast(x); return a; } template - static powned_ptr Create(Args&&... args) + static owned_ptr Create(Args&&... args) { - powned_ptr a; + owned_ptr a; a.m_ptr = new SC(std::forward(args)...); return a; } @@ -149,7 +149,7 @@ public: bool is_owned() const { return m_is_owned; } template - powned_ptr & operator =(powned_ptr &r) + owned_ptr & operator =(owned_ptr &r) { m_is_owned = r.m_is_owned; m_ptr = r.m_ptr; @@ -165,7 +165,7 @@ private: bool m_is_owned; }; -class pmempool +class mempool { private: struct block @@ -186,8 +186,8 @@ private: }; public: - pmempool(int min_alloc, int min_align); - ~pmempool(); + mempool(int min_alloc, int min_align); + ~mempool(); void *alloc(size_t size); void free(void *ptr); diff --git a/src/lib/netlist/plib/plists.h b/src/lib/netlist/plib/plists.h index c2a4f44565a..82cc9694e97 100644 --- a/src/lib/netlist/plib/plists.h +++ b/src/lib/netlist/plib/plists.h @@ -87,6 +87,50 @@ private: int m_capacity; }; +/* ---------------------------------------------------------------------------------------- + * uninitialised_array_t: + * fixed size array allowing to override constructor and initialize + * members by placement new. + * + * Use with care. This template is provided to improve locality of storage + * in high frequency applications. It should not be used for anything else. + * ---------------------------------------------------------------------------------------- */ + +template +class uninitialised_array_t +{ +public: + uninitialised_array_t() + { + } + + ~uninitialised_array_t() + { + for (std::size_t i=0; i(reinterpret_cast(m_buf) + index * sizeof(C)); + } + + ATTR_HOT const C& operator[](const std::size_t index) const + { + return *reinterpret_cast(reinterpret_cast(m_buf) + index * sizeof(C)); + } + +protected: + +private: + + /* ensure proper alignment */ + UINT64 m_buf[(N * sizeof(C) + sizeof(UINT64) - 1) / sizeof(UINT64)]; +}; + // ---------------------------------------------------------------------------------------- // plist_t: a simple list // ---------------------------------------------------------------------------------------- diff --git a/src/lib/netlist/plib/pstate.cpp b/src/lib/netlist/plib/pstate.cpp index f0763d5eab4..ad477d39285 100644 --- a/src/lib/netlist/plib/pstate.cpp +++ b/src/lib/netlist/plib/pstate.cpp @@ -38,7 +38,7 @@ ATTR_COLD void pstate_manager_t::save_state_ptr(const pstring &stname, const pst "DT_FLOAT" }; - auto p = pmake_unique(stname, dt, owner, size, count, ptr, is_ptr); + auto p = plib::make_unique(stname, dt, owner, size, count, ptr, is_ptr); m_save.push_back(std::move(p)); } @@ -72,7 +72,7 @@ template<> ATTR_COLD void pstate_manager_t::save_item(pstate_callback_t &state, { //save_state_ptr(stname, DT_CUSTOM, 0, 1, &state); pstate_callback_t *state_p = &state; - auto p = pmake_unique(stname, owner, state_p); + auto p = plib::make_unique(stname, owner, state_p); m_save.push_back(std::move(p)); state.register_state(*this, stname); } diff --git a/src/lib/netlist/tools/nl_convert.cpp b/src/lib/netlist/tools/nl_convert.cpp index fde6c663005..145de96aa38 100644 --- a/src/lib/netlist/tools/nl_convert.cpp +++ b/src/lib/netlist/tools/nl_convert.cpp @@ -38,7 +38,7 @@ static plib::pvector_t bubble(const plib::pvector_t &sl) void nl_convert_base_t::add_pin_alias(const pstring &devname, const pstring &name, const pstring &alias) { pstring pname = devname + "." + name; - m_pins.add(pname, plib::pmake_unique(pname, devname + "." + alias)); + m_pins.add(pname, plib::make_unique(pname, devname + "." + alias)); } void nl_convert_base_t::add_ext_alias(const pstring &alias) From d664e1e32443d5da9a312cbfb3a54e20059ffde5 Mon Sep 17 00:00:00 2001 From: couriersud Date: Fri, 27 May 2016 15:08:08 +0200 Subject: [PATCH 03/44] squash me --- src/lib/netlist/plib/plists.h | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/lib/netlist/plib/plists.h b/src/lib/netlist/plib/plists.h index 82cc9694e97..5bb604d4355 100644 --- a/src/lib/netlist/plib/plists.h +++ b/src/lib/netlist/plib/plists.h @@ -113,12 +113,14 @@ public: } } - ATTR_HOT C& operator[](const std::size_t index) + size_t size() { return N; } + + C& operator[](const std::size_t &index) { return *reinterpret_cast(reinterpret_cast(m_buf) + index * sizeof(C)); } - ATTR_HOT const C& operator[](const std::size_t index) const + const C& operator[](const std::size_t &index) const { return *reinterpret_cast(reinterpret_cast(m_buf) + index * sizeof(C)); } From 8ad07cdbbe38d1f1ae7a8b7da63838880c3ee52b Mon Sep 17 00:00:00 2001 From: couriersud Date: Fri, 27 May 2016 16:20:45 +0200 Subject: [PATCH 04/44] Squash me later. --- src/lib/netlist/nl_base.cpp | 5 +---- src/lib/netlist/plib/plists.h | 2 -- src/lib/netlist/solver/nld_matrix_solver.h | 4 ++-- 3 files changed, 3 insertions(+), 8 deletions(-) diff --git a/src/lib/netlist/nl_base.cpp b/src/lib/netlist/nl_base.cpp index c0df377ee37..fa8e14e888c 100644 --- a/src/lib/netlist/nl_base.cpp +++ b/src/lib/netlist/nl_base.cpp @@ -5,10 +5,7 @@ * */ -#include - -#include -#include +#include "solver/nld_matrix_solver.h" #include "plib/palloc.h" diff --git a/src/lib/netlist/plib/plists.h b/src/lib/netlist/plib/plists.h index 5bb604d4355..6a0cb89bd37 100644 --- a/src/lib/netlist/plib/plists.h +++ b/src/lib/netlist/plib/plists.h @@ -10,9 +10,7 @@ #ifndef PLISTS_H_ #define PLISTS_H_ -#include #include -#include #include #include diff --git a/src/lib/netlist/solver/nld_matrix_solver.h b/src/lib/netlist/solver/nld_matrix_solver.h index b4e8da156c8..e3139c2846e 100644 --- a/src/lib/netlist/solver/nld_matrix_solver.h +++ b/src/lib/netlist/solver/nld_matrix_solver.h @@ -8,11 +8,11 @@ #ifndef NLD_MATRIX_SOLVER_H_ #define NLD_MATRIX_SOLVER_H_ +#include + #include "solver/nld_solver.h" #include "plib/pstream.h" -#include - NETLIB_NAMESPACE_DEVICES_START() class terms_t From 06e6cc317e2e70395ff964ee5f3a6445cf6557ea Mon Sep 17 00:00:00 2001 From: couriersud Date: Fri, 27 May 2016 17:18:13 +0200 Subject: [PATCH 05/44] Remove PLIB_NAMESPACE macros. (nw) --- src/lib/netlist/nl_base.h | 2 +- src/lib/netlist/nl_time.h | 4 +- src/lib/netlist/plib/palloc.cpp | 4 +- src/lib/netlist/plib/palloc.h | 4 +- src/lib/netlist/plib/pconfig.h | 95 ++++++++++++++++---------------- src/lib/netlist/plib/pdynlib.cpp | 4 +- src/lib/netlist/plib/pdynlib.h | 4 +- src/lib/netlist/plib/pfmtlog.cpp | 4 +- src/lib/netlist/plib/pfmtlog.h | 4 +- src/lib/netlist/plib/plists.h | 4 +- src/lib/netlist/plib/poptions.h | 4 +- src/lib/netlist/plib/pparser.cpp | 4 +- src/lib/netlist/plib/pparser.h | 4 +- src/lib/netlist/plib/pstate.cpp | 4 +- src/lib/netlist/plib/pstate.h | 4 +- src/lib/netlist/plib/pstream.cpp | 4 +- src/lib/netlist/plib/pstream.h | 4 +- src/lib/netlist/plib/ptypes.h | 4 +- 18 files changed, 79 insertions(+), 82 deletions(-) diff --git a/src/lib/netlist/nl_base.h b/src/lib/netlist/nl_base.h index 06db55b796b..d857353f116 100644 --- a/src/lib/netlist/nl_base.h +++ b/src/lib/netlist/nl_base.h @@ -181,7 +181,7 @@ using netlist_sig_t = std::uint32_t; //============================================================ #define NETLIB_NAMESPACE_DEVICES_START() namespace netlist { namespace devices { -#define NETLIB_NAMESPACE_DEVICES_END() }} +#define NETLIB_NAMESPACE_DEVICES_END() }} // netlist::devices #define NETLIB_NAME(chip) nld_ ## chip diff --git a/src/lib/netlist/nl_time.h b/src/lib/netlist/nl_time.h index a97a02bc34a..7949f68e132 100644 --- a/src/lib/netlist/nl_time.h +++ b/src/lib/netlist/nl_time.h @@ -137,11 +137,11 @@ namespace netlist } -PLIB_NAMESPACE_START() +namespace plib { template<> ATTR_COLD inline void pstate_manager_t::save_item(netlist::netlist_time &nlt, const void *owner, const pstring &stname) { save_state_ptr(stname, netlist::netlist_time::STATETYPE, owner, sizeof(netlist::netlist_time::INTERNALTYPE), 1, nlt.get_internaltype_ptr(), false); } -PLIB_NAMESPACE_END() +} #endif /* NLTIME_H_ */ diff --git a/src/lib/netlist/plib/palloc.cpp b/src/lib/netlist/plib/palloc.cpp index 64675bf4938..f58da749792 100644 --- a/src/lib/netlist/plib/palloc.cpp +++ b/src/lib/netlist/plib/palloc.cpp @@ -10,7 +10,7 @@ #include "pconfig.h" #include "palloc.h" -PLIB_NAMESPACE_START() +namespace plib { //============================================================ // Exceptions @@ -95,4 +95,4 @@ void mempool::free(void *ptr) b->m_num_alloc--; } -PLIB_NAMESPACE_END() +} diff --git a/src/lib/netlist/plib/palloc.h b/src/lib/netlist/plib/palloc.h index c361bd75b72..6b79d410bc8 100644 --- a/src/lib/netlist/plib/palloc.h +++ b/src/lib/netlist/plib/palloc.h @@ -36,7 +36,7 @@ #endif -PLIB_NAMESPACE_START() +namespace plib { //============================================================ // exception base @@ -198,6 +198,6 @@ public: std::vector m_blocks; }; -PLIB_NAMESPACE_END() +} #endif /* PALLOC_H_ */ diff --git a/src/lib/netlist/plib/pconfig.h b/src/lib/netlist/plib/pconfig.h index 1b7a241c1d4..7634c663123 100644 --- a/src/lib/netlist/plib/pconfig.h +++ b/src/lib/netlist/plib/pconfig.h @@ -27,9 +27,6 @@ typedef _uint128_t UINT128; typedef _int128_t INT128; #endif -#define PLIB_NAMESPACE_START() namespace plib { -#define PLIB_NAMESPACE_END() } - #if !(PSTANDALONE) #include "osdcomm.h" //#include "eminline.h" @@ -139,7 +136,7 @@ typedef int64_t INT64; #endif -PLIB_NAMESPACE_START() +namespace plib { using ticks_t = INT64; @@ -171,59 +168,59 @@ static inline ticks_t profile_ticks() { return ticks(); } */ #if (PHAS_PMF_INTERNAL) -class mfp -{ -public: - // construct from any member function pointer - class generic_class; - using generic_function = void (*)(); - - template - mfp(MemberFunctionType mftp) - : m_function(0), m_this_delta(0) + class mfp { - *reinterpret_cast(this) = mftp; - } + public: + // construct from any member function pointer + class generic_class; + using generic_function = void (*)(); - // binding helper - template - FunctionType update_after_bind(ObjectType *object) - { - return reinterpret_cast( - convert_to_generic(reinterpret_cast(object))); - } - template - static FunctionType get_mfp(MemberFunctionType mftp, ObjectType *object) - { - mfp mfpo(mftp); - return mfpo.update_after_bind(object); - } + template + mfp(MemberFunctionType mftp) + : m_function(0), m_this_delta(0) + { + *reinterpret_cast(this) = mftp; + } -private: - // extract the generic function and adjust the object pointer - generic_function convert_to_generic(generic_class * object) const - { - // apply the "this" delta to the object first - generic_class * o_p_delta = reinterpret_cast(reinterpret_cast(object) + m_this_delta); + // binding helper + template + FunctionType update_after_bind(ObjectType *object) + { + return reinterpret_cast( + convert_to_generic(reinterpret_cast(object))); + } + template + static FunctionType get_mfp(MemberFunctionType mftp, ObjectType *object) + { + mfp mfpo(mftp); + return mfpo.update_after_bind(object); + } - // if the low bit of the vtable index is clear, then it is just a raw function pointer - if (!(m_function & 1)) - return reinterpret_cast(m_function); + private: + // extract the generic function and adjust the object pointer + generic_function convert_to_generic(generic_class * object) const + { + // apply the "this" delta to the object first + generic_class * o_p_delta = reinterpret_cast(reinterpret_cast(object) + m_this_delta); - // otherwise, it is the byte index into the vtable where the actual function lives - std::uint8_t *vtable_base = *reinterpret_cast(o_p_delta); - return *reinterpret_cast(vtable_base + m_function - 1); - } + // if the low bit of the vtable index is clear, then it is just a raw function pointer + if (!(m_function & 1)) + return reinterpret_cast(m_function); - // actual state - uintptr_t m_function; // first item can be one of two things: - // if even, it's a pointer to the function - // if odd, it's the byte offset into the vtable - int m_this_delta; // delta to apply to the 'this' pointer -}; + // otherwise, it is the byte index into the vtable where the actual function lives + std::uint8_t *vtable_base = *reinterpret_cast(o_p_delta); + return *reinterpret_cast(vtable_base + m_function - 1); + } + + // actual state + uintptr_t m_function; // first item can be one of two things: + // if even, it's a pointer to the function + // if odd, it's the byte offset into the vtable + int m_this_delta; // delta to apply to the 'this' pointer + }; #endif -PLIB_NAMESPACE_END() +} #endif /* PCONFIG_H_ */ diff --git a/src/lib/netlist/plib/pdynlib.cpp b/src/lib/netlist/plib/pdynlib.cpp index f1901e4dda3..27021c9d364 100644 --- a/src/lib/netlist/plib/pdynlib.cpp +++ b/src/lib/netlist/plib/pdynlib.cpp @@ -12,7 +12,7 @@ #include #endif -PLIB_NAMESPACE_START() +namespace plib { dynlib::dynlib(const pstring libname) : m_isLoaded(false), m_lib(nullptr) @@ -96,4 +96,4 @@ void *dynlib::getsym_p(const pstring name) #endif } -PLIB_NAMESPACE_END() +} diff --git a/src/lib/netlist/plib/pdynlib.h b/src/lib/netlist/plib/pdynlib.h index 71b885d2b8f..08aa531d1bf 100644 --- a/src/lib/netlist/plib/pdynlib.h +++ b/src/lib/netlist/plib/pdynlib.h @@ -13,7 +13,7 @@ #include "pconfig.h" #include "pstring.h" -PLIB_NAMESPACE_START() +namespace plib { // ---------------------------------------------------------------------------------------- // pdynlib: dynamic loading of libraries ... @@ -40,6 +40,6 @@ private: void *m_lib; }; -PLIB_NAMESPACE_END() +} #endif /* PSTRING_H_ */ diff --git a/src/lib/netlist/plib/pfmtlog.cpp b/src/lib/netlist/plib/pfmtlog.cpp index 90e743b8125..40ab47209ba 100644 --- a/src/lib/netlist/plib/pfmtlog.cpp +++ b/src/lib/netlist/plib/pfmtlog.cpp @@ -16,7 +16,7 @@ #include "pfmtlog.h" #include "palloc.h" -PLIB_NAMESPACE_START() +namespace plib { pfmt::pfmt(const pstring &fmt) : m_str(m_str_buf), m_allocated(0), m_arg(0) @@ -164,6 +164,6 @@ void pfmt::format_element(const char *f, const char *l, const char *fmt_spec, . va_end(ap); } -PLIB_NAMESPACE_END() +} #endif diff --git a/src/lib/netlist/plib/pfmtlog.h b/src/lib/netlist/plib/pfmtlog.h index 1aff9473311..603e623c103 100644 --- a/src/lib/netlist/plib/pfmtlog.h +++ b/src/lib/netlist/plib/pfmtlog.h @@ -14,7 +14,7 @@ #include "pstring.h" #include "ptypes.h" -PLIB_NAMESPACE_START() +namespace plib { template struct ptype_treats @@ -295,7 +295,7 @@ void plog_channel::vdowrite(const pstring &ls) const m_base->vlog(L, ls); } -PLIB_NAMESPACE_END() +} #endif /* PSTRING_H_ */ diff --git a/src/lib/netlist/plib/plists.h b/src/lib/netlist/plib/plists.h index 6a0cb89bd37..4e1454a7d30 100644 --- a/src/lib/netlist/plib/plists.h +++ b/src/lib/netlist/plib/plists.h @@ -17,7 +17,7 @@ #include "palloc.h" #include "pstring.h" -PLIB_NAMESPACE_START() +namespace plib { // ---------------------------------------------------------------------------------------- // parray_t: dynamic array @@ -661,6 +661,6 @@ static inline void sort_list(T &sl) } } -PLIB_NAMESPACE_END() +} #endif /* PLISTS_H_ */ diff --git a/src/lib/netlist/plib/poptions.h b/src/lib/netlist/plib/poptions.h index 1665738ebe4..ea48598d5f5 100644 --- a/src/lib/netlist/plib/poptions.h +++ b/src/lib/netlist/plib/poptions.h @@ -15,7 +15,7 @@ #include "pstring.h" #include "plists.h" -PLIB_NAMESPACE_START() +namespace plib { /*************************************************************************** Options @@ -235,6 +235,6 @@ option::option(pstring ashort, pstring along, pstring help, bool has_argument, o parent->register_option(this); } -PLIB_NAMESPACE_END() +} #endif /* POPTIONS_H_ */ diff --git a/src/lib/netlist/plib/pparser.cpp b/src/lib/netlist/plib/pparser.cpp index dc0c99e8560..ad60a91b4b1 100644 --- a/src/lib/netlist/plib/pparser.cpp +++ b/src/lib/netlist/plib/pparser.cpp @@ -9,7 +9,7 @@ #include "pparser.h" -PLIB_NAMESPACE_START() +namespace plib { // ---------------------------------------------------------------------------------------- // A simple tokenizer // ---------------------------------------------------------------------------------------- @@ -470,4 +470,4 @@ postream & ppreprocessor::process_i(pistream &istrm, postream &ostrm) return ostrm; } -PLIB_NAMESPACE_END() +} diff --git a/src/lib/netlist/plib/pparser.h b/src/lib/netlist/plib/pparser.h index e5bd3617cda..dd08d781313 100644 --- a/src/lib/netlist/plib/pparser.h +++ b/src/lib/netlist/plib/pparser.h @@ -13,7 +13,7 @@ #include "plists.h" #include "pstream.h" -PLIB_NAMESPACE_START() +namespace plib { class ptokenizer { @@ -197,6 +197,6 @@ private: int m_lineno; }; -PLIB_NAMESPACE_END() +} #endif /* PPARSER_H_ */ diff --git a/src/lib/netlist/plib/pstate.cpp b/src/lib/netlist/plib/pstate.cpp index ad477d39285..bd16ee172e2 100644 --- a/src/lib/netlist/plib/pstate.cpp +++ b/src/lib/netlist/plib/pstate.cpp @@ -7,7 +7,7 @@ #include "pstate.h" -PLIB_NAMESPACE_START() +namespace plib { pstate_manager_t::pstate_manager_t() { @@ -77,4 +77,4 @@ template<> ATTR_COLD void pstate_manager_t::save_item(pstate_callback_t &state, state.register_state(*this, stname); } -PLIB_NAMESPACE_END() +} diff --git a/src/lib/netlist/plib/pstate.h b/src/lib/netlist/plib/pstate.h index 5432c37f327..846bad2cc68 100644 --- a/src/lib/netlist/plib/pstate.h +++ b/src/lib/netlist/plib/pstate.h @@ -68,7 +68,7 @@ NETLIST_SAVE_TYPE(UINT16, DT_INT16); NETLIST_SAVE_TYPE(INT16, DT_INT16); //NETLIST_SAVE_TYPE(std::size_t, DT_INT64); -PLIB_NAMESPACE_START() +namespace plib { class pstate_manager_t; @@ -187,6 +187,6 @@ public: } }; -PLIB_NAMESPACE_END() +} #endif /* PSTATE_H_ */ diff --git a/src/lib/netlist/plib/pstream.cpp b/src/lib/netlist/plib/pstream.cpp index dd3713499d5..8b09f58fc03 100644 --- a/src/lib/netlist/plib/pstream.cpp +++ b/src/lib/netlist/plib/pstream.cpp @@ -13,7 +13,7 @@ #include "pstream.h" #include "palloc.h" -PLIB_NAMESPACE_START() +namespace plib { // ----------------------------------------------------------------------------- // pistream: input stream @@ -363,4 +363,4 @@ pstream::pos_type pomemstream::vtell() return m_pos; } -PLIB_NAMESPACE_END() +} diff --git a/src/lib/netlist/plib/pstream.h b/src/lib/netlist/plib/pstream.h index b0a5c0379da..9da07105df6 100644 --- a/src/lib/netlist/plib/pstream.h +++ b/src/lib/netlist/plib/pstream.h @@ -16,7 +16,7 @@ #include "palloc.h" #include "pfmtlog.h" -PLIB_NAMESPACE_START() +namespace plib { // ----------------------------------------------------------------------------- // pstream: things common to all streams @@ -377,6 +377,6 @@ private: postream &m_strm; }; -PLIB_NAMESPACE_END() +} #endif /* PSTREAM_H_ */ diff --git a/src/lib/netlist/plib/ptypes.h b/src/lib/netlist/plib/ptypes.h index a747dc9e8d7..06246846d0e 100644 --- a/src/lib/netlist/plib/ptypes.h +++ b/src/lib/netlist/plib/ptypes.h @@ -11,7 +11,7 @@ #include "pconfig.h" #include "pstring.h" -PLIB_NAMESPACE_START() +namespace plib { //============================================================ // penum - strongly typed enumeration @@ -76,7 +76,7 @@ protected: } }; -PLIB_NAMESPACE_END() +} #define P_ENUM(ename, ...) \ struct ename : public plib::enum_base { \ From ba61c84ca653bea37be5961e2afee8b69a9b96cb Mon Sep 17 00:00:00 2001 From: couriersud Date: Fri, 27 May 2016 17:55:57 +0200 Subject: [PATCH 06/44] Remove namespace macros. Use explicit namespace declarations. (nw) --- src/lib/netlist/analog/nld_bjt.cpp | 8 ++++++-- src/lib/netlist/analog/nld_bjt.h | 8 ++++++-- src/lib/netlist/analog/nld_fourterm.cpp | 8 ++++++-- src/lib/netlist/analog/nld_fourterm.h | 8 ++++++-- src/lib/netlist/analog/nld_opamps.cpp | 8 ++++++-- src/lib/netlist/analog/nld_opamps.h | 8 ++++++-- src/lib/netlist/analog/nld_switches.cpp | 8 ++++++-- src/lib/netlist/analog/nld_switches.h | 8 ++++++-- src/lib/netlist/analog/nld_twoterm.cpp | 8 ++++++-- src/lib/netlist/analog/nld_twoterm.h | 8 ++++++-- src/lib/netlist/devices/net_lib.cpp | 8 ++++++-- src/lib/netlist/devices/nld_4020.cpp | 8 ++++++-- src/lib/netlist/devices/nld_4020.h | 8 ++++++-- src/lib/netlist/devices/nld_4066.cpp | 8 ++++++-- src/lib/netlist/devices/nld_4066.h | 8 ++++++-- src/lib/netlist/devices/nld_74107.cpp | 8 ++++++-- src/lib/netlist/devices/nld_74107.h | 8 ++++++-- src/lib/netlist/devices/nld_74123.cpp | 8 ++++++-- src/lib/netlist/devices/nld_74123.h | 8 ++++++-- src/lib/netlist/devices/nld_74153.cpp | 8 ++++++-- src/lib/netlist/devices/nld_74153.h | 8 ++++++-- src/lib/netlist/devices/nld_74175.cpp | 8 ++++++-- src/lib/netlist/devices/nld_74175.h | 8 ++++++-- src/lib/netlist/devices/nld_74192.cpp | 8 ++++++-- src/lib/netlist/devices/nld_74192.h | 8 ++++++-- src/lib/netlist/devices/nld_74193.cpp | 8 ++++++-- src/lib/netlist/devices/nld_74193.h | 8 ++++++-- src/lib/netlist/devices/nld_74279.cpp | 8 ++++++-- src/lib/netlist/devices/nld_74279.h | 8 ++++++-- src/lib/netlist/devices/nld_7448.cpp | 8 ++++++-- src/lib/netlist/devices/nld_7448.h | 8 ++++++-- src/lib/netlist/devices/nld_7450.cpp | 8 ++++++-- src/lib/netlist/devices/nld_7450.h | 8 ++++++-- src/lib/netlist/devices/nld_7474.cpp | 8 ++++++-- src/lib/netlist/devices/nld_7474.h | 8 ++++++-- src/lib/netlist/devices/nld_7483.cpp | 8 ++++++-- src/lib/netlist/devices/nld_7483.h | 8 ++++++-- src/lib/netlist/devices/nld_7490.cpp | 8 ++++++-- src/lib/netlist/devices/nld_7490.h | 8 ++++++-- src/lib/netlist/devices/nld_7493.cpp | 8 ++++++-- src/lib/netlist/devices/nld_7493.h | 8 ++++++-- src/lib/netlist/devices/nld_74ls629.cpp | 8 ++++++-- src/lib/netlist/devices/nld_74ls629.h | 8 ++++++-- src/lib/netlist/devices/nld_82S16.cpp | 8 ++++++-- src/lib/netlist/devices/nld_82S16.h | 8 ++++++-- src/lib/netlist/devices/nld_9310.cpp | 8 ++++++-- src/lib/netlist/devices/nld_9310.h | 8 ++++++-- src/lib/netlist/devices/nld_9312.cpp | 8 ++++++-- src/lib/netlist/devices/nld_9312.h | 8 ++++++-- src/lib/netlist/devices/nld_9316.cpp | 8 ++++++-- src/lib/netlist/devices/nld_9316.h | 8 ++++++-- src/lib/netlist/devices/nld_cmos.h | 8 ++++++-- src/lib/netlist/devices/nld_legacy.cpp | 8 ++++++-- src/lib/netlist/devices/nld_legacy.h | 8 ++++++-- src/lib/netlist/devices/nld_log.cpp | 8 ++++++-- src/lib/netlist/devices/nld_log.h | 8 ++++++-- src/lib/netlist/devices/nld_mm5837.cpp | 8 ++++++-- src/lib/netlist/devices/nld_mm5837.h | 8 ++++++-- src/lib/netlist/devices/nld_ne555.cpp | 8 ++++++-- src/lib/netlist/devices/nld_ne555.h | 8 ++++++-- src/lib/netlist/devices/nld_r2r_dac.cpp | 8 ++++++-- src/lib/netlist/devices/nld_r2r_dac.h | 8 ++++++-- src/lib/netlist/devices/nld_system.cpp | 8 ++++++-- src/lib/netlist/devices/nld_system.h | 8 ++++++-- src/lib/netlist/devices/nld_truthtable.cpp | 8 ++++++-- src/lib/netlist/devices/nld_truthtable.h | 8 ++++++-- src/lib/netlist/nl_base.cpp | 8 ++++++-- src/lib/netlist/nl_base.h | 3 --- src/lib/netlist/solver/nld_matrix_solver.h | 8 ++++++-- src/lib/netlist/solver/nld_ms_direct.h | 8 ++++++-- src/lib/netlist/solver/nld_ms_direct1.h | 8 ++++++-- src/lib/netlist/solver/nld_ms_direct2.h | 8 ++++++-- src/lib/netlist/solver/nld_ms_direct_lu.h | 8 ++++++-- src/lib/netlist/solver/nld_ms_gcr.h | 8 ++++++-- src/lib/netlist/solver/nld_ms_gmres.h | 8 ++++++-- src/lib/netlist/solver/nld_ms_sm.h | 8 ++++++-- src/lib/netlist/solver/nld_ms_sor.h | 8 ++++++-- src/lib/netlist/solver/nld_ms_sor_mat.h | 8 ++++++-- src/lib/netlist/solver/nld_ms_w.h | 8 ++++++-- src/lib/netlist/solver/nld_solver.cpp | 8 ++++++-- src/lib/netlist/solver/nld_solver.h | 8 ++++++-- 81 files changed, 480 insertions(+), 163 deletions(-) diff --git a/src/lib/netlist/analog/nld_bjt.cpp b/src/lib/netlist/analog/nld_bjt.cpp index 0252831cb4b..a2fcc817371 100644 --- a/src/lib/netlist/analog/nld_bjt.cpp +++ b/src/lib/netlist/analog/nld_bjt.cpp @@ -9,7 +9,10 @@ #include "analog/nld_bjt.h" #include "nl_setup.h" -NETLIB_NAMESPACE_DEVICES_START() +namespace netlist +{ + namespace devices + { class diode { @@ -187,4 +190,5 @@ NETLIB_UPDATE_PARAM(QBJT_EB) m_gD_BC.set_param(IS / m_alpha_r, NR, netlist().gmin()); } -NETLIB_NAMESPACE_DEVICES_END() + } //namespace devices +} // namespace netlist diff --git a/src/lib/netlist/analog/nld_bjt.h b/src/lib/netlist/analog/nld_bjt.h index b829e8a22b2..f61295ab14c 100644 --- a/src/lib/netlist/analog/nld_bjt.h +++ b/src/lib/netlist/analog/nld_bjt.h @@ -24,7 +24,10 @@ NETDEV_PARAMI(name, MODEL, model) -NETLIB_NAMESPACE_DEVICES_START() +namespace netlist +{ + namespace devices + { // ----------------------------------------------------------------------------- // nld_Q - Base classes @@ -195,6 +198,7 @@ protected: private: }; -NETLIB_NAMESPACE_DEVICES_END() + } //namespace devices +} // namespace netlist #endif /* NLD_BJT_H_ */ diff --git a/src/lib/netlist/analog/nld_fourterm.cpp b/src/lib/netlist/analog/nld_fourterm.cpp index 2f8eb3c0e6f..8fda95bc0f6 100644 --- a/src/lib/netlist/analog/nld_fourterm.cpp +++ b/src/lib/netlist/analog/nld_fourterm.cpp @@ -9,7 +9,10 @@ #include "nld_fourterm.h" #include "nl_setup.h" -NETLIB_NAMESPACE_DEVICES_START() +namespace netlist +{ + namespace devices + { // ---------------------------------------------------------------------------------------- // nld_VCCS @@ -117,4 +120,5 @@ NETLIB_RESET(VCVS) m_ON2.set(NL_FCONST(1.0) / m_RO.Value()); } -NETLIB_NAMESPACE_DEVICES_END() + } //namespace devices +} // namespace netlist diff --git a/src/lib/netlist/analog/nld_fourterm.h b/src/lib/netlist/analog/nld_fourterm.h index 7b577fc1bde..7b9a86b405b 100644 --- a/src/lib/netlist/analog/nld_fourterm.h +++ b/src/lib/netlist/analog/nld_fourterm.h @@ -28,7 +28,10 @@ #define LVCCS(name) \ NET_REGISTER_DEV(LVCCS, name) -NETLIB_NAMESPACE_DEVICES_START() +namespace netlist +{ + namespace devices + { // ---------------------------------------------------------------------------------------- // nld_VCCS @@ -227,7 +230,8 @@ protected: }; -NETLIB_NAMESPACE_DEVICES_END() + } //namespace devices +} // namespace netlist #endif /* NLD_FOURTERM_H_ */ diff --git a/src/lib/netlist/analog/nld_opamps.cpp b/src/lib/netlist/analog/nld_opamps.cpp index 0ffd5d56a9c..60eccba7457 100644 --- a/src/lib/netlist/analog/nld_opamps.cpp +++ b/src/lib/netlist/analog/nld_opamps.cpp @@ -38,7 +38,10 @@ NETLIST_START(opamp_lm3900) NETLIST_END() -NETLIB_NAMESPACE_DEVICES_START() +namespace netlist +{ + namespace devices + { /* * Type = 0: Impedance changer @@ -113,4 +116,5 @@ NETLIB_DEVICE_WITH_PARAMS(OPAMPx, ); */ -NETLIB_NAMESPACE_DEVICES_END() + } //namespace devices +} // namespace netlist diff --git a/src/lib/netlist/analog/nld_opamps.h b/src/lib/netlist/analog/nld_opamps.h index 0e7868de8af..2faab7f1312 100644 --- a/src/lib/netlist/analog/nld_opamps.h +++ b/src/lib/netlist/analog/nld_opamps.h @@ -32,7 +32,10 @@ NETLIST_EXTERNAL(opamp_lm3900) -NETLIB_NAMESPACE_DEVICES_START() +namespace netlist +{ + namespace devices + { NETLIB_OBJECT(OPAMP) { @@ -121,6 +124,7 @@ private: unsigned m_type; }; -NETLIB_NAMESPACE_DEVICES_END() + } //namespace devices +} // namespace netlist #endif /* NLD_OPAMPS_H_ */ diff --git a/src/lib/netlist/analog/nld_switches.cpp b/src/lib/netlist/analog/nld_switches.cpp index f3001e778ef..6c887aad569 100644 --- a/src/lib/netlist/analog/nld_switches.cpp +++ b/src/lib/netlist/analog/nld_switches.cpp @@ -11,7 +11,10 @@ #define R_OFF (1.0 / netlist().gmin()) #define R_ON 0.01 -NETLIB_NAMESPACE_DEVICES_START() +namespace netlist +{ + namespace devices + { // ---------------------------------------------------------------------------------------- // SWITCH @@ -74,4 +77,5 @@ NETLIB_UPDATE_PARAM(switch2) update(); } -NETLIB_NAMESPACE_DEVICES_END() + } //namespace devices +} // namespace netlist diff --git a/src/lib/netlist/analog/nld_switches.h b/src/lib/netlist/analog/nld_switches.h index 4f908b8564d..5355b5e13bf 100644 --- a/src/lib/netlist/analog/nld_switches.h +++ b/src/lib/netlist/analog/nld_switches.h @@ -27,7 +27,10 @@ // Devices ... // ---------------------------------------------------------------------------------------- -NETLIB_NAMESPACE_DEVICES_START() +namespace netlist +{ + namespace devices + { NETLIB_OBJECT(switch1) { @@ -71,6 +74,7 @@ NETLIB_OBJECT(switch2) param_int_t m_POS; }; -NETLIB_NAMESPACE_DEVICES_END() + } //namespace devices +} // namespace netlist #endif /* NLD_SWITCHES_H_ */ diff --git a/src/lib/netlist/analog/nld_twoterm.cpp b/src/lib/netlist/analog/nld_twoterm.cpp index 9c8b1ba9d21..e6294fda0fb 100644 --- a/src/lib/netlist/analog/nld_twoterm.cpp +++ b/src/lib/netlist/analog/nld_twoterm.cpp @@ -10,7 +10,10 @@ #include "nld_twoterm.h" -NETLIB_NAMESPACE_DEVICES_START() +namespace netlist +{ + namespace devices + { // ---------------------------------------------------------------------------------------- // generic_diode @@ -172,4 +175,5 @@ NETLIB_UPDATE(CS) NETLIB_NAME(twoterm)::update(); } -NETLIB_NAMESPACE_DEVICES_END() + } //namespace devices +} // namespace netlist diff --git a/src/lib/netlist/analog/nld_twoterm.h b/src/lib/netlist/analog/nld_twoterm.h index 029cc9e2bde..fed385fcedb 100644 --- a/src/lib/netlist/analog/nld_twoterm.h +++ b/src/lib/netlist/analog/nld_twoterm.h @@ -94,7 +94,10 @@ // Implementation // ----------------------------------------------------------------------------- -NETLIB_NAMESPACE_DEVICES_START() +namespace netlist +{ + namespace devices + { // ----------------------------------------------------------------------------- // nld_twoterm @@ -446,6 +449,7 @@ protected: }; -NETLIB_NAMESPACE_DEVICES_END() + } //namespace devices +} // namespace netlist #endif /* NLD_TWOTERM_H_ */ diff --git a/src/lib/netlist/devices/net_lib.cpp b/src/lib/netlist/devices/net_lib.cpp index fe0a2d087ca..b56da402a22 100644 --- a/src/lib/netlist/devices/net_lib.cpp +++ b/src/lib/netlist/devices/net_lib.cpp @@ -61,7 +61,10 @@ NETLIST_END() #define ENTRY1(nic, name, defparam) factory.register_device( # name, xstr(nic), defparam ); #define ENTRY(nic, name, defparam) ENTRY1(NETLIB_NAME(nic), name, defparam) -NETLIB_NAMESPACE_DEVICES_START() +namespace netlist +{ + namespace devices + { void initialize_factory(factory_list_t &factory) { @@ -148,7 +151,8 @@ void initialize_factory(factory_list_t &factory) ENTRY(MM5837_dip, MM5837_DIP, "-") } -NETLIB_NAMESPACE_DEVICES_END() + } //namespace devices +} // namespace netlist namespace netlist { diff --git a/src/lib/netlist/devices/nld_4020.cpp b/src/lib/netlist/devices/nld_4020.cpp index db39a636e16..239dfb43844 100644 --- a/src/lib/netlist/devices/nld_4020.cpp +++ b/src/lib/netlist/devices/nld_4020.cpp @@ -7,7 +7,10 @@ #include "nld_4020.h" -NETLIB_NAMESPACE_DEVICES_START() +namespace netlist +{ + namespace devices + { NETLIB_UPDATE(CD4020_sub) @@ -50,4 +53,5 @@ inline NETLIB_FUNC_VOID(CD4020_sub, update_outputs, (const UINT16 cnt)) OUTLOGIC(m_Q[i], (cnt >> i) & 1, out_delayQn[i]); } -NETLIB_NAMESPACE_DEVICES_END() + } //namespace devices +} // namespace netlist diff --git a/src/lib/netlist/devices/nld_4020.h b/src/lib/netlist/devices/nld_4020.h index 0ca252222b9..b6b097e92c5 100644 --- a/src/lib/netlist/devices/nld_4020.h +++ b/src/lib/netlist/devices/nld_4020.h @@ -41,7 +41,10 @@ #define CD4020(name) \ NET_REGISTER_DEV(CD4020, name) -NETLIB_NAMESPACE_DEVICES_START() +namespace netlist +{ + namespace devices + { NETLIB_OBJECT(CD4020_sub) { @@ -118,6 +121,7 @@ private: logic_input_t m_RESET; }; -NETLIB_NAMESPACE_DEVICES_END() + } //namespace devices +} // namespace netlist #endif /* NLD_4020_H_ */ diff --git a/src/lib/netlist/devices/nld_4066.cpp b/src/lib/netlist/devices/nld_4066.cpp index 890409bef92..a5958f908e1 100644 --- a/src/lib/netlist/devices/nld_4066.cpp +++ b/src/lib/netlist/devices/nld_4066.cpp @@ -7,7 +7,10 @@ #include "nld_4066.h" -NETLIB_NAMESPACE_DEVICES_START() +namespace netlist +{ + namespace devices + { NETLIB_UPDATE(CD4066_GATE) { @@ -44,4 +47,5 @@ NETLIB_UPDATE(CD4066_GATE) } -NETLIB_NAMESPACE_DEVICES_END() + } //namespace devices +} // namespace netlist diff --git a/src/lib/netlist/devices/nld_4066.h b/src/lib/netlist/devices/nld_4066.h index 87772264136..697e1e739f5 100644 --- a/src/lib/netlist/devices/nld_4066.h +++ b/src/lib/netlist/devices/nld_4066.h @@ -30,7 +30,10 @@ #define CD4066_GATE(name) \ NET_REGISTER_DEV(CD4066_GATE, name) -NETLIB_NAMESPACE_DEVICES_START() +namespace netlist +{ + namespace devices + { NETLIB_OBJECT(CD4066_GATE) { @@ -54,6 +57,7 @@ public: param_double_t m_base_r; }; -NETLIB_NAMESPACE_DEVICES_END() + } //namespace devices +} // namespace netlist #endif /* NLD_4066_H_ */ diff --git a/src/lib/netlist/devices/nld_74107.cpp b/src/lib/netlist/devices/nld_74107.cpp index 399f596d91d..7176daa8c71 100644 --- a/src/lib/netlist/devices/nld_74107.cpp +++ b/src/lib/netlist/devices/nld_74107.cpp @@ -7,7 +7,10 @@ #include "nld_74107.h" -NETLIB_NAMESPACE_DEVICES_START() +namespace netlist +{ + namespace devices + { NETLIB_RESET(74107Asub) { @@ -77,4 +80,5 @@ NETLIB_UPDATE(74107A) } -NETLIB_NAMESPACE_DEVICES_END() + } //namespace devices +} // namespace netlist diff --git a/src/lib/netlist/devices/nld_74107.h b/src/lib/netlist/devices/nld_74107.h index 90c632314af..6bcdb21dcf6 100644 --- a/src/lib/netlist/devices/nld_74107.h +++ b/src/lib/netlist/devices/nld_74107.h @@ -74,7 +74,10 @@ #define TTL_74107_DIP(name) \ NET_REGISTER_DEV(TTL_74107_DIP, name) -NETLIB_NAMESPACE_DEVICES_START() +namespace netlist +{ + namespace devices + { NETLIB_OBJECT(74107Asub) { @@ -178,6 +181,7 @@ private: NETLIB_SUB(74107) m_2; }; -NETLIB_NAMESPACE_DEVICES_END() + } //namespace devices +} // namespace netlist #endif /* NLD_74107_H_ */ diff --git a/src/lib/netlist/devices/nld_74123.cpp b/src/lib/netlist/devices/nld_74123.cpp index 65a121104bc..ad5db3d104e 100644 --- a/src/lib/netlist/devices/nld_74123.cpp +++ b/src/lib/netlist/devices/nld_74123.cpp @@ -10,7 +10,10 @@ #define R_OFF (1E20) #define R_ON (m_RI.Value()) -NETLIB_NAMESPACE_DEVICES_START() +namespace netlist +{ + namespace devices + { NETLIB_UPDATE(74123) { @@ -138,4 +141,5 @@ NETLIB_RESET(4538_dip) m_2.do_reset(); } -NETLIB_NAMESPACE_DEVICES_END() + } //namespace devices +} // namespace netlist diff --git a/src/lib/netlist/devices/nld_74123.h b/src/lib/netlist/devices/nld_74123.h index 696e917abd5..26a7638c11a 100644 --- a/src/lib/netlist/devices/nld_74123.h +++ b/src/lib/netlist/devices/nld_74123.h @@ -56,7 +56,10 @@ #define TTL_74123(name) \ NET_REGISTER_DEV(TTL_74123, name) -NETLIB_NAMESPACE_DEVICES_START() +namespace netlist +{ + namespace devices + { NETLIB_OBJECT(74123) { @@ -243,7 +246,8 @@ private: NETLIB_SUB(74123) m_2; }; -NETLIB_NAMESPACE_DEVICES_END() + } //namespace devices +} // namespace netlist #endif /* NLD_74123_H_ */ diff --git a/src/lib/netlist/devices/nld_74153.cpp b/src/lib/netlist/devices/nld_74153.cpp index d4b40293a25..bd11027310f 100644 --- a/src/lib/netlist/devices/nld_74153.cpp +++ b/src/lib/netlist/devices/nld_74153.cpp @@ -7,7 +7,10 @@ #include "nld_74153.h" -NETLIB_NAMESPACE_DEVICES_START() +namespace netlist +{ + namespace devices + { /* FIXME: timing is not 100% accurate, Strobe and Select inputs have a * slightly longer timing. @@ -49,4 +52,5 @@ NETLIB_UPDATE(74153_dip) m_2.do_update(); } -NETLIB_NAMESPACE_DEVICES_END() + } //namespace devices +} // namespace netlist diff --git a/src/lib/netlist/devices/nld_74153.h b/src/lib/netlist/devices/nld_74153.h index d4059bbb384..c185c971258 100644 --- a/src/lib/netlist/devices/nld_74153.h +++ b/src/lib/netlist/devices/nld_74153.h @@ -60,7 +60,10 @@ #define TTL_74153_DIP(name) \ NET_REGISTER_DEV(TTL_74153_DIP, name) -NETLIB_NAMESPACE_DEVICES_START() +namespace netlist +{ + namespace devices + { NETLIB_OBJECT(74153sub) { @@ -149,6 +152,7 @@ protected: logic_input_t m_B; }; -NETLIB_NAMESPACE_DEVICES_END() + } //namespace devices +} // namespace netlist #endif /* NLD_74153_H_ */ diff --git a/src/lib/netlist/devices/nld_74175.cpp b/src/lib/netlist/devices/nld_74175.cpp index 642863f0859..dc600e5ac65 100644 --- a/src/lib/netlist/devices/nld_74175.cpp +++ b/src/lib/netlist/devices/nld_74175.cpp @@ -7,7 +7,10 @@ #include "nld_74175.h" -NETLIB_NAMESPACE_DEVICES_START() +namespace netlist +{ + namespace devices + { static const netlist_time delay[2] = { NLTIME_FROM_NS(25), NLTIME_FROM_NS(25) }; static const netlist_time delay_clear[2] = { NLTIME_FROM_NS(40), NLTIME_FROM_NS(25) }; @@ -62,4 +65,5 @@ NETLIB_RESET(74175) //m_sub.do_reset(); } -NETLIB_NAMESPACE_DEVICES_END() + } //namespace devices +} // namespace netlist diff --git a/src/lib/netlist/devices/nld_74175.h b/src/lib/netlist/devices/nld_74175.h index ca796f65d83..5c7b90ea5c5 100644 --- a/src/lib/netlist/devices/nld_74175.h +++ b/src/lib/netlist/devices/nld_74175.h @@ -43,7 +43,10 @@ #define TTL_74175_DIP(name) \ NET_REGISTER_DEV(TTL_74175_DIP, name) -NETLIB_NAMESPACE_DEVICES_START() +namespace netlist +{ + namespace devices + { NETLIB_OBJECT(74175_sub) { @@ -137,6 +140,7 @@ NETLIB_OBJECT_DERIVED(74175_dip, 74175) } }; -NETLIB_NAMESPACE_DEVICES_END() + } //namespace devices +} // namespace netlist #endif /* NLD_74175_H_ */ diff --git a/src/lib/netlist/devices/nld_74192.cpp b/src/lib/netlist/devices/nld_74192.cpp index 138c519a4c1..f6ba9e3c46a 100644 --- a/src/lib/netlist/devices/nld_74192.cpp +++ b/src/lib/netlist/devices/nld_74192.cpp @@ -9,7 +9,10 @@ #include "nld_74192.h" -NETLIB_NAMESPACE_DEVICES_START() +namespace netlist +{ + namespace devices + { NETLIB_RESET(74192) { @@ -72,4 +75,5 @@ NETLIB_UPDATE(74192) OUTLOGIC(m_CARRYQ, tCarry, NLTIME_FROM_NS(20)); //FIXME } -NETLIB_NAMESPACE_DEVICES_END() + } //namespace devices +} // namespace netlist diff --git a/src/lib/netlist/devices/nld_74192.h b/src/lib/netlist/devices/nld_74192.h index 34f02845b05..9cc020b0373 100644 --- a/src/lib/netlist/devices/nld_74192.h +++ b/src/lib/netlist/devices/nld_74192.h @@ -38,7 +38,10 @@ #define TTL_74192_DIP(name) \ NET_REGISTER_DEV(TTL_74192_DIP, name) -NETLIB_NAMESPACE_DEVICES_START() +namespace netlist +{ + namespace devices + { NETLIB_OBJECT(74192) { @@ -107,6 +110,7 @@ NETLIB_OBJECT_DERIVED(74192_dip, 74192) } }; -NETLIB_NAMESPACE_DEVICES_END() + } //namespace devices +} // namespace netlist #endif /* NLD_74192_H_ */ diff --git a/src/lib/netlist/devices/nld_74193.cpp b/src/lib/netlist/devices/nld_74193.cpp index d38f52ffcb9..27cd9337f80 100644 --- a/src/lib/netlist/devices/nld_74193.cpp +++ b/src/lib/netlist/devices/nld_74193.cpp @@ -9,7 +9,10 @@ #include "nld_74193.h" -NETLIB_NAMESPACE_DEVICES_START() +namespace netlist +{ + namespace devices + { NETLIB_RESET(74193) { @@ -74,4 +77,5 @@ NETLIB_UPDATE(74193) } -NETLIB_NAMESPACE_DEVICES_END() + } //namespace devices +} // namespace netlist diff --git a/src/lib/netlist/devices/nld_74193.h b/src/lib/netlist/devices/nld_74193.h index 729d3c91290..919ddf920ef 100644 --- a/src/lib/netlist/devices/nld_74193.h +++ b/src/lib/netlist/devices/nld_74193.h @@ -34,7 +34,10 @@ #define TTL_74193_DIP(name) \ NET_REGISTER_DEV(TTL_74193_DIP, name) -NETLIB_NAMESPACE_DEVICES_START() +namespace netlist +{ + namespace devices + { NETLIB_OBJECT(74193) { @@ -109,6 +112,7 @@ NETLIB_OBJECT_DERIVED(74193_dip, 74193) } }; -NETLIB_NAMESPACE_DEVICES_END() + } //namespace devices +} // namespace netlist #endif /* NLD_74193_H_ */ diff --git a/src/lib/netlist/devices/nld_74279.cpp b/src/lib/netlist/devices/nld_74279.cpp index 417f3edcae3..85bbed08e94 100644 --- a/src/lib/netlist/devices/nld_74279.cpp +++ b/src/lib/netlist/devices/nld_74279.cpp @@ -7,7 +7,10 @@ #include "nld_74279.h" -NETLIB_NAMESPACE_DEVICES_START() +namespace netlist +{ + namespace devices + { nld_74279A::truthtable_t nld_74279A::m_ttbl; nld_74279B::truthtable_t nld_74279B::m_ttbl; @@ -136,4 +139,5 @@ NETLIB_RESET(74279_dip) //m_4.do_reset(); } -NETLIB_NAMESPACE_DEVICES_END() + } //namespace devices +} // namespace netlist diff --git a/src/lib/netlist/devices/nld_74279.h b/src/lib/netlist/devices/nld_74279.h index 2e298d62dc6..159b37cd083 100644 --- a/src/lib/netlist/devices/nld_74279.h +++ b/src/lib/netlist/devices/nld_74279.h @@ -41,7 +41,10 @@ #define TTL_74279_DIP(name) \ NET_REGISTER_DEV(TTL_74279_DIP, name) -NETLIB_NAMESPACE_DEVICES_START() +namespace netlist +{ + namespace devices + { #if 0 NETLIB_TRUTHTABLE(74279A, 2, 1, 1); @@ -91,6 +94,7 @@ protected: NETLIB_SUB(74279A) m_4; }; -NETLIB_NAMESPACE_DEVICES_END() + } //namespace devices +} // namespace netlist #endif /* NLD_74279_H_ */ diff --git a/src/lib/netlist/devices/nld_7448.cpp b/src/lib/netlist/devices/nld_7448.cpp index 0f9f81a4ffd..579f407876b 100644 --- a/src/lib/netlist/devices/nld_7448.cpp +++ b/src/lib/netlist/devices/nld_7448.cpp @@ -7,7 +7,10 @@ #include "nld_7448.h" -NETLIB_NAMESPACE_DEVICES_START() +namespace netlist +{ + namespace devices + { #if (USE_TRUTHTABLE_7448 && USE_TRUTHTABLE) nld_7448::truthtable_t nld_7448::m_ttbl; @@ -137,4 +140,5 @@ const UINT8 NETLIB_NAME(7448_sub)::tab7448[16][7] = }; #endif -NETLIB_NAMESPACE_DEVICES_END() + } //namespace devices +} // namespace netlist diff --git a/src/lib/netlist/devices/nld_7448.h b/src/lib/netlist/devices/nld_7448.h index f5280daf550..6803891990d 100644 --- a/src/lib/netlist/devices/nld_7448.h +++ b/src/lib/netlist/devices/nld_7448.h @@ -40,7 +40,10 @@ #define TTL_7448_DIP(name) \ NET_REGISTER_DEV(TTL_7448_DIP, name) -NETLIB_NAMESPACE_DEVICES_START() +namespace netlist +{ + namespace devices + { /* * FIXME: Using truthtable is a lot slower than the explicit device @@ -151,6 +154,7 @@ NETLIB_OBJECT_DERIVED(7448_dip, 7448) } }; -NETLIB_NAMESPACE_DEVICES_END() + } //namespace devices +} // namespace netlist #endif /* NLD_7448_H_ */ diff --git a/src/lib/netlist/devices/nld_7450.cpp b/src/lib/netlist/devices/nld_7450.cpp index 558abc62644..02d2df7776e 100644 --- a/src/lib/netlist/devices/nld_7450.cpp +++ b/src/lib/netlist/devices/nld_7450.cpp @@ -7,7 +7,10 @@ #include "nld_7450.h" -NETLIB_NAMESPACE_DEVICES_START() +namespace netlist +{ + namespace devices + { NETLIB_UPDATE(7450) { @@ -43,4 +46,5 @@ NETLIB_UPDATE(7450) } -NETLIB_NAMESPACE_DEVICES_END() + } //namespace devices +} // namespace netlist diff --git a/src/lib/netlist/devices/nld_7450.h b/src/lib/netlist/devices/nld_7450.h index ded207bc070..ace80bec0b6 100644 --- a/src/lib/netlist/devices/nld_7450.h +++ b/src/lib/netlist/devices/nld_7450.h @@ -36,7 +36,10 @@ #define TTL_7450_DIP(name) \ NET_REGISTER_DEV(TTL_7450_DIP, name) -NETLIB_NAMESPACE_DEVICES_START() +namespace netlist +{ + namespace devices + { NETLIB_OBJECT(7450) { @@ -89,6 +92,7 @@ NETLIB_OBJECT(7450_dip) NETLIB_SUB(7450) m_2; }; -NETLIB_NAMESPACE_DEVICES_END() + } //namespace devices +} // namespace netlist #endif /* NLD_7450_H_ */ diff --git a/src/lib/netlist/devices/nld_7474.cpp b/src/lib/netlist/devices/nld_7474.cpp index d1f2e11cd8a..01fa4008023 100644 --- a/src/lib/netlist/devices/nld_7474.cpp +++ b/src/lib/netlist/devices/nld_7474.cpp @@ -7,7 +7,10 @@ #include "nld_7474.h" -NETLIB_NAMESPACE_DEVICES_START() +namespace netlist +{ + namespace devices + { ATTR_HOT inline void NETLIB_NAME(7474sub)::newstate(const UINT8 stateQ, const UINT8 stateQQ) { @@ -78,4 +81,5 @@ NETLIB_UPDATE(7474_dip) //m_2.update_dev(); } -NETLIB_NAMESPACE_DEVICES_END() + } //namespace devices +} // namespace netlist diff --git a/src/lib/netlist/devices/nld_7474.h b/src/lib/netlist/devices/nld_7474.h index 918280f9966..ca9d59566ab 100644 --- a/src/lib/netlist/devices/nld_7474.h +++ b/src/lib/netlist/devices/nld_7474.h @@ -54,7 +54,10 @@ #define TTL_7474_DIP(name) \ NET_REGISTER_DEV(TTL_7474_DIP, name) -NETLIB_NAMESPACE_DEVICES_START() +namespace netlist +{ + namespace devices + { NETLIB_OBJECT(7474sub) { @@ -140,6 +143,7 @@ private: NETLIB_SUB(7474) m_2; }; -NETLIB_NAMESPACE_DEVICES_END() + } //namespace devices +} // namespace netlist #endif /* NLD_7474_H_ */ diff --git a/src/lib/netlist/devices/nld_7483.cpp b/src/lib/netlist/devices/nld_7483.cpp index 0657702e718..ec32d94f12c 100644 --- a/src/lib/netlist/devices/nld_7483.cpp +++ b/src/lib/netlist/devices/nld_7483.cpp @@ -7,7 +7,10 @@ #include "nld_7483.h" -NETLIB_NAMESPACE_DEVICES_START() +namespace netlist +{ + namespace devices + { NETLIB_RESET(7483) { @@ -32,4 +35,5 @@ NETLIB_UPDATE(7483) } } -NETLIB_NAMESPACE_DEVICES_END() + } //namespace devices +} // namespace netlist diff --git a/src/lib/netlist/devices/nld_7483.h b/src/lib/netlist/devices/nld_7483.h index a66876844e6..69961fb1d79 100644 --- a/src/lib/netlist/devices/nld_7483.h +++ b/src/lib/netlist/devices/nld_7483.h @@ -44,7 +44,10 @@ #define TTL_7483_DIP(name) \ NET_REGISTER_DEV(TTL_7483_DIP, name) -NETLIB_NAMESPACE_DEVICES_START() +namespace netlist +{ + namespace devices + { NETLIB_OBJECT(7483) { @@ -119,6 +122,7 @@ NETLIB_OBJECT_DERIVED(7483_dip, 7483) //NETLIB_UPDATEI(); }; -NETLIB_NAMESPACE_DEVICES_END() + } //namespace devices +} // namespace netlist #endif /* NLD_7483_H_ */ diff --git a/src/lib/netlist/devices/nld_7490.cpp b/src/lib/netlist/devices/nld_7490.cpp index a4120db28ba..e77a39f8dcc 100644 --- a/src/lib/netlist/devices/nld_7490.cpp +++ b/src/lib/netlist/devices/nld_7490.cpp @@ -7,7 +7,10 @@ #include "nld_7490.h" -NETLIB_NAMESPACE_DEVICES_START() +namespace netlist +{ + namespace devices + { NETLIB_RESET(7490) { @@ -63,4 +66,5 @@ NETLIB_FUNC_VOID(7490, update_outputs, (void)) OUTLOGIC(m_Q[i], (m_cnt >> i) & 1, delay[i]); } -NETLIB_NAMESPACE_DEVICES_END() + } //namespace devices +} // namespace netlist diff --git a/src/lib/netlist/devices/nld_7490.h b/src/lib/netlist/devices/nld_7490.h index c4a92f1b364..c9ac380ba64 100644 --- a/src/lib/netlist/devices/nld_7490.h +++ b/src/lib/netlist/devices/nld_7490.h @@ -69,7 +69,10 @@ #define TTL_7490_DIP(name) \ NET_REGISTER_DEV(TTL_7490_DIP, name) -NETLIB_NAMESPACE_DEVICES_START() +namespace netlist +{ + namespace devices + { NETLIB_OBJECT(7490) { @@ -138,6 +141,7 @@ NETLIB_OBJECT_DERIVED(7490_dip, 7490) } }; -NETLIB_NAMESPACE_DEVICES_END() + } //namespace devices +} // namespace netlist #endif /* NLD_7490_H_ */ diff --git a/src/lib/netlist/devices/nld_7493.cpp b/src/lib/netlist/devices/nld_7493.cpp index c83230a2a81..89c9cd477c1 100644 --- a/src/lib/netlist/devices/nld_7493.cpp +++ b/src/lib/netlist/devices/nld_7493.cpp @@ -8,7 +8,10 @@ #include "nld_7493.h" #include "nl_setup.h" -NETLIB_NAMESPACE_DEVICES_START() +namespace netlist +{ + namespace devices + { NETLIB_RESET(7493ff) @@ -51,4 +54,5 @@ NETLIB_UPDATE(7493) } } -NETLIB_NAMESPACE_DEVICES_END() + } //namespace devices +} // namespace netlist diff --git a/src/lib/netlist/devices/nld_7493.h b/src/lib/netlist/devices/nld_7493.h index 778e2358b2d..2829807a7b2 100644 --- a/src/lib/netlist/devices/nld_7493.h +++ b/src/lib/netlist/devices/nld_7493.h @@ -69,7 +69,10 @@ #define TTL_7493_DIP(name) \ NET_REGISTER_DEV(TTL_7493_DIP, name) -NETLIB_NAMESPACE_DEVICES_START() +namespace netlist +{ + namespace devices + { NETLIB_OBJECT(7493ff) { @@ -150,7 +153,8 @@ NETLIB_OBJECT_DERIVED(7493_dip, 7493) } }; -NETLIB_NAMESPACE_DEVICES_END() + } //namespace devices +} // namespace netlist #endif /* NLD_7493_H_ */ diff --git a/src/lib/netlist/devices/nld_74ls629.cpp b/src/lib/netlist/devices/nld_74ls629.cpp index ceadb3c2b0d..74fe87df669 100644 --- a/src/lib/netlist/devices/nld_74ls629.cpp +++ b/src/lib/netlist/devices/nld_74ls629.cpp @@ -42,7 +42,10 @@ #include "nld_74ls629.h" #include "nl_setup.h" -NETLIB_NAMESPACE_DEVICES_START() +namespace netlist +{ + namespace devices + { NETLIB_UPDATE(SN74LS629clk) { @@ -120,4 +123,5 @@ NETLIB_UPDATE(SN74LS629) } } -NETLIB_NAMESPACE_DEVICES_END() + } //namespace devices +} // namespace netlist diff --git a/src/lib/netlist/devices/nld_74ls629.h b/src/lib/netlist/devices/nld_74ls629.h index f0805f03681..b61ae9492f4 100644 --- a/src/lib/netlist/devices/nld_74ls629.h +++ b/src/lib/netlist/devices/nld_74ls629.h @@ -40,7 +40,10 @@ NETDEV_PARAMI(name, 1.CAP, p_cap1) \ NETDEV_PARAMI(name, 2.CAP, p_cap2) -NETLIB_NAMESPACE_DEVICES_START() +namespace netlist +{ + namespace devices + { NETLIB_OBJECT(SN74LS629clk) { @@ -155,7 +158,8 @@ private: NETLIB_SUB(SN74LS629) m_2; }; -NETLIB_NAMESPACE_DEVICES_END() + } //namespace devices +} // namespace netlist #endif /* NLD_74LS629_H_ */ diff --git a/src/lib/netlist/devices/nld_82S16.cpp b/src/lib/netlist/devices/nld_82S16.cpp index 84eceda8c80..4b198e14761 100644 --- a/src/lib/netlist/devices/nld_82S16.cpp +++ b/src/lib/netlist/devices/nld_82S16.cpp @@ -7,7 +7,10 @@ #include "nld_82S16.h" -NETLIB_NAMESPACE_DEVICES_START() +namespace netlist +{ + namespace devices + { // FIXME: timing! // FIXME: optimize device (separate address decoder!) @@ -45,4 +48,5 @@ NETLIB_RESET(82S16) } } -NETLIB_NAMESPACE_DEVICES_END() + } //namespace devices +} // namespace netlist diff --git a/src/lib/netlist/devices/nld_82S16.h b/src/lib/netlist/devices/nld_82S16.h index 769e2324964..62221961679 100644 --- a/src/lib/netlist/devices/nld_82S16.h +++ b/src/lib/netlist/devices/nld_82S16.h @@ -31,7 +31,10 @@ #define TTL_82S16_DIP(name) \ NET_REGISTER_DEV(TTL_82S16_DIP, name) -NETLIB_NAMESPACE_DEVICES_START() +namespace netlist +{ + namespace devices + { NETLIB_OBJECT(82S16) { @@ -99,6 +102,7 @@ NETLIB_OBJECT_DERIVED(82S16_dip, 82S16) } }; -NETLIB_NAMESPACE_DEVICES_END() + } //namespace devices +} // namespace netlist #endif /* NLD_82S16_H_ */ diff --git a/src/lib/netlist/devices/nld_9310.cpp b/src/lib/netlist/devices/nld_9310.cpp index fd4d6434479..faab8973a47 100644 --- a/src/lib/netlist/devices/nld_9310.cpp +++ b/src/lib/netlist/devices/nld_9310.cpp @@ -9,7 +9,10 @@ #define MAXCNT 9 -NETLIB_NAMESPACE_DEVICES_START() +namespace netlist +{ + namespace devices + { NETLIB_RESET(9310) { @@ -147,4 +150,5 @@ inline NETLIB_FUNC_VOID(9310_sub, update_outputs, (const UINT8 cnt)) #endif } -NETLIB_NAMESPACE_DEVICES_END() + } //namespace devices +} // namespace netlist diff --git a/src/lib/netlist/devices/nld_9310.h b/src/lib/netlist/devices/nld_9310.h index 3c4fbb22847..eddc1337372 100644 --- a/src/lib/netlist/devices/nld_9310.h +++ b/src/lib/netlist/devices/nld_9310.h @@ -62,7 +62,10 @@ #define TTL_9310_DIP(name) \ NET_REGISTER_DEV(TTL_9310_DIP, name) -NETLIB_NAMESPACE_DEVICES_START() +namespace netlist +{ + namespace devices + { NETLIB_OBJECT(9310_subABCD) { @@ -191,6 +194,7 @@ NETLIB_OBJECT_DERIVED(9310_dip, 9310) // register_subalias("16", ); -. VCC } }; -NETLIB_NAMESPACE_DEVICES_END() + } //namespace devices +} // namespace netlist #endif /* NLD_9310_H_ */ diff --git a/src/lib/netlist/devices/nld_9312.cpp b/src/lib/netlist/devices/nld_9312.cpp index 1c5798f9286..c7a4dff4cd6 100644 --- a/src/lib/netlist/devices/nld_9312.cpp +++ b/src/lib/netlist/devices/nld_9312.cpp @@ -22,7 +22,10 @@ */ #include "nld_9312.h" -NETLIB_NAMESPACE_DEVICES_START() +namespace netlist +{ + namespace devices + { #if (1 && USE_TRUTHTABLE) nld_9312::truthtable_t nld_9312::m_ttbl; @@ -124,4 +127,5 @@ NETLIB_RESET(9312) } #endif -NETLIB_NAMESPACE_DEVICES_END() + } //namespace devices +} // namespace netlist diff --git a/src/lib/netlist/devices/nld_9312.h b/src/lib/netlist/devices/nld_9312.h index 37a2e3afcb8..62c0f12db23 100644 --- a/src/lib/netlist/devices/nld_9312.h +++ b/src/lib/netlist/devices/nld_9312.h @@ -45,7 +45,10 @@ #define TTL_9312_DIP(name) \ NET_REGISTER_DEV(TTL_9312_DIP, name) -NETLIB_NAMESPACE_DEVICES_START() +namespace netlist +{ + namespace devices + { #if (USE_TRUTHTABLE) /* The truthtable implementation is a lot faster than @@ -125,6 +128,7 @@ protected: NETLIB_SUB(9312) m_sub; }; -NETLIB_NAMESPACE_DEVICES_END() + } //namespace devices +} // namespace netlist #endif /* NLD_9312_H_ */ diff --git a/src/lib/netlist/devices/nld_9316.cpp b/src/lib/netlist/devices/nld_9316.cpp index b7857fc4d95..f78d6895618 100644 --- a/src/lib/netlist/devices/nld_9316.cpp +++ b/src/lib/netlist/devices/nld_9316.cpp @@ -9,7 +9,10 @@ #define MAXCNT 15 -NETLIB_NAMESPACE_DEVICES_START() +namespace netlist +{ + namespace devices + { NETLIB_RESET(9316) { @@ -142,4 +145,5 @@ inline NETLIB_FUNC_VOID(9316_sub, update_outputs, (const UINT8 cnt)) #endif } -NETLIB_NAMESPACE_DEVICES_END() + } //namespace devices +} // namespace netlist diff --git a/src/lib/netlist/devices/nld_9316.h b/src/lib/netlist/devices/nld_9316.h index fcb9228390e..0c5cd5843ea 100644 --- a/src/lib/netlist/devices/nld_9316.h +++ b/src/lib/netlist/devices/nld_9316.h @@ -66,7 +66,10 @@ #define TTL_9316_DIP(name) \ NET_REGISTER_DEV(TTL_9316_DIP, name) -NETLIB_NAMESPACE_DEVICES_START() +namespace netlist +{ + namespace devices + { NETLIB_OBJECT(9316_subABCD) { @@ -199,6 +202,7 @@ NETLIB_OBJECT_DERIVED(9316_dip, 9316) } }; -NETLIB_NAMESPACE_DEVICES_END() + } //namespace devices +} // namespace netlist #endif /* NLD_9316_H_ */ diff --git a/src/lib/netlist/devices/nld_cmos.h b/src/lib/netlist/devices/nld_cmos.h index c11887ef684..3be73b2aa85 100644 --- a/src/lib/netlist/devices/nld_cmos.h +++ b/src/lib/netlist/devices/nld_cmos.h @@ -11,7 +11,10 @@ #include "nl_base.h" #include "analog/nld_twoterm.h" -NETLIB_NAMESPACE_DEVICES_START() +namespace netlist +{ + namespace devices + { NETLIB_OBJECT(vdd_vss) { @@ -32,6 +35,7 @@ public: analog_input_t m_vss; }; -NETLIB_NAMESPACE_DEVICES_END() + } //namespace devices +} // namespace netlist #endif /* NLD_CMOS_H_ */ diff --git a/src/lib/netlist/devices/nld_legacy.cpp b/src/lib/netlist/devices/nld_legacy.cpp index 387330d8e95..92e3a63ee6c 100644 --- a/src/lib/netlist/devices/nld_legacy.cpp +++ b/src/lib/netlist/devices/nld_legacy.cpp @@ -8,7 +8,10 @@ #include "nld_legacy.h" #include "nl_setup.h" -NETLIB_NAMESPACE_DEVICES_START() +namespace netlist +{ + namespace devices + { NETLIB_RESET(nicRSFF) { @@ -51,4 +54,5 @@ NETLIB_UPDATE(nicDelay) m_last = nval; } -NETLIB_NAMESPACE_DEVICES_END() + } //namespace devices +} // namespace netlist diff --git a/src/lib/netlist/devices/nld_legacy.h b/src/lib/netlist/devices/nld_legacy.h index f4fdd84ca61..020ea1c3e8a 100644 --- a/src/lib/netlist/devices/nld_legacy.h +++ b/src/lib/netlist/devices/nld_legacy.h @@ -15,7 +15,10 @@ #include "nl_base.h" -NETLIB_NAMESPACE_DEVICES_START() +namespace netlist +{ + namespace devices + { // ---------------------------------------------------------------------------------------- // Macros @@ -81,6 +84,7 @@ protected: UINT8 m_last; }; -NETLIB_NAMESPACE_DEVICES_END() + } //namespace devices +} // namespace netlist #endif /* NLD_LEGACY_H_ */ diff --git a/src/lib/netlist/devices/nld_log.cpp b/src/lib/netlist/devices/nld_log.cpp index 501b6e862e5..ce91de54415 100644 --- a/src/lib/netlist/devices/nld_log.cpp +++ b/src/lib/netlist/devices/nld_log.cpp @@ -8,7 +8,10 @@ #include "nld_log.h" //#include "sound/wavwrite.h" -NETLIB_NAMESPACE_DEVICES_START() +namespace netlist +{ + namespace devices + { //FIXME: what to do with save states? @@ -50,4 +53,5 @@ NETLIB_NAME(log)::~NETLIB_NAME(wav)() } #endif -NETLIB_NAMESPACE_DEVICES_END() + } //namespace devices +} // namespace netlist diff --git a/src/lib/netlist/devices/nld_log.h b/src/lib/netlist/devices/nld_log.h index 76e60be8951..eacc4246fa7 100644 --- a/src/lib/netlist/devices/nld_log.h +++ b/src/lib/netlist/devices/nld_log.h @@ -33,7 +33,10 @@ NET_CONNECT(name, I2, cI2) -NETLIB_NAMESPACE_DEVICES_START() +namespace netlist +{ + namespace devices + { NETLIB_OBJECT(log) { @@ -73,6 +76,7 @@ private: ); #endif -NETLIB_NAMESPACE_DEVICES_END() + } //namespace devices +} // namespace netlist #endif /* NLD_LOG_H_ */ diff --git a/src/lib/netlist/devices/nld_mm5837.cpp b/src/lib/netlist/devices/nld_mm5837.cpp index c8e5ca23b44..aa51492560a 100644 --- a/src/lib/netlist/devices/nld_mm5837.cpp +++ b/src/lib/netlist/devices/nld_mm5837.cpp @@ -12,7 +12,10 @@ #define R_LOW (1000) #define R_HIGH (1000) -NETLIB_NAMESPACE_DEVICES_START() +namespace netlist +{ + namespace devices + { NETLIB_RESET(MM5837_dip) { @@ -55,4 +58,5 @@ NETLIB_UPDATE(MM5837_dip) -NETLIB_NAMESPACE_DEVICES_END() + } //namespace devices +} // namespace netlist diff --git a/src/lib/netlist/devices/nld_mm5837.h b/src/lib/netlist/devices/nld_mm5837.h index d433b057d57..8519aff582f 100644 --- a/src/lib/netlist/devices/nld_mm5837.h +++ b/src/lib/netlist/devices/nld_mm5837.h @@ -25,7 +25,10 @@ #define MM5837_DIP(name) \ NET_REGISTER_DEV(MM5837_DIP, name) -NETLIB_NAMESPACE_DEVICES_START() +namespace netlist +{ + namespace devices + { NETLIB_OBJECT(MM5837_dip) { @@ -78,6 +81,7 @@ protected: bool m_is_timestep; }; -NETLIB_NAMESPACE_DEVICES_END() + } //namespace devices +} // namespace netlist #endif /* NLD_MM5837_H_ */ diff --git a/src/lib/netlist/devices/nld_ne555.cpp b/src/lib/netlist/devices/nld_ne555.cpp index e08659f7827..0a615c62336 100644 --- a/src/lib/netlist/devices/nld_ne555.cpp +++ b/src/lib/netlist/devices/nld_ne555.cpp @@ -12,7 +12,10 @@ #define R_OFF (1E20) #define R_ON (25) // Datasheet states a maximum discharge of 200mA, R = 5V / 0.2 -NETLIB_NAMESPACE_DEVICES_START() +namespace netlist +{ + namespace devices + { inline nl_double NETLIB_NAME(NE555)::clamp(const nl_double v, const nl_double a, const nl_double b) { @@ -77,4 +80,5 @@ NETLIB_UPDATE(NE555) } -NETLIB_NAMESPACE_DEVICES_END() + } //namespace devices +} // namespace netlist diff --git a/src/lib/netlist/devices/nld_ne555.h b/src/lib/netlist/devices/nld_ne555.h index cead3ba8cd5..3b05dea36db 100644 --- a/src/lib/netlist/devices/nld_ne555.h +++ b/src/lib/netlist/devices/nld_ne555.h @@ -25,7 +25,10 @@ #define NE555(name) \ NET_REGISTER_DEV(NE555, name) -NETLIB_NAMESPACE_DEVICES_START() +namespace netlist +{ + namespace devices + { NETLIB_OBJECT(NE555) { @@ -95,6 +98,7 @@ NETLIB_OBJECT_DERIVED(NE555_dip, NE555) } }; -NETLIB_NAMESPACE_DEVICES_END() + } //namespace devices +} // namespace netlist #endif /* NLD_NE555_H_ */ diff --git a/src/lib/netlist/devices/nld_r2r_dac.cpp b/src/lib/netlist/devices/nld_r2r_dac.cpp index 0762eccf332..e464241a7f0 100644 --- a/src/lib/netlist/devices/nld_r2r_dac.cpp +++ b/src/lib/netlist/devices/nld_r2r_dac.cpp @@ -7,7 +7,10 @@ #include "nld_r2r_dac.h" -NETLIB_NAMESPACE_DEVICES_START() +namespace netlist +{ + namespace devices + { NETLIB_UPDATE_PARAM(r2r_dac) { @@ -18,4 +21,5 @@ NETLIB_UPDATE_PARAM(r2r_dac) this->set(1.0 / m_R.Value(), V, 0.0); } -NETLIB_NAMESPACE_DEVICES_END() + } //namespace devices +} // namespace netlist diff --git a/src/lib/netlist/devices/nld_r2r_dac.h b/src/lib/netlist/devices/nld_r2r_dac.h index 89ee4c5cbf4..dbf1324a80f 100644 --- a/src/lib/netlist/devices/nld_r2r_dac.h +++ b/src/lib/netlist/devices/nld_r2r_dac.h @@ -55,7 +55,10 @@ NETDEV_PARAMI(name, R, p_R) \ NETDEV_PARAMI(name, N, p_N) -NETLIB_NAMESPACE_DEVICES_START() +namespace netlist +{ + namespace devices + { NETLIB_OBJECT_DERIVED(r2r_dac, twoterm) { @@ -80,7 +83,8 @@ protected: param_int_t m_val; }; -NETLIB_NAMESPACE_DEVICES_END() + } //namespace devices +} // namespace netlist #endif /* NLD_R2R_DAC_H_ */ diff --git a/src/lib/netlist/devices/nld_system.cpp b/src/lib/netlist/devices/nld_system.cpp index d2cdc5a3aca..6924432821f 100644 --- a/src/lib/netlist/devices/nld_system.cpp +++ b/src/lib/netlist/devices/nld_system.cpp @@ -9,7 +9,10 @@ #include #include "nld_system.h" -NETLIB_NAMESPACE_DEVICES_START() +namespace netlist +{ + namespace devices + { // ---------------------------------------------------------------------------------------- // netlistparams @@ -210,4 +213,5 @@ NETLIB_UPDATE(function) } -NETLIB_NAMESPACE_DEVICES_END() + } //namespace devices +} // namespace netlist diff --git a/src/lib/netlist/devices/nld_system.h b/src/lib/netlist/devices/nld_system.h index 89864d1fb4f..c8e2aa73665 100644 --- a/src/lib/netlist/devices/nld_system.h +++ b/src/lib/netlist/devices/nld_system.h @@ -75,7 +75,10 @@ PARAM(name.N, p_N) \ PARAM(name.FUNC, p_F) -NETLIB_NAMESPACE_DEVICES_START() +namespace netlist +{ + namespace devices + { // ----------------------------------------------------------------------------- // netlistparams @@ -641,6 +644,7 @@ private: }; -NETLIB_NAMESPACE_DEVICES_END() + } //namespace devices +} // namespace netlist #endif /* NLD_SYSTEM_H_ */ diff --git a/src/lib/netlist/devices/nld_truthtable.cpp b/src/lib/netlist/devices/nld_truthtable.cpp index bd34a537471..e4249713df4 100644 --- a/src/lib/netlist/devices/nld_truthtable.cpp +++ b/src/lib/netlist/devices/nld_truthtable.cpp @@ -8,7 +8,10 @@ #include "nld_truthtable.h" #include "plib/plists.h" -NETLIB_NAMESPACE_DEVICES_START() +namespace netlist +{ + namespace devices + { unsigned truthtable_desc_t::count_bits(UINT32 v) { @@ -273,4 +276,5 @@ plib::owned_ptr nl_tt_factory_create(const un //return nullptr; } -NETLIB_NAMESPACE_DEVICES_END() + } //namespace devices +} // namespace netlist diff --git a/src/lib/netlist/devices/nld_truthtable.h b/src/lib/netlist/devices/nld_truthtable.h index 14aa9fd31b3..6aaaa73a698 100644 --- a/src/lib/netlist/devices/nld_truthtable.h +++ b/src/lib/netlist/devices/nld_truthtable.h @@ -46,7 +46,10 @@ setup.factory().register_device(std::move(ttd)); \ } -NETLIB_NAMESPACE_DEVICES_START() +namespace netlist +{ + namespace devices + { #if 0 static inline UINT32 remove_first_bit(UINT32 v) @@ -362,7 +365,8 @@ plib::owned_ptr nl_tt_factory_create(const un const pstring &name, const pstring &classname, const pstring &def_param); -NETLIB_NAMESPACE_DEVICES_END() + } //namespace devices +} // namespace netlist diff --git a/src/lib/netlist/nl_base.cpp b/src/lib/netlist/nl_base.cpp index fa8e14e888c..c30478b0062 100644 --- a/src/lib/netlist/nl_base.cpp +++ b/src/lib/netlist/nl_base.cpp @@ -1066,7 +1066,10 @@ ATTR_COLD nl_double param_model_t::model_value(const pstring &entity) } // namespace -NETLIB_NAMESPACE_DEVICES_START() +namespace netlist +{ + namespace devices + { // ---------------------------------------------------------------------------------------- // mainclock @@ -1079,5 +1082,6 @@ ATTR_HOT /* inline */ void NETLIB_NAME(mainclock)::mc_update(logic_net_t &net) } -NETLIB_NAMESPACE_DEVICES_END() + } //namespace devices +} // namespace netlist diff --git a/src/lib/netlist/nl_base.h b/src/lib/netlist/nl_base.h index d857353f116..5670dacc332 100644 --- a/src/lib/netlist/nl_base.h +++ b/src/lib/netlist/nl_base.h @@ -180,9 +180,6 @@ using netlist_sig_t = std::uint32_t; // MACROS / New Syntax //============================================================ -#define NETLIB_NAMESPACE_DEVICES_START() namespace netlist { namespace devices { -#define NETLIB_NAMESPACE_DEVICES_END() }} // netlist::devices - #define NETLIB_NAME(chip) nld_ ## chip #define NETLIB_OBJECT_DERIVED(name, pclass) \ diff --git a/src/lib/netlist/solver/nld_matrix_solver.h b/src/lib/netlist/solver/nld_matrix_solver.h index e3139c2846e..44db4d9e73a 100644 --- a/src/lib/netlist/solver/nld_matrix_solver.h +++ b/src/lib/netlist/solver/nld_matrix_solver.h @@ -13,7 +13,10 @@ #include "solver/nld_solver.h" #include "plib/pstream.h" -NETLIB_NAMESPACE_DEVICES_START() +namespace netlist +{ + namespace devices + { class terms_t { @@ -281,6 +284,7 @@ void matrix_solver_t::build_LE_RHS() } } -NETLIB_NAMESPACE_DEVICES_END() + } //namespace devices +} // namespace netlist #endif /* NLD_MS_DIRECT_H_ */ diff --git a/src/lib/netlist/solver/nld_ms_direct.h b/src/lib/netlist/solver/nld_ms_direct.h index 47a2d62027b..519693af885 100644 --- a/src/lib/netlist/solver/nld_ms_direct.h +++ b/src/lib/netlist/solver/nld_ms_direct.h @@ -26,7 +26,10 @@ #include #endif -NETLIB_NAMESPACE_DEVICES_START() +namespace netlist +{ + namespace devices + { //#define nl_ext_double _float128 // slow, very slow //#define nl_ext_double long double // slightly slower @@ -450,6 +453,7 @@ matrix_solver_direct_t::matrix_solver_direct_t(netlist_t &anetli #endif } -NETLIB_NAMESPACE_DEVICES_END() + } //namespace devices +} // namespace netlist #endif /* NLD_MS_DIRECT_H_ */ diff --git a/src/lib/netlist/solver/nld_ms_direct1.h b/src/lib/netlist/solver/nld_ms_direct1.h index fa994cc0413..4d8ae1fb677 100644 --- a/src/lib/netlist/solver/nld_ms_direct1.h +++ b/src/lib/netlist/solver/nld_ms_direct1.h @@ -11,7 +11,10 @@ #include "solver/nld_ms_direct.h" #include "solver/nld_solver.h" -NETLIB_NAMESPACE_DEVICES_START() +namespace netlist +{ + namespace devices + { class matrix_solver_direct1_t: public matrix_solver_direct_t<1,1> { @@ -49,7 +52,8 @@ inline int matrix_solver_direct1_t::vsolve_non_dynamic(ATTR_UNUSED const bool ne return 1; } -NETLIB_NAMESPACE_DEVICES_END() + } //namespace devices +} // namespace netlist #endif /* NLD_MS_DIRECT1_H_ */ diff --git a/src/lib/netlist/solver/nld_ms_direct2.h b/src/lib/netlist/solver/nld_ms_direct2.h index 0a9c5cdd0b4..4094f84c8a2 100644 --- a/src/lib/netlist/solver/nld_ms_direct2.h +++ b/src/lib/netlist/solver/nld_ms_direct2.h @@ -11,7 +11,10 @@ #include "solver/nld_ms_direct.h" #include "solver/nld_solver.h" -NETLIB_NAMESPACE_DEVICES_START() +namespace netlist +{ + namespace devices + { class matrix_solver_direct2_t: public matrix_solver_direct_t<2,2> { @@ -55,6 +58,7 @@ inline int matrix_solver_direct2_t::vsolve_non_dynamic(ATTR_UNUSED const bool ne return 1; } -NETLIB_NAMESPACE_DEVICES_END() + } //namespace devices +} // namespace netlist #endif /* NLD_MS_DIRECT2_H_ */ diff --git a/src/lib/netlist/solver/nld_ms_direct_lu.h b/src/lib/netlist/solver/nld_ms_direct_lu.h index 6f6288f9c48..b45e23d42ec 100644 --- a/src/lib/netlist/solver/nld_ms_direct_lu.h +++ b/src/lib/netlist/solver/nld_ms_direct_lu.h @@ -15,7 +15,10 @@ //#define A(r, c) m_A[_r][_c] -NETLIB_NAMESPACE_DEVICES_START() +namespace netlist +{ + namespace devices + { //#define nl_ext_double _float128 // slow, very slow //#define nl_ext_double long double // slightly slower @@ -625,6 +628,7 @@ matrix_solver_direct_t::matrix_solver_direct_t(const eSolverType } } -NETLIB_NAMESPACE_DEVICES_END() + } //namespace devices +} // namespace netlist #endif /* NLD_MS_DIRECT_H_ */ diff --git a/src/lib/netlist/solver/nld_ms_gcr.h b/src/lib/netlist/solver/nld_ms_gcr.h index 7ffe4594d3a..f963c59be01 100644 --- a/src/lib/netlist/solver/nld_ms_gcr.h +++ b/src/lib/netlist/solver/nld_ms_gcr.h @@ -23,7 +23,10 @@ #define NL_USE_SSE 0 -NETLIB_NAMESPACE_DEVICES_START() +namespace netlist +{ + namespace devices + { template class matrix_solver_GCR_t: public matrix_solver_t @@ -395,6 +398,7 @@ int matrix_solver_GCR_t::vsolve_non_dynamic(const bool newton_ra } } -NETLIB_NAMESPACE_DEVICES_END() + } //namespace devices +} // namespace netlist #endif /* NLD_MS_GCR_H_ */ diff --git a/src/lib/netlist/solver/nld_ms_gmres.h b/src/lib/netlist/solver/nld_ms_gmres.h index 6d0bb404fd3..e4ee5fe0cb8 100644 --- a/src/lib/netlist/solver/nld_ms_gmres.h +++ b/src/lib/netlist/solver/nld_ms_gmres.h @@ -19,7 +19,10 @@ #include "solver/nld_solver.h" #include "solver/vector_base.h" -NETLIB_NAMESPACE_DEVICES_START() +namespace netlist +{ + namespace devices + { template class matrix_solver_GMRES_t: public matrix_solver_direct_t @@ -381,6 +384,7 @@ int matrix_solver_GMRES_t::solve_ilu_gmres (nl_double * RESTRICT -NETLIB_NAMESPACE_DEVICES_END() + } //namespace devices +} // namespace netlist #endif /* NLD_MS_GMRES_H_ */ diff --git a/src/lib/netlist/solver/nld_ms_sm.h b/src/lib/netlist/solver/nld_ms_sm.h index c11e4fd0500..331161751f9 100644 --- a/src/lib/netlist/solver/nld_ms_sm.h +++ b/src/lib/netlist/solver/nld_ms_sm.h @@ -39,7 +39,10 @@ #include "solver/nld_matrix_solver.h" #include "solver/vector_base.h" -NETLIB_NAMESPACE_DEVICES_START() +namespace netlist +{ + namespace devices + { //#define nl_ext_double _float128 // slow, very slow //#define nl_ext_double long double // slightly slower @@ -339,6 +342,7 @@ matrix_solver_sm_t::matrix_solver_sm_t(netlist_t &anetlist, cons } } -NETLIB_NAMESPACE_DEVICES_END() + } //namespace devices +} // namespace netlist #endif /* NLD_MS_DIRECT_H_ */ diff --git a/src/lib/netlist/solver/nld_ms_sor.h b/src/lib/netlist/solver/nld_ms_sor.h index 355a7ce138d..5ccb7af6bc0 100644 --- a/src/lib/netlist/solver/nld_ms_sor.h +++ b/src/lib/netlist/solver/nld_ms_sor.h @@ -17,7 +17,10 @@ #include "solver/nld_ms_direct.h" #include "solver/nld_solver.h" -NETLIB_NAMESPACE_DEVICES_START() +namespace netlist +{ + namespace devices + { template class matrix_solver_SOR_t: public matrix_solver_direct_t @@ -182,6 +185,7 @@ int matrix_solver_SOR_t::vsolve_non_dynamic(const bool newton_ra return resched_cnt; } -NETLIB_NAMESPACE_DEVICES_END() + } //namespace devices +} // namespace netlist #endif /* NLD_MS_SOR_H_ */ diff --git a/src/lib/netlist/solver/nld_ms_sor_mat.h b/src/lib/netlist/solver/nld_ms_sor_mat.h index 099db11ab0f..e828d1a6c31 100644 --- a/src/lib/netlist/solver/nld_ms_sor_mat.h +++ b/src/lib/netlist/solver/nld_ms_sor_mat.h @@ -18,7 +18,10 @@ #include "solver/nld_matrix_solver.h" #include "solver/nld_solver.h" -NETLIB_NAMESPACE_DEVICES_START() +namespace netlist +{ + namespace devices + { template class matrix_solver_SOR_mat_t: public matrix_solver_direct_t @@ -217,6 +220,7 @@ int matrix_solver_SOR_mat_t::vsolve_non_dynamic(const bool newto } -NETLIB_NAMESPACE_DEVICES_END() + } //namespace devices +} // namespace netlist #endif /* NLD_MS_GAUSS_SEIDEL_H_ */ diff --git a/src/lib/netlist/solver/nld_ms_w.h b/src/lib/netlist/solver/nld_ms_w.h index 2fd64b2f990..cd70d82024b 100644 --- a/src/lib/netlist/solver/nld_ms_w.h +++ b/src/lib/netlist/solver/nld_ms_w.h @@ -46,7 +46,10 @@ #include "solver/nld_matrix_solver.h" #include "solver/vector_base.h" -NETLIB_NAMESPACE_DEVICES_START() +namespace netlist +{ + namespace devices + { //#define nl_ext_double _float128 // slow, very slow //#define nl_ext_double long double // slightly slower @@ -401,6 +404,7 @@ matrix_solver_w_t::matrix_solver_w_t(netlist_t &anetlist, const } } -NETLIB_NAMESPACE_DEVICES_END() + } //namespace devices +} // namespace netlist #endif /* NLD_MS_DIRECT_H_ */ diff --git a/src/lib/netlist/solver/nld_solver.cpp b/src/lib/netlist/solver/nld_solver.cpp index 92cadc1859c..7d16bcbefc2 100644 --- a/src/lib/netlist/solver/nld_solver.cpp +++ b/src/lib/netlist/solver/nld_solver.cpp @@ -55,7 +55,10 @@ #include "nld_ms_sor_mat.h" #include "nld_ms_gmres.h" -NETLIB_NAMESPACE_DEVICES_START() +namespace netlist +{ + namespace devices + { ATTR_COLD void terms_t::add(terminal_t *term, int net_other, bool sorted) { @@ -847,4 +850,5 @@ void NETLIB_NAME(solver)::create_solver_code(plib::postream &strm) } -NETLIB_NAMESPACE_DEVICES_END() + } //namespace devices +} // namespace netlist diff --git a/src/lib/netlist/solver/nld_solver.h b/src/lib/netlist/solver/nld_solver.h index 86a0d6c3218..7b7aac2a1c1 100644 --- a/src/lib/netlist/solver/nld_solver.h +++ b/src/lib/netlist/solver/nld_solver.h @@ -27,7 +27,10 @@ // solver // ---------------------------------------------------------------------------------------- -NETLIB_NAMESPACE_DEVICES_START() +namespace netlist +{ + namespace devices + { class NETLIB_NAME(solver); @@ -129,6 +132,7 @@ private: matrix_solver_t *create_solver(int size, bool use_specific); }; -NETLIB_NAMESPACE_DEVICES_END() + } //namespace devices +} // namespace netlist #endif /* NLD_SOLVER_H_ */ From 6b54bfcc3f10194aae4e624e0893f5744b8e475c Mon Sep 17 00:00:00 2001 From: couriersud Date: Fri, 27 May 2016 21:50:24 +0200 Subject: [PATCH 07/44] Reorganize nl_config. Removed comments in nl_base. (nw) --- src/lib/netlist/nl_base.h | 5 --- src/lib/netlist/nl_config.h | 63 +++++++++++++++++++------------------ 2 files changed, 32 insertions(+), 36 deletions(-) diff --git a/src/lib/netlist/nl_base.h b/src/lib/netlist/nl_base.h index 5670dacc332..3cf193b7ad3 100644 --- a/src/lib/netlist/nl_base.h +++ b/src/lib/netlist/nl_base.h @@ -237,11 +237,6 @@ class NETLIB_NAME(name) : public device_t #define NETLIB_UPDATE_TERMINALS(chip) ATTR_HOT void NETLIB_NAME(chip) :: update_terminals(void) -//============================================================ -// MACROS / netlist devices -//============================================================ - - //============================================================ // Asserts //============================================================ diff --git a/src/lib/netlist/nl_config.h b/src/lib/netlist/nl_config.h index 580e03ec1ad..6ca57b864f5 100644 --- a/src/lib/netlist/nl_config.h +++ b/src/lib/netlist/nl_config.h @@ -14,8 +14,6 @@ // SETUP //============================================================ -#define NOEXCEPT noexcept - /* * The following options determine how object::update is called. * NL_PMF_TYPE_VIRTUAL @@ -48,11 +46,6 @@ * Disappointing is the GNUC_PMF performance. */ - -/* FIXME: Currently, we are not registering subdevices and thus these will not - * be started and the internal method will not be initialized. - */ - // This will be autodetected //#define NL_PMF_TYPE 0 @@ -74,42 +67,25 @@ #endif -// The following adds about 10% performance ... - -#if !defined(USE_OPENMP) -#define USE_OPENMP (0) -#endif // !defined(USE_OPENMP) - -// Use nano-second resolution - Sufficient for now -#define NETLIST_INTERNAL_RES (U64(1000000000)) -//#define NETLIST_INTERNAL_RES (U64(1000000000000)) - -#define NETLIST_CLOCK (NETLIST_INTERNAL_RES) - -#define NETLIST_GMIN_DEFAULT (1e-9) - -//#define nl_double float -//#define NL_FCONST(x) (x ## f) - -#define nl_double double -#define NL_FCONST(x) x //============================================================ // GENERAL //============================================================ -#define NL_USE_MEMPOOL (0) -#define USE_TRUTHTABLE (1) +#define NL_USE_MEMPOOL (0) +#define USE_TRUTHTABLE (1) //============================================================ // Solver defines //============================================================ -#define USE_MATRIX_GS (0) -#define USE_GABS (1) +#define USE_MATRIX_GS (0) +#define USE_GABS (1) // savings are eaten up by effort // FIXME: Convert into solver parameter -#define USE_LINEAR_PREDICTION (0) +#define USE_LINEAR_PREDICTION (0) +#define NETLIST_GMIN_DEFAULT (1e-9) + //============================================================ @@ -145,9 +121,34 @@ #define end_timing(v) do { } while (0) #endif +//============================================================ +// General +//============================================================ + // this macro passes an item followed by a string version of itself as two consecutive parameters #define NLNAME(x) x, #x +#define NOEXCEPT noexcept + +// The following adds about 10% performance ... + +#if !defined(USE_OPENMP) +#define USE_OPENMP (0) +#endif // !defined(USE_OPENMP) + +// Use nano-second resolution - Sufficient for now +#define NETLIST_INTERNAL_RES (U64(1000000000)) +//#define NETLIST_INTERNAL_RES (U64(1000000000000)) + +#define NETLIST_CLOCK (NETLIST_INTERNAL_RES) + +//#define nl_double float +//#define NL_FCONST(x) (x ## f) + +#define nl_double double +#define NL_FCONST(x) x + + //============================================================ // WARNINGS //============================================================ From a059dfcb7eb289d452fcc54504ca87446c69270b Mon Sep 17 00:00:00 2001 From: couriersud Date: Sat, 28 May 2016 13:27:11 +0200 Subject: [PATCH 08/44] Fixed vs2015 compile. Started moving object definitions into cpp file. Added factory class to support this. This will decrease compile times significantly going forward. [Couriersud] --- src/lib/netlist/devices/net_lib.cpp | 7 +- src/lib/netlist/devices/nld_74279.cpp | 182 +++++++++----------------- src/lib/netlist/devices/nld_74279.h | 47 ------- src/lib/netlist/nl_base.h | 14 ++ src/lib/netlist/nl_factory.h | 23 ++++ 5 files changed, 104 insertions(+), 169 deletions(-) diff --git a/src/lib/netlist/devices/net_lib.cpp b/src/lib/netlist/devices/net_lib.cpp index b56da402a22..058b2aeff72 100644 --- a/src/lib/netlist/devices/net_lib.cpp +++ b/src/lib/netlist/devices/net_lib.cpp @@ -61,6 +61,11 @@ NETLIST_END() #define ENTRY1(nic, name, defparam) factory.register_device( # name, xstr(nic), defparam ); #define ENTRY(nic, name, defparam) ENTRY1(NETLIB_NAME(nic), name, defparam) +#define NETLIB_DEVICE_DECL(chip) extern device_creator_ptr_t decl_ ## chip; + +#define ENTRYX1(nic, name, defparam, decl) factory.register_device( # name, xstr(nic), defparam, decl ); +#define ENTRYX(nic, name, defparam) { NETLIB_DEVICE_DECL(nic) ENTRYX1(NETLIB_NAME(nic), name, defparam, decl_ ## nic) } + namespace netlist { namespace devices @@ -140,7 +145,7 @@ void initialize_factory(factory_list_t &factory) ENTRY(74175_dip, TTL_74175_DIP, "-") ENTRY(74192_dip, TTL_74192_DIP, "-") ENTRY(74193_dip, TTL_74193_DIP, "-") - ENTRY(74279_dip, TTL_74279_DIP, "-") + ENTRYX(74279_dip, TTL_74279_DIP, "-") ENTRY(82S16_dip, TTL_82S16_DIP, "-") ENTRY(9602_dip, TTL_9602_DIP, "-") ENTRY(9310_dip, TTL_9310_DIP, "-") diff --git a/src/lib/netlist/devices/nld_74279.cpp b/src/lib/netlist/devices/nld_74279.cpp index 85bbed08e94..f5eec9b384e 100644 --- a/src/lib/netlist/devices/nld_74279.cpp +++ b/src/lib/netlist/devices/nld_74279.cpp @@ -12,132 +12,72 @@ namespace netlist namespace devices { -nld_74279A::truthtable_t nld_74279A::m_ttbl; -nld_74279B::truthtable_t nld_74279B::m_ttbl; + NETLIB_TRUTHTABLE(74279A, 3, 1, 0); + NETLIB_TRUTHTABLE(74279B, 4, 1, 0); -#if 0 -const char *nld_74279A::m_desc[] = { - "S,R,PQ,PS,PR|Q", - "0,0,X,X,X|1|22", - "0,1,X,X,X|1|22", - "1,0,X,X,X|0|15", - "1,1,0,X,X|0|15", - "1,1,1,X,X|1|22", - "" -}; + NETLIB_OBJECT(74279_dip) + { + NETLIB_CONSTRUCTOR(74279_dip) + , m_1(*this, "1") + , m_2(*this, "2") + , m_3(*this, "3") + , m_4(*this, "4") + { + register_subalias("1", m_1.m_I[2]); //R + register_subalias("2", m_1.m_I[0]); + register_subalias("3", m_1.m_I[1]); + register_subalias("4", m_1.m_Q[0]); + + register_subalias("5", m_2.m_I[1]); //R + register_subalias("6", m_2.m_I[0]); + register_subalias("7", m_2.m_Q[0]); + + register_subalias("9", m_3.m_Q[0]); + register_subalias("10", m_3.m_I[2]); //R + register_subalias("11", m_3.m_I[0]); + register_subalias("12", m_3.m_I[1]); + + register_subalias("13", m_4.m_Q[0]); + register_subalias("14", m_4.m_I[1]); //R + register_subalias("15", m_4.m_I[0]); + + } + + //NETLIB_RESETI(); + //NETLIB_UPDATEI(); + + protected: + NETLIB_SUB(74279B) m_1; + NETLIB_SUB(74279A) m_2; + NETLIB_SUB(74279B) m_3; + NETLIB_SUB(74279A) m_4; + }; + + nld_74279A::truthtable_t nld_74279A::m_ttbl; + nld_74279B::truthtable_t nld_74279B::m_ttbl; + + const char *nld_74279A::m_desc[] = { + "S,R,_Q|Q", + "0,X,X|1|22", + "1,0,X|0|27", + "1,1,0|0|27", //15 + "1,1,1|1|22", + "" + }; -const char *nld_74279B::m_desc[] = { - "S1,S2,R,PQ,PS1,PS2,PR|Q", - "0,X,0,X,X,X,X|1|22", - "X,0,0,X,X,X,X|1|22", - "0,X,1,X,X,X,X|1|22", - "X,0,1,X,X,X,X|1|22", - "1,1,0,X,X,X,X|0|15", - "1,1,1,0,X,X,X|0|15", - "1,1,1,1,X,X,X|1|22", - "" -}; -#else -#if 1 -const char *nld_74279A::m_desc[] = { - "S,R,_Q|Q", - "0,X,X|1|22", - "1,0,X|0|27", - "1,1,0|0|27", //15 - "1,1,1|1|22", - "" -}; + const char *nld_74279B::m_desc[] = { + "S1,S2,R,_Q|Q", + "0,X,X,X|1|22", + "X,0,X,X|1|22", + "1,1,0,X|0|27", + "1,1,1,0|0|27", // 15 + "1,1,1,1|1|22", + "" + }; -const char *nld_74279B::m_desc[] = { - "S1,S2,R,_Q|Q", - "0,X,X,X|1|22", - "X,0,X,X|1|22", - "1,1,0,X|0|27", - "1,1,1,0|0|27", // 15 - "1,1,1,1|1|22", - "" -}; -#else -const char *nld_74279A::m_desc[] = { - " S, R,_Q,_QR|Q,QR", - " 0, 0, 0, 0 |1, 1|20,22", - " 1, 0, 0, 0 |1, 1|20,22", - " 0, 1, 0, 0 |1, 1|20,22", - " 1, 1, 0, 0 |1, 1|20,22", - " 0, 0, 1, 0 |1, 1|20,22", - " 1, 0, 1, 0 |1, 1|20,22", - " 0, 1, 1, 0 |1, 0|22,15", - " 1, 1, 1, 0 |1, 0|22,15", - " 0, 0, 0, 1 |1, 1|20,22", - " 1, 0, 0, 1 |0, 1|15,22", - " 0, 1, 0, 1 |1, 1|20,22", - " 1, 1, 0, 1 |0, 1|15,22", - " 0, 0, 1, 1 |1, 1|20,22", - " 1, 0, 1, 1 |0, 1|15,22", - " 0, 1, 1, 1 |1, 0|22,15", - " 1, 1, 1, 1 |0, 0|13,15", - "" -}; - - -const char *nld_74279B::m_desc[] = { - "S1,S2,R,_Q,_QR|Q,QR", - "0,0,0,0,0|1,1|20,22", - "1,0,0,0,0|1,1|20,22", - "0,1,0,0,0|1,1|20,22", - "1,1,0,0,0|1,1|20,22", - "0,0,1,0,0|1,1|20,22", - "1,0,1,0,0|1,1|20,22", - "0,1,1,0,0|1,1|20,22", - "1,1,1,0,0|1,1|20,22", - "0,0,0,1,0|1,1|20,22", - "1,0,0,1,0|1,1|20,22", - "0,1,0,1,0|1,1|20,22", - "1,1,0,1,0|1,1|20,22", - "0,0,1,1,0|1,0|22,15", - "1,0,1,1,0|1,0|22,15", - "0,1,1,1,0|1,0|22,15", - "1,1,1,1,0|1,0|22,15", - "0,0,0,0,1|1,1|20,22", - "1,0,0,0,1|1,1|20,22", - "0,1,0,0,1|1,1|20,22", - "1,1,0,0,1|0,1|15,22", - "0,0,1,0,1|1,1|20,22", - "1,0,1,0,1|1,1|20,22", - "0,1,1,0,1|1,1|20,22", - "1,1,1,0,1|0,1|15,22", - "0,0,0,1,1|1,1|20,22", - "1,0,0,1,1|1,1|20,22", - "0,1,0,1,1|1,1|20,22", - "1,1,0,1,1|0,1|15,22", - "0,0,1,1,1|1,0|22,15", - "1,0,1,1,1|1,0|22,15", - "0,1,1,1,1|1,0|22,15", - "1,1,1,1,1|0,0|13,15", - "" -}; - -#endif -#endif - -NETLIB_UPDATE(74279_dip) -{ - /* only called during startup */ - //m_1.update_dev(); - //m_2.update_dev(); - //m_3.update_dev(); - //m_4.update_dev(); -} - -NETLIB_RESET(74279_dip) -{ - //m_1.do_reset(); - //m_2.do_reset(); - //m_3.do_reset(); - //m_4.do_reset(); -} + NETLIB_DEVICE_IMPL(74279_dip) } //namespace devices } // namespace netlist diff --git a/src/lib/netlist/devices/nld_74279.h b/src/lib/netlist/devices/nld_74279.h index 159b37cd083..a77578f0d8d 100644 --- a/src/lib/netlist/devices/nld_74279.h +++ b/src/lib/netlist/devices/nld_74279.h @@ -46,53 +46,6 @@ namespace netlist namespace devices { -#if 0 -NETLIB_TRUTHTABLE(74279A, 2, 1, 1); -NETLIB_TRUTHTABLE(74279B, 3, 1, 1); -#else -NETLIB_TRUTHTABLE(74279A, 3, 1, 0); -NETLIB_TRUTHTABLE(74279B, 4, 1, 0); -//NETLIB_TRUTHTABLE(74279A, 4, 2, 0); -//NETLIB_TRUTHTABLE(74279B, 5, 2, 0); -#endif - -NETLIB_OBJECT(74279_dip) -{ - NETLIB_CONSTRUCTOR(74279_dip) - , m_1(*this, "1") - , m_2(*this, "2") - , m_3(*this, "3") - , m_4(*this, "4") - { - register_subalias("1", m_1.m_I[2]); //R - register_subalias("2", m_1.m_I[0]); - register_subalias("3", m_1.m_I[1]); - register_subalias("4", m_1.m_Q[0]); - - register_subalias("5", m_2.m_I[1]); //R - register_subalias("6", m_2.m_I[0]); - register_subalias("7", m_2.m_Q[0]); - - register_subalias("9", m_3.m_Q[0]); - register_subalias("10", m_3.m_I[2]); //R - register_subalias("11", m_3.m_I[0]); - register_subalias("12", m_3.m_I[1]); - - register_subalias("13", m_4.m_Q[0]); - register_subalias("14", m_4.m_I[1]); //R - register_subalias("15", m_4.m_I[0]); - - } - - NETLIB_RESETI(); - NETLIB_UPDATEI(); - -protected: - NETLIB_SUB(74279B) m_1; - NETLIB_SUB(74279A) m_2; - NETLIB_SUB(74279B) m_3; - NETLIB_SUB(74279A) m_4; -}; } //namespace devices } // namespace netlist diff --git a/src/lib/netlist/nl_base.h b/src/lib/netlist/nl_base.h index 3cf193b7ad3..a6d2f0dc220 100644 --- a/src/lib/netlist/nl_base.h +++ b/src/lib/netlist/nl_base.h @@ -236,6 +236,7 @@ class NETLIB_NAME(name) : public device_t #define NETLIB_UPDATE_TERMINALS(chip) ATTR_HOT void NETLIB_NAME(chip) :: update_terminals(void) +#define NETLIB_DEVICE_IMPL(chip) device_creator_ptr_t decl_ ## chip = device_creator_t< NETLIB_NAME(chip) >; //============================================================ // Asserts @@ -398,6 +399,7 @@ namespace netlist public: void * operator new (size_t size, void *ptr) { return ptr; } + void operator delete (void *ptr, size_t size) { } void * operator new (size_t size); void operator delete (void * mem); }; @@ -1297,6 +1299,18 @@ protected: plib::dynlib *m_lib; // external lib needs to be loaded as long as netlist exists }; + // ----------------------------------------------------------------------------- + // base_device_creator_t + // ----------------------------------------------------------------------------- + + using device_creator_ptr_t = plib::owned_ptr (*)(netlist_t &anetlist, const pstring &name); + + template + plib::owned_ptr device_creator_t(netlist_t &anetlist, const pstring &name) + { + return plib::owned_ptr::Create(anetlist, name); + } + // ----------------------------------------------------------------------------- // inline implementations // ----------------------------------------------------------------------------- diff --git a/src/lib/netlist/nl_factory.h b/src/lib/netlist/nl_factory.h index 8197d8a5a95..a27728e18ab 100644 --- a/src/lib/netlist/nl_factory.h +++ b/src/lib/netlist/nl_factory.h @@ -17,6 +17,7 @@ namespace netlist { + // ----------------------------------------------------------------------------- // net_dev class factory // ----------------------------------------------------------------------------- @@ -59,7 +60,23 @@ namespace netlist { return plib::owned_ptr::Create(anetlist, name); } + }; + class factoryx_t : public base_factory_t + { + P_PREVENT_COPYING(factoryx_t) + public: + factoryx_t(const pstring &name, const pstring &classname, + const pstring &def_param, device_creator_ptr_t ptr) + : base_factory_t(name, classname, def_param) + , m_ptr(ptr) { } + + plib::owned_ptr Create(netlist_t &anetlist, const pstring &name) override + { + return m_ptr(anetlist, name); + } + private: + device_creator_ptr_t m_ptr; }; class factory_list_t : public plib::pvector_t> @@ -83,6 +100,12 @@ namespace netlist push_back(std::move(factory)); } + void register_device(const pstring &name, const pstring &classname, + const pstring &def_param, device_creator_ptr_t ptr) + { + register_device(plib::owned_ptr::Create(name, classname, def_param, ptr)); + } + //ATTR_COLD device_t *new_device_by_classname(const pstring &classname) const; // FIXME: legacy, should use factory_by_name plib::owned_ptr new_device_by_name(const pstring &devname, netlist_t &anetlist, const pstring &name); From 899a4867de6468e155c5e1210773eb46f0e5c9f2 Mon Sep 17 00:00:00 2001 From: couriersud Date: Sat, 28 May 2016 17:48:21 +0200 Subject: [PATCH 09/44] Fix 7448 device and move class to cpp. (nw) --- src/lib/netlist/devices/net_lib.cpp | 4 +- src/lib/netlist/devices/nld_7448.cpp | 311 +++++++++++++++++---------- src/lib/netlist/devices/nld_7448.h | 117 ---------- src/lib/netlist/nl_base.h | 4 +- 4 files changed, 205 insertions(+), 231 deletions(-) diff --git a/src/lib/netlist/devices/net_lib.cpp b/src/lib/netlist/devices/net_lib.cpp index 058b2aeff72..7952fc24677 100644 --- a/src/lib/netlist/devices/net_lib.cpp +++ b/src/lib/netlist/devices/net_lib.cpp @@ -107,7 +107,7 @@ void initialize_factory(factory_list_t &factory) ENTRY(nicRSFF, NETDEV_RSFF, "+S,R") ENTRY(nicDelay, NETDEV_DELAY, "-") ENTRY(7450, TTL_7450_ANDORINVERT, "+A,B,C,D") - ENTRY(7448, TTL_7448, "+A,B,C,D,LTQ,BIQ,RBIQ") + ENTRYX(7448, TTL_7448, "+A,B,C,D,LTQ,BIQ,RBIQ") ENTRY(7474, TTL_7474, "+CLK,D,CLRQ,PREQ") ENTRY(7483, TTL_7483, "+A1,A2,A3,A4,B1,B2,B3,B4,C0") ENTRY(7490, TTL_7490, "+A,B,R1,R2,R91,R92") @@ -133,7 +133,7 @@ void initialize_factory(factory_list_t &factory) ENTRY(NE555, NE555, "-") ENTRY(r2r_dac, R2R_DAC, "+VIN,R,N") ENTRY(4538_dip, CD4538_DIP, "-") - ENTRY(7448_dip, TTL_7448_DIP, "-") + ENTRYX(7448_dip, TTL_7448_DIP, "-") ENTRY(7450_dip, TTL_7450_DIP, "-") ENTRY(7474_dip, TTL_7474_DIP, "-") ENTRY(7483_dip, TTL_7483_DIP, "-") diff --git a/src/lib/netlist/devices/nld_7448.cpp b/src/lib/netlist/devices/nld_7448.cpp index 579f407876b..31d019fc1c7 100644 --- a/src/lib/netlist/devices/nld_7448.cpp +++ b/src/lib/netlist/devices/nld_7448.cpp @@ -12,133 +12,222 @@ namespace netlist namespace devices { -#if (USE_TRUTHTABLE_7448 && USE_TRUTHTABLE) -nld_7448::truthtable_t nld_7448::m_ttbl; -const char *nld_7448::m_desc[] = { - " LTQ,BIQ,RBIQ, A , B , C , D | a, b, c, d, e, f, g", - " 1, 1, 1, 0, 0, 0, 0 | 1, 1, 1, 1, 1, 1, 0|100,100,100,100,100,100,100", - " 1, 1, X, 1, 0, 0, 0 | 0, 1, 1, 0, 0, 0, 0|100,100,100,100,100,100,100", - " 1, 1, X, 0, 1, 0, 0 | 1, 1, 0, 1, 1, 0, 1|100,100,100,100,100,100,100", - " 1, 1, X, 1, 1, 0, 0 | 1, 1, 1, 1, 0, 0, 1|100,100,100,100,100,100,100", - " 1, 1, X, 0, 0, 1, 0 | 0, 1, 1, 0, 0, 1, 1|100,100,100,100,100,100,100", - " 1, 1, X, 1, 0, 1, 0 | 1, 0, 1, 1, 0, 1, 1|100,100,100,100,100,100,100", - " 1, 1, X, 0, 1, 1, 0 | 0, 0, 1, 1, 1, 1, 1|100,100,100,100,100,100,100", - " 1, 1, X, 1, 1, 1, 0 | 1, 1, 1, 0, 0, 0, 0|100,100,100,100,100,100,100", - " 1, 1, X, 0, 0, 0, 1 | 1, 1, 1, 1, 1, 1, 1|100,100,100,100,100,100,100", - " 1, 1, X, 1, 0, 0, 1 | 1, 1, 1, 0, 0, 1, 1|100,100,100,100,100,100,100", - " 1, 1, X, 0, 1, 0, 1 | 0, 0, 0, 1, 1, 0, 1|100,100,100,100,100,100,100", - " 1, 1, X, 1, 1, 0, 1 | 0, 0, 1, 1, 0, 0, 1|100,100,100,100,100,100,100", - " 1, 1, X, 0, 0, 1, 1 | 0, 1, 0, 0, 0, 1, 1|100,100,100,100,100,100,100", - " 1, 1, X, 1, 0, 1, 1 | 1, 0, 0, 1, 0, 1, 1|100,100,100,100,100,100,100", - " 1, 1, X, 0, 1, 1, 1 | 0, 0, 0, 1, 1, 1, 1|100,100,100,100,100,100,100", - " 1, 1, X, 1, 1, 1, 1 | 0, 0, 0, 0, 0, 0, 0|100,100,100,100,100,100,100", + /* + * FIXME: Using truthtable is a lot slower than the explicit device + */ - // BI/RBO is input output. In the next case it is used as an output will go low. - " 1, 1, 0, 0, 0, 0, 0 | 0, 0, 0, 0, 0, 0, 0|100,100,100,100,100,100,100", // RBI + #define USE_TRUTHTABLE_7448 (0) - " 0, 1, X, X, X, X, X | 1, 1, 1, 1, 1, 1, 1|100,100,100,100,100,100,100", // LT + #if (USE_TRUTHTABLE_7448 && USE_TRUTHTABLE) - // This condition has precedence - " X, 0, X, X, X, X, X | 0, 0, 0, 0, 0, 0, 0|100,100,100,100,100,100,100", // BI - "" -}; + NETLIB_TRUTHTABLE(7448, 7, 7, 0); -NETLIB_START(7448_dip) -{ - NETLIB_NAME(7448)::start(); + #else - register_subalias("1", m_I[4]); // B - register_subalias("2", m_I[5]); // C - register_subalias("3", m_I[0]); // LTQ - register_subalias("4", m_I[1]); // BIQ - register_subalias("5", m_I[2]); // RBIQ - register_subalias("6", m_I[6]); // D - register_subalias("7", m_I[3]); // A - - register_subalias("9", m_Q[4]); // e - register_subalias("10", m_Q[3]); // d - register_subalias("11", m_Q[2]); // c - register_subalias("12", m_Q[1]); // b - register_subalias("13", m_Q[0]); // a - register_subalias("14", m_Q[6]); // g - register_subalias("15", m_Q[5]); // f -} - -#else - -NETLIB_UPDATE(7448) -{ - if (INPLOGIC(m_BIQ) && !INPLOGIC(m_LTQ)) + NETLIB_OBJECT(7448) { - m_sub.update_outputs(8); - } - else if (!INPLOGIC(m_BIQ)) + NETLIB_CONSTRUCTOR(7448) + , m_state(0) + { + enregister("A", m_A); + enregister("B", m_B); + enregister("C", m_C); + enregister("D", m_D); + enregister("LTQ", m_LTQ); + enregister("BIQ", m_BIQ); + enregister("RBIQ", m_RBIQ); + + enregister("a", m_Q[0]); + enregister("b", m_Q[1]); + enregister("c", m_Q[2]); + enregister("d", m_Q[3]); + enregister("e", m_Q[4]); + enregister("f", m_Q[5]); + enregister("g", m_Q[6]); + + save(NLNAME(m_state)); + } + + NETLIB_RESETI(); + NETLIB_UPDATEI(); + + public: + ATTR_HOT void update_outputs(UINT8 v); + static const UINT8 tab7448[16][7]; + + logic_input_t m_A; + logic_input_t m_B; + logic_input_t m_C; + logic_input_t m_D; + logic_input_t m_LTQ; + logic_input_t m_BIQ; + logic_input_t m_RBIQ; + + UINT8 m_state; + + logic_output_t m_Q[7]; /* a .. g */ + + }; + + #endif + + NETLIB_OBJECT_DERIVED(7448_dip, 7448) { - m_sub.update_outputs(15); + NETLIB_CONSTRUCTOR_DERIVED(7448_dip, 7448) + { + register_subalias("1", m_B); + register_subalias("2", m_C); + register_subalias("3", m_LTQ); + register_subalias("4", m_BIQ); + register_subalias("5",m_RBIQ); + register_subalias("6", m_D); + register_subalias("7", m_A); + + register_subalias("9", m_Q[4]); // e + register_subalias("10", m_Q[3]); // d + register_subalias("11", m_Q[2]); // c + register_subalias("12", m_Q[1]); // b + register_subalias("13", m_Q[0]); // a + register_subalias("14", m_Q[6]); // g + register_subalias("15", m_Q[5]); // f + } + }; + + #if (USE_TRUTHTABLE_7448 && USE_TRUTHTABLE) + nld_7448::truthtable_t nld_7448::m_ttbl; + const char *nld_7448::m_desc[] = { + " LTQ,BIQ,RBIQ, A , B , C , D | a, b, c, d, e, f, g", + + " 1, 1, 1, 0, 0, 0, 0 | 1, 1, 1, 1, 1, 1, 0|100,100,100,100,100,100,100", + " 1, 1, X, 1, 0, 0, 0 | 0, 1, 1, 0, 0, 0, 0|100,100,100,100,100,100,100", + " 1, 1, X, 0, 1, 0, 0 | 1, 1, 0, 1, 1, 0, 1|100,100,100,100,100,100,100", + " 1, 1, X, 1, 1, 0, 0 | 1, 1, 1, 1, 0, 0, 1|100,100,100,100,100,100,100", + " 1, 1, X, 0, 0, 1, 0 | 0, 1, 1, 0, 0, 1, 1|100,100,100,100,100,100,100", + " 1, 1, X, 1, 0, 1, 0 | 1, 0, 1, 1, 0, 1, 1|100,100,100,100,100,100,100", + " 1, 1, X, 0, 1, 1, 0 | 0, 0, 1, 1, 1, 1, 1|100,100,100,100,100,100,100", + " 1, 1, X, 1, 1, 1, 0 | 1, 1, 1, 0, 0, 0, 0|100,100,100,100,100,100,100", + " 1, 1, X, 0, 0, 0, 1 | 1, 1, 1, 1, 1, 1, 1|100,100,100,100,100,100,100", + " 1, 1, X, 1, 0, 0, 1 | 1, 1, 1, 0, 0, 1, 1|100,100,100,100,100,100,100", + " 1, 1, X, 0, 1, 0, 1 | 0, 0, 0, 1, 1, 0, 1|100,100,100,100,100,100,100", + " 1, 1, X, 1, 1, 0, 1 | 0, 0, 1, 1, 0, 0, 1|100,100,100,100,100,100,100", + " 1, 1, X, 0, 0, 1, 1 | 0, 1, 0, 0, 0, 1, 1|100,100,100,100,100,100,100", + " 1, 1, X, 1, 0, 1, 1 | 1, 0, 0, 1, 0, 1, 1|100,100,100,100,100,100,100", + " 1, 1, X, 0, 1, 1, 1 | 0, 0, 0, 1, 1, 1, 1|100,100,100,100,100,100,100", + " 1, 1, X, 1, 1, 1, 1 | 0, 0, 0, 0, 0, 0, 0|100,100,100,100,100,100,100", + + // BI/RBO is input output. In the next case it is used as an output will go low. + " 1, 1, 0, 0, 0, 0, 0 | 0, 0, 0, 0, 0, 0, 0|100,100,100,100,100,100,100", // RBI + + " 0, 1, X, X, X, X, X | 1, 1, 1, 1, 1, 1, 1|100,100,100,100,100,100,100", // LT + + // This condition has precedence + " X, 0, X, X, X, X, X | 0, 0, 0, 0, 0, 0, 0|100,100,100,100,100,100,100", // BI + "" + }; + + NETLIB_START(7448_dip) + { + NETLIB_NAME(7448)::start(); + + register_subalias("1", m_I[4]); // B + register_subalias("2", m_I[5]); // C + register_subalias("3", m_I[0]); // LTQ + register_subalias("4", m_I[1]); // BIQ + register_subalias("5", m_I[2]); // RBIQ + register_subalias("6", m_I[6]); // D + register_subalias("7", m_I[3]); // A + + register_subalias("9", m_Q[4]); // e + register_subalias("10", m_Q[3]); // d + register_subalias("11", m_Q[2]); // c + register_subalias("12", m_Q[1]); // b + register_subalias("13", m_Q[0]); // a + register_subalias("14", m_Q[6]); // g + register_subalias("15", m_Q[5]); // f } - if (!INPLOGIC(m_BIQ) || (INPLOGIC(m_BIQ) && !INPLOGIC(m_LTQ))) + #else + + NETLIB_UPDATE(7448) { - m_sub.m_A.inactivate(); - m_sub.m_B.inactivate(); - m_sub.m_C.inactivate(); - m_sub.m_D.inactivate(); - m_sub.m_RBIQ.inactivate(); - } else { - m_sub.m_RBIQ.activate(); - m_sub.m_D.activate(); - m_sub.m_C.activate(); - m_sub.m_B.activate(); - m_sub.m_A.activate(); - m_sub.do_update(); + if (!INPLOGIC(m_BIQ) || (INPLOGIC(m_BIQ) && !INPLOGIC(m_LTQ))) + { + m_A.inactivate(); + m_B.inactivate(); + m_C.inactivate(); + m_D.inactivate(); + m_RBIQ.inactivate(); + if (INPLOGIC(m_BIQ) && !INPLOGIC(m_LTQ)) + { + update_outputs(8); + } + else if (!INPLOGIC(m_BIQ)) + { + update_outputs(15); + } + } else { + m_RBIQ.activate(); + m_D.activate(); + m_C.activate(); + m_B.activate(); + m_A.activate(); + UINT8 v; + + v = (INPLOGIC(m_A) << 0) | (INPLOGIC(m_B) << 1) | (INPLOGIC(m_C) << 2) | (INPLOGIC(m_D) << 3); + if ((!INPLOGIC(m_RBIQ) && (v==0))) + v = 15; + update_outputs(v); + } } -} - -NETLIB_UPDATE(7448_sub) -{ - UINT8 v; - - v = (INPLOGIC(m_A) << 0) | (INPLOGIC(m_B) << 1) | (INPLOGIC(m_C) << 2) | (INPLOGIC(m_D) << 3); - if ((!INPLOGIC(m_RBIQ) && (v==0))) - v = 15; - update_outputs(v); -} - -NETLIB_FUNC_VOID(7448_sub, update_outputs, (UINT8 v)) -{ - nl_assert(v<16); - if (v != m_state) + NETLIB_RESET(7448) { - // max transfer time is 100 NS */ - - for (int i=0; i<7; i++) - OUTLOGIC(m_Q[i], tab7448[v][i], NLTIME_FROM_NS(100)); - m_state = v; + m_state = 0; + m_A.inactivate(); + m_B.inactivate(); + m_C.inactivate(); + m_D.inactivate(); + m_RBIQ.inactivate(); } -} -const UINT8 NETLIB_NAME(7448_sub)::tab7448[16][7] = -{ - { 1, 1, 1, 1, 1, 1, 0 }, /* 00 - not blanked ! */ - { 0, 1, 1, 0, 0, 0, 0 }, /* 01 */ - { 1, 1, 0, 1, 1, 0, 1 }, /* 02 */ - { 1, 1, 1, 1, 0, 0, 1 }, /* 03 */ - { 0, 1, 1, 0, 0, 1, 1 }, /* 04 */ - { 1, 0, 1, 1, 0, 1, 1 }, /* 05 */ - { 0, 0, 1, 1, 1, 1, 1 }, /* 06 */ - { 1, 1, 1, 0, 0, 0, 0 }, /* 07 */ - { 1, 1, 1, 1, 1, 1, 1 }, /* 08 */ - { 1, 1, 1, 0, 0, 1, 1 }, /* 09 */ - { 0, 0, 0, 1, 1, 0, 1 }, /* 10 */ - { 0, 0, 1, 1, 0, 0, 1 }, /* 11 */ - { 0, 1, 0, 0, 0, 1, 1 }, /* 12 */ - { 1, 0, 0, 1, 0, 1, 1 }, /* 13 */ - { 0, 0, 0, 1, 1, 1, 1 }, /* 14 */ - { 0, 0, 0, 0, 0, 0, 0 }, /* 15 */ -}; -#endif + NETLIB_FUNC_VOID(7448, update_outputs, (UINT8 v)) + { + nl_assert(v<16); + if (v != m_state) + { + // max transfer time is 100 NS */ + + for (int i=0; i<7; i++) + OUTLOGIC(m_Q[i], tab7448[v][i], NLTIME_FROM_NS(100)); + m_state = v; + } + } + + const UINT8 NETLIB_NAME(7448)::tab7448[16][7] = + { + { 1, 1, 1, 1, 1, 1, 0 }, /* 00 - not blanked ! */ + { 0, 1, 1, 0, 0, 0, 0 }, /* 01 */ + { 1, 1, 0, 1, 1, 0, 1 }, /* 02 */ + { 1, 1, 1, 1, 0, 0, 1 }, /* 03 */ + { 0, 1, 1, 0, 0, 1, 1 }, /* 04 */ + { 1, 0, 1, 1, 0, 1, 1 }, /* 05 */ + { 0, 0, 1, 1, 1, 1, 1 }, /* 06 */ + { 1, 1, 1, 0, 0, 0, 0 }, /* 07 */ + { 1, 1, 1, 1, 1, 1, 1 }, /* 08 */ + { 1, 1, 1, 0, 0, 1, 1 }, /* 09 */ + { 0, 0, 0, 1, 1, 0, 1 }, /* 10 */ + { 0, 0, 1, 1, 0, 0, 1 }, /* 11 */ + { 0, 1, 0, 0, 0, 1, 1 }, /* 12 */ + { 1, 0, 0, 1, 0, 1, 1 }, /* 13 */ + { 0, 0, 0, 1, 1, 1, 1 }, /* 14 */ + { 0, 0, 0, 0, 0, 0, 0 }, /* 15 */ + }; + #endif + + NETLIB_DEVICE_IMPL(7448) + NETLIB_DEVICE_IMPL(7448_dip) + } //namespace devices } // namespace netlist diff --git a/src/lib/netlist/devices/nld_7448.h b/src/lib/netlist/devices/nld_7448.h index 6803891990d..6fb139e13f8 100644 --- a/src/lib/netlist/devices/nld_7448.h +++ b/src/lib/netlist/devices/nld_7448.h @@ -40,121 +40,4 @@ #define TTL_7448_DIP(name) \ NET_REGISTER_DEV(TTL_7448_DIP, name) -namespace netlist -{ - namespace devices - { - -/* - * FIXME: Using truthtable is a lot slower than the explicit device - */ - -#define USE_TRUTHTABLE_7448 (0) - -#if (USE_TRUTHTABLE_7448 && USE_TRUTHTABLE) - -NETLIB_TRUTHTABLE(7448, 7, 7, 0); - -#else - -NETLIB_OBJECT(7448_sub) -{ - NETLIB_CONSTRUCTOR(7448_sub) - , m_state(0) - { - enregister("A0", m_A); - enregister("A1", m_B); - enregister("A2", m_C); - enregister("A3", m_D); - enregister("RBIQ", m_RBIQ); - - enregister("a", m_Q[0]); - enregister("b", m_Q[1]); - enregister("c", m_Q[2]); - enregister("d", m_Q[3]); - enregister("e", m_Q[4]); - enregister("f", m_Q[5]); - enregister("g", m_Q[6]); - - save(NLNAME(m_state)); - } - - NETLIB_RESETI() { m_state = 0; } - NETLIB_UPDATEI(); - -public: - ATTR_HOT void update_outputs(UINT8 v); - static const UINT8 tab7448[16][7]; - - logic_input_t m_A; - logic_input_t m_B; - logic_input_t m_C; - logic_input_t m_D; - logic_input_t m_RBIQ; - - UINT8 m_state; - - logic_output_t m_Q[7]; /* a .. g */ - -}; - -NETLIB_OBJECT(7448) -{ - NETLIB_CONSTRUCTOR(7448) - , m_sub(*this, "sub") - { - - register_subalias("A", m_sub.m_A); - register_subalias("B", m_sub.m_B); - register_subalias("C", m_sub.m_C); - register_subalias("D", m_sub.m_D); - enregister("LTQ", m_LTQ); - enregister("BIQ", m_BIQ); - register_subalias("RBIQ",m_sub.m_RBIQ); - - register_subalias("a", m_sub.m_Q[0]); - register_subalias("b", m_sub.m_Q[1]); - register_subalias("c", m_sub.m_Q[2]); - register_subalias("d", m_sub.m_Q[3]); - register_subalias("e", m_sub.m_Q[4]); - register_subalias("f", m_sub.m_Q[5]); - register_subalias("g", m_sub.m_Q[6]); - } - - NETLIB_RESETI() { m_sub.do_reset(); } - NETLIB_UPDATEI(); - -public: - NETLIB_SUB(7448_sub) m_sub; - - logic_input_t m_LTQ; - logic_input_t m_BIQ; -}; -#endif - -NETLIB_OBJECT_DERIVED(7448_dip, 7448) -{ - NETLIB_CONSTRUCTOR_DERIVED(7448_dip, 7448) - { - register_subalias("1", m_sub.m_B); - register_subalias("2", m_sub.m_C); - register_subalias("3", m_LTQ); - register_subalias("4", m_BIQ); - register_subalias("5",m_sub.m_RBIQ); - register_subalias("6", m_sub.m_D); - register_subalias("7", m_sub.m_A); - - register_subalias("9", m_sub.m_Q[4]); // e - register_subalias("10", m_sub.m_Q[3]); // d - register_subalias("11", m_sub.m_Q[2]); // c - register_subalias("12", m_sub.m_Q[1]); // b - register_subalias("13", m_sub.m_Q[0]); // a - register_subalias("14", m_sub.m_Q[6]); // g - register_subalias("15", m_sub.m_Q[5]); // f - } -}; - - } //namespace devices -} // namespace netlist - #endif /* NLD_7448_H_ */ diff --git a/src/lib/netlist/nl_base.h b/src/lib/netlist/nl_base.h index a6d2f0dc220..62b5e3748f0 100644 --- a/src/lib/netlist/nl_base.h +++ b/src/lib/netlist/nl_base.h @@ -399,7 +399,7 @@ namespace netlist public: void * operator new (size_t size, void *ptr) { return ptr; } - void operator delete (void *ptr, size_t size) { } + void operator delete (void *ptr, void *) { } void * operator new (size_t size); void operator delete (void * mem); }; @@ -1008,6 +1008,8 @@ namespace netlist ATTR_HOT netlist_sig_t INPLOGIC(const logic_input_t &inp) const { + //if (inp.state() == logic_t::STATE_INP_PASSIVE) + // printf("argh input %s\n", inp.name().cstr()); nl_assert(inp.state() != logic_t::STATE_INP_PASSIVE); return inp.Q(); } From 7ea8859fc843eaf2d20106912d34aa927bde8608 Mon Sep 17 00:00:00 2001 From: couriersud Date: Sun, 29 May 2016 13:52:21 +0200 Subject: [PATCH 10/44] Moved more device definitions into cpp files. (nw) --- src/lib/netlist/devices/net_lib.cpp | 44 +-- src/lib/netlist/devices/nld_4020.cpp | 150 +++++++--- src/lib/netlist/devices/nld_4020.h | 98 +----- src/lib/netlist/devices/nld_4066.cpp | 78 +++-- src/lib/netlist/devices/nld_4066.h | 35 +-- src/lib/netlist/devices/nld_74107.cpp | 231 ++++++++++---- src/lib/netlist/devices/nld_74107.h | 126 +------- src/lib/netlist/devices/nld_74123.cpp | 398 ++++++++++++++++++------- src/lib/netlist/devices/nld_74123.h | 191 +----------- src/lib/netlist/devices/nld_74153.cpp | 144 +++++++-- src/lib/netlist/devices/nld_74153.h | 115 +------ src/lib/netlist/devices/nld_74175.cpp | 181 ++++++++--- src/lib/netlist/devices/nld_74175.h | 101 +------ src/lib/netlist/devices/nld_74193.cpp | 173 ++++++++--- src/lib/netlist/devices/nld_74193.h | 87 +----- src/lib/netlist/devices/nld_7448.h | 18 +- src/lib/netlist/devices/nld_legacy.cpp | 121 +++++--- src/lib/netlist/devices/nld_legacy.h | 60 +--- src/lib/netlist/devices/nld_log.cpp | 105 +++++-- src/lib/netlist/devices/nld_log.h | 52 +--- 20 files changed, 1233 insertions(+), 1275 deletions(-) diff --git a/src/lib/netlist/devices/net_lib.cpp b/src/lib/netlist/devices/net_lib.cpp index 7952fc24677..86482e40da1 100644 --- a/src/lib/netlist/devices/net_lib.cpp +++ b/src/lib/netlist/devices/net_lib.cpp @@ -93,8 +93,8 @@ void initialize_factory(factory_list_t &factory) ENTRY(logic_input, TTL_INPUT, "IN") ENTRY(logic_input, LOGIC_INPUT, "IN,FAMILY") ENTRY(analog_input, ANALOG_INPUT, "IN") - ENTRY(log, LOG, "+I") - ENTRY(logD, LOGD, "+I,I2") + ENTRYX(log, LOG, "+I") + ENTRYX(logD, LOGD, "+I,I2") ENTRY(clock, CLOCK, "FREQ") ENTRY(extclock, EXTCLOCK, "FREQ") ENTRY(mainclock, MAINCLOCK, "FREQ") @@ -104,50 +104,50 @@ void initialize_factory(factory_list_t &factory) ENTRY(res_sw, RES_SWITCH, "+IN,P1,P2") ENTRY(switch1, SWITCH, "-") ENTRY(switch2, SWITCH2, "-") - ENTRY(nicRSFF, NETDEV_RSFF, "+S,R") - ENTRY(nicDelay, NETDEV_DELAY, "-") + ENTRYX(nicRSFF, NETDEV_RSFF, "+S,R") + ENTRYX(nicDelay, NETDEV_DELAY, "-") ENTRY(7450, TTL_7450_ANDORINVERT, "+A,B,C,D") - ENTRYX(7448, TTL_7448, "+A,B,C,D,LTQ,BIQ,RBIQ") + ENTRYX(7448, TTL_7448, "+A,B,C,D,LTQ,BIQ,RBIQ") ENTRY(7474, TTL_7474, "+CLK,D,CLRQ,PREQ") ENTRY(7483, TTL_7483, "+A1,A2,A3,A4,B1,B2,B3,B4,C0") ENTRY(7490, TTL_7490, "+A,B,R1,R2,R91,R92") ENTRY(7493, TTL_7493, "+CLKA,CLKB,R1,R2") - ENTRY(74107, TTL_74107, "+CLK,J,K,CLRQ") - ENTRY(74107A, TTL_74107A, "+CLK,J,K,CLRQ") - ENTRY(74123, TTL_74123, "-") - ENTRY(74153, TTL_74153, "+C0,C1,C2,C3,A,B,G") - ENTRY(74175, TTL_74175, "-") + ENTRYX(74107, TTL_74107, "+CLK,J,K,CLRQ") + ENTRYX(74107A, TTL_74107A, "+CLK,J,K,CLRQ") + ENTRYX(74123, TTL_74123, "-") + ENTRYX(74153, TTL_74153, "+C0,C1,C2,C3,A,B,G") + ENTRYX(74175, TTL_74175, "-") ENTRY(74192, TTL_74192, "-") - ENTRY(74193, TTL_74193, "-") + ENTRYX(74193, TTL_74193, "-") //ENTRY(74279, TTL_74279, "-") // only dip available ENTRY(SN74LS629, SN74LS629, "CAP") ENTRY(82S16, TTL_82S16, "-") ENTRY(9310, TTL_9310, "-") ENTRY(9312, TTL_9312, "-") ENTRY(9316, TTL_9316, "+CLK,ENP,ENT,CLRQ,LOADQ,A,B,C,D") - ENTRY(CD4020, CD4020, "") - ENTRY(CD4066_GATE, CD4066_GATE, "") + ENTRYX(CD4020, CD4020, "") + ENTRYX(CD4066_GATE, CD4066_GATE, "") /* entries with suffix WI are legacy only */ - ENTRY(CD4020, CD4020_WI, "+IP,RESET,VDD,VSS") + ENTRYX(CD4020, CD4020_WI, "+IP,RESET,VDD,VSS") //ENTRY(4066, CD_4066, "+A,B") ENTRY(NE555, NE555, "-") ENTRY(r2r_dac, R2R_DAC, "+VIN,R,N") - ENTRY(4538_dip, CD4538_DIP, "-") - ENTRYX(7448_dip, TTL_7448_DIP, "-") + ENTRYX(4538_dip, CD4538_DIP, "-") + ENTRYX(7448_dip, TTL_7448_DIP, "-") ENTRY(7450_dip, TTL_7450_DIP, "-") ENTRY(7474_dip, TTL_7474_DIP, "-") ENTRY(7483_dip, TTL_7483_DIP, "-") ENTRY(7490_dip, TTL_7490_DIP, "-") ENTRY(7493_dip, TTL_7493_DIP, "-") - ENTRY(74107_dip, TTL_74107_DIP, "-") - ENTRY(74123_dip, TTL_74123_DIP, "-") - ENTRY(74153_dip, TTL_74153_DIP, "-") - ENTRY(74175_dip, TTL_74175_DIP, "-") + ENTRYX(74107_dip, TTL_74107_DIP, "-") + ENTRYX(74123_dip, TTL_74123_DIP, "-") + ENTRYX(74153_dip, TTL_74153_DIP, "-") + ENTRYX(74175_dip, TTL_74175_DIP, "-") ENTRY(74192_dip, TTL_74192_DIP, "-") - ENTRY(74193_dip, TTL_74193_DIP, "-") + ENTRYX(74193_dip, TTL_74193_DIP, "-") ENTRYX(74279_dip, TTL_74279_DIP, "-") ENTRY(82S16_dip, TTL_82S16_DIP, "-") - ENTRY(9602_dip, TTL_9602_DIP, "-") + ENTRYX(9602_dip, TTL_9602_DIP, "-") ENTRY(9310_dip, TTL_9310_DIP, "-") ENTRY(9312_dip, TTL_9312_DIP, "-") ENTRY(9316_dip, TTL_9316_DIP, "-") diff --git a/src/lib/netlist/devices/nld_4020.cpp b/src/lib/netlist/devices/nld_4020.cpp index 239dfb43844..fd384777104 100644 --- a/src/lib/netlist/devices/nld_4020.cpp +++ b/src/lib/netlist/devices/nld_4020.cpp @@ -6,52 +6,130 @@ */ #include "nld_4020.h" +#include "nld_cmos.h" namespace netlist { namespace devices { - -NETLIB_UPDATE(CD4020_sub) -{ - UINT8 cnt = m_cnt; - cnt = ( cnt + 1) & 0x3fff; - update_outputs(cnt); - m_cnt = cnt; -} - -NETLIB_UPDATE(CD4020) -{ - if (INPLOGIC(m_RESET)) + NETLIB_OBJECT(CD4020_sub) { - m_sub.m_cnt = 0; - m_sub.m_IP.inactivate(); - /* static */ const netlist_time reset_time = netlist_time::from_nsec(140); - OUTLOGIC(m_sub.m_Q[0], 0, reset_time); - for (int i=3; i<14; i++) - OUTLOGIC(m_sub.m_Q[i], 0, reset_time); - } - else - m_sub.m_IP.activate_hl(); -} + NETLIB_CONSTRUCTOR(CD4020_sub) + NETLIB_FAMILY("CD4XXX") + , m_cnt(0) + { + enregister("IP", m_IP); -inline NETLIB_FUNC_VOID(CD4020_sub, update_outputs, (const UINT16 cnt)) -{ - /* static */ const netlist_time out_delayQn[14] = { - NLTIME_FROM_NS(180), NLTIME_FROM_NS(280), - NLTIME_FROM_NS(380), NLTIME_FROM_NS(480), - NLTIME_FROM_NS(580), NLTIME_FROM_NS(680), - NLTIME_FROM_NS(780), NLTIME_FROM_NS(880), - NLTIME_FROM_NS(980), NLTIME_FROM_NS(1080), - NLTIME_FROM_NS(1180), NLTIME_FROM_NS(1280), - NLTIME_FROM_NS(1380), NLTIME_FROM_NS(1480), + enregister("Q1", m_Q[0]); + enregister("Q4", m_Q[3]); + enregister("Q5", m_Q[4]); + enregister("Q6", m_Q[5]); + enregister("Q7", m_Q[6]); + enregister("Q8", m_Q[7]); + enregister("Q9", m_Q[8]); + enregister("Q10", m_Q[9]); + enregister("Q11", m_Q[10]); + enregister("Q12", m_Q[11]); + enregister("Q13", m_Q[12]); + enregister("Q14", m_Q[13]); + + save(NLNAME(m_cnt)); + } + + NETLIB_RESETI() + { + m_IP.set_state(logic_t::STATE_INP_HL); + m_cnt = 0; + } + + NETLIB_UPDATEI(); + + public: + ATTR_HOT void update_outputs(const UINT16 cnt); + + logic_input_t m_IP; + logic_output_t m_Q[14]; + + UINT16 m_cnt; }; - OUTLOGIC(m_Q[0], 0, out_delayQn[0]); - for (int i=3; i<14; i++) - OUTLOGIC(m_Q[i], (cnt >> i) & 1, out_delayQn[i]); -} + NETLIB_OBJECT(CD4020) + { + NETLIB_CONSTRUCTOR(CD4020) + NETLIB_FAMILY("CD4XXX") + , m_sub(*this, "sub") + , m_supply(*this, "supply") + { + + enregister("RESET", m_RESET); + register_subalias("IP", m_sub.m_IP); + register_subalias("Q1", m_sub.m_Q[0]); + register_subalias("Q4", m_sub.m_Q[3]); + register_subalias("Q5", m_sub.m_Q[4]); + register_subalias("Q6", m_sub.m_Q[5]); + register_subalias("Q7", m_sub.m_Q[6]); + register_subalias("Q8", m_sub.m_Q[7]); + register_subalias("Q9", m_sub.m_Q[8]); + register_subalias("Q10", m_sub.m_Q[9]); + register_subalias("Q11", m_sub.m_Q[10]); + register_subalias("Q12", m_sub.m_Q[11]); + register_subalias("Q13", m_sub.m_Q[12]); + register_subalias("Q14", m_sub.m_Q[13]); + register_subalias("VDD", m_supply.m_vdd); + register_subalias("VSS", m_supply.m_vss); + } + NETLIB_RESETI() { } + NETLIB_UPDATEI(); + + private: + NETLIB_SUB(CD4020_sub) m_sub; + NETLIB_SUB(vdd_vss) m_supply; + logic_input_t m_RESET; + }; + + + NETLIB_UPDATE(CD4020_sub) + { + UINT8 cnt = m_cnt; + cnt = ( cnt + 1) & 0x3fff; + update_outputs(cnt); + m_cnt = cnt; + } + + NETLIB_UPDATE(CD4020) + { + if (INPLOGIC(m_RESET)) + { + m_sub.m_cnt = 0; + m_sub.m_IP.inactivate(); + /* static */ const netlist_time reset_time = netlist_time::from_nsec(140); + OUTLOGIC(m_sub.m_Q[0], 0, reset_time); + for (int i=3; i<14; i++) + OUTLOGIC(m_sub.m_Q[i], 0, reset_time); + } + else + m_sub.m_IP.activate_hl(); + } + + inline NETLIB_FUNC_VOID(CD4020_sub, update_outputs, (const UINT16 cnt)) + { + /* static */ const netlist_time out_delayQn[14] = { + NLTIME_FROM_NS(180), NLTIME_FROM_NS(280), + NLTIME_FROM_NS(380), NLTIME_FROM_NS(480), + NLTIME_FROM_NS(580), NLTIME_FROM_NS(680), + NLTIME_FROM_NS(780), NLTIME_FROM_NS(880), + NLTIME_FROM_NS(980), NLTIME_FROM_NS(1080), + NLTIME_FROM_NS(1180), NLTIME_FROM_NS(1280), + NLTIME_FROM_NS(1380), NLTIME_FROM_NS(1480), + }; + + OUTLOGIC(m_Q[0], 0, out_delayQn[0]); + for (int i=3; i<14; i++) + OUTLOGIC(m_Q[i], (cnt >> i) & 1, out_delayQn[i]); + } + + NETLIB_DEVICE_IMPL(CD4020) } //namespace devices } // namespace netlist diff --git a/src/lib/netlist/devices/nld_4020.h b/src/lib/netlist/devices/nld_4020.h index b6b097e92c5..11b174e97f5 100644 --- a/src/lib/netlist/devices/nld_4020.h +++ b/src/lib/netlist/devices/nld_4020.h @@ -27,101 +27,17 @@ #ifndef NLD_4020_H_ #define NLD_4020_H_ -#include "nl_base.h" -#include "nld_cmos.h" +#include "nl_setup.h" /* FIXME: only used in mario.c */ -#define CD4020_WI(name, cIP, cRESET, cVDD, cVSS) \ - NET_REGISTER_DEV(CD4020_WI, name) \ - NET_CONNECT(name, IP, cIP) \ - NET_CONNECT(name, RESET, cRESET) \ - NET_CONNECT(name, VDD, cVDD) \ +#define CD4020_WI(name, cIP, cRESET, cVDD, cVSS) \ + NET_REGISTER_DEV(CD4020_WI, name) \ + NET_CONNECT(name, IP, cIP) \ + NET_CONNECT(name, RESET, cRESET) \ + NET_CONNECT(name, VDD, cVDD) \ NET_CONNECT(name, VSS, cVSS) -#define CD4020(name) \ +#define CD4020(name) \ NET_REGISTER_DEV(CD4020, name) -namespace netlist -{ - namespace devices - { - -NETLIB_OBJECT(CD4020_sub) -{ - NETLIB_CONSTRUCTOR(CD4020_sub) - NETLIB_FAMILY("CD4XXX") - , m_cnt(0) - { - enregister("IP", m_IP); - - enregister("Q1", m_Q[0]); - enregister("Q4", m_Q[3]); - enregister("Q5", m_Q[4]); - enregister("Q6", m_Q[5]); - enregister("Q7", m_Q[6]); - enregister("Q8", m_Q[7]); - enregister("Q9", m_Q[8]); - enregister("Q10", m_Q[9]); - enregister("Q11", m_Q[10]); - enregister("Q12", m_Q[11]); - enregister("Q13", m_Q[12]); - enregister("Q14", m_Q[13]); - - save(NLNAME(m_cnt)); - } - - NETLIB_RESETI() - { - m_IP.set_state(logic_t::STATE_INP_HL); - m_cnt = 0; - } - - NETLIB_UPDATEI(); - -public: - ATTR_HOT void update_outputs(const UINT16 cnt); - - logic_input_t m_IP; - logic_output_t m_Q[14]; - - UINT16 m_cnt; -}; - -NETLIB_OBJECT(CD4020) -{ - NETLIB_CONSTRUCTOR(CD4020) - NETLIB_FAMILY("CD4XXX") - , m_sub(*this, "sub") - , m_supply(*this, "supply") - { - - enregister("RESET", m_RESET); - register_subalias("IP", m_sub.m_IP); - register_subalias("Q1", m_sub.m_Q[0]); - register_subalias("Q4", m_sub.m_Q[3]); - register_subalias("Q5", m_sub.m_Q[4]); - register_subalias("Q6", m_sub.m_Q[5]); - register_subalias("Q7", m_sub.m_Q[6]); - register_subalias("Q8", m_sub.m_Q[7]); - register_subalias("Q9", m_sub.m_Q[8]); - register_subalias("Q10", m_sub.m_Q[9]); - register_subalias("Q11", m_sub.m_Q[10]); - register_subalias("Q12", m_sub.m_Q[11]); - register_subalias("Q13", m_sub.m_Q[12]); - register_subalias("Q14", m_sub.m_Q[13]); - register_subalias("VDD", m_supply.m_vdd); - register_subalias("VSS", m_supply.m_vss); - } - NETLIB_RESETI() { } - NETLIB_UPDATEI(); - -private: - NETLIB_SUB(CD4020_sub) m_sub; - NETLIB_SUB(vdd_vss) m_supply; - logic_input_t m_RESET; -}; - - } //namespace devices -} // namespace netlist - #endif /* NLD_4020_H_ */ diff --git a/src/lib/netlist/devices/nld_4066.cpp b/src/lib/netlist/devices/nld_4066.cpp index a5958f908e1..0f9c86d4f46 100644 --- a/src/lib/netlist/devices/nld_4066.cpp +++ b/src/lib/netlist/devices/nld_4066.cpp @@ -6,46 +6,70 @@ */ #include "nld_4066.h" +#include "nld_cmos.h" namespace netlist { namespace devices { -NETLIB_UPDATE(CD4066_GATE) -{ - nl_double sup = (m_supply.vdd() - m_supply.vss()); - nl_double low = NL_FCONST(0.45) * sup; - nl_double high = NL_FCONST(0.55) * sup; - nl_double in = INPANALOG(m_control) - m_supply.vss(); - nl_double rON = m_base_r * NL_FCONST(5.0) / sup; - nl_double R = -1.0; - - if (in < low) + NETLIB_OBJECT(CD4066_GATE) { - R = NL_FCONST(1.0) / netlist().gmin(); - } - else if (in > high) - { - R = rON; - } - if (R > NL_FCONST(0.0)) - { - // We only need to update the net first if this is a time stepping net - if (1) // m_R.m_P.net().as_analog().solver().is_timestep()) + NETLIB_CONSTRUCTOR(CD4066_GATE) + NETLIB_FAMILY("CD4XXX") + , m_supply(*this, "PS") + , m_R(*this, "R") + , m_base_r(*this, "BASER", 270.0) { - m_R.update_dev(); - m_R.set_R(R); - m_R.m_P.schedule_after(NLTIME_FROM_NS(1)); + enregister("CTL", m_control); } - else + + NETLIB_RESETI() { } + NETLIB_UPDATEI(); + + public: + NETLIB_SUB(vdd_vss) m_supply; + NETLIB_SUB(R) m_R; + + analog_input_t m_control; + param_double_t m_base_r; + }; + + NETLIB_UPDATE(CD4066_GATE) + { + nl_double sup = (m_supply.vdd() - m_supply.vss()); + nl_double low = NL_FCONST(0.45) * sup; + nl_double high = NL_FCONST(0.55) * sup; + nl_double in = INPANALOG(m_control) - m_supply.vss(); + nl_double rON = m_base_r * NL_FCONST(5.0) / sup; + nl_double R = -1.0; + + if (in < low) { - m_R.set_R(R); - m_R.update_dev(); + R = NL_FCONST(1.0) / netlist().gmin(); + } + else if (in > high) + { + R = rON; + } + if (R > NL_FCONST(0.0)) + { + // We only need to update the net first if this is a time stepping net + if (1) // m_R.m_P.net().as_analog().solver().is_timestep()) + { + m_R.update_dev(); + m_R.set_R(R); + m_R.m_P.schedule_after(NLTIME_FROM_NS(1)); + } + else + { + m_R.set_R(R); + m_R.update_dev(); + } } } -} + NETLIB_DEVICE_IMPL(CD4066_GATE) } //namespace devices } // namespace netlist diff --git a/src/lib/netlist/devices/nld_4066.h b/src/lib/netlist/devices/nld_4066.h index 697e1e739f5..570f9ecf16d 100644 --- a/src/lib/netlist/devices/nld_4066.h +++ b/src/lib/netlist/devices/nld_4066.h @@ -24,40 +24,9 @@ #ifndef NLD_4066_H_ #define NLD_4066_H_ -#include "nl_base.h" -#include "nld_cmos.h" +#include "nl_setup.h" -#define CD4066_GATE(name) \ +#define CD4066_GATE(name) \ NET_REGISTER_DEV(CD4066_GATE, name) -namespace netlist -{ - namespace devices - { - -NETLIB_OBJECT(CD4066_GATE) -{ - NETLIB_CONSTRUCTOR(CD4066_GATE) - NETLIB_FAMILY("CD4XXX") - , m_supply(*this, "PS") - , m_R(*this, "R") - , m_base_r(*this, "BASER", 270.0) - { - enregister("CTL", m_control); - } - - NETLIB_RESETI() { } - NETLIB_UPDATEI(); - -public: - NETLIB_SUB(vdd_vss) m_supply; - NETLIB_SUB(R) m_R; - - analog_input_t m_control; - param_double_t m_base_r; -}; - - } //namespace devices -} // namespace netlist - #endif /* NLD_4066_H_ */ diff --git a/src/lib/netlist/devices/nld_74107.cpp b/src/lib/netlist/devices/nld_74107.cpp index 7176daa8c71..cc0746fe131 100644 --- a/src/lib/netlist/devices/nld_74107.cpp +++ b/src/lib/netlist/devices/nld_74107.cpp @@ -12,73 +12,178 @@ namespace netlist namespace devices { -NETLIB_RESET(74107Asub) -{ - m_clk.set_state(logic_t::STATE_INP_HL); - //m_Q.initial(0); - //m_QQ.initial(1); - - m_Q1 = 0; - m_Q2 = 0; - m_F = 0; -} - -ATTR_HOT inline void NETLIB_NAME(74107Asub)::newstate(const netlist_sig_t state) -{ - const netlist_time delay[2] = { NLTIME_FROM_NS(25), NLTIME_FROM_NS(40) }; - - OUTLOGIC(m_Q, state, delay[state]); - OUTLOGIC(m_QQ, state ^ 1, delay[state ^ 1]); -} - -NETLIB_UPDATE(74107Asub) -{ - const netlist_sig_t t = m_Q.net().as_logic().Q(); - newstate(((t ^ 1) & m_Q1) | (t & m_Q2) | m_F); - if (m_Q1 ^ 1) - m_clk.inactivate(); -} - -NETLIB_UPDATE(74107A) -{ - const UINT8 JK = (INPLOGIC(m_J) << 1) | INPLOGIC(m_K); - - switch (JK) + NETLIB_OBJECT(74107Asub) { - case 0: - m_sub.m_Q1 = 0; - m_sub.m_Q2 = 1; - m_sub.m_F = 0; + NETLIB_CONSTRUCTOR(74107Asub) + , m_Q1(0) + , m_Q2(0) + , m_F(0) + + { + enregister("CLK", m_clk); + enregister("Q", m_Q); + enregister("QQ", m_QQ); + + save(NLNAME(m_Q1)); + save(NLNAME(m_Q2)); + save(NLNAME(m_F)); + } + + NETLIB_RESETI(); + NETLIB_UPDATEI(); + + public: + logic_input_t m_clk; + + logic_output_t m_Q; + logic_output_t m_QQ; + + netlist_sig_t m_Q1; + netlist_sig_t m_Q2; + netlist_sig_t m_F; + + ATTR_HOT void newstate(const netlist_sig_t state); + + }; + + NETLIB_OBJECT(74107A) + { + NETLIB_CONSTRUCTOR(74107A) + , m_sub(*this, "sub") + { + + register_subalias("CLK", m_sub.m_clk); + enregister("J", m_J); + enregister("K", m_K); + enregister("CLRQ", m_clrQ); + register_subalias("Q", m_sub.m_Q); + register_subalias("QQ", m_sub.m_QQ); + } + + //NETLIB_RESETI(); + NETLIB_UPDATEI(); + public: + NETLIB_SUB(74107Asub) m_sub; + + logic_input_t m_J; + logic_input_t m_K; + logic_input_t m_clrQ; + + }; + + NETLIB_OBJECT_DERIVED(74107, 74107A) + { + public: + NETLIB_CONSTRUCTOR_DERIVED(74107, 74107A) { } + + }; + + NETLIB_OBJECT(74107_dip) + { + NETLIB_CONSTRUCTOR(74107_dip) + , m_1(*this, "1") + , m_2(*this, "2") + { + + register_subalias("1", m_1.m_J); + register_subalias("2", m_1.m_sub.m_QQ); + register_subalias("3", m_1.m_sub.m_Q); + + register_subalias("4", m_1.m_K); + register_subalias("5", m_2.m_sub.m_Q); + register_subalias("6", m_2.m_sub.m_QQ); + + // register_subalias("7", ); ==> GND + + register_subalias("8", m_2.m_J); + register_subalias("9", m_2.m_sub.m_clk); + register_subalias("10", m_2.m_clrQ); + + register_subalias("11", m_2.m_K); + register_subalias("12", m_1.m_sub.m_clk); + register_subalias("13", m_1.m_clrQ); + + // register_subalias("14", ); ==> VCC + + } + //NETLIB_RESETI(); + //NETLIB_UPDATEI(); + + private: + NETLIB_SUB(74107) m_1; + NETLIB_SUB(74107) m_2; + }; + + NETLIB_RESET(74107Asub) + { + m_clk.set_state(logic_t::STATE_INP_HL); + //m_Q.initial(0); + //m_QQ.initial(1); + + m_Q1 = 0; + m_Q2 = 0; + m_F = 0; + } + + ATTR_HOT inline void NETLIB_NAME(74107Asub)::newstate(const netlist_sig_t state) + { + const netlist_time delay[2] = { NLTIME_FROM_NS(25), NLTIME_FROM_NS(40) }; + + OUTLOGIC(m_Q, state, delay[state]); + OUTLOGIC(m_QQ, state ^ 1, delay[state ^ 1]); + } + + NETLIB_UPDATE(74107Asub) + { + const netlist_sig_t t = m_Q.net().as_logic().Q(); + newstate(((t ^ 1) & m_Q1) | (t & m_Q2) | m_F); + if (m_Q1 ^ 1) + m_clk.inactivate(); + } + + NETLIB_UPDATE(74107A) + { + const UINT8 JK = (INPLOGIC(m_J) << 1) | INPLOGIC(m_K); + + switch (JK) + { + case 0: + m_sub.m_Q1 = 0; + m_sub.m_Q2 = 1; + m_sub.m_F = 0; + m_sub.m_clk.inactivate(); + break; + case 1: // (!INPLOGIC(m_J) & INPLOGIC(m_K)) + m_sub.m_Q1 = 0; + m_sub.m_Q2 = 0; + m_sub.m_F = 0; + break; + case 2: // (INPLOGIC(m_J) & !INPLOGIC(m_K)) + m_sub.m_Q1 = 0; + m_sub.m_Q2 = 0; + m_sub.m_F = 1; + break; + case 3: // (INPLOGIC(m_J) & INPLOGIC(m_K)) + m_sub.m_Q1 = 1; + m_sub.m_Q2 = 0; + m_sub.m_F = 0; + break; + default: + break; + } + + if (!INPLOGIC(m_clrQ)) + { m_sub.m_clk.inactivate(); - break; - case 1: // (!INPLOGIC(m_J) & INPLOGIC(m_K)) - m_sub.m_Q1 = 0; - m_sub.m_Q2 = 0; - m_sub.m_F = 0; - break; - case 2: // (INPLOGIC(m_J) & !INPLOGIC(m_K)) - m_sub.m_Q1 = 0; - m_sub.m_Q2 = 0; - m_sub.m_F = 1; - break; - case 3: // (INPLOGIC(m_J) & INPLOGIC(m_K)) - m_sub.m_Q1 = 1; - m_sub.m_Q2 = 0; - m_sub.m_F = 0; - break; - default: - break; + m_sub.newstate(0); + } + else if (!m_sub.m_Q2) + m_sub.m_clk.activate_hl(); } - if (!INPLOGIC(m_clrQ)) - { - m_sub.m_clk.inactivate(); - m_sub.newstate(0); - } - else if (!m_sub.m_Q2) - m_sub.m_clk.activate_hl(); -} - + NETLIB_DEVICE_IMPL(74107) + NETLIB_DEVICE_IMPL(74107A) + NETLIB_DEVICE_IMPL(74107_dip) } //namespace devices } // namespace netlist diff --git a/src/lib/netlist/devices/nld_74107.h b/src/lib/netlist/devices/nld_74107.h index 6bcdb21dcf6..ea73256e818 100644 --- a/src/lib/netlist/devices/nld_74107.h +++ b/src/lib/netlist/devices/nld_74107.h @@ -59,129 +59,19 @@ #ifndef NLD_74107_H_ #define NLD_74107_H_ -#include "nl_base.h" +#include "nl_setup.h" -#define TTL_74107A(name, cCLK, cJ, cK, cCLRQ) \ - NET_REGISTER_DEV(TTL_74107A, name) \ - NET_CONNECT(name, CLK, cCLK) \ - NET_CONNECT(name, J, cJ) \ - NET_CONNECT(name, K, cK) \ +#define TTL_74107A(name, cCLK, cJ, cK, cCLRQ) \ + NET_REGISTER_DEV(TTL_74107A, name) \ + NET_CONNECT(name, CLK, cCLK) \ + NET_CONNECT(name, J, cJ) \ + NET_CONNECT(name, K, cK) \ NET_CONNECT(name, CLRQ, cCLRQ) -#define TTL_74107(name, cCLK, cJ, cK, cCLRQ) \ +#define TTL_74107(name, cCLK, cJ, cK, cCLRQ) \ TTL_74107A(name, cCLK, cJ, cK, cCLRQ) -#define TTL_74107_DIP(name) \ +#define TTL_74107_DIP(name) \ NET_REGISTER_DEV(TTL_74107_DIP, name) -namespace netlist -{ - namespace devices - { - -NETLIB_OBJECT(74107Asub) -{ - NETLIB_CONSTRUCTOR(74107Asub) - , m_Q1(0) - , m_Q2(0) - , m_F(0) - - { - enregister("CLK", m_clk); - enregister("Q", m_Q); - enregister("QQ", m_QQ); - - save(NLNAME(m_Q1)); - save(NLNAME(m_Q2)); - save(NLNAME(m_F)); - } - - NETLIB_RESETI(); - NETLIB_UPDATEI(); - -public: - logic_input_t m_clk; - - logic_output_t m_Q; - logic_output_t m_QQ; - - netlist_sig_t m_Q1; - netlist_sig_t m_Q2; - netlist_sig_t m_F; - - ATTR_HOT void newstate(const netlist_sig_t state); - -}; - -NETLIB_OBJECT(74107A) -{ - NETLIB_CONSTRUCTOR(74107A) - , m_sub(*this, "sub") - { - - register_subalias("CLK", m_sub.m_clk); - enregister("J", m_J); - enregister("K", m_K); - enregister("CLRQ", m_clrQ); - register_subalias("Q", m_sub.m_Q); - register_subalias("QQ", m_sub.m_QQ); - } - - //NETLIB_RESETI(); - NETLIB_UPDATEI(); -public: - NETLIB_SUB(74107Asub) m_sub; - - logic_input_t m_J; - logic_input_t m_K; - logic_input_t m_clrQ; - -}; - -NETLIB_OBJECT_DERIVED(74107, 74107A) -{ -public: - NETLIB_CONSTRUCTOR_DERIVED(74107, 74107A) { } - -}; - -NETLIB_OBJECT(74107_dip) -{ - NETLIB_CONSTRUCTOR(74107_dip) - , m_1(*this, "1") - , m_2(*this, "2") - { - - register_subalias("1", m_1.m_J); - register_subalias("2", m_1.m_sub.m_QQ); - register_subalias("3", m_1.m_sub.m_Q); - - register_subalias("4", m_1.m_K); - register_subalias("5", m_2.m_sub.m_Q); - register_subalias("6", m_2.m_sub.m_QQ); - - // register_subalias("7", ); ==> GND - - register_subalias("8", m_2.m_J); - register_subalias("9", m_2.m_sub.m_clk); - register_subalias("10", m_2.m_clrQ); - - register_subalias("11", m_2.m_K); - register_subalias("12", m_1.m_sub.m_clk); - register_subalias("13", m_1.m_clrQ); - - // register_subalias("14", ); ==> VCC - - } - //NETLIB_RESETI(); - //NETLIB_UPDATEI(); - -private: - NETLIB_SUB(74107) m_1; - NETLIB_SUB(74107) m_2; -}; - - } //namespace devices -} // namespace netlist - #endif /* NLD_74107_H_ */ diff --git a/src/lib/netlist/devices/nld_74123.cpp b/src/lib/netlist/devices/nld_74123.cpp index ad5db3d104e..0d91a312858 100644 --- a/src/lib/netlist/devices/nld_74123.cpp +++ b/src/lib/netlist/devices/nld_74123.cpp @@ -7,6 +7,9 @@ #include "nld_74123.h" +#include "nld_system.h" +#include "analog/nld_twoterm.h" + #define R_OFF (1E20) #define R_ON (m_RI.Value()) @@ -15,131 +18,304 @@ namespace netlist namespace devices { -NETLIB_UPDATE(74123) -{ - netlist_sig_t m_trig; - netlist_sig_t res = !INPLOGIC(m_CLRQ); - netlist_time t_AB_to_Q = NLTIME_FROM_NS(10); - netlist_time t_C_to_Q = NLTIME_FROM_NS(10); - - if (m_dev_type == 74123) + NETLIB_OBJECT(74123) { - m_trig = (INPLOGIC(m_A) ^ 1) & INPLOGIC(m_B) & INPLOGIC(m_CLRQ); - } - else if (m_dev_type == 9602) - { - m_trig = (INPLOGIC(m_A) ^ 1) | INPLOGIC(m_B); - } - else // 4538 - { - m_trig = (INPLOGIC(m_B) ^ 1) | INPLOGIC(m_A); - // The line below is from the datasheet truthtable ... doesn't make sense at all - //res = res | INPLOGIC(m_A) | (INPLOGIC(m_B) ^ 1); - t_AB_to_Q = NLTIME_FROM_NS(300); - t_C_to_Q = NLTIME_FROM_NS(250); - } - - if (res) - { - OUTLOGIC(m_Q, 0, t_C_to_Q); - OUTLOGIC(m_QQ, 1, t_C_to_Q); - /* quick charge until trigger */ - /* FIXME: SGS datasheet shows quick charge to 5V, - * though schematics indicate quick charge to Vhigh only. - */ - OUTLOGIC(m_RP_Q, 1, t_C_to_Q); // R_ON - OUTLOGIC(m_RN_Q, 0, t_C_to_Q); // R_OFF - m_state = 2; //charging (quick) - } - else if (!m_last_trig && m_trig) - { - // FIXME: Timing! - OUTLOGIC(m_Q, 1, t_AB_to_Q); - OUTLOGIC(m_QQ, 0,t_AB_to_Q); - - OUTLOGIC(m_RN_Q, 1, t_AB_to_Q); // R_ON - OUTLOGIC(m_RP_Q, 0, t_AB_to_Q); // R_OFF - - m_state = 1; // discharging - } - - m_last_trig = m_trig; - - if (m_state == 1) - { - const nl_double vLow = m_KP * TERMANALOG(m_RP.m_R.m_P); - if (INPANALOG(m_CV) < vLow) + NETLIB_CONSTRUCTOR_EX(74123, int dev_type = 74123) + , m_dev_type(dev_type) + , m_RP(*this, "RP") + , m_RN(*this, "RN") + , m_K(*this, "K", (m_dev_type == 4538) ? 0.4 : 0.4) + , m_RI(*this, "RI", 400.0) // around 250 for HC series, 400 on LS/TTL, estimated from datasheets { - OUTLOGIC(m_RN_Q, 0, NLTIME_FROM_NS(10)); // R_OFF - m_state = 2; // charging + if ((m_dev_type != 9602) && (m_dev_type != 4538) ) + m_dev_type = 74123; + + enregister("A", m_A); + enregister("B", m_B); + enregister("CLRQ", m_CLRQ); + enregister("Q", m_Q); + enregister("QQ", m_QQ); + + enregister("_RP_Q", m_RP_Q); // internal + enregister("_RN_Q", m_RN_Q); // internal + + enregister("_CV", m_CV); // internal + + register_subalias("GND", m_RN.m_R.m_N); + register_subalias("VCC", m_RP.m_R.m_P); + register_subalias("C", m_RN.m_R.m_N); + register_subalias("RC", m_RN.m_R.m_P); + + + connect_late(m_RP_Q, m_RP.m_I); + connect_late(m_RN_Q, m_RN.m_I); + + connect_late(m_RN.m_R.m_P, m_RP.m_R.m_N); + connect_late(m_CV, m_RN.m_R.m_P); + + save(NLNAME(m_last_trig)); + save(NLNAME(m_state)); + save(NLNAME(m_KP)); + } + + NETLIB_RESETI(); + NETLIB_UPDATEI(); + + private: + int m_dev_type; + public: + NETLIB_SUB(res_sw) m_RP; + NETLIB_SUB(res_sw) m_RN; + + logic_output_t m_RP_Q; + logic_output_t m_RN_Q; + + logic_input_t m_A; + logic_input_t m_B; + logic_input_t m_CLRQ; + logic_output_t m_Q; + logic_output_t m_QQ; + + analog_input_t m_CV; + + netlist_sig_t m_last_trig; + UINT8 m_state; + double m_KP; + + param_double_t m_K; + param_double_t m_RI; + }; + + NETLIB_OBJECT(74123_dip) + { + NETLIB_CONSTRUCTOR(74123_dip) + , m_1(*this, "1", 74123) + , m_2(*this, "2", 74123) + { + register_subalias("1", m_1.m_A); + register_subalias("2", m_1.m_B); + register_subalias("3", m_1.m_CLRQ); + register_subalias("4", m_1.m_QQ); + register_subalias("5", m_2.m_Q); + register_subalias("6", m_2.m_RN.m_R.m_N); + register_subalias("7", m_2.m_RN.m_R.m_P); + register_subalias("8", m_1.m_RN.m_R.m_N); + connect_late(m_1.m_RN.m_R.m_N, m_2.m_RN.m_R.m_N); + + register_subalias("9", m_2.m_A); + register_subalias("10", m_2.m_B); + register_subalias("11", m_2.m_CLRQ); + register_subalias("12", m_2.m_QQ); + register_subalias("13", m_1.m_Q); + register_subalias("14", m_1.m_RN.m_R.m_N); + register_subalias("15", m_1.m_RN.m_R.m_P); + register_subalias("16", m_1.m_RP.m_R.m_P); + connect_late(m_1.m_RP.m_R.m_P, m_2.m_RP.m_R.m_P); + } + NETLIB_RESETI(); + NETLIB_UPDATEI(); + private: + NETLIB_SUB(74123) m_1; + NETLIB_SUB(74123) m_2; + }; + + NETLIB_OBJECT(9602_dip) + { + NETLIB_CONSTRUCTOR(9602_dip) + , m_1(*this, "1", 9602) + , m_2(*this, "2", 9602) + { + register_subalias("1", m_1.m_RN.m_R.m_N); // C1 + register_subalias("2", m_1.m_RN.m_R.m_P); // RC1 + register_subalias("3", m_1.m_CLRQ); + register_subalias("4", m_1.m_B); + register_subalias("5", m_1.m_A); + register_subalias("6", m_1.m_Q); + register_subalias("7", m_1.m_QQ); + register_subalias("8", m_1.m_RN.m_R.m_N); + connect_late(m_1.m_RN.m_R.m_N, m_2.m_RN.m_R.m_N); + + register_subalias("9", m_2.m_QQ); + register_subalias("10", m_2.m_Q); + register_subalias("11", m_2.m_A); + register_subalias("12", m_2.m_B); + register_subalias("13", m_2.m_CLRQ); + register_subalias("14", m_2.m_RN.m_R.m_P); // RC2 + register_subalias("15", m_2.m_RN.m_R.m_N); // C2 + register_subalias("16", m_1.m_RP.m_R.m_P); + connect_late(m_1.m_RP.m_R.m_P, m_2.m_RP.m_R.m_P); + } + NETLIB_RESETI(); + NETLIB_UPDATEI(); + private: + NETLIB_SUB(74123) m_1; + NETLIB_SUB(74123) m_2; + }; + + NETLIB_OBJECT(4538_dip) + { + NETLIB_CONSTRUCTOR(4538_dip) + NETLIB_FAMILY("CD4XXX") + , m_1(*this, "1", 4538) + , m_2(*this, "2", 4538) + { + register_subalias("1", m_1.m_RN.m_R.m_N); // C1 + register_subalias("2", m_1.m_RN.m_R.m_P); // RC1 + register_subalias("3", m_1.m_CLRQ); + register_subalias("4", m_1.m_A); + register_subalias("5", m_1.m_B); + register_subalias("6", m_1.m_Q); + register_subalias("7", m_1.m_QQ); + register_subalias("8", m_1.m_RN.m_R.m_N); + connect_late(m_1.m_RN.m_R.m_N, m_2.m_RN.m_R.m_N); + + register_subalias("9", m_2.m_QQ); + register_subalias("10", m_2.m_Q); + register_subalias("11", m_2.m_B); + register_subalias("12", m_2.m_A); + register_subalias("13", m_2.m_CLRQ); + register_subalias("14", m_2.m_RN.m_R.m_P); // RC2 + register_subalias("15", m_2.m_RN.m_R.m_N); // C2 + register_subalias("16", m_1.m_RP.m_R.m_P); + connect_late(m_1.m_RP.m_R.m_P, m_2.m_RP.m_R.m_P); + } + NETLIB_RESETI(); + NETLIB_UPDATEI(); + private: + NETLIB_SUB(74123) m_1; + NETLIB_SUB(74123) m_2; + }; + + NETLIB_UPDATE(74123) + { + netlist_sig_t m_trig; + netlist_sig_t res = !INPLOGIC(m_CLRQ); + netlist_time t_AB_to_Q = NLTIME_FROM_NS(10); + netlist_time t_C_to_Q = NLTIME_FROM_NS(10); + + if (m_dev_type == 74123) + { + m_trig = (INPLOGIC(m_A) ^ 1) & INPLOGIC(m_B) & INPLOGIC(m_CLRQ); + } + else if (m_dev_type == 9602) + { + m_trig = (INPLOGIC(m_A) ^ 1) | INPLOGIC(m_B); + } + else // 4538 + { + m_trig = (INPLOGIC(m_B) ^ 1) | INPLOGIC(m_A); + // The line below is from the datasheet truthtable ... doesn't make sense at all + //res = res | INPLOGIC(m_A) | (INPLOGIC(m_B) ^ 1); + t_AB_to_Q = NLTIME_FROM_NS(300); + t_C_to_Q = NLTIME_FROM_NS(250); + } + + if (res) + { + OUTLOGIC(m_Q, 0, t_C_to_Q); + OUTLOGIC(m_QQ, 1, t_C_to_Q); + /* quick charge until trigger */ + /* FIXME: SGS datasheet shows quick charge to 5V, + * though schematics indicate quick charge to Vhigh only. + */ + OUTLOGIC(m_RP_Q, 1, t_C_to_Q); // R_ON + OUTLOGIC(m_RN_Q, 0, t_C_to_Q); // R_OFF + m_state = 2; //charging (quick) + } + else if (!m_last_trig && m_trig) + { + // FIXME: Timing! + OUTLOGIC(m_Q, 1, t_AB_to_Q); + OUTLOGIC(m_QQ, 0,t_AB_to_Q); + + OUTLOGIC(m_RN_Q, 1, t_AB_to_Q); // R_ON + OUTLOGIC(m_RP_Q, 0, t_AB_to_Q); // R_OFF + + m_state = 1; // discharging + } + + m_last_trig = m_trig; + + if (m_state == 1) + { + const nl_double vLow = m_KP * TERMANALOG(m_RP.m_R.m_P); + if (INPANALOG(m_CV) < vLow) + { + OUTLOGIC(m_RN_Q, 0, NLTIME_FROM_NS(10)); // R_OFF + m_state = 2; // charging + } + } + if (m_state == 2) + { + const nl_double vHigh = TERMANALOG(m_RP.m_R.m_P) * (1.0 - m_KP); + if (INPANALOG(m_CV) > vHigh) + { + OUTLOGIC(m_RP_Q, 0, NLTIME_FROM_NS(10)); // R_OFF + + OUTLOGIC(m_Q, 0, NLTIME_FROM_NS(10)); + OUTLOGIC(m_QQ, 1, NLTIME_FROM_NS(10)); + m_state = 0; // waiting + } } } - if (m_state == 2) + + NETLIB_RESET(74123) { - const nl_double vHigh = TERMANALOG(m_RP.m_R.m_P) * (1.0 - m_KP); - if (INPANALOG(m_CV) > vHigh) - { - OUTLOGIC(m_RP_Q, 0, NLTIME_FROM_NS(10)); // R_OFF + m_KP = 1.0 / (1.0 + exp(m_K.Value())); - OUTLOGIC(m_Q, 0, NLTIME_FROM_NS(10)); - OUTLOGIC(m_QQ, 1, NLTIME_FROM_NS(10)); - m_state = 0; // waiting - } + m_RP.do_reset(); + m_RN.do_reset(); + + //m_RP.set_R(R_OFF); + //m_RN.set_R(R_OFF); + + m_last_trig = 0; + m_state = 0; } -} -NETLIB_RESET(74123) -{ - m_KP = 1.0 / (1.0 + exp(m_K.Value())); + NETLIB_UPDATE(74123_dip) + { + /* only called during startup */ + //_1.update_dev(); + //m_2.update_dev(); + } - m_RP.do_reset(); - m_RN.do_reset(); + NETLIB_RESET(74123_dip) + { + //m_1.do_reset(); + //m_2.do_reset(); + } - //m_RP.set_R(R_OFF); - //m_RN.set_R(R_OFF); + NETLIB_UPDATE(9602_dip) + { + /* only called during startup */ + //m_1.update_dev(); + //m_2.update_dev(); + } - m_last_trig = 0; - m_state = 0; -} + NETLIB_RESET(9602_dip) + { + //m_1.do_reset(); + //m_2.do_reset(); + } -NETLIB_UPDATE(74123_dip) -{ - /* only called during startup */ - //_1.update_dev(); - //m_2.update_dev(); -} + NETLIB_UPDATE(4538_dip) + { + /* only called during startup */ + //m_1.update_dev(); + //m_2.update_dev(); + } -NETLIB_RESET(74123_dip) -{ - //m_1.do_reset(); - //m_2.do_reset(); -} + NETLIB_RESET(4538_dip) + { + m_1.do_reset(); + m_2.do_reset(); + } -NETLIB_UPDATE(9602_dip) -{ - /* only called during startup */ - //m_1.update_dev(); - //m_2.update_dev(); -} - -NETLIB_RESET(9602_dip) -{ - //m_1.do_reset(); - //m_2.do_reset(); -} - -NETLIB_UPDATE(4538_dip) -{ - /* only called during startup */ - //m_1.update_dev(); - //m_2.update_dev(); -} - -NETLIB_RESET(4538_dip) -{ - m_1.do_reset(); - m_2.do_reset(); -} + NETLIB_DEVICE_IMPL(74123) + NETLIB_DEVICE_IMPL(74123_dip) + NETLIB_DEVICE_IMPL(4538_dip) + NETLIB_DEVICE_IMPL(9602_dip) } //namespace devices } // namespace netlist diff --git a/src/lib/netlist/devices/nld_74123.h b/src/lib/netlist/devices/nld_74123.h index 26a7638c11a..15039c82f94 100644 --- a/src/lib/netlist/devices/nld_74123.h +++ b/src/lib/netlist/devices/nld_74123.h @@ -49,205 +49,26 @@ #ifndef NLD_74123_H_ #define NLD_74123_H_ -#include "nl_base.h" -#include "nld_system.h" -#include "analog/nld_twoterm.h" +#include "nl_setup.h" -#define TTL_74123(name) \ +#define TTL_74123(name) \ NET_REGISTER_DEV(TTL_74123, name) -namespace netlist -{ - namespace devices - { - -NETLIB_OBJECT(74123) -{ - NETLIB_CONSTRUCTOR_EX(74123, int dev_type = 74123) - , m_dev_type(dev_type) - , m_RP(*this, "RP") - , m_RN(*this, "RN") - , m_K(*this, "K", (m_dev_type == 4538) ? 0.4 : 0.4) - , m_RI(*this, "RI", 400.0) // around 250 for HC series, 400 on LS/TTL, estimated from datasheets - { - if ((m_dev_type != 9602) && (m_dev_type != 4538) ) - m_dev_type = 74123; - - enregister("A", m_A); - enregister("B", m_B); - enregister("CLRQ", m_CLRQ); - enregister("Q", m_Q); - enregister("QQ", m_QQ); - - enregister("_RP_Q", m_RP_Q); // internal - enregister("_RN_Q", m_RN_Q); // internal - - enregister("_CV", m_CV); // internal - - register_subalias("GND", m_RN.m_R.m_N); - register_subalias("VCC", m_RP.m_R.m_P); - register_subalias("C", m_RN.m_R.m_N); - register_subalias("RC", m_RN.m_R.m_P); - - - connect_late(m_RP_Q, m_RP.m_I); - connect_late(m_RN_Q, m_RN.m_I); - - connect_late(m_RN.m_R.m_P, m_RP.m_R.m_N); - connect_late(m_CV, m_RN.m_R.m_P); - - save(NLNAME(m_last_trig)); - save(NLNAME(m_state)); - save(NLNAME(m_KP)); - } - - NETLIB_RESETI(); - NETLIB_UPDATEI(); - -private: - int m_dev_type; -public: - NETLIB_SUB(res_sw) m_RP; - NETLIB_SUB(res_sw) m_RN; - - logic_output_t m_RP_Q; - logic_output_t m_RN_Q; - - logic_input_t m_A; - logic_input_t m_B; - logic_input_t m_CLRQ; - logic_output_t m_Q; - logic_output_t m_QQ; - - analog_input_t m_CV; - - netlist_sig_t m_last_trig; - UINT8 m_state; - double m_KP; - - param_double_t m_K; - param_double_t m_RI; -}; - -#define TTL_74123_DIP(name) \ +#define TTL_74123_DIP(name) \ NET_REGISTER_DEV(TTL_74123_DIP, name) -NETLIB_OBJECT(74123_dip) -{ - NETLIB_CONSTRUCTOR(74123_dip) - , m_1(*this, "1", 74123) - , m_2(*this, "2", 74123) - { - register_subalias("1", m_1.m_A); - register_subalias("2", m_1.m_B); - register_subalias("3", m_1.m_CLRQ); - register_subalias("4", m_1.m_QQ); - register_subalias("5", m_2.m_Q); - register_subalias("6", m_2.m_RN.m_R.m_N); - register_subalias("7", m_2.m_RN.m_R.m_P); - register_subalias("8", m_1.m_RN.m_R.m_N); - connect_late(m_1.m_RN.m_R.m_N, m_2.m_RN.m_R.m_N); - - register_subalias("9", m_2.m_A); - register_subalias("10", m_2.m_B); - register_subalias("11", m_2.m_CLRQ); - register_subalias("12", m_2.m_QQ); - register_subalias("13", m_1.m_Q); - register_subalias("14", m_1.m_RN.m_R.m_N); - register_subalias("15", m_1.m_RN.m_R.m_P); - register_subalias("16", m_1.m_RP.m_R.m_P); - connect_late(m_1.m_RP.m_R.m_P, m_2.m_RP.m_R.m_P); - } - NETLIB_RESETI(); - NETLIB_UPDATEI(); -private: - NETLIB_SUB(74123) m_1; - NETLIB_SUB(74123) m_2; -}; - /* The 9602 is very similar to the 123. Input triggering is slightly different - * THe 9602 uses an OR gate instead of an AND gate. + * The 9602 uses an OR gate instead of an AND gate. */ -#define TTL_9602_DIP(name) \ +#define TTL_9602_DIP(name) \ NET_REGISTER_DEV(TTL_9602_DIP, name) -NETLIB_OBJECT(9602_dip) -{ - NETLIB_CONSTRUCTOR(9602_dip) - , m_1(*this, "1", 9602) - , m_2(*this, "2", 9602) - { - register_subalias("1", m_1.m_RN.m_R.m_N); // C1 - register_subalias("2", m_1.m_RN.m_R.m_P); // RC1 - register_subalias("3", m_1.m_CLRQ); - register_subalias("4", m_1.m_B); - register_subalias("5", m_1.m_A); - register_subalias("6", m_1.m_Q); - register_subalias("7", m_1.m_QQ); - register_subalias("8", m_1.m_RN.m_R.m_N); - connect_late(m_1.m_RN.m_R.m_N, m_2.m_RN.m_R.m_N); - - register_subalias("9", m_2.m_QQ); - register_subalias("10", m_2.m_Q); - register_subalias("11", m_2.m_A); - register_subalias("12", m_2.m_B); - register_subalias("13", m_2.m_CLRQ); - register_subalias("14", m_2.m_RN.m_R.m_P); // RC2 - register_subalias("15", m_2.m_RN.m_R.m_N); // C2 - register_subalias("16", m_1.m_RP.m_R.m_P); - connect_late(m_1.m_RP.m_R.m_P, m_2.m_RP.m_R.m_P); - } - NETLIB_RESETI(); - NETLIB_UPDATEI(); -private: - NETLIB_SUB(74123) m_1; - NETLIB_SUB(74123) m_2; -}; - /* * The CD4538 is pretty similar to the 9602 */ -#define CD4538_DIP(name) \ +#define CD4538_DIP(name) \ NET_REGISTER_DEV(CD4538_DIP, name) -NETLIB_OBJECT(4538_dip) -{ - NETLIB_CONSTRUCTOR(4538_dip) - NETLIB_FAMILY("CD4XXX") - , m_1(*this, "1", 4538) - , m_2(*this, "2", 4538) - { - register_subalias("1", m_1.m_RN.m_R.m_N); // C1 - register_subalias("2", m_1.m_RN.m_R.m_P); // RC1 - register_subalias("3", m_1.m_CLRQ); - register_subalias("4", m_1.m_A); - register_subalias("5", m_1.m_B); - register_subalias("6", m_1.m_Q); - register_subalias("7", m_1.m_QQ); - register_subalias("8", m_1.m_RN.m_R.m_N); - connect_late(m_1.m_RN.m_R.m_N, m_2.m_RN.m_R.m_N); - - register_subalias("9", m_2.m_QQ); - register_subalias("10", m_2.m_Q); - register_subalias("11", m_2.m_B); - register_subalias("12", m_2.m_A); - register_subalias("13", m_2.m_CLRQ); - register_subalias("14", m_2.m_RN.m_R.m_P); // RC2 - register_subalias("15", m_2.m_RN.m_R.m_N); // C2 - register_subalias("16", m_1.m_RP.m_R.m_P); - connect_late(m_1.m_RP.m_R.m_P, m_2.m_RP.m_R.m_P); - } - NETLIB_RESETI(); - NETLIB_UPDATEI(); -private: - NETLIB_SUB(74123) m_1; - NETLIB_SUB(74123) m_2; -}; - - } //namespace devices -} // namespace netlist - - #endif /* NLD_74123_H_ */ diff --git a/src/lib/netlist/devices/nld_74153.cpp b/src/lib/netlist/devices/nld_74153.cpp index bd11027310f..5b3408f1470 100644 --- a/src/lib/netlist/devices/nld_74153.cpp +++ b/src/lib/netlist/devices/nld_74153.cpp @@ -17,40 +17,130 @@ namespace netlist * Convert this to sub-devices at some time. */ - -NETLIB_RESET(74153sub) -{ - m_chan = 0; -} - -NETLIB_UPDATE(74153sub) -{ - const netlist_time delay[2] = { NLTIME_FROM_NS(23), NLTIME_FROM_NS(18) }; - if (!INPLOGIC(m_G)) + NETLIB_OBJECT(74153sub) { - UINT8 t = INPLOGIC(m_C[m_chan]); - OUTLOGIC(m_Y, t, delay[t] ); - } - else + NETLIB_CONSTRUCTOR(74153sub) + , m_chan(0) + { + enregister("C0", m_C[0]); + enregister("C1", m_C[1]); + enregister("C2", m_C[2]); + enregister("C3", m_C[3]); + enregister("G", m_G); + + enregister("AY", m_Y); //FIXME: Change netlists + + save(NLNAME(m_chan)); + } + + NETLIB_RESETI(); + NETLIB_UPDATEI(); + + public: + logic_input_t m_C[4]; + logic_input_t m_G; + + logic_output_t m_Y; + + int m_chan; + }; + + NETLIB_OBJECT(74153) { - OUTLOGIC(m_Y, 0, delay[0]); + NETLIB_CONSTRUCTOR(74153) + , m_sub(*this, "sub") + { + + register_subalias("C0", m_sub.m_C[0]); + register_subalias("C1", m_sub.m_C[1]); + register_subalias("C2", m_sub.m_C[2]); + register_subalias("C3", m_sub.m_C[3]); + enregister("A", m_A); + enregister("B", m_B); + register_subalias("G", m_sub.m_G); + + register_subalias("AY", m_sub.m_Y); //FIXME: Change netlists + } + NETLIB_RESETI() { } + NETLIB_UPDATEI(); + public: + NETLIB_SUB(74153sub) m_sub; + logic_input_t m_A; + logic_input_t m_B; + }; + + NETLIB_OBJECT(74153_dip) + { + NETLIB_CONSTRUCTOR(74153_dip) + , m_1(*this, "1") + , m_2(*this, "2") + { + + register_subalias("1", m_1.m_G); + enregister("2", m_B); // m_2.m_B + register_subalias("3", m_1.m_C[3]); + register_subalias("4", m_1.m_C[2]); + register_subalias("5", m_1.m_C[1]); + register_subalias("6", m_1.m_C[0]); + register_subalias("7", m_1.m_Y); + + register_subalias("9", m_2.m_Y); + register_subalias("10", m_2.m_C[0]); + register_subalias("11", m_2.m_C[1]); + register_subalias("12", m_2.m_C[2]); + register_subalias("13", m_2.m_C[3]); + + enregister("14", m_A); // m_2.m_B + register_subalias("15", m_2.m_G); + + } + //NETLIB_RESETI(); + NETLIB_UPDATEI(); + + protected: + NETLIB_SUB(74153sub) m_1; + NETLIB_SUB(74153sub) m_2; + logic_input_t m_A; + logic_input_t m_B; + }; + + + NETLIB_RESET(74153sub) + { + m_chan = 0; + } + + NETLIB_UPDATE(74153sub) + { + const netlist_time delay[2] = { NLTIME_FROM_NS(23), NLTIME_FROM_NS(18) }; + if (!INPLOGIC(m_G)) + { + UINT8 t = INPLOGIC(m_C[m_chan]); + OUTLOGIC(m_Y, t, delay[t] ); + } + else + { + OUTLOGIC(m_Y, 0, delay[0]); + } } -} -NETLIB_UPDATE(74153) -{ - m_sub.m_chan = (INPLOGIC(m_A) | (INPLOGIC(m_B)<<1)); - m_sub.do_update(); -} + NETLIB_UPDATE(74153) + { + m_sub.m_chan = (INPLOGIC(m_A) | (INPLOGIC(m_B)<<1)); + m_sub.do_update(); + } -NETLIB_UPDATE(74153_dip) -{ - m_2.m_chan = m_1.m_chan = (INPLOGIC(m_A) | (INPLOGIC(m_B)<<1)); - m_1.do_update(); - m_2.do_update(); -} + NETLIB_UPDATE(74153_dip) + { + m_2.m_chan = m_1.m_chan = (INPLOGIC(m_A) | (INPLOGIC(m_B)<<1)); + m_1.do_update(); + m_2.do_update(); + } + + NETLIB_DEVICE_IMPL(74153) + NETLIB_DEVICE_IMPL(74153_dip) } //namespace devices } // namespace netlist diff --git a/src/lib/netlist/devices/nld_74153.h b/src/lib/netlist/devices/nld_74153.h index c185c971258..6ace3b36d43 100644 --- a/src/lib/netlist/devices/nld_74153.h +++ b/src/lib/netlist/devices/nld_74153.h @@ -45,114 +45,19 @@ #ifndef NLD_74153_H_ #define NLD_74153_H_ -#include "nl_base.h" +#include "nl_setup.h" -#define TTL_74153(name, cC0, cC1, cC2, cC3, cA, cB, cG) \ - NET_REGISTER_DEV(TTL_74153, name) \ - NET_CONNECT(name, C0, cC0) \ - NET_CONNECT(name, C1, cC1) \ - NET_CONNECT(name, C2, cC2) \ - NET_CONNECT(name, C3, cC3) \ - NET_CONNECT(name, A, cA) \ - NET_CONNECT(name, B, cB) \ +#define TTL_74153(name, cC0, cC1, cC2, cC3, cA, cB, cG) \ + NET_REGISTER_DEV(TTL_74153, name) \ + NET_CONNECT(name, C0, cC0) \ + NET_CONNECT(name, C1, cC1) \ + NET_CONNECT(name, C2, cC2) \ + NET_CONNECT(name, C3, cC3) \ + NET_CONNECT(name, A, cA) \ + NET_CONNECT(name, B, cB) \ NET_CONNECT(name, G, cG) -#define TTL_74153_DIP(name) \ +#define TTL_74153_DIP(name) \ NET_REGISTER_DEV(TTL_74153_DIP, name) -namespace netlist -{ - namespace devices - { - -NETLIB_OBJECT(74153sub) -{ - NETLIB_CONSTRUCTOR(74153sub) - , m_chan(0) - { - enregister("C0", m_C[0]); - enregister("C1", m_C[1]); - enregister("C2", m_C[2]); - enregister("C3", m_C[3]); - enregister("G", m_G); - - enregister("AY", m_Y); //FIXME: Change netlists - - save(NLNAME(m_chan)); - } - - NETLIB_RESETI(); - NETLIB_UPDATEI(); - -public: - logic_input_t m_C[4]; - logic_input_t m_G; - - logic_output_t m_Y; - - int m_chan; -}; - -NETLIB_OBJECT(74153) -{ - NETLIB_CONSTRUCTOR(74153) - , m_sub(*this, "sub") - { - - register_subalias("C0", m_sub.m_C[0]); - register_subalias("C1", m_sub.m_C[1]); - register_subalias("C2", m_sub.m_C[2]); - register_subalias("C3", m_sub.m_C[3]); - enregister("A", m_A); - enregister("B", m_B); - register_subalias("G", m_sub.m_G); - - register_subalias("AY", m_sub.m_Y); //FIXME: Change netlists - } - NETLIB_RESETI() { } - NETLIB_UPDATEI(); -public: - NETLIB_SUB(74153sub) m_sub; - logic_input_t m_A; - logic_input_t m_B; -}; - -NETLIB_OBJECT(74153_dip) -{ - NETLIB_CONSTRUCTOR(74153_dip) - , m_1(*this, "1") - , m_2(*this, "2") - { - - register_subalias("1", m_1.m_G); - enregister("2", m_B); // m_2.m_B - register_subalias("3", m_1.m_C[3]); - register_subalias("4", m_1.m_C[2]); - register_subalias("5", m_1.m_C[1]); - register_subalias("6", m_1.m_C[0]); - register_subalias("7", m_1.m_Y); - - register_subalias("9", m_2.m_Y); - register_subalias("10", m_2.m_C[0]); - register_subalias("11", m_2.m_C[1]); - register_subalias("12", m_2.m_C[2]); - register_subalias("13", m_2.m_C[3]); - - enregister("14", m_A); // m_2.m_B - register_subalias("15", m_2.m_G); - - } - //NETLIB_RESETI(); - NETLIB_UPDATEI(); - -protected: - NETLIB_SUB(74153sub) m_1; - NETLIB_SUB(74153sub) m_2; - logic_input_t m_A; - logic_input_t m_B; -}; - - } //namespace devices -} // namespace netlist - #endif /* NLD_74153_H_ */ diff --git a/src/lib/netlist/devices/nld_74175.cpp b/src/lib/netlist/devices/nld_74175.cpp index dc600e5ac65..53ef7bbe815 100644 --- a/src/lib/netlist/devices/nld_74175.cpp +++ b/src/lib/netlist/devices/nld_74175.cpp @@ -12,58 +12,153 @@ namespace netlist namespace devices { -static const netlist_time delay[2] = { NLTIME_FROM_NS(25), NLTIME_FROM_NS(25) }; -static const netlist_time delay_clear[2] = { NLTIME_FROM_NS(40), NLTIME_FROM_NS(25) }; - -NETLIB_RESET(74175_sub) -{ - m_CLK.set_state(logic_t::STATE_INP_LH); - m_clrq = 0; - m_data = 0xFF; -} - -NETLIB_UPDATE(74175_sub) -{ - if (m_clrq) + NETLIB_OBJECT(74175_sub) { + NETLIB_CONSTRUCTOR(74175_sub) + , m_data(0) + { + enregister("CLK", m_CLK); + + enregister("Q1", m_Q[0]); + enregister("Q1Q", m_QQ[0]); + enregister("Q2", m_Q[1]); + enregister("Q2Q", m_QQ[1]); + enregister("Q3", m_Q[2]); + enregister("Q3Q", m_QQ[2]); + enregister("Q4", m_Q[3]); + enregister("Q4Q", m_QQ[3]); + + save(NLNAME(m_clrq)); + save(NLNAME(m_data)); + } + + NETLIB_RESETI(); + NETLIB_UPDATEI(); + + public: + logic_input_t m_CLK; + logic_output_t m_Q[4]; + logic_output_t m_QQ[4]; + + netlist_sig_t m_clrq; + UINT8 m_data; + }; + + NETLIB_OBJECT(74175) + { + NETLIB_CONSTRUCTOR(74175) + , m_sub(*this, "sub") + { + register_subalias("CLK", m_sub.m_CLK); + + enregister("CLRQ", m_CLRQ); + + enregister("D1", m_D[0]); + register_subalias("Q1", m_sub.m_Q[0]); + register_subalias("Q1Q", m_sub.m_QQ[0]); + + enregister("D2", m_D[1]); + register_subalias("Q2", m_sub.m_Q[1]); + register_subalias("Q2Q", m_sub.m_QQ[1]); + + enregister("D3", m_D[2]); + register_subalias("Q3", m_sub.m_Q[2]); + register_subalias("Q3Q", m_sub.m_QQ[2]); + + enregister("D4", m_D[3]); + register_subalias("Q4", m_sub.m_Q[3]); + register_subalias("Q4Q", m_sub.m_QQ[3]); + } + + NETLIB_RESETI(); + NETLIB_UPDATEI(); + + protected: + NETLIB_SUB(74175_sub) m_sub; + logic_input_t m_D[4]; + logic_input_t m_CLRQ; + }; + + NETLIB_OBJECT_DERIVED(74175_dip, 74175) + { + NETLIB_CONSTRUCTOR_DERIVED(74175_dip, 74175) + { + register_subalias("9", m_sub.m_CLK); + register_subalias("1", m_CLRQ); + + register_subalias("4", m_D[0]); + register_subalias("2", m_sub.m_Q[0]); + register_subalias("3", m_sub.m_QQ[0]); + + register_subalias("5", m_D[1]); + register_subalias("7", m_sub.m_Q[1]); + register_subalias("6", m_sub.m_QQ[1]); + + register_subalias("12", m_D[2]); + register_subalias("10", m_sub.m_Q[2]); + register_subalias("11", m_sub.m_QQ[2]); + + register_subalias("13", m_D[3]); + register_subalias("15", m_sub.m_Q[3]); + register_subalias("14", m_sub.m_QQ[3]); + } + }; + + static const netlist_time delay[2] = { NLTIME_FROM_NS(25), NLTIME_FROM_NS(25) }; + static const netlist_time delay_clear[2] = { NLTIME_FROM_NS(40), NLTIME_FROM_NS(25) }; + + NETLIB_RESET(74175_sub) + { + m_CLK.set_state(logic_t::STATE_INP_LH); + m_clrq = 0; + m_data = 0xFF; + } + + NETLIB_UPDATE(74175_sub) + { + if (m_clrq) + { + for (int i=0; i<4; i++) + { + UINT8 d = (m_data >> i) & 1; + OUTLOGIC(m_Q[i], d, delay[d]); + OUTLOGIC(m_QQ[i], d ^ 1, delay[d ^ 1]); + } + m_CLK.inactivate(); + } + } + + NETLIB_UPDATE(74175) + { + UINT8 d = 0; for (int i=0; i<4; i++) { - UINT8 d = (m_data >> i) & 1; - OUTLOGIC(m_Q[i], d, delay[d]); - OUTLOGIC(m_QQ[i], d ^ 1, delay[d ^ 1]); + d |= (INPLOGIC(m_D[i]) << i); } - m_CLK.inactivate(); - } -} - -NETLIB_UPDATE(74175) -{ - UINT8 d = 0; - for (int i=0; i<4; i++) - { - d |= (INPLOGIC(m_D[i]) << i); - } - m_sub.m_clrq = INPLOGIC(m_CLRQ); - if (!m_sub.m_clrq) - { - for (int i=0; i<4; i++) + m_sub.m_clrq = INPLOGIC(m_CLRQ); + if (!m_sub.m_clrq) { - OUTLOGIC(m_sub.m_Q[i], 0, delay_clear[0]); - OUTLOGIC(m_sub.m_QQ[i], 1, delay_clear[1]); + for (int i=0; i<4; i++) + { + OUTLOGIC(m_sub.m_Q[i], 0, delay_clear[0]); + OUTLOGIC(m_sub.m_QQ[i], 1, delay_clear[1]); + } + m_sub.m_data = 0; + } else if (d != m_sub.m_data) + { + m_sub.m_data = d; + m_sub.m_CLK.activate_lh(); } - m_sub.m_data = 0; - } else if (d != m_sub.m_data) - { - m_sub.m_data = d; - m_sub.m_CLK.activate_lh(); } -} -NETLIB_RESET(74175) -{ - //m_sub.do_reset(); -} + NETLIB_RESET(74175) + { + //m_sub.do_reset(); + } + + NETLIB_DEVICE_IMPL(74175) + NETLIB_DEVICE_IMPL(74175_dip) } //namespace devices } // namespace netlist diff --git a/src/lib/netlist/devices/nld_74175.h b/src/lib/netlist/devices/nld_74175.h index 5c7b90ea5c5..8b08060e520 100644 --- a/src/lib/netlist/devices/nld_74175.h +++ b/src/lib/netlist/devices/nld_74175.h @@ -36,111 +36,12 @@ #ifndef NLD_74175_H_ #define NLD_74175_H_ -#include "nl_base.h" +#include "nl_setup.h" #define TTL_74175(name) \ NET_REGISTER_DEV(TTL_74175, name) #define TTL_74175_DIP(name) \ NET_REGISTER_DEV(TTL_74175_DIP, name) -namespace netlist -{ - namespace devices - { - -NETLIB_OBJECT(74175_sub) -{ - NETLIB_CONSTRUCTOR(74175_sub) - , m_data(0) - { - enregister("CLK", m_CLK); - - enregister("Q1", m_Q[0]); - enregister("Q1Q", m_QQ[0]); - enregister("Q2", m_Q[1]); - enregister("Q2Q", m_QQ[1]); - enregister("Q3", m_Q[2]); - enregister("Q3Q", m_QQ[2]); - enregister("Q4", m_Q[3]); - enregister("Q4Q", m_QQ[3]); - - save(NLNAME(m_clrq)); - save(NLNAME(m_data)); - } - - NETLIB_RESETI(); - NETLIB_UPDATEI(); - -public: - logic_input_t m_CLK; - logic_output_t m_Q[4]; - logic_output_t m_QQ[4]; - - netlist_sig_t m_clrq; - UINT8 m_data; -}; - -NETLIB_OBJECT(74175) -{ - NETLIB_CONSTRUCTOR(74175) - , m_sub(*this, "sub") - { - register_subalias("CLK", m_sub.m_CLK); - - enregister("CLRQ", m_CLRQ); - - enregister("D1", m_D[0]); - register_subalias("Q1", m_sub.m_Q[0]); - register_subalias("Q1Q", m_sub.m_QQ[0]); - - enregister("D2", m_D[1]); - register_subalias("Q2", m_sub.m_Q[1]); - register_subalias("Q2Q", m_sub.m_QQ[1]); - - enregister("D3", m_D[2]); - register_subalias("Q3", m_sub.m_Q[2]); - register_subalias("Q3Q", m_sub.m_QQ[2]); - - enregister("D4", m_D[3]); - register_subalias("Q4", m_sub.m_Q[3]); - register_subalias("Q4Q", m_sub.m_QQ[3]); - } - - NETLIB_RESETI(); - NETLIB_UPDATEI(); - -protected: - NETLIB_SUB(74175_sub) m_sub; - logic_input_t m_D[4]; - logic_input_t m_CLRQ; -}; - -NETLIB_OBJECT_DERIVED(74175_dip, 74175) -{ - NETLIB_CONSTRUCTOR_DERIVED(74175_dip, 74175) - { - register_subalias("9", m_sub.m_CLK); - register_subalias("1", m_CLRQ); - - register_subalias("4", m_D[0]); - register_subalias("2", m_sub.m_Q[0]); - register_subalias("3", m_sub.m_QQ[0]); - - register_subalias("5", m_D[1]); - register_subalias("7", m_sub.m_Q[1]); - register_subalias("6", m_sub.m_QQ[1]); - - register_subalias("12", m_D[2]); - register_subalias("10", m_sub.m_Q[2]); - register_subalias("11", m_sub.m_QQ[2]); - - register_subalias("13", m_D[3]); - register_subalias("15", m_sub.m_Q[3]); - register_subalias("14", m_sub.m_QQ[3]); - } -}; - - } //namespace devices -} // namespace netlist #endif /* NLD_74175_H_ */ diff --git a/src/lib/netlist/devices/nld_74193.cpp b/src/lib/netlist/devices/nld_74193.cpp index 27cd9337f80..7a706cdc435 100644 --- a/src/lib/netlist/devices/nld_74193.cpp +++ b/src/lib/netlist/devices/nld_74193.cpp @@ -14,68 +14,143 @@ namespace netlist namespace devices { -NETLIB_RESET(74193) -{ - m_cnt = 0; - m_last_CU = 0; - m_last_CD = 0; -} + NETLIB_OBJECT(74193) + { + NETLIB_CONSTRUCTOR(74193) + , m_cnt(0) + , m_last_CU(0) + , m_last_CD(0) + { + enregister("A", m_A); + enregister("B", m_B); + enregister("C", m_C); + enregister("D", m_D); + enregister("CLEAR", m_CLEAR); + enregister("LOADQ", m_LOADQ); + enregister("CU", m_CU); + enregister("CD", m_CD); -// FIXME: Timing -static const netlist_time delay[4] = -{ - NLTIME_FROM_NS(40), - NLTIME_FROM_NS(40), - NLTIME_FROM_NS(40), - NLTIME_FROM_NS(40) -}; + enregister("QA", m_Q[0]); + enregister("QB", m_Q[1]); + enregister("QC", m_Q[2]); + enregister("QD", m_Q[3]); + enregister("BORROWQ", m_BORROWQ); + enregister("CARRYQ", m_CARRYQ); -NETLIB_UPDATE(74193) -{ - int tCarry = 1; - int tBorrow = 1; - if (INPLOGIC(m_CLEAR)) + save(NLNAME(m_cnt)); + save(NLNAME(m_last_CU)); + save(NLNAME(m_last_CD)); + } + + NETLIB_RESETI(); + NETLIB_UPDATEI(); + + protected: + logic_input_t m_A; + logic_input_t m_B; + logic_input_t m_C; + logic_input_t m_D; + logic_input_t m_CLEAR; + logic_input_t m_LOADQ; + logic_input_t m_CU; + logic_input_t m_CD; + + INT8 m_cnt; + UINT8 m_last_CU; + UINT8 m_last_CD; + + logic_output_t m_Q[4]; + logic_output_t m_BORROWQ; + logic_output_t m_CARRYQ; + }; + + NETLIB_OBJECT_DERIVED(74193_dip, 74193) + { + NETLIB_CONSTRUCTOR_DERIVED(74193_dip, 74193) + { + register_subalias("1", m_B); + register_subalias("2", m_Q[1]); + register_subalias("3", m_Q[0]); + register_subalias("4", m_CD); + register_subalias("5", m_CU); + register_subalias("6", m_Q[2]); + register_subalias("7", m_Q[3]); + + register_subalias("9", m_D); + register_subalias("10", m_C); + register_subalias("11", m_LOADQ); + register_subalias("12", m_CARRYQ); + register_subalias("13", m_BORROWQ); + register_subalias("14", m_CLEAR); + register_subalias("15", m_A); + + } + }; + + NETLIB_RESET(74193) { m_cnt = 0; + m_last_CU = 0; + m_last_CD = 0; } - else if (!INPLOGIC(m_LOADQ)) + + // FIXME: Timing + static const netlist_time delay[4] = { - m_cnt = (INPLOGIC(m_D) << 3) | (INPLOGIC(m_C) << 2) - | (INPLOGIC(m_B) << 1) | (INPLOGIC(m_A) << 0); - } - else + NLTIME_FROM_NS(40), + NLTIME_FROM_NS(40), + NLTIME_FROM_NS(40), + NLTIME_FROM_NS(40) + }; + + NETLIB_UPDATE(74193) { - if (INPLOGIC(m_CD) && !m_last_CU && INPLOGIC(m_CU)) + int tCarry = 1; + int tBorrow = 1; + if (INPLOGIC(m_CLEAR)) { - m_cnt++; - if (m_cnt > MAXCNT) - m_cnt = 0; + m_cnt = 0; } - if (INPLOGIC(m_CU) && !m_last_CD && INPLOGIC(m_CD)) + else if (!INPLOGIC(m_LOADQ)) { - if (m_cnt > 0) - m_cnt--; - else - m_cnt = MAXCNT; + m_cnt = (INPLOGIC(m_D) << 3) | (INPLOGIC(m_C) << 2) + | (INPLOGIC(m_B) << 1) | (INPLOGIC(m_A) << 0); } + else + { + if (INPLOGIC(m_CD) && !m_last_CU && INPLOGIC(m_CU)) + { + m_cnt++; + if (m_cnt > MAXCNT) + m_cnt = 0; + } + if (INPLOGIC(m_CU) && !m_last_CD && INPLOGIC(m_CD)) + { + if (m_cnt > 0) + m_cnt--; + else + m_cnt = MAXCNT; + } + } + + if (!INPLOGIC(m_CU) && (m_cnt == MAXCNT)) + tCarry = 0; + + if (!INPLOGIC(m_CD) && (m_cnt == 0)) + tBorrow = 0; + + m_last_CD = INPLOGIC(m_CD); + m_last_CU = INPLOGIC(m_CU); + + for (int i=0; i<4; i++) + OUTLOGIC(m_Q[i], (m_cnt >> i) & 1, delay[i]); + + OUTLOGIC(m_BORROWQ, tBorrow, NLTIME_FROM_NS(20)); //FIXME + OUTLOGIC(m_CARRYQ, tCarry, NLTIME_FROM_NS(20)); //FIXME } - if (!INPLOGIC(m_CU) && (m_cnt == MAXCNT)) - tCarry = 0; - - if (!INPLOGIC(m_CD) && (m_cnt == 0)) - tBorrow = 0; - - m_last_CD = INPLOGIC(m_CD); - m_last_CU = INPLOGIC(m_CU); - - for (int i=0; i<4; i++) - OUTLOGIC(m_Q[i], (m_cnt >> i) & 1, delay[i]); - - OUTLOGIC(m_BORROWQ, tBorrow, NLTIME_FROM_NS(20)); //FIXME - OUTLOGIC(m_CARRYQ, tCarry, NLTIME_FROM_NS(20)); //FIXME -} - + NETLIB_DEVICE_IMPL(74193) + NETLIB_DEVICE_IMPL(74193_dip) } //namespace devices } // namespace netlist diff --git a/src/lib/netlist/devices/nld_74193.h b/src/lib/netlist/devices/nld_74193.h index 919ddf920ef..fa2b8125092 100644 --- a/src/lib/netlist/devices/nld_74193.h +++ b/src/lib/netlist/devices/nld_74193.h @@ -26,93 +26,12 @@ #ifndef NLD_74193_H_ #define NLD_74193_H_ -#include "nl_base.h" +#include "nl_setup.h" -#define TTL_74193(name) \ +#define TTL_74193(name) \ NET_REGISTER_DEV(TTL_74193, name) -#define TTL_74193_DIP(name) \ +#define TTL_74193_DIP(name) \ NET_REGISTER_DEV(TTL_74193_DIP, name) -namespace netlist -{ - namespace devices - { - -NETLIB_OBJECT(74193) -{ - NETLIB_CONSTRUCTOR(74193) - , m_cnt(0) - , m_last_CU(0) - , m_last_CD(0) - { - enregister("A", m_A); - enregister("B", m_B); - enregister("C", m_C); - enregister("D", m_D); - enregister("CLEAR", m_CLEAR); - enregister("LOADQ", m_LOADQ); - enregister("CU", m_CU); - enregister("CD", m_CD); - - enregister("QA", m_Q[0]); - enregister("QB", m_Q[1]); - enregister("QC", m_Q[2]); - enregister("QD", m_Q[3]); - enregister("BORROWQ", m_BORROWQ); - enregister("CARRYQ", m_CARRYQ); - - save(NLNAME(m_cnt)); - save(NLNAME(m_last_CU)); - save(NLNAME(m_last_CD)); - } - - NETLIB_RESETI(); - NETLIB_UPDATEI(); - -protected: - logic_input_t m_A; - logic_input_t m_B; - logic_input_t m_C; - logic_input_t m_D; - logic_input_t m_CLEAR; - logic_input_t m_LOADQ; - logic_input_t m_CU; - logic_input_t m_CD; - - INT8 m_cnt; - UINT8 m_last_CU; - UINT8 m_last_CD; - - logic_output_t m_Q[4]; - logic_output_t m_BORROWQ; - logic_output_t m_CARRYQ; -}; - -NETLIB_OBJECT_DERIVED(74193_dip, 74193) -{ - NETLIB_CONSTRUCTOR_DERIVED(74193_dip, 74193) - { - register_subalias("1", m_B); - register_subalias("2", m_Q[1]); - register_subalias("3", m_Q[0]); - register_subalias("4", m_CD); - register_subalias("5", m_CU); - register_subalias("6", m_Q[2]); - register_subalias("7", m_Q[3]); - - register_subalias("9", m_D); - register_subalias("10", m_C); - register_subalias("11", m_LOADQ); - register_subalias("12", m_CARRYQ); - register_subalias("13", m_BORROWQ); - register_subalias("14", m_CLEAR); - register_subalias("15", m_A); - - } -}; - - } //namespace devices -} // namespace netlist - #endif /* NLD_74193_H_ */ diff --git a/src/lib/netlist/devices/nld_7448.h b/src/lib/netlist/devices/nld_7448.h index 6fb139e13f8..e7c2bda94ed 100644 --- a/src/lib/netlist/devices/nld_7448.h +++ b/src/lib/netlist/devices/nld_7448.h @@ -27,17 +27,17 @@ #include "nl_base.h" #include "nld_truthtable.h" -#define TTL_7448(name, cA0, cA1, cA2, cA3, cLTQ, cBIQ, cRBIQ) \ - NET_REGISTER_DEV(TTL_7448, name) \ - NET_CONNECT(name, A, cA0) \ - NET_CONNECT(name, B, cA1) \ - NET_CONNECT(name, C, cA2) \ - NET_CONNECT(name, D, cA3) \ - NET_CONNECT(name, LTQ, cLTQ) \ - NET_CONNECT(name, BIQ, cBIQ) \ +#define TTL_7448(name, cA0, cA1, cA2, cA3, cLTQ, cBIQ, cRBIQ) \ + NET_REGISTER_DEV(TTL_7448, name) \ + NET_CONNECT(name, A, cA0) \ + NET_CONNECT(name, B, cA1) \ + NET_CONNECT(name, C, cA2) \ + NET_CONNECT(name, D, cA3) \ + NET_CONNECT(name, LTQ, cLTQ) \ + NET_CONNECT(name, BIQ, cBIQ) \ NET_CONNECT(name, RBIQ, cRBIQ) -#define TTL_7448_DIP(name) \ +#define TTL_7448_DIP(name) \ NET_REGISTER_DEV(TTL_7448_DIP, name) #endif /* NLD_7448_H_ */ diff --git a/src/lib/netlist/devices/nld_legacy.cpp b/src/lib/netlist/devices/nld_legacy.cpp index 92e3a63ee6c..f2ddf677d33 100644 --- a/src/lib/netlist/devices/nld_legacy.cpp +++ b/src/lib/netlist/devices/nld_legacy.cpp @@ -13,46 +13,99 @@ namespace netlist namespace devices { -NETLIB_RESET(nicRSFF) -{ - m_Q.initial(0); - m_QQ.initial(1); -} + NETLIB_OBJECT(nicRSFF) + { + NETLIB_CONSTRUCTOR(nicRSFF) + { + enregister("S", m_S); + enregister("R", m_R); + enregister("Q", m_Q); + enregister("QQ", m_QQ); + } -NETLIB_UPDATE(nicRSFF) -{ - if (!INPLOGIC(m_S)) - { - OUTLOGIC(m_Q, 1, NLTIME_FROM_NS(20)); - OUTLOGIC(m_QQ, 0, NLTIME_FROM_NS(20)); - } - else if (!INPLOGIC(m_R)) - { - OUTLOGIC(m_Q, 0, NLTIME_FROM_NS(20)); - OUTLOGIC(m_QQ, 1, NLTIME_FROM_NS(20)); - } -} + NETLIB_RESETI(); + NETLIB_UPDATEI(); -NETLIB_RESET(nicDelay) -{ - //m_Q.initial(0); -} + protected: + logic_input_t m_S; + logic_input_t m_R; -NETLIB_UPDATE(nicDelay) -{ - netlist_sig_t nval = INPLOGIC(m_I); - if (nval && !m_last) + logic_output_t m_Q; + logic_output_t m_QQ; + }; + + + NETLIB_OBJECT(nicDelay) { - // L_to_H - OUTLOGIC(m_Q, 1, NLTIME_FROM_NS(m_L_to_H.Value())); - } - else if (!nval && m_last) + NETLIB_CONSTRUCTOR(nicDelay) + , m_L_to_H(*this, "L_TO_H", 10) + , m_H_to_L(*this, "H_TO_L", 10) + , m_last(0) + { + enregister("1", m_I); + enregister("2", m_Q); + + save(NLNAME(m_last)); + } + + //NETLIB_UPDATE_PARAMI(); + NETLIB_RESETI(); + NETLIB_UPDATEI(); + + protected: + logic_input_t m_I; + + logic_output_t m_Q; + + param_int_t m_L_to_H; + param_int_t m_H_to_L; + + UINT8 m_last; + }; + + NETLIB_RESET(nicRSFF) { - // H_to_L - OUTLOGIC(m_Q, 0, NLTIME_FROM_NS(m_H_to_L.Value())); + m_Q.initial(0); + m_QQ.initial(1); } - m_last = nval; -} + + NETLIB_UPDATE(nicRSFF) + { + if (!INPLOGIC(m_S)) + { + OUTLOGIC(m_Q, 1, NLTIME_FROM_NS(20)); + OUTLOGIC(m_QQ, 0, NLTIME_FROM_NS(20)); + } + else if (!INPLOGIC(m_R)) + { + OUTLOGIC(m_Q, 0, NLTIME_FROM_NS(20)); + OUTLOGIC(m_QQ, 1, NLTIME_FROM_NS(20)); + } + } + + NETLIB_RESET(nicDelay) + { + //m_Q.initial(0); + } + + NETLIB_UPDATE(nicDelay) + { + netlist_sig_t nval = INPLOGIC(m_I); + if (nval && !m_last) + { + // L_to_H + OUTLOGIC(m_Q, 1, NLTIME_FROM_NS(m_L_to_H.Value())); + } + else if (!nval && m_last) + { + // H_to_L + OUTLOGIC(m_Q, 0, NLTIME_FROM_NS(m_H_to_L.Value())); + } + m_last = nval; + } + + NETLIB_DEVICE_IMPL(nicRSFF) + NETLIB_DEVICE_IMPL(nicDelay) } //namespace devices } // namespace netlist diff --git a/src/lib/netlist/devices/nld_legacy.h b/src/lib/netlist/devices/nld_legacy.h index 020ea1c3e8a..99a99008451 100644 --- a/src/lib/netlist/devices/nld_legacy.h +++ b/src/lib/netlist/devices/nld_legacy.h @@ -13,76 +13,26 @@ #ifndef NLD_LEGACY_H_ #define NLD_LEGACY_H_ -#include "nl_base.h" - -namespace netlist -{ - namespace devices - { +#include "nl_setup.h" // ---------------------------------------------------------------------------------------- // Macros // ---------------------------------------------------------------------------------------- -#define NETDEV_RSFF(name) \ +#define NETDEV_RSFF(name) \ NET_REGISTER_DEV(NETDEV_RSFF, name) -#define NETDEV_DELAY(name) \ +#define NETDEV_DELAY(name) \ NET_REGISTER_DEV(NETDEV_DELAY, name) // ---------------------------------------------------------------------------------------- // Devices ... // ---------------------------------------------------------------------------------------- -NETLIB_OBJECT(nicRSFF) +namespace netlist { - NETLIB_CONSTRUCTOR(nicRSFF) + namespace devices { - enregister("S", m_S); - enregister("R", m_R); - enregister("Q", m_Q); - enregister("QQ", m_QQ); - } - - NETLIB_RESETI(); - NETLIB_UPDATEI(); - -protected: - logic_input_t m_S; - logic_input_t m_R; - - logic_output_t m_Q; - logic_output_t m_QQ; -}; - - -NETLIB_OBJECT(nicDelay) -{ - NETLIB_CONSTRUCTOR(nicDelay) - , m_L_to_H(*this, "L_TO_H", 10) - , m_H_to_L(*this, "H_TO_L", 10) - , m_last(0) - { - enregister("1", m_I); - enregister("2", m_Q); - - save(NLNAME(m_last)); - } - - //NETLIB_UPDATE_PARAMI(); - NETLIB_RESETI(); - NETLIB_UPDATEI(); - -protected: - logic_input_t m_I; - - logic_output_t m_Q; - - param_int_t m_L_to_H; - param_int_t m_H_to_L; - - UINT8 m_last; -}; } //namespace devices } // namespace netlist diff --git a/src/lib/netlist/devices/nld_log.cpp b/src/lib/netlist/devices/nld_log.cpp index ce91de54415..839254f60d2 100644 --- a/src/lib/netlist/devices/nld_log.cpp +++ b/src/lib/netlist/devices/nld_log.cpp @@ -5,6 +5,10 @@ * */ +#include +#include "nl_base.h" +#include "plib/pstream.h" +#include "plib/pfmtlog.h" #include "nld_log.h" //#include "sound/wavwrite.h" @@ -13,45 +17,82 @@ namespace netlist namespace devices { -//FIXME: what to do with save states? + NETLIB_OBJECT(log) + { + NETLIB_CONSTRUCTOR(log) + { + enregister("I", m_I); -NETLIB_UPDATE(log) -{ - /* use pstring::sprintf, it is a LOT faster */ - m_strm->writeline(plib::pfmt("{1} {2}").e(netlist().time().as_double(),".9").e((nl_double) INPANALOG(m_I))); -} + pstring filename = plib::pfmt("{1}.log")(this->name()); + m_strm = plib::make_unique(filename); + } -NETLIB_NAME(log)::~NETLIB_NAME(log)() -{ - m_strm->close(); -} + NETLIB_UPDATEI() + { + /* use pstring::sprintf, it is a LOT faster */ + m_strm->writeline(plib::pfmt("{1} {2}").e(netlist().time().as_double(),".9").e((nl_double) INPANALOG(m_I))); + } -NETLIB_UPDATE(logD) -{ - m_strm->writeline(plib::pfmt("{1} {2}").e(netlist().time().as_double(),".9").e((nl_double) (INPANALOG(m_I) - INPANALOG(m_I2)))); -} + NETLIB_RESETI() { } + protected: + analog_input_t m_I; + std::unique_ptr m_strm; + }; -// FIXME: Implement wav later, this must be clock triggered device where the input to be written -// is on a subdevice .. -#if 0 -NETLIB_START(wav) -{ - enregister("I", m_I); + NETLIB_OBJECT_DERIVED(logD, log) + { + NETLIB_CONSTRUCTOR_DERIVED(logD, log) + { + enregister("I2", m_I2); + } - pstring filename = "netlist_" + name() + ".wav"; - m_file = wav_open(filename, sample_rate(), active_inputs()/2) -} + NETLIB_UPDATEI() + { + m_strm->writeline(plib::pfmt("{1} {2}").e(netlist().time().as_double(),".9").e((nl_double) (INPANALOG(m_I) - INPANALOG(m_I2)))); + } -NETLIB_UPDATE(wav) -{ - fprintf(m_file, "%e %e\n", netlist().time().as_double(), INPANALOG(m_I)); -} + NETLIB_RESETI() { } + analog_input_t m_I2; + }; -NETLIB_NAME(log)::~NETLIB_NAME(wav)() -{ - fclose(m_file); -} -#endif + #if 0 + NETLIB_DEVICE(wav, + ~NETLIB_NAME(wav)(); + analog_input_t m_I; + private: + // FIXME: rewrite sound/wavwrite.h to be an object ... + void *m_file; + ); + #endif + + //FIXME: what to do with save states? + + + // FIXME: Implement wav later, this must be clock triggered device where the input to be written + // is on a subdevice .. + #if 0 + NETLIB_START(wav) + { + enregister("I", m_I); + + pstring filename = "netlist_" + name() + ".wav"; + m_file = wav_open(filename, sample_rate(), active_inputs()/2) + } + + NETLIB_UPDATE(wav) + { + fprintf(m_file, "%e %e\n", netlist().time().as_double(), INPANALOG(m_I)); + } + + NETLIB_NAME(log)::~NETLIB_NAME(wav)() + { + fclose(m_file); + } + #endif + + + NETLIB_DEVICE_IMPL(log) + NETLIB_DEVICE_IMPL(logD) } //namespace devices } // namespace netlist diff --git a/src/lib/netlist/devices/nld_log.h b/src/lib/netlist/devices/nld_log.h index eacc4246fa7..716aea1b873 100644 --- a/src/lib/netlist/devices/nld_log.h +++ b/src/lib/netlist/devices/nld_log.h @@ -18,10 +18,7 @@ #ifndef NLD_LOG_H_ #define NLD_LOG_H_ -#include -#include "nl_base.h" -#include "plib/pstream.h" -#include "plib/pfmtlog.h" +#include "nl_setup.h" #define LOG(name, cI) \ NET_REGISTER_DEV(??PG, name) \ @@ -32,51 +29,4 @@ NET_CONNECT(name, I, cI) \ NET_CONNECT(name, I2, cI2) - -namespace netlist -{ - namespace devices - { - -NETLIB_OBJECT(log) -{ - NETLIB_CONSTRUCTOR(log) - { - enregister("I", m_I); - - pstring filename = plib::pfmt("{1}.log")(this->name()); - m_strm = plib::make_unique(filename); - } - NETLIB_DESTRUCTOR(log); - NETLIB_UPDATEI(); - NETLIB_RESETI() { } -protected: - analog_input_t m_I; - std::unique_ptr m_strm; -}; - -NETLIB_OBJECT_DERIVED(logD, log) -{ - NETLIB_CONSTRUCTOR_DERIVED(logD, log) - { - enregister("I2", m_I2); - } - NETLIB_UPDATEI(); - NETLIB_RESETI() { }; - analog_input_t m_I2; -}; - -#if 0 -NETLIB_DEVICE(wav, - ~NETLIB_NAME(wav)(); - analog_input_t m_I; -private: - // FIXME: rewrite sound/wavwrite.h to be an object ... - void *m_file; -); -#endif - - } //namespace devices -} // namespace netlist - #endif /* NLD_LOG_H_ */ From 35b3b08ce7dcf8f691c464270a13b5a413d1554f Mon Sep 17 00:00:00 2001 From: couriersud Date: Sun, 29 May 2016 15:47:09 +0200 Subject: [PATCH 11/44] Moved more device definitions into cpp files. (nw) --- src/lib/netlist/devices/net_lib.cpp | 44 +-- src/lib/netlist/devices/nld_74192.cpp | 198 +++++++++--- src/lib/netlist/devices/nld_74192.h | 82 +---- src/lib/netlist/devices/nld_7450.cpp | 111 +++++-- src/lib/netlist/devices/nld_7450.h | 73 +---- src/lib/netlist/devices/nld_7474.cpp | 197 ++++++++---- src/lib/netlist/devices/nld_7474.h | 106 +------ src/lib/netlist/devices/nld_7483.cpp | 116 +++++-- src/lib/netlist/devices/nld_7483.h | 105 +------ src/lib/netlist/devices/nld_7490.cpp | 156 +++++++--- src/lib/netlist/devices/nld_7490.h | 77 +---- src/lib/netlist/devices/nld_7493.cpp | 148 +++++++-- src/lib/netlist/devices/nld_7493.h | 102 +------ src/lib/netlist/devices/nld_74ls629.cpp | 239 +++++++++++---- src/lib/netlist/devices/nld_74ls629.h | 135 +-------- src/lib/netlist/devices/nld_82S16.cpp | 125 ++++++-- src/lib/netlist/devices/nld_82S16.h | 76 +---- src/lib/netlist/devices/nld_9310.cpp | 387 ++++++++++++++++-------- src/lib/netlist/devices/nld_9310.h | 159 +--------- src/lib/netlist/devices/nld_9312.cpp | 248 ++++++++++----- src/lib/netlist/devices/nld_9312.h | 92 +----- src/lib/netlist/devices/nld_9316.cpp | 382 +++++++++++++++-------- src/lib/netlist/devices/nld_9316.h | 143 +-------- 23 files changed, 1738 insertions(+), 1763 deletions(-) diff --git a/src/lib/netlist/devices/net_lib.cpp b/src/lib/netlist/devices/net_lib.cpp index 86482e40da1..5fc7c2c3f46 100644 --- a/src/lib/netlist/devices/net_lib.cpp +++ b/src/lib/netlist/devices/net_lib.cpp @@ -106,25 +106,25 @@ void initialize_factory(factory_list_t &factory) ENTRY(switch2, SWITCH2, "-") ENTRYX(nicRSFF, NETDEV_RSFF, "+S,R") ENTRYX(nicDelay, NETDEV_DELAY, "-") - ENTRY(7450, TTL_7450_ANDORINVERT, "+A,B,C,D") + ENTRYX(7450, TTL_7450_ANDORINVERT, "+A,B,C,D") ENTRYX(7448, TTL_7448, "+A,B,C,D,LTQ,BIQ,RBIQ") - ENTRY(7474, TTL_7474, "+CLK,D,CLRQ,PREQ") - ENTRY(7483, TTL_7483, "+A1,A2,A3,A4,B1,B2,B3,B4,C0") - ENTRY(7490, TTL_7490, "+A,B,R1,R2,R91,R92") - ENTRY(7493, TTL_7493, "+CLKA,CLKB,R1,R2") + ENTRYX(7474, TTL_7474, "+CLK,D,CLRQ,PREQ") + ENTRYX(7483, TTL_7483, "+A1,A2,A3,A4,B1,B2,B3,B4,C0") + ENTRYX(7490, TTL_7490, "+A,B,R1,R2,R91,R92") + ENTRYX(7493, TTL_7493, "+CLKA,CLKB,R1,R2") ENTRYX(74107, TTL_74107, "+CLK,J,K,CLRQ") ENTRYX(74107A, TTL_74107A, "+CLK,J,K,CLRQ") ENTRYX(74123, TTL_74123, "-") ENTRYX(74153, TTL_74153, "+C0,C1,C2,C3,A,B,G") ENTRYX(74175, TTL_74175, "-") - ENTRY(74192, TTL_74192, "-") + ENTRYX(74192, TTL_74192, "-") ENTRYX(74193, TTL_74193, "-") //ENTRY(74279, TTL_74279, "-") // only dip available - ENTRY(SN74LS629, SN74LS629, "CAP") - ENTRY(82S16, TTL_82S16, "-") - ENTRY(9310, TTL_9310, "-") - ENTRY(9312, TTL_9312, "-") - ENTRY(9316, TTL_9316, "+CLK,ENP,ENT,CLRQ,LOADQ,A,B,C,D") + ENTRYX(SN74LS629, SN74LS629, "CAP") + ENTRYX(82S16, TTL_82S16, "-") + ENTRYX(9310, TTL_9310, "-") + ENTRYX(9312, TTL_9312, "-") + ENTRYX(9316, TTL_9316, "+CLK,ENP,ENT,CLRQ,LOADQ,A,B,C,D") ENTRYX(CD4020, CD4020, "") ENTRYX(CD4066_GATE, CD4066_GATE, "") /* entries with suffix WI are legacy only */ @@ -134,24 +134,24 @@ void initialize_factory(factory_list_t &factory) ENTRY(r2r_dac, R2R_DAC, "+VIN,R,N") ENTRYX(4538_dip, CD4538_DIP, "-") ENTRYX(7448_dip, TTL_7448_DIP, "-") - ENTRY(7450_dip, TTL_7450_DIP, "-") - ENTRY(7474_dip, TTL_7474_DIP, "-") - ENTRY(7483_dip, TTL_7483_DIP, "-") - ENTRY(7490_dip, TTL_7490_DIP, "-") - ENTRY(7493_dip, TTL_7493_DIP, "-") + ENTRYX(7450_dip, TTL_7450_DIP, "-") + ENTRYX(7474_dip, TTL_7474_DIP, "-") + ENTRYX(7483_dip, TTL_7483_DIP, "-") + ENTRYX(7490_dip, TTL_7490_DIP, "-") + ENTRYX(7493_dip, TTL_7493_DIP, "-") ENTRYX(74107_dip, TTL_74107_DIP, "-") ENTRYX(74123_dip, TTL_74123_DIP, "-") ENTRYX(74153_dip, TTL_74153_DIP, "-") ENTRYX(74175_dip, TTL_74175_DIP, "-") - ENTRY(74192_dip, TTL_74192_DIP, "-") + ENTRYX(74192_dip, TTL_74192_DIP, "-") ENTRYX(74193_dip, TTL_74193_DIP, "-") ENTRYX(74279_dip, TTL_74279_DIP, "-") - ENTRY(82S16_dip, TTL_82S16_DIP, "-") + ENTRYX(82S16_dip, TTL_82S16_DIP, "-") ENTRYX(9602_dip, TTL_9602_DIP, "-") - ENTRY(9310_dip, TTL_9310_DIP, "-") - ENTRY(9312_dip, TTL_9312_DIP, "-") - ENTRY(9316_dip, TTL_9316_DIP, "-") - ENTRY(SN74LS629_dip, SN74LS629_DIP, "1.CAP1,2.CAP2") + ENTRYX(9310_dip, TTL_9310_DIP, "-") + ENTRYX(9312_dip, TTL_9312_DIP, "-") + ENTRYX(9316_dip, TTL_9316_DIP, "-") + ENTRYX(SN74LS629_dip, SN74LS629_DIP, "1.CAP1,2.CAP2") ENTRY(NE555_dip, NE555_DIP, "-") ENTRY(MM5837_dip, MM5837_DIP, "-") } diff --git a/src/lib/netlist/devices/nld_74192.cpp b/src/lib/netlist/devices/nld_74192.cpp index f6ba9e3c46a..c9ddf77033a 100644 --- a/src/lib/netlist/devices/nld_74192.cpp +++ b/src/lib/netlist/devices/nld_74192.cpp @@ -14,66 +14,170 @@ namespace netlist namespace devices { -NETLIB_RESET(74192) -{ - m_cnt = 0; - m_last_CU = 0; - m_last_CD = 0; -} + NETLIB_OBJECT(74192_subABCD) + { + NETLIB_CONSTRUCTOR(74192_subABCD) + { + enregister("A", m_A); + enregister("B", m_B); + enregister("C", m_C); + enregister("D", m_D); + } -// FIXME: Timing -/* static */ const netlist_time delay[4] = -{ - NLTIME_FROM_NS(40), - NLTIME_FROM_NS(40), - NLTIME_FROM_NS(40), - NLTIME_FROM_NS(40) -}; + NETLIB_RESETI() + { + #if 0 + m_A.inactivate(); + m_B.inactivate(); + m_C.inactivate(); + m_D.inactivate(); + #endif + } + //NETLIB_UPDATEI(); -NETLIB_UPDATE(74192) -{ - int tCarry = 1; - int tBorrow = 1; - if (INPLOGIC(m_CLEAR)) + public: + logic_input_t m_A; + logic_input_t m_B; + logic_input_t m_C; + logic_input_t m_D; + + ATTR_HOT inline UINT8 read_ABCD() const + { + //return (INPLOGIC_PASSIVE(m_D) << 3) | (INPLOGIC_PASSIVE(m_C) << 2) | (INPLOGIC_PASSIVE(m_B) << 1) | (INPLOGIC_PASSIVE(m_A) << 0); + return (INPLOGIC(m_D) << 3) | (INPLOGIC(m_C) << 2) | (INPLOGIC(m_B) << 1) | (INPLOGIC(m_A) << 0); + } + }; + + NETLIB_OBJECT(74192) + { + NETLIB_CONSTRUCTOR(74192) + , m_ABCD(*this, "subABCD") + { + register_subalias("A", m_ABCD.m_A); + register_subalias("B", m_ABCD.m_B); + register_subalias("C", m_ABCD.m_C); + register_subalias("D", m_ABCD.m_D); + enregister("CLEAR", m_CLEAR); + enregister("LOADQ", m_LOADQ); + enregister("CU", m_CU); + enregister("CD", m_CD); + + enregister("QA", m_Q[0]); + enregister("QB", m_Q[1]); + enregister("QC", m_Q[2]); + enregister("QD", m_Q[3]); + enregister("BORROWQ", m_BORROWQ); + enregister("CARRYQ", m_CARRYQ); + + save(NLNAME(m_cnt)); + save(NLNAME(m_last_CU)); + save(NLNAME(m_last_CD)); + } + + NETLIB_RESETI(); + NETLIB_UPDATEI(); + + protected: + NETLIB_SUB(74192_subABCD) m_ABCD; + logic_input_t m_CLEAR; + logic_input_t m_LOADQ; + logic_input_t m_CU; + logic_input_t m_CD; + + INT8 m_cnt; + UINT8 m_last_CU; + UINT8 m_last_CD; + + logic_output_t m_Q[4]; + logic_output_t m_BORROWQ; + logic_output_t m_CARRYQ; + }; + + NETLIB_OBJECT_DERIVED(74192_dip, 74192) + { + NETLIB_CONSTRUCTOR_DERIVED(74192_dip, 74192) + { + register_subalias("1", m_ABCD.m_B); + register_subalias("2", m_Q[1]); + register_subalias("3", m_Q[0]); + register_subalias("4", m_CD); + register_subalias("5", m_CU); + register_subalias("6", m_Q[2]); + register_subalias("7", m_Q[3]); + + register_subalias("9", m_ABCD.m_D); + register_subalias("10", m_ABCD.m_C); + register_subalias("11", m_LOADQ); + register_subalias("12", m_CARRYQ); + register_subalias("13", m_BORROWQ); + register_subalias("14", m_CLEAR); + register_subalias("15", m_ABCD.m_A); + } + }; + + NETLIB_RESET(74192) { m_cnt = 0; + m_last_CU = 0; + m_last_CD = 0; } - else if (!INPLOGIC(m_LOADQ)) + + // FIXME: Timing + /* static */ const netlist_time delay[4] = { - m_cnt = m_ABCD.read_ABCD(); - } - else + NLTIME_FROM_NS(40), + NLTIME_FROM_NS(40), + NLTIME_FROM_NS(40), + NLTIME_FROM_NS(40) + }; + + NETLIB_UPDATE(74192) { - if (INPLOGIC(m_CD) && !m_last_CU && INPLOGIC(m_CU)) + int tCarry = 1; + int tBorrow = 1; + if (INPLOGIC(m_CLEAR)) { - m_cnt++; - if (m_cnt > MAXCNT) - m_cnt = 0; + m_cnt = 0; } - if (INPLOGIC(m_CU) && !m_last_CD && INPLOGIC(m_CD)) + else if (!INPLOGIC(m_LOADQ)) { - if (m_cnt > 0) - m_cnt--; - else - m_cnt = MAXCNT; + m_cnt = m_ABCD.read_ABCD(); } + else + { + if (INPLOGIC(m_CD) && !m_last_CU && INPLOGIC(m_CU)) + { + m_cnt++; + if (m_cnt > MAXCNT) + m_cnt = 0; + } + if (INPLOGIC(m_CU) && !m_last_CD && INPLOGIC(m_CD)) + { + if (m_cnt > 0) + m_cnt--; + else + m_cnt = MAXCNT; + } + } + + if (!INPLOGIC(m_CU) && (m_cnt == MAXCNT)) + tCarry = 0; + + if (!INPLOGIC(m_CD) && (m_cnt == 0)) + tBorrow = 0; + + m_last_CD = INPLOGIC(m_CD); + m_last_CU = INPLOGIC(m_CU); + + for (int i=0; i<4; i++) + OUTLOGIC(m_Q[i], (m_cnt >> i) & 1, delay[i]); + + OUTLOGIC(m_BORROWQ, tBorrow, NLTIME_FROM_NS(20)); //FIXME + OUTLOGIC(m_CARRYQ, tCarry, NLTIME_FROM_NS(20)); //FIXME } - if (!INPLOGIC(m_CU) && (m_cnt == MAXCNT)) - tCarry = 0; - - if (!INPLOGIC(m_CD) && (m_cnt == 0)) - tBorrow = 0; - - m_last_CD = INPLOGIC(m_CD); - m_last_CU = INPLOGIC(m_CU); - - for (int i=0; i<4; i++) - OUTLOGIC(m_Q[i], (m_cnt >> i) & 1, delay[i]); - - OUTLOGIC(m_BORROWQ, tBorrow, NLTIME_FROM_NS(20)); //FIXME - OUTLOGIC(m_CARRYQ, tCarry, NLTIME_FROM_NS(20)); //FIXME -} + NETLIB_DEVICE_IMPL(74192) + NETLIB_DEVICE_IMPL(74192_dip) } //namespace devices } // namespace netlist diff --git a/src/lib/netlist/devices/nld_74192.h b/src/lib/netlist/devices/nld_74192.h index 9cc020b0373..fc5778044eb 100644 --- a/src/lib/netlist/devices/nld_74192.h +++ b/src/lib/netlist/devices/nld_74192.h @@ -29,88 +29,12 @@ #ifndef NLD_74192_H_ #define NLD_74192_H_ -#include "nl_base.h" -#include "nld_9316.h" +#include "nl_setup.h" -#define TTL_74192(name) \ +#define TTL_74192(name) \ NET_REGISTER_DEV(TTL_74192, name) -#define TTL_74192_DIP(name) \ +#define TTL_74192_DIP(name) \ NET_REGISTER_DEV(TTL_74192_DIP, name) -namespace netlist -{ - namespace devices - { - -NETLIB_OBJECT(74192) -{ - NETLIB_CONSTRUCTOR(74192) - , m_ABCD(*this, "subABCD") - { - register_subalias("A", m_ABCD.m_A); - register_subalias("B", m_ABCD.m_B); - register_subalias("C", m_ABCD.m_C); - register_subalias("D", m_ABCD.m_D); - enregister("CLEAR", m_CLEAR); - enregister("LOADQ", m_LOADQ); - enregister("CU", m_CU); - enregister("CD", m_CD); - - enregister("QA", m_Q[0]); - enregister("QB", m_Q[1]); - enregister("QC", m_Q[2]); - enregister("QD", m_Q[3]); - enregister("BORROWQ", m_BORROWQ); - enregister("CARRYQ", m_CARRYQ); - - save(NLNAME(m_cnt)); - save(NLNAME(m_last_CU)); - save(NLNAME(m_last_CD)); - } - - NETLIB_RESETI(); - NETLIB_UPDATEI(); - -protected: - NETLIB_SUB(9316_subABCD) m_ABCD; - logic_input_t m_CLEAR; - logic_input_t m_LOADQ; - logic_input_t m_CU; - logic_input_t m_CD; - - INT8 m_cnt; - UINT8 m_last_CU; - UINT8 m_last_CD; - - logic_output_t m_Q[4]; - logic_output_t m_BORROWQ; - logic_output_t m_CARRYQ; -}; - -NETLIB_OBJECT_DERIVED(74192_dip, 74192) -{ - NETLIB_CONSTRUCTOR_DERIVED(74192_dip, 74192) - { - register_subalias("1", m_ABCD.m_B); - register_subalias("2", m_Q[1]); - register_subalias("3", m_Q[0]); - register_subalias("4", m_CD); - register_subalias("5", m_CU); - register_subalias("6", m_Q[2]); - register_subalias("7", m_Q[3]); - - register_subalias("9", m_ABCD.m_D); - register_subalias("10", m_ABCD.m_C); - register_subalias("11", m_LOADQ); - register_subalias("12", m_CARRYQ); - register_subalias("13", m_BORROWQ); - register_subalias("14", m_CLEAR); - register_subalias("15", m_ABCD.m_A); - } -}; - - } //namespace devices -} // namespace netlist - #endif /* NLD_74192_H_ */ diff --git a/src/lib/netlist/devices/nld_7450.cpp b/src/lib/netlist/devices/nld_7450.cpp index 02d2df7776e..aa997256c5a 100644 --- a/src/lib/netlist/devices/nld_7450.cpp +++ b/src/lib/netlist/devices/nld_7450.cpp @@ -12,39 +12,92 @@ namespace netlist namespace devices { -NETLIB_UPDATE(7450) -{ - m_A.activate(); - m_B.activate(); - m_C.activate(); - m_D.activate(); - UINT8 t1 = INPLOGIC(m_A) & INPLOGIC(m_B); - UINT8 t2 = INPLOGIC(m_C) & INPLOGIC(m_D); - - const netlist_time times[2] = { NLTIME_FROM_NS(22), NLTIME_FROM_NS(15) }; - - UINT8 res = 0; - if (t1 ^ 1) + NETLIB_OBJECT(7450) { - if (t2 ^ 1) + NETLIB_CONSTRUCTOR(7450) { - res = 1; + enregister("A", m_A); + enregister("B", m_B); + enregister("C", m_C); + enregister("D", m_D); + enregister("Q", m_Q); } - else - { - m_A.inactivate(); - m_B.inactivate(); - } - } else { - if (t2 ^ 1) - { - m_C.inactivate(); - m_D.inactivate(); - } - } - OUTLOGIC(m_Q, res, times[1 - res]);// ? 22000 : 15000); -} + //NETLIB_RESETI(); + NETLIB_UPDATEI(); + public: + logic_input_t m_A; + logic_input_t m_B; + logic_input_t m_C; + logic_input_t m_D; + logic_output_t m_Q; + }; + + NETLIB_OBJECT(7450_dip) + { + NETLIB_CONSTRUCTOR(7450_dip) + , m_1(*this, "1") + , m_2(*this, "2") + { + + register_subalias("1", m_1.m_A); + register_subalias("2", m_2.m_A); + register_subalias("3", m_2.m_B); + register_subalias("4", m_2.m_C); + register_subalias("5", m_2.m_D); + register_subalias("6", m_2.m_Q); + //register_subalias("7",); GND + + register_subalias("8", m_1.m_Q); + register_subalias("9", m_1.m_C); + register_subalias("10", m_1.m_D); + //register_subalias("11", m_1.m_X1); + //register_subalias("12", m_1.m_X1Q); + register_subalias("13", m_1.m_B); + //register_subalias("14",); VCC + } + //NETLIB_RESETI(); + //NETLIB_UPDATEI(); + + NETLIB_SUB(7450) m_1; + NETLIB_SUB(7450) m_2; + }; + + NETLIB_UPDATE(7450) + { + m_A.activate(); + m_B.activate(); + m_C.activate(); + m_D.activate(); + UINT8 t1 = INPLOGIC(m_A) & INPLOGIC(m_B); + UINT8 t2 = INPLOGIC(m_C) & INPLOGIC(m_D); + + const netlist_time times[2] = { NLTIME_FROM_NS(22), NLTIME_FROM_NS(15) }; + + UINT8 res = 0; + if (t1 ^ 1) + { + if (t2 ^ 1) + { + res = 1; + } + else + { + m_A.inactivate(); + m_B.inactivate(); + } + } else { + if (t2 ^ 1) + { + m_C.inactivate(); + m_D.inactivate(); + } + } + OUTLOGIC(m_Q, res, times[1 - res]);// ? 22000 : 15000); + } + + NETLIB_DEVICE_IMPL(7450) + NETLIB_DEVICE_IMPL(7450_dip) } //namespace devices } // namespace netlist diff --git a/src/lib/netlist/devices/nld_7450.h b/src/lib/netlist/devices/nld_7450.h index ace80bec0b6..47d997d3f3c 100644 --- a/src/lib/netlist/devices/nld_7450.h +++ b/src/lib/netlist/devices/nld_7450.h @@ -24,75 +24,16 @@ #ifndef NLD_7450_H_ #define NLD_7450_H_ -#include "nl_base.h" +#include "nl_setup.h" -#define TTL_7450_ANDORINVERT(name, cI1, cI2, cI3, cI4) \ - NET_REGISTER_DEV(TTL_7450_ANDORINVERT, name) \ - NET_CONNECT(name, A, cI1) \ - NET_CONNECT(name, B, cI2) \ - NET_CONNECT(name, C, cI3) \ +#define TTL_7450_ANDORINVERT(name, cI1, cI2, cI3, cI4) \ + NET_REGISTER_DEV(TTL_7450_ANDORINVERT, name) \ + NET_CONNECT(name, A, cI1) \ + NET_CONNECT(name, B, cI2) \ + NET_CONNECT(name, C, cI3) \ NET_CONNECT(name, D, cI4) -#define TTL_7450_DIP(name) \ +#define TTL_7450_DIP(name) \ NET_REGISTER_DEV(TTL_7450_DIP, name) -namespace netlist -{ - namespace devices - { - -NETLIB_OBJECT(7450) -{ - NETLIB_CONSTRUCTOR(7450) - { - enregister("A", m_A); - enregister("B", m_B); - enregister("C", m_C); - enregister("D", m_D); - enregister("Q", m_Q); - } - //NETLIB_RESETI(); - NETLIB_UPDATEI(); - -public: - logic_input_t m_A; - logic_input_t m_B; - logic_input_t m_C; - logic_input_t m_D; - logic_output_t m_Q; -}; - -NETLIB_OBJECT(7450_dip) -{ - NETLIB_CONSTRUCTOR(7450_dip) - , m_1(*this, "1") - , m_2(*this, "2") - { - - register_subalias("1", m_1.m_A); - register_subalias("2", m_2.m_A); - register_subalias("3", m_2.m_B); - register_subalias("4", m_2.m_C); - register_subalias("5", m_2.m_D); - register_subalias("6", m_2.m_Q); - //register_subalias("7",); GND - - register_subalias("8", m_1.m_Q); - register_subalias("9", m_1.m_C); - register_subalias("10", m_1.m_D); - //register_subalias("11", m_1.m_X1); - //register_subalias("12", m_1.m_X1Q); - register_subalias("13", m_1.m_B); - //register_subalias("14",); VCC - } - //NETLIB_RESETI(); - //NETLIB_UPDATEI(); - - NETLIB_SUB(7450) m_1; - NETLIB_SUB(7450) m_2; -}; - - } //namespace devices -} // namespace netlist - #endif /* NLD_7450_H_ */ diff --git a/src/lib/netlist/devices/nld_7474.cpp b/src/lib/netlist/devices/nld_7474.cpp index 01fa4008023..f3890f4105d 100644 --- a/src/lib/netlist/devices/nld_7474.cpp +++ b/src/lib/netlist/devices/nld_7474.cpp @@ -12,74 +12,161 @@ namespace netlist namespace devices { -ATTR_HOT inline void NETLIB_NAME(7474sub)::newstate(const UINT8 stateQ, const UINT8 stateQQ) -{ - // 0: High-to-low 40 ns, 1: Low-to-high 25 ns - const netlist_time delay[2] = { NLTIME_FROM_NS(40), NLTIME_FROM_NS(25) }; - OUTLOGIC(m_Q, stateQ, delay[stateQ]); - OUTLOGIC(m_QQ, stateQQ, delay[stateQQ]); -} - -NETLIB_UPDATE(7474sub) -{ - //if (INP_LH(m_CLK)) + NETLIB_OBJECT(7474sub) { - newstate(m_nextD, !m_nextD); - m_CLK.inactivate(); - } -} + NETLIB_CONSTRUCTOR(7474sub) + , m_nextD(0) + { + enregister("CLK", m_CLK); -NETLIB_UPDATE(7474) -{ - if (INPLOGIC(m_PREQ) && INPLOGIC(m_CLRQ)) + enregister("Q", m_Q); + enregister("QQ", m_QQ); + + save(NLNAME(m_nextD)); + } + + NETLIB_RESETI(); + NETLIB_UPDATEI(); + + public: + logic_input_t m_CLK; + logic_output_t m_Q; + logic_output_t m_QQ; + INT8 m_nextD; + + ATTR_HOT inline void newstate(const UINT8 stateQ, const UINT8 stateQQ); + + private: + + }; + + NETLIB_OBJECT(7474) { - m_D.activate(); - sub.m_nextD = INPLOGIC(m_D); - sub.m_CLK.activate_lh(); - } - else if (!INPLOGIC(m_PREQ)) + NETLIB_CONSTRUCTOR(7474) + , sub(*this, "sub") + { + register_subalias("CLK", sub.m_CLK); + enregister("D", m_D); + enregister("CLRQ", m_CLRQ); + enregister("PREQ", m_PREQ); + + register_subalias("Q", sub.m_Q); + register_subalias("QQ", sub.m_QQ); + } + + NETLIB_RESETI(); + NETLIB_UPDATEI(); + + public: + NETLIB_SUB(7474sub) sub; + + logic_input_t m_D; + logic_input_t m_CLRQ; + logic_input_t m_PREQ; + }; + + NETLIB_OBJECT(7474_dip) { - sub.newstate(1, 0); - sub.m_CLK.inactivate(); - m_D.inactivate(); - } - else if (!INPLOGIC(m_CLRQ)) + NETLIB_CONSTRUCTOR(7474_dip) + , m_1(*this, "1") + , m_2(*this, "2") + { + + register_subalias("1", m_1.m_CLRQ); + register_subalias("2", m_1.m_D); + register_subalias("3", m_1.sub.m_CLK); + register_subalias("4", m_1.m_PREQ); + register_subalias("5", m_1.sub.m_Q); + register_subalias("6", m_1.sub.m_QQ); + // register_subalias("7", ); ==> GND + + register_subalias("8", m_2.sub.m_QQ); + register_subalias("9", m_2.sub.m_Q); + register_subalias("10", m_2.m_PREQ); + register_subalias("11", m_2.sub.m_CLK); + register_subalias("12", m_2.m_D); + register_subalias("13", m_2.m_CLRQ); + // register_subalias("14", ); ==> VCC + } + NETLIB_UPDATEI(); + NETLIB_RESETI(); + + private: + NETLIB_SUB(7474) m_1; + NETLIB_SUB(7474) m_2; + }; + + ATTR_HOT inline void NETLIB_NAME(7474sub)::newstate(const UINT8 stateQ, const UINT8 stateQQ) { - sub.newstate(0, 1); - sub.m_CLK.inactivate(); - m_D.inactivate(); + // 0: High-to-low 40 ns, 1: Low-to-high 25 ns + const netlist_time delay[2] = { NLTIME_FROM_NS(40), NLTIME_FROM_NS(25) }; + OUTLOGIC(m_Q, stateQ, delay[stateQ]); + OUTLOGIC(m_QQ, stateQQ, delay[stateQQ]); } - else + + NETLIB_UPDATE(7474sub) { - sub.newstate(1, 1); - sub.m_CLK.inactivate(); - m_D.inactivate(); + //if (INP_LH(m_CLK)) + { + newstate(m_nextD, !m_nextD); + m_CLK.inactivate(); + } } -} -NETLIB_RESET(7474) -{ - sub.do_reset(); -} + NETLIB_UPDATE(7474) + { + if (INPLOGIC(m_PREQ) && INPLOGIC(m_CLRQ)) + { + m_D.activate(); + sub.m_nextD = INPLOGIC(m_D); + sub.m_CLK.activate_lh(); + } + else if (!INPLOGIC(m_PREQ)) + { + sub.newstate(1, 0); + sub.m_CLK.inactivate(); + m_D.inactivate(); + } + else if (!INPLOGIC(m_CLRQ)) + { + sub.newstate(0, 1); + sub.m_CLK.inactivate(); + m_D.inactivate(); + } + else + { + sub.newstate(1, 1); + sub.m_CLK.inactivate(); + m_D.inactivate(); + } + } -NETLIB_RESET(7474sub) -{ - m_CLK.set_state(logic_t::STATE_INP_LH); + NETLIB_RESET(7474) + { + sub.do_reset(); + } - m_nextD = 0; -} + NETLIB_RESET(7474sub) + { + m_CLK.set_state(logic_t::STATE_INP_LH); -NETLIB_RESET(7474_dip) -{ -// m_1.do_reset(); - //m_2.do_reset(); -} + m_nextD = 0; + } -NETLIB_UPDATE(7474_dip) -{ - //m_1.update_dev(); - //m_2.update_dev(); -} + NETLIB_RESET(7474_dip) + { + // m_1.do_reset(); + //m_2.do_reset(); + } + + NETLIB_UPDATE(7474_dip) + { + //m_1.update_dev(); + //m_2.update_dev(); + } + + NETLIB_DEVICE_IMPL(7474) + NETLIB_DEVICE_IMPL(7474_dip) } //namespace devices } // namespace netlist diff --git a/src/lib/netlist/devices/nld_7474.h b/src/lib/netlist/devices/nld_7474.h index ca9d59566ab..25a9efe32c5 100644 --- a/src/lib/netlist/devices/nld_7474.h +++ b/src/lib/netlist/devices/nld_7474.h @@ -42,108 +42,16 @@ #ifndef NLD_7474_H_ #define NLD_7474_H_ -#include "nl_base.h" +#include "nl_setup.h" -#define TTL_7474(name, cCLK, cD, cCLRQ, cPREQ) \ - NET_REGISTER_DEV(TTL_7474, name) \ - NET_CONNECT(name, CLK, cCLK) \ - NET_CONNECT(name, D, cD) \ - NET_CONNECT(name, CLRQ, cCLRQ) \ +#define TTL_7474(name, cCLK, cD, cCLRQ, cPREQ) \ + NET_REGISTER_DEV(TTL_7474, name) \ + NET_CONNECT(name, CLK, cCLK) \ + NET_CONNECT(name, D, cD) \ + NET_CONNECT(name, CLRQ, cCLRQ) \ NET_CONNECT(name, PREQ, cPREQ) -#define TTL_7474_DIP(name) \ +#define TTL_7474_DIP(name) \ NET_REGISTER_DEV(TTL_7474_DIP, name) -namespace netlist -{ - namespace devices - { - -NETLIB_OBJECT(7474sub) -{ - NETLIB_CONSTRUCTOR(7474sub) - , m_nextD(0) - { - enregister("CLK", m_CLK); - - enregister("Q", m_Q); - enregister("QQ", m_QQ); - - save(NLNAME(m_nextD)); - } - - NETLIB_RESETI(); - NETLIB_UPDATEI(); - -public: - logic_input_t m_CLK; - logic_output_t m_Q; - logic_output_t m_QQ; - INT8 m_nextD; - - ATTR_HOT inline void newstate(const UINT8 stateQ, const UINT8 stateQQ); - -private: - -}; - -NETLIB_OBJECT(7474) -{ - NETLIB_CONSTRUCTOR(7474) - , sub(*this, "sub") - { - register_subalias("CLK", sub.m_CLK); - enregister("D", m_D); - enregister("CLRQ", m_CLRQ); - enregister("PREQ", m_PREQ); - - register_subalias("Q", sub.m_Q); - register_subalias("QQ", sub.m_QQ); - } - - NETLIB_RESETI(); - NETLIB_UPDATEI(); - -public: - NETLIB_SUB(7474sub) sub; - - logic_input_t m_D; - logic_input_t m_CLRQ; - logic_input_t m_PREQ; -}; - -NETLIB_OBJECT(7474_dip) -{ - NETLIB_CONSTRUCTOR(7474_dip) - , m_1(*this, "1") - , m_2(*this, "2") - { - - register_subalias("1", m_1.m_CLRQ); - register_subalias("2", m_1.m_D); - register_subalias("3", m_1.sub.m_CLK); - register_subalias("4", m_1.m_PREQ); - register_subalias("5", m_1.sub.m_Q); - register_subalias("6", m_1.sub.m_QQ); - // register_subalias("7", ); ==> GND - - register_subalias("8", m_2.sub.m_QQ); - register_subalias("9", m_2.sub.m_Q); - register_subalias("10", m_2.m_PREQ); - register_subalias("11", m_2.sub.m_CLK); - register_subalias("12", m_2.m_D); - register_subalias("13", m_2.m_CLRQ); - // register_subalias("14", ); ==> VCC - } - NETLIB_UPDATEI(); - NETLIB_RESETI(); - -private: - NETLIB_SUB(7474) m_1; - NETLIB_SUB(7474) m_2; -}; - - } //namespace devices -} // namespace netlist - #endif /* NLD_7474_H_ */ diff --git a/src/lib/netlist/devices/nld_7483.cpp b/src/lib/netlist/devices/nld_7483.cpp index ec32d94f12c..29c28121d8f 100644 --- a/src/lib/netlist/devices/nld_7483.cpp +++ b/src/lib/netlist/devices/nld_7483.cpp @@ -12,28 +12,104 @@ namespace netlist namespace devices { -NETLIB_RESET(7483) -{ - m_lastr = 0; -} - -NETLIB_UPDATE(7483) -{ - UINT8 a = (INPLOGIC(m_A1) << 0) | (INPLOGIC(m_A2) << 1) | (INPLOGIC(m_A3) << 2) | (INPLOGIC(m_A4) << 3); - UINT8 b = (INPLOGIC(m_B1) << 0) | (INPLOGIC(m_B2) << 1) | (INPLOGIC(m_B3) << 2) | (INPLOGIC(m_B4) << 3); - - UINT8 r = a + b + INPLOGIC(m_C0); - - if (r != m_lastr) + NETLIB_OBJECT(7483) { - m_lastr = r; - OUTLOGIC(m_S1, (r >> 0) & 1, NLTIME_FROM_NS(23)); - OUTLOGIC(m_S2, (r >> 1) & 1, NLTIME_FROM_NS(23)); - OUTLOGIC(m_S3, (r >> 2) & 1, NLTIME_FROM_NS(23)); - OUTLOGIC(m_S4, (r >> 3) & 1, NLTIME_FROM_NS(23)); - OUTLOGIC(m_C4, (r >> 4) & 1, NLTIME_FROM_NS(23)); + NETLIB_CONSTRUCTOR(7483) + , m_lastr(0) + { + enregister("A1", m_A1); + enregister("A2", m_A2); + enregister("A3", m_A3); + enregister("A4", m_A4); + enregister("B1", m_B1); + enregister("B2", m_B2); + enregister("B3", m_B3); + enregister("B4", m_B4); + enregister("C0", m_C0); + + enregister("S1", m_S1); + enregister("S2", m_S2); + enregister("S3", m_S3); + enregister("S4", m_S4); + enregister("C4", m_C4); + + save(NLNAME(m_lastr)); + } + NETLIB_RESETI(); + NETLIB_UPDATEI(); + + protected: + logic_input_t m_C0; + logic_input_t m_A1; + logic_input_t m_A2; + logic_input_t m_A3; + logic_input_t m_A4; + logic_input_t m_B1; + logic_input_t m_B2; + logic_input_t m_B3; + logic_input_t m_B4; + + UINT8 m_lastr; + + logic_output_t m_S1; + logic_output_t m_S2; + logic_output_t m_S3; + logic_output_t m_S4; + logic_output_t m_C4; + + }; + + NETLIB_OBJECT_DERIVED(7483_dip, 7483) + { + NETLIB_CONSTRUCTOR_DERIVED(7483_dip, 7483) + { + register_subalias("1", m_A4); + register_subalias("2", m_S3); + register_subalias("3", m_A3); + register_subalias("4", m_B3); + // register_subalias("5", ); --> VCC + register_subalias("6", m_S2); + register_subalias("7", m_B2); + register_subalias("8", m_A2); + + register_subalias("9", m_S1); + register_subalias("10", m_A1); + register_subalias("11", m_B1); + // register_subalias("12", ); --> GND + register_subalias("13", m_C0); + register_subalias("14", m_C4); + register_subalias("15", m_S4); + register_subalias("16", m_B4); + } + //NETLIB_RESETI(); + //NETLIB_UPDATEI(); + }; + + NETLIB_RESET(7483) + { + m_lastr = 0; } -} + + NETLIB_UPDATE(7483) + { + UINT8 a = (INPLOGIC(m_A1) << 0) | (INPLOGIC(m_A2) << 1) | (INPLOGIC(m_A3) << 2) | (INPLOGIC(m_A4) << 3); + UINT8 b = (INPLOGIC(m_B1) << 0) | (INPLOGIC(m_B2) << 1) | (INPLOGIC(m_B3) << 2) | (INPLOGIC(m_B4) << 3); + + UINT8 r = a + b + INPLOGIC(m_C0); + + if (r != m_lastr) + { + m_lastr = r; + OUTLOGIC(m_S1, (r >> 0) & 1, NLTIME_FROM_NS(23)); + OUTLOGIC(m_S2, (r >> 1) & 1, NLTIME_FROM_NS(23)); + OUTLOGIC(m_S3, (r >> 2) & 1, NLTIME_FROM_NS(23)); + OUTLOGIC(m_S4, (r >> 3) & 1, NLTIME_FROM_NS(23)); + OUTLOGIC(m_C4, (r >> 4) & 1, NLTIME_FROM_NS(23)); + } + } + + NETLIB_DEVICE_IMPL(7483) + NETLIB_DEVICE_IMPL(7483_dip) } //namespace devices } // namespace netlist diff --git a/src/lib/netlist/devices/nld_7483.h b/src/lib/netlist/devices/nld_7483.h index 69961fb1d79..5d920c0bdbb 100644 --- a/src/lib/netlist/devices/nld_7483.h +++ b/src/lib/netlist/devices/nld_7483.h @@ -27,102 +27,21 @@ #ifndef NLD_7483_H_ #define NLD_7483_H_ -#include "nl_base.h" +#include "nl_setup.h" -#define TTL_7483(name, cA1, cA2, cA3, cA4, cB1, cB2, cB3, cB4, cCI) \ - NET_REGISTER_DEV(TTL_7483, name) \ - NET_CONNECT(name, A1, cA1) \ - NET_CONNECT(name, A2, cA2) \ - NET_CONNECT(name, A3, cA3) \ - NET_CONNECT(name, A4, cA4) \ - NET_CONNECT(name, B1, cB1) \ - NET_CONNECT(name, B2, cB2) \ - NET_CONNECT(name, B3, cB3) \ - NET_CONNECT(name, B4, cB4) \ +#define TTL_7483(name, cA1, cA2, cA3, cA4, cB1, cB2, cB3, cB4, cCI) \ + NET_REGISTER_DEV(TTL_7483, name) \ + NET_CONNECT(name, A1, cA1) \ + NET_CONNECT(name, A2, cA2) \ + NET_CONNECT(name, A3, cA3) \ + NET_CONNECT(name, A4, cA4) \ + NET_CONNECT(name, B1, cB1) \ + NET_CONNECT(name, B2, cB2) \ + NET_CONNECT(name, B3, cB3) \ + NET_CONNECT(name, B4, cB4) \ NET_CONNECT(name, C0, cCI) -#define TTL_7483_DIP(name) \ +#define TTL_7483_DIP(name) \ NET_REGISTER_DEV(TTL_7483_DIP, name) -namespace netlist -{ - namespace devices - { - -NETLIB_OBJECT(7483) -{ - NETLIB_CONSTRUCTOR(7483) - , m_lastr(0) - { - enregister("A1", m_A1); - enregister("A2", m_A2); - enregister("A3", m_A3); - enregister("A4", m_A4); - enregister("B1", m_B1); - enregister("B2", m_B2); - enregister("B3", m_B3); - enregister("B4", m_B4); - enregister("C0", m_C0); - - enregister("S1", m_S1); - enregister("S2", m_S2); - enregister("S3", m_S3); - enregister("S4", m_S4); - enregister("C4", m_C4); - - save(NLNAME(m_lastr)); - } - NETLIB_RESETI(); - NETLIB_UPDATEI(); - -protected: - logic_input_t m_C0; - logic_input_t m_A1; - logic_input_t m_A2; - logic_input_t m_A3; - logic_input_t m_A4; - logic_input_t m_B1; - logic_input_t m_B2; - logic_input_t m_B3; - logic_input_t m_B4; - - UINT8 m_lastr; - - logic_output_t m_S1; - logic_output_t m_S2; - logic_output_t m_S3; - logic_output_t m_S4; - logic_output_t m_C4; - -}; - -NETLIB_OBJECT_DERIVED(7483_dip, 7483) -{ - NETLIB_CONSTRUCTOR_DERIVED(7483_dip, 7483) - { - register_subalias("1", m_A4); - register_subalias("2", m_S3); - register_subalias("3", m_A3); - register_subalias("4", m_B3); - // register_subalias("5", ); --> VCC - register_subalias("6", m_S2); - register_subalias("7", m_B2); - register_subalias("8", m_A2); - - register_subalias("9", m_S1); - register_subalias("10", m_A1); - register_subalias("11", m_B1); - // register_subalias("12", ); --> GND - register_subalias("13", m_C0); - register_subalias("14", m_C4); - register_subalias("15", m_S4); - register_subalias("16", m_B4); - } - //NETLIB_RESETI(); - //NETLIB_UPDATEI(); -}; - - } //namespace devices -} // namespace netlist - #endif /* NLD_7483_H_ */ diff --git a/src/lib/netlist/devices/nld_7490.cpp b/src/lib/netlist/devices/nld_7490.cpp index e77a39f8dcc..fbe0bda2443 100644 --- a/src/lib/netlist/devices/nld_7490.cpp +++ b/src/lib/netlist/devices/nld_7490.cpp @@ -12,59 +12,129 @@ namespace netlist namespace devices { -NETLIB_RESET(7490) -{ - m_cnt = 0; - m_last_A = 0; - m_last_B = 0; -} - -static const netlist_time delay[4] = -{ - NLTIME_FROM_NS(18), - NLTIME_FROM_NS(36) - NLTIME_FROM_NS(18), - NLTIME_FROM_NS(54) - NLTIME_FROM_NS(18), - NLTIME_FROM_NS(72) - NLTIME_FROM_NS(18)}; - -NETLIB_UPDATE(7490) -{ - const netlist_sig_t new_A = INPLOGIC(m_A); - const netlist_sig_t new_B = INPLOGIC(m_B); - - if (INPLOGIC(m_R91) & INPLOGIC(m_R92)) + NETLIB_OBJECT(7490) { - m_cnt = 9; - update_outputs(); - } - else if (INPLOGIC(m_R1) & INPLOGIC(m_R2)) + NETLIB_CONSTRUCTOR(7490) + , m_cnt(0) + , m_last_A(0) + , m_last_B(0) + { + enregister("A", m_A); + enregister("B", m_B); + enregister("R1", m_R1); + enregister("R2", m_R2); + enregister("R91", m_R91); + enregister("R92", m_R92); + + enregister("QA", m_Q[0]); + enregister("QB", m_Q[1]); + enregister("QC", m_Q[2]); + enregister("QD", m_Q[3]); + + save(NLNAME(m_cnt)); + save(NLNAME(m_last_A)); + save(NLNAME(m_last_B)); + } + + NETLIB_UPDATEI(); + NETLIB_RESETI(); + + protected: + ATTR_HOT void update_outputs(); + + logic_input_t m_R1; + logic_input_t m_R2; + logic_input_t m_R91; + logic_input_t m_R92; + logic_input_t m_A; + logic_input_t m_B; + + UINT8 m_cnt; + UINT8 m_last_A; + UINT8 m_last_B; + + logic_output_t m_Q[4]; + }; + + NETLIB_OBJECT_DERIVED(7490_dip, 7490) + { + NETLIB_CONSTRUCTOR_DERIVED(7490_dip, 7490) + { + register_subalias("1", m_B); + register_subalias("2", m_R1); + register_subalias("3", m_R2); + + // register_subalias("4", ); --> NC + // register_subalias("5", ); --> VCC + register_subalias("6", m_R91); + register_subalias("7", m_R92); + + register_subalias("8", m_Q[2]); + register_subalias("9", m_Q[1]); + // register_subalias("10", ); --> GND + register_subalias("11", m_Q[3]); + register_subalias("12", m_Q[0]); + // register_subalias("13", ); --> NC + register_subalias("14", m_A); + } + }; + + NETLIB_RESET(7490) { m_cnt = 0; - update_outputs(); + m_last_A = 0; + m_last_B = 0; } - else + + static const netlist_time delay[4] = { - if (m_last_A && !new_A) // High - Low + NLTIME_FROM_NS(18), + NLTIME_FROM_NS(36) - NLTIME_FROM_NS(18), + NLTIME_FROM_NS(54) - NLTIME_FROM_NS(18), + NLTIME_FROM_NS(72) - NLTIME_FROM_NS(18)}; + + NETLIB_UPDATE(7490) + { + const netlist_sig_t new_A = INPLOGIC(m_A); + const netlist_sig_t new_B = INPLOGIC(m_B); + + if (INPLOGIC(m_R91) & INPLOGIC(m_R92)) { - m_cnt ^= 1; - OUTLOGIC(m_Q[0], m_cnt & 1, delay[0]); - } - if (m_last_B && !new_B) // High - Low - { - m_cnt += 2; - if (m_cnt >= 10) - m_cnt &= 1; /* Output A is not reset! */ + m_cnt = 9; update_outputs(); } + else if (INPLOGIC(m_R1) & INPLOGIC(m_R2)) + { + m_cnt = 0; + update_outputs(); + } + else + { + if (m_last_A && !new_A) // High - Low + { + m_cnt ^= 1; + OUTLOGIC(m_Q[0], m_cnt & 1, delay[0]); + } + if (m_last_B && !new_B) // High - Low + { + m_cnt += 2; + if (m_cnt >= 10) + m_cnt &= 1; /* Output A is not reset! */ + update_outputs(); + } + } + m_last_A = new_A; + m_last_B = new_B; } - m_last_A = new_A; - m_last_B = new_B; -} -NETLIB_FUNC_VOID(7490, update_outputs, (void)) -{ - for (int i=0; i<4; i++) - OUTLOGIC(m_Q[i], (m_cnt >> i) & 1, delay[i]); -} + NETLIB_FUNC_VOID(7490, update_outputs, (void)) + { + for (int i=0; i<4; i++) + OUTLOGIC(m_Q[i], (m_cnt >> i) & 1, delay[i]); + } + + NETLIB_DEVICE_IMPL(7490) + NETLIB_DEVICE_IMPL(7490_dip) } //namespace devices } // namespace netlist diff --git a/src/lib/netlist/devices/nld_7490.h b/src/lib/netlist/devices/nld_7490.h index c9ac380ba64..657972618e9 100644 --- a/src/lib/netlist/devices/nld_7490.h +++ b/src/lib/netlist/devices/nld_7490.h @@ -55,7 +55,7 @@ #ifndef NLD_7490_H_ #define NLD_7490_H_ -#include "nl_base.h" +#include "nl_setup.h" #define TTL_7490(name, cA, cB, cR1, cR2, cR91, cR92) \ NET_REGISTER_DEV(TTL_7490, name) \ @@ -69,79 +69,4 @@ #define TTL_7490_DIP(name) \ NET_REGISTER_DEV(TTL_7490_DIP, name) -namespace netlist -{ - namespace devices - { - -NETLIB_OBJECT(7490) -{ - NETLIB_CONSTRUCTOR(7490) - , m_cnt(0) - , m_last_A(0) - , m_last_B(0) - { - enregister("A", m_A); - enregister("B", m_B); - enregister("R1", m_R1); - enregister("R2", m_R2); - enregister("R91", m_R91); - enregister("R92", m_R92); - - enregister("QA", m_Q[0]); - enregister("QB", m_Q[1]); - enregister("QC", m_Q[2]); - enregister("QD", m_Q[3]); - - save(NLNAME(m_cnt)); - save(NLNAME(m_last_A)); - save(NLNAME(m_last_B)); - } - - NETLIB_UPDATEI(); - NETLIB_RESETI(); - -protected: - ATTR_HOT void update_outputs(); - - logic_input_t m_R1; - logic_input_t m_R2; - logic_input_t m_R91; - logic_input_t m_R92; - logic_input_t m_A; - logic_input_t m_B; - - UINT8 m_cnt; - UINT8 m_last_A; - UINT8 m_last_B; - - logic_output_t m_Q[4]; -}; - -NETLIB_OBJECT_DERIVED(7490_dip, 7490) -{ - NETLIB_CONSTRUCTOR_DERIVED(7490_dip, 7490) - { - register_subalias("1", m_B); - register_subalias("2", m_R1); - register_subalias("3", m_R2); - - // register_subalias("4", ); --> NC - // register_subalias("5", ); --> VCC - register_subalias("6", m_R91); - register_subalias("7", m_R92); - - register_subalias("8", m_Q[2]); - register_subalias("9", m_Q[1]); - // register_subalias("10", ); --> GND - register_subalias("11", m_Q[3]); - register_subalias("12", m_Q[0]); - // register_subalias("13", ); --> NC - register_subalias("14", m_A); - } -}; - - } //namespace devices -} // namespace netlist - #endif /* NLD_7490_H_ */ diff --git a/src/lib/netlist/devices/nld_7493.cpp b/src/lib/netlist/devices/nld_7493.cpp index 89c9cd477c1..3ed976cfa86 100644 --- a/src/lib/netlist/devices/nld_7493.cpp +++ b/src/lib/netlist/devices/nld_7493.cpp @@ -14,45 +14,127 @@ namespace netlist { -NETLIB_RESET(7493ff) -{ - m_reset = 1; - m_state = 0; - m_I.set_state(logic_t::STATE_INP_HL); -} - -NETLIB_UPDATE(7493ff) -{ - const netlist_time out_delay = NLTIME_FROM_NS(18); - if (m_reset != 0) + NETLIB_OBJECT(7493ff) { - m_state ^= 1; - OUTLOGIC(m_Q, m_state, out_delay); - } -} + NETLIB_CONSTRUCTOR(7493ff) + { + enregister("CLK", m_I); + enregister("Q", m_Q); -NETLIB_UPDATE(7493) -{ - const netlist_sig_t r = INPLOGIC(m_R1) & INPLOGIC(m_R2); + save(NLNAME(m_reset)); + save(NLNAME(m_state)); + } - if (r) + NETLIB_RESETI(); + NETLIB_UPDATEI(); + + public: + logic_input_t m_I; + logic_output_t m_Q; + + UINT8 m_reset; + UINT8 m_state; + }; + + NETLIB_OBJECT(7493) { - A.m_I.inactivate(); - B.m_I.inactivate(); - OUTLOGIC(A.m_Q, 0, NLTIME_FROM_NS(40)); - OUTLOGIC(B.m_Q, 0, NLTIME_FROM_NS(40)); - OUTLOGIC(C.m_Q, 0, NLTIME_FROM_NS(40)); - OUTLOGIC(D.m_Q, 0, NLTIME_FROM_NS(40)); - A.m_reset = B.m_reset = C.m_reset = D.m_reset = 0; - A.m_state = B.m_state = C.m_state = D.m_state = 0; - } - else + NETLIB_CONSTRUCTOR(7493) + , A(*this, "A") + , B(*this, "B") + , C(*this, "C") + , D(*this, "D") + { + register_subalias("CLKA", A.m_I); + register_subalias("CLKB", B.m_I); + enregister("R1", m_R1); + enregister("R2", m_R2); + + register_subalias("QA", A.m_Q); + register_subalias("QB", B.m_Q); + register_subalias("QC", C.m_Q); + register_subalias("QD", D.m_Q); + + connect_late(C.m_I, B.m_Q); + connect_late(D.m_I, C.m_Q); + } + + NETLIB_RESETI() { } + NETLIB_UPDATEI(); + + logic_input_t m_R1; + logic_input_t m_R2; + + NETLIB_SUB(7493ff) A; + NETLIB_SUB(7493ff) B; + NETLIB_SUB(7493ff) C; + NETLIB_SUB(7493ff) D; + }; + + NETLIB_OBJECT_DERIVED(7493_dip, 7493) { - A.m_I.activate_hl(); - B.m_I.activate_hl(); - A.m_reset = B.m_reset = C.m_reset = D.m_reset = 1; + NETLIB_CONSTRUCTOR_DERIVED(7493_dip, 7493) + { + register_subalias("1", B.m_I); + register_subalias("2", m_R1); + register_subalias("3", m_R2); + + // register_subalias("4", ); --> NC + // register_subalias("5", ); --> VCC + // register_subalias("6", ); --> NC + // register_subalias("7", ); --> NC + + register_subalias("8", C.m_Q); + register_subalias("9", B.m_Q); + // register_subalias("10", ); -. GND + register_subalias("11", D.m_Q); + register_subalias("12", A.m_Q); + // register_subalias("13", ); -. NC + register_subalias("14", A.m_I); + } + }; + + NETLIB_RESET(7493ff) + { + m_reset = 1; + m_state = 0; + m_I.set_state(logic_t::STATE_INP_HL); } -} + + NETLIB_UPDATE(7493ff) + { + const netlist_time out_delay = NLTIME_FROM_NS(18); + if (m_reset != 0) + { + m_state ^= 1; + OUTLOGIC(m_Q, m_state, out_delay); + } + } + + NETLIB_UPDATE(7493) + { + const netlist_sig_t r = INPLOGIC(m_R1) & INPLOGIC(m_R2); + + if (r) + { + A.m_I.inactivate(); + B.m_I.inactivate(); + OUTLOGIC(A.m_Q, 0, NLTIME_FROM_NS(40)); + OUTLOGIC(B.m_Q, 0, NLTIME_FROM_NS(40)); + OUTLOGIC(C.m_Q, 0, NLTIME_FROM_NS(40)); + OUTLOGIC(D.m_Q, 0, NLTIME_FROM_NS(40)); + A.m_reset = B.m_reset = C.m_reset = D.m_reset = 0; + A.m_state = B.m_state = C.m_state = D.m_state = 0; + } + else + { + A.m_I.activate_hl(); + B.m_I.activate_hl(); + A.m_reset = B.m_reset = C.m_reset = D.m_reset = 1; + } + } + + NETLIB_DEVICE_IMPL(7493) + NETLIB_DEVICE_IMPL(7493_dip) } //namespace devices } // namespace netlist diff --git a/src/lib/netlist/devices/nld_7493.h b/src/lib/netlist/devices/nld_7493.h index 2829807a7b2..e102b07ed8a 100644 --- a/src/lib/netlist/devices/nld_7493.h +++ b/src/lib/netlist/devices/nld_7493.h @@ -57,104 +57,16 @@ #ifndef NLD_7493_H_ #define NLD_7493_H_ -#include "nl_base.h" +#include "nl_setup.h" -#define TTL_7493(name, cCLKA, cCLKB, cR1, cR2) \ - NET_REGISTER_DEV(TTL_7493, name) \ - NET_CONNECT(name, CLKA, cCLKA) \ - NET_CONNECT(name, CLKB, cCLKB) \ - NET_CONNECT(name, R1, cR1) \ +#define TTL_7493(name, cCLKA, cCLKB, cR1, cR2) \ + NET_REGISTER_DEV(TTL_7493, name) \ + NET_CONNECT(name, CLKA, cCLKA) \ + NET_CONNECT(name, CLKB, cCLKB) \ + NET_CONNECT(name, R1, cR1) \ NET_CONNECT(name, R2, cR2) -#define TTL_7493_DIP(name) \ +#define TTL_7493_DIP(name) \ NET_REGISTER_DEV(TTL_7493_DIP, name) -namespace netlist -{ - namespace devices - { - -NETLIB_OBJECT(7493ff) -{ - NETLIB_CONSTRUCTOR(7493ff) - { - enregister("CLK", m_I); - enregister("Q", m_Q); - - save(NLNAME(m_reset)); - save(NLNAME(m_state)); - } - - NETLIB_RESETI(); - NETLIB_UPDATEI(); - -public: - logic_input_t m_I; - logic_output_t m_Q; - - UINT8 m_reset; - UINT8 m_state; -}; - -NETLIB_OBJECT(7493) -{ - NETLIB_CONSTRUCTOR(7493) - , A(*this, "A") - , B(*this, "B") - , C(*this, "C") - , D(*this, "D") - { - register_subalias("CLKA", A.m_I); - register_subalias("CLKB", B.m_I); - enregister("R1", m_R1); - enregister("R2", m_R2); - - register_subalias("QA", A.m_Q); - register_subalias("QB", B.m_Q); - register_subalias("QC", C.m_Q); - register_subalias("QD", D.m_Q); - - connect_late(C.m_I, B.m_Q); - connect_late(D.m_I, C.m_Q); - } - - NETLIB_RESETI() { } - NETLIB_UPDATEI(); - - logic_input_t m_R1; - logic_input_t m_R2; - - NETLIB_SUB(7493ff) A; - NETLIB_SUB(7493ff) B; - NETLIB_SUB(7493ff) C; - NETLIB_SUB(7493ff) D; -}; - -NETLIB_OBJECT_DERIVED(7493_dip, 7493) -{ - NETLIB_CONSTRUCTOR_DERIVED(7493_dip, 7493) - { - register_subalias("1", B.m_I); - register_subalias("2", m_R1); - register_subalias("3", m_R2); - - // register_subalias("4", ); --> NC - // register_subalias("5", ); --> VCC - // register_subalias("6", ); --> NC - // register_subalias("7", ); --> NC - - register_subalias("8", C.m_Q); - register_subalias("9", B.m_Q); - // register_subalias("10", ); -. GND - register_subalias("11", D.m_Q); - register_subalias("12", A.m_Q); - // register_subalias("13", ); -. NC - register_subalias("14", A.m_I); - } -}; - - } //namespace devices -} // namespace netlist - - #endif /* NLD_7493_H_ */ diff --git a/src/lib/netlist/devices/nld_74ls629.cpp b/src/lib/netlist/devices/nld_74ls629.cpp index 74fe87df669..909a862862f 100644 --- a/src/lib/netlist/devices/nld_74ls629.cpp +++ b/src/lib/netlist/devices/nld_74ls629.cpp @@ -40,88 +40,205 @@ #include "nld_74ls629.h" -#include "nl_setup.h" +#include "analog/nld_twoterm.h" namespace netlist { namespace devices { -NETLIB_UPDATE(SN74LS629clk) -{ - if (!m_enableq) + NETLIB_OBJECT(SN74LS629clk) { - m_out = m_out ^ 1; - OUTLOGIC(m_Y, m_out, m_inc); - } - else + NETLIB_CONSTRUCTOR(SN74LS629clk) + , m_enableq(1) + , m_out(0) + , m_inc(netlist_time::zero) + { + enregister("FB", m_FB); + enregister("Y", m_Y); + + connect_late(m_FB, m_Y); + + save(NLNAME(m_enableq)); + save(NLNAME(m_inc)); + save(NLNAME(m_out)); + } + + NETLIB_RESETI() + { + m_enableq = 1; + m_out = 0; + m_inc = netlist_time::zero; + } + + NETLIB_UPDATEI(); + + public: + logic_input_t m_FB; + logic_output_t m_Y; + + netlist_sig_t m_enableq; + netlist_sig_t m_out; + netlist_time m_inc; + }; + + NETLIB_OBJECT(SN74LS629) { - OUTLOGIC(m_Y, 1, m_inc); - } -} + NETLIB_CONSTRUCTOR(SN74LS629) + , m_clock(*this, "OSC") + , m_R_FC(*this, "R_FC") + , m_R_RNG(*this, "R_RNG") + , m_CAP(*this, "CAP", 1e-6) + { + enregister("ENQ", m_ENQ); + enregister("RNG", m_RNG); + enregister("FC", m_FC); + register_subalias("GND", m_R_FC.m_N); -NETLIB_UPDATE(SN74LS629) -{ + connect_late(m_FC, m_R_FC.m_P); + connect_late(m_RNG, m_R_RNG.m_P); + connect_late(m_R_FC.m_N, m_R_RNG.m_N); + + register_subalias("Y", m_clock.m_Y); + } + + NETLIB_RESETI() + { + m_R_FC.set_R(90000.0); + m_R_RNG.set_R(90000.0); + m_clock.do_reset(); + } + NETLIB_UPDATEI(); + + NETLIB_UPDATE_PARAMI() { update_dev(); } + + public: + NETLIB_SUB(SN74LS629clk) m_clock; + NETLIB_SUB(R_base) m_R_FC; + NETLIB_SUB(R_base) m_R_RNG; + + logic_input_t m_ENQ; + analog_input_t m_RNG; + analog_input_t m_FC; + + param_double_t m_CAP; + }; + + NETLIB_OBJECT(SN74LS629_dip) { - // recompute - nl_double freq; - nl_double v_freq_2, v_freq_3, v_freq_4; - nl_double v_freq = INPANALOG(m_FC); - nl_double v_rng = INPANALOG(m_RNG); + NETLIB_CONSTRUCTOR(SN74LS629_dip) + , m_1(*this, "1") + , m_2(*this, "2") + { + register_subalias("1", m_2.m_FC); + register_subalias("2", m_1.m_FC); + register_subalias("3", m_1.m_RNG); - /* coefficients */ - const nl_double k1 = 1.9904769024796283E+03; - const nl_double k2 = 1.2070059213983407E+03; - const nl_double k3 = 1.3266985579561108E+03; - const nl_double k4 = -1.5500979825922698E+02; - const nl_double k5 = 2.8184536266938172E+00; - const nl_double k6 = -2.3503421582744556E+02; - const nl_double k7 = -3.3836786704527788E+02; - const nl_double k8 = -1.3569136703258670E+02; - const nl_double k9 = 2.9914575453819188E+00; - const nl_double k10 = 1.6855569086173170E+00; + register_subalias("6", m_1.m_ENQ); + register_subalias("7", m_1.m_clock.m_Y); - /* scale due to input resistance */ + register_subalias("8", m_1.m_R_FC.m_N); + register_subalias("9", m_1.m_R_FC.m_N); + connect_late(m_1.m_R_FC.m_N, m_2.m_R_FC.m_N); - /* Polyfunctional3D_model created by zunzun.com using sum of squared absolute error */ + register_subalias("10", m_2.m_clock.m_Y); - v_freq_2 = v_freq * v_freq; - v_freq_3 = v_freq_2 * v_freq; - v_freq_4 = v_freq_3 * v_freq; - freq = k1; - freq += k2 * v_freq; - freq += k3 * v_freq_2; - freq += k4 * v_freq_3; - freq += k5 * v_freq_4; - freq += k6 * v_rng; - freq += k7 * v_rng * v_freq; - freq += k8 * v_rng * v_freq_2; - freq += k9 * v_rng * v_freq_3; - freq += k10 * v_rng * v_freq_4; + register_subalias("11", m_2.m_ENQ); + register_subalias("14", m_2.m_RNG); + } - freq *= NL_FCONST(0.1e-6) / m_CAP; + NETLIB_UPDATEI() { } - // FIXME: we need a possibility to remove entries from queue ... - // or an exact model ... - m_clock.m_inc = netlist_time::from_double(0.5 / (double) freq); - //m_clock.update(); + NETLIB_RESETI() + { + m_1.do_reset(); + m_2.do_reset(); + } - //NL_VERBOSE_OUT(("{1} {2} {3} {4}\n", name(), v_freq, v_rng, freq)); + private: + NETLIB_SUB(SN74LS629) m_1; + NETLIB_SUB(SN74LS629) m_2; + }; + + + NETLIB_UPDATE(SN74LS629clk) + { + if (!m_enableq) + { + m_out = m_out ^ 1; + OUTLOGIC(m_Y, m_out, m_inc); + } + else + { + OUTLOGIC(m_Y, 1, m_inc); + } } - if (!m_clock.m_enableq && INPLOGIC(m_ENQ)) + NETLIB_UPDATE(SN74LS629) { - m_clock.m_enableq = 1; - m_clock.m_out = m_clock.m_out ^ 1; - OUTLOGIC(m_clock.m_Y, m_clock.m_out, netlist_time::from_nsec(1)); + { + // recompute + nl_double freq; + nl_double v_freq_2, v_freq_3, v_freq_4; + nl_double v_freq = INPANALOG(m_FC); + nl_double v_rng = INPANALOG(m_RNG); + + /* coefficients */ + const nl_double k1 = 1.9904769024796283E+03; + const nl_double k2 = 1.2070059213983407E+03; + const nl_double k3 = 1.3266985579561108E+03; + const nl_double k4 = -1.5500979825922698E+02; + const nl_double k5 = 2.8184536266938172E+00; + const nl_double k6 = -2.3503421582744556E+02; + const nl_double k7 = -3.3836786704527788E+02; + const nl_double k8 = -1.3569136703258670E+02; + const nl_double k9 = 2.9914575453819188E+00; + const nl_double k10 = 1.6855569086173170E+00; + + /* scale due to input resistance */ + + /* Polyfunctional3D_model created by zunzun.com using sum of squared absolute error */ + + v_freq_2 = v_freq * v_freq; + v_freq_3 = v_freq_2 * v_freq; + v_freq_4 = v_freq_3 * v_freq; + freq = k1; + freq += k2 * v_freq; + freq += k3 * v_freq_2; + freq += k4 * v_freq_3; + freq += k5 * v_freq_4; + freq += k6 * v_rng; + freq += k7 * v_rng * v_freq; + freq += k8 * v_rng * v_freq_2; + freq += k9 * v_rng * v_freq_3; + freq += k10 * v_rng * v_freq_4; + + freq *= NL_FCONST(0.1e-6) / m_CAP; + + // FIXME: we need a possibility to remove entries from queue ... + // or an exact model ... + m_clock.m_inc = netlist_time::from_double(0.5 / (double) freq); + //m_clock.update(); + + //NL_VERBOSE_OUT(("{1} {2} {3} {4}\n", name(), v_freq, v_rng, freq)); + } + + if (!m_clock.m_enableq && INPLOGIC(m_ENQ)) + { + m_clock.m_enableq = 1; + m_clock.m_out = m_clock.m_out ^ 1; + OUTLOGIC(m_clock.m_Y, m_clock.m_out, netlist_time::from_nsec(1)); + } + else if (m_clock.m_enableq && !INPLOGIC(m_ENQ)) + { + m_clock.m_enableq = 0; + m_clock.m_out = m_clock.m_out ^ 1; + OUTLOGIC(m_clock.m_Y, m_clock.m_out, netlist_time::from_nsec(1)); + } } - else if (m_clock.m_enableq && !INPLOGIC(m_ENQ)) - { - m_clock.m_enableq = 0; - m_clock.m_out = m_clock.m_out ^ 1; - OUTLOGIC(m_clock.m_Y, m_clock.m_out, netlist_time::from_nsec(1)); - } -} + + NETLIB_DEVICE_IMPL(SN74LS629) + NETLIB_DEVICE_IMPL(SN74LS629_dip) } //namespace devices } // namespace netlist diff --git a/src/lib/netlist/devices/nld_74ls629.h b/src/lib/netlist/devices/nld_74ls629.h index b61ae9492f4..273436f09fa 100644 --- a/src/lib/netlist/devices/nld_74ls629.h +++ b/src/lib/netlist/devices/nld_74ls629.h @@ -28,138 +28,15 @@ #ifndef NLD_74LS629_H_ #define NLD_74LS629_H_ -#include "nl_base.h" -#include "analog/nld_twoterm.h" +#include "nl_setup.h" -#define SN74LS629(name, p_cap) \ - NET_REGISTER_DEV(SN74LS629, name) \ +#define SN74LS629(name, p_cap) \ + NET_REGISTER_DEV(SN74LS629, name) \ NETDEV_PARAMI(name, CAP, p_cap) -#define SN74LS629_DIP(name, p_cap1, p_cap2) \ - NET_REGISTER_DEV(SN74LS629_DIP, name) \ - NETDEV_PARAMI(name, 1.CAP, p_cap1) \ +#define SN74LS629_DIP(name, p_cap1, p_cap2) \ + NET_REGISTER_DEV(SN74LS629_DIP, name) \ + NETDEV_PARAMI(name, 1.CAP, p_cap1) \ NETDEV_PARAMI(name, 2.CAP, p_cap2) -namespace netlist -{ - namespace devices - { - -NETLIB_OBJECT(SN74LS629clk) -{ - NETLIB_CONSTRUCTOR(SN74LS629clk) - , m_enableq(1) - , m_out(0) - , m_inc(netlist_time::zero) - { - enregister("FB", m_FB); - enregister("Y", m_Y); - - connect_late(m_FB, m_Y); - - save(NLNAME(m_enableq)); - save(NLNAME(m_inc)); - save(NLNAME(m_out)); - } - - NETLIB_RESETI() - { - m_enableq = 1; - m_out = 0; - m_inc = netlist_time::zero; - } - - NETLIB_UPDATEI(); - -public: - logic_input_t m_FB; - logic_output_t m_Y; - - netlist_sig_t m_enableq; - netlist_sig_t m_out; - netlist_time m_inc; -}; - -NETLIB_OBJECT(SN74LS629) -{ - NETLIB_CONSTRUCTOR(SN74LS629) - , m_clock(*this, "OSC") - , m_R_FC(*this, "R_FC") - , m_R_RNG(*this, "R_RNG") - , m_CAP(*this, "CAP", 1e-6) - { - enregister("ENQ", m_ENQ); - enregister("RNG", m_RNG); - enregister("FC", m_FC); - register_subalias("GND", m_R_FC.m_N); - - connect_late(m_FC, m_R_FC.m_P); - connect_late(m_RNG, m_R_RNG.m_P); - connect_late(m_R_FC.m_N, m_R_RNG.m_N); - - register_subalias("Y", m_clock.m_Y); - } - - NETLIB_RESETI() - { - m_R_FC.set_R(90000.0); - m_R_RNG.set_R(90000.0); - m_clock.do_reset(); - } - NETLIB_UPDATEI(); - - NETLIB_UPDATE_PARAMI() { update_dev(); } - -public: - NETLIB_SUB(SN74LS629clk) m_clock; - NETLIB_SUB(R_base) m_R_FC; - NETLIB_SUB(R_base) m_R_RNG; - - logic_input_t m_ENQ; - analog_input_t m_RNG; - analog_input_t m_FC; - - param_double_t m_CAP; -}; - -NETLIB_OBJECT(SN74LS629_dip) -{ - NETLIB_CONSTRUCTOR(SN74LS629_dip) - , m_1(*this, "1") - , m_2(*this, "2") - { - register_subalias("1", m_2.m_FC); - register_subalias("2", m_1.m_FC); - register_subalias("3", m_1.m_RNG); - - register_subalias("6", m_1.m_ENQ); - register_subalias("7", m_1.m_clock.m_Y); - - register_subalias("8", m_1.m_R_FC.m_N); - register_subalias("9", m_1.m_R_FC.m_N); - connect_late(m_1.m_R_FC.m_N, m_2.m_R_FC.m_N); - - register_subalias("10", m_2.m_clock.m_Y); - - register_subalias("11", m_2.m_ENQ); - register_subalias("14", m_2.m_RNG); - } - - NETLIB_UPDATEI() { } - - NETLIB_RESETI() - { - m_1.do_reset(); - m_2.do_reset(); - } - -private: - NETLIB_SUB(SN74LS629) m_1; - NETLIB_SUB(SN74LS629) m_2; -}; - - } //namespace devices -} // namespace netlist - - #endif /* NLD_74LS629_H_ */ diff --git a/src/lib/netlist/devices/nld_82S16.cpp b/src/lib/netlist/devices/nld_82S16.cpp index 4b198e14761..8fefb52e43c 100644 --- a/src/lib/netlist/devices/nld_82S16.cpp +++ b/src/lib/netlist/devices/nld_82S16.cpp @@ -12,41 +12,110 @@ namespace netlist namespace devices { -// FIXME: timing! -// FIXME: optimize device (separate address decoder!) -NETLIB_UPDATE(82S16) -{ - if (INPLOGIC(m_CE1Q) || INPLOGIC(m_CE2Q) || INPLOGIC(m_CE3Q)) + NETLIB_OBJECT(82S16) { - // FIXME: Outputs are tristate. This needs to be properly implemented - OUTLOGIC(m_DOUTQ, 1, NLTIME_FROM_NS(20)); - //for (int i=0; i<8; i++) - //m_A[i].inactivate(); - } - else - { - unsigned int adr = 0; - for (int i=0; i<8; i++) + NETLIB_CONSTRUCTOR(82S16) { - //m_A[i].activate(); - adr |= (INPLOGIC(m_A[i]) << i); + enregister("A0", m_A[0]); + enregister("A1", m_A[1]); + enregister("A2", m_A[2]); + enregister("A3", m_A[3]); + enregister("A4", m_A[4]); + enregister("A5", m_A[5]); + enregister("A6", m_A[6]); + enregister("A7", m_A[7]); + + enregister("CE1Q", m_CE1Q); + enregister("CE2Q", m_CE2Q); + enregister("CE3Q", m_CE3Q); + + enregister("WEQ", m_WEQ); + enregister("DIN", m_DIN); + + enregister("DOUTQ",m_DOUTQ); + + save(NLNAME(m_ram)); + } - if (!INPLOGIC(m_WEQ)) - { - m_ram[adr >> 6] = (m_ram[adr >> 6] & ~((UINT64) 1 << (adr & 0x3f))) | ((UINT64) INPLOGIC(m_DIN) << (adr & 0x3f)); - } - OUTLOGIC(m_DOUTQ, ((m_ram[adr >> 6] >> (adr & 0x3f)) & 1) ^ 1, NLTIME_FROM_NS(20)); - } -} + NETLIB_RESETI(); + NETLIB_UPDATEI(); -NETLIB_RESET(82S16) -{ - for (int i=0; i<4; i++) + protected: + logic_input_t m_A[8]; + logic_input_t m_CE1Q; + logic_input_t m_CE2Q; + logic_input_t m_CE3Q; + logic_input_t m_WEQ; + logic_input_t m_DIN; + logic_output_t m_DOUTQ; + + //netlist_state_t m_ram; + UINT64 m_ram[4]; // 256 bits + }; + + NETLIB_OBJECT_DERIVED(82S16_dip, 82S16) { - m_ram[i] = 0; + NETLIB_CONSTRUCTOR_DERIVED(82S16_dip, 82S16) + { + enregister("2", m_A[0]); + enregister("1", m_A[1]); + enregister("15", m_A[2]); + enregister("14", m_A[3]); + enregister("7", m_A[4]); + enregister("9", m_A[5]); + enregister("10", m_A[6]); + enregister("11", m_A[7]); + + enregister("3", m_CE1Q); + enregister("4", m_CE2Q); + enregister("5", m_CE3Q); + + enregister("12", m_WEQ); + enregister("13", m_DIN); + + enregister("6", m_DOUTQ); + } + }; + + // FIXME: timing! + // FIXME: optimize device (separate address decoder!) + NETLIB_UPDATE(82S16) + { + if (INPLOGIC(m_CE1Q) || INPLOGIC(m_CE2Q) || INPLOGIC(m_CE3Q)) + { + // FIXME: Outputs are tristate. This needs to be properly implemented + OUTLOGIC(m_DOUTQ, 1, NLTIME_FROM_NS(20)); + //for (int i=0; i<8; i++) + //m_A[i].inactivate(); + } + else + { + unsigned int adr = 0; + for (int i=0; i<8; i++) + { + //m_A[i].activate(); + adr |= (INPLOGIC(m_A[i]) << i); + } + + if (!INPLOGIC(m_WEQ)) + { + m_ram[adr >> 6] = (m_ram[adr >> 6] & ~((UINT64) 1 << (adr & 0x3f))) | ((UINT64) INPLOGIC(m_DIN) << (adr & 0x3f)); + } + OUTLOGIC(m_DOUTQ, ((m_ram[adr >> 6] >> (adr & 0x3f)) & 1) ^ 1, NLTIME_FROM_NS(20)); + } } -} + + NETLIB_RESET(82S16) + { + for (int i=0; i<4; i++) + { + m_ram[i] = 0; + } + } + + NETLIB_DEVICE_IMPL(82S16) + NETLIB_DEVICE_IMPL(82S16_dip) } //namespace devices } // namespace netlist diff --git a/src/lib/netlist/devices/nld_82S16.h b/src/lib/netlist/devices/nld_82S16.h index 62221961679..cfdd84584c6 100644 --- a/src/lib/netlist/devices/nld_82S16.h +++ b/src/lib/netlist/devices/nld_82S16.h @@ -24,85 +24,11 @@ #ifndef NLD_82S16_H_ #define NLD_82S16_H_ -#include "nl_base.h" +#include "nl_setup.h" #define TTL_82S16(name) \ NET_REGISTER_DEV(TTL_82S16, name) #define TTL_82S16_DIP(name) \ NET_REGISTER_DEV(TTL_82S16_DIP, name) -namespace netlist -{ - namespace devices - { - -NETLIB_OBJECT(82S16) -{ - NETLIB_CONSTRUCTOR(82S16) - { - enregister("A0", m_A[0]); - enregister("A1", m_A[1]); - enregister("A2", m_A[2]); - enregister("A3", m_A[3]); - enregister("A4", m_A[4]); - enregister("A5", m_A[5]); - enregister("A6", m_A[6]); - enregister("A7", m_A[7]); - - enregister("CE1Q", m_CE1Q); - enregister("CE2Q", m_CE2Q); - enregister("CE3Q", m_CE3Q); - - enregister("WEQ", m_WEQ); - enregister("DIN", m_DIN); - - enregister("DOUTQ",m_DOUTQ); - - save(NLNAME(m_ram)); - - } - - NETLIB_RESETI(); - NETLIB_UPDATEI(); - -protected: - logic_input_t m_A[8]; - logic_input_t m_CE1Q; - logic_input_t m_CE2Q; - logic_input_t m_CE3Q; - logic_input_t m_WEQ; - logic_input_t m_DIN; - logic_output_t m_DOUTQ; - - //netlist_state_t m_ram; - UINT64 m_ram[4]; // 256 bits -}; - -NETLIB_OBJECT_DERIVED(82S16_dip, 82S16) -{ - NETLIB_CONSTRUCTOR_DERIVED(82S16_dip, 82S16) - { - enregister("2", m_A[0]); - enregister("1", m_A[1]); - enregister("15", m_A[2]); - enregister("14", m_A[3]); - enregister("7", m_A[4]); - enregister("9", m_A[5]); - enregister("10", m_A[6]); - enregister("11", m_A[7]); - - enregister("3", m_CE1Q); - enregister("4", m_CE2Q); - enregister("5", m_CE3Q); - - enregister("12", m_WEQ); - enregister("13", m_DIN); - - enregister("6", m_DOUTQ); - } -}; - - } //namespace devices -} // namespace netlist - #endif /* NLD_82S16_H_ */ diff --git a/src/lib/netlist/devices/nld_9310.cpp b/src/lib/netlist/devices/nld_9310.cpp index faab8973a47..24a9a9c440c 100644 --- a/src/lib/netlist/devices/nld_9310.cpp +++ b/src/lib/netlist/devices/nld_9310.cpp @@ -14,141 +14,272 @@ namespace netlist namespace devices { -NETLIB_RESET(9310) -{ - sub.do_reset(); - subABCD.do_reset(); -} - -NETLIB_RESET(9310_subABCD) -{ -#if 0 - m_A.inactivate(); - m_B.inactivate(); - m_C.inactivate(); - m_D.inactivate(); -#endif -} - -NETLIB_RESET(9310_sub) -{ - m_CLK.set_state(logic_t::STATE_INP_LH); - m_cnt = 0; - m_loadq = 1; - m_ent = 1; -} - -NETLIB_UPDATE(9310_sub) -{ - if (m_loadq) + NETLIB_OBJECT(9310_subABCD) { -#if 0 - m_cnt = (m_cnt < MAXCNT) ? m_cnt + 1 : 0; - update_outputs(m_cnt); - OUTLOGIC(m_RC, m_ent & (m_cnt == MAXCNT), NLTIME_FROM_NS(20)); -#else - switch (m_cnt) + NETLIB_CONSTRUCTOR(9310_subABCD) { - case MAXCNT - 1: - m_cnt = MAXCNT; - OUTLOGIC(m_RC, m_ent, NLTIME_FROM_NS(20)); - OUTLOGIC(m_QA, 1, NLTIME_FROM_NS(20)); + enregister("A", m_A); + enregister("B", m_B); + enregister("C", m_C); + enregister("D", m_D); + } + + NETLIB_RESETI(); + //NETLIB_UPDATEI(); + + public: + logic_input_t m_A; + logic_input_t m_B; + logic_input_t m_C; + logic_input_t m_D; + + ATTR_HOT inline UINT8 read_ABCD() const + { + //return (INPLOGIC_PASSIVE(m_D) << 3) | (INPLOGIC_PASSIVE(m_C) << 2) | (INPLOGIC_PASSIVE(m_B) << 1) | (INPLOGIC_PASSIVE(m_A) << 0); + return (INPLOGIC(m_D) << 3) | (INPLOGIC(m_C) << 2) | (INPLOGIC(m_B) << 1) | (INPLOGIC(m_A) << 0); + } + }; + + NETLIB_OBJECT(9310_sub) + { + NETLIB_CONSTRUCTOR(9310_sub) + , m_cnt(0) + , m_ABCD(nullptr) + , m_loadq(0) + , m_ent(0) + { + enregister("CLK", m_CLK); + + enregister("QA", m_QA); + enregister("QB", m_QB); + enregister("QC", m_QC); + enregister("QD", m_QD); + enregister("RC", m_RC); + + save(NLNAME(m_cnt)); + save(NLNAME(m_loadq)); + save(NLNAME(m_ent)); + } + NETLIB_RESETI(); + NETLIB_UPDATEI(); + public: + ATTR_HOT inline void update_outputs_all(const UINT8 cnt, const netlist_time out_delay); + ATTR_HOT inline void update_outputs(const UINT8 cnt); + + logic_input_t m_CLK; + + UINT8 m_cnt; + NETLIB_NAME(9310_subABCD) *m_ABCD; + netlist_sig_t m_loadq; + netlist_sig_t m_ent; + + logic_output_t m_QA; + logic_output_t m_QB; + logic_output_t m_QC; + logic_output_t m_QD; + logic_output_t m_RC; + }; + + NETLIB_OBJECT(9310) + { + NETLIB_CONSTRUCTOR(9310) + , subABCD(*this, "subABCD") + , sub(*this, "sub") + { + sub.m_ABCD = &(subABCD); + + register_subalias("CLK", sub.m_CLK); + + enregister("ENP", m_ENP); + enregister("ENT", m_ENT); + enregister("CLRQ", m_CLRQ); + enregister("LOADQ", m_LOADQ); + + register_subalias("A", subABCD.m_A); + register_subalias("B", subABCD.m_B); + register_subalias("C", subABCD.m_C); + register_subalias("D", subABCD.m_D); + + register_subalias("QA", sub.m_QA); + register_subalias("QB", sub.m_QB); + register_subalias("QC", sub.m_QC); + register_subalias("QD", sub.m_QD); + register_subalias("RC", sub.m_RC); + } + NETLIB_RESETI(); + NETLIB_UPDATEI(); + + public: + NETLIB_SUB(9310_subABCD) subABCD; + NETLIB_SUB(9310_sub) sub; + logic_input_t m_ENP; + logic_input_t m_ENT; + logic_input_t m_CLRQ; + logic_input_t m_LOADQ; + }; + + NETLIB_OBJECT_DERIVED(9310_dip, 9310) + { + NETLIB_CONSTRUCTOR_DERIVED(9310_dip, 9310) + { + register_subalias("1", m_CLRQ); + register_subalias("2", sub.m_CLK); + register_subalias("3", subABCD.m_A); + register_subalias("4", subABCD.m_B); + register_subalias("5", subABCD.m_C); + register_subalias("6", subABCD.m_D); + register_subalias("7", m_ENP); + // register_subalias("8", ); -. GND + + register_subalias("9", m_LOADQ); + register_subalias("10", m_ENT); + register_subalias("11", sub.m_QD); + register_subalias("12", sub.m_QC); + register_subalias("13", sub.m_QB); + register_subalias("14", sub.m_QA); + register_subalias("15", sub.m_RC); + // register_subalias("16", ); -. VCC + } + }; + + NETLIB_RESET(9310) + { + sub.do_reset(); + subABCD.do_reset(); + } + + NETLIB_RESET(9310_subABCD) + { + #if 0 + m_A.inactivate(); + m_B.inactivate(); + m_C.inactivate(); + m_D.inactivate(); + #endif + } + + NETLIB_RESET(9310_sub) + { + m_CLK.set_state(logic_t::STATE_INP_LH); + m_cnt = 0; + m_loadq = 1; + m_ent = 1; + } + + NETLIB_UPDATE(9310_sub) + { + if (m_loadq) + { + #if 0 + m_cnt = (m_cnt < MAXCNT) ? m_cnt + 1 : 0; + update_outputs(m_cnt); + OUTLOGIC(m_RC, m_ent & (m_cnt == MAXCNT), NLTIME_FROM_NS(20)); + #else + switch (m_cnt) + { + case MAXCNT - 1: + m_cnt = MAXCNT; + OUTLOGIC(m_RC, m_ent, NLTIME_FROM_NS(20)); + OUTLOGIC(m_QA, 1, NLTIME_FROM_NS(20)); + break; + case MAXCNT: + OUTLOGIC(m_RC, 0, NLTIME_FROM_NS(20)); + m_cnt = 0; + update_outputs_all(m_cnt, NLTIME_FROM_NS(20)); + break; + default: + m_cnt++; + update_outputs(m_cnt); + } + #endif + } + else + { + m_cnt = m_ABCD->read_ABCD(); + update_outputs_all(m_cnt, NLTIME_FROM_NS(22)); + OUTLOGIC(m_RC, m_ent & (m_cnt == MAXCNT), NLTIME_FROM_NS(27)); + } + } + + NETLIB_UPDATE(9310) + { + sub.m_loadq = INPLOGIC(m_LOADQ); + sub.m_ent = INPLOGIC(m_ENT); + const netlist_sig_t clrq = INPLOGIC(m_CLRQ); + + if ((!sub.m_loadq || (sub.m_ent & INPLOGIC(m_ENP))) && clrq) + { + sub.m_CLK.activate_lh(); + OUTLOGIC(sub.m_RC, sub.m_ent & (sub.m_cnt == MAXCNT), NLTIME_FROM_NS(27)); + } + else + { + sub.m_CLK.inactivate(); + if (!clrq && (sub.m_cnt>0)) + { + sub.update_outputs_all(0, NLTIME_FROM_NS(36)); + sub.m_cnt = 0; + //return; + } + OUTLOGIC(sub.m_RC, sub.m_ent & (sub.m_cnt == MAXCNT), NLTIME_FROM_NS(27)); + } + } + + inline NETLIB_FUNC_VOID(9310_sub, update_outputs_all, (const UINT8 cnt, const netlist_time out_delay)) + { + OUTLOGIC(m_QA, (cnt >> 0) & 1, out_delay); + OUTLOGIC(m_QB, (cnt >> 1) & 1, out_delay); + OUTLOGIC(m_QC, (cnt >> 2) & 1, out_delay); + OUTLOGIC(m_QD, (cnt >> 3) & 1, out_delay); + } + + inline NETLIB_FUNC_VOID(9310_sub, update_outputs, (const UINT8 cnt)) + { + /* static */ const netlist_time out_delay = NLTIME_FROM_NS(20); + #if 0 + // for (int i=0; i<4; i++) + // OUTLOGIC(m_Q[i], (cnt >> i) & 1, delay[i]); + OUTLOGIC(m_QA, (cnt >> 0) & 1, out_delay); + OUTLOGIC(m_QB, (cnt >> 1) & 1, out_delay); + OUTLOGIC(m_QC, (cnt >> 2) & 1, out_delay); + OUTLOGIC(m_QD, (cnt >> 3) & 1, out_delay); + #else + if ((cnt & 1) == 1) + OUTLOGIC(m_QA, 1, out_delay); + else + { + OUTLOGIC(m_QA, 0, out_delay); + switch (cnt) + { + case 0x00: + OUTLOGIC(m_QB, 0, out_delay); + OUTLOGIC(m_QC, 0, out_delay); + OUTLOGIC(m_QD, 0, out_delay); break; - case MAXCNT: - OUTLOGIC(m_RC, 0, NLTIME_FROM_NS(20)); - m_cnt = 0; - update_outputs_all(m_cnt, NLTIME_FROM_NS(20)); + case 0x02: + case 0x06: + case 0x0A: + case 0x0E: + OUTLOGIC(m_QB, 1, out_delay); break; - default: - m_cnt++; - update_outputs(m_cnt); + case 0x04: + case 0x0C: + OUTLOGIC(m_QB, 0, out_delay); + OUTLOGIC(m_QC, 1, out_delay); + break; + case 0x08: + OUTLOGIC(m_QB, 0, out_delay); + OUTLOGIC(m_QC, 0, out_delay); + OUTLOGIC(m_QD, 1, out_delay); + break; + } + } -#endif + #endif } - else - { - m_cnt = m_ABCD->read_ABCD(); - update_outputs_all(m_cnt, NLTIME_FROM_NS(22)); - OUTLOGIC(m_RC, m_ent & (m_cnt == MAXCNT), NLTIME_FROM_NS(27)); - } -} -NETLIB_UPDATE(9310) -{ - sub.m_loadq = INPLOGIC(m_LOADQ); - sub.m_ent = INPLOGIC(m_ENT); - const netlist_sig_t clrq = INPLOGIC(m_CLRQ); - - if ((!sub.m_loadq || (sub.m_ent & INPLOGIC(m_ENP))) && clrq) - { - sub.m_CLK.activate_lh(); - OUTLOGIC(sub.m_RC, sub.m_ent & (sub.m_cnt == MAXCNT), NLTIME_FROM_NS(27)); - } - else - { - sub.m_CLK.inactivate(); - if (!clrq && (sub.m_cnt>0)) - { - sub.update_outputs_all(0, NLTIME_FROM_NS(36)); - sub.m_cnt = 0; - //return; - } - OUTLOGIC(sub.m_RC, sub.m_ent & (sub.m_cnt == MAXCNT), NLTIME_FROM_NS(27)); - } -} - -inline NETLIB_FUNC_VOID(9310_sub, update_outputs_all, (const UINT8 cnt, const netlist_time out_delay)) -{ - OUTLOGIC(m_QA, (cnt >> 0) & 1, out_delay); - OUTLOGIC(m_QB, (cnt >> 1) & 1, out_delay); - OUTLOGIC(m_QC, (cnt >> 2) & 1, out_delay); - OUTLOGIC(m_QD, (cnt >> 3) & 1, out_delay); -} - -inline NETLIB_FUNC_VOID(9310_sub, update_outputs, (const UINT8 cnt)) -{ - /* static */ const netlist_time out_delay = NLTIME_FROM_NS(20); -#if 0 -// for (int i=0; i<4; i++) -// OUTLOGIC(m_Q[i], (cnt >> i) & 1, delay[i]); - OUTLOGIC(m_QA, (cnt >> 0) & 1, out_delay); - OUTLOGIC(m_QB, (cnt >> 1) & 1, out_delay); - OUTLOGIC(m_QC, (cnt >> 2) & 1, out_delay); - OUTLOGIC(m_QD, (cnt >> 3) & 1, out_delay); -#else - if ((cnt & 1) == 1) - OUTLOGIC(m_QA, 1, out_delay); - else - { - OUTLOGIC(m_QA, 0, out_delay); - switch (cnt) - { - case 0x00: - OUTLOGIC(m_QB, 0, out_delay); - OUTLOGIC(m_QC, 0, out_delay); - OUTLOGIC(m_QD, 0, out_delay); - break; - case 0x02: - case 0x06: - case 0x0A: - case 0x0E: - OUTLOGIC(m_QB, 1, out_delay); - break; - case 0x04: - case 0x0C: - OUTLOGIC(m_QB, 0, out_delay); - OUTLOGIC(m_QC, 1, out_delay); - break; - case 0x08: - OUTLOGIC(m_QB, 0, out_delay); - OUTLOGIC(m_QC, 0, out_delay); - OUTLOGIC(m_QD, 1, out_delay); - break; - } - - } -#endif -} + NETLIB_DEVICE_IMPL(9310) + NETLIB_DEVICE_IMPL(9310_dip) } //namespace devices } // namespace netlist diff --git a/src/lib/netlist/devices/nld_9310.h b/src/lib/netlist/devices/nld_9310.h index eddc1337372..4df8a2d03a0 100644 --- a/src/lib/netlist/devices/nld_9310.h +++ b/src/lib/netlist/devices/nld_9310.h @@ -45,156 +45,21 @@ #ifndef NLD_9310_H_ #define NLD_9310_H_ -#include "nl_base.h" +#include "nl_setup.h" -#define TTL_9310(name, cCLK, cENP, cENT, cCLRQ, cLOADQ, cA, cB, cC, cD) \ - NET_REGISTER_DEV(TTL_9310, name) \ - NET_CONNECT(name, CLK, cCLK) \ - NET_CONNECT(name, ENP, cENP) \ - NET_CONNECT(name, ENT, cENT) \ - NET_CONNECT(name, CLRQ, cCLRQ) \ - NET_CONNECT(name, LOADQ,_LOADQ) \ - NET_CONNECT(name, A, cA) \ - NET_CONNECT(name, B, cB) \ - NET_CONNECT(name, C, cC) \ +#define TTL_9310(name, cCLK, cENP, cENT, cCLRQ, cLOADQ, cA, cB, cC, cD) \ + NET_REGISTER_DEV(TTL_9310, name) \ + NET_CONNECT(name, CLK, cCLK) \ + NET_CONNECT(name, ENP, cENP) \ + NET_CONNECT(name, ENT, cENT) \ + NET_CONNECT(name, CLRQ, cCLRQ) \ + NET_CONNECT(name, LOADQ,_LOADQ) \ + NET_CONNECT(name, A, cA) \ + NET_CONNECT(name, B, cB) \ + NET_CONNECT(name, C, cC) \ NET_CONNECT(name, D, cD) -#define TTL_9310_DIP(name) \ +#define TTL_9310_DIP(name) \ NET_REGISTER_DEV(TTL_9310_DIP, name) -namespace netlist -{ - namespace devices - { - -NETLIB_OBJECT(9310_subABCD) -{ - NETLIB_CONSTRUCTOR(9310_subABCD) - { - enregister("A", m_A); - enregister("B", m_B); - enregister("C", m_C); - enregister("D", m_D); - } - - NETLIB_RESETI(); - //NETLIB_UPDATEI(); - -public: - logic_input_t m_A; - logic_input_t m_B; - logic_input_t m_C; - logic_input_t m_D; - - ATTR_HOT inline UINT8 read_ABCD() const - { - //return (INPLOGIC_PASSIVE(m_D) << 3) | (INPLOGIC_PASSIVE(m_C) << 2) | (INPLOGIC_PASSIVE(m_B) << 1) | (INPLOGIC_PASSIVE(m_A) << 0); - return (INPLOGIC(m_D) << 3) | (INPLOGIC(m_C) << 2) | (INPLOGIC(m_B) << 1) | (INPLOGIC(m_A) << 0); - } -}; - -NETLIB_OBJECT(9310_sub) -{ - NETLIB_CONSTRUCTOR(9310_sub) - , m_cnt(0) - , m_ABCD(nullptr) - , m_loadq(0) - , m_ent(0) - { - enregister("CLK", m_CLK); - - enregister("QA", m_QA); - enregister("QB", m_QB); - enregister("QC", m_QC); - enregister("QD", m_QD); - enregister("RC", m_RC); - - save(NLNAME(m_cnt)); - save(NLNAME(m_loadq)); - save(NLNAME(m_ent)); - } - NETLIB_RESETI(); - NETLIB_UPDATEI(); -public: - ATTR_HOT inline void update_outputs_all(const UINT8 cnt, const netlist_time out_delay); - ATTR_HOT inline void update_outputs(const UINT8 cnt); - - logic_input_t m_CLK; - - UINT8 m_cnt; - NETLIB_NAME(9310_subABCD) *m_ABCD; - netlist_sig_t m_loadq; - netlist_sig_t m_ent; - - logic_output_t m_QA; - logic_output_t m_QB; - logic_output_t m_QC; - logic_output_t m_QD; - logic_output_t m_RC; -}; - -NETLIB_OBJECT(9310) -{ - NETLIB_CONSTRUCTOR(9310) - , subABCD(*this, "subABCD") - , sub(*this, "sub") - { - sub.m_ABCD = &(subABCD); - - register_subalias("CLK", sub.m_CLK); - - enregister("ENP", m_ENP); - enregister("ENT", m_ENT); - enregister("CLRQ", m_CLRQ); - enregister("LOADQ", m_LOADQ); - - register_subalias("A", subABCD.m_A); - register_subalias("B", subABCD.m_B); - register_subalias("C", subABCD.m_C); - register_subalias("D", subABCD.m_D); - - register_subalias("QA", sub.m_QA); - register_subalias("QB", sub.m_QB); - register_subalias("QC", sub.m_QC); - register_subalias("QD", sub.m_QD); - register_subalias("RC", sub.m_RC); - } - NETLIB_RESETI(); - NETLIB_UPDATEI(); - -public: - NETLIB_SUB(9310_subABCD) subABCD; - NETLIB_SUB(9310_sub) sub; - logic_input_t m_ENP; - logic_input_t m_ENT; - logic_input_t m_CLRQ; - logic_input_t m_LOADQ; -}; - -NETLIB_OBJECT_DERIVED(9310_dip, 9310) -{ - NETLIB_CONSTRUCTOR_DERIVED(9310_dip, 9310) - { - register_subalias("1", m_CLRQ); - register_subalias("2", sub.m_CLK); - register_subalias("3", subABCD.m_A); - register_subalias("4", subABCD.m_B); - register_subalias("5", subABCD.m_C); - register_subalias("6", subABCD.m_D); - register_subalias("7", m_ENP); - // register_subalias("8", ); -. GND - - register_subalias("9", m_LOADQ); - register_subalias("10", m_ENT); - register_subalias("11", sub.m_QD); - register_subalias("12", sub.m_QC); - register_subalias("13", sub.m_QB); - register_subalias("14", sub.m_QA); - register_subalias("15", sub.m_RC); - // register_subalias("16", ); -. VCC - } -}; - } //namespace devices -} // namespace netlist - #endif /* NLD_9310_H_ */ diff --git a/src/lib/netlist/devices/nld_9312.cpp b/src/lib/netlist/devices/nld_9312.cpp index c7a4dff4cd6..8affb42a12f 100644 --- a/src/lib/netlist/devices/nld_9312.cpp +++ b/src/lib/netlist/devices/nld_9312.cpp @@ -21,111 +21,193 @@ * +---+---+---+---++---+---+ */ #include "nld_9312.h" +#include "nld_truthtable.h" namespace netlist { namespace devices { -#if (1 && USE_TRUTHTABLE) -nld_9312::truthtable_t nld_9312::m_ttbl; + #if (USE_TRUTHTABLE) + /* The truthtable implementation is a lot faster than + * the carefully crafted code :-( + */ + NETLIB_TRUTHTABLE(9312, 12, 2, 0); + #else -/* FIXME: Data changes are propagating faster than changing selects A,B,C - * Please refer to data sheet. - * This would require a state machine, thus we do not - * do this right now. - */ + NETLIB_DEVICE(9312, + public: + // C, B, A, G,D0,D1,D2,D3,D4,D5,D6,D7| Y,YQ + logic_input_t m_A; + logic_input_t m_B; + logic_input_t m_C; + logic_input_t m_G; + logic_input_t m_D[8]; + logic_output_t m_Y; + logic_output_t m_YQ; -const char *nld_9312::m_desc[] = { - " C, B, A, G,D0,D1,D2,D3,D4,D5,D6,D7| Y,YQ", - " X, X, X, 1, X, X, X, X, X, X, X, X| 0, 1|33,19", - " 0, 0, 0, 0, 0, X, X, X, X, X, X, X| 0, 1|33,28", - " 0, 0, 0, 0, 1, X, X, X, X, X, X, X| 1, 0|33,28", - " 0, 0, 1, 0, X, 0, X, X, X, X, X, X| 0, 1|33,28", - " 0, 0, 1, 0, X, 1, X, X, X, X, X, X| 1, 0|33,28", - " 0, 1, 0, 0, X, X, 0, X, X, X, X, X| 0, 1|33,28", - " 0, 1, 0, 0, X, X, 1, X, X, X, X, X| 1, 0|33,28", - " 0, 1, 1, 0, X, X, X, 0, X, X, X, X| 0, 1|33,28", - " 0, 1, 1, 0, X, X, X, 1, X, X, X, X| 1, 0|33,28", - " 1, 0, 0, 0, X, X, X, X, 0, X, X, X| 0, 1|33,28", - " 1, 0, 0, 0, X, X, X, X, 1, X, X, X| 1, 0|33,28", - " 1, 0, 1, 0, X, X, X, X, X, 0, X, X| 0, 1|33,28", - " 1, 0, 1, 0, X, X, X, X, X, 1, X, X| 1, 0|33,28", - " 1, 1, 0, 0, X, X, X, X, X, X, 0, X| 0, 1|33,28", - " 1, 1, 0, 0, X, X, X, X, X, X, 1, X| 1, 0|33,28", - " 1, 1, 1, 0, X, X, X, X, X, X, X, 0| 0, 1|33,28", - " 1, 1, 1, 0, X, X, X, X, X, X, X, 1| 1, 0|33,28", - "" -}; -#else + UINT8 m_last_chan; + UINT8 m_last_G; + ); -NETLIB_UPDATE(9312) -{ - const UINT8 G = INPLOGIC(m_G); - if (G) + #endif + + NETLIB_OBJECT(9312_dip) { - /* static */ const netlist_time delay[2] = { NLTIME_FROM_NS(33), NLTIME_FROM_NS(19) }; - OUTLOGIC(m_Y, 0, delay[0]); - OUTLOGIC(m_YQ, 1, delay[1]); - - m_A.inactivate(); - m_B.inactivate(); - m_C.inactivate(); - m_last_G = G; - } - else - { - if (m_last_G) + NETLIB_CONSTRUCTOR(9312_dip) + , m_sub(*this, "1") { + #if (1 && USE_TRUTHTABLE) + + register_subalias("13", m_sub.m_I[0]); + register_subalias("12", m_sub.m_I[1]); + register_subalias("11", m_sub.m_I[2]); + register_subalias("10", m_sub.m_I[3]); + + register_subalias("1", m_sub.m_I[4]); + register_subalias("2", m_sub.m_I[5]); + register_subalias("3", m_sub.m_I[6]); + register_subalias("4", m_sub.m_I[7]); + register_subalias("5", m_sub.m_I[8]); + register_subalias("6", m_sub.m_I[9]); + register_subalias("7", m_sub.m_I[10]); + register_subalias("9", m_sub.m_I[11]); + + register_subalias("15", m_sub.m_Q[0]); // Y + register_subalias("14", m_sub.m_Q[1]); // YQ + + #else + + register_subalias("13", m_sub.m_C); + register_subalias("12", m_sub.m_B); + register_subalias("11", m_sub.m_A); + register_subalias("10", m_sub.m_G); + + register_subalias("1", m_sub.m_D[0]); + register_subalias("2", m_sub.m_D[1]); + register_subalias("3", m_sub.m_D[2]); + register_subalias("4", m_sub.m_D[3]); + register_subalias("5", m_sub.m_D[4]); + register_subalias("6", m_sub.m_D[5]); + register_subalias("7", m_sub.m_D[6]); + register_subalias("9", m_sub.m_D[7]); + + register_subalias("15", m_sub.m_Y); // Y + register_subalias("14", m_sub.m_YQ); // YQ + + #endif + + } + + //NETLIB_RESETI(); + //NETLIB_UPDATEI(); + + protected: + NETLIB_SUB(9312) m_sub; + }; + + #if (1 && USE_TRUTHTABLE) + nld_9312::truthtable_t nld_9312::m_ttbl; + + /* FIXME: Data changes are propagating faster than changing selects A,B,C + * Please refer to data sheet. + * This would require a state machine, thus we do not + * do this right now. + */ + + const char *nld_9312::m_desc[] = { + " C, B, A, G,D0,D1,D2,D3,D4,D5,D6,D7| Y,YQ", + " X, X, X, 1, X, X, X, X, X, X, X, X| 0, 1|33,19", + " 0, 0, 0, 0, 0, X, X, X, X, X, X, X| 0, 1|33,28", + " 0, 0, 0, 0, 1, X, X, X, X, X, X, X| 1, 0|33,28", + " 0, 0, 1, 0, X, 0, X, X, X, X, X, X| 0, 1|33,28", + " 0, 0, 1, 0, X, 1, X, X, X, X, X, X| 1, 0|33,28", + " 0, 1, 0, 0, X, X, 0, X, X, X, X, X| 0, 1|33,28", + " 0, 1, 0, 0, X, X, 1, X, X, X, X, X| 1, 0|33,28", + " 0, 1, 1, 0, X, X, X, 0, X, X, X, X| 0, 1|33,28", + " 0, 1, 1, 0, X, X, X, 1, X, X, X, X| 1, 0|33,28", + " 1, 0, 0, 0, X, X, X, X, 0, X, X, X| 0, 1|33,28", + " 1, 0, 0, 0, X, X, X, X, 1, X, X, X| 1, 0|33,28", + " 1, 0, 1, 0, X, X, X, X, X, 0, X, X| 0, 1|33,28", + " 1, 0, 1, 0, X, X, X, X, X, 1, X, X| 1, 0|33,28", + " 1, 1, 0, 0, X, X, X, X, X, X, 0, X| 0, 1|33,28", + " 1, 1, 0, 0, X, X, X, X, X, X, 1, X| 1, 0|33,28", + " 1, 1, 1, 0, X, X, X, X, X, X, X, 0| 0, 1|33,28", + " 1, 1, 1, 0, X, X, X, X, X, X, X, 1| 1, 0|33,28", + "" + }; + #else + + NETLIB_UPDATE(9312) + { + const UINT8 G = INPLOGIC(m_G); + if (G) + { + /* static */ const netlist_time delay[2] = { NLTIME_FROM_NS(33), NLTIME_FROM_NS(19) }; + OUTLOGIC(m_Y, 0, delay[0]); + OUTLOGIC(m_YQ, 1, delay[1]); + + m_A.inactivate(); + m_B.inactivate(); + m_C.inactivate(); m_last_G = G; - m_A.activate(); - m_B.activate(); - m_C.activate(); } - /* static */ const netlist_time delay[2] = { NLTIME_FROM_NS(33), NLTIME_FROM_NS(28) }; - const UINT8 chan = INPLOGIC(m_A) | (INPLOGIC(m_B)<<1) | (INPLOGIC(m_C)<<2); - if (m_last_chan != chan) + else { - m_D[m_last_chan].inactivate(); - m_D[chan].activate(); + if (m_last_G) + { + m_last_G = G; + m_A.activate(); + m_B.activate(); + m_C.activate(); + } + /* static */ const netlist_time delay[2] = { NLTIME_FROM_NS(33), NLTIME_FROM_NS(28) }; + const UINT8 chan = INPLOGIC(m_A) | (INPLOGIC(m_B)<<1) | (INPLOGIC(m_C)<<2); + if (m_last_chan != chan) + { + m_D[m_last_chan].inactivate(); + m_D[chan].activate(); + } + const UINT8 val = INPLOGIC(m_D[chan]); + OUTLOGIC(m_Y, val, delay[val]); + OUTLOGIC(m_YQ, !val, delay[!val]); + m_last_chan = chan; } - const UINT8 val = INPLOGIC(m_D[chan]); - OUTLOGIC(m_Y, val, delay[val]); - OUTLOGIC(m_YQ, !val, delay[!val]); - m_last_chan = chan; } -} -NETLIB_START(9312) -{ - register_input("G", m_G); - register_input("A", m_A); - register_input("B", m_B); - register_input("C", m_C); + NETLIB_START(9312) + { + register_input("G", m_G); + register_input("A", m_A); + register_input("B", m_B); + register_input("C", m_C); - register_input("D0", m_D[0]); - register_input("D1", m_D[1]); - register_input("D2", m_D[2]); - register_input("D3", m_D[3]); - register_input("D4", m_D[4]); - register_input("D5", m_D[5]); - register_input("D6", m_D[6]); - register_input("D7", m_D[7]); + register_input("D0", m_D[0]); + register_input("D1", m_D[1]); + register_input("D2", m_D[2]); + register_input("D3", m_D[3]); + register_input("D4", m_D[4]); + register_input("D5", m_D[5]); + register_input("D6", m_D[6]); + register_input("D7", m_D[7]); - register_output("Y", m_Y); - register_output("YQ", m_YQ); + register_output("Y", m_Y); + register_output("YQ", m_YQ); - m_last_chan = 0; - m_last_G = 0; + m_last_chan = 0; + m_last_G = 0; - save(NLNAME(m_last_chan)); - save(NLNAME(m_last_G)); -} + save(NLNAME(m_last_chan)); + save(NLNAME(m_last_G)); + } -NETLIB_RESET(9312) -{ -} -#endif + NETLIB_RESET(9312) + { + } + #endif + + NETLIB_DEVICE_IMPL(9312) + NETLIB_DEVICE_IMPL(9312_dip) } //namespace devices } // namespace netlist diff --git a/src/lib/netlist/devices/nld_9312.h b/src/lib/netlist/devices/nld_9312.h index 62c0f12db23..a787b38e604 100644 --- a/src/lib/netlist/devices/nld_9312.h +++ b/src/lib/netlist/devices/nld_9312.h @@ -37,98 +37,12 @@ #ifndef NLD_9312_H_ #define NLD_9312_H_ -#include "nld_truthtable.h" +#include "nl_setup.h" -#define TTL_9312(name) \ +#define TTL_9312(name) \ NET_REGISTER_DEV(TTL_9312, name) -#define TTL_9312_DIP(name) \ +#define TTL_9312_DIP(name) \ NET_REGISTER_DEV(TTL_9312_DIP, name) -namespace netlist -{ - namespace devices - { - -#if (USE_TRUTHTABLE) -/* The truthtable implementation is a lot faster than - * the carefully crafted code :-( - */ -NETLIB_TRUTHTABLE(9312, 12, 2, 0); -#else - -NETLIB_DEVICE(9312, -public: -// C, B, A, G,D0,D1,D2,D3,D4,D5,D6,D7| Y,YQ - logic_input_t m_A; - logic_input_t m_B; - logic_input_t m_C; - logic_input_t m_G; - logic_input_t m_D[8]; - logic_output_t m_Y; - logic_output_t m_YQ; - - UINT8 m_last_chan; - UINT8 m_last_G; -); - -#endif - -NETLIB_OBJECT(9312_dip) -{ - NETLIB_CONSTRUCTOR(9312_dip) - , m_sub(*this, "1") - { - #if (1 && USE_TRUTHTABLE) - - register_subalias("13", m_sub.m_I[0]); - register_subalias("12", m_sub.m_I[1]); - register_subalias("11", m_sub.m_I[2]); - register_subalias("10", m_sub.m_I[3]); - - register_subalias("1", m_sub.m_I[4]); - register_subalias("2", m_sub.m_I[5]); - register_subalias("3", m_sub.m_I[6]); - register_subalias("4", m_sub.m_I[7]); - register_subalias("5", m_sub.m_I[8]); - register_subalias("6", m_sub.m_I[9]); - register_subalias("7", m_sub.m_I[10]); - register_subalias("9", m_sub.m_I[11]); - - register_subalias("15", m_sub.m_Q[0]); // Y - register_subalias("14", m_sub.m_Q[1]); // YQ - - #else - - register_subalias("13", m_sub.m_C); - register_subalias("12", m_sub.m_B); - register_subalias("11", m_sub.m_A); - register_subalias("10", m_sub.m_G); - - register_subalias("1", m_sub.m_D[0]); - register_subalias("2", m_sub.m_D[1]); - register_subalias("3", m_sub.m_D[2]); - register_subalias("4", m_sub.m_D[3]); - register_subalias("5", m_sub.m_D[4]); - register_subalias("6", m_sub.m_D[5]); - register_subalias("7", m_sub.m_D[6]); - register_subalias("9", m_sub.m_D[7]); - - register_subalias("15", m_sub.m_Y); // Y - register_subalias("14", m_sub.m_YQ); // YQ - - #endif - - } - - //NETLIB_RESETI(); - //NETLIB_UPDATEI(); - -protected: - NETLIB_SUB(9312) m_sub; -}; - - } //namespace devices -} // namespace netlist - #endif /* NLD_9312_H_ */ diff --git a/src/lib/netlist/devices/nld_9316.cpp b/src/lib/netlist/devices/nld_9316.cpp index f78d6895618..bd36df284aa 100644 --- a/src/lib/netlist/devices/nld_9316.cpp +++ b/src/lib/netlist/devices/nld_9316.cpp @@ -14,136 +14,268 @@ namespace netlist namespace devices { -NETLIB_RESET(9316) -{ - sub.do_reset(); - subABCD.do_reset(); -} - -NETLIB_RESET(9316_subABCD) -{ -#if 0 - m_A.inactivate(); - m_B.inactivate(); - m_C.inactivate(); - m_D.inactivate(); -#endif -} - -NETLIB_RESET(9316_sub) -{ - m_CLK.set_state(logic_t::STATE_INP_LH); - m_cnt = 0; - m_loadq = 1; - m_ent = 1; -} - -NETLIB_UPDATE(9316_sub) -{ - if (m_loadq) + NETLIB_OBJECT(9316_subABCD) { - switch (m_cnt) + NETLIB_CONSTRUCTOR(9316_subABCD) { - case MAXCNT - 1: - m_cnt = MAXCNT; - OUTLOGIC(m_RC, m_ent, NLTIME_FROM_NS(27)); - OUTLOGIC(m_QA, 1, NLTIME_FROM_NS(20)); - break; - case MAXCNT: - OUTLOGIC(m_RC, 0, NLTIME_FROM_NS(27)); - m_cnt = 0; - update_outputs_all(m_cnt, NLTIME_FROM_NS(20)); - break; - default: - m_cnt++; - update_outputs(m_cnt); - break; - } - } - else - { - m_cnt = m_ABCD->read_ABCD(); - OUTLOGIC(m_RC, m_ent & (m_cnt == MAXCNT), NLTIME_FROM_NS(27)); - update_outputs_all(m_cnt, NLTIME_FROM_NS(22)); - } -} - -NETLIB_UPDATE(9316) -{ - sub.m_loadq = INPLOGIC(m_LOADQ); - sub.m_ent = INPLOGIC(m_ENT); - const netlist_sig_t clrq = INPLOGIC(m_CLRQ); - - if (((sub.m_loadq ^ 1) | (sub.m_ent & INPLOGIC(m_ENP))) & clrq) - { - sub.m_CLK.activate_lh(); - OUTLOGIC(sub.m_RC, sub.m_ent & (sub.m_cnt == MAXCNT), NLTIME_FROM_NS(27)); - } - else - { - sub.m_CLK.inactivate(); - if (!clrq && (sub.m_cnt>0)) - { - sub.update_outputs_all(0, NLTIME_FROM_NS(36)); - sub.m_cnt = 0; - //return; - } - OUTLOGIC(sub.m_RC, sub.m_ent & (sub.m_cnt == MAXCNT), NLTIME_FROM_NS(27)); - } -} - -inline NETLIB_FUNC_VOID(9316_sub, update_outputs_all, (const UINT8 cnt, const netlist_time out_delay)) -{ - OUTLOGIC(m_QA, (cnt >> 0) & 1, out_delay); - OUTLOGIC(m_QB, (cnt >> 1) & 1, out_delay); - OUTLOGIC(m_QC, (cnt >> 2) & 1, out_delay); - OUTLOGIC(m_QD, (cnt >> 3) & 1, out_delay); -} - -inline NETLIB_FUNC_VOID(9316_sub, update_outputs, (const UINT8 cnt)) -{ - /* static */ const netlist_time out_delay = NLTIME_FROM_NS(20); -#if 0 -// for (int i=0; i<4; i++) -// OUTLOGIC(m_Q[i], (cnt >> i) & 1, delay[i]); - OUTLOGIC(m_QA, (cnt >> 0) & 1, out_delay); - OUTLOGIC(m_QB, (cnt >> 1) & 1, out_delay); - OUTLOGIC(m_QC, (cnt >> 2) & 1, out_delay); - OUTLOGIC(m_QD, (cnt >> 3) & 1, out_delay); -#else - if ((cnt & 1) == 1) - OUTLOGIC(m_QA, 1, out_delay); - else - { - OUTLOGIC(m_QA, 0, out_delay); - switch (cnt) - { - case 0x00: - OUTLOGIC(m_QB, 0, out_delay); - OUTLOGIC(m_QC, 0, out_delay); - OUTLOGIC(m_QD, 0, out_delay); - break; - case 0x02: - case 0x06: - case 0x0A: - case 0x0E: - OUTLOGIC(m_QB, 1, out_delay); - break; - case 0x04: - case 0x0C: - OUTLOGIC(m_QB, 0, out_delay); - OUTLOGIC(m_QC, 1, out_delay); - break; - case 0x08: - OUTLOGIC(m_QB, 0, out_delay); - OUTLOGIC(m_QC, 0, out_delay); - OUTLOGIC(m_QD, 1, out_delay); - break; + enregister("A", m_A); + enregister("B", m_B); + enregister("C", m_C); + enregister("D", m_D); } + NETLIB_RESETI() + { + #if 0 + m_A.inactivate(); + m_B.inactivate(); + m_C.inactivate(); + m_D.inactivate(); + #endif + } + //NETLIB_UPDATEI(); + + public: + logic_input_t m_A; + logic_input_t m_B; + logic_input_t m_C; + logic_input_t m_D; + + ATTR_HOT inline UINT8 read_ABCD() const + { + //return (INPLOGIC_PASSIVE(m_D) << 3) | (INPLOGIC_PASSIVE(m_C) << 2) | (INPLOGIC_PASSIVE(m_B) << 1) | (INPLOGIC_PASSIVE(m_A) << 0); + return (INPLOGIC(m_D) << 3) | (INPLOGIC(m_C) << 2) | (INPLOGIC(m_B) << 1) | (INPLOGIC(m_A) << 0); + } + }; + + NETLIB_OBJECT(9316_sub) + { + NETLIB_CONSTRUCTOR(9316_sub) + , m_cnt(0) + , m_ABCD(nullptr) + , m_loadq(0) + , m_ent(0) + { + enregister("CLK", m_CLK); + + enregister("QA", m_QA); + enregister("QB", m_QB); + enregister("QC", m_QC); + enregister("QD", m_QD); + enregister("RC", m_RC); + + save(NLNAME(m_cnt)); + save(NLNAME(m_loadq)); + save(NLNAME(m_ent)); + } + + NETLIB_RESETI(); + NETLIB_UPDATEI(); + + public: + ATTR_HOT inline void update_outputs_all(const UINT8 cnt, const netlist_time out_delay); + ATTR_HOT inline void update_outputs(const UINT8 cnt); + + logic_input_t m_CLK; + + logic_output_t m_QA; + logic_output_t m_QB; + logic_output_t m_QC; + logic_output_t m_QD; + logic_output_t m_RC; + + UINT8 m_cnt; + NETLIB_NAME(9316_subABCD) *m_ABCD; + netlist_sig_t m_loadq; + netlist_sig_t m_ent; + }; + + NETLIB_OBJECT(9316) + { + NETLIB_CONSTRUCTOR(9316) + , sub(*this, "sub") + , subABCD(*this, "subABCD") + { + sub.m_ABCD = &(subABCD); + + register_subalias("CLK", sub.m_CLK); + + enregister("ENP", m_ENP); + enregister("ENT", m_ENT); + enregister("CLRQ", m_CLRQ); + enregister("LOADQ", m_LOADQ); + + register_subalias("A", subABCD.m_A); + register_subalias("B", subABCD.m_B); + register_subalias("C", subABCD.m_C); + register_subalias("D", subABCD.m_D); + + register_subalias("QA", sub.m_QA); + register_subalias("QB", sub.m_QB); + register_subalias("QC", sub.m_QC); + register_subalias("QD", sub.m_QD); + register_subalias("RC", sub.m_RC); + } + + NETLIB_RESETI(); + NETLIB_UPDATEI(); + + protected: + NETLIB_SUB(9316_sub) sub; + NETLIB_SUB(9316_subABCD) subABCD; + logic_input_t m_ENP; + logic_input_t m_ENT; + logic_input_t m_CLRQ; + logic_input_t m_LOADQ; + }; + + NETLIB_OBJECT_DERIVED(9316_dip, 9316) + { + NETLIB_CONSTRUCTOR_DERIVED(9316_dip, 9316) + { + register_subalias("1", m_CLRQ); + register_subalias("2", sub.m_CLK); + register_subalias("3", subABCD.m_A); + register_subalias("4", subABCD.m_B); + register_subalias("5", subABCD.m_C); + register_subalias("6", subABCD.m_D); + register_subalias("7", m_ENP); + // register_subalias("8", ); -. GND + + register_subalias("9", m_LOADQ); + register_subalias("10", m_ENT); + register_subalias("11", sub.m_QD); + register_subalias("12", sub.m_QC); + register_subalias("13", sub.m_QB); + register_subalias("14", sub.m_QA); + register_subalias("15", sub.m_RC); + // register_subalias("16", ); -. VCC + } + }; + + NETLIB_RESET(9316) + { + sub.do_reset(); + subABCD.do_reset(); } -#endif -} + + NETLIB_RESET(9316_sub) + { + m_CLK.set_state(logic_t::STATE_INP_LH); + m_cnt = 0; + m_loadq = 1; + m_ent = 1; + } + + NETLIB_UPDATE(9316_sub) + { + if (m_loadq) + { + switch (m_cnt) + { + case MAXCNT - 1: + m_cnt = MAXCNT; + OUTLOGIC(m_RC, m_ent, NLTIME_FROM_NS(27)); + OUTLOGIC(m_QA, 1, NLTIME_FROM_NS(20)); + break; + case MAXCNT: + OUTLOGIC(m_RC, 0, NLTIME_FROM_NS(27)); + m_cnt = 0; + update_outputs_all(m_cnt, NLTIME_FROM_NS(20)); + break; + default: + m_cnt++; + update_outputs(m_cnt); + break; + } + } + else + { + m_cnt = m_ABCD->read_ABCD(); + OUTLOGIC(m_RC, m_ent & (m_cnt == MAXCNT), NLTIME_FROM_NS(27)); + update_outputs_all(m_cnt, NLTIME_FROM_NS(22)); + } + } + + NETLIB_UPDATE(9316) + { + sub.m_loadq = INPLOGIC(m_LOADQ); + sub.m_ent = INPLOGIC(m_ENT); + const netlist_sig_t clrq = INPLOGIC(m_CLRQ); + + if (((sub.m_loadq ^ 1) | (sub.m_ent & INPLOGIC(m_ENP))) & clrq) + { + sub.m_CLK.activate_lh(); + OUTLOGIC(sub.m_RC, sub.m_ent & (sub.m_cnt == MAXCNT), NLTIME_FROM_NS(27)); + } + else + { + sub.m_CLK.inactivate(); + if (!clrq && (sub.m_cnt>0)) + { + sub.update_outputs_all(0, NLTIME_FROM_NS(36)); + sub.m_cnt = 0; + //return; + } + OUTLOGIC(sub.m_RC, sub.m_ent & (sub.m_cnt == MAXCNT), NLTIME_FROM_NS(27)); + } + } + + inline NETLIB_FUNC_VOID(9316_sub, update_outputs_all, (const UINT8 cnt, const netlist_time out_delay)) + { + OUTLOGIC(m_QA, (cnt >> 0) & 1, out_delay); + OUTLOGIC(m_QB, (cnt >> 1) & 1, out_delay); + OUTLOGIC(m_QC, (cnt >> 2) & 1, out_delay); + OUTLOGIC(m_QD, (cnt >> 3) & 1, out_delay); + } + + inline NETLIB_FUNC_VOID(9316_sub, update_outputs, (const UINT8 cnt)) + { + /* static */ const netlist_time out_delay = NLTIME_FROM_NS(20); + #if 0 + // for (int i=0; i<4; i++) + // OUTLOGIC(m_Q[i], (cnt >> i) & 1, delay[i]); + OUTLOGIC(m_QA, (cnt >> 0) & 1, out_delay); + OUTLOGIC(m_QB, (cnt >> 1) & 1, out_delay); + OUTLOGIC(m_QC, (cnt >> 2) & 1, out_delay); + OUTLOGIC(m_QD, (cnt >> 3) & 1, out_delay); + #else + if ((cnt & 1) == 1) + OUTLOGIC(m_QA, 1, out_delay); + else + { + OUTLOGIC(m_QA, 0, out_delay); + switch (cnt) + { + case 0x00: + OUTLOGIC(m_QB, 0, out_delay); + OUTLOGIC(m_QC, 0, out_delay); + OUTLOGIC(m_QD, 0, out_delay); + break; + case 0x02: + case 0x06: + case 0x0A: + case 0x0E: + OUTLOGIC(m_QB, 1, out_delay); + break; + case 0x04: + case 0x0C: + OUTLOGIC(m_QB, 0, out_delay); + OUTLOGIC(m_QC, 1, out_delay); + break; + case 0x08: + OUTLOGIC(m_QB, 0, out_delay); + OUTLOGIC(m_QC, 0, out_delay); + OUTLOGIC(m_QD, 1, out_delay); + break; + } + + } + #endif + } + + NETLIB_DEVICE_IMPL(9316) + NETLIB_DEVICE_IMPL(9316_dip) } //namespace devices } // namespace netlist diff --git a/src/lib/netlist/devices/nld_9316.h b/src/lib/netlist/devices/nld_9316.h index 0c5cd5843ea..696a5dcba61 100644 --- a/src/lib/netlist/devices/nld_9316.h +++ b/src/lib/netlist/devices/nld_9316.h @@ -49,7 +49,7 @@ #ifndef NLD_9316_H_ #define NLD_9316_H_ -#include "nl_base.h" +#include "nl_setup.h" #define TTL_9316(name, cCLK, cENP, cENT, cCLRQ, cLOADQ, cA, cB, cC, cD) \ NET_REGISTER_DEV(TTL_9316, name) \ @@ -63,146 +63,7 @@ NET_CONNECT(name, C, cC) \ NET_CONNECT(name, D, cD) -#define TTL_9316_DIP(name) \ +#define TTL_9316_DIP(name) \ NET_REGISTER_DEV(TTL_9316_DIP, name) -namespace netlist -{ - namespace devices - { - -NETLIB_OBJECT(9316_subABCD) -{ - NETLIB_CONSTRUCTOR(9316_subABCD) - { - enregister("A", m_A); - enregister("B", m_B); - enregister("C", m_C); - enregister("D", m_D); - } - - NETLIB_RESETI(); - //NETLIB_UPDATEI(); - -public: - logic_input_t m_A; - logic_input_t m_B; - logic_input_t m_C; - logic_input_t m_D; - - ATTR_HOT inline UINT8 read_ABCD() const - { - //return (INPLOGIC_PASSIVE(m_D) << 3) | (INPLOGIC_PASSIVE(m_C) << 2) | (INPLOGIC_PASSIVE(m_B) << 1) | (INPLOGIC_PASSIVE(m_A) << 0); - return (INPLOGIC(m_D) << 3) | (INPLOGIC(m_C) << 2) | (INPLOGIC(m_B) << 1) | (INPLOGIC(m_A) << 0); - } -}; - -NETLIB_OBJECT(9316_sub) -{ - NETLIB_CONSTRUCTOR(9316_sub) - , m_cnt(0) - , m_ABCD(nullptr) - , m_loadq(0) - , m_ent(0) - { - enregister("CLK", m_CLK); - - enregister("QA", m_QA); - enregister("QB", m_QB); - enregister("QC", m_QC); - enregister("QD", m_QD); - enregister("RC", m_RC); - - save(NLNAME(m_cnt)); - save(NLNAME(m_loadq)); - save(NLNAME(m_ent)); - } - - NETLIB_RESETI(); - NETLIB_UPDATEI(); - -public: - ATTR_HOT inline void update_outputs_all(const UINT8 cnt, const netlist_time out_delay); - ATTR_HOT inline void update_outputs(const UINT8 cnt); - - logic_input_t m_CLK; - - logic_output_t m_QA; - logic_output_t m_QB; - logic_output_t m_QC; - logic_output_t m_QD; - logic_output_t m_RC; - - UINT8 m_cnt; - NETLIB_NAME(9316_subABCD) *m_ABCD; - netlist_sig_t m_loadq; - netlist_sig_t m_ent; -}; - -NETLIB_OBJECT(9316) -{ - NETLIB_CONSTRUCTOR(9316) - , sub(*this, "sub") - , subABCD(*this, "subABCD") - { - sub.m_ABCD = &(subABCD); - - register_subalias("CLK", sub.m_CLK); - - enregister("ENP", m_ENP); - enregister("ENT", m_ENT); - enregister("CLRQ", m_CLRQ); - enregister("LOADQ", m_LOADQ); - - register_subalias("A", subABCD.m_A); - register_subalias("B", subABCD.m_B); - register_subalias("C", subABCD.m_C); - register_subalias("D", subABCD.m_D); - - register_subalias("QA", sub.m_QA); - register_subalias("QB", sub.m_QB); - register_subalias("QC", sub.m_QC); - register_subalias("QD", sub.m_QD); - register_subalias("RC", sub.m_RC); - } - - NETLIB_RESETI(); - NETLIB_UPDATEI(); - -protected: - NETLIB_SUB(9316_sub) sub; - NETLIB_SUB(9316_subABCD) subABCD; - logic_input_t m_ENP; - logic_input_t m_ENT; - logic_input_t m_CLRQ; - logic_input_t m_LOADQ; -}; - -NETLIB_OBJECT_DERIVED(9316_dip, 9316) -{ - NETLIB_CONSTRUCTOR_DERIVED(9316_dip, 9316) - { - register_subalias("1", m_CLRQ); - register_subalias("2", sub.m_CLK); - register_subalias("3", subABCD.m_A); - register_subalias("4", subABCD.m_B); - register_subalias("5", subABCD.m_C); - register_subalias("6", subABCD.m_D); - register_subalias("7", m_ENP); - // register_subalias("8", ); -. GND - - register_subalias("9", m_LOADQ); - register_subalias("10", m_ENT); - register_subalias("11", sub.m_QD); - register_subalias("12", sub.m_QC); - register_subalias("13", sub.m_QB); - register_subalias("14", sub.m_QA); - register_subalias("15", sub.m_RC); - // register_subalias("16", ); -. VCC - } -}; - - } //namespace devices -} // namespace netlist - #endif /* NLD_9316_H_ */ From 99530d07771a6361f0903689e6fef29ca9a7dfc5 Mon Sep 17 00:00:00 2001 From: couriersud Date: Sun, 29 May 2016 17:42:47 +0200 Subject: [PATCH 12/44] Moved more device definitions into cpp files. New prefix "nlid" for include files flags purely internal include files not to be leaked into userland. (nw) --- scripts/src/netlist.lua | 3 +- src/lib/netlist/devices/net_lib.cpp | 32 +- src/lib/netlist/devices/nld_4020.cpp | 2 +- src/lib/netlist/devices/nld_4066.cpp | 2 +- src/lib/netlist/devices/nld_74123.cpp | 2 +- src/lib/netlist/devices/nld_cmos.h | 41 -- src/lib/netlist/devices/nld_mm5837.cpp | 128 +++-- src/lib/netlist/devices/nld_mm5837.h | 62 +-- src/lib/netlist/devices/nld_ne555.cpp | 181 ++++--- src/lib/netlist/devices/nld_ne555.h | 78 +-- src/lib/netlist/devices/nld_r2r_dac.cpp | 39 +- src/lib/netlist/devices/nld_r2r_dac.h | 43 +- src/lib/netlist/devices/nld_system.cpp | 362 +++++++------- src/lib/netlist/devices/nld_system.h | 631 ++---------------------- src/lib/netlist/devices/nlid_cmos.h | 41 ++ src/lib/netlist/devices/nlid_system.h | 591 ++++++++++++++++++++++ src/lib/netlist/nl_base.cpp | 2 +- src/lib/netlist/nl_setup.cpp | 2 +- 18 files changed, 1125 insertions(+), 1117 deletions(-) delete mode 100644 src/lib/netlist/devices/nld_cmos.h create mode 100644 src/lib/netlist/devices/nlid_cmos.h create mode 100644 src/lib/netlist/devices/nlid_system.h diff --git a/scripts/src/netlist.lua b/scripts/src/netlist.lua index aa00ec2c194..fffb0e89d54 100644 --- a/scripts/src/netlist.lua +++ b/scripts/src/netlist.lua @@ -136,9 +136,10 @@ project "netlist" MAME_DIR .. "src/lib/netlist/devices/nld_log.h", MAME_DIR .. "src/lib/netlist/devices/nld_system.cpp", MAME_DIR .. "src/lib/netlist/devices/nld_system.h", - MAME_DIR .. "src/lib/netlist/devices/nld_cmos.h", MAME_DIR .. "src/lib/netlist/devices/nld_truthtable.cpp", MAME_DIR .. "src/lib/netlist/devices/nld_truthtable.h", + MAME_DIR .. "src/lib/netlist/devices/nlid_cmos.h", + MAME_DIR .. "src/lib/netlist/devices/nlid_system.h", MAME_DIR .. "src/lib/netlist/macro/nlm_ttl74xx.cpp", MAME_DIR .. "src/lib/netlist/macro/nlm_ttl74xx.h", MAME_DIR .. "src/lib/netlist/macro/nlm_cd4xxx.cpp", diff --git a/src/lib/netlist/devices/net_lib.cpp b/src/lib/netlist/devices/net_lib.cpp index 5fc7c2c3f46..d8fed3d27c8 100644 --- a/src/lib/netlist/devices/net_lib.cpp +++ b/src/lib/netlist/devices/net_lib.cpp @@ -85,23 +85,23 @@ void initialize_factory(factory_list_t &factory) ENTRY(VS, VS, "V") ENTRY(CS, CS, "I") ENTRY(OPAMP, OPAMP, "MODEL") - ENTRY(dummy_input, DUMMY_INPUT, "-") - ENTRY(frontier, FRONTIER_DEV, "+I,G,Q") // not intended to be used directly - ENTRY(function, AFUNC, "N,FUNC") // only for macro devices - NO FEEDBACK loops + ENTRYX(dummy_input, DUMMY_INPUT, "-") + ENTRYX(frontier, FRONTIER_DEV, "+I,G,Q") // not intended to be used directly + ENTRYX(function, AFUNC, "N,FUNC") // only for macro devices - NO FEEDBACK loops ENTRY(QBJT_EB, QBJT_EB, "MODEL") ENTRY(QBJT_switch, QBJT_SW, "MODEL") - ENTRY(logic_input, TTL_INPUT, "IN") - ENTRY(logic_input, LOGIC_INPUT, "IN,FAMILY") - ENTRY(analog_input, ANALOG_INPUT, "IN") + ENTRYX(logic_input, TTL_INPUT, "IN") + ENTRYX(logic_input, LOGIC_INPUT, "IN,FAMILY") + ENTRYX(analog_input, ANALOG_INPUT, "IN") ENTRYX(log, LOG, "+I") ENTRYX(logD, LOGD, "+I,I2") - ENTRY(clock, CLOCK, "FREQ") - ENTRY(extclock, EXTCLOCK, "FREQ") - ENTRY(mainclock, MAINCLOCK, "FREQ") - ENTRY(gnd, GND, "-") - ENTRY(netlistparams, PARAMETER, "-") + ENTRYX(clock, CLOCK, "FREQ") + ENTRYX(extclock, EXTCLOCK, "FREQ") + ENTRYX(mainclock, MAINCLOCK, "FREQ") + ENTRYX(gnd, GND, "-") + ENTRYX(netlistparams, PARAMETER, "-") ENTRY(solver, SOLVER, "FREQ") - ENTRY(res_sw, RES_SWITCH, "+IN,P1,P2") + ENTRYX(res_sw, RES_SWITCH, "+IN,P1,P2") ENTRY(switch1, SWITCH, "-") ENTRY(switch2, SWITCH2, "-") ENTRYX(nicRSFF, NETDEV_RSFF, "+S,R") @@ -130,8 +130,8 @@ void initialize_factory(factory_list_t &factory) /* entries with suffix WI are legacy only */ ENTRYX(CD4020, CD4020_WI, "+IP,RESET,VDD,VSS") //ENTRY(4066, CD_4066, "+A,B") - ENTRY(NE555, NE555, "-") - ENTRY(r2r_dac, R2R_DAC, "+VIN,R,N") + ENTRYX(NE555, NE555, "-") + ENTRYX(r2r_dac, R2R_DAC, "+VIN,R,N") ENTRYX(4538_dip, CD4538_DIP, "-") ENTRYX(7448_dip, TTL_7448_DIP, "-") ENTRYX(7450_dip, TTL_7450_DIP, "-") @@ -152,8 +152,8 @@ void initialize_factory(factory_list_t &factory) ENTRYX(9312_dip, TTL_9312_DIP, "-") ENTRYX(9316_dip, TTL_9316_DIP, "-") ENTRYX(SN74LS629_dip, SN74LS629_DIP, "1.CAP1,2.CAP2") - ENTRY(NE555_dip, NE555_DIP, "-") - ENTRY(MM5837_dip, MM5837_DIP, "-") + ENTRYX(NE555_dip, NE555_DIP, "-") + ENTRYX(MM5837_dip, MM5837_DIP, "-") } } //namespace devices diff --git a/src/lib/netlist/devices/nld_4020.cpp b/src/lib/netlist/devices/nld_4020.cpp index fd384777104..44083ad6ba5 100644 --- a/src/lib/netlist/devices/nld_4020.cpp +++ b/src/lib/netlist/devices/nld_4020.cpp @@ -5,8 +5,8 @@ * */ +#include #include "nld_4020.h" -#include "nld_cmos.h" namespace netlist { diff --git a/src/lib/netlist/devices/nld_4066.cpp b/src/lib/netlist/devices/nld_4066.cpp index 0f9c86d4f46..788704b617e 100644 --- a/src/lib/netlist/devices/nld_4066.cpp +++ b/src/lib/netlist/devices/nld_4066.cpp @@ -5,8 +5,8 @@ * */ +#include #include "nld_4066.h" -#include "nld_cmos.h" namespace netlist { diff --git a/src/lib/netlist/devices/nld_74123.cpp b/src/lib/netlist/devices/nld_74123.cpp index 0d91a312858..1fc8ddd74a3 100644 --- a/src/lib/netlist/devices/nld_74123.cpp +++ b/src/lib/netlist/devices/nld_74123.cpp @@ -7,7 +7,7 @@ #include "nld_74123.h" -#include "nld_system.h" +#include "nlid_system.h" #include "analog/nld_twoterm.h" #define R_OFF (1E20) diff --git a/src/lib/netlist/devices/nld_cmos.h b/src/lib/netlist/devices/nld_cmos.h deleted file mode 100644 index 3be73b2aa85..00000000000 --- a/src/lib/netlist/devices/nld_cmos.h +++ /dev/null @@ -1,41 +0,0 @@ -// license:GPL-2.0+ -// copyright-holders:Couriersud -/* - * nld_cmos.h - * - */ - -#ifndef NLD_CMOS_H_ -#define NLD_CMOS_H_ - -#include "nl_base.h" -#include "analog/nld_twoterm.h" - -namespace netlist -{ - namespace devices - { - -NETLIB_OBJECT(vdd_vss) -{ - NETLIB_CONSTRUCTOR(vdd_vss) - { - enregister("VDD", m_vdd); - enregister("VSS", m_vss); - } - - NETLIB_UPDATEI() {}; - NETLIB_RESETI() {}; - -public: - ATTR_HOT inline nl_double vdd() { return INPANALOG(m_vdd); } - ATTR_HOT inline nl_double vss() { return INPANALOG(m_vss); } - - analog_input_t m_vdd; - analog_input_t m_vss; -}; - - } //namespace devices -} // namespace netlist - -#endif /* NLD_CMOS_H_ */ diff --git a/src/lib/netlist/devices/nld_mm5837.cpp b/src/lib/netlist/devices/nld_mm5837.cpp index aa51492560a..54d66dd17bb 100644 --- a/src/lib/netlist/devices/nld_mm5837.cpp +++ b/src/lib/netlist/devices/nld_mm5837.cpp @@ -5,58 +5,110 @@ * */ -#include #include "nld_mm5837.h" -#include "nl_setup.h" +#include +#include "analog/nld_twoterm.h" -#define R_LOW (1000) -#define R_HIGH (1000) +#define R_LOW (1000.0) +#define R_HIGH (1000.0) namespace netlist { namespace devices { -NETLIB_RESET(MM5837_dip) -{ - //m_V0.initial(0.0); - //m_RV.do_reset(); - m_RV.set(NL_FCONST(1.0) / R_LOW, 0.0, 0.0); - - m_shift = 0x1ffff; - m_is_timestep = m_RV.m_P.net().solver()->is_timestep(); -} - -NETLIB_UPDATE(MM5837_dip) -{ - OUTLOGIC(m_Q, !m_Q.net().as_logic().new_Q(), m_inc ); - - /* shift register - * - * 17 bits, bits 17 & 14 feed back to input - * - */ - - const UINT32 last_state = m_shift & 0x01; - /* shift */ - m_shift = (m_shift >> 1) | (((m_shift & 0x01) ^ ((m_shift >> 3) & 0x01)) << 16); - const UINT32 state = m_shift & 0x01; - - if (state != last_state) + NETLIB_OBJECT(MM5837_dip) { - const nl_double R = state ? R_HIGH : R_LOW; - const nl_double V = state ? INPANALOG(m_VDD) : INPANALOG(m_VSS); + NETLIB_CONSTRUCTOR(MM5837_dip) + , m_RV(*this, "RV") + , m_is_timestep(false) + { + /* clock */ + enregister("Q", m_Q); + enregister("FB", m_feedback); + m_inc = netlist_time::from_hz(56000); + connect_late(m_feedback, m_Q); - // We only need to update the net first if this is a time stepping net - if (m_is_timestep) - m_RV.update_dev(); - m_RV.set(NL_FCONST(1.0) / R, V, 0.0); - m_RV.m_P.schedule_after(NLTIME_FROM_NS(1)); + /* output */ + enregister("_RV1", m_RV.m_P); + enregister("_RV2", m_RV.m_N); + enregister("_Q", m_V0); + connect_late(m_RV.m_N, m_V0); + + /* device */ + enregister("1", m_VDD); + enregister("2", m_VGG); + register_subalias("3", m_RV.m_P); + enregister("4", m_VSS); + + save(NLNAME(m_shift)); + + } + + NETLIB_RESETI(); + NETLIB_UPDATEI(); + + protected: + NETLIB_SUB(twoterm) m_RV; + analog_input_t m_VDD; + analog_input_t m_VGG; + analog_input_t m_VSS; + + /* output stage */ + analog_output_t m_V0; /* could be gnd as well */ + + /* clock stage */ + logic_input_t m_feedback; + logic_output_t m_Q; + netlist_time m_inc; + + /* state */ + UINT32 m_shift; + + /* cache */ + bool m_is_timestep; + }; + + NETLIB_RESET(MM5837_dip) + { + //m_V0.initial(0.0); + //m_RV.do_reset(); + m_RV.set(NL_FCONST(1.0) / R_LOW, 0.0, 0.0); + + m_shift = 0x1ffff; + m_is_timestep = m_RV.m_P.net().solver()->is_timestep(); } -} + NETLIB_UPDATE(MM5837_dip) + { + OUTLOGIC(m_Q, !m_Q.net().as_logic().new_Q(), m_inc ); + /* shift register + * + * 17 bits, bits 17 & 14 feed back to input + * + */ + const UINT32 last_state = m_shift & 0x01; + /* shift */ + m_shift = (m_shift >> 1) | (((m_shift & 0x01) ^ ((m_shift >> 3) & 0x01)) << 16); + const UINT32 state = m_shift & 0x01; + + if (state != last_state) + { + const nl_double R = state ? R_HIGH : R_LOW; + const nl_double V = state ? INPANALOG(m_VDD) : INPANALOG(m_VSS); + + // We only need to update the net first if this is a time stepping net + if (m_is_timestep) + m_RV.update_dev(); + m_RV.set(NL_FCONST(1.0) / R, V, 0.0); + m_RV.m_P.schedule_after(NLTIME_FROM_NS(1)); + } + + } + + NETLIB_DEVICE_IMPL(MM5837_dip) } //namespace devices } // namespace netlist diff --git a/src/lib/netlist/devices/nld_mm5837.h b/src/lib/netlist/devices/nld_mm5837.h index 8519aff582f..d50a456b93c 100644 --- a/src/lib/netlist/devices/nld_mm5837.h +++ b/src/lib/netlist/devices/nld_mm5837.h @@ -19,69 +19,9 @@ #ifndef NLD_MM5837_H_ #define NLD_MM5837_H_ -#include "nl_base.h" -#include "analog/nld_twoterm.h" +#include "nl_setup.h" #define MM5837_DIP(name) \ NET_REGISTER_DEV(MM5837_DIP, name) -namespace netlist -{ - namespace devices - { - -NETLIB_OBJECT(MM5837_dip) -{ - NETLIB_CONSTRUCTOR(MM5837_dip) - ,m_RV(*this, "RV") - { - /* clock */ - enregister("Q", m_Q); - enregister("FB", m_feedback); - m_inc = netlist_time::from_hz(56000); - connect_late(m_feedback, m_Q); - - /* output */ - enregister("_RV1", m_RV.m_P); - enregister("_RV2", m_RV.m_N); - enregister("_Q", m_V0); - connect_late(m_RV.m_N, m_V0); - - /* device */ - enregister("1", m_VDD); - enregister("2", m_VGG); - register_subalias("3", m_RV.m_P); - enregister("4", m_VSS); - - save(NLNAME(m_shift)); - - } - - NETLIB_RESETI(); - NETLIB_UPDATEI(); - -protected: - NETLIB_SUB(twoterm) m_RV; - analog_input_t m_VDD; - analog_input_t m_VGG; - analog_input_t m_VSS; - - /* output stage */ - analog_output_t m_V0; /* could be gnd as well */ - - /* clock stage */ - logic_input_t m_feedback; - logic_output_t m_Q; - netlist_time m_inc; - - /* state */ - UINT32 m_shift; - - /* cache */ - bool m_is_timestep; -}; - - } //namespace devices -} // namespace netlist - #endif /* NLD_MM5837_H_ */ diff --git a/src/lib/netlist/devices/nld_ne555.cpp b/src/lib/netlist/devices/nld_ne555.cpp index 0a615c62336..7f40497e2de 100644 --- a/src/lib/netlist/devices/nld_ne555.cpp +++ b/src/lib/netlist/devices/nld_ne555.cpp @@ -5,9 +5,9 @@ * */ -#include #include "nld_ne555.h" -#include "nl_setup.h" +#include "analog/nld_twoterm.h" +#include #define R_OFF (1E20) #define R_ON (25) // Datasheet states a maximum discharge of 200mA, R = 5V / 0.2 @@ -17,68 +17,135 @@ namespace netlist namespace devices { -inline nl_double NETLIB_NAME(NE555)::clamp(const nl_double v, const nl_double a, const nl_double b) -{ - nl_double ret = v; - nl_double vcc = TERMANALOG(m_R1.m_P); - - if (ret > vcc - a) - ret = vcc - a; - if (ret < b) - ret = b; - return ret; -} - -NETLIB_RESET(NE555) -{ - m_R1.do_reset(); - m_R2.do_reset(); - m_R3.do_reset(); - m_RDIS.do_reset(); - - m_R1.set_R(5000); - m_R2.set_R(5000); - m_R3.set_R(5000); - m_RDIS.set_R(R_OFF); - - m_last_out = true; -} - -NETLIB_UPDATE(NE555) -{ - // FIXME: assumes GND is connected to 0V. - - nl_double vt = clamp(TERMANALOG(m_R2.m_P), 0.7, 1.4); - bool bthresh = (INPANALOG(m_THRES) > vt); - bool btrig = (INPANALOG(m_TRIG) > clamp(TERMANALOG(m_R2.m_N), 0.7, 1.4)); - - if (!btrig) + NETLIB_OBJECT(NE555) { - m_ff = true; - } - else if (bthresh) + NETLIB_CONSTRUCTOR(NE555) + , m_R1(*this, "R1") + , m_R2(*this, "R2") + , m_R3(*this, "R3") + , m_RDIS(*this, "RDIS") + , m_last_out(false) + , m_ff(false) + { + + register_subalias("GND", m_R3.m_N); // Pin 1 + enregister("TRIG", m_TRIG); // Pin 2 + enregister("OUT", m_OUT); // Pin 3 + enregister("RESET", m_RESET); // Pin 4 + register_subalias("CONT", m_R1.m_N); // Pin 5 + enregister("THRESH", m_THRES); // Pin 6 + register_subalias("DISCH", m_RDIS.m_P); // Pin 7 + register_subalias("VCC", m_R1.m_P); // Pin 8 + + connect_late(m_R1.m_N, m_R2.m_P); + connect_late(m_R2.m_N, m_R3.m_P); + connect_late(m_RDIS.m_N, m_R3.m_N); + + save(NLNAME(m_last_out)); + save(NLNAME(m_ff)); + } + + NETLIB_UPDATEI(); + NETLIB_RESETI(); + + protected: + NETLIB_SUB(R) m_R1; + NETLIB_SUB(R) m_R2; + NETLIB_SUB(R) m_R3; + NETLIB_SUB(R) m_RDIS; + + logic_input_t m_RESET; + analog_input_t m_THRES; + analog_input_t m_TRIG; + analog_output_t m_OUT; + + private: + bool m_last_out; + bool m_ff; + + inline nl_double clamp(const nl_double v, const nl_double a, const nl_double b); + + }; + + NETLIB_OBJECT_DERIVED(NE555_dip, NE555) { - m_ff = false; + NETLIB_CONSTRUCTOR_DERIVED(NE555_dip, NE555) + { + register_subalias("1", m_R3.m_N); // Pin 1 + register_subalias("2", m_TRIG); // Pin 2 + register_subalias("3", m_OUT); // Pin 3 + register_subalias("4", m_RESET); // Pin 4 + register_subalias("5", m_R1.m_N); // Pin 5 + register_subalias("6", m_THRES); // Pin 6 + register_subalias("7", m_RDIS.m_P); // Pin 7 + register_subalias("8", m_R1.m_P); // Pin 8 + } + }; + + inline nl_double NETLIB_NAME(NE555)::clamp(const nl_double v, const nl_double a, const nl_double b) + { + nl_double ret = v; + nl_double vcc = TERMANALOG(m_R1.m_P); + + if (ret > vcc - a) + ret = vcc - a; + if (ret < b) + ret = b; + return ret; } - bool out = (!INPLOGIC(m_RESET) ? false : m_ff); + NETLIB_RESET(NE555) + { + m_R1.do_reset(); + m_R2.do_reset(); + m_R3.do_reset(); + m_RDIS.do_reset(); - if (m_last_out && !out) - { - m_RDIS.update_dev(); - OUTANALOG(m_OUT, TERMANALOG(m_R3.m_N)); - m_RDIS.set_R(R_ON); - } - else if (!m_last_out && out) - { - m_RDIS.update_dev(); - // FIXME: Should be delayed by 100ns - OUTANALOG(m_OUT, TERMANALOG(m_R1.m_P)); + m_R1.set_R(5000); + m_R2.set_R(5000); + m_R3.set_R(5000); m_RDIS.set_R(R_OFF); - } - m_last_out = out; -} + m_last_out = true; + } + + NETLIB_UPDATE(NE555) + { + // FIXME: assumes GND is connected to 0V. + + nl_double vt = clamp(TERMANALOG(m_R2.m_P), 0.7, 1.4); + bool bthresh = (INPANALOG(m_THRES) > vt); + bool btrig = (INPANALOG(m_TRIG) > clamp(TERMANALOG(m_R2.m_N), 0.7, 1.4)); + + if (!btrig) + { + m_ff = true; + } + else if (bthresh) + { + m_ff = false; + } + + bool out = (!INPLOGIC(m_RESET) ? false : m_ff); + + if (m_last_out && !out) + { + m_RDIS.update_dev(); + OUTANALOG(m_OUT, TERMANALOG(m_R3.m_N)); + m_RDIS.set_R(R_ON); + } + else if (!m_last_out && out) + { + m_RDIS.update_dev(); + // FIXME: Should be delayed by 100ns + OUTANALOG(m_OUT, TERMANALOG(m_R1.m_P)); + m_RDIS.set_R(R_OFF); + } + m_last_out = out; + } + + NETLIB_DEVICE_IMPL(NE555) + NETLIB_DEVICE_IMPL(NE555_dip) } //namespace devices } // namespace netlist diff --git a/src/lib/netlist/devices/nld_ne555.h b/src/lib/netlist/devices/nld_ne555.h index 3b05dea36db..27e02285ee0 100644 --- a/src/lib/netlist/devices/nld_ne555.h +++ b/src/lib/netlist/devices/nld_ne555.h @@ -19,86 +19,12 @@ #ifndef NLD_NE555_H_ #define NLD_NE555_H_ -#include "nl_base.h" -#include "analog/nld_twoterm.h" +#include "nl_setup.h" -#define NE555(name) \ +#define NE555(name) \ NET_REGISTER_DEV(NE555, name) -namespace netlist -{ - namespace devices - { - -NETLIB_OBJECT(NE555) -{ - NETLIB_CONSTRUCTOR(NE555) - , m_R1(*this, "R1") - , m_R2(*this, "R2") - , m_R3(*this, "R3") - , m_RDIS(*this, "RDIS") - , m_last_out(false) - , m_ff(false) - { - - register_subalias("GND", m_R3.m_N); // Pin 1 - enregister("TRIG", m_TRIG); // Pin 2 - enregister("OUT", m_OUT); // Pin 3 - enregister("RESET", m_RESET); // Pin 4 - register_subalias("CONT", m_R1.m_N); // Pin 5 - enregister("THRESH", m_THRES); // Pin 6 - register_subalias("DISCH", m_RDIS.m_P); // Pin 7 - register_subalias("VCC", m_R1.m_P); // Pin 8 - - connect_late(m_R1.m_N, m_R2.m_P); - connect_late(m_R2.m_N, m_R3.m_P); - connect_late(m_RDIS.m_N, m_R3.m_N); - - save(NLNAME(m_last_out)); - save(NLNAME(m_ff)); - } - - NETLIB_UPDATEI(); - NETLIB_RESETI(); - -protected: - NETLIB_SUB(R) m_R1; - NETLIB_SUB(R) m_R2; - NETLIB_SUB(R) m_R3; - NETLIB_SUB(R) m_RDIS; - - logic_input_t m_RESET; - analog_input_t m_THRES; - analog_input_t m_TRIG; - analog_output_t m_OUT; - -private: - bool m_last_out; - bool m_ff; - - inline nl_double clamp(const nl_double v, const nl_double a, const nl_double b); - -}; - #define NE555_DIP(name) \ NET_REGISTER_DEV(NE555_DIP, name) -NETLIB_OBJECT_DERIVED(NE555_dip, NE555) -{ - NETLIB_CONSTRUCTOR_DERIVED(NE555_dip, NE555) - { - register_subalias("1", m_R3.m_N); // Pin 1 - register_subalias("2", m_TRIG); // Pin 2 - register_subalias("3", m_OUT); // Pin 3 - register_subalias("4", m_RESET); // Pin 4 - register_subalias("5", m_R1.m_N); // Pin 5 - register_subalias("6", m_THRES); // Pin 6 - register_subalias("7", m_RDIS.m_P); // Pin 7 - register_subalias("8", m_R1.m_P); // Pin 8 - } -}; - - } //namespace devices -} // namespace netlist - #endif /* NLD_NE555_H_ */ diff --git a/src/lib/netlist/devices/nld_r2r_dac.cpp b/src/lib/netlist/devices/nld_r2r_dac.cpp index e464241a7f0..eb95058fa69 100644 --- a/src/lib/netlist/devices/nld_r2r_dac.cpp +++ b/src/lib/netlist/devices/nld_r2r_dac.cpp @@ -6,20 +6,47 @@ */ #include "nld_r2r_dac.h" +#include "analog/nld_twoterm.h" namespace netlist { namespace devices { -NETLIB_UPDATE_PARAM(r2r_dac) -{ - update_dev(); + NETLIB_OBJECT_DERIVED(r2r_dac, twoterm) + { + NETLIB_CONSTRUCTOR_DERIVED(r2r_dac, twoterm) + , m_VIN(*this, "VIN", 1.0) + , m_R(*this, "R", 1.0) + , m_num(*this, "N", 1) + , m_val(*this, "VAL", 1) + { + enregister("VOUT", m_P); + enregister("VGND", m_N); + } - nl_double V = m_VIN.Value() / (nl_double) (1 << m_num.Value()) * (nl_double) m_val.Value(); + NETLIB_UPDATE_PARAMI(); + //NETLIB_RESETI(); + //NETLIB_UPDATEI(); - this->set(1.0 / m_R.Value(), V, 0.0); -} + protected: + param_double_t m_VIN; + param_double_t m_R; + param_int_t m_num; + param_int_t m_val; + }; + + + NETLIB_UPDATE_PARAM(r2r_dac) + { + update_dev(); + + nl_double V = m_VIN.Value() / (nl_double) (1 << m_num.Value()) * (nl_double) m_val.Value(); + + this->set(1.0 / m_R.Value(), V, 0.0); + } + + NETLIB_DEVICE_IMPL(r2r_dac) } //namespace devices } // namespace netlist diff --git a/src/lib/netlist/devices/nld_r2r_dac.h b/src/lib/netlist/devices/nld_r2r_dac.h index dbf1324a80f..b88d0f595f6 100644 --- a/src/lib/netlist/devices/nld_r2r_dac.h +++ b/src/lib/netlist/devices/nld_r2r_dac.h @@ -46,45 +46,12 @@ #ifndef NLD_R2R_DAC_H_ #define NLD_R2R_DAC_H_ -#include "nl_base.h" -#include "analog/nld_twoterm.h" +#include "nl_setup.h" -#define R2R_DAC(name, p_VIN, p_R, p_N) \ - NET_REGISTER_DEV(R2R_DAC, name) \ - NETDEV_PARAMI(name, VIN, p_VIN) \ - NETDEV_PARAMI(name, R, p_R) \ +#define R2R_DAC(name, p_VIN, p_R, p_N) \ + NET_REGISTER_DEV(R2R_DAC, name) \ + NETDEV_PARAMI(name, VIN, p_VIN) \ + NETDEV_PARAMI(name, R, p_R) \ NETDEV_PARAMI(name, N, p_N) -namespace netlist -{ - namespace devices - { - -NETLIB_OBJECT_DERIVED(r2r_dac, twoterm) -{ - NETLIB_CONSTRUCTOR_DERIVED(r2r_dac, twoterm) - , m_VIN(*this, "VIN", 1.0) - , m_R(*this, "R", 1.0) - , m_num(*this, "N", 1) - , m_val(*this, "VAL", 1) - { - enregister("VOUT", m_P); - enregister("VGND", m_N); - } - - NETLIB_UPDATE_PARAMI(); - //NETLIB_RESETI(); - //NETLIB_UPDATEI(); - -protected: - param_double_t m_VIN; - param_double_t m_R; - param_int_t m_num; - param_int_t m_val; -}; - - } //namespace devices -} // namespace netlist - - #endif /* NLD_R2R_DAC_H_ */ diff --git a/src/lib/netlist/devices/nld_system.cpp b/src/lib/netlist/devices/nld_system.cpp index 6924432821f..ee3d381d422 100644 --- a/src/lib/netlist/devices/nld_system.cpp +++ b/src/lib/netlist/devices/nld_system.cpp @@ -7,211 +7,223 @@ #include #include -#include "nld_system.h" +#include "nlid_system.h" namespace netlist { namespace devices { -// ---------------------------------------------------------------------------------------- -// netlistparams -// ---------------------------------------------------------------------------------------- + // ---------------------------------------------------------------------------------------- + // netlistparams + // ---------------------------------------------------------------------------------------- -// ---------------------------------------------------------------------------------------- -// clock -// ---------------------------------------------------------------------------------------- + // ---------------------------------------------------------------------------------------- + // clock + // ---------------------------------------------------------------------------------------- -NETLIB_UPDATE_PARAM(clock) -{ - m_inc = netlist_time::from_hz(m_freq.Value()*2); -} - -NETLIB_UPDATE(clock) -{ - OUTLOGIC(m_Q, !m_Q.net().as_logic().new_Q(), m_inc ); -} - -// ---------------------------------------------------------------------------------------- -// extclock -// ---------------------------------------------------------------------------------------- - -NETLIB_RESET(extclock) -{ - m_cnt = 0; - m_off = netlist_time::from_double(m_offset.Value()); - //m_Q.initial(0); -} - -NETLIB_UPDATE(extclock) -{ -#if 0 - if (m_off == netlist_time::zero) + NETLIB_UPDATE_PARAM(clock) { - OUTLOGIC(m_Q, (m_cnt & 1) ^ 1, m_inc[m_cnt]); - m_cnt = (m_cnt + 1) % m_size; + m_inc = netlist_time::from_hz(m_freq.Value()*2); } - else + + NETLIB_UPDATE(clock) { - OUTLOGIC(m_Q, (m_cnt & 1) ^ 1, m_inc[0] + m_off); - m_cnt = 1; - m_off = netlist_time::zero; + OUTLOGIC(m_Q, !m_Q.net().as_logic().new_Q(), m_inc ); } -#else - OUTLOGIC(m_Q, (m_cnt & 1) ^ 1, m_inc[m_cnt] + m_off); - m_cnt = (m_cnt + 1) % m_size; - m_off = netlist_time::zero; -#endif -} -// ---------------------------------------------------------------------------------------- -// logic_input -// ---------------------------------------------------------------------------------------- + // ---------------------------------------------------------------------------------------- + // extclock + // ---------------------------------------------------------------------------------------- -NETLIB_RESET(logic_input) -{ - //FIXME: causes issues in breakout (lots of pings after first player 1 start) - //m_Q.initial(m_IN.Value() & 1); -} - -NETLIB_UPDATE(logic_input) -{ - OUTLOGIC(m_Q, m_IN.Value() & 1, netlist_time::from_nsec(1)); -} - -NETLIB_UPDATE_PARAM(logic_input) -{ -} - -// ---------------------------------------------------------------------------------------- -// analog_input -// ---------------------------------------------------------------------------------------- - -NETLIB_RESET(analog_input) -{ -// m_Q.initial(m_IN.Value() * 0.999); -} - -NETLIB_UPDATE(analog_input) -{ - OUTANALOG(m_Q, m_IN.Value()); -} - -NETLIB_UPDATE_PARAM(analog_input) -{ -} - -// ---------------------------------------------------------------------------------------- -// nld_d_to_a_proxy -// ---------------------------------------------------------------------------------------- - -void nld_d_to_a_proxy::reset() -{ - //m_Q.initial(0.0); - m_last_state = -1; - m_RV.do_reset(); - m_is_timestep = m_RV.m_P.net().solver()->has_timestep_devices(); - m_RV.set(NL_FCONST(1.0) / logic_family().m_R_low, logic_family().m_low_V, 0.0); -} - -NETLIB_UPDATE(d_to_a_proxy) -{ - const int state = INPLOGIC(m_I); - if (state != m_last_state) + NETLIB_RESET(extclock) { - m_last_state = state; - const nl_double R = state ? logic_family().m_R_high : logic_family().m_R_low; - const nl_double V = state ? logic_family().m_high_V : logic_family().m_low_V; + m_cnt = 0; + m_off = netlist_time::from_double(m_offset.Value()); + //m_Q.initial(0); + } - // We only need to update the net first if this is a time stepping net - if (m_is_timestep) + NETLIB_UPDATE(extclock) + { + #if 0 + if (m_off == netlist_time::zero) { - m_RV.update_dev(); - } - m_RV.set(NL_FCONST(1.0) / R, V, 0.0); - m_RV.m_P.schedule_after(NLTIME_FROM_NS(1)); - } -} - - -// ----------------------------------------------------------------------------- -// nld_res_sw -// ----------------------------------------------------------------------------- - - -NETLIB_UPDATE(res_sw) -{ - const int state = INPLOGIC(m_I); - if (state != m_last_state) - { - m_last_state = state; - const nl_double R = state ? m_RON.Value() : m_ROFF.Value(); - - // We only need to update the net first if this is a time stepping net - if (0) // m_R->m_P.net().as_analog().solver()->is_timestep()) - { - m_R.update_dev(); - m_R.set_R(R); - m_R.m_P.schedule_after(NLTIME_FROM_NS(1)); + OUTLOGIC(m_Q, (m_cnt & 1) ^ 1, m_inc[m_cnt]); + m_cnt = (m_cnt + 1) % m_size; } else { - m_R.set_R(R); - m_R.m_P.schedule_after(NLTIME_FROM_NS(1)); - //m_R->update_dev(); + OUTLOGIC(m_Q, (m_cnt & 1) ^ 1, m_inc[0] + m_off); + m_cnt = 1; + m_off = netlist_time::zero; } + #else + OUTLOGIC(m_Q, (m_cnt & 1) ^ 1, m_inc[m_cnt] + m_off); + m_cnt = (m_cnt + 1) % m_size; + m_off = netlist_time::zero; + #endif } -} -/* ----------------------------------------------------------------------------- - * nld_function - * ----------------------------------------------------------------------------- */ + // ---------------------------------------------------------------------------------------- + // logic_input + // ---------------------------------------------------------------------------------------- -NETLIB_RESET(function) -{ - //m_Q.initial(0.0); -} - -NETLIB_UPDATE(function) -{ - //nl_double val = INPANALOG(m_I[0]) * INPANALOG(m_I[1]) * 0.2; - //OUTANALOG(m_Q, val); - nl_double stack[20]; - unsigned ptr = 0; - unsigned e = m_precompiled.size(); - for (unsigned i = 0; ihas_timestep_devices(); + m_RV.set(NL_FCONST(1.0) / logic_family().m_R_low, logic_family().m_low_V, 0.0); + } + + NETLIB_UPDATE(d_to_a_proxy) + { + const int state = INPLOGIC(m_I); + if (state != m_last_state) { - case ADD: - ptr--; - stack[ptr-1] = stack[ptr] + stack[ptr-1]; - break; - case MULT: - ptr--; - stack[ptr-1] = stack[ptr] * stack[ptr-1]; - break; - case SUB: - ptr--; - stack[ptr-1] = stack[ptr-1] - stack[ptr]; - break; - case DIV: - ptr--; - stack[ptr-1] = stack[ptr-1] / stack[ptr]; - break; - case PUSH_INPUT: - stack[ptr++] = INPANALOG(m_I[(int) rc.m_param]); - break; - case PUSH_CONST: - stack[ptr++] = rc.m_param; - break; + m_last_state = state; + const nl_double R = state ? logic_family().m_R_high : logic_family().m_R_low; + const nl_double V = state ? logic_family().m_high_V : logic_family().m_low_V; + + // We only need to update the net first if this is a time stepping net + if (m_is_timestep) + { + m_RV.update_dev(); + } + m_RV.set(NL_FCONST(1.0) / R, V, 0.0); + m_RV.m_P.schedule_after(NLTIME_FROM_NS(1)); } } - OUTANALOG(m_Q, stack[ptr-1]); -} + // ----------------------------------------------------------------------------- + // nld_res_sw + // ----------------------------------------------------------------------------- + + + NETLIB_UPDATE(res_sw) + { + const int state = INPLOGIC(m_I); + if (state != m_last_state) + { + m_last_state = state; + const nl_double R = state ? m_RON.Value() : m_ROFF.Value(); + + // We only need to update the net first if this is a time stepping net + if (0) // m_R->m_P.net().as_analog().solver()->is_timestep()) + { + m_R.update_dev(); + m_R.set_R(R); + m_R.m_P.schedule_after(NLTIME_FROM_NS(1)); + } + else + { + m_R.set_R(R); + m_R.m_P.schedule_after(NLTIME_FROM_NS(1)); + //m_R->update_dev(); + } + } + } + + /* ----------------------------------------------------------------------------- + * nld_function + * ----------------------------------------------------------------------------- */ + + NETLIB_RESET(function) + { + //m_Q.initial(0.0); + } + + NETLIB_UPDATE(function) + { + //nl_double val = INPANALOG(m_I[0]) * INPANALOG(m_I[1]) * 0.2; + //OUTANALOG(m_Q, val); + nl_double stack[20]; + unsigned ptr = 0; + unsigned e = m_precompiled.size(); + for (unsigned i = 0; i in <{2}>", cmd, m_func.Value()); - } - m_precompiled.push_back(rc); - } - - - } - -protected: - - NETLIB_RESETI(); - NETLIB_UPDATEI(); - -private: - - enum rpn_cmd - { - ADD, - MULT, - SUB, - DIV, - PUSH_CONST, - PUSH_INPUT - }; - - struct rpn_inst - { - rpn_inst() : m_cmd(ADD), m_param(0.0) { } - rpn_cmd m_cmd; - nl_double m_param; - }; - - param_int_t m_N; - param_str_t m_func; - analog_output_t m_Q; - analog_input_t m_I[10]; - - plib::pvector_t m_precompiled; -}; - -// ----------------------------------------------------------------------------- -// nld_res_sw -// ----------------------------------------------------------------------------- - -NETLIB_OBJECT(res_sw) -{ -public: - NETLIB_CONSTRUCTOR(res_sw) - , m_R(*this, "R") - , m_RON(*this, "RON", 1.0) - , m_ROFF(*this, "ROFF", 1.0E20) - , m_last_state(0) - { - enregister("I", m_I); - - register_subalias("1", m_R.m_P); - register_subalias("2", m_R.m_N); - - save(NLNAME(m_last_state)); - } - - NETLIB_SUB(R) m_R; - logic_input_t m_I; - param_double_t m_RON; - param_double_t m_ROFF; - - NETLIB_RESETI() - { - m_last_state = 0; - m_R.set_R(m_ROFF.Value()); - } - //NETLIB_UPDATE_PARAMI(); - NETLIB_UPDATEI(); - -private: - - UINT8 m_last_state; -}; - -// ----------------------------------------------------------------------------- -// nld_base_proxy -// ----------------------------------------------------------------------------- - -NETLIB_OBJECT(base_proxy) -{ -public: - nld_base_proxy(netlist_t &anetlist, const pstring &name, logic_t *inout_proxied, core_terminal_t *proxy_inout) - : device_t(anetlist, name) - { - m_logic_family = inout_proxied->logic_family(); - m_term_proxied = inout_proxied; - m_proxy_term = proxy_inout; - } - - virtual ~nld_base_proxy() {} - - logic_t &term_proxied() const { return *m_term_proxied; } - core_terminal_t &proxy_term() const { return *m_proxy_term; } - -protected: - - virtual const logic_family_desc_t &logic_family() const - { - return *m_logic_family; - } - -private: - const logic_family_desc_t *m_logic_family; - logic_t *m_term_proxied; - core_terminal_t *m_proxy_term; -}; - -// ----------------------------------------------------------------------------- -// nld_a_to_d_proxy -// ----------------------------------------------------------------------------- - -NETLIB_OBJECT_DERIVED(a_to_d_proxy, base_proxy) -{ -public: - nld_a_to_d_proxy(netlist_t &anetlist, const pstring &name, logic_input_t *in_proxied) - : nld_base_proxy(anetlist, name, in_proxied, &m_I) - { - enregister("I", m_I); - enregister("Q", m_Q); - } - - virtual ~nld_a_to_d_proxy() {} - - analog_input_t m_I; - logic_output_t m_Q; - -protected: - - NETLIB_RESETI() { } - - NETLIB_UPDATEI() - { - if (m_I.Q_Analog() > logic_family().m_high_thresh_V) - OUTLOGIC(m_Q, 1, NLTIME_FROM_NS(1)); - else if (m_I.Q_Analog() < logic_family().m_low_thresh_V) - OUTLOGIC(m_Q, 0, NLTIME_FROM_NS(1)); - else - { - // do nothing - } - } -private: -}; - -// ----------------------------------------------------------------------------- -// nld_base_d_to_a_proxy -// ----------------------------------------------------------------------------- - -NETLIB_OBJECT_DERIVED(base_d_to_a_proxy, base_proxy) -{ -public: - virtual ~nld_base_d_to_a_proxy() {} - - virtual logic_input_t &in() { return m_I; } - -protected: - nld_base_d_to_a_proxy(netlist_t &anetlist, const pstring &name, logic_output_t *out_proxied, core_terminal_t &proxy_out) - : nld_base_proxy(anetlist, name, out_proxied, &proxy_out) - { - enregister("I", m_I); - } - - logic_input_t m_I; - -private: -}; - -NETLIB_OBJECT_DERIVED(d_to_a_proxy, base_d_to_a_proxy) -{ -public: - nld_d_to_a_proxy(netlist_t &anetlist, const pstring &name, logic_output_t *out_proxied) - : nld_base_d_to_a_proxy(anetlist, name, out_proxied, m_RV.m_P) - , m_RV(*this, "RV") - , m_last_state(-1) - , m_is_timestep(false) - { - //register_sub(m_RV); - enregister("1", m_RV.m_P); - enregister("2", m_RV.m_N); - - enregister("_Q", m_Q); - register_subalias("Q", m_RV.m_P); - - connect_late(m_RV.m_N, m_Q); - - save(NLNAME(m_last_state)); - } - - virtual ~nld_d_to_a_proxy() {} - -protected: - - NETLIB_RESETI(); - NETLIB_UPDATEI(); - -private: - analog_output_t m_Q; - NETLIB_SUB(twoterm) m_RV; - int m_last_state; - bool m_is_timestep; -}; - - -class factory_lib_entry_t : public base_factory_t -{ - P_PREVENT_COPYING(factory_lib_entry_t) -public: - - ATTR_COLD factory_lib_entry_t(setup_t &setup, const pstring &name, const pstring &classname, - const pstring &def_param) - : base_factory_t(name, classname, def_param), m_setup(setup) { } - - class wrapper : public device_t - { - public: - wrapper(const pstring &devname, netlist_t &anetlist, const pstring &name) - : device_t(anetlist, name), m_devname(devname) - { - anetlist.setup().namespace_push(name); - anetlist.setup().include(m_devname); - anetlist.setup().namespace_pop(); - } - protected: - NETLIB_RESETI() { } - NETLIB_UPDATEI() { } - - pstring m_devname; - }; - - plib::owned_ptr Create(netlist_t &anetlist, const pstring &name) override - { - return plib::owned_ptr::Create(this->name(), anetlist, name); - } - -private: - setup_t &m_setup; -}; - - - } //namespace devices -} // namespace netlist - #endif /* NLD_SYSTEM_H_ */ diff --git a/src/lib/netlist/devices/nlid_cmos.h b/src/lib/netlist/devices/nlid_cmos.h new file mode 100644 index 00000000000..22dc7beb01d --- /dev/null +++ b/src/lib/netlist/devices/nlid_cmos.h @@ -0,0 +1,41 @@ +// license:GPL-2.0+ +// copyright-holders:Couriersud +/* + * nld_cmos.h + * + */ + +#ifndef NLID_CMOS_H_ +#define NLID_CMOS_H_ + +#include "nl_base.h" +#include "analog/nld_twoterm.h" + +namespace netlist +{ + namespace devices + { + + NETLIB_OBJECT(vdd_vss) + { + NETLIB_CONSTRUCTOR(vdd_vss) + { + enregister("VDD", m_vdd); + enregister("VSS", m_vss); + } + + NETLIB_UPDATEI() {}; + NETLIB_RESETI() {}; + + public: + ATTR_HOT inline nl_double vdd() { return INPANALOG(m_vdd); } + ATTR_HOT inline nl_double vss() { return INPANALOG(m_vss); } + + analog_input_t m_vdd; + analog_input_t m_vss; + }; + + } //namespace devices +} // namespace netlist + +#endif /* NLID_CMOS_H_ */ diff --git a/src/lib/netlist/devices/nlid_system.h b/src/lib/netlist/devices/nlid_system.h new file mode 100644 index 00000000000..18a1a926fef --- /dev/null +++ b/src/lib/netlist/devices/nlid_system.h @@ -0,0 +1,591 @@ +// license:GPL-2.0+ +// copyright-holders:Couriersud +/* + * nlid_system.h + * + * netlist devices defined in the core + * + * This file contains internal headers + */ + +#ifndef NLID_SYSTEM_H_ +#define NLID_SYSTEM_H_ + +#include "nl_setup.h" +#include "nl_base.h" +#include "nl_factory.h" +#include "analog/nld_twoterm.h" + +namespace netlist +{ + namespace devices + { + + // ----------------------------------------------------------------------------- + // netlistparams + // ----------------------------------------------------------------------------- + + NETLIB_OBJECT(netlistparams) + { + NETLIB_CONSTRUCTOR(netlistparams) + , m_use_deactivate(*this, "USE_DEACTIVATE", 0) + { + } + NETLIB_UPDATEI() { } + //NETLIB_RESETI() { } + //NETLIB_UPDATE_PARAMI() { } + public: + param_logic_t m_use_deactivate; + }; + + // ----------------------------------------------------------------------------- + // mainclock + // ----------------------------------------------------------------------------- + + NETLIB_OBJECT(mainclock) + { + NETLIB_CONSTRUCTOR(mainclock) + , m_freq(*this, "FREQ", 7159000.0 * 5) + { + enregister("Q", m_Q); + + m_inc = netlist_time::from_hz(m_freq.Value()*2); + } + + NETLIB_RESETI() + { + m_Q.net().set_time(netlist_time::zero); + } + + NETLIB_UPDATE_PARAMI() + { + m_inc = netlist_time::from_hz(m_freq.Value()*2); + } + + NETLIB_UPDATEI() + { + logic_net_t &net = m_Q.net().as_logic(); + // this is only called during setup ... + net.toggle_new_Q(); + net.set_time(netlist().time() + m_inc); + } + + public: + logic_output_t m_Q; + + param_double_t m_freq; + netlist_time m_inc; + + ATTR_HOT inline static void mc_update(logic_net_t &net); + }; + + // ----------------------------------------------------------------------------- + // clock + // ----------------------------------------------------------------------------- + + NETLIB_OBJECT(clock) + { + NETLIB_CONSTRUCTOR(clock) + , m_freq(*this, "FREQ", 7159000.0 * 5.0) + + { + enregister("Q", m_Q); + enregister("FB", m_feedback); + + m_inc = netlist_time::from_hz(m_freq.Value()*2); + + connect_late(m_feedback, m_Q); + } + NETLIB_UPDATEI(); + //NETLIB_RESETI(); + NETLIB_UPDATE_PARAMI(); + + protected: + logic_input_t m_feedback; + logic_output_t m_Q; + + param_double_t m_freq; + netlist_time m_inc; + }; + + // ----------------------------------------------------------------------------- + // extclock + // ----------------------------------------------------------------------------- + + NETLIB_OBJECT(extclock) + { + NETLIB_CONSTRUCTOR(extclock) + , m_freq(*this, "FREQ", 7159000.0 * 5.0) + , m_pattern(*this, "PATTERN", "1,1") + , m_offset(*this, "OFFSET", 0.0) + { + enregister("Q", m_Q); + enregister("FB", m_feedback); + + m_inc[0] = netlist_time::from_hz(m_freq.Value()*2); + + connect_late(m_feedback, m_Q); + { + netlist_time base = netlist_time::from_hz(m_freq.Value()*2); + plib::pstring_vector_t pat(m_pattern.Value(),","); + m_off = netlist_time::from_double(m_offset.Value()); + + int pati[256]; + m_size = pat.size(); + int total = 0; + for (int i=0; i in <{2}>", cmd, m_func.Value()); + } + m_precompiled.push_back(rc); + } + + + } + + protected: + + NETLIB_RESETI(); + NETLIB_UPDATEI(); + + private: + + enum rpn_cmd + { + ADD, + MULT, + SUB, + DIV, + PUSH_CONST, + PUSH_INPUT + }; + + struct rpn_inst + { + rpn_inst() : m_cmd(ADD), m_param(0.0) { } + rpn_cmd m_cmd; + nl_double m_param; + }; + + param_int_t m_N; + param_str_t m_func; + analog_output_t m_Q; + analog_input_t m_I[10]; + + plib::pvector_t m_precompiled; + }; + + // ----------------------------------------------------------------------------- + // nld_res_sw + // ----------------------------------------------------------------------------- + + NETLIB_OBJECT(res_sw) + { + public: + NETLIB_CONSTRUCTOR(res_sw) + , m_R(*this, "R") + , m_RON(*this, "RON", 1.0) + , m_ROFF(*this, "ROFF", 1.0E20) + , m_last_state(0) + { + enregister("I", m_I); + + register_subalias("1", m_R.m_P); + register_subalias("2", m_R.m_N); + + save(NLNAME(m_last_state)); + } + + NETLIB_SUB(R) m_R; + logic_input_t m_I; + param_double_t m_RON; + param_double_t m_ROFF; + + NETLIB_RESETI() + { + m_last_state = 0; + m_R.set_R(m_ROFF.Value()); + } + //NETLIB_UPDATE_PARAMI(); + NETLIB_UPDATEI(); + + private: + + UINT8 m_last_state; + }; + + // ----------------------------------------------------------------------------- + // nld_base_proxy + // ----------------------------------------------------------------------------- + + NETLIB_OBJECT(base_proxy) + { + public: + nld_base_proxy(netlist_t &anetlist, const pstring &name, logic_t *inout_proxied, core_terminal_t *proxy_inout) + : device_t(anetlist, name) + { + m_logic_family = inout_proxied->logic_family(); + m_term_proxied = inout_proxied; + m_proxy_term = proxy_inout; + } + + virtual ~nld_base_proxy() {} + + logic_t &term_proxied() const { return *m_term_proxied; } + core_terminal_t &proxy_term() const { return *m_proxy_term; } + + protected: + + virtual const logic_family_desc_t &logic_family() const + { + return *m_logic_family; + } + + private: + const logic_family_desc_t *m_logic_family; + logic_t *m_term_proxied; + core_terminal_t *m_proxy_term; + }; + + // ----------------------------------------------------------------------------- + // nld_a_to_d_proxy + // ----------------------------------------------------------------------------- + + NETLIB_OBJECT_DERIVED(a_to_d_proxy, base_proxy) + { + public: + nld_a_to_d_proxy(netlist_t &anetlist, const pstring &name, logic_input_t *in_proxied) + : nld_base_proxy(anetlist, name, in_proxied, &m_I) + { + enregister("I", m_I); + enregister("Q", m_Q); + } + + virtual ~nld_a_to_d_proxy() {} + + analog_input_t m_I; + logic_output_t m_Q; + + protected: + + NETLIB_RESETI() { } + + NETLIB_UPDATEI() + { + if (m_I.Q_Analog() > logic_family().m_high_thresh_V) + OUTLOGIC(m_Q, 1, NLTIME_FROM_NS(1)); + else if (m_I.Q_Analog() < logic_family().m_low_thresh_V) + OUTLOGIC(m_Q, 0, NLTIME_FROM_NS(1)); + else + { + // do nothing + } + } + private: + }; + + // ----------------------------------------------------------------------------- + // nld_base_d_to_a_proxy + // ----------------------------------------------------------------------------- + + NETLIB_OBJECT_DERIVED(base_d_to_a_proxy, base_proxy) + { + public: + virtual ~nld_base_d_to_a_proxy() {} + + virtual logic_input_t &in() { return m_I; } + + protected: + nld_base_d_to_a_proxy(netlist_t &anetlist, const pstring &name, logic_output_t *out_proxied, core_terminal_t &proxy_out) + : nld_base_proxy(anetlist, name, out_proxied, &proxy_out) + { + enregister("I", m_I); + } + + logic_input_t m_I; + + private: + }; + + NETLIB_OBJECT_DERIVED(d_to_a_proxy, base_d_to_a_proxy) + { + public: + nld_d_to_a_proxy(netlist_t &anetlist, const pstring &name, logic_output_t *out_proxied) + : nld_base_d_to_a_proxy(anetlist, name, out_proxied, m_RV.m_P) + , m_RV(*this, "RV") + , m_last_state(-1) + , m_is_timestep(false) + { + //register_sub(m_RV); + enregister("1", m_RV.m_P); + enregister("2", m_RV.m_N); + + enregister("_Q", m_Q); + register_subalias("Q", m_RV.m_P); + + connect_late(m_RV.m_N, m_Q); + + save(NLNAME(m_last_state)); + } + + virtual ~nld_d_to_a_proxy() {} + + protected: + + NETLIB_RESETI(); + NETLIB_UPDATEI(); + + private: + analog_output_t m_Q; + NETLIB_SUB(twoterm) m_RV; + int m_last_state; + bool m_is_timestep; + }; + + + class factory_lib_entry_t : public base_factory_t + { + P_PREVENT_COPYING(factory_lib_entry_t) + public: + + ATTR_COLD factory_lib_entry_t(setup_t &setup, const pstring &name, const pstring &classname, + const pstring &def_param) + : base_factory_t(name, classname, def_param), m_setup(setup) { } + + class wrapper : public device_t + { + public: + wrapper(const pstring &devname, netlist_t &anetlist, const pstring &name) + : device_t(anetlist, name), m_devname(devname) + { + anetlist.setup().namespace_push(name); + anetlist.setup().include(m_devname); + anetlist.setup().namespace_pop(); + } + protected: + NETLIB_RESETI() { } + NETLIB_UPDATEI() { } + + pstring m_devname; + }; + + plib::owned_ptr Create(netlist_t &anetlist, const pstring &name) override + { + return plib::owned_ptr::Create(this->name(), anetlist, name); + } + + private: + setup_t &m_setup; + }; + + + } //namespace devices +} // namespace netlist + +#endif /* NLD_SYSTEM_H_ */ diff --git a/src/lib/netlist/nl_base.cpp b/src/lib/netlist/nl_base.cpp index c30478b0062..970f04326ed 100644 --- a/src/lib/netlist/nl_base.cpp +++ b/src/lib/netlist/nl_base.cpp @@ -10,7 +10,7 @@ #include "plib/palloc.h" #include "nl_base.h" -#include "devices/nld_system.h" +#include "devices/nlid_system.h" #include "nl_util.h" const netlist::netlist_time netlist::netlist_time::zero = netlist::netlist_time(0); diff --git a/src/lib/netlist/nl_setup.cpp b/src/lib/netlist/nl_setup.cpp index 1f91e1666a8..14d435e6b1a 100644 --- a/src/lib/netlist/nl_setup.cpp +++ b/src/lib/netlist/nl_setup.cpp @@ -16,7 +16,7 @@ #include "nl_util.h" #include "nl_factory.h" #include "devices/net_lib.h" -#include "devices/nld_system.h" +#include "devices/nlid_system.h" #include "analog/nld_twoterm.h" #include "solver/nld_solver.h" From 4c7bb29445332471a9cce0dbd268a36867221978 Mon Sep 17 00:00:00 2001 From: couriersud Date: Sun, 29 May 2016 19:10:38 +0200 Subject: [PATCH 13/44] Fix factory code. (nw) --- src/lib/netlist/devices/net_lib.cpp | 4 +-- src/lib/netlist/nl_base.cpp | 16 +++++----- src/lib/netlist/nl_base.h | 13 -------- src/lib/netlist/nl_factory.cpp | 6 ---- src/lib/netlist/nl_factory.h | 46 +++++++++++------------------ src/lib/netlist/nl_setup.cpp | 2 +- 6 files changed, 29 insertions(+), 58 deletions(-) diff --git a/src/lib/netlist/devices/net_lib.cpp b/src/lib/netlist/devices/net_lib.cpp index d8fed3d27c8..2a481daaf5d 100644 --- a/src/lib/netlist/devices/net_lib.cpp +++ b/src/lib/netlist/devices/net_lib.cpp @@ -61,9 +61,9 @@ NETLIST_END() #define ENTRY1(nic, name, defparam) factory.register_device( # name, xstr(nic), defparam ); #define ENTRY(nic, name, defparam) ENTRY1(NETLIB_NAME(nic), name, defparam) -#define NETLIB_DEVICE_DECL(chip) extern device_creator_ptr_t decl_ ## chip; +#define NETLIB_DEVICE_DECL(chip) extern factory_creator_ptr_t decl_ ## chip; -#define ENTRYX1(nic, name, defparam, decl) factory.register_device( # name, xstr(nic), defparam, decl ); +#define ENTRYX1(nic, name, defparam, decl) factory.register_device( decl (# name, xstr(nic), defparam) ); #define ENTRYX(nic, name, defparam) { NETLIB_DEVICE_DECL(nic) ENTRYX1(NETLIB_NAME(nic), name, defparam, decl_ ## nic) } namespace netlist diff --git a/src/lib/netlist/nl_base.cpp b/src/lib/netlist/nl_base.cpp index 970f04326ed..c4ce27a71e4 100644 --- a/src/lib/netlist/nl_base.cpp +++ b/src/lib/netlist/nl_base.cpp @@ -1071,15 +1071,15 @@ namespace netlist namespace devices { -// ---------------------------------------------------------------------------------------- -// mainclock -// ---------------------------------------------------------------------------------------- + // ---------------------------------------------------------------------------------------- + // mainclock + // ---------------------------------------------------------------------------------------- -ATTR_HOT /* inline */ void NETLIB_NAME(mainclock)::mc_update(logic_net_t &net) -{ - net.toggle_new_Q(); - net.update_devs(); -} + ATTR_HOT /* inline */ void NETLIB_NAME(mainclock)::mc_update(logic_net_t &net) + { + net.toggle_new_Q(); + net.update_devs(); + } } //namespace devices diff --git a/src/lib/netlist/nl_base.h b/src/lib/netlist/nl_base.h index 62b5e3748f0..427fa100a22 100644 --- a/src/lib/netlist/nl_base.h +++ b/src/lib/netlist/nl_base.h @@ -236,8 +236,6 @@ class NETLIB_NAME(name) : public device_t #define NETLIB_UPDATE_TERMINALS(chip) ATTR_HOT void NETLIB_NAME(chip) :: update_terminals(void) -#define NETLIB_DEVICE_IMPL(chip) device_creator_ptr_t decl_ ## chip = device_creator_t< NETLIB_NAME(chip) >; - //============================================================ // Asserts //============================================================ @@ -1301,17 +1299,6 @@ protected: plib::dynlib *m_lib; // external lib needs to be loaded as long as netlist exists }; - // ----------------------------------------------------------------------------- - // base_device_creator_t - // ----------------------------------------------------------------------------- - - using device_creator_ptr_t = plib::owned_ptr (*)(netlist_t &anetlist, const pstring &name); - - template - plib::owned_ptr device_creator_t(netlist_t &anetlist, const pstring &name) - { - return plib::owned_ptr::Create(anetlist, name); - } // ----------------------------------------------------------------------------- // inline implementations diff --git a/src/lib/netlist/nl_factory.cpp b/src/lib/netlist/nl_factory.cpp index 7a9a61668bd..ca349e7dd67 100644 --- a/src/lib/netlist/nl_factory.cpp +++ b/src/lib/netlist/nl_factory.cpp @@ -67,12 +67,6 @@ void factory_list_t::error(const pstring &s) m_setup.log().fatal("{1}", s); } -plib::owned_ptr factory_list_t::new_device_by_name(const pstring &devname, netlist_t &anetlist, const pstring &name) -{ - base_factory_t *f = factory_by_name(devname); - return f->Create(anetlist, name); -} - base_factory_t * factory_list_t::factory_by_name(const pstring &devname) { for (auto & e : *this) diff --git a/src/lib/netlist/nl_factory.h b/src/lib/netlist/nl_factory.h index a27728e18ab..d1bd0b6f728 100644 --- a/src/lib/netlist/nl_factory.h +++ b/src/lib/netlist/nl_factory.h @@ -15,6 +15,8 @@ #include "plib/plists.h" #include "nl_base.h" +#define NETLIB_DEVICE_IMPL(chip) factory_creator_ptr_t decl_ ## chip = factory_creator_t< NETLIB_NAME(chip) >; + namespace netlist { @@ -47,7 +49,7 @@ namespace netlist pstring m_def_param; /* default parameter */ }; - template + template class factory_t : public base_factory_t { P_PREVENT_COPYING(factory_t) @@ -58,27 +60,10 @@ namespace netlist plib::owned_ptr Create(netlist_t &anetlist, const pstring &name) override { - return plib::owned_ptr::Create(anetlist, name); + return plib::owned_ptr::Create(anetlist, name); } }; - class factoryx_t : public base_factory_t - { - P_PREVENT_COPYING(factoryx_t) - public: - factoryx_t(const pstring &name, const pstring &classname, - const pstring &def_param, device_creator_ptr_t ptr) - : base_factory_t(name, classname, def_param) - , m_ptr(ptr) { } - - plib::owned_ptr Create(netlist_t &anetlist, const pstring &name) override - { - return m_ptr(anetlist, name); - } - private: - device_creator_ptr_t m_ptr; - }; - class factory_list_t : public plib::pvector_t> { public: @@ -100,15 +85,6 @@ namespace netlist push_back(std::move(factory)); } - void register_device(const pstring &name, const pstring &classname, - const pstring &def_param, device_creator_ptr_t ptr) - { - register_device(plib::owned_ptr::Create(name, classname, def_param, ptr)); - } - - //ATTR_COLD device_t *new_device_by_classname(const pstring &classname) const; - // FIXME: legacy, should use factory_by_name - plib::owned_ptr new_device_by_name(const pstring &devname, netlist_t &anetlist, const pstring &name); base_factory_t * factory_by_name(const pstring &devname); template @@ -123,6 +99,20 @@ namespace netlist setup_t &m_setup; }; + // ----------------------------------------------------------------------------- + // factory_creator_ptr_t + // ----------------------------------------------------------------------------- + + using factory_creator_ptr_t = plib::owned_ptr (*)(const pstring &name, const pstring &classname, + const pstring &def_param); + + template + plib::owned_ptr factory_creator_t(const pstring &name, const pstring &classname, + const pstring &def_param) + { + return plib::owned_ptr::Create>(name, classname, def_param); + } + } #endif /* NLFACTORY_H_ */ diff --git a/src/lib/netlist/nl_setup.cpp b/src/lib/netlist/nl_setup.cpp index 14d435e6b1a..8fda3d2f8f4 100644 --- a/src/lib/netlist/nl_setup.cpp +++ b/src/lib/netlist/nl_setup.cpp @@ -853,7 +853,7 @@ void setup_t::start_devices() for (pstring ll : loglist) { pstring name = "log_" + ll; - auto nc = factory().new_device_by_name("LOG", netlist(), name); + auto nc = factory().factory_by_name("LOG")->Create(netlist(), name); register_link(name + ".I", ll); log().debug(" dynamic link {1}: <{2}>\n",ll, name); register_dev_s(std::move(nc)); From a52a795004b430325a5f764ff9e4449fff9a42ec Mon Sep 17 00:00:00 2001 From: couriersud Date: Sun, 29 May 2016 19:30:05 +0200 Subject: [PATCH 14/44] Added constructors to prepare to move terminal setup into constructor. (nw) --- src/lib/netlist/nl_base.cpp | 16 ++++++++++++++-- src/lib/netlist/nl_base.h | 2 ++ src/lib/netlist/nl_factory.cpp | 17 ----------------- 3 files changed, 16 insertions(+), 19 deletions(-) diff --git a/src/lib/netlist/nl_base.cpp b/src/lib/netlist/nl_base.cpp index c4ce27a71e4..883c5b081dd 100644 --- a/src/lib/netlist/nl_base.cpp +++ b/src/lib/netlist/nl_base.cpp @@ -199,6 +199,19 @@ ATTR_COLD device_object_t::device_object_t(const type_t atype) { } +ATTR_COLD device_object_t::device_object_t(core_device_t &dev, const type_t atype) +: object_t(dev.netlist(), atype) +, m_device(dev) +{ +} + +ATTR_COLD device_object_t::device_object_t(core_device_t &dev, const pstring &aname, const type_t atype) +: object_t(dev.netlist(), aname, atype) +, m_device(dev) +{ +} + + ATTR_COLD void device_object_t::init_object(core_device_t &dev, const pstring &aname) { @@ -1036,10 +1049,9 @@ ATTR_COLD void analog_output_t::initial(const nl_double val) // ---------------------------------------------------------------------------------------- ATTR_COLD param_t::param_t(const param_type_t atype, device_t &device, const pstring &name) - : device_object_t(PARAM) + : device_object_t(device, name, PARAM) , m_param_type(atype) { - init_object(device, name); } ATTR_COLD const pstring param_model_t::model_type() diff --git a/src/lib/netlist/nl_base.h b/src/lib/netlist/nl_base.h index 427fa100a22..782c950079c 100644 --- a/src/lib/netlist/nl_base.h +++ b/src/lib/netlist/nl_base.h @@ -411,6 +411,8 @@ namespace netlist P_PREVENT_COPYING(device_object_t) public: ATTR_COLD device_object_t(const type_t atype); + ATTR_COLD device_object_t(core_device_t &dev, const type_t atype); + ATTR_COLD device_object_t(core_device_t &dev, const pstring &aname, const type_t atype); ATTR_COLD void init_object(core_device_t &dev, const pstring &aname); diff --git a/src/lib/netlist/nl_factory.cpp b/src/lib/netlist/nl_factory.cpp index ca349e7dd67..545e2c3a601 100644 --- a/src/lib/netlist/nl_factory.cpp +++ b/src/lib/netlist/nl_factory.cpp @@ -45,23 +45,6 @@ factory_list_t::~factory_list_t() clear(); } -#if 0 -device_t *factory_list_t::new_device_by_classname(const pstring &classname) const -{ - for (std::size_t i=0; i < m_list.size(); i++) - { - base_factory_t *p = m_list[i]; - if (p->classname() == classname) - { - device_t *ret = p->Create(); - return ret; - } - p++; - } - return nullptr; // appease code analysis -} -#endif - void factory_list_t::error(const pstring &s) { m_setup.log().fatal("{1}", s); From 238b68f1cdb720e75a77d96f7ac933a0a56acf68 Mon Sep 17 00:00:00 2001 From: couriersud Date: Mon, 30 May 2016 00:53:33 +0200 Subject: [PATCH 15/44] Reworked twoterm setup. Fixed some timebombs along the way. (nw) --- src/lib/netlist/analog/nld_bjt.h | 50 ++++++++++---------- src/lib/netlist/analog/nld_fourterm.h | 22 ++++----- src/lib/netlist/analog/nld_twoterm.cpp | 16 +++++-- src/lib/netlist/analog/nld_twoterm.h | 61 ++++++++++++++++++++----- src/lib/netlist/devices/nld_4066.cpp | 1 + src/lib/netlist/devices/nld_mm5837.cpp | 4 +- src/lib/netlist/devices/nld_r2r_dac.cpp | 4 +- src/lib/netlist/devices/nlid_cmos.h | 1 - src/lib/netlist/devices/nlid_system.h | 25 +++++----- src/lib/netlist/nl_base.cpp | 33 ++++++++++++- src/lib/netlist/nl_base.h | 23 +++++++++- src/lib/netlist/nl_setup.cpp | 6 +-- src/lib/netlist/solver/nld_solver.cpp | 1 - 13 files changed, 167 insertions(+), 80 deletions(-) diff --git a/src/lib/netlist/analog/nld_bjt.h b/src/lib/netlist/analog/nld_bjt.h index f61295ab14c..a29dc33abf9 100644 --- a/src/lib/netlist/analog/nld_bjt.h +++ b/src/lib/netlist/analog/nld_bjt.h @@ -99,21 +99,21 @@ private: NETLIB_OBJECT_DERIVED(QBJT_switch, QBJT) { NETLIB_CONSTRUCTOR_DERIVED(QBJT_switch, QBJT) - , m_RB(owner, "m_RB") - , m_RC(owner, "m_RC") - , m_BC_dummy(owner, "m_BC") + , m_RB(*this, "m_RB") + , m_RC(*this, "m_RC") + , m_BC_dummy(*this, "m_BC") , m_gB(NETLIST_GMIN_DEFAULT) , m_gC(NETLIST_GMIN_DEFAULT) , m_V(0.0) , m_state_on(0) { - enregister("B", m_RB.m_P); - enregister("E", m_RB.m_N); - enregister("C", m_RC.m_P); - enregister("_E1", m_RC.m_N); + register_term("B", m_RB.m_P); + register_term("E", m_RB.m_N); + register_term("C", m_RC.m_P); + register_term("_E1", m_RC.m_N); - enregister("_B1", m_BC_dummy.m_P); - enregister("_C1", m_BC_dummy.m_N); + register_term("_B1", m_BC_dummy.m_P); + register_term("_C1", m_BC_dummy.m_N); connect_late(m_RB.m_N, m_RC.m_N); @@ -128,12 +128,12 @@ NETLIB_OBJECT_DERIVED(QBJT_switch, QBJT) NETLIB_UPDATE_PARAMI(); NETLIB_UPDATE_TERMINALSI(); - nld_twoterm m_RB; - nld_twoterm m_RC; + nld_twotermx m_RB; + nld_twotermx m_RC; // FIXME: this is needed so we have all terminals belong to one net list - nld_twoterm m_BC_dummy; + nld_twotermx m_BC_dummy; protected: @@ -155,20 +155,20 @@ NETLIB_OBJECT_DERIVED(QBJT_EB, QBJT) { public: NETLIB_CONSTRUCTOR_DERIVED(QBJT_EB, QBJT) - , m_D_CB(owner, "m_D_CB") - , m_D_EB(owner, "m_D_EB") - , m_D_EC(owner, "m_D_EC") + , m_D_CB(*this, "m_D_CB") + , m_D_EB(*this, "m_D_EB") + , m_D_EC(*this, "m_D_EC") , m_alpha_f(0) , m_alpha_r(0) { - enregister("E", m_D_EB.m_P); // Cathode - enregister("B", m_D_EB.m_N); // Anode + register_term("E", m_D_EB.m_P); // Cathode + register_term("B", m_D_EB.m_N); // Anode - enregister("C", m_D_CB.m_P); // Cathode - enregister("_B1", m_D_CB.m_N); // Anode + register_term("C", m_D_CB.m_P); // Cathode + register_term("_B1", m_D_CB.m_N); // Anode - enregister("_E1", m_D_EC.m_P); - enregister("_C1", m_D_EC.m_N); + register_term("_E1", m_D_EC.m_P); + register_term("_C1", m_D_EC.m_N); connect_late(m_D_EB.m_P, m_D_EC.m_P); connect_late(m_D_EB.m_N, m_D_CB.m_N); @@ -188,14 +188,14 @@ protected: generic_diode m_gD_BC; generic_diode m_gD_BE; - nld_twoterm m_D_CB; // gcc, gce - gcc, gec - gcc, gcc - gce | Ic - nld_twoterm m_D_EB; // gee, gec - gee, gce - gee, gee - gec | Ie - nld_twoterm m_D_EC; // 0, -gec, -gcc, 0 | 0 +private: + nld_twotermx m_D_CB; // gcc, gce - gcc, gec - gcc, gcc - gce | Ic + nld_twotermx m_D_EB; // gee, gec - gee, gce - gee, gee - gec | Ie + nld_twotermx m_D_EC; // 0, -gec, -gcc, 0 | 0 nl_double m_alpha_f; nl_double m_alpha_r; -private: }; } //namespace devices diff --git a/src/lib/netlist/analog/nld_fourterm.h b/src/lib/netlist/analog/nld_fourterm.h index 7b9a86b405b..d87f4ab045d 100644 --- a/src/lib/netlist/analog/nld_fourterm.h +++ b/src/lib/netlist/analog/nld_fourterm.h @@ -60,17 +60,14 @@ public: NETLIB_CONSTRUCTOR(VCCS) , m_G(*this, "G", 1.0) , m_RI(*this, "RI", NL_FCONST(1.0) / netlist().gmin()) + , m_OP(*this, "OP") + , m_ON(*this, "ON") + , m_IP(*this, "IP") + , m_IN(*this, "IN") + , m_OP1(*this, "_OP1") + , m_ON1(*this, "_ON1") , m_gfac(1.0) { - - enregister("IP", m_IP); - enregister("IN", m_IN); - enregister("OP", m_OP); - enregister("ON", m_ON); - - enregister("_OP1", m_OP1); - enregister("_ON1", m_ON1); - m_IP.m_otherterm = &m_IN; // <= this should be NULL and terminal be filtered out prior to solving... m_IN.m_otherterm = &m_IP; // <= this should be NULL and terminal be filtered out prior to solving... @@ -205,12 +202,11 @@ NETLIB_OBJECT_DERIVED(VCVS, VCCS) { public: NETLIB_CONSTRUCTOR_DERIVED(VCVS, VCCS) - , m_RO(*this, "RO",1.0) + , m_RO(*this, "RO", 1.0) + , m_OP2(*this, "_OP2") + , m_ON2(*this, "_ON2") { - enregister("_OP2", m_OP2); - enregister("_ON2", m_ON2); - m_OP2.m_otherterm = &m_ON2; m_ON2.m_otherterm = &m_OP2; diff --git a/src/lib/netlist/analog/nld_twoterm.cpp b/src/lib/netlist/analog/nld_twoterm.cpp index e6294fda0fb..0a052045117 100644 --- a/src/lib/netlist/analog/nld_twoterm.cpp +++ b/src/lib/netlist/analog/nld_twoterm.cpp @@ -50,13 +50,19 @@ ATTR_COLD void generic_diode::save(pstring name, object_t &parent) // ---------------------------------------------------------------------------------------- // nld_twoterm // ---------------------------------------------------------------------------------------- - +#if 1 NETLIB_UPDATE(twoterm) { - /* FIXME: some proxies created seem to be disconnected again - * or not even properly connected. - * Example: pong proxy_da_c9c.Q_1.RV - */ + /* only called if connected to a rail net ==> notify the solver to recalculate */ + /* we only need to call the non-rail terminal */ + if (m_P.has_net() && !m_P.net().isRailNet()) + m_P.schedule_solve(); + else if (m_N.has_net() && !m_N.net().isRailNet()) + m_N.schedule_solve(); +} +#endif +NETLIB_UPDATE(twotermx) +{ /* only called if connected to a rail net ==> notify the solver to recalculate */ /* we only need to call the non-rail terminal */ if (m_P.has_net() && !m_P.net().isRailNet()) diff --git a/src/lib/netlist/analog/nld_twoterm.h b/src/lib/netlist/analog/nld_twoterm.h index fed385fcedb..439476a29ca 100644 --- a/src/lib/netlist/analog/nld_twoterm.h +++ b/src/lib/netlist/analog/nld_twoterm.h @@ -102,11 +102,50 @@ namespace netlist // ----------------------------------------------------------------------------- // nld_twoterm // ----------------------------------------------------------------------------- - +#if 1 NETLIB_OBJECT(twoterm) { -public: NETLIB_CONSTRUCTOR(twoterm) + , m_P(*this, "1") + , m_N(*this, "2") + { + m_P.m_otherterm = &m_N; + m_N.m_otherterm = &m_P; + } + + terminal_t m_P; + terminal_t m_N; + + NETLIB_UPDATE_TERMINALSI() { } + NETLIB_RESETI() { } + NETLIB_UPDATEI(); + +public: + ATTR_HOT /* inline */ void set(const nl_double G, const nl_double V, const nl_double I) + { + /* GO, GT, I */ + m_P.set( G, G, ( V) * G - I); + m_N.set( G, G, ( -V) * G + I); + } + + ATTR_HOT /* inline */ nl_double deltaV() const + { + return m_P.net().as_analog().Q_Analog() - m_N.net().as_analog().Q_Analog(); + } + + ATTR_HOT void set_mat(nl_double a11, nl_double a12, nl_double a21, nl_double a22, nl_double r1, nl_double r2) + { + /* GO, GT, I */ + m_P.set(-a12, a11, -r1); + m_N.set(-a21, a22, -r2); + } + +private: +}; +#endif +NETLIB_OBJECT(twotermx) +{ + NETLIB_CONSTRUCTOR(twotermx) { m_P.m_otherterm = &m_N; m_N.m_otherterm = &m_P; @@ -150,8 +189,6 @@ NETLIB_OBJECT_DERIVED(R_base, twoterm) { NETLIB_CONSTRUCTOR_DERIVED(R_base, twoterm) { - enregister("1", m_P); - enregister("2", m_N); } public: @@ -272,8 +309,8 @@ public: , m_C(*this, "C", 1e-6) , m_GParallel(0.0) { - enregister("1", m_P); - enregister("2", m_N); + //register_term("1", m_P); + //register_term("2", m_N); } NETLIB_TIMESTEP() @@ -380,8 +417,8 @@ public: NETLIB_CONSTRUCTOR_DERIVED(D, twoterm) , m_model(*this, "MODEL", "") { - enregister("A", m_P); - enregister("K", m_N); + register_subalias("A", m_P); + register_subalias("K", m_N); m_D.save("m_D", *this); } @@ -415,8 +452,8 @@ public: , m_V(*this, "V", 0.0) { - enregister("P", m_P); - enregister("N", m_N); + register_subalias("P", m_P); + register_subalias("N", m_N); } protected: @@ -437,8 +474,8 @@ public: NETLIB_CONSTRUCTOR_DERIVED(CS, twoterm) , m_I(*this, "I", 1.0) { - enregister("P", m_P); - enregister("N", m_N); + register_subalias("P", m_P); + register_subalias("N", m_N); } NETLIB_UPDATEI(); diff --git a/src/lib/netlist/devices/nld_4066.cpp b/src/lib/netlist/devices/nld_4066.cpp index 788704b617e..5aef076cf59 100644 --- a/src/lib/netlist/devices/nld_4066.cpp +++ b/src/lib/netlist/devices/nld_4066.cpp @@ -6,6 +6,7 @@ */ #include +#include "analog/nld_twoterm.h" #include "nld_4066.h" namespace netlist diff --git a/src/lib/netlist/devices/nld_mm5837.cpp b/src/lib/netlist/devices/nld_mm5837.cpp index 54d66dd17bb..7d212bf744a 100644 --- a/src/lib/netlist/devices/nld_mm5837.cpp +++ b/src/lib/netlist/devices/nld_mm5837.cpp @@ -30,8 +30,8 @@ namespace netlist connect_late(m_feedback, m_Q); /* output */ - enregister("_RV1", m_RV.m_P); - enregister("_RV2", m_RV.m_N); + //register_term("_RV1", m_RV.m_P); + //register_term("_RV2", m_RV.m_N); enregister("_Q", m_V0); connect_late(m_RV.m_N, m_V0); diff --git a/src/lib/netlist/devices/nld_r2r_dac.cpp b/src/lib/netlist/devices/nld_r2r_dac.cpp index eb95058fa69..89d4a6d2eb7 100644 --- a/src/lib/netlist/devices/nld_r2r_dac.cpp +++ b/src/lib/netlist/devices/nld_r2r_dac.cpp @@ -21,8 +21,8 @@ namespace netlist , m_num(*this, "N", 1) , m_val(*this, "VAL", 1) { - enregister("VOUT", m_P); - enregister("VGND", m_N); + register_term("VOUT", m_P); + register_term("VGND", m_N); } NETLIB_UPDATE_PARAMI(); diff --git a/src/lib/netlist/devices/nlid_cmos.h b/src/lib/netlist/devices/nlid_cmos.h index 22dc7beb01d..c58f7ab410c 100644 --- a/src/lib/netlist/devices/nlid_cmos.h +++ b/src/lib/netlist/devices/nlid_cmos.h @@ -9,7 +9,6 @@ #define NLID_CMOS_H_ #include "nl_base.h" -#include "analog/nld_twoterm.h" namespace netlist { diff --git a/src/lib/netlist/devices/nlid_system.h b/src/lib/netlist/devices/nlid_system.h index 18a1a926fef..e79b04769e5 100644 --- a/src/lib/netlist/devices/nlid_system.h +++ b/src/lib/netlist/devices/nlid_system.h @@ -260,20 +260,20 @@ namespace netlist { public: NETLIB_CONSTRUCTOR_DERIVED(frontier, base_dummy) - , m_RIN(netlist(), "m_RIN") - , m_ROUT(netlist(), "m_ROUT") + , m_RIN(*this, "m_RIN") + , m_ROUT(*this, "m_ROUT") , m_p_RIN(*this, "RIN", 1.0e6) , m_p_ROUT(*this, "ROUT", 50.0) { enregister("_I", m_I); - enregister("I",m_RIN.m_P); - enregister("G",m_RIN.m_N); + register_subalias("I", m_RIN.m_P); + register_subalias("G", m_RIN.m_N); connect_late(m_I, m_RIN.m_P); enregister("_Q", m_Q); - enregister("_OP",m_ROUT.m_P); - enregister("Q",m_ROUT.m_N); + register_term("_OP", m_ROUT.m_P); + register_term("Q", m_ROUT.m_N); connect_late(m_Q, m_ROUT.m_P); } @@ -290,7 +290,8 @@ namespace netlist private: NETLIB_NAME(twoterm) m_RIN; - NETLIB_NAME(twoterm) m_ROUT; + /* Fixme: only works if the device is timestepped */ + NETLIB_NAME(twotermx) m_ROUT; analog_input_t m_I; analog_output_t m_Q; @@ -523,13 +524,13 @@ namespace netlist , m_is_timestep(false) { //register_sub(m_RV); - enregister("1", m_RV.m_P); - enregister("2", m_RV.m_N); + //register_term("1", m_RV.m_P); + //register_term("2", m_RV.m_N); - enregister("_Q", m_Q); + enregister("_Q", m_GNDHack); register_subalias("Q", m_RV.m_P); - connect_late(m_RV.m_N, m_Q); + connect_late(m_RV.m_N, m_GNDHack); save(NLNAME(m_last_state)); } @@ -542,7 +543,7 @@ namespace netlist NETLIB_UPDATEI(); private: - analog_output_t m_Q; + analog_output_t m_GNDHack; // FIXME: LOng term, we need to connect proxy gnd to device gnd NETLIB_SUB(twoterm) m_RV; int m_last_state; bool m_is_timestep; diff --git a/src/lib/netlist/nl_base.cpp b/src/lib/netlist/nl_base.cpp index 883c5b081dd..19966289b60 100644 --- a/src/lib/netlist/nl_base.cpp +++ b/src/lib/netlist/nl_base.cpp @@ -169,6 +169,7 @@ ATTR_COLD object_t::object_t(netlist_t &nl, const pstring &aname, const type_t a , m_objtype(atype) , m_netlist(&nl) { + save_register(); } ATTR_COLD object_t::~object_t() @@ -201,13 +202,13 @@ ATTR_COLD device_object_t::device_object_t(const type_t atype) ATTR_COLD device_object_t::device_object_t(core_device_t &dev, const type_t atype) : object_t(dev.netlist(), atype) -, m_device(dev) +, m_device(&dev) { } ATTR_COLD device_object_t::device_object_t(core_device_t &dev, const pstring &aname, const type_t atype) : object_t(dev.netlist(), aname, atype) -, m_device(dev) +, m_device(&dev) { } @@ -919,6 +920,22 @@ ATTR_COLD core_terminal_t::core_terminal_t(const type_t atype) { } +ATTR_COLD core_terminal_t::core_terminal_t(core_device_t &dev, const type_t atype) +: device_object_t(dev, atype) +, plinkedlist_element_t() +, m_net(nullptr) +, m_state(STATE_NONEX) +{ +} + +ATTR_COLD core_terminal_t::core_terminal_t(core_device_t &dev, const pstring &aname, const type_t atype) +: device_object_t(dev, dev.name() + "." + aname, atype) +, plinkedlist_element_t() +, m_net(nullptr) +, m_state(STATE_NONEX) +{ +} + ATTR_COLD void core_terminal_t::set_net(net_t::ptr_t anet) { m_net = anet; @@ -934,6 +951,7 @@ ATTR_COLD void core_terminal_t::clear_net() // terminal_t // ---------------------------------------------------------------------------------------- +#if 1 ATTR_COLD terminal_t::terminal_t() : analog_t(TERMINAL) , m_otherterm(nullptr) @@ -942,6 +960,17 @@ ATTR_COLD terminal_t::terminal_t() , m_gt1(nullptr) { } +#endif + +ATTR_COLD terminal_t::terminal_t(core_device_t &dev, const pstring &aname) +: analog_t(dev, aname, TERMINAL) +, m_otherterm(nullptr) +, m_Idr1(nullptr) +, m_go1(nullptr) +, m_gt1(nullptr) +{ + netlist().setup().register_object(dynamic_cast(dev), aname, *this); +} ATTR_HOT void terminal_t::schedule_solve() diff --git a/src/lib/netlist/nl_base.h b/src/lib/netlist/nl_base.h index 782c950079c..e10dc8ac0ac 100644 --- a/src/lib/netlist/nl_base.h +++ b/src/lib/netlist/nl_base.h @@ -416,6 +416,11 @@ namespace netlist ATTR_COLD void init_object(core_device_t &dev, const pstring &aname); + ATTR_COLD void set_device(core_device_t &dev) + { + m_device = &dev; + } + ATTR_HOT core_device_t &device() const { return *m_device; } private: core_device_t * m_device; @@ -446,6 +451,8 @@ namespace netlist ATTR_COLD core_terminal_t(const type_t atype); + ATTR_COLD core_terminal_t(core_device_t &dev, const type_t atype); + ATTR_COLD core_terminal_t(core_device_t &dev, const pstring &aname, const type_t atype); ATTR_COLD void set_net(net_t *anet); ATTR_COLD void clear_net(); @@ -487,7 +494,17 @@ namespace netlist ATTR_COLD analog_t(const type_t atype) - : core_terminal_t(atype) + : core_terminal_t(atype) + { + } + + ATTR_COLD analog_t(core_device_t &dev, const type_t atype) + : core_terminal_t(dev, atype) + { + } + + ATTR_COLD analog_t(core_device_t &dev, const pstring &aname, const type_t atype) + : core_terminal_t(dev, aname, atype) { } @@ -514,7 +531,9 @@ namespace netlist using list_t = plib::pvector_t; + // FIXME: Remove default again ATTR_COLD terminal_t(); + ATTR_COLD terminal_t(core_device_t &dev, const pstring &aname); terminal_t *m_otherterm; @@ -1109,7 +1128,7 @@ namespace netlist ATTR_COLD void register_subalias(const pstring &name, core_terminal_t &term); ATTR_COLD void register_subalias(const pstring &name, const pstring &aliased); - ATTR_COLD void enregister(const pstring &name, terminal_t &port) { register_p(name, port); } + ATTR_COLD void register_term(const pstring &name, terminal_t &port) { register_p(name, port); } ATTR_COLD void enregister(const pstring &name, analog_output_t &out) { register_p(name, out); }; ATTR_COLD void enregister(const pstring &name, logic_output_t &out) { register_p(name, out); }; ATTR_COLD void enregister(const pstring &name, analog_input_t &in) { register_p(name, in); }; diff --git a/src/lib/netlist/nl_setup.cpp b/src/lib/netlist/nl_setup.cpp index 8fda3d2f8f4..1d0b2ab2787 100644 --- a/src/lib/netlist/nl_setup.cpp +++ b/src/lib/netlist/nl_setup.cpp @@ -279,13 +279,13 @@ void setup_t::register_object(device_t &dev, const pstring &name, object_t &obj) } else { - term.init_object(dev, dev.name() + "." + name); + if (!term.isInitialized()) + term.init_object(dev, dev.name() + "." + name); dev.m_terminals.push_back(obj.name()); } - if (!m_terminals.add(term.name(), &term)) log().fatal("Error adding {1} {2} to terminal list\n", objtype_as_astr(term), term.name()); - log().debug("{1} {2}\n", objtype_as_astr(term), name); + log().debug("{1} {2}\n", objtype_as_astr(term), term.name()); } break; case terminal_t::NET: diff --git a/src/lib/netlist/solver/nld_solver.cpp b/src/lib/netlist/solver/nld_solver.cpp index 7d16bcbefc2..8a639db596a 100644 --- a/src/lib/netlist/solver/nld_solver.cpp +++ b/src/lib/netlist/solver/nld_solver.cpp @@ -31,7 +31,6 @@ #include #include -//#include "nld_twoterm.h" #include "nl_lists.h" #if HAS_OPENMP From 20051db48f2505c091a91e9f8f06b1ba020d013c Mon Sep 17 00:00:00 2001 From: couriersud Date: Mon, 30 May 2016 01:36:37 +0200 Subject: [PATCH 16/44] More rework on nld_twoterm. (nw) --- src/lib/netlist/analog/nld_bjt.h | 48 +++++++++++----------- src/lib/netlist/analog/nld_twoterm.cpp | 12 +----- src/lib/netlist/analog/nld_twoterm.h | 55 ++++++-------------------- src/lib/netlist/devices/nlid_system.h | 10 ++--- 4 files changed, 42 insertions(+), 83 deletions(-) diff --git a/src/lib/netlist/analog/nld_bjt.h b/src/lib/netlist/analog/nld_bjt.h index a29dc33abf9..e8b80b94b4c 100644 --- a/src/lib/netlist/analog/nld_bjt.h +++ b/src/lib/netlist/analog/nld_bjt.h @@ -99,21 +99,21 @@ private: NETLIB_OBJECT_DERIVED(QBJT_switch, QBJT) { NETLIB_CONSTRUCTOR_DERIVED(QBJT_switch, QBJT) - , m_RB(*this, "m_RB") - , m_RC(*this, "m_RC") - , m_BC_dummy(*this, "m_BC") + , m_RB(*this, "m_RB", true) + , m_RC(*this, "m_RC", true) + , m_BC_dummy(*this, "m_BC", true) , m_gB(NETLIST_GMIN_DEFAULT) , m_gC(NETLIST_GMIN_DEFAULT) , m_V(0.0) , m_state_on(0) { - register_term("B", m_RB.m_P); - register_term("E", m_RB.m_N); - register_term("C", m_RC.m_P); - register_term("_E1", m_RC.m_N); + register_subalias("B", m_RB.m_P); + register_subalias("E", m_RB.m_N); + register_subalias("C", m_RC.m_P); + //register_term("_E1", m_RC.m_N); - register_term("_B1", m_BC_dummy.m_P); - register_term("_C1", m_BC_dummy.m_N); + //register_term("_B1", m_BC_dummy.m_P); + //register_term("_C1", m_BC_dummy.m_N); connect_late(m_RB.m_N, m_RC.m_N); @@ -128,12 +128,12 @@ NETLIB_OBJECT_DERIVED(QBJT_switch, QBJT) NETLIB_UPDATE_PARAMI(); NETLIB_UPDATE_TERMINALSI(); - nld_twotermx m_RB; - nld_twotermx m_RC; + nld_twoterm m_RB; + nld_twoterm m_RC; // FIXME: this is needed so we have all terminals belong to one net list - nld_twotermx m_BC_dummy; + nld_twoterm m_BC_dummy; protected: @@ -155,20 +155,20 @@ NETLIB_OBJECT_DERIVED(QBJT_EB, QBJT) { public: NETLIB_CONSTRUCTOR_DERIVED(QBJT_EB, QBJT) - , m_D_CB(*this, "m_D_CB") - , m_D_EB(*this, "m_D_EB") - , m_D_EC(*this, "m_D_EC") + , m_D_CB(*this, "m_D_CB", true) + , m_D_EB(*this, "m_D_EB", true) + , m_D_EC(*this, "m_D_EC", true) , m_alpha_f(0) , m_alpha_r(0) { - register_term("E", m_D_EB.m_P); // Cathode - register_term("B", m_D_EB.m_N); // Anode + register_subalias("E", m_D_EB.m_P); // Cathode + register_subalias("B", m_D_EB.m_N); // Anode - register_term("C", m_D_CB.m_P); // Cathode - register_term("_B1", m_D_CB.m_N); // Anode + register_subalias("C", m_D_CB.m_P); // Cathode + //register_term("_B1", m_D_CB.m_N); // Anode - register_term("_E1", m_D_EC.m_P); - register_term("_C1", m_D_EC.m_N); + //register_term("_E1", m_D_EC.m_P); + //register_term("_C1", m_D_EC.m_N); connect_late(m_D_EB.m_P, m_D_EC.m_P); connect_late(m_D_EB.m_N, m_D_CB.m_N); @@ -189,9 +189,9 @@ protected: generic_diode m_gD_BE; private: - nld_twotermx m_D_CB; // gcc, gce - gcc, gec - gcc, gcc - gce | Ic - nld_twotermx m_D_EB; // gee, gec - gee, gce - gee, gee - gec | Ie - nld_twotermx m_D_EC; // 0, -gec, -gcc, 0 | 0 + nld_twoterm m_D_CB; // gcc, gce - gcc, gec - gcc, gcc - gce | Ic + nld_twoterm m_D_EB; // gee, gec - gee, gce - gee, gee - gec | Ie + nld_twoterm m_D_EC; // 0, -gec, -gcc, 0 | 0 nl_double m_alpha_f; nl_double m_alpha_r; diff --git a/src/lib/netlist/analog/nld_twoterm.cpp b/src/lib/netlist/analog/nld_twoterm.cpp index 0a052045117..def0730b5aa 100644 --- a/src/lib/netlist/analog/nld_twoterm.cpp +++ b/src/lib/netlist/analog/nld_twoterm.cpp @@ -50,7 +50,7 @@ ATTR_COLD void generic_diode::save(pstring name, object_t &parent) // ---------------------------------------------------------------------------------------- // nld_twoterm // ---------------------------------------------------------------------------------------- -#if 1 + NETLIB_UPDATE(twoterm) { /* only called if connected to a rail net ==> notify the solver to recalculate */ @@ -60,16 +60,6 @@ NETLIB_UPDATE(twoterm) else if (m_N.has_net() && !m_N.net().isRailNet()) m_N.schedule_solve(); } -#endif -NETLIB_UPDATE(twotermx) -{ - /* only called if connected to a rail net ==> notify the solver to recalculate */ - /* we only need to call the non-rail terminal */ - if (m_P.has_net() && !m_P.net().isRailNet()) - m_P.schedule_solve(); - else if (m_N.has_net() && !m_N.net().isRailNet()) - m_N.schedule_solve(); -} // ---------------------------------------------------------------------------------------- // nld_POT diff --git a/src/lib/netlist/analog/nld_twoterm.h b/src/lib/netlist/analog/nld_twoterm.h index 439476a29ca..5eecdb05299 100644 --- a/src/lib/netlist/analog/nld_twoterm.h +++ b/src/lib/netlist/analog/nld_twoterm.h @@ -102,12 +102,12 @@ namespace netlist // ----------------------------------------------------------------------------- // nld_twoterm // ----------------------------------------------------------------------------- -#if 1 + NETLIB_OBJECT(twoterm) { - NETLIB_CONSTRUCTOR(twoterm) - , m_P(*this, "1") - , m_N(*this, "2") + NETLIB_CONSTRUCTOR_EX(twoterm, bool terminals_owned = false) + , m_P(bselect(terminals_owned, owner, *this), (terminals_owned ? name + "." : "") + "1") + , m_N(bselect(terminals_owned, owner, *this), (terminals_owned ? name + "." : "") + "2") { m_P.m_otherterm = &m_N; m_N.m_otherterm = &m_P; @@ -116,8 +116,8 @@ NETLIB_OBJECT(twoterm) terminal_t m_P; terminal_t m_N; - NETLIB_UPDATE_TERMINALSI() { } - NETLIB_RESETI() { } + //NETLIB_UPDATE_TERMINALSI() { } + //NETLIB_RESETI() { } NETLIB_UPDATEI(); public: @@ -141,45 +141,14 @@ public: } private: + template + static core_device_t &bselect(bool b, C &d1, core_device_t &d2) + { + core_device_t *h = dynamic_cast(&d1); + return b ? *h : d2; + } }; -#endif -NETLIB_OBJECT(twotermx) -{ - NETLIB_CONSTRUCTOR(twotermx) - { - m_P.m_otherterm = &m_N; - m_N.m_otherterm = &m_P; - } - terminal_t m_P; - terminal_t m_N; - - NETLIB_UPDATE_TERMINALSI() { } - NETLIB_RESETI() { } - NETLIB_UPDATEI(); - -public: - ATTR_HOT /* inline */ void set(const nl_double G, const nl_double V, const nl_double I) - { - /* GO, GT, I */ - m_P.set( G, G, ( V) * G - I); - m_N.set( G, G, ( -V) * G + I); - } - - ATTR_HOT /* inline */ nl_double deltaV() const - { - return m_P.net().as_analog().Q_Analog() - m_N.net().as_analog().Q_Analog(); - } - - ATTR_HOT void set_mat(nl_double a11, nl_double a12, nl_double a21, nl_double a22, nl_double r1, nl_double r2) - { - /* GO, GT, I */ - m_P.set(-a12, a11, -r1); - m_N.set(-a21, a22, -r2); - } - -private: -}; // ----------------------------------------------------------------------------- // nld_R diff --git a/src/lib/netlist/devices/nlid_system.h b/src/lib/netlist/devices/nlid_system.h index e79b04769e5..840eea94ced 100644 --- a/src/lib/netlist/devices/nlid_system.h +++ b/src/lib/netlist/devices/nlid_system.h @@ -261,7 +261,7 @@ namespace netlist public: NETLIB_CONSTRUCTOR_DERIVED(frontier, base_dummy) , m_RIN(*this, "m_RIN") - , m_ROUT(*this, "m_ROUT") + , m_ROUT(*this, "m_ROUT", true) , m_p_RIN(*this, "RIN", 1.0e6) , m_p_ROUT(*this, "ROUT", 50.0) @@ -272,8 +272,8 @@ namespace netlist connect_late(m_I, m_RIN.m_P); enregister("_Q", m_Q); - register_term("_OP", m_ROUT.m_P); - register_term("Q", m_ROUT.m_N); + register_subalias("_OP", m_ROUT.m_P); + register_subalias("Q", m_ROUT.m_N); connect_late(m_Q, m_ROUT.m_P); } @@ -290,8 +290,8 @@ namespace netlist private: NETLIB_NAME(twoterm) m_RIN; - /* Fixme: only works if the device is timestepped */ - NETLIB_NAME(twotermx) m_ROUT; + /* Fixme: only works if the device is time-stepped - need to rework */ + NETLIB_NAME(twoterm) m_ROUT; analog_input_t m_I; analog_output_t m_Q; From a99d76c23906cf9c3b9ba66120ad028cd10658af Mon Sep 17 00:00:00 2001 From: couriersud Date: Mon, 30 May 2016 01:46:40 +0200 Subject: [PATCH 17/44] Fix r2r dac. Remove dead code. (nw) --- src/lib/netlist/devices/nld_r2r_dac.cpp | 4 ++-- src/lib/netlist/nl_base.cpp | 11 ----------- src/lib/netlist/nl_base.h | 4 +--- src/lib/netlist/nl_setup.cpp | 2 -- 4 files changed, 3 insertions(+), 18 deletions(-) diff --git a/src/lib/netlist/devices/nld_r2r_dac.cpp b/src/lib/netlist/devices/nld_r2r_dac.cpp index 89d4a6d2eb7..b9ff196f541 100644 --- a/src/lib/netlist/devices/nld_r2r_dac.cpp +++ b/src/lib/netlist/devices/nld_r2r_dac.cpp @@ -21,8 +21,8 @@ namespace netlist , m_num(*this, "N", 1) , m_val(*this, "VAL", 1) { - register_term("VOUT", m_P); - register_term("VGND", m_N); + register_subalias("VOUT", m_P); + register_subalias("VGND", m_N); } NETLIB_UPDATE_PARAMI(); diff --git a/src/lib/netlist/nl_base.cpp b/src/lib/netlist/nl_base.cpp index 19966289b60..c202a58e4b4 100644 --- a/src/lib/netlist/nl_base.cpp +++ b/src/lib/netlist/nl_base.cpp @@ -951,17 +951,6 @@ ATTR_COLD void core_terminal_t::clear_net() // terminal_t // ---------------------------------------------------------------------------------------- -#if 1 -ATTR_COLD terminal_t::terminal_t() -: analog_t(TERMINAL) -, m_otherterm(nullptr) -, m_Idr1(nullptr) -, m_go1(nullptr) -, m_gt1(nullptr) -{ -} -#endif - ATTR_COLD terminal_t::terminal_t(core_device_t &dev, const pstring &aname) : analog_t(dev, aname, TERMINAL) , m_otherterm(nullptr) diff --git a/src/lib/netlist/nl_base.h b/src/lib/netlist/nl_base.h index e10dc8ac0ac..318ca504e0a 100644 --- a/src/lib/netlist/nl_base.h +++ b/src/lib/netlist/nl_base.h @@ -531,8 +531,6 @@ namespace netlist using list_t = plib::pvector_t; - // FIXME: Remove default again - ATTR_COLD terminal_t(); ATTR_COLD terminal_t(core_device_t &dev, const pstring &aname); terminal_t *m_otherterm; @@ -1128,7 +1126,7 @@ namespace netlist ATTR_COLD void register_subalias(const pstring &name, core_terminal_t &term); ATTR_COLD void register_subalias(const pstring &name, const pstring &aliased); - ATTR_COLD void register_term(const pstring &name, terminal_t &port) { register_p(name, port); } + //ATTR_COLD void register_term(const pstring &name, terminal_t &port) { register_p(name, port); } ATTR_COLD void enregister(const pstring &name, analog_output_t &out) { register_p(name, out); }; ATTR_COLD void enregister(const pstring &name, logic_output_t &out) { register_p(name, out); }; ATTR_COLD void enregister(const pstring &name, analog_input_t &in) { register_p(name, in); }; diff --git a/src/lib/netlist/nl_setup.cpp b/src/lib/netlist/nl_setup.cpp index 1d0b2ab2787..3d07a975811 100644 --- a/src/lib/netlist/nl_setup.cpp +++ b/src/lib/netlist/nl_setup.cpp @@ -279,8 +279,6 @@ void setup_t::register_object(device_t &dev, const pstring &name, object_t &obj) } else { - if (!term.isInitialized()) - term.init_object(dev, dev.name() + "." + name); dev.m_terminals.push_back(obj.name()); } if (!m_terminals.add(term.name(), &term)) From f559c0d24377931cb0a9df4c2c8517a15eb2b134 Mon Sep 17 00:00:00 2001 From: couriersud Date: Mon, 30 May 2016 20:45:25 +0200 Subject: [PATCH 18/44] analog_outputs now created in constructor. (nw) --- src/lib/netlist/analog/nld_opamps.h | 7 +++---- src/lib/netlist/devices/nld_mm5837.cpp | 2 +- src/lib/netlist/devices/nld_ne555.cpp | 2 +- src/lib/netlist/devices/nlid_system.h | 10 +++++----- src/lib/netlist/nl_base.cpp | 11 ++++++----- src/lib/netlist/nl_base.h | 6 +++--- src/lib/netlist/nl_setup.cpp | 5 ++++- 7 files changed, 23 insertions(+), 20 deletions(-) diff --git a/src/lib/netlist/analog/nld_opamps.h b/src/lib/netlist/analog/nld_opamps.h index 2faab7f1312..a3d05569427 100644 --- a/src/lib/netlist/analog/nld_opamps.h +++ b/src/lib/netlist/analog/nld_opamps.h @@ -43,6 +43,9 @@ NETLIB_OBJECT(OPAMP) , m_RP(*this, "RP1") , m_G1(*this, "G1") , m_model(*this, "MODEL", "") + , m_VH(*this, "VH") + , m_VL(*this, "VL") + , m_VREF(*this, "VREF") { m_type = m_model.model_value("TYPE"); @@ -50,10 +53,6 @@ NETLIB_OBJECT(OPAMP) enregister("VCC", m_VCC); enregister("GND", m_GND); - enregister("VL", m_VL); - enregister("VH", m_VH); - enregister("VREF", m_VREF); - if (m_type == 1) { register_subalias("PLUS", "G1.IP"); diff --git a/src/lib/netlist/devices/nld_mm5837.cpp b/src/lib/netlist/devices/nld_mm5837.cpp index 7d212bf744a..6c6b41abbdf 100644 --- a/src/lib/netlist/devices/nld_mm5837.cpp +++ b/src/lib/netlist/devices/nld_mm5837.cpp @@ -21,6 +21,7 @@ namespace netlist { NETLIB_CONSTRUCTOR(MM5837_dip) , m_RV(*this, "RV") + , m_V0(*this, "_Q") , m_is_timestep(false) { /* clock */ @@ -32,7 +33,6 @@ namespace netlist /* output */ //register_term("_RV1", m_RV.m_P); //register_term("_RV2", m_RV.m_N); - enregister("_Q", m_V0); connect_late(m_RV.m_N, m_V0); /* device */ diff --git a/src/lib/netlist/devices/nld_ne555.cpp b/src/lib/netlist/devices/nld_ne555.cpp index 7f40497e2de..16a657c3d1d 100644 --- a/src/lib/netlist/devices/nld_ne555.cpp +++ b/src/lib/netlist/devices/nld_ne555.cpp @@ -24,13 +24,13 @@ namespace netlist , m_R2(*this, "R2") , m_R3(*this, "R3") , m_RDIS(*this, "RDIS") + , m_OUT(*this, "OUT") // Pin 3 , m_last_out(false) , m_ff(false) { register_subalias("GND", m_R3.m_N); // Pin 1 enregister("TRIG", m_TRIG); // Pin 2 - enregister("OUT", m_OUT); // Pin 3 enregister("RESET", m_RESET); // Pin 4 register_subalias("CONT", m_R1.m_N); // Pin 5 enregister("THRESH", m_THRES); // Pin 6 diff --git a/src/lib/netlist/devices/nlid_system.h b/src/lib/netlist/devices/nlid_system.h index 840eea94ced..4e355f4b9c6 100644 --- a/src/lib/netlist/devices/nlid_system.h +++ b/src/lib/netlist/devices/nlid_system.h @@ -197,9 +197,9 @@ namespace netlist NETLIB_OBJECT(analog_input) { NETLIB_CONSTRUCTOR(analog_input) + , m_Q(*this, "Q") , m_IN(*this, "IN", 0.0) { - enregister("Q", m_Q); } NETLIB_UPDATE_AFTER_PARAM_CHANGE() @@ -218,8 +218,8 @@ namespace netlist NETLIB_OBJECT(gnd) { NETLIB_CONSTRUCTOR(gnd) + , m_Q(*this, "Q") { - enregister("Q", m_Q); } NETLIB_UPDATEI() { @@ -262,6 +262,7 @@ namespace netlist NETLIB_CONSTRUCTOR_DERIVED(frontier, base_dummy) , m_RIN(*this, "m_RIN") , m_ROUT(*this, "m_ROUT", true) + , m_Q(*this, "_Q") , m_p_RIN(*this, "RIN", 1.0e6) , m_p_ROUT(*this, "ROUT", 50.0) @@ -271,7 +272,6 @@ namespace netlist register_subalias("G", m_RIN.m_N); connect_late(m_I, m_RIN.m_P); - enregister("_Q", m_Q); register_subalias("_OP", m_ROUT.m_P); register_subalias("Q", m_ROUT.m_N); connect_late(m_Q, m_ROUT.m_P); @@ -310,8 +310,8 @@ namespace netlist NETLIB_CONSTRUCTOR(function) , m_N(*this, "N", 2) , m_func(*this, "FUNC", "") + , m_Q(*this, "Q") { - enregister("Q", m_Q); for (int i=0; i < m_N; i++) enregister(plib::pfmt("A{1}")(i), m_I[i]); @@ -519,6 +519,7 @@ namespace netlist public: nld_d_to_a_proxy(netlist_t &anetlist, const pstring &name, logic_output_t *out_proxied) : nld_base_d_to_a_proxy(anetlist, name, out_proxied, m_RV.m_P) + , m_GNDHack(*this, "_Q") , m_RV(*this, "RV") , m_last_state(-1) , m_is_timestep(false) @@ -527,7 +528,6 @@ namespace netlist //register_term("1", m_RV.m_P); //register_term("2", m_RV.m_N); - enregister("_Q", m_GNDHack); register_subalias("Q", m_RV.m_P); connect_late(m_RV.m_N, m_GNDHack); diff --git a/src/lib/netlist/nl_base.cpp b/src/lib/netlist/nl_base.cpp index c202a58e4b4..f5ddf0ea42f 100644 --- a/src/lib/netlist/nl_base.cpp +++ b/src/lib/netlist/nl_base.cpp @@ -169,6 +169,7 @@ ATTR_COLD object_t::object_t(netlist_t &nl, const pstring &aname, const type_t a , m_objtype(atype) , m_netlist(&nl) { + //printf("reg %s\n", this->name().cstr()); save_register(); } @@ -1029,18 +1030,17 @@ ATTR_COLD void logic_output_t::initial(const netlist_sig_t val) // ---------------------------------------------------------------------------------------- ATTR_COLD analog_output_t::analog_output_t(core_device_t &dev, const pstring &aname) - : analog_t(OUTPUT), m_proxied_net(nullptr) + : analog_t(dev, aname, OUTPUT), m_proxied_net(nullptr) { this->set_net(&m_my_net); set_state(STATE_OUT); - //net().m_cur_Analog = NL_FCONST(0.99); net().m_cur_Analog = NL_FCONST(0.0); - - analog_t::init_object(dev, aname); - net().init_object(dev.netlist(), aname + ".net", this); + net().init_object(dev.netlist(), name() + ".net", this); + netlist().setup().register_object(dynamic_cast(dev), aname, *this); } +#if 0 ATTR_COLD analog_output_t::analog_output_t() : analog_t(OUTPUT), m_proxied_net(nullptr) { @@ -1050,6 +1050,7 @@ ATTR_COLD analog_output_t::analog_output_t() //net().m_cur_Analog = NL_FCONST(0.99); net().m_cur_Analog = NL_FCONST(0.0); } +#endif ATTR_COLD void analog_output_t::init_object(core_device_t &dev, const pstring &aname) { diff --git a/src/lib/netlist/nl_base.h b/src/lib/netlist/nl_base.h index 318ca504e0a..03c66929745 100644 --- a/src/lib/netlist/nl_base.h +++ b/src/lib/netlist/nl_base.h @@ -886,11 +886,11 @@ namespace netlist class analog_output_t : public analog_t { - P_PREVENT_COPYING(analog_output_t) + //P_PREVENT_COPYING(analog_output_t) public: ATTR_COLD analog_output_t(core_device_t &dev, const pstring &aname); - ATTR_COLD analog_output_t(); + //ATTR_COLD analog_output_t(); ATTR_COLD void init_object(core_device_t &dev, const pstring &aname); virtual void reset() override @@ -1127,7 +1127,7 @@ namespace netlist ATTR_COLD void register_subalias(const pstring &name, core_terminal_t &term); ATTR_COLD void register_subalias(const pstring &name, const pstring &aliased); //ATTR_COLD void register_term(const pstring &name, terminal_t &port) { register_p(name, port); } - ATTR_COLD void enregister(const pstring &name, analog_output_t &out) { register_p(name, out); }; + //ATTR_COLD void enregister(const pstring &name, analog_output_t &out) { register_p(name, out); }; ATTR_COLD void enregister(const pstring &name, logic_output_t &out) { register_p(name, out); }; ATTR_COLD void enregister(const pstring &name, analog_input_t &in) { register_p(name, in); }; ATTR_COLD void enregister(const pstring &name, logic_input_t &in) { register_p(name, in); }; diff --git a/src/lib/netlist/nl_setup.cpp b/src/lib/netlist/nl_setup.cpp index 3d07a975811..3fe8ca3881a 100644 --- a/src/lib/netlist/nl_setup.cpp +++ b/src/lib/netlist/nl_setup.cpp @@ -263,7 +263,10 @@ void setup_t::register_object(device_t &dev, const pstring &name, object_t &obj) dynamic_cast(term).init_object(dev, dev.name() + "." + name); } else if (term.is_analog()) - dynamic_cast(term).init_object(dev, dev.name() + "." + name); + { + //log().fatal("Error adding {1} {2} to terminal list, analog output shouldn't get here\n", objtype_as_astr(term), term.name()); + //dynamic_cast(term).init_object(dev, dev.name() + "." + name); + } else log().fatal("Error adding {1} {2} to terminal list, neither LOGIC nor ANALOG\n", objtype_as_astr(term), term.name()); } From b4dfa259d64d12733bcd62ba14f51468997e2451 Mon Sep 17 00:00:00 2001 From: couriersud Date: Mon, 30 May 2016 21:39:59 +0200 Subject: [PATCH 19/44] moved analog_input creation into constructor. (nw) --- src/devices/machine/netlist.h | 8 +++++--- src/lib/netlist/analog/nld_opamps.h | 5 ++--- src/lib/netlist/devices/nld_4066.cpp | 2 +- src/lib/netlist/devices/nld_74123.cpp | 3 +-- src/lib/netlist/devices/nld_74ls629.cpp | 4 ++-- src/lib/netlist/devices/nld_log.cpp | 4 ++-- src/lib/netlist/devices/nld_mm5837.cpp | 6 +++--- src/lib/netlist/devices/nld_ne555.cpp | 4 ++-- src/lib/netlist/devices/nlid_cmos.h | 4 ++-- src/lib/netlist/devices/nlid_system.h | 10 +++++----- src/lib/netlist/nl_base.cpp | 10 ++++++++++ src/lib/netlist/nl_base.h | 5 ++++- src/lib/netlist/nl_setup.cpp | 3 ++- src/lib/netlist/plib/plists.h | 6 ++++++ 14 files changed, 47 insertions(+), 27 deletions(-) diff --git a/src/devices/machine/netlist.h b/src/devices/machine/netlist.h index 5340c792573..e5c19a93e6f 100644 --- a/src/devices/machine/netlist.h +++ b/src/devices/machine/netlist.h @@ -504,9 +504,11 @@ class NETLIB_NAME(analog_callback) : public netlist::device_t { public: NETLIB_NAME(analog_callback)(netlist::netlist_t &anetlist, const pstring &name) - : device_t(anetlist, name), m_cpu_device(nullptr), m_last(0) + : device_t(anetlist, name) + , m_in(*this, "IN") + , m_cpu_device(nullptr) + , m_last(0) { - enregister("IN", m_in); m_cpu_device = downcast(&downcast(netlist()).parent()); save(NLNAME(m_last)); } @@ -555,8 +557,8 @@ public: , m_channel(*this, "CHAN", 0) , m_mult(*this, "MULT", 1000.0) , m_offset(*this, "OFFSET", 0.0) + , m_in(*this, "IN") { - enregister("IN", m_in); m_sample = netlist::netlist_time::from_hz(1); //sufficiently big enough save(NAME(m_last_buffer)); } diff --git a/src/lib/netlist/analog/nld_opamps.h b/src/lib/netlist/analog/nld_opamps.h index a3d05569427..850886b7a0e 100644 --- a/src/lib/netlist/analog/nld_opamps.h +++ b/src/lib/netlist/analog/nld_opamps.h @@ -42,6 +42,8 @@ NETLIB_OBJECT(OPAMP) NETLIB_CONSTRUCTOR(OPAMP) , m_RP(*this, "RP1") , m_G1(*this, "G1") + , m_VCC(*this, "VCC") + , m_GND(*this, "GND") , m_model(*this, "MODEL", "") , m_VH(*this, "VH") , m_VL(*this, "VL") @@ -50,9 +52,6 @@ NETLIB_OBJECT(OPAMP) m_type = m_model.model_value("TYPE"); - enregister("VCC", m_VCC); - enregister("GND", m_GND); - if (m_type == 1) { register_subalias("PLUS", "G1.IP"); diff --git a/src/lib/netlist/devices/nld_4066.cpp b/src/lib/netlist/devices/nld_4066.cpp index 5aef076cf59..8aeac121b8c 100644 --- a/src/lib/netlist/devices/nld_4066.cpp +++ b/src/lib/netlist/devices/nld_4066.cpp @@ -20,9 +20,9 @@ namespace netlist NETLIB_FAMILY("CD4XXX") , m_supply(*this, "PS") , m_R(*this, "R") + , m_control(*this, "CTL") , m_base_r(*this, "BASER", 270.0) { - enregister("CTL", m_control); } NETLIB_RESETI() { } diff --git a/src/lib/netlist/devices/nld_74123.cpp b/src/lib/netlist/devices/nld_74123.cpp index 1fc8ddd74a3..cf0b8293c04 100644 --- a/src/lib/netlist/devices/nld_74123.cpp +++ b/src/lib/netlist/devices/nld_74123.cpp @@ -24,6 +24,7 @@ namespace netlist , m_dev_type(dev_type) , m_RP(*this, "RP") , m_RN(*this, "RN") + , m_CV(*this, "_CV") // internal , m_K(*this, "K", (m_dev_type == 4538) ? 0.4 : 0.4) , m_RI(*this, "RI", 400.0) // around 250 for HC series, 400 on LS/TTL, estimated from datasheets { @@ -39,8 +40,6 @@ namespace netlist enregister("_RP_Q", m_RP_Q); // internal enregister("_RN_Q", m_RN_Q); // internal - enregister("_CV", m_CV); // internal - register_subalias("GND", m_RN.m_R.m_N); register_subalias("VCC", m_RP.m_R.m_P); register_subalias("C", m_RN.m_R.m_N); diff --git a/src/lib/netlist/devices/nld_74ls629.cpp b/src/lib/netlist/devices/nld_74ls629.cpp index 909a862862f..f3266109410 100644 --- a/src/lib/netlist/devices/nld_74ls629.cpp +++ b/src/lib/netlist/devices/nld_74ls629.cpp @@ -88,11 +88,11 @@ namespace netlist , m_clock(*this, "OSC") , m_R_FC(*this, "R_FC") , m_R_RNG(*this, "R_RNG") + , m_RNG(*this, "RNG") + , m_FC(*this, "FC") , m_CAP(*this, "CAP", 1e-6) { enregister("ENQ", m_ENQ); - enregister("RNG", m_RNG); - enregister("FC", m_FC); register_subalias("GND", m_R_FC.m_N); connect_late(m_FC, m_R_FC.m_P); diff --git a/src/lib/netlist/devices/nld_log.cpp b/src/lib/netlist/devices/nld_log.cpp index 839254f60d2..77d3560181b 100644 --- a/src/lib/netlist/devices/nld_log.cpp +++ b/src/lib/netlist/devices/nld_log.cpp @@ -20,8 +20,8 @@ namespace netlist NETLIB_OBJECT(log) { NETLIB_CONSTRUCTOR(log) + , m_I(*this, "I") { - enregister("I", m_I); pstring filename = plib::pfmt("{1}.log")(this->name()); m_strm = plib::make_unique(filename); @@ -42,8 +42,8 @@ namespace netlist NETLIB_OBJECT_DERIVED(logD, log) { NETLIB_CONSTRUCTOR_DERIVED(logD, log) + , m_I2(*this, "I2") { - enregister("I2", m_I2); } NETLIB_UPDATEI() diff --git a/src/lib/netlist/devices/nld_mm5837.cpp b/src/lib/netlist/devices/nld_mm5837.cpp index 6c6b41abbdf..da25c296043 100644 --- a/src/lib/netlist/devices/nld_mm5837.cpp +++ b/src/lib/netlist/devices/nld_mm5837.cpp @@ -21,6 +21,9 @@ namespace netlist { NETLIB_CONSTRUCTOR(MM5837_dip) , m_RV(*this, "RV") + , m_VDD(*this, "1") + , m_VGG(*this, "2") + , m_VSS(*this, "4") , m_V0(*this, "_Q") , m_is_timestep(false) { @@ -36,10 +39,7 @@ namespace netlist connect_late(m_RV.m_N, m_V0); /* device */ - enregister("1", m_VDD); - enregister("2", m_VGG); register_subalias("3", m_RV.m_P); - enregister("4", m_VSS); save(NLNAME(m_shift)); diff --git a/src/lib/netlist/devices/nld_ne555.cpp b/src/lib/netlist/devices/nld_ne555.cpp index 16a657c3d1d..cdbb262e2bc 100644 --- a/src/lib/netlist/devices/nld_ne555.cpp +++ b/src/lib/netlist/devices/nld_ne555.cpp @@ -24,16 +24,16 @@ namespace netlist , m_R2(*this, "R2") , m_R3(*this, "R3") , m_RDIS(*this, "RDIS") + , m_THRES(*this, "THRESH") // Pin 6 + , m_TRIG(*this, "TRIG") // Pin 2 , m_OUT(*this, "OUT") // Pin 3 , m_last_out(false) , m_ff(false) { register_subalias("GND", m_R3.m_N); // Pin 1 - enregister("TRIG", m_TRIG); // Pin 2 enregister("RESET", m_RESET); // Pin 4 register_subalias("CONT", m_R1.m_N); // Pin 5 - enregister("THRESH", m_THRES); // Pin 6 register_subalias("DISCH", m_RDIS.m_P); // Pin 7 register_subalias("VCC", m_R1.m_P); // Pin 8 diff --git a/src/lib/netlist/devices/nlid_cmos.h b/src/lib/netlist/devices/nlid_cmos.h index c58f7ab410c..7ca6cc29783 100644 --- a/src/lib/netlist/devices/nlid_cmos.h +++ b/src/lib/netlist/devices/nlid_cmos.h @@ -18,9 +18,9 @@ namespace netlist NETLIB_OBJECT(vdd_vss) { NETLIB_CONSTRUCTOR(vdd_vss) + , m_vdd(*this, "VDD") + , m_vss(*this, "VSS") { - enregister("VDD", m_vdd); - enregister("VSS", m_vss); } NETLIB_UPDATEI() {}; diff --git a/src/lib/netlist/devices/nlid_system.h b/src/lib/netlist/devices/nlid_system.h index 4e355f4b9c6..6fc48465efc 100644 --- a/src/lib/netlist/devices/nlid_system.h +++ b/src/lib/netlist/devices/nlid_system.h @@ -238,8 +238,8 @@ namespace netlist { public: NETLIB_CONSTRUCTOR_DERIVED(dummy_input, base_dummy) + , m_I(*this, "I") { - enregister("I", m_I); } protected: @@ -262,12 +262,12 @@ namespace netlist NETLIB_CONSTRUCTOR_DERIVED(frontier, base_dummy) , m_RIN(*this, "m_RIN") , m_ROUT(*this, "m_ROUT", true) + , m_I(*this, "_I") , m_Q(*this, "_Q") , m_p_RIN(*this, "RIN", 1.0e6) , m_p_ROUT(*this, "ROUT", 50.0) { - enregister("_I", m_I); register_subalias("I", m_RIN.m_P); register_subalias("G", m_RIN.m_N); connect_late(m_I, m_RIN.m_P); @@ -314,7 +314,7 @@ namespace netlist { for (int i=0; i < m_N; i++) - enregister(plib::pfmt("A{1}")(i), m_I[i]); + m_I.emplace(i, *this, plib::pfmt("A{1}")(i)); plib::pstring_vector_t cmds(m_func.Value(), " "); m_precompiled.clear(); @@ -377,7 +377,7 @@ namespace netlist param_int_t m_N; param_str_t m_func; analog_output_t m_Q; - analog_input_t m_I[10]; + plib::uninitialised_array_t m_I; plib::pvector_t m_precompiled; }; @@ -463,8 +463,8 @@ namespace netlist public: nld_a_to_d_proxy(netlist_t &anetlist, const pstring &name, logic_input_t *in_proxied) : nld_base_proxy(anetlist, name, in_proxied, &m_I) + , m_I(*this, "I") { - enregister("I", m_I); enregister("Q", m_Q); } diff --git a/src/lib/netlist/nl_base.cpp b/src/lib/netlist/nl_base.cpp index f5ddf0ea42f..66057061190 100644 --- a/src/lib/netlist/nl_base.cpp +++ b/src/lib/netlist/nl_base.cpp @@ -1024,6 +1024,16 @@ ATTR_COLD void logic_output_t::initial(const netlist_sig_t val) net().as_logic().initial(val); } +// ---------------------------------------------------------------------------------------- +// analog_input_t +// ---------------------------------------------------------------------------------------- + +ATTR_COLD analog_input_t::analog_input_t(core_device_t &dev, const pstring &aname) +: analog_t(dev, aname, INPUT) +{ + set_state(STATE_INP_ACTIVE); + netlist().setup().register_object(dynamic_cast(dev), aname, *this); +} // ---------------------------------------------------------------------------------------- // analog_output_t diff --git a/src/lib/netlist/nl_base.h b/src/lib/netlist/nl_base.h index 03c66929745..be318347aaf 100644 --- a/src/lib/netlist/nl_base.h +++ b/src/lib/netlist/nl_base.h @@ -652,11 +652,14 @@ namespace netlist class analog_input_t : public analog_t { public: +#if 0 ATTR_COLD analog_input_t() : analog_t(INPUT) { set_state(STATE_INP_ACTIVE); } +#endif + ATTR_COLD analog_input_t(core_device_t &dev, const pstring &aname); ATTR_HOT nl_double Q_Analog() const; @@ -1129,7 +1132,7 @@ namespace netlist //ATTR_COLD void register_term(const pstring &name, terminal_t &port) { register_p(name, port); } //ATTR_COLD void enregister(const pstring &name, analog_output_t &out) { register_p(name, out); }; ATTR_COLD void enregister(const pstring &name, logic_output_t &out) { register_p(name, out); }; - ATTR_COLD void enregister(const pstring &name, analog_input_t &in) { register_p(name, in); }; + //ATTR_COLD void enregister(const pstring &name, analog_input_t &in) { register_p(name, in); }; ATTR_COLD void enregister(const pstring &name, logic_input_t &in) { register_p(name, in); }; ATTR_COLD void connect_late(const pstring &t1, const pstring &t2); diff --git a/src/lib/netlist/nl_setup.cpp b/src/lib/netlist/nl_setup.cpp index 3fe8ca3881a..9e11fd1afc3 100644 --- a/src/lib/netlist/nl_setup.cpp +++ b/src/lib/netlist/nl_setup.cpp @@ -276,8 +276,9 @@ void setup_t::register_object(device_t &dev, const pstring &name, object_t &obj) { logic_input_t &port = dynamic_cast(term); port.set_logic_family(dev.logic_family()); + term.init_object(dev, dev.name() + "." + name); } - term.init_object(dev, dev.name() + "." + name); + //term.init_object(dev, dev.name() + "." + name); dev.m_terminals.push_back(obj.name()); } else diff --git a/src/lib/netlist/plib/plists.h b/src/lib/netlist/plib/plists.h index 4e1454a7d30..6841838d5b4 100644 --- a/src/lib/netlist/plib/plists.h +++ b/src/lib/netlist/plib/plists.h @@ -123,6 +123,12 @@ public: return *reinterpret_cast(reinterpret_cast(m_buf) + index * sizeof(C)); } + template + void emplace(std::size_t index, Args&&... args) + { + new (&this[index]) D(std::forward(args)...); + } + protected: private: From 85c22dd73746c52d1df99596478179845c8ccaec Mon Sep 17 00:00:00 2001 From: couriersud Date: Tue, 31 May 2016 00:56:09 +0200 Subject: [PATCH 20/44] moved logic output creation to constructor. (nw) --- src/devices/machine/netlist.h | 4 +- src/lib/netlist/devices/nld_4020.cpp | 39 ++++++++------- src/lib/netlist/devices/nld_74107.cpp | 4 +- src/lib/netlist/devices/nld_74123.cpp | 9 ++-- src/lib/netlist/devices/nld_74153.cpp | 3 +- src/lib/netlist/devices/nld_74175.cpp | 15 ++---- src/lib/netlist/devices/nld_74192.cpp | 12 ++--- src/lib/netlist/devices/nld_74193.cpp | 12 ++--- src/lib/netlist/devices/nld_7448.cpp | 11 +---- src/lib/netlist/devices/nld_7450.cpp | 2 +- src/lib/netlist/devices/nld_7474.cpp | 5 +- src/lib/netlist/devices/nld_7483.cpp | 11 ++--- src/lib/netlist/devices/nld_7490.cpp | 8 +--- src/lib/netlist/devices/nld_7493.cpp | 2 +- src/lib/netlist/devices/nld_74ls629.cpp | 2 +- src/lib/netlist/devices/nld_82S16.cpp | 5 +- src/lib/netlist/devices/nld_9310.cpp | 11 ++--- src/lib/netlist/devices/nld_9316.cpp | 11 ++--- src/lib/netlist/devices/nld_legacy.cpp | 7 ++- src/lib/netlist/devices/nld_mm5837.cpp | 2 +- src/lib/netlist/devices/nld_truthtable.h | 5 +- src/lib/netlist/devices/nlid_system.h | 15 +++--- src/lib/netlist/nl_base.cpp | 55 +++++++++------------- src/lib/netlist/nl_base.h | 52 ++++++++++---------- src/lib/netlist/nl_setup.cpp | 8 ++-- src/lib/netlist/plib/plists.h | 13 +++-- src/lib/netlist/solver/nld_matrix_solver.h | 2 +- src/lib/netlist/solver/nld_solver.h | 3 +- 28 files changed, 150 insertions(+), 178 deletions(-) diff --git a/src/devices/machine/netlist.h b/src/devices/machine/netlist.h index e5c19a93e6f..9866ff513b9 100644 --- a/src/devices/machine/netlist.h +++ b/src/devices/machine/netlist.h @@ -626,10 +626,10 @@ class NETLIB_NAME(sound_in) : public netlist::device_t { public: NETLIB_NAME(sound_in)(netlist::netlist_t &anetlist, const pstring &name) - : netlist::device_t(anetlist, name) + : netlist::device_t(anetlist, name) + , m_Q(*this, "Q") { // clock part - enregister("Q", m_Q); enregister("FB", m_feedback); connect_late(m_feedback, m_Q); diff --git a/src/lib/netlist/devices/nld_4020.cpp b/src/lib/netlist/devices/nld_4020.cpp index 44083ad6ba5..c9977f58510 100644 --- a/src/lib/netlist/devices/nld_4020.cpp +++ b/src/lib/netlist/devices/nld_4020.cpp @@ -8,8 +8,27 @@ #include #include "nld_4020.h" +struct a +{ + const char *p[3]; +}; + +void test(a p) +{ + for (int i=1; i<3; i++) + printf("%s\n", p.p[i]); +} + +void tt() +{ + //const char *p[3] = {"a", "b", "c"}; + test({"a", "b", "c"}); +} + namespace netlist { + + namespace devices { @@ -17,23 +36,11 @@ namespace netlist { NETLIB_CONSTRUCTOR(CD4020_sub) NETLIB_FAMILY("CD4XXX") + , m_Q(*this, {"Q1", "_Q2", "_Q3", "Q4", "Q5", "Q6", "Q7", "Q8", "Q9", + "Q10", "Q11", "Q12", "Q13", "Q14"}) , m_cnt(0) { enregister("IP", m_IP); - - enregister("Q1", m_Q[0]); - enregister("Q4", m_Q[3]); - enregister("Q5", m_Q[4]); - enregister("Q6", m_Q[5]); - enregister("Q7", m_Q[6]); - enregister("Q8", m_Q[7]); - enregister("Q9", m_Q[8]); - enregister("Q10", m_Q[9]); - enregister("Q11", m_Q[10]); - enregister("Q12", m_Q[11]); - enregister("Q13", m_Q[12]); - enregister("Q14", m_Q[13]); - save(NLNAME(m_cnt)); } @@ -49,7 +56,7 @@ namespace netlist ATTR_HOT void update_outputs(const UINT16 cnt); logic_input_t m_IP; - logic_output_t m_Q[14]; + object_array_t m_Q; UINT16 m_cnt; }; @@ -124,7 +131,7 @@ namespace netlist NLTIME_FROM_NS(1380), NLTIME_FROM_NS(1480), }; - OUTLOGIC(m_Q[0], 0, out_delayQn[0]); + OUTLOGIC(m_Q[0], cnt & 1, out_delayQn[0]); for (int i=3; i<14; i++) OUTLOGIC(m_Q[i], (cnt >> i) & 1, out_delayQn[i]); } diff --git a/src/lib/netlist/devices/nld_74107.cpp b/src/lib/netlist/devices/nld_74107.cpp index cc0746fe131..471d3a94d10 100644 --- a/src/lib/netlist/devices/nld_74107.cpp +++ b/src/lib/netlist/devices/nld_74107.cpp @@ -15,14 +15,14 @@ namespace netlist NETLIB_OBJECT(74107Asub) { NETLIB_CONSTRUCTOR(74107Asub) + , m_Q(*this, "Q") + , m_QQ(*this, "QQ") , m_Q1(0) , m_Q2(0) , m_F(0) { enregister("CLK", m_clk); - enregister("Q", m_Q); - enregister("QQ", m_QQ); save(NLNAME(m_Q1)); save(NLNAME(m_Q2)); diff --git a/src/lib/netlist/devices/nld_74123.cpp b/src/lib/netlist/devices/nld_74123.cpp index cf0b8293c04..980366d27e1 100644 --- a/src/lib/netlist/devices/nld_74123.cpp +++ b/src/lib/netlist/devices/nld_74123.cpp @@ -24,6 +24,10 @@ namespace netlist , m_dev_type(dev_type) , m_RP(*this, "RP") , m_RN(*this, "RN") + , m_RP_Q(*this, "_RP_Q") + , m_RN_Q(*this, "_RN_Q") + , m_Q(*this, "Q") + , m_QQ(*this, "QQ") , m_CV(*this, "_CV") // internal , m_K(*this, "K", (m_dev_type == 4538) ? 0.4 : 0.4) , m_RI(*this, "RI", 400.0) // around 250 for HC series, 400 on LS/TTL, estimated from datasheets @@ -34,11 +38,6 @@ namespace netlist enregister("A", m_A); enregister("B", m_B); enregister("CLRQ", m_CLRQ); - enregister("Q", m_Q); - enregister("QQ", m_QQ); - - enregister("_RP_Q", m_RP_Q); // internal - enregister("_RN_Q", m_RN_Q); // internal register_subalias("GND", m_RN.m_R.m_N); register_subalias("VCC", m_RP.m_R.m_P); diff --git a/src/lib/netlist/devices/nld_74153.cpp b/src/lib/netlist/devices/nld_74153.cpp index 5b3408f1470..e98a304c611 100644 --- a/src/lib/netlist/devices/nld_74153.cpp +++ b/src/lib/netlist/devices/nld_74153.cpp @@ -20,6 +20,7 @@ namespace netlist NETLIB_OBJECT(74153sub) { NETLIB_CONSTRUCTOR(74153sub) + , m_Y(*this, "AY") //FIXME: Change netlists , m_chan(0) { enregister("C0", m_C[0]); @@ -28,8 +29,6 @@ namespace netlist enregister("C3", m_C[3]); enregister("G", m_G); - enregister("AY", m_Y); //FIXME: Change netlists - save(NLNAME(m_chan)); } diff --git a/src/lib/netlist/devices/nld_74175.cpp b/src/lib/netlist/devices/nld_74175.cpp index 53ef7bbe815..cda74705bba 100644 --- a/src/lib/netlist/devices/nld_74175.cpp +++ b/src/lib/netlist/devices/nld_74175.cpp @@ -15,19 +15,12 @@ namespace netlist NETLIB_OBJECT(74175_sub) { NETLIB_CONSTRUCTOR(74175_sub) + , m_Q(*this, {"Q1", "Q2", "Q3", "Q4"}) + , m_QQ(*this, {"Q1Q", "Q2Q", "Q3Q", "Q4Q"}) , m_data(0) { enregister("CLK", m_CLK); - enregister("Q1", m_Q[0]); - enregister("Q1Q", m_QQ[0]); - enregister("Q2", m_Q[1]); - enregister("Q2Q", m_QQ[1]); - enregister("Q3", m_Q[2]); - enregister("Q3Q", m_QQ[2]); - enregister("Q4", m_Q[3]); - enregister("Q4Q", m_QQ[3]); - save(NLNAME(m_clrq)); save(NLNAME(m_data)); } @@ -37,8 +30,8 @@ namespace netlist public: logic_input_t m_CLK; - logic_output_t m_Q[4]; - logic_output_t m_QQ[4]; + object_array_t m_Q; + object_array_t m_QQ; netlist_sig_t m_clrq; UINT8 m_data; diff --git a/src/lib/netlist/devices/nld_74192.cpp b/src/lib/netlist/devices/nld_74192.cpp index c9ddf77033a..91835137469 100644 --- a/src/lib/netlist/devices/nld_74192.cpp +++ b/src/lib/netlist/devices/nld_74192.cpp @@ -52,6 +52,9 @@ namespace netlist { NETLIB_CONSTRUCTOR(74192) , m_ABCD(*this, "subABCD") + , m_Q(*this, {"QA", "QB", "QC", "QD"}) + , m_BORROWQ(*this, "BORROWQ") + , m_CARRYQ(*this, "CARRYQ") { register_subalias("A", m_ABCD.m_A); register_subalias("B", m_ABCD.m_B); @@ -62,13 +65,6 @@ namespace netlist enregister("CU", m_CU); enregister("CD", m_CD); - enregister("QA", m_Q[0]); - enregister("QB", m_Q[1]); - enregister("QC", m_Q[2]); - enregister("QD", m_Q[3]); - enregister("BORROWQ", m_BORROWQ); - enregister("CARRYQ", m_CARRYQ); - save(NLNAME(m_cnt)); save(NLNAME(m_last_CU)); save(NLNAME(m_last_CD)); @@ -88,7 +84,7 @@ namespace netlist UINT8 m_last_CU; UINT8 m_last_CD; - logic_output_t m_Q[4]; + object_array_t m_Q; logic_output_t m_BORROWQ; logic_output_t m_CARRYQ; }; diff --git a/src/lib/netlist/devices/nld_74193.cpp b/src/lib/netlist/devices/nld_74193.cpp index 7a706cdc435..52a8df5307d 100644 --- a/src/lib/netlist/devices/nld_74193.cpp +++ b/src/lib/netlist/devices/nld_74193.cpp @@ -20,6 +20,9 @@ namespace netlist , m_cnt(0) , m_last_CU(0) , m_last_CD(0) + , m_Q(*this, {"QA", "QB", "QC", "QD"}) + , m_BORROWQ(*this, "BORROWQ") + , m_CARRYQ(*this, "CARRYQ") { enregister("A", m_A); enregister("B", m_B); @@ -30,13 +33,6 @@ namespace netlist enregister("CU", m_CU); enregister("CD", m_CD); - enregister("QA", m_Q[0]); - enregister("QB", m_Q[1]); - enregister("QC", m_Q[2]); - enregister("QD", m_Q[3]); - enregister("BORROWQ", m_BORROWQ); - enregister("CARRYQ", m_CARRYQ); - save(NLNAME(m_cnt)); save(NLNAME(m_last_CU)); save(NLNAME(m_last_CD)); @@ -59,7 +55,7 @@ namespace netlist UINT8 m_last_CU; UINT8 m_last_CD; - logic_output_t m_Q[4]; + object_array_t m_Q; logic_output_t m_BORROWQ; logic_output_t m_CARRYQ; }; diff --git a/src/lib/netlist/devices/nld_7448.cpp b/src/lib/netlist/devices/nld_7448.cpp index 31d019fc1c7..f58ba424f87 100644 --- a/src/lib/netlist/devices/nld_7448.cpp +++ b/src/lib/netlist/devices/nld_7448.cpp @@ -29,6 +29,7 @@ namespace netlist { NETLIB_CONSTRUCTOR(7448) , m_state(0) + , m_Q(*this, {"a", "b", "c", "d", "e", "f", "g"}) { enregister("A", m_A); enregister("B", m_B); @@ -38,14 +39,6 @@ namespace netlist enregister("BIQ", m_BIQ); enregister("RBIQ", m_RBIQ); - enregister("a", m_Q[0]); - enregister("b", m_Q[1]); - enregister("c", m_Q[2]); - enregister("d", m_Q[3]); - enregister("e", m_Q[4]); - enregister("f", m_Q[5]); - enregister("g", m_Q[6]); - save(NLNAME(m_state)); } @@ -66,7 +59,7 @@ namespace netlist UINT8 m_state; - logic_output_t m_Q[7]; /* a .. g */ + object_array_t m_Q; /* a .. g */ }; diff --git a/src/lib/netlist/devices/nld_7450.cpp b/src/lib/netlist/devices/nld_7450.cpp index aa997256c5a..d4916c4fa31 100644 --- a/src/lib/netlist/devices/nld_7450.cpp +++ b/src/lib/netlist/devices/nld_7450.cpp @@ -15,12 +15,12 @@ namespace netlist NETLIB_OBJECT(7450) { NETLIB_CONSTRUCTOR(7450) + , m_Q(*this, "Q") { enregister("A", m_A); enregister("B", m_B); enregister("C", m_C); enregister("D", m_D); - enregister("Q", m_Q); } //NETLIB_RESETI(); NETLIB_UPDATEI(); diff --git a/src/lib/netlist/devices/nld_7474.cpp b/src/lib/netlist/devices/nld_7474.cpp index f3890f4105d..8a9370f757a 100644 --- a/src/lib/netlist/devices/nld_7474.cpp +++ b/src/lib/netlist/devices/nld_7474.cpp @@ -15,13 +15,12 @@ namespace netlist NETLIB_OBJECT(7474sub) { NETLIB_CONSTRUCTOR(7474sub) + , m_Q(*this, "Q") + , m_QQ(*this, "QQ") , m_nextD(0) { enregister("CLK", m_CLK); - enregister("Q", m_Q); - enregister("QQ", m_QQ); - save(NLNAME(m_nextD)); } diff --git a/src/lib/netlist/devices/nld_7483.cpp b/src/lib/netlist/devices/nld_7483.cpp index 29c28121d8f..1ae379be631 100644 --- a/src/lib/netlist/devices/nld_7483.cpp +++ b/src/lib/netlist/devices/nld_7483.cpp @@ -16,6 +16,11 @@ namespace netlist { NETLIB_CONSTRUCTOR(7483) , m_lastr(0) + , m_S1(*this, "S1") + , m_S2(*this, "S2") + , m_S3(*this, "S3") + , m_S4(*this, "S4") + , m_C4(*this, "C4") { enregister("A1", m_A1); enregister("A2", m_A2); @@ -27,12 +32,6 @@ namespace netlist enregister("B4", m_B4); enregister("C0", m_C0); - enregister("S1", m_S1); - enregister("S2", m_S2); - enregister("S3", m_S3); - enregister("S4", m_S4); - enregister("C4", m_C4); - save(NLNAME(m_lastr)); } NETLIB_RESETI(); diff --git a/src/lib/netlist/devices/nld_7490.cpp b/src/lib/netlist/devices/nld_7490.cpp index fbe0bda2443..25e87b66826 100644 --- a/src/lib/netlist/devices/nld_7490.cpp +++ b/src/lib/netlist/devices/nld_7490.cpp @@ -18,6 +18,7 @@ namespace netlist , m_cnt(0) , m_last_A(0) , m_last_B(0) + , m_Q(*this, {"QA", "QB", "QC", "QD"}) { enregister("A", m_A); enregister("B", m_B); @@ -26,11 +27,6 @@ namespace netlist enregister("R91", m_R91); enregister("R92", m_R92); - enregister("QA", m_Q[0]); - enregister("QB", m_Q[1]); - enregister("QC", m_Q[2]); - enregister("QD", m_Q[3]); - save(NLNAME(m_cnt)); save(NLNAME(m_last_A)); save(NLNAME(m_last_B)); @@ -53,7 +49,7 @@ namespace netlist UINT8 m_last_A; UINT8 m_last_B; - logic_output_t m_Q[4]; + object_array_t m_Q; }; NETLIB_OBJECT_DERIVED(7490_dip, 7490) diff --git a/src/lib/netlist/devices/nld_7493.cpp b/src/lib/netlist/devices/nld_7493.cpp index 3ed976cfa86..9fffa5b87b3 100644 --- a/src/lib/netlist/devices/nld_7493.cpp +++ b/src/lib/netlist/devices/nld_7493.cpp @@ -17,9 +17,9 @@ namespace netlist NETLIB_OBJECT(7493ff) { NETLIB_CONSTRUCTOR(7493ff) + , m_Q(*this, "Q") { enregister("CLK", m_I); - enregister("Q", m_Q); save(NLNAME(m_reset)); save(NLNAME(m_state)); diff --git a/src/lib/netlist/devices/nld_74ls629.cpp b/src/lib/netlist/devices/nld_74ls629.cpp index f3266109410..c30ad5a89f6 100644 --- a/src/lib/netlist/devices/nld_74ls629.cpp +++ b/src/lib/netlist/devices/nld_74ls629.cpp @@ -50,12 +50,12 @@ namespace netlist NETLIB_OBJECT(SN74LS629clk) { NETLIB_CONSTRUCTOR(SN74LS629clk) + , m_Y(*this, "Y") , m_enableq(1) , m_out(0) , m_inc(netlist_time::zero) { enregister("FB", m_FB); - enregister("Y", m_Y); connect_late(m_FB, m_Y); diff --git a/src/lib/netlist/devices/nld_82S16.cpp b/src/lib/netlist/devices/nld_82S16.cpp index 8fefb52e43c..b3fdc1bcc10 100644 --- a/src/lib/netlist/devices/nld_82S16.cpp +++ b/src/lib/netlist/devices/nld_82S16.cpp @@ -15,6 +15,7 @@ namespace netlist NETLIB_OBJECT(82S16) { NETLIB_CONSTRUCTOR(82S16) + , m_DOUTQ(*this, "DOUTQ") { enregister("A0", m_A[0]); enregister("A1", m_A[1]); @@ -32,8 +33,6 @@ namespace netlist enregister("WEQ", m_WEQ); enregister("DIN", m_DIN); - enregister("DOUTQ",m_DOUTQ); - save(NLNAME(m_ram)); } @@ -74,7 +73,7 @@ namespace netlist enregister("12", m_WEQ); enregister("13", m_DIN); - enregister("6", m_DOUTQ); + register_subalias("6", m_DOUTQ); } }; diff --git a/src/lib/netlist/devices/nld_9310.cpp b/src/lib/netlist/devices/nld_9310.cpp index 24a9a9c440c..803a765853e 100644 --- a/src/lib/netlist/devices/nld_9310.cpp +++ b/src/lib/netlist/devices/nld_9310.cpp @@ -47,15 +47,14 @@ namespace netlist , m_ABCD(nullptr) , m_loadq(0) , m_ent(0) + , m_QA(*this, "QA") + , m_QB(*this, "QB") + , m_QC(*this, "QC") + , m_QD(*this, "QD") + , m_RC(*this, "RC") { enregister("CLK", m_CLK); - enregister("QA", m_QA); - enregister("QB", m_QB); - enregister("QC", m_QC); - enregister("QD", m_QD); - enregister("RC", m_RC); - save(NLNAME(m_cnt)); save(NLNAME(m_loadq)); save(NLNAME(m_ent)); diff --git a/src/lib/netlist/devices/nld_9316.cpp b/src/lib/netlist/devices/nld_9316.cpp index bd36df284aa..28dc84b86b6 100644 --- a/src/lib/netlist/devices/nld_9316.cpp +++ b/src/lib/netlist/devices/nld_9316.cpp @@ -51,6 +51,11 @@ namespace netlist NETLIB_OBJECT(9316_sub) { NETLIB_CONSTRUCTOR(9316_sub) + , m_QA(*this, "QA") + , m_QB(*this, "QB") + , m_QC(*this, "QC") + , m_QD(*this, "QD") + , m_RC(*this, "RC") , m_cnt(0) , m_ABCD(nullptr) , m_loadq(0) @@ -58,12 +63,6 @@ namespace netlist { enregister("CLK", m_CLK); - enregister("QA", m_QA); - enregister("QB", m_QB); - enregister("QC", m_QC); - enregister("QD", m_QD); - enregister("RC", m_RC); - save(NLNAME(m_cnt)); save(NLNAME(m_loadq)); save(NLNAME(m_ent)); diff --git a/src/lib/netlist/devices/nld_legacy.cpp b/src/lib/netlist/devices/nld_legacy.cpp index f2ddf677d33..0093798049c 100644 --- a/src/lib/netlist/devices/nld_legacy.cpp +++ b/src/lib/netlist/devices/nld_legacy.cpp @@ -16,11 +16,11 @@ namespace netlist NETLIB_OBJECT(nicRSFF) { NETLIB_CONSTRUCTOR(nicRSFF) + , m_Q(*this, "Q") + , m_QQ(*this, "QQ") { enregister("S", m_S); enregister("R", m_R); - enregister("Q", m_Q); - enregister("QQ", m_QQ); } NETLIB_RESETI(); @@ -38,12 +38,12 @@ namespace netlist NETLIB_OBJECT(nicDelay) { NETLIB_CONSTRUCTOR(nicDelay) + , m_Q(*this, "2") , m_L_to_H(*this, "L_TO_H", 10) , m_H_to_L(*this, "H_TO_L", 10) , m_last(0) { enregister("1", m_I); - enregister("2", m_Q); save(NLNAME(m_last)); } @@ -54,7 +54,6 @@ namespace netlist protected: logic_input_t m_I; - logic_output_t m_Q; param_int_t m_L_to_H; diff --git a/src/lib/netlist/devices/nld_mm5837.cpp b/src/lib/netlist/devices/nld_mm5837.cpp index da25c296043..b44f5dcf9fa 100644 --- a/src/lib/netlist/devices/nld_mm5837.cpp +++ b/src/lib/netlist/devices/nld_mm5837.cpp @@ -25,10 +25,10 @@ namespace netlist , m_VGG(*this, "2") , m_VSS(*this, "4") , m_V0(*this, "_Q") + , m_Q(*this, "Q") , m_is_timestep(false) { /* clock */ - enregister("Q", m_Q); enregister("FB", m_feedback); m_inc = netlist_time::from_hz(56000); connect_late(m_feedback, m_Q); diff --git a/src/lib/netlist/devices/nld_truthtable.h b/src/lib/netlist/devices/nld_truthtable.h index 6aaaa73a698..f69d7dcc170 100644 --- a/src/lib/netlist/devices/nld_truthtable.h +++ b/src/lib/netlist/devices/nld_truthtable.h @@ -171,9 +171,10 @@ public: } for (unsigned i=0; i < m_NO; i++) { - new (&m_Q[i]) logic_output_t(); + //new (&m_Q[i]) logic_output_t(); out[i] = out[i].trim(); - enregister(out[i], m_Q[i]); + m_Q.emplace(i, *this, out[i]); + //enregister(out[i], m_Q[i]); } // Connect output "Q" to input "_Q" if this exists // This enables timed state without having explicit state .... diff --git a/src/lib/netlist/devices/nlid_system.h b/src/lib/netlist/devices/nlid_system.h index 6fc48465efc..d2ef3cbfa37 100644 --- a/src/lib/netlist/devices/nlid_system.h +++ b/src/lib/netlist/devices/nlid_system.h @@ -45,9 +45,9 @@ namespace netlist NETLIB_OBJECT(mainclock) { NETLIB_CONSTRUCTOR(mainclock) + , m_Q(*this, "Q") , m_freq(*this, "FREQ", 7159000.0 * 5) { - enregister("Q", m_Q); m_inc = netlist_time::from_hz(m_freq.Value()*2); } @@ -86,10 +86,9 @@ namespace netlist NETLIB_OBJECT(clock) { NETLIB_CONSTRUCTOR(clock) + , m_Q(*this, "Q") , m_freq(*this, "FREQ", 7159000.0 * 5.0) - { - enregister("Q", m_Q); enregister("FB", m_feedback); m_inc = netlist_time::from_hz(m_freq.Value()*2); @@ -118,8 +117,8 @@ namespace netlist , m_freq(*this, "FREQ", 7159000.0 * 5.0) , m_pattern(*this, "PATTERN", "1,1") , m_offset(*this, "OFFSET", 0.0) + , m_Q(*this, "Q") { - enregister("Q", m_Q); enregister("FB", m_feedback); m_inc[0] = netlist_time::from_hz(m_freq.Value()*2); @@ -173,14 +172,14 @@ namespace netlist NETLIB_OBJECT(logic_input) { NETLIB_CONSTRUCTOR(logic_input) + , m_Q(*this, "Q") , m_IN(*this, "IN", 0) /* make sure we get the family first */ , m_FAMILY(*this, "FAMILY", "FAMILY(TYPE=TTL)") { set_logic_family(netlist().setup().family_from_model(m_FAMILY.Value())); - - enregister("Q", m_Q); } + NETLIB_UPDATE_AFTER_PARAM_CHANGE() NETLIB_UPDATEI(); @@ -314,7 +313,7 @@ namespace netlist { for (int i=0; i < m_N; i++) - m_I.emplace(i, *this, plib::pfmt("A{1}")(i)); + m_I.emplace(i, *this, plib::pfmt("A{1}")(i)); plib::pstring_vector_t cmds(m_func.Value(), " "); m_precompiled.clear(); @@ -464,8 +463,8 @@ namespace netlist nld_a_to_d_proxy(netlist_t &anetlist, const pstring &name, logic_input_t *in_proxied) : nld_base_proxy(anetlist, name, in_proxied, &m_I) , m_I(*this, "I") + , m_Q(*this, "Q") { - enregister("Q", m_Q); } virtual ~nld_a_to_d_proxy() {} diff --git a/src/lib/netlist/nl_base.cpp b/src/lib/netlist/nl_base.cpp index 66057061190..e78cea86ecf 100644 --- a/src/lib/netlist/nl_base.cpp +++ b/src/lib/netlist/nl_base.cpp @@ -169,8 +169,6 @@ ATTR_COLD object_t::object_t(netlist_t &nl, const pstring &aname, const type_t a , m_objtype(atype) , m_netlist(&nl) { - //printf("reg %s\n", this->name().cstr()); - save_register(); } ATTR_COLD object_t::~object_t() @@ -181,7 +179,6 @@ ATTR_COLD void object_t::init_object(netlist_t &nl, const pstring &aname) { m_netlist = &nl; m_name = aname; - save_register(); } ATTR_COLD const pstring &object_t::name() const @@ -664,6 +661,13 @@ ATTR_COLD void net_t::init_object(netlist_t &nl, const pstring &aname, core_term nl.m_nets.push_back(std::shared_ptr(this, do_nothing_deleter())); else nl.m_nets.push_back(std::shared_ptr(this)); + + save(NLNAME(m_time)); + save(NLNAME(m_active)); + save(NLNAME(m_in_queue)); + save(NLNAME(m_cur_Analog)); + save(NLNAME(m_cur_Q)); + save(NLNAME(m_new_Q)); } ATTR_HOT void net_t::inc_active(core_terminal_t &term) @@ -720,17 +724,6 @@ ATTR_COLD void net_t::rebuild_list() m_active = cnt; } -ATTR_COLD void net_t::save_register() -{ - save(NLNAME(m_time)); - save(NLNAME(m_active)); - save(NLNAME(m_in_queue)); - save(NLNAME(m_cur_Analog)); - save(NLNAME(m_cur_Q)); - save(NLNAME(m_new_Q)); - object_t::save_register(); -} - ATTR_HOT /* inline */ void net_t::update_devs() { //assert(m_num_cons != 0); @@ -846,11 +839,6 @@ ATTR_COLD void logic_net_t::reset() net_t::reset(); } -ATTR_COLD void logic_net_t::save_register() -{ - net_t::save_register(); -} - // ---------------------------------------------------------------------------------------- // analog_net_t // ---------------------------------------------------------------------------------------- @@ -873,11 +861,6 @@ ATTR_COLD void analog_net_t::reset() net_t::reset(); } -ATTR_COLD void analog_net_t::save_register() -{ - net_t::save_register(); -} - ATTR_COLD bool analog_net_t::already_processed(plib::pvector_t &groups) { if (isRailNet()) @@ -935,6 +918,7 @@ ATTR_COLD core_terminal_t::core_terminal_t(core_device_t &dev, const pstring &an , m_net(nullptr) , m_state(STATE_NONEX) { + save(NLNAME(m_state)); } ATTR_COLD void core_terminal_t::set_net(net_t::ptr_t anet) @@ -960,6 +944,9 @@ ATTR_COLD terminal_t::terminal_t(core_device_t &dev, const pstring &aname) , m_gt1(nullptr) { netlist().setup().register_object(dynamic_cast(dev), aname, *this); + save(NLNAME(m_Idr1)); + save(NLNAME(m_go1)); + save(NLNAME(m_gt1)); } @@ -985,14 +972,6 @@ ATTR_COLD void terminal_t::reset() set_ptr(m_gt1, netlist().gmin()); } -ATTR_COLD void terminal_t::save_register() -{ - save(NLNAME(m_Idr1)); - save(NLNAME(m_go1)); - save(NLNAME(m_gt1)); - core_terminal_t::save_register(); -} - // ---------------------------------------------------------------------------------------- // net_input_t @@ -1006,12 +985,24 @@ ATTR_COLD void terminal_t::save_register() // logic_output_t // ---------------------------------------------------------------------------------------- +#if 0 ATTR_COLD logic_output_t::logic_output_t() : logic_t(OUTPUT) { set_state(STATE_OUT); this->set_net(&m_my_net); } +#endif + +ATTR_COLD logic_output_t::logic_output_t(core_device_t &dev, const pstring &aname) + : logic_t(dev, aname, OUTPUT) +{ + set_state(STATE_OUT); + this->set_net(&m_my_net); + set_logic_family(dev.logic_family()); + net().init_object(dev.netlist(), name() + ".net", this); + netlist().setup().register_object(dynamic_cast(dev), aname, *this); +} ATTR_COLD void logic_output_t::init_object(core_device_t &dev, const pstring &aname) { diff --git a/src/lib/netlist/nl_base.h b/src/lib/netlist/nl_base.h index be318347aaf..5a1bebbc7c5 100644 --- a/src/lib/netlist/nl_base.h +++ b/src/lib/netlist/nl_base.h @@ -388,7 +388,7 @@ namespace netlist virtual void reset() { } // must call parent save_register ! - virtual void save_register() { } + //virtual void save_register() { } private: pstring m_name; @@ -472,13 +472,6 @@ namespace netlist m_state = astate; } - protected: - virtual void save_register() override - { - save(NLNAME(m_state)); - device_object_t::save_register(); - } - private: net_t * m_net; state_e m_state; @@ -567,8 +560,6 @@ namespace netlist } protected: - virtual void save_register() override; - virtual void reset() override; private: ATTR_HOT void set_ptr(nl_double *ptr, const nl_double val) @@ -601,6 +592,12 @@ namespace netlist { } + ATTR_COLD logic_t(core_device_t &dev, const pstring &aname, const type_t atype) + : core_terminal_t(dev, aname, atype), logic_family_t(), + m_proxy(nullptr) + { + } + virtual void reset() override { } @@ -652,15 +649,7 @@ namespace netlist class analog_input_t : public analog_t { public: -#if 0 - ATTR_COLD analog_input_t() - : analog_t(INPUT) - { - set_state(STATE_INP_ACTIVE); - } -#endif ATTR_COLD analog_input_t(core_device_t &dev, const pstring &aname); - ATTR_HOT nl_double Q_Analog() const; protected: @@ -735,7 +724,6 @@ namespace netlist protected: //FIXME: needed by current solver code - virtual void save_register() override; virtual void reset() override; netlist_sig_t m_new_Q; @@ -808,10 +796,8 @@ namespace netlist protected: //FIXME: needed by current solver code - virtual void save_register() override; virtual void reset() override; - private: public: @@ -847,7 +833,6 @@ namespace netlist protected: - virtual void save_register() override; virtual void reset() override; @@ -868,7 +853,8 @@ namespace netlist P_PREVENT_COPYING(logic_output_t) public: - ATTR_COLD logic_output_t(); + //ATTR_COLD logic_output_t(); + ATTR_COLD logic_output_t(core_device_t &dev, const pstring &aname); ATTR_COLD void init_object(core_device_t &dev, const pstring &aname); virtual void reset() override @@ -1131,7 +1117,7 @@ namespace netlist ATTR_COLD void register_subalias(const pstring &name, const pstring &aliased); //ATTR_COLD void register_term(const pstring &name, terminal_t &port) { register_p(name, port); } //ATTR_COLD void enregister(const pstring &name, analog_output_t &out) { register_p(name, out); }; - ATTR_COLD void enregister(const pstring &name, logic_output_t &out) { register_p(name, out); }; + //ATTR_COLD void enregister(const pstring &name, logic_output_t &out) { register_p(name, out); }; //ATTR_COLD void enregister(const pstring &name, analog_input_t &in) { register_p(name, in); }; ATTR_COLD void enregister(const pstring &name, logic_input_t &in) { register_p(name, in); }; @@ -1321,6 +1307,24 @@ protected: plib::dynlib *m_lib; // external lib needs to be loaded as long as netlist exists }; + // ----------------------------------------------------------------------------- + // Support classes for devices + // ----------------------------------------------------------------------------- + + template + class object_array_t : public plib::uninitialised_array_t + { + public: + struct init + { + const char *p[N]; + }; + object_array_t(core_device_t &dev, init names) + { + for (std::size_t i = 0; iemplace(i, dev, names.p[i]); + } + }; // ----------------------------------------------------------------------------- // inline implementations diff --git a/src/lib/netlist/nl_setup.cpp b/src/lib/netlist/nl_setup.cpp index 9e11fd1afc3..9934ebf3af1 100644 --- a/src/lib/netlist/nl_setup.cpp +++ b/src/lib/netlist/nl_setup.cpp @@ -105,7 +105,7 @@ void setup_t::register_dev(plib::owned_ptr dev) for (auto & d : netlist().m_devices) if (d->name() == dev->name()) log().fatal("Error adding {1} to device list. Duplicate name \n", d->name()); - + printf("dev %s\n", dev->name().cstr()); netlist().m_devices.push_back(std::move(dev)); } @@ -258,9 +258,9 @@ void setup_t::register_object(device_t &dev, const pstring &name, object_t &obj) { if (term.is_logic()) { - logic_output_t &port = dynamic_cast(term); - port.set_logic_family(dev.logic_family()); - dynamic_cast(term).init_object(dev, dev.name() + "." + name); + //logic_output_t &port = dynamic_cast(term); + //port.set_logic_family(dev.logic_family()); + //dynamic_cast(term).init_object(dev, dev.name() + "." + name); } else if (term.is_analog()) { diff --git a/src/lib/netlist/plib/plists.h b/src/lib/netlist/plib/plists.h index 6841838d5b4..9c41cf4aa2b 100644 --- a/src/lib/netlist/plib/plists.h +++ b/src/lib/netlist/plib/plists.h @@ -100,6 +100,7 @@ class uninitialised_array_t public: uninitialised_array_t() { + printf("array size %d align %d - %d %d\n", (int) sizeof(C[N]), (int) alignof(C[N]), (int) sizeof(*this), (int) alignof(*this)); } ~uninitialised_array_t() @@ -115,24 +116,28 @@ public: C& operator[](const std::size_t &index) { - return *reinterpret_cast(reinterpret_cast(m_buf) + index * sizeof(C)); + return *reinterpret_cast(addr(index)); } const C& operator[](const std::size_t &index) const { - return *reinterpret_cast(reinterpret_cast(m_buf) + index * sizeof(C)); + return *reinterpret_cast(addr(index)); } - template + template void emplace(std::size_t index, Args&&... args) { - new (&this[index]) D(std::forward(args)...); + new (addr(index)) C(std::forward(args)...); } protected: private: + void *addr(const std::size_t &index) + { + return reinterpret_cast(&m_buf[0]) + index * sizeof(C); + } /* ensure proper alignment */ UINT64 m_buf[(N * sizeof(C) + sizeof(UINT64) - 1) / sizeof(UINT64)]; }; diff --git a/src/lib/netlist/solver/nld_matrix_solver.h b/src/lib/netlist/solver/nld_matrix_solver.h index 44db4d9e73a..0e9581b8bc9 100644 --- a/src/lib/netlist/solver/nld_matrix_solver.h +++ b/src/lib/netlist/solver/nld_matrix_solver.h @@ -97,9 +97,9 @@ public: m_iterative_total(0), m_params(*params), m_cur_ts(0), + m_Q_sync(*this, "Q_sync"), m_sort(sort) { - enregister("Q_sync", m_Q_sync); enregister("FB_sync", m_fb_sync); connect_post_start(m_fb_sync, m_Q_sync); diff --git a/src/lib/netlist/solver/nld_solver.h b/src/lib/netlist/solver/nld_solver.h index 7b7aac2a1c1..dc4602b65b0 100644 --- a/src/lib/netlist/solver/nld_solver.h +++ b/src/lib/netlist/solver/nld_solver.h @@ -57,6 +57,7 @@ class matrix_solver_t; NETLIB_OBJECT(solver) { NETLIB_CONSTRUCTOR(solver) + , m_Q_step(*this, "Q_step") , m_sync_delay(*this, "SYNC_DELAY", NLTIME_FROM_NS(10).as_double()) , m_freq(*this, "FREQ", 48000.0) @@ -80,8 +81,6 @@ NETLIB_OBJECT(solver) , m_log_stats(*this, "LOG_STATS", 1) // nl_double timestep resolution { - enregister("Q_step", m_Q_step); - // internal staff enregister("FB_step", m_fb_step); From 21a8e71cd8cde07b0d8573a309260ef5bde761d5 Mon Sep 17 00:00:00 2001 From: couriersud Date: Tue, 31 May 2016 19:33:56 +0200 Subject: [PATCH 21/44] Dead code removal. (nw) --- src/lib/netlist/devices/nld_4020.cpp | 17 ------- src/lib/netlist/nl_base.cpp | 67 ---------------------------- src/lib/netlist/nl_base.h | 27 +---------- src/lib/netlist/nl_setup.cpp | 1 - src/lib/netlist/plib/plists.h | 21 +++------ 5 files changed, 8 insertions(+), 125 deletions(-) diff --git a/src/lib/netlist/devices/nld_4020.cpp b/src/lib/netlist/devices/nld_4020.cpp index c9977f58510..5164c18afb9 100644 --- a/src/lib/netlist/devices/nld_4020.cpp +++ b/src/lib/netlist/devices/nld_4020.cpp @@ -8,23 +8,6 @@ #include #include "nld_4020.h" -struct a -{ - const char *p[3]; -}; - -void test(a p) -{ - for (int i=1; i<3; i++) - printf("%s\n", p.p[i]); -} - -void tt() -{ - //const char *p[3] = {"a", "b", "c"}; - test({"a", "b", "c"}); -} - namespace netlist { diff --git a/src/lib/netlist/nl_base.cpp b/src/lib/netlist/nl_base.cpp index e78cea86ecf..7438b646dda 100644 --- a/src/lib/netlist/nl_base.cpp +++ b/src/lib/netlist/nl_base.cpp @@ -198,12 +198,6 @@ ATTR_COLD device_object_t::device_object_t(const type_t atype) { } -ATTR_COLD device_object_t::device_object_t(core_device_t &dev, const type_t atype) -: object_t(dev.netlist(), atype) -, m_device(&dev) -{ -} - ATTR_COLD device_object_t::device_object_t(core_device_t &dev, const pstring &aname, const type_t atype) : object_t(dev.netlist(), aname, atype) , m_device(&dev) @@ -455,26 +449,6 @@ template class param_template_t; template class param_template_t; template class param_template_t; -#if 0 -template -ATTR_COLD void device_t::register_param(const pstring &sname, C ¶m, const T initialVal) -{ - pstring fullname = this->name() + "." + sname; - param.init_object(*this, fullname); - param.initial(initialVal); - setup().register_object(*this, fullname, param); -} - -template ATTR_COLD void device_t::register_param(const pstring &sname, param_double_t ¶m, const double initialVal); -template ATTR_COLD void device_t::register_param(const pstring &sname, param_double_t ¶m, const float initialVal); -template ATTR_COLD void device_t::register_param(const pstring &sname, param_int_t ¶m, const int initialVal); -template ATTR_COLD void device_t::register_param(const pstring &sname, param_logic_t ¶m, const int initialVal); -template ATTR_COLD void device_t::register_param(const pstring &sname, param_str_t ¶m, const char * const initialVal); -template ATTR_COLD void device_t::register_param(const pstring &sname, param_str_t ¶m, const pstring &initialVal); -template ATTR_COLD void device_t::register_param(const pstring &sname, param_model_t ¶m, const char * const initialVal); -#endif - - // ---------------------------------------------------------------------------------------- // core_device_t // ---------------------------------------------------------------------------------------- @@ -904,14 +878,6 @@ ATTR_COLD core_terminal_t::core_terminal_t(const type_t atype) { } -ATTR_COLD core_terminal_t::core_terminal_t(core_device_t &dev, const type_t atype) -: device_object_t(dev, atype) -, plinkedlist_element_t() -, m_net(nullptr) -, m_state(STATE_NONEX) -{ -} - ATTR_COLD core_terminal_t::core_terminal_t(core_device_t &dev, const pstring &aname, const type_t atype) : device_object_t(dev, dev.name() + "." + aname, atype) , plinkedlist_element_t() @@ -985,15 +951,6 @@ ATTR_COLD void terminal_t::reset() // logic_output_t // ---------------------------------------------------------------------------------------- -#if 0 -ATTR_COLD logic_output_t::logic_output_t() - : logic_t(OUTPUT) -{ - set_state(STATE_OUT); - this->set_net(&m_my_net); -} -#endif - ATTR_COLD logic_output_t::logic_output_t(core_device_t &dev, const pstring &aname) : logic_t(dev, aname, OUTPUT) { @@ -1004,12 +961,6 @@ ATTR_COLD logic_output_t::logic_output_t(core_device_t &dev, const pstring &anam netlist().setup().register_object(dynamic_cast(dev), aname, *this); } -ATTR_COLD void logic_output_t::init_object(core_device_t &dev, const pstring &aname) -{ - core_terminal_t::init_object(dev, aname); - net().init_object(dev.netlist(), aname + ".net", this); -} - ATTR_COLD void logic_output_t::initial(const netlist_sig_t val) { net().as_logic().initial(val); @@ -1041,24 +992,6 @@ ATTR_COLD analog_output_t::analog_output_t(core_device_t &dev, const pstring &an netlist().setup().register_object(dynamic_cast(dev), aname, *this); } -#if 0 -ATTR_COLD analog_output_t::analog_output_t() - : analog_t(OUTPUT), m_proxied_net(nullptr) -{ - this->set_net(&m_my_net); - set_state(STATE_OUT); - - //net().m_cur_Analog = NL_FCONST(0.99); - net().m_cur_Analog = NL_FCONST(0.0); -} -#endif - -ATTR_COLD void analog_output_t::init_object(core_device_t &dev, const pstring &aname) -{ - analog_t::init_object(dev, aname); - net().init_object(dev.netlist(), aname + ".net", this); -} - ATTR_COLD void analog_output_t::initial(const nl_double val) { net().m_cur_Analog = val; diff --git a/src/lib/netlist/nl_base.h b/src/lib/netlist/nl_base.h index 5a1bebbc7c5..0a9fc059650 100644 --- a/src/lib/netlist/nl_base.h +++ b/src/lib/netlist/nl_base.h @@ -411,16 +411,10 @@ namespace netlist P_PREVENT_COPYING(device_object_t) public: ATTR_COLD device_object_t(const type_t atype); - ATTR_COLD device_object_t(core_device_t &dev, const type_t atype); ATTR_COLD device_object_t(core_device_t &dev, const pstring &aname, const type_t atype); ATTR_COLD void init_object(core_device_t &dev, const pstring &aname); - ATTR_COLD void set_device(core_device_t &dev) - { - m_device = &dev; - } - ATTR_HOT core_device_t &device() const { return *m_device; } private: core_device_t * m_device; @@ -451,7 +445,6 @@ namespace netlist ATTR_COLD core_terminal_t(const type_t atype); - ATTR_COLD core_terminal_t(core_device_t &dev, const type_t atype); ATTR_COLD core_terminal_t(core_device_t &dev, const pstring &aname, const type_t atype); ATTR_COLD void set_net(net_t *anet); @@ -485,17 +478,6 @@ namespace netlist { public: - - ATTR_COLD analog_t(const type_t atype) - : core_terminal_t(atype) - { - } - - ATTR_COLD analog_t(core_device_t &dev, const type_t atype) - : core_terminal_t(dev, atype) - { - } - ATTR_COLD analog_t(core_device_t &dev, const pstring &aname, const type_t atype) : core_terminal_t(dev, aname, atype) { @@ -626,7 +608,6 @@ namespace netlist } ATTR_HOT netlist_sig_t Q() const; - ATTR_HOT netlist_sig_t last_Q() const; ATTR_HOT void inactivate(); ATTR_HOT void activate(); @@ -853,10 +834,8 @@ namespace netlist P_PREVENT_COPYING(logic_output_t) public: - //ATTR_COLD logic_output_t(); ATTR_COLD logic_output_t(core_device_t &dev, const pstring &aname); - ATTR_COLD void init_object(core_device_t &dev, const pstring &aname); virtual void reset() override { set_state(STATE_OUT); @@ -875,13 +854,11 @@ namespace netlist class analog_output_t : public analog_t { - //P_PREVENT_COPYING(analog_output_t) + P_PREVENT_COPYING(analog_output_t) public: ATTR_COLD analog_output_t(core_device_t &dev, const pstring &aname); - //ATTR_COLD analog_output_t(); - ATTR_COLD void init_object(core_device_t &dev, const pstring &aname); virtual void reset() override { set_state(STATE_OUT); @@ -1014,8 +991,6 @@ namespace netlist ATTR_HOT netlist_sig_t INPLOGIC(const logic_input_t &inp) const { - //if (inp.state() == logic_t::STATE_INP_PASSIVE) - // printf("argh input %s\n", inp.name().cstr()); nl_assert(inp.state() != logic_t::STATE_INP_PASSIVE); return inp.Q(); } diff --git a/src/lib/netlist/nl_setup.cpp b/src/lib/netlist/nl_setup.cpp index 9934ebf3af1..664e2b3d89b 100644 --- a/src/lib/netlist/nl_setup.cpp +++ b/src/lib/netlist/nl_setup.cpp @@ -105,7 +105,6 @@ void setup_t::register_dev(plib::owned_ptr dev) for (auto & d : netlist().m_devices) if (d->name() == dev->name()) log().fatal("Error adding {1} to device list. Duplicate name \n", d->name()); - printf("dev %s\n", dev->name().cstr()); netlist().m_devices.push_back(std::move(dev)); } diff --git a/src/lib/netlist/plib/plists.h b/src/lib/netlist/plib/plists.h index 9c41cf4aa2b..718aab95cb8 100644 --- a/src/lib/netlist/plib/plists.h +++ b/src/lib/netlist/plib/plists.h @@ -13,6 +13,7 @@ #include #include #include +#include #include "palloc.h" #include "pstring.h" @@ -100,46 +101,38 @@ class uninitialised_array_t public: uninitialised_array_t() { - printf("array size %d align %d - %d %d\n", (int) sizeof(C[N]), (int) alignof(C[N]), (int) sizeof(*this), (int) alignof(*this)); } ~uninitialised_array_t() { for (std::size_t i=0; i(addr(index)); + return *reinterpret_cast(&m_buf[index]); } const C& operator[](const std::size_t &index) const { - return *reinterpret_cast(addr(index)); + return *reinterpret_cast(&m_buf[index]); } template - void emplace(std::size_t index, Args&&... args) + void emplace(const std::size_t index, Args&&... args) { - new (addr(index)) C(std::forward(args)...); + new (&m_buf[index]) C(std::forward(args)...); } protected: private: - void *addr(const std::size_t &index) - { - return reinterpret_cast(&m_buf[0]) + index * sizeof(C); - } /* ensure proper alignment */ - UINT64 m_buf[(N * sizeof(C) + sizeof(UINT64) - 1) / sizeof(UINT64)]; + typename std::aligned_storage::type m_buf[N]; }; // ---------------------------------------------------------------------------------------- From e1f278f891f3bb1b5a9f6d9f8d2b83b88ecfafcc Mon Sep 17 00:00:00 2001 From: couriersud Date: Tue, 31 May 2016 21:36:30 +0200 Subject: [PATCH 22/44] moved all logic inputs into constructor. (nw) --- src/devices/machine/netlist.h | 4 +- src/lib/netlist/devices/nld_4020.cpp | 5 +-- src/lib/netlist/devices/nld_74107.cpp | 10 ++--- src/lib/netlist/devices/nld_74123.cpp | 7 ++- src/lib/netlist/devices/nld_74153.cpp | 18 +++----- src/lib/netlist/devices/nld_74175.cpp | 12 ++--- src/lib/netlist/devices/nld_74192.cpp | 16 +++---- src/lib/netlist/devices/nld_74193.cpp | 16 +++---- src/lib/netlist/devices/nld_7448.cpp | 15 +++---- src/lib/netlist/devices/nld_7450.cpp | 8 ++-- src/lib/netlist/devices/nld_7474.cpp | 8 ++-- src/lib/netlist/devices/nld_7483.cpp | 19 ++++---- src/lib/netlist/devices/nld_7490.cpp | 17 ++++---- src/lib/netlist/devices/nld_7493.cpp | 6 +-- src/lib/netlist/devices/nld_74ls629.cpp | 5 +-- src/lib/netlist/devices/nld_82S16.cpp | 51 +++++++++------------- src/lib/netlist/devices/nld_9310.cpp | 31 +++++++------ src/lib/netlist/devices/nld_9316.cpp | 19 ++++---- src/lib/netlist/devices/nld_legacy.cpp | 7 ++- src/lib/netlist/devices/nld_mm5837.cpp | 4 +- src/lib/netlist/devices/nld_ne555.cpp | 8 ++-- src/lib/netlist/devices/nld_truthtable.h | 4 +- src/lib/netlist/devices/nlid_system.h | 12 +++-- src/lib/netlist/nl_base.cpp | 13 ++++++ src/lib/netlist/nl_base.h | 8 +--- src/lib/netlist/nl_setup.cpp | 6 +-- src/lib/netlist/solver/nld_matrix_solver.h | 2 +- src/lib/netlist/solver/nld_solver.h | 2 +- 28 files changed, 155 insertions(+), 178 deletions(-) diff --git a/src/devices/machine/netlist.h b/src/devices/machine/netlist.h index 9866ff513b9..c4b64204390 100644 --- a/src/devices/machine/netlist.h +++ b/src/devices/machine/netlist.h @@ -627,10 +627,10 @@ class NETLIB_NAME(sound_in) : public netlist::device_t public: NETLIB_NAME(sound_in)(netlist::netlist_t &anetlist, const pstring &name) : netlist::device_t(anetlist, name) + , m_feedback(*this, "FB") // clock part , m_Q(*this, "Q") { - // clock part - enregister("FB", m_feedback); + connect_late(m_feedback, m_Q); m_inc = netlist::netlist_time::from_nsec(1); diff --git a/src/lib/netlist/devices/nld_4020.cpp b/src/lib/netlist/devices/nld_4020.cpp index 5164c18afb9..31fd7ffae85 100644 --- a/src/lib/netlist/devices/nld_4020.cpp +++ b/src/lib/netlist/devices/nld_4020.cpp @@ -19,11 +19,11 @@ namespace netlist { NETLIB_CONSTRUCTOR(CD4020_sub) NETLIB_FAMILY("CD4XXX") + , m_IP(*this, "IP") , m_Q(*this, {"Q1", "_Q2", "_Q3", "Q4", "Q5", "Q6", "Q7", "Q8", "Q9", "Q10", "Q11", "Q12", "Q13", "Q14"}) , m_cnt(0) { - enregister("IP", m_IP); save(NLNAME(m_cnt)); } @@ -50,9 +50,8 @@ namespace netlist NETLIB_FAMILY("CD4XXX") , m_sub(*this, "sub") , m_supply(*this, "supply") + , m_RESET(*this, "RESET") { - - enregister("RESET", m_RESET); register_subalias("IP", m_sub.m_IP); register_subalias("Q1", m_sub.m_Q[0]); register_subalias("Q4", m_sub.m_Q[3]); diff --git a/src/lib/netlist/devices/nld_74107.cpp b/src/lib/netlist/devices/nld_74107.cpp index 471d3a94d10..27b81e14beb 100644 --- a/src/lib/netlist/devices/nld_74107.cpp +++ b/src/lib/netlist/devices/nld_74107.cpp @@ -15,6 +15,7 @@ namespace netlist NETLIB_OBJECT(74107Asub) { NETLIB_CONSTRUCTOR(74107Asub) + , m_clk(*this, "CLK") , m_Q(*this, "Q") , m_QQ(*this, "QQ") , m_Q1(0) @@ -22,8 +23,6 @@ namespace netlist , m_F(0) { - enregister("CLK", m_clk); - save(NLNAME(m_Q1)); save(NLNAME(m_Q2)); save(NLNAME(m_F)); @@ -50,12 +49,11 @@ namespace netlist { NETLIB_CONSTRUCTOR(74107A) , m_sub(*this, "sub") + , m_J(*this, "J") + , m_K(*this, "K") + , m_clrQ(*this, "CLRQ") { - register_subalias("CLK", m_sub.m_clk); - enregister("J", m_J); - enregister("K", m_K); - enregister("CLRQ", m_clrQ); register_subalias("Q", m_sub.m_Q); register_subalias("QQ", m_sub.m_QQ); } diff --git a/src/lib/netlist/devices/nld_74123.cpp b/src/lib/netlist/devices/nld_74123.cpp index 980366d27e1..943fd3e14df 100644 --- a/src/lib/netlist/devices/nld_74123.cpp +++ b/src/lib/netlist/devices/nld_74123.cpp @@ -26,6 +26,9 @@ namespace netlist , m_RN(*this, "RN") , m_RP_Q(*this, "_RP_Q") , m_RN_Q(*this, "_RN_Q") + , m_A(*this, "A") + , m_B(*this, "B") + , m_CLRQ(*this, "CLRQ") , m_Q(*this, "Q") , m_QQ(*this, "QQ") , m_CV(*this, "_CV") // internal @@ -35,10 +38,6 @@ namespace netlist if ((m_dev_type != 9602) && (m_dev_type != 4538) ) m_dev_type = 74123; - enregister("A", m_A); - enregister("B", m_B); - enregister("CLRQ", m_CLRQ); - register_subalias("GND", m_RN.m_R.m_N); register_subalias("VCC", m_RP.m_R.m_P); register_subalias("C", m_RN.m_R.m_N); diff --git a/src/lib/netlist/devices/nld_74153.cpp b/src/lib/netlist/devices/nld_74153.cpp index e98a304c611..2dffd34e1ef 100644 --- a/src/lib/netlist/devices/nld_74153.cpp +++ b/src/lib/netlist/devices/nld_74153.cpp @@ -20,15 +20,11 @@ namespace netlist NETLIB_OBJECT(74153sub) { NETLIB_CONSTRUCTOR(74153sub) + , m_C(*this, {"C0", "C1", "C2", "C3"}) + , m_G(*this, "G") , m_Y(*this, "AY") //FIXME: Change netlists , m_chan(0) { - enregister("C0", m_C[0]); - enregister("C1", m_C[1]); - enregister("C2", m_C[2]); - enregister("C3", m_C[3]); - enregister("G", m_G); - save(NLNAME(m_chan)); } @@ -36,7 +32,7 @@ namespace netlist NETLIB_UPDATEI(); public: - logic_input_t m_C[4]; + object_array_t m_C; logic_input_t m_G; logic_output_t m_Y; @@ -48,14 +44,14 @@ namespace netlist { NETLIB_CONSTRUCTOR(74153) , m_sub(*this, "sub") + , m_A(*this, "A") + , m_B(*this, "B") { register_subalias("C0", m_sub.m_C[0]); register_subalias("C1", m_sub.m_C[1]); register_subalias("C2", m_sub.m_C[2]); register_subalias("C3", m_sub.m_C[3]); - enregister("A", m_A); - enregister("B", m_B); register_subalias("G", m_sub.m_G); register_subalias("AY", m_sub.m_Y); //FIXME: Change netlists @@ -73,10 +69,11 @@ namespace netlist NETLIB_CONSTRUCTOR(74153_dip) , m_1(*this, "1") , m_2(*this, "2") + , m_A(*this, "14") // m_2.m_B + , m_B(*this, "2") // m_2.m_B { register_subalias("1", m_1.m_G); - enregister("2", m_B); // m_2.m_B register_subalias("3", m_1.m_C[3]); register_subalias("4", m_1.m_C[2]); register_subalias("5", m_1.m_C[1]); @@ -89,7 +86,6 @@ namespace netlist register_subalias("12", m_2.m_C[2]); register_subalias("13", m_2.m_C[3]); - enregister("14", m_A); // m_2.m_B register_subalias("15", m_2.m_G); } diff --git a/src/lib/netlist/devices/nld_74175.cpp b/src/lib/netlist/devices/nld_74175.cpp index cda74705bba..22edfb7d5ad 100644 --- a/src/lib/netlist/devices/nld_74175.cpp +++ b/src/lib/netlist/devices/nld_74175.cpp @@ -15,12 +15,11 @@ namespace netlist NETLIB_OBJECT(74175_sub) { NETLIB_CONSTRUCTOR(74175_sub) + , m_CLK(*this, "CLK") , m_Q(*this, {"Q1", "Q2", "Q3", "Q4"}) , m_QQ(*this, {"Q1Q", "Q2Q", "Q3Q", "Q4Q"}) , m_data(0) { - enregister("CLK", m_CLK); - save(NLNAME(m_clrq)); save(NLNAME(m_data)); } @@ -41,24 +40,21 @@ namespace netlist { NETLIB_CONSTRUCTOR(74175) , m_sub(*this, "sub") + , m_D(*this, {"D1", "D2", "D3", "D4"}) + , m_CLRQ(*this, "CLRQ") { register_subalias("CLK", m_sub.m_CLK); - enregister("CLRQ", m_CLRQ); - enregister("D1", m_D[0]); register_subalias("Q1", m_sub.m_Q[0]); register_subalias("Q1Q", m_sub.m_QQ[0]); - enregister("D2", m_D[1]); register_subalias("Q2", m_sub.m_Q[1]); register_subalias("Q2Q", m_sub.m_QQ[1]); - enregister("D3", m_D[2]); register_subalias("Q3", m_sub.m_Q[2]); register_subalias("Q3Q", m_sub.m_QQ[2]); - enregister("D4", m_D[3]); register_subalias("Q4", m_sub.m_Q[3]); register_subalias("Q4Q", m_sub.m_QQ[3]); } @@ -68,7 +64,7 @@ namespace netlist protected: NETLIB_SUB(74175_sub) m_sub; - logic_input_t m_D[4]; + object_array_t m_D; logic_input_t m_CLRQ; }; diff --git a/src/lib/netlist/devices/nld_74192.cpp b/src/lib/netlist/devices/nld_74192.cpp index 91835137469..3b4a15ea090 100644 --- a/src/lib/netlist/devices/nld_74192.cpp +++ b/src/lib/netlist/devices/nld_74192.cpp @@ -17,11 +17,11 @@ namespace netlist NETLIB_OBJECT(74192_subABCD) { NETLIB_CONSTRUCTOR(74192_subABCD) + , m_A(*this, "A") + , m_B(*this, "B") + , m_C(*this, "C") + , m_D(*this, "D") { - enregister("A", m_A); - enregister("B", m_B); - enregister("C", m_C); - enregister("D", m_D); } NETLIB_RESETI() @@ -52,6 +52,10 @@ namespace netlist { NETLIB_CONSTRUCTOR(74192) , m_ABCD(*this, "subABCD") + , m_CLEAR(*this, "CLEAR") + , m_LOADQ(*this, "LOADQ") + , m_CU(*this, "CU") + , m_CD(*this, "CD") , m_Q(*this, {"QA", "QB", "QC", "QD"}) , m_BORROWQ(*this, "BORROWQ") , m_CARRYQ(*this, "CARRYQ") @@ -60,10 +64,6 @@ namespace netlist register_subalias("B", m_ABCD.m_B); register_subalias("C", m_ABCD.m_C); register_subalias("D", m_ABCD.m_D); - enregister("CLEAR", m_CLEAR); - enregister("LOADQ", m_LOADQ); - enregister("CU", m_CU); - enregister("CD", m_CD); save(NLNAME(m_cnt)); save(NLNAME(m_last_CU)); diff --git a/src/lib/netlist/devices/nld_74193.cpp b/src/lib/netlist/devices/nld_74193.cpp index 52a8df5307d..da52e321a14 100644 --- a/src/lib/netlist/devices/nld_74193.cpp +++ b/src/lib/netlist/devices/nld_74193.cpp @@ -17,6 +17,14 @@ namespace netlist NETLIB_OBJECT(74193) { NETLIB_CONSTRUCTOR(74193) + , m_A(*this, "A") + , m_B(*this, "B") + , m_C(*this, "C") + , m_D(*this, "D") + , m_CLEAR(*this, "CLEAR") + , m_LOADQ(*this, "LOADQ") + , m_CU(*this, "CU") + , m_CD(*this, "CD") , m_cnt(0) , m_last_CU(0) , m_last_CD(0) @@ -24,14 +32,6 @@ namespace netlist , m_BORROWQ(*this, "BORROWQ") , m_CARRYQ(*this, "CARRYQ") { - enregister("A", m_A); - enregister("B", m_B); - enregister("C", m_C); - enregister("D", m_D); - enregister("CLEAR", m_CLEAR); - enregister("LOADQ", m_LOADQ); - enregister("CU", m_CU); - enregister("CD", m_CD); save(NLNAME(m_cnt)); save(NLNAME(m_last_CU)); diff --git a/src/lib/netlist/devices/nld_7448.cpp b/src/lib/netlist/devices/nld_7448.cpp index f58ba424f87..d34a0316eb6 100644 --- a/src/lib/netlist/devices/nld_7448.cpp +++ b/src/lib/netlist/devices/nld_7448.cpp @@ -28,17 +28,16 @@ namespace netlist NETLIB_OBJECT(7448) { NETLIB_CONSTRUCTOR(7448) + , m_A(*this, "A") + , m_B(*this, "B") + , m_C(*this, "C") + , m_D(*this, "D") + , m_LTQ(*this, "LTQ") + , m_BIQ(*this, "BIQ") + , m_RBIQ(*this, "RBIQ") , m_state(0) , m_Q(*this, {"a", "b", "c", "d", "e", "f", "g"}) { - enregister("A", m_A); - enregister("B", m_B); - enregister("C", m_C); - enregister("D", m_D); - enregister("LTQ", m_LTQ); - enregister("BIQ", m_BIQ); - enregister("RBIQ", m_RBIQ); - save(NLNAME(m_state)); } diff --git a/src/lib/netlist/devices/nld_7450.cpp b/src/lib/netlist/devices/nld_7450.cpp index d4916c4fa31..548a76c47d7 100644 --- a/src/lib/netlist/devices/nld_7450.cpp +++ b/src/lib/netlist/devices/nld_7450.cpp @@ -15,12 +15,12 @@ namespace netlist NETLIB_OBJECT(7450) { NETLIB_CONSTRUCTOR(7450) + , m_A(*this, "A") + , m_B(*this, "B") + , m_C(*this, "C") + , m_D(*this, "D") , m_Q(*this, "Q") { - enregister("A", m_A); - enregister("B", m_B); - enregister("C", m_C); - enregister("D", m_D); } //NETLIB_RESETI(); NETLIB_UPDATEI(); diff --git a/src/lib/netlist/devices/nld_7474.cpp b/src/lib/netlist/devices/nld_7474.cpp index 8a9370f757a..9d145e91899 100644 --- a/src/lib/netlist/devices/nld_7474.cpp +++ b/src/lib/netlist/devices/nld_7474.cpp @@ -15,11 +15,11 @@ namespace netlist NETLIB_OBJECT(7474sub) { NETLIB_CONSTRUCTOR(7474sub) + , m_CLK(*this, "CLK") , m_Q(*this, "Q") , m_QQ(*this, "QQ") , m_nextD(0) { - enregister("CLK", m_CLK); save(NLNAME(m_nextD)); } @@ -43,11 +43,11 @@ namespace netlist { NETLIB_CONSTRUCTOR(7474) , sub(*this, "sub") + , m_D(*this, "D") + , m_CLRQ(*this, "CLRQ") + , m_PREQ(*this, "PREQ") { register_subalias("CLK", sub.m_CLK); - enregister("D", m_D); - enregister("CLRQ", m_CLRQ); - enregister("PREQ", m_PREQ); register_subalias("Q", sub.m_Q); register_subalias("QQ", sub.m_QQ); diff --git a/src/lib/netlist/devices/nld_7483.cpp b/src/lib/netlist/devices/nld_7483.cpp index 1ae379be631..db23f26d563 100644 --- a/src/lib/netlist/devices/nld_7483.cpp +++ b/src/lib/netlist/devices/nld_7483.cpp @@ -15,6 +15,15 @@ namespace netlist NETLIB_OBJECT(7483) { NETLIB_CONSTRUCTOR(7483) + , m_C0(*this, "C0") + , m_A1(*this, "A1") + , m_A2(*this, "A2") + , m_A3(*this, "A3") + , m_A4(*this, "A4") + , m_B1(*this, "B1") + , m_B2(*this, "B2") + , m_B3(*this, "B3") + , m_B4(*this, "B4") , m_lastr(0) , m_S1(*this, "S1") , m_S2(*this, "S2") @@ -22,16 +31,6 @@ namespace netlist , m_S4(*this, "S4") , m_C4(*this, "C4") { - enregister("A1", m_A1); - enregister("A2", m_A2); - enregister("A3", m_A3); - enregister("A4", m_A4); - enregister("B1", m_B1); - enregister("B2", m_B2); - enregister("B3", m_B3); - enregister("B4", m_B4); - enregister("C0", m_C0); - save(NLNAME(m_lastr)); } NETLIB_RESETI(); diff --git a/src/lib/netlist/devices/nld_7490.cpp b/src/lib/netlist/devices/nld_7490.cpp index 25e87b66826..4cb207e971b 100644 --- a/src/lib/netlist/devices/nld_7490.cpp +++ b/src/lib/netlist/devices/nld_7490.cpp @@ -15,18 +15,17 @@ namespace netlist NETLIB_OBJECT(7490) { NETLIB_CONSTRUCTOR(7490) + , m_A(*this, "A") + , m_B(*this, "B") + , m_R1(*this, "R1") + , m_R2(*this, "R2") + , m_R91(*this, "R91") + , m_R92(*this, "R92") , m_cnt(0) , m_last_A(0) , m_last_B(0) , m_Q(*this, {"QA", "QB", "QC", "QD"}) { - enregister("A", m_A); - enregister("B", m_B); - enregister("R1", m_R1); - enregister("R2", m_R2); - enregister("R91", m_R91); - enregister("R92", m_R92); - save(NLNAME(m_cnt)); save(NLNAME(m_last_A)); save(NLNAME(m_last_B)); @@ -38,12 +37,12 @@ namespace netlist protected: ATTR_HOT void update_outputs(); + logic_input_t m_A; + logic_input_t m_B; logic_input_t m_R1; logic_input_t m_R2; logic_input_t m_R91; logic_input_t m_R92; - logic_input_t m_A; - logic_input_t m_B; UINT8 m_cnt; UINT8 m_last_A; diff --git a/src/lib/netlist/devices/nld_7493.cpp b/src/lib/netlist/devices/nld_7493.cpp index 9fffa5b87b3..b60972d8dad 100644 --- a/src/lib/netlist/devices/nld_7493.cpp +++ b/src/lib/netlist/devices/nld_7493.cpp @@ -17,9 +17,9 @@ namespace netlist NETLIB_OBJECT(7493ff) { NETLIB_CONSTRUCTOR(7493ff) + , m_I(*this, "CLK") , m_Q(*this, "Q") { - enregister("CLK", m_I); save(NLNAME(m_reset)); save(NLNAME(m_state)); @@ -39,6 +39,8 @@ namespace netlist NETLIB_OBJECT(7493) { NETLIB_CONSTRUCTOR(7493) + , m_R1(*this, "R1") + , m_R2(*this, "R2") , A(*this, "A") , B(*this, "B") , C(*this, "C") @@ -46,8 +48,6 @@ namespace netlist { register_subalias("CLKA", A.m_I); register_subalias("CLKB", B.m_I); - enregister("R1", m_R1); - enregister("R2", m_R2); register_subalias("QA", A.m_Q); register_subalias("QB", B.m_Q); diff --git a/src/lib/netlist/devices/nld_74ls629.cpp b/src/lib/netlist/devices/nld_74ls629.cpp index c30ad5a89f6..fc847beda2d 100644 --- a/src/lib/netlist/devices/nld_74ls629.cpp +++ b/src/lib/netlist/devices/nld_74ls629.cpp @@ -50,13 +50,12 @@ namespace netlist NETLIB_OBJECT(SN74LS629clk) { NETLIB_CONSTRUCTOR(SN74LS629clk) + , m_FB(*this, "FB") , m_Y(*this, "Y") , m_enableq(1) , m_out(0) , m_inc(netlist_time::zero) { - enregister("FB", m_FB); - connect_late(m_FB, m_Y); save(NLNAME(m_enableq)); @@ -88,11 +87,11 @@ namespace netlist , m_clock(*this, "OSC") , m_R_FC(*this, "R_FC") , m_R_RNG(*this, "R_RNG") + , m_ENQ(*this, "ENQ") , m_RNG(*this, "RNG") , m_FC(*this, "FC") , m_CAP(*this, "CAP", 1e-6) { - enregister("ENQ", m_ENQ); register_subalias("GND", m_R_FC.m_N); connect_late(m_FC, m_R_FC.m_P); diff --git a/src/lib/netlist/devices/nld_82S16.cpp b/src/lib/netlist/devices/nld_82S16.cpp index b3fdc1bcc10..7a766ff2004 100644 --- a/src/lib/netlist/devices/nld_82S16.cpp +++ b/src/lib/netlist/devices/nld_82S16.cpp @@ -15,33 +15,22 @@ namespace netlist NETLIB_OBJECT(82S16) { NETLIB_CONSTRUCTOR(82S16) + , m_A(*this, { "A0", "A1", "A2", "A3", "A4", "A5", "A6", "A7" }) + , m_CE1Q(*this, "CE1Q") + , m_CE2Q(*this, "CE2Q") + , m_CE3Q(*this, "CE3Q") + , m_WEQ(*this, "WEQ") + , m_DIN(*this, "DIN") , m_DOUTQ(*this, "DOUTQ") { - enregister("A0", m_A[0]); - enregister("A1", m_A[1]); - enregister("A2", m_A[2]); - enregister("A3", m_A[3]); - enregister("A4", m_A[4]); - enregister("A5", m_A[5]); - enregister("A6", m_A[6]); - enregister("A7", m_A[7]); - - enregister("CE1Q", m_CE1Q); - enregister("CE2Q", m_CE2Q); - enregister("CE3Q", m_CE3Q); - - enregister("WEQ", m_WEQ); - enregister("DIN", m_DIN); - save(NLNAME(m_ram)); - } NETLIB_RESETI(); NETLIB_UPDATEI(); protected: - logic_input_t m_A[8]; + object_array_t m_A; logic_input_t m_CE1Q; logic_input_t m_CE2Q; logic_input_t m_CE3Q; @@ -57,21 +46,21 @@ namespace netlist { NETLIB_CONSTRUCTOR_DERIVED(82S16_dip, 82S16) { - enregister("2", m_A[0]); - enregister("1", m_A[1]); - enregister("15", m_A[2]); - enregister("14", m_A[3]); - enregister("7", m_A[4]); - enregister("9", m_A[5]); - enregister("10", m_A[6]); - enregister("11", m_A[7]); + register_subalias("2", m_A[0]); + register_subalias("1", m_A[1]); + register_subalias("15", m_A[2]); + register_subalias("14", m_A[3]); + register_subalias("7", m_A[4]); + register_subalias("9", m_A[5]); + register_subalias("10", m_A[6]); + register_subalias("11", m_A[7]); - enregister("3", m_CE1Q); - enregister("4", m_CE2Q); - enregister("5", m_CE3Q); + register_subalias("3", m_CE1Q); + register_subalias("4", m_CE2Q); + register_subalias("5", m_CE3Q); - enregister("12", m_WEQ); - enregister("13", m_DIN); + register_subalias("12", m_WEQ); + register_subalias("13", m_DIN); register_subalias("6", m_DOUTQ); } diff --git a/src/lib/netlist/devices/nld_9310.cpp b/src/lib/netlist/devices/nld_9310.cpp index 803a765853e..06b5715090a 100644 --- a/src/lib/netlist/devices/nld_9310.cpp +++ b/src/lib/netlist/devices/nld_9310.cpp @@ -17,11 +17,11 @@ namespace netlist NETLIB_OBJECT(9310_subABCD) { NETLIB_CONSTRUCTOR(9310_subABCD) + , m_A(*this, "A") + , m_B(*this, "B") + , m_C(*this, "C") + , m_D(*this, "D") { - enregister("A", m_A); - enregister("B", m_B); - enregister("C", m_C); - enregister("D", m_D); } NETLIB_RESETI(); @@ -43,18 +43,17 @@ namespace netlist NETLIB_OBJECT(9310_sub) { NETLIB_CONSTRUCTOR(9310_sub) - , m_cnt(0) + , m_CLK(*this, "CLK") , m_ABCD(nullptr) - , m_loadq(0) - , m_ent(0) , m_QA(*this, "QA") , m_QB(*this, "QB") , m_QC(*this, "QC") , m_QD(*this, "QD") , m_RC(*this, "RC") + , m_cnt(0) + , m_loadq(0) + , m_ent(0) { - enregister("CLK", m_CLK); - save(NLNAME(m_cnt)); save(NLNAME(m_loadq)); save(NLNAME(m_ent)); @@ -67,16 +66,16 @@ namespace netlist logic_input_t m_CLK; - UINT8 m_cnt; NETLIB_NAME(9310_subABCD) *m_ABCD; - netlist_sig_t m_loadq; - netlist_sig_t m_ent; logic_output_t m_QA; logic_output_t m_QB; logic_output_t m_QC; logic_output_t m_QD; logic_output_t m_RC; + UINT8 m_cnt; + netlist_sig_t m_loadq; + netlist_sig_t m_ent; }; NETLIB_OBJECT(9310) @@ -84,15 +83,15 @@ namespace netlist NETLIB_CONSTRUCTOR(9310) , subABCD(*this, "subABCD") , sub(*this, "sub") + , m_ENP(*this, "ENP") + , m_ENT(*this, "ENT") + , m_CLRQ(*this, "CLRQ") + , m_LOADQ(*this, "LOADQ") { sub.m_ABCD = &(subABCD); register_subalias("CLK", sub.m_CLK); - enregister("ENP", m_ENP); - enregister("ENT", m_ENT); - enregister("CLRQ", m_CLRQ); - enregister("LOADQ", m_LOADQ); register_subalias("A", subABCD.m_A); register_subalias("B", subABCD.m_B); diff --git a/src/lib/netlist/devices/nld_9316.cpp b/src/lib/netlist/devices/nld_9316.cpp index 28dc84b86b6..0943a81be93 100644 --- a/src/lib/netlist/devices/nld_9316.cpp +++ b/src/lib/netlist/devices/nld_9316.cpp @@ -17,11 +17,11 @@ namespace netlist NETLIB_OBJECT(9316_subABCD) { NETLIB_CONSTRUCTOR(9316_subABCD) + , m_A(*this, "A") + , m_B(*this, "B") + , m_C(*this, "C") + , m_D(*this, "D") { - enregister("A", m_A); - enregister("B", m_B); - enregister("C", m_C); - enregister("D", m_D); } NETLIB_RESETI() @@ -51,6 +51,7 @@ namespace netlist NETLIB_OBJECT(9316_sub) { NETLIB_CONSTRUCTOR(9316_sub) + , m_CLK(*this, "CLK") , m_QA(*this, "QA") , m_QB(*this, "QB") , m_QC(*this, "QC") @@ -61,7 +62,6 @@ namespace netlist , m_loadq(0) , m_ent(0) { - enregister("CLK", m_CLK); save(NLNAME(m_cnt)); save(NLNAME(m_loadq)); @@ -94,16 +94,15 @@ namespace netlist NETLIB_CONSTRUCTOR(9316) , sub(*this, "sub") , subABCD(*this, "subABCD") + , m_ENP(*this, "ENP") + , m_ENT(*this, "ENT") + , m_CLRQ(*this, "CLRQ") + , m_LOADQ(*this, "LOADQ") { sub.m_ABCD = &(subABCD); register_subalias("CLK", sub.m_CLK); - enregister("ENP", m_ENP); - enregister("ENT", m_ENT); - enregister("CLRQ", m_CLRQ); - enregister("LOADQ", m_LOADQ); - register_subalias("A", subABCD.m_A); register_subalias("B", subABCD.m_B); register_subalias("C", subABCD.m_C); diff --git a/src/lib/netlist/devices/nld_legacy.cpp b/src/lib/netlist/devices/nld_legacy.cpp index 0093798049c..aaf7c9e25a3 100644 --- a/src/lib/netlist/devices/nld_legacy.cpp +++ b/src/lib/netlist/devices/nld_legacy.cpp @@ -16,11 +16,11 @@ namespace netlist NETLIB_OBJECT(nicRSFF) { NETLIB_CONSTRUCTOR(nicRSFF) + , m_S(*this, "S") + , m_R(*this, "R") , m_Q(*this, "Q") , m_QQ(*this, "QQ") { - enregister("S", m_S); - enregister("R", m_R); } NETLIB_RESETI(); @@ -38,13 +38,12 @@ namespace netlist NETLIB_OBJECT(nicDelay) { NETLIB_CONSTRUCTOR(nicDelay) + , m_I(*this, "1") , m_Q(*this, "2") , m_L_to_H(*this, "L_TO_H", 10) , m_H_to_L(*this, "H_TO_L", 10) , m_last(0) { - enregister("1", m_I); - save(NLNAME(m_last)); } diff --git a/src/lib/netlist/devices/nld_mm5837.cpp b/src/lib/netlist/devices/nld_mm5837.cpp index b44f5dcf9fa..b58cdff3374 100644 --- a/src/lib/netlist/devices/nld_mm5837.cpp +++ b/src/lib/netlist/devices/nld_mm5837.cpp @@ -25,11 +25,11 @@ namespace netlist , m_VGG(*this, "2") , m_VSS(*this, "4") , m_V0(*this, "_Q") + /* clock */ + , m_feedback(*this, "FB") , m_Q(*this, "Q") , m_is_timestep(false) { - /* clock */ - enregister("FB", m_feedback); m_inc = netlist_time::from_hz(56000); connect_late(m_feedback, m_Q); diff --git a/src/lib/netlist/devices/nld_ne555.cpp b/src/lib/netlist/devices/nld_ne555.cpp index cdbb262e2bc..2197beea776 100644 --- a/src/lib/netlist/devices/nld_ne555.cpp +++ b/src/lib/netlist/devices/nld_ne555.cpp @@ -24,15 +24,15 @@ namespace netlist , m_R2(*this, "R2") , m_R3(*this, "R3") , m_RDIS(*this, "RDIS") - , m_THRES(*this, "THRESH") // Pin 6 - , m_TRIG(*this, "TRIG") // Pin 2 - , m_OUT(*this, "OUT") // Pin 3 + , m_RESET(*this, "RESET") // Pin 4 + , m_THRES(*this, "THRESH") // Pin 6 + , m_TRIG(*this, "TRIG") // Pin 2 + , m_OUT(*this, "OUT") // Pin 3 , m_last_out(false) , m_ff(false) { register_subalias("GND", m_R3.m_N); // Pin 1 - enregister("RESET", m_RESET); // Pin 4 register_subalias("CONT", m_R1.m_N); // Pin 5 register_subalias("DISCH", m_RDIS.m_P); // Pin 7 register_subalias("VCC", m_R1.m_P); // Pin 8 diff --git a/src/lib/netlist/devices/nld_truthtable.h b/src/lib/netlist/devices/nld_truthtable.h index f69d7dcc170..5f9f1fc8cb1 100644 --- a/src/lib/netlist/devices/nld_truthtable.h +++ b/src/lib/netlist/devices/nld_truthtable.h @@ -165,9 +165,9 @@ public: for (unsigned i=0; i < m_NI; i++) { - new (&m_I[i]) logic_input_t(); + //new (&m_I[i]) logic_input_t(); inout[i] = inout[i].trim(); - enregister(inout[i], m_I[i]); + m_I.emplace(i, *this, inout[i]); } for (unsigned i=0; i < m_NO; i++) { diff --git a/src/lib/netlist/devices/nlid_system.h b/src/lib/netlist/devices/nlid_system.h index d2ef3cbfa37..e650950bd17 100644 --- a/src/lib/netlist/devices/nlid_system.h +++ b/src/lib/netlist/devices/nlid_system.h @@ -86,10 +86,10 @@ namespace netlist NETLIB_OBJECT(clock) { NETLIB_CONSTRUCTOR(clock) + , m_feedback(*this, "FB") , m_Q(*this, "Q") , m_freq(*this, "FREQ", 7159000.0 * 5.0) { - enregister("FB", m_feedback); m_inc = netlist_time::from_hz(m_freq.Value()*2); @@ -117,10 +117,9 @@ namespace netlist , m_freq(*this, "FREQ", 7159000.0 * 5.0) , m_pattern(*this, "PATTERN", "1,1") , m_offset(*this, "OFFSET", 0.0) + , m_feedback(*this, "FB") , m_Q(*this, "Q") { - enregister("FB", m_feedback); - m_inc[0] = netlist_time::from_hz(m_freq.Value()*2); connect_late(m_feedback, m_Q); @@ -390,12 +389,11 @@ namespace netlist public: NETLIB_CONSTRUCTOR(res_sw) , m_R(*this, "R") + , m_I(*this, "I") , m_RON(*this, "RON", 1.0) , m_ROFF(*this, "ROFF", 1.0E20) , m_last_state(0) { - enregister("I", m_I); - register_subalias("1", m_R.m_P); register_subalias("2", m_R.m_N); @@ -503,9 +501,9 @@ namespace netlist protected: nld_base_d_to_a_proxy(netlist_t &anetlist, const pstring &name, logic_output_t *out_proxied, core_terminal_t &proxy_out) - : nld_base_proxy(anetlist, name, out_proxied, &proxy_out) + : nld_base_proxy(anetlist, name, out_proxied, &proxy_out) + , m_I(*this, "I") { - enregister("I", m_I); } logic_input_t m_I; diff --git a/src/lib/netlist/nl_base.cpp b/src/lib/netlist/nl_base.cpp index 7438b646dda..dd040b4db7b 100644 --- a/src/lib/netlist/nl_base.cpp +++ b/src/lib/netlist/nl_base.cpp @@ -997,6 +997,19 @@ ATTR_COLD void analog_output_t::initial(const nl_double val) net().m_cur_Analog = val; } +// ----------------------------------------------------------------------------- +// logic_input_t +// ----------------------------------------------------------------------------- + +ATTR_COLD logic_input_t::logic_input_t(core_device_t &dev, const pstring &aname) + : logic_t(dev, aname, INPUT) +{ + set_state(STATE_INP_ACTIVE); + set_logic_family(dev.logic_family()); + //init_object(dev, dev.name() + "." + name); + netlist().setup().register_object(dynamic_cast(dev), aname, *this); +} + // ---------------------------------------------------------------------------------------- // param_t & friends // ---------------------------------------------------------------------------------------- diff --git a/src/lib/netlist/nl_base.h b/src/lib/netlist/nl_base.h index 0a9fc059650..0d19136f1ad 100644 --- a/src/lib/netlist/nl_base.h +++ b/src/lib/netlist/nl_base.h @@ -601,11 +601,7 @@ namespace netlist class logic_input_t : public logic_t { public: - ATTR_COLD logic_input_t() - : logic_t(INPUT) - { - set_state(STATE_INP_ACTIVE); - } + ATTR_COLD logic_input_t(core_device_t &dev, const pstring &aname); ATTR_HOT netlist_sig_t Q() const; @@ -1094,7 +1090,7 @@ namespace netlist //ATTR_COLD void enregister(const pstring &name, analog_output_t &out) { register_p(name, out); }; //ATTR_COLD void enregister(const pstring &name, logic_output_t &out) { register_p(name, out); }; //ATTR_COLD void enregister(const pstring &name, analog_input_t &in) { register_p(name, in); }; - ATTR_COLD void enregister(const pstring &name, logic_input_t &in) { register_p(name, in); }; + //ATTR_COLD void enregister(const pstring &name, logic_input_t &in) { register_p(name, in); }; ATTR_COLD void connect_late(const pstring &t1, const pstring &t2); ATTR_COLD void connect_late(core_terminal_t &t1, core_terminal_t &t2); diff --git a/src/lib/netlist/nl_setup.cpp b/src/lib/netlist/nl_setup.cpp index 664e2b3d89b..69a57001827 100644 --- a/src/lib/netlist/nl_setup.cpp +++ b/src/lib/netlist/nl_setup.cpp @@ -273,9 +273,9 @@ void setup_t::register_object(device_t &dev, const pstring &name, object_t &obj) { if (term.is_logic()) { - logic_input_t &port = dynamic_cast(term); - port.set_logic_family(dev.logic_family()); - term.init_object(dev, dev.name() + "." + name); + //logic_input_t &port = dynamic_cast(term); + //port.set_logic_family(dev.logic_family()); + //term.init_object(dev, dev.name() + "." + name); } //term.init_object(dev, dev.name() + "." + name); dev.m_terminals.push_back(obj.name()); diff --git a/src/lib/netlist/solver/nld_matrix_solver.h b/src/lib/netlist/solver/nld_matrix_solver.h index 0e9581b8bc9..fcd503daa08 100644 --- a/src/lib/netlist/solver/nld_matrix_solver.h +++ b/src/lib/netlist/solver/nld_matrix_solver.h @@ -97,10 +97,10 @@ public: m_iterative_total(0), m_params(*params), m_cur_ts(0), + m_fb_sync(*this, "FB_sync"), m_Q_sync(*this, "Q_sync"), m_sort(sort) { - enregister("FB_sync", m_fb_sync); connect_post_start(m_fb_sync, m_Q_sync); save(NLNAME(m_last_step)); diff --git a/src/lib/netlist/solver/nld_solver.h b/src/lib/netlist/solver/nld_solver.h index dc4602b65b0..ba604352aac 100644 --- a/src/lib/netlist/solver/nld_solver.h +++ b/src/lib/netlist/solver/nld_solver.h @@ -57,6 +57,7 @@ class matrix_solver_t; NETLIB_OBJECT(solver) { NETLIB_CONSTRUCTOR(solver) + , m_fb_step(*this, "FB_step") , m_Q_step(*this, "Q_step") , m_sync_delay(*this, "SYNC_DELAY", NLTIME_FROM_NS(10).as_double()) , m_freq(*this, "FREQ", 48000.0) @@ -83,7 +84,6 @@ NETLIB_OBJECT(solver) { // internal staff - enregister("FB_step", m_fb_step); connect_late(m_fb_step, m_Q_step); } From 711d0b871998862b37faccb878b0e94bbc99d133 Mon Sep 17 00:00:00 2001 From: couriersud Date: Tue, 31 May 2016 23:10:37 +0200 Subject: [PATCH 23/44] Completely removed init_object. Finally. (nw) --- src/lib/netlist/nl_base.cpp | 111 +++++++++-------------------------- src/lib/netlist/nl_base.h | 30 ++-------- src/lib/netlist/nl_setup.cpp | 34 +++-------- src/lib/netlist/nl_setup.h | 2 +- 4 files changed, 41 insertions(+), 136 deletions(-) diff --git a/src/lib/netlist/nl_base.cpp b/src/lib/netlist/nl_base.cpp index dd040b4db7b..dc610a99db9 100644 --- a/src/lib/netlist/nl_base.cpp +++ b/src/lib/netlist/nl_base.cpp @@ -154,16 +154,6 @@ void queue_t::on_post_load() // object_t // ---------------------------------------------------------------------------------------- -ATTR_COLD object_t::object_t(const type_t atype) -: m_objtype(atype) -, m_netlist(nullptr) -{} - -ATTR_COLD object_t::object_t(netlist_t &nl, const type_t atype) -: m_objtype(atype) -, m_netlist(&nl) -{} - ATTR_COLD object_t::object_t(netlist_t &nl, const pstring &aname, const type_t atype) : m_name(aname) , m_objtype(atype) @@ -175,16 +165,8 @@ ATTR_COLD object_t::~object_t() { } -ATTR_COLD void object_t::init_object(netlist_t &nl, const pstring &aname) -{ - m_netlist = &nl; - m_name = aname; -} - ATTR_COLD const pstring &object_t::name() const { - if (m_name == "") - netlist().log().fatal("object not initialized"); return m_name; } @@ -192,12 +174,6 @@ ATTR_COLD const pstring &object_t::name() const // device_object_t // ---------------------------------------------------------------------------------------- -ATTR_COLD device_object_t::device_object_t(const type_t atype) -: object_t(atype) -, m_device(nullptr) -{ -} - ATTR_COLD device_object_t::device_object_t(core_device_t &dev, const pstring &aname, const type_t atype) : object_t(dev.netlist(), aname, atype) , m_device(&dev) @@ -205,13 +181,6 @@ ATTR_COLD device_object_t::device_object_t(core_device_t &dev, const pstring &an } -ATTR_COLD void device_object_t::init_object(core_device_t &dev, - const pstring &aname) -{ - object_t::init_object(dev.netlist(), aname); - m_device = &dev; -} - // ---------------------------------------------------------------------------------------- // netlist_t // ---------------------------------------------------------------------------------------- @@ -454,7 +423,7 @@ template class param_template_t; // ---------------------------------------------------------------------------------------- ATTR_COLD core_device_t::core_device_t(netlist_t &owner, const pstring &name) -: object_t(DEVICE), logic_family_t() +: object_t(owner, name, DEVICE), logic_family_t() #if (NL_KEEP_STATISTICS) , stat_total_time(0) , stat_update_count(0) @@ -463,11 +432,11 @@ ATTR_COLD core_device_t::core_device_t(netlist_t &owner, const pstring &name) { if (logic_family() == nullptr) set_logic_family(family_TTL()); - init_object(owner, name); } ATTR_COLD core_device_t::core_device_t(core_device_t &owner, const pstring &name) -: object_t(DEVICE), logic_family_t() + : object_t(owner.netlist(), owner.name() + "." + name, DEVICE) + , logic_family_t() #if (NL_KEEP_STATISTICS) , stat_total_time(0) , stat_update_count(0) @@ -477,7 +446,6 @@ ATTR_COLD core_device_t::core_device_t(core_device_t &owner, const pstring &name set_logic_family(owner.logic_family()); if (logic_family() == nullptr) set_logic_family(family_TTL()); - init_object(owner.netlist(), owner.name() + "." + name); owner.netlist().m_devices.push_back(plib::owned_ptr(this, false)); } @@ -562,7 +530,7 @@ ATTR_COLD void device_t::register_subalias(const pstring &name, const pstring &a ATTR_COLD void device_t::register_p(const pstring &name, object_t &obj) { - setup().register_object(*this, name, obj); + setup().register_object(obj); } ATTR_COLD void device_t::connect_late(core_terminal_t &t1, core_terminal_t &t2) @@ -603,8 +571,15 @@ family_setter_t::family_setter_t(core_device_t &dev, const logic_family_desc_t * // net_t // ---------------------------------------------------------------------------------------- -ATTR_COLD net_t::net_t() - : object_t(NET) +// FIXME: move somewhere central + +struct do_nothing_deleter{ + template void operator()(T*){} +}; + + +ATTR_COLD net_t::net_t(netlist_t &nl, const pstring &aname, core_terminal_t *mr) + : object_t(nl, aname, NET) , m_new_Q(0) , m_cur_Q (0) , m_railterminal(nullptr) @@ -613,23 +588,6 @@ ATTR_COLD net_t::net_t() , m_in_queue(2) , m_cur_Analog(0.0) { -} - -ATTR_COLD net_t::~net_t() -{ - if (isInitialized()) - netlist().remove_save_items(this); -} - -// FIXME: move somewhere central - -struct do_nothing_deleter{ - template void operator()(T*){} -}; - -ATTR_COLD void net_t::init_object(netlist_t &nl, const pstring &aname, core_terminal_t *mr) -{ - object_t::init_object(nl, aname); m_railterminal = mr; if (mr != nullptr) nl.m_nets.push_back(std::shared_ptr(this, do_nothing_deleter())); @@ -644,6 +602,11 @@ ATTR_COLD void net_t::init_object(netlist_t &nl, const pstring &aname, core_term save(NLNAME(m_new_Q)); } +ATTR_COLD net_t::~net_t() +{ + netlist().remove_save_items(this); +} + ATTR_HOT void net_t::inc_active(core_terminal_t &term) { m_active++; @@ -802,8 +765,8 @@ ATTR_COLD void net_t::merge_net(net_t *othernet) // logic_net_t // ---------------------------------------------------------------------------------------- -ATTR_COLD logic_net_t::logic_net_t() - : net_t() +ATTR_COLD logic_net_t::logic_net_t(netlist_t &nl, const pstring &aname, core_terminal_t *mr) + : net_t(nl, aname, mr) { } @@ -817,19 +780,12 @@ ATTR_COLD void logic_net_t::reset() // analog_net_t // ---------------------------------------------------------------------------------------- -ATTR_COLD analog_net_t::analog_net_t() - : net_t() +ATTR_COLD analog_net_t::analog_net_t(netlist_t &nl, const pstring &aname, core_terminal_t *mr) + : net_t(nl, aname, mr) , m_solver(nullptr) { } -ATTR_COLD analog_net_t::analog_net_t(netlist_t &nl, const pstring &aname) - : net_t() - , m_solver(nullptr) -{ - init_object(nl, aname); -} - ATTR_COLD void analog_net_t::reset() { net_t::reset(); @@ -870,14 +826,6 @@ ATTR_COLD void analog_net_t::process_net(plib::pvector_t &groups) // core_terminal_t // ---------------------------------------------------------------------------------------- -ATTR_COLD core_terminal_t::core_terminal_t(const type_t atype) -: device_object_t(atype) -, plinkedlist_element_t() -, m_net(nullptr) -, m_state(STATE_NONEX) -{ -} - ATTR_COLD core_terminal_t::core_terminal_t(core_device_t &dev, const pstring &aname, const type_t atype) : device_object_t(dev, dev.name() + "." + aname, atype) , plinkedlist_element_t() @@ -909,7 +857,7 @@ ATTR_COLD terminal_t::terminal_t(core_device_t &dev, const pstring &aname) , m_go1(nullptr) , m_gt1(nullptr) { - netlist().setup().register_object(dynamic_cast(dev), aname, *this); + netlist().setup().register_object(*this); save(NLNAME(m_Idr1)); save(NLNAME(m_go1)); save(NLNAME(m_gt1)); @@ -953,12 +901,12 @@ ATTR_COLD void terminal_t::reset() ATTR_COLD logic_output_t::logic_output_t(core_device_t &dev, const pstring &aname) : logic_t(dev, aname, OUTPUT) + , m_my_net(dev.netlist(), name() + ".net", this) { set_state(STATE_OUT); this->set_net(&m_my_net); set_logic_family(dev.logic_family()); - net().init_object(dev.netlist(), name() + ".net", this); - netlist().setup().register_object(dynamic_cast(dev), aname, *this); + netlist().setup().register_object(*this); } ATTR_COLD void logic_output_t::initial(const netlist_sig_t val) @@ -974,7 +922,7 @@ ATTR_COLD analog_input_t::analog_input_t(core_device_t &dev, const pstring &anam : analog_t(dev, aname, INPUT) { set_state(STATE_INP_ACTIVE); - netlist().setup().register_object(dynamic_cast(dev), aname, *this); + netlist().setup().register_object(*this); } // ---------------------------------------------------------------------------------------- @@ -983,13 +931,13 @@ ATTR_COLD analog_input_t::analog_input_t(core_device_t &dev, const pstring &anam ATTR_COLD analog_output_t::analog_output_t(core_device_t &dev, const pstring &aname) : analog_t(dev, aname, OUTPUT), m_proxied_net(nullptr) + , m_my_net(dev.netlist(), name() + ".net", this) { this->set_net(&m_my_net); set_state(STATE_OUT); net().m_cur_Analog = NL_FCONST(0.0); - net().init_object(dev.netlist(), name() + ".net", this); - netlist().setup().register_object(dynamic_cast(dev), aname, *this); + netlist().setup().register_object(*this); } ATTR_COLD void analog_output_t::initial(const nl_double val) @@ -1006,8 +954,7 @@ ATTR_COLD logic_input_t::logic_input_t(core_device_t &dev, const pstring &aname) { set_state(STATE_INP_ACTIVE); set_logic_family(dev.logic_family()); - //init_object(dev, dev.name() + "." + name); - netlist().setup().register_object(dynamic_cast(dev), aname, *this); + netlist().setup().register_object(*this); } // ---------------------------------------------------------------------------------------- diff --git a/src/lib/netlist/nl_base.h b/src/lib/netlist/nl_base.h index 0d19136f1ad..14e0ad5bb54 100644 --- a/src/lib/netlist/nl_base.h +++ b/src/lib/netlist/nl_base.h @@ -359,15 +359,10 @@ namespace netlist QUEUE = 6 }; - ATTR_COLD object_t(const type_t atype); - ATTR_COLD object_t(netlist_t &nl, const type_t atype); ATTR_COLD object_t(netlist_t &nl, const pstring &aname, const type_t atype); virtual ~object_t(); - ATTR_COLD void init_object(netlist_t &nl, const pstring &aname); - ATTR_COLD bool isInitialized() { return (m_netlist != nullptr); } - ATTR_COLD const pstring &name() const; ATTR_COLD inline plib::pstate_manager_t *state_manager(); @@ -410,11 +405,7 @@ namespace netlist { P_PREVENT_COPYING(device_object_t) public: - ATTR_COLD device_object_t(const type_t atype); ATTR_COLD device_object_t(core_device_t &dev, const pstring &aname, const type_t atype); - - ATTR_COLD void init_object(core_device_t &dev, const pstring &aname); - ATTR_HOT core_device_t &device() const { return *m_device; } private: core_device_t * m_device; @@ -443,8 +434,6 @@ namespace netlist STATE_NONEX = 256 }; - - ATTR_COLD core_terminal_t(const type_t atype); ATTR_COLD core_terminal_t(core_device_t &dev, const pstring &aname, const type_t atype); ATTR_COLD void set_net(net_t *anet); @@ -566,14 +555,6 @@ namespace netlist class logic_t : public core_terminal_t, public logic_family_t { public: - - - ATTR_COLD logic_t(const type_t atype) - : core_terminal_t(atype), logic_family_t(), - m_proxy(nullptr) - { - } - ATTR_COLD logic_t(core_device_t &dev, const pstring &aname, const type_t atype) : core_terminal_t(dev, aname, atype), logic_family_t(), m_proxy(nullptr) @@ -638,7 +619,7 @@ namespace netlist }; // ----------------------------------------------------------------------------- - // net_net_t + // net_t // ----------------------------------------------------------------------------- class net_t : public object_t @@ -649,11 +630,9 @@ namespace netlist using ptr_t = net_t *; using list_t = plib::pvector_t>; - ATTR_COLD net_t(); + ATTR_COLD net_t(netlist_t &nl, const pstring &aname, core_terminal_t *mr = nullptr); virtual ~net_t(); - ATTR_COLD void init_object(netlist_t &nl, const pstring &aname, core_terminal_t *mr = nullptr); - ATTR_COLD void register_con(core_terminal_t &terminal); ATTR_COLD void merge_net(net_t *othernet); @@ -730,7 +709,7 @@ namespace netlist using list_t = plib::pvector_t; - ATTR_COLD logic_net_t(); + ATTR_COLD logic_net_t(netlist_t &nl, const pstring &aname, core_terminal_t *mr = nullptr); virtual ~logic_net_t() { }; ATTR_HOT netlist_sig_t Q() const @@ -788,8 +767,7 @@ namespace netlist using list_t = plib::pvector_t; - ATTR_COLD analog_net_t(); - ATTR_COLD analog_net_t(netlist_t &nl, const pstring &aname); + ATTR_COLD analog_net_t(netlist_t &nl, const pstring &aname, core_terminal_t *mr = nullptr); virtual ~analog_net_t() { }; diff --git a/src/lib/netlist/nl_setup.cpp b/src/lib/netlist/nl_setup.cpp index 69a57001827..c072e917240 100644 --- a/src/lib/netlist/nl_setup.cpp +++ b/src/lib/netlist/nl_setup.cpp @@ -244,7 +244,7 @@ void setup_t::register_and_set_param(pstring name, param_t ¶m) log().fatal("Error adding parameter {1} to parameter list\n", name); } -void setup_t::register_object(device_t &dev, const pstring &name, object_t &obj) +void setup_t::register_object(object_t &obj) { switch (obj.type()) { @@ -255,38 +255,18 @@ void setup_t::register_object(device_t &dev, const pstring &name, object_t &obj) core_terminal_t &term = dynamic_cast(obj); if (term.isType(terminal_t::OUTPUT)) { - if (term.is_logic()) - { - //logic_output_t &port = dynamic_cast(term); - //port.set_logic_family(dev.logic_family()); - //dynamic_cast(term).init_object(dev, dev.name() + "." + name); - } - else if (term.is_analog()) - { - //log().fatal("Error adding {1} {2} to terminal list, analog output shouldn't get here\n", objtype_as_astr(term), term.name()); - //dynamic_cast(term).init_object(dev, dev.name() + "." + name); - } - else - log().fatal("Error adding {1} {2} to terminal list, neither LOGIC nor ANALOG\n", objtype_as_astr(term), term.name()); } else if (term.isType(terminal_t::INPUT)) { - if (term.is_logic()) - { - //logic_input_t &port = dynamic_cast(term); - //port.set_logic_family(dev.logic_family()); - //term.init_object(dev, dev.name() + "." + name); - } - //term.init_object(dev, dev.name() + "." + name); - dev.m_terminals.push_back(obj.name()); + static_cast(term.device()).m_terminals.push_back(obj.name()); } else { - dev.m_terminals.push_back(obj.name()); + static_cast(term.device()).m_terminals.push_back(obj.name()); } if (!m_terminals.add(term.name(), &term)) - log().fatal("Error adding {1} {2} to terminal list\n", objtype_as_astr(term), term.name()); - log().debug("{1} {2}\n", objtype_as_astr(term), term.name()); + log().fatal("Error adding {1} {2} to terminal list\n", objtype_as_astr(obj), obj.name()); + log().debug("{1} {2}\n", objtype_as_astr(obj), obj.name()); } break; case terminal_t::NET: @@ -298,10 +278,10 @@ void setup_t::register_object(device_t &dev, const pstring &name, object_t &obj) } break; case terminal_t::DEVICE: - log().fatal("Device registration not yet supported - {1}\n", name); + log().fatal("Device registration not yet supported - {1}\n", obj.name()); break; case terminal_t::QUEUE: - log().fatal("QUEUE registration not yet supported - {1}\n", name); + log().fatal("QUEUE registration not yet supported - {1}\n", obj.name()); break; } } diff --git a/src/lib/netlist/nl_setup.h b/src/lib/netlist/nl_setup.h index d7ab1723b79..f9f8721e911 100644 --- a/src/lib/netlist/nl_setup.h +++ b/src/lib/netlist/nl_setup.h @@ -113,7 +113,7 @@ namespace netlist void register_and_set_param(pstring name, param_t ¶m); - void register_object(device_t &dev, const pstring &name, object_t &obj); + void register_object(object_t &obj); template void register_dev_s(plib::owned_ptr dev) From 49ed39b24377a822eb5f1b8b140cd9c30dc244c0 Mon Sep 17 00:00:00 2001 From: couriersud Date: Tue, 31 May 2016 23:49:55 +0200 Subject: [PATCH 24/44] Switch from * to &. (nw) --- src/lib/netlist/nl_base.cpp | 6 +++--- src/lib/netlist/nl_base.h | 21 ++++++--------------- src/lib/netlist/plib/pstate.h | 12 ++++++------ 3 files changed, 15 insertions(+), 24 deletions(-) diff --git a/src/lib/netlist/nl_base.cpp b/src/lib/netlist/nl_base.cpp index dc610a99db9..62ec4f480c3 100644 --- a/src/lib/netlist/nl_base.cpp +++ b/src/lib/netlist/nl_base.cpp @@ -155,9 +155,9 @@ void queue_t::on_post_load() // ---------------------------------------------------------------------------------------- ATTR_COLD object_t::object_t(netlist_t &nl, const pstring &aname, const type_t atype) -: m_name(aname) -, m_objtype(atype) -, m_netlist(&nl) + : m_netlist(nl) + , m_name(aname) + , m_objtype(atype) { } diff --git a/src/lib/netlist/nl_base.h b/src/lib/netlist/nl_base.h index 14e0ad5bb54..a25e5727f91 100644 --- a/src/lib/netlist/nl_base.h +++ b/src/lib/netlist/nl_base.h @@ -360,35 +360,27 @@ namespace netlist }; ATTR_COLD object_t(netlist_t &nl, const pstring &aname, const type_t atype); - virtual ~object_t(); ATTR_COLD const pstring &name() const; - ATTR_COLD inline plib::pstate_manager_t *state_manager(); + ATTR_COLD inline plib::pstate_manager_t &state_manager(); ATTR_HOT type_t type() const { return m_objtype; } - ATTR_HOT bool isType(const type_t atype) const { return (m_objtype == atype); } - ATTR_HOT netlist_t & netlist() { return *m_netlist; } - ATTR_HOT const netlist_t & netlist() const { return *m_netlist; } + ATTR_HOT netlist_t & netlist() { return m_netlist; } + ATTR_HOT const netlist_t & netlist() const { return m_netlist; } - ATTR_COLD void do_reset() - { - reset(); - } + ATTR_COLD void do_reset() { reset(); } protected: - virtual void reset() { } - // must call parent save_register ! - //virtual void save_register() { } private: + netlist_t & m_netlist; pstring m_name; const type_t m_objtype; - netlist_t * m_netlist; public: void * operator new (size_t size, void *ptr) { return ptr; } @@ -613,7 +605,6 @@ namespace netlist protected: virtual void reset() override { - analog_t::reset(); set_state(STATE_INP_ACTIVE); } }; @@ -1279,7 +1270,7 @@ protected: // inline implementations // ----------------------------------------------------------------------------- - ATTR_COLD inline plib::pstate_manager_t *object_t::state_manager() + ATTR_COLD inline plib::pstate_manager_t &object_t::state_manager() { return m_netlist; } diff --git a/src/lib/netlist/plib/pstate.h b/src/lib/netlist/plib/pstate.h index 846bad2cc68..e4b88f7d0f6 100644 --- a/src/lib/netlist/plib/pstate.h +++ b/src/lib/netlist/plib/pstate.h @@ -169,21 +169,21 @@ public: template void save(C &state, const pstring &stname) { - pstate_manager_t *manager = static_cast(this)->state_manager(); + pstate_manager_t &manager = static_cast(this)->state_manager(); pstring module = static_cast(this)->name(); - manager->save_item(state, this, module + "." + stname); + manager.save_item(state, this, module + "." + stname); } template ATTR_COLD void save(C (&state)[N], const pstring &stname) { - pstate_manager_t *manager = static_cast(this)->state_manager(); + pstate_manager_t &manager = static_cast(this)->state_manager(); pstring module = static_cast(this)->name(); - manager->save_state_ptr(module + "." + stname, pstate_datatype::type, this, sizeof(state[0]), N, &(state[0]), false); + manager.save_state_ptr(module + "." + stname, pstate_datatype::type, this, sizeof(state[0]), N, &(state[0]), false); } template ATTR_COLD void save(C *state, const pstring &stname, const int count) { - pstate_manager_t *manager = static_cast(this)->state_manager(); + pstate_manager_t &manager = static_cast(this)->state_manager(); pstring module = static_cast(this)->name(); - manager->save_state_ptr(module + "." + stname, pstate_datatype::type, this, sizeof(C), count, state, false); + manager.save_state_ptr(module + "." + stname, pstate_datatype::type, this, sizeof(C), count, state, false); } }; From a00b7c555492626b612c08ab54e1eb2caeaf16ce Mon Sep 17 00:00:00 2001 From: couriersud Date: Wed, 1 Jun 2016 01:26:38 +0200 Subject: [PATCH 25/44] More code cleanup. (nw) --- src/lib/netlist/nl_base.cpp | 35 ++++++------------ src/lib/netlist/nl_base.h | 69 +++++++++--------------------------- src/lib/netlist/nl_setup.cpp | 67 +++++++++++----------------------- src/lib/netlist/nl_setup.h | 11 ++---- 4 files changed, 50 insertions(+), 132 deletions(-) diff --git a/src/lib/netlist/nl_base.cpp b/src/lib/netlist/nl_base.cpp index 62ec4f480c3..2b9f973e34e 100644 --- a/src/lib/netlist/nl_base.cpp +++ b/src/lib/netlist/nl_base.cpp @@ -176,7 +176,7 @@ ATTR_COLD const pstring &object_t::name() const ATTR_COLD device_object_t::device_object_t(core_device_t &dev, const pstring &aname, const type_t atype) : object_t(dev.netlist(), aname, atype) -, m_device(&dev) +, m_device(dev) { } @@ -237,7 +237,7 @@ ATTR_COLD void netlist_t::start() || setup().factory().is_class(e.second)) { auto dev = plib::owned_ptr(e.second->Create(*this, e.first)); - setup().register_dev_s(std::move(dev)); + setup().register_dev(std::move(dev)); } } @@ -260,7 +260,7 @@ ATTR_COLD void netlist_t::start() && !setup().factory().is_class(e.second)) { auto dev = plib::owned_ptr(e.second->Create(*this, e.first)); - setup().register_dev_s(std::move(dev)); + setup().register_dev(std::move(dev)); } } @@ -302,7 +302,7 @@ ATTR_COLD void netlist_t::reset() // Reset all nets once ! for (std::size_t i = 0; i < m_nets.size(); i++) - m_nets[i]->do_reset(); + m_nets[i]->reset(); // Reset all devices once ! for (auto & dev : m_devices) @@ -528,11 +528,6 @@ ATTR_COLD void device_t::register_subalias(const pstring &name, const pstring &a // m_terminals.add(name); } -ATTR_COLD void device_t::register_p(const pstring &name, object_t &obj) -{ - setup().register_object(obj); -} - ATTR_COLD void device_t::connect_late(core_terminal_t &t1, core_terminal_t &t2) { setup().register_link_fqn(t1.name(), t2.name()); @@ -709,7 +704,7 @@ ATTR_COLD void net_t::reset() m_list_active.add(*ct); for (core_terminal_t *ct : m_core_terms) - ct->do_reset(); + ct->reset(); for (core_terminal_t *ct : m_core_terms) if (ct->state() != logic_t::STATE_INP_PASSIVE) @@ -771,11 +766,6 @@ ATTR_COLD logic_net_t::logic_net_t(netlist_t &nl, const pstring &aname, core_ter } -ATTR_COLD void logic_net_t::reset() -{ - net_t::reset(); -} - // ---------------------------------------------------------------------------------------- // analog_net_t // ---------------------------------------------------------------------------------------- @@ -786,11 +776,6 @@ ATTR_COLD analog_net_t::analog_net_t(netlist_t &nl, const pstring &aname, core_t { } -ATTR_COLD void analog_net_t::reset() -{ - net_t::reset(); -} - ATTR_COLD bool analog_net_t::already_processed(plib::pvector_t &groups) { if (isRailNet()) @@ -857,7 +842,7 @@ ATTR_COLD terminal_t::terminal_t(core_device_t &dev, const pstring &aname) , m_go1(nullptr) , m_gt1(nullptr) { - netlist().setup().register_object(*this); + netlist().setup().register_term(*this); save(NLNAME(m_Idr1)); save(NLNAME(m_go1)); save(NLNAME(m_gt1)); @@ -906,7 +891,7 @@ ATTR_COLD logic_output_t::logic_output_t(core_device_t &dev, const pstring &anam set_state(STATE_OUT); this->set_net(&m_my_net); set_logic_family(dev.logic_family()); - netlist().setup().register_object(*this); + netlist().setup().register_term(*this); } ATTR_COLD void logic_output_t::initial(const netlist_sig_t val) @@ -922,7 +907,7 @@ ATTR_COLD analog_input_t::analog_input_t(core_device_t &dev, const pstring &anam : analog_t(dev, aname, INPUT) { set_state(STATE_INP_ACTIVE); - netlist().setup().register_object(*this); + netlist().setup().register_term(*this); } // ---------------------------------------------------------------------------------------- @@ -937,7 +922,7 @@ ATTR_COLD analog_output_t::analog_output_t(core_device_t &dev, const pstring &an set_state(STATE_OUT); net().m_cur_Analog = NL_FCONST(0.0); - netlist().setup().register_object(*this); + netlist().setup().register_term(*this); } ATTR_COLD void analog_output_t::initial(const nl_double val) @@ -954,7 +939,7 @@ ATTR_COLD logic_input_t::logic_input_t(core_device_t &dev, const pstring &aname) { set_state(STATE_INP_ACTIVE); set_logic_family(dev.logic_family()); - netlist().setup().register_object(*this); + netlist().setup().register_term(*this); } // ---------------------------------------------------------------------------------------- diff --git a/src/lib/netlist/nl_base.h b/src/lib/netlist/nl_base.h index a25e5727f91..c18cc7f4229 100644 --- a/src/lib/netlist/nl_base.h +++ b/src/lib/netlist/nl_base.h @@ -360,7 +360,7 @@ namespace netlist }; ATTR_COLD object_t(netlist_t &nl, const pstring &aname, const type_t atype); - virtual ~object_t(); + ~object_t(); ATTR_COLD const pstring &name() const; @@ -372,11 +372,6 @@ namespace netlist ATTR_HOT netlist_t & netlist() { return m_netlist; } ATTR_HOT const netlist_t & netlist() const { return m_netlist; } - ATTR_COLD void do_reset() { reset(); } - - protected: - virtual void reset() { } - private: netlist_t & m_netlist; pstring m_name; @@ -398,9 +393,9 @@ namespace netlist P_PREVENT_COPYING(device_object_t) public: ATTR_COLD device_object_t(core_device_t &dev, const pstring &aname, const type_t atype); - ATTR_HOT core_device_t &device() const { return *m_device; } + ATTR_HOT core_device_t &device() const { return m_device; } private: - core_device_t * m_device; + core_device_t & m_device; }; @@ -427,6 +422,7 @@ namespace netlist }; ATTR_COLD core_terminal_t(core_device_t &dev, const pstring &aname, const type_t atype); + virtual ~core_terminal_t() { } ATTR_COLD void set_net(net_t *anet); ATTR_COLD void clear_net(); @@ -446,6 +442,9 @@ namespace netlist m_state = astate; } + // FIXME: need to get rid at some point + virtual void reset() { } + private: net_t * m_net; state_e m_state; @@ -464,10 +463,6 @@ namespace netlist { } - virtual void reset() override - { - } - ATTR_HOT inline const analog_net_t & net() const; ATTR_HOT inline analog_net_t & net(); @@ -523,7 +518,7 @@ namespace netlist } protected: - virtual void reset() override; + void reset() override; private: ATTR_HOT void set_ptr(nl_double *ptr, const nl_double val) { @@ -553,10 +548,6 @@ namespace netlist { } - virtual void reset() override - { - } - ATTR_COLD bool has_proxy() const { return (m_proxy != nullptr); } ATTR_COLD devices::nld_base_proxy *get_proxy() const { return m_proxy; } ATTR_COLD void set_proxy(devices::nld_base_proxy *proxy) { m_proxy = proxy; } @@ -586,7 +577,6 @@ namespace netlist protected: virtual void reset() override { - logic_t::reset(); set_state(STATE_INP_ACTIVE); } @@ -624,6 +614,8 @@ namespace netlist ATTR_COLD net_t(netlist_t &nl, const pstring &aname, core_terminal_t *mr = nullptr); virtual ~net_t(); + void reset(); + ATTR_COLD void register_con(core_terminal_t &terminal); ATTR_COLD void merge_net(net_t *othernet); @@ -671,8 +663,6 @@ namespace netlist protected: //FIXME: needed by current solver code - virtual void reset() override; - netlist_sig_t m_new_Q; netlist_sig_t m_cur_Q; @@ -743,12 +733,10 @@ namespace netlist protected: //FIXME: needed by current solver code - virtual void reset() override; + //virtual void reset() override; private: - public: - }; class analog_net_t : public net_t @@ -777,11 +765,6 @@ namespace netlist ATTR_COLD bool already_processed(plib::pvector_t &groups); ATTR_COLD void process_net(plib::pvector_t &groups); - protected: - - virtual void reset() override; - - private: public: @@ -824,13 +807,7 @@ namespace netlist ATTR_COLD analog_output_t(core_device_t &dev, const pstring &aname); - virtual void reset() override - { - set_state(STATE_OUT); - } - ATTR_COLD void initial(const nl_double val); - ATTR_HOT void set_Q(const nl_double newQ); analog_net_t *m_proxied_net; // only for proxy nets in analog input logic @@ -859,12 +836,9 @@ namespace netlist }; ATTR_COLD param_t(const param_type_t atype, device_t &device, const pstring &name); + virtual ~param_t() {} - ATTR_HOT param_type_t param_type() const { return m_param_type; } - - protected: - - virtual void reset() override { } + ATTR_HOT param_type_t param_type() const { return m_param_type; } private: const param_type_t m_param_type; @@ -974,9 +948,7 @@ namespace netlist out.set_Q(val); } - ATTR_HOT virtual void inc_active() { } - - ATTR_HOT virtual void dec_active() { } + ATTR_COLD void do_reset() { reset(); } #if (NL_KEEP_STATISTICS) /* stats */ @@ -989,8 +961,11 @@ namespace netlist ATTR_HOT virtual void update() NOEXCEPT { } ATTR_HOT virtual void stop() { } + ATTR_HOT virtual void reset() { } public: + ATTR_HOT virtual void inc_active() { } + ATTR_HOT virtual void dec_active() { } ATTR_HOT virtual void step_time(ATTR_UNUSED const nl_double st) { } ATTR_HOT virtual void update_terminals() { } @@ -1055,11 +1030,6 @@ namespace netlist ATTR_COLD void register_subalias(const pstring &name, core_terminal_t &term); ATTR_COLD void register_subalias(const pstring &name, const pstring &aliased); - //ATTR_COLD void register_term(const pstring &name, terminal_t &port) { register_p(name, port); } - //ATTR_COLD void enregister(const pstring &name, analog_output_t &out) { register_p(name, out); }; - //ATTR_COLD void enregister(const pstring &name, logic_output_t &out) { register_p(name, out); }; - //ATTR_COLD void enregister(const pstring &name, analog_input_t &in) { register_p(name, in); }; - //ATTR_COLD void enregister(const pstring &name, logic_input_t &in) { register_p(name, in); }; ATTR_COLD void connect_late(const pstring &t1, const pstring &t2); ATTR_COLD void connect_late(core_terminal_t &t1, core_terminal_t &t2); @@ -1072,9 +1042,6 @@ namespace netlist NETLIB_UPDATEI() { } NETLIB_UPDATE_TERMINALSI() { } - template - ATTR_COLD void register_param(const pstring &sname, C ¶m, const T initialVal); - private: ATTR_COLD void register_p(const pstring &name, object_t &obj); ATTR_COLD void register_sub_p(device_t &dev); @@ -1114,8 +1081,6 @@ namespace netlist protected: - void reset() override {} - void register_state(plib::pstate_manager_t &manager, const pstring &module) override; void on_pre_save() override; void on_post_load() override; diff --git a/src/lib/netlist/nl_setup.cpp b/src/lib/netlist/nl_setup.cpp index c072e917240..12f933b2a46 100644 --- a/src/lib/netlist/nl_setup.cpp +++ b/src/lib/netlist/nl_setup.cpp @@ -181,7 +181,7 @@ void setup_t::register_dippins_arr(const pstring &terms) } } -pstring setup_t::objtype_as_astr(object_t &in) const +pstring setup_t::objtype_as_str(object_t &in) const { switch (in.type()) { @@ -218,7 +218,7 @@ void setup_t::register_and_set_param(pstring name, param_t ¶m) double vald = 0; if (sscanf(val.cstr(), "%lf", &vald) != 1) log().fatal("Invalid number conversion {1} : {2}\n", name, val); - dynamic_cast(param).initial(vald); + static_cast(param).initial(vald); } break; case param_t::INTEGER: @@ -227,13 +227,13 @@ void setup_t::register_and_set_param(pstring name, param_t ¶m) double vald = 0; if (sscanf(val.cstr(), "%lf", &vald) != 1) log().fatal("Invalid number conversion {1} : {2}\n", name, val); - dynamic_cast(param).initial((int) vald); + static_cast(param).initial((int) vald); } break; case param_t::STRING: case param_t::MODEL: { - dynamic_cast(param).initial(val); + static_cast(param).initial(val); } break; default: @@ -244,46 +244,22 @@ void setup_t::register_and_set_param(pstring name, param_t ¶m) log().fatal("Error adding parameter {1} to parameter list\n", name); } -void setup_t::register_object(object_t &obj) +void setup_t::register_term(core_terminal_t &term) { - switch (obj.type()) + if (term.isType(terminal_t::OUTPUT)) { - case terminal_t::TERMINAL: - case terminal_t::INPUT: - case terminal_t::OUTPUT: - { - core_terminal_t &term = dynamic_cast(obj); - if (term.isType(terminal_t::OUTPUT)) - { - } - else if (term.isType(terminal_t::INPUT)) - { - static_cast(term.device()).m_terminals.push_back(obj.name()); - } - else - { - static_cast(term.device()).m_terminals.push_back(obj.name()); - } - if (!m_terminals.add(term.name(), &term)) - log().fatal("Error adding {1} {2} to terminal list\n", objtype_as_astr(obj), obj.name()); - log().debug("{1} {2}\n", objtype_as_astr(obj), obj.name()); - } - break; - case terminal_t::NET: - break; - case terminal_t::PARAM: - { - //register_and_set_param(name, dynamic_cast(obj)); - log().fatal("should use register_param"); - } - break; - case terminal_t::DEVICE: - log().fatal("Device registration not yet supported - {1}\n", obj.name()); - break; - case terminal_t::QUEUE: - log().fatal("QUEUE registration not yet supported - {1}\n", obj.name()); - break; } + else if (term.isType(terminal_t::INPUT)) + { + static_cast(term.device()).m_terminals.push_back(term.name()); + } + else + { + static_cast(term.device()).m_terminals.push_back(term.name()); + } + if (!m_terminals.add(term.name(), &term)) + log().fatal("Error adding {1} {2} to terminal list\n", objtype_as_str(term), term.name()); + log().debug("{1} {2}\n", objtype_as_str(term), term.name()); } void setup_t::register_link_arr(const pstring &terms) @@ -499,7 +475,7 @@ devices::nld_base_proxy *setup_t::get_d_a_proxy(core_terminal_t &out) proxy = new_proxy.get(); - register_dev_s(std::move(new_proxy)); + register_dev(std::move(new_proxy)); } return proxy; } @@ -517,7 +493,7 @@ void setup_t::connect_input_output(core_terminal_t &in, core_terminal_t &out) proxy->m_Q.net().register_con(in); out.net().register_con(proxy->m_I); - register_dev_s(std::move(proxy)); + register_dev(std::move(proxy)); } else if (out.is_logic() && in.is_analog()) @@ -560,7 +536,7 @@ void setup_t::connect_terminal_input(terminal_t &term, core_terminal_t &inp) else proxy->m_Q.net().register_con(inp); - register_dev_s(std::move(proxy)); + register_dev(std::move(proxy)); } else { @@ -837,11 +813,10 @@ void setup_t::start_devices() auto nc = factory().factory_by_name("LOG")->Create(netlist(), name); register_link(name + ".I", ll); log().debug(" dynamic link {1}: <{2}>\n",ll, name); - register_dev_s(std::move(nc)); + register_dev(std::move(nc)); } } - netlist().start(); } diff --git a/src/lib/netlist/nl_setup.h b/src/lib/netlist/nl_setup.h index f9f8721e911..bc2f4f994d5 100644 --- a/src/lib/netlist/nl_setup.h +++ b/src/lib/netlist/nl_setup.h @@ -113,14 +113,7 @@ namespace netlist void register_and_set_param(pstring name, param_t ¶m); - void register_object(object_t &obj); - - template - void register_dev_s(plib::owned_ptr dev) - { - register_dev(std::move(dev)); - } - + void register_term(core_terminal_t &obj); void register_dev(plib::owned_ptr dev); void register_dev(const pstring &classname, const pstring &name); @@ -202,7 +195,7 @@ namespace netlist bool connect_input_input(core_terminal_t &t1, core_terminal_t &t2); // helpers - pstring objtype_as_astr(object_t &in) const; + pstring objtype_as_str(object_t &in) const; const pstring resolve_alias(const pstring &name) const; devices::nld_base_proxy *get_d_a_proxy(core_terminal_t &out); From 152ef538b2a2a2883062e84c9952de69b3d53100 Mon Sep 17 00:00:00 2001 From: couriersud Date: Wed, 1 Jun 2016 20:27:48 +0200 Subject: [PATCH 26/44] Changed argument order for save-states. (nw) --- src/devices/machine/netlist.cpp | 6 +++--- src/lib/netlist/nl_base.cpp | 10 +++++----- src/lib/netlist/nl_base.h | 35 ++++++++++++++++++++++++++++----- src/lib/netlist/nl_time.h | 4 ++-- src/lib/netlist/plib/pstate.cpp | 4 ++-- src/lib/netlist/plib/pstate.h | 24 +++++++++++----------- 6 files changed, 54 insertions(+), 29 deletions(-) diff --git a/src/devices/machine/netlist.cpp b/src/devices/machine/netlist.cpp index 8cfba776257..5c3098eb396 100644 --- a/src/devices/machine/netlist.cpp +++ b/src/devices/machine/netlist.cpp @@ -322,9 +322,9 @@ void netlist_mame_device_t::device_start() m_setup->start_devices(); m_setup->resolve_inputs(); - netlist().save_item(m_rem, this, "m_rem"); - netlist().save_item(m_div, this, "m_div"); - netlist().save_item(m_old, this, "m_old"); + netlist().save_item(this, m_rem, "m_rem"); + netlist().save_item(this, m_div, "m_div"); + netlist().save_item(this, m_old, "m_old"); save_state(); diff --git a/src/lib/netlist/nl_base.cpp b/src/lib/netlist/nl_base.cpp index 2b9f973e34e..61269c3964c 100644 --- a/src/lib/netlist/nl_base.cpp +++ b/src/lib/netlist/nl_base.cpp @@ -115,9 +115,9 @@ queue_t::queue_t(netlist_t &nl) void queue_t::register_state(plib::pstate_manager_t &manager, const pstring &module) { netlist().log().debug("register_state\n"); - manager.save_item(m_qsize, this, module + "." + "qsize"); - manager.save_item(&m_times[0], this, module + "." + "times", m_times.size()); - manager.save_item(&(m_names[0].m_buf[0]), this, module + "." + "names", m_names.size() * sizeof(names_t)); + manager.save_item(this, m_qsize, module + "." + "qsize"); + manager.save_item(this, &m_times[0], module + "." + "times", m_times.size()); + manager.save_item(this, &(m_names[0].m_buf[0]), module + "." + "names", m_names.size() * sizeof(names_t)); } void queue_t::on_pre_save() @@ -200,8 +200,8 @@ netlist_t::netlist_t(const pstring &aname) m_log(this), m_lib(nullptr) { - save_item(static_cast(m_queue), this, "m_queue"); - save_item(m_time, this, "m_time"); + save_item(this, static_cast(m_queue), "m_queue"); + save_item(this, m_time, "m_time"); } netlist_t::~netlist_t() diff --git a/src/lib/netlist/nl_base.h b/src/lib/netlist/nl_base.h index c18cc7f4229..04f8a813620 100644 --- a/src/lib/netlist/nl_base.h +++ b/src/lib/netlist/nl_base.h @@ -608,6 +608,8 @@ namespace netlist P_PREVENT_COPYING(net_t) public: + friend class core_device_t; // FIXME + using ptr_t = net_t *; using list_t = plib::pvector_t>; @@ -782,6 +784,8 @@ namespace netlist P_PREVENT_COPYING(logic_output_t) public: + friend class core_device_t; //FIXME + ATTR_COLD logic_output_t(core_device_t &dev, const pstring &aname); virtual void reset() override @@ -934,10 +938,7 @@ namespace netlist return inp.Q(); } - ATTR_HOT void OUTLOGIC(logic_output_t &out, const netlist_sig_t val, const netlist_time &delay) NOEXCEPT - { - out.set_Q(val, delay); - } + ATTR_HOT void OUTLOGIC(logic_output_t &out, const netlist_sig_t val, const netlist_time &delay) NOEXCEPT; ATTR_HOT nl_double INPANALOG(const analog_input_t &inp) const { return inp.Q_Analog(); } @@ -1334,7 +1335,6 @@ protected: } } - ATTR_HOT inline void net_t::push_to_queue(const netlist_time &delay) NOEXCEPT { if (!is_queued() && (num_cons() > 0)) @@ -1401,6 +1401,31 @@ protected: m_queue.remove(&out); } +#if 0 + ATTR_HOT void OUTLOGIC(logic_output_t &out, const netlist_sig_t val, const netlist_time &delay) NOEXCEPT + { + out.set_Q(val, delay); + } +#else + ATTR_HOT inline void core_device_t::OUTLOGIC(logic_output_t &out, const netlist_sig_t val, const netlist_time &delay) NOEXCEPT + { + if (val != out.m_my_net.m_new_Q) + { + out.m_my_net.m_new_Q = val; + if (!out.m_my_net.is_queued() && (out.m_my_net.num_cons() > 0)) + { + out.m_my_net.m_time = netlist().time() + delay; + out.m_my_net.m_in_queue = (out.m_my_net.m_active > 0); /* queued ? */ + if (out.m_my_net.m_in_queue) + { + netlist().push_to_queue(out.m_my_net, out.m_my_net.m_time); + } + } + } + } +#endif + + } NETLIST_SAVE_TYPE(netlist::core_terminal_t::state_e, pstate_data_type_e::DT_INT); diff --git a/src/lib/netlist/nl_time.h b/src/lib/netlist/nl_time.h index 7949f68e132..a420ba2614b 100644 --- a/src/lib/netlist/nl_time.h +++ b/src/lib/netlist/nl_time.h @@ -138,9 +138,9 @@ namespace netlist } namespace plib { -template<> ATTR_COLD inline void pstate_manager_t::save_item(netlist::netlist_time &nlt, const void *owner, const pstring &stname) +template<> ATTR_COLD inline void pstate_manager_t::save_item(const void *owner, netlist::netlist_time &nlt, const pstring &stname) { - save_state_ptr(stname, netlist::netlist_time::STATETYPE, owner, sizeof(netlist::netlist_time::INTERNALTYPE), 1, nlt.get_internaltype_ptr(), false); + save_state_ptr(owner, stname, netlist::netlist_time::STATETYPE, sizeof(netlist::netlist_time::INTERNALTYPE), 1, nlt.get_internaltype_ptr(), false); } } diff --git a/src/lib/netlist/plib/pstate.cpp b/src/lib/netlist/plib/pstate.cpp index bd16ee172e2..a1585f11a62 100644 --- a/src/lib/netlist/plib/pstate.cpp +++ b/src/lib/netlist/plib/pstate.cpp @@ -20,7 +20,7 @@ pstate_manager_t::~pstate_manager_t() -ATTR_COLD void pstate_manager_t::save_state_ptr(const pstring &stname, const pstate_data_type_e dt, const void *owner, const int size, const int count, void *ptr, bool is_ptr) +ATTR_COLD void pstate_manager_t::save_state_ptr(const void *owner, const pstring &stname, const pstate_data_type_e dt, const int size, const int count, void *ptr, bool is_ptr) { pstring fullname = stname; ATTR_UNUSED pstring ts[] = { @@ -68,7 +68,7 @@ ATTR_COLD void pstate_manager_t::post_load() m_save[i]->m_callback->on_post_load(); } -template<> ATTR_COLD void pstate_manager_t::save_item(pstate_callback_t &state, const void *owner, const pstring &stname) +template<> ATTR_COLD void pstate_manager_t::save_item(const void *owner, pstate_callback_t &state, const pstring &stname) { //save_state_ptr(stname, DT_CUSTOM, 0, 1, &state); pstate_callback_t *state_p = &state; diff --git a/src/lib/netlist/plib/pstate.h b/src/lib/netlist/plib/pstate.h index e4b88f7d0f6..9bcf04c8997 100644 --- a/src/lib/netlist/plib/pstate.h +++ b/src/lib/netlist/plib/pstate.h @@ -124,23 +124,23 @@ public: pstate_manager_t(); ~pstate_manager_t(); - template ATTR_COLD void save_item(C &state, const void *owner, const pstring &stname) + template ATTR_COLD void save_item(const void *owner, C &state, const pstring &stname) { - save_state_ptr(stname, pstate_datatype::type, owner, sizeof(C), 1, &state, pstate_datatype::is_ptr); + save_state_ptr( owner, stname, pstate_datatype::type, sizeof(C), 1, &state, pstate_datatype::is_ptr); } - template ATTR_COLD void save_item(C (&state)[N], const void *owner, const pstring &stname) + template ATTR_COLD void save_item(const void *owner, C (&state)[N], const pstring &stname) { - save_state_ptr(stname, pstate_datatype::type, owner, sizeof(state[0]), N, &(state[0]), false); + save_state_ptr(owner, stname, pstate_datatype::type, sizeof(state[0]), N, &(state[0]), false); } - template ATTR_COLD void save_item(C *state, const void *owner, const pstring &stname, const int count) + template ATTR_COLD void save_item(const void *owner, C *state, const pstring &stname, const int count) { - save_state_ptr(stname, pstate_datatype::type, owner, sizeof(C), count, state, false); + save_state_ptr(owner, stname, pstate_datatype::type, sizeof(C), count, state, false); } template - void save_item(std::vector &v, const void *owner, const pstring &stname) + void save_item(const void *owner, std::vector &v, const pstring &stname) { save_state(v.data(), owner, stname, v.size()); } @@ -151,7 +151,7 @@ public: const pstate_entry_t::list_t &save_list() const { return m_save; } - ATTR_COLD void save_state_ptr(const pstring &stname, const pstate_data_type_e, const void *owner, const int size, const int count, void *ptr, bool is_ptr); + ATTR_COLD void save_state_ptr(const void *owner, const pstring &stname, const pstate_data_type_e, const int size, const int count, void *ptr, bool is_ptr); protected: @@ -159,7 +159,7 @@ private: pstate_entry_t::list_t m_save; }; -template<> ATTR_COLD void pstate_manager_t::save_item(pstate_callback_t &state, const void *owner, const pstring &stname); +template<> ATTR_COLD void pstate_manager_t::save_item(const void *owner, pstate_callback_t &state, const pstring &stname); template class pstate_interface_t @@ -171,19 +171,19 @@ public: { pstate_manager_t &manager = static_cast(this)->state_manager(); pstring module = static_cast(this)->name(); - manager.save_item(state, this, module + "." + stname); + manager.save_item(this, state, module + "." + stname); } template ATTR_COLD void save(C (&state)[N], const pstring &stname) { pstate_manager_t &manager = static_cast(this)->state_manager(); pstring module = static_cast(this)->name(); - manager.save_state_ptr(module + "." + stname, pstate_datatype::type, this, sizeof(state[0]), N, &(state[0]), false); + manager.save_state_ptr(this, module + "." + stname, pstate_datatype::type, sizeof(state[0]), N, &(state[0]), false); } template ATTR_COLD void save(C *state, const pstring &stname, const int count) { pstate_manager_t &manager = static_cast(this)->state_manager(); pstring module = static_cast(this)->name(); - manager.save_state_ptr(module + "." + stname, pstate_datatype::type, this, sizeof(C), count, state, false); + manager.save_state_ptr(this, module + "." + stname, pstate_datatype::type, sizeof(C), count, state, false); } }; From 789aa074d280074f1ddde2000a303cb880f0ab2a Mon Sep 17 00:00:00 2001 From: couriersud Date: Wed, 1 Jun 2016 23:55:28 +0200 Subject: [PATCH 27/44] Dead code removal and minor refactoring. (nw) --- src/devices/machine/netlist.h | 2 +- src/lib/netlist/analog/nld_twoterm.h | 2 +- src/lib/netlist/devices/nld_74107.cpp | 2 +- src/lib/netlist/devices/nld_74192.cpp | 10 +- src/lib/netlist/devices/nld_9310.cpp | 12 -- src/lib/netlist/devices/nld_9316.cpp | 10 +- src/lib/netlist/devices/nld_mm5837.cpp | 2 +- src/lib/netlist/devices/nld_system.cpp | 16 +-- src/lib/netlist/devices/nlid_system.h | 2 +- src/lib/netlist/nl_base.cpp | 6 +- src/lib/netlist/nl_base.h | 176 +++++++++---------------- src/lib/netlist/nl_lists.h | 26 +--- src/lib/netlist/plib/pfmtlog.cpp | 25 ---- src/lib/netlist/prg/nlwav.cpp | 17 --- src/lib/netlist/solver/nld_solver.cpp | 14 +- 15 files changed, 79 insertions(+), 243 deletions(-) diff --git a/src/devices/machine/netlist.h b/src/devices/machine/netlist.h index c4b64204390..136921af079 100644 --- a/src/devices/machine/netlist.h +++ b/src/devices/machine/netlist.h @@ -680,7 +680,7 @@ public: m_param[i]->setTo(v * m_param_mult[i]->Value() + m_param_offset[i]->Value()); } m_pos++; - OUTLOGIC(m_Q, !m_Q.net().as_logic().new_Q(), m_inc ); + OUTLOGIC(m_Q, !m_Q.net().new_Q(), m_inc ); } public: diff --git a/src/lib/netlist/analog/nld_twoterm.h b/src/lib/netlist/analog/nld_twoterm.h index 5eecdb05299..c41f6f26151 100644 --- a/src/lib/netlist/analog/nld_twoterm.h +++ b/src/lib/netlist/analog/nld_twoterm.h @@ -130,7 +130,7 @@ public: ATTR_HOT /* inline */ nl_double deltaV() const { - return m_P.net().as_analog().Q_Analog() - m_N.net().as_analog().Q_Analog(); + return m_P.net().Q_Analog() - m_N.net().Q_Analog(); } ATTR_HOT void set_mat(nl_double a11, nl_double a12, nl_double a21, nl_double a22, nl_double r1, nl_double r2) diff --git a/src/lib/netlist/devices/nld_74107.cpp b/src/lib/netlist/devices/nld_74107.cpp index 27b81e14beb..d5d0f94b109 100644 --- a/src/lib/netlist/devices/nld_74107.cpp +++ b/src/lib/netlist/devices/nld_74107.cpp @@ -133,7 +133,7 @@ namespace netlist NETLIB_UPDATE(74107Asub) { - const netlist_sig_t t = m_Q.net().as_logic().Q(); + const netlist_sig_t t = m_Q.net().Q(); newstate(((t ^ 1) & m_Q1) | (t & m_Q2) | m_F); if (m_Q1 ^ 1) m_clk.inactivate(); diff --git a/src/lib/netlist/devices/nld_74192.cpp b/src/lib/netlist/devices/nld_74192.cpp index 3b4a15ea090..e3c6aaf7a51 100644 --- a/src/lib/netlist/devices/nld_74192.cpp +++ b/src/lib/netlist/devices/nld_74192.cpp @@ -24,15 +24,7 @@ namespace netlist { } - NETLIB_RESETI() - { - #if 0 - m_A.inactivate(); - m_B.inactivate(); - m_C.inactivate(); - m_D.inactivate(); - #endif - } + //NETLIB_RESETI() //NETLIB_UPDATEI(); public: diff --git a/src/lib/netlist/devices/nld_9310.cpp b/src/lib/netlist/devices/nld_9310.cpp index 06b5715090a..f022219f54f 100644 --- a/src/lib/netlist/devices/nld_9310.cpp +++ b/src/lib/netlist/devices/nld_9310.cpp @@ -148,12 +148,6 @@ namespace netlist NETLIB_RESET(9310_subABCD) { - #if 0 - m_A.inactivate(); - m_B.inactivate(); - m_C.inactivate(); - m_D.inactivate(); - #endif } NETLIB_RESET(9310_sub) @@ -168,11 +162,6 @@ namespace netlist { if (m_loadq) { - #if 0 - m_cnt = (m_cnt < MAXCNT) ? m_cnt + 1 : 0; - update_outputs(m_cnt); - OUTLOGIC(m_RC, m_ent & (m_cnt == MAXCNT), NLTIME_FROM_NS(20)); - #else switch (m_cnt) { case MAXCNT - 1: @@ -189,7 +178,6 @@ namespace netlist m_cnt++; update_outputs(m_cnt); } - #endif } else { diff --git a/src/lib/netlist/devices/nld_9316.cpp b/src/lib/netlist/devices/nld_9316.cpp index 0943a81be93..87d1f3bad8e 100644 --- a/src/lib/netlist/devices/nld_9316.cpp +++ b/src/lib/netlist/devices/nld_9316.cpp @@ -24,15 +24,7 @@ namespace netlist { } - NETLIB_RESETI() - { - #if 0 - m_A.inactivate(); - m_B.inactivate(); - m_C.inactivate(); - m_D.inactivate(); - #endif - } + //NETLIB_RESETI() //NETLIB_UPDATEI(); public: diff --git a/src/lib/netlist/devices/nld_mm5837.cpp b/src/lib/netlist/devices/nld_mm5837.cpp index b58cdff3374..652bec34d15 100644 --- a/src/lib/netlist/devices/nld_mm5837.cpp +++ b/src/lib/netlist/devices/nld_mm5837.cpp @@ -81,7 +81,7 @@ namespace netlist NETLIB_UPDATE(MM5837_dip) { - OUTLOGIC(m_Q, !m_Q.net().as_logic().new_Q(), m_inc ); + OUTLOGIC(m_Q, !m_Q.net().new_Q(), m_inc ); /* shift register * diff --git a/src/lib/netlist/devices/nld_system.cpp b/src/lib/netlist/devices/nld_system.cpp index ee3d381d422..f0179c137b9 100644 --- a/src/lib/netlist/devices/nld_system.cpp +++ b/src/lib/netlist/devices/nld_system.cpp @@ -30,7 +30,7 @@ namespace netlist NETLIB_UPDATE(clock) { - OUTLOGIC(m_Q, !m_Q.net().as_logic().new_Q(), m_inc ); + OUTLOGIC(m_Q, !m_Q.net().new_Q(), m_inc ); } // ---------------------------------------------------------------------------------------- @@ -46,23 +46,9 @@ namespace netlist NETLIB_UPDATE(extclock) { - #if 0 - if (m_off == netlist_time::zero) - { - OUTLOGIC(m_Q, (m_cnt & 1) ^ 1, m_inc[m_cnt]); - m_cnt = (m_cnt + 1) % m_size; - } - else - { - OUTLOGIC(m_Q, (m_cnt & 1) ^ 1, m_inc[0] + m_off); - m_cnt = 1; - m_off = netlist_time::zero; - } - #else OUTLOGIC(m_Q, (m_cnt & 1) ^ 1, m_inc[m_cnt] + m_off); m_cnt = (m_cnt + 1) % m_size; m_off = netlist_time::zero; - #endif } // ---------------------------------------------------------------------------------------- diff --git a/src/lib/netlist/devices/nlid_system.h b/src/lib/netlist/devices/nlid_system.h index e650950bd17..a57f2484a07 100644 --- a/src/lib/netlist/devices/nlid_system.h +++ b/src/lib/netlist/devices/nlid_system.h @@ -64,7 +64,7 @@ namespace netlist NETLIB_UPDATEI() { - logic_net_t &net = m_Q.net().as_logic(); + logic_net_t &net = m_Q.net(); // this is only called during setup ... net.toggle_new_Q(); net.set_time(netlist().time() + m_inc); diff --git a/src/lib/netlist/nl_base.cpp b/src/lib/netlist/nl_base.cpp index 61269c3964c..2edf847abac 100644 --- a/src/lib/netlist/nl_base.cpp +++ b/src/lib/netlist/nl_base.cpp @@ -347,7 +347,7 @@ ATTR_HOT void netlist_t::process_queue(const netlist_time &delta) m_time = m_stop; } else { - logic_net_t &mc_net = m_mainclock->m_Q.net().as_logic(); + logic_net_t &mc_net = m_mainclock->m_Q.net(); const netlist_time inc = m_mainclock->m_inc; netlist_time mc_time(mc_net.time()); @@ -577,10 +577,10 @@ ATTR_COLD net_t::net_t(netlist_t &nl, const pstring &aname, core_terminal_t *mr) : object_t(nl, aname, NET) , m_new_Q(0) , m_cur_Q (0) - , m_railterminal(nullptr) , m_time(netlist_time::zero) , m_active(0) , m_in_queue(2) + , m_railterminal(nullptr) , m_cur_Analog(0.0) { m_railterminal = mr; @@ -896,7 +896,7 @@ ATTR_COLD logic_output_t::logic_output_t(core_device_t &dev, const pstring &anam ATTR_COLD void logic_output_t::initial(const netlist_sig_t val) { - net().as_logic().initial(val); + net().initial(val); } // ---------------------------------------------------------------------------------------- diff --git a/src/lib/netlist/nl_base.h b/src/lib/netlist/nl_base.h index 04f8a813620..a4599a7b936 100644 --- a/src/lib/netlist/nl_base.h +++ b/src/lib/netlist/nl_base.h @@ -364,7 +364,7 @@ namespace netlist ATTR_COLD const pstring &name() const; - ATTR_COLD inline plib::pstate_manager_t &state_manager(); + ATTR_COLD plib::pstate_manager_t &state_manager(); ATTR_HOT type_t type() const { return m_objtype; } ATTR_HOT bool isType(const type_t atype) const { return (m_objtype == atype); } @@ -463,8 +463,8 @@ namespace netlist { } - ATTR_HOT inline const analog_net_t & net() const; - ATTR_HOT inline analog_net_t & net(); + ATTR_HOT const analog_net_t & net() const; + ATTR_HOT analog_net_t & net(); protected: @@ -552,6 +552,9 @@ namespace netlist ATTR_COLD devices::nld_base_proxy *get_proxy() const { return m_proxy; } ATTR_COLD void set_proxy(devices::nld_base_proxy *proxy) { m_proxy = proxy; } + ATTR_HOT logic_net_t & net() { return reinterpret_cast(core_terminal_t::net()); } + ATTR_HOT const logic_net_t & net() const { return reinterpret_cast(core_terminal_t::net()); }; + protected: private: @@ -567,7 +570,7 @@ namespace netlist public: ATTR_COLD logic_input_t(core_device_t &dev, const pstring &aname); - ATTR_HOT netlist_sig_t Q() const; + ATTR_HOT const netlist_sig_t Q() const; ATTR_HOT void inactivate(); ATTR_HOT void activate(); @@ -624,11 +627,9 @@ namespace netlist ATTR_COLD bool is_logic() const; ATTR_COLD bool is_analog() const; - ATTR_HOT logic_net_t & as_logic(); - ATTR_HOT const logic_net_t & as_logic() const; - - ATTR_HOT analog_net_t & as_analog(); - ATTR_HOT const analog_net_t & as_analog() const; + ATTR_HOT void push_to_queue(const netlist_time &delay) NOEXCEPT; + ATTR_HOT void reschedule_in_queue(const netlist_time &delay) NOEXCEPT; + ATTR_HOT bool is_queued() const { return m_in_queue == 1; } ATTR_HOT void update_devs(); @@ -638,10 +639,6 @@ namespace netlist ATTR_HOT bool isRailNet() const { return !(m_railterminal == nullptr); } ATTR_HOT core_terminal_t & railterminal() const { return *m_railterminal; } - ATTR_HOT void push_to_queue(const netlist_time &delay) NOEXCEPT; - ATTR_HOT void reschedule_in_queue(const netlist_time &delay) NOEXCEPT; - ATTR_HOT bool is_queued() const { return m_in_queue == 1; } - ATTR_HOT int num_cons() const { return m_core_terms.size(); } ATTR_HOT void inc_active(core_terminal_t &term); @@ -653,30 +650,20 @@ namespace netlist plib::pvector_t m_core_terms; // save post-start m_list ... - ATTR_HOT void set_Q_time(const netlist_sig_t &newQ, const netlist_time &at) - { - if (newQ != m_new_Q) - { - m_in_queue = 0; - m_time = at; - } - m_cur_Q = m_new_Q = newQ; - } - protected: //FIXME: needed by current solver code netlist_sig_t m_new_Q; netlist_sig_t m_cur_Q; + netlist_time m_time; + INT32 m_active; + UINT8 m_in_queue; /* 0: not in queue, 1: in queue, 2: last was taken */ + private: core_terminal_t * m_railterminal; plib::linkedlist_t m_list_active; - netlist_time m_time; - INT32 m_active; - UINT8 m_in_queue; /* 0: not in queue, 1: in queue, 2: last was taken */ - public: // We have to have those on one object. Dividing those does lead // to a significant performance hit @@ -695,48 +682,36 @@ namespace netlist ATTR_COLD logic_net_t(netlist_t &nl, const pstring &aname, core_terminal_t *mr = nullptr); virtual ~logic_net_t() { }; - ATTR_HOT netlist_sig_t Q() const - { - return m_cur_Q; - } + ATTR_HOT const netlist_sig_t Q() const { return m_cur_Q; } + ATTR_HOT netlist_sig_t new_Q() const { return m_new_Q; } + ATTR_HOT void toggle_new_Q() { m_new_Q ^= 1; } + ATTR_COLD void initial(const netlist_sig_t val) { m_cur_Q = m_new_Q = val; } - ATTR_HOT netlist_sig_t new_Q() const + ATTR_HOT void set_Q(const netlist_sig_t newQ, const netlist_time &delay) NOEXCEPT { - return m_new_Q; - } - - ATTR_HOT void set_Q(const netlist_sig_t &newQ, const netlist_time &delay) NOEXCEPT - { - if (newQ != m_new_Q) + if (newQ != m_new_Q) { m_new_Q = newQ; push_to_queue(delay); } } - ATTR_HOT void toggle_new_Q() + ATTR_HOT void set_Q_time(const netlist_sig_t newQ, const netlist_time &at) { - m_new_Q ^= 1; - } - - ATTR_COLD void initial(const netlist_sig_t val) - { - m_cur_Q = val; - m_new_Q = val; + if (newQ != m_new_Q) + { + m_in_queue = 0; + m_time = at; + } + m_cur_Q = m_new_Q = newQ; } /* internal state support * FIXME: get rid of this and implement export/import in MAME */ - ATTR_COLD netlist_sig_t &Q_state_ptr() - { - return m_cur_Q; - } - - protected: //FIXME: needed by current solver code - - //virtual void reset() override; + ATTR_COLD netlist_sig_t &Q_state_ptr() { return m_cur_Q; } + protected: private: }; @@ -752,31 +727,21 @@ namespace netlist virtual ~analog_net_t() { }; - ATTR_HOT const nl_double &Q_Analog() const - { - return m_cur_Analog; - } - - ATTR_COLD nl_double &Q_Analog_state_ptr() - { - return m_cur_Analog; - } - + ATTR_HOT nl_double Q_Analog() const { return m_cur_Analog; } + ATTR_COLD nl_double &Q_Analog_state_ptr() { return m_cur_Analog; } + //FIXME: needed by current solver code ATTR_HOT devices::matrix_solver_t *solver() { return m_solver; } + ATTR_COLD void set_solver(devices::matrix_solver_t *solver) { m_solver = solver; } ATTR_COLD bool already_processed(plib::pvector_t &groups); ATTR_COLD void process_net(plib::pvector_t &groups); private: - - public: - - //FIXME: needed by current solver code devices::matrix_solver_t *m_solver; }; // ----------------------------------------------------------------------------- - // net_output_t + // logic_output_t // ----------------------------------------------------------------------------- class logic_output_t : public logic_t @@ -795,9 +760,10 @@ namespace netlist ATTR_COLD void initial(const netlist_sig_t val); - ATTR_HOT void set_Q(const netlist_sig_t newQ, const netlist_time &delay) NOEXCEPT + ATTR_HOT void set_Q(const netlist_sig_t newQ, const netlist_time &delay) NOEXCEPT { - net().as_logic().set_Q(newQ, delay); + //net().set_Q(newQ, delay); + m_my_net.set_Q(newQ, delay); } private: @@ -932,7 +898,7 @@ namespace netlist ATTR_HOT netlist_sig_t INPLOGIC_PASSIVE(logic_input_t &inp); - ATTR_HOT netlist_sig_t INPLOGIC(const logic_input_t &inp) const + ATTR_HOT const netlist_sig_t INPLOGIC(const logic_input_t &inp) const { nl_assert(inp.state() != logic_t::STATE_INP_PASSIVE); return inp.Q(); @@ -1122,9 +1088,9 @@ namespace netlist ATTR_HOT void remove_from_queue(net_t &out); ATTR_HOT void process_queue(const netlist_time &delta); - ATTR_HOT void abort_current_queue_slice() { m_stop = netlist_time::zero; } + ATTR_HOT void abort_current_queue_slice() { m_stop = netlist_time::zero; } - ATTR_HOT const bool &use_deactivate() const { return m_use_deactivate; } + ATTR_HOT bool use_deactivate() const { return m_use_deactivate; } ATTR_COLD void rebuild_lists(); /* must be called after post_load ! */ @@ -1274,37 +1240,12 @@ protected: return dynamic_cast(this) != nullptr; } - ATTR_HOT inline logic_net_t & net_t::as_logic() - { - nl_assert(is_logic()); - return reinterpret_cast(*this); - } - - ATTR_HOT inline const logic_net_t & net_t::as_logic() const - { - nl_assert(is_logic()); - return reinterpret_cast(*this); - } - - ATTR_HOT inline analog_net_t & net_t::as_analog() - { - nl_assert(is_analog()); - return reinterpret_cast(*this); - } - - ATTR_HOT inline const analog_net_t & net_t::as_analog() const - { - nl_assert(is_analog()); - return reinterpret_cast(*this); - } - - ATTR_HOT inline void logic_input_t::inactivate() { if (EXPECTED(!is_state(STATE_INP_PASSIVE))) { set_state(STATE_INP_PASSIVE); - net().as_logic().dec_active(*this); + net().dec_active(*this); } } @@ -1312,7 +1253,7 @@ protected: { if (is_state(STATE_INP_PASSIVE)) { - net().as_logic().inc_active(*this); + net().inc_active(*this); set_state(STATE_INP_ACTIVE); } } @@ -1321,7 +1262,7 @@ protected: { if (is_state(STATE_INP_PASSIVE)) { - net().as_logic().inc_active(*this); + net().inc_active(*this); set_state(STATE_INP_HL); } } @@ -1330,7 +1271,7 @@ protected: { if (is_state(STATE_INP_PASSIVE)) { - net().as_logic().inc_active(*this); + net().inc_active(*this); set_state(STATE_INP_LH); } } @@ -1363,23 +1304,23 @@ protected: ATTR_HOT inline const analog_net_t & analog_t::net() const { - return core_terminal_t::net().as_analog(); + return reinterpret_cast(core_terminal_t::net()); } ATTR_HOT inline analog_net_t & analog_t::net() { - return core_terminal_t::net().as_analog(); + return reinterpret_cast(core_terminal_t::net()); } - ATTR_HOT inline netlist_sig_t logic_input_t::Q() const + ATTR_HOT inline const netlist_sig_t logic_input_t::Q() const { - return net().as_logic().Q(); + return net().Q(); } ATTR_HOT inline nl_double analog_input_t::Q_Analog() const { - return net().as_analog().Q_Analog(); + return net().Q_Analog(); } ATTR_HOT inline void analog_output_t::set_Q(const nl_double newQ) @@ -1401,24 +1342,25 @@ protected: m_queue.remove(&out); } -#if 0 - ATTR_HOT void OUTLOGIC(logic_output_t &out, const netlist_sig_t val, const netlist_time &delay) NOEXCEPT +#if 1 + ATTR_HOT inline void core_device_t::OUTLOGIC(logic_output_t &out, const netlist_sig_t val, const netlist_time &delay) NOEXCEPT { out.set_Q(val, delay); } #else ATTR_HOT inline void core_device_t::OUTLOGIC(logic_output_t &out, const netlist_sig_t val, const netlist_time &delay) NOEXCEPT { - if (val != out.m_my_net.m_new_Q) + logic_net_t &net = out.m_my_net; + if (val != net.m_new_Q) { - out.m_my_net.m_new_Q = val; - if (!out.m_my_net.is_queued() && (out.m_my_net.num_cons() > 0)) + net.m_new_Q = val; + if (!net.is_queued() && (net.num_cons() > 0)) { - out.m_my_net.m_time = netlist().time() + delay; - out.m_my_net.m_in_queue = (out.m_my_net.m_active > 0); /* queued ? */ - if (out.m_my_net.m_in_queue) + net.m_time = netlist().time() + delay; + net.m_in_queue = (net.m_active > 0); /* queued ? */ + if (net.m_in_queue) { - netlist().push_to_queue(out.m_my_net, out.m_my_net.m_time); + netlist().push_to_queue(net, net.m_time); } } } diff --git a/src/lib/netlist/nl_lists.h b/src/lib/netlist/nl_lists.h index bedfc002588..dc5df0c14ea 100644 --- a/src/lib/netlist/nl_lists.h +++ b/src/lib/netlist/nl_lists.h @@ -33,23 +33,10 @@ namespace netlist public: ATTR_HOT entry_t() : m_exec_time(), m_object() {} -#if 0 - ATTR_HOT entry_t(entry_t &&right) NOEXCEPT - : m_exec_time(right.m_exec_time), m_object(right.m_object) {} - ATTR_HOT entry_t(const entry_t &right) NOEXCEPT - : m_exec_time(right.m_exec_time), m_object(right.m_object) {} -#endif ATTR_HOT entry_t(const Time &atime, const Element &elem) NOEXCEPT : m_exec_time(atime), m_object(elem) {} ATTR_HOT const Time &exec_time() const { return m_exec_time; } ATTR_HOT const Element &object() const { return m_object; } -#if 0 - ATTR_HOT entry_t &operator=(const entry_t &right) NOEXCEPT { - m_exec_time = right.m_exec_time; - m_object = right.m_object; - return *this; - } -#endif private: Time m_exec_time; Element m_object; @@ -74,26 +61,15 @@ namespace netlist /* Lock */ while (m_lock.exchange(1)) { } #endif -#if 1 const Time t = e.exec_time(); entry_t * i = m_end++; - for (; t > (i - 1)->exec_time(); i--) + for (; t > (i - 1)->exec_time(); --i) { *(i) = *(i-1); //i--; inc_stat(m_prof_sortmove); } *i = e; -#else - entry_t * i = m_end++; - while (e.exec_time() > (i - 1)->exec_time()) - { - *(i) = *(i-1); - --i; - inc_stat(m_prof_sortmove); - } - *i = e; -#endif inc_stat(m_prof_call); #if HAS_OPENMP && USE_OPENMP m_lock = 0; diff --git a/src/lib/netlist/plib/pfmtlog.cpp b/src/lib/netlist/plib/pfmtlog.cpp index 40ab47209ba..b10ab7f6a2b 100644 --- a/src/lib/netlist/plib/pfmtlog.cpp +++ b/src/lib/netlist/plib/pfmtlog.cpp @@ -48,30 +48,6 @@ pfmt::~pfmt() pfree_array(m_str); } -#if 0 -void pformat::format_element(const char *f, const char *l, const char *fmt_spec, ...) -{ - va_list ap; - va_start(ap, fmt_spec); - char fmt[30] = "%"; - char search[10] = ""; - char buf[1024]; - strcat(fmt, f); - strcat(fmt, l); - strcat(fmt, fmt_spec); - int nl = vsprintf(buf, fmt, ap); - m_arg++; - int sl = sprintf(search, "%%%d", m_arg); - char *p = strstr(m_str, search); - if (p != nullptr) - { - // Make room - memmove(p+nl, p+sl, strlen(p) + 1 - sl); - memcpy(p, buf, nl); - } - va_end(ap); -} -#else void pfmt::format_element(const char *f, const char *l, const char *fmt_spec, ...) { va_list ap; @@ -166,4 +142,3 @@ void pfmt::format_element(const char *f, const char *l, const char *fmt_spec, . } -#endif diff --git a/src/lib/netlist/prg/nlwav.cpp b/src/lib/netlist/prg/nlwav.cpp index 8b53ea8f428..33fc7d0c51a 100644 --- a/src/lib/netlist/prg/nlwav.cpp +++ b/src/lib/netlist/prg/nlwav.cpp @@ -13,15 +13,6 @@ class nlwav_options_t : public plib::options public: nlwav_options_t() : plib::options(), -#if 0 - opt_ttr ("t", "time_to_run", 1.0, "time to run the emulation (seconds)", this), - opt_name("n", "name", "", "netlist in file to run; default is first one", this), - opt_logs("l", "logs", "", "colon separated list of terminals to log", this), - opt_file("f", "file", "-", "file to process (default is stdin)", this), - opt_type("y", "type", "spice", "spice:eagle", "type of file to be converted: spice,eagle", this), - opt_cmd ("c", "cmd", "run", "run|convert|listdevices", this), - opt_inp( "i", "input", "", "input file to process (default is none)", this), -#endif opt_inp( "i", "input", "", "input file", this), opt_out( "o", "output", "", "output file", this), opt_amp( "a", "amp", 10000.0, "amplification after mean correction", this), @@ -29,14 +20,6 @@ public: opt_quiet("q", "quiet", "be quiet - no warnings", this), opt_help("h", "help", "display help", this) {} -#if 0 - option_double opt_ttr; - option_str opt_name; - option_str opt_logs; - option_str opt_file; - poption_str_limit opt_type; - option_str opt_cmd; -#endif plib::option_str opt_inp; plib::option_str opt_out; plib::option_double opt_amp; diff --git a/src/lib/netlist/solver/nld_solver.cpp b/src/lib/netlist/solver/nld_solver.cpp index 8a639db596a..fcf71dcb412 100644 --- a/src/lib/netlist/solver/nld_solver.cpp +++ b/src/lib/netlist/solver/nld_solver.cpp @@ -122,11 +122,11 @@ ATTR_COLD void matrix_solver_t::setup_base(analog_net_t::list_t &nets) for (std::size_t k = 0; k < nets.size(); k++) { - log().debug("setting up net\n"); - analog_net_t *net = nets[k]; - net->m_solver = this; + log().debug("setting up net\n"); + + net->set_solver(this); for (core_terminal_t *p : net->m_core_terms) { @@ -150,7 +150,7 @@ ATTR_COLD void matrix_solver_t::setup_base(analog_net_t::list_t &nets) { analog_output_t *net_proxy_output = nullptr; for (auto & input : m_inps) - if (input->m_proxied_net == &p->net().as_analog()) + if (input->m_proxied_net == &p->net()) { net_proxy_output = input; break; @@ -163,7 +163,8 @@ ATTR_COLD void matrix_solver_t::setup_base(analog_net_t::list_t &nets) net_proxy_output = plib::palloc(*this, this->name() + "." + plib::pfmt("m{1}")(m_inps.size())); m_inps.push_back(net_proxy_output); - net_proxy_output->m_proxied_net = &p->net().as_analog(); + nl_assert(p->net().is_analog()); + net_proxy_output->m_proxied_net = static_cast(&p->net()); } net_proxy_output->net().register_con(*p); // FIXME: repeated @@ -728,7 +729,8 @@ ATTR_COLD void NETLIB_NAME(solver)::post_start() if (!net->isRailNet()) { netlist().log().debug(" ==> not a rail net\n"); - analog_net_t *n = &net->as_analog(); + /* Must be an analog net */ + analog_net_t *n = static_cast(net.get()); if (!n->already_processed(groups)) { groups.push_back(analog_net_t::list_t()); From 96be861b167184ef90be2b9c4a2a026ed22cc0af Mon Sep 17 00:00:00 2001 From: couriersud Date: Thu, 2 Jun 2016 23:22:27 +0200 Subject: [PATCH 28/44] Simplify. Align naming with stl. Fix somed pedantic warnings. (nw) --- src/devices/machine/netlist.cpp | 8 ++--- src/lib/netlist/build/makefile | 2 +- src/lib/netlist/devices/nlid_system.h | 8 ++--- src/lib/netlist/nl_base.cpp | 30 ++++++++-------- src/lib/netlist/nl_base.h | 49 +++++++++++++++------------ src/lib/netlist/nl_lists.h | 36 ++++++-------------- src/lib/netlist/plib/palloc.cpp | 2 +- src/lib/netlist/plib/plists.h | 1 + 8 files changed, 64 insertions(+), 72 deletions(-) diff --git a/src/devices/machine/netlist.cpp b/src/devices/machine/netlist.cpp index 5c3098eb396..e929bfad96e 100644 --- a/src/devices/machine/netlist.cpp +++ b/src/devices/machine/netlist.cpp @@ -511,12 +511,12 @@ ATTR_COLD offs_t netlist_mame_cpu_device_t::disasm_disassemble(char *buffer, off //char tmp[16]; unsigned startpc = pc; int relpc = pc - m_genPC; - if (relpc >= 0 && relpc < netlist().queue().count()) + if (relpc >= 0 && relpc < netlist().queue().size()) { - int dpc = netlist().queue().count() - relpc - 1; + int dpc = netlist().queue().size() - relpc - 1; // FIXME: 50 below fixes crash in mame-debugger. It's based on try on error. - snprintf(buffer, 50, "%c %s @%10.7f", (relpc == 0) ? '*' : ' ', netlist().queue()[dpc].object()->name().cstr(), - netlist().queue()[dpc].exec_time().as_double()); + snprintf(buffer, 50, "%c %s @%10.7f", (relpc == 0) ? '*' : ' ', netlist().queue()[dpc].m_object->name().cstr(), + netlist().queue()[dpc].m_exec_time.as_double()); } else sprintf(buffer, "%s", ""); diff --git a/src/lib/netlist/build/makefile b/src/lib/netlist/build/makefile index 93e54f0e517..af65492711c 100644 --- a/src/lib/netlist/build/makefile +++ b/src/lib/netlist/build/makefile @@ -20,7 +20,7 @@ CDEFS = -DPSTANDALONE=1 -DPTR64=1 #-Werror #CFLAGS = $(LTO) -g -O3 -std=c++98 -Doverride="" -march=native -msse4.2 -Wall -Wpedantic -Wsign-compare -Wextra -Wno-long-long -Wno-unused-parameter -Wno-unused-result -Wno-variadic-macros -I.. #LDFLAGS = $(LTO) -g -O3 -std=c++98 -CFLAGS = $(LTO) -g -O3 -std=c++11 -march=native -I.. -Wall -Wpedantic -Wsign-compare -Wextra -Wno-unused-parameter +CFLAGS = $(LTO) -g -O3 -std=c++11 -march=native -I.. -Wall -Wpedantic -Wsign-compare -Wextra -Wno-unused-parameter LDFLAGS = $(LTO) -g -O3 -std=c++11 -lpthread -ldl CC = @g++-5 diff --git a/src/lib/netlist/devices/nlid_system.h b/src/lib/netlist/devices/nlid_system.h index a57f2484a07..9b5766fbf98 100644 --- a/src/lib/netlist/devices/nlid_system.h +++ b/src/lib/netlist/devices/nlid_system.h @@ -131,13 +131,13 @@ namespace netlist int pati[256]; m_size = pat.size(); int total = 0; - for (int i=0; icount(); + m_qsize = this->size(); netlist().log().debug("current time {1} qsize {2}\n", netlist().time().as_double(), m_qsize); for (int i = 0; i < m_qsize; i++ ) { - m_times[i] = this->listptr()[i].exec_time().as_raw(); - pstring p = this->listptr()[i].object()->name(); + m_times[i] = this->listptr()[i].m_exec_time.as_raw(); + pstring p = this->listptr()[i].m_object->name(); int n = p.len(); n = std::min(63, n); std::strncpy(m_names[i].m_buf, p.cstr(), n); @@ -146,7 +146,7 @@ void queue_t::on_post_load() net_t *n = netlist().find_net(m_names[i].m_buf); //log().debug("Got {1} ==> {2}\n", qtemp[i].m_name, n)); //log().debug("schedule time {1} ({2})\n", n->time().as_double(), netlist_time::from_raw(m_times[i]).as_double())); - this->push(queue_t::entry_t(netlist_time::from_raw(m_times[i]), n)); + this->push({ netlist_time::from_raw(m_times[i]), n }); } } @@ -335,15 +335,15 @@ ATTR_HOT void netlist_t::process_queue(const netlist_time &delta) if (m_mainclock == nullptr) { - while ( (m_time < m_stop) && (m_queue.is_not_empty())) + while ( (m_time < m_stop) && (!m_queue.empty())) { const queue_t::entry_t &e = m_queue.pop(); - m_time = e.exec_time(); - e.object()->update_devs(); + m_time = e.m_exec_time; + e.m_object->update_devs(); add_to_stat(m_perf_out_processed, 1); } - if (m_queue.is_empty()) + if (m_queue.empty()) m_time = m_stop; } else { @@ -353,9 +353,9 @@ ATTR_HOT void netlist_t::process_queue(const netlist_time &delta) while (m_time < m_stop) { - if (m_queue.is_not_empty()) + if (!m_queue.empty()) { - while (m_queue.top().exec_time() > mc_time) + while (m_queue.top().m_exec_time > mc_time) { m_time = mc_time; mc_time += inc; @@ -365,8 +365,8 @@ ATTR_HOT void netlist_t::process_queue(const netlist_time &delta) } const queue_t::entry_t &e = m_queue.pop(); - m_time = e.exec_time(); - e.object()->update_devs(); + m_time = e.m_exec_time; + e.m_object->update_devs(); } else { m_time = mc_time; @@ -634,7 +634,7 @@ ATTR_HOT void net_t::inc_active(core_terminal_t &term) ATTR_HOT void net_t::dec_active(core_terminal_t &term) { - m_active--; + --m_active; nl_assert(m_active >= 0); m_list_active.remove(term); if (m_active == 0 && netlist().use_deactivate()) @@ -656,7 +656,7 @@ ATTR_COLD void net_t::rebuild_list() m_active = cnt; } -ATTR_HOT /* inline */ void net_t::update_devs() +ATTR_HOT void net_t::update_devs() { //assert(m_num_cons != 0); nl_assert(this->isRailNet()); @@ -985,7 +985,7 @@ namespace netlist // mainclock // ---------------------------------------------------------------------------------------- - ATTR_HOT /* inline */ void NETLIB_NAME(mainclock)::mc_update(logic_net_t &net) + ATTR_HOT void NETLIB_NAME(mainclock)::mc_update(logic_net_t &net) { net.toggle_new_Q(); net.update_devs(); diff --git a/src/lib/netlist/nl_base.h b/src/lib/netlist/nl_base.h index a4599a7b936..6e5bf6719af 100644 --- a/src/lib/netlist/nl_base.h +++ b/src/lib/netlist/nl_base.h @@ -426,11 +426,11 @@ namespace netlist ATTR_COLD void set_net(net_t *anet); ATTR_COLD void clear_net(); + ATTR_HOT bool has_net() const { return (m_net != nullptr); } + ATTR_COLD bool is_logic() const; ATTR_COLD bool is_analog() const; - ATTR_HOT bool has_net() const { return (m_net != nullptr); } - ATTR_HOT const net_t & net() const { return *m_net;} ATTR_HOT net_t & net() { return *m_net;} @@ -552,8 +552,8 @@ namespace netlist ATTR_COLD devices::nld_base_proxy *get_proxy() const { return m_proxy; } ATTR_COLD void set_proxy(devices::nld_base_proxy *proxy) { m_proxy = proxy; } - ATTR_HOT logic_net_t & net() { return reinterpret_cast(core_terminal_t::net()); } - ATTR_HOT const logic_net_t & net() const { return reinterpret_cast(core_terminal_t::net()); }; + ATTR_HOT logic_net_t & net(); + ATTR_HOT const logic_net_t & net() const; protected: @@ -570,12 +570,12 @@ namespace netlist public: ATTR_COLD logic_input_t(core_device_t &dev, const pstring &aname); - ATTR_HOT const netlist_sig_t Q() const; + ATTR_HOT netlist_sig_t Q() const; - ATTR_HOT void inactivate(); - ATTR_HOT void activate(); - ATTR_HOT void activate_hl(); - ATTR_HOT void activate_lh(); + ATTR_HOT void inactivate(); + ATTR_HOT void activate(); + ATTR_HOT void activate_hl(); + ATTR_HOT void activate_lh(); protected: virtual void reset() override @@ -650,8 +650,7 @@ namespace netlist plib::pvector_t m_core_terms; // save post-start m_list ... - protected: //FIXME: needed by current solver code - + protected: netlist_sig_t m_new_Q; netlist_sig_t m_cur_Q; @@ -660,9 +659,8 @@ namespace netlist UINT8 m_in_queue; /* 0: not in queue, 1: in queue, 2: last was taken */ private: - - core_terminal_t * m_railterminal; plib::linkedlist_t m_list_active; + core_terminal_t * m_railterminal; public: // We have to have those on one object. Dividing those does lead @@ -682,12 +680,12 @@ namespace netlist ATTR_COLD logic_net_t(netlist_t &nl, const pstring &aname, core_terminal_t *mr = nullptr); virtual ~logic_net_t() { }; - ATTR_HOT const netlist_sig_t Q() const { return m_cur_Q; } + ATTR_HOT netlist_sig_t Q() const { return m_cur_Q; } ATTR_HOT netlist_sig_t new_Q() const { return m_new_Q; } - ATTR_HOT void toggle_new_Q() { m_new_Q ^= 1; } + ATTR_HOT void toggle_new_Q() { m_new_Q ^= 1; } ATTR_COLD void initial(const netlist_sig_t val) { m_cur_Q = m_new_Q = val; } - ATTR_HOT void set_Q(const netlist_sig_t newQ, const netlist_time &delay) NOEXCEPT + ATTR_HOT void set_Q(const netlist_sig_t newQ, const netlist_time &delay) NOEXCEPT { if (newQ != m_new_Q) { @@ -898,7 +896,7 @@ namespace netlist ATTR_HOT netlist_sig_t INPLOGIC_PASSIVE(logic_input_t &inp); - ATTR_HOT const netlist_sig_t INPLOGIC(const logic_input_t &inp) const + ATTR_HOT netlist_sig_t INPLOGIC(const logic_input_t &inp) const { nl_assert(inp.state() != logic_t::STATE_INP_PASSIVE); return inp.Q(); @@ -1304,16 +1302,25 @@ protected: ATTR_HOT inline const analog_net_t & analog_t::net() const { - return reinterpret_cast(core_terminal_t::net()); + return static_cast(core_terminal_t::net()); } ATTR_HOT inline analog_net_t & analog_t::net() { - return reinterpret_cast(core_terminal_t::net()); + return static_cast(core_terminal_t::net()); } + ATTR_HOT inline logic_net_t & logic_t::net() + { + return *static_cast(&core_terminal_t::net()); + } - ATTR_HOT inline const netlist_sig_t logic_input_t::Q() const + ATTR_HOT inline const logic_net_t & logic_t::net() const + { + return static_cast(core_terminal_t::net()); + } + + ATTR_HOT inline netlist_sig_t logic_input_t::Q() const { return net().Q(); } @@ -1334,7 +1341,7 @@ protected: ATTR_HOT inline void netlist_t::push_to_queue(net_t &out, const netlist_time &attime) NOEXCEPT { - m_queue.push(queue_t::entry_t(attime, &out)); + m_queue.push({ attime, &out }); } ATTR_HOT inline void netlist_t::remove_from_queue(net_t &out) diff --git a/src/lib/netlist/nl_lists.h b/src/lib/netlist/nl_lists.h index dc5df0c14ea..67498ce5027 100644 --- a/src/lib/netlist/nl_lists.h +++ b/src/lib/netlist/nl_lists.h @@ -28,16 +28,8 @@ namespace netlist P_PREVENT_COPYING(timed_queue) public: - class entry_t + struct entry_t { - public: - ATTR_HOT entry_t() - : m_exec_time(), m_object() {} - ATTR_HOT entry_t(const Time &atime, const Element &elem) NOEXCEPT - : m_exec_time(atime), m_object(elem) {} - ATTR_HOT const Time &exec_time() const { return m_exec_time; } - ATTR_HOT const Element &object() const { return m_object; } - private: Time m_exec_time; Element m_object; }; @@ -52,8 +44,7 @@ namespace netlist } ATTR_HOT std::size_t capacity() const { return m_list.size(); } - ATTR_HOT bool is_empty() const { return (m_end == &m_list[1]); } - ATTR_HOT bool is_not_empty() const { return (m_end > &m_list[1]); } + ATTR_HOT bool empty() const { return (m_end == &m_list[1]); } ATTR_HOT void push(const entry_t e) NOEXCEPT { @@ -61,9 +52,9 @@ namespace netlist /* Lock */ while (m_lock.exchange(1)) { } #endif - const Time t = e.exec_time(); + const Time t = e.m_exec_time; entry_t * i = m_end++; - for (; t > (i - 1)->exec_time(); --i) + for (; t > (i - 1)->m_exec_time; --i) { *(i) = *(i-1); //i--; @@ -77,15 +68,8 @@ namespace netlist //nl_assert(m_end - m_list < Size); } - ATTR_HOT const entry_t & pop() NOEXCEPT - { - return *(--m_end); - } - - ATTR_HOT const entry_t & top() const NOEXCEPT - { - return *(m_end-1); - } + ATTR_HOT const entry_t & pop() NOEXCEPT { return *(--m_end); } + ATTR_HOT const entry_t & top() const NOEXCEPT { return *(m_end-1); } ATTR_HOT void remove(const Element &elem) NOEXCEPT { @@ -95,7 +79,7 @@ namespace netlist #endif for (entry_t * i = m_end - 1; i > &m_list[0]; i--) { - if (i->object() == elem) + if (i->m_object == elem) { m_end--; while (i < m_end) @@ -121,15 +105,15 @@ namespace netlist * the insert algo above will run into this element and doesn't * need a comparison with queue start. */ - m_list[0] = entry_t(Time::from_raw(~0), Element(0)); + m_list[0] = { Time::from_raw(~0), Element(0) }; m_end++; } // save state support & mame disasm ATTR_COLD const entry_t *listptr() const { return &m_list[1]; } - ATTR_HOT int count() const { return m_end - &m_list[1]; } - ATTR_HOT const entry_t & operator[](const int & index) const { return m_list[1+index]; } + ATTR_HOT std::size_t size() const { return m_end - &m_list[1]; } + ATTR_HOT const entry_t & operator[](const std::size_t index) const { return m_list[1+index]; } #if (NL_KEEP_STATISTICS) // profiling diff --git a/src/lib/netlist/plib/palloc.cpp b/src/lib/netlist/plib/palloc.cpp index f58da749792..b6d0f37b7ef 100644 --- a/src/lib/netlist/plib/palloc.cpp +++ b/src/lib/netlist/plib/palloc.cpp @@ -52,7 +52,7 @@ int mempool::new_block() void *mempool::alloc(size_t size) { size_t rs = (size + sizeof(info) + m_min_align - 1) & ~(m_min_align - 1); - for (int bn=0; bn < m_blocks.size(); bn++) + for (size_t bn=0; bn < m_blocks.size(); bn++) { auto &b = m_blocks[bn]; if (b.m_free > rs) diff --git a/src/lib/netlist/plib/plists.h b/src/lib/netlist/plib/plists.h index 718aab95cb8..7237ef4f8cf 100644 --- a/src/lib/netlist/plib/plists.h +++ b/src/lib/netlist/plib/plists.h @@ -14,6 +14,7 @@ #include #include #include +#include #include "palloc.h" #include "pstring.h" From 61110b72c1379a0015854992195e89ded462fd2b Mon Sep 17 00:00:00 2001 From: couriersud Date: Fri, 3 Jun 2016 00:00:56 +0200 Subject: [PATCH 29/44] More simplification. --- src/lib/netlist/nl_base.cpp | 4 ++-- src/lib/netlist/nl_base.h | 22 +--------------------- src/lib/netlist/nl_lists.h | 7 +++---- 3 files changed, 6 insertions(+), 27 deletions(-) diff --git a/src/lib/netlist/nl_base.cpp b/src/lib/netlist/nl_base.cpp index 757d3ffcc8d..71e3e000471 100644 --- a/src/lib/netlist/nl_base.cpp +++ b/src/lib/netlist/nl_base.cpp @@ -19,7 +19,7 @@ namespace netlist { #if (NL_USE_MEMPOOL) -static plib::pmempool p(65536, 16); +static plib::mempool p(65536, 8); void * object_t::operator new (size_t size) { @@ -146,7 +146,7 @@ void queue_t::on_post_load() net_t *n = netlist().find_net(m_names[i].m_buf); //log().debug("Got {1} ==> {2}\n", qtemp[i].m_name, n)); //log().debug("schedule time {1} ({2})\n", n->time().as_double(), netlist_time::from_raw(m_times[i]).as_double())); - this->push({ netlist_time::from_raw(m_times[i]), n }); + this->push(netlist_time::from_raw(m_times[i]), n); } } diff --git a/src/lib/netlist/nl_base.h b/src/lib/netlist/nl_base.h index 6e5bf6719af..14b6ed17e61 100644 --- a/src/lib/netlist/nl_base.h +++ b/src/lib/netlist/nl_base.h @@ -1341,7 +1341,7 @@ protected: ATTR_HOT inline void netlist_t::push_to_queue(net_t &out, const netlist_time &attime) NOEXCEPT { - m_queue.push({ attime, &out }); + m_queue.push(attime, &out); } ATTR_HOT inline void netlist_t::remove_from_queue(net_t &out) @@ -1349,30 +1349,10 @@ protected: m_queue.remove(&out); } -#if 1 ATTR_HOT inline void core_device_t::OUTLOGIC(logic_output_t &out, const netlist_sig_t val, const netlist_time &delay) NOEXCEPT { out.set_Q(val, delay); } -#else - ATTR_HOT inline void core_device_t::OUTLOGIC(logic_output_t &out, const netlist_sig_t val, const netlist_time &delay) NOEXCEPT - { - logic_net_t &net = out.m_my_net; - if (val != net.m_new_Q) - { - net.m_new_Q = val; - if (!net.is_queued() && (net.num_cons() > 0)) - { - net.m_time = netlist().time() + delay; - net.m_in_queue = (net.m_active > 0); /* queued ? */ - if (net.m_in_queue) - { - netlist().push_to_queue(net, net.m_time); - } - } - } - } -#endif } diff --git a/src/lib/netlist/nl_lists.h b/src/lib/netlist/nl_lists.h index 67498ce5027..20e2392243e 100644 --- a/src/lib/netlist/nl_lists.h +++ b/src/lib/netlist/nl_lists.h @@ -46,13 +46,12 @@ namespace netlist ATTR_HOT std::size_t capacity() const { return m_list.size(); } ATTR_HOT bool empty() const { return (m_end == &m_list[1]); } - ATTR_HOT void push(const entry_t e) NOEXCEPT + ATTR_HOT void push(const Time t, Element o) NOEXCEPT { #if HAS_OPENMP && USE_OPENMP /* Lock */ while (m_lock.exchange(1)) { } #endif - const Time t = e.m_exec_time; entry_t * i = m_end++; for (; t > (i - 1)->m_exec_time; --i) { @@ -60,7 +59,7 @@ namespace netlist //i--; inc_stat(m_prof_sortmove); } - *i = e; + *i = { t, o }; inc_stat(m_prof_call); #if HAS_OPENMP && USE_OPENMP m_lock = 0; @@ -85,7 +84,7 @@ namespace netlist while (i < m_end) { *i = *(i+1); - i++; + ++i; } #if HAS_OPENMP && USE_OPENMP m_lock = 0; From d9469566522853fe44ca479eb0502d5bb3137413 Mon Sep 17 00:00:00 2001 From: couriersud Date: Fri, 3 Jun 2016 01:04:12 +0200 Subject: [PATCH 30/44] Fix clang build. More STL. (nw) --- src/lib/netlist/devices/net_lib.cpp | 1 + src/lib/netlist/devices/nld_4020.cpp | 4 +-- src/lib/netlist/devices/nld_74153.cpp | 2 +- src/lib/netlist/devices/nld_74175.cpp | 6 ++-- src/lib/netlist/devices/nld_74192.cpp | 2 +- src/lib/netlist/devices/nld_74193.cpp | 2 +- src/lib/netlist/devices/nld_7448.cpp | 2 +- src/lib/netlist/devices/nld_7490.cpp | 2 +- src/lib/netlist/devices/nld_82S16.cpp | 2 +- src/lib/netlist/nl_base.cpp | 1 + src/lib/netlist/plib/plists.h | 9 ------ src/lib/netlist/solver/nld_matrix_solver.h | 23 ++++++++++++-- src/lib/netlist/solver/nld_solver.cpp | 37 +++++++++++----------- src/lib/netlist/solver/nld_solver.h | 22 ++----------- 14 files changed, 55 insertions(+), 60 deletions(-) diff --git a/src/lib/netlist/devices/net_lib.cpp b/src/lib/netlist/devices/net_lib.cpp index 2a481daaf5d..15ae8bfed71 100644 --- a/src/lib/netlist/devices/net_lib.cpp +++ b/src/lib/netlist/devices/net_lib.cpp @@ -11,6 +11,7 @@ #include "net_lib.h" #include "nld_system.h" #include "nl_factory.h" +#include "solver/nld_solver.h" NETLIST_START(diode_models) NET_MODEL("D _(IS=1e-15 N=1)") diff --git a/src/lib/netlist/devices/nld_4020.cpp b/src/lib/netlist/devices/nld_4020.cpp index 31fd7ffae85..47c01375711 100644 --- a/src/lib/netlist/devices/nld_4020.cpp +++ b/src/lib/netlist/devices/nld_4020.cpp @@ -20,8 +20,8 @@ namespace netlist NETLIB_CONSTRUCTOR(CD4020_sub) NETLIB_FAMILY("CD4XXX") , m_IP(*this, "IP") - , m_Q(*this, {"Q1", "_Q2", "_Q3", "Q4", "Q5", "Q6", "Q7", "Q8", "Q9", - "Q10", "Q11", "Q12", "Q13", "Q14"}) + , m_Q(*this, {{"Q1", "_Q2", "_Q3", "Q4", "Q5", "Q6", "Q7", "Q8", "Q9", + "Q10", "Q11", "Q12", "Q13", "Q14"}}) , m_cnt(0) { save(NLNAME(m_cnt)); diff --git a/src/lib/netlist/devices/nld_74153.cpp b/src/lib/netlist/devices/nld_74153.cpp index 2dffd34e1ef..32497c627e3 100644 --- a/src/lib/netlist/devices/nld_74153.cpp +++ b/src/lib/netlist/devices/nld_74153.cpp @@ -20,7 +20,7 @@ namespace netlist NETLIB_OBJECT(74153sub) { NETLIB_CONSTRUCTOR(74153sub) - , m_C(*this, {"C0", "C1", "C2", "C3"}) + , m_C(*this, {{"C0", "C1", "C2", "C3"}}) , m_G(*this, "G") , m_Y(*this, "AY") //FIXME: Change netlists , m_chan(0) diff --git a/src/lib/netlist/devices/nld_74175.cpp b/src/lib/netlist/devices/nld_74175.cpp index 22edfb7d5ad..ad27d75b7fd 100644 --- a/src/lib/netlist/devices/nld_74175.cpp +++ b/src/lib/netlist/devices/nld_74175.cpp @@ -16,8 +16,8 @@ namespace netlist { NETLIB_CONSTRUCTOR(74175_sub) , m_CLK(*this, "CLK") - , m_Q(*this, {"Q1", "Q2", "Q3", "Q4"}) - , m_QQ(*this, {"Q1Q", "Q2Q", "Q3Q", "Q4Q"}) + , m_Q(*this, {{"Q1", "Q2", "Q3", "Q4"}}) + , m_QQ(*this, {{"Q1Q", "Q2Q", "Q3Q", "Q4Q"}}) , m_data(0) { save(NLNAME(m_clrq)); @@ -40,7 +40,7 @@ namespace netlist { NETLIB_CONSTRUCTOR(74175) , m_sub(*this, "sub") - , m_D(*this, {"D1", "D2", "D3", "D4"}) + , m_D(*this, {{"D1", "D2", "D3", "D4"}}) , m_CLRQ(*this, "CLRQ") { register_subalias("CLK", m_sub.m_CLK); diff --git a/src/lib/netlist/devices/nld_74192.cpp b/src/lib/netlist/devices/nld_74192.cpp index e3c6aaf7a51..75ad7be71f5 100644 --- a/src/lib/netlist/devices/nld_74192.cpp +++ b/src/lib/netlist/devices/nld_74192.cpp @@ -48,7 +48,7 @@ namespace netlist , m_LOADQ(*this, "LOADQ") , m_CU(*this, "CU") , m_CD(*this, "CD") - , m_Q(*this, {"QA", "QB", "QC", "QD"}) + , m_Q(*this, {{"QA", "QB", "QC", "QD"}}) , m_BORROWQ(*this, "BORROWQ") , m_CARRYQ(*this, "CARRYQ") { diff --git a/src/lib/netlist/devices/nld_74193.cpp b/src/lib/netlist/devices/nld_74193.cpp index da52e321a14..0742ff1ce54 100644 --- a/src/lib/netlist/devices/nld_74193.cpp +++ b/src/lib/netlist/devices/nld_74193.cpp @@ -28,7 +28,7 @@ namespace netlist , m_cnt(0) , m_last_CU(0) , m_last_CD(0) - , m_Q(*this, {"QA", "QB", "QC", "QD"}) + , m_Q(*this, {{"QA", "QB", "QC", "QD"}}) , m_BORROWQ(*this, "BORROWQ") , m_CARRYQ(*this, "CARRYQ") { diff --git a/src/lib/netlist/devices/nld_7448.cpp b/src/lib/netlist/devices/nld_7448.cpp index d34a0316eb6..803394a9ad6 100644 --- a/src/lib/netlist/devices/nld_7448.cpp +++ b/src/lib/netlist/devices/nld_7448.cpp @@ -36,7 +36,7 @@ namespace netlist , m_BIQ(*this, "BIQ") , m_RBIQ(*this, "RBIQ") , m_state(0) - , m_Q(*this, {"a", "b", "c", "d", "e", "f", "g"}) + , m_Q(*this, {{"a", "b", "c", "d", "e", "f", "g"}}) { save(NLNAME(m_state)); } diff --git a/src/lib/netlist/devices/nld_7490.cpp b/src/lib/netlist/devices/nld_7490.cpp index 4cb207e971b..fa753ecde09 100644 --- a/src/lib/netlist/devices/nld_7490.cpp +++ b/src/lib/netlist/devices/nld_7490.cpp @@ -24,7 +24,7 @@ namespace netlist , m_cnt(0) , m_last_A(0) , m_last_B(0) - , m_Q(*this, {"QA", "QB", "QC", "QD"}) + , m_Q(*this, {{"QA", "QB", "QC", "QD"}}) { save(NLNAME(m_cnt)); save(NLNAME(m_last_A)); diff --git a/src/lib/netlist/devices/nld_82S16.cpp b/src/lib/netlist/devices/nld_82S16.cpp index 7a766ff2004..9b3e32cd291 100644 --- a/src/lib/netlist/devices/nld_82S16.cpp +++ b/src/lib/netlist/devices/nld_82S16.cpp @@ -15,7 +15,7 @@ namespace netlist NETLIB_OBJECT(82S16) { NETLIB_CONSTRUCTOR(82S16) - , m_A(*this, { "A0", "A1", "A2", "A3", "A4", "A5", "A6", "A7" }) + , m_A(*this, {{"A0", "A1", "A2", "A3", "A4", "A5", "A6", "A7" }}) , m_CE1Q(*this, "CE1Q") , m_CE2Q(*this, "CE2Q") , m_CE3Q(*this, "CE3Q") diff --git a/src/lib/netlist/nl_base.cpp b/src/lib/netlist/nl_base.cpp index 71e3e000471..a042c04577c 100644 --- a/src/lib/netlist/nl_base.cpp +++ b/src/lib/netlist/nl_base.cpp @@ -6,6 +6,7 @@ */ #include "solver/nld_matrix_solver.h" +#include "solver/nld_solver.h" #include "plib/palloc.h" diff --git a/src/lib/netlist/plib/plists.h b/src/lib/netlist/plib/plists.h index 7237ef4f8cf..bad35a34034 100644 --- a/src/lib/netlist/plib/plists.h +++ b/src/lib/netlist/plib/plists.h @@ -146,15 +146,6 @@ class pvector_t : public std::vector public: pvector_t() : std::vector() {} - void clear_and_free() - { - for (LC i : *this) - { - pfree(i); - } - this->clear(); - } - bool contains(const LC &elem) const { return (std::find(this->begin(), this->end(), elem) != this->end()); diff --git a/src/lib/netlist/solver/nld_matrix_solver.h b/src/lib/netlist/solver/nld_matrix_solver.h index fcd503daa08..ababc750539 100644 --- a/src/lib/netlist/solver/nld_matrix_solver.h +++ b/src/lib/netlist/solver/nld_matrix_solver.h @@ -10,7 +10,8 @@ #include -#include "solver/nld_solver.h" +//#include "solver/nld_solver.h" +#include "nl_base.h" #include "plib/pstream.h" namespace netlist @@ -18,6 +19,24 @@ namespace netlist namespace devices { + /* FIXME: these should become proper devices */ + + struct solver_parameters_t + { + int m_pivot; + nl_double m_accuracy; + nl_double m_lte; + nl_double m_min_timestep; + nl_double m_max_timestep; + nl_double m_sor; + bool m_dynamic; + int m_gs_loops; + int m_nr_loops; + netlist_time m_nt_sync_delay; + bool m_log_stats; + }; + + class terms_t { P_PREVENT_COPYING(terms_t) @@ -168,7 +187,7 @@ protected: plib::pvector_t m_terms; plib::pvector_t m_nets; - plib::pvector_t m_inps; + std::vector> m_inps; plib::pvector_t m_rails_temp; diff --git a/src/lib/netlist/solver/nld_solver.cpp b/src/lib/netlist/solver/nld_solver.cpp index fcf71dcb412..f077b46dfb2 100644 --- a/src/lib/netlist/solver/nld_solver.cpp +++ b/src/lib/netlist/solver/nld_solver.cpp @@ -98,7 +98,6 @@ ATTR_COLD void terms_t::set_pointers() ATTR_COLD matrix_solver_t::~matrix_solver_t() { - m_inps.clear_and_free(); for (unsigned k = 0; k < m_terms.size(); k++) { plib::pfree(m_terms[k]); @@ -152,7 +151,7 @@ ATTR_COLD void matrix_solver_t::setup_base(analog_net_t::list_t &nets) for (auto & input : m_inps) if (input->m_proxied_net == &p->net()) { - net_proxy_output = input; + net_proxy_output = input.get(); break; } @@ -161,8 +160,9 @@ ATTR_COLD void matrix_solver_t::setup_base(analog_net_t::list_t &nets) //net_proxy_output = palloc(analog_output_t(*this, // this->name() + "." + plib::pfmt("m{1}")(m_inps.size()))); - net_proxy_output = plib::palloc(*this, this->name() + "." + plib::pfmt("m{1}")(m_inps.size())); - m_inps.push_back(net_proxy_output); + auto net_proxy_output_u = plib::make_unique(*this, this->name() + "." + plib::pfmt("m{1}")(m_inps.size())); + net_proxy_output = net_proxy_output_u.get(); + m_inps.push_back(std::move(net_proxy_output_u)); nl_assert(p->net().is_analog()); net_proxy_output->m_proxied_net = static_cast(&p->net()); } @@ -578,7 +578,6 @@ NETLIB_STOP(solver) NETLIB_NAME(solver)::~NETLIB_NAME(solver)() { - m_mat_solvers.clear_and_free(); } NETLIB_UPDATE(solver) @@ -626,13 +625,13 @@ NETLIB_UPDATE(solver) } template -matrix_solver_t * NETLIB_NAME(solver)::create_solver(int size, const bool use_specific) +std::unique_ptr NETLIB_NAME(solver)::create_solver(int size, const bool use_specific) { pstring solvername = plib::pfmt("Solver_{1}")(m_mat_solvers.size()); if (use_specific && m_N == 1) - return plib::palloc(netlist(), solvername, &m_params); + return plib::make_unique(netlist(), solvername, &m_params); else if (use_specific && m_N == 2) - return plib::palloc(netlist(), solvername, &m_params); + return plib::make_unique(netlist(), solvername, &m_params); else { if (size >= m_gs_threshold) @@ -640,39 +639,39 @@ matrix_solver_t * NETLIB_NAME(solver)::create_solver(int size, const bool use_sp if (pstring("SOR_MAT").equals(m_iterative_solver)) { typedef matrix_solver_SOR_mat_t solver_sor_mat; - return plib::palloc(netlist(), solvername, &m_params, size); + return plib::make_unique(netlist(), solvername, &m_params, size); } else if (pstring("MAT_CR").equals(m_iterative_solver)) { typedef matrix_solver_GCR_t solver_mat; - return plib::palloc(netlist(), solvername, &m_params, size); + return plib::make_unique(netlist(), solvername, &m_params, size); } else if (pstring("MAT").equals(m_iterative_solver)) { typedef matrix_solver_direct_t solver_mat; - return plib::palloc(netlist(), solvername, &m_params, size); + return plib::make_unique(netlist(), solvername, &m_params, size); } else if (pstring("SM").equals(m_iterative_solver)) { /* Sherman-Morrison Formula */ typedef matrix_solver_sm_t solver_mat; - return plib::palloc(netlist(), solvername, &m_params, size); + return plib::make_unique(netlist(), solvername, &m_params, size); } else if (pstring("W").equals(m_iterative_solver)) { /* Woodbury Formula */ typedef matrix_solver_w_t solver_mat; - return plib::palloc(netlist(), solvername, &m_params, size); + return plib::make_unique(netlist(), solvername, &m_params, size); } else if (pstring("SOR").equals(m_iterative_solver)) { typedef matrix_solver_SOR_t solver_GS; - return plib::palloc(netlist(), solvername, &m_params, size); + return plib::make_unique(netlist(), solvername, &m_params, size); } else if (pstring("GMRES").equals(m_iterative_solver)) { typedef matrix_solver_GMRES_t solver_GMRES; - return plib::palloc(netlist(), solvername, &m_params, size); + return plib::make_unique(netlist(), solvername, &m_params, size); } else { @@ -683,7 +682,7 @@ matrix_solver_t * NETLIB_NAME(solver)::create_solver(int size, const bool use_sp else { typedef matrix_solver_direct_t solver_D; - return plib::palloc(netlist(), solvername, &m_params, size); + return plib::make_unique(netlist(), solvername, &m_params, size); } } } @@ -743,7 +742,7 @@ ATTR_COLD void NETLIB_NAME(solver)::post_start() netlist().log().verbose("Found {1} net groups in {2} nets\n", groups.size(), netlist().m_nets.size()); for (auto & grp : groups) { - matrix_solver_t *ms; + std::unique_ptr ms; std::size_t net_count = grp.size(); switch (net_count) @@ -827,8 +826,6 @@ ATTR_COLD void NETLIB_NAME(solver)::post_start() ms->set_delegate_pointer(); ms->setup(grp); - m_mat_solvers.push_back(ms); - netlist().log().verbose("Solver {1}", ms->name()); netlist().log().verbose(" ==> {2} nets", grp.size()); netlist().log().verbose(" has {1} elements", ms->has_dynamic_devices() ? "dynamic" : "no dynamic"); @@ -841,6 +838,8 @@ ATTR_COLD void NETLIB_NAME(solver)::post_start() netlist().log().verbose(" {1}", pcore->name()); } } + + m_mat_solvers.push_back(std::move(ms)); } } diff --git a/src/lib/netlist/solver/nld_solver.h b/src/lib/netlist/solver/nld_solver.h index ba604352aac..a02a6e69311 100644 --- a/src/lib/netlist/solver/nld_solver.h +++ b/src/lib/netlist/solver/nld_solver.h @@ -11,6 +11,7 @@ #include "nl_setup.h" #include "nl_base.h" #include "plib/pstream.h" +#include "solver/nld_matrix_solver.h" //#define ATTR_ALIGNED(N) __attribute__((aligned(N))) #define ATTR_ALIGNED(N) ATTR_ALIGN @@ -34,23 +35,6 @@ namespace netlist class NETLIB_NAME(solver); -/* FIXME: these should become proper devices */ - -struct solver_parameters_t -{ - int m_pivot; - nl_double m_accuracy; - nl_double m_lte; - nl_double m_min_timestep; - nl_double m_max_timestep; - nl_double m_sor; - bool m_dynamic; - int m_gs_loops; - int m_nr_loops; - netlist_time m_nt_sync_delay; - bool m_log_stats; -}; - class matrix_solver_t; @@ -122,13 +106,13 @@ protected: param_logic_t m_log_stats; - plib::pvector_t m_mat_solvers; + std::vector> m_mat_solvers; private: solver_parameters_t m_params; template - matrix_solver_t *create_solver(int size, bool use_specific); + std::unique_ptr create_solver(int size, bool use_specific); }; } //namespace devices From 1a108bfd28cd1ee5bc9d314c9b5b5ac3e3d6ffeb Mon Sep 17 00:00:00 2001 From: couriersud Date: Fri, 3 Jun 2016 02:21:44 +0200 Subject: [PATCH 31/44] More STL. (nw) --- src/lib/netlist/devices/nld_truthtable.cpp | 13 ++-- src/lib/netlist/devices/nld_truthtable.h | 2 +- src/lib/netlist/nl_base.h | 4 +- src/lib/netlist/nl_lists.h | 2 +- src/lib/netlist/plib/plists.h | 69 +--------------------- 5 files changed, 11 insertions(+), 79 deletions(-) diff --git a/src/lib/netlist/devices/nld_truthtable.cpp b/src/lib/netlist/devices/nld_truthtable.cpp index e4249713df4..5aa4be0b572 100644 --- a/src/lib/netlist/devices/nld_truthtable.cpp +++ b/src/lib/netlist/devices/nld_truthtable.cpp @@ -67,7 +67,7 @@ UINT32 truthtable_desc_t::get_ignored_extended(UINT32 i) * may change the output */ UINT32 bits = (1< t(bits); + std::vector t(bits); for (UINT32 j=1; j &timing_index) + UINT64 state,UINT16 val, std::vector &timing_index) { pstring elem = list[cur].trim(); int start = 0; @@ -178,7 +178,7 @@ void truthtable_desc_t::setup(const plib::pstring_vector_t &truthtable, UINT32 d nl_assert_always(times.size() == m_NO, "timing count not matching"); UINT16 val = 0; - plib::array_t tindex(m_NO); + std::vector tindex; for (unsigned j=0; j ign(m_size); - - for (UINT32 j=0; j < m_size; j++) - ign[j] = ~0U; + std::vector ign(m_size, ~0U); for (UINT32 i=0; i &timing_index); + UINT64 state,UINT16 val, std::vector &timing_index); static unsigned count_bits(UINT32 v); static UINT32 set_bits(UINT32 v, UINT32 b); UINT32 get_ignored_simple(UINT32 i); diff --git a/src/lib/netlist/nl_base.h b/src/lib/netlist/nl_base.h index 14b6ed17e61..6ccdb735b12 100644 --- a/src/lib/netlist/nl_base.h +++ b/src/lib/netlist/nl_base.h @@ -1053,8 +1053,8 @@ namespace netlist private: struct names_t { char m_buf[64]; }; int m_qsize; - plib::array_t m_times; - plib::array_t m_names; + std::vector m_times; + std::vector m_names; }; // ----------------------------------------------------------------------------- diff --git a/src/lib/netlist/nl_lists.h b/src/lib/netlist/nl_lists.h index 20e2392243e..da5e2ca8967 100644 --- a/src/lib/netlist/nl_lists.h +++ b/src/lib/netlist/nl_lists.h @@ -126,7 +126,7 @@ namespace netlist volatile std::atomic m_lock; #endif entry_t * m_end; - plib::array_t m_list; + std::vector m_list; }; } diff --git a/src/lib/netlist/plib/plists.h b/src/lib/netlist/plib/plists.h index bad35a34034..ae62e1dd886 100644 --- a/src/lib/netlist/plib/plists.h +++ b/src/lib/netlist/plib/plists.h @@ -15,78 +15,13 @@ #include #include #include +#include #include "palloc.h" #include "pstring.h" namespace plib { -// ---------------------------------------------------------------------------------------- -// parray_t: dynamic array -// ---------------------------------------------------------------------------------------- - -template -class array_t -{ -public: - - ATTR_COLD array_t(std::size_t numElements) - : m_list(0), m_capacity(0) - { - set_capacity(numElements); - } - - ATTR_COLD array_t(const array_t &rhs) - : m_list(0), m_capacity(0) - { - set_capacity(rhs.size()); - for (std::size_t i=0; i 0) - m_list = palloc_array(new_capacity); - else - m_list = nullptr; - m_capacity = new_capacity; - } - -private: - - LC * m_list; - int m_capacity; -}; - /* ---------------------------------------------------------------------------------------- * uninitialised_array_t: * fixed size array allowing to override constructor and initialize @@ -637,7 +572,7 @@ private: } pvector_t m_values; - array_t m_hash; + std::vector m_hash; }; // ---------------------------------------------------------------------------------------- From f8e985167738ce0617c0e1f0fd0e606f96478ea3 Mon Sep 17 00:00:00 2001 From: couriersud Date: Fri, 3 Jun 2016 22:27:00 +0200 Subject: [PATCH 32/44] Remove ATTR_HOT and ATTR_COLD. Refactored netlist_time. (nw) --- src/lib/netlist/analog/nld_twoterm.cpp | 6 +- src/lib/netlist/analog/nld_twoterm.h | 22 +- src/lib/netlist/devices/nld_4020.cpp | 2 +- src/lib/netlist/devices/nld_74107.cpp | 4 +- src/lib/netlist/devices/nld_74192.cpp | 2 +- src/lib/netlist/devices/nld_7448.cpp | 2 +- src/lib/netlist/devices/nld_7474.cpp | 4 +- src/lib/netlist/devices/nld_7490.cpp | 2 +- src/lib/netlist/devices/nld_74ls629.cpp | 2 +- src/lib/netlist/devices/nld_9310.cpp | 6 +- src/lib/netlist/devices/nld_9316.cpp | 6 +- src/lib/netlist/devices/nld_system.cpp | 2 +- src/lib/netlist/devices/nld_truthtable.h | 4 +- src/lib/netlist/devices/nlid_cmos.h | 4 +- src/lib/netlist/devices/nlid_system.h | 6 +- src/lib/netlist/nl_base.cpp | 110 +++--- src/lib/netlist/nl_base.h | 379 ++++++++++----------- src/lib/netlist/nl_config.h | 2 +- src/lib/netlist/nl_factory.cpp | 4 +- src/lib/netlist/nl_lists.h | 20 +- src/lib/netlist/nl_parser.cpp | 2 +- src/lib/netlist/nl_setup.cpp | 2 +- src/lib/netlist/nl_setup.h | 4 +- src/lib/netlist/nl_time.h | 156 ++++----- src/lib/netlist/nl_util.h | 8 +- src/lib/netlist/plib/pconfig.h | 4 +- src/lib/netlist/plib/pfmtlog.h | 38 +-- src/lib/netlist/plib/plists.h | 38 +-- src/lib/netlist/plib/pparser.cpp | 2 +- src/lib/netlist/plib/pstate.cpp | 10 +- src/lib/netlist/plib/pstate.h | 20 +- src/lib/netlist/prg/nltool.cpp | 6 +- src/lib/netlist/solver/nld_matrix_solver.h | 12 +- src/lib/netlist/solver/nld_ms_direct.h | 2 +- src/lib/netlist/solver/nld_ms_direct_lu.h | 4 +- src/lib/netlist/solver/nld_ms_sm.h | 2 +- src/lib/netlist/solver/nld_ms_w.h | 2 +- src/lib/netlist/solver/nld_solver.cpp | 30 +- 38 files changed, 461 insertions(+), 470 deletions(-) diff --git a/src/lib/netlist/analog/nld_twoterm.cpp b/src/lib/netlist/analog/nld_twoterm.cpp index def0730b5aa..6c60695aafb 100644 --- a/src/lib/netlist/analog/nld_twoterm.cpp +++ b/src/lib/netlist/analog/nld_twoterm.cpp @@ -19,7 +19,7 @@ namespace netlist // generic_diode // ---------------------------------------------------------------------------------------- -ATTR_COLD generic_diode::generic_diode() +generic_diode::generic_diode() { m_Vd = 0.7; set_param(1e-15, 1, 1e-15); @@ -27,7 +27,7 @@ ATTR_COLD generic_diode::generic_diode() m_Id = 0.0; } -ATTR_COLD void generic_diode::set_param(const nl_double Is, const nl_double n, nl_double gmin) +void generic_diode::set_param(const nl_double Is, const nl_double n, nl_double gmin) { static const double csqrt2 = nl_math::sqrt(2.0); m_Is = Is; @@ -40,7 +40,7 @@ ATTR_COLD void generic_diode::set_param(const nl_double Is, const nl_double n, n m_VtInv = 1.0 / m_Vt; } -ATTR_COLD void generic_diode::save(pstring name, object_t &parent) +void generic_diode::save(pstring name, object_t &parent) { parent.save(m_Vd, name + ".m_Vd"); parent.save(m_Id, name + ".m_Id"); diff --git a/src/lib/netlist/analog/nld_twoterm.h b/src/lib/netlist/analog/nld_twoterm.h index c41f6f26151..eaae36d6b0f 100644 --- a/src/lib/netlist/analog/nld_twoterm.h +++ b/src/lib/netlist/analog/nld_twoterm.h @@ -121,19 +121,19 @@ NETLIB_OBJECT(twoterm) NETLIB_UPDATEI(); public: - ATTR_HOT /* inline */ void set(const nl_double G, const nl_double V, const nl_double I) + /* inline */ void set(const nl_double G, const nl_double V, const nl_double I) { /* GO, GT, I */ m_P.set( G, G, ( V) * G - I); m_N.set( G, G, ( -V) * G + I); } - ATTR_HOT /* inline */ nl_double deltaV() const + /* inline */ nl_double deltaV() const { return m_P.net().Q_Analog() - m_N.net().Q_Analog(); } - ATTR_HOT void set_mat(nl_double a11, nl_double a12, nl_double a21, nl_double a22, nl_double r1, nl_double r2) + void set_mat(nl_double a11, nl_double a12, nl_double a21, nl_double a22, nl_double r1, nl_double r2) { /* GO, GT, I */ m_P.set(-a12, a11, -r1); @@ -311,9 +311,9 @@ private: class generic_diode { public: - ATTR_COLD generic_diode(); + generic_diode(); - ATTR_HOT inline void update_diode(const nl_double nVd) + inline void update_diode(const nl_double nVd) { #if 1 if (nVd < NL_FCONST(-5.0) * m_Vt) @@ -351,16 +351,16 @@ public: #endif } - ATTR_COLD void set_param(const nl_double Is, const nl_double n, nl_double gmin); + void set_param(const nl_double Is, const nl_double n, nl_double gmin); - ATTR_HOT inline nl_double I() const { return m_Id; } - ATTR_HOT inline nl_double G() const { return m_G; } - ATTR_HOT inline nl_double Ieq() const { return (m_Id - m_Vd * m_G); } - ATTR_HOT inline nl_double Vd() const { return m_Vd; } + inline nl_double I() const { return m_Id; } + inline nl_double G() const { return m_G; } + inline nl_double Ieq() const { return (m_Id - m_Vd * m_G); } + inline nl_double Vd() const { return m_Vd; } /* owning object must save those ... */ - ATTR_COLD void save(pstring name, object_t &parent); + void save(pstring name, object_t &parent); private: nl_double m_Vd; diff --git a/src/lib/netlist/devices/nld_4020.cpp b/src/lib/netlist/devices/nld_4020.cpp index 47c01375711..93916c344bc 100644 --- a/src/lib/netlist/devices/nld_4020.cpp +++ b/src/lib/netlist/devices/nld_4020.cpp @@ -36,7 +36,7 @@ namespace netlist NETLIB_UPDATEI(); public: - ATTR_HOT void update_outputs(const UINT16 cnt); + void update_outputs(const UINT16 cnt); logic_input_t m_IP; object_array_t m_Q; diff --git a/src/lib/netlist/devices/nld_74107.cpp b/src/lib/netlist/devices/nld_74107.cpp index d5d0f94b109..4dfa8b9aa8a 100644 --- a/src/lib/netlist/devices/nld_74107.cpp +++ b/src/lib/netlist/devices/nld_74107.cpp @@ -41,7 +41,7 @@ namespace netlist netlist_sig_t m_Q2; netlist_sig_t m_F; - ATTR_HOT void newstate(const netlist_sig_t state); + void newstate(const netlist_sig_t state); }; @@ -123,7 +123,7 @@ namespace netlist m_F = 0; } - ATTR_HOT inline void NETLIB_NAME(74107Asub)::newstate(const netlist_sig_t state) + inline void NETLIB_NAME(74107Asub)::newstate(const netlist_sig_t state) { const netlist_time delay[2] = { NLTIME_FROM_NS(25), NLTIME_FROM_NS(40) }; diff --git a/src/lib/netlist/devices/nld_74192.cpp b/src/lib/netlist/devices/nld_74192.cpp index 75ad7be71f5..ff3f5591293 100644 --- a/src/lib/netlist/devices/nld_74192.cpp +++ b/src/lib/netlist/devices/nld_74192.cpp @@ -33,7 +33,7 @@ namespace netlist logic_input_t m_C; logic_input_t m_D; - ATTR_HOT inline UINT8 read_ABCD() const + inline UINT8 read_ABCD() const { //return (INPLOGIC_PASSIVE(m_D) << 3) | (INPLOGIC_PASSIVE(m_C) << 2) | (INPLOGIC_PASSIVE(m_B) << 1) | (INPLOGIC_PASSIVE(m_A) << 0); return (INPLOGIC(m_D) << 3) | (INPLOGIC(m_C) << 2) | (INPLOGIC(m_B) << 1) | (INPLOGIC(m_A) << 0); diff --git a/src/lib/netlist/devices/nld_7448.cpp b/src/lib/netlist/devices/nld_7448.cpp index 803394a9ad6..624c60173b7 100644 --- a/src/lib/netlist/devices/nld_7448.cpp +++ b/src/lib/netlist/devices/nld_7448.cpp @@ -45,7 +45,7 @@ namespace netlist NETLIB_UPDATEI(); public: - ATTR_HOT void update_outputs(UINT8 v); + void update_outputs(UINT8 v); static const UINT8 tab7448[16][7]; logic_input_t m_A; diff --git a/src/lib/netlist/devices/nld_7474.cpp b/src/lib/netlist/devices/nld_7474.cpp index 9d145e91899..55355d83cad 100644 --- a/src/lib/netlist/devices/nld_7474.cpp +++ b/src/lib/netlist/devices/nld_7474.cpp @@ -33,7 +33,7 @@ namespace netlist logic_output_t m_QQ; INT8 m_nextD; - ATTR_HOT inline void newstate(const UINT8 stateQ, const UINT8 stateQQ); + inline void newstate(const UINT8 stateQ, const UINT8 stateQQ); private: @@ -95,7 +95,7 @@ namespace netlist NETLIB_SUB(7474) m_2; }; - ATTR_HOT inline void NETLIB_NAME(7474sub)::newstate(const UINT8 stateQ, const UINT8 stateQQ) + inline void NETLIB_NAME(7474sub)::newstate(const UINT8 stateQ, const UINT8 stateQQ) { // 0: High-to-low 40 ns, 1: Low-to-high 25 ns const netlist_time delay[2] = { NLTIME_FROM_NS(40), NLTIME_FROM_NS(25) }; diff --git a/src/lib/netlist/devices/nld_7490.cpp b/src/lib/netlist/devices/nld_7490.cpp index fa753ecde09..c47cc1d94a9 100644 --- a/src/lib/netlist/devices/nld_7490.cpp +++ b/src/lib/netlist/devices/nld_7490.cpp @@ -35,7 +35,7 @@ namespace netlist NETLIB_RESETI(); protected: - ATTR_HOT void update_outputs(); + void update_outputs(); logic_input_t m_A; logic_input_t m_B; diff --git a/src/lib/netlist/devices/nld_74ls629.cpp b/src/lib/netlist/devices/nld_74ls629.cpp index fc847beda2d..569fb38706f 100644 --- a/src/lib/netlist/devices/nld_74ls629.cpp +++ b/src/lib/netlist/devices/nld_74ls629.cpp @@ -216,7 +216,7 @@ namespace netlist // FIXME: we need a possibility to remove entries from queue ... // or an exact model ... - m_clock.m_inc = netlist_time::from_double(0.5 / (double) freq); + m_clock.m_inc = netlist_time(0.5 / (double) freq); //m_clock.update(); //NL_VERBOSE_OUT(("{1} {2} {3} {4}\n", name(), v_freq, v_rng, freq)); diff --git a/src/lib/netlist/devices/nld_9310.cpp b/src/lib/netlist/devices/nld_9310.cpp index f022219f54f..97c2d2b0a7f 100644 --- a/src/lib/netlist/devices/nld_9310.cpp +++ b/src/lib/netlist/devices/nld_9310.cpp @@ -33,7 +33,7 @@ namespace netlist logic_input_t m_C; logic_input_t m_D; - ATTR_HOT inline UINT8 read_ABCD() const + inline UINT8 read_ABCD() const { //return (INPLOGIC_PASSIVE(m_D) << 3) | (INPLOGIC_PASSIVE(m_C) << 2) | (INPLOGIC_PASSIVE(m_B) << 1) | (INPLOGIC_PASSIVE(m_A) << 0); return (INPLOGIC(m_D) << 3) | (INPLOGIC(m_C) << 2) | (INPLOGIC(m_B) << 1) | (INPLOGIC(m_A) << 0); @@ -61,8 +61,8 @@ namespace netlist NETLIB_RESETI(); NETLIB_UPDATEI(); public: - ATTR_HOT inline void update_outputs_all(const UINT8 cnt, const netlist_time out_delay); - ATTR_HOT inline void update_outputs(const UINT8 cnt); + inline void update_outputs_all(const UINT8 cnt, const netlist_time out_delay); + inline void update_outputs(const UINT8 cnt); logic_input_t m_CLK; diff --git a/src/lib/netlist/devices/nld_9316.cpp b/src/lib/netlist/devices/nld_9316.cpp index 87d1f3bad8e..287a9b6669d 100644 --- a/src/lib/netlist/devices/nld_9316.cpp +++ b/src/lib/netlist/devices/nld_9316.cpp @@ -33,7 +33,7 @@ namespace netlist logic_input_t m_C; logic_input_t m_D; - ATTR_HOT inline UINT8 read_ABCD() const + inline UINT8 read_ABCD() const { //return (INPLOGIC_PASSIVE(m_D) << 3) | (INPLOGIC_PASSIVE(m_C) << 2) | (INPLOGIC_PASSIVE(m_B) << 1) | (INPLOGIC_PASSIVE(m_A) << 0); return (INPLOGIC(m_D) << 3) | (INPLOGIC(m_C) << 2) | (INPLOGIC(m_B) << 1) | (INPLOGIC(m_A) << 0); @@ -64,8 +64,8 @@ namespace netlist NETLIB_UPDATEI(); public: - ATTR_HOT inline void update_outputs_all(const UINT8 cnt, const netlist_time out_delay); - ATTR_HOT inline void update_outputs(const UINT8 cnt); + inline void update_outputs_all(const UINT8 cnt, const netlist_time out_delay); + inline void update_outputs(const UINT8 cnt); logic_input_t m_CLK; diff --git a/src/lib/netlist/devices/nld_system.cpp b/src/lib/netlist/devices/nld_system.cpp index f0179c137b9..5ec1235d35d 100644 --- a/src/lib/netlist/devices/nld_system.cpp +++ b/src/lib/netlist/devices/nld_system.cpp @@ -40,7 +40,7 @@ namespace netlist NETLIB_RESET(extclock) { m_cnt = 0; - m_off = netlist_time::from_double(m_offset.Value()); + m_off = netlist_time(m_offset.Value()); //m_Q.initial(0); } diff --git a/src/lib/netlist/devices/nld_truthtable.h b/src/lib/netlist/devices/nld_truthtable.h index 72313f13862..d4ab92333d9 100644 --- a/src/lib/netlist/devices/nld_truthtable.h +++ b/src/lib/netlist/devices/nld_truthtable.h @@ -227,7 +227,7 @@ public: } public: - ATTR_HOT void inc_active() override + void inc_active() override { nl_assert(netlist().use_deactivate()); if (has_state == 0) @@ -237,7 +237,7 @@ public: } } - ATTR_HOT void dec_active() override + void dec_active() override { nl_assert(netlist().use_deactivate()); /* FIXME: diff --git a/src/lib/netlist/devices/nlid_cmos.h b/src/lib/netlist/devices/nlid_cmos.h index 7ca6cc29783..d776f96c3b3 100644 --- a/src/lib/netlist/devices/nlid_cmos.h +++ b/src/lib/netlist/devices/nlid_cmos.h @@ -27,8 +27,8 @@ namespace netlist NETLIB_RESETI() {}; public: - ATTR_HOT inline nl_double vdd() { return INPANALOG(m_vdd); } - ATTR_HOT inline nl_double vss() { return INPANALOG(m_vss); } + inline nl_double vdd() { return INPANALOG(m_vdd); } + inline nl_double vss() { return INPANALOG(m_vss); } analog_input_t m_vdd; analog_input_t m_vss; diff --git a/src/lib/netlist/devices/nlid_system.h b/src/lib/netlist/devices/nlid_system.h index 9b5766fbf98..5ecdcac1107 100644 --- a/src/lib/netlist/devices/nlid_system.h +++ b/src/lib/netlist/devices/nlid_system.h @@ -76,7 +76,7 @@ namespace netlist param_double_t m_freq; netlist_time m_inc; - ATTR_HOT inline static void mc_update(logic_net_t &net); + inline static void mc_update(logic_net_t &net); }; // ----------------------------------------------------------------------------- @@ -126,7 +126,7 @@ namespace netlist { netlist_time base = netlist_time::from_hz(m_freq.Value()*2); plib::pstring_vector_t pat(m_pattern.Value(),","); - m_off = netlist_time::from_double(m_offset.Value()); + m_off = netlist_time(m_offset.Value()); int pati[256]; m_size = pat.size(); @@ -552,7 +552,7 @@ namespace netlist P_PREVENT_COPYING(factory_lib_entry_t) public: - ATTR_COLD factory_lib_entry_t(setup_t &setup, const pstring &name, const pstring &classname, + factory_lib_entry_t(setup_t &setup, const pstring &name, const pstring &classname, const pstring &def_param) : base_factory_t(name, classname, def_param), m_setup(setup) { } diff --git a/src/lib/netlist/nl_base.cpp b/src/lib/netlist/nl_base.cpp index a042c04577c..24ca7cf9c8b 100644 --- a/src/lib/netlist/nl_base.cpp +++ b/src/lib/netlist/nl_base.cpp @@ -155,18 +155,18 @@ void queue_t::on_post_load() // object_t // ---------------------------------------------------------------------------------------- -ATTR_COLD object_t::object_t(netlist_t &nl, const pstring &aname, const type_t atype) +object_t::object_t(netlist_t &nl, const pstring &aname, const type_t atype) : m_netlist(nl) , m_name(aname) , m_objtype(atype) { } -ATTR_COLD object_t::~object_t() +object_t::~object_t() { } -ATTR_COLD const pstring &object_t::name() const +const pstring &object_t::name() const { return m_name; } @@ -175,7 +175,7 @@ ATTR_COLD const pstring &object_t::name() const // device_object_t // ---------------------------------------------------------------------------------------- -ATTR_COLD device_object_t::device_object_t(core_device_t &dev, const pstring &aname, const type_t atype) +device_object_t::device_object_t(core_device_t &dev, const pstring &aname, const type_t atype) : object_t(dev.netlist(), aname, atype) , m_device(dev) { @@ -215,12 +215,12 @@ netlist_t::~netlist_t() pstring::resetmem(); } -ATTR_HOT nl_double netlist_t::gmin() const +nl_double netlist_t::gmin() const { return solver()->gmin(); } -ATTR_COLD void netlist_t::start() +void netlist_t::start() { /* load the library ... */ @@ -267,7 +267,7 @@ ATTR_COLD void netlist_t::start() } -ATTR_COLD void netlist_t::stop() +void netlist_t::stop() { /* find the main clock and solver ... */ @@ -276,7 +276,7 @@ ATTR_COLD void netlist_t::stop() dev->stop_dev(); } -ATTR_COLD net_t *netlist_t::find_net(const pstring &name) +net_t *netlist_t::find_net(const pstring &name) { for (auto & net : m_nets) if (net->name() == name) @@ -285,14 +285,14 @@ ATTR_COLD net_t *netlist_t::find_net(const pstring &name) return nullptr; } -ATTR_COLD void netlist_t::rebuild_lists() +void netlist_t::rebuild_lists() { for (auto & net : m_nets) net->rebuild_list(); } -ATTR_COLD void netlist_t::reset() +void netlist_t::reset() { m_time = netlist_time::zero; m_queue.clear(); @@ -330,7 +330,7 @@ ATTR_COLD void netlist_t::reset() } -ATTR_HOT void netlist_t::process_queue(const netlist_time &delta) +void netlist_t::process_queue(const netlist_time &delta) { m_stop = m_time + delta; @@ -423,7 +423,7 @@ template class param_template_t; // core_device_t // ---------------------------------------------------------------------------------------- -ATTR_COLD core_device_t::core_device_t(netlist_t &owner, const pstring &name) +core_device_t::core_device_t(netlist_t &owner, const pstring &name) : object_t(owner, name, DEVICE), logic_family_t() #if (NL_KEEP_STATISTICS) , stat_total_time(0) @@ -435,7 +435,7 @@ ATTR_COLD core_device_t::core_device_t(netlist_t &owner, const pstring &name) set_logic_family(family_TTL()); } -ATTR_COLD core_device_t::core_device_t(core_device_t &owner, const pstring &name) +core_device_t::core_device_t(core_device_t &owner, const pstring &name) : object_t(owner.netlist(), owner.name() + "." + name, DEVICE) , logic_family_t() #if (NL_KEEP_STATISTICS) @@ -450,11 +450,11 @@ ATTR_COLD core_device_t::core_device_t(core_device_t &owner, const pstring &name owner.netlist().m_devices.push_back(plib::owned_ptr(this, false)); } -ATTR_COLD core_device_t::~core_device_t() +core_device_t::~core_device_t() { } -ATTR_COLD void core_device_t::set_delegate_pointer() +void core_device_t::set_delegate_pointer() { #if (NL_KEEP_STATISTICS) netlist().m_started_devices.push_back(this); @@ -470,14 +470,14 @@ ATTR_COLD void core_device_t::set_delegate_pointer() #endif } -ATTR_COLD void core_device_t::stop_dev() +void core_device_t::stop_dev() { #if (NL_KEEP_STATISTICS) #endif //stop(); } -ATTR_HOT netlist_sig_t core_device_t::INPLOGIC_PASSIVE(logic_input_t &inp) +netlist_sig_t core_device_t::INPLOGIC_PASSIVE(logic_input_t &inp) { if (inp.state() != logic_t::STATE_INP_PASSIVE) return inp.Q(); @@ -500,12 +500,12 @@ device_t::~device_t() //log().debug("~net_device_t\n"); } -ATTR_COLD setup_t &device_t::setup() +setup_t &device_t::setup() { return netlist().setup(); } -ATTR_COLD void device_t::register_subalias(const pstring &name, core_terminal_t &term) +void device_t::register_subalias(const pstring &name, core_terminal_t &term) { pstring alias = this->name() + "." + name; @@ -516,7 +516,7 @@ ATTR_COLD void device_t::register_subalias(const pstring &name, core_terminal_t m_terminals.push_back(alias); } -ATTR_COLD void device_t::register_subalias(const pstring &name, const pstring &aliased) +void device_t::register_subalias(const pstring &name, const pstring &aliased) { pstring alias = this->name() + "." + name; pstring aliased_fqn = this->name() + "." + aliased; @@ -529,12 +529,12 @@ ATTR_COLD void device_t::register_subalias(const pstring &name, const pstring &a // m_terminals.add(name); } -ATTR_COLD void device_t::connect_late(core_terminal_t &t1, core_terminal_t &t2) +void device_t::connect_late(core_terminal_t &t1, core_terminal_t &t2) { setup().register_link_fqn(t1.name(), t2.name()); } -ATTR_COLD void device_t::connect_late(const pstring &t1, const pstring &t2) +void device_t::connect_late(const pstring &t1, const pstring &t2) { setup().register_link_fqn(name() + "." + t1, name() + "." + t2); } @@ -542,7 +542,7 @@ ATTR_COLD void device_t::connect_late(const pstring &t1, const pstring &t2) /* FIXME: this is only used by solver code since matrix solvers are started in * post_start. */ -ATTR_COLD void device_t::connect_post_start(core_terminal_t &t1, core_terminal_t &t2) +void device_t::connect_post_start(core_terminal_t &t1, core_terminal_t &t2) { if (!setup().connect(t1, t2)) netlist().log().fatal("Error connecting {1} to {2}\n", t1.name(), t2.name()); @@ -574,7 +574,7 @@ struct do_nothing_deleter{ }; -ATTR_COLD net_t::net_t(netlist_t &nl, const pstring &aname, core_terminal_t *mr) +net_t::net_t(netlist_t &nl, const pstring &aname, core_terminal_t *mr) : object_t(nl, aname, NET) , m_new_Q(0) , m_cur_Q (0) @@ -598,12 +598,12 @@ ATTR_COLD net_t::net_t(netlist_t &nl, const pstring &aname, core_terminal_t *mr) save(NLNAME(m_new_Q)); } -ATTR_COLD net_t::~net_t() +net_t::~net_t() { netlist().remove_save_items(this); } -ATTR_HOT void net_t::inc_active(core_terminal_t &term) +void net_t::inc_active(core_terminal_t &term) { m_active++; m_list_active.insert(term); @@ -633,7 +633,7 @@ ATTR_HOT void net_t::inc_active(core_terminal_t &term) } } -ATTR_HOT void net_t::dec_active(core_terminal_t &term) +void net_t::dec_active(core_terminal_t &term) { --m_active; nl_assert(m_active >= 0); @@ -642,7 +642,7 @@ ATTR_HOT void net_t::dec_active(core_terminal_t &term) railterminal().device().dec_active(); } -ATTR_COLD void net_t::rebuild_list() +void net_t::rebuild_list() { /* rebuild m_list */ @@ -657,7 +657,7 @@ ATTR_COLD void net_t::rebuild_list() m_active = cnt; } -ATTR_HOT void net_t::update_devs() +void net_t::update_devs() { //assert(m_num_cons != 0); nl_assert(this->isRailNet()); @@ -688,7 +688,7 @@ ATTR_HOT void net_t::update_devs() #endif } -ATTR_COLD void net_t::reset() +void net_t::reset() { m_time = netlist_time::zero; m_active = 0; @@ -712,7 +712,7 @@ ATTR_COLD void net_t::reset() m_active++; } -ATTR_COLD void net_t::register_con(core_terminal_t &terminal) +void net_t::register_con(core_terminal_t &terminal) { terminal.set_net(this); @@ -722,7 +722,7 @@ ATTR_COLD void net_t::register_con(core_terminal_t &terminal) m_active++; } -ATTR_COLD void net_t::move_connections(net_t *dest_net) +void net_t::move_connections(net_t *dest_net) { for (core_terminal_t *ct : m_core_terms) dest_net->register_con(*ct); @@ -730,7 +730,7 @@ ATTR_COLD void net_t::move_connections(net_t *dest_net) m_active = 0; } -ATTR_COLD void net_t::merge_net(net_t *othernet) +void net_t::merge_net(net_t *othernet) { netlist().log().debug("merging nets ...\n"); if (othernet == nullptr) @@ -761,7 +761,7 @@ ATTR_COLD void net_t::merge_net(net_t *othernet) // logic_net_t // ---------------------------------------------------------------------------------------- -ATTR_COLD logic_net_t::logic_net_t(netlist_t &nl, const pstring &aname, core_terminal_t *mr) +logic_net_t::logic_net_t(netlist_t &nl, const pstring &aname, core_terminal_t *mr) : net_t(nl, aname, mr) { } @@ -771,13 +771,13 @@ ATTR_COLD logic_net_t::logic_net_t(netlist_t &nl, const pstring &aname, core_ter // analog_net_t // ---------------------------------------------------------------------------------------- -ATTR_COLD analog_net_t::analog_net_t(netlist_t &nl, const pstring &aname, core_terminal_t *mr) +analog_net_t::analog_net_t(netlist_t &nl, const pstring &aname, core_terminal_t *mr) : net_t(nl, aname, mr) , m_solver(nullptr) { } -ATTR_COLD bool analog_net_t::already_processed(plib::pvector_t &groups) +bool analog_net_t::already_processed(plib::pvector_t &groups) { if (isRailNet()) return true; @@ -789,7 +789,7 @@ ATTR_COLD bool analog_net_t::already_processed(plib::pvector_t &groups) return false; } -ATTR_COLD void analog_net_t::process_net(plib::pvector_t &groups) +void analog_net_t::process_net(plib::pvector_t &groups) { if (num_cons() == 0) return; @@ -812,7 +812,7 @@ ATTR_COLD void analog_net_t::process_net(plib::pvector_t &groups) // core_terminal_t // ---------------------------------------------------------------------------------------- -ATTR_COLD core_terminal_t::core_terminal_t(core_device_t &dev, const pstring &aname, const type_t atype) +core_terminal_t::core_terminal_t(core_device_t &dev, const pstring &aname, const type_t atype) : device_object_t(dev, dev.name() + "." + aname, atype) , plinkedlist_element_t() , m_net(nullptr) @@ -821,12 +821,12 @@ ATTR_COLD core_terminal_t::core_terminal_t(core_device_t &dev, const pstring &an save(NLNAME(m_state)); } -ATTR_COLD void core_terminal_t::set_net(net_t::ptr_t anet) +void core_terminal_t::set_net(net_t::ptr_t anet) { m_net = anet; } -ATTR_COLD void core_terminal_t::clear_net() + void core_terminal_t::clear_net() { m_net = nullptr; } @@ -836,7 +836,7 @@ ATTR_COLD void core_terminal_t::clear_net() // terminal_t // ---------------------------------------------------------------------------------------- -ATTR_COLD terminal_t::terminal_t(core_device_t &dev, const pstring &aname) +terminal_t::terminal_t(core_device_t &dev, const pstring &aname) : analog_t(dev, aname, TERMINAL) , m_otherterm(nullptr) , m_Idr1(nullptr) @@ -850,21 +850,21 @@ ATTR_COLD terminal_t::terminal_t(core_device_t &dev, const pstring &aname) } -ATTR_HOT void terminal_t::schedule_solve() +void terminal_t::schedule_solve() { // FIXME: Remove this after we found a way to remove *ALL* twoterms connected to railnets only. if (net().solver() != nullptr) net().solver()->update_forced(); } -ATTR_HOT void terminal_t::schedule_after(const netlist_time &after) +void terminal_t::schedule_after(const netlist_time &after) { // FIXME: Remove this after we found a way to remove *ALL* twoterms connected to railnets only. if (net().solver() != nullptr) net().solver()->update_after(after); } -ATTR_COLD void terminal_t::reset() +void terminal_t::reset() { set_state(STATE_INP_ACTIVE); set_ptr(m_Idr1, 0.0); @@ -885,7 +885,7 @@ ATTR_COLD void terminal_t::reset() // logic_output_t // ---------------------------------------------------------------------------------------- -ATTR_COLD logic_output_t::logic_output_t(core_device_t &dev, const pstring &aname) +logic_output_t::logic_output_t(core_device_t &dev, const pstring &aname) : logic_t(dev, aname, OUTPUT) , m_my_net(dev.netlist(), name() + ".net", this) { @@ -895,7 +895,7 @@ ATTR_COLD logic_output_t::logic_output_t(core_device_t &dev, const pstring &anam netlist().setup().register_term(*this); } -ATTR_COLD void logic_output_t::initial(const netlist_sig_t val) +void logic_output_t::initial(const netlist_sig_t val) { net().initial(val); } @@ -904,7 +904,7 @@ ATTR_COLD void logic_output_t::initial(const netlist_sig_t val) // analog_input_t // ---------------------------------------------------------------------------------------- -ATTR_COLD analog_input_t::analog_input_t(core_device_t &dev, const pstring &aname) +analog_input_t::analog_input_t(core_device_t &dev, const pstring &aname) : analog_t(dev, aname, INPUT) { set_state(STATE_INP_ACTIVE); @@ -915,7 +915,7 @@ ATTR_COLD analog_input_t::analog_input_t(core_device_t &dev, const pstring &anam // analog_output_t // ---------------------------------------------------------------------------------------- -ATTR_COLD analog_output_t::analog_output_t(core_device_t &dev, const pstring &aname) +analog_output_t::analog_output_t(core_device_t &dev, const pstring &aname) : analog_t(dev, aname, OUTPUT), m_proxied_net(nullptr) , m_my_net(dev.netlist(), name() + ".net", this) { @@ -926,7 +926,7 @@ ATTR_COLD analog_output_t::analog_output_t(core_device_t &dev, const pstring &an netlist().setup().register_term(*this); } -ATTR_COLD void analog_output_t::initial(const nl_double val) +void analog_output_t::initial(const nl_double val) { net().m_cur_Analog = val; } @@ -935,7 +935,7 @@ ATTR_COLD void analog_output_t::initial(const nl_double val) // logic_input_t // ----------------------------------------------------------------------------- -ATTR_COLD logic_input_t::logic_input_t(core_device_t &dev, const pstring &aname) +logic_input_t::logic_input_t(core_device_t &dev, const pstring &aname) : logic_t(dev, aname, INPUT) { set_state(STATE_INP_ACTIVE); @@ -947,13 +947,13 @@ ATTR_COLD logic_input_t::logic_input_t(core_device_t &dev, const pstring &aname) // param_t & friends // ---------------------------------------------------------------------------------------- -ATTR_COLD param_t::param_t(const param_type_t atype, device_t &device, const pstring &name) +param_t::param_t(const param_type_t atype, device_t &device, const pstring &name) : device_object_t(device, name, PARAM) , m_param_type(atype) { } -ATTR_COLD const pstring param_model_t::model_type() +const pstring param_model_t::model_type() { if (m_map.size() == 0) netlist().setup().model_parse(this->Value(), m_map); @@ -961,14 +961,14 @@ ATTR_COLD const pstring param_model_t::model_type() } -ATTR_COLD const pstring param_model_t::model_value_str(const pstring &entity) +const pstring param_model_t::model_value_str(const pstring &entity) { if (m_map.size() == 0) netlist().setup().model_parse(this->Value(), m_map); return netlist().setup().model_value_str(m_map, entity); } -ATTR_COLD nl_double param_model_t::model_value(const pstring &entity) +nl_double param_model_t::model_value(const pstring &entity) { if (m_map.size() == 0) netlist().setup().model_parse(this->Value(), m_map); @@ -986,7 +986,7 @@ namespace netlist // mainclock // ---------------------------------------------------------------------------------------- - ATTR_HOT void NETLIB_NAME(mainclock)::mc_update(logic_net_t &net) + void NETLIB_NAME(mainclock)::mc_update(logic_net_t &net) { net.toggle_new_Q(); net.update_devs(); diff --git a/src/lib/netlist/nl_base.h b/src/lib/netlist/nl_base.h index 6ccdb735b12..7cee36bd3a6 100644 --- a/src/lib/netlist/nl_base.h +++ b/src/lib/netlist/nl_base.h @@ -190,51 +190,51 @@ class NETLIB_NAME(name) : public device_t #define NETLIB_CONSTRUCTOR_DERIVED(cname, pclass) \ private: family_setter_t m_famsetter; \ - public: template ATTR_COLD NETLIB_NAME(cname)(CLASS &owner, const pstring name) \ + public: template NETLIB_NAME(cname)(CLASS &owner, const pstring name) \ : NETLIB_NAME(pclass)(owner, name) #define NETLIB_CONSTRUCTOR(cname) \ private: family_setter_t m_famsetter; \ - public: template ATTR_COLD NETLIB_NAME(cname)(CLASS &owner, const pstring name) \ + public: template NETLIB_NAME(cname)(CLASS &owner, const pstring name) \ : device_t(owner, name) -#define NETLIB_DESTRUCTOR(name) public: ATTR_HOT virtual ~NETLIB_NAME(name)() +#define NETLIB_DESTRUCTOR(name) public: virtual ~NETLIB_NAME(name)() #define NETLIB_CONSTRUCTOR_EX(cname, ...) \ private: family_setter_t m_famsetter; \ - public: template ATTR_COLD NETLIB_NAME(cname)(CLASS &owner, const pstring name, __VA_ARGS__) \ + public: template NETLIB_NAME(cname)(CLASS &owner, const pstring name, __VA_ARGS__) \ : device_t(owner, name) #define NETLIB_DYNAMIC() \ - public: ATTR_HOT virtual bool is_dynamic1() const override { return true; } + public: virtual bool is_dynamic1() const override { return true; } #define NETLIB_TIMESTEP() \ - public: ATTR_HOT virtual bool is_timestep() const override { return true; } \ - public: ATTR_HOT virtual void step_time(const nl_double step) override + public: virtual bool is_timestep() const override { return true; } \ + public: virtual void step_time(const nl_double step) override #define NETLIB_UPDATE_AFTER_PARAM_CHANGE() \ - public: ATTR_HOT virtual bool needs_update_after_param_change() const override { return true; } + public: virtual bool needs_update_after_param_change() const override { return true; } #define NETLIB_FAMILY(family) , m_famsetter(*this, family) -#define NETLIB_UPDATE_TERMINALSI() public: ATTR_HOT virtual void update_terminals() override -#define NETLIB_UPDATEI() protected: ATTR_HOT virtual void update() NOEXCEPT override -#define NETLIB_UPDATE_PARAMI() public: ATTR_HOT virtual void update_param() override -#define NETLIB_RESETI() protected: ATTR_HOT virtual void reset() override +#define NETLIB_UPDATE_TERMINALSI() public: virtual void update_terminals() override +#define NETLIB_UPDATEI() protected: virtual void update() NOEXCEPT override +#define NETLIB_UPDATE_PARAMI() public: virtual void update_param() override +#define NETLIB_RESETI() protected: virtual void reset() override #define NETLIB_SUB(chip) nld_ ## chip #define NETLIB_SUBXX(chip) std::unique_ptr< nld_ ## chip > -#define NETLIB_UPDATE(chip) ATTR_HOT void NETLIB_NAME(chip) :: update(void) NOEXCEPT +#define NETLIB_UPDATE(chip) void NETLIB_NAME(chip) :: update(void) NOEXCEPT -#define NETLIB_RESET(chip) ATTR_COLD void NETLIB_NAME(chip) :: reset(void) +#define NETLIB_RESET(chip) void NETLIB_NAME(chip) :: reset(void) -#define NETLIB_STOP(chip) ATTR_COLD void NETLIB_NAME(chip) :: stop(void) +#define NETLIB_STOP(chip) void NETLIB_NAME(chip) :: stop(void) -#define NETLIB_UPDATE_PARAM(chip) ATTR_HOT void NETLIB_NAME(chip) :: update_param(void) -#define NETLIB_FUNC_VOID(chip, name, params) ATTR_HOT void NETLIB_NAME(chip) :: name params +#define NETLIB_UPDATE_PARAM(chip) void NETLIB_NAME(chip) :: update_param(void) +#define NETLIB_FUNC_VOID(chip, name, params) void NETLIB_NAME(chip) :: name params -#define NETLIB_UPDATE_TERMINALS(chip) ATTR_HOT void NETLIB_NAME(chip) :: update_terminals(void) +#define NETLIB_UPDATE_TERMINALS(chip) void NETLIB_NAME(chip) :: update_terminals(void) //============================================================ // Asserts @@ -322,8 +322,8 @@ namespace netlist logic_family_t() : m_logic_family(nullptr) {} ~logic_family_t() { } - ATTR_HOT const logic_family_desc_t *logic_family() const { return m_logic_family; } - ATTR_COLD void set_logic_family(const logic_family_desc_t *fam) { m_logic_family = fam; } + const logic_family_desc_t *logic_family() const { return m_logic_family; } + void set_logic_family(const logic_family_desc_t *fam) { m_logic_family = fam; } protected: const logic_family_desc_t *m_logic_family; @@ -359,18 +359,18 @@ namespace netlist QUEUE = 6 }; - ATTR_COLD object_t(netlist_t &nl, const pstring &aname, const type_t atype); + object_t(netlist_t &nl, const pstring &aname, const type_t atype); ~object_t(); - ATTR_COLD const pstring &name() const; + const pstring &name() const; - ATTR_COLD plib::pstate_manager_t &state_manager(); + plib::pstate_manager_t &state_manager(); - ATTR_HOT type_t type() const { return m_objtype; } - ATTR_HOT bool isType(const type_t atype) const { return (m_objtype == atype); } + type_t type() const { return m_objtype; } + bool isType(const type_t atype) const { return (m_objtype == atype); } - ATTR_HOT netlist_t & netlist() { return m_netlist; } - ATTR_HOT const netlist_t & netlist() const { return m_netlist; } + netlist_t & netlist() { return m_netlist; } + const netlist_t & netlist() const { return m_netlist; } private: netlist_t & m_netlist; @@ -392,8 +392,8 @@ namespace netlist { P_PREVENT_COPYING(device_object_t) public: - ATTR_COLD device_object_t(core_device_t &dev, const pstring &aname, const type_t atype); - ATTR_HOT core_device_t &device() const { return m_device; } + device_object_t(core_device_t &dev, const pstring &aname, const type_t atype); + core_device_t &device() const { return m_device; } private: core_device_t & m_device; }; @@ -421,22 +421,21 @@ namespace netlist STATE_NONEX = 256 }; - ATTR_COLD core_terminal_t(core_device_t &dev, const pstring &aname, const type_t atype); + core_terminal_t(core_device_t &dev, const pstring &aname, const type_t atype); virtual ~core_terminal_t() { } - ATTR_COLD void set_net(net_t *anet); - ATTR_COLD void clear_net(); - ATTR_HOT bool has_net() const { return (m_net != nullptr); } + void set_net(net_t *anet); + void clear_net(); + bool has_net() const { return (m_net != nullptr); } + const net_t & net() const { return *m_net;} + net_t & net() { return *m_net;} - ATTR_COLD bool is_logic() const; - ATTR_COLD bool is_analog() const; + bool is_logic() const; + bool is_analog() const; - ATTR_HOT const net_t & net() const { return *m_net;} - ATTR_HOT net_t & net() { return *m_net;} - - ATTR_HOT bool is_state(const state_e astate) const { return (m_state == astate); } - ATTR_HOT const state_e &state() const { return m_state; } - ATTR_HOT void set_state(const state_e astate) + bool is_state(const state_e astate) const { return (m_state == astate); } + state_e state() const { return m_state; } + void set_state(const state_e astate) { nl_assert(astate != STATE_NONEX); m_state = astate; @@ -458,13 +457,13 @@ namespace netlist { public: - ATTR_COLD analog_t(core_device_t &dev, const pstring &aname, const type_t atype) + analog_t(core_device_t &dev, const pstring &aname, const type_t atype) : core_terminal_t(dev, aname, atype) { } - ATTR_HOT const analog_net_t & net() const; - ATTR_HOT analog_net_t & net(); + const analog_net_t & net() const; + analog_net_t & net(); protected: @@ -482,33 +481,33 @@ namespace netlist using list_t = plib::pvector_t; - ATTR_COLD terminal_t(core_device_t &dev, const pstring &aname); + terminal_t(core_device_t &dev, const pstring &aname); terminal_t *m_otherterm; - ATTR_HOT void set(const nl_double G) + void set(const nl_double G) { set_ptr(m_Idr1, 0); set_ptr(m_go1, G); set_ptr(m_gt1, G); } - ATTR_HOT void set(const nl_double GO, const nl_double GT) + void set(const nl_double GO, const nl_double GT) { set_ptr(m_Idr1, 0); set_ptr(m_go1, GO); set_ptr(m_gt1, GT); } - ATTR_HOT void set(const nl_double GO, const nl_double GT, const nl_double I) + void set(const nl_double GO, const nl_double GT, const nl_double I) { set_ptr(m_Idr1, I); set_ptr(m_go1, GO); set_ptr(m_gt1, GT); } - ATTR_HOT void schedule_solve(); - ATTR_HOT void schedule_after(const netlist_time &after); + void schedule_solve(); + void schedule_after(const netlist_time &after); void set_ptrs(nl_double *gt, nl_double *go, nl_double *Idr) { @@ -520,7 +519,7 @@ namespace netlist protected: void reset() override; private: - ATTR_HOT void set_ptr(nl_double *ptr, const nl_double val) + void set_ptr(nl_double *ptr, const nl_double val) { if (ptr != nullptr && *ptr != val) { @@ -542,18 +541,18 @@ namespace netlist class logic_t : public core_terminal_t, public logic_family_t { public: - ATTR_COLD logic_t(core_device_t &dev, const pstring &aname, const type_t atype) + logic_t(core_device_t &dev, const pstring &aname, const type_t atype) : core_terminal_t(dev, aname, atype), logic_family_t(), m_proxy(nullptr) { } - ATTR_COLD bool has_proxy() const { return (m_proxy != nullptr); } - ATTR_COLD devices::nld_base_proxy *get_proxy() const { return m_proxy; } - ATTR_COLD void set_proxy(devices::nld_base_proxy *proxy) { m_proxy = proxy; } + bool has_proxy() const { return (m_proxy != nullptr); } + devices::nld_base_proxy *get_proxy() const { return m_proxy; } + void set_proxy(devices::nld_base_proxy *proxy) { m_proxy = proxy; } - ATTR_HOT logic_net_t & net(); - ATTR_HOT const logic_net_t & net() const; + logic_net_t & net(); + const logic_net_t & net() const; protected: @@ -568,14 +567,14 @@ namespace netlist class logic_input_t : public logic_t { public: - ATTR_COLD logic_input_t(core_device_t &dev, const pstring &aname); + logic_input_t(core_device_t &dev, const pstring &aname); - ATTR_HOT netlist_sig_t Q() const; + netlist_sig_t Q() const; - ATTR_HOT void inactivate(); - ATTR_HOT void activate(); - ATTR_HOT void activate_hl(); - ATTR_HOT void activate_lh(); + void inactivate(); + void activate(); + void activate_hl(); + void activate_lh(); protected: virtual void reset() override @@ -592,8 +591,8 @@ namespace netlist class analog_input_t : public analog_t { public: - ATTR_COLD analog_input_t(core_device_t &dev, const pstring &aname); - ATTR_HOT nl_double Q_Analog() const; + analog_input_t(core_device_t &dev, const pstring &aname); + nl_double Q_Analog() const; protected: virtual void reset() override @@ -616,37 +615,37 @@ namespace netlist using ptr_t = net_t *; using list_t = plib::pvector_t>; - ATTR_COLD net_t(netlist_t &nl, const pstring &aname, core_terminal_t *mr = nullptr); + net_t(netlist_t &nl, const pstring &aname, core_terminal_t *mr = nullptr); virtual ~net_t(); void reset(); - ATTR_COLD void register_con(core_terminal_t &terminal); - ATTR_COLD void merge_net(net_t *othernet); + void register_con(core_terminal_t &terminal); + void merge_net(net_t *othernet); - ATTR_COLD bool is_logic() const; - ATTR_COLD bool is_analog() const; + bool is_logic() const; + bool is_analog() const; - ATTR_HOT void push_to_queue(const netlist_time &delay) NOEXCEPT; - ATTR_HOT void reschedule_in_queue(const netlist_time &delay) NOEXCEPT; - ATTR_HOT bool is_queued() const { return m_in_queue == 1; } + void push_to_queue(const netlist_time delay) NOEXCEPT; + void reschedule_in_queue(const netlist_time delay) NOEXCEPT; + bool is_queued() const { return m_in_queue == 1; } - ATTR_HOT void update_devs(); + void update_devs(); - ATTR_HOT const netlist_time time() const { return m_time; } - ATTR_HOT void set_time(const netlist_time &ntime) { m_time = ntime; } + const netlist_time time() const { return m_time; } + void set_time(const netlist_time ntime) { m_time = ntime; } - ATTR_HOT bool isRailNet() const { return !(m_railterminal == nullptr); } - ATTR_HOT core_terminal_t & railterminal() const { return *m_railterminal; } + bool isRailNet() const { return !(m_railterminal == nullptr); } + core_terminal_t & railterminal() const { return *m_railterminal; } - ATTR_HOT int num_cons() const { return m_core_terms.size(); } + int num_cons() const { return m_core_terms.size(); } - ATTR_HOT void inc_active(core_terminal_t &term); - ATTR_HOT void dec_active(core_terminal_t &term); + void inc_active(core_terminal_t &term); + void dec_active(core_terminal_t &term); - ATTR_COLD void rebuild_list(); /* rebuild m_list after a load */ + void rebuild_list(); /* rebuild m_list after a load */ - ATTR_COLD void move_connections(net_t *new_net); + void move_connections(net_t *new_net); plib::pvector_t m_core_terms; // save post-start m_list ... @@ -677,15 +676,15 @@ namespace netlist using list_t = plib::pvector_t; - ATTR_COLD logic_net_t(netlist_t &nl, const pstring &aname, core_terminal_t *mr = nullptr); + logic_net_t(netlist_t &nl, const pstring &aname, core_terminal_t *mr = nullptr); virtual ~logic_net_t() { }; - ATTR_HOT netlist_sig_t Q() const { return m_cur_Q; } - ATTR_HOT netlist_sig_t new_Q() const { return m_new_Q; } - ATTR_HOT void toggle_new_Q() { m_new_Q ^= 1; } - ATTR_COLD void initial(const netlist_sig_t val) { m_cur_Q = m_new_Q = val; } + netlist_sig_t Q() const { return m_cur_Q; } + netlist_sig_t new_Q() const { return m_new_Q; } + void toggle_new_Q() { m_new_Q ^= 1; } + void initial(const netlist_sig_t val) { m_cur_Q = m_new_Q = val; } - ATTR_HOT void set_Q(const netlist_sig_t newQ, const netlist_time &delay) NOEXCEPT + void set_Q(const netlist_sig_t newQ, const netlist_time &delay) NOEXCEPT { if (newQ != m_new_Q) { @@ -694,7 +693,7 @@ namespace netlist } } - ATTR_HOT void set_Q_time(const netlist_sig_t newQ, const netlist_time &at) + void set_Q_time(const netlist_sig_t newQ, const netlist_time &at) { if (newQ != m_new_Q) { @@ -707,7 +706,7 @@ namespace netlist /* internal state support * FIXME: get rid of this and implement export/import in MAME */ - ATTR_COLD netlist_sig_t &Q_state_ptr() { return m_cur_Q; } + netlist_sig_t &Q_state_ptr() { return m_cur_Q; } protected: private: @@ -721,18 +720,18 @@ namespace netlist using list_t = plib::pvector_t; - ATTR_COLD analog_net_t(netlist_t &nl, const pstring &aname, core_terminal_t *mr = nullptr); + analog_net_t(netlist_t &nl, const pstring &aname, core_terminal_t *mr = nullptr); virtual ~analog_net_t() { }; - ATTR_HOT nl_double Q_Analog() const { return m_cur_Analog; } - ATTR_COLD nl_double &Q_Analog_state_ptr() { return m_cur_Analog; } + nl_double Q_Analog() const { return m_cur_Analog; } + nl_double &Q_Analog_state_ptr() { return m_cur_Analog; } //FIXME: needed by current solver code - ATTR_HOT devices::matrix_solver_t *solver() { return m_solver; } - ATTR_COLD void set_solver(devices::matrix_solver_t *solver) { m_solver = solver; } + devices::matrix_solver_t *solver() { return m_solver; } + void set_solver(devices::matrix_solver_t *solver) { m_solver = solver; } - ATTR_COLD bool already_processed(plib::pvector_t &groups); - ATTR_COLD void process_net(plib::pvector_t &groups); + bool already_processed(plib::pvector_t &groups); + void process_net(plib::pvector_t &groups); private: devices::matrix_solver_t *m_solver; @@ -749,16 +748,16 @@ namespace netlist friend class core_device_t; //FIXME - ATTR_COLD logic_output_t(core_device_t &dev, const pstring &aname); + logic_output_t(core_device_t &dev, const pstring &aname); virtual void reset() override { set_state(STATE_OUT); } - ATTR_COLD void initial(const netlist_sig_t val); + void initial(const netlist_sig_t val); - ATTR_HOT void set_Q(const netlist_sig_t newQ, const netlist_time &delay) NOEXCEPT + void set_Q(const netlist_sig_t newQ, const netlist_time &delay) NOEXCEPT { //net().set_Q(newQ, delay); m_my_net.set_Q(newQ, delay); @@ -773,10 +772,10 @@ namespace netlist P_PREVENT_COPYING(analog_output_t) public: - ATTR_COLD analog_output_t(core_device_t &dev, const pstring &aname); + analog_output_t(core_device_t &dev, const pstring &aname); - ATTR_COLD void initial(const nl_double val); - ATTR_HOT void set_Q(const nl_double newQ); + void initial(const nl_double val); + void set_Q(const nl_double newQ); analog_net_t *m_proxied_net; // only for proxy nets in analog input logic @@ -803,10 +802,10 @@ namespace netlist LOGIC }; - ATTR_COLD param_t(const param_type_t atype, device_t &device, const pstring &name); + param_t(const param_type_t atype, device_t &device, const pstring &name); virtual ~param_t() {} - ATTR_HOT param_type_t param_type() const { return m_param_type; } + param_type_t param_type() const { return m_param_type; } private: const param_type_t m_param_type; @@ -821,9 +820,9 @@ namespace netlist operator const C() const { return Value(); } - ATTR_HOT void setTo(const C ¶m); - ATTR_COLD void initial(const C &val) { m_param = val; } - ATTR_HOT C Value() const { return m_param; } + void setTo(const C ¶m); + void initial(const C &val) { m_param = val; } + C Value() const { return m_param; } protected: virtual void changed() { } @@ -840,13 +839,13 @@ namespace netlist class param_model_t : public param_str_t { public: - ATTR_COLD param_model_t(device_t &device, const pstring name, const pstring val) + param_model_t(device_t &device, const pstring name, const pstring val) : param_str_t(device, name, val) { } /* these should be cached! */ - ATTR_COLD nl_double model_value(const pstring &entity); - ATTR_COLD const pstring model_value_str(const pstring &entity); - ATTR_COLD const pstring model_type(); + nl_double model_value(const pstring &entity); + const pstring model_value_str(const pstring &entity); + const pstring model_type(); protected: void changed() override { @@ -867,12 +866,12 @@ namespace netlist using list_t = plib::pvector_t; - ATTR_COLD core_device_t(netlist_t &owner, const pstring &name); - ATTR_COLD core_device_t(core_device_t &owner, const pstring &name); + core_device_t(netlist_t &owner, const pstring &name); + core_device_t(core_device_t &owner, const pstring &name); virtual ~core_device_t(); - ATTR_HOT void update_dev() + void update_dev() { begin_timing(stat_total_time); inc_stat(stat_update_count); @@ -880,7 +879,7 @@ namespace netlist end_timing(stat_total_time); } - ATTR_HOT void do_update() NOEXCEPT + void do_update() NOEXCEPT { #if (NL_PMF_TYPE == NL_PMF_TYPE_GNUC_PMF) (this->*m_static_update)(); @@ -891,29 +890,29 @@ namespace netlist #endif } - ATTR_COLD void set_delegate_pointer(); - ATTR_COLD void stop_dev(); + void set_delegate_pointer(); + void stop_dev(); - ATTR_HOT netlist_sig_t INPLOGIC_PASSIVE(logic_input_t &inp); + netlist_sig_t INPLOGIC_PASSIVE(logic_input_t &inp); - ATTR_HOT netlist_sig_t INPLOGIC(const logic_input_t &inp) const + netlist_sig_t INPLOGIC(const logic_input_t &inp) const { nl_assert(inp.state() != logic_t::STATE_INP_PASSIVE); return inp.Q(); } - ATTR_HOT void OUTLOGIC(logic_output_t &out, const netlist_sig_t val, const netlist_time &delay) NOEXCEPT; + void OUTLOGIC(logic_output_t &out, const netlist_sig_t val, const netlist_time &delay) NOEXCEPT; - ATTR_HOT nl_double INPANALOG(const analog_input_t &inp) const { return inp.Q_Analog(); } + nl_double INPANALOG(const analog_input_t &inp) const { return inp.Q_Analog(); } - ATTR_HOT nl_double TERMANALOG(const terminal_t &term) const { return term.net().Q_Analog(); } + nl_double TERMANALOG(const terminal_t &term) const { return term.net().Q_Analog(); } - ATTR_HOT void OUTANALOG(analog_output_t &out, const nl_double val) + void OUTANALOG(analog_output_t &out, const nl_double val) { out.set_Q(val); } - ATTR_COLD void do_reset() { reset(); } + void do_reset() { reset(); } #if (NL_KEEP_STATISTICS) /* stats */ @@ -924,20 +923,20 @@ namespace netlist protected: - ATTR_HOT virtual void update() NOEXCEPT { } - ATTR_HOT virtual void stop() { } - ATTR_HOT virtual void reset() { } + virtual void update() NOEXCEPT { } + virtual void stop() { } + virtual void reset() { } public: - ATTR_HOT virtual void inc_active() { } - ATTR_HOT virtual void dec_active() { } - ATTR_HOT virtual void step_time(ATTR_UNUSED const nl_double st) { } - ATTR_HOT virtual void update_terminals() { } + virtual void inc_active() { } + virtual void dec_active() { } + virtual void step_time(ATTR_UNUSED const nl_double st) { } + virtual void update_terminals() { } - ATTR_HOT virtual void update_param() {} - ATTR_HOT virtual bool is_dynamic1() const { return false; } - ATTR_HOT virtual bool is_timestep() const { return false; } - ATTR_HOT virtual bool needs_update_after_param_change() const { return false; } + virtual void update_param() {} + virtual bool is_dynamic1() const { return false; } + virtual bool is_timestep() const { return false; } + virtual bool needs_update_after_param_change() const { return false; } private: @@ -978,12 +977,12 @@ namespace netlist public: template - ATTR_COLD device_t(C &owner, const pstring &name) + device_t(C &owner, const pstring &name) : core_device_t(owner, name) { } virtual ~device_t(); - ATTR_COLD setup_t &setup(); + setup_t &setup(); #if 1 template @@ -993,12 +992,12 @@ namespace netlist } #endif - ATTR_COLD void register_subalias(const pstring &name, core_terminal_t &term); - ATTR_COLD void register_subalias(const pstring &name, const pstring &aliased); + void register_subalias(const pstring &name, core_terminal_t &term); + void register_subalias(const pstring &name, const pstring &aliased); - ATTR_COLD void connect_late(const pstring &t1, const pstring &t2); - ATTR_COLD void connect_late(core_terminal_t &t1, core_terminal_t &t2); - ATTR_COLD void connect_post_start(core_terminal_t &t1, core_terminal_t &t2); + void connect_late(const pstring &t1, const pstring &t2); + void connect_late(core_terminal_t &t1, core_terminal_t &t2); + void connect_post_start(core_terminal_t &t1, core_terminal_t &t2); plib::pvector_t m_terminals; @@ -1008,8 +1007,8 @@ namespace netlist NETLIB_UPDATE_TERMINALSI() { } private: - ATTR_COLD void register_p(const pstring &name, object_t &obj); - ATTR_COLD void register_sub_p(device_t &dev); + void register_p(const pstring &name, object_t &obj); + void register_sub_p(device_t &dev); }; // ----------------------------------------------------------------------------- @@ -1072,33 +1071,33 @@ namespace netlist pstring name() const { return m_name; } - ATTR_COLD void start(); - ATTR_COLD void stop(); + void start(); + void stop(); - ATTR_HOT const queue_t &queue() const { return m_queue; } - ATTR_HOT queue_t &queue() { return m_queue; } - ATTR_HOT const netlist_time time() const { return m_time; } - ATTR_HOT devices::NETLIB_NAME(solver) *solver() const { return m_solver; } - ATTR_HOT devices::NETLIB_NAME(gnd) *gnd() const { return m_gnd; } - ATTR_HOT nl_double gmin() const; + const queue_t &queue() const { return m_queue; } + queue_t &queue() { return m_queue; } + const netlist_time time() const { return m_time; } + devices::NETLIB_NAME(solver) *solver() const { return m_solver; } + devices::NETLIB_NAME(gnd) *gnd() const { return m_gnd; } + nl_double gmin() const; - ATTR_HOT void push_to_queue(net_t &out, const netlist_time &attime) NOEXCEPT; - ATTR_HOT void remove_from_queue(net_t &out); + void push_to_queue(net_t &out, const netlist_time &attime) NOEXCEPT; + void remove_from_queue(net_t &out); - ATTR_HOT void process_queue(const netlist_time &delta); - ATTR_HOT void abort_current_queue_slice() { m_stop = netlist_time::zero; } + void process_queue(const netlist_time &delta); + void abort_current_queue_slice() { m_stop = netlist_time::zero; } - ATTR_HOT bool use_deactivate() const { return m_use_deactivate; } + bool use_deactivate() const { return m_use_deactivate; } - ATTR_COLD void rebuild_lists(); /* must be called after post_load ! */ + void rebuild_lists(); /* must be called after post_load ! */ - ATTR_COLD void set_setup(setup_t *asetup) { m_setup = asetup; } - ATTR_COLD setup_t &setup() { return *m_setup; } + void set_setup(setup_t *asetup) { m_setup = asetup; } + setup_t &setup() { return *m_setup; } - ATTR_COLD net_t *find_net(const pstring &name); + net_t *find_net(const pstring &name); template - ATTR_COLD plib::pvector_t get_device_list() + plib::pvector_t get_device_list() { plib::pvector_t tmp; for (auto &d : m_devices) @@ -1111,7 +1110,7 @@ namespace netlist } template - ATTR_COLD device_class *get_single_device(const char *classname) + device_class *get_single_device(const char *classname) { device_class *ret = nullptr; for (auto &d : m_devices) @@ -1132,12 +1131,12 @@ namespace netlist pvector_t m_started_devices; #endif - ATTR_COLD plib::plog_base &log() { return m_log; } - ATTR_COLD const plib::plog_base &log() const { return m_log; } + plib::plog_base &log() { return m_log; } + const plib::plog_base &log() const { return m_log; } virtual void reset(); - ATTR_COLD plib::dynlib &lib() { return *m_lib; } + plib::dynlib &lib() { return *m_lib; } void print_stats() const; @@ -1200,13 +1199,13 @@ protected: // inline implementations // ----------------------------------------------------------------------------- - ATTR_COLD inline plib::pstate_manager_t &object_t::state_manager() + inline plib::pstate_manager_t &object_t::state_manager() { return m_netlist; } template - ATTR_HOT inline void param_template_t::setTo(const C ¶m) + inline void param_template_t::setTo(const C ¶m) { if (m_param != param) { @@ -1218,27 +1217,27 @@ protected: } } - ATTR_COLD inline bool core_terminal_t::is_logic() const + inline bool core_terminal_t::is_logic() const { return dynamic_cast(this) != nullptr; } - ATTR_COLD inline bool core_terminal_t::is_analog() const + inline bool core_terminal_t::is_analog() const { return dynamic_cast(this) != nullptr; } - ATTR_COLD inline bool net_t::is_logic() const + inline bool net_t::is_logic() const { return dynamic_cast(this) != nullptr; } - ATTR_COLD inline bool net_t::is_analog() const + inline bool net_t::is_analog() const { return dynamic_cast(this) != nullptr; } - ATTR_HOT inline void logic_input_t::inactivate() + inline void logic_input_t::inactivate() { if (EXPECTED(!is_state(STATE_INP_PASSIVE))) { @@ -1247,7 +1246,7 @@ protected: } } - ATTR_HOT inline void logic_input_t::activate() + inline void logic_input_t::activate() { if (is_state(STATE_INP_PASSIVE)) { @@ -1256,7 +1255,7 @@ protected: } } - ATTR_HOT inline void logic_input_t::activate_hl() + inline void logic_input_t::activate_hl() { if (is_state(STATE_INP_PASSIVE)) { @@ -1265,7 +1264,7 @@ protected: } } - ATTR_HOT inline void logic_input_t::activate_lh() + inline void logic_input_t::activate_lh() { if (is_state(STATE_INP_PASSIVE)) { @@ -1274,7 +1273,7 @@ protected: } } - ATTR_HOT inline void net_t::push_to_queue(const netlist_time &delay) NOEXCEPT + inline void net_t::push_to_queue(const netlist_time delay) NOEXCEPT { if (!is_queued() && (num_cons() > 0)) { @@ -1287,7 +1286,7 @@ protected: } } - ATTR_HOT inline void net_t::reschedule_in_queue(const netlist_time &delay) NOEXCEPT + inline void net_t::reschedule_in_queue(const netlist_time delay) NOEXCEPT { if (is_queued()) netlist().remove_from_queue(*this); @@ -1300,37 +1299,37 @@ protected: } } - ATTR_HOT inline const analog_net_t & analog_t::net() const + inline const analog_net_t & analog_t::net() const { return static_cast(core_terminal_t::net()); } - ATTR_HOT inline analog_net_t & analog_t::net() + inline analog_net_t & analog_t::net() { return static_cast(core_terminal_t::net()); } - ATTR_HOT inline logic_net_t & logic_t::net() + inline logic_net_t & logic_t::net() { return *static_cast(&core_terminal_t::net()); } - ATTR_HOT inline const logic_net_t & logic_t::net() const + inline const logic_net_t & logic_t::net() const { return static_cast(core_terminal_t::net()); } - ATTR_HOT inline netlist_sig_t logic_input_t::Q() const + inline netlist_sig_t logic_input_t::Q() const { return net().Q(); } - ATTR_HOT inline nl_double analog_input_t::Q_Analog() const + inline nl_double analog_input_t::Q_Analog() const { return net().Q_Analog(); } - ATTR_HOT inline void analog_output_t::set_Q(const nl_double newQ) + inline void analog_output_t::set_Q(const nl_double newQ) { if (newQ != net().Q_Analog()) { @@ -1339,17 +1338,17 @@ protected: } } - ATTR_HOT inline void netlist_t::push_to_queue(net_t &out, const netlist_time &attime) NOEXCEPT + inline void netlist_t::push_to_queue(net_t &out, const netlist_time &attime) NOEXCEPT { m_queue.push(attime, &out); } - ATTR_HOT inline void netlist_t::remove_from_queue(net_t &out) + inline void netlist_t::remove_from_queue(net_t &out) { m_queue.remove(&out); } - ATTR_HOT inline void core_device_t::OUTLOGIC(logic_output_t &out, const netlist_sig_t val, const netlist_time &delay) NOEXCEPT + inline void core_device_t::OUTLOGIC(logic_output_t &out, const netlist_sig_t val, const netlist_time &delay) NOEXCEPT { out.set_Q(val, delay); } diff --git a/src/lib/netlist/nl_config.h b/src/lib/netlist/nl_config.h index 6ca57b864f5..68a60ece8e4 100644 --- a/src/lib/netlist/nl_config.h +++ b/src/lib/netlist/nl_config.h @@ -40,7 +40,7 @@ * * The whole exercise was done to avoid virtual calls. In prior versions of * netlist, the INTERNAL and GNUC_PMF_CONV approach provided significant improvement. - * Since than, ATTR_COLD was removed from functions declared as virtual. + * Since than, was removed from functions declared as virtual. * This may explain that the recent benchmarks show no difference at all. * * Disappointing is the GNUC_PMF performance. diff --git a/src/lib/netlist/nl_factory.cpp b/src/lib/netlist/nl_factory.cpp index 545e2c3a601..6d9d8e9bfd5 100644 --- a/src/lib/netlist/nl_factory.cpp +++ b/src/lib/netlist/nl_factory.cpp @@ -18,7 +18,7 @@ namespace netlist // net_device_t_base_factory // ---------------------------------------------------------------------------------------- -ATTR_COLD const plib::pstring_vector_t base_factory_t::term_param_list() +const plib::pstring_vector_t base_factory_t::term_param_list() { if (m_def_param.startsWith("+")) return plib::pstring_vector_t(m_def_param.substr(1), ","); @@ -26,7 +26,7 @@ ATTR_COLD const plib::pstring_vector_t base_factory_t::term_param_list() return plib::pstring_vector_t(); } -ATTR_COLD const plib::pstring_vector_t base_factory_t::def_params() +const plib::pstring_vector_t base_factory_t::def_params() { if (m_def_param.startsWith("+") || m_def_param.equals("-")) return plib::pstring_vector_t(); diff --git a/src/lib/netlist/nl_lists.h b/src/lib/netlist/nl_lists.h index da5e2ca8967..a46f1b326df 100644 --- a/src/lib/netlist/nl_lists.h +++ b/src/lib/netlist/nl_lists.h @@ -43,10 +43,10 @@ namespace netlist clear(); } - ATTR_HOT std::size_t capacity() const { return m_list.size(); } - ATTR_HOT bool empty() const { return (m_end == &m_list[1]); } + std::size_t capacity() const { return m_list.size(); } + bool empty() const { return (m_end == &m_list[1]); } - ATTR_HOT void push(const Time t, Element o) NOEXCEPT + void push(const Time t, Element o) NOEXCEPT { #if HAS_OPENMP && USE_OPENMP /* Lock */ @@ -67,10 +67,10 @@ namespace netlist //nl_assert(m_end - m_list < Size); } - ATTR_HOT const entry_t & pop() NOEXCEPT { return *(--m_end); } - ATTR_HOT const entry_t & top() const NOEXCEPT { return *(m_end-1); } + const entry_t & pop() NOEXCEPT { return *(--m_end); } + const entry_t & top() const NOEXCEPT { return *(m_end-1); } - ATTR_HOT void remove(const Element &elem) NOEXCEPT + void remove(const Element &elem) NOEXCEPT { /* Lock */ #if HAS_OPENMP && USE_OPENMP @@ -97,7 +97,7 @@ namespace netlist #endif } - ATTR_COLD void clear() + void clear() { m_end = &m_list[0]; /* put an empty element with maximum time into the queue. @@ -110,9 +110,9 @@ namespace netlist // save state support & mame disasm - ATTR_COLD const entry_t *listptr() const { return &m_list[1]; } - ATTR_HOT std::size_t size() const { return m_end - &m_list[1]; } - ATTR_HOT const entry_t & operator[](const std::size_t index) const { return m_list[1+index]; } + const entry_t *listptr() const { return &m_list[1]; } + std::size_t size() const { return m_end - &m_list[1]; } + const entry_t & operator[](const std::size_t index) const { return m_list[1+index]; } #if (NL_KEEP_STATISTICS) // profiling diff --git a/src/lib/netlist/nl_parser.cpp b/src/lib/netlist/nl_parser.cpp index c001a6c0fd6..14aabdf4a0e 100644 --- a/src/lib/netlist/nl_parser.cpp +++ b/src/lib/netlist/nl_parser.cpp @@ -15,7 +15,7 @@ namespace netlist // A netlist parser // ---------------------------------------------------------------------------------------- -ATTR_COLD void parser_t::verror(const pstring &msg, int line_num, const pstring &line) +void parser_t::verror(const pstring &msg, int line_num, const pstring &line) { m_setup.log().fatal("line {1}: error: {2}\n\t\t{3}\n", line_num, msg, line); diff --git a/src/lib/netlist/nl_setup.cpp b/src/lib/netlist/nl_setup.cpp index 12f933b2a46..102d1ce483a 100644 --- a/src/lib/netlist/nl_setup.cpp +++ b/src/lib/netlist/nl_setup.cpp @@ -76,7 +76,7 @@ setup_t::~setup_t() pstring::resetmem(); } -ATTR_COLD pstring setup_t::build_fqn(const pstring &obj_name) const +pstring setup_t::build_fqn(const pstring &obj_name) const { if (m_namespace_stack.empty()) //return netlist().name() + "." + obj_name; diff --git a/src/lib/netlist/nl_setup.h b/src/lib/netlist/nl_setup.h index bc2f4f994d5..fe7d911a31d 100644 --- a/src/lib/netlist/nl_setup.h +++ b/src/lib/netlist/nl_setup.h @@ -46,10 +46,10 @@ #define NETLIST_NAME(name) netlist ## _ ## name #define NETLIST_EXTERNAL(name) \ - ATTR_COLD void NETLIST_NAME(name)(netlist::setup_t &setup); + void NETLIST_NAME(name)(netlist::setup_t &setup); #define NETLIST_START(name) \ -ATTR_COLD void NETLIST_NAME(name)(netlist::setup_t &setup) \ +void NETLIST_NAME(name)(netlist::setup_t &setup) \ { #define NETLIST_END() } diff --git a/src/lib/netlist/nl_time.h b/src/lib/netlist/nl_time.h index a420ba2614b..e05d6aa6b53 100644 --- a/src/lib/netlist/nl_time.h +++ b/src/lib/netlist/nl_time.h @@ -17,15 +17,12 @@ #define NLTIME_FROM_NS(t) netlist_time::from_nsec(t) #define NLTIME_FROM_US(t) netlist_time::from_usec(t) #define NLTIME_FROM_MS(t) netlist_time::from_msec(t) -#define NLTIME_IMMEDIATE netlist_time::from_nsec(1) +#define NLTIME_IMMEDIATE netlist_time::from_nsec(1) // ---------------------------------------------------------------------------------------- -// net_list_time +// netlist_time // ---------------------------------------------------------------------------------------- -#undef ATTR_HOT -#define ATTR_HOT - namespace netlist { struct netlist_time @@ -41,104 +38,99 @@ namespace netlist #endif static const INTERNALTYPE RESOLUTION = NETLIST_INTERNAL_RES; - ATTR_HOT netlist_time() : m_time(0) {} - //ATTR_HOT netlist_time(const netlist_time &rhs) NOEXCEPT : m_time(rhs.m_time) {} - //ATTR_HOT netlist_time(netlist_time &&rhs) NOEXCEPT : m_time(rhs.m_time) {} - ATTR_HOT netlist_time(const netlist_time &rhs) NOEXCEPT = default; - ATTR_HOT netlist_time(netlist_time &&rhs) NOEXCEPT = default; + netlist_time() : m_time(0) {} + explicit netlist_time(const double t) + : m_time((INTERNALTYPE) ( t * (double) RESOLUTION)) { } + explicit netlist_time(const INTERNALTYPE nom, const INTERNALTYPE den) + : m_time(nom * (RESOLUTION / den)) { } - ATTR_HOT friend const netlist_time operator-(const netlist_time &left, const netlist_time &right); - ATTR_HOT friend const netlist_time operator+(const netlist_time &left, const netlist_time &right); - ATTR_HOT friend const netlist_time operator*(const netlist_time &left, const UINT64 factor); - ATTR_HOT friend UINT64 operator/(const netlist_time &left, const netlist_time &right); - ATTR_HOT friend bool operator>(const netlist_time &left, const netlist_time &right); - ATTR_HOT friend bool operator<(const netlist_time &left, const netlist_time &right); - ATTR_HOT friend bool operator>=(const netlist_time &left, const netlist_time &right); - ATTR_HOT friend bool operator<=(const netlist_time &left, const netlist_time &right); - ATTR_HOT friend bool operator!=(const netlist_time &left, const netlist_time &right); - ATTR_HOT friend bool operator==(const netlist_time &left, const netlist_time &right); + netlist_time(const netlist_time &rhs) NOEXCEPT = default; + netlist_time(netlist_time &&rhs) NOEXCEPT = default; - ATTR_HOT const netlist_time &operator=(const netlist_time &right) { m_time = right.m_time; return *this; } + netlist_time &operator+=(const netlist_time &right) { m_time += right.m_time; return *this; } + netlist_time &operator-=(const netlist_time &right) { m_time -= right.m_time; return *this; } - ATTR_HOT const netlist_time &operator+=(const netlist_time &right) { m_time += right.m_time; return *this; } + friend netlist_time operator-(netlist_time left, const netlist_time &right) + { + left -= right; + return left; + } - ATTR_HOT INTERNALTYPE as_raw() const { return m_time; } - ATTR_HOT double as_double() const { return (double) m_time / (double) RESOLUTION; } + friend netlist_time operator+(netlist_time left, const netlist_time &right) + { + left += right; + return left; + } + + friend netlist_time operator*(netlist_time left, const UINT64 factor) + { + left.m_time *= factor; + return left; + } + + friend UINT64 operator/(const netlist_time &left, const netlist_time &right) + { + return left.m_time / right.m_time; + } + + friend bool operator<(const netlist_time &left, const netlist_time &right) + { + return (left.m_time < right.m_time); + } + + friend bool operator>(const netlist_time &left, const netlist_time &right) + { + return right < left; + } + + friend bool operator<=(const netlist_time &left, const netlist_time &right) + { + return !(left > right); + } + + friend bool operator>=(const netlist_time &left, const netlist_time &right) + { + return !(left < right); + } + + friend bool operator==(const netlist_time &left, const netlist_time &right) + { + return (left.m_time == right.m_time); + } + + friend bool operator!=(const netlist_time &left, const netlist_time &right) + { + return !(left == right); + } + + netlist_time &operator=(const netlist_time &right) { m_time = right.m_time; return *this; } + + INTERNALTYPE as_raw() const { return m_time; } + double as_double() const { return (double) m_time / (double) RESOLUTION; } // for save states .... - ATTR_HOT INTERNALTYPE *get_internaltype_ptr() { return &m_time; } + INTERNALTYPE *get_internaltype_ptr() { return &m_time; } - ATTR_HOT static const netlist_time from_nsec(const INTERNALTYPE ns) { return netlist_time(ns * (RESOLUTION / U64(1000000000))); } - ATTR_HOT static const netlist_time from_usec(const INTERNALTYPE us) { return netlist_time(us * (RESOLUTION / U64(1000000))); } - ATTR_HOT static const netlist_time from_msec(const INTERNALTYPE ms) { return netlist_time(ms * (RESOLUTION / U64(1000))); } - ATTR_HOT static const netlist_time from_hz(const INTERNALTYPE hz) { return netlist_time(RESOLUTION / hz); } - ATTR_HOT static const netlist_time from_double(const double t) { return netlist_time((INTERNALTYPE) ( t * (double) RESOLUTION)); } - ATTR_HOT static const netlist_time from_raw(const INTERNALTYPE raw) { return netlist_time(raw); } + static netlist_time from_nsec(const INTERNALTYPE ns) { return netlist_time(ns, U64(1000000000)); } + static netlist_time from_usec(const INTERNALTYPE us) { return netlist_time(us, U64(1000000)); } + static netlist_time from_msec(const INTERNALTYPE ms) { return netlist_time(ms, U64(1000)); } + static netlist_time from_hz(const INTERNALTYPE hz) { return netlist_time(1 , hz); } + static netlist_time from_raw(const INTERNALTYPE raw) { return netlist_time(raw, RESOLUTION); } static const netlist_time zero; protected: - ATTR_HOT netlist_time(const INTERNALTYPE val) : m_time(val) {} - private: INTERNALTYPE m_time; }; - ATTR_HOT inline const netlist_time operator-(const netlist_time &left, const netlist_time &right) - { - return netlist_time(left.m_time - right.m_time); - } - ATTR_HOT inline const netlist_time operator*(const netlist_time &left, const UINT64 factor) - { - return netlist_time(left.m_time * factor); - } - - ATTR_HOT inline UINT64 operator/(const netlist_time &left, const netlist_time &right) - { - return left.m_time / right.m_time; - } - - ATTR_HOT inline const netlist_time operator+(const netlist_time &left, const netlist_time &right) - { - return netlist_time(left.m_time + right.m_time); - } - - ATTR_HOT inline bool operator<(const netlist_time &left, const netlist_time &right) - { - return (left.m_time < right.m_time); - } - - ATTR_HOT inline bool operator>(const netlist_time &left, const netlist_time &right) - { - return (left.m_time > right.m_time); - } - - ATTR_HOT inline bool operator<=(const netlist_time &left, const netlist_time &right) - { - return (left.m_time <= right.m_time); - } - - ATTR_HOT inline bool operator>=(const netlist_time &left, const netlist_time &right) - { - return (left.m_time >= right.m_time); - } - - ATTR_HOT inline bool operator!=(const netlist_time &left, const netlist_time &right) - { - return (left.m_time != right.m_time); - } - - ATTR_HOT inline bool operator==(const netlist_time &left, const netlist_time &right) - { - return (left.m_time == right.m_time); - } } namespace plib { -template<> ATTR_COLD inline void pstate_manager_t::save_item(const void *owner, netlist::netlist_time &nlt, const pstring &stname) +template<> inline void pstate_manager_t::save_item(const void *owner, netlist::netlist_time &nlt, const pstring &stname) { save_state_ptr(owner, stname, netlist::netlist_time::STATETYPE, sizeof(netlist::netlist_time::INTERNALTYPE), 1, nlt.get_internaltype_ptr(), false); } diff --git a/src/lib/netlist/nl_util.h b/src/lib/netlist/nl_util.h index 54e0090119d..969f4f5138c 100644 --- a/src/lib/netlist/nl_util.h +++ b/src/lib/netlist/nl_util.h @@ -71,8 +71,8 @@ public: static T log(const T &x) { return std::log(x); } #if defined(MSC_VER) && MSC_VER < 1800 - ATTR_HOT inline static double e_log1p(const double &x) { return nl_math::log(1.0 + x); } - ATTR_HOT inline static float e_log1p(const float &x) { return nl_math::log(1.0 + x); } + inline static double e_log1p(const double &x) { return nl_math::log(1.0 + x); } + inline static float e_log1p(const float &x) { return nl_math::log(1.0 + x); } #else template static T e_log1p(const T &x) { return log1p(x); } @@ -88,7 +88,7 @@ public: // add c3 and it'll be better than 1% #if 0 - ATTR_HOT inline static float exp(const float &x) { return std::exp(x); } + inline static float exp(const float &x) { return std::exp(x); } inline static double fastexp_h(const double &x) { /* static */ const double ln2r = 1.442695040888963387; @@ -109,7 +109,7 @@ public: return pow(2.0, t)*e; } - ATTR_HOT inline static double exp(const double &x) + inline static double exp(const double &x) { if (x<0) return 1.0 / fastexp_h(-x); diff --git a/src/lib/netlist/plib/pconfig.h b/src/lib/netlist/plib/pconfig.h index 7634c663123..8ba86bc290b 100644 --- a/src/lib/netlist/plib/pconfig.h +++ b/src/lib/netlist/plib/pconfig.h @@ -91,8 +91,8 @@ typedef _int128_t INT128; #endif /* not supported in GCC prior to 4.4.x */ -#define ATTR_HOT __attribute__((hot)) -#define ATTR_COLD __attribute__((cold)) +#define __attribute__((hot)) +#define __attribute__((cold)) #define RESTRICT __restrict__ #define EXPECTED(x) (x) diff --git a/src/lib/netlist/plib/pfmtlog.h b/src/lib/netlist/plib/pfmtlog.h index 603e623c103..af899c35a26 100644 --- a/src/lib/netlist/plib/pfmtlog.h +++ b/src/lib/netlist/plib/pfmtlog.h @@ -108,21 +108,21 @@ public: virtual ~pformat_base() { } - ATTR_COLD P &operator ()(const double x, const char *f = "") { format_element(f, "", "f", x); return static_cast

(*this); } - ATTR_COLD P & e(const double x, const char *f = "") { format_element(f, "", "e", x); return static_cast

(*this); } - ATTR_COLD P & g(const double x, const char *f = "") { format_element(f, "", "g", x); return static_cast

(*this); } + P &operator ()(const double x, const char *f = "") { format_element(f, "", "f", x); return static_cast

(*this); } + P & e(const double x, const char *f = "") { format_element(f, "", "e", x); return static_cast

(*this); } + P & g(const double x, const char *f = "") { format_element(f, "", "g", x); return static_cast

(*this); } - ATTR_COLD P &operator ()(const float x, const char *f = "") { format_element(f, "", "f", x); return static_cast

(*this); } - ATTR_COLD P & e(const float x, const char *f = "") { format_element(f, "", "e", x); return static_cast

(*this); } - ATTR_COLD P & g(const float x, const char *f = "") { format_element(f, "", "g", x); return static_cast

(*this); } + P &operator ()(const float x, const char *f = "") { format_element(f, "", "f", x); return static_cast

(*this); } + P & e(const float x, const char *f = "") { format_element(f, "", "e", x); return static_cast

(*this); } + P & g(const float x, const char *f = "") { format_element(f, "", "g", x); return static_cast

(*this); } - ATTR_COLD P &operator ()(const char *x, const char *f = "") { format_element(f, "", "s", x); return static_cast

(*this); } - ATTR_COLD P &operator ()(char *x, const char *f = "") { format_element(f, "", "s", x); return static_cast

(*this); } - ATTR_COLD P &operator ()(const void *x, const char *f = "") { format_element(f, "", "p", x); return static_cast

(*this); } - ATTR_COLD P &operator ()(const pstring &x, const char *f = "") { format_element(f, "", "s", x.cstr() ); return static_cast

(*this); } + P &operator ()(const char *x, const char *f = "") { format_element(f, "", "s", x); return static_cast

(*this); } + P &operator ()(char *x, const char *f = "") { format_element(f, "", "s", x); return static_cast

(*this); } + P &operator ()(const void *x, const char *f = "") { format_element(f, "", "p", x); return static_cast

(*this); } + P &operator ()(const pstring &x, const char *f = "") { format_element(f, "", "s", x.cstr() ); return static_cast

(*this); } template - ATTR_COLD P &operator ()(const T x, const char *f = "") + P &operator ()(const T x, const char *f = "") { if (ptype_treats::is_signed) format_element(f, ptype_treats::size_specifier(), "d", ptype_treats::cast(x)); @@ -132,14 +132,14 @@ public: } template - ATTR_COLD P &x(const T x, const char *f = "") + P &x(const T x, const char *f = "") { format_element(f, ptype_treats::size_specifier(), "x", x); return static_cast

(*this); } template - ATTR_COLD P &o(const T x, const char *f = "") + P &o(const T x, const char *f = "") { format_element(f, ptype_treats::size_specifier(), "o", x); return static_cast

(*this); @@ -191,37 +191,37 @@ public: pfmt_writer_t() : m_enabled(true) { } virtual ~pfmt_writer_t() { } - ATTR_COLD void operator ()(const char *fmt) const + void operator ()(const char *fmt) const { if (build_enabled && m_enabled) vdowrite(fmt); } template - ATTR_COLD void operator ()(const char *fmt, const T1 &v1) const + void operator ()(const char *fmt, const T1 &v1) const { if (build_enabled && m_enabled) vdowrite(pfmt(fmt)(v1)); } template - ATTR_COLD void operator ()(const char *fmt, const T1 &v1, const T2 &v2) const + void operator ()(const char *fmt, const T1 &v1, const T2 &v2) const { if (build_enabled && m_enabled) vdowrite(pfmt(fmt)(v1)(v2)); } template - ATTR_COLD void operator ()(const char *fmt, const T1 &v1, const T2 &v2, const T3 &v3) const + void operator ()(const char *fmt, const T1 &v1, const T2 &v2, const T3 &v3) const { if (build_enabled && m_enabled) vdowrite(pfmt(fmt)(v1)(v2)(v3)); } template - ATTR_COLD void operator ()(const char *fmt, const T1 &v1, const T2 &v2, const T3 &v3, const T4 &v4) const + void operator ()(const char *fmt, const T1 &v1, const T2 &v2, const T3 &v3, const T4 &v4) const { if (build_enabled && m_enabled) vdowrite(pfmt(fmt)(v1)(v2)(v3)(v4)); } template - ATTR_COLD void operator ()(const char *fmt, const T1 &v1, const T2 &v2, const T3 &v3, const T4 &v4, const T5 &v5) const + void operator ()(const char *fmt, const T1 &v1, const T2 &v2, const T3 &v3, const T4 &v4, const T5 &v5) const { if (build_enabled && m_enabled) vdowrite(pfmt(fmt)(v1)(v2)(v3)(v4)(v5)); } diff --git a/src/lib/netlist/plib/plists.h b/src/lib/netlist/plib/plists.h index ae62e1dd886..f057adfc366 100644 --- a/src/lib/netlist/plib/plists.h +++ b/src/lib/netlist/plib/plists.h @@ -91,12 +91,12 @@ public: this->erase(std::remove(this->begin(), this->end(), elem), this->end()); } - ATTR_HOT void insert_at(const std::size_t index, const LC &elem) + void insert_at(const std::size_t index, const LC &elem) { this->insert(this->begin() + index, elem); } - ATTR_HOT void remove_at(const std::size_t pos) + void remove_at(const std::size_t pos) { this->erase(this->begin() + pos); } @@ -144,7 +144,7 @@ public: linkedlist_t() : m_head(nullptr) {} #if 0 - ATTR_HOT void insert(const LC &before, LC &elem) + void insert(const LC &before, LC &elem) { if (m_head == &before) { @@ -168,13 +168,13 @@ public: } } #endif - ATTR_HOT void insert(LC &elem) + void insert(LC &elem) { elem.m_next = m_head; m_head = &elem; } - ATTR_HOT void add(LC &elem) + void add(LC &elem) { LC **p = &m_head; while (*p != nullptr) @@ -185,7 +185,7 @@ public: elem.m_next = nullptr; } - ATTR_HOT void remove(const LC &elem) + void remove(const LC &elem) { LC **p; for (p = &m_head; *p != &elem; p = &((*p)->m_next)) @@ -195,9 +195,9 @@ public: (*p) = elem.m_next; } - ATTR_HOT LC *first() const { return m_head; } - ATTR_HOT void clear() { m_head = nullptr; } - ATTR_HOT bool is_empty() const { return (m_head == nullptr); } + LC *first() const { return m_head; } + void clear() { m_head = nullptr; } + bool is_empty() const { return (m_head == nullptr); } //private: LC *m_head; @@ -226,7 +226,7 @@ public: linkedlist_t() : m_head(nullptr), m_tail(nullptr) {} - ATTR_HOT void insert(LC &elem) + void insert(LC &elem) { if (m_head != nullptr) m_head->m_prev = &elem; @@ -237,7 +237,7 @@ public: m_tail = &elem; } - ATTR_HOT void add(LC &elem) + void add(LC &elem) { if (m_tail != nullptr) m_tail->m_next = &elem; @@ -248,7 +248,7 @@ public: m_head = &elem; } - ATTR_HOT void remove(const LC &elem) + void remove(const LC &elem) { if (prev(elem) == nullptr) { @@ -270,13 +270,13 @@ public: } - ATTR_HOT static LC *next(const LC &elem) { return static_cast(elem.m_next); } - ATTR_HOT static LC *next(const LC *elem) { return static_cast(elem->m_next); } - ATTR_HOT static LC *prev(const LC &elem) { return static_cast(elem.m_prev); } - ATTR_HOT static LC *prev(const LC *elem) { return static_cast(elem->m_prev); } - ATTR_HOT LC *first() const { return m_head; } - ATTR_HOT void clear() { m_head = m_tail = nullptr; } - ATTR_HOT bool is_empty() const { return (m_head == nullptr); } + static LC *next(const LC &elem) { return static_cast(elem.m_next); } + static LC *next(const LC *elem) { return static_cast(elem->m_next); } + static LC *prev(const LC &elem) { return static_cast(elem.m_prev); } + static LC *prev(const LC *elem) { return static_cast(elem->m_prev); } + LC *first() const { return m_head; } + void clear() { m_head = m_tail = nullptr; } + bool is_empty() const { return (m_head == nullptr); } private: LC *m_head; diff --git a/src/lib/netlist/plib/pparser.cpp b/src/lib/netlist/plib/pparser.cpp index ad60a91b4b1..4daa9ebd1a3 100644 --- a/src/lib/netlist/plib/pparser.cpp +++ b/src/lib/netlist/plib/pparser.cpp @@ -243,7 +243,7 @@ ptokenizer::token_t ptokenizer::get_token_internal() } -ATTR_COLD void ptokenizer::error(const pstring &errs) +void ptokenizer::error(const pstring &errs) { verror("Error: " + errs, currentline_no(), currentline_str()); //throw error; diff --git a/src/lib/netlist/plib/pstate.cpp b/src/lib/netlist/plib/pstate.cpp index a1585f11a62..e66f415b8f8 100644 --- a/src/lib/netlist/plib/pstate.cpp +++ b/src/lib/netlist/plib/pstate.cpp @@ -20,7 +20,7 @@ pstate_manager_t::~pstate_manager_t() -ATTR_COLD void pstate_manager_t::save_state_ptr(const void *owner, const pstring &stname, const pstate_data_type_e dt, const int size, const int count, void *ptr, bool is_ptr) +void pstate_manager_t::save_state_ptr(const void *owner, const pstring &stname, const pstate_data_type_e dt, const int size, const int count, void *ptr, bool is_ptr) { pstring fullname = stname; ATTR_UNUSED pstring ts[] = { @@ -42,7 +42,7 @@ ATTR_COLD void pstate_manager_t::save_state_ptr(const void *owner, const pstring m_save.push_back(std::move(p)); } -ATTR_COLD void pstate_manager_t::remove_save_items(const void *owner) +void pstate_manager_t::remove_save_items(const void *owner) { unsigned i = 0; while (i < m_save.size()) @@ -54,21 +54,21 @@ ATTR_COLD void pstate_manager_t::remove_save_items(const void *owner) } } -ATTR_COLD void pstate_manager_t::pre_save() +void pstate_manager_t::pre_save() { for (std::size_t i=0; i < m_save.size(); i++) if (m_save[i]->m_dt == DT_CUSTOM) m_save[i]->m_callback->on_pre_save(); } -ATTR_COLD void pstate_manager_t::post_load() +void pstate_manager_t::post_load() { for (std::size_t i=0; i < m_save.size(); i++) if (m_save[i]->m_dt == DT_CUSTOM) m_save[i]->m_callback->on_post_load(); } -template<> ATTR_COLD void pstate_manager_t::save_item(const void *owner, pstate_callback_t &state, const pstring &stname) +template<> void pstate_manager_t::save_item(const void *owner, pstate_callback_t &state, const pstring &stname) { //save_state_ptr(stname, DT_CUSTOM, 0, 1, &state); pstate_callback_t *state_p = &state; diff --git a/src/lib/netlist/plib/pstate.h b/src/lib/netlist/plib/pstate.h index 9bcf04c8997..12115678b3a 100644 --- a/src/lib/netlist/plib/pstate.h +++ b/src/lib/netlist/plib/pstate.h @@ -124,17 +124,17 @@ public: pstate_manager_t(); ~pstate_manager_t(); - template ATTR_COLD void save_item(const void *owner, C &state, const pstring &stname) + template void save_item(const void *owner, C &state, const pstring &stname) { save_state_ptr( owner, stname, pstate_datatype::type, sizeof(C), 1, &state, pstate_datatype::is_ptr); } - template ATTR_COLD void save_item(const void *owner, C (&state)[N], const pstring &stname) + template void save_item(const void *owner, C (&state)[N], const pstring &stname) { save_state_ptr(owner, stname, pstate_datatype::type, sizeof(state[0]), N, &(state[0]), false); } - template ATTR_COLD void save_item(const void *owner, C *state, const pstring &stname, const int count) + template void save_item(const void *owner, C *state, const pstring &stname, const int count) { save_state_ptr(owner, stname, pstate_datatype::type, sizeof(C), count, state, false); } @@ -145,13 +145,13 @@ public: save_state(v.data(), owner, stname, v.size()); } - ATTR_COLD void pre_save(); - ATTR_COLD void post_load(); - ATTR_COLD void remove_save_items(const void *owner); + void pre_save(); + void post_load(); + void remove_save_items(const void *owner); const pstate_entry_t::list_t &save_list() const { return m_save; } - ATTR_COLD void save_state_ptr(const void *owner, const pstring &stname, const pstate_data_type_e, const int size, const int count, void *ptr, bool is_ptr); + void save_state_ptr(const void *owner, const pstring &stname, const pstate_data_type_e, const int size, const int count, void *ptr, bool is_ptr); protected: @@ -159,7 +159,7 @@ private: pstate_entry_t::list_t m_save; }; -template<> ATTR_COLD void pstate_manager_t::save_item(const void *owner, pstate_callback_t &state, const pstring &stname); +template<> void pstate_manager_t::save_item(const void *owner, pstate_callback_t &state, const pstring &stname); template class pstate_interface_t @@ -173,13 +173,13 @@ public: pstring module = static_cast(this)->name(); manager.save_item(this, state, module + "." + stname); } - template ATTR_COLD void save(C (&state)[N], const pstring &stname) + template void save(C (&state)[N], const pstring &stname) { pstate_manager_t &manager = static_cast(this)->state_manager(); pstring module = static_cast(this)->name(); manager.save_state_ptr(this, module + "." + stname, pstate_datatype::type, sizeof(state[0]), N, &(state[0]), false); } - template ATTR_COLD void save(C *state, const pstring &stname, const int count) + template void save(C *state, const pstring &stname, const int count) { pstate_manager_t &manager = static_cast(this)->state_manager(); pstring module = static_cast(this)->name(); diff --git a/src/lib/netlist/prg/nltool.cpp b/src/lib/netlist/prg/nltool.cpp index ed96b517192..b9cdeff542e 100644 --- a/src/lib/netlist/prg/nltool.cpp +++ b/src/lib/netlist/prg/nltool.cpp @@ -161,7 +161,7 @@ struct input_t int e = sscanf(line.cstr(), "%lf,%[^,],%lf", &t, buf, &m_value); if ( e!= 3) throw netlist::fatalerror_e(plib::pfmt("error {1} scanning line {2}\n")(e)(line)); - m_time = netlist::netlist_time::from_double(t); + m_time = netlist::netlist_time(t); m_param = netlist->setup().find_param(buf, true); } @@ -235,14 +235,14 @@ static void run(tool_options_t &opts) unsigned pos = 0; netlist::netlist_time nlt = netlist::netlist_time::zero; - while (pos < inps->size() && (*inps)[pos].m_time < netlist::netlist_time::from_double(ttr)) + while (pos < inps->size() && (*inps)[pos].m_time < netlist::netlist_time(ttr)) { nt.process_queue((*inps)[pos].m_time - nlt); (*inps)[pos].setparam(); nlt = (*inps)[pos].m_time; pos++; } - nt.process_queue(netlist::netlist_time::from_double(ttr) - nlt); + nt.process_queue(netlist::netlist_time(ttr) - nlt); nt.stop(); pfree(inps); diff --git a/src/lib/netlist/solver/nld_matrix_solver.h b/src/lib/netlist/solver/nld_matrix_solver.h index ababc750539..5787c858e0e 100644 --- a/src/lib/netlist/solver/nld_matrix_solver.h +++ b/src/lib/netlist/solver/nld_matrix_solver.h @@ -42,14 +42,14 @@ class terms_t P_PREVENT_COPYING(terms_t) public: - ATTR_COLD terms_t() + terms_t() : m_railstart(0) , m_last_V(0.0) , m_DD_n_m_1(0.0) , m_h_n_m_1(1e-6) {} - ATTR_COLD void clear() + void clear() { m_term.clear(); m_net_other.clear(); @@ -59,7 +59,7 @@ public: m_other_curanalog.clear(); } - ATTR_COLD void add(terminal_t *term, int net_other, bool sorted); + void add(terminal_t *term, int net_other, bool sorted); inline unsigned count() { return m_term.size(); } @@ -70,7 +70,7 @@ public: inline nl_double *Idr() { return m_Idr.data(); } inline nl_double **other_curanalog() { return m_other_curanalog.data(); } - ATTR_COLD void set_pointers(); + void set_pointers(); unsigned m_railstart; @@ -153,7 +153,7 @@ public: NETLIB_RESETI(); public: - ATTR_COLD int get_net_idx(net_t *net); + int get_net_idx(net_t *net); plib::plog_base &log() { return netlist().log(); } @@ -166,7 +166,7 @@ public: protected: - ATTR_COLD void setup_base(analog_net_t::list_t &nets); + void setup_base(analog_net_t::list_t &nets); void update_dynamic(); virtual void vsetup(analog_net_t::list_t &nets) = 0; diff --git a/src/lib/netlist/solver/nld_ms_direct.h b/src/lib/netlist/solver/nld_ms_direct.h index 519693af885..731d847c445 100644 --- a/src/lib/netlist/solver/nld_ms_direct.h +++ b/src/lib/netlist/solver/nld_ms_direct.h @@ -194,7 +194,7 @@ matrix_solver_direct_t::~matrix_solver_direct_t() } template -ATTR_COLD void matrix_solver_direct_t::vsetup(analog_net_t::list_t &nets) +void matrix_solver_direct_t::vsetup(analog_net_t::list_t &nets) { if (m_dim < nets.size()) log().fatal("Dimension {1} less than {2}", m_dim, nets.size()); diff --git a/src/lib/netlist/solver/nld_ms_direct_lu.h b/src/lib/netlist/solver/nld_ms_direct_lu.h index b45e23d42ec..76baf2687e8 100644 --- a/src/lib/netlist/solver/nld_ms_direct_lu.h +++ b/src/lib/netlist/solver/nld_ms_direct_lu.h @@ -206,7 +206,7 @@ nl_double matrix_solver_direct_t::compute_next_timestep() } template -ATTR_COLD void matrix_solver_direct_t::add_term(int k, terminal_t *term) +void matrix_solver_direct_t::add_term(int k, terminal_t *term) { if (term->m_otherterm->net().isRailNet()) { @@ -230,7 +230,7 @@ ATTR_COLD void matrix_solver_direct_t::add_term(int k, terminal_ template -ATTR_COLD void matrix_solver_direct_t::vsetup(analog_net_t::list_t &nets) +void matrix_solver_direct_t::vsetup(analog_net_t::list_t &nets) { if (m_dim < nets.size()) netlist().error("Dimension {1} less than {2}", m_dim,nets.size()); diff --git a/src/lib/netlist/solver/nld_ms_sm.h b/src/lib/netlist/solver/nld_ms_sm.h index 331161751f9..7ed72bcd575 100644 --- a/src/lib/netlist/solver/nld_ms_sm.h +++ b/src/lib/netlist/solver/nld_ms_sm.h @@ -121,7 +121,7 @@ matrix_solver_sm_t::~matrix_solver_sm_t() } template -ATTR_COLD void matrix_solver_sm_t::vsetup(analog_net_t::list_t &nets) +void matrix_solver_sm_t::vsetup(analog_net_t::list_t &nets) { if (m_dim < nets.size()) log().fatal("Dimension {1} less than {2}", m_dim, nets.size()); diff --git a/src/lib/netlist/solver/nld_ms_w.h b/src/lib/netlist/solver/nld_ms_w.h index cd70d82024b..ae4d18f36f7 100644 --- a/src/lib/netlist/solver/nld_ms_w.h +++ b/src/lib/netlist/solver/nld_ms_w.h @@ -130,7 +130,7 @@ matrix_solver_w_t::~matrix_solver_w_t() } template -ATTR_COLD void matrix_solver_w_t::vsetup(analog_net_t::list_t &nets) +void matrix_solver_w_t::vsetup(analog_net_t::list_t &nets) { if (m_dim < nets.size()) log().fatal("Dimension {1} less than {2}", m_dim, nets.size()); diff --git a/src/lib/netlist/solver/nld_solver.cpp b/src/lib/netlist/solver/nld_solver.cpp index f077b46dfb2..bdb9b7b82aa 100644 --- a/src/lib/netlist/solver/nld_solver.cpp +++ b/src/lib/netlist/solver/nld_solver.cpp @@ -59,7 +59,7 @@ namespace netlist namespace devices { -ATTR_COLD void terms_t::add(terminal_t *term, int net_other, bool sorted) +void terms_t::add(terminal_t *term, int net_other, bool sorted) { if (sorted) for (unsigned i=0; i < m_net_other.size(); i++) @@ -83,7 +83,7 @@ ATTR_COLD void terms_t::add(terminal_t *term, int net_other, bool sorted) m_other_curanalog.push_back(nullptr); } -ATTR_COLD void terms_t::set_pointers() +void terms_t::set_pointers() { for (unsigned i = 0; i < count(); i++) { @@ -96,7 +96,7 @@ ATTR_COLD void terms_t::set_pointers() // matrix_solver // ---------------------------------------------------------------------------------------- -ATTR_COLD matrix_solver_t::~matrix_solver_t() +matrix_solver_t::~matrix_solver_t() { for (unsigned k = 0; k < m_terms.size(); k++) { @@ -105,7 +105,7 @@ ATTR_COLD matrix_solver_t::~matrix_solver_t() } -ATTR_COLD void matrix_solver_t::setup_base(analog_net_t::list_t &nets) +void matrix_solver_t::setup_base(analog_net_t::list_t &nets) { log().debug("New solver setup\n"); @@ -184,7 +184,7 @@ ATTR_COLD void matrix_solver_t::setup_base(analog_net_t::list_t &nets) setup_matrix(); } -ATTR_COLD void matrix_solver_t::setup_matrix() +void matrix_solver_t::setup_matrix() { const unsigned iN = m_nets.size(); @@ -380,12 +380,12 @@ void matrix_solver_t::update_dynamic() m_dynamic_devices[i]->update_terminals(); } -ATTR_COLD void matrix_solver_t::reset() +void matrix_solver_t::reset() { m_last_step = netlist_time::zero; } -ATTR_COLD void matrix_solver_t::update() NOEXCEPT +void matrix_solver_t::update() NOEXCEPT { const netlist_time new_timestep = solve(); @@ -393,12 +393,12 @@ ATTR_COLD void matrix_solver_t::update() NOEXCEPT m_Q_sync.net().reschedule_in_queue(new_timestep); } -ATTR_COLD void matrix_solver_t::update_forced() +void matrix_solver_t::update_forced() { ATTR_UNUSED const netlist_time new_timestep = solve(); if (m_params.m_dynamic && has_timestep_devices()) - m_Q_sync.net().reschedule_in_queue(netlist_time::from_double(m_params.m_min_timestep)); + m_Q_sync.net().reschedule_in_queue(netlist_time(m_params.m_min_timestep)); } void matrix_solver_t::step(const netlist_time &delta) @@ -460,7 +460,7 @@ const netlist_time matrix_solver_t::solve() return next_time_step; } -ATTR_COLD int matrix_solver_t::get_net_idx(net_t *net) +int matrix_solver_t::get_net_idx(net_t *net) { for (std::size_t k = 0; k < m_nets.size(); k++) if (m_nets[k] == net) @@ -468,7 +468,7 @@ ATTR_COLD int matrix_solver_t::get_net_idx(net_t *net) return -1; } -ATTR_COLD void matrix_solver_t::add_term(int k, terminal_t *term) +void matrix_solver_t::add_term(int k, terminal_t *term) { if (term->m_otherterm->net().isRailNet()) { @@ -528,7 +528,7 @@ netlist_time matrix_solver_t::compute_next_timestep() } //if (new_solver_timestep > 10.0 * hn) // new_solver_timestep = 10.0 * hn; - return netlist_time::from_double(new_solver_timestep); + return netlist_time(new_solver_timestep); } @@ -620,7 +620,7 @@ NETLIB_UPDATE(solver) /* step circuit */ if (!m_Q_step.net().is_queued()) { - m_Q_step.net().push_to_queue(netlist_time::from_double(m_params.m_max_timestep)); + m_Q_step.net().push_to_queue(netlist_time(m_params.m_max_timestep)); } } @@ -687,7 +687,7 @@ std::unique_ptr NETLIB_NAME(solver)::create_solver(int size, co } } -ATTR_COLD void NETLIB_NAME(solver)::post_start() +void NETLIB_NAME(solver)::post_start() { plib::pvector_t groups; const bool use_specific = true; @@ -696,7 +696,7 @@ ATTR_COLD void NETLIB_NAME(solver)::post_start() m_params.m_accuracy = m_accuracy.Value(); m_params.m_gs_loops = m_gs_loops.Value(); m_params.m_nr_loops = m_nr_loops.Value(); - m_params.m_nt_sync_delay = netlist_time::from_double(m_sync_delay.Value()); + m_params.m_nt_sync_delay = netlist_time(m_sync_delay.Value()); m_params.m_lte = m_lte.Value(); m_params.m_sor = m_sor.Value(); From bc1eb91c9112eb1e8d7182ec04f0062a42a32326 Mon Sep 17 00:00:00 2001 From: couriersud Date: Sat, 4 Jun 2016 01:02:07 +0200 Subject: [PATCH 33/44] Fix long standing workaround which would ignore policy of "change-only" propagation. (nw) --- src/lib/netlist/devices/nld_74175.cpp | 4 +-- src/lib/netlist/devices/nld_74192.cpp | 2 +- src/lib/netlist/devices/nld_9312.cpp | 4 +-- src/lib/netlist/nl_base.cpp | 25 +++++++--------- src/lib/netlist/nl_base.h | 34 +++++++++++----------- src/lib/netlist/nl_lists.h | 6 ++-- src/lib/netlist/solver/nld_matrix_solver.h | 1 + src/lib/netlist/solver/nld_solver.cpp | 8 +++++ 8 files changed, 44 insertions(+), 40 deletions(-) diff --git a/src/lib/netlist/devices/nld_74175.cpp b/src/lib/netlist/devices/nld_74175.cpp index ad27d75b7fd..79c4fb85d1a 100644 --- a/src/lib/netlist/devices/nld_74175.cpp +++ b/src/lib/netlist/devices/nld_74175.cpp @@ -93,8 +93,8 @@ namespace netlist } }; - static const netlist_time delay[2] = { NLTIME_FROM_NS(25), NLTIME_FROM_NS(25) }; - static const netlist_time delay_clear[2] = { NLTIME_FROM_NS(40), NLTIME_FROM_NS(25) }; + const netlist_time delay[2] = { NLTIME_FROM_NS(25), NLTIME_FROM_NS(25) }; + const netlist_time delay_clear[2] = { NLTIME_FROM_NS(40), NLTIME_FROM_NS(25) }; NETLIB_RESET(74175_sub) { diff --git a/src/lib/netlist/devices/nld_74192.cpp b/src/lib/netlist/devices/nld_74192.cpp index ff3f5591293..cc0260fd99a 100644 --- a/src/lib/netlist/devices/nld_74192.cpp +++ b/src/lib/netlist/devices/nld_74192.cpp @@ -111,7 +111,7 @@ namespace netlist } // FIXME: Timing - /* static */ const netlist_time delay[4] = + static const netlist_time delay[4] = { NLTIME_FROM_NS(40), NLTIME_FROM_NS(40), diff --git a/src/lib/netlist/devices/nld_9312.cpp b/src/lib/netlist/devices/nld_9312.cpp index 8affb42a12f..a7421e6c966 100644 --- a/src/lib/netlist/devices/nld_9312.cpp +++ b/src/lib/netlist/devices/nld_9312.cpp @@ -143,7 +143,7 @@ namespace netlist const UINT8 G = INPLOGIC(m_G); if (G) { - /* static */ const netlist_time delay[2] = { NLTIME_FROM_NS(33), NLTIME_FROM_NS(19) }; + const netlist_time delay[2] = { NLTIME_FROM_NS(33), NLTIME_FROM_NS(19) }; OUTLOGIC(m_Y, 0, delay[0]); OUTLOGIC(m_YQ, 1, delay[1]); @@ -161,7 +161,7 @@ namespace netlist m_B.activate(); m_C.activate(); } - /* static */ const netlist_time delay[2] = { NLTIME_FROM_NS(33), NLTIME_FROM_NS(28) }; + const netlist_time delay[2] = { NLTIME_FROM_NS(33), NLTIME_FROM_NS(28) }; const UINT8 chan = INPLOGIC(m_A) | (INPLOGIC(m_B)<<1) | (INPLOGIC(m_C)<<2); if (m_last_chan != chan) { diff --git a/src/lib/netlist/nl_base.cpp b/src/lib/netlist/nl_base.cpp index 24ca7cf9c8b..ad4feb4d316 100644 --- a/src/lib/netlist/nl_base.cpp +++ b/src/lib/netlist/nl_base.cpp @@ -662,30 +662,25 @@ void net_t::update_devs() //assert(m_num_cons != 0); nl_assert(this->isRailNet()); - const int masks[4] = { 1, 5, 3, 1 }; - const int mask = masks[ (m_cur_Q << 1) | m_new_Q ]; + static const unsigned masks[4] = + { + 0, + core_terminal_t::STATE_INP_LH | core_terminal_t::STATE_INP_ACTIVE, + core_terminal_t::STATE_INP_HL | core_terminal_t::STATE_INP_ACTIVE, + 0 + }; + + const unsigned mask = masks[ m_cur_Q * 2 + m_new_Q ]; m_in_queue = 2; /* mark as taken ... */ m_cur_Q = m_new_Q; -#if 1 - for (core_terminal_t *p = m_list_active.first(); p != nullptr; p = p->next()) + for (auto p = m_list_active.first(); p != nullptr; p = p->next()) { inc_stat(p->device().stat_call_count); if ((p->state() & mask) != 0) p->device().update_dev(); } -#else - for (auto p = &m_list_active.m_head; *p != nullptr; ) - { - auto pn = &((*p)->m_next); - inc_stat(p->device().stat_call_count); - if (((*p)->state() & mask) != 0) - (*p)->device().update_dev(); - p = pn; - } - -#endif } void net_t::reset() diff --git a/src/lib/netlist/nl_base.h b/src/lib/netlist/nl_base.h index 7cee36bd3a6..b3bb7923149 100644 --- a/src/lib/netlist/nl_base.h +++ b/src/lib/netlist/nl_base.h @@ -426,9 +426,9 @@ namespace netlist void set_net(net_t *anet); void clear_net(); - bool has_net() const { return (m_net != nullptr); } - const net_t & net() const { return *m_net;} - net_t & net() { return *m_net;} + bool has_net() const { return (m_net != nullptr); } + const net_t & net() const { return *m_net;} + net_t & net() { return *m_net;} bool is_logic() const; bool is_analog() const; @@ -626,19 +626,21 @@ namespace netlist bool is_logic() const; bool is_analog() const; - void push_to_queue(const netlist_time delay) NOEXCEPT; - void reschedule_in_queue(const netlist_time delay) NOEXCEPT; - bool is_queued() const { return m_in_queue == 1; } + void toggle_new_Q() { m_new_Q ^= 1; } + + void push_to_queue(const netlist_time delay) NOEXCEPT; + void reschedule_in_queue(const netlist_time delay) NOEXCEPT; + bool is_queued() const { return m_in_queue == 1; } void update_devs(); - const netlist_time time() const { return m_time; } - void set_time(const netlist_time ntime) { m_time = ntime; } + const netlist_time time() const { return m_time; } + void set_time(const netlist_time ntime) { m_time = ntime; } - bool isRailNet() const { return !(m_railterminal == nullptr); } - core_terminal_t & railterminal() const { return *m_railterminal; } + bool isRailNet() const { return !(m_railterminal == nullptr); } + core_terminal_t & railterminal() const { return *m_railterminal; } - int num_cons() const { return m_core_terms.size(); } + int num_cons() const { return m_core_terms.size(); } void inc_active(core_terminal_t &term); void dec_active(core_terminal_t &term); @@ -655,15 +657,13 @@ namespace netlist netlist_time m_time; INT32 m_active; - UINT8 m_in_queue; /* 0: not in queue, 1: in queue, 2: last was taken */ + UINT8 m_in_queue; /* 0: not in queue, 1: in queue, 2: last was taken */ private: plib::linkedlist_t m_list_active; core_terminal_t * m_railterminal; public: - // We have to have those on one object. Dividing those does lead - // to a significant performance hit // FIXME: Have to fix the public at some time nl_double m_cur_Analog; @@ -679,9 +679,8 @@ namespace netlist logic_net_t(netlist_t &nl, const pstring &aname, core_terminal_t *mr = nullptr); virtual ~logic_net_t() { }; - netlist_sig_t Q() const { return m_cur_Q; } - netlist_sig_t new_Q() const { return m_new_Q; } - void toggle_new_Q() { m_new_Q ^= 1; } + netlist_sig_t Q() const { return m_cur_Q; } + netlist_sig_t new_Q() const { return m_new_Q; } void initial(const netlist_sig_t val) { m_cur_Q = m_new_Q = val; } void set_Q(const netlist_sig_t newQ, const netlist_time &delay) NOEXCEPT @@ -1334,6 +1333,7 @@ protected: if (newQ != net().Q_Analog()) { net().m_cur_Analog = newQ; + net().toggle_new_Q(); net().push_to_queue(NLTIME_FROM_NS(1)); } } diff --git a/src/lib/netlist/nl_lists.h b/src/lib/netlist/nl_lists.h index a46f1b326df..1692990d14d 100644 --- a/src/lib/netlist/nl_lists.h +++ b/src/lib/netlist/nl_lists.h @@ -52,14 +52,14 @@ namespace netlist /* Lock */ while (m_lock.exchange(1)) { } #endif - entry_t * i = m_end++; + entry_t * i = m_end; for (; t > (i - 1)->m_exec_time; --i) { *(i) = *(i-1); - //i--; inc_stat(m_prof_sortmove); } *i = { t, o }; + ++m_end; inc_stat(m_prof_call); #if HAS_OPENMP && USE_OPENMP m_lock = 0; @@ -112,7 +112,7 @@ namespace netlist const entry_t *listptr() const { return &m_list[1]; } std::size_t size() const { return m_end - &m_list[1]; } - const entry_t & operator[](const std::size_t index) const { return m_list[1+index]; } + const entry_t & operator[](const std::size_t index) const { return m_list[ 1 + index]; } #if (NL_KEEP_STATISTICS) // profiling diff --git a/src/lib/netlist/solver/nld_matrix_solver.h b/src/lib/netlist/solver/nld_matrix_solver.h index 5787c858e0e..7d0b74383ca 100644 --- a/src/lib/netlist/solver/nld_matrix_solver.h +++ b/src/lib/netlist/solver/nld_matrix_solver.h @@ -145,6 +145,7 @@ public: void update_forced(); void update_after(const netlist_time &after) { + m_Q_sync.net().toggle_new_Q(); m_Q_sync.net().reschedule_in_queue(after); } diff --git a/src/lib/netlist/solver/nld_solver.cpp b/src/lib/netlist/solver/nld_solver.cpp index bdb9b7b82aa..b4d866e708b 100644 --- a/src/lib/netlist/solver/nld_solver.cpp +++ b/src/lib/netlist/solver/nld_solver.cpp @@ -390,7 +390,10 @@ void matrix_solver_t::update() NOEXCEPT const netlist_time new_timestep = solve(); if (m_params.m_dynamic && has_timestep_devices() && new_timestep > netlist_time::zero) + { + m_Q_sync.net().toggle_new_Q(); m_Q_sync.net().reschedule_in_queue(new_timestep); + } } void matrix_solver_t::update_forced() @@ -398,7 +401,10 @@ void matrix_solver_t::update_forced() ATTR_UNUSED const netlist_time new_timestep = solve(); if (m_params.m_dynamic && has_timestep_devices()) + { + m_Q_sync.net().toggle_new_Q(); m_Q_sync.net().reschedule_in_queue(netlist_time(m_params.m_min_timestep)); + } } void matrix_solver_t::step(const netlist_time &delta) @@ -428,6 +434,7 @@ const netlist_time matrix_solver_t::solve_base() if (this_resched > 1 && !m_Q_sync.net().is_queued()) { log().warning("NEWTON_LOOPS exceeded on net {1}... reschedule", this->name()); + m_Q_sync.net().toggle_new_Q(); m_Q_sync.net().reschedule_in_queue(m_params.m_nt_sync_delay); } } @@ -620,6 +627,7 @@ NETLIB_UPDATE(solver) /* step circuit */ if (!m_Q_step.net().is_queued()) { + m_Q_step.net().toggle_new_Q(); m_Q_step.net().push_to_queue(netlist_time(m_params.m_max_timestep)); } } From 86965e7757f48b1e79b0bd4216045cb4a7cea300 Mon Sep 17 00:00:00 2001 From: couriersud Date: Sat, 4 Jun 2016 23:35:14 +0200 Subject: [PATCH 34/44] Refactored netlist_time. (nw) --- nl_examples/cdelay.c | 11 +++ src/devices/machine/netlist.cpp | 12 +-- src/devices/machine/netlist.h | 2 +- src/lib/netlist/devices/nld_74ls629.cpp | 4 +- src/lib/netlist/devices/nld_mm5837.cpp | 1 + src/lib/netlist/devices/nld_system.cpp | 2 +- src/lib/netlist/devices/nld_truthtable.cpp | 4 +- src/lib/netlist/devices/nld_truthtable.h | 9 +-- src/lib/netlist/devices/nlid_system.h | 4 +- src/lib/netlist/nl_base.cpp | 25 +++--- src/lib/netlist/nl_base.h | 90 ++++++++++------------ src/lib/netlist/nl_lists.h | 6 +- src/lib/netlist/nl_time.h | 90 +++++++++++----------- src/lib/netlist/plib/pconfig.h | 6 -- src/lib/netlist/plib/plists.h | 10 +-- src/lib/netlist/prg/nltool.cpp | 2 +- src/lib/netlist/solver/nld_matrix_solver.h | 1 + src/lib/netlist/solver/nld_solver.cpp | 4 +- 18 files changed, 135 insertions(+), 148 deletions(-) diff --git a/nl_examples/cdelay.c b/nl_examples/cdelay.c index 6f396e8ca07..927a7cfe0a4 100644 --- a/nl_examples/cdelay.c +++ b/nl_examples/cdelay.c @@ -7,6 +7,17 @@ #include "netlist/devices/net_lib.h" +NETLIST_START(perf) + + SOLVER(Solver, 48000) + PARAM(Solver.ACCURACY, 1e-20) + MAINCLOCK(clk, 50000000) + + TTL_7400_NAND(n1,clk,clk) + +NETLIST_END() + + NETLIST_START(7400_astable) /* diff --git a/src/devices/machine/netlist.cpp b/src/devices/machine/netlist.cpp index e929bfad96e..bd65d0b2eef 100644 --- a/src/devices/machine/netlist.cpp +++ b/src/devices/machine/netlist.cpp @@ -264,7 +264,7 @@ ADDRESS_MAP_END netlist_mame_device_t::netlist_mame_device_t(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) : device_t(mconfig, NETLIST_CORE, "Netlist core device", tag, owner, clock, "netlist_core", __FILE__), m_icount(0), - m_old(netlist::netlist_time::zero), + m_old(netlist::netlist_time::zero()), m_netlist(nullptr), m_setup(nullptr), m_setup_func(nullptr) @@ -274,7 +274,7 @@ netlist_mame_device_t::netlist_mame_device_t(const machine_config &mconfig, cons netlist_mame_device_t::netlist_mame_device_t(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, const char *shortname, const char *file) : device_t(mconfig, type, name, tag, owner, clock, shortname, file), m_icount(0), - m_old(netlist::netlist_time::zero), + m_old(netlist::netlist_time::zero()), m_netlist(nullptr), m_setup(nullptr), m_setup_func(nullptr) @@ -328,8 +328,8 @@ void netlist_mame_device_t::device_start() save_state(); - m_old = netlist::netlist_time::zero; - m_rem = netlist::netlist_time::zero; + m_old = netlist::netlist_time::zero(); + m_rem = netlist::netlist_time::zero(); LOG_DEV_CALLS(("device_start exit %s\n", tag())); } @@ -344,8 +344,8 @@ void netlist_mame_device_t::device_clock_changed() void netlist_mame_device_t::device_reset() { LOG_DEV_CALLS(("device_reset\n")); - m_old = netlist::netlist_time::zero; - m_rem = netlist::netlist_time::zero; + m_old = netlist::netlist_time::zero(); + m_rem = netlist::netlist_time::zero(); netlist().reset(); } diff --git a/src/devices/machine/netlist.h b/src/devices/machine/netlist.h index 136921af079..8eba71f8ba1 100644 --- a/src/devices/machine/netlist.h +++ b/src/devices/machine/netlist.h @@ -569,7 +569,7 @@ public: { m_cur = 0.0; m_last_pos = 0; - m_last_buffer = netlist::netlist_time::zero; + m_last_buffer = netlist::netlist_time::zero(); } ATTR_HOT void sound_update(const netlist::netlist_time &upto) diff --git a/src/lib/netlist/devices/nld_74ls629.cpp b/src/lib/netlist/devices/nld_74ls629.cpp index 569fb38706f..eb9fbd7f712 100644 --- a/src/lib/netlist/devices/nld_74ls629.cpp +++ b/src/lib/netlist/devices/nld_74ls629.cpp @@ -54,7 +54,7 @@ namespace netlist , m_Y(*this, "Y") , m_enableq(1) , m_out(0) - , m_inc(netlist_time::zero) + , m_inc(netlist_time::zero()) { connect_late(m_FB, m_Y); @@ -67,7 +67,7 @@ namespace netlist { m_enableq = 1; m_out = 0; - m_inc = netlist_time::zero; + m_inc = netlist_time::zero(); } NETLIB_UPDATEI(); diff --git a/src/lib/netlist/devices/nld_mm5837.cpp b/src/lib/netlist/devices/nld_mm5837.cpp index 652bec34d15..9624bec2621 100644 --- a/src/lib/netlist/devices/nld_mm5837.cpp +++ b/src/lib/netlist/devices/nld_mm5837.cpp @@ -28,6 +28,7 @@ namespace netlist /* clock */ , m_feedback(*this, "FB") , m_Q(*this, "Q") + , m_inc(0, 1) , m_is_timestep(false) { m_inc = netlist_time::from_hz(56000); diff --git a/src/lib/netlist/devices/nld_system.cpp b/src/lib/netlist/devices/nld_system.cpp index 5ec1235d35d..9f5f68b004a 100644 --- a/src/lib/netlist/devices/nld_system.cpp +++ b/src/lib/netlist/devices/nld_system.cpp @@ -48,7 +48,7 @@ namespace netlist { OUTLOGIC(m_Q, (m_cnt & 1) ^ 1, m_inc[m_cnt] + m_off); m_cnt = (m_cnt + 1) % m_size; - m_off = netlist_time::zero; + m_off = netlist_time::zero(); } // ---------------------------------------------------------------------------------------- diff --git a/src/lib/netlist/devices/nld_truthtable.cpp b/src/lib/netlist/devices/nld_truthtable.cpp index 5aa4be0b572..e921f1411de 100644 --- a/src/lib/netlist/devices/nld_truthtable.cpp +++ b/src/lib/netlist/devices/nld_truthtable.cpp @@ -163,7 +163,7 @@ void truthtable_desc_t::setup(const plib::pstring_vector_t &truthtable, UINT32 d m_outs[j] = ~0L; for (int j=0; j < 16; j++) - m_timing_nt[j] = netlist_time::zero; + m_timing_nt[j] = netlist_time::zero(); while (!ttline.equals("")) { @@ -189,7 +189,7 @@ void truthtable_desc_t::setup(const plib::pstring_vector_t &truthtable, UINT32 d nl_assert_always(outs.equals("0"), "Unknown value (not 0 or 1"); netlist_time t = netlist_time::from_nsec(times[j].trim().as_long()); int k=0; - while (m_timing_nt[k] != netlist_time::zero && m_timing_nt[k] != t) + while (m_timing_nt[k] != netlist_time::zero() && m_timing_nt[k] != t) k++; m_timing_nt[k] = t; tindex.push_back(k); //[j] = k; diff --git a/src/lib/netlist/devices/nld_truthtable.h b/src/lib/netlist/devices/nld_truthtable.h index d4ab92333d9..c227da33fdc 100644 --- a/src/lib/netlist/devices/nld_truthtable.h +++ b/src/lib/netlist/devices/nld_truthtable.h @@ -201,7 +201,7 @@ public: for (int j=0; j < m_size; j++) printf("%05x %04x %04x %04x\n", j, m_ttp->m_outs[j] & ((1 << m_NO)-1), m_ttp->m_outs[j] >> m_NO, m_ttp->m_timing[j * m_NO + 0]); - for (int k=0; m_ttp->m_timing_nt[k] != netlist_time::zero; k++) + for (int k=0; m_ttp->m_timing_nt[k] != netlist_time::zero(); k++) printf("%d %f\n", k, m_ttp->m_timing_nt[k].as_double() * 1000000.0); #endif save(NLNAME(m_last_state)); @@ -267,7 +267,7 @@ private: template inline void process() { - netlist_time mt = netlist_time::zero; + netlist_time mt = netlist_time::zero(); UINT32 state = 0; if (m_NI > 1 && !has_state) @@ -294,11 +294,6 @@ private: if (has_state) m_last_state = (state << m_NO) | out; -#if 0 - for (int i = 0; i < m_NI; i++) - if (m_ign & (1 << i)) - m_I[i].inactivate(); -#endif const UINT32 timebase = nstate * m_NO; if (doOUT) { diff --git a/src/lib/netlist/devices/nlid_system.h b/src/lib/netlist/devices/nlid_system.h index 5ecdcac1107..2ae5f9f9c32 100644 --- a/src/lib/netlist/devices/nlid_system.h +++ b/src/lib/netlist/devices/nlid_system.h @@ -54,7 +54,7 @@ namespace netlist NETLIB_RESETI() { - m_Q.net().set_time(netlist_time::zero); + m_Q.net().set_time(netlist_time::zero()); } NETLIB_UPDATE_PARAMI() @@ -136,7 +136,7 @@ namespace netlist pati[i] = pat[i].as_long(); total += pati[i]; } - netlist_time ttotal = netlist_time::zero; + netlist_time ttotal = netlist_time::zero(); for (unsigned i=0; im_Q.net().set_time(netlist_time::zero); + m_mainclock->m_Q.net().set_time(netlist_time::zero()); //if (m_solver != nullptr) // m_solver->do_reset(); @@ -336,9 +334,9 @@ void netlist_t::process_queue(const netlist_time &delta) if (m_mainclock == nullptr) { - while ( (m_time < m_stop) && (!m_queue.empty())) + while ( (m_time < m_stop) & (!m_queue.empty())) { - const queue_t::entry_t &e = m_queue.pop(); + const queue_t::entry_t e(m_queue.pop()); m_time = e.m_exec_time; e.m_object->update_devs(); @@ -456,9 +454,6 @@ core_device_t::~core_device_t() void core_device_t::set_delegate_pointer() { -#if (NL_KEEP_STATISTICS) - netlist().m_started_devices.push_back(this); -#endif #if (NL_PMF_TYPE == NL_PMF_TYPE_GNUC_PMF) void (core_device_t::* pFunc)() = &core_device_t::update; m_static_update = pFunc; @@ -578,7 +573,7 @@ net_t::net_t(netlist_t &nl, const pstring &aname, core_terminal_t *mr) : object_t(nl, aname, NET) , m_new_Q(0) , m_cur_Q (0) - , m_time(netlist_time::zero) + , m_time(netlist_time::zero()) , m_active(0) , m_in_queue(2) , m_railterminal(nullptr) @@ -612,7 +607,7 @@ void net_t::inc_active(core_terminal_t &term) { if (netlist().use_deactivate()) { - railterminal().device().inc_active(); + railterminal().device().do_inc_active(); //m_cur_Q = m_new_Q; } if (m_in_queue == 0) @@ -639,7 +634,7 @@ void net_t::dec_active(core_terminal_t &term) nl_assert(m_active >= 0); m_list_active.remove(term); if (m_active == 0 && netlist().use_deactivate()) - railterminal().device().dec_active(); + railterminal().device().do_dec_active(); } void net_t::rebuild_list() @@ -685,7 +680,7 @@ void net_t::update_devs() void net_t::reset() { - m_time = netlist_time::zero; + m_time = netlist_time::zero(); m_active = 0; m_in_queue = 2; diff --git a/src/lib/netlist/nl_base.h b/src/lib/netlist/nl_base.h index b3bb7923149..1f14d04bce8 100644 --- a/src/lib/netlist/nl_base.h +++ b/src/lib/netlist/nl_base.h @@ -322,7 +322,7 @@ namespace netlist logic_family_t() : m_logic_family(nullptr) {} ~logic_family_t() { } - const logic_family_desc_t *logic_family() const { return m_logic_family; } + const logic_family_desc_t *logic_family() const { return m_logic_family; } void set_logic_family(const logic_family_desc_t *fam) { m_logic_family = fam; } protected: @@ -366,11 +366,11 @@ namespace netlist plib::pstate_manager_t &state_manager(); - type_t type() const { return m_objtype; } - bool isType(const type_t atype) const { return (m_objtype == atype); } + type_t type() const { return m_objtype; } + bool isType(const type_t atype) const { return (m_objtype == atype); } - netlist_t & netlist() { return m_netlist; } - const netlist_t & netlist() const { return m_netlist; } + netlist_t & netlist() { return m_netlist; } + const netlist_t & netlist() const { return m_netlist; } private: netlist_t & m_netlist; @@ -433,9 +433,9 @@ namespace netlist bool is_logic() const; bool is_analog() const; - bool is_state(const state_e astate) const { return (m_state == astate); } - state_e state() const { return m_state; } - void set_state(const state_e astate) + bool is_state(const state_e astate) const { return (m_state == astate); } + state_e state() const { return m_state; } + void set_state(const state_e astate) { nl_assert(astate != STATE_NONEX); m_state = astate; @@ -485,21 +485,21 @@ namespace netlist terminal_t *m_otherterm; - void set(const nl_double G) + void set(const nl_double G) { set_ptr(m_Idr1, 0); set_ptr(m_go1, G); set_ptr(m_gt1, G); } - void set(const nl_double GO, const nl_double GT) + void set(const nl_double GO, const nl_double GT) { set_ptr(m_Idr1, 0); set_ptr(m_go1, GO); set_ptr(m_gt1, GT); } - void set(const nl_double GO, const nl_double GT, const nl_double I) + void set(const nl_double GO, const nl_double GT, const nl_double I) { set_ptr(m_Idr1, I); set_ptr(m_go1, GO); @@ -551,8 +551,8 @@ namespace netlist devices::nld_base_proxy *get_proxy() const { return m_proxy; } void set_proxy(devices::nld_base_proxy *proxy) { m_proxy = proxy; } - logic_net_t & net(); - const logic_net_t & net() const; + logic_net_t & net(); + const logic_net_t & net() const; protected: @@ -592,7 +592,8 @@ namespace netlist { public: analog_input_t(core_device_t &dev, const pstring &aname); - nl_double Q_Analog() const; + + nl_double Q_Analog() const; protected: virtual void reset() override @@ -683,7 +684,7 @@ namespace netlist netlist_sig_t new_Q() const { return m_new_Q; } void initial(const netlist_sig_t val) { m_cur_Q = m_new_Q = val; } - void set_Q(const netlist_sig_t newQ, const netlist_time &delay) NOEXCEPT + void set_Q(const netlist_sig_t newQ, const netlist_time delay) NOEXCEPT { if (newQ != m_new_Q) { @@ -692,7 +693,7 @@ namespace netlist } } - void set_Q_time(const netlist_sig_t newQ, const netlist_time &at) + void set_Q_time(const netlist_sig_t newQ, const netlist_time at) { if (newQ != m_new_Q) { @@ -745,8 +746,6 @@ namespace netlist P_PREVENT_COPYING(logic_output_t) public: - friend class core_device_t; //FIXME - logic_output_t(core_device_t &dev, const pstring &aname); virtual void reset() override @@ -756,10 +755,10 @@ namespace netlist void initial(const netlist_sig_t val); - void set_Q(const netlist_sig_t newQ, const netlist_time &delay) NOEXCEPT + void set_Q(const netlist_sig_t newQ, const netlist_time delay) NOEXCEPT { //net().set_Q(newQ, delay); - m_my_net.set_Q(newQ, delay); + m_my_net.set_Q(newQ, delay); // take the shortcut } private: @@ -774,7 +773,7 @@ namespace netlist analog_output_t(core_device_t &dev, const pstring &aname); void initial(const nl_double val); - void set_Q(const nl_double newQ); + void set_Q(const nl_double newQ); analog_net_t *m_proxied_net; // only for proxy nets in analog input logic @@ -819,9 +818,9 @@ namespace netlist operator const C() const { return Value(); } - void setTo(const C ¶m); - void initial(const C &val) { m_param = val; } - C Value() const { return m_param; } + void setTo(const C ¶m); + void initial(const C &val) { m_param = val; } + C Value() const { return m_param; } protected: virtual void changed() { } @@ -870,7 +869,7 @@ namespace netlist virtual ~core_device_t(); - void update_dev() + void update_dev() { begin_timing(stat_total_time); inc_stat(stat_update_count); @@ -892,26 +891,21 @@ namespace netlist void set_delegate_pointer(); void stop_dev(); - netlist_sig_t INPLOGIC_PASSIVE(logic_input_t &inp); + void do_inc_active() { inc_active(); } + void do_dec_active() { dec_active(); } + void do_reset() { reset(); } + netlist_sig_t INPLOGIC_PASSIVE(logic_input_t &inp); netlist_sig_t INPLOGIC(const logic_input_t &inp) const { nl_assert(inp.state() != logic_t::STATE_INP_PASSIVE); return inp.Q(); } - void OUTLOGIC(logic_output_t &out, const netlist_sig_t val, const netlist_time &delay) NOEXCEPT; - - nl_double INPANALOG(const analog_input_t &inp) const { return inp.Q_Analog(); } - - nl_double TERMANALOG(const terminal_t &term) const { return term.net().Q_Analog(); } - - void OUTANALOG(analog_output_t &out, const nl_double val) - { - out.set_Q(val); - } - - void do_reset() { reset(); } + void OUTLOGIC(logic_output_t &out, const netlist_sig_t val, const netlist_time delay) NOEXCEPT; + nl_double INPANALOG(const analog_input_t &inp) const { return inp.Q_Analog(); } + nl_double TERMANALOG(const terminal_t &term) const { return term.net().Q_Analog(); } + void OUTANALOG(analog_output_t &out, const nl_double val) { out.set_Q(val); } #if (NL_KEEP_STATISTICS) /* stats */ @@ -923,12 +917,12 @@ namespace netlist protected: virtual void update() NOEXCEPT { } + virtual void inc_active() { } + virtual void dec_active() { } virtual void stop() { } virtual void reset() { } public: - virtual void inc_active() { } - virtual void dec_active() { } virtual void step_time(ATTR_UNUSED const nl_double st) { } virtual void update_terminals() { } @@ -1080,11 +1074,11 @@ namespace netlist devices::NETLIB_NAME(gnd) *gnd() const { return m_gnd; } nl_double gmin() const; - void push_to_queue(net_t &out, const netlist_time &attime) NOEXCEPT; + void push_to_queue(net_t &out, const netlist_time attime) NOEXCEPT; void remove_from_queue(net_t &out); void process_queue(const netlist_time &delta); - void abort_current_queue_slice() { m_stop = netlist_time::zero; } + void abort_current_queue_slice() { m_stop = netlist_time::zero(); } bool use_deactivate() const { return m_use_deactivate; } @@ -1126,10 +1120,6 @@ namespace netlist return ret; } - #if (NL_KEEP_STATISTICS) - pvector_t m_started_devices; - #endif - plib::plog_base &log() { return m_log; } const plib::plog_base &log() const { return m_log; } @@ -1238,7 +1228,7 @@ protected: inline void logic_input_t::inactivate() { - if (EXPECTED(!is_state(STATE_INP_PASSIVE))) + if (!is_state(STATE_INP_PASSIVE)) { set_state(STATE_INP_PASSIVE); net().dec_active(*this); @@ -1292,7 +1282,7 @@ protected: m_time = netlist().time() + delay; m_in_queue = (m_active > 0); /* queued ? */ - if (EXPECTED(m_in_queue)) + if (m_in_queue) { netlist().push_to_queue(*this, m_time); } @@ -1338,7 +1328,7 @@ protected: } } - inline void netlist_t::push_to_queue(net_t &out, const netlist_time &attime) NOEXCEPT + inline void netlist_t::push_to_queue(net_t &out, const netlist_time attime) NOEXCEPT { m_queue.push(attime, &out); } @@ -1348,7 +1338,7 @@ protected: m_queue.remove(&out); } - inline void core_device_t::OUTLOGIC(logic_output_t &out, const netlist_sig_t val, const netlist_time &delay) NOEXCEPT + inline void core_device_t::OUTLOGIC(logic_output_t &out, const netlist_sig_t val, const netlist_time delay) NOEXCEPT { out.set_Q(val, delay); } diff --git a/src/lib/netlist/nl_lists.h b/src/lib/netlist/nl_lists.h index 1692990d14d..92cdbc61c57 100644 --- a/src/lib/netlist/nl_lists.h +++ b/src/lib/netlist/nl_lists.h @@ -67,8 +67,8 @@ namespace netlist //nl_assert(m_end - m_list < Size); } - const entry_t & pop() NOEXCEPT { return *(--m_end); } - const entry_t & top() const NOEXCEPT { return *(m_end-1); } + entry_t pop() NOEXCEPT { return *(--m_end); } + entry_t top() const NOEXCEPT { return *(m_end-1); } void remove(const Element &elem) NOEXCEPT { @@ -104,7 +104,7 @@ namespace netlist * the insert algo above will run into this element and doesn't * need a comparison with queue start. */ - m_list[0] = { Time::from_raw(~0), Element(0) }; + m_list[0] = { Time::never(), Element(0) }; m_end++; } diff --git a/src/lib/netlist/nl_time.h b/src/lib/netlist/nl_time.h index e05d6aa6b53..ed28cedc932 100644 --- a/src/lib/netlist/nl_time.h +++ b/src/lib/netlist/nl_time.h @@ -25,7 +25,7 @@ namespace netlist { - struct netlist_time + struct netlist_time final { public: @@ -34,93 +34,93 @@ namespace netlist static const pstate_data_type_e STATETYPE = DT_INT128; #else using INTERNALTYPE = UINT64; - static const pstate_data_type_e STATETYPE = pstate_data_type_e::DT_INT64; + static constexpr pstate_data_type_e STATETYPE = pstate_data_type_e::DT_INT64; #endif - static const INTERNALTYPE RESOLUTION = NETLIST_INTERNAL_RES; - - netlist_time() : m_time(0) {} - explicit netlist_time(const double t) - : m_time((INTERNALTYPE) ( t * (double) RESOLUTION)) { } - explicit netlist_time(const INTERNALTYPE nom, const INTERNALTYPE den) - : m_time(nom * (RESOLUTION / den)) { } + static constexpr INTERNALTYPE RESOLUTION = NETLIST_INTERNAL_RES; + constexpr netlist_time() NOEXCEPT : m_time(0) {} netlist_time(const netlist_time &rhs) NOEXCEPT = default; netlist_time(netlist_time &&rhs) NOEXCEPT = default; - netlist_time &operator+=(const netlist_time &right) { m_time += right.m_time; return *this; } - netlist_time &operator-=(const netlist_time &right) { m_time -= right.m_time; return *this; } + constexpr explicit netlist_time(const double t) + : m_time((INTERNALTYPE) ( t * (double) RESOLUTION)) { } + constexpr explicit netlist_time(const INTERNALTYPE nom, const INTERNALTYPE den) + : m_time(nom * (RESOLUTION / den)) { } - friend netlist_time operator-(netlist_time left, const netlist_time &right) + + netlist_time &operator=(const netlist_time rhs) { m_time = rhs.m_time; return *this; } + + netlist_time &operator+=(const netlist_time &rhs) { m_time += rhs.m_time; return *this; } + netlist_time &operator-=(const netlist_time &rhs) { m_time -= rhs.m_time; return *this; } + + friend netlist_time operator-(netlist_time lhs, const netlist_time &rhs) { - left -= right; - return left; + lhs -= rhs; + return lhs; } - friend netlist_time operator+(netlist_time left, const netlist_time &right) + friend netlist_time operator+(netlist_time lhs, const netlist_time &rhs) { - left += right; - return left; + lhs += rhs; + return lhs; } - friend netlist_time operator*(netlist_time left, const UINT64 factor) + friend netlist_time operator*(netlist_time lhs, const UINT64 factor) { - left.m_time *= factor; - return left; + lhs.m_time *= static_cast(factor); + return lhs; } - friend UINT64 operator/(const netlist_time &left, const netlist_time &right) + friend UINT64 operator/(const netlist_time &lhs, const netlist_time &rhs) { - return left.m_time / right.m_time; + return static_cast(lhs.m_time / rhs.m_time); } - friend bool operator<(const netlist_time &left, const netlist_time &right) + friend bool operator<(const netlist_time &lhs, const netlist_time &rhs) { - return (left.m_time < right.m_time); + return (lhs.m_time < rhs.m_time); } - friend bool operator>(const netlist_time &left, const netlist_time &right) + friend bool operator>(const netlist_time &lhs, const netlist_time &rhs) { - return right < left; + return rhs < lhs; } - friend bool operator<=(const netlist_time &left, const netlist_time &right) + friend bool operator<=(const netlist_time &lhs, const netlist_time &rhs) { - return !(left > right); + return !(lhs > rhs); } - friend bool operator>=(const netlist_time &left, const netlist_time &right) + friend bool operator>=(const netlist_time &lhs, const netlist_time &rhs) { - return !(left < right); + return !(lhs < rhs); } - friend bool operator==(const netlist_time &left, const netlist_time &right) + friend bool operator==(const netlist_time &lhs, const netlist_time &rhs) { - return (left.m_time == right.m_time); + return lhs.m_time == rhs.m_time; } - friend bool operator!=(const netlist_time &left, const netlist_time &right) + friend bool operator!=(const netlist_time &lhs, const netlist_time &rhs) { - return !(left == right); + return lhs.m_time != rhs.m_time; } - netlist_time &operator=(const netlist_time &right) { m_time = right.m_time; return *this; } - INTERNALTYPE as_raw() const { return m_time; } double as_double() const { return (double) m_time / (double) RESOLUTION; } // for save states .... INTERNALTYPE *get_internaltype_ptr() { return &m_time; } - static netlist_time from_nsec(const INTERNALTYPE ns) { return netlist_time(ns, U64(1000000000)); } - static netlist_time from_usec(const INTERNALTYPE us) { return netlist_time(us, U64(1000000)); } - static netlist_time from_msec(const INTERNALTYPE ms) { return netlist_time(ms, U64(1000)); } - static netlist_time from_hz(const INTERNALTYPE hz) { return netlist_time(1 , hz); } - static netlist_time from_raw(const INTERNALTYPE raw) { return netlist_time(raw, RESOLUTION); } - - static const netlist_time zero; - - protected: + static inline netlist_time from_nsec(const INTERNALTYPE ns) { return netlist_time(ns, U64(1000000000)); } + static inline netlist_time from_usec(const INTERNALTYPE us) { return netlist_time(us, U64(1000000)); } + static inline netlist_time from_msec(const INTERNALTYPE ms) { return netlist_time(ms, U64(1000)); } + static inline netlist_time from_hz(const INTERNALTYPE hz) { return netlist_time(1 , hz); } + static inline netlist_time from_raw(const INTERNALTYPE raw) { return netlist_time(raw, RESOLUTION); } + static inline netlist_time zero() { return netlist_time(0, RESOLUTION); } + static inline netlist_time quantum() { return netlist_time(1, RESOLUTION); } + static inline netlist_time never() { return netlist_time(std::numeric_limits::max(), RESOLUTION); } private: INTERNALTYPE m_time; }; diff --git a/src/lib/netlist/plib/pconfig.h b/src/lib/netlist/plib/pconfig.h index 8ba86bc290b..506c77c6f8d 100644 --- a/src/lib/netlist/plib/pconfig.h +++ b/src/lib/netlist/plib/pconfig.h @@ -90,13 +90,7 @@ typedef _int128_t INT128; #define MEMBER_ABI #endif -/* not supported in GCC prior to 4.4.x */ -#define __attribute__((hot)) -#define __attribute__((cold)) - #define RESTRICT __restrict__ -#define EXPECTED(x) (x) -#define UNEXPECTED(x) (x) #define ATTR_PRINTF(x,y) __attribute__((format(printf, x, y))) #define ATTR_UNUSED __attribute__((__unused__)) diff --git a/src/lib/netlist/plib/plists.h b/src/lib/netlist/plib/plists.h index f057adfc366..6448e640ea5 100644 --- a/src/lib/netlist/plib/plists.h +++ b/src/lib/netlist/plib/plists.h @@ -168,13 +168,13 @@ public: } } #endif - void insert(LC &elem) + void insert(LC &elem) { elem.m_next = m_head; m_head = &elem; } - void add(LC &elem) + void add(LC &elem) { LC **p = &m_head; while (*p != nullptr) @@ -185,10 +185,10 @@ public: elem.m_next = nullptr; } - void remove(const LC &elem) + void remove(const LC &elem) { - LC **p; - for (p = &m_head; *p != &elem; p = &((*p)->m_next)) + auto p = &m_head; + for ( ; *p != &elem; p = &((*p)->m_next)) { //nl_assert(*p != nullptr); } diff --git a/src/lib/netlist/prg/nltool.cpp b/src/lib/netlist/prg/nltool.cpp index b9cdeff542e..2e78aceec0a 100644 --- a/src/lib/netlist/prg/nltool.cpp +++ b/src/lib/netlist/prg/nltool.cpp @@ -233,7 +233,7 @@ static void run(tool_options_t &opts) t = plib::ticks(); unsigned pos = 0; - netlist::netlist_time nlt = netlist::netlist_time::zero; + netlist::netlist_time nlt = netlist::netlist_time::zero(); while (pos < inps->size() && (*inps)[pos].m_time < netlist::netlist_time(ttr)) { diff --git a/src/lib/netlist/solver/nld_matrix_solver.h b/src/lib/netlist/solver/nld_matrix_solver.h index 7d0b74383ca..af47a18e88e 100644 --- a/src/lib/netlist/solver/nld_matrix_solver.h +++ b/src/lib/netlist/solver/nld_matrix_solver.h @@ -115,6 +115,7 @@ public: m_iterative_fail(0), m_iterative_total(0), m_params(*params), + m_last_step(0, 1), m_cur_ts(0), m_fb_sync(*this, "FB_sync"), m_Q_sync(*this, "Q_sync"), diff --git a/src/lib/netlist/solver/nld_solver.cpp b/src/lib/netlist/solver/nld_solver.cpp index b4d866e708b..102aa4e377b 100644 --- a/src/lib/netlist/solver/nld_solver.cpp +++ b/src/lib/netlist/solver/nld_solver.cpp @@ -382,14 +382,14 @@ void matrix_solver_t::update_dynamic() void matrix_solver_t::reset() { - m_last_step = netlist_time::zero; + m_last_step = netlist_time::zero(); } void matrix_solver_t::update() NOEXCEPT { const netlist_time new_timestep = solve(); - if (m_params.m_dynamic && has_timestep_devices() && new_timestep > netlist_time::zero) + if (m_params.m_dynamic && has_timestep_devices() && new_timestep > netlist_time::zero()) { m_Q_sync.net().toggle_new_Q(); m_Q_sync.net().reschedule_in_queue(new_timestep); From 80f3ade48b50b7498fe67af9b4b46b4a21ea2848 Mon Sep 17 00:00:00 2001 From: couriersud Date: Sun, 5 Jun 2016 02:20:08 +0200 Subject: [PATCH 35/44] Code cleanup. Removed some outdated comments. (nw) --- src/lib/netlist/devices/nld_7448.cpp | 44 ++++++++++++++------------ src/lib/netlist/devices/nld_system.cpp | 5 ++- src/lib/netlist/devices/nlid_system.h | 2 +- src/lib/netlist/nl_base.cpp | 25 +++++++-------- src/lib/netlist/nl_base.h | 38 ++++------------------ src/lib/netlist/nl_setup.cpp | 26 +++++++-------- src/lib/netlist/plib/pstring.cpp | 2 -- src/lib/netlist/prg/nlwav.cpp | 2 +- src/lib/netlist/solver/nld_solver.cpp | 2 +- 9 files changed, 59 insertions(+), 87 deletions(-) diff --git a/src/lib/netlist/devices/nld_7448.cpp b/src/lib/netlist/devices/nld_7448.cpp index 624c60173b7..63f1f637a11 100644 --- a/src/lib/netlist/devices/nld_7448.cpp +++ b/src/lib/netlist/devices/nld_7448.cpp @@ -15,6 +15,7 @@ namespace netlist /* * FIXME: Using truthtable is a lot slower than the explicit device + * in breakout. Performance drops by 20%. */ #define USE_TRUTHTABLE_7448 (0) @@ -62,8 +63,6 @@ namespace netlist }; - #endif - NETLIB_OBJECT_DERIVED(7448_dip, 7448) { NETLIB_CONSTRUCTOR_DERIVED(7448_dip, 7448) @@ -85,6 +84,8 @@ namespace netlist register_subalias("15", m_Q[5]); // f } }; + #endif + #if (USE_TRUTHTABLE_7448 && USE_TRUTHTABLE) nld_7448::truthtable_t nld_7448::m_ttbl; @@ -108,7 +109,7 @@ namespace netlist " 1, 1, X, 0, 1, 1, 1 | 0, 0, 0, 1, 1, 1, 1|100,100,100,100,100,100,100", " 1, 1, X, 1, 1, 1, 1 | 0, 0, 0, 0, 0, 0, 0|100,100,100,100,100,100,100", - // BI/RBO is input output. In the next case it is used as an output will go low. + // BI/RBO is input output. In the next case it is used as an input will go low. " 1, 1, 0, 0, 0, 0, 0 | 0, 0, 0, 0, 0, 0, 0|100,100,100,100,100,100,100", // RBI " 0, 1, X, X, X, X, X | 1, 1, 1, 1, 1, 1, 1|100,100,100,100,100,100,100", // LT @@ -118,26 +119,27 @@ namespace netlist "" }; - NETLIB_START(7448_dip) + NETLIB_OBJECT_DERIVED(7448_dip, 7448) { - NETLIB_NAME(7448)::start(); + NETLIB_CONSTRUCTOR_DERIVED(7448_dip, 7448) + { + register_subalias("1", m_I[4]); // B + register_subalias("2", m_I[5]); // C + register_subalias("3", m_I[0]); // LTQ + register_subalias("4", m_I[1]); // BIQ + register_subalias("5", m_I[2]); // RBIQ + register_subalias("6", m_I[6]); // D + register_subalias("7", m_I[3]); // A - register_subalias("1", m_I[4]); // B - register_subalias("2", m_I[5]); // C - register_subalias("3", m_I[0]); // LTQ - register_subalias("4", m_I[1]); // BIQ - register_subalias("5", m_I[2]); // RBIQ - register_subalias("6", m_I[6]); // D - register_subalias("7", m_I[3]); // A - - register_subalias("9", m_Q[4]); // e - register_subalias("10", m_Q[3]); // d - register_subalias("11", m_Q[2]); // c - register_subalias("12", m_Q[1]); // b - register_subalias("13", m_Q[0]); // a - register_subalias("14", m_Q[6]); // g - register_subalias("15", m_Q[5]); // f - } + register_subalias("9", m_Q[4]); // e + register_subalias("10", m_Q[3]); // d + register_subalias("11", m_Q[2]); // c + register_subalias("12", m_Q[1]); // b + register_subalias("13", m_Q[0]); // a + register_subalias("14", m_Q[6]); // g + register_subalias("15", m_Q[5]); // f + } + }; #else diff --git a/src/lib/netlist/devices/nld_system.cpp b/src/lib/netlist/devices/nld_system.cpp index 9f5f68b004a..c7467f7e3cc 100644 --- a/src/lib/netlist/devices/nld_system.cpp +++ b/src/lib/netlist/devices/nld_system.cpp @@ -57,8 +57,7 @@ namespace netlist NETLIB_RESET(logic_input) { - //FIXME: causes issues in breakout (lots of pings after first player 1 start) - //m_Q.initial(m_IN.Value() & 1); + m_Q.initial(0); } NETLIB_UPDATE(logic_input) @@ -76,7 +75,7 @@ namespace netlist NETLIB_RESET(analog_input) { - // m_Q.initial(m_IN.Value() * 0.999); + m_Q.initial(0.0); } NETLIB_UPDATE(analog_input) diff --git a/src/lib/netlist/devices/nlid_system.h b/src/lib/netlist/devices/nlid_system.h index 2ae5f9f9c32..d481c9e9bdd 100644 --- a/src/lib/netlist/devices/nlid_system.h +++ b/src/lib/netlist/devices/nlid_system.h @@ -540,7 +540,7 @@ namespace netlist NETLIB_UPDATEI(); private: - analog_output_t m_GNDHack; // FIXME: LOng term, we need to connect proxy gnd to device gnd + analog_output_t m_GNDHack; // FIXME: Long term, we need to connect proxy gnd to device gnd NETLIB_SUB(twoterm) m_RV; int m_last_state; bool m_is_timestep; diff --git a/src/lib/netlist/nl_base.cpp b/src/lib/netlist/nl_base.cpp index 7eae7152f8b..f00736c8b27 100644 --- a/src/lib/netlist/nl_base.cpp +++ b/src/lib/netlist/nl_base.cpp @@ -66,7 +66,6 @@ public: } }; -//FIXME: set to proper values class logic_family_cd4xxx_t : public logic_family_desc_t { public: @@ -507,7 +506,7 @@ void device_t::register_subalias(const pstring &name, core_terminal_t &term) // everything already fully qualified setup().register_alias_nofqn(alias, term.name()); - if (term.isType(terminal_t::INPUT) || term.isType(terminal_t::TERMINAL)) + if (term.is_type(terminal_t::INPUT) || term.is_type(terminal_t::TERMINAL)) m_terminals.push_back(alias); } @@ -787,7 +786,7 @@ void analog_net_t::process_net(plib::pvector_t &groups) groups.back().push_back(this); for (core_terminal_t *p : m_core_terms) { - if (p->isType(terminal_t::TERMINAL)) + if (p->is_type(terminal_t::TERMINAL)) { terminal_t *pt = static_cast(p); analog_net_t *other_net = &pt->m_otherterm->net(); @@ -811,6 +810,14 @@ core_terminal_t::core_terminal_t(core_device_t &dev, const pstring &aname, const save(NLNAME(m_state)); } +void core_terminal_t::reset() +{ + if (is_type(OUTPUT)) + set_state(STATE_OUT); + else + set_state(STATE_INP_ACTIVE); +} + void core_terminal_t::set_net(net_t::ptr_t anet) { m_net = anet; @@ -854,15 +861,6 @@ void terminal_t::schedule_after(const netlist_time &after) net().solver()->update_after(after); } -void terminal_t::reset() -{ - set_state(STATE_INP_ACTIVE); - set_ptr(m_Idr1, 0.0); - set_ptr(m_go1, netlist().gmin()); - set_ptr(m_gt1, netlist().gmin()); -} - - // ---------------------------------------------------------------------------------------- // net_input_t // ---------------------------------------------------------------------------------------- @@ -906,7 +904,8 @@ analog_input_t::analog_input_t(core_device_t &dev, const pstring &aname) // ---------------------------------------------------------------------------------------- analog_output_t::analog_output_t(core_device_t &dev, const pstring &aname) - : analog_t(dev, aname, OUTPUT), m_proxied_net(nullptr) + : analog_t(dev, aname, OUTPUT) + , m_proxied_net(nullptr) , m_my_net(dev.netlist(), name() + ".net", this) { this->set_net(&m_my_net); diff --git a/src/lib/netlist/nl_base.h b/src/lib/netlist/nl_base.h index 1f14d04bce8..8be5d59dc0e 100644 --- a/src/lib/netlist/nl_base.h +++ b/src/lib/netlist/nl_base.h @@ -206,7 +206,7 @@ class NETLIB_NAME(name) : public device_t : device_t(owner, name) #define NETLIB_DYNAMIC() \ - public: virtual bool is_dynamic1() const override { return true; } + public: virtual bool is_dynamic() const override { return true; } #define NETLIB_TIMESTEP() \ public: virtual bool is_timestep() const override { return true; } \ @@ -367,7 +367,7 @@ namespace netlist plib::pstate_manager_t &state_manager(); type_t type() const { return m_objtype; } - bool isType(const type_t atype) const { return (m_objtype == atype); } + bool is_type(const type_t atype) const { return (m_objtype == atype); } netlist_t & netlist() { return m_netlist; } const netlist_t & netlist() const { return m_netlist; } @@ -427,6 +427,7 @@ namespace netlist void set_net(net_t *anet); void clear_net(); bool has_net() const { return (m_net != nullptr); } + const net_t & net() const { return *m_net;} net_t & net() { return *m_net;} @@ -441,8 +442,7 @@ namespace netlist m_state = astate; } - // FIXME: need to get rid at some point - virtual void reset() { } + void reset(); private: net_t * m_net; @@ -464,10 +464,6 @@ namespace netlist const analog_net_t & net() const; analog_net_t & net(); - - protected: - - private: }; // ----------------------------------------------------------------------------- @@ -516,8 +512,6 @@ namespace netlist m_Idr1 = Idr; } - protected: - void reset() override; private: void set_ptr(nl_double *ptr, const nl_double val) { @@ -531,7 +525,7 @@ namespace netlist nl_double *m_go1; // conductance for Voltage from other term nl_double *m_gt1; // conductance for total conductance -}; + }; // ----------------------------------------------------------------------------- @@ -576,12 +570,6 @@ namespace netlist void activate_hl(); void activate_lh(); - protected: - virtual void reset() override - { - set_state(STATE_INP_ACTIVE); - } - }; // ----------------------------------------------------------------------------- @@ -595,11 +583,6 @@ namespace netlist nl_double Q_Analog() const; - protected: - virtual void reset() override - { - set_state(STATE_INP_ACTIVE); - } }; // ----------------------------------------------------------------------------- @@ -611,8 +594,6 @@ namespace netlist P_PREVENT_COPYING(net_t) public: - friend class core_device_t; // FIXME - using ptr_t = net_t *; using list_t = plib::pvector_t>; @@ -726,6 +707,7 @@ namespace netlist nl_double Q_Analog() const { return m_cur_Analog; } nl_double &Q_Analog_state_ptr() { return m_cur_Analog; } + //FIXME: needed by current solver code devices::matrix_solver_t *solver() { return m_solver; } void set_solver(devices::matrix_solver_t *solver) { m_solver = solver; } @@ -748,16 +730,10 @@ namespace netlist logic_output_t(core_device_t &dev, const pstring &aname); - virtual void reset() override - { - set_state(STATE_OUT); - } - void initial(const netlist_sig_t val); void set_Q(const netlist_sig_t newQ, const netlist_time delay) NOEXCEPT { - //net().set_Q(newQ, delay); m_my_net.set_Q(newQ, delay); // take the shortcut } @@ -927,7 +903,7 @@ namespace netlist virtual void update_terminals() { } virtual void update_param() {} - virtual bool is_dynamic1() const { return false; } + virtual bool is_dynamic() const { return false; } virtual bool is_timestep() const { return false; } virtual bool needs_update_after_param_change() const { return false; } diff --git a/src/lib/netlist/nl_setup.cpp b/src/lib/netlist/nl_setup.cpp index 102d1ce483a..3e086498439 100644 --- a/src/lib/netlist/nl_setup.cpp +++ b/src/lib/netlist/nl_setup.cpp @@ -246,10 +246,10 @@ void setup_t::register_and_set_param(pstring name, param_t ¶m) void setup_t::register_term(core_terminal_t &term) { - if (term.isType(terminal_t::OUTPUT)) + if (term.is_type(terminal_t::OUTPUT)) { } - else if (term.isType(terminal_t::INPUT)) + else if (term.is_type(terminal_t::INPUT)) { static_cast(term.device()).m_terminals.push_back(term.name()); } @@ -338,7 +338,6 @@ void setup_t::register_frontier(const pstring attach, const double r_IN, const d void setup_t::register_param(const pstring ¶m, const double value) { - // FIXME: there should be a better way register_param(param, plib::pfmt("{1}").e(value,".9")); } @@ -618,7 +617,7 @@ bool setup_t::connect_input_input(core_terminal_t &t1, core_terminal_t &t2) { for (core_terminal_t *t : t1.net().m_core_terms) { - if (t->isType(core_terminal_t::TERMINAL)) + if (t->is_type(core_terminal_t::TERMINAL)) ret = connect(t2, *t); if (ret) break; @@ -633,7 +632,7 @@ bool setup_t::connect_input_input(core_terminal_t &t1, core_terminal_t &t2) { for (core_terminal_t *t : t2.net().m_core_terms) { - if (t->isType(core_terminal_t::TERMINAL)) + if (t->is_type(core_terminal_t::TERMINAL)) ret = connect(t1, *t); if (ret) break; @@ -652,39 +651,39 @@ bool setup_t::connect(core_terminal_t &t1_in, core_terminal_t &t2_in) core_terminal_t &t2 = resolve_proxy(t2_in); bool ret = true; - if (t1.isType(core_terminal_t::OUTPUT) && t2.isType(core_terminal_t::INPUT)) + if (t1.is_type(core_terminal_t::OUTPUT) && t2.is_type(core_terminal_t::INPUT)) { if (t2.has_net() && t2.net().isRailNet()) log().fatal("Input {1} already connected\n", t2.name()); connect_input_output(t2, t1); } - else if (t1.isType(core_terminal_t::INPUT) && t2.isType(core_terminal_t::OUTPUT)) + else if (t1.is_type(core_terminal_t::INPUT) && t2.is_type(core_terminal_t::OUTPUT)) { if (t1.has_net() && t1.net().isRailNet()) log().fatal("Input {1} already connected\n", t1.name()); connect_input_output(t1, t2); } - else if (t1.isType(core_terminal_t::OUTPUT) && t2.isType(core_terminal_t::TERMINAL)) + else if (t1.is_type(core_terminal_t::OUTPUT) && t2.is_type(core_terminal_t::TERMINAL)) { connect_terminal_output(dynamic_cast(t2), t1); } - else if (t1.isType(core_terminal_t::TERMINAL) && t2.isType(core_terminal_t::OUTPUT)) + else if (t1.is_type(core_terminal_t::TERMINAL) && t2.is_type(core_terminal_t::OUTPUT)) { connect_terminal_output(dynamic_cast(t1), t2); } - else if (t1.isType(core_terminal_t::INPUT) && t2.isType(core_terminal_t::TERMINAL)) + else if (t1.is_type(core_terminal_t::INPUT) && t2.is_type(core_terminal_t::TERMINAL)) { connect_terminal_input(dynamic_cast(t2), t1); } - else if (t1.isType(core_terminal_t::TERMINAL) && t2.isType(core_terminal_t::INPUT)) + else if (t1.is_type(core_terminal_t::TERMINAL) && t2.is_type(core_terminal_t::INPUT)) { connect_terminal_input(dynamic_cast(t1), t2); } - else if (t1.isType(core_terminal_t::TERMINAL) && t2.isType(core_terminal_t::TERMINAL)) + else if (t1.is_type(core_terminal_t::TERMINAL) && t2.is_type(core_terminal_t::TERMINAL)) { connect_terminals(dynamic_cast(t1), dynamic_cast(t2)); } - else if (t1.isType(core_terminal_t::INPUT) && t2.isType(core_terminal_t::INPUT)) + else if (t1.is_type(core_terminal_t::INPUT) && t2.is_type(core_terminal_t::INPUT)) { ret = connect_input_input(t1, t2); } @@ -768,7 +767,6 @@ void setup_t::resolve_inputs() log().verbose("looking for two terms connected to rail nets ...\n"); - // FIXME: doesn't find internal devices. This needs to be more clever for (std::size_t i=0; i < netlist().m_devices.size(); i++) { devices::NETLIB_NAME(twoterm) *t = dynamic_cast(netlist().m_devices[i].get()); diff --git a/src/lib/netlist/plib/pstring.cpp b/src/lib/netlist/plib/pstring.cpp index 7dadb9e6240..bec765ff73d 100644 --- a/src/lib/netlist/plib/pstring.cpp +++ b/src/lib/netlist/plib/pstring.cpp @@ -131,8 +131,6 @@ const pstring_t pstring_t::substr(int start, int count) const ret.pcopy(p, 0); else { - //FIXME: Trait to tell which one - //ret.pcopy(cstr() + start, count); // find start for (int i=0; idevice().is_timestep()) if (!m_step_devices.contains(&p->device())) m_step_devices.push_back(&p->device()); - if (p->device().is_dynamic1()) + if (p->device().is_dynamic()) if (!m_dynamic_devices.contains(&p->device())) m_dynamic_devices.push_back(&p->device()); { From 07ec6f43782d8c6d421540e906b848e40fb01027 Mon Sep 17 00:00:00 2001 From: couriersud Date: Sun, 5 Jun 2016 03:07:56 +0200 Subject: [PATCH 36/44] Rewrote for loops to use auto : semantics. (nw) --- src/lib/netlist/devices/nld_truthtable.h | 24 ++++++++++++------------ src/lib/netlist/devices/nlid_system.h | 2 +- src/lib/netlist/nl_base.cpp | 9 ++++----- src/lib/netlist/nl_setup.cpp | 24 ++++++++++-------------- src/lib/netlist/plib/plists.h | 2 +- src/lib/netlist/plib/poptions.h | 15 +++++++-------- src/lib/netlist/plib/pparser.cpp | 10 +++++----- src/lib/netlist/plib/pstate.cpp | 12 ++++++------ src/lib/netlist/plib/pstring.cpp | 16 ++++++++-------- src/lib/netlist/prg/nltool.cpp | 14 ++++++-------- 10 files changed, 60 insertions(+), 68 deletions(-) diff --git a/src/lib/netlist/devices/nld_truthtable.h b/src/lib/netlist/devices/nld_truthtable.h index c227da33fdc..17b646529bd 100644 --- a/src/lib/netlist/devices/nld_truthtable.h +++ b/src/lib/netlist/devices/nld_truthtable.h @@ -163,13 +163,13 @@ public: plib::pstring_vector_t out(io[1], ","); nl_assert_always(out.size() == m_NO, "output count wrong"); - for (unsigned i=0; i < m_NI; i++) + for (std::size_t i=0; i < m_NI; i++) { //new (&m_I[i]) logic_input_t(); inout[i] = inout[i].trim(); m_I.emplace(i, *this, inout[i]); } - for (unsigned i=0; i < m_NO; i++) + for (std::size_t i=0; i < m_NO; i++) { //new (&m_Q[i]) logic_output_t(); out[i] = out[i].trim(); @@ -179,7 +179,7 @@ public: // Connect output "Q" to input "_Q" if this exists // This enables timed state without having explicit state .... UINT32 disabled_ignore = 0; - for (unsigned i=0; i < m_NO; i++) + for (std::size_t i=0; i < m_NO; i++) { pstring tmp = "_" + out[i]; const int idx = inout.indexof(tmp); @@ -213,9 +213,9 @@ public: { m_active = 0; m_ign = 0; - for (unsigned i = 0; i < m_NI; i++) + for (std::size_t i = 0; i < m_NI; i++) m_I[i].activate(); - for (unsigned i=0; im_Q[i].net().num_cons()>0) m_active++; m_last_state = 0; @@ -249,7 +249,7 @@ public: if (m_NI > 1 && has_state == 0) if (--m_active == 0) { - for (unsigned i = 0; i< m_NI; i++) + for (std::size_t i = 0; i< m_NI; i++) m_I[i].inactivate(); m_ign = (1< 1 && !has_state) - for (unsigned i = 0; i < m_NI; i++) + for (std::size_t i = 0; i < m_NI; i++) { if (!doOUT || (m_ign & (1<m_I[i].net().time(), mt); } else - for (unsigned i = 0; i < m_NI; i++) + for (std::size_t i = 0; i < m_NI; i++) state |= (INPLOGIC(m_I[i]) << i); const UINT32 nstate = state | (has_state ? (m_last_state << m_NI) : 0); @@ -297,16 +297,16 @@ private: const UINT32 timebase = nstate * m_NO; if (doOUT) { - for (unsigned i = 0; i < m_NO; i++) + for (std::size_t i = 0; i < m_NO; i++) OUTLOGIC(m_Q[i], (out >> i) & 1, m_ttp->m_timing_nt[m_ttp->m_timing[timebase + i]]); } else - for (unsigned i = 0; i < m_NO; i++) + for (std::size_t i = 0; i < m_NO; i++) m_Q[i].net().set_Q_time((out >> i) & 1, mt + m_ttp->m_timing_nt[m_ttp->m_timing[timebase + i]]); if (m_NI > 1 && !has_state) { - for (unsigned i = 0; i < m_NI; i++) + for (std::size_t i = 0; i < m_NI; i++) if (m_ign & (1 << i)) m_I[i].inactivate(); } diff --git a/src/lib/netlist/devices/nlid_system.h b/src/lib/netlist/devices/nlid_system.h index d481c9e9bdd..8547fcfe22f 100644 --- a/src/lib/netlist/devices/nlid_system.h +++ b/src/lib/netlist/devices/nlid_system.h @@ -311,7 +311,7 @@ namespace netlist , m_Q(*this, "Q") { - for (int i=0; i < m_N; i++) + for (std::size_t i=0; i < m_N; i++) m_I.emplace(i, *this, plib::pfmt("A{1}")(i)); plib::pstring_vector_t cmds(m_func.Value(), " "); diff --git a/src/lib/netlist/nl_base.cpp b/src/lib/netlist/nl_base.cpp index f00736c8b27..1bac7bc5fa2 100644 --- a/src/lib/netlist/nl_base.cpp +++ b/src/lib/netlist/nl_base.cpp @@ -299,8 +299,8 @@ void netlist_t::reset() // m_solver->do_reset(); // Reset all nets once ! - for (std::size_t i = 0; i < m_nets.size(); i++) - m_nets[i]->reset(); + for (auto & n : m_nets) + n->reset(); // Reset all devices once ! for (auto & dev : m_devices) @@ -384,9 +384,8 @@ void netlist_t::print_stats() const { #if (NL_KEEP_STATISTICS) { - for (std::size_t i = 0; i < m_devices.size(); i++) + for (auto & entry : m_devices) { - core_device_t *entry = m_devices[i].get(); printf("Device %20s : %12d %12d %15ld\n", entry->name().cstr(), entry->stat_call_count, entry->stat_update_count, (long int) entry->stat_total_time / (entry->stat_update_count + 1)); } printf("Queue Pushes %15d\n", queue().m_prof_call); @@ -642,7 +641,7 @@ void net_t::rebuild_list() unsigned cnt = 0; m_list_active.clear(); - for (core_terminal_t *term : m_core_terms) + for (auto & term : m_core_terms) if (term->state() != logic_t::STATE_INP_PASSIVE) { m_list_active.add(*term); diff --git a/src/lib/netlist/nl_setup.cpp b/src/lib/netlist/nl_setup.cpp index 3e086498439..3a16c4328d0 100644 --- a/src/lib/netlist/nl_setup.cpp +++ b/src/lib/netlist/nl_setup.cpp @@ -461,7 +461,7 @@ devices::nld_base_proxy *setup_t::get_d_a_proxy(core_terminal_t &out) /* connect all existing terminals to new net */ - for (core_terminal_t *p : out.net().m_core_terms) + for (auto & p : out.net().m_core_terms) { p->clear_net(); // de-link from all nets ... if (!connect(new_proxy->proxy_term(), *p)) @@ -615,7 +615,7 @@ bool setup_t::connect_input_input(core_terminal_t &t1, core_terminal_t &t2) ret = connect(t2, t1.net().railterminal()); if (!ret) { - for (core_terminal_t *t : t1.net().m_core_terms) + for (auto & t : t1.net().m_core_terms) { if (t->is_type(core_terminal_t::TERMINAL)) ret = connect(t2, *t); @@ -630,7 +630,7 @@ bool setup_t::connect_input_input(core_terminal_t &t1, core_terminal_t &t2) ret = connect(t1, t2.net().railterminal()); if (!ret) { - for (core_terminal_t *t : t2.net().m_core_terms) + for (auto & t : t2.net().m_core_terms) { if (t->is_type(core_terminal_t::TERMINAL)) ret = connect(t1, *t); @@ -723,8 +723,8 @@ void setup_t::resolve_inputs() } if (tries == 0) { - for (std::size_t i = 0; i < m_links.size(); i++ ) - log().warning("Error connecting {1} to {2}\n", m_links[i].first, m_links[i].second); + for (auto & link : m_links) + log().warning("Error connecting {1} to {2}\n", link.first, link.second); log().fatal("Error connecting -- bailing out\n"); } @@ -767,16 +767,12 @@ void setup_t::resolve_inputs() log().verbose("looking for two terms connected to rail nets ...\n"); - for (std::size_t i=0; i < netlist().m_devices.size(); i++) + for (auto & t : netlist().get_device_list()) { - devices::NETLIB_NAME(twoterm) *t = dynamic_cast(netlist().m_devices[i].get()); - if (t != nullptr) - { - has_twoterms = true; - if (t->m_N.net().isRailNet() && t->m_P.net().isRailNet()) - log().warning("Found device {1} connected only to railterminals {2}/{3}\n", - t->name(), t->m_N.net().name(), t->m_P.net().name()); - } + has_twoterms = true; + if (t->m_N.net().isRailNet() && t->m_P.net().isRailNet()) + log().warning("Found device {1} connected only to railterminals {2}/{3}\n", + t->name(), t->m_N.net().name(), t->m_P.net().name()); } log().verbose("initialize solver ...\n"); diff --git a/src/lib/netlist/plib/plists.h b/src/lib/netlist/plib/plists.h index 6448e640ea5..4b5f42541d1 100644 --- a/src/lib/netlist/plib/plists.h +++ b/src/lib/netlist/plib/plists.h @@ -103,7 +103,7 @@ public: int indexof(const LC &elem) const { - for (unsigned i = 0; i < this->size(); i++) + for (std::size_t i = 0; i < this->size(); i++) { if (this->at(i) == elem) return i; diff --git a/src/lib/netlist/plib/poptions.h b/src/lib/netlist/plib/poptions.h index ea48598d5f5..dbcf3ba30d4 100644 --- a/src/lib/netlist/plib/poptions.h +++ b/src/lib/netlist/plib/poptions.h @@ -182,9 +182,8 @@ public: { pstring ret; - for (std::size_t i=0; im_short != "") line += " -" + opt->m_short; @@ -207,19 +206,19 @@ private: option *getopt_short(pstring arg) { - for (std::size_t i=0; i < m_opts.size(); i++) + for (auto & opt : m_opts) { - if (m_opts[i]->m_short == arg) - return m_opts[i]; + if (opt->m_short == arg) + return opt; } return nullptr; } option *getopt_long(pstring arg) { - for (std::size_t i=0; i < m_opts.size(); i++) + for (auto & opt : m_opts) { - if (m_opts[i]->m_long == arg) - return m_opts[i]; + if (opt->m_long == arg) + return opt; } return nullptr; } diff --git a/src/lib/netlist/plib/pparser.cpp b/src/lib/netlist/plib/pparser.cpp index 4daa9ebd1a3..359e4415d72 100644 --- a/src/lib/netlist/plib/pparser.cpp +++ b/src/lib/netlist/plib/pparser.cpp @@ -360,13 +360,13 @@ pstring ppreprocessor::replace_macros(const pstring &line) { pstring_vector_t elems(line, m_expr_sep); pstringbuffer ret = ""; - for (std::size_t i=0; im_replace); else - ret.cat(elems[i]); + ret.cat(elem); } return ret; } @@ -374,9 +374,9 @@ pstring ppreprocessor::replace_macros(const pstring &line) static pstring catremainder(const pstring_vector_t &elems, std::size_t start, pstring sep) { pstringbuffer ret = ""; - for (std::size_t i=start; im_dt == DT_CUSTOM) - m_save[i]->m_callback->on_pre_save(); + for (auto & s : m_save) + if (s->m_dt == DT_CUSTOM) + s->m_callback->on_pre_save(); } void pstate_manager_t::post_load() { - for (std::size_t i=0; i < m_save.size(); i++) - if (m_save[i]->m_dt == DT_CUSTOM) - m_save[i]->m_callback->on_post_load(); + for (auto & s : m_save) + if (s->m_dt == DT_CUSTOM) + s->m_callback->on_post_load(); } template<> void pstate_manager_t::save_item(const void *owner, pstate_callback_t &state, const pstring &stname) diff --git a/src/lib/netlist/plib/pstring.cpp b/src/lib/netlist/plib/pstring.cpp index bec765ff73d..9324996ae63 100644 --- a/src/lib/netlist/plib/pstring.cpp +++ b/src/lib/netlist/plib/pstring.cpp @@ -147,7 +147,7 @@ const pstring_t pstring_t::ucase() const { pstring_t ret = *this; ret.pcopy(cstr(), blen()); - for (unsigned i=0; istr()[i] = toupper((unsigned) ret.m_ptr->str()[i]); return ret; } @@ -158,11 +158,11 @@ int pstring_t::find_first_not_of(const pstring_t &no) const char *t = m_ptr->str(); unsigned nolen = no.len(); unsigned tlen = len(); - for (unsigned i=0; i < tlen; i++) + for (std::size_t i=0; i < tlen; i++) { char *n = no.m_ptr->str(); bool f = true; - for (unsigned j=0; j < nolen; j++) + for (std::size_t j=0; j < nolen; j++) { if (F::code(t) == F::code(n)) f = false; @@ -182,11 +182,11 @@ int pstring_t::find_last_not_of(const pstring_t &no) const unsigned nolen = no.len(); unsigned tlen = len(); int last_found = -1; - for (unsigned i=0; i < tlen; i++) + for (std::size_t i=0; i < tlen; i++) { char *n = no.m_ptr->str(); bool f = true; - for (unsigned j=0; j < nolen; j++) + for (std::size_t j=0; j < nolen; j++) { if (F::code(t) == F::code(n)) f = false; @@ -392,7 +392,7 @@ void pstring_t::resetmem() { if (stk != nullptr) { - for (unsigned i=0; i<=16; i++) + for (std::size_t i=0; i<=16; i++) { for (; stk[i].size() > 0; ) { @@ -448,7 +448,7 @@ int pstring_t::find(const pstring_t &search, unsigned start) const const char *s = search.cstr(); const unsigned startt = std::min(start, tlen); const char *t = cstr(); - for (unsigned i=0; i::find(const mem_t *search, unsigned start) const const char *s = search; const unsigned startt = std::min(start, tlen); const char *t = cstr(); - for (unsigned i=0; iopt_logs() : "" , ":"); - for (unsigned i=0; i < ll.size(); i++) + for (auto & log : ll) { - pstring name = "log_" + ll[i]; + pstring name = "log_" + log; /*netlist_device_t *nc = */ m_setup->register_dev("LOG", name); - m_setup->register_link(name + ".I", ll[i]); + m_setup->register_link(name + ".I", log); } } @@ -284,18 +284,16 @@ static void listdevices() nt.setup().start_devices(); nt.setup().resolve_inputs(); - for (unsigned i=0; i < list.size(); i++) + for (auto & f : list) { - auto &f = list[i]; pstring out = plib::pfmt("{1} {2}(")(f->classname(),"-20")(f->name()); pstring terms(""); - auto d = f->Create(nt.setup().netlist(), plib::pfmt("dummy{1}")(i)); + auto d = f->Create(nt.setup().netlist(), "dummy"); // get the list of terminals ... - for (unsigned j=0; j < d->m_terminals.size(); j++) + for (auto & inp : d->m_terminals) { - pstring inp = d->m_terminals[j]; if (inp.startsWith(d->name() + ".")) inp = inp.substr(d->name().len() + 1); terms += "," + inp; From ac5b39d915ff396e78da64e5e500edd0b7122bb7 Mon Sep 17 00:00:00 2001 From: couriersud Date: Sun, 5 Jun 2016 03:17:46 +0200 Subject: [PATCH 37/44] Convert hack into better solution. (nw) --- src/lib/netlist/nl_base.cpp | 1 - src/lib/netlist/nl_base.h | 2 -- src/lib/netlist/solver/nld_matrix_solver.h | 15 ++++++++++++++- src/lib/netlist/solver/nld_solver.cpp | 4 ++-- 4 files changed, 16 insertions(+), 6 deletions(-) diff --git a/src/lib/netlist/nl_base.cpp b/src/lib/netlist/nl_base.cpp index 1bac7bc5fa2..0ef4235506d 100644 --- a/src/lib/netlist/nl_base.cpp +++ b/src/lib/netlist/nl_base.cpp @@ -904,7 +904,6 @@ analog_input_t::analog_input_t(core_device_t &dev, const pstring &aname) analog_output_t::analog_output_t(core_device_t &dev, const pstring &aname) : analog_t(dev, aname, OUTPUT) - , m_proxied_net(nullptr) , m_my_net(dev.netlist(), name() + ".net", this) { this->set_net(&m_my_net); diff --git a/src/lib/netlist/nl_base.h b/src/lib/netlist/nl_base.h index 8be5d59dc0e..2d71642c046 100644 --- a/src/lib/netlist/nl_base.h +++ b/src/lib/netlist/nl_base.h @@ -751,8 +751,6 @@ namespace netlist void initial(const nl_double val); void set_Q(const nl_double newQ); - analog_net_t *m_proxied_net; // only for proxy nets in analog input logic - private: analog_net_t m_my_net; }; diff --git a/src/lib/netlist/solver/nld_matrix_solver.h b/src/lib/netlist/solver/nld_matrix_solver.h index af47a18e88e..0e1c0486203 100644 --- a/src/lib/netlist/solver/nld_matrix_solver.h +++ b/src/lib/netlist/solver/nld_matrix_solver.h @@ -93,6 +93,19 @@ private: }; +class proxied_analog_output_t : public analog_output_t +{ +public: + + proxied_analog_output_t(core_device_t &dev, const pstring &aname) + : analog_output_t(dev, aname) + , m_proxied_net(nullptr) + { } + + analog_net_t *m_proxied_net; // only for proxy nets in analog input logic +}; + + class matrix_solver_t : public device_t { public: @@ -189,7 +202,7 @@ protected: plib::pvector_t m_terms; plib::pvector_t m_nets; - std::vector> m_inps; + std::vector> m_inps; plib::pvector_t m_rails_temp; diff --git a/src/lib/netlist/solver/nld_solver.cpp b/src/lib/netlist/solver/nld_solver.cpp index af2e9f6638a..5cfa8b9a2e9 100644 --- a/src/lib/netlist/solver/nld_solver.cpp +++ b/src/lib/netlist/solver/nld_solver.cpp @@ -147,7 +147,7 @@ void matrix_solver_t::setup_base(analog_net_t::list_t &nets) break; case terminal_t::INPUT: { - analog_output_t *net_proxy_output = nullptr; + proxied_analog_output_t *net_proxy_output = nullptr; for (auto & input : m_inps) if (input->m_proxied_net == &p->net()) { @@ -160,7 +160,7 @@ void matrix_solver_t::setup_base(analog_net_t::list_t &nets) //net_proxy_output = palloc(analog_output_t(*this, // this->name() + "." + plib::pfmt("m{1}")(m_inps.size()))); - auto net_proxy_output_u = plib::make_unique(*this, this->name() + "." + plib::pfmt("m{1}")(m_inps.size())); + auto net_proxy_output_u = plib::make_unique(*this, this->name() + "." + plib::pfmt("m{1}")(m_inps.size())); net_proxy_output = net_proxy_output_u.get(); m_inps.push_back(std::move(net_proxy_output_u)); nl_assert(p->net().is_analog()); From 23968a51ca710a4c715ff231268190948c4506c3 Mon Sep 17 00:00:00 2001 From: couriersud Date: Sun, 5 Jun 2016 03:34:47 +0200 Subject: [PATCH 38/44] Fix bember initialization. (nw) --- src/lib/netlist/nl_config.h | 2 +- src/lib/netlist/nl_lists.h | 20 +++++++++++++------- src/lib/netlist/plib/palloc.h | 4 ++-- 3 files changed, 16 insertions(+), 10 deletions(-) diff --git a/src/lib/netlist/nl_config.h b/src/lib/netlist/nl_config.h index 68a60ece8e4..415acedf95d 100644 --- a/src/lib/netlist/nl_config.h +++ b/src/lib/netlist/nl_config.h @@ -93,7 +93,7 @@ //============================================================ #define NL_DEBUG (false) -#define NL_KEEP_STATISTICS (0) +#define NL_KEEP_STATISTICS (1) //============================================================ // General Macros diff --git a/src/lib/netlist/nl_lists.h b/src/lib/netlist/nl_lists.h index 92cdbc61c57..48240e2c817 100644 --- a/src/lib/netlist/nl_lists.h +++ b/src/lib/netlist/nl_lists.h @@ -36,6 +36,10 @@ namespace netlist timed_queue(unsigned list_size) : m_list(list_size) +#if (NL_KEEP_STATISTICS) + , m_prof_sortmove(0) + , m_prof_call(0) +#endif { #if HAS_OPENMP && USE_OPENMP m_lock = 0; @@ -114,12 +118,6 @@ namespace netlist std::size_t size() const { return m_end - &m_list[1]; } const entry_t & operator[](const std::size_t index) const { return m_list[ 1 + index]; } - #if (NL_KEEP_STATISTICS) - // profiling - INT32 m_prof_sortmove; - INT32 m_prof_call; - #endif - private: #if HAS_OPENMP && USE_OPENMP @@ -127,7 +125,15 @@ namespace netlist #endif entry_t * m_end; std::vector m_list; - }; + + public: + #if (NL_KEEP_STATISTICS) + // profiling + INT32 m_prof_sortmove; + INT32 m_prof_call; + #endif + +}; } diff --git a/src/lib/netlist/plib/palloc.h b/src/lib/netlist/plib/palloc.h index 6b79d410bc8..154656602a6 100644 --- a/src/lib/netlist/plib/palloc.h +++ b/src/lib/netlist/plib/palloc.h @@ -157,8 +157,8 @@ public: r.m_ptr = nullptr; return *this; } - SC * operator ->() { return m_ptr; } - SC & operator *() { return *m_ptr; } + SC * operator ->() const { return m_ptr; } + SC & operator *() const { return *m_ptr; } SC * get() const { return m_ptr; } private: SC *m_ptr; From 91be6978cb34f4fd9619f6043f6ef06959f6810e Mon Sep 17 00:00:00 2001 From: couriersud Date: Sun, 5 Jun 2016 12:53:13 +0200 Subject: [PATCH 39/44] Fix performance measurements. (nw) --- src/lib/netlist/nl_base.cpp | 9 ++++++--- src/lib/netlist/nl_lists.h | 4 ++-- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/src/lib/netlist/nl_base.cpp b/src/lib/netlist/nl_base.cpp index 0ef4235506d..4e7014f3afa 100644 --- a/src/lib/netlist/nl_base.cpp +++ b/src/lib/netlist/nl_base.cpp @@ -386,10 +386,13 @@ void netlist_t::print_stats() const { for (auto & entry : m_devices) { - printf("Device %20s : %12d %12d %15ld\n", entry->name().cstr(), entry->stat_call_count, entry->stat_update_count, (long int) entry->stat_total_time / (entry->stat_update_count + 1)); + log().verbose("Device {1:20} : {2:12} {3:12} {4:15}", entry->name(), + entry->stat_call_count, entry->stat_update_count, + (long int) entry->stat_total_time / (entry->stat_update_count + 1)); } - printf("Queue Pushes %15d\n", queue().m_prof_call); - printf("Queue Moves %15d\n", queue().m_prof_sortmove); + + log().verbose("Queue Pushes {1:15}", queue().m_prof_call); + log().verbose("Queue Moves {1:15}", queue().m_prof_sortmove); } #endif } diff --git a/src/lib/netlist/nl_lists.h b/src/lib/netlist/nl_lists.h index 48240e2c817..b3443ed2297 100644 --- a/src/lib/netlist/nl_lists.h +++ b/src/lib/netlist/nl_lists.h @@ -129,8 +129,8 @@ namespace netlist public: #if (NL_KEEP_STATISTICS) // profiling - INT32 m_prof_sortmove; - INT32 m_prof_call; + std::size_t m_prof_sortmove; + std::size_t m_prof_call; #endif }; From 498a560ec790311c395e9c0547c6a82bee388cca Mon Sep 17 00:00:00 2001 From: couriersud Date: Sun, 5 Jun 2016 18:25:50 +0200 Subject: [PATCH 40/44] More c++. (nw) --- src/lib/netlist/nl_base.cpp | 18 +-- src/lib/netlist/nl_base.h | 2 +- src/lib/netlist/nl_config.h | 2 +- src/lib/netlist/nl_setup.h | 1 + src/lib/netlist/plib/plists.h | 186 ++++++++----------------------- src/lib/netlist/plib/pstring.cpp | 1 + 6 files changed, 59 insertions(+), 151 deletions(-) diff --git a/src/lib/netlist/nl_base.cpp b/src/lib/netlist/nl_base.cpp index 4e7014f3afa..266e87c8ee5 100644 --- a/src/lib/netlist/nl_base.cpp +++ b/src/lib/netlist/nl_base.cpp @@ -602,7 +602,7 @@ net_t::~net_t() void net_t::inc_active(core_terminal_t &term) { m_active++; - m_list_active.insert(term); + m_list_active.push_front(&term); nl_assert(m_active <= num_cons()); if (m_active == 1) { @@ -633,7 +633,7 @@ void net_t::dec_active(core_terminal_t &term) { --m_active; nl_assert(m_active >= 0); - m_list_active.remove(term); + m_list_active.remove(&term); if (m_active == 0 && netlist().use_deactivate()) railterminal().device().do_dec_active(); } @@ -647,7 +647,7 @@ void net_t::rebuild_list() for (auto & term : m_core_terms) if (term->state() != logic_t::STATE_INP_PASSIVE) { - m_list_active.add(*term); + m_list_active.push_back(term); cnt++; } m_active = cnt; @@ -671,11 +671,11 @@ void net_t::update_devs() m_in_queue = 2; /* mark as taken ... */ m_cur_Q = m_new_Q; - for (auto p = m_list_active.first(); p != nullptr; p = p->next()) + for (auto & p : m_list_active) { - inc_stat(p->device().stat_call_count); - if ((p->state() & mask) != 0) - p->device().update_dev(); + inc_stat(p.device().stat_call_count); + if ((p.state() & mask) != 0) + p.device().update_dev(); } } @@ -693,7 +693,7 @@ void net_t::reset() m_list_active.clear(); for (core_terminal_t *ct : m_core_terms) - m_list_active.add(*ct); + m_list_active.push_back(ct); for (core_terminal_t *ct : m_core_terms) ct->reset(); @@ -805,7 +805,7 @@ void analog_net_t::process_net(plib::pvector_t &groups) core_terminal_t::core_terminal_t(core_device_t &dev, const pstring &aname, const type_t atype) : device_object_t(dev, dev.name() + "." + aname, atype) -, plinkedlist_element_t() +, plib::linkedlist_t::element_t() , m_net(nullptr) , m_state(STATE_NONEX) { diff --git a/src/lib/netlist/nl_base.h b/src/lib/netlist/nl_base.h index 2d71642c046..63dcbee2980 100644 --- a/src/lib/netlist/nl_base.h +++ b/src/lib/netlist/nl_base.h @@ -403,7 +403,7 @@ namespace netlist // core_terminal_t // ----------------------------------------------------------------------------- - class core_terminal_t : public device_object_t, public plib::plinkedlist_element_t + class core_terminal_t : public device_object_t, public plib::linkedlist_t::element_t { P_PREVENT_COPYING(core_terminal_t) public: diff --git a/src/lib/netlist/nl_config.h b/src/lib/netlist/nl_config.h index 415acedf95d..68a60ece8e4 100644 --- a/src/lib/netlist/nl_config.h +++ b/src/lib/netlist/nl_config.h @@ -93,7 +93,7 @@ //============================================================ #define NL_DEBUG (false) -#define NL_KEEP_STATISTICS (1) +#define NL_KEEP_STATISTICS (0) //============================================================ // General Macros diff --git a/src/lib/netlist/nl_setup.h b/src/lib/netlist/nl_setup.h index fe7d911a31d..ebf989cb20f 100644 --- a/src/lib/netlist/nl_setup.h +++ b/src/lib/netlist/nl_setup.h @@ -9,6 +9,7 @@ #define NLSETUP_H_ #include +#include #include "nl_base.h" #include "nl_factory.h" diff --git a/src/lib/netlist/plib/plists.h b/src/lib/netlist/plib/plists.h index 4b5f42541d1..93d6be60f07 100644 --- a/src/lib/netlist/plib/plists.h +++ b/src/lib/netlist/plib/plists.h @@ -11,11 +11,10 @@ #define PLISTS_H_ #include -#include #include #include -#include -#include +//#include +//#include #include "palloc.h" #include "pstring.h" @@ -118,171 +117,78 @@ public: // the list allows insertions / deletions if used properly // ---------------------------------------------------------------------------------------- -template -class linkedlist_t; - -#if 1 - -template -struct plinkedlist_element_t -{ -public: - - friend class linkedlist_t; - - plinkedlist_element_t() : m_next(nullptr) {} - - LC *next() const { return m_next; } -//private: - LC * m_next; -}; - template class linkedlist_t { public: + struct element_t + { + public: + + friend class linkedlist_t; + + element_t() : m_next(nullptr) {} + + LC *next() const { return m_next; } + private: + LC * m_next; + }; + + struct iter_t final : public std::iterator + { + LC* p; + public: + constexpr iter_t(LC* x) noexcept : p(x) {} + iter_t(const iter_t &rhs) noexcept = default; + iter_t(iter_t &&rhs) noexcept = default; + iter_t& operator++() noexcept {p = p->next();return *this;} + iter_t operator++(int) noexcept {iter_t tmp(*this); operator++(); return tmp;} + bool operator==(const iter_t& rhs) noexcept {return p==rhs.p;} + bool operator!=(const iter_t& rhs) noexcept {return p!=rhs.p;} + LC& operator*() noexcept {return *p;} + LC* operator->() noexcept {return p;} + }; + linkedlist_t() : m_head(nullptr) {} -#if 0 - void insert(const LC &before, LC &elem) + + iter_t begin() const { return iter_t(m_head); } + constexpr iter_t end() const { return iter_t(nullptr); } + + void push_front(LC *elem) { - if (m_head == &before) - { - elem.m_next = m_head; - m_head = &elem; - } - else - { - LC *p = m_head; - while (p != nullptr) - { - if (p->m_next == &before) - { - elem->m_next = &before; - p->m_next = &elem; - return; - } - p = p->m_next; - } - //throw pexception("element not found"); - } - } -#endif - void insert(LC &elem) - { - elem.m_next = m_head; - m_head = &elem; + elem->m_next = m_head; + m_head = elem; } - void add(LC &elem) + void push_back(LC *elem) { LC **p = &m_head; while (*p != nullptr) { p = &((*p)->m_next); } - *p = &elem; - elem.m_next = nullptr; + *p = elem; + elem->m_next = nullptr; } - void remove(const LC &elem) + void remove(const LC *elem) { auto p = &m_head; - for ( ; *p != &elem; p = &((*p)->m_next)) + for ( ; *p != elem; p = &((*p)->m_next)) { //nl_assert(*p != nullptr); } - (*p) = elem.m_next; + (*p) = elem->m_next; } - LC *first() const { return m_head; } - void clear() { m_head = nullptr; } - bool is_empty() const { return (m_head == nullptr); } + LC *front() const { return m_head; } + void clear() { m_head = nullptr; } + bool empty() const { return (m_head == nullptr); } //private: LC *m_head; }; -#else - -template -struct plinkedlist_element_t -{ -public: - - friend class linkedlist_t; - - plinkedlist_element_t() : m_next(nullptr), m_prev(nullptr) {} - - LC *next() const { return m_next; } -private: - LC * m_next; - LC * m_prev; -}; - -template -class linkedlist_t -{ -public: - - linkedlist_t() : m_head(nullptr), m_tail(nullptr) {} - - void insert(LC &elem) - { - if (m_head != nullptr) - m_head->m_prev = &elem; - elem.m_next = m_head; - elem.m_prev = nullptr; - m_head = &elem; - if (m_tail == nullptr) - m_tail = &elem; - } - - void add(LC &elem) - { - if (m_tail != nullptr) - m_tail->m_next = &elem; - elem.m_prev = m_tail; - m_tail = &elem; - elem.m_next = nullptr; - if (m_head == nullptr) - m_head = &elem; - } - - void remove(const LC &elem) - { - if (prev(elem) == nullptr) - { - m_head = next(elem); - if (m_tail == &elem) - m_tail = nullptr; - } - else - prev(elem)->m_next = next(elem); - - if (next(elem) == nullptr) - { - m_tail = prev(elem); - if (m_head == &elem) - m_head = nullptr; - } - else - next(elem)->m_prev = prev(elem); - } - - - static LC *next(const LC &elem) { return static_cast(elem.m_next); } - static LC *next(const LC *elem) { return static_cast(elem->m_next); } - static LC *prev(const LC &elem) { return static_cast(elem.m_prev); } - static LC *prev(const LC *elem) { return static_cast(elem->m_prev); } - LC *first() const { return m_head; } - void clear() { m_head = m_tail = nullptr; } - bool is_empty() const { return (m_head == nullptr); } - -private: - LC *m_head; - LC *m_tail; -}; -#endif // ---------------------------------------------------------------------------------------- // string list diff --git a/src/lib/netlist/plib/pstring.cpp b/src/lib/netlist/plib/pstring.cpp index 9324996ae63..cb8011734b4 100644 --- a/src/lib/netlist/plib/pstring.cpp +++ b/src/lib/netlist/plib/pstring.cpp @@ -11,6 +11,7 @@ #include #include #include +#include #include "pstring.h" #include "palloc.h" From 7a302cebb3d8c5f78ce2f409c60e7a111f997d83 Mon Sep 17 00:00:00 2001 From: couriersud Date: Sun, 5 Jun 2016 22:55:58 +0200 Subject: [PATCH 41/44] Document that inlining not automatically helps performance. Template specialized implementations outperform the inlined code. (nw) --- src/lib/netlist/devices/nld_74279.cpp | 5 +- src/lib/netlist/devices/nld_74279.h | 11 - src/lib/netlist/devices/nld_7448.cpp | 1 + src/lib/netlist/devices/nld_7448.h | 1 - src/lib/netlist/devices/nld_9312.cpp | 2 +- src/lib/netlist/devices/nld_truthtable.cpp | 19 + src/lib/netlist/devices/nld_truthtable.h | 416 +++++++++++++++++++-- src/lib/netlist/nl_base.cpp | 13 +- src/lib/netlist/nl_base.h | 1 + src/mame/machine/nl_pong.cpp | 94 ++--- 10 files changed, 453 insertions(+), 110 deletions(-) diff --git a/src/lib/netlist/devices/nld_74279.cpp b/src/lib/netlist/devices/nld_74279.cpp index f5eec9b384e..7d9fbfe38cd 100644 --- a/src/lib/netlist/devices/nld_74279.cpp +++ b/src/lib/netlist/devices/nld_74279.cpp @@ -6,6 +6,7 @@ */ #include "nld_74279.h" +#include "nld_truthtable.h" namespace netlist { @@ -53,8 +54,8 @@ namespace netlist NETLIB_SUB(74279A) m_4; }; - nld_74279A::truthtable_t nld_74279A::m_ttbl; - nld_74279B::truthtable_t nld_74279B::m_ttbl; + nld_74279A::truthtable_t nld_74279A::m_ttbl(3,1,0); + nld_74279B::truthtable_t nld_74279B::m_ttbl(4,1,0); const char *nld_74279A::m_desc[] = { "S,R,_Q|Q", diff --git a/src/lib/netlist/devices/nld_74279.h b/src/lib/netlist/devices/nld_74279.h index a77578f0d8d..be1b0fcce23 100644 --- a/src/lib/netlist/devices/nld_74279.h +++ b/src/lib/netlist/devices/nld_74279.h @@ -36,18 +36,7 @@ #ifndef NLD_74279_H_ #define NLD_74279_H_ -#include "nld_truthtable.h" - #define TTL_74279_DIP(name) \ NET_REGISTER_DEV(TTL_74279_DIP, name) -namespace netlist -{ - namespace devices - { - - - } //namespace devices -} // namespace netlist - #endif /* NLD_74279_H_ */ diff --git a/src/lib/netlist/devices/nld_7448.cpp b/src/lib/netlist/devices/nld_7448.cpp index 63f1f637a11..edb11783d2e 100644 --- a/src/lib/netlist/devices/nld_7448.cpp +++ b/src/lib/netlist/devices/nld_7448.cpp @@ -6,6 +6,7 @@ */ #include "nld_7448.h" +#include "nld_truthtable.h" namespace netlist { diff --git a/src/lib/netlist/devices/nld_7448.h b/src/lib/netlist/devices/nld_7448.h index e7c2bda94ed..d9532b55cdb 100644 --- a/src/lib/netlist/devices/nld_7448.h +++ b/src/lib/netlist/devices/nld_7448.h @@ -25,7 +25,6 @@ #define NLD_7448_H_ #include "nl_base.h" -#include "nld_truthtable.h" #define TTL_7448(name, cA0, cA1, cA2, cA3, cLTQ, cBIQ, cRBIQ) \ NET_REGISTER_DEV(TTL_7448, name) \ diff --git a/src/lib/netlist/devices/nld_9312.cpp b/src/lib/netlist/devices/nld_9312.cpp index a7421e6c966..2858d669512 100644 --- a/src/lib/netlist/devices/nld_9312.cpp +++ b/src/lib/netlist/devices/nld_9312.cpp @@ -107,7 +107,7 @@ namespace netlist }; #if (1 && USE_TRUTHTABLE) - nld_9312::truthtable_t nld_9312::m_ttbl; + nld_9312::truthtable_t nld_9312::m_ttbl(12,2,0); /* FIXME: Data changes are propagating faster than changing selects A,B,C * Please refer to data sheet. diff --git a/src/lib/netlist/devices/nld_truthtable.cpp b/src/lib/netlist/devices/nld_truthtable.cpp index e921f1411de..d84782ec988 100644 --- a/src/lib/netlist/devices/nld_truthtable.cpp +++ b/src/lib/netlist/devices/nld_truthtable.cpp @@ -13,6 +13,25 @@ namespace netlist namespace devices { + template + class netlist_factory_truthtable_t : public netlist_base_factory_truthtable_t + { + 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) + , m_ttbl(m_NI, m_NO, has_state){ } + + plib::owned_ptr Create(netlist_t &anetlist, const pstring &name) override + { + typedef nld_truthtable_t tt_type; + return plib::owned_ptr::Create(anetlist, name, m_family, &m_ttbl, m_desc); + } + private: + typename nld_truthtable_t::truthtable_t m_ttbl; + }; + unsigned truthtable_desc_t::count_bits(UINT32 v) { unsigned ret = 0; diff --git a/src/lib/netlist/devices/nld_truthtable.h b/src/lib/netlist/devices/nld_truthtable.h index 17b646529bd..ea986dcf3ef 100644 --- a/src/lib/netlist/devices/nld_truthtable.h +++ b/src/lib/netlist/devices/nld_truthtable.h @@ -11,6 +11,7 @@ #define NLD_TRUTHTABLE_H_ #include +#include #include "nl_base.h" #include "nl_factory.h" @@ -51,6 +52,66 @@ namespace netlist namespace devices { + class dyn_bitset + { + dyn_bitset(const std::size_t size) + : m_size(size) + , m_data_size((m_data_bits - 1 + size) / m_data_bits) + { + m_d = new data_type[m_data_size]; + for (std::size_t i=0; i> m_data_shift); + const std::size_t bitpos = (pos & m_data_mask); + m_d[bytepos] |= (1 << bitpos); + } + + void reset() + { + for (std::size_t i=0; i> m_data_shift); + const std::size_t bitpos = (pos & m_data_mask); + m_d[bytepos] &= ~(1 << bitpos); + } + + bool operator[] (size_t pos) const + { + const std::size_t bytepos = (pos >> m_data_shift); + const std::size_t bitpos = (pos & m_data_mask); + return (m_d[bytepos] >> bitpos) & 1; + } + + private: + typedef std::uint64_t data_type; + static constexpr std::size_t m_data_bits = sizeof(data_type) * 8; + static constexpr std::size_t m_data_shift = 6; + static constexpr std::size_t m_data_mask = (1<< m_data_shift) - 1; + std::size_t m_size; + std::size_t m_data_size; + data_type *m_d; + }; + + #if 0 static inline UINT32 remove_first_bit(UINT32 v) { @@ -64,7 +125,7 @@ static inline UINT32 remove_first_bit(UINT32 v) struct truthtable_desc_t { truthtable_desc_t(int NO, int NI, int has_state, bool *initialized, - UINT32 *outs, UINT8 *timing, netlist_time *timing_nt) + UINT16 *outs, UINT8 *timing, netlist_time *timing_nt) : m_NO(NO), m_NI(NI), /*m_has_state(has_state),*/ m_initialized(initialized), m_outs(outs), m_timing(timing), m_timing_nt(timing_nt), m_num_bits(m_NI + has_state * (m_NI + m_NO)), @@ -86,7 +147,7 @@ private: unsigned m_NI; //int m_has_state; bool *m_initialized; - UINT32 *m_outs; + UINT16 *m_outs; UINT8 *m_timing; netlist_time *m_timing_nt; @@ -97,23 +158,25 @@ private: }; -template +#if 1 +template NETLIB_OBJECT(truthtable_t) { private: family_setter_t m_fam; public: - static const int m_num_bits = m_NI + has_state * (m_NI + m_NO); + static const int m_num_bits = m_NI + m_has_state * (m_NI + m_NO); static const int m_size = (1 << (m_num_bits)); struct truthtable_t { - truthtable_t() + truthtable_t(size_t NI, size_t NO, bool has_state) : m_initialized(false) - , m_desc(m_NO, m_NI, has_state, &m_initialized, m_outs, m_timing, m_timing_nt) {} + , m_desc(NO, NI, has_state, &m_initialized, m_outs, m_timing, m_timing_nt) {} bool m_initialized; - UINT32 m_outs[m_size]; + UINT16 m_outs[m_size]; + //UINT32 m_outs[m_size]; UINT8 m_timing[m_size * m_NO]; netlist_time m_timing_nt[16]; truthtable_desc_t m_desc; @@ -230,7 +293,7 @@ public: void inc_active() override { nl_assert(netlist().use_deactivate()); - if (has_state == 0) + if (m_has_state == 0) if (++m_active == 1) { process(); @@ -246,7 +309,7 @@ public: * can decide for each individual gate whether it is benefitial to * ignore deactivation. */ - if (m_NI > 1 && has_state == 0) + if (m_NI > 1 && m_has_state == 0) if (--m_active == 0) { for (std::size_t i = 0; i< m_NI; i++) @@ -270,12 +333,22 @@ private: netlist_time mt = netlist_time::zero(); UINT32 state = 0; - if (m_NI > 1 && !has_state) - for (std::size_t i = 0; i < m_NI; i++) + if (m_NI > 1 && !m_has_state) + { + + if (!doOUT) { - if (!doOUT || (m_ign & (1<>= 1, i++) + if ((ign & 1)) + m_I[i].activate(); + } + } if (!doOUT) for (std::size_t i = 0; i < m_NI; i++) @@ -287,14 +360,18 @@ private: for (std::size_t i = 0; i < m_NI; i++) state |= (INPLOGIC(m_I[i]) << i); - const UINT32 nstate = state | (has_state ? (m_last_state << m_NI) : 0); + UINT32 nstate = state; + + if (m_has_state) + nstate |= (m_last_state << m_NI); + const UINT32 outstate = m_ttp->m_outs[nstate]; const UINT32 out = outstate & ((1 << m_NO) - 1); + m_ign = outstate >> m_NO; - if (has_state) - m_last_state = (state << m_NO) | out; const UINT32 timebase = nstate * m_NO; + if (doOUT) { for (std::size_t i = 0; i < m_NO; i++) @@ -304,10 +381,14 @@ private: for (std::size_t i = 0; i < m_NO; i++) m_Q[i].net().set_Q_time((out >> i) & 1, mt + m_ttp->m_timing_nt[m_ttp->m_timing[timebase + i]]); - if (m_NI > 1 && !has_state) + if (m_has_state) + m_last_state = (state << m_NO) | out; + + if (m_NI > 1 && !m_has_state) { - for (std::size_t i = 0; i < m_NI; i++) - if (m_ign & (1 << i)) + auto ign(m_ign); + for (std::size_t i = 0; ign != 0; ign >>= 1, i++) + if (ign & 1) m_I[i].inactivate(); } } @@ -320,6 +401,286 @@ private: plib::pstring_vector_t m_desc; }; +#else +NETLIB_OBJECT(xtruthtable_t) +{ +private: + family_setter_t m_fam; +public: + + struct truthtable_t + { + truthtable_t(size_t NI, size_t NO, bool has_state) + : m_initialized(false) + , m_num_bits(NI + has_state * (NI + NO)) + , m_size(1 << (m_num_bits)) + { + m_timing = new UINT8[m_size * NO]; + m_outs = new UINT16[m_size]; + m_desc = new truthtable_desc_t(NO, NI, has_state, &m_initialized, m_outs, m_timing, m_timing_nt); + } + bool m_initialized; + UINT16 *m_outs; + //UINT32 m_outs[m_size]; + UINT8 *m_timing; + netlist_time m_timing_nt[16]; + truthtable_desc_t *m_desc; + int m_num_bits; + int m_size; + }; + + template + nld_xtruthtable_t(size_t NI, size_t NO, bool has_state, C &owner, const pstring &name, const logic_family_desc_t *fam, + truthtable_t *ttbl, const char *desc[]) + : device_t(owner, name) + , m_fam(*this, fam) + , m_last_state(0) + , m_ign(0) + , m_active(1) + , m_ttp(ttbl) + , m_NI(NI) + , m_NO(NO) + , m_has_state(has_state) + { + m_is_truthtable = true; + while (*desc != nullptr && **desc != 0 ) + { + m_desc.push_back(*desc); + desc++; + } + startxx(); + } + + template + nld_xtruthtable_t(size_t NI, size_t NO, bool has_state, C &owner, const pstring &name, const logic_family_desc_t *fam, + truthtable_t *ttbl, const plib::pstring_vector_t &desc) + : device_t(owner, name) + , m_fam(*this, fam) + , m_last_state(0) + , m_ign(0) + , m_active(1) + , m_ttp(ttbl) + , m_NI(NI) + , m_NO(NO) + , m_has_state(has_state) + { + m_is_truthtable = true; + m_desc = desc; + startxx(); + } + + void startxx() + { + pstring header = m_desc[0]; + + plib::pstring_vector_t io(header,"|"); + // checks + nl_assert_always(io.size() == 2, "too many '|'"); + plib::pstring_vector_t inout(io[0], ","); + nl_assert_always(inout.size() == m_ttp->m_num_bits, "bitcount wrong"); + plib::pstring_vector_t out(io[1], ","); + nl_assert_always(out.size() == m_NO, "output count wrong"); + + for (std::size_t i=0; i < m_NI; i++) + { + //new (&m_I[i]) logic_input_t(); + inout[i] = inout[i].trim(); + m_I.emplace(i, *this, inout[i]); + } + for (std::size_t i=0; i < m_NO; i++) + { + //new (&m_Q[i]) logic_output_t(); + out[i] = out[i].trim(); + m_Q.emplace(i, *this, out[i]); + //enregister(out[i], m_Q[i]); + } + // Connect output "Q" to input "_Q" if this exists + // This enables timed state without having explicit state .... + UINT32 disabled_ignore = 0; + for (std::size_t i=0; i < m_NO; i++) + { + pstring tmp = "_" + out[i]; + const int idx = inout.indexof(tmp); + if (idx>=0) + { + connect_late(m_Q[i], m_I[idx]); + // disable ignore for this inputs altogether. + // FIXME: This shouldn't be necessary + disabled_ignore |= (1<m_desc->setup(m_desc, disabled_ignore * 0); + +#if 0 + printf("%s\n", name().cstr()); + for (int j=0; j < m_size; j++) + printf("%05x %04x %04x %04x\n", j, m_ttp->m_outs[j] & ((1 << m_NO)-1), + m_ttp->m_outs[j] >> m_NO, m_ttp->m_timing[j * m_NO + 0]); + for (int k=0; m_ttp->m_timing_nt[k] != netlist_time::zero(); k++) + printf("%d %f\n", k, m_ttp->m_timing_nt[k].as_double() * 1000000.0); +#endif + save(NLNAME(m_last_state)); + save(NLNAME(m_ign)); + save(NLNAME(m_active)); + } + + NETLIB_RESETI() + { + m_active = 0; + m_ign = 0; + for (std::size_t i = 0; i < m_NI; i++) + m_I[i].activate(); + for (std::size_t i=0; im_Q[i].net().num_cons()>0) + m_active++; + m_last_state = 0; + } + +public: + void update() noexcept override final + { + process(); + } + +public: + void inc_active() override + { + nl_assert(netlist().use_deactivate()); + if (m_has_state == 0) + if (++m_active == 1) + { + process(); + } + } + + void dec_active() override + { + nl_assert(netlist().use_deactivate()); + /* FIXME: + * Based on current measurements there is no point to disable + * 1 input devices. This should actually be a parameter so that we + * can decide for each individual gate whether it is benefitial to + * ignore deactivation. + */ + if (m_NI > 1 && m_has_state == 0) + if (--m_active == 0) + { + for (std::size_t i = 0; i< m_NI; i++) + m_I[i].inactivate(); + m_ign = (1< m_I; + plib::uninitialised_array_t m_Q; + +protected: + +private: + + template + inline void process() + { + netlist_time mt = netlist_time::zero(); + + UINT32 state = 0; + if (m_NI > 1 && !m_has_state) + { + + if (!doOUT) + { + for (std::size_t i = 0; i < m_NI; i++) + m_I[i].activate(); + } + else + { + auto ign(m_ign); + for (std::size_t i = 0; ign != 0; ign >>= 1, i++) + if ((ign & 1)) + m_I[i].activate(); + } + } + + if (!doOUT) + for (std::size_t i = 0; i < m_NI; i++) + { + state |= (INPLOGIC(m_I[i]) << i); + mt = std::max(this->m_I[i].net().time(), mt); + } + else + for (std::size_t i = 0; i < m_NI; i++) + state |= (INPLOGIC(m_I[i]) << i); + + UINT32 nstate = state; + + if (m_has_state) + nstate |= (m_last_state << m_NI); + + const UINT32 outstate = m_ttp->m_outs[nstate]; + const UINT32 out = outstate & ((1 << m_NO) - 1); + + m_ign = outstate >> m_NO; + + const UINT32 timebase = nstate * m_NO; + + if (doOUT) + { + for (std::size_t i = 0; i < m_NO; i++) + OUTLOGIC(m_Q[i], (out >> i) & 1, m_ttp->m_timing_nt[m_ttp->m_timing[timebase + i]]); + } + else + for (std::size_t i = 0; i < m_NO; i++) + m_Q[i].net().set_Q_time((out >> i) & 1, mt + m_ttp->m_timing_nt[m_ttp->m_timing[timebase + i]]); + + if (m_has_state) + m_last_state = (state << m_NO) | out; + + if (m_NI > 1 && !m_has_state) + { + auto ign(m_ign); + for (std::size_t i = 0; ign != 0; ign >>= 1, i++) + if (ign & 1) + m_I[i].inactivate(); + } + } + + UINT32 m_last_state; + UINT32 m_ign; + INT32 m_active; + + truthtable_t *m_ttp; + size_t m_NI; + size_t m_NO; + bool m_has_state; + plib::pstring_vector_t m_desc; +}; + +template +NETLIB_OBJECT_DERIVED(truthtable_t, xtruthtable_t) +{ +public: + template + nld_truthtable_t(C &owner, const pstring &name, const logic_family_desc_t *fam, + truthtable_t *ttbl, const char *desc[]) + : nld_xtruthtable_t(NI, NO, has_state, owner, name, fam, ttbl, desc) + { + } + + template + nld_truthtable_t(C &owner, const pstring &name, const logic_family_desc_t *fam, + truthtable_t *ttbl, const plib::pstring_vector_t &desc) + : nld_xtruthtable_t(NI, NO, has_state, owner, name, fam, ttbl, desc) + { + } + +}; + +#endif class netlist_base_factory_truthtable_t : public base_factory_t { P_PREVENT_COPYING(netlist_base_factory_truthtable_t) @@ -337,25 +698,6 @@ public: const logic_family_desc_t *m_family; }; - -template -class netlist_factory_truthtable_t : public netlist_base_factory_truthtable_t -{ - 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) { } - - plib::owned_ptr Create(netlist_t &anetlist, const pstring &name) override - { - typedef nld_truthtable_t tt_type; - return plib::owned_ptr::Create(anetlist, name, m_family, &m_ttbl, m_desc); - } -private: - typename nld_truthtable_t::truthtable_t m_ttbl; -}; - plib::owned_ptr nl_tt_factory_create(const unsigned ni, const unsigned no, const unsigned has_state, const pstring &name, const pstring &classname, diff --git a/src/lib/netlist/nl_base.cpp b/src/lib/netlist/nl_base.cpp index 266e87c8ee5..39a800121b0 100644 --- a/src/lib/netlist/nl_base.cpp +++ b/src/lib/netlist/nl_base.cpp @@ -12,6 +12,7 @@ #include "nl_base.h" #include "devices/nlid_system.h" +#include "devices/nld_truthtable.h" #include "nl_util.h" namespace netlist @@ -430,6 +431,7 @@ core_device_t::core_device_t(netlist_t &owner, const pstring &name) , stat_call_count(0) #endif { + m_is_truthtable = false; if (logic_family() == nullptr) set_logic_family(family_TTL()); } @@ -443,6 +445,7 @@ core_device_t::core_device_t(core_device_t &owner, const pstring &name) , stat_call_count(0) #endif { + m_is_truthtable = false; set_logic_family(owner.logic_family()); if (logic_family() == nullptr) set_logic_family(family_TTL()); @@ -675,7 +678,15 @@ void net_t::update_devs() { inc_stat(p.device().stat_call_count); if ((p.state() & mask) != 0) - p.device().update_dev(); + { + //if (0 && p.device().m_is_truthtable) + { + /* inlining doesn't help, this kills performance */ + //reinterpret_cast(p.device()).update(); + } + //else + p.device().update_dev(); + } } } diff --git a/src/lib/netlist/nl_base.h b/src/lib/netlist/nl_base.h index 63dcbee2980..e57472861a5 100644 --- a/src/lib/netlist/nl_base.h +++ b/src/lib/netlist/nl_base.h @@ -888,6 +888,7 @@ namespace netlist INT32 stat_call_count; #endif + bool m_is_truthtable; protected: virtual void update() NOEXCEPT { } diff --git a/src/mame/machine/nl_pong.cpp b/src/mame/machine/nl_pong.cpp index 5192b2ec1c7..456448ab067 100644 --- a/src/mame/machine/nl_pong.cpp +++ b/src/mame/machine/nl_pong.cpp @@ -12,30 +12,10 @@ #define FAST_CLOCK (1) #ifndef __PLIB_PREPROCESSOR__ -#if 0 -#define TTL_7400A_NAND(_name, _A, _B) TTL_7400_NAND(_name, _A, _B) -#else -#define TTL_7400A_NAND(_name, _A, _B) \ - NET_REGISTER_DEV(TTL_7400A_NAND, _name) \ - NET_CONNECT(_name, A, _A) \ - NET_CONNECT(_name, B, _B) #endif -#endif - -NETLIST_START(lib) - TRUTHTABLE_START(TTL_7400A_NAND, 2, 1, 0, "A,B") - TT_HEAD(" A , B | Q ") - TT_LINE(" 0 , X | 1 |22") - TT_LINE(" X , 0 | 1 |22") - TT_LINE(" 1 , 1 | 0 |15") - TRUTHTABLE_END() -NETLIST_END() NETLIST_START(pong_fast) - LOCAL_SOURCE(lib) - - INCLUDE(lib) SOLVER(Solver, 48000) PARAM(Solver.PARALLEL, 0) // Don't do parallel solvers PARAM(Solver.ACCURACY, 1e-4) // works and is sufficient @@ -144,7 +124,7 @@ NETLIST_START(pong_fast) /* hit logic */ TTL_7404_INVERT(hitQ, hit) - TTL_7400A_NAND(hit, hit1Q, hit2Q) + TTL_7400_NAND(hit, hit1Q, hit2Q) TTL_7402_NOR(attractQ, StopG, runQ) TTL_7404_INVERT(attract, attractQ) @@ -152,22 +132,22 @@ NETLIST_START(pong_fast) TTL_7420_NAND(ic_h6a, hvidQ, hvidQ, hvidQ, hvidQ) ALIAS(hvid, ic_h6a.Q) - TTL_7400A_NAND(ic_e6c, hvid, hblank) + TTL_7400_NAND(ic_e6c, hvid, hblank) ALIAS(MissQ, ic_e6c.Q) TTL_7404_INVERT(ic_d1e, MissQ) - TTL_7400A_NAND(ic_e1a, ic_d1e.Q, attractQ) + TTL_7400_NAND(ic_e1a, ic_d1e.Q, attractQ) ALIAS(Missed, ic_e1a.Q) - TTL_7400A_NAND(rstspeed, SRSTQ, MissQ) - TTL_7400A_NAND(StopG, StopG1Q, StopG2Q) + TTL_7400_NAND(rstspeed, SRSTQ, MissQ) + TTL_7400_NAND(StopG, StopG1Q, StopG2Q) ALIAS(L, ic_h3b.Q) ALIAS(R, ic_h3b.QQ) - TTL_7400A_NAND(hit1Q, pad1, ic_g1b.Q) - TTL_7400A_NAND(hit2Q, pad2, ic_g1b.Q) + TTL_7400_NAND(hit1Q, pad1, ic_g1b.Q) + TTL_7400_NAND(hit2Q, pad2, ic_g1b.Q) - TTL_7400A_NAND(ic_g3c, 128H, ic_h3a.QQ) + TTL_7400_NAND(ic_g3c, 128H, ic_h3a.QQ) TTL_7427_NOR(ic_g2c, ic_g3c.Q, 256H, vpad1Q) ALIAS(pad1, ic_g2c.Q) TTL_7427_NOR(ic_g2a, ic_g3c.Q, 256HQ, vpad2Q) @@ -217,15 +197,15 @@ NETLIST_START(pong_fast) // hblank flip flop // ---------------------------------------------------------------------------------------- - TTL_7400A_NAND(ic_g5b, 16H, 64H) + TTL_7400_NAND(ic_g5b, 16H, 64H) // the time critical one - TTL_7400A_NAND(ic_h5c, ic_h5b.Q, hresetQ) - TTL_7400A_NAND(ic_h5b, ic_h5c.Q, ic_g5b.Q) + TTL_7400_NAND(ic_h5c, ic_h5b.Q, hresetQ) + TTL_7400_NAND(ic_h5b, ic_h5c.Q, ic_g5b.Q) ALIAS(hblank, ic_h5c.Q) ALIAS(hblankQ, ic_h5b.Q) - TTL_7400A_NAND(hsyncQ, hblank, 32H) + TTL_7400_NAND(hsyncQ, hblank, 32H) // ---------------------------------------------------------------------------------------- // vblank flip flop @@ -236,7 +216,7 @@ NETLIST_START(pong_fast) ALIAS(vblank, ic_f5d.Q) ALIAS(vblankQ, ic_f5c.Q) - TTL_7400A_NAND(ic_h5a, 8V, 8V) + TTL_7400_NAND(ic_h5a, 8V, 8V) TTL_7410_NAND(ic_g5a, vblank, 4V, ic_h5a.Q) ALIAS(vsyncQ, ic_g5a.Q) @@ -244,31 +224,31 @@ NETLIST_START(pong_fast) // move logic // ---------------------------------------------------------------------------------------- - TTL_7400A_NAND(ic_e1d, hit_sound, ic_e1c.Q) - TTL_7400A_NAND(ic_e1c, ic_f1.QC, ic_f1.QD) + TTL_7400_NAND(ic_e1d, hit_sound, ic_e1c.Q) + TTL_7400_NAND(ic_e1c, ic_f1.QC, ic_f1.QD) TTL_7493(ic_f1, ic_e1d.Q, ic_f1.QA, rstspeed, rstspeed) TTL_7402_NOR(ic_g1d, ic_f1.QC, ic_f1.QD) - TTL_7400A_NAND(ic_h1a, ic_g1d.Q, ic_g1d.Q) - TTL_7400A_NAND(ic_h1d, ic_e1c.Q, ic_h1a.Q) + TTL_7400_NAND(ic_h1a, ic_g1d.Q, ic_g1d.Q) + TTL_7400_NAND(ic_h1d, ic_e1c.Q, ic_h1a.Q) - TTL_7400A_NAND(ic_h1c, ic_h1d.Q, vreset) - TTL_7400A_NAND(ic_h1b, ic_h1a.Q, vreset) + TTL_7400_NAND(ic_h1c, ic_h1d.Q, vreset) + TTL_7400_NAND(ic_h1b, ic_h1a.Q, vreset) TTL_7402_NOR(ic_g1c, 256HQ, vreset) TTL_74107(ic_h2a, ic_g1c.Q, ic_h2b.Q, low, ic_h1b.Q) TTL_74107(ic_h2b, ic_g1c.Q, high, move, ic_h1c.Q) - TTL_7400A_NAND(ic_h4a, ic_h2b.Q, ic_h2a.Q) + TTL_7400_NAND(ic_h4a, ic_h2b.Q, ic_h2a.Q) ALIAS(move, ic_h4a.Q) - TTL_7400A_NAND(ic_c1d, SC, attract) + TTL_7400_NAND(ic_c1d, SC, attract) TTL_7404_INVERT(ic_d1a, ic_c1d.Q) TTL_7474(ic_h3b, ic_d1a.Q, ic_h3b.QQ, hit1Q, hit2Q) - TTL_7400A_NAND(ic_h4d, ic_h3b.Q, move) - TTL_7400A_NAND(ic_h4b, ic_h3b.QQ, move) - TTL_7400A_NAND(ic_h4c, ic_h4d.Q, ic_h4b.Q) + TTL_7400_NAND(ic_h4d, ic_h3b.Q, move) + TTL_7400_NAND(ic_h4b, ic_h3b.QQ, move) + TTL_7400_NAND(ic_h4c, ic_h4d.Q, ic_h4b.Q) ALIAS(Aa, ic_h4c.Q) ALIAS(Ba, ic_h4b.Q) @@ -276,7 +256,7 @@ NETLIST_START(pong_fast) // hvid circuit // ---------------------------------------------------------------------------------------- - TTL_7400A_NAND(hball_resetQ, Serve, attractQ) + TTL_7400_NAND(hball_resetQ, Serve, attractQ) TTL_9316(ic_g7, clk, high, hblankQ, hball_resetQ, ic_g5c.Q, Aa, Ba, low, high) TTL_9316(ic_h7, clk, ic_g7.RC, high, hball_resetQ, ic_g5c.Q, low, low, low, high) @@ -291,7 +271,7 @@ NETLIST_START(pong_fast) TTL_9316(ic_b3, hsyncQ, high, vblankQ, high, ic_b2b.Q, a6, b6, c6, d6) TTL_9316(ic_a3, hsyncQ, ic_b3.RC, high, high, ic_b2b.Q, low, low, low, low) - TTL_7400A_NAND(ic_b2b, ic_a3.RC, ic_b3.RC) + TTL_7400_NAND(ic_b2b, ic_a3.RC, ic_b3.RC) TTL_7410_NAND(ic_e2b, ic_a3.RC, ic_b3.QC, ic_b3.QD) ALIAS(vvidQ, ic_e2b.Q) TTL_7404_INVERT(vvid, vvidQ) // D2D @@ -383,12 +363,12 @@ NETLIST_START(pong_fast) NET_C(GND, ic_g4_C.2) ALIAS(hit_sound_en, ic_c2a.QQ) - TTL_7400A_NAND(hit_sound, hit_sound_en, vpos16) - TTL_7400A_NAND(score_sound, SC, vpos32) - TTL_7400A_NAND(topbothitsound, ic_f3_topbot.Q, vpos32) + TTL_7400_NAND(hit_sound, hit_sound_en, vpos16) + TTL_7400_NAND(score_sound, SC, vpos32) + TTL_7400_NAND(topbothitsound, ic_f3_topbot.Q, vpos32) TTL_7410_NAND(ic_c4b, topbothitsound, hit_sound, score_sound) - TTL_7400A_NAND(ic_c1b, ic_c4b.Q, attractQ) + TTL_7400_NAND(ic_c1b, ic_c4b.Q, attractQ) ALIAS(sound, ic_c1b.Q) @@ -422,9 +402,9 @@ NETLIST_START(pong_fast) NET_C(GND, ic_b9_C.2) TTL_7404_INVERT(ic_c9b, ic_b9.OUT) - TTL_7400A_NAND(ic_b7b, ic_a7b.Q, hsyncQ) + TTL_7400_NAND(ic_b7b, ic_a7b.Q, hsyncQ) TTL_7493(ic_b8, ic_b7b.Q, ic_b8.QA, ic_b9.OUT, ic_b9.OUT) - TTL_7400A_NAND(ic_b7a, ic_c9b.Q, ic_a7b.Q) + TTL_7400_NAND(ic_b7a, ic_c9b.Q, ic_a7b.Q) TTL_7420_NAND(ic_a7b, ic_b8.QA, ic_b8.QB, ic_b8.QC, ic_b8.QD) ALIAS(vpad1Q, ic_b7a.Q) @@ -462,9 +442,9 @@ NETLIST_START(pong_fast) NET_C(GND, ic_a9_C.2) TTL_7404_INVERT(ic_c9a, ic_a9.OUT) - TTL_7400A_NAND(ic_b7c, ic_a7a.Q, hsyncQ) + TTL_7400_NAND(ic_b7c, ic_a7a.Q, hsyncQ) TTL_7493(ic_a8, ic_b7c.Q, ic_a8.QA, ic_a9.OUT, ic_a9.OUT) - TTL_7400A_NAND(ic_b7d, ic_c9a.Q, ic_a7a.Q) + TTL_7400_NAND(ic_b7d, ic_c9a.Q, ic_a7a.Q) TTL_7420_NAND(ic_a7a, ic_a8.QA, ic_a8.QB, ic_a8.QC, ic_a8.QD) ALIAS(vpad2Q, ic_b7d.Q) @@ -544,8 +524,8 @@ NETLIST_START(pong_fast) TTL_7427_NOR(ic_e5c, ic_e4b.Q, 8H, 4H) ALIAS(scoreFE, ic_e5c.Q) - TTL_7400A_NAND(ic_c3d, 8H, 4H) - //TTL_7400A_NAND(ic_c3d, 4H, 8H) + TTL_7400_NAND(ic_c3d, 8H, 4H) + //TTL_7400_NAND(ic_c3d, 4H, 8H) TTL_7402_NOR(ic_d2b, ic_e4b.Q, ic_c3d.Q) ALIAS(scoreBC, ic_d2b.Q) @@ -571,7 +551,7 @@ NETLIST_START(pong_fast) // net TTL_74107(ic_f3b, clk, 256H, 256HQ, high) - TTL_7400A_NAND(ic_g3b, ic_f3b.QQ, 256H) + TTL_7400_NAND(ic_g3b, ic_f3b.QQ, 256H) TTL_7427_NOR(ic_g2b, ic_g3b.Q, vblank, 4V) ALIAS(net, ic_g2b.Q) From b77ab1bdef77a34ef444e7340b77b124d729c528 Mon Sep 17 00:00:00 2001 From: couriersud Date: Mon, 6 Jun 2016 22:46:02 +0200 Subject: [PATCH 42/44] Truthtable cleanup. (nw) --- src/lib/netlist/devices/nld_74279.cpp | 4 +- src/lib/netlist/devices/nld_9312.cpp | 4 +- src/lib/netlist/devices/nld_truthtable.cpp | 85 +- src/lib/netlist/devices/nld_truthtable.h | 926 +++++++-------------- src/lib/netlist/nl_base.cpp | 13 +- src/lib/netlist/nl_base.h | 1 - 6 files changed, 368 insertions(+), 665 deletions(-) diff --git a/src/lib/netlist/devices/nld_74279.cpp b/src/lib/netlist/devices/nld_74279.cpp index 7d9fbfe38cd..7fb75f946fb 100644 --- a/src/lib/netlist/devices/nld_74279.cpp +++ b/src/lib/netlist/devices/nld_74279.cpp @@ -54,8 +54,8 @@ namespace netlist NETLIB_SUB(74279A) m_4; }; - nld_74279A::truthtable_t nld_74279A::m_ttbl(3,1,0); - nld_74279B::truthtable_t nld_74279B::m_ttbl(4,1,0); + nld_74279A::truthtable_t nld_74279A::m_ttbl; + nld_74279B::truthtable_t nld_74279B::m_ttbl; const char *nld_74279A::m_desc[] = { "S,R,_Q|Q", diff --git a/src/lib/netlist/devices/nld_9312.cpp b/src/lib/netlist/devices/nld_9312.cpp index 2858d669512..2fa5dcdf26f 100644 --- a/src/lib/netlist/devices/nld_9312.cpp +++ b/src/lib/netlist/devices/nld_9312.cpp @@ -106,8 +106,8 @@ namespace netlist NETLIB_SUB(9312) m_sub; }; - #if (1 && USE_TRUTHTABLE) - nld_9312::truthtable_t nld_9312::m_ttbl(12,2,0); + #if (USE_TRUTHTABLE) + nld_9312::truthtable_t nld_9312::m_ttbl; /* FIXME: Data changes are propagating faster than changing selects A,B,C * Please refer to data sheet. diff --git a/src/lib/netlist/devices/nld_truthtable.cpp b/src/lib/netlist/devices/nld_truthtable.cpp index d84782ec988..5aaa14c0fef 100644 --- a/src/lib/netlist/devices/nld_truthtable.cpp +++ b/src/lib/netlist/devices/nld_truthtable.cpp @@ -21,7 +21,7 @@ namespace netlist netlist_factory_truthtable_t(const pstring &name, const pstring &classname, const pstring &def_param) : netlist_base_factory_truthtable_t(name, classname, def_param) - , m_ttbl(m_NI, m_NO, has_state){ } + { } plib::owned_ptr Create(netlist_t &anetlist, const pstring &name) override { @@ -32,37 +32,36 @@ namespace netlist typename nld_truthtable_t::truthtable_t m_ttbl; }; -unsigned truthtable_desc_t::count_bits(UINT32 v) + static const uint64_t all_set = ~((uint64_t) 0); + +unsigned truthtable_desc_t::count_bits(uint64_t v) { - unsigned ret = 0; + uint64_t ret = 0; for (; v != 0; v = v >> 1) { - if (v & 1) - ret++; + ret += (v & 1); } return ret; } -UINT32 truthtable_desc_t::set_bits(UINT32 v, UINT32 b) +uint64_t truthtable_desc_t::set_bits(uint64_t v, uint64_t b) { - UINT32 ret = 0; - int i = 0; - for (; v != 0; v = v >> 1) + uint64_t ret = 0; + for (size_t i = 0; v != 0; v = v >> 1, ++i) { if (v & 1) { ret |= ((b&1)<> 1; } - i++; } return ret; } -UINT32 truthtable_desc_t::get_ignored_simple(UINT32 i) +uint64_t truthtable_desc_t::get_ignored_simple(uint64_t i) { - UINT32 m_enable = 0; - for (UINT32 j=0; j t(bits); + uint64_t bits = (1< t(bits); - for (UINT32 j=1; jjb)) + size_t nb = count_bits(j); + if ((t[j] == 0) && (nb>jb)) { jb = nb; jm = j; } } - return set_bits(nign, jm); + return set_bits(ignore, jm); } // ---------------------------------------------------------------------------------------- @@ -122,7 +121,7 @@ UINT32 truthtable_desc_t::get_ignored_extended(UINT32 i) // ---------------------------------------------------------------------------------------- void truthtable_desc_t::help(unsigned cur, plib::pstring_vector_t list, - UINT64 state,UINT16 val, std::vector &timing_index) + uint64_t state, uint64_t val, std::vector &timing_index) { pstring elem = list[cur].trim(); int start = 0; @@ -156,10 +155,10 @@ void truthtable_desc_t::help(unsigned cur, plib::pstring_vector_t list, else { // cutoff previous inputs and outputs for ignore - if (m_outs[nstate] != ~0U && m_outs[nstate] != val) + if (m_outs[nstate] != m_outs.adjust(all_set) && m_outs[nstate] != val) fatalerror_e(plib::pfmt("Error in truthtable: State {1} already set, {2} != {3}\n") .x(nstate,"04")(m_outs[nstate])(val) ); - m_outs[nstate] = val; + m_outs.set(nstate, val); for (unsigned j=0; j ign(m_size, ~0U); + std::vector ign(m_size, all_set); - for (UINT32 i=0; i + struct need_bytes_for_bits { - dyn_bitset(const std::size_t size) - : m_size(size) - , m_data_size((m_data_bits - 1 + size) / m_data_bits) + enum { value = + bits <= 8 ? 1 : + bits <= 16 ? 2 : + bits <= 32 ? 4 : + 8 + }; + }; + + template struct uint_for_size; + template<> struct uint_for_size<1> { typedef uint8_t type; }; + template<> struct uint_for_size<2> { typedef uint16_t type; }; + template<> struct uint_for_size<4> { typedef uint32_t type; }; + template<> struct uint_for_size<8> { typedef uint64_t type; }; + + struct packed_int + { + template + packed_int(C *data) + : m_data(data) + , m_size(sizeof(C)) + {} + + void set(const size_t pos, const uint64_t val) { - m_d = new data_type[m_data_size]; - for (std::size_t i=0; i> m_data_shift); - const std::size_t bitpos = (pos & m_data_mask); - m_d[bytepos] |= (1 << bitpos); - } - - void reset() - { - for (std::size_t i=0; i> m_data_shift); - const std::size_t bitpos = (pos & m_data_mask); - m_d[bytepos] &= ~(1 << bitpos); - } - - bool operator[] (size_t pos) const - { - const std::size_t bytepos = (pos >> m_data_shift); - const std::size_t bitpos = (pos & m_data_mask); - return (m_d[bytepos] >> bitpos) & 1; - } + void setup(const plib::pstring_vector_t &desc, UINT32 disabled_ignore); private: - typedef std::uint64_t data_type; - static constexpr std::size_t m_data_bits = sizeof(data_type) * 8; - static constexpr std::size_t m_data_shift = 6; - static constexpr std::size_t m_data_mask = (1<< m_data_shift) - 1; - std::size_t m_size; - std::size_t m_data_size; - data_type *m_d; + void help(unsigned cur, plib::pstring_vector_t list, + uint64_t state, uint64_t val, std::vector &timing_index); + static unsigned count_bits(uint64_t v); + static uint64_t set_bits(uint64_t v, uint64_t b); + uint64_t get_ignored_simple(uint64_t i); + uint64_t get_ignored_extended(uint64_t i); + + unsigned m_NO; + unsigned m_NI; + bool *m_initialized; + packed_int m_outs; + uint8_t *m_timing; + netlist_time *m_timing_nt; + + /* additional values */ + + const std::size_t m_num_bits; + const std::size_t m_size; + }; - -#if 0 -static inline UINT32 remove_first_bit(UINT32 v) -{ - for (int i=0; i<32; i++) - if (v & (1< + NETLIB_OBJECT(truthtable_t) { - } + private: + family_setter_t m_fam; + public: - void setup(const plib::pstring_vector_t &desc, UINT32 disabled_ignore); + static const int m_num_bits = m_NI + m_has_state * (m_NI + m_NO); + static const int m_size = (1 << (m_num_bits)); -private: - void help(unsigned cur, plib::pstring_vector_t list, - UINT64 state,UINT16 val, std::vector &timing_index); - static unsigned count_bits(UINT32 v); - static UINT32 set_bits(UINT32 v, UINT32 b); - UINT32 get_ignored_simple(UINT32 i); - UINT32 get_ignored_extended(UINT32 i); - - unsigned m_NO; - unsigned m_NI; - //int m_has_state; - bool *m_initialized; - UINT16 *m_outs; - UINT8 *m_timing; - netlist_time *m_timing_nt; - - /* additional values */ - - const UINT32 m_num_bits; - const UINT32 m_size; - -}; - -#if 1 -template -NETLIB_OBJECT(truthtable_t) -{ -private: - family_setter_t m_fam; -public: - - static const int m_num_bits = m_NI + m_has_state * (m_NI + m_NO); - static const int m_size = (1 << (m_num_bits)); - - struct truthtable_t - { - truthtable_t(size_t NI, size_t NO, bool has_state) - : m_initialized(false) - , m_desc(NO, NI, has_state, &m_initialized, m_outs, m_timing, m_timing_nt) {} - bool m_initialized; - UINT16 m_outs[m_size]; - //UINT32 m_outs[m_size]; - UINT8 m_timing[m_size * m_NO]; - netlist_time m_timing_nt[16]; - truthtable_desc_t m_desc; - }; - - template - nld_truthtable_t(C &owner, const pstring &name, const logic_family_desc_t *fam, - truthtable_t *ttbl, const char *desc[]) - : device_t(owner, name) - , m_fam(*this, fam) - , m_last_state(0) - , m_ign(0) - , m_active(1) - , m_ttp(ttbl) - { - while (*desc != nullptr && **desc != 0 ) - { - m_desc.push_back(*desc); - desc++; - } - startxx(); - } - - template - nld_truthtable_t(C &owner, const pstring &name, const logic_family_desc_t *fam, - truthtable_t *ttbl, const plib::pstring_vector_t &desc) - : device_t(owner, name) - , m_fam(*this, fam) - , m_last_state(0) - , m_ign(0) - , m_active(1) - , m_ttp(ttbl) - { - m_desc = desc; - startxx(); - } - - void startxx() - { - pstring header = m_desc[0]; - - plib::pstring_vector_t io(header,"|"); - // checks - nl_assert_always(io.size() == 2, "too many '|'"); - plib::pstring_vector_t inout(io[0], ","); - nl_assert_always(inout.size() == m_num_bits, "bitcount wrong"); - plib::pstring_vector_t out(io[1], ","); - nl_assert_always(out.size() == m_NO, "output count wrong"); - - for (std::size_t i=0; i < m_NI; i++) + struct truthtable_t { - //new (&m_I[i]) logic_input_t(); - inout[i] = inout[i].trim(); - m_I.emplace(i, *this, inout[i]); - } - for (std::size_t i=0; i < m_NO; i++) + truthtable_t() + : m_initialized(false) + {} + bool m_initialized; + typename uint_for_size::value>::type m_outs[m_size]; + UINT8 m_timing[m_size * m_NO]; + netlist_time m_timing_nt[16]; + }; + + template + nld_truthtable_t(C &owner, const pstring &name, const logic_family_desc_t *fam, + truthtable_t *ttp, const char *desc[]) + : device_t(owner, name) + , m_fam(*this, fam) + , m_last_state(0) + , m_ign(0) + , m_active(1) + , m_ttp(ttp) { - //new (&m_Q[i]) logic_output_t(); - out[i] = out[i].trim(); - m_Q.emplace(i, *this, out[i]); - //enregister(out[i], m_Q[i]); - } - // Connect output "Q" to input "_Q" if this exists - // This enables timed state without having explicit state .... - UINT32 disabled_ignore = 0; - for (std::size_t i=0; i < m_NO; i++) - { - pstring tmp = "_" + out[i]; - const int idx = inout.indexof(tmp); - if (idx>=0) - { - connect_late(m_Q[i], m_I[idx]); - // disable ignore for this inputs altogether. - // FIXME: This shouldn't be necessary - disabled_ignore |= (1<m_desc.setup(m_desc, disabled_ignore * 0); - -#if 0 - printf("%s\n", name().cstr()); - for (int j=0; j < m_size; j++) - printf("%05x %04x %04x %04x\n", j, m_ttp->m_outs[j] & ((1 << m_NO)-1), - m_ttp->m_outs[j] >> m_NO, m_ttp->m_timing[j * m_NO + 0]); - for (int k=0; m_ttp->m_timing_nt[k] != netlist_time::zero(); k++) - printf("%d %f\n", k, m_ttp->m_timing_nt[k].as_double() * 1000000.0); -#endif - save(NLNAME(m_last_state)); - save(NLNAME(m_ign)); - save(NLNAME(m_active)); - } - - NETLIB_RESETI() - { - m_active = 0; - m_ign = 0; - for (std::size_t i = 0; i < m_NI; i++) - m_I[i].activate(); - for (std::size_t i=0; im_Q[i].net().num_cons()>0) - m_active++; - m_last_state = 0; - } - - NETLIB_UPDATEI() - { - process(); - } - -public: - void inc_active() override - { - nl_assert(netlist().use_deactivate()); - if (m_has_state == 0) - if (++m_active == 1) - { - process(); - } - } - - void dec_active() override - { - nl_assert(netlist().use_deactivate()); - /* FIXME: - * Based on current measurements there is no point to disable - * 1 input devices. This should actually be a parameter so that we - * can decide for each individual gate whether it is benefitial to - * ignore deactivation. - */ - if (m_NI > 1 && m_has_state == 0) - if (--m_active == 0) - { - for (std::size_t i = 0; i< m_NI; i++) - m_I[i].inactivate(); - m_ign = (1< m_I; - plib::uninitialised_array_t m_Q; - -protected: - -private: - - template - inline void process() - { - netlist_time mt = netlist_time::zero(); - - UINT32 state = 0; - if (m_NI > 1 && !m_has_state) + template + nld_truthtable_t(C &owner, const pstring &name, const logic_family_desc_t *fam, + truthtable_t *ttp, const plib::pstring_vector_t &desc) + : device_t(owner, name) + , m_fam(*this, fam) + , m_last_state(0) + , m_ign(0) + , m_active(1) + , m_ttp(ttp) { + m_desc = desc; + startxx(); + } - if (!doOUT) + void startxx() + { + pstring header = m_desc[0]; + + plib::pstring_vector_t io(header,"|"); + // checks + nl_assert_always(io.size() == 2, "too many '|'"); + plib::pstring_vector_t inout(io[0], ","); + nl_assert_always(inout.size() == m_num_bits, "bitcount wrong"); + plib::pstring_vector_t out(io[1], ","); + nl_assert_always(out.size() == m_NO, "output count wrong"); + + for (std::size_t i=0; i < m_NI; i++) { - for (std::size_t i = 0; i < m_NI; i++) - m_I[i].activate(); + inout[i] = inout[i].trim(); + m_I.emplace(i, *this, inout[i]); + } + for (std::size_t i=0; i < m_NO; i++) + { + out[i] = out[i].trim(); + m_Q.emplace(i, *this, out[i]); + } + // Connect output "Q" to input "_Q" if this exists + // This enables timed state without having explicit state .... + UINT32 disabled_ignore = 0; + for (std::size_t i=0; i < m_NO; i++) + { + pstring tmp = "_" + out[i]; + const int idx = inout.indexof(tmp); + if (idx>=0) + { + connect_late(m_Q[i], m_I[idx]); + // disable ignore for this inputs altogether. + // FIXME: This shouldn't be necessary + disabled_ignore |= (1<m_initialized, packed_int(m_ttp->m_outs), m_ttp->m_timing, m_ttp->m_timing_nt); + + desc.setup(m_desc, disabled_ignore * 0); + + #if 0 + printf("%s\n", name().cstr()); + for (int j=0; j < m_size; j++) + printf("%05x %04x %04x %04x\n", j, m_ttp.m_outs[j] & ((1 << m_NO)-1), + m_ttp.m_outs[j] >> m_NO, m_ttp.m_timing[j * m_NO + 0]); + for (int k=0; m_ttp.m_timing_nt[k] != netlist_time::zero(); k++) + printf("%d %f\n", k, m_ttp.m_timing_nt[k].as_double() * 1000000.0); + #endif + save(NLNAME(m_last_state)); + save(NLNAME(m_ign)); + save(NLNAME(m_active)); + } + + NETLIB_RESETI() + { + m_active = 0; + m_ign = 0; + for (std::size_t i = 0; i < m_NI; i++) + m_I[i].activate(); + for (std::size_t i=0; im_Q[i].net().num_cons()>0) + m_active++; + m_last_state = 0; + } + + NETLIB_UPDATEI() + { + process(); + } + + public: + void inc_active() override + { + nl_assert(netlist().use_deactivate()); + if (m_NI > 1 && m_has_state == 0) + if (++m_active == 1) + { + process(); + } + } + + void dec_active() override + { + nl_assert(netlist().use_deactivate()); + /* FIXME: + * Based on current measurements there is no point to disable + * 1 input devices. This should actually be a parameter so that we + * can decide for each individual gate whether it is benefitial to + * ignore deactivation. + */ + if (m_NI > 1 && m_has_state == 0) + if (--m_active == 0) + { + for (std::size_t i = 0; i< m_NI; i++) + m_I[i].inactivate(); + m_ign = (1< m_I; + plib::uninitialised_array_t m_Q; + + protected: + + private: + + template + inline void process() + { + netlist_time mt = netlist_time::zero(); + + uint64_t state = 0; + if (m_NI > 1 && !m_has_state) + { + auto ign = m_ign; + if (!doOUT) + for (std::size_t i = 0; i < m_NI; i++) + { + m_I[i].activate(); + state |= (INPLOGIC(m_I[i]) << i); + mt = std::max(this->m_I[i].net().time(), mt); + } + else + for (std::size_t i = 0; i < m_NI; ign >>= 1, i++) + { + if ((ign & 1)) + m_I[i].activate(); + state |= (INPLOGIC(m_I[i]) << i); + } } else { - auto ign(m_ign); - for (std::size_t i = 0; ign != 0; ign >>= 1, i++) - if ((ign & 1)) - m_I[i].activate(); + if (!doOUT) + for (std::size_t i = 0; i < m_NI; i++) + { + state |= (INPLOGIC(m_I[i]) << i); + mt = std::max(this->m_I[i].net().time(), mt); + } + else + for (std::size_t i = 0; i < m_NI; i++) + state |= (INPLOGIC(m_I[i]) << i); } - } + auto nstate = state; - if (!doOUT) - for (std::size_t i = 0; i < m_NI; i++) + if (m_has_state) + nstate |= (m_last_state << m_NI); + + const auto outstate = m_ttp->m_outs[nstate]; + const auto out = outstate & ((1 << m_NO) - 1); + + m_ign = outstate >> m_NO; + + const auto timebase = nstate * m_NO; + + if (doOUT) { - state |= (INPLOGIC(m_I[i]) << i); - mt = std::max(this->m_I[i].net().time(), mt); - } - else - for (std::size_t i = 0; i < m_NI; i++) - state |= (INPLOGIC(m_I[i]) << i); - - UINT32 nstate = state; - - if (m_has_state) - nstate |= (m_last_state << m_NI); - - const UINT32 outstate = m_ttp->m_outs[nstate]; - const UINT32 out = outstate & ((1 << m_NO) - 1); - - m_ign = outstate >> m_NO; - - const UINT32 timebase = nstate * m_NO; - - if (doOUT) - { - for (std::size_t i = 0; i < m_NO; i++) - OUTLOGIC(m_Q[i], (out >> i) & 1, m_ttp->m_timing_nt[m_ttp->m_timing[timebase + i]]); - } - else - for (std::size_t i = 0; i < m_NO; i++) - m_Q[i].net().set_Q_time((out >> i) & 1, mt + m_ttp->m_timing_nt[m_ttp->m_timing[timebase + i]]); - - if (m_has_state) - m_last_state = (state << m_NO) | out; - - if (m_NI > 1 && !m_has_state) - { - auto ign(m_ign); - for (std::size_t i = 0; ign != 0; ign >>= 1, i++) - if (ign & 1) - m_I[i].inactivate(); - } - } - - UINT32 m_last_state; - UINT32 m_ign; - INT32 m_active; - - truthtable_t *m_ttp; - plib::pstring_vector_t m_desc; -}; - -#else -NETLIB_OBJECT(xtruthtable_t) -{ -private: - family_setter_t m_fam; -public: - - struct truthtable_t - { - truthtable_t(size_t NI, size_t NO, bool has_state) - : m_initialized(false) - , m_num_bits(NI + has_state * (NI + NO)) - , m_size(1 << (m_num_bits)) - { - m_timing = new UINT8[m_size * NO]; - m_outs = new UINT16[m_size]; - m_desc = new truthtable_desc_t(NO, NI, has_state, &m_initialized, m_outs, m_timing, m_timing_nt); - } - bool m_initialized; - UINT16 *m_outs; - //UINT32 m_outs[m_size]; - UINT8 *m_timing; - netlist_time m_timing_nt[16]; - truthtable_desc_t *m_desc; - int m_num_bits; - int m_size; - }; - - template - nld_xtruthtable_t(size_t NI, size_t NO, bool has_state, C &owner, const pstring &name, const logic_family_desc_t *fam, - truthtable_t *ttbl, const char *desc[]) - : device_t(owner, name) - , m_fam(*this, fam) - , m_last_state(0) - , m_ign(0) - , m_active(1) - , m_ttp(ttbl) - , m_NI(NI) - , m_NO(NO) - , m_has_state(has_state) - { - m_is_truthtable = true; - while (*desc != nullptr && **desc != 0 ) - { - m_desc.push_back(*desc); - desc++; - } - startxx(); - } - - template - nld_xtruthtable_t(size_t NI, size_t NO, bool has_state, C &owner, const pstring &name, const logic_family_desc_t *fam, - truthtable_t *ttbl, const plib::pstring_vector_t &desc) - : device_t(owner, name) - , m_fam(*this, fam) - , m_last_state(0) - , m_ign(0) - , m_active(1) - , m_ttp(ttbl) - , m_NI(NI) - , m_NO(NO) - , m_has_state(has_state) - { - m_is_truthtable = true; - m_desc = desc; - startxx(); - } - - void startxx() - { - pstring header = m_desc[0]; - - plib::pstring_vector_t io(header,"|"); - // checks - nl_assert_always(io.size() == 2, "too many '|'"); - plib::pstring_vector_t inout(io[0], ","); - nl_assert_always(inout.size() == m_ttp->m_num_bits, "bitcount wrong"); - plib::pstring_vector_t out(io[1], ","); - nl_assert_always(out.size() == m_NO, "output count wrong"); - - for (std::size_t i=0; i < m_NI; i++) - { - //new (&m_I[i]) logic_input_t(); - inout[i] = inout[i].trim(); - m_I.emplace(i, *this, inout[i]); - } - for (std::size_t i=0; i < m_NO; i++) - { - //new (&m_Q[i]) logic_output_t(); - out[i] = out[i].trim(); - m_Q.emplace(i, *this, out[i]); - //enregister(out[i], m_Q[i]); - } - // Connect output "Q" to input "_Q" if this exists - // This enables timed state without having explicit state .... - UINT32 disabled_ignore = 0; - for (std::size_t i=0; i < m_NO; i++) - { - pstring tmp = "_" + out[i]; - const int idx = inout.indexof(tmp); - if (idx>=0) - { - connect_late(m_Q[i], m_I[idx]); - // disable ignore for this inputs altogether. - // FIXME: This shouldn't be necessary - disabled_ignore |= (1<m_desc->setup(m_desc, disabled_ignore * 0); - -#if 0 - printf("%s\n", name().cstr()); - for (int j=0; j < m_size; j++) - printf("%05x %04x %04x %04x\n", j, m_ttp->m_outs[j] & ((1 << m_NO)-1), - m_ttp->m_outs[j] >> m_NO, m_ttp->m_timing[j * m_NO + 0]); - for (int k=0; m_ttp->m_timing_nt[k] != netlist_time::zero(); k++) - printf("%d %f\n", k, m_ttp->m_timing_nt[k].as_double() * 1000000.0); -#endif - save(NLNAME(m_last_state)); - save(NLNAME(m_ign)); - save(NLNAME(m_active)); - } - - NETLIB_RESETI() - { - m_active = 0; - m_ign = 0; - for (std::size_t i = 0; i < m_NI; i++) - m_I[i].activate(); - for (std::size_t i=0; im_Q[i].net().num_cons()>0) - m_active++; - m_last_state = 0; - } - -public: - void update() noexcept override final - { - process(); - } - -public: - void inc_active() override - { - nl_assert(netlist().use_deactivate()); - if (m_has_state == 0) - if (++m_active == 1) - { - process(); - } - } - - void dec_active() override - { - nl_assert(netlist().use_deactivate()); - /* FIXME: - * Based on current measurements there is no point to disable - * 1 input devices. This should actually be a parameter so that we - * can decide for each individual gate whether it is benefitial to - * ignore deactivation. - */ - if (m_NI > 1 && m_has_state == 0) - if (--m_active == 0) - { - for (std::size_t i = 0; i< m_NI; i++) - m_I[i].inactivate(); - m_ign = (1< m_I; - plib::uninitialised_array_t m_Q; - -protected: - -private: - - template - inline void process() - { - netlist_time mt = netlist_time::zero(); - - UINT32 state = 0; - if (m_NI > 1 && !m_has_state) - { - - if (!doOUT) - { - for (std::size_t i = 0; i < m_NI; i++) - m_I[i].activate(); + for (std::size_t i = 0; i < m_NO; i++) + OUTLOGIC(m_Q[i], (out >> i) & 1, m_ttp->m_timing_nt[m_ttp->m_timing[timebase + i]]); } else + for (std::size_t i = 0; i < m_NO; i++) + m_Q[i].net().set_Q_time((out >> i) & 1, mt + m_ttp->m_timing_nt[m_ttp->m_timing[timebase + i]]); + + if (m_has_state) + m_last_state = (state << m_NO) | out; + + if (m_NI > 1 && !m_has_state) { auto ign(m_ign); for (std::size_t i = 0; ign != 0; ign >>= 1, i++) - if ((ign & 1)) - m_I[i].activate(); + if (ign & 1) + m_I[i].inactivate(); } } - if (!doOUT) - for (std::size_t i = 0; i < m_NI; i++) - { - state |= (INPLOGIC(m_I[i]) << i); - mt = std::max(this->m_I[i].net().time(), mt); - } - else - for (std::size_t i = 0; i < m_NI; i++) - state |= (INPLOGIC(m_I[i]) << i); + UINT32 m_last_state; + UINT32 m_ign; + INT32 m_active; - UINT32 nstate = state; + truthtable_t *m_ttp; + plib::pstring_vector_t m_desc; + }; - if (m_has_state) - nstate |= (m_last_state << m_NI); + class netlist_base_factory_truthtable_t : public base_factory_t + { + P_PREVENT_COPYING(netlist_base_factory_truthtable_t) + public: + netlist_base_factory_truthtable_t(const pstring &name, const pstring &classname, + const pstring &def_param) + : base_factory_t(name, classname, def_param), m_family(family_TTL()) + {} - const UINT32 outstate = m_ttp->m_outs[nstate]; - const UINT32 out = outstate & ((1 << m_NO) - 1); - - m_ign = outstate >> m_NO; - - const UINT32 timebase = nstate * m_NO; - - if (doOUT) + virtual ~netlist_base_factory_truthtable_t() { - for (std::size_t i = 0; i < m_NO; i++) - OUTLOGIC(m_Q[i], (out >> i) & 1, m_ttp->m_timing_nt[m_ttp->m_timing[timebase + i]]); } - else - for (std::size_t i = 0; i < m_NO; i++) - m_Q[i].net().set_Q_time((out >> i) & 1, mt + m_ttp->m_timing_nt[m_ttp->m_timing[timebase + i]]); - if (m_has_state) - m_last_state = (state << m_NO) | out; + plib::pstring_vector_t m_desc; + const logic_family_desc_t *m_family; + }; - if (m_NI > 1 && !m_has_state) - { - auto ign(m_ign); - for (std::size_t i = 0; ign != 0; ign >>= 1, i++) - if (ign & 1) - m_I[i].inactivate(); - } - } - - UINT32 m_last_state; - UINT32 m_ign; - INT32 m_active; - - truthtable_t *m_ttp; - size_t m_NI; - size_t m_NO; - bool m_has_state; - plib::pstring_vector_t m_desc; -}; - -template -NETLIB_OBJECT_DERIVED(truthtable_t, xtruthtable_t) -{ -public: - template - nld_truthtable_t(C &owner, const pstring &name, const logic_family_desc_t *fam, - truthtable_t *ttbl, const char *desc[]) - : nld_xtruthtable_t(NI, NO, has_state, owner, name, fam, ttbl, desc) - { - } - - template - nld_truthtable_t(C &owner, const pstring &name, const logic_family_desc_t *fam, - truthtable_t *ttbl, const plib::pstring_vector_t &desc) - : nld_xtruthtable_t(NI, NO, has_state, owner, name, fam, ttbl, desc) - { - } - -}; - -#endif -class netlist_base_factory_truthtable_t : public base_factory_t -{ - P_PREVENT_COPYING(netlist_base_factory_truthtable_t) -public: - netlist_base_factory_truthtable_t(const pstring &name, const pstring &classname, - const pstring &def_param) - : base_factory_t(name, classname, def_param), m_family(family_TTL()) - {} - - virtual ~netlist_base_factory_truthtable_t() - { - } - - plib::pstring_vector_t m_desc; - 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); + 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); } //namespace devices } // namespace netlist diff --git a/src/lib/netlist/nl_base.cpp b/src/lib/netlist/nl_base.cpp index 39a800121b0..266e87c8ee5 100644 --- a/src/lib/netlist/nl_base.cpp +++ b/src/lib/netlist/nl_base.cpp @@ -12,7 +12,6 @@ #include "nl_base.h" #include "devices/nlid_system.h" -#include "devices/nld_truthtable.h" #include "nl_util.h" namespace netlist @@ -431,7 +430,6 @@ core_device_t::core_device_t(netlist_t &owner, const pstring &name) , stat_call_count(0) #endif { - m_is_truthtable = false; if (logic_family() == nullptr) set_logic_family(family_TTL()); } @@ -445,7 +443,6 @@ core_device_t::core_device_t(core_device_t &owner, const pstring &name) , stat_call_count(0) #endif { - m_is_truthtable = false; set_logic_family(owner.logic_family()); if (logic_family() == nullptr) set_logic_family(family_TTL()); @@ -678,15 +675,7 @@ void net_t::update_devs() { inc_stat(p.device().stat_call_count); if ((p.state() & mask) != 0) - { - //if (0 && p.device().m_is_truthtable) - { - /* inlining doesn't help, this kills performance */ - //reinterpret_cast(p.device()).update(); - } - //else - p.device().update_dev(); - } + p.device().update_dev(); } } diff --git a/src/lib/netlist/nl_base.h b/src/lib/netlist/nl_base.h index e57472861a5..63dcbee2980 100644 --- a/src/lib/netlist/nl_base.h +++ b/src/lib/netlist/nl_base.h @@ -888,7 +888,6 @@ namespace netlist INT32 stat_call_count; #endif - bool m_is_truthtable; protected: virtual void update() NOEXCEPT { } From f7ac9783d676221a9b41145924d4d9025552d602 Mon Sep 17 00:00:00 2001 From: couriersud Date: Mon, 6 Jun 2016 23:55:42 +0200 Subject: [PATCH 43/44] Get rid of nl_math. Remove nl_util.h and moved contents to plib/putil.h. (nw) --- scripts/src/netlist.lua | 3 +- src/lib/netlist/analog/nld_bjt.cpp | 6 +- src/lib/netlist/analog/nld_opamps.cpp | 2 +- src/lib/netlist/analog/nld_twoterm.cpp | 8 +- src/lib/netlist/analog/nld_twoterm.h | 8 +- src/lib/netlist/nl_base.cpp | 4 +- src/lib/netlist/nl_base.h | 1 - src/lib/netlist/nl_dice_compat.h | 4 +- src/lib/netlist/nl_parser.h | 1 - src/lib/netlist/nl_setup.cpp | 4 +- src/lib/netlist/nl_util.h | 128 --------------------- src/lib/netlist/plib/putil.cpp | 41 +++++++ src/lib/netlist/plib/putil.h | 25 ++++ src/lib/netlist/prg/nltool.cpp | 3 +- src/lib/netlist/solver/nld_matrix_solver.h | 2 +- src/lib/netlist/solver/nld_ms_direct.h | 2 +- src/lib/netlist/solver/nld_ms_direct_lu.h | 6 +- src/lib/netlist/solver/nld_ms_gmres.h | 16 +-- src/lib/netlist/solver/nld_ms_sor.h | 6 +- src/lib/netlist/solver/nld_ms_sor_mat.h | 10 +- src/lib/netlist/solver/nld_ms_w.h | 4 +- src/lib/netlist/solver/nld_solver.cpp | 7 +- src/lib/netlist/solver/vector_base.h | 2 +- 23 files changed, 116 insertions(+), 177 deletions(-) delete mode 100644 src/lib/netlist/nl_util.h create mode 100644 src/lib/netlist/plib/putil.cpp create mode 100644 src/lib/netlist/plib/putil.h diff --git a/scripts/src/netlist.lua b/scripts/src/netlist.lua index fffb0e89d54..c038f14a28e 100644 --- a/scripts/src/netlist.lua +++ b/scripts/src/netlist.lua @@ -27,7 +27,6 @@ project "netlist" MAME_DIR .. "src/lib/netlist/nl_dice_compat.h", MAME_DIR .. "src/lib/netlist/nl_lists.h", MAME_DIR .. "src/lib/netlist/nl_time.h", - MAME_DIR .. "src/lib/netlist/nl_util.h", MAME_DIR .. "src/lib/netlist/nl_base.cpp", MAME_DIR .. "src/lib/netlist/nl_base.h", MAME_DIR .. "src/lib/netlist/nl_parser.cpp", @@ -56,6 +55,8 @@ project "netlist" MAME_DIR .. "src/lib/netlist/plib/pstream.cpp", MAME_DIR .. "src/lib/netlist/plib/pstream.h", MAME_DIR .. "src/lib/netlist/plib/ptypes.h", + MAME_DIR .. "src/lib/netlist/plib/putil.cpp", + MAME_DIR .. "src/lib/netlist/plib/putil.h", MAME_DIR .. "src/lib/netlist/tools/nl_convert.cpp", MAME_DIR .. "src/lib/netlist/tools/nl_convert.h", MAME_DIR .. "src/lib/netlist/analog/nld_bjt.cpp", diff --git a/src/lib/netlist/analog/nld_bjt.cpp b/src/lib/netlist/analog/nld_bjt.cpp index a2fcc817371..80b6ffe107b 100644 --- a/src/lib/netlist/analog/nld_bjt.cpp +++ b/src/lib/netlist/analog/nld_bjt.cpp @@ -30,9 +30,9 @@ public: m_VT = 0.0258 * n; m_VT_inv = 1.0 / m_VT; } - nl_double I(const nl_double V) const { return m_Is * nl_math::exp(V * m_VT_inv) - m_Is; } - nl_double g(const nl_double V) const { return m_Is * m_VT_inv * nl_math::exp(V * m_VT_inv); } - nl_double V(const nl_double I) const { return nl_math::e_log1p(I / m_Is) * m_VT; } // log1p(x)=log(1.0 + x) + nl_double I(const nl_double V) const { return m_Is * std::exp(V * m_VT_inv) - m_Is; } + nl_double g(const nl_double V) const { return m_Is * m_VT_inv * std::exp(V * m_VT_inv); } + nl_double V(const nl_double I) const { return std::log1p(I / m_Is) * m_VT; } // log1p(x)=log(1.0 + x) nl_double gI(const nl_double I) const { return m_VT_inv * (I + m_Is); } private: diff --git a/src/lib/netlist/analog/nld_opamps.cpp b/src/lib/netlist/analog/nld_opamps.cpp index 60eccba7457..932232a9ecb 100644 --- a/src/lib/netlist/analog/nld_opamps.cpp +++ b/src/lib/netlist/analog/nld_opamps.cpp @@ -60,7 +60,7 @@ NETLIB_UPDATE(OPAMP) { const double cVt = 0.0258 * 1.0; // * m_n; const double cId = m_model.model_value("DAB"); // 3 mA - const double cVd = cVt * nl_math::log(cId / 1e-15 + 1.0); + const double cVd = cVt * std::log(cId / 1e-15 + 1.0); m_VH.set_Q(INPANALOG(m_VCC) - m_model.model_value("VLH") - cVd); m_VL.set_Q(INPANALOG(m_GND) + m_model.model_value("VLL") + cVd); m_VREF.set_Q((INPANALOG(m_VCC) + INPANALOG(m_GND)) / 2.0); diff --git a/src/lib/netlist/analog/nld_twoterm.cpp b/src/lib/netlist/analog/nld_twoterm.cpp index 6c60695aafb..9a526c4c174 100644 --- a/src/lib/netlist/analog/nld_twoterm.cpp +++ b/src/lib/netlist/analog/nld_twoterm.cpp @@ -29,14 +29,14 @@ generic_diode::generic_diode() void generic_diode::set_param(const nl_double Is, const nl_double n, nl_double gmin) { - static const double csqrt2 = nl_math::sqrt(2.0); + static const double csqrt2 = std::sqrt(2.0); m_Is = Is; m_n = n; m_gmin = gmin; m_Vt = 0.0258 * m_n; - m_Vcrit = m_Vt * nl_math::log(m_Vt / m_Is / csqrt2); + m_Vcrit = m_Vt * std::log(m_Vt / m_Is / csqrt2); m_VtInv = 1.0 / m_Vt; } @@ -69,7 +69,7 @@ NETLIB_UPDATE_PARAM(POT) { nl_double v = m_Dial.Value(); if (m_DialIsLog.Value()) - v = (nl_math::exp(v) - 1.0) / (nl_math::exp(1.0) - 1.0); + v = (std::exp(v) - 1.0) / (std::exp(1.0) - 1.0); m_R1.update_dev(); m_R2.update_dev(); @@ -88,7 +88,7 @@ NETLIB_UPDATE_PARAM(POT2) nl_double v = m_Dial.Value(); if (m_DialIsLog.Value()) - v = (nl_math::exp(v) - 1.0) / (nl_math::exp(1.0) - 1.0); + v = (std::exp(v) - 1.0) / (std::exp(1.0) - 1.0); if (m_Reverse.Value()) v = 1.0 - v; diff --git a/src/lib/netlist/analog/nld_twoterm.h b/src/lib/netlist/analog/nld_twoterm.h index eaae36d6b0f..d94b1498a53 100644 --- a/src/lib/netlist/analog/nld_twoterm.h +++ b/src/lib/netlist/analog/nld_twoterm.h @@ -326,7 +326,7 @@ public: { m_Vd = nVd; //m_Vd = m_Vd + 10.0 * m_Vt * std::tanh((nVd - m_Vd) / 10.0 / m_Vt); - const nl_double eVDVt = nl_math::exp(m_Vd * m_VtInv); + const nl_double eVDVt = std::exp(m_Vd * m_VtInv); m_Id = m_Is * (eVDVt - NL_FCONST(1.0)); m_G = m_Is * m_VtInv * eVDVt + m_gmin; } @@ -334,18 +334,18 @@ public: { #if 1 const nl_double a = std::max((nVd - m_Vd) * m_VtInv, NL_FCONST(0.5) - NL_FCONST(1.0)); - m_Vd = m_Vd + nl_math::e_log1p(a) * m_Vt; + m_Vd = m_Vd + std::log1p(a) * m_Vt; #else m_Vd = m_Vd + 10.0 * m_Vt * std::tanh((nVd - m_Vd) / 10.0 / m_Vt); #endif - const nl_double eVDVt = nl_math::exp(m_Vd * m_VtInv); + const nl_double eVDVt = std::exp(m_Vd * m_VtInv); m_Id = m_Is * (eVDVt - NL_FCONST(1.0)); m_G = m_Is * m_VtInv * eVDVt + m_gmin; } #else m_Vd = m_Vd + 20.0 * m_Vt * std::tanh((nVd - m_Vd) / 20.0 / m_Vt); - const nl_double eVDVt = nl_math::exp(m_Vd * m_VtInv); + const nl_double eVDVt = std::exp(m_Vd * m_VtInv); m_Id = m_Is * (eVDVt - NL_FCONST(1.0)); m_G = m_Is * m_VtInv * eVDVt + m_gmin; #endif diff --git a/src/lib/netlist/nl_base.cpp b/src/lib/netlist/nl_base.cpp index 266e87c8ee5..b39a41cdcaa 100644 --- a/src/lib/netlist/nl_base.cpp +++ b/src/lib/netlist/nl_base.cpp @@ -8,11 +8,11 @@ #include "solver/nld_matrix_solver.h" #include "solver/nld_solver.h" +#include "plib/putil.h" #include "plib/palloc.h" #include "nl_base.h" #include "devices/nlid_system.h" -#include "nl_util.h" namespace netlist { @@ -221,7 +221,7 @@ void netlist_t::start() { /* load the library ... */ - pstring libpath = nl_util::environment("NL_BOOSTLIB", nl_util::buildpath({".", "nlboost.so"})); + pstring libpath = plib::util::environment("NL_BOOSTLIB", plib::util::buildpath({".", "nlboost.so"})); m_lib = plib::palloc(libpath); diff --git a/src/lib/netlist/nl_base.h b/src/lib/netlist/nl_base.h index 63dcbee2980..6e6b938408d 100644 --- a/src/lib/netlist/nl_base.h +++ b/src/lib/netlist/nl_base.h @@ -160,7 +160,6 @@ #include "nl_lists.h" #include "nl_time.h" -#include "nl_util.h" #include "plib/pdynlib.h" #include "plib/pstate.h" #include "plib/pfmtlog.h" diff --git a/src/lib/netlist/nl_dice_compat.h b/src/lib/netlist/nl_dice_compat.h index d70b8d8494d..e163b637f4c 100644 --- a/src/lib/netlist/nl_dice_compat.h +++ b/src/lib/netlist/nl_dice_compat.h @@ -200,7 +200,7 @@ inline int CAPACITOR_tc_hl(const double c, const double r) * Vt = (VH-VL)*exp(-t/RC) * ln(Vt/(VH-VL))*RC = -t */ - static const double TIME_CONSTANT = -nl_math::log(2.0 / (3.7-0.3)); + static const double TIME_CONSTANT = -std::log(2.0 / (3.7-0.3)); int ret = (int) (TIME_CONSTANT * (130.0 + r) * c * 1e9); return ret; } @@ -211,7 +211,7 @@ inline int CAPACITOR_tc_lh(const double c, const double r) * Vt = (VH-VL)*(1-exp(-t/RC)) * -t=ln(1-Vt/(VH-VL))*RC */ - static const double TIME_CONSTANT = -nl_math::log(1.0 - 0.8 / (3.7-0.3)); + static const double TIME_CONSTANT = -std::log(1.0 - 0.8 / (3.7-0.3)); int ret = (int) (TIME_CONSTANT * (1.0 + r) * c * 1e9); return ret; } diff --git a/src/lib/netlist/nl_parser.h b/src/lib/netlist/nl_parser.h index dc30ff056a0..7338fb01abd 100644 --- a/src/lib/netlist/nl_parser.h +++ b/src/lib/netlist/nl_parser.h @@ -9,7 +9,6 @@ #define NL_PARSER_H_ #include "nl_setup.h" -#include "nl_util.h" #include "plib/pparser.h" namespace netlist diff --git a/src/lib/netlist/nl_setup.cpp b/src/lib/netlist/nl_setup.cpp index 3a16c4328d0..b311e4b1a68 100644 --- a/src/lib/netlist/nl_setup.cpp +++ b/src/lib/netlist/nl_setup.cpp @@ -10,10 +10,10 @@ #include "solver/nld_solver.h" #include "plib/palloc.h" +#include "plib/putil.h" #include "nl_base.h" #include "nl_setup.h" #include "nl_parser.h" -#include "nl_util.h" #include "nl_factory.h" #include "devices/net_lib.h" #include "devices/nlid_system.h" @@ -795,7 +795,7 @@ void setup_t::resolve_inputs() void setup_t::start_devices() { - pstring env = nl_util::environment("NL_LOGS"); + pstring env = plib::util::environment("NL_LOGS"); if (env != "") { diff --git a/src/lib/netlist/nl_util.h b/src/lib/netlist/nl_util.h deleted file mode 100644 index 969f4f5138c..00000000000 --- a/src/lib/netlist/nl_util.h +++ /dev/null @@ -1,128 +0,0 @@ -// license:GPL-2.0+ -// copyright-holders:Couriersud -/* - * nl_util.h - * - */ - -#ifndef NL_UTIL_H_ -#define NL_UTIL_H_ - -#include -#include -#include -#include -#include - -#include "plib/pstring.h" -#include "plib/plists.h" - -class nl_util -{ -// this is purely static -private: - nl_util() {}; - -public: - - static const pstring buildpath(std::initializer_list list ) - { - pstring ret = ""; - for( auto elem : list ) - { - if (ret == "") - ret = elem; - else -#ifdef WIN32 - ret = ret + '\\' + elem; -#else - ret = ret + '/' + elem; -#endif - } - return ret; - } - - static const pstring environment(const pstring &var, const pstring &default_val = "") - { - if (getenv(var.cstr()) == nullptr) - return default_val; - else - return pstring(getenv(var.cstr())); - } -}; - -class nl_math -{ -// this is purely static -private: - nl_math() {}; - -public: - template - static T abs(const T &x) { return std::abs(x); } - - template - static T max(const T &x, const T &y) { return std::max(x, y); } - - template - static T min(const T &x, const T &y) { return std::min(x, y); } - - template - static T log(const T &x) { return std::log(x); } - - #if defined(MSC_VER) && MSC_VER < 1800 - inline static double e_log1p(const double &x) { return nl_math::log(1.0 + x); } - inline static float e_log1p(const float &x) { return nl_math::log(1.0 + x); } -#else - template - static T e_log1p(const T &x) { return log1p(x); } -#endif - - template - static T sqrt(const T &x) { return std::sqrt(x); } - - template - static T hypot(const T &x, const T &y) { return std::hypot(x, y); } - - // this one has an accuracy of better than 5%. That's enough for our purpose - // add c3 and it'll be better than 1% - -#if 0 - inline static float exp(const float &x) { return std::exp(x); } - inline static double fastexp_h(const double &x) - { - /* static */ const double ln2r = 1.442695040888963387; - /* static */ const double ln2 = 0.693147180559945286; - /* static */ const double c3 = 0.166666666666666667; - /* static */ const double c4 = 1.0 / 24.0; - /* static */ const double c5 = 1.0 / 120.0; - - const double y = x * ln2r; - const UINT32 t = y; - const double z = (x - ln2 * (double) t); - const double e = (1.0 + z * (1.0 + z * (0.5 + z * (c3 + z * (c4 + c5*z))))); - - if (t < 63) - //return (double)((UINT64) 1 << t)*(1.0 + z + 0.5 * zz + c3 * zzz+c4*zzzz+c5*zzzzz); - return (double)((UINT64) 1 << t) * e; - else - return pow(2.0, t)*e; - } - - inline static double exp(const double &x) - { - if (x<0) - return 1.0 / fastexp_h(-x); - else - return fastexp_h(x); - } -#else - template - static double exp(const T &x) { return std::exp(x); } -#endif - -}; - - - -#endif /* NL_UTIL_H_ */ diff --git a/src/lib/netlist/plib/putil.cpp b/src/lib/netlist/plib/putil.cpp new file mode 100644 index 00000000000..3e77cdf19c0 --- /dev/null +++ b/src/lib/netlist/plib/putil.cpp @@ -0,0 +1,41 @@ +// license:GPL-2.0+ +// copyright-holders:Couriersud + +#include +#include +#include +#include + +#include "plib/putil.h" +#include "plib/plists.h" + +namespace plib +{ + namespace util + { + const pstring buildpath(std::initializer_list list ) + { + pstring ret = ""; + for( auto elem : list ) + { + if (ret == "") + ret = elem; + else + #ifdef WIN32 + ret = ret + '\\' + elem; + #else + ret = ret + '/' + elem; + #endif + } + return ret; + } + + const pstring environment(const pstring &var, const pstring &default_val) + { + if (getenv(var.cstr()) == nullptr) + return default_val; + else + return pstring(getenv(var.cstr())); + } + } +} diff --git a/src/lib/netlist/plib/putil.h b/src/lib/netlist/plib/putil.h new file mode 100644 index 00000000000..59aaee9d557 --- /dev/null +++ b/src/lib/netlist/plib/putil.h @@ -0,0 +1,25 @@ +// license:GPL-2.0+ +// copyright-holders:Couriersud +/* + * putil.h + * + */ + +#ifndef P_UTIL_H_ +#define P_UTIL_H_ + +#include + +#include "plib/pstring.h" +#include "plib/plists.h" + +namespace plib +{ + namespace util + { + const pstring buildpath(std::initializer_list list ); + const pstring environment(const pstring &var, const pstring &default_val = ""); + } +} + +#endif /* P_UTIL_H_ */ diff --git a/src/lib/netlist/prg/nltool.cpp b/src/lib/netlist/prg/nltool.cpp index ec63ad674e5..302f1d12184 100644 --- a/src/lib/netlist/prg/nltool.cpp +++ b/src/lib/netlist/prg/nltool.cpp @@ -9,6 +9,7 @@ ****************************************************************************/ #include +#include #ifdef PSTANDALONE #if (PSTANDALONE) @@ -16,7 +17,7 @@ #endif #endif -#include +#include "plib/poptions.h" #include "plib/pstring.h" #include "plib/plists.h" #include "plib/ptypes.h" diff --git a/src/lib/netlist/solver/nld_matrix_solver.h b/src/lib/netlist/solver/nld_matrix_solver.h index 0e1c0486203..7504191a356 100644 --- a/src/lib/netlist/solver/nld_matrix_solver.h +++ b/src/lib/netlist/solver/nld_matrix_solver.h @@ -246,7 +246,7 @@ T matrix_solver_t::delta(const T * RESTRICT V) const unsigned iN = this->m_terms.size(); T cerr = 0; for (unsigned i = 0; i < iN; i++) - cerr = nl_math::max(cerr, nl_math::abs(V[i] - (T) this->m_nets[i]->m_cur_Analog)); + cerr = std::max(cerr, std::abs(V[i] - (T) this->m_nets[i]->m_cur_Analog)); return cerr; } diff --git a/src/lib/netlist/solver/nld_ms_direct.h b/src/lib/netlist/solver/nld_ms_direct.h index 731d847c445..f8514867f6e 100644 --- a/src/lib/netlist/solver/nld_ms_direct.h +++ b/src/lib/netlist/solver/nld_ms_direct.h @@ -310,7 +310,7 @@ void matrix_solver_direct_t::LE_solve() { x_i[p] = i; x_start[p] = chunks * p; - x_stop[p] = nl_math::min(chunks*(p+1), eb); + x_stop[p] = std::min(chunks*(p+1), eb); if (p::compute_next_timestep() n->m_h_n_m_1 = hn; n->m_DD_n_m_1 = DD_n; - if (nl_math::abs(DD2) > NL_FCONST(1e-30)) // avoid div-by-zero - new_net_timestep = nl_math::sqrt(m_params.m_lte / nl_math::abs(NL_FCONST(0.5)*DD2)); + if (std::abs(DD2) > NL_FCONST(1e-30)) // avoid div-by-zero + new_net_timestep = std::sqrt(m_params.m_lte / std::abs(NL_FCONST(0.5)*DD2)); else new_net_timestep = m_params.m_max_timestep; @@ -550,7 +550,7 @@ nl_double matrix_solver_direct_t::delta( const unsigned iN = this->N(); nl_double cerr = 0; for (unsigned i = 0; i < iN; i++) - cerr = std::fmax(cerr, nl_math::abs(V[i] - this->m_nets[i]->m_cur_Analog)); + cerr = std::fmax(cerr, std::abs(V[i] - this->m_nets[i]->m_cur_Analog)); return cerr; } diff --git a/src/lib/netlist/solver/nld_ms_gmres.h b/src/lib/netlist/solver/nld_ms_gmres.h index e4ee5fe0cb8..e4c42b2e098 100644 --- a/src/lib/netlist/solver/nld_ms_gmres.h +++ b/src/lib/netlist/solver/nld_ms_gmres.h @@ -121,7 +121,7 @@ int matrix_solver_GMRES_t::vsolve_non_dynamic(const bool newton_ * * and estimate using * - * omega = 2.0 / (1.0 + nl_math::sqrt(1-rho)) + * omega = 2.0 / (1.0 + std::sqrt(1-rho)) */ //nz_num = 0; @@ -172,7 +172,7 @@ int matrix_solver_GMRES_t::vsolve_non_dynamic(const bool newton_ int mr = iN; if (iN > 3 ) mr = (int) sqrt(iN) * 2; - int iter = nl_math::max(1, this->m_params.m_gs_loops); + int iter = std::max(1, this->m_params.m_gs_loops); int gsl = solve_ilu_gmres(new_V, RHS, iter, mr, accuracy); int failed = mr * iter; @@ -262,12 +262,12 @@ int matrix_solver_GMRES_t::solve_ilu_gmres (nl_double * RESTRICT mat.mult_vec(m_A, t, Ax); mat.solveLUx(m_LU, Ax); - const nl_double rho_to_accuracy = nl_math::sqrt(vecmult2(n, Ax)) / accuracy; + const nl_double rho_to_accuracy = std::sqrt(vecmult2(n, Ax)) / accuracy; rho_delta = accuracy * rho_to_accuracy; } else - rho_delta = accuracy * nl_math::sqrt((double) n) * m_accuracy_mult; + rho_delta = accuracy * std::sqrt((double) n) * m_accuracy_mult; for (unsigned itr = 0; itr < restart_max; itr++) { @@ -287,7 +287,7 @@ int matrix_solver_GMRES_t::solve_ilu_gmres (nl_double * RESTRICT mat.solveLUx(m_LU, residual); } - rho = nl_math::sqrt(vecmult2(n, residual)); + rho = std::sqrt(vecmult2(n, residual)); vec_mult_scalar(n, residual, NL_FCONST(1.0) / rho, m_v[0]); @@ -311,7 +311,7 @@ int matrix_solver_GMRES_t::solve_ilu_gmres (nl_double * RESTRICT m_ht[j][k] = vecmult(n, m_v[k1], m_v[j]); vec_add_mult_scalar(n, m_v[j], -m_ht[j][k], m_v[k1]); } - m_ht[k1][k] = nl_math::sqrt(vecmult2(n, m_v[k1])); + m_ht[k1][k] = std::sqrt(vecmult2(n, m_v[k1])); if (m_ht[k1][k] != 0.0) vec_scale(n, m_v[k1], NL_FCONST(1.0) / m_ht[k1][k]); @@ -319,7 +319,7 @@ int matrix_solver_GMRES_t::solve_ilu_gmres (nl_double * RESTRICT for (unsigned j = 0; j < k; j++) givens_mult(m_c[j], m_s[j], m_ht[j][k], m_ht[j+1][k]); - mu = nl_math::hypot(m_ht[k][k], m_ht[k1][k]); + mu = std::hypot(m_ht[k][k], m_ht[k1][k]); m_c[k] = m_ht[k][k] / mu; m_s[k] = -m_ht[k1][k] / mu; @@ -328,7 +328,7 @@ int matrix_solver_GMRES_t::solve_ilu_gmres (nl_double * RESTRICT givens_mult(m_c[k], m_s[k], m_g[k], m_g[k1]); - rho = nl_math::abs(m_g[k1]); + rho = std::abs(m_g[k1]); itr_used = itr_used + 1; diff --git a/src/lib/netlist/solver/nld_ms_sor.h b/src/lib/netlist/solver/nld_ms_sor.h index 5ccb7af6bc0..a198fa6bf57 100644 --- a/src/lib/netlist/solver/nld_ms_sor.h +++ b/src/lib/netlist/solver/nld_ms_sor.h @@ -66,7 +66,7 @@ int matrix_solver_SOR_t::vsolve_non_dynamic(const bool newton_ra * * and estimate using * - * omega = 2.0 / (1.0 + nl_math::sqrt(1-rho)) + * omega = 2.0 / (1.0 + std::sqrt(1-rho)) */ const nl_double ws = this->m_params.m_sor; @@ -104,7 +104,7 @@ int matrix_solver_SOR_t::vsolve_non_dynamic(const bool newton_ra if (USE_GABS) { for (unsigned i = 0; i < term_count; i++) - gabs_t = gabs_t + nl_math::abs(go[i]); + gabs_t = gabs_t + std::abs(go[i]); gabs_t *= NL_FCONST(0.5); // derived by try and error if (gabs_t <= gtot_t) @@ -149,7 +149,7 @@ int matrix_solver_SOR_t::vsolve_non_dynamic(const bool newton_ra const nl_double new_val = new_V[k] * one_m_w[k] + (Idrive + RHS[k]) * w[k]; - err = nl_math::max(nl_math::abs(new_val - new_V[k]), err); + err = std::max(std::abs(new_val - new_V[k]), err); new_V[k] = new_val; } diff --git a/src/lib/netlist/solver/nld_ms_sor_mat.h b/src/lib/netlist/solver/nld_ms_sor_mat.h index e828d1a6c31..8fa871d83f4 100644 --- a/src/lib/netlist/solver/nld_ms_sor_mat.h +++ b/src/lib/netlist/solver/nld_ms_sor_mat.h @@ -108,7 +108,7 @@ nl_double matrix_solver_SOR_mat_t::vsolve() // FIXME: used to be 1e90, but this would not be compatible with float if (sqo > NL_FCONST(1e-20)) - m_lp_fact = nl_math::min(nl_math::sqrt(sq/sqo), (nl_double) 2.0); + m_lp_fact = std::min(std::sqrt(sq/sqo), (nl_double) 2.0); else m_lp_fact = NL_FCONST(0.0); } @@ -149,16 +149,16 @@ int matrix_solver_SOR_mat_t::vsolve_non_dynamic(const bool newto for (int k = 0; k < iN; k++) { #if 0 - nl_double akk = nl_math::abs(this->m_A[k][k]); + nl_double akk = std::abs(this->m_A[k][k]); if ( akk > lambdaN) lambdaN = akk; if (akk < lambda1) lambda1 = akk; #else - nl_double akk = nl_math::abs(this->m_A[k][k]); + nl_double akk = std::abs(this->m_A[k][k]); nl_double s = 0.0; for (int i=0; im_A[k][i]); + s = s + std::abs(this->m_A[k][i]); akk = s / akk - 1.0; if ( akk > lambdaN) lambdaN = akk; @@ -192,7 +192,7 @@ int matrix_solver_SOR_mat_t::vsolve_non_dynamic(const bool newto Idrive = Idrive + this->A(k,p[i]) * new_v[p[i]]; const nl_double delta = m_omega * (this->RHS(k) - Idrive) / this->A(k,k); - cerr = nl_math::max(cerr, nl_math::abs(delta)); + cerr = std::max(cerr, std::abs(delta)); new_v[k] += delta; } diff --git a/src/lib/netlist/solver/nld_ms_w.h b/src/lib/netlist/solver/nld_ms_w.h index ae4d18f36f7..19c84ef80bc 100644 --- a/src/lib/netlist/solver/nld_ms_w.h +++ b/src/lib/netlist/solver/nld_ms_w.h @@ -360,8 +360,8 @@ int matrix_solver_w_t::solve_non_dynamic(ATTR_UNUSED const bool { tmp += A(i,j) * new_V[j]; } - if (nl_math::abs(tmp-RHS(i)) > 1e-6) - printf("%s failed on row %d: %f RHS: %f\n", this->name().cstr(), i, nl_math::abs(tmp-RHS(i)), RHS(i)); + if (std::abs(tmp-RHS(i)) > 1e-6) + printf("%s failed on row %d: %f RHS: %f\n", this->name().cstr(), i, std::abs(tmp-RHS(i)), RHS(i)); } if (newton_raphson) { diff --git a/src/lib/netlist/solver/nld_solver.cpp b/src/lib/netlist/solver/nld_solver.cpp index 5cfa8b9a2e9..0a9d6360dc8 100644 --- a/src/lib/netlist/solver/nld_solver.cpp +++ b/src/lib/netlist/solver/nld_solver.cpp @@ -37,6 +37,7 @@ #include "omp.h" #endif +#include "plib/putil.h" #include "nld_solver.h" #include "nld_matrix_solver.h" @@ -520,8 +521,8 @@ netlist_time matrix_solver_t::compute_next_timestep() t->m_h_n_m_1 = hn; t->m_DD_n_m_1 = DD_n; - if (nl_math::abs(DD2) > NL_FCONST(1e-30)) // avoid div-by-zero - new_net_timestep = nl_math::sqrt(m_params.m_lte / nl_math::abs(NL_FCONST(0.5)*DD2)); + if (std::abs(DD2) > NL_FCONST(1e-30)) // avoid div-by-zero + new_net_timestep = std::sqrt(m_params.m_lte / std::abs(NL_FCONST(0.5)*DD2)); else new_net_timestep = m_params.m_max_timestep; @@ -722,7 +723,7 @@ void NETLIB_NAME(solver)::post_start() } // Override log statistics - pstring p = nl_util::environment("NL_STATS"); + pstring p = plib::util::environment("NL_STATS"); if (p != "") m_params.m_log_stats = (bool) p.as_long(); else diff --git a/src/lib/netlist/solver/vector_base.h b/src/lib/netlist/solver/vector_base.h index b721596e44d..3f0c53c8ade 100644 --- a/src/lib/netlist/solver/vector_base.h +++ b/src/lib/netlist/solver/vector_base.h @@ -103,7 +103,7 @@ inline double vec_maxabs(const std::size_t & n, const double * RESTRICT v) { double ret = 0.0; for ( std::size_t i = 0; i < n; i++ ) - ret = nl_math::max(ret, nl_math::abs(v[i])); + ret = std::max(ret, std::abs(v[i])); return ret; } From b3f6072cfddb8d012f7065587330d94ad846c9b4 Mon Sep 17 00:00:00 2001 From: couriersud Date: Tue, 7 Jun 2016 19:31:59 +0200 Subject: [PATCH 44/44] Fix standalone build. Refactor ptypes.h. (nw) --- src/lib/netlist/build/makefile | 7 +- src/lib/netlist/nl_base.cpp | 2 + src/lib/netlist/nl_factory.cpp | 1 + src/lib/netlist/nl_factory.h | 1 + src/lib/netlist/plib/plists.h | 69 ------------------ src/lib/netlist/plib/poptions.h | 3 +- src/lib/netlist/plib/pparser.h | 5 +- src/lib/netlist/plib/ptypes.h | 68 +++--------------- src/lib/netlist/plib/putil.cpp | 122 +++++++++++++++++++++++++++++++- src/lib/netlist/plib/putil.h | 13 ++++ 10 files changed, 155 insertions(+), 136 deletions(-) diff --git a/src/lib/netlist/build/makefile b/src/lib/netlist/build/makefile index af65492711c..c1729cc0c39 100644 --- a/src/lib/netlist/build/makefile +++ b/src/lib/netlist/build/makefile @@ -14,7 +14,7 @@ SRC = .. #-fuse-ld=gold -Wpedantic -march=native -march=native -# LTO = -flto=4 -fuse-linker-plugin -flto-partition=balanced -Wodr +LTO = -flto=4 -fuse-linker-plugin -flto-partition=balanced -Wodr CDEFS = -DPSTANDALONE=1 -DPTR64=1 #-Werror @@ -49,11 +49,12 @@ OBJS = $(POBJS) $(NLOBJS) POBJS := \ $(POBJ)/pstring.o \ $(POBJ)/palloc.o \ + $(POBJ)/pdynlib.o \ + $(POBJ)/pfmtlog.o \ $(POBJ)/pparser.o \ $(POBJ)/pstate.o \ $(POBJ)/pstream.o \ - $(POBJ)/pfmtlog.o \ - $(POBJ)/pdynlib.o \ + $(POBJ)/putil.o \ NLOBJS := \ $(NLOBJ)/nl_base.o \ diff --git a/src/lib/netlist/nl_base.cpp b/src/lib/netlist/nl_base.cpp index b39a41cdcaa..6c1df62290d 100644 --- a/src/lib/netlist/nl_base.cpp +++ b/src/lib/netlist/nl_base.cpp @@ -5,6 +5,8 @@ * */ +#include + #include "solver/nld_matrix_solver.h" #include "solver/nld_solver.h" diff --git a/src/lib/netlist/nl_factory.cpp b/src/lib/netlist/nl_factory.cpp index 6d9d8e9bfd5..43f83b39374 100644 --- a/src/lib/netlist/nl_factory.cpp +++ b/src/lib/netlist/nl_factory.cpp @@ -10,6 +10,7 @@ #include "nl_factory.h" #include "nl_setup.h" +#include "plib/putil.h" namespace netlist { diff --git a/src/lib/netlist/nl_factory.h b/src/lib/netlist/nl_factory.h index d1bd0b6f728..780408cd285 100644 --- a/src/lib/netlist/nl_factory.h +++ b/src/lib/netlist/nl_factory.h @@ -13,6 +13,7 @@ #include "nl_config.h" #include "plib/plists.h" +#include "plib/putil.h" #include "nl_base.h" #define NETLIB_DEVICE_IMPL(chip) factory_creator_ptr_t decl_ ## chip = factory_creator_t< NETLIB_NAME(chip) >; diff --git a/src/lib/netlist/plib/plists.h b/src/lib/netlist/plib/plists.h index 93d6be60f07..be36dd8fb2d 100644 --- a/src/lib/netlist/plib/plists.h +++ b/src/lib/netlist/plib/plists.h @@ -190,75 +190,6 @@ public: LC *m_head; }; -// ---------------------------------------------------------------------------------------- -// string list -// ---------------------------------------------------------------------------------------- - -class pstring_vector_t : public pvector_t -{ -public: - pstring_vector_t() : pvector_t() { } - - pstring_vector_t(const pstring &str, const pstring &onstr, bool ignore_empty = false) - : pvector_t() - { - int p = 0; - int pn; - - pn = str.find(onstr, p); - while (pn>=0) - { - pstring t = str.substr(p, pn - p); - if (!ignore_empty || t.len() != 0) - this->push_back(t); - p = pn + onstr.len(); - pn = str.find(onstr, p); - } - if (p < (int) str.len()) - { - pstring t = str.substr(p); - if (!ignore_empty || t.len() != 0) - this->push_back(t); - } - } - - pstring_vector_t(const pstring &str, const pstring_vector_t &onstrl) - : pvector_t() - { - pstring col = ""; - - unsigned i = 0; - while (i=0) - { - if (col != "") - this->push_back(col); - - col = ""; - this->push_back(onstrl[p]); - i += onstrl[p].blen(); - } - else - { - pstring::traits::code_t c = pstring::traits::code(str.cstr() + i); - col += c; - i+=pstring::traits::codelen(c); - } - } - if (col != "") - this->push_back(col); - } -}; // ---------------------------------------------------------------------------------------- // hashmap list diff --git a/src/lib/netlist/plib/poptions.h b/src/lib/netlist/plib/poptions.h index dbcf3ba30d4..8a66000053c 100644 --- a/src/lib/netlist/plib/poptions.h +++ b/src/lib/netlist/plib/poptions.h @@ -14,6 +14,7 @@ #include "pstring.h" #include "plists.h" +#include "putil.h" namespace plib { @@ -82,7 +83,7 @@ public: pstring operator ()() { return m_val; } private: pstring m_val; - pstring_vector_t m_limit; + plib::pstring_vector_t m_limit; }; class option_bool : public option diff --git a/src/lib/netlist/plib/pparser.h b/src/lib/netlist/plib/pparser.h index dd08d781313..610f524b5e3 100644 --- a/src/lib/netlist/plib/pparser.h +++ b/src/lib/netlist/plib/pparser.h @@ -11,6 +11,7 @@ #include "pconfig.h" #include "pstring.h" #include "plists.h" +#include "putil.h" #include "pstream.h" namespace plib { @@ -176,7 +177,7 @@ protected: postream &process_i(pistream &istrm, postream &ostrm); - double expr(const pstring_vector_t &sexpr, std::size_t &start, int prio); + double expr(const plib::pstring_vector_t &sexpr, std::size_t &start, int prio); define_t *get_define(const pstring &name); @@ -189,7 +190,7 @@ private: pstring process_line(const pstring &line); hashmap_t m_defines; - pstring_vector_t m_expr_sep; + plib::pstring_vector_t m_expr_sep; //pstringbuffer m_ret; UINT32 m_ifflag; // 31 if levels diff --git a/src/lib/netlist/plib/ptypes.h b/src/lib/netlist/plib/ptypes.h index 06246846d0e..af8e16a2253 100644 --- a/src/lib/netlist/plib/ptypes.h +++ b/src/lib/netlist/plib/ptypes.h @@ -13,68 +13,16 @@ namespace plib { -//============================================================ -// penum - strongly typed enumeration -//============================================================ + //============================================================ + // penum - strongly typed enumeration + //============================================================ -struct enum_base -{ -protected: - static int from_string_int(const char *str, const char *x) + struct enum_base { - int cnt = 0; - const char *cur = str; - int lx = strlen(x); - while (*str) - { - if (*str == ',') - { - int l = str-cur; - if (l == lx) - if (strncmp(cur, x, lx) == 0) - return cnt; - } - else if (*str == ' ') - { - cur = str + 1; - cnt++; - } - str++; - } - int l = str-cur; - if (l == lx) - if (strncmp(cur, x, lx) == 0) - return cnt; - return -1; - } - static pstring nthstr(int n, const char *str) - { - char buf[64]; - char *bufp = buf; - int cur = 0; - while (*str) - { - if (cur == n) - { - if (*str == ',') - { - *bufp = 0; - return pstring(buf); - } - else if (*str != ' ') - *bufp++ = *str; - } - else - { - if (*str == ',') - cur++; - } - str++; - } - *bufp = 0; - return pstring(buf); - } -}; + protected: + static int from_string_int(const char *str, const char *x); + static pstring nthstr(int n, const char *str); + }; } diff --git a/src/lib/netlist/plib/putil.cpp b/src/lib/netlist/plib/putil.cpp index 3e77cdf19c0..3e5cecc0081 100644 --- a/src/lib/netlist/plib/putil.cpp +++ b/src/lib/netlist/plib/putil.cpp @@ -7,6 +7,7 @@ #include #include "plib/putil.h" +#include "plib/ptypes.h" #include "plib/plists.h" namespace plib @@ -38,4 +39,123 @@ namespace plib return pstring(getenv(var.cstr())); } } -} + + pstring_vector_t::pstring_vector_t(const pstring &str, const pstring &onstr, bool ignore_empty) + : pvector_t() + { + int p = 0; + int pn; + + pn = str.find(onstr, p); + while (pn>=0) + { + pstring t = str.substr(p, pn - p); + if (!ignore_empty || t.len() != 0) + this->push_back(t); + p = pn + onstr.len(); + pn = str.find(onstr, p); + } + if (p < (int) str.len()) + { + pstring t = str.substr(p); + if (!ignore_empty || t.len() != 0) + this->push_back(t); + } + } + + pstring_vector_t::pstring_vector_t(const pstring &str, const pstring_vector_t &onstrl) + : pvector_t() + { + pstring col = ""; + + unsigned i = 0; + while (i=0) + { + if (col != "") + this->push_back(col); + + col = ""; + this->push_back(onstrl[p]); + i += onstrl[p].blen(); + } + else + { + pstring::traits::code_t c = pstring::traits::code(str.cstr() + i); + col += c; + i+=pstring::traits::codelen(c); + } + } + if (col != "") + this->push_back(col); + } + + + int enum_base::from_string_int(const char *str, const char *x) + { + int cnt = 0; + const char *cur = str; + int lx = strlen(x); + while (*str) + { + if (*str == ',') + { + int l = str-cur; + if (l == lx) + if (strncmp(cur, x, lx) == 0) + return cnt; + } + else if (*str == ' ') + { + cur = str + 1; + cnt++; + } + str++; + } + int l = str-cur; + if (l == lx) + if (strncmp(cur, x, lx) == 0) + return cnt; + return -1; + } + pstring enum_base::nthstr(int n, const char *str) + { + char buf[64]; + char *bufp = buf; + int cur = 0; + while (*str) + { + if (cur == n) + { + if (*str == ',') + { + *bufp = 0; + return pstring(buf); + } + else if (*str != ' ') + *bufp++ = *str; + } + else + { + if (*str == ',') + cur++; + } + str++; + } + *bufp = 0; + return pstring(buf); + } +} // namespace plib + + + diff --git a/src/lib/netlist/plib/putil.h b/src/lib/netlist/plib/putil.h index 59aaee9d557..db5510178c0 100644 --- a/src/lib/netlist/plib/putil.h +++ b/src/lib/netlist/plib/putil.h @@ -20,6 +20,19 @@ namespace plib const pstring buildpath(std::initializer_list list ); const pstring environment(const pstring &var, const pstring &default_val = ""); } + + // ---------------------------------------------------------------------------------------- + // string list + // ---------------------------------------------------------------------------------------- + + class pstring_vector_t : public pvector_t + { + public: + pstring_vector_t() : pvector_t() { } + pstring_vector_t(const pstring &str, const pstring &onstr, bool ignore_empty = false); + pstring_vector_t(const pstring &str, const pstring_vector_t &onstrl); + }; + } #endif /* P_UTIL_H_ */