diff options
Diffstat (limited to 'src/lib/netlist/devices/nld_7485.cpp')
-rw-r--r-- | src/lib/netlist/devices/nld_7485.cpp | 143 |
1 files changed, 63 insertions, 80 deletions
diff --git a/src/lib/netlist/devices/nld_7485.cpp b/src/lib/netlist/devices/nld_7485.cpp index 7cf166a807d..6d53854b4be 100644 --- a/src/lib/netlist/devices/nld_7485.cpp +++ b/src/lib/netlist/devices/nld_7485.cpp @@ -3,24 +3,37 @@ /* * nld_7485.cpp * + * FIXME: Truth table candidate + * + * DM7485: 4-bit Magnitude Comparators + * + * +------------+ + * B3 |1 ++ 16| VCC + * LTIN |2 15| A3 + * EQIN |3 14| B2 + * GTIN |4 7485 13| A2 + * GTOUT |5 12| A1 + * EQOUT |6 11| B1 + * LTOUT |7 10| A0 + * GND |8 9| B0 + * +------------+ + * + * Naming convention attempts to follow Texas Instruments datasheet + * */ -#include "nld_7485.h" -#include "netlist/nl_base.h" -#include "nlid_system.h" +#include "nl_base.h" + +namespace netlist::devices { -namespace netlist -{ - namespace devices - { NETLIB_OBJECT(7485) { NETLIB_CONSTRUCTOR(7485) - , m_A(*this, {{"A0", "A1", "A2", "A3"}}) - , m_B(*this, {{"B0", "B1", "B2", "B3"}}) - , m_LTIN(*this, "LTIN") - , m_EQIN(*this, "EQIN") - , m_GTIN(*this, "GTIN") + , m_A(*this, {"A0", "A1", "A2", "A3"}, NETLIB_DELEGATE(inputs)) + , m_B(*this, {"B0", "B1", "B2", "B3"}, NETLIB_DELEGATE(inputs)) + , m_LTIN(*this, "LTIN", NETLIB_DELEGATE(inputs)) + , m_EQIN(*this, "EQIN", NETLIB_DELEGATE(inputs)) + , m_GTIN(*this, "GTIN", NETLIB_DELEGATE(inputs)) , m_LTOUT(*this, "LTOUT") , m_EQOUT(*this, "EQOUT") , m_GTOUT(*this, "GTOUT") @@ -28,11 +41,45 @@ namespace netlist { } - NETLIB_UPDATEI(); + private: + // FIXME: Timing + NETLIB_HANDLERI(inputs) + { + for (std::size_t i = 4; i-- > 0; ) + { + if (m_A[i]() > m_B[i]()) + { + update_outputs(1, 0, 0); + return; + } + + if (m_A[i]() < m_B[i]()) + { + update_outputs(0, 1, 0); + return; + } + } - void update_outputs(unsigned gt, unsigned lt, unsigned eq); + // must be == if we got here + if (m_EQIN()) + update_outputs(0, 0, 1); + else if (m_GTIN() && m_LTIN()) + update_outputs(0, 0, 0); + else if (m_GTIN()) + update_outputs(1, 0, 0); + else if (m_LTIN()) + update_outputs(0, 1, 0); + else + update_outputs(1, 1, 0); + } + + void update_outputs(unsigned gt, unsigned lt, unsigned eq) + { + m_GTOUT.push(gt, NLTIME_FROM_NS(23)); + m_LTOUT.push(lt, NLTIME_FROM_NS(23)); + m_EQOUT.push(eq, NLTIME_FROM_NS(23)); + } - protected: object_array_t<logic_input_t, 4> m_A; object_array_t<logic_input_t, 4> m_B; logic_input_t m_LTIN; @@ -44,70 +91,6 @@ namespace netlist nld_power_pins m_power_pins; }; - NETLIB_OBJECT_DERIVED(7485_dip, 7485) - { - NETLIB_CONSTRUCTOR_DERIVED(7485_dip, 7485) - { - register_subalias("1", m_B[3]); - register_subalias("2", m_LTIN); - register_subalias("3", m_EQIN); - register_subalias("4", m_GTIN); - register_subalias("5", m_GTOUT); - register_subalias("6", m_EQOUT); - register_subalias("7", m_LTOUT); - register_subalias("8", "GND"); - - register_subalias("9", m_B[0]); - register_subalias("10", m_A[0]); - register_subalias("11", m_B[1]); - register_subalias("12", m_A[1]); - register_subalias("13", m_A[2]); - register_subalias("14", m_B[2]); - register_subalias("15", m_A[3]); - register_subalias("16", "VCC"); - - } - }; - - void NETLIB_NAME(7485)::update_outputs(unsigned gt, unsigned lt, unsigned eq) - { - m_GTOUT.push(gt, NLTIME_FROM_NS(23)); - m_LTOUT.push(lt, NLTIME_FROM_NS(23)); - m_EQOUT.push(eq, NLTIME_FROM_NS(23)); - } - - // FIXME: Timing - NETLIB_UPDATE(7485) - { - for (std::size_t i = 4; i-- > 0; ) - { - if (m_A[i]() > m_B[i]()) - { - update_outputs(1, 0, 0); - return; - } - else if (m_A[i]() < m_B[i]()) - { - update_outputs(0, 1, 0); - return; - } - } - - // must be == if we got here - if (m_EQIN()) - update_outputs(0, 0, 1); - else if (m_GTIN() && m_LTIN()) - update_outputs(0, 0, 0); - else if (m_GTIN()) - update_outputs(1, 0, 0); - else if (m_LTIN()) - update_outputs(0, 1, 0); - else - update_outputs(1, 1, 0); - } - NETLIB_DEVICE_IMPL(7485, "TTL_7485", "+A0,+A1,+A2,+A3,+B0,+B1,+B2,+B3,+LTIN,+EQIN,+GTIN,@VCC,@GND") - NETLIB_DEVICE_IMPL(7485_dip, "TTL_7485_DIP", "") - } //namespace devices -} // namespace netlist +} // namespace netlist::devices |