netlist: remove soft reset support.

* Electronic circuits and base components like resistors or capacitors
do not have a reset line. You can use them to create reset circuits.
There is thus no point to support soft reset, the equivalent to pressing
the reset button.
* Fixed some bugs around reset and start up logic.
* This also fixes the "scramble F3" crash.
This commit is contained in:
couriersud 2020-07-05 15:49:59 +02:00
parent 9e86f5e866
commit e339a280f4
10 changed files with 73 additions and 32 deletions

View File

@ -824,8 +824,10 @@ void netlist_mame_stream_output_device::device_start()
void netlist_mame_stream_output_device::device_reset()
{
LOGDEVCALLS("reset %s\n", name());
#if 0
m_cur = 0.0;
m_last_buffer_time = netlist::netlist_time_ext::zero();
#endif
}
void netlist_mame_stream_output_device::sound_update_fill(std::size_t samples, stream_sample_t *target)
@ -906,6 +908,7 @@ netlist_mame_device::netlist_mame_device(const machine_config &mconfig, device_t
, m_attotime_per_clock(attotime::zero)
, m_old(netlist::netlist_time_ext::zero())
, m_setup_func(nullptr)
, m_device_reset_called(false)
{
}
@ -1045,6 +1048,10 @@ void netlist_mame_device::device_start()
m_old = netlist::netlist_time_ext::zero();
m_rem = netlist::netlist_time_ext::zero();
m_cur_time = attotime::zero;
m_device_reset_called = false;
LOGDEVCALLS("device_start exit\n");
}
@ -1061,10 +1068,17 @@ void netlist_mame_device::device_clock_changed()
void netlist_mame_device::device_reset()
{
LOGDEVCALLS("device_reset\n");
m_cur_time = attotime::zero;
m_old = netlist::netlist_time_ext::zero();
m_rem = netlist::netlist_time_ext::zero();
netlist().exec().reset();
if (!m_device_reset_called)
{
// netlists don't have a reset line, doing a soft-reset is pointless
// the only reason we call these here once after device_start
// is that netlist input devices may be started after the netlist device
// and because the startup code may trigger actions which need all
// devices set up.
netlist().free_setup_resources();
netlist().exec().reset();
m_device_reset_called = true;
}
}
void netlist_mame_device::device_stop()

View File

@ -127,6 +127,7 @@ private:
std::unique_ptr<netlist_mame_t> m_netlist;
func_type m_setup_func;
bool m_device_reset_called;
};
// ----------------------------------------------------------------------------------------

View File

@ -119,7 +119,7 @@ void fixedfreq_monitor_state::update_sync_channel(const time_type &time, const d
/* falling composite */
//LOG("HSYNC down %f %d %f\n", time * 1e6, m_last_x, m_sync_signal);
}
m_last_sync = newval;
m_last_sync_val = newval;
m_last_sync_time = time;
}
@ -237,7 +237,7 @@ void fixedfreq_device::device_start()
m_state.start();
// FIXME: will be done by netlist going forward
save_item(NAME(m_state.m_last_sync));
save_item(NAME(m_state.m_last_sync_val));
save_item(NAME(m_state.m_last_x));
save_item(NAME(m_state.m_last_y));
save_item(NAME(m_state.m_last_sync_time));

View File

@ -123,7 +123,7 @@ struct fixedfreq_monitor_state
fixedfreq_monitor_state(fixedfreq_monitor_desc &desc, fixedfreq_monitor_intf &intf)
: m_desc(desc),
m_intf(intf),
m_last_sync(0),
m_last_sync_val(0),
m_col(0),
m_last_x(0),
m_last_y(0),
@ -145,7 +145,7 @@ struct fixedfreq_monitor_state
// FIXME: once moved to netlist this may no longer be necessary.
// Only copies constructor init
m_last_sync = 0.0;
m_last_sync_val = 0.0;
m_col = rgb_t(0,0,0);
m_last_x = 0;
m_last_y = 0;
@ -177,18 +177,11 @@ struct fixedfreq_monitor_state
void reset()
{
m_last_sync = 0;
m_last_sync_val = 0;
m_col = 0;
m_last_x = 0;
m_last_y = 0;
//m_last_sync_time = time_type(0);
//m_line_time = time_type(0);
//m_last_hsync_time = time_type(0);
//m_last_vsync_time = time_type(0);
//m_clock_period = time_type(0);
m_vsync_filter = 0;
//m_vsync_threshold = 0;
//m_vsync_filter_timeconst = 0;
m_sig_vsync = 0;
m_sig_composite = 0;
m_sig_field = 0;
@ -206,7 +199,7 @@ struct fixedfreq_monitor_state
const fixedfreq_monitor_desc &m_desc;
fixedfreq_monitor_intf &m_intf;
double m_last_sync;
double m_last_sync_val;
uint32_t m_col;
float m_last_x;
int m_last_y;

View File

@ -126,6 +126,14 @@ namespace analog
m_N.set_go_gt_I(a21, a22, rhs2);
}
void clear_mat() const noexcept
{
const auto z = nlconst::zero();
// GO, GT, I
m_P.set_go_gt_I(z, z, z);
m_N.set_go_gt_I(z, z, z);
}
/// \brief Get a const reference to the m_P terminal
///
/// This is typically called during initialization to connect
@ -317,6 +325,7 @@ namespace analog
NETLIB_RESETI()
{
m_cap.setparams(exec().gmin());
clear_mat();
}
/// \brief Set capacitance

