netlist updates:

- First steps to move towards c++11.
- Base plist on std::vector
- Replace pstack with std::stack
- Remove pnamed_list
- use c++ "for each" in a number of places
- Fixed two "time bombs"
[couriersud]
This commit is contained in:
couriersud 2016-03-05 17:11:04 +01:00
parent 0e48eb2a43
commit 41c8a9f6fa
31 changed files with 407 additions and 632 deletions

View File

@ -21,8 +21,8 @@ NETLIST_START(dummy)
PARAM(Solver.LTE, 1e-1)
#endif
//FIXME proper models!
NET_MODEL("2SC945 NPN(Is=2.04f Xti=3 Eg=1.11 Vaf=6 Bf=400 Ikf=20m Xtb=1.5 Br=3.377 Rc=1 Cjc=1p Mjc=.3333 Vjc=.75 Fc=.5 Cje=25p Mje=.3333 Vje=.75 Tr=450n Tf=20n Itf=0 Vtf=0 Xtf=0 VCEO=45V ICrating=150M MFG=Toshiba)")
NET_MODEL("1S1588 D(Is=2.52n Rs=.568 N=1.752 Cjo=4p M=.4 tt=20n Iave=200m Vpk=75 mfg=OnSemi type=silicon)")
//NET_MODEL("2SC945 NPN(Is=2.04f Xti=3 Eg=1.11 Vaf=6 Bf=400 Ikf=20m Xtb=1.5 Br=3.377 Rc=1 Cjc=1p Mjc=.3333 Vjc=.75 Fc=.5 Cje=25p Mje=.3333 Vje=.75 Tr=450n Tf=20n Itf=0 Vtf=0 Xtf=0 VCEO=45V ICrating=150M MFG=Toshiba)")
//NET_MODEL("1S1588 D(Is=2.52n Rs=.568 N=1.752 Cjo=4p M=.4 tt=20n Iave=200m Vpk=75 mfg=OnSemi type=silicon)")
//NET_C(R44.1, XU1.7)

View File

@ -47,8 +47,8 @@ NETLIB_TRUTHTABLE(7404, 1, 1, 0);
#else
NETLIB_DEVICE(7404,
public:
netlist_logic_input_t m_I[1];
netlist_logic_output_t m_Q[1];
logic_input_t m_I[1];
logic_output_t m_Q[1];
);
#endif

View File

@ -51,11 +51,11 @@ NETLIB_TRUTHTABLE(7486, 2, 1, 0);
#else
NETLIB_DEVICE(7486,
public:
netlist_logic_input_t m_I[2];
netlist_logic_output_t m_Q[1];
logic_input_t m_I[2];
logic_output_t m_Q[1];
ATTR_HOT void inc_active();
ATTR_HOT void dec_active();
ATTR_HOT void inc_active() override;
ATTR_HOT void dec_active() override;
int m_active;
);
#endif

View File

@ -22,7 +22,7 @@ NETLIB_UPDATE(82S16)
}
else
{
int adr = 0;
unsigned int adr = 0;
for (int i=0; i<8; i++)
{
//m_A[i].activate();
@ -31,9 +31,9 @@ NETLIB_UPDATE(82S16)
if (!INPLOGIC(m_WEQ))
{
m_ram[adr] = INPLOGIC(m_DIN);
m_ram[adr >> 6] = (m_ram[adr >> 6] & ~((UINT64) 1 << (adr & 0x3f))) | ((UINT64) INPLOGIC(m_DIN) << (adr & 0x3f));
}
OUTLOGIC(m_DOUTQ, m_ram[adr] ^ 1, NLTIME_FROM_NS(20));
OUTLOGIC(m_DOUTQ, ((m_ram[adr >> 6] >> (adr & 0x3f)) & 1) ^ 1, NLTIME_FROM_NS(20));
}
}
@ -62,7 +62,7 @@ NETLIB_START(82S16)
NETLIB_RESET(82S16)
{
for (int i=0; i<256; i++)
for (int i=0; i<4; i++)
{
m_ram[i] = 0;
}

View File

@ -44,7 +44,7 @@ NETLIB_DEVICE(82S16,
logic_output_t m_DOUTQ;
//netlist_state_t<UINT8[256]> m_ram;
UINT8 m_ram[256];
UINT64 m_ram[4]; // 256 bits
);
NETLIB_DEVICE_DERIVED_PURE(82S16_dip, 82S16);

View File

@ -58,13 +58,13 @@ NETLIB_TRUTHTABLE(9312, 12, 2, 0);
NETLIB_DEVICE(9312,
public:
// C, B, A, G,D0,D1,D2,D3,D4,D5,D6,D7| Y,YQ
netlist_logic_input_t m_A;
netlist_logic_input_t m_B;
netlist_logic_input_t m_C;
netlist_logic_input_t m_G;
netlist_logic_input_t m_D[8];
netlist_logic_output_t m_Y;
netlist_logic_output_t m_YQ;
logic_input_t m_A;
logic_input_t m_B;
logic_input_t m_C;
logic_input_t m_G;
logic_input_t m_D[8];
logic_output_t m_Y;
logic_output_t m_YQ;
UINT8 m_last_chan;
UINT8 m_last_G;

View File

@ -329,7 +329,7 @@ NETLIB_START(function)
if (err)
netlist().log().fatal("nld_function: unknown/misformatted token <{1}> in <{2}>", cmd, m_func.Value());
}
m_precompiled.add(rc);
m_precompiled.push_back(rc);
}
}

View File

@ -100,7 +100,7 @@ UINT32 truthtable_desc_t::get_ignored_extended(UINT32 i)
// ----------------------------------------------------------------------------------------
void truthtable_desc_t::help(unsigned cur, pstring_list_t list,
UINT64 state,UINT16 val, UINT8 *timing_index)
UINT64 state,UINT16 val, parray_t<UINT8> &timing_index)
{
pstring elem = list[cur].trim();
int start = 0;
@ -192,8 +192,11 @@ void truthtable_desc_t::setup(const pstring_list_t &truthtable, UINT32 disabled_
tindex[j] = k;
}
help(0, inout, 0 , val, tindex.data());
ttline = truthtable[line];
help(0, inout, 0 , val, tindex);
if (line < truthtable.size())
ttline = truthtable[line];
else
ttline = "";
line++;
}

View File

