14
14
#include " sparta/simulation/Parameter.hpp"
15
15
#include " sparta/app/SimulationInfo.hpp"
16
16
#include " sparta/simulation/TreeNodePrivateAttorney.hpp"
17
+ #include " sparta/simulation/ParameterTree.hpp"
17
18
18
19
namespace YP = YAML; // Prevent collision with YAML class in ConfigEmitter namespace.
19
20
@@ -80,6 +81,7 @@ class YAML : public ConfigEmitter
80
81
* \post emitter_ will be nullptr
81
82
*/
82
83
void addParameters (TreeNode* device_tree,
84
+ const ParameterTree* extensions_ptree,
83
85
bool verbose=false )
84
86
{
85
87
sparta_assert (emitter_ == nullptr );
@@ -102,52 +104,26 @@ class YAML : public ConfigEmitter
102
104
103
105
*emitter_ << YP::BeginDoc;
104
106
sparta_assert (emitter_->good ());
105
- handleNode_ (device_tree, verbose); // Recurse
106
107
107
- if (!tree_node_extensions_.empty ()) {
108
- for (auto & ext_info : tree_node_extensions_) {
109
- TreeNode * tn = ext_info.first ;
110
- std::vector<std::pair<std::string, TreeNode::ExtensionsBase*>> & node_extensions =
111
- ext_info.second ;
112
-
113
- *emitter_ << YP::BeginMap;
114
- *emitter_ << YP::Key << tn->getLocation ();
115
- *emitter_ << YP::Value;
116
- *emitter_ << YP::BeginMap;
117
-
118
- for (auto & node_extension : node_extensions) {
119
- *emitter_ << YP::Key << (" extension." + node_extension.first );
120
- *emitter_ << YP::Value;
121
- *emitter_ << YP::BeginMap;
122
-
123
- TreeNode::ExtensionsBase * ext_base = node_extension.second ;
124
- ParameterSet * params = ext_base->getYamlOnlyParameters ();
125
- auto param_names = params->getNames ();
126
- for (const auto & param_name : param_names) {
127
- *emitter_ << YP::Key << param_name;
128
- *emitter_ << YP::Value // << YP::PadToColumn(50)
129
- << params->getParameter (param_name)->getValueAsString ();
130
- std::stringstream tags;
131
- params->getParameter (param_name)->stringizeTags (tags);
132
- *emitter_ << YP::Comment (tags.str ());
133
- }
134
-
135
- params = ext_base->getParameters ();
136
- param_names = params->getNames ();
137
- for (const auto & param_name : param_names) {
138
- *emitter_ << YP::Key << param_name;
139
- *emitter_ << YP::Value // << YP::PadToColumn(50)
140
- << params->getParameter (param_name)->getValueAsString ();
141
- std::stringstream tags;
142
- params->getParameter (param_name)->stringizeTags (tags);
143
- *emitter_ << YP::Comment (tags.str ());
144
- }
145
-
146
- *emitter_ << YP::EndMap;
147
- }
148
- *emitter_ << YP::EndMap;
149
- *emitter_ << YP::EndMap;
150
- }
108
+ handleNode_ (device_tree, verbose);
109
+
110
+ if (extensions_ptree) {
111
+ // Note we use the ParameterTree to get the tree node extensions instead
112
+ // of the device tree since using the device tree might serialize an extension
113
+ // defn of:
114
+ //
115
+ // top.cpu.core*.extension.core_extensions:
116
+ // name: value
117
+ // name: value
118
+ //
119
+ // As:
120
+ //
121
+ // top.cpu.core0.extension.core_extensions:
122
+ // name: value
123
+ // name: value
124
+ //
125
+ // But the ParameterTree retains the wildcards in the path.
126
+ handleNode_ (extensions_ptree->getRoot ());
151
127
}
152
128
153
129
*emitter_ << YP::EndDoc;
@@ -172,6 +148,41 @@ class YAML : public ConfigEmitter
172
148
173
149
174
150
private:
151
+ /* !
152
+ * \brief Recursively write the TreeNode extensions defns to YAML
153
+ */
154
+ void handleNode_ (const ParameterTree::Node* subtree)
155
+ {
156
+ sparta_assert (subtree);
157
+ sparta_assert (emitter_ != nullptr );
158
+
159
+ if (subtree->getName () == " extension" ) {
160
+ auto location_key = subtree->getParent ()->getPath ();
161
+ *emitter_ << YP::BeginMap;
162
+ *emitter_ << YP::Key << location_key;
163
+ *emitter_ << YP::Value;
164
+ *emitter_ << YP::BeginMap;
165
+
166
+ for (const auto child : subtree->getChildren ()) {
167
+ auto extension_name = child->getName ();
168
+ *emitter_ << YP::Key << (" extension." + extension_name);
169
+ *emitter_ << YP::Value;
170
+ *emitter_ << YP::BeginMap;
171
+ for (const auto param : child->getChildren ()) {
172
+ *emitter_ << YP::Key << param->getName ();
173
+ *emitter_ << YP::Value << param->getValue ();
174
+ }
175
+ *emitter_ << YP::EndMap;
176
+ }
177
+
178
+ *emitter_ << YP::EndMap;
179
+ *emitter_ << YP::EndMap;
180
+ } else {
181
+ for (const auto child : subtree->getChildren ()) {
182
+ handleNode_ (child);
183
+ }
184
+ }
185
+ }
175
186
176
187
/* !
177
188
* \brief Render the content of this node as a sequence of YAML
@@ -186,15 +197,6 @@ class YAML : public ConfigEmitter
186
197
sparta_assert (subtree);
187
198
sparta_assert (emitter_ != nullptr );
188
199
189
- const auto & extension_names = subtree->getAllExtensionNames ();
190
- for (const auto & ext_name : extension_names) {
191
- auto extension = subtree->getExtension (ext_name);
192
- if (extension) {
193
- tree_node_extensions_[subtree].emplace_back (
194
- std::make_pair (ext_name, subtree->getExtension (ext_name)));
195
- }
196
- }
197
-
198
200
// Print parameter value if this node is a parameter
199
201
const ParameterBase* pb = dynamic_cast <const ParameterBase*>(subtree);
200
202
if (pb){
@@ -396,12 +398,6 @@ class YAML : public ConfigEmitter
396
398
*/
397
399
const bool show_param_descs_;
398
400
399
- /* !
400
- * \brief Mapping from tree nodes to their named extensions, if any
401
- */
402
- std::unordered_map<TreeNode*,
403
- std::vector<std::pair<std::string, TreeNode::ExtensionsBase*>>> tree_node_extensions_;
404
-
405
401
}; // class YAML
406
402
407
403
} // namespace ConfigEmitter
0 commit comments