View File

@ -272,19 +272,24 @@ namespace netlist
log().debug("Searching for solver\n");
m_solver = m_state.get_single_device<devices::NETLIB_NAME(solver)>("solver");
m_time = netlist_time_ext::zero();
// Don't reset time
//m_time = netlist_time_ext::zero();
m_queue.clear();
if (m_mainclock != nullptr)
m_mainclock->m_Q.net().set_next_scheduled_time(netlist_time_ext::zero());
m_mainclock->m_Q.net().set_next_scheduled_time(m_time);
//if (m_solver != nullptr)
// m_solver->reset();
m_state.reset();
}
void netlist_state_t::reset()
void netlist_state_t::free_setup_resources()
{
m_setup = nullptr;
}
void netlist_state_t::reset()
{
// Reset all nets once !
log().verbose("Call reset on all nets:");
for (auto & n : nets())
@ -637,7 +642,7 @@ namespace netlist
void detail::net_t::reset() noexcept
{
m_next_scheduled_time = netlist_time_ext::zero();
m_next_scheduled_time = exec().time();
m_in_queue = queue_status::DELIVERED;
m_new_Q = 0;
@ -680,6 +685,11 @@ namespace netlist
{
}
void analog_net_t::reset() noexcept
{
net_t::reset();
m_cur_Analog = nlconst::zero();
}
// ----------------------------------------------------------------------------------------
// core_terminal_t
// ----------------------------------------------------------------------------------------

View File

@ -691,7 +691,7 @@ namespace netlist
virtual ~net_t() noexcept = default;
void reset() noexcept;
virtual void reset() noexcept;
void toggle_new_Q() noexcept { m_new_Q = (m_cur_Q ^ 1); }
@ -952,6 +952,8 @@ namespace netlist
analog_net_t(netlist_state_t &nl, const pstring &aname, detail::core_terminal_t *railterminal = nullptr);
void reset() noexcept override;
nl_fptype Q_Analog() const noexcept { return m_cur_Analog; }
void set_Q_Analog(nl_fptype v) noexcept { m_cur_Analog = v; }
// used by solver code ...
@ -1744,8 +1746,14 @@ namespace netlist
///
void print_stats(stats_info &si) const;
/// \brief call reset on all netlist components
///
void reset();
/// \brief prior to running free no longer needed resources
///
void free_setup_resources();
private:
device_arena m_pool; // must be deleted last!
@ -1785,10 +1793,7 @@ namespace netlist
m_inc = netlist_time::from_fp(plib::reciprocal(m_freq()*nlconst::two()));
}
NETLIB_RESETI()
{
m_Q.net().set_next_scheduled_time(netlist_time_ext::zero());
}
NETLIB_RESETI();
NETLIB_UPDATE_PARAMI()
{
@ -2147,6 +2152,14 @@ namespace netlist
analog_input_t m_GND;
};
namespace devices
{
inline NETLIB_RESET(mainclock)
{
m_Q.net().set_next_scheduled_time(exec().time());
}
} // namespace devices
// -----------------------------------------------------------------------------
// Hot section
//

View File

@ -149,14 +149,13 @@ namespace netlist
, m_param_offsets(*this, 0, "OFFSET{}", 0.0)
{
connect(m_feedback, m_Q);
for (auto & elem : m_buffers)
elem = nullptr;
}
protected:
NETLIB_RESETI()
{
m_pos = 0;
for (auto & elem : m_buffers)
elem = nullptr;
}
NETLIB_UPDATEI()
@ -232,8 +231,8 @@ namespace netlist
object_array_t<param_str_t, MAX_INPUT_CHANNELS> m_param_names;
object_array_t<param_fp_t, MAX_INPUT_CHANNELS> m_param_mults;
object_array_t<param_fp_t, MAX_INPUT_CHANNELS> m_param_offsets;
std::array<param_fp_t *, MAX_INPUT_CHANNELS> m_params;
std::array<T *, MAX_INPUT_CHANNELS> m_buffers;
std::array<param_fp_t *, MAX_INPUT_CHANNELS> m_params;
std::array<T *, MAX_INPUT_CHANNELS> m_buffers;
};
} // namespace interface

View File

@ -478,6 +478,7 @@ void tool_app_t::run()
// Inputs must be read before reset -> will clear setup and parser
inps = read_input(nt.setup(), opt_inp());
nt.free_setup_resources();
nt.exec().reset();
ttr = netlist::netlist_time_ext::from_fp(opt_ttr());
@ -608,6 +609,7 @@ void tool_app_t::compile_one_and_add_to_map(const pstring &file,
// need to reset ...
nt.free_setup_resources();
nt.exec().reset();
auto mp(nt.exec().solver()->create_solver_code(target));

View File

@ -428,7 +428,7 @@ namespace solver
void matrix_solver_t::reset()
{
m_last_step = netlist_time_ext::zero();
//m_last_step = netlist_time_ext::zero();
}
void matrix_solver_t::step(netlist_time delta) noexcept