SyoSil ApS UVM Scoreboard  1.0.3.0
cl_syoscb_printer_config.svh
1 /// Utility class used to perform manipulations of uvm_printer objects.
2 /// Contains a number of functions that simplify uvm_printer related code, as the printer API
3 /// differs based on the UVM version used.
4 /// These functions encapsulate those differences, providing a unified API regardless of UVM version.
5 class cl_syoscb_printer_config extends uvm_object;
6  //-------------------------------------
7  // Non randomizable variables
8  //-------------------------------------
9 
10  //-------------------------------------
11  // UVM Macros
12  //-------------------------------------
13  `uvm_object_utils_begin(cl_syoscb_printer_config)
14 
15  `uvm_object_utils_end
16 
17  //-------------------------------------
18  // Constructor
19  //-------------------------------------
20  extern function new(string name = "cl_syoscb_printer_config");
21 
22  //-------------------------------------
23  // Functions
24  //-------------------------------------
25  extern static function void set_file_descriptor(uvm_printer printer, int fd = 0);
26  extern static function int get_file_descriptor(uvm_printer printer);
27  extern static function void copy_printer(uvm_printer from, uvm_printer to);
28  extern static function void set_printer_begin_elements(uvm_printer printer, int elements);
29  extern static function void set_printer_end_elements(uvm_printer printer, int elements);
30  extern static function void do_help_pack(uvm_printer printer, uvm_packer packer);
31  extern static function uvm_printer do_help_unpack(uvm_packer packer);
32  extern static function t_printer_type get_printer_type(uvm_printer printer);
33  extern static function uvm_printer get_printer_of_type(t_printer_type ptype);
34 
36 
37 function cl_syoscb_printer_config::new(string name = "cl_syoscb_printer_config");
38  super.new(name);
39 endfunction: new
40 
41 /// Sets the file descriptor to be used for a given printer.
42 /// \param printer The printer on which to set the file descriptor
43 /// \param fd The file descriptor
44 function void cl_syoscb_printer_config::set_file_descriptor(uvm_printer printer, int fd = 0);
45  `ifdef UVM_VERSION
46  printer.set_file(fd);
47 `else
48  printer.knobs.mcd = fd;
49 `endif
50 endfunction: set_file_descriptor
51 
52 /// Gets the file descriptor used for a given printer.
53 ///
54 /// \param printer The printer for which to get the file descriptor
55 /// \return The file descriptor used by this printer
56 function int cl_syoscb_printer_config::get_file_descriptor(uvm_printer printer);
57  `ifdef UVM_VERSION
58  return printer.get_file();
59  `else
60  return printer.knobs.mcd;
61  `endif
62 endfunction: get_file_descriptor
63 
64 /// Gets the type of printer that a given uvm_printer represents.
65 /// The valid printer types are limited to uvm_table_printer, uvm_line_printer, uvm_tree_printer
66 /// and uvm_xml_printer.
67 /// If the given printer does not match one of these 4 types, an error is thrown
68 ///
69 /// \param printer The printer for which the type should be found
70 /// \return A SYOSCB_PRINTER_TYPE enum indicating which type of printer was passed
71 function t_printer_type cl_syoscb_printer_config::get_printer_type(uvm_printer printer);
72  uvm_table_printer table_printer;
73  uvm_line_printer line_printer;
74  uvm_tree_printer tree_printer;
75  uvm_xml_printer xml_printer;
76  t_printer_type ptype;
77 
78  if($cast(table_printer, printer)) begin
79  ptype = pk_syoscb::SYOSCB_PRINTER_TABLE;
80  end else if ($cast(line_printer, printer)) begin
81  ptype = pk_syoscb::SYOSCB_PRINTER_LINE;
82  end else if ($cast(tree_printer, printer)) begin
83  ptype = pk_syoscb::SYOSCB_PRINTER_TREE;
84  end else if ($cast(xml_printer, printer)) begin
85  ptype = pk_syoscb::SYOSCB_PRINTER_XML;
86  end else begin
87  string res;
88  ptype = ptype.first();
89  res = "Unable to determine printer type as it was not of of ";
90  res = {res, $sformatf("%s(%0d)", ptype.name(), ptype)};
91  while(ptype != ptype.last()) begin
92  ptype = ptype.next();
93  res = {res, $sformatf(", %s(%0d)", ptype.name(), ptype)};
94  end
95  `uvm_fatal("PRINTER", res)
96  end
97 
98  return ptype;
99 endfunction: get_printer_type
100 
101 /// Generates a new printer of the correct type.
102 /// The type is one of the enum values defined in pk_syoscb::t_printer_type (TABLE, LINE, TREE or XML)
103 /// If the given enum does not match one of the 4 valid options, an error is thrown
104 ///
105 /// \param ptype The type of printer which should be generated
106 /// \return A printer of the indicated type, null if the printer type was not recognized
107 function uvm_printer cl_syoscb_printer_config::get_printer_of_type(t_printer_type ptype);
108  uvm_printer printer;
109 
110  case(ptype)
111  pk_syoscb::SYOSCB_PRINTER_TABLE: begin
112  uvm_table_printer p;
113  p = new;
114  printer = p;
115  end
116 
117  pk_syoscb::SYOSCB_PRINTER_TREE: begin
118  uvm_tree_printer p;
119  p = new;
120  printer = p;
121  end
122 
123  pk_syoscb::SYOSCB_PRINTER_LINE: begin
124  uvm_line_printer p;
125  p = new;
126  printer = p;
127  end
128 
129  pk_syoscb::SYOSCB_PRINTER_XML: begin
130  uvm_xml_printer p;
131  p = new;
132  printer = p;
133  end
134 
135  default: begin
136  string res;
137  t_printer_type loop;
138 
139  loop = loop.first();
140 
141  res = "Unable to generate a printer object as input type did not match one of ";
142  res = {res, $sformatf("%s(%0d)", loop.name(), loop)};
143 
144  while(loop != loop.last()) begin
145  loop = loop.next();
146  res = {res, $sformatf(", %s(%0d)", loop.name(), loop)};
147  end
148  res = {res, $sformatf(". Got %s(%0d)", ptype.name(), ptype)};
149  `uvm_fatal("PRINTER", res)
150  end
151  endcase
152 
153  return printer;
154 endfunction: get_printer_of_type
155 
156 /// Copies all config information from one printer to another printer
157 ///
158 /// \param from Printer containing the data to be copied
159 /// \param to Printer to inherit configuration data in \c from
160 function void cl_syoscb_printer_config::copy_printer(uvm_printer from, uvm_printer to);
161  `ifdef UVM_VERSION
162  to.set_name_enabled(from.get_name_enabled());
163  to.set_type_name_enabled(from.get_type_name_enabled());
164  to.set_size_enabled(from.get_size_enabled());
165  to.set_id_enabled(from.get_id_enabled());
166  to.set_radix_enabled(from.get_radix_enabled());
167  to.set_radix_string(UVM_DEC, from.get_radix_string(UVM_DEC));
168  to.set_radix_string(UVM_BIN, from.get_radix_string(UVM_BIN));
169  to.set_radix_string(UVM_OCT, from.get_radix_string(UVM_OCT));
170  to.set_radix_string(UVM_UNSIGNED, from.get_radix_string(UVM_UNSIGNED));
171  to.set_radix_string(UVM_HEX, from.get_radix_string(UVM_HEX));
172  to.set_default_radix(from.get_default_radix());
173  to.set_root_enabled(from.get_root_enabled());
174  to.set_recursion_policy(from.get_recursion_policy());
175  to.set_max_depth(from.get_max_depth());
176  to.set_file(from.get_file());
177  to.set_line_prefix(from.get_line_prefix());
178  to.set_begin_elements(from.get_begin_elements());
179  to.set_end_elements(from.get_end_elements());
180  `else
181  to.knobs.header = from.knobs.header;
182  to.knobs.footer = from.knobs.footer;
183  to.knobs.full_name = from.knobs.full_name;
184  to.knobs.identifier = from.knobs.identifier;
185  to.knobs.type_name = from.knobs.type_name;
186  to.knobs.size = from.knobs.size;
187  to.knobs.depth = from.knobs.depth;
188  to.knobs.reference = from.knobs.reference;
189  to.knobs.begin_elements = from.knobs.begin_elements;
190  to.knobs.end_elements = from.knobs.end_elements;
191  to.knobs.prefix = from.knobs.prefix;
192  to.knobs.indent = from.knobs.indent;
193  to.knobs.show_root = from.knobs.show_root;
194  to.knobs.mcd = from.knobs.mcd;
195  to.knobs.separator = from.knobs.separator;
196  to.knobs.show_radix = from.knobs.show_radix;
197  to.knobs.default_radix = from.knobs.default_radix;
198  to.knobs.dec_radix = from.knobs.dec_radix;
199  to.knobs.bin_radix = from.knobs.bin_radix;
200  to.knobs.oct_radix = from.knobs.oct_radix;
201  to.knobs.unsigned_radix = from.knobs.unsigned_radix;
202  to.knobs.hex_radix = from.knobs.hex_radix;
203  `endif
204 endfunction: copy_printer
205 
206 /// Packs all configuration data for the given uvm_printer using the given uvm_packer.
207 /// Since uvm_printer does not natively support pack/unpack operations,
208 /// these helper methods can be used to pack/unpack a printer
209 /// \note The uvm_packer used *must* have the flag use_metadata set to 1'b1 for this to work correctly
210 ///
211 /// \param printer The uvm_printer for which all configuration values should be packed
212 /// \param packer The uvm_packer to use when packing the item
213 function void cl_syoscb_printer_config::do_help_pack(uvm_printer printer, uvm_packer packer);
214 // This function is primarily used in cl_syoscb_cfg::do_pack to pack configuration data
215  bit name_enabled; //identifier
216  bit type_name_enabled; //type_name
217  bit size_enabled; //size
218  bit id_enabled; //reference
219  bit radix_enabled; //show_radix
220  string dec_radix;
221  string bin_radix;
222  string oct_radix;
223  string hex_radix;
224  string unsigned_radix;
225  uvm_radix_enum default_radix;
226  bit root_enabled; //show_root
227  uvm_recursion_policy_enum policy;
228  int max_depth; //depth
229  UVM_FILE file; //mcd
230  string line_prefix; //prefix
231  int begin_elements;
232  int end_elements;
233  t_printer_type ptype;
234 
235  //Pack 4 bits to indicate null/non-null printer
236  if(printer != null) begin
237  packer.pack_field_int(1, 4);
238  end else begin
239  packer.pack_field_int(0, 4);
240  return;
241  end
242 
243  `ifdef UVM_VERSION
244  name_enabled = printer.get_name_enabled();
245  type_name_enabled = printer.get_type_name_enabled();
246  size_enabled = printer.get_size_enabled();
247  id_enabled = printer.get_id_enabled();
248  radix_enabled = printer.get_radix_enabled();
249  dec_radix = printer.get_radix_string(UVM_DEC);
250  bin_radix = printer.get_radix_string(UVM_BIN);
251  oct_radix = printer.get_radix_string(UVM_OCT);
252  hex_radix = printer.get_radix_string(UVM_HEX);
253  unsigned_radix = printer.get_radix_string(UVM_UNSIGNED);
254  default_radix = printer.get_default_radix();
255  root_enabled = printer.get_root_enabled();
256  policy = printer.get_recursion_policy();
257  max_depth = printer.get_max_depth();
258  file = printer.get_file();
259  line_prefix = printer.get_line_prefix();
260  begin_elements = printer.get_begin_elements();
261  end_elements = printer.get_end_elements();
262  `else
263  name_enabled = printer.knobs.identifier;
264  type_name_enabled = printer.knobs.type_name;
265  size_enabled = printer.knobs.size;
266  id_enabled = printer.knobs.reference;
267  radix_enabled = printer.knobs.show_radix;
268  dec_radix = printer.knobs.dec_radix;
269  bin_radix = printer.knobs.bin_radix;
270  oct_radix = printer.knobs.oct_radix;
271  hex_radix = printer.knobs.hex_radix;
272  unsigned_radix = printer.knobs.unsigned_radix;
273  default_radix = printer.knobs.default_radix;
274  root_enabled = printer.knobs.show_root;
275  policy = UVM_DEFAULT_POLICY; //Apparently no knob with this value, setting to UVM_DEFAULT_POLICY instead
276  max_depth = printer.knobs.depth;
277  file = printer.knobs.mcd;
278  line_prefix = printer.knobs.prefix;
279  begin_elements = printer.knobs.begin_elements;
280  end_elements = printer.knobs.end_elements;
281  `endif
282 
283  //To correctly pack the printer, we must also know the type of the printer
284  //This must be packed before all fields
285  ptype = get_printer_type(printer);
286  packer.pack_field_int(ptype, $bits(ptype));
287  packer.pack_field_int(name_enabled, $bits(name_enabled));
288  packer.pack_field_int(type_name_enabled, $bits(type_name_enabled));
289  packer.pack_field_int(size_enabled, $bits(size_enabled));
290  packer.pack_field_int(id_enabled, $bits(id_enabled));
291  packer.pack_field_int(radix_enabled, $bits(radix_enabled));
292  packer.pack_string(dec_radix);
293  packer.pack_string(bin_radix);
294  packer.pack_string(oct_radix);
295  packer.pack_string(hex_radix);
296  packer.pack_string(unsigned_radix);
297  packer.pack_field_int(default_radix, $bits(default_radix));
298  packer.pack_field_int(root_enabled, $bits(root_enabled));
299  packer.pack_field_int(policy, $bits(policy));
300  packer.pack_field_int(max_depth, $bits(max_depth));
301  packer.pack_field_int(file, $bits(file));
302  packer.pack_string(line_prefix);
303  packer.pack_field_int(begin_elements, $bits(begin_elements));
304  packer.pack_field_int(end_elements, $bits(end_elements));
305 endfunction: do_help_pack
306 
307 /// Unpacks printer configuration data and returns a printer with that configuration.
308 /// Since uvm_printer does not natively support pack/unpack operations, these helper methods can be used to
309 /// pack/unpack a printer.
310 /// \note The uvm_packer used must have the use_metadata flag set to 1'b1 for this to work correctly
311 ///
312 /// \param packer The uvm_packer that was previously used to pack a uvm_printer
313 /// \return A uvm_printer with the packed configuration
314 function uvm_printer cl_syoscb_printer_config::do_help_unpack(uvm_packer packer);
315  // This function is primarily used in cl_syoscb_cfg::do_unpack to unpack configuration data
316  uvm_printer printer;
317  bit name_enabled; //identifier
318  bit type_name_enabled; //type_name
319  bit size_enabled; //size
320  bit id_enabled; //reference
321  bit radix_enabled; //show_radix
322  string dec_radix;
323  string bin_radix;
324  string oct_radix;
325  string hex_radix;
326  string unsigned_radix;
327  uvm_radix_enum default_radix;
328  bit root_enabled; //show_root
329  uvm_recursion_policy_enum policy;
330  int max_depth; //depth
331  UVM_FILE file; //mcd
332  string line_prefix; //prefix
333  int begin_elements;
334  int end_elements;
335 
336  int default_radix_value;
337  int policy_value;
338  t_printer_type ptype;
339  int ptype_value;
340  bit[3:0] is_null;
341 
342  is_null = packer.unpack_field_int($bits(is_null));
343  if(is_null == 4'b0) begin
344  return null;
345  end
346 
347  ptype_value = packer.unpack_field_int($bits(ptype));
348  name_enabled = packer.unpack_field_int($bits(name_enabled));
349  type_name_enabled = packer.unpack_field_int($bits(type_name_enabled));
350  size_enabled = packer.unpack_field_int($bits(size_enabled));
351  id_enabled = packer.unpack_field_int($bits(id_enabled));
352  radix_enabled = packer.unpack_field_int($bits(radix_enabled));
353  dec_radix = packer.unpack_string();
354  bin_radix = packer.unpack_string();
355  oct_radix = packer.unpack_string();
356  hex_radix = packer.unpack_string();
357  unsigned_radix = packer.unpack_string();
358  default_radix_value = packer.unpack_field_int($bits(default_radix));
359  root_enabled = packer.unpack_field_int($bits(root_enabled));
360  policy_value = packer.unpack_field_int($bits(policy));
361  max_depth = packer.unpack_field_int($bits(max_depth));
362  file = packer.unpack_field_int($bits(file));
363  line_prefix = packer.unpack_string();
364  begin_elements = packer.unpack_field_int($bits(begin_elements));
365  end_elements = packer.unpack_field_int($bits(end_elements));
366 
367  //To conform to strong enum typing, we must use this workaround when assigning the value of policy, default_radix, printer_type
368  //Iterate through all possible enumeration values, check if they match retrieved value.
369  //If not, throw an error
370  default_radix = default_radix.first();
371  while(default_radix != default_radix_value && default_radix != default_radix.last()) begin
372  default_radix = default_radix.next();
373  end
374  if(default_radix != default_radix_value) begin
375  `uvm_error("ENUM_DECODE", $sformatf("Unable to interpret 'default_radix' enum. Unpacked value was %0d which is not valid", default_radix_value))
376  end
377 
378  policy = policy.first();
379  while(policy != policy_value && policy != policy.last()) begin
380  policy = policy.next();
381  end
382  if(policy != policy_value) begin
383  `uvm_error("ENUM_DECODE", $sformatf("Unable to interpret 'policy' enum. Unpacked value was %0d which is not valid", policy_value))
384  end
385 
386  ptype = ptype.first();
387  while(ptype != ptype_value && ptype != ptype.last()) begin
388  ptype = ptype.next();
389  end
390  if(ptype != ptype_value) begin
391  `uvm_error("ENUM_DECODE", $sformatf("Unable to interpret 'ptype' enum. Unpacked value was %0d which is not valid", ptype_value))
392  end
393 
394  printer = get_printer_of_type(ptype);
395 
396  `ifdef UVM_VERSION
397  printer.set_name_enabled(name_enabled);
398  printer.set_type_name_enabled(type_name_enabled);
399  printer.set_size_enabled(size_enabled);
400  printer.set_id_enabled(id_enabled);
401  printer.set_radix_enabled(radix_enabled);
402  printer.set_radix_string(UVM_DEC, dec_radix);
403  printer.set_radix_string(UVM_BIN, bin_radix);
404  printer.set_radix_string(UVM_OCT, oct_radix);
405  printer.set_radix_string(UVM_HEX, hex_radix);
406  printer.set_radix_string(UVM_UNSIGNED, unsigned_radix);
407  printer.set_default_radix(default_radix);
408  printer.set_root_enabled(root_enabled);
409  printer.set_recursion_policy(policy);
410  printer.set_max_depth(max_depth);
411  printer.set_file(file);
412  printer.set_line_prefix(line_prefix);
413  printer.set_begin_elements(begin_elements);
414  printer.set_end_elements(end_elements);
415  `else
416  printer.knobs.identifier = name_enabled;
417  printer.knobs.type_name = type_name_enabled;
418  printer.knobs.size = size_enabled;
419  printer.knobs.reference = id_enabled;
420  printer.knobs.dec_radix = dec_radix;
421  printer.knobs.bin_radix = bin_radix;
422  printer.knobs.oct_radix = oct_radix;
423  printer.knobs.hex_radix = hex_radix;
424  printer.knobs.unsigned_radix = unsigned_radix;
425  printer.knobs.default_radix = default_radix;
426  printer.knobs.show_root = root_enabled;
427  printer.knobs.depth = max_depth;
428  printer.knobs.mcd = file;
429  printer.knobs.prefix = line_prefix;
430  printer.knobs.begin_elements = begin_elements;
431  printer.knobs.end_elements = end_elements;
432  `endif
433 
434  return printer;
435 endfunction: do_help_unpack
436 
437 /// Sets the number of elements to print at the head of a list whenever the printer is used to print a tx item.
438 ///
439 /// \param printer The printer to set the number of elements for
440 /// \param elements The number of elements to print
441 function void cl_syoscb_printer_config::set_printer_begin_elements(uvm_printer printer,
442  int elements);
443  `ifdef UVM_VERSION
444  printer.set_begin_elements(elements);
445  `else
446  printer.knobs.begin_elements = elements;
447  `endif
448 endfunction: set_printer_begin_elements
449 
450 /// Sets the number of elements to print at the tail of a list whenever the printer is used to print a tx item.
451 ///
452 /// \param printer The printer to set the number of elements for
453 /// \param elements The number of elements to print
454 function void cl_syoscb_printer_config::set_printer_end_elements(uvm_printer printer,
455  int elements);
456  `ifdef UVM_VERSION
457  printer.set_end_elements(elements);
458  `else
459  printer.knobs.end_elements = elements;
460  `endif
461 endfunction: set_printer_end_elements
static uvm_printer get_printer_of_type(t_printer_type ptype)
Generates a new printer of the correct type.
static int get_file_descriptor(uvm_printer printer)
Gets the file descriptor used for a given printer.
An XML printer for cl_syoscb_items.
static void set_printer_begin_elements(uvm_printer printer, int elements)
Sets the number of elements to print at the head of a list whenever the printer is used to print a tx...
static void set_printer_end_elements(uvm_printer printer, int elements)
Sets the number of elements to print at the tail of a list whenever the printer is used to print a tx...
static void copy_printer(uvm_printer from, uvm_printer to)
Copies all config information from one printer to another printer.
static void do_help_pack(uvm_printer printer, uvm_packer packer)
Packs all configuration data for the given uvm_printer using the given uvm_packer.
static void set_file_descriptor(uvm_printer printer, int fd=0)
Sets the file descriptor to be used for a given printer.
static t_printer_type get_printer_type(uvm_printer printer)
Gets the type of printer that a given uvm_printer represents.
Utility class used to perform manipulations of uvm_printer objects.
static uvm_printer do_help_unpack(uvm_packer packer)
Unpacks printer configuration data and returns a printer with that configuration. ...

Project: SyoSil ApS UVM Scoreboard, Revision: 1.0.3.0

Copyright 2014-2022 SyoSil ApS
All Rights Reserved Worldwide

Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
doxygen
Doxygen Version: 1.8.14
Generated with IDV SV Filter Version: 2.6.3
Fri Sep 2 2022 14:39:27
Find a documentation bug? Report bugs to: scoreboard@syosil.com