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
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
|
// license:GPL-2.0+
// copyright-holders:Couriersud
/*
* nld_74193.c
*
*/
#define MAXCNT 15
#include "nld_74193.h"
NETLIB_NAMESPACE_DEVICES_START()
NETLIB_START(74193)
{
register_input("A", m_A);
register_input("B", m_B);
register_input("C", m_C);
register_input("D", m_D);
register_input("CLEAR", m_CLEAR);
register_input("LOADQ", m_LOADQ);
register_input("CU", m_CU);
register_input("CD", m_CD);
register_output("QA", m_Q[0]);
register_output("QB", m_Q[1]);
register_output("QC", m_Q[2]);
register_output("QD", m_Q[3]);
register_output("BORROWQ", m_BORROWQ);
register_output("CARRYQ", m_CARRYQ);
save(NLNAME(m_cnt));
save(NLNAME(m_last_CU));
save(NLNAME(m_last_CD));
}
NETLIB_RESET(74193)
{
m_cnt = 0;
m_last_CU = 0;
m_last_CD = 0;
}
// FIXME: Timing
static const netlist_time delay[4] =
{
NLTIME_FROM_NS(40),
NLTIME_FROM_NS(40),
NLTIME_FROM_NS(40),
NLTIME_FROM_NS(40)
};
NETLIB_UPDATE(74193)
{
int tCarry = 1;
int tBorrow = 1;
if (INPLOGIC(m_CLEAR))
{
m_cnt = 0;
}
else if (!INPLOGIC(m_LOADQ))
{
m_cnt = (INPLOGIC(m_D) << 3) | (INPLOGIC(m_C) << 2)
| (INPLOGIC(m_B) << 1) | (INPLOGIC(m_A) << 0);
}
else
{
if (INPLOGIC(m_CD) && !m_last_CU && INPLOGIC(m_CU))
{
m_cnt++;
if (m_cnt > MAXCNT)
m_cnt = 0;
}
if (INPLOGIC(m_CU) && !m_last_CD && INPLOGIC(m_CD))
{
if (m_cnt > 0)
m_cnt--;
else
m_cnt = MAXCNT;
}
}
if (!INPLOGIC(m_CU) && (m_cnt == MAXCNT))
tCarry = 0;
if (!INPLOGIC(m_CD) && (m_cnt == 0))
tBorrow = 0;
m_last_CD = INPLOGIC(m_CD);
m_last_CU = INPLOGIC(m_CU);
for (int i=0; i<4; i++)
OUTLOGIC(m_Q[i], (m_cnt >> i) & 1, delay[i]);
OUTLOGIC(m_BORROWQ, tBorrow, NLTIME_FROM_NS(20)); //FIXME
OUTLOGIC(m_CARRYQ, tCarry, NLTIME_FROM_NS(20)); //FIXME
}
NETLIB_FUNC_VOID(74193, update_outputs, (void))
{
}
NETLIB_START(74193_dip)
{
NETLIB_NAME(74193)::start();
register_subalias("1", m_B);
register_subalias("2", m_Q[1]);
register_subalias("3", m_Q[0]);
register_subalias("4", m_CD);
register_subalias("5", m_CU);
register_subalias("6", m_Q[2]);
register_subalias("7", m_Q[3]);
register_subalias("9", m_D);
register_subalias("10", m_C);
register_subalias("11", m_LOADQ);
register_subalias("12", m_CARRYQ);
register_subalias("13", m_BORROWQ);
register_subalias("14", m_CLEAR);
register_subalias("15", m_A);
}
NETLIB_UPDATE(74193_dip)
{
NETLIB_NAME(74193)::update();
}
NETLIB_RESET(74193_dip)
{
NETLIB_NAME(74193)::reset();
}
NETLIB_NAMESPACE_DEVICES_END()
|