diff options
author | couriersud <couriersud@gmx.org> | 2019-04-19 13:54:51 +0200 |
---|---|---|
committer | couriersud <couriersud@gmx.org> | 2019-04-21 12:05:44 +0200 |
commit | 6b96f7ba60a384ff8d219ad480b9b2dd77e2986e (patch) | |
tree | 18fb3c2a8142a935a4a9b6fa30d20628ab7516c6 /src/lib/netlist/devices/nld_74153.cpp | |
parent | e826ac0a569b5dec014f99b79ace61969374d0b6 (diff) |
netlist: Add power terminals to most logic devices.
This fixes an over simplification. Logic devices implicitly assumed that
GND/VDD actually is connected to GND(i.e. 0V). There is no immediate
benefit from this change. It is a preparation for the future
scalability. Now all power terminals (typically 7/14, 8/16) have to be
explicitly connected to the supply rails.
Also added a validation mode to the netlist core. This is not
intended for running, but solely to better indentify pins which
are not properly connected.
Diffstat (limited to 'src/lib/netlist/devices/nld_74153.cpp')
-rw-r--r-- | src/lib/netlist/devices/nld_74153.cpp | 130 |
1 files changed, 54 insertions, 76 deletions
diff --git a/src/lib/netlist/devices/nld_74153.cpp b/src/lib/netlist/devices/nld_74153.cpp index 136fe61520b..7a7bf61b41c 100644 --- a/src/lib/netlist/devices/nld_74153.cpp +++ b/src/lib/netlist/devices/nld_74153.cpp @@ -7,28 +7,55 @@ #include "nld_74153.h" #include "netlist/nl_base.h" +#include "nlid_system.h" namespace netlist { - namespace devices - { -/* FIXME: timing is not 100% accurate, Strobe and Select inputs have a - * slightly longer timing. - * Convert this to sub-devices at some time. - */ +namespace devices +{ - NETLIB_OBJECT(74153sub) + /* FIXME: timing is not 100% accurate, Strobe and Select inputs have a + * slightly longer timing. + * Convert this to sub-devices at some time. + */ + + NETLIB_OBJECT(74153) { - NETLIB_CONSTRUCTOR(74153sub) - , m_C(*this, {{"C0", "C1", "C2", "C3"}}) - , m_G(*this, "G") + NETLIB_CONSTRUCTOR(74153) + , m_C(*this, {{"C0", "C1", "C2", "C3"}}, NETLIB_DELEGATE(74153, sub)) + , m_G(*this, "G", NETLIB_DELEGATE(74153, sub)) , m_Y(*this, "AY") //FIXME: Change netlists , m_chan(*this, "m_chan", 0) + , m_A(*this, "A") + , m_B(*this, "B") + , m_power_pins(*this) + { + } + + NETLIB_RESETI() { + m_chan = 0; } - NETLIB_RESETI(); - NETLIB_UPDATEI(); + NETLIB_UPDATEI() + { + m_chan = (m_A() | (m_B()<<1)); + sub(); + } + + NETLIB_HANDLERI(sub) + { + constexpr const netlist_time delay[2] = { NLTIME_FROM_NS(23), NLTIME_FROM_NS(18) }; + if (!m_G()) + { + auto t = m_C[m_chan](); + m_Y.push(t, delay[t]); + } + else + { + m_Y.push(0, delay[0]); + } + } public: object_array_t<logic_input_t, 4> m_C; @@ -37,29 +64,11 @@ namespace netlist logic_output_t m_Y; state_var<unsigned> m_chan; - }; - - NETLIB_OBJECT(74153) - { - NETLIB_CONSTRUCTOR(74153) - , m_sub(*this, "sub") - , m_A(*this, "A") - , m_B(*this, "B") - { - register_subalias("C0", m_sub.m_C[0]); - register_subalias("C1", m_sub.m_C[1]); - register_subalias("C2", m_sub.m_C[2]); - register_subalias("C3", m_sub.m_C[3]); - register_subalias("G", m_sub.m_G); - register_subalias("AY", m_sub.m_Y); //FIXME: Change netlists - } - NETLIB_RESETI() { } - NETLIB_UPDATEI(); - public: - NETLIB_SUB(74153sub) m_sub; logic_input_t m_A; logic_input_t m_B; + + nld_power_pins m_power_pins; }; NETLIB_OBJECT(74153_dip) @@ -67,72 +76,41 @@ namespace netlist NETLIB_CONSTRUCTOR(74153_dip) , m_1(*this, "1") , m_2(*this, "2") - , m_A(*this, "14") // m_2.m_B - , m_B(*this, "2") // m_2.m_B { register_subalias("1", m_1.m_G); + register_subalias("2", m_1.m_B); register_subalias("3", m_1.m_C[3]); register_subalias("4", m_1.m_C[2]); register_subalias("5", m_1.m_C[1]); register_subalias("6", m_1.m_C[0]); register_subalias("7", m_1.m_Y); + register_subalias("8", "1.GND"); register_subalias("9", m_2.m_Y); register_subalias("10", m_2.m_C[0]); register_subalias("11", m_2.m_C[1]); register_subalias("12", m_2.m_C[2]); register_subalias("13", m_2.m_C[3]); + register_subalias("14", m_1.m_A); register_subalias("15", m_2.m_G); + register_subalias("16", "1.VCC"); + connect("1.GND", "2.GND"); + connect("1.VCC", "2.VCC"); + connect(m_1.m_A, m_2.m_A); + connect(m_1.m_B, m_2.m_B); } //NETLIB_RESETI(); - NETLIB_UPDATEI(); + //NETLIB_UPDATEI(); protected: - NETLIB_SUB(74153sub) m_1; - NETLIB_SUB(74153sub) m_2; - logic_input_t m_A; - logic_input_t m_B; + NETLIB_SUB(74153) m_1; + NETLIB_SUB(74153) m_2; }; - - NETLIB_RESET(74153sub) - { - m_chan = 0; - } - - NETLIB_UPDATE(74153sub) - { - const netlist_time delay[2] = { NLTIME_FROM_NS(23), NLTIME_FROM_NS(18) }; - if (!m_G()) - { - auto t = m_C[m_chan](); - m_Y.push(t, delay[t]); - } - else - { - m_Y.push(0, delay[0]); - } - } - - - NETLIB_UPDATE(74153) - { - m_sub.m_chan = (m_A() | (m_B()<<1)); - m_sub.update(); - } - - - NETLIB_UPDATE(74153_dip) - { - m_2.m_chan = m_1.m_chan = (m_A() | (m_B()<<1)); - m_1.update(); - m_2.update(); - } - - NETLIB_DEVICE_IMPL(74153, "TTL_74153", "+C0,+C1,+C2,+C3,+A,+B,+G") + NETLIB_DEVICE_IMPL(74153, "TTL_74153", "+C0,+C1,+C2,+C3,+A,+B,+G,@VCC,@GND") NETLIB_DEVICE_IMPL(74153_dip, "TTL_74153_DIP", "") - } //namespace devices +} //namespace devices } // namespace netlist |