diff options
Diffstat (limited to 'src/lib/netlist/nl_setup.cpp')
-rw-r--r-- | src/lib/netlist/nl_setup.cpp | 88 |
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 ¶m) 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 ¶m_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 |