summaryrefslogtreecommitdiffstatshomepage
path: root/src/lib/netlist/devices/nld_9316.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/netlist/devices/nld_9316.cpp')
-rw-r--r--src/lib/netlist/devices/nld_9316.cpp83
1 files changed, 47 insertions, 36 deletions
diff --git a/src/lib/netlist/devices/nld_9316.cpp b/src/lib/netlist/devices/nld_9316.cpp
index 61ae427a2a8..58085f04c77 100644
--- a/src/lib/netlist/devices/nld_9316.cpp
+++ b/src/lib/netlist/devices/nld_9316.cpp
@@ -8,22 +8,22 @@
#include "nld_9316.h"
#include "../nl_base.h"
-#define MAXCNT 15
-
namespace netlist
{
namespace devices
{
+ static constexpr const unsigned MAXCNT = 15;
+
NETLIB_OBJECT(9316)
{
NETLIB_CONSTRUCTOR(9316)
- , m_CLK(*this, "CLK", NETLIB_DELEGATE(9316, clk))
, m_cnt(*this, "m_cnt", 0)
- , m_ENP(*this, "ENP")
+ , m_CLK(*this, "CLK", NETLIB_DELEGATE(9316, clk))
, m_ENT(*this, "ENT")
- , m_CLRQ(*this, "CLRQ")
, m_LOADQ(*this, "LOADQ")
+ , m_ENP(*this, "ENP")
+ , m_CLRQ(*this, "CLRQ")
, m_A(*this, "A", NETLIB_DELEGATE(9316, noop))
, m_B(*this, "B", NETLIB_DELEGATE(9316, noop))
, m_C(*this, "C", NETLIB_DELEGATE(9316, noop))
@@ -36,20 +36,20 @@ namespace netlist
{
}
+ private:
NETLIB_RESETI();
NETLIB_UPDATEI();
NETLIB_HANDLERI(clk);
NETLIB_HANDLERI(noop) { }
- protected:
+ state_var<unsigned> m_cnt;
logic_input_t m_CLK;
- state_var<unsigned> m_cnt;
+ logic_input_t m_ENT;
+ logic_input_t m_LOADQ;
logic_input_t m_ENP;
- logic_input_t m_ENT;
logic_input_t m_CLRQ;
- logic_input_t m_LOADQ;
logic_input_t m_A;
logic_input_t m_B;
@@ -64,7 +64,7 @@ namespace netlist
private:
- void update_outputs_all(const unsigned &cnt, const netlist_time &out_delay)
+ void update_outputs_all(const unsigned &cnt, const netlist_time &out_delay) noexcept
{
m_QA.push((cnt >> 0) & 1, out_delay);
m_QB.push((cnt >> 1) & 1, out_delay);
@@ -77,22 +77,22 @@ namespace netlist
{
NETLIB_CONSTRUCTOR_DERIVED(9316_dip, 9316)
{
- register_subalias("1", m_CLRQ);
- register_subalias("2", m_CLK);
- register_subalias("3", m_A);
- register_subalias("4", m_B);
- register_subalias("5", m_C);
- register_subalias("6", m_D);
- register_subalias("7", m_ENP);
- // register_subalias("8", ); -. GND
-
- register_subalias("9", m_LOADQ);
- register_subalias("10", m_ENT);
- register_subalias("11", m_QD);
- register_subalias("12", m_QC);
- register_subalias("13", m_QB);
- register_subalias("14", m_QA);
- register_subalias("15", m_RC);
+ register_subalias("1", "CLRQ");
+ register_subalias("2", "CLK");
+ register_subalias("3", "A");
+ register_subalias("4", "B");
+ register_subalias("5", "C");
+ register_subalias("6", "D");
+ register_subalias("7", "ENP");
+ // register_subalias("8", "); -. GND
+
+ register_subalias("9", "LOADQ");
+ register_subalias("10", "ENT");
+ register_subalias("11", "QD");
+ register_subalias("12", "QC");
+ register_subalias("13", "QB");
+ register_subalias("14", "QA");
+ register_subalias("15", "RC");
// register_subalias("16", ); -. VCC
}
};
@@ -107,37 +107,48 @@ namespace netlist
{
if (m_LOADQ())
{
- m_cnt = (m_cnt < MAXCNT ? m_cnt + 1 : 0);
- update_outputs_all(m_cnt, NLTIME_FROM_NS(20));
- m_RC.push(m_ENT() & (m_cnt == MAXCNT), NLTIME_FROM_NS(27));
+ ++m_cnt &= MAXCNT;
+ //m_RC.push(m_ENT() && (m_cnt == MAXCNT), NLTIME_FROM_NS(27));
+ if (m_cnt == MAXCNT)
+ {
+ m_RC.push(m_ENT(), NLTIME_FROM_NS(27));
+ update_outputs_all(MAXCNT, NLTIME_FROM_NS(20));
+ }
+ else if (m_cnt == 0)
+ {
+ m_RC.push(0, NLTIME_FROM_NS(27));
+ update_outputs_all(0, NLTIME_FROM_NS(20));
+ }
+ else
+ update_outputs_all(m_cnt, NLTIME_FROM_NS(20));
}
else
{
m_cnt = (m_D() << 3) | (m_C() << 2) | (m_B() << 1) | (m_A() << 0);
- m_RC.push(m_ENT() & (m_cnt == MAXCNT), NLTIME_FROM_NS(27));
+ m_RC.push(m_ENT() && (m_cnt == MAXCNT), NLTIME_FROM_NS(27));
update_outputs_all(m_cnt, NLTIME_FROM_NS(22));
}
}
NETLIB_UPDATE(9316)
{
- const netlist_sig_t clrq = m_CLRQ();
+ const netlist_sig_t CLRQ(m_CLRQ());
+ const netlist_sig_t ENT(m_ENT());
- if (((m_LOADQ() ^ 1) | (m_ENT() & m_ENP())) & clrq)
+ if (((m_LOADQ() ^ 1) || (ENT && m_ENP())) && CLRQ)
{
m_CLK.activate_lh();
- m_RC.push(m_ENT() & (m_cnt == MAXCNT), NLTIME_FROM_NS(27));
}
else
{
m_CLK.inactivate();
- if (!clrq && (m_cnt>0))
+ if (!CLRQ && (m_cnt>0))
{
- update_outputs_all(0, NLTIME_FROM_NS(36));
m_cnt = 0;
+ update_outputs_all(m_cnt, NLTIME_FROM_NS(36));
}
- m_RC.push(m_ENT() & (m_cnt == MAXCNT), NLTIME_FROM_NS(27));
}
+ m_RC.push(ENT && (m_cnt == MAXCNT), NLTIME_FROM_NS(27));
}