Previous 199869 Revisions Next

r31058 Saturday 21st June, 2014 at 13:39:30 UTC by Couriersud
Align naming convention to be the same for nld_signal and nld_truthtable
[src/emu/netlist]nl_time.h
[src/emu/netlist/devices]nld_7400.c nld_7400.h nld_7402.c nld_7408.c nld_7410.c nld_7411.c nld_7420.c nld_7425.c nld_7427.c nld_7430.c nld_7432.c nld_7437.c nld_signal.h nld_truthtable.h

trunk/src/emu/netlist/devices/nld_signal.h
r31057r31058
3939   {
4040      const char *sIN[8] = { "A", "B", "C", "D", "E", "F", "G", "H" };
4141
42      register_output("Q", m_Q);
42      register_output("Q", m_Q[0]);
4343      for (int i=0; i < _numdev; i++)
4444      {
4545         register_input(sIN[i], m_i[i]);
r31057r31058
4949
5050   ATTR_COLD void reset()
5151   {
52      m_Q.initial(1);
52      m_Q[0].initial(1);
5353      m_active = 1;
5454   }
5555
r31057r31058
9090            for (int j = i + 1; j < _numdev; j++)
9191               this->m_i[j].inactivate();
9292
93            OUTLOGIC(this->m_Q, _check ^ (1 ^ _invert), times[_check ^ (1 ^ _invert)]);// ? 15000 : 22000);
93            OUTLOGIC(this->m_Q[0], _check ^ (1 ^ _invert), times[_check ^ (1 ^ _invert)]);// ? 15000 : 22000);
9494            return;
9595         }
9696      }
97      OUTLOGIC(this->m_Q,_check ^ (_invert), times[_check ^ (_invert)]);// ? 22000 : 15000);
97      OUTLOGIC(this->m_Q[0],_check ^ (_invert), times[_check ^ (_invert)]);// ? 22000 : 15000);
9898   }
9999
100100public:
101101   netlist_ttl_input_t m_i[_numdev];
102   netlist_ttl_output_t m_Q;
102   netlist_ttl_output_t m_Q[1];
103103   INT32 m_active;
104104};
105105
r31057r31058
114114
115115   ATTR_COLD void start()
116116   {
117      register_output("Q", m_Q);
117      register_output("Q", m_Q[0]);
118118      register_input("A", m_i[0]);
119119      register_input("B", m_i[1]);
120120
r31057r31058
123123
124124   ATTR_COLD void reset()
125125   {
126      m_Q.initial(1);
126      m_Q[0].initial(1);
127127      m_active = 1;
128128   }
129129
r31057r31058
171171            res = _invert ^ _check;
172172            break;
173173      }
174      OUTLOGIC(m_Q, res, times[res]);// ? 22000 : 15000);
174      OUTLOGIC(m_Q[0], res, times[res]);// ? 22000 : 15000);
175175   }
176176
177177public:
178178   netlist_ttl_input_t m_i[2];
179   netlist_ttl_output_t m_Q;
179   netlist_ttl_output_t m_Q[1];
180180   INT32 m_active;
181181
182182};
trunk/src/emu/netlist/devices/nld_7400.c
r31057r31058
66#include "nld_7400.h"
77
88#if 0
9UINT32 nld_7400::m_outs[m_size];
9nld_7400::truthtable_t nld_7400::m_ttbl;
10
11const char *nld_7400::m_desc[] = {
12        "A,B,PQ,PA,PB|Q",
13        "0,X,X,X,X|1|22",
14        "X,0,X,X,X|1|22",
15        "1,1,X,X,X|0|15",
16        ""
17};
18
1019#endif
1120
1221NETLIB_START(7400_dip)
r31057r31058
1827
1928   register_subalias("1", m_1.m_i[0]);
2029   register_subalias("2", m_1.m_i[1]);
21   register_subalias("3", m_1.m_Q);
30   register_subalias("3", m_1.m_Q[0]);
2231
2332   register_subalias("4", m_2.m_i[0]);
2433   register_subalias("5", m_2.m_i[1]);
25   register_subalias("6", m_2.m_Q);
34   register_subalias("6", m_2.m_Q[0]);
2635
2736   register_subalias("9", m_3.m_i[0]);
2837   register_subalias("10", m_3.m_i[1]);
29   register_subalias("8", m_3.m_Q);
38   register_subalias("8", m_3.m_Q[0]);
3039
3140   register_subalias("12", m_4.m_i[0]);
3241   register_subalias("13", m_4.m_i[1]);
33   register_subalias("11", m_4.m_Q);
42   register_subalias("11", m_4.m_Q[0]);
3443}
3544
3645NETLIB_UPDATE(7400_dip)
trunk/src/emu/netlist/devices/nld_7420.c
r31057r31058
1515
1616   register_subalias("4", m_1.m_i[2]);
1717   register_subalias("5", m_1.m_i[3]);
18   register_subalias("6", m_1.m_Q);
18   register_subalias("6", m_1.m_Q[0]);
1919
20   register_subalias("8", m_2.m_Q);
20   register_subalias("8", m_2.m_Q[0]);
2121   register_subalias("9", m_2.m_i[0]);
2222   register_subalias("10", m_2.m_i[1]);
2323
trunk/src/emu/netlist/devices/nld_7402.c
r31057r31058
1212   register_sub(m_3, "3");
1313   register_sub(m_4, "4");
1414
15   register_subalias("1", m_1.m_Q);
15   register_subalias("1", m_1.m_Q[0]);
1616   register_subalias("2", m_1.m_i[0]);
1717   register_subalias("3", m_1.m_i[1]);
1818
19   register_subalias("4", m_2.m_Q);
19   register_subalias("4", m_2.m_Q[0]);
2020   register_subalias("5", m_2.m_i[0]);
2121   register_subalias("6", m_2.m_i[1]);
2222
2323   register_subalias("8", m_3.m_i[0]);
2424   register_subalias("9", m_3.m_i[1]);
25   register_subalias("10", m_3.m_Q);
25   register_subalias("10", m_3.m_Q[0]);
2626
2727   register_subalias("11", m_4.m_i[0]);
2828   register_subalias("12", m_4.m_i[1]);
29   register_subalias("13", m_4.m_Q);
29   register_subalias("13", m_4.m_Q[0]);
3030}
3131
3232NETLIB_UPDATE(7402_dip)
trunk/src/emu/netlist/devices/nld_7400.h
r31057r31058
4343NETLIB_SIGNAL(7400, 2, 0, 0);
4444#else
4545#include "nld_truthtable.h"
46class nld_7400 : public nld_truthtable_t<2,1>
47    {
48    public:
49        nld_7400 ()
50        : nld_truthtable_t<2,1>()
51    {
52    }
53        void start()
54        {
55            static const char *tt[] = {
56                    "A,B,PQ,PA,PB|Q",
57                    "0,X,X,X,X|1",
58                    "X,0,X,X,X|1",
59                    "1,1,X,X,X|0",
60                    ""
61            };
62            setup_tt(tt, m_outs);
63        }
64    private:
65        static UINT32 m_outs[m_size];
66};
46NETLIB_TRUTHTABLE(7400, 2, 1, 0);
6747#endif
6848
6949
trunk/src/emu/netlist/devices/nld_7425.c
r31057r31058
1717
1818   register_subalias("4", m_1.m_i[2]);
1919   register_subalias("5", m_1.m_i[3]);
20   register_subalias("6", m_1.m_Q);
20   register_subalias("6", m_1.m_Q[0]);
2121
22   register_subalias("8", m_2.m_Q);
22   register_subalias("8", m_2.m_Q[0]);
2323   register_subalias("9", m_2.m_i[0]);
2424   register_subalias("10", m_2.m_i[1]);
2525
trunk/src/emu/netlist/devices/nld_7408.c
r31057r31058
1414
1515   register_subalias("1", m_1.m_i[0]);
1616   register_subalias("2", m_1.m_i[1]);
17   register_subalias("3", m_1.m_Q);
17   register_subalias("3", m_1.m_Q[0]);
1818
1919   register_subalias("4", m_2.m_i[0]);
2020   register_subalias("5", m_2.m_i[1]);
21   register_subalias("6", m_2.m_Q);
21   register_subalias("6", m_2.m_Q[0]);
2222
2323   register_subalias("9", m_3.m_i[0]);
2424   register_subalias("10", m_3.m_i[1]);
25   register_subalias("8", m_3.m_Q);
25   register_subalias("8", m_3.m_Q[0]);
2626
2727   register_subalias("12", m_4.m_i[0]);
2828   register_subalias("13", m_4.m_i[1]);
29   register_subalias("11", m_4.m_Q);
29   register_subalias("11", m_4.m_Q[0]);
3030}
3131
3232NETLIB_UPDATE(7408_dip)
trunk/src/emu/netlist/devices/nld_7427.c
r31057r31058
1616   register_subalias("3", m_2.m_i[0]);
1717   register_subalias("4", m_2.m_i[1]);
1818   register_subalias("5", m_2.m_i[2]);
19   register_subalias("6", m_2.m_Q);
19   register_subalias("6", m_2.m_Q[0]);
2020
21   register_subalias("8", m_3.m_Q);
21   register_subalias("8", m_3.m_Q[0]);
2222   register_subalias("9", m_3.m_i[0]);
2323   register_subalias("10", m_3.m_i[1]);
2424   register_subalias("11", m_3.m_i[2]);
2525
26   register_subalias("12", m_1.m_Q);
26   register_subalias("12", m_1.m_Q[0]);
2727   register_subalias("13", m_1.m_i[2]);
2828}
2929
trunk/src/emu/netlist/devices/nld_truthtable.h
r31057r31058
1010
1111#include "../nl_base.h"
1212
13template<int m_NI, int m_NO>
13#define NETLIB_TRUTHTABLE(_name, _nIN, _nOUT, _state)                               \
14    class NETLIB_NAME(_name) : public nld_truthtable_t<_nIN, _nOUT, _state>         \
15    {                                                                               \
16    public:                                                                         \
17        NETLIB_NAME(_name)()                                                        \
18        : nld_truthtable_t<_nIN, _nOUT, _state>(&m_ttbl, m_desc) { }                \
19    private:                                                                        \
20        static truthtable_t m_ttbl;                                                 \
21        static const char *m_desc[];                                                \
22    }
23
24
25template<int m_NI, int m_NO, int has_state>
1426class nld_truthtable_t : public netlist_device_t
1527{
1628public:
1729
18    static const int m_size = (1 << (2 * m_NI + m_NO));
30    static const int m_num_bits = m_NI + has_state * (m_NI + m_NO);
31    static const int m_size = (1 << (m_num_bits));
1932
20    nld_truthtable_t()
21    : netlist_device_t(), m_active(1)
33    struct truthtable_t
2234    {
35        truthtable_t() : m_initialized(false) {}
36        UINT32 m_outs[m_size];
37        UINT8  m_timing[m_size][m_NO];
38        netlist_time m_timing_nt[16];
39        bool m_initialized;
40    };
41
42    nld_truthtable_t(truthtable_t *ttbl, const char *desc[])
43    : netlist_device_t(), m_last_state(0), m_active(1), m_ttp(ttbl), m_desc(desc)
44    {
2345    }
2446
2547    ATTR_COLD virtual void start()
2648    {
49        pstring ttline = pstring(m_desc[0]);
50        {
51            nl_util::pstring_list io = nl_util::split(ttline,"|");
52            // checks
53            assert(io.count() == 2);
54            nl_util::pstring_list inout = nl_util::split(io[0], ",");
55            assert(inout.count() == m_num_bits);
56            nl_util::pstring_list out = nl_util::split(io[1], ",");
57            assert(out.count() == m_NO);
58
59            for (int i=0; i < m_NI; i++)
60            {
61                register_input(inout[i], m_i[i]);
62            }
63            for (int i=0; i < m_NO; i++)
64            {
65                register_output(out[i], m_Q[i]);
66            }
67        }
68        setup_tt();
69        // FIXME: save state
2770    }
2871
29    ATTR_COLD void help(UINT32 outs[], int cur, nl_util::pstring_list list, UINT64 state, UINT64 ignore, UINT16 val)
72    ATTR_COLD void help(int cur, nl_util::pstring_list list,
73            UINT64 state, UINT64 ignore, UINT16 val, UINT8 timing_index[m_NO])
3074    {
3175        pstring elem = list[cur];
3276        int start = 0;
r31057r31058
5498            const UINT64 nstate = state | (i << cur);
5599            const UINT64 nignore = ignore | (ign << cur);
56100
57            if (cur < list.count() - 1)
101            if (cur < m_num_bits - 1)
58102            {
59                help(outs, cur + 1, list, nstate, nignore, val);
103                help(cur + 1, list, nstate, nignore, val, timing_index);
60104            }
61105            else
62106            {
63107                // cutoff previous inputs and outputs for ignore
64                outs[nstate] = val | ((nignore & ((1 << m_NI)-1)) << m_NO);
108                m_ttp->m_outs[nstate] = val | ((nignore & ((1 << m_NI)-1)) << m_NO);
109                for (int j=0; j<m_NO; j++)
110                    m_ttp->m_timing[nstate][j] = timing_index[j];
65111            }
66112        }
67113    }
68114
69    ATTR_COLD void setup_tt(const char **truthtable, UINT32 outs[])
115    ATTR_COLD void setup_tt()
70116    {
117        if (m_ttp->m_initialized)
118            return;
119
120        const char **truthtable = m_desc;
71121        pstring ttline = pstring(truthtable[0]);
72122        truthtable++;
73        {
74            nl_util::pstring_list io = nl_util::split(ttline,"|");
75            // checks
76            assert(io.count() == 2);
77            nl_util::pstring_list inout = nl_util::split(io[0], ",");
78            assert(inout.count() == 2 * m_NI + m_NO);
79            nl_util::pstring_list out = nl_util::split(io[1], ",");
80            assert(out.count() == m_NO);
123        ttline = pstring(truthtable[0]);
124        truthtable++;
81125
82            for (int i=0; i < m_NI; i++)
83            {
84                register_input(inout[i], m_i[i]);
85            }
86            for (int i=0; i < m_NO; i++)
87            {
88                register_output(out[i], m_Q[i]);
89            }
90            //save(NAME(m_active));
91            ttline = pstring(truthtable[0]);
92            truthtable++;
93        }
94
95126        for (int j=0; j < m_size; j++)
96            outs[j] = -1;
127            m_ttp->m_outs[j] = -1;
97128
129        for (int j=0; j < 16; j++)
130            m_ttp->m_timing_nt[j] = netlist_time::zero;
131
98132        while (!ttline.equals(""))
99133        {
100134            nl_util::pstring_list io = nl_util::split(ttline,"|");
101135            // checks
102            assert(io.count() == 2);
136            assert(io.count() == 3);
103137            nl_util::pstring_list inout = nl_util::split(io[0], ",");
104            assert(inout.count() == 2 * m_NI + m_NO);
138            assert(inout.count() == m_num_bits);
105139            nl_util::pstring_list out = nl_util::split(io[1], ",");
106140            assert(out.count() == m_NO);
141            nl_util::pstring_list times = nl_util::split(io[2], ",");
142            assert(times.count() == m_NO);
107143
108144            UINT16 val = 0;
145            UINT8 tindex[m_NO];
109146            for (int j=0; j<m_NO; j++)
147            {
110148                if (out[j].equals("1"))
111149                    val = val | (1 << j);
150                netlist_time t = netlist_time::from_nsec(times[j].as_long());
151                int k=0;
152                while (m_ttp->m_timing_nt[k] != netlist_time::zero && m_ttp->m_timing_nt[k] != t)
153                    k++;
154                m_ttp->m_timing_nt[k] = t;
155                tindex[j] = k;
156            }
112157
113            help(outs, 0, inout, 0 , 0 , val);
158            help(0, inout, 0 , 0 , val, tindex);
114159            ttline = pstring(truthtable[0]);
115160            truthtable++;
116161        }
117162        for (int j=0; j < m_size; j++)
118            printf("%05x %04x %04x\n", j, outs[j] & ((1 << m_NO)-1), outs[j] >> m_NO);
119        m_ttp = outs;
163            printf("%05x %04x %04x %04x\n", j, m_ttp->m_outs[j] & ((1 << m_NO)-1),
164                    m_ttp->m_outs[j] >> m_NO, m_ttp->m_timing[j][0]);
165        for (int k=0; m_ttp->m_timing_nt[k] != netlist_time::zero; k++)
166            printf("%d %f\n", k, m_ttp->m_timing_nt[k].as_double() * 1000000.0);
167
168        m_ttp->m_initialized = true;
169
120170    }
121171
122172    ATTR_COLD void reset()
r31057r31058
128178
129179    ATTR_HOT ATTR_ALIGN void update()
130180    {
131        const netlist_time times[2] = { NLTIME_FROM_NS(15), NLTIME_FROM_NS(22)};
181        //const netlist_time times[2] = { NLTIME_FROM_NS(15), NLTIME_FROM_NS(22)};
132182
133183        // FIXME: this check is needed because update is called during startup as well
134184        if (UNEXPECTED(USE_DEACTIVE_DEVICE && m_active == 0))
r31057r31058
141191            state = state | (INPLOGIC(m_i[i]) << i);
142192        }
143193
144        const UINT32 nstate = state | (m_last_state << m_NI);
145        const UINT32 out = m_ttp[nstate] & ((1 << m_NO) - 1);
146        const UINT32 ign = m_ttp[nstate] >> m_NO;
194        const UINT32 nstate = (has_state ? state | (m_last_state << m_NI) : state);
195        const UINT32 out = m_ttp->m_outs[nstate] & ((1 << m_NO) - 1);
196        const UINT32 ign = m_ttp->m_outs[nstate] >> m_NO;
197        if (has_state) m_last_state = (state << m_NO) | out;
147198
148199        for (int i=0; i< m_NI; i++)
149200            if (ign & (1 << i))
150201                m_i[i].inactivate();
151202
152203        for (int i=0; i<m_NO; i++)
153            OUTLOGIC(m_Q[i], (out >> i) & 1, times[(out >> i) & 1]);// ? 22000 : 15000);
154        m_last_state = (state << m_NO) | out;
204//            OUTLOGIC(m_Q[i], (out >> i) & 1, times[(out >> i) & 1]);// ? 22000 : 15000);
205            OUTLOGIC(m_Q[i], (out >> i) & 1, m_ttp->m_timing_nt[m_ttp->m_timing[nstate][i]]);// ? 22000 : 15000);
155206
156207    }
157208
r31057r31058
175226    }
176227#endif
177228
178public:
179229    netlist_ttl_input_t m_i[m_NI];
180230    netlist_ttl_output_t m_Q[m_NO];
181231
182    UINT32 *m_ttp;
232private:
233
234    UINT32 m_last_state;
183235    INT32 m_active;
184    UINT32 m_last_state;
236
237    truthtable_t *m_ttp;
238    const char **m_desc;
185239};
186240
187241#endif /* NLD_TRUTHTABLE_H_ */
trunk/src/emu/netlist/devices/nld_7410.c
r31057r31058
1616   register_subalias("3", m_2.m_i[0]);
1717   register_subalias("4", m_2.m_i[1]);
1818   register_subalias("5", m_2.m_i[2]);
19   register_subalias("6", m_2.m_Q);
19   register_subalias("6", m_2.m_Q[0]);
2020
21   register_subalias("8", m_3.m_Q);
21   register_subalias("8", m_3.m_Q[0]);
2222   register_subalias("9", m_3.m_i[0]);
2323   register_subalias("10", m_3.m_i[1]);
2424   register_subalias("11", m_3.m_i[2]);
2525
26   register_subalias("12", m_1.m_Q);
26   register_subalias("12", m_1.m_Q[0]);
2727   register_subalias("13", m_1.m_i[2]);
2828}
2929
trunk/src/emu/netlist/devices/nld_7411.c
r31057r31058
1616   register_subalias("3", m_2.m_i[0]);
1717   register_subalias("4", m_2.m_i[1]);
1818   register_subalias("5", m_2.m_i[2]);
19   register_subalias("6", m_2.m_Q);
19   register_subalias("6", m_2.m_Q[0]);
2020
21   register_subalias("8", m_3.m_Q);
21   register_subalias("8", m_3.m_Q[0]);
2222   register_subalias("9", m_3.m_i[0]);
2323   register_subalias("10", m_3.m_i[1]);
2424   register_subalias("11", m_3.m_i[2]);
2525
26   register_subalias("12", m_1.m_Q);
26   register_subalias("12", m_1.m_Q[0]);
2727   register_subalias("13", m_1.m_i[2]);
2828}
2929
trunk/src/emu/netlist/devices/nld_7430.c
r31057r31058
1616   register_subalias("5", m_1.m_i[4]);
1717   register_subalias("6", m_1.m_i[5]);
1818
19   register_subalias("8", m_1.m_Q);
19   register_subalias("8", m_1.m_Q[0]);
2020
2121   register_subalias("11", m_1.m_i[6]);
2222   register_subalias("12", m_1.m_i[7]);
trunk/src/emu/netlist/devices/nld_7432.c
r31057r31058
1212   register_sub(m_3, "3");
1313   register_sub(m_4, "4");
1414
15   register_subalias("1", m_1.m_Q);
15   register_subalias("1", m_1.m_Q[0]);
1616   register_subalias("2", m_1.m_i[0]);
1717   register_subalias("3", m_1.m_i[1]);
1818
19   register_subalias("4", m_2.m_Q);
19   register_subalias("4", m_2.m_Q[0]);
2020   register_subalias("5", m_2.m_i[0]);
2121   register_subalias("6", m_2.m_i[1]);
2222
2323   register_subalias("8", m_3.m_i[0]);
2424   register_subalias("9", m_3.m_i[1]);
25   register_subalias("10", m_3.m_Q);
25   register_subalias("10", m_3.m_Q[0]);
2626
2727   register_subalias("11", m_4.m_i[0]);
2828   register_subalias("12", m_4.m_i[1]);
29   register_subalias("13", m_4.m_Q);
29   register_subalias("13", m_4.m_Q[0]);
3030}
3131
3232NETLIB_UPDATE(7432_dip)
trunk/src/emu/netlist/devices/nld_7437.c
r31057r31058
1414
1515   register_subalias("1", m_1.m_i[0]);
1616   register_subalias("2", m_1.m_i[1]);
17   register_subalias("3", m_1.m_Q);
17   register_subalias("3", m_1.m_Q[0]);
1818
1919   register_subalias("4", m_2.m_i[0]);
2020   register_subalias("5", m_2.m_i[1]);
21   register_subalias("6", m_2.m_Q);
21   register_subalias("6", m_2.m_Q[0]);
2222
2323   register_subalias("9", m_3.m_i[0]);
2424   register_subalias("10", m_3.m_i[1]);
25   register_subalias("8", m_3.m_Q);
25   register_subalias("8", m_3.m_Q[0]);
2626
2727   register_subalias("12", m_4.m_i[0]);
2828   register_subalias("13", m_4.m_i[1]);
29   register_subalias("11", m_4.m_Q);
29   register_subalias("11", m_4.m_Q[0]);
3030}
3131
3232NETLIB_UPDATE(7437_dip)
trunk/src/emu/netlist/nl_time.h
r31057r31058
4040   ATTR_HOT friend inline bool operator<(const netlist_time &left, const netlist_time &right);
4141   ATTR_HOT friend inline bool operator>=(const netlist_time &left, const netlist_time &right);
4242   ATTR_HOT friend inline bool operator<=(const netlist_time &left, const netlist_time &right);
43    ATTR_HOT friend inline bool operator!=(const netlist_time &left, const netlist_time &right);
4344
4445   ATTR_HOT inline const netlist_time &operator=(const netlist_time &right) { m_time = right.m_time; return *this; }
4546   ATTR_HOT inline const netlist_time &operator=(const double &right) { m_time = (INTERNALTYPE) ( right * (double) RESOLUTION); return *this; }
r31057r31058
111112   return (left.m_time >= right.m_time);
112113}
113114
115ATTR_HOT inline bool operator!=(const netlist_time &left, const netlist_time &right)
116{
117    return (left.m_time != right.m_time);
118}
114119
115120#endif /* NLTIME_H_ */

Previous 199869 Revisions Next


© 1997-2024 The MAME Team