netlist: more code maintenance. (nw)

Make some calls private which were public before.
Eliminate functions which would be executed only once.
Make terminal reference functions in twoterm.h return const.
Clearly identify the use cases which need a non-const ref
to terminals.
This commit is contained in:
couriersud 2020-04-28 21:03:29 +02:00
parent 14e4c4bb3f
commit 77da7b11ae
7 changed files with 46 additions and 55 deletions

View File

@ -89,7 +89,7 @@ namespace analog
void solve_now() const;
template <typename F>
void change_state(F f, netlist_time delay = netlist_time::quantum())
void change_state(F f, netlist_time delay = netlist_time::quantum()) const
{
auto *solv(solver());
if (solv)
@ -126,21 +126,37 @@ namespace analog
m_N.set_go_gt_I(a21, a22, rhs2);
}
/// \brief Get a reference to the m_P terminal
/// \brief Get a const reference to the m_P terminal
///
/// This is typically called during initialization to connect
/// terminals.
///
/// \returns Reference to m_P terminal.
terminal_t &P() noexcept { return m_P; }
const terminal_t &P() const noexcept { return m_P; }
/// \brief Get a reference to the m_N terminal
/// \brief Get a const reference to the m_N terminal
///
/// This is typically called during initialization to connect
/// terminals.
///
/// \returns Reference to m_N terminal.
terminal_t &N() noexcept { return m_N; }
const terminal_t &N() const noexcept { return m_N; }
/// \brief Get a reference to the m_P terminal
///
/// This call is only allowed from the core. Device code should never
/// need to call this.
///
/// \returns Reference to m_P terminal.
terminal_t &setup_P() noexcept { return m_P; }
/// \brief Get a reference to the m_N terminal
///
/// This call is only allowed from the core. Device code should never
/// need to call this.
///
/// \returns Reference to m_P terminal.
terminal_t &setup_N() noexcept { return m_N; }
private:
terminal_t m_P;

View File

@ -103,7 +103,7 @@ namespace devices
detail::core_terminal_t &proxy_term() noexcept override
{
return m_RN.P();
return m_RN.setup_P();
}
protected:

View File

@ -630,18 +630,6 @@ namespace netlist
state().setup().register_link_fqn(name() + "." + t1, name() + "." + t2);
}
// FIXME: this is only used by solver code since matrix solvers are started in
// post_start.
void device_t::connect_post_start(detail::core_terminal_t &t1, detail::core_terminal_t &t2)
{
if (!state().setup().connect(t1, t2))
{
log().fatal(MF_ERROR_CONNECTING_1_TO_2(t1.name(), t2.name()));
throw nl_exception(MF_ERROR_CONNECTING_1_TO_2(t1.name(), t2.name()));
}
}
// -----------------------------------------------------------------------------
// family_setter_t
// -----------------------------------------------------------------------------

View File

@ -1098,7 +1098,6 @@ namespace netlist
void connect(const pstring &t1, const pstring &t2);
void connect(const detail::core_terminal_t &t1, const detail::core_terminal_t &t2);
void connect_post_start(detail::core_terminal_t &t1, detail::core_terminal_t &t2) noexcept(false);
protected:
NETLIB_UPDATEI() { }

View File

@ -1036,16 +1036,6 @@ void setup_t::register_dynamic_log_devices(const std::vector<pstring> &loglist)
}
}
log_type &setup_t::log()
{
return m_nlstate.log();
}
const log_type &setup_t::log() const
{
return m_nlstate.log();
}
// ----------------------------------------------------------------------------------------
// Models
// ----------------------------------------------------------------------------------------
@ -1339,8 +1329,8 @@ void setup_t::prepare_to_run()
{
log().info(MI_REMOVE_DEVICE_1_CONNECTED_ONLY_TO_RAILS_2_3(
t->name(), t->N().net().name(), t->P().net().name()));
t->N().net().remove_terminal(t->N());
t->P().net().remove_terminal(t->P());
t->setup_N().net().remove_terminal(t->setup_N());
t->setup_P().net().remove_terminal(t->setup_P());
m_nlstate.remove_device(t);
}
}

View File

@ -68,7 +68,8 @@
#define NETLIST_START(name) \
void NETLIST_NAME(name)(netlist::nlparse_t &setup) \
{
{ \
plib::unused_var(setup);
#define NETLIST_END() }
@ -378,54 +379,47 @@ namespace netlist
netlist_state_t &nlstate() { return m_nlstate; }
const netlist_state_t &nlstate() const { return m_nlstate; }
// called from param_t creation
void register_param_t(const pstring &name, param_t &param);
pstring get_initial_param_val(const pstring &name, const pstring &def) const;
void register_term(detail::core_terminal_t &term);
void register_term(terminal_t &term, terminal_t &other_term);
// called from net_splitter
terminal_t *get_connected_terminal(const terminal_t &term) const noexcept
{
auto ret(m_connected_terminals.find(&term));
return (ret != m_connected_terminals.end()) ? ret->second : nullptr;
}
void remove_connections(const pstring &pin);
bool connect(detail::core_terminal_t &t1, detail::core_terminal_t &t2);
param_t *find_param(const pstring &param_in, bool required = true) const;
// get family
// get family -> truthtable
const logic_family_desc_t *family_from_model(const pstring &model);
// tools use this -> FIXME: needs another place
void register_dynamic_log_devices(const std::vector<pstring> &loglist);
void resolve_inputs();
// helper - also used by nltool
pstring resolve_alias(const pstring &name) const;
pstring de_alias(const pstring &alias) const;
param_t *find_param(const pstring &param_in, bool required = true) const;
// needed by nltool
std::vector<pstring> get_terminals_for_device_name(const pstring &devname) const;
log_type &log();
const log_type &log() const;
// needed by proxy
// needed by proxy device to check power terminals -> FIXME: this should be a setup_t task
detail::core_terminal_t *find_terminal(const pstring &terminal_in, detail::terminal_type atype, bool required = true) const;
detail::core_terminal_t *find_terminal(const pstring &terminal_in, bool required = true) const;
// core net handling
void delete_empty_nets();
pstring de_alias(const pstring &alias) const;
// FIXME: only needed by solver code outside of setup_t
bool connect(detail::core_terminal_t &t1, detail::core_terminal_t &t2);
// run preparation
void prepare_to_run();
private:
// FIXME: stale? - remove later
void remove_connections(const pstring &pin);
void resolve_inputs();
pstring resolve_alias(const pstring &name) const;
void delete_empty_nets();
void merge_nets(detail::net_t &thisnet, detail::net_t &othernet);

View File

@ -51,7 +51,11 @@ namespace solver
, m_Q_sync(*this, "Q_sync")
, m_ops(0)
{
connect_post_start(m_fb_sync, m_Q_sync);
if (!anetlist.setup().connect(m_fb_sync, m_Q_sync))
{
log().fatal(MF_ERROR_CONNECTING_1_TO_2(m_fb_sync.name(), m_Q_sync.name()));
throw nl_exception(MF_ERROR_CONNECTING_1_TO_2(m_fb_sync.name(), m_Q_sync.name()));
}
setup_base(nets);
// now setup the matrix