6 int unsigned indent_level;
7 local string spaces = " ";
20 extern
virtual function string emit();
25 extern
virtual function string
format_primitive(uvm_printer_element element);
26 extern
virtual function string
format_object(uvm_printer_element element);
27 extern
virtual function string
format_array(uvm_printer_element element);
29 extern
virtual function bit
is_primitive(uvm_printer_element element);
30 extern
virtual function bit
is_object(uvm_printer_element element);
31 extern
virtual function bit
is_array(uvm_printer_element element);
34 extern
virtual function int unsigned
format_object(int unsigned idx, ref string result);
35 extern
virtual function int unsigned
format_primitive(int unsigned idx, ref string result);
36 extern
virtual function int unsigned
format_array(int unsigned idx, ref string result);
38 extern
virtual function bit
is_primitive(uvm_printer_row_info row);
39 extern
virtual function bit
is_object(uvm_printer_row_info row);
40 extern
virtual function bit
is_array(uvm_printer_row_info row);
52 function string uvm_xml_printer::emit();
65 string result, producer, queue_index, insertion_index, inst;
66 uvm_printer_element children[$];
67 static uvm_printer_element_proxy proxy = new("proxy");
69 proxy.get_immediate_children(element, children);
72 if (element.get_element_type_name() != "cl_syoscb_item") begin
73 `uvm_warning("XML_PRINT", $sformatf({"The uvm_xml_printer is only meant to be invoked on items of type cl_syoscb_item. ",
74 "This item has type %s. Formatting as a uvm_sequence_item instead. This breaks the built-in XML transformations."}, element.get_element_type_name()))
76 end else if (children[0].get_element_name() != "insertion_index" ||
77 children[1].get_element_name() != "queue_index" ||
78 children[2].get_element_name() != "producer") begin
79 `uvm_warning("XML_PRINT", $sformatf({"cl_syoscb_item metadata fields must be in the order [insertion_index, queue_index, producer]. ",
80 "This item had order [%s, %s, %s]"}, children[0].get_element_type_name(), children[1].get_element_type_name(), children[2].get_element_type_name()))
84 inst = element.get_element_name();
85 insertion_index = children[0].get_element_value();
86 queue_index = children[1].get_element_value();
87 producer = children[2].get_element_value();
89 result = $sformatf("<item inst=\"%s\" producer=\"%s\" queue_index=\"%s\" insertion_index=\"%s\">\n",
93 insertion_index.substr(2, insertion_index.len()-1));
97 this.decrease_indent();
98 result = {result,
"</item>\n"};
101 endfunction: format_syoscb_item
108 uvm_printer_element children[$];
109 static uvm_printer_element_proxy proxy =
new(
"proxy");
111 proxy.get_immediate_children(element, children);
113 result = $sformatf(
"%s<member_object name=\"%s\" type=\"%s\">\n",
115 element.get_element_name(),
116 element.get_element_type_name());
118 if(element.get_element_value() ==
"<null>") begin
119 this.increase_indent();
120 result = {result, $sformatf(
"%s<null/>\n", this.get_indent())};
121 this.decrease_indent();
122 result = {result, $sformatf(
"%s</member_object>\n", this.get_indent())};
126 this.increase_indent();
127 result = {result, $sformatf(
"%s<members>\n", this.get_indent())};
128 this.increase_indent();
130 foreach(children[i]) begin
131 if(is_primitive(children[i])) begin
132 result = {result, this.format_primitive(children[i])};
133 end
else if (is_object(children[i])) begin
134 result = {result, this.format_object(children[i])};
135 end
else if (is_array(children[i])) begin
136 result = {result, this.format_array(children[i])};
138 result = {result, this.format_primitive(children[i])};
142 this.decrease_indent();
143 result = {result, $sformatf(
"%s</members>\n", this.get_indent())};
144 this.decrease_indent();
145 result = {result, $sformatf(
"%s</member_object>\n", this.get_indent())};
148 endfunction: format_object
154 string result, member_array;
155 uvm_printer_element children[$];
156 static uvm_printer_element_proxy proxy =
new(
"proxy");
158 proxy.get_immediate_children(element, children);
160 result = $sformatf(
"%s<member_array name=\"%s\" type=\"%s\" size=\"%s\">\n", this.get_indent(), element.get_element_name(), element.get_element_type_name(), element.get_element_size());
162 if(element.get_element_size() ==
"0") begin
163 result = {result, $sformatf(
"%s</member_array>\n", this.get_indent())};
167 this.increase_indent();
168 result = {result, $sformatf(
"%s<values>\n", this.get_indent())};
169 this.increase_indent();
171 foreach(children[i]) begin
172 result = {result, $sformatf(
"%s<value>\n", this.get_indent())};
173 this.increase_indent();
174 if(is_primitive(children[i])) begin
175 result = {result, this.format_primitive(children[i])};
176 end
else if (is_object(children[i])) begin
177 result = {result, this.format_object(children[i])};
178 end
else if (is_array(children[i])) begin
179 result = {result, this.format_array(children[i])};
181 result = {result, this.format_primitive(children[i])};
183 this.decrease_indent();
184 result = {result, $sformatf(
"%s</value>\n", this.get_indent())};
187 this.decrease_indent();
188 result = {result, $sformatf(
"%s</values>\n", this.get_indent())};
189 this.decrease_indent();
190 result = {result, $sformatf(
"%s</member_array>\n", this.get_indent())};
193 endfunction: format_array
199 return $sformatf(
"%s<member name=\"%s\" type=\"%s\" size=\"%s\">%s</member>\n",
201 element.get_element_name(),
202 element.get_element_type_name(),
203 element.get_element_size(),
204 element.get_element_value());
206 endfunction: format_primitive
214 type_name = element.get_element_type_name();
216 return (type_name ==
"integral") || (type_name ==
"real") || (type_name ==
"string");
217 endfunction: is_primitive
227 string type_name, val;
228 type_name = element.get_element_type_name();
229 val = element.get_element_value();
231 return (type_name.substr(0,2) ==
"da(" || type_name.substr(0,2) ==
"aa(" || type_name.substr(0,2) ==
"sa(") &&
232 type_name[type_name.len()-1] ==
")" && val[0] ==
"-";
233 endfunction: is_array
241 size = element.get_element_size();
242 val = element.get_element_value();
244 return size ==
"-" && (val[0] ==
"@" || val ==
"<null>");
245 endfunction: is_object
250 function string uvm_xml_printer::emit();
254 result = this.format_syoscb_item(0);
264 string result, producer, queue_index, insertion_index, inst;
267 if(m_rows[idx].type_name !=
"cl_syoscb_item") begin
268 `uvm_warning(
"XML_PRINT", $sformatf({
"The uvm_xml_printer is only meant to be invoked on items of type cl_syoscb_item. ",
269 "This item has type %s. Formatting as a uvm_sequence_item instead. This breaks the built-in XML transformations."}, m_rows[idx].type_name))
270 void'(this.format_object(idx, result));
272 end else if(m_rows[idx+1].name != "insertion_index" ||
273 m_rows[idx+2].name != "queue_index" ||
274 m_rows[idx+3].name != "producer") begin
275 `uvm_warning("XML_PRINT", $sformatf({
"cl_syoscb_item metadata fields must be in the order [insertion_index, queue_index, producer]. ",
276 "This item had order [%s, %s, %s]"}, m_rows[idx+1].name, m_rows[idx+2].name, m_rows[idx+3].name))
280 inst = m_rows[idx].name;
281 insertion_index = m_rows[idx+1].val;
282 queue_index = m_rows[idx+2].val;
283 producer = m_rows[idx+3].val;
286 result = $sformatf("<item inst=\"%s\" producer=\"%s\" queue_index=\"%s\" insertion_index=\"%s\">\n",
290 insertion_index.substr(2, insertion_index.len()-1));
292 this.increase_indent();
293 void'(this.format_object(idx+4, result));
294 this.decrease_indent();
296 result = {result,
"</item>\n"};
299 endfunction: format_syoscb_item
305 string member_object;
306 uvm_printer_row_info row, child;
309 member_object = $sformatf(
"%s<member_object name=\"%s\" type=\"%s\">\n", this.get_indent(), row.name, row.type_name);
310 result = {result, member_object};
312 if(row.val ==
"<null>") begin
313 this.increase_indent();
314 result = {result, $sformatf(
"%s<null/>\n", this.get_indent())};
315 this.decrease_indent();
316 result = {result, $sformatf(
"%s</member_object>\n", this.get_indent())};
320 this.increase_indent();
321 result = {result, $sformatf(
"%s<members>\n", this.get_indent())};
322 this.increase_indent();
326 while(m_rows[idx].level > row.level && idx < m_rows.size()) begin
328 if(is_primitive(child)) begin
329 idx = this.format_primitive(idx, result);
330 end
else if (is_object(child)) begin
331 idx = this.format_object(idx, result);
332 end
else if (is_array(child)) begin
333 idx = this.format_array(idx, result);
335 idx = this.format_primitive(idx, result);
339 this.decrease_indent();
340 result = {result, $sformatf(
"%s</members>\n", this.get_indent())};
341 this.decrease_indent();
342 result = {result, $sformatf(
"%s</member_object>\n", this.get_indent())};
345 endfunction: format_object
352 uvm_printer_row_info row, child;
355 member_array = $sformatf(
"%s<member_array name=\"%s\" type=\"%s\" size=\"%s\">\n", this.get_indent(), row.name, row.type_name, row.size);
356 result = {result, member_array};
358 if(row.size ==
"0") begin
359 result = {result, $sformatf(
"%s</member_array>\n", this.get_indent())};
363 this.increase_indent();
364 result = {result, $sformatf(
"%s<values>\n", this.get_indent())};
365 this.increase_indent();
369 while(m_rows[idx].level > row.level && idx < m_rows.size()) begin
370 result = {result, $sformatf(
"%s<value>\n", this.get_indent())};
371 this.increase_indent();
372 if(is_primitive(child)) begin
373 idx = this.format_primitive(idx, result);
374 end
else if (is_object(child)) begin
375 idx = this.format_object(idx, result);
376 end
else if (is_array(child)) begin
377 idx = this.format_array(idx, result);
379 idx = this.format_primitive(idx, result);
381 this.decrease_indent();
382 result = {result, $sformatf(
"%s</value>\n", this.get_indent())};
385 this.decrease_indent();
386 result = {result, $sformatf(
"%s</values>\n", this.get_indent())};
387 this.decrease_indent();
388 result = {result, $sformatf(
"%s</member_array>\n", this.get_indent())};
391 endfunction: format_array
397 uvm_printer_row_info row;
400 result = {result, $sformatf(
"%s<member name=\"%s\" type=\"%s\" size=\"%s\">%s</member>\n", this.get_indent(), row.name, row.type_name, row.size, row.val)};
402 endfunction: format_primitive
411 type_name = row.type_name;
413 return (type_name ==
"integral") || (type_name ==
"real") || (type_name ==
"string");
414 endfunction: is_primitive
425 string type_name, val;
426 type_name = row.type_name;
429 return (type_name.substr(0,2) ==
"da(" || type_name.substr(0,2) ==
"aa(" || type_name.substr(0,2) ==
"sa(") &&
430 type_name[type_name.len()-1] ==
")" && val[0] ==
"-";
431 endfunction: is_array
443 return size ==
"-" && (val[0] ==
"@" || val ==
"<null>");
444 endfunction: is_object
453 this.indent_level += this.get_knobs().indent*steps;
455 this.indent_level += this.knobs.indent*steps;
457 endfunction: increase_indent
463 this.indent_level -= this.get_knobs().indent*steps;
465 this.indent_level -= this.knobs.indent*steps;
467 if(this.indent_level < 0) begin
468 this.indent_level = 0;
470 endfunction: decrease_indent
474 return this.spaces.substr(0, indent_level-1);
475 endfunction: get_indent
virtual void increase_indent(int unsigned steps=1)
Increases the indentation used by a set amount of steps The size of each step is controlled by knobs...
virtual void decrease_indent(int unsigned steps=1)
Decreases the indentation used by a set amount of steps The size of each step is controlled by knobs...
An XML printer for cl_syoscb_items.
virtual int unsigned format_primitive(int unsigned idx, ref string result)
Formats a primitive value.
virtual int unsigned format_object(int unsigned idx, ref string result)
Formats a sequence item/object, and recursively formats all children of this seq item.
virtual string format_syoscb_item(int unsigned idx)
Formats a cl_syoscb_item and all of its children.
virtual bit is_primitive(uvm_printer_row_info row)
Checks whether an element is a SystemVerilog primitive.
virtual bit is_array(uvm_printer_row_info row)
Checks whether an element is an array Arrays are recognized as dynamic, associative or static arrays...
virtual int unsigned format_array(int unsigned idx, ref string result)
Formats an array and all of its children.
virtual string get_indent()
Gets an indentation string consisting of this.indent_level spaces.
virtual bit is_object(uvm_printer_row_info row)
Checks whether an element is an object.