summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author couriersud <couriersud@arcor.de>2016-05-14 15:17:21 +0200
committer couriersud <couriersud@arcor.de>2016-05-16 12:41:20 +0200
commitf35ba3f5fdbc8394864863bca70d5b31fa582cfe (patch)
tree0b8f38c46f8a5d996333f989a9dc1c31a85e6d3d
parentef7d6d98d85fddd606f0237f2a4bfff1abeb81f5 (diff)
More automatic memory handling. (nw)
-rw-r--r--src/devices/machine/netlist.cpp5
-rw-r--r--src/lib/netlist/nl_base.cpp19
-rw-r--r--src/lib/netlist/nl_base.h16
-rw-r--r--src/lib/netlist/nl_factory.cpp4
-rw-r--r--src/lib/netlist/nl_factory.h2
-rw-r--r--src/lib/netlist/nl_setup.cpp43
-rw-r--r--src/lib/netlist/nl_setup.h11
-rw-r--r--src/lib/netlist/plib/pstate.cpp24
-rw-r--r--src/lib/netlist/plib/pstate.h4
-rw-r--r--src/lib/netlist/tools/nl_convert.cpp31
-rw-r--r--src/lib/netlist/tools/nl_convert.h15
11 files changed, 84 insertions, 90 deletions
diff --git a/src/devices/machine/netlist.cpp b/src/devices/machine/netlist.cpp
index 0456b1f5f5b..b5ee493caba 100644
--- a/src/devices/machine/netlist.cpp
+++ b/src/devices/machine/netlist.cpp
@@ -100,7 +100,7 @@ void netlist_mame_analog_output_t::custom_netlist_additions(netlist::setup_t &se
pstring dname = "OUT_" + m_in;
m_delegate.bind_relative_to(owner()->machine().root_device());
- NETLIB_NAME(analog_callback) *dev = palloc(NETLIB_NAME(analog_callback)(setup.netlist(), setup.build_fqn(dname)));
+ auto dev = std::make_shared<NETLIB_NAME(analog_callback)>(setup.netlist(), setup.build_fqn(dname));
setup.register_dev(dev);
dev->register_callback(m_delegate);
setup.register_link(dname + ".IN", m_in);
@@ -399,9 +399,8 @@ ATTR_HOT ATTR_ALIGN void netlist_mame_device_t::check_mame_abort_slice()
ATTR_COLD void netlist_mame_device_t::save_state()
{
- for (int i=0; i< netlist().save_list().size(); i++)
+ for (auto const & s : netlist().save_list())
{
- pstate_entry_t *s = netlist().save_list()[i];
netlist().log().debug("saving state for {1}\n", s->m_name.cstr());
switch (s->m_dt)
{
diff --git a/src/lib/netlist/nl_base.cpp b/src/lib/netlist/nl_base.cpp
index 7436a8e870a..5fc5a4b1bab 100644
--- a/src/lib/netlist/nl_base.cpp
+++ b/src/lib/netlist/nl_base.cpp
@@ -38,9 +38,9 @@ public:
m_R_high = 130.0;
m_is_static = true;
}
- virtual devices::nld_base_d_to_a_proxy *create_d_a_proxy(netlist_t &anetlist, const pstring &name, logic_output_t *proxied) const override
+ virtual std::shared_ptr<devices::nld_base_d_to_a_proxy> create_d_a_proxy(netlist_t &anetlist, const pstring &name, logic_output_t *proxied) const override
{
- return palloc(devices::nld_d_to_a_proxy(anetlist, name, proxied));
+ return std::make_shared<devices::nld_d_to_a_proxy>(anetlist, name, proxied);
}
};
@@ -59,9 +59,9 @@ public:
m_R_high = 10.0;
m_is_static = true;
}
- virtual devices::nld_base_d_to_a_proxy *create_d_a_proxy(netlist_t &anetlist, const pstring &name, logic_output_t *proxied) const override
+ virtual std::shared_ptr<devices::nld_base_d_to_a_proxy> create_d_a_proxy(netlist_t &anetlist, const pstring &name, logic_output_t *proxied) const override
{
- return palloc(devices::nld_d_to_a_proxy(anetlist, name, proxied));
+ return std::make_shared<devices::nld_d_to_a_proxy>(anetlist, name, proxied);
}
};
@@ -213,7 +213,8 @@ netlist_t::~netlist_t()
{
m_nets.clear();
- m_devices.clear_and_free();
+ m_devices.clear();
+ //m_devices.clear_and_free();
pfree(m_lib);
pstring::resetmem();
@@ -254,8 +255,8 @@ ATTR_COLD void netlist_t::start()
m_use_deactivate = (m_params->m_use_deactivate.Value() ? true : false);
log().debug("Initializing devices ...\n");
- for (device_t *dev : m_devices)
- if (dev != m_solver && dev != m_params)
+ for (auto &dev : m_devices)
+ if (dev.get() != m_solver && dev.get() != m_params)
dev->start_dev();
}
@@ -265,7 +266,7 @@ ATTR_COLD void netlist_t::stop()
/* find the main clock and solver ... */
log().debug("Stopping all devices ...\n");
- for (device_t *dev : m_devices)
+ for (auto & dev : m_devices)
dev->stop_dev();
}
@@ -312,7 +313,7 @@ ATTR_COLD void netlist_t::reset()
// FIXME: some const devices rely on this
/* make sure params are set now .. */
- for (device_t *dev : m_devices)
+ for (auto & dev : m_devices)
{
dev->update_param();
}
diff --git a/src/lib/netlist/nl_base.h b/src/lib/netlist/nl_base.h
index b71eb351e77..bf9e9e09fb5 100644
--- a/src/lib/netlist/nl_base.h
+++ b/src/lib/netlist/nl_base.h
@@ -319,7 +319,7 @@ namespace netlist
public:
logic_family_desc_t() : m_is_static(false) {}
virtual ~logic_family_desc_t() {}
- virtual devices::nld_base_d_to_a_proxy *create_d_a_proxy(netlist_t &anetlist, const pstring &name,
+ virtual std::shared_ptr<devices::nld_base_d_to_a_proxy> create_d_a_proxy(netlist_t &anetlist, const pstring &name,
logic_output_t *proxied) const = 0;
nl_double m_low_thresh_V;
@@ -1229,9 +1229,9 @@ namespace netlist
ATTR_COLD pvector_t<_device_class *> get_device_list()
{
pvector_t<_device_class *> tmp;
- for (std::size_t i = 0; i < m_devices.size(); i++)
+ for (auto &d : m_devices)
{
- _device_class *dev = dynamic_cast<_device_class *>(m_devices[i]);
+ _device_class *dev = dynamic_cast<_device_class *>(d.get());
if (dev != nullptr)
tmp.push_back(dev);
}
@@ -1241,9 +1241,9 @@ namespace netlist
template<class _device_class>
ATTR_COLD _device_class *get_first_device()
{
- for (std::size_t i = 0; i < m_devices.size(); i++)
+ for (auto &d : m_devices)
{
- _device_class *dev = dynamic_cast<_device_class *>(m_devices[i]);
+ _device_class *dev = dynamic_cast<_device_class *>(d.get());
if (dev != nullptr)
return dev;
}
@@ -1254,9 +1254,9 @@ namespace netlist
ATTR_COLD _device_class *get_single_device(const char *classname)
{
_device_class *ret = nullptr;
- for (std::size_t i = 0; i < m_devices.size(); i++)
+ for (auto &d : m_devices)
{
- _device_class *dev = dynamic_cast<_device_class *>(m_devices[i]);
+ _device_class *dev = dynamic_cast<_device_class *>(d.get());
if (dev != nullptr)
{
if (ret != nullptr)
@@ -1268,7 +1268,7 @@ namespace netlist
return ret;
}
- pvector_t<device_t *> m_devices;
+ pvector_t<std::shared_ptr<device_t>> m_devices;
net_t::list_t m_nets;
#if (NL_KEEP_STATISTICS)
pvector_t<core_device_t *> m_started_devices;
diff --git a/src/lib/netlist/nl_factory.cpp b/src/lib/netlist/nl_factory.cpp
index 76ef3c03016..940e0ae656d 100644
--- a/src/lib/netlist/nl_factory.cpp
+++ b/src/lib/netlist/nl_factory.cpp
@@ -71,10 +71,10 @@ void factory_list_t::error(const pstring &s)
m_setup.log().fatal("{1}", s);
}
-device_t *factory_list_t::new_device_by_name(const pstring &devname, netlist_t &anetlist, const pstring &name)
+std::shared_ptr<device_t> factory_list_t::new_device_by_name(const pstring &devname, netlist_t &anetlist, const pstring &name)
{
base_factory_t *f = factory_by_name(devname);
- return f->Create(anetlist, name);
+ return std::shared_ptr<device_t>(f->Create(anetlist, name));
}
base_factory_t * factory_list_t::factory_by_name(const pstring &devname)
diff --git a/src/lib/netlist/nl_factory.h b/src/lib/netlist/nl_factory.h
index 15667696807..4a08b969923 100644
--- a/src/lib/netlist/nl_factory.h
+++ b/src/lib/netlist/nl_factory.h
@@ -83,7 +83,7 @@ namespace netlist
//ATTR_COLD device_t *new_device_by_classname(const pstring &classname) const;
// FIXME: legacy, should use factory_by_name
- device_t *new_device_by_name(const pstring &devname, netlist_t &anetlist, const pstring &name);
+ std::shared_ptr<device_t> new_device_by_name(const pstring &devname, netlist_t &anetlist, const pstring &name);
base_factory_t * factory_by_name(const pstring &devname);
private:
diff --git a/src/lib/netlist/nl_setup.cpp b/src/lib/netlist/nl_setup.cpp
index b557bf8a839..35807c000bb 100644
--- a/src/lib/netlist/nl_setup.cpp
+++ b/src/lib/netlist/nl_setup.cpp
@@ -99,7 +99,7 @@ void setup_t::namespace_pop()
}
-void setup_t::register_dev(device_t *dev)
+void setup_t::register_dev(std::shared_ptr<device_t> dev)
{
for (auto & d : netlist().m_devices)
if (d->name() == dev->name())
@@ -126,17 +126,10 @@ void setup_t::register_dev(const pstring &classname, const pstring &name)
}
else
{
-#if 0
- device_t *dev = factory().new_device_by_name(classname, netlist(), build_fqn(name));
- if (dev == nullptr)
- log().fatal("Class {1} not found!\n", classname);
- register_dev(dev);
-#else
auto f = factory().factory_by_name(classname);
if (f == nullptr)
log().fatal("Class {1} not found!\n", classname);
m_device_factory.push_back(std::pair<pstring, base_factory_t *>(build_fqn(name), f));
-#endif
}
}
@@ -503,11 +496,11 @@ devices::nld_base_proxy *setup_t::get_d_a_proxy(core_terminal_t &out)
{
// create a new one ...
pstring x = pfmt("proxy_da_{1}_{2}")(out.name())(m_proxy_cnt);
- devices::nld_base_d_to_a_proxy *new_proxy =
+ auto new_proxy =
out_cast.logic_family()->create_d_a_proxy(netlist(), x, &out_cast);
m_proxy_cnt++;
- register_dev(new_proxy);
+ register_dev_s(new_proxy);
new_proxy->start_dev();
/* connect all existing terminals to new net */
@@ -521,8 +514,8 @@ devices::nld_base_proxy *setup_t::get_d_a_proxy(core_terminal_t &out)
out.net().m_core_terms.clear(); // clear the list
out.net().register_con(new_proxy->in());
- out_cast.set_proxy(new_proxy);
- proxy = new_proxy;
+ out_cast.set_proxy(new_proxy.get());
+ proxy = new_proxy.get();
}
return proxy;
}
@@ -533,11 +526,11 @@ void setup_t::connect_input_output(core_terminal_t &in, core_terminal_t &out)
{
logic_input_t &incast = dynamic_cast<logic_input_t &>(in);
pstring x = pfmt("proxy_ad_{1}_{2}")(in.name())( m_proxy_cnt);
- devices::nld_a_to_d_proxy *proxy = palloc(devices::nld_a_to_d_proxy(netlist(), x, &incast));
- incast.set_proxy(proxy);
+ auto proxy = std::make_shared<devices::nld_a_to_d_proxy>(netlist(), x, &incast);
+ incast.set_proxy(proxy.get());
m_proxy_cnt++;
- register_dev(proxy);
+ register_dev_s(proxy);
proxy->start_dev();
proxy->m_Q.net().register_con(in);
@@ -572,11 +565,11 @@ void setup_t::connect_terminal_input(terminal_t &term, core_terminal_t &inp)
logic_input_t &incast = dynamic_cast<logic_input_t &>(inp);
log().debug("connect_terminal_input: connecting proxy\n");
pstring x = pfmt("proxy_ad_{1}_{2}")(inp.name())(m_proxy_cnt);
- devices::nld_a_to_d_proxy *proxy = palloc(devices::nld_a_to_d_proxy(netlist(), x, &incast));
- incast.set_proxy(proxy);
+ auto proxy = std::make_shared<devices::nld_a_to_d_proxy>(netlist(), x, &incast);
+ incast.set_proxy(proxy.get());
m_proxy_cnt++;
- register_dev(proxy);
+ register_dev_s(proxy);
proxy->start_dev();
connect_terminals(term, proxy->m_I);
@@ -820,7 +813,7 @@ void setup_t::resolve_inputs()
// FIXME: doesn't find internal devices. This needs to be more clever
for (std::size_t i=0; i < netlist().m_devices.size(); i++)
{
- devices::NETLIB_NAME(twoterm) *t = dynamic_cast<devices::NETLIB_NAME(twoterm) *>(netlist().m_devices[i]);
+ devices::NETLIB_NAME(twoterm) *t = dynamic_cast<devices::NETLIB_NAME(twoterm) *>(netlist().m_devices[i].get());
if (t != nullptr)
{
has_twoterms = true;
@@ -853,8 +846,8 @@ void setup_t::start_devices()
for (pstring ll : loglist)
{
pstring name = "log_" + ll;
- device_t *nc = factory().new_device_by_name("LOG", netlist(), name);
- register_dev(nc);
+ auto nc = factory().new_device_by_name("LOG", netlist(), name);
+ register_dev_s(nc);
register_link(name + ".I", ll);
log().debug(" dynamic link {1}: <{2}>\n",ll, name);
}
@@ -864,8 +857,8 @@ void setup_t::start_devices()
for (auto & e : m_device_factory)
{
- device_t *dev = e.second->Create(netlist(), e.first);
- register_dev(dev);
+ auto dev = std::shared_ptr<device_t>(e.second->Create(netlist(), e.first));
+ register_dev_s(dev);
}
netlist().start();
@@ -879,10 +872,10 @@ class logic_family_std_proxy_t : public logic_family_desc_t
{
public:
logic_family_std_proxy_t() { }
- virtual devices::nld_base_d_to_a_proxy *create_d_a_proxy(netlist_t &anetlist,
+ virtual std::shared_ptr<devices::nld_base_d_to_a_proxy> create_d_a_proxy(netlist_t &anetlist,
const pstring &name, logic_output_t *proxied) const override
{
- return palloc(devices::nld_d_to_a_proxy(anetlist, name, proxied));
+ return std::make_shared<devices::nld_d_to_a_proxy>(anetlist, name, proxied);
}
};
diff --git a/src/lib/netlist/nl_setup.h b/src/lib/netlist/nl_setup.h
index a8b8ade809f..1ebcf49964d 100644
--- a/src/lib/netlist/nl_setup.h
+++ b/src/lib/netlist/nl_setup.h
@@ -8,6 +8,7 @@
#ifndef NLSETUP_H_
#define NLSETUP_H_
+#include <memory>
#include "nl_base.h"
#include "nl_factory.h"
@@ -111,7 +112,15 @@ namespace netlist
pstring build_fqn(const pstring &obj_name) const;
void register_object(device_t &dev, const pstring &name, object_t &obj);
- void register_dev(device_t *dev);
+
+ template<class C>
+ void register_dev_s(std::shared_ptr<C> dev)
+ {
+ register_dev(std::static_pointer_cast<device_t>(dev));
+ }
+
+
+ void register_dev(std::shared_ptr<device_t> dev);
void register_dev(const pstring &classname, const pstring &name);
void register_lib_entry(const pstring &name);
diff --git a/src/lib/netlist/plib/pstate.cpp b/src/lib/netlist/plib/pstate.cpp
index d6ff433e388..aa5d7b7bae2 100644
--- a/src/lib/netlist/plib/pstate.cpp
+++ b/src/lib/netlist/plib/pstate.cpp
@@ -13,7 +13,7 @@ pstate_manager_t::pstate_manager_t()
pstate_manager_t::~pstate_manager_t()
{
- m_save.clear_and_free();
+ m_save.clear();
}
@@ -36,24 +36,20 @@ ATTR_COLD void pstate_manager_t::save_state_ptr(const pstring &stname, const pst
"DT_FLOAT"
};
- pstate_entry_t *p = palloc(pstate_entry_t(stname, dt, owner, size, count, ptr, is_ptr));
- m_save.push_back(p);
+ auto p = std::make_unique<pstate_entry_t>(stname, dt, owner, size, count, ptr, is_ptr);
+ m_save.push_back(std::move(p));
}
ATTR_COLD void pstate_manager_t::remove_save_items(const void *owner)
{
- pstate_entry_t::list_t todelete;
-
- for (std::size_t i=0; i < m_save.size(); i++)
+ unsigned i = 0;
+ while (i < m_save.size())
{
if (m_save[i]->m_owner == owner)
- todelete.push_back(m_save[i]);
- }
- for (std::size_t i=0; i < todelete.size(); i++)
- {
- m_save.remove(todelete[i]);
+ m_save.remove_at(i);
+ else
+ i++;
}
- todelete.clear_and_free();
}
ATTR_COLD void pstate_manager_t::pre_save()
@@ -74,7 +70,7 @@ template<> ATTR_COLD void pstate_manager_t::save_item(pstate_callback_t &state,
{
//save_state_ptr(stname, DT_CUSTOM, 0, 1, &state);
pstate_callback_t *state_p = &state;
- pstate_entry_t *p = palloc(pstate_entry_t(stname, owner, state_p));
- m_save.push_back(p);
+ auto p = std::make_unique<pstate_entry_t>(stname, owner, state_p);
+ m_save.push_back(std::move(p));
state.register_state(*this, stname);
}
diff --git a/src/lib/netlist/plib/pstate.h b/src/lib/netlist/plib/pstate.h
index c4c1475f1a0..9b88f8f562b 100644
--- a/src/lib/netlist/plib/pstate.h
+++ b/src/lib/netlist/plib/pstate.h
@@ -8,6 +8,8 @@
#ifndef PSTATE_H_
#define PSTATE_H_
+#include <memory>
+
#include "plists.h"
#include "pstring.h"
@@ -83,7 +85,7 @@ protected:
struct pstate_entry_t
{
- using list_t = pvector_t<pstate_entry_t *>;
+ using list_t = pvector_t<std::unique_ptr<pstate_entry_t>>;
pstate_entry_t(const pstring &stname, const pstate_data_type_e dt, const void *owner,
const int size, const int count, void *ptr, bool is_ptr)
diff --git a/src/lib/netlist/tools/nl_convert.cpp b/src/lib/netlist/tools/nl_convert.cpp
index a7b5611ea26..ad10f15bd6b 100644
--- a/src/lib/netlist/tools/nl_convert.cpp
+++ b/src/lib/netlist/tools/nl_convert.cpp
@@ -12,7 +12,7 @@
template<typename Class>
-static pvector_t<int> bubble(const pvector_t<Class *> &sl)
+static pvector_t<int> bubble(const pvector_t<Class> &sl)
{
pvector_t<int> ret;
for (unsigned i=0; i<sl.size(); i++)
@@ -38,7 +38,7 @@ static pvector_t<int> bubble(const pvector_t<Class *> &sl)
void nl_convert_base_t::add_pin_alias(const pstring &devname, const pstring &name, const pstring &alias)
{
pstring pname = devname + "." + name;
- m_pins.add(pname, palloc(pin_alias_t(pname, devname + "." + alias)));
+ m_pins.add(pname, std::make_unique<pin_alias_t>(pname, devname + "." + alias));
}
void nl_convert_base_t::add_ext_alias(const pstring &alias)
@@ -46,7 +46,7 @@ void nl_convert_base_t::add_ext_alias(const pstring &alias)
m_ext_alias.push_back(alias);
}
-void nl_convert_base_t::add_device(dev_t *dev)
+void nl_convert_base_t::add_device(std::shared_ptr<dev_t> dev)
{
for (auto & d : m_devs)
if (d->name() == dev->name())
@@ -59,30 +59,31 @@ void nl_convert_base_t::add_device(dev_t *dev)
void nl_convert_base_t::add_device(const pstring &atype, const pstring &aname, const pstring &amodel)
{
- add_device(palloc(dev_t(atype, aname, amodel)));
+ add_device(std::make_shared<dev_t>(atype, aname, amodel));
}
void nl_convert_base_t::add_device(const pstring &atype, const pstring &aname, double aval)
{
- add_device(palloc(dev_t(atype, aname, aval)));
+ add_device(std::make_shared<dev_t>(atype, aname, aval));
}
void nl_convert_base_t::add_device(const pstring &atype, const pstring &aname)
{
- add_device(palloc(dev_t(atype, aname)));
+ add_device(std::make_shared<dev_t>(atype, aname));
}
void nl_convert_base_t::add_term(pstring netname, pstring termname)
{
net_t * net = nullptr;
if (m_nets.contains(netname))
- net = m_nets[netname];
+ net = m_nets[netname].get();
else
{
- net = palloc(net_t(netname));
- m_nets.add(netname, net);
+ auto nets = std::make_shared<net_t>(netname);
+ net = nets.get();
+ m_nets.add(netname, nets);
}
/* if there is a pin alias, translate ... */
- pin_alias_t *alias = m_pins[termname];
+ pin_alias_t *alias = m_pins[termname].get();
if (alias != nullptr)
net->terminals().push_back(alias->alias());
@@ -94,7 +95,7 @@ void nl_convert_base_t::dump_nl()
{
for (std::size_t i=0; i<m_ext_alias.size(); i++)
{
- net_t *net = m_nets[m_ext_alias[i]];
+ net_t *net = m_nets[m_ext_alias[i]].get();
// use the first terminal ...
out("ALIAS({}, {})\n", m_ext_alias[i].cstr(), net->terminals()[0].cstr());
// if the aliased net only has this one terminal connected ==> don't dump
@@ -119,7 +120,7 @@ void nl_convert_base_t::dump_nl()
// print nets
for (std::size_t i=0; i<m_nets.size(); i++)
{
- net_t * net = m_nets.value_at(i);
+ net_t * net = m_nets.value_at(i).get();
if (!net->is_no_export())
{
//printf("Net {}\n", net->name().cstr());
@@ -131,12 +132,8 @@ void nl_convert_base_t::dump_nl()
out(")\n");
}
}
- m_devs.clear_and_free();
- for (std::size_t i = 0; i < m_nets.size(); i++)
- pfree(m_nets.value_at(i));
+ m_devs.clear();
m_nets.clear();
- for (std::size_t i = 0; i < m_pins.size(); i++)
- pfree(m_pins.value_at(i));
m_pins.clear();
m_ext_alias.clear();
}
diff --git a/src/lib/netlist/tools/nl_convert.h b/src/lib/netlist/tools/nl_convert.h
index 1e51ed3509c..65b951d8daf 100644
--- a/src/lib/netlist/tools/nl_convert.h
+++ b/src/lib/netlist/tools/nl_convert.h
@@ -10,6 +10,7 @@
#ifndef NL_CONVERT_H_
#define NL_CONVERT_H_
+#include <memory>
#include "plib/pstring.h"
#include "plib/plists.h"
#include "plib/pparser.h"
@@ -25,12 +26,8 @@ public:
nl_convert_base_t() : out(m_buf) {};
virtual ~nl_convert_base_t()
{
- for (std::size_t i = 0; i < m_nets.size(); i++)
- pfree(m_nets.value_at(i));
m_nets.clear();
- m_devs.clear_and_free();
- for (std::size_t i = 0; i < m_pins.size(); i++)
- pfree(m_pins.value_at(i));
+ m_devs.clear();
m_pins.clear();
}
@@ -129,14 +126,14 @@ private:
private:
- void add_device(dev_t *dev);
+ void add_device(std::shared_ptr<dev_t> dev);
postringstream m_buf;
- pvector_t<dev_t *> m_devs;
- phashmap_t<pstring, net_t *> m_nets;
+ pvector_t<std::shared_ptr<dev_t>> m_devs;
+ phashmap_t<pstring, std::shared_ptr<net_t> > m_nets;
pvector_t<pstring> m_ext_alias;
- phashmap_t<pstring, pin_alias_t *> m_pins;
+ phashmap_t<pstring, std::shared_ptr<pin_alias_t>> m_pins;
static unit_t m_units[];