netlist: Add NETLIB_DELEGATE_NOOP()

* This should be used for inputs which do not need a handler.
* Examples are data inputs which are only accessed on a clock change.
This commit is contained in:
couriersud 2020-08-22 16:25:26 +02:00
parent 9e401f0b3e
commit b0e0ac2b24
8 changed files with 17 additions and 18 deletions

View File

@ -78,6 +78,10 @@ namespace netlist
log_type & log(); log_type & log();
void handler_noop()
{
}
public: public:
virtual void timestep(timestep_type ts_type, nl_fptype st) noexcept { plib::unused_var(ts_type, st); } virtual void timestep(timestep_type ts_type, nl_fptype st) noexcept { plib::unused_var(ts_type, st); }
virtual void update_terminals() noexcept { } virtual void update_terminals() noexcept { }

View File

@ -152,6 +152,7 @@ class NETLIB_NAME(name) : public delegator_t<base_device_t>
void NETLIB_NAME(cname) :: timestep(timestep_type ts_type, nl_fptype step) noexcept void NETLIB_NAME(cname) :: timestep(timestep_type ts_type, nl_fptype step) noexcept
#define NETLIB_DELEGATE(name) nldelegate(&this_type :: name, this) #define NETLIB_DELEGATE(name) nldelegate(&this_type :: name, this)
#define NETLIB_DELEGATE_NOOP() nldelegate(&core_device_t::handler_noop, static_cast<core_device_t *>(this))
#define NETLIB_UPDATE_TERMINALSI() virtual void update_terminals() noexcept override #define NETLIB_UPDATE_TERMINALSI() virtual void update_terminals() noexcept override
#define NETLIB_HANDLERI(name) void name() noexcept #define NETLIB_HANDLERI(name) void name() noexcept

View File

@ -138,7 +138,7 @@ namespace netlist
{ {
public: public:
NETLIB_CONSTRUCTOR(nc_pin) NETLIB_CONSTRUCTOR(nc_pin)
, m_I(*this, "I", NETLIB_DELEGATE(noop)) , m_I(*this, "I", NETLIB_DELEGATE_NOOP())
{ {
} }
@ -146,10 +146,6 @@ namespace netlist
//NETLIB_RESETI() {} //NETLIB_RESETI() {}
private: private:
NETLIB_HANDLERI(noop)
{
}
analog_input_t m_I; analog_input_t m_I;
}; };

View File

