Exemple #1
0
	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();
	}
Exemple #2
0
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
}