Align naming convention to be the same for nld_signal and nld_truthtable

This commit is contained in:
Couriersud 2014-06-21 13:39:30 +00:00
parent 11a0c04680
commit 158ca615a5
15 changed files with 158 additions and 110 deletions

View File

@ -6,7 +6,16 @@
#include "nld_7400.h"
#if 0
UINT32 nld_7400::m_outs[m_size];
nld_7400::truthtable_t nld_7400::m_ttbl;
const char *nld_7400::m_desc[] = {
"A,B,PQ,PA,PB|Q",
"0,X,X,X,X|1|22",
"X,0,X,X,X|1|22",
"1,1,X,X,X|0|15",
""
};
#endif
NETLIB_START(7400_dip)
@ -18,19 +27,19 @@ NETLIB_START(7400_dip)
register_subalias("1", m_1.m_i[0]);
register_subalias("2", m_1.m_i[1]);
register_subalias("3", m_1.m_Q);
register_subalias("3", m_1.m_Q[0]);
register_subalias("4", m_2.m_i[0]);
register_subalias("5", m_2.m_i[1]);
register_subalias("6", m_2.m_Q);
register_subalias("6", m_2.m_Q[0]);
register_subalias("9", m_3.m_i[0]);
register_subalias("10", m_3.m_i[1]);
register_subalias("8", m_3.m_Q);
register_subalias("8", m_3.m_Q[0]);
register_subalias("12", m_4.m_i[0]);
register_subalias("13", m_4.m_i[1]);
register_subalias("11", m_4.m_Q);
register_subalias("11", m_4.m_Q[0]);
}
NETLIB_UPDATE(7400_dip)

View File

@ -43,27 +43,7 @@
NETLIB_SIGNAL(7400, 2, 0, 0);
#else
#include "nld_truthtable.h"
class nld_7400 : public nld_truthtable_t<2,1>
{
public:
nld_7400 ()
: nld_truthtable_t<2,1>()
{
}
void start()
{
static const char *tt[] = {
"A,B,PQ,PA,PB|Q",
"0,X,X,X,X|1",
"X,0,X,X,X|1",
"1,1,X,X,X|0",
""
};
setup_tt(tt, m_outs);
}
private:
static UINT32 m_outs[m_size];
};
NETLIB_TRUTHTABLE(7400, 2, 1, 0);
#endif

View File

@ -12,21 +12,21 @@ NETLIB_START(7402_dip)
register_sub(m_3, "3");
register_sub(m_4, "4");
register_subalias("1", m_1.m_Q);
register_subalias("1", m_1.m_Q[0]);
register_subalias("2", m_1.m_i[0]);
register_subalias("3", m_1.m_i[1]);
register_subalias("4", m_2.m_Q);
register_subalias("4", m_2.m_Q[0]);
register_subalias("5", m_2.m_i[0]);
register_subalias("6", m_2.m_i[1]);
register_subalias("8", m_3.m_i[0]);
register_subalias("9", m_3.m_i[1]);
register_subalias("10", m_3.m_Q);
register_subalias("10", m_3.m_Q[0]);
register_subalias("11", m_4.m_i[0]);
register_subalias("12", m_4.m_i[1]);
register_subalias("13", m_4.m_Q);
register_subalias("13", m_4.m_Q[0]);
}
NETLIB_UPDATE(7402_dip)

View File

@ -14,19 +14,19 @@ NETLIB_START(7408_dip)
register_subalias("1", m_1.m_i[0]);
register_subalias("2", m_1.m_i[1]);
register_subalias("3", m_1.m_Q);
register_subalias("3", m_1.m_Q[0]);
register_subalias("4", m_2.m_i[0]);
register_subalias("5", m_2.m_i[1]);
register_subalias("6", m_2.m_Q);
register_subalias("6", m_2.m_Q[0]);
register_subalias("9", m_3.m_i[0]);
register_subalias("10", m_3.m_i[1]);
register_subalias("8", m_3.m_Q);
register_subalias("8", m_3.m_Q[0]);
register_subalias("12", m_4.m_i[0]);
register_subalias("13", m_4.m_i[1]);
register_subalias("11", m_4.m_Q);
register_subalias("11", m_4.m_Q[0]);
}
NETLIB_UPDATE(7408_dip)

View File

