netlist: scalable error messages.

This approach uses functors for logging messages.
This commit is contained in:
couriersud 2019-04-18 01:17:53 +02:00
parent e6261f9e39
commit 6392b345e6
12 changed files with 160 additions and 142 deletions

View File

@ -116,7 +116,7 @@ namespace netlist
{
m_type = static_cast<int>(m_model.m_TYPE);
if (m_type < 1 || m_type > 3)
log().fatal(MF_1_UNKNOWN_OPAMP_TYPE, m_type);
log().fatal(MF_UNKNOWN_OPAMP_TYPE(m_type));
if (m_type == 1)
{

View File

@ -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)

View File

@ -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());
}

View File

@ -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)

View File

@ -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

View File

@ -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"
//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")
#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"
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_ */

View File

@ -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
}

View File

@ -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);

View File

@ -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();

View File

@ -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)
{

View File

@ -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()));
}
}
}

View File

@ -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;