netlist: Add more validations and fix issues identified.

This commit is contained in:
couriersud 2019-04-21 18:27:42 +02:00
parent f9f5fc63fe
commit 7dfd781e22
15 changed files with 303 additions and 176 deletions

View File

@ -21,6 +21,7 @@
#include "debugger.h"
#include "romload.h"
#include "emuopts.h"
#include <cmath>
#include <memory>
@ -680,9 +681,18 @@ void netlist_mame_analog_input_device::device_start()
// disable automatic scaling for ioports
m_auto_port = false;
}
}
void netlist_mame_analog_input_device::validity_helper(validity_checker &valid,
netlist::netlist_state_t &nlstate) const
{
netlist::param_t *p = nlstate.setup().find_param(pstring(m_param_name));
auto *param = dynamic_cast<netlist::param_double_t *>(p);
if (param == nullptr)
{
osd_printf_warning("device %s wrong parameter type for %s\n", basetag(), m_param_name);
}
}
// ----------------------------------------------------------------------------------------
// netlist_mame_analog_output_device
@ -790,6 +800,17 @@ void netlist_mame_int_input_device::device_start()
}
}
void netlist_mame_int_input_device::validity_helper(validity_checker &valid,
netlist::netlist_state_t &nlstate) const
{
netlist::param_t *p = nlstate.setup().find_param(pstring(m_param_name));
auto *param = dynamic_cast<netlist::param_int_t *>(p);
if (param == nullptr)
{
osd_printf_warning("device %s wrong parameter type for %s\n", basetag(), m_param_name);
}
}
// ----------------------------------------------------------------------------------------
// netlist_mame_logic_input_device
// ----------------------------------------------------------------------------------------
@ -821,6 +842,17 @@ void netlist_mame_logic_input_device::device_start()
}
}
void netlist_mame_logic_input_device::validity_helper(validity_checker &valid,
netlist::netlist_state_t &nlstate) const
{
netlist::param_t *p = nlstate.setup().find_param(pstring(m_param_name));
auto *param = dynamic_cast<netlist::param_logic_t *>(p);
if (param == nullptr)
{
osd_printf_warning("device %s wrong parameter type for %s\n", basetag(), m_param_name);
}
}
// ----------------------------------------------------------------------------------------
// netlist_mame_ram_pointer_device
@ -863,6 +895,17 @@ void netlist_mame_ram_pointer_device::device_start()
m_data = (*m_param)();
}
void netlist_mame_ram_pointer_device::validity_helper(validity_checker &valid,
netlist::netlist_state_t &nlstate) const
{
netlist::param_t *p = nlstate.setup().find_param(pstring(m_param_name));
auto *param = dynamic_cast<netlist::param_ptr_t *>(p);
if (param == nullptr)
{
osd_printf_warning("device %s wrong parameter type for %s\n", basetag(), m_param_name);
}
}
// ----------------------------------------------------------------------------------------
// netlist_mame_stream_input_device
// ----------------------------------------------------------------------------------------
@ -1005,22 +1048,27 @@ void netlist_mame_device::common_dev_start(netlist::netlist_t *lnetlist) const
#endif
}
void netlist_mame_device::device_validity_check(validity_checker &valid) const
plib::unique_ptr<netlist::netlist_t> netlist_mame_device::base_validity_check(validity_checker &valid) const
{
#if 1
//rom_exists(mconfig().root_device());
LOGDEVCALLS("device_validity_check %s\n", this->mconfig().gamedrv().name);
try
{
//netlist_mame_t lnetlist(*this, "netlist", plib::make_unique<netlist_validate_callbacks_t>());
netlist::netlist_t lnetlist("netlist", plib::make_unique<netlist_validate_callbacks_t>());
auto lnetlist = plib::make_unique<netlist::netlist_t>("netlist", plib::make_unique<netlist_validate_callbacks_t>());
// enable validation mode
lnetlist.nlstate().setup().enable_validation();
common_dev_start(&lnetlist);
lnetlist->nlstate().setup().enable_validation();
common_dev_start(lnetlist.get());
for (device_t &d : subdevices())
{
netlist_mame_sub_interface *sdev = dynamic_cast<netlist_mame_sub_interface *>(&d);
if( sdev != nullptr )
{
LOGDEVCALLS("Validity check on subdevice %s/%s\n", d.name(), d.shortname());
sdev->validity_helper(valid, lnetlist->nlstate());
}
}
return lnetlist;
}
catch (memregion_not_set &err)
{
@ -1034,7 +1082,14 @@ void netlist_mame_device::device_validity_check(validity_checker &valid) const
{
osd_printf_error("%s\n", err.what());
}
#endif
return plib::unique_ptr<netlist::netlist_t>(nullptr);
}
void netlist_mame_device::device_validity_check(validity_checker &valid) const
{
base_validity_check(valid);
//rom_exists(mconfig().root_device());
LOGDEVCALLS("device_validity_check %s\n", this->mconfig().gamedrv().name);
}
@ -1043,6 +1098,11 @@ void netlist_mame_device::device_start()
LOGDEVCALLS("device_start entry\n");
m_netlist = netlist::pool().make_poolptr<netlist_mame_t>(*this, "netlist");
if (!machine().options().verbose())
{
m_netlist->nlstate().log().verbose.set_enabled(false);
m_netlist->nlstate().log().debug.set_enabled(false);
}
common_dev_start(m_netlist.get());
@ -1271,6 +1331,33 @@ netlist_mame_sound_device::netlist_mame_sound_device(const machine_config &mconf
{
}
void netlist_mame_sound_device::device_validity_check(validity_checker &valid) const
{
LOGDEVCALLS("sound device_validity check\n");
auto lnetlist = base_validity_check(valid);
if (lnetlist)
{
/*Ok - do some more checks */
std::vector<nld_sound_out *> outdevs = lnetlist->nlstate().get_device_list<nld_sound_out>();
if (outdevs.size() == 0)
osd_printf_error("No output devices\n");
else
{
for (auto &outdev : outdevs)
{
int chan = outdev->m_channel();
if (chan < 0 || chan >= outdevs.size())
osd_printf_error("illegal channel number %d\n", chan);
}
}
std::vector<nld_sound_in *> indevs = lnetlist->nlstate().get_device_list<nld_sound_in>();
if (indevs.size() > 1)
osd_printf_error("A maximum of one input device is allowed but found %d!\n", (int)indevs.size());
}
}
void netlist_mame_sound_device::device_start()
{
netlist_mame_device::device_start();
@ -1327,7 +1414,6 @@ void netlist_mame_sound_device::nl_register_devices(netlist::setup_t &lsetup) co
lsetup.factory().register_device<nld_sound_in>("NETDEV_SOUND_IN", "nld_sound_in", "-");
}
void netlist_mame_sound_device::sound_stream_update(sound_stream &stream, stream_sample_t **inputs, stream_sample_t **outputs, int samples)
{

View File

@ -146,6 +146,8 @@ protected:
netlist::netlist_time m_div;
plib::unique_ptr<netlist::netlist_t> base_validity_check(validity_checker &valid) const;
private:
void save_state();
@ -267,6 +269,7 @@ public:
// device_sound_interface overrides
virtual void sound_stream_update(sound_stream &stream, stream_sample_t **inputs, stream_sample_t **outputs, int samples) override;
virtual void device_validity_check(validity_checker &valid) const override;
protected:
// netlist_mame_device
@ -302,6 +305,8 @@ public:
virtual void custom_netlist_additions(netlist::netlist_state_t &nlstate) { }
virtual void pre_parse_action(netlist::netlist_state_t &nlstate) { }
virtual void validity_helper(validity_checker &valid,
netlist::netlist_state_t &nlstate) const { }
inline netlist_mame_device &nl_owner() const { return *m_owner; }
@ -352,6 +357,8 @@ public:
inline DECLARE_WRITE32_MEMBER(write32) { write(data); }
inline DECLARE_WRITE64_MEMBER(write64) { write(data); }
virtual void validity_helper(validity_checker &valid,
netlist::netlist_state_t &nlstate) const override;
protected:
// device-level overrides
virtual void device_start() override;
@ -454,6 +461,8 @@ public:
DECLARE_WRITE32_MEMBER(write32) { write(data); }
DECLARE_WRITE64_MEMBER(write64) { write(data); }
virtual void validity_helper(validity_checker &valid, netlist::netlist_state_t &nlstate) const override;
protected:
// device-level overrides
virtual void device_start() override;
@ -493,6 +502,8 @@ public:
DECLARE_WRITE32_MEMBER(write32) { write(data); }
DECLARE_WRITE64_MEMBER(write64) { write(data); }
virtual void validity_helper(validity_checker &valid, netlist::netlist_state_t &nlstate) const override;
protected:
// device-level overrides
virtual void device_start() override;
@ -519,6 +530,8 @@ public:
void set_params(const char *param_name);
virtual void validity_helper(validity_checker &valid, netlist::netlist_state_t &nlstate) const override;
protected:
// device-level overrides
virtual void device_start() override;

View File

@ -281,7 +281,7 @@ namespace analog
m_vto = m_model.m_VTO;
if(m_vto != 0.0)
log().info("Threshold voltage not specified for {1}", m_model.name());
log().warning(MW_MOSFET_THRESHOLD_VOLTAGE(m_model.name()));
/* FIXME: VTO if missing may be calculated from TPG, NSS and temperature. Usually models
* specify VTO so skip this here.

View File

@ -116,7 +116,7 @@ namespace netlist
{
m_type = static_cast<int>(m_model.m_TYPE);
if (m_type < 1 || m_type > 3)
log().fatal(MF_UNKNOWN_OPAMP_TYPE(m_type));
log().fatal(MF_OPAMP_UNKNOWN_TYPE(m_type));
if (m_type == 1)
{
@ -225,7 +225,7 @@ namespace netlist
//printf("OPAMP %s: %g %g %g\n", name().c_str(), CP, RP, G);
if (m_model.m_SLEW / (4.0 * constants::pi() * 0.0258) < m_model.m_UGF)
log().warning("Opamp <{1}> parameters fail convergence criteria", this->name());
log().warning(MW_OPAMP_FAIL_CONVERGENCE(this->name()));
m_CP->m_C.setTo(CP);
m_RP.set_R(RP);

View File

@ -436,7 +436,7 @@ namespace devices
}
else
{
owner.create_and_register_subdevice("_RVG", m_RVG);
owner.create_and_register_subdevice(sPowerDevRes, m_RVG);
owner.register_subalias(sVCC, "_RVG.1");
owner.register_subalias(sGND, "_RVG.2");
}

View File

@ -1342,6 +1342,8 @@ namespace netlist
return dynamic_cast<C *>(p) != nullptr;
}
core_device_t *get_single_device(const pstring &classname, bool (*cc)(core_device_t *)) const;
template<class C>
C *get_single_device(const pstring &classname) const
{
@ -1374,8 +1376,6 @@ namespace netlist
this->run_state_manager().save_state_ptr(static_cast<void *>(&owner), module + pstring(".") + stname, plib::state_manager_t::dtype<C>(), count, state);
}
core_device_t *get_single_device(const pstring &classname, bool (*cc)(core_device_t *)) const;
detail::net_t *find_net(const pstring &name) const;
std::size_t find_net_id(const detail::net_t *net) const;
@ -1395,6 +1395,14 @@ namespace netlist
return tmp;
}
core_device_t *find_device(const pstring &name)
{
for (auto & d : m_devices)
if (d.first == name)
return d.second.get();
return nullptr;
}
template <typename T>
void add_dev(const pstring &name, pool_owned_ptr<T> &&dev)
{
@ -1601,7 +1609,7 @@ namespace netlist
if (f != nullptr)
f->read(reinterpret_cast<plib::pistream::value_type *>(&m_data[0]),1<<AW);
else
device.state().log().warning("Rom {1} not found", str());
device.state().log().warning(MW_ROM_NOT_FOUND(str()));
}
inline void logic_input_t::inactivate() NL_NOEXCEPT

View File

@ -27,104 +27,121 @@
pstring m_m; \
};
// nl_base.cpp
namespace netlist
{
PERRMSGV(MF_DUPLICATE_NAME_DEVICE_LIST, 1, "Error adding {1} to device list. Duplicate name.")
PERRMSGV(MF_UNKNOWN_TYPE_FOR_OBJECT, 1, "Unknown type for object {1},")
PERRMSGV(MF_NET_1_DUPLICATE_TERMINAL_2, 2, "net {1}: duplicate terminal {2}")
PERRMSGV(MF_REMOVE_TERMINAL_1_FROM_NET_2, 2, "Can not remove terminal {1} from net {2}.")
PERRMSGV(MF_UNKNOWN_PARAM_TYPE, 1, "Can not determine param_type for {1}")
PERRMSGV(MF_ERROR_CONNECTING_1_TO_2, 2, "Error connecting {1} to {2}")
PERRMSGV(MF_NO_SOLVER, 0, "No solver found for this netlist although analog elements are present")
PERRMSGV(MF_HND_VAL_NOT_SUPPORTED, 1, "HINT_NO_DEACTIVATE value not supported: <{1}>")
static constexpr const char * sHINT_NO_DEACTIVATE = ".HINT_NO_DEACTIVATE";
static constexpr const char * sPowerDevRes = "_RVG";
// nl_factory.cpp
// nl_base.cpp
PERRMSGV(MF_FACTORY_ALREADY_CONTAINS_1, 1, "factory already contains {1}")
PERRMSGV(MF_CLASS_1_NOT_FOUND, 1, "Class <{1}> not found!")
PERRMSGV(MF_DUPLICATE_NAME_DEVICE_LIST, 1, "Error adding {1} to device list. Duplicate name.")
PERRMSGV(MF_UNKNOWN_TYPE_FOR_OBJECT, 1, "Unknown type for object {1},")
PERRMSGV(MF_NET_1_DUPLICATE_TERMINAL_2, 2, "net {1}: duplicate terminal {2}")
PERRMSGV(MF_REMOVE_TERMINAL_1_FROM_NET_2, 2, "Can not remove terminal {1} from net {2}.")
PERRMSGV(MF_UNKNOWN_PARAM_TYPE, 1, "Can not determine param_type for {1}")
PERRMSGV(MF_ERROR_CONNECTING_1_TO_2, 2, "Error connecting {1} to {2}")
PERRMSGV(MF_NO_SOLVER, 0, "No solver found for this netlist although analog elements are present")
PERRMSGV(MF_HND_VAL_NOT_SUPPORTED, 1, "HINT_NO_DEACTIVATE value not supported: <{1}>")
PERRMSGV(MW_ROM_NOT_FOUND, 1, "Rom {1} not found")
// nld_opamps.cpp
// nl_factory.cpp
PERRMSGV(MF_UNKNOWN_OPAMP_TYPE, 1, "Unknown opamp type: {1}")
PERRMSGV(MF_FACTORY_ALREADY_CONTAINS_1, 1, "factory already contains {1}")
PERRMSGV(MF_CLASS_1_NOT_FOUND, 1, "Class <{1}> not found!")
// nld_matrix_solver.cpp
// nl_base.cpp
PERRMSGV(MF_UNHANDLED_ELEMENT_1_FOUND, 1, "setup_base:unhandled element <{1}> found")
PERRMSGV(MF_FOUND_TERM_WITH_MISSING_OTHERNET, 1, "found term with missing othernet {1}")
PERRMSGV(MF_MODEL_1_CAN_NOT_BE_CHANGED_AT_RUNTIME, 1, "Model {1} can not be changed at runtime")
PERRMSGV(MF_MORE_THAN_ONE_1_DEVICE_FOUND, 1, "more than one {1} device found")
PERRMSGV(MW_NEWTON_LOOPS_EXCEEDED_ON_NET_1, 1, "NEWTON_LOOPS exceeded on net {1}... reschedule")
// nl_parser.cpp
// nld_solver.cpp
PERRMSGV(MF_UNEXPECTED_NETLIST_END, 0, "Unexpected NETLIST_END")
PERRMSGV(MF_UNEXPECTED_NETLIST_START, 0, "Unexpected NETLIST_START")
PERRMSGV(MF_UNKNOWN_SOLVER_TYPE, 1, "Unknown solver type: {1}")
PERRMSGV(MF_NETGROUP_SIZE_EXCEEDED_1, 1, "Encountered netgroup with > {1} nets")
// nl_setup.cpp
PERRMSGV(MI_NO_SPECIFIC_SOLVER, 1, "No specific solver found for netlist of size {1}")
PERRMSGV(MF_UNABLE_TO_PARSE_MODEL_1, 1, "Unable to parse model: {1}")
PERRMSGV(MF_MODEL_ALREADY_EXISTS_1, 1, "Model already exists: {1}")
PERRMSGV(MF_DEVICE_ALREADY_EXISTS_1, 1, "Device already exists: {1}")
PERRMSGV(MF_ADDING_ALI1_TO_ALIAS_LIST, 1, "Error adding alias {1} to alias list")
PERRMSGV(MF_DIP_PINS_MUST_BE_AN_EQUAL_NUMBER_OF_PINS_1, 1,"You must pass an equal number of pins to DIPPINS {1}")
PERRMSGV(MF_UNKNOWN_OBJECT_TYPE_1, 1, "Unknown object type {1}")
PERRMSGV(MF_INVALID_NUMBER_CONVERSION_1_2, 2, "Invalid number conversion {1} : {2}")
PERRMSGV(MF_ADDING_PARAMETER_1_TO_PARAMETER_LIST,1, "Error adding parameter {1} to parameter list")
PERRMSGV(MF_ADDING_1_2_TO_TERMINAL_LIST, 2, "Error adding {1} {2} to terminal list")
PERRMSGV(MF_NET_C_NEEDS_AT_LEAST_2_TERMINAL, 0, "You must pass at least 2 terminals to NET_C")
PERRMSGV(MF_FOUND_NO_OCCURRENCE_OF_1, 1, "Found no occurrence of {1}")
PERRMSGV(MF_TERMINAL_1_2_NOT_FOUND, 2, "Alias {1} was resolved to be terminal {2}. Terminal {2} was not found.")
PERRMSGV(MF_OBJECT_1_2_WRONG_TYPE, 2, "object {1}({2}) found but wrong type")
PERRMSGV(MF_PARAMETER_1_2_NOT_FOUND, 2, "parameter {1}({2}) not found!")
PERRMSGV(MF_CONNECTING_1_TO_2, 2, "Error connecting {1} to {2}")
PERRMSGV(MF_MERGE_RAIL_NETS_1_AND_2, 2, "Trying to merge two rail nets: {1} and {2}")
PERRMSGV(MF_OBJECT_INPUT_TYPE_1, 1, "Unable to determine input type of {1}")
PERRMSGV(MF_OBJECT_OUTPUT_TYPE_1, 1, "Unable to determine output type of {1}")
PERRMSGV(MF_INPUT_1_ALREADY_CONNECTED, 1, "Input {1} already connected")
PERRMSGV(MF_LINK_TRIES_EXCEEDED, 1, "Error connecting, {1} tries exceeded")
PERRMSGV(MF_MODEL_NOT_FOUND, 1, "Model {1} not found")
PERRMSGV(MF_MODEL_ERROR_1, 1, "Model error {1}")
PERRMSGV(MF_MODEL_ERROR_ON_PAIR_1, 1, "Model error on pair {1}")
PERRMSGV(MF_MODEL_PARAMETERS_NOT_UPPERCASE_1_2, 2, "Model parameters should be uppercase:{1} {2}")
PERRMSGV(MF_ENTITY_1_NOT_FOUND_IN_MODEL_2, 2, "Entity {1} not found in model {2}")
PERRMSGV(MF_UNKNOWN_NUMBER_FACTOR_IN_1, 1, "Unknown number factor in: {1}")
PERRMSGV(MF_NOT_FOUND_IN_SOURCE_COLLECTION, 1, "unable to find {1} in sources collection")
// nl_base.cpp
PERRMSGV(MW_OVERWRITING_PARAM_1_OLD_2_NEW_3, 3, "Overwriting {1} old <{2}> new <{3}>")
PERRMSGV(MW_CONNECTING_1_TO_ITSELF, 1, "Connecting {1} to itself. This may be right, though")
PERRMSGV(MI_DUMMY_1_WITHOUT_CONNECTIONS, 1, "Found dummy terminal {1} without connections")
PERRMSGV(MI_ANALOG_OUTPUT_1_WITHOUT_CONNECTIONS,1, "Found analog output {1} without connections")
PERRMSGV(MI_LOGIC_OUTPUT_1_WITHOUT_CONNECTIONS, 1, "Found logic output {1} without connections")
PERRMSGV(MW_LOGIC_INPUT_1_WITHOUT_CONNECTIONS, 1, "Found logic input {1} without connections")
PERRMSGV(MW_TERMINAL_1_WITHOUT_CONNECTIONS, 1, "Found terminal {1} without connections")
PERRMSGV(MF_MODEL_1_CAN_NOT_BE_CHANGED_AT_RUNTIME, 1, "Model {1} can not be changed at runtime")
PERRMSGV(MF_MORE_THAN_ONE_1_DEVICE_FOUND, 1, "more than one {1} device found")
PERRMSGV(ME_TERMINAL_1_WITHOUT_NET, 1, "Found terminal {1} without a net")
PERRMSGV(MF_TERMINALS_WITHOUT_NET, 0, "Found terminals without a net")
// nl_parser.cpp
PERRMSGV(MI_REMOVE_DEVICE_1_CONNECTED_ONLY_TO_RAILS_2_3, 3, "Found device {1} connected only to railterminals {2}/{3}. Will be removed")
PERRMSGV(MI_POWER_TERMINALS_1_CONNECTED_ANALOG_2_3, 3, "Power terminals {1} connected to analog nets {2}/{3}.")
PERRMSGV(MF_UNEXPECTED_NETLIST_END, 0, "Unexpected NETLIST_END")
PERRMSGV(MF_UNEXPECTED_NETLIST_START, 0, "Unexpected NETLIST_START")
PERRMSGV(MW_DATA_1_NOT_FOUND, 1, "unable to find data {1} in sources collection")
// nl_setup.cpp
PERRMSGV(MW_DEVICE_NOT_FOUND_FOR_HINT, 1, "Device not found for hint {1}")
PERRMSGV(MW_UNKNOWN_PARAMETER, 1, "Unknown parameter {1}")
//PERRMSG(MF_1_CLASS_1_NOT_FOUND ,"Class {1} not found!")
PERRMSGV(MF_UNABLE_TO_PARSE_MODEL_1, 1, "Unable to parse model: {1}")
PERRMSGV(MF_MODEL_ALREADY_EXISTS_1, 1, "Model already exists: {1}")
PERRMSGV(MF_DEVICE_ALREADY_EXISTS_1, 1, "Device already exists: {1}")
PERRMSGV(MF_ADDING_ALI1_TO_ALIAS_LIST, 1, "Error adding alias {1} to alias list")
PERRMSGV(MF_DIP_PINS_MUST_BE_AN_EQUAL_NUMBER_OF_PINS_1, 1,"You must pass an equal number of pins to DIPPINS {1}")
PERRMSGV(MF_UNKNOWN_OBJECT_TYPE_1, 1, "Unknown object type {1}")
PERRMSGV(MF_INVALID_NUMBER_CONVERSION_1_2, 2, "Invalid number conversion {1} : {2}")
PERRMSGV(MF_ADDING_PARAMETER_1_TO_PARAMETER_LIST,1, "Error adding parameter {1} to parameter list")
PERRMSGV(MF_ADDING_1_2_TO_TERMINAL_LIST, 2, "Error adding {1} {2} to terminal list")
PERRMSGV(MF_NET_C_NEEDS_AT_LEAST_2_TERMINAL, 0, "You must pass at least 2 terminals to NET_C")
PERRMSGV(MF_FOUND_NO_OCCURRENCE_OF_1, 1, "Found no occurrence of {1}")
PERRMSGV(MF_TERMINAL_1_2_NOT_FOUND, 2, "Alias {1} was resolved to be terminal {2}. Terminal {2} was not found.")
PERRMSGV(MF_OBJECT_1_2_WRONG_TYPE, 2, "object {1}({2}) found but wrong type")
PERRMSGV(MF_PARAMETER_1_2_NOT_FOUND, 2, "parameter {1}({2}) not found!")
PERRMSGV(MF_CONNECTING_1_TO_2, 2, "Error connecting {1} to {2}")
PERRMSGV(MF_MERGE_RAIL_NETS_1_AND_2, 2, "Trying to merge two rail nets: {1} and {2}")
PERRMSGV(MF_OBJECT_INPUT_TYPE_1, 1, "Unable to determine input type of {1}")
PERRMSGV(MF_OBJECT_OUTPUT_TYPE_1, 1, "Unable to determine output type of {1}")
PERRMSGV(MF_INPUT_1_ALREADY_CONNECTED, 1, "Input {1} already connected")
PERRMSGV(MF_LINK_TRIES_EXCEEDED, 1, "Error connecting, {1} tries exceeded")
PERRMSGV(MF_MODEL_NOT_FOUND, 1, "Model {1} not found")
PERRMSGV(MF_MODEL_ERROR_1, 1, "Model error {1}")
PERRMSGV(MF_MODEL_ERROR_ON_PAIR_1, 1, "Model error on pair {1}")
PERRMSGV(MF_MODEL_PARAMETERS_NOT_UPPERCASE_1_2, 2, "Model parameters should be uppercase:{1} {2}")
PERRMSGV(MF_ENTITY_1_NOT_FOUND_IN_MODEL_2, 2, "Entity {1} not found in model {2}")
PERRMSGV(MF_UNKNOWN_NUMBER_FACTOR_IN_1, 1, "Unknown number factor in: {1}")
PERRMSGV(MF_NOT_FOUND_IN_SOURCE_COLLECTION, 1, "unable to find {1} in sources collection")
// nlid_proxy.cpp
PERRMSGV(MW_OVERWRITING_PARAM_1_OLD_2_NEW_3, 3, "Overwriting {1} old <{2}> new <{3}>")
PERRMSGV(MW_CONNECTING_1_TO_ITSELF, 1, "Connecting {1} to itself. This may be right, though")
PERRMSGV(MI_DUMMY_1_WITHOUT_CONNECTIONS, 1, "Found dummy terminal {1} without connections")
PERRMSGV(MI_ANALOG_OUTPUT_1_WITHOUT_CONNECTIONS,1, "Found analog output {1} without connections")
PERRMSGV(MI_LOGIC_OUTPUT_1_WITHOUT_CONNECTIONS, 1, "Found logic output {1} without connections")
PERRMSGV(MW_LOGIC_INPUT_1_WITHOUT_CONNECTIONS, 1, "Found logic input {1} without connections")
PERRMSGV(MW_TERMINAL_1_WITHOUT_CONNECTIONS, 1, "Found terminal {1} without connections")
PERRMSGV(MI_NO_POWER_TERMINALS_ON_DEVICE_1, 1, "D/A Proxy: Found no valid combination of power terminals on device {1}")
PERRMSGV(MI_MULTIPLE_POWER_TERMINALS_ON_DEVICE, 5, "D/A Proxy: Found multiple power terminals on device {1}: {2} {3} {4} {5}")
PERRMSGV(ME_TERMINAL_1_WITHOUT_NET, 1, "Found terminal {1} without a net")
PERRMSGV(MF_TERMINALS_WITHOUT_NET, 0, "Found terminals without a net")
// nld_matrix_solver.cpp
PERRMSGV(MI_REMOVE_DEVICE_1_CONNECTED_ONLY_TO_RAILS_2_3, 3, "Found device {1} connected only to railterminals {2}/{3}. Will be removed")
PERRMSGV(MF_UNHANDLED_ELEMENT_1_FOUND, 1, "setup_base:unhandled element <{1}> found")
PERRMSGV(MF_FOUND_TERM_WITH_MISSING_OTHERNET, 1, "found term with missing othernet {1}")
PERRMSGV(MW_DATA_1_NOT_FOUND, 1, "unable to find data {1} in sources collection")
PERRMSGV(MW_NEWTON_LOOPS_EXCEEDED_ON_NET_1, 1, "NEWTON_LOOPS exceeded on net {1}... reschedule")
// nld_mm5837.cpp
// nld_solver.cpp
PERRMSGV(MW_FREQUENCY_OUTSIDE_OF_SPECS_1, 1, "MM5837: Frequency outside of specs: {1}")
PERRMSGV(MF_UNKNOWN_SOLVER_TYPE, 1, "Unknown solver type: {1}")
PERRMSGV(MF_NETGROUP_SIZE_EXCEEDED_1, 1, "Encountered netgroup with > {1} nets")
// nlid_proxy.cpp
PERRMSGV(MI_NO_SPECIFIC_SOLVER, 1, "No specific solver found for netlist of size {1}")
PERRMSGV(MI_NO_POWER_TERMINALS_ON_DEVICE_1, 1, "D/A Proxy: Found no valid combination of power terminals on device {1}")
PERRMSGV(MI_MULTIPLE_POWER_TERMINALS_ON_DEVICE, 5, "D/A Proxy: Found multiple power terminals on device {1}: {2} {3} {4} {5}")
// nld_mm5837.cpp
PERRMSGV(MW_FREQUENCY_OUTSIDE_OF_SPECS_1, 1, "MM5837: Frequency outside of specs: {1}")
// nld_opamps.cpp
PERRMSGV(MF_OPAMP_UNKNOWN_TYPE, 1, "Unknown opamp type: {1}")
PERRMSGV(MW_OPAMP_FAIL_CONVERGENCE, 1, "Opamp <{1}> parameters fail convergence criteria")
// nld_mosfet.cpp
PERRMSGV(MW_MOSFET_THRESHOLD_VOLTAGE, 1, "Mosfet: Threshold voltage not specified for {1}")
}
#endif /* NL_ERRSTR_H_ */

View File

@ -733,7 +733,6 @@ bool setup_t::connect(detail::core_terminal_t &t1_in, detail::core_terminal_t &t
}
else
ret = false;
//netlist().error("Connecting {1} to {2} not supported!\n", t1.name(), t2.name());
return ret;
}
@ -1097,12 +1096,15 @@ void setup_t::prepare_to_run()
auto f = m_params.find(p.first);
if (f == m_params.end())
{
if (plib::endsWith(p.first, pstring(".HINT_NO_DEACTIVATE")))
if (plib::endsWith(p.first, sHINT_NO_DEACTIVATE))
{
// FIXME: get device name, check for device
auto *dev = m_nlstate.find_device(plib::replace_all(p.first, sHINT_NO_DEACTIVATE, ""));
if (dev == nullptr)
log().warning(MW_DEVICE_NOT_FOUND_FOR_HINT(p.first));
}
else
log().warning("Unknown parameter: {}", p.first);
log().warning(MW_UNKNOWN_PARAMETER(p.first));
}
}
@ -1112,7 +1114,7 @@ void setup_t::prepare_to_run()
{
if (use_deactivate)
{
auto p = m_param_values.find(d.second->name() + ".HINT_NO_DEACTIVATE");
auto p = m_param_values.find(d.second->name() + sHINT_NO_DEACTIVATE);
if (p != m_param_values.end())
{
//FIXME: check for errors ...
@ -1134,12 +1136,20 @@ void setup_t::prepare_to_run()
{
if (t->m_N.net().isRailNet() && t->m_P.net().isRailNet())
{
log().info(MI_REMOVE_DEVICE_1_CONNECTED_ONLY_TO_RAILS_2_3(
t->name(), t->m_N.net().name(), t->m_P.net().name()));
// We are not interested in power terminals - This is intended behaviour
if (!plib::endsWith(t->name(), pstring(".") + sPowerDevRes))
log().info(MI_REMOVE_DEVICE_1_CONNECTED_ONLY_TO_RAILS_2_3(
t->name(), t->m_N.net().name(), t->m_P.net().name()));
t->m_N.net().remove_terminal(t->m_N);
t->m_P.net().remove_terminal(t->m_P);
m_nlstate.remove_dev(t);
}
else
{
if (plib::endsWith(t->name(), pstring(".") + sPowerDevRes))
log().info(MI_POWER_TERMINALS_1_CONNECTED_ANALOG_2_3(
t->name(), t->m_N.net().name(), t->m_P.net().name()));
}
}
log().verbose("initialize solver ...\n");

View File

@ -592,7 +592,6 @@ namespace devices
}
if (new_solver_timestep < m_params.m_min_timestep)
{
//log().warning("Dynamic timestep below min timestep. Consider decreasing MIN_TIMESTEP: {1} us", new_solver_timestep*1.0e6);
new_solver_timestep = m_params.m_min_timestep;
}
}

View File

@ -190,11 +190,10 @@ namespace devices
pstring symname = static_compile_name();
m_proc.load(this->state().lib(), symname);
if (m_proc.resolved())
this->log().warning("External static solver {1} found ...", symname);
this->log().info("External static solver {1} found ...", symname);
else
this->log().warning("External static solver {1} not found ...", symname);
}
}
template <typename FT, int SIZE>

