11   `uvm_object_utils_begin(cl_syoscb_string_library)
    18   function new(string name = "cl_syoscb_string_library");
    25   extern static function string 
pad_str(string str, int unsigned max_length, string expand = " ", bit side = 1'b0);
    27   extern static function string 
scb_header_str(string hn, int unsigned pre_length, bit side,
    28                                            string col_names[] = '{"  Inserts " , "  Matches ", "  Flushed ", "  Orphans "});
    29   extern static function void   
split_string(string in, byte delim[], output string out[]);
    30   extern static function int    
merge_string_arrays(string inputs[$][], string concat = "|", output string result);
    32   extern static function int    
generate_cmp_table_body(cl_syoscb_item items[], cl_syoscb_cfg cfg, output string result);
    34   extern static function string 
sprint_item(cl_syoscb_item item, cl_syoscb_cfg cfg);
    45   if(str.len() >= max_length) begin
    49   while(str.len() < max_length) begin
    50     str = (side == 1'b1) ? {str, expand} : {expand, str};
    59 function string cl_syoscb_string_library::scb_separator_str(int unsigned pre_length);
    63   cl_syoscb_string_library::pad_str("", pre_length, "-"),
    64   "+----------+----------+----------+----------+"};
    67 endfunction: scb_separator_str
    74 function string cl_syoscb_string_library::scb_header_str(string hn, int unsigned pre_length, bit side,
    75                                                      string col_names[] = '{"  Inserts " , "  Matches ", "  Flushed ", "  Orphans "});
    78   if(col_names.size() != 4) begin
    79   `uvm_error("CFG_ERROR", $sformatf("col_names must have exactly 4 entries, found %0d", col_names.size()))
    82   str = cl_syoscb_string_library::scb_separator_str(1+pre_length);
    84     cl_syoscb_string_library::pad_str(hn, pre_length+1, " ", side),
    85     "|", col_names[0], "|", col_names[1], "|", col_names[2], "|", col_names[3], "|"};
    87   str = { str, cl_syoscb_string_library::scb_separator_str(1+pre_length)};
    90 endfunction: scb_header_str
    99 function void cl_syoscb_string_library::split_string(string in, byte delim[], output string out[]);
   108   for(int idx=0; idx<in.len(); idx++) begin
   111     foreach (delim[i]) begin
   112       if(in[idx] == delim[i]) begin
   119     if(state == 1'b0) begin 
   128         res.push_back(in.substr(start, idx-1));
   134   if(state == 1'b1) begin 
   135     res.push_back(in.substr(start, in.len()-1));
   138 endfunction: split_string
   148 function int cl_syoscb_string_library::merge_string_arrays(string inputs[$][], string concat = "|", output string result);
   152   if(inputs.size() < 2) begin
   153     `uvm_error("STR_ERROR", "Must have at least two tables to merge")
   157   max_length = inputs[0].size();
   158   total_width = inputs[0][0].len();
   159   for(int i=1; i<inputs.size(); i++) begin
   160     total_width += inputs[i][0].len();
   161     if(inputs[i].size() > max_length) begin
   162       max_length = inputs[i].size();
   165   total_width = total_width + 3*(inputs.size()-1);
   168   result = {" ", { (total_width){"#"} }, "\n"};
   170   for(int i=0; i<max_length-1; i++) begin
   171     result = {result, " "}; 
   172     for(int j=0; j<inputs.size(); j++) begin
   173       if(i >= inputs[j].size()-1) begin
   175         result = {result, {(inputs[j][0].len()){" "}} };
   177         result = {result, inputs[j][i]};
   180       if(j != inputs.size()-1) begin
   181         result = {result, " ", concat, " "};
   184     result = {result, "\n"};
   188   result = {result, " "};
   189     for(int j=0; j<inputs.size(); j++) begin
   190     result = {result, inputs[j][inputs[j].size()-1]};
   191     if(j != inputs.size()-1) begin
   192       result = {result, " ", concat, " "};
   195   result = {result, "\n"};
   198   result = {result, " ", {(total_width){"#"}}, "\n"};
   201 endfunction: merge_string_arrays
   210 function int cl_syoscb_string_library::generate_cmp_table_body(cl_syoscb_item items[], cl_syoscb_cfg cfg, output string result);
   212   string item_tokens[$][];
   214   foreach(items[i]) begin
   216     item_string = sprint_item(items[i], cfg);
   217     split_string(item_string, '{"\n"}, tokens);
   218     item_tokens.push_back(tokens);
   221   return merge_string_arrays(item_tokens, "|", result);
   229 function string cl_syoscb_string_library::generate_cmp_table_header(int table_width, string header_text);
   232   string header_text_split[];
   234   pounds = {(table_width){"#"}};
   235   cl_syoscb_string_library::split_string(header_text, '{"\n"}, header_text_split);
   237   header = {" ", pounds, "\n"};
   238   foreach(header_text_split[i]) begin
   239     header = {header, " # ", pad_str(header_text_split[i], table_width-3, " ", 1'b1), "#\n"};
   243 endfunction: generate_cmp_table_header
   249 function string cl_syoscb_string_library::generate_cmp_table_footer(int table_width, uvm_comparer comparer);
   250   string comparer_miscompares;
   251   string comparer_miscompares_tokens[];
   252   string dashes, pounds, footer;
   255   comparer_miscompares = cl_syoscb_comparer_config::get_miscompares_from_comparer(comparer);
   256   split_string(comparer_miscompares, '{"\n"}, comparer_miscompares_tokens);
   257   show_max = cl_syoscb_comparer_config::get_show_max(comparer);
   258   dashes = {table_width{"-"}};
   259   pounds = {table_width{"#"}};
   261   footer = {" ", dashes, "\n",
   262     $sformatf(" Results from uvm_comparer::get_miscompares() [show_max=%0d]\n", show_max),
   266   for(int i=0; i<show_max && i<comparer_miscompares_tokens.size(); i++) begin
   270     tokens = comparer_miscompares_tokens[i];
   277       for(int j=0; j<tokens.len(); j++) begin
   278         if(tokens[j] == ":") begin
   279           if(miscmp == "") begin 
   280             miscmp = tokens.substr(0, j);
   282             miscmp = {miscmp, tokens.substr(j+1, tokens.len()-1)};
   289     footer = {footer, " ", miscmp, "\n"};
   292   footer = {footer, " ", pounds, "\n"};
   294 endfunction: generate_cmp_table_footer
   303 function string cl_syoscb_string_library::sprint_item(cl_syoscb_item item, cl_syoscb_cfg cfg);
   308     printer = uvm_table_printer::get_default();
   310     printer = uvm_default_table_printer;
   312   verbosity = cfg.get_default_printer_verbosity();
   314   if(verbosity == 1'b1) begin
   315     cl_syoscb_printer_config::set_printer_begin_elements(printer, -1);
   316     cl_syoscb_printer_config::set_printer_end_elements(printer, -1);
   318     cl_syoscb_printer_config::set_printer_begin_elements(printer, 5);
   319     cl_syoscb_printer_config::set_printer_end_elements(printer, 5);
   322   return item.sprint(printer);
   323 endfunction: sprint_item
 static string scb_separator_str(int unsigned pre_length)
Creates a new separator string for scoreboard stat tables. 
A utility class holding a number of static methods for performing string manipulation. 
static string generate_cmp_table_footer(int table_width, uvm_comparer comparer)
Generates the footer section of a comparison table. 
static void split_string(string in, byte delim[], output string out[])
Splits the string 'in' by any of the delimiter strings in 'delim', returning the result in 'out'...
static string pad_str(string str, int unsigned max_length, string expand=" ", bit side=0b0)
Pads the input string with another string until it reaches a given length. 
static string sprint_item(cl_syoscb_item item, cl_syoscb_cfg cfg)
Utility function for printing sequence items using a table printer. This function sprints the given s...
static int merge_string_arrays(string inputs[$][], string concat="|", output string result)
Takes a queue of string arrays, merging these into a single string. 
static int generate_cmp_table_body(cl_syoscb_item items[], cl_syoscb_cfg cfg, output string result)
Generates the body of a comparison table. 
static string generate_cmp_table_header(int table_width, string header_text)
Generates the header section of a comparison table. 
static string scb_header_str(string hn, int unsigned pre_length, bit side, string col_names[]=("  Inserts ", "  Matches ", "  Flushed ", "  Orphans "))
Creates a new header string for a scoreboard stat table.