mirror of
https://github.com/holub/mame
synced 2025-10-05 08:41:31 +03:00
- setup_t is owned by netlist_t. Stop being complicated.
- Remove gnd() method. - Further simplification. - Fix potential reset and initialization issues. (nw)
This commit is contained in:
parent
d04e7f7e62
commit
5b4026d13f
@ -43,7 +43,7 @@ NETLIST_START(dummy)
|
|||||||
// .END
|
// .END
|
||||||
|
|
||||||
PARAM(Solver.ACCURACY, 1e-8)
|
PARAM(Solver.ACCURACY, 1e-8)
|
||||||
PARAM(Solver.NR_LOOPS, 9000)
|
PARAM(Solver.NR_LOOPS, 90)
|
||||||
PARAM(Solver.SOR_FACTOR, 0.001)
|
PARAM(Solver.SOR_FACTOR, 0.001)
|
||||||
PARAM(Solver.GS_LOOPS, 1)
|
PARAM(Solver.GS_LOOPS, 1)
|
||||||
PARAM(Solver.METHOD, "MAT_CR")
|
PARAM(Solver.METHOD, "MAT_CR")
|
||||||
|
@ -408,7 +408,6 @@ netlist_mame_device_t::netlist_mame_device_t(const machine_config &mconfig, cons
|
|||||||
m_icount(0),
|
m_icount(0),
|
||||||
m_old(netlist::netlist_time::zero()),
|
m_old(netlist::netlist_time::zero()),
|
||||||
m_netlist(nullptr),
|
m_netlist(nullptr),
|
||||||
m_setup(nullptr),
|
|
||||||
m_setup_func(nullptr)
|
m_setup_func(nullptr)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
@ -418,7 +417,6 @@ netlist_mame_device_t::netlist_mame_device_t(const machine_config &mconfig, devi
|
|||||||
m_icount(0),
|
m_icount(0),
|
||||||
m_old(netlist::netlist_time::zero()),
|
m_old(netlist::netlist_time::zero()),
|
||||||
m_netlist(nullptr),
|
m_netlist(nullptr),
|
||||||
m_setup(nullptr),
|
|
||||||
m_setup_func(nullptr)
|
m_setup_func(nullptr)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
@ -442,7 +440,6 @@ void netlist_mame_device_t::device_start()
|
|||||||
//printf("clock is %d\n", clock());
|
//printf("clock is %d\n", clock());
|
||||||
|
|
||||||
m_netlist = global_alloc(netlist_mame_t(*this, "netlist"));
|
m_netlist = global_alloc(netlist_mame_t(*this, "netlist"));
|
||||||
m_setup = global_alloc(netlist::setup_t(*m_netlist));
|
|
||||||
|
|
||||||
// register additional devices
|
// register additional devices
|
||||||
|
|
||||||
@ -455,11 +452,11 @@ void netlist_mame_device_t::device_start()
|
|||||||
if( sdev != nullptr )
|
if( sdev != nullptr )
|
||||||
{
|
{
|
||||||
LOG_DEV_CALLS(("Preparse subdevice %s/%s\n", d.name(), d.shortname()));
|
LOG_DEV_CALLS(("Preparse subdevice %s/%s\n", d.name(), d.shortname()));
|
||||||
sdev->pre_parse_action(*m_setup);
|
sdev->pre_parse_action(setup());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
m_setup_func(*m_setup);
|
m_setup_func(setup());
|
||||||
|
|
||||||
/* let sub-devices tweak the netlist */
|
/* let sub-devices tweak the netlist */
|
||||||
for (device_t &d : subdevices())
|
for (device_t &d : subdevices())
|
||||||
@ -468,12 +465,11 @@ void netlist_mame_device_t::device_start()
|
|||||||
if( sdev != nullptr )
|
if( sdev != nullptr )
|
||||||
{
|
{
|
||||||
LOG_DEV_CALLS(("Found subdevice %s/%s\n", d.name(), d.shortname()));
|
LOG_DEV_CALLS(("Found subdevice %s/%s\n", d.name(), d.shortname()));
|
||||||
sdev->custom_netlist_additions(*m_setup);
|
sdev->custom_netlist_additions(setup());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
m_setup->start_devices();
|
netlist().start();
|
||||||
m_setup->resolve_inputs();
|
|
||||||
|
|
||||||
netlist().save(*this, m_rem, "m_rem");
|
netlist().save(*this, m_rem, "m_rem");
|
||||||
netlist().save(*this, m_div, "m_div");
|
netlist().save(*this, m_div, "m_div");
|
||||||
@ -505,12 +501,8 @@ void netlist_mame_device_t::device_reset()
|
|||||||
void netlist_mame_device_t::device_stop()
|
void netlist_mame_device_t::device_stop()
|
||||||
{
|
{
|
||||||
LOG_DEV_CALLS(("device_stop\n"));
|
LOG_DEV_CALLS(("device_stop\n"));
|
||||||
netlist().print_stats();
|
|
||||||
|
|
||||||
netlist().stop();
|
netlist().stop();
|
||||||
|
|
||||||
global_free(m_setup);
|
|
||||||
m_setup = nullptr;
|
|
||||||
global_free(m_netlist);
|
global_free(m_netlist);
|
||||||
m_netlist = nullptr;
|
m_netlist = nullptr;
|
||||||
}
|
}
|
||||||
|
@ -160,7 +160,7 @@ public:
|
|||||||
|
|
||||||
static void static_set_constructor(device_t &device, void (*setup_func)(netlist::setup_t &));
|
static void static_set_constructor(device_t &device, void (*setup_func)(netlist::setup_t &));
|
||||||
|
|
||||||
ATTR_HOT inline netlist::setup_t &setup() { return *m_setup; }
|
ATTR_HOT inline netlist::setup_t &setup() { return m_netlist->setup(); }
|
||||||
ATTR_HOT inline netlist_mame_t &netlist() { return *m_netlist; }
|
ATTR_HOT inline netlist_mame_t &netlist() { return *m_netlist; }
|
||||||
|
|
||||||
ATTR_HOT inline const netlist::netlist_time last_time_update() { return m_old; }
|
ATTR_HOT inline const netlist::netlist_time last_time_update() { return m_old; }
|
||||||
@ -195,7 +195,6 @@ private:
|
|||||||
netlist::netlist_time m_old;
|
netlist::netlist_time m_old;
|
||||||
|
|
||||||
netlist_mame_t * m_netlist;
|
netlist_mame_t * m_netlist;
|
||||||
netlist::setup_t * m_setup;
|
|
||||||
|
|
||||||
void (*m_setup_func)(netlist::setup_t &);
|
void (*m_setup_func)(netlist::setup_t &);
|
||||||
};
|
};
|
||||||
|
@ -58,7 +58,7 @@ NETLIB_OBJECT(VCCS)
|
|||||||
public:
|
public:
|
||||||
NETLIB_CONSTRUCTOR(VCCS)
|
NETLIB_CONSTRUCTOR(VCCS)
|
||||||
, m_G(*this, "G", 1.0)
|
, m_G(*this, "G", 1.0)
|
||||||
, m_RI(*this, "RI", NL_FCONST(1.0) / netlist().gmin())
|
, m_RI(*this, "RI", 1e9)
|
||||||
, m_OP(*this, "OP")
|
, m_OP(*this, "OP")
|
||||||
, m_ON(*this, "ON")
|
, m_ON(*this, "ON")
|
||||||
, m_IP(*this, "IP")
|
, m_IP(*this, "IP")
|
||||||
|
@ -79,6 +79,8 @@ NETLIB_RESET(OPAMP)
|
|||||||
double RP = 0.5 / 3.1459 / CP / m_model.model_value("FPF");
|
double RP = 0.5 / 3.1459 / CP / m_model.model_value("FPF");
|
||||||
double G = m_model.model_value("UGF") / m_model.model_value("FPF") / RP;
|
double G = m_model.model_value("UGF") / m_model.model_value("FPF") / RP;
|
||||||
|
|
||||||
|
printf("Min Freq %s: %f\n", name().c_str(), 1.0 / (CP*RP / (G*RP)));
|
||||||
|
|
||||||
m_CP->m_C.setTo(CP);
|
m_CP->m_C.setTo(CP);
|
||||||
m_RP.set_R(RP);
|
m_RP.set_R(RP);
|
||||||
m_G1.m_G.setTo(G);
|
m_G1.m_G.setTo(G);
|
||||||
|
@ -99,7 +99,7 @@ NETLIB_OBJECT(OPAMP)
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
NETLIB_SUB(R) m_RP;
|
NETLIB_SUB(R_base) m_RP;
|
||||||
NETLIB_SUB(VCCS) m_G1;
|
NETLIB_SUB(VCCS) m_G1;
|
||||||
NETLIB_SUBXX(C) m_CP;
|
NETLIB_SUBXX(C) m_CP;
|
||||||
NETLIB_SUBXX(VCVS) m_EBUF;
|
NETLIB_SUBXX(VCVS) m_EBUF;
|
||||||
|
@ -182,7 +182,7 @@ protected:
|
|||||||
NETLIB_OBJECT_DERIVED(R, R_base)
|
NETLIB_OBJECT_DERIVED(R, R_base)
|
||||||
{
|
{
|
||||||
NETLIB_CONSTRUCTOR_DERIVED(R, R_base)
|
NETLIB_CONSTRUCTOR_DERIVED(R, R_base)
|
||||||
, m_R(*this, "R", 1.0 / netlist().gmin())
|
, m_R(*this, "R", 1e9)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -193,6 +193,10 @@ protected:
|
|||||||
NETLIB_RESETI();
|
NETLIB_RESETI();
|
||||||
//NETLIB_UPDATEI() { }
|
//NETLIB_UPDATEI() { }
|
||||||
NETLIB_UPDATE_PARAMI();
|
NETLIB_UPDATE_PARAMI();
|
||||||
|
|
||||||
|
private:
|
||||||
|
/* protect set_R ... it's a recipe to desaster when used to bypass the parameter */
|
||||||
|
using NETLIB_NAME(R_base)::set_R;
|
||||||
};
|
};
|
||||||
|
|
||||||
// -----------------------------------------------------------------------------
|
// -----------------------------------------------------------------------------
|
||||||
@ -202,9 +206,9 @@ protected:
|
|||||||
NETLIB_OBJECT(POT)
|
NETLIB_OBJECT(POT)
|
||||||
{
|
{
|
||||||
NETLIB_CONSTRUCTOR(POT)
|
NETLIB_CONSTRUCTOR(POT)
|
||||||
, m_R1(*this, "R1")
|
, m_R1(*this, "_R1")
|
||||||
, m_R2(*this, "R2")
|
, m_R2(*this, "_R2")
|
||||||
, m_R(*this, "R", 1.0 / netlist().gmin())
|
, m_R(*this, "R", 10000)
|
||||||
, m_Dial(*this, "DIAL", 0.5)
|
, m_Dial(*this, "DIAL", 0.5)
|
||||||
, m_DialIsLog(*this, "DIALLOG", 0)
|
, m_DialIsLog(*this, "DIALLOG", 0)
|
||||||
{
|
{
|
||||||
@ -232,8 +236,8 @@ private:
|
|||||||
NETLIB_OBJECT(POT2)
|
NETLIB_OBJECT(POT2)
|
||||||
{
|
{
|
||||||
NETLIB_CONSTRUCTOR(POT2)
|
NETLIB_CONSTRUCTOR(POT2)
|
||||||
, m_R1(*this, "R1")
|
, m_R1(*this, "_R1")
|
||||||
, m_R(*this, "R", 1.0 / netlist().gmin())
|
, m_R(*this, "R", 10000)
|
||||||
, m_Dial(*this, "DIAL", 0.5)
|
, m_Dial(*this, "DIAL", 0.5)
|
||||||
, m_DialIsLog(*this, "DIALLOG", 0)
|
, m_DialIsLog(*this, "DIALLOG", 0)
|
||||||
, m_Reverse(*this, "REVERSE", 0)
|
, m_Reverse(*this, "REVERSE", 0)
|
||||||
|
@ -24,17 +24,25 @@ namespace netlist
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
NETLIB_RESETI() { }
|
NETLIB_RESETI();
|
||||||
NETLIB_UPDATEI();
|
NETLIB_UPDATEI();
|
||||||
|
|
||||||
public:
|
public:
|
||||||
NETLIB_SUB(vdd_vss) m_supply;
|
NETLIB_SUB(vdd_vss) m_supply;
|
||||||
NETLIB_SUB(R) m_R;
|
NETLIB_SUB(R_base) m_R;
|
||||||
|
|
||||||
analog_input_t m_control;
|
analog_input_t m_control;
|
||||||
param_double_t m_base_r;
|
param_double_t m_base_r;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
NETLIB_RESET(CD4066_GATE)
|
||||||
|
{
|
||||||
|
// Start in off condition
|
||||||
|
// FIXME: is ROFF correct?
|
||||||
|
m_R.set_R(NL_FCONST(1.0) / netlist().gmin());
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
NETLIB_UPDATE(CD4066_GATE)
|
NETLIB_UPDATE(CD4066_GATE)
|
||||||
{
|
{
|
||||||
nl_double sup = (m_supply.vdd() - m_supply.vss());
|
nl_double sup = (m_supply.vdd() - m_supply.vss());
|
||||||
|
@ -16,24 +16,29 @@ namespace netlist { namespace devices {
|
|||||||
NETLIB_CONSTRUCTOR(CD4316_GATE)
|
NETLIB_CONSTRUCTOR(CD4316_GATE)
|
||||||
NETLIB_FAMILY("CD4XXX")
|
NETLIB_FAMILY("CD4XXX")
|
||||||
, m_supply(*this, "PS")
|
, m_supply(*this, "PS")
|
||||||
, m_R(*this, "R")
|
, m_R(*this, "_R")
|
||||||
, m_S(*this, "S")
|
, m_S(*this, "S")
|
||||||
, m_E(*this, "E")
|
, m_E(*this, "E")
|
||||||
, m_base_r(*this, "BASER", 45.0)
|
, m_base_r(*this, "BASER", 45.0)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
NETLIB_RESETI() { }
|
NETLIB_RESETI();
|
||||||
NETLIB_UPDATEI();
|
NETLIB_UPDATEI();
|
||||||
|
|
||||||
public:
|
public:
|
||||||
NETLIB_SUB(vdd_vss) m_supply;
|
NETLIB_SUB(vdd_vss) m_supply;
|
||||||
NETLIB_SUB(R) m_R;
|
NETLIB_SUB(R_base) m_R;
|
||||||
|
|
||||||
logic_input_t m_S, m_E;
|
logic_input_t m_S, m_E;
|
||||||
param_double_t m_base_r;
|
param_double_t m_base_r;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
NETLIB_RESET(CD4316_GATE)
|
||||||
|
{
|
||||||
|
m_R.set_R(NL_FCONST(1.0) / netlist().gmin());
|
||||||
|
}
|
||||||
|
|
||||||
NETLIB_UPDATE(CD4316_GATE)
|
NETLIB_UPDATE(CD4316_GATE)
|
||||||
{
|
{
|
||||||
m_R.update_dev();
|
m_R.update_dev();
|
||||||
|
@ -44,10 +44,10 @@ namespace netlist
|
|||||||
NETLIB_RESETI();
|
NETLIB_RESETI();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
NETLIB_SUB(R) m_R1;
|
NETLIB_SUB(R_base) m_R1;
|
||||||
NETLIB_SUB(R) m_R2;
|
NETLIB_SUB(R_base) m_R2;
|
||||||
NETLIB_SUB(R) m_R3;
|
NETLIB_SUB(R_base) m_R3;
|
||||||
NETLIB_SUB(R) m_RDIS;
|
NETLIB_SUB(R_base) m_RDIS;
|
||||||
|
|
||||||
logic_input_t m_RESET;
|
logic_input_t m_RESET;
|
||||||
analog_input_t m_THRES;
|
analog_input_t m_THRES;
|
||||||
|
@ -91,6 +91,11 @@ namespace netlist
|
|||||||
// nld_res_sw
|
// nld_res_sw
|
||||||
// -----------------------------------------------------------------------------
|
// -----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
NETLIB_RESET(res_sw)
|
||||||
|
{
|
||||||
|
m_last_state = 0;
|
||||||
|
m_R.set_R(m_ROFF());
|
||||||
|
}
|
||||||
|
|
||||||
NETLIB_UPDATE(res_sw)
|
NETLIB_UPDATE(res_sw)
|
||||||
{
|
{
|
||||||
|
@ -386,7 +386,7 @@ namespace netlist
|
|||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
NETLIB_CONSTRUCTOR(res_sw)
|
NETLIB_CONSTRUCTOR(res_sw)
|
||||||
, m_R(*this, "R")
|
, m_R(*this, "_R")
|
||||||
, m_I(*this, "I")
|
, m_I(*this, "I")
|
||||||
, m_RON(*this, "RON", 1.0)
|
, m_RON(*this, "RON", 1.0)
|
||||||
, m_ROFF(*this, "ROFF", 1.0E20)
|
, m_ROFF(*this, "ROFF", 1.0E20)
|
||||||
@ -396,16 +396,12 @@ namespace netlist
|
|||||||
register_subalias("2", m_R.m_N);
|
register_subalias("2", m_R.m_N);
|
||||||
}
|
}
|
||||||
|
|
||||||
NETLIB_SUB(R) m_R;
|
NETLIB_SUB(R_base) m_R;
|
||||||
logic_input_t m_I;
|
logic_input_t m_I;
|
||||||
param_double_t m_RON;
|
param_double_t m_RON;
|
||||||
param_double_t m_ROFF;
|
param_double_t m_ROFF;
|
||||||
|
|
||||||
NETLIB_RESETI()
|
NETLIB_RESETI();
|
||||||
{
|
|
||||||
m_last_state = 0;
|
|
||||||
m_R.set_R(m_ROFF());
|
|
||||||
}
|
|
||||||
//NETLIB_UPDATE_PARAMI();
|
//NETLIB_UPDATE_PARAMI();
|
||||||
NETLIB_UPDATEI();
|
NETLIB_UPDATEI();
|
||||||
|
|
||||||
|
@ -243,19 +243,20 @@ netlist_t::netlist_t(const pstring &aname)
|
|||||||
, m_queue(*this)
|
, m_queue(*this)
|
||||||
, m_mainclock(nullptr)
|
, m_mainclock(nullptr)
|
||||||
, m_solver(nullptr)
|
, m_solver(nullptr)
|
||||||
, m_gnd(nullptr)
|
|
||||||
, m_params(nullptr)
|
, m_params(nullptr)
|
||||||
, m_name(aname)
|
, m_name(aname)
|
||||||
, m_setup(nullptr)
|
|
||||||
, m_log(this)
|
, m_log(this)
|
||||||
, m_lib(nullptr)
|
, m_lib(nullptr)
|
||||||
{
|
{
|
||||||
state().save_item(this, static_cast<plib::state_manager_t::callback_t &>(m_queue), "m_queue");
|
state().save_item(this, static_cast<plib::state_manager_t::callback_t &>(m_queue), "m_queue");
|
||||||
state().save_item(this, m_time, "m_time");
|
state().save_item(this, m_time, "m_time");
|
||||||
|
m_setup = new setup_t(*this);
|
||||||
}
|
}
|
||||||
|
|
||||||
netlist_t::~netlist_t()
|
netlist_t::~netlist_t()
|
||||||
{
|
{
|
||||||
|
if (m_setup != nullptr)
|
||||||
|
delete m_setup;
|
||||||
m_nets.clear();
|
m_nets.clear();
|
||||||
m_devices.clear();
|
m_devices.clear();
|
||||||
|
|
||||||
@ -278,15 +279,15 @@ void netlist_t::register_dev(plib::owned_ptr<device_t> dev)
|
|||||||
|
|
||||||
void netlist_t::start()
|
void netlist_t::start()
|
||||||
{
|
{
|
||||||
|
setup().start_devices1();
|
||||||
|
|
||||||
/* load the library ... */
|
/* load the library ... */
|
||||||
|
|
||||||
/* make sure the solver and parameters are started first! */
|
/* make sure the solver and parameters are started first! */
|
||||||
|
|
||||||
for (auto & e : setup().m_device_factory)
|
for (auto & e : setup().m_device_factory)
|
||||||
{
|
{
|
||||||
if ( setup().factory().is_class<devices::NETLIB_NAME(mainclock)>(e.second)
|
if ( setup().factory().is_class<devices::NETLIB_NAME(solver)>(e.second)
|
||||||
|| setup().factory().is_class<devices::NETLIB_NAME(solver)>(e.second)
|
|
||||||
|| setup().factory().is_class<devices::NETLIB_NAME(gnd)>(e.second)
|
|
||||||
|| setup().factory().is_class<devices::NETLIB_NAME(netlistparams)>(e.second))
|
|| setup().factory().is_class<devices::NETLIB_NAME(netlistparams)>(e.second))
|
||||||
{
|
{
|
||||||
auto dev = plib::owned_ptr<device_t>(e.second->Create(*this, e.first));
|
auto dev = plib::owned_ptr<device_t>(e.second->Create(*this, e.first));
|
||||||
@ -296,18 +297,14 @@ void netlist_t::start()
|
|||||||
|
|
||||||
log().debug("Searching for mainclock and solver ...\n");
|
log().debug("Searching for mainclock and solver ...\n");
|
||||||
|
|
||||||
m_mainclock = get_single_device<devices::NETLIB_NAME(mainclock)>("mainclock");
|
|
||||||
m_solver = get_single_device<devices::NETLIB_NAME(solver)>("solver");
|
m_solver = get_single_device<devices::NETLIB_NAME(solver)>("solver");
|
||||||
m_gnd = get_single_device<devices::NETLIB_NAME(gnd)>("gnd");
|
|
||||||
m_params = get_single_device<devices::NETLIB_NAME(netlistparams)>("parameter");
|
m_params = get_single_device<devices::NETLIB_NAME(netlistparams)>("parameter");
|
||||||
|
|
||||||
/* create devices */
|
/* create devices */
|
||||||
|
|
||||||
for (auto & e : setup().m_device_factory)
|
for (auto & e : setup().m_device_factory)
|
||||||
{
|
{
|
||||||
if ( !setup().factory().is_class<devices::NETLIB_NAME(mainclock)>(e.second)
|
if ( !setup().factory().is_class<devices::NETLIB_NAME(solver)>(e.second)
|
||||||
&& !setup().factory().is_class<devices::NETLIB_NAME(solver)>(e.second)
|
|
||||||
&& !setup().factory().is_class<devices::NETLIB_NAME(gnd)>(e.second)
|
|
||||||
&& !setup().factory().is_class<devices::NETLIB_NAME(netlistparams)>(e.second))
|
&& !setup().factory().is_class<devices::NETLIB_NAME(netlistparams)>(e.second))
|
||||||
{
|
{
|
||||||
auto dev = plib::owned_ptr<device_t>(e.second->Create(*this, e.first));
|
auto dev = plib::owned_ptr<device_t>(e.second->Create(*this, e.first));
|
||||||
@ -315,6 +312,9 @@ void netlist_t::start()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
log().debug("Searching for mainclock\n");
|
||||||
|
m_mainclock = get_single_device<devices::NETLIB_NAME(mainclock)>("mainclock");
|
||||||
|
|
||||||
bool use_deactivate = (m_params->m_use_deactivate() ? true : false);
|
bool use_deactivate = (m_params->m_use_deactivate() ? true : false);
|
||||||
|
|
||||||
for (auto &d : m_devices)
|
for (auto &d : m_devices)
|
||||||
@ -333,16 +333,35 @@ void netlist_t::start()
|
|||||||
d->set_hint_deactivate(false);
|
d->set_hint_deactivate(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
pstring libpath = plib::util::environment("NL_BOOSTLIB", plib::util::buildpath({".", "nlboost.so"}));
|
pstring libpath = plib::util::environment("NL_BOOSTLIB", plib::util::buildpath({".", "nlboost.so"}));
|
||||||
|
|
||||||
m_lib = plib::palloc<plib::dynlib>(libpath);
|
m_lib = plib::palloc<plib::dynlib>(libpath);
|
||||||
|
|
||||||
|
/* resolve inputs */
|
||||||
|
setup().resolve_inputs1();
|
||||||
|
|
||||||
|
log().verbose("initialize solver ...\n");
|
||||||
|
|
||||||
|
if (m_solver == nullptr)
|
||||||
|
{
|
||||||
|
for (auto &p : m_nets)
|
||||||
|
if (p->is_analog())
|
||||||
|
log().fatal("No solver found for this net although analog elements are present\n");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
m_solver->post_start();
|
||||||
|
|
||||||
|
/* finally, set the pointers */
|
||||||
|
|
||||||
|
log().debug("Setting delegate pointers ...\n");
|
||||||
|
for (auto &dev : m_devices)
|
||||||
|
dev->set_delegate_pointer();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void netlist_t::stop()
|
void netlist_t::stop()
|
||||||
{
|
{
|
||||||
|
log().debug("Printing statistics ...\n");
|
||||||
|
print_stats();
|
||||||
log().debug("Stopping solver device ...\n");
|
log().debug("Stopping solver device ...\n");
|
||||||
m_solver->stop();
|
m_solver->stop();
|
||||||
}
|
}
|
||||||
|
@ -1166,11 +1166,10 @@ namespace netlist
|
|||||||
void start();
|
void start();
|
||||||
void stop();
|
void stop();
|
||||||
|
|
||||||
const detail::queue_t &queue() const { return m_queue; }
|
|
||||||
detail::queue_t &queue() { return m_queue; }
|
|
||||||
const netlist_time time() const { return m_time; }
|
const netlist_time time() const { return m_time; }
|
||||||
devices::NETLIB_NAME(solver) *solver() const { return m_solver; }
|
devices::NETLIB_NAME(solver) *solver() const { return m_solver; }
|
||||||
devices::NETLIB_NAME(gnd) *gnd() const { return m_gnd; }
|
|
||||||
|
/* never use this in constructors! */
|
||||||
nl_double gmin() const;
|
nl_double gmin() const;
|
||||||
|
|
||||||
void push_to_queue(detail::net_t &out, const netlist_time attime) NL_NOEXCEPT;
|
void push_to_queue(detail::net_t &out, const netlist_time attime) NL_NOEXCEPT;
|
||||||
@ -1181,7 +1180,6 @@ namespace netlist
|
|||||||
|
|
||||||
void rebuild_lists(); /* must be called after post_load ! */
|
void rebuild_lists(); /* must be called after post_load ! */
|
||||||
|
|
||||||
void set_setup(setup_t *asetup) { m_setup = asetup; }
|
|
||||||
setup_t &setup() { return *m_setup; }
|
setup_t &setup() { return *m_setup; }
|
||||||
|
|
||||||
void register_dev(plib::owned_ptr<device_t> dev);
|
void register_dev(plib::owned_ptr<device_t> dev);
|
||||||
@ -1237,14 +1235,18 @@ namespace netlist
|
|||||||
|
|
||||||
plib::dynlib &lib() { return *m_lib; }
|
plib::dynlib &lib() { return *m_lib; }
|
||||||
|
|
||||||
void print_stats() const;
|
|
||||||
|
|
||||||
std::vector<plib::owned_ptr<core_device_t>> m_devices;
|
std::vector<plib::owned_ptr<core_device_t>> m_devices;
|
||||||
/* sole use is to manage lifetime of net objects */
|
/* sole use is to manage lifetime of net objects */
|
||||||
std::vector<plib::owned_ptr<detail::net_t>> m_nets;
|
std::vector<plib::owned_ptr<detail::net_t>> m_nets;
|
||||||
/* sole use is to manage lifetime of family objects */
|
/* sole use is to manage lifetime of family objects */
|
||||||
std::vector<std::pair<pstring, std::unique_ptr<logic_family_desc_t>>> m_family_cache;
|
std::vector<std::pair<pstring, std::unique_ptr<logic_family_desc_t>>> m_family_cache;
|
||||||
|
|
||||||
|
const detail::queue_t &queue() const { return m_queue; }
|
||||||
|
detail::queue_t &queue() { return m_queue; }
|
||||||
|
|
||||||
|
protected:
|
||||||
|
void print_stats() const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
plib::state_manager_t m_state;
|
plib::state_manager_t m_state;
|
||||||
/* mostly rw */
|
/* mostly rw */
|
||||||
@ -1255,7 +1257,6 @@ namespace netlist
|
|||||||
|
|
||||||
devices::NETLIB_NAME(mainclock) * m_mainclock;
|
devices::NETLIB_NAME(mainclock) * m_mainclock;
|
||||||
devices::NETLIB_NAME(solver) * m_solver;
|
devices::NETLIB_NAME(solver) * m_solver;
|
||||||
devices::NETLIB_NAME(gnd) * m_gnd;
|
|
||||||
devices::NETLIB_NAME(netlistparams) *m_params;
|
devices::NETLIB_NAME(netlistparams) *m_params;
|
||||||
|
|
||||||
pstring m_name;
|
pstring m_name;
|
||||||
|
@ -35,7 +35,6 @@ setup_t::setup_t(netlist_t &netlist)
|
|||||||
, m_proxy_cnt(0)
|
, m_proxy_cnt(0)
|
||||||
, m_frontier_cnt(0)
|
, m_frontier_cnt(0)
|
||||||
{
|
{
|
||||||
netlist.set_setup(this);
|
|
||||||
initialize_factory(m_factory);
|
initialize_factory(m_factory);
|
||||||
NETLIST_NAME(base)(*this);
|
NETLIST_NAME(base)(*this);
|
||||||
}
|
}
|
||||||
@ -48,7 +47,6 @@ setup_t::~setup_t()
|
|||||||
m_terminals.clear();
|
m_terminals.clear();
|
||||||
m_param_values.clear();
|
m_param_values.clear();
|
||||||
|
|
||||||
netlist().set_setup(nullptr);
|
|
||||||
m_sources.clear();
|
m_sources.clear();
|
||||||
|
|
||||||
pstring::resetmem();
|
pstring::resetmem();
|
||||||
@ -703,10 +701,8 @@ bool setup_t::connect(detail::core_terminal_t &t1_in, detail::core_terminal_t &t
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
void setup_t::resolve_inputs()
|
void setup_t::resolve_inputs1()
|
||||||
{
|
{
|
||||||
bool has_twoterms = false;
|
|
||||||
|
|
||||||
log().verbose("Resolving inputs ...");
|
log().verbose("Resolving inputs ...");
|
||||||
|
|
||||||
/* Netlist can directly connect input to input.
|
/* Netlist can directly connect input to input.
|
||||||
@ -776,31 +772,13 @@ void setup_t::resolve_inputs()
|
|||||||
log().verbose("looking for two terms connected to rail nets ...\n");
|
log().verbose("looking for two terms connected to rail nets ...\n");
|
||||||
for (auto & t : netlist().get_device_list<devices::NETLIB_NAME(twoterm)>())
|
for (auto & t : netlist().get_device_list<devices::NETLIB_NAME(twoterm)>())
|
||||||
{
|
{
|
||||||
has_twoterms = true;
|
|
||||||
if (t->m_N.net().isRailNet() && t->m_P.net().isRailNet())
|
if (t->m_N.net().isRailNet() && t->m_P.net().isRailNet())
|
||||||
log().warning("Found device {1} connected only to railterminals {2}/{3}\n",
|
log().warning("Found device {1} connected only to railterminals {2}/{3}\n",
|
||||||
t->name(), t->m_N.net().name(), t->m_P.net().name());
|
t->name(), t->m_N.net().name(), t->m_P.net().name());
|
||||||
}
|
}
|
||||||
|
|
||||||
log().verbose("initialize solver ...\n");
|
|
||||||
|
|
||||||
if (netlist().solver() == nullptr)
|
|
||||||
{
|
|
||||||
if (has_twoterms)
|
|
||||||
log().fatal("No solver found for this net although analog elements are present\n");
|
|
||||||
}
|
|
||||||
else
|
|
||||||
netlist().solver()->post_start();
|
|
||||||
|
|
||||||
/* finally, set the pointers */
|
|
||||||
|
|
||||||
log().debug("Initializing devices ...\n");
|
|
||||||
for (auto &dev : netlist().m_devices)
|
|
||||||
dev->set_delegate_pointer();
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void setup_t::start_devices()
|
void setup_t::start_devices1()
|
||||||
{
|
{
|
||||||
pstring env = plib::util::environment("NL_LOGS");
|
pstring env = plib::util::environment("NL_LOGS");
|
||||||
|
|
||||||
@ -817,8 +795,6 @@ void setup_t::start_devices()
|
|||||||
netlist().register_dev(std::move(nc));
|
netlist().register_dev(std::move(nc));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
netlist().start();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
plib::plog_base<NL_DEBUG> &setup_t::log()
|
plib::plog_base<NL_DEBUG> &setup_t::log()
|
||||||
|
@ -227,8 +227,8 @@ namespace netlist
|
|||||||
|
|
||||||
param_t *find_param(const pstring ¶m_in, bool required = true) const;
|
param_t *find_param(const pstring ¶m_in, bool required = true) const;
|
||||||
|
|
||||||
void start_devices();
|
void start_devices1();
|
||||||
void resolve_inputs();
|
void resolve_inputs1();
|
||||||
|
|
||||||
/* handle namespace */
|
/* handle namespace */
|
||||||
|
|
||||||
|
@ -128,19 +128,16 @@ class netlist_tool_t : public netlist::netlist_t
|
|||||||
public:
|
public:
|
||||||
|
|
||||||
netlist_tool_t(const pstring &aname)
|
netlist_tool_t(const pstring &aname)
|
||||||
: netlist::netlist_t(aname), m_setup(nullptr)
|
: netlist::netlist_t(aname)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
~netlist_tool_t()
|
~netlist_tool_t()
|
||||||
{
|
{
|
||||||
if (m_setup != nullptr)
|
|
||||||
plib::pfree(m_setup);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void init()
|
void init()
|
||||||
{
|
{
|
||||||
m_setup = plib::palloc<netlist::setup_t>(*this);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void read_netlist(const pstring &filename, const pstring &name,
|
void read_netlist(const pstring &filename, const pstring &name,
|
||||||
@ -151,19 +148,18 @@ public:
|
|||||||
// read the netlist ...
|
// read the netlist ...
|
||||||
|
|
||||||
for (auto & d : defines)
|
for (auto & d : defines)
|
||||||
m_setup->register_define(d);
|
setup().register_define(d);
|
||||||
|
|
||||||
for (auto & r : roms)
|
for (auto & r : roms)
|
||||||
m_setup->register_source(plib::make_unique_base<netlist::source_t, netlist_data_folder_t>(*m_setup, r));
|
setup().register_source(plib::make_unique_base<netlist::source_t, netlist_data_folder_t>(setup(), r));
|
||||||
|
|
||||||
m_setup->register_source(plib::make_unique_base<netlist::source_t,
|
setup().register_source(plib::make_unique_base<netlist::source_t,
|
||||||
netlist::source_file_t>(*m_setup, filename));
|
netlist::source_file_t>(setup(), filename));
|
||||||
m_setup->include(name);
|
setup().include(name);
|
||||||
log_setup(logs);
|
log_setup(logs);
|
||||||
|
|
||||||
// start devices
|
// start devices
|
||||||
m_setup->start_devices();
|
this->start();
|
||||||
m_setup->resolve_inputs();
|
|
||||||
// reset
|
// reset
|
||||||
this->reset();
|
this->reset();
|
||||||
}
|
}
|
||||||
@ -174,19 +170,16 @@ public:
|
|||||||
for (auto & log : logs)
|
for (auto & log : logs)
|
||||||
{
|
{
|
||||||
pstring name = "log_" + log;
|
pstring name = "log_" + log;
|
||||||
/*netlist_device_t *nc = */ m_setup->register_dev("LOG", name);
|
/*netlist_device_t *nc = */ setup().register_dev("LOG", name);
|
||||||
m_setup->register_link(name + ".I", log);
|
setup().register_link(name + ".I", log);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
netlist::setup_t &setup() { return *m_setup; }
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|
||||||
void vlog(const plib::plog_level &l, const pstring &ls) const override;
|
void vlog(const plib::plog_level &l, const pstring &ls) const override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
netlist::setup_t *m_setup;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
void netlist_tool_t::vlog(const plib::plog_level &l, const pstring &ls) const
|
void netlist_tool_t::vlog(const plib::plog_level &l, const pstring &ls) const
|
||||||
@ -210,18 +203,12 @@ void usage(tool_options_t &opts)
|
|||||||
|
|
||||||
struct input_t
|
struct input_t
|
||||||
{
|
{
|
||||||
#if 0
|
|
||||||
input_t()
|
|
||||||
: m_param(nullptr), m_value(0.0)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
input_t(const netlist::setup_t &setup, const pstring &line)
|
input_t(const netlist::setup_t &setup, const pstring &line)
|
||||||
{
|
{
|
||||||
char buf[400];
|
char buf[400];
|
||||||
double t;
|
double t;
|
||||||
int e = sscanf(line.c_str(), "%lf,%[^,],%lf", &t, buf, &m_value);
|
int e = sscanf(line.c_str(), "%lf,%[^,],%lf", &t, buf, &m_value);
|
||||||
if ( e!= 3)
|
if (e != 3)
|
||||||
throw netlist::nl_exception(plib::pfmt("error {1} scanning line {2}\n")(e)(line));
|
throw netlist::nl_exception(plib::pfmt("error {1} scanning line {2}\n")(e)(line));
|
||||||
m_time = netlist::netlist_time::from_double(t);
|
m_time = netlist::netlist_time::from_double(t);
|
||||||
m_param = setup.find_param(buf, true);
|
m_param = setup.find_param(buf, true);
|
||||||
@ -249,7 +236,6 @@ struct input_t
|
|||||||
netlist::netlist_time m_time;
|
netlist::netlist_time m_time;
|
||||||
netlist::param_t *m_param;
|
netlist::param_t *m_param;
|
||||||
double m_value;
|
double m_value;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
static std::vector<input_t> read_input(const netlist::setup_t &setup, pstring fname)
|
static std::vector<input_t> read_input(const netlist::setup_t &setup, pstring fname)
|
||||||
@ -359,8 +345,7 @@ static void listdevices(tool_options_t &opts)
|
|||||||
nt.setup().include("dummy");
|
nt.setup().include("dummy");
|
||||||
|
|
||||||
|
|
||||||
nt.setup().start_devices();
|
nt.start();
|
||||||
nt.setup().resolve_inputs();
|
|
||||||
|
|
||||||
std::vector<plib::owned_ptr<netlist::core_device_t>> devs;
|
std::vector<plib::owned_ptr<netlist::core_device_t>> devs;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user