21#include <unordered_map>
31#include "sparta/simulation/TreeNodeExtensions.hpp"
33#include "sparta/utils/Utils.hpp"
37#include "sparta/utils/StringManager.hpp"
44#ifndef TREENODE_LIFETIME_TRACE
58#define ALPHANUM_CHARS \
59 "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890_"
62#define DIGIT_CHARS "0123456789"
69#define RESERVED_WORDS {"and", "del", "from", "not", \
70 "while", "as", "elif", "global", \
71 "or", "with", "assert", "else", \
72 "if", "pass", "yield", "break", \
73 "except", "import", "print", "class", \
74 "exec", "in", "raise", "continue", \
75 "finally", "is", "return", "def", \
76 "for", "lambda", "try", "__init__", \
77 "__del__", "__cinit__", "__dealloc__", \
79 "name", "author", "report", "content", \
149#define REGISTER_FOR_NOTIFICATION(func, datat, name) \
150 registerForNotification<datat, \
151 typename std::remove_reference<decltype(*this)>::type, \
152 &std::remove_reference<decltype(*this)>::type::func>(this, name);
159#define DEREGISTER_FOR_NOTIFICATION(func, datat, name) \
160 deregisterForNotification<datat, \
161 typename std::remove_reference<decltype(*this)>::type, \
162 &std::remove_reference<decltype(*this)>::type::func>(this, name);
164#define NOTIFY(func, datat, name) \
174 class VirtualGlobalTreeNode;
176 class TreeNodePrivateAttorney;
280 typedef std::map<const std::string*, std::vector<TreeNode*>>
TagsMap;
434 <<
"TREE_CONFIGURING phase, so it cannot enter TREE_LOCKDOWN";
436 lockdownParametersUtil_();
439 static const std::map<const TreeNode*, WeakPtr>& getParentlessNodes();
572 const std::string& name,
573 const std::string& group,
575 const std::string& desc,
584 const std::string& name,
585 const std::string& group,
587 const std::string& desc);
594 const std::string& group,
596 const std::string& desc);
610 const std::string& name,
611 const std::string& desc);
626 const std::string& group,
628 const std::string& desc);
638 const std::string& desc);
702 void addTags(
const std::vector<std::string>& v);
722 virtual std::string
stringize(
bool pretty=
false)
const {
724 std::stringstream ss;
743 if(tags_.size() > 0){
746 for(
auto & tag : tags_){
838 const std::vector<const std::string*>&
getTags()
const;
843 bool hasTag(
const std::string& tag)
const;
852 bool hasTag(
const std::string* interned_tag_name)
const;
929 const std::string& group,
988 template <class T, typename = typename std::enable_if<std::is_pointer<T>::value>::type>
990 const T result =
dynamic_cast<const T
>(
getParent());
991 if(result ==
nullptr){
1002 template <class T, typename = typename std::enable_if<!std::is_pointer<T>::value>::type>
1003 const T*
getParentAs(
bool must_exist=
true)
const {
1008 template <class T, typename = typename std::enable_if<std::is_pointer<T>::value>::type>
1010 T result =
dynamic_cast<T
>(
getParent());
1011 if(result ==
nullptr){
1013 throw SpartaException(
"Could not get parent of ")
1022 template <class T, typename = typename std::enable_if<!std::is_pointer<T>::value>::type>
1124 bool ignore_builtin_group=
true,
1125 bool ignore_anonymous_nodes=
true);
1137 uint32_t orig_size = results.size();
1140 if (
dynamic_cast<T*
>(child))
1142 results.emplace_back(
static_cast<T*
>(child));
1145 return results.size() - orig_size;
1179 template <
typename T>
1224 template<
typename T>
1227 static_assert(!std::is_pointer<T>::value && !std::is_reference<T>::value,
1228 "Expected a non-pointer/non-reference T template argument");
1269 bool ignore_builtin_group=
true)
const;
1317 std::vector<TreeNode*>& results);
1421 std::vector<TreeNode*>& results,
1422 std::vector<std::vector<std::string>>& replacements)
1424 return findChildren_(pattern, results, replacements,
false );
1431 std::vector<TreeNode*>& results)
1433 return findChildren_(pattern, results,
false );
1446 std::vector<TreeNode*>& found,
1447 std::vector<std::vector<std::string>>& replacements,
1448 bool allow_private=
false);
1454 std::vector<TreeNode*>& found,
1455 bool allow_private=
false);
1461 std::vector<const TreeNode*>& found,
1462 std::vector<std::vector<std::string>>& replacements,
1463 bool allow_private=
false)
const;
1470 std::vector<const TreeNode*>& found,
1471 bool allow_private=
false)
const;
1531 bool must_exist=
true)
1533 return getChild_(name, must_exist,
false );
1538 bool must_exist=
true)
const
1540 return getChild_(name, must_exist,
false );
1572 return hasChild_(name,
false );
1603 typename =
typename std::enable_if<std::is_pointer<T>::value>::type,
1604 class ConstT =
typename ptr_to_const_obj_ptr<T>::type>
1605 const ConstT
getChildAs(
const std::string& name,
bool must_exist=
true)
const {
1606 static_assert(std::is_base_of<TreeNode, typename std::remove_pointer<T>::type>::value ==
true,
1607 "Cannot use getChildAs with a type argument that is not a subclass of " \
1608 "TreeNode. If the caller is looking for a resource, use " \
1609 "getChild(name)->getResource instead.");
1611 const ConstT result =
dynamic_cast<ConstT
>(child);
1612 if(result ==
nullptr){
1615 <<
getLocation() <<
"\" with the relative path \""
1616 << name <<
"\" that was of type: const "
1617 <<
demangle(
typeid(T*).name()) <<
". Found node of type "
1618 <<
demangle(
typeid(*child).name());
1626 template <class T, typename = typename std::enable_if<!std::is_pointer<T>::value>::type>
1627 const T*
getChildAs(
const std::string& name,
bool must_exist=
true)
const {
1632 template <class T, typename = typename std::enable_if<std::is_pointer<T>::value>::type>
1633 T
getChildAs(
const std::string& name,
bool must_exist=
true) {
1634 static_assert(std::is_base_of<TreeNode, typename std::remove_pointer<T>::type>::value ==
true,
1635 "Cannot use getChildAs with a type argument that is not a subclass of " \
1636 "TreeNode. If the caller is looking for a resource, use " \
1637 "getChild(name)->getResource instead.");
1639 T result =
dynamic_cast<T
>(child);
1640 if(result ==
nullptr){
1642 throw SpartaException(
"Could not find child of \"")
1643 <<
getLocation() <<
"\" with the relative path \""
1644 << name <<
"\" that was of type: " <<
demangle(
typeid(T).name())
1645 <<
". Found node of type "<<
demangle(
typeid(*child).name());
1653 template <class T, typename = typename std::enable_if<!std::is_pointer<T>::value>::type>
1654 T*
getChildAs(
const std::string& name,
bool must_exist=
true) {
1671 typename =
typename std::enable_if<std::is_pointer<T>::value>::type,
1672 class ConstT =
typename ptr_to_const_obj_ptr<T>::type>
1674 static_assert(std::is_base_of<TreeNode, typename std::remove_pointer<T>::type>::value ==
true,
1675 "Cannot use getAs with a type argument that is not a subclass of " \
1677 ConstT result =
dynamic_cast<typename ptr_to_const_obj_ptr<T>::type
>(
this);
1678 if(result ==
nullptr){
1695 template <class T, typename = typename std::enable_if<!std::is_pointer<T>::value>::type>
1710 template <class T, typename = typename std::enable_if<std::is_pointer<T>::value>::type>
1712 static_assert(std::is_base_of<TreeNode, typename std::remove_pointer<T>::type>::value ==
true,
1713 "Cannot use getAs with a type argument that is not a subclass of " \
1715 T result =
dynamic_cast<T
>(
this);
1716 if(result ==
nullptr){
1733 template <class T, typename = typename std::enable_if<!std::is_pointer<T>::value>::type>
1756 std::vector<TreeNode*>& results,
1757 int32_t max_depth=-1);
1773 int32_t max_depth=-1)
const;
1830 bool show_builtins=false,
1831 bool names_only=false,
1832 bool hide_hidden=false,
1833 bool(*leaf_filt_fxn)(const
TreeNode*) =
nullptr) const;
1852 template <typename T>
1854 uint32_t count =
dynamic_cast<const typename std::remove_const<typename std::remove_pointer<T>::type
>::type*>(
this) !=
nullptr;
1855 for(
auto& child : children_){
1856 count += child->getRecursiveNodeCount<T>();
1882 using ExtensionsBase = detail::ExtensionsBase;
1894 std::function<ExtensionsBase*()> factory);
1908 ExtensionsBase *
getExtension(
const std::string & extension_name,
bool no_factory_ok=
false);
1919 const ExtensionsBase *
getExtension(
const std::string & extension_name)
const;
1925 template <
typename T>
1927 static_assert(std::is_base_of<ExtensionsBase, T>::value);
1933 auto ret =
dynamic_cast<T*
>(ext);
1936 << extension_name <<
"' to " <<
typeid(T).name() <<
". "
1937 <<
"Actual extension type is " << ext->getClassName() <<
".";
1947 template <
typename T>
1949 static_assert(std::is_base_of<ExtensionsBase, T>::value);
1955 auto ret =
dynamic_cast<const T*
>(ext);
1958 << extension_name <<
"' to " <<
typeid(T).name() <<
". "
1959 <<
"Actual extension type is " << ext->getClassName() <<
".";
2006 bool replace=
false);
2044 template <
typename Extension,
typename... Args>
2046 static_assert(std::is_base_of<ExtensionsBase, Extension>::value);
2048 throw SpartaException(
"Extension already exists: ") << Extension::NAME;
2051 std::shared_ptr<ExtensionsBase> ext(
new Extension(std::forward<Args>(args)...));
2052 ext->setParameters(std::make_unique<ParameterSet>(
nullptr));
2055 addExtension_(Extension::NAME, ext);
2056 return dynamic_cast<Extension*
>(ext.get());
2070 template <
typename Extension,
typename... Args>
2072 static_assert(std::is_base_of<ExtensionsBase, Extension>::value);
2074 return addExtension<Extension, Args...>(std::forward<Args>(args)...);
2093 template <
typename T>
2100 return dynamic_cast<const T*
>(ext) !=
nullptr;
2134 std::map<std::string, const ExtensionsBase*> extensions;
2138 extensions[ext_name] = ext;
2208 incrementPrivacyLevel_(1);
2216 is_scope_root_ =
true;
2225 return is_scope_root_;
2241 return working_clock_;
2261 return working_clock_;
2266 const Clock* c = n->getLocalClock();
2433 void lockdownParametersUtil_(){
2434 for(
auto child : children_){
2435 child->lockdownParametersUtil_();
2437 special_params_lockdown_ =
true;
2454 static void trackParentlessNode_(
TreeNode* node);
2464 static void untrackParentlessNode_(
TreeNode* node);
2478 static void trackNode_(
TreeNode* node);
2501 static void untrackNode_(
TreeNode* node)
noexcept;
2510 void informAddedChildSubtree_();
2521 void informAddedChildAncestors_(
TreeNode* des);
2529 void incrementGetChildCount_(
const std::string& name)
const;
2562 virtual void setParent_(
TreeNode* parent,
bool inherit_phase);
2570 void addChild_(
TreeNode* child,
bool inherit_phase);
2601 void getLocation_(std::stringstream& ss,
bool anticipate_parent=
false)
const;
2607 void getDisplayLocation_(std::stringstream& ss)
const;
2624 uint32_t renderSubtree_(std::stringstream& ss,
2630 bool(*leaf_filt_fxn)(
const TreeNode*))
const;
2642 getImmediateChildByIdentity_(
const std::string& name,
2643 bool must_exist=
true)
2649 getImmediateChildByIdentity_(
const std::string& name,
2650 bool must_exist=
true)
2659 void ensureNoParent_(
const char* action);
2665 OneWayBool<false> special_params_lockdown_;
2682 std::vector<std::string>& replacements);
2720 size_t name_pos)
const;
2901 bool ignore_group_collision=false);
2953 return special_params_lockdown_;
2971 typedef void (*stub_type)(
void* obj,
2981 reveals_origin(
true)
2985 object_ptr(d.object_ptr),
2986 obs_point(d.obs_point),
2987 name_ptr(d.name_ptr),
2988 stub_ptr(d.stub_ptr),
2989 reveals_origin(d.reveals_origin)
2996 object_ptr = d.object_ptr;
2997 obs_point = d.obs_point;
2998 name_ptr = d.name_ptr;
2999 stub_ptr = d.stub_ptr;
3000 reveals_origin = d.reveals_origin;
3006 object_ptr(d.object_ptr),
3007 obs_point(d.obs_point),
3008 name_ptr(d.name_ptr),
3009 stub_ptr(d.stub_ptr),
3010 reveals_origin(d.reveals_origin)
3022 template <
class DataT,
class T, void (T::*TMethod)(
const TreeNode&,
3027 const std::string& name)
const
3029 return (stub_ptr == &method_stub<DataT, T, TMethod>)
3030 && (obj == object_ptr)
3031 && (&obs_pt == obs_point)
3032 && (name == *name_ptr);
3035 template <
class DataT,
class T,
void (T::*TMethod)(const DataT&)>
3036 constexpr bool equals(T* obj,
3038 const std::string& name)
const
3040 return (stub_ptr == &method_stub<DataT, T, TMethod>)
3041 && (obj == object_ptr)
3042 && (&obs_pt == obs_point)
3043 && (name == *name_ptr);
3055 return (stub_ptr == d.stub_ptr)
3056 && (object_ptr == d.object_ptr)
3057 && (obs_point == d.obs_point)
3058 && (name_ptr == d.name_ptr);
3081 return (&obs_pt == obs_point)
3091 template <
class DataT,
class T, void (T::*TMethod)(
const TreeNode&,
3096 const std::string& name)
3100 d.obs_point = &obs_pt;
3102 d.stub_ptr = &method_stub<DataT, T, TMethod>;
3106 template <
class DataT,
class T,
void (T::*TMethod)(const DataT&)>
3109 const std::string& name)
3113 d.obs_point = &obs_pt;
3115 d.stub_ptr = &method_stub<DataT, T, TMethod>;
3116 d.reveals_origin =
false;
3123 template <
typename DataT>
3125 const DataT& data)
const
3127 (*stub_ptr)(object_ptr, origin, obs_point, &data);
3130 const std::string* getNameID()
const {
3134 const TreeNode* getObservationPoint()
const {
3138 bool revealsOrigin()
const {
return reveals_origin; }
3148 template <
class DataT,
class T, void (T::*TMethod)(
const TreeNode&,
3151 static void method_stub(
void* obj,
3161 T* p =
static_cast<T*
>(obj);
3162 const DataT& d = *
static_cast<const DataT*
>(data);
3163 return (p->*TMethod)(origin, *obs_pt, d);
3166 template <
class DataT,
class T,
void (T::*TMethod)(const DataT&)>
3167 static void method_stub(
void* obj,
3174 T* p =
static_cast<T*
>(obj);
3175 const DataT& d = *
static_cast<const DataT*
>(data);
3176 return (p->*TMethod)(d);
3179 template <
class DataT, void (*TMethod)(
const TreeNode&,
3182 static void method_stub(
void* obj,
3188 const DataT& d = *
static_cast<const DataT*
>(data);
3189 return (*TMethod)(origin, *obs_pt, d);
3192 template <
class DataT,
void (*TMethod)(const DataT&)>
3193 static void method_stub(
void* obj,
3201 const DataT& d = *
static_cast<const DataT*
>(data);
3202 return (*TMethod)(d);
3220 const std::string* name_ptr;
3232 bool reveals_origin =
true;
3243 const std::type_info* tinfo_;
3252 hash_code_(rhp.hash_code_)
3257 hash_code_(tinfo.hash_code())
3261 return hash_code_ == rhp.hash_code_;
3265 return hash_code_ < rhp.hash_code_;
3268 const std::type_info& operator*()
const {
3272 const std::type_info* get()
const {
3296 template <
typename DataT>
3299 const std::string* name_id) {
3312 <<
"\", \"" << *name_id
3313 <<
"\"> which it did not properly announce through canGenerateNotification";
3316 propagateNotification_(origin, data, name_id);
3337 template <
typename DataT,
typename T, void (T::*TMethod)(
const TreeNode&,
3342 const std::string& target_name) {
3343 const DelegateVector::const_iterator dend = dvec.end();
3344 DelegateVector::iterator d;
3345 for(d=dvec.begin(); d!=dend; ++d){
3346 if(d->equals<DataT, T, TMethod>(obj, *
this, target_name)){
3354 template <
typename DataT,
typename T,
void (T::*TMethod)(const DataT&)>
3357 const std::string& target_name) {
3358 const DelegateVector::const_iterator dend = dvec.end();
3359 DelegateVector::iterator d;
3360 for(d=dvec.begin(); d!=dend; ++d){
3361 if(d->equals<DataT, T, TMethod>(obj, *
this, target_name)){
3391 const std::vector<const std::string*>& name_ids,
3394 const bool allow_private);
3410 const std::vector<const std::string*>& name_ids,
3413 const bool allow_private);
3421 const std::string& name,
3424 const bool private_only)
3437 const std::string& name,
3440 const bool private_only)
3455 template <
typename DataT>
3458 const std::string* name_id) {
3459 to_invoke->invokeDelegates_(
this, data, name_id);
3475 template <
typename DataT>
3476 void invokeDelegates_(
const TreeNode* origin,
3478 const std::string* name_id) {
3479 auto itr = obs_local_.find(
typeid(DataT));
3480 if(itr != obs_local_.end()){
3482 for(delegate& d : observers) {
3484 if(d.getNameID() == name_id
3510 template <
typename DataT>
3511 void propagateNotification_(
const TreeNode* origin,
3513 const std::string* name_id) {
3515 invokeDelegates_<DataT>(origin, data, name_id);
3518 getParent()->propagateNotification_(origin, data, name_id);
3542 const std::type_info* _tinfo,
3543 const std::string* _name) :
3649 template <
typename DataT=ANY_TYPE>
3651 const std::string& name=
"") {
3652 static_assert(std::is_same<
3653 typename std::remove_cv<
3654 typename std::remove_reference<
3655 typename std::remove_pointer<DataT>::type
3660 "DataT must NOT be a const, volatile, pointer, or reference"
3661 "type. It violates at least one of these restrictions");
3664 const std::string* name_id = strmgr.internString(name);
3665 return locateNotificationSources_<DataT>(nodes, name_id);
3675 template <
typename DataT=ANY_TYPE>
3677 std::vector<TreeNode*> nodes;
3680 o << n->stringize() << std::endl;
3726 const std::string* name)
const;
3738 const std::string& name)
const;
3773 const std::string* name)
const;
3785 const std::string& name)
const;
3792 const std::vector<const std::string*>& names)
const;
3876 template <
typename DataT,
typename T,
void (T::*TMethod)(const TreeNode&, const TreeNode&, const DataT&)>
3879 registerForNotification_<DataT, T, TMethod>(obj, name, ensure_possible,
false );
3883 template <
typename DataT,
typename T,
void (T::*TMethod)(const DataT&)>
3886 registerForNotification_<DataT, T, TMethod>(obj, name, ensure_possible,
false );
3898 template <
typename DataT,
typename T,
void (T::*TMethod)(const TreeNode&, const TreeNode&, const DataT&)>
3901 deregisterForNotification_<DataT, T, TMethod>(obj, name,
false );
3905 template <
typename DataT,
typename T,
void (T::*TMethod)(const DataT&)>
3908 deregisterForNotification_<DataT, T, TMethod>(obj, name,
false );
3919 const std::string* name)
const noexcept;
3931 const std::string* name,
3932 std::vector<delegate>& dels)
noexcept;
3941 const std::string* node_id);
3952 void incrementPrivacyLevel_(uint32_t privacy_increment)
3954 privacy_level_ += privacy_increment;
3955 for (
auto n : children_)
3957 n->incrementPrivacyLevel_(privacy_increment);
3981 virtual void onAddingChild_(
TreeNode* child) {
4009 virtual void onSettingParent_(
const TreeNode* parent)
const {
4031 virtual void onAddedAsChild_() noexcept {
4046 virtual void onDescendentSubtreeAdded_(
TreeNode* des)
noexcept {
4056 virtual void onDestroyingParent_() noexcept {
4066 virtual void onDestroyingChild_(
TreeNode* child)
noexcept {
4073 virtual void onConfiguring_() {;}
4078 virtual void onBindTreeEarly_() {;}
4083 virtual void onBindTreeLate_() {;}
4113 virtual void onEnteringTeardown_() noexcept {
4130 void addChildNameMapping_(
const std::string& name,
4137 template <
typename DataT>
4138 uint32_t locateNotificationSources_(std::vector<TreeNode*>& nodes,
const std::string* name_id){
4139 uint32_t additions = 0;
4141 const std::string* dummy;
4142 if(canGenerateNotification_(
typeid(DataT), name_id, dummy)){
4143 nodes.push_back(
this);
4148 additions += child->template locateNotificationSources_<DataT>(nodes, name_id);
4178 virtual void notificationObserverAdded_(
const std::type_info& tinfo,
4179 const std::string* name_id,
4181 const delegate* del) {
4207 virtual void notificationObserverRemoved_(
const std::type_info& tinfo,
4208 const std::string* name_id,
4210 const delegate* del) {
4245 virtual bool canGenerateNotification_(
const std::type_info& tinfo,
4246 const std::string* name,
4247 const std::string*& match)
const {
4265 virtual void getPossibleNotifications_(std::vector<NotificationInfo>& infos)
const {
4279 virtual void createResource_() {
4293 virtual void validateNode_()
const {
4303 bool canSeeChild_(
const TreeNode* node)
const
4307 return (privacy_level_ == node->privacy_level_);
4309 uint32_t findChildren_(
const std::string& pattern,
4310 std::vector<TreeNode*>& results,
4311 std::vector<std::vector<std::string>>& replacements,
4312 bool allow_private);
4317 uint32_t findChildren_(
const std::string& pattern,
4318 std::vector<TreeNode*>& results,
4319 bool allow_private);
4324 template <
typename DataT,
typename T,
void (T::*TMethod)(const TreeNode&, const TreeNode&, const DataT&)>
4325 void registerForNotification_(T* obj,
const std::string& name,
bool ensure_possible=
true,
bool allow_private=
false)
4327 (void)allow_private;
4328 const std::type_info& data_type =
typeid(DataT);
4330 throw SpartaException(
"Cannot registerForNotification for data type \"")
4331 <<
demangle(
typeid(DataT).name()) <<
"\" and name=\"" << name <<
"\" on node " <<
getLocation()
4332 <<
" with callback on \"" <<
demangle(
typeid(T).name()) <<
"\""
4333 <<
"\" because this notification cannot possibly be generated by any descendant of this "
4334 <<
"node. Set ensure_possible=false to prevent this check if additional notification "
4335 <<
"source descendants are expected to be added. "
4336 <<
"It is possible the node generating the desired notification is in a private sub tree.";
4341 throw SpartaException(
"Already observing a notification for data type \"")
4342 <<
demangle(
typeid(DataT).name()) <<
"\" Name \"" << name <<
"\" on node " <<
getLocation()
4343 <<
" with callback on \"" <<
demangle(
typeid(T).name()) <<
"\""
4344 <<
"\". Cannot register";
4348 observers.push_back(std::move(d));
4355 template <
typename DataT,
typename T,
void (T::*TMethod)(const DataT&)>
4356 void registerForNotification_(T* obj,
const std::string& name,
bool ensure_possible=
true,
const bool allow_private=
false)
4358 (void)allow_private;
4359 const std::type_info& data_type =
typeid(DataT);
4361 throw SpartaException(
"Cannot registerForNotification for data type \"")
4362 <<
demangle(
typeid(DataT).name()) <<
"\" and name=\"" << name <<
"\" on node " <<
getLocation()
4363 <<
" with callback on \"" <<
demangle(
typeid(T).name()) <<
"\""
4364 <<
"\" because this notification cannot possibly be generated by any descendant of this "
4365 <<
"node. Set ensure_possible=false to prevent this check if additional notification "
4366 <<
"source descendants are expected to be added. "
4367 <<
"It is possible the node generating the desired notification is in a private sub tree.";
4372 throw SpartaException(
"Already observing a notification for data type \"")
4373 <<
demangle(
typeid(DataT).name()) <<
"\" Name \"" << name <<
"\" on node " <<
getLocation()
4374 <<
" with callback on \"" <<
demangle(
typeid(T).name()) <<
"\""
4375 <<
"\". Cannot register";
4379 observers.push_back(std::move(d));
4389 template <
typename DataT,
typename T,
void (T::*TMethod)(const TreeNode&, const TreeNode&, const DataT&)>
4390 void deregisterForNotification_(T* obj,
const std::string& name,
const bool allow_private)
4392 (void)allow_private;
4393 const std::type_info& data_type =
typeid(DataT);
4394 auto itr = obs_local_.find(data_type);
4395 if(itr == obs_local_.end()){
4396 throw SpartaException(
"Not currently observing any notification for data type \"")
4397 <<
demangle(
typeid(DataT).name()) <<
"\" Name \"" << name <<
"\" on node " <<
getLocation()
4398 <<
" with callback on \"" <<
demangle(
typeid(T).name()) <<
"\" function \"" << TMethod
4399 <<
"\". Cannot deregister";
4403 if(observers.end() == d){
4404 throw SpartaException(
"Not currently observing a notification for data type \"")
4405 <<
demangle(
typeid(DataT).name()) <<
"\" Name \"" << name <<
"\" on node " <<
getLocation()
4406 <<
" . Attempted to deregister \"" <<
demangle(
typeid(T).name()) <<
"\" function \"" << TMethod
4407 <<
"\". Cannot deregister";
4416 template <
typename DataT,
typename T,
void (T::*TMethod)(const DataT&)>
4417 void deregisterForNotification_(T* obj,
const std::string& name,
const bool allow_private)
4419 (void)allow_private;
4420 const std::type_info& data_type =
typeid(DataT);
4421 auto itr = obs_local_.find(data_type);
4422 if(itr == obs_local_.end()){
4423 throw SpartaException(
"Not currently observing any notification for data type \"")
4424 <<
demangle(
typeid(DataT).name()) <<
"\" Name \"" << name <<
"\" on node " <<
getLocation()
4425 <<
" with callback on \"" <<
demangle(
typeid(T).name()) <<
"\" function \"" << TMethod
4426 <<
"\". Cannot deregister";
4430 if(observers.end() == d){
4431 throw SpartaException(
"Not currently observing a notification for data type \"")
4432 <<
demangle(
typeid(DataT).name()) <<
"\" Name \"" << name <<
"\" on node " <<
getLocation()
4433 <<
" . Attempted to deregister \"" <<
demangle(
typeid(T).name()) <<
"\" function \"" << TMethod
4434 <<
"\". Cannot deregister";
4454 template <
typename T> T *getScopeRootImpl_(T *node)
const;
4459 TreeNode* getChild_(
const std::string& name,
4464 const TreeNode* getChild_(
const std::string& name,
4466 bool private_also)
const;
4472 bool hasChild_(
const std::string& name,
bool private_also)
const noexcept;
4482 void addExtension_(
const std::string & extension_name, std::shared_ptr<ExtensionsBase> ext);
4492 const std::string* name_;
4504 const bool is_indexable_;
4510 const std::string *
const group_ptr_;
4522 std::vector<const std::string*> tags_;
4527 const std::string *
const desc_ptr_;
4541 const std::string* parent_loc_;
4558 const Clock* clock_;
4566 const Clock* working_clock_;
4574 std::unordered_map<std::string, std::weak_ptr<ExtensionsBase>> cached_extensions_;
4584 mutable uint32_t num_children_finds_;
4591 mutable uint32_t num_children_gets_;
4687 uint32_t privacy_level_ = 0;
4700 bool is_scope_root_ =
false;
4708 class TreeNodeStatics {
4714 std::map<const TreeNode*, WeakPtr> parentless_map_;
4728 std::map<const TreeNode*, WeakPtr> node_map_;
4730 static TreeNodeStatics *statics_;
4742 static TagsMap global_tags_map_;
4748 static uint32_t teardown_errors_;
4752 template<
class Ch,
class Tr>
4753 inline std::basic_ostream<Ch,Tr>&
Contains a number of ArchData pointers.
Basic Node framework in sparta device tree composite pattern.
Helpers for printing and populating vectors.
Object with a name which holds a Resource.
Set of macros for Sparta assertions. Caught by the framework.
#define sparta_assert(...)
Simple variadic assertion that will throw a sparta_exception if the condition fails.
Exception class for all of Sparta.
Helpers for enforcing StaticInitialization order.
Container class for any number of ArchData pointers owned externally.
Manages building a clock tree.
A representation of simulated time.
virtual bool isFinalizing() const
Is this node (and thus the entire tree above it) "finalized".
virtual bool isFinalized() const
Is this node (and thus the entire tree above it) "finalized".
TreePhase getPhase() const
Gets the trees current phase.
TreePhase
Current phase of tree construction (applies to node and entire tree).
@ TREE_CONFIGURING
Setting parameters, ports, and other pre-instantiation attributes. Hierarchy cannot be modified.
@ TREE_BUILDING
Setting up tree hierarchy only (initial state)
Information describing the type of validation being done.
PhasedObject which can hold 0 or 1 Resource pointers to an associatedresource. Contains logic for set...
const T getResourceAs() const
Gets the resource contained by this node (if any) as the given type.
virtual std::string getResourceTypeRaw() const
Gets the typename of the resource that this node will eventually contain.
A class that lets you schedule events now and in the future.
Used to construct and throw a standard C++ exception. Inherits from std::exception.
Static-initialization order controller.
static StringManager & getStringManager()
Returns the StringManager singleton.
const std::string *const EMPTY
Holds interned empty strings.
std::string * internString(const std::string &s)
Stores a string in shared space within this manager unless it is already stored.
Temporary delegate for notificaiton invokation until the implementation is working....
delegate & operator=(const delegate &d)
void operator()(const TreeNode &origin, const DataT &data) const
Invokes the delegate.
bool operator==(const delegate &d) const
Compares all fields in this delegate against another delegate.
bool observes(const TreeNode &obs_pt, const std::string *name) const
Compares against another delegate based on the observation point and name ignoring delegate callback ...
static delegate from_method(T *obj, const TreeNode &obs_pt, const std::string &name)
Creates delegate with given properties.
constexpr bool equals(T *obj, const TreeNode &obs_pt, const std::string &name) const
Compares against another delegate's information based on DataT, T, TMethod, observer pointer,...
Container for std::type_info.
Node in a composite tree representing a sparta Tree item.
app::Simulation * getSimulation() const
Gets the simulation (if any) associated with this tree.
bool hasExtension(const std::string &extension_name) const
Check if this tree node has an extension by the given name.
virtual void broadcastRegistrationForNotificationToChildren_(const std::type_info &tinfo, const std::vector< const std::string * > &name_ids, TreeNode *obs_node, const delegate *del, const bool allow_private)
Recursively notifies children that the notification described is now (or still is) being observed at ...
static const uint32_t RENDER_SUBTREE_INDENT
Spaces to indent for each tree level in sparta::TreeNode::renderSubtree.
static constexpr char NODE_NAME_VIRTUAL_GLOBAL[]
Node name for the virtual glopbal node.
uint32_t findImmediateChildren_(std::regex &expr, std::vector< TreeNode * > &found, bool allow_private=false)
Variant of findImmediateChildren_ with no replacements vector.
static const group_idx_type GROUP_IDX_NONE
GroupIndex indicating that a node has no group index because it belongs to no group.
node_uid_type getNodeUID() const
Gets the unique ID of this node.
bool hasObserversRegisteredForNotification(const std::type_info &tinfo, const std::string *name) const noexcept
Determines if this TreeNode (not descendants) has any observers for this type of event and name.
ConstT getAs() const
Retrieves this node after casting to type T.
const std::vector< const std::string * > & getTags() const
Gets the set of tags associated with this TreeNode.
std::string getLocation() const override final
bool canGenerateNotification(const std::type_info &tinfo, const std::string &name) const
Can this TreeNode generate a notification of the given type having the given name (does not require i...
ExtensionsBase * createExtension(const char *extension_name, bool replace=false)
std::map< std::string, const ExtensionsBase * > getAllExtensions() const
Get a map of extensions for this node.
Extension * addExtension(Args &&... args)
Add an extension, specifying the ExtensionsBase subclass type. Forward any arguments needed to your s...
const T * getExtensionAs(const std::string &extension_name) const
Get an extension, downcast to the given type.
static std::string getNextName(const std::string &name, size_t &pos)
Gets the next name between two '.' chars in a string starting at pos.
static const node_uid_type MAX_NODE_UID
Maximum value of node_uid_ before the framework throws an exception.
void validateTree_()
Iterates the finalized tree and validates each node (e.g. ensures statistics can be evaluated)
ExtensionsBase * getExtension(const std::string &extension_name, bool no_factory_ok=false)
Get an extension object by type string. Returns nullptr if not found (unrecognized).
virtual uint32_t findImmediateChildren_(std::regex &expr, std::vector< const TreeNode * > &found, std::vector< std::vector< std::string > > &replacements, bool allow_private=false) const
Const-qualified variant of findImmediateChildren_.
void detachFromChildren_()
Removes a node from its children with the expectation this node will be immediately destroyed (i....
static const std::string DEBUG_DUMP_SECTION_DIVIDER
String dividing sections in a debug dump file.
uint32_t getGroup(const std::string &group, std::vector< TreeNode * > &results)
Gets all nodes in a child group.
void dumpPossibleNotifications(std::ostream &o) const noexcept
Dumps a listing of the notifications which this node can generate to the ostream o.
static constexpr char NODE_NAME_NONE[]
Node name for anonymous node.
static bool hasWildcardCharacters(const std::string &name)
Determines if a given node name has any wildcard characters which will be substituted in createSearch...
static constexpr char GROUP_NAME_BUILTIN[]
Reserved name for built-in nodes.
const std::string & getDesc() const
Gets the description of this node.
TreeNode(TreeNode *parent, const std::string &name, const std::string &group, group_idx_type group_idx, const std::string &desc, bool is_indexable)
TreeNode full constructor. Initializes node and adds it as a child of an existing tree node (if paren...
virtual TreeNode * getRoot()
Gets farthest ancestor of this node.
size_t getNumExtensions() const
Get the number of extensions for this node.
void markHidden(bool hidden=true)
Marks this TreeNode hidden for the purposes of printint out nodes. This does not make the node inacce...
TreeNode(TreeNode *parent, const std::string &name, const std::string &desc)
TreeNode constructor with no group information.
uint32_t findChildren(const std::string &pattern, std::vector< TreeNode * > &results)
Version of findChildren with no replacements vector.
static constexpr char GROUP_NAME_NONE[]
Group name indicating that a node belongs to no group.
void simulationTerminating_()
Hook to allow simulation resources to clean-up before simulation is ended.
static bool notificationCategoryMatch(const std::string *query_id, const std::string *node_id)
Checks if two notification categories match where one is an actual category.
void dumpPossibleSubtreeNotifications(std::ostream &o) const noexcept
Dumps a listing of the notifications which this node and its descendants can generate to the ostream ...
bool isIndexableByGroup() const
Returns whether this object is accessible through its parent's interfaces for getting children by gro...
const T getParentAs(bool must_exist=true) const
Retrieves a parent casted to type T* if this node has a parent.
void enterTeardown_() noexcept
Recursively enter TREE_TEARDOWN phase while alerting nodes through onEnteringTeardown_ and alterting ...
virtual void addLink(TreeNode *node, const std::string &label)
Link this tree node with another tree node.
bool canSubtreeGenerateNotifications(const std::type_info &tinfo, const std::vector< const std::string * > &names) const
Checks to see if any a subtree can generate any of several notification names which may be patterns.
uint32_t findChildrenByTag(const std::string &tag, std::vector< TreeNode * > &results, int32_t max_depth=-1)
Finds a set of all children having the selected tag which this node or descendants of this node withi...
static const uint32_t TEARDOWN_ERROR_LIMIT
Number of teardown-phase-related messages that can be printed before the rest will be suppressed.
void addExtensionFactory(const std::string &extension_name, std::function< ExtensionsBase *()> factory)
Add an extension factory to this tree node by its type (name).
static constexpr char LOCATION_NODE_SEPARATOR_EXPECTING
Separator character between node identifiers in a location string when the child is being attached to...
static std::vector< const std::string * > parseNotificationNameString(const std::string &csl)
Parses a comma-separated list of notification names (or patterns) separated by commas and ignoring wh...
TreeNode * getChildAt(uint32_t idx) const
Gets a child at a position in the children vector in the order in which they were added to this node.
void addAlias(const std::string &alias)
Add a single alias for this node.
uint32_t getPossibleSubtreeNotifications(std::vector< NotificationInfo > &infos) const noexcept
Gets information on the possible notifications generated by this node and all its descendants.
std::shared_ptr< TreeNode > SharedPtr
Shared pointer to TreeNode. Acquire with WeakPtr::lock().
const ExtensionsBase * getExtension(const std::string &extension_name) const
Get an extension object by type string. Returns nullptr if not found (unrecognized).
TreeNode(const TreeNode &)=delete
Not copy-constructable.
const TreeNode * getExpectedRoot() const
build-time equivalent to getRoot before an object is actually attached to a tree. This is a mainly a ...
void addChild(TreeNode &child)
AddChild by reference for convenience.
void broadcastDeregistrationForNotificationListStringToChildren_(const std::type_info &tinfo, const std::string &name, TreeNode *obs_node, const delegate *del, const bool private_only)
Symmetric oppostie of broadcastRegistrationForNotificationListStringToChildren_.
void broadcastRegistrationForNotificationListStringToChildren_(const std::type_info &tinfo, const std::string &name, TreeNode *obs_node, const delegate *del, const bool private_only)
Entry point to broadcastRegistrationForNotificationToChildren_ recursion. Breaks a name string.
ExtensionsBase * createExtension(const std::string &extension_name, bool replace=false)
Create an extension on demand. This is useful if you want to add an extension to a node that was not ...
virtual bool isAttached() const
Is this node part of a device tree with a proper RootTreeNode at the root.
bool canSubtreeGenerateNotification(const std::type_info &tinfo, const std::string &name) const
Can this TreeNode or its descendants (of any distance) generate a notification of the given type havi...
bool isBuiltin() const
Is this node in the builtins group.
static const std::vector< std::pair< const char *, std::function< void(std::string &)> > > TREE_NODE_PATTERN_SUBS
List of pattern susbtitutions when creating a search pattern from a TreeNode name containing wildcard...
void registerForNotification(T *obj, const std::string &name, bool ensure_possible=true)
Registers a callback method to listen for all notifications having the specified data type DataT and ...
void invokeDelegatesOn_(TreeNode *to_invoke, const DataT &data, const std::string *name_id)
Protected wrapper for invokeDelegates_ which allows a TreeNode to invoke delegates on another TreeNod...
TreeNode()=delete
Not default-constructable.
const ChildrenVector getChildren() const
Gets a vector of all children of this node in any group in the order in which they were added to this...
std::string renderSubtree(int32_t max_depth=-1, bool show_builtins=false, bool names_only=false, bool hide_hidden=false, bool(*leaf_filt_fxn)(const TreeNode *)=nullptr) const
Renders the subtree starting at this node as a string containing an indentation-based depth-first rep...
group_idx_type getGroupIndexMax(const std::string &group)
Gets the largest index of a node in the given group.
void verifyUniqueChildIdentifier_(const std::string &ident, bool ignore_group_collision=false)
Verifies that the given identifier is unique for all children of this node by comparing against names...
const std::string * getGroupNamePtr() const
Gets the group name string pointer (interned in StringManager singleton) of this node.
void detachFromParent_()
Removes a node from its parent with the expectation this node will be immediately destroyed (i....
const TreeNode * getChild(const std::string &name, bool must_exist=true) const
Overloaded const-qualified.
TreeNode(TreeNode &&rhp)
Move constructor.
uint32_t getLevel() const
Gets the level of this node. 0 is root.
uint32_t getChildren(std::vector< TreeNode * > &results, bool ignore_builtin_group=true, bool ignore_anonymous_nodes=true)
Gets all children of this node in the order in which they were added to this node.
sparta::TreeNode * findAncestorByName(const std::string &name)
Find ancestor by name.
void validatePostRun_(const PostRunValidationInfo &info) const
Hook to check the state of the simulator post-run and throw exceptions if something is incorrect.
void validateGroup(const std::string &name, const std::string &group, group_idx_type idx)
Validates the given group name string and group index for this TreeNode. Does not consider context (e...
static constexpr char LOCATION_NODE_SEPARATOR_ATTACHED
Separator character between node identifiers in a location string when the child is attached to the p...
virtual void broadcastDeregistrationForNotificationToChildren_(const std::type_info &tinfo, const std::vector< const std::string * > &name_ids, TreeNode *obs_node, const delegate *del, const bool allow_private)
Recursively notifies children that the notification described has lost one particular observer (del) ...
DelegateVector::iterator findDelegate_(DelegateVector &dvec, T *obj, const std::string &target_name)
Finds a delegate associated with the given type T, object pointer, DataT, and TMethod within a Deleva...
static const std::map< const TreeNode *, WeakPtr > & getAllNodes()
Gets the vector of all TreeNodes currently known to be constructed.
void enterFinalizing_()
Recursively enter TREE_FINALIZING phase.
bool hasTag(const std::string &tag) const
Does this node have a specific tag (by name)
void validateDesc(const std::string &desc)
Validates the given description string for this TreeNode.
Scheduler * getScheduler(const bool must_exist=false)
Get the scheduler associated with this tree node's root.
const std::string * getNamePtr() const
Gets the name of this node's string pointer which isinterned in StringManager)
void addChild(TreeNode *child, bool inherit_phase=true)
Adds a TreeNode to this node as a child.
uint32_t group_idx_type
Index within a group.
TreeNode(TreeNode *parent, const std::string &name, const std::string &group, group_idx_type group_idx, const std::string &desc)
TreeNode constructor with no is_indexable parameter [defaults to true].
bool areParametersLocked_() const
This method informs whether the tree is past the lockdown phase for all LOCKED and HIDDEN parameters....
const TreeNode * getScopeRoot() const
static bool matchesGlobLike(const std::string &pattern, const std::string &other)
Determine if a glob-like search pattern matches some other string.
static std::string getPreviousName_(const std::string &name, size_t &pos)
Gets the previous name between two '.' chars in a string starting at pos.
void postPropagatingNotification_(const TreeNode *origin, const DataT &data, const std::string *name_id)
Starts a notification propagating up the tree.
void enterFinalized_()
Recursively enter TREE_FINALIZED phase.
static const uint64_t CHILD_GET_THRESHOLD
Threshold for number of getChild calls after finalization before a warning message is printed about f...
const Clock * getLocalClock()
Gets the clock associated directly with this Node. This is useful for configuration and simulator deb...
const AliasVector & getAliases() const
Gets a vector of all aliases of this node.
bool hasTag(const std::string *interned_tag_name) const
Does this node have a specific tag (by string pointer interned with StringManager)....
ExtensionsBase * getExtension()
Get an extension without needing to specify any particular extension name. If no extensions exist,...
std::string getDeepestMatchingPath(const std::string &path) const
Gets the deepest whole node location starting from this node that matches some part of path starting ...
void deregisterForNotification(T *obj, const std::string &name)
Removes at most one registration made with registerForNotification.
std::multimap< std::string, TreeNode * > ChildNameMapping
Mapping of names, aliases, and groups to individual child nodes within one node. This must be in a de...
bool canGenerateNotification(const std::type_info &tinfo, const std::string *name) const
Can this TreeNode generate a notification of the given type having the given name or pattern.
std::weak_ptr< TreeNode > WeakPtr
Weak pointer to a TreeNode. Acquire with getWeakPtr.
virtual void activateLink(const std::string &label)
Activate one of the links added with addLink.
TreeNode(TreeNode *parent, const std::string &group, group_idx_type group_idx, const std::string &desc)
TreeNode constructor for anonymous node with group information.
std::vector< std::string > AliasVector
Vector of aliases (other names for this node)
void finalizeTree_()
Recursively create resources based on tree configuration. enter_finalize_ should be invoked after thi...
virtual uint32_t findImmediateChildren_(std::regex &expr, std::vector< TreeNode * > &found, std::vector< std::vector< std::string > > &replacements, bool allow_private=false)
Finds immediate children with some identity (name or alias) matching a regex.
WeakPtr getWeakPtr()
Gets a weak pointer to this TreeNode. This weak pointer is guaranteed to expire when this TreeNode is...
const ExtensionsBase * getExtension() const
Get an extension without needing to specify any particular extension name. If no extensions exist,...
static constexpr char LOCATION_NODE_SEPARATOR_UNATTACHED
Separator character preceding a node identifiers in a location string when that node has no parent an...
TreeNode(const std::string &name, const std::string &group, group_idx_type group_idx, const std::string &desc)
TreeNode constructor with no parent Node.
static TreeNode * getVirtualGlobalNode()
Gets the virtual global node singleton. This node can have no parent and no children....
virtual void setClock(const Clock *clk)
Assigns a clock to this node. This clock will then be accessed by any descendant which has no assigne...
std::string getDisplayLocation() const
Returns the location of this node in the device tree which might not be usable for navigating the dev...
std::pair< uint32_t, std::string > recursGetDeepestMatchingPath_(const std::string &path, size_t name_pos) const
Finds the deepest node path mathing the input path. Implements getDeepestMatchingPath.
uint32_t locateNotificationSources(std::vector< TreeNode * > &nodes, const std::string &name="")
Gets all possible notification info from NotificationSources within this node's subtree.
void getDelegatesRegisteredForNotification(const std::type_info &tinfo, const std::string *name, std::vector< delegate > &dels) noexcept
Gets the vector of delegates registered for a notification on this TreeNode.
std::vector< const std::string * > getIdentifiers() const
Gets all the identifiers for this node (excluding groups)
bool isExpired() const
Is this expired (i.e. has it been the rhp of a move constructor)
virtual TreeNode * getParent()
Gets immediate parent of this node if one exists.
bool isDescendantOf(const TreeNode *ancestor, int32_t max_depth=-1) const
Determines if this node is a descendant of the specified ancestor node within some number of generati...
void dumpDebugContent_(std::ostream &out) const noexcept
Allows resources to write out detailed textual debugging information about the node....
void lockdownParameters()
Method to put the device tree in lockdown phase. All LOCKED and HIDDEN parameters are frozen after th...
static std::string createSearchRegexPattern(const std::string &pat)
Compute a regex pattern for a node child path containing any number of wildcard characters (not a dot...
group_idx_type getGroupIdx() const
Gets the group index of this node.
uint32_t getRecursiveNodeCount() const
Recursively gets the count of a nodes that are a subclass of a particular type (determined by dynamic...
const ConstT getChildAs(const std::string &name, bool must_exist=true) const
Retrieves a child that is castable to T with the given dotted path.
static bool identityMatchesPattern_(const std::string &ident, std::regex &expr, std::vector< std::string > &replacements)
Performs pattern matching on a identity string.
virtual std::string stringize(bool pretty=false) const
Create a string representation of this node.
const T * getAs() const
Retrieves this node after casting to type const T.
std::vector< delegate > DelegateVector
Vector of delegates representing a list of observers to notify.
std::map< const std::string *, std::vector< TreeNode * > > TagsMap
Map of strings (interned in StringManager) tags to TreeNodes.
std::map< type_info_container, DelegateVector > NotificationObserverMap
Map of delegate vectors containing all observers.
void stringizeTags(std::stringstream &ss) const
Render tags to a string in the form: " tags:[tag0, tag1]" If there are any tags. The leading space ma...
const std::string & getName() const override
Gets the name of this node.
void enterConfig_() noexcept
Recursively enter TREE_CONFIGURING phase.
sparta::TreeNode * findAncestorByTag(const std::string &tag)
Find the first ancestor with a particular tag.
uint32_t getNumChildren() const
Gets the number of children that this node has including those in the sparta builtins group.
TreeNode * getChild(const std::string &name, bool must_exist=true)
Retrieves a child with this dotted path name.
Extension * replaceExtension(Args &&... args)
Replace an extension, specifying the ExtensionsBase subclass type. This api is similar to addExtensio...
void addTags(const std::vector< std::string > &v)
Adds each elements of a vector of tags to this node.
bool removeExtension(const std::string &extension_name)
Remove an extension by its name. Returns true if successful, false if the extension was not found.
bool hasExtensionOfType(const std::string &extension_name) const noexcept
Check if this tree node has an extension by the given name and type.
T * getExtensionAs(const std::string &extension_name)
Get an extension, downcast to the given type.
uint32_t getGroupSize(const std::string &group)
Gets the number of nodes in a group.
bool canGenerateNotification(const NotificationInfo &info) const
Can this TreeNode generate a notification of the given NotificationInfo.
uint32_t getChildrenOfType(std::vector< T * > &results) const
return all the children matching a particular type using dynamic cast.
void validateName(const std::string &nm)
Validates the given name string for this TreeNode. Does not consider context (e.g....
bool isHidden() const
Is this TreeNode supposed to be hidden during tree printouts This value does not have to be respected...
std::string getExpectedLocation() const
build-time equivalent to getLocation before an object is actually attached to a tree....
T getAs()
Retrieves this node after casting to type const T.
static std::string formatAllNodes()
Prints the list of all TreeNodes currently known to be constructed.
TreeNode * getScopeRoot()
void removeChildForTeardown_(TreeNode *child)
"Removes" the given child by invoking onDestroyingChild_ then removing this child from the children_ ...
bool hasImmediateChild(const TreeNode *n) const noexcept
Determines if the node n is an immediate child of this node.
void addAliases(const AliasVector &v)
Adds each element of a vector of aliases to this node..
static const uint64_t CHILD_FIND_THRESHOLD
Threshold for number of findChildren calls after finalization before a warning message is printed abo...
void addTag(const std::string &tag)
Adds single tag to this node.
TreeNode(const std::string &name, const std::string &desc)
TreeNode constructor with no parent node or group information.
bool canSubtreeGenerateNotification(const std::type_info &tinfo, const std::string *name) const
Can this TreeNode or its descendants (of any distance) generate a notification of the given type havi...
std::set< std::string > getAllConfigExtensionNames() const
Get a list of extension names found for this node in all arch/config/extension files.
void bindTreeLate_()
Recursively invoke TreeNode::onBindTreeEarly_ and Resource::onBindTreeLate_ (in that order for each n...
uint32_t getChildrenIdentifiers(std::vector< std::string > &idents, bool ignore_builtin_group=true) const
Gets all child identifiers, aliases, group names, and group-aliases which can be used to refer to a c...
static bool isNodeConstructed(const TreeNode *)
Is a given node constructed?
virtual ~TreeNode()
Virtual destructor.
uint32_t findChildren(const std::string &pattern, std::vector< TreeNode * > &results, std::vector< std::vector< std::string > > &replacements)
Finds all children starting at this node with a given pattern relative to this node by matching names...
sparta::TreeNode * findAncestorByType()
Find ancestor by type.
T * getAs()
Retrieves this node after casting to type const T.
TreeNode & operator=(const TreeNode &)=delete
Not assign-constructable.
const std::string & getGroup() const
Gets the group name of this node.
bool isAnonymous() const
Is this node anonymous.
const Clock * getClock() override
Walks up parents (starting with self) until a parent with an associated local clock is found,...
void bindTreeEarly_()
Recursively invoke TreeNode::onBindTreeEarly_ and Resource::onBindTreeEarly_ (in that order for each ...
T * findAncestorResourceByType()
Find an ancestor's resource with a certain type.
void setExpectedParent_(const TreeNode *parent)
Tracks a node as an expected parent without actually adding this node as a child. This is used almost...
uint32_t findImmediateChildren_(std::regex &expr, std::vector< const TreeNode * > &found, bool allow_private=false) const
Variant of const-qualified findImmediateChildren_ with no replacements vector.
void makeSubtreePrivate()
Make the entire subtree private.
std::vector< TreeNode * > ChildrenVector
Vector of TreeNode children.
uint32_t getPossibleNotifications(std::vector< NotificationInfo > &infos) const
Gets information on the possible notifications generated by this node (excludes children).
ConstWeakPtr getWeakPtr() const
Const variant of getWeakPtr.
uint64_t node_uid_type
Type of unique-identifier assigned to every node.
void removeFromParentForTeardown_(TreeNode *parent)
Protected Wrapper for getParent()->removeChildForTeardown_ which allows subclases of TreeNode to indi...
bool locationMatchesPattern(const std::string &pattern, const TreeNode *pat_loc) const
Determines if the given pattern (which may contain wildcards) can describe this node.
ExtensionsBase * createExtension(bool replace=false)
Create an extension on demand without needing to specify any particular extension name....
void dumpLocatedNotificationSources(std::ostream &o, const std::string &name="")
Retrieves the relevant NotificationSources from locateNotificationSources and prints them to the outp...
std::set< std::string > getAllInstantiatedExtensionNames() const
Get a list of extension names for all instantiated extensions on this TreeNode.
std::weak_ptr< const TreeNode > ConstWeakPtr
Weak pointer to a const TreeNode. Acquire with getWeakPtr.
static bool identityMatchesPattern_(const std::string &ident, std::regex &expr)
Variant of identityMatchesPattern_ with no replacements vector.
bool hasChild(const std::string &name) const noexcept
Determines if a child can be found with the given dotted path.
Virtual global node for all device trees in a single simulation. This node acts a potential notificat...
Simulator which builds a sparta DeviceTree.
Macros for handling exponential backoff.
std::ostream & operator<<(std::ostream &o, const SimulationInfo &info)
ostream insertion operator for SimulationInfo
std::string demangle(const std::string &name) noexcept
Demangles a C++ symbol.
Type for indicating that ANY notification source type should be included in a search performed by loc...
Notification type/name information.
const TreeNode * origin
TreeNode from which this notification can be generated.
NotificationInfo(const NotificationInfo &rhp)
Copy constructor.
void checkValid() const
Ensures the node contains valid data.
NotificationInfo(const NotificationInfo &&rhp)
Move constructor.
const std::string * name
String interned by StringManager. Must not be nullptr.
NotificationInfo & operator=(const NotificationInfo &rhp)
Assignment operator.
const std::type_info * tinfo
Type from typeid() on notification DataT.
NotificationInfo(const TreeNode *_origin, const std::type_info *_tinfo, const std::string *_name)
Basic constructor.