@ -30,10 +30,10 @@
# _name, # _name, "+" _def_params);
#define TT_HEAD(_x) \
ttd->m_desc.add(_x);
ttd->m_desc.push_back(_x);
#define TT_LINE(_x) \
ttd->m_desc.add(_x);
ttd->m_desc.push_back(_x);
#define TT_FAMILY(_x) \
ttd->m_family = setup.family_from_model(_x);
@ -69,7 +69,7 @@ struct truthtable_desc_t
private:
void help(unsigned cur, pstring_list_t list,
UINT64 state,UINT16 val, UINT8 *timing_index);
UINT64 state,UINT16 val, parray_t<UINT8> &timing_index);
static unsigned count_bits(UINT32 v);
static UINT32 set_bits(UINT32 v, UINT32 b);
UINT32 get_ignored_simple(UINT32 i);
@ -114,7 +114,7 @@ public:
{
while (*desc != NULL && **desc != 0 )
{
m_desc.add(*desc);
m_desc.push_back(*desc);
desc++;
}

View File

@ -186,16 +186,15 @@ netlist_t::netlist_t()
netlist_t::~netlist_t()
{
for (std::size_t i=0; i < m_nets.size(); i++)
for (net_t *net : m_nets)
{
if (!m_nets[i]->isRailNet())
if (!net->isRailNet())
{
pfree(m_nets[i]);
pfree(net);
}
}
m_nets.clear();
m_devices.clear_and_free();
pstring::resetmem();
@ -237,12 +236,9 @@ ATTR_COLD void netlist_t::start()
m_use_deactivate = (m_params->m_use_deactivate.Value() ? true : false);
log().debug("Initializing devices ...\n");
for (std::size_t i = 0; i < m_devices.size(); i++)
{
device_t *dev = m_devices[i];
for (device_t *dev : m_devices)
if (dev != m_solver && dev != m_params)
dev->start_dev();
}
}
@ -251,28 +247,23 @@ ATTR_COLD void netlist_t::stop()
/* find the main clock and solver ... */
log().debug("Stopping all devices ...\n");
// Step all devices once !
for (std::size_t i = 0; i < m_devices.size(); i++)
{
m_devices[i]->stop_dev();
}
for (device_t *dev : m_devices)
dev->stop_dev();
}
ATTR_COLD net_t *netlist_t::find_net(const pstring &name)
{
for (std::size_t i = 0; i < m_nets.size(); i++)
{
if (m_nets[i]->name() == name)
return m_nets[i];
}
for (net_t *net : m_nets)
if (net->name() == name)
return net;
return NULL;
}
ATTR_COLD void netlist_t::rebuild_lists()
{
for (std::size_t i = 0; i < m_nets.size(); i++)
m_nets[i]->rebuild_list();
for (net_t *net : m_nets)
net->rebuild_list();
}
@ -303,9 +294,9 @@ ATTR_COLD void netlist_t::reset()
// FIXME: some const devices rely on this
/* make sure params are set now .. */
for (std::size_t i = 0; i < m_devices.size(); i++)
for (device_t *dev : m_devices)
{
m_devices[i]->update_param();
dev->update_param();
}
}
@ -318,7 +309,7 @@ ATTR_HOT void netlist_t::process_queue(const netlist_time &delta)
{
while ( (m_time < m_stop) && (m_queue.is_not_empty()))
{
const queue_t::entry_t e = *m_queue.pop();
const queue_t::entry_t &e = m_queue.pop();
m_time = e.exec_time();
e.object()->update_devs();
@ -336,21 +327,25 @@ ATTR_HOT void netlist_t::process_queue(const netlist_time &delta)
{
if (m_queue.is_not_empty())
{
while (m_queue.peek()->exec_time() > mc_time)
while (m_queue.top().exec_time() > mc_time)
{
m_time = mc_time;
mc_time += inc;
devices::NETLIB_NAME(mainclock)::mc_update(mc_net);
mc_net.toggle_new_Q();
mc_net.update_devs();
//devices::NETLIB_NAME(mainclock)::mc_update(mc_net);
}
const queue_t::entry_t e = *m_queue.pop();
const queue_t::entry_t &e = m_queue.pop();
m_time = e.exec_time();
e.object()->update_devs();
} else {
m_time = mc_time;
mc_time += inc;
devices::NETLIB_NAME(mainclock)::mc_update(mc_net);
mc_net.toggle_new_Q();
mc_net.update_devs();
//devices::NETLIB_NAME(mainclock)::mc_update(mc_net);
}
add_to_stat(m_perf_out_processed, 1);
@ -435,13 +430,13 @@ ATTR_HOT netlist_sig_t core_device_t::INPLOGIC_PASSIVE(logic_input_t &inp)
device_t::device_t()
: core_device_t(GENERIC),
m_terminals(20)
m_terminals()
{
}
device_t::device_t(const family_t afamily)
: core_device_t(afamily),
m_terminals(20)
m_terminals()
{
}
@ -477,7 +472,7 @@ ATTR_COLD void device_t::register_subalias(const pstring &name, core_terminal_t
setup().register_alias_nofqn(alias, term.name());
if (term.isType(terminal_t::INPUT) || term.isType(terminal_t::TERMINAL))
m_terminals.add(alias);
m_terminals.push_back(alias);
}
ATTR_COLD void device_t::register_subalias(const pstring &name, const pstring &aliased)
@ -497,7 +492,7 @@ ATTR_COLD void device_t::register_terminal(const pstring &name, terminal_t &port
{
setup().register_object(*this, name, port);
if (port.isType(terminal_t::INPUT) || port.isType(terminal_t::TERMINAL))
m_terminals.add(port.name());
m_terminals.push_back(port.name());
}
ATTR_COLD void device_t::register_output(const pstring &name, logic_output_t &port)
@ -515,13 +510,13 @@ ATTR_COLD void device_t::register_input(const pstring &name, logic_input_t &inp)
{
inp.set_logic_family(this->logic_family());
setup().register_object(*this, name, inp);
m_terminals.add(inp.name());
m_terminals.push_back(inp.name());
}
ATTR_COLD void device_t::register_input(const pstring &name, analog_input_t &inp)
{
setup().register_object(*this, name, inp);
m_terminals.add(inp.name());
m_terminals.push_back(inp.name());
}
ATTR_COLD void device_t::connect_late(core_terminal_t &t1, core_terminal_t &t2)
@ -584,7 +579,7 @@ ATTR_COLD net_t::~net_t()
ATTR_COLD void net_t::init_object(netlist_t &nl, const pstring &aname)
{
object_t::init_object(nl, aname);
nl.m_nets.add(this);
nl.m_nets.push_back(this);
}
ATTR_HOT void net_t::inc_active(core_terminal_t &term)
@ -638,10 +633,10 @@ ATTR_COLD void net_t::rebuild_list()
unsigned cnt = 0;
m_list_active.clear();
for (std::size_t i=0; i < m_core_terms.size(); i++)
if (m_core_terms[i]->state() != logic_t::STATE_INP_PASSIVE)
for (core_terminal_t *term : m_core_terms)
if (term->state() != logic_t::STATE_INP_PASSIVE)
{
m_list_active.add(*m_core_terms[i]);
m_list_active.add(*term);
cnt++;
}
m_active = cnt;
@ -689,14 +684,7 @@ ATTR_HOT /* inline */ void net_t::update_devs()
}
for (int i=0; i<cnt; i++)
t[i]->netdev().update_dev();
core_terminal_t *p = m_list_active.first();
while (p != NULL)
{
p->update_dev(mask);
p = m_list_active.next(p);
}
t[i]->device().update_dev();
#else
core_terminal_t *p = m_list_active.first();
@ -704,7 +692,7 @@ ATTR_HOT /* inline */ void net_t::update_devs()
while (p != NULL)
{
p->update_dev(mask);
p = p->m_next;
p = m_list_active.next(p);
}
#endif
}
@ -722,14 +710,14 @@ ATTR_COLD void net_t::reset()
/* rebuild m_list */
m_list_active.clear();
for (std::size_t i=0; i < m_core_terms.size(); i++)
m_list_active.add(*m_core_terms[i]);
for (core_terminal_t *ct : m_core_terms)
m_list_active.add(*ct);
for (std::size_t i=0; i < m_core_terms.size(); i++)
m_core_terms[i]->do_reset();
for (core_terminal_t *ct : m_core_terms)
ct->do_reset();
for (std::size_t i=0; i < m_core_terms.size(); i++)
if (m_core_terms[i]->state() != logic_t::STATE_INP_PASSIVE)
for (core_terminal_t *ct : m_core_terms)
if (ct->state() != logic_t::STATE_INP_PASSIVE)
m_active++;
}
@ -737,7 +725,7 @@ ATTR_COLD void net_t::register_con(core_terminal_t &terminal)
{
terminal.set_net(*this);
m_core_terms.add(&terminal);
m_core_terms.push_back(&terminal);
if (terminal.state() != logic_t::STATE_INP_PASSIVE)
m_active++;
@ -745,11 +733,8 @@ ATTR_COLD void net_t::register_con(core_terminal_t &terminal)
ATTR_COLD void net_t::move_connections(net_t *dest_net)
{
for (std::size_t i = 0; i < m_core_terms.size(); i++)
{
core_terminal_t *p = m_core_terms[i];
dest_net->register_con(*p);
}
for (core_terminal_t *ct : m_core_terms)
dest_net->register_con(*ct);
m_core_terms.clear();
m_active = 0;
}
@ -842,10 +827,9 @@ ATTR_COLD void analog_net_t::process_net(list_t *groups, int &cur_group)
if (num_cons() == 0)
return;
/* add the net */
groups[cur_group].add(this);
for (std::size_t i = 0; i < m_core_terms.size(); i++)
groups[cur_group].push_back(this);
for (core_terminal_t *p : m_core_terms)
{
core_terminal_t *p = m_core_terms[i];
if (p->isType(terminal_t::TERMINAL))
{
terminal_t *pt = static_cast<terminal_t *>(p);
@ -863,7 +847,7 @@ ATTR_COLD void analog_net_t::process_net(list_t *groups, int &cur_group)
ATTR_COLD core_terminal_t::core_terminal_t(const type_t atype, const family_t afamily)
: device_object_t(atype, afamily)
, plinkedlist_element_t<core_terminal_t>()
, plinkedlist_element_t()
, m_net(NULL)
, m_state(STATE_NONEX)
{

View File

@ -155,6 +155,8 @@
#ifndef NLBASE_H_
#define NLBASE_H_
#include <vector>
#include "nl_lists.h"
#include "nl_time.h"
#include "nl_util.h"
@ -165,7 +167,14 @@
// Type definitions
// ----------------------------------------------------------------------------------------
typedef UINT8 netlist_sig_t;
//typedef UINT8 netlist_sig_t;
/*
* unsigned int would be a 20% speed increase over UINT8 for pong.
* For breakout it causes a slight decrease.
*
*/
typedef unsigned int netlist_sig_t;
//============================================================
// MACROS / netlist devices
@ -1193,7 +1202,7 @@ namespace netlist
{
_device_class *dev = dynamic_cast<_device_class *>(m_devices[i]);
if (dev != NULL)
tmp.add(dev);
tmp.push_back(dev);
}
return tmp;
}
@ -1228,7 +1237,7 @@ namespace netlist
return ret;
}
pnamedlist_t<device_t *> m_devices;
plist_t<device_t *> m_devices;
net_t::list_t m_nets;
#if (NL_KEEP_STATISTICS)
pnamedlist_t<core_device_t *> m_started_devices;

View File

@ -64,12 +64,12 @@ namespace netlist
/* Lock */
while (atomic_exchange32(&m_lock, 1)) { }
#endif
const _Time t = e.exec_time();
const _Time &t = e.exec_time();
entry_t * i = m_end++;
while (t > (i - 1)->exec_time())
for (; t > (i - 1)->exec_time(); i--)
{
*(i) = *(i-1);
i--;
//i--;
inc_stat(m_prof_sortmove);
}
*i = e;
@ -80,14 +80,14 @@ namespace netlist
//nl_assert(m_end - m_list < _Size);
}
ATTR_HOT const entry_t *pop()
ATTR_HOT const entry_t & pop()
{
return --m_end;
return *(--m_end);
}
ATTR_HOT const entry_t *peek() const
ATTR_HOT const entry_t & top() const
{
return (m_end-1);
return *(m_end-1);
}
ATTR_HOT void remove(const _Element &elem)
@ -96,8 +96,7 @@ namespace netlist
#if HAS_OPENMP && USE_OPENMP
while (atomic_exchange32(&m_lock, 1)) { }
#endif
entry_t * i = m_end - 1;
while (i > &m_list[0])
for (entry_t * i = m_end - 1; i > &m_list[0]; i--)
{
if (i->object() == elem)
{
@ -112,7 +111,6 @@ namespace netlist
#endif
return;
}
i--;
}
#if HAS_OPENMP && USE_OPENMP
m_lock = 0;
@ -148,9 +146,7 @@ namespace netlist
volatile INT32 m_lock;
#endif
entry_t * m_end;
//entry_t m_list[_Size];
parray_t<entry_t> m_list;
};
}

