summaryrefslogtreecommitdiffstatshomepage
path: root/src/lib/netlist/devices/nld_truthtable.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/netlist/devices/nld_truthtable.h')
-rw-r--r--src/lib/netlist/devices/nld_truthtable.h78
1 files changed, 24 insertions, 54 deletions
diff --git a/src/lib/netlist/devices/nld_truthtable.h b/src/lib/netlist/devices/nld_truthtable.h
index d30ff03704c..157aea166fc 100644
--- a/src/lib/netlist/devices/nld_truthtable.h
+++ b/src/lib/netlist/devices/nld_truthtable.h
@@ -13,39 +13,22 @@
#include <new>
#include <cstdint>
-#include "nl_base.h"
+#include "nl_setup.h"
#include "nl_factory.h"
#include "plib/plists.h"
-#define NETLIB_TRUTHTABLE(cname, nIN, nOUT, state) \
- class NETLIB_NAME(cname) : public nld_truthtable_t<nIN, nOUT, state> \
+#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, state>(owner, name, nullptr, &m_ttbl, m_desc) { } \
+ NETLIB_NAME(cname)(C &owner, const pstring &name) \
+ : nld_truthtable_t<nIN, nOUT>(owner, name, nullptr, &m_ttbl, m_desc) { } \
private: \
static truthtable_t m_ttbl; \
static const char *m_desc[]; \
}
-#define TRUTHTABLE_START(cname, in, out, has_state, def_params) \
- { \
- auto ttd = netlist::devices::nl_tt_factory_create(in, out, has_state, \
- # cname, # cname, "+" def_params);
-
-#define TT_HEAD(x) \
- ttd->m_desc.push_back(x);
-
-#define TT_LINE(x) \
- ttd->m_desc.push_back(x);
-
-#define TT_FAMILY(x) \
- ttd->m_family = setup.family_from_model(x);
-
-#define TRUTHTABLE_END() \
- setup.factory().register_device(std::move(ttd)); \
- }
namespace netlist
{
@@ -121,11 +104,11 @@ namespace netlist
struct truthtable_desc_t
{
- truthtable_desc_t(int NO, int NI, int has_state, bool *initialized,
+ truthtable_desc_t(int NO, int NI, bool *initialized,
packed_int outs, uint_least8_t *timing, netlist_time *timing_nt)
- : m_NO(NO), m_NI(NI), /*m_has_state(has_state),*/ m_initialized(initialized),
+ : m_NO(NO), m_NI(NI), 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)),
+ m_num_bits(m_NI),
m_size(1 << (m_num_bits))
{
}
@@ -154,15 +137,15 @@ namespace netlist
};
- template<unsigned m_NI, unsigned m_NO, int m_has_state>
+ template<unsigned m_NI, unsigned m_NO>
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));
+ static constexpr int m_num_bits = m_NI;
+ static constexpr int m_size = (1 << (m_num_bits));
struct truthtable_t
{
@@ -180,10 +163,8 @@ namespace netlist
truthtable_t *ttp, const char *desc[])
: device_t(owner, name)
, m_fam(*this, fam)
- , m_last_state(*this, "m_last_state", 0)
, m_ign(*this, "m_ign", 0)
, m_active(*this, "m_active", 1)
- , m_use_deactivate(*this, "USE_DEACTIVATE", true)
, m_ttp(ttp)
{
while (*desc != nullptr && **desc != 0 )
@@ -199,10 +180,8 @@ namespace netlist
truthtable_t *ttp, const plib::pstring_vector_t &desc)
: device_t(owner, name)
, m_fam(*this, fam)
- , m_last_state(*this, "m_last_state", 0)
, m_ign(*this, "m_ign", 0)
, m_active(*this, "m_active", 1)
- , m_use_deactivate(*this, "USE_DEACTIVATE", true)
, m_ttp(ttp)
{
m_desc = desc;
@@ -211,6 +190,8 @@ namespace netlist
void startxx()
{
+ set_hint_deactivate(true);
+
pstring header = m_desc[0];
plib::pstring_vector_t io(header,"|");
@@ -249,8 +230,9 @@ namespace netlist
m_ign = 0;
- truthtable_desc_t desc(m_NO, m_NI, m_has_state,
- &m_ttp->m_initialized, packed_int(m_ttp->m_outs), m_ttp->m_timing, m_ttp->m_timing_nt);
+ truthtable_desc_t desc(m_NO, m_NI, &m_ttp->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
@@ -272,7 +254,6 @@ namespace netlist
for (std::size_t i=0; i<m_NO;i++)
if (this->m_Q[i].net().num_cons()>0)
m_active++;
- m_last_state = 0;
}
NETLIB_UPDATEI()
@@ -283,7 +264,7 @@ namespace netlist
public:
void inc_active() override
{
- if (m_NI > 1 && m_has_state == 0 && m_use_deactivate)
+ if (m_NI > 1)
if (++m_active == 1)
{
process<false>();
@@ -298,7 +279,7 @@ namespace netlist
* can decide for each individual gate whether it is benefitial to
* ignore deactivation.
*/
- if (m_NI > 1 && m_has_state == 0 && m_use_deactivate)
+ if (m_NI > 1)
if (--m_active == 0)
{
for (std::size_t i = 0; i< m_NI; i++)
@@ -322,7 +303,7 @@ namespace netlist
netlist_time mt = netlist_time::zero();
uint_least64_t state = 0;
- if (m_NI > 1 && !m_has_state)
+ if (m_NI > 1)
{
auto ign = m_ign;
if (!doOUT)
@@ -354,9 +335,6 @@ namespace netlist
}
auto nstate = state;
- 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);
@@ -373,10 +351,7 @@ namespace netlist
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)
+ if (m_NI > 1)
{
auto ign(m_ign);
for (std::size_t i = 0; ign != 0; ign >>= 1, i++)
@@ -386,11 +361,9 @@ namespace netlist
}
/* FIXME: check width */
- state_var_u32 m_last_state;
- state_var_u32 m_ign;
- state_var_s32 m_active;
- param_logic_t m_use_deactivate;
- truthtable_t *m_ttp;
+ state_var_u32 m_ign;
+ state_var_s32 m_active;
+ truthtable_t * m_ttp;
plib::pstring_vector_t m_desc;
};
@@ -411,10 +384,7 @@ namespace netlist
const logic_family_desc_t *m_family;
};
- plib::owned_ptr<netlist_base_factory_truthtable_t> nl_tt_factory_create(const unsigned ni, const unsigned no,
- const unsigned has_state,
- const pstring &name, const pstring &classname,
- const pstring &def_param);
+ void tt_factory_create(setup_t &setup, tt_desc &desc);
} //namespace devices
} // namespace netlist