summaryrefslogtreecommitdiffstatshomepage
path: root/src/lib/netlist/nl_setup.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/netlist/nl_setup.cpp')
-rw-r--r--src/lib/netlist/nl_setup.cpp88
1 files changed, 47 insertions, 41 deletions
diff --git a/src/lib/netlist/nl_setup.cpp b/src/lib/netlist/nl_setup.cpp
index 21b2c0e8999..b1fac785ff6 100644
--- a/src/lib/netlist/nl_setup.cpp
+++ b/src/lib/netlist/nl_setup.cpp
@@ -39,7 +39,7 @@ namespace netlist
if (list.size() == 0 || (list.size() % 2) == 1)
{
log().fatal(MF_DIP_PINS_MUST_BE_AN_EQUAL_NUMBER_OF_PINS_1(build_fqn("")));
- plib::pthrow<nl_exception>(MF_DIP_PINS_MUST_BE_AN_EQUAL_NUMBER_OF_PINS_1(build_fqn("")));
+ throw nl_exception(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++)
@@ -94,7 +94,7 @@ namespace netlist
{
auto err(MF_PARAM_COUNT_MISMATCH_2(name, params_and_connections.size()));
log().fatal(err);
- plib::pthrow<nl_exception>(err);
+ throw nl_exception(err);
//break;
}
pstring output_name = *ptok;
@@ -116,7 +116,7 @@ namespace netlist
{
auto err(MF_PARAM_COUNT_MISMATCH_2(name, params_and_connections.size()));
log().fatal(err);
- plib::pthrow<nl_exception>(err);
+ throw nl_exception(err);
}
pstring paramfq = name + "." + tp;
@@ -133,7 +133,7 @@ namespace netlist
{
auto err(MF_PARAM_COUNT_EXCEEDED_2(name, params_and_connections.size()));
log().fatal(err);
- plib::pthrow<nl_exception>(err);
+ throw nl_exception(err);
}
}
}
@@ -144,7 +144,7 @@ namespace netlist
if (f == nullptr)
{
log().fatal(MF_CLASS_1_NOT_FOUND(classname));
- plib::pthrow<nl_exception>(MF_CLASS_1_NOT_FOUND(classname));
+ throw nl_exception(MF_CLASS_1_NOT_FOUND(classname));
}
else
{
@@ -154,7 +154,7 @@ namespace netlist
if (device_exists(key))
{
log().fatal(MF_DEVICE_ALREADY_EXISTS_1(name));
- plib::pthrow<nl_exception>(MF_DEVICE_ALREADY_EXISTS_1(name));
+ throw nl_exception(MF_DEVICE_ALREADY_EXISTS_1(name));
}
else
m_device_factory.insert(m_device_factory.end(), {key, f});
@@ -172,7 +172,7 @@ namespace netlist
if (list.size() < 2)
{
log().fatal(MF_NET_C_NEEDS_AT_LEAST_2_TERMINAL());
- plib::pthrow<nl_exception>(MF_NET_C_NEEDS_AT_LEAST_2_TERMINAL());
+ throw nl_exception(MF_NET_C_NEEDS_AT_LEAST_2_TERMINAL());
}
for (std::size_t i = 1; i < list.size(); i++)
{
@@ -188,7 +188,7 @@ namespace netlist
}))
return;
log().fatal(MF_NOT_FOUND_IN_SOURCE_COLLECTION(netlist_name));
- plib::pthrow<nl_exception>(MF_NOT_FOUND_IN_SOURCE_COLLECTION(netlist_name));
+ throw nl_exception(MF_NOT_FOUND_IN_SOURCE_COLLECTION(netlist_name));
}
@@ -225,7 +225,7 @@ namespace netlist
if (!m_param_values.insert({fqn, value}).second)
{
log().fatal(MF_ADDING_PARAMETER_1_TO_PARAMETER_LIST(param));
- plib::pthrow<nl_exception>(MF_ADDING_PARAMETER_1_TO_PARAMETER_LIST(param));
+ throw nl_exception(MF_ADDING_PARAMETER_1_TO_PARAMETER_LIST(param));
}
}
else
@@ -268,7 +268,7 @@ namespace netlist
if (!found)
{
log().fatal(MF_FOUND_NO_OCCURRENCE_OF_1(attach));
- plib::pthrow<nl_exception>(MF_FOUND_NO_OCCURRENCE_OF_1(attach));
+ throw nl_exception(MF_FOUND_NO_OCCURRENCE_OF_1(attach));
}
register_link(attach, frontier_name + ".Q");
}
@@ -293,7 +293,7 @@ namespace netlist
if (!m_alias.insert({alias, out}).second)
{
log().fatal(MF_ADDING_ALI1_TO_ALIAS_LIST(alias));
- plib::pthrow<nl_exception>(MF_ADDING_ALI1_TO_ALIAS_LIST(alias));
+ throw nl_exception(MF_ADDING_ALI1_TO_ALIAS_LIST(alias));
}
}
@@ -374,10 +374,16 @@ void setup_t::register_term(detail::core_terminal_t &term)
if (!m_terminals.insert({term.name(), &term}).second)
{
log().fatal(MF_ADDING_1_2_TO_TERMINAL_LIST(termtype_as_str(term), term.name()));
- plib::pthrow<nl_exception>(MF_ADDING_1_2_TO_TERMINAL_LIST(termtype_as_str(term), term.name()));
+ throw nl_exception(MF_ADDING_1_2_TO_TERMINAL_LIST(termtype_as_str(term), term.name()));
}
}
+void setup_t::register_term(terminal_t &term, terminal_t &other_term)
+{
+ this->register_term(term);
+ m_connected_terminals.insert({&term, &other_term});
+}
+
void setup_t::remove_connections(const pstring &pin)
{
pstring pinfn = build_fqn(pin);
@@ -397,7 +403,7 @@ void setup_t::remove_connections(const pstring &pin)
if (!found)
{
log().fatal(MF_FOUND_NO_OCCURRENCE_OF_1(pin));
- plib::pthrow<nl_exception>(MF_FOUND_NO_OCCURRENCE_OF_1(pin));
+ throw nl_exception(MF_FOUND_NO_OCCURRENCE_OF_1(pin));
}
}
@@ -406,7 +412,7 @@ 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_ADDING_PARAMETER_1_TO_PARAMETER_LIST(name));
- plib::pthrow<nl_exception>(MF_ADDING_PARAMETER_1_TO_PARAMETER_LIST(name));
+ throw nl_exception(MF_ADDING_PARAMETER_1_TO_PARAMETER_LIST(name));
}
}
@@ -502,7 +508,7 @@ detail::core_terminal_t *setup_t::find_terminal(const pstring &terminal_in, bool
if (term == nullptr && required)
{
log().fatal(MF_TERMINAL_1_2_NOT_FOUND(terminal_in, tname));
- plib::pthrow<nl_exception>(MF_TERMINAL_1_2_NOT_FOUND(terminal_in, tname));
+ throw nl_exception(MF_TERMINAL_1_2_NOT_FOUND(terminal_in, tname));
}
if (term != nullptr)
{
@@ -527,7 +533,7 @@ detail::core_terminal_t *setup_t::find_terminal(const pstring &terminal_in,
if (ret == m_terminals.end() && required)
{
log().fatal(MF_TERMINAL_1_2_NOT_FOUND(terminal_in, tname));
- plib::pthrow<nl_exception>(MF_TERMINAL_1_2_NOT_FOUND(terminal_in, tname));
+ throw nl_exception(MF_TERMINAL_1_2_NOT_FOUND(terminal_in, tname));
}
detail::core_terminal_t *term = (ret == m_terminals.end() ? nullptr : ret->second);
@@ -536,7 +542,7 @@ detail::core_terminal_t *setup_t::find_terminal(const pstring &terminal_in,
if (required)
{
log().fatal(MF_OBJECT_1_2_WRONG_TYPE(terminal_in, tname));
- plib::pthrow<nl_exception>(MF_OBJECT_1_2_WRONG_TYPE(terminal_in, tname));
+ throw nl_exception(MF_OBJECT_1_2_WRONG_TYPE(terminal_in, tname));
}
else
term = nullptr;
@@ -556,7 +562,7 @@ param_t *setup_t::find_param(const pstring &param_in, bool required) const
if (ret == m_params.end() && required)
{
log().fatal(MF_PARAMETER_1_2_NOT_FOUND(param_in_fqn, outname));
- plib::pthrow<nl_exception>(MF_PARAMETER_1_2_NOT_FOUND(param_in_fqn, outname));
+ throw nl_exception(MF_PARAMETER_1_2_NOT_FOUND(param_in_fqn, outname));
}
if (ret != m_params.end())
log().debug("Found parameter {1}\n", outname);
@@ -586,7 +592,7 @@ devices::nld_base_proxy *setup_t::get_d_a_proxy(detail::core_terminal_t &out)
{
log().fatal(MF_CONNECTING_1_TO_2(
new_proxy->proxy_term().name(), (*p).name()));
- plib::pthrow<nl_exception>(MF_CONNECTING_1_TO_2(
+ throw nl_exception(MF_CONNECTING_1_TO_2(
new_proxy->proxy_term().name(), (*p).name()));
}
}
@@ -596,7 +602,7 @@ devices::nld_base_proxy *setup_t::get_d_a_proxy(detail::core_terminal_t &out)
auto proxy(new_proxy.get());
if (!m_proxies.insert({&out, proxy}).second)
- plib::pthrow<nl_exception>(MF_DUPLICATE_PROXY_1(out.name()));
+ throw nl_exception(MF_DUPLICATE_PROXY_1(out.name()));
m_nlstate.register_device(new_proxy->name(), std::move(new_proxy));
return proxy;
@@ -625,7 +631,7 @@ devices::nld_base_proxy *setup_t::get_a_d_proxy(detail::core_terminal_t &inp)
auto ret(new_proxy.get());
if (!m_proxies.insert({&inp, ret}).second)
- plib::pthrow<nl_exception>(MF_DUPLICATE_PROXY_1(inp.name()));
+ throw nl_exception(MF_DUPLICATE_PROXY_1(inp.name()));
m_proxy_cnt++;
@@ -640,7 +646,7 @@ devices::nld_base_proxy *setup_t::get_a_d_proxy(detail::core_terminal_t &inp)
{
log().fatal(MF_CONNECTING_1_TO_2(
ret->proxy_term().name(), (*p).name()));
- plib::pthrow<nl_exception>(MF_CONNECTING_1_TO_2(
+ throw nl_exception(MF_CONNECTING_1_TO_2(
ret->proxy_term().name(), (*p).name()));
}
@@ -677,7 +683,7 @@ void setup_t::merge_nets(detail::net_t &thisnet, detail::net_t &othernet)
if (thisnet.isRailNet() && othernet.isRailNet())
{
log().fatal(MF_MERGE_RAIL_NETS_1_AND_2(thisnet.name(), othernet.name()));
- plib::pthrow<nl_exception>(MF_MERGE_RAIL_NETS_1_AND_2(thisnet.name(), othernet.name()));
+ throw nl_exception(MF_MERGE_RAIL_NETS_1_AND_2(thisnet.name(), othernet.name()));
}
if (othernet.isRailNet())
@@ -737,7 +743,7 @@ void setup_t::connect_terminal_input(terminal_t &term, detail::core_terminal_t &
else
{
log().fatal(MF_OBJECT_INPUT_TYPE_1(inp.name()));
- plib::pthrow<nl_exception>(MF_OBJECT_INPUT_TYPE_1(inp.name()));
+ throw nl_exception(MF_OBJECT_INPUT_TYPE_1(inp.name()));
}
}
@@ -762,7 +768,7 @@ void setup_t::connect_terminal_output(terminal_t &in, detail::core_terminal_t &o
else
{
log().fatal(MF_OBJECT_OUTPUT_TYPE_1(out.name()));
- plib::pthrow<nl_exception>(MF_OBJECT_OUTPUT_TYPE_1(out.name()));
+ throw nl_exception(MF_OBJECT_OUTPUT_TYPE_1(out.name()));
}
}
@@ -844,7 +850,7 @@ bool setup_t::connect(detail::core_terminal_t &t1_in, detail::core_terminal_t &t
if (t2.has_net() && t2.net().isRailNet())
{
log().fatal(MF_INPUT_1_ALREADY_CONNECTED(t2.name()));
- plib::pthrow<nl_exception>(MF_INPUT_1_ALREADY_CONNECTED(t2.name()));
+ throw nl_exception(MF_INPUT_1_ALREADY_CONNECTED(t2.name()));
}
connect_input_output(t2, t1);
}
@@ -853,7 +859,7 @@ bool setup_t::connect(detail::core_terminal_t &t1_in, detail::core_terminal_t &t
if (t1.has_net() && t1.net().isRailNet())
{
log().fatal(MF_INPUT_1_ALREADY_CONNECTED(t1.name()));
- plib::pthrow<nl_exception>(MF_INPUT_1_ALREADY_CONNECTED(t1.name()));
+ throw nl_exception(MF_INPUT_1_ALREADY_CONNECTED(t1.name()));
}
connect_input_output(t1, t2);
}
@@ -919,7 +925,7 @@ void setup_t::resolve_inputs()
log().warning(MF_CONNECTING_1_TO_2(setup().de_alias(link.first), setup().de_alias(link.second)));
log().fatal(MF_LINK_TRIES_EXCEEDED(m_netlist_params->m_max_link_loops()));
- plib::pthrow<nl_exception>(MF_LINK_TRIES_EXCEEDED(m_netlist_params->m_max_link_loops()));
+ throw nl_exception(MF_LINK_TRIES_EXCEEDED(m_netlist_params->m_max_link_loops()));
}
log().verbose("deleting empty nets ...");
@@ -964,7 +970,7 @@ void setup_t::resolve_inputs()
if (err)
{
log().fatal(MF_TERMINALS_WITHOUT_NET());
- plib::pthrow<nl_exception>(MF_TERMINALS_WITHOUT_NET());
+ throw nl_exception(MF_TERMINALS_WITHOUT_NET());
}
}
@@ -1006,11 +1012,11 @@ void models_t::register_model(const pstring &model_in)
{
auto pos = model_in.find(' ');
if (pos == pstring::npos)
- plib::pthrow<nl_exception>(MF_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)
- plib::pthrow<nl_exception>(MF_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)
@@ -1027,7 +1033,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())
- plib::pthrow<nl_exception>(MF_MODEL_NOT_FOUND(model));
+ throw nl_exception(MF_MODEL_NOT_FOUND(model));
model = i->second;
}
pstring xmodel = plib::left(model, pos);
@@ -1040,12 +1046,12 @@ void models_t::model_parse(const pstring &model_in, model_map_t &map)
if (i != m_models.end())
model_parse(xmodel, map);
else
- plib::pthrow<nl_exception>(MF_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, ")"))
- plib::pthrow<nl_exception>(MF_MODEL_ERROR_1(model));
+ throw nl_exception(MF_MODEL_ERROR_1(model));
// FIMXE: Not optimal
remainder = plib::left(remainder, remainder.size() - 1);
@@ -1054,7 +1060,7 @@ void models_t::model_parse(const pstring &model_in, model_map_t &map)
{
auto pose = pe.find('=');
if (pose == pstring::npos)
- plib::pthrow<nl_exception>(MF_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);
}
}
@@ -1079,9 +1085,9 @@ pstring models_t::value_str(const pstring &model, const pstring &entity)
pstring ret;
if (entity != plib::ucase(entity))
- plib::pthrow<nl_exception>(MF_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())
- plib::pthrow<nl_exception>(MF_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];
@@ -1112,7 +1118,7 @@ nl_fptype models_t::value(const pstring &model, const pstring &entity)
case 'a': factor = nlconst::magic(1e-18); break;
default:
if (*p < '0' || *p > '9')
- plib::pthrow<nl_exception>(MF_UNKNOWN_NUMBER_FACTOR_IN_1(entity));
+ throw nl_exception(MF_UNKNOWN_NUMBER_FACTOR_IN_1(entity));
}
if (factor != nlconst::one())
tmp = plib::left(tmp, tmp.size() - 1);
@@ -1121,7 +1127,7 @@ nl_fptype models_t::value(const pstring &model, const pstring &entity)
bool err(false);
auto val = plib::pstonum_ne<nl_fptype>(tmp, err);
if (err)
- plib::pthrow<nl_exception>(MF_MODEL_NUMBER_CONVERSION_ERROR(entity, tmp, "double", model));
+ throw nl_exception(MF_MODEL_NUMBER_CONVERSION_ERROR(entity, tmp, "double", model));
return val * factor;
}
@@ -1284,7 +1290,7 @@ void setup_t::prepare_to_run()
if (err || plib::abs(v - plib::floor(v)) > nlconst::magic(1e-6) )
{
log().fatal(MF_HND_VAL_NOT_SUPPORTED(p->second));
- plib::pthrow<nl_exception>(MF_HND_VAL_NOT_SUPPORTED(p->second));
+ throw nl_exception(MF_HND_VAL_NOT_SUPPORTED(p->second));
}
// FIXME comparison with zero
d.second->set_hint_deactivate(v == nlconst::zero());
@@ -1318,7 +1324,7 @@ void setup_t::prepare_to_run()
if (p->is_analog())
{
log().fatal(MF_NO_SOLVER());
- plib::pthrow<nl_exception>(MF_NO_SOLVER());
+ throw nl_exception(MF_NO_SOLVER());
}
}
else