2008-12-30 7 views
1

Dans Specman, comment puis-je savoir si une référence à une unité a le modificateur do-not-generate, '!', À la définition de la référence?Dans Specman, comment savoir si une référence à une unité a le modificateur do-not-generate devant elle?

par exemple.

unit foo_u { 
}; 

extend sys { 
    foo : foo_u is instance; 
    foo_ptr_generated : foo_u; 
    keep foo_ptr_generated == foo; 
    !foo_ptr_notgenerated : foo_u; 
    connect_pointers() is also { 
     foo_ptr_notgenerated = foo; 
    }; 
}; 

Sans inspecter le code ou se fondant sur une convention de nommage, comment puis-je dire que foo_ptr_generated est passé par la résolution de contraintes de Specman et foo_ptr_notgenerated a été mis en procédure?

Répondre

1

Enfin compris cela. Ce code détermine quelles références sont générés et qui ne sont pas en Specman 6 via l'interface de réflexion:

<' 
type my_t : [ A,B,C]; 
unit foo_u { 
    sub_typiness : my_t; 
    other_sub_typiness : my_t; 


    when A'sub_typiness foo_u { 
     !bar_ptr : bar_u; 
    }; 

    when B'other_sub_typiness foo_u { 
     in_b_sub_type : int; 
    }; 

    when A'sub_typiness B'other_sub_typiness foo_u { 
     in_a_b_subtype :int; 
    }; 
    b : bah_u is instance; 
}; 


unit bar_u { 
    sub_typiness : my_t; 
    other_sub_typiness :my_t; 

    when B'sub_typiness bar_u { 
     !foo_ptr : foo_u; 
    }; 
    when C'other_sub_typiness bar_u { 
     inc_sub_type : int; 
    }; 

    when A'other_sub_typiness bar_u { 
     !you_shouldnt_see_this_field : bah_u; 
    }; 

    when B'sub_typiness C'other_sub_typiness bar_u{ 
     in_b_c_subtype :int; 
    }; 
    !b : bah_u; 
    b2 : bah_u; 
}; 

unit bah_u { 

}; 


extend any_unit { 

    !path_to_parent :string; 
    !my_e_path : string; 


    post_generate() is also { 
     if not me is a sys { 
     path_to_parent = get_parent_unit().e_path(); 
     }; 
     my_e_path = e_path(); 
    }; 

    print_pointers() is { 
     for each (wf) in rf_manager.get_struct_of_instance(me).as_a(rf_like_struct).sd_.all_when_fields { 
     if not str_match(wf.name,"/___/"){ 

     }; 
     }; 
     for each (sub_unit) in get_all_units(any_unit) { 
     sub_unit.print_pointers(); 
     }; 
    }; 
}; 

