Previous 199869 Revisions Next

r26440 Thursday 28th November, 2013 at 23:53:06 UTC by Couriersud
Netlist: Fixed design weakness. Subdevices now register their terminals. Devices can alias those terminals.
Now, e.g. a 7400 gate many be grouped into a quad nand package. This also enables using internal resistors and capacitors.
[src/emu/netlist]nl_base.c nl_base.h nl_setup.c
[src/emu/netlist/devices]net_lib.c net_lib.h nld_7474.c

trunk/src/emu/netlist/nl_base.h
r26439r26440
190190#define NETLIB_DEVICE(_name, _priv)                                                 \
191191      NETLIB_DEVICE_BASE(NETLIB_NAME(_name), netlist_device_t, , _priv)
192192
193#define NETLIB_SUBDEVICE(_name, _priv)                                              \
194   class NETLIB_NAME(_name) : public netlist_core_device_t                         \
195   {                                                                               \
196   public:                                                                         \
197      NETLIB_NAME(_name) ()                                                       \
198      : netlist_core_device_t()                                                   \
199         { }                                                                     \
200   /*protected:*/                                                                  \
201      ATTR_HOT void update();                                                     \
202      _priv                                                                       \
203   }
193#define NETLIB_SUBDEVICE(_name, _priv)                                             \
194    class NETLIB_NAME(_name) : public netlist_device_t                              \
195    {                                                                               \
196    public:                                                                         \
197        NETLIB_NAME(_name) ()                                                       \
198        : netlist_device_t()                                                        \
199            { }                                                                     \
200    /*protected:*/                                                                  \
201        ATTR_HOT void update();                                                     \
202        ATTR_HOT void start();                                                      \
203    public:                                                                         \
204        _priv                                                                       \
205    }
204206
205207#define NETLIB_DEVICE_WITH_PARAMS(_name, _priv)                                     \
206208        NETLIB_DEVICE_BASE(NETLIB_NAME(_name), netlist_device_t,                    \
r26439r26440
789791
790792   ATTR_COLD bool variable_input_count() { return m_variable_input_count; }
791793
792   ATTR_COLD void register_sub(netlist_core_device_t &dev, const pstring &name);
794   ATTR_COLD void register_sub(netlist_device_t &dev, const pstring &name);
795    ATTR_COLD void register_subalias(const pstring &name, netlist_terminal_t &term);
793796
794797    ATTR_COLD void register_terminal(const pstring &name, netlist_terminal_t &port);
795798
796799   ATTR_COLD void register_output(const pstring &name, netlist_output_t &out);
797   ATTR_COLD void register_output(netlist_core_device_t &dev, const pstring &name, netlist_output_t &out);
798800
799801   ATTR_COLD void register_input(const pstring &name, netlist_input_t &in, netlist_input_t::state_e state = netlist_input_t::STATE_INP_ACTIVE);
800   ATTR_COLD void register_input(netlist_core_device_t &dev, const pstring &name, netlist_input_t &in, netlist_input_t::state_e state = netlist_input_t::STATE_INP_ACTIVE);
801802
802803   ATTR_COLD void register_link_internal(netlist_input_t &in, netlist_output_t &out, netlist_input_t::state_e aState);
803804   ATTR_COLD void register_link_internal(netlist_core_device_t &dev, netlist_input_t &in, netlist_output_t &out, netlist_input_t::state_e aState);
trunk/src/emu/netlist/nl_setup.c
r26439r26440
230230
231231const pstring netlist_setup_t::resolve_alias(const pstring &name) const
232232{
233   const pstring temp = m_alias.find(name);
234   pstring ret = name;
235   if (temp != "")
236      ret = temp;
237   int p = ret.find(".[");
233    pstring temp = name;
234    pstring ret;
235
236    /* FIXME: Detect endless loop */
237    do {
238        ret = temp;
239        temp = m_alias.find(ret);
240    } while (temp != "");
241
242    int p = ret.find(".[");
238243   if (p > 0)
239244   {
240245       pstring dname = ret;
r26439r26440
242247       if (dev == NULL)
243248           fatalerror("Device for %s not found\n", name.cstr());
244249       int c = atoi(ret.substr(p+2,ret.len()-p-3));
245       ret = dev->name() + "." + dev->m_terminals.item(c)->object();
250       temp = dev->name() + "." + dev->m_terminals.item(c)->object();
251       // reresolve ....
252       do {
253           ret = temp;
254           temp = m_alias.find(ret);
255       } while (temp != "");
246256   }
247257
248258    //printf("%s==>%s\n", name.cstr(), ret.cstr());
trunk/src/emu/netlist/devices/nld_7474.c
r26439r26440
4747NETLIB_START(nic7474)
4848{
4949    register_sub(sub, "sub");
50    register_input(sub, "CLK",  sub.m_clk, netlist_input_t::STATE_INP_LH);
50
51    register_subalias("CLK",  sub.m_clk);
5152    register_input("D",    m_D);
5253    register_input("CLRQ", m_clrQ);
5354    register_input("PREQ", m_preQ);
5455
55    register_output(sub, "Q",   sub.m_Q);
56    register_output(sub, "QQ",  sub.m_QQ);
56    register_subalias("Q",   sub.m_Q);
57    register_subalias("QQ",  sub.m_QQ);
5758
58    sub.m_Q.initial(1);
59    sub.m_QQ.initial(0);
6059}
60
61NETLIB_START(nic7474sub)
62{
63    register_input("CLK",  m_clk, netlist_input_t::STATE_INP_LH);
64
65    register_output("Q",   m_Q);
66    register_output("QQ",  m_QQ);
67
68    m_Q.initial(1);
69    m_QQ.initial(0);
70}
trunk/src/emu/netlist/devices/net_lib.c
r26439r26440
270270{
271271   register_sub(sub, "sub");
272272
273   sub.m_state = 0;
274
275   register_input(sub, "A0", sub.m_A0);
276   register_input(sub, "A1", sub.m_A1);
277   register_input(sub, "A2", sub.m_A2);
278   register_input(sub, "A3", sub.m_A3);
273   register_subalias("A0", sub.m_A0);
274   register_subalias("A1", sub.m_A1);
275   register_subalias("A2", sub.m_A2);
276   register_subalias("A3", sub.m_A3);
279277   register_input("LTQ", m_LTQ);
280278   register_input("BIQ", m_BIQ);
281   register_input(sub, "RBIQ",sub.m_RBIQ);
279   register_subalias("RBIQ",sub.m_RBIQ);
282280
283   register_output(sub, "a", sub.m_a);
284   register_output(sub, "b", sub.m_b);
285   register_output(sub, "c", sub.m_c);
286   register_output(sub, "d", sub.m_d);
287   register_output(sub, "e", sub.m_e);
288   register_output(sub, "f", sub.m_f);
289   register_output(sub, "g", sub.m_g);
281   register_subalias("a", sub.m_a);
282   register_subalias("b", sub.m_b);
283   register_subalias("c", sub.m_c);
284   register_subalias("d", sub.m_d);
285   register_subalias("e", sub.m_e);
286   register_subalias("f", sub.m_f);
287   register_subalias("g", sub.m_g);
290288}
291289
292290NETLIB_UPDATE(nic7448)
r26439r26440
318316
319317}
320318
319NETLIB_START(nic7448_sub)
320{
321    m_state = 0;
322
323    register_input("A0", m_A0);
324    register_input("A1", m_A1);
325    register_input("A2", m_A2);
326    register_input("A3", m_A3);
327    register_input("RBIQ", m_RBIQ);
328
329    register_output("a", m_a);
330    register_output("b", m_b);
331    register_output("c", m_c);
332    register_output("d", m_d);
333    register_output("e", m_e);
334    register_output("f", m_f);
335    register_output("g", m_g);
336}
337
321338NETLIB_UPDATE(nic7448_sub)
322339{
323340   UINT8 v;
r26439r26440
511528   register_sub(C, "C");
512529   register_sub(D, "D");
513530
514   register_input(A, "CLKA", A.m_I, netlist_input_t::STATE_INP_HL);
515   register_input(B, "CLKB", B.m_I, netlist_input_t::STATE_INP_HL);
531   register_subalias("CLKA", A.m_I);
532   register_subalias("CLKB", B.m_I);
516533   register_input("R1",  m_R1);
517534   register_input("R2",  m_R2);
518535
519   register_output(A, "QA", A.m_Q);
520   register_output(B, "QB", B.m_Q);
521   register_output(C, "QC", C.m_Q);
522   register_output(D, "QD", D.m_Q);
536   register_subalias("QA", A.m_Q);
537   register_subalias("QB", B.m_Q);
538   register_subalias("QC", C.m_Q);
539   register_subalias("QD", D.m_Q);
523540
524541   register_link_internal(C, C.m_I, B.m_Q, netlist_input_t::STATE_INP_HL);
525542   register_link_internal(D, D.m_I, C.m_Q, netlist_input_t::STATE_INP_HL);
543}
526544
545NETLIB_START(nic7493ff)
546{
547    register_input("CLK", m_I, netlist_input_t::STATE_INP_HL);
548    register_output("Q", m_Q);
527549}
528550
529551NETLIB_UPDATE(nic7493ff)
r26439r26440
637659}
638660#endif
639661
662NETLIB_START(nic74107Asub)
663{
664    register_input("CLK", m_clk, netlist_input_t::STATE_INP_HL);
665    register_output("Q", m_Q);
666    register_output("QQ", m_QQ);
667
668    m_Q.initial(0);
669    m_QQ.initial(1);
670}
671
640672NETLIB_START(nic74107A)
641673{
642674   register_sub(sub, "sub");
643675
644   register_input(sub, "CLK", sub.m_clk, netlist_input_t::STATE_INP_HL);
676   register_subalias("CLK", sub.m_clk);
645677   register_input("J", m_J);
646678   register_input("K", m_K);
647679   register_input("CLRQ", m_clrQ);
648   register_output(sub, "Q", sub.m_Q);
649   register_output(sub, "QQ", sub.m_QQ);
680   register_subalias("Q", sub.m_Q);
681   register_subalias("QQ", sub.m_QQ);
650682
651683   sub.m_Q.initial(0);
652684   sub.m_QQ.initial(1);
r26439r26440
747779{
748780   register_sub(sub, "sub");
749781
750   sub.m_cnt = 0;
751   sub.m_loadq = 1;
752   sub.m_ent = 1;
782   register_subalias("CLK", sub.m_clk);
753783
754   register_input(sub, "CLK", sub.m_clk, netlist_input_t::STATE_INP_LH);
755
756784   register_input("ENP", m_ENP);
757785   register_input("ENT", m_ENT);
758786   register_input("CLRQ", m_CLRQ);
759787   register_input("LOADQ", m_LOADQ);
760788
761   register_input(sub, "A", sub.m_A, netlist_input_t::STATE_INP_PASSIVE);
762   register_input(sub, "B", sub.m_B, netlist_input_t::STATE_INP_PASSIVE);
763   register_input(sub, "C", sub.m_C, netlist_input_t::STATE_INP_PASSIVE);
764   register_input(sub, "D", sub.m_D, netlist_input_t::STATE_INP_PASSIVE);
789   register_subalias("A", sub.m_A);
790   register_subalias("B", sub.m_B);
791   register_subalias("C", sub.m_C);
792   register_subalias("D", sub.m_D);
765793
766   register_output(sub, "QA", sub.m_QA);
767   register_output(sub, "QB", sub.m_QB);
768   register_output(sub, "QC", sub.m_QC);
769   register_output(sub, "QD", sub.m_QD);
770   register_output(sub, "RC", sub.m_RC);
794   register_subalias("QA", sub.m_QA);
795   register_subalias("QB", sub.m_QB);
796   register_subalias("QC", sub.m_QC);
797   register_subalias("QD", sub.m_QD);
798   register_subalias("RC", sub.m_RC);
771799
772800}
773801
802NETLIB_START(nic9316_sub)
803{
804    m_cnt = 0;
805    m_loadq = 1;
806    m_ent = 1;
807
808    register_input("CLK", m_clk, netlist_input_t::STATE_INP_LH);
809
810    register_input("A", m_A, netlist_input_t::STATE_INP_PASSIVE);
811    register_input("B", m_B, netlist_input_t::STATE_INP_PASSIVE);
812    register_input("C", m_C, netlist_input_t::STATE_INP_PASSIVE);
813    register_input("D", m_D, netlist_input_t::STATE_INP_PASSIVE);
814
815    register_output("QA", m_QA);
816    register_output("QB", m_QB);
817    register_output("QC", m_QC);
818    register_output("QD", m_QD);
819    register_output("RC", m_RC);
820
821}
822
774823NETLIB_UPDATE(nic9316_sub)
775824{
776825   if (m_loadq)
trunk/src/emu/netlist/devices/net_lib.h
r26439r26440
286286 * For modelling purposes, we assume 74107 and 74107A are the same
287287 */
288288
289
290289NETLIB_SUBDEVICE(nic74107Asub,
291   netlist_ttl_input_t m_clk;
290    netlist_ttl_input_t m_clk;
292291
293292   netlist_ttl_output_t m_Q;
294293   netlist_ttl_output_t m_QQ;
trunk/src/emu/netlist/nl_base.c
r26439r26440
261261}
262262
263263
264ATTR_COLD void netlist_device_t::register_sub(netlist_core_device_t &dev, const pstring &name)
264ATTR_COLD void netlist_device_t::register_sub(netlist_device_t &dev, const pstring &name)
265265{
266266   dev.init(*m_setup, this->name() + "." + name);
267267}
268268
269ATTR_COLD void netlist_device_t::register_output(netlist_core_device_t &dev, const pstring &name, netlist_output_t &port)
269ATTR_COLD void netlist_device_t::register_subalias(const pstring &name, netlist_terminal_t &term)
270270{
271   m_setup->register_object(*this, dev, name, port, netlist_terminal_t::STATE_OUT);
271    pstring alias = this->name() + "." + name;
272
273    //printf("alias: %s\n", alias.cstr());
274
275    m_setup->register_alias(alias, term.name());
276
277    if (term.isType(netlist_terminal_t::INPUT))
278        m_terminals.add(name);
272279}
273280
274281ATTR_COLD void netlist_device_t::register_terminal(const pstring &name, netlist_terminal_t &port)
r26439r26440
281288   m_setup->register_object(*this,*this,name, port, netlist_terminal_t::STATE_OUT);
282289}
283290
284ATTR_COLD void netlist_device_t::register_input(netlist_core_device_t &dev, const pstring &name, netlist_input_t &inp, netlist_input_t::state_e type)
291ATTR_COLD void netlist_device_t::register_input(const pstring &name, netlist_input_t &inp, netlist_input_t::state_e type)
285292{
286293    m_terminals.add(name);
287   m_setup->register_object(*this, dev, name, inp, type);
294    m_setup->register_object(*this, *this, name, inp, type);
288295}
289296
290ATTR_COLD void netlist_device_t::register_input(const pstring &name, netlist_input_t &inp, netlist_input_t::state_e type)
291{
292   register_input(*this, name, inp, type);
293}
294
295297static void init_term(netlist_core_device_t &dev, netlist_terminal_t &term, netlist_input_t::state_e aState)
296298{
297299    if (!term.isInitalized())

Previous 199869 Revisions Next


© 1997-2024 The MAME Team