diff options
Diffstat (limited to 'src/lib/netlist/devices/nlid_truthtable.h')
-rw-r--r-- | src/lib/netlist/devices/nlid_truthtable.h | 85 |
1 files changed, 46 insertions, 39 deletions
diff --git a/src/lib/netlist/devices/nlid_truthtable.h b/src/lib/netlist/devices/nlid_truthtable.h index 1eeef1a6386..84f49f7c305 100644 --- a/src/lib/netlist/devices/nlid_truthtable.h +++ b/src/lib/netlist/devices/nlid_truthtable.h @@ -14,16 +14,16 @@ #include "../nl_base.h" #include "../plib/putil.h" -#define NETLIB_TRUTHTABLE(cname, nIN, nOUT) \ - class NETLIB_NAME(cname) : public nld_truthtable_t<nIN, nOUT> \ - { \ - public: \ - template <class C> \ - NETLIB_NAME(cname)(C &owner, const pstring &name) \ +#define NETLIB_TRUTHTABLE(cname, nIN, nOUT) \ + class NETLIB_NAME(cname) : public nld_truthtable_t<nIN, nOUT> \ + { \ + public: \ + template <class C> \ + NETLIB_NAME(cname)(C &owner, const pstring &name) \ : nld_truthtable_t<nIN, nOUT>(owner, name, family_TTL(), &m_ttbl, m_desc) { } \ - private: \ - static truthtable_t m_ttbl; \ - static std::vector<pstring> m_desc; \ + private: \ + static truthtable_t m_ttbl; \ + static std::vector<pstring> m_desc; \ } @@ -32,22 +32,31 @@ namespace netlist namespace devices { +#if 0 + template<unsigned bits> struct uint_for_size { typedef uint_least32_t type; }; + template<unsigned bits> + struct need_bytes_for_bits + { + enum { value = 4 }; + }; +#else template<unsigned bits> struct need_bytes_for_bits { enum { value = - bits <= 8 ? 1 : - bits <= 16 ? 2 : - bits <= 32 ? 4 : - 8 + bits <= 8 ? 1 : + bits <= 16 ? 2 : + bits <= 32 ? 4 : + 8 }; }; template<unsigned bits> struct uint_for_size; - template<> struct uint_for_size<1> { typedef uint_least8_t type; }; + template<> struct uint_for_size<1> { typedef uint_least8_t type; }; template<> struct uint_for_size<2> { typedef uint_least16_t type; }; template<> struct uint_for_size<4> { typedef uint_least32_t type; }; template<> struct uint_for_size<8> { typedef uint_least64_t type; }; +#endif template<std::size_t m_NI, std::size_t m_NO> NETLIB_OBJECT(truthtable_t) @@ -74,8 +83,9 @@ namespace netlist }; template <class C> - nld_truthtable_t(C &owner, const pstring &name, const logic_family_desc_t *fam, - truthtable_t *ttp, const std::vector<pstring> &desc) + nld_truthtable_t(C &owner, const pstring &name, + const logic_family_desc_t *fam, + truthtable_t &ttp, const std::vector<pstring> &desc) : device_t(owner, name) , m_fam(*this, fam) , m_ign(*this, "m_ign", 0) @@ -91,10 +101,10 @@ namespace netlist { 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; i<m_NO;i++) - if (this->m_Q[i].has_net() && this->m_Q[i].net().num_cons()>0) + for (auto &i : m_I) + i.activate(); + for (auto &q : m_Q) + if (q.has_net() && q.net().num_cons() > 0) m_active++; } @@ -137,14 +147,14 @@ namespace netlist private: template<bool doOUT> - inline void process() + void process() { - netlist_time mt = netlist_time::zero(); + netlist_time mt(netlist_time::zero()); - type_t nstate = 0; + type_t nstate(0); if (m_NI > 1) { - type_t ign = m_ign; + type_t ign(m_ign); if (!doOUT) for (std::size_t i = 0; i < m_NI; i++) { @@ -166,31 +176,28 @@ namespace netlist if (!doOUT) { nstate |= m_I[0](); - mt = std::max(this->m_I[0].net().time(), mt); + //mt = std::max(this->m_I[0].net().time(), mt); + mt = this->m_I[0].net().time(); } else nstate |= m_I[0](); } - const type_t outstate = m_ttp->m_outs[nstate]; - type_t out = outstate & m_outmask; + const type_t outstate(m_ttp.m_outs[nstate]); + type_t out(outstate & m_outmask); m_ign = outstate >> m_NO; - const std::size_t timebase = nstate * m_NO; + const std::size_t timebase(nstate * m_NO); + const auto *t(&m_ttp.m_timing[timebase]); + const auto *tim = m_ttp.m_timing_nt; if (doOUT) - { - auto *t = &m_ttp->m_timing[timebase]; - for (std::size_t i = 0; i < m_NO; ++i) - m_Q[i].push((out >> i) & 1, m_ttp->m_timing_nt[t[i]]); - } + for (std::size_t i = 0; i < m_NO; out >>= 1, ++i) + m_Q[i].push(out & 1, tim[t[i]]); else - { - auto *t = &m_ttp->m_timing[timebase]; - for (std::size_t i = 0; i < m_NO; ++i) - m_Q[i].set_Q_time((out >> i) & 1, mt + m_ttp->m_timing_nt[t[i]]); - } + for (std::size_t i = 0; i < m_NO; out >>= 1, ++i) + m_Q[i].set_Q_time(out & 1, mt + tim[t[i]]); if (m_NI > 1) { @@ -204,7 +211,7 @@ namespace netlist /* FIXME: check width */ state_var<type_t> m_ign; state_var_s32 m_active; - truthtable_t * m_ttp; + const truthtable_t &m_ttp; }; class netlist_base_factory_truthtable_t : public factory::element_t |