@ -16,14 +16,14 @@ NETLIB_START(7410_dip)
register_subalias("3", m_2.m_i[0]);
register_subalias("4", m_2.m_i[1]);
register_subalias("5", m_2.m_i[2]);
register_subalias("6", m_2.m_Q);
register_subalias("6", m_2.m_Q[0]);
register_subalias("8", m_3.m_Q);
register_subalias("8", m_3.m_Q[0]);
register_subalias("9", m_3.m_i[0]);
register_subalias("10", m_3.m_i[1]);
register_subalias("11", m_3.m_i[2]);
register_subalias("12", m_1.m_Q);
register_subalias("12", m_1.m_Q[0]);
register_subalias("13", m_1.m_i[2]);
}

View File

@ -16,14 +16,14 @@ NETLIB_START(7411_dip)
register_subalias("3", m_2.m_i[0]);
register_subalias("4", m_2.m_i[1]);
register_subalias("5", m_2.m_i[2]);
register_subalias("6", m_2.m_Q);
register_subalias("6", m_2.m_Q[0]);
register_subalias("8", m_3.m_Q);
register_subalias("8", m_3.m_Q[0]);
register_subalias("9", m_3.m_i[0]);
register_subalias("10", m_3.m_i[1]);
register_subalias("11", m_3.m_i[2]);
register_subalias("12", m_1.m_Q);
register_subalias("12", m_1.m_Q[0]);
register_subalias("13", m_1.m_i[2]);
}

View File

@ -15,9 +15,9 @@ NETLIB_START(7420_dip)
register_subalias("4", m_1.m_i[2]);
register_subalias("5", m_1.m_i[3]);
register_subalias("6", m_1.m_Q);
register_subalias("6", m_1.m_Q[0]);
register_subalias("8", m_2.m_Q);
register_subalias("8", m_2.m_Q[0]);
register_subalias("9", m_2.m_i[0]);
register_subalias("10", m_2.m_i[1]);

View File

@ -17,9 +17,9 @@ NETLIB_START(7425_dip)
register_subalias("4", m_1.m_i[2]);
register_subalias("5", m_1.m_i[3]);
register_subalias("6", m_1.m_Q);
register_subalias("6", m_1.m_Q[0]);
register_subalias("8", m_2.m_Q);
register_subalias("8", m_2.m_Q[0]);
register_subalias("9", m_2.m_i[0]);
register_subalias("10", m_2.m_i[1]);

View File

@ -16,14 +16,14 @@ NETLIB_START(7427_dip)
register_subalias("3", m_2.m_i[0]);
register_subalias("4", m_2.m_i[1]);
register_subalias("5", m_2.m_i[2]);
register_subalias("6", m_2.m_Q);
register_subalias("6", m_2.m_Q[0]);
register_subalias("8", m_3.m_Q);
register_subalias("8", m_3.m_Q[0]);
register_subalias("9", m_3.m_i[0]);
register_subalias("10", m_3.m_i[1]);
register_subalias("11", m_3.m_i[2]);
register_subalias("12", m_1.m_Q);
register_subalias("12", m_1.m_Q[0]);
register_subalias("13", m_1.m_i[2]);
}

View File

@ -16,7 +16,7 @@ NETLIB_START(7430_dip)
register_subalias("5", m_1.m_i[4]);
register_subalias("6", m_1.m_i[5]);
register_subalias("8", m_1.m_Q);
register_subalias("8", m_1.m_Q[0]);
register_subalias("11", m_1.m_i[6]);
register_subalias("12", m_1.m_i[7]);

View File

@ -12,21 +12,21 @@ NETLIB_START(7432_dip)
register_sub(m_3, "3");
register_sub(m_4, "4");
register_subalias("1", m_1.m_Q);
register_subalias("1", m_1.m_Q[0]);
register_subalias("2", m_1.m_i[0]);
register_subalias("3", m_1.m_i[1]);
register_subalias("4", m_2.m_Q);
register_subalias("4", m_2.m_Q[0]);
register_subalias("5", m_2.m_i[0]);
register_subalias("6", m_2.m_i[1]);
register_subalias("8", m_3.m_i[0]);
register_subalias("9", m_3.m_i[1]);
register_subalias("10", m_3.m_Q);
register_subalias("10", m_3.m_Q[0]);
register_subalias("11", m_4.m_i[0]);
register_subalias("12", m_4.m_i[1]);
register_subalias("13", m_4.m_Q);
register_subalias("13", m_4.m_Q[0]);
}
NETLIB_UPDATE(7432_dip)

