summaryrefslogtreecommitdiffstatshomepage
path: root/src/lib/netlist/devices/nld_mm5837.cpp
blob: 129456c8784ecb35ebd01ff3ac0f5d22bbb0e74f (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
71
72
73
74
75
76
77
78
79
80
81
82
// license:GPL-2.0+
// copyright-holders:Couriersud
/*
 * nld_MM5837.c
 *
 */

#include <solver/nld_solver.h>
#include "nld_mm5837.h"
#include "nl_setup.h"

#define R_LOW (1000)
#define R_HIGH (1000)

NETLIB_NAMESPACE_DEVICES_START()

NETLIB_START(MM5837_dip)
{
	/* clock */
	register_output("Q", m_Q);
	register_input("FB", m_feedback);
	m_inc = netlist_time::from_hz(56000);
	connect_late(m_feedback, m_Q);

	/* output */
	register_sub("RV", m_RV);
	register_terminal("_RV1", m_RV.m_P);
	register_terminal("_RV2", m_RV.m_N);
	register_output("_Q", m_V0);
	connect_late(m_RV.m_N, m_V0);

	/* device */
	register_input("1", m_VDD);
	register_input("2", m_VGG);
	register_subalias("3", m_RV.m_P);
	register_input("4", m_VSS);

	save(NLNAME(m_shift));
}

NETLIB_RESET(MM5837_dip)
{
	m_V0.initial(0.0);
	m_RV.do_reset();
	m_RV.set(NL_FCONST(1.0) / R_LOW, 0.0, 0.0);

	m_shift = 0x1ffff;
	m_is_timestep = m_RV.m_P.net().as_analog().solver()->is_timestep();
}

NETLIB_UPDATE(MM5837_dip)
{
	OUTLOGIC(m_Q, !m_Q.net().as_logic().new_Q(), m_inc  );

	/* shift register
	 *
	 * 17 bits, bits 17 & 14 feed back to input
	 *
	 */

	const UINT32 last_state = m_shift & 0x01;
	/* shift */
	m_shift = (m_shift >> 1) | (((m_shift & 0x01) ^ ((m_shift >> 3) & 0x01)) << 16);
	const UINT32 state = m_shift & 0x01;

	if (state != last_state)
	{
		const nl_double R = state ? R_HIGH : R_LOW;
		const nl_double V = state ? INPANALOG(m_VDD) : INPANALOG(m_VSS);

		// We only need to update the net first if this is a time stepping net
		if (m_is_timestep)
			m_RV.update_dev();
		m_RV.set(NL_FCONST(1.0) / R, V, 0.0);
		m_RV.m_P.schedule_after(NLTIME_FROM_NS(1));
	}

}



NETLIB_NAMESPACE_DEVICES_END()