View File

@ -215,7 +215,6 @@ namespace devices
if (resched)
{
this->m_iterative_fail++;
//this->netlist().warning("Falling back to direct solver .. Consider increasing RESCHED_LOOPS");
return matrix_solver_direct_t<FT, SIZE>::solve_non_dynamic(newton_raphson);
}

View File

@ -458,12 +458,9 @@ void m62_audio_device::device_add_mconfig(machine_config &config)
NETLIST_STREAM_INPUT(config, "snd_nl:cin4", 4, "R_AY45L_B.R");
NETLIST_STREAM_INPUT(config, "snd_nl:cin5", 5, "R_AY45L_C.R");
NETLIST_STREAM_INPUT(config, "snd_nl:cin6", 6, "I_MSM2K0.IN").set_mult_offset(5.0/65535.0, 2.5);
NETLIST_STREAM_INPUT(config, "snd_nl:cin7", 7, "I_MSM3K0.IN").set_mult_offset(5.0/65535.0, 2.5);
//MCFG_NETLIST_STREAM_OUTPUT("snd_nl", 0, "RV1.1")
//MCFG_NETLIST_ANALOG_MULT_OFFSET(30000.0, -35000.0)
NETLIST_STREAM_OUTPUT(config, "snd_nl:cout0", 0, "R26.1").set_mult_offset(30000.0 * 10.0, 0.0);
}

