From 7dfd781e222dd0c686aaf46443411d72e1146875 Mon Sep 17 00:00:00 2001 From: couriersud Date: Sun, 21 Apr 2019 18:27:42 +0200 Subject: netlist: Add more validations and fix issues identified. --- src/devices/machine/netlist.cpp | 114 ++++++++++++++++--- src/devices/machine/netlist.h | 13 +++ src/lib/netlist/analog/nld_mosfet.cpp | 2 +- src/lib/netlist/analog/nld_opamps.cpp | 4 +- src/lib/netlist/devices/nlid_system.h | 2 +- src/lib/netlist/nl_base.h | 14 ++- src/lib/netlist/nl_errstr.h | 163 +++++++++++++++------------ src/lib/netlist/nl_setup.cpp | 22 +++- src/lib/netlist/solver/nld_matrix_solver.cpp | 1 - src/lib/netlist/solver/nld_ms_gcr.h | 3 +- src/lib/netlist/solver/nld_ms_sor_mat.h | 1 - src/mame/audio/irem.cpp | 3 - src/mame/machine/nl_breakout.cpp | 110 +++++++++--------- src/mame/machine/nl_pong.cpp | 25 ++-- src/mame/machine/nl_rebound.cpp | 2 +- 15 files changed, 303 insertions(+), 176 deletions(-) diff --git a/src/devices/machine/netlist.cpp b/src/devices/machine/netlist.cpp index a5ea1febc75..6abd1bb7195 100644 --- a/src/devices/machine/netlist.cpp +++ b/src/devices/machine/netlist.cpp @@ -21,6 +21,7 @@ #include "debugger.h" #include "romload.h" +#include "emuopts.h" #include #include @@ -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(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(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(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(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_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::netlist_t lnetlist("netlist", plib::make_unique()); + auto lnetlist = plib::make_unique("netlist", plib::make_unique()); // 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(&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(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(*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 outdevs = lnetlist->nlstate().get_device_list(); + 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 indevs = lnetlist->nlstate().get_device_list(); + 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("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) { diff --git a/src/devices/machine/netlist.h b/src/devices/machine/netlist.h index ef9faa8b87f..7302780572d 100644 --- a/src/devices/machine/netlist.h +++ b/src/devices/machine/netlist.h @@ -146,6 +146,8 @@ protected: netlist::netlist_time m_div; + plib::unique_ptr 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; diff --git a/src/lib/netlist/analog/nld_mosfet.cpp b/src/lib/netlist/analog/nld_mosfet.cpp index 35cbb066baa..c66cec291f6 100644 --- a/src/lib/netlist/analog/nld_mosfet.cpp +++ b/src/lib/netlist/analog/nld_mosfet.cpp @@ -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. diff --git a/src/lib/netlist/analog/nld_opamps.cpp b/src/lib/netlist/analog/nld_opamps.cpp index 83666ea6abe..24f239e9455 100644 --- a/src/lib/netlist/analog/nld_opamps.cpp +++ b/src/lib/netlist/analog/nld_opamps.cpp @@ -116,7 +116,7 @@ namespace netlist { m_type = static_cast(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); diff --git a/src/lib/netlist/devices/nlid_system.h b/src/lib/netlist/devices/nlid_system.h index b0769e95dd2..2bd500893ef 100644 --- a/src/lib/netlist/devices/nlid_system.h +++ b/src/lib/netlist/devices/nlid_system.h @@ -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"); } diff --git a/src/lib/netlist/nl_base.h b/src/lib/netlist/nl_base.h index 8e6e961d9ba..57cd20732da 100644 --- a/src/lib/netlist/nl_base.h +++ b/src/lib/netlist/nl_base.h @@ -1342,6 +1342,8 @@ namespace netlist return dynamic_cast(p) != nullptr; } + core_device_t *get_single_device(const pstring &classname, bool (*cc)(core_device_t *)) const; + template C *get_single_device(const pstring &classname) const { @@ -1374,8 +1376,6 @@ namespace netlist this->run_state_manager().save_state_ptr(static_cast(&owner), module + pstring(".") + stname, plib::state_manager_t::dtype(), 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 void add_dev(const pstring &name, pool_owned_ptr &&dev) { @@ -1601,7 +1609,7 @@ namespace netlist if (f != nullptr) f->read(reinterpret_cast(&m_data[0]),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_ */ diff --git a/src/lib/netlist/nl_setup.cpp b/src/lib/netlist/nl_setup.cpp index ede026a593d..6a5cf841a22 100644 --- a/src/lib/netlist/nl_setup.cpp +++ b/src/lib/netlist/nl_setup.cpp @@ -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"); diff --git a/src/lib/netlist/solver/nld_matrix_solver.cpp b/src/lib/netlist/solver/nld_matrix_solver.cpp index 9f29d1152c7..a8474c341cf 100644 --- a/src/lib/netlist/solver/nld_matrix_solver.cpp +++ b/src/lib/netlist/solver/nld_matrix_solver.cpp @@ -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; } } diff --git a/src/lib/netlist/solver/nld_ms_gcr.h b/src/lib/netlist/solver/nld_ms_gcr.h index f3e56a342d6..85e6c861238 100644 --- a/src/lib/netlist/solver/nld_ms_gcr.h +++ b/src/lib/netlist/solver/nld_ms_gcr.h @@ -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 diff --git a/src/lib/netlist/solver/nld_ms_sor_mat.h b/src/lib/netlist/solver/nld_ms_sor_mat.h index 83e4870cf28..cdcd2e48847 100644 --- a/src/lib/netlist/solver/nld_ms_sor_mat.h +++ b/src/lib/netlist/solver/nld_ms_sor_mat.h @@ -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::solve_non_dynamic(newton_raphson); } diff --git a/src/mame/audio/irem.cpp b/src/mame/audio/irem.cpp index 148ad62a283..8384d466459 100644 --- a/src/mame/audio/irem.cpp +++ b/src/mame/audio/irem.cpp @@ -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); } diff --git a/src/mame/machine/nl_breakout.cpp b/src/mame/machine/nl_breakout.cpp index 1b3d854d34a..52409161d41 100644 --- a/src/mame/machine/nl_breakout.cpp +++ b/src/mame/machine/nl_breakout.cpp @@ -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 diff --git a/src/mame/machine/nl_pong.cpp b/src/mame/machine/nl_pong.cpp index 8911e6d7c30..746f7e7e8c3 100644 --- a/src/mame/machine/nl_pong.cpp +++ b/src/mame/machine/nl_pong.cpp @@ -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) diff --git a/src/mame/machine/nl_rebound.cpp b/src/mame/machine/nl_rebound.cpp index 207cab04c85..e782dd54a0c 100644 --- a/src/mame/machine/nl_rebound.cpp +++ b/src/mame/machine/nl_rebound.cpp @@ -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) -- cgit v1.2.3