@@ -13,19 +13,11 @@ package vc_pkg is
1313  type  unexpected_msg_type_policy_t is  (fail, ignore);
1414
1515  type  std_cfg_t is  record 
16-     p_id : id_t;
17-     p_actor : actor_t;
18-     p_logger : logger_t;
19-     p_checker : checker_t;
20-     p_unexpected_msg_type_policy : unexpected_msg_type_policy_t;
16+     p_data : integer_vector_ptr_t;
2117  end  record ;
2218
2319  constant  null_std_cfg : std_cfg_t :=  (
24-     p_id =>  null_id,
25-     p_actor =>  null_actor,
26-     p_logger =>  null_logger,
27-     p_checker =>  null_checker,
28-     p_unexpected_msg_type_policy =>  ignore
20+     p_data =>  null_integer_vector_ptr
2921  );
3022
3123  -- Creates a standard VC configuration with an id, an actor, a logger, a 
@@ -46,6 +38,8 @@ package vc_pkg is
4638    unexpected_msg_type_policy : unexpected_msg_type_policy_t :=  fail
4739  ) return  std_cfg_t;
4840
41+   impure  function  enumerate(parent : id_t; start : integer  :=  1 ) return  id_t;
42+ 
4943  -- These functions extracts information from the standard VC configuration 
5044  impure  function  get_id(std_cfg : std_cfg_t) return  id_t;
5145  impure  function  get_actor(std_cfg : std_cfg_t) return  actor_t;
@@ -62,18 +56,35 @@ package body vc_pkg is
6256  constant  vc_pkg_logger  : logger_t  :=  get_logger(" vunit_lib:vc_pkg" 
6357  constant  vc_pkg_checker : checker_t :=  new_checker(vc_pkg_logger);
6458
59+   constant  id_idx : natural  :=  0 ;
60+   constant  actor_idx : natural  :=  1 ;
61+   constant  logger_idx : natural  :=  2 ;
62+   constant  checker_idx : natural  :=  3 ;
63+   constant  unexpected_msg_type_policy_idx : natural  :=  4 ;
64+   constant  std_cfg_length : natural  :=  unexpected_msg_type_policy_idx +  1 ;
65+ 
66+   impure  function  enumerate(parent : id_t; start : integer  :=  1 ) return  id_t is 
67+   begin 
68+     return  get_id(to_string(num_children(parent) +  1 ), parent =>  parent);
69+   end ;
70+ 
6571  impure  function  create_std_cfg(
6672    id : id_t :=  null_id;
6773    provider : string  :=  " " 
6874    vc_name : string  :=  " " 
6975    unexpected_msg_type_policy : unexpected_msg_type_policy_t :=  fail
7076  ) return  std_cfg_t is 
71-     variable  result  : std_cfg_t;
77+     variable  std_cfg  : std_cfg_t;
7278    variable  provider_id : id_t;
7379    variable  vc_id : id_t;
80+     variable  instance_id : id_t;
81+     variable  actor : actor_t;
82+     variable  logger : logger_t;
7483  begin 
84+     std_cfg.p_data :=  new_integer_vector_ptr(std_cfg_length);
85+ 
7586    if  id /=  null_id then 
76-       result.p_id  :=  id;
87+       instance_id  :=  id;
7788    else 
7889      if  provider =  " " then 
7990        check_failed(vc_pkg_checker, " A provider must be provided." 
@@ -91,53 +102,75 @@ package body vc_pkg is
91102
92103      provider_id :=  get_id(provider);
93104      vc_id :=  get_id(vc_name, parent =>  provider_id);
94-       result.p_id  :=  get_id(to_string(num_children(vc_id)  +   1 ), parent  =>   vc_id);
105+       instance_id  :=  enumerate( vc_id);
95106    end  if ;
107+     set(std_cfg.p_data, id_idx, to_integer (instance_id));
96108
97-     result.p_unexpected_msg_type_policy :=  unexpected_msg_type_policy;
109+     if  find(instance_id, enable_deferred_creation =>  false ) /=  null_actor then 
110+       check_failed(vc_pkg_checker, " An actor already exists for " &  full_name(instance_id) &  " ." 
98111
99-     if  find(result.p_id, enable_deferred_creation  =>   false )  /=  null_actor  then 
100-       check_failed(vc_pkg_checker,  " An actor already exists for  "   &  full_name(result.p_id)  &   " . " ) ;
112+        -- Simplifies testing when vc_pkg_checker logger is mocked 
113+       return  null_std_cfg ;
101114    else 
102-       result.p_actor  :=  new_actor(result.p_id );
115+       actor  :=  new_actor(instance_id );
103116    end  if ;
117+     set(std_cfg.p_data, actor_idx, to_integer (actor));
118+ 
119+     logger :=  get_logger(instance_id);
120+     set(std_cfg.p_data, logger_idx, to_integer (logger));
121+ 
122+     set(std_cfg.p_data, checker_idx, to_integer (new_checker(logger)));
104123
105-     result.p_logger :=  get_logger(result.p_id);
106-     result.p_checker :=  new_checker(result.p_logger);
124+     set(
125+       std_cfg.p_data,
126+       unexpected_msg_type_policy_idx,
127+       unexpected_msg_type_policy_t'pos (unexpected_msg_type_policy)
128+     );
107129
108-     return  result ;
130+     return  std_cfg ;
109131  end ;
110132
111133  impure  function  get_id(std_cfg : std_cfg_t) return  id_t is 
112134  begin 
113-     return  std_cfg.p_id ;
135+     return  to_id( get ( std_cfg.p_data, id_idx)) ;
114136  end ;
115137
116138  impure  function  get_actor(std_cfg : std_cfg_t) return  actor_t is 
117139  begin 
118-     return  std_cfg.p_actor ;
140+     return  to_actor( get ( std_cfg.p_data, actor_idx)) ;
119141  end ;
120142
121143  impure  function  get_logger(std_cfg : std_cfg_t) return  logger_t is 
122144  begin 
123-     return  std_cfg.p_logger ;
145+     return  to_logger( get ( std_cfg.p_data, logger_idx)) ;
124146  end ;
125147
126148  impure  function  get_checker(std_cfg : std_cfg_t) return  checker_t is 
127149  begin 
128-     return  std_cfg.p_checker ;
150+     return  to_checker( get ( std_cfg.p_data, checker_idx)) ;
129151  end ;
130152
131153  impure  function  unexpected_msg_type_policy(std_cfg : std_cfg_t) return  unexpected_msg_type_policy_t is 
132154  begin 
133-     return  std_cfg.p_unexpected_msg_type_policy ;
155+     return  unexpected_msg_type_policy_t 'val ( get ( std_cfg.p_data, unexpected_msg_type_policy_idx)) ;
134156  end ;
135157
136158  procedure  unexpected_msg_type(msg_type : msg_type_t;
137159                                std_cfg : std_cfg_t) is 
160+     constant  code : integer  :=  msg_type.p_code;
138161  begin 
139-     if  unexpected_msg_type_policy(std_cfg) =  fail then 
140-       unexpected_msg_type(msg_type, get_logger(std_cfg));
162+     if  is_already_handled(msg_type) or  unexpected_msg_type_policy(std_cfg) =  ignore then 
163+       null ;
164+     elsif  is_valid(code) then 
165+       check_failed(
166+         get_checker(std_cfg),
167+         " Got unexpected message " &  to_string(to_string_ptr(get (p_msg_types.p_name_ptrs, code)))
168+       );
169+     else 
170+       check_failed(
171+         get_checker(std_cfg),
172+         " Got invalid message with code " &  to_string(code)
173+       );
141174    end  if ;
142-   end ;
175+   end   procedure ;
143176end  package  body ;
0 commit comments