Added device deactivation for 7486 and truthtables for 7437.

Truthtables in the 7448 don't work with pong if device de/activation is
enabled. (nw)
This commit is contained in:
couriersud 2015-05-15 02:40:00 +02:00
parent 6ffebca846
commit 624ea80c5d
9 changed files with 205 additions and 51 deletions

View File

@ -7,6 +7,18 @@
#include "nld_7437.h"
#if (USE_TRUTHTABLE)
nld_7437::truthtable_t nld_7437::m_ttbl;
const char *nld_7437::m_desc[] = {
"A , B | Q ",
"0,X|1|22",
"X,0|1|22",
"1,1|0|15",
""
};
#endif
NETLIB_START(7437_dip)
{
register_sub("1", m_1);

View File

@ -42,7 +42,12 @@
NET_CONNECT(_name, A, _A) \
NET_CONNECT(_name, B, _B)
#if (USE_TRUTHTABLE)
#include "nld_truthtable.h"
NETLIB_TRUTHTABLE(7437, 2, 1, 0);
#else
NETLIB_SIGNAL(7437, 2, 0, 0);
#endif
#define TTL_7437_DIP(_name) \
NET_REGISTER_DEV(7437_dip, _name)

View File

@ -7,8 +7,60 @@
#include "nld_7448.h"
#if (0 && USE_TRUTHTABLE)
nld_7448::truthtable_t nld_7448::m_ttbl;
const char *nld_7448::m_desc[] = {
" LTQ,BIQ,RBIQ, A , B , C , D | a, b, c, d, e, f, g",
" 1, 1, 1, 0, 0, 0, 0 | 1, 1, 1, 1, 1, 1, 0|100,100,100,100,100,100,100",
" 1, 1, X, 1, 0, 0, 0 | 0, 1, 1, 0, 0, 0, 0|100,100,100,100,100,100,100",
" 1, 1, X, 0, 1, 0, 0 | 1, 1, 0, 1, 1, 0, 1|100,100,100,100,100,100,100",
" 1, 1, X, 1, 1, 0, 0 | 1, 1, 1, 1, 0, 0, 1|100,100,100,100,100,100,100",
" 1, 1, X, 0, 0, 1, 0 | 0, 1, 1, 0, 0, 1, 1|100,100,100,100,100,100,100",
" 1, 1, X, 1, 0, 1, 0 | 1, 0, 1, 1, 0, 1, 1|100,100,100,100,100,100,100",
" 1, 1, X, 0, 1, 1, 0 | 0, 0, 1, 1, 1, 1, 1|100,100,100,100,100,100,100",
" 1, 1, X, 1, 1, 1, 0 | 1, 1, 1, 0, 0, 0, 0|100,100,100,100,100,100,100",
" 1, 1, X, 0, 0, 0, 1 | 1, 1, 1, 1, 1, 1, 1|100,100,100,100,100,100,100",
" 1, 1, X, 1, 0, 0, 1 | 1, 1, 1, 0, 0, 1, 1|100,100,100,100,100,100,100",
" 1, 1, X, 0, 1, 0, 1 | 0, 0, 0, 1, 1, 0, 1|100,100,100,100,100,100,100",
" 1, 1, X, 1, 1, 0, 1 | 0, 0, 1, 1, 0, 0, 1|100,100,100,100,100,100,100",
" 1, 1, X, 0, 0, 1, 1 | 0, 1, 0, 0, 0, 1, 1|100,100,100,100,100,100,100",
" 1, 1, X, 1, 0, 1, 1 | 1, 0, 0, 1, 0, 1, 1|100,100,100,100,100,100,100",
" 1, 1, X, 0, 1, 1, 1 | 0, 0, 0, 1, 1, 1, 1|100,100,100,100,100,100,100",
" 1, 1, X, 1, 1, 1, 1 | 0, 0, 0, 0, 0, 0, 0|100,100,100,100,100,100,100",
// BI/RBO is input output. In the next case it is used as an output will go low.
" 1, 1, 0, 0, 0, 0, 0 | 0, 0, 0, 0, 0, 0, 0|100,100,100,100,100,100,100", // RBI
" 0, 1, X, X, X, X, X | 1, 1, 1, 1, 1, 1, 1|100,100,100,100,100,100,100", // LT
// This condition has precedence
" X, 0, X, X, X, X, X | 0, 0, 0, 0, 0, 0, 0|100,100,100,100,100,100,100", // BI
""
};
NETLIB_START(7448_dip)
{
NETLIB_NAME(7448)::start();
register_subalias("1", m_i[4]); // B
register_subalias("2", m_i[5]); // C
register_subalias("3", m_i[0]); // LTQ
register_subalias("4", m_i[1]); // BIQ
register_subalias("5", m_i[2]); // RBIQ
register_subalias("6", m_i[6]); // D
register_subalias("7", m_i[3]); // A
register_subalias("9", m_Q[4]); // e
register_subalias("10", m_Q[3]); // d
register_subalias("11", m_Q[2]); // c
register_subalias("12", m_Q[1]); // b
register_subalias("13", m_Q[0]); // a
register_subalias("14", m_Q[6]); // g
register_subalias("15", m_Q[5]); // f
}
#else
NETLIB_START(7448)
{
register_sub("sub", sub);
@ -21,15 +73,17 @@ NETLIB_START(7448)
register_input("BIQ", m_BIQ);
register_subalias("RBIQ",sub.m_RBIQ);
register_subalias("a", sub.m_a);
register_subalias("b", sub.m_b);
register_subalias("c", sub.m_c);
register_subalias("d", sub.m_d);
register_subalias("e", sub.m_e);
register_subalias("f", sub.m_f);
register_subalias("g", sub.m_g);
register_subalias("a", sub.m_Q[0]);
register_subalias("b", sub.m_Q[1]);
register_subalias("c", sub.m_Q[2]);
register_subalias("d", sub.m_Q[3]);
register_subalias("e", sub.m_Q[4]);
register_subalias("f", sub.m_Q[5]);
register_subalias("g", sub.m_Q[6]);
}
NETLIB_RESET(7448)
{
sub.do_reset();
@ -72,20 +126,22 @@ NETLIB_START(7448_sub)
register_input("A3", m_D);
register_input("RBIQ", m_RBIQ);
register_output("a", m_a);
register_output("b", m_b);
register_output("c", m_c);
register_output("d", m_d);
register_output("e", m_e);
register_output("f", m_f);
register_output("g", m_g);
register_output("a", m_Q[0]);
register_output("b", m_Q[1]);
register_output("c", m_Q[2]);
register_output("d", m_Q[3]);
register_output("e", m_Q[4]);
register_output("f", m_Q[5]);
register_output("g", m_Q[6]);
save(NLNAME(m_state));
save(NLNAME(m_active));
}
NETLIB_RESET(7448_sub)
{
m_state = 0;
m_active = 7;
}
NETLIB_UPDATE(7448_sub)
@ -98,6 +154,45 @@ NETLIB_UPDATE(7448_sub)
update_outputs(v);
}
#if 0
ATTR_HOT void NETLIB_NAME(7448_sub)::inc_active()
{
const netlist_time delay[2] = { NLTIME_FROM_NS(15), NLTIME_FROM_NS(22) };
nl_assert(netlist().use_deactivate());
if (++m_active == 1)
{
m_A.activate();
m_B.activate();
m_C.activate();
m_D.activate();
m_RBIQ.activate();
netlist_time mt = this->m_Q[0].net().time();
for (int i=1; i<7; i++)
{
if (this->m_Q[i].net().time() > mt)
mt = this->m_Q[i].net().time();
}
for (int i=0; i<7; i++)
m_Q[i].net().set_Q_time( tab7448[m_state][i], mt + NLTIME_FROM_NS(100));
}
}
ATTR_HOT void NETLIB_NAME(7448_sub)::dec_active()
{
nl_assert(netlist().use_deactivate());
if (--m_active == 0)
{
m_A.inactivate();
m_B.inactivate();
m_C.inactivate();
m_D.inactivate();
m_RBIQ.inactivate();
}
}
#endif
NETLIB_FUNC_VOID(7448_sub, update_outputs, (UINT8 v))
{
nl_assert(v<16);
@ -105,13 +200,8 @@ NETLIB_FUNC_VOID(7448_sub, update_outputs, (UINT8 v))
{
// max transfer time is 100 NS */
OUTLOGIC(m_a, tab7448[v][0], NLTIME_FROM_NS(100));
OUTLOGIC(m_b, tab7448[v][1], NLTIME_FROM_NS(100));
OUTLOGIC(m_c, tab7448[v][2], NLTIME_FROM_NS(100));
OUTLOGIC(m_d, tab7448[v][3], NLTIME_FROM_NS(100));
OUTLOGIC(m_e, tab7448[v][4], NLTIME_FROM_NS(100));
OUTLOGIC(m_f, tab7448[v][5], NLTIME_FROM_NS(100));
OUTLOGIC(m_g, tab7448[v][6], NLTIME_FROM_NS(100));
for (int i=0; i<7; i++)
OUTLOGIC(m_Q[i], tab7448[v][i], NLTIME_FROM_NS(100));
m_state = v;
}
}
@ -136,7 +226,6 @@ const UINT8 NETLIB_NAME(7448_sub)::tab7448[16][7] =
{ 0, 0, 0, 0, 0, 0, 0 }, /* 15 */
};
NETLIB_START(7448_dip)
{
NETLIB_NAME(7448)::start();
@ -149,15 +238,17 @@ NETLIB_START(7448_dip)
register_subalias("6", sub.m_D);
register_subalias("7", sub.m_A);
register_subalias("9", sub.m_e);
register_subalias("10", sub.m_d);
register_subalias("11", sub.m_c);
register_subalias("12", sub.m_b);
register_subalias("13", sub.m_a);
register_subalias("14", sub.m_g);
register_subalias("15", sub.m_f);
register_subalias("9", sub.m_Q[4]); // e
register_subalias("10", sub.m_Q[3]); // d
register_subalias("11", sub.m_Q[2]); // c
register_subalias("12", sub.m_Q[1]); // b
register_subalias("13", sub.m_Q[0]); // a
register_subalias("14", sub.m_Q[6]); // g
register_subalias("15", sub.m_Q[5]); // f
}
#endif
NETLIB_UPDATE(7448_dip)
{
NETLIB_NAME(7448)::update();

View File

@ -39,6 +39,19 @@
#define TTL_7448_DIP(_name) \
NET_REGISTER_DEV(7448_dip, _name)
/*
* FIXME: Big FIXME
* The truthtable will ignore BIQ for certain states.
* This causes a severe issue in pongf when USE_DEACTIVATE is used.
* For now, just use the old implementation.
*
*/
#if (0 && USE_TRUTHTABLE)
#include "nld_truthtable.h"
NETLIB_TRUTHTABLE(7448, 7, 7, 0);
#else
NETLIB_SUBDEVICE(7448_sub,
ATTR_HOT void update_outputs(UINT8 v);
static const UINT8 tab7448[16][7];
@ -50,14 +63,15 @@ NETLIB_SUBDEVICE(7448_sub,
netlist_logic_input_t m_RBIQ;
UINT8 m_state;
int m_active;
netlist_logic_output_t m_a;
netlist_logic_output_t m_b;
netlist_logic_output_t m_c;
netlist_logic_output_t m_d;
netlist_logic_output_t m_e;
netlist_logic_output_t m_f;
netlist_logic_output_t m_g;
netlist_logic_output_t m_Q[7]; /* a .. g */
// FIXME: doesn't work
#if 0
ATTR_HOT void inc_active();
ATTR_HOT void dec_active();
#endif
);
NETLIB_DEVICE(7448,
@ -67,7 +81,7 @@ public:
netlist_logic_input_t m_LTQ;
netlist_logic_input_t m_BIQ;
);
#endif
NETLIB_DEVICE_DERIVED(7448_dip, 7448,
);

View File

@ -10,7 +10,7 @@
ATTR_HOT inline void NETLIB_NAME(7474sub)::newstate(const UINT8 stateQ, const UINT8 stateQQ)
{
// 0: High-to-low 40 ns, 1: Low-to-high 25 ns
static const netlist_time delay[2] = { NLTIME_FROM_NS(40), NLTIME_FROM_NS(25) };
const netlist_time delay[2] = { NLTIME_FROM_NS(40), NLTIME_FROM_NS(25) };
OUTLOGIC(m_Q, stateQ, delay[stateQ]);
OUTLOGIC(m_QQ, stateQQ, delay[stateQQ]);
}

View File

@ -12,16 +12,19 @@ NETLIB_START(7486)
register_input("A", m_A);
register_input("B", m_B);
register_output("Q", m_Q);
save(NLNAME(m_active));
}
NETLIB_RESET(7486)
{
m_active = 1;
}
static const netlist_time delay[2] = { NLTIME_FROM_NS(15), NLTIME_FROM_NS(22) };
NETLIB_UPDATE(7486)
{
const netlist_time delay[2] = { NLTIME_FROM_NS(15), NLTIME_FROM_NS(22) };
UINT8 t = INPLOGIC(m_A) ^ INPLOGIC(m_B);
OUTLOGIC(m_Q, t, delay[t]);
}
@ -66,3 +69,31 @@ NETLIB_RESET(7486_dip)
m_3.do_reset();
m_4.do_reset();
}
ATTR_HOT void NETLIB_NAME(7486)::inc_active()
{
const netlist_time delay[2] = { NLTIME_FROM_NS(15), NLTIME_FROM_NS(22) };
nl_assert(netlist().use_deactivate());
if (++m_active == 1)
{
netlist_time mt = this->m_A.net().time();
if (this->m_B.net().time() > mt)
mt = this->m_B.net().time();
m_A.activate();
m_B.activate();
UINT8 t = INPLOGIC(m_A) ^ INPLOGIC(m_B);
m_Q.net().set_Q_time(t, mt + delay[t]);
}
}
ATTR_HOT void NETLIB_NAME(7486)::dec_active()
{
nl_assert(netlist().use_deactivate());
if (--m_active == 0)
{
m_A.inactivate();
m_B.inactivate();
}
}