View File

@ -1735,65 +1735,65 @@ CIRCUIT_LAYOUT( breakout )
#if 1
// 163% -- manually optimized
HINT(B6.s3, NO_DEACTIVATE)
HINT(C4.s3, NO_DEACTIVATE)
HINT(C4.s4, NO_DEACTIVATE)
HINT(C5.s3, NO_DEACTIVATE)
HINT(C5.s4, NO_DEACTIVATE)
HINT(E2.s2, NO_DEACTIVATE)
HINT(E3.s2, NO_DEACTIVATE)
HINT(E5.s4, NO_DEACTIVATE)
HINT(E9.s6, NO_DEACTIVATE)
HINT(H2.s1, NO_DEACTIVATE)
HINT(H3.s1, NO_DEACTIVATE)
HINT(J3.s4, NO_DEACTIVATE)
HINT(B6.C, NO_DEACTIVATE)
HINT(C4.C, NO_DEACTIVATE)
HINT(C4.D, NO_DEACTIVATE)
HINT(C5.C, NO_DEACTIVATE)
HINT(C5.D, NO_DEACTIVATE)
HINT(E2.B, NO_DEACTIVATE)
HINT(E3.B, NO_DEACTIVATE)
HINT(E5.D, NO_DEACTIVATE)
HINT(E9.F, NO_DEACTIVATE)
HINT(H2.A, NO_DEACTIVATE)
HINT(H3.A, NO_DEACTIVATE)
HINT(J3.D, NO_DEACTIVATE)
HINT(J5, NO_DEACTIVATE)
HINT(J6.sub, NO_DEACTIVATE)
HINT(J8.1, NO_DEACTIVATE)
HINT(J8.3, NO_DEACTIVATE)
HINT(K4.s4, NO_DEACTIVATE)
HINT(M3.s2, NO_DEACTIVATE)
HINT(M3.s4, NO_DEACTIVATE)
HINT(M4.s2, NO_DEACTIVATE)
HINT(M6.sub, NO_DEACTIVATE)
HINT(M8.s1, NO_DEACTIVATE)
HINT(N7.s3, NO_DEACTIVATE)
HINT(J6, NO_DEACTIVATE)
HINT(J8.A, NO_DEACTIVATE)
HINT(J8.C, NO_DEACTIVATE)
HINT(K4.D, NO_DEACTIVATE)
HINT(M3.B, NO_DEACTIVATE)
HINT(M3.D, NO_DEACTIVATE)
HINT(M4.B, NO_DEACTIVATE)
HINT(M6, NO_DEACTIVATE)
HINT(M8.A, NO_DEACTIVATE)
HINT(N7.C, NO_DEACTIVATE)
#else
// 167% hints provided by log output - manually optimized
HINT(M4.s2, NO_DEACTIVATE) // 29.001761 197676 6816
HINT(M3.s3, NO_DEACTIVATE) // inf 129571 0
HINT(N7.s3, NO_DEACTIVATE) // inf 7850387 0 xx
HINT(M3.s2, NO_DEACTIVATE) // 23.234535 395870 17038
HINT(M3.s1, NO_DEACTIVATE) // 14.500880 197676 13632
HINT(L7.s3, NO_DEACTIVATE) // 122672.000000 122672 1
HINT(L7.s2, NO_DEACTIVATE) // 122672.000000 122672 1
HINT(K7.s4, NO_DEACTIVATE) // 122673.000000 122673 1
HINT(K7.s3, NO_DEACTIVATE) // 122672.000000 122672 1
HINT(K7.s2, NO_DEACTIVATE) // 122673.000000 122673 1
HINT(K7.s1, NO_DEACTIVATE) // 122673.000000 122673 1
HINT(K4.s4, NO_DEACTIVATE) // 1438.774735 4202661 2921 xx
HINT(K4.s2, NO_DEACTIVATE) // 3.939380 847790 215209 xx
HINT(E2.s2, NO_DEACTIVATE) // 108.050000 315506 2920 xx
HINT(L7.s4, NO_DEACTIVATE) // 122672.000000 122672 1
HINT(E9.s6, NO_DEACTIVATE) // inf 129571 0
//HINT(J2.s6, NO_DEACTIVATE) // 493.408951 959187 1944
HINT(C5.s3, NO_DEACTIVATE) // inf 195514 0
HINT(M3.s4, NO_DEACTIVATE) // 27.744898 418726 15092 xx
HINT(J8.s1, NO_DEACTIVATE) // 40890.000000 122670 3
HINT(E3.s2, NO_DEACTIVATE) // 203581.000000 203581 1
HINT(M9.s4, NO_DEACTIVATE) // inf 323268 0
//HINT(L4.s2, NO_DEACTIVATE) // 7.290053 1192536 163584
HINT(J3.s4, NO_DEACTIVATE) // 393.639951 957726 2433 xx
HINT(L7.s1, NO_DEACTIVATE) // inf 122672 0
HINT(F2.s1, NO_DEACTIVATE) // 286289.000000 286289 1
HINT(M8.s1, NO_DEACTIVATE) // 129571.000000 129571 1
HINT(J7.s2, NO_DEACTIVATE) // inf 122672 0
//HINT(H2.s1, NO_DEACTIVATE) // 393.839704 958212 2433
HINT(H3.s1, NO_DEACTIVATE) // 3.932473 850122 216180 xx
HINT(J2.s5, NO_DEACTIVATE) // 26.140344 203581 7788
HINT(J7.s1, NO_DEACTIVATE) // inf 122672 0
HINT(J8.s3, NO_DEACTIVATE) // 40890.000000 122670 3
HINT(M4.B, NO_DEACTIVATE) // 29.001761 197676 6816
HINT(M3.C, NO_DEACTIVATE) // inf 129571 0
HINT(N7.C, NO_DEACTIVATE) // inf 7850387 0 xx
HINT(M3.B, NO_DEACTIVATE) // 23.234535 395870 17038
HINT(M3.A, NO_DEACTIVATE) // 14.500880 197676 13632
HINT(L7.C, NO_DEACTIVATE) // 122672.000000 122672 1
HINT(L7.B, NO_DEACTIVATE) // 122672.000000 122672 1
HINT(K7.D, NO_DEACTIVATE) // 122673.000000 122673 1
HINT(K7.C, NO_DEACTIVATE) // 122672.000000 122672 1
HINT(K7.B, NO_DEACTIVATE) // 122673.000000 122673 1
HINT(K7.A, NO_DEACTIVATE) // 122673.000000 122673 1
HINT(K4.D, NO_DEACTIVATE) // 1438.774735 4202661 2921 xx
HINT(K4.B, NO_DEACTIVATE) // 3.939380 847790 215209 xx
HINT(E2.B, NO_DEACTIVATE) // 108.050000 315506 2920 xx
HINT(L7.D, NO_DEACTIVATE) // 122672.000000 122672 1
HINT(E9.F, NO_DEACTIVATE) // inf 129571 0
//HINT(J2.F, NO_DEACTIVATE) // 493.408951 959187 1944
HINT(C5.C, NO_DEACTIVATE) // inf 195514 0
HINT(M3.D, NO_DEACTIVATE) // 27.744898 418726 15092 xx
HINT(J8.A, NO_DEACTIVATE) // 40890.000000 122670 3
HINT(E3.B, NO_DEACTIVATE) // 203581.000000 203581 1
HINT(M9.D, NO_DEACTIVATE) // inf 323268 0
//HINT(L4.B, NO_DEACTIVATE) // 7.290053 1192536 163584
HINT(J3.D, NO_DEACTIVATE) // 393.639951 957726 2433 xx
HINT(L7.A, NO_DEACTIVATE) // inf 122672 0
HINT(F2.A, NO_DEACTIVATE) // 286289.000000 286289 1
HINT(M8.A, NO_DEACTIVATE) // 129571.000000 129571 1
HINT(J7.B, NO_DEACTIVATE) // inf 122672 0
//HINT(H2.A, NO_DEACTIVATE) // 393.839704 958212 2433
HINT(H3.A, NO_DEACTIVATE) // 3.932473 850122 216180 xx
HINT(J2.E, NO_DEACTIVATE) // 26.140344 203581 7788
HINT(J7.A, NO_DEACTIVATE) // inf 122672 0
HINT(J8.C, NO_DEACTIVATE) // 40890.000000 122670 3
#endif
CIRCUIT_LAYOUT_END

