summaryrefslogtreecommitdiffstatshomepage
path: root/src/lib/netlist/nl_base.cpp
diff options
context:
space:
mode:
author couriersud <couriersud@gmx.org>2020-07-17 23:12:24 +0200
committer couriersud <couriersud@gmx.org>2020-07-17 23:12:24 +0200
commitf0d012c1f5f072ff3bc3e7624e2f74754b5069a1 (patch)
treece1244138201aa8f58050d2b4c254be03d66b917 /src/lib/netlist/nl_base.cpp
parent976212053caabe2a509f7083165df0f1c54f8a3a (diff)
netlist: Potential regression trigger.
* Removed update and NETLIB_UPDATE completely. * Startup initialization order may change. * This may cause regression tests to trigger. This is expected. Logic TTL devices do not have a defined power-up state. That's why reset circuits exist which create a reset signal *after* all power supply lines are stable.
Diffstat (limited to 'src/lib/netlist/nl_base.cpp')
-rw-r--r--src/lib/netlist/nl_base.cpp55
1 files changed, 18 insertions, 37 deletions
diff --git a/src/lib/netlist/nl_base.cpp b/src/lib/netlist/nl_base.cpp
index a949e8cf8b7..078236da474 100644
--- a/src/lib/netlist/nl_base.cpp
+++ b/src/lib/netlist/nl_base.cpp
@@ -304,9 +304,14 @@ namespace netlist
// Currently analog input and logic input also
// push their outputs to queue.
+ std::vector<core_device_t *> devices_called;
log().verbose("Call update_param on all devices:");
for (auto & dev : m_devices)
+ {
dev.second->update_param();
+ if (!plib::container::contains(devices_called, dev.second.get()))
+ devices_called.push_back(dev.second.get());
+ }
// Step all devices once !
//
@@ -319,57 +324,33 @@ namespace netlist
{
case 0:
{
- std::vector<core_device_t *> d;
std::vector<const nldelegate *> t;
log().verbose("Using default startup strategy");
for (auto &n : m_nets)
for (auto & term : n->core_terms())
- if (term->delegate().has_object())
+ {
+ n->update_inputs(); // only used if USE_COPY_INSTEAD_OF_REFERENCE == 1
+ if (!plib::container::contains(t, &term->delegate()))
{
- if (!plib::container::contains(t, &term->delegate()))
- {
- t.push_back(&term->delegate());
- term->run_delegate();
- }
- // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
- auto *dev = reinterpret_cast<core_device_t *>(term->delegate().object());
- if (!plib::container::contains(d, dev))
- d.push_back(dev);
+ t.push_back(&term->delegate());
+ term->run_delegate();
}
+ // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
+ auto *dev = reinterpret_cast<core_device_t *>(term->delegate().object());
+ if (!plib::container::contains(devices_called, dev))
+ devices_called.push_back(dev);
+ }
log().verbose("Devices not yet updated:");
for (auto &dev : m_devices)
- if (!plib::container::contains(d, dev.second.get()))
+ if (!plib::container::contains(devices_called, dev.second.get()))
{
// FIXME: doesn't seem to be needed, use cases include
// analog output devices. Check and remove
- log().verbose("\t ...{1}", dev.second->name());
- dev.second->update();
+ log().error("\t Device {1} not yet updated", dev.second->name());
+ //dev.second->update();
}
}
break;
- case 1: // brute force backward
- {
- log().verbose("Using brute force backward startup strategy");
-
- for (auto &n : m_nets) // only used if USE_COPY_INSTEAD_OF_REFERENCE == 1
- n->update_inputs();
-
- std::size_t i = m_devices.size();
- while (i>0)
- m_devices[--i].second->update();
-
- for (auto &n : m_nets) // only used if USE_COPY_INSTEAD_OF_REFERENCE == 1
- n->update_inputs();
-
- }
- break;
- case 2: // brute force forward
- {
- log().verbose("Using brute force forward startup strategy");
- for (auto &d : m_devices)
- d.second->update();
- }
- break;
}
// the above may screw up m_active and the list