View File

@ -44,6 +44,10 @@ public:
netlist_logic_input_t m_A;
netlist_logic_input_t m_B;
netlist_logic_output_t m_Q;
ATTR_HOT void inc_active();
ATTR_HOT void dec_active();
int m_active;
);
#define TTL_7486_DIP(_name) \

View File

@ -86,7 +86,7 @@ ATTR_COLD void truthtable_desc_t::setup(const char **truthtable)
truthtable++;
for (int j=0; j < m_size; j++)
m_outs[j] = -1;
m_outs[j] = 0; //-1;
for (int j=0; j < 16; j++)
m_timing_nt[j] = netlist_time::zero;
@ -128,11 +128,11 @@ ATTR_COLD void truthtable_desc_t::setup(const char **truthtable)
// determine ignore
UINT32 ign[m_size];
for (int i=0; i<m_size; i++)
for (UINT32 i=0; i<m_size; i++)
{
#if 1
UINT32 m_enable = 0;
for (int j=0; j<m_size; j++)
for (UINT32 j=0; j<m_size; j++)
{
if (m_outs[j] != m_outs[i])
{

View File

@ -59,8 +59,8 @@ private:
/* additional values */
const int m_num_bits;
const int m_size;
const UINT32 m_num_bits;
const UINT32 m_size;
};
@ -154,16 +154,13 @@ public:
{
if (!doOUT || (m_ign & (1<<i)) != 0)
m_i[i].activate();
state |= (INPLOGIC(m_i[i]) << i);
}
if (!doOUT)
for (int i = 0; i < m_NI; i++)
{
for (int i = 0; i< m_NI; i++)
{
state |= (INPLOGIC(m_i[i]) << i);
if (!doOUT)
if (this->m_i[i].net().time() > mt)
mt = this->m_i[i].net().time();
}
}
const UINT32 nstate = state | (has_state ? (m_last_state << m_NI) : 0);