@ -36,7 +36,7 @@ namespace netlist
{ {
NETLIB_CONSTRUCTOR(74165) NETLIB_CONSTRUCTOR(74165)
, m_DATA(*this, { "H", "G", "F", "E", "D", "C", "B", "A" }, NETLIB_DELEGATE(inputs)) , m_DATA(*this, { "H", "G", "F", "E", "D", "C", "B", "A" }, NETLIB_DELEGATE(inputs))
, m_SER(*this, "SER", NETLIB_DELEGATE(noop)) , m_SER(*this, "SER", NETLIB_DELEGATE_NOOP())
, m_SH_LDQ(*this, "SH_LDQ", NETLIB_DELEGATE(inputs)) , m_SH_LDQ(*this, "SH_LDQ", NETLIB_DELEGATE(inputs))
, m_CLK(*this, "CLK", NETLIB_DELEGATE(clk)) , m_CLK(*this, "CLK", NETLIB_DELEGATE(clk))
, m_CLKINH(*this, "CLKINH", NETLIB_DELEGATE(inputs)) , m_CLKINH(*this, "CLKINH", NETLIB_DELEGATE(inputs))
@ -53,10 +53,6 @@ namespace netlist
m_shifter = 0; m_shifter = 0;
} }
NETLIB_HANDLERI(noop)
{
}
NETLIB_HANDLERI(clk) NETLIB_HANDLERI(clk)
{ {
unsigned high_bit = m_SER() ? 0x80 : 0; unsigned high_bit = m_SER() ? 0x80 : 0;

View File

@ -48,6 +48,8 @@ namespace netlist
static constexpr const std::array<netlist_time, 2> out_delay_CLK_Y = { NLTIME_FROM_NS(20), NLTIME_FROM_NS(26) }; // tPHL, tPLH static constexpr const std::array<netlist_time, 2> out_delay_CLK_Y = { NLTIME_FROM_NS(20), NLTIME_FROM_NS(26) }; // tPHL, tPLH
static constexpr const std::array<netlist_time, 2> out_delay_CLK_Z = { NLTIME_FROM_NS(17), NLTIME_FROM_NS(12) }; static constexpr const std::array<netlist_time, 2> out_delay_CLK_Z = { NLTIME_FROM_NS(17), NLTIME_FROM_NS(12) };
// FIXME: room for improvement -> clock handling
NETLIB_OBJECT(7497) NETLIB_OBJECT(7497)
{ {
NETLIB_CONSTRUCTOR(7497) NETLIB_CONSTRUCTOR(7497)
@ -76,8 +78,6 @@ namespace netlist
m_lastclock = 0; m_lastclock = 0;
} }
NETLIB_HANDLERI(noop) { }
NETLIB_HANDLERI(unity) NETLIB_HANDLERI(unity)
{ {
newstate (m_state); newstate (m_state);

View File

@ -332,9 +332,10 @@ namespace netlist
std::vector<const nldelegate *> t; std::vector<const nldelegate *> t;
log().verbose("Using default startup strategy"); log().verbose("Using default startup strategy");
for (auto &n : m_nets) for (auto &n : m_nets)
for (auto & term : n->core_terms())
{ {
n->update_inputs(); // only used if USE_COPY_INSTEAD_OF_REFERENCE == 1 n->update_inputs(); // only used if USE_COPY_INSTEAD_OF_REFERENCE == 1
for (auto & term : n->core_terms())
{
if (!plib::container::contains(t, &term->delegate())) if (!plib::container::contains(t, &term->delegate()))
{ {
t.push_back(&term->delegate()); t.push_back(&term->delegate());
@ -345,6 +346,7 @@ namespace netlist
if (!plib::container::contains(devices_called, dev)) if (!plib::container::contains(devices_called, dev))
devices_called.push_back(dev); devices_called.push_back(dev);
} }
}
log().verbose("Devices not yet updated:"); log().verbose("Devices not yet updated:");
for (auto &dev : m_devices) for (auto &dev : m_devices)
if (!plib::container::contains(devices_called, dev.second.get())) if (!plib::container::contains(devices_called, dev.second.get()))
@ -747,8 +749,6 @@ namespace netlist
nldelegate delegate) nldelegate delegate)
: logic_t(dev, aname, STATE_INP_ACTIVE, delegate) : logic_t(dev, aname, STATE_INP_ACTIVE, delegate)
{ {
if (!delegate.is_set())
throw nl_exception("delegate not set for {1}", this->name());
state().setup().register_term(*this); state().setup().register_term(*this);
} }

View File

@ -1688,12 +1688,15 @@ void setup_t::prepare_to_run()
} }
for (auto &n : m_nlstate.nets()) for (auto &n : m_nlstate.nets())
{
for (auto & term : n->core_terms()) for (auto & term : n->core_terms())
if (!term->delegate().is_set()) if (!term->delegate())
{ {
log().fatal(MF_DELEGATE_NOT_SET_1(term->name())); log().fatal(MF_DELEGATE_NOT_SET_1(term->name()));
throw nl_exception(MF_DELEGATE_NOT_SET_1(term->name())); throw nl_exception(MF_DELEGATE_NOT_SET_1(term->name()));
} }
n->rebuild_list();
}
} }
// ---------------------------------------------------------------------------------------- // ----------------------------------------------------------------------------------------

View File

@ -368,8 +368,6 @@ namespace plib {
bind<const_specific_member_function<O>>(object, &mftp); bind<const_specific_member_function<O>>(object, &mftp);
} }
bool is_set() const noexcept { return m_resolved != nullptr; }
generic_class *object() const noexcept { return m_obj; } generic_class *object() const noexcept { return m_obj; }
bool has_object() const noexcept { return m_obj != nullptr; } bool has_object() const noexcept { return m_obj != nullptr; }
@ -384,6 +382,7 @@ namespace plib {
return this->call(std::forward<Targs>(args)...); return this->call(std::forward<Targs>(args)...);
} }
operator bool() const noexcept { return m_resolved != nullptr; }
private: private:
template<typename SPC, typename O, typename MF> template<typename SPC, typename O, typename MF>
void bind(O * object, MF *fraw) void bind(O * object, MF *fraw)