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.