diff options
Diffstat (limited to 'src/lib/netlist/devices/nld_9316.cpp')
-rw-r--r-- | src/lib/netlist/devices/nld_9316.cpp | 83 |
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)); } |