`timescale 1ns/1ps
`include "uvm_macros.svh"
import uvm_pkg::*;

class bounded_record_item extends uvm_object;
  int data[] = '{11, 22, 33, 44};
  int unsigned record_limit = 2;
  function new(string name = "bounded_record_item"); super.new(name); endfunction
  // data is deliberately not registered with a uvm_field_* macro.
  function void do_record(uvm_recorder recorder);
    super.do_record(recorder);
    foreach (data[i]) begin
      if (i >= record_limit) break;
      recorder.record_field_int($sformatf("data[%0d]", i), data[i], 32, UVM_DEC);
    end
  endfunction
endclass

class count_text_recorder extends uvm_text_recorder;
  int fields;
  int sum;
  string last_name;
  function new(string name = "count_text_recorder"); super.new(name); endfunction
  protected virtual function void do_record_field_int(string name, uvm_integral_t value,
                                                      int size, uvm_radix_enum radix);
    fields++;
    sum += value;
    last_name = name;
    super.do_record_field_int(name, value, size, radix);
  endfunction
endclass

module vendor_migration_probe;
  initial begin
    uvm_reg_cvr_t supported = UVM_CVR_REG_BITS | UVM_CVR_FIELD_VALS;
    snps_uvm_reg_bank_group bank = new("bank", null, supported);
    bounded_record_item item = new();
    count_text_recorder counter = new();
    uvm_text_tr_database db = new("db");
    uvm_tr_stream stream;
    uvm_recorder recorder;
    #1;
    $display("REVIEW|vendor_bank_has|%0d", bank.has_coverage(supported));
    void'(bank.set_coverage(UVM_CVR_FIELD_VALS));
    $display("REVIEW|vendor_bank_enabled|%0d:%0d", bank.get_coverage(UVM_CVR_FIELD_VALS), bank.get_coverage(UVM_CVR_REG_BITS));
    stream = db.open_stream("stream", "scope", "type");
    counter.m_do_open(stream, 7, "type");
    item.record(counter);
    $display("REVIEW|vendor_record_fields|%0d:%0d:%s", counter.fields, counter.sum, counter.last_name);
    counter.close();
    counter.free();
    recorder = stream.open_recorder("explicit_time", 7, "type");
    $display("REVIEW|vendor_record_time|%0d", recorder.get_open_time());
    recorder.close();
    recorder.free();
    stream.close();
    stream.free();
    void'(db.close_db());
    $display("REVIEW|vendor_resource_trace|%0d", uvm_resource_db_options::is_tracing());
    $display("REVIEW|done|1");
  end
endmodule
