@@ -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