mirror of
https://github.com/holub/mame
synced 2025-07-07 10:58:41 +03:00
Netlist: Class factory is now initialized dynamically.
Note: Please delete all netlist related object files prior to compiling, e.g.: rm -rf obj/windowsd/mame/drivers/pong.o obj/windowsd/emu/machine/net* obj/windowsd/emu/netlist/
This commit is contained in:
parent
954b9ff18e
commit
445a95b4fd
@ -901,10 +901,10 @@ NETLIB_FUNC_VOID(nic9316_sub, update_outputs, (void))
|
|||||||
}
|
}
|
||||||
|
|
||||||
#define xstr(s) # s
|
#define xstr(s) # s
|
||||||
#define ENTRY1(_nic, _name) new net_device_t_factory< _nic >( # _name, xstr(_nic) ),
|
#define ENTRY1(_nic, _name) m_list.add(new net_device_t_factory< _nic >( # _name, xstr(_nic) ));
|
||||||
#define ENTRY(_nic, _name) ENTRY1(NETLIB_NAME(_nic), _name)
|
#define ENTRY(_nic, _name) ENTRY1(NETLIB_NAME(_nic), _name)
|
||||||
|
|
||||||
static const net_device_t_base_factory *netregistry[] =
|
void netlist_factory::initialize()
|
||||||
{
|
{
|
||||||
ENTRY(R, NETDEV_R)
|
ENTRY(R, NETDEV_R)
|
||||||
ENTRY(C, NETDEV_C)
|
ENTRY(C, NETDEV_C)
|
||||||
@ -942,17 +942,16 @@ static const net_device_t_base_factory *netregistry[] =
|
|||||||
ENTRY(nic9316, TTL_9316)
|
ENTRY(nic9316, TTL_9316)
|
||||||
ENTRY(NE555, NETDEV_NE555)
|
ENTRY(NE555, NETDEV_NE555)
|
||||||
ENTRY(nicNE555N_MSTABLE, NE555N_MSTABLE)
|
ENTRY(nicNE555N_MSTABLE, NE555N_MSTABLE)
|
||||||
NULL
|
}
|
||||||
};
|
|
||||||
|
|
||||||
netlist_device_t *net_create_device_by_classname(const pstring &classname, netlist_setup_t &setup)
|
netlist_device_t *netlist_factory::new_device_by_classname(const pstring &classname, netlist_setup_t &setup) const
|
||||||
{
|
{
|
||||||
const net_device_t_base_factory **p = &netregistry[0];
|
for (list_t::entry_t *e = m_list.first(); e != NULL; e = m_list.next(e))
|
||||||
while (*p != NULL)
|
|
||||||
{
|
{
|
||||||
if (strcmp((*p)->classname(), classname) == 0)
|
net_device_t_base_factory *p = e->object();
|
||||||
|
if (strcmp(p->classname(), classname) == 0)
|
||||||
{
|
{
|
||||||
netlist_device_t *ret = (*p)->Create();
|
netlist_device_t *ret = p->Create();
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
p++;
|
p++;
|
||||||
@ -961,15 +960,14 @@ netlist_device_t *net_create_device_by_classname(const pstring &classname, netli
|
|||||||
return NULL; // appease code analysis
|
return NULL; // appease code analysis
|
||||||
}
|
}
|
||||||
|
|
||||||
netlist_device_t *net_create_device_by_name(const pstring &name, netlist_setup_t &setup)
|
netlist_device_t *netlist_factory::new_device_by_name(const pstring &name, netlist_setup_t &setup) const
|
||||||
{
|
{
|
||||||
const net_device_t_base_factory **p = &netregistry[0];
|
for (list_t::entry_t *e = m_list.first(); e != NULL; e = m_list.next(e))
|
||||||
while (*p != NULL)
|
|
||||||
{
|
{
|
||||||
if (strcmp((*p)->name(), name) == 0)
|
net_device_t_base_factory *p = e->object();
|
||||||
|
if (strcmp(p->name(), name) == 0)
|
||||||
{
|
{
|
||||||
netlist_device_t *ret = (*p)->Create();
|
netlist_device_t *ret = p->Create();
|
||||||
//ret->init(setup, icname);
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
p++;
|
p++;
|
||||||
@ -977,3 +975,4 @@ netlist_device_t *net_create_device_by_name(const pstring &name, netlist_setup_t
|
|||||||
fatalerror("Class %s not found!\n", name.cstr());
|
fatalerror("Class %s not found!\n", name.cstr());
|
||||||
return NULL; // appease code analysis
|
return NULL; // appease code analysis
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -41,4 +41,36 @@
|
|||||||
|
|
||||||
NETLIB_SIGNAL(7400, 2, 0, 0);
|
NETLIB_SIGNAL(7400, 2, 0, 0);
|
||||||
|
|
||||||
|
NETLIB_DEVICE(7400pin,
|
||||||
|
|
||||||
|
NETLIB_NAME(7400) m_1;
|
||||||
|
NETLIB_NAME(7400) m_2;
|
||||||
|
NETLIB_NAME(7400) m_3;
|
||||||
|
NETLIB_NAME(7400) m_4;
|
||||||
|
);
|
||||||
|
|
||||||
|
inline NETLIB_START(7400pin)
|
||||||
|
{
|
||||||
|
register_sub(m_1, "1");
|
||||||
|
register_sub(m_2, "2");
|
||||||
|
register_sub(m_3, "3");
|
||||||
|
register_sub(m_4, "4");
|
||||||
|
|
||||||
|
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("4", m_2.m_i[0]);
|
||||||
|
register_subalias("5", m_2.m_i[1]);
|
||||||
|
register_subalias("6", m_2.m_Q);
|
||||||
|
|
||||||
|
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("12", m_4.m_i[0]);
|
||||||
|
register_subalias("13", m_4.m_i[1]);
|
||||||
|
register_subalias("11", m_4.m_Q);
|
||||||
|
}
|
||||||
|
|
||||||
#endif /* NLD_7400_H_ */
|
#endif /* NLD_7400_H_ */
|
||||||
|
@ -4,6 +4,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include "nld_log.h"
|
#include "nld_log.h"
|
||||||
|
#include "sound/wavwrite.h"
|
||||||
|
|
||||||
NETLIB_START(log)
|
NETLIB_START(log)
|
||||||
{
|
{
|
||||||
@ -22,3 +23,25 @@ NETLIB_NAME(log)::~NETLIB_NAME(log)()
|
|||||||
{
|
{
|
||||||
fclose(m_file);
|
fclose(m_file);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// FIXME: Implement wav later, this must be clock triggered device where the input to be written
|
||||||
|
// is on a subdevice ...
|
||||||
|
#if 0
|
||||||
|
NETLIB_START(wav)
|
||||||
|
{
|
||||||
|
register_input("I", m_I);
|
||||||
|
|
||||||
|
pstring filename = "netlist_" + name() + ".wav";
|
||||||
|
m_file = wav_open(filename, sample_rate(), active_inputs()/2)
|
||||||
|
}
|
||||||
|
|
||||||
|
NETLIB_UPDATE(wav)
|
||||||
|
{
|
||||||
|
fprintf(m_file, "%e %e\n", netlist().time().as_double(), INPANALOG(m_I));
|
||||||
|
}
|
||||||
|
|
||||||
|
NETLIB_NAME(log)::~NETLIB_NAME(wav)()
|
||||||
|
{
|
||||||
|
fclose(m_file);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
@ -31,4 +31,14 @@ private:
|
|||||||
FILE *m_file;
|
FILE *m_file;
|
||||||
);
|
);
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
NETLIB_DEVICE(wav,
|
||||||
|
~NETLIB_NAME(wav)();
|
||||||
|
netlist_analog_input_t m_I;
|
||||||
|
private:
|
||||||
|
// FIXME: rewrite sound/wavwrite.h to be an object ...
|
||||||
|
void *m_file;
|
||||||
|
);
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif /* NLD_LOG_H_ */
|
#endif /* NLD_LOG_H_ */
|
||||||
|
@ -89,7 +89,7 @@ NETLIB_START(solver)
|
|||||||
register_param("SYNC_DELAY", m_sync_delay, NLTIME_FROM_NS(10).as_double());
|
register_param("SYNC_DELAY", m_sync_delay, NLTIME_FROM_NS(10).as_double());
|
||||||
m_nt_sync_delay = m_sync_delay.Value();
|
m_nt_sync_delay = m_sync_delay.Value();
|
||||||
|
|
||||||
register_param("FREQ", m_freq, 50000.0);
|
register_param("FREQ", m_freq, 48000.0);
|
||||||
m_inc = netlist_time::from_hz(m_freq.Value());
|
m_inc = netlist_time::from_hz(m_freq.Value());
|
||||||
|
|
||||||
register_link_internal(m_fb_sync, m_Q_sync, netlist_input_t::STATE_INP_ACTIVE);
|
register_link_internal(m_fb_sync, m_Q_sync, netlist_input_t::STATE_INP_ACTIVE);
|
||||||
|
@ -1139,8 +1139,21 @@ public:
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
netlist_device_t *net_create_device_by_classname(const pstring &classname, netlist_setup_t &setup);
|
class netlist_factory
|
||||||
netlist_device_t *net_create_device_by_name(const pstring &name, netlist_setup_t &setup);
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
void initialize();
|
||||||
|
|
||||||
|
netlist_device_t *new_device_by_classname(const pstring &classname, netlist_setup_t &setup) const;
|
||||||
|
netlist_device_t *new_device_by_name(const pstring &name, netlist_setup_t &setup) const;
|
||||||
|
|
||||||
|
private:
|
||||||
|
typedef netlist_list_t<net_device_t_base_factory *> list_t;
|
||||||
|
list_t m_list;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#endif /* NLBASE_H_ */
|
#endif /* NLBASE_H_ */
|
||||||
|
@ -16,8 +16,6 @@
|
|||||||
// SETUP
|
// SETUP
|
||||||
//============================================================
|
//============================================================
|
||||||
|
|
||||||
//#define astring breakme()
|
|
||||||
|
|
||||||
#define USE_DELEGATES (0)
|
#define USE_DELEGATES (0)
|
||||||
/*
|
/*
|
||||||
* The next options needs -Wno-pmf-conversions to compile and gcc
|
* The next options needs -Wno-pmf-conversions to compile and gcc
|
||||||
|
@ -75,12 +75,12 @@ public:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ATTR_HOT inline entry_t *first() { return (m_ptr >= m_list ? &m_list[0] : NULL ); }
|
ATTR_HOT inline entry_t *first() const { return (m_ptr >= m_list ? &m_list[0] : NULL ); }
|
||||||
ATTR_HOT inline entry_t *next(entry_t *lc) { return (lc < last() ? lc + 1 : NULL ); }
|
ATTR_HOT inline entry_t *next(entry_t *lc) const { return (lc < last() ? lc + 1 : NULL ); }
|
||||||
ATTR_HOT inline entry_t *last() { return m_ptr; }
|
ATTR_HOT inline entry_t *last() const { return m_ptr; }
|
||||||
ATTR_HOT inline entry_t *item(int i) { return &m_list[i]; }
|
ATTR_HOT inline entry_t *item(int i) const { return &m_list[i]; }
|
||||||
ATTR_HOT inline int count() const { return m_ptr - m_list + 1; }
|
ATTR_HOT inline int count() const { return m_ptr - m_list + 1; }
|
||||||
ATTR_HOT inline bool empty() { return (m_ptr < m_list); }
|
ATTR_HOT inline bool empty() const { return (m_ptr < m_list); }
|
||||||
ATTR_HOT inline void reset() { m_ptr = m_list - 1; }
|
ATTR_HOT inline void reset() { m_ptr = m_list - 1; }
|
||||||
private:
|
private:
|
||||||
entry_t * m_ptr;
|
entry_t * m_ptr;
|
||||||
|
@ -67,7 +67,7 @@ void netlist_parser::netdev_const(const pstring &dev_name)
|
|||||||
|
|
||||||
skipws();
|
skipws();
|
||||||
name = getname(',');
|
name = getname(',');
|
||||||
dev = net_create_device_by_name(dev_name, m_setup);
|
dev = m_setup.factory().new_device_by_name(dev_name, m_setup);
|
||||||
m_setup.register_dev(dev, name);
|
m_setup.register_dev(dev, name);
|
||||||
skipws();
|
skipws();
|
||||||
val = eval_param();
|
val = eval_param();
|
||||||
@ -86,7 +86,7 @@ void netlist_parser::netdev_device(const pstring &dev_type)
|
|||||||
|
|
||||||
skipws();
|
skipws();
|
||||||
devname = getname2(',', ')');
|
devname = getname2(',', ')');
|
||||||
dev = net_create_device_by_name(dev_type, m_setup);
|
dev = m_setup.factory().new_device_by_name(dev_type, m_setup);
|
||||||
m_setup.register_dev(dev, devname);
|
m_setup.register_dev(dev, devname);
|
||||||
skipws();
|
skipws();
|
||||||
NL_VERBOSE_OUT(("Parser: IC: %s\n", devname.cstr()));
|
NL_VERBOSE_OUT(("Parser: IC: %s\n", devname.cstr()));
|
||||||
|
@ -25,6 +25,7 @@ netlist_setup_t::netlist_setup_t(netlist_base_t &netlist)
|
|||||||
: m_netlist(netlist)
|
: m_netlist(netlist)
|
||||||
, m_proxy_cnt(0)
|
, m_proxy_cnt(0)
|
||||||
{
|
{
|
||||||
|
m_factory.initialize();
|
||||||
NETLIST_NAME(base)(*this);
|
NETLIST_NAME(base)(*this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -20,7 +20,7 @@
|
|||||||
|
|
||||||
#define NET_ALIAS(_alias, _name) \
|
#define NET_ALIAS(_alias, _name) \
|
||||||
netlist.register_alias(# _alias, # _name);
|
netlist.register_alias(# _alias, # _name);
|
||||||
#define NET_NEW(_type) net_create_device_by_classname(NETLIB_NAME_STR(_type), netlist)
|
#define NET_NEW(_type) netlist.factory().new_device_by_classname(NETLIB_NAME_STR(_type), netlist)
|
||||||
|
|
||||||
#define NET_REGISTER_DEV(_type, _name) \
|
#define NET_REGISTER_DEV(_type, _name) \
|
||||||
netlist.register_dev(NET_NEW(_type), # _name);
|
netlist.register_dev(NET_NEW(_type), # _name);
|
||||||
@ -98,6 +98,7 @@ public:
|
|||||||
~netlist_setup_t();
|
~netlist_setup_t();
|
||||||
|
|
||||||
netlist_base_t &netlist() { return m_netlist; }
|
netlist_base_t &netlist() { return m_netlist; }
|
||||||
|
netlist_factory &factory() { return m_factory; }
|
||||||
|
|
||||||
netlist_device_t *register_dev(netlist_device_t *dev, const pstring &name);
|
netlist_device_t *register_dev(netlist_device_t *dev, const pstring &name);
|
||||||
void remove_dev(const pstring &name);
|
void remove_dev(const pstring &name);
|
||||||
@ -140,6 +141,8 @@ private:
|
|||||||
tagmap_link_t m_links;
|
tagmap_link_t m_links;
|
||||||
tagmap_nstring_t m_params_temp;
|
tagmap_nstring_t m_params_temp;
|
||||||
|
|
||||||
|
netlist_factory m_factory;
|
||||||
|
|
||||||
int m_proxy_cnt;
|
int m_proxy_cnt;
|
||||||
|
|
||||||
void connect_terminals(netlist_core_terminal_t &in, netlist_core_terminal_t &out);
|
void connect_terminals(netlist_core_terminal_t &in, netlist_core_terminal_t &out);
|
||||||
|
@ -7,6 +7,8 @@
|
|||||||
#include <cstdio>
|
#include <cstdio>
|
||||||
|
|
||||||
|
|
||||||
|
// The following will work on linux, however not on Windows ....
|
||||||
|
|
||||||
//pblockpool *pstring::m_pool = new pblockpool;
|
//pblockpool *pstring::m_pool = new pblockpool;
|
||||||
//pstring::str_t *pstring::m_zero = new(pstring::m_pool, 0) pstring::str_t(0);
|
//pstring::str_t *pstring::m_zero = new(pstring::m_pool, 0) pstring::str_t(0);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user