void load_state(std::vector<char> &buf) { std::size_t size = 0; for (auto const & s : state().save_list()) size += s->m_dt.size * s->m_count; if (buf.size() != size) throw netlist::nl_exception("Size different during load state."); char *p = buf.data(); for (auto const & s : state().save_list()) { std::size_t sz = s->m_dt.size * s->m_count; if (s->m_dt.is_float || s->m_dt.is_integral) std::copy(p, p + sz, static_cast<char *>(s->m_ptr)); else log().fatal("found unsupported save element {1}\n", s->m_name); p += sz; } state().post_load(); rebuild_lists(); }
void netlist_state_t::reset() { //FIXME: never used ??? std::unordered_map<core_device_t *, bool> m; // Reset all nets once ! log().verbose("Call reset on all nets:"); for (auto & n : nets()) n->reset(); // Reset all devices once ! log().verbose("Call reset on all devices:"); for (auto & dev : m_devices) dev.second->reset(); // Make sure everything depending on parameters is set // Currently analog input and logic input also // push their outputs to queue. log().verbose("Call update_param on all devices:"); for (auto & dev : m_devices) dev.second->update_param(); // Step all devices once ! /* * INFO: The order here affects power up of e.g. breakout. However, such * variations are explicitly stated in the breakout manual. */ auto *netlist_params = get_single_device<devices::NETLIB_NAME(netlistparams)>("parameter"); switch (netlist_params->m_startup_strategy()) { case 0: { std::vector<core_device_t *> d; std::vector<nldelegate *> t; log().verbose("Using default startup strategy"); for (auto &n : m_nets) for (auto & term : n->core_terms()) if (term->m_delegate.has_object()) { if (!plib::container::contains(t, &term->m_delegate)) { t.push_back(&term->m_delegate); term->m_delegate(); } auto *dev = reinterpret_cast<core_device_t *>(term->m_delegate.object()); if (!plib::container::contains(d, dev)) d.push_back(dev); } log().verbose("Devices not yet updated:"); for (auto &dev : m_devices) if (!plib::container::contains(d, dev.second.get())) { log().verbose("\t ...{1}", 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; } #if 1 /* the above may screw up m_active and the list */ rebuild_lists(); #endif }