summaryrefslogtreecommitdiffstatshomepage
path: root/src/lib/netlist/devices/nlid_truthtable.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/netlist/devices/nlid_truthtable.h')
-rw-r--r--src/lib/netlist/devices/nlid_truthtable.h85
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