Example #1
0
ATTR_COLD void netlist_base_t::start()
{
	/* find the main clock and solver ... */

	NL_VERBOSE_OUT(("Searching for mainclock and solver ...\n"));

	m_mainclock = get_single_device<NETLIB_NAME(mainclock)>("mainclock");
	m_solver = get_single_device<NETLIB_NAME(solver)>("solver");
	m_gnd = get_single_device<NETLIB_NAME(gnd)>("gnd");
	m_params = get_single_device<NETLIB_NAME(netlistparams)>("parameter");

	/* make sure the solver and parameters are started first! */

	if (m_solver != NULL)
		m_solver->start_dev();

	if (m_params != NULL)
	{
		m_params->start_dev();
	}

	m_use_deactivate = (m_params->m_use_deactivate.Value() ? true : false);

	NL_VERBOSE_OUT(("Initializing devices ...\n"));
	for (netlist_device_t * const * entry = m_devices.first(); entry != NULL; entry = m_devices.next(entry))
	{
		netlist_device_t *dev = *entry;
		if (dev != m_solver && dev != m_params)
			dev->start_dev();
	}

}
Example #2
0
ATTR_HOT ATTR_ALIGN void netlist_base_t::process_queue(const netlist_time delta)
{
    m_stop = m_time + delta;

    if (m_mainclock == NULL)
    {
        while ( (m_time < m_stop) && (m_queue.is_not_empty()))
        {
            const netlist_queue_t::entry_t &e = m_queue.pop();
            m_time = e.time();
            e.object()->update_devs();

            add_to_stat(m_perf_out_processed, 1);
            if (FATAL_ERROR_AFTER_NS)
                if (time() > NLTIME_FROM_NS(FATAL_ERROR_AFTER_NS))
                    error("Stopped");
        }
        if (m_queue.is_empty())
            m_time = m_stop;

    } else {
        netlist_net_t &mcQ = m_mainclock->m_Q.net();
        const netlist_time inc = m_mainclock->m_inc;

        while (m_time < m_stop)
        {
            if (m_queue.is_not_empty())
            {
                while (m_queue.peek().time() > mcQ.time())
                {
                    m_time = mcQ.time();
                    NETLIB_NAME(mainclock)::mc_update(mcQ, m_time + inc);
                }

                const netlist_queue_t::entry_t &e = m_queue.pop();
                m_time = e.time();
                e.object()->update_devs();

            } else {
                m_time = mcQ.time();
                NETLIB_NAME(mainclock)::mc_update(mcQ, m_time + inc);
            }
            if (FATAL_ERROR_AFTER_NS)
                if (time() > NLTIME_FROM_NS(FATAL_ERROR_AFTER_NS))
                    error("Stopped");

            add_to_stat(m_perf_out_processed, 1);
        }
    }
}
Example #3
0
ATTR_HOT ATTR_ALIGN void netlist_base_t::process_queue(const netlist_time &delta)
{
	m_stop = m_time + delta;

	if (m_mainclock == NULL)
	{
		while ( (m_time < m_stop) && (m_queue.is_not_empty()))
		{
			const netlist_queue_t::entry_t e = *m_queue.pop();
			m_time = e.exec_time();
			e.object()->update_devs();

			add_to_stat(m_perf_out_processed, 1);
		}
		if (m_queue.is_empty())
			m_time = m_stop;

	} else {
		netlist_logic_net_t &mc_net = m_mainclock->m_Q.net().as_logic();
		const netlist_time inc = m_mainclock->m_inc;
		netlist_time mc_time = mc_net.time();

		while (m_time < m_stop)
		{
			if (m_queue.is_not_empty())
			{
				while (m_queue.peek()->exec_time() > mc_time)
				{
					m_time = mc_time;
					mc_time += inc;
					NETLIB_NAME(mainclock)::mc_update(mc_net);
				}

				const netlist_queue_t::entry_t e = *m_queue.pop();
				m_time = e.exec_time();
				e.object()->update_devs();

			} else {
				m_time = mc_time;
				mc_time += inc;
				NETLIB_NAME(mainclock)::mc_update(mc_net);
			}

			add_to_stat(m_perf_out_processed, 1);
		}
		mc_net.set_time(mc_time);
	}
}
Example #4
0
ATTR_COLD void netlist_base_t::start()
{
    /* find the main clock and solver ... */

    m_mainclock = get_single_device<NETLIB_NAME(mainclock)>("mainclock");
    m_solver = get_single_device<NETLIB_NAME(solver)>("solver");
    m_gnd = get_single_device<NETLIB_NAME(gnd)>("gnd");

    NL_VERBOSE_OUT(("Initializing devices ...\n"));
    for (tagmap_devices_t::entry_t *entry = m_devices.first(); entry != NULL; entry = m_devices.next(entry))
    {
        netlist_device_t *dev = entry->object();
        dev->start_dev();
    }

}
Example #5
0
	m_nets.reset();
	pstring::resetmem();
}

ATTR_COLD netlist_net_t *netlist_base_t::find_net(const pstring &name)
{
	for (netlist_net_t::list_t::entry_t *p = m_nets.first(); p != NULL; p = m_nets.next(p))
	{
		if (p->object()->name() == name)
			return p->object();
	}
	return NULL;
}

ATTR_COLD void netlist_base_t::set_mainclock_dev(NETLIB_NAME(mainclock) *dev)
{
	m_mainclock = dev;
}

ATTR_COLD void netlist_base_t::set_solver_dev(NETLIB_NAME(solver) *dev)
{
	m_solver = dev;
}

ATTR_COLD void netlist_base_t::reset()
{
	m_time_ps = netlist_time::zero;
	m_rem = 0;
	m_queue.clear();
	if (m_mainclock != NULL)
Example #6
0
/*
 * nld_solver.c
 *
 */

#include "nld_solver.h"
#include "nld_twoterm.h"

// ----------------------------------------------------------------------------------------
// netlist_matrix_solver
// ----------------------------------------------------------------------------------------

#define SOLVER_VERBOSE_OUT(x) do {} while (0)
//#define SOLVER_VERBOSE_OUT(x) printf x

ATTR_COLD void netlist_matrix_solver_t::setup(netlist_net_t::list_t &nets, NETLIB_NAME(solver) &aowner)
{
	m_owner = &aowner;
	for (netlist_net_t::list_t::entry_t *pn = nets.first(); pn != NULL; pn = nets.next(pn))
	{
		NL_VERBOSE_OUT(("setting up net\n"));

		m_nets.add(pn->object());
		pn->object()->m_solver = this;

		for (netlist_core_terminal_t *p = pn->object()->m_head; p != NULL; p = p->m_update_list_next)
		{
			switch (p->type())
			{
				case netlist_terminal_t::TERMINAL:
					switch (p->netdev().family())