Clean up net_t interface and increase readability. (nw)

This commit is contained in:
couriersud 2017-02-20 01:51:42 +01:00
parent f222e7731d
commit 5c4b7cfef8
18 changed files with 48 additions and 61 deletions

View File

@ -960,7 +960,8 @@ netlist_mame_cpu_device_t::netlist_mame_cpu_device_t(const machine_config &mconf
device_state_interface(mconfig, *this),
device_disasm_interface(mconfig, *this),
device_memory_interface(mconfig, *this),
m_program_config("program", ENDIANNESS_LITTLE, 8, 12) // Interface is needed to keep debugger happy
m_program_config("program", ENDIANNESS_LITTLE, 8, 12), // Interface is needed to keep debugger happy
m_genPC(0)
{
}
@ -1055,7 +1056,12 @@ ATTR_HOT void netlist_mame_cpu_device_t::execute_run()
netlist_mame_sound_device_t::netlist_mame_sound_device_t(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
: netlist_mame_device_t(mconfig, NETLIST_CPU, "Netlist Sound Device", tag, owner, clock, "netlist_sound", __FILE__),
device_sound_interface(mconfig, *this)
device_sound_interface(mconfig, *this),
m_out{nullptr},
m_in(nullptr),
m_stream(nullptr),
m_num_inputs(0),
m_num_outputs(0)
{
}

View File

@ -309,11 +309,11 @@ NETLIB_RESET(QBJT_switch)
NETLIB_UPDATE(QBJT_switch)
{
if (!m_RB.m_P.net().isRailNet())
m_RB.m_P.schedule_solve(); // Basis
m_RB.m_P.solve_now(); // Basis
else if (!m_RB.m_N.net().isRailNet())
m_RB.m_N.schedule_solve(); // Emitter
m_RB.m_N.solve_now(); // Emitter
else if (!m_RC.m_P.net().isRailNet())
m_RC.m_P.schedule_solve(); // Collector
m_RC.m_P.solve_now(); // Collector
}
@ -372,11 +372,11 @@ NETLIB_UPDATE_TERMINALS(QBJT_switch)
NETLIB_UPDATE(QBJT_EB)
{
if (!m_D_EB.m_P.net().isRailNet())
m_D_EB.m_P.schedule_solve(); // Basis
m_D_EB.m_P.solve_now(); // Basis
else if (!m_D_EB.m_N.net().isRailNet())
m_D_EB.m_N.schedule_solve(); // Emitter
m_D_EB.m_N.solve_now(); // Emitter
else
m_D_CB.m_N.schedule_solve(); // Collector
m_D_CB.m_N.solve_now(); // Collector
}
NETLIB_RESET(QBJT_EB)

View File

@ -49,10 +49,8 @@
// Generic macros
// -----------------------------------------------------------------------------
#ifdef RES_R
// FIXME: avoid compile fails
// #warning "Do not include rescap.h in a netlist environment"
#warning "Do not include rescap.h in a netlist environment"
#endif
#ifndef RES_R
#define RES_R(res) (static_cast<double>(res))

View File

@ -40,13 +40,13 @@ NETLIB_UPDATE(VCCS)
{
/* only called if connected to a rail net ==> notify the solver to recalculate */
if (!m_IP.net().isRailNet())
m_IP.schedule_solve();
m_IP.solve_now();
else if (!m_IN.net().isRailNet())
m_IN.schedule_solve();
m_IN.solve_now();
else if (!m_OP.net().isRailNet())
m_OP.schedule_solve();
m_OP.solve_now();
else if (!m_ON.net().isRailNet())
m_ON.schedule_solve();
m_ON.solve_now();
}
// ----------------------------------------------------------------------------------------

View File

@ -88,9 +88,9 @@ NETLIB_UPDATE(twoterm)
/* only called if connected to a rail net ==> notify the solver to recalculate */
/* we only need to call the non-rail terminal */
if (m_P.has_net() && !m_P.net().isRailNet())
m_P.schedule_solve();
m_P.solve_now();
else if (m_N.has_net() && !m_N.net().isRailNet())
m_N.schedule_solve();
m_N.solve_now();
}
// ----------------------------------------------------------------------------------------

View File

@ -67,7 +67,7 @@ namespace netlist
{
m_R.update_dev();
m_R.set_R(R);
m_R.m_P.schedule_after(NLTIME_FROM_NS(1));
m_R.m_P.schedule_solve_after(NLTIME_FROM_NS(1));
}
else
{

View File

@ -47,7 +47,7 @@ namespace netlist { namespace devices {
m_R.set_R(m_base_r());
else
m_R.set_R(NL_FCONST(1.0) / netlist().gmin());
m_R.m_P.schedule_after(NLTIME_FROM_NS(1));
m_R.m_P.schedule_solve_after(NLTIME_FROM_NS(1));
}
NETLIB_DEVICE_IMPL(CD4316_GATE)

View File

@ -109,7 +109,7 @@ namespace netlist
if (m_is_timestep)
m_RV.update_dev();
m_RV.set(NL_FCONST(1.0) / R, V, 0.0);
m_RV.m_P.schedule_after(NLTIME_FROM_NS(1));
m_RV.m_P.schedule_solve_after(NLTIME_FROM_NS(1));
}
}

View File

@ -110,12 +110,12 @@ namespace netlist
{
m_R.update_dev();
m_R.set_R(R);
m_R.m_P.schedule_after(NLTIME_FROM_NS(1));
m_R.m_P.schedule_solve_after(NLTIME_FROM_NS(1));
}
else
{
m_R.set_R(R);
m_R.m_P.schedule_after(NLTIME_FROM_NS(1));
m_R.m_P.schedule_solve_after(NLTIME_FROM_NS(1));
//m_R->update_dev();
}
}

