@@ -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,10 @@ package vc_pkg is
4638 unexpected_msg_type_policy : unexpected_msg_type_policy_t := fail
4739 ) return std_cfg_t;
4840
41+ -- Used to create enumerated ids from a parent id. The first created
42+ -- id will be <parent name>:1, the second <parent name>:2 and so on
43+ impure function enumerate(parent : id_t) return id_t;
44+
4945 -- These functions extracts information from the standard VC configuration
5046 impure function get_id(std_cfg : std_cfg_t) return id_t;
5147 impure function get_actor(std_cfg : std_cfg_t) return actor_t;
@@ -62,18 +58,35 @@ package body vc_pkg is
6258 constant vc_pkg_logger : logger_t := get_logger(" vunit_lib:vc_pkg" );
6359 constant vc_pkg_checker : checker_t := new_checker(vc_pkg_logger);
6460
61+ constant id_idx : natural := 0 ;
62+ constant actor_idx : natural := 1 ;
63+ constant logger_idx : natural := 2 ;
64+ constant checker_idx : natural := 3 ;
65+ constant unexpected_msg_type_policy_idx : natural := 4 ;
66+ constant std_cfg_length : natural := unexpected_msg_type_policy_idx + 1 ;
67+
68+ impure function enumerate(parent : id_t) return id_t is
69+ begin
70+ return get_id(to_string(num_children(parent) + 1 ), parent => parent);
71+ end ;
72+
6573 impure function create_std_cfg(
6674 id : id_t := null_id;
6775 provider : string := " " ;
6876 vc_name : string := " " ;
6977 unexpected_msg_type_policy : unexpected_msg_type_policy_t := fail
7078 ) return std_cfg_t is
71- variable result : std_cfg_t;
79+ variable std_cfg : std_cfg_t;
7280 variable provider_id : id_t;
7381 variable vc_id : id_t;
82+ variable instance_id : id_t;
83+ variable actor : actor_t;
84+ variable logger : logger_t;
7485 begin
86+ std_cfg.p_data := new_integer_vector_ptr(std_cfg_length);
87+
7588 if id /= null_id then
76- result.p_id := id;
89+ instance_id := id;
7790 else
7891 if provider = " " then
7992 check_failed(vc_pkg_checker, " A provider must be provided." );
@@ -91,53 +104,75 @@ package body vc_pkg is
91104
92105 provider_id := get_id(provider);
93106 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);
107+ instance_id := enumerate( vc_id);
95108 end if ;
109+ set(std_cfg.p_data, id_idx, to_integer (instance_id));
96110
97- result.p_unexpected_msg_type_policy := unexpected_msg_type_policy;
111+ if find(instance_id, enable_deferred_creation => false ) /= null_actor then
112+ check_failed(vc_pkg_checker, " An actor already exists for " & full_name(instance_id) & " ." );
98113
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) & " . " ) ;
114+ -- Simplifies testing when vc_pkg_checker logger is mocked
115+ return null_std_cfg ;
101116 else
102- result.p_actor := new_actor(result.p_id );
117+ actor := new_actor(instance_id );
103118 end if ;
119+ set(std_cfg.p_data, actor_idx, to_integer (actor));
120+
121+ logger := get_logger(instance_id);
122+ set(std_cfg.p_data, logger_idx, to_integer (logger));
123+
124+ set(std_cfg.p_data, checker_idx, to_integer (new_checker(logger)));
104125
105- result.p_logger := get_logger(result.p_id);
106- result.p_checker := new_checker(result.p_logger);
126+ set(
127+ std_cfg.p_data,
128+ unexpected_msg_type_policy_idx,
129+ unexpected_msg_type_policy_t'pos (unexpected_msg_type_policy)
130+ );
107131
108- return result ;
132+ return std_cfg ;
109133 end ;
110134
111135 impure function get_id(std_cfg : std_cfg_t) return id_t is
112136 begin
113- return std_cfg.p_id ;
137+ return to_id( get ( std_cfg.p_data, id_idx)) ;
114138 end ;
115139
116140 impure function get_actor(std_cfg : std_cfg_t) return actor_t is
117141 begin
118- return std_cfg.p_actor ;
142+ return to_actor( get ( std_cfg.p_data, actor_idx)) ;
119143 end ;
120144
121145 impure function get_logger(std_cfg : std_cfg_t) return logger_t is
122146 begin
123- return std_cfg.p_logger ;
147+ return to_logger( get ( std_cfg.p_data, logger_idx)) ;
124148 end ;
125149
126150 impure function get_checker(std_cfg : std_cfg_t) return checker_t is
127151 begin
128- return std_cfg.p_checker ;
152+ return to_checker( get ( std_cfg.p_data, checker_idx)) ;
129153 end ;
130154
131155 impure function unexpected_msg_type_policy(std_cfg : std_cfg_t) return unexpected_msg_type_policy_t is
132156 begin
133- return std_cfg.p_unexpected_msg_type_policy ;
157+ return unexpected_msg_type_policy_t 'val ( get ( std_cfg.p_data, unexpected_msg_type_policy_idx)) ;
134158 end ;
135159
136160 procedure unexpected_msg_type(msg_type : msg_type_t;
137161 std_cfg : std_cfg_t) is
162+ constant code : integer := msg_type.p_code;
138163 begin
139- if unexpected_msg_type_policy(std_cfg) = fail then
140- unexpected_msg_type(msg_type, get_logger(std_cfg));
164+ if is_already_handled(msg_type) or unexpected_msg_type_policy(std_cfg) = ignore then
165+ null ;
166+ elsif is_valid(code) then
167+ check_failed(
168+ get_checker(std_cfg),
169+ " Got unexpected message " & to_string(to_string_ptr(get (p_msg_types.p_name_ptrs, code)))
170+ );
171+ else
172+ check_failed(
173+ get_checker(std_cfg),
174+ " Got invalid message with code " & to_string(code)
175+ );
141176 end if ;
142- end ;
177+ end procedure ;
143178end package body ;
0 commit comments