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