View File

@ -168,13 +168,13 @@ void parser_t::net_truthtable_start()
if (token.is(m_tok_TT_HEAD))
{
require_token(m_tok_param_left);
ttd->m_desc.add(get_string());
ttd->m_desc.push_back(get_string());
require_token(m_tok_param_right);
}
else if (token.is(m_tok_TT_LINE))
{
require_token(m_tok_param_left);
ttd->m_desc.add(get_string());
ttd->m_desc.push_back(get_string());
require_token(m_tok_param_right);
}
else if (token.is(m_tok_TT_FAMILY))
@ -296,13 +296,13 @@ void parser_t::dippins()
{
pstring_list_t pins;
pins.add(get_identifier());
pins.push_back(get_identifier());
require_token(m_tok_comma);
while (true)
{
pstring t1 = get_identifier();
pins.add(t1);
pins.push_back(t1);
token_t n = get_token();
if (n.is(m_tok_param_right))
break;

View File

@ -53,6 +53,7 @@ namespace netlist
setup_t::setup_t(netlist_t *netlist)
: m_netlist(netlist)
, m_proxy_cnt(0)
, m_frontier_cnt(0)
{
netlist->set_setup(this);
m_factory = palloc(factory_list_t(*this));
@ -85,7 +86,7 @@ ATTR_COLD pstring setup_t::build_fqn(const pstring &obj_name) const
if (m_stack.empty())
return netlist().name() + "." + obj_name;
else
return m_stack.peek() + "." + obj_name;
return m_stack.top() + "." + obj_name;
}
void setup_t::namespace_push(const pstring &aname)
@ -93,7 +94,7 @@ void setup_t::namespace_push(const pstring &aname)
if (m_stack.empty())
m_stack.push(netlist().name() + "." + aname);
else
m_stack.push(m_stack.peek() + "." + aname);
m_stack.push(m_stack.top() + "." + aname);
}
void setup_t::namespace_pop()
@ -108,8 +109,11 @@ device_t *setup_t::register_dev(device_t *dev, const pstring &name)
dev->init(netlist(), fqn);
if (!(netlist().m_devices.add(dev, false)==true))
log().fatal("Error adding {1} to device list\n", name);
for (auto & d : netlist().m_devices)
if (d->name() == dev->name())
log().fatal("Error adding {1} to device list. Duplicate name \n", name);
netlist().m_devices.push_back(dev);
return dev;
}
@ -118,7 +122,7 @@ void setup_t::register_lib_entry(const pstring &name)
if (m_lib.contains(name))
log().warning("Lib entry collection already contains {1}. IGNORED", name);
else
m_lib.add(name);
m_lib.push_back(name);
}
device_t *setup_t::register_dev(const pstring &classname, const pstring &name)
@ -235,7 +239,6 @@ void setup_t::register_object(device_t &dev, const pstring &name, object_t &obj)
case terminal_t::PARAM:
{
param_t &param = dynamic_cast<param_t &>(obj);
//printf("name: {1}\n", name);
if (m_params_temp.contains(name))
{
const pstring val = m_params_temp[name];
@ -305,7 +308,7 @@ void setup_t::register_link_fqn(const pstring &sin, const pstring &sout)
{
link_t temp = link_t(sin, sout);
log().debug("link {1} <== {2}\n", sin, sout);
m_links.add(temp);
m_links.push_back(temp);
}
void setup_t::register_link(const pstring &sin, const pstring &sout)
@ -317,11 +320,13 @@ void setup_t::remove_connections(const pstring pin)
{
pstring pinfn = build_fqn(pin);
bool found = false;
for (std::size_t i = 0; i < m_links.size(); i++)
for (int i = m_links.size() - 1; i >= 0; i--)
{
if ((m_links[i].e1 == pinfn) || (m_links[i].e2 == pinfn))
auto &link = m_links[i];
if ((link.e1 == pinfn) || (link.e2 == pinfn))
{
log().verbose("removing connection: {1} <==> {2}\n", m_links[i].e1, m_links[i].e2);
log().verbose("removing connection: {1} <==> {2}\n", link.e1, link.e2);
m_links.remove_at(i);
found = true;
}
@ -333,25 +338,24 @@ void setup_t::remove_connections(const pstring pin)
void setup_t::register_frontier(const pstring attach, const double r_IN, const double r_OUT)
{
static int frontier_cnt = 0;
pstring frontier_name = pfmt("frontier_{1}")(frontier_cnt);
frontier_cnt++;
pstring frontier_name = pfmt("frontier_{1}")(m_frontier_cnt);
m_frontier_cnt++;
device_t *front = register_dev("FRONTIER_DEV", frontier_name);
register_param(frontier_name + ".RIN", r_IN);
register_param(frontier_name + ".ROUT", r_OUT);
register_link(frontier_name + ".G", "GND");
pstring attfn = build_fqn(attach);
bool found = false;
for (std::size_t i = 0; i < m_links.size(); i++)
for (auto & link : m_links)
{
if (m_links[i].e1 == attfn)
if (link.e1 == attfn)
{
m_links[i].e1 = front->name() + ".I";
link.e1 = front->name() + ".I";
found = true;
}
else if (m_links[i].e2 == attfn)
else if (link.e2 == attfn)
{
m_links[i].e2 = front->name() + ".I";
link.e2 = front->name() + ".I";
found = true;
}
}
@ -472,7 +476,6 @@ devices::nld_base_proxy *setup_t::get_d_a_proxy(core_terminal_t &out)
{
nl_assert(out.isFamily(terminal_t::LOGIC));
//printf("proxy for {1}\n", out.name());;
logic_output_t &out_cast = dynamic_cast<logic_output_t &>(out);
devices::nld_base_proxy *proxy = out_cast.get_proxy();
@ -486,18 +489,16 @@ devices::nld_base_proxy *setup_t::get_d_a_proxy(core_terminal_t &out)
register_dev(new_proxy, x);
new_proxy->start_dev();
#if 1
/* connect all existing terminals to new net */
for (std::size_t i = 0; i < out.net().m_core_terms.size(); i++)
for (core_terminal_t *p : out.net().m_core_terms)
{
core_terminal_t *p = out.net().m_core_terms[i];
p->clear_net(); // de-link from all nets ...
if (!connect(new_proxy->proxy_term(), *p))
log().fatal("Error connecting {1} to {2}\n", new_proxy->proxy_term().name(), (*p).name());
}
out.net().m_core_terms.clear(); // clear the list
#endif
out.net().register_con(new_proxy->in());
out_cast.set_proxy(new_proxy);
proxy = new_proxy;
@ -648,13 +649,11 @@ bool setup_t::connect_input_input(core_terminal_t &t1, core_terminal_t &t2)
ret = connect(t2, t1.net().railterminal());
if (!ret)
{
for (std::size_t i=0; i<t1.net().m_core_terms.size(); i++)
for (core_terminal_t *t : t1.net().m_core_terms)
{
if (t1.net().m_core_terms[i]->isType(core_terminal_t::TERMINAL)
if (t->isType(core_terminal_t::TERMINAL)
/*|| t1.net().m_core_terms[i]->isType(netlist_core_terminal_t::OUTPUT)*/)
{
ret = connect(t2, *t1.net().m_core_terms[i]);
}
ret = connect(t2, *t);
if (ret)
break;
}
@ -666,13 +665,11 @@ bool setup_t::connect_input_input(core_terminal_t &t1, core_terminal_t &t2)
ret = connect(t1, t2.net().railterminal());
if (!ret)
{
for (std::size_t i=0; i<t2.net().m_core_terms.size(); i++)
for (core_terminal_t *t : t2.net().m_core_terms)
{
if (t2.net().m_core_terms[i]->isType(core_terminal_t::TERMINAL)
if (t->isType(core_terminal_t::TERMINAL)
/*|| t2.net().m_core_terms[i]->isType(netlist_core_terminal_t::OUTPUT)*/)
{
ret = connect(t1, *t2.net().m_core_terms[i]);
}
ret = connect(t1, *t);
if (ret)
break;
}
@ -774,24 +771,20 @@ void setup_t::resolve_inputs()
net_t::list_t todelete;
for (std::size_t i = 0; i<netlist().m_nets.size(); i++)
for (net_t *net : netlist().m_nets)
{
if (netlist().m_nets[i]->num_cons() == 0)
{
todelete.add(netlist().m_nets[i]);
}
if (net->num_cons() == 0)
todelete.push_back(net);
else
{
netlist().m_nets[i]->rebuild_list();
}
net->rebuild_list();
}
for (std::size_t i=0; i < todelete.size(); i++)
for (net_t *net : todelete)
{
log().verbose("Deleting net {1} ...", todelete[i]->name());
netlist().m_nets.remove(todelete[i]);
if (!todelete[i]->isRailNet())
pfree(todelete[i]);
log().verbose("Deleting net {1} ...", net->name());
netlist().m_nets.remove(net);
if (!net->isRailNet())
pfree(net);
}
pstring errstr("");
@ -819,13 +812,8 @@ void setup_t::resolve_inputs()
{
has_twoterms = true;
if (t->m_N.net().isRailNet() && t->m_P.net().isRailNet())
#if 0
netlist().fatal("Found device {1} connected only to railterminals {2}/{3}\n",
t->name(), t->m_N.net().name(), t->m_P.net().name());
#else
log().warning("Found device {1} connected only to railterminals {2}/{3}\n",
t->name(), t->m_N.net().name(), t->m_P.net().name());
#endif
}
}
@ -848,15 +836,14 @@ void setup_t::start_devices()
if (env != "")
{
log().debug("Creating dynamic logs ...\n");
pstring_list_t ll(env, ":");
for (unsigned i=0; i < ll.size(); i++)
pstring_list_t loglist(env, ":");
for (pstring ll : loglist)
{
log().debug("{1}: <{2}>\n",i, ll[i]);
log().debug("{1}: <{2}>\n",i, ll[i]);
device_t *nc = factory().new_device_by_name("LOG");
pstring name = "log_" + ll[i];
pstring name = "log_" + ll;
register_dev(nc, name);
register_link(name + ".I", ll[i]);
register_link(name + ".I", ll);
log().debug(" dynamic link {1}: <{2}>\n",ll, name);
}
}
@ -958,12 +945,12 @@ void setup_t::model_parse(const pstring &model_in, model_map_t &map)
remainder = remainder.left(remainder.len() - 1);
pstring_list_t pairs(remainder," ", true);
for (unsigned i=0; i<pairs.size(); i++)
for (pstring &pe : pairs)
{
int pose = pairs[i].find("=");
int pose = pe.find("=");
if (pose < 0)
log().fatal("Model error on pair {1}\n", model);
map[pairs[i].left(pose).ucase()] = pairs[i].substr(pose+1);
map[pe.left(pose).ucase()] = pe.substr(pose+1);
}
}
@ -1012,9 +999,9 @@ nl_double setup_t::model_value(model_map_t &map, const pstring &entity)
void setup_t::include(const pstring &netlist_name)
{
for (std::size_t i=0; i < m_sources.size(); i++)
for (source_t *source : m_sources)
{
if (m_sources[i]->parse(*this, netlist_name))
if (source->parse(*this, netlist_name))
return;
}
log().fatal("unable to find {1} in source collection", netlist_name);

View File

@ -181,7 +181,7 @@ namespace netlist
/* register a source */
void register_source(source_t *src) { m_sources.add(src); }
void register_source(source_t *src) { m_sources.push_back(src); }
factory_list_t &factory() { return *m_factory; }
const factory_list_t &factory() const { return *m_factory; }
@ -231,8 +231,9 @@ namespace netlist
phashmap_t<pstring, pstring> m_models;
int m_proxy_cnt;
int m_frontier_cnt;
pstack_t<pstring> m_stack;
std::stack<pstring> m_stack;
source_t::list_t m_sources;
plist_t<pstring> m_lib;

View File

@ -12,7 +12,7 @@
#define PSTANDALONE (0)
#endif
//#define PHAS_INT128 (0)
#define PHAS_INT128 (0)
#ifndef PHAS_INT128
#define PHAS_INT128 (0)

View File

@ -13,6 +13,8 @@
#include <cstring>
#include <algorithm>
#include <cmath>
#include <stack>
#include <vector>
#include "palloc.h"
#include "pstring.h"
@ -55,15 +57,8 @@ public:
m_list = NULL;
}
/* using the [] operator will not allow gcc to vectorize code because
* basically a pointer is returned.
* array works around this.
*/
ATTR_HOT _ListClass *data() { return m_list; }
ATTR_HOT _ListClass& operator[](std::size_t index) { return m_list[index]; }
ATTR_HOT const _ListClass& operator[](std::size_t index) const { return m_list[index]; }
ATTR_HOT _ListClass& operator[](const std::size_t index) { return m_list[index]; }
ATTR_HOT const _ListClass& operator[](const std::size_t index) const { return m_list[index]; }
ATTR_HOT std::size_t size() const { return m_capacity; }
@ -93,385 +88,78 @@ private:
// ----------------------------------------------------------------------------------------
// plist_t: a simple list
// ----------------------------------------------------------------------------------------
#if 0
#include <vector>
//#define plist_t std::vector
template <typename _ListClass>
class plist_t : public std::vector<_ListClass>
{
public:
plist_t() : std::vector<_ListClass>() {}
plist_t(const int numElements) : std::vector<_ListClass>(numElements) {}
void add(const _ListClass &elem) { this->push_back(elem); }
void clear_and_free()
{
for (_ListClass *i = this->data(); i < this->data() + this->size(); i++)
for (_ListClass i : *this)
{
pfree(*i);
pfree(i);
}
this->clear();
}
bool contains(const _ListClass &elem) const
bool contains(const _ListClass &elem) const
{
for (const _ListClass *i = this->data(); i < this->data() + this->size(); i++)
{
if (*i == elem)
return true;
}
return false;
return (std::find(this->begin(), this->end(), elem) != this->end());
}
void remove(const _ListClass &elem)
void remove(const _ListClass &elem)
{
for (int i = 0; i < this->size(); i++)
{
if (this->at(i) == elem)
{
this->erase(this->begin() + i);
return;
}
}
}
void remove_at(const int pos)
{
this->erase(this->begin() + pos);
this->erase(std::remove(this->begin(), this->end(), elem), this->end());
}
int indexof(const _ListClass &elem) const
ATTR_HOT void insert_at(const std::size_t index, const _ListClass &elem)
{
for (int i = 0; i < this->size(); i++)
{
if (this->at(i) == elem)
return i;
}
return -1;
}
ATTR_HOT void swap(const int pos1, const int pos2)
{
//nl_assert((pos1>=0) && (pos1<m_count));
//nl_assert((pos2>=0) && (pos2<m_count));
_ListClass tmp = (*this)[pos1];
(*this)[pos1] = (*this)[pos2];
(*this)[pos2] =tmp;
}
};
#else
template <typename _ListClass>
class plist_t
{
public:
ATTR_COLD plist_t(const std::size_t numElements = 0)
{
m_capacity = numElements;
if (m_capacity == 0)
m_list = NULL;
else
m_list = this->alloc(m_capacity);
m_count = 0;
}
ATTR_COLD plist_t(const plist_t &rhs)
{
m_capacity = rhs.capacity();
if (m_capacity == 0)
m_list = NULL;
else
m_list = this->alloc(m_capacity);
m_count = 0;
for (std::size_t i=0; i<rhs.size(); i++)
{
this->add(rhs[i]);
}
}
ATTR_COLD plist_t &operator=(const plist_t &rhs)
{
this->clear();
for (std::size_t i=0; i<rhs.size(); i++)
{
this->add(rhs[i]);
}
return *this;
}
~plist_t()
{
if (m_list != NULL)
this->dealloc(m_list);
m_list = NULL;
}
ATTR_HOT _ListClass *data() { return m_list; }
ATTR_HOT _ListClass& operator[](std::size_t index) { return *(m_list + index); }
ATTR_HOT const _ListClass& operator[](std::size_t index) const { return *(m_list + index); }
ATTR_HOT void add(const _ListClass &elem)
{
if (m_count >= m_capacity){
std::size_t new_size = m_capacity * 2;
if (new_size < 32)
new_size = 32;
set_capacity(new_size);
}
m_list[m_count++] = elem;
}
ATTR_HOT void insert_at(const _ListClass &elem, const std::size_t index)
{
if (m_count >= m_capacity){
std::size_t new_size = m_capacity * 2;
if (new_size < 32)
new_size = 32;
set_capacity(new_size);
}
for (std::size_t i = m_count; i>index; i--)
m_list[i] = m_list[i-1];
m_list[index] = elem;
m_count++;
}
ATTR_HOT void remove(const _ListClass &elem)
{
for (std::size_t i = 0; i < m_count; i++)
{
if (m_list[i] == elem)
{
m_count --;
while (i < m_count)
{
m_list[i] = m_list[i+1];
i++;
}
return;
}
}
this->insert(this->begin() + index, elem);
}
ATTR_HOT void remove_at(const std::size_t pos)
{
//nl_assert((pos>=0) && (pos<m_count));
m_count--;
for (std::size_t i = pos; i < m_count; i++)
{
m_list[i] = m_list[i+1];
}
this->erase(this->begin() + pos);
}
ATTR_HOT void swap(const std::size_t pos1, const std::size_t pos2)
int indexof(const _ListClass &elem) const
{
//nl_assert((pos1>=0) && (pos1<m_count));
//nl_assert((pos2>=0) && (pos2<m_count));
_ListClass tmp = m_list[pos1];
m_list[pos1] = m_list[pos2];
m_list[pos2] =tmp;
}
ATTR_HOT bool contains(const _ListClass &elem) const
{
for (_ListClass *i = m_list; i < m_list + m_count; i++)
for (int i = 0; i < this->size(); i++)
{
if (*i == elem)
return true;
}
return false;
}
ATTR_HOT int indexof(const _ListClass &elem) const
{
for (std::size_t i = 0; i < m_count; i++)
{
if (m_list[i] == elem)
if (this->at(i) == elem)
return i;
}
return -1;
}
ATTR_HOT std::size_t size() const { return m_count; }
ATTR_HOT bool is_empty() const { return (m_count == 0); }
ATTR_HOT void clear() { m_count = 0; }
ATTR_HOT std::size_t capacity() const { return m_capacity; }
ATTR_COLD void clear_and_free()
{
for (_ListClass *i = m_list; i < m_list + m_count; i++)
{
pfree(*i);
}
clear();
}
private:
ATTR_COLD void set_capacity(const std::size_t new_capacity)
{
std::size_t cnt = size();
if (new_capacity > 0)
{
_ListClass *m_new = this->alloc(new_capacity);
_ListClass *pd = m_new;
if (cnt > new_capacity)
cnt = new_capacity;
if (m_list != NULL)
{
for (_ListClass *ps = m_list; ps < m_list + cnt; ps++, pd++)
*pd = *ps;
this->dealloc(m_list);
}
m_list = m_new;
m_count = cnt;
}
else
{
if (m_list != NULL)
this->dealloc(m_list);
m_list = NULL;
m_count = 0;
}
m_capacity = new_capacity;
}
_ListClass *alloc(const std::size_t n)
{
return palloc_array(_ListClass, n);
}
void dealloc(_ListClass *p)
{
pfree_array(p);
}
std::size_t m_count;
_ListClass * m_list;
std::size_t m_capacity;
};
#endif
// ----------------------------------------------------------------------------------------
// pnamedlist_t: a simple list of elements which have a name() interface
// ----------------------------------------------------------------------------------------
template <class _ListClass>
class pnamedlist_t : public plist_t<_ListClass>
{
public:
_ListClass find_by_name(const pstring &name) const
{
for (std::size_t i=0; i < this->size(); i++)
if (get_name((*this)[i]) == name)
return (*this)[i];
return _ListClass(NULL);
}
int index_by_name(const pstring &name) const
{
for (std::size_t i=0; i < this->size(); i++)
if (get_name((*this)[i]) == name)
return (int) i;
return -1;
}
void remove_by_name(const pstring &name)
{
plist_t<_ListClass>::remove(find_by_name(name));
}
bool add(_ListClass dev, bool allow_duplicate)
{
if (allow_duplicate)
plist_t<_ListClass>::add(dev);
else
{
if (!(this->find_by_name(get_name(dev)) == _ListClass(NULL)))
return false;
plist_t<_ListClass>::add(dev);
}
return true;
}
private:
template <typename T> const pstring &get_name(const T *elem) const { return elem->name(); }
template <typename T> const pstring &get_name(T *elem) const { return elem->name(); }
template <typename T> const pstring &get_name(const T &elem) const { return elem.name(); }
};
// ----------------------------------------------------------------------------------------
// pstack_t: a simple stack
// ----------------------------------------------------------------------------------------
template <class _StackClass>
class pstack_t
{
public:
ATTR_COLD pstack_t(const int numElements = 128)
: m_list(numElements)
{
}
ATTR_COLD pstack_t(const pstack_t &rhs)
: m_list(rhs.m_list)
{
}
ATTR_COLD pstack_t &operator=(const pstack_t &rhs)
{
m_list = rhs.m_list;
return *this;
}
~pstack_t()
{
}
ATTR_HOT void push(const _StackClass &elem)
{
m_list.add(elem);
}
ATTR_HOT _StackClass peek() const
{
return m_list[m_list.size() - 1];
}
ATTR_HOT _StackClass pop()
{
_StackClass ret = peek();
m_list.remove_at(m_list.size() - 1);
return ret;
}
ATTR_HOT int count() const { return m_list.size(); }
ATTR_HOT bool empty() const { return (m_list.size() == 0); }
ATTR_HOT void reset() { m_list.reset(); }
ATTR_HOT int capacity() const { return m_list.capacity(); }
private:
plist_t<_StackClass> m_list;
};
template <class _ListClass>
struct plinkedlist_element_t
{
plinkedlist_element_t() : m_next(NULL) {}
_ListClass * m_next;
};
// ----------------------------------------------------------------------------------------
// plinkedlist_t: a simple linked list
// the list allows insertions / deletions if used properly
// ----------------------------------------------------------------------------------------
template <class _ListClass>
class plinkedlist_t;
#if 1
template <class _ListClass>
struct plinkedlist_element_t
{
public:
friend class plinkedlist_t<_ListClass>;
plinkedlist_element_t() : m_next(NULL) {}
_ListClass *next() const { return m_next; }
private:
_ListClass * m_next;
};
template <class _ListClass>
class plinkedlist_t
{
@ -499,7 +187,7 @@ public:
}
p = p->m_next;
}
throw pexception("element not found");
//throw pexception("element not found");
}
}
@ -541,6 +229,87 @@ public:
private:
_ListClass *m_head;
};
#else
template <class _ListClass>
struct plinkedlist_element_t
{
public:
friend class plinkedlist_t<_ListClass>;
plinkedlist_element_t() : m_next(NULL), m_prev(NULL) {}
_ListClass *next() const { return m_next; }
private:
_ListClass * m_next;
_ListClass * m_prev;
};
template <class _ListClass>
class plinkedlist_t
{
public:
plinkedlist_t() : m_head(NULL), m_tail(NULL) {}
ATTR_HOT void insert(_ListClass &elem)
{
if (m_head != NULL)
m_head->m_prev = &elem;
elem.m_next = m_head;
elem.m_prev = NULL;
m_head = &elem;
if (m_tail == NULL)
m_tail = &elem;
}
ATTR_HOT void add(_ListClass &elem)
{
if (m_tail != NULL)
m_tail->m_next = &elem;
elem.m_prev = m_tail;
m_tail = &elem;
elem.m_next = NULL;
if (m_head == NULL)
m_head = &elem;
}
ATTR_HOT void remove(const _ListClass &elem)
{
if (prev(elem) == NULL)
{
m_head = next(elem);
if (m_tail == &elem)
m_tail = NULL;
}
else
prev(elem)->m_next = next(elem);
if (next(elem) == NULL)
{
m_tail = prev(elem);
if (m_head == &elem)
m_head = NULL;
}
else
next(elem)->m_prev = prev(elem);
}
ATTR_HOT static _ListClass *next(const _ListClass &elem) { return static_cast<_ListClass *>(elem.m_next); }
ATTR_HOT static _ListClass *next(const _ListClass *elem) { return static_cast<_ListClass *>(elem->m_next); }
ATTR_HOT static _ListClass *prev(const _ListClass &elem) { return static_cast<_ListClass *>(elem.m_prev); }
ATTR_HOT static _ListClass *prev(const _ListClass *elem) { return static_cast<_ListClass *>(elem->m_prev); }
ATTR_HOT _ListClass *first() const { return m_head; }
ATTR_HOT void clear() { m_head = m_tail = NULL; }
ATTR_HOT bool is_empty() const { return (m_head == NULL); }
private:
_ListClass *m_head;
_ListClass *m_tail;
};
#endif
// ----------------------------------------------------------------------------------------
// string list
@ -562,7 +331,7 @@ public:
{
pstring t = str.substr(p, pn - p);
if (!ignore_empty || t.len() != 0)
this->add(t);
this->push_back(t);
p = pn + onstr.len();
pn = str.find(onstr, p);
}
@ -570,7 +339,7 @@ public:
{
pstring t = str.substr(p);
if (!ignore_empty || t.len() != 0)
this->add(t);
this->push_back(t);
}
}
@ -594,10 +363,10 @@ public:
if (p>=0)
{
if (col != "")
temp.add(col);
temp.push_back(col);
col = "";
temp.add(onstrl[p]);
temp.push_back(onstrl[p]);
i += onstrl[p].blen();
}
else
@ -608,7 +377,7 @@ public:
}
}
if (col != "")
temp.add(col);
temp.push_back(col);
return temp;
}
};
@ -768,7 +537,7 @@ public:
if (m_hash[pos] == -1)
{
unsigned vpos = m_values.size();
m_values.add(element_t(key, hash, value));
m_values.push_back(element_t(key, hash, value));
m_hash[pos] = vpos;
}
else
@ -781,7 +550,7 @@ public:
return false; /* duplicate */
}
unsigned vpos = m_values.size();
m_values.add(element_t(key, hash, value));
m_values.push_back(element_t(key, hash, value));
m_values[vpos].m_next = m_hash[pos];
m_hash[pos] = vpos;
}