View File

@ -14,19 +14,19 @@ NETLIB_START(7437_dip)
register_subalias("1", m_1.m_i[0]);
register_subalias("2", m_1.m_i[1]);
register_subalias("3", m_1.m_Q);
register_subalias("3", m_1.m_Q[0]);
register_subalias("4", m_2.m_i[0]);
register_subalias("5", m_2.m_i[1]);
register_subalias("6", m_2.m_Q);
register_subalias("6", m_2.m_Q[0]);
register_subalias("9", m_3.m_i[0]);
register_subalias("10", m_3.m_i[1]);
register_subalias("8", m_3.m_Q);
register_subalias("8", m_3.m_Q[0]);
register_subalias("12", m_4.m_i[0]);
register_subalias("13", m_4.m_i[1]);
register_subalias("11", m_4.m_Q);
register_subalias("11", m_4.m_Q[0]);
}
NETLIB_UPDATE(7437_dip)

View File

@ -39,7 +39,7 @@ public:
{
const char *sIN[8] = { "A", "B", "C", "D", "E", "F", "G", "H" };
register_output("Q", m_Q);
register_output("Q", m_Q[0]);
for (int i=0; i < _numdev; i++)
{
register_input(sIN[i], m_i[i]);
@ -49,7 +49,7 @@ public:
ATTR_COLD void reset()
{
m_Q.initial(1);
m_Q[0].initial(1);
m_active = 1;
}
@ -90,16 +90,16 @@ public:
for (int j = i + 1; j < _numdev; j++)
this->m_i[j].inactivate();
OUTLOGIC(this->m_Q, _check ^ (1 ^ _invert), times[_check ^ (1 ^ _invert)]);// ? 15000 : 22000);
OUTLOGIC(this->m_Q[0], _check ^ (1 ^ _invert), times[_check ^ (1 ^ _invert)]);// ? 15000 : 22000);
return;
}
}
OUTLOGIC(this->m_Q,_check ^ (_invert), times[_check ^ (_invert)]);// ? 22000 : 15000);
OUTLOGIC(this->m_Q[0],_check ^ (_invert), times[_check ^ (_invert)]);// ? 22000 : 15000);
}
public:
netlist_ttl_input_t m_i[_numdev];
netlist_ttl_output_t m_Q;
netlist_ttl_output_t m_Q[1];
INT32 m_active;
};
@ -114,7 +114,7 @@ public:
ATTR_COLD void start()
{
register_output("Q", m_Q);
register_output("Q", m_Q[0]);
register_input("A", m_i[0]);
register_input("B", m_i[1]);
@ -123,7 +123,7 @@ public:
ATTR_COLD void reset()
{
m_Q.initial(1);
m_Q[0].initial(1);
m_active = 1;
}
@ -171,12 +171,12 @@ public:
res = _invert ^ _check;
break;
}
OUTLOGIC(m_Q, res, times[res]);// ? 22000 : 15000);
OUTLOGIC(m_Q[0], res, times[res]);// ? 22000 : 15000);
}
public:
netlist_ttl_input_t m_i[2];
netlist_ttl_output_t m_Q;
netlist_ttl_output_t m_Q[1];
INT32 m_active;
};

View File

