3

I have stored var name in another var and I want to retrieve values from original var.

for ex:

var var_A: list of uint = {1,3,2};
var var_A_str:string = "var_A";

//Now i want to print var_A list of values using var_A_str. How can i do that?

print $var_A_str;
Nathan Fellman
  • 122,701
  • 101
  • 260
  • 319
Dan
  • 31
  • 1

1 Answers1

2

This is called introspection or reflection. You have to use Specman's rf_manager. Search for it in the docs. However, the docs don't show you all the methods that this unit has. If you really want to see all the methods, run this snippet of code:

extend sys {
    run() is also {
        var rf_man : rf_struct = rf_manager.get_exact_subtype_of_instance(rf_manager);
        out(" RF Manager:");
        for each (meth) in rf_man.get_declared_methods() {
            print meth;
        };
    };
};

I'm not sure how to iterate through the list elements, but you can use this snippet to look at the methods on a reference to an object's instance members ( not a subroutine's variable).

extend sys {

    A : list of uint;
    keep A == {1;3;2};
    run() is also {

        var variable_name := "A";
        var rf_obj: rf_struct = rf_manager.get_exact_subtype_of_instance(sys);
        var rf_i : rf_field =  rf_obj.get_field(variable_name);
        print rf_i;
        var rf_rf_i := rf_manager.get_exact_subtype_of_instance(rf_i);
        out ( "#\n# RF_RFI\n#");
        for each (meth) in rf_rf_i.get_declared_methods() {
            print meth;
        }; 
    };
};    

In my version ( 8.2 ) this prints:

    Starting the test ...
    Running the test ...
      rf_i = rf_field 'A', line 7 in @rf_test4
    #
    # RF_RFI
    #
      meth = rf_method 'get_type', Specman's private modules
      meth = rf_method 'is_physical', Specman's private modules
      meth = rf_method 'get_svtp_pack', Specman's private modules
      meth = rf_method 'set_svtp_pack', Specman's private modules
      meth = rf_method 'is_ungenerated', Specman's private modules
      meth = rf_method 'is_const', Specman's private modules
      meth = rf_method 'is_unit_instance', Specman's private modules
      meth = rf_method 'is_port_instance', Specman's private modules
      meth = rf_method 'is_reference', Specman's private modules
      meth = rf_method 'get_constrained_types', Specman's private modules
      meth = rf_method 'get_deep_copy_attr', Specman's private modules
      meth = rf_method 'get_value', Specman's private modules
      meth = rf_method 'set_value', Specman's private modules
      meth = rf_method 'get_value_unsafe', Specman's private modules
      meth = rf_method 'get_all_when_value_unsafe', Specman's private modules
      meth = rf_method 'set_value_unsafe', Specman's private modules
      meth = rf_method 'set_value_const_reassign_unsafe', Specman's private modules
      meth = rf_method 'get_interface_port_prefix', Specman's private modules
      meth = rf_method 'get_interface_port_suffix', Specman's private modules
      meth = rf_method 'is_gen_intelligen', Specman's private modules
      meth = rf_method 'get_long_name', Specman's private modules
      meth = rf_method 'get_implicit_constraints', Specman's private modules
      meth = rf_method 'make_path', Specman's private modules
      meth = rf_method 'make_element', Specman's private modules
      meth = rf_method 'make_list_size_path', Specman's private modules
      meth = rf_method 'is_unit_reference', Specman's private modules
      meth = rf_method 'get_id_name_for_port_type', Specman's private modules
      meth = rf_method 'get_list_upper_bound', Specman's private modules
      meth = rf_method 'get_sv_typename', Specman's private modules
      meth = rf_method 'get_sv_name_under_when', Specman's private modules
      meth = rf_method 'get_sv_size', Specman's private modules
      meth = rf_method 'sv_add_encode_lines', Specman's private modules
      meth = rf_method 'sv_get_decode_function_local_var_name', Specman's private modules
      meth = rf_method 'sv_get_decode_function_local_var_decl', Specman's private modules
      meth = rf_method 'sv_add_decode_lines', Specman's private modules
      meth = rf_method 'get_sv_field_name', Specman's private modules
      meth = rf_method 'get_sv_field', Specman's private modules
      meth = rf_method 'sv_must_be_protected_field', Specman's private modules
      meth = rf_method 'sv_add_get_set_field_functions', Specman's private modules
      meth = rf_method 'sv_add_get_set_field_function_decs', Specman's private modules
      meth = rf_method 'is_sv_exported_field', Specman's private modules
      meth = rf_method 'is_sv_determinant_field', Specman's private modules
      meth = rf_method 'field_configured_to_svtp_pack', Specman's private modules
      meth = rf_method 'get_ovm_field_macro', Specman's private modules
      meth = rf_method 'is_internal', Specman's private modules
      meth = rf_method 'get', Specman's private modules
      meth = rf_method 'eanalyze_lnt', Specman's private modules
    No actual running requested.
    Checking the test ...

Checking is complete - 0 DUT errors, 0 DUT warnings.

I'm sure there's a way to do what you want, but it can be very difficult to use Specman's reflection interface.

Merry hacking!

Ross Rogers
  • 23,523
  • 27
  • 108
  • 164
  • hi Ross, thanks for your answer but with "print rf_i;" statement, is it printing all list values stored in A? – Dan Jul 27 '10 at 03:17
  • No, `rf_i` is a reference to the reflection object for field A. You'll have to figure out how to tease out the data from that reflection field. Specman's reflection interface is a real pain. Not like the ease of working with Python's introspection. – Ross Rogers Jul 27 '10 at 18:30