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.cpp138
1 files changed, 64 insertions, 74 deletions
diff --git a/src/lib/netlist/devices/nld_9316.cpp b/src/lib/netlist/devices/nld_9316.cpp
index 7c478fd4b05..2b17eabb3ec 100644
--- a/src/lib/netlist/devices/nld_9316.cpp
+++ b/src/lib/netlist/devices/nld_9316.cpp
@@ -6,7 +6,7 @@
*/
#include "nld_9316.h"
-#include "../nl_base.h"
+#include "netlist/nl_base.h"
namespace netlist
{
@@ -20,31 +20,72 @@ namespace netlist
NETLIB_CONSTRUCTOR(9316)
, m_CLK(*this, "CLK", NETLIB_DELEGATE(9316, clk))
, m_ENT(*this, "ENT")
+ , m_RC(*this, "RC")
, m_LOADQ(*this, "LOADQ")
- , m_cnt(*this, "m_cnt", 0)
, 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))
- , m_D(*this, "D", NETLIB_DELEGATE(9316, noop))
+ , m_A(*this, "A", NETLIB_DELEGATE(9316, abcd))
+ , m_B(*this, "B", NETLIB_DELEGATE(9316, abcd))
+ , m_C(*this, "C", NETLIB_DELEGATE(9316, abcd))
+ , m_D(*this, "D", NETLIB_DELEGATE(9316, abcd))
, m_Q(*this, {{ "QA", "QB", "QC", "QD" }})
- , m_RC(*this, "RC")
+ , m_cnt(*this, "m_cnt", 0)
+ , m_abcd(*this, "m_abcd", 0)
+ , m_loadq(*this, "m_loadq", 0)
+ , m_ent(*this, "m_ent", 0)
{
}
private:
- NETLIB_RESETI();
- NETLIB_UPDATEI();
- NETLIB_HANDLERI(clk);
- NETLIB_HANDLERI(noop) { }
+ NETLIB_RESETI()
+ {
+ m_CLK.set_state(logic_t::STATE_INP_LH);
+ m_cnt = 0;
+ m_abcd = 0;
+ }
- logic_input_t m_CLK;
+ NETLIB_UPDATEI()
+ {
+ const auto CLRQ(m_CLRQ());
+ m_ent = m_ENT();
+ m_loadq = m_LOADQ();
+ if (((m_loadq ^ 1) || (m_ent && m_ENP())) && CLRQ)
+ {
+ m_CLK.activate_lh();
+ }
+ else
+ {
+ m_CLK.inactivate();
+ if (!CLRQ && (m_cnt>0))
+ {
+ m_cnt = 0;
+ update_outputs_all(m_cnt, NLTIME_FROM_NS(36));
+ }
+ }
+ m_RC.push(m_ent && (m_cnt == MAXCNT), NLTIME_FROM_NS(27));
+ }
+
+
+ NETLIB_HANDLERI(clk)
+ {
+ auto cnt = (m_loadq ? m_cnt + 1 : m_abcd) & MAXCNT;
+ m_RC.push(m_ent && (cnt == MAXCNT), NLTIME_FROM_NS(27));
+ update_outputs_all(cnt, NLTIME_FROM_NS(20));
+ m_cnt = cnt;
+ }
+
+ NETLIB_HANDLERI(abcd)
+ {
+ m_abcd = static_cast<uint8_t>((m_D() << 3) | (m_C() << 2) | (m_B() << 1) | (m_A() << 0));
+ }
+
+ logic_input_t m_CLK;
logic_input_t m_ENT;
- logic_input_t m_LOADQ;
- state_var<unsigned> m_cnt;
+ logic_output_t m_RC;
+
+ logic_input_t m_LOADQ;
logic_input_t m_ENP;
logic_input_t m_CLRQ;
@@ -55,12 +96,15 @@ namespace netlist
logic_input_t m_D;
object_array_t<logic_output_t, 4> m_Q;
- logic_output_t m_RC;
+ /* counter state */
+ state_var<unsigned> m_cnt;
+ /* cached pins */
+ state_var_u8 m_abcd;
+ state_var_sig m_loadq;
+ state_var_sig m_ent;
- private:
- //inline void update_outputs_all(const unsigned &cnt, const netlist_time &out_delay) noexcept
- inline void update_outputs_all(const unsigned &cnt, const netlist_time &out_delay) noexcept
+ void update_outputs_all(unsigned cnt, netlist_time out_delay) noexcept
{
m_Q[0].push((cnt >> 0) & 1, out_delay);
m_Q[1].push((cnt >> 1) & 1, out_delay);
@@ -93,63 +137,9 @@ namespace netlist
}
};
- NETLIB_RESET(9316)
- {
- m_CLK.set_state(logic_t::STATE_INP_LH);
- m_cnt = 0;
- }
-
- NETLIB_HANDLER(9316, clk)
- {
- if (m_LOADQ())
- {
- ++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));
- update_outputs_all(m_cnt, NLTIME_FROM_NS(22));
- }
- }
-
- NETLIB_UPDATE(9316)
- {
- const netlist_sig_t CLRQ(m_CLRQ());
- const netlist_sig_t ENT(m_ENT());
-
- if (((m_LOADQ() ^ 1) || (ENT && m_ENP())) && CLRQ)
- {
- m_CLK.activate_lh();
- }
- else
- {
- m_CLK.inactivate();
- if (!CLRQ && (m_cnt>0))
- {
- m_cnt = 0;
- update_outputs_all(m_cnt, NLTIME_FROM_NS(36));
- }
- }
- m_RC.push(ENT && (m_cnt == MAXCNT), NLTIME_FROM_NS(27));
- }
-
- NETLIB_DEVICE_IMPL(9316)
- NETLIB_DEVICE_IMPL(9316_dip)
+ NETLIB_DEVICE_IMPL(9316, "TTL_9316", "+CLK,+ENP,+ENT,+CLRQ,+LOADQ,+A,+B,+C,+D")
+ NETLIB_DEVICE_IMPL(9316_dip, "TTL_9316_DIP", "")
} //namespace devices
} // namespace netlist