summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author couriersud <couriersud@gmx.org>2019-04-18 01:17:53 +0200
committer couriersud <couriersud@gmx.org>2019-04-18 01:18:01 +0200
commit6392b345e62699d9c0d09fb12dd2ed664eb9e361 (patch)
treed7b641e1c73c53da3420bf2714c15c91fe82aaba
parente6261f9e397cf300fe617a0ca8cfe40e71a35868 (diff)
netlist: scalable error messages.
This approach uses functors for logging messages.
-rw-r--r--src/lib/netlist/analog/nld_opamps.cpp2
-rw-r--r--src/lib/netlist/devices/nld_mm5837.cpp4
-rw-r--r--src/lib/netlist/devices/nlid_proxy.cpp2
-rw-r--r--src/lib/netlist/nl_base.cpp16
-rw-r--r--src/lib/netlist/nl_base.h4
-rw-r--r--src/lib/netlist/nl_errstr.h146
-rw-r--r--src/lib/netlist/nl_factory.cpp4
-rw-r--r--src/lib/netlist/nl_parser.cpp4
-rw-r--r--src/lib/netlist/nl_setup.cpp103
-rw-r--r--src/lib/netlist/plib/pfmtlog.h6
-rw-r--r--src/lib/netlist/solver/nld_matrix_solver.cpp7
-rw-r--r--src/lib/netlist/solver/nld_solver.cpp6
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 &param)
{
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 &param_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;