View File

@ -127,7 +127,7 @@ public:
int i=0;
while (o[i] != NULL)
{
m_opts.add(o[i]);
m_opts.push_back(o[i]);
i++;
}
}
@ -139,7 +139,7 @@ public:
void register_option(poption *opt)
{
m_opts.add(opt);
m_opts.push_back(opt);
}
int parse(int argc, char *argv[])

View File

@ -255,16 +255,16 @@ ATTR_COLD void ptokenizer::error(const pstring &errs)
ppreprocessor::ppreprocessor()
: m_ifflag(0), m_level(0), m_lineno(0)
{
m_expr_sep.add("!");
m_expr_sep.add("(");
m_expr_sep.add(")");
m_expr_sep.add("+");
m_expr_sep.add("-");
m_expr_sep.add("*");
m_expr_sep.add("/");
m_expr_sep.add("==");
m_expr_sep.add(" ");
m_expr_sep.add("\t");
m_expr_sep.push_back("!");
m_expr_sep.push_back("(");
m_expr_sep.push_back(")");
m_expr_sep.push_back("+");
m_expr_sep.push_back("-");
m_expr_sep.push_back("*");
m_expr_sep.push_back("/");
m_expr_sep.push_back("==");
m_expr_sep.push_back(" ");
m_expr_sep.push_back("\t");
m_defines.add("__PLIB_PREPROCESSOR__", define_t("__PLIB_PREPROCESSOR__", "1"));
}

