summaryrefslogtreecommitdiffstatshomepage
path: root/src/lib/netlist/devices/nld_9321.cpp
blob: 5adffc3a313800f90e0db685a394d7944c81cf45 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
// license:BSD-3-Clause
// copyright-holders:Ryan Holtz
/*
 * nld_9321.cpp
 *
 *  9321: Dual One-of-Four Decoder
 *
 *          +------------+
 *       /E |1    ++   16| VCC
 *       A0 |2         15| /E
 *       A1 |3         14| A0
 *      /D0 |4   9321  13| A1
 *      /D1 |5         12| /D0
 *      /D2 |6         11| /D1
 *      /D3 |7         10| /D2
 *      GND |8          9| /D3
 *          +------------+
 *
 */

#include "nl_base.h"

namespace netlist
{
	namespace devices
	{

	// FIXME: m_E should activate deactivate m_A

	NETLIB_OBJECT(9321)
	{
		NETLIB_CONSTRUCTOR(9321)
		, m_enable(*this, "m_enable", true)
		, m_o(*this, "m_o", 0)
		, m_A(*this, 0, "A{}", NETLIB_DELEGATE(in))
		, m_D(*this, 0, "D{}")
		, m_E(*this, "E", NETLIB_DELEGATE(e))
		, m_power_pins(*this)
		{
		}

	private:
		NETLIB_HANDLERI(in)
		{
			m_enable = m_E() ? false : true;
			m_o = (m_A[1]() << 1) | m_A[0]();
			for (std::size_t i=0; i<4; i++)
				m_D[i].push((i == m_o && m_enable) ? 0 : 1, NLTIME_FROM_NS(21));
		}

		NETLIB_HANDLERI(e)
		{
			m_enable = m_E() ? 0 : 1;
			m_o = (m_A[1]() << 1) | m_A[0]();
			for (std::size_t i=0; i<4; i++)
				m_D[i].push((i == m_o && m_enable) ? 0 : 1, NLTIME_FROM_NS(18));
		}

		state_var<bool> m_enable;
		state_var<uint32_t> m_o;
		object_array_t<logic_input_t, 2> m_A;
		object_array_t<logic_output_t, 4> m_D;
		logic_input_t m_E;
		nld_power_pins m_power_pins;
	};

	NETLIB_DEVICE_IMPL(9321, "TTL_9321", "+E,+A0,+A1")

	} //namespace devices
} // namespace netlist