View File

@ -165,7 +165,7 @@ namespace netlist
m_RV.update_dev();
}
m_RV.set(NL_FCONST(1.0) / R, V, 0.0);
m_RV.m_P.schedule_after(NLTIME_FROM_NS(1));
m_RV.m_P.schedule_solve_after(NLTIME_FROM_NS(1));
}
}

View File

@ -476,7 +476,7 @@ NETLIST_END()
*
* Naming conventions follow National Semiconductor datasheet
*
* FIXME: Same as 7400, but drains higher output currents.
* NOTE: Same as 7400, but drains higher output currents.
* Netlist currently does not model over currents (should it ever?)
*/

View File

@ -845,7 +845,7 @@ void detail::net_t::update_devs() NL_NOEXCEPT
{
nl_assert(this->isRailNet());
const unsigned masks[4] =
const uint8_t masks[4] =
{
0,
core_terminal_t::STATE_INP_LH | core_terminal_t::STATE_INP_ACTIVE,
@ -853,7 +853,7 @@ void detail::net_t::update_devs() NL_NOEXCEPT
0
};
const unsigned mask = masks[ (m_cur_Q << 1) | m_new_Q ];
const auto mask = masks[ (m_cur_Q << 1) | m_new_Q ];
m_cur_Q = m_new_Q;
m_in_queue = 2; /* mark as taken ... */
@ -1029,19 +1029,17 @@ terminal_t::~terminal_t()
{
}
void terminal_t::schedule_solve()
void terminal_t::solve_now()
{
// Nets may belong to railnets which do not have a solver attached
// FIXME: Enforce that all terminals get connected?
if (this->has_net())
if (net().solver() != nullptr)
net().solver()->update_forced();
}
void terminal_t::schedule_after(const netlist_time &after)
void terminal_t::schedule_solve_after(const netlist_time &after)
{
// Nets may belong to railnets which do not have a solver attached
// FIXME: Enforce that all terminals get connected?
if (this->has_net())
if (net().solver() != nullptr)
net().solver()->update_after(after);

View File

@ -573,8 +573,8 @@ namespace netlist
set_ptr(m_gt1, GT);
}
void schedule_solve();
void schedule_after(const netlist_time &after);
void solve_now();
void schedule_solve_after(const netlist_time &after);
void set_ptrs(nl_double *gt, nl_double *go, nl_double *Idr)
{
@ -698,11 +698,15 @@ namespace netlist
void reset();
void toggle_new_Q() NL_NOEXCEPT { m_new_Q ^= 1; }
void force_queue_execution() NL_NOEXCEPT { m_new_Q = (m_cur_Q ^ 1); }
void toggle_new_Q() NL_NOEXCEPT { m_new_Q = (m_cur_Q ^ 1); }
void toggle_and_push_to_queue(const netlist_time delay) NL_NOEXCEPT
{
toggle_new_Q();
push_to_queue(delay);
}
void push_to_queue(const netlist_time delay) NL_NOEXCEPT;
void reschedule_in_queue(const netlist_time delay) NL_NOEXCEPT;
bool is_queued() const NL_NOEXCEPT { return m_in_queue == 1; }
void update_devs() NL_NOEXCEPT;
@ -1403,18 +1407,6 @@ namespace netlist
}
}
// FIXME: this could be removed after testing
inline void detail::net_t::reschedule_in_queue(const netlist_time delay) NL_NOEXCEPT
{
if (is_queued())
netlist().queue().remove(this);
m_time = netlist().time() + delay;
m_in_queue = (m_active > 0); /* queued ? */
if (m_in_queue)
netlist().queue().push(queue_t::entry_t(m_time, this));
}
inline const analog_net_t & analog_t::net() const NL_NOEXCEPT
{
return static_cast<const analog_net_t &>(core_terminal_t::net());
@ -1452,8 +1444,7 @@ namespace netlist
if (newQ != m_my_net.Q_Analog())
{
m_my_net.set_Q_Analog(newQ);
m_my_net.toggle_new_Q();
m_my_net.push_to_queue(NLTIME_FROM_NS(1));
m_my_net.toggle_and_push_to_queue(NLTIME_FROM_NS(1));
}
}