@ -10,23 +10,67 @@
#include "../nl_base.h"
template<int m_NI, int m_NO>
#define NETLIB_TRUTHTABLE(_name, _nIN, _nOUT, _state) \
class NETLIB_NAME(_name) : public nld_truthtable_t<_nIN, _nOUT, _state> \
{ \
public: \
NETLIB_NAME(_name)() \
: nld_truthtable_t<_nIN, _nOUT, _state>(&m_ttbl, m_desc) { } \
private: \
static truthtable_t m_ttbl; \
static const char *m_desc[]; \
}
template<int m_NI, int m_NO, int has_state>
class nld_truthtable_t : public netlist_device_t
{
public:
static const int m_size = (1 << (2 * m_NI + m_NO));
static const int m_num_bits = m_NI + has_state * (m_NI + m_NO);
static const int m_size = (1 << (m_num_bits));
nld_truthtable_t()
: netlist_device_t(), m_active(1)
struct truthtable_t
{
truthtable_t() : m_initialized(false) {}
UINT32 m_outs[m_size];
UINT8 m_timing[m_size][m_NO];
netlist_time m_timing_nt[16];
bool m_initialized;
};
nld_truthtable_t(truthtable_t *ttbl, const char *desc[])
: netlist_device_t(), m_last_state(0), m_active(1), m_ttp(ttbl), m_desc(desc)
{
}
ATTR_COLD virtual void start()
{
pstring ttline = pstring(m_desc[0]);
{
nl_util::pstring_list io = nl_util::split(ttline,"|");
// checks
assert(io.count() == 2);
nl_util::pstring_list inout = nl_util::split(io[0], ",");
assert(inout.count() == m_num_bits);
nl_util::pstring_list out = nl_util::split(io[1], ",");
assert(out.count() == m_NO);
for (int i=0; i < m_NI; i++)
{
register_input(inout[i], m_i[i]);
}
for (int i=0; i < m_NO; i++)
{
register_output(out[i], m_Q[i]);
}
}
setup_tt();
// FIXME: save state
}
ATTR_COLD void help(UINT32 outs[], int cur, nl_util::pstring_list list, UINT64 state, UINT64 ignore, UINT16 val)
ATTR_COLD void help(int cur, nl_util::pstring_list list,
UINT64 state, UINT64 ignore, UINT16 val, UINT8 timing_index[m_NO])
{
pstring elem = list[cur];
int start = 0;
@ -54,69 +98,75 @@ public:
const UINT64 nstate = state | (i << cur);
const UINT64 nignore = ignore | (ign << cur);
if (cur < list.count() - 1)
if (cur < m_num_bits - 1)
{
help(outs, cur + 1, list, nstate, nignore, val);
help(cur + 1, list, nstate, nignore, val, timing_index);
}
else
{
// cutoff previous inputs and outputs for ignore
outs[nstate] = val | ((nignore & ((1 << m_NI)-1)) << m_NO);
m_ttp->m_outs[nstate] = val | ((nignore & ((1 << m_NI)-1)) << m_NO);
for (int j=0; j<m_NO; j++)
m_ttp->m_timing[nstate][j] = timing_index[j];
}
}
}
ATTR_COLD void setup_tt(const char **truthtable, UINT32 outs[])
ATTR_COLD void setup_tt()
{
if (m_ttp->m_initialized)
return;
const char **truthtable = m_desc;
pstring ttline = pstring(truthtable[0]);
truthtable++;
{
nl_util::pstring_list io = nl_util::split(ttline,"|");
// checks
assert(io.count() == 2);
nl_util::pstring_list inout = nl_util::split(io[0], ",");
assert(inout.count() == 2 * m_NI + m_NO);
nl_util::pstring_list out = nl_util::split(io[1], ",");
assert(out.count() == m_NO);
for (int i=0; i < m_NI; i++)
{
register_input(inout[i], m_i[i]);
}
for (int i=0; i < m_NO; i++)
{
register_output(out[i], m_Q[i]);
}
//save(NAME(m_active));
ttline = pstring(truthtable[0]);
truthtable++;
}
ttline = pstring(truthtable[0]);
truthtable++;
for (int j=0; j < m_size; j++)
outs[j] = -1;
m_ttp->m_outs[j] = -1;
for (int j=0; j < 16; j++)
m_ttp->m_timing_nt[j] = netlist_time::zero;
while (!ttline.equals(""))
{
nl_util::pstring_list io = nl_util::split(ttline,"|");
// checks
assert(io.count() == 2);
assert(io.count() == 3);
nl_util::pstring_list inout = nl_util::split(io[0], ",");
assert(inout.count() == 2 * m_NI + m_NO);
assert(inout.count() == m_num_bits);
nl_util::pstring_list out = nl_util::split(io[1], ",");
assert(out.count() == m_NO);
nl_util::pstring_list times = nl_util::split(io[2], ",");
assert(times.count() == m_NO);
UINT16 val = 0;
UINT8 tindex[m_NO];
for (int j=0; j<m_NO; j++)
{
if (out[j].equals("1"))
val = val | (1 << j);
netlist_time t = netlist_time::from_nsec(times[j].as_long());
int k=0;
while (m_ttp->m_timing_nt[k] != netlist_time::zero && m_ttp->m_timing_nt[k] != t)
k++;
m_ttp->m_timing_nt[k] = t;
tindex[j] = k;
}
help(outs, 0, inout, 0 , 0 , val);
help(0, inout, 0 , 0 , val, tindex);
ttline = pstring(truthtable[0]);
truthtable++;
}
for (int j=0; j < m_size; j++)
printf("%05x %04x %04x\n", j, outs[j] & ((1 << m_NO)-1), outs[j] >> m_NO);
m_ttp = outs;
printf("%05x %04x %04x %04x\n", j, m_ttp->m_outs[j] & ((1 << m_NO)-1),
m_ttp->m_outs[j] >> m_NO, m_ttp->m_timing[j][0]);
for (int k=0; m_ttp->m_timing_nt[k] != netlist_time::zero; k++)
printf("%d %f\n", k, m_ttp->m_timing_nt[k].as_double() * 1000000.0);
m_ttp->m_initialized = true;
}
ATTR_COLD void reset()
@ -128,7 +178,7 @@ public:
ATTR_HOT ATTR_ALIGN void update()
{
const netlist_time times[2] = { NLTIME_FROM_NS(15), NLTIME_FROM_NS(22)};
//const netlist_time times[2] = { NLTIME_FROM_NS(15), NLTIME_FROM_NS(22)};
// FIXME: this check is needed because update is called during startup as well
if (UNEXPECTED(USE_DEACTIVE_DEVICE && m_active == 0))
@ -141,17 +191,18 @@ public:
state = state | (INPLOGIC(m_i[i]) << i);
}
const UINT32 nstate = state | (m_last_state << m_NI);
const UINT32 out = m_ttp[nstate] & ((1 << m_NO) - 1);
const UINT32 ign = m_ttp[nstate] >> m_NO;
const UINT32 nstate = (has_state ? state | (m_last_state << m_NI) : state);
const UINT32 out = m_ttp->m_outs[nstate] & ((1 << m_NO) - 1);
const UINT32 ign = m_ttp->m_outs[nstate] >> m_NO;
if (has_state) m_last_state = (state << m_NO) | out;
for (int i=0; i< m_NI; i++)
if (ign & (1 << i))
m_i[i].inactivate();
for (int i=0; i<m_NO; i++)
OUTLOGIC(m_Q[i], (out >> i) & 1, times[(out >> i) & 1]);// ? 22000 : 15000);
m_last_state = (state << m_NO) | out;
// OUTLOGIC(m_Q[i], (out >> i) & 1, times[(out >> i) & 1]);// ? 22000 : 15000);
OUTLOGIC(m_Q[i], (out >> i) & 1, m_ttp->m_timing_nt[m_ttp->m_timing[nstate][i]]);// ? 22000 : 15000);
}
@ -175,13 +226,16 @@ public:
}
#endif
public:
netlist_ttl_input_t m_i[m_NI];
netlist_ttl_output_t m_Q[m_NO];
UINT32 *m_ttp;
INT32 m_active;
private:
UINT32 m_last_state;
INT32 m_active;
truthtable_t *m_ttp;
const char **m_desc;
};
#endif /* NLD_TRUTHTABLE_H_ */

View File

@ -40,6 +40,7 @@ public:
ATTR_HOT friend inline bool operator<(const netlist_time &left, const netlist_time &right);
ATTR_HOT friend inline bool operator>=(const netlist_time &left, const netlist_time &right);
ATTR_HOT friend inline bool operator<=(const netlist_time &left, const netlist_time &right);
ATTR_HOT friend inline bool operator!=(const netlist_time &left, const netlist_time &right);
ATTR_HOT inline const netlist_time &operator=(const netlist_time &right) { m_time = right.m_time; return *this; }
ATTR_HOT inline const netlist_time &operator=(const double &right) { m_time = (INTERNALTYPE) ( right * (double) RESOLUTION); return *this; }
@ -111,5 +112,9 @@ ATTR_HOT inline bool operator>=(const netlist_time &left, const netlist_time &ri
return (left.m_time >= right.m_time);
}
ATTR_HOT inline bool operator!=(const netlist_time &left, const netlist_time &right)
{
return (left.m_time != right.m_time);
}
#endif /* NLTIME_H_ */