17#include "configurer.h"
18#include "rapidjson/document.h"
19#include "rapidjson/error/en.h"
21#include <cci_configuration>
25#include <fmt/format.h>
28#include <rapidjson/istreamwrapper.h>
29#include <rapidjson/ostreamwrapper.h>
30#include <rapidjson/prettywriter.h>
31#include <unordered_map>
33#include <yaml-cpp/exceptions.h>
34#include <yaml-cpp/node/parse.h>
35#include <yaml-cpp/yaml.h>
38template <
typename T>
struct optional {
40 bool initialized{
false};
41 optional& operator=(T&& val) {
42 this->val = std::move(val);
46 operator bool()
const {
return initialized; }
47 T value() {
return val; }
52template <
typename T>
struct as_if<T, optional<T>> {
53 explicit as_if(
const YAML::Node& node_)
55 const YAML::Node& node;
56 const optional<T> operator()()
const {
59 if(node.m_pNode && YAML::convert<T>::decode(node, t))
66template <>
struct as_if<std::string, optional<std::string>> {
67 explicit as_if(
const YAML::Node& node_)
69 const YAML::Node& node;
70 const optional<std::string> operator()()
const {
71 optional<std::string> val;
73 if(node.m_pNode && YAML::convert<std::string>::decode(node, t))
82inline auto get_sc_objects(sc_core::sc_object* obj =
nullptr) ->
const std::vector<sc_core::sc_object*>& {
84 return obj->get_child_objects();
86 return sc_core::sc_get_top_level_objects();
90#define DIR_SEPARATOR '\\'
92#define DIR_SEPARATOR '/'
96 std::vector<std::string> includes{
"."};
97 void add_to_includes(std::string
const& path) {
98 for(
auto& e : includes) {
102 includes.push_back(path);
105 std::string find_in_include_path(std::string
const& file_name) {
106 if(file_name[0] ==
'/' || file_name[0] ==
'\\')
109 for(
auto& incl : includes) {
110 auto full_name = incl + DIR_SEPARATOR + file_name;
111 std::ifstream ifs(full_name);
121using namespace rapidjson;
122using writer_type = PrettyWriter<OStreamWrapper>;
124#define FDECL(TYPE, FUNC) \
125 inline void writeValue(writer_type& writer, std::string const& key, TYPE value) { \
126 writer.Key(key.c_str()); \
127 writer.FUNC(value); \
130FDECL(
unsigned int, Uint)
132FDECL(
unsigned long, Uint64)
133FDECL(
long long, Int64)
134FDECL(
unsigned long long, Uint64)
138FDECL(
char const*, String)
139inline void writeValue(writer_type& writer, std::string
const& key, std::string
const& value) {
140 writer.Key(key.c_str());
141 writer.String(value.c_str());
144inline bool start_object(writer_type& writer,
char const* key,
bool started) {
147 writer.StartObject();
152struct json_config_dumper {
153 configurer::broker_t
const& broker;
154 std::vector<std::string>
const& stop_list;
155 std::unordered_map<std::string, std::vector<cci::cci_param_untyped_handle>> lut;
156 json_config_dumper(configurer::broker_t
const& broker, std::vector<std::string>
const& stop_list)
158 , stop_list(stop_list) {
159 for(
auto& h : broker.get_param_handles()) {
160 auto value = h.get_cci_value();
161 std::string paramname{h.name()};
162 auto sep = paramname.rfind(
'.');
163 auto basename = paramname.substr(0, sep);
164 lut[basename].push_back(h);
168 void dump_config(sc_core::sc_object* obj, writer_type& writer) {
169 auto basename = std::string(obj->basename());
170 if(basename.substr(0, 3) ==
"$$$" || std::find(std::begin(stop_list), std::end(stop_list), obj->name()) != std::end(stop_list))
172 auto obj_started =
false;
173 auto log_lvl_set =
false;
174 auto it = lut.find(obj->name());
176 for(
auto& h : it->second) {
177 obj_started = start_object(writer, obj->basename(), obj_started);
178 auto value = h.get_cci_value();
179 std::string paramname{h.name()};
180 auto basename = paramname.substr(paramname.rfind(
'.') + 1);
181 if(basename == SCC_LOG_LEVEL_PARAM_NAME)
184 writeValue(writer, basename, (
bool)value.get_bool());
185 else if(value.is_int())
186 writeValue(writer, basename, (
int)value.get_int());
187 else if(value.is_int64())
188 writeValue(writer, basename,
static_cast<int64_t
>(value.get_int64()));
189 else if(value.is_uint())
190 writeValue(writer, basename, value.get_uint());
191 else if(value.is_uint64())
192 writeValue(writer, basename,
static_cast<uint64_t
>(value.get_uint64()));
193 else if(value.is_double())
194 writeValue(writer, basename, value.get_double());
195 else if(value.is_string())
196 writeValue(writer, basename, value.get_string().c_str());
198 auto mod =
dynamic_cast<sc_core::sc_module*
>(obj);
200 obj_started = start_object(writer, obj->basename(), obj_started);
201 auto val = broker.get_preset_cci_value(fmt::format(
"{}.{}", obj->name(), SCC_LOG_LEVEL_PARAM_NAME));
202 if(basename.substr(0, 3) !=
"$$$")
203 writeValue(writer, SCC_LOG_LEVEL_PARAM_NAME, val.is_int() ? val.get_int() :
static_cast<int>(
get_logging_level()));
205 for(
auto* o : get_sc_objects(obj)) {
206 obj_started = start_object(writer, obj->basename(), obj_started);
207 dump_config(o, writer);
214struct json_config_reader :
public config_reader {
215 configurer::broker_t& broker;
220 json_config_reader(configurer::broker_t& broker)
223 void parse(std::istream& is) {
224 IStreamWrapper stream(is);
225 document.ParseStream(stream);
226 valid = !document.HasParseError();
227 empty = document.IsNull();
229 std::string get_error_msg() {
230 std::ostringstream os;
231 os <<
" location " << (unsigned)document.GetErrorOffset() <<
", reason: " << GetParseError_En(document.GetParseError());
235 inline void configure_cci() { configure_cci_hierarchical(document,
""); }
237 void configure_cci_hierarchical(Value
const& value, std::string prefix) {
238 if(value.IsObject()) {
239 auto o = value.GetObject();
240 for(
auto itr = o.MemberBegin(); itr != o.MemberEnd(); ++itr) {
241 if(!itr->name.IsString())
243 std::string key_name = itr->name.GetString();
244 Value
const& val = itr->value;
245 auto hier_name = prefix.size() ? prefix +
"." + key_name : key_name;
246 if(val.IsNull() || val.IsArray())
248 else if(val.IsObject())
249 configure_cci_hierarchical(val, hier_name);
251 if(key_name ==
"!include") {
252 json_config_reader sub_reader(broker);
253 std::ifstream ifs(find_in_include_path(val.GetString()));
255 sub_reader.parse(ifs);
256 if(sub_reader.valid) {
257 sub_reader.configure_cci_hierarchical(sub_reader.document, prefix);
259 std::ostringstream os;
260 os <<
"Could not parse include file " << val.GetString();
261 throw std::runtime_error(os.str());
264 std::ostringstream os;
265 os <<
"Could not open include file " << val.GetString();
266 throw std::runtime_error(os.str());
269 auto param_handle = broker.get_param_handle(hier_name);
270 if(param_handle.is_valid()) {
272 param_handle.set_cci_value(cci::cci_value(std::string(val.GetString())));
273 }
else if(val.IsBool()) {
274 param_handle.set_cci_value(cci::cci_value(val.Get<
bool>()));
275 }
else if(val.IsInt()) {
276 param_handle.set_cci_value(cci::cci_value(val.Get<
int>()));
277 }
else if(val.IsInt64()) {
278 param_handle.set_cci_value(cci::cci_value(val.Get<int64_t>()));
279 }
else if(val.IsUint()) {
280 param_handle.set_cci_value(cci::cci_value(val.Get<
unsigned>()));
281 }
else if(val.IsUint64()) {
282 param_handle.set_cci_value(cci::cci_value(val.Get<uint64_t>()));
283 }
else if(val.IsDouble()) {
284 param_handle.set_cci_value(cci::cci_value(val.Get<
double>()));
288 broker.set_preset_cci_value(hier_name, cci::cci_value(std::string(val.GetString())));
289 }
else if(val.IsBool()) {
290 broker.set_preset_cci_value(hier_name, cci::cci_value(val.Get<
bool>()));
291 }
else if(val.IsInt()) {
292 broker.set_preset_cci_value(hier_name, cci::cci_value(val.Get<
int>()));
293 }
else if(val.IsInt64()) {
294 broker.set_preset_cci_value(hier_name, cci::cci_value(val.Get<int64_t>()));
295 }
else if(val.IsUint()) {
296 broker.set_preset_cci_value(hier_name, cci::cci_value(val.Get<
unsigned>()));
297 }
else if(val.IsUint64()) {
298 broker.set_preset_cci_value(hier_name, cci::cci_value(val.Get<uint64_t>()));
299 }
else if(val.IsDouble()) {
300 broker.set_preset_cci_value(hier_name, cci::cci_value(val.Get<
double>()));
316struct yaml_config_dumper {
317 configurer::broker_t
const& broker;
318 bool with_description{
false};
320 std::vector<std::string>
const& stop_list;
321 std::unordered_map<std::string, std::vector<cci::cci_param_untyped_handle>> lut;
322 std::vector<cci::cci_param_untyped_handle> tl_lut;
323 yaml_config_dumper(configurer::broker_t
const& broker,
bool with_description,
bool complete, std::vector<std::string>
const& stop_list)
325 , with_description(with_description)
327 , stop_list(stop_list) {
328 for(
auto& h : broker.get_param_handles()) {
329 auto value = h.get_cci_value();
330 std::string paramname{h.name()};
331 auto sep = paramname.rfind(
'.');
332 if(sep == std::string::npos) {
335 auto basename = paramname.substr(0, sep);
336 lut[basename].push_back(h);
341 void dump_config(YAML::Node& base_node) {
342 copy2yaml(tl_lut, base_node);
343 for(
auto* o : sc_core::sc_get_top_level_objects()) {
344 dump_config(o, base_node);
348 void dump_config(sc_core::sc_object* obj, YAML::Node& base_node) {
349 auto basename = std::string(obj->basename());
350 if(basename.substr(0, 3) ==
"$$$" || std::find(std::begin(stop_list), std::end(stop_list), obj->name()) != std::end(stop_list))
352 auto obj_started =
false;
353 auto log_lvl_set =
false;
354 auto it = lut.find(obj->name());
355 YAML::Node this_node;
357 log_lvl_set |= copy2yaml(it->second, this_node);
358 auto mod =
dynamic_cast<sc_core::sc_module*
>(obj);
359 if(!log_lvl_set && mod && complete) {
360 auto val = broker.get_preset_cci_value(fmt::format(
"{}.{}", obj->name(), SCC_LOG_LEVEL_PARAM_NAME));
362 if(basename.substr(0, 11) !=
"scc_tracer")
363 this_node[
"log_level"] = val.is_int() ? val.get_int() : global_verb;
365 for(
auto* o : get_sc_objects(obj)) {
366 dump_config(o, this_node);
369 base_node[obj->basename()] = this_node;
373 bool copy2yaml(
const std::vector<cci::cci_param_untyped_handle>& params, YAML::Node& this_node) {
374 bool log_lvl_set =
false;
375 for(
auto& h : params) {
376 auto value = h.get_cci_value();
377 std::string paramname{h.name()};
378 auto basename = paramname.substr(paramname.rfind(
'.') + 1);
379 if(basename == SCC_LOG_LEVEL_PARAM_NAME)
382 auto descr = h.get_description();
383 if(with_description && descr.size()) {
384 auto descr_name = fmt::format(
"{}::descr", basename);
385 this_node[descr_name] = descr;
386 this_node[descr_name].SetTag(
"desc");
390 this_node[basename] = (bool)(value.get_bool());
391 else if(value.is_int())
392 this_node[basename] = (int)(value.get_int());
393 else if(value.is_int64())
394 this_node[basename] =
static_cast<int64_t
>(value.get_int64());
395 else if(value.is_uint())
396 this_node[basename] = value.get_uint();
397 else if(value.is_uint64())
398 this_node[basename] =
static_cast<uint64_t
>(value.get_uint64());
399 else if(value.is_double())
400 this_node[basename] = value.get_double();
401 else if(value.is_string())
402 this_node[basename] = value.get_string().c_str();
403 else if(value.try_get(t))
404 this_node[basename] = t.to_string();
410struct yaml_config_reader :
public config_reader {
411 configurer::broker_t& broker;
416 yaml_config_reader(configurer::broker_t& broker)
419 void parse(std::istream& is) {
420 std::string buf((std::istreambuf_iterator<char>(is)), std::istreambuf_iterator<char>());
421 document = YAML::Load(buf);
422 valid = document.IsDefined() && (document.IsMap() || document.IsNull());
423 empty = document.IsNull();
426 std::string get_error_msg() {
return "YAML file does not start with a map"; }
428 inline void configure_cci() {
430 configure_cci_hierarchical(document,
"");
431 }
catch(YAML::ParserException& e) {
432 throw std::runtime_error(e.what());
433 }
catch(YAML::BadFile& e) {
434 throw std::runtime_error(e.what());
435 }
catch(YAML::Exception& e) {
436 throw std::runtime_error(e.what());
440 void configure_cci_hierarchical(YAML::Node
const& value, std::string
const& prefix) {
442 for(
auto it = value.begin(); it != value.end(); ++it) {
443 auto key_name = it->first.as<std::string>();
444 YAML::Node
const& val = it->second;
445 auto hier_name = prefix.size() ? prefix +
"." + key_name : key_name;
446 if(!val.IsDefined() || val.IsSequence())
449 configure_cci_hierarchical(val, hier_name);
450 else if(val.IsScalar()) {
451 auto& tag = val.Tag();
452 if(tag ==
"!include") {
453 yaml_config_reader sub_reader(broker);
454 std::ifstream ifs(find_in_include_path(val.as<std::string>()));
456 sub_reader.parse(ifs);
457 if(sub_reader.valid) {
458 sub_reader.configure_cci_hierarchical(sub_reader.document, hier_name);
460 std::ostringstream os;
461 os <<
"Could not parse include file " << val.as<std::string>();
462 throw std::runtime_error(os.str());
465 std::ostringstream os;
466 os <<
"Could not open include file " << val.as<std::string>();
467 throw std::runtime_error(os.str());
469 }
else if(tag.size() && tag[0] ==
'?') {
470 auto param_handle = broker.get_param_handle(hier_name);
471 if(param_handle.is_valid()) {
472 auto param = param_handle.get_cci_value();
473 if(param.is_bool()) {
474 param.set_bool(val.as<
bool>());
475 }
else if(param.is_int()) {
476 param.set_int(val.as<
int>());
477 }
else if(param.is_uint()) {
478 param.set_uint(val.as<
unsigned>());
479 }
else if(param.is_int64()) {
480 param.set_int64(val.as<int64_t>());
481 }
else if(param.is_uint64()) {
482 param.set_uint64(val.as<uint64_t>());
483 }
else if(param.is_double()) {
484 param.set_double(val.as<
double>());
485 }
else if(param.is_string()) {
486 param.set_string(val.as<std::string>());
489 if(
auto res = YAML::as_if<
bool, optional<bool>>(val)()) {
490 broker.set_preset_cci_value(hier_name, cci::cci_value(res.value()));
491 }
else if(
auto res = YAML::as_if<
int, optional<int>>(val)()) {
492 broker.set_preset_cci_value(hier_name, cci::cci_value(res.value()));
493 }
else if(
auto res = YAML::as_if<int64_t, optional<int64_t>>(val)()) {
494 broker.set_preset_cci_value(hier_name, cci::cci_value(res.value()));
495 }
else if(
auto res = YAML::as_if<
unsigned, optional<unsigned>>(val)()) {
496 broker.set_preset_cci_value(hier_name, cci::cci_value(res.value()));
497 }
else if(
auto res = YAML::as_if<uint64_t, optional<uint64_t>>(val)()) {
498 broker.set_preset_cci_value(hier_name, cci::cci_value(res.value()));
499 }
else if(
auto res = YAML::as_if<
double, optional<double>>(val)()) {
500 broker.set_preset_cci_value(hier_name, cci::cci_value(res.value()));
501 }
else if(
auto res = YAML::as_if<std::string, optional<std::string>>(val)()) {
502 broker.set_preset_cci_value(hier_name, cci::cci_value(res.value()));
505 }
else if(tag.size() && tag[0] ==
'!') {
506 auto param_handle = broker.get_param_handle(hier_name);
507 if(param_handle.is_valid()) {
508 auto param = param_handle.get_cci_value();
509 if(param.is_string()) {
510 param.set_string(val.as<std::string>());
513 if(
auto res = YAML::as_if<std::string, optional<std::string>>(val)()) {
514 broker.set_preset_cci_value(hier_name, cci::cci_value(res.value()));
528inline bool create_cci_param(sc_core::sc_attr_base* base_attr,
const std::string& hier_name, configurer::cci_param_cln& params,
529 configurer::broker_t& broker, cci::cci_originator& cci_originator) {
530 if(
auto attr =
dynamic_cast<sc_core::sc_attribute<T>*
>(base_attr)) {
531 auto par =
new cci::cci_param_typed<T>(hier_name, attr->value, broker,
"", cci::CCI_ABSOLUTE_NAME, cci_originator);
532 params.emplace_back(cci::cci_param_post_write_callback_untyped([attr](
const cci::cci_param_write_event<>& ev) {
534 if(ev.new_value.try_get(result))
535 attr->value = result;
538 par->register_post_write_callback(params.back().first);
539 attr->value = par->get_value();
546inline bool create_cci_param<char*>(sc_core::sc_attr_base* base_attr,
const std::string& hier_name, configurer::cci_param_cln& params,
547 configurer::broker_t& broker, cci::cci_originator& cci_originator) {
548 if(
auto attr =
dynamic_cast<sc_core::sc_attribute<char*>*
>(base_attr)) {
549 auto par =
new cci::cci_param_typed<std::string>(hier_name, attr->value, broker,
"", cci::CCI_ABSOLUTE_NAME);
550 params.emplace_back(cci::cci_param_post_write_callback_untyped([attr](
const cci::cci_param_write_event<>& ev) {
553 attr->value = strdup(ev.new_value.get<std::string>().c_str());
556 par->register_post_write_callback(params.back().first);
557 attr->value = strdup(par->get_value().c_str());
563template <
typename T>
inline bool update_cci_param(cci::cci_param_untyped_handle& param_handle, sc_core::sc_attr_base* base_attr) {
564 if(
auto attr =
dynamic_cast<sc_core::sc_attribute<T>*
>(base_attr)) {
565 param_handle.set_cci_value(cci::cci_value(attr->value));
571template <>
inline bool update_cci_param<char*>(cci::cci_param_untyped_handle& param_handle, sc_core::sc_attr_base* base_attr) {
572 if(
auto attr =
dynamic_cast<sc_core::sc_attribute<char*>*
>(base_attr)) {
573 param_handle.set_cci_value(cci::cci_value(std::string(attr->value)));
579inline bool mirror_sc_attribute(configurer::broker_t& broker, configurer::cci_param_cln& params, cci::cci_originator& cci_originator,
580 std::string hier_name, sc_core::sc_attr_base* base_attr,
bool update =
false) {
581 auto param_handle = broker.get_param_handle(hier_name);
582 if(!param_handle.is_valid()) {
583 if(create_cci_param<int>(base_attr, hier_name, params, broker, cci_originator))
585 if(create_cci_param<unsigned>(base_attr, hier_name, params, broker, cci_originator))
587 if(create_cci_param<long>(base_attr, hier_name, params, broker, cci_originator))
589 if(create_cci_param<unsigned long>(base_attr, hier_name, params, broker, cci_originator))
591 if(create_cci_param<long long>(base_attr, hier_name, params, broker, cci_originator))
593 if(create_cci_param<unsigned long long>(base_attr, hier_name, params, broker, cci_originator))
595 if(create_cci_param<bool>(base_attr, hier_name, params, broker, cci_originator))
597 if(create_cci_param<float>(base_attr, hier_name, params, broker, cci_originator))
599 if(create_cci_param<double>(base_attr, hier_name, params, broker, cci_originator))
601 if(create_cci_param<std::string>(base_attr, hier_name, params, broker, cci_originator))
603 if(create_cci_param<char*>(base_attr, hier_name, params, broker, cci_originator))
606 if(update_cci_param<int>(param_handle, base_attr))
608 if(update_cci_param<unsigned>(param_handle, base_attr))
610 if(update_cci_param<long>(param_handle, base_attr))
612 if(update_cci_param<unsigned long>(param_handle, base_attr))
614 if(update_cci_param<long long>(param_handle, base_attr))
616 if(update_cci_param<unsigned long long>(param_handle, base_attr))
618 if(update_cci_param<bool>(param_handle, base_attr))
620 if(update_cci_param<float>(param_handle, base_attr))
622 if(update_cci_param<double>(param_handle, base_attr))
624 if(update_cci_param<std::string>(param_handle, base_attr))
626 if(update_cci_param<char*>(param_handle, base_attr))
632void mirror_sc_attributes(configurer::broker_t& broker, configurer::cci_param_cln& params, cci::cci_originator& cci_originator,
633 sc_core::sc_object* topobj =
nullptr,
bool update =
false) {
634 for(
auto obj : get_sc_objects(topobj)) {
635 if(
auto mod =
dynamic_cast<sc_core::sc_module*
>(obj)) {
636 for(
auto base_attr : mod->attr_cltn()) {
637 std::string hier_name = fmt::format(
"{}.{}", mod->name(), base_attr->name());
638 mirror_sc_attribute(broker, params, cci_originator, hier_name, base_attr, update);
640 mirror_sc_attributes(broker, params, cci_originator, mod, update);
645bool cci_name_ignore(std::pair<std::string, cci::cci_value>
const& preset_value) {
646 std::string ending(SCC_LOG_LEVEL_PARAM_NAME);
647 auto& name = preset_value.first;
648 if(name.length() >= ending.length()) {
649 return (0 == name.compare(name.length() - ending.length(), ending.length(), ending));
656struct configurer::ConfigHolder :
public yaml_config_reader {
657 ConfigHolder(configurer::broker_t& broker)
658 : yaml_config_reader(broker) {}
662 ConfigHolder(configurer::broker_t& broker)
663 : json_config_reader(broker) {}
668:
configurer(filename, config_phases,
"$$$configurer$$$") {}
672, config_phases(config_phases)
676 if(filename.length() > 0)
677 read_input_file(filename);
680configurer::~configurer() {}
682void configurer::read_input_file(
const std::string& filename) {
684 std::ifstream is(filename);
689 SCCERR() <<
"Could not parse input file " << filename <<
", " << root->get_error_msg();
690 }
else if(!root->empty) {
691 root->configure_cci();
693 }
catch(std::runtime_error& e) {
694 SCCERR() <<
"Could not parse input file " << filename <<
", reason: " << e.what();
697 SCCWARN() <<
"Could not open input file " << filename;
705 yaml_config_dumper dumper(cci_broker, with_description, complete, stop_list);
707 for(
auto* o : obj->get_child_objects()) {
708 dumper.dump_config(o, root);
711 dumper.dump_config(root);
716 OStreamWrapper stream(os);
717 writer_type writer(stream);
718 writer.StartObject();
719 json_config_dumper dumper(cci_broker, stop_list);
720 for(
auto* o : get_sc_objects(obj)) {
721 dumper.dump_config(o, writer);
729 std::string hier_name = fmt::format(
"{}.{}", owner->name(), attr_base->name());
730 mirror_sc_attribute(cci_broker, cci2sc_attr, cci_originator, hier_name, attr_base);
733inline std::string hier_name_as_regex(std::string
const& parname) {
734 if(parname.find_first_of(
"*?[") != std::string::npos) {
736 }
else if(parname[0] ==
'^') {
743 auto regex_str = hier_name_as_regex(hier_name);
744 if(regex_str.length()) {
745 auto rr = std::regex(regex_str);
746 cci::cci_param_predicate pred = [rr](cci::cci_param_untyped_handle
const& hndl) {
return regex_match(hndl.name(), rr); };
747 for(
auto& hndl : cci_broker.get_param_handles(pred)) {
748 hndl.set_cci_value(value);
751 cci::cci_param_handle param_handle = cci_broker.get_param_handle(hier_name);
752 if(param_handle.is_valid()) {
753 param_handle.set_cci_value(value);
757 cci_broker.set_preset_cci_value(hier_name, value);
762 std::string int_str = value;
763 if(value[0] ==
'-') {
765 int_str = value.substr(1);
768 if(int_str[0] ==
'0') {
769 if(int_str[1] ==
'x' || int_str[1] ==
'X') {
771 int_str = int_str.substr(2);
774 int_str = int_str.substr(1);
780 auto ull = std::strtoull(int_str.c_str(), &end_str, int_base);
781 if((end_str - int_str.c_str()) == int_str.length() && !errno) {
783 if(ull <= std::numeric_limits<int64_t>::max()) {
784 int64_t ll = sign * ull;
785 if(ll >= std::numeric_limits<int>::min()) {
786 set_value(hier_name,
static_cast<int>(ll));
789 if(ll >= std::numeric_limits<long>::min()) {
790 set_value(hier_name,
static_cast<long>(ll));
793 if(ll >= std::numeric_limits<long long>::min()) {
794 set_value(hier_name,
static_cast<long long>(ll));
799 if(ull <= std::numeric_limits<int>::max()) {
800 set_value(hier_name,
static_cast<int>(ull));
803 if(ull <= std::numeric_limits<unsigned int>::max()) {
804 set_value(hier_name,
static_cast<unsigned int>(ull));
807 if(ull <= std::numeric_limits<long>::max()) {
808 set_value(hier_name,
static_cast<long>(ull));
811 if(ull <= std::numeric_limits<unsigned long>::max()) {
812 set_value(hier_name,
static_cast<unsigned long>(ull));
815 if(ull <= std::numeric_limits<long long>::max()) {
816 set_value(hier_name,
static_cast<long long>(ull));
819 if(ull <= std::numeric_limits<unsigned long long>::max()) {
820 set_value(hier_name,
static_cast<unsigned long long>(ull));
826 auto f = std::strtof(int_str.c_str(), &end_str);
827 if(!errno && (end_str - int_str.c_str()) == int_str.length()) {
831 auto d = std::strtod(int_str.c_str(), &end_str);
832 if(!errno && (end_str - int_str.c_str()) == int_str.length()) {
837 if(lower_value ==
"true") {
841 if(lower_value ==
"false") {
848void configurer::config_check() {
850 cci_broker.ignore_unconsumed_preset_values(&cci_name_ignore);
851 auto res =
cci_broker.get_unconsumed_preset_values();
853 std::ostringstream oss;
855 oss <<
"\t - " << val.first <<
"\n";
856 if(res.size() == 1) {
857 SCCWARN(
"scc::configurer") <<
"There is " << res.size() <<
" unused CCI preset value:\n"
858 << oss.str() <<
"Please check your setup!";
860 SCCWARN(
"scc::configurer") <<
"There are " << res.size() <<
" unused CCI preset values:\n"
861 << oss.str() <<
"Please check your setup!";
864 }
catch(std::domain_error& e) {
865 SCCFATAL(
"scc::configurer") <<
"Illegal hierarchy name: '" << e.what() <<
"'";
866 }
catch(std::invalid_argument& e) {
867 SCCFATAL(
"scc::configurer") <<
"Illegal parameter name: '" << e.what() <<
"'";
871void configurer::start_of_simulation() {
872 if(config_phases & START_OF_SIMULATION)
875 if(dump_file_name.size()) {
876 auto as_json = util::ends_with(dump_file_name,
"json");
877 std::ofstream of{dump_file_name};
879 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="/\\")