View File

@ -380,8 +380,7 @@ void matrix_solver_t::update() NL_NOEXCEPT
if (m_params.m_dynamic_ts && has_timestep_devices() && new_timestep > netlist_time::zero())
{
m_Q_sync.net().force_queue_execution();
m_Q_sync.net().reschedule_in_queue(new_timestep);
m_Q_sync.net().toggle_and_push_to_queue(new_timestep);
}
}
@ -392,8 +391,7 @@ void matrix_solver_t::update_forced()
if (m_params.m_dynamic_ts && has_timestep_devices())
{
m_Q_sync.net().force_queue_execution();
m_Q_sync.net().reschedule_in_queue(netlist_time::from_double(m_params.m_min_timestep));
m_Q_sync.net().toggle_and_push_to_queue(netlist_time::from_double(m_params.m_min_timestep));
}
}
@ -424,8 +422,7 @@ void matrix_solver_t::solve_base()
if (this_resched > 1 && !m_Q_sync.net().is_queued())
{
log().warning(MW_1_NEWTON_LOOPS_EXCEEDED_ON_NET_1, this->name());
m_Q_sync.net().toggle_new_Q();
m_Q_sync.net().reschedule_in_queue(m_params.m_nr_recalc_delay);
m_Q_sync.net().toggle_and_push_to_queue(m_params.m_nr_recalc_delay);
}
}
else

View File

@ -125,8 +125,7 @@ public:
void update_forced();
void update_after(const netlist_time &after)
{
m_Q_sync.net().force_queue_execution();
m_Q_sync.net().reschedule_in_queue(after);
m_Q_sync.net().toggle_and_push_to_queue(after);
}
/* netdevice functions */

View File

@ -136,8 +136,7 @@ NETLIB_UPDATE(solver)
/* step circuit */
if (!m_Q_step.net().is_queued())
{
m_Q_step.net().toggle_new_Q();
m_Q_step.net().push_to_queue(netlist_time::from_double(m_params.m_max_timestep));
m_Q_step.net().toggle_and_push_to_queue(netlist_time::from_double(m_params.m_max_timestep));
}
}

View File

@ -228,7 +228,7 @@ nl_convert_base_t::unit_t nl_convert_base_t::m_units[] = {
{"M", "CAP_M({1})", 1.0e-3 },
{"u", "CAP_U({1})", 1.0e-6 }, /* eagle */
{"U", "CAP_U({1})", 1.0e-6 },
{"??", "CAP_U({1})", 1.0e-6 }, /* FIXME */
{"μ", "CAP_U({1})", 1.0e-6 },
{"N", "CAP_N({1})", 1.0e-9 },
{"pF", "CAP_P({1})", 1.0e-12},
{"P", "CAP_P({1})", 1.0e-12},

View File

@ -10,7 +10,6 @@
#include "cpu/m6800/m6800.h"
#include "sound/discrete.h"
#include "audio/irem.h"
#include "netlist/devices/net_lib.h"
const device_type IREM_M62_AUDIO = &device_creator<m62_audio_device>;
const device_type IREM_M52_SOUNDC_AUDIO = &device_creator<m52_soundc_audio_device>;