View File

@ -96,7 +96,7 @@ public:
token_id_t register_token(pstring token)
{
m_tokens.add(token);
m_tokens.push_back(token);
return token_id_t(m_tokens.size() - 1);
}

View File

@ -37,7 +37,7 @@ ATTR_COLD void pstate_manager_t::save_state_ptr(const pstring &stname, const pst
};
pstate_entry_t *p = palloc(pstate_entry_t(stname, dt, owner, size, count, ptr, is_ptr));
m_save.add(p);
m_save.push_back(p);
}
ATTR_COLD void pstate_manager_t::remove_save_items(const void *owner)
@ -47,7 +47,7 @@ ATTR_COLD void pstate_manager_t::remove_save_items(const void *owner)
for (std::size_t i=0; i < m_save.size(); i++)
{
if (m_save[i]->m_owner == owner)
todelete.add(m_save[i]);
todelete.push_back(m_save[i]);
}
for (std::size_t i=0; i < todelete.size(); i++)
{
@ -75,6 +75,6 @@ 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.add(p);
m_save.push_back(p);
state.register_state(*this, stname);
}

View File

@ -101,7 +101,7 @@ void pifilestream::close()
}
}
unsigned pifilestream::vread(void *buf, unsigned n)
unsigned pifilestream::vread(void *buf, const unsigned n)
{
std::size_t r = fread(buf, 1, n, (FILE *) m_file);
if (r < n)
@ -115,7 +115,7 @@ unsigned pifilestream::vread(void *buf, unsigned n)
return r;
}
void pifilestream::vseek(pos_type n)
void pifilestream::vseek(const pos_type n)
{
check_seekable();
if (fseek((FILE *) m_file, SEEK_SET, n) < 0)
@ -200,7 +200,7 @@ void pofilestream::close()
}
}
void pofilestream::vwrite(const void *buf, unsigned n)
void pofilestream::vwrite(const void *buf, const unsigned n)
{
std::size_t r = fwrite(buf, 1, n, (FILE *) m_file);
if (r < n)
@ -211,7 +211,7 @@ void pofilestream::vwrite(const void *buf, unsigned n)
m_pos += r;
}
void pofilestream::vseek(pos_type n)
void pofilestream::vseek(const pos_type n)
{
check_seekable();
if (fseek((FILE *) m_file, SEEK_SET, n) < 0)
@ -271,7 +271,7 @@ pimemstream::~pimemstream()
{
}
unsigned pimemstream::vread(void *buf, unsigned n)
unsigned pimemstream::vread(void *buf, const unsigned n)
{
unsigned ret = (m_pos + n <= m_len) ? n : m_len - m_pos;
@ -287,7 +287,7 @@ unsigned pimemstream::vread(void *buf, unsigned n)
return ret;
}
void pimemstream::vseek(pos_type n)
void pimemstream::vseek(const pos_type n)
{
m_pos = (n>=m_len) ? m_len : n;
clear_flag(FLAG_EOF);
@ -314,7 +314,7 @@ pomemstream::~pomemstream()
pfree_array(m_mem);
}
void pomemstream::vwrite(const void *buf, unsigned n)
void pomemstream::vwrite(const void *buf, const unsigned n)
{
if (m_pos + n >= m_capacity)
{
@ -336,7 +336,7 @@ void pomemstream::vwrite(const void *buf, unsigned n)
m_size = std::max(m_pos, m_size);
}
void pomemstream::vseek(pos_type n)
void pomemstream::vseek(const pos_type n)
{
m_pos = n;
m_size = std::max(m_pos, m_size);

View File

@ -314,7 +314,7 @@ long pstring_t<F>::as_long(bool *error) const
#if 1
static pstack_t<pstr_t *> *stk = NULL;
static std::stack<pstr_t *> *stk = NULL;
static inline unsigned countleadbits(unsigned x)
{
@ -373,7 +373,7 @@ template<typename F>
pstr_t *pstring_t<F>::salloc(int n)
{
if (stk == NULL)
stk = palloc_array(pstack_t<pstr_t *>, 17);
stk = palloc_array(std::stack<pstr_t *>, 17);
pstr_t *p;
unsigned sn= ((32 - countleadbits(n)) + 1) / 2;
unsigned size = sizeof(pstr_t) + ((UINT64) 1<<(sn * 2)) + 1;
@ -381,7 +381,8 @@ pstr_t *pstring_t<F>::salloc(int n)
p = (pstr_t *) palloc_array(char, size);
else
{
p = stk[sn].pop();
p = stk[sn].top();
stk[sn].pop();
}
// str_t *p = (str_t *) _mm_malloc(size, 8);
@ -395,8 +396,11 @@ void pstring_t<F>::resetmem()
{
for (unsigned i=0; i<=16; i++)
{
for (; stk[i].count() > 0; )
pfree_array(stk[i].pop());
for (; stk[i].size() > 0; )
{
pfree_array(stk[i].top());
stk[i].pop();
}
}
pfree_array(stk);
stk = NULL;

View File

@ -272,7 +272,7 @@ plist_t<input_t> *read_input(netlist::netlist_t *netlist, pstring fname)
if (l != "")
{
input_t inp(netlist, l);
ret->add(inp);
ret->push_back(inp);
}
}
}

View File

@ -206,8 +206,8 @@ ATTR_COLD void matrix_solver_direct_t<m_N, _storage_N>::vsetup(analog_net_t::lis
{
if ((m_terms[i]->m_railstart - m_terms[i+1]->m_railstart) * sort_order < 0)
{
std::swap(m_terms[i],m_terms[i+1]);
m_nets.swap(i, i+1);
std::swap(m_terms[i], m_terms[i+1]);
std::swap(m_nets[i], m_nets[i+1]);
}
}
@ -253,14 +253,14 @@ ATTR_COLD void matrix_solver_direct_t<m_N, _storage_N>::vsetup(analog_net_t::lis
for (unsigned i = 0; i < t->m_railstart; i++)
{
if (!t->m_nzrd.contains(other[i]) && other[i] >= (int) (k + 1))
t->m_nzrd.add(other[i]);
t->m_nzrd.push_back(other[i]);
if (!t->m_nz.contains(other[i]))
t->m_nz.add(other[i]);
t->m_nz.push_back(other[i]);
}
}
psort_list(t->m_nzrd);
t->m_nz.add(k); // add diagonal
t->m_nz.push_back(k); // add diagonal
psort_list(t->m_nz);
}
@ -283,7 +283,7 @@ ATTR_COLD void matrix_solver_direct_t<m_N, _storage_N>::vsetup(analog_net_t::lis
if (touched[row][k])
{
if (!m_terms[k]->m_nzbd.contains(row))
m_terms[k]->m_nzbd.add(row);
m_terms[k]->m_nzbd.push_back(row);
for (unsigned col = k; col < N(); col++)
if (touched[k][col])
touched[row][col] = true;

View File

@ -287,7 +287,7 @@ ATTR_COLD void matrix_solver_direct_t<m_N, _storage_N>::vsetup(analog_net_t::lis
if ((m_terms[i]->m_railstart - m_terms[i+1]->m_railstart) * sort_order < 0)
{
std::swap(m_terms[i],m_terms[i+1]);
m_nets.swap(i, i+1);
std::swap(m_nets[i], m_nets[i+1]);
}
}

View File

@ -114,7 +114,7 @@ void matrix_solver_GMRES_t<m_N, _storage_N>::vsetup(analog_net_t::list_t &nets)
for (unsigned i = mat.ia[k]; i<nz; i++)
if (this->m_terms[k]->net_other()[j] == (int) mat.ja[i])
{
m_term_cr[k].add(i);
m_term_cr[k].push_back(i);
break;
}
nl_assert(m_term_cr[k].size() == this->m_terms[k]->m_railstart);

View File

@ -9,8 +9,11 @@
* the vectorizations fast-math enables pretty expensive
*/
#pragma GCC optimize "-ffast-math"
#pragma GCC optimize "-fstrict-aliasing"
#if 0
#pragma GCC optimize "-ffast-math"
#pragma GCC optimize "-fstrict-aliasing"
//#pragma GCC optimize "-ftree-parallelize-loops=4"
#pragma GCC optimize "-funroll-loops"
#pragma GCC optimize "-funswitch-loops"
@ -54,21 +57,21 @@ ATTR_COLD void terms_t::add(terminal_t *term, int net_other, bool sorted)
{
if (m_net_other[i] > net_other)
{
m_term.insert_at(term, i);
m_net_other.insert_at(net_other, i);
m_gt.insert_at(0.0, i);
m_go.insert_at(0.0, i);
m_Idr.insert_at(0.0, i);
m_other_curanalog.insert_at(NULL, i);
m_term.insert_at(i, term);
m_net_other.insert_at(i, net_other);
m_gt.insert_at(i, 0.0);
m_go.insert_at(i, 0.0);
m_Idr.insert_at(i, 0.0);
m_other_curanalog.insert_at(i, NULL);
return;
}
}
m_term.add(term);
m_net_other.add(net_other);
m_gt.add(0.0);
m_go.add(0.0);
m_Idr.add(0.0);
m_other_curanalog.add(NULL);
m_term.push_back(term);
m_net_other.push_back(net_other);
m_gt.push_back(0.0);
m_go.push_back(0.0);
m_Idr.push_back(0.0);
m_other_curanalog.push_back(NULL);
}
ATTR_COLD void terms_t::set_pointers()
@ -109,10 +112,8 @@ ATTR_COLD void matrix_solver_t::setup(analog_net_t::list_t &nets)
m_nets.clear();
for (std::size_t k = 0; k < nets.size(); k++)
{
m_nets.add(nets[k]);
}
for (auto & net : nets)
m_nets.push_back(net);
for (std::size_t k = 0; k < nets.size(); k++)
{
@ -122,9 +123,8 @@ ATTR_COLD void matrix_solver_t::setup(analog_net_t::list_t &nets)
net->m_solver = this;
for (std::size_t i = 0; i < net->m_core_terms.size(); i++)
for (core_terminal_t *p : net->m_core_terms)
{
core_terminal_t *p = net->m_core_terms[i];
log().debug("{1} {2} {3}\n", p->name(), net->name(), (int) net->isRailNet());
switch (p->type())
{
@ -133,7 +133,7 @@ ATTR_COLD void matrix_solver_t::setup(analog_net_t::list_t &nets)
{
case device_t::CAPACITOR:
if (!m_step_devices.contains(&p->device()))
m_step_devices.add(&p->device());
m_step_devices.push_back(&p->device());
break;
case device_t::BJT_EB:
case device_t::DIODE:
@ -141,7 +141,7 @@ ATTR_COLD void matrix_solver_t::setup(analog_net_t::list_t &nets)
case device_t::BJT_SWITCH:
log().debug("found BJT/Diode/LVCCS\n");
if (!m_dynamic_devices.contains(&p->device()))
m_dynamic_devices.add(&p->device());
m_dynamic_devices.push_back(&p->device());
break;
default:
break;
@ -155,10 +155,10 @@ ATTR_COLD void matrix_solver_t::setup(analog_net_t::list_t &nets)
case terminal_t::INPUT:
{
analog_output_t *net_proxy_output = NULL;
for (std::size_t j = 0; j < m_inps.size(); j++)
if (m_inps[j]->m_proxied_net == &p->net().as_analog())
for (auto & input : m_inps)
if (input->m_proxied_net == &p->net().as_analog())
{
net_proxy_output = m_inps[j];
net_proxy_output = input;
break;
}
@ -166,7 +166,7 @@ ATTR_COLD void matrix_solver_t::setup(analog_net_t::list_t &nets)
{
net_proxy_output = palloc(analog_output_t);
net_proxy_output->init_object(*this, this->name() + "." + pfmt("m{1}")(m_inps.size()));
m_inps.add(net_proxy_output);
m_inps.push_back(net_proxy_output);
net_proxy_output->m_proxied_net = &p->net().as_analog();
}
net_proxy_output->net().register_con(*p);
@ -399,9 +399,9 @@ NETLIB_UPDATE(solver)
if (m_params.m_dynamic)
return;
const std::size_t t_cnt = m_mat_solvers.size();
#if HAS_OPENMP && USE_OPENMP
const std::size_t t_cnt = m_mat_solvers.size();
if (m_parallel.Value())
{
omp_set_num_threads(3);
@ -425,14 +425,10 @@ NETLIB_UPDATE(solver)
ATTR_UNUSED const nl_double ts = m_mat_solvers[i]->solve();
}
#else
for (std::size_t i = 0; i < t_cnt; i++)
{
if (m_mat_solvers[i]->is_timestep())
{
for (auto & solver : m_mat_solvers)
if (solver->is_timestep())
// Ignore return value
ATTR_UNUSED const nl_double ts = m_mat_solvers[i]->solve();
}
}
ATTR_UNUSED const nl_double ts = solver->solve();
#endif
/* step circuit */
@ -518,13 +514,13 @@ ATTR_COLD void NETLIB_NAME(solver)::post_start()
netlist().log().verbose("Scanning net groups ...");
// determine net groups
for (std::size_t i=0; i<netlist().m_nets.size(); i++)
for (auto & net : netlist().m_nets)
{
netlist().log().debug("processing {1}\n", netlist().m_nets[i]->name());
if (!netlist().m_nets[i]->isRailNet())
netlist().log().debug("processing {1}\n", net->name());
if (!net->isRailNet())
{
netlist().log().debug(" ==> not a rail net\n");
analog_net_t *n = &netlist().m_nets[i]->as_analog();
analog_net_t *n = &net->as_analog();
if (!n->already_processed(groups, cur_group))
{
cur_group++;
@ -621,7 +617,7 @@ ATTR_COLD void NETLIB_NAME(solver)::post_start()
ms->vsetup(groups[i]);
m_mat_solvers.add(ms);
m_mat_solvers.push_back(ms);
netlist().log().verbose("Solver {1}", ms->name());
netlist().log().verbose(" # {1} ==> {2} nets", i, groups[i].size());

View File

@ -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();
}

View File

@ -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[];

View File

@ -127,7 +127,8 @@ void osd_free_executable(void *ptr, size_t size)
void osd_break_into_debugger(const char *message)
{
#ifdef MAME_DEBUG
//#ifdef MAME_DEBUG
#if 1
printf("MAME exception: %s\n", message);
printf("Attempting to fall into debugger\n");
kill(getpid(), SIGTRAP);