summaryrefslogtreecommitdiffstatshomepage
path: root/src/lib/netlist/tools
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/netlist/tools')
-rw-r--r--src/lib/netlist/tools/nl_convert.cpp54
-rw-r--r--src/lib/netlist/tools/nl_convert.h17
2 files changed, 48 insertions, 23 deletions
diff --git a/src/lib/netlist/tools/nl_convert.cpp b/src/lib/netlist/tools/nl_convert.cpp
index 8157bfffdcd..cc24325a059 100644
--- a/src/lib/netlist/tools/nl_convert.cpp
+++ b/src/lib/netlist/tools/nl_convert.cpp
@@ -12,11 +12,11 @@
template<typename Class>
-static plist_t<int> bubble(const pnamedlist_t<Class *> &sl)
+static plist_t<int> bubble(const plist_t<Class *> &sl)
{
- plist_t<int> ret(sl.size());
+ plist_t<int> ret;
for (unsigned i=0; i<sl.size(); i++)
- ret[i] = i;
+ ret.push_back(i);
for(unsigned i=0; i < sl.size(); i++)
{
@@ -37,50 +37,64 @@ static plist_t<int> bubble(const pnamedlist_t<Class *> &sl)
void nl_convert_base_t::add_pin_alias(const pstring &devname, const pstring &name, const pstring &alias)
{
- m_pins.add(palloc(pin_alias_t(devname + "." + name, devname + "." + alias)), false);
+ pstring pname = devname + "." + name;
+ m_pins.add(pname, palloc(pin_alias_t(pname, devname + "." + alias)));
}
void nl_convert_base_t::add_ext_alias(const pstring &alias)
{
- m_ext_alias.add(alias);
+ m_ext_alias.push_back(alias);
+}
+
+void nl_convert_base_t::add_device(dev_t *dev)
+{
+ for (auto & d : m_devs)
+ if (d->name() == dev->name())
+ {
+ out("ERROR: Duplicate device {1} ignored.", dev->name());
+ return;
+ }
+ m_devs.push_back(dev);
}
void nl_convert_base_t::add_device(const pstring &atype, const pstring &aname, const pstring &amodel)
{
- m_devs.add(palloc(dev_t(atype, aname, amodel)), false);
+ add_device(palloc(dev_t(atype, aname, amodel)));
}
void nl_convert_base_t::add_device(const pstring &atype, const pstring &aname, double aval)
{
- m_devs.add(palloc(dev_t(atype, aname, aval)), false);
+ add_device(palloc(dev_t(atype, aname, aval)));
}
void nl_convert_base_t::add_device(const pstring &atype, const pstring &aname)
{
- m_devs.add(palloc(dev_t(atype, aname)), false);
+ add_device(palloc(dev_t(atype, aname)));
}
void nl_convert_base_t::add_term(pstring netname, pstring termname)
{
- net_t * net = m_nets.find_by_name(netname);
- if (net == NULL)
+ net_t * net = NULL;
+ if (m_nets.contains(netname))
+ net = m_nets[netname];
+ else
{
net = palloc(net_t(netname));
- m_nets.add(net, false);
+ m_nets.add(netname, net);
}
/* if there is a pin alias, translate ... */
- pin_alias_t *alias = m_pins.find_by_name(termname);
+ pin_alias_t *alias = m_pins[termname];
if (alias != NULL)
- net->terminals().add(alias->alias());
+ net->terminals().push_back(alias->alias());
else
- net->terminals().add(termname);
+ net->terminals().push_back(termname);
}
void nl_convert_base_t::dump_nl()
{
for (std::size_t i=0; i<m_ext_alias.size(); i++)
{
- net_t *net = m_nets.find_by_name(m_ext_alias[i]);
+ net_t *net = m_nets[m_ext_alias[i]];
// 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
@@ -105,7 +119,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[i];
+ net_t * net = m_nets.value_at(i);
if (!net->is_no_export())
{
//printf("Net {}\n", net->name().cstr());
@@ -118,8 +132,12 @@ void nl_convert_base_t::dump_nl()
}
}
m_devs.clear_and_free();
- m_nets.clear_and_free();
- m_pins.clear_and_free();
+ for (std::size_t i = 0; i < m_nets.size(); i++)
+ pfree(m_nets.value_at(i));
+ 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 3b86c5ec1ad..502d452983c 100644
--- a/src/lib/netlist/tools/nl_convert.h
+++ b/src/lib/netlist/tools/nl_convert.h
@@ -25,9 +25,13 @@ public:
nl_convert_base_t() : out(m_buf) {};
virtual ~nl_convert_base_t()
{
- m_nets.clear_and_free();
+ 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();
- m_pins.clear_and_free();
+ for (std::size_t i = 0; i < m_pins.size(); i++)
+ pfree(m_pins.value_at(i));
+ m_pins.clear();
}
const pstringbuffer &result() { return m_buf.str(); }
@@ -55,6 +59,7 @@ protected:
pstream_fmt_writer_t out;
private:
+
struct net_t
{
public:
@@ -124,12 +129,14 @@ private:
private:
+ void add_device(dev_t *dev);
+
postringstream m_buf;
- pnamedlist_t<dev_t *> m_devs;
- pnamedlist_t<net_t *> m_nets;
+ plist_t<dev_t *> m_devs;
+ phashmap_t<pstring, net_t *> m_nets;
plist_t<pstring> m_ext_alias;
- pnamedlist_t<pin_alias_t *> m_pins;
+ phashmap_t<pstring, pin_alias_t *> m_pins;
static unit_t m_units[];