struct wank_s { 
    oh_joy: int; 
}; 
extend sys { 
    foo : A'sub_typiness B'other_sub_typiness foo_u is instance; 
    bar : B'sub_typiness C'other_sub_typiness bar_u is instance; 
    keep bar.b2 == foo.b; 

    wank : wank_s; 

    connect_pointers() is also { 
     foo.bar_ptr = bar; 
     bar.foo_ptr = foo; 
     bar.b = foo.b; 
    }; 

    !possible_ptr : any_unit; 
    !is_a_unit : bool; 
    !an_e_path : string; 
    !a_unit : any_unit; 
    !a_field : field; 
    -- 
    -- rf_manager.get_all_unit_instances 
    my_specman(cmd : string) : bool is { 
     try { 
     --out(cmd); 
     specman(cmd); 
     } else { 
     return FALSE; 
     }; 
     return TRUE; 
    }; 

    check_generation() is also { 
     out("PRINT OUT FIELDS"); 
     var all_units : list of any_unit; 
     for each any_unit(u) in get_all_units(any_unit) { 
     for each (wf) in rf_manager.get_struct_of_instance(u).as_a(rf_like_struct).sd_.all_when_fields { 
      --print wf.source_ref; 
      --print wf.source_ref.to_string().as_a(uint); 
      --if wf.source_ref.to_string().as_a(uint) > 1000 and not str_match(wf.name,"/___/"){ 
      if not str_match(wf.name,"/___|driver_trans/"){ 
       an_e_path = append(u.e_path(),".",wf.name); 
       an_e_path = append(an_e_path, " - marked_as_reachable=",wf.fgi.marked_as_reachable); 
       if wf.base_type is a struct_descriptor (s){ 
        an_e_path = append(an_e_path, " - instantiated == ", s.instantiated); 
       }; 

       if wf.base_type is a struct_descriptor (s) and not s is a list_descriptor and not s is a long_descriptor { 

        sys.is_a_unit = FALSE; 
        if not my_specman(append("sys.is_a_unit = (",u.e_path(),".",wf.name, 
        " != NULL)")) { 
        sys.is_a_unit = FALSE; 
        }; 
        if sys.is_a_unit { 
        if not my_specman(append(" sys.is_a_unit = (",u.e_path(),".",wf.name, 
         ".as_a(any_struct) == ",u.e_path(),".",wf.name,".get_enclosing_unit(any_unit).as_a(any_struct))")) { 
         sys.is_a_unit = FALSE; 
        }; 
        }; 

        if sys.is_a_unit and str_match(wf.name,"/([\w_]+'+[\w_']*)[\w_]+/") { 
        if not my_specman(append("sys.is_a_unit = (",u.e_path(), 
          " is a ", $1, " ", 
          rf_manager.get_struct_of_instance(u).as_a(rf_like_struct).sd_.name, 
          ")")) { 
         sys.is_a_unit = FALSE; 
        }; 
        }; 


        if is_a_unit { 
        sys.a_unit = NULL; 
        if not my_specman(append("sys.a_unit = (",u.e_path(),".",wf.name, 
         ".as_a(any_unit))")) { 
         sys.a_unit = NULL; 
        }; 

        if sys.a_unit != NULL { 

         sys.an_e_path = NULL; 
         var printout := append(":: ",u.e_path(), ".", wf.name); 
         compute my_specman(append("sys.an_e_path = ",u.e_path(),".",wf.name, 
          ".my_e_path")); 
         if append(u.e_path(),".",wf.name) != sys.an_e_path { 
          printout = append(printout, " -> "); 

          printout = append(printout, sys.an_e_path); 
          if wf.fgi != NULL and wf.fgi.gcs.size() > 0 and (
           wf.fgi.gcs[0].last_reduction != UNDEF or 
           wf.fgi.gcs[0].gcois.size() > 0) { 


           printout = append(printout, " GENERATED POINTER"); 
          }; 
         }; 
         out(printout); 

        }; 
        }; 
       }; 


       --out(" ",an_e_path); 

       --specman(append("print ",u.e_path(),".",wf.name)); 
      }; 
     }; 

     --for each (m) in rf_manager.get_struct_of_instance(u).as_a(rf_like_struct).sd_.methods { 
     -- if m != NULL { 
     --  out(m.md.name); 
     -- }; 
     --}; 
     --print u.get_all_attribute_names(); 
     --print u.get_attribute("agent"); 
     --print u.agent_kind(); 

     -- for each (m) in rf_manager.get_struct_of_instance(u).get_declared_methods() { 
     -- print m; 
     -- }; 
     -- out("fields at '",u.e_path(),"'s struct level:"); 
     -- for each (f) in rf_manager.get_struct_of_instance(u).get_declared_fields() { 
     -- out(" ",u.e_path()," -> ",f.f_.short_name); 
     -- }; 
     -- out("fields at '",u.e_path(),"'s exact sub-type level:"); 
     -- for each (f) in rf_manager.get_exact_subtype_of_instance(u).get_declared_fields() { 
     -- out(" ",u.e_path()," -> ",f.f_.short_name); 
     -- }; 
     -- out(""); 
     }; 

     -- out("\nPRINT OUT UNIT INSTANCES"); 
     -- for each any_unit(u) in {sys;foo;bar} { 
     -- for each (i) in rf_manager.get_all_unit_instances(u) { 
     --  if i != u { 
     --   out(u.e_path(), " has unit ", i.e_path()); 
     --  }; 
     -- }; 
     -- }; 

    }; 

}; 

'> 

Courir avec:

specman -c 'load rf_test.e; gen' 

Produit:

Generating the test using seed 1... 
PRINT OUT FIELDS 
:: sys.bar.B'sub_typiness'foo_ptr -> sys.foo 
:: sys.bar.b -> sys.foo.b 
:: sys.bar.b2 -> sys.foo.b GENERATED POINTER 
:: sys.foo.A'sub_typiness'bar_ptr -> sys.bar 
:: sys.foo.b 
:: sys.logger.base_unit -> sys 
:: sys.logger 
:: sys.foo 
:: sys.bar 

Starting the test ... 
Running the test ... 
Questions connexes