View File

@ -575,32 +575,31 @@ NETLIST_START(pong_fast)
HINT(clk, NO_DEACTIVATE)
HINT(ic_e1d, NO_DEACTIVATE)
HINT(ic_e1c, NO_DEACTIVATE)
HINT(ic_f1.A, NO_DEACTIVATE)
HINT(ic_f1.D, NO_DEACTIVATE)
HINT(ic_f1, NO_DEACTIVATE)
HINT(ic_g1d, NO_DEACTIVATE)
HINT(ic_h1a, NO_DEACTIVATE)
HINT(ic_h1d, NO_DEACTIVATE)
HINT(ic_h3b.sub, NO_DEACTIVATE)
HINT(ic_g6b.sub, NO_DEACTIVATE)
HINT(ic_c2a.sub, NO_DEACTIVATE)
HINT(ic_h3b, NO_DEACTIVATE)
HINT(ic_g6b, NO_DEACTIVATE)
HINT(ic_c2a, NO_DEACTIVATE)
HINT(hit_sound, NO_DEACTIVATE)
HINT(topbothitsound, NO_DEACTIVATE)
HINT(ic_c9b, NO_DEACTIVATE)
HINT(ic_b8.D, NO_DEACTIVATE)
HINT(ic_b8, NO_DEACTIVATE)
HINT(ic_b7a, NO_DEACTIVATE)
HINT(ic_a7b, NO_DEACTIVATE)
HINT(ic_c9a, NO_DEACTIVATE)
HINT(ic_a8.D, NO_DEACTIVATE)
HINT(ic_a8, NO_DEACTIVATE)
HINT(ic_b7d, NO_DEACTIVATE)
HINT(ic_a7a, NO_DEACTIVATE)
HINT(ic_g1a, NO_DEACTIVATE)
HINT(ic_c8a.sub, NO_DEACTIVATE)
HINT(ic_c8b.sub, NO_DEACTIVATE)
HINT(ic_c8a, NO_DEACTIVATE)
HINT(ic_c8b, NO_DEACTIVATE)
HINT(ic_d8b, NO_DEACTIVATE)
HINT(ic_d6a.sub, NO_DEACTIVATE)
HINT(ic_d6b.sub, NO_DEACTIVATE)
HINT(ic_c6a.sub, NO_DEACTIVATE)
HINT(ic_c6b.sub, NO_DEACTIVATE)
HINT(ic_d6a, NO_DEACTIVATE)
HINT(ic_d6b, NO_DEACTIVATE)
HINT(ic_c6a, NO_DEACTIVATE)
HINT(ic_c6b, NO_DEACTIVATE)
HINT(ic_e5b, NO_DEACTIVATE)
HINT(ic_e4c, NO_DEACTIVATE)
HINT(ic_d4b, NO_DEACTIVATE)

View File

@ -78,7 +78,7 @@ NETLIST_START(rebound_schematics)
PARAM(Solver.PARALLEL, 0) // Don't do parallel solvers
PARAM(Solver.ACCURACY, 1e-9)
PARAM(NETLIST.USE_DEACTIVATE, 1)
HINT(F9.s2, NO_DEACTIVATE)
HINT(F9.B, NO_DEACTIVATE)
ANALOG_INPUT(V5, 5)