303 std::set<std::string> m_unignored;
308 std::set<std::string> hide;
312 std::string m_orig_name;
318 std::unordered_set<std::string> m_initialized;
319 std::function<
void(std::string)> m_uninitialized_cb;
326 if (sc_core::sc_get_current_object()) {
335 std::string hierarchical_name()
337 if (!sc_core::sc_get_current_object()) {
338 return std::string(
"");
345 if (!sc_core::sc_get_current_object()) {
351 inline bool is_log_param(
const std::string&
parname)
const
369 if (m_uninitialized_cb && (!is_log_param(
parname))) {
371 auto pos = std::string::npos;
373 if (
pos == std::string::npos)
break;
375 if (m_initialized.count(parent) != 0)
break;
377 m_uninitialized_cb(parent);
380 return ((hide.find(
parname) == hide.end()) && (!is_global_broker()));
392 for (
auto&
p :
list) {
393 hide.insert(relname(
p.first));
394 if (!
p.second.is_null()) {
395 set_preset_cci_value(relname(
p.first),
p.second, m_originator);
400 void alias_params(
const std::initializer_list<std::pair<std::string, std::string>>&
list)
403 for (
auto&
p :
list) {
405 set_preset_cci_value(relname(
p.first), get_preset_cci_value(
aliasname), m_originator);
415 void untyped_post_write_callback(
const cci::cci_param_write_event<>& ev, cci::cci_param_handle
synced_handle)
445 std::vector<std::pair<std::string, std::string>> alias_list;
447 void alias_param(std::string
a, std::string
b)
449 alias_list.push_back(std::make_pair(
a,
b));
452 sc_bind(&ConfigurableBroker::alias_param_callback,
this, sc_unnamed::_1), m_originator);
454 alias_param_callback(cci::cci_param_handle());
459 alias_list.erase(std::remove_if(alias_list.begin(), alias_list.end(),
461 cci_param_untyped_handle h_a = get_param_handle(a.first, m_originator);
462 if (h_a.is_valid() && h_a.get_mutable_type() == cci::CCI_IMMUTABLE_PARAM) {
466 if (
h_b.is_valid() && !
h_a.is_valid()) {
467 set_preset_cci_value(
a.first,
h_b.get_cci_value(), m_originator);
470 if (
h_a.is_valid() &&
h_b.is_valid()) {
478 if (alias_list.size() == 0) {
488 std::vector<cci_name_value_pair> get_consumed_preset_values()
const
491 std::map<std::string, cci_value>::const_iterator
iter;
492 std::vector<cci_preset_value_predicate>::const_iterator
pred;
498 if (
p(std::make_pair(
iter->first,
iter->second))) {
516#define BROKERNAME "gs::ConfigurableBroker"
517 ConfigurableBroker(
const std::string& name = BROKERNAME,
519 : consuming_broker(hierarchical_name() +
"." + name)
520 , m_help_helper(HelpSingleton::GetInstance())
521 , m_orig_name(hierarchical_name())
522 , m_originator(get_cci_originator(name.
c_str()))
523 , m_parent(get_parent_broker())
542 std::initializer_list<std::pair<std::string, std::string>> alias_list = {},
546 initialize_params(
list);
547 alias_params(alias_list);
550 std::string relname(
const std::string&
n)
const
552 return (m_orig_name.empty()) ?
n : m_orig_name + std::string(
".") +
n;
555 ~ConfigurableBroker()
562 void set_uninitialized_cb(std::function<
void(std::string)>
uninitialized_cb)
566 void clear_uninitialized_cb() { m_uninitialized_cb =
nullptr; }
571 return m_parent.get_value_origin(
parname);
573 return consuming_broker::get_value_origin(
parname);
579 bool has_preset_value(
const std::string&
parname)
const override
582 return m_parent.has_preset_value(
parname);
584 return consuming_broker::has_preset_value(
parname);
591 return m_parent.get_preset_cci_value(
parname);
593 return consuming_broker::get_preset_cci_value(
parname);
597 void lock_preset_value(
const std::string&
parname)
override
600 return m_parent.lock_preset_value(
parname);
602 return consuming_broker::lock_preset_value(
parname);
607 const cci::cci_originator&
originator = cci::cci_originator())
const override
618 m_help_helper->clear_unused(
par->name());
619 if (sendToParent(
par->name())) {
620 return m_parent.add_param(
par);
622 auto iter = m_unignored.find(
par->name());
623 if (
iter != m_unignored.end()) {
624 m_unignored.erase(
iter);
626 return consuming_broker::add_param(
par);
632 if (sendToParent(
par->name())) {
633 return m_parent.remove_param(
par);
635 m_unignored.insert(
par->name());
636 return consuming_broker::remove_param(
par);
641 std::vector<cci_name_value_pair> get_unconsumed_preset_values()
const override
643 std::vector<cci_name_value_pair> r;
644 for (
auto u : m_unignored) {
645 auto p = get_preset_cci_value(
u);
646 r.push_back(std::make_pair(
u,
p));
649 std::vector<cci_name_value_pair>
p = m_parent.get_unconsumed_preset_values();
650 r.insert(r.end(),
p.begin(),
p.end());
659 m_parent.ignore_unconsumed_preset_values(
pred);
661 for (
auto u = m_unignored.begin();
u != m_unignored.end();) {
663 m_help_helper->clear_unused(*
u);
664 u = m_unignored.erase(
u);
710 std::vector<cci_param_untyped_handle>
p_param_handles = m_parent.get_param_handles();
718 return consuming_broker::get_param_handles(
originator);
722 bool is_global_broker()
const override {
return (!has_parent); }
728 unsigned m_name_length;
729 std::set<std::string> parent;
730 bool sendToParent(
const std::string&
parname)
const override
732 if (m_uninitialized_cb) {
734 if (
pos != std::string::npos) {
736 if (m_uninitialized_cb && m_initialized.count(
p) == 0) {
738 m_uninitialized_cb(
p);
743 if (parent.count(
parname) > 0) {
746 if (
parname.substr(0, m_name_length) == m_name) {
756 m_name = hierarchical_name();
757 m_name_length = m_name.length();
759 auto uncon = m_parent.get_unconsumed_preset_values(
760 [&](
const std::pair<std::string, cci_value>&
iv) {
return iv.first.find(m_name +
".") == 0; });
762 parent.insert(
p.first);
766 virtual std::vector<cci_name_value_pair> get_unconsumed_preset_values()
const override
768 std::vector<cci_name_value_pair> r;
769 for (
auto u : m_unignored) {
770 auto p = get_preset_cci_value(
u);
771 r.push_back(std::make_pair(
u,
p));