diff options
author | couriersud <couriersud@gmx.org> | 2019-04-18 01:17:53 +0200 |
---|---|---|
committer | couriersud <couriersud@gmx.org> | 2019-04-18 01:18:01 +0200 |
commit | 6392b345e62699d9c0d09fb12dd2ed664eb9e361 (patch) | |
tree | d7b641e1c73c53da3420bf2714c15c91fe82aaba | |
parent | e6261f9e397cf300fe617a0ca8cfe40e71a35868 (diff) |
netlist: scalable error messages.
This approach uses functors for logging messages.
-rw-r--r-- | src/lib/netlist/analog/nld_opamps.cpp | 2 | ||||
-rw-r--r-- | src/lib/netlist/devices/nld_mm5837.cpp | 4 | ||||
-rw-r--r-- | src/lib/netlist/devices/nlid_proxy.cpp | 2 | ||||
-rw-r--r-- | src/lib/netlist/nl_base.cpp | 16 | ||||
-rw-r--r-- | src/lib/netlist/nl_base.h | 4 | ||||
-rw-r--r-- | src/lib/netlist/nl_errstr.h | 146 | ||||
-rw-r--r-- | src/lib/netlist/nl_factory.cpp | 4 | ||||
-rw-r--r-- | src/lib/netlist/nl_parser.cpp | 4 | ||||
-rw-r--r-- | src/lib/netlist/nl_setup.cpp | 103 | ||||
-rw-r--r-- | src/lib/netlist/plib/pfmtlog.h | 6 | ||||
-rw-r--r-- | src/lib/netlist/solver/nld_matrix_solver.cpp | 7 | ||||
-rw-r--r-- | src/lib/netlist/solver/nld_solver.cpp | 6 |
12 files changed, 161 insertions, 143 deletions
diff --git a/src/lib/netlist/analog/nld_opamps.cpp b/src/lib/netlist/analog/nld_opamps.cpp index 6fe4657a628..a9d9b390eea 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<int>(m_model.m_TYPE); if (m_type < 1 || m_type > 3) - log().fatal(MF_1_UNKNOWN_OPAMP_TYPE, m_type); + log().fatal(MF_UNKNOWN_OPAMP_TYPE(m_type)); if (m_type == 1) { diff --git a/src/lib/netlist/devices/nld_mm5837.cpp b/src/lib/netlist/devices/nld_mm5837.cpp index f6c2566bd43..a8add5aaeea 100644 --- a/src/lib/netlist/devices/nld_mm5837.cpp +++ b/src/lib/netlist/devices/nld_mm5837.cpp @@ -72,7 +72,7 @@ namespace netlist m_RV.set_G_V_I(plib::constants<nl_double>::one() / R_LOW, 0.0, 0.0); m_inc = netlist_time::from_double(1.0 / m_FREQ()); if (m_FREQ() < 24000 || m_FREQ() > 56000) - log().warning(MW_1_FREQUENCY_OUTSIDE_OF_SPECS_1, m_FREQ()); + log().warning(MW_FREQUENCY_OUTSIDE_OF_SPECS_1(m_FREQ())); m_shift = 0x1ffff; m_is_timestep = m_RV.m_P.net().solver()->has_timestep_devices(); @@ -82,7 +82,7 @@ namespace netlist { m_inc = netlist_time::from_double(1.0 / m_FREQ()); if (m_FREQ() < 24000 || m_FREQ() > 56000) - log().warning(MW_1_FREQUENCY_OUTSIDE_OF_SPECS_1, m_FREQ()); + log().warning(MW_FREQUENCY_OUTSIDE_OF_SPECS_1(m_FREQ())); } NETLIB_UPDATE(MM5837_dip) diff --git a/src/lib/netlist/devices/nlid_proxy.cpp b/src/lib/netlist/devices/nlid_proxy.cpp index c2eba21f648..55970d86c7d 100644 --- a/src/lib/netlist/devices/nlid_proxy.cpp +++ b/src/lib/netlist/devices/nlid_proxy.cpp @@ -106,7 +106,7 @@ namespace netlist } //FIXME: Use power terminals and change info to warning or error if (!f) - log().info(MI_1_NO_POWER_TERMINALS_ON_DEVICE_1, out_proxied->device().name()); + log().info(MI_NO_POWER_TERMINALS_ON_DEVICE_1(out_proxied->device().name())); else log().verbose("D/A Proxy: Found power terminals on device {1}", out_proxied->device().name()); } diff --git a/src/lib/netlist/nl_base.cpp b/src/lib/netlist/nl_base.cpp index 5e5399c9d3a..87174f2fff7 100644 --- a/src/lib/netlist/nl_base.cpp +++ b/src/lib/netlist/nl_base.cpp @@ -227,7 +227,7 @@ detail::terminal_type detail::core_terminal_t::type() const return terminal_type::OUTPUT; else { - state().log().fatal(MF_1_UNKNOWN_TYPE_FOR_OBJECT, name()); + state().log().fatal(MF_UNKNOWN_TYPE_FOR_OBJECT(name())); return terminal_type::TERMINAL; // please compiler } } @@ -543,7 +543,7 @@ core_device_t *netlist_state_t::get_single_device(const pstring &classname, bool if (cc(d.second.get())) { if (ret != nullptr) - m_log.fatal(MF_1_MORE_THAN_ONE_1_DEVICE_FOUND, classname); + m_log.fatal(MF_MORE_THAN_ONE_1_DEVICE_FOUND(classname)); else ret = d.second.get(); } @@ -648,7 +648,7 @@ void device_t::connect(const pstring &t1, const pstring &t2) void device_t::connect_post_start(detail::core_terminal_t &t1, detail::core_terminal_t &t2) { if (!setup().connect(t1, t2)) - log().fatal(MF_2_ERROR_CONNECTING_1_TO_2, t1.name(), t2.name()); + log().fatal(MF_ERROR_CONNECTING_1_TO_2(t1.name(), t2.name())); } @@ -769,8 +769,7 @@ void detail::net_t::add_terminal(detail::core_terminal_t &terminal) { for (auto &t : m_core_terms) if (t == &terminal) - state().log().fatal(MF_2_NET_1_DUPLICATE_TERMINAL_2, name(), - t->name()); + state().log().fatal(MF_NET_1_DUPLICATE_TERMINAL_2(name(), t->name())); terminal.set_net(this); @@ -785,8 +784,7 @@ void detail::net_t::remove_terminal(detail::core_terminal_t &terminal) plib::container::remove(m_core_terms, &terminal); } else - state().log().fatal(MF_2_REMOVE_TERMINAL_1_FROM_NET_2, terminal.name(), - this->name()); + state().log().fatal(MF_REMOVE_TERMINAL_1_FROM_NET_2(terminal.name(), this->name())); } void detail::net_t::move_connections(detail::net_t &dest_net) @@ -970,7 +968,7 @@ param_t::param_type_t param_t::param_type() const return POINTER; else { - state().log().fatal(MF_1_UNKNOWN_PARAM_TYPE, name()); + state().log().fatal(MF_UNKNOWN_PARAM_TYPE(name())); return POINTER; /* Please compiler */ } } @@ -1012,7 +1010,7 @@ param_ptr_t::param_ptr_t(device_t &device, const pstring &name, uint8_t * val) void param_model_t::changed() { - state().log().fatal(MF_1_MODEL_1_CAN_NOT_BE_CHANGED_AT_RUNTIME, name()); + state().log().fatal(MF_MODEL_1_CAN_NOT_BE_CHANGED_AT_RUNTIME(name())); } const pstring param_model_t::value_str(const pstring &entity) diff --git a/src/lib/netlist/nl_base.h b/src/lib/netlist/nl_base.h index 6ef91a7fde2..4e9f7bc40ee 100644 --- a/src/lib/netlist/nl_base.h +++ b/src/lib/netlist/nl_base.h @@ -1379,7 +1379,7 @@ namespace netlist if (d.first == name) { dev.release(); - log().fatal(MF_1_DUPLICATE_NAME_DEVICE_LIST, name); + log().fatal(MF_DUPLICATE_NAME_DEVICE_LIST(name)); } //m_devices.push_back(std::move(dev)); m_devices.insert(m_devices.end(), { name, std::move(dev) }); @@ -1561,7 +1561,7 @@ namespace netlist bool err = false; auto vald = plib::pstonum_ne<T>(p, err); if (err) - device.state().log().fatal(MF_2_INVALID_NUMBER_CONVERSION_1_2, name, p); + device.state().log().fatal(MF_INVALID_NUMBER_CONVERSION_1_2(name, p)); m_param = vald; } else diff --git a/src/lib/netlist/nl_errstr.h b/src/lib/netlist/nl_errstr.h index 175bbb4962e..275adcad2c3 100644 --- a/src/lib/netlist/nl_errstr.h +++ b/src/lib/netlist/nl_errstr.h @@ -6,101 +6,121 @@ * */ -#ifndef NLERRSTR_H_ -#define NLERRSTR_H_ +#ifndef NL_ERRSTR_H_ +#define NL_ERRSTR_H_ + +#include "plib/pfmtlog.h" + +#define PERRMSG(name, str) \ + struct name \ + { \ + operator pstring() const { return str; } \ + }; + +#define PERRMSGV(name, narg, str) \ + struct name \ + { \ + template<typename... Args> name(Args&&... args) \ + : m_m(plib::pfmt(str)(std::forward<Args>(args)...)) \ + { static_assert(narg == sizeof...(args), "Argument count mismatch"); } \ + operator pstring() const { return m_m; } \ + pstring m_m; \ + }; // nl_base.cpp -#define MF_1_DUPLICATE_NAME_DEVICE_LIST "Error adding {1} to device list. Duplicate name." -#define MF_1_UNKNOWN_TYPE_FOR_OBJECT "Unknown type for object {1} " -#define MF_2_NET_1_DUPLICATE_TERMINAL_2 "net {1}: duplicate terminal {2}" -#define MF_2_REMOVE_TERMINAL_1_FROM_NET_2 "Can not remove terminal {1} from net {2}." -#define MF_1_UNKNOWN_PARAM_TYPE "Can not determine param_type for {1}" -#define MF_2_ERROR_CONNECTING_1_TO_2 "Error connecting {1} to {2}" -#define MF_0_NO_SOLVER "No solver found for this netlist although analog elements are present" -#define MF_1_HND_VAL_NOT_SUPPORTED "HINT_NO_DEACTIVATE value not supported: <{1}>" +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}>") // nl_factory.cpp -#define MF_1_FACTORY_ALREADY_CONTAINS_1 "factory already contains {1}" -#define MF_1_CLASS_1_NOT_FOUND "Class <{1}> not found!" +PERRMSGV(MF_FACTORY_ALREADY_CONTAINS_1, 1, "factory already contains {1}") +PERRMSGV(MF_CLASS_1_NOT_FOUND, 1, "Class <{1}> not found!") // nld_opamps.cpp -#define MF_1_UNKNOWN_OPAMP_TYPE "Unknown opamp type: {1}" +PERRMSGV(MF_UNKNOWN_OPAMP_TYPE, 1, "Unknown opamp type: {1}") // nld_matrix_solver.cpp -#define MF_1_UNHANDLED_ELEMENT_1_FOUND "setup_base:unhandled element <{1}> found" -#define MF_1_FOUND_TERM_WITH_MISSING_OTHERNET "found term with missing othernet {1}" +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}") -#define MW_1_NEWTON_LOOPS_EXCEEDED_ON_NET_1 "NEWTON_LOOPS exceeded on net {1}... reschedule" +PERRMSGV(MW_NEWTON_LOOPS_EXCEEDED_ON_NET_1, 1, "NEWTON_LOOPS exceeded on net {1}... reschedule") // nld_solver.cpp -#define MF_1_UNKNOWN_SOLVER_TYPE "Unknown solver type: {1}" -#define MF_1_NETGROUP_SIZE_EXCEEDED_1 "Encountered netgroup with > {1} nets" +PERRMSGV(MF_UNKNOWN_SOLVER_TYPE, 1, "Unknown solver type: {1}") +PERRMSGV(MF_NETGROUP_SIZE_EXCEEDED_1, 1, "Encountered netgroup with > {1} nets") -#define MI_1_NO_SPECIFIC_SOLVER "No specific solver found for netlist of size {1}" +PERRMSGV(MI_NO_SPECIFIC_SOLVER, 1, "No specific solver found for netlist of size {1}") // nl_base.cpp -#define MF_1_MODEL_1_CAN_NOT_BE_CHANGED_AT_RUNTIME "Model {1} can not be changed at runtime" -#define MF_1_MORE_THAN_ONE_1_DEVICE_FOUND "more than one {1} device found" +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") // nl_parser.cpp -#define MF_0_UNEXPECTED_NETLIST_END "Unexpected NETLIST_END" -#define MF_0_UNEXPECTED_NETLIST_START "Unexpected NETLIST_START" +PERRMSGV(MF_UNEXPECTED_NETLIST_END, 0, "Unexpected NETLIST_END") +PERRMSGV(MF_UNEXPECTED_NETLIST_START, 0, "Unexpected NETLIST_START") // nl_setup.cpp -//#define MF_1_CLASS_1_NOT_FOUND "Class {1} not found!" -#define MF_1_UNABLE_TO_PARSE_MODEL_1 "Unable to parse model: {1}" -#define MF_1_MODEL_ALREADY_EXISTS_1 "Model already exists: {1}" -#define MF_1_DEVICE_ALREADY_EXISTS_1 "Device already exists: {1}" -#define MF_1_ADDING_ALI1_TO_ALIAS_LIST "Error adding alias {1} to alias list" -#define MF_1_DIP_PINS_MUST_BE_AN_EQUAL_NUMBER_OF_PINS_1 "You must pass an equal number of pins to DIPPINS {1}" -#define MF_1_UNKNOWN_OBJECT_TYPE_1 "Unknown object type {1}" -#define MF_2_INVALID_NUMBER_CONVERSION_1_2 "Invalid number conversion {1} : {2}" -#define MF_1_ADDING_PARAMETER_1_TO_PARAMETER_LIST "Error adding parameter {1} to parameter list" -#define MF_2_ADDING_1_2_TO_TERMINAL_LIST "Error adding {1} {2} to terminal list" -#define MF_2_NET_C_NEEDS_AT_LEAST_2_TERMINAL "You must pass at least 2 terminals to NET_C" -#define MF_1_FOUND_NO_OCCURRENCE_OF_1 "Found no occurrence of {1}" -#define MF_2_TERMINAL_1_2_NOT_FOUND "Alias {1} was resolved to be terminal {2}. Terminal {2} was not found." -#define MF_2_OBJECT_1_2_WRONG_TYPE "object {1}({2}) found but wrong type" -#define MF_2_PARAMETER_1_2_NOT_FOUND "parameter {1}({2}) not found!" -#define MF_2_CONNECTING_1_TO_2 "Error connecting {1} to {2}" -#define MF_2_MERGE_RAIL_NETS_1_AND_2 "Trying to merge two rail nets: {1} and {2}" -#define MF_1_OBJECT_INPUT_TYPE_1 "Unable to determine input type of {1}" -#define MF_1_OBJECT_OUTPUT_TYPE_1 "Unable to determine output type of {1}" -#define MF_1_INPUT_1_ALREADY_CONNECTED "Input {1} already connected" -#define MF_0_LINK_TRIES_EXCEEDED "Error connecting -- bailing out" -#define MF_1_MODEL_NOT_FOUND "Model {1} not found" -#define MF_1_MODEL_ERROR_1 "Model error {1}" -#define MF_1_MODEL_ERROR_ON_PAIR_1 "Model error on pair {1}" -#define MF_2_MODEL_PARAMETERS_NOT_UPPERCASE_1_2 "model parameters should be uppercase:{1} {2}" -#define MF_2_ENTITY_1_NOT_FOUND_IN_MODEL_2 "Entity {1} not found in model {2}" -#define MF_1_UNKNOWN_NUMBER_FACTOR_IN_1 "Unknown number factor in: {1}" -#define MF_1_NOT_FOUND_IN_SOURCE_COLLECTION "unable to find {1} in sources collection" - -#define MW_3_OVERWRITING_PARAM_1_OLD_2_NEW_3 "Overwriting {1} old <{2}> new <{3}>" -#define MW_1_CONNECTING_1_TO_ITSELF "Connecting {1} to itself. This may be right, though" -#define MI_1_DUMMY_1_WITHOUT_CONNECTIONS "Found dummy terminal {1} without connections" -#define MI_1_ANALOG_OUTPUT_1_WITHOUT_CONNECTIONS "Found analog output {1} without connections" -#define MI_1_LOGIC_OUTPUT_1_WITHOUT_CONNECTIONS "Found logic output {1} without connections" -#define MW_1_LOGIC_INPUT_1_WITHOUT_CONNECTIONS "Found logic input {1} without connections" -#define MW_1_TERMINAL_1_WITHOUT_CONNECTIONS "Found terminal {1} without connections" -#define MI_3_REMOVE_DEVICE_1_CONNECTED_ONLY_TO_RAILS_2_3 "Found device {1} connected only to railterminals {2}/{3}. Will be removed" -#define MW_1_DATA_1_NOT_FOUND "unable to find data {1} in sources collection" +//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") + +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_REMOVE_DEVICE_1_CONNECTED_ONLY_TO_RAILS_2_3, 3, "Found device {1} connected only to railterminals {2}/{3}. Will be removed") + +PERRMSGV(MW_DATA_1_NOT_FOUND, 1, "unable to find data {1} in sources collection") // nld_mm5837.cpp -#define MW_1_FREQUENCY_OUTSIDE_OF_SPECS_1 "MM5837: Frequency outside of specs: {1}" +PERRMSGV(MW_FREQUENCY_OUTSIDE_OF_SPECS_1, 1, "MM5837: Frequency outside of specs: {1}") // nlid_proxy.cpp -#define MI_1_NO_POWER_TERMINALS_ON_DEVICE_1 "D/A Proxy: Found no valid combination of power terminals on device {1}" +PERRMSGV(MI_NO_POWER_TERMINALS_ON_DEVICE_1, 1, "D/A Proxy: Found no valid combination of power terminals on device {1}") #endif /* NL_ERRSTR_H_ */ diff --git a/src/lib/netlist/nl_factory.cpp b/src/lib/netlist/nl_factory.cpp index 1f0ac35c6c4..f8fc40d27db 100644 --- a/src/lib/netlist/nl_factory.cpp +++ b/src/lib/netlist/nl_factory.cpp @@ -56,7 +56,7 @@ namespace netlist { namespace factory { for (auto & e : *this) if (e->name() == factory->name()) - m_log.fatal(MF_1_FACTORY_ALREADY_CONTAINS_1, factory->name()); + m_log.fatal(MF_FACTORY_ALREADY_CONTAINS_1(factory->name())); push_back(std::move(factory)); } @@ -68,7 +68,7 @@ namespace netlist { namespace factory return e.get(); } - m_log.fatal(MF_1_CLASS_1_NOT_FOUND, devname); + m_log.fatal(MF_CLASS_1_NOT_FOUND(devname)); return nullptr; // appease code analysis } diff --git a/src/lib/netlist/nl_parser.cpp b/src/lib/netlist/nl_parser.cpp index cecfbe862bf..d23ae4b7439 100644 --- a/src/lib/netlist/nl_parser.cpp +++ b/src/lib/netlist/nl_parser.cpp @@ -68,7 +68,7 @@ bool parser_t::parse(const pstring &nlname) { require_token(m_tok_param_left); if (!in_nl) - error (MF_0_UNEXPECTED_NETLIST_END); + error (MF_UNEXPECTED_NETLIST_END()); else { in_nl = false; @@ -78,7 +78,7 @@ bool parser_t::parse(const pstring &nlname) else if (token.is(m_tok_NETLIST_START)) { if (in_nl) - error (MF_0_UNEXPECTED_NETLIST_START); + error (MF_UNEXPECTED_NETLIST_START()); require_token(m_tok_param_left); token_t name = get_token(); require_token(m_tok_param_right); diff --git a/src/lib/netlist/nl_setup.cpp b/src/lib/netlist/nl_setup.cpp index d651ae1b9f8..70cd3158dc7 100644 --- a/src/lib/netlist/nl_setup.cpp +++ b/src/lib/netlist/nl_setup.cpp @@ -43,8 +43,7 @@ namespace netlist { std::vector<pstring> list(plib::psplit(terms,", ")); if (list.size() == 0 || (list.size() % 2) == 1) - log().fatal(MF_1_DIP_PINS_MUST_BE_AN_EQUAL_NUMBER_OF_PINS_1, - build_fqn("")); + log().fatal(MF_DIP_PINS_MUST_BE_AN_EQUAL_NUMBER_OF_PINS_1(build_fqn(""))); std::size_t n = list.size(); for (std::size_t i = 0; i < n / 2; i++) { @@ -57,14 +56,14 @@ namespace netlist { auto f = m_factory.factory_by_name(classname); if (f == nullptr) - log().fatal(MF_1_CLASS_1_NOT_FOUND, classname); + log().fatal(MF_CLASS_1_NOT_FOUND(classname)); else { /* make sure we parse macro library entries */ f->macro_actions(*this, name); pstring key = build_fqn(name); if (device_exists(key)) - log().fatal(MF_1_DEVICE_ALREADY_EXISTS_1, name); + log().fatal(MF_DEVICE_ALREADY_EXISTS_1(name)); else m_device_factory.insert(m_device_factory.end(), {key, f}); } @@ -79,7 +78,7 @@ namespace netlist { std::vector<pstring> list(plib::psplit(terms,", ")); if (list.size() < 2) - log().fatal(MF_2_NET_C_NEEDS_AT_LEAST_2_TERMINAL); + log().fatal(MF_NET_C_NEEDS_AT_LEAST_2_TERMINAL()); for (std::size_t i = 1; i < list.size(); i++) { register_link(list[0], list[i]); @@ -93,7 +92,7 @@ namespace netlist if (source->parse(*this, netlist_name)) return; } - log().fatal(MF_1_NOT_FOUND_IN_SOURCE_COLLECTION, netlist_name); + log().fatal(MF_NOT_FOUND_IN_SOURCE_COLLECTION(netlist_name)); } @@ -127,13 +126,12 @@ namespace netlist if (idx == m_param_values.end()) { if (!m_param_values.insert({fqn, value}).second) - log().fatal(MF_1_ADDING_PARAMETER_1_TO_PARAMETER_LIST, - param); + log().fatal(MF_ADDING_PARAMETER_1_TO_PARAMETER_LIST(param)); } else { - log().warning(MW_3_OVERWRITING_PARAM_1_OLD_2_NEW_3, fqn, idx->second, - value); + log().warning(MW_OVERWRITING_PARAM_1_OLD_2_NEW_3(fqn, idx->second, + value)); m_param_values[fqn] = value; } } @@ -168,7 +166,7 @@ namespace netlist } } if (!found) - log().fatal(MF_1_FOUND_NO_OCCURRENCE_OF_1, attach); + log().fatal(MF_FOUND_NO_OCCURRENCE_OF_1(attach)); register_link(attach, frontier_name + ".Q"); } @@ -190,7 +188,7 @@ namespace netlist void nlparse_t::register_alias_nofqn(const pstring &alias, const pstring &out) { if (!m_alias.insert({alias, out}).second) - log().fatal(MF_1_ADDING_ALI1_TO_ALIAS_LIST, alias); + log().fatal(MF_ADDING_ALI1_TO_ALIAS_LIST(alias)); } void nlparse_t::register_link_fqn(const pstring &sin, const pstring &sout) @@ -256,7 +254,7 @@ pstring setup_t::termtype_as_str(detail::core_terminal_t &in) const case detail::terminal_type::OUTPUT: return pstring("OUTPUT"); } - log().fatal(MF_1_UNKNOWN_OBJECT_TYPE_1, static_cast<unsigned>(in.type())); + log().fatal(MF_UNKNOWN_OBJECT_TYPE_1(static_cast<unsigned>(in.type()))); return pstring("Error"); } @@ -273,8 +271,7 @@ void setup_t::register_term(detail::core_terminal_t &term) { if (!m_terminals.insert({term.name(), &term}).second) { - log().fatal(MF_2_ADDING_1_2_TO_TERMINAL_LIST, termtype_as_str(term), - term.name()); + log().fatal(MF_ADDING_1_2_TO_TERMINAL_LIST(termtype_as_str(term), term.name())); } log().debug("{1} {2}\n", termtype_as_str(term), term.name()); } @@ -296,7 +293,7 @@ void setup_t::remove_connections(const pstring &pin) link++; } if (!found) - log().fatal(MF_1_FOUND_NO_OCCURRENCE_OF_1, pin); + log().fatal(MF_FOUND_NO_OCCURRENCE_OF_1(pin)); } @@ -304,7 +301,7 @@ void setup_t::remove_connections(const pstring &pin) void setup_t::register_param_t(const pstring &name, param_t ¶m) { if (!m_params.insert({param.name(), param_ref_t(param.name(), param.device(), param)}).second) - log().fatal(MF_1_ADDING_PARAMETER_1_TO_PARAMETER_LIST, name); + log().fatal(MF_ADDING_PARAMETER_1_TO_PARAMETER_LIST(name)); } @@ -375,7 +372,7 @@ detail::core_terminal_t *setup_t::find_terminal(const pstring &terminal_in, bool detail::core_terminal_t *term = (ret == m_terminals.end() ? nullptr : ret->second); if (term == nullptr && required) - log().fatal(MF_2_TERMINAL_1_2_NOT_FOUND, terminal_in, tname); + log().fatal(MF_TERMINAL_1_2_NOT_FOUND(terminal_in, tname)); if (term != nullptr) log().debug("Found input {1}\n", tname); return term; @@ -393,14 +390,14 @@ detail::core_terminal_t *setup_t::find_terminal(const pstring &terminal_in, ret = m_terminals.find(tname + ".Q"); } if (ret == m_terminals.end() && required) - log().fatal(MF_2_TERMINAL_1_2_NOT_FOUND, terminal_in, tname); + log().fatal(MF_TERMINAL_1_2_NOT_FOUND(terminal_in, tname)); detail::core_terminal_t *term = (ret == m_terminals.end() ? nullptr : ret->second); if (term != nullptr && term->type() != atype) { if (required) - log().fatal(MF_2_OBJECT_1_2_WRONG_TYPE, terminal_in, tname); + log().fatal(MF_OBJECT_1_2_WRONG_TYPE(terminal_in, tname)); else term = nullptr; } @@ -417,7 +414,7 @@ param_t *setup_t::find_param(const pstring ¶m_in, bool required) const const pstring &outname = resolve_alias(param_in_fqn); auto ret = m_params.find(outname); if (ret == m_params.end() && required) - log().fatal(MF_2_PARAMETER_1_2_NOT_FOUND, param_in_fqn, outname); + log().fatal(MF_PARAMETER_1_2_NOT_FOUND(param_in_fqn, outname)); if (ret != m_params.end()) log().debug("Found parameter {1}\n", outname); return (ret == m_params.end() ? nullptr : &ret->second.m_param); @@ -443,8 +440,8 @@ devices::nld_base_proxy *setup_t::get_d_a_proxy(detail::core_terminal_t &out) { p->clear_net(); // de-link from all nets ... if (!connect(new_proxy->proxy_term(), *p)) - log().fatal(MF_2_CONNECTING_1_TO_2, - new_proxy->proxy_term().name(), (*p).name()); + log().fatal(MF_CONNECTING_1_TO_2( + new_proxy->proxy_term().name(), (*p).name())); } out.net().core_terms().clear(); // clear the list @@ -486,8 +483,8 @@ devices::nld_base_proxy *setup_t::get_a_d_proxy(detail::core_terminal_t &inp) { p->clear_net(); // de-link from all nets ... if (!connect(ret->proxy_term(), *p)) - log().fatal(MF_2_CONNECTING_1_TO_2, - ret->proxy_term().name(), (*p).name()); + log().fatal(MF_CONNECTING_1_TO_2( + ret->proxy_term().name(), (*p).name())); } inp.net().core_terms().clear(); // clear the list } @@ -502,13 +499,12 @@ void setup_t::merge_nets(detail::net_t &thisnet, detail::net_t &othernet) log().debug("merging nets ...\n"); if (&othernet == &thisnet) { - log().warning(MW_1_CONNECTING_1_TO_ITSELF, thisnet.name()); + log().warning(MW_CONNECTING_1_TO_ITSELF(thisnet.name())); return; // Nothing to do } if (thisnet.isRailNet() && othernet.isRailNet()) - log().fatal(MF_2_MERGE_RAIL_NETS_1_AND_2, - thisnet.name(), othernet.name()); + log().fatal(MF_MERGE_RAIL_NETS_1_AND_2(thisnet.name(), othernet.name())); if (othernet.isRailNet()) { @@ -566,7 +562,7 @@ void setup_t::connect_terminal_input(terminal_t &term, detail::core_terminal_t & } else { - log().fatal(MF_1_OBJECT_INPUT_TYPE_1, inp.name()); + log().fatal(MF_OBJECT_INPUT_TYPE_1(inp.name())); } } @@ -590,7 +586,7 @@ void setup_t::connect_terminal_output(terminal_t &in, detail::core_terminal_t &o } else { - log().fatal(MF_1_OBJECT_OUTPUT_TYPE_1, out.name()); + log().fatal(MF_OBJECT_OUTPUT_TYPE_1(out.name())); } } @@ -681,13 +677,13 @@ bool setup_t::connect(detail::core_terminal_t &t1_in, detail::core_terminal_t &t if (t1.is_type(detail::terminal_type::OUTPUT) && t2.is_type(detail::terminal_type::INPUT)) { if (t2.has_net() && t2.net().isRailNet()) - log().fatal(MF_1_INPUT_1_ALREADY_CONNECTED, t2.name()); + log().fatal(MF_INPUT_1_ALREADY_CONNECTED(t2.name())); connect_input_output(t2, t1); } else if (t1.is_type(detail::terminal_type::INPUT) && t2.is_type(detail::terminal_type::OUTPUT)) { if (t1.has_net() && t1.net().isRailNet()) - log().fatal(MF_1_INPUT_1_ALREADY_CONNECTED, t1.name()); + log().fatal(MF_INPUT_1_ALREADY_CONNECTED(t1.name())); connect_input_output(t1, t2); } else if (t1.is_type(detail::terminal_type::OUTPUT) && t2.is_type(detail::terminal_type::TERMINAL)) @@ -750,9 +746,9 @@ void setup_t::resolve_inputs() if (tries == 0) { for (auto & link : m_links) - log().warning(MF_2_CONNECTING_1_TO_2, link.first, link.second); + log().warning(MF_CONNECTING_1_TO_2(link.first, link.second)); - log().fatal(MF_0_LINK_TRIES_EXCEEDED); + log().fatal(MF_LINK_TRIES_EXCEEDED(NL_MAX_LINK_RESOLVE_LOOPS)); } log().verbose("deleting empty nets ..."); @@ -768,19 +764,19 @@ void setup_t::resolve_inputs() { detail::core_terminal_t *term = i.second; if (!term->has_net() && dynamic_cast< devices::NETLIB_NAME(dummy_input) *>(&term->device()) != nullptr) - log().info(MI_1_DUMMY_1_WITHOUT_CONNECTIONS, term->name()); + log().info(MI_DUMMY_1_WITHOUT_CONNECTIONS(term->name())); else if (!term->has_net()) errstr += plib::pfmt("Found terminal {1} without a net\n")(term->name()); else if (term->net().num_cons() == 0) { if (term->is_logic_input()) - log().warning(MW_1_LOGIC_INPUT_1_WITHOUT_CONNECTIONS, term->name()); + log().warning(MW_LOGIC_INPUT_1_WITHOUT_CONNECTIONS(term->name())); else if (term->is_logic_output()) - log().info(MI_1_LOGIC_OUTPUT_1_WITHOUT_CONNECTIONS, term->name()); + log().info(MI_LOGIC_OUTPUT_1_WITHOUT_CONNECTIONS(term->name())); else if (term->is_analog_output()) - log().info(MI_1_ANALOG_OUTPUT_1_WITHOUT_CONNECTIONS, term->name()); + log().info(MI_ANALOG_OUTPUT_1_WITHOUT_CONNECTIONS(term->name())); else - log().warning(MW_1_TERMINAL_1_WITHOUT_CONNECTIONS, term->name()); + log().warning(MW_TERMINAL_1_WITHOUT_CONNECTIONS(term->name())); } } //FIXME: error string handling @@ -826,11 +822,11 @@ void models_t::register_model(pstring model_in) { auto pos = model_in.find(" "); if (pos == pstring::npos) - throw nl_exception(MF_1_UNABLE_TO_PARSE_MODEL_1, model_in); + throw nl_exception(MF_UNABLE_TO_PARSE_MODEL_1(model_in)); pstring model = plib::ucase(plib::trim(plib::left(model_in, pos))); pstring def = plib::trim(model_in.substr(pos + 1)); if (!m_models.insert({model, def}).second) - throw nl_exception(MF_1_MODEL_ALREADY_EXISTS_1, model_in); + throw nl_exception(MF_MODEL_ALREADY_EXISTS_1(model_in)); } void models_t::model_parse(const pstring &model_in, model_map_t &map) @@ -847,7 +843,7 @@ void models_t::model_parse(const pstring &model_in, model_map_t &map) key = plib::ucase(model); auto i = m_models.find(key); if (i == m_models.end()) - throw nl_exception(MF_1_MODEL_NOT_FOUND, model); + throw nl_exception(MF_MODEL_NOT_FOUND(model)); model = i->second; } pstring xmodel = plib::left(model, pos); @@ -860,12 +856,12 @@ void models_t::model_parse(const pstring &model_in, model_map_t &map) if (i != m_models.end()) model_parse(xmodel, map); else - throw nl_exception(MF_1_MODEL_NOT_FOUND, model_in); + throw nl_exception(MF_MODEL_NOT_FOUND(model_in)); } pstring remainder = plib::trim(model.substr(pos + 1)); if (!plib::endsWith(remainder, ")")) - throw nl_exception(MF_1_MODEL_ERROR_1, model); + throw nl_exception(MF_MODEL_ERROR_1(model)); // FIMXE: Not optimal remainder = plib::left(remainder, remainder.size() - 1); @@ -874,7 +870,7 @@ void models_t::model_parse(const pstring &model_in, model_map_t &map) { auto pose = pe.find("="); if (pose == pstring::npos) - throw nl_exception(MF_1_MODEL_ERROR_ON_PAIR_1, model); + throw nl_exception(MF_MODEL_ERROR_ON_PAIR_1(model)); map[plib::ucase(plib::left(pe, pose))] = pe.substr(pose + 1); } } @@ -898,10 +894,9 @@ pstring models_t::value_str(pstring model, pstring entity) pstring ret; if (entity != plib::ucase(entity)) - throw nl_exception(MF_2_MODEL_PARAMETERS_NOT_UPPERCASE_1_2, entity, - model_string(map)); + throw nl_exception(MF_MODEL_PARAMETERS_NOT_UPPERCASE_1_2(entity, model_string(map))); if (map.find(entity) == map.end()) - throw nl_exception(MF_2_ENTITY_1_NOT_FOUND_IN_MODEL_2, entity, model_string(map)); + throw nl_exception(MF_ENTITY_1_NOT_FOUND_IN_MODEL_2(entity, model_string(map))); else ret = map[entity]; @@ -932,7 +927,7 @@ nl_double models_t::value(pstring model, pstring entity) case 'a': factor = 1e-18; break; default: if (*p < '0' || *p > '9') - throw nl_exception(MF_1_UNKNOWN_NUMBER_FACTOR_IN_1, entity); + throw nl_exception(MF_UNKNOWN_NUMBER_FACTOR_IN_1(entity)); } if (factor != plib::constants<nl_double>::one()) tmp = plib::left(tmp, tmp.size() - 1); @@ -1005,7 +1000,7 @@ plib::unique_ptr<plib::pistream> setup_t::get_data_stream(const pstring &name) return strm; } } - log().warning(MW_1_DATA_1_NOT_FOUND, name); + log().warning(MW_DATA_1_NOT_FOUND(name)); return plib::unique_ptr<plib::pistream>(nullptr); } @@ -1100,7 +1095,7 @@ void setup_t::prepare_to_run() //FIXME: check for errors ... auto v = plib::pstonum<double>(p->second); if (std::abs(v - std::floor(v)) > 1e-6 ) - log().fatal(MF_1_HND_VAL_NOT_SUPPORTED, p->second); + log().fatal(MF_HND_VAL_NOT_SUPPORTED(p->second)); d.second->set_hint_deactivate(v == 0.0); } } @@ -1116,8 +1111,8 @@ void setup_t::prepare_to_run() { if (t->m_N.net().isRailNet() && t->m_P.net().isRailNet()) { - log().info(MI_3_REMOVE_DEVICE_1_CONNECTED_ONLY_TO_RAILS_2_3, - t->name(), t->m_N.net().name(), t->m_P.net().name()); + 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); @@ -1130,7 +1125,7 @@ void setup_t::prepare_to_run() { for (auto &p : m_nlstate.nets()) if (p->is_analog()) - log().fatal(MF_0_NO_SOLVER); + log().fatal(MF_NO_SOLVER()); } else solver->post_start(); diff --git a/src/lib/netlist/plib/pfmtlog.h b/src/lib/netlist/plib/pfmtlog.h index ce94407d018..749027bf95e 100644 --- a/src/lib/netlist/plib/pfmtlog.h +++ b/src/lib/netlist/plib/pfmtlog.h @@ -191,6 +191,12 @@ public: return format_element(ptype_traits<T *>::size_spec(), ptype_traits<T *>::fmt_spec(), ptype_traits<T *>::cast(x)); } + pfmt &operator ()() + { + return *this; + } + + template<typename X, typename Y, typename... Args> pfmt &operator()(X&& x, Y && y, Args&&... args) { diff --git a/src/lib/netlist/solver/nld_matrix_solver.cpp b/src/lib/netlist/solver/nld_matrix_solver.cpp index 1b92017c284..9f29d1152c7 100644 --- a/src/lib/netlist/solver/nld_matrix_solver.cpp +++ b/src/lib/netlist/solver/nld_matrix_solver.cpp @@ -127,8 +127,7 @@ namespace devices } break; case detail::terminal_type::OUTPUT: - log().fatal(MF_1_UNHANDLED_ELEMENT_1_FOUND, - p->name()); + log().fatal(MF_UNHANDLED_ELEMENT_1_FOUND(p->name())); break; } } @@ -438,7 +437,7 @@ namespace devices // reschedule .... if (this_resched > 1 && !m_Q_sync.net().is_queued()) { - log().warning(MW_1_NEWTON_LOOPS_EXCEEDED_ON_NET_1, this->name()); + log().warning(MW_NEWTON_LOOPS_EXCEEDED_ON_NET_1(this->name())); m_Q_sync.net().toggle_and_push_to_queue(m_params.m_nr_recalc_delay); } } @@ -554,7 +553,7 @@ namespace devices else // if (ot<0) { m_rails_temp[k]->add(term, ot, true); - log().fatal(MF_1_FOUND_TERM_WITH_MISSING_OTHERNET, term->name()); + log().fatal(MF_FOUND_TERM_WITH_MISSING_OTHERNET(term->name())); } } } diff --git a/src/lib/netlist/solver/nld_solver.cpp b/src/lib/netlist/solver/nld_solver.cpp index 63642b65e10..bc10078b1c2 100644 --- a/src/lib/netlist/solver/nld_solver.cpp +++ b/src/lib/netlist/solver/nld_solver.cpp @@ -160,7 +160,7 @@ namespace devices } else { - log().fatal(MF_1_UNKNOWN_SOLVER_TYPE, m_method()); + log().fatal(MF_UNKNOWN_SOLVER_TYPE(m_method())); return pool_owned_ptr<matrix_solver_t>(); } } @@ -358,7 +358,7 @@ namespace devices #endif #endif default: - log().info(MI_1_NO_SPECIFIC_SOLVER, net_count); + log().info(MI_NO_SPECIFIC_SOLVER(net_count)); if (net_count <= 8) { ms = create_solver<double, -8>(net_count, sname); @@ -383,7 +383,7 @@ namespace devices } else { - log().fatal(MF_1_NETGROUP_SIZE_EXCEEDED_1, 128); + log().fatal(MF_NETGROUP_SIZE_EXCEEDED_1(128)); return; /* tease compilers */ } break; |