17 #include "configurer.h"
18 #include "rapidjson/document.h"
19 #include "rapidjson/error/en.h"
21 #include <cci_configuration>
23 #include <fmt/format.h>
25 #include <rapidjson/istreamwrapper.h>
26 #include <rapidjson/ostreamwrapper.h>
27 #include <rapidjson/prettywriter.h>
28 #include <unordered_map>
30 #include <yaml-cpp/exceptions.h>
31 #include <yaml-cpp/node/parse.h>
32 #include <yaml-cpp/yaml.h>
35 template <
typename T>
struct optional {
37 bool initialized{
false};
38 optional& operator=(T&& val) {
39 this->val = std::move(val);
43 operator bool()
const {
return initialized; }
44 T value() {
return val; }
49 template <
typename T>
struct as_if<T, optional<T>> {
50 explicit as_if(
const YAML::Node& node_)
52 const YAML::Node& node;
53 const optional<T> operator()()
const {
56 if(node.m_pNode && YAML::convert<T>::decode(node, t))
63 template <>
struct as_if<std::string, optional<std::string>> {
64 explicit as_if(
const YAML::Node& node_)
66 const YAML::Node& node;
67 const optional<std::string> operator()()
const {
68 optional<std::string> val;
70 if(node.m_pNode && YAML::convert<std::string>::decode(node, t))
79 inline auto get_sc_objects(sc_core::sc_object* obj =
nullptr) ->
const std::vector<sc_core::sc_object*>& {
81 return obj->get_child_objects();
83 return sc_core::sc_get_top_level_objects();
87 #define DIR_SEPARATOR '\\'
89 #define DIR_SEPARATOR '/'
92 struct config_reader {
93 std::vector<std::string> includes{
"."};
94 void add_to_includes(std::string
const& path) {
95 for(
auto& e : includes) {
99 includes.push_back(path);
102 std::string find_in_include_path(std::string
const& file_name) {
103 if(file_name[0] ==
'/' || file_name[0] ==
'\\')
106 for(
auto& incl : includes) {
107 auto full_name = incl + DIR_SEPARATOR + file_name;
108 std::ifstream ifs(full_name);
118 using namespace rapidjson;
119 using writer_type = PrettyWriter<OStreamWrapper>;
121 #define FDECL(TYPE, FUNC) \
122 inline void writeValue(writer_type& writer, std::string const& key, TYPE value) { \
123 writer.Key(key.c_str()); \
124 writer.FUNC(value); \
127 FDECL(
unsigned int, Uint)
129 FDECL(
unsigned long, Uint64)
130 FDECL(
long long, Int64)
131 FDECL(
unsigned long long, Uint64)
134 FDECL(
double, Double)
135 FDECL(
char const*, String)
136 inline void writeValue(writer_type& writer, std::string
const& key, std::string
const& value) {
137 writer.Key(key.c_str());
138 writer.String(value.c_str());
141 inline bool start_object(writer_type& writer,
char const* key,
bool started) {
144 writer.StartObject();
149 struct json_config_dumper {
150 configurer::broker_t
const& broker;
151 std::vector<std::string>
const& stop_list;
152 std::unordered_map<std::string, std::vector<cci::cci_param_untyped_handle>> lut;
153 json_config_dumper(configurer::broker_t
const& broker, std::vector<std::string>
const& stop_list)
155 , stop_list(stop_list) {
156 for(
auto& h : broker.get_param_handles()) {
157 auto value = h.get_cci_value();
158 std::string paramname{h.name()};
159 auto sep = paramname.rfind(
'.');
160 auto basename = paramname.substr(0, sep);
161 lut[basename].push_back(h);
165 void dump_config(sc_core::sc_object* obj, writer_type& writer) {
166 auto basename = std::string(obj->basename());
167 if(basename.substr(0, 3) ==
"$$$" || std::find(std::begin(stop_list), std::end(stop_list), obj->name()) != std::end(stop_list))
169 auto obj_started =
false;
170 auto log_lvl_set =
false;
171 auto it = lut.find(obj->name());
173 for(
auto& h : it->second) {
174 obj_started = start_object(writer, obj->basename(), obj_started);
175 auto value = h.get_cci_value();
176 std::string paramname{h.name()};
177 auto basename = paramname.substr(paramname.rfind(
'.') + 1);
178 if(basename == SCC_LOG_LEVEL_PARAM_NAME)
181 writeValue(writer, basename, (
bool)value.get_bool());
182 else if(value.is_int())
183 writeValue(writer, basename, (
int)value.get_int());
184 else if(value.is_int64())
185 writeValue(writer, basename,
static_cast<int64_t
>(value.get_int64()));
186 else if(value.is_uint())
187 writeValue(writer, basename, value.get_uint());
188 else if(value.is_uint64())
189 writeValue(writer, basename,
static_cast<uint64_t
>(value.get_uint64()));
190 else if(value.is_double())
191 writeValue(writer, basename, value.get_double());
192 else if(value.is_string())
193 writeValue(writer, basename, value.get_string().c_str());
195 auto mod =
dynamic_cast<sc_core::sc_module*
>(obj);
197 obj_started = start_object(writer, obj->basename(), obj_started);
198 auto val = broker.get_preset_cci_value(fmt::format(
"{}.{}", obj->name(), SCC_LOG_LEVEL_PARAM_NAME));
199 if(basename.substr(0, 3) !=
"$$$")
200 writeValue(writer, SCC_LOG_LEVEL_PARAM_NAME, val.is_int() ? val.get_int() :
static_cast<int>(
get_logging_level()));
202 for(
auto* o : get_sc_objects(obj)) {
203 obj_started = start_object(writer, obj->basename(), obj_started);
204 dump_config(o, writer);
211 struct json_config_reader :
public config_reader {
212 configurer::broker_t& broker;
217 json_config_reader(configurer::broker_t& broker)
220 void parse(std::istream& is) {
221 IStreamWrapper stream(is);
222 document.ParseStream(stream);
223 valid = !document.HasParseError();
224 empty = document.IsNull();
226 std::string get_error_msg() {
227 std::ostringstream os;
228 os <<
" location " << (unsigned)document.GetErrorOffset() <<
", reason: " << GetParseError_En(document.GetParseError());
232 inline void configure_cci() { configure_cci_hierarchical(document,
""); }
234 void configure_cci_hierarchical(Value
const& value, std::string prefix) {
235 if(value.IsObject()) {
236 auto o = value.GetObject();
237 for(
auto itr = o.MemberBegin(); itr != o.MemberEnd(); ++itr) {
238 if(!itr->name.IsString())
240 std::string key_name = itr->name.GetString();
241 Value
const& val = itr->value;
242 auto hier_name = prefix.size() ? prefix +
"." + key_name : key_name;
243 if(val.IsNull() || val.IsArray())
245 else if(val.IsObject())
246 configure_cci_hierarchical(val, hier_name);
248 if(key_name ==
"!include") {
249 json_config_reader sub_reader(broker);
250 std::ifstream ifs(find_in_include_path(val.GetString()));
252 sub_reader.parse(ifs);
253 if(sub_reader.valid) {
254 sub_reader.configure_cci_hierarchical(sub_reader.document, prefix);
256 std::ostringstream os;
257 os <<
"Could not parse include file " << val.GetString();
258 throw std::runtime_error(os.str());
261 std::ostringstream os;
262 os <<
"Could not open include file " << val.GetString();
263 throw std::runtime_error(os.str());
266 auto param_handle = broker.get_param_handle(hier_name);
267 if(param_handle.is_valid()) {
269 param_handle.set_cci_value(cci::cci_value(std::string(val.GetString())));
270 }
else if(val.IsBool()) {
271 param_handle.set_cci_value(cci::cci_value(val.Get<
bool>()));
272 }
else if(val.IsInt()) {
273 param_handle.set_cci_value(cci::cci_value(val.Get<
int>()));
274 }
else if(val.IsInt64()) {
275 param_handle.set_cci_value(cci::cci_value(val.Get<int64_t>()));
276 }
else if(val.IsUint()) {
277 param_handle.set_cci_value(cci::cci_value(val.Get<
unsigned>()));
278 }
else if(val.IsUint64()) {
279 param_handle.set_cci_value(cci::cci_value(val.Get<uint64_t>()));
280 }
else if(val.IsDouble()) {
281 param_handle.set_cci_value(cci::cci_value(val.Get<
double>()));
285 broker.set_preset_cci_value(hier_name, cci::cci_value(std::string(val.GetString())));
286 }
else if(val.IsBool()) {
287 broker.set_preset_cci_value(hier_name, cci::cci_value(val.Get<
bool>()));
288 }
else if(val.IsInt()) {
289 broker.set_preset_cci_value(hier_name, cci::cci_value(val.Get<
int>()));
290 }
else if(val.IsInt64()) {
291 broker.set_preset_cci_value(hier_name, cci::cci_value(val.Get<int64_t>()));
292 }
else if(val.IsUint()) {
293 broker.set_preset_cci_value(hier_name, cci::cci_value(val.Get<
unsigned>()));
294 }
else if(val.IsUint64()) {
295 broker.set_preset_cci_value(hier_name, cci::cci_value(val.Get<uint64_t>()));
296 }
else if(val.IsDouble()) {
297 broker.set_preset_cci_value(hier_name, cci::cci_value(val.Get<
double>()));
313 struct yaml_config_dumper {
314 configurer::broker_t
const& broker;
315 bool with_description{
false};
317 std::vector<std::string>
const& stop_list;
318 std::unordered_map<std::string, std::vector<cci::cci_param_untyped_handle>> lut;
319 std::vector<cci::cci_param_untyped_handle> tl_lut;
320 yaml_config_dumper(configurer::broker_t
const& broker,
bool with_description,
bool complete, std::vector<std::string>
const& stop_list)
322 , with_description(with_description)
324 , stop_list(stop_list) {
325 for(
auto& h : broker.get_param_handles()) {
326 auto value = h.get_cci_value();
327 std::string paramname{h.name()};
328 auto sep = paramname.rfind(
'.');
329 if(sep == std::string::npos) {
332 auto basename = paramname.substr(0, sep);
333 lut[basename].push_back(h);
338 void dump_config(YAML::Node& base_node) {
339 copy2yaml(tl_lut, base_node);
340 for(
auto* o : sc_core::sc_get_top_level_objects()) {
341 dump_config(o, base_node);
345 void dump_config(sc_core::sc_object* obj, YAML::Node& base_node) {
346 auto basename = std::string(obj->basename());
347 if(basename.substr(0, 3) ==
"$$$" || std::find(std::begin(stop_list), std::end(stop_list), obj->name()) != std::end(stop_list))
349 auto obj_started =
false;
350 auto log_lvl_set =
false;
351 auto it = lut.find(obj->name());
352 YAML::Node this_node;
354 log_lvl_set |= copy2yaml(it->second, this_node);
355 auto mod =
dynamic_cast<sc_core::sc_module*
>(obj);
356 if(!log_lvl_set && mod && complete) {
357 auto val = broker.get_preset_cci_value(fmt::format(
"{}.{}", obj->name(), SCC_LOG_LEVEL_PARAM_NAME));
359 if(basename.substr(0, 11) !=
"scc_tracer")
360 this_node[
"log_level"] = val.is_int() ? val.get_int() : global_verb;
362 for(
auto* o : get_sc_objects(obj)) {
363 dump_config(o, this_node);
366 base_node[obj->basename()] = this_node;
370 bool copy2yaml(
const std::vector<cci::cci_param_untyped_handle>& params, YAML::Node& this_node) {
371 bool log_lvl_set =
false;
372 for(
auto& h : params) {
373 auto value = h.get_cci_value();
374 std::string paramname{h.name()};
375 auto basename = paramname.substr(paramname.rfind(
'.') + 1);
376 if(basename == SCC_LOG_LEVEL_PARAM_NAME)
379 auto descr = h.get_description();
380 if(with_description && descr.size()) {
381 auto descr_name = fmt::format(
"{}::descr", basename);
382 this_node[descr_name] = descr;
383 this_node[descr_name].SetTag(
"desc");
387 this_node[basename] = (bool)(value.get_bool());
388 else if(value.is_int())
389 this_node[basename] = (
int)(value.get_int());
390 else if(value.is_int64())
391 this_node[basename] =
static_cast<int64_t
>(value.get_int64());
392 else if(value.is_uint())
393 this_node[basename] = value.get_uint();
394 else if(value.is_uint64())
395 this_node[basename] =
static_cast<uint64_t
>(value.get_uint64());
396 else if(value.is_double())
397 this_node[basename] = value.get_double();
398 else if(value.is_string())
399 this_node[basename] = value.get_string().c_str();
400 else if(value.try_get(t))
401 this_node[basename] = t.to_string();
407 struct yaml_config_reader :
public config_reader {
408 configurer::broker_t& broker;
413 yaml_config_reader(configurer::broker_t& broker)
416 void parse(std::istream& is) {
417 std::string buf((std::istreambuf_iterator<char>(is)), std::istreambuf_iterator<char>());
418 document = YAML::Load(buf);
419 valid = document.IsDefined() && (document.IsMap() || document.IsNull());
420 empty = document.IsNull();
423 std::string get_error_msg() {
return "YAML file does not start with a map"; }
425 inline void configure_cci() {
427 configure_cci_hierarchical(document,
"");
428 }
catch(YAML::ParserException& e) {
429 throw std::runtime_error(e.what());
430 }
catch(YAML::BadFile& e) {
431 throw std::runtime_error(e.what());
432 }
catch(YAML::Exception& e) {
433 throw std::runtime_error(e.what());
437 void configure_cci_hierarchical(YAML::Node
const& value, std::string
const& prefix) {
439 for(
auto it = value.begin(); it != value.end(); ++it) {
440 auto key_name = it->first.as<std::string>();
441 YAML::Node
const& val = it->second;
442 auto hier_name = prefix.size() ? prefix +
"." + key_name : key_name;
443 if(!val.IsDefined() || val.IsSequence())
446 configure_cci_hierarchical(val, hier_name);
447 else if(val.IsScalar()) {
448 auto& tag = val.Tag();
449 if(tag ==
"!include") {
450 yaml_config_reader sub_reader(broker);
451 std::ifstream ifs(find_in_include_path(val.as<std::string>()));
453 sub_reader.parse(ifs);
454 if(sub_reader.valid) {
455 sub_reader.configure_cci_hierarchical(sub_reader.document, hier_name);
457 std::ostringstream os;
458 os <<
"Could not parse include file " << val.as<std::string>();
459 throw std::runtime_error(os.str());
462 std::ostringstream os;
463 os <<
"Could not open include file " << val.as<std::string>();
464 throw std::runtime_error(os.str());
466 }
else if(tag.size() && tag[0] ==
'?') {
467 auto param_handle = broker.get_param_handle(hier_name);
468 if(param_handle.is_valid()) {
469 auto param = param_handle.get_cci_value();
470 if(param.is_bool()) {
471 param.set_bool(val.as<
bool>());
472 }
else if(param.is_int()) {
473 param.set_int(val.as<
int>());
474 }
else if(param.is_uint()) {
475 param.set_uint(val.as<
unsigned>());
476 }
else if(param.is_int64()) {
477 param.set_int64(val.as<int64_t>());
478 }
else if(param.is_uint64()) {
479 param.set_uint64(val.as<uint64_t>());
480 }
else if(param.is_double()) {
481 param.set_double(val.as<
double>());
482 }
else if(param.is_string()) {
483 param.set_string(val.as<std::string>());
486 if(
auto res = YAML::as_if<
bool, optional<bool>>(val)()) {
487 broker.set_preset_cci_value(hier_name, cci::cci_value(res.value()));
488 }
else if(
auto res = YAML::as_if<
int, optional<int>>(val)()) {
489 broker.set_preset_cci_value(hier_name, cci::cci_value(res.value()));
490 }
else if(
auto res = YAML::as_if<int64_t, optional<int64_t>>(val)()) {
491 broker.set_preset_cci_value(hier_name, cci::cci_value(res.value()));
492 }
else if(
auto res = YAML::as_if<
unsigned, optional<unsigned>>(val)()) {
493 broker.set_preset_cci_value(hier_name, cci::cci_value(res.value()));
494 }
else if(
auto res = YAML::as_if<uint64_t, optional<uint64_t>>(val)()) {
495 broker.set_preset_cci_value(hier_name, cci::cci_value(res.value()));
496 }
else if(
auto res = YAML::as_if<
double, optional<double>>(val)()) {
497 broker.set_preset_cci_value(hier_name, cci::cci_value(res.value()));
498 }
else if(
auto res = YAML::as_if<std::string, optional<std::string>>(val)()) {
499 broker.set_preset_cci_value(hier_name, cci::cci_value(res.value()));
512 template <
typename T>
513 inline bool create_cci_param(sc_core::sc_attr_base* base_attr,
const std::string& hier_name, configurer::cci_param_cln& params,
514 configurer::broker_t& broker, cci::cci_originator& cci_originator) {
515 if(
auto attr =
dynamic_cast<sc_core::sc_attribute<T>*
>(base_attr)) {
516 auto par =
new cci::cci_param_typed<T>(hier_name, attr->value, broker,
"", cci::CCI_ABSOLUTE_NAME, cci_originator);
517 params.emplace_back(cci::cci_param_post_write_callback_untyped([attr](
const cci::cci_param_write_event<>& ev) {
519 if(ev.new_value.try_get(result))
520 attr->value = result;
523 par->register_post_write_callback(params.back().first);
524 attr->value = par->get_value();
531 inline bool create_cci_param<char*>(sc_core::sc_attr_base* base_attr,
const std::string& hier_name, configurer::cci_param_cln& params,
532 configurer::broker_t& broker, cci::cci_originator& cci_originator) {
533 if(
auto attr =
dynamic_cast<sc_core::sc_attribute<char*>*
>(base_attr)) {
534 auto par =
new cci::cci_param_typed<std::string>(hier_name, attr->value, broker,
"", cci::CCI_ABSOLUTE_NAME);
535 params.emplace_back(cci::cci_param_post_write_callback_untyped([attr](
const cci::cci_param_write_event<>& ev) {
538 attr->value = strdup(ev.new_value.get<std::string>().c_str());
541 par->register_post_write_callback(params.back().first);
542 attr->value = strdup(par->get_value().c_str());
548 template <
typename T>
inline bool update_cci_param(cci::cci_param_untyped_handle& param_handle, sc_core::sc_attr_base* base_attr) {
549 if(
auto attr =
dynamic_cast<sc_core::sc_attribute<T>*
>(base_attr)) {
550 param_handle.set_cci_value(cci::cci_value(attr->value));
556 template <>
inline bool update_cci_param<char*>(cci::cci_param_untyped_handle& param_handle, sc_core::sc_attr_base* base_attr) {
557 if(
auto attr =
dynamic_cast<sc_core::sc_attribute<char*>*
>(base_attr)) {
558 param_handle.set_cci_value(cci::cci_value(std::string(attr->value)));
564 inline bool mirror_sc_attribute(configurer::broker_t& broker, configurer::cci_param_cln& params, cci::cci_originator& cci_originator,
565 std::string hier_name, sc_core::sc_attr_base* base_attr,
bool update =
false) {
566 auto param_handle = broker.get_param_handle(hier_name);
567 if(!param_handle.is_valid()) {
568 if(create_cci_param<int>(base_attr, hier_name, params, broker, cci_originator))
570 if(create_cci_param<unsigned>(base_attr, hier_name, params, broker, cci_originator))
572 if(create_cci_param<long>(base_attr, hier_name, params, broker, cci_originator))
574 if(create_cci_param<unsigned long>(base_attr, hier_name, params, broker, cci_originator))
576 if(create_cci_param<long long>(base_attr, hier_name, params, broker, cci_originator))
578 if(create_cci_param<unsigned long long>(base_attr, hier_name, params, broker, cci_originator))
580 if(create_cci_param<bool>(base_attr, hier_name, params, broker, cci_originator))
582 if(create_cci_param<float>(base_attr, hier_name, params, broker, cci_originator))
584 if(create_cci_param<double>(base_attr, hier_name, params, broker, cci_originator))
586 if(create_cci_param<std::string>(base_attr, hier_name, params, broker, cci_originator))
588 if(create_cci_param<char*>(base_attr, hier_name, params, broker, cci_originator))
591 if(update_cci_param<int>(param_handle, base_attr))
593 if(update_cci_param<unsigned>(param_handle, base_attr))
595 if(update_cci_param<long>(param_handle, base_attr))
597 if(update_cci_param<unsigned long>(param_handle, base_attr))
599 if(update_cci_param<long long>(param_handle, base_attr))
601 if(update_cci_param<unsigned long long>(param_handle, base_attr))
603 if(update_cci_param<bool>(param_handle, base_attr))
605 if(update_cci_param<float>(param_handle, base_attr))
607 if(update_cci_param<double>(param_handle, base_attr))
609 if(update_cci_param<std::string>(param_handle, base_attr))
611 if(update_cci_param<char*>(param_handle, base_attr))
617 void mirror_sc_attributes(configurer::broker_t& broker, configurer::cci_param_cln& params, cci::cci_originator& cci_originator,
618 sc_core::sc_object* topobj =
nullptr,
bool update =
false) {
619 for(
auto obj : get_sc_objects(topobj)) {
620 if(
auto mod =
dynamic_cast<sc_core::sc_module*
>(obj)) {
621 for(
auto base_attr : mod->attr_cltn()) {
622 std::string hier_name = fmt::format(
"{}.{}", mod->name(), base_attr->name());
623 mirror_sc_attribute(broker, params, cci_originator, hier_name, base_attr, update);
625 mirror_sc_attributes(broker, params, cci_originator, mod, update);
630 bool cci_name_ignore(std::pair<std::string, cci::cci_value>
const& preset_value) {
631 std::string ending(SCC_LOG_LEVEL_PARAM_NAME);
632 auto& name = preset_value.first;
633 if(name.length() >= ending.length()) {
634 return (0 == name.compare(name.length() - ending.length(), ending.length(), ending));
641 struct configurer::ConfigHolder :
public yaml_config_reader {
642 ConfigHolder(configurer::broker_t& broker)
643 : yaml_config_reader(broker) {}
648 : json_config_reader(broker) {}
652 configurer::configurer(
const std::string& filename,
unsigned config_phases)
653 :
configurer(filename, config_phases,
"$$$configurer$$$") {}
655 configurer::configurer(
const std::string& filename,
unsigned config_phases, sc_core::sc_module_name nm)
657 , config_phases(config_phases)
661 if(filename.length() > 0)
662 read_input_file(filename);
665 configurer::~configurer() {}
667 void configurer::read_input_file(
const std::string& filename) {
669 std::ifstream is(filename);
674 SCCERR() <<
"Could not parse input file " << filename <<
", " << root->get_error_msg();
675 }
else if(!root->empty) {
676 root->configure_cci();
678 }
catch(std::runtime_error& e) {
679 SCCERR() <<
"Could not parse input file " << filename <<
", reason: " << e.what();
682 SCCWARN() <<
"Could not open input file " << filename;
690 yaml_config_dumper dumper(
cci_broker, with_description, complete, stop_list);
692 for(
auto* o : obj->get_child_objects()) {
693 dumper.dump_config(o, root);
696 dumper.dump_config(root);
701 OStreamWrapper stream(os);
702 writer_type writer(stream);
703 writer.StartObject();
704 json_config_dumper dumper(
cci_broker, stop_list);
705 for(
auto* o : get_sc_objects(obj)) {
706 dumper.dump_config(o, writer);
714 std::string hier_name = fmt::format(
"{}.{}", owner->name(), attr_base->name());
715 mirror_sc_attribute(
cci_broker, cci2sc_attr, cci_originator, hier_name, attr_base);
718 inline std::string hier_name_as_regex(std::string
const& parname) {
719 if(parname.find_first_of(
"*?[") != std::string::npos) {
721 }
else if(parname[0] ==
'^') {
728 auto regex_str = hier_name_as_regex(hier_name);
729 if(regex_str.length()) {
730 auto rr = std::regex(regex_str);
731 cci::cci_param_predicate pred = [rr](cci::cci_param_untyped_handle
const& hndl) {
return regex_match(hndl.name(), rr); };
732 for(
auto& hndl : cci_broker.get_param_handles(pred)) {
733 hndl.set_cci_value(value);
736 cci::cci_param_handle param_handle = cci_broker.get_param_handle(hier_name);
737 if(param_handle.is_valid()) {
738 param_handle.set_cci_value(value);
742 cci_broker.set_preset_cci_value(hier_name, value);
747 auto i = std::stoi(value);
753 auto l = std::stol(value);
759 auto ll = std::stoll(value);
765 auto f = std::stof(value);
771 auto d = std::stod(value);
777 if(lower_value ==
"true") {
781 if(lower_value ==
"false") {
788 void configurer::config_check() {
790 cci_broker.ignore_unconsumed_preset_values(&cci_name_ignore);
791 auto res =
cci_broker.get_unconsumed_preset_values();
793 std::ostringstream oss;
795 oss <<
"\t - " << val.first <<
"\n";
796 if(res.size() == 1) {
797 SCCWARN(
"scc::configurer") <<
"There is " << res.size() <<
" unused CCI preset value:\n"
798 << oss.str() <<
"Please check your setup!";
800 SCCWARN(
"scc::configurer") <<
"There are " << res.size() <<
" unused CCI preset values:\n"
801 << oss.str() <<
"Please check your setup!";
804 }
catch(std::domain_error& e) {
805 SCCFATAL(
"scc::configurer") <<
"Illegal hierarchy name: '" << e.what() <<
"'";
806 }
catch(std::invalid_argument& e) {
807 SCCFATAL(
"scc::configurer") <<
"Illegal parameter name: '" << e.what() <<
"'";
811 void configurer::start_of_simulation() {
812 if(config_phases & START_OF_SIMULATION)
815 if(dump_file_name.size()) {
816 auto as_json = util::ends_with(dump_file_name,
"json");
817 std::ofstream of{dump_file_name};
819 mirror_sc_attributes(cci_broker, cci2sc_attr, cci_originator,
nullptr,
true);
bool is_logging_initialized()
get the state of the SCC logging system
log get_logging_level()
get the SystemC logging level
std::string glob_to_regex(std::string val)
std::string str_tolower(std::string str)
T dir_name(T const